Search in sources :

Example 1 with PrefixSpace

use of org.batfish.datamodel.PrefixSpace in project batfish by batfish.

the class CiscoControlPlaneExtractor method toRoutePolicyPrefixSet.

private RoutePolicyPrefixSet toRoutePolicyPrefixSet(Rp_prefix_setContext ctx) {
    if (ctx.name != null) {
        // named
        String name = ctx.name.getText();
        int expressionLine = ctx.name.getStart().getLine();
        return new RoutePolicyPrefixSetName(name, expressionLine);
    } else {
        // inline
        PrefixSpace prefixSpace = new PrefixSpace();
        Prefix6Space prefix6Space = new Prefix6Space();
        boolean ipv6 = false;
        for (Prefix_set_elemContext pctxt : ctx.elems) {
            int lower;
            int upper;
            Prefix prefix = null;
            Prefix6 prefix6 = null;
            if (pctxt.prefix != null) {
                prefix = Prefix.parse(pctxt.prefix.getText());
                lower = prefix.getPrefixLength();
                upper = Prefix.MAX_PREFIX_LENGTH;
            } else if (pctxt.ipa != null) {
                prefix = new Prefix(toIp(pctxt.ipa), Prefix.MAX_PREFIX_LENGTH);
                lower = prefix.getPrefixLength();
                upper = Prefix.MAX_PREFIX_LENGTH;
            } else if (pctxt.ipv6a != null) {
                prefix6 = new Prefix6(toIp6(pctxt.ipv6a), Prefix6.MAX_PREFIX_LENGTH);
                lower = prefix6.getPrefixLength();
                upper = Prefix6.MAX_PREFIX_LENGTH;
            } else if (pctxt.ipv6_prefix != null) {
                prefix6 = new Prefix6(pctxt.ipv6_prefix.getText());
                lower = prefix6.getPrefixLength();
                upper = Prefix6.MAX_PREFIX_LENGTH;
            } else {
                throw new BatfishException("Unhandled alternative");
            }
            if (pctxt.minpl != null) {
                lower = toInteger(pctxt.minpl);
            }
            if (pctxt.maxpl != null) {
                upper = toInteger(pctxt.maxpl);
            }
            if (pctxt.eqpl != null) {
                lower = toInteger(pctxt.eqpl);
                upper = lower;
            }
            if (prefix != null) {
                prefixSpace.addPrefixRange(new PrefixRange(prefix, new SubRange(lower, upper)));
            } else {
                prefix6Space.addPrefix6Range(new Prefix6Range(prefix6, new SubRange(lower, upper)));
                ipv6 = true;
            }
        }
        if (ipv6) {
            return new RoutePolicyInlinePrefix6Set(prefix6Space);
        } else {
            return new RoutePolicyInlinePrefixSet(prefixSpace);
        }
    }
}
Also used : BatfishException(org.batfish.common.BatfishException) RedFlagBatfishException(org.batfish.common.RedFlagBatfishException) PrefixRange(org.batfish.datamodel.PrefixRange) RoutePolicyInlinePrefixSet(org.batfish.representation.cisco.RoutePolicyInlinePrefixSet) RoutePolicyPrefixSetName(org.batfish.representation.cisco.RoutePolicyPrefixSetName) PrefixSpace(org.batfish.datamodel.PrefixSpace) Prefix_set_elemContext(org.batfish.grammar.cisco.CiscoParser.Prefix_set_elemContext) Prefix(org.batfish.datamodel.Prefix) Prefix6Space(org.batfish.datamodel.Prefix6Space) Prefix6Range(org.batfish.datamodel.Prefix6Range) RoutePolicyInlinePrefix6Set(org.batfish.representation.cisco.RoutePolicyInlinePrefix6Set) SubRange(org.batfish.datamodel.SubRange) Prefix6(org.batfish.datamodel.Prefix6)

Example 2 with PrefixSpace

use of org.batfish.datamodel.PrefixSpace in project batfish by batfish.

the class CiscoConfiguration method toOspfProcess.

