flow-hash: Add symmetric flag for flow hashing
[vpp.git] / src / vnet / ip / punt.c
index b417427..d8c7d81 100644 (file)
@@ -27,6 +27,7 @@
 #include <vnet/pg/pg.h>
 #include <vnet/udp/udp.h>
 #include <vnet/tcp/tcp.h>
+#include <vnet/sctp/sctp.h>
 #include <vnet/ip/punt.h>
 #include <vppinfra/sparse_vec.h>
 #include <vlib/unix/unix.h>
@@ -269,7 +270,7 @@ punt_socket_register (bool is_ip4, u8 protocol, u16 port,
   punt_client_t *v = is_ip4 ? pm->clients_by_dst_port4 :
     pm->clients_by_dst_port6;
 
-  memset (&c, 0, sizeof (c));
+  clib_memset (&c, 0, sizeof (c));
   memcpy (c.caddr.sun_path, client_pathname, sizeof (c.caddr.sun_path));
   c.caddr.sun_family = AF_UNIX;
   c.port = port;
@@ -311,7 +312,7 @@ udp46_punt_socket_inline (vlib_main_t * vm,
                          vlib_node_runtime_t * node,
                          vlib_frame_t * frame, bool is_ip4)
 {
-  u32 *buffers = vlib_frame_args (frame);
+  u32 *buffers = vlib_frame_vector_args (frame);
   uword n_packets = frame->n_vectors;
   struct iovec *iovecs = 0;
   punt_main_t *pm = &punt_main;
@@ -367,7 +368,7 @@ udp46_punt_socket_inline (vlib_main_t * vm,
          c = punt_client_get (is_ip4, port);
          udp_punt_trace_t *t;
          t = vlib_add_trace (vm, node, b, sizeof (t[0]));
-         clib_memcpy (&t->client, c, sizeof (t->client));
+         clib_memcpy_fast (&t->client, c, sizeof (t->client));
        }
 
       /* Re-set iovecs if present. */
@@ -400,7 +401,7 @@ udp46_punt_socket_inline (vlib_main_t * vm,
                    }
                  udp_punt_trace_t *t;
                  t = vlib_add_trace (vm, node, b, sizeof (t[0]));
-                 clib_memcpy (&t->client, c, sizeof (t->client));
+                 clib_memcpy_fast (&t->client, c, sizeof (t->client));
                  t->is_midchain = 1;
                }
 
@@ -689,11 +690,13 @@ vnet_punt_add_del (vlib_main_t * vm, u8 ipv, u8 protocol, u16 port,
                   bool is_add)
 {
 
-  /* For now we only support UDP punt */
-  if (protocol != IP_PROTOCOL_UDP && protocol != IP_PROTOCOL_TCP)
+  /* For now we only support TCP, UDP and SCTP punt */
+  if (protocol != IP_PROTOCOL_UDP &&
+      protocol != IP_PROTOCOL_TCP && protocol != IP_PROTOCOL_SCTP)
     return clib_error_return (0,
-                             "only UDP (%d) and TCP (%d) protocols are supported, got %d",
-                             IP_PROTOCOL_UDP, IP_PROTOCOL_TCP, protocol);
+                             "only UDP (%d), TCP (%d) and SCTP (%d) protocols are supported, got %d",
+                             IP_PROTOCOL_UDP, IP_PROTOCOL_TCP,
+                             IP_PROTOCOL_SCTP, protocol);
 
   if (ipv != (u8) ~ 0 && ipv != 4 && ipv != 6)
     return clib_error_return (0, "IP version must be 4 or 6, got %d", ipv);
@@ -706,6 +709,8 @@ vnet_punt_add_del (vlib_main_t * vm, u8 ipv, u8 protocol, u16 port,
            udp_punt_unknown (vm, 1, is_add);
          else if (protocol == IP_PROTOCOL_TCP)
            tcp_punt_unknown (vm, 1, is_add);
+         else if (protocol == IP_PROTOCOL_SCTP)
+           sctp_punt_unknown (vm, 1, is_add);
        }
 
       if ((ipv == 6) || (ipv == (u8) ~ 0))
@@ -714,6 +719,8 @@ vnet_punt_add_del (vlib_main_t * vm, u8 ipv, u8 protocol, u16 port,
            udp_punt_unknown (vm, 0, is_add);
          else if (protocol == IP_PROTOCOL_TCP)
            tcp_punt_unknown (vm, 0, is_add);
+         else if (protocol == IP_PROTOCOL_SCTP)
+           sctp_punt_unknown (vm, 0, is_add);
        }
 
       return 0;
@@ -721,8 +728,9 @@ vnet_punt_add_del (vlib_main_t * vm, u8 ipv, u8 protocol, u16 port,
 
   else if (is_add)
     {
-      if (protocol == IP_PROTOCOL_TCP)
-       return clib_error_return (0, "punt TCP ports is not supported yet");
+      if (protocol == IP_PROTOCOL_TCP || protocol == IP_PROTOCOL_SCTP)
+       return clib_error_return (0,
+                                 "punt TCP/SCTP ports is not supported yet");
 
       if (ipv == 4 || ipv == (u8) ~ 0)
        udp_register_dst_port (vm, port, udp4_punt_node.index, 1);
@@ -858,7 +866,7 @@ punt_config (vlib_main_t * vm, unformat_input_t * input)
       return clib_error_return (0, "socket error");
     }
 
-  memset (&addr, 0, sizeof (addr));
+  clib_memset (&addr, 0, sizeof (addr));
   addr.sun_family = AF_UNIX;
   if (*socket_path == '\0')
     {
@@ -882,6 +890,7 @@ punt_config (vlib_main_t * vm, unformat_input_t * input)
   clib_file_t template = { 0 };
   template.read_function = punt_socket_read_ready;
   template.file_descriptor = pm->socket_fd;
+  template.description = format (0, "%s", socket_path);
   pm->clib_file_index = clib_file_add (fm, &template);
 
   pm->is_configured = true;