diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-01-14 19:33:30 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-01-14 19:33:30 +0100 |
commit | b85245f5d27480cf1a0e6ec5c4dd7893c4130242 (patch) | |
tree | 6ea9146a1fd1eb0c599ca713529a2715f79aac55 /sys/src | |
parent | 84e67ffa88e4d07b2e5848d666296a3e41750da6 (diff) |
ip/ipconfig: add v6 deault route from router advertisements
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/cmd/ip/ipconfig/ipconfig.h | 9 | ||||
-rw-r--r-- | sys/src/cmd/ip/ipconfig/ipv6.c | 40 | ||||
-rw-r--r-- | sys/src/cmd/ip/ipconfig/main.c | 113 |
3 files changed, 81 insertions, 81 deletions
diff --git a/sys/src/cmd/ip/ipconfig/ipconfig.h b/sys/src/cmd/ip/ipconfig/ipconfig.h index cbc7e0adc..290911636 100644 --- a/sys/src/cmd/ip/ipconfig/ipconfig.h +++ b/sys/src/cmd/ip/ipconfig/ipconfig.h @@ -57,12 +57,10 @@ struct Conf int maxraint; /* rfc2461, p.39: 4sec ≤ maxraint ≤ 1800sec, def 600 */ int minraint; /* 3sec ≤ minraint ≤ 0.75*maxraint */ int linkmtu; + int routerlt; /* router life time */ int reachtime; /* 3,600,000 msec, default 0 */ int rxmitra; /* default 0 */ int ttl; /* default 0 (unspecified) */ - /* default gateway params */ - uchar v6gaddr[IPaddrlen]; - int routerlt; /* router life time */ /* prefix related */ uchar v6pref[IPaddrlen]; @@ -108,10 +106,10 @@ void dhcpwatch(int); void doadd(int); void doremove(void); void dounbind(void); -int ipconfig4(void); -int ipconfig6(int); +int isether(void); long jitter(void); void lookforip(char*); +void mklladdr(void); void mkclientid(void); int nipifcs(char*); int openlisten(void); @@ -143,7 +141,6 @@ void warning(char *fmt, ...); */ void doipv6(int); -int ipconfig6(int); void recvra6(void); void sendra6(void); void v6paraminit(Conf *); diff --git a/sys/src/cmd/ip/ipconfig/ipv6.c b/sys/src/cmd/ip/ipconfig/ipv6.c index ba14f63ee..311975989 100644 --- a/sys/src/cmd/ip/ipconfig/ipv6.c +++ b/sys/src/cmd/ip/ipconfig/ipv6.c @@ -318,31 +318,6 @@ catch(void *a, char *msg) noted(NDFLT); } -/* - * based on libthread's threadsetname, but drags in less library code. - * actually just sets the arguments displayed. - */ -void -procsetname(char *fmt, ...) -{ - int fd; - char *cmdname; - char buf[128]; - va_list arg; - - va_start(arg, fmt); - cmdname = vsmprint(fmt, arg); - va_end(arg); - if (cmdname == nil) - return; - snprint(buf, sizeof buf, "#p/%d/args", getpid()); - if((fd = open(buf, OWRITE)) >= 0){ - write(fd, cmdname, strlen(cmdname)+1); - close(fd); - } - free(cmdname); -} - int dialicmp(uchar *dst, int dport, int *ctlfd) { @@ -383,18 +358,14 @@ dialicmp(uchar *dst, int dport, int *ctlfd) /* add ipv6 addr to an interface */ int -ip6cfg(int autoconf) +ip6cfg(void) { int tentative, dupfound = 0, n; char *p, buf[256]; - uchar ethaddr[6]; Biobuf *bp; - if (autoconf) { /* create link-local addr */ - if (myetheraddr(ethaddr, conf.dev) < 0) - sysfatal("myetheraddr w/ %s failed: %r", conf.dev); - ea2lla(conf.laddr, ethaddr); - } + if(!validip(conf.laddr) || isv4(conf.laddr)) + return -1; tentative = dupl_disc; @@ -562,7 +533,6 @@ recvrahost(uchar buf[], int pktlen) static int first = 1; ra = (Routeradv*)buf; -// memmove(conf.v6gaddr, ra->src, IPaddrlen); conf.ttl = ra->cttl; conf.mflag = (MFMASK & ra->mor); conf.oflag = (OCMASK & ra->mor); @@ -570,7 +540,6 @@ recvrahost(uchar buf[], int pktlen) conf.reachtime = nhgetl(ra->rchbltime); conf.rxmitra = nhgetl(ra->rxmtimer); -// issueadd6(&conf); /* for conf.v6gaddr? */ if (fprint(conf.cfd, "ra6 recvra 1") < 0) ralog("write(ra6 recvra 1) failed: %r"); issuebasera6(&conf); @@ -592,7 +561,6 @@ recvrahost(uchar buf[], int pktlen) "router adv %I", ra->src); return; } - snprint(abuf, sizeof abuf, "%s/arp", conf.mpoint); arpfd = open(abuf, OWRITE); if (arpfd < 0) { @@ -650,6 +618,8 @@ recvrahost(uchar buf[], int pktlen) break; } } + if(conf.routerlt != 0 && ISIPV6LINKLOCAL(ra->src)) + adddefroute(conf.mpoint, ra->src); } /* diff --git a/sys/src/cmd/ip/ipconfig/main.c b/sys/src/cmd/ip/ipconfig/main.c index a0d88031b..85a693ee4 100644 --- a/sys/src/cmd/ip/ipconfig/main.c +++ b/sys/src/cmd/ip/ipconfig/main.c @@ -9,6 +9,8 @@ #include "../dhcp.h" #include "ipconfig.h" +#include <libsec.h> /* genrandom() */ + #define DEBUG if(debug)warning /* possible verbs */ @@ -190,7 +192,7 @@ void doremove(void); void dounbind(void); void getoptions(uchar*); int ip4cfg(void); -int ip6cfg(int a); +int ip6cfg(void); void lookforip(char*); void mkclientid(void); void ndbconfig(void); @@ -593,10 +595,6 @@ main(int argc, char **argv) void doadd(int retry) { - int ppp; - - ppp = strcmp(conf.type, "ppp") == 0; - /* get number of preexisting interfaces */ nip = nipifcs(conf.mpoint); if(beprimary == -1 && nip == 0) @@ -609,20 +607,13 @@ doadd(int retry) binddevice(); } - if (ipv6auto && !ppp) { - if (ip6cfg(ipv6auto) < 0) - sysfatal("can't automatically start IPv6 on %s", - conf.dev); - } else if (validip(conf.laddr) && !isv4(conf.laddr)) { - if (ip6cfg(0) < 0) - sysfatal("can't start IPv6 on %s, address %I", - conf.dev, conf.laddr); - } - - if(!validip(conf.laddr) && !ppp) + if(!validip(conf.laddr)) if(dondbconfig) ndbconfig(); - else + else if(ipv6auto){ + mklladdr(); + dodhcp = 0; + } else dodhcp = 1; /* run dhcp if we need something */ @@ -642,10 +633,15 @@ doadd(int retry) if(noconfig) return; - if(ip4cfg() < 0) - sysfatal("can't start ip"); - else if(dodhcp && conf.lease != Lforever) - dhcpwatch(0); + if(!isv4(conf.laddr)){ + if(ip6cfg() < 0) + sysfatal("can't start IPv6 on %s, address %I", conf.dev, conf.laddr); + } else { + if(ip4cfg() < 0) + sysfatal("can't start IPv4 on %s, address %I", conf.dev, conf.laddr); + else if(dodhcp && conf.lease != Lforever) + dhcpwatch(0); + } /* leave everything we've learned somewhere other procs can find it */ if(beprimary){ @@ -736,23 +732,37 @@ adddefroute(char *mpoint, uchar *gaddr) close(cfd); } +int +isether(void) +{ + return strcmp(conf.type, "ether") == 0 || strcmp(conf.type, "gbe") == 0; +} + +/* create link local address */ +void +mklladdr(void) +{ + if(!isether() || myetheraddr(conf.hwa, conf.dev) != 0) + genrandom(conf.hwa, sizeof(conf.hwa)); + ea2lla(conf.laddr, conf.hwa); +} + /* create a client id */ void mkclientid(void) { - if(strcmp(conf.type, "ether") == 0 || strcmp(conf.type, "gbe") == 0) - if(myetheraddr(conf.hwa, conf.dev) == 0){ - conf.hwalen = 6; - conf.hwatype = 1; - conf.cid[0] = conf.hwatype; - memmove(&conf.cid[1], conf.hwa, conf.hwalen); - conf.cidlen = conf.hwalen+1; - } else { - conf.hwatype = -1; - snprint((char*)conf.cid, sizeof conf.cid, - "plan9_%ld.%d", lrand(), getpid()); - conf.cidlen = strlen((char*)conf.cid); - } + if(isether() && myetheraddr(conf.hwa, conf.dev) == 0){ + conf.hwalen = 6; + conf.hwatype = 1; + conf.cid[0] = conf.hwatype; + memmove(&conf.cid[1], conf.hwa, conf.hwalen); + conf.cidlen = conf.hwalen+1; + } else { + conf.hwatype = -1; + snprint((char*)conf.cid, sizeof conf.cid, + "plan9_%ld.%d", lrand(), getpid()); + conf.cidlen = strlen((char*)conf.cid); + } } /* bind ip into the namespace */ @@ -775,8 +785,7 @@ controldevice(void) int fd; Ctl *cp; - if (firstctl == nil || - strcmp(conf.type, "ether") != 0 && strcmp(conf.type, "gbe") != 0) + if (firstctl == nil || !isether()) return; snprint(ctlfile, sizeof ctlfile, "%s/clone", conf.dev); @@ -827,7 +836,7 @@ ip4cfg(void) char buf[256]; int n; - if(!validip(conf.laddr)) + if(!validip(conf.laddr) || !isv4(conf.laddr)) return -1; n = sprint(buf, "add"); @@ -951,7 +960,7 @@ dhcpwatch(int needconfig) } dolog = 1; /* log, don't print */ - procsetname("dhcpwatch"); + procsetname("dhcpwatch on %s", conf.dev); /* keep trying to renew the lease */ for(;;){ secs = conf.lease/2; @@ -1770,6 +1779,31 @@ parseverb(char *name) return -1; } +/* + * based on libthread's threadsetname, but drags in less library code. + * actually just sets the arguments displayed. + */ +void +procsetname(char *fmt, ...) +{ + int fd; + char *cmdname; + char buf[128]; + va_list arg; + + va_start(arg, fmt); + cmdname = vsmprint(fmt, arg); + va_end(arg); + if (cmdname == nil) + return; + snprint(buf, sizeof buf, "#p/%d/args", getpid()); + if((fd = open(buf, OWRITE)) >= 0){ + write(fd, cmdname, strlen(cmdname)+1); + close(fd); + } + free(cmdname); +} + /* get everything out of ndb */ void ndbconfig(void) @@ -1783,8 +1817,7 @@ ndbconfig(void) db = ndbopen(dbfile); if(db == nil) sysfatal("can't open ndb: %r"); - if (strcmp(conf.type, "ether") != 0 && strcmp(conf.type, "gbe") != 0 || - myetheraddr(conf.hwa, conf.dev) != 0) + if (!isether() || myetheraddr(conf.hwa, conf.dev) != 0) sysfatal("can't read hardware address"); sprint(etheraddr, "%E", conf.hwa); nattr = 0; |