c11 safe string handling support
[vpp.git] / src / plugins / nsh / nsh.c
index 33cf552..d9b625c 100644 (file)
@@ -63,6 +63,10 @@ typedef enum
 #include <nsh/nsh.api.h>
 #undef vl_msg_name_crc_list
 
+/*  Dummy Eth header */
+const char dummy_dst_address[6] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
+const char dummy_src_address[6] = { 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc };
+
 /*
  * A handy macro to set up a message reply.
  * Assumes that the following variables are available:
@@ -150,7 +154,7 @@ nsh_md2_register_option (u16 class,
 
   pool_get_aligned (nm->nsh_option_mappings, nsh_option,
                    CLIB_CACHE_LINE_BYTES);
-  memset (nsh_option, 0, sizeof (*nsh_option));
+  clib_memset (nsh_option, 0, sizeof (*nsh_option));
   nsh_option->option_id = nsh_option - nm->nsh_option_mappings;
 
   key_copy = clib_mem_alloc (sizeof (*key_copy));
@@ -523,7 +527,7 @@ nsh_add_del_map (nsh_add_del_map_args_t * a, u32 * map_indexp)
        return -1;              //TODO API_ERROR_INVALID_VALUE;
 
       pool_get_aligned (nm->nsh_mappings, map, CLIB_CACHE_LINE_BYTES);
-      memset (map, 0, sizeof (*map));
+      clib_memset (map, 0, sizeof (*map));
 
       /* copy from arg structure */
       map->nsp_nsi = a->map.nsp_nsi;
@@ -610,7 +614,7 @@ nsh_add_del_proxy_session (nsh_add_del_map_args_t * a)
   hash_pair_t *hp;
   u32 nsp = 0, nsi = 0;
 
-  memset (&key, 0, sizeof (key));
+  clib_memset (&key, 0, sizeof (key));
   key.transport_type = a->map.next_node;
   key.transport_index = a->map.sw_if_index;
 
@@ -623,7 +627,7 @@ nsh_add_del_proxy_session (nsh_add_del_map_args_t * a)
        return -1;              //TODO API_ERROR_INVALID_VALUE;
 
       pool_get_aligned (nm->nsh_proxy_sessions, proxy, CLIB_CACHE_LINE_BYTES);
-      memset (proxy, 0, sizeof (*proxy));
+      clib_memset (proxy, 0, sizeof (*proxy));
 
       /* Nsi needs to minus 1 within NSH-Proxy */
       nsp = (a->map.nsp_nsi >> NSH_NSP_SHIFT) & NSH_NSP_MASK;
@@ -779,7 +783,7 @@ nsh_add_del_map_command_fn (vlib_main_t * vm,
     return clib_error_return (0,
                              "must specific action: [encap-gre-intf <nn> | encap-vxlan-gpe-intf <nn> | encap-lisp-gpe-intf <nn> | encap-none <tx_sw_if_index> <rx_sw_if_index>]");
 
-  memset (a, 0, sizeof (*a));
+  clib_memset (a, 0, sizeof (*a));
 
   /* set args structure */
   a->is_add = is_add;
@@ -929,7 +933,7 @@ nsh_header_rewrite (nsh_entry_t * nsh_entry)
       len = MAX_NSH_HEADER_LEN;
     }
   vec_validate_aligned (rw, len - 1, CLIB_CACHE_LINE_BYTES);
-  memset (rw, 0, len);
+  clib_memset (rw, 0, len);
 
   nsh_base = (nsh_base_header_t *) rw;
   nsh_base->ver_o_c = nsh_entry->nsh_base.ver_o_c;
@@ -1029,7 +1033,7 @@ nsh_add_del_entry (nsh_add_del_entry_args_t * a, u32 * entry_indexp)
        return -1;              // TODO VNET_API_ERROR_INVALID_VALUE;
 
       pool_get_aligned (nm->nsh_entries, nsh_entry, CLIB_CACHE_LINE_BYTES);
-      memset (nsh_entry, 0, sizeof (*nsh_entry));
+      clib_memset (nsh_entry, 0, sizeof (*nsh_entry));
 
       /* copy from arg structure */
 #define _(x) nsh_entry->nsh_base.x = a->nsh_entry.nsh_base.x;
@@ -1181,7 +1185,7 @@ nsh_add_del_entry_command_fn (vlib_main_t * vm,
 
   nsp_nsi = (nsp << 8) | nsi;
 
-  memset (a, 0, sizeof (*a));
+  clib_memset (a, 0, sizeof (*a));
   a->is_add = is_add;
 
   if (md_type == 1)
@@ -1314,7 +1318,7 @@ static void send_nsh_entry_details
   nsh_main_t *nm = &nsh_main;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
-  memset (rmp, 0, sizeof (*rmp));
+  clib_memset (rmp, 0, sizeof (*rmp));
 
   rmp->_vl_msg_id = ntohs ((VL_API_NSH_ENTRY_DETAILS) + nm->msg_id_base);
   rmp->ver_o_c = t->nsh_base.ver_o_c;
@@ -1387,7 +1391,7 @@ static void send_nsh_map_details
   nsh_main_t *nm = &nsh_main;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
-  memset (rmp, 0, sizeof (*rmp));
+  clib_memset (rmp, 0, sizeof (*rmp));
 
   rmp->_vl_msg_id = ntohs ((VL_API_NSH_MAP_DETAILS) + nm->msg_id_base);
   rmp->nsp_nsi = htonl (t->nsp_nsi);
@@ -1742,6 +1746,9 @@ nsh_input_map (vlib_main_t * vm,
          b0 = vlib_get_buffer (vm, bi0);
          b1 = vlib_get_buffer (vm, bi1);
          hdr0 = vlib_buffer_get_current (b0);
+         hdr1 = vlib_buffer_get_current (b1);
+
+         /* Process packet 0 */
          if (node_type == NSH_INPUT_TYPE)
            {
              nsp_nsi0 = hdr0->nsp_nsi;
@@ -1764,10 +1771,8 @@ nsh_input_map (vlib_main_t * vm,
          else if (node_type == NSH_AWARE_VNF_PROXY_TYPE)
            {
              /* Push dummy Eth header */
-             memset (&dummy_eth0.dst_address[0], 0x11223344, 4);
-             memset (&dummy_eth0.dst_address[4], 0x5566, 2);
-             memset (&dummy_eth0.src_address[0], 0x778899aa, 4);
-             memset (&dummy_eth0.src_address[4], 0xbbcc, 2);
+             clib_memcpy (dummy_eth0.dst_address, dummy_dst_address, 6);
+             clib_memcpy (dummy_eth0.src_address, dummy_src_address, 6);
              dummy_eth0.type = 0x0800;
              vlib_buffer_advance (b0, -(word) sizeof (ethernet_header_t));
              hdr0 = vlib_buffer_get_current (b0);
@@ -1779,7 +1784,7 @@ nsh_input_map (vlib_main_t * vm,
            }
          else
            {
-             memset (&key0, 0, sizeof (key0));
+             clib_memset (&key0, 0, sizeof (key0));
              key0.transport_type = NSH_NODE_NEXT_ENCAP_VXLAN4;
              key0.transport_index = vnet_buffer (b0)->sw_if_index[VLIB_RX];
 
@@ -1799,65 +1804,6 @@ nsh_input_map (vlib_main_t * vm,
              nsp_nsi0 = proxy0->nsp_nsi;
            }
 
-         hdr1 = vlib_buffer_get_current (b1);
-         if (node_type == NSH_INPUT_TYPE)
-           {
-             nsp_nsi1 = hdr1->nsp_nsi;
-             header_len1 = (hdr1->length & NSH_LEN_MASK) * 4;
-             ttl1 = (hdr1->ver_o_c & NSH_TTL_H4_MASK) << 2 |
-               (hdr1->length & NSH_TTL_L2_MASK) >> 6;
-             ttl1 = ttl1 - 1;
-             if (PREDICT_FALSE (ttl1 == 0))
-               {
-                 error1 = NSH_NODE_ERROR_INVALID_TTL;
-                 goto trace1;
-               }
-           }
-         else if (node_type == NSH_CLASSIFIER_TYPE)
-           {
-             nsp_nsi1 =
-               clib_host_to_net_u32 (vnet_buffer (b1)->
-                                     l2_classify.opaque_index);
-           }
-         else if (node_type == NSH_AWARE_VNF_PROXY_TYPE)
-           {
-             /* Push dummy Eth header */
-             memset (&dummy_eth1.dst_address[0], 0x11223344, 4);
-             memset (&dummy_eth1.dst_address[4], 0x5566, 2);
-             memset (&dummy_eth1.src_address[0], 0x778899aa, 4);
-             memset (&dummy_eth1.src_address[4], 0xbbcc, 2);
-             dummy_eth1.type = 0x0800;
-             vlib_buffer_advance (b1, -(word) sizeof (ethernet_header_t));
-             hdr1 = vlib_buffer_get_current (b1);
-             clib_memcpy (hdr1, &dummy_eth1,
-                          (word) sizeof (ethernet_header_t));
-
-             sw_if_index1 = vnet_buffer (b1)->sw_if_index[VLIB_TX];
-             nsp_nsi1 = nm->tunnel_index_by_sw_if_index[sw_if_index1];
-           }
-         else
-           {
-             memset (&key1, 0, sizeof (key1));
-             key1.transport_type = NSH_NODE_NEXT_ENCAP_VXLAN4;
-             key1.transport_index = vnet_buffer (b1)->sw_if_index[VLIB_RX];
-
-             p1 = hash_get_mem (nm->nsh_proxy_session_by_key, &key1);
-             if (PREDICT_FALSE (p1 == 0))
-               {
-                 error1 = NSH_NODE_ERROR_NO_PROXY;
-                 goto trace1;
-               }
-
-             proxy1 = pool_elt_at_index (nm->nsh_proxy_sessions, p1[0]);
-             if (PREDICT_FALSE (proxy1 == 0))
-               {
-                 error1 = NSH_NODE_ERROR_NO_PROXY;
-                 goto trace1;
-               }
-             nsp_nsi1 = proxy1->nsp_nsi;
-           }
-
-         /* Process packet 0 */
          entry0 = hash_get_mem (nm->nsh_mapping_by_key, &nsp_nsi0);
          if (PREDICT_FALSE (entry0 == 0))
            {
@@ -1956,7 +1902,8 @@ nsh_input_map (vlib_main_t * vm,
 
            }
 
-       trace0:b0->error = error0 ? node->errors[error0] : 0;
+       trace0:
+         b0->error = error0 ? node->errors[error0] : 0;
 
          if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
            {
@@ -1967,6 +1914,61 @@ nsh_input_map (vlib_main_t * vm,
            }
 
          /* Process packet 1 */
+         if (node_type == NSH_INPUT_TYPE)
+           {
+             nsp_nsi1 = hdr1->nsp_nsi;
+             header_len1 = (hdr1->length & NSH_LEN_MASK) * 4;
+             ttl1 = (hdr1->ver_o_c & NSH_TTL_H4_MASK) << 2 |
+               (hdr1->length & NSH_TTL_L2_MASK) >> 6;
+             ttl1 = ttl1 - 1;
+             if (PREDICT_FALSE (ttl1 == 0))
+               {
+                 error1 = NSH_NODE_ERROR_INVALID_TTL;
+                 goto trace1;
+               }
+           }
+         else if (node_type == NSH_CLASSIFIER_TYPE)
+           {
+             nsp_nsi1 =
+               clib_host_to_net_u32 (vnet_buffer (b1)->
+                                     l2_classify.opaque_index);
+           }
+         else if (node_type == NSH_AWARE_VNF_PROXY_TYPE)
+           {
+             /* Push dummy Eth header */
+             clib_memcpy (dummy_eth1.dst_address, dummy_dst_address, 6);
+             clib_memcpy (dummy_eth1.src_address, dummy_src_address, 6);
+             dummy_eth1.type = 0x0800;
+             vlib_buffer_advance (b1, -(word) sizeof (ethernet_header_t));
+             hdr1 = vlib_buffer_get_current (b1);
+             clib_memcpy (hdr1, &dummy_eth1,
+                          (word) sizeof (ethernet_header_t));
+
+             sw_if_index1 = vnet_buffer (b1)->sw_if_index[VLIB_TX];
+             nsp_nsi1 = nm->tunnel_index_by_sw_if_index[sw_if_index1];
+           }
+         else
+           {
+             clib_memset (&key1, 0, sizeof (key1));
+             key1.transport_type = NSH_NODE_NEXT_ENCAP_VXLAN4;
+             key1.transport_index = vnet_buffer (b1)->sw_if_index[VLIB_RX];
+
+             p1 = hash_get_mem (nm->nsh_proxy_session_by_key, &key1);
+             if (PREDICT_FALSE (p1 == 0))
+               {
+                 error1 = NSH_NODE_ERROR_NO_PROXY;
+                 goto trace1;
+               }
+
+             proxy1 = pool_elt_at_index (nm->nsh_proxy_sessions, p1[0]);
+             if (PREDICT_FALSE (proxy1 == 0))
+               {
+                 error1 = NSH_NODE_ERROR_NO_PROXY;
+                 goto trace1;
+               }
+             nsp_nsi1 = proxy1->nsp_nsi;
+           }
+
          entry1 = hash_get_mem (nm->nsh_mapping_by_key, &nsp_nsi1);
          if (PREDICT_FALSE (entry1 == 0))
            {
@@ -2065,7 +2067,8 @@ nsh_input_map (vlib_main_t * vm,
 
            }
 
-       trace1:b1->error = error1 ? node->errors[error1] : 0;
+       trace1:
+         b1->error = error1 ? node->errors[error1] : 0;
 
          if (PREDICT_FALSE (b1->flags & VLIB_BUFFER_IS_TRACED))
            {
@@ -2135,10 +2138,8 @@ nsh_input_map (vlib_main_t * vm,
          else if (node_type == NSH_AWARE_VNF_PROXY_TYPE)
            {
              /* Push dummy Eth header */
-             memset (&dummy_eth0.dst_address[0], 0x11223344, 4);
-             memset (&dummy_eth0.dst_address[4], 0x5566, 2);
-             memset (&dummy_eth0.src_address[0], 0x778899aa, 4);
-             memset (&dummy_eth0.src_address[4], 0xbbcc, 2);
+             clib_memcpy (dummy_eth0.dst_address, dummy_dst_address, 6);
+             clib_memcpy (dummy_eth0.src_address, dummy_src_address, 6);
              dummy_eth0.type = 0x0800;
              vlib_buffer_advance (b0, -(word) sizeof (ethernet_header_t));
              hdr0 = vlib_buffer_get_current (b0);
@@ -2150,7 +2151,7 @@ nsh_input_map (vlib_main_t * vm,
            }
          else
            {
-             memset (&key0, 0, sizeof (key0));
+             clib_memset (&key0, 0, sizeof (key0));
              key0.transport_type = NSH_NODE_NEXT_ENCAP_VXLAN4;
              key0.transport_index = vnet_buffer (b0)->sw_if_index[VLIB_RX];