X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fnsh%2Fnsh.c;h=d9b625cda04373ca1548c0a38bd5a5efc9baf9c7;hb=b7b929931a07fbb27b43d5cd105f366c3e29807e;hp=33cf5522863ed76190869f179f1929b1aa48eca1;hpb=64a80f2b790b837b0115ab1c15a73fc77119d354;p=vpp.git diff --git a/src/plugins/nsh/nsh.c b/src/plugins/nsh/nsh.c index 33cf5522863..d9b625cda04 100644 --- a/src/plugins/nsh/nsh.c +++ b/src/plugins/nsh/nsh.c @@ -63,6 +63,10 @@ typedef enum #include #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 | encap-vxlan-gpe-intf | encap-lisp-gpe-intf | encap-none ]"); - 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];