use of org.batfish.datamodel.Prefix in project batfish by batfish.
the class JuniperConfiguration method toAggregateRoute.
private org.batfish.datamodel.GeneratedRoute toAggregateRoute(AggregateRoute route) {
Prefix prefix = route.getPrefix();
int prefixLength = prefix.getPrefixLength();
int administrativeCost = route.getMetric();
String policyNameSuffix = route.getPrefix().toString().replace('/', '_').replace('.', '_');
String policyName = "~AGGREGATE_" + policyNameSuffix + "~";
RoutingPolicy routingPolicy = new RoutingPolicy(policyName, _c);
If routingPolicyConditional = new If();
routingPolicy.getStatements().add(routingPolicyConditional);
routingPolicyConditional.getTrueStatements().add(Statements.ExitAccept.toStaticStatement());
routingPolicyConditional.getFalseStatements().add(Statements.ExitReject.toStaticStatement());
String rflName = "~AGGREGATE_" + policyNameSuffix + "_RF~";
MatchPrefixSet isContributingRoute = new MatchPrefixSet(new DestinationNetwork(), new NamedPrefixSet(rflName));
routingPolicyConditional.setGuard(isContributingRoute);
RouteFilterList rfList = new RouteFilterList(rflName);
rfList.addLine(new org.batfish.datamodel.RouteFilterLine(LineAction.ACCEPT, prefix, new SubRange(prefixLength + 1, Prefix.MAX_PREFIX_LENGTH)));
org.batfish.datamodel.GeneratedRoute.Builder newRoute = new org.batfish.datamodel.GeneratedRoute.Builder();
newRoute.setNetwork(prefix);
newRoute.setAdmin(administrativeCost);
newRoute.setDiscard(true);
newRoute.setGenerationPolicy(policyName);
_c.getRoutingPolicies().put(policyName, routingPolicy);
_c.getRouteFilterLists().put(rflName, rfList);
return newRoute.build();
}
use of org.batfish.datamodel.Prefix in project batfish by batfish.
the class JuniperConfiguration method toGeneratedRoute.
private org.batfish.datamodel.GeneratedRoute toGeneratedRoute(GeneratedRoute route) {
Prefix prefix = route.getPrefix();
Integer administrativeCost = route.getPreference();
if (administrativeCost == null) {
administrativeCost = DEFAULT_AGGREGATE_ROUTE_PREFERENCE;
}
Integer metric = route.getMetric();
if (metric == null) {
metric = DEFAULT_AGGREGATE_ROUTE_COST;
}
String generationPolicyName = null;
if (!route.getPolicies().isEmpty()) {
generationPolicyName = "~GENERATED_ROUTE_POLICY:" + prefix + "~";
RoutingPolicy generationPolicy = new RoutingPolicy(generationPolicyName, _c);
_c.getRoutingPolicies().put(generationPolicyName, generationPolicy);
If generationPolicyConditional = new If();
Disjunction matchSomeGenerationPolicy = new Disjunction();
generationPolicyConditional.setGuard(matchSomeGenerationPolicy);
generationPolicyConditional.getTrueStatements().add(Statements.ExitAccept.toStaticStatement());
generationPolicyConditional.getFalseStatements().add(Statements.ExitReject.toStaticStatement());
generationPolicy.getStatements().add(generationPolicyConditional);
route.getPolicies().forEach((policyName, policyLine) -> {
PolicyStatement policy = _policyStatements.get(policyName);
if (policy == null) {
undefined(JuniperStructureType.POLICY_STATEMENT, policyName, JuniperStructureUsage.GENERATED_ROUTE_POLICY, policyLine);
} else {
setPolicyStatementReferent(policyName, route.getPolicies(), "Generated route policy for prefix: " + route.getPrefix());
CallExpr callPolicy = new CallExpr(policyName);
matchSomeGenerationPolicy.getDisjuncts().add(callPolicy);
}
});
}
org.batfish.datamodel.GeneratedRoute.Builder newRoute = new org.batfish.datamodel.GeneratedRoute.Builder();
newRoute.setNetwork(prefix);
newRoute.setAdmin(administrativeCost);
newRoute.setMetric(metric);
newRoute.setGenerationPolicy(generationPolicyName);
return newRoute.build();
}
use of org.batfish.datamodel.Prefix in project batfish by batfish.
the class PsFromPrefixListFilterLonger method toBooleanExpr.
@Override
public BooleanExpr toBooleanExpr(JuniperConfiguration jc, Configuration c, Warnings warnings) {
PrefixList pl = jc.getPrefixLists().get(_prefixList);
if (pl != null) {
pl.getReferers().put(this, "from prefix-list-filter longer");
if (pl.getIpv6()) {
return BooleanExprs.False.toStaticBooleanExpr();
}
RouteFilterList rf = c.getRouteFilterLists().get(_prefixList);
String longerListName = "~" + _prefixList + "~LONGER~";
RouteFilterList longerList = c.getRouteFilterLists().get(longerListName);
if (longerList == null) {
longerList = new RouteFilterList(longerListName);
for (RouteFilterLine line : rf.getLines()) {
Prefix prefix = line.getPrefix();
LineAction action = line.getAction();
SubRange longerLineRange = new SubRange(line.getLengthRange().getStart() + 1, Prefix.MAX_PREFIX_LENGTH);
if (longerLineRange.getStart() > Prefix.MAX_PREFIX_LENGTH) {
warnings.redFlag("'prefix-list-filter " + _prefixList + " longer' cannot match more specific prefix than " + prefix);
continue;
}
RouteFilterLine orLongerLine = new RouteFilterLine(action, prefix, longerLineRange);
longerList.addLine(orLongerLine);
c.getRouteFilterLists().put(longerListName, longerList);
}
}
return new MatchPrefixSet(new DestinationNetwork(), new NamedPrefixSet(longerListName));
} else {
warnings.redFlag("Reference to undefined prefix-list: \"" + _prefixList + "\"");
return BooleanExprs.False.toStaticBooleanExpr();
}
}
use of org.batfish.datamodel.Prefix in project batfish by batfish.
the class PsFromPrefixListFilterOrLonger method toBooleanExpr.
@Override
public BooleanExpr toBooleanExpr(JuniperConfiguration jc, Configuration c, Warnings warnings) {
PrefixList pl = jc.getPrefixLists().get(_prefixList);
if (pl != null) {
pl.getReferers().put(this, "from prefix-list-filter or-longer");
if (pl.getIpv6()) {
return BooleanExprs.False.toStaticBooleanExpr();
}
RouteFilterList rf = c.getRouteFilterLists().get(_prefixList);
String orLongerListName = "~" + _prefixList + "~ORLONGER~";
RouteFilterList orLongerList = c.getRouteFilterLists().get(orLongerListName);
if (orLongerList == null) {
orLongerList = new RouteFilterList(orLongerListName);
for (RouteFilterLine line : rf.getLines()) {
Prefix prefix = line.getPrefix();
LineAction action = line.getAction();
SubRange orLongerLineRange = new SubRange(line.getLengthRange().getStart(), Prefix.MAX_PREFIX_LENGTH);
RouteFilterLine orLongerLine = new RouteFilterLine(action, prefix, orLongerLineRange);
orLongerList.addLine(orLongerLine);
c.getRouteFilterLists().put(orLongerListName, orLongerList);
}
}
return new MatchPrefixSet(new DestinationNetwork(), new NamedPrefixSet(orLongerListName));
} else {
warnings.redFlag("Reference to undefined prefix-list: \"" + _prefixList + "\"");
return BooleanExprs.False.toStaticBooleanExpr();
}
}
use of org.batfish.datamodel.Prefix in project batfish by batfish.
the class Route4FilterLineThrough method applyTo.
@Override
public void applyTo(RouteFilterList rfl) {
int low = _prefix.getPrefixLength();
int high = _throughPrefix.getPrefixLength();
for (int i = low; i <= high; i++) {
Ip currentNetworkAddress = _throughPrefix.getStartIp().getNetworkAddress(i);
Prefix currentPrefix = new Prefix(currentNetworkAddress, i);
org.batfish.datamodel.RouteFilterLine line = new org.batfish.datamodel.RouteFilterLine(LineAction.ACCEPT, currentPrefix, new SubRange(i, i));
rfl.addLine(line);
}
}
Aggregations