lib: Enhance prefix dump for EVPN prefixes

This commit is also taking into account changes related to srcdes
feature introduction in zebra folder.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Reviewed-by:   Donald Sharp <sharpd@cumulusnetworks.com>
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>

Ticket: CM-12262
Reviewed By: CCR-5065
Testing Done: Manual

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
vivek 2016-08-09 15:55:51 -07:00 committed by Philippe Guibert
parent fd6c6cb49b
commit 78b81eaa44
6 changed files with 43 additions and 24 deletions

View File

@ -859,23 +859,39 @@ str2prefix (const char *str, struct prefix *p)
} }
const char * const char *
prefix2str (union prefix46constptr pu, char *str, int size) prefix2str (union prefixconstptr pu, char *str, int size)
{ {
const struct prefix *p = pu.p; const struct prefix *p = pu.p;
char buf[PREFIX2STR_BUFFER];
if (p->family == AF_ETHERNET) switch (p->family)
{ {
snprintf(str, size, "%02x:%02x:%02x:%02x:%02x:%02x/%d", u_char family;
p->u.prefix_eth.octet[0], p->u.prefix_eth.octet[1],
p->u.prefix_eth.octet[2], p->u.prefix_eth.octet[3], case AF_INET:
p->u.prefix_eth.octet[4], p->u.prefix_eth.octet[5], case AF_INET6:
p->prefixlen); snprintf (str, size, "%s/%d",
} inet_ntop (p->family, &p->u.prefix, buf, PREFIX2STR_BUFFER),
else p->prefixlen);
{ break;
char buf[PREFIX2STR_BUFFER];
inet_ntop(p->family, &p->u.prefix, buf, sizeof(buf)); case AF_ETHERNET:
snprintf(str, size, "%s/%d", buf, p->prefixlen); if (p->u.prefix_evpn.route_type == 5)
{
family = (p->u.prefix_evpn.flags & (IP_ADDR_V4 | IP_PREFIX_V4)) ?
AF_INET : AF_INET6;
snprintf (str, size, "[%d]:[%u][%s]/%d",
p->u.prefix_evpn.route_type,
p->u.prefix_evpn.eth_tag,
inet_ntop (family, &p->u.prefix_evpn.ip.addr,
buf, PREFIX2STR_BUFFER),
p->prefixlen);
}
break;
default:
sprintf (str, "UNK prefix");
break;
} }
return str; return str;

View File

@ -69,6 +69,7 @@ struct evpn_addr
u_char ip_prefix_length; u_char ip_prefix_length;
union union
{ {
u_char addr;
struct in_addr v4_addr; struct in_addr v4_addr;
struct in6_addr v6_addr; struct in6_addr v6_addr;
} ip; } ip;
@ -185,18 +186,20 @@ struct prefix_sg
* side, which strips type safety since the cast will accept any pointer * side, which strips type safety since the cast will accept any pointer
* type.) * type.)
*/ */
union prefix46ptr union prefixptr
{ {
struct prefix *p; struct prefix *p;
struct prefix_ipv4 *p4; struct prefix_ipv4 *p4;
struct prefix_ipv6 *p6; struct prefix_ipv6 *p6;
struct prefix_evpn *evp;
} __attribute__ ((transparent_union)); } __attribute__ ((transparent_union));
union prefix46constptr union prefixconstptr
{ {
const struct prefix *p; const struct prefix *p;
const struct prefix_ipv4 *p4; const struct prefix_ipv4 *p4;
const struct prefix_ipv6 *p6; const struct prefix_ipv6 *p6;
const struct prefix_evpn *evp;
} __attribute__ ((transparent_union)); } __attribute__ ((transparent_union));
#ifndef INET_ADDRSTRLEN #ifndef INET_ADDRSTRLEN
@ -270,7 +273,7 @@ extern int str2prefix (const char *, struct prefix *);
#define PREFIX2STR_BUFFER PREFIX_STRLEN #define PREFIX2STR_BUFFER PREFIX_STRLEN
extern const char *prefix2str (union prefix46constptr, char *, int); extern const char *prefix2str (union prefixconstptr, char *, int);
extern int prefix_match (const struct prefix *, const struct prefix *); extern int prefix_match (const struct prefix *, const struct prefix *);
extern int prefix_same (const struct prefix *, const struct prefix *); extern int prefix_same (const struct prefix *, const struct prefix *);
extern int prefix_cmp (const struct prefix *, const struct prefix *); extern int prefix_cmp (const struct prefix *, const struct prefix *);

