# --- T2-COPYRIGHT-NOTE-BEGIN --- # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # # T2 SDE: package/.../dhcp6c/ifid-option.patch # Copyright (C) 2019 The T2 SDE Project # # More information can be found in the files COPYING and README. # # This patch file is dual-licensed. It is available under the license the # patched project is licensed under, as long as it is an OpenSource license # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms # of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # --- T2-COPYRIGHT-NOTE-END --- From: =?utf-8?q?Bj=C3=B8rn_Mork?= Date: Wed, 10 Nov 2010 07:41:55 +0100 Subject: Adding ifid option to the dhcp6c.conf prefix-interface statement MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit This adds the ability to override the default EUI-64 address selection. Useful for interfaces without a unique hardware address, or for creating more userfriendly addresses in general. Signed-off-by: Bjørn Mork Signed-off-by: Jeremie Corbier --- cfparse.y | 10 +++++++++- cftoken.l | 1 + config.c | 19 ++++++++++++++----- config.h | 2 +- dhcp6c.conf.5 | 10 ++++++++++ 5 files changed, 35 insertions(+), 7 deletions(-) --- dhcp6c-20190419/cfparse.y.vanilla 2019-08-08 12:53:10.118777947 +0200 +++ dhcp6c-20190419/cfparse.y 2019-08-08 12:53:23.342778205 +0200 @@ -115,7 +115,7 @@ %} %token INTERFACE IFNAME -%token PREFIX_INTERFACE SLA_ID SLA_LEN DUID_ID +%token PREFIX_INTERFACE SLA_ID SLA_LEN IFID DUID_ID %token ID_ASSOC IA_PD IAID IA_NA %token ADDRESS %token REQUEST SEND ALLOW PREFERENCE @@ -1056,6 +1056,14 @@ ifparam: l->num = $2; $$ = l; } + | IFID NUMBER EOS + { + struct cf_list *l; + + MAKE_CFLIST(l, IFPARAM_IFID, NULL, NULL); + l->num = (u_int64_t)$2; + $$ = l; + } ; ianaconf_list: diff --git a/cftoken.l b/cftoken.l index 4c9ed10..6afda5f 100644 --- a/cftoken.l +++ b/cftoken.l @@ -240,6 +240,7 @@ ecl \} prefix-interface { DECHO; BEGIN S_IFACE; return (PREFIX_INTERFACE); } sla-id { DECHO; return (SLA_ID); } sla-len { DECHO; return (SLA_LEN); } +ifid { DECHO; return (IFID); } /* duration */ infinity { DECHO; return (INFINITY); } diff --git a/config.c b/config.c index 23598fc..e04d6a5 100644 --- a/config.c +++ b/config.c @@ -471,6 +471,7 @@ add_pd_pif(iapdc, cfl0) { struct cf_list *cfl; struct prefix_ifconf *pif; + int i, use_default_ifid = 1; /* duplication check */ for (pif = TAILQ_FIRST(&iapdc->iapd_pif_list); pif; @@ -552,11 +552,6 @@ pif->ifid_len = IFID_LEN_DEFAULT; pif->sla_len = SLA_LEN_DEFAULT; - if (get_default_ifid(pif)) { - d_printf(LOG_NOTICE, FNAME, - "failed to get default IF ID for %s", pif->ifname); - goto bad; - } for (cfl = cfl0->list; cfl; cfl = cfl->next) { switch(cfl->type) { @@ -524,6 +520,11 @@ add_pd_pif(iapdc, cfl0) goto bad; } break; + case IFPARAM_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; default: debug_printf(LOG_ERR, FNAME, "%s:%d internal error: " "invalid configuration", @@ -532,6 +533,14 @@ add_pd_pif(iapdc, cfl0) } } + if (use_default_ifid) { + if (get_default_ifid(pif)) { + d_printf(LOG_NOTICE, FNAME, + "failed to get default IF ID for %s", pif->ifname); + goto bad; + } + } + TAILQ_INSERT_TAIL(&iapdc->iapd_pif_list, pif, link); return (0); diff --git a/config.h b/config.h index ea8d17c..64ce9e8 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_SLA_ID, IFPARAM_SLA_LEN, IFPARAM_IFID, 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 3d5d25a..1c91d72 100644 --- a/dhcp6c.conf.5 +++ b/dhcp6c.conf.5 @@ -443,6 +443,16 @@ This statement specifies the length of the SLA ID in bits. must be a decimal number between 0 and 128. If the length is not specified by this statement, the default value 16 will be used. +.It Xo +.Ic ifid Ar ID +; +.Xc +This statement specifies the interface id. +.Ar ID +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 . .El .El .\"