From: Roy Marples Date: Wed, 25 Nov 2020 14:19:55 +0000 (+0000) Subject: options: Allow duid to take a value X-Git-Tag: v9.3.4~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=21d355135157335a8d85a14412c006dff3eb41ff;p=thirdparty%2Fdhcpcd.git options: Allow duid to take a value If a value is given, it overrides /var/db/dhcpcd/duid. --- diff --git a/src/dhcpcd.8.in b/src/dhcpcd.8.in index 8c89b209..7533f30b 100644 --- a/src/dhcpcd.8.in +++ b/src/dhcpcd.8.in @@ -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 @@ Use this .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 diff --git a/src/dhcpcd.c b/src/dhcpcd.c index 71575d1d..7727a48e 100644 --- a/src/dhcpcd.c +++ b/src/dhcpcd.c @@ -841,13 +841,17 @@ dhcpcd_initduid(struct dhcpcd_ctx *ctx, struct interface *ifp) { 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))); } diff --git a/src/dhcpcd.conf.5.in b/src/dhcpcd.conf.5.in index 1e7a8631..2afb23c0 100644 --- a/src/dhcpcd.conf.5.in +++ b/src/dhcpcd.conf.5.in @@ -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 @@ is an empty string then 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 @@ 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 .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 . diff --git a/src/if-options.c b/src/if-options.c index d15034dd..509db378 100644 --- a/src/if-options.c +++ b/src/if-options.c @@ -1002,8 +1002,16 @@ parse_option(struct dhcpcd_ctx *ctx, const char *ifname, struct if_options *ifo, 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':