- 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;
+ }