From: Christopher Martin Date: Tue, 16 Oct 2018 19:16:53 -0400 Subject: Adding option to randomize interface id Please find attached a patch that adds a new feature to wide-dhcpv6-client, namely an option ("ifid-random") in the prefix-interface section of dhcp6c.conf to generate a random interface id on startup. This is useful if you wish to have the final 64 bits of your IPv6 address change from time to time - a sort of very rough equivalent of IPv6 Privacy Extensions. If you do not add "ifid-random" to the config file, then nothing about the client's current behaviour changes. Note that if your prefix-interface section has both the current "ifid X" option (where X is whatever number you want to manually assign as your interface id) and the new "ifid-random" option, then the interface id is randomized and "ifid X" is ignored. Thanks, Christopher Martin --- cfparse.y | 9 ++++++++- cftoken.l | 1 + config.c | 9 +++++++++ config.h | 2 +- dhcp6c.conf.5 | 9 +++++++++ 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/cfparse.y b/cfparse.y index e83ecf7..9e685f4 100644 --- a/cfparse.y +++ b/cfparse.y @@ -104,7 +104,7 @@ static void cleanup_cflist __P((struct cf_list *)); %token INTERFACE IFNAME %token PROFILE PROFILENAME -%token PREFIX_INTERFACE SLA_ID SLA_LEN IFID DUID_ID +%token PREFIX_INTERFACE SLA_ID SLA_LEN IFID IFID_RAND DUID_ID %token ID_ASSOC IA_PD IAID IA_NA %token ADDRESS %token REQUEST SEND ALLOW PREFERENCE @@ -1064,6 +1064,13 @@ ifparam: l->num = (u_int64_t)$2; $$ = l; } + | IFID_RAND EOS + { + struct cf_list *l; + + MAKE_CFLIST(l, IFPARAM_IFID_RAND, NULL, NULL); + $$ = l; + } ; ianaconf_list: diff --git a/cftoken.l b/cftoken.l index f35b59f..e266ac2 100644 --- a/cftoken.l +++ b/cftoken.l @@ -244,6 +244,7 @@ ecl \} sla-id { DECHO; return (SLA_ID); } sla-len { DECHO; return (SLA_LEN); } ifid { DECHO; return (IFID); } +ifid-random { DECHO; return (IFID_RAND); } /* duration */ infinity { DECHO; return (INFINITY); } diff --git a/config.c b/config.c index 2c5ad5d..5829d92 100644 --- a/config.c +++ b/config.c @@ -521,6 +521,15 @@ add_pd_pif(iapdc, cfl0) } break; case IFPARAM_IFID: + if (use_default_ifid) { + for (i = sizeof(pif->ifid) - 1; i >= 0; i--) + pif->ifid[i] = (cfl->num >> 8*(sizeof(pif->ifid) - 1 - i)) & 0xff; + use_default_ifid = 0; + } + break; + case IFPARAM_IFID_RAND: + for (i = 0; i < pif->ifid_len ; i++) + cfl->num = cfl->num*2 + rand()%2; for (i = sizeof(pif->ifid) -1; i >= 0; i--) pif->ifid[i] = (cfl->num >> 8*(sizeof(pif->ifid) - 1 - i)) & 0xff; use_default_ifid = 0; diff --git a/config.h b/config.h index 64ce9e8..36a5aa3 100644 --- a/config.h +++ b/config.h @@ -266,7 +266,7 @@ enum { DECL_SEND, DECL_ALLOW, DECL_INFO_ONLY, DECL_REQUEST, DECL_DUID, DECL_PREFIX, DECL_PREFERENCE, DECL_SCRIPT, DECL_DELAYEDKEY, DECL_ADDRESS, DECL_RANGE, DECL_ADDRESSPOOL, - IFPARAM_SLA_ID, IFPARAM_SLA_LEN, IFPARAM_IFID, + IFPARAM_SLA_ID, IFPARAM_SLA_LEN, IFPARAM_IFID, IFPARAM_IFID_RAND, DHCPOPT_RAPID_COMMIT, DHCPOPT_AUTHINFO, DHCPOPT_DNS, DHCPOPT_DNSNAME, DHCPOPT_IA_PD, DHCPOPT_IA_NA, DHCPOPT_NTP, diff --git a/dhcp6c.conf.5 b/dhcp6c.conf.5 index 1c91d72..5693fb8 100644 --- a/dhcp6c.conf.5 +++ b/dhcp6c.conf.5 @@ -453,6 +453,15 @@ must be a decimal integer. It will be combined with the delegated prefix and the sla-id to form a complete interface address. The default is to use the EUI-64 address of the .Ar interface . +.It Xo +.Ic ifid-random ; +.Xc +This statement instructs the client to generate a completely random +interface id. This will override the +.Ic ifid +statement, if present. The resulting random interface id will be combined +with the delegated prefix and the sla-id to form a complete interface +address. .El .El .\"