summaryrefslogtreecommitdiffstats
path: root/proto/rip/rip.c
diff options
context:
space:
mode:
authorOndrej Filip <feela@network.cz>2004-07-13 22:53:56 +0200
committerOndrej Filip <feela@network.cz>2004-07-13 22:53:56 +0200
commit16c2d48d8fe10521fd493886cf245c75d843fc69 (patch)
treeae5da706bb3aba3cb69561811ccf8cb030fd61fc /proto/rip/rip.c
parentbc956fcab678f591137cba2a0ebe80c0812437db (diff)
downloadbird-16c2d48d8fe10521fd493886cf245c75d843fc69.tar
bird-16c2d48d8fe10521fd493886cf245c75d843fc69.zip
Bugfix - RIP now updates routes with worse metric.
Diffstat (limited to 'proto/rip/rip.c')
-rw-r--r--proto/rip/rip.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/proto/rip/rip.c b/proto/rip/rip.c
index 05525e9..5ff161f 100644
--- a/proto/rip/rip.c
+++ b/proto/rip/rip.c
@@ -2,6 +2,7 @@
* Rest in pieces - RIP protocol
*
* Copyright (c) 1998, 1999 Pavel Machek <pavel@ucw.cz>
+ * 2004 Ondrej Filip <feela@network.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*
@@ -267,7 +268,6 @@ rip_rte_update_if_better(rtable *tab, net *net, struct proto *p, rte *new)
if (!old || p->rte_better(new, old) ||
(ipa_equal(old->attrs->from, new->attrs->from) &&
(old->u.rip.metric != new->u.rip.metric)) )
-
rte_update(tab, net, p, new);
}
@@ -361,8 +361,8 @@ process_block( struct proto *p, struct rip_block *block, ip_addr whotoldme )
ip_addr network = block->network;
CHK_MAGIC;
- TRACE(D_ROUTES, "block: %I tells me: %I/??? available, metric %d... ", whotoldme, network, metric );
- /* FIXME: Why `???'? If prefix is unknown, just don't print it. [mj] */
+ TRACE(D_ROUTES, "block: %I tells me: %I/%d available, metric %d... ",
+ whotoldme, network, ipa_mklen(block->netmask), metric );
if ((!metric) || (metric > P_CF->infinity)) {
#ifdef IPV6 /* Someone is sedning us nexthop and we are ignoring it */
if (metric == 0xff)
@@ -882,6 +882,14 @@ rip_rt_notify(struct proto *p, struct network *net, struct rte *new, struct rte
}
static int
+rip_rte_same(struct rte *new, struct rte *old)
+{
+ /* new->attrs == old->attrs always */
+ return new->u.rip.metric == old->u.rip.metric;
+}
+
+
+static int
rip_rte_better(struct rte *new, struct rte *old)
{
struct proto *p = new->attrs->proto;
@@ -938,6 +946,7 @@ rip_init_instance(struct proto *p)
p->make_tmp_attrs = rip_make_tmp_attrs;
p->store_tmp_attrs = rip_store_tmp_attrs;
p->rte_better = rip_rte_better;
+ p->rte_same = rip_rte_same;
p->rte_insert = rip_rte_insert;
p->rte_remove = rip_rte_remove;
}