shithub: front

Download patch

ref: 1c682a98fe7363e778a2687af5bab4d0ffacc3f6
parent: d0f4f620cfba9f857dd15bdbcfc660cc01bc53c5
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Sep 29 07:41:50 EDT 2024

ip/ipconfig: make ra limiter less agressive (thanks cgnarne)

For handling route invalidations, we have to allow
short bursts of traffic. Therefore we keep track
of the number of ra's received in the ra interal
and only start dropping packets when reaching 100
packets.

--- a/sys/src/cmd/ip/ipconfig/ipv6.c
+++ b/sys/src/cmd/ip/ipconfig/ipv6.c
@@ -807,7 +807,7 @@
 static int
 recvra6(void)
 {
-	int fd, n, sendrscnt, recvracnt, sleepfor;
+	int fd, n, sendrscnt, gotra, pktcnt, sleepfor;
 	uchar buf[4096];
 
 	fd = dialicmpv6(v6allnodesL, ICMP6_RA);
@@ -829,7 +829,6 @@
 	procsetname("recvra6 on %s %I", conf.dev, conf.lladdr);
 	notify(catch);
 
-	recvracnt = 0;
 	sendrscnt = 0;
 	if(recvra6on(myifc) == IsHostRecv){
 		sendrs(fd, v6allroutersL);
@@ -836,6 +835,8 @@
 		sendrscnt = Maxv6rss;
 	}
 
+	gotra = 0;
+	pktcnt = 0;
 	sleepfor = Minv6interradelay;
 
 	for (;;) {
@@ -844,9 +845,13 @@
 		sleepfor = alarm(0);
 
 		/* wait for alarm to expire */
-		if(recvracnt >= Maxv6initras && sleepfor > 100)
-			continue;
-
+		if(sleepfor > 100){
+			if(pktcnt > 100)
+				continue;
+			pktcnt++;
+		} else {
+			pktcnt = 1;
+		}
 		sleepfor = Maxv6radelay;
 
 		myifc = readipifc(conf.mpoint, myifc, myifc->index);
@@ -853,7 +858,7 @@
 		if(myifc == nil) {
 			warning("recvra6: can't read router params on %s, quitting on %s",
 				conf.mpoint, conf.dev);
-			if(recvracnt == 0)
+			if(!gotra)
 				rendezvous(recvra6, (void*)-1);
 			exits(nil);
 		}
@@ -863,7 +868,7 @@
 			break;
 		default:
 			warning("recvra6: recvra off, quitting on %s", conf.dev);
-			if(recvracnt == 0)
+			if(!gotra)
 				rendezvous(recvra6, (void*)-1);
 			exits(nil);
 		}
@@ -873,11 +878,11 @@
 				sendrscnt--;
 				sendrs(fd, v6allroutersL);
 				sleepfor = V6rsintvl + nrand(100);
-			} else if(recvracnt == 0) {
+			} else if(!gotra) {
+				gotra = 1;
 				warning("recvra6: no router advs after %d sols on %s",
 					Maxv6rss, conf.dev);
 				rendezvous(recvra6, (void*)0);
-				recvracnt = 1;
 			}
 			continue;
 		}
@@ -886,7 +891,8 @@
 			continue;
 
 		/* got at least initial ra; no whining */
-		if(recvracnt == 0){
+		if(!gotra){
+			gotra = 1;
 			if(dodhcp && conf.mflag){
 				dhcpv6query();
 				if(noconfig || !validip(conf.laddr))
@@ -903,11 +909,6 @@
 			}
 			rendezvous(recvra6, (void*)1);
 		}
-
-		if(recvracnt < Maxv6initras)
-			recvracnt++;
-		else
-			recvracnt = 1;
 	}
 }
 
--