/* Add any requested prefixes / addresses */
for (i = 0; i < ifp->options->ia_len; i++) {
ia = &ifp->options->ia[i];
- if (ia->prefix_len) {
+ if (!IN6_IS_ADDR_UNSPECIFIED(&ia->addr) ||
+ (ia->prefix_len && ifp->options->ia_type == D6_OPTION_IA_PD))
+ {
a = calloc(1, sizeof(*a));
if (a == NULL) {
syslog(LOG_ERR, "%s: %m", __func__);
memcpy(&a->iaid, &ia->iaid, sizeof(a->iaid));
//a->prefix_pltime = 0;
//a->prefix_vltime = 0;
- if (ifp->options->ia_type == D6_OPTION_IA_PD)
+ if (ifp->options->ia_type == D6_OPTION_IA_PD) {
memcpy(&a->prefix, &ia->addr, sizeof(a->addr));
- else
+ a->prefix_len = ia->prefix_len;
+ } else
memcpy(&a->addr, &ia->addr, sizeof(a->addr));
- a->prefix_len = ia->prefix_len;
TAILQ_INSERT_TAIL(&state->addrs, a, next);
}
}
Also, see the
.Ic env
option above to control how the hostname is set on the host.
-.It Ic ia_na Op Ar iaid Op / address Op / prefix_len
+.It Ic ia_na Op Ar iaid Op / address
Request a DHCPv6 Normal Address for
.Ar iaid .
.Ar iaid
ia->iaid[1] = iaid[1];
ia->iaid[2] = iaid[2];
ia->iaid[3] = iaid[3];
- if (p == NULL) {
+ if (p == NULL || ifo->ia_type == D6_OPTION_IA_TA) {
memset(&ia->addr, 0, sizeof(ia->addr));
ia->prefix_len = 0;
} else {
syslog(LOG_ERR, "%s: %m", arg);
memset(&ia->addr, 0, sizeof(ia->addr));
}
- if (p) {
+ if (p && ifo->ia_type == D6_OPTION_IA_PD) {
i = atoint(p);
if (i != -1 && (i < 8 || i > 120)) {
errno = EINVAL;