From: vivek Date: Tue, 9 Aug 2016 22:55:51 +0000 (-0700) Subject: lib: Enhance prefix dump for EVPN prefixes X-Git-Tag: frr-3.0-branchpoint~29^2~49 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=78b81eaa44d74c988a681b96574a7b6897e7dea0;p=mirror%2Ffrr.git 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 Reviewed-by: Donald Sharp Signed-off-by: Philippe Guibert Ticket: CM-12262 Reviewed By: CCR-5065 Testing Done: Manual Signed-off-by: Philippe Guibert --- diff --git a/lib/prefix.c b/lib/prefix.c index 06ed00baa9..6d3de3d6c6 100644 --- a/lib/prefix.c +++ b/lib/prefix.c @@ -859,23 +859,39 @@ str2prefix (const char *str, struct prefix *p) } const char * -prefix2str (union prefix46constptr pu, char *str, int size) +prefix2str (union prefixconstptr pu, char *str, int size) { const struct prefix *p = pu.p; + char buf[PREFIX2STR_BUFFER]; - if (p->family == AF_ETHERNET) - { - snprintf(str, size, "%02x:%02x:%02x:%02x:%02x:%02x/%d", - p->u.prefix_eth.octet[0], p->u.prefix_eth.octet[1], - p->u.prefix_eth.octet[2], p->u.prefix_eth.octet[3], - p->u.prefix_eth.octet[4], p->u.prefix_eth.octet[5], - p->prefixlen); - } - else + switch (p->family) { - char buf[PREFIX2STR_BUFFER]; - inet_ntop(p->family, &p->u.prefix, buf, sizeof(buf)); - snprintf(str, size, "%s/%d", buf, p->prefixlen); + u_char family; + + case AF_INET: + case AF_INET6: + snprintf (str, size, "%s/%d", + inet_ntop (p->family, &p->u.prefix, buf, PREFIX2STR_BUFFER), + p->prefixlen); + break; + + case AF_ETHERNET: + 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; diff --git a/lib/prefix.h b/lib/prefix.h index 1756dd21c8..5c1c71a7c0 100644 --- a/lib/prefix.h +++ b/lib/prefix.h @@ -69,6 +69,7 @@ struct evpn_addr u_char ip_prefix_length; union { + u_char addr; struct in_addr v4_addr; struct in6_addr v6_addr; } ip; @@ -185,18 +186,20 @@ struct prefix_sg * side, which strips type safety since the cast will accept any pointer * type.) */ -union prefix46ptr +union prefixptr { struct prefix *p; struct prefix_ipv4 *p4; struct prefix_ipv6 *p6; + struct prefix_evpn *evp; } __attribute__ ((transparent_union)); -union prefix46constptr +union prefixconstptr { const struct prefix *p; const struct prefix_ipv4 *p4; const struct prefix_ipv6 *p6; + const struct prefix_evpn *evp; } __attribute__ ((transparent_union)); #ifndef INET_ADDRSTRLEN @@ -270,7 +273,7 @@ extern int str2prefix (const char *, struct prefix *); #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_same (const struct prefix *, const struct prefix *); extern int prefix_cmp (const struct prefix *, const struct prefix *); diff --git a/lib/srcdest_table.c b/lib/srcdest_table.c index dd148fa41d..04c9eff79a 100644 --- a/lib/srcdest_table.c +++ b/lib/srcdest_table.c @@ -242,7 +242,7 @@ srcdest_route_next(struct route_node *rn) } 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 *dst_p = dst_pu.p6; @@ -253,7 +253,7 @@ srcdest_rnode_get (struct route_table *table, union prefix46ptr dst_pu, } 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 *dst_p = dst_pu.p6; diff --git a/lib/srcdest_table.h b/lib/srcdest_table.h index 59111b5d17..207f5d121d 100644 --- a/lib/srcdest_table.h +++ b/lib/srcdest_table.h @@ -57,10 +57,10 @@ extern route_table_delegate_t _srcdest_srcnode_delegate; extern struct route_table *srcdest_table_init(void); extern struct route_node *srcdest_rnode_get(struct route_table *table, - union prefix46ptr dst_pu, + union prefixptr dst_pu, struct prefix_ipv6 *src_p); extern struct route_node *srcdest_rnode_lookup(struct route_table *table, - union prefix46ptr dst_pu, + union prefixptr dst_pu, struct prefix_ipv6 *src_p); extern void srcdest_rnode_prefixes (struct route_node *rn, struct prefix **p, struct prefix **src_p); diff --git a/zebra/rib.h b/zebra/rib.h index b246b89a53..c0cde50baf 100644 --- a/zebra/rib.h +++ b/zebra/rib.h @@ -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); #define rib_dump(prefix, src, rib) _rib_dump(__func__, prefix, src, rib) extern void _rib_dump (const char *, - union prefix46constptr, - union prefix46constptr, const struct rib *); + union prefixconstptr, + union prefixconstptr, const struct rib *); extern int rib_lookup_ipv4_route (struct prefix_ipv4 *, union sockunion *, vrf_id_t); #define ZEBRA_RIB_LOOKUP_ERROR -1 diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 13418c509e..08874f22fc 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -2135,8 +2135,8 @@ rib_delnode (struct route_node *rn, struct rib *rib) */ void _rib_dump (const char * func, - union prefix46constptr pp, - union prefix46constptr src_pp, + union prefixconstptr pp, + union prefixconstptr src_pp, const struct rib * rib) { const struct prefix *p = pp.p;