NAT44: endpoint-dependent mode session timeout improvement (VPP-1423)
[vpp.git] / src / plugins / nat / out2in_ed.c
index 4236285..dce6c56 100644 (file)
@@ -112,6 +112,8 @@ icmp_out2in_ed_slow_path (snat_main_t * sm, vlib_buffer_t * b0,
       nat44_session_update_counters (s0, now,
                                     vlib_buffer_length_in_chain
                                     (sm->vlib_main, b0));
+      /* Per-user LRU list maintenance */
+      nat44_session_update_lru (sm, s0, thread_index);
     }
   return next0;
 }
@@ -137,7 +139,7 @@ nat44_o2i_ed_is_idle_session_cb (clib_bihash_kv_16_8_t * kv, void *arg)
     {
       ed_key.l_addr = s->in2out.addr;
       ed_key.r_addr = s->ext_host_addr;
-      ed_key.fib_index = s->out2in.fib_index;
+      ed_key.fib_index = s->in2out.fib_index;
       if (snat_is_unk_proto_session (s))
        {
          ed_key.proto = s->in2out.port;
@@ -233,7 +235,7 @@ create_session_for_static_mapping_ed (snat_main_t * sm,
       return 0;
     }
 
-  s = nat_ed_session_alloc (sm, u, thread_index);
+  s = nat_ed_session_alloc (sm, u, thread_index, now);
   if (!s)
     {
       nat44_delete_user_with_no_session (sm, u, thread_index);
@@ -421,7 +423,7 @@ create_bypass_for_fwd (snat_main_t * sm, ip4_header_t * ip, u32 rx_fib_index,
          return;
        }
 
-      s = nat_ed_session_alloc (sm, u, thread_index);
+      s = nat_ed_session_alloc (sm, u, thread_index, now);
       if (!s)
        {
          nat44_delete_user_with_no_session (sm, u, thread_index);
@@ -453,6 +455,8 @@ create_bypass_for_fwd (snat_main_t * sm, ip4_header_t * ip, u32 rx_fib_index,
 
   /* Accounting */
   nat44_session_update_counters (s, now, 0);
+  /* Per-user LRU list maintenance */
+  nat44_session_update_lru (sm, s, thread_index);
 }
 
 u32
@@ -623,7 +627,7 @@ nat44_ed_out2in_unknown_proto (snat_main_t * sm,
        }
 
       /* Create a new session */
-      s = nat_ed_session_alloc (sm, u, thread_index);
+      s = nat_ed_session_alloc (sm, u, thread_index, now);
       if (!s)
        {
          nat44_delete_user_with_no_session (sm, u, thread_index);
@@ -663,6 +667,8 @@ nat44_ed_out2in_unknown_proto (snat_main_t * sm,
 
   /* Accounting */
   nat44_session_update_counters (s, now, vlib_buffer_length_in_chain (vm, b));
+  /* Per-user LRU list maintenance */
+  nat44_session_update_lru (sm, s, thread_index);
 
   return s;
 }
@@ -936,6 +942,8 @@ nat44_ed_out2in_node_fn_inline (vlib_main_t * vm,
          nat44_session_update_counters (s0, now,
                                         vlib_buffer_length_in_chain (vm,
                                                                      b0));
+         /* Per-user LRU list maintenance */
+         nat44_session_update_lru (sm, s0, thread_index);
 
        trace00:
          if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE)
@@ -1152,6 +1160,8 @@ nat44_ed_out2in_node_fn_inline (vlib_main_t * vm,
          nat44_session_update_counters (s1, now,
                                         vlib_buffer_length_in_chain (vm,
                                                                      b1));
+         /* Per-user LRU list maintenance */
+         nat44_session_update_lru (sm, s1, thread_index);
 
        trace01:
          if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE)
@@ -1401,6 +1411,8 @@ nat44_ed_out2in_node_fn_inline (vlib_main_t * vm,
          nat44_session_update_counters (s0, now,
                                         vlib_buffer_length_in_chain (vm,
                                                                      b0));
+         /* Per-user LRU list maintenance */
+         nat44_session_update_lru (sm, s0, thread_index);
 
        trace0:
          if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE)
@@ -1769,6 +1781,8 @@ nat44_ed_out2in_reass_node_fn (vlib_main_t * vm,
          nat44_session_update_counters (s0, now,
                                         vlib_buffer_length_in_chain (vm,
                                                                      b0));
+         /* Per-user LRU list maintenance */
+         nat44_session_update_lru (sm, s0, thread_index);
 
        trace0:
          if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE)