gre: don't register gre input nodes unless a gre tunnel is created 09/19809/3
authorJakub Grajciar <jgrajcia@cisco.com>
Fri, 24 May 2019 06:25:03 +0000 (08:25 +0200)
committerOle Trøan <otroan@employees.org>
Tue, 28 May 2019 08:50:21 +0000 (08:50 +0000)
Change-Id: Id5c0f420e32e0504cea660fed2013f3ad28088aa
Signed-off-by: Jakub Grajciar <jgrajcia@cisco.com>
src/vnet/gre/interface.c
src/vnet/gre/node.c
test/test_gre.py

index 2025838..ea93536 100644 (file)
@@ -306,6 +306,10 @@ vnet_gre_tunnel_add (vnet_gre_tunnel_add_del_args_t * a,
   if (sw_if_indexp)
     *sw_if_indexp = sw_if_index;
 
+  /* register gre46-input nodes */
+  ip4_register_protocol (IP_PROTOCOL_GRE, gre4_input_node.index);
+  ip6_register_protocol (IP_PROTOCOL_GRE, gre6_input_node.index);
+
   return 0;
 }
 
index ff74d1b..891fc9c 100644 (file)
@@ -577,9 +577,6 @@ gre_input_init (vlib_main_t * vm)
   gre_register_input_protocol (vm, GRE_PROTOCOL_mpls_unicast,
                               mpls_unicast_input->index, GRE_TUNNEL_TYPE_L3);
 
-  ip4_register_protocol (IP_PROTOCOL_GRE, gre4_input_node.index);
-  ip6_register_protocol (IP_PROTOCOL_GRE, gre6_input_node.index);
-
   return 0;
 }
 
index 71117ad..7936334 100644 (file)
@@ -18,6 +18,52 @@ from util import ppp, ppc
 from vpp_papi import VppEnum
 
 
+class TestGREInputNodes(VppTestCase):
+    """ GRE Input Nodes Test Case """
+
+    def setUp(self):
+        super(TestGREInputNodes, self).setUp()
+
+        # create 3 pg interfaces - set one in a non-default table.
+        self.create_pg_interfaces(range(1))
+
+        for i in self.pg_interfaces:
+            i.admin_up()
+            i.config_ip4()
+
+    def tearDown(self):
+        for i in self.pg_interfaces:
+            i.unconfig_ip4()
+            i.admin_down()
+        super(TestGREInputNodes, self).tearDown()
+
+    def test_gre_input_node(self):
+        """ GRE gre input nodes not registerd unless configured """
+        pkt = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
+               IP(src=self.pg0.remote_ip4, dst=self.pg0.local_ip4) /
+               GRE())
+
+        self.pg0.add_stream(pkt)
+        self.pg_start()
+        # no tunnel created, gre-input not registered
+        err = self.statistics.get_counter(
+            '/err/ip4-input/unknown ip protocol')[0]
+        self.assertEqual(err, 1)
+        err_count = err
+
+        # create gre tunnel
+        gre_if = VppGreInterface(self, self.pg0.local_ip4, "1.1.1.2")
+        gre_if.add_vpp_config()
+
+        self.pg0.add_stream(pkt)
+        self.pg_start()
+        # tunnel created, gre-input registered
+        err = self.statistics.get_counter(
+            '/err/ip4-input/unknown ip protocol')[0]
+        # expect no new errors
+        self.assertEqual(err, err_count)
+
+
 class TestGRE(VppTestCase):
     """ GRE Test Case """