diff options
author | Neale Ranns <nranns@cisco.com> | 2018-12-17 05:50:32 -0800 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2018-12-18 12:52:56 +0000 |
commit | 9e829a856fdf88b3ea5770048ea20dcd50d1b4eb (patch) | |
tree | 48506b15a4550b5f766248378d5aea03510ce0f8 /src/vnet/mfib/mfib_types.c | |
parent | 05b5d1b3a6663c0366e863adc845d7ee4facc1e3 (diff) |
MFIB: recurse resolution through an MFIB entry
Change-Id: I8dc261e40b8398c5c8ab6bb69ecebbd0176055d9
Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/vnet/mfib/mfib_types.c')
-rw-r--r-- | src/vnet/mfib/mfib_types.c | 76 |
1 files changed, 76 insertions, 0 deletions
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) { |