ip: Protocol Independent IP Neighbors

Type: feature

 - ip-neighbour: generic neighbour handling; APIs, DBs, event handling,
aging
 - arp: ARP protocol implementation
 - ip6-nd; IPv6 neighbor discovery implementation; separate ND,
MLD, RA
 - ip6-link; manage link-local addresses
 - l2-arp-term; events separated from IP neighbours, since they are not
the same.

vnet retains just enough education to perform ND/ARP packet
construction.
arp and ip6-nd to be moved to plugins soon.

Change-Id: I88dedd0006b299344f4c7024a0aa5baa6b9a8bbe
Signed-off-by: Neale Ranns <nranns@cisco.com>
This commit is contained in:
Neale Ranns
2019-09-30 10:53:31 +00:00
committed by Ole Trøan
parent 96453fd241
commit cbe25aab3b
140 changed files with 13177 additions and 13405 deletions

View File

@ -137,6 +137,7 @@ class TestIPv6ND(VppTestCase):
def send_and_expect_ns(self, tx_intf, rx_intf, pkts, tgt_ip,
filter_out_fn=is_ipv6_misc):
self.vapi.cli("clear trace")
tx_intf.add_stream(pkts)
self.pg_enable_capture(self.pg_interfaces)
self.pg_start()
@ -221,7 +222,6 @@ class TestIPv6(TestIPv6ND):
"""Run standard test teardown and log ``show ip6 neighbors``."""
for i in self.interfaces:
i.unconfig_ip6()
i.ip6_disable()
i.admin_down()
for i in self.sub_interfaces:
i.remove_vpp_config()
@ -577,9 +577,12 @@ class TestIPv6(TestIPv6ND):
self.pg0.remote_ip6,
self.pg1.remote_hosts[1].ip6)
def validate_ra(self, intf, rx, dst_ip=None, mtu=9000, pi_opt=None):
def validate_ra(self, intf, rx, dst_ip=None, src_ip=None,
mtu=9000, pi_opt=None):
if not dst_ip:
dst_ip = intf.remote_ip6
if not src_ip:
src_ip = mk_ll_addr(intf.local_mac)
# unicasted packets must come to the unicast mac
self.assertEqual(rx[Ether].dst, intf.remote_mac)
@ -594,8 +597,7 @@ class TestIPv6(TestIPv6ND):
# and come from the router's link local
self.assertTrue(in6_islladdr(rx[IPv6].src))
self.assertEqual(in6_ptop(rx[IPv6].src),
in6_ptop(mk_ll_addr(intf.local_mac)))
self.assertEqual(in6_ptop(rx[IPv6].src), in6_ptop(src_ip))
# it should contain the links MTU
ra = rx[ICMPv6ND_RA]
@ -634,7 +636,9 @@ class TestIPv6(TestIPv6ND):
def send_and_expect_ra(self, intf, pkts, remark, dst_ip=None,
filter_out_fn=is_ipv6_misc,
opt=None):
opt=None,
src_ip=None):
self.vapi.cli("clear trace")
intf.add_stream(pkts)
self.pg_enable_capture(self.pg_interfaces)
self.pg_start()
@ -642,7 +646,7 @@ class TestIPv6(TestIPv6ND):
self.assertEqual(len(rx), 1)
rx = rx[0]
self.validate_ra(intf, rx, dst_ip, pi_opt=opt)
self.validate_ra(intf, rx, dst_ip, src_ip=src_ip, pi_opt=opt)
def test_rs(self):
""" IPv6 Router Solicitation Exceptions
@ -665,8 +669,7 @@ class TestIPv6(TestIPv6ND):
# - expect an RA in return
#
p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
IPv6(
dst=self.pg0.local_ip6, src=self.pg0.remote_ip6) /
IPv6(dst=self.pg0.local_ip6, src=self.pg0.remote_ip6) /
ICMPv6ND_RS())
pkts = [p]
self.send_and_expect_ra(self.pg0, pkts, "Genuine RS")
@ -924,10 +927,18 @@ class TestIPv6(TestIPv6ND):
self.pg1.local_ip6_prefix_len),
is_no=1)
#
# change the link's link local, so we know that works too.
#
self.vapi.sw_interface_ip6_set_link_local_address(
sw_if_index=self.pg0.sw_if_index,
ip="fe80::88")
self.pg0.ip6_ra_config(send_unicast=1)
self.send_and_expect_ra(self.pg0, p,
"RA with Prefix reverted to defaults",
dst_ip=ll)
dst_ip=ll,
src_ip="fe80::88")
#
# Reset the periodic advertisements back to default values
@ -1034,7 +1045,6 @@ class TestICMPv6Echo(VppTestCase):
super(TestICMPv6Echo, self).tearDown()
for i in self.pg_interfaces:
i.unconfig_ip6()
i.ip6_disable()
i.admin_down()
def test_icmpv6_echo(self):
@ -1158,7 +1168,7 @@ class TestIPv6RD(TestIPv6ND):
def test_rd_receive_router_advertisement(self):
""" Verify events triggered by received RA packets """
self.vapi.want_ip6_ra_events()
self.vapi.want_ip6_ra_events(enable=1)
prefix_info_1 = ICMPv6NDOptPrefixInfo(
prefix="1::2",
@ -1264,6 +1274,17 @@ class TestIPv6RDControlPlane(TestIPv6ND):
list.append(str(entry.route.prefix.network_address))
return list
def wait_for_no_default_route(self, n_tries=50, s_time=1):
while (n_tries):
fib = self.vapi.ip_route_dump(0, True)
default_routes = self.get_default_routes(fib)
if 0 is len(default_routes):
return True
n_tries = n_tries - 1
self.sleep(s_time)
return False
def test_all(self):
""" Test handling of SLAAC addresses and default routes """
@ -1363,9 +1384,7 @@ class TestIPv6RDControlPlane(TestIPv6ND):
self.sleep_on_vpp_time(1)
# check that default route is deleted
fib = self.vapi.ip_route_dump(0, True)
default_routes = self.get_default_routes(fib)
self.assertEqual(len(default_routes), 0)
self.assertTrue(self.wait_for_no_default_route())
# check FIB still contains the SLAAC address
addresses = set(self.get_interface_addresses(fib, self.pg0))
@ -1442,7 +1461,7 @@ class IPv6NDProxyTest(TestIPv6ND):
# Add proxy support for the host
#
self.vapi.ip6nd_proxy_add_del(
ip=inet_pton(AF_INET6, self.pg0._remote_hosts[2].ip6),
is_add=1, ip=inet_pton(AF_INET6, self.pg0._remote_hosts[2].ip6),
sw_if_index=self.pg1.sw_if_index)
#
@ -1509,7 +1528,7 @@ class IPv6NDProxyTest(TestIPv6ND):
lladdr=self.pg0._remote_hosts[2].mac))
self.vapi.ip6nd_proxy_add_del(
ip=inet_pton(AF_INET6, self.pg0._remote_hosts[3].ip6),
is_add=1, ip=inet_pton(AF_INET6, self.pg0._remote_hosts[3].ip6),
sw_if_index=self.pg2.sw_if_index)
self.send_and_expect_na(self.pg2, ns_pg2,
@ -1550,10 +1569,10 @@ class IPv6NDProxyTest(TestIPv6ND):
#
self.vapi.ip6nd_proxy_add_del(
ip=inet_pton(AF_INET6, self.pg0._remote_hosts[2].ip6),
sw_if_index=self.pg1.sw_if_index, is_del=1)
sw_if_index=self.pg1.sw_if_index, is_add=0)
self.vapi.ip6nd_proxy_add_del(
ip=inet_pton(AF_INET6, self.pg0._remote_hosts[3].ip6),
sw_if_index=self.pg2.sw_if_index, is_del=1)
sw_if_index=self.pg2.sw_if_index, is_add=0)
self.assertFalse(find_nbr(self,
self.pg2.sw_if_index,