summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2017-09-12 08:14:50 -0400
committerDonald Sharp <sharpd@cumulusnetworks.com>2017-09-12 08:33:37 -0400
commit1f1d24a8f1f183d6d0a4598b854b459f5b5d7e5c (patch)
tree3e532999bac61a2d96f45f4c507ed933f6b7003c
parent953d97fc4aef0c7715e8d42d7d52ebc18d873ac6 (diff)
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>
-rw-r--r--zebra/rt_netlink.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 12b6185395..ef59f26f21 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -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) {