summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2010-08-03 08:26:47 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2010-08-03 08:26:47 +0200
commit2c9033afd5ce5e99255d248fb065e94534405da7 (patch)
tree85f2e8b83bdeff3d19cbc81acf8b033eaec8c90a
parentf428631cd6f48c5155bd1b7724e9bb8a545fda12 (diff)
downloadbird-2c9033afd5ce5e99255d248fb065e94534405da7.tar
bird-2c9033afd5ce5e99255d248fb065e94534405da7.zip
Do not allow interdependent recursive routes.
-rw-r--r--nest/rt-table.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/nest/rt-table.c b/nest/rt-table.c
index ef07042..389baaa 100644
--- a/nest/rt-table.c
+++ b/nest/rt-table.c
@@ -1509,7 +1509,16 @@ rt_update_hostentry(rtable *tab, struct hostentry *he)
rta *a = n->routes->attrs;
pxlen = n->n.pxlen;
- if (a->dest == RTD_DEVICE)
+ if (a->hostentry)
+ {
+ /* Recursive route should not depend on another recursive route */
+ log(L_WARN "Next hop address %I resolvable through recursive route for %I/%d",
+ he->addr, n->n.prefix, n->n.pxlen);
+ he->iface = NULL;
+ he->gw = IPA_NONE;
+ he->dest = RTD_UNREACHABLE;
+ }
+ else if (a->dest == RTD_DEVICE)
{
if (if_local_addr(he->addr, a->iface))
{