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 Import dhcpcd-6.2.0 with the follow...



details:   https://anonhg.NetBSD.org/src/rev/655fec849b2a
branches:  trunk
changeset: 325709:655fec849b2a
user:      roy <roy%NetBSD.org@localhost>
date:      Fri Jan 03 22:10:42 2014 +0000

description:
Import dhcpcd-6.2.0 with the following changes:

* Fix NAK backoff when a server NAKs a REQUEST after a DISCOVER.
* Fix IPv6 ICMP filtering on Android (RS/RA now works)
* Fix sending of DHCPv6 FQDN when only hostname specified
* Add support for RFC3925 Vendor-Identifying Vendor Options
* Remove hard coded DHCP/DHCPv6 options and embed dhcpcd-definitions.conf.
  This actually results in a slightly smaller binary than before and has the added advantage that the option definitions are now all held within one file.
* Change IAID to default from the last 4 bytes of the MAC address.
  Rationale in the commit, but in a nutshell it allows for a stable IAID between reboots without persistent storage and across different OS's who name or number it differently to each other.
* RFC4242, Information Refresh Time Option for DHCPv6.
* Fix processing of inet4 addr in vendor options and terminate correctly.
* Preserve vendor encapsulated options.
* Fix renewal of Prefix Delegation. Only spam the log if a lease has a new address or changes the vltime of an existing address.
* Add noipv4 and noipv6 options.
* Warn about missing interfaces which require prefix delegation.
* If we timeout, remove any waitip config so that we daemonise correctly.
* Remove the IPv6 forwarding router check as valid use cases exist where you would want IPv6 RS/RA on a router.
* Pass the correct run directory to dhcpcd-run-hooks

diffstat:

 external/bsd/dhcpcd/dist/arp.c                          |   13 +-
 external/bsd/dhcpcd/dist/bpf.c                          |   10 +-
 external/bsd/dhcpcd/dist/defs.h                         |    8 +-
 external/bsd/dhcpcd/dist/dhcp-common.c                  |  278 ++++++-
 external/bsd/dhcpcd/dist/dhcp-common.h                  |   60 +-
 external/bsd/dhcpcd/dist/dhcp.h                         |   10 +-
 external/bsd/dhcpcd/dist/dhcp6.c                        |  639 +++++++++------
 external/bsd/dhcpcd/dist/dhcp6.h                        |   13 +-
 external/bsd/dhcpcd/dist/dhcpcd-definitions.conf        |  255 ++++++
 external/bsd/dhcpcd/dist/dhcpcd-embedded.c              |  210 +++++
 external/bsd/dhcpcd/dist/dhcpcd-embedded.h              |   33 +
 external/bsd/dhcpcd/dist/dhcpcd-embedded.h.in           |   31 +
 external/bsd/dhcpcd/dist/dhcpcd-hooks/10-wpa_supplicant |   13 +-
 external/bsd/dhcpcd/dist/dhcpcd-run-hooks.in            |    4 +-
 external/bsd/dhcpcd/dist/dhcpcd.c                       |  241 +++++-
 external/bsd/dhcpcd/dist/dhcpcd.h                       |    4 +-
 external/bsd/dhcpcd/dist/duid.c                         |   59 +-
 external/bsd/dhcpcd/dist/duid.h                         |    9 +-
 external/bsd/dhcpcd/dist/if-options.h                   |   30 +-
 external/bsd/dhcpcd/dist/ipv4.c                         |   12 +-
 external/bsd/dhcpcd/dist/ipv4.h                         |    6 +-
 external/bsd/dhcpcd/dist/ipv6.h                         |    7 +-
 external/bsd/dhcpcd/dist/platform-bsd.c                 |   20 +-
 23 files changed, 1519 insertions(+), 446 deletions(-)

diffs (truncated from 3166 to 300 lines):

diff -r c21873749e11 -r 655fec849b2a external/bsd/dhcpcd/dist/arp.c
--- a/external/bsd/dhcpcd/dist/arp.c    Fri Jan 03 21:34:40 2014 +0000
+++ b/external/bsd/dhcpcd/dist/arp.c    Fri Jan 03 22:10:42 2014 +0000
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: arp.c,v 1.1.1.9 2013/06/21 19:33:07 roy Exp $");
+ __RCSID("$NetBSD: arp.c,v 1.1.1.10 2014/01/03 22:10:43 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -223,7 +223,11 @@
        if (state->new == NULL)
                return;
        if (state->arp_fd == -1) {
-               ipv4_opensocket(ifp, ETHERTYPE_ARP);
+               state->arp_fd = ipv4_opensocket(ifp, ETHERTYPE_ARP);
+               if (state->arp_fd == -1) {
+                       syslog(LOG_ERR, "%s: %s: %m", __func__, ifp->name);
+                       return;
+               }
                eloop_event_add(state->arp_fd, arp_packet, ifp);
        }
        if (++state->claims < ANNOUNCE_NUM)
@@ -270,8 +274,11 @@
        int arping = 0;
 
        if (state->arp_fd == -1) {
-               if (ipv4_opensocket(ifp, ETHERTYPE_ARP) == -1)
+               state->arp_fd = ipv4_opensocket(ifp, ETHERTYPE_ARP);
+               if (state->arp_fd == -1) {
+                       syslog(LOG_ERR, "%s: %s: %m", __func__, ifp->name);
                        return;
+               }
                eloop_event_add(state->arp_fd, arp_packet, ifp);
        }
 
diff -r c21873749e11 -r 655fec849b2a external/bsd/dhcpcd/dist/bpf.c
--- a/external/bsd/dhcpcd/dist/bpf.c    Fri Jan 03 21:34:40 2014 +0000
+++ b/external/bsd/dhcpcd/dist/bpf.c    Fri Jan 03 22:10:42 2014 +0000
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: bpf.c,v 1.1.1.5 2013/06/21 19:33:07 roy Exp $");
+ __RCSID("$NetBSD: bpf.c,v 1.1.1.6 2014/01/03 22:10:42 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -56,7 +56,6 @@
 {
        struct dhcp_state *state;
        int fd = -1;
-       int *fdp = NULL;
        struct ifreq ifr;
        int buf_len = 0;
        struct bpf_version pv;
@@ -120,21 +119,14 @@
        if (protocol == ETHERTYPE_ARP) {
                pf.bf_insns = UNCONST(arp_bpf_filter);
                pf.bf_len = arp_bpf_filter_len;
-               fdp = &state->arp_fd;
        } else {
                pf.bf_insns = UNCONST(dhcp_bpf_filter);
                pf.bf_len = dhcp_bpf_filter_len;
-               fdp = &state->raw_fd;
        }
        if (ioctl(fd, BIOCSETF, &pf) == -1)
                goto eexit;
        if (set_cloexec(fd) == -1)
                goto eexit;
-       if (fdp) {
-               if (*fdp != -1)
-                       close(*fdp);
-               *fdp = fd;
-       }
        return fd;
 
 eexit:
diff -r c21873749e11 -r 655fec849b2a external/bsd/dhcpcd/dist/defs.h
--- a/external/bsd/dhcpcd/dist/defs.h   Fri Jan 03 21:34:40 2014 +0000
+++ b/external/bsd/dhcpcd/dist/defs.h   Fri Jan 03 22:10:42 2014 +0000
@@ -1,8 +1,8 @@
-/* $NetBSD: defs.h,v 1.1.1.32 2013/09/20 10:51:30 roy Exp $ */
+/* $NetBSD: defs.h,v 1.1.1.33 2014/01/03 22:10:44 roy Exp $ */
 
 /*
  * dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2013 Roy Marples <roy%marples.name@localhost>
+ * Copyright (c) 2006-2014 Roy Marples <roy%marples.name@localhost>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -30,17 +30,17 @@
 #define CONFIG_H
 
 #define PACKAGE                        "dhcpcd"
-#define VERSION                        "6.1.0"
+#define VERSION                        "6.2.0"
 
 #ifndef CONFIG
 # define CONFIG                        SYSCONFDIR "/" PACKAGE ".conf"
 #endif
 #ifndef SCRIPT
 # define SCRIPT                        LIBEXECDIR "/" PACKAGE "-run-hooks"
+#endif
 #ifndef DEVDIR
 # define DEVDIR                        LIBDIR "/" PACKAGE "/dev"
 #endif
-#endif
 #ifndef DUID
 # define DUID                  SYSCONFDIR "/" PACKAGE ".duid"
 #endif
diff -r c21873749e11 -r 655fec849b2a external/bsd/dhcpcd/dist/dhcp-common.c
--- a/external/bsd/dhcpcd/dist/dhcp-common.c    Fri Jan 03 21:34:40 2014 +0000
+++ b/external/bsd/dhcpcd/dist/dhcp-common.c    Fri Jan 03 22:10:42 2014 +0000
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: dhcp-common.c,v 1.1.1.1 2013/06/21 19:33:07 roy Exp $");
+ __RCSID("$NetBSD: dhcp-common.c,v 1.1.1.2 2014/01/03 22:10:42 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -41,12 +41,40 @@
 #include "dhcp-common.h"
 #include "dhcp.h"
 
-int make_option_mask(const struct dhcp_opt *dopts,
+/* DHCP Enterprise options, RFC3925 */
+struct dhcp_opt *vivso = NULL;
+size_t vivso_len = 0;
+
+struct dhcp_opt *
+vivso_find(uint16_t iana_en, const void *arg)
+{
+       const struct interface *ifp = arg;
+       size_t i;
+       struct dhcp_opt *opt;
+
+       if (arg) {
+               ifp = arg;
+               for (i = 0, opt = ifp->options->vivso_override;
+                   i < ifp->options->vivso_override_len;
+                   i++, opt++)
+                       if (opt->option == iana_en)
+                               return opt;
+       }
+       for (i = 0, opt = vivso; i < vivso_len; i++, opt++)
+               if (opt->option == iana_en)
+                       return opt;
+       return NULL;
+}
+
+int
+make_option_mask(const struct dhcp_opt *dopts, size_t dopts_len,
     uint8_t *mask, const char *opts, int add)
 {
        char *token, *o, *p, *t;
        const struct dhcp_opt *opt;
-       int match, n;
+       int match;
+       unsigned int n;
+       size_t i;
 
        o = p = strdup(opts);
        if (opts == NULL)
@@ -54,9 +82,7 @@
        while ((token = strsep(&p, ", "))) {
                if (*token == '\0')
                        continue;
-               for (opt = dopts; opt->option; opt++) {
-                       if (!opt->var)
-                               continue;
+               for (i = 0, opt = dopts; i < dopts_len; i++, opt++) {
                        match = 0;
                        if (strcmp(opt->var, token) == 0)
                                match = 1;
@@ -162,9 +188,9 @@
        while (q - p < pl) {
                r = NULL;
                hops = 0;
-               /* We check we are inside our length again incase
-                * the data is NOT terminated correctly. */
-               while ((l = *q++) && q - p < pl) {
+               /* Check we are inside our length again in-case
+                * the name isn't fully qualified (ie, not terminated) */
+               while (q - p < pl && (l = *q++)) {
                        ltype = l & 0xc0;
                        if (ltype == 0x80 || ltype == 0x40)
                                return 0;
@@ -281,6 +307,54 @@
        return bytes;
 }
 
+#define ADDRSZ         4
+#define ADDR6SZ                16
+static size_t
+dhcp_optlen(const struct dhcp_opt *opt, size_t dl)
+{
+       size_t sz;
+
+       if (dl == 0)
+               return 0;
+
+       if (opt->type == 0 ||
+           opt->type & (STRING | BINHEX | RFC3442 | RFC5969))
+       {
+               if (opt->len) {
+                       if ((size_t)opt->len > dl)
+                               return 0;
+                       return opt->len;
+               }
+               return dl;
+       }
+
+       if ((opt->type & (ADDRIPV4 | ARRAY)) == (ADDRIPV4 | ARRAY)) {
+               if (dl < ADDRSZ)
+                       return 0;
+               return dl - (dl % ADDRSZ);
+       }
+
+       if ((opt->type & (ADDRIPV6 | ARRAY)) == (ADDRIPV6 | ARRAY)) {
+               if (dl < ADDR6SZ)
+                       return 0;
+               return dl - (dl % ADDR6SZ);
+       }
+
+       sz = 0;
+       if (opt->type & (UINT32 | ADDRIPV4))
+               sz = sizeof(uint32_t);
+       else if (opt->type & UINT16)
+               sz = sizeof(uint16_t);
+       else if (opt->type & UINT8)
+               sz = sizeof(uint8_t);
+       else if (opt->type & ADDRIPV6)
+               sz = ADDR6SZ;
+       else
+               /* If we don't know the size, assume it's valid */
+               return dl;
+       return (dl < sz ? 0 : sz);
+}
+
 ssize_t
 print_option(char *s, ssize_t len, int type, int dl, const uint8_t *data,
     const char *ifname)
@@ -340,22 +414,6 @@
                return 2;
        }
 
-       /* DHCPv6 status code */
-       if (type & SCODE && dl >= (int)sizeof(u16)) {
-               if (s) {
-                       memcpy(&u16, data, sizeof(u16));
-                       u16 = ntohs(u16);
-                       l = snprintf(s, len, "%d ", u16);
-                       len -= l;
-               } else
-                       l = 7;
-               data += sizeof(u16);
-               dl -= sizeof(u16);
-               if (dl)
-                       l += print_option(s, len, STRING, dl, data, ifname);
-               return l;
-       }
-
        if (!s) {
                if (type & UINT8)
                        l = 3;
@@ -408,12 +466,12 @@
                        len--;
                }
                if (type & UINT8) {
-                       l = snprintf(s, len, "%d", *data);
+                       l = snprintf(s, len, "%u", *data);
                        data++;
                } else if (type & UINT16) {
                        memcpy(&u16, data, sizeof(u16));
                        u16 = ntohs(u16);
-                       l = snprintf(s, len, "%d", u16);
+                       l = snprintf(s, len, "%u", u16);
                        data += sizeof(u16);
                } else if (type & SINT16) {
                        memcpy(&s16, data, sizeof(s16));
@@ -423,7 +481,7 @@
                } else if (type & UINT32) {
                        memcpy(&u32, data, sizeof(u32));
                        u32 = ntohl(u32);
-                       l = snprintf(s, len, "%d", u32);
+                       l = snprintf(s, len, "%u", u32);
                        data += sizeof(u32);
                } else if (type & SINT32) {
                        memcpy(&s32, data, sizeof(s32));
@@ -457,3 +515,167 @@
 
        return bytes;
 }
+
+static size_t
+dhcp_envoption1(char **env, const char *prefix,
+    const struct dhcp_opt *opt, int vname, const uint8_t *od, int ol,
+    const char *ifname)
+{
+       ssize_t len;



Home | Main Index | Thread Index | Old Index