private org.batfish.datamodel.OspfProcess toOspfProcess(OspfProcess proc, String vrfName, Configuration c, CiscoConfiguration oldConfig) {
    org.batfish.datamodel.OspfProcess newProcess = new org.batfish.datamodel.OspfProcess();
    org.batfish.datamodel.Vrf vrf = c.getVrfs().get(vrfName);
    if (proc.getMaxMetricRouterLsa()) {
        newProcess.setMaxMetricTransitLinks(OspfProcess.MAX_METRIC_ROUTER_LSA);
        if (proc.getMaxMetricIncludeStub()) {
            newProcess.setMaxMetricStubNetworks(OspfProcess.MAX_METRIC_ROUTER_LSA);
        }
        newProcess.setMaxMetricExternalNetworks(proc.getMaxMetricExternalLsa());
        newProcess.setMaxMetricSummaryNetworks(proc.getMaxMetricSummaryLsa());
    }
    newProcess.setProcessId(proc.getName());
    // establish areas and associated interfaces
    Map<Long, OspfArea> areas = newProcess.getAreas();
    Map<Long, ImmutableSortedSet.Builder<String>> areaInterfacesBuilders = new HashMap<>();
    List<OspfNetwork> networks = new ArrayList<>();
    networks.addAll(proc.getNetworks());
    Collections.sort(networks, new Comparator<OspfNetwork>() {

        // sort so longest prefixes are first
        @Override
        public int compare(OspfNetwork lhs, OspfNetwork rhs) {
            int lhsPrefixLength = lhs.getPrefix().getPrefixLength();
            int rhsPrefixLength = rhs.getPrefix().getPrefixLength();
            // intentionally swapped
            int result = Integer.compare(rhsPrefixLength, lhsPrefixLength);
            if (result == 0) {
                long lhsIp = lhs.getPrefix().getStartIp().asLong();
                long rhsIp = rhs.getPrefix().getStartIp().asLong();
                result = Long.compare(lhsIp, rhsIp);
            }
            return result;
        }
    });
    // Set RFC 1583 compatibility
    newProcess.setRfc1583Compatible(proc.getRfc1583Compatible());
    for (Entry<String, org.batfish.datamodel.Interface> e : vrf.getInterfaces().entrySet()) {
        String ifaceName = e.getKey();
        org.batfish.datamodel.Interface iface = e.getValue();
        InterfaceAddress interfaceAddress = iface.getAddress();
        if (interfaceAddress == null) {
            continue;
        }
        for (OspfNetwork network : networks) {
            Prefix networkPrefix = network.getPrefix();
            Ip networkAddress = networkPrefix.getStartIp();
            Ip maskedInterfaceAddress = interfaceAddress.getIp().getNetworkAddress(networkPrefix.getPrefixLength());
            if (maskedInterfaceAddress.equals(networkAddress)) {
                // we have a longest prefix match
                long areaNum = network.getArea();
                OspfArea newArea = areas.computeIfAbsent(areaNum, OspfArea::new);
                ImmutableSortedSet.Builder<String> newAreaInterfacesBuilder = areaInterfacesBuilders.computeIfAbsent(areaNum, n -> ImmutableSortedSet.naturalOrder());
                newAreaInterfacesBuilder.add(ifaceName);
                iface.setOspfArea(newArea);
                iface.setOspfEnabled(true);
                boolean passive = proc.getPassiveInterfaceList().contains(iface.getName()) || (proc.getPassiveInterfaceDefault() && !proc.getActiveInterfaceList().contains(iface.getName()));
                iface.setOspfPassive(passive);
                break;
            }
        }
        areaInterfacesBuilders.forEach((areaNum, interfacesBuilder) -> areas.get(areaNum).setInterfaces(interfacesBuilder.build()));
    }
    // create summarization filters for inter-area routes
    for (Entry<Long, Map<Prefix, OspfAreaSummary>> e1 : proc.getSummaries().entrySet()) {
        long areaLong = e1.getKey();
        Map<Prefix, OspfAreaSummary> summaries = e1.getValue();
        OspfArea area = areas.get(areaLong);
        String summaryFilterName = "~OSPF_SUMMARY_FILTER:" + vrfName + ":" + areaLong + "~";
        RouteFilterList summaryFilter = new RouteFilterList(summaryFilterName);
        c.getRouteFilterLists().put(summaryFilterName, summaryFilter);
        if (area == null) {
            area = new OspfArea(areaLong);
            areas.put(areaLong, area);
        }
        area.setSummaryFilter(summaryFilterName);
        for (Entry<Prefix, OspfAreaSummary> e2 : summaries.entrySet()) {
            Prefix prefix = e2.getKey();
            OspfAreaSummary summary = e2.getValue();
            int prefixLength = prefix.getPrefixLength();
            int filterMinPrefixLength = summary.getAdvertised() ? Math.min(Prefix.MAX_PREFIX_LENGTH, prefixLength + 1) : prefixLength;
            summaryFilter.addLine(new RouteFilterLine(LineAction.REJECT, prefix, new SubRange(filterMinPrefixLength, Prefix.MAX_PREFIX_LENGTH)));
        }
        area.setSummaries(ImmutableSortedMap.copyOf(summaries));
        summaryFilter.addLine(new RouteFilterLine(LineAction.ACCEPT, Prefix.ZERO, new SubRange(0, Prefix.MAX_PREFIX_LENGTH)));
    }
    String ospfExportPolicyName = "~OSPF_EXPORT_POLICY:" + vrfName + "~";
    RoutingPolicy ospfExportPolicy = new RoutingPolicy(ospfExportPolicyName, c);
    c.getRoutingPolicies().put(ospfExportPolicyName, ospfExportPolicy);
    List<Statement> ospfExportStatements = ospfExportPolicy.getStatements();
    newProcess.setExportPolicy(ospfExportPolicyName);
    // policy map for default information
    if (proc.getDefaultInformationOriginate()) {
        If ospfExportDefault = new If();
        ospfExportStatements.add(ospfExportDefault);
        ospfExportDefault.setComment("OSPF export default route");
        Conjunction ospfExportDefaultConditions = new Conjunction();
        List<Statement> ospfExportDefaultStatements = ospfExportDefault.getTrueStatements();
        ospfExportDefaultConditions.getConjuncts().add(new MatchPrefixSet(new DestinationNetwork(), new ExplicitPrefixSet(new PrefixSpace(Collections.singleton(new PrefixRange(Prefix.ZERO, new SubRange(0, 0)))))));
        long metric = proc.getDefaultInformationMetric();
        ospfExportDefaultStatements.add(new SetMetric(new LiteralLong(metric)));
        OspfMetricType metricType = proc.getDefaultInformationMetricType();
        ospfExportDefaultStatements.add(new SetOspfMetricType(metricType));
        // add default export map with metric
        String defaultOriginateMapName = proc.getDefaultInformationOriginateMap();
        boolean useAggregateDefaultOnly;
        if (defaultOriginateMapName != null) {
            int defaultOriginateMapLine = proc.getDefaultInformationOriginateMapLine();
            useAggregateDefaultOnly = true;
            RoutingPolicy ospfDefaultGenerationPolicy = c.getRoutingPolicies().get(defaultOriginateMapName);
            if (ospfDefaultGenerationPolicy == null) {
                undefined(CiscoStructureType.ROUTE_MAP, defaultOriginateMapName, CiscoStructureUsage.OSPF_DEFAULT_ORIGINATE_ROUTE_MAP, defaultOriginateMapLine);
            } else {
                RouteMap generationRouteMap = _routeMaps.get(defaultOriginateMapName);
                generationRouteMap.getReferers().put(proc, "ospf default-originate route-map");
                GeneratedRoute.Builder route = new GeneratedRoute.Builder();
                route.setNetwork(Prefix.ZERO);
                route.setAdmin(MAX_ADMINISTRATIVE_COST);
                route.setGenerationPolicy(defaultOriginateMapName);
                newProcess.getGeneratedRoutes().add(route.build());
            }
        } else if (proc.getDefaultInformationOriginateAlways()) {
            useAggregateDefaultOnly = true;
            // add generated aggregate with no precondition
            GeneratedRoute.Builder route = new GeneratedRoute.Builder();
            route.setNetwork(Prefix.ZERO);
            route.setAdmin(MAX_ADMINISTRATIVE_COST);
            newProcess.getGeneratedRoutes().add(route.build());
        } else {
            // do not generate an aggregate default route;
            // just redistribute any existing default route with the new metric
            useAggregateDefaultOnly = false;
        }
        if (useAggregateDefaultOnly) {
            ospfExportDefaultConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.AGGREGATE));
        }
        ospfExportDefaultStatements.add(Statements.ExitAccept.toStaticStatement());
        ospfExportDefault.setGuard(ospfExportDefaultConditions);
    }
    // policy for redistributing connected routes
    // TODO: honor subnets option
    OspfRedistributionPolicy rcp = proc.getRedistributionPolicies().get(RoutingProtocol.CONNECTED);
    if (rcp != null) {
        If ospfExportConnected = new If();
        ospfExportConnected.setComment("OSPF export connected routes");
        Conjunction ospfExportConnectedConditions = new Conjunction();
        ospfExportConnectedConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.CONNECTED));
        List<Statement> ospfExportConnectedStatements = ospfExportConnected.getTrueStatements();
        Long metric = rcp.getMetric();
        OspfMetricType metricType = rcp.getMetricType();
        ospfExportConnectedStatements.add(new SetOspfMetricType(metricType));
        boolean explicitMetric = metric != null;
        if (!explicitMetric) {
            metric = proc.getDefaultMetric(_vendor, RoutingProtocol.CONNECTED);
        }
        ospfExportStatements.add(new SetMetric(new LiteralLong(metric)));
        ospfExportStatements.add(ospfExportConnected);
        // add default export map with metric
        String exportConnectedRouteMapName = rcp.getRouteMap();
        if (exportConnectedRouteMapName != null) {
            int exportConnectedRouteMapLine = rcp.getRouteMapLine();
            RouteMap exportConnectedRouteMap = _routeMaps.get(exportConnectedRouteMapName);
            if (exportConnectedRouteMap == null) {
                undefined(CiscoStructureType.ROUTE_MAP, exportConnectedRouteMapName, CiscoStructureUsage.OSPF_REDISTRIBUTE_CONNECTED_MAP, exportConnectedRouteMapLine);
            } else {
                exportConnectedRouteMap.getReferers().put(proc, "ospf redistribute connected route-map");
                ospfExportConnectedConditions.getConjuncts().add(new CallExpr(exportConnectedRouteMapName));
            }
        }
        ospfExportConnectedStatements.add(Statements.ExitAccept.toStaticStatement());
        ospfExportConnected.setGuard(ospfExportConnectedConditions);
    }
    // policy map for redistributing static routes
    // TODO: honor subnets option
    OspfRedistributionPolicy rsp = proc.getRedistributionPolicies().get(RoutingProtocol.STATIC);
    if (rsp != null) {
        If ospfExportStatic = new If();
        ospfExportStatic.setComment("OSPF export static routes");
        Conjunction ospfExportStaticConditions = new Conjunction();
        ospfExportStaticConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.STATIC));
        List<Statement> ospfExportStaticStatements = ospfExportStatic.getTrueStatements();
        ospfExportStaticConditions.getConjuncts().add(new Not(new MatchPrefixSet(new DestinationNetwork(), new ExplicitPrefixSet(new PrefixSpace(Collections.singleton(new PrefixRange(Prefix.ZERO, new SubRange(0, 0))))))));
        Long metric = rsp.getMetric();
        OspfMetricType metricType = rsp.getMetricType();
        ospfExportStaticStatements.add(new SetOspfMetricType(metricType));
        boolean explicitMetric = metric != null;
        if (!explicitMetric) {
            metric = proc.getDefaultMetric(_vendor, RoutingProtocol.STATIC);
        }
        ospfExportStatements.add(new SetMetric(new LiteralLong(metric)));
        ospfExportStatements.add(ospfExportStatic);
        // add export map with metric
        String exportStaticRouteMapName = rsp.getRouteMap();
        if (exportStaticRouteMapName != null) {
            int exportStaticRouteMapLine = rsp.getRouteMapLine();
            RouteMap exportStaticRouteMap = _routeMaps.get(exportStaticRouteMapName);
            if (exportStaticRouteMap == null) {
                undefined(CiscoStructureType.ROUTE_MAP, exportStaticRouteMapName, CiscoStructureUsage.OSPF_REDISTRIBUTE_STATIC_MAP, exportStaticRouteMapLine);
            } else {
                exportStaticRouteMap.getReferers().put(proc, "ospf redistribute static route-map");
                ospfExportStaticConditions.getConjuncts().add(new CallExpr(exportStaticRouteMapName));
            }
        }
        ospfExportStaticStatements.add(Statements.ExitAccept.toStaticStatement());
        ospfExportStatic.setGuard(ospfExportStaticConditions);
    }
    // policy map for redistributing bgp routes
    // TODO: honor subnets option
    OspfRedistributionPolicy rbp = proc.getRedistributionPolicies().get(RoutingProtocol.BGP);
    if (rbp != null) {
        If ospfExportBgp = new If();
        ospfExportBgp.setComment("OSPF export bgp routes");
        Conjunction ospfExportBgpConditions = new Conjunction();
        ospfExportBgpConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.BGP));
        List<Statement> ospfExportBgpStatements = ospfExportBgp.getTrueStatements();
        ospfExportBgpConditions.getConjuncts().add(new Not(new MatchPrefixSet(new DestinationNetwork(), new ExplicitPrefixSet(new PrefixSpace(Collections.singleton(new PrefixRange(Prefix.ZERO, new SubRange(0, 0))))))));
        Long metric = rbp.getMetric();
        OspfMetricType metricType = rbp.getMetricType();
        ospfExportBgpStatements.add(new SetOspfMetricType(metricType));
        boolean explicitMetric = metric != null;
        if (!explicitMetric) {
            metric = proc.getDefaultMetric(_vendor, RoutingProtocol.BGP);
        }
        ospfExportStatements.add(new SetMetric(new LiteralLong(metric)));
        ospfExportStatements.add(ospfExportBgp);
        // add export map with metric
        String exportBgpRouteMapName = rbp.getRouteMap();
        if (exportBgpRouteMapName != null) {
            int exportBgpRouteMapLine = rbp.getRouteMapLine();
            RouteMap exportBgpRouteMap = _routeMaps.get(exportBgpRouteMapName);
            if (exportBgpRouteMap == null) {
                undefined(CiscoStructureType.ROUTE_MAP, exportBgpRouteMapName, CiscoStructureUsage.OSPF_REDISTRIBUTE_BGP_MAP, exportBgpRouteMapLine);
            } else {
                exportBgpRouteMap.getReferers().put(proc, "ospf redistribute bgp route-map");
                ospfExportBgpConditions.getConjuncts().add(new CallExpr(exportBgpRouteMapName));
            }
        }
        ospfExportBgpStatements.add(Statements.ExitAccept.toStaticStatement());
        ospfExportBgp.setGuard(ospfExportBgpConditions);
    }
    newProcess.setReferenceBandwidth(proc.getReferenceBandwidth());
    Ip routerId = proc.getRouterId();
    if (routerId == null) {
        Map<String, Interface> interfacesToCheck;
        Map<String, Interface> allInterfaces = oldConfig.getInterfaces();
        Map<String, Interface> loopbackInterfaces = new HashMap<>();
        for (Entry<String, Interface> e : allInterfaces.entrySet()) {
            String ifaceName = e.getKey();
            Interface iface = e.getValue();
            if (ifaceName.toLowerCase().startsWith("loopback") && iface.getActive() && iface.getAddress() != null) {
                loopbackInterfaces.put(ifaceName, iface);
            }
        }
        if (loopbackInterfaces.isEmpty()) {
            interfacesToCheck = allInterfaces;
        } else {
            interfacesToCheck = loopbackInterfaces;
        }
        Ip highestIp = Ip.ZERO;
        for (Interface iface : interfacesToCheck.values()) {
            if (!iface.getActive()) {
                continue;
            }
            for (InterfaceAddress address : iface.getAllAddresses()) {
                Ip ip = address.getIp();
                if (highestIp.asLong() < ip.asLong()) {
                    highestIp = ip;
                }
            }
        }
        if (highestIp == Ip.ZERO) {
            _w.redFlag("No candidates for OSPF router-id");
            return null;
        }
        routerId = highestIp;
    }
    newProcess.setRouterId(routerId);
    return newProcess;
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) SetMetric(org.batfish.datamodel.routing_policy.statement.SetMetric) CallExpr(org.batfish.datamodel.routing_policy.expr.CallExpr) InterfaceAddress(org.batfish.datamodel.InterfaceAddress) PrefixSpace(org.batfish.datamodel.PrefixSpace) LiteralLong(org.batfish.datamodel.routing_policy.expr.LiteralLong) MatchProtocol(org.batfish.datamodel.routing_policy.expr.MatchProtocol) Not(org.batfish.datamodel.routing_policy.expr.Not) ExplicitPrefixSet(org.batfish.datamodel.routing_policy.expr.ExplicitPrefixSet) OspfMetricType(org.batfish.datamodel.OspfMetricType) SetOspfMetricType(org.batfish.datamodel.routing_policy.statement.SetOspfMetricType) LiteralLong(org.batfish.datamodel.routing_policy.expr.LiteralLong) GeneratedRoute(org.batfish.datamodel.GeneratedRoute) Map(java.util.Map) ImmutableSortedMap(com.google.common.collect.ImmutableSortedMap) TreeMap(java.util.TreeMap) ImmutableMap(com.google.common.collect.ImmutableMap) SortedMap(java.util.SortedMap) HashMap(java.util.HashMap) If(org.batfish.datamodel.routing_policy.statement.If) Ip(org.batfish.datamodel.Ip) Prefix(org.batfish.datamodel.Prefix) ImmutableSortedSet(com.google.common.collect.ImmutableSortedSet) Conjunction(org.batfish.datamodel.routing_policy.expr.Conjunction) SubRange(org.batfish.datamodel.SubRange) RouteFilterLine(org.batfish.datamodel.RouteFilterLine) PrefixRange(org.batfish.datamodel.PrefixRange) OspfArea(org.batfish.datamodel.OspfArea) CallStatement(org.batfish.datamodel.routing_policy.statement.CallStatement) Statement(org.batfish.datamodel.routing_policy.statement.Statement) MatchPrefixSet(org.batfish.datamodel.routing_policy.expr.MatchPrefixSet) RoutingPolicy(org.batfish.datamodel.routing_policy.RoutingPolicy) DestinationNetwork(org.batfish.datamodel.routing_policy.expr.DestinationNetwork) RouteFilterList(org.batfish.datamodel.RouteFilterList) OspfAreaSummary(org.batfish.datamodel.OspfAreaSummary) SetOspfMetricType(org.batfish.datamodel.routing_policy.statement.SetOspfMetricType)

