ref: d68f4adeba6ef0db7590cf7c4e1518f4d4bdedff
parent: 2d1dac07f7770e096d76ecbddea364ed538f0e70
parent: 3cdbbcd859ae0251062cdb10ece25c3d507931f2
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Apr 11 10:20:53 EDT 2020
merge
--- a/sys/src/cmd/ip/ipconfig/ipv6.c
+++ b/sys/src/cmd/ip/ipconfig/ipv6.c
@@ -384,7 +384,9 @@
}
if(!tentative){
- if(validip(conf.gaddr) && !isv4(conf.gaddr))
+ if(validip(conf.gaddr) && !isv4(conf.gaddr)
+ && ipcmp(conf.gaddr, conf.laddr) != 0
+ && ipcmp(conf.gaddr, conf.lladdr) != 0)
adddefroute(conf.gaddr, conf.laddr, conf.laddr, conf.mask);
return 0;
}
@@ -758,7 +760,9 @@
DEBUG("got RA from %I on %s; pfx %I %M",
ra->src, conf.dev, conf.v6pref, conf.mask);
- if(validip(conf.gaddr))
+ if(validip(conf.gaddr)
+ && ipcmp(conf.gaddr, conf.laddr) != 0
+ && ipcmp(conf.gaddr, conf.lladdr) != 0)
adddefroute(conf.gaddr, conf.lladdr, conf.laddr, conf.mask);
if(noconfig)
--- a/sys/src/cmd/ip/ipconfig/main.c
+++ b/sys/src/cmd/ip/ipconfig/main.c
@@ -598,7 +598,8 @@
return -1;
}
- if(validip(conf.gaddr) && isv4(conf.gaddr))
+ if(validip(conf.gaddr) && isv4(conf.gaddr)
+ && ipcmp(conf.gaddr, conf.laddr) != 0)
adddefroute(conf.gaddr, conf.laddr, conf.laddr, conf.mask);
return 0;
@@ -987,6 +988,23 @@
return t;
}
+/* my ips from ndb, read by ndbconfig() below */
+static uchar dbips[128*IPaddrlen];
+
+static int
+ipindb(uchar *ip)
+{
+ uchar *a;
+
+ for(a = dbips; a < &dbips[sizeof(dbips)]; a += IPaddrlen){
+ if(!validip(a))
+ break;
+ if(ipcmp(ip, a) == 0)
+ return 1;
+ }
+ return 0;
+}
+
/* read configuration (except laddr) for myip from ndb */
void
ndb2conf(Ndb *db, uchar *myip)
@@ -1040,8 +1058,11 @@
continue;
}
if(strcmp(nt->attr, "ipgw") == 0) {
- nt = uniquent(nt);
+ /* ignore in case we are the gateway */
+ if(ipindb(ip))
+ continue;
ipmove(conf.gaddr, ip);
+ nt = uniquent(nt);
} else if(strcmp(nt->attr, "dns") == 0) {
addaddrs(conf.dns, sizeof(conf.dns), ip, IPaddrlen);
} else if(strcmp(nt->attr, "ntp") == 0) {
@@ -1070,7 +1091,6 @@
static void
ndbconfig(void)
{
- uchar ips[128*IPaddrlen];
char etheraddr[32], *attr;
Ndbtuple *t, *nt;
Ndb *db;
@@ -1086,7 +1106,7 @@
return;
}
- memset(ips, 0, sizeof(ips));
+ memset(dbips, 0, sizeof(dbips));
if(conf.hwatype != 1)
sysfatal("can't read hardware address");
@@ -1100,11 +1120,11 @@
nt->attr, nt->val);
continue;
}
- addaddrs(ips, sizeof(ips), conf.laddr, IPaddrlen);
+ addaddrs(dbips, sizeof(dbips), conf.laddr, IPaddrlen);
}
ndbfree(t);
- n = countaddrs(ips, sizeof(ips));
+ n = countaddrs(dbips, sizeof(dbips));
if(n == 0)
sysfatal("no ip addresses found in ndb");
@@ -1111,7 +1131,7 @@
/* add link local address first, if not already done */
if(!findllip(conf.lladdr, ifc)){
for(i = 0; i < n; i++){
- ipmove(conf.laddr, ips+i*IPaddrlen);
+ ipmove(conf.laddr, dbips+i*IPaddrlen);
if(ISIPV6LINKLOCAL(conf.laddr)){
ipv6auto = 0;
ipmove(conf.lladdr, conf.laddr);
@@ -1128,7 +1148,7 @@
/* add v4 addresses and v6 if link local address is available */
for(i = 0; i < n; i++){
- ipmove(conf.laddr, ips+i*IPaddrlen);
+ ipmove(conf.laddr, dbips+i*IPaddrlen);
if(isv4(conf.laddr) || ipcmp(conf.laddr, conf.lladdr) != 0){
ndb2conf(db, conf.laddr);
doadd();