diff options
Diffstat (limited to 'lib/prefix.c')
| -rw-r--r-- | lib/prefix.c | 122 |
1 files changed, 76 insertions, 46 deletions
diff --git a/lib/prefix.c b/lib/prefix.c index 0a88f9eca6..663a87afde 100644 --- a/lib/prefix.c +++ b/lib/prefix.c @@ -30,6 +30,7 @@ #include "jhash.h" #include "lib_errors.h" #include "printfrr.h" +#include "vxlan.h" DEFINE_MTYPE_STATIC(LIB, PREFIX, "Prefix") DEFINE_MTYPE_STATIC(LIB, PREFIX_FLOWSPEC, "Prefix Flowspec") @@ -909,7 +910,17 @@ int str2prefix(const char *str, struct prefix *p) static const char *prefixevpn_ead2str(const struct prefix_evpn *p, char *str, int size) { - snprintf(str, size, "Unsupported EVPN prefix"); + uint8_t family; + char buf[ESI_STR_LEN]; + char buf1[INET6_ADDRSTRLEN]; + + family = IS_IPADDR_V4(&p->prefix.ead_addr.ip) ? AF_INET : AF_INET6; + snprintf(str, size, "[%d]:[%u]:[%s]:[%d]:[%s]", p->prefix.route_type, + p->prefix.ead_addr.eth_tag, + esi_to_str(&p->prefix.ead_addr.esi, buf, sizeof(buf)), + (family == AF_INET) ? IPV4_MAX_BITLEN : IPV6_MAX_BITLEN, + inet_ntop(family, &p->prefix.ead_addr.ip.ipaddr_v4, buf1, + sizeof(buf1))); return str; } @@ -917,27 +928,24 @@ static const char *prefixevpn_macip2str(const struct prefix_evpn *p, char *str, int size) { uint8_t family; - char buf[PREFIX2STR_BUFFER]; - char buf2[ETHER_ADDR_STRLEN]; + char buf1[ETHER_ADDR_STRLEN]; + char buf2[PREFIX2STR_BUFFER]; if (is_evpn_prefix_ipaddr_none(p)) - snprintf(str, size, "[%d]:[%s]/%d", - p->prefix.route_type, - prefix_mac2str(&p->prefix.macip_addr.mac, - buf2, sizeof(buf2)), - p->prefixlen); + snprintf(str, size, "[%d]:[%d]:[%d]:[%s]", p->prefix.route_type, + p->prefix.macip_addr.eth_tag, 8 * ETH_ALEN, + prefix_mac2str(&p->prefix.macip_addr.mac, buf1, + sizeof(buf1))); else { - family = is_evpn_prefix_ipaddr_v4(p) - ? AF_INET - : AF_INET6; - snprintf(str, size, "[%d]:[%s]:[%s]/%d", - p->prefix.route_type, - prefix_mac2str(&p->prefix.macip_addr.mac, - buf2, sizeof(buf2)), - inet_ntop(family, - &p->prefix.macip_addr.ip.ip.addr, - buf, PREFIX2STR_BUFFER), - p->prefixlen); + family = is_evpn_prefix_ipaddr_v4(p) ? AF_INET : AF_INET6; + snprintf(str, size, "[%d]:[%d]:[%d]:[%s]:[%d]:[%s]", + p->prefix.route_type, p->prefix.macip_addr.eth_tag, + 8 * ETH_ALEN, + prefix_mac2str(&p->prefix.macip_addr.mac, buf1, + sizeof(buf1)), + family == AF_INET ? IPV4_MAX_BITLEN : IPV6_MAX_BITLEN, + inet_ntop(family, &p->prefix.macip_addr.ip.ip.addr, + buf2, PREFIX2STR_BUFFER)); } return str; } @@ -946,28 +954,32 @@ static const char *prefixevpn_imet2str(const struct prefix_evpn *p, char *str, int size) { uint8_t family; - char buf[PREFIX2STR_BUFFER]; + char buf[INET6_ADDRSTRLEN]; + + family = IS_IPADDR_V4(&p->prefix.imet_addr.ip) ? AF_INET : AF_INET6; + snprintf(str, size, "[%d]:[%d]:[%d]:[%s]", p->prefix.route_type, + p->prefix.imet_addr.eth_tag, + (family == AF_INET) ? IPV4_MAX_BITLEN : IPV6_MAX_BITLEN, + inet_ntop(family, &p->prefix.imet_addr.ip.ipaddr_v4, buf, + sizeof(buf))); - family = is_evpn_prefix_ipaddr_v4(p) - ? AF_INET - : AF_INET6; - snprintf(str, size, "[%d]:[%s]/%d", p->prefix.route_type, - inet_ntop(family, - &p->prefix.imet_addr.ip.ip.addr, buf, - PREFIX2STR_BUFFER), - p->prefixlen); return str; } static const char *prefixevpn_es2str(const struct prefix_evpn *p, char *str, int size) { + uint8_t family; char buf[ESI_STR_LEN]; + char buf1[INET6_ADDRSTRLEN]; - snprintf(str, size, "[%d]:[%s]:[%s]/%d", p->prefix.route_type, + family = IS_IPADDR_V4(&p->prefix.es_addr.ip) ? AF_INET : AF_INET6; + snprintf(str, size, "[%d]:[%s]:[%d]:[%s]", p->prefix.route_type, esi_to_str(&p->prefix.es_addr.esi, buf, sizeof(buf)), - inet_ntoa(p->prefix.es_addr.ip.ipaddr_v4), - p->prefixlen); + (family == AF_INET) ? IPV4_MAX_BITLEN : IPV6_MAX_BITLEN, + inet_ntop(family, &p->prefix.es_addr.ip.ipaddr_v4, buf1, + sizeof(buf1))); + return str; } @@ -975,19 +987,14 @@ static const char *prefixevpn_prefix2str(const struct prefix_evpn *p, char *str, int size) { uint8_t family; - char buf[PREFIX2STR_BUFFER]; + char buf[INET6_ADDRSTRLEN]; - family = is_evpn_prefix_ipaddr_v4(p) - ? AF_INET - : AF_INET6; - snprintf(str, size, "[%d]:[%u]:[%s/%d]/%d", - p->prefix.route_type, + family = IS_IPADDR_V4(&p->prefix.prefix_addr.ip) ? AF_INET : AF_INET6; + snprintf(str, size, "[%d]:[%d]:[%d]:[%s]", p->prefix.route_type, p->prefix.prefix_addr.eth_tag, - inet_ntop(family, - &p->prefix.prefix_addr.ip.ip.addr, buf, - PREFIX2STR_BUFFER), p->prefix.prefix_addr.ip_prefix_length, - p->prefixlen); + inet_ntop(family, &p->prefix.prefix_addr.ip.ipaddr_v4, buf, + sizeof(buf))); return str; } @@ -995,15 +1002,15 @@ static const char *prefixevpn2str(const struct prefix_evpn *p, char *str, int size) { switch (p->prefix.route_type) { - case 1: + case BGP_EVPN_AD_ROUTE: return prefixevpn_ead2str(p, str, size); - case 2: + case BGP_EVPN_MAC_IP_ROUTE: return prefixevpn_macip2str(p, str, size); - case 3: + case BGP_EVPN_IMET_ROUTE: return prefixevpn_imet2str(p, str, size); - case 4: + case BGP_EVPN_ES_ROUTE: return prefixevpn_es2str(p, str, size); - case 5: + case BGP_EVPN_IP_PREFIX_ROUTE: return prefixevpn_prefix2str(p, str, size); default: snprintf(str, size, "Unsupported EVPN prefix"); @@ -1330,6 +1337,29 @@ char *esi_to_str(const esi_t *esi, char *buf, int size) return ptr; } +char *evpn_es_df_alg2str(uint8_t df_alg, char *buf, int buf_len) +{ + switch (df_alg) { + case EVPN_MH_DF_ALG_SERVICE_CARVING: + snprintf(buf, buf_len, "service-carving"); + break; + + case EVPN_MH_DF_ALG_HRW: + snprintf(buf, buf_len, "HRW"); + break; + + case EVPN_MH_DF_ALG_PREF: + snprintf(buf, buf_len, "preference"); + break; + + default: + snprintf(buf, buf_len, "unknown %u", df_alg); + break; + } + + return buf; +} + printfrr_ext_autoreg_p("EA", printfrr_ea) static ssize_t printfrr_ea(char *buf, size_t bsz, const char *fmt, int prec, const void *ptr) |
