mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-04 03:13:44 +00:00 
			
		
		
		
	nhrpd: replace nhrp route nexthop with onlink route when prefix=nh
There are cases where nhrp wants to create a nhrp route to gre interface with the nexthop which is the same the prefix. This is the case with ipv6: ipv6 route a:ff::ff:4/128 via a:ff::ff:4:/128 dev gre1 This route entry is false from zebra point of view, and to avoid that, the nexthop is ignored in nhrp only if the prefix equals the nexthop. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
		
							parent
							
								
									ef91ff0468
								
							
						
					
					
						commit
						a3e520f37b
					
				@ -98,6 +98,7 @@ void nhrp_route_announce(int add, enum nhrp_cache_type type,
 | 
			
		||||
{
 | 
			
		||||
	struct zapi_route api;
 | 
			
		||||
	struct zapi_nexthop *api_nh;
 | 
			
		||||
	union sockunion *nexthop_ref = (union sockunion *)nexthop;
 | 
			
		||||
 | 
			
		||||
	if (zclient->sock < 0)
 | 
			
		||||
		return;
 | 
			
		||||
@ -133,8 +134,14 @@ void nhrp_route_announce(int add, enum nhrp_cache_type type,
 | 
			
		||||
 | 
			
		||||
	switch (api.prefix.family) {
 | 
			
		||||
	case AF_INET:
 | 
			
		||||
		if (nexthop) {
 | 
			
		||||
			api_nh->gate.ipv4 = nexthop->sin.sin_addr;
 | 
			
		||||
		if (api.prefix.prefixlen == IPV4_MAX_BITLEN &&
 | 
			
		||||
		    nexthop_ref &&
 | 
			
		||||
		    memcmp(&nexthop_ref->sin.sin_addr, &api.prefix.u.prefix4,
 | 
			
		||||
			   sizeof(struct in_addr)) == 0) {
 | 
			
		||||
			nexthop_ref = NULL;
 | 
			
		||||
		}
 | 
			
		||||
		if (nexthop_ref) {
 | 
			
		||||
			api_nh->gate.ipv4 = nexthop_ref->sin.sin_addr;
 | 
			
		||||
			api_nh->type = NEXTHOP_TYPE_IPV4;
 | 
			
		||||
		}
 | 
			
		||||
		if (ifp) {
 | 
			
		||||
@ -146,8 +153,14 @@ void nhrp_route_announce(int add, enum nhrp_cache_type type,
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case AF_INET6:
 | 
			
		||||
		if (nexthop) {
 | 
			
		||||
			api_nh->gate.ipv6 = nexthop->sin6.sin6_addr;
 | 
			
		||||
		if (api.prefix.prefixlen == IPV6_MAX_BITLEN &&
 | 
			
		||||
		    nexthop_ref &&
 | 
			
		||||
		    memcmp(&nexthop_ref->sin6.sin6_addr, &api.prefix.u.prefix6,
 | 
			
		||||
			   sizeof(struct in6_addr)) == 0) {
 | 
			
		||||
			nexthop_ref = NULL;
 | 
			
		||||
		}
 | 
			
		||||
		if (nexthop_ref) {
 | 
			
		||||
			api_nh->gate.ipv6 = nexthop_ref->sin6.sin6_addr;
 | 
			
		||||
			api_nh->type = NEXTHOP_TYPE_IPV6;
 | 
			
		||||
		}
 | 
			
		||||
		if (ifp) {
 | 
			
		||||
@ -170,8 +183,9 @@ void nhrp_route_announce(int add, enum nhrp_cache_type type,
 | 
			
		||||
		zlog_debug(
 | 
			
		||||
			"Zebra send: route %s %pFX nexthop %s metric %u count %d dev %s",
 | 
			
		||||
			add ? "add" : "del", &api.prefix,
 | 
			
		||||
			nexthop ? inet_ntop(api.prefix.family, &api_nh->gate,
 | 
			
		||||
					    buf, sizeof(buf))
 | 
			
		||||
			nexthop_ref ? inet_ntop(api.prefix.family,
 | 
			
		||||
						&api_nh->gate,
 | 
			
		||||
						buf, sizeof(buf))
 | 
			
		||||
				: "<onlink>",
 | 
			
		||||
			api.metric, api.nexthop_num, ifp ? ifp->name : "none");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user