changeset 5551:0c4608a6cc2a draft

options: Allow duid to take a value If a value is given, it overrides /var/db/dhcpcd/duid.
author Roy Marples <roy@marples.name>
date Wed, 25 Nov 2020 14:19:55 +0000
parents dba7608e00b3
children 66dc60bf133d
files src/dhcpcd.8.in src/dhcpcd.c src/dhcpcd.conf.5.in src/if-options.c
diffstat 4 files changed, 40 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/dhcpcd.8.in	Wed Nov 25 14:05:18 2020 +0000
+++ b/src/dhcpcd.8.in	Wed Nov 25 14:19:55 2020 +0000
@@ -24,7 +24,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd November 20, 2020
+.Dd November 25, 2020
 .Dt DHCPCD 8
 .Os
 .Sh NAME
@@ -264,18 +264,29 @@
 .Ar script
 instead of the default
 .Pa @SCRIPT@ .
-.It Fl D , Fl Fl duid
+.It Fl D , Fl Fl duid Op Ar ll | lt | uuid | value
 Use a DHCP Unique Identifier.
 If a system UUID is available, that will be used to create a DUID-UUID,
 otheriwse if persistent storage is available then a DUID-LLT
 (link local address + time) is generated,
 otherwise DUID-LL is generated (link local address).
+The DUID type can be hinted as an optional parameter if the file
+.Pa @DBDIR@/duid
+does not exist.
+If not
+.Va ll ,
+.Va lt
+or
+.Va uuid
+then
+.Va value
+will be converted from 00:11:22:33 format.
 This, plus the IAID will be used as the
 .Fl I , Fl Fl clientid .
 The DUID generated will be held in
 .Pa @DBDIR@/duid
 and should not be copied to other hosts.
-This file also takes precedence over the above rules.
+This file also takes precedence over the above rules except for setting a value.
 .It Fl d , Fl Fl debug
 Echo debug messages to the stderr and syslog.
 .It Fl E , Fl Fl lastlease
--- a/src/dhcpcd.c	Wed Nov 25 14:05:18 2020 +0000
+++ b/src/dhcpcd.c	Wed Nov 25 14:19:55 2020 +0000
@@ -841,13 +841,17 @@
 {
 	char buf[DUID_LEN * 3];
 
-	if (ctx->duid != NULL)
+	if (ctx->duid != NULL) {
+		if (ifp == NULL)
+			goto log;
 		return;
+	}
 
 	duid_init(ctx, ifp);
 	if (ctx->duid == NULL)
 		return;
 
+log:
 	loginfox("DUID %s",
 	    hwaddr_ntoa(ctx->duid, ctx->duid_len, buf, sizeof(buf)));
 }
--- a/src/dhcpcd.conf.5.in	Wed Nov 25 14:05:18 2020 +0000
+++ b/src/dhcpcd.conf.5.in	Wed Nov 25 14:19:55 2020 +0000
@@ -24,7 +24,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd October 25, 2020
+.Dd November 25, 2020
 .Dt DHCPCD.CONF 5
 .Os
 .Sh NAME
@@ -211,7 +211,7 @@
 sends a default
 .Ar clientid
 of the hardware family and the hardware address.
-.It Ic duid Op ll | lt | uuid
+.It Ic duid Op ll | lt | uuid | value
 Use a DHCP Unique Identifier.
 If a system UUID is available, that will be used to create a DUID-UUID,
 otheriwse if persistent storage is available then a DUID-LLT
@@ -220,12 +220,20 @@
 The DUID type can be hinted as an optional parameter if the file
 .Pa @DBDIR@/duid
 does not exist.
+If not
+.Va ll ,
+.Va lt
+or
+.Va uuid
+then
+.Va value
+will be converted from 00:11:22:33 format.
 This, plus the IAID will be used as the
 .Ic clientid .
 The DUID generated will be held in
 .Pa @DBDIR@/duid
 and should not be copied to other hosts.
-This file also takes precedence over the above rules.
+This file also takes precedence over the above rules except for setting a value.
 .It Ic iaid Ar iaid
 Set the Interface Association Identifier to
 .Ar iaid .
--- a/src/if-options.c	Wed Nov 25 14:05:18 2020 +0000
+++ b/src/if-options.c	Wed Nov 25 14:19:55 2020 +0000
@@ -1002,8 +1002,16 @@
 		else if (strcmp(arg, "uuid") == 0)
 			ctx->duid_type = DUID_UUID;
 		else {
-			logwarnx("%s: invalid duid type", arg);
-			ctx->duid_type = DUID_DEFAULT;
+			dl = hwaddr_aton(NULL, arg);
+			if (dl != 0) {
+				no = realloc(ctx->duid, dl);
+				if (no == NULL)
+					logerrx(__func__);
+				else {
+					ctx->duid = no;
+					ctx->duid_len = hwaddr_aton(no, arg);
+				}
+			}
 		}
 		break;
 	case 'E':