diff options
| author | Igor Ryzhov <iryzhov@nfware.com> | 2021-02-25 18:28:51 +0300 | 
|---|---|---|
| committer | Igor Ryzhov <iryzhov@nfware.com> | 2021-03-02 19:58:33 +0300 | 
| commit | 2032e7e72bc3556968cfa56dfd33afe8f3587724 (patch) | |
| tree | 83eeb7ccf8cdfca7554ab50de225c838e743df11 | |
| parent | aa86a6a6f21470a2ca32a41ce053c9c82a7fa223 (diff) | |
zebra: don't use kernel nexthops for blackhole routes
Fixes #6522 and #8149.
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
| -rw-r--r-- | zebra/rt_netlink.c | 48 | 
1 files changed, 27 insertions, 21 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 67519e2f40..770feb52bd 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -1743,6 +1743,33 @@ ssize_t netlink_route_multipath_msg_encode(int cmd,  		nl_attr_nest_end(&req->n, nest);  	} +	/* +	 * Always install blackhole routes without using nexthops, because of +	 * the following kernel problems: +	 * 1. Kernel nexthops don't suport unreachable/prohibit route types. +	 * 2. Blackhole kernel nexthops are deleted when loopback is down. +	 */ +	nexthop = dplane_ctx_get_ng(ctx)->nexthop; +	if (nexthop) { +		if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE)) +			nexthop = nexthop->resolved; + +		if (nexthop->type == NEXTHOP_TYPE_BLACKHOLE) { +			switch (nexthop->bh_type) { +			case BLACKHOLE_ADMINPROHIB: +				req->r.rtm_type = RTN_PROHIBIT; +				break; +			case BLACKHOLE_REJECT: +				req->r.rtm_type = RTN_UNREACHABLE; +				break; +			default: +				req->r.rtm_type = RTN_BLACKHOLE; +				break; +			} +			return NLMSG_ALIGN(req->n.nlmsg_len); +		} +	} +  	if ((!fpm && kernel_nexthops_supported()) || (fpm && force_nhg)) {  		/* Kernel supports nexthop objects */  		if (IS_ZEBRA_DEBUG_KERNEL) @@ -1793,27 +1820,6 @@ ssize_t netlink_route_multipath_msg_encode(int cmd,  	if (nexthop_num == 1) {  		nexthop_num = 0;  		for (ALL_NEXTHOPS_PTR(dplane_ctx_get_ng(ctx), nexthop)) { -			/* -			 * So we want to cover 2 types of blackhole -			 * routes here: -			 * 1) A normal blackhole route( ala from a static -			 *    install. -			 * 2) A recursively resolved blackhole route -			 */ -			if (nexthop->type == NEXTHOP_TYPE_BLACKHOLE) { -				switch (nexthop->bh_type) { -				case BLACKHOLE_ADMINPROHIB: -					req->r.rtm_type = RTN_PROHIBIT; -					break; -				case BLACKHOLE_REJECT: -					req->r.rtm_type = RTN_UNREACHABLE; -					break; -				default: -					req->r.rtm_type = RTN_BLACKHOLE; -					break; -				} -				return NLMSG_ALIGN(req->n.nlmsg_len); -			}  			if (CHECK_FLAG(nexthop->flags,  				       NEXTHOP_FLAG_RECURSIVE)) {  | 
