X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fbier%2Fbier_lookup.c;h=4e544a3aca51e3bb08746be082c687d64ef63db9;hb=2303cb181b51f63c909cd506125c1f832432865a;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..4e544a3aca5 100644 --- a/src/vnet/bier/bier_lookup.c +++ b/src/vnet/bier/bier_lookup.c @@ -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, + n_bytes + 8); - 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; @@ -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;