ip/ipconfig: add v6 deault route from router advertisements

This commit is contained in:
cinap_lenrek 2018-01-14 19:33:30 +01:00
parent 84e67ffa88
commit b85245f5d2
3 changed files with 81 additions and 81 deletions

View file

@ -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 *);

View file

@ -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);
}
/*

View file

@ -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;