diff options
Diffstat (limited to 'lib/prefix.c')
| -rw-r--r-- | lib/prefix.c | 57 | 
1 files changed, 57 insertions, 0 deletions
diff --git a/lib/prefix.c b/lib/prefix.c index e64b10bf24..4642f14d35 100644 --- a/lib/prefix.c +++ b/lib/prefix.c @@ -1404,6 +1404,63 @@ bool ipv4_unicast_valid(const struct in_addr *addr)  	return true;  } +static int ipaddr2prefix(const struct ipaddr *ip, uint16_t prefixlen, +			 struct prefix *p) +{ +	switch (ip->ipa_type) { +	case (IPADDR_V4): +		p->family = AF_INET; +		p->u.prefix4 = ip->ipaddr_v4; +		p->prefixlen = prefixlen; +		break; +	case (IPADDR_V6): +		p->family = AF_INET6; +		p->u.prefix6 = ip->ipaddr_v6; +		p->prefixlen = prefixlen; +		break; +	case (IPADDR_NONE): +		p->family = AF_UNSPEC; +		break; +	} + +	return 0; +} + +/* + * Convert type-2 and type-5 evpn route prefixes into the more + * general ipv4/ipv6 prefix types so we can match prefix lists + * and such. + */ +int evpn_prefix2prefix(const struct prefix *evpn, struct prefix *to) +{ +	const struct evpn_addr *addr; + +	if (evpn->family != AF_EVPN) +		return -1; + +	addr = &evpn->u.prefix_evpn; + +	switch (addr->route_type) { +	case BGP_EVPN_MAC_IP_ROUTE: +		if (IS_IPADDR_V4(&addr->macip_addr.ip)) +			ipaddr2prefix(&addr->macip_addr.ip, 32, to); +		else if (IS_IPADDR_V6(&addr->macip_addr.ip)) +			ipaddr2prefix(&addr->macip_addr.ip, 128, to); +		else +			return -1; /* mac only? */ + +		break; +	case BGP_EVPN_IP_PREFIX_ROUTE: +		ipaddr2prefix(&addr->prefix_addr.ip, +			      addr->prefix_addr.ip_prefix_length, to); +		break; +	default: +		return -1; +	} + +	return 0; +} +  printfrr_ext_autoreg_p("EA", printfrr_ea);  static ssize_t printfrr_ea(struct fbuf *buf, struct printfrr_eargs *ea,  			   const void *ptr)  | 
