diff options
author | Matus Fabian <matfabia@cisco.com> | 2019-02-18 01:54:16 -0800 |
---|---|---|
committer | Matus Fabian <matfabia@cisco.com> | 2019-02-18 01:56:18 -0800 |
commit | 684586786e98bc779e269c0d879a2a4d3f1f4bce (patch) | |
tree | 6493da7899397a8bd14b832586757570440ba386 /src/plugins/nat/nat64.c | |
parent | 830fe7370af7ac9e28e9be04b5b5712b22ad9c31 (diff) |
NAT44: fix snat_get_worker_out2in_cb (VPP-1536)
Change-Id: I9c562f8e3407ca60a4412a162015fa505b7590b6
Signed-off-by: Matus Fabian <matfabia@cisco.com>
Diffstat (limited to 'src/plugins/nat/nat64.c')
-rw-r--r-- | src/plugins/nat/nat64.c | 31 |
1 files changed, 23 insertions, 8 deletions
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)) { |