summaryrefslogtreecommitdiffstats
path: root/src/plugins/nat/nat64.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/nat/nat64.c')
-rw-r--r--src/plugins/nat/nat64.c31
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))
{