diff options
-rw-r--r-- | nest/rt-table.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/nest/rt-table.c b/nest/rt-table.c index c3ec0314..cb3e361c 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -2984,12 +2984,25 @@ rt_update_hostentry(rtable *tab, struct hostentry *he) rta *a = e->attrs; pxlen = n->n.addr->pxlen; - if (a->hostentry) + int MAX_REC = 10; + u32 prev_igp_metric = 0; + int i = 0; + for (struct hostentry *he = a->hostentry; + he && he->src; + i++, he = he->src->hostentry) { - /* Recursive route should not depend on another recursive route */ - log(L_WARN "Next hop address %I resolvable through recursive route for %N", - he->addr, n->n.addr); - goto done; + log(L_WARN "Next hop address %I resolvable through recursive route for %N igp_metric %u %u", + he->addr, n->n.addr, prev_igp_metric, he->igp_metric); + + if (prev_igp_metric >= he->igp_metric || i >= MAX_REC) + { + /* Recursive route should not depend on another recursive route */ + log(L_WARN "Next hop address %I resolvable through deep recursive route for %N", + he->addr, n->n.addr); + goto done; + } + + prev_igp_metric = he->igp_metric; } if (a->dest == RTD_UNICAST) |