Example 3 with PrefixSpace

use of org.batfish.datamodel.PrefixSpace in project batfish by batfish.

the class CiscoConfiguration method toRipProcess.

private org.batfish.datamodel.RipProcess toRipProcess(RipProcess proc, String vrfName, Configuration c, CiscoConfiguration oldConfig) {
    org.batfish.datamodel.RipProcess newProcess = new org.batfish.datamodel.RipProcess();
    org.batfish.datamodel.Vrf vrf = c.getVrfs().get(vrfName);
    // establish areas and associated interfaces
    SortedSet<Prefix> networks = proc.getNetworks();
    for (Entry<String, org.batfish.datamodel.Interface> e : vrf.getInterfaces().entrySet()) {
        String ifaceName = e.getKey();
        org.batfish.datamodel.Interface i = e.getValue();
        InterfaceAddress interfaceAddress = i.getAddress();
        if (interfaceAddress == null) {
            continue;
        }
        Prefix interfaceNetwork = interfaceAddress.getPrefix();
        if (networks.contains(interfaceNetwork)) {
            newProcess.getInterfaces().add(ifaceName);
            i.setRipEnabled(true);
            boolean passive = proc.getPassiveInterfaceList().contains(i.getName()) || (proc.getPassiveInterfaceDefault() && !proc.getActiveInterfaceList().contains(ifaceName));
            i.setOspfPassive(passive);
        }
    }
    String ripExportPolicyName = "~RIP_EXPORT_POLICY:" + vrfName + "~";
    RoutingPolicy ripExportPolicy = new RoutingPolicy(ripExportPolicyName, c);
    c.getRoutingPolicies().put(ripExportPolicyName, ripExportPolicy);
    List<Statement> ripExportStatements = ripExportPolicy.getStatements();
    newProcess.setExportPolicy(ripExportPolicyName);
    // policy map for default information
    if (proc.getDefaultInformationOriginate()) {
        If ripExportDefault = new If();
        ripExportStatements.add(ripExportDefault);
        ripExportDefault.setComment("RIP export default route");
        Conjunction ripExportDefaultConditions = new Conjunction();
        List<Statement> ripExportDefaultStatements = ripExportDefault.getTrueStatements();
        ripExportDefaultConditions.getConjuncts().add(new MatchPrefixSet(new DestinationNetwork(), new ExplicitPrefixSet(new PrefixSpace(Collections.singleton(new PrefixRange(Prefix.ZERO, new SubRange(0, 0)))))));
        long metric = proc.getDefaultInformationMetric();
        ripExportDefaultStatements.add(new SetMetric(new LiteralLong(metric)));
        // add default export map with metric
        String defaultOriginateMapName = proc.getDefaultInformationOriginateMap();
        if (defaultOriginateMapName != null) {
            int defaultOriginateMapLine = proc.getDefaultInformationOriginateMapLine();
            RoutingPolicy ripDefaultGenerationPolicy = c.getRoutingPolicies().get(defaultOriginateMapName);
            if (ripDefaultGenerationPolicy == null) {
                undefined(CiscoStructureType.ROUTE_MAP, defaultOriginateMapName, CiscoStructureUsage.RIP_DEFAULT_ORIGINATE_ROUTE_MAP, defaultOriginateMapLine);
            } else {
                RouteMap generationRouteMap = _routeMaps.get(defaultOriginateMapName);
                generationRouteMap.getReferers().put(proc, "rip default-originate route-map");
                GeneratedRoute.Builder route = new GeneratedRoute.Builder();
                route.setNetwork(Prefix.ZERO);
                route.setAdmin(MAX_ADMINISTRATIVE_COST);
                route.setGenerationPolicy(defaultOriginateMapName);
                newProcess.getGeneratedRoutes().add(route.build());
            }
        } else {
            // add generated aggregate with no precondition
            GeneratedRoute.Builder route = new GeneratedRoute.Builder();
            route.setNetwork(Prefix.ZERO);
            route.setAdmin(MAX_ADMINISTRATIVE_COST);
            newProcess.getGeneratedRoutes().add(route.build());
        }
        ripExportDefaultConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.AGGREGATE));
        ripExportDefaultStatements.add(Statements.ExitAccept.toStaticStatement());
        ripExportDefault.setGuard(ripExportDefaultConditions);
    }
    // policy for redistributing connected routes
    RipRedistributionPolicy rcp = proc.getRedistributionPolicies().get(RoutingProtocol.CONNECTED);
    if (rcp != null) {
        If ripExportConnected = new If();
        ripExportConnected.setComment("RIP export connected routes");
        Conjunction ripExportConnectedConditions = new Conjunction();
        ripExportConnectedConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.CONNECTED));
        List<Statement> ripExportConnectedStatements = ripExportConnected.getTrueStatements();
        Long metric = rcp.getMetric();
        boolean explicitMetric = metric != null;
        if (!explicitMetric) {
            metric = RipRedistributionPolicy.DEFAULT_REDISTRIBUTE_CONNECTED_METRIC;
        }
        ripExportStatements.add(new SetMetric(new LiteralLong(metric)));
        ripExportStatements.add(ripExportConnected);
        // add default export map with metric
        String exportConnectedRouteMapName = rcp.getRouteMap();
        if (exportConnectedRouteMapName != null) {
            int exportConnectedRouteMapLine = rcp.getRouteMapLine();
            RouteMap exportConnectedRouteMap = _routeMaps.get(exportConnectedRouteMapName);
            if (exportConnectedRouteMap == null) {
                undefined(CiscoStructureType.ROUTE_MAP, exportConnectedRouteMapName, CiscoStructureUsage.RIP_REDISTRIBUTE_CONNECTED_MAP, exportConnectedRouteMapLine);
            } else {
                exportConnectedRouteMap.getReferers().put(proc, "rip redistribute connected route-map");
                ripExportConnectedConditions.getConjuncts().add(new CallExpr(exportConnectedRouteMapName));
            }
        }
        ripExportConnectedStatements.add(Statements.ExitAccept.toStaticStatement());
        ripExportConnected.setGuard(ripExportConnectedConditions);
    }
    // policy map for redistributing static routes
    RipRedistributionPolicy rsp = proc.getRedistributionPolicies().get(RoutingProtocol.STATIC);
    if (rsp != null) {
        If ripExportStatic = new If();
        ripExportStatic.setComment("RIP export static routes");
        Conjunction ripExportStaticConditions = new Conjunction();
        ripExportStaticConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.STATIC));
        List<Statement> ripExportStaticStatements = ripExportStatic.getTrueStatements();
        ripExportStaticConditions.getConjuncts().add(new Not(new MatchPrefixSet(new DestinationNetwork(), new ExplicitPrefixSet(new PrefixSpace(Collections.singleton(new PrefixRange(Prefix.ZERO, new SubRange(0, 0))))))));
        Long metric = rsp.getMetric();
        boolean explicitMetric = metric != null;
        if (!explicitMetric) {
            metric = RipRedistributionPolicy.DEFAULT_REDISTRIBUTE_STATIC_METRIC;
        }
        ripExportStatements.add(new SetMetric(new LiteralLong(metric)));
        ripExportStatements.add(ripExportStatic);
        // add export map with metric
        String exportStaticRouteMapName = rsp.getRouteMap();
        if (exportStaticRouteMapName != null) {
            int exportStaticRouteMapLine = rsp.getRouteMapLine();
            RouteMap exportStaticRouteMap = _routeMaps.get(exportStaticRouteMapName);
            if (exportStaticRouteMap == null) {
                undefined(CiscoStructureType.ROUTE_MAP, exportStaticRouteMapName, CiscoStructureUsage.RIP_REDISTRIBUTE_STATIC_MAP, exportStaticRouteMapLine);
            } else {
                exportStaticRouteMap.getReferers().put(proc, "rip redistribute static route-map");
                ripExportStaticConditions.getConjuncts().add(new CallExpr(exportStaticRouteMapName));
            }
        }
        ripExportStaticStatements.add(Statements.ExitAccept.toStaticStatement());
        ripExportStatic.setGuard(ripExportStaticConditions);
    }
    // policy map for redistributing bgp routes
    RipRedistributionPolicy rbp = proc.getRedistributionPolicies().get(RoutingProtocol.BGP);
    if (rbp != null) {
        If ripExportBgp = new If();
        ripExportBgp.setComment("RIP export bgp routes");
        Conjunction ripExportBgpConditions = new Conjunction();
        ripExportBgpConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.BGP));
        List<Statement> ripExportBgpStatements = ripExportBgp.getTrueStatements();
        ripExportBgpConditions.getConjuncts().add(new Not(new MatchPrefixSet(new DestinationNetwork(), new ExplicitPrefixSet(new PrefixSpace(Collections.singleton(new PrefixRange(Prefix.ZERO, new SubRange(0, 0))))))));
        Long metric = rbp.getMetric();
        boolean explicitMetric = metric != null;
        if (!explicitMetric) {
            metric = RipRedistributionPolicy.DEFAULT_REDISTRIBUTE_BGP_METRIC;
        }
        ripExportStatements.add(new SetMetric(new LiteralLong(metric)));
        ripExportStatements.add(ripExportBgp);
        // add export map with metric
        String exportBgpRouteMapName = rbp.getRouteMap();
        if (exportBgpRouteMapName != null) {
            int exportBgpRouteMapLine = rbp.getRouteMapLine();
            RouteMap exportBgpRouteMap = _routeMaps.get(exportBgpRouteMapName);
            if (exportBgpRouteMap == null) {
                undefined(CiscoStructureType.ROUTE_MAP, exportBgpRouteMapName, CiscoStructureUsage.RIP_REDISTRIBUTE_BGP_MAP, exportBgpRouteMapLine);
            } else {
                exportBgpRouteMap.getReferers().put(proc, "rip redistribute bgp route-map");
                ripExportBgpConditions.getConjuncts().add(new CallExpr(exportBgpRouteMapName));
            }
        }
        ripExportBgpStatements.add(Statements.ExitAccept.toStaticStatement());
        ripExportBgp.setGuard(ripExportBgpConditions);
    }
    return newProcess;
}
Also used : Prefix(org.batfish.datamodel.Prefix) SetMetric(org.batfish.datamodel.routing_policy.statement.SetMetric) Conjunction(org.batfish.datamodel.routing_policy.expr.Conjunction) CallExpr(org.batfish.datamodel.routing_policy.expr.CallExpr) SubRange(org.batfish.datamodel.SubRange) PrefixRange(org.batfish.datamodel.PrefixRange) InterfaceAddress(org.batfish.datamodel.InterfaceAddress) CallStatement(org.batfish.datamodel.routing_policy.statement.CallStatement) Statement(org.batfish.datamodel.routing_policy.statement.Statement) MatchPrefixSet(org.batfish.datamodel.routing_policy.expr.MatchPrefixSet) PrefixSpace(org.batfish.datamodel.PrefixSpace) RoutingPolicy(org.batfish.datamodel.routing_policy.RoutingPolicy) LiteralLong(org.batfish.datamodel.routing_policy.expr.LiteralLong) MatchProtocol(org.batfish.datamodel.routing_policy.expr.MatchProtocol) Not(org.batfish.datamodel.routing_policy.expr.Not) DestinationNetwork(org.batfish.datamodel.routing_policy.expr.DestinationNetwork) ExplicitPrefixSet(org.batfish.datamodel.routing_policy.expr.ExplicitPrefixSet) LiteralLong(org.batfish.datamodel.routing_policy.expr.LiteralLong) GeneratedRoute(org.batfish.datamodel.GeneratedRoute) If(org.batfish.datamodel.routing_policy.statement.If)

