X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fbier%2Fbier_lookup.c;h=c57c81d7aa9135d3c6482183ab296f2b60e34f50;hb=e524d45eff40c773049e03ea5063216b469bbfcc;hp=4cf29f886e43159528fc8dafb9c0691d0af22818;hpb=d792d9c01e60656cbfe1b0f1fd6a9b125f5dab0c;p=vpp.git diff --git a/src/vnet/bier/bier_lookup.c b/src/vnet/bier/bier_lookup.c index 4cf29f886e4..c57c81d7aa9 100644 --- a/src/vnet/bier/bier_lookup.c +++ b/src/vnet/bier/bier_lookup.c @@ -22,7 +22,7 @@ #include /** - * 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_ { @@ -84,6 +84,7 @@ bier_lookup (vlib_main_t * vm, 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; @@ -98,7 +99,6 @@ bier_lookup (vlib_main_t * vm, 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; @@ -138,7 +138,7 @@ bier_lookup (vlib_main_t * vm, * number of integer sized buckets */ n_bytes = bier_hdr_len_id_to_num_buckets(bt0->bt_id.bti_hdr_len); - vnet_buffer(b0)->bier.n_bytes = n_bytes; + vnet_buffer(b0)->mpls.bier.n_bytes = n_bytes; vnet_buffer(b0)->sw_if_index[VLIB_TX] = ~0; num_buckets = n_bytes / sizeof(int); bier_bit_string_init(&bbs, @@ -178,7 +178,6 @@ bier_lookup (vlib_main_t * vm, if (PREDICT_TRUE(INDEX_INVALID != bfmi0)) { bfm0 = bier_fmask_get(bfmi0); - vnet_buffer (b0)->ip.adj_index[VLIB_TX] = bfmi0; /* * use the bit-string on the fmask to reset @@ -200,6 +199,9 @@ bier_lookup (vlib_main_t * vm, /* * 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; } @@ -211,19 +213,19 @@ bier_lookup (vlib_main_t * vm, * 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); 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) + if (num_cloned != vec_len(blm->blm_fmasks[thread_index])) { vlib_node_increment_counter (vm, node->node_index, @@ -237,6 +239,8 @@ bier_lookup (vlib_main_t * vm, ci0 = blm->blm_clones[thread_index][clone]; c0 = vlib_get_buffer(vm, ci0); + vnet_buffer(c0)->ip.adj_index[VLIB_TX] = + blm->blm_fmasks[thread_index][clone]; to_next[0] = ci0; to_next += 1; @@ -246,12 +250,12 @@ bier_lookup (vlib_main_t * vm, { bier_lookup_trace_t *tr; - vlib_trace_buffer (vm, node, next0, c0, 0); + if (c0 != b0) + vlib_buffer_copy_trace_flag (vm, b0, ci0); + 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, @@ -300,12 +304,12 @@ bier_lookup (vlib_main_t * vm, } } - 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); } @@ -354,11 +358,11 @@ bier_lookup_module_init (vlib_main_t * vm) 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;