X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_ip4_irb.py;h=8c3830c2d816e073024cc6c84ed243a2c42ddeb1;hb=8006c6a;hp=412575dbd3c155e21fc98866e97cda6514c8313d;hpb=0178d52384e0428368f1acf3163e664ecda7b64c;p=vpp.git diff --git a/test/test_ip4_irb.py b/test/test_ip4_irb.py index 412575dbd3c..8c3830c2d81 100644 --- a/test/test_ip4_irb.py +++ b/test/test_ip4_irb.py @@ -1,39 +1,53 @@ #!/usr/bin/env python +"""IRB Test Case HLD: + +**config** + - L2 MAC learning enabled in l2bd + - 2 routed interfaces untagged, bvi (Bridge Virtual Interface) + - 2 bridged interfaces in l2bd with bvi + +**test** + - sending ip4 eth pkts between routed interfaces + - 2 routed interfaces + - 2 bridged interfaces + + - 64B, 512B, 1518B, 9200B (ether_size) + + - burst of pkts per interface + - 257pkts per burst + - routed pkts hitting different FIB entries + - bridged pkts hitting different MAC entries + +**verify** + - all packets received correctly + +""" + import unittest -from random import choice, randint +from random import choice from scapy.packet import Raw from scapy.layers.l2 import Ether from scapy.layers.inet import IP, UDP -from logging import * from framework import VppTestCase, VppTestRunner - -""" IRB Test Case - -config - L2 MAC learning enabled in l2bd - 2 routed interfaces untagged, bvi - 2 bridged interfaces in l2bd with bvi -test - sending ip4 eth pkts between routed interfaces - 2 routed interfaces - 2 bridged interfaces - 64B, 512B, 1518B, 9200B (ether_size) - burst of pkts per interface - 257pkts per burst - routed pkts hitting different FIB entries - bridged pkts hitting different MAC entries -verify - all packets received correctly -""" +from vpp_papi import MACAddress +from vpp_papi_provider import L2_PORT_TYPE class TestIpIrb(VppTestCase): - """ IRB Test Case """ + """IRB Test Case""" @classmethod def setUpClass(cls): + """ + #. Create BD with MAC learning enabled and put interfaces to this BD. + #. Configure IPv4 addresses on loopback interface and routed interface. + #. Configure MAC address binding to IPv4 neighbors on loop0. + #. Configure MAC address on pg2. + #. Loopback BVI interface has remote hosts, one half of hosts are + behind pg0 second behind pg1. + """ super(TestIpIrb, cls).setUpClass() cls.pg_if_packet_sizes = [64, 512, 1518, 9018] # packet sizes @@ -42,7 +56,7 @@ class TestIpIrb(VppTestCase): # create 3 pg interfaces, 1 loopback interface cls.create_pg_interfaces(range(3)) - cls.create_loopback_interfaces(range(1)) + cls.create_loopback_interfaces(1) cls.interfaces = list(cls.pg_interfaces) cls.interfaces.extend(cls.lo_interfaces) @@ -52,40 +66,47 @@ class TestIpIrb(VppTestCase): # Create BD with MAC learning enabled and put interfaces to this BD cls.vapi.sw_interface_set_l2_bridge( - cls.loop0.sw_if_index, bd_id=cls.bd_id, bvi=1) + cls.loop0.sw_if_index, bd_id=cls.bd_id, + port_type=L2_PORT_TYPE.BVI) cls.vapi.sw_interface_set_l2_bridge( cls.pg0.sw_if_index, bd_id=cls.bd_id) cls.vapi.sw_interface_set_l2_bridge( cls.pg1.sw_if_index, bd_id=cls.bd_id) + # Configure IPv4 addresses on loopback interface and routed interface cls.loop0.config_ip4() cls.pg2.config_ip4() - # configure MAC address binding to IPv4 neighbors on loop0 + # Configure MAC address binding to IPv4 neighbors on loop0 cls.loop0.generate_remote_hosts(cls.remote_hosts_count) - cls.loop0.configure_extend_ipv4_mac_binding() + cls.loop0.configure_ipv4_neighbors() # configure MAC address on pg2 cls.pg2.resolve_arp() - # one half of hosts are behind pg0 second behind pg1 + # Loopback BVI interface has remote hosts, one half of hosts are behind + # pg0 second behind pg1 half = cls.remote_hosts_count // 2 cls.pg0.remote_hosts = cls.loop0.remote_hosts[:half] cls.pg1.remote_hosts = cls.loop0.remote_hosts[half:] def tearDown(self): + """Run standard test teardown and log ``show l2patch``, + ``show l2fib verbose``,``show bridge-domain detail``, + ``show ip arp``. + """ super(TestIpIrb, self).tearDown() if not self.vpp_dead: - info(self.vapi.cli("show l2patch")) - info(self.vapi.cli("show l2fib verbose")) - info(self.vapi.cli("show bridge-domain %s detail" % self.bd_id)) - info(self.vapi.cli("show ip arp")) + self.logger.info(self.vapi.cli("show l2patch")) + self.logger.info(self.vapi.cli("show l2fib verbose")) + self.logger.info(self.vapi.cli("show bridge-domain %s detail" % + self.bd_id)) + self.logger.info(self.vapi.cli("show ip arp")) def create_stream(self, src_ip_if, dst_ip_if, packet_sizes): pkts = [] for i in range(0, 257): remote_dst_host = choice(dst_ip_if.remote_hosts) - info = self.create_packet_info( - src_ip_if.sw_if_index, dst_ip_if.sw_if_index) + info = self.create_packet_info(src_ip_if, dst_ip_if) payload = self.info_to_payload(info) p = (Ether(dst=src_ip_if.local_mac, src=src_ip_if.remote_mac) / IP(src=src_ip_if.remote_ip4, @@ -102,14 +123,13 @@ class TestIpIrb(VppTestCase): packet_sizes): pkts = [] for i in range(0, 257): - info = self.create_packet_info( - src_ip_if.sw_if_index, dst_ip_if.sw_if_index) + info = self.create_packet_info(src_ip_if, dst_ip_if) payload = self.info_to_payload(info) host = choice(src_l2_if.remote_hosts) p = (Ether(src=host.mac, - dst = src_ip_if.local_mac) / + dst=src_ip_if.local_mac) / IP(src=host.ip4, dst=dst_ip_if.remote_ip4) / UDP(sport=1234, dport=1234) / @@ -133,7 +153,6 @@ class TestIpIrb(VppTestCase): ip = packet[IP] udp = packet[IP][UDP] payload_info = self.payload_to_info(str(packet[IP][UDP][Raw])) - packet_index = payload_info.index self.assertEqual(payload_info.dst, dst_ip_sw_if_index) @@ -200,8 +219,8 @@ class TestIpIrb(VppTestCase): """ IPv4 IRB test 1 Test scenario: - ip traffic from pg2 interface must ends in both pg0 and pg1 - - arp entry present in loop0 interface for dst IP + - ip traffic from pg2 interface must ends in both pg0 and pg1 + - arp entry present in loop0 interface for destination IP - no l2 entree configured, pg0 and pg1 are same """ @@ -212,35 +231,45 @@ class TestIpIrb(VppTestCase): self.pg_enable_capture(self.pg_interfaces) self.pg_start() - rcvd1 = self.pg0.get_capture() - rcvd2 = self.pg1.get_capture() + packet_count = self.get_packet_count_for_if_idx(self.loop0.sw_if_index) + + rcvd1 = self.pg0.get_capture(packet_count) + rcvd2 = self.pg1.get_capture(packet_count) self.verify_capture(self.loop0, self.pg2, rcvd1) self.verify_capture(self.loop0, self.pg2, rcvd2) self.assertListEqual(rcvd1.res, rcvd2.res) - def test_ip4_irb_2(self): - """ IPv4 IRB test 2 - - Test scenario: - ip traffic from pg0 and pg1 ends on pg2 - """ - + def send_and_verify_l2_to_ip(self): stream1 = self.create_stream_l2_to_ip( self.pg0, self.loop0, self.pg2, self.pg_if_packet_sizes) stream2 = self.create_stream_l2_to_ip( self.pg1, self.loop0, self.pg2, self.pg_if_packet_sizes) + self.vapi.cli("clear trace") self.pg0.add_stream(stream1) self.pg1.add_stream(stream2) self.pg_enable_capture(self.pg_interfaces) self.pg_start() - rcvd = self.pg2.get_capture() + rcvd = self.pg2.get_capture(514) self.verify_capture_l2_to_ip(self.pg2, self.loop0, rcvd) - self.assertEqual(len(stream1) + len(stream2), len(rcvd.res)) + def test_ip4_irb_2(self): + """ IPv4 IRB test 2 + + Test scenario: + - ip traffic from pg0 and pg1 ends on pg2 + """ + self.send_and_verify_l2_to_ip() + + # change the BVI's mac and resed traffic + self.loop0.set_mac(MACAddress("00:00:00:11:11:33")) + + self.send_and_verify_l2_to_ip() + # check it wasn't flooded + self.pg1.assert_nothing_captured(remark="UU Flood") if __name__ == '__main__':