shithub: riscv

Download patch

ref: 691370a08dbfda305f0302023618211ffbfbce7a
parent: fc3c91d91f98a4b19834dc7f3735857da6fbcd01
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Apr 18 21:01:39 EDT 2018

ip/ipconfig: always refresh ndb/cs and ndb/dns when adding or removing ip addresses

--- a/sys/src/cmd/ip/ipconfig/ipv6.c
+++ b/sys/src/cmd/ip/ipconfig/ipv6.c
@@ -11,6 +11,8 @@
 #include "ipconfig.h"
 #include "../icmp.h"
 
+#include <libsec.h>
+
 #pragma varargck argpos ralog 1
 
 #define RALOG "v6routeradv"
@@ -544,16 +546,32 @@
 	free(cfg);
 }
 
+static int
+seen(Conf *cf)
+{
+	static uchar tab[SHA1dlen*100], *w;
+	uchar hash[SHA1dlen], *r;
+
+	sha1((uchar*)cf, sizeof(*cf), hash, nil);
+	if(w == nil || w == &tab[sizeof(tab)])
+		w = tab;
+	for(r = tab; r < w; r += SHA1dlen)
+		if(memcmp(r, hash, SHA1dlen) == 0)
+			return 1;
+	memmove(w, hash, SHA1dlen);
+	w += SHA1dlen;
+	return 0;
+}
+
 static void
 recvrahost(uchar buf[], int pktlen)
 {
-	int m, n, optype;
+	int m, n, optype, needrefresh;
 	uchar src[IPaddrlen];
 	Lladdropt *llao;
 	Mtuopt *mtuo;
 	Prefixopt *prfo;
 	Routeradv *ra;
-	static int first = 1;
 
 	m = sizeof *ra;
 	ra = (Routeradv*)buf;
@@ -571,6 +589,7 @@
 	conf.rxmitra =   nhgetl(ra->rxmtimer);
 	issuebasera6(&conf);
 
+	needrefresh = 0;
 	while(pktlen - m >= 8) {
 		n = m;
 		optype = buf[n];
@@ -590,25 +609,9 @@
 			break;
 		case V6nd_pfxinfo:
 			prfo = (Prefixopt*)&buf[n];
-			if(prfo->len != 4) {
-				ralog("illegal len (%d) for prefix option", prfo->len);
-				return;
-			}
-			if((prfo->plen & 127) == 0
-			|| !validip(prfo->pref)
-			|| isv4(prfo->pref)
-			|| ipcmp(prfo->pref, v6loopback) == 0
-			|| ISIPV6MCAST(prfo->pref)
-			|| ISIPV6LINKLOCAL(prfo->pref)){
-				ralog("igoring bogus prefix from %I on %s; pfx %I /%d",
-					ra->src, conf.dev, prfo->pref, prfo->plen);
+			if(prfo->len != 4)
 				break;
-			}
-			if(first) {
-				first = 0;
-				ralog("got initial RA from %I on %s; pfx %I /%d",
-					ra->src, conf.dev, prfo->pref, prfo->plen);
-			}
+
 			conf.prefixlen = prfo->plen & 127;
 			genipmkask(conf.mask, conf.prefixlen);
 			maskip(prfo->pref, conf.mask, conf.v6pref);
@@ -619,18 +622,42 @@
 			issueadd6(&conf);
 			
 			if(conf.routerlt == 0)
-				break;
-			if((prfo->lar & RFMASK) != 0)
+				ipmove(conf.gaddr, IPnoaddr);
+			else if((prfo->lar & RFMASK) != 0)
 				ipmove(conf.gaddr, prfo->pref);
 			else
 				ipmove(conf.gaddr, ra->src);
 
-			memmove(src, conf.v6pref, 8);
-			memmove(src+8, conf.laddr+8, 8);
-			adddefroute(conf.gaddr, conf.laddr, src, conf.mask);
+			/* report prefix only once */
+			if(seen(&conf))
+				break;
+
+			if(conf.prefixlen  == 0
+			|| !validip(conf.v6pref)
+			|| isv4(conf.v6pref)
+			|| ipcmp(conf.v6pref, v6loopback) == 0
+			|| ISIPV6MCAST(conf.v6pref)
+			|| ISIPV6LINKLOCAL(conf.v6pref)){
+				ralog("igoring bogus prefix from %I on %s; pfx %I %M",
+					ra->src, conf.dev, conf.v6pref, conf.mask);
+				break;
+			}
+
+			ralog("got initial RA from %I on %s; pfx %I %M",
+				ra->src, conf.dev, conf.v6pref, conf.mask);
+
+			if(validip(conf.gaddr)){
+				memmove(src, conf.v6pref, 8);
+				memmove(src+8, conf.laddr+8, 8);
+				adddefroute(conf.gaddr, conf.laddr, src, conf.mask);
+			}
+			needrefresh = 1;
 			break;
 		}
 	}
+
+	if(needrefresh)
+		refresh();
 }
 
 /*
@@ -929,6 +956,7 @@
 		sysfatal("unknown IPv6 verb");
 	case Vaddpref6:
 		issueadd6(&conf);
+		refresh();
 		break;
 	case Vra6:
 		issuebasera6(&conf);
--- a/sys/src/cmd/ip/ipconfig/main.c
+++ b/sys/src/cmd/ip/ipconfig/main.c
@@ -666,11 +666,9 @@
 	}
 
 	/* leave everything we've learned somewhere other procs can find it */
-	if(beprimary){
-		if(!dondbconfig && !ipv6auto)
-			putndb();
-		refresh();
-	}
+	if(beprimary && !dondbconfig && !ipv6auto)
+		putndb();
+	refresh();
 }
 
 void
@@ -1004,10 +1002,9 @@
 			 * leave everything we've learned somewhere that
 			 * other procs can find it.
 			 */
-			if(beprimary){
+			if(beprimary)
 				putndb();
-				refresh();
-			}
+			refresh();
 		}
 	}
 }