diff options
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/networkd-conf.c | 153 | ||||
-rw-r--r-- | src/network/networkd-conf.h | 3 | ||||
-rw-r--r-- | src/network/networkd-dhcp-common.c | 146 | ||||
-rw-r--r-- | src/network/networkd-dhcp-common.h | 4 | ||||
-rw-r--r-- | src/network/networkd-gperf.gperf | 1 | ||||
-rw-r--r-- | src/network/networkd-network-gperf.gperf | 1 |
6 files changed, 151 insertions, 157 deletions
diff --git a/src/network/networkd-conf.c b/src/network/networkd-conf.c index c413f16739..7907fa8140 100644 --- a/src/network/networkd-conf.c +++ b/src/network/networkd-conf.c @@ -3,20 +3,11 @@ Copyright © 2014 Vinay Kulkarni <kulkarniv@vmware.com> ***/ -#include <ctype.h> -#include <netinet/ip.h> - #include "conf-parser.h" #include "def.h" -#include "dhcp-identifier.h" -#include "extract-word.h" -#include "hexdecoct.h" #include "networkd-conf.h" #include "networkd-manager.h" -#include "networkd-network.h" #include "networkd-speed-meter.h" -#include "networkd-dhcp4.h" -#include "string-table.h" int manager_parse_config_file(Manager *m) { int r; @@ -45,147 +36,3 @@ int manager_parse_config_file(Manager *m) { return 0; } - -static const char* const duid_type_table[_DUID_TYPE_MAX] = { - [DUID_TYPE_LLT] = "link-layer-time", - [DUID_TYPE_EN] = "vendor", - [DUID_TYPE_LL] = "link-layer", - [DUID_TYPE_UUID] = "uuid", -}; -DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(duid_type, DUIDType); - -int config_parse_duid_type( - 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) { - - _cleanup_free_ char *type_string = NULL; - const char *p = rvalue; - DUID *duid = data; - DUIDType type; - int r; - - assert(filename); - assert(lvalue); - assert(rvalue); - assert(duid); - - r = extract_first_word(&p, &type_string, ":", 0); - if (r == -ENOMEM) - return log_oom(); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Invalid syntax, ignoring: %s", rvalue); - return 0; - } - if (r == 0) { - log_syntax(unit, LOG_WARNING, filename, line, 0, - "Failed to extract DUID type from '%s', ignoring.", rvalue); - return 0; - } - - type = duid_type_from_string(type_string); - if (type < 0) { - log_syntax(unit, LOG_WARNING, filename, line, type, - "Failed to parse DUID type '%s', ignoring.", type_string); - return 0; - } - - if (!isempty(p)) { - usec_t u; - - if (type != DUID_TYPE_LLT) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Invalid syntax, ignoring: %s", rvalue); - return 0; - } - - r = parse_timestamp(p, &u); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to parse timestamp, ignoring: %s", p); - return 0; - } - - duid->llt_time = u; - } - - duid->type = type; - - return 0; -} - -int config_parse_duid_rawdata( - 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) { - - DUID *ret = data; - uint8_t raw_data[MAX_DUID_LEN]; - unsigned count = 0; - - assert(filename); - assert(lvalue); - assert(rvalue); - assert(ret); - - /* RawData contains DUID in format "NN:NN:NN..." */ - for (const char *p = rvalue;;) { - int n1, n2, len, r; - uint32_t byte; - _cleanup_free_ char *cbyte = NULL; - - r = extract_first_word(&p, &cbyte, ":", 0); - if (r == -ENOMEM) - return log_oom(); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to read DUID, ignoring assignment: %s.", rvalue); - return 0; - } - if (r == 0) - break; - - if (count >= MAX_DUID_LEN) { - log_syntax(unit, LOG_WARNING, filename, line, 0, "Max DUID length exceeded, ignoring assignment: %s.", rvalue); - return 0; - } - - len = strlen(cbyte); - if (!IN_SET(len, 1, 2)) { - log_syntax(unit, LOG_WARNING, filename, line, 0, "Invalid length - DUID byte: %s, ignoring assignment: %s.", cbyte, rvalue); - return 0; - } - n1 = unhexchar(cbyte[0]); - if (len == 2) - n2 = unhexchar(cbyte[1]); - else - n2 = 0; - - if (n1 < 0 || n2 < 0) { - log_syntax(unit, LOG_WARNING, filename, line, 0, "Invalid DUID byte: %s. Ignoring assignment: %s.", cbyte, rvalue); - return 0; - } - - byte = ((uint8_t) n1 << (4 * (len-1))) | (uint8_t) n2; - raw_data[count++] = byte; - } - - assert_cc(sizeof(raw_data) == sizeof(ret->raw_data)); - memcpy(ret->raw_data, raw_data, count); - ret->raw_data_len = count; - return 0; -} diff --git a/src/network/networkd-conf.h b/src/network/networkd-conf.h index b485e9e541..6f8612ac91 100644 --- a/src/network/networkd-conf.h +++ b/src/network/networkd-conf.h @@ -12,6 +12,3 @@ typedef struct Manager Manager; int manager_parse_config_file(Manager *m); const struct ConfigPerfItem* networkd_gperf_lookup(const char *key, GPERF_LEN_TYPE length); - -CONFIG_PARSER_PROTOTYPE(config_parse_duid_type); -CONFIG_PARSER_PROTOTYPE(config_parse_duid_rawdata); diff --git a/src/network/networkd-dhcp-common.c b/src/network/networkd-dhcp-common.c index bb0b204467..12bdda5129 100644 --- a/src/network/networkd-dhcp-common.c +++ b/src/network/networkd-dhcp-common.c @@ -4,9 +4,11 @@ #include <linux/if_arp.h> #include "bus-error.h" +#include "dhcp-identifier.h" #include "dhcp-internal.h" #include "dhcp6-internal.h" #include "escape.h" +#include "hexdecoct.h" #include "in-addr-util.h" #include "networkd-dhcp-common.h" #include "networkd-link.h" @@ -924,3 +926,147 @@ static const char * const dhcp_option_data_type_table[_DHCP_OPTION_DATA_MAX] = { }; DEFINE_STRING_TABLE_LOOKUP(dhcp_option_data_type, DHCPOptionDataType); + +static const char* const duid_type_table[_DUID_TYPE_MAX] = { + [DUID_TYPE_LLT] = "link-layer-time", + [DUID_TYPE_EN] = "vendor", + [DUID_TYPE_LL] = "link-layer", + [DUID_TYPE_UUID] = "uuid", +}; +DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(duid_type, DUIDType); + +int config_parse_duid_type( + 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) { + + _cleanup_free_ char *type_string = NULL; + const char *p = rvalue; + DUID *duid = data; + DUIDType type; + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(duid); + + r = extract_first_word(&p, &type_string, ":", 0); + if (r == -ENOMEM) + return log_oom(); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Invalid syntax, ignoring: %s", rvalue); + return 0; + } + if (r == 0) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "Failed to extract DUID type from '%s', ignoring.", rvalue); + return 0; + } + + type = duid_type_from_string(type_string); + if (type < 0) { + log_syntax(unit, LOG_WARNING, filename, line, type, + "Failed to parse DUID type '%s', ignoring.", type_string); + return 0; + } + + if (!isempty(p)) { + usec_t u; + + if (type != DUID_TYPE_LLT) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Invalid syntax, ignoring: %s", rvalue); + return 0; + } + + r = parse_timestamp(p, &u); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to parse timestamp, ignoring: %s", p); + return 0; + } + + duid->llt_time = u; + } + + duid->type = type; + + return 0; +} + +int config_parse_duid_rawdata( + 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) { + + DUID *ret = data; + uint8_t raw_data[MAX_DUID_LEN]; + unsigned count = 0; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(ret); + + /* RawData contains DUID in format "NN:NN:NN..." */ + for (const char *p = rvalue;;) { + int n1, n2, len, r; + uint32_t byte; + _cleanup_free_ char *cbyte = NULL; + + r = extract_first_word(&p, &cbyte, ":", 0); + if (r == -ENOMEM) + return log_oom(); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to read DUID, ignoring assignment: %s.", rvalue); + return 0; + } + if (r == 0) + break; + + if (count >= MAX_DUID_LEN) { + log_syntax(unit, LOG_WARNING, filename, line, 0, "Max DUID length exceeded, ignoring assignment: %s.", rvalue); + return 0; + } + + len = strlen(cbyte); + if (!IN_SET(len, 1, 2)) { + log_syntax(unit, LOG_WARNING, filename, line, 0, "Invalid length - DUID byte: %s, ignoring assignment: %s.", cbyte, rvalue); + return 0; + } + n1 = unhexchar(cbyte[0]); + if (len == 2) + n2 = unhexchar(cbyte[1]); + else + n2 = 0; + + if (n1 < 0 || n2 < 0) { + log_syntax(unit, LOG_WARNING, filename, line, 0, "Invalid DUID byte: %s. Ignoring assignment: %s.", cbyte, rvalue); + return 0; + } + + byte = ((uint8_t) n1 << (4 * (len-1))) | (uint8_t) n2; + raw_data[count++] = byte; + } + + assert_cc(sizeof(raw_data) == sizeof(ret->raw_data)); + memcpy(ret->raw_data, raw_data, count); + ret->raw_data_len = count; + return 0; +} diff --git a/src/network/networkd-dhcp-common.h b/src/network/networkd-dhcp-common.h index acf80e6255..23baef9246 100644 --- a/src/network/networkd-dhcp-common.h +++ b/src/network/networkd-dhcp-common.h @@ -1,6 +1,8 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include <netinet/in.h> + #include "conf-parser.h" #include "dhcp-identifier.h" #include "time-util.h" @@ -69,3 +71,5 @@ CONFIG_PARSER_PROTOTYPE(config_parse_section_route_table); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_user_or_vendor_class); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_send_option); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_request_options); +CONFIG_PARSER_PROTOTYPE(config_parse_duid_type); +CONFIG_PARSER_PROTOTYPE(config_parse_duid_rawdata); diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index 74d509896a..8f02271278 100644 --- a/src/network/networkd-gperf.gperf +++ b/src/network/networkd-gperf.gperf @@ -6,6 +6,7 @@ _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"") #include <stddef.h> #include "conf-parser.h" #include "networkd-conf.h" +#include "networkd-dhcp-common.h" #include "networkd-manager.h" #include "networkd-route.h" %} diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 568c34f51b..736988a4b8 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -10,7 +10,6 @@ _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"") #include "networkd-address-label.h" #include "networkd-address.h" #include "networkd-can.h" -#include "networkd-conf.h" #include "networkd-dhcp-common.h" #include "networkd-dhcp-server.h" #include "networkd-dhcp4.h" |