View File

@ -242,7 +242,7 @@ srcdest_route_next(struct route_node *rn)
} }
struct route_node * struct route_node *
srcdest_rnode_get (struct route_table *table, union prefix46ptr dst_pu, srcdest_rnode_get (struct route_table *table, union prefixptr dst_pu,
struct prefix_ipv6 *src_p) struct prefix_ipv6 *src_p)
{ {
struct prefix_ipv6 *dst_p = dst_pu.p6; struct prefix_ipv6 *dst_p = dst_pu.p6;
@ -253,7 +253,7 @@ srcdest_rnode_get (struct route_table *table, union prefix46ptr dst_pu,
} }
struct route_node * struct route_node *
srcdest_rnode_lookup (struct route_table *table, union prefix46ptr dst_pu, srcdest_rnode_lookup (struct route_table *table, union prefixptr dst_pu,
struct prefix_ipv6 *src_p) struct prefix_ipv6 *src_p)
{ {
struct prefix_ipv6 *dst_p = dst_pu.p6; struct prefix_ipv6 *dst_p = dst_pu.p6;

View File

@ -57,10 +57,10 @@ extern route_table_delegate_t _srcdest_srcnode_delegate;
extern struct route_table *srcdest_table_init(void); extern struct route_table *srcdest_table_init(void);
extern struct route_node *srcdest_rnode_get(struct route_table *table, extern struct route_node *srcdest_rnode_get(struct route_table *table,
union prefix46ptr dst_pu, union prefixptr dst_pu,
struct prefix_ipv6 *src_p); struct prefix_ipv6 *src_p);
extern struct route_node *srcdest_rnode_lookup(struct route_table *table, extern struct route_node *srcdest_rnode_lookup(struct route_table *table,
union prefix46ptr dst_pu, union prefixptr dst_pu,
struct prefix_ipv6 *src_p); struct prefix_ipv6 *src_p);
extern void srcdest_rnode_prefixes (struct route_node *rn, struct prefix **p, extern void srcdest_rnode_prefixes (struct route_node *rn, struct prefix **p,
struct prefix **src_p); struct prefix **src_p);

View File

@ -314,8 +314,8 @@ extern void rib_lookup_and_dump (struct prefix_ipv4 *, vrf_id_t);
extern void rib_lookup_and_pushup (struct prefix_ipv4 *, vrf_id_t); extern void rib_lookup_and_pushup (struct prefix_ipv4 *, vrf_id_t);
#define rib_dump(prefix, src, rib) _rib_dump(__func__, prefix, src, rib) #define rib_dump(prefix, src, rib) _rib_dump(__func__, prefix, src, rib)
extern void _rib_dump (const char *, extern void _rib_dump (const char *,
union prefix46constptr, union prefixconstptr,
union prefix46constptr, const struct rib *); union prefixconstptr, const struct rib *);
extern int rib_lookup_ipv4_route (struct prefix_ipv4 *, union sockunion *, extern int rib_lookup_ipv4_route (struct prefix_ipv4 *, union sockunion *,
vrf_id_t); vrf_id_t);
#define ZEBRA_RIB_LOOKUP_ERROR -1 #define ZEBRA_RIB_LOOKUP_ERROR -1

View File

@ -2135,8 +2135,8 @@ rib_delnode (struct route_node *rn, struct rib *rib)
*/ */
void _rib_dump (const char * func, void _rib_dump (const char * func,
union prefix46constptr pp, union prefixconstptr pp,
union prefix46constptr src_pp, union prefixconstptr src_pp,
const struct rib * rib) const struct rib * rib)
{ {
const struct prefix *p = pp.p; const struct prefix *p = pp.p;