X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fnat%2Fdslite_in2out.c;h=2a8b548c15f069e8d0e3b9fbb253f08b7b5e2c0a;hb=1d1985de91833a5483a6b7ee96ef4090d530a7a6;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..2a8b548c15f 100644 --- a/src/plugins/nat/dslite_in2out.c +++ b/src/plugins/nat/dslite_in2out.c @@ -13,14 +13,13 @@ * limitations under the License. */ #include - -vlib_node_registration_t dslite_in2out_node; -vlib_node_registration_t dslite_in2out_slowpath_node; +#include +#include 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, @@ -44,7 +43,7 @@ slow_path (dslite_main_t * dm, dslite_session_key_t * in2out_key, u32 oldest_index; dslite_session_t *s; snat_session_key_t out2in_key; - u32 address_index; + u32 b4_index; out2in_key.protocol = in2out_key->proto; out2in_key.fib_index = 0; @@ -56,7 +55,7 @@ slow_path (dslite_main_t * dm, dslite_session_key_t * in2out_key, (&dm->per_thread_data[thread_index].b4_hash, &b4_kv, &b4_value)) { pool_get (dm->per_thread_data[thread_index].b4s, b4); - memset (b4, 0, sizeof (*b4)); + clib_memset (b4, 0, sizeof (*b4)); b4->addr.as_u64[0] = in2out_key->softwire_id.as_u64[0]; b4->addr.as_u64[1] = in2out_key->softwire_id.as_u64[1]; @@ -66,12 +65,17 @@ slow_path (dslite_main_t * dm, dslite_session_key_t * in2out_key, clib_dlist_init (dm->per_thread_data[thread_index].list_pool, b4->sessions_per_b4_list_head_index); - b4_kv.value = b4 - dm->per_thread_data[thread_index].b4s; + b4_index = b4_kv.value = b4 - dm->per_thread_data[thread_index].b4s; clib_bihash_add_del_16_8 (&dm->per_thread_data[thread_index].b4_hash, &b4_kv, 1); + + vlib_set_simple_counter (&dm->total_b4s, thread_index, 0, + pool_elts (dm-> + per_thread_data[thread_index].b4s)); } else { + b4_index = b4_value.value; b4 = pool_elt_at_index (dm->per_thread_data[thread_index].b4s, b4_value.value); @@ -102,27 +106,29 @@ slow_path (dslite_main_t * dm, dslite_session_key_t * in2out_key, clib_bihash_add_del_8_8 (&dm->per_thread_data[thread_index].out2in, &out2in_kv, 0); snat_free_outside_address_and_port (dm->addr_pool, thread_index, - &s->out2in, - s->outside_address_index); - s->outside_address_index = ~0; + &s->out2in); + + nat_syslog_dslite_apmdel (b4_index, &s->in2out.softwire_id, + &s->in2out.addr, s->in2out.port, + &s->out2in.addr, s->out2in.port, + s->in2out.proto); 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)) + 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, dm->port_per_thread, thread_index)) { *error = DSLITE_ERROR_OUT_OF_PORTS; return DSLITE_IN2OUT_NEXT_DROP; } pool_get (dm->per_thread_data[thread_index].sessions, s); - memset (s, 0, sizeof (*s)); - s->outside_address_index = address_index; + clib_memset (s, 0, sizeof (*s)); b4->nsessions++; pool_get (dm->per_thread_data[thread_index].list_pool, elt); @@ -134,6 +140,10 @@ slow_path (dslite_main_t * dm, dslite_session_key_t * in2out_key, clib_dlist_addtail (dm->per_thread_data[thread_index].list_pool, s->per_b4_list_head_index, elt - dm->per_thread_data[thread_index].list_pool); + + vlib_set_simple_counter (&dm->total_sessions, thread_index, 0, + pool_elts (dm->per_thread_data + [thread_index].sessions)); } s->in2out = *in2out_key; @@ -150,6 +160,10 @@ slow_path (dslite_main_t * dm, dslite_session_key_t * in2out_key, clib_bihash_add_del_8_8 (&dm->per_thread_data[thread_index].out2in, &out2in_kv, 1); + nat_syslog_dslite_apmadd (b4_index, &s->in2out.softwire_id, &s->in2out.addr, + s->in2out.port, &s->out2in.addr, s->out2in.port, + s->in2out.proto); + return next; } @@ -227,13 +241,13 @@ 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; node_index = - is_slow_path ? dslite_in2out_slowpath_node. - index : dslite_in2out_node.index; + is_slow_path ? dm->dslite_in2out_slowpath_node_index : + dm->dslite_in2out_node_index; error_node = vlib_node_get_runtime (vm, node_index); @@ -278,6 +292,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; @@ -372,6 +391,7 @@ dslite_in2out_node_fn_inline (vlib_main_t * vm, vlib_node_runtime_t * node, sum0 = ip_csum_update (sum0, old_port0, new_port0, ip4_header_t, length); + mss_clamping (&snat_main, tcp0, &sum0); tcp0->checksum = ip_csum_fold (sum0); } else @@ -422,16 +442,15 @@ dslite_in2out_node_fn_inline (vlib_main_t * vm, vlib_node_runtime_t * node, return frame->n_vectors; } -static uword -dslite_in2out_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, - vlib_frame_t * frame) +VLIB_NODE_FN (dslite_in2out_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame) { return dslite_in2out_node_fn_inline (vm, node, frame, 0); } /* *INDENT-OFF* */ VLIB_REGISTER_NODE (dslite_in2out_node) = { - .function = dslite_in2out_node_fn, .name = "dslite-in2out", .vector_size = sizeof (u32), .format_trace = format_dslite_trace, @@ -443,24 +462,21 @@ 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", }, }; /* *INDENT-ON* */ -VLIB_NODE_FUNCTION_MULTIARCH (dslite_in2out_node, dslite_in2out_node_fn); - -static uword -dslite_in2out_slowpath_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, - vlib_frame_t * frame) +VLIB_NODE_FN (dslite_in2out_slowpath_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame) { return dslite_in2out_node_fn_inline (vm, node, frame, 1); } /* *INDENT-OFF* */ VLIB_REGISTER_NODE (dslite_in2out_slowpath_node) = { - .function = dslite_in2out_slowpath_node_fn, .name = "dslite-in2out-slowpath", .vector_size = sizeof (u32), .format_trace = format_dslite_trace, @@ -472,15 +488,12 @@ 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", }, }; /* *INDENT-ON* */ -VLIB_NODE_FUNCTION_MULTIARCH (dslite_in2out_slowpath_node, - dslite_in2out_slowpath_node_fn); - /* * fd.io coding-style-patch-verification: ON *