From 9e829a856fdf88b3ea5770048ea20dcd50d1b4eb Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Mon, 17 Dec 2018 05:50:32 -0800 Subject: MFIB: recurse resolution through an MFIB entry Change-Id: I8dc261e40b8398c5c8ab6bb69ecebbd0176055d9 Signed-off-by: Neale Ranns --- src/vnet/mfib/mfib_types.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) (limited to 'src/vnet/mfib/mfib_types.c') diff --git a/src/vnet/mfib/mfib_types.c b/src/vnet/mfib/mfib_types.c index a3ed46a4b8d..19583ea18f4 100644 --- a/src/vnet/mfib/mfib_types.c +++ b/src/vnet/mfib/mfib_types.c @@ -26,6 +26,82 @@ static const char *mfib_flag_names_long[] = MFIB_ENTRY_NAMES_LONG; static const char *mfib_itf_flag_long_names[] = MFIB_ITF_NAMES_LONG; static const char *mfib_itf_flag_names[] = MFIB_ITF_NAMES_SHORT; +int +mfib_prefix_is_cover (const mfib_prefix_t *p1, + const mfib_prefix_t *p2) +{ + if (!ip46_address_is_equal(&p1->fp_src_addr, &p2->fp_src_addr)) + return (0); + + switch (p1->fp_proto) + { + case FIB_PROTOCOL_IP4: + return (ip4_destination_matches_route(&ip4_main, + &p1->fp_grp_addr.ip4, + &p2->fp_grp_addr.ip4, + p1->fp_len)); + case FIB_PROTOCOL_IP6: + return (ip6_destination_matches_route(&ip6_main, + &p1->fp_grp_addr.ip6, + &p2->fp_grp_addr.ip6, + p1->fp_len)); + case FIB_PROTOCOL_MPLS: + break; + } + return (0); +} + +int +mfib_prefix_is_host (const mfib_prefix_t *pfx) +{ + switch (pfx->fp_proto) + { + case FIB_PROTOCOL_IP4: + return (64 == pfx->fp_len); + case FIB_PROTOCOL_IP6: + return (256 == pfx->fp_len); + case FIB_PROTOCOL_MPLS: + ASSERT(0); + break; + } + return (0); +} + +fib_forward_chain_type_t +mfib_forw_chain_type_from_dpo_proto (dpo_proto_t proto) +{ + switch (proto) + { + case DPO_PROTO_IP4: + return (FIB_FORW_CHAIN_TYPE_MCAST_IP4); + case DPO_PROTO_IP6: + return (FIB_FORW_CHAIN_TYPE_MCAST_IP6); + case DPO_PROTO_MPLS: + case DPO_PROTO_ETHERNET: + case DPO_PROTO_NSH: + case DPO_PROTO_BIER: + break; + } + ASSERT(0); + return (FIB_FORW_CHAIN_TYPE_MCAST_IP4); +} + +fib_forward_chain_type_t +mfib_forw_chain_type_from_fib_proto (fib_protocol_t proto) +{ + switch (proto) + { + case FIB_PROTOCOL_IP4: + return (FIB_FORW_CHAIN_TYPE_MCAST_IP4); + case FIB_PROTOCOL_IP6: + return (FIB_FORW_CHAIN_TYPE_MCAST_IP6); + case FIB_PROTOCOL_MPLS: + break; + } + ASSERT(0); + return (FIB_FORW_CHAIN_TYPE_MCAST_IP4); +} + u8 * format_mfib_prefix (u8 * s, va_list * args) { -- cgit 1.2.3-korg