**NOTES:**
- higher number of pg-l2 interfaces causes problems => only 15 pg-l2 \
interfaces in 5 bridge domains are tested
- - more then 1 host per pg-l2 interface in configuration with 15 l2-pg \
- interfaces leads to problems too
+ - jumbo packets in configuration with 14 l2-pg interfaces leads to \
+ problems too
**config 1**
- add 15 pg-l2 interfaces
from scapy.layers.inet import IP, UDP
from framework import VppTestCase, VppTestRunner
-from util import Host
+from util import Host, ppp
+@unittest.skip("Crashes VPP")
class TestL2bdMultiInst(VppTestCase):
""" L2BD Multi-instance Test Case """
# Packet flows mapping pg0 -> pg1, pg2 etc.
cls.flows = dict()
for i in range(0, len(cls.pg_interfaces), 3):
- cls.flows[cls.pg_interfaces[i]] = [cls.pg_interfaces[i+1],
- cls.pg_interfaces[i+2]]
- cls.flows[cls.pg_interfaces[i+1]] = [cls.pg_interfaces[i],
- cls.pg_interfaces[i+2]]
- cls.flows[cls.pg_interfaces[i+2]] = [cls.pg_interfaces[i],
- cls.pg_interfaces[i+1]]
+ cls.flows[cls.pg_interfaces[i]] = [cls.pg_interfaces[i + 1],
+ cls.pg_interfaces[i + 2]]
+ cls.flows[cls.pg_interfaces[i + 1]] = [cls.pg_interfaces[i],
+ cls.pg_interfaces[i + 2]]
+ cls.flows[cls.pg_interfaces[i + 2]] = [cls.pg_interfaces[i],
+ cls.pg_interfaces[i + 1]]
# Mapping between packet-generator index and lists of test hosts
cls.hosts_by_pg_idx = dict()
cls.hosts_by_pg_idx[pg_if.sw_if_index] = []
# Create test host entries
- cls.create_hosts(15)
+ cls.create_hosts(75)
- # Packet sizes
- cls.pg_if_packet_sizes = [64, 512, 1518, 9018]
+ # Packet sizes - jumbo packet (9018 bytes) skipped
+ cls.pg_if_packet_sizes = [64, 512, 1518]
# Set up all interfaces
for i in cls.pg_interfaces:
hosts.append(host)
def create_bd_and_mac_learn(self, count, start=1):
- """"
+ """
Create required number of bridge domains with MAC learning enabled, put
3 l2-pg interfaces to every bridge domain and send MAC learning packets.
if self.bd_deleted_list.count(bd_id) == 1:
self.bd_deleted_list.remove(bd_id)
for j in range(3):
- pg_if = self.pg_interfaces[(i+start-1)*3+j]
+ pg_if = self.pg_interfaces[(i + start - 1) * 3 + j]
self.vapi.sw_interface_set_l2_bridge(pg_if.sw_if_index,
bd_id=bd_id)
self.logger.info("pg-interface %s added to bridge domain ID %d"
self.logger.info(self.vapi.ppcli("show l2fib"))
def delete_bd(self, count, start=1):
- """"
+ """
Delete required number of bridge domains.
:param int count: Number of bridge domains to be created.
if self.bd_deleted_list.count(bd_id) == 0:
self.bd_deleted_list.append(bd_id)
for j in range(3):
- pg_if = self.pg_interfaces[(i+start-1)*3+j]
+ pg_if = self.pg_interfaces[(i + start - 1) * 3 + j]
self.pg_in_bd.remove(pg_if)
self.pg_not_in_bd.append(pg_if)
self.logger.info("Bridge domain ID %d deleted" % bd_id)
self.assertEqual(udp.sport, saved_packet[UDP].sport)
self.assertEqual(udp.dport, saved_packet[UDP].dport)
except:
- self.logger.error("Unexpected or invalid packet:")
- self.logger.error(packet.show())
+ 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(
Enable/disable defined feature(s) of the bridge domain.
:param int bd_id: Bridge domain ID.
- :param list args: List of feature/status pairs. Allowed features:
- - learn,
- - forward,
- - flood,
- - uu_flood and
- - arp_term
- Status False means disable, status True means enable the feature.
+ :param list args: List of feature/status pairs. Allowed features: \
+ learn, forward, flood, uu_flood and arp_term. Status False means \
+ disable, status True means enable the feature.
:raise: ValueError in case of unknown feature in the input.
"""
for flag in args:
of listed features.
:param int bd_id: Bridge domain ID.
- :param list args: List of feature/status pairs. Allowed features:
- - learn,
- - forward,
- - flood,
- - uu_flood and
- - arp_term
- Status False means disable, status True means enable the feature.
+ :param list args: List of feature/status pairs. Allowed features: \
+ learn, forward, flood, uu_flood and arp_term. Status False means \
+ disable, status True means enable the feature.
:return: 1 if bridge domain is configured, otherwise return 0.
:raise: ValueError in case of unknown feature in the input.
"""
def run_verify_test(self):
"""
- Create packet streams for all configured l2-pg interfaces, send all
+ Create packet streams for all configured l2-pg interfaces, send all \
prepared packet streams and verify that:
- - all packets received correctly on all pg-l2 interfaces assigned to
- bridge domains
- - no packet received on all pg-l2 interfaces not assigned to bridge
- domains
-
- :raise: RuntimeError if no packet captured on l2-pg interface assigned
- to the bridge domain or if any packet is captured on l2-pg interface
- not assigned to the bridge domain.
+ - all packets received correctly on all pg-l2 interfaces assigned
+ to bridge domains
+ - no packet received on all pg-l2 interfaces not assigned to
+ bridge domains
+
+ :raise RuntimeError: if no packet captured on l2-pg interface assigned
+ to the bridge domain or if any packet is captured
+ on l2-pg interface not assigned to the bridge
+ domain.
"""
# Test
# Create incoming packet streams for packet-generator interfaces