[radvd-devel-l] [PATCH] Sending initial RAs in smaller intervals

Jirka Bohac jbohac at suse.cz
Tue Feb 7 13:00:26 EST 2006


Hi,

RFC 2461, section 6.2.4 says:
   For the first few advertisements (up to
   MAX_INITIAL_RTR_ADVERTISEMENTS) sent from an interface when it
   becomes an advertising interface, if the randomly chosen
   interval is greater than MAX_INITIAL_RTR_ADVERT_INTERVAL, the
   timer SHOULD be set to MAX_INITIAL_RTR_ADVERT_INTERVAL
   instead.  Using a smaller interval for the initial
   advertisements increases the likelihood of a router being
   discovered quickly when it first becomes available, in the
   presence of possible packet loss.

radvd does not do this, even though the constants are already
defined in defaults.h.

The following patch fixes that:

diff -Naur radvd-0.9.1/radvd.c radvd-0.9.1-patched/radvd.c
--- radvd-0.9.1/radvd.c	2005-12-30 16:13:11.000000000 +0100
+++ radvd-0.9.1-patched/radvd.c	2006-02-07 18:44:09.000000000 +0100
@@ -302,6 +302,12 @@
 	send_ra(sock, iface, NULL);
 
 	next = rand_between(iface->MinRtrAdvInterval, iface->MaxRtrAdvInterval); 
+	if (iface->InitialAdvLeft > 1) {
+		--iface->InitialAdvLeft;
+		if (next > MAX_INITIAL_RTR_ADVERT_INTERVAL)
+			next = MAX_INITIAL_RTR_ADVERT_INTERVAL;
+	} 
+
 	set_timer(&iface->tm, next);
 }
 
@@ -339,9 +345,11 @@
 			if (iface->AdvSendAdvert)
 			{
 				/* send an initial advertisement */
+				iface->InitialAdvLeft = MAX_INITIAL_RTR_ADVERTISEMENTS - 1;
 				send_ra(sock, iface, NULL);
 
-				set_timer(&iface->tm, iface->MaxRtrAdvInterval);
+				set_timer(&iface->tm, iface->MaxRtrAdvInterval > MAX_INITIAL_RTR_ADVERT_INTERVAL ? 
+					    MAX_INITIAL_RTR_ADVERT_INTERVAL : iface->MaxRtrAdvInterval);
 			}
 		}
 	}
diff -Naur radvd-0.9.1/radvd.h radvd-0.9.1-patched/radvd.h
--- radvd-0.9.1/radvd.h	2005-12-30 17:12:23.000000000 +0100
+++ radvd-0.9.1-patched/radvd.h	2006-02-07 18:44:09.000000000 +0100
@@ -70,6 +70,7 @@
 	int			AdvDefaultPreference;
 	int			AdvSourceLLAddress;
 	int			UnicastOnly;
+	int			InitialAdvLeft;
 
 	/* Mobile IPv6 extensions */
 	int			AdvIntervalOpt;





Please, is it possible to merge this? 


Thanks,

-- 
Jirka Bohac <jbohac at suse.cz>
SUSE Labs, SUSE CR




More information about the radvd-devel-l mailing list