From 684586786e98bc779e269c0d879a2a4d3f1f4bce Mon Sep 17 00:00:00 2001 From: Matus Fabian Date: Mon, 18 Feb 2019 01:54:16 -0800 Subject: NAT44: fix snat_get_worker_out2in_cb (VPP-1536) Change-Id: I9c562f8e3407ca60a4412a162015fa505b7590b6 Signed-off-by: Matus Fabian --- src/plugins/nat/nat64.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) (limited to 'src/plugins/nat/nat64.c') diff --git a/src/plugins/nat/nat64.c b/src/plugins/nat/nat64.c index 2f665ab4cfe..126cb3cdf79 100644 --- a/src/plugins/nat/nat64.c +++ b/src/plugins/nat/nat64.c @@ -138,20 +138,35 @@ nat64_get_worker_out2in (ip4_header_t * ip) if (PREDICT_FALSE (nat_reass_is_drop_frag (0))) return vlib_get_thread_index (); - if (PREDICT_TRUE (!ip4_is_first_fragment (ip))) - { - nat_reass_ip4_t *reass; + nat_reass_ip4_t *reass; + reass = nat_ip4_reass_find (ip->src_address, ip->dst_address, + ip->fragment_id, ip->protocol); - reass = nat_ip4_reass_find (ip->src_address, ip->dst_address, - ip->fragment_id, ip->protocol); + if (reass && (reass->thread_index != (u32) ~ 0)) + return reass->thread_index; - if (reass && (reass->thread_index != (u32) ~ 0)) - return reass->thread_index; + if (ip4_is_first_fragment (ip)) + { + reass = + nat_ip4_reass_create (ip->src_address, ip->dst_address, + ip->fragment_id, ip->protocol); + if (!reass) + goto no_reass; + + port = clib_net_to_host_u16 (port); + if (port > 1024) + reass->thread_index = + nm->sm->first_worker_index + + ((port - 1024) / sm->port_per_thread); else - return vlib_get_thread_index (); + reass->thread_index = vlib_get_thread_index (); + return reass->thread_index; } + else + return vlib_get_thread_index (); } +no_reass: /* unknown protocol */ if (PREDICT_FALSE (proto == ~0)) { -- cgit 1.2.3-korg