@Override public IpSpace visitInterfaceLinkLocation(InterfaceLinkLocation interfaceLinkLocation) { String node = interfaceLinkLocation.getNodeName(); String iface = interfaceLinkLocation.getInterfaceName(); @Nullable IpSpace linkIpSpace = AclIpSpace.union( interfaceAddresses(node, iface).stream() /* * Only include addresses on networks that might have hosts. */ .filter(address -> address.getNetworkBits() <= HOST_SUBNET_MAX_PREFIX_LENGTH) .map(address -> address.getPrefix().toHostIpSpace()) .collect(Collectors.toList())); return linkIpSpace == null ? EmptyIpSpace.INSTANCE : AclIpSpace.difference(linkIpSpace, _specifierContext.getSnapshotDeviceOwnedIps()); }
@Test public void testHasMissingDevicesOnInterface_full32() { Prefix subnet = Prefix.parse("1.0.0.0/32"); Ip ip1 = Ip.parse("1.0.0.0"); _interfaceHostSubnetIps = ImmutableMap.of( CONFIG1, ImmutableMap.of(VRF1, ImmutableMap.of(INTERFACE1, subnet.toHostIpSpace()))); _interfaceOwnedIps = ImmutableMap.of(CONFIG1, ImmutableMap.of(INTERFACE1, ImmutableSet.of(ip1))); ForwardingAnalysisImpl fa = initForwardingAnalysisImpl(); assertThat("INTERFACE1 should be full", !fa.hasMissingDevicesOnInterface(CONFIG1, INTERFACE1)); }
@Test public void testHasMissingDevicesOnInterface_notFull31() { Prefix subnet = Prefix.parse("1.0.0.0/31"); Ip ip1 = Ip.parse("1.0.0.0"); _interfaceHostSubnetIps = ImmutableMap.of( CONFIG1, ImmutableMap.of(VRF1, ImmutableMap.of(INTERFACE1, subnet.toHostIpSpace()))); _interfaceOwnedIps = ImmutableMap.of(CONFIG1, ImmutableMap.of(INTERFACE1, ImmutableSet.of(ip1))); ForwardingAnalysisImpl fa = initForwardingAnalysisImpl(); assertThat( "INTERFACE1 should not be full", fa.hasMissingDevicesOnInterface(CONFIG1, INTERFACE1)); } }
@Test public void testHasMissingDevicesOnInterface_notFull30() { Prefix subnet = Prefix.parse("1.0.0.0/30"); Ip ip1 = Ip.parse("1.0.0.1"); _interfaceHostSubnetIps = ImmutableMap.of( CONFIG1, ImmutableMap.of(VRF1, ImmutableMap.of(INTERFACE1, subnet.toHostIpSpace()))); _interfaceOwnedIps = ImmutableMap.of(CONFIG1, ImmutableMap.of(INTERFACE1, ImmutableSet.of(ip1))); ForwardingAnalysisImpl fa = initForwardingAnalysisImpl(); assertThat( "INTERFACE1 should not be full", fa.hasMissingDevicesOnInterface(CONFIG1, INTERFACE1)); }
@Test public void testHasMissingDevicesOnInterface_full30() { Prefix subnet = Prefix.parse("1.0.0.0/30"); Ip ip1 = Ip.parse("1.0.0.1"); Ip ip2 = Ip.parse("1.0.0.2"); _interfaceHostSubnetIps = ImmutableMap.of( CONFIG1, ImmutableMap.of(VRF1, ImmutableMap.of(INTERFACE1, subnet.toHostIpSpace()))); _interfaceOwnedIps = ImmutableMap.of( CONFIG1, ImmutableMap.of(INTERFACE1, ImmutableSet.of(ip1), INTERFACE2, ImmutableSet.of(ip2))); ForwardingAnalysisImpl fa = initForwardingAnalysisImpl(); assertThat("INTERFACE1 should be full", !fa.hasMissingDevicesOnInterface(CONFIG1, INTERFACE1)); }
@Test public void testHasMissingDevicesOnInterface_full31() { Prefix subnet = Prefix.parse("1.0.0.0/31"); Ip ip1 = Ip.parse("1.0.0.0"); Ip ip2 = Ip.parse("1.0.0.1"); _interfaceHostSubnetIps = ImmutableMap.of( CONFIG1, ImmutableMap.of(VRF1, ImmutableMap.of(INTERFACE1, subnet.toHostIpSpace()))); _interfaceOwnedIps = ImmutableMap.of( CONFIG1, ImmutableMap.of(INTERFACE1, ImmutableSet.of(ip1), INTERFACE2, ImmutableSet.of(ip2))); ForwardingAnalysisImpl fa = initForwardingAnalysisImpl(); assertThat("INTERFACE1 should be full", !fa.hasMissingDevicesOnInterface(CONFIG1, INTERFACE1)); }
@Test public void testToHostIpSpace() { BDDInteger ipAddrBdd = BDDInteger.makeFromIndex(BDDUtils.bddFactory(32), 32, 0, true); IpSpaceToBDD toBDD = new IpSpaceToBDD(ipAddrBdd); assertThat( "/32 host space is preserved", toBDD.visit(Prefix.parse("1.2.3.4/32").toHostIpSpace()), equalTo(toBDD.visit(Prefix.parse("1.2.3.4/32").toIpSpace()))); assertThat( "/31 host space is preserved", toBDD.visit(Prefix.parse("1.2.3.4/31").toHostIpSpace()), equalTo(toBDD.visit(Prefix.parse("1.2.3.4/31").toIpSpace()))); BDD slash30Filtered = toBDD .visit(Ip.parse("1.2.3.5").toIpSpace()) .or(toBDD.visit(Ip.parse("1.2.3.6").toIpSpace())); assertThat( "/30 host space is two IPs", toBDD.visit(Prefix.parse("1.2.3.4/30").toHostIpSpace()), equalTo(slash30Filtered)); } }