nat: don't drop packet with ttl=1 if output feature
[vpp.git] / src / plugins / nat / nat44-ed / nat44_ed_in2out.c
index 6658e5b..426b6ee 100644 (file)
@@ -69,12 +69,13 @@ format_nat_in2out_ed_trace (u8 * s, va_list * args)
     t->is_slow_path ? "NAT44_IN2OUT_ED_SLOW_PATH" :
     "NAT44_IN2OUT_ED_FAST_PATH";
 
-  s = format (s, "%s: sw_if_index %d, next index %d, session %d", tag,
-             t->sw_if_index, t->next_index, t->session_index);
+  s = format (s, "%s: sw_if_index %d, next index %d", tag, t->sw_if_index,
+             t->next_index);
   if (~0 != t->session_index)
     {
-      s = format (s, ", translation result '%U' via %s",
-                 format_nat_ed_translation_error, t->translation_error,
+      s = format (s, ", session %d, translation result '%U' via %s",
+                 t->session_index, format_nat_ed_translation_error,
+                 t->translation_error,
                  t->translation_via_i2of ? "i2of" : "o2if");
       s = format (s, "\n  i2of %U", format_nat_6t_flow, &t->i2of);
       s = format (s, "\n  o2if %U", format_nat_6t_flow, &t->o2if);
@@ -1029,7 +1030,7 @@ nat44_ed_in2out_fast_path_node_fn_inline (vlib_main_t *vm,
        fib_table_get_index_for_sw_if_index (FIB_PROTOCOL_IP4, sw_if_index0);
       lookup.fib_index = rx_fib_index0;
 
-      if (PREDICT_FALSE (ip0->ttl == 1))
+      if (PREDICT_FALSE (!is_output_feature && ip0->ttl == 1))
        {
          vnet_buffer (b0)->sw_if_index[VLIB_TX] = (u32) ~ 0;
          icmp4_error_set_vnet_buffer (b0, ICMP4_time_exceeded,
@@ -1121,6 +1122,8 @@ nat44_ed_in2out_fast_path_node_fn_inline (vlib_main_t *vm,
 
     skip_lookup:
 
+      ASSERT (thread_index == s0->thread_index);
+
       if (PREDICT_FALSE (per_vrf_sessions_is_expired (s0, thread_index)))
        {
          // session is closed, go slow path
@@ -1305,7 +1308,7 @@ nat44_ed_in2out_slow_path_node_fn_inline (vlib_main_t *vm,
       rx_fib_index0 =
        fib_table_get_index_for_sw_if_index (FIB_PROTOCOL_IP4, sw_if_index0);
 
-      if (PREDICT_FALSE (ip0->ttl == 1))
+      if (PREDICT_FALSE (!is_output_feature && ip0->ttl == 1))
        {
          vnet_buffer (b0)->sw_if_index[VLIB_TX] = (u32) ~ 0;
          icmp4_error_set_vnet_buffer (b0, ICMP4_time_exceeded,
@@ -1326,9 +1329,10 @@ nat44_ed_in2out_slow_path_node_fn_inline (vlib_main_t *vm,
          if (!s0)
            next[0] = NAT_NEXT_DROP;
 
-         if (NAT_ED_TRNSL_ERR_SUCCESS !=
-             (translation_error = nat_6t_flow_buf_translate (
-                sm, b0, ip0, &s0->i2o, proto0, is_output_feature)))
+         if (NAT_NEXT_DROP != next[0] && s0 &&
+             NAT_ED_TRNSL_ERR_SUCCESS !=
+               (translation_error = nat_6t_flow_buf_translate (
+                  sm, b0, ip0, &s0->i2o, proto0, is_output_feature)))
            {
              goto trace0;
            }