From b28652ed7ab016177593b059390f2e99e6af2961 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Mon, 25 Oct 2021 09:47:09 +0000 Subject: ip: comparing IP prefixes should not modify them Type: improvement make the ip_prefix_cmp take const paramenters. plus some other miscellaneous functions. Signed-off-by: Neale Ranns Change-Id: Ib69bacfb09483a8a8f8b89900c92d3d55c354ac6 --- src/vat/ip_types.c | 13 +++++++------ src/vnet/ip/ip.c | 14 ++++++++++++++ src/vnet/ip/ip.h | 2 ++ src/vnet/ip/ip_types.c | 20 ++++++++++++++------ src/vnet/ip/ip_types.h | 4 +++- 5 files changed, 40 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/vat/ip_types.c b/src/vat/ip_types.c index 8edcb133f33..f4dcc96febe 100644 --- a/src/vat/ip_types.c +++ b/src/vat/ip_types.c @@ -344,23 +344,24 @@ ip_prefix_copy (void *dst, void *src) } int -ip_prefix_cmp (ip_prefix_t * p1, ip_prefix_t * p2) +ip_prefix_cmp (const ip_prefix_t *ipp1, const ip_prefix_t *ipp2) { + ip_prefix_t p1 = *ipp1, p2 = *ipp2; int cmp = 0; - ip_prefix_normalize (p1); - ip_prefix_normalize (p2); + ip_prefix_normalize (&p1); + ip_prefix_normalize (&p2); - cmp = ip_address_cmp (&ip_prefix_addr (p1), &ip_prefix_addr (p2)); + cmp = ip_address_cmp (&ip_prefix_addr (&p1), &ip_prefix_addr (&p2)); if (cmp == 0) { - if (ip_prefix_len (p1) < ip_prefix_len (p2)) + if (ip_prefix_len (&p1) < ip_prefix_len (&p2)) { cmp = 1; } else { - if (ip_prefix_len (p1) > ip_prefix_len (p2)) + if (ip_prefix_len (&p1) > ip_prefix_len (&p2)) cmp = 2; } } diff --git a/src/vnet/ip/ip.c b/src/vnet/ip/ip.c index 5d0c7707dd3..0a602b43ac7 100644 --- a/src/vnet/ip/ip.c +++ b/src/vnet/ip/ip.c @@ -18,6 +18,20 @@ u32 ip_flow_hash_router_id; +ethernet_type_t +ip_address_family_to_ether_type (ip_address_family_t af) +{ + switch (af) + { + case AF_IP4: + return (ETHERNET_TYPE_IP4); + case AF_IP6: + return (ETHERNET_TYPE_IP6); + } + ASSERT (0); + return (ETHERNET_TYPE_IP4); +} + u8 ip_is_zero (ip46_address_t * ip46_address, u8 is_ip4) { diff --git a/src/vnet/ip/ip.h b/src/vnet/ip/ip.h index 87689076697..131d6879c14 100644 --- a/src/vnet/ip/ip.h +++ b/src/vnet/ip/ip.h @@ -287,6 +287,8 @@ void ip_feature_enable_disable (ip_address_family_t af, void *feature_config, u32 n_feature_config_bytes); +ethernet_type_t ip_address_family_to_ether_type (ip_address_family_t af); + always_inline u32 vlib_buffer_get_ip4_fib_index (vlib_buffer_t * b); always_inline u32 vlib_buffer_get_ip6_fib_index (vlib_buffer_t * b); always_inline u32 diff --git a/src/vnet/ip/ip_types.c b/src/vnet/ip/ip_types.c index 3e5ecebf142..323cf4d456c 100644 --- a/src/vnet/ip/ip_types.c +++ b/src/vnet/ip/ip_types.c @@ -287,6 +287,13 @@ ip_address_to_fib_prefix (const ip_address_t * addr, fib_prefix_t * prefix) prefix->___fp___pad = 0; } +void +ip_address_to_prefix (const ip_address_t *addr, ip_prefix_t *prefix) +{ + prefix->len = (addr->version == AF_IP4 ? 32 : 128); + clib_memcpy (&prefix->addr, addr, sizeof (prefix->addr)); +} + void ip_address_increment (ip_address_t * ip) { @@ -380,23 +387,24 @@ ip_prefix_copy (void *dst, void *src) } int -ip_prefix_cmp (ip_prefix_t * p1, ip_prefix_t * p2) +ip_prefix_cmp (const ip_prefix_t *ipp1, const ip_prefix_t *ipp2) { + ip_prefix_t p1 = *ipp1, p2 = *ipp2; int cmp = 0; - ip_prefix_normalize (p1); - ip_prefix_normalize (p2); + ip_prefix_normalize (&p1); + ip_prefix_normalize (&p2); - cmp = ip_address_cmp (&ip_prefix_addr (p1), &ip_prefix_addr (p2)); + cmp = ip_address_cmp (&ip_prefix_addr (&p1), &ip_prefix_addr (&p2)); if (cmp == 0) { - if (ip_prefix_len (p1) < ip_prefix_len (p2)) + if (ip_prefix_len (&p1) < ip_prefix_len (&p2)) { cmp = 1; } else { - if (ip_prefix_len (p1) > ip_prefix_len (p2)) + if (ip_prefix_len (&p1) > ip_prefix_len (&p2)) cmp = 2; } } diff --git a/src/vnet/ip/ip_types.h b/src/vnet/ip/ip_types.h index 83a0f6adc72..e4d89ebd88d 100644 --- a/src/vnet/ip/ip_types.h +++ b/src/vnet/ip/ip_types.h @@ -126,11 +126,13 @@ typedef struct ip_prefix #define ip_prefix_v4(_a) ip_addr_v4(&ip_prefix_addr(_a)) #define ip_prefix_v6(_a) ip_addr_v6(&ip_prefix_addr(_a)) -extern int ip_prefix_cmp (ip_prefix_t * p1, ip_prefix_t * p2); +extern int ip_prefix_cmp (const ip_prefix_t *p1, const ip_prefix_t *p2); extern void ip_prefix_normalize (ip_prefix_t * a); extern void ip_address_to_fib_prefix (const ip_address_t * addr, fib_prefix_t * prefix); +extern void ip_address_to_prefix (const ip_address_t *addr, + ip_prefix_t *prefix); extern void ip_prefix_to_fib_prefix (const ip_prefix_t * ipp, fib_prefix_t * fibp); extern u8 *format_ip_prefix (u8 * s, va_list * args); -- cgit 1.2.3-korg