X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fnat%2Fdslite_in2out.c;h=991d6eda775d2c3cd84872745866a20771715544;hb=067cd6229a47ea3ba8b59a2a04090e80afb5bd2c;hp=9a7751ce11cd76698da8f94d1de69fdf5fbbb11c;hpb=8ebe62536223e5a8d827b2b870cbd57aa34fd7ef;p=vpp.git diff --git a/src/plugins/nat/dslite_in2out.c b/src/plugins/nat/dslite_in2out.c index 9a7751ce11c..991d6eda775 100644 --- a/src/plugins/nat/dslite_in2out.c +++ b/src/plugins/nat/dslite_in2out.c @@ -13,6 +13,7 @@ * limitations under the License. */ #include +#include vlib_node_registration_t dslite_in2out_node; vlib_node_registration_t dslite_in2out_slowpath_node; @@ -20,7 +21,7 @@ vlib_node_registration_t dslite_in2out_slowpath_node; typedef enum { DSLITE_IN2OUT_NEXT_IP4_LOOKUP, - DSLITE_IN2OUT_NEXT_IP6_LOOKUP, + DSLITE_IN2OUT_NEXT_IP6_ICMP, DSLITE_IN2OUT_NEXT_DROP, DSLITE_IN2OUT_NEXT_SLOWPATH, DSLITE_IN2OUT_N_NEXT, @@ -108,13 +109,13 @@ slow_path (dslite_main_t * dm, dslite_session_key_t * in2out_key, if (snat_alloc_outside_address_and_port (dm->addr_pool, 0, thread_index, &out2in_key, - &s->outside_address_index, 0, dm->port_per_thread, thread_index)) + &s->outside_address_index, dm->port_per_thread, thread_index)) ASSERT (0); } else { if (snat_alloc_outside_address_and_port - (dm->addr_pool, 0, thread_index, &out2in_key, &address_index, 0, + (dm->addr_pool, 0, thread_index, &out2in_key, &address_index, dm->port_per_thread, thread_index)) { *error = DSLITE_ERROR_OUT_OF_PORTS; @@ -227,7 +228,7 @@ dslite_in2out_node_fn_inline (vlib_main_t * vm, vlib_node_runtime_t * node, dslite_in2out_next_t next_index; u32 node_index; vlib_node_runtime_t *error_node; - u32 thread_index = vlib_get_thread_index (); + u32 thread_index = vm->thread_index; f64 now = vlib_time_now (vm); dslite_main_t *dm = &dslite_main; @@ -278,6 +279,11 @@ dslite_in2out_node_fn_inline (vlib_main_t * vm, vlib_node_runtime_t * node, if (PREDICT_FALSE (ip60->protocol != IP_PROTOCOL_IP_IN_IP)) { + if (ip60->protocol == IP_PROTOCOL_ICMP6) + { + next0 = DSLITE_IN2OUT_NEXT_IP6_ICMP; + goto trace0; + } error0 = DSLITE_ERROR_BAD_IP6_PROTOCOL; next0 = DSLITE_IN2OUT_NEXT_DROP; goto trace0; @@ -443,7 +449,7 @@ VLIB_REGISTER_NODE (dslite_in2out_node) = { .next_nodes = { [DSLITE_IN2OUT_NEXT_DROP] = "error-drop", [DSLITE_IN2OUT_NEXT_IP4_LOOKUP] = "ip4-lookup", - [DSLITE_IN2OUT_NEXT_IP6_LOOKUP] = "ip6-lookup", + [DSLITE_IN2OUT_NEXT_IP6_ICMP] = "ip6-icmp-input", [DSLITE_IN2OUT_NEXT_SLOWPATH] = "dslite-in2out-slowpath", }, }; @@ -472,7 +478,7 @@ VLIB_REGISTER_NODE (dslite_in2out_slowpath_node) = { .next_nodes = { [DSLITE_IN2OUT_NEXT_DROP] = "error-drop", [DSLITE_IN2OUT_NEXT_IP4_LOOKUP] = "ip4-lookup", - [DSLITE_IN2OUT_NEXT_IP6_LOOKUP] = "ip6-lookup", + [DSLITE_IN2OUT_NEXT_IP6_ICMP] = "ip6-lookup", [DSLITE_IN2OUT_NEXT_SLOWPATH] = "dslite-in2out-slowpath", }, };