summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-04-07 20:19:19 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-04-07 20:19:19 -0400
commit74dd72d559911bd56f9865a273c355e4e2e48fae (patch)
treeb3b48382a95595b6b9a37cfbc95a2afe5009d61a
parent3aa131c4cacc3e381d21f061a87da1cddd4963cb (diff)
parentf38e0cce75ff2ffbd99f7e382ed39c160bb7d799 (diff)
Merge pull request #2943 from vinaykul/systemd_duid_review_fixes
DHCP DUID parsing fix, logging fix, man-page fix
-rw-r--r--man/networkd.conf.xml48
-rw-r--r--man/systemd.network.xml48
-rw-r--r--src/libsystemd-network/network-internal.c5
-rw-r--r--src/network/networkd-conf.c109
-rw-r--r--src/network/networkd-conf.h2
5 files changed, 62 insertions, 150 deletions
diff --git a/man/networkd.conf.xml b/man/networkd.conf.xml
index 0d8f00106c..5166e05cbc 100644
--- a/man/networkd.conf.xml
+++ b/man/networkd.conf.xml
@@ -92,27 +92,6 @@
<variablelist class='network-directives'>
<varlistentry>
- <term><varname>Type=</varname></term>
- <listitem><para>The type of DUID specified in this section. The following values are
- supported:</para>
- <para>raw : If <literal>Type=raw</literal>, then <literal>RawData=</literal> specifies
- the entire DUID. For e.g: <literal>RawData=00:02:00:00:ab:11:f9:2a:c2:77:29:f9:5c:00</literal>
- specifies a 14 byte long DUID-EN ("00:02"), with enterprise number 43793 ("00:00:ab:11"),
- and identifier value "f9:2a:c2:77:29:f9:5c:00".</para><para>If Type is not specified and
- RawData is specified, Type defaults to 'raw'.</para>
- <para>Type will support the following values in the future:</para>
- <para>link-layer-and-time : If <literal>Type=link-layer-and-time</literal>, then
- <literal>MACAddress=</literal> and <literal>TimeStamp=</literal> specify the hardware
- address and time-stamp for DUID-LLT.</para>
- <para>vendor : If <literal>Type=vendor</literal>, then <literal>EnterpriseNumber=</literal>
- and <literal>RawData=</literal> specify the enterprise number and identifier for DUID-EN.</para>
- <para>link-layer : If <literal>Type=link-layer</literal>, then <literal>MACAddress=</literal>
- specifies the hardware address for DUID-LL.</para>
- <para>uuid : If <literal>Type=uuid</literal>, then <literal>UUID=</literal> specifies DUID-UUID.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
<term><varname>RawData=</varname></term>
<listitem><para>Specifies the DUID bytes as a single newline-terminated, hexadecimal
string, with each byte separated by a ':'.</para></listitem>
@@ -121,33 +100,6 @@
</refsect1>
<refsect1>
- <para>The following options will be supported in the future:
- </para>
- <variablelist>
- <varlistentry>
- <term><varname>MACAddress=</varname></term>
- <listitem><para>Specifies the link-layer address for DUID Type <option>link-layer
- </option> or <option>link-layer-and-time</option>.</para></listitem>
- </varlistentry>
- <varlistentry>
- <term><varname>TimeStamp=</varname></term>
- <listitem><para>Specifies the DUID generation time for DUID Type <option>
- link-layer-and-time</option>.</para></listitem>
- </varlistentry>
- <varlistentry>
- <term><varname>EnterpriseNumber=</varname></term>
- <listitem><para>Specifies the enterprise number for DUID Type
- <option>vendor</option>.</para></listitem>
- </varlistentry>
- <varlistentry>
- <term><varname>UUID=</varname></term>
- <listitem><para>Specifies the UUID for DUID Type <option>uuid</option>.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
-
- <refsect1>
<title>See Also</title>
<para>
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index c14d3770e2..c9ef041004 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -853,27 +853,6 @@
<variablelist class='network-directives'>
<varlistentry>
- <term><varname>Type=</varname></term>
- <listitem><para>The type of DUID specified in this section. The following values are
- supported:</para>
- <para>raw : If <literal>Type=raw</literal>, then <literal>RawData=</literal> specifies
- the entire DUID. For e.g: <literal>RawData=00:02:00:00:ab:11:f9:2a:c2:77:29:f9:5c:00</literal>
- specifies a 14 byte long DUID-EN ("00:02"), with enterprise number 43793 ("00:00:ab:11"),
- and identifier value "f9:2a:c2:77:29:f9:5c:00".</para><para>If Type is not specified and
- RawData is specified, Type defaults to 'raw'.</para>
- <para>Type will support the following values in the future:</para>
- <para>link-layer-and-time : If <literal>Type=link-layer-and-time</literal>, then
- <literal>MACAddress=</literal> and <literal>TimeStamp=</literal> specify the hardware
- address and time-stamp for DUID-LLT.</para>
- <para>vendor : If <literal>Type=vendor</literal>, then <literal>EnterpriseNumber=</literal>
- and <literal>RawData=</literal> specify the enterprise number and identifier for DUID-EN.</para>
- <para>link-layer : If <literal>Type=link-layer</literal>, then <literal>MACAddress=</literal>
- specifies the hardware address for DUID-LL.</para>
- <para>uuid : If <literal>Type=uuid</literal>, then <literal>UUID=</literal> specifies DUID-UUID.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
<term><varname>RawData=</varname></term>
<listitem><para>Specifies the DUID bytes as a single newline-terminated, hexadecimal
string, with each byte separated by a ':'.</para></listitem>
@@ -883,33 +862,6 @@
</refsect1>
<refsect1>
- <para>The following options will be supported in the future:
- </para>
- <variablelist>
- <varlistentry>
- <term><varname>MACAddress=</varname></term>
- <listitem><para>Specifies the link-layer address for DUID Type <option>link-layer
- </option> or <option>link-layer-and-time</option>.</para></listitem>
- </varlistentry>
- <varlistentry>
- <term><varname>TimeStamp=</varname></term>
- <listitem><para>Specifies the DUID generation time for DUID Type <option>
- link-layer-and-time</option>.</para></listitem>
- </varlistentry>
- <varlistentry>
- <term><varname>EnterpriseNumber=</varname></term>
- <listitem><para>Specifies the enterprise number for DUID Type <option>
- vendor</option>.</para></listitem>
- </varlistentry>
- <varlistentry>
- <term><varname>UUID=</varname></term>
- <listitem><para>Specifies the UUID for DUID Type <option>uuid</option>.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
-
- <refsect1>
<title>[DHCPServer] Section Options</title>
<para>The <literal>[DHCPServer]</literal> section contains
settings for the DHCP server, if enabled via the
diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c
index 0e2d757b2b..99b3a1d01f 100644
--- a/src/libsystemd-network/network-internal.c
+++ b/src/libsystemd-network/network-internal.c
@@ -355,8 +355,9 @@ int config_parse_iaid(const char *unit,
r = safe_atou32(rvalue, &iaid);
if (r < 0) {
- log_syntax(unit, LOG_ERR, filename, line, 0, "Unable to read IAID: %s", rvalue);
- return r;
+ log_syntax(unit, LOG_ERR, filename, line, r,
+ "Unable to read IAID, ignoring assignment: %s", rvalue);
+ return 0;
}
*((uint32_t *)data) = iaid;
diff --git a/src/network/networkd-conf.c b/src/network/networkd-conf.c
index 8b149124b3..73a8d16b58 100644
--- a/src/network/networkd-conf.c
+++ b/src/network/networkd-conf.c
@@ -1,5 +1,3 @@
-/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-
/***
This file is part of systemd.
@@ -24,6 +22,7 @@
#include "conf-parser.h"
#include "def.h"
#include "dhcp-identifier.h"
+#include "hexdecoct.h"
#include "networkd-conf.h"
#include "string-table.h"
@@ -58,53 +57,39 @@ int config_parse_duid_rawdata(
const char *rvalue,
void *data,
void *userdata) {
- int r;
- long byte;
- char *cbyte, *pnext;
+ int r, n1, n2, byte;
+ char *cbyte;
const char *pduid = rvalue;
- size_t count = 0, duid_index = 0;
- Manager *m;
- Network *n;
- DUIDType *duid_type;
- uint16_t *dhcp_duid_type;
- size_t *dhcp_duid_len;
- uint8_t *dhcp_duid;
+ Manager *m = userdata;
+ Network *n = userdata;
+ DUIDType duidtype;
+ uint16_t dhcp_duid_type = 0;
+ uint8_t dhcp_duid[MAX_DUID_LEN];
+ size_t len, count = 0, duid_start_offset = 0, dhcp_duid_len = 0;
assert(filename);
assert(lvalue);
assert(rvalue);
assert(userdata);
- if (ltype == DUID_CONFIG_SOURCE_GLOBAL) {
- m = userdata;
- duid_type = &m->duid_type;
- dhcp_duid_type = &m->dhcp_duid_type;
- dhcp_duid_len = &m->dhcp_duid_len;
- dhcp_duid = m->dhcp_duid;
- } else {
- /* DUID_CONFIG_SOURCE_NETWORK */
- n = userdata;
- duid_type = &n->duid_type;
- dhcp_duid_type = &n->dhcp_duid_type;
- dhcp_duid_len = &n->dhcp_duid_len;
- dhcp_duid = n->dhcp_duid;
- }
+ duidtype = (ltype == DUID_CONFIG_SOURCE_GLOBAL) ? m->duid_type
+ : n->duid_type;
- if (*duid_type == _DUID_TYPE_INVALID)
- *duid_type = DUID_TYPE_RAW;
+ if (duidtype == _DUID_TYPE_INVALID)
+ duidtype = DUID_TYPE_RAW;
- switch (*duid_type) {
+ switch (duidtype) {
case DUID_TYPE_LLT:
/* RawData contains DUID-LLT link-layer address (offset 6) */
- duid_index = 6;
+ duid_start_offset = 6;
break;
case DUID_TYPE_EN:
/* RawData contains DUID-EN identifier (offset 4) */
- duid_index = 4;
+ duid_start_offset = 4;
break;
case DUID_TYPE_LL:
/* RawData contains DUID-LL link-layer address (offset 2) */
- duid_index = 2;
+ duid_start_offset = 2;
break;
case DUID_TYPE_UUID:
/* RawData specifies UUID (offset 0) - fall thru */
@@ -114,42 +99,66 @@ int config_parse_duid_rawdata(
break;
}
- if (*duid_type != DUID_TYPE_RAW)
- *dhcp_duid_type = (uint16_t)(*duid_type);
+ if (duidtype != DUID_TYPE_RAW)
+ dhcp_duid_type = (uint16_t)duidtype;
/* RawData contains DUID in format " NN:NN:NN... " */
- while (true) {
+ for (;;) {
r = extract_first_word(&pduid, &cbyte, ":", 0);
if (r < 0) {
- log_error("Failed to read DUID.");
- return -EINVAL;
+ log_syntax(unit, LOG_ERR, filename, line, r,
+ "Failed to read DUID, ignoring assignment: %s.", rvalue);
+ goto exit;
}
if (r == 0)
break;
- if (duid_index >= MAX_DUID_LEN) {
- log_error("DUID length exceeds maximum length.");
- return -EINVAL;
+ if ((duid_start_offset + dhcp_duid_len) >= MAX_DUID_LEN) {
+ log_syntax(unit, LOG_ERR, filename, line, 0,
+ "Max DUID length exceeded, ignoring assignment: %s.", rvalue);
+ goto exit;
}
- errno = 0;
- byte = strtol(cbyte, &pnext, 16);
- if ((errno == ERANGE && (byte == LONG_MAX || byte == LONG_MIN))
- || (errno != 0 && byte == 0) || (cbyte == pnext)) {
- log_error("Invalid DUID byte: %s.", cbyte);
- return -EINVAL;
+ len = strlen(cbyte);
+ if ((len == 0) || (len > 2)) {
+ log_syntax(unit, LOG_ERR, filename, line, 0,
+ "Invalid length - DUID byte: %s, ignoring assignment: %s.", cbyte, rvalue);
+ goto exit;
}
+ n2 = 0;
+ n1 = unhexchar(cbyte[0]);
+ if (len == 2)
+ n2 = unhexchar(cbyte[1]);
+ if ((n1 < 0) || (n2 < 0)) {
+ log_syntax(unit, LOG_ERR, filename, line, 0,
+ "Invalid DUID byte: %s. Ignoring assignment: %s.", cbyte, rvalue);
+ goto exit;
+ }
+ byte = (n1 << (4 * (len-1))) | n2;
/* If DUID_TYPE_RAW, first two bytes hold DHCP DUID type code */
- if ((*duid_type == DUID_TYPE_RAW) && (count < 2)) {
- *dhcp_duid_type |= (byte << (8 * (1 - count)));
+ if ((duidtype == DUID_TYPE_RAW) && (count < 2)) {
+ dhcp_duid_type |= (byte << (8 * (1 - count)));
count++;
continue;
}
- dhcp_duid[duid_index++] = byte;
+ dhcp_duid[duid_start_offset + dhcp_duid_len] = byte;
+ dhcp_duid_len++;
}
- *dhcp_duid_len = duid_index;
+ if (ltype == DUID_CONFIG_SOURCE_GLOBAL) {
+ m->duid_type = duidtype;
+ m->dhcp_duid_type = dhcp_duid_type;
+ m->dhcp_duid_len = dhcp_duid_len;
+ memcpy(&m->dhcp_duid[duid_start_offset], dhcp_duid, dhcp_duid_len);
+ } else {
+ /* DUID_CONFIG_SOURCE_NETWORK */
+ n->duid_type = duidtype;
+ n->dhcp_duid_type = dhcp_duid_type;
+ n->dhcp_duid_len = dhcp_duid_len;
+ memcpy(&n->dhcp_duid[duid_start_offset], dhcp_duid, dhcp_duid_len);
+ }
+exit:
return 0;
}
diff --git a/src/network/networkd-conf.h b/src/network/networkd-conf.h
index efc370f839..671e656d7b 100644
--- a/src/network/networkd-conf.h
+++ b/src/network/networkd-conf.h
@@ -1,5 +1,3 @@
-/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-
#pragma once
/***