Fix output feature issue where opque field is already used by previous node 69/1169/2
authorDamjan Marion <damarion@cisco.com>
Tue, 17 May 2016 10:02:07 +0000 (12:02 +0200)
committerFlorin Coras <florin.coras@gmail.com>
Tue, 17 May 2016 18:34:09 +0000 (18:34 +0000)
Change-Id: I1470993668fa8c740229149bbb227bd1e410d5ab
Signed-off-by: Damjan Marion <damarion@cisco.com>
vnet/vnet/buffer.h
vnet/vnet/interface_output.c

index 7153f35..0506422 100644 (file)
@@ -61,6 +61,8 @@
 #define ETH_BUFFER_VLAN_BITS (ETH_BUFFER_VLAN_1_DEEP | \
                               ETH_BUFFER_VLAN_2_DEEP)
 
+#define LOG2_BUFFER_OUTPUT_FEAT_DONE LOG2_VLIB_BUFFER_FLAG_USER(5)
+#define BUFFER_OUTPUT_FEAT_DONE (1 << LOG2_BUFFER_OUTPUT_FEAT_DONE)
 
 #define foreach_buffer_opaque_union_subtype     \
 _(ethernet)                                     \
index a8dd451..04c1b7f 100644 (file)
@@ -495,9 +495,10 @@ vnet_interface_output_node_no_flatten (vlib_main_t * vm,
          n_packets += 2;
 
           if (PREDICT_FALSE(si->output_feature_bitmap &&
-              vnet_buffer(b0)->output_features.bitmap != (1 << INTF_OUTPUT_FEAT_DONE)))
+              ((b0->flags & BUFFER_OUTPUT_FEAT_DONE) == 0)))
             {
               u32 next0;
+              b0->flags |= BUFFER_OUTPUT_FEAT_DONE;
               vnet_buffer(b0)->output_features.bitmap = si->output_feature_bitmap;
               count_trailing_zeros(next0, vnet_buffer(b0)->output_features.bitmap);
               vnet_buffer(b0)->output_features.bitmap &= ~(1 << next0);
@@ -521,9 +522,10 @@ vnet_interface_output_node_no_flatten (vlib_main_t * vm,
             }
 
           if (PREDICT_FALSE(si->output_feature_bitmap &&
-              vnet_buffer(b1)->output_features.bitmap != (1 << INTF_OUTPUT_FEAT_DONE)))
+              ((b1->flags & BUFFER_OUTPUT_FEAT_DONE) == 0)))
             {
               u32 next1;
+              b1->flags |= BUFFER_OUTPUT_FEAT_DONE;
               vnet_buffer(b1)->output_features.bitmap = si->output_feature_bitmap;
               count_trailing_zeros(next1, vnet_buffer(b1)->output_features.bitmap);
               vnet_buffer(b1)->output_features.bitmap &= ~(1 << next1);
@@ -573,9 +575,10 @@ vnet_interface_output_node_no_flatten (vlib_main_t * vm,
          n_packets += 1;
 
           if (PREDICT_FALSE(si->output_feature_bitmap &&
-              vnet_buffer(b0)->output_features.bitmap != (1 << INTF_OUTPUT_FEAT_DONE)))
+              ((b0->flags & BUFFER_OUTPUT_FEAT_DONE) == 0)))
             {
               u32 next0;
+              b0->flags |= BUFFER_OUTPUT_FEAT_DONE;
               vnet_buffer(b0)->output_features.bitmap = si->output_feature_bitmap;
               count_trailing_zeros(next0, vnet_buffer(b0)->output_features.bitmap);
               vnet_buffer(b0)->output_features.bitmap &= ~(1 << next0);