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 Import dhcpcd-8.1.2 with the fo...



details:   https://anonhg.NetBSD.org/src/rev/d14f6761c03a
branches:  trunk
changeset: 846362:d14f6761c03a
user:      roy <roy%NetBSD.org@localhost>
date:      Wed Nov 13 10:49:19 2019 +0000

description:
Import dhcpcd-8.1.2 with the following changes:
 * hooks: STOPPED is now run on timeout and exit
 * BSD: Use IP_REVCIF rather than IN_PKTINFO
 * DHCP: When rebinding, ensure we have a DHCP ARP state
 * RA: Sort routers when reachability changes
 * RA: Apply hoplimit, reachable and retrans timer values to kernel
 * RA: Warn if advertised MTU > interface MTU
 * dhcpcd: Report SSID connection to when we gain carrier
 * DHCP: Fix corruption of address flags when renewing

diffstat:

 external/bsd/dhcpcd/dist/src/arp.c     |  17 +++---
 external/bsd/dhcpcd/dist/src/arp.h     |   1 +
 external/bsd/dhcpcd/dist/src/control.c |   6 +-
 external/bsd/dhcpcd/dist/src/defs.h    |   2 +-
 external/bsd/dhcpcd/dist/src/eloop.c   |  27 ++++++++-
 external/bsd/dhcpcd/dist/src/eloop.h   |   1 +
 external/bsd/dhcpcd/dist/src/if.c      |  20 +++++++-
 external/bsd/dhcpcd/dist/src/if.h      |   3 +
 external/bsd/dhcpcd/dist/src/ipv4.c    |  25 ++++-----
 external/bsd/dhcpcd/dist/src/ipv6nd.h  |   5 +
 external/bsd/dhcpcd/dist/src/script.c  |  87 +++++++++++++++++++--------------
 11 files changed, 124 insertions(+), 70 deletions(-)

diffs (truncated from 469 to 300 lines):

diff -r dd8a28d17f3f -r d14f6761c03a external/bsd/dhcpcd/dist/src/arp.c
--- a/external/bsd/dhcpcd/dist/src/arp.c        Wed Nov 13 10:13:41 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/arp.c        Wed Nov 13 10:49:19 2019 +0000
@@ -206,7 +206,6 @@
        return true;
 }
 
-
 static void
 arp_packet(struct interface *ifp, uint8_t *data, size_t len)
 {
@@ -280,9 +279,9 @@
 }
 
 static void
-arp_tryfree(struct interface *ifp)
+arp_tryfree(struct iarp_state *state)
 {
-       struct iarp_state *state = ARP_STATE(ifp);
+       struct interface *ifp = state->ifp;
 
        /* If there are no more ARP states, close the socket. */
        if (TAILQ_FIRST(&state->arp_states) == NULL) {
@@ -302,15 +301,14 @@
 static void
 arp_read(void *arg)
 {
-       struct interface *ifp = arg;
-       struct iarp_state *state;
+       struct iarp_state *state = arg;
+       struct interface *ifp = state->ifp;
        uint8_t buf[ARP_LEN];
        ssize_t bytes;
 
        /* Some RAW mechanisms are generic file descriptors, not sockets.
         * This means we have no kernel call to just get one packet,
         * so we have to process the entire buffer. */
-       state = ARP_STATE(ifp);
        state->bpf_flags &= ~BPF_EOF;
        state->bpf_flags |= BPF_READING;
        while (!(state->bpf_flags & BPF_EOF)) {
@@ -329,7 +327,7 @@
        if (state != NULL) {
                state->bpf_flags &= ~BPF_READING;
                /* Try and free the state if nothing left to do. */
-               arp_tryfree(ifp);
+               arp_tryfree(state);
        }
 }
 
@@ -343,7 +341,7 @@
                state->bpf_fd = bpf_open(ifp, bpf_arp);
                if (state->bpf_fd == -1)
                        return -1;
-               eloop_event_add(ifp->ctx->eloop, state->bpf_fd, arp_read, ifp);
+               eloop_event_add(ifp->ctx->eloop, state->bpf_fd, arp_read, state);
        }
        return state->bpf_fd;
 }
@@ -571,6 +569,7 @@
                        logerr(__func__);
                        return NULL;
                }
+               state->ifp = ifp;
                state->bpf_fd = -1;
                state->bpf_flags = 0;
                TAILQ_INIT(&state->arp_states);
@@ -618,7 +617,7 @@
        if (astate->free_cb)
                astate->free_cb(astate);
        free(astate);
