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;
}
}
--
⑨