changeset 5273:3a33b39120eb draft

DHCP6: Use interface vendorclassid rather than context This allows the vendor class to be turned off as well.
author Roy Marples <roy@marples.name>
date Wed, 27 May 2020 21:49:05 +0100
parents 97e87c65302e
children f0c6e0c1d52a
files src/dhcp6.c
diffstat 1 files changed, 9 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/dhcp6.c	Wed May 27 15:53:21 2020 +0000
+++ b/src/dhcp6.c	Wed May 27 21:49:05 2020 +0100
@@ -262,21 +262,22 @@
 	size_t len, vlen, i;
 	uint8_t *p;
 	const struct vivco *vivco;
-	char vendor[VENDORCLASSID_MAX_LEN];
 	struct dhcp6_option o;
 
 	ifo = ifp->options;
 	len = sizeof(uint32_t); /* IANA PEN */
 	if (ifo->vivco_en) {
+		vlen = 0;
 		for (i = 0, vivco = ifo->vivco;
 		    i < ifo->vivco_len;
 		    i++, vivco++)
-			len += sizeof(uint16_t) + vivco->len;
-		vlen = 0; /* silence bogus gcc warning */
-	} else {
-		vlen = strlcpy(vendor, ifp->ctx->vendor, sizeof(vendor));
+			vlen += sizeof(uint16_t) + vivco->len;
+		len += vlen;
+	} else if (ifo->vendorclassid[0] != '\0') {
+		vlen = (size_t)ifo->vendorclassid[0];
 		len += sizeof(uint16_t) + vlen;
-	}
+	} else
+		return 0;
 
 	if (len > UINT16_MAX) {
 		logerrx("%s: DHCPv6 Vendor Class too big", ifp->name);
@@ -307,11 +308,11 @@
 				memcpy(p, vivco->data, vivco->len);
 				p += vivco->len;
 			}
-		} else if (vlen) {
+		} else if (ifo->vendorclassid[0] != '\0') {
 			hvlen = htons((uint16_t)vlen);
 			memcpy(p, &hvlen, sizeof(hvlen));
 			p += sizeof(hvlen);
-			memcpy(p, vendor, (size_t)vlen);
+			memcpy(p, ifo->vendorclassid + 1, (size_t)vlen);
 		}
 	}