Skip to content

Commit

Permalink
dhcp4: add DHCLIENT_CREATE_CID to ifcfg (jsc#SLE-15770)
Browse files Browse the repository at this point in the history
Overrides the DHCPv4 client-identifier type to use specified in the
wicked-config(5) `create-cid` option, the interface type specific
client-id type and compile time defaults.
Note: DHCP over Infiniband (IPoIB) mandates an rfc4361 client-id.
  • Loading branch information
mtomaschewski committed Sep 22, 2020
1 parent 27e719b commit 88ce3fd
Show file tree
Hide file tree
Showing 11 changed files with 61 additions and 12 deletions.
3 changes: 3 additions & 0 deletions client/compat.c
Expand Up @@ -2236,6 +2236,9 @@ __ni_compat_generate_dhcp4_addrconf(xml_node_t *ifnode, const ni_compat_netdev_t

if (compat->dhcp4.client_id)
xml_node_dict_set(dhcp, "client-id", compat->dhcp4.client_id);
else
if (compat->dhcp4.create_cid)
xml_node_dict_set(dhcp, "client-id", ni_config_dhcp4_cid_type_format(compat->dhcp4.create_cid));
if (compat->dhcp4.vendor_class)
xml_node_dict_set(dhcp, "vendor-class", compat->dhcp4.vendor_class);

Expand Down
7 changes: 7 additions & 0 deletions client/suse/compat-suse.c
Expand Up @@ -5262,6 +5262,13 @@ __ni_suse_addrconf_dhcp4_options(const ni_sysconfig_t *sc, ni_compat_netdev_t *c

if ((string = ni_sysconfig_get_value(sc, "DHCLIENT_CLIENT_ID")) != NULL)
ni_string_dup(&compat->dhcp4.client_id, string);
else
if ((string = ni_sysconfig_get_value(sc, "DHCLIENT_CREATE_CID")) != NULL) {
if (!ni_config_dhcp4_cid_type_parse(&compat->dhcp4.create_cid, string))
ni_warn("%s: Cannot parse DHCLIENT_CREATE_CID='%s' option",
ni_basename(sc->pathname),
ni_print_suspect(string, ni_string_len(string)));
}

if ((string = ni_sysconfig_get_value(sc, "DHCLIENT_VENDOR_CLASS_ID")) != NULL)
ni_string_dup(&compat->dhcp4.vendor_class, string);
Expand Down
9 changes: 9 additions & 0 deletions client/suse/config/sysconfig.dhcp-wicked
Expand Up @@ -67,6 +67,15 @@ DHCLIENT_UPDATE=""
#
DHCLIENT_BROADCAST=""

## Type: list(,rfc4361,dhcpv6,dhcp6,rfc2132,hwaddr,none,disable)
#
# Overrides the DHCPv4 client-identifier type to use specified in the
# wicked-config(5) `create-cid` option, the interface type specific
# client-id type and compile time defaults.
# Note: e.g. DHCP over Infiniband (IPoIB) mandates an rfc4361 client-id.
#
DHCLIENT_CREATE_CID=""

## Type: list(enabled,disabled,default,)
## Default: ""
#
Expand Down
1 change: 1 addition & 0 deletions client/wicked-client.h
Expand Up @@ -68,6 +68,7 @@ typedef struct ni_compat_netdev {
ni_dhcp_fqdn_t fqdn;
char * hostname;
char * client_id;
unsigned int create_cid;
char * vendor_class;
ni_dhcp4_user_class_t user_class;

Expand Down
1 change: 1 addition & 0 deletions dhcp4/dbus-api.c
Expand Up @@ -466,6 +466,7 @@ static ni_dbus_property_t dhcp4_request_properties[] = {
DHCP4REQ_UUID_PROPERTY(uuid, uuid, RO),
DHCP4REQ_UINT_PROPERTY(flags, flags, RO),
DHCP4REQ_STRING_PROPERTY(client-id, clientid, RO),
DHCP4REQ_UINT_PROPERTY(create-cid, create_cid, RO),
DHCP4REQ_STRING_PROPERTY(vendor-class, vendor_class, RO),
DHCP4REQ_DICT_PROPERTY(user-class, user_class, RO),
DHCP4REQ_UINT_PROPERTY(start-delay, start_delay, RO),
Expand Down
9 changes: 9 additions & 0 deletions schema/addrconf.xml
Expand Up @@ -178,6 +178,15 @@
<flags type="builtin-addrconf-flags" />

<client-id type="string" />
<create-cid type="uint32" constraint="enum">
<rfc2132 value="1"/>
<hwaddr value="1"/>
<rfc4361 value="2"/>
<dhcpv6 value="2"/>
<dhcp6 value="2"/>
<disable value="3"/>
<none value="3"/>
</create-cid>
<vendor-class type="string" />
<user-class class="dict">
<format type="uint32" constraint="enum">
Expand Down
5 changes: 4 additions & 1 deletion src/appconfig.h
Expand Up @@ -102,7 +102,8 @@ typedef enum {
} ni_config_dhcp4_routes_t;

typedef enum {
NI_CONFIG_DHCP4_CID_TYPE_HWADDR = 1U,
NI_CONFIG_DHCP4_CID_TYPE_AUTO = 0U,
NI_CONFIG_DHCP4_CID_TYPE_HWADDR,
NI_CONFIG_DHCP4_CID_TYPE_DHCPv6,
NI_CONFIG_DHCP4_CID_TYPE_DISABLE,
} ni_config_dhcp4_cid_type_t;
Expand Down Expand Up @@ -209,6 +210,8 @@ extern unsigned int ni_config_addrconf_update(const char *, ni_addrconf_mode_t,
extern ni_bool_t ni_config_use_nanny(void);

extern const ni_config_dhcp4_t * ni_config_dhcp4_find_device(const char *);
extern const char * ni_config_dhcp4_cid_type_format(ni_config_dhcp4_cid_type_t);
extern ni_bool_t ni_config_dhcp4_cid_type_parse(ni_config_dhcp4_cid_type_t *, const char *);
extern const ni_config_dhcp6_t * ni_config_dhcp6_find_device(const char *);

extern ni_config_bonding_ctl_t ni_config_bonding_ctl(void);
Expand Down
9 changes: 7 additions & 2 deletions src/config.c
Expand Up @@ -509,10 +509,15 @@ static const ni_intmap_t config_dhcp6_cid_type_names[] = {
{ "disable", NI_CONFIG_DHCP4_CID_TYPE_DISABLE},
{ "none", NI_CONFIG_DHCP4_CID_TYPE_DISABLE},

{ NULL, -1U }
{ NULL, NI_CONFIG_DHCP4_CID_TYPE_AUTO }
};

static ni_bool_t
const char *
ni_config_dhcp4_cid_type_format(ni_config_dhcp4_cid_type_t type)
{
return ni_format_uint_mapped(type, config_dhcp6_cid_type_names);
}
ni_bool_t
ni_config_dhcp4_cid_type_parse(ni_config_dhcp4_cid_type_t *type, const char *name)
{
return ni_parse_uint_mapped(name, config_dhcp6_cid_type_names, type);
Expand Down
22 changes: 14 additions & 8 deletions src/dhcp4/device.c
Expand Up @@ -326,7 +326,7 @@ ni_dhcp4_acquire(ni_dhcp4_device_t *dev, const ni_dhcp4_request_t *info)
config->fqdn.update = NI_DHCP4_FQDN_UPDATE_NONE;

if (!ni_dhcp4_parse_client_id(&config->client_id, dev->system.hwaddr.type, info->clientid))
ni_dhcp4_set_config_client_id(&config->client_id, dev);
ni_dhcp4_set_config_client_id(&config->client_id, dev, info->create_cid);

if ((classid = info->vendor_class) == NULL)
classid = ni_dhcp4_config_vendor_class();
Expand Down Expand Up @@ -835,23 +835,28 @@ ni_dhcp4_set_dhcpv6_client_id(ni_opaque_t *raw, unsigned int iaid, const ni_opaq
* Set the client ID as defined in the wicked-config(5)
*/
ni_bool_t
ni_dhcp4_set_config_client_id(ni_opaque_t *raw, const ni_dhcp4_device_t *dev)
ni_dhcp4_set_config_client_id(ni_opaque_t *raw, const ni_dhcp4_device_t *dev,
unsigned int create_cid)
{
const ni_config_dhcp4_t *dhcp4;
ni_netconfig_t *nc;
ni_netdev_t *ndev;
unsigned int iaid;
ni_opaque_t duid;
unsigned int type;

if (!raw || !dev || !(nc = ni_global_state_handle(0)))
return FALSE;

if (!(ndev = ni_netdev_by_index(nc, dev->link.ifindex)))
return FALSE;

dhcp4 = ni_config_dhcp4_find_device(dev->ifname);
if (!(type = dhcp4 ? dhcp4->create_cid : 0)) {
if (create_cid == NI_CONFIG_DHCP4_CID_TYPE_AUTO) {
/* use wicked-config(5) setting if any */
if ((dhcp4 = ni_config_dhcp4_find_device(dev->ifname)))
create_cid = dhcp4->create_cid;
}

if (create_cid == NI_CONFIG_DHCP4_CID_TYPE_AUTO) {
/*
* We should allways use dhcp6 based client-id as
* specified in RFC 4361, also on ethernet...
Expand All @@ -876,17 +881,17 @@ ni_dhcp4_set_config_client_id(ni_opaque_t *raw, const ni_dhcp4_device_t *dev)
switch (dev->system.hwaddr.type) {
case ARPHRD_ETHER:
#ifndef NI_DHCP4_RFC4361_CID
type = NI_CONFIG_DHCP4_CID_TYPE_HWADDR;
create_cid = NI_CONFIG_DHCP4_CID_TYPE_HWADDR;
break;
#endif
case ARPHRD_INFINIBAND:
default:
type = NI_CONFIG_DHCP4_CID_TYPE_DHCPv6;
create_cid = NI_CONFIG_DHCP4_CID_TYPE_DHCPv6;
break;
}
}

switch (type) {
switch (create_cid) {
case NI_CONFIG_DHCP4_CID_TYPE_DHCPv6:
if (!ni_iaid_acquire(&iaid, ndev, 0))
return FALSE;
Expand All @@ -902,6 +907,7 @@ ni_dhcp4_set_config_client_id(ni_opaque_t *raw, const ni_dhcp4_device_t *dev)
case NI_CONFIG_DHCP4_CID_TYPE_DISABLE:
return TRUE;

case NI_CONFIG_DHCP4_CID_TYPE_AUTO:
default:
return FALSE;
}
Expand Down
3 changes: 2 additions & 1 deletion src/dhcp4/dhcp4.h
Expand Up @@ -146,6 +146,7 @@ struct ni_dhcp4_request {

/* Options controlling what to put into the lease request */
char * clientid;
unsigned int create_cid;
char * vendor_class;
ni_dhcp4_user_class_t user_class;

Expand Down Expand Up @@ -261,7 +262,7 @@ extern void ni_dhcp4_device_retransmit(ni_dhcp4_device_t *);
extern void ni_dhcp4_device_force_retransmit(ni_dhcp4_device_t *, unsigned int);
extern void ni_dhcp4_device_arp_close(ni_dhcp4_device_t *);
extern ni_bool_t ni_dhcp4_parse_client_id(ni_opaque_t *, unsigned short, const char *);
extern ni_bool_t ni_dhcp4_set_config_client_id(ni_opaque_t *, const ni_dhcp4_device_t *);
extern ni_bool_t ni_dhcp4_set_config_client_id(ni_opaque_t *, const ni_dhcp4_device_t *, unsigned int);
extern void ni_dhcp4_new_xid(ni_dhcp4_device_t *);
extern void ni_dhcp4_device_set_best_offer(ni_dhcp4_device_t *, ni_addrconf_lease_t *, int);
extern void ni_dhcp4_device_drop_best_offer(ni_dhcp4_device_t *);
Expand Down
4 changes: 4 additions & 0 deletions src/dhcp4/tester.c
Expand Up @@ -192,6 +192,10 @@ ni_dhcp4_tester_req_xml_init(ni_dhcp4_request_t *req, xml_document_t *doc)
goto failure;
ni_string_dup(&req->clientid, child->cdata);
} else
if (ni_string_eq(child->name, "create-cid")) {
if (!ni_config_dhcp4_cid_type_parse(&req->create_cid, child->cdata))
goto failure;
} else
if(ni_string_eq(child->name, "start-delay")) {
if (ni_parse_uint(child->cdata, &req->start_delay, 10) != 0)
goto failure;
Expand Down

0 comments on commit 88ce3fd

Please sign in to comment.