diff options
| author | vivek <vivek@cumulusnetworks.com> | 2017-05-14 22:20:33 -0700 |
|---|---|---|
| committer | vivek <vivek@cumulusnetworks.com> | 2017-05-25 10:20:03 -0700 |
| commit | 86f1ef44f703ef4e6e1d127b30c5524becb80b5e (patch) | |
| tree | c3f531cbb95d067a91dadc62c9ce18288bf9143f /lib/prefix.c | |
| parent | 482c0fb076b00a588f856a79d2c43b418ce23c57 (diff) | |
lib: Refine EVPN prefix definition
Modify EVPN prefix to use the generic IP address structure. Add support
for EVPN type-2 and type-3 prefix dump. Fix references to modified fields
as needed.
Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'lib/prefix.c')
| -rw-r--r-- | lib/prefix.c | 83 |
1 files changed, 62 insertions, 21 deletions
diff --git a/lib/prefix.c b/lib/prefix.c index 9c228cf954..1bf196551f 100644 --- a/lib/prefix.c +++ b/lib/prefix.c @@ -852,6 +852,66 @@ str2prefix (const char *str, struct prefix *p) return 0; } +static const char * +prefixeth2str (const struct prefix *p, char *str, int size) +{ + u_char family; + char buf[PREFIX2STR_BUFFER]; + char buf2[ETHER_ADDR_STRLEN]; + + if (p->u.prefix_evpn.route_type == 2) + { + if (IS_EVPN_PREFIX_IPADDR_NONE((struct prefix_evpn *)p)) + snprintf (str, size, "[%d]:[%s]/%d", + p->u.prefix_evpn.route_type, + prefix_mac2str (&p->u.prefix_evpn.mac, buf2, sizeof (buf2)), + p->prefixlen); + else + { + family = IS_EVPN_PREFIX_IPADDR_V4((struct prefix_evpn *)p) ? \ + AF_INET : AF_INET6; + snprintf (str, size, "[%d]:[%s]:[%s]/%d", + p->u.prefix_evpn.route_type, + prefix_mac2str (&p->u.prefix_evpn.mac, buf2, sizeof (buf2)), + inet_ntop (family, &p->u.prefix_evpn.ip.ip.addr, + buf, PREFIX2STR_BUFFER), + p->prefixlen); + } + } + else if (p->u.prefix_evpn.route_type == 3) + { + family = IS_EVPN_PREFIX_IPADDR_V4((struct prefix_evpn *)p) ? \ + AF_INET : AF_INET6; + snprintf (str, size, "[%d]:[%s]/%d", + p->u.prefix_evpn.route_type, + inet_ntop (family, &p->u.prefix_evpn.ip.ip.addr, + buf, PREFIX2STR_BUFFER), + p->prefixlen); + } + else if (p->u.prefix_evpn.route_type == 5) + { + family = IS_EVPN_PREFIX_IPADDR_V4((struct prefix_evpn *)p) ? \ + 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.ip.addr, + buf, PREFIX2STR_BUFFER), + p->prefixlen); + } + else + { + sprintf (str, "UNK AF_ETHER prefix"); + 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); + } + + return str; +} + const char * prefix2str (union prefixconstptr pu, char *str, int size) { @@ -868,28 +928,9 @@ prefix2str (union prefixconstptr pu, char *str, int size) break; case AF_ETHERNET: - if (p->u.prefix_evpn.route_type == 5) - { - u_char family; - 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); - } - else - { - sprintf (str, "UNK AF_ETHER prefix"); - 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); - } + prefixeth2str (p, str, size); break; + default: sprintf (str, "UNK prefix"); break; |
