summaryrefslogtreecommitdiff
path: root/proto/rip
diff options
context:
space:
mode:
authorOndrej Filip <feela@network.cz>2013-02-24 00:43:08 +0100
committerOndrej Filip <feela@network.cz>2013-02-24 00:43:08 +0100
commita9c38203bdcad92f7ac0a8a912241d2acb483f2c (patch)
tree6fbee146c897efa6bc0f3819d476493d0691e686 /proto/rip
parent04ddefb357b2b8759be16633f7bb1df49b0405ea (diff)
Allow 1 sec RIP update.
Diffstat (limited to 'proto/rip')
-rw-r--r--proto/rip/rip.c26
-rw-r--r--proto/rip/rip.h1
2 files changed, 14 insertions, 13 deletions
diff --git a/proto/rip/rip.c b/proto/rip/rip.c
index 35a151ad..5007715d 100644
--- a/proto/rip/rip.c
+++ b/proto/rip/rip.c
@@ -7,14 +7,13 @@
* Can be freely distributed and used under the terms of the GNU GPL.
*
FIXME: IpV6 support: packet size
- FIXME: (nonurgent) IpV6 support: receive "route using" blocks
- FIXME: (nonurgent) IpV6 support: generate "nexthop" blocks
+ FIXME: (nonurgent) IPv6 support: receive "route using" blocks
+ FIXME: (nonurgent) IPv6 support: generate "nexthop" blocks
next hops are only advisory, and they are pretty ugly in IpV6.
I suggest just forgetting about them.
FIXME: (nonurgent): fold rip_connection into rip_interface?
- FIXME: (nonurgent) allow bigger frequencies than 1 regular update in 6 seconds (?)
FIXME: propagation of metric=infinity into main routing table may or may not be good idea.
*/
@@ -162,7 +161,7 @@ rip_tx( sock *s )
FIB_ITERATE_START(&P->rtable, &c->iter, z) {
struct rip_entry *e = (struct rip_entry *) z;
- if (!rif->triggered || (!(e->updated < now-5))) {
+ if (!rif->triggered || (!(e->updated < now-2))) { /* FIXME: Should be probably 1 or some different algorithm */
nullupdate = 0;
i = rip_tx_prepare( p, packet->block + i, e, rif, i );
if (i >= maxi) {
@@ -557,17 +556,23 @@ rip_timer(timer *t)
DBG( "RIP: Broadcasting routing tables\n" );
{
struct rip_interface *rif;
+
+ if ( P_CF->period > 2 ) { /* Bring some randomness into sending times */
+ if (! (P->tx_count % P_CF->period)) P->rnd_count = random_u32() % 2;
+ } else P->rnd_count = P->tx_count % P_CF->period;
+
WALK_LIST( rif, P->interfaces ) {
struct iface *iface = rif->iface;
if (!iface) continue;
if (rif->mode & IM_QUIET) continue;
if (!(iface->flags & IF_UP)) continue;
+ rif->triggered = P->rnd_count;
- rif->triggered = (P->tx_count % 6);
rip_sendto( p, IPA_NONE, 0, rif );
}
- P->tx_count ++;
+ P->tx_count++;
+ P->rnd_count--;
}
DBG( "RIP: tick tock done\n" );
@@ -595,14 +600,9 @@ rip_start(struct proto *p)
init_list( &P->interfaces );
P->timer = tm_new( p->pool );
P->timer->data = p;
- P->timer->randomize = 2;
- P->timer->recurrent = (P_CF->period / 6) - 1;
- if (P_CF->period < 12) {
- log(L_WARN "Period %d is too low. So I am using 12 which is the lowest possible value.", P_CF->period);
- P->timer->recurrent = 1;
- }
+ P->timer->recurrent = 1;
P->timer->hook = rip_timer;
- tm_start( P->timer, 5 );
+ tm_start( P->timer, 2 );
rif = new_iface(p, NULL, 0, NULL); /* Initialize dummy interface */
add_head( &P->interfaces, NODE rif );
CHK_MAGIC;
diff --git a/proto/rip/rip.h b/proto/rip/rip.h
index 896fab64..e0816d0e 100644
--- a/proto/rip/rip.h
+++ b/proto/rip/rip.h
@@ -162,6 +162,7 @@ struct rip_proto {
int magic;
#endif
int tx_count; /* Do one regular update once in a while */
+ int rnd_count; /* Randomize sending time */
};
#ifdef LOCAL_DEBUG