Module Name: src
Committed By: martin
Date: Sat Oct 12 14:44:33 UTC 2019
Modified Files:
src/doc [netbsd-9]: 3RDPARTY
src/external/bsd/dhcpcd/dist/src [netbsd-9]: arp.c bpf.c bpf.h common.c
common.h control.h defs.h dhcp-common.c dhcp-common.h dhcp.c dhcp.h
dhcp6.c dhcpcd.8.in dhcpcd.c dhcpcd.conf.5.in if-bsd.c if-options.c
if.c if.h ipv4.c ipv4.h ipv4ll.c ipv4ll.h ipv6.c ipv6.h ipv6nd.c
route.c
src/external/bsd/dhcpcd/sbin/dhcpcd [netbsd-9]: Makefile
Added Files:
src/external/bsd/dhcpcd [netbsd-9]: NetBSD-upgrade
src/external/bsd/dhcpcd/dist/src [netbsd-9]: dhcpcd-embedded.c
dhcpcd-embedded.h
Removed Files:
src/external/bsd/dhcpcd/dist [netbsd-9]: .gitignore BUILDING.md
Makefile Makefile.inc config-null.mk configure iconfig.mk
src/external/bsd/dhcpcd/dist/compat [netbsd-9]: _strtoi.h arc4random.c
arc4random.h arc4random_uniform.c arc4random_uniform.h bitops.h
consttime_memequal.h dprintf.c dprintf.h endian.h pidfile.c
pidfile.h queue.h rb.c rbtree.h reallocarray.c reallocarray.h
strlcpy.c strlcpy.h strtoi.c strtoi.h strtou.c
src/external/bsd/dhcpcd/dist/compat/crypt [netbsd-9]: hmac.c hmac.h
md5.c md5.h sha256.c sha256.h
src/external/bsd/dhcpcd/dist/hooks [netbsd-9]: 50-dhcpcd-compat
50-yp.conf Makefile
src/external/bsd/dhcpcd/dist/src [netbsd-9]: GNUmakefile Makefile dev.c
dhcpcd-definitions-small.conf dhcpcd-definitions.conf
dhcpcd-embedded.c.in dhcpcd-embedded.h.in genembedc genembedh
if-linux-wext.c if-linux.c if-sun.c
src/external/bsd/dhcpcd/dist/src/dev [netbsd-9]: Makefile udev.c
src/external/bsd/dhcpcd/dist/tests [netbsd-9]: Makefile
src/external/bsd/dhcpcd/dist/tests/crypt [netbsd-9]: .gitignore
GNUmakefile Makefile README.md run-test.c test.h test_hmac_md5.c
src/external/bsd/dhcpcd/dist/tests/eloop-bench [netbsd-9]: .gitignore
Makefile README.md eloop-bench.c
Log Message:
Pull up the following revisions, requested by roy in ticket #302:
external/bsd/dhcpcd/dist/src/dhcpcd-embedded.c up to 1.1.1.2
external/bsd/dhcpcd/dist/src/dhcpcd-embedded.h up to 1.1.1.2
external/bsd/dhcpcd/NetBSD-upgrade up to 1.2
external/bsd/dhcpcd/dist/compat/crypt/sha256.c delete
external/bsd/dhcpcd/dist/compat/crypt/hmac.c delete
external/bsd/dhcpcd/dist/compat/crypt/hmac.h delete
external/bsd/dhcpcd/dist/compat/crypt/md5.c delete
external/bsd/dhcpcd/dist/compat/crypt/md5.h delete
external/bsd/dhcpcd/dist/compat/crypt/sha256.h delete
external/bsd/dhcpcd/dist/compat/_strtoi.h delete
external/bsd/dhcpcd/dist/compat/arc4random.c delete
external/bsd/dhcpcd/dist/compat/arc4random.h delete
external/bsd/dhcpcd/dist/compat/arc4random_uniform.c delete
external/bsd/dhcpcd/dist/compat/arc4random_uniform.h delete
external/bsd/dhcpcd/dist/compat/bitops.h delete
external/bsd/dhcpcd/dist/compat/consttime_memequal.h delete
external/bsd/dhcpcd/dist/compat/dprintf.c delete
external/bsd/dhcpcd/dist/compat/dprintf.h delete
external/bsd/dhcpcd/dist/compat/endian.h delete
external/bsd/dhcpcd/dist/compat/pidfile.c delete
external/bsd/dhcpcd/dist/compat/pidfile.h delete
external/bsd/dhcpcd/dist/compat/queue.h delete
external/bsd/dhcpcd/dist/compat/rb.c delete
external/bsd/dhcpcd/dist/compat/rbtree.h delete
external/bsd/dhcpcd/dist/compat/reallocarray.c delete
external/bsd/dhcpcd/dist/compat/reallocarray.h delete
external/bsd/dhcpcd/dist/compat/strlcpy.c delete
external/bsd/dhcpcd/dist/compat/strlcpy.h delete
external/bsd/dhcpcd/dist/compat/strtoi.c delete
external/bsd/dhcpcd/dist/compat/strtoi.h delete
external/bsd/dhcpcd/dist/compat/strtou.c delete
external/bsd/dhcpcd/dist/.gitignore delete
external/bsd/dhcpcd/dist/BUILDING.md delete
external/bsd/dhcpcd/dist/Makefile delete
external/bsd/dhcpcd/dist/Makefile.inc delete
external/bsd/dhcpcd/dist/config-null.mk delete
external/bsd/dhcpcd/dist/configure delete
external/bsd/dhcpcd/dist/iconfig.mk delete
external/bsd/dhcpcd/dist/hooks/Makefile delete
external/bsd/dhcpcd/dist/hooks/50-dhcpcd-compat delete
external/bsd/dhcpcd/dist/hooks/50-yp.conf delete
external/bsd/dhcpcd/dist/src/Makefile delete
external/bsd/dhcpcd/dist/src/GNUmakefile delete
external/bsd/dhcpcd/dist/src/dev.c delete
external/bsd/dhcpcd/dist/src/dhcpcd-definitions-small.conf delete
external/bsd/dhcpcd/dist/src/dhcpcd-definitions.conf delete
external/bsd/dhcpcd/dist/src/dhcpcd-embedded.c.in delete
external/bsd/dhcpcd/dist/src/dhcpcd-embedded.h.in delete
external/bsd/dhcpcd/dist/src/genembedc delete
external/bsd/dhcpcd/dist/src/genembedh delete
external/bsd/dhcpcd/dist/src/if-linux-wext.c delete
external/bsd/dhcpcd/dist/src/if-linux.c delete
external/bsd/dhcpcd/dist/src/if-sun.c delete
external/bsd/dhcpcd/dist/src/dev/Makefile delete
external/bsd/dhcpcd/dist/src/dev/udev.c delete
external/bsd/dhcpcd/dist/tests/crypt/.gitignore delete
external/bsd/dhcpcd/dist/tests/crypt/GNUmakefile delete
external/bsd/dhcpcd/dist/tests/crypt/Makefile delete
external/bsd/dhcpcd/dist/tests/crypt/README.md delete
external/bsd/dhcpcd/dist/tests/crypt/run-test.c delete
external/bsd/dhcpcd/dist/tests/crypt/test.h delete
external/bsd/dhcpcd/dist/tests/crypt/test_hmac_md5.c delete
external/bsd/dhcpcd/dist/tests/Makefile delete
external/bsd/dhcpcd/dist/tests/eloop-bench/.gitignore delete
external/bsd/dhcpcd/dist/tests/eloop-bench/Makefile delete
external/bsd/dhcpcd/dist/tests/eloop-bench/README.md delete
external/bsd/dhcpcd/dist/tests/eloop-bench/eloop-bench.c delete
external/bsd/dhcpcd/dist/src/arp.c up to 1.1.1.12
external/bsd/dhcpcd/dist/src/bpf.c up to 1.13
external/bsd/dhcpcd/dist/src/bpf.h up to 1.1.1.7
external/bsd/dhcpcd/dist/src/common.c up to 1.1.1.9
external/bsd/dhcpcd/dist/src/common.h up to 1.1.1.9
external/bsd/dhcpcd/dist/src/control.h up to 1.1.1.6
external/bsd/dhcpcd/dist/src/defs.h up to 1.1.1.30
external/bsd/dhcpcd/dist/src/dhcp-common.c up to 1.1.1.9
external/bsd/dhcpcd/dist/src/dhcp-common.h up to 1.1.1.5
external/bsd/dhcpcd/dist/src/dhcp.c up to 1.28
external/bsd/dhcpcd/dist/src/dhcp.h up to 1.1.1.11
external/bsd/dhcpcd/dist/src/dhcp6.c up to 1.13
external/bsd/dhcpcd/dist/src/dhcpcd.8.in up to 1.4
external/bsd/dhcpcd/dist/src/dhcpcd.c up to 1.27
external/bsd/dhcpcd/dist/src/dhcpcd.conf.5.in up to 1.1.1.15
external/bsd/dhcpcd/dist/src/if-bsd.c up to 1.14
external/bsd/dhcpcd/dist/src/if-options.c up to 1.18
external/bsd/dhcpcd/dist/src/if.c up to 1.1.1.17
external/bsd/dhcpcd/dist/src/if.h up to 1.1.1.12
external/bsd/dhcpcd/dist/src/ipv4.c up to 1.1.1.18
external/bsd/dhcpcd/dist/src/ipv4.h up to 1.1.1.11
external/bsd/dhcpcd/dist/src/ipv4ll.c up to 1.1.1.10
external/bsd/dhcpcd/dist/src/ipv4ll.h up to 1.1.1.8
external/bsd/dhcpcd/dist/src/ipv6.c up to 1.5
external/bsd/dhcpcd/dist/src/ipv6.h up to 1.6
external/bsd/dhcpcd/dist/src/ipv6nd.c up to 1.12
external/bsd/dhcpcd/dist/src/route.c up to 1.1.1.15
external/bsd/dhcpcd/sbin/dhcpcd/Makefile up to 1.49
doc/3RDPARTY modified manually
Import dhcpcd-8.1.0 with the following changes:
* Fix carrier status after a route socket overflow
* Allow domain spaced options
* DHCP: Allow not sending Force Renew Nonce or Reconf Accept
* IPv4LL: Now passes Apple Bonjour test versions 1.4 and 1.5
* ARP: Fix a typo and remove pragma (thus working with old gcc)
* DHCP6: Fix a cosmetic issue with infinite leases
* DHCP6: SLA 0 and Prefix Len 0 will now add a delegatd /64 address
* Ignore some virtual interfaces such as Tap and Bridge by default
* BPF: Move validation logic out of BPF and back into dhcpcd
To generate a diff of this commit:
cvs rdiff -u -r1.1640.2.3 -r1.1640.2.4 src/doc/3RDPARTY
cvs rdiff -u -r0 -r1.2.2.2 src/external/bsd/dhcpcd/NetBSD-upgrade
cvs rdiff -u -r1.4 -r0 src/external/bsd/dhcpcd/dist/.gitignore
cvs rdiff -u -r1.1.1.4.2.1 -r0 src/external/bsd/dhcpcd/dist/BUILDING.md
cvs rdiff -u -r1.1.1.6.2.1 -r0 src/external/bsd/dhcpcd/dist/Makefile
cvs rdiff -u -r1.1.1.2.8.1 -r0 src/external/bsd/dhcpcd/dist/Makefile.inc
cvs rdiff -u -r1.1.1.1 -r0 src/external/bsd/dhcpcd/dist/config-null.mk
cvs rdiff -u -r1.1.1.14.2.1 -r0 src/external/bsd/dhcpcd/dist/configure
cvs rdiff -u -r1.1.1.2 -r0 src/external/bsd/dhcpcd/dist/iconfig.mk
cvs rdiff -u -r1.1.1.1 -r0 src/external/bsd/dhcpcd/dist/compat/_strtoi.h \
src/external/bsd/dhcpcd/dist/compat/arc4random.c \
src/external/bsd/dhcpcd/dist/compat/arc4random.h \
src/external/bsd/dhcpcd/dist/compat/arc4random_uniform.c \
src/external/bsd/dhcpcd/dist/compat/arc4random_uniform.h \
src/external/bsd/dhcpcd/dist/compat/bitops.h \
src/external/bsd/dhcpcd/dist/compat/consttime_memequal.h \
src/external/bsd/dhcpcd/dist/compat/endian.h \
src/external/bsd/dhcpcd/dist/compat/pidfile.c \
src/external/bsd/dhcpcd/dist/compat/pidfile.h \
src/external/bsd/dhcpcd/dist/compat/queue.h \
src/external/bsd/dhcpcd/dist/compat/reallocarray.c \
src/external/bsd/dhcpcd/dist/compat/reallocarray.h \
src/external/bsd/dhcpcd/dist/compat/strlcpy.c \
src/external/bsd/dhcpcd/dist/compat/strlcpy.h \
src/external/bsd/dhcpcd/dist/compat/strtoi.c \
src/external/bsd/dhcpcd/dist/compat/strtoi.h \
src/external/bsd/dhcpcd/dist/compat/strtou.c
cvs rdiff -u -r1.1.1.2 -r0 src/external/bsd/dhcpcd/dist/compat/dprintf.c \
src/external/bsd/dhcpcd/dist/compat/dprintf.h
cvs rdiff -u -r1.1.1.1.2.1 -r0 src/external/bsd/dhcpcd/dist/compat/rb.c \
src/external/bsd/dhcpcd/dist/compat/rbtree.h
cvs rdiff -u -r1.1.1.1 -r0 src/external/bsd/dhcpcd/dist/compat/crypt/hmac.c \
src/external/bsd/dhcpcd/dist/compat/crypt/hmac.h \
src/external/bsd/dhcpcd/dist/compat/crypt/md5.c \
src/external/bsd/dhcpcd/dist/compat/crypt/sha256.h
cvs rdiff -u -r1.1.1.2 -r0 src/external/bsd/dhcpcd/dist/compat/crypt/md5.h \
src/external/bsd/dhcpcd/dist/compat/crypt/sha256.c
cvs rdiff -u -r1.1.1.1 -r0 \
src/external/bsd/dhcpcd/dist/hooks/50-dhcpcd-compat
cvs rdiff -u -r1.2 -r0 src/external/bsd/dhcpcd/dist/hooks/50-yp.conf
cvs rdiff -u -r1.1.1.1.20.1 -r0 src/external/bsd/dhcpcd/dist/hooks/Makefile
cvs rdiff -u -r1.1.1.1 -r0 src/external/bsd/dhcpcd/dist/src/GNUmakefile \
src/external/bsd/dhcpcd/dist/src/genembedc \
src/external/bsd/dhcpcd/dist/src/genembedh
cvs rdiff -u -r1.1.1.5.2.1 -r0 src/external/bsd/dhcpcd/dist/src/Makefile
cvs rdiff -u -r1.1.1.11 -r1.1.1.11.2.1 src/external/bsd/dhcpcd/dist/src/arp.c
cvs rdiff -u -r1.11.2.1 -r1.11.2.2 src/external/bsd/dhcpcd/dist/src/bpf.c \
src/external/bsd/dhcpcd/dist/src/dhcp6.c
cvs rdiff -u -r1.1.1.6 -r1.1.1.6.2.1 src/external/bsd/dhcpcd/dist/src/bpf.h
cvs rdiff -u -r1.1.1.8 -r1.1.1.8.2.1 \
src/external/bsd/dhcpcd/dist/src/common.c \
src/external/bsd/dhcpcd/dist/src/common.h
cvs rdiff -u -r1.1.1.4.2.1 -r1.1.1.4.2.2 \
src/external/bsd/dhcpcd/dist/src/control.h
cvs rdiff -u -r1.1.1.25.2.1 -r1.1.1.25.2.2 \
src/external/bsd/dhcpcd/dist/src/defs.h
cvs rdiff -u -r1.1.1.5 -r0 src/external/bsd/dhcpcd/dist/src/dev.c
cvs rdiff -u -r1.1.1.6.2.1 -r1.1.1.6.2.2 \
src/external/bsd/dhcpcd/dist/src/dhcp-common.c
cvs rdiff -u -r1.1.1.4 -r1.1.1.4.2.1 \
src/external/bsd/dhcpcd/dist/src/dhcp-common.h
cvs rdiff -u -r1.23.2.1 -r1.23.2.2 src/external/bsd/dhcpcd/dist/src/dhcp.c \
src/external/bsd/dhcpcd/dist/src/dhcpcd.c
cvs rdiff -u -r1.1.1.10 -r1.1.1.10.2.1 \
src/external/bsd/dhcpcd/dist/src/dhcp.h
cvs rdiff -u -r1.1.1.2 -r0 \
src/external/bsd/dhcpcd/dist/src/dhcpcd-definitions-small.conf \
src/external/bsd/dhcpcd/dist/src/dhcpcd-definitions.conf
cvs rdiff -u -r0 -r1.1.1.2.2.2 \
src/external/bsd/dhcpcd/dist/src/dhcpcd-embedded.c \
src/external/bsd/dhcpcd/dist/src/dhcpcd-embedded.h
cvs rdiff -u -r1.1.1.3 -r0 \
src/external/bsd/dhcpcd/dist/src/dhcpcd-embedded.c.in \
src/external/bsd/dhcpcd/dist/src/dhcpcd-embedded.h.in
cvs rdiff -u -r1.2.2.1 -r1.2.2.2 src/external/bsd/dhcpcd/dist/src/dhcpcd.8.in
cvs rdiff -u -r1.1.1.13.2.1 -r1.1.1.13.2.2 \
src/external/bsd/dhcpcd/dist/src/dhcpcd.conf.5.in
cvs rdiff -u -r1.10.2.1 -r1.10.2.2 src/external/bsd/dhcpcd/dist/src/if-bsd.c \
src/external/bsd/dhcpcd/dist/src/ipv6nd.c
cvs rdiff -u -r1.1.1.4 -r0 src/external/bsd/dhcpcd/dist/src/if-linux-wext.c
cvs rdiff -u -r1.1.1.14.2.1 -r0 src/external/bsd/dhcpcd/dist/src/if-linux.c
cvs rdiff -u -r1.16.2.1 -r1.16.2.2 \
src/external/bsd/dhcpcd/dist/src/if-options.c
cvs rdiff -u -r1.1.1.10.2.1 -r0 src/external/bsd/dhcpcd/dist/src/if-sun.c
cvs rdiff -u -r1.1.1.14.2.1 -r1.1.1.14.2.2 \
src/external/bsd/dhcpcd/dist/src/if.c
cvs rdiff -u -r1.1.1.10.2.1 -r1.1.1.10.2.2 \
src/external/bsd/dhcpcd/dist/src/if.h
cvs rdiff -u -r1.1.1.16.2.1 -r1.1.1.16.2.2 \
src/external/bsd/dhcpcd/dist/src/ipv4.c
cvs rdiff -u -r1.1.1.9.2.1 -r1.1.1.9.2.2 \
src/external/bsd/dhcpcd/dist/src/ipv4.h
cvs rdiff -u -r1.1.1.9 -r1.1.1.9.2.1 \
src/external/bsd/dhcpcd/dist/src/ipv4ll.c
cvs rdiff -u -r1.1.1.7 -r1.1.1.7.2.1 \
src/external/bsd/dhcpcd/dist/src/ipv4ll.h
cvs rdiff -u -r1.3.2.1 -r1.3.2.2 src/external/bsd/dhcpcd/dist/src/ipv6.c \
src/external/bsd/dhcpcd/dist/src/ipv6.h
cvs rdiff -u -r1.1.1.12.2.1 -r1.1.1.12.2.2 \
src/external/bsd/dhcpcd/dist/src/route.c
cvs rdiff -u -r1.1.1.1 -r0 src/external/bsd/dhcpcd/dist/src/dev/Makefile
cvs rdiff -u -r1.1.1.4 -r0 src/external/bsd/dhcpcd/dist/src/dev/udev.c
cvs rdiff -u -r1.1.1.2 -r0 src/external/bsd/dhcpcd/dist/tests/Makefile
cvs rdiff -u -r1.1.1.1 -r0 \
src/external/bsd/dhcpcd/dist/tests/crypt/.gitignore \
src/external/bsd/dhcpcd/dist/tests/crypt/GNUmakefile \
src/external/bsd/dhcpcd/dist/tests/crypt/README.md
cvs rdiff -u -r1.1.1.2 -r0 src/external/bsd/dhcpcd/dist/tests/crypt/Makefile \
src/external/bsd/dhcpcd/dist/tests/crypt/run-test.c \
src/external/bsd/dhcpcd/dist/tests/crypt/test.h
cvs rdiff -u -r1.1.1.3 -r0 \
src/external/bsd/dhcpcd/dist/tests/crypt/test_hmac_md5.c
cvs rdiff -u -r1.1.1.1 -r0 \
src/external/bsd/dhcpcd/dist/tests/eloop-bench/.gitignore \
src/external/bsd/dhcpcd/dist/tests/eloop-bench/README.md
cvs rdiff -u -r1.1.1.2 -r0 \
src/external/bsd/dhcpcd/dist/tests/eloop-bench/Makefile
cvs rdiff -u -r1.1.1.3 -r0 \
src/external/bsd/dhcpcd/dist/tests/eloop-bench/eloop-bench.c
cvs rdiff -u -r1.48 -r1.48.2.1 src/external/bsd/dhcpcd/sbin/dhcpcd/Makefile
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/doc/3RDPARTY
diff -u src/doc/3RDPARTY:1.1640.2.3 src/doc/3RDPARTY:1.1640.2.4
--- src/doc/3RDPARTY:1.1640.2.3 Tue Sep 17 19:51:12 2019
+++ src/doc/3RDPARTY Sat Oct 12 14:44:31 2019
@@ -1,4 +1,4 @@
-# $NetBSD: 3RDPARTY,v 1.1640.2.3 2019/09/17 19:51:12 martin Exp $
+# $NetBSD: 3RDPARTY,v 1.1640.2.4 2019/10/12 14:44:31 martin Exp $
#
# This file contains a list of the software that has been integrated into
# NetBSD where we are not the primary maintainer.
@@ -341,12 +341,12 @@ Notes:
Use the dhcp2netbsd script.
Package: dhcpcd
-Version: 8.0.2
-Current Vers: 8.0.2
+Version: 8.1.0
+Current Vers: 8.1.0
Maintainer: roy
Archive Site: ftp://roy.marples.name/pub/dhcpcd/
Home Page: http://roy.marples.name/projects/dhcpcd/
-Date: 2019-07-30
+Date: 2019-10-12
Mailing List: [email protected]
License: BSD (2-clause)
Location: external/bsd/dhcpcd/dist
Index: src/external/bsd/dhcpcd/dist/src/arp.c
diff -u src/external/bsd/dhcpcd/dist/src/arp.c:1.1.1.11 src/external/bsd/dhcpcd/dist/src/arp.c:1.1.1.11.2.1
--- src/external/bsd/dhcpcd/dist/src/arp.c:1.1.1.11 Wed Jul 24 09:54:49 2019
+++ src/external/bsd/dhcpcd/dist/src/arp.c Sat Oct 12 14:44:32 2019
@@ -129,12 +129,11 @@ arp_report_conflicted(const struct arp_s
inet_ntoa(astate->addr));
}
-
static void
arp_found(struct arp_state *astate, const struct arp_msg *amsg)
{
struct interface *ifp;
- struct ivp4_addr *ia;
+ struct ipv4_addr *ia;
#ifndef KERNEL_RFC5227
struct timespec now, defend;
#endif
@@ -142,11 +141,8 @@ arp_found(struct arp_state *astate, cons
arp_report_conflicted(astate, amsg);
ifp = astate->iface;
-#pragma GCC diagnostic push /* GCC is clearly wrong about this warning. */
-#pragma GCC diagnostic ignored "-Wincompatible-pointer-types"
/* If we haven't added the address we're doing a probe. */
ia = ipv4_iffindaddr(ifp, &astate->addr, NULL);
-#pragma GCC diagnostic pop
if (ia == NULL) {
if (astate->found_cb != NULL)
astate->found_cb(astate, amsg);
@@ -182,6 +178,35 @@ arp_found(struct arp_state *astate, cons
astate->defend_failed_cb(astate);
}
+static bool
+arp_validate(const struct interface *ifp, struct arphdr *arp)
+{
+
+ /* Families must match */
+ if (arp->ar_hrd != htons(ifp->family))
+ return false;
+
+ /* Protocol must be IP. */
+ if (arp->ar_pro != htons(ETHERTYPE_IP))
+ return false;
+
+ /* lladdr length matches */
+ if (arp->ar_hln != ifp->hwlen)
+ return false;
+
+ /* Protocol length must match in_addr_t */
+ if (arp->ar_pln != sizeof(in_addr_t))
+ return false;
+
+ /* Only these types are recognised */
+ if (arp->ar_op != htons(ARPOP_REPLY) &&
+ arp->ar_op != htons(ARPOP_REQUEST))
+ return false;
+
+ return true;
+}
+
+
static void
arp_packet(struct interface *ifp, uint8_t *data, size_t len)
{
@@ -197,25 +222,12 @@ arp_packet(struct interface *ifp, uint8_
return;
memcpy(&ar, data, sizeof(ar));
- /* These checks are enforced in the BPF filter. */
-#if 0
- /* Families must match */
- if (ar.ar_hrd != htons(ifp->family))
- return;
- /* Protocol must be IP. */
- if (ar.ar_pro != htons(ETHERTYPE_IP))
- continue;
- /* lladdr length matches */
- if (ar.ar_hln != ifp->hwlen)
- continue;
- /* Protocol length must match in_addr_t */
- if (ar.ar_pln != sizeof(arm.sip.s_addr))
- return;
- /* Only these types are recognised */
- if (ar.ar_op != htons(ARPOP_REPLY) &&
- ar.ar_op != htons(ARPOP_REQUEST))
- continue;
+ if (!arp_validate(ifp, &ar)) {
+#ifdef BPF_DEBUG
+ logerrx("%s: ARP BPF validation failure", ifp->name);
#endif
+ return;
+ }
/* Get pointers to the hardware addresses */
hw_s = data + sizeof(ar);
@@ -329,10 +341,8 @@ arp_open(struct interface *ifp)
state = ARP_STATE(ifp);
if (state->bpf_fd == -1) {
state->bpf_fd = bpf_open(ifp, bpf_arp);
- if (state->bpf_fd == -1) {
- logerr("%s: %s", __func__, ifp->name);
+ if (state->bpf_fd == -1)
return -1;
- }
eloop_event_add(ifp->ctx->eloop, state->bpf_fd, arp_read, ifp);
}
return state->bpf_fd;
@@ -428,6 +438,7 @@ arp_announce1(void *arg)
{
struct arp_state *astate = arg;
struct interface *ifp = astate->iface;
+ struct ipv4_addr *ia;
if (++astate->claims < ANNOUNCE_NUM)
logdebugx("%s: ARP announcing %s (%d of %d), "
@@ -438,24 +449,31 @@ arp_announce1(void *arg)
logdebugx("%s: ARP announcing %s (%d of %d)",
ifp->name, inet_ntoa(astate->addr),
astate->claims, ANNOUNCE_NUM);
+
+ /* The kernel will send a Gratuitous ARP for newly added addresses.
+ * So we can avoid sending the same.
+ * Linux is special and doesn't send one. */
+ ia = ipv4_iffindaddr(ifp, &astate->addr, NULL);
+#ifndef __linux__
+ if (astate->claims == 1 && ia != NULL && ia->flags & IPV4_AF_NEW)
+ goto skip_request;
+#endif
+
if (arp_request(ifp, &astate->addr, &astate->addr) == -1)
logerr(__func__);
+
+#ifndef __linux__
+skip_request:
+#endif
+ /* No longer a new address. */
+ if (ia != NULL)
+ ia->flags |= ~IPV4_AF_NEW;
+
eloop_timeout_add_sec(ifp->ctx->eloop, ANNOUNCE_WAIT,
astate->claims < ANNOUNCE_NUM ? arp_announce1 : arp_announced,
astate);
}
-/*
- * XXX FIXME
- * Kernels supporting RFC5227 will announce the address when it's
- * added.
- * dhcpcd should not announce when this happens, nor need to open
- * a BPF socket for it.
- * Also, an address might be added to a non preferred inteface when
- * the same address exists on a preferred one so we need to instruct
- * the kernel not to announce the address somehow.
- */
-
void
arp_announce(struct arp_state *astate)
{
@@ -501,6 +519,9 @@ arp_ifannounceaddr(struct interface *ifp
{
struct arp_state *astate;
+ if (ifp->flags & IFF_NOARP)
+ return;
+
astate = arp_find(ifp, ia);
if (astate == NULL) {
astate = arp_new(ifp, ia);
Index: src/external/bsd/dhcpcd/dist/src/bpf.c
diff -u src/external/bsd/dhcpcd/dist/src/bpf.c:1.11.2.1 src/external/bsd/dhcpcd/dist/src/bpf.c:1.11.2.2
--- src/external/bsd/dhcpcd/dist/src/bpf.c:1.11.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/bpf.c Sat Oct 12 14:44:32 2019
@@ -410,13 +410,7 @@ bpf_cmp_hwaddr(struct bpf_insn *bpf, siz
#endif
#ifdef ARP
-
static const struct bpf_insn bpf_arp_ether [] = {
- /* Ensure packet is at least correct size. */
- BPF_STMT(BPF_LD + BPF_W + BPF_LEN, 0),
- BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, sizeof(struct ether_arp), 1, 0),
- BPF_STMT(BPF_RET + BPF_K, 0),
-
/* Check this is an ARP packet. */
BPF_STMT(BPF_LD + BPF_H + BPF_ABS,
offsetof(struct ether_header, ether_type)),
@@ -552,17 +546,8 @@ bpf_arp(struct interface *ifp, int fd)
}
#endif
-#define BPF_M_FHLEN 0
-#define BPF_M_IPHLEN 1
-#define BPF_M_IPLEN 2
-#define BPF_M_UDP 3
-#define BPF_M_UDPLEN 4
-
#ifdef ARPHRD_NONE
static const struct bpf_insn bpf_bootp_none[] = {
- /* Set the frame header length to zero. */
- BPF_STMT(BPF_LD + BPF_IMM, 0),
- BPF_STMT(BPF_ST, BPF_M_FHLEN),
};
#define BPF_BOOTP_NONE_LEN __arraycount(bpf_bootp_none)
#endif
@@ -574,13 +559,14 @@ static const struct bpf_insn bpf_bootp_e
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 1, 0),
BPF_STMT(BPF_RET + BPF_K, 0),
- /* Load frame header length into X. */
- BPF_STMT(BPF_LDX + BPF_W + BPF_IMM, sizeof(struct ether_header)),
- /* Copy frame header length to memory */
- BPF_STMT(BPF_STX, BPF_M_FHLEN),
+ /* Advance to the IP header. */
+ BPF_STMT(BPF_LDX + BPF_K, sizeof(struct ether_header)),
};
#define BPF_BOOTP_ETHER_LEN __arraycount(bpf_bootp_ether)
+#define BOOTP_MIN_SIZE sizeof(struct ip) + sizeof(struct udphdr) + \
+ sizeof(struct bootp)
+
static const struct bpf_insn bpf_bootp_filter[] = {
/* Make sure it's an IPv4 packet. */
BPF_STMT(BPF_LD + BPF_B + BPF_IND, 0),
@@ -588,15 +574,6 @@ static const struct bpf_insn bpf_bootp_f
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0x40, 1, 0),
BPF_STMT(BPF_RET + BPF_K, 0),
- /* Ensure IP header length is big enough and
- * store the IP header length in memory. */
- BPF_STMT(BPF_LD + BPF_B + BPF_IND, 0),
- BPF_STMT(BPF_ALU + BPF_AND + BPF_K, 0x0f),
- BPF_STMT(BPF_ALU + BPF_MUL + BPF_K, 4),
- BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, sizeof(struct ip), 1, 0),
- BPF_STMT(BPF_RET + BPF_K, 0),
- BPF_STMT(BPF_ST, BPF_M_IPHLEN),
-
/* Make sure it's a UDP packet. */
BPF_STMT(BPF_LD + BPF_B + BPF_IND, offsetof(struct ip, ip_p)),
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 1, 0),
@@ -607,49 +584,17 @@ static const struct bpf_insn bpf_bootp_f
BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, 0x1fff, 0, 1),
BPF_STMT(BPF_RET + BPF_K, 0),
- /* Store IP length. */
- BPF_STMT(BPF_LD + BPF_H + BPF_IND, offsetof(struct ip, ip_len)),
- BPF_STMT(BPF_ST, BPF_M_IPLEN),
-
/* Advance to the UDP header. */
- BPF_STMT(BPF_LD + BPF_MEM, BPF_M_IPHLEN),
+ BPF_STMT(BPF_LD + BPF_B + BPF_IND, 0),
+ BPF_STMT(BPF_ALU + BPF_AND + BPF_K, 0x0f),
+ BPF_STMT(BPF_ALU + BPF_MUL + BPF_K, 4),
BPF_STMT(BPF_ALU + BPF_ADD + BPF_X, 0),
BPF_STMT(BPF_MISC + BPF_TAX, 0),
- /* Store UDP location */
- BPF_STMT(BPF_STX, BPF_M_UDP),
-
/* Make sure it's from and to the right port. */
BPF_STMT(BPF_LD + BPF_W + BPF_IND, 0),
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, (BOOTPS << 16) + BOOTPC, 1, 0),
BPF_STMT(BPF_RET + BPF_K, 0),
-
- /* Store UDP length. */
- BPF_STMT(BPF_LD + BPF_H + BPF_IND, offsetof(struct udphdr, uh_ulen)),
- BPF_STMT(BPF_ST, BPF_M_UDPLEN),
-
- /* Ensure that UDP length + IP header length == IP length */
- /* Copy IP header length to X. */
- BPF_STMT(BPF_LDX + BPF_MEM, BPF_M_IPHLEN),
- /* Add UDP length (A) to IP header length (X). */
- BPF_STMT(BPF_ALU + BPF_ADD + BPF_X, 0),
- /* Store result in X. */
- BPF_STMT(BPF_MISC + BPF_TAX, 0),
- /* Copy IP length to A. */
- BPF_STMT(BPF_LD + BPF_MEM, BPF_M_IPLEN),
- /* Ensure X == A. */
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_X, 0, 1, 0),
- BPF_STMT(BPF_RET + BPF_K, 0),
-
- /* Advance to the BOOTP packet. */
- BPF_STMT(BPF_LD + BPF_MEM, BPF_M_UDP),
- BPF_STMT(BPF_ALU + BPF_ADD + BPF_K, sizeof(struct udphdr)),
- BPF_STMT(BPF_MISC + BPF_TAX, 0),
-
- /* Make sure it's BOOTREPLY. */
- BPF_STMT(BPF_LD + BPF_B + BPF_IND, offsetof(struct bootp, op)),
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, BOOTREPLY, 1, 0),
- BPF_STMT(BPF_RET + BPF_K, 0),
};
#define BPF_BOOTP_FILTER_LEN __arraycount(bpf_bootp_filter)
@@ -729,14 +674,8 @@ bpf_bootp(struct interface *ifp, int fd)
}
#endif
- /* All passed, return the packet - frame length + ip length */
- BPF_SET_STMT(bp, BPF_LD + BPF_MEM, BPF_M_FHLEN);
- bp++;
- BPF_SET_STMT(bp, BPF_LDX + BPF_MEM, BPF_M_IPLEN);
- bp++;
- BPF_SET_STMT(bp, BPF_ALU + BPF_ADD + BPF_X, 0);
- bp++;
- BPF_SET_STMT(bp, BPF_RET + BPF_A, 0);
+ /* All passed, return the packet. */
+ BPF_SET_STMT(bp, BPF_RET + BPF_K, BPF_WHOLEPACKET);
bp++;
return bpf_attach(fd, bpf, (unsigned int)(bp - bpf));
Index: src/external/bsd/dhcpcd/dist/src/dhcp6.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.11.2.1 src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.11.2.2
--- src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.11.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcp6.c Sat Oct 12 14:44:32 2019
@@ -532,13 +532,6 @@ dhcp6_delegateaddr(struct in6_addr *addr
asla.prefix_len = 0;
asla.sla_set = 0;
sla = &asla;
- } else if (sla->sla == 0 && sla->prefix_len == 0) {
- /* An SLA of 0 was set with no prefix length specified.
- * This means we delegate the whole prefix. */
- asla.sla = sla->sla;
- asla.prefix_len = prefix->prefix_len;
- asla.sla_set = 0;
- sla = &asla;
} else if (sla->prefix_len == 0) {
/* An SLA was given, but prefix length was not.
* We need to work out a suitable prefix length for
@@ -680,27 +673,21 @@ dhcp6_makemessage(struct interface *ifp)
break;
}
if (n < ifo->dhcp6_override_len)
- continue;
- if (!(opt->type & OT_NOREQ) &&
- (opt->type & OT_REQUEST ||
- has_option_mask(ifo->requestmask6, opt->option)))
- {
- n_options++;
- len += sizeof(o.len);
- }
+ continue;
+ if (!DHC_REQOPT(opt, ifo->requestmask6, ifo->nomask6))
+ continue;
+ n_options++;
+ len += sizeof(o.len);
}
#ifndef SMALL
for (l = 0, opt = ifo->dhcp6_override;
l < ifo->dhcp6_override_len;
l++, opt++)
{
- if (!(opt->type & OT_NOREQ) &&
- (opt->type & OT_REQUEST ||
- has_option_mask(ifo->requestmask6, opt->option)))
- {
- n_options++;
- len += sizeof(o.len);
- }
+ if (!DHC_REQOPT(opt, ifo->requestmask6, ifo->nomask6))
+ continue;
+ n_options++;
+ len += sizeof(o.len);
}
if (dhcp6_findselfsla(ifp)) {
n_options++;
@@ -1037,7 +1024,8 @@ dhcp6_makemessage(struct interface *ifp)
#ifdef AUTH
if ((ifo->auth.options & DHCPCD_AUTH_SENDREQUIRE) !=
- DHCPCD_AUTH_SENDREQUIRE)
+ DHCPCD_AUTH_SENDREQUIRE &&
+ !has_option_mask(ifo->nomask6, D6_OPTION_RECONF_ACCEPT))
COPYIN1(D6_OPTION_RECONF_ACCEPT, 0);
#endif
@@ -1060,34 +1048,26 @@ dhcp6_makemessage(struct interface *ifp)
if (n < ifo->dhcp6_override_len)
continue;
#endif
- if (!(opt->type & OT_NOREQ) &&
- (opt->type & OT_REQUEST ||
- has_option_mask(ifo->requestmask6,
- opt->option)))
- {
- o.code = htons((uint16_t)opt->option);
- memcpy(p, &o.code, sizeof(o.code));
- p += sizeof(o.code);
- o.len = (uint16_t)
- (o.len + sizeof(o.code));
- }
+ if (!DHC_REQOPT(opt, ifo->requestmask6,
+ ifo->nomask6))
+ continue;
+ o.code = htons((uint16_t)opt->option);
+ memcpy(p, &o.code, sizeof(o.code));
+ p += sizeof(o.code);
+ o.len = (uint16_t)(o.len + sizeof(o.code));
}
#ifndef SMALL
for (l = 0, opt = ifo->dhcp6_override;
l < ifo->dhcp6_override_len;
l++, opt++)
{
- if (!(opt->type & OT_NOREQ) &&
- (opt->type & OT_REQUEST ||
- has_option_mask(ifo->requestmask6,
- opt->option)))
- {
- o.code = htons((uint16_t)opt->option);
- memcpy(p, &o.code, sizeof(o.code));
- p += sizeof(o.code);
- o.len = (uint16_t)
- (o.len + sizeof(o.code));
- }
+ if (!DHC_REQOPT(opt, ifo->requestmask6,
+ ifo->nomask6))
+ continue;
+ o.code = htons((uint16_t)opt->option);
+ memcpy(p, &o.code, sizeof(o.code));
+ p += sizeof(o.code);
+ o.len = (uint16_t)(o.len + sizeof(o.code));
}
if (dhcp6_findselfsla(ifp)) {
o.code = htons(D6_OPTION_PD_EXCLUDE);
@@ -3008,7 +2988,9 @@ dhcp6_bind(struct interface *ifp, const
TAILQ_FOREACH(ia, &state->addrs, next) {
if (ia->flags & IPV6_AF_STALE)
continue;
- if (ia->prefix_vltime <= state->renew)
+ if (!(state->renew == ND6_INFINITE_LIFETIME &&
+ ia->prefix_vltime == ND6_INFINITE_LIFETIME)
+ && ia->prefix_vltime <= state->renew)
logwarnx(
"%s: %s will expire before renewal",
ifp->name, ia->saddr);
@@ -3152,6 +3134,8 @@ dhcp6_bind(struct interface *ifp, const
if (state->state == DH6S_INFORMED)
lognewinfo("%s: refresh in %"PRIu32" seconds",
ifp->name, state->renew);
+ else if (state->renew == ND6_INFINITE_LIFETIME)
+ lognewinfo("%s: leased for infinity", ifp->name);
else if (state->renew || state->rebind)
lognewinfo("%s: renew in %"PRIu32", "
"rebind in %"PRIu32", "
Index: src/external/bsd/dhcpcd/dist/src/bpf.h
diff -u src/external/bsd/dhcpcd/dist/src/bpf.h:1.1.1.6 src/external/bsd/dhcpcd/dist/src/bpf.h:1.1.1.6.2.1
--- src/external/bsd/dhcpcd/dist/src/bpf.h:1.1.1.6 Wed Jul 24 09:54:49 2019
+++ src/external/bsd/dhcpcd/dist/src/bpf.h Sat Oct 12 14:44:32 2019
@@ -34,6 +34,25 @@
#define BPF_PARTIALCSUM (1U << 2)
#define BPF_BCAST (1U << 3)
+/*
+ * Even though we program the BPF filter should we trust it?
+ * On Linux at least there is a window between opening the socket,
+ * binding the interface and setting the filter where we receive data.
+ * This data is NOT checked OR flushed and IS returned when reading.
+ * We have no way of flushing it other than reading these packets!
+ * But we don't know if they passed the filter or not ..... so we need
+ * to validate each and every packet that comes through ourselves as well.
+ * Even if Linux does fix this sorry state, who is to say other kernels
+ * don't have bugs causing a similar effect?
+ *
+ * As such, let's strive to keep the filters just for pattern matching
+ * to avoid waking dhcpcd up.
+ *
+ * If you want to be notified of any packet failing the BPF filter,
+ * define BPF_DEBUG below.
+ */
+//#define BPF_DEBUG
+
#include "dhcpcd.h"
extern const char *bpf_name;
Index: src/external/bsd/dhcpcd/dist/src/common.c
diff -u src/external/bsd/dhcpcd/dist/src/common.c:1.1.1.8 src/external/bsd/dhcpcd/dist/src/common.c:1.1.1.8.2.1
--- src/external/bsd/dhcpcd/dist/src/common.c:1.1.1.8 Wed Jul 24 09:54:49 2019
+++ src/external/bsd/dhcpcd/dist/src/common.c Sat Oct 12 14:44:32 2019
@@ -26,28 +26,12 @@
* SUCH DAMAGE.
*/
-#include <sys/param.h>
-#include <sys/time.h>
-#ifdef __sun
-#include <sys/sysmacros.h>
-#endif
+#include <sys/statvfs.h>
-#include <assert.h>
#include <ctype.h>
-#include <err.h>
#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#ifdef BSD
-# include <paths.h>
-#endif
-#include <stdarg.h>
-#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
#include "common.h"
#include "dhcpcd.h"
@@ -153,3 +137,18 @@ read_hwaddr_aton(uint8_t **data, const c
fclose(fp);
return len;
}
+
+int
+is_root_local(void)
+{
+#ifdef ST_LOCAL
+ struct statvfs vfs;
+
+ if (statvfs("/", &vfs) == -1)
+ return -1;
+ return vfs.f_flag & ST_LOCAL ? 1 : 0;
+#else
+ errno = ENOTSUP;
+ return -1;
+#endif
+}
Index: src/external/bsd/dhcpcd/dist/src/common.h
diff -u src/external/bsd/dhcpcd/dist/src/common.h:1.1.1.8 src/external/bsd/dhcpcd/dist/src/common.h:1.1.1.8.2.1
--- src/external/bsd/dhcpcd/dist/src/common.h:1.1.1.8 Wed Jul 24 09:54:49 2019
+++ src/external/bsd/dhcpcd/dist/src/common.h Sat Oct 12 14:44:32 2019
@@ -197,4 +197,5 @@ int get_monotonic(struct timespec *);
const char *hwaddr_ntoa(const void *, size_t, char *, size_t);
size_t hwaddr_aton(uint8_t *, const char *);
size_t read_hwaddr_aton(uint8_t **, const char *);
+int is_root_local(void);
#endif
Index: src/external/bsd/dhcpcd/dist/src/control.h
diff -u src/external/bsd/dhcpcd/dist/src/control.h:1.1.1.4.2.1 src/external/bsd/dhcpcd/dist/src/control.h:1.1.1.4.2.2
--- src/external/bsd/dhcpcd/dist/src/control.h:1.1.1.4.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/control.h Sat Oct 12 14:44:32 2019
@@ -29,6 +29,8 @@
#ifndef CONTROL_H
#define CONTROL_H
+#include <stdbool.h>
+
#include "dhcpcd.h"
#if !defined(CTL_FREE_LIST)
Index: src/external/bsd/dhcpcd/dist/src/defs.h
diff -u src/external/bsd/dhcpcd/dist/src/defs.h:1.1.1.25.2.1 src/external/bsd/dhcpcd/dist/src/defs.h:1.1.1.25.2.2
--- src/external/bsd/dhcpcd/dist/src/defs.h:1.1.1.25.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/defs.h Sat Oct 12 14:44:32 2019
@@ -29,7 +29,7 @@
#define CONFIG_H
#define PACKAGE "dhcpcd"
-#define VERSION "8.0.4"
+#define VERSION "8.1.0"
#ifndef CONFIG
# define CONFIG SYSCONFDIR "/" PACKAGE ".conf"
Index: src/external/bsd/dhcpcd/dist/src/dhcp-common.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp-common.c:1.1.1.6.2.1 src/external/bsd/dhcpcd/dist/src/dhcp-common.c:1.1.1.6.2.2
--- src/external/bsd/dhcpcd/dist/src/dhcp-common.c:1.1.1.6.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcp-common.c Sat Oct 12 14:44:32 2019
@@ -200,6 +200,10 @@ make_option_mask(const struct dhcp_opt *
while ((token = strsep(&p, ", "))) {
if (*token == '\0')
continue;
+ if (strncmp(token, "dhcp6_", 6) == 0)
+ token += 6;
+ if (strncmp(token, "nd6_", 4) == 0)
+ token += 4;
match = 0;
for (i = 0, opt = odopts; i < odopts_len; i++, opt++) {
if (opt->var == NULL || opt->option == 0)
Index: src/external/bsd/dhcpcd/dist/src/dhcp-common.h
diff -u src/external/bsd/dhcpcd/dist/src/dhcp-common.h:1.1.1.4 src/external/bsd/dhcpcd/dist/src/dhcp-common.h:1.1.1.4.2.1
--- src/external/bsd/dhcpcd/dist/src/dhcp-common.h:1.1.1.4 Wed Jul 24 09:54:49 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcp-common.h Sat Oct 12 14:44:32 2019
@@ -81,6 +81,11 @@
#define OT_BITFLAG (1 << 27)
#define OT_RESERVED (1 << 28)
+#define DHC_REQOPT(o, r, n) \
+ (!((o)->type & OT_NOREQ) && \
+ ((o)->type & OT_REQUEST || has_option_mask((r), (o)->option)) && \
+ !has_option_mask((n), (o)->option))
+
struct dhcp_opt {
uint32_t option; /* Also used for IANA Enterpise Number */
int type;
Index: src/external/bsd/dhcpcd/dist/src/dhcp.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp.c:1.23.2.1 src/external/bsd/dhcpcd/dist/src/dhcp.c:1.23.2.2
--- src/external/bsd/dhcpcd/dist/src/dhcp.c:1.23.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcp.c Sat Oct 12 14:44:32 2019
@@ -988,7 +988,8 @@ make_message(struct bootp **bootpm, cons
#ifdef AUTH
if ((ifo->auth.options & DHCPCD_AUTH_SENDREQUIRE) !=
- DHCPCD_AUTH_SENDREQUIRE)
+ DHCPCD_AUTH_SENDREQUIRE &&
+ !has_option_mask(ifo->nomask, DHO_FORCERENEW_NONCE))
{
/* We support HMAC-MD5 */
AREA_CHECK(1);
@@ -1032,10 +1033,7 @@ make_message(struct bootp **bootpm, cons
i < ifp->ctx->dhcp_opts_len;
i++, opt++)
{
- if (!(opt->type & OT_REQUEST ||
- has_option_mask(ifo->requestmask, opt->option)))
- continue;
- if (opt->type & OT_NOREQ)
+ if (!DHC_REQOPT(opt, ifo->requestmask, ifo->nomask))
continue;
if (type == DHCP_INFORM &&
(opt->option == DHO_RENEWALTIME ||
@@ -1054,10 +1052,7 @@ make_message(struct bootp **bootpm, cons
break;
if (lp < p)
continue;
- if (!(opt->type & OT_REQUEST ||
- has_option_mask(ifo->requestmask, opt->option)))
- continue;
- if (opt->type & OT_NOREQ)
+ if (!DHC_REQOPT(opt, ifo->requestmask, ifo->nomask))
continue;
if (type == DHCP_INFORM &&
(opt->option == DHO_RENEWALTIME ||
@@ -1738,15 +1733,32 @@ send_message(struct interface *ifp, uint
if (r == -1)
goto fail;
len = (size_t)r;
- from.s_addr = bootp->ciaddr;
- if (from.s_addr != INADDR_ANY)
+
+ if (ipv4_iffindaddr(ifp, &state->lease.addr, NULL) != NULL)
+ from.s_addr = state->lease.addr.s_addr;
+ else
+ from.s_addr = INADDR_ANY;
+ if (from.s_addr != INADDR_ANY &&
+ state->lease.server.s_addr != INADDR_ANY)
to.s_addr = state->lease.server.s_addr;
else
- to.s_addr = INADDR_ANY;
+ to.s_addr = INADDR_BROADCAST;
- /* If unicasting, try and avoid sending by BPF so we don't
- * use a L2 broadcast. */
- if (to.s_addr != INADDR_ANY && to.s_addr != INADDR_BROADCAST) {
+ /*
+ * If not listening on the unspecified address we can
+ * only receive broadcast messages via BPF.
+ * Sockets bound to an address cannot receive broadcast messages
+ * even if they are setup to send them.
+ * Broadcasting from UDP is only an optimisation for rebinding
+ * and on BSD, at least, is reliant on the subnet route being
+ * correctly configured to recieve the unicast reply.
+ * As such, we always broadcast and receive the reply to it via BPF.
+ * This also guarantees we have a DHCP server attached to the
+ * interface we want to configure because we can't dictate the
+ * interface via IP_PKTINFO unlike for IPv6.
+ */
+ if (to.s_addr != INADDR_BROADCAST)
+ {
if (dhcp_sendudp(ifp, &to, bootp, len) != -1)
goto out;
logerr("%s: dhcp_sendudp", ifp->name);
@@ -2001,30 +2013,44 @@ dhcp_finish_dad(struct interface *ifp, s
}
-static void
+static bool
dhcp_addr_duplicated(struct interface *ifp, struct in_addr *ia)
{
struct dhcp_state *state = D_STATE(ifp);
+ unsigned long long opts = ifp->options->options;
+ struct dhcpcd_ctx *ctx = ifp->ctx;
+ bool deleted = false;
#ifdef IN_IFF_DUPLICATED
struct ipv4_addr *iap;
#endif
if ((state->offer == NULL || state->offer->yiaddr != ia->s_addr) &&
!IN_ARE_ADDR_EQUAL(ia, &state->lease.addr))
- return;
+ return deleted;
/* RFC 2131 3.1.5, Client-server interaction */
logerrx("%s: DAD detected %s", ifp->name, inet_ntoa(*ia));
unlink(state->leasefile);
- if (!(ifp->options->options & DHCPCD_STATIC) && !state->lease.frominfo)
+ if (!(opts & DHCPCD_STATIC) && !state->lease.frominfo)
dhcp_decline(ifp);
#ifdef IN_IFF_DUPLICATED
- if ((iap = ipv4_iffindaddr(ifp, ia, NULL)) != NULL)
+ if ((iap = ipv4_iffindaddr(ifp, ia, NULL)) != NULL) {
ipv4_deladdr(iap, 0);
+ deleted = true;
+ }
#endif
- eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
+ eloop_timeout_delete(ctx->eloop, NULL, ifp);
+ if (opts & (DHCPCD_STATIC | DHCPCD_INFORM)) {
+ state->reason = "EXPIRE";
+ script_runreason(ifp, state->reason);
+#define NOT_ONLY_SELF (DHCPCD_MASTER | DHCPCD_IPV6RS | DHCPCD_DHCP6)
+ if (!(ctx->options & NOT_ONLY_SELF))
+ eloop_exit(ifp->ctx->eloop, EXIT_FAILURE);
+ return deleted;
+ }
eloop_timeout_add_sec(ifp->ctx->eloop,
DHCP_RAND_MAX, dhcp_discover, ifp);
+ return deleted;
}
#endif
@@ -2362,7 +2388,9 @@ dhcp_arp_address(struct interface *ifp)
/* Add the address now, let the kernel handle DAD. */
ipv4_addaddr(ifp, &l.addr, &l.mask, &l.brd,
l.leasetime, l.rebindtime);
- } else
+ } else if (ia->addr_flags & IN_IFF_DUPLICATED)
+ dhcp_addr_duplicated(ifp, &ia->addr);
+ else
loginfox("%s: waiting for DAD on %s",
ifp->name, inet_ntoa(addr));
return 0;
@@ -2841,14 +2869,18 @@ dhcp_handledhcp(struct interface *ifp, s
#define LOGDHCP(l, m) \
log_dhcp((l), (m), ifp, bootp, bootp_len, from, 1)
+#define IS_STATE_ACTIVE(s) ((s)-state != DHS_NONE && \
+ (s)->state != DHS_INIT && (s)->state != DHS_BOUND)
+
if (bootp->op != BOOTREPLY) {
- logdebugx("%s: op (%d) is not BOOTREPLY",
- ifp->name, bootp->op);
+ if (IS_STATE_ACTIVE(state))
+ logdebugx("%s: op (%d) is not BOOTREPLY",
+ ifp->name, bootp->op);
return;
}
if (state->xid != ntohl(bootp->xid)) {
- if (state->state != DHS_BOUND && state->state != DHS_NONE)
+ if (IS_STATE_ACTIVE(state))
logdebugx("%s: wrong xid 0x%x (expecting 0x%x) from %s",
ifp->name, ntohl(bootp->xid), state->xid,
inet_ntoa(*from));
@@ -2859,12 +2891,14 @@ dhcp_handledhcp(struct interface *ifp, s
if (ifp->hwlen <= sizeof(bootp->chaddr) &&
memcmp(bootp->chaddr, ifp->hwaddr, ifp->hwlen))
{
- char buf[sizeof(bootp->chaddr) * 3];
+ if (IS_STATE_ACTIVE(state)) {
+ char buf[sizeof(bootp->chaddr) * 3];
- logdebugx("%s: xid 0x%x is for hwaddr %s",
- ifp->name, ntohl(bootp->xid),
- hwaddr_ntoa(bootp->chaddr, sizeof(bootp->chaddr),
- buf, sizeof(buf)));
+ logdebugx("%s: xid 0x%x is for hwaddr %s",
+ ifp->name, ntohl(bootp->xid),
+ hwaddr_ntoa(bootp->chaddr, sizeof(bootp->chaddr),
+ buf, sizeof(buf)));
+ }
dhcp_redirect_dhcp(ifp, bootp, bootp_len, from);
return;
}
@@ -2959,10 +2993,7 @@ dhcp_handledhcp(struct interface *ifp, s
}
if (state->state == DHS_BOUND) {
- /* Before we supported FORCERENEW we closed off the raw
- * port so we effectively ignored all messages.
- * As such we'll not log by default here. */
- //LOGDHCP(logdebugx, "bound, ignoring");
+ LOGDHCP(logdebugx, "bound, ignoring");
return;
}
@@ -3239,9 +3270,40 @@ get_udp_data(void *packet, size_t *len)
return p;
}
-static int
-valid_udp_packet(void *packet, size_t plen, struct in_addr *from,
- unsigned int flags)
+static bool
+is_packet_udp_bootp(void *packet, size_t plen)
+{
+ struct ip *ip = packet;
+ size_t ip_hlen;
+ struct udphdr *udp;
+
+ if (sizeof(*ip) > plen)
+ return false;
+
+ if (ip->ip_v != IPVERSION || ip->ip_p != IPPROTO_UDP)
+ return false;
+
+ /* Sanity. */
+ if (ntohs(ip->ip_len) != plen)
+ return false;
+
+ ip_hlen = (size_t)ip->ip_hl * 4;
+ /* Check we have a UDP header and BOOTP. */
+ if (ip_hlen + sizeof(*udp) + offsetof(struct bootp, vend) > plen)
+ return false;
+
+ /* Check it's to and from the right ports. */
+ udp = (struct udphdr *)(void *)((char *)ip + ip_hlen);
+ if (udp->uh_dport != htons(BOOTPC) || udp->uh_sport != htons(BOOTPS))
+ return false;
+
+ return true;
+}
+
+/* Lengths have already been checked. */
+static bool
+checksums_valid(void *packet,
+ struct in_addr *from, unsigned int flags)
{
struct ip *ip = packet;
struct ip pseudo_ip = {
@@ -3250,59 +3312,34 @@ valid_udp_packet(void *packet, size_t pl
.ip_dst = ip->ip_dst
};
size_t ip_hlen;
- uint16_t ip_len, uh_sum;
+ uint16_t udp_len, uh_sum;
struct udphdr *udp;
uint32_t csum;
- if (plen < sizeof(*ip)) {
- if (from != NULL)
- from->s_addr = INADDR_ANY;
- errno = ERANGE;
- return -1;
- }
-
if (from != NULL)
from->s_addr = ip->ip_src.s_addr;
ip_hlen = (size_t)ip->ip_hl * 4;
- if (in_cksum(ip, ip_hlen, NULL) != 0) {
- errno = EINVAL;
- return -1;
- }
-
- /* Check we have a payload */
- ip_len = ntohs(ip->ip_len);
- if (ip_len <= ip_hlen + sizeof(*udp)) {
- errno = ERANGE;
- return -1;
- }
- /* Check we don't go beyond the payload */
- if (ip_len > plen) {
- errno = ENOBUFS;
- return -1;
- }
+ if (in_cksum(ip, ip_hlen, NULL) != 0)
+ return false;
if (flags & BPF_PARTIALCSUM)
return 0;
- /* UDP checksum is based on a pseudo IP header alongside
- * the UDP header and payload. */
udp = (struct udphdr *)(void *)((char *)ip + ip_hlen);
if (udp->uh_sum == 0)
return 0;
+ /* UDP checksum is based on a pseudo IP header alongside
+ * the UDP header and payload. */
+ udp_len = ntohs(udp->uh_ulen);
uh_sum = udp->uh_sum;
udp->uh_sum = 0;
pseudo_ip.ip_len = udp->uh_ulen;
csum = 0;
in_cksum(&pseudo_ip, sizeof(pseudo_ip), &csum);
- csum = in_cksum(udp, ntohs(udp->uh_ulen), &csum);
- if (csum != uh_sum) {
- errno = EINVAL;
- return -1;
- }
-
- return 0;
+ csum = in_cksum(udp, udp_len, &csum);
+ return csum == uh_sum;
}
static void
@@ -3311,13 +3348,12 @@ dhcp_handlebootp(struct interface *ifp,
{
size_t v;
- /* udp_len must be correct because the values are checked in
- * valid_udp_packet(). */
if (len < offsetof(struct bootp, vend)) {
logerrx("%s: truncated packet (%zu) from %s",
ifp->name, len, inet_ntoa(*from));
return;
}
+
/* To make our IS_DHCP macro easy, ensure the vendor
* area has at least 4 octets. */
v = len - offsetof(struct bootp, vend);
@@ -3330,20 +3366,24 @@ dhcp_handlebootp(struct interface *ifp,
}
static void
-dhcp_handlepacket(struct interface *ifp, uint8_t *data, size_t len)
+dhcp_handlebpf(struct interface *ifp, uint8_t *data, size_t len)
{
struct bootp *bootp;
struct in_addr from;
size_t udp_len;
const struct dhcp_state *state = D_CSTATE(ifp);
- if (valid_udp_packet(data, len, &from, state->bpf_flags) == -1) {
- if (errno == EINVAL)
- logerrx("%s: checksum failure from %s",
- ifp->name, inet_ntoa(from));
- else
- logerr("%s: invalid UDP packet from %s",
- ifp->name, inet_ntoa(from));
+ /* Validate filter. */
+ if (!is_packet_udp_bootp(data, len)) {
+#ifdef BPF_DEBUG
+ logerrx("%s: DHCP BPF validation failure", ifp->name);
+#endif
+ return;
+ }
+
+ if (!checksums_valid(data, &from, state->bpf_flags)) {
+ logerrx("%s: checksum failure from %s",
+ ifp->name, inet_ntoa(from));
return;
}
@@ -3359,7 +3399,7 @@ dhcp_handlepacket(struct interface *ifp,
}
static void
-dhcp_readpacket(void *arg)
+dhcp_readbpf(void *arg)
{
struct interface *ifp = arg;
uint8_t buf[MTU_MAX];
@@ -3381,7 +3421,7 @@ dhcp_readpacket(void *arg)
}
break;
}
- dhcp_handlepacket(ifp, buf, (size_t)bytes);
+ dhcp_handlebpf(ifp, buf, (size_t)bytes);
/* Check we still have a state after processing. */
if ((state = D_STATE(ifp)) == NULL)
break;
@@ -3494,7 +3534,7 @@ dhcp_openbpf(struct interface *ifp)
}
eloop_event_add(ifp->ctx->eloop,
- state->bpf_fd, dhcp_readpacket, ifp);
+ state->bpf_fd, dhcp_readbpf, ifp);
return 0;
}
@@ -3926,7 +3966,7 @@ dhcp_abort(struct interface *ifp)
}
}
-void
+struct ipv4_addr *
dhcp_handleifa(int cmd, struct ipv4_addr *ia, pid_t pid)
{
struct interface *ifp;
@@ -3937,7 +3977,7 @@ dhcp_handleifa(int cmd, struct ipv4_addr
ifp = ia->iface;
state = D_STATE(ifp);
if (state == NULL || state->state == DHS_NONE)
- return;
+ return ia;
if (cmd == RTM_DELADDR) {
if (state->addr == ia) {
@@ -3948,37 +3988,37 @@ dhcp_handleifa(int cmd, struct ipv4_addr
* to drop the lease. */
dhcp_drop(ifp, "EXPIRE");
dhcp_start1(ifp);
+ return NULL;
}
- return;
}
if (cmd != RTM_NEWADDR)
- return;
+ return ia;
#ifdef IN_IFF_NOTUSEABLE
if (!(ia->addr_flags & IN_IFF_NOTUSEABLE))
dhcp_finish_dad(ifp, &ia->addr);
else if (ia->addr_flags & IN_IFF_DUPLICATED)
- dhcp_addr_duplicated(ifp, &ia->addr);
+ return dhcp_addr_duplicated(ifp, &ia->addr) ? NULL : ia;
#endif
ifo = ifp->options;
if (ifo->options & DHCPCD_INFORM) {
if (state->state != DHS_INFORM)
dhcp_inform(ifp);
- return;
+ return ia;
}
if (!(ifo->options & DHCPCD_STATIC))
- return;
+ return ia;
if (ifo->req_addr.s_addr != INADDR_ANY)
- return;
+ return ia;
free(state->old);
state->old = state->new;
state->new_len = dhcp_message_new(&state->new, &ia->addr, &ia->mask);
if (state->new == NULL)
- return;
+ return ia;
if (ifp->flags & IFF_POINTOPOINT) {
for (i = 1; i < 255; i++)
if (i != DHO_ROUTER && has_option_mask(ifo->dstmask,i))
@@ -3994,4 +4034,6 @@ dhcp_handleifa(int cmd, struct ipv4_addr
state->addr = ia;
dhcp_inform(ifp);
}
+
+ return ia;
}
Index: src/external/bsd/dhcpcd/dist/src/dhcpcd.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.23.2.1 src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.23.2.2
--- src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.23.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcpcd.c Sat Oct 12 14:44:32 2019
@@ -590,6 +590,12 @@ configure_interface1(struct interface *i
}
}
#endif
+
+ /* If root is network mounted, we don't want to kill the connection
+ * if the DHCP server goes the way of the dodo OR dhcpcd is rebooting
+ * and the lease file has expired. */
+ if (is_root_local() == 0)
+ ifo->options |= DHCPCD_LASTLEASE_EXTEND;
}
int
@@ -1088,8 +1094,13 @@ static void
dhcpcd_checkcarrier(void *arg)
{
struct interface *ifp = arg;
+ int carrier;
- dhcpcd_handlecarrier(ifp->ctx, LINK_UNKNOWN, ifp->flags, ifp->name);
+ /* Check carrier here rather than setting LINK_UNKNOWN.
+ * This is because we force LINK_UNKNOWN as down for wireless which
+ * we do not want when dealing with a route socket overflow. */
+ carrier = if_carrier(ifp);
+ dhcpcd_handlecarrier(ifp->ctx, carrier, ifp->flags, ifp->name);
}
#ifndef SMALL
Index: src/external/bsd/dhcpcd/dist/src/dhcp.h
diff -u src/external/bsd/dhcpcd/dist/src/dhcp.h:1.1.1.10 src/external/bsd/dhcpcd/dist/src/dhcp.h:1.1.1.10.2.1
--- src/external/bsd/dhcpcd/dist/src/dhcp.h:1.1.1.10 Wed Jul 24 09:54:50 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcp.h Sat Oct 12 14:44:32 2019
@@ -260,7 +260,7 @@ int dhcp_get_routes(rb_tree_t *, struct
ssize_t dhcp_env(FILE *, const char *, const struct interface *,
const struct bootp *, size_t);
-void dhcp_handleifa(int, struct ipv4_addr *, pid_t pid);
+struct ipv4_addr *dhcp_handleifa(int, struct ipv4_addr *, pid_t pid);
void dhcp_drop(struct interface *, const char *);
void dhcp_start(struct interface *);
void dhcp_abort(struct interface *);
Index: src/external/bsd/dhcpcd/dist/src/dhcpcd.8.in
diff -u src/external/bsd/dhcpcd/dist/src/dhcpcd.8.in:1.2.2.1 src/external/bsd/dhcpcd/dist/src/dhcpcd.8.in:1.2.2.2
--- src/external/bsd/dhcpcd/dist/src/dhcpcd.8.in:1.2.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcpcd.8.in Sat Oct 12 14:44:32 2019
@@ -24,7 +24,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd August 28, 2019
+.Dd October 9, 2019
.Dt DHCPCD 8
.Os
.Sh NAME
@@ -203,6 +203,15 @@ changes the routes to use the interface
metric.
See options below for controlling which interfaces we allow and deny through
the use of patterns.
+.Pp
+Non-ethernet interfaces and some virtual ethernet interfaces
+such as TAP and bridge are ignored by default,
+as is the FireWire interface.
+To work with these devices they either need to be specified on the command line,
+be listed in
+.Fl Fl allowinterfaces
+or have an interface directive in
+.Pa @SYSCONFDIR@/dhcpcd.conf .
.Ss Hooking into events
.Nm
runs
Index: src/external/bsd/dhcpcd/dist/src/dhcpcd.conf.5.in
diff -u src/external/bsd/dhcpcd/dist/src/dhcpcd.conf.5.in:1.1.1.13.2.1 src/external/bsd/dhcpcd/dist/src/dhcpcd.conf.5.in:1.1.1.13.2.2
--- src/external/bsd/dhcpcd/dist/src/dhcpcd.conf.5.in:1.1.1.13.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcpcd.conf.5.in Sat Oct 12 14:44:32 2019
@@ -24,7 +24,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd August 28, 2019
+.Dd September 8, 2019
.Dt DHCPCD.CONF 5
.Os
.Sh NAME
@@ -454,7 +454,7 @@ Metrics are used to prefer an interface
will supply a default metric of 200 +
.Xr if_nametoindex 3 .
An extra 100 will be added for wireless interfaces.
-.It Ic mudurl Ar url
+.It Ic mudurl Ar url
Specifies the URL for a Manufacturer Usage Description (MUD).
The description is used by upstream network devices to instantiate any
desired access lists.
@@ -725,7 +725,7 @@ DHCP, ND and DHCPv6 allow for the use of
options for DHCP can also be supplied.
Each option needs to be started with the
.Ic define ,
-.Ic definend,
+.Ic definend ,
.Ic define6
or
.Ic vendopt
Index: src/external/bsd/dhcpcd/dist/src/if-bsd.c
diff -u src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.10.2.1 src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.10.2.2
--- src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.10.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/if-bsd.c Sat Oct 12 14:44:32 2019
@@ -101,6 +101,14 @@
#define RT_ADVANCE(x, n) (x += RT_ROUNDUP((n)->sa_len))
#endif
+/* Ignore these interface names which look like ethernet but are virtual. */
+static const char * const ifnames_ignore[] = {
+ "bridge",
+ "fwe", /* Firewire */
+ "tap",
+ NULL
+};
+
#ifdef INET6
static void ifa_setscope(struct sockaddr_in6 *, unsigned int);
static unsigned int ifa_getscope(const struct sockaddr_in6 *);
@@ -208,6 +216,61 @@ if_closesockets_os(struct dhcpcd_ctx *ct
close(priv->pf_inet6_fd);
}
+static bool
+if_ignore1(const char *drvname)
+{
+ const char * const *p;
+
+ for (p = ifnames_ignore; *p; p++) {
+ if (strcmp(*p, drvname) == 0)
+ return true;
+ }
+ return false;
+}
+
+bool
+if_ignore(struct dhcpcd_ctx *ctx, const char *ifname)
+{
+ struct if_spec spec;
+
+ if (if_nametospec(ifname, &spec) != 0)
+ return false;
+
+ if (if_ignore1(spec.drvname))
+ return true;
+
+#ifdef SIOCGIFGROUP
+ struct ifgroupreq ifgr = { .ifgr_len = 0 };
+ struct ifg_req *ifg;
+ size_t ifg_len;
+
+ /* Sadly it is possible to remove the device name
+ * from the interface groups, but hopefully this
+ * will be very unlikely.... */
+
+ strlcpy(ifgr.ifgr_name, ifname, sizeof(ifgr.ifgr_name));
+ if (ioctl(ctx->pf_inet_fd, SIOCGIFGROUP, &ifgr) == -1 ||
+ (ifgr.ifgr_groups = malloc(ifgr.ifgr_len)) == NULL ||
+ ioctl(ctx->pf_inet_fd, SIOCGIFGROUP, &ifgr) == -1)
+ {
+ logerr(__func__);
+ return false;
+ }
+
+ for (ifg = ifgr.ifgr_groups, ifg_len = ifgr.ifgr_len;
+ ifg && ifg_len >= sizeof(*ifg);
+ ifg++, ifg_len -= sizeof(*ifg))
+ {
+ if (if_ignore1(ifg->ifgrq_group))
+ return true;
+ }
+#else
+ UNUSED(ctx);
+#endif
+
+ return false;
+}
+
int
if_carrier(struct interface *ifp)
{
@@ -653,6 +716,12 @@ if_copyrt(struct dhcpcd_ctx *ctx, struct
return -1;
}
#endif
+#ifdef RTF_WASCLONED
+ if (rtm->rtm_flags & RTF_WASCLONED) {
+ errno = ENOTSUP;
+ return -1;
+ }
+#endif
#ifdef RTF_LOCAL
if (rtm->rtm_flags & RTF_LOCAL) {
errno = ENOTSUP;
Index: src/external/bsd/dhcpcd/dist/src/ipv6nd.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.10.2.1 src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.10.2.2
--- src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.10.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/ipv6nd.c Sat Oct 12 14:44:32 2019
@@ -1290,7 +1290,7 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx,
}
}
- if (new_data && !has_address && rap->lifetime && !ipv6_ifanyglobal(ifp))
+ if (new_data && !has_address && rap->lifetime && !ipv6_anyglobal(ifp))
logwarnx("%s: no global addresses for default route",
ifp->name);
Index: src/external/bsd/dhcpcd/dist/src/if-options.c
diff -u src/external/bsd/dhcpcd/dist/src/if-options.c:1.16.2.1 src/external/bsd/dhcpcd/dist/src/if-options.c:1.16.2.2
--- src/external/bsd/dhcpcd/dist/src/if-options.c:1.16.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/if-options.c Sat Oct 12 14:44:32 2019
@@ -520,7 +520,7 @@ parse_addr(__unused struct in_addr *addr
}
#endif
-static const char *
+static void
set_option_space(struct dhcpcd_ctx *ctx,
const char *arg,
const struct dhcp_opt **d, size_t *dl,
@@ -543,7 +543,7 @@ set_option_space(struct dhcpcd_ctx *ctx,
*require = ifo->requiremasknd;
*no = ifo->nomasknd;
*reject = ifo->rejectmasknd;
- return arg + strlen("nd_");
+ return;
}
#ifdef DHCP6
@@ -556,7 +556,7 @@ set_option_space(struct dhcpcd_ctx *ctx,
*require = ifo->requiremask6;
*no = ifo->nomask6;
*reject = ifo->rejectmask6;
- return arg + strlen("dhcp6_");
+ return;
}
#endif
#endif
@@ -576,7 +576,6 @@ set_option_space(struct dhcpcd_ctx *ctx,
*require = ifo->requiremask;
*no = ifo->nomask;
*reject = ifo->rejectmask;
- return arg;
}
void
@@ -806,7 +805,7 @@ parse_option(struct dhcpcd_ctx *ctx, con
break;
case 'o':
ARG_REQUIRED;
- arg = set_option_space(ctx, arg, &d, &dl, &od, &odl, ifo,
+ set_option_space(ctx, arg, &d, &dl, &od, &odl, ifo,
&request, &require, &no, &reject);
if (make_option_mask(d, dl, od, odl, request, arg, 1) != 0 ||
make_option_mask(d, dl, od, odl, no, arg, -1) != 0 ||
@@ -818,7 +817,7 @@ parse_option(struct dhcpcd_ctx *ctx, con
break;
case O_REJECT:
ARG_REQUIRED;
- arg = set_option_space(ctx, arg, &d, &dl, &od, &odl, ifo,
+ set_option_space(ctx, arg, &d, &dl, &od, &odl, ifo,
&request, &require, &no, &reject);
if (make_option_mask(d, dl, od, odl, reject, arg, 1) != 0 ||
make_option_mask(d, dl, od, odl, request, arg, -1) != 0 ||
@@ -1053,7 +1052,7 @@ parse_option(struct dhcpcd_ctx *ctx, con
break;
case 'O':
ARG_REQUIRED;
- arg = set_option_space(ctx, arg, &d, &dl, &od, &odl, ifo,
+ set_option_space(ctx, arg, &d, &dl, &od, &odl, ifo,
&request, &require, &no, &reject);
if (make_option_mask(d, dl, od, odl, request, arg, -1) != 0 ||
make_option_mask(d, dl, od, odl, require, arg, -1) != 0 ||
@@ -1065,7 +1064,7 @@ parse_option(struct dhcpcd_ctx *ctx, con
break;
case 'Q':
ARG_REQUIRED;
- arg = set_option_space(ctx, arg, &d, &dl, &od, &odl, ifo,
+ set_option_space(ctx, arg, &d, &dl, &od, &odl, ifo,
&request, &require, &no, &reject);
if (make_option_mask(d, dl, od, odl, require, arg, 1) != 0 ||
make_option_mask(d, dl, od, odl, request, arg, 1) != 0 ||
@@ -1253,7 +1252,7 @@ parse_option(struct dhcpcd_ctx *ctx, con
break;
case O_DESTINATION:
ARG_REQUIRED;
- arg = set_option_space(ctx, arg, &d, &dl, &od, &odl, ifo,
+ set_option_space(ctx, arg, &d, &dl, &od, &odl, ifo,
&request, &require, &no, &reject);
if (make_option_mask(d, dl, od, odl,
ifo->dstmask, arg, 2) != 0)
Index: src/external/bsd/dhcpcd/dist/src/if.c
diff -u src/external/bsd/dhcpcd/dist/src/if.c:1.1.1.14.2.1 src/external/bsd/dhcpcd/dist/src/if.c:1.1.1.14.2.2
--- src/external/bsd/dhcpcd/dist/src/if.c:1.1.1.14.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/if.c Sat Oct 12 14:44:32 2019
@@ -312,6 +312,7 @@ if_discover(struct dhcpcd_ctx *ctx, stru
struct if_head *ifs;
struct interface *ifp;
struct if_spec spec;
+ bool if_noconf;
#ifdef AF_LINK
const struct sockaddr_dl *sdl;
#ifdef IFLR_ACTIVE
@@ -405,13 +406,6 @@ if_discover(struct dhcpcd_ctx *ctx, stru
continue;
#endif
- /* Don't allow loopback or pointopoint unless explicit */
- if (ifa->ifa_flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) {
- if ((argc == 0 || argc == -1) &&
- ctx->ifac == 0 && !if_hasconf(ctx, spec.devname))
- active = IF_INACTIVE;
- }
-
if (if_vimaster(ctx, spec.devname) == 1) {
logfunc_t *logfunc = argc != 0 ? logerrx : logdebugx;
logfunc("%s: is a Virtual Interface Master, skipping",
@@ -419,6 +413,17 @@ if_discover(struct dhcpcd_ctx *ctx, stru
continue;
}
+ if_noconf = ((argc == 0 || argc == -1) && ctx->ifac == 0 &&
+ !if_hasconf(ctx, spec.devname));
+
+ /* Don't allow loopback or pointopoint unless explicit.
+ * Don't allow some reserved interface names unless explicit. */
+ if (if_noconf) {
+ if (ifa->ifa_flags & (IFF_LOOPBACK | IFF_POINTOPOINT) ||
+ if_ignore(ctx, spec.devname))
+ active = IF_INACTIVE;
+ }
+
ifp = calloc(1, sizeof(*ifp));
if (ifp == NULL) {
logerr(__func__);
@@ -453,27 +458,23 @@ if_discover(struct dhcpcd_ctx *ctx, stru
#ifdef IFT_BRIDGE
case IFT_BRIDGE: /* FALLTHROUGH */
#endif
-#ifdef IFT_PPP
- case IFT_PPP: /* FALLTHROUGH */
-#endif
#ifdef IFT_PROPVIRTUAL
- case IFT_PROPVIRTUAL:
+ case IFT_PROPVIRTUAL: /* FALLTHROUGH */
#endif
-#if defined(IFT_BRIDGE) || defined(IFT_PPP) || defined(IFT_PROPVIRTUAL)
+#ifdef IFT_TUNNEL
+ case IFT_TUNNEL: /* FALLTHROUGH */
+#endif
+ case IFT_PPP:
/* Don't allow unless explicit */
- if ((argc == 0 || argc == -1) &&
- ctx->ifac == 0 && active &&
- !if_hasconf(ctx, ifp->name))
- {
+ if (if_noconf) {
logdebugx("%s: ignoring due to"
" interface type and"
" no config",
ifp->name);
active = IF_INACTIVE;
}
- __fallthrough; /* Appease gcc-7 */
+ __fallthrough; /* appease gcc */
/* FALLTHROUGH */
-#endif
#ifdef IFT_L2VLAN
case IFT_L2VLAN: /* FALLTHROUGH */
#endif
@@ -495,13 +496,11 @@ if_discover(struct dhcpcd_ctx *ctx, stru
#endif
default:
/* Don't allow unless explicit */
- if ((argc == 0 || argc == -1) &&
- ctx->ifac == 0 &&
- !if_hasconf(ctx, ifp->name))
+ if (if_noconf)
active = IF_INACTIVE;
if (active)
logwarnx("%s: unsupported"
- " interface type %.2x",
+ " interface type 0x%.2x",
ifp->name, sdl->sdl_type);
/* Pretend it's ethernet */
ifp->family = ARPHRD_ETHER;
@@ -564,7 +563,7 @@ if_discover(struct dhcpcd_ctx *ctx, stru
default:
if (active)
logwarnx("%s: unsupported"
- " interface family %.2x",
+ " interface family 0x%.2x",
ifp->name, ifp->family);
break;
#endif
Index: src/external/bsd/dhcpcd/dist/src/if.h
diff -u src/external/bsd/dhcpcd/dist/src/if.h:1.1.1.10.2.1 src/external/bsd/dhcpcd/dist/src/if.h:1.1.1.10.2.2
--- src/external/bsd/dhcpcd/dist/src/if.h:1.1.1.10.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/if.h Sat Oct 12 14:44:32 2019
@@ -152,6 +152,7 @@ int if_nametospec(const char *, struct i
int if_conf(struct interface *);
int if_init(struct interface *);
int if_getssid(struct interface *);
+bool if_ignore(struct dhcpcd_ctx *, const char *);
int if_vimaster(const struct dhcpcd_ctx *ctx, const char *);
unsigned short if_vlanid(const struct interface *);
int if_opensockets(struct dhcpcd_ctx *);
Index: src/external/bsd/dhcpcd/dist/src/ipv4.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv4.c:1.1.1.16.2.1 src/external/bsd/dhcpcd/dist/src/ipv4.c:1.1.1.16.2.2
--- src/external/bsd/dhcpcd/dist/src/ipv4.c:1.1.1.16.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/ipv4.c Sat Oct 12 14:44:32 2019
@@ -145,7 +145,7 @@ ipv4_iffindlladdr(struct interface *ifp)
state = IPV4_STATE(ifp);
if (state) {
TAILQ_FOREACH(ap, &state->addrs, next) {
- if (IN_LINKLOCAL(htonl(ap->addr.s_addr)))
+ if (IN_LINKLOCAL(ntohl(ap->addr.s_addr)))
return ap;
}
}
@@ -622,7 +622,6 @@ ipv4_addaddr(struct interface *ifp, cons
{
struct ipv4_state *state;
struct ipv4_addr *ia;
- bool is_new = false;
#ifdef ALIAS_ADDR
int replaced, blank;
struct ipv4_addr *replaced_ia;
@@ -653,8 +652,9 @@ ipv4_addaddr(struct interface *ifp, cons
#ifdef IN_IFF_TENTATIVE
ia->addr_flags = IN_IFF_TENTATIVE;
#endif
- is_new = true;
- }
+ ia->flags = IPV4_AF_NEW;
+ } else
+ ia->flags |= ~IPV4_AF_NEW;
ia->mask = *mask;
ia->brd = *bcast;
@@ -698,7 +698,7 @@ ipv4_addaddr(struct interface *ifp, cons
}
#endif
- if (is_new)
+ if (ia->flags & IPV4_AF_NEW)
TAILQ_INSERT_TAIL(&state->addrs, ia, next);
return ia;
}
@@ -743,8 +743,7 @@ ipv4_applyaddr(void *arg)
#ifdef ARP
/* Announce the preferred address to
* kick ARP caches. */
- if (!(ifp->flags & IFF_NOARP))
- arp_announceaddr(ifp->ctx,&lease->addr);
+ arp_announceaddr(ifp->ctx,&lease->addr);
#endif
}
script_runreason(ifp, state->reason);
@@ -806,8 +805,7 @@ ipv4_applyaddr(void *arg)
rt_build(ifp->ctx, AF_INET);
#ifdef ARP
- if (!(ifp->flags & IFF_NOARP))
- arp_announceaddr(ifp->ctx, &state->addr->addr);
+ arp_announceaddr(ifp->ctx, &state->addr->addr);
#endif
if (state->state == DHS_BOUND) {
@@ -936,13 +934,14 @@ ipv4_handleifa(struct dhcpcd_ctx *ctx,
}
if (addr->s_addr != INADDR_ANY && addr->s_addr != INADDR_BROADCAST) {
- dhcp_handleifa(cmd, ia, pid);
+ ia = dhcp_handleifa(cmd, ia, pid);
#ifdef IPV4LL
- ipv4ll_handleifa(cmd, ia, pid);
+ if (ia != NULL)
+ ipv4ll_handleifa(cmd, ia, pid);
#endif
}
- if (cmd == RTM_DELADDR)
+ if (cmd == RTM_DELADDR && ia != NULL)
free(ia);
}
Index: src/external/bsd/dhcpcd/dist/src/ipv4.h
diff -u src/external/bsd/dhcpcd/dist/src/ipv4.h:1.1.1.9.2.1 src/external/bsd/dhcpcd/dist/src/ipv4.h:1.1.1.9.2.2
--- src/external/bsd/dhcpcd/dist/src/ipv4.h:1.1.1.9.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/ipv4.h Sat Oct 12 14:44:32 2019
@@ -100,6 +100,7 @@ struct ipv4_addr {
TAILQ_HEAD(ipv4_addrhead, ipv4_addr);
#define IPV4_AF_STALE (1U << 0)
+#define IPV4_AF_NEW (1U << 1)
#define IPV4_ADDR_EQ(a1, a2) ((a1) && (a1)->addr.s_addr == (a2)->addr.s_addr)
#define IPV4_MASK1_EQ(a1, a2) ((a1) && (a1)->mask.s_addr == (a2)->mask.s_addr)
Index: src/external/bsd/dhcpcd/dist/src/ipv4ll.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv4ll.c:1.1.1.9 src/external/bsd/dhcpcd/dist/src/ipv4ll.c:1.1.1.9.2.1
--- src/external/bsd/dhcpcd/dist/src/ipv4ll.c:1.1.1.9 Thu Jul 25 08:53:59 2019
+++ src/external/bsd/dhcpcd/dist/src/ipv4ll.c Sat Oct 12 14:44:32 2019
@@ -198,12 +198,16 @@ ipv4ll_not_found(struct interface *ifp)
struct ipv4_addr *ia;
#ifdef KERNEL_RFC5227
struct arp_state *astate;
+ bool new_addr;
#endif
state = IPV4LL_STATE(ifp);
assert(state != NULL);
ia = ipv4_iffindaddr(ifp, &state->pickedaddr, &inaddr_llmask);
+#ifdef KERNEL_RFC5227
+ new_addr = ia == NULL;
+#endif
#ifdef IN_IFF_NOTREADY
if (ia == NULL || ia->addr_flags & IN_IFF_NOTREADY)
#endif
@@ -233,11 +237,13 @@ test:
}
rt_build(ifp->ctx, AF_INET);
#ifdef KERNEL_RFC5227
- astate = arp_new(ifp, &ia->addr);
- if (astate != NULL) {
- astate->announced_cb = ipv4ll_announced_arp;
- astate->free_cb = ipv4ll_arpfree;
- arp_announce(astate);
+ if (!new_addr) {
+ astate = arp_new(ifp, &ia->addr);
+ if (astate != NULL) {
+ astate->announced_cb = ipv4ll_announced_arp;
+ astate->free_cb = ipv4ll_arpfree;
+ arp_announce(astate);
+ }
}
#else
arp_announce(state->arp);
@@ -261,10 +267,12 @@ ipv4ll_found(struct interface *ifp)
{
struct ipv4ll_state *state = IPV4LL_STATE(ifp);
- arp_cancel(state->arp);
+ if (state->arp != NULL)
+ arp_cancel(state->arp);
if (++state->conflicts == MAX_CONFLICTS)
- logerr("%s: failed to acquire an IPv4LL address",
+ logerrx("%s: failed to acquire an IPv4LL address",
ifp->name);
+ state->pickedaddr.s_addr = ipv4ll_pickaddr(ifp);
eloop_timeout_add_sec(ifp->ctx->eloop,
state->conflicts >= MAX_CONFLICTS ?
RATE_LIMIT_INTERVAL : PROBE_WAIT,
@@ -276,11 +284,14 @@ ipv4ll_defend_failed(struct interface *i
{
struct ipv4ll_state *state = IPV4LL_STATE(ifp);
+ if (state->arp != NULL)
+ arp_cancel(state->arp);
ipv4_deladdr(state->addr, 1);
state->down = true;
state->addr = NULL;
rt_build(ifp->ctx, AF_INET);
script_runreason(ifp, "IPV4LL");
+ state->pickedaddr.s_addr = ipv4ll_pickaddr(ifp);
ipv4ll_start1(ifp, state->arp);
}
@@ -544,7 +555,7 @@ ipv4ll_recvrt(__unused int cmd, const st
}
#endif
-void
+struct ipv4_addr *
ipv4ll_handleifa(int cmd, struct ipv4_addr *ia, pid_t pid)
{
struct interface *ifp;
@@ -553,7 +564,7 @@ ipv4ll_handleifa(int cmd, struct ipv4_ad
ifp = ia->iface;
state = IPV4LL_STATE(ifp);
if (state == NULL)
- return;
+ return ia;
if (cmd == RTM_DELADDR &&
state->addr != NULL &&
@@ -562,20 +573,28 @@ ipv4ll_handleifa(int cmd, struct ipv4_ad
loginfox("%s: pid %d deleted IP address %s",
ifp->name, pid, ia->saddr);
ipv4ll_defend_failed(ifp);
- return;
+ return ia;
}
#ifdef IN_IFF_DUPLICATED
if (cmd != RTM_NEWADDR)
- return;
+ return ia;
if (!IN_ARE_ADDR_EQUAL(&state->pickedaddr, &ia->addr))
- return;
+ return ia;
if (!(ia->addr_flags & IN_IFF_NOTUSEABLE))
ipv4ll_not_found(ifp);
else if (ia->addr_flags & IN_IFF_DUPLICATED) {
logerrx("%s: DAD detected %s", ifp->name, ia->saddr);
- ipv4_deladdr(state->addr, 1);
+#ifdef KERNEL_RFC5227
+ arp_freeaddr(ifp, &ia->addr);
+#endif
+ ipv4_deladdr(ia, 1);
+ state->addr = NULL;
+ rt_build(ifp->ctx, AF_INET);
ipv4ll_found(ifp);
+ return NULL;
}
#endif
+
+ return ia;
}
Index: src/external/bsd/dhcpcd/dist/src/ipv4ll.h
diff -u src/external/bsd/dhcpcd/dist/src/ipv4ll.h:1.1.1.7 src/external/bsd/dhcpcd/dist/src/ipv4ll.h:1.1.1.7.2.1
--- src/external/bsd/dhcpcd/dist/src/ipv4ll.h:1.1.1.7 Wed Jul 24 09:54:54 2019
+++ src/external/bsd/dhcpcd/dist/src/ipv4ll.h Sat Oct 12 14:44:32 2019
@@ -64,7 +64,7 @@ ssize_t ipv4ll_env(FILE *, const char *,
void ipv4ll_start(void *);
void ipv4ll_claimed(void *);
void ipv4ll_handle_failure(void *);
-void ipv4ll_handleifa(int, struct ipv4_addr *, pid_t pid);
+struct ipv4_addr *ipv4ll_handleifa(int, struct ipv4_addr *, pid_t pid);
#ifdef HAVE_ROUTE_METRIC
int ipv4ll_recvrt(int, const struct rt *);
#endif
Index: src/external/bsd/dhcpcd/dist/src/ipv6.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv6.c:1.3.2.1 src/external/bsd/dhcpcd/dist/src/ipv6.c:1.3.2.2
--- src/external/bsd/dhcpcd/dist/src/ipv6.c:1.3.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/ipv6.c Sat Oct 12 14:44:32 2019
@@ -1065,28 +1065,31 @@ ipv6_getstate(struct interface *ifp)
}
struct ipv6_addr *
-ipv6_ifanyglobal(struct interface *ifp)
+ipv6_anyglobal(struct interface *sifp)
{
+ struct interface *ifp;
struct ipv6_state *state;
struct ipv6_addr *ia;
- if (ifp->carrier == LINK_DOWN)
- return NULL;
-
- state = IPV6_STATE(ifp);
- if (state == NULL)
- return NULL;
+ TAILQ_FOREACH(ifp, sifp->ctx->ifaces, next) {
+ if (ifp != sifp && ip6_forwarding(ifp->name) != 1)
+ continue;
- TAILQ_FOREACH(ia, &state->addrs, next) {
- if (IN6_IS_ADDR_LINKLOCAL(&ia->addr))
+ state = IPV6_STATE(ifp);
+ if (state == NULL)
continue;
- /* Let's be optimistic.
- * Any decent OS won't forward or accept traffic
- * from/to tentative or detached addresses. */
- if (!(ia->addr_flags & IN6_IFF_DUPLICATED))
- break;
+
+ TAILQ_FOREACH(ia, &state->addrs, next) {
+ if (IN6_IS_ADDR_LINKLOCAL(&ia->addr))
+ continue;
+ /* Let's be optimistic.
+ * Any decent OS won't forward or accept traffic
+ * from/to tentative or detached addresses. */
+ if (!(ia->addr_flags & IN6_IFF_DUPLICATED))
+ return ia;
+ }
}
- return ia;
+ return NULL;
}
void
@@ -1133,7 +1136,7 @@ ipv6_handleifa(struct dhcpcd_ctx *ctx,
return;
if ((state = ipv6_getstate(ifp)) == NULL)
return;
- anyglobal = ipv6_ifanyglobal(ifp) != NULL;
+ anyglobal = ipv6_anyglobal(ifp) != NULL;
TAILQ_FOREACH(ia, &state->addrs, next) {
if (IN6_ARE_ADDR_EQUAL(&ia->addr, addr))
@@ -1252,7 +1255,7 @@ out:
* call rt_build to add/remove the default route. */
if (ifp->active && ifp->options->options & DHCPCD_IPV6 &&
!(ctx->options & DHCPCD_RTBUILD) &&
- (ipv6_ifanyglobal(ifp) != NULL) != anyglobal)
+ (ipv6_anyglobal(ifp) != NULL) != anyglobal)
rt_build(ctx, AF_INET6);
}
@@ -2335,7 +2338,7 @@ inet6_raroutes(rb_tree_t *routes, struct
}
if (rap->lifetime == 0)
continue;
- if (ipv6_ifanyglobal(rap->iface) == NULL)
+ if (ipv6_anyglobal(rap->iface) == NULL)
continue;
rt = inet6_makerouter(rap);
if (rt == NULL)
Index: src/external/bsd/dhcpcd/dist/src/ipv6.h
diff -u src/external/bsd/dhcpcd/dist/src/ipv6.h:1.3.2.1 src/external/bsd/dhcpcd/dist/src/ipv6.h:1.3.2.2
--- src/external/bsd/dhcpcd/dist/src/ipv6.h:1.3.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/ipv6.h Sat Oct 12 14:44:32 2019
@@ -273,7 +273,7 @@ int ipv6_handleifa_addrs(int, struct ipv
struct ipv6_addr *ipv6_iffindaddr(struct interface *,
const struct in6_addr *, int);
int ipv6_hasaddr(const struct interface *);
-struct ipv6_addr *ipv6_ifanyglobal(struct interface *);
+struct ipv6_addr *ipv6_anyglobal(struct interface *);
int ipv6_findaddrmatch(const struct ipv6_addr *, const struct in6_addr *,
unsigned int);
struct ipv6_addr *ipv6_findaddr(struct dhcpcd_ctx *,
Index: src/external/bsd/dhcpcd/dist/src/route.c
diff -u src/external/bsd/dhcpcd/dist/src/route.c:1.1.1.12.2.1 src/external/bsd/dhcpcd/dist/src/route.c:1.1.1.12.2.2
--- src/external/bsd/dhcpcd/dist/src/route.c:1.1.1.12.2.1 Thu Sep 5 08:56:55 2019
+++ src/external/bsd/dhcpcd/dist/src/route.c Sat Oct 12 14:44:32 2019
@@ -594,7 +594,9 @@ rt_add(rb_tree_t *kroutes, struct rt *nr
}
#endif
- if (if_route(RTM_ADD, nrt) != -1) {
+ /* Shouldn't need to check for EEXIST, but some kernels don't
+ * dump the subnet route just after we added the address. */
+ if (if_route(RTM_ADD, nrt) != -1 || errno == EEXIST) {
result = true;
goto out;
}
Index: src/external/bsd/dhcpcd/sbin/dhcpcd/Makefile
diff -u src/external/bsd/dhcpcd/sbin/dhcpcd/Makefile:1.48 src/external/bsd/dhcpcd/sbin/dhcpcd/Makefile:1.48.2.1
--- src/external/bsd/dhcpcd/sbin/dhcpcd/Makefile:1.48 Fri Jul 26 10:49:06 2019
+++ src/external/bsd/dhcpcd/sbin/dhcpcd/Makefile Sat Oct 12 14:44:33 2019
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.48 2019/07/26 10:49:06 roy Exp $
+# $NetBSD: Makefile,v 1.48.2.1 2019/10/12 14:44:33 martin Exp $
#
WARNS?= 6
@@ -13,18 +13,13 @@ SRCS+= if.c if-options.c route.c sa.c s
SRCS+= dhcp-common.c dhcpcd-embedded.c
SRCS+= if-bsd.c
-# Need to generate this for dependencies
-DPSRCS+= dhcpcd-embedded.h dhcpcd-embedded.c
-
CPPFLAGS+= -DHAVE_CONFIG_H -D_OPENBSD_SOURCE
USE_INET?= yes
.if defined(SMALLPROG)
CPPFLAGS+= -DSMALL
-DHCPCD_DEFS= dhcpcd-definitions-small.conf
.else
-DHCPCD_DEFS= dhcpcd-definitions.conf
CPPFLAGS+= -DAUTH
SRCS+= auth.c
.endif
@@ -50,7 +45,7 @@ CPPFLAGS+= -DDHCP6
SRCS+= dhcp6.c
.endif
-CPPFLAGS+= -I${SRCDIR}/include -I${DIST}/src -I${.OBJDIR}
+CPPFLAGS+= -I${SRCDIR}/include -I${DIST}/src
DPADD+= ${LIBUTIL}
LDADD+= -lutil
@@ -64,14 +59,6 @@ FILESMODE_dhcpcd.conf= 644 # -rw-r--r--
MAN= dhcpcd.conf.5 dhcpcd.8
CLEANFILES= dhcpcd.conf.5 dhcpcd.8
-dhcpcd-embedded.h: genembedh ${DHCPCD_DEFS} dhcpcd-embedded.h.in
- ${HOST_SH} ${.ALLSRC} $^ > $@
-
-dhcpcd-embedded.c: genembedc ${DHCPCD_DEFS} dhcpcd-embedded.c.in
- ${HOST_SH} ${.ALLSRC} $^ > $@
-
-CLEANFILES+= dhcpcd-embedded.c dhcpcd-embedded.h
-
.for f in dhcpcd.conf.5 dhcpcd.8
${f}: ${f}.in
${TOOL_SED} ${SED_SYS} ${DIST}/src/${f}.in > $@
Added files:
Index: src/external/bsd/dhcpcd/NetBSD-upgrade
diff -u /dev/null src/external/bsd/dhcpcd/NetBSD-upgrade:1.2.2.2
--- /dev/null Sat Oct 12 14:44:33 2019
+++ src/external/bsd/dhcpcd/NetBSD-upgrade Sat Oct 12 14:44:31 2019
@@ -0,0 +1,18 @@
+$NetBSD: NetBSD-upgrade,v 1.2.2.2 2019/10/12 14:44:31 martin Exp $
+
+dhcpcd releases can be found at https://roy.marples.name/downloads/dhcpcd/
+
+For the import there is a handy autoamated approach
+ tar -xf dhcpcd-X.Y.Z.tar.xz
+ cd dhcpcd-X.Y.Z
+ ./configure
+ make import-src
+ cd /tmp/dhcpcd-X.Y.Z
+ cvs import src/external/bsd/dhcpcd/dist ROY dhcpcd-X_Y_Z
+
+To make local changes to dhcpcd, simply patch and commit
+to the main branch (aka HEAD). Never make local changes on the
+vendor (ROY) branch.
+
+All local changes should be submitted to Roy Marples for inclusion in
+the next vendor release.
Index: src/external/bsd/dhcpcd/dist/src/dhcpcd-embedded.c
diff -u /dev/null src/external/bsd/dhcpcd/dist/src/dhcpcd-embedded.c:1.1.1.2.2.2
--- /dev/null Sat Oct 12 14:44:33 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcpcd-embedded.c Sat Oct 12 14:44:32 2019
@@ -0,0 +1,490 @@
+/*
+ * DO NOT EDIT!
+ * Automatically generated from dhcpcd-embedded.conf
+ * Ths allows us to simply generate DHCP structure without any C programming.
+ */
+
+/*
+ * dhcpcd - DHCP client daemon
+ * Copyright (c) 2006-2019 Roy Marples <[email protected]>
+ * All rights reserved
+
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <unistd.h>
+
+const char * const dhcpcd_embedded_conf[] = {
+#ifdef SMALL
+"define 1 request ipaddress subnet_mask",
+"define 121 rfc3442 classless_static_routes",
+"define 249 rfc3442 ms_classless_static_routes",
+"define 33 request array ipaddress static_routes",
+"define 3 request array ipaddress routers",
+"define 6 array ipaddress domain_name_servers",
+"define 12 dname host_name",
+"define 15 array dname domain_name",
+"define 26 uint16 interface_mtu",
+"define 28 request ipaddress broadcast_address",
+"define 50 ipaddress dhcp_requested_address",
+"define 51 request uint32 dhcp_lease_time",
+"define 52 byte dhcp_option_overload",
+"define 53 byte dhcp_message_type",
+"define 54 ipaddress dhcp_server_identifier",
+"define 55 array byte dhcp_parameter_request_list",
+"define 56 string dhcp_message",
+"define 57 uint16 dhcp_max_message_size",
+"define 58 request uint32 dhcp_renewal_time",
+"define 59 request uint32 dhcp_rebinding_time",
+"define 60 string vendor_class_identifier",
+"define 61 binhex dhcp_client_identifier",
+"define 80 norequest flag rapid_commit",
+"define 81 embed fqdn",
+"embed bitflags=0000NEOS flags",
+"embed byte rcode1",
+"embed byte rcode2",
+"embed optional domain fqdn",
+"define 119 array domain domain_search",
+"definend 1 binhex source_address",
+"definend 2 binhex target_address",
+"definend 3 index embed prefix_information",
+"embed byte length",
+"embed bitflags=LA flags",
+"embed uint32 vltime",
+"embed uint32 pltime",
+"embed uint32 reserved",
+"embed array ip6address prefix",
+"definend 5 embed mtu",
+"embed uint16 reserved",
+"embed uint32 mtu",
+"definend 25 index embed rdnss",
+"embed uint16 reserved",
+"embed uint32 lifetime",
+"embed array ip6address servers",
+"definend 31 index embed dnssl",
+"embed uint16 reserved",
+"embed uint32 lifetime",
+"embed domain search",
+"define6 1 binhex client_id",
+"define6 2 binhex server_id",
+"define6 3 norequest index embed ia_na",
+"embed binhex:4 iaid",
+"embed uint32 t1",
+"embed uint32 t2",
+"encap 5 option",
+"encap 13 option",
+"define6 4 norequest index embed ia_ta",
+"embed uint32 iaid",
+"encap 5 option",
+"encap 13 option",
+"define6 5 norequest index embed ia_addr",
+"embed ip6address ia_addr",
+"embed uint32 pltime",
+"embed uint32 vltime",
+"encap 13 option",
+"define6 12 ip6address unicast",
+"define6 13 norequest embed status_code",
+"embed uint16 status_code",
+"embed optional string message",
+"define6 18 binhex interface_id",
+"define6 19 byte reconfigure_msg",
+"define6 20 flag reconfigure_accept",
+"define6 23 array ip6address name_servers",
+"define6 24 array domain domain_search",
+"define6 39 embed fqdn",
+"embed bitflags=00000NOS flags",
+"embed optional domain fqdn",
+"define6 82 request uint32 sol_max_rt",
+"define6 83 request uint32 inf_max_rt",
+#else
+"define 1 request ipaddress subnet_mask",
+"define 121 rfc3442 classless_static_routes",
+"define 249 rfc3442 ms_classless_static_routes",
+"define 33 request array ipaddress static_routes",
+"define 3 request array ipaddress routers",
+"define 2 uint32 time_offset",
+"define 4 array ipaddress time_servers",
+"define 5 array ipaddress ien116_name_servers",
+"define 6 array ipaddress domain_name_servers",
+"define 7 array ipaddress log_servers",
+"define 8 array ipaddress cookie_servers",
+"define 9 array ipaddress lpr_servers",
+"define 10 array ipaddress impress_servers",
+"define 11 array ipaddress resource_location_servers",
+"define 12 dname host_name",
+"define 13 uint16 boot_size",
+"define 14 string merit_dump",
+"define 15 array dname domain_name",
+"define 16 ipaddress swap_server",
+"define 17 string root_path",
+"define 18 string extensions_path",
+"define 19 byte ip_forwarding",
+"define 20 byte non_local_source_routing",
+"define 21 array ipaddress policy_filter",
+"define 22 uint16 max_dgram_reassembly",
+"define 23 byte default_ip_ttl",
+"define 24 uint32 path_mtu_aging_timeout",
+"define 25 array uint16 path_mtu_plateau_table",
+"define 26 uint16 interface_mtu",
+"define 27 byte all_subnets_local",
+"define 28 request ipaddress broadcast_address",
+"define 29 byte perform_mask_discovery",
+"define 30 byte mask_supplier",
+"define 31 byte router_discovery",
+"define 32 ipaddress router_solicitation_address",
+"define 34 byte trailer_encapsulation",
+"define 35 uint32 arp_cache_timeout",
+"define 36 uint16 ieee802_3_encapsulation",
+"define 37 byte default_tcp_ttl",
+"define 38 uint32 tcp_keepalive_interval",
+"define 39 byte tcp_keepalive_garbage",
+"define 40 string nis_domain",
+"define 41 array ipaddress nis_servers",
+"define 42 array ipaddress ntp_servers",
+"define 43 binhex vendor_encapsulated_options",
+"define 44 array ipaddress netbios_name_servers",
+"define 45 ipaddress netbios_dd_server",
+"define 46 byte netbios_node_type",
+"define 47 string netbios_scope",
+"define 48 array ipaddress font_servers",
+"define 49 array ipaddress x_display_manager",
+"define 50 ipaddress dhcp_requested_address",
+"define 51 request uint32 dhcp_lease_time",
+"define 52 byte dhcp_option_overload",
+"define 53 byte dhcp_message_type",
+"define 54 ipaddress dhcp_server_identifier",
+"define 55 array byte dhcp_parameter_request_list",
+"define 56 string dhcp_message",
+"define 57 uint16 dhcp_max_message_size",
+"define 58 request uint32 dhcp_renewal_time",
+"define 59 request uint32 dhcp_rebinding_time",
+"define 60 string vendor_class_identifier",
+"define 61 binhex dhcp_client_identifier",
+"define 64 string nisplus_domain",
+"define 65 array ipaddress nisplus_servers",
+"define 66 dname tftp_server_name",
+"define 67 string bootfile_name",
+"define 68 array ipaddress mobile_ip_home_agent",
+"define 69 array ipaddress smtp_server",
+"define 70 array ipaddress pop_server",
+"define 71 array ipaddress nntp_server",
+"define 72 array ipaddress www_server",
+"define 73 array ipaddress finger_server",
+"define 74 array ipaddress irc_server",
+"define 75 array ipaddress streettalk_server",
+"define 76 array ipaddress streettalk_directory_assistance_server",
+"define 77 binhex user_class",
+"define 78 embed slp_agent",
+"embed byte mandatory",
+"embed array ipaddress address",
+"define 79 embed slp_service",
+"embed byte mandatory",
+"embed ascii scope_list",
+"define 80 norequest flag rapid_commit",
+"define 81 embed fqdn",
+"embed bitflags=0000NEOS flags",
+"embed byte rcode1",
+"embed byte rcode2",
+"embed optional domain fqdn",
+"define 83 embed isns",
+"embed byte reserved1",
+"embed bitflags=00000SAE functions",
+"embed byte reserved2",
+"embed bitflags=00fFsSCE dd",
+"embed byte reserved3",
+"embed bitflags=0000DMHE admin",
+"embed uint16 reserved4",
+"embed byte reserved5",
+"embed bitflags=0TXPAMSE server_security",
+"embed array ipaddress servers",
+"define 85 array ipaddress nds_servers",
+"define 86 raw nds_tree_name",
+"define 87 raw nds_context",
+"define 88 array domain bcms_controller_names",
+"define 89 array ipaddress bcms_controller_address",
+"define 90 embed auth",
+"embed byte protocol",
+"embed byte algorithm",
+"embed byte rdm",
+"embed binhex:8 replay",
+"embed binhex information",
+"define 91 uint32 client_last_transaction_time",
+"define 92 array ipaddress associated_ip",
+"define 98 string uap_servers",
+"define 99 encap geoconf_civic",
+"embed byte what",
+"embed uint16 country_code",
+"define 100 string posix_timezone",
+"define 101 string tzdb_timezone",
+"define 116 byte auto_configure",
+"define 117 array uint16 name_service_search",
+"define 118 ipaddress subnet_selection",
+"define 119 array domain domain_search",
+"define 120 rfc3361 sip_server",
+"define 122 encap tsp",
+"encap 1 ipaddress dhcp_server",
+"encap 2 ipaddress dhcp_secondary_server",
+"encap 3 rfc3361 provisioning_server",
+"encap 4 embed as_req_as_rep_backoff",
+"embed uint32 nominal",
+"embed uint32 maximum",
+"embed uint32 retry",
+"encap 5 embed ap_req_ap_rep_backoff",
+"embed uint32 nominal",
+"embed uint32 maximum",
+"embed uint32 retry",
+"encap 6 domain kerberos_realm",
+"encap 7 byte ticket_granting_server_utilization",
+"encap 8 byte provisioning_timer",
+"define 123 binhex geoconf",
+"define 124 binhex vivco",
+"define 125 embed vivso",
+"embed uint32 enterprise_number",
+"define 136 array ipaddress pana_agent",
+"define 137 domain lost_server",
+"define 138 array ipaddress capwap_ac",
+"define 139 encap mos_ip",
+"encap 1 array ipaddress is",
+"encap 2 array ipaddress cs",
+"encap 3 array ipaddress es",
+"define 140 encap mos_domain",
+"encap 1 domain is",
+"encap 2 domain cs",
+"encap 3 domain es",
+"define 141 array domain sip_ua_cs_list",
+"define 142 array ipaddress andsf",
+"define 143 array ip6address andsf6",
+"define 144 binhex geoloc",
+"define 145 array byte forcerenew_nonce_capable",
+"define 146 embed rdnss_selection",
+"embed byte prf",
+"embed ipaddress primary",
+"embed ipaddress secondary",
+"embed array domain domains",
+"define 150 array ipaddress tftp_servers",
+"define 161 string mudurl",
+"define 208 binhex pxelinux_magic",
+"define 209 string config_file",
+"define 210 string path_prefix",
+"define 211 uint32 reboot_time",
+"define 212 embed sixrd",
+"embed byte mask_len",
+"embed byte prefix_len",
+"embed ip6address prefix",
+"embed array ipaddress brip_address",
+"define 213 domain access_domain",
+"define 221 encap vss",
+"encap 0 string nvt",
+"encap 1 binhex vpn_id",
+"encap 255 flag global",
+"define 252 string wpad_url",
+"definend 1 binhex source_address",
+"definend 2 binhex target_address",
+"definend 3 index embed prefix_information",
+"embed byte length",
+"embed bitflags=LA flags",
+"embed uint32 vltime",
+"embed uint32 pltime",
+"embed uint32 reserved",
+"embed array ip6address prefix",
+"definend 5 embed mtu",
+"embed uint16 reserved",
+"embed uint32 mtu",
+"definend 25 index embed rdnss",
+"embed uint16 reserved",
+"embed uint32 lifetime",
+"embed array ip6address servers",
+"definend 31 index embed dnssl",
+"embed uint16 reserved",
+"embed uint32 lifetime",
+"embed domain search",
+"define6 1 binhex client_id",
+"define6 2 binhex server_id",
+"define6 3 norequest index embed ia_na",
+"embed binhex:4 iaid",
+"embed uint32 t1",
+"embed uint32 t2",
+"encap 5 option",
+"encap 13 option",
+"define6 4 norequest index embed ia_ta",
+"embed uint32 iaid",
+"encap 5 option",
+"encap 13 option",
+"define6 5 norequest index embed ia_addr",
+"embed ip6address ia_addr",
+"embed uint32 pltime",
+"embed uint32 vltime",
+"encap 13 option",
+"define6 6 array uint16 option_request",
+"define6 7 byte preference",
+"define6 8 uint16 elased_time",
+"define6 9 binhex dhcp_relay_msg",
+"define6 11 embed auth",
+"embed byte protocol",
+"embed byte algorithm",
+"embed byte rdm",
+"embed binhex:8 replay",
+"embed binhex information",
+"define6 12 ip6address unicast",
+"define6 13 norequest embed status_code",
+"embed uint16 status_code",
+"embed optional string message",
+"define6 14 norequest flag rapid_commit",
+"define6 15 binhex user_class",
+"define6 16 binhex vivco",
+"define6 17 embed vivso",
+"embed uint32 enterprise_number",
+"define6 18 binhex interface_id",
+"define6 19 byte reconfigure_msg",
+"define6 20 flag reconfigure_accept",
+"define6 21 array domain sip_servers_names",
+"define6 22 array ip6address sip_servers_addresses",
+"define6 23 array ip6address name_servers",
+"define6 24 array domain domain_search",
+"define6 25 norequest index embed ia_pd",
+"embed binhex:4 iaid",
+"embed uint32 t1",
+"embed uint32 t2",
+"encap 26 option",
+"define6 26 index embed prefix",
+"embed uint32 pltime",
+"embed uint32 vltime",
+"embed byte length",
+"embed ip6address prefix",
+"encap 13 option",
+"encap 67 option",
+"define6 27 array ip6address nis_servers",
+"define6 28 array ip6address nisp_servers",
+"define6 29 string nis_domain_name",
+"define6 30 string nisp_domain_name",
+"define6 31 array ip6address sntp_servers",
+"define6 32 uint32 info_refresh_time",
+"define6 33 array domain bcms_server_d",
+"define6 34 array ip6address bcms_server_a",
+"define6 36 encap geoconf_civic",
+"embed byte what",
+"embed uint16 country_code",
+"define6 37 embed remote_id",
+"embed uint32 enterprise_number",
+"embed binhex remote_id",
+"define6 38 binhex subscriber_id",
+"define6 39 embed fqdn",
+"embed bitflags=00000NOS flags",
+"embed optional domain fqdn",
+"define6 40 array ip6address pana_agent",
+"define6 41 string posix_timezone",
+"define6 42 string tzdb_timezone",
+"define6 43 array uint16 ero",
+"define6 49 domain mip6_hnidf",
+"define6 50 encap mip6_vdinf",
+"encap 71 option",
+"encap 72 option",
+"encap 73 option",
+"define6 51 domain lost_server",
+"define6 52 array ip6address capwap_ac",
+"define6 53 binhex relay_id",
+"define6 54 encap mos_ip",
+"encap 1 array ip6address is",
+"encap 2 array ip6address cs",
+"encap 3 array ip6address es",
+"define6 55 encap mos_domain",
+"encap 1 domain is",
+"encap 2 domain cs",
+"encap 3 domain es",
+"define6 56 encap ntp_server",
+"encap 1 ip6address addr",
+"encap 2 ip6address mcast_addr",
+"encap 3 ip6address fqdn",
+"define6 57 domain access_domain",
+"define6 58 array domain sip_ua_cs_list",
+"define6 59 string bootfile_url",
+"define6 60 binhex bootfile_param",
+"define6 61 array uint16 architecture_types",
+"define6 62 embed nii",
+"embed byte type",
+"embed byte major",
+"embed byte minor",
+"define6 63 binhex geoloc",
+"define6 64 domain aftr_name",
+"define6 67 embed pd_exclude",
+"embed byte prefix_len",
+"embed binhex subnetID",
+"define6 69 encap mip6_idinf",
+"encap 71 option",
+"encap 72 option",
+"encap 73 option",
+"define6 70 encap mip6_udinf",
+"encap 71 option",
+"encap 72 option",
+"encap 73 option",
+"define6 71 embed mip6_hnp",
+"embed byte prefix_len",
+"embed ip6address prefix",
+"define6 72 ip6address mip6_haa",
+"define6 73 domain mip6_haf",
+"define6 74 embed rdnss_selection",
+"embed ip6address server",
+"embed byte prf",
+"embed array domain domains",
+"define6 75 string krb_principal_name",
+"define6 76 string krb_realm_name",
+"define6 78 embed krb_kdc",
+"embed uint16 priority",
+"embed uint16 weight",
+"embed byte transport_type",
+"embed uint16 port",
+"embed ip6address address",
+"embed string realm_name",
+"define6 80 ip6address link_address",
+"define6 82 request uint32 sol_max_rt",
+"define6 83 request uint32 inf_max_rt",
+"define6 89 embed s46_rule",
+"embed bitflags=0000000F flags",
+"embed byte ea_len",
+"embed byte prefix4_len",
+"embed ipaddress ipv4_prefix",
+"embed ip6address ipv6_prefix",
+"define6 90 ip6address s64_br",
+"define6 91 embed s46_dmr",
+"embed byte prefix_len",
+"embed binhex prefix",
+"define6 92 embed s46_v4v6bind",
+"embed ipaddress ipv4_address",
+"embed byte ipv6_prefix_len",
+"embed binhex ipv6_prefix_and_options",
+"define6 93 embed s46_portparams",
+"embed byte offset",
+"embed byte psid_len",
+"embed uint16 psid",
+"define6 94 embed s46_cont_mape",
+"encap 89 option",
+"encap 90 option",
+"define6 95 embed s46_cont_mapt",
+"encap 89 option",
+"encap 91 option",
+"define6 96 embed s46_cont_lw",
+"encap 90 option",
+"encap 92 option",
+"define6 112 string mudurl",
+#endif
+NULL
+};
Index: src/external/bsd/dhcpcd/dist/src/dhcpcd-embedded.h
diff -u /dev/null src/external/bsd/dhcpcd/dist/src/dhcpcd-embedded.h:1.1.1.2.2.2
--- /dev/null Sat Oct 12 14:44:33 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcpcd-embedded.h Sat Oct 12 14:44:32 2019
@@ -0,0 +1,38 @@
+/*
+ * dhcpcd - DHCP client daemon
+ * Copyright (c) 2006-2019 Roy Marples <[email protected]>
+ * All rights reserved
+
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifdef SMALL
+#define INITDEFINES 25
+#define INITDEFINENDS 6
+#define INITDEFINE6S 14
+#else
+#define INITDEFINES 124
+#define INITDEFINENDS 6
+#define INITDEFINE6S 69
+#endif
+
+extern const char * const dhcpcd_embedded_conf[];