Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/external/bsd/dhcpcd/dist/src Sync
details: https://anonhg.NetBSD.org/src/rev/741e1b99c648
branches: trunk
changeset: 450810:741e1b99c648
user: roy <roy%NetBSD.org@localhost>
date: Fri Apr 26 14:34:10 2019 +0000
description:
Sync
diffstat:
external/bsd/dhcpcd/dist/src/dhcp.c | 14 +-
external/bsd/dhcpcd/dist/src/dhcp6.c | 6 +-
external/bsd/dhcpcd/dist/src/if-bsd.c | 8 +-
external/bsd/dhcpcd/dist/src/ipv6nd.c | 181 +++++++++++++++++++++++++--------
4 files changed, 154 insertions(+), 55 deletions(-)
diffs (truncated from 443 to 300 lines):
diff -r 4593ae0fdc44 -r 741e1b99c648 external/bsd/dhcpcd/dist/src/dhcp.c
--- a/external/bsd/dhcpcd/dist/src/dhcp.c Fri Apr 26 14:32:27 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/dhcp.c Fri Apr 26 14:34:10 2019 +0000
@@ -215,6 +215,12 @@
}
l = *p++;
+ /* Check we can read the option data, if present */
+ if (p + l > e) {
+ errno = EINVAL;
+ return NULL;
+ }
+
if (o == DHO_OPTSOVERLOADED) {
/* Ensure we only get this option once by setting
* the last bit as well as the value.
@@ -249,10 +255,6 @@
bp += ol;
}
ol = l;
- if (p + ol >= e) {
- errno = EINVAL;
- return NULL;
- }
op = p;
bl += ol;
}
@@ -2075,7 +2077,7 @@
ifp->name, inet_ntoa(astate->addr));
if (!(ifo->options & DHCPCD_INFORM))
dhcp_bind(ifp);
-#ifndef IN_IFF_TENTATIVE
+#ifndef IN_IFF_DUPLICATED
else {
struct bootp *bootp;
size_t len;
@@ -2429,7 +2431,7 @@
if (astate == NULL)
return -1;
-#ifdef IN_IFF_TENTATIVE
+#ifdef IN_IFF_NOTUSEABLE
if (ia == NULL || ia->addr_flags & IN_IFF_NOTUSEABLE) {
state->state = DHS_PROBE;
if (ia == NULL) {
diff -r 4593ae0fdc44 -r 741e1b99c648 external/bsd/dhcpcd/dist/src/dhcp6.c
--- a/external/bsd/dhcpcd/dist/src/dhcp6.c Fri Apr 26 14:32:27 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/dhcp6.c Fri Apr 26 14:34:10 2019 +0000
@@ -2029,12 +2029,12 @@
nd = o + ol;
l -= (size_t)(nd - d);
d = nd;
- if (ol < 24) {
+ if (ol < sizeof(ia)) {
errno = EINVAL;
logerrx("%s: IA Address option truncated", ifp->name);
continue;
}
- memcpy(&ia, o, ol);
+ memcpy(&ia, o, sizeof(ia));
ia.pltime = ntohl(ia.pltime);
ia.vltime = ntohl(ia.vltime);
/* RFC 3315 22.6 */
@@ -3035,7 +3035,7 @@
* unless those values in those fields are 0.
*/
logwarnx("%s: ignoring T1 %"PRIu32
- " to due address expiry",
+ " due to address expiry",
ifp->name, state->renew);
state->renew = state->rebind = 0;
}
diff -r 4593ae0fdc44 -r 741e1b99c648 external/bsd/dhcpcd/dist/src/if-bsd.c
--- a/external/bsd/dhcpcd/dist/src/if-bsd.c Fri Apr 26 14:32:27 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/if-bsd.c Fri Apr 26 14:34:10 2019 +0000
@@ -943,10 +943,15 @@
priv = (struct priv *)ia->iface->ctx->priv;
if (ioctl(priv->pf_inet6_fd, SIOCGIFALIFETIME_IN6, &ifr6) == -1)
return -1;
+ clock_gettime(CLOCK_MONOTONIC, &ia->created);
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+ t = ia->created.tv_sec;
+#else
t = time(NULL);
+#endif
+
lifetime = &ifr6.ifr_ifru.ifru_lifetime;
-
if (lifetime->ia6t_preferred)
ia->prefix_pltime = (uint32_t)(lifetime->ia6t_preferred -
MIN(t, lifetime->ia6t_preferred));
@@ -956,7 +961,6 @@
ia->prefix_vltime = (uint32_t)(lifetime->ia6t_expire -
MIN(t, lifetime->ia6t_expire));
/* Calculate the created time */
- clock_gettime(CLOCK_MONOTONIC, &ia->created);
ia->created.tv_sec -= lifetime->ia6t_vltime - ia->prefix_vltime;
} else
ia->prefix_vltime = ND6_INFINITE_LIFETIME;
diff -r 4593ae0fdc44 -r 741e1b99c648 external/bsd/dhcpcd/dist/src/ipv6nd.c
--- a/external/bsd/dhcpcd/dist/src/ipv6nd.c Fri Apr 26 14:32:27 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/ipv6nd.c Fri Apr 26 14:34:10 2019 +0000
@@ -190,54 +190,106 @@
}
static int
-ipv6nd_open(struct dhcpcd_ctx *ctx)
+ipv6nd_open0(void)
{
- int on;
+ int s, on;
struct icmp6_filter filt;
- if (ctx->nd_fd != -1)
- return ctx->nd_fd;
#define SOCK_FLAGS SOCK_CLOEXEC | SOCK_NONBLOCK
- ctx->nd_fd = xsocket(PF_INET6, SOCK_RAW | SOCK_FLAGS, IPPROTO_ICMPV6);
+ s = xsocket(PF_INET6, SOCK_RAW | SOCK_FLAGS, IPPROTO_ICMPV6);
#undef SOCK_FLAGS
- if (ctx->nd_fd == -1)
+ if (s == -1)
return -1;
/* RFC4861 4.1 */
on = 255;
- if (setsockopt(ctx->nd_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
&on, sizeof(on)) == -1)
goto eexit;
on = 1;
- if (setsockopt(ctx->nd_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO,
- &on, sizeof(on)) == -1)
- goto eexit;
-
- on = 1;
- if (setsockopt(ctx->nd_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT,
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPLIMIT,
&on, sizeof(on)) == -1)
goto eexit;
ICMP6_FILTER_SETBLOCKALL(&filt);
ICMP6_FILTER_SETPASS(ND_NEIGHBOR_ADVERT, &filt);
ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filt);
- if (setsockopt(ctx->nd_fd, IPPROTO_ICMPV6, ICMP6_FILTER,
+ if (setsockopt(s, IPPROTO_ICMPV6, ICMP6_FILTER,
&filt, sizeof(filt)) == -1)
goto eexit;
- eloop_event_add(ctx->eloop, ctx->nd_fd, ipv6nd_handledata, ctx);
- return ctx->nd_fd;
+ return s;
eexit:
- if (ctx->nd_fd != -1) {
- eloop_event_delete(ctx->eloop, ctx->nd_fd);
- close(ctx->nd_fd);
- ctx->nd_fd = -1;
- }
+ close(s);
return -1;
}
+#ifdef __sun
+static int
+ipv6nd_open(struct interface *ifp)
+{
+ int s;
+ struct ipv6_mreq mreq = {
+ .ipv6mr_multiaddr = IN6ADDR_LINKLOCAL_ALLNODES_INIT,
+ .ipv6mr_interface = ifp->index
+ };
+ struct rs_state *state = RS_STATE(ifp);
+ uint_t ifindex = ifp->index;
+
+ if (state->nd_fd != -1)
+ return state->nd_fd;
+
+ s = ipv6nd_open0();
+ if (s == -1)
+ return -1;
+
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_BOUND_IF,
+ &ifindex, sizeof(ifindex)) == -1)
+ {
+ close(s);
+ return -1;
+ }
+
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_JOIN_GROUP,
+ &mreq, sizeof(mreq)) == -1)
+ {
+ close(s);
+ return -1;
+ }
+
+ state->nd_fd = s;
+ eloop_event_add(ifp->ctx->eloop, s, ipv6nd_handledata, ifp);
+ return s;
+}
+#else
+static int
+ipv6nd_open(struct dhcpcd_ctx *ctx)
+{
+ int s, on;
+
+ if (ctx->nd_fd != -1)
+ return ctx->nd_fd;
+
+ s = ipv6nd_open0();
+ if (s == -1)
+ return -1;
+
+ on = 1;
+ if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO,
+ &on, sizeof(on)) == -1)
+ {
+ close(s);
+ return -1;
+ }
+
+ ctx->nd_fd = s;
+ eloop_event_add(ctx->eloop, s, ipv6nd_handledata, ctx);
+ return s;
+}
+#endif
+
static int
ipv6nd_makersprobe(struct interface *ifp)
{
@@ -273,9 +325,12 @@
ipv6nd_sendrsprobe(void *arg)
{
struct interface *ifp = arg;
- struct dhcpcd_ctx *ctx;
struct rs_state *state = RS_STATE(ifp);
- struct sockaddr_in6 dst = { .sin6_family = AF_INET6 };
+ struct sockaddr_in6 dst = {
+ .sin6_family = AF_INET6,
+ .sin6_addr = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT,
+ .sin6_scope_id = ifp->index,
+ };
struct iovec iov = { .iov_base = state->rs, .iov_len = state->rslen };
unsigned char ctl[CMSG_SPACE(sizeof(struct in6_pktinfo))] = { 0 };
struct msghdr msg = {
@@ -285,6 +340,7 @@
};
struct cmsghdr *cm;
struct in6_pktinfo pi = { .ipi6_ifindex = ifp->index };
+ int s;
if (ipv6_linklocal(ifp) == NULL) {
logdebugx("%s: delaying Router Solicitation for LL address",
@@ -296,13 +352,6 @@
#ifdef HAVE_SA_LEN
dst.sin6_len = sizeof(dst);
#endif
- dst.sin6_scope_id = ifp->index;
- if (inet_pton(AF_INET6, ALLROUTERS, &dst.sin6_addr) != 1) {
- logerr(__func__);
- return;
- }
-
- ctx = ifp->ctx;
/* Set the outbound interface */
cm = CMSG_FIRSTHDR(&msg);
@@ -314,7 +363,12 @@
memcpy(CMSG_DATA(cm), &pi, sizeof(pi));
logdebugx("%s: sending Router Solicitation", ifp->name);
- if (sendmsg(ctx->nd_fd, &msg, 0) == -1) {
+#ifdef __sun
+ s = state->nd_fd;
+#else
+ s = ifp->ctx->nd_fd;
+#endif
+ if (sendmsg(s, &msg, 0) == -1) {
logerr(__func__);
/* Allow IPv6ND to continue .... at most a few errors
* would be logged.
@@ -342,6 +396,7 @@
struct dhcpcd_ctx *ctx = ifp->ctx;
struct sockaddr_in6 dst = {
.sin6_family = AF_INET6,
+ .sin6_addr = IN6ADDR_LINKLOCAL_ALLNODES_INIT,
.sin6_scope_id = ifp->index,
};
struct iovec iov = { .iov_base = ia->na, .iov_len = ia->na_len };
@@ -354,6 +409,7 @@
struct cmsghdr *cm;
struct in6_pktinfo pi = { .ipi6_ifindex = ifp->index };
const struct rs_state *state = RS_CSTATE(ifp);
+ int s;
if (state == NULL || ifp->carrier <= LINK_DOWN)
goto freeit;
@@ -361,10 +417,6 @@
#ifdef SIN6_LEN
Home |
Main Index |
Thread Index |
Old Index