diff options
-rw-r--r-- | ripd/ChangeLog | 11 | ||||
-rw-r--r-- | ripd/ripd.c | 48 |
2 files changed, 28 insertions, 31 deletions
diff --git a/ripd/ChangeLog b/ripd/ChangeLog index d795509e..89302d55 100644 --- a/ripd/ChangeLog +++ b/ripd/ChangeLog @@ -1,3 +1,14 @@ +2006-04-28 Andrew J. Schorr <ajschorr@alumni.princeton.edu> + + * ripd.c: (rip_update_process) Try to fix the logic for sending + an updated on each connected network. The new code will + attempt to send the update on each connected network, whereas + the previous code seemed to be attempting to avoid sending + more than one RIPv1 update on a given interface, but was coded + incorrectly. The actual effect of the old code was to send + an update only on the first connected address in the cases + where the interface is not multicast, or RIPv2 is not being used. + 2006-01-30 Alain Ritoux <alain.ritoux@6wind.com> * ripd.c: correct bug that allowed route learnt through RIP to take diff --git a/ripd/ripd.c b/ripd/ripd.c index c8aa5221..e91adb84 100644 --- a/ripd/ripd.c +++ b/ripd/ripd.c @@ -2498,42 +2498,28 @@ rip_update_process (int route_type) if (ri->running) { + /* + * If there is no version configuration in the interface, + * use rip's version setting. + */ + int vsend = ((ri->ri_send == RI_RIP_UNSPEC) ? + rip->version_send : ri->ri_send); + if (IS_RIP_DEBUG_EVENT) - { - if (ifp->name) - zlog_debug ("SEND UPDATE to %s ifindex %d", - ifp->name, ifp->ifindex); - else - zlog_debug ("SEND UPDATE to _unknown_ ifindex %d", - ifp->ifindex); - } + zlog_debug("SEND UPDATE to %s ifindex %d", + (ifp->name ? ifp->name : "_unknown_"), ifp->ifindex); /* send update on each connected network */ for (ALL_LIST_ELEMENTS (ifp->connected, ifnode, ifnnode, connected)) { - struct prefix_ipv4 *ifaddr; - int done = 0; - /* - * If there is no version configuration in the interface, - * use rip's version setting. - */ - int vsend = ((ri->ri_send == RI_RIP_UNSPEC) ? - rip->version_send : ri->ri_send); - - ifaddr = (struct prefix_ipv4 *) connected->address; - - if (ifaddr->family != AF_INET) - continue; - - if ((vsend & RIPv1) && !done) - rip_update_interface (connected, RIPv1, route_type); - if ((vsend & RIPv2) && if_is_multicast(ifp)) - rip_update_interface (connected, RIPv2, route_type); - done = 1; - if (!(vsend & RIPv2) || !if_is_multicast(ifp)) - break; - - } + if (connected->address->family == AF_INET) + { + if (vsend & RIPv1) + rip_update_interface (connected, RIPv1, route_type); + if ((vsend & RIPv2) && if_is_multicast(ifp)) + rip_update_interface (connected, RIPv2, route_type); + } + } } } |