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:
@ -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,
|
||||
|
Reference in New Issue
Block a user