punt: fix the set_punt API/CLI which was rejecting valid ports 55/19955/2
authorNeale Ranns <nranns@cisco.com>
Tue, 4 Jun 2019 13:31:23 +0000 (13:31 +0000)
committerDave Barach <openvpp@barachs.net>
Tue, 4 Jun 2019 15:55:31 +0000 (15:55 +0000)
add a UT for the API

Change-Id: I93fb6ec2c5f74b991bf7f229250a30c0395b8e24
Signed-off-by: Neale Ranns <nranns@cisco.com>
src/vnet/ip/punt.c
test/test_ip4.py

index 296df59..6f32150 100644 (file)
@@ -397,9 +397,6 @@ punt_l4_add_del (vlib_main_t * vm,
        return clib_error_return (0,
                                  "punt TCP/SCTP ports is not supported yet");
 
-      if (!udp_is_valid_dst_port (port, af == AF_IP4))
-       return clib_error_return (0, "invalid port: %d", port);
-
       udp_register_dst_port (vm, port, udp4_punt_node.index, af == AF_IP4);
 
       return 0;
@@ -438,16 +435,19 @@ punt_cli (vlib_main_t * vm,
 {
   clib_error_t *error = NULL;
   bool is_add = true;
+  /* *INDENT-OFF* */
   punt_reg_t pr = {
     .punt = {
-            .l4 = {
-                   .af = AF_IP4,
-                   .port = ~0,
-                   .protocol = ~0,
-                   },
-            },
+      .l4 = {
+        .af = AF_IP4,
+        .port = ~0,
+        .protocol = ~0,
+      },
+    },
     .type = PUNT_TYPE_L4,
   };
+  u32 port;
+  /* *INDENT-ON* */
 
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
@@ -457,8 +457,8 @@ punt_cli (vlib_main_t * vm,
        pr.punt.l4.af = AF_IP6;
       else if (unformat (input, "ip6"))
        pr.punt.l4.af = AF_IP6;
-      else if (unformat (input, "%d", &pr.punt.l4.port))
-       ;
+      else if (unformat (input, "%d", &port))
+       pr.punt.l4.port = port;
       else if (unformat (input, "udp"))
        pr.punt.l4.protocol = IP_PROTOCOL_UDP;
       else if (unformat (input, "tcp"))
index 346904a..6d6aeb0 100644 (file)
@@ -17,6 +17,7 @@ from vpp_ip_route import VppIpRoute, VppRoutePath, VppIpMRoute, \
     VppMRoutePath, MRouteItfFlags, MRouteEntryFlags, VppMplsIpBind, \
     VppMplsTable, VppIpTable
 from vpp_sub_interface import VppSubInterface, VppDot1QSubint, VppDot1ADSubint
+from vpp_papi import VppEnum
 
 NUM_PKTS = 67
 
@@ -1281,10 +1282,28 @@ class TestIPPunt(VppTestCase):
     def test_ip_punt(self):
         """ IP punt police and redirect """
 
+        # use UDP packet that have a port we need to explicitly
+        # register to get punted.
+        pt_l4 = VppEnum.vl_api_punt_type_t.PUNT_API_TYPE_L4
+        af_ip4 = VppEnum.vl_api_address_family_t.ADDRESS_IP4
+        udp_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_UDP
+        punt_udp = {
+            'type': pt_l4,
+            'punt': {
+                'l4': {
+                    'af': af_ip4,
+                    'protocol': udp_proto,
+                    'port': 1234,
+                }
+            }
+        }
+
+        self.vapi.set_punt(is_add=1, punt=punt_udp)
+
         p = (Ether(src=self.pg0.remote_mac,
                    dst=self.pg0.local_mac) /
              IP(src=self.pg0.remote_ip4, dst=self.pg0.local_ip4) /
-             TCP(sport=1234, dport=1234) /
+             UDP(sport=1234, dport=1234) /
              Raw('\xa5' * 100))
 
         pkts = p * 1025