summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuliusz Chroboczek <jch@pps.jussieu.fr>2012-02-09 17:23:09 +0100
committerPaul Jakma <paul@quagga.net>2012-03-25 17:06:54 +0100
commitd70ab9dcd8f054ebd5f60a29dbbd9b39f9fe7566 (patch)
tree2901221e2a01c5079f2dba182f09570e8d7c0f6c
parent31e2a19fd2b4aca34b1d2f5e2eb8c9a44b9ea6c9 (diff)
babeld: Add support for blackhole routes.
Babel makes use of blackhole routes to prevent routing loops between overlapping prefixes shortly after a route is retracted (see RFC 6126 sections 2.8 and 3.5.5). This patch adds support for installing such blackhole routes.
-rw-r--r--babeld/kernel_zebra.c64
1 files changed, 43 insertions, 21 deletions
diff --git a/babeld/kernel_zebra.c b/babeld/kernel_zebra.c
index 1df4217f..d262a86b 100644
--- a/babeld/kernel_zebra.c
+++ b/babeld/kernel_zebra.c
@@ -186,12 +186,16 @@ kernel_route_add_v4(const unsigned char *pref, unsigned short plen,
correctly. */
SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
- api.nexthop_num = 1;
- api.nexthop = &nexthop_pointer;
api.ifindex_num = 0;
-
- SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
- api.metric = metric;
+ if(metric >= KERNEL_INFINITY) {
+ api.flags = ZEBRA_FLAG_BLACKHOLE;
+ api.nexthop_num = 0;
+ } else {
+ api.nexthop_num = 1;
+ api.nexthop = &nexthop_pointer;
+ SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
+ api.metric = metric;
+ }
debugf(BABEL_DEBUG_ROUTE, "adding route (ipv4) to zebra");
return zapi_ipv4_route (ZEBRA_IPV4_ROUTE_ADD, zclient,
@@ -226,13 +230,18 @@ kernel_route_add_v6(const unsigned char *pref, unsigned short plen,
api.message = 0;
api.safi = SAFI_UNICAST;
SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
- api.nexthop_num = 1;
- api.nexthop = &nexthop_pointer;
- SET_FLAG(api.message, ZAPI_MESSAGE_IFINDEX);
- api.ifindex_num = 1;
- api.ifindex = &tmp_ifindex;
- SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
- api.metric = metric;
+ if(metric >= KERNEL_INFINITY) {
+ api.nexthop_num = 0;
+ api.ifindex_num = 0;
+ } else {
+ api.nexthop_num = 1;
+ api.nexthop = &nexthop_pointer;
+ SET_FLAG(api.message, ZAPI_MESSAGE_IFINDEX);
+ api.ifindex_num = 1;
+ api.ifindex = &tmp_ifindex;
+ SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
+ api.metric = metric;
+ }
debugf(BABEL_DEBUG_ROUTE, "adding route (ipv6) to zebra");
return zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD, zclient,
@@ -267,11 +276,16 @@ kernel_route_delete_v4(const unsigned char *pref, unsigned short plen,
api.message = 0;
api.safi = SAFI_UNICAST;
SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
- api.nexthop_num = 1;
- api.nexthop = &nexthop_pointer;
api.ifindex_num = 0;
- SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
- api.metric = metric;
+ if(metric >= KERNEL_INFINITY) {
+ api.flags = ZEBRA_FLAG_BLACKHOLE;
+ api.nexthop_num = 0;
+ } else {
+ api.nexthop_num = 1;
+ api.nexthop = &nexthop_pointer;
+ SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
+ api.metric = metric;
+ }
debugf(BABEL_DEBUG_ROUTE, "removing route (ipv4) to zebra");
return zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE, zclient,
@@ -307,11 +321,19 @@ kernel_route_delete_v6(const unsigned char *pref, unsigned short plen,
api.message = 0;
api.safi = SAFI_UNICAST;
SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
- api.nexthop_num = 1;
- api.nexthop = &nexthop_pointer;
- SET_FLAG(api.message, ZAPI_MESSAGE_IFINDEX);
- api.ifindex_num = 1;
- api.ifindex = &tmp_ifindex;
+ if(metric >= KERNEL_INFINITY) {
+ api.flags = ZEBRA_FLAG_BLACKHOLE;
+ api.nexthop_num = 0;
+ api.ifindex_num = 0;
+ } else {
+ api.nexthop_num = 1;
+ api.nexthop = &nexthop_pointer;
+ SET_FLAG(api.message, ZAPI_MESSAGE_IFINDEX);
+ api.ifindex_num = 1;
+ api.ifindex = &tmp_ifindex;
+ SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
+ api.metric = metric;
+ }
debugf(BABEL_DEBUG_ROUTE, "removing route (ipv6) to zebra");
return zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient,