nat: ED: port re-use algorithm
[vpp.git] / src / plugins / nat / out2in_ed.c
index 6943614..e1eda32 100644 (file)
@@ -131,6 +131,16 @@ nat44_o2i_ed_is_idle_session_cb (clib_bihash_kv_16_8_t * kv, void *arg)
       if (clib_bihash_add_del_16_8 (&tsm->in2out_ed, &ed_kv, 0))
        nat_elog_warn ("in2out_ed key del failed");
 
+      ed_bihash_kv_t bihash_key;
+      clib_memset (&bihash_key, 0, sizeof (bihash_key));
+      bihash_key.k.dst_address = s->ext_host_addr.as_u32;
+      bihash_key.k.dst_port = s->ext_host_port;
+      bihash_key.k.src_address = s->out2in.addr.as_u32;
+      bihash_key.k.src_port = s->out2in.port;
+      bihash_key.k.protocol = s->out2in.protocol;
+      clib_bihash_add_del_16_8 (&sm->ed_ext_ports, &bihash_key.kv,
+                               0 /* is_add */ );
+
       if (snat_is_unk_proto_session (s))
        goto delete;
 
@@ -795,8 +805,8 @@ nat44_ed_out2in_fast_path_node_fn_inline (vlib_main_t * vm,
              nat_free_session_data (sm, s0, thread_index, 0);
              nat44_delete_session (sm, s0, thread_index);
 
-             b0->error = node->errors[NAT_OUT2IN_ED_ERROR_SESS_EXPIRED];
-             next0 = NAT_NEXT_DROP;
+             // session no longer exists, go slow path
+             next0 = NAT_NEXT_OUT2IN_ED_SLOW_PATH;
              goto trace0;
            }
          //
@@ -1026,13 +1036,13 @@ nat44_ed_out2in_slow_path_node_fn_inline (vlib_main_t * vm,
              s0 =
                nat44_ed_out2in_unknown_proto (sm, b0, ip0, rx_fib_index0,
                                               thread_index, now, vm, node);
-             other_packets++;
              if (!sm->forwarding_enabled)
                {
                  if (!s0)
                    next0 = NAT_NEXT_DROP;
-                 goto trace0;
                }
+             other_packets++;
+             goto trace0;
            }
 
          if (PREDICT_FALSE (proto0 == SNAT_PROTOCOL_ICMP))