Example 4 with PrefixSpace

use of org.batfish.datamodel.PrefixSpace in project batfish by batfish.

the class CiscoConfiguration method toBgpProcess.

private org.batfish.datamodel.BgpProcess toBgpProcess(final Configuration c, BgpProcess proc, String vrfName) {
    org.batfish.datamodel.BgpProcess newBgpProcess = new org.batfish.datamodel.BgpProcess();
    org.batfish.datamodel.Vrf v = c.getVrfs().get(vrfName);
    BgpTieBreaker tieBreaker = proc.getTieBreaker();
    if (tieBreaker != null) {
        newBgpProcess.setTieBreaker(tieBreaker);
    }
    MultipathEquivalentAsPathMatchMode multipathEquivalentAsPathMatchMode = proc.getAsPathMultipathRelax() ? MultipathEquivalentAsPathMatchMode.PATH_LENGTH : MultipathEquivalentAsPathMatchMode.EXACT_PATH;
    newBgpProcess.setMultipathEquivalentAsPathMatchMode(multipathEquivalentAsPathMatchMode);
    Integer maximumPaths = proc.getMaximumPaths();
    Integer maximumPathsEbgp = proc.getMaximumPathsEbgp();
    Integer maximumPathsIbgp = proc.getMaximumPathsIbgp();
    boolean multipathEbgp = false;
    boolean multipathIbgp = false;
    if (maximumPaths != null && maximumPaths > 1) {
        multipathEbgp = true;
        multipathIbgp = true;
    }
    if (maximumPathsEbgp != null && maximumPathsEbgp > 1) {
        multipathEbgp = true;
    }
    if (maximumPathsIbgp != null && maximumPathsIbgp > 1) {
        multipathIbgp = true;
    }
    newBgpProcess.setMultipathEbgp(multipathEbgp);
    newBgpProcess.setMultipathIbgp(multipathIbgp);
    Map<Prefix, BgpNeighbor> newBgpNeighbors = newBgpProcess.getNeighbors();
    int defaultMetric = proc.getDefaultMetric();
    Ip bgpRouterId = getBgpRouterId(c, vrfName, proc);
    MatchPrefixSet matchDefaultRoute = new MatchPrefixSet(new DestinationNetwork(), new ExplicitPrefixSet(new PrefixSpace(Collections.singleton(new PrefixRange(Prefix.ZERO, new SubRange(0, 0))))));
    matchDefaultRoute.setComment("match default route");
    MatchPrefix6Set matchDefaultRoute6 = new MatchPrefix6Set(new DestinationNetwork6(), new ExplicitPrefix6Set(new Prefix6Space(Collections.singleton(new Prefix6Range(Prefix6.ZERO, new SubRange(0, 0))))));
    matchDefaultRoute.setComment("match default route");
    newBgpProcess.setRouterId(bgpRouterId);
    Set<BgpAggregateIpv4Network> summaryOnlyNetworks = new HashSet<>();
    Set<BgpAggregateIpv6Network> summaryOnlyIpv6Networks = new HashSet<>();
    List<BooleanExpr> attributeMapPrefilters = new ArrayList<>();
    // add generated routes for aggregate ipv4 addresses
    for (Entry<Prefix, BgpAggregateIpv4Network> e : proc.getAggregateNetworks().entrySet()) {
        Prefix prefix = e.getKey();
        BgpAggregateIpv4Network aggNet = e.getValue();
        boolean summaryOnly = aggNet.getSummaryOnly();
        int prefixLength = prefix.getPrefixLength();
        SubRange prefixRange = new SubRange(prefixLength + 1, Prefix.MAX_PREFIX_LENGTH);
        if (summaryOnly) {
            summaryOnlyNetworks.add(aggNet);
        }
        // create generation policy for aggregate network
        String generationPolicyName = "~AGGREGATE_ROUTE_GEN:" + vrfName + ":" + prefix + "~";
        RoutingPolicy currentGeneratedRoutePolicy = new RoutingPolicy(generationPolicyName, c);
        If currentGeneratedRouteConditional = new If();
        currentGeneratedRoutePolicy.getStatements().add(currentGeneratedRouteConditional);
        currentGeneratedRouteConditional.setGuard(new MatchPrefixSet(new DestinationNetwork(), new ExplicitPrefixSet(new PrefixSpace(Collections.singleton(new PrefixRange(prefix, prefixRange))))));
        currentGeneratedRouteConditional.getTrueStatements().add(Statements.ReturnTrue.toStaticStatement());
        c.getRoutingPolicies().put(generationPolicyName, currentGeneratedRoutePolicy);
        GeneratedRoute.Builder gr = new GeneratedRoute.Builder();
        gr.setNetwork(prefix);
        gr.setAdmin(CISCO_AGGREGATE_ROUTE_ADMIN_COST);
        gr.setGenerationPolicy(generationPolicyName);
        gr.setDiscard(true);
        // set attribute map for aggregate network
        String attributeMapName = aggNet.getAttributeMap();
        Conjunction applyCurrentAggregateAttributesConditions = new Conjunction();
        applyCurrentAggregateAttributesConditions.getConjuncts().add(new MatchPrefixSet(new DestinationNetwork(), new ExplicitPrefixSet(new PrefixSpace(Collections.singleton(PrefixRange.fromPrefix(prefix))))));
        applyCurrentAggregateAttributesConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.AGGREGATE));
        BooleanExpr weInterior = BooleanExprs.True.toStaticBooleanExpr();
        if (attributeMapName != null) {
            int attributeMapLine = aggNet.getAttributeMapLine();
            RouteMap attributeMap = _routeMaps.get(attributeMapName);
            if (attributeMap != null) {
                // need to apply attribute changes if this specific route is
                // matched
                weInterior = new CallExpr(attributeMapName);
                attributeMap.getReferers().put(aggNet, "attribute-map of aggregate route: " + prefix);
                gr.setAttributePolicy(attributeMapName);
            } else {
                undefined(CiscoStructureType.ROUTE_MAP, attributeMapName, CiscoStructureUsage.BGP_AGGREGATE_ATTRIBUTE_MAP, attributeMapLine);
            }
        }
        v.getGeneratedRoutes().add(gr.build());
        BooleanExpr we = bgpRedistributeWithEnvironmentExpr(weInterior, OriginType.IGP);
        applyCurrentAggregateAttributesConditions.getConjuncts().add(we);
        attributeMapPrefilters.add(applyCurrentAggregateAttributesConditions);
    }
    // TODO: merge with above to make cleaner
    for (Entry<Prefix6, BgpAggregateIpv6Network> e : proc.getAggregateIpv6Networks().entrySet()) {
        Prefix6 prefix6 = e.getKey();
        BgpAggregateIpv6Network aggNet = e.getValue();
        boolean summaryOnly = aggNet.getSummaryOnly();
        int prefixLength = prefix6.getPrefixLength();
        SubRange prefixRange = new SubRange(prefixLength + 1, Prefix.MAX_PREFIX_LENGTH);
        if (summaryOnly) {
            summaryOnlyIpv6Networks.add(aggNet);
        }
        // create generation policy for aggregate network
        String generationPolicyName = "~AGGREGATE_ROUTE6_GEN:" + vrfName + ":" + prefix6 + "~";
        RoutingPolicy currentGeneratedRoutePolicy = new RoutingPolicy(generationPolicyName, c);
        If currentGeneratedRouteConditional = new If();
        currentGeneratedRoutePolicy.getStatements().add(currentGeneratedRouteConditional);
        currentGeneratedRouteConditional.setGuard(new MatchPrefix6Set(new DestinationNetwork6(), new ExplicitPrefix6Set(new Prefix6Space(Collections.singleton(new Prefix6Range(prefix6, prefixRange))))));
        currentGeneratedRouteConditional.getTrueStatements().add(Statements.ReturnTrue.toStaticStatement());
        c.getRoutingPolicies().put(generationPolicyName, currentGeneratedRoutePolicy);
        GeneratedRoute6 gr = new GeneratedRoute6(prefix6, CISCO_AGGREGATE_ROUTE_ADMIN_COST);
        gr.setGenerationPolicy(generationPolicyName);
        gr.setDiscard(true);
        v.getGeneratedIpv6Routes().add(gr);
        // set attribute map for aggregate network
        String attributeMapName = aggNet.getAttributeMap();
        if (attributeMapName != null) {
            int attributeMapLine = aggNet.getAttributeMapLine();
            RouteMap attributeMap = _routeMaps.get(attributeMapName);
            if (attributeMap != null) {
                attributeMap.getReferers().put(aggNet, "attribute-map of aggregate ipv6 route: " + prefix6);
                gr.setAttributePolicy(attributeMapName);
            } else {
                undefined(CiscoStructureType.ROUTE_MAP, attributeMapName, CiscoStructureUsage.BGP_AGGREGATE_ATTRIBUTE_MAP, attributeMapLine);
            }
        }
    }
    /*
     * Create common bgp export policy. This policy encompasses network
     * statements, aggregate-address with/without summary-only, redistribution
     * from other protocols, and default-origination
     */
    String bgpCommonExportPolicyName = "~BGP_COMMON_EXPORT_POLICY:" + vrfName + "~";
    RoutingPolicy bgpCommonExportPolicy = new RoutingPolicy(bgpCommonExportPolicyName, c);
    c.getRoutingPolicies().put(bgpCommonExportPolicyName, bgpCommonExportPolicy);
    List<Statement> bgpCommonExportStatements = bgpCommonExportPolicy.getStatements();
    // create policy for denying suppressed summary-only networks
    if (summaryOnlyNetworks.size() > 0) {
        If suppressSummaryOnly = new If();
        bgpCommonExportStatements.add(suppressSummaryOnly);
        suppressSummaryOnly.setComment("Suppress summarized of summary-only aggregate-address networks");
        String matchSuppressedSummaryOnlyRoutesName = "~MATCH_SUPPRESSED_SUMMARY_ONLY:" + vrfName + "~";
        RouteFilterList matchSuppressedSummaryOnlyRoutes = new RouteFilterList(matchSuppressedSummaryOnlyRoutesName);
        c.getRouteFilterLists().put(matchSuppressedSummaryOnlyRoutesName, matchSuppressedSummaryOnlyRoutes);
        for (BgpAggregateIpv4Network summaryOnlyNetwork : summaryOnlyNetworks) {
            Prefix prefix = summaryOnlyNetwork.getPrefix();
            int prefixLength = prefix.getPrefixLength();
            RouteFilterLine line = new RouteFilterLine(LineAction.ACCEPT, prefix, new SubRange(prefixLength + 1, Prefix.MAX_PREFIX_LENGTH));
            matchSuppressedSummaryOnlyRoutes.addLine(line);
        }
        suppressSummaryOnly.setGuard(new MatchPrefixSet(new DestinationNetwork(), new NamedPrefixSet(matchSuppressedSummaryOnlyRoutesName)));
        suppressSummaryOnly.getTrueStatements().add(Statements.ReturnFalse.toStaticStatement());
    }
    If preFilter = new If();
    bgpCommonExportStatements.add(preFilter);
    bgpCommonExportStatements.add(Statements.ReturnFalse.toStaticStatement());
    Disjunction preFilterConditions = new Disjunction();
    preFilter.setGuard(preFilterConditions);
    preFilter.getTrueStatements().add(Statements.ReturnTrue.toStaticStatement());
    preFilterConditions.getDisjuncts().addAll(attributeMapPrefilters);
    // create redistribution origination policies
    // redistribute rip
    BgpRedistributionPolicy redistributeRipPolicy = proc.getRedistributionPolicies().get(RoutingProtocol.RIP);
    if (redistributeRipPolicy != null) {
        BooleanExpr weInterior = BooleanExprs.True.toStaticBooleanExpr();
        Conjunction exportRipConditions = new Conjunction();
        exportRipConditions.setComment("Redistribute RIP routes into BGP");
        exportRipConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.RIP));
        String mapName = redistributeRipPolicy.getRouteMap();
        if (mapName != null) {
            int mapLine = redistributeRipPolicy.getRouteMapLine();
            RouteMap redistributeRipRouteMap = _routeMaps.get(mapName);
            if (redistributeRipRouteMap != null) {
                redistributeRipRouteMap.getReferers().put(proc, "RIP redistribution route-map");
                weInterior = new CallExpr(mapName);
            } else {
                undefined(CiscoStructureType.ROUTE_MAP, mapName, CiscoStructureUsage.BGP_REDISTRIBUTE_RIP_MAP, mapLine);
            }
        }
        BooleanExpr we = bgpRedistributeWithEnvironmentExpr(weInterior, OriginType.INCOMPLETE);
        exportRipConditions.getConjuncts().add(we);
        preFilterConditions.getDisjuncts().add(exportRipConditions);
    }
    // redistribute static
    BgpRedistributionPolicy redistributeStaticPolicy = proc.getRedistributionPolicies().get(RoutingProtocol.STATIC);
    if (redistributeStaticPolicy != null) {
        BooleanExpr weInterior = BooleanExprs.True.toStaticBooleanExpr();
        Conjunction exportStaticConditions = new Conjunction();
        exportStaticConditions.setComment("Redistribute static routes into BGP");
        exportStaticConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.STATIC));
        String mapName = redistributeStaticPolicy.getRouteMap();
        if (mapName != null) {
            int mapLine = redistributeStaticPolicy.getRouteMapLine();
            RouteMap redistributeStaticRouteMap = _routeMaps.get(mapName);
            if (redistributeStaticRouteMap != null) {
                redistributeStaticRouteMap.getReferers().put(proc, "static redistribution route-map");
                weInterior = new CallExpr(mapName);
            } else {
                undefined(CiscoStructureType.ROUTE_MAP, mapName, CiscoStructureUsage.BGP_REDISTRIBUTE_STATIC_MAP, mapLine);
            }
        }
        BooleanExpr we = bgpRedistributeWithEnvironmentExpr(weInterior, OriginType.INCOMPLETE);
        exportStaticConditions.getConjuncts().add(we);
        preFilterConditions.getDisjuncts().add(exportStaticConditions);
    }
    // redistribute connected
    BgpRedistributionPolicy redistributeConnectedPolicy = proc.getRedistributionPolicies().get(RoutingProtocol.CONNECTED);
    if (redistributeConnectedPolicy != null) {
        BooleanExpr weInterior = BooleanExprs.True.toStaticBooleanExpr();
        Conjunction exportConnectedConditions = new Conjunction();
        exportConnectedConditions.setComment("Redistribute connected routes into BGP");
        exportConnectedConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.CONNECTED));
        String mapName = redistributeConnectedPolicy.getRouteMap();
        if (mapName != null) {
            int mapLine = redistributeConnectedPolicy.getRouteMapLine();
            RouteMap redistributeConnectedRouteMap = _routeMaps.get(mapName);
            if (redistributeConnectedRouteMap != null) {
                redistributeConnectedRouteMap.getReferers().put(proc, "connected redistribution route-map");
                weInterior = new CallExpr(mapName);
            } else {
                undefined(CiscoStructureType.ROUTE_MAP, mapName, CiscoStructureUsage.BGP_REDISTRIBUTE_CONNECTED_MAP, mapLine);
            }
        }
        BooleanExpr we = bgpRedistributeWithEnvironmentExpr(weInterior, OriginType.INCOMPLETE);
        exportConnectedConditions.getConjuncts().add(we);
        preFilterConditions.getDisjuncts().add(exportConnectedConditions);
    }
    // redistribute ospf
    BgpRedistributionPolicy redistributeOspfPolicy = proc.getRedistributionPolicies().get(RoutingProtocol.OSPF);
    if (redistributeOspfPolicy != null) {
        BooleanExpr weInterior = BooleanExprs.True.toStaticBooleanExpr();
        Conjunction exportOspfConditions = new Conjunction();
        exportOspfConditions.setComment("Redistribute OSPF routes into BGP");
        exportOspfConditions.getConjuncts().add(new MatchProtocol(RoutingProtocol.OSPF));
        String mapName = redistributeOspfPolicy.getRouteMap();
        if (mapName != null) {
            int mapLine = redistributeOspfPolicy.getRouteMapLine();
            RouteMap redistributeOspfRouteMap = _routeMaps.get(mapName);
            if (redistributeOspfRouteMap != null) {
                redistributeOspfRouteMap.getReferers().put(proc, "ospf redistribution route-map");
                weInterior = new CallExpr(mapName);
            } else {
                undefined(CiscoStructureType.ROUTE_MAP, mapName, CiscoStructureUsage.BGP_REDISTRIBUTE_OSPF_MAP, mapLine);
            }
        }
        BooleanExpr we = bgpRedistributeWithEnvironmentExpr(weInterior, OriginType.INCOMPLETE);
        exportOspfConditions.getConjuncts().add(we);
        preFilterConditions.getDisjuncts().add(exportOspfConditions);
    }
    // cause ip peer groups to inherit unset fields from owning named peer
    // group if it exists, and then always from process master peer group
    Set<LeafBgpPeerGroup> leafGroups = new LinkedHashSet<>();
    leafGroups.addAll(proc.getIpPeerGroups().values());
    leafGroups.addAll(proc.getIpv6PeerGroups().values());
    leafGroups.addAll(proc.getDynamicIpPeerGroups().values());
    leafGroups.addAll(proc.getDynamicIpv6PeerGroups().values());
    for (LeafBgpPeerGroup lpg : leafGroups) {
        lpg.inheritUnsetFields(proc, this);
    }
    _unusedPeerGroups = new TreeMap<>();
    int fakePeerCounter = -1;
    // peer groups / peer templates
    for (Entry<String, NamedBgpPeerGroup> e : proc.getNamedPeerGroups().entrySet()) {
        String name = e.getKey();
        NamedBgpPeerGroup namedPeerGroup = e.getValue();
        if (!namedPeerGroup.getInherited()) {
            _unusedPeerGroups.put(name, namedPeerGroup.getDefinitionLine());
            Ip fakeIp = new Ip(fakePeerCounter);
            IpBgpPeerGroup fakePg = new IpBgpPeerGroup(fakeIp);
            fakePg.setGroupName(name);
            fakePg.setActive(false);
            fakePg.setShutdown(true);
            leafGroups.add(fakePg);
            fakePg.inheritUnsetFields(proc, this);
            fakePeerCounter--;
        }
        namedPeerGroup.inheritUnsetFields(proc, this);
    }
    // separate because peer sessions can inherit from other peer sessions
    _unusedPeerSessions = new TreeMap<>();
    int fakeGroupCounter = 1;
    for (NamedBgpPeerGroup namedPeerGroup : proc.getPeerSessions().values()) {
        namedPeerGroup.getParentSession(proc, this).inheritUnsetFields(proc, this);
    }
    for (Entry<String, NamedBgpPeerGroup> e : proc.getPeerSessions().entrySet()) {
        String name = e.getKey();
        NamedBgpPeerGroup namedPeerGroup = e.getValue();
        if (!namedPeerGroup.getInherited()) {
            _unusedPeerSessions.put(name, namedPeerGroup.getDefinitionLine());
            String fakeNamedPgName = "~FAKE_PG_" + fakeGroupCounter + "~";
            NamedBgpPeerGroup fakeNamedPg = new NamedBgpPeerGroup(fakeNamedPgName, -1);
            fakeNamedPg.setPeerSession(name);
            proc.getNamedPeerGroups().put(fakeNamedPgName, fakeNamedPg);
            Ip fakeIp = new Ip(fakePeerCounter);
            IpBgpPeerGroup fakePg = new IpBgpPeerGroup(fakeIp);
            fakePg.setGroupName(fakeNamedPgName);
            fakePg.setActive(false);
            fakePg.setShutdown(true);
            leafGroups.add(fakePg);
            fakePg.inheritUnsetFields(proc, this);
            fakeGroupCounter++;
            fakePeerCounter--;
        }
    }
    // create origination prefilter from listed advertised networks
    proc.getIpNetworks().forEach((prefix, bgpNetwork) -> {
        String mapName = bgpNetwork.getRouteMapName();
        BooleanExpr weExpr = BooleanExprs.True.toStaticBooleanExpr();
        if (mapName != null) {
            int mapLine = bgpNetwork.getRouteMapLine();
            RouteMap routeMap = _routeMaps.get(mapName);
            if (routeMap != null) {
                weExpr = new CallExpr(mapName);
                routeMap.getReferers().put(proc, "bgp ipv4 advertised network route-map");
            } else {
                undefined(CiscoStructureType.ROUTE_MAP, mapName, CiscoStructureUsage.BGP_NETWORK_ORIGINATION_ROUTE_MAP, mapLine);
            }
        }
        BooleanExpr we = bgpRedistributeWithEnvironmentExpr(weExpr, OriginType.IGP);
        Conjunction exportNetworkConditions = new Conjunction();
        PrefixSpace space = new PrefixSpace();
        space.addPrefix(prefix);
        exportNetworkConditions.getConjuncts().add(new MatchPrefixSet(new DestinationNetwork(), new ExplicitPrefixSet(space)));
        exportNetworkConditions.getConjuncts().add(new Not(new MatchProtocol(RoutingProtocol.BGP)));
        exportNetworkConditions.getConjuncts().add(new Not(new MatchProtocol(RoutingProtocol.IBGP)));
        // TODO: ban aggregates?
        exportNetworkConditions.getConjuncts().add(new Not(new MatchProtocol(RoutingProtocol.AGGREGATE)));
        exportNetworkConditions.getConjuncts().add(we);
        preFilterConditions.getDisjuncts().add(exportNetworkConditions);
    });
    String localFilter6Name = "~BGP_NETWORK6_NETWORKS_FILTER:" + vrfName + "~";
    Route6FilterList localFilter6 = new Route6FilterList(localFilter6Name);
    proc.getIpv6Networks().forEach((prefix6, bgpNetwork6) -> {
        int prefixLen = prefix6.getPrefixLength();
        Route6FilterLine line = new Route6FilterLine(LineAction.ACCEPT, prefix6, new SubRange(prefixLen, prefixLen));
        localFilter6.addLine(line);
        String mapName = bgpNetwork6.getRouteMapName();
        if (mapName != null) {
            int mapLine = bgpNetwork6.getRouteMapLine();
            RouteMap routeMap = _routeMaps.get(mapName);
            if (routeMap != null) {
                routeMap.getReferers().put(proc, "bgp ipv6 advertised network route-map");
                BooleanExpr we = bgpRedistributeWithEnvironmentExpr(new CallExpr(mapName), OriginType.IGP);
                Conjunction exportNetwork6Conditions = new Conjunction();
                Prefix6Space space6 = new Prefix6Space();
                space6.addPrefix6(prefix6);
                exportNetwork6Conditions.getConjuncts().add(new MatchPrefix6Set(new DestinationNetwork6(), new ExplicitPrefix6Set(space6)));
                exportNetwork6Conditions.getConjuncts().add(new Not(new MatchProtocol(RoutingProtocol.BGP)));
                exportNetwork6Conditions.getConjuncts().add(new Not(new MatchProtocol(RoutingProtocol.IBGP)));
                // TODO: ban aggregates?
                exportNetwork6Conditions.getConjuncts().add(new Not(new MatchProtocol(RoutingProtocol.AGGREGATE)));
                exportNetwork6Conditions.getConjuncts().add(we);
                preFilterConditions.getDisjuncts().add(exportNetwork6Conditions);
            } else {
                undefined(CiscoStructureType.ROUTE_MAP, mapName, CiscoStructureUsage.BGP_NETWORK6_ORIGINATION_ROUTE_MAP, mapLine);
            }
        }
    });
    c.getRoute6FilterLists().put(localFilter6Name, localFilter6);
    MatchProtocol isEbgp = new MatchProtocol(RoutingProtocol.BGP);
    MatchProtocol isIbgp = new MatchProtocol(RoutingProtocol.IBGP);
    preFilterConditions.getDisjuncts().add(isEbgp);
    preFilterConditions.getDisjuncts().add(isIbgp);
    for (LeafBgpPeerGroup lpg : leafGroups) {
        // update source
        String updateSourceInterface = lpg.getUpdateSource();
        boolean ipv4 = lpg.getNeighborPrefix() != null;
        Ip updateSource = getUpdateSource(c, vrfName, lpg, updateSourceInterface, ipv4);
        RoutingPolicy importPolicy = null;
        String inboundRouteMapName = lpg.getInboundRouteMap();
        if (inboundRouteMapName != null) {
            int inboundRouteMapLine = lpg.getInboundRouteMapLine();
            importPolicy = c.getRoutingPolicies().get(inboundRouteMapName);
            if (importPolicy == null) {
                undefined(CiscoStructureType.ROUTE_MAP, inboundRouteMapName, CiscoStructureUsage.BGP_INBOUND_ROUTE_MAP, inboundRouteMapLine);
            } else {
                RouteMap inboundRouteMap = _routeMaps.get(inboundRouteMapName);
                inboundRouteMap.getReferers().put(lpg, "inbound route-map for leaf peer-group: " + lpg.getName());
            }
        }
        String inboundRoute6MapName = lpg.getInboundRoute6Map();
        RoutingPolicy importPolicy6 = null;
        if (inboundRoute6MapName != null) {
            int inboundRoute6MapLine = lpg.getInboundRoute6MapLine();
            importPolicy6 = c.getRoutingPolicies().get(inboundRoute6MapName);
            if (importPolicy6 == null) {
                undefined(CiscoStructureType.ROUTE_MAP, inboundRoute6MapName, CiscoStructureUsage.BGP_INBOUND_ROUTE6_MAP, inboundRoute6MapLine);
            } else {
                RouteMap inboundRouteMap = _routeMaps.get(inboundRoute6MapName);
                inboundRouteMap.getReferers().put(lpg, "inbound route-map for leaf peer-group: " + lpg.getName());
            }
        }
        String peerExportPolicyName = "~BGP_PEER_EXPORT_POLICY:" + vrfName + ":" + lpg.getName() + "~";
        RoutingPolicy peerExportPolicy = new RoutingPolicy(peerExportPolicyName, c);
        if (lpg.getActive() && !lpg.getShutdown()) {
            c.getRoutingPolicies().put(peerExportPolicyName, peerExportPolicy);
        }
        if (lpg.getNextHopSelf() != null && lpg.getNextHopSelf()) {
            peerExportPolicy.getStatements().add(new SetNextHop(new SelfNextHop(), false));
        }
        if (lpg.getRemovePrivateAs() != null && lpg.getRemovePrivateAs()) {
            peerExportPolicy.getStatements().add(Statements.RemovePrivateAs.toStaticStatement());
        }
        If peerExportConditional = new If();
        peerExportConditional.setComment("peer-export policy main conditional: exitAccept if true / exitReject if false");
        peerExportPolicy.getStatements().add(peerExportConditional);
        Conjunction peerExportConditions = new Conjunction();
        peerExportConditional.setGuard(peerExportConditions);
        peerExportConditional.getTrueStatements().add(Statements.ExitAccept.toStaticStatement());
        peerExportConditional.getFalseStatements().add(Statements.ExitReject.toStaticStatement());
        Disjunction localOrCommonOrigination = new Disjunction();
        peerExportConditions.getConjuncts().add(localOrCommonOrigination);
        localOrCommonOrigination.getDisjuncts().add(new CallExpr(bgpCommonExportPolicyName));
        String outboundRouteMapName = lpg.getOutboundRouteMap();
        if (outboundRouteMapName != null) {
            int outboundRouteMapLine = lpg.getOutboundRouteMapLine();
            RouteMap outboundRouteMap = _routeMaps.get(outboundRouteMapName);
            if (outboundRouteMap == null) {
                undefined(CiscoStructureType.ROUTE_MAP, outboundRouteMapName, CiscoStructureUsage.BGP_OUTBOUND_ROUTE_MAP, outboundRouteMapLine);
            } else {
                outboundRouteMap.getReferers().put(lpg, "outbound route-map for leaf peer-group: " + lpg.getName());
                peerExportConditions.getConjuncts().add(new CallExpr(outboundRouteMapName));
            }
        }
        String outboundRoute6MapName = lpg.getOutboundRoute6Map();
        if (outboundRoute6MapName != null) {
            int outboundRoute6MapLine = lpg.getOutboundRoute6MapLine();
            RouteMap outboundRoute6Map = _routeMaps.get(outboundRoute6MapName);
            if (outboundRoute6Map == null) {
                undefined(CiscoStructureType.ROUTE_MAP, outboundRoute6MapName, CiscoStructureUsage.BGP_OUTBOUND_ROUTE6_MAP, outboundRoute6MapLine);
            } else {
                outboundRoute6Map.getReferers().put(lpg, "outbound ipv6 route-map for leaf peer-group: " + lpg.getName());
            }
        }
        // set up default export policy for this peer group
        GeneratedRoute.Builder defaultRoute = null;
        GeneratedRoute6.Builder defaultRoute6 = null;
        if (lpg.getDefaultOriginate()) {
            if (ipv4) {
                localOrCommonOrigination.getDisjuncts().add(matchDefaultRoute);
            } else {
                localOrCommonOrigination.getDisjuncts().add(matchDefaultRoute6);
            }
            defaultRoute = new GeneratedRoute.Builder();
            defaultRoute.setNetwork(Prefix.ZERO);
            defaultRoute.setAdmin(MAX_ADMINISTRATIVE_COST);
            defaultRoute6 = new GeneratedRoute6.Builder();
            defaultRoute6.setNetwork(Prefix6.ZERO);
            defaultRoute6.setAdmin(MAX_ADMINISTRATIVE_COST);
            String defaultOriginateMapName = lpg.getDefaultOriginateMap();
            if (defaultOriginateMapName != null) {
                // originate contingent on
                // generation policy
                int defaultOriginateMapLine = lpg.getDefaultOriginateMapLine();
                RoutingPolicy defaultRouteGenerationPolicy = c.getRoutingPolicies().get(defaultOriginateMapName);
                if (defaultRouteGenerationPolicy == null) {
                    undefined(CiscoStructureType.ROUTE_MAP, defaultOriginateMapName, CiscoStructureUsage.BGP_DEFAULT_ORIGINATE_ROUTE_MAP, defaultOriginateMapLine);
                } else {
                    RouteMap defaultRouteGenerationRouteMap = _routeMaps.get(defaultOriginateMapName);
                    defaultRouteGenerationRouteMap.getReferers().put(lpg, "default route generation policy for leaf peer-group: " + lpg.getName());
                    defaultRoute.setGenerationPolicy(defaultOriginateMapName);
                }
            } else {
                String defaultRouteGenerationPolicyName = "~BGP_DEFAULT_ROUTE_GENERATION_POLICY:" + vrfName + ":" + lpg.getName() + "~";
                RoutingPolicy defaultRouteGenerationPolicy = new RoutingPolicy(defaultRouteGenerationPolicyName, c);
                If defaultRouteGenerationConditional = new If();
                defaultRouteGenerationPolicy.getStatements().add(defaultRouteGenerationConditional);
                if (ipv4) {
                    defaultRouteGenerationConditional.setGuard(matchDefaultRoute);
                } else {
                    defaultRouteGenerationConditional.setGuard(matchDefaultRoute6);
                }
                defaultRouteGenerationConditional.getTrueStatements().add(Statements.ReturnTrue.toStaticStatement());
                if (lpg.getActive() && !lpg.getShutdown()) {
                    c.getRoutingPolicies().put(defaultRouteGenerationPolicyName, defaultRouteGenerationPolicy);
                }
                if (ipv4) {
                    defaultRoute.setGenerationPolicy(defaultRouteGenerationPolicyName);
                } else {
                    defaultRoute6.setGenerationPolicy(defaultRouteGenerationPolicyName);
                }
            }
        }
        Ip clusterId = lpg.getClusterId();
        if (clusterId == null) {
            clusterId = bgpRouterId;
        }
        boolean routeReflectorClient = lpg.getRouteReflectorClient();
        boolean sendCommunity = lpg.getSendCommunity();
        boolean additionalPathsReceive = lpg.getAdditionalPathsReceive();
        boolean additionalPathsSelectAll = lpg.getAdditionalPathsSelectAll();
        boolean additionalPathsSend = lpg.getAdditionalPathsSend();
        boolean advertiseInactive = lpg.getAdvertiseInactive();
        boolean ebgpMultihop = lpg.getEbgpMultihop();
        boolean allowasIn = lpg.getAllowAsIn();
        boolean disablePeerAsCheck = lpg.getDisablePeerAsCheck();
        String inboundPrefixListName = lpg.getInboundPrefixList();
        if (inboundPrefixListName != null) {
            int inboundPrefixListLine = lpg.getInboundPrefixListLine();
            ReferenceCountedStructure inboundPrefixList;
            if (ipv4) {
                inboundPrefixList = _prefixLists.get(inboundPrefixListName);
            } else {
                inboundPrefixList = _prefix6Lists.get(inboundPrefixListName);
            }
            if (inboundPrefixList != null) {
                inboundPrefixList.getReferers().put(lpg, "inbound prefix-list for neighbor: '" + lpg.getName() + "'");
            } else {
                if (ipv4) {
                    undefined(CiscoStructureType.PREFIX_LIST, inboundPrefixListName, CiscoStructureUsage.BGP_INBOUND_PREFIX_LIST, inboundPrefixListLine);
                } else {
                    undefined(CiscoStructureType.PREFIX6_LIST, inboundPrefixListName, CiscoStructureUsage.BGP_INBOUND_PREFIX6_LIST, inboundPrefixListLine);
                }
            }
        }
        String outboundPrefixListName = lpg.getOutboundPrefixList();
        if (outboundPrefixListName != null) {
            int outboundPrefixListLine = lpg.getOutboundPrefixListLine();
            ReferenceCountedStructure outboundPrefixList;
            if (ipv4) {
                outboundPrefixList = _prefixLists.get(outboundPrefixListName);
            } else {
                outboundPrefixList = _prefix6Lists.get(outboundPrefixListName);
            }
            if (outboundPrefixList != null) {
                outboundPrefixList.getReferers().put(lpg, "outbound prefix-list for neighbor: '" + lpg.getName() + "'");
            } else {
                if (ipv4) {
                    undefined(CiscoStructureType.PREFIX_LIST, outboundPrefixListName, CiscoStructureUsage.BGP_OUTBOUND_PREFIX_LIST, outboundPrefixListLine);
                } else {
                    undefined(CiscoStructureType.PREFIX6_LIST, outboundPrefixListName, CiscoStructureUsage.BGP_OUTBOUND_PREFIX6_LIST, outboundPrefixListLine);
                }
            }
        }
        String description = lpg.getDescription();
        if (lpg.getActive() && !lpg.getShutdown()) {
            if (lpg.getRemoteAs() == null) {
                _w.redFlag("No remote-as set for peer: " + lpg.getName());
                continue;
            }
            Integer pgLocalAs = lpg.getLocalAs();
            int localAs = pgLocalAs != null ? pgLocalAs : proc.getName();
            BgpNeighbor newNeighbor;
            if (lpg instanceof IpBgpPeerGroup) {
                IpBgpPeerGroup ipg = (IpBgpPeerGroup) lpg;
                Ip neighborAddress = ipg.getIp();
                newNeighbor = new BgpNeighbor(neighborAddress, c);
            } else if (lpg instanceof DynamicIpBgpPeerGroup) {
                DynamicIpBgpPeerGroup dpg = (DynamicIpBgpPeerGroup) lpg;
                Prefix neighborAddressRange = dpg.getPrefix();
                newNeighbor = new BgpNeighbor(neighborAddressRange, c);
            } else if (lpg instanceof Ipv6BgpPeerGroup || lpg instanceof DynamicIpv6BgpPeerGroup) {
                // TODO: implement ipv6 bgp neighbors
                continue;
            } else {
                throw new VendorConversionException("Invalid BGP leaf neighbor type");
            }
            newBgpNeighbors.put(newNeighbor.getPrefix(), newNeighbor);
            newNeighbor.setAdditionalPathsReceive(additionalPathsReceive);
            newNeighbor.setAdditionalPathsSelectAll(additionalPathsSelectAll);
            newNeighbor.setAdditionalPathsSend(additionalPathsSend);
            newNeighbor.setAdvertiseInactive(advertiseInactive);
            newNeighbor.setAllowLocalAsIn(allowasIn);
            newNeighbor.setAllowRemoteAsOut(disablePeerAsCheck);
            newNeighbor.setRouteReflectorClient(routeReflectorClient);
            newNeighbor.setClusterId(clusterId.asLong());
            newNeighbor.setDefaultMetric(defaultMetric);
            newNeighbor.setDescription(description);
            newNeighbor.setEbgpMultihop(ebgpMultihop);
            if (defaultRoute != null) {
                newNeighbor.getGeneratedRoutes().add(defaultRoute.build());
            }
            newNeighbor.setGroup(lpg.getGroupName());
            if (importPolicy != null) {
                newNeighbor.setImportPolicy(inboundRouteMapName);
            }
            newNeighbor.setLocalAs(localAs);
            newNeighbor.setLocalIp(updateSource);
            newNeighbor.setExportPolicy(peerExportPolicyName);
            newNeighbor.setRemoteAs(lpg.getRemoteAs());
            newNeighbor.setSendCommunity(sendCommunity);
            newNeighbor.setVrf(vrfName);
        }
    }
    return newBgpProcess;
}
Also used : MatchPrefix6Set(org.batfish.datamodel.routing_policy.expr.MatchPrefix6Set) LinkedHashSet(java.util.LinkedHashSet) NamedPrefixSet(org.batfish.datamodel.routing_policy.expr.NamedPrefixSet) ExplicitPrefix6Set(org.batfish.datamodel.routing_policy.expr.ExplicitPrefix6Set) ArrayList(java.util.ArrayList) DestinationNetwork6(org.batfish.datamodel.routing_policy.expr.DestinationNetwork6) CallExpr(org.batfish.datamodel.routing_policy.expr.CallExpr) SetNextHop(org.batfish.datamodel.routing_policy.statement.SetNextHop) BooleanExpr(org.batfish.datamodel.routing_policy.expr.BooleanExpr) LinkedHashSet(java.util.LinkedHashSet) HashSet(java.util.HashSet) PrefixSpace(org.batfish.datamodel.PrefixSpace) GeneratedRoute6(org.batfish.datamodel.GeneratedRoute6) MatchProtocol(org.batfish.datamodel.routing_policy.expr.MatchProtocol) VendorConversionException(org.batfish.common.VendorConversionException) Route6FilterLine(org.batfish.datamodel.Route6FilterLine) Disjunction(org.batfish.datamodel.routing_policy.expr.Disjunction) Not(org.batfish.datamodel.routing_policy.expr.Not) ExplicitPrefixSet(org.batfish.datamodel.routing_policy.expr.ExplicitPrefixSet) BgpTieBreaker(org.batfish.datamodel.BgpTieBreaker) GeneratedRoute(org.batfish.datamodel.GeneratedRoute) If(org.batfish.datamodel.routing_policy.statement.If) Ip(org.batfish.datamodel.Ip) Prefix(org.batfish.datamodel.Prefix) SelfNextHop(org.batfish.datamodel.routing_policy.expr.SelfNextHop) MultipathEquivalentAsPathMatchMode(org.batfish.datamodel.MultipathEquivalentAsPathMatchMode) BgpNeighbor(org.batfish.datamodel.BgpNeighbor) Conjunction(org.batfish.datamodel.routing_policy.expr.Conjunction) ReferenceCountedStructure(org.batfish.common.util.ReferenceCountedStructure) SubRange(org.batfish.datamodel.SubRange) RouteFilterLine(org.batfish.datamodel.RouteFilterLine) PrefixRange(org.batfish.datamodel.PrefixRange) CallStatement(org.batfish.datamodel.routing_policy.statement.CallStatement) Statement(org.batfish.datamodel.routing_policy.statement.Statement) MatchPrefixSet(org.batfish.datamodel.routing_policy.expr.MatchPrefixSet) RoutingPolicy(org.batfish.datamodel.routing_policy.RoutingPolicy) Route6FilterList(org.batfish.datamodel.Route6FilterList) Prefix6Space(org.batfish.datamodel.Prefix6Space) Prefix6Range(org.batfish.datamodel.Prefix6Range) BigInteger(java.math.BigInteger) DestinationNetwork(org.batfish.datamodel.routing_policy.expr.DestinationNetwork) RouteFilterList(org.batfish.datamodel.RouteFilterList) Prefix6(org.batfish.datamodel.Prefix6)

Example 5 with PrefixSpace

use of org.batfish.datamodel.PrefixSpace in project batfish by batfish.

the class OspfTest method getExportPolicyStatements.

private static List<Statement> getExportPolicyStatements(InterfaceAddress address) {
    long externalOspfMetric = 20L;
    If exportIfMatchL2Prefix = new If();
    exportIfMatchL2Prefix.setGuard(new MatchPrefixSet(new DestinationNetwork(), new ExplicitPrefixSet(new PrefixSpace(ImmutableSet.of(PrefixRange.fromPrefix(address.getPrefix()))))));
    exportIfMatchL2Prefix.setTrueStatements(ImmutableList.of(new SetOspfMetricType(OspfMetricType.E1), new SetMetric(new LiteralLong(externalOspfMetric)), Statements.ExitAccept.toStaticStatement()));
    exportIfMatchL2Prefix.setFalseStatements(ImmutableList.of(Statements.ExitReject.toStaticStatement()));
    return ImmutableList.of(exportIfMatchL2Prefix);
}
Also used : DestinationNetwork(org.batfish.datamodel.routing_policy.expr.DestinationNetwork) ExplicitPrefixSet(org.batfish.datamodel.routing_policy.expr.ExplicitPrefixSet) SetMetric(org.batfish.datamodel.routing_policy.statement.SetMetric) MatchPrefixSet(org.batfish.datamodel.routing_policy.expr.MatchPrefixSet) PrefixSpace(org.batfish.datamodel.PrefixSpace) SetOspfMetricType(org.batfish.datamodel.routing_policy.statement.SetOspfMetricType) LiteralLong(org.batfish.datamodel.routing_policy.expr.LiteralLong) If(org.batfish.datamodel.routing_policy.statement.If)

Aggregations

PrefixSpace (org.batfish.datamodel.PrefixSpace)5 Prefix (org.batfish.datamodel.Prefix)4 PrefixRange (org.batfish.datamodel.PrefixRange)4 SubRange (org.batfish.datamodel.SubRange)4 DestinationNetwork (org.batfish.datamodel.routing_policy.expr.DestinationNetwork)4 ExplicitPrefixSet (org.batfish.datamodel.routing_policy.expr.ExplicitPrefixSet)4 MatchPrefixSet (org.batfish.datamodel.routing_policy.expr.MatchPrefixSet)4 If (org.batfish.datamodel.routing_policy.statement.If)4 GeneratedRoute (org.batfish.datamodel.GeneratedRoute)3 RoutingPolicy (org.batfish.datamodel.routing_policy.RoutingPolicy)3 CallExpr (org.batfish.datamodel.routing_policy.expr.CallExpr)3 Conjunction (org.batfish.datamodel.routing_policy.expr.Conjunction)3 LiteralLong (org.batfish.datamodel.routing_policy.expr.LiteralLong)3 MatchProtocol (org.batfish.datamodel.routing_policy.expr.MatchProtocol)3 Not (org.batfish.datamodel.routing_policy.expr.Not)3 CallStatement (org.batfish.datamodel.routing_policy.statement.CallStatement)3 SetMetric (org.batfish.datamodel.routing_policy.statement.SetMetric)3 Statement (org.batfish.datamodel.routing_policy.statement.Statement)3 ArrayList (java.util.ArrayList)2 InterfaceAddress (org.batfish.datamodel.InterfaceAddress)2