Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IOS:Advertise ConnectedRoute when redistributing between different EIGRP #8590

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.batfish.common.Warnings;
import org.batfish.datamodel.bgp.AddressFamily;
import org.batfish.datamodel.bgp.BgpAggregate;
import org.batfish.datamodel.eigrp.EigrpInterfaceSettings;
import org.batfish.datamodel.ospf.OspfProcess;
import org.batfish.datamodel.packet_policy.PacketPolicy;
import org.batfish.datamodel.routing_policy.RoutingPolicy;
Expand Down Expand Up @@ -237,6 +238,8 @@ public Builder setDefaultInboundAction(LineAction defaultInboundAction) {

private String _domainName;

private Map<String, EigrpInterfaceSettings> _generatedEigrpInterfaceSettings;

/**
* Whether the BGP export pipeline should start with main RIB routes (Juniper-like behavior) or
* BGP RIB routes (Cisco-like behavior).
Expand Down Expand Up @@ -345,6 +348,7 @@ public Configuration(@Nonnull String hostname, @Nonnull ConfigurationFormat conf
_disconnectAdminDownInterfaces = true;
_dnsServers = new TreeSet<>();
_domainName = null;
_generatedEigrpInterfaceSettings = new TreeMap<>();
_generatedReferenceBooks = new TreeMap<>();
_ikePhase1keys = ImmutableSortedMap.of();
_ikePhase1Policies = new TreeMap<>();
Expand Down Expand Up @@ -576,6 +580,11 @@ public void setGenerateBgpAggregatesFromMainRib(boolean generateBgpAggregatesFro
_generateBgpAggregatesFromMainRib = generateBgpAggregatesFromMainRib;
}

@JsonIgnore
public Map<String, EigrpInterfaceSettings> getGeneratedEigrpInterfaceSettings() {
return _generatedEigrpInterfaceSettings;
}

/** Dictionary of Reference Books generated from device configurations (e.g., F5 Pools). */
@JsonProperty(PROP_GENERATED_REFERENCE_BOOKS)
public Map<String, ReferenceBook> getGeneratedReferenceBooks() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Objects;
import org.batfish.datamodel.Configuration;
import org.batfish.datamodel.ConnectedRoute;
import org.batfish.datamodel.EigrpRoute;
import org.batfish.datamodel.routing_policy.Environment;
import org.batfish.datamodel.routing_policy.Result;
Expand All @@ -29,11 +31,29 @@

@Override
public Result evaluate(Environment environment) {
if (!(environment.getOriginalRoute() instanceof EigrpRoute)) {
return new Result(false);
if (environment.getOriginalRoute() instanceof EigrpRoute) {
EigrpRoute route = (EigrpRoute) environment.getOriginalRoute();
return new Result(route.getProcessAsn() == _asn);
} else if (environment.getOriginalRoute() instanceof ConnectedRoute) {
if (!environment
.getRoutingPolicies()
.containsKey(environment.getEigrpProcess().getRedistributionPolicy())) {
return new Result(false);

Check warning on line 41 in projects/batfish-common-protocol/src/main/java/org/batfish/datamodel/routing_policy/expr/MatchProcessAsn.java

View check run for this annotation

Codecov / codecov/patch

projects/batfish-common-protocol/src/main/java/org/batfish/datamodel/routing_policy/expr/MatchProcessAsn.java#L41

Added line #L41 was not covered by tests
}
Configuration c =
environment
.getRoutingPolicies()
.get(environment.getEigrpProcess().getRedistributionPolicy())
.getOwner();
String nextHopInterface = environment.getOriginalRoute().getNextHopInterface();
if (!c.getGeneratedEigrpInterfaceSettings().containsKey(nextHopInterface)) {
return new Result(false);
}
return new Result(
c.getGeneratedEigrpInterfaceSettings().get(nextHopInterface).getAsn() == _asn);
}
EigrpRoute route = (EigrpRoute) environment.getOriginalRoute();
return new Result(route.getProcessAsn() == _asn);

return new Result(false);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.batfish.datamodel.AnnotatedRoute;
import org.batfish.datamodel.ConcreteInterfaceAddress;
import org.batfish.datamodel.Configuration;
import org.batfish.datamodel.ConnectedRoute;
import org.batfish.datamodel.EigrpExternalRoute;
import org.batfish.datamodel.EigrpInternalRoute;
import org.batfish.datamodel.EigrpRoute;
Expand Down Expand Up @@ -569,6 +570,13 @@ private EigrpExternalRoute computeEigrpExportRoute(
// Set the metric to match the route metric by default for EIGRP into EIGRP
if (unannotatedPotentialRoute instanceof EigrpRoute) {
outputRouteBuilder.setEigrpMetric(((EigrpRoute) unannotatedPotentialRoute).getEigrpMetric());
} else if (unannotatedPotentialRoute instanceof ConnectedRoute) {
Configuration c = exportPolicy.getOwner();
String nextHopInterface = unannotatedPotentialRoute.getNextHopInterface();
if (c.getGeneratedEigrpInterfaceSettings().containsKey(nextHopInterface)) {
outputRouteBuilder.setEigrpMetric(
c.getGeneratedEigrpInterfaceSettings().get(nextHopInterface).getMetric());
}
}

if (!exportPolicy.process(potentialExportRoute, outputRouteBuilder, _process, Direction.OUT)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -757,9 +757,18 @@ private static Stream<ConnectedRoute> generateConnectedRoutes(@Nonnull Interface
return iface.getAllConcreteAddresses().stream()
.filter(addr -> shouldGenerateConnectedRoute(iface.getAddressMetadata().get(addr)))
.map(
addr ->
generateConnectedRoute(
addr, iface.getName(), iface.getAddressMetadata().get(addr)));
addr -> {
ConnectedRoute route =
generateConnectedRoute(
addr, iface.getName(), iface.getAddressMetadata().get(addr));
if (iface.getEigrp() != null && iface.getEigrp().getEnabled()) {
iface
.getOwner()
.getGeneratedEigrpInterfaceSettings()
.put(route.getNextHopInterface(), iface.getEigrp());
}
return route;
});
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1272,7 +1272,9 @@ private static If convertEigrpRedistributionPolicy(
Conjunction eigrpExportConditions = new Conjunction();
BooleanExpr matchExpr;
if (protocol == RoutingProtocol.EIGRP) {
matchExpr = new MatchProtocol(RoutingProtocol.EIGRP, RoutingProtocol.EIGRP_EX);
matchExpr =
new MatchProtocol(
RoutingProtocol.EIGRP, RoutingProtocol.EIGRP_EX, RoutingProtocol.CONNECTED);

Long otherAsn = Long.parseLong(policy.getInstance().getTag());
if (otherAsn == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@
import org.batfish.datamodel.VrfLeakConfig;
import org.batfish.datamodel.bgp.BgpTopology;
import org.batfish.datamodel.eigrp.ClassicMetric;
import org.batfish.datamodel.eigrp.EigrpInterfaceSettings;
import org.batfish.datamodel.eigrp.EigrpMetric;
import org.batfish.datamodel.eigrp.EigrpMetricValues;
import org.batfish.datamodel.eigrp.EigrpMetricVersion;
import org.batfish.datamodel.eigrp.EigrpTopology;
Expand Down Expand Up @@ -121,6 +123,23 @@ private static void addInterfaces(
ib.setName(ifaceName).setAddress(address).setBandwidth(100d).build());
}

private static void addEigrp(Configuration c) {
EigrpMetric metric =
WideMetric.builder()
.setValues(EigrpMetricValues.builder().setBandwidth(1d).setDelay(1d).build())
.build();
EigrpInterfaceSettings eigrpInterfaceSettings =
EigrpInterfaceSettings.builder()
.setAsn(1L)
.setEnabled(true)
.setMetric(metric)
.setExportPolicy("ep")
.build();

c.getActiveInterfaces().values().stream()
.forEach(iface -> iface.setEigrp(eigrpInterfaceSettings));
}

private static VirtualRouter makeF5VirtualRouter(String hostname) {
Node n = TestUtils.makeF5Router(hostname);
return n.getVirtualRouterOrThrow(DEFAULT_VRF_NAME);
Expand Down Expand Up @@ -1007,6 +1026,36 @@ public void testComputeIterationHashCode_mainRibChange() {
assertNotEquals(vrInitialHashcode, vr.computeIterationHashCode());
}

@Test
public void testInitConnectedRibForIosEigrp() {
EigrpMetric metric =
WideMetric.builder()
.setValues(EigrpMetricValues.builder().setBandwidth(1d).setDelay(1d).build())
.build();
EigrpInterfaceSettings eigrpInterfaceSettings =
EigrpInterfaceSettings.builder()
.setAsn(1L)
.setEnabled(true)
.setMetric(metric)
.setExportPolicy("ep")
.build();

VirtualRouter vr = makeIosVirtualRouter(null);
addInterfaces(vr.getConfiguration(), exampleInterfaceAddresses);
vr.getConfiguration().getActiveInterfaces().values().stream()
.forEach(iface -> iface.setEigrp(eigrpInterfaceSettings));
vr.initRibs();

// Test
vr.initConnectedRib();

Map<String, EigrpInterfaceSettings> eis =
vr.getConfiguration().getGeneratedEigrpInterfaceSettings();
System.out.println(eis);
exampleInterfaceAddresses.keySet().stream()
.forEach(ifaceName -> assertThat(eis.get(ifaceName), equalTo(eigrpInterfaceSettings)));
}

private static class TestIpOwners extends IpOwnersBaseImpl {
protected TestIpOwners(Map<String, Configuration> configurations) {
super(
Expand Down
1 change: 1 addition & 0 deletions tests/parsing-tests/unit-tests-vimodel.ref
Original file line number Diff line number Diff line change
Expand Up @@ -46168,6 +46168,7 @@
{
"class" : "org.batfish.datamodel.routing_policy.expr.MatchProtocol",
"protocols" : [
"connected",
"eigrp",
"eigrpEX"
]
Expand Down