X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_l2_fib.py;h=41b934dab42a9a9c78f4e43743158baf32d87d78;hb=8df3de48824efe07c7f4b86d9ee87539a63ec58a;hp=58dc37eea233706b182e69ac9b3d61f00e1bcdf5;hpb=eaea421e1fefedc47325f970475c5d48c899433c;p=vpp.git diff --git a/test/test_l2_fib.py b/test/test_l2_fib.py index 58dc37eea23..41b934dab42 100644 --- a/test/test_l2_fib.py +++ b/test/test_l2_fib.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """L2 FIB Test Case HLD: **config 1** @@ -69,21 +69,15 @@ from scapy.layers.inet import IP, UDP from framework import VppTestCase, VppTestRunner from util import Host, ppp -from vpp_papi import mac_pton - -# from src/vnet/l2/l2_fib.h -MAC_EVENT_ACTION_ADD = 0 -MAC_EVENT_ACTION_DELETE = 1 -MAC_EVENT_ACTION_MOVE = 2 +from vpp_papi import mac_pton, VppEnum class TestL2fib(VppTestCase): - """ L2 FIB Test Case """ + """L2 FIB Test Case""" @classmethod def bd_ifs(cls, bd_id): - return range((bd_id - 1) * cls.n_ifs_per_bd, - bd_id * cls.n_ifs_per_bd - 1) + return range((bd_id - 1) * cls.n_ifs_per_bd, bd_id * cls.n_ifs_per_bd - 1) @classmethod def setUpClass(cls): @@ -109,7 +103,8 @@ class TestL2fib(VppTestCase): ifs = cls.bd_ifs(bd_id) for j in ifs: cls.flows[cls.pg_interfaces[j]] = [ - cls.pg_interfaces[x] for x in ifs if x != j] + cls.pg_interfaces[x] for x in ifs if x != j + ] # Packet sizes cls.pg_if_packet_sizes = [64, 512, 1518, 9018] @@ -117,12 +112,14 @@ class TestL2fib(VppTestCase): for bd_id in n_brs: # Create BD with MAC learning and unknown unicast flooding # disabled and put interfaces to this BD - cls.vapi.bridge_domain_add_del( - bd_id=bd_id, uu_flood=0, learn=0) + cls.vapi.bridge_domain_add_del_v2( + bd_id=bd_id, is_add=1, uu_flood=0, learn=0, flood=1, forward=1 + ) ifs = [cls.pg_interfaces[i] for i in cls.bd_ifs(bd_id)] for pg_if in ifs: - cls.vapi.sw_interface_set_l2_bridge(pg_if.sw_if_index, - bd_id=bd_id) + cls.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=pg_if.sw_if_index, bd_id=bd_id + ) # Set up all interfaces for i in cls.pg_interfaces: @@ -131,6 +128,10 @@ class TestL2fib(VppTestCase): super(TestL2fib, cls).tearDownClass() raise + @classmethod + def tearDownClass(cls): + super(TestL2fib, cls).tearDownClass() + def setUp(self): super(TestL2fib, self).setUp() self.reset_packet_infos() @@ -141,10 +142,13 @@ class TestL2fib(VppTestCase): """ super(TestL2fib, self).tearDown() if not self.vpp_dead: - self.logger.info(self.vapi.ppcli("show l2fib verbose")) for bd_id in self.n_brs: - self.logger.info(self.vapi.ppcli("show bridge-domain %s detail" - % bd_id)) + self.logger.info( + self.vapi.ppcli("show bridge-domain %s detail" % bd_id) + ) + + def show_commands_at_teardown(self): + self.logger.info(self.vapi.ppcli("show l2fib verbose")) def create_hosts(self, n_hosts_per_if, subnet): """ @@ -152,18 +156,22 @@ class TestL2fib(VppTestCase): interfaces. Create host IPv4 address for every host MAC address. :param int n_hosts_per_if: Number of per interface hosts to - create MAC/IPv4 addresses for. + create MAC/IPv4 addresses for. """ hosts = dict() for pg_if in self.pg_interfaces: swif = pg_if.sw_if_index - def mac(j): return "00:00:%02x:ff:%02x:%02x" % (subnet, swif, j) + def mac(j): + return "00:00:%02x:ff:%02x:%02x" % (subnet, swif, j) + + def ip(j): + return "172.%02u.1%02x.%u" % (subnet, swif, j) - def ip(j): return "172.%02u.1%02x.%u" % (subnet, swif, j) + def h(j): + return Host(mac(j), ip(j)) - def h(j): return Host(mac(j), ip(j)) hosts[swif] = [h(j) for j in range(n_hosts_per_if)] return hosts @@ -183,12 +191,13 @@ class TestL2fib(VppTestCase): :param int bd_id: BD to teach :param dict hosts: dict of hosts per interface """ - self.vapi.bridge_flags(bd_id, 1, 1) + self.vapi.bridge_flags(bd_id=bd_id, is_set=1, flags=1) ifs = [self.pg_interfaces[i] for i in self.bd_ifs(bd_id)] for pg_if in ifs: swif = pg_if.sw_if_index - packets = [Ether(dst="ff:ff:ff:ff:ff:ff", src=host.mac) - for host in hosts[swif]] + packets = [ + Ether(dst="ff:ff:ff:ff:ff:ff", src=host.mac) for host in hosts[swif] + ] pg_if.add_stream(packets) self.logger.info("Sending broadcast eth frames for MAC learning") self.pg_start() @@ -205,8 +214,7 @@ class TestL2fib(VppTestCase): for pg_if in ifs: swif = pg_if.sw_if_index for host in hosts[swif]: - self.vapi.l2fib_add_del( - mac_pton(host.mac), bd_id, swif, static_mac=1) + self.vapi.l2fib_add_del(mac_pton(host.mac), bd_id, swif, static_mac=1) def delete_l2_fib_entry(self, bd_id, hosts): """ @@ -218,8 +226,7 @@ class TestL2fib(VppTestCase): for pg_if in ifs: swif = pg_if.sw_if_index for host in hosts[swif]: - self.vapi.l2fib_add_del( - mac_pton(host.mac), bd_id, swif, is_add=0) + self.vapi.l2fib_add_del(mac_pton(host.mac), bd_id, swif, is_add=0) def flush_int(self, swif, learned_hosts): """ @@ -277,10 +284,12 @@ class TestL2fib(VppTestCase): src_host = random.choice(src_hosts) pkt_info = self.create_packet_info(src_if, dst_if) payload = self.info_to_payload(pkt_info) - p = (Ether(dst=dst_host.mac, src=src_host.mac) / - IP(src=src_host.ip4, dst=dst_host.ip4) / - UDP(sport=1234, dport=1234) / - Raw(payload)) + p = ( + Ether(dst=dst_host.mac, src=src_host.mac) + / IP(src=src_host.ip4, dst=dst_host.ip4) + / UDP(sport=1234, dport=1234) + / Raw(payload) + ) pkt_info.data = p.copy() size = random.choice(packet_sizes) self.extend_packet(p, size) @@ -305,11 +314,13 @@ class TestL2fib(VppTestCase): udp = packet[UDP] packet_index = payload_info.index self.assertEqual(payload_info.dst, dst_sw_if_index) - self.logger.debug("Got packet on port %s: src=%u (id=%u)" % - (pg_if.name, payload_info.src, packet_index)) + self.logger.debug( + "Got packet on port %s: src=%u (id=%u)" + % (pg_if.name, payload_info.src, packet_index) + ) next_info = self.get_next_packet_info_for_interface2( - payload_info.src, dst_sw_if_index, - last_info[payload_info.src]) + payload_info.src, dst_sw_if_index, last_info[payload_info.src] + ) last_info[payload_info.src] = next_info self.assertTrue(next_info is not None) self.assertEqual(packet_index, next_info.index) @@ -319,16 +330,18 @@ class TestL2fib(VppTestCase): self.assertEqual(ip.dst, saved_packet[IP].dst) self.assertEqual(udp.sport, saved_packet[UDP].sport) self.assertEqual(udp.dport, saved_packet[UDP].dport) - except: + except BaseException: self.logger.error(ppp("Unexpected or invalid packet:", packet)) raise for i in self.pg_interfaces: remaining_packet = self.get_next_packet_info_for_interface2( - i, dst_sw_if_index, last_info[i.sw_if_index]) + i, dst_sw_if_index, last_info[i.sw_if_index] + ) self.assertTrue( remaining_packet is None, - "Port %u: Packet expected from source %u didn't arrive" % - (dst_sw_if_index, i.sw_if_index)) + "Port %u: Packet expected from source %u didn't arrive" + % (dst_sw_if_index, i.sw_if_index), + ) def run_verify_test(self, bd_id, src_hosts, dst_hosts): # Test @@ -337,13 +350,15 @@ class TestL2fib(VppTestCase): ifs = [self.pg_interfaces[i] for i in self.bd_ifs(bd_id)] for i in ifs: pkts = self.create_stream( - i, self.pg_if_packet_sizes, + i, + self.pg_if_packet_sizes, if_src_hosts=src_hosts, - if_dst_hosts=dst_hosts) + if_dst_hosts=dst_hosts, + ) if pkts: i.add_stream(pkts) - self.vapi.bridge_flags(bd_id, 0, 1) + self.vapi.bridge_flags(bd_id=bd_id, is_set=0, flags=1) # Enable packet capture and start packet sending self.pg_enable_capture(ifs) self.pg_start() @@ -365,13 +380,15 @@ class TestL2fib(VppTestCase): ifs = [self.pg_interfaces[i] for i in self.bd_ifs(bd_id)] for i in ifs: pkts = self.create_stream( - i, self.pg_if_packet_sizes, + i, + self.pg_if_packet_sizes, if_src_hosts=src_hosts, - if_dst_hosts=dst_hosts) + if_dst_hosts=dst_hosts, + ) if pkts: i.add_stream(pkts) - self.vapi.bridge_flags(bd_id, 0, 1) + self.vapi.bridge_flags(bd_id=bd_id, is_set=0, flags=1) # Enable packet capture and start packet sending self.pg_enable_capture(ifs) self.pg_start() @@ -385,16 +402,14 @@ class TestL2fib(VppTestCase): timeout = 0.1 def test_l2_fib_program100(self): - """ L2 FIB - program 100 MACs - """ + """L2 FIB - program 100 MACs""" bd_id = 1 hosts = self.create_hosts(100, subnet=17) self.config_l2_fib_entries(bd_id, hosts) self.run_verify_test(bd_id, hosts, hosts) def test_l2_fib_program100_delete12(self): - """ L2 FIB - program 100, delete 12 MACs - """ + """L2 FIB - program 100, delete 12 MACs""" bd_id = 1 hosts = self.create_hosts(100, subnet=17) self.config_l2_fib_entries(bd_id, hosts) @@ -405,8 +420,7 @@ class TestL2fib(VppTestCase): self.run_verify_negat_test(bd_id, hosts, del_hosts) def test_l2_fib_program100_add100(self): - """ L2 FIB - program 100, add 100 MACs - """ + """L2 FIB - program 100, add 100 MACs""" bd_id = 1 hosts = self.create_hosts(100, subnet=17) self.config_l2_fib_entries(bd_id, hosts) @@ -415,8 +429,7 @@ class TestL2fib(VppTestCase): self.run_verify_test(bd_id, hosts, hosts2) def test_l2_fib_program10_learn10(self): - """ L2 FIB - program 10 MACs, learn 10 - """ + """L2 FIB - program 10 MACs, learn 10""" hosts = self.create_hosts(20, subnet=35) lhosts = self.split_hosts(hosts, 10) @@ -430,8 +443,7 @@ class TestL2fib(VppTestCase): self.run_verify_test(bd2, lhosts, hosts) def test_l2_fib_flush_int(self): - """ L2 FIB - flush interface - """ + """L2 FIB - flush interface""" hosts = self.create_hosts(20, subnet=36) lhosts = self.split_hosts(hosts, 10) @@ -444,8 +456,7 @@ class TestL2fib(VppTestCase): self.run_verify_negat_test(bd1, hosts, flushed) def test_l2_fib_flush_bd(self): - """ L2 FIB - flush BD - """ + """L2 FIB - flush BD""" hosts = self.create_hosts(20, subnet=37) lhosts = self.split_hosts(hosts, 10) @@ -457,8 +468,7 @@ class TestL2fib(VppTestCase): self.run_verify_negat_test(bd1, hosts, flushed) def test_l2_fib_flush_all(self): - """ L2 FIB - flush all - """ + """L2 FIB - flush all""" hosts = self.create_hosts(20, subnet=38) lhosts = self.split_hosts(hosts, 10) @@ -477,28 +487,61 @@ class TestL2fib(VppTestCase): self.run_verify_negat_test(bd2, hosts, lhosts) def test_l2_fib_mac_learn_evs(self): - """ L2 FIB - mac learning events - """ + """L2 FIB - mac learning events""" bd1 = 1 hosts = self.create_hosts(10, subnet=39) self.vapi.want_l2_macs_events() self.learn_hosts(bd1, hosts) - self.sleep(1) + self.virtual_sleep(1) self.logger.info(self.vapi.ppcli("show l2fib")) evs = self.vapi.collect_events() + action = VppEnum.vl_api_mac_event_action_t.MAC_EVENT_ACTION_API_ADD learned_macs = { - e.mac[i].mac_addr for e in evs for i in range(e.n_macs) - if e.mac[i].action == MAC_EVENT_ACTION_ADD} - macs = {h.bin_mac for swif in self.bd_ifs(bd1) - for h in hosts[self.pg_interfaces[swif].sw_if_index]} + e.mac[i].mac_addr.packed + for e in evs + for i in range(e.n_macs) + if e.mac[i].action == action + } + macs = { + h.bin_mac + for swif in self.bd_ifs(bd1) + for h in hosts[self.pg_interfaces[swif].sw_if_index] + } self.vapi.want_l2_macs_events(enable_disable=0) self.assertEqual(len(learned_macs ^ macs), 0) + def test_l2_fib_mac_learn_evs2(self): + """L2 FIB - mac learning events using want_l2_macs_events2""" + bd1 = 1 + hosts = self.create_hosts(10, subnet=39) + + self.vapi.l2fib_set_scan_delay(scan_delay=10) + self.vapi.want_l2_macs_events2() + self.sleep(1) + self.learn_hosts(bd1, hosts) + + self.virtual_sleep(1) + self.logger.info(self.vapi.ppcli("show l2fib")) + evs = self.vapi.collect_events() + action = VppEnum.vl_api_mac_event_action_t.MAC_EVENT_ACTION_API_ADD + learned_macs = { + e.mac[i].mac_addr.packed + for e in evs + for i in range(e.n_macs) + if e.mac[i].action == action + } + macs = { + h.bin_mac + for swif in self.bd_ifs(bd1) + for h in hosts[self.pg_interfaces[swif].sw_if_index] + } + self.vapi.want_l2_macs_events2(enable_disable=0) + self.assertEqual(len(learned_macs ^ macs), 0) + def test_l2_fib_macs_learn_max(self): - """ L2 FIB - mac learning max macs in event - """ + """L2 FIB - mac learning max macs in event""" bd1 = 1 hosts = self.create_hosts(10, subnet=40) @@ -512,16 +555,57 @@ class TestL2fib(VppTestCase): self.vapi.want_l2_macs_events(enable_disable=0) self.assertGreater(len(evs), 0) + action = VppEnum.vl_api_mac_event_action_t.MAC_EVENT_ACTION_API_ADD + learned_macs = { + e.mac[i].mac_addr.packed + for e in evs + for i in range(e.n_macs) + if e.mac[i].action == action + } + macs = { + h.bin_mac + for swif in self.bd_ifs(bd1) + for h in hosts[self.pg_interfaces[swif].sw_if_index] + } + + for e in evs: + self.assertLess(len(e), ev_macs * 10) + self.assertEqual(len(learned_macs ^ macs), 0) + + def test_l2_fib_macs_learn_max2(self): + """L2 FIB - mac learning max macs in event using want_l2_macs_events2""" + bd1 = 1 + hosts = self.create_hosts(10, subnet=40) + + ev_macs = 1 + self.vapi.l2fib_set_scan_delay(scan_delay=10) + self.vapi.want_l2_macs_events2(max_macs_in_event=ev_macs) + self.sleep(1) + self.learn_hosts(bd1, hosts) + + self.virtual_sleep(1) + self.logger.info(self.vapi.ppcli("show l2fib")) + evs = self.vapi.collect_events() + self.vapi.want_l2_macs_events2(enable_disable=0) + + self.assertGreater(len(evs), 0) + action = VppEnum.vl_api_mac_event_action_t.MAC_EVENT_ACTION_API_ADD learned_macs = { - e.mac[i].mac_addr for e in evs for i in range(e.n_macs) - if e.mac[i].action == MAC_EVENT_ACTION_ADD} - macs = {h.bin_mac for swif in self.bd_ifs(bd1) - for h in hosts[self.pg_interfaces[swif].sw_if_index]} + e.mac[i].mac_addr.packed + for e in evs + for i in range(e.n_macs) + if e.mac[i].action == action + } + macs = { + h.bin_mac + for swif in self.bd_ifs(bd1) + for h in hosts[self.pg_interfaces[swif].sw_if_index] + } for e in evs: self.assertLess(len(e), ev_macs * 10) self.assertEqual(len(learned_macs ^ macs), 0) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main(testRunner=VppTestRunner)