nat: fix vnet_feature_next in source hairpinning 47/31747/2
authorKlement Sekera <ksekera@cisco.com>
Wed, 24 Mar 2021 15:46:22 +0000 (16:46 +0100)
committerOle Tr�an <otroan@employees.org>
Thu, 25 Mar 2021 09:37:13 +0000 (09:37 +0000)
Avoid erroneous double vnet_feature_next if routing buffer manually.

Type: fix
Change-Id: I3f56c12bf57f59a1e5ddad63a2565fa195934cf6
Signed-off-by: Klement Sekera <ksekera@cisco.com>
src/plugins/nat/nat44-ei/nat44_ei_hairpinning.c

index 0de2de1..a049e46 100644 (file)
@@ -440,7 +440,6 @@ VLIB_NODE_FN (nat44_ei_hairpin_src_node)
 
          b0 = vlib_get_buffer (vm, bi0);
          sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
-         vnet_feature_next (&next0, b0);
 
          pool_foreach (i, nm->output_feature_interfaces)
            {
@@ -452,14 +451,23 @@ VLIB_NODE_FN (nat44_ei_hairpin_src_node)
                                     NAT44_EI_FLAG_HAIRPINNING))
                    {
                      if (PREDICT_TRUE (nm->num_workers > 1))
-                       next0 = NAT44_EI_HAIRPIN_SRC_NEXT_SNAT_IN2OUT_WH;
+                       {
+                         next0 = NAT44_EI_HAIRPIN_SRC_NEXT_SNAT_IN2OUT_WH;
+                         goto skip_feature_next;
+                       }
                      else
-                       next0 = NAT44_EI_HAIRPIN_SRC_NEXT_SNAT_IN2OUT;
+                       {
+                         next0 = NAT44_EI_HAIRPIN_SRC_NEXT_SNAT_IN2OUT;
+                         goto skip_feature_next;
+                       }
                    }
                  break;
                }
            }
 
+         vnet_feature_next (&next0, b0);
+       skip_feature_next:
+
          if (next0 != NAT44_EI_HAIRPIN_SRC_NEXT_DROP)
            {
              vlib_increment_simple_counter (