diff options
author | Matthew Smith <mgsmith@netgate.com> | 2019-08-07 11:46:30 -0500 |
---|---|---|
committer | Neale Ranns <nranns@cisco.com> | 2019-08-12 16:50:54 +0000 |
commit | 6c92f5babdc3c52cf343509fc9cf9d8a9a3df390 (patch) | |
tree | 969249e9836e232929949492f3f45ac5c1deba35 /src/vnet/ip/lookup.h | |
parent | 79c04d622a55b75de969bf010cdcb820ccfbe816 (diff) |
ip: allow addrs from the same prefix on intf
Type: feature
Adding a prefix to an interface was not permitted if it overlapped
with another prefix on an interface which used the same FIB.
Loosen the restriction. Allow 2 or more addresses from the same
prefix on a single interface. Reference count the prefix to figure
out when a glean/connected route for the prefix needs to be added
or removed.
Added unit tests to check that the route is only removed when all
addresses in the prefix are removed from the interface.
Change-Id: I1a962ecb5e1ee65fc6d41f98a4cc097a51a55321
Signed-off-by: Matthew Smith <mgsmith@netgate.com>
Diffstat (limited to 'src/vnet/ip/lookup.h')
-rw-r--r-- | src/vnet/ip/lookup.h | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/vnet/ip/lookup.h b/src/vnet/ip/lookup.h index 4c598e3a460..6340e57e095 100644 --- a/src/vnet/ip/lookup.h +++ b/src/vnet/ip/lookup.h @@ -86,6 +86,24 @@ typedef u32 flow_hash_config_t; /* An all zeros address */ extern const ip46_address_t zero_addr; +typedef struct +{ + fib_prefix_t prefix; + + u32 sw_if_index; +} ip_interface_prefix_key_t; + +typedef struct +{ + /* key - prefix and sw_if_index */ + ip_interface_prefix_key_t key; + + /* number of addresses in this prefix on the interface */ + u16 ref_count; + + /* index of the interface address used as a default source address */ + u32 src_ia_index; +} ip_interface_prefix_t; typedef struct { @@ -131,6 +149,12 @@ typedef struct ip_lookup_main_t ~0 means this interface has no address. */ u32 *if_address_pool_index_by_sw_if_index; + /** Pool of prefixes containing addresses assigned to interfaces */ + ip_interface_prefix_t *if_prefix_pool; + + /** Hash table mapping prefix to index in interface prefix pool */ + mhash_t prefix_to_if_prefix_index; + /** First table index to use for this interface, ~0 => none */ u32 *classify_table_index_by_sw_if_index; @@ -178,6 +202,13 @@ ip_interface_address_get_address (ip_lookup_main_t * lm, return mhash_key_to_mem (&lm->address_to_if_address_index, a->address_key); } +always_inline ip_interface_prefix_t * +ip_get_interface_prefix (ip_lookup_main_t * lm, ip_interface_prefix_key_t * k) +{ + uword *p = mhash_get (&lm->prefix_to_if_prefix_index, k); + return p ? pool_elt_at_index (lm->if_prefix_pool, p[0]) : 0; +} + /* *INDENT-OFF* */ #define foreach_ip_interface_address(lm,a,sw_if_index,loop,body) \ do { \ |