Index: kame/kame/rtadvd/config.c diff -u kame/kame/rtadvd/config.c.orig kame/kame/rtadvd/config.c --- kame/kame/rtadvd/config.c.orig Mon Apr 29 09:37:30 2002 +++ kame/kame/rtadvd/config.c Sat May 11 02:06:41 2002 @@ -67,10 +67,21 @@ #include "if.h" #include "config.h" +struct lifetimeinfo { + struct lifetimeinfo *next; /* forward link */ + struct lifetimeinfo *prev; /* previous link */ + + char ifname[IFNAMSIZ]; + u_int32_t validlifetime; + u_int32_t preflifetime; +}; + static void makeentry __P((char *, size_t, int, char *, int)); -static void get_prefix __P((struct rainfo *)); +static void get_prefix __P((struct rainfo *, struct lifetimeinfo *)); static int getinet6sysctl __P((int)); +static struct lifetimeinfo lifetime = { &lifetime, &lifetime }; + extern struct rainfo *ralist; #if defined(__FreeBSD__) && __FreeBSD__ <= 3 /* XXX: see PORTABILITY */ @@ -86,6 +97,7 @@ int stat, pfxs, i; char tbuf[BUFSIZ]; struct rainfo *tmp; + struct lifetimeinfo *lt; long val; int64_t val64; char buf[BUFSIZ]; @@ -283,6 +295,30 @@ #endif /* prefix information */ + if ((lt = malloc(sizeof(struct lifetimeinfo))) == NULL) { + syslog(LOG_ERR, "<%s> memory allocation failed", + __FUNCTION__); + exit(1); + } + memset(lt, 0, sizeof(*lt)); + + MAYHAVE(val64, "vltime", DEF_ADVVALIDLIFETIME); + if (val64 < 0 || val64 > 0xffffffff) { + syslog(LOG_ERR, "<%s> vltime out of range", __FUNCTION__); + exit(1); + } + lt->validlifetime = (u_int32_t)val64; + + MAYHAVE(val64, "pltime", DEF_ADVPREFERREDLIFETIME); + if (val64 < 0 || val64 > 0xffffffff) { + syslog(LOG_ERR, "<%s> pltime out of range", __FUNCTION__); + exit(1); + } + lt->preflifetime = (u_int32_t)val64; + + strlcpy(lt->ifname, intface, sizeof(lt->ifname)); + insque(lt, &lifetime); + /* * This is an implementation specific parameter to consinder * link propagation delays and poorly synchronized clocks when @@ -300,7 +336,7 @@ __FUNCTION__, intface); exit(1); } - get_prefix(tmp); + get_prefix(tmp, lt); } else { tmp->pfxs = pfxs; for (i = 0; i < pfxs; i++) { @@ -375,7 +411,7 @@ #endif makeentry(entbuf, sizeof(entbuf), i, "vltime", added); - MAYHAVE(val64, entbuf, DEF_ADVVALIDLIFETIME); + MAYHAVE(val64, entbuf, lt->validlifetime); if (val64 < 0 || val64 > 0xffffffff) { syslog(LOG_ERR, "<%s> vltime (" LONGLONG ") for %s/%d on %s is out of range", @@ -394,7 +430,7 @@ } makeentry(entbuf, sizeof(entbuf), i, "pltime", added); - MAYHAVE(val64, entbuf, DEF_ADVPREFERREDLIFETIME); + MAYHAVE(val64, entbuf, lt->preflifetime); if (val64 < 0 || val64 > 0xffffffff) { syslog(LOG_ERR, "<%s> pltime (" LONGLONG @@ -606,7 +642,7 @@ } static void -get_prefix(struct rainfo *rai) +get_prefix(struct rainfo *rai, struct lifetimeinfo *lt) { struct ifaddrs *ifap, *ifa; struct prefix *pp; @@ -693,8 +729,8 @@ __FUNCTION__, ntopbuf, pp->prefixlen, rai->ifname); /* set other fields with protocol defaults */ - pp->validlifetime = DEF_ADVVALIDLIFETIME; - pp->preflifetime = DEF_ADVPREFERREDLIFETIME; + pp->validlifetime = lt->validlifetime; + pp->preflifetime = lt->preflifetime; pp->onlinkflg = 1; pp->autoconfflg = 1; #ifdef MIP6 @@ -809,6 +845,9 @@ static int init_prefix(struct in6_prefixreq *ipr) { + struct lifetimeinfo *lt; + u_int32_t validlifetime = DEF_ADVVALIDLIFETIME; + u_int32_t preflifetime = DEF_ADVPREFERREDLIFETIME; int s; if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { @@ -821,8 +860,16 @@ syslog(LOG_INFO, "<%s> ioctl:SIOCGIFPREFIX %s", __FUNCTION__, strerror(errno)); - ipr->ipr_vltime = DEF_ADVVALIDLIFETIME; - ipr->ipr_pltime = DEF_ADVPREFERREDLIFETIME; + for (lt = lifetime.next; lt != &lifetime; lt = lt->next) { + if (strcmp(lt->ifname, ipr->ipr_name) == 0) { + validlifetime = lt->validlifetime; + preflifetime = lt->preflifetime; + break; + } + } + + ipr->ipr_vltime = validlifetime; + ipr->ipr_pltime = preflifetime; ipr->ipr_raf_onlink = 1; ipr->ipr_raf_auto = 1; /* omit other field initialization */