chiark / gitweb /
networkd: Make DHCP client ID creation configurable
authorJan Janssen <medhefgo@web.de>
Tue, 3 Mar 2015 18:49:48 +0000 (19:49 +0100)
committerTom Gundersen <teg@jklm.no>
Wed, 4 Mar 2015 10:01:39 +0000 (11:01 +0100)
man/systemd.network.xml
src/network/networkd-dhcp4.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd.h

index 60252e53a921130fc3d33f9e7df1f2c9c0aa653d..35225512931f3aeeadea2aa153c80e554bc56023 100644 (file)
             false.</para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>ClientIdentifier=</varname></term>
+          <listitem>
+            <para>DHCP client identifier to use. Either <literal>mac</literal>
+            to use the MAC address of the link or <literal>duid</literal>
+            (the default) to use a RFC4361-complient Client ID.</para>
+          </listitem>
+        </varlistentry>
         <varlistentry>
           <term><varname>VendorClassIdentifier=</varname></term>
           <listitem>
index c3d0e3d39d621a06ce4133d8c431373fbeba6c1b..38321905e6e6094cdb82117bf5ae139edab77d01 100644 (file)
@@ -661,5 +661,21 @@ int dhcp4_configure(Link *link) {
                         return r;
         }
 
+        switch (link->network->dhcp_client_identifier) {
+        case DHCP_CLIENT_ID_DUID:
+                /* Library defaults to this. */
+                break;
+        case DHCP_CLIENT_ID_MAC:
+                r = sd_dhcp_client_set_client_id(link->dhcp_client,
+                                                 ARPHRD_ETHER,
+                                                 (const uint8_t *) &link->mac,
+                                                 sizeof (link->mac));
+                if (r < 0)
+                        return r;
+                break;
+        default:
+                assert_not_reached("Unknown client identifier type.");
+        }
+
         return 0;
 }
index b0c23a78980e2d0136f83fe28967a27e424482c3..93df83af08f96dd0bfa3478cbfa8d084890c68a3 100644 (file)
@@ -58,6 +58,7 @@ Route.Destination,           config_parse_destination,           0,
 Route.Source,                config_parse_destination,           0,                             0
 Route.Metric,                config_parse_route_priority,        0,                             0
 Route.Scope,                 config_parse_route_scope,           0,                             0
+DHCP.ClientIdentifier,       config_parse_dhcp_client_identifier,0,                             offsetof(Network, dhcp_client_identifier)
 DHCP.UseDNS,                 config_parse_bool,                  0,                             offsetof(Network, dhcp_dns)
 DHCP.UseMTU,                 config_parse_bool,                  0,                             offsetof(Network, dhcp_mtu)
 DHCP.UseHostname,            config_parse_bool,                  0,                             offsetof(Network, dhcp_hostname)
index 0ba0c75714c9eb0cb49475af307f7a70ff298695..f7f6eaf7fd1fd046930c755c1d5e46803c3c1159 100644 (file)
@@ -103,6 +103,7 @@ static int network_load_one(Manager *manager, const char *filename) {
         network->dhcp_routes = true;
         network->dhcp_sendhost = true;
         network->dhcp_route_metric = DHCP_ROUTE_METRIC;
+        network->dhcp_client_identifier = DHCP_CLIENT_ID_DUID;
 
         network->llmnr = LLMNR_SUPPORT_YES;
 
@@ -600,6 +601,14 @@ int config_parse_dhcp(
         return 0;
 }
 
+static const char* const dhcp_client_identifier_table[_DHCP_CLIENT_ID_MAX] = {
+        [DHCP_CLIENT_ID_MAC] = "mac",
+        [DHCP_CLIENT_ID_DUID] = "duid"
+};
+
+DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(dhcp_client_identifier, DCHPClientIdentifier);
+DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_client_identifier, dhcp_client_identifier, DCHPClientIdentifier, "Failed to parse client identifier type");
+
 static const char* const llmnr_support_table[_LLMNR_SUPPORT_MAX] = {
         [LLMNR_SUPPORT_NO] = "no",
         [LLMNR_SUPPORT_YES] = "yes",
index e75746f2c9600ea0a68506897234fe51c5971790..8bdc2bed82b24191a1581790b687efa3cd632143 100644 (file)
@@ -83,6 +83,13 @@ typedef enum LinkOperationalState {
         _LINK_OPERSTATE_INVALID = -1
 } LinkOperationalState;
 
+typedef enum DCHPClientIdentifier {
+        DHCP_CLIENT_ID_MAC,
+        DHCP_CLIENT_ID_DUID,
+        _DHCP_CLIENT_ID_MAX,
+        _DHCP_CLIENT_ID_INVALID = -1,
+} DCHPClientIdentifier;
+
 struct FdbEntry {
         Network *network;
         unsigned section;
@@ -115,6 +122,7 @@ struct Network {
         NetDev *bond;
         Hashmap *stacked_netdevs;
         AddressFamilyBoolean dhcp;
+        DCHPClientIdentifier dhcp_client_identifier;
         char *dhcp_vendor_class_identifier;
         bool dhcp_dns;
         bool dhcp_ntp;
@@ -403,6 +411,9 @@ int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned li
 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
                       const char *section, unsigned section_line, const char *lvalue,
                       int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_dhcp_client_identifier(const char *unit, const char *filename, unsigned line,
+                                        const char *section, unsigned section_line, const char *lvalue,
+                                        int ltype, const char *rvalue, void *data, void *userdata);
 
 /* IPv4LL support (legacy) */