changeset 4291:cedfddd21034 draft

ip6: use vlanid if present in working out stable private addresses dhcpcd doesn't allow address sharing currently, so this is a needed change for vlan users.
author Roy Marples <roy@marples.name>
date Sat, 23 Jun 2018 21:06:40 +0100
parents 1d16a683814f
children 3d4667e8f9c9
files src/ipv6.c
diffstat 1 files changed, 10 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/ipv6.c	Thu Jun 21 12:35:46 2018 +0100
+++ b/src/ipv6.c	Sat Jun 23 21:06:40 2018 +0100
@@ -253,6 +253,7 @@
     const struct in6_addr *prefix, int prefix_len,
     const unsigned char *netiface, size_t netiface_len,
     const unsigned char *netid, size_t netid_len,
+    unsigned short vlanid,
     uint32_t *dad_counter,
     const unsigned char *secret, size_t secret_len)
 {
@@ -267,6 +268,8 @@
 
 	l = (size_t)(ROUNDUP8(prefix_len) / NBBY);
 	len = l + netiface_len + netid_len + sizeof(*dad_counter) + secret_len;
+	if (vlanid != 0)
+		len += sizeof(vlanid);
 	if (len > sizeof(buf)) {
 		errno = ENOBUFS;
 		return -1;
@@ -281,6 +284,12 @@
 		p += netiface_len;
 		memcpy(p, netid, netid_len);
 		p += netid_len;
+		/* Don't use a vlanid if not set.
+		 * This ensures prior versions have the same unique address. */
+		if (vlanid != 0) {
+			memcpy(p, &vlanid, sizeof(vlanid));
+			p += sizeof(vlanid);
+		}
 		memcpy(p, dad_counter, sizeof(*dad_counter));
 		p += sizeof(*dad_counter);
 		memcpy(p, secret, secret_len);
@@ -333,7 +342,7 @@
 	r = ipv6_makestableprivate1(addr, prefix, prefix_len,
 	    ifp->hwaddr, ifp->hwlen,
 	    ifp->ssid, ifp->ssid_len,
-	    &dad,
+	    ifp->vlanid, &dad,
 	    ifp->ctx->secret, ifp->ctx->secret_len);
 
 	if (r == 0)