Module Name: src
Committed By: martin
Date: Sun Apr 12 08:29:41 UTC 2020
Modified Files:
src/doc [netbsd-9]: 3RDPARTY
src/external/bsd/dhcpcd/dist/src [netbsd-9]: arp.c arp.h bpf.c bpf.h
common.h defs.h dhcp.c dhcp6.c dhcp6.h dhcpcd.c eloop.h if-bsd.c
if-options.c if.c if.h ipv4ll.c ipv6.c ipv6nd.c ipv6nd.h logerr.c
logerr.h
Log Message:
Apply patch, requested by roy in ticket #825:
external/bsd/dhcpcd/dist/src/arp.c (apply patch)
external/bsd/dhcpcd/dist/src/arp.h (apply patch)
external/bsd/dhcpcd/dist/src/bpf.c (apply patch)
external/bsd/dhcpcd/dist/src/bpf.h (apply patch)
external/bsd/dhcpcd/dist/src/common.h (apply patch)
external/bsd/dhcpcd/dist/src/defs.h (apply patch)
external/bsd/dhcpcd/dist/src/dhcp.c (apply patch)
external/bsd/dhcpcd/dist/src/dhcp6.c (apply patch)
external/bsd/dhcpcd/dist/src/dhcp6.h (apply patch)
external/bsd/dhcpcd/dist/src/dhcpcd.c (apply patch)
external/bsd/dhcpcd/dist/src/eloop.h (apply patch)
external/bsd/dhcpcd/dist/src/if-bsd.c (apply patch)
external/bsd/dhcpcd/dist/src/if-options.c (apply patch)
external/bsd/dhcpcd/dist/src/if.c (apply patch)
external/bsd/dhcpcd/dist/src/if.h (apply patch)
external/bsd/dhcpcd/dist/src/ipv4ll.c (apply patch)
external/bsd/dhcpcd/dist/src/ipv6.c (apply patch)
external/bsd/dhcpcd/dist/src/ipv6nd.c (apply patch)
external/bsd/dhcpcd/dist/src/ipv6nd.h (apply patch)
external/bsd/dhcpcd/dist/src/logerr.c (apply patch)
external/bsd/dhcpcd/dist/src/logerr.h (apply patch)
doc/3RDPARTY (apply patch)
Update to dhcpcd-8.1.7 which fixes the following issues:
* Decode interface complex interface names eth0.100:2 eth0i100:2.
This allows us to ignore some virtual interfaces by default
* ARP: Report L2 header address on conflict for more clarity
* DHCP: Support jumbo frames (untested)
* DHCP6: Clean up old lease on failure to confirm/rebind, etc
* RA: Prefer older routers - fixes PR bin/54997
* INET6: Obscure prefixes are now calculated correctly
* macro logerr commands to allow an alternative logger
To generate a diff of this commit:
cvs rdiff -u -r1.1640.2.12 -r1.1640.2.13 src/doc/3RDPARTY
cvs rdiff -u -r1.1.1.11.2.2 -r1.1.1.11.2.3 \
src/external/bsd/dhcpcd/dist/src/arp.c
cvs rdiff -u -r1.1.1.8.2.1 -r1.1.1.8.2.2 \
src/external/bsd/dhcpcd/dist/src/arp.h \
src/external/bsd/dhcpcd/dist/src/common.h
cvs rdiff -u -r1.11.2.2 -r1.11.2.3 src/external/bsd/dhcpcd/dist/src/bpf.c
cvs rdiff -u -r1.1.1.6.2.1 -r1.1.1.6.2.2 \
src/external/bsd/dhcpcd/dist/src/bpf.h
cvs rdiff -u -r1.1.1.25.2.6 -r1.1.1.25.2.7 \
src/external/bsd/dhcpcd/dist/src/defs.h
cvs rdiff -u -r1.23.2.6 -r1.23.2.7 src/external/bsd/dhcpcd/dist/src/dhcp.c
cvs rdiff -u -r1.11.2.4 -r1.11.2.5 src/external/bsd/dhcpcd/dist/src/dhcp6.c
cvs rdiff -u -r1.1.1.12 -r1.1.1.12.2.1 \
src/external/bsd/dhcpcd/dist/src/dhcp6.h
cvs rdiff -u -r1.23.2.5 -r1.23.2.6 src/external/bsd/dhcpcd/dist/src/dhcpcd.c
cvs rdiff -u -r1.1.1.5.2.1 -r1.1.1.5.2.2 \
src/external/bsd/dhcpcd/dist/src/eloop.h
cvs rdiff -u -r1.10.2.4 -r1.10.2.5 src/external/bsd/dhcpcd/dist/src/if-bsd.c
cvs rdiff -u -r1.16.2.3 -r1.16.2.4 \
src/external/bsd/dhcpcd/dist/src/if-options.c
cvs rdiff -u -r1.1.1.14.2.3 -r1.1.1.14.2.4 \
src/external/bsd/dhcpcd/dist/src/if.c
cvs rdiff -u -r1.1.1.10.2.3 -r1.1.1.10.2.4 \
src/external/bsd/dhcpcd/dist/src/if.h
cvs rdiff -u -r1.1.1.9.2.1 -r1.1.1.9.2.2 \
src/external/bsd/dhcpcd/dist/src/ipv4ll.c
cvs rdiff -u -r1.3.2.5 -r1.3.2.6 src/external/bsd/dhcpcd/dist/src/ipv6.c
cvs rdiff -u -r1.10.2.5 -r1.10.2.6 src/external/bsd/dhcpcd/dist/src/ipv6nd.c
cvs rdiff -u -r1.1.1.10.2.2 -r1.1.1.10.2.3 \
src/external/bsd/dhcpcd/dist/src/ipv6nd.h
cvs rdiff -u -r1.2 -r1.2.2.1 src/external/bsd/dhcpcd/dist/src/logerr.c
cvs rdiff -u -r1.1.1.5 -r1.1.1.5.2.1 \
src/external/bsd/dhcpcd/dist/src/logerr.h
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.12 src/doc/3RDPARTY:1.1640.2.13
--- src/doc/3RDPARTY:1.1640.2.12 Tue Jan 28 09:48:33 2020
+++ src/doc/3RDPARTY Sun Apr 12 08:29:40 2020
@@ -1,4 +1,4 @@
-# $NetBSD: 3RDPARTY,v 1.1640.2.12 2020/01/28 09:48:33 martin Exp $
+# $NetBSD: 3RDPARTY,v 1.1640.2.13 2020/04/12 08:29:40 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.1.6
-Current Vers: 8.1.6
+Version: 8.1.7
+Current Vers: 8.1.7
Maintainer: roy
Archive Site: ftp://roy.marples.name/pub/dhcpcd/
Home Page: http://roy.marples.name/projects/dhcpcd/
-Date: 2020-01-27
+Date: 2020-04-10
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.2.2 src/external/bsd/dhcpcd/dist/src/arp.c:1.1.1.11.2.3
--- src/external/bsd/dhcpcd/dist/src/arp.c:1.1.1.11.2.2 Fri Nov 22 08:01:49 2019
+++ src/external/bsd/dhcpcd/dist/src/arp.c Sun Apr 12 08:29:40 2020
@@ -41,7 +41,7 @@
#include <string.h>
#include <unistd.h>
-#define ELOOP_QUEUE 5
+#define ELOOP_QUEUE ELOOP_ARP
#include "config.h"
#include "arp.h"
#include "bpf.h"
@@ -55,8 +55,9 @@
#include "logerr.h"
#if defined(ARP)
-#define ARP_LEN \
- (sizeof(struct arphdr) + (2 * sizeof(uint32_t)) + (2 * HWADDR_LEN))
+#define ARP_LEN \
+ (FRAMEHDRLEN_MAX + \
+ sizeof(struct arphdr) + (2 * sizeof(uint32_t)) + (2 * HWADDR_LEN))
/* ARP debugging can be quite noisy. Enable this for more noise! */
//#define ARP_DEBUG
@@ -115,7 +116,8 @@ static void
arp_report_conflicted(const struct arp_state *astate,
const struct arp_msg *amsg)
{
- char buf[HWADDR_LEN * 3];
+ char abuf[HWADDR_LEN * 3];
+ char fbuf[HWADDR_LEN * 3];
if (amsg == NULL) {
logerrx("%s: DAD detected %s",
@@ -123,9 +125,16 @@ arp_report_conflicted(const struct arp_s
return;
}
- logerrx("%s: hardware address %s claims %s",
- astate->iface->name,
- hwaddr_ntoa(amsg->sha, astate->iface->hwlen, buf, sizeof(buf)),
+ hwaddr_ntoa(amsg->sha, astate->iface->hwlen, abuf, sizeof(abuf));
+ if (bpf_frame_header_len(astate->iface) == 0) {
+ logerrx("%s: %s claims %s",
+ astate->iface->name, abuf, inet_ntoa(astate->addr));
+ return;
+ }
+
+ logerrx("%s: %s(%s) claims %s",
+ astate->iface->name, abuf,
+ hwaddr_ntoa(amsg->fsha, astate->iface->hwlen, fbuf, sizeof(fbuf)),
inet_ntoa(astate->addr));
}
@@ -209,6 +218,7 @@ arp_validate(const struct interface *ifp
static void
arp_packet(struct interface *ifp, uint8_t *data, size_t len)
{
+ size_t fl = bpf_frame_header_len(ifp), falen;
const struct interface *ifn;
struct arphdr ar;
struct arp_msg arm;
@@ -216,6 +226,21 @@ arp_packet(struct interface *ifp, uint8_
struct arp_state *astate, *astaten;
uint8_t *hw_s, *hw_t;
+ /* Copy the frame header source and destination out */
+ memset(&arm, 0, sizeof(arm));
+ if (fl != 0) {
+ hw_s = bpf_frame_header_src(ifp, data, &falen);
+ if (hw_s != NULL && falen <= sizeof(arm.fsha))
+ memcpy(arm.fsha, hw_s, falen);
+ hw_t = bpf_frame_header_dst(ifp, data, &falen);
+ if (hw_t != NULL && falen <= sizeof(arm.ftha))
+ memcpy(arm.ftha, hw_t, falen);
+
+ /* Skip past the frame header */
+ data += fl;
+ len -= fl;
+ }
+
/* We must have a full ARP header */
if (len < sizeof(ar))
return;
Index: src/external/bsd/dhcpcd/dist/src/arp.h
diff -u src/external/bsd/dhcpcd/dist/src/arp.h:1.1.1.8.2.1 src/external/bsd/dhcpcd/dist/src/arp.h:1.1.1.8.2.2
--- src/external/bsd/dhcpcd/dist/src/arp.h:1.1.1.8.2.1 Fri Nov 22 08:01:49 2019
+++ src/external/bsd/dhcpcd/dist/src/arp.h Sun Apr 12 08:29:40 2020
@@ -54,10 +54,13 @@
struct arp_msg {
uint16_t op;
- unsigned char sha[HWADDR_LEN];
+ uint8_t sha[HWADDR_LEN];
struct in_addr sip;
- unsigned char tha[HWADDR_LEN];
+ uint8_t tha[HWADDR_LEN];
struct in_addr tip;
+ /* Frame header and sender to diagnose failures */
+ uint8_t fsha[HWADDR_LEN];
+ uint8_t ftha[HWADDR_LEN];
};
struct arp_state {
Index: src/external/bsd/dhcpcd/dist/src/common.h
diff -u 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.2.2
--- src/external/bsd/dhcpcd/dist/src/common.h:1.1.1.8.2.1 Sat Oct 12 14:44:32 2019
+++ src/external/bsd/dhcpcd/dist/src/common.h Sun Apr 12 08:29:40 2020
@@ -34,6 +34,16 @@
#include <stdint.h>
#include <stdio.h>
+/* Define eloop queues here, as other apps share eloop.h */
+#define ELOOP_DHCPCD 1 /* default queue */
+#define ELOOP_DHCP 2
+#define ELOOP_ARP 3
+#define ELOOP_IPV4LL 4
+#define ELOOP_IPV6 5
+#define ELOOP_IPV6ND 6
+#define ELOOP_IPV6RA_EXPIRE 7
+#define ELOOP_DHCP6 8
+
#ifndef HOSTNAME_MAX_LEN
#define HOSTNAME_MAX_LEN 250 /* 255 - 3 (FQDN) - 2 (DNS enc) */
#endif
Index: src/external/bsd/dhcpcd/dist/src/bpf.c
diff -u src/external/bsd/dhcpcd/dist/src/bpf.c:1.11.2.2 src/external/bsd/dhcpcd/dist/src/bpf.c:1.11.2.3
--- src/external/bsd/dhcpcd/dist/src/bpf.c:1.11.2.2 Sat Oct 12 14:44:32 2019
+++ src/external/bsd/dhcpcd/dist/src/bpf.c Sun Apr 12 08:29:40 2020
@@ -93,6 +93,38 @@ bpf_frame_header_len(const struct interf
}
}
+void *
+bpf_frame_header_src(const struct interface *ifp, void *fh, size_t *len)
+{
+ uint8_t *f = fh;
+
+ switch (ifp->family) {
+ case ARPHRD_ETHER:
+ *len = sizeof(((struct ether_header *)0)->ether_shost);
+ return f + offsetof(struct ether_header, ether_shost);
+ default:
+ *len = 0;
+ errno = ENOTSUP;
+ return NULL;
+ }
+}
+
+void *
+bpf_frame_header_dst(const struct interface *ifp, void *fh, size_t *len)
+{
+ uint8_t *f = fh;
+
+ switch (ifp->family) {
+ case ARPHRD_ETHER:
+ *len = sizeof(((struct ether_header *)0)->ether_dhost);
+ return f + offsetof(struct ether_header, ether_dhost);
+ default:
+ *len = 0;
+ errno = ENOTSUP;
+ return NULL;
+ }
+}
+
static const uint8_t etherbcastaddr[] =
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
@@ -215,7 +247,6 @@ ssize_t
bpf_read(struct interface *ifp, int fd, void *data, size_t len,
unsigned int *flags)
{
- ssize_t fl = (ssize_t)bpf_frame_header_len(ifp);
ssize_t bytes;
struct ipv4_state *state = IPV4_STATE(ifp);
@@ -250,10 +281,10 @@ bpf_read(struct interface *ifp, int fd,
*flags |= BPF_BCAST;
else
*flags &= ~BPF_BCAST;
- payload += fl;
- bytes = (ssize_t)packet.bh_caplen - fl;
- if ((size_t)bytes > len)
+ if (packet.bh_caplen > len)
bytes = (ssize_t)len;
+ else
+ bytes = (ssize_t)packet.bh_caplen;
memcpy(data, payload, (size_t)bytes);
next:
state->buffer_pos += BPF_WORDALIGN(packet.bh_hdrlen +
Index: src/external/bsd/dhcpcd/dist/src/bpf.h
diff -u 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.2.2
--- src/external/bsd/dhcpcd/dist/src/bpf.h:1.1.1.6.2.1 Sat Oct 12 14:44:32 2019
+++ src/external/bsd/dhcpcd/dist/src/bpf.h Sun Apr 12 08:29:40 2020
@@ -57,6 +57,8 @@
extern const char *bpf_name;
size_t bpf_frame_header_len(const struct interface *);
+void *bpf_frame_header_src(const struct interface *, void *, size_t *);
+void *bpf_frame_header_dst(const struct interface *, void *, size_t *);
int bpf_frame_bcast(const struct interface *, const char *frame);
int bpf_open(struct interface *, int (*)(struct interface *, int));
int bpf_close(struct interface *, int);
Index: src/external/bsd/dhcpcd/dist/src/defs.h
diff -u src/external/bsd/dhcpcd/dist/src/defs.h:1.1.1.25.2.6 src/external/bsd/dhcpcd/dist/src/defs.h:1.1.1.25.2.7
--- src/external/bsd/dhcpcd/dist/src/defs.h:1.1.1.25.2.6 Tue Jan 28 09:48:34 2020
+++ src/external/bsd/dhcpcd/dist/src/defs.h Sun Apr 12 08:29:40 2020
@@ -29,7 +29,7 @@
#define CONFIG_H
#define PACKAGE "dhcpcd"
-#define VERSION "8.1.6"
+#define VERSION "8.1.7"
#ifndef CONFIG
# define CONFIG SYSCONFDIR "/" PACKAGE ".conf"
Index: src/external/bsd/dhcpcd/dist/src/dhcp.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp.c:1.23.2.6 src/external/bsd/dhcpcd/dist/src/dhcp.c:1.23.2.7
--- src/external/bsd/dhcpcd/dist/src/dhcp.c:1.23.2.6 Tue Jan 28 09:48:34 2020
+++ src/external/bsd/dhcpcd/dist/src/dhcp.c Sun Apr 12 08:29:40 2020
@@ -56,8 +56,9 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <syslog.h>
-#define ELOOP_QUEUE 2
+#define ELOOP_QUEUE ELOOP_DHCP
#include "config.h"
#include "arp.h"
#include "bpf.h"
@@ -2758,7 +2759,7 @@ whitelisted_ip(const struct if_options *
}
static void
-log_dhcp(logfunc_t *logfunc, const char *msg,
+log_dhcp(int loglevel, const char *msg,
const struct interface *ifp, const struct bootp *bootp, size_t bootp_len,
const struct in_addr *from, int ad)
{
@@ -2805,10 +2806,10 @@ log_dhcp(logfunc_t *logfunc, const char
print_string(sname, sizeof(sname), OT_STRING | OT_DOMAIN,
bootp->sname, sizeof(bootp->sname));
if (a == NULL)
- logfunc("%s: %s %s %s `%s'",
+ logmessage(loglevel, "%s: %s %s %s `%s'",
ifp->name, msg, tfrom, inet_ntoa(addr), sname);
else
- logfunc("%s: %s %s %s %s `%s'",
+ logmessage(loglevel, "%s: %s %s %s %s `%s'",
ifp->name, msg, a, tfrom, inet_ntoa(addr), sname);
} else {
if (r != 0) {
@@ -2816,10 +2817,10 @@ log_dhcp(logfunc_t *logfunc, const char
addr = *from;
}
if (a == NULL)
- logfunc("%s: %s %s %s",
+ logmessage(loglevel, "%s: %s %s %s",
ifp->name, msg, tfrom, inet_ntoa(addr));
else
- logfunc("%s: %s %s %s %s",
+ logmessage(loglevel, "%s: %s %s %s %s",
ifp->name, msg, a, tfrom, inet_ntoa(addr));
}
free(a);
@@ -2949,7 +2950,7 @@ dhcp_handledhcp(struct interface *ifp, s
(uint8_t *)bootp, bootp_len, 4, type,
auth, auth_len) == NULL)
{
- LOGDHCP0(logerrx, "authentication failed");
+ LOGDHCP0(LOG_ERR, "authentication failed");
return;
}
if (state->auth.token)
@@ -2959,10 +2960,10 @@ dhcp_handledhcp(struct interface *ifp, s
loginfox("%s: accepted reconfigure key", ifp->name);
} else if (ifo->auth.options & DHCPCD_AUTH_SEND) {
if (ifo->auth.options & DHCPCD_AUTH_REQUIRE) {
- LOGDHCP0(logerrx, "no authentication");
+ LOGDHCP0(LOG_ERR, "no authentication");
return;
}
- LOGDHCP0(logwarnx, "no authentication");
+ LOGDHCP0(LOG_WARNING, "no authentication");
}
#endif
@@ -2971,20 +2972,20 @@ dhcp_handledhcp(struct interface *ifp, s
if (from->s_addr == INADDR_ANY ||
from->s_addr == INADDR_BROADCAST)
{
- LOGDHCP(logerrx, "discarding Force Renew");
+ LOGDHCP(LOG_ERR, "discarding Force Renew");
return;
}
#ifdef AUTH
if (auth == NULL) {
- LOGDHCP(logerrx, "unauthenticated Force Renew");
+ LOGDHCP(LOG_ERR, "unauthenticated Force Renew");
if (ifo->auth.options & DHCPCD_AUTH_REQUIRE)
return;
}
if (state->state != DHS_BOUND && state->state != DHS_INFORM) {
- LOGDHCP(logdebugx, "not bound, ignoring Force Renew");
+ LOGDHCP(LOG_DEBUG, "not bound, ignoring Force Renew");
return;
}
- LOGDHCP(loginfox, "Force Renew from");
+ LOGDHCP(LOG_INFO, "Force Renew from");
/* The rebind and expire timings are still the same, we just
* enter the renew state early */
if (state->state == DHS_BOUND)
@@ -2995,19 +2996,19 @@ dhcp_handledhcp(struct interface *ifp, s
dhcp_inform(ifp);
}
#else
- LOGDHCP(logerrx, "unauthenticated Force Renew");
+ LOGDHCP(LOG_ERR, "unauthenticated Force Renew");
#endif
return;
}
if (state->state == DHS_BOUND) {
- LOGDHCP(logdebugx, "bound, ignoring");
+ LOGDHCP(LOG_DEBUG, "bound, ignoring");
return;
}
if (state->state == DHS_PROBE) {
/* Ignore any DHCP messages whilst probing a lease to bind. */
- LOGDHCP(logdebugx, "probing, ignoring");
+ LOGDHCP(LOG_DEBUG, "probing, ignoring");
return;
}
@@ -3020,7 +3021,7 @@ dhcp_handledhcp(struct interface *ifp, s
get_option_uint8(ifp->ctx, &tmp,
bootp, bootp_len, (uint8_t)i) == 0)
{
- LOGDHCP(logwarnx, "reject DHCP");
+ LOGDHCP(LOG_WARNING, "reject DHCP");
return;
}
}
@@ -3031,12 +3032,12 @@ dhcp_handledhcp(struct interface *ifp, s
get_option_addr(ifp->ctx, &addr,
bootp, bootp_len, DHO_SERVERID) == -1)
{
- LOGDHCP(logwarnx, "reject NAK");
+ LOGDHCP(LOG_WARNING, "reject NAK");
return;
}
/* We should restart on a NAK */
- LOGDHCP(logwarnx, "NAK:");
+ LOGDHCP(LOG_WARNING, "NAK:");
if ((msg = get_option_string(ifp->ctx,
bootp, bootp_len, DHO_MESSAGE)))
{
@@ -3076,14 +3077,14 @@ dhcp_handledhcp(struct interface *ifp, s
* always true. */
if (type == 0 && i == DHO_SERVERID)
continue;
- LOGDHCP(logwarnx, "reject DHCP");
+ LOGDHCP(LOG_WARNING, "reject DHCP");
return;
}
}
/* DHCP Auto-Configure, RFC 2563 */
if (type == DHCP_OFFER && bootp->yiaddr == 0) {
- LOGDHCP(logwarnx, "no address given");
+ LOGDHCP(LOG_WARNING, "no address given");
if ((msg = get_option_string(ifp->ctx,
bootp, bootp_len, DHO_MESSAGE)))
{
@@ -3097,14 +3098,14 @@ dhcp_handledhcp(struct interface *ifp, s
{
switch (tmp) {
case 0:
- LOGDHCP(logwarnx, "IPv4LL disabled from");
+ LOGDHCP(LOG_WARNING, "IPv4LL disabled from");
ipv4ll_drop(ifp);
#ifdef ARP
arp_drop(ifp);
#endif
break;
case 1:
- LOGDHCP(logwarnx, "IPv4LL enabled from");
+ LOGDHCP(LOG_WARNING, "IPv4LL enabled from");
ipv4ll_start(ifp);
break;
default:
@@ -3127,14 +3128,14 @@ dhcp_handledhcp(struct interface *ifp, s
&&
(bootp->yiaddr == INADDR_ANY || bootp->yiaddr == INADDR_BROADCAST))
{
- LOGDHCP(logwarnx, "reject invalid address");
+ LOGDHCP(LOG_WARNING, "reject invalid address");
return;
}
#ifdef IN_IFF_DUPLICATED
ia = ipv4_iffindaddr(ifp, &lease->addr, NULL);
if (ia && ia->addr_flags & IN_IFF_DUPLICATED) {
- LOGDHCP(logwarnx, "declined duplicate address");
+ LOGDHCP(LOG_WARNING, "declined duplicate address");
if (type)
dhcp_decline(ifp);
ipv4_deladdr(ia, 0);
@@ -3165,7 +3166,7 @@ dhcp_handledhcp(struct interface *ifp, s
goto rapidcommit;
}
- LOGDHCP(loginfox, "offered");
+ LOGDHCP(LOG_INFO, "offered");
if (state->offer_len < bootp_len) {
free(state->offer);
if ((state->offer = malloc(bootp_len)) == NULL) {
@@ -3207,13 +3208,13 @@ dhcp_handledhcp(struct interface *ifp, s
if (type) {
if (type == DHCP_OFFER) {
- LOGDHCP(logwarnx, "ignoring offer of");
+ LOGDHCP(LOG_WARNING, "ignoring offer of");
return;
}
/* We should only be dealing with acks */
if (type != DHCP_ACK) {
- LOGDHCP(logerr, "not ACK or OFFER");
+ LOGDHCP(LOG_ERR, "not ACK or OFFER");
return;
}
@@ -3225,14 +3226,14 @@ dhcp_handledhcp(struct interface *ifp, s
DHO_RAPIDCOMMIT, NULL))
state->state = DHS_REQUEST;
else {
- LOGDHCP(logdebugx, "ignoring ack of");
+ LOGDHCP(LOG_DEBUG, "ignoring ack of");
return;
}
}
rapidcommit:
if (!(ifo->options & DHCPCD_INFORM))
- LOGDHCP(logdebugx, "acknowledged");
+ LOGDHCP(LOG_DEBUG, "acknowledged");
else
ifo->options &= ~DHCPCD_STATIC;
}
@@ -3307,7 +3308,7 @@ is_packet_udp_bootp(void *packet, size_t
memcpy(&udp, (char *)ip + ip_hlen, sizeof(udp));
if (ntohs(udp.uh_ulen) < sizeof(udp))
return false;
- if (ip_hlen + ntohs(udp.uh_ulen) > plen)
+ if (ip_hlen + (size_t)ntohs(udp.uh_ulen) > plen)
return false;
/* Check it's to and from the right ports. */
@@ -3432,9 +3433,10 @@ static void
dhcp_readbpf(void *arg)
{
struct interface *ifp = arg;
- uint8_t buf[MTU_MAX];
+ uint8_t buf[FRAMELEN_MAX];
ssize_t bytes;
struct dhcp_state *state = D_STATE(ifp);
+ ssize_t fl = (ssize_t)bpf_frame_header_len(ifp);
/* Some RAW mechanisms are generic file descriptors, not sockets.
* This means we have no kernel call to just get one packet,
@@ -3451,7 +3453,12 @@ dhcp_readbpf(void *arg)
}
break;
}
- dhcp_packet(ifp, buf, (size_t)bytes);
+ if (bytes < fl) {
+ logerrx("%s: %s: short frame header",
+ __func__, ifp->name);
+ break;
+ }
+ dhcp_packet(ifp, buf + fl, (size_t)(bytes - fl));
/* Check we still have a state after processing. */
if ((state = D_STATE(ifp)) == NULL)
break;
Index: src/external/bsd/dhcpcd/dist/src/dhcp6.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.11.2.4 src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.11.2.5
--- src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.11.2.4 Sun Jan 5 09:38:28 2020
+++ src/external/bsd/dhcpcd/dist/src/dhcp6.c Sun Apr 12 08:29:40 2020
@@ -44,8 +44,9 @@
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
+#include <syslog.h>
-#define ELOOP_QUEUE 4
+#define ELOOP_QUEUE ELOOP_DHCP6
#include "config.h"
#include "common.h"
#include "dhcp.h"
@@ -174,6 +175,12 @@ static void dhcp6_failinform(void *);
static int dhcp6_openudp(unsigned int, struct in6_addr *);
static void dhcp6_recvaddr(void *);
+#ifdef SMALL
+#define dhcp6_hasprefixdelegation(a) (0)
+#else
+static int dhcp6_hasprefixdelegation(struct interface *);
+#endif
+
void
dhcp6_printoptions(const struct dhcpcd_ctx *ctx,
const struct dhcp_opt *opts, size_t opts_len)
@@ -1551,11 +1558,12 @@ dhcp6_startdiscover(void *arg)
struct dhcp6_state *state;
ifp = arg;
+ state = D6_STATE(ifp);
#ifndef SMALL
- dhcp6_delete_delegates(ifp);
+ if (state->reason == NULL || strcmp(state->reason, "TIMEOUT6") != 0)
+ dhcp6_delete_delegates(ifp);
#endif
loginfox("%s: soliciting a DHCPv6 lease", ifp->name);
- state = D6_STATE(ifp);
state->state = DH6S_DISCOVER;
state->RTC = 0;
state->IMD = SOL_MAX_DELAY;
@@ -1606,8 +1614,37 @@ dhcp6_startinform(void *arg)
INF_MAX_RD, dhcp6_failinform, ifp);
}
+static bool
+dhcp6_startdiscoinform(struct interface *ifp)
+{
+ unsigned long long opts = ifp->options->options;
+
+ if (opts & DHCPCD_IA_FORCED || ipv6nd_hasradhcp(ifp, true))
+ dhcp6_startdiscover(ifp);
+ else if (opts & DHCPCD_INFORM6 || ipv6nd_hasradhcp(ifp, false))
+ dhcp6_startinform(ifp);
+ else
+ return false;
+ return true;
+}
+
static void
-dhcp6_fail(struct interface *ifp)
+dhcp6_leaseextend(struct interface *ifp)
+{
+ struct dhcp6_state *state = D6_STATE(ifp);
+ struct ipv6_addr *ia;
+
+ logwarnx("%s: extending DHCPv6 lease", ifp->name);
+ TAILQ_FOREACH(ia, &state->addrs, next) {
+ ia->flags |= IPV6_AF_EXTENDED;
+ /* Set infinite lifetimes. */
+ ia->prefix_pltime = ND6_INFINITE_LIFETIME;
+ ia->prefix_vltime = ND6_INFINITE_LIFETIME;
+ }
+}
+
+static void
+dhcp6_fail(struct interface* ifp)
{
struct dhcp6_state *state = D6_STATE(ifp);
@@ -1618,36 +1655,30 @@ dhcp6_fail(struct interface *ifp)
* mobile clients.
* dhcpcd also has LASTLEASE_EXTEND to extend this lease past it's
* expiry, but this is strictly not RFC compliant in any way or form. */
- if (state->new == NULL ||
- !(ifp->options->options & DHCPCD_LASTLEASE))
+ if (state->new != NULL &&
+ ifp->options->options & DHCPCD_LASTLEASE_EXTEND)
{
+ dhcp6_leaseextend(ifp);
+ dhcp6_bind(ifp, NULL, NULL);
+ } else {
+ dhcp6_freedrop_addrs(ifp, 1, NULL);
#ifndef SMALL
dhcp6_delete_delegates(ifp);
#endif
- if (state->state != DH6S_INFORM)
- dhcp6_startdiscover(ifp);
- return;
- }
-
- switch (state->state) {
- case DH6S_INFORM:
- case DH6S_INFORMED:
- state->state = DH6S_ITIMEDOUT;
- break;
- default:
- state->state = DH6S_TIMEDOUT;
- break;
+ free(state->old);
+ state->old = state->new;
+ state->old_len = state->new_len;
+ state->new = NULL;
+ state->new_len = 0;
+ if (state->old != NULL)
+ script_runreason(ifp, "EXPIRE6");
+ unlink(state->leasefile);
}
- dhcp6_bind(ifp, NULL, NULL);
-
- switch (state->state) {
- case DH6S_BOUND:
- case DH6S_INFORMED:
- break;
- default:
- dhcp6_startdiscover(ifp);
- break;
+ if (!dhcp6_startdiscoinform(ifp)) {
+ logwarnx("%s: no advertising IPv6 router wants DHCP",ifp->name);
+ state->state = DH6S_INIT;
+ eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
}
}
@@ -1681,9 +1712,7 @@ dhcp6_failinform(void *arg)
dhcp6_fail(ifp);
}
-#ifdef SMALL
-#define dhcp6_hasprefixdelegation(a) (0)
-#else
+#ifndef SMALL
static void
dhcp6_failrebind(void *arg)
{
@@ -1809,21 +1838,6 @@ dhcp6_startconfirm(struct interface *ifp
}
static void
-dhcp6_leaseextend(struct interface *ifp)
-{
- struct dhcp6_state *state = D6_STATE(ifp);
- struct ipv6_addr *ia;
-
- logwarnx("%s: extending DHCPv6 lease", ifp->name);
- TAILQ_FOREACH(ia, &state->addrs, next) {
- ia->flags |= IPV6_AF_EXTENDED;
- /* Set infinite lifetimes. */
- ia->prefix_pltime = ND6_INFINITE_LIFETIME;
- ia->prefix_vltime = ND6_INFINITE_LIFETIME;
- }
-}
-
-static void
dhcp6_startexpire(void *arg)
{
struct interface *ifp;
@@ -1832,24 +1846,7 @@ dhcp6_startexpire(void *arg)
eloop_timeout_delete(ifp->ctx->eloop, dhcp6_sendrebind, ifp);
logerrx("%s: DHCPv6 lease expired", ifp->name);
- if (ifp->options->options & DHCPCD_LASTLEASE_EXTEND) {
- struct dhcp6_state *state = D6_STATE(ifp);
-
- dhcp6_leaseextend(ifp);
- ipv6_addaddrs(&state->addrs);
- } else {
- dhcp6_freedrop_addrs(ifp, 1, NULL);
-#ifndef SMALL
- dhcp6_delete_delegates(ifp);
-#endif
- script_runreason(ifp, "EXPIRE6");
- }
- if (!(ifp->options->options & DHCPCD_IPV6RS) ||
- ipv6nd_hasradhcp(ifp) ||
- dhcp6_hasprefixdelegation(ifp))
- dhcp6_startdiscover(ifp);
- else
- logwarnx("%s: no advertising IPv6 router wants DHCP",ifp->name);
+ dhcp6_fail(ifp);
}
static void
@@ -1907,7 +1904,7 @@ dhcp6_checkstatusok(const struct interfa
void * (*f)(void *, size_t, uint16_t, uint16_t *), *farg;
char buf[32], *sbuf;
const char *status;
- logfunc_t *logfunc;
+ int loglevel;
state = D6_STATE(ifp);
f = p ? dhcp6_findoption : dhcp6_findmoption;
@@ -1956,10 +1953,10 @@ dhcp6_checkstatusok(const struct interfa
}
if (state->lerror == code || state->state == DH6S_INIT)
- logfunc = logdebugx;
+ loglevel = LOG_DEBUG;
else
- logfunc = logerrx;
- logfunc("%s: DHCPv6 REPLY: %s", ifp->name, status);
+ loglevel = LOG_ERR;
+ logmessage(loglevel, "%s: DHCPv6 REPLY: %s", ifp->name, status);
free(sbuf);
state->lerror = code;
errno = 0;
@@ -2407,7 +2404,7 @@ dhcp6_deprecateaddrs(struct ipv6_addrhea
if (ia->flags & IPV6_AF_REQUEST) {
ia->prefix_vltime = ia->prefix_pltime = 0;
eloop_q_timeout_delete(ia->iface->ctx->eloop,
- 0, NULL, ia);
+ ELOOP_QUEUE_ALL, NULL, ia);
continue;
}
TAILQ_REMOVE(addrs, ia, next);
@@ -2623,7 +2620,7 @@ dhcp6_startinit(struct interface *ifp)
{
r = dhcp6_readlease(ifp, 1);
if (r == -1) {
- if (errno != ENOENT)
+ if (errno != ENOENT && errno != ESRCH)
logerr("%s: %s", __func__, state->leasefile);
} else if (r != 0) {
/* RFC 3633 section 12.1 */
@@ -2636,7 +2633,7 @@ dhcp6_startinit(struct interface *ifp)
return;
}
}
- dhcp6_startdiscover(ifp);
+ dhcp6_startdiscoinform(ifp);
}
#ifndef SMALL
@@ -2797,16 +2794,16 @@ dhcp6_delegate_prefix(struct interface *
if (!(ap->flags & IPV6_AF_DELEGATEDPFX))
continue;
if (!(ap->flags & IPV6_AF_DELEGATEDLOG)) {
- logfunc_t *logfunc;
+ int loglevel;
if (ap->flags & IPV6_AF_NEW)
- logfunc = loginfox;
+ loglevel = LOG_INFO;
else
- logfunc = logdebugx;
+ loglevel = LOG_DEBUG;
/* We only want to log this the once as we loop
* through many interfaces first. */
ap->flags |= IPV6_AF_DELEGATEDLOG;
- logfunc("%s: delegated prefix %s",
+ logmessage(loglevel, "%s: delegated prefix %s",
ifp->name, ap->saddr);
ap->flags &= ~IPV6_AF_NEW;
}
@@ -2938,9 +2935,9 @@ static void
dhcp6_bind(struct interface *ifp, const char *op, const char *sfrom)
{
struct dhcp6_state *state = D6_STATE(ifp);
- bool has_new = false;
+ bool timedout = (op == NULL), has_new = false, confirmed;
struct ipv6_addr *ia;
- logfunc_t *lognewinfo;
+ int loglevel;
struct timespec now;
TAILQ_FOREACH(ia, &state->addrs, next) {
@@ -2949,25 +2946,30 @@ dhcp6_bind(struct interface *ifp, const
break;
}
}
- lognewinfo = has_new ? loginfox : logdebugx;
- if (op != NULL)
- lognewinfo("%s: %s received from %s", ifp->name, op, sfrom);
+ loglevel = has_new ? LOG_INFO : LOG_DEBUG;
+ if (!timedout) {
+ logmessage(loglevel, "%s: %s received from %s",
+ ifp->name, op, sfrom);
+ /* If we delegated from an unconfirmed lease we MUST drop
+ * them now. Hopefully we have new delegations. */
+ if (state->reason != NULL &&
+ strcmp(state->reason, "TIMEOUT6") == 0)
+ dhcp6_delete_delegates(ifp);
+ state->reason = NULL;
+ } else
+ state->reason = "TIMEOUT6";
+
+ eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
+ clock_gettime(CLOCK_MONOTONIC, &now);
- state->reason = NULL;
- if (state->state != DH6S_ITIMEDOUT)
- eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
switch(state->state) {
case DH6S_INFORM:
- if (state->reason == NULL)
- state->reason = "INFORM6";
- /* FALLTHROUGH */
- case DH6S_ITIMEDOUT:
{
struct dhcp6_option *o;
uint16_t ol;
if (state->reason == NULL)
- state->reason = "ITIMEDOUT";
+ state->reason = "INFORM6";
o = dhcp6_findmoption(state->new, state->new_len,
D6_OPTION_INFO_REFRESH_TIME, &ol);
if (o == NULL || ol != sizeof(uint32_t))
@@ -2999,10 +3001,6 @@ dhcp6_bind(struct interface *ifp, const
case DH6S_CONFIRM:
if (state->reason == NULL)
state->reason = "REBOOT6";
- /* FALLTHROUGH */
- case DH6S_TIMEDOUT:
- if (state->reason == NULL)
- state->reason = "TIMEOUT6";
if (state->renew != 0) {
bool all_expired = true;
@@ -3048,12 +3046,21 @@ dhcp6_bind(struct interface *ifp, const
break;
}
- clock_gettime(CLOCK_MONOTONIC, &now);
- if (state->state == DH6S_TIMEDOUT || state->state == DH6S_ITIMEDOUT) {
+ if (state->state != DH6S_CONFIRM && !timedout) {
+ state->acquired = now;
+ free(state->old);
+ state->old = state->new;
+ state->old_len = state->new_len;
+ state->new = state->recv;
+ state->new_len = state->recv_len;
+ state->recv = NULL;
+ state->recv_len = 0;
+ confirmed = false;
+ } else {
+ /* Reduce timers based on when we got the lease. */
struct timespec diff;
uint32_t diffsec;
- /* Reduce timers */
timespecsub(&now, &state->acquired, &diff);
diffsec = (uint32_t)diff.tv_sec;
if (state->renew && state->renew != ND6_INFINITE_LIFETIME) {
@@ -3071,69 +3078,19 @@ dhcp6_bind(struct interface *ifp, const
if (state->expire && state->expire != ND6_INFINITE_LIFETIME) {
if (state->expire > diffsec)
state->expire -= diffsec;
- else {
- if (!(ifp->options->options &
- DHCPCD_LASTLEASE_EXTEND))
- return;
- state->expire = ND6_INFINITE_LIFETIME;
- }
- }
- if (state->expire == ND6_INFINITE_LIFETIME &&
- ifp->options->options & DHCPCD_LASTLEASE_EXTEND)
- dhcp6_leaseextend(ifp);
-
- /* Restart rebind or renew phases in a second. */
- if (state->expire != ND6_INFINITE_LIFETIME) {
- if (state->rebind == 0 &&
- state->rebind != ND6_INFINITE_LIFETIME)
- state->rebind = 1;
- else if (state->renew == 0 &&
- state->renew != ND6_INFINITE_LIFETIME)
- state->renew = 1;
+ else
+ state->expire = 0;
}
- } else
- state->acquired = now;
-
- switch (state->state) {
- case DH6S_CONFIRM:
- case DH6S_TIMEDOUT:
- case DH6S_ITIMEDOUT:
- break;
- default:
- free(state->old);
- state->old = state->new;
- state->old_len = state->new_len;
- state->new = state->recv;
- state->new_len = state->recv_len;
- state->recv = NULL;
- state->recv_len = 0;
- break;
+ confirmed = true;
}
if (ifp->ctx->options & DHCPCD_TEST)
script_runreason(ifp, "TEST");
else {
- bool timed_out;
-
- switch(state->state) {
- case DH6S_TIMEDOUT:
- case DH6S_ITIMEDOUT:
- timed_out = true;
- break;
- default:
- timed_out = false;
- break;
- }
-
- switch(state->state) {
- case DH6S_INFORM:
- case DH6S_ITIMEDOUT:
+ if (state->state == DH6S_INFORM)
state->state = DH6S_INFORMED;
- break;
- default:
+ else
state->state = DH6S_BOUND;
- break;
- }
if (state->renew && state->renew != ND6_INFINITE_LIFETIME)
eloop_timeout_add_sec(ifp->ctx->eloop,
@@ -3146,31 +3103,30 @@ dhcp6_bind(struct interface *ifp, const
if (state->expire != ND6_INFINITE_LIFETIME)
eloop_timeout_add_sec(ifp->ctx->eloop,
(time_t)state->expire, dhcp6_startexpire, ifp);
- else if (timed_out)
- eloop_timeout_add_sec(ifp->ctx->eloop,
- (time_t)state->expire, dhcp6_startdiscover, ifp);
ipv6_addaddrs(&state->addrs);
- dhcp6_deprecateaddrs(&state->addrs);
+ if (!timedout)
+ dhcp6_deprecateaddrs(&state->addrs);
if (state->state == DH6S_INFORMED)
- lognewinfo("%s: refresh in %"PRIu32" seconds",
+ logmessage(loglevel, "%s: refresh in %"PRIu32" seconds",
ifp->name, state->renew);
else if (state->renew == ND6_INFINITE_LIFETIME)
- lognewinfo("%s: leased for infinity", ifp->name);
+ logmessage(loglevel, "%s: leased for infinity",
+ ifp->name);
else if (state->renew || state->rebind)
- lognewinfo("%s: renew in %"PRIu32", "
+ logmessage(loglevel, "%s: renew in %"PRIu32", "
"rebind in %"PRIu32", "
"expire in %"PRIu32" seconds",
ifp->name,
state->renew, state->rebind, state->expire);
else if (state->expire == 0)
- lognewinfo("%s: will expire", ifp->name);
+ logmessage(loglevel, "%s: will expire", ifp->name);
else
- lognewinfo("%s: expire in %"PRIu32" seconds",
+ logmessage(loglevel, "%s: expire in %"PRIu32" seconds",
ifp->name, state->expire);
rt_build(ifp->ctx, AF_INET6);
- if (!timed_out)
+ if (!confirmed && !timedout)
dhcp6_writelease(ifp);
#ifndef SMALL
dhcp6_delegate_prefix(ifp);
@@ -3286,7 +3242,7 @@ dhcp6_recvif(struct interface *ifp, cons
case DH6S_CONFIRM:
if (dhcp6_validatelease(ifp, r, len, sfrom, NULL) == -1)
{
- dhcp6_startdiscover(ifp);
+ dhcp6_startdiscoinform(ifp);
return;
}
break;
@@ -3325,7 +3281,7 @@ dhcp6_recvif(struct interface *ifp, cons
* until a new one is found.
*/
if (state->state != DH6S_DISCOVER)
- dhcp6_startdiscover(ifp);
+ dhcp6_startdiscoinform(ifp);
return;
}
/* RFC8415 18.2.10.1 */
@@ -3457,13 +3413,11 @@ dhcp6_recvif(struct interface *ifp, cons
memcpy(state->recv, r, len);
state->recv_len = len;
- switch (r->type) {
- case DHCP6_ADVERTISE:
- {
+ if (r->type == DHCP6_ADVERTISE) {
struct ipv6_addr *ia;
if (state->state == DH6S_REQUEST) /* rapid commit */
- break;
+ goto bind;
TAILQ_FOREACH(ia, &state->addrs, next) {
if (!(ia->flags & (IPV6_AF_STALE | IPV6_AF_REQUEST)))
break;
@@ -3476,13 +3430,11 @@ dhcp6_recvif(struct interface *ifp, cons
else
loginfox("%s: ADV %s from %s",
ifp->name, ia->saddr, sfrom);
- if (ifp->ctx->options & DHCPCD_TEST)
- break;
dhcp6_startrequest(ifp);
return;
}
- }
+bind:
dhcp6_bind(ifp, op, sfrom);
}
@@ -3806,12 +3758,17 @@ dhcp6_start(struct interface *ifp, enum
case DH6S_INIT:
goto gogogo;
case DH6S_INFORM:
- if (state->state == DH6S_INFORMED)
+ if (state->state == DH6S_INIT ||
+ state->state == DH6S_INFORMED ||
+ (state->state == DH6S_DISCOVER &&
+ !(ifp->options->options & DHCPCD_IA_FORCED) &&
+ !ipv6nd_hasradhcp(ifp, true)))
dhcp6_startinform(ifp);
break;
case DH6S_REQUEST:
if (ifp->options->options & DHCPCD_DHCP6 &&
- (state->state == DH6S_INFORM ||
+ (state->state == DH6S_INIT ||
+ state->state == DH6S_INFORM ||
state->state == DH6S_INFORMED ||
state->state == DH6S_DELEGATED))
{
@@ -3860,8 +3817,7 @@ gogogo:
dhcp_set_leasefile(state->leasefile, sizeof(state->leasefile),
AF_INET6, ifp);
if (ipv6_linklocal(ifp) == NULL) {
- logdebugx("%s: delaying DHCPv6 soliciation for LL address",
- ifp->name);
+ logdebugx("%s: delaying DHCPv6 for LL address", ifp->name);
ipv6_addlinklocalcallback(ifp, dhcp6_start1, ifp);
return 0;
}
@@ -3884,11 +3840,8 @@ dhcp6_reboot(struct interface *ifp)
case DH6S_BOUND:
dhcp6_startrebind(ifp);
break;
- case DH6S_INFORMED:
- dhcp6_startinform(ifp);
- break;
default:
- dhcp6_startdiscover(ifp);
+ dhcp6_startdiscoinform(ifp);
break;
}
}
@@ -4004,6 +3957,20 @@ dhcp6_abort(struct interface *ifp)
ipv6nd_advertise(ia);
}
#endif
+
+ eloop_timeout_delete(ifp->ctx->eloop, dhcp6_startdiscover, ifp);
+ eloop_timeout_delete(ifp->ctx->eloop, dhcp6_senddiscover, ifp);
+ eloop_timeout_delete(ifp->ctx->eloop, dhcp6_startinform, ifp);
+ eloop_timeout_delete(ifp->ctx->eloop, dhcp6_sendinform, ifp);
+ switch (state->state) {
+ case DH6S_DISCOVER: /* FALLTHROUGH */
+ case DH6S_REQUEST: /* FALLTHROUGH */
+ case DH6S_INFORM:
+ state->state = DH6S_INIT;
+ break;
+ default:
+ break;
+ }
}
void
Index: src/external/bsd/dhcpcd/dist/src/dhcp6.h
diff -u src/external/bsd/dhcpcd/dist/src/dhcp6.h:1.1.1.12 src/external/bsd/dhcpcd/dist/src/dhcp6.h:1.1.1.12.2.1
--- src/external/bsd/dhcpcd/dist/src/dhcp6.h:1.1.1.12 Tue Jul 30 10:23:05 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcp6.h Sun Apr 12 08:29:40 2020
@@ -167,8 +167,6 @@ enum DH6S {
DH6S_RENEW_REQUESTED,
DH6S_PROBE,
DH6S_DELEGATED,
- DH6S_TIMEDOUT,
- DH6S_ITIMEDOUT,
DH6S_RELEASE,
DH6S_RELEASED
};
Index: src/external/bsd/dhcpcd/dist/src/dhcpcd.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.23.2.5 src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.23.2.6
--- src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.23.2.5 Sun Jan 5 09:38:28 2020
+++ src/external/bsd/dhcpcd/dist/src/dhcpcd.c Sun Apr 12 08:29:40 2020
@@ -47,6 +47,7 @@ const char dhcpcd_copyright[] = "Copyrig
#include <string.h>
#include <unistd.h>
#include <time.h>
+#include <syslog.h>
#include "config.h"
#include "arp.h"
@@ -435,7 +436,7 @@ stop_interface(struct interface *ifp)
script_runreason(ifp, "STOPPED");
/* Delete all timeouts for the interfaces */
- eloop_q_timeout_delete(ctx->eloop, 0, NULL, ifp);
+ eloop_q_timeout_delete(ctx->eloop, ELOOP_QUEUE_ALL, NULL, ifp);
/* De-activate the interface */
ifp->active = IF_INACTIVE;
@@ -2044,11 +2045,11 @@ printpidfile:
}
if (ifp == NULL) {
if (ctx.ifc == 0) {
- logfunc_t *logfunc;
+ int loglevel;
- logfunc = ctx.options & DHCPCD_INACTIVE ?
- logdebugx : logerrx;
- logfunc("no valid interfaces found");
+ loglevel = ctx.options & DHCPCD_INACTIVE ?
+ LOG_DEBUG : LOG_ERR;
+ logmessage(loglevel, "no valid interfaces found");
} else
goto exit_failure;
if (!(ctx.options & DHCPCD_LINK)) {
@@ -2092,11 +2093,11 @@ printpidfile:
ctx.options & DHCPCD_LINK &&
!(ctx.options & DHCPCD_WAITIP))
{
- logfunc_t *logfunc;
+ int loglevel;
- logfunc = ctx.options & DHCPCD_INACTIVE ?
- logdebugx : logwarnx;
- logfunc("no interfaces have a carrier");
+ loglevel = ctx.options & DHCPCD_INACTIVE ?
+ LOG_DEBUG : LOG_WARNING;
+ logmessage(loglevel, "no interfaces have a carrier");
if (dhcpcd_daemonise(&ctx))
goto exit_success;
} else if (t > 0 &&
Index: src/external/bsd/dhcpcd/dist/src/eloop.h
diff -u src/external/bsd/dhcpcd/dist/src/eloop.h:1.1.1.5.2.1 src/external/bsd/dhcpcd/dist/src/eloop.h:1.1.1.5.2.2
--- src/external/bsd/dhcpcd/dist/src/eloop.h:1.1.1.5.2.1 Fri Nov 22 08:01:50 2019
+++ src/external/bsd/dhcpcd/dist/src/eloop.h Sun Apr 12 08:29:40 2020
@@ -67,6 +67,9 @@
#define ELOOP_QUEUE 1
#endif
+/* Used for deleting a timeout for all queues. */
+#define ELOOP_QUEUE_ALL 0
+
/* Forward declare eloop - the content should be invisible to the outside */
struct eloop;
Index: src/external/bsd/dhcpcd/dist/src/if-bsd.c
diff -u src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.10.2.4 src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.10.2.5
--- src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.10.2.4 Tue Jan 28 09:48:34 2020
+++ src/external/bsd/dhcpcd/dist/src/if-bsd.c Sun Apr 12 08:29:40 2020
@@ -106,6 +106,7 @@ static const char * const ifnames_ignore
"bridge",
"fwe", /* Firewire */
"tap",
+ "xvif", /* XEN DOM0 -> guest interface */
NULL
};
Index: src/external/bsd/dhcpcd/dist/src/if-options.c
diff -u src/external/bsd/dhcpcd/dist/src/if-options.c:1.16.2.3 src/external/bsd/dhcpcd/dist/src/if-options.c:1.16.2.4
--- src/external/bsd/dhcpcd/dist/src/if-options.c:1.16.2.3 Sun Jan 5 09:38:28 2020
+++ src/external/bsd/dhcpcd/dist/src/if-options.c Sun Apr 12 08:29:40 2020
@@ -1165,7 +1165,7 @@ parse_option(struct dhcpcd_ctx *ctx, con
np = strchr(p, '/');
if (np)
*np++ = '\0';
- if (inet_pton(AF_INET6, p, &ifo->req_addr6) == 1) {
+ if ((i = inet_pton(AF_INET6, p, &ifo->req_addr6)) == 1) {
if (np) {
ifo->req_prefix_len = (uint8_t)strtou(np,
NULL, 0, 0, 128, &e);
@@ -1178,6 +1178,14 @@ parse_option(struct dhcpcd_ctx *ctx, con
} else
ifo->req_prefix_len = 128;
}
+ if (np)
+ *(--np) = '\0';
+ if (i != 1) {
+ logerrx("invalid AF_INET6: %s", p);
+ memset(&ifo->req_addr6, 0,
+ sizeof(ifo->req_addr6));
+ return -1;
+ }
} else
add_environ(&ifo->config, arg, 1);
break;
@@ -1398,8 +1406,8 @@ parse_option(struct dhcpcd_ctx *ctx, con
p = strchr(arg, '/');
if (p)
*p++ = '\0';
- if (inet_pton(AF_INET6, arg, &ia->addr) == -1) {
- logerr("%s", arg);
+ if (inet_pton(AF_INET6, arg, &ia->addr) != 1) {
+ logerrx("invalid AF_INET6: %s", arg);
memset(&ia->addr, 0, sizeof(ia->addr));
}
if (p && ia->ia_type == D6_OPTION_IA_PD) {
Index: src/external/bsd/dhcpcd/dist/src/if.c
diff -u src/external/bsd/dhcpcd/dist/src/if.c:1.1.1.14.2.3 src/external/bsd/dhcpcd/dist/src/if.c:1.1.1.14.2.4
--- src/external/bsd/dhcpcd/dist/src/if.c:1.1.1.14.2.3 Fri Nov 22 08:01:50 2019
+++ src/external/bsd/dhcpcd/dist/src/if.c Sun Apr 12 08:29:40 2020
@@ -30,6 +30,7 @@
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
+#include <syslog.h>
#include "config.h"
@@ -54,6 +55,7 @@
#include <errno.h>
#include <ifaddrs.h>
#include <inttypes.h>
+#include <fcntl.h>
#include <fnmatch.h>
#include <stddef.h>
#include <stdio.h>
@@ -407,8 +409,9 @@ if_discover(struct dhcpcd_ctx *ctx, stru
#endif
if (if_vimaster(ctx, spec.devname) == 1) {
- logfunc_t *logfunc = argc != 0 ? logerrx : logdebugx;
- logfunc("%s: is a Virtual Interface Master, skipping",
+ int loglevel = argc != 0 ? LOG_ERR : LOG_DEBUG;
+ logmessage(loglevel,
+ "%s: is a Virtual Interface Master, skipping",
spec.devname);
continue;
}
@@ -612,11 +615,18 @@ if_discover(struct dhcpcd_ctx *ctx, stru
return ifs;
}
-/* Decode bge0:1 as dev = bge, ppa = 0 and lun = 1 */
+/*
+ * eth0.100:2 OR eth0i100:2 (seems to be NetBSD xvif(4) only)
+ *
+ * drvname == eth
+ * devname == eth0.100 OR eth0i100
+ * ppa = 0
+ * lun = 2
+ */
int
if_nametospec(const char *ifname, struct if_spec *spec)
{
- char *ep;
+ char *ep, *pp;
int e;
if (ifname == NULL || *ifname == '\0' ||
@@ -628,6 +638,8 @@ if_nametospec(const char *ifname, struct
errno = EINVAL;
return -1;
}
+
+ /* :N is an alias */
ep = strchr(spec->drvname, ':');
if (ep) {
spec->lun = (int)strtoi(ep + 1, NULL, 10, 0, INT_MAX, &e);
@@ -640,18 +652,28 @@ if_nametospec(const char *ifname, struct
spec->lun = -1;
ep = spec->drvname + strlen(spec->drvname) - 1;
}
+
strlcpy(spec->devname, spec->drvname, sizeof(spec->devname));
- while (ep > spec->drvname && isdigit((int)*ep))
- ep--;
- if (*ep++ == ':') {
- errno = EINVAL;
- return -1;
+ for (ep = spec->drvname; *ep != '\0' && !isdigit((int)*ep); ep++) {
+ if (*ep == ':') {
+ errno = EINVAL;
+ return -1;
+ }
}
- spec->ppa = (int)strtoi(ep, NULL, 10, 0, INT_MAX, &e);
- if (e != 0)
- spec->ppa = -1;
+ spec->ppa = (int)strtoi(ep, &pp, 10, 0, INT_MAX, &e);
*ep = '\0';
+ /*
+ * . is used for VLAN style names
+ * i is used on NetBSD for xvif interfaces
+ */
+ if (pp != NULL && (*pp == '.' || *pp == 'i')) {
+ spec->vlid = (int)strtoi(pp + 1, NULL, 10, 0, INT_MAX, &e);
+ if (e)
+ spec->vlid = -1;
+ } else
+ spec->vlid = -1;
+
return 0;
}
Index: src/external/bsd/dhcpcd/dist/src/if.h
diff -u src/external/bsd/dhcpcd/dist/src/if.h:1.1.1.10.2.3 src/external/bsd/dhcpcd/dist/src/if.h:1.1.1.10.2.4
--- src/external/bsd/dhcpcd/dist/src/if.h:1.1.1.10.2.3 Fri Nov 22 08:01:50 2019
+++ src/external/bsd/dhcpcd/dist/src/if.h Sun Apr 12 08:29:40 2020
@@ -81,6 +81,11 @@
# define ARPHRD_INFINIBAND 32
#endif
+/* Maximum frame length.
+ * Support jumbo frames and some extra. */
+#define FRAMEHDRLEN_MAX 14 /* only ethernet support */
+#define FRAMELEN_MAX (FRAMEHDRLEN_MAX + 9216)
+
/* Work out if we have a private address or not
* 10/8
* 172.16/12
@@ -145,6 +150,7 @@ struct if_spec {
char devname[IF_NAMESIZE];
char drvname[IF_NAMESIZE];
int ppa;
+ int vlid;
int lun;
};
int if_nametospec(const char *, struct if_spec *);
Index: src/external/bsd/dhcpcd/dist/src/ipv4ll.c
diff -u 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.2.2
--- src/external/bsd/dhcpcd/dist/src/ipv4ll.c:1.1.1.9.2.1 Sat Oct 12 14:44:32 2019
+++ src/external/bsd/dhcpcd/dist/src/ipv4ll.c Sun Apr 12 08:29:40 2020
@@ -36,7 +36,7 @@
#include <string.h>
#include <unistd.h>
-#define ELOOP_QUEUE 6
+#define ELOOP_QUEUE IPV4LL
#include "config.h"
#include "arp.h"
#include "common.h"
Index: src/external/bsd/dhcpcd/dist/src/ipv6.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv6.c:1.3.2.5 src/external/bsd/dhcpcd/dist/src/ipv6.c:1.3.2.6
--- src/external/bsd/dhcpcd/dist/src/ipv6.c:1.3.2.5 Tue Jan 28 09:48:34 2020
+++ src/external/bsd/dhcpcd/dist/src/ipv6.c Sun Apr 12 08:29:40 2020
@@ -36,6 +36,7 @@
#include <net/route.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
+#include <syslog.h>
#include "config.h"
@@ -59,7 +60,7 @@
#include <string.h>
#include <unistd.h>
-#define ELOOP_QUEUE 7
+#define ELOOP_QUEUE ELOOP_IPV6
#include "common.h"
#include "if.h"
#include "dhcpcd.h"
@@ -380,25 +381,14 @@ ipv6_makeaddr(struct in6_addr *addr, str
static int
ipv6_makeprefix(struct in6_addr *prefix, const struct in6_addr *addr, int len)
{
- int bytes, bits;
+ struct in6_addr mask;
+ size_t i;
- if (len < 0 || len > 128) {
- errno = EINVAL;
+ if (ipv6_mask(&mask, len) == -1)
return -1;
- }
-
- bytes = len / NBBY;
- bits = len % NBBY;
- memcpy(&prefix->s6_addr, &addr->s6_addr, (size_t)bytes);
- if (bits != 0) {
- /* Coverify false positive.
- * bytelen cannot be 16 if bitlen is non zero */
- /* coverity[overrun-local] */
- prefix->s6_addr[bytes] =
- (uint8_t)(prefix->s6_addr[bytes] >> (NBBY - bits));
- }
- memset((char *)prefix->s6_addr + bytes, 0,
- sizeof(prefix->s6_addr) - (size_t)bytes);
+ *prefix = *addr;
+ for (i = 0; i < sizeof(prefix->s6_addr); i++)
+ prefix->s6_addr[i] &= mask.s6_addr[i];
return 0;
}
@@ -627,7 +617,7 @@ ipv6_addaddr1(struct ipv6_addr *ia, cons
{
struct interface *ifp;
uint32_t pltime, vltime;
- __printflike(1, 2) void (*logfunc)(const char *, ...);
+ int loglevel;
#ifdef ND6_ADVERTISE
bool vltime_was_zero = ia->prefix_vltime == 0;
#endif
@@ -688,8 +678,8 @@ ipv6_addaddr1(struct ipv6_addr *ia, cons
}
}
- logfunc = ia->flags & IPV6_AF_NEW ? loginfox : logdebugx;
- logfunc("%s: adding %saddress %s", ifp->name,
+ loglevel = ia->flags & IPV6_AF_NEW ? LOG_INFO : LOG_DEBUG;
+ logmessage(loglevel, "%s: adding %saddress %s", ifp->name,
#ifdef IPV6_AF_TEMPORARY
ia->flags & IPV6_AF_TEMPORARY ? "temporary " : "",
#else
@@ -932,7 +922,7 @@ ipv6_doaddr(struct ipv6_addr *ia, struct
if (ia->flags & IPV6_AF_ADDED)
ipv6_deleteaddr(ia);
eloop_q_timeout_delete(ia->iface->ctx->eloop,
- 0, NULL, ia);
+ ELOOP_QUEUE_ALL, NULL, ia);
if (ia->flags & IPV6_AF_REQUEST) {
ia->flags &= ~IPV6_AF_ADDED;
return 0;
@@ -974,6 +964,7 @@ ipv6_addaddrs(struct ipv6_addrhead *iadd
void
ipv6_freeaddr(struct ipv6_addr *ia)
{
+ struct eloop *eloop = ia->iface->ctx->eloop;
#ifndef SMALL
struct ipv6_addr *iad;
@@ -989,10 +980,10 @@ ipv6_freeaddr(struct ipv6_addr *ia)
if (ia->dhcp6_fd != -1) {
close(ia->dhcp6_fd);
- eloop_event_delete(ia->iface->ctx->eloop, ia->dhcp6_fd);
+ eloop_event_delete(eloop, ia->dhcp6_fd);
}
- eloop_q_timeout_delete(ia->iface->ctx->eloop, 0, NULL, ia);
+ eloop_q_timeout_delete(eloop, ELOOP_QUEUE_ALL, NULL, ia);
free(ia->na);
free(ia);
}
@@ -1538,9 +1529,10 @@ ipv6_newaddr(struct interface *ifp, cons
/* If adding a new DHCP / RA derived address, check current flags
* from an existing address. */
ia = ipv6_iffindaddr(ifp, addr, 0);
- if (ia != NULL)
+ if (ia != NULL) {
addr_flags = ia->addr_flags;
- else
+ flags |= IPV6_AF_ADDED;
+ } else
addr_flags = IN6_IFF_TENTATIVE;
ia = calloc(1, sizeof(*ia));
Index: src/external/bsd/dhcpcd/dist/src/ipv6nd.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.10.2.5 src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.10.2.6
--- src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.10.2.5 Tue Jan 28 09:48:34 2020
+++ src/external/bsd/dhcpcd/dist/src/ipv6nd.c Sun Apr 12 08:29:40 2020
@@ -42,8 +42,9 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <syslog.h>
-#define ELOOP_QUEUE 3
+#define ELOOP_QUEUE ELOOP_IPV6ND
#include "common.h"
#include "dhcpcd.h"
#include "dhcp-common.h"
@@ -379,10 +380,8 @@ ipv6nd_sendrsprobe(void *arg)
if (state->rsprobes++ < MAX_RTR_SOLICITATIONS)
eloop_timeout_add_sec(ifp->ctx->eloop,
RTR_SOLICITATION_INTERVAL, ipv6nd_sendrsprobe, ifp);
- else {
+ else
logwarnx("%s: no IPv6 Routers available", ifp->name);
- ipv6nd_drop(ifp);
- }
}
#ifdef ND6_ADVERTISE
@@ -531,19 +530,13 @@ ipv6nd_expire(void *arg)
{
struct interface *ifp = arg;
struct ra *rap;
- struct ipv6_addr *ia;
- struct timespec now = { .tv_sec = 1 };
if (ifp->ctx->ra_routers == NULL)
return;
TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) {
- if (rap->iface == ifp)
- continue;
- rap->acquired = now;
- TAILQ_FOREACH(ia, &rap->addrs, next) {
- ia->acquired = now;
- }
+ if (rap->iface == ifp && rap->willexpire)
+ rap->doexpire = true;
}
ipv6nd_expirera(ifp);
}
@@ -551,9 +544,17 @@ ipv6nd_expire(void *arg)
void
ipv6nd_startexpire(struct interface *ifp)
{
+ struct ra *rap;
- eloop_timeout_add_sec(ifp->ctx->eloop, RTR_CARRIER_EXPIRE,
- ipv6nd_expire, ifp);
+ if (ifp->ctx->ra_routers == NULL)
+ return;
+
+ TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) {
+ if (rap->iface == ifp)
+ rap->willexpire = true;
+ }
+ eloop_q_timeout_add_sec(ifp->ctx->eloop, ELOOP_IPV6RA_EXPIRE,
+ RTR_CARRIER_EXPIRE, ipv6nd_expire, ifp);
}
static int
@@ -584,19 +585,22 @@ ipv6nd_sortrouters(struct dhcpcd_ctx *ct
while ((ra1 = TAILQ_FIRST(ctx->ra_routers)) != NULL) {
TAILQ_REMOVE(ctx->ra_routers, ra1, next);
TAILQ_FOREACH(ra2, &sorted_routers, next) {
- if (ra1->iface->metric < ra2->iface->metric)
+ if (ra1->iface->metric > ra2->iface->metric)
continue;
if (ra1->expired && !ra2->expired)
continue;
+ if (ra1->willexpire && !ra2->willexpire)
+ continue;
if (ra1->lifetime == 0 && ra2->lifetime != 0)
continue;
if (!ra1->isreachable && ra2->reachable)
continue;
- if (ipv6nd_rtpref(ra1) < ipv6nd_rtpref(ra2))
+ if (ipv6nd_rtpref(ra1) <= ipv6nd_rtpref(ra2))
continue;
/* All things being equal, prefer older routers. */
- if (timespeccmp(&ra1->acquired, &ra2->acquired, >=))
- continue;
+ /* We don't need to check time, becase newer
+ * routers are always added to the tail and then
+ * sorted. */
TAILQ_INSERT_BEFORE(ra2, ra1, next);
break;
}
@@ -994,7 +998,7 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx,
bool new_rap, new_data, has_address;
uint32_t old_lifetime;
int ifmtu;
- __printflike(1, 2) void (*logfunc)(const char *, ...);
+ int loglevel;
#ifdef IPV6_MANAGETEMPADDR
uint8_t new_ap;
#endif
@@ -1093,8 +1097,11 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx,
* routers like to decrease the advertised valid and preferred times
* in accordance with the own prefix times which would result in too
* much needless log spam. */
- logfunc = new_data || !rap->isreachable ? loginfox : logdebugx,
- logfunc("%s: Router Advertisement from %s", ifp->name, rap->sfrom);
+ if (rap->willexpire)
+ new_data = true;
+ loglevel = new_data || !rap->isreachable ? LOG_INFO : LOG_DEBUG,
+ logmessage(loglevel, "%s: Router Advertisement from %s",
+ ifp->name, rap->sfrom);
clock_gettime(CLOCK_MONOTONIC, &rap->acquired);
rap->flags = nd_ra->nd_ra_flags_reserved;
@@ -1117,7 +1124,7 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx,
rap->retrans = ntohl(nd_ra->nd_ra_retransmit);
else
rap->retrans = RETRANS_TIMER;
- rap->expired = false;
+ rap->expired = rap->willexpire = rap->doexpire = false;
rap->hasdns = false;
rap->isreachable = true;
has_address = false;
@@ -1177,15 +1184,15 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx,
switch (ndo.nd_opt_type) {
case ND_OPT_PREFIX_INFORMATION:
- logfunc = new_data ? logerrx : logdebugx;
+ loglevel = new_data ? LOG_ERR : LOG_DEBUG;
if (ndo.nd_opt_len != 4) {
- logfunc("%s: invalid option len for prefix",
+ logmessage(loglevel, "%s: invalid option len for prefix",
ifp->name);
continue;
}
memcpy(&pi, p, sizeof(pi));
if (pi.nd_opt_pi_prefix_len > 128) {
- logfunc("%s: invalid prefix len", ifp->name);
+ logmessage(loglevel, "%s: invalid prefix len", ifp->name);
continue;
}
/* nd_opt_pi_prefix is not aligned. */
@@ -1194,13 +1201,13 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx,
if (IN6_IS_ADDR_MULTICAST(&pi_prefix) ||
IN6_IS_ADDR_LINKLOCAL(&pi_prefix))
{
- logfunc("%s: invalid prefix in RA", ifp->name);
+ logmessage(loglevel, "%s: invalid prefix in RA", ifp->name);
continue;
}
if (ntohl(pi.nd_opt_pi_preferred_time) >
ntohl(pi.nd_opt_pi_valid_time))
{
- logfunc("%s: pltime > vltime", ifp->name);
+ logmessage(loglevel, "%s: pltime > vltime", ifp->name);
continue;
}
TAILQ_FOREACH(ap, &rap->addrs, next)
@@ -1280,13 +1287,13 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx,
case ND_OPT_MTU:
if (len < sizeof(mtu)) {
- logfunc("%s: short MTU option", ifp->name);
+ logmessage(loglevel, "%s: short MTU option", ifp->name);
break;
}
memcpy(&mtu, p, sizeof(mtu));
mtu.nd_opt_mtu_mtu = ntohl(mtu.nd_opt_mtu_mtu);
if (mtu.nd_opt_mtu_mtu < IPV6_MMTU) {
- logfunc("%s: invalid MTU %d",
+ logmessage(loglevel, "%s: invalid MTU %d",
ifp->name, mtu.nd_opt_mtu_mtu);
break;
}
@@ -1294,7 +1301,7 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx,
if (ifmtu == -1)
logerr("if_getmtu");
else if (mtu.nd_opt_mtu_mtu > (uint32_t)ifmtu) {
- logfunc("%s: advertised MTU %d"
+ logmessage(loglevel, "%s: advertised MTU %d"
" is greater than link MTU %d",
ifp->name, mtu.nd_opt_mtu_mtu, ifmtu);
rap->mtu = (uint32_t)ifmtu;
@@ -1303,7 +1310,7 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx,
break;
case ND_OPT_RDNSS:
if (len < sizeof(rdnss)) {
- logfunc("%s: short RDNSS option", ifp->name);
+ logmessage(loglevel, "%s: short RDNSS option", ifp->name);
break;
}
memcpy(&rdnss, p, sizeof(rdnss));
@@ -1397,7 +1404,8 @@ ipv6nd_hasralifetime(const struct interf
if (ifp->ctx->ra_routers) {
TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next)
- if (rap->iface == ifp && !rap->expired &&
+ if (rap->iface == ifp &&
+ !rap->expired &&
(!lifetime ||rap->lifetime))
return true;
}
@@ -1405,15 +1413,16 @@ ipv6nd_hasralifetime(const struct interf
}
bool
-ipv6nd_hasradhcp(const struct interface *ifp)
+ipv6nd_hasradhcp(const struct interface *ifp, bool managed)
{
const struct ra *rap;
if (ifp->ctx->ra_routers) {
TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) {
if (rap->iface == ifp &&
- !rap->expired &&
- (rap->flags &(ND_RA_FLAG_MANAGED|ND_RA_FLAG_OTHER)))
+ !rap->expired && !rap->willexpire &&
+ ((managed && rap->flags & ND_RA_FLAG_MANAGED) ||
+ (!managed && rap->flags & ND_RA_FLAG_OTHER)))
return true;
}
}
@@ -1604,7 +1613,7 @@ ipv6nd_expirera(void *arg)
lt.tv_sec = (time_t)rap->lifetime;
lt.tv_nsec = 0;
timespecadd(&rap->acquired, <, &expire);
- if (timespeccmp(&now, &expire, >)) {
+ if (timespeccmp(&now, &expire, >) || rap->doexpire) {
if (!rap->expired) {
logwarnx("%s: %s: router expired",
ifp->name, rap->sfrom);
@@ -1626,14 +1635,16 @@ ipv6nd_expirera(void *arg)
TAILQ_FOREACH(ia, &rap->addrs, next) {
if (ia->prefix_vltime == 0)
continue;
- if (ia->prefix_vltime == ND6_INFINITE_LIFETIME) {
+ if (ia->prefix_vltime == ND6_INFINITE_LIFETIME &&
+ !rap->doexpire)
+ {
valid = true;
continue;
}
lt.tv_sec = (time_t)ia->prefix_vltime;
lt.tv_nsec = 0;
timespecadd(&ia->acquired, <, &expire);
- if (timespeccmp(&now, &expire, >)) {
+ if (timespeccmp(&now, &expire, >) || rap->doexpire) {
if (ia->flags & IPV6_AF_ADDED) {
logwarnx("%s: expired address %s",
ia->iface->name, ia->saddr);
@@ -1700,6 +1711,10 @@ ipv6nd_expirera(void *arg)
if (ltime == 0)
continue;
+ if (rap->doexpire) {
+ expired = true;
+ continue;
+ }
if (ltime == ND6_INFINITE_LIFETIME) {
valid = true;
continue;
@@ -1735,7 +1750,8 @@ ipv6nd_expirera(void *arg)
eloop_timeout_add_tv(ifp->ctx->eloop,
&next, ipv6nd_expirera, ifp);
if (expired) {
- logwarnx("%s: part of Router Advertisement expired", ifp->name);
+ logwarnx("%s: part of a Router Advertisement expired",
+ ifp->name);
rt_build(ifp->ctx, AF_INET6);
script_runreason(ifp, "ROUTERADVERT");
}
Index: src/external/bsd/dhcpcd/dist/src/ipv6nd.h
diff -u src/external/bsd/dhcpcd/dist/src/ipv6nd.h:1.1.1.10.2.2 src/external/bsd/dhcpcd/dist/src/ipv6nd.h:1.1.1.10.2.3
--- src/external/bsd/dhcpcd/dist/src/ipv6nd.h:1.1.1.10.2.2 Fri Nov 22 08:01:50 2019
+++ src/external/bsd/dhcpcd/dist/src/ipv6nd.h Sun Apr 12 08:29:40 2020
@@ -54,6 +54,8 @@ struct ra {
struct ipv6_addrhead addrs;
bool hasdns;
bool expired;
+ bool willexpire;
+ bool doexpire;
bool isreachable;
};
@@ -108,7 +110,7 @@ ssize_t ipv6nd_free(struct interface *);
void ipv6nd_expirera(void *arg);
bool ipv6nd_hasralifetime(const struct interface *, bool);
#define ipv6nd_hasra(i) ipv6nd_hasralifetime((i), false)
-bool ipv6nd_hasradhcp(const struct interface *);
+bool ipv6nd_hasradhcp(const struct interface *, bool);
void ipv6nd_handleifa(int, struct ipv6_addr *, pid_t);
int ipv6nd_dadcompleted(const struct interface *);
void ipv6nd_advertise(struct ipv6_addr *);
Index: src/external/bsd/dhcpcd/dist/src/logerr.c
diff -u src/external/bsd/dhcpcd/dist/src/logerr.c:1.2 src/external/bsd/dhcpcd/dist/src/logerr.c:1.2.2.1
--- src/external/bsd/dhcpcd/dist/src/logerr.c:1.2 Wed Jul 24 15:06:21 2019
+++ src/external/bsd/dhcpcd/dist/src/logerr.c Sun Apr 12 08:29:40 2020
@@ -224,7 +224,7 @@ vlogmessage(int pri, const char *fmt, va
#pragma GCC diagnostic pop
#endif
-__printflike(2, 3) static void
+__printflike(2, 3) void
logmessage(int pri, const char *fmt, ...)
{
va_list args;
@@ -244,8 +244,18 @@ vlogerrmessage(int pri, const char *fmt,
logmessage(pri, "%s: %s", buf, strerror(_errno));
}
+__printflike(2, 3) void
+logerrmessage(int pri, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ vlogerrmessage(pri, fmt, args);
+ va_end(args);
+}
+
void
-logdebug(const char *fmt, ...)
+log_debug(const char *fmt, ...)
{
va_list args;
@@ -255,7 +265,7 @@ logdebug(const char *fmt, ...)
}
void
-logdebugx(const char *fmt, ...)
+log_debugx(const char *fmt, ...)
{
va_list args;
@@ -265,7 +275,7 @@ logdebugx(const char *fmt, ...)
}
void
-loginfo(const char *fmt, ...)
+log_info(const char *fmt, ...)
{
va_list args;
@@ -275,7 +285,7 @@ loginfo(const char *fmt, ...)
}
void
-loginfox(const char *fmt, ...)
+log_infox(const char *fmt, ...)
{
va_list args;
@@ -285,7 +295,7 @@ loginfox(const char *fmt, ...)
}
void
-logwarn(const char *fmt, ...)
+log_warn(const char *fmt, ...)
{
va_list args;
@@ -295,7 +305,7 @@ logwarn(const char *fmt, ...)
}
void
-logwarnx(const char *fmt, ...)
+log_warnx(const char *fmt, ...)
{
va_list args;
@@ -305,7 +315,7 @@ logwarnx(const char *fmt, ...)
}
void
-logerr(const char *fmt, ...)
+log_err(const char *fmt, ...)
{
va_list args;
@@ -315,7 +325,7 @@ logerr(const char *fmt, ...)
}
void
-logerrx(const char *fmt, ...)
+log_errx(const char *fmt, ...)
{
va_list args;
Index: src/external/bsd/dhcpcd/dist/src/logerr.h
diff -u src/external/bsd/dhcpcd/dist/src/logerr.h:1.1.1.5 src/external/bsd/dhcpcd/dist/src/logerr.h:1.1.1.5.2.1
--- src/external/bsd/dhcpcd/dist/src/logerr.h:1.1.1.5 Wed Jul 24 09:54:55 2019
+++ src/external/bsd/dhcpcd/dist/src/logerr.h Sun Apr 12 08:29:40 2020
@@ -39,17 +39,42 @@
#endif
#endif /* !__printflike */
-__printflike(1, 2) typedef void logfunc_t(const char *, ...);
-
-__printflike(1, 2) void logdebug(const char *, ...);
-__printflike(1, 2) void logdebugx(const char *, ...);
-__printflike(1, 2) void loginfo(const char *, ...);
-__printflike(1, 2) void loginfox(const char *, ...);
-__printflike(1, 2) void logwarn(const char *, ...);
-__printflike(1, 2) void logwarnx(const char *, ...);
-__printflike(1, 2) void logerr(const char *, ...);
+/* Please do not call log_* functions directly, use macros below */
+__printflike(1, 2) void log_debug(const char *, ...);
+__printflike(1, 2) void log_debugx(const char *, ...);
+__printflike(1, 2) void log_info(const char *, ...);
+__printflike(1, 2) void log_infox(const char *, ...);
+__printflike(1, 2) void log_warn(const char *, ...);
+__printflike(1, 2) void log_warnx(const char *, ...);
+__printflike(1, 2) void log_err(const char *, ...);
+__printflike(1, 2) void log_errx(const char *, ...);
#define LOGERROR logerr("%s: %d", __FILE__, __LINE__)
-__printflike(1, 2) void logerrx(const char *, ...);
+
+__printflike(2, 3) void logmessage(int pri, const char *fmt, ...);
+__printflike(2, 3) void logerrmessage(int pri, const char *fmt, ...);
+
+/*
+ * These are macros to prevent taking address of them so
+ * __FILE__, __LINE__, etc can easily be added.
+ *
+ * We should be using
+ * #define loginfox(fmt, __VA_OPT__(,) __VA_ARGS__)
+ * but that requires gcc-8 or clang-6 and we still have a need to support
+ * old OS's without modern compilers.
+ *
+ * Likewise, ##__VA_ARGS__ can't be used as that's a gcc only extension.
+ *
+ * The solution is to put fmt into __VA_ARGS__.
+ * It's not pretty but it's 100% portable.
+ */
+#define logdebug(...) log_debug(__VA_ARGS__)
+#define logdebugx(...) log_debugx(__VA_ARGS__)
+#define loginfo(...) log_info(__VA_ARGS__)
+#define loginfox(...) log_infox(__VA_ARGS__)
+#define logwarn(...) log_warn(__VA_ARGS__)
+#define logwarnx(...) log_warnx(__VA_ARGS__)
+#define logerr(...) log_err(__VA_ARGS__)
+#define logerrx(...) log_errx(__VA_ARGS__)
void logsetopts(unsigned int);
#define LOGERR_DEBUG (1U << 6)