From: Damjan Marion Date: Tue, 17 May 2016 10:02:07 +0000 (+0200) Subject: Fix output feature issue where opque field is already used by previous node X-Git-Tag: v16.09-rc1~393 X-Git-Url: https://gerrit.fd.io/r/gitweb?a=commitdiff_plain;h=2df2e999fb9408f041dcf300df0983b7ebe5433e;p=vpp.git Fix output feature issue where opque field is already used by previous node Change-Id: I1470993668fa8c740229149bbb227bd1e410d5ab Signed-off-by: Damjan Marion --- diff --git a/vnet/vnet/buffer.h b/vnet/vnet/buffer.h index 7153f3541b1..050642276b5 100644 --- a/vnet/vnet/buffer.h +++ b/vnet/vnet/buffer.h @@ -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) \ diff --git a/vnet/vnet/interface_output.c b/vnet/vnet/interface_output.c index a8dd451fe82..04c1b7f59f8 100644 --- a/vnet/vnet/interface_output.c +++ b/vnet/vnet/interface_output.c @@ -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);