+ self.vapi.sw_interface_set_l2_bridge(
+ rx_sw_if_index=i.sw_if_index, bd_id=1, enable=0
+ )
+ for i in self.bvi_interfaces:
+ self.vapi.sw_interface_set_l2_bridge(
+ rx_sw_if_index=i.sw_if_index,
+ bd_id=1,
+ shg=2,
+ port_type=L2_PORT_TYPE.BVI,
+ enable=0,
+ )
+
+ self.vapi.bridge_domain_add_del(bd_id=1, is_add=0)
+
+ def test_flood_one(self):
+ """L2 no-Flood Test"""
+
+ #
+ # Create a single bridge Domain
+ #
+ self.vapi.bridge_domain_add_del(bd_id=1)
+
+ #
+ # add 2 interfaces to the BD. this means a flood goes to only
+ # one member
+ #
+ for i in self.pg_interfaces[:2]:
+ self.vapi.sw_interface_set_l2_bridge(
+ rx_sw_if_index=i.sw_if_index, bd_id=1, shg=0
+ )
+
+ p = (
+ Ether(dst="ff:ff:ff:ff:ff:ff", src="00:00:de:ad:be:ef")
+ / IP(src="10.10.10.10", dst="1.1.1.1")
+ / UDP(sport=1234, dport=1234)
+ / Raw(b"\xa5" * 100)
+ )
+
+ #
+ # input on pg0 expect copies on pg1
+ #
+ self.send_and_expect(self.pg0, p * NUM_PKTS, self.pg1)
+
+ #
+ # cleanup
+ #
+ for i in self.pg_interfaces[:2]:
+ self.vapi.sw_interface_set_l2_bridge(
+ rx_sw_if_index=i.sw_if_index, bd_id=1, enable=0
+ )
+ self.vapi.bridge_domain_add_del(bd_id=1, is_add=0)
+
+ def test_uu_fwd(self):
+ """UU Flood"""
+
+ #
+ # Create a single bridge Domain
+ #
+ self.vapi.bridge_domain_add_del(bd_id=1, uu_flood=1)
+
+ #
+ # add each interface to the BD. 3 interfaces per split horizon group
+ #
+ for i in self.pg_interfaces[0:4]:
+ self.vapi.sw_interface_set_l2_bridge(
+ rx_sw_if_index=i.sw_if_index, bd_id=1, shg=0
+ )
+
+ #
+ # an unknown unicast and broadcast packets
+ #
+ p_uu = (
+ Ether(dst="00:00:00:c1:5c:00", src="00:00:de:ad:be:ef")
+ / IP(src="10.10.10.10", dst="1.1.1.1")
+ / UDP(sport=1234, dport=1234)
+ / Raw(b"\xa5" * 100)
+ )
+ p_bm = (
+ Ether(dst="ff:ff:ff:ff:ff:ff", src="00:00:de:ad:be:ef")
+ / IP(src="10.10.10.10", dst="1.1.1.1")
+ / UDP(sport=1234, dport=1234)
+ / Raw(b"\xa5" * 100)
+ )
+
+ #
+ # input on pg0, expected copies on pg1->4
+ #
+ self.pg0.add_stream(p_uu * NUM_PKTS)
+ self.pg_enable_capture(self.pg_interfaces)
+ self.pg_start()
+
+ for i in self.pg_interfaces[1:4]:
+ rx0 = i.get_capture(NUM_PKTS, timeout=1)
+
+ self.pg0.add_stream(p_bm * NUM_PKTS)
+ self.pg_enable_capture(self.pg_interfaces)
+ self.pg_start()
+
+ for i in self.pg_interfaces[1:4]:
+ rx0 = i.get_capture(NUM_PKTS, timeout=1)
+
+ #
+ # use pg8 as the uu-fwd interface
+ #
+ self.vapi.sw_interface_set_l2_bridge(
+ rx_sw_if_index=self.pg8.sw_if_index,
+ bd_id=1,
+ shg=0,
+ port_type=L2_PORT_TYPE.UU_FWD,
+ )
+
+ #
+ # expect the UU packet on the uu-fwd interface and not be flooded
+ #
+ self.pg0.add_stream(p_uu * NUM_PKTS)
+ self.pg_enable_capture(self.pg_interfaces)
+ self.pg_start()
+
+ rx0 = self.pg8.get_capture(NUM_PKTS, timeout=1)
+
+ for i in self.pg_interfaces[0:4]:
+ i.assert_nothing_captured(remark="UU not flooded")
+
+ self.pg0.add_stream(p_bm * NUM_PKTS)
+ self.pg_enable_capture(self.pg_interfaces)
+ self.pg_start()
+
+ for i in self.pg_interfaces[1:4]:
+ rx0 = i.get_capture(NUM_PKTS, timeout=1)
+
+ #
+ # remove the uu-fwd interface and expect UU to be flooded again
+ #
+ self.vapi.sw_interface_set_l2_bridge(
+ rx_sw_if_index=self.pg8.sw_if_index,
+ bd_id=1,
+ shg=0,
+ port_type=L2_PORT_TYPE.UU_FWD,
+ enable=0,
+ )
+
+ self.pg0.add_stream(p_uu * NUM_PKTS)
+ self.pg_enable_capture(self.pg_interfaces)
+ self.pg_start()
+
+ for i in self.pg_interfaces[1:4]:
+ rx0 = i.get_capture(NUM_PKTS, timeout=1)
+
+ #
+ # change the BD config to not support UU-flood
+ #
+ self.vapi.bridge_flags(bd_id=1, is_set=0, flags=BRIDGE_FLAGS.UU_FLOOD)
+
+ self.send_and_assert_no_replies(self.pg0, p_uu)
+
+ #
+ # re-add the uu-fwd interface
+ #
+ self.vapi.sw_interface_set_l2_bridge(
+ rx_sw_if_index=self.pg8.sw_if_index,
+ bd_id=1,
+ shg=0,
+ port_type=L2_PORT_TYPE.UU_FWD,
+ )
+ self.logger.info(self.vapi.cli("sh bridge 1 detail"))
+
+ self.pg0.add_stream(p_uu * NUM_PKTS)
+ self.pg_enable_capture(self.pg_interfaces)
+ self.pg_start()
+
+ rx0 = self.pg8.get_capture(NUM_PKTS, timeout=1)
+
+ for i in self.pg_interfaces[0:4]:
+ i.assert_nothing_captured(remark="UU not flooded")
+
+ #
+ # remove the uu-fwd interface
+ #
+ self.vapi.sw_interface_set_l2_bridge(
+ rx_sw_if_index=self.pg8.sw_if_index,
+ bd_id=1,
+ shg=0,
+ port_type=L2_PORT_TYPE.UU_FWD,
+ enable=0,
+ )
+ self.send_and_assert_no_replies(self.pg0, p_uu)
+
+ #
+ # cleanup
+ #
+ for i in self.pg_interfaces[:4]:
+ self.vapi.sw_interface_set_l2_bridge(
+ rx_sw_if_index=i.sw_if_index, bd_id=1, enable=0
+ )