NAT: Refactoring / Housekeeping (VPP-1415)
[vpp.git] / src / plugins / nat / dslite_in2out.c
index 9a7751c..4eec595 100644 (file)
@@ -13,6 +13,7 @@
  * limitations under the License.
  */
 #include <nat/dslite.h>
+#include <nat/nat_inlines.h>
 
 vlib_node_registration_t dslite_in2out_node;
 vlib_node_registration_t dslite_in2out_slowpath_node;
@@ -20,7 +21,7 @@ vlib_node_registration_t dslite_in2out_slowpath_node;
 typedef enum
 {
   DSLITE_IN2OUT_NEXT_IP4_LOOKUP,
-  DSLITE_IN2OUT_NEXT_IP6_LOOKUP,
+  DSLITE_IN2OUT_NEXT_IP6_ICMP,
   DSLITE_IN2OUT_NEXT_DROP,
   DSLITE_IN2OUT_NEXT_SLOWPATH,
   DSLITE_IN2OUT_N_NEXT,
@@ -44,7 +45,6 @@ slow_path (dslite_main_t * dm, dslite_session_key_t * in2out_key,
   u32 oldest_index;
   dslite_session_t *s;
   snat_session_key_t out2in_key;
-  u32 address_index;
 
   out2in_key.protocol = in2out_key->proto;
   out2in_key.fib_index = 0;
@@ -102,19 +102,17 @@ slow_path (dslite_main_t * dm, dslite_session_key_t * in2out_key,
       clib_bihash_add_del_8_8 (&dm->per_thread_data[thread_index].out2in,
                               &out2in_kv, 0);
       snat_free_outside_address_and_port (dm->addr_pool, thread_index,
-                                         &s->out2in,
-                                         s->outside_address_index);
-      s->outside_address_index = ~0;
+                                         &s->out2in);
 
       if (snat_alloc_outside_address_and_port
          (dm->addr_pool, 0, thread_index, &out2in_key,
-          &s->outside_address_index, 0, dm->port_per_thread, thread_index))
+          dm->port_per_thread, thread_index))
        ASSERT (0);
     }
   else
     {
       if (snat_alloc_outside_address_and_port
-         (dm->addr_pool, 0, thread_index, &out2in_key, &address_index, 0,
+         (dm->addr_pool, 0, thread_index, &out2in_key,
           dm->port_per_thread, thread_index))
        {
          *error = DSLITE_ERROR_OUT_OF_PORTS;
@@ -122,7 +120,6 @@ slow_path (dslite_main_t * dm, dslite_session_key_t * in2out_key,
        }
       pool_get (dm->per_thread_data[thread_index].sessions, s);
       memset (s, 0, sizeof (*s));
-      s->outside_address_index = address_index;
       b4->nsessions++;
 
       pool_get (dm->per_thread_data[thread_index].list_pool, elt);
@@ -227,7 +224,7 @@ dslite_in2out_node_fn_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
   dslite_in2out_next_t next_index;
   u32 node_index;
   vlib_node_runtime_t *error_node;
-  u32 thread_index = vlib_get_thread_index ();
+  u32 thread_index = vm->thread_index;
   f64 now = vlib_time_now (vm);
   dslite_main_t *dm = &dslite_main;
 
@@ -278,6 +275,11 @@ dslite_in2out_node_fn_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
 
          if (PREDICT_FALSE (ip60->protocol != IP_PROTOCOL_IP_IN_IP))
            {
+             if (ip60->protocol == IP_PROTOCOL_ICMP6)
+               {
+                 next0 = DSLITE_IN2OUT_NEXT_IP6_ICMP;
+                 goto trace0;
+               }
              error0 = DSLITE_ERROR_BAD_IP6_PROTOCOL;
              next0 = DSLITE_IN2OUT_NEXT_DROP;
              goto trace0;
@@ -372,6 +374,7 @@ dslite_in2out_node_fn_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
              sum0 =
                ip_csum_update (sum0, old_port0, new_port0, ip4_header_t,
                                length);
+             mss_clamping (&snat_main, tcp0, &sum0);
              tcp0->checksum = ip_csum_fold (sum0);
            }
          else
@@ -443,7 +446,7 @@ VLIB_REGISTER_NODE (dslite_in2out_node) = {
   .next_nodes = {
     [DSLITE_IN2OUT_NEXT_DROP] = "error-drop",
     [DSLITE_IN2OUT_NEXT_IP4_LOOKUP] = "ip4-lookup",
-    [DSLITE_IN2OUT_NEXT_IP6_LOOKUP] = "ip6-lookup",
+    [DSLITE_IN2OUT_NEXT_IP6_ICMP] = "ip6-icmp-input",
     [DSLITE_IN2OUT_NEXT_SLOWPATH] = "dslite-in2out-slowpath",
   },
 };
@@ -472,7 +475,7 @@ VLIB_REGISTER_NODE (dslite_in2out_slowpath_node) = {
   .next_nodes = {
     [DSLITE_IN2OUT_NEXT_DROP] = "error-drop",
     [DSLITE_IN2OUT_NEXT_IP4_LOOKUP] = "ip4-lookup",
-    [DSLITE_IN2OUT_NEXT_IP6_LOOKUP] = "ip6-lookup",
+    [DSLITE_IN2OUT_NEXT_IP6_ICMP] = "ip6-lookup",
     [DSLITE_IN2OUT_NEXT_SLOWPATH] = "dslite-in2out-slowpath",
   },
 };