- self.cli(2, "show int")
- self.cli(2, "show trace")
- self.cli(2, "show hardware")
- self.cli(2, "show ip arp")
- # self.cli(2, "show ip fib") # 2M entries
- self.cli(2, "show error")
- self.cli(2, "show run")
-
- @classmethod
- def create_vlan_subif(cls, pg_index, vlan):
- cls.api("create_vlan_subif pg%u vlan %u" % (pg_index, vlan))
-
- @classmethod
- def create_dot1ad_subif(cls, pg_index, sub_id, outer_vlan_id, inner_vlan_id):
- cls.api("create_subif pg%u sub_id %u outer_vlan_id %u inner_vlan_id %u dot1ad"
- % (pg_index, sub_id, outer_vlan_id, inner_vlan_id))
-
- class SoftInt(object):
- pass
-
- class HardInt(SoftInt):
- pass
-
- class Subint(SoftInt):
- def __init__(self, sub_id):
- self.sub_id = sub_id
-
- class Dot1QSubint(Subint):
- def __init__(self, sub_id, vlan=None):
- if vlan is None:
- vlan = sub_id
- super(TestIPv6.Dot1QSubint, self).__init__(sub_id)
- self.vlan = vlan
-
- class Dot1ADSubint(Subint):
- def __init__(self, sub_id, outer_vlan, inner_vlan):
- super(TestIPv6.Dot1ADSubint, self).__init__(sub_id)
- self.outer_vlan = outer_vlan
- self.inner_vlan = inner_vlan
-
- @classmethod
- def create_interfaces_and_subinterfaces(cls):
- cls.interfaces = range(3)
-
- cls.create_interfaces(cls.interfaces)
-
- # Make vpp_api_test see interfaces created using debug CLI (in function create_interfaces)
- cls.api("sw_interface_dump")
-
- cls.INT_DETAILS = dict()
-
- cls.INT_DETAILS[0] = cls.HardInt()
-
- cls.INT_DETAILS[1] = cls.Dot1QSubint(100)
- cls.create_vlan_subif(1, cls.INT_DETAILS[1].vlan)
-
- # FIXME: Wrong packet format/wrong layer on output of interface 2
- #self.INT_DETAILS[2] = self.Dot1ADSubint(10, 200, 300)
- #self.create_dot1ad_subif(2, self.INT_DETAILS[2].sub_id, self.INT_DETAILS[2].outer_vlan, self.INT_DETAILS[2].inner_vlan)
-
- # Use dor1q for now
- cls.INT_DETAILS[2] = cls.Dot1QSubint(200)
- cls.create_vlan_subif(2, cls.INT_DETAILS[2].vlan)
-
- for i in cls.interfaces:
- det = cls.INT_DETAILS[i]
- if isinstance(det, cls.Subint):
- cls.api("sw_interface_set_flags pg%u.%u admin-up" % (i, det.sub_id))
-
- # IP adresses on subinterfaces
- MY_SOFT_IP6S = {}
- VPP_SOFT_IP6S = {}
-
- @classmethod
- def config_ip6_on_software_interfaces(cls, args):
- for i in args:
- cls.MY_SOFT_IP6S[i] = "fd01:%u::2" % i
- cls.VPP_SOFT_IP6S[i] = "fd01:%u::1" % i
- if isinstance(cls.INT_DETAILS[i], cls.Subint):
- interface = "pg%u.%u" % (i, cls.INT_DETAILS[i].sub_id)
- else:
- interface = "pg%u" % i
- cls.api("sw_interface_add_del_address %s %s/32" % (interface, cls.VPP_SOFT_IP6S[i]))
- cls.log("My subinterface IPv6 address is %s" % (cls.MY_SOFT_IP6S[i]))
-
- # let VPP know MAC addresses of peer (sub)interfaces
- @classmethod
- def resolve_icmpv6_nd_on_software_interfaces(cls, args):
- for i in args:
- ip = cls.VPP_SOFT_IP6S[i]
- cls.log("Sending ICMPv6ND_NS request for %s on port %u" % (ip, i))
- nd_req = (Ether(dst="ff:ff:ff:ff:ff:ff", src=cls.MY_MACS[i]) /
- IPv6(src=cls.MY_SOFT_IP6S[i], dst=ip) /
- ICMPv6ND_NS(tgt=ip) /
- ICMPv6NDOptSrcLLAddr(lladdr=cls.MY_MACS[i]))
- cls.pg_add_stream(i, nd_req)
- cls.pg_enable_capture([i])
-
- cls.cli(2, "trace add pg-input 1")
- cls.pg_start()
-
- # We don't need to read output
-
- # let VPP know MAC addresses of peer (sub)interfaces
- @classmethod
- def send_neighbour_advertisement_on_software_interfaces(cls, args):
- for i in args:
- ip = cls.VPP_SOFT_IP6S[i]
- cls.log("Sending ICMPv6ND_NA message for %s on port %u" % (ip, i))
- pkt = (Ether(dst="ff:ff:ff:ff:ff:ff", src=cls.MY_MACS[i]) /
- IPv6(src=cls.MY_SOFT_IP6S[i], dst=ip) /
- ICMPv6ND_NA(tgt=ip, R=0, S=0) /
- ICMPv6NDOptDstLLAddr(lladdr=cls.MY_MACS[i]))
- cls.pg_add_stream(i, pkt)
- cls.pg_enable_capture([i])
-
- cls.cli(2, "trace add pg-input 1")
- cls.pg_start()
-
- @classmethod
- def config_fib_entries(cls, count):
- n_int = len(cls.interfaces)
- for i in cls.interfaces:
- cls.api("ip_add_del_route fd02::1/128 via %s count %u" % (cls.VPP_SOFT_IP6S[i], count / n_int))
-
- @classmethod
- def add_dot1_layers(cls, i, packet):
- assert(type(packet) is Ether)
- payload = packet.payload
- det = cls.INT_DETAILS[i]
- if isinstance(det, cls.Dot1QSubint):
- packet.remove_payload()
- packet.add_payload(Dot1Q(vlan=det.sub_id) / payload)
- elif isinstance(det, cls.Dot1ADSubint):
- packet.remove_payload()
- packet.add_payload(Dot1Q(vlan=det.outer_vlan) / Dot1Q(vlan=det.inner_vlan) / payload)
- packet.type = 0x88A8
-
- def remove_dot1_layers(self, i, packet):
- self.assertEqual(type(packet), Ether)
- payload = packet.payload
- det = self.INT_DETAILS[i]
- if isinstance(det, self.Dot1QSubint):
- self.assertEqual(type(payload), Dot1Q)
- self.assertEqual(payload.vlan, self.INT_DETAILS[i].vlan)
- payload = payload.payload
- elif isinstance(det, self.Dot1ADSubint): # TODO: change 88A8 type
- self.assertEqual(type(payload), Dot1Q)
- self.assertEqual(payload.vlan, self.INT_DETAILS[i].outer_vlan)
- payload = payload.payload
- self.assertEqual(type(payload), Dot1Q)
- self.assertEqual(payload.vlan, self.INT_DETAILS[i].inner_vlan)
- payload = payload.payload
- packet.remove_payload()
- packet.add_payload(payload)
-
- def create_stream(self, pg_id):
- pg_targets = [None] * 3
- pg_targets[0] = [1, 2]
- pg_targets[1] = [0, 2]
- pg_targets[2] = [0, 1]
+ """Run standard test teardown and log ``show ip6 neighbors``."""
+ super(TestIPv6, self).tearDown()
+ if not self.vpp_dead:
+ self.logger.info(self.vapi.cli("show ip6 neighbors"))
+ # info(self.vapi.cli("show ip6 fib")) # many entries
+
+ def config_fib_entries(self, count):
+ """For each interface add to the FIB table *count* routes to
+ "fd02::1/128" destination with interface's local address as next-hop
+ address.
+
+ :param int count: Number of FIB entries.
+
+ - *TODO:* check if the next-hop address shouldn't be remote address
+ instead of local address.
+ """
+ n_int = len(self.interfaces)
+ percent = 0
+ counter = 0.0
+ dest_addr = socket.inet_pton(socket.AF_INET6, "fd02::1")
+ dest_addr_len = 128
+ for i in self.interfaces:
+ next_hop_address = i.local_ip6n
+ for j in range(count / n_int):
+ self.vapi.ip_add_del_route(
+ dest_addr, dest_addr_len, next_hop_address, is_ipv6=1)
+ counter += 1
+ if counter / count * 100 > percent:
+ self.logger.info("Configure %d FIB entries .. %d%% done" %
+ (count, percent))
+ percent += 1
+
+ def create_stream(self, src_if, packet_sizes):
+ """Create input packet stream for defined interface.
+
+ :param VppInterface src_if: Interface to create packet stream for.
+ :param list packet_sizes: Required packet sizes.
+ """