X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fbier%2Fbier_imp_node.c;h=8b203258cf5707c78a01001ac57b000857601273;hb=68577d2982a345537e300e99a8c0e0311fe08ce1;hp=e9aae93b460a215f39a3d68dad5dc24744faf1dd;hpb=d792d9c01e60656cbfe1b0f1fd6a9b125f5dab0c;p=vpp.git diff --git a/src/vnet/bier/bier_imp_node.c b/src/vnet/bier/bier_imp_node.c index e9aae93b460..8b203258cf5 100644 --- a/src/vnet/bier/bier_imp_node.c +++ b/src/vnet/bier/bier_imp_node.c @@ -120,24 +120,39 @@ bier_imp_dpo_inline (vlib_main_t * vm, vlib_buffer_advance(b0, -(sizeof(bier_hdr_t) + bier_hdr_len_id_to_num_bytes(bimp0->bi_tbl.bti_hdr_len))); hdr0 = vlib_buffer_get_current(b0); - clib_memcpy(hdr0, &bimp0->bi_hdr, - (sizeof(bier_hdr_t) + - bier_hdr_len_id_to_num_bytes(bimp0->bi_tbl.bti_hdr_len))); - /* - * Fixup the entropy and protocol, both of which have a - * zero value post the paint job - */ - hdr0->bh_oam_dscp_proto |= - clib_host_to_net_u16(bproto << BIER_HDR_PROTO_FIELD_SHIFT); - hdr0->bh_first_word |= - clib_host_to_net_u32((vnet_buffer(b0)->ip.flow_hash & - BIER_HDR_ENTROPY_FIELD_MASK) << - BIER_HDR_ENTROPY_FIELD_SHIFT); - - /* next node */ - next0 = bimp0->bi_dpo[fproto].dpoi_next_node; - vnet_buffer(b0)->ip.adj_index[VLIB_TX] = - bimp0->bi_dpo[fproto].dpoi_index; + + /* RPF check */ + if (PREDICT_FALSE(BIER_RX_ITF == vnet_buffer(b0)->ip.adj_index[VLIB_RX])) + { + next0 = 0; + } + else + { + clib_memcpy_fast(hdr0, &bimp0->bi_hdr, + (sizeof(bier_hdr_t) + + bier_hdr_len_id_to_num_bytes(bimp0->bi_tbl.bti_hdr_len))); + /* + * Fixup the entropy and protocol, both of which have a + * zero value post the paint job + */ + hdr0->bh_oam_dscp_proto |= + clib_host_to_net_u16(bproto << BIER_HDR_PROTO_FIELD_SHIFT); + hdr0->bh_first_word |= + clib_host_to_net_u32((vnet_buffer(b0)->ip.flow_hash & + BIER_HDR_ENTROPY_FIELD_MASK) << + BIER_HDR_ENTROPY_FIELD_SHIFT); + + /* + * use TTL 64 for the post encap MPLS label/BIFT-ID + * this we be decremented in bier_output node. + */ + vnet_buffer(b0)->mpls.ttl = 65; + + /* next node */ + next0 = bimp0->bi_dpo[fproto].dpoi_next_node; + vnet_buffer(b0)->ip.adj_index[VLIB_TX] = + bimp0->bi_dpo[fproto].dpoi_index; + } if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED)) { @@ -170,8 +185,7 @@ format_bier_imp_trace (u8 * s, va_list * args) return (s); } -static uword -bier_imp_ip4 (vlib_main_t * vm, +VLIB_NODE_FN (bier_imp_ip4_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -181,20 +195,17 @@ bier_imp_ip4 (vlib_main_t * vm, } VLIB_REGISTER_NODE (bier_imp_ip4_node) = { - .function = bier_imp_ip4, .name = "bier-imp-ip4", .vector_size = sizeof (u32), .format_trace = format_bier_imp_trace, .n_next_nodes = 1, .next_nodes = { - [0] = "error-drop", + [0] = "bier-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (bier_imp_ip4_node, bier_imp_ip4) -static uword -bier_imp_ip6 (vlib_main_t * vm, +VLIB_NODE_FN (bier_imp_ip6_node) (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { @@ -204,7 +215,6 @@ bier_imp_ip6 (vlib_main_t * vm, } VLIB_REGISTER_NODE (bier_imp_ip6_node) = { - .function = bier_imp_ip6, .name = "bier-imp-ip6", .vector_size = sizeof (u32), @@ -214,4 +224,3 @@ VLIB_REGISTER_NODE (bier_imp_ip6_node) = { [0] = "error-drop", } }; -VLIB_NODE_FUNCTION_MULTIARCH (bier_imp_ip6_node, bier_imp_ip6)