vlib: add graceful termination with status
[vpp.git] / test / test_gre.py
index e73ba2f..ba20ba8 100644 (file)
@@ -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)
 
@@ -244,6 +248,7 @@ 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]
@@ -278,6 +283,9 @@ class TestGRE(VppTestCase):
                 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)
@@ -304,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]
 
@@ -329,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]
@@ -356,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]
@@ -620,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()
@@ -1056,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
@@ -1066,19 +1132,25 @@ 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,
@@ -1093,13 +1165,25 @@ 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,
@@ -1152,12 +1236,12 @@ class TestGRE(VppTestCase):
                 route_addr = "4::%d" % ii
 
                 #
-                # 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].ip6,
                                itf._remote_hosts[ii].ip6)
-                nhrp.add_vpp_config()
+                teib.add_vpp_config()
 
                 #
                 # route traffic via the peer
@@ -1188,12 +1272,12 @@ 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,