X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fnat%2Fnat44_hairpinning.c;h=69a19b80645d3c95a1866a8cc01fa672cf2e8cf2;hb=26c9d4b0cd9c53054d1174bc15aaf8c07e9a8f93;hp=c07427d6bcb73f24b69db8b40f43544b28e717ab;hpb=e2f4e2f175beb6d6490d275049199db7dd61c783;p=vpp.git diff --git a/src/plugins/nat/nat44_hairpinning.c b/src/plugins/nat/nat44_hairpinning.c index c07427d6bcb..69a19b80645 100644 --- a/src/plugins/nat/nat44_hairpinning.c +++ b/src/plugins/nat/nat44_hairpinning.c @@ -22,7 +22,6 @@ #include #include #include -#include typedef enum { @@ -57,13 +56,6 @@ static char *nat44_hairpin_error_strings[] = { #undef _ }; -vlib_node_registration_t snat_hairpin_dst_node; -vlib_node_registration_t snat_hairpin_src_node; -vlib_node_registration_t nat44_hairpinning_node; -vlib_node_registration_t nat44_ed_hairpin_dst_node; -vlib_node_registration_t nat44_ed_hairpin_src_node; -vlib_node_registration_t nat44_ed_hairpinning_node; - extern vnet_feature_arc_registration_t vnet_feat_arc_ip4_local; static_always_inline int @@ -92,6 +84,7 @@ is_hairpinning (snat_main_t * sm, ip4_address_t * dst_addr) return 0; } +#ifndef CLIB_MARCH_VARIANT int snat_hairpinning (snat_main_t * sm, vlib_buffer_t * b0, @@ -198,7 +191,9 @@ snat_hairpinning (snat_main_t * sm, } return 0; } +#endif +#ifndef CLIB_MARCH_VARIANT u32 snat_icmp_hairpinning (snat_main_t * sm, vlib_buffer_t * b0, @@ -215,7 +210,8 @@ snat_icmp_hairpinning (snat_main_t * sm, snat_session_t *s0; snat_static_mapping_t *m0; - if (icmp_is_error_message (icmp0)) + if (icmp_type_is_error_message + (vnet_buffer (b0)->ip.reass.icmp_type_or_tcp_flags)) { ip4_header_t *inner_ip0 = 0; tcp_udp_header_t *l4_header = 0; @@ -286,39 +282,6 @@ snat_icmp_hairpinning (snat_main_t * sm, } else { - if (!is_ed) - { - icmp_echo_header_t *echo0 = (icmp_echo_header_t *) (icmp0 + 1); - u16 icmp_id0 = echo0->identifier; - key0.addr = ip0->dst_address; - key0.port = icmp_id0; - key0.protocol = SNAT_PROTOCOL_ICMP; - key0.fib_index = sm->outside_fib_index; - kv0.key = key0.as_u64; - if (sm->num_workers > 1) - ti = - (clib_net_to_host_u16 (icmp_id0) - 1024) / sm->port_per_thread; - else - ti = sm->num_workers; - int rv = - clib_bihash_search_8_8 (&sm->per_thread_data[ti].out2in, &kv0, - &value0); - if (!rv) - { - si = value0.value; - s0 = pool_elt_at_index (sm->per_thread_data[ti].sessions, si); - new_dst_addr0 = s0->in2out.addr.as_u32; - vnet_buffer (b0)->sw_if_index[VLIB_TX] = s0->in2out.fib_index; - echo0->identifier = s0->in2out.port; - sum0 = icmp0->checksum; - sum0 = ip_csum_update (sum0, icmp_id0, s0->in2out.port, - icmp_echo_header_t, identifier); - icmp0->checksum = ip_csum_fold (sum0); - goto change_addr; - } - ti = 0; - } - key0.addr = ip0->dst_address; key0.port = 0; key0.protocol = 0; @@ -327,7 +290,44 @@ snat_icmp_hairpinning (snat_main_t * sm, if (clib_bihash_search_8_8 (&sm->static_mapping_by_external, &kv0, &value0)) - return 1; + { + if (!is_ed) + { + icmp_echo_header_t *echo0 = (icmp_echo_header_t *) (icmp0 + 1); + u16 icmp_id0 = echo0->identifier; + key0.addr = ip0->dst_address; + key0.port = icmp_id0; + key0.protocol = SNAT_PROTOCOL_ICMP; + key0.fib_index = sm->outside_fib_index; + kv0.key = key0.as_u64; + if (sm->num_workers > 1) + ti = + (clib_net_to_host_u16 (icmp_id0) - + 1024) / sm->port_per_thread; + else + ti = sm->num_workers; + int rv = + clib_bihash_search_8_8 (&sm->per_thread_data[ti].out2in, &kv0, + &value0); + if (!rv) + { + si = value0.value; + s0 = + pool_elt_at_index (sm->per_thread_data[ti].sessions, si); + new_dst_addr0 = s0->in2out.addr.as_u32; + vnet_buffer (b0)->sw_if_index[VLIB_TX] = + s0->in2out.fib_index; + echo0->identifier = s0->in2out.port; + sum0 = icmp0->checksum; + sum0 = ip_csum_update (sum0, icmp_id0, s0->in2out.port, + icmp_echo_header_t, identifier); + icmp0->checksum = ip_csum_fold (sum0); + goto change_addr; + } + } + + return 1; + } m0 = pool_elt_at_index (sm->static_mappings, value0.value); @@ -348,7 +348,9 @@ change_addr: } return 0; } +#endif +#ifndef CLIB_MARCH_VARIANT void nat_hairpinning_sm_unknown_proto (snat_main_t * sm, vlib_buffer_t * b, ip4_header_t * ip) @@ -373,7 +375,9 @@ nat_hairpinning_sm_unknown_proto (snat_main_t * sm, if (vnet_buffer (b)->sw_if_index[VLIB_TX] == ~0) vnet_buffer (b)->sw_if_index[VLIB_TX] = m->fib_index; } +#endif +#ifndef CLIB_MARCH_VARIANT void nat44_ed_hairpinning_unknown_proto (snat_main_t * sm, vlib_buffer_t * b, ip4_header_t * ip) @@ -387,7 +391,7 @@ nat44_ed_hairpinning_unknown_proto (snat_main_t * sm, snat_main_per_thread_data_t *tsm; if (sm->num_workers > 1) - ti = sm->worker_out2in_cb (ip, sm->outside_fib_index); + ti = sm->worker_out2in_cb (b, ip, sm->outside_fib_index, 0); else ti = sm->num_workers; tsm = &sm->per_thread_data[ti]; @@ -418,7 +422,9 @@ nat44_ed_hairpinning_unknown_proto (snat_main_t * sm, sum = ip_csum_update (sum, old_addr, new_addr, ip4_header_t, dst_address); ip->checksum = ip_csum_fold (sum); } +#endif +#ifndef CLIB_MARCH_VARIANT void nat44_reass_hairpinning (snat_main_t * sm, vlib_buffer_t * b0, @@ -529,6 +535,7 @@ nat44_reass_hairpinning (snat_main_t * sm, } } } +#endif static inline uword nat44_hairpinning_fn_inline (vlib_main_t * vm, @@ -543,8 +550,8 @@ nat44_hairpinning_fn_inline (vlib_main_t * vm, u8 arc_index = vnet_feat_arc_ip4_local.feature_arc_index; vnet_feature_config_main_t *cm = &fm->feature_config_mains[arc_index]; - stats_node_index = is_ed ? nat44_ed_hairpinning_node.index : - nat44_hairpinning_node.index; + stats_node_index = is_ed ? sm->ed_hairpinning_node_index : + sm->hairpinning_node_index; from = vlib_frame_vector_args (frame); n_left_from = frame->n_vectors; next_index = node->cached_next_index; @@ -602,16 +609,15 @@ nat44_hairpinning_fn_inline (vlib_main_t * vm, return frame->n_vectors; } -static uword -nat44_hairpinning_fn (vlib_main_t * vm, - vlib_node_runtime_t * node, vlib_frame_t * frame) +VLIB_NODE_FN (nat44_hairpinning_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame) { return nat44_hairpinning_fn_inline (vm, node, frame, 0); } /* *INDENT-OFF* */ VLIB_REGISTER_NODE (nat44_hairpinning_node) = { - .function = nat44_hairpinning_fn, .name = "nat44-hairpinning", .vector_size = sizeof (u32), .type = VLIB_NODE_TYPE_INTERNAL, @@ -625,18 +631,15 @@ VLIB_REGISTER_NODE (nat44_hairpinning_node) = { }; /* *INDENT-ON* */ -VLIB_NODE_FUNCTION_MULTIARCH (nat44_hairpinning_node, nat44_hairpinning_fn); - -static uword -nat44_ed_hairpinning_fn (vlib_main_t * vm, - vlib_node_runtime_t * node, vlib_frame_t * frame) +VLIB_NODE_FN (nat44_ed_hairpinning_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame) { return nat44_hairpinning_fn_inline (vm, node, frame, 1); } /* *INDENT-OFF* */ VLIB_REGISTER_NODE (nat44_ed_hairpinning_node) = { - .function = nat44_ed_hairpinning_fn, .name = "nat44-ed-hairpinning", .vector_size = sizeof (u32), .type = VLIB_NODE_TYPE_INTERNAL, @@ -650,9 +653,6 @@ VLIB_REGISTER_NODE (nat44_ed_hairpinning_node) = { }; /* *INDENT-ON* */ -VLIB_NODE_FUNCTION_MULTIARCH (nat44_ed_hairpinning_node, - nat44_ed_hairpinning_fn); - static inline uword snat_hairpin_dst_fn_inline (vlib_main_t * vm, vlib_node_runtime_t * node, @@ -663,8 +663,8 @@ snat_hairpin_dst_fn_inline (vlib_main_t * vm, u32 pkts_processed = 0; snat_main_t *sm = &snat_main; - stats_node_index = is_ed ? nat44_ed_hairpin_dst_node.index : - snat_hairpin_dst_node.index; + stats_node_index = is_ed ? sm->ed_hairpin_dst_node_index : + sm->hairpin_dst_node_index; from = vlib_frame_vector_args (frame); n_left_from = frame->n_vectors; @@ -741,16 +741,15 @@ snat_hairpin_dst_fn_inline (vlib_main_t * vm, return frame->n_vectors; } -static uword -snat_hairpin_dst_fn (vlib_main_t * vm, - vlib_node_runtime_t * node, vlib_frame_t * frame) +VLIB_NODE_FN (snat_hairpin_dst_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame) { return snat_hairpin_dst_fn_inline (vm, node, frame, 0); } /* *INDENT-OFF* */ VLIB_REGISTER_NODE (snat_hairpin_dst_node) = { - .function = snat_hairpin_dst_fn, .name = "nat44-hairpin-dst", .vector_size = sizeof (u32), .type = VLIB_NODE_TYPE_INTERNAL, @@ -764,18 +763,15 @@ VLIB_REGISTER_NODE (snat_hairpin_dst_node) = { }; /* *INDENT-ON* */ -VLIB_NODE_FUNCTION_MULTIARCH (snat_hairpin_dst_node, snat_hairpin_dst_fn); - -static uword -nat44_ed_hairpin_dst_fn (vlib_main_t * vm, - vlib_node_runtime_t * node, vlib_frame_t * frame) +VLIB_NODE_FN (nat44_ed_hairpin_dst_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame) { return snat_hairpin_dst_fn_inline (vm, node, frame, 1); } /* *INDENT-OFF* */ VLIB_REGISTER_NODE (nat44_ed_hairpin_dst_node) = { - .function = nat44_ed_hairpin_dst_fn, .name = "nat44-ed-hairpin-dst", .vector_size = sizeof (u32), .type = VLIB_NODE_TYPE_INTERNAL, @@ -789,9 +785,6 @@ VLIB_REGISTER_NODE (nat44_ed_hairpin_dst_node) = { }; /* *INDENT-ON* */ -VLIB_NODE_FUNCTION_MULTIARCH (nat44_ed_hairpin_dst_node, - nat44_ed_hairpin_dst_fn); - static inline uword snat_hairpin_src_fn_inline (vlib_main_t * vm, vlib_node_runtime_t * node, @@ -802,8 +795,8 @@ snat_hairpin_src_fn_inline (vlib_main_t * vm, u32 pkts_processed = 0; snat_main_t *sm = &snat_main; - stats_node_index = is_ed ? nat44_ed_hairpin_src_node.index : - snat_hairpin_src_node.index; + stats_node_index = is_ed ? sm->ed_hairpin_src_node_index : + sm->hairpin_src_node_index; from = vlib_frame_vector_args (frame); n_left_from = frame->n_vectors; @@ -833,7 +826,7 @@ snat_hairpin_src_fn_inline (vlib_main_t * vm, b0 = vlib_get_buffer (vm, bi0); sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX]; - next0 = SNAT_HAIRPIN_SRC_NEXT_INTERFACE_OUTPUT; + vnet_feature_next (&next0, b0); /* *INDENT-OFF* */ pool_foreach (i, sm->output_feature_interfaces, @@ -870,16 +863,15 @@ snat_hairpin_src_fn_inline (vlib_main_t * vm, return frame->n_vectors; } -static uword -snat_hairpin_src_fn (vlib_main_t * vm, - vlib_node_runtime_t * node, vlib_frame_t * frame) +VLIB_NODE_FN (snat_hairpin_src_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame) { return snat_hairpin_src_fn_inline (vm, node, frame, 0); } /* *INDENT-OFF* */ VLIB_REGISTER_NODE (snat_hairpin_src_node) = { - .function = snat_hairpin_src_fn, .name = "nat44-hairpin-src", .vector_size = sizeof (u32), .type = VLIB_NODE_TYPE_INTERNAL, @@ -895,18 +887,15 @@ VLIB_REGISTER_NODE (snat_hairpin_src_node) = { }; /* *INDENT-ON* */ -VLIB_NODE_FUNCTION_MULTIARCH (snat_hairpin_src_node, snat_hairpin_src_fn); - -static uword -nat44_ed_hairpin_src_fn (vlib_main_t * vm, - vlib_node_runtime_t * node, vlib_frame_t * frame) +VLIB_NODE_FN (nat44_ed_hairpin_src_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * frame) { return snat_hairpin_src_fn_inline (vm, node, frame, 1); } /* *INDENT-OFF* */ VLIB_REGISTER_NODE (nat44_ed_hairpin_src_node) = { - .function = nat44_ed_hairpin_src_fn, .name = "nat44-ed-hairpin-src", .vector_size = sizeof (u32), .type = VLIB_NODE_TYPE_INTERNAL, @@ -922,9 +911,6 @@ VLIB_REGISTER_NODE (nat44_ed_hairpin_src_node) = { }; /* *INDENT-ON* */ -VLIB_NODE_FUNCTION_MULTIARCH (nat44_ed_hairpin_src_node, - nat44_ed_hairpin_src_fn); - /* * fd.io coding-style-patch-verification: ON *