summaryrefslogtreecommitdiffstats
path: root/src/vnet/mfib/ip4_mfib.c
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2018-12-17 05:50:32 -0800
committerDamjan Marion <dmarion@me.com>2018-12-18 12:52:56 +0000
commit9e829a856fdf88b3ea5770048ea20dcd50d1b4eb (patch)
tree48506b15a4550b5f766248378d5aea03510ce0f8 /src/vnet/mfib/ip4_mfib.c
parent05b5d1b3a6663c0366e863adc845d7ee4facc1e3 (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/ip4_mfib.c')
-rw-r--r--src/vnet/mfib/ip4_mfib.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/vnet/mfib/ip4_mfib.c b/src/vnet/mfib/ip4_mfib.c
index 9d70f0b664f..d20d1f6c2b9 100644
--- a/src/vnet/mfib/ip4_mfib.c
+++ b/src/vnet/mfib/ip4_mfib.c
@@ -224,6 +224,38 @@ ip4_mfib_table_lookup (const ip4_mfib_t *mfib,
return (FIB_NODE_INDEX_INVALID);
}
+fib_node_index_t
+ip4_mfib_table_get_less_specific (const ip4_mfib_t *mfib,
+ const ip4_address_t *src,
+ const ip4_address_t *grp,
+ u32 len)
+{
+ u32 mask_len;
+
+ /*
+ * in the absence of a tree structure for the table that allows for an O(1)
+ * parent get, a cheeky way to find the cover is to LPM for the prefix with
+ * mask-1.
+ * there should always be a cover, though it may be the default route. the
+ * default route's cover is the default route.
+ */
+ if (len == 64)
+ {
+ /* go from (S,G) to (*,G*) */
+ mask_len = 32;
+ }
+ else if (len != 0)
+ {
+ mask_len = len - 1;
+ }
+ else
+ {
+ mask_len = len;
+ }
+
+ return (ip4_mfib_table_lookup(mfib, src, grp, mask_len));
+}
+
void
ip4_mfib_table_entry_insert (ip4_mfib_t *mfib,
const ip4_address_t *grp,