#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:
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));
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;
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;
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;
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;
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;
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;
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)
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;
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);
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;
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_fast (dummy_eth0.dst_address, dummy_dst_address, 6);
+ clib_memcpy_fast (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);
- clib_memcpy (hdr0, &dummy_eth0,
- (word) sizeof (ethernet_header_t));
+ clib_memcpy_fast (hdr0, &dummy_eth0,
+ (word) sizeof (ethernet_header_t));
sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_TX];
nsp_nsi0 = nm->tunnel_index_by_sw_if_index[sw_if_index0];
}
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];
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))
{
/* Push new NSH header */
vlib_buffer_advance (b0, -(word) encap_hdr_len0);
hdr0 = vlib_buffer_get_current (b0);
- clib_memcpy (hdr0, encap_hdr0, (word) encap_hdr_len0);
+ clib_memcpy_fast (hdr0, encap_hdr0, (word) encap_hdr_len0);
goto trace0;
}
/* Push new NSH header */
vlib_buffer_advance (b0, -(word) encap_hdr_len0);
hdr0 = vlib_buffer_get_current (b0);
- clib_memcpy (hdr0, encap_hdr0, (word) encap_hdr_len0);
+ clib_memcpy_fast (hdr0, encap_hdr0, (word) encap_hdr_len0);
/* Manipulate MD2 */
if (PREDICT_FALSE (nsh_entry0->nsh_base.md_type == 2))
}
- 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))
{
nsh_input_trace_t *tr =
vlib_add_trace (vm, node, b0, sizeof (*tr));
- clib_memcpy (&(tr->trace_data), hdr0,
- ((hdr0->length & NSH_LEN_MASK) * 4));
+ clib_memcpy_fast (&(tr->trace_data), hdr0,
+ ((hdr0->length & NSH_LEN_MASK) * 4));
}
/* 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_fast (dummy_eth1.dst_address, dummy_dst_address, 6);
+ clib_memcpy_fast (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_fast (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))
{
goto trace1;
}
vnet_buffer (b1)->sw_if_index[VLIB_RX] =
- map0->rx_sw_if_index;
+ map1->rx_sw_if_index;
}
/* Pop NSH header */
/* Push new NSH header */
vlib_buffer_advance (b1, -(word) encap_hdr_len1);
hdr1 = vlib_buffer_get_current (b1);
- clib_memcpy (hdr1, encap_hdr1, (word) encap_hdr_len1);
+ clib_memcpy_fast (hdr1, encap_hdr1, (word) encap_hdr_len1);
goto trace1;
}
/* Push new NSH header */
vlib_buffer_advance (b1, -(word) encap_hdr_len1);
hdr1 = vlib_buffer_get_current (b1);
- clib_memcpy (hdr1, encap_hdr1, (word) encap_hdr_len1);
+ clib_memcpy_fast (hdr1, encap_hdr1, (word) encap_hdr_len1);
/* Manipulate MD2 */
if (PREDICT_FALSE (nsh_entry1->nsh_base.md_type == 2))
}
- 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))
{
nsh_input_trace_t *tr =
vlib_add_trace (vm, node, b1, sizeof (*tr));
- clib_memcpy (&(tr->trace_data), hdr1,
- ((hdr1->length & NSH_LEN_MASK) * 4));
+ clib_memcpy_fast (&(tr->trace_data), hdr1,
+ ((hdr1->length & NSH_LEN_MASK) * 4));
}
vlib_validate_buffer_enqueue_x2 (vm, node, next_index, to_next,
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_fast (dummy_eth0.dst_address, dummy_dst_address, 6);
+ clib_memcpy_fast (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);
- clib_memcpy (hdr0, &dummy_eth0,
- (word) sizeof (ethernet_header_t));
+ clib_memcpy_fast (hdr0, &dummy_eth0,
+ (word) sizeof (ethernet_header_t));
sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_TX];
nsp_nsi0 = nm->tunnel_index_by_sw_if_index[sw_if_index0];
}
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];
/* Push new NSH header */
vlib_buffer_advance (b0, -(word) encap_hdr_len0);
hdr0 = vlib_buffer_get_current (b0);
- clib_memcpy (hdr0, encap_hdr0, (word) encap_hdr_len0);
+ clib_memcpy_fast (hdr0, encap_hdr0, (word) encap_hdr_len0);
goto trace00;
}
/* Push new NSH header */
vlib_buffer_advance (b0, -(word) encap_hdr_len0);
hdr0 = vlib_buffer_get_current (b0);
- clib_memcpy (hdr0, encap_hdr0, (word) encap_hdr_len0);
+ clib_memcpy_fast (hdr0, encap_hdr0, (word) encap_hdr_len0);
/* Manipulate MD2 */
if (PREDICT_FALSE (nsh_entry0->nsh_base.md_type == 2))
{
{
nsh_input_trace_t *tr =
vlib_add_trace (vm, node, b0, sizeof (*tr));
- clib_memcpy (&(tr->trace_data[0]), hdr0,
- ((hdr0->length & NSH_LEN_MASK) * 4));
+ clib_memcpy_fast (&(tr->trace_data[0]), hdr0,
+ ((hdr0->length & NSH_LEN_MASK) * 4));
}
vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,