X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_span.py;h=ecefe153706e09472da083c026ae774ad5d9b1c2;hb=7c0eb56f40b3ccf8acd8f04e208aa50231aebeba;hp=df3d9dbfda829b9d0f81eef276a632b56ce4b797;hpb=17142b2030d89eb89439046699846cd7f08e0b1e;p=vpp.git diff --git a/test/test_span.py b/test/test_span.py index df3d9dbfda8..ecefe153706 100644 --- a/test/test_span.py +++ b/test/test_span.py @@ -1,18 +1,20 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import unittest from scapy.packet import Raw -from scapy.layers.l2 import Ether, Dot1Q, GRE +from scapy.layers.l2 import Ether, Dot1Q, GRE, ERSPAN from scapy.layers.inet import IP, UDP from scapy.layers.vxlan import VXLAN from framework import VppTestCase, VppTestRunner from util import Host, ppp -from vpp_sub_interface import VppDot1QSubint, VppDot1ADSubint -from vpp_gre_interface import VppGreInterface, VppGre6Interface -from vpp_papi_provider import L2_VTR_OP +from vpp_sub_interface import L2_VTR_OP, VppDot1QSubint, VppDot1ADSubint +from vpp_gre_interface import VppGreInterface +from vpp_vxlan_tunnel import VppVxlanTunnel from collections import namedtuple +from vpp_papi import VppEnum + Tag = namedtuple('Tag', ['dot1', 'vlan']) DOT1AD = 0x88A8 @@ -52,28 +54,26 @@ class TestSpan(VppTestCase): i.config_ip4() i.resolve_arp() - cls.vxlan = cls.vapi.vxlan_add_del_tunnel( - src_addr=cls.pg2.local_ip4n, - dst_addr=cls.pg2.remote_ip4n, - vni=1111, - is_add=1) - def setUp(self): super(TestSpan, self).setUp() + self.vxlan = VppVxlanTunnel(self, src=self.pg2.local_ip4, + dst=self.pg2.remote_ip4, vni=1111) + self.vxlan.add_vpp_config() self.reset_packet_infos() def tearDown(self): super(TestSpan, self).tearDown() - if not self.vpp_dead: - self.logger.info(self.vapi.ppcli("show interface span")) + + def show_commands_at_teardown(self): + self.logger.info(self.vapi.ppcli("show interface span")) def xconnect(self, a, b, is_add=1): self.vapi.sw_interface_set_l2_xconnect(a, b, enable=is_add) self.vapi.sw_interface_set_l2_xconnect(b, a, enable=is_add) def bridge(self, sw_if_index, is_add=1): - self.vapi.sw_interface_set_l2_bridge( - sw_if_index, bd_id=self.bd_id, enable=is_add) + self.vapi.sw_interface_set_l2_bridge(rx_sw_if_index=sw_if_index, + bd_id=self.bd_id, enable=is_add) def _remove_tag(self, packet, vlan, tag_type): self.assertEqual(packet.type, tag_type) @@ -102,6 +102,27 @@ class TestSpan(VppTestCase): return pkt[GRE].payload + def decap_erspan(self, pkt, session): + """ + Decapsulate the original payload frame by removing ERSPAN header + """ + self.assertEqual(pkt[Ether].src, self.pg2.local_mac) + self.assertEqual(pkt[Ether].dst, self.pg2.remote_mac) + + self.assertEqual(pkt[IP].src, self.pg2.local_ip4) + self.assertEqual(pkt[IP].dst, self.pg2.remote_ip4) + + self.assertEqual(pkt[ERSPAN].ver, 1) + self.assertEqual(pkt[ERSPAN].vlan, 0) + self.assertEqual(pkt[ERSPAN].cos, 0) + self.assertEqual(pkt[ERSPAN].en, 3) + self.assertEqual(pkt[ERSPAN].t, 0) + self.assertEqual(pkt[ERSPAN].session_id, session) + self.assertEqual(pkt[ERSPAN].reserved, 0) + self.assertEqual(pkt[ERSPAN].index, 0) + + return pkt[ERSPAN].payload + def decap_vxlan(self, pkt): """ Decapsulate the original payload frame by removing VXLAN header @@ -123,7 +144,7 @@ class TestSpan(VppTestCase): for i in range(0, self.pkts_per_burst): payload = "span test" - size = packet_sizes[(i / 2) % len(packet_sizes)] + size = packet_sizes[int((i / 2) % len(packet_sizes))] p = (Ether(src=src_if.local_mac, dst=dst_mac) / IP(src=src_if.remote_ip4, dst=dst_if.remote_ip4) / UDP(sport=10000 + src_if.sw_if_index * 1000 + i, dport=1234) / @@ -214,7 +235,7 @@ class TestSpan(VppTestCase): self.sub_if.admin_up() self.vapi.sw_interface_set_flags(self.vxlan.sw_if_index, - admin_up_down=1) + flags=1) self.bridge(self.vxlan.sw_if_index, is_add=1) # Create bi-directional cross-connects between pg0 subif and pg1 @@ -245,6 +266,55 @@ class TestSpan(VppTestCase): self.xconnect(self.sub_if.sw_if_index, self.pg1.sw_if_index, is_add=0) self.verify_capture(pg1_pkts, pg2_pkts) + def test_span_l2_rx_dst_gre_erspan(self): + """ SPAN l2 rx mirror into gre-erspan """ + + self.sub_if.admin_up() + + gre_if = VppGreInterface(self, self.pg2.local_ip4, + self.pg2.remote_ip4, + session=543, + type=(VppEnum.vl_api_gre_tunnel_type_t. + GRE_API_TUNNEL_TYPE_ERSPAN)) + + gre_if.add_vpp_config() + gre_if.admin_up() + + self.bridge(gre_if.sw_if_index) + # Create bi-directional cross-connects between pg0 and pg1 + self.xconnect(self.sub_if.sw_if_index, self.pg1.sw_if_index, is_add=1) + + # Create incoming packet streams for packet-generator interfaces + pkts = self.create_stream( + self.pg0, self.pg_if_packet_sizes, do_dot1=True) + self.pg0.add_stream(pkts) + + # Enable SPAN on pg0 sub if (mirrored to gre-erspan) + self.vapi.sw_interface_span_enable_disable( + self.sub_if.sw_if_index, gre_if.sw_if_index, is_l2=1) + + # Enable packet capturing and start packet sending + self.pg_enable_capture(self.pg_interfaces) + self.pg_start() + + # Verify packets outgoing packet streams on mirrored interface (pg2) + n_pkts = len(pkts) + pg1_pkts = self.pg1.get_capture(n_pkts) + pg2_pkts = self.pg2.get_capture(n_pkts) + + def decap(p): return self.decap_erspan(p, session=543) + pg2_decaped = [decap(p) for p in pg2_pkts] + + self.bridge(gre_if.sw_if_index, is_add=0) + + # Disable SPAN on pg0 sub if + self.vapi.sw_interface_span_enable_disable( + self.sub_if.sw_if_index, gre_if.sw_if_index, state=0, is_l2=1) + gre_if.remove_vpp_config() + self.xconnect(self.sub_if.sw_if_index, self.pg1.sw_if_index, is_add=0) + + self.verify_capture(pg1_pkts, pg2_decaped) + def test_span_l2_rx_dst_gre_subif_vtr(self): """ SPAN l2 rx mirror into gre-subif+vtr """ @@ -252,7 +322,8 @@ class TestSpan(VppTestCase): gre_if = VppGreInterface(self, self.pg2.local_ip4, self.pg2.remote_ip4, - is_teb=1) + type=(VppEnum.vl_api_gre_tunnel_type_t. + GRE_API_TUNNEL_TYPE_TEB)) gre_if.add_vpp_config() gre_if.admin_up() @@ -270,6 +341,7 @@ class TestSpan(VppTestCase): self.pg0, self.pg_if_packet_sizes, do_dot1=True) self.pg0.add_stream(pkts) + # Enable SPAN on pg0 sub if (mirrored to gre sub if) self.vapi.sw_interface_span_enable_disable( self.sub_if.sw_if_index, gre_sub_if.sw_if_index, is_l2=1) @@ -456,9 +528,9 @@ class TestSpan(VppTestCase): # Create bi-directional cross-connects between pg0 and pg1 self.vapi.sw_interface_set_l2_bridge( - self.sub_if.sw_if_index, bd_id=99, enable=1) + rx_sw_if_index=self.sub_if.sw_if_index, bd_id=99, enable=1) self.vapi.sw_interface_set_l2_bridge( - self.pg1.sw_if_index, bd_id=99, enable=1) + rx_sw_if_index=self.pg1.sw_if_index, bd_id=99, enable=1) # Create incoming packet streams for packet-generator interfaces pg0_pkts = self.create_stream( @@ -488,9 +560,9 @@ class TestSpan(VppTestCase): self.bridge(self.pg2.sw_if_index, is_add=0) self.vapi.sw_interface_set_l2_bridge( - self.sub_if.sw_if_index, bd_id=99, enable=0) + rx_sw_if_index=self.sub_if.sw_if_index, bd_id=99, enable=0) self.vapi.sw_interface_set_l2_bridge( - self.pg1.sw_if_index, bd_id=99, enable=0) + rx_sw_if_index=self.pg1.sw_if_index, bd_id=99, enable=0) # Disable SPAN on pg0 (mirrored to pg2) self.vapi.sw_interface_span_enable_disable( self.sub_if.sw_if_index, self.pg2.sw_if_index, state=0, is_l2=1)