diff options
| author | Mark Stapp <mstapp@nvidia.com> | 2022-06-17 11:47:55 -0400 | 
|---|---|---|
| committer | Mark Stapp <mstapp@nvidia.com> | 2022-06-17 11:47:55 -0400 | 
| commit | 0f9e2c918b864e8ff0847ab25e2b1ecdf070d1c2 (patch) | |
| tree | 2518c29e2be74283ec18e15744f15e4d63dca594 /ospf6d/ospf6_zebra.c | |
| parent | 71623b304e78f987b7d730e431f79324c787a2dd (diff) | |
ospf6: permit route delete without nexthops
It's possible for ospf6 to decide to delete a route after it's
removed all of the route's nexthops. It's ok to delete a prefix
alone - be a little more forgiving when preparing a route delete.
Signed-off-by: Mark Stapp <mstapp@nvidia.com>
Diffstat (limited to 'ospf6d/ospf6_zebra.c')
| -rw-r--r-- | ospf6d/ospf6_zebra.c | 27 | 
1 files changed, 18 insertions, 9 deletions
diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c index 8366716585..f1a4209a8e 100644 --- a/ospf6d/ospf6_zebra.c +++ b/ospf6d/ospf6_zebra.c @@ -432,9 +432,12 @@ static void ospf6_zebra_route_update(int type, struct ospf6_route *request,  	}  	/* If removing is the best path and if there's another path, -	   treat this request as add the secondary path */ -	if (type == REM && ospf6_route_is_best(request) && request->next -	    && ospf6_route_is_same(request, request->next)) { +	 * treat this request as add the secondary path - if there are +	 * nexthops. +	 */ +	if (type == REM && ospf6_route_is_best(request) && request->next && +	    ospf6_route_is_same(request, request->next) && +	    ospf6_route_num_nexthops(request->next) > 0) {  		if (IS_OSPF6_DEBUG_ZEBRA(SEND))  			zlog_debug(  				"  Best-path removal resulted Secondary addition"); @@ -452,9 +455,12 @@ static void ospf6_zebra_route_update(int type, struct ospf6_route *request,  	nhcount = ospf6_route_num_nexthops(request);  	if (nhcount == 0) { -		if (IS_OSPF6_DEBUG_ZEBRA(SEND)) -			zlog_debug("  No nexthop, ignore"); -		return; +		if (type == ADD) { +			if (IS_OSPF6_DEBUG_ZEBRA(SEND)) +				zlog_debug("  No nexthop, ignore"); +			return; +		} else if (IS_OSPF6_DEBUG_ZEBRA(SEND)) +			zlog_debug("  No nexthop, rem ok");  	}  	dest = &request->prefix; @@ -464,17 +470,20 @@ static void ospf6_zebra_route_update(int type, struct ospf6_route *request,  	api.type = ZEBRA_ROUTE_OSPF6;  	api.safi = SAFI_UNICAST;  	api.prefix = *dest; -	SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);  	if (nhcount > ospf6->max_multipath) {  		if (IS_OSPF6_DEBUG_ZEBRA(SEND))  			zlog_debug(  				"  Nexthop count is greater than configured maximum-path, hence ignore the extra nexthops");  	} +  	api.nexthop_num = MIN(nhcount, ospf6->max_multipath); +	if (api.nexthop_num > 0) { +		SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP); +		ospf6_route_zebra_copy_nexthops(request, api.nexthops, +						api.nexthop_num, api.vrf_id); +	} -	ospf6_route_zebra_copy_nexthops(request, api.nexthops, api.nexthop_num, -					api.vrf_id);  	SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);  	api.metric = (request->path.metric_type == 2 ? request->path.u.cost_e2  						     : request->path.cost);  | 
