#include <vnet/bier/bier_fmask.h>
/**
- * Struct maintining the per-worker thread data for BIER lookups
+ * Struct maintaining the per-worker thread data for BIER lookups
*/
typedef struct bier_lookup_main_t_
{
};
/*
- * Keep these values sematically the same as BIER lookup
+ * Keep these values semantically the same as BIER lookup
*/
#define foreach_bier_lookup_next \
_(DROP, "bier-drop") \
vlib_node_registration_t bier_lookup_node;
/**
- * @brief Packet trace recoed for a BIER lookup
+ * @brief Packet trace record for a BIER lookup
*/
typedef struct bier_lookup_trace_t_
{
u32 n_left_from, next_index, * from, * to_next;
bier_lookup_main_t *blm = &bier_lookup_main;
u32 thread_index = vlib_get_thread_index();
+ bier_bit_mask_bucket_t buckets_copy[BIER_HDR_BUCKETS_4096];
from = vlib_frame_vector_args (from_frame);
n_left_from = from_frame->n_vectors;
while (n_left_from > 0 && n_left_to_next > 0)
{
- bier_bit_mask_bucket_t buckets_copy[BIER_HDR_BUCKETS_256];
u32 next0, bi0, n_bytes, bti0, bfmi0;
const bier_fmask_t *bfm0;
const bier_table_t *bt0;
memcpy(bbs.bbs_buckets, bh0->bh_bit_string, bbs.bbs_len);
/*
- * reset the fmask and clone storage vectors
+ * reset the fmask storage vector
*/
vec_reset_length (blm->blm_fmasks[thread_index]);
- vec_reset_length (blm->blm_clones[thread_index]);
/*
* Loop through the buckets in the header
/*
* go to the next bit-position set
*/
+ vlib_node_increment_counter(
+ vm, node->node_index,
+ BIER_LOOKUP_ERROR_FMASK_UNRES, 1);
bucket = ((int*)bbs.bbs_buckets)[index];
continue;
}
* Create the number of clones we need based on the number
* of fmasks we are sending to.
*/
- u8 num_cloned, clone;
+ u16 num_cloned, clone;
u32 n_clones;
n_clones = vec_len(blm->blm_fmasks[thread_index]);
if (PREDICT_TRUE(0 != n_clones))
{
- ASSERT(n_clones < 256);
+ vec_set_len(blm->blm_clones[thread_index], n_clones);
num_cloned = vlib_buffer_clone(vm, bi0,
blm->blm_clones[thread_index],
- n_clones, 128);
+ n_clones,
+ VLIB_BUFFER_CLONE_HEAD_SIZE);
+
if (num_cloned != n_clones)
{
+ vec_set_len(blm->blm_clones[thread_index], num_cloned);
vlib_node_increment_counter
(vm, node->node_index,
BIER_LOOKUP_ERROR_BUFFER_ALLOCATION_FAILURE, 1);
{
bier_lookup_trace_t *tr;
- vlib_trace_buffer (vm, node, next0, c0, 0);
tr = vlib_add_trace (vm, node, c0, sizeof (*tr));
tr->bt_index = bti0;
tr->bfm_index = blm->blm_fmasks[thread_index][clone];
-
- c0->flags |= VLIB_BUFFER_IS_TRACED;
}
vlib_validate_buffer_enqueue_x1(vm, node, next_index,
}
}
- vlib_put_next_frame (vm, node, next_index, n_left_to_next);
+ vlib_put_next_frame(vm, node, next_index, n_left_to_next);
}
- vlib_node_increment_counter (vm, bier_lookup_node.index,
- BIER_LOOKUP_ERROR_NONE,
- from_frame->n_vectors);
+ vlib_node_increment_counter(vm, bier_lookup_node.index,
+ BIER_LOOKUP_ERROR_NONE,
+ from_frame->n_vectors);
return (from_frame->n_vectors);
}
thread_index++)
{
/*
- * 4096 is the most we will ever need to support
- * a Bit-Mask length of 4096
+ * 1024 is the most we will ever need to support
+ * a Bit-Mask length of 1024
*/
- vec_validate(blm->blm_fmasks[thread_index], 4095);
- vec_validate(blm->blm_clones[thread_index], 4095);
+ vec_validate(blm->blm_fmasks[thread_index], 1023);
+ vec_validate(blm->blm_clones[thread_index], 1023);
}
return 0;