summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew J. Schorr <ajschorr@alumni.princeton.edu>2006-04-28 16:22:36 +0000
committerAndrew J. Schorr <ajschorr@alumni.princeton.edu>2006-04-28 16:22:36 +0000
commitb9d92881f5d45601c4268d99baec8835068b73c2 (patch)
treeb99acacee536e07a4726b69f8d2b6397e58eadba
parente0062775b9f9945612912bdefc2d9bcf6ab0650b (diff)
[ripd] Fix logic to send updates on all connected addresses.
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.
-rw-r--r--ripd/ChangeLog11
-rw-r--r--ripd/ripd.c48
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);
+ }
+ }
}
}