Hi, i am trying to be able to withdraw a route advertised via rip with a triggered update .. Currently disappearing routes only seem to be deleted by not advertised anymore. This is my rough solution although it has some problems i do see. - A triggered update for every withdraw route - Update contains all routes. Currently i fail to understand the triggered update infrastructure in place already - When reading this code snippet: 159 FIB_ITERATE_START(&P->rtable, &c->iter, z) { 160 struct rip_entry *e = (struct rip_entry *) z; 161 162 if (!rif->triggered || (!(e->updated < now-5))) { 163 nullupdate = 0; 164 i = rip_tx_prepare( p, packet->block + i, e, rif, i ); 165 if (i >= maxi) { 166 FIB_ITERATE_PUT(&c->iter, z); 167 goto break_loop; 168 } 169 } 170 } FIB_ITERATE_END(z); 171 c->done = 1; Where "rif->triggered = (P->tx_count % 6);" so basically i am sending every 5th update and ignore the others !?! I dont get it why a packet is constructed and finally not send. I'd rather do some dampening and would schedule a triggered update on the first withdrawn route in lets say 1-2 seconds. Flo diff -Nur bird-1.0.11/proto/rip/rip.c bird-1.0.11.flo/proto/rip/rip.c --- bird-1.0.11/proto/rip/rip.c 2004-07-15 17:28:13.000000000 +0000 +++ bird-1.0.11.flo/proto/rip/rip.c 2006-08-01 07:46:07.000000000 +0000 @@ -501,6 +501,26 @@ debug( "\n" ); } + +static void +rip_broadcast(struct proto *p) +{ + struct rip_interface *rif; + DBG( "RIP: Broadcasting routing tables\n" ); + 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->tx_count % 6); + rip_sendto( p, IPA_NONE, 0, rif ); + } + P->tx_count ++; +} + + /** * rip_timer * @t: timer @@ -546,21 +566,7 @@ } } - DBG( "RIP: Broadcasting routing tables\n" ); - { - struct rip_interface *rif; - 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->tx_count % 6); - rip_sendto( p, IPA_NONE, 0, rif ); - } - P->tx_count ++; - } + rip_broadcast(p); DBG( "RIP: tick tock done\n" ); } @@ -854,7 +860,16 @@ struct rip_entry *e = fib_find( &P->rtable, &net->n.prefix, net->n.pxlen ); if (!e) log( L_BUG "%s: Deleting nonexistent entry?!", p->name ); - fib_delete( &P->rtable, e ); + + if (new) { + fib_delete( &P->rtable, e ); + } else { + /* Set metric to infinity */ + e->metric=16; + e->updated = e->changed = now; + + rip_broadcast(p); + } } if (new) { Flo -- Florian Lohoff flo@rfc822.org +49-171-2280134 Heisenberg may have been here.
Hi!
i am trying to be able to withdraw a route advertised via rip with a triggered update .. Currently disappearing routes only seem to be deleted by not advertised anymore.
(Forwarding to Pavel Machek, who wrote the code in question...) Have a nice fortnight -- Martin `MJ' Mares <mj@ucw.cz> http://atrey.karlin.mff.cuni.cz/~mj/ Faculty of Math and Physics, Charles University, Prague, Czech Rep., Earth A sine curve goes off to infinity or at least the end of the blackboard.
participants (2)
-
Florian Lohoff -
Martin Mares