-       arp_tryfree(ifp);
+       arp_tryfree(state);
 }
 
 void
diff -r dd8a28d17f3f -r d14f6761c03a external/bsd/dhcpcd/dist/src/arp.h
--- a/external/bsd/dhcpcd/dist/src/arp.h        Wed Nov 13 10:13:41 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/arp.h        Wed Nov 13 10:49:19 2019 +0000
@@ -78,6 +78,7 @@
 TAILQ_HEAD(arp_statehead, arp_state);
 
 struct iarp_state {
+       struct interface *ifp;
        int bpf_fd;
        unsigned int bpf_flags;
        struct arp_statehead arp_states;
diff -r dd8a28d17f3f -r d14f6761c03a external/bsd/dhcpcd/dist/src/control.c
--- a/external/bsd/dhcpcd/dist/src/control.c    Wed Nov 13 10:13:41 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/control.c    Wed Nov 13 10:49:19 2019 +0000
@@ -274,9 +274,8 @@
 
        if (ctx->control_fd == -1)
                return 0;
-       eloop_event_delete(ctx->eloop, ctx->control_fd);
-       close(ctx->control_fd);
-       ctx->control_fd = -1;
+
+       control_close(ctx);
        if (unlink(ctx->control_sock) == -1)
                retval = -1;
 
@@ -455,6 +454,7 @@
 {
 
        if (ctx->control_fd != -1) {
+               eloop_event_delete(ctx->eloop, ctx->control_fd);
                close(ctx->control_fd);
                ctx->control_fd = -1;
        }
diff -r dd8a28d17f3f -r d14f6761c03a external/bsd/dhcpcd/dist/src/defs.h
--- a/external/bsd/dhcpcd/dist/src/defs.h       Wed Nov 13 10:13:41 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/defs.h       Wed Nov 13 10:49:19 2019 +0000
@@ -29,7 +29,7 @@
 #define CONFIG_H
 
 #define PACKAGE                        "dhcpcd"
-#define VERSION                        "8.1.1"
+#define VERSION                        "8.1.2"
 
 #ifndef CONFIG
 # define CONFIG                        SYSCONFDIR "/" PACKAGE ".conf"
diff -r dd8a28d17f3f -r d14f6761c03a external/bsd/dhcpcd/dist/src/eloop.c
--- a/external/bsd/dhcpcd/dist/src/eloop.c      Wed Nov 13 10:13:41 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/eloop.c      Wed Nov 13 10:49:19 2019 +0000
@@ -830,7 +830,8 @@
        return eloop;
 }
 
-void eloop_free(struct eloop *eloop)
+void
+eloop_clear(struct eloop *eloop)
 {
        struct eloop_event *e;
        struct eloop_timeout *t;
@@ -839,6 +840,12 @@
                return;
 
        free(eloop->event_fds);
+       eloop->event_fds = NULL;
+       eloop->events_len = 0;
+       eloop->events_maxfd = -1;
+       eloop->signals = NULL;
+       eloop->signals_len = 0;
+
        while ((e = TAILQ_FIRST(&eloop->events))) {
                TAILQ_REMOVE(&eloop->events, e, next);
                free(e);
@@ -855,11 +862,23 @@
                TAILQ_REMOVE(&eloop->free_timeouts, t, next);
                free(t);
        }
+
+#if defined(HAVE_POLL)
+       free(eloop->fds);
+       eloop->fds = NULL;
+       eloop->fds_len = 0;
+#endif
+}
+
+void
+eloop_free(struct eloop *eloop)
+{
+
 #if defined(HAVE_KQUEUE) || defined(HAVE_EPOLL)
-       close(eloop->poll_fd);
-#elif defined(HAVE_POLL)
-       free(eloop->fds);
+       if (eloop != NULL)
+               close(eloop->poll_fd);
 #endif
+       eloop_clear(eloop);
        free(eloop);
 }
 
diff -r dd8a28d17f3f -r d14f6761c03a external/bsd/dhcpcd/dist/src/eloop.h
--- a/external/bsd/dhcpcd/dist/src/eloop.h      Wed Nov 13 10:13:41 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/eloop.h      Wed Nov 13 10:49:19 2019 +0000
@@ -105,6 +105,7 @@
 
 struct eloop * eloop_new(void);
 int eloop_requeue(struct eloop *);
+void eloop_clear(struct eloop *);
 void eloop_free(struct eloop *);
 void eloop_exit(struct eloop *, int);
 int eloop_start(struct eloop *, sigset_t *);
diff -r dd8a28d17f3f -r d14f6761c03a external/bsd/dhcpcd/dist/src/if.c
--- a/external/bsd/dhcpcd/dist/src/if.c Wed Nov 13 10:13:41 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/if.c Wed Nov 13 10:49:19 2019 +0000
@@ -740,9 +740,13 @@
        struct cmsghdr *cm;
        unsigned int ifindex = 0;
        struct interface *ifp;
-#if defined(INET) && defined(IP_PKTINFO)
+#ifdef INET
+#ifdef IP_RECVIF
+       struct sockaddr_dl sdl;
+#else
        struct in_pktinfo ipi;
 #endif
+#endif
 #ifdef INET6
        struct in6_pktinfo ipi6;
 #else
@@ -753,15 +757,27 @@
             cm;
             cm = (struct cmsghdr *)CMSG_NXTHDR(msg, cm))
        {
-#if defined(INET) && defined(IP_PKTINFO)
+#ifdef INET
                if (cm->cmsg_level == IPPROTO_IP) {
                        switch(cm->cmsg_type) {
+#ifdef IP_RECVIF
+                       case IP_RECVIF:
+                               if (cm->cmsg_len <
+                                   offsetof(struct sockaddr_dl, sdl_index) +
+                                   sizeof(sdl.sdl_index))
+                                       continue;
+                               memcpy(&sdl, CMSG_DATA(cm),
+                                   MIN(sizeof(sdl), cm->cmsg_len));
+                               ifindex = sdl.sdl_index;
+                               break;
+#else
                        case IP_PKTINFO:
                                if (cm->cmsg_len != CMSG_LEN(sizeof(ipi)))
                                        continue;
                                memcpy(&ipi, CMSG_DATA(cm), sizeof(ipi));
                                ifindex = (unsigned int)ipi.ipi_ifindex;
                                break;
+#endif
                        }
                }
 #endif
diff -r dd8a28d17f3f -r d14f6761c03a external/bsd/dhcpcd/dist/src/if.h
--- a/external/bsd/dhcpcd/dist/src/if.h Wed Nov 13 10:13:41 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/if.h Wed Nov 13 10:49:19 2019 +0000
@@ -65,6 +65,7 @@
 #include "dhcpcd.h"
 #include "ipv4.h"
 #include "ipv6.h"
+#include "ipv6nd.h"
 #include "route.h"
 
 #define EUI64_ADDR_LEN                 8
@@ -195,6 +196,7 @@
 #endif
 
 #ifdef INET6
+void if_disable_rtadv(void);
 void if_setup_inet6(const struct interface *);
 #ifdef IPV6_MANAGETEMPADDR
 int ip6_use_tempaddr(const char *ifname);
@@ -205,6 +207,7 @@
 #endif
 int ip6_forwarding(const char *ifname);
 
+int if_applyra(const struct ra *);
 int if_address6(unsigned char, const struct ipv6_addr *);
 int if_addrflags6(const struct interface *, const struct in6_addr *,
     const char *);
diff -r dd8a28d17f3f -r d14f6761c03a external/bsd/dhcpcd/dist/src/ipv4.c
--- a/external/bsd/dhcpcd/dist/src/ipv4.c       Wed Nov 13 10:13:41 2019 +0000
+++ b/external/bsd/dhcpcd/dist/src/ipv4.c       Wed Nov 13 10:49:19 2019 +0000
@@ -654,7 +654,7 @@
 #endif
                ia->flags = IPV4_AF_NEW;
        } else
-               ia->flags |= ~IPV4_AF_NEW;
+               ia->flags &= ~IPV4_AF_NEW;
 
        ia->mask = *mask;
        ia->brd = *bcast;
@@ -687,7 +687,8 @@
                if (errno != EEXIST)
                        logerr("%s: if_addaddress",
                            __func__);
-               free(ia);
+               if (ia->flags & IPV4_AF_NEW)
+                       free(ia);
                return NULL;
        }
 
@@ -941,7 +942,7 @@
 #endif
        }
 
-       if (cmd == RTM_DELADDR && ia != NULL)
+       if (cmd == RTM_DELADDR)
                free(ia);
 }
 
@@ -951,15 +952,13 @@
        struct ipv4_state *state;
        struct ipv4_addr *ia;
 
-       if (ifp) {
-               state = IPV4_STATE(ifp);
-               if (state) {
-                       while ((ia = TAILQ_FIRST(&state->addrs))) {
-                               TAILQ_REMOVE(&state->addrs, ia, next);



Home | Main Index | Thread Index | Old Index