zebra: Allow recursively resolved blackhole routes to be installed

So the current code for a blackhole route assumed that you
would never want a recursively resolved blackhole to work.
Suppose you have this setup:

1) ip route 192.0.2.1/32 Null0
2) BGP installed with a route-map that rewrites the
   nexthop to 192.0.2.1.

Zebra will end up with a recursive nexthop that resolves
to the blackhole.

The original rib install function assumed that we would never
want the ability to recursively resolve a blackhole route.
Instead just handle the blackhole as part of the nexthop_num = 1
case.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2017-09-12 08:14:50 -04:00
parent 953d97fc4a
commit 1f1d24a8f1

View File

@ -1321,23 +1321,6 @@ static int netlink_route_multipath(int cmd, struct prefix *p,
req.r.rtm_scope = RT_SCOPE_UNIVERSE;
req.r.rtm_type = RTN_UNICAST;
if (re->nexthop_num == 1
&& re->nexthop->type == NEXTHOP_TYPE_BLACKHOLE) {
discard = 1;
switch (re->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;
}
}
addattr_l(&req.n, sizeof req, RTA_DST, &p->u.prefix, bytelen);
if (src_p)
addattr_l(&req.n, sizeof req, RTA_SRC, &src_p->u.prefix,
@ -1396,6 +1379,27 @@ static int netlink_route_multipath(int cmd, struct prefix *p,
if (nexthop_num == 1 || multipath_num == 1) {
nexthop_num = 0;
for (ALL_NEXTHOPS(re->nexthop, 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;
}
goto skip;
}
if (CHECK_FLAG(nexthop->flags,
NEXTHOP_FLAG_RECURSIVE)) {
if (!setsrc) {