ifo = ifp->options;
i = 0;
state = D6_STATE(ifp);
+ if (ifo->ia_type != D6_OPTION_IA_PD) {
+ TAILQ_FOREACH(ap, &state->addrs, next) {
+ ap->flags |= IPV6_AF_STALE;
+ }
+ }
while ((o = dhcp6_findoption(ifo->ia_type, d, l))) {
l -= ((const uint8_t *)o - d);
d += ((const uint8_t *)o - d);
return -1;
}
} else {
- TAILQ_FOREACH(ap, &state->addrs, next) {
- ap->flags |= IPV6_AF_STALE;
- }
if (dhcp6_findna(ifp, iaid, p, ol) == 0) {
syslog(LOG_ERR,
"%s: %s: DHCPv6 REPLY missing IA Address",
ifp->name, sfrom);
return -1;
}
- TAILQ_FOREACH_SAFE(ap, &state->addrs, next, nap) {
- if (ap->flags & IPV6_AF_STALE) {
- TAILQ_REMOVE(&state->addrs, ap, next);
- if (ap->dadcallback)
- eloop_q_timeout_delete(0, NULL,
- ap->dadcallback);
- free(ap);
- }
- }
}
i++;
}
+ if (ifo->ia_type != D6_OPTION_IA_PD) {
+ TAILQ_FOREACH_SAFE(ap, &state->addrs, next, nap) {
+ if (ap->flags & IPV6_AF_STALE) {
+ TAILQ_REMOVE(&state->addrs, ap, next);
+ if (ap->dadcallback)
+ eloop_q_timeout_delete(0, NULL,
+ ap->dadcallback);
+ free(ap);
+ }
+ }
+ }
return i;
}
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd August 31, 2013
+.Dd September 7, 2013
.Dt DHCPCD.CONF 5 SMM
.Os
.Sh NAME
is used.
If the interface name is 4 characters or less then that is used,
otherwise the interface index is used.
+You can request more than one ia_na by specifying a unique iaid for each one.
.It Ic ia_ta Op Ar iaid
Request a DHCPv6 Temporary Address for
.Ar iaid .
+You can request more than one ia_ta by specifying a unique iaid for each one.
.It Ic ia_pd Op Ar iaid Op Ar interface Op / Ar sla_id Op / Ar prefix_len
Request a DHCPv6 Delegated Prefix for
.Ar iaid .
struct rahead ipv6_routers = TAILQ_HEAD_INITIALIZER(ipv6_routers);
+static void ipv6nd_handledata(void *arg);
+
#if DEBUG_MEMORY
static void
ipv6nd_cleanup(void)
goto eexit;
#endif
+ if (sock == -1) {
+ if (ipv6nd_open() == -1)
+ goto eexit;
+ eloop_event_add(sock, ipv6nd_handledata, NULL);
+ }
+
ICMP6_FILTER_SETPASS(ND_NEIGHBOR_ADVERT, &filt);
if (setsockopt(sock, IPPROTO_ICMPV6, ICMP6_FILTER,
&filt, sizeof(filt)) == -1)
return sock;
eexit:
+ syslog(LOG_ERR, "%s: %m", __func__);
#ifdef IPV6_SEND_DAD
close(unspec_sock);
unspec_sock = -1;
return;
}
}
-
+
syslog(LOG_ERR, "invalid IPv6 type %d or code %d from %s",
icp->icmp6_type, icp->icmp6_code, sfrom);
}
ipv6nd_sendrsprobe(ifp);
return 0;
}
-
-