- make_ed_kv (&ip0->dst_address, &ip0->src_address,
- ip0->protocol, rx_fib_index0,
- vnet_buffer (b0)->ip.reass.l4_dst_port,
- vnet_buffer (b0)->ip.reass.l4_src_port, ~0ULL, &kv0);
+ init_ed_k (&kv0, ip0->dst_address,
+ vnet_buffer (b0)->ip.reass.l4_dst_port, ip0->src_address,
+ vnet_buffer (b0)->ip.reass.l4_src_port, rx_fib_index0,
+ ip0->protocol);
+
+ /* there is a stashed index in vnet_buffer2 from handoff node,
+ * see if we can use it */
+ if (is_multi_worker && PREDICT_TRUE
+ (!pool_is_free_index
+ (tsm->sessions,
+ vnet_buffer2 (b0)->nat.ed_out2in_nat_session_index)))
+ {
+ s0 = pool_elt_at_index (tsm->sessions,
+ vnet_buffer2 (b0)->
+ nat.ed_out2in_nat_session_index);
+ if (PREDICT_TRUE
+ (s0->out2in.addr.as_u32 == ip0->dst_address.as_u32
+ && s0->out2in.port ==
+ vnet_buffer (b0)->ip.reass.l4_dst_port
+ && s0->nat_proto == ip_proto_to_nat_proto (ip0->protocol)
+ && s0->out2in.fib_index == rx_fib_index0
+ && s0->ext_host_addr.as_u32 == ip0->src_address.as_u32
+ && s0->ext_host_port ==
+ vnet_buffer (b0)->ip.reass.l4_src_port))
+ {
+ /* yes, this is the droid we're looking for */
+ goto skip_lookup;
+ }
+ }