Module Name:    src
Committed By:   roy
Date:           Wed Nov 26 13:43:06 UTC 2014

Modified Files:
        src/external/bsd/dhcpcd/dist: arp.c defs.h dhcp.c dhcp6.c dhcpcd.8.in
            dhcpcd.c dhcpcd.h if-options.c if-options.h if.c ipv4.c ipv4.h
            ipv6nd.c

Log Message:
Sync


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/external/bsd/dhcpcd/dist/arp.c \
    src/external/bsd/dhcpcd/dist/defs.h src/external/bsd/dhcpcd/dist/dhcpcd.h \
    src/external/bsd/dhcpcd/dist/ipv4.c
cvs rdiff -u -r1.23 -r1.24 src/external/bsd/dhcpcd/dist/dhcp.c
cvs rdiff -u -r1.6 -r1.7 src/external/bsd/dhcpcd/dist/dhcp6.c \
    src/external/bsd/dhcpcd/dist/if-options.h \
    src/external/bsd/dhcpcd/dist/if.c src/external/bsd/dhcpcd/dist/ipv4.h
cvs rdiff -u -r1.36 -r1.37 src/external/bsd/dhcpcd/dist/dhcpcd.8.in
cvs rdiff -u -r1.17 -r1.18 src/external/bsd/dhcpcd/dist/dhcpcd.c \
    src/external/bsd/dhcpcd/dist/ipv6nd.c
cvs rdiff -u -r1.18 -r1.19 src/external/bsd/dhcpcd/dist/if-options.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/dhcpcd/dist/arp.c
diff -u src/external/bsd/dhcpcd/dist/arp.c:1.7 src/external/bsd/dhcpcd/dist/arp.c:1.8
--- src/external/bsd/dhcpcd/dist/arp.c:1.7	Fri Nov 14 12:00:54 2014
+++ src/external/bsd/dhcpcd/dist/arp.c	Wed Nov 26 13:43:06 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: arp.c,v 1.7 2014/11/14 12:00:54 roy Exp $");
+ __RCSID("$NetBSD: arp.c,v 1.8 2014/11/26 13:43:06 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -127,7 +127,7 @@ arp_packet(void *arg)
 	while (!(flags & RAW_EOF)) {
 		bytes = if_readrawpacket(ifp, ETHERTYPE_ARP,
 		    arp_buffer, sizeof(arp_buffer), &flags);
-		if (bytes == 0 || bytes == -1) {
+		if (bytes == -1) {
 			syslog(LOG_ERR, "%s: arp if_readrawpacket: %m",
 			    ifp->name);
 			dhcp_close(ifp);
@@ -217,13 +217,15 @@ arp_announce1(void *arg)
 
 	if (++astate->claims < ANNOUNCE_NUM)
 		syslog(LOG_DEBUG,
-		    "%s: sending ARP announce (%d of %d), "
+		    "%s: ARP announcing %s (%d of %d), "
 		    "next in %d.0 seconds",
-		    ifp->name, astate->claims, ANNOUNCE_NUM, ANNOUNCE_WAIT);
+		    ifp->name, inet_ntoa(astate->addr),
+		    astate->claims, ANNOUNCE_NUM, ANNOUNCE_WAIT);
 	else
 		syslog(LOG_DEBUG,
-		    "%s: sending ARP announce (%d of %d)",
-		    ifp->name, astate->claims, ANNOUNCE_NUM);
+		    "%s: ARP announcing %s (%d of %d)",
+		    ifp->name, inet_ntoa(astate->addr),
+		    astate->claims, ANNOUNCE_NUM);
 	if (arp_send(ifp, ARPOP_REQUEST,
 		astate->addr.s_addr, astate->addr.s_addr) == -1)
 		syslog(LOG_ERR, "send_arp: %m");
@@ -268,8 +270,9 @@ arp_probe1(void *arg)
 		eloop_timeout_add_tv(ifp->ctx->eloop, &tv, arp_probed, astate);
 	}
 	syslog(LOG_DEBUG,
-	    "%s: sending ARP probe (%d of %d), next in %0.1f seconds",
-	    ifp->name, astate->probes ? astate->probes : PROBE_NUM, PROBE_NUM,
+	    "%s: ARP probing %s (%d of %d), next in %0.1f seconds",
+	    ifp->name, inet_ntoa(astate->addr),
+	    astate->probes ? astate->probes : PROBE_NUM, PROBE_NUM,
 	    timeval_to_double(&tv));
 	if (arp_send(ifp, ARPOP_REQUEST, 0, astate->addr.s_addr) == -1)
 		syslog(LOG_ERR, "send_arp: %m");
Index: src/external/bsd/dhcpcd/dist/defs.h
diff -u src/external/bsd/dhcpcd/dist/defs.h:1.7 src/external/bsd/dhcpcd/dist/defs.h:1.8
--- src/external/bsd/dhcpcd/dist/defs.h:1.7	Fri Nov 14 12:00:54 2014
+++ src/external/bsd/dhcpcd/dist/defs.h	Wed Nov 26 13:43:06 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: defs.h,v 1.7 2014/11/14 12:00:54 roy Exp $ */
+/* $NetBSD: defs.h,v 1.8 2014/11/26 13:43:06 roy Exp $ */
 
 /*
  * dhcpcd - DHCP client daemon
@@ -30,7 +30,7 @@
 #define CONFIG_H
 
 #define PACKAGE			"dhcpcd"
-#define VERSION			"6.6.2"
+#define VERSION			"6.6.3"
 
 #ifndef CONFIG
 # define CONFIG			SYSCONFDIR "/" PACKAGE ".conf"
Index: src/external/bsd/dhcpcd/dist/dhcpcd.h
diff -u src/external/bsd/dhcpcd/dist/dhcpcd.h:1.7 src/external/bsd/dhcpcd/dist/dhcpcd.h:1.8
--- src/external/bsd/dhcpcd/dist/dhcpcd.h:1.7	Fri Nov 14 12:00:54 2014
+++ src/external/bsd/dhcpcd/dist/dhcpcd.h	Wed Nov 26 13:43:06 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: dhcpcd.h,v 1.7 2014/11/14 12:00:54 roy Exp $ */
+/* $NetBSD: dhcpcd.h,v 1.8 2014/11/26 13:43:06 roy Exp $ */
 
 /*
  * dhcpcd - DHCP client daemon
@@ -96,6 +96,8 @@ struct dhcpcd_ctx {
 	char **ifdv;	/* denied interfaces */
 	int ifc;	/* listed interfaces */
 	char **ifv;	/* listed interfaces */
+	int ifcc;	/* configured interfaces */
+	char **ifcv;	/* configured interfaces */
 	unsigned char *duid;
 	size_t duid_len;
 	int pid_fd;
Index: src/external/bsd/dhcpcd/dist/ipv4.c
diff -u src/external/bsd/dhcpcd/dist/ipv4.c:1.7 src/external/bsd/dhcpcd/dist/ipv4.c:1.8
--- src/external/bsd/dhcpcd/dist/ipv4.c:1.7	Fri Nov 14 12:00:54 2014
+++ src/external/bsd/dhcpcd/dist/ipv4.c	Wed Nov 26 13:43:06 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: ipv4.c,v 1.7 2014/11/14 12:00:54 roy Exp $");
+ __RCSID("$NetBSD: ipv4.c,v 1.8 2014/11/26 13:43:06 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -233,6 +233,11 @@ ipv4_ifcmp(const struct interface *si, c
 		return -1;
 	if (!sis->new && tis->new)
 		return 1;
+	/* Always prefer proper leases */
+	if (!(sis->added & STATE_FAKE) && (sis->added & STATE_FAKE))
+		return -1;
+	if ((sis->added & STATE_FAKE) && !(sis->added & STATE_FAKE))
+		return 1;
 	/* If we are either, they neither have a lease, or they both have.
 	 * We need to check for IPv4LL and make it non-preferred. */
 	if (sis->new && tis->new) {
@@ -593,7 +598,7 @@ ipv4_buildroutes(struct dhcpcd_ctx *ctx)
 	struct rt_head *nrs, *dnr;
 	struct rt *or, *rt, *rtn;
 	struct interface *ifp;
-	const struct dhcp_state *state;
+	const struct dhcp_state *state, *ostate;
 
 	nrs = malloc(sizeof(*nrs));
 	if (nrs == NULL) {
@@ -626,7 +631,10 @@ ipv4_buildroutes(struct dhcpcd_ctx *ctx)
 			rt->src.s_addr = state->addr.s_addr;
 			/* Do we already manage it? */
 			if ((or = find_route(ctx->ipv4_routes, rt, NULL))) {
-				if (or->iface != ifp ||
+				if (state->added & STATE_FAKE)
+					continue;
+				if (or->flags & STATE_FAKE ||
+				    or->iface != ifp ||
 				    or->src.s_addr != state->addr.s_addr ||
 				    rt->gate.s_addr != or->gate.s_addr ||
 				    rt->metric != or->metric)
@@ -637,9 +645,13 @@ ipv4_buildroutes(struct dhcpcd_ctx *ctx)
 				TAILQ_REMOVE(ctx->ipv4_routes, or, next);
 				free(or);
 			} else {
-				if (n_route(rt) != 0)
+				if (!(state->added & STATE_FAKE) &&
+				    n_route(rt) != 0)
 					continue;
 			}
+			rt->flags = STATE_ADDED;
+			if (state->added & STATE_FAKE)
+				rt->flags |= STATE_FAKE;
 			TAILQ_REMOVE(dnr, rt, next);
 			TAILQ_INSERT_TAIL(nrs, rt, next);
 		}
@@ -789,7 +801,8 @@ ipv4_applyaddr(void *arg)
 						} else {
 							ipv4_addaddr(ifn,
 							    &nstate->lease);
-							nstate->added = 1;
+							nstate->added =
+							    STATE_ADDED;
 						}
 						break;
 					}
@@ -866,7 +879,7 @@ ipv4_applyaddr(void *arg)
 	    state->addr.s_addr != 0)
 		delete_address(ifp);
 
-	state->added = 1;
+	state->added = STATE_ADDED;
 	state->defend = 0;
 	state->addr.s_addr = lease->addr.s_addr;
 	state->net.s_addr = lease->net.s_addr;

Index: src/external/bsd/dhcpcd/dist/dhcp.c
diff -u src/external/bsd/dhcpcd/dist/dhcp.c:1.23 src/external/bsd/dhcpcd/dist/dhcp.c:1.24
--- src/external/bsd/dhcpcd/dist/dhcp.c:1.23	Fri Nov 14 12:00:54 2014
+++ src/external/bsd/dhcpcd/dist/dhcp.c	Wed Nov 26 13:43:06 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: dhcp.c,v 1.23 2014/11/14 12:00:54 roy Exp $");
+ __RCSID("$NetBSD: dhcp.c,v 1.24 2014/11/26 13:43:06 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -1599,7 +1599,8 @@ send_message(struct interface *iface, ui
 	if (dhcp_open(iface) == -1)
 		return;
 
-	if (state->added && state->addr.s_addr != INADDR_ANY &&
+	if (state->added && !(state->added & STATE_FAKE) &&
+	    state->addr.s_addr != INADDR_ANY &&
 	    state->new != NULL &&
 	    (state->new->cookie == htonl(MAGIC_COOKIE) ||
 	    iface->options->options & DHCPCD_INFORM))
@@ -1967,15 +1968,15 @@ applyaddr:
 	if (ifo->options & DHCPCD_ARP) {
 		if (state->added) {
 			if (astate == NULL) {
-				/* We don't care about what happens
-				 * to the ARP announcement */
 				astate = arp_new(ifp);
+				astate->addr = state->addr;
 				astate->announced_cb =
 				    dhcp_arp_announced;
 			}
 			if (astate) {
 				arp_announce(astate);
-				arp_free_but(astate);
+				if (!ipv4ll)
+					arp_free_but(astate);
 			}
 		} else if (!ipv4ll)
 			arp_close(ifp);
@@ -2185,6 +2186,7 @@ dhcp_drop(struct interface *ifp, const c
 		dhcp_auth_reset(&state->auth);
 		dhcp_close(ifp);
 	}
+
 	if (ifp->options->options & DHCPCD_RELEASE) {
 		unlink(state->leasefile);
 		if (ifp->carrier != LINK_DOWN &&
@@ -2203,6 +2205,7 @@ dhcp_drop(struct interface *ifp, const c
 #endif
 		}
 	}
+
 	free(state->old);
 	state->old = state->new;
 	state->new = NULL;
@@ -2785,7 +2788,7 @@ dhcp_handlepacket(void *arg)
 	while (!(flags & RAW_EOF)) {
 		bytes = (size_t)if_readrawpacket(ifp, ETHERTYPE_IP,
 		    ifp->ctx->packet, udp_dhcp_len, &flags);
-		if (bytes == 0 || (ssize_t)bytes == -1) {
+		if ((ssize_t)bytes == -1) {
 			syslog(LOG_ERR, "%s: dhcp if_readrawpacket: %m",
 			    ifp->name);
 			dhcp_close(ifp);
@@ -2793,7 +2796,7 @@ dhcp_handlepacket(void *arg)
 			break;
 		}
 		if (valid_udp_packet(ifp->ctx->packet, bytes,
-			&from, flags & RAW_PARTIALCSUM) == -1)
+		    &from, flags & RAW_PARTIALCSUM) == -1)
 		{
 			syslog(LOG_ERR, "%s: invalid UDP packet from %s",
 			    ifp->name, inet_ntoa(from));
@@ -3129,6 +3132,24 @@ dhcp_start1(void *arg)
 	if (state->offer) {
 		get_lease(ifp->ctx, &state->lease, state->offer);
 		state->lease.frominfo = 1;
+		if (state->new == NULL &&
+		    ipv4_iffindaddr(ifp, &state->lease.addr, &state->lease.net))
+		{
+			/* We still have the IP address from the last lease.
+			 * Fake add the address and routes from it so the lease
+			 * can be cleaned up. */
+			state->new = malloc(sizeof(*state->new));
+			if (state->new) {
+				memcpy(state->new, state->offer,
+				    sizeof(*state->new));
+				state->addr = state->lease.addr;
+				state->net = state->lease.net;
+				state->added |= STATE_ADDED | STATE_FAKE;
+				ipv4_sortinterfaces(ifp->ctx);
+				ipv4_buildroutes(ifp->ctx);
+			} else
+				syslog(LOG_ERR, "%s: %m", __func__);
+		}
 		if (state->offer->cookie == 0) {
 			if (state->offer->yiaddr == state->addr.s_addr) {
 				free(state->offer);
@@ -3148,6 +3169,22 @@ dhcp_start1(void *arg)
 				free(state->offer);
 				state->offer = NULL;
 				state->lease.addr.s_addr = 0;
+				/* Technically we should discard the lease
+				 * as it's expired, just as DHCPv6 addresses
+				 * would be by the kernel.
+				 * However, this may violate POLA so
+				 * we currently leave it be.
+				 * If we get a totally different lease from
+				 * the DHCP server we'll drop it anyway, as
+				 * we will on any other event which would
+				 * trigger a lease drop.
+				 * This should only happen if dhcpcd stops
+				 * running and the lease expires before
+				 * dhcpcd starts again. */
+#if 0
+				if (state->new)
+					dhcp_drop(ifp, "EXPIRE");
+#endif
 			} else {
 				l = (uint32_t)(now.tv_sec - st.st_mtime);
 				state->lease.leasetime -= l;
@@ -3171,7 +3208,8 @@ dhcp_start1(void *arg)
 	if (state->offer == NULL || state->offer->cookie == 0) {
 		/* If we don't have an address yet, enter the reboot
 		 * state to ensure at least fallback in short order. */
-		if (state->addr.s_addr == INADDR_ANY)
+		if (state->addr.s_addr == INADDR_ANY ||
+		    state->added & STATE_FAKE)
 			state->state = DHS_REBOOT;
 		dhcp_discover(ifp);
 	} else

Index: src/external/bsd/dhcpcd/dist/dhcp6.c
diff -u src/external/bsd/dhcpcd/dist/dhcp6.c:1.6 src/external/bsd/dhcpcd/dist/dhcp6.c:1.7
--- src/external/bsd/dhcpcd/dist/dhcp6.c:1.6	Fri Nov  7 20:51:02 2014
+++ src/external/bsd/dhcpcd/dist/dhcp6.c	Wed Nov 26 13:43:06 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: dhcp6.c,v 1.6 2014/11/07 20:51:02 roy Exp $");
+ __RCSID("$NetBSD: dhcp6.c,v 1.7 2014/11/26 13:43:06 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -2554,7 +2554,7 @@ dhcp6_handledata(void *arg)
 	ctx = dhcpcd_ctx->ipv6;
 	ctx->rcvhdr.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
 	bytes = recvmsg(ctx->dhcp_fd, &ctx->rcvhdr, 0);
-	if (bytes == -1 || bytes == 0) {
+	if (bytes == -1) {
 		syslog(LOG_ERR, "recvmsg: %m");
 		close(ctx->dhcp_fd);
 		eloop_event_delete(dhcpcd_ctx->eloop, ctx->dhcp_fd, 0);
@@ -2565,7 +2565,7 @@ dhcp6_handledata(void *arg)
 	ctx->sfrom = inet_ntop(AF_INET6, &ctx->from.sin6_addr,
 	    ctx->ntopbuf, sizeof(ctx->ntopbuf));
 	if (len < sizeof(struct dhcp6_message)) {
-		syslog(LOG_ERR, "DHCPv6 RA packet too short from %s",
+		syslog(LOG_ERR, "DHCPv6 packet too short from %s",
 		    ctx->sfrom);
 		return;
 	}
Index: src/external/bsd/dhcpcd/dist/if-options.h
diff -u src/external/bsd/dhcpcd/dist/if-options.h:1.6 src/external/bsd/dhcpcd/dist/if-options.h:1.7
--- src/external/bsd/dhcpcd/dist/if-options.h:1.6	Fri Nov  7 20:51:02 2014
+++ src/external/bsd/dhcpcd/dist/if-options.h	Wed Nov 26 13:43:06 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: if-options.h,v 1.6 2014/11/07 20:51:02 roy Exp $ */
+/* $NetBSD: if-options.h,v 1.7 2014/11/26 13:43:06 roy Exp $ */
 
 /*
  * dhcpcd - DHCP client daemon
@@ -65,7 +65,6 @@
 #define DHCPCD_LASTLEASE		(1ULL << 7)
 #define DHCPCD_INFORM			(1ULL << 8)
 #define DHCPCD_REQUEST			(1ULL << 9)
-
 #define DHCPCD_IPV4LL			(1ULL << 10)
 #define DHCPCD_DUID			(1ULL << 11)
 #define DHCPCD_PERSISTENT		(1ULL << 12)
Index: src/external/bsd/dhcpcd/dist/if.c
diff -u src/external/bsd/dhcpcd/dist/if.c:1.6 src/external/bsd/dhcpcd/dist/if.c:1.7
--- src/external/bsd/dhcpcd/dist/if.c:1.6	Fri Nov  7 20:51:02 2014
+++ src/external/bsd/dhcpcd/dist/if.c	Wed Nov 26 13:43:06 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: if.c,v 1.6 2014/11/07 20:51:02 roy Exp $");
+ __RCSID("$NetBSD: if.c,v 1.7 2014/11/26 13:43:06 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -169,6 +169,18 @@ if_setflag(struct interface *ifp, short 
 	return r;
 }
 
+static int
+if_hasconf(struct dhcpcd_ctx *ctx, const char *ifname)
+{
+	int i;
+
+	for (i = 0; i < ctx->ifcc; i++) {
+		if (strcmp(ctx->ifcv[i], ifname) == 0)
+			return 1;
+	}
+	return 0;
+}
+
 struct if_head *
 if_discover(struct dhcpcd_ctx *ctx, int argc, char * const *argv)
 {
@@ -286,6 +298,13 @@ if_discover(struct dhcpcd_ctx *ctx, int 
 		if (!dev_initialized(ctx, p))
 			continue;
 
+		/* 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, p))
+				continue;
+		}
+
 		if (if_vimaster(p) == 1) {
 			syslog(argc ? LOG_ERR : LOG_DEBUG,
 			    "%s: is a Virtual Interface Master, skipping", p);
@@ -303,13 +322,7 @@ if_discover(struct dhcpcd_ctx *ctx, int 
 		ifp->carrier = if_carrier(ifp);
 
 		sdl_type = 0;
-		/* Don't allow loopback unless explicit */
-		if (ifp->flags & IFF_LOOPBACK) {
-			if ((argc == 0 || argc == -1) && ctx->ifac == 0) {
-				if_free(ifp);
-				continue;
-			}
-		} else if (ifa->ifa_addr != NULL) {
+		if (ifa->ifa_addr != NULL) {
 #ifdef AF_LINK
 			sdl = (const struct sockaddr_dl *)(void *)ifa->ifa_addr;
 
@@ -338,8 +351,9 @@ if_discover(struct dhcpcd_ctx *ctx, int 
 #ifdef IFT_BRIDGE
 			case IFT_BRIDGE:
 				/* Don't allow bridge unless explicit */
-				if ((argc == 0 || argc == -1)
-				    && ctx->ifac == 0)
+				if ((argc == 0 || argc == -1) &&
+				    ctx->ifac == 0 &&
+				    !if_hasconf(ctx, ifp->name))
 				{
 					if_free(ifp);
 					continue;
@@ -387,24 +401,29 @@ if_discover(struct dhcpcd_ctx *ctx, int 
 #endif
 
 		/* We only work on ethernet by default */
-		if (!(ifp->flags & IFF_POINTOPOINT) &&
-		    ifp->family != ARPHRD_ETHER)
-		{
-			if ((argc == 0 || argc == -1) && ctx->ifac == 0) {
+		if (ifp->family != ARPHRD_ETHER) {
+			if ((argc == 0 || argc == -1) &&
+			    ctx->ifac == 0 && !if_hasconf(ctx, ifp->name))
+			{
 				if_free(ifp);
 				continue;
 			}
 			switch (ifp->family) {
 			case ARPHRD_IEEE1394: /* FALLTHROUGH */
 			case ARPHRD_INFINIBAND:
+#ifdef ARPHRD_LOOPBACK
+			case ARPHRD_LOOPBACK:
+#endif
+#ifdef ARPHRD_PPP
+			case ARPHRD_PPP:
+#endif
 				/* We don't warn for supported families */
 				break;
 			default:
 				syslog(LOG_WARNING,
-				    "%s: unsupported interface type %.2x"
-				    ", falling back to ethernet",
-				    ifp->name, sdl_type);
-				ifp->family = ARPHRD_ETHER;
+				    "%s: unsupported interface type %.2x, "
+				    "family %.2x",
+				    ifp->name, sdl_type, ifp->family);
 				break;
 			}
 		}
Index: src/external/bsd/dhcpcd/dist/ipv4.h
diff -u src/external/bsd/dhcpcd/dist/ipv4.h:1.6 src/external/bsd/dhcpcd/dist/ipv4.h:1.7
--- src/external/bsd/dhcpcd/dist/ipv4.h:1.6	Fri Nov  7 20:51:03 2014
+++ src/external/bsd/dhcpcd/dist/ipv4.h	Wed Nov 26 13:43:06 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: ipv4.h,v 1.6 2014/11/07 20:51:03 roy Exp $ */
+/* $NetBSD: ipv4.h,v 1.7 2014/11/26 13:43:06 roy Exp $ */
 
 /*
  * dhcpcd - DHCP client daemon
@@ -40,6 +40,7 @@ struct rt {
 	const struct interface *iface;
 	unsigned int metric;
 	struct in_addr src;
+	uint8_t flags;
 };
 TAILQ_HEAD(rt_head, rt);
 
@@ -68,6 +69,9 @@ int inet_cidrtoaddr(int, struct in_addr 
 uint32_t ipv4_getnetmask(uint32_t);
 int ipv4_addrexists(struct dhcpcd_ctx *, const struct in_addr *);
 
+#define STATE_ADDED		0x01
+#define STATE_FAKE		0x02
+
 void ipv4_buildroutes(struct dhcpcd_ctx *);
 void ipv4_applyaddr(void *);
 int ipv4_routedeleted(struct dhcpcd_ctx *, const struct rt *);

Index: src/external/bsd/dhcpcd/dist/dhcpcd.8.in
diff -u src/external/bsd/dhcpcd/dist/dhcpcd.8.in:1.36 src/external/bsd/dhcpcd/dist/dhcpcd.8.in:1.37
--- src/external/bsd/dhcpcd/dist/dhcpcd.8.in:1.36	Fri Nov  7 20:51:02 2014
+++ src/external/bsd/dhcpcd/dist/dhcpcd.8.in	Wed Nov 26 13:43:06 2014
@@ -1,4 +1,4 @@
-.\"     $NetBSD: dhcpcd.8.in,v 1.36 2014/11/07 20:51:02 roy Exp $
+.\"     $NetBSD: dhcpcd.8.in,v 1.37 2014/11/26 13:43:06 roy Exp $
 .\" Copyright (c) 2006-2014 Roy Marples
 .\" All rights reserved
 .\"
@@ -23,7 +23,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd September 30, 2014
+.Dd November 18, 2014
 .Dt DHCPCD 8
 .Os
 .Sh NAME
@@ -102,6 +102,16 @@ It will then attempt to renew its lease 
 changes when the lease beings to expire or the DHCP server sends message
 to renew early.
 .Pp
+If any interface reports a working carrier then
+.Nm
+will try and obtain a lease before forking to the background,
+otherwise it will fork right away.
+This behaviour can be modified with the
+.Fl b , Fl Fl background
+and
+.Fl w , Fl Fl waitip
+options.
+.Pp
 .Nm
 is also an implementation of the BOOTP client specified in
 .Li RFC 951 .
@@ -143,8 +153,11 @@ If a list of interfaces are given on the
 .Nm
 only works with those interfaces, otherwise
 .Nm
-discovers available Ethernet interfaces.
-This is called Master mode and this behaviour can be forced with the
+discovers available Ethernet interfaces that can be configured.
+When
+.Nm
+is operating on more than one interface,
+it is called Master mode. and this behaviour can be forced with the
 .Fl M , Fl Fl master
 option so that an individual interface can start
 .Nm
@@ -152,15 +165,6 @@ but only one instance is running.
 The
 .Nm dhcpcd-ui
 project expects dhcpcd to be running this way.
-If any interface reports a working carrier then
-.Nm
-will try and obtain a lease before forking to the background,
-otherwise it will fork right away.
-This behaviour can be modified with the
-.Fl b , Fl Fl background
-and
-.Fl w , Fl Fl waitip
-options.
 .Pp
 If a single interface is given then
 .Nm

Index: src/external/bsd/dhcpcd/dist/dhcpcd.c
diff -u src/external/bsd/dhcpcd/dist/dhcpcd.c:1.17 src/external/bsd/dhcpcd/dist/dhcpcd.c:1.18
--- src/external/bsd/dhcpcd/dist/dhcpcd.c:1.17	Fri Nov 14 12:00:54 2014
+++ src/external/bsd/dhcpcd/dist/dhcpcd.c	Wed Nov 26 13:43:06 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: dhcpcd.c,v 1.17 2014/11/14 12:00:54 roy Exp $");
+ __RCSID("$NetBSD: dhcpcd.c,v 1.18 2014/11/26 13:43:06 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -152,6 +152,12 @@ free_globals(struct dhcpcd_ctx *ctx)
 		free(ctx->ifdv);
 		ctx->ifdv = NULL;
 	}
+	if (ctx->ifcc) {
+		for (; ctx->ifcc > 0; ctx->ifcc--)
+			free(ctx->ifcv[ctx->ifcc - 1]);
+		free(ctx->ifcv);
+		ctx->ifcv = NULL;
+	}
 
 #ifdef INET
 	if (ctx->dhcp_opts) {
@@ -354,7 +360,8 @@ configure_interface1(struct interface *i
 	if (ifp->flags & IFF_NOARP ||
 	    ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC))
 		ifo->options &= ~(DHCPCD_ARP | DHCPCD_IPV4LL);
-	if (!(ifp->flags & (IFF_POINTOPOINT | IFF_LOOPBACK | IFF_MULTICAST)))
+	if (ifp->flags & (IFF_POINTOPOINT | IFF_LOOPBACK) ||
+	    !(ifp->flags & IFF_MULTICAST))
 		ifo->options &= ~DHCPCD_IPV6RS;
 
 	if (ifo->metric != -1)
@@ -386,9 +393,13 @@ configure_interface1(struct interface *i
 
 	/* If we haven't specified a ClientID and our hardware address
 	 * length is greater than DHCP_CHADDR_LEN then we enforce a ClientID
-	 * of the hardware address family and the hardware address. */
+	 * of the hardware address family and the hardware address.
+	 * If there is no hardware address and no ClientID set,
+	 * force a DUID based ClientID. */
 	if (ifp->hwlen > DHCP_CHADDR_LEN)
 		ifo->options |= DHCPCD_CLIENTID;
+	else if (ifp->hwlen == 0 && !(ifo->options & DHCPCD_CLIENTID))
+		ifo->options |= DHCPCD_CLIENTID | DHCPCD_DUID;
 
 	/* Firewire and InfiniBand interfaces require ClientID and
 	 * the broadcast option being set. */
@@ -435,19 +446,24 @@ configure_interface1(struct interface *i
 		 * dhcpcd-6.1.0 and earlier used the interface name,
 		 * falling back to interface index if name > 4.
 		 */
-		memcpy(ifo->iaid, ifp->hwaddr + ifp->hwlen - sizeof(ifo->iaid),
-		    sizeof(ifo->iaid));
-#if 0
-		len = strlen(ifp->name);
-		if (len <= sizeof(ifo->iaid)) {
-			memcpy(ifo->iaid, ifp->name, len);
-			memset(ifo->iaid + len, 0, sizeof(ifo->iaid) - len);
-		} else {
-			/* IAID is the same size as a uint32_t */
-			len = htonl(ifp->index);
-			memcpy(ifo->iaid, &len, sizeof(len));
+		if (ifp->hwlen >= sizeof(ifo->iaid))
+			memcpy(ifo->iaid,
+			    ifp->hwaddr + ifp->hwlen - sizeof(ifo->iaid),
+			    sizeof(ifo->iaid));
+		else {
+			uint32_t len;
+			
+			len = (uint32_t)strlen(ifp->name);
+			if (len <= sizeof(ifo->iaid)) {
+				memcpy(ifo->iaid, ifp->name, len);
+				memset(ifo->iaid + len, 0,
+				    sizeof(ifo->iaid) - len);
+			} else {
+				/* IAID is the same size as a uint32_t */
+				len = htonl(ifp->index);
+				memcpy(ifo->iaid, &len, sizeof(len));
+			}
 		}
-#endif
 		ifo->options |= DHCPCD_IAID;
 	}
 
@@ -941,6 +957,23 @@ if_reboot(struct interface *ifp, int arg
 }
 
 static void
+reload_config(struct dhcpcd_ctx *ctx)
+{
+	struct if_options *ifo;
+
+	free_globals(ctx);
+	ifo = read_config(ctx, NULL, NULL, NULL);
+	add_options(ctx, NULL, ifo, ctx->argc, ctx->argv);
+	/* We need to preserve these two options. */
+	if (ctx->options & DHCPCD_MASTER)
+		ifo->options |= DHCPCD_MASTER;
+	if (ctx->options & DHCPCD_DAEMONISED)
+		ifo->options |= DHCPCD_DAEMONISED;
+	ctx->options = ifo->options;
+	free_options(ifo);
+}
+
+static void
 reconf_reboot(struct dhcpcd_ctx *ctx, int action, int argc, char **argv, int oi)
 {
 	struct if_head *ifs;
@@ -1008,7 +1041,6 @@ handle_signal1(void *arg)
 	struct dhcpcd_ctx *ctx;
 	struct dhcpcd_siginfo *si;
 	struct interface *ifp;
-	struct if_options *ifo;
 	int do_release;
 
 	ctx = dhcpcd_ctx;
@@ -1027,16 +1059,7 @@ handle_signal1(void *arg)
 		break;
 	case SIGHUP:
 		syslog(LOG_INFO, sigmsg, "HUP", (int)si->pid, "rebinding");
-		free_globals(ctx);
-		ifo = read_config(ctx, NULL, NULL, NULL);
-		add_options(ctx, NULL, ifo, ctx->argc, ctx->argv);
-		/* We need to preserve these two options. */
-		if (ctx->options & DHCPCD_MASTER)
-		    ifo->options |= DHCPCD_MASTER;
-		if (ctx->options & DHCPCD_DAEMONISED)
-		    ifo->options |= DHCPCD_DAEMONISED;
-		ctx->options = ifo->options;
-		free_options(ifo);
+		reload_config(ctx);
 		/* Preserve any options passed on the commandline
 		 * when we were started. */
 		reconf_reboot(ctx, 1, ctx->argc, ctx->argv,
@@ -1219,6 +1242,7 @@ dhcpcd_handleargs(struct dhcpcd_ctx *ctx
 		return 0;
 	}
 
+	reload_config(ctx);
 	/* XXX: Respect initial commandline options? */
 	reconf_reboot(ctx, do_reboot, argc, argv, optind);
 	return 0;
@@ -1701,7 +1725,7 @@ main(int argc, char **argv)
 			syslog(LOG_WARNING, "no interfaces have a carrier");
 			if (dhcpcd_daemonise(&ctx))
 				goto exit_success;
-		} else if (t > 0) {
+		} else if (t > 0 && ctx.options & DHCPCD_DAEMONISE) {
 			eloop_timeout_add_sec(ctx.eloop, t,
 			    handle_exit_timeout, &ctx);
 		}
Index: src/external/bsd/dhcpcd/dist/ipv6nd.c
diff -u src/external/bsd/dhcpcd/dist/ipv6nd.c:1.17 src/external/bsd/dhcpcd/dist/ipv6nd.c:1.18
--- src/external/bsd/dhcpcd/dist/ipv6nd.c:1.17	Fri Nov  7 20:51:03 2014
+++ src/external/bsd/dhcpcd/dist/ipv6nd.c	Wed Nov 26 13:43:06 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: ipv6nd.c,v 1.17 2014/11/07 20:51:03 roy Exp $");
+ __RCSID("$NetBSD: ipv6nd.c,v 1.18 2014/11/26 13:43:06 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -1503,7 +1503,7 @@ ipv6nd_handledata(void *arg)
 	ctx->rcvhdr.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo)) +
 	    CMSG_SPACE(sizeof(int));
 	len = recvmsg(ctx->nd_fd, &ctx->rcvhdr, 0);
-	if (len == -1 || len == 0) {
+	if (len == -1) {
 		syslog(LOG_ERR, "recvmsg: %m");
 		eloop_event_delete(dhcpcd_ctx->eloop, ctx->nd_fd, 0);
 		close(ctx->nd_fd);

Index: src/external/bsd/dhcpcd/dist/if-options.c
diff -u src/external/bsd/dhcpcd/dist/if-options.c:1.18 src/external/bsd/dhcpcd/dist/if-options.c:1.19
--- src/external/bsd/dhcpcd/dist/if-options.c:1.18	Fri Nov 14 12:00:54 2014
+++ src/external/bsd/dhcpcd/dist/if-options.c	Wed Nov 26 13:43:06 2014
@@ -1,5 +1,5 @@
 #include <sys/cdefs.h>
- __RCSID("$NetBSD: if-options.c,v 1.18 2014/11/14 12:00:54 roy Exp $");
+ __RCSID("$NetBSD: if-options.c,v 1.19 2014/11/26 13:43:06 roy Exp $");
 
 /*
  * dhcpcd - DHCP client daemon
@@ -2168,10 +2168,30 @@ read_config(struct dhcpcd_ctx *ctx,
 		}
 		/* Start of an interface block, skip if not ours */
 		if (strcmp(option, "interface") == 0) {
+			char **n;
+
 			if (ifname && line && strcmp(line, ifname) == 0)
 				skip = 0;
 			else
 				skip = 1;
+			if (ifname)
+				continue;
+
+			n = realloc(ctx->ifcv,
+			    sizeof(char *) * ((size_t)ctx->ifcc + 1));
+			if (n == NULL) {
+				syslog(LOG_ERR, "%s: %m", __func__);
+				continue;
+			}
+			ctx->ifcv = n;
+			ctx->ifcv[ctx->ifcc] = strdup(line);
+			if (ctx->ifcv[ctx->ifcc] == NULL) {
+				syslog(LOG_ERR, "%s: %m", __func__);
+				continue;
+			}
+			ctx->ifcc++;
+			syslog(LOG_DEBUG, "allowing interface %s",
+			    ctx->ifcv[ctx->ifcc - 1]);
 			continue;
 		}
 		/* Start of an ssid block, skip if not ours */

Reply via email to