X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fnat%2Fnat64.c;h=126cb3cdf79266d657ae34969ce1fe2f0ad33bc6;hb=684586786e98bc779e269c0d879a2a4d3f1f4bce;hp=2f665ab4cfe5fc01d5b690c797ce35b1336a82a9;hpb=830fe7370af7ac9e28e9be04b5b5712b22ad9c31;p=vpp.git 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)) {