aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/nsh
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/nsh')
-rw-r--r--src/plugins/nsh/nsh.c139
1 files changed, 70 insertions, 69 deletions
diff --git a/src/plugins/nsh/nsh.c b/src/plugins/nsh/nsh.c
index 33cf5522863..ced898c04df 100644
--- a/src/plugins/nsh/nsh.c
+++ b/src/plugins/nsh/nsh.c
@@ -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:
@@ -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);
@@ -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
+ {
+ 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);