X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_gre.py;h=ba20ba8dec05574bba2de3e5864e63fa8310e39f;hb=ee04de552d1749948e8802c2c6a87646f3b81625;hp=f8c410050e107309e1dc5973a7213d437c520b15;hpb=59ff918ea5b86112ffc89054aa38107703354585;p=vpp.git diff --git a/test/test_gre.py b/test/test_gre.py index f8c410050e1..ba20ba8dec0 100644 --- a/test/test_gre.py +++ b/test/test_gre.py @@ -9,16 +9,20 @@ from scapy.layers.inet import IP, UDP from scapy.layers.inet6 import IPv6 from scapy.volatile import RandMAC, RandIP +from framework import tag_fixme_vpp_workers from framework import VppTestCase, VppTestRunner from vpp_sub_interface import L2_VTR_OP, VppDot1QSubint from vpp_gre_interface import VppGreInterface -from vpp_nhrp import VppNhrp +from vpp_teib import VppTeib from vpp_ip import DpoProto -from vpp_ip_route import VppIpRoute, VppRoutePath, VppIpTable, FibPathProto +from vpp_ip_route import VppIpRoute, VppRoutePath, VppIpTable, FibPathProto, \ + VppMplsLabel +from vpp_mpls_tunnel_interface import VppMPLSTunnelInterface from util import ppp, ppc from vpp_papi import VppEnum +@tag_fixme_vpp_workers class TestGREInputNodes(VppTestCase): """ GRE Input Nodes Test Case """ @@ -48,7 +52,7 @@ class TestGREInputNodes(VppTestCase): self.pg_start() # no tunnel created, gre-input not registered err = self.statistics.get_counter( - '/err/ip4-input/unknown ip protocol')[0] + '/err/ip4-local/unknown ip protocol')[0] self.assertEqual(err, 1) err_count = err @@ -60,7 +64,7 @@ class TestGREInputNodes(VppTestCase): self.pg_start() # tunnel created, gre-input registered err = self.statistics.get_counter( - '/err/ip4-input/unknown ip protocol')[0] + '/err/ip4-local/unknown ip protocol')[0] # expect no new errors self.assertEqual(err, err_count) @@ -108,26 +112,28 @@ class TestGRE(VppTestCase): self.pg1.set_table_ip4(0) super(TestGRE, self).tearDown() - def create_stream_ip4(self, src_if, src_ip, dst_ip): + def create_stream_ip4(self, src_if, src_ip, dst_ip, dscp=0, ecn=0): pkts = [] + tos = (dscp << 2) | ecn for i in range(0, 257): info = self.create_packet_info(src_if, src_if) payload = self.info_to_payload(info) p = (Ether(dst=src_if.local_mac, src=src_if.remote_mac) / - IP(src=src_ip, dst=dst_ip) / + IP(src=src_ip, dst=dst_ip, tos=tos) / UDP(sport=1234, dport=1234) / Raw(payload)) info.data = p.copy() pkts.append(p) return pkts - def create_stream_ip6(self, src_if, src_ip, dst_ip): + def create_stream_ip6(self, src_if, src_ip, dst_ip, dscp=0, ecn=0): pkts = [] + tc = (dscp << 2) | ecn for i in range(0, 257): info = self.create_packet_info(src_if, src_if) payload = self.info_to_payload(info) p = (Ether(dst=src_if.local_mac, src=src_if.remote_mac) / - IPv6(src=src_ip, dst=dst_ip) / + IPv6(src=src_ip, dst=dst_ip, tc=tc) / UDP(sport=1234, dport=1234) / Raw(payload)) info.data = p.copy() @@ -225,9 +231,11 @@ class TestGRE(VppTestCase): return pkts def verify_tunneled_4o4(self, src_if, capture, sent, - tunnel_src, tunnel_dst): + tunnel_src, tunnel_dst, + dscp=0, ecn=0): self.assertEqual(len(capture), len(sent)) + tos = (dscp << 2) | ecn for i in range(len(capture)): try: @@ -239,6 +247,8 @@ class TestGRE(VppTestCase): self.assertEqual(rx_ip.src, tunnel_src) self.assertEqual(rx_ip.dst, tunnel_dst) + self.assertEqual(rx_ip.tos, tos) + self.assertEqual(rx_ip.len, len(rx_ip)) rx_gre = rx[GRE] rx_ip = rx_gre[IP] @@ -254,9 +264,11 @@ class TestGRE(VppTestCase): raise def verify_tunneled_6o6(self, src_if, capture, sent, - tunnel_src, tunnel_dst): + tunnel_src, tunnel_dst, + dscp=0, ecn=0): self.assertEqual(len(capture), len(sent)) + tc = (dscp << 2) | ecn for i in range(len(capture)): try: @@ -268,8 +280,12 @@ class TestGRE(VppTestCase): self.assertEqual(rx_ip.src, tunnel_src) self.assertEqual(rx_ip.dst, tunnel_dst) + self.assertEqual(rx_ip.tc, tc) rx_gre = GRE(scapy.compat.raw(rx_ip[IPv6].payload)) + + self.assertEqual(rx_ip.plen, len(rx_gre)) + rx_ip = rx_gre[IPv6] self.assertEqual(rx_ip.src, tx_ip.src) @@ -296,6 +312,9 @@ class TestGRE(VppTestCase): self.assertEqual(rx_ip.dst, tunnel_dst) rx_gre = GRE(scapy.compat.raw(rx_ip[IPv6].payload)) + + self.assertEqual(rx_ip.plen, len(rx_gre)) + tx_ip = tx[IP] rx_ip = rx_gre[IP] @@ -321,6 +340,7 @@ class TestGRE(VppTestCase): self.assertEqual(rx_ip.src, tunnel_src) self.assertEqual(rx_ip.dst, tunnel_dst) + self.assertEqual(rx_ip.len, len(rx_ip)) rx_gre = GRE(scapy.compat.raw(rx_ip[IP].payload)) rx_ip = rx_gre[IPv6] @@ -348,6 +368,7 @@ class TestGRE(VppTestCase): self.assertEqual(rx_ip.src, tunnel_src) self.assertEqual(rx_ip.dst, tunnel_dst) + self.assertEqual(rx_ip.len, len(rx_ip)) rx_gre = rx[GRE] rx_l2 = rx_gre[Ether] @@ -612,12 +633,64 @@ class TestGRE(VppTestCase): self.verify_tunneled_6o4(self.pg0, rx, tx, self.pg0.local_ip4, "1.1.1.2") + # + # add a labelled route through the tunnel + # + label_via_tun = VppIpRoute(self, "5.4.3.2", 32, + [VppRoutePath("0.0.0.0", + gre_if.sw_if_index, + labels=[VppMplsLabel(33)])]) + label_via_tun.add_vpp_config() + + tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "5.4.3.2") + rx = self.send_and_expect(self.pg0, tx, self.pg0) + self.verify_tunneled_4o4(self.pg0, rx, tx, + self.pg0.local_ip4, "1.1.1.2") + + # + # an MPLS tunnel over the GRE tunnel add a route through + # the mpls tunnel + # + mpls_tun = VppMPLSTunnelInterface( + self, + [VppRoutePath("0.0.0.0", + gre_if.sw_if_index, + labels=[VppMplsLabel(44), + VppMplsLabel(46)])]) + mpls_tun.add_vpp_config() + mpls_tun.admin_up() + + label_via_mpls = VppIpRoute(self, "5.4.3.1", 32, + [VppRoutePath("0.0.0.0", + mpls_tun.sw_if_index, + labels=[VppMplsLabel(33)])]) + label_via_mpls.add_vpp_config() + + tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "5.4.3.1") + rx = self.send_and_expect(self.pg0, tx, self.pg0) + self.verify_tunneled_4o4(self.pg0, rx, tx, + self.pg0.local_ip4, "1.1.1.2") + + mpls_tun_l2 = VppMPLSTunnelInterface( + self, + [VppRoutePath("0.0.0.0", + gre_if.sw_if_index, + labels=[VppMplsLabel(44), + VppMplsLabel(46)])], + is_l2=1) + mpls_tun_l2.add_vpp_config() + mpls_tun_l2.admin_up() + # # test case cleanup # route_tun_dst.remove_vpp_config() route_via_tun.remove_vpp_config() route6_via_tun.remove_vpp_config() + label_via_mpls.remove_vpp_config() + label_via_tun.remove_vpp_config() + mpls_tun.remove_vpp_config() + mpls_tun_l2.remove_vpp_config() gre_if.remove_vpp_config() self.pg0.unconfig_ip6() @@ -719,6 +792,8 @@ class TestGRE(VppTestCase): def test_gre_vrf(self): """ GRE tunnel VRF Tests """ + e = VppEnum.vl_api_tunnel_encap_decap_flags_t + # # Create an L3 GRE tunnel whose destination is in the non-default # table. The underlay is thus non-default - the overlay is still @@ -726,9 +801,13 @@ class TestGRE(VppTestCase): # - set it admin up # - assign an IP Addres # - gre_if = VppGreInterface(self, self.pg1.local_ip4, - "2.2.2.2", - outer_table_id=1) + gre_if = VppGreInterface( + self, self.pg1.local_ip4, + "2.2.2.2", + outer_table_id=1, + flags=(e.TUNNEL_API_ENCAP_DECAP_FLAG_ENCAP_COPY_DSCP | + e.TUNNEL_API_ENCAP_DECAP_FLAG_ENCAP_COPY_ECN)) + gre_if.add_vpp_config() gre_if.admin_up() gre_if.config_ip4() @@ -756,10 +835,12 @@ class TestGRE(VppTestCase): # - packets are GRE encapped # self.vapi.cli("clear trace") - tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "9.9.9.9") + tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "9.9.9.9", + dscp=5, ecn=3) rx = self.send_and_expect(self.pg0, tx, self.pg1) self.verify_tunneled_4o4(self.pg1, rx, tx, - self.pg1.local_ip4, "2.2.2.2") + self.pg1.local_ip4, "2.2.2.2", + dscp=5, ecn=3) # # Send tunneled packets that match the created tunnel and @@ -1040,6 +1121,7 @@ class TestGRE(VppTestCase): # for ii in range(1, 4): route_addr = "4.4.4.%d" % ii + tx_e = self.create_stream_ip4(self.pg0, "5.5.5.5", route_addr) # # route traffic via the peer @@ -1050,23 +1132,29 @@ class TestGRE(VppTestCase): gre_if.sw_if_index)]) route_via_tun.add_vpp_config() + # all packets dropped at this point + rx = self.send_and_assert_no_replies(self.pg0, tx_e) + + gre_if.admin_down() + gre_if.admin_up() + rx = self.send_and_assert_no_replies(self.pg0, tx_e) + # - # Add a NHRP entry resolves the peer + # Add a TEIB entry resolves the peer # - nhrp = VppNhrp(self, gre_if, + teib = VppTeib(self, gre_if, gre_if._remote_hosts[ii].ip4, itf._remote_hosts[ii].ip4) - nhrp.add_vpp_config() + teib.add_vpp_config() # # Send a packet stream that is routed into the tunnel # - packets are GRE encapped # - tx_e = self.create_stream_ip4(self.pg0, "5.5.5.5", route_addr) rx = self.send_and_expect(self.pg0, tx_e, itf) self.verify_tunneled_4o4(self.pg0, rx, tx_e, itf.local_ip4, - gre_if._remote_hosts[ii].ip4) + itf._remote_hosts[ii].ip4) tx_i = self.create_tunnel_stream_4o4(self.pg0, itf._remote_hosts[ii].ip4, @@ -1077,17 +1165,29 @@ class TestGRE(VppTestCase): self.verify_decapped_4o4(self.pg0, rx, tx_i) # - # delete and re-add the NHRP + # delete and re-add the TEIB # - nhrp.remove_vpp_config() + teib.remove_vpp_config() self.send_and_assert_no_replies(self.pg0, tx_e) self.send_and_assert_no_replies(self.pg0, tx_i) - nhrp.add_vpp_config() + teib.add_vpp_config() + rx = self.send_and_expect(self.pg0, tx_e, itf) + self.verify_tunneled_4o4(self.pg0, rx, tx_e, + itf.local_ip4, + itf._remote_hosts[ii].ip4) + rx = self.send_and_expect(self.pg0, tx_i, self.pg0) + self.verify_decapped_4o4(self.pg0, rx, tx_i) + + # + # bounce the interface state and try packets again + # + gre_if.admin_down() + gre_if.admin_up() rx = self.send_and_expect(self.pg0, tx_e, itf) self.verify_tunneled_4o4(self.pg0, rx, tx_e, itf.local_ip4, - gre_if._remote_hosts[ii].ip4) + itf._remote_hosts[ii].ip4) rx = self.send_and_expect(self.pg0, tx_i, self.pg0) self.verify_decapped_4o4(self.pg0, rx, tx_i) @@ -1100,6 +1200,8 @@ class TestGRE(VppTestCase): self.pg0.config_ip6() self.pg0.resolve_ndp() + e = VppEnum.vl_api_tunnel_encap_decap_flags_t + for itf in self.pg_interfaces[3:]: # # one underlay nh for each overlay/tunnel peer @@ -1114,11 +1216,14 @@ class TestGRE(VppTestCase): # - assign an IP Addres # - Add a route via the tunnel # - gre_if = VppGreInterface(self, - itf.local_ip6, - "::", - mode=(VppEnum.vl_api_tunnel_mode_t. - TUNNEL_API_MODE_MP)) + gre_if = VppGreInterface( + self, + itf.local_ip6, + "::", + mode=(VppEnum.vl_api_tunnel_mode_t. + TUNNEL_API_MODE_MP), + flags=e.TUNNEL_API_ENCAP_DECAP_FLAG_ENCAP_COPY_DSCP) + gre_if.add_vpp_config() gre_if.admin_up() gre_if.config_ip6() @@ -1130,6 +1235,14 @@ class TestGRE(VppTestCase): for ii in range(1, 4): route_addr = "4::%d" % ii + # + # Add a TEIB entry resolves the peer + # + teib = VppTeib(self, gre_if, + gre_if._remote_hosts[ii].ip6, + itf._remote_hosts[ii].ip6) + teib.add_vpp_config() + # # route traffic via the peer # @@ -1139,23 +1252,17 @@ class TestGRE(VppTestCase): gre_if.sw_if_index)]) route_via_tun.add_vpp_config() - # - # Add a NHRP entry resolves the peer - # - nhrp = VppNhrp(self, gre_if, - gre_if._remote_hosts[ii].ip6, - itf._remote_hosts[ii].ip6) - nhrp.add_vpp_config() - # # Send a packet stream that is routed into the tunnel # - packets are GRE encapped # - tx_e = self.create_stream_ip6(self.pg0, "5::5", route_addr) + tx_e = self.create_stream_ip6(self.pg0, "5::5", route_addr, + dscp=2, ecn=1) rx = self.send_and_expect(self.pg0, tx_e, itf) self.verify_tunneled_6o6(self.pg0, rx, tx_e, itf.local_ip6, - gre_if._remote_hosts[ii].ip6) + itf._remote_hosts[ii].ip6, + dscp=2) tx_i = self.create_tunnel_stream_6o6(self.pg0, itf._remote_hosts[ii].ip6, itf.local_ip6, @@ -1165,16 +1272,17 @@ class TestGRE(VppTestCase): self.verify_decapped_6o6(self.pg0, rx, tx_i) # - # delete and re-add the NHRP + # delete and re-add the TEIB # - nhrp.remove_vpp_config() + teib.remove_vpp_config() self.send_and_assert_no_replies(self.pg0, tx_e) - nhrp.add_vpp_config() + teib.add_vpp_config() rx = self.send_and_expect(self.pg0, tx_e, itf) self.verify_tunneled_6o6(self.pg0, rx, tx_e, itf.local_ip6, - gre_if._remote_hosts[ii].ip6) + itf._remote_hosts[ii].ip6, + dscp=2) rx = self.send_and_expect(self.pg0, tx_i, self.pg0) self.verify_decapped_6o6(self.pg0, rx, tx_i)