From 461dbb2fa97b5c03b19462bf0f462c9f96a59f1b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 18 Nov 2019 18:14:18 +0900 Subject: [PATCH] dhcp: remove struct sd_dhcp_raw_option sd_dhcp_raw_option and sd_dhcp_option are essentially equivalent. --- src/libsystemd-network/dhcp-internal.h | 10 ++++ src/libsystemd-network/dhcp-option.c | 44 ++++++++++++++++- src/libsystemd-network/dhcp-server-internal.h | 9 ---- src/libsystemd-network/sd-dhcp-client.c | 48 ------------------- src/libsystemd-network/sd-dhcp-server.c | 46 ++---------------- src/network/networkd-dhcp-server.c | 19 ++++---- src/network/networkd-network.c | 2 +- src/network/networkd-network.h | 2 +- src/systemd/meson.build | 1 + src/systemd/sd-dhcp-client.h | 6 +-- src/systemd/sd-dhcp-option.h | 38 +++++++++++++++ src/systemd/sd-dhcp-server.h | 11 +---- 12 files changed, 109 insertions(+), 127 deletions(-) create mode 100644 src/systemd/sd-dhcp-option.h diff --git a/src/libsystemd-network/dhcp-internal.h b/src/libsystemd-network/dhcp-internal.h index c231773bddb..6a803d7b05d 100644 --- a/src/libsystemd-network/dhcp-internal.h +++ b/src/libsystemd-network/dhcp-internal.h @@ -15,6 +15,16 @@ #include "dhcp-protocol.h" #include "socket-util.h" +typedef struct sd_dhcp_option { + unsigned n_ref; + + uint8_t option; + void *data; + size_t length; +} sd_dhcp_option; + +extern const struct hash_ops dhcp_option_hash_ops; + int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link, uint32_t xid, const uint8_t *mac_addr, size_t mac_addr_len, uint16_t arp_type, diff --git a/src/libsystemd-network/dhcp-option.c b/src/libsystemd-network/dhcp-option.c index 061cfde2f05..e03c1a894d0 100644 --- a/src/libsystemd-network/dhcp-option.c +++ b/src/libsystemd-network/dhcp-option.c @@ -79,7 +79,7 @@ static int option_append(uint8_t options[], size_t size, size_t *offset, break; case SD_DHCP_OPTION_VENDOR_SPECIFIC: { OrderedHashmap *s = (OrderedHashmap *) optval; - struct sd_dhcp_raw_option *p; + struct sd_dhcp_option *p; size_t l = 0; Iterator i; @@ -95,7 +95,7 @@ static int option_append(uint8_t options[], size_t size, size_t *offset, *offset += 2; ORDERED_HASHMAP_FOREACH(p, s, i) { - options[*offset] = p->type; + options[*offset] = p->option; options[*offset + 1] = p->length; memcpy(&options[*offset + 2], p->data, p->length); *offset += 2 + p->length; @@ -315,3 +315,43 @@ int dhcp_option_parse(DHCPMessage *message, size_t len, dhcp_option_callback_t c return message_type; } + +static sd_dhcp_option* dhcp_option_free(sd_dhcp_option *i) { + if (!i) + return NULL; + + free(i->data); + return mfree(i); +} + +int sd_dhcp_option_new(uint8_t option, const void *data, size_t length, sd_dhcp_option **ret) { + assert_return(ret, -EINVAL); + assert_return(length == 0 || data, -EINVAL); + + _cleanup_free_ void *q = memdup(data, length); + if (!q) + return -ENOMEM; + + sd_dhcp_option *p = new(sd_dhcp_option, 1); + if (!p) + return -ENOMEM; + + *p = (sd_dhcp_option) { + .n_ref = 1, + .option = option, + .length = length, + .data = TAKE_PTR(q), + }; + + *ret = TAKE_PTR(p); + return 0; +} + +DEFINE_TRIVIAL_REF_UNREF_FUNC(sd_dhcp_option, sd_dhcp_option, dhcp_option_free); +DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR( + dhcp_option_hash_ops, + void, + trivial_hash_func, + trivial_compare_func, + sd_dhcp_option, + sd_dhcp_option_unref); diff --git a/src/libsystemd-network/dhcp-server-internal.h b/src/libsystemd-network/dhcp-server-internal.h index e537d9e6227..42c3ceb8b15 100644 --- a/src/libsystemd-network/dhcp-server-internal.h +++ b/src/libsystemd-network/dhcp-server-internal.h @@ -37,15 +37,6 @@ typedef struct DHCPLease { usec_t expiration; } DHCPLease; -struct sd_dhcp_raw_option { - unsigned n_ref; - - uint8_t type; - uint8_t length; - - void *data; -}; - struct sd_dhcp_server { unsigned n_ref; diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c index f03989a5a7e..bc666098d16 100644 --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -34,14 +34,6 @@ #define RESTART_AFTER_NAK_MIN_USEC (1 * USEC_PER_SEC) #define RESTART_AFTER_NAK_MAX_USEC (30 * USEC_PER_MINUTE) -struct sd_dhcp_option { - unsigned n_ref; - - uint8_t option; - void *data; - size_t length; -}; - struct sd_dhcp_client { unsigned n_ref; @@ -538,46 +530,6 @@ int sd_dhcp_client_set_max_attempts(sd_dhcp_client *client, uint64_t max_attempt return 0; } -static sd_dhcp_option* dhcp_option_free(sd_dhcp_option *i) { - if (!i) - return NULL; - - free(i->data); - return mfree(i); -} - -int sd_dhcp_option_new(uint8_t option, void *data, size_t length, sd_dhcp_option **ret) { - assert_return(ret, -EINVAL); - assert_return(length == 0 || data, -EINVAL); - - _cleanup_free_ void *q = memdup(data, length); - if (!q) - return -ENOMEM; - - sd_dhcp_option *p = new(sd_dhcp_option, 1); - if (!p) - return -ENOMEM; - - *p = (sd_dhcp_option) { - .n_ref = 1, - .option = option, - .length = length, - .data = TAKE_PTR(q), - }; - - *ret = TAKE_PTR(p); - return 0; -} - -DEFINE_TRIVIAL_REF_UNREF_FUNC(sd_dhcp_option, sd_dhcp_option, dhcp_option_free); -DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR( - dhcp_option_hash_ops, - void, - trivial_hash_func, - trivial_compare_func, - sd_dhcp_option, - sd_dhcp_option_unref); - int sd_dhcp_client_set_dhcp_option(sd_dhcp_client *client, sd_dhcp_option *v) { int r; diff --git a/src/libsystemd-network/sd-dhcp-server.c b/src/libsystemd-network/sd-dhcp-server.c index 3316c8bda4f..9e51bf74f58 100644 --- a/src/libsystemd-network/sd-dhcp-server.c +++ b/src/libsystemd-network/sd-dhcp-server.c @@ -127,46 +127,6 @@ int client_id_compare_func(const DHCPClientId *a, const DHCPClientId *b) { DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(dhcp_lease_hash_ops, DHCPClientId, client_id_hash_func, client_id_compare_func, DHCPLease, dhcp_lease_free); -static sd_dhcp_raw_option* raw_option_free(sd_dhcp_raw_option *i) { - if (!i) - return NULL; - - free(i->data); - return mfree(i); -} - -_public_ int sd_dhcp_raw_option_new(uint8_t type, char *data, size_t length, sd_dhcp_raw_option **ret) { - _cleanup_(sd_dhcp_raw_option_unrefp) sd_dhcp_raw_option *p = NULL; - - assert_return(ret, -EINVAL); - - p = new(sd_dhcp_raw_option, 1); - if (!p) - return -ENOMEM; - - *p = (sd_dhcp_raw_option) { - .n_ref = 1, - .data = memdup(data, length), - .length = length, - .type = type, - }; - - if (!p->data) - return -ENOMEM; - - *ret = TAKE_PTR(p); - return 0; -} - -DEFINE_TRIVIAL_REF_UNREF_FUNC(sd_dhcp_raw_option, sd_dhcp_raw_option, raw_option_free); -DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR( - dhcp_raw_options_hash_ops, - void, - trivial_hash_func, - trivial_compare_func, - sd_dhcp_raw_option, - sd_dhcp_raw_option_unref); - static sd_dhcp_server *dhcp_server_free(sd_dhcp_server *server) { assert(server); @@ -1222,13 +1182,13 @@ int sd_dhcp_server_set_emit_router(sd_dhcp_server *server, int enabled) { return 1; } -int sd_dhcp_server_add_raw_option(sd_dhcp_server *server, sd_dhcp_raw_option *v) { +int sd_dhcp_server_add_option(sd_dhcp_server *server, sd_dhcp_option *v) { int r; assert_return(server, -EINVAL); assert_return(v, -EINVAL); - r = ordered_hashmap_ensure_allocated(&server->raw_option, &dhcp_raw_options_hash_ops); + r = ordered_hashmap_ensure_allocated(&server->raw_option, &dhcp_option_hash_ops); if (r < 0) return -ENOMEM; @@ -1236,7 +1196,7 @@ int sd_dhcp_server_add_raw_option(sd_dhcp_server *server, sd_dhcp_raw_option *v) if (r < 0) return r; - sd_dhcp_raw_option_ref(v); + sd_dhcp_option_ref(v); return 1; } diff --git a/src/network/networkd-dhcp-server.c b/src/network/networkd-dhcp-server.c index 8102c1be96c..a58cf8de8a3 100644 --- a/src/network/networkd-dhcp-server.c +++ b/src/network/networkd-dhcp-server.c @@ -2,6 +2,7 @@ #include "sd-dhcp-server.h" +#include "dhcp-internal.h" #include "escape.h" #include "networkd-dhcp-server.h" #include "networkd-link.h" @@ -192,7 +193,7 @@ static int link_push_uplink_sip_to_dhcp_server(Link *link, sd_dhcp_server *s) { int dhcp4_server_configure(Link *link) { bool acquired_uplink = false; - sd_dhcp_raw_option *p; + sd_dhcp_option *p; Link *uplink = NULL; Address *address; Iterator i; @@ -305,8 +306,8 @@ int dhcp4_server_configure(Link *link) { return r; } - ORDERED_HASHMAP_FOREACH(p, link->network->dhcp_server_raw_options, i) { - r = sd_dhcp_server_add_raw_option(link->dhcp_server, p); + ORDERED_HASHMAP_FOREACH(p, link->network->dhcp_server_options, i) { + r = sd_dhcp_server_add_option(link->dhcp_server, p); if (r == -EEXIST) continue; if (r < 0) @@ -492,7 +493,7 @@ int config_parse_dhcp_server_option_data( void *data, void *userdata) { - _cleanup_(sd_dhcp_raw_option_unrefp) sd_dhcp_raw_option *opt = NULL, *old = NULL; + _cleanup_(sd_dhcp_option_unrefp) sd_dhcp_option *opt = NULL, *old = NULL; _cleanup_free_ char *word = NULL, *q = NULL; union in_addr_union addr; DHCPOptionDataType type; @@ -512,7 +513,7 @@ int config_parse_dhcp_server_option_data( assert(data); if (isempty(rvalue)) { - network->dhcp_server_raw_options = ordered_hashmap_free(network->dhcp_server_raw_options); + network->dhcp_server_options = ordered_hashmap_free(network->dhcp_server_options); return 0; } @@ -619,20 +620,20 @@ int config_parse_dhcp_server_option_data( return -EINVAL; } - r = sd_dhcp_raw_option_new(u, udata, sz, &opt); + r = sd_dhcp_option_new(u, udata, sz, &opt); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Failed to store DHCP send raw option '%s', ignoring assignment: %m", rvalue); return 0; } - r = ordered_hashmap_ensure_allocated(&network->dhcp_server_raw_options, &dhcp_raw_options_hash_ops); + r = ordered_hashmap_ensure_allocated(&network->dhcp_server_options, &dhcp_option_hash_ops); if (r < 0) return log_oom(); /* Overwrite existing option */ - old = ordered_hashmap_remove(network->dhcp_server_raw_options, UINT_TO_PTR(u)); - r = ordered_hashmap_put(network->dhcp_server_raw_options, UINT_TO_PTR(u), opt); + old = ordered_hashmap_remove(network->dhcp_server_options, UINT_TO_PTR(u)); + r = ordered_hashmap_put(network->dhcp_server_options, UINT_TO_PTR(u), opt); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Failed to store DHCP server send raw option '%s'", rvalue); diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 8727fd329fa..6b51b16d9bb 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -687,7 +687,7 @@ static Network *network_free(Network *network) { set_free_free(network->dnssec_negative_trust_anchors); ordered_hashmap_free(network->dhcp_send_options); - ordered_hashmap_free(network->dhcp_server_raw_options); + ordered_hashmap_free(network->dhcp_server_options); return mfree(network); } diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 9c4dcf0532e..a1032051f10 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -115,7 +115,7 @@ struct Network { Set *dhcp_black_listed_ip; Set *dhcp_request_options; OrderedHashmap *dhcp_send_options; - OrderedHashmap *dhcp_server_raw_options; + OrderedHashmap *dhcp_server_options; /* DHCPv6 Client support*/ bool dhcp6_use_dns; diff --git a/src/systemd/meson.build b/src/systemd/meson.build index 75c48b07a51..05196554ac0 100644 --- a/src/systemd/meson.build +++ b/src/systemd/meson.build @@ -22,6 +22,7 @@ _not_installed_headers = ''' sd-dhcp6-lease.h sd-dhcp-client.h sd-dhcp-lease.h + sd-dhcp-option.h sd-dhcp-server.h sd-ipv4acd.h sd-ipv4ll.h diff --git a/src/systemd/sd-dhcp-client.h b/src/systemd/sd-dhcp-client.h index a44e6e35a2f..f97e35b6549 100644 --- a/src/systemd/sd-dhcp-client.h +++ b/src/systemd/sd-dhcp-client.h @@ -26,6 +26,7 @@ #include #include "sd-dhcp-lease.h" +#include "sd-dhcp-option.h" #include "sd-event.h" #include "_sd-common.h" @@ -99,7 +100,6 @@ enum { }; typedef struct sd_dhcp_client sd_dhcp_client; -typedef struct sd_dhcp_option sd_dhcp_option; typedef int (*sd_dhcp_client_callback_t)(sd_dhcp_client *client, int event, void *userdata); int sd_dhcp_client_set_callback( @@ -179,9 +179,6 @@ int sd_dhcp_client_set_service_type( sd_dhcp_client *client, int type); -int sd_dhcp_option_new(uint8_t option, void *data, size_t length, sd_dhcp_option **ret); -sd_dhcp_option* sd_dhcp_option_ref(sd_dhcp_option *i); -sd_dhcp_option* sd_dhcp_option_unref(sd_dhcp_option *i); int sd_dhcp_client_set_dhcp_option(sd_dhcp_client *client, sd_dhcp_option *v); int sd_dhcp_client_stop(sd_dhcp_client *client); @@ -204,7 +201,6 @@ int sd_dhcp_client_detach_event(sd_dhcp_client *client); sd_event *sd_dhcp_client_get_event(sd_dhcp_client *client); _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_dhcp_client, sd_dhcp_client_unref); -_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_dhcp_option, sd_dhcp_option_unref); _SD_END_DECLARATIONS; diff --git a/src/systemd/sd-dhcp-option.h b/src/systemd/sd-dhcp-option.h new file mode 100644 index 00000000000..45dbd279853 --- /dev/null +++ b/src/systemd/sd-dhcp-option.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ +#ifndef foosddhcpoptionhfoo +#define foosddhcpoptionhfoo + +/*** + Copyright © 2013 Intel Corporation. All rights reserved. + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +#include +#include + +#include "_sd-common.h" + +_SD_BEGIN_DECLARATIONS; + +typedef struct sd_dhcp_option sd_dhcp_option; + +int sd_dhcp_option_new(uint8_t option, const void *data, size_t length, sd_dhcp_option **ret); +sd_dhcp_option *sd_dhcp_option_ref(sd_dhcp_option *ra); +sd_dhcp_option *sd_dhcp_option_unref(sd_dhcp_option *ra); + +_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_dhcp_option, sd_dhcp_option_unref); + +_SD_END_DECLARATIONS; + +#endif diff --git a/src/systemd/sd-dhcp-server.h b/src/systemd/sd-dhcp-server.h index ba1bc4458a5..5950506c9bc 100644 --- a/src/systemd/sd-dhcp-server.h +++ b/src/systemd/sd-dhcp-server.h @@ -21,26 +21,20 @@ #include #include +#include "sd-dhcp-option.h" #include "sd-event.h" #include "_sd-common.h" _SD_BEGIN_DECLARATIONS; -extern const struct hash_ops dhcp_raw_options_hash_ops; - typedef struct sd_dhcp_server sd_dhcp_server; -typedef struct sd_dhcp_raw_option sd_dhcp_raw_option; int sd_dhcp_server_new(sd_dhcp_server **ret, int ifindex); sd_dhcp_server *sd_dhcp_server_ref(sd_dhcp_server *server); sd_dhcp_server *sd_dhcp_server_unref(sd_dhcp_server *server); -int sd_dhcp_raw_option_new(uint8_t type, char *data, size_t lengt, sd_dhcp_raw_option **ret); -sd_dhcp_raw_option *sd_dhcp_raw_option_ref(sd_dhcp_raw_option *ra); -sd_dhcp_raw_option *sd_dhcp_raw_option_unref(sd_dhcp_raw_option *ra); - int sd_dhcp_server_attach_event(sd_dhcp_server *client, sd_event *event, int64_t priority); int sd_dhcp_server_detach_event(sd_dhcp_server *client); sd_event *sd_dhcp_server_get_event(sd_dhcp_server *client); @@ -58,7 +52,7 @@ int sd_dhcp_server_set_ntp(sd_dhcp_server *server, const struct in_addr ntp[], u int sd_dhcp_server_set_sip(sd_dhcp_server *server, const struct in_addr sip[], unsigned n); int sd_dhcp_server_set_emit_router(sd_dhcp_server *server, int enabled); -int sd_dhcp_server_add_raw_option(sd_dhcp_server *server, sd_dhcp_raw_option *v); +int sd_dhcp_server_add_option(sd_dhcp_server *server, sd_dhcp_option *v); int sd_dhcp_server_set_max_lease_time(sd_dhcp_server *server, uint32_t t); int sd_dhcp_server_set_default_lease_time(sd_dhcp_server *server, uint32_t t); @@ -66,7 +60,6 @@ int sd_dhcp_server_set_default_lease_time(sd_dhcp_server *server, uint32_t t); int sd_dhcp_server_forcerenew(sd_dhcp_server *server); _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_dhcp_server, sd_dhcp_server_unref); -_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_dhcp_raw_option, sd_dhcp_raw_option_unref); _SD_END_DECLARATIONS; -- 2.39.2