diff options
Diffstat (limited to 'zebra/zebra_rib.c')
| -rw-r--r-- | zebra/zebra_rib.c | 91 | 
1 files changed, 17 insertions, 74 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index c42b8468f9..6c499b77d7 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -509,31 +509,28 @@ struct route_entry *rib_match(afi_t afi, safi_t safi, vrf_id_t vrf_id,  	return NULL;  } -struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id, -					     struct in_addr addr, -					     struct route_node **rn_out) +struct route_entry *rib_match_multicast(afi_t afi, vrf_id_t vrf_id, +					union g_addr *gaddr, +					struct route_node **rn_out)  {  	struct route_entry *re = NULL, *mre = NULL, *ure = NULL;  	struct route_node *m_rn = NULL, *u_rn = NULL; -	union g_addr gaddr = {.ipv4 = addr};  	switch (zrouter.ipv4_multicast_mode) {  	case MCAST_MRIB_ONLY: -		return rib_match(AFI_IP, SAFI_MULTICAST, vrf_id, &gaddr, -				 rn_out); +		return rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, rn_out);  	case MCAST_URIB_ONLY: -		return rib_match(AFI_IP, SAFI_UNICAST, vrf_id, &gaddr, rn_out); +		return rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, rn_out);  	case MCAST_NO_CONFIG:  	case MCAST_MIX_MRIB_FIRST: -		re = mre = rib_match(AFI_IP, SAFI_MULTICAST, vrf_id, &gaddr, -				     &m_rn); +		re = mre = rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, &m_rn);  		if (!mre) -			re = ure = rib_match(AFI_IP, SAFI_UNICAST, vrf_id, -					     &gaddr, &u_rn); +			re = ure = rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, +					     &u_rn);  		break;  	case MCAST_MIX_DISTANCE: -		mre = rib_match(AFI_IP, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); -		ure = rib_match(AFI_IP, SAFI_UNICAST, vrf_id, &gaddr, &u_rn); +		mre = rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, &m_rn); +		ure = rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, &u_rn);  		if (mre && ure)  			re = ure->distance < mre->distance ? ure : mre;  		else if (mre) @@ -542,8 +539,8 @@ struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id,  			re = ure;  		break;  	case MCAST_MIX_PFXLEN: -		mre = rib_match(AFI_IP, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); -		ure = rib_match(AFI_IP, SAFI_UNICAST, vrf_id, &gaddr, &u_rn); +		mre = rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, &m_rn); +		ure = rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, &u_rn);  		if (mre && ure)  			re = u_rn->p.prefixlen > m_rn->p.prefixlen ? ure : mre;  		else if (mre) @@ -558,10 +555,12 @@ struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id,  	if (IS_ZEBRA_DEBUG_RIB) {  		char buf[BUFSIZ]; -		inet_ntop(AF_INET, &addr, buf, BUFSIZ); +		inet_ntop(afi == AFI_IP ? AF_INET : AF_INET6, gaddr, buf, +			  BUFSIZ); -		zlog_debug("%s: %s: vrf: %s(%u) found %s, using %s", __func__, -			   buf, vrf_id_to_name(vrf_id), vrf_id, +		zlog_debug("%s: %s: %pRN vrf: %s(%u) found %s, using %s", +			   __func__, buf, (re == mre) ? m_rn : u_rn, +			   vrf_id_to_name(vrf_id), vrf_id,  			   mre ? (ure ? "MRIB+URIB" : "MRIB")  			       : ure ? "URIB" : "nothing",  			   re == ure ? "URIB" : re == mre ? "MRIB" : "none"); @@ -569,62 +568,6 @@ struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id,  	return re;  } -struct route_entry *rib_match_ipv6_multicast(vrf_id_t vrf_id, -					     struct in6_addr addr, -					     struct route_node **rn_out) -{ -	struct route_entry *re = NULL, *mre = NULL, *ure = NULL; -	struct route_node *m_rn = NULL, *u_rn = NULL; -	union g_addr gaddr = {.ipv6 = addr}; - -	switch (zrouter.ipv4_multicast_mode) { -	case MCAST_MRIB_ONLY: -		return rib_match(AFI_IP6, SAFI_MULTICAST, vrf_id, &gaddr, -				 rn_out); -	case MCAST_URIB_ONLY: -		return rib_match(AFI_IP6, SAFI_UNICAST, vrf_id, &gaddr, rn_out); -	case MCAST_NO_CONFIG: -	case MCAST_MIX_MRIB_FIRST: -		re = mre = rib_match(AFI_IP6, SAFI_MULTICAST, vrf_id, &gaddr, -				     &m_rn); -		if (!mre) -			re = ure = rib_match(AFI_IP6, SAFI_UNICAST, vrf_id, -					     &gaddr, &u_rn); -		break; -	case MCAST_MIX_DISTANCE: -		mre = rib_match(AFI_IP6, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); -		ure = rib_match(AFI_IP6, SAFI_UNICAST, vrf_id, &gaddr, &u_rn); -		if (mre && ure) -			re = ure->distance < mre->distance ? ure : mre; -		else if (mre) -			re = mre; -		else if (ure) -			re = ure; -		break; -	case MCAST_MIX_PFXLEN: -		mre = rib_match(AFI_IP6, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); -		ure = rib_match(AFI_IP6, SAFI_UNICAST, vrf_id, &gaddr, &u_rn); -		if (mre && ure) -			re = u_rn->p.prefixlen > m_rn->p.prefixlen ? ure : mre; -		else if (mre) -			re = mre; -		else if (ure) -			re = ure; -		break; -	} - -	if (rn_out) -		*rn_out = (re == mre) ? m_rn : u_rn; - -	if (IS_ZEBRA_DEBUG_RIB) -		zlog_debug("%s: %pI6: vrf: %s(%u) found %s, using %s", __func__, -			   &addr, vrf_id_to_name(vrf_id), vrf_id, -			   mre ? (ure ? "MRIB+URIB" : "MRIB") -			       : ure ? "URIB" : "nothing", -			   re == ure ? "URIB" : re == mre ? "MRIB" : "none"); -	return re; -} -  struct route_entry *rib_lookup_ipv4(struct prefix_ipv4 *p, vrf_id_t vrf_id)  {  	struct route_table *table;  | 
