summaryrefslogtreecommitdiff
path: root/src/libnm-systemd-core
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2022-07-05 14:53:45 +0200
committerThomas Haller <thaller@redhat.com>2022-07-05 18:23:12 +0200
commit3a603c87647c36c9f7d24dc727c81618ad06fca3 (patch)
treebadea706ab7d335b1ba9c2aec13959d5644ead39 /src/libnm-systemd-core
parent7b3466fc4cfedd85992fa24953a08f9f07d6d28f (diff)
downloadNetworkManager-3a603c87647c36c9f7d24dc727c81618ad06fca3.tar.gz
systemd: update code from upstream (2022-07-05)
This is a direct dump from systemd git. $ git clean -fdx && \ git cat-file -p HEAD | sed '1,/^======$/ d' | bash - && \ git add . ====== SYSTEMD_DIR=../systemd COMMIT=87a3a4a802b9fcfd92299e2984741835ed50fef4 ( cd "$SYSTEMD_DIR" git checkout "$COMMIT" git reset --hard git clean -fdx ) git ls-files -z :/src/libnm-systemd-core/src/ \ :/src/libnm-systemd-shared/src/ \ :/src/libnm-std-aux/unaligned.h | \ xargs -0 rm -f nm_copy_sd_shared() { mkdir -p "./src/libnm-systemd-shared/$(dirname "$1")" cp "$SYSTEMD_DIR/$1" "./src/libnm-systemd-shared/$1" } nm_copy_sd_core() { mkdir -p "./src/libnm-systemd-core/$(dirname "$1")" cp "$SYSTEMD_DIR/$1" "./src/libnm-systemd-core/$1" } nm_copy_sd_stdaux() { mkdir -p "./src/libnm-std-aux/" cp "$SYSTEMD_DIR/$1" "./src/libnm-std-aux/${1##*/}" } nm_copy_sd_core "src/libsystemd-network/arp-util.c" nm_copy_sd_core "src/libsystemd-network/arp-util.h" nm_copy_sd_core "src/libsystemd-network/dhcp-identifier.c" nm_copy_sd_core "src/libsystemd-network/dhcp-identifier.h" nm_copy_sd_core "src/libsystemd-network/dhcp-internal.h" nm_copy_sd_core "src/libsystemd-network/dhcp-lease-internal.h" nm_copy_sd_core "src/libsystemd-network/dhcp-network.c" nm_copy_sd_core "src/libsystemd-network/dhcp-protocol.h" nm_copy_sd_core "src/libsystemd-network/dhcp6-internal.h" nm_copy_sd_core "src/libsystemd-network/dhcp6-lease-internal.h" nm_copy_sd_core "src/libsystemd-network/dhcp6-network.c" nm_copy_sd_core "src/libsystemd-network/dhcp6-option.c" nm_copy_sd_core "src/libsystemd-network/dhcp6-option.h" nm_copy_sd_core "src/libsystemd-network/dhcp6-protocol.c" nm_copy_sd_core "src/libsystemd-network/dhcp6-protocol.h" nm_copy_sd_core "src/libsystemd-network/lldp-neighbor.c" nm_copy_sd_core "src/libsystemd-network/lldp-neighbor.h" nm_copy_sd_core "src/libsystemd-network/lldp-network.c" nm_copy_sd_core "src/libsystemd-network/lldp-network.h" nm_copy_sd_core "src/libsystemd-network/lldp-rx-internal.h" nm_copy_sd_core "src/libsystemd-network/network-common.c" nm_copy_sd_core "src/libsystemd-network/network-common.h" nm_copy_sd_core "src/libsystemd-network/network-internal.h" nm_copy_sd_core "src/libsystemd-network/sd-dhcp-client.c" nm_copy_sd_core "src/libsystemd-network/sd-dhcp6-client.c" nm_copy_sd_core "src/libsystemd-network/sd-dhcp6-lease.c" nm_copy_sd_core "src/libsystemd-network/sd-lldp-rx.c" nm_copy_sd_core "src/libsystemd/sd-event/event-source.h" nm_copy_sd_core "src/libsystemd/sd-event/event-util.c" nm_copy_sd_core "src/libsystemd/sd-event/event-util.h" nm_copy_sd_core "src/libsystemd/sd-event/sd-event.c" nm_copy_sd_core "src/libsystemd/sd-id128/id128-util.c" nm_copy_sd_core "src/libsystemd/sd-id128/id128-util.h" nm_copy_sd_core "src/libsystemd/sd-id128/sd-id128.c" nm_copy_sd_core "src/systemd/_sd-common.h" nm_copy_sd_core "src/systemd/sd-dhcp6-client.h" nm_copy_sd_core "src/systemd/sd-dhcp6-lease.h" nm_copy_sd_core "src/systemd/sd-dhcp6-option.h" nm_copy_sd_core "src/systemd/sd-event.h" nm_copy_sd_core "src/systemd/sd-id128.h" nm_copy_sd_core "src/systemd/sd-lldp-rx.h" nm_copy_sd_core "src/systemd/sd-lldp.h" nm_copy_sd_core "src/systemd/sd-ndisc.h" nm_copy_sd_shared "src/basic/alloc-util.c" nm_copy_sd_shared "src/basic/alloc-util.h" nm_copy_sd_shared "src/basic/async.h" nm_copy_sd_shared "src/basic/cgroup-util.h" nm_copy_sd_shared "src/basic/dns-def.h" nm_copy_sd_shared "src/basic/env-file.c" nm_copy_sd_shared "src/basic/env-file.h" nm_copy_sd_shared "src/basic/env-util.c" nm_copy_sd_shared "src/basic/env-util.h" nm_copy_sd_shared "src/basic/errno-util.h" nm_copy_sd_shared "src/basic/escape.c" nm_copy_sd_shared "src/basic/escape.h" nm_copy_sd_shared "src/basic/ether-addr-util.c" nm_copy_sd_shared "src/basic/ether-addr-util.h" nm_copy_sd_shared "src/basic/extract-word.c" nm_copy_sd_shared "src/basic/extract-word.h" nm_copy_sd_shared "src/basic/fd-util.c" nm_copy_sd_shared "src/basic/fd-util.h" nm_copy_sd_shared "src/basic/fileio.c" nm_copy_sd_shared "src/basic/fileio.h" nm_copy_sd_shared "src/basic/format-util.c" nm_copy_sd_shared "src/basic/format-util.h" nm_copy_sd_shared "src/basic/fs-util.c" nm_copy_sd_shared "src/basic/fs-util.h" nm_copy_sd_shared "src/basic/glyph-util.c" nm_copy_sd_shared "src/basic/glyph-util.h" nm_copy_sd_shared "src/basic/hash-funcs.c" nm_copy_sd_shared "src/basic/hash-funcs.h" nm_copy_sd_shared "src/basic/hashmap.c" nm_copy_sd_shared "src/basic/hashmap.h" nm_copy_sd_shared "src/basic/hexdecoct.c" nm_copy_sd_shared "src/basic/hexdecoct.h" nm_copy_sd_shared "src/basic/hostname-util.c" nm_copy_sd_shared "src/basic/hostname-util.h" nm_copy_sd_shared "src/basic/in-addr-util.c" nm_copy_sd_shared "src/basic/in-addr-util.h" nm_copy_sd_shared "src/basic/inotify-util.c" nm_copy_sd_shared "src/basic/inotify-util.h" nm_copy_sd_shared "src/basic/io-util.c" nm_copy_sd_shared "src/basic/io-util.h" nm_copy_sd_shared "src/basic/list.h" nm_copy_sd_shared "src/basic/locale-util.c" nm_copy_sd_shared "src/basic/locale-util.h" nm_copy_sd_shared "src/basic/log.h" nm_copy_sd_shared "src/basic/macro.h" nm_copy_sd_shared "src/basic/memory-util.c" nm_copy_sd_shared "src/basic/memory-util.h" nm_copy_sd_shared "src/basic/mempool.c" nm_copy_sd_shared "src/basic/mempool.h" nm_copy_sd_shared "src/basic/missing_fcntl.h" nm_copy_sd_shared "src/basic/missing_random.h" nm_copy_sd_shared "src/basic/missing_socket.h" nm_copy_sd_shared "src/basic/missing_stat.h" nm_copy_sd_shared "src/basic/missing_syscall.h" nm_copy_sd_shared "src/basic/missing_type.h" nm_copy_sd_shared "src/basic/ordered-set.c" nm_copy_sd_shared "src/basic/ordered-set.h" nm_copy_sd_shared "src/basic/parse-util.c" nm_copy_sd_shared "src/basic/parse-util.h" nm_copy_sd_shared "src/basic/path-util.c" nm_copy_sd_shared "src/basic/path-util.h" nm_copy_sd_shared "src/basic/prioq.c" nm_copy_sd_shared "src/basic/prioq.h" nm_copy_sd_shared "src/basic/process-util.c" nm_copy_sd_shared "src/basic/process-util.h" nm_copy_sd_shared "src/basic/random-util.c" nm_copy_sd_shared "src/basic/random-util.h" nm_copy_sd_shared "src/basic/ratelimit.c" nm_copy_sd_shared "src/basic/ratelimit.h" nm_copy_sd_shared "src/basic/set.h" nm_copy_sd_shared "src/basic/signal-util.c" nm_copy_sd_shared "src/basic/signal-util.h" nm_copy_sd_shared "src/basic/siphash24.h" nm_copy_sd_shared "src/basic/socket-util.c" nm_copy_sd_shared "src/basic/socket-util.h" nm_copy_sd_shared "src/basic/sort-util.h" nm_copy_sd_shared "src/basic/sparse-endian.h" nm_copy_sd_shared "src/basic/stat-util.c" nm_copy_sd_shared "src/basic/stat-util.h" nm_copy_sd_shared "src/basic/stdio-util.h" nm_copy_sd_shared "src/basic/string-table.c" nm_copy_sd_shared "src/basic/string-table.h" nm_copy_sd_shared "src/basic/string-util.c" nm_copy_sd_shared "src/basic/string-util.h" nm_copy_sd_shared "src/basic/strv.c" nm_copy_sd_shared "src/basic/strv.h" nm_copy_sd_shared "src/basic/strxcpyx.c" nm_copy_sd_shared "src/basic/strxcpyx.h" nm_copy_sd_shared "src/basic/time-util.c" nm_copy_sd_shared "src/basic/time-util.h" nm_copy_sd_shared "src/basic/tmpfile-util.c" nm_copy_sd_shared "src/basic/tmpfile-util.h" nm_copy_sd_shared "src/basic/umask-util.h" nm_copy_sd_shared "src/basic/user-util.h" nm_copy_sd_shared "src/basic/utf8.c" nm_copy_sd_shared "src/basic/utf8.h" nm_copy_sd_shared "src/basic/util.c" nm_copy_sd_shared "src/basic/util.h" nm_copy_sd_shared "src/fundamental/macro-fundamental.h" nm_copy_sd_shared "src/fundamental/sha256.c" nm_copy_sd_shared "src/fundamental/sha256.h" nm_copy_sd_shared "src/fundamental/string-util-fundamental.c" nm_copy_sd_shared "src/fundamental/string-util-fundamental.h" nm_copy_sd_shared "src/shared/dns-domain.c" nm_copy_sd_shared "src/shared/dns-domain.h" nm_copy_sd_shared "src/shared/log-link.h" nm_copy_sd_shared "src/shared/web-util.c" nm_copy_sd_shared "src/shared/web-util.h" nm_copy_sd_stdaux "src/basic/unaligned.h"
Diffstat (limited to 'src/libnm-systemd-core')
-rw-r--r--src/libnm-systemd-core/src/libsystemd-network/dhcp-identifier.c3
-rw-r--r--src/libnm-systemd-core/src/libsystemd-network/dhcp-option.c438
-rw-r--r--src/libnm-systemd-core/src/libsystemd-network/dhcp-packet.c194
-rw-r--r--src/libnm-systemd-core/src/libsystemd-network/dhcp6-internal.h2
-rw-r--r--src/libnm-systemd-core/src/libsystemd-network/dhcp6-option.c16
-rw-r--r--src/libnm-systemd-core/src/libsystemd-network/lldp-neighbor.c6
-rw-r--r--src/libnm-systemd-core/src/libsystemd-network/network-internal.c241
-rw-r--r--src/libnm-systemd-core/src/libsystemd-network/sd-dhcp-lease.c1506
-rw-r--r--src/libnm-systemd-core/src/libsystemd-network/sd-dhcp6-client.c97
-rw-r--r--src/libnm-systemd-core/src/libsystemd-network/sd-dhcp6-lease.c6
-rw-r--r--src/libnm-systemd-core/src/libsystemd-network/sd-ipv4ll.c380
-rw-r--r--src/libnm-systemd-core/src/libsystemd/sd-event/event-util.c14
-rw-r--r--src/libnm-systemd-core/src/libsystemd/sd-event/event-util.h5
-rw-r--r--src/libnm-systemd-core/src/libsystemd/sd-event/sd-event.c100
-rw-r--r--src/libnm-systemd-core/src/libsystemd/sd-id128/id128-util.c28
-rw-r--r--src/libnm-systemd-core/src/libsystemd/sd-id128/id128-util.h2
-rw-r--r--src/libnm-systemd-core/src/libsystemd/sd-id128/sd-id128.c26
-rw-r--r--src/libnm-systemd-core/src/systemd/_sd-common.h2
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-dhcp-client.h345
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-dhcp-lease.h91
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-dhcp-option.h38
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-dhcp6-client.h16
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-dhcp6-lease.h2
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-dhcp6-option.h2
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-event.h2
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-id128.h6
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-ipv4acd.h63
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-ipv4ll.h65
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-lldp-rx.h6
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-lldp.h14
-rw-r--r--src/libnm-systemd-core/src/systemd/sd-ndisc.h11
31 files changed, 198 insertions, 3529 deletions
diff --git a/src/libnm-systemd-core/src/libsystemd-network/dhcp-identifier.c b/src/libnm-systemd-core/src/libsystemd-network/dhcp-identifier.c
index d2b190244f..326b09ac5e 100644
--- a/src/libnm-systemd-core/src/libsystemd-network/dhcp-identifier.c
+++ b/src/libnm-systemd-core/src/libsystemd-network/dhcp-identifier.c
@@ -11,7 +11,6 @@
#include "netif-util.h"
#include "siphash24.h"
#include "sparse-endian.h"
-#include "stat-util.h"
#include "string-table.h"
#include "udev-util.h"
@@ -213,7 +212,7 @@ int dhcp_identifier_set_iaid(
uint64_t id;
int r;
- if (path_is_read_only_fs("/sys") <= 0 && !use_mac) {
+ if (udev_available() && !use_mac) {
/* udev should be around */
r = sd_device_new_from_ifindex(&device, ifindex);
diff --git a/src/libnm-systemd-core/src/libsystemd-network/dhcp-option.c b/src/libnm-systemd-core/src/libsystemd-network/dhcp-option.c
deleted file mode 100644
index efb676e60b..0000000000
--- a/src/libnm-systemd-core/src/libsystemd-network/dhcp-option.c
+++ /dev/null
@@ -1,438 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/***
- Copyright © 2013 Intel Corporation. All rights reserved.
-***/
-
-#include <errno.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#include "alloc-util.h"
-#include "dhcp-internal.h"
-#include "dhcp-server-internal.h"
-#include "memory-util.h"
-#include "strv.h"
-#include "utf8.h"
-
-/* Append type-length value structure to the options buffer */
-static int dhcp_option_append_tlv(uint8_t options[], size_t size, size_t *offset, uint8_t code, size_t optlen, const void *optval) {
- assert(options);
- assert(size > 0);
- assert(offset);
- assert(optlen <= UINT8_MAX);
- assert(*offset < size);
-
- if (*offset + 2 + optlen > size)
- return -ENOBUFS;
-
- options[*offset] = code;
- options[*offset + 1] = optlen;
-
- memcpy_safe(&options[*offset + 2], optval, optlen);
- *offset += 2 + optlen;
- return 0;
-}
-
-static int option_append(uint8_t options[], size_t size, size_t *offset,
- uint8_t code, size_t optlen, const void *optval) {
- assert(options);
- assert(size > 0);
- assert(offset);
-
- int r;
-
- if (code != SD_DHCP_OPTION_END)
- /* always make sure there is space for an END option */
- size--;
-
- switch (code) {
-
- case SD_DHCP_OPTION_PAD:
- case SD_DHCP_OPTION_END:
- if (*offset + 1 > size)
- return -ENOBUFS;
-
- options[*offset] = code;
- *offset += 1;
- break;
-
- case SD_DHCP_OPTION_USER_CLASS: {
- size_t total = 0;
-
- if (strv_isempty((char **) optval))
- return -EINVAL;
-
- STRV_FOREACH(s, (char **) optval) {
- size_t len = strlen(*s);
-
- if (len > 255 || len == 0)
- return -EINVAL;
-
- total += 1 + len;
- }
-
- if (*offset + 2 + total > size)
- return -ENOBUFS;
-
- options[*offset] = code;
- options[*offset + 1] = total;
- *offset += 2;
-
- STRV_FOREACH(s, (char **) optval) {
- size_t len = strlen(*s);
-
- options[*offset] = len;
- memcpy(&options[*offset + 1], *s, len);
- *offset += 1 + len;
- }
-
- break;
- }
- case SD_DHCP_OPTION_SIP_SERVER:
- if (*offset + 3 + optlen > size)
- return -ENOBUFS;
-
- options[*offset] = code;
- options[*offset + 1] = optlen + 1;
- options[*offset + 2] = 1;
-
- memcpy_safe(&options[*offset + 3], optval, optlen);
- *offset += 3 + optlen;
-
- break;
- case SD_DHCP_OPTION_VENDOR_SPECIFIC: {
- OrderedSet *s = (OrderedSet *) optval;
- struct sd_dhcp_option *p;
- size_t l = 0;
-
- ORDERED_SET_FOREACH(p, s)
- l += p->length + 2;
-
- if (*offset + l + 2 > size)
- return -ENOBUFS;
-
- options[*offset] = code;
- options[*offset + 1] = l;
- *offset += 2;
-
- ORDERED_SET_FOREACH(p, s) {
- r = dhcp_option_append_tlv(options, size, offset, p->option, p->length, p->data);
- if (r < 0)
- return r;
- }
- break;
- }
- case SD_DHCP_OPTION_RELAY_AGENT_INFORMATION: {
- sd_dhcp_server *server = (sd_dhcp_server *) optval;
- size_t current_offset = *offset + 2;
-
- if (server->agent_circuit_id) {
- r = dhcp_option_append_tlv(options, size, &current_offset, SD_DHCP_RELAY_AGENT_CIRCUIT_ID,
- strlen(server->agent_circuit_id), server->agent_circuit_id);
- if (r < 0)
- return r;
- }
- if (server->agent_remote_id) {
- r = dhcp_option_append_tlv(options, size, &current_offset, SD_DHCP_RELAY_AGENT_REMOTE_ID,
- strlen(server->agent_remote_id), server->agent_remote_id);
- if (r < 0)
- return r;
- }
-
- options[*offset] = code;
- options[*offset + 1] = current_offset - *offset - 2;
- assert(current_offset - *offset - 2 <= UINT8_MAX);
- *offset = current_offset;
- break;
- }
- default:
- return dhcp_option_append_tlv(options, size, offset, code, optlen, optval);
- }
- return 0;
-}
-
-static int option_length(uint8_t *options, size_t length, size_t offset) {
- assert(options);
- assert(offset < length);
-
- if (IN_SET(options[offset], SD_DHCP_OPTION_PAD, SD_DHCP_OPTION_END))
- return 1;
- if (length < offset + 2)
- return -ENOBUFS;
-
- /* validating that buffer is long enough */
- if (length < offset + 2 + options[offset + 1])
- return -ENOBUFS;
-
- return options[offset + 1] + 2;
-}
-
-int dhcp_option_find_option(uint8_t *options, size_t length, uint8_t code, size_t *ret_offset) {
- int r;
-
- assert(options);
- assert(ret_offset);
-
- for (size_t offset = 0; offset < length; offset += r) {
- r = option_length(options, length, offset);
- if (r < 0)
- return r;
-
- if (code == options[offset]) {
- *ret_offset = offset;
- return r;
- }
- }
- return -ENOENT;
-}
-
-int dhcp_option_remove_option(uint8_t *options, size_t length, uint8_t option_code) {
- int r;
- size_t offset;
-
- assert(options);
-
- r = dhcp_option_find_option(options, length, option_code, &offset);
- if (r < 0)
- return r;
-
- memmove(options + offset, options + offset + r, length - offset - r);
- return length - r;
-}
-
-int dhcp_option_append(DHCPMessage *message, size_t size, size_t *offset,
- uint8_t overload,
- uint8_t code, size_t optlen, const void *optval) {
- const bool use_file = overload & DHCP_OVERLOAD_FILE;
- const bool use_sname = overload & DHCP_OVERLOAD_SNAME;
- int r;
-
- assert(message);
- assert(offset);
-
- /* If *offset is in range [0, size), we are writing to ->options,
- * if *offset is in range [size, size + sizeof(message->file)) and use_file, we are writing to ->file,
- * if *offset is in range [size + use_file*sizeof(message->file), size + use_file*sizeof(message->file) + sizeof(message->sname))
- * and use_sname, we are writing to ->sname.
- */
-
- if (*offset < size) {
- /* still space in the options array */
- r = option_append(message->options, size, offset, code, optlen, optval);
- if (r >= 0)
- return 0;
- else if (r == -ENOBUFS && (use_file || use_sname)) {
- /* did not fit, but we have more buffers to try
- close the options array and move the offset to its end */
- r = option_append(message->options, size, offset, SD_DHCP_OPTION_END, 0, NULL);
- if (r < 0)
- return r;
-
- *offset = size;
- } else
- return r;
- }
-
- if (use_file) {
- size_t file_offset = *offset - size;
-
- if (file_offset < sizeof(message->file)) {
- /* still space in the 'file' array */
- r = option_append(message->file, sizeof(message->file), &file_offset, code, optlen, optval);
- if (r >= 0) {
- *offset = size + file_offset;
- return 0;
- } else if (r == -ENOBUFS && use_sname) {
- /* did not fit, but we have more buffers to try
- close the file array and move the offset to its end */
- r = option_append(message->file, sizeof(message->file), &file_offset, SD_DHCP_OPTION_END, 0, NULL);
- if (r < 0)
- return r;
-
- *offset = size + sizeof(message->file);
- } else
- return r;
- }
- }
-
- if (use_sname) {
- size_t sname_offset = *offset - size - use_file*sizeof(message->file);
-
- if (sname_offset < sizeof(message->sname)) {
- /* still space in the 'sname' array */
- r = option_append(message->sname, sizeof(message->sname), &sname_offset, code, optlen, optval);
- if (r >= 0) {
- *offset = size + use_file*sizeof(message->file) + sname_offset;
- return 0;
- } else
- /* no space, or other error, give up */
- return r;
- }
- }
-
- return -ENOBUFS;
-}
-
-static int parse_options(const uint8_t options[], size_t buflen, uint8_t *overload,
- uint8_t *message_type, char **error_message, dhcp_option_callback_t cb,
- void *userdata) {
- uint8_t code, len;
- const uint8_t *option;
- size_t offset = 0;
-
- while (offset < buflen) {
- code = options[offset ++];
-
- switch (code) {
- case SD_DHCP_OPTION_PAD:
- continue;
-
- case SD_DHCP_OPTION_END:
- return 0;
- }
-
- if (buflen < offset + 1)
- return -ENOBUFS;
-
- len = options[offset ++];
-
- if (buflen < offset + len)
- return -EINVAL;
-
- option = &options[offset];
-
- switch (code) {
- case SD_DHCP_OPTION_MESSAGE_TYPE:
- if (len != 1)
- return -EINVAL;
-
- if (message_type)
- *message_type = *option;
-
- break;
-
- case SD_DHCP_OPTION_ERROR_MESSAGE:
- if (len == 0)
- return -EINVAL;
-
- if (error_message) {
- _cleanup_free_ char *string = NULL;
-
- /* Accept a trailing NUL byte */
- if (memchr(option, 0, len - 1))
- return -EINVAL;
-
- string = memdup_suffix0((const char *) option, len);
- if (!string)
- return -ENOMEM;
-
- if (!ascii_is_valid(string))
- return -EINVAL;
-
- free_and_replace(*error_message, string);
- }
-
- break;
- case SD_DHCP_OPTION_OVERLOAD:
- if (len != 1)
- return -EINVAL;
-
- if (overload)
- *overload = *option;
-
- break;
-
- default:
- if (cb)
- cb(code, len, option, userdata);
-
- break;
- }
-
- offset += len;
- }
-
- if (offset < buflen)
- return -EINVAL;
-
- return 0;
-}
-
-int dhcp_option_parse(DHCPMessage *message, size_t len, dhcp_option_callback_t cb, void *userdata, char **_error_message) {
- _cleanup_free_ char *error_message = NULL;
- uint8_t overload = 0;
- uint8_t message_type = 0;
- int r;
-
- if (!message)
- return -EINVAL;
-
- if (len < sizeof(DHCPMessage))
- return -EINVAL;
-
- len -= sizeof(DHCPMessage);
-
- r = parse_options(message->options, len, &overload, &message_type, &error_message, cb, userdata);
- if (r < 0)
- return r;
-
- if (overload & DHCP_OVERLOAD_FILE) {
- r = parse_options(message->file, sizeof(message->file), NULL, &message_type, &error_message, cb, userdata);
- if (r < 0)
- return r;
- }
-
- if (overload & DHCP_OVERLOAD_SNAME) {
- r = parse_options(message->sname, sizeof(message->sname), NULL, &message_type, &error_message, cb, userdata);
- if (r < 0)
- return r;
- }
-
- if (message_type == 0)
- return -ENOMSG;
-
- if (_error_message && IN_SET(message_type, DHCP_NAK, DHCP_DECLINE))
- *_error_message = TAKE_PTR(error_message);
-
- 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/libnm-systemd-core/src/libsystemd-network/dhcp-packet.c b/src/libnm-systemd-core/src/libsystemd-network/dhcp-packet.c
deleted file mode 100644
index d1a1cf57f3..0000000000
--- a/src/libnm-systemd-core/src/libsystemd-network/dhcp-packet.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/***
- Copyright © 2013 Intel Corporation. All rights reserved.
-***/
-
-#include <errno.h>
-#include <net/ethernet.h>
-#include <net/if_arp.h>
-#include <string.h>
-
-#include "dhcp-internal.h"
-#include "dhcp-protocol.h"
-#include "memory-util.h"
-
-#define DHCP_CLIENT_MIN_OPTIONS_SIZE 312
-
-int dhcp_message_init(
- DHCPMessage *message,
- uint8_t op,
- uint32_t xid,
- uint8_t type,
- uint16_t arp_type,
- uint8_t hlen,
- const uint8_t *chaddr,
- size_t optlen,
- size_t *optoffset) {
-
- size_t offset = 0;
- int r;
-
- assert(IN_SET(op, BOOTREQUEST, BOOTREPLY));
- assert(chaddr || hlen == 0);
-
- message->op = op;
- message->htype = arp_type;
-
- /* RFC2131 section 4.1.1:
- The client MUST include its hardware address in the ’chaddr’ field, if
- necessary for delivery of DHCP reply messages.
-
- RFC 4390 section 2.1:
- A DHCP client, when working over an IPoIB interface, MUST follow the
- following rules:
- "htype" (hardware address type) MUST be 32 [ARPPARAM].
- "hlen" (hardware address length) MUST be 0.
- "chaddr" (client hardware address) field MUST be zeroed.
- */
- message->hlen = (arp_type == ARPHRD_INFINIBAND) ? 0 : hlen;
- memcpy_safe(message->chaddr, chaddr, message->hlen);
-
- message->xid = htobe32(xid);
- message->magic = htobe32(DHCP_MAGIC_COOKIE);
-
- r = dhcp_option_append(message, optlen, &offset, 0,
- SD_DHCP_OPTION_MESSAGE_TYPE, 1, &type);
- if (r < 0)
- return r;
-
- *optoffset = offset;
-
- return 0;
-}
-
-uint16_t dhcp_packet_checksum(uint8_t *buf, size_t len) {
- uint64_t *buf_64 = (uint64_t*)buf;
- uint64_t *end_64 = buf_64 + (len / sizeof(uint64_t));
- uint64_t sum = 0;
-
- /* See RFC1071 */
-
- while (buf_64 < end_64) {
- sum += *buf_64;
- if (sum < *buf_64)
- /* wrap around in one's complement */
- sum++;
-
- buf_64++;
- }
-
- if (len % sizeof(uint64_t)) {
- /* If the buffer is not aligned to 64-bit, we need
- to zero-pad the last few bytes and add them in */
- uint64_t buf_tail = 0;
-
- memcpy(&buf_tail, buf_64, len % sizeof(uint64_t));
-
- sum += buf_tail;
- if (sum < buf_tail)
- /* wrap around */
- sum++;
- }
-
- while (sum >> 16)
- sum = (sum & 0xffff) + (sum >> 16);
-
- return ~sum;
-}
-
-void dhcp_packet_append_ip_headers(DHCPPacket *packet, be32_t source_addr,
- uint16_t source_port, be32_t destination_addr,
- uint16_t destination_port, uint16_t len, int ip_service_type) {
- packet->ip.version = IPVERSION;
- packet->ip.ihl = DHCP_IP_SIZE / 4;
- packet->ip.tot_len = htobe16(len);
-
- if (ip_service_type >= 0)
- packet->ip.tos = ip_service_type;
- else
- packet->ip.tos = IPTOS_CLASS_CS6;
-
- packet->ip.protocol = IPPROTO_UDP;
- packet->ip.saddr = source_addr;
- packet->ip.daddr = destination_addr;
-
- packet->udp.source = htobe16(source_port);
- packet->udp.dest = htobe16(destination_port);
-
- packet->udp.len = htobe16(len - DHCP_IP_SIZE);
-
- packet->ip.check = packet->udp.len;
- packet->udp.check = dhcp_packet_checksum((uint8_t*)&packet->ip.ttl, len - 8);
-
- packet->ip.ttl = IPDEFTTL;
- packet->ip.check = 0;
- packet->ip.check = dhcp_packet_checksum((uint8_t*)&packet->ip, DHCP_IP_SIZE);
-}
-
-int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum, uint16_t port) {
- size_t hdrlen;
-
- assert(packet);
-
- /* IP */
-
- if (packet->ip.version != IPVERSION)
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
- "ignoring packet: not IPv4");
-
- if (packet->ip.ihl < 5)
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
- "ignoring packet: IPv4 IHL (%u words) invalid",
- packet->ip.ihl);
-
- hdrlen = packet->ip.ihl * 4;
- if (hdrlen < 20)
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
- "ignoring packet: IPv4 IHL (%zu bytes) "
- "smaller than minimum (20 bytes)",
- hdrlen);
-
- if (len < hdrlen)
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
- "ignoring packet: packet (%zu bytes) "
- "smaller than expected (%zu) by IP header",
- len, hdrlen);
-
- /* UDP */
-
- if (packet->ip.protocol != IPPROTO_UDP)
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
- "ignoring packet: not UDP");
-
- if (len < hdrlen + be16toh(packet->udp.len))
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
- "ignoring packet: packet (%zu bytes) "
- "smaller than expected (%zu) by UDP header",
- len, hdrlen + be16toh(packet->udp.len));
-
- if (be16toh(packet->udp.dest) != port)
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
- "ignoring packet: to port %u, which "
- "is not the DHCP client port (%u)",
- be16toh(packet->udp.dest), port);
-
- /* checksums - computing these is relatively expensive, so only do it
- if all the other checks have passed
- */
-
- if (dhcp_packet_checksum((uint8_t*)&packet->ip, hdrlen))
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
- "ignoring packet: invalid IP checksum");
-
- if (checksum && packet->udp.check) {
- packet->ip.check = packet->udp.len;
- packet->ip.ttl = 0;
-
- if (dhcp_packet_checksum((uint8_t*)&packet->ip.ttl,
- be16toh(packet->udp.len) + 12))
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
- "ignoring packet: invalid UDP checksum");
- }
-
- return 0;
-}
diff --git a/src/libnm-systemd-core/src/libsystemd-network/dhcp6-internal.h b/src/libnm-systemd-core/src/libsystemd-network/dhcp6-internal.h
index 0d7813f613..176391ebec 100644
--- a/src/libnm-systemd-core/src/libsystemd-network/dhcp6-internal.h
+++ b/src/libnm-systemd-core/src/libsystemd-network/dhcp6-internal.h
@@ -64,7 +64,7 @@ struct sd_dhcp6_client {
struct duid duid;
size_t duid_len;
be16_t *req_opts;
- size_t req_opts_len;
+ size_t n_req_opts;
char *fqdn;
char *mudurl;
char **user_class;
diff --git a/src/libnm-systemd-core/src/libsystemd-network/dhcp6-option.c b/src/libnm-systemd-core/src/libsystemd-network/dhcp6-option.c
index eccfbe8b65..63d3f60513 100644
--- a/src/libnm-systemd-core/src/libsystemd-network/dhcp6-option.c
+++ b/src/libnm-systemd-core/src/libsystemd-network/dhcp6-option.c
@@ -51,18 +51,20 @@ bool dhcp6_option_can_request(uint16_t option) {
return false;
case SD_DHCP6_OPTION_SIP_SERVER_DOMAIN_NAME:
case SD_DHCP6_OPTION_SIP_SERVER_ADDRESS:
- case SD_DHCP6_OPTION_DNS_SERVERS:
- case SD_DHCP6_OPTION_DOMAIN_LIST:
+ case SD_DHCP6_OPTION_DNS_SERVER:
+ case SD_DHCP6_OPTION_DOMAIN:
return true;
case SD_DHCP6_OPTION_IA_PD:
case SD_DHCP6_OPTION_IA_PD_PREFIX:
return false;
- case SD_DHCP6_OPTION_NIS_SERVERS:
- case SD_DHCP6_OPTION_NISP_SERVERS:
+ case SD_DHCP6_OPTION_NIS_SERVER:
+ case SD_DHCP6_OPTION_NISP_SERVER:
case SD_DHCP6_OPTION_NIS_DOMAIN_NAME:
case SD_DHCP6_OPTION_NISP_DOMAIN_NAME:
- case SD_DHCP6_OPTION_SNTP_SERVERS:
+ case SD_DHCP6_OPTION_SNTP_SERVER:
+ return true;
case SD_DHCP6_OPTION_INFORMATION_REFRESH_TIME:
+ return false; /* This is automatically set when sending INFORMATION_REQUEST message. */
case SD_DHCP6_OPTION_BCMCS_SERVER_D:
case SD_DHCP6_OPTION_BCMCS_SERVER_A:
case SD_DHCP6_OPTION_GEOCONF_CIVIC:
@@ -124,9 +126,9 @@ bool dhcp6_option_can_request(uint16_t option) {
case SD_DHCP6_OPTION_CLIENT_LINKLAYER_ADDR:
case SD_DHCP6_OPTION_LINK_ADDRESS:
case SD_DHCP6_OPTION_RADIUS:
+ case SD_DHCP6_OPTION_SOL_MAX_RT: /* Automatically set when sending SOLICIT message. */
+ case SD_DHCP6_OPTION_INF_MAX_RT: /* Automatically set when sending INFORMATION_REQUEST message. */
return false;
- case SD_DHCP6_OPTION_SOL_MAX_RT:
- case SD_DHCP6_OPTION_INF_MAX_RT:
case SD_DHCP6_OPTION_ADDRSEL:
case SD_DHCP6_OPTION_ADDRSEL_TABLE:
case SD_DHCP6_OPTION_V6_PCP_SERVER:
diff --git a/src/libnm-systemd-core/src/libsystemd-network/lldp-neighbor.c b/src/libnm-systemd-core/src/libsystemd-network/lldp-neighbor.c
index b056019989..6672409d75 100644
--- a/src/libnm-systemd-core/src/libsystemd-network/lldp-neighbor.c
+++ b/src/libnm-systemd-core/src/libsystemd-network/lldp-neighbor.c
@@ -116,6 +116,9 @@ sd_lldp_neighbor *lldp_neighbor_unlink(sd_lldp_neighbor *n) {
sd_lldp_neighbor *lldp_neighbor_new(size_t raw_size) {
sd_lldp_neighbor *n;
+ if (raw_size > SIZE_MAX - ALIGN(sizeof(sd_lldp_neighbor)))
+ return NULL;
+
n = malloc0(ALIGN(sizeof(sd_lldp_neighbor)) + raw_size);
if (!n)
return NULL;
@@ -649,7 +652,8 @@ int sd_lldp_neighbor_from_raw(sd_lldp_neighbor **ret, const void *raw, size_t ra
if (!n)
return -ENOMEM;
- memcpy(LLDP_NEIGHBOR_RAW(n), raw, raw_size);
+ memcpy_safe(LLDP_NEIGHBOR_RAW(n), raw, raw_size);
+
r = lldp_neighbor_parse(n);
if (r < 0)
return r;
diff --git a/src/libnm-systemd-core/src/libsystemd-network/network-internal.c b/src/libnm-systemd-core/src/libsystemd-network/network-internal.c
deleted file mode 100644
index bc7aec2f9d..0000000000
--- a/src/libnm-systemd-core/src/libsystemd-network/network-internal.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-
-#include <arpa/inet.h>
-#include <linux/if.h>
-#include <netinet/ether.h>
-
-#include "sd-ndisc.h"
-
-#include "alloc-util.h"
-#include "dhcp-lease-internal.h"
-#include "extract-word.h"
-#include "hexdecoct.h"
-#include "log.h"
-#include "network-internal.h"
-#include "parse-util.h"
-
-size_t serialize_in_addrs(FILE *f,
- const struct in_addr *addresses,
- size_t size,
- bool *with_leading_space,
- bool (*predicate)(const struct in_addr *addr)) {
- assert(f);
- assert(addresses);
-
- size_t count = 0;
- bool _space = false;
- if (!with_leading_space)
- with_leading_space = &_space;
-
- for (size_t i = 0; i < size; i++) {
- char sbuf[INET_ADDRSTRLEN];
-
- if (predicate && !predicate(&addresses[i]))
- continue;
-
- if (*with_leading_space)
- fputc(' ', f);
- fputs(inet_ntop(AF_INET, &addresses[i], sbuf, sizeof(sbuf)), f);
- count++;
- *with_leading_space = true;
- }
-
- return count;
-}
-
-int deserialize_in_addrs(struct in_addr **ret, const char *string) {
- _cleanup_free_ struct in_addr *addresses = NULL;
- int size = 0;
-
- assert(ret);
- assert(string);
-
- for (;;) {
- _cleanup_free_ char *word = NULL;
- struct in_addr *new_addresses;
- int r;
-
- r = extract_first_word(&string, &word, NULL, 0);
- if (r < 0)
- return r;
- if (r == 0)
- break;
-
- new_addresses = reallocarray(addresses, size + 1, sizeof(struct in_addr));
- if (!new_addresses)
- return -ENOMEM;
- else
- addresses = new_addresses;
-
- r = inet_pton(AF_INET, word, &(addresses[size]));
- if (r <= 0)
- continue;
-
- size++;
- }
-
- *ret = size > 0 ? TAKE_PTR(addresses) : NULL;
-
- return size;
-}
-
-void serialize_in6_addrs(FILE *f, const struct in6_addr *addresses, size_t size, bool *with_leading_space) {
- assert(f);
- assert(addresses);
- assert(size);
-
- bool _space = false;
- if (!with_leading_space)
- with_leading_space = &_space;
-
- for (size_t i = 0; i < size; i++) {
- char buffer[INET6_ADDRSTRLEN];
-
- if (*with_leading_space)
- fputc(' ', f);
- fputs(inet_ntop(AF_INET6, addresses+i, buffer, sizeof(buffer)), f);
- *with_leading_space = true;
- }
-}
-
-int deserialize_in6_addrs(struct in6_addr **ret, const char *string) {
- _cleanup_free_ struct in6_addr *addresses = NULL;
- int size = 0;
-
- assert(ret);
- assert(string);
-
- for (;;) {
- _cleanup_free_ char *word = NULL;
- struct in6_addr *new_addresses;
- int r;
-
- r = extract_first_word(&string, &word, NULL, 0);
- if (r < 0)
- return r;
- if (r == 0)
- break;
-
- new_addresses = reallocarray(addresses, size + 1, sizeof(struct in6_addr));
- if (!new_addresses)
- return -ENOMEM;
- else
- addresses = new_addresses;
-
- r = inet_pton(AF_INET6, word, &(addresses[size]));
- if (r <= 0)
- continue;
-
- size++;
- }
-
- *ret = TAKE_PTR(addresses);
-
- return size;
-}
-
-void serialize_dhcp_routes(FILE *f, const char *key, sd_dhcp_route **routes, size_t size) {
- assert(f);
- assert(key);
- assert(routes);
- assert(size);
-
- fprintf(f, "%s=", key);
-
- for (size_t i = 0; i < size; i++) {
- char sbuf[INET_ADDRSTRLEN];
- struct in_addr dest, gw;
- uint8_t length;
-
- assert_se(sd_dhcp_route_get_destination(routes[i], &dest) >= 0);
- assert_se(sd_dhcp_route_get_gateway(routes[i], &gw) >= 0);
- assert_se(sd_dhcp_route_get_destination_prefix_length(routes[i], &length) >= 0);
-
- fprintf(f, "%s/%" PRIu8, inet_ntop(AF_INET, &dest, sbuf, sizeof sbuf), length);
- fprintf(f, ",%s%s", inet_ntop(AF_INET, &gw, sbuf, sizeof sbuf), i < size - 1 ? " ": "");
- }
-
- fputs("\n", f);
-}
-
-int deserialize_dhcp_routes(struct sd_dhcp_route **ret, size_t *ret_size, const char *string) {
- _cleanup_free_ struct sd_dhcp_route *routes = NULL;
- size_t size = 0;
-
- assert(ret);
- assert(ret_size);
- assert(string);
-
- /* WORD FORMAT: dst_ip/dst_prefixlen,gw_ip */
- for (;;) {
- _cleanup_free_ char *word = NULL;
- char *tok, *tok_end;
- unsigned n;
- int r;
-
- r = extract_first_word(&string, &word, NULL, 0);
- if (r < 0)
- return r;
- if (r == 0)
- break;
-
- if (!GREEDY_REALLOC(routes, size + 1))
- return -ENOMEM;
-
- tok = word;
-
- /* get the subnet */
- tok_end = strchr(tok, '/');
- if (!tok_end)
- continue;
- *tok_end = '\0';
-
- r = inet_aton(tok, &routes[size].dst_addr);
- if (r == 0)
- continue;
-
- tok = tok_end + 1;
-
- /* get the prefixlen */
- tok_end = strchr(tok, ',');
- if (!tok_end)
- continue;
-
- *tok_end = '\0';
-
- r = safe_atou(tok, &n);
- if (r < 0 || n > 32)
- continue;
-
- routes[size].dst_prefixlen = (uint8_t) n;
- tok = tok_end + 1;
-
- /* get the gateway */
- r = inet_aton(tok, &routes[size].gw_addr);
- if (r == 0)
- continue;
-
- size++;
- }
-
- *ret_size = size;
- *ret = TAKE_PTR(routes);
-
- return 0;
-}
-
-int serialize_dhcp_option(FILE *f, const char *key, const void *data, size_t size) {
- _cleanup_free_ char *hex_buf = NULL;
-
- assert(f);
- assert(key);
- assert(data);
-
- hex_buf = hexmem(data, size);
- if (!hex_buf)
- return -ENOMEM;
-
- fprintf(f, "%s=%s\n", key, hex_buf);
-
- return 0;
-}
diff --git a/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp-lease.c b/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp-lease.c
deleted file mode 100644
index 8de7c671df..0000000000
--- a/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp-lease.c
+++ /dev/null
@@ -1,1506 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/***
- Copyright © 2013 Intel Corporation. All rights reserved.
-***/
-
-#include <arpa/inet.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "sd-dhcp-lease.h"
-
-#include "alloc-util.h"
-#include "dhcp-lease-internal.h"
-#include "dhcp-protocol.h"
-#include "dns-domain.h"
-#include "env-file.h"
-#include "fd-util.h"
-#include "fileio.h"
-#include "fs-util.h"
-#include "hexdecoct.h"
-#include "hostname-util.h"
-#include "in-addr-util.h"
-#include "network-internal.h"
-#include "parse-util.h"
-#include "stdio-util.h"
-#include "string-util.h"
-#include "strv.h"
-#include "tmpfile-util.h"
-#include "unaligned.h"
-
-int sd_dhcp_lease_get_address(sd_dhcp_lease *lease, struct in_addr *addr) {
- assert_return(lease, -EINVAL);
- assert_return(addr, -EINVAL);
-
- if (lease->address == 0)
- return -ENODATA;
-
- addr->s_addr = lease->address;
- return 0;
-}
-
-int sd_dhcp_lease_get_broadcast(sd_dhcp_lease *lease, struct in_addr *addr) {
- assert_return(lease, -EINVAL);
- assert_return(addr, -EINVAL);
-
- if (!lease->have_broadcast)
- return -ENODATA;
-
- addr->s_addr = lease->broadcast;
- return 0;
-}
-
-int sd_dhcp_lease_get_lifetime(sd_dhcp_lease *lease, uint32_t *lifetime) {
- assert_return(lease, -EINVAL);
- assert_return(lifetime, -EINVAL);
-
- if (lease->lifetime <= 0)
- return -ENODATA;
-
- *lifetime = lease->lifetime;
- return 0;
-}
-
-int sd_dhcp_lease_get_t1(sd_dhcp_lease *lease, uint32_t *t1) {
- assert_return(lease, -EINVAL);
- assert_return(t1, -EINVAL);
-
- if (lease->t1 <= 0)
- return -ENODATA;
-
- *t1 = lease->t1;
- return 0;
-}
-
-int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint32_t *t2) {
- assert_return(lease, -EINVAL);
- assert_return(t2, -EINVAL);
-
- if (lease->t2 <= 0)
- return -ENODATA;
-
- *t2 = lease->t2;
- return 0;
-}
-
-int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu) {
- assert_return(lease, -EINVAL);
- assert_return(mtu, -EINVAL);
-
- if (lease->mtu <= 0)
- return -ENODATA;
-
- *mtu = lease->mtu;
- return 0;
-}
-
-int sd_dhcp_lease_get_servers(
- sd_dhcp_lease *lease,
- sd_dhcp_lease_server_type_t what,
- const struct in_addr **addr) {
-
- assert_return(lease, -EINVAL);
- assert_return(what >= 0, -EINVAL);
- assert_return(what < _SD_DHCP_LEASE_SERVER_TYPE_MAX, -EINVAL);
-
- if (lease->servers[what].size <= 0)
- return -ENODATA;
-
- if (addr)
- *addr = lease->servers[what].addr;
-
- return (int) lease->servers[what].size;
-}
-
-int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, const struct in_addr **addr) {
- return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_DNS, addr);
-}
-int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, const struct in_addr **addr) {
- return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_NTP, addr);
-}
-int sd_dhcp_lease_get_sip(sd_dhcp_lease *lease, const struct in_addr **addr) {
- return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_SIP, addr);
-}
-int sd_dhcp_lease_get_pop3(sd_dhcp_lease *lease, const struct in_addr **addr) {
- return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_POP3, addr);
-}
-int sd_dhcp_lease_get_smtp(sd_dhcp_lease *lease, const struct in_addr **addr) {
- return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_SMTP, addr);
-}
-int sd_dhcp_lease_get_lpr(sd_dhcp_lease *lease, const struct in_addr **addr) {
- return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_LPR, addr);
-}
-
-int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname) {
- assert_return(lease, -EINVAL);
- assert_return(domainname, -EINVAL);
-
- if (!lease->domainname)
- return -ENODATA;
-
- *domainname = lease->domainname;
- return 0;
-}
-
-int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname) {
- assert_return(lease, -EINVAL);
- assert_return(hostname, -EINVAL);
-
- if (!lease->hostname)
- return -ENODATA;
-
- *hostname = lease->hostname;
- return 0;
-}
-
-int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path) {
- assert_return(lease, -EINVAL);
- assert_return(root_path, -EINVAL);
-
- if (!lease->root_path)
- return -ENODATA;
-
- *root_path = lease->root_path;
- return 0;
-}
-
-int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, const struct in_addr **addr) {
- assert_return(lease, -EINVAL);
- assert_return(addr, -EINVAL);
-
- if (lease->router_size <= 0)
- return -ENODATA;
-
- *addr = lease->router;
- return (int) lease->router_size;
-}
-
-int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr) {
- assert_return(lease, -EINVAL);
- assert_return(addr, -EINVAL);
-
- if (!lease->have_subnet_mask)
- return -ENODATA;
-
- addr->s_addr = lease->subnet_mask;
- return 0;
-}
-
-int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *addr) {
- assert_return(lease, -EINVAL);
- assert_return(addr, -EINVAL);
-
- if (lease->server_address == 0)
- return -ENODATA;
-
- addr->s_addr = lease->server_address;
- return 0;
-}
-
-int sd_dhcp_lease_get_next_server(sd_dhcp_lease *lease, struct in_addr *addr) {
- assert_return(lease, -EINVAL);
- assert_return(addr, -EINVAL);
-
- if (lease->next_server == 0)
- return -ENODATA;
-
- addr->s_addr = lease->next_server;
- return 0;
-}
-
-/*
- * The returned routes array must be freed by the caller.
- * Route objects have the same lifetime of the lease and must not be freed.
- */
-static int dhcp_lease_get_routes(sd_dhcp_route *routes, size_t n_routes, sd_dhcp_route ***ret) {
- assert(routes || n_routes == 0);
-
- if (n_routes <= 0)
- return -ENODATA;
-
- if (ret) {
- sd_dhcp_route **buf;
-
- buf = new(sd_dhcp_route*, n_routes);
- if (!buf)
- return -ENOMEM;
-
- for (size_t i = 0; i < n_routes; i++)
- buf[i] = &routes[i];
-
- *ret = buf;
- }
-
- return (int) n_routes;
-}
-
-int sd_dhcp_lease_get_static_routes(sd_dhcp_lease *lease, sd_dhcp_route ***ret) {
- assert_return(lease, -EINVAL);
-
- return dhcp_lease_get_routes(lease->static_routes, lease->n_static_routes, ret);
-}
-
-int sd_dhcp_lease_get_classless_routes(sd_dhcp_lease *lease, sd_dhcp_route ***ret) {
- assert_return(lease, -EINVAL);
-
- return dhcp_lease_get_routes(lease->classless_routes, lease->n_classless_routes, ret);
-}
-
-int sd_dhcp_lease_get_search_domains(sd_dhcp_lease *lease, char ***domains) {
- size_t r;
-
- assert_return(lease, -EINVAL);
- assert_return(domains, -EINVAL);
-
- r = strv_length(lease->search_domains);
- if (r > 0) {
- *domains = lease->search_domains;
- return (int) r;
- }
-
- return -ENODATA;
-}
-
-int sd_dhcp_lease_get_6rd(
- sd_dhcp_lease *lease,
- uint8_t *ret_ipv4masklen,
- uint8_t *ret_prefixlen,
- struct in6_addr *ret_prefix,
- const struct in_addr **ret_br_addresses,
- size_t *ret_n_br_addresses) {
-
- assert_return(lease, -EINVAL);
-
- if (lease->sixrd_n_br_addresses <= 0)
- return -ENODATA;
-
- if (ret_ipv4masklen)
- *ret_ipv4masklen = lease->sixrd_ipv4masklen;
- if (ret_prefixlen)
- *ret_prefixlen = lease->sixrd_prefixlen;
- if (ret_prefix)
- *ret_prefix = lease->sixrd_prefix;
- if (ret_br_addresses)
- *ret_br_addresses = lease->sixrd_br_addresses;
- if (ret_n_br_addresses)
- *ret_n_br_addresses = lease->sixrd_n_br_addresses;
-
- return 0;
-}
-
-int sd_dhcp_lease_get_vendor_specific(sd_dhcp_lease *lease, const void **data, size_t *data_len) {
- assert_return(lease, -EINVAL);
- assert_return(data, -EINVAL);
- assert_return(data_len, -EINVAL);
-
- if (lease->vendor_specific_len <= 0)
- return -ENODATA;
-
- *data = lease->vendor_specific;
- *data_len = lease->vendor_specific_len;
- return 0;
-}
-
-static sd_dhcp_lease *dhcp_lease_free(sd_dhcp_lease *lease) {
- assert(lease);
-
- while (lease->private_options) {
- struct sd_dhcp_raw_option *option = lease->private_options;
-
- LIST_REMOVE(options, lease->private_options, option);
-
- free(option->data);
- free(option);
- }
-
- free(lease->root_path);
- free(lease->router);
- free(lease->timezone);
- free(lease->hostname);
- free(lease->domainname);
-
- for (sd_dhcp_lease_server_type_t i = 0; i < _SD_DHCP_LEASE_SERVER_TYPE_MAX; i++)
- free(lease->servers[i].addr);
-
- free(lease->static_routes);
- free(lease->classless_routes);
- free(lease->client_id);
- free(lease->vendor_specific);
- strv_free(lease->search_domains);
- free(lease->sixrd_br_addresses);
- return mfree(lease);
-}
-
-DEFINE_TRIVIAL_REF_UNREF_FUNC(sd_dhcp_lease, sd_dhcp_lease, dhcp_lease_free);
-
-static int lease_parse_u32(const uint8_t *option, size_t len, uint32_t *ret, uint32_t min) {
- assert(option);
- assert(ret);
-
- if (len != 4)
- return -EINVAL;
-
- *ret = unaligned_read_be32((be32_t*) option);
- if (*ret < min)
- *ret = min;
-
- return 0;
-}
-
-static int lease_parse_u16(const uint8_t *option, size_t len, uint16_t *ret, uint16_t min) {
- assert(option);
- assert(ret);
-
- if (len != 2)
- return -EINVAL;
-
- *ret = unaligned_read_be16((be16_t*) option);
- if (*ret < min)
- *ret = min;
-
- return 0;
-}
-
-static int lease_parse_be32(const uint8_t *option, size_t len, be32_t *ret) {
- assert(option);
- assert(ret);
-
- if (len != 4)
- return -EINVAL;
-
- memcpy(ret, option, 4);
- return 0;
-}
-
-static int lease_parse_string(const uint8_t *option, size_t len, char **ret) {
- assert(option);
- assert(ret);
-
- if (len <= 0)
- *ret = mfree(*ret);
- else {
- char *string;
-
- /*
- * One trailing NUL byte is OK, we don't mind. See:
- * https://github.com/systemd/systemd/issues/1337
- */
- if (memchr(option, 0, len - 1))
- return -EINVAL;
-
- string = memdup_suffix0((const char *) option, len);
- if (!string)
- return -ENOMEM;
-
- free_and_replace(*ret, string);
- }
-
- return 0;
-}
-
-static int lease_parse_domain(const uint8_t *option, size_t len, char **ret) {
- _cleanup_free_ char *name = NULL, *normalized = NULL;
- int r;
-
- assert(option);
- assert(ret);
-
- r = lease_parse_string(option, len, &name);
- if (r < 0)
- return r;
- if (!name) {
- *ret = mfree(*ret);
- return 0;
- }
-
- r = dns_name_normalize(name, 0, &normalized);
- if (r < 0)
- return r;
-
- if (is_localhost(normalized))
- return -EINVAL;
-
- if (dns_name_is_root(normalized))
- return -EINVAL;
-
- free_and_replace(*ret, normalized);
-
- return 0;
-}
-
-static int lease_parse_in_addrs(const uint8_t *option, size_t len, struct in_addr **ret, size_t *n_ret) {
- assert(option || len == 0);
- assert(ret);
- assert(n_ret);
-
- if (len <= 0) {
- *ret = mfree(*ret);
- *n_ret = 0;
- } else {
- size_t n_addresses;
- struct in_addr *addresses;
-
- if (len % 4 != 0)
- return -EINVAL;
-
- n_addresses = len / 4;
-
- addresses = newdup(struct in_addr, option, n_addresses);
- if (!addresses)
- return -ENOMEM;
-
- free(*ret);
- *ret = addresses;
- *n_ret = n_addresses;
- }
-
- return 0;
-}
-
-static int lease_parse_sip_server(const uint8_t *option, size_t len, struct in_addr **ret, size_t *n_ret) {
- assert(option || len == 0);
- assert(ret);
- assert(n_ret);
-
- if (len <= 0)
- return -EINVAL;
-
- /* The SIP record is like the other, regular server records, but prefixed with a single "encoding"
- * byte that is either 0 or 1. We only support it to be 1 for now. Let's drop it and parse it like
- * the other fields */
-
- if (option[0] != 1) { /* We only support IP address encoding for now */
- *ret = mfree(*ret);
- *n_ret = 0;
- return 0;
- }
-
- return lease_parse_in_addrs(option + 1, len - 1, ret, n_ret);
-}
-
-static int lease_parse_static_routes(sd_dhcp_lease *lease, const uint8_t *option, size_t len) {
- int r;
-
- assert(lease);
- assert(option || len <= 0);
-
- if (len % 8 != 0)
- return -EINVAL;
-
- while (len >= 8) {
- struct in_addr dst, gw;
- uint8_t prefixlen;
-
- assert_se(lease_parse_be32(option, 4, &dst.s_addr) >= 0);
- option += 4;
-
- assert_se(lease_parse_be32(option, 4, &gw.s_addr) >= 0);
- option += 4;
-
- len -= 8;
-
- r = in4_addr_default_prefixlen(&dst, &prefixlen);
- if (r < 0) {
- log_debug("sd-dhcp-lease: cannot determine class of received static route, ignoring.");
- continue;
- }
-
- (void) in4_addr_mask(&dst, prefixlen);
-
- if (!GREEDY_REALLOC(lease->static_routes, lease->n_static_routes + 1))
- return -ENOMEM;
-
- lease->static_routes[lease->n_static_routes++] = (struct sd_dhcp_route) {
- .dst_addr = dst,
- .gw_addr = gw,
- .dst_prefixlen = prefixlen,
- };
- }
-
- return 0;
-}
-
-/* parses RFC3442 Classless Static Route Option */
-static int lease_parse_classless_routes(sd_dhcp_lease *lease, const uint8_t *option, size_t len) {
- assert(lease);
- assert(option || len <= 0);
-
- /* option format: (subnet-mask-width significant-subnet-octets gateway-ip) */
-
- while (len > 0) {
- uint8_t prefixlen, dst_octets;
- struct in_addr dst = {}, gw;
-
- prefixlen = *option;
- option++;
- len--;
-
- dst_octets = DIV_ROUND_UP(prefixlen, 8);
-
- /* can't have more than 4 octets in IPv4 */
- if (dst_octets > 4 || len < dst_octets)
- return -EINVAL;
-
- memcpy(&dst, option, dst_octets);
- option += dst_octets;
- len -= dst_octets;
-
- if (len < 4)
- return -EINVAL;
-
- assert_se(lease_parse_be32(option, 4, &gw.s_addr) >= 0);
- option += 4;
- len -= 4;
-
- if (!GREEDY_REALLOC(lease->classless_routes, lease->n_classless_routes + 1))
- return -ENOMEM;
-
- lease->classless_routes[lease->n_classless_routes++] = (struct sd_dhcp_route) {
- .dst_addr = dst,
- .gw_addr = gw,
- .dst_prefixlen = prefixlen,
- };
- }
-
- return 0;
-}
-
-static int lease_parse_6rd(sd_dhcp_lease *lease, const uint8_t *option, size_t len) {
- uint8_t ipv4masklen, prefixlen;
- struct in6_addr prefix;
- _cleanup_free_ struct in_addr *br_addresses = NULL;
- size_t n_br_addresses;
-
- assert(lease);
- assert(option);
-
- /* See RFC 5969 Section 7.1.1 */
-
- if (lease->sixrd_n_br_addresses > 0)
- /* Multiple 6rd option?? */
- return -EINVAL;
-
- /* option-length: The length of the DHCP option in octets (22 octets with one BR IPv4 address). */
- if (len < 2 + sizeof(struct in6_addr) + sizeof(struct in_addr) ||
- (len - 2 - sizeof(struct in6_addr)) % sizeof(struct in_addr) != 0)
- return -EINVAL;
-
- /* IPv4MaskLen: The number of high-order bits that are identical across all CE IPv4 addresses
- * within a given 6rd domain. This may be any value between 0 and 32. Any value
- * greater than 32 is invalid. */
- ipv4masklen = option[0];
- if (ipv4masklen > 32)
- return -EINVAL;
-
- /* 6rdPrefixLen: The IPv6 prefix length of the SP's 6rd IPv6 prefix in number of bits. For the
- * purpose of bounds checking by DHCP option processing, the sum of
- * (32 - IPv4MaskLen) + 6rdPrefixLen MUST be less than or equal to 128. */
- prefixlen = option[1];
- if (32 - ipv4masklen + prefixlen > 128)
- return -EINVAL;
-
- /* 6rdPrefix: The service provider's 6rd IPv6 prefix represented as a 16-octet IPv6 address.
- * The bits in the prefix after the 6rdPrefixlen number of bits are reserved and
- * MUST be initialized to zero by the sender and ignored by the receiver. */
- memcpy(&prefix, option + 2, sizeof(struct in6_addr));
- (void) in6_addr_mask(&prefix, prefixlen);
-
- /* 6rdBRIPv4Address: One or more IPv4 addresses of the 6rd Border Relay(s) for a given 6rd domain. */
- n_br_addresses = (len - 2 - sizeof(struct in6_addr)) / sizeof(struct in_addr);
- br_addresses = newdup(struct in_addr, option + 2 + sizeof(struct in6_addr), n_br_addresses);
- if (!br_addresses)
- return -ENOMEM;
-
- lease->sixrd_ipv4masklen = ipv4masklen;
- lease->sixrd_prefixlen = prefixlen;
- lease->sixrd_prefix = prefix;
- lease->sixrd_br_addresses = TAKE_PTR(br_addresses);
- lease->sixrd_n_br_addresses = n_br_addresses;
-
- return 0;
-}
-
-int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void *userdata) {
- sd_dhcp_lease *lease = userdata;
- int r;
-
- assert(lease);
-
- switch (code) {
-
- case SD_DHCP_OPTION_IP_ADDRESS_LEASE_TIME:
- r = lease_parse_u32(option, len, &lease->lifetime, 1);
- if (r < 0)
- log_debug_errno(r, "Failed to parse lease time, ignoring: %m");
-
- break;
-
- case SD_DHCP_OPTION_SERVER_IDENTIFIER:
- r = lease_parse_be32(option, len, &lease->server_address);
- if (r < 0)
- log_debug_errno(r, "Failed to parse server identifier, ignoring: %m");
-
- break;
-
- case SD_DHCP_OPTION_SUBNET_MASK:
- r = lease_parse_be32(option, len, &lease->subnet_mask);
- if (r < 0)
- log_debug_errno(r, "Failed to parse subnet mask, ignoring: %m");
- else
- lease->have_subnet_mask = true;
- break;
-
- case SD_DHCP_OPTION_BROADCAST:
- r = lease_parse_be32(option, len, &lease->broadcast);
- if (r < 0)
- log_debug_errno(r, "Failed to parse broadcast address, ignoring: %m");
- else
- lease->have_broadcast = true;
- break;
-
- case SD_DHCP_OPTION_ROUTER:
- r = lease_parse_in_addrs(option, len, &lease->router, &lease->router_size);
- if (r < 0)
- log_debug_errno(r, "Failed to parse router addresses, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_DOMAIN_NAME_SERVER:
- r = lease_parse_in_addrs(option, len, &lease->servers[SD_DHCP_LEASE_DNS].addr, &lease->servers[SD_DHCP_LEASE_DNS].size);
- if (r < 0)
- log_debug_errno(r, "Failed to parse DNS server, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_NTP_SERVER:
- r = lease_parse_in_addrs(option, len, &lease->servers[SD_DHCP_LEASE_NTP].addr, &lease->servers[SD_DHCP_LEASE_NTP].size);
- if (r < 0)
- log_debug_errno(r, "Failed to parse NTP server, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_SIP_SERVER:
- r = lease_parse_sip_server(option, len, &lease->servers[SD_DHCP_LEASE_SIP].addr, &lease->servers[SD_DHCP_LEASE_SIP].size);
- if (r < 0)
- log_debug_errno(r, "Failed to parse SIP server, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_POP3_SERVER:
- r = lease_parse_in_addrs(option, len, &lease->servers[SD_DHCP_LEASE_POP3].addr, &lease->servers[SD_DHCP_LEASE_POP3].size);
- if (r < 0)
- log_debug_errno(r, "Failed to parse POP3 server, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_SMTP_SERVER:
- r = lease_parse_in_addrs(option, len, &lease->servers[SD_DHCP_LEASE_SMTP].addr, &lease->servers[SD_DHCP_LEASE_SMTP].size);
- if (r < 0)
- log_debug_errno(r, "Failed to parse SMTP server, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_LPR_SERVER:
- r = lease_parse_in_addrs(option, len, &lease->servers[SD_DHCP_LEASE_LPR].addr, &lease->servers[SD_DHCP_LEASE_LPR].size);
- if (r < 0)
- log_debug_errno(r, "Failed to parse LPR server, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_STATIC_ROUTE:
- r = lease_parse_static_routes(lease, option, len);
- if (r < 0)
- log_debug_errno(r, "Failed to parse static routes, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_MTU_INTERFACE:
- r = lease_parse_u16(option, len, &lease->mtu, 68);
- if (r < 0)
- log_debug_errno(r, "Failed to parse MTU, ignoring: %m");
- if (lease->mtu < DHCP_DEFAULT_MIN_SIZE) {
- log_debug("MTU value of %" PRIu16 " too small. Using default MTU value of %d instead.", lease->mtu, DHCP_DEFAULT_MIN_SIZE);
- lease->mtu = DHCP_DEFAULT_MIN_SIZE;
- }
-
- break;
-
- case SD_DHCP_OPTION_DOMAIN_NAME:
- r = lease_parse_domain(option, len, &lease->domainname);
- if (r < 0) {
- log_debug_errno(r, "Failed to parse domain name, ignoring: %m");
- return 0;
- }
-
- break;
-
- case SD_DHCP_OPTION_DOMAIN_SEARCH:
- r = dhcp_lease_parse_search_domains(option, len, &lease->search_domains);
- if (r < 0)
- log_debug_errno(r, "Failed to parse Domain Search List, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_HOST_NAME:
- r = lease_parse_domain(option, len, &lease->hostname);
- if (r < 0) {
- log_debug_errno(r, "Failed to parse hostname, ignoring: %m");
- return 0;
- }
-
- break;
-
- case SD_DHCP_OPTION_ROOT_PATH:
- r = lease_parse_string(option, len, &lease->root_path);
- if (r < 0)
- log_debug_errno(r, "Failed to parse root path, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_RENEWAL_TIME:
- r = lease_parse_u32(option, len, &lease->t1, 1);
- if (r < 0)
- log_debug_errno(r, "Failed to parse T1 time, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_REBINDING_TIME:
- r = lease_parse_u32(option, len, &lease->t2, 1);
- if (r < 0)
- log_debug_errno(r, "Failed to parse T2 time, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE:
- r = lease_parse_classless_routes(lease, option, len);
- if (r < 0)
- log_debug_errno(r, "Failed to parse classless routes, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_TZDB_TIMEZONE: {
- _cleanup_free_ char *tz = NULL;
-
- r = lease_parse_string(option, len, &tz);
- if (r < 0) {
- log_debug_errno(r, "Failed to parse timezone option, ignoring: %m");
- return 0;
- }
-
- if (!timezone_is_valid(tz, LOG_DEBUG)) {
- log_debug("Timezone is not valid, ignoring.");
- return 0;
- }
-
- free_and_replace(lease->timezone, tz);
-
- break;
- }
-
- case SD_DHCP_OPTION_VENDOR_SPECIFIC:
-
- if (len <= 0)
- lease->vendor_specific = mfree(lease->vendor_specific);
- else {
- void *p;
-
- p = memdup(option, len);
- if (!p)
- return -ENOMEM;
-
- free(lease->vendor_specific);
- lease->vendor_specific = p;
- }
-
- lease->vendor_specific_len = len;
- break;
-
- case SD_DHCP_OPTION_6RD:
- r = lease_parse_6rd(lease, option, len);
- if (r < 0)
- log_debug_errno(r, "Failed to parse 6rd option, ignoring: %m");
- break;
-
- case SD_DHCP_OPTION_PRIVATE_BASE ... SD_DHCP_OPTION_PRIVATE_LAST:
- r = dhcp_lease_insert_private_option(lease, code, option, len);
- if (r < 0)
- return r;
-
- break;
-
- default:
- log_debug("Ignoring option DHCP option %"PRIu8" while parsing.", code);
- break;
- }
-
- return 0;
-}
-
-/* Parses compressed domain names. */
-int dhcp_lease_parse_search_domains(const uint8_t *option, size_t len, char ***domains) {
- _cleanup_strv_free_ char **names = NULL;
- size_t pos = 0, cnt = 0;
- int r;
-
- assert(domains);
- assert_return(option && len > 0, -ENODATA);
-
- while (pos < len) {
- _cleanup_free_ char *name = NULL;
- size_t n = 0;
- size_t jump_barrier = pos, next_chunk = 0;
- bool first = true;
-
- for (;;) {
- uint8_t c;
- c = option[pos++];
-
- if (c == 0) {
- /* End of name */
- break;
- } else if (c <= 63) {
- const char *label;
-
- /* Literal label */
- label = (const char*) (option + pos);
- pos += c;
- if (pos >= len)
- return -EBADMSG;
-
- if (!GREEDY_REALLOC(name, n + !first + DNS_LABEL_ESCAPED_MAX))
- return -ENOMEM;
-
- if (first)
- first = false;
- else
- name[n++] = '.';
-
- r = dns_label_escape(label, c, name + n, DNS_LABEL_ESCAPED_MAX);
- if (r < 0)
- return r;
-
- n += r;
- } else if (FLAGS_SET(c, 0xc0)) {
- /* Pointer */
-
- uint8_t d;
- uint16_t ptr;
-
- if (pos >= len)
- return -EBADMSG;
-
- d = option[pos++];
- ptr = (uint16_t) (c & ~0xc0) << 8 | (uint16_t) d;
-
- /* Jumps are limited to a "prior occurrence" (RFC-1035 4.1.4) */
- if (ptr >= jump_barrier)
- return -EBADMSG;
- jump_barrier = ptr;
-
- /* Save current location so we don't end up re-parsing what's parsed so far. */
- if (next_chunk == 0)
- next_chunk = pos;
-
- pos = ptr;
- } else
- return -EBADMSG;
- }
-
- if (!GREEDY_REALLOC(name, n + 1))
- return -ENOMEM;
- name[n] = 0;
-
- r = strv_extend(&names, name);
- if (r < 0)
- return r;
-
- cnt++;
-
- if (next_chunk != 0)
- pos = next_chunk;
- }
-
- strv_free_and_replace(*domains, names);
-
- return cnt;
-}
-
-int dhcp_lease_insert_private_option(sd_dhcp_lease *lease, uint8_t tag, const void *data, uint8_t len) {
- struct sd_dhcp_raw_option *option, *before = NULL;
-
- assert(lease);
-
- LIST_FOREACH(options, cur, lease->private_options) {
- if (tag < cur->tag) {
- before = cur;
- break;
- }
- if (tag == cur->tag) {
- log_debug("Ignoring duplicate option, tagged %i.", tag);
- return 0;
- }
- }
-
- option = new(struct sd_dhcp_raw_option, 1);
- if (!option)
- return -ENOMEM;
-
- option->tag = tag;
- option->length = len;
- option->data = memdup(data, len);
- if (!option->data) {
- free(option);
- return -ENOMEM;
- }
-
- LIST_INSERT_BEFORE(options, lease->private_options, before, option);
- return 0;
-}
-
-int dhcp_lease_new(sd_dhcp_lease **ret) {
- sd_dhcp_lease *lease;
-
- lease = new0(sd_dhcp_lease, 1);
- if (!lease)
- return -ENOMEM;
-
- lease->n_ref = 1;
-
- *ret = lease;
- return 0;
-}
-
-int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
- _cleanup_(unlink_and_freep) char *temp_path = NULL;
- _cleanup_fclose_ FILE *f = NULL;
- struct in_addr address;
- const struct in_addr *addresses;
- const void *client_id, *data;
- size_t client_id_len, data_len;
- char sbuf[INET_ADDRSTRLEN];
- const char *string;
- uint16_t mtu;
- _cleanup_free_ sd_dhcp_route **routes = NULL;
- char **search_domains;
- uint32_t t1, t2, lifetime;
- int r;
-
- assert(lease);
- assert(lease_file);
-
- r = fopen_temporary(lease_file, &f, &temp_path);
- if (r < 0)
- return r;
-
- (void) fchmod(fileno(f), 0644);
-
- fprintf(f,
- "# This is private data. Do not parse.\n");
-
- r = sd_dhcp_lease_get_address(lease, &address);
- if (r >= 0)
- fprintf(f, "ADDRESS=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf)));
-
- r = sd_dhcp_lease_get_netmask(lease, &address);
- if (r >= 0)
- fprintf(f, "NETMASK=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf)));
-
- r = sd_dhcp_lease_get_router(lease, &addresses);
- if (r > 0) {
- fputs("ROUTER=", f);
- serialize_in_addrs(f, addresses, r, false, NULL);
- fputc('\n', f);
- }
-
- r = sd_dhcp_lease_get_server_identifier(lease, &address);
- if (r >= 0)
- fprintf(f, "SERVER_ADDRESS=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf)));
-
- r = sd_dhcp_lease_get_next_server(lease, &address);
- if (r >= 0)
- fprintf(f, "NEXT_SERVER=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf)));
-
- r = sd_dhcp_lease_get_broadcast(lease, &address);
- if (r >= 0)
- fprintf(f, "BROADCAST=%s\n", inet_ntop(AF_INET, &address, sbuf, sizeof(sbuf)));
-
- r = sd_dhcp_lease_get_mtu(lease, &mtu);
- if (r >= 0)
- fprintf(f, "MTU=%" PRIu16 "\n", mtu);
-
- r = sd_dhcp_lease_get_t1(lease, &t1);
- if (r >= 0)
- fprintf(f, "T1=%" PRIu32 "\n", t1);
-
- r = sd_dhcp_lease_get_t2(lease, &t2);
- if (r >= 0)
- fprintf(f, "T2=%" PRIu32 "\n", t2);
-
- r = sd_dhcp_lease_get_lifetime(lease, &lifetime);
- if (r >= 0)
- fprintf(f, "LIFETIME=%" PRIu32 "\n", lifetime);
-
- r = sd_dhcp_lease_get_dns(lease, &addresses);
- if (r > 0) {
- fputs("DNS=", f);
- serialize_in_addrs(f, addresses, r, false, NULL);
- fputc('\n', f);
- }
-
- r = sd_dhcp_lease_get_ntp(lease, &addresses);
- if (r > 0) {
- fputs("NTP=", f);
- serialize_in_addrs(f, addresses, r, false, NULL);
- fputc('\n', f);
- }
-
- r = sd_dhcp_lease_get_sip(lease, &addresses);
- if (r > 0) {
- fputs("SIP=", f);
- serialize_in_addrs(f, addresses, r, false, NULL);
- fputc('\n', f);
- }
-
- r = sd_dhcp_lease_get_domainname(lease, &string);
- if (r >= 0)
- fprintf(f, "DOMAINNAME=%s\n", string);
-
- r = sd_dhcp_lease_get_search_domains(lease, &search_domains);
- if (r > 0) {
- fputs("DOMAIN_SEARCH_LIST=", f);
- fputstrv(f, search_domains, NULL, NULL);
- fputc('\n', f);
- }
-
- r = sd_dhcp_lease_get_hostname(lease, &string);
- if (r >= 0)
- fprintf(f, "HOSTNAME=%s\n", string);
-
- r = sd_dhcp_lease_get_root_path(lease, &string);
- if (r >= 0)
- fprintf(f, "ROOT_PATH=%s\n", string);
-
- r = sd_dhcp_lease_get_static_routes(lease, &routes);
- if (r > 0)
- serialize_dhcp_routes(f, "STATIC_ROUTES", routes, r);
-
- routes = mfree(routes);
- r = sd_dhcp_lease_get_classless_routes(lease, &routes);
- if (r > 0)
- serialize_dhcp_routes(f, "CLASSLESS_ROUTES", routes, r);
-
- r = sd_dhcp_lease_get_timezone(lease, &string);
- if (r >= 0)
- fprintf(f, "TIMEZONE=%s\n", string);
-
- r = sd_dhcp_lease_get_client_id(lease, &client_id, &client_id_len);
- if (r >= 0) {
- _cleanup_free_ char *client_id_hex = NULL;
-
- client_id_hex = hexmem(client_id, client_id_len);
- if (!client_id_hex)
- return -ENOMEM;
- fprintf(f, "CLIENTID=%s\n", client_id_hex);
- }
-
- r = sd_dhcp_lease_get_vendor_specific(lease, &data, &data_len);
- if (r >= 0) {
- _cleanup_free_ char *option_hex = NULL;
-
- option_hex = hexmem(data, data_len);
- if (!option_hex)
- return -ENOMEM;
- fprintf(f, "VENDOR_SPECIFIC=%s\n", option_hex);
- }
-
- LIST_FOREACH(options, option, lease->private_options) {
- char key[STRLEN("OPTION_000")+1];
-
- xsprintf(key, "OPTION_%" PRIu8, option->tag);
- r = serialize_dhcp_option(f, key, option->data, option->length);
- if (r < 0)
- return r;
- }
-
- r = fflush_and_check(f);
- if (r < 0)
- return r;
-
- r = conservative_rename(temp_path, lease_file);
- if (r < 0)
- return r;
-
- temp_path = mfree(temp_path);
-
- return 0;
-}
-
-static char **private_options_free(char **options) {
- if (!options)
- return NULL;
-
- for (unsigned i = 0; i < SD_DHCP_OPTION_PRIVATE_LAST - SD_DHCP_OPTION_PRIVATE_BASE + 1; i++)
- free(options[i]);
-
- return mfree(options);
-}
-
-DEFINE_TRIVIAL_CLEANUP_FUNC(char**, private_options_free);
-
-int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
- _cleanup_(sd_dhcp_lease_unrefp) sd_dhcp_lease *lease = NULL;
- _cleanup_free_ char
- *address = NULL,
- *router = NULL,
- *netmask = NULL,
- *server_address = NULL,
- *next_server = NULL,
- *broadcast = NULL,
- *dns = NULL,
- *ntp = NULL,
- *sip = NULL,
- *pop3 = NULL,
- *smtp = NULL,
- *lpr = NULL,
- *mtu = NULL,
- *static_routes = NULL,
- *classless_routes = NULL,
- *domains = NULL,
- *client_id_hex = NULL,
- *vendor_specific_hex = NULL,
- *lifetime = NULL,
- *t1 = NULL,
- *t2 = NULL;
- _cleanup_(private_options_freep) char **options = NULL;
-
- int r, i;
-
- assert(lease_file);
- assert(ret);
-
- r = dhcp_lease_new(&lease);
- if (r < 0)
- return r;
-
- options = new0(char*, SD_DHCP_OPTION_PRIVATE_LAST - SD_DHCP_OPTION_PRIVATE_BASE + 1);
- if (!options)
- return -ENOMEM;
-
- r = parse_env_file(NULL, lease_file,
- "ADDRESS", &address,
- "ROUTER", &router,
- "NETMASK", &netmask,
- "SERVER_ADDRESS", &server_address,
- "NEXT_SERVER", &next_server,
- "BROADCAST", &broadcast,
- "DNS", &dns,
- "NTP", &ntp,
- "SIP", &sip,
- "POP3", &pop3,
- "SMTP", &smtp,
- "LPR", &lpr,
- "MTU", &mtu,
- "DOMAINNAME", &lease->domainname,
- "HOSTNAME", &lease->hostname,
- "DOMAIN_SEARCH_LIST", &domains,
- "ROOT_PATH", &lease->root_path,
- "STATIC_ROUTES", &static_routes,
- "CLASSLESS_ROUTES", &classless_routes,
- "CLIENTID", &client_id_hex,
- "TIMEZONE", &lease->timezone,
- "VENDOR_SPECIFIC", &vendor_specific_hex,
- "LIFETIME", &lifetime,
- "T1", &t1,
- "T2", &t2,
- "OPTION_224", &options[0],
- "OPTION_225", &options[1],
- "OPTION_226", &options[2],
- "OPTION_227", &options[3],
- "OPTION_228", &options[4],
- "OPTION_229", &options[5],
- "OPTION_230", &options[6],
- "OPTION_231", &options[7],
- "OPTION_232", &options[8],
- "OPTION_233", &options[9],
- "OPTION_234", &options[10],
- "OPTION_235", &options[11],
- "OPTION_236", &options[12],
- "OPTION_237", &options[13],
- "OPTION_238", &options[14],
- "OPTION_239", &options[15],
- "OPTION_240", &options[16],
- "OPTION_241", &options[17],
- "OPTION_242", &options[18],
- "OPTION_243", &options[19],
- "OPTION_244", &options[20],
- "OPTION_245", &options[21],
- "OPTION_246", &options[22],
- "OPTION_247", &options[23],
- "OPTION_248", &options[24],
- "OPTION_249", &options[25],
- "OPTION_250", &options[26],
- "OPTION_251", &options[27],
- "OPTION_252", &options[28],
- "OPTION_253", &options[29],
- "OPTION_254", &options[30]);
- if (r < 0)
- return r;
-
- if (address) {
- r = inet_pton(AF_INET, address, &lease->address);
- if (r <= 0)
- log_debug("Failed to parse address %s, ignoring.", address);
- }
-
- if (router) {
- r = deserialize_in_addrs(&lease->router, router);
- if (r < 0)
- log_debug_errno(r, "Failed to deserialize router addresses %s, ignoring: %m", router);
- else
- lease->router_size = r;
- }
-
- if (netmask) {
- r = inet_pton(AF_INET, netmask, &lease->subnet_mask);
- if (r <= 0)
- log_debug("Failed to parse netmask %s, ignoring.", netmask);
- else
- lease->have_subnet_mask = true;
- }
-
- if (server_address) {
- r = inet_pton(AF_INET, server_address, &lease->server_address);
- if (r <= 0)
- log_debug("Failed to parse server address %s, ignoring.", server_address);
- }
-
- if (next_server) {
- r = inet_pton(AF_INET, next_server, &lease->next_server);
- if (r <= 0)
- log_debug("Failed to parse next server %s, ignoring.", next_server);
- }
-
- if (broadcast) {
- r = inet_pton(AF_INET, broadcast, &lease->broadcast);
- if (r <= 0)
- log_debug("Failed to parse broadcast address %s, ignoring.", broadcast);
- else
- lease->have_broadcast = true;
- }
-
- if (dns) {
- r = deserialize_in_addrs(&lease->servers[SD_DHCP_LEASE_DNS].addr, dns);
- if (r < 0)
- log_debug_errno(r, "Failed to deserialize DNS servers %s, ignoring: %m", dns);
- else
- lease->servers[SD_DHCP_LEASE_DNS].size = r;
- }
-
- if (ntp) {
- r = deserialize_in_addrs(&lease->servers[SD_DHCP_LEASE_NTP].addr, ntp);
- if (r < 0)
- log_debug_errno(r, "Failed to deserialize NTP servers %s, ignoring: %m", ntp);
- else
- lease->servers[SD_DHCP_LEASE_NTP].size = r;
- }
-
- if (sip) {
- r = deserialize_in_addrs(&lease->servers[SD_DHCP_LEASE_SIP].addr, sip);
- if (r < 0)
- log_debug_errno(r, "Failed to deserialize SIP servers %s, ignoring: %m", sip);
- else
- lease->servers[SD_DHCP_LEASE_SIP].size = r;
- }
-
- if (pop3) {
- r = deserialize_in_addrs(&lease->servers[SD_DHCP_LEASE_POP3].addr, pop3);
- if (r < 0)
- log_debug_errno(r, "Failed to deserialize POP3 server %s, ignoring: %m", pop3);
- else
- lease->servers[SD_DHCP_LEASE_POP3].size = r;
- }
-
- if (smtp) {
- r = deserialize_in_addrs(&lease->servers[SD_DHCP_LEASE_SMTP].addr, smtp);
- if (r < 0)
- log_debug_errno(r, "Failed to deserialize SMTP server %s, ignoring: %m", smtp);
- else
- lease->servers[SD_DHCP_LEASE_SMTP].size = r;
- }
-
- if (lpr) {
- r = deserialize_in_addrs(&lease->servers[SD_DHCP_LEASE_LPR].addr, lpr);
- if (r < 0)
- log_debug_errno(r, "Failed to deserialize LPR server %s, ignoring: %m", lpr);
- else
- lease->servers[SD_DHCP_LEASE_LPR].size = r;
- }
-
- if (mtu) {
- r = safe_atou16(mtu, &lease->mtu);
- if (r < 0)
- log_debug_errno(r, "Failed to parse MTU %s, ignoring: %m", mtu);
- }
-
- if (domains) {
- _cleanup_strv_free_ char **a = NULL;
- a = strv_split(domains, " ");
- if (!a)
- return -ENOMEM;
-
- if (!strv_isempty(a))
- lease->search_domains = TAKE_PTR(a);
- }
-
- if (static_routes) {
- r = deserialize_dhcp_routes(
- &lease->static_routes,
- &lease->n_static_routes,
- static_routes);
- if (r < 0)
- log_debug_errno(r, "Failed to parse DHCP static routes %s, ignoring: %m", static_routes);
- }
-
- if (classless_routes) {
- r = deserialize_dhcp_routes(
- &lease->classless_routes,
- &lease->n_classless_routes,
- classless_routes);
- if (r < 0)
- log_debug_errno(r, "Failed to parse DHCP classless routes %s, ignoring: %m", classless_routes);
- }
-
- if (lifetime) {
- r = safe_atou32(lifetime, &lease->lifetime);
- if (r < 0)
- log_debug_errno(r, "Failed to parse lifetime %s, ignoring: %m", lifetime);
- }
-
- if (t1) {
- r = safe_atou32(t1, &lease->t1);
- if (r < 0)
- log_debug_errno(r, "Failed to parse T1 %s, ignoring: %m", t1);
- }
-
- if (t2) {
- r = safe_atou32(t2, &lease->t2);
- if (r < 0)
- log_debug_errno(r, "Failed to parse T2 %s, ignoring: %m", t2);
- }
-
- if (client_id_hex) {
- r = unhexmem(client_id_hex, SIZE_MAX, &lease->client_id, &lease->client_id_len);
- if (r < 0)
- log_debug_errno(r, "Failed to parse client ID %s, ignoring: %m", client_id_hex);
- }
-
- if (vendor_specific_hex) {
- r = unhexmem(vendor_specific_hex, SIZE_MAX, &lease->vendor_specific, &lease->vendor_specific_len);
- if (r < 0)
- log_debug_errno(r, "Failed to parse vendor specific data %s, ignoring: %m", vendor_specific_hex);
- }
-
- for (i = 0; i <= SD_DHCP_OPTION_PRIVATE_LAST - SD_DHCP_OPTION_PRIVATE_BASE; i++) {
- _cleanup_free_ void *data = NULL;
- size_t len;
-
- if (!options[i])
- continue;
-
- r = unhexmem(options[i], SIZE_MAX, &data, &len);
- if (r < 0) {
- log_debug_errno(r, "Failed to parse private DHCP option %s, ignoring: %m", options[i]);
- continue;
- }
-
- r = dhcp_lease_insert_private_option(lease, SD_DHCP_OPTION_PRIVATE_BASE + i, data, len);
- if (r < 0)
- return r;
- }
-
- *ret = TAKE_PTR(lease);
-
- return 0;
-}
-
-int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease) {
- struct in_addr address, mask;
- int r;
-
- assert(lease);
-
- if (lease->address == 0)
- return -ENODATA;
-
- address.s_addr = lease->address;
-
- /* fall back to the default subnet masks based on address class */
- r = in4_addr_default_subnet_mask(&address, &mask);
- if (r < 0)
- return r;
-
- lease->subnet_mask = mask.s_addr;
- lease->have_subnet_mask = true;
-
- return 0;
-}
-
-int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const void **client_id, size_t *client_id_len) {
- assert_return(lease, -EINVAL);
- assert_return(client_id, -EINVAL);
- assert_return(client_id_len, -EINVAL);
-
- if (!lease->client_id)
- return -ENODATA;
-
- *client_id = lease->client_id;
- *client_id_len = lease->client_id_len;
-
- return 0;
-}
-
-int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const void *client_id, size_t client_id_len) {
- assert_return(lease, -EINVAL);
- assert_return(client_id || client_id_len <= 0, -EINVAL);
-
- if (client_id_len <= 0)
- lease->client_id = mfree(lease->client_id);
- else {
- void *p;
-
- p = memdup(client_id, client_id_len);
- if (!p)
- return -ENOMEM;
-
- free(lease->client_id);
- lease->client_id = p;
- lease->client_id_len = client_id_len;
- }
-
- return 0;
-}
-
-int sd_dhcp_lease_get_timezone(sd_dhcp_lease *lease, const char **tz) {
- assert_return(lease, -EINVAL);
- assert_return(tz, -EINVAL);
-
- if (!lease->timezone)
- return -ENODATA;
-
- *tz = lease->timezone;
- return 0;
-}
-
-int sd_dhcp_route_get_destination(sd_dhcp_route *route, struct in_addr *destination) {
- assert_return(route, -EINVAL);
- assert_return(destination, -EINVAL);
-
- *destination = route->dst_addr;
- return 0;
-}
-
-int sd_dhcp_route_get_destination_prefix_length(sd_dhcp_route *route, uint8_t *length) {
- assert_return(route, -EINVAL);
- assert_return(length, -EINVAL);
-
- *length = route->dst_prefixlen;
- return 0;
-}
-
-int sd_dhcp_route_get_gateway(sd_dhcp_route *route, struct in_addr *gateway) {
- assert_return(route, -EINVAL);
- assert_return(gateway, -EINVAL);
-
- *gateway = route->gw_addr;
- return 0;
-}
diff --git a/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp6-client.c b/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp6-client.c
index 27864a0a49..4ca5159106 100644
--- a/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp6-client.c
+++ b/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp6-client.c
@@ -23,16 +23,10 @@
#include "io-util.h"
#include "random-util.h"
#include "socket-util.h"
+#include "sort-util.h"
#include "strv.h"
#include "web-util.h"
-static const uint16_t default_req_opts[] = {
- SD_DHCP6_OPTION_DNS_SERVERS,
- SD_DHCP6_OPTION_DOMAIN_LIST,
- SD_DHCP6_OPTION_NTP_SERVER,
- SD_DHCP6_OPTION_SNTP_SERVERS,
-};
-
#define DHCP6_CLIENT_DONT_DESTROY(client) \
_cleanup_(sd_dhcp6_client_unrefp) _unused_ sd_dhcp6_client *_dont_destroy_##client = sd_dhcp6_client_ref(client)
@@ -371,8 +365,12 @@ int sd_dhcp6_client_get_information_request(sd_dhcp6_client *client, int *enable
return 0;
}
+static int be16_compare_func(const be16_t *a, const be16_t *b) {
+ return CMP(be16toh(*a), be16toh(*b));
+}
+
int sd_dhcp6_client_set_request_option(sd_dhcp6_client *client, uint16_t option) {
- size_t t;
+ be16_t opt;
assert_return(client, -EINVAL);
assert_return(!sd_dhcp6_client_is_running(client), -EBUSY);
@@ -380,15 +378,17 @@ int sd_dhcp6_client_set_request_option(sd_dhcp6_client *client, uint16_t option)
if (!dhcp6_option_can_request(option))
return -EINVAL;
- for (t = 0; t < client->req_opts_len; t++)
- if (client->req_opts[t] == htobe16(option))
- return -EEXIST;
+ opt = htobe16(option);
+ if (typesafe_bsearch(&opt, client->req_opts, client->n_req_opts, be16_compare_func))
+ return -EEXIST;
- if (!GREEDY_REALLOC(client->req_opts, client->req_opts_len + 1))
+ if (!GREEDY_REALLOC(client->req_opts, client->n_req_opts + 1))
return -ENOMEM;
- client->req_opts[client->req_opts_len++] = htobe16(option);
+ client->req_opts[client->n_req_opts++] = opt;
+ /* Sort immediately to make the above binary search will work for the next time. */
+ typesafe_qsort(client->req_opts, client->n_req_opts, be16_compare_func);
return 0;
}
@@ -635,6 +635,51 @@ static DHCP6MessageType client_message_type_from_state(sd_dhcp6_client *client)
}
}
+static int client_append_oro(sd_dhcp6_client *client, uint8_t **opt, size_t *optlen) {
+ _cleanup_free_ be16_t *buf = NULL;
+ be16_t *req_opts;
+ size_t n;
+
+ assert(client);
+ assert(opt);
+ assert(optlen);
+
+ switch (client->state) {
+ case DHCP6_STATE_INFORMATION_REQUEST:
+ n = client->n_req_opts;
+ buf = new(be16_t, n + 2);
+ if (!buf)
+ return -ENOMEM;
+
+ memcpy_safe(buf, client->req_opts, n * sizeof(be16_t));
+ buf[n++] = htobe16(SD_DHCP6_OPTION_INFORMATION_REFRESH_TIME); /* RFC 8415 section 21.23 */
+ buf[n++] = htobe16(SD_DHCP6_OPTION_INF_MAX_RT); /* RFC 8415 section 21.25 */
+
+ typesafe_qsort(buf, n, be16_compare_func);
+ req_opts = buf;
+ break;
+
+ case DHCP6_STATE_SOLICITATION:
+ n = client->n_req_opts;
+ buf = new(be16_t, n + 1);
+ if (!buf)
+ return -ENOMEM;
+
+ memcpy_safe(buf, client->req_opts, n * sizeof(be16_t));
+ buf[n++] = htobe16(SD_DHCP6_OPTION_SOL_MAX_RT); /* RFC 8415 section 21.24 */
+
+ typesafe_qsort(buf, n, be16_compare_func);
+ req_opts = buf;
+ break;
+
+ default:
+ n = client->n_req_opts;
+ req_opts = client->req_opts;
+ }
+
+ return dhcp6_option_append(opt, optlen, SD_DHCP6_OPTION_ORO, n * sizeof(be16_t), req_opts);
+}
+
int dhcp6_client_send_message(sd_dhcp6_client *client) {
_cleanup_free_ DHCP6Message *message = NULL;
struct in6_addr all_servers =
@@ -712,9 +757,7 @@ int dhcp6_client_send_message(sd_dhcp6_client *client) {
return r;
}
- r = dhcp6_option_append(&opt, &optlen, SD_DHCP6_OPTION_ORO,
- client->req_opts_len * sizeof(be16_t),
- client->req_opts);
+ r = client_append_oro(client, &opt, &optlen);
if (r < 0)
return r;
@@ -1301,13 +1344,10 @@ int sd_dhcp6_client_start(sd_dhcp6_client *client) {
if (client->fd < 0) {
r = dhcp6_network_bind_udp_socket(client->ifindex, &client->local_address);
- if (r < 0) {
- _cleanup_free_ char *p = NULL;
-
- (void) in6_addr_to_string(&client->local_address, &p);
+ if (r < 0)
return log_dhcp6_client_errno(client, r,
- "Failed to bind to UDP socket at address %s: %m", strna(p));
- }
+ "Failed to bind to UDP socket at address %s: %m",
+ IN6_ADDR_TO_STRING(&client->local_address));
client->fd = r;
}
@@ -1341,7 +1381,7 @@ int sd_dhcp6_client_start(sd_dhcp6_client *client) {
}
log_dhcp6_client(client, "Starting in %s mode",
- client->information_request ? "Information request" : "Managed");
+ client->information_request ? "Information request" : "Solicit");
return client_start_transaction(client, state);
}
@@ -1413,18 +1453,9 @@ DEFINE_TRIVIAL_REF_UNREF_FUNC(sd_dhcp6_client, sd_dhcp6_client, dhcp6_client_fre
int sd_dhcp6_client_new(sd_dhcp6_client **ret) {
_cleanup_(sd_dhcp6_client_unrefp) sd_dhcp6_client *client = NULL;
- _cleanup_free_ be16_t *req_opts = NULL;
- size_t t;
assert_return(ret, -EINVAL);
- req_opts = new(be16_t, ELEMENTSOF(default_req_opts));
- if (!req_opts)
- return -ENOMEM;
-
- for (t = 0; t < ELEMENTSOF(default_req_opts); t++)
- req_opts[t] = htobe16(default_req_opts[t]);
-
client = new(sd_dhcp6_client, 1);
if (!client)
return -ENOMEM;
@@ -1436,8 +1467,6 @@ int sd_dhcp6_client_new(sd_dhcp6_client **ret) {
.ifindex = -1,
.request_ia = DHCP6_REQUEST_IA_NA | DHCP6_REQUEST_IA_PD,
.fd = -1,
- .req_opts_len = ELEMENTSOF(default_req_opts),
- .req_opts = TAKE_PTR(req_opts),
};
*ret = TAKE_PTR(client);
diff --git a/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp6-lease.c b/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp6-lease.c
index a4cc2c920c..2475cdb7ed 100644
--- a/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp6-lease.c
+++ b/src/libnm-systemd-core/src/libsystemd-network/sd-dhcp6-lease.c
@@ -570,14 +570,14 @@ static int dhcp6_lease_parse_message(
break;
- case SD_DHCP6_OPTION_DNS_SERVERS:
+ case SD_DHCP6_OPTION_DNS_SERVER:
r = dhcp6_lease_add_dns(lease, optval, optlen);
if (r < 0)
log_dhcp6_client_errno(client, r, "Failed to parse DNS server option, ignoring: %m");
break;
- case SD_DHCP6_OPTION_DOMAIN_LIST:
+ case SD_DHCP6_OPTION_DOMAIN:
r = dhcp6_lease_add_domains(lease, optval, optlen);
if (r < 0)
log_dhcp6_client_errno(client, r, "Failed to parse domain list option, ignoring: %m");
@@ -591,7 +591,7 @@ static int dhcp6_lease_parse_message(
break;
- case SD_DHCP6_OPTION_SNTP_SERVERS:
+ case SD_DHCP6_OPTION_SNTP_SERVER:
r = dhcp6_lease_add_sntp(lease, optval, optlen);
if (r < 0)
log_dhcp6_client_errno(client, r, "Failed to parse SNTP server option, ignoring: %m");
diff --git a/src/libnm-systemd-core/src/libsystemd-network/sd-ipv4ll.c b/src/libnm-systemd-core/src/libsystemd-network/sd-ipv4ll.c
deleted file mode 100644
index ff065fd1b6..0000000000
--- a/src/libnm-systemd-core/src/libsystemd-network/sd-ipv4ll.c
+++ /dev/null
@@ -1,380 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/***
- Copyright © 2014 Axis Communications AB. All rights reserved.
-***/
-
-#include <arpa/inet.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "sd-id128.h"
-#include "sd-ipv4acd.h"
-#include "sd-ipv4ll.h"
-
-#include "alloc-util.h"
-#include "ether-addr-util.h"
-#include "in-addr-util.h"
-#include "network-common.h"
-#include "random-util.h"
-#include "siphash24.h"
-#include "sparse-endian.h"
-#include "string-util.h"
-#include "util.h"
-
-#define IPV4LL_NETWORK UINT32_C(0xA9FE0000)
-#define IPV4LL_NETMASK UINT32_C(0xFFFF0000)
-
-#define IPV4LL_DONT_DESTROY(ll) \
- _cleanup_(sd_ipv4ll_unrefp) _unused_ sd_ipv4ll *_dont_destroy_##ll = sd_ipv4ll_ref(ll)
-
-struct sd_ipv4ll {
- unsigned n_ref;
-
- sd_ipv4acd *acd;
-
- be32_t address; /* the address pushed to ACD */
- struct ether_addr mac;
-
- struct {
- le64_t value;
- le64_t generation;
- } seed;
- bool seed_set;
-
- /* External */
- be32_t claimed_address;
-
- sd_ipv4ll_callback_t callback;
- void *userdata;
-
- sd_ipv4ll_check_mac_callback_t check_mac_callback;
- void *check_mac_userdata;
-};
-
-#define log_ipv4ll_errno(ll, error, fmt, ...) \
- log_interface_prefix_full_errno( \
- "IPv4LL: ", \
- sd_ipv4ll, ll, \
- error, fmt, ##__VA_ARGS__)
-#define log_ipv4ll(ll, fmt, ...) \
- log_interface_prefix_full_errno_zerook( \
- "IPv4LL: ", \
- sd_ipv4ll, ll, \
- 0, fmt, ##__VA_ARGS__)
-
-static void ipv4ll_on_acd(sd_ipv4acd *acd, int event, void *userdata);
-static int ipv4ll_check_mac(sd_ipv4acd *acd, const struct ether_addr *mac, void *userdata);
-
-static sd_ipv4ll *ipv4ll_free(sd_ipv4ll *ll) {
- assert(ll);
-
- sd_ipv4acd_unref(ll->acd);
- return mfree(ll);
-}
-
-DEFINE_TRIVIAL_REF_UNREF_FUNC(sd_ipv4ll, sd_ipv4ll, ipv4ll_free);
-
-int sd_ipv4ll_new(sd_ipv4ll **ret) {
- _cleanup_(sd_ipv4ll_unrefp) sd_ipv4ll *ll = NULL;
- int r;
-
- assert_return(ret, -EINVAL);
-
- ll = new0(sd_ipv4ll, 1);
- if (!ll)
- return -ENOMEM;
-
- ll->n_ref = 1;
-
- r = sd_ipv4acd_new(&ll->acd);
- if (r < 0)
- return r;
-
- r = sd_ipv4acd_set_callback(ll->acd, ipv4ll_on_acd, ll);
- if (r < 0)
- return r;
-
- r = sd_ipv4acd_set_check_mac_callback(ll->acd, ipv4ll_check_mac, ll);
- if (r < 0)
- return r;
-
- *ret = TAKE_PTR(ll);
-
- return 0;
-}
-
-int sd_ipv4ll_stop(sd_ipv4ll *ll) {
- if (!ll)
- return 0;
-
- return sd_ipv4acd_stop(ll->acd);
-}
-
-int sd_ipv4ll_set_ifindex(sd_ipv4ll *ll, int ifindex) {
- assert_return(ll, -EINVAL);
- assert_return(ifindex > 0, -EINVAL);
- assert_return(sd_ipv4ll_is_running(ll) == 0, -EBUSY);
-
- return sd_ipv4acd_set_ifindex(ll->acd, ifindex);
-}
-
-int sd_ipv4ll_get_ifindex(sd_ipv4ll *ll) {
- if (!ll)
- return -EINVAL;
-
- return sd_ipv4acd_get_ifindex(ll->acd);
-}
-
-int sd_ipv4ll_set_ifname(sd_ipv4ll *ll, const char *ifname) {
- assert_return(ll, -EINVAL);
- assert_return(ifname, -EINVAL);
-
- return sd_ipv4acd_set_ifname(ll->acd, ifname);
-}
-
-int sd_ipv4ll_get_ifname(sd_ipv4ll *ll, const char **ret) {
- assert_return(ll, -EINVAL);
-
- return sd_ipv4acd_get_ifname(ll->acd, ret);
-}
-
-int sd_ipv4ll_set_mac(sd_ipv4ll *ll, const struct ether_addr *addr) {
- int r;
-
- assert_return(ll, -EINVAL);
- assert_return(addr, -EINVAL);
- assert_return(!ether_addr_is_null(addr), -EINVAL);
-
- r = sd_ipv4acd_set_mac(ll->acd, addr);
- if (r < 0)
- return r;
-
- ll->mac = *addr;
- return 0;
-}
-
-int sd_ipv4ll_detach_event(sd_ipv4ll *ll) {
- assert_return(ll, -EINVAL);
-
- return sd_ipv4acd_detach_event(ll->acd);
-}
-
-int sd_ipv4ll_attach_event(sd_ipv4ll *ll, sd_event *event, int64_t priority) {
- assert_return(ll, -EINVAL);
-
- return sd_ipv4acd_attach_event(ll->acd, event, priority);
-}
-
-int sd_ipv4ll_set_callback(sd_ipv4ll *ll, sd_ipv4ll_callback_t cb, void *userdata) {
- assert_return(ll, -EINVAL);
-
- ll->callback = cb;
- ll->userdata = userdata;
-
- return 0;
-}
-
-int sd_ipv4ll_set_check_mac_callback(sd_ipv4ll *ll, sd_ipv4ll_check_mac_callback_t cb, void *userdata) {
- assert_return(ll, -EINVAL);
-
- ll->check_mac_callback = cb;
- ll->check_mac_userdata = userdata;
-
- return 0;
-}
-
-int sd_ipv4ll_get_address(sd_ipv4ll *ll, struct in_addr *address) {
- assert_return(ll, -EINVAL);
- assert_return(address, -EINVAL);
-
- if (ll->claimed_address == 0)
- return -ENOENT;
-
- address->s_addr = ll->claimed_address;
-
- return 0;
-}
-
-int sd_ipv4ll_set_address_seed(sd_ipv4ll *ll, uint64_t seed) {
- assert_return(ll, -EINVAL);
- assert_return(sd_ipv4ll_is_running(ll) == 0, -EBUSY);
-
- ll->seed.value = htole64(seed);
- ll->seed_set = true;
-
- return 0;
-}
-
-int sd_ipv4ll_is_running(sd_ipv4ll *ll) {
- assert_return(ll, false);
-
- return sd_ipv4acd_is_running(ll->acd);
-}
-
-static bool ipv4ll_address_is_valid(const struct in_addr *address) {
- assert(address);
-
- if (!in4_addr_is_link_local(address))
- return false;
-
- return !IN_SET(be32toh(address->s_addr) & 0x0000FF00U, 0x0000U, 0xFF00U);
-}
-
-int sd_ipv4ll_set_address(sd_ipv4ll *ll, const struct in_addr *address) {
- int r;
-
- assert_return(ll, -EINVAL);
- assert_return(address, -EINVAL);
- assert_return(ipv4ll_address_is_valid(address), -EINVAL);
-
- r = sd_ipv4acd_set_address(ll->acd, address);
- if (r < 0)
- return r;
-
- ll->address = address->s_addr;
-
- return 0;
-}
-
-#define PICK_HASH_KEY SD_ID128_MAKE(15,ac,82,a6,d6,3f,49,78,98,77,5d,0c,69,02,94,0b)
-
-static int ipv4ll_pick_address(sd_ipv4ll *ll) {
- _cleanup_free_ char *address = NULL;
- be32_t addr;
-
- assert(ll);
-
- do {
- uint64_t h;
-
- h = siphash24(&ll->seed, sizeof(ll->seed), PICK_HASH_KEY.bytes);
-
- /* Increase the generation counter by one */
- ll->seed.generation = htole64(le64toh(ll->seed.generation) + 1);
-
- addr = htobe32((h & UINT32_C(0x0000FFFF)) | IPV4LL_NETWORK);
- } while (addr == ll->address ||
- IN_SET(be32toh(addr) & 0x0000FF00U, 0x0000U, 0xFF00U));
-
- (void) in_addr_to_string(AF_INET, &(union in_addr_union) { .in.s_addr = addr }, &address);
- log_ipv4ll(ll, "Picked new IP address %s.", strna(address));
-
- return sd_ipv4ll_set_address(ll, &(struct in_addr) { addr });
-}
-
-#define MAC_HASH_KEY SD_ID128_MAKE(df,04,22,98,3f,ad,14,52,f9,87,2e,d1,9c,70,e2,f2)
-
-static int ipv4ll_start_internal(sd_ipv4ll *ll, bool reset_generation) {
- int r;
- bool picked_address = false;
-
- assert_return(ll, -EINVAL);
- assert_return(!ether_addr_is_null(&ll->mac), -EINVAL);
-
- /* If no random seed is set, generate some from the MAC address */
- if (!ll->seed_set)
- ll->seed.value = htole64(siphash24(ll->mac.ether_addr_octet, ETH_ALEN, MAC_HASH_KEY.bytes));
-
- if (reset_generation)
- ll->seed.generation = 0;
-
- if (ll->address == 0) {
- r = ipv4ll_pick_address(ll);
- if (r < 0)
- return r;
-
- picked_address = true;
- }
-
- r = sd_ipv4acd_start(ll->acd, reset_generation);
- if (r < 0) {
-
- /* We couldn't start? If so, let's forget the picked address again, the user might make a change and
- * retry, and we want the new data to take effect when picking an address. */
- if (picked_address)
- ll->address = 0;
-
- return r;
- }
-
- return 1;
-}
-
-int sd_ipv4ll_start(sd_ipv4ll *ll) {
- assert_return(ll, -EINVAL);
-
- if (sd_ipv4ll_is_running(ll))
- return 0;
-
- return ipv4ll_start_internal(ll, true);
-}
-
-int sd_ipv4ll_restart(sd_ipv4ll *ll) {
- ll->address = 0;
-
- return ipv4ll_start_internal(ll, false);
-}
-
-static void ipv4ll_client_notify(sd_ipv4ll *ll, int event) {
- assert(ll);
-
- if (ll->callback)
- ll->callback(ll, event, ll->userdata);
-}
-
-void ipv4ll_on_acd(sd_ipv4acd *acd, int event, void *userdata) {
- sd_ipv4ll *ll = userdata;
- IPV4LL_DONT_DESTROY(ll);
- int r;
-
- assert(acd);
- assert(ll);
-
- switch (event) {
-
- case SD_IPV4ACD_EVENT_STOP:
- ipv4ll_client_notify(ll, SD_IPV4LL_EVENT_STOP);
- ll->claimed_address = 0;
- break;
-
- case SD_IPV4ACD_EVENT_BIND:
- ll->claimed_address = ll->address;
- ipv4ll_client_notify(ll, SD_IPV4LL_EVENT_BIND);
- break;
-
- case SD_IPV4ACD_EVENT_CONFLICT:
- /* if an address was already bound we must call up to the
- user to handle this, otherwise we just try again */
- if (ll->claimed_address != 0) {
- ipv4ll_client_notify(ll, SD_IPV4LL_EVENT_CONFLICT);
-
- ll->claimed_address = 0;
- } else {
- r = sd_ipv4ll_restart(ll);
- if (r < 0)
- goto error;
- }
-
- break;
-
- default:
- assert_not_reached();
- }
-
- return;
-
-error:
- ipv4ll_client_notify(ll, SD_IPV4LL_EVENT_STOP);
-}
-
-static int ipv4ll_check_mac(sd_ipv4acd *acd, const struct ether_addr *mac, void *userdata) {
- sd_ipv4ll *ll = userdata;
-
- assert(ll);
-
- if (ll->check_mac_callback)
- return ll->check_mac_callback(ll, mac, ll->check_mac_userdata);
-
- return 0;
-}
diff --git a/src/libnm-systemd-core/src/libsystemd/sd-event/event-util.c b/src/libnm-systemd-core/src/libsystemd/sd-event/event-util.c
index 8c24e7db63..a36eba9029 100644
--- a/src/libnm-systemd-core/src/libsystemd/sd-event/event-util.c
+++ b/src/libnm-systemd-core/src/libsystemd/sd-event/event-util.c
@@ -109,20 +109,6 @@ int event_reset_time_relative(
return event_reset_time(e, s, clock, usec_add(usec_now, usec), accuracy, callback, userdata, priority, description, force_reset);
}
-int event_source_disable(sd_event_source *s) {
- if (!s)
- return 0;
-
- return sd_event_source_set_enabled(s, SD_EVENT_OFF);
-}
-
-int event_source_is_enabled(sd_event_source *s) {
- if (!s)
- return false;
-
- return sd_event_source_get_enabled(s, NULL);
-}
-
int event_add_time_change(sd_event *e, sd_event_source **ret, sd_event_io_handler_t callback, void *userdata) {
_cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL;
_cleanup_close_ int fd = -1;
diff --git a/src/libnm-systemd-core/src/libsystemd/sd-event/event-util.h b/src/libnm-systemd-core/src/libsystemd/sd-event/event-util.h
index abd043bdcc..c185584412 100644
--- a/src/libnm-systemd-core/src/libsystemd/sd-event/event-util.h
+++ b/src/libnm-systemd-core/src/libsystemd/sd-event/event-util.h
@@ -27,7 +27,8 @@ int event_reset_time_relative(
int64_t priority,
const char *description,
bool force_reset);
-int event_source_disable(sd_event_source *s);
-int event_source_is_enabled(sd_event_source *s);
+static inline int event_source_disable(sd_event_source *s) {
+ return sd_event_source_set_enabled(s, SD_EVENT_OFF);
+}
int event_add_time_change(sd_event *e, sd_event_source **ret, sd_event_io_handler_t callback, void *userdata);
diff --git a/src/libnm-systemd-core/src/libsystemd/sd-event/sd-event.c b/src/libnm-systemd-core/src/libsystemd/sd-event/sd-event.c
index 4dbdf19872..cea1c009d6 100644
--- a/src/libnm-systemd-core/src/libsystemd/sd-event/sd-event.c
+++ b/src/libnm-systemd-core/src/libsystemd/sd-event/sd-event.c
@@ -13,6 +13,7 @@
#include "event-source.h"
#include "fd-util.h"
#include "fs-util.h"
+#include "glyph-util.h"
#include "hashmap.h"
#include "list.h"
#include "macro.h"
@@ -405,7 +406,8 @@ _public_ int sd_event_new(sd_event** ret) {
e->epoll_fd = fd_move_above_stdio(e->epoll_fd);
if (secure_getenv("SD_EVENT_PROFILE_DELAYS")) {
- log_debug("Event loop profiling enabled. Logarithmic histogram of event loop iterations in the range 2^0 … 2^63 us will be logged every 5s.");
+ log_debug("Event loop profiling enabled. Logarithmic histogram of event loop iterations in the range 2^0 %s 2^63 us will be logged every 5s.",
+ special_glyph(SPECIAL_GLYPH_ELLIPSIS));
e->profile_delays = true;
}
@@ -706,6 +708,9 @@ static void event_unmask_signal_data(sd_event *e, struct signal_data *d, int sig
return;
}
+ if (event_pid_changed(e))
+ return;
+
assert(d->fd >= 0);
if (signalfd(d->fd, &d->sigset, SFD_NONBLOCK|SFD_CLOEXEC) < 0)
@@ -851,6 +856,9 @@ static void source_disconnect(sd_event_source *s) {
break;
case SOURCE_CHILD:
+ if (event_pid_changed(s->event))
+ s->child.process_owned = false;
+
if (s->child.pid > 0) {
if (event_source_is_online(s)) {
assert(s->event->n_online_child_sources > 0);
@@ -1426,7 +1434,6 @@ _public_ int sd_event_add_child(
return -ENOMEM;
s->wakeup = WAKEUP_EVENT_SOURCE;
- s->child.pid = pid;
s->child.options = options;
s->child.callback = callback;
s->userdata = userdata;
@@ -1436,7 +1443,7 @@ _public_ int sd_event_add_child(
* pin the PID, and make regular waitid() handling race-free. */
if (shall_use_pidfd()) {
- s->child.pidfd = pidfd_open(s->child.pid, 0);
+ s->child.pidfd = pidfd_open(pid, 0);
if (s->child.pidfd < 0) {
/* Propagate errors unless the syscall is not supported or blocked */
if (!ERRNO_IS_NOT_SUPPORTED(errno) && !ERRNO_IS_PRIVILEGE(errno))
@@ -1446,10 +1453,6 @@ _public_ int sd_event_add_child(
} else
s->child.pidfd = -1;
- r = hashmap_put(e->child_sources, PID_TO_PTR(pid), s);
- if (r < 0)
- return r;
-
if (EVENT_SOURCE_WATCH_PIDFD(s)) {
/* We have a pidfd and we only want to watch for exit */
r = source_child_pidfd_register(s, s->enabled);
@@ -1465,6 +1468,12 @@ _public_ int sd_event_add_child(
e->need_process_child = true;
}
+ r = hashmap_put(e->child_sources, PID_TO_PTR(pid), s);
+ if (r < 0)
+ return r;
+
+ /* These must be done after everything succeeds. */
+ s->child.pid = pid;
e->n_online_child_sources++;
if (ret)
@@ -1691,7 +1700,8 @@ static void event_free_inotify_data(sd_event *e, struct inotify_data *d) {
assert_se(hashmap_remove(e->inotify_data, &d->priority) == d);
if (d->fd >= 0) {
- if (epoll_ctl(e->epoll_fd, EPOLL_CTL_DEL, d->fd, NULL) < 0)
+ if (!event_pid_changed(e) &&
+ epoll_ctl(e->epoll_fd, EPOLL_CTL_DEL, d->fd, NULL) < 0)
log_debug_errno(errno, "Failed to remove inotify fd from epoll, ignoring: %m");
safe_close(d->fd);
@@ -1791,7 +1801,7 @@ static void event_free_inode_data(
if (!d)
return;
- assert(!d->event_sources);
+ assert(LIST_IS_EMPTY(d->event_sources));
if (d->fd >= 0) {
LIST_REMOVE(to_close, e->inode_data_to_close, d);
@@ -1801,7 +1811,7 @@ static void event_free_inode_data(
if (d->inotify_data) {
if (d->wd >= 0) {
- if (d->inotify_data->fd >= 0) {
+ if (d->inotify_data->fd >= 0 && !event_pid_changed(e)) {
/* So here's a problem. At the time this runs the watch descriptor might already be
* invalidated, because an IN_IGNORED event might be queued right the moment we enter
* the syscall. Hence, whenever we get EINVAL, ignore it entirely, since it's a very
@@ -1854,7 +1864,7 @@ static void event_gc_inode_data(
if (!d)
return;
- if (d->event_sources)
+ if (!LIST_IS_EMPTY(d->event_sources))
return;
inotify_data = d->inotify_data;
@@ -2403,6 +2413,10 @@ fail:
}
_public_ int sd_event_source_get_enabled(sd_event_source *s, int *ret) {
+ /* Quick mode: the event source doesn't exist and we only want to query boolean enablement state. */
+ if (!s && !ret)
+ return false;
+
assert_return(s, -EINVAL);
assert_return(!event_pid_changed(s->event), -ECHILD);
@@ -2580,8 +2594,13 @@ static int event_source_online(
_public_ int sd_event_source_set_enabled(sd_event_source *s, int m) {
int r;
- assert_return(s, -EINVAL);
assert_return(IN_SET(m, SD_EVENT_OFF, SD_EVENT_ON, SD_EVENT_ONESHOT), -EINVAL);
+
+ /* Quick mode: if the source doesn't exist, SD_EVENT_OFF is a noop. */
+ if (m == SD_EVENT_OFF && !s)
+ return 0;
+
+ assert_return(s, -EINVAL);
assert_return(!event_pid_changed(s->event), -ECHILD);
/* If we are dead anyway, we are fine with turning off sources, but everything else needs to fail. */
@@ -3218,23 +3237,16 @@ static int process_child(sd_event *e, int64_t threshold, int64_t *ret_min_priori
e->need_process_child = false;
- /*
- So, this is ugly. We iteratively invoke waitid() with P_PID
- + WNOHANG for each PID we wait for, instead of using
- P_ALL. This is because we only want to get child
- information of very specific child processes, and not all
- of them. We might not have processed the SIGCHLD even of a
- previous invocation and we don't want to maintain a
- unbounded *per-child* event queue, hence we really don't
- want anything flushed out of the kernel's queue that we
- don't care about. Since this is O(n) this means that if you
- have a lot of processes you probably want to handle SIGCHLD
- yourself.
-
- We do not reap the children here (by using WNOWAIT), this
- is only done after the event source is dispatched so that
- the callback still sees the process as a zombie.
- */
+ /* So, this is ugly. We iteratively invoke waitid() with P_PID + WNOHANG for each PID we wait
+ * for, instead of using P_ALL. This is because we only want to get child information of very
+ * specific child processes, and not all of them. We might not have processed the SIGCHLD event
+ * of a previous invocation and we don't want to maintain a unbounded *per-child* event queue,
+ * hence we really don't want anything flushed out of the kernel's queue that we don't care
+ * about. Since this is O(n) this means that if you have a lot of processes you probably want
+ * to handle SIGCHLD yourself.
+ *
+ * We do not reap the children here (by using WNOWAIT), this is only done after the event
+ * source is dispatched so that the callback still sees the process as a zombie. */
HASHMAP_FOREACH(s, e->child_sources) {
assert(s->type == SOURCE_CHILD);
@@ -3251,7 +3263,9 @@ static int process_child(sd_event *e, int64_t threshold, int64_t *ret_min_priori
if (s->child.exited)
continue;
- if (EVENT_SOURCE_WATCH_PIDFD(s)) /* There's a usable pidfd known for this event source? then don't waitid() for it here */
+ if (EVENT_SOURCE_WATCH_PIDFD(s))
+ /* There's a usable pidfd known for this event source? Then don't waitid() for
+ * it here */
continue;
zero(s->child.siginfo);
@@ -3266,10 +3280,9 @@ static int process_child(sd_event *e, int64_t threshold, int64_t *ret_min_priori
s->child.exited = true;
if (!zombie && (s->child.options & WEXITED)) {
- /* If the child isn't dead then let's
- * immediately remove the state change
- * from the queue, since there's no
- * benefit in leaving it queued */
+ /* If the child isn't dead then let's immediately remove the state
+ * change from the queue, since there's no benefit in leaving it
+ * queued. */
assert(s->child.options & (WSTOPPED|WCONTINUED));
(void) waitid(P_PID, s->child.pid, &s->child.siginfo, WNOHANG|(s->child.options & (WSTOPPED|WCONTINUED)));
@@ -3324,19 +3337,16 @@ static int process_signal(sd_event *e, struct signal_data *d, uint32_t events, i
assert_return(events == EPOLLIN, -EIO);
assert(min_priority);
- /* If there's a signal queued on this priority and SIGCHLD is
- on this priority too, then make sure to recheck the
- children we watch. This is because we only ever dequeue
- the first signal per priority, and if we dequeue one, and
- SIGCHLD might be enqueued later we wouldn't know, but we
- might have higher priority children we care about hence we
- need to check that explicitly. */
+ /* If there's a signal queued on this priority and SIGCHLD is on this priority too, then make
+ * sure to recheck the children we watch. This is because we only ever dequeue the first signal
+ * per priority, and if we dequeue one, and SIGCHLD might be enqueued later we wouldn't know,
+ * but we might have higher priority children we care about hence we need to check that
+ * explicitly. */
if (sigismember(&d->sigset, SIGCHLD))
e->need_process_child = true;
- /* If there's already an event source pending for this
- * priority we don't read another */
+ /* If there's already an event source pending for this priority we don't read another */
if (d->current)
return 0;
@@ -3875,7 +3885,7 @@ _public_ int sd_event_prepare(sd_event *e) {
event_close_inode_data_fds(e);
- if (event_next_pending(e) || e->need_process_child)
+ if (event_next_pending(e) || e->need_process_child || !LIST_IS_EMPTY(e->inotify_data_buffered))
goto pending;
e->state = SD_EVENT_ARMED;
@@ -3955,7 +3965,7 @@ static int process_epoll(sd_event *e, usec_t timeout, int64_t threshold, int64_t
n_event_max = MALLOC_ELEMENTSOF(e->event_queue);
/* If we still have inotify data buffered, then query the other fds, but don't wait on it */
- if (e->inotify_data_buffered)
+ if (!LIST_IS_EMPTY(e->inotify_data_buffered))
timeout = 0;
for (;;) {
diff --git a/src/libnm-systemd-core/src/libsystemd/sd-id128/id128-util.c b/src/libnm-systemd-core/src/libsystemd/sd-id128/id128-util.c
index e4a3bbd3eb..4f52c14f64 100644
--- a/src/libnm-systemd-core/src/libsystemd/sd-id128/id128-util.c
+++ b/src/libnm-systemd-core/src/libsystemd/sd-id128/id128-util.c
@@ -25,9 +25,9 @@ bool id128_is_valid(const char *s) {
for (i = 0; i < l; i++) {
char c = s[i];
- if (!(c >= '0' && c <= '9') &&
- !(c >= 'a' && c <= 'z') &&
- !(c >= 'A' && c <= 'Z'))
+ if (!ascii_isdigit(c) &&
+ !(c >= 'a' && c <= 'f') &&
+ !(c >= 'A' && c <= 'F'))
return false;
}
@@ -42,9 +42,9 @@ bool id128_is_valid(const char *s) {
if (c != '-')
return false;
} else {
- if (!(c >= '0' && c <= '9') &&
- !(c >= 'a' && c <= 'z') &&
- !(c >= 'A' && c <= 'Z'))
+ if (!ascii_isdigit(c) &&
+ !(c >= 'a' && c <= 'f') &&
+ !(c >= 'A' && c <= 'F'))
return false;
}
}
@@ -206,19 +206,3 @@ int id128_get_product(sd_id128_t *ret) {
*ret = uuid;
return 0;
}
-
-int id128_equal_string(const char *s, sd_id128_t id) {
- sd_id128_t parsed;
- int r;
-
- if (!s)
- return false;
-
- /* Checks if the specified string matches a valid string representation of the specified 128 bit ID/uuid */
-
- r = sd_id128_from_string(s, &parsed);
- if (r < 0)
- return r;
-
- return sd_id128_equal(parsed, id);
-}
diff --git a/src/libnm-systemd-core/src/libsystemd/sd-id128/id128-util.h b/src/libnm-systemd-core/src/libsystemd/sd-id128/id128-util.h
index 65a278c8ee..17b180c10c 100644
--- a/src/libnm-systemd-core/src/libsystemd/sd-id128/id128-util.h
+++ b/src/libnm-systemd-core/src/libsystemd/sd-id128/id128-util.h
@@ -34,5 +34,3 @@ extern const struct hash_ops id128_hash_ops;
sd_id128_t id128_make_v4_uuid(sd_id128_t id);
int id128_get_product(sd_id128_t *ret);
-
-int id128_equal_string(const char *s, sd_id128_t id);
diff --git a/src/libnm-systemd-core/src/libsystemd/sd-id128/sd-id128.c b/src/libnm-systemd-core/src/libsystemd/sd-id128/sd-id128.c
index 09c3401ca1..709c8ffb57 100644
--- a/src/libnm-systemd-core/src/libsystemd/sd-id128/sd-id128.c
+++ b/src/libnm-systemd-core/src/libsystemd/sd-id128/sd-id128.c
@@ -101,6 +101,22 @@ _public_ int sd_id128_from_string(const char s[], sd_id128_t *ret) {
return 0;
}
+_public_ int sd_id128_string_equal(const char *s, sd_id128_t id) {
+ sd_id128_t parsed;
+ int r;
+
+ if (!s)
+ return false;
+
+ /* Checks if the specified string matches a valid string representation of the specified 128 bit ID/uuid */
+
+ r = sd_id128_from_string(s, &parsed);
+ if (r < 0)
+ return r;
+
+ return sd_id128_equal(parsed, id);
+}
+
_public_ int sd_id128_get_machine(sd_id128_t *ret) {
static thread_local sd_id128_t saved_machine_id = {};
int r;
@@ -256,7 +272,10 @@ _public_ int sd_id128_get_invocation(sd_id128_t *ret) {
/* We first check the environment. The environment variable is primarily relevant for user
* services, and sufficiently safe as long as no privilege boundary is involved. */
r = get_invocation_from_environment(&saved_invocation_id);
- if (r < 0 && r != -ENXIO)
+ if (r >= 0) {
+ *ret = saved_invocation_id;
+ return 0;
+ } else if (r != -ENXIO)
return r;
/* The kernel keyring is relevant for system services (as for user services we don't store
@@ -272,13 +291,10 @@ _public_ int sd_id128_get_invocation(sd_id128_t *ret) {
_public_ int sd_id128_randomize(sd_id128_t *ret) {
sd_id128_t t;
- int r;
assert_return(ret, -EINVAL);
- r = genuine_random_bytes(&t, sizeof(t), 0);
- if (r < 0)
- return r;
+ random_bytes(&t, sizeof(t));
/* Turn this into a valid v4 UUID, to be nice. Note that we
* only guarantee this for newly generated UUIDs, not for
diff --git a/src/libnm-systemd-core/src/systemd/_sd-common.h b/src/libnm-systemd-core/src/systemd/_sd-common.h
index e121429640..38449463e2 100644
--- a/src/libnm-systemd-core/src/systemd/_sd-common.h
+++ b/src/libnm-systemd-core/src/systemd/_sd-common.h
@@ -14,7 +14,7 @@
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 <http://www.gnu.org/licenses/>.
+ along with systemd; If not, see <https://www.gnu.org/licenses/>.
***/
/* This is a private header; never even think of including this directly! */
diff --git a/src/libnm-systemd-core/src/systemd/sd-dhcp-client.h b/src/libnm-systemd-core/src/systemd/sd-dhcp-client.h
deleted file mode 100644
index 834f80b421..0000000000
--- a/src/libnm-systemd-core/src/systemd/sd-dhcp-client.h
+++ /dev/null
@@ -1,345 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#ifndef foosddhcpclienthfoo
-#define foosddhcpclienthfoo
-
-/***
- 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 <http://www.gnu.org/licenses/>.
-***/
-
-#include <inttypes.h>
-#include <net/ethernet.h>
-#include <netinet/in.h>
-#include <sys/types.h>
-#include <stdbool.h>
-
-#include "sd-dhcp-lease.h"
-#include "sd-dhcp-option.h"
-#include "sd-event.h"
-
-#include "_sd-common.h"
-
-_SD_BEGIN_DECLARATIONS;
-
-enum {
- SD_DHCP_CLIENT_EVENT_STOP = 0,
- SD_DHCP_CLIENT_EVENT_IP_ACQUIRE = 1,
- SD_DHCP_CLIENT_EVENT_IP_CHANGE = 2,
- SD_DHCP_CLIENT_EVENT_EXPIRED = 3,
- SD_DHCP_CLIENT_EVENT_RENEW = 4,
- SD_DHCP_CLIENT_EVENT_SELECTING = 5,
- SD_DHCP_CLIENT_EVENT_TRANSIENT_FAILURE = 6, /* Sent when we have not received a reply after the first few attempts.
- * The client may want to start acquiring link-local addresses. */
-};
-
-/* https://www.iana.org/assignments/bootp-dhcp-parameters/bootp-dhcp-parameters.xhtml#options */
-enum {
- SD_DHCP_OPTION_PAD = 0, /* [RFC2132] */
- SD_DHCP_OPTION_SUBNET_MASK = 1, /* [RFC2132] */
- SD_DHCP_OPTION_TIME_OFFSET = 2, /* [RFC2132], deprecated by 100 and 101 */
- SD_DHCP_OPTION_ROUTER = 3, /* [RFC2132] */
- SD_DHCP_OPTION_TIME_SERVER = 4, /* [RFC2132] */
- SD_DHCP_OPTION_NAME_SERVER = 5, /* [RFC2132] */
- SD_DHCP_OPTION_DOMAIN_NAME_SERVER = 6, /* [RFC2132] */
- SD_DHCP_OPTION_LOG_SERVER = 7, /* [RFC2132] */
- SD_DHCP_OPTION_QUOTES_SERVER = 8, /* [RFC2132] */
- SD_DHCP_OPTION_LPR_SERVER = 9, /* [RFC2132] */
- SD_DHCP_OPTION_IMPRESS_SERVER = 10, /* [RFC2132] */
- SD_DHCP_OPTION_RLP_SERVER = 11, /* [RFC2132] */
- SD_DHCP_OPTION_HOST_NAME = 12, /* [RFC2132] */
- SD_DHCP_OPTION_BOOT_FILE_SIZE = 13, /* [RFC2132] */
- SD_DHCP_OPTION_MERIT_DUMP_FILE = 14, /* [RFC2132] */
- SD_DHCP_OPTION_DOMAIN_NAME = 15, /* [RFC2132] */
- SD_DHCP_OPTION_SWAP_SERVER = 16, /* [RFC2132] */
- SD_DHCP_OPTION_ROOT_PATH = 17, /* [RFC2132] */
- SD_DHCP_OPTION_EXTENSION_FILE = 18, /* [RFC2132] */
- SD_DHCP_OPTION_FORWARD = 19, /* [RFC2132] */
- SD_DHCP_OPTION_SOURCE_ROUTE = 20, /* [RFC2132] */
- SD_DHCP_OPTION_POLICY_FILTER = 21, /* [RFC2132] */
- SD_DHCP_OPTION_MAX_DATAGRAM_ASSEMBLY = 22, /* [RFC2132] */
- SD_DHCP_OPTION_DEFAULT_IP_TTL = 23, /* [RFC2132] */
- SD_DHCP_OPTION_MTU_TIMEOUT = 24, /* [RFC2132] */
- SD_DHCP_OPTION_MTU_PLATEAU = 25, /* [RFC2132] */
- SD_DHCP_OPTION_MTU_INTERFACE = 26, /* [RFC2132] */
- SD_DHCP_OPTION_MTU_SUBNET = 27, /* [RFC2132] */
- SD_DHCP_OPTION_BROADCAST = 28, /* [RFC2132] */
- SD_DHCP_OPTION_MASK_DISCOVERY = 29, /* [RFC2132] */
- SD_DHCP_OPTION_MASK_SUPPLIER = 30, /* [RFC2132] */
- SD_DHCP_OPTION_ROUTER_DISCOVERY = 31, /* [RFC2132] */
- SD_DHCP_OPTION_ROUTER_REQUEST = 32, /* [RFC2132] */
- SD_DHCP_OPTION_STATIC_ROUTE = 33, /* [RFC2132] */
- SD_DHCP_OPTION_TRAILERS = 34, /* [RFC2132] */
- SD_DHCP_OPTION_ARP_TIMEOUT = 35, /* [RFC2132] */
- SD_DHCP_OPTION_ETHERNET = 36, /* [RFC2132] */
- SD_DHCP_OPTION_DEFAULT_TCP_TTL = 37, /* [RFC2132] */
- SD_DHCP_OPTION_KEEPALIVE_TIME = 38, /* [RFC2132] */
- SD_DHCP_OPTION_KEEPALIVE_DATA = 39, /* [RFC2132] */
- SD_DHCP_OPTION_NIS_DOMAIN = 40, /* [RFC2132] */
- SD_DHCP_OPTION_NIS_SERVER = 41, /* [RFC2132] */
- SD_DHCP_OPTION_NTP_SERVER = 42, /* [RFC2132] */
- SD_DHCP_OPTION_VENDOR_SPECIFIC = 43, /* [RFC2132] */
- SD_DHCP_OPTION_NETBIOS_NAME_SERVER = 44, /* [RFC2132] */
- SD_DHCP_OPTION_NETBIOS_DIST_SERVER = 45, /* [RFC2132] */
- SD_DHCP_OPTION_NETBIOS_NODE_TYPE = 46, /* [RFC2132] */
- SD_DHCP_OPTION_NETBIOS_SCOPE = 47, /* [RFC2132] */
- SD_DHCP_OPTION_X_WINDOW_FONT = 48, /* [RFC2132] */
- SD_DHCP_OPTION_X_WINDOW_MANAGER = 49, /* [RFC2132] */
- SD_DHCP_OPTION_REQUESTED_IP_ADDRESS = 50, /* [RFC2132] */
- SD_DHCP_OPTION_IP_ADDRESS_LEASE_TIME = 51, /* [RFC2132] */
- SD_DHCP_OPTION_OVERLOAD = 52, /* [RFC2132] */
- SD_DHCP_OPTION_MESSAGE_TYPE = 53, /* [RFC2132] */
- SD_DHCP_OPTION_SERVER_IDENTIFIER = 54, /* [RFC2132] */
- SD_DHCP_OPTION_PARAMETER_REQUEST_LIST = 55, /* [RFC2132] */
- SD_DHCP_OPTION_ERROR_MESSAGE = 56, /* [RFC2132] */
- SD_DHCP_OPTION_MAXIMUM_MESSAGE_SIZE = 57, /* [RFC2132] */
- SD_DHCP_OPTION_RENEWAL_TIME = 58, /* [RFC2132] */
- SD_DHCP_OPTION_REBINDING_TIME = 59, /* [RFC2132] */
- SD_DHCP_OPTION_VENDOR_CLASS_IDENTIFIER = 60, /* [RFC2132] */
- SD_DHCP_OPTION_CLIENT_IDENTIFIER = 61, /* [RFC2132] */
- SD_DHCP_OPTION_NETWARE_IP_DOMAIN = 62, /* [RFC2242] */
- SD_DHCP_OPTION_NETWARE_IP_OPTION = 63, /* [RFC2242] */
- SD_DHCP_OPTION_NIS_DOMAIN_NAME = 64, /* [RFC2132] */
- SD_DHCP_OPTION_NIS_SERVER_ADDR = 65, /* [RFC2132] */
- SD_DHCP_OPTION_BOOT_SERVER_NAME = 66, /* [RFC2132] */
- SD_DHCP_OPTION_BOOT_FILENAME = 67, /* [RFC2132] */
- SD_DHCP_OPTION_HOME_AGENT_ADDRESSES = 68, /* [RFC2132] */
- SD_DHCP_OPTION_SMTP_SERVER = 69, /* [RFC2132] */
- SD_DHCP_OPTION_POP3_SERVER = 70, /* [RFC2132] */
- SD_DHCP_OPTION_NNTP_SERVER = 71, /* [RFC2132] */
- SD_DHCP_OPTION_WWW_SERVER = 72, /* [RFC2132] */
- SD_DHCP_OPTION_FINGER_SERVER = 73, /* [RFC2132] */
- SD_DHCP_OPTION_IRC_SERVER = 74, /* [RFC2132] */
- SD_DHCP_OPTION_STREETTALK_SERVER = 75, /* [RFC2132] */
- SD_DHCP_OPTION_STDA_SERVER = 76, /* [RFC2132] */
- SD_DHCP_OPTION_USER_CLASS = 77, /* [RFC3004] */
- SD_DHCP_OPTION_DIRECTORY_AGENT = 78, /* [RFC2610] */
- SD_DHCP_OPTION_SERVICE_SCOPE = 79, /* [RFC2610] */
- SD_DHCP_OPTION_RAPID_COMMIT = 80, /* [RFC4039] */
- SD_DHCP_OPTION_FQDN = 81, /* [RFC4702] */
- SD_DHCP_OPTION_RELAY_AGENT_INFORMATION = 82, /* [RFC3046] */
- SD_DHCP_OPTION_ISNS = 83, /* [RFC4174] */
- /* option code 84 is unassigned [RFC3679] */
- SD_DHCP_OPTION_NDS_SERVER = 85, /* [RFC2241] */
- SD_DHCP_OPTION_NDS_TREE_NAME = 86, /* [RFC2241] */
- SD_DHCP_OPTION_NDS_CONTEXT = 87, /* [RFC2241] */
- SD_DHCP_OPTION_BCMCS_CONTROLLER_DOMAIN_NAM = 88, /* [RFC4280] */
- SD_DHCP_OPTION_BCMCS_CONTROLLER_ADDRESS = 89, /* [RFC4280] */
- SD_DHCP_OPTION_AUTHENTICATION = 90, /* [RFC3118] */
- SD_DHCP_OPTION_CLIENT_LAST_TRANSACTION_TIME = 91, /* [RFC4388] */
- SD_DHCP_OPTION_ASSOCIATED_IP = 92, /* [RFC4388] */
- SD_DHCP_OPTION_CLIENT_SYSTEM = 93, /* [RFC4578] */
- SD_DHCP_OPTION_CLIENT_NDI = 94, /* [RFC4578] */
- SD_DHCP_OPTION_LDAP = 95, /* [RFC3679] */
- /* option code 96 is unassigned [RFC3679] */
- SD_DHCP_OPTION_UUID = 97, /* [RFC4578] */
- SD_DHCP_OPTION_USER_AUTHENTICATION = 98, /* [RFC2485] */
- SD_DHCP_OPTION_GEOCONF_CIVIC = 99, /* [RFC4776] */
- SD_DHCP_OPTION_POSIX_TIMEZONE = 100, /* [RFC4833] */
- SD_DHCP_OPTION_TZDB_TIMEZONE = 101, /* [RFC4833] */
- /* option codes 102-107 are unassigned [RFC3679] */
- SD_DHCP_OPTION_IPV6_ONLY_PREFERRED = 108, /* [RFC8925] */
- SD_DHCP_OPTION_DHCP4O6_SOURCE_ADDRESS = 109, /* [RFC8539] */
- /* option codes 110-111 are unassigned [RFC3679] */
- SD_DHCP_OPTION_NETINFO_ADDRESS = 112, /* [RFC3679] */
- SD_DHCP_OPTION_NETINFO_TAG = 113, /* [RFC3679] */
- SD_DHCP_OPTION_DHCP_CAPTIVE_PORTAL = 114, /* [RFC8910] */
- /* option code 115 is unassigned [RFC3679] */
- SD_DHCP_OPTION_AUTO_CONFIG = 116, /* [RFC2563] */
- SD_DHCP_OPTION_NAME_SERVICE_SEARCH = 117, /* [RFC2937] */
- SD_DHCP_OPTION_SUBNET_SELECTION = 118, /* [RFC3011] */
- SD_DHCP_OPTION_DOMAIN_SEARCH = 119, /* [RFC3397] */
- SD_DHCP_OPTION_SIP_SERVER = 120, /* [RFC3361] */
- SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE = 121, /* [RFC3442] */
- SD_DHCP_OPTION_CABLELABS_CLIENT_CONFIGURATION = 122, /* [RFC3495] */
- SD_DHCP_OPTION_GEOCONF = 123, /* [RFC6225] */
- SD_DHCP_OPTION_VENDOR_CLASS = 124, /* [RFC3925] */
- SD_DHCP_OPTION_VENDOR_SPECIFIC_INFORMATION = 125, /* [RFC3925] */
- /* option codes 126-127 are unassigned [RFC3679] */
- /* option codes 128-135 are assigned to use by PXE, but they are vendor specific [RFC4578] */
- SD_DHCP_OPTION_PANA_AGENT = 136, /* [RFC5192] */
- SD_DHCP_OPTION_LOST_SERVER_FQDN = 137, /* [RFC5223] */
- SD_DHCP_OPTION_CAPWAP_AC_ADDRESS = 138, /* [RFC5417] */
- SD_DHCP_OPTION_MOS_ADDRESS = 139, /* [RFC5678] */
- SD_DHCP_OPTION_MOS_FQDN = 140, /* [RFC5678] */
- SD_DHCP_OPTION_SIP_SERVICE_DOMAINS = 141, /* [RFC6011] */
- SD_DHCP_OPTION_ANDSF_ADDRESS = 142, /* [RFC6153] */
- SD_DHCP_OPTION_SZTP_REDIRECT = 143, /* [RFC8572] */
- SD_DHCP_OPTION_GEOLOC = 144, /* [RFC6225] */
- SD_DHCP_OPTION_FORCERENEW_NONCE_CAPABLE = 145, /* [RFC6704] */
- SD_DHCP_OPTION_RDNSS_SELECTION = 146, /* [RFC6731] */
- SD_DHCP_OPTION_DOTS_RI = 147, /* [RFC8973] */
- SD_DHCP_OPTION_DOTS_ADDRESS = 148, /* [RFC8973] */
- /* option code 149 is unassigned [RFC3942] */
- SD_DHCP_OPTION_TFTP_SERVER_ADDRESS = 150, /* [RFC5859] */
- SD_DHCP_OPTION_STATUS_CODE = 151, /* [RFC6926] */
- SD_DHCP_OPTION_BASE_TIME = 152, /* [RFC6926] */
- SD_DHCP_OPTION_START_TIME_OF_STATE = 153, /* [RFC6926] */
- SD_DHCP_OPTION_QUERY_START_TIME = 154, /* [RFC6926] */
- SD_DHCP_OPTION_QUERY_END_TIME = 155, /* [RFC6926] */
- SD_DHCP_OPTION_DHCP_STATE = 156, /* [RFC6926] */
- SD_DHCP_OPTION_DATA_SOURCE = 157, /* [RFC6926] */
- SD_DHCP_OPTION_PCP_SERVER = 158, /* [RFC7291] */
- SD_DHCP_OPTION_PORT_PARAMS = 159, /* [RFC7618] */
- /* option code 160 is unassigned [RFC7710][RFC8910] */
- SD_DHCP_OPTION_MUD_URL = 161, /* [RFC8520] */
- /* option codes 162-174 are unassigned [RFC3942] */
- /* option codes 175-177 are temporary assigned. */
- /* option codes 178-207 are unassigned [RFC3942] */
- SD_DHCP_OPTION_PXELINUX_MAGIC = 208, /* [RFC5071] Deprecated */
- SD_DHCP_OPTION_CONFIGURATION_FILE = 209, /* [RFC5071] */
- SD_DHCP_OPTION_PATH_PREFIX = 210, /* [RFC5071] */
- SD_DHCP_OPTION_REBOOT_TIME = 211, /* [RFC5071] */
- SD_DHCP_OPTION_6RD = 212, /* [RFC5969] */
- SD_DHCP_OPTION_ACCESS_DOMAIN = 213, /* [RFC5986] */
- /* option codes 214-219 are unassigned */
- SD_DHCP_OPTION_SUBNET_ALLOCATION = 220, /* [RFC6656] */
- SD_DHCP_OPTION_VIRTUAL_SUBNET_SELECTION = 221, /* [RFC6607] */
- /* option codes 222-223 are unassigned [RFC3942] */
- /* option codes 224-254 are reserved for private use */
- SD_DHCP_OPTION_PRIVATE_BASE = 224,
- SD_DHCP_OPTION_PRIVATE_CLASSLESS_STATIC_ROUTE = 249, /* [RFC7844] */
- SD_DHCP_OPTION_PRIVATE_PROXY_AUTODISCOVERY = 252, /* [RFC7844] */
- SD_DHCP_OPTION_PRIVATE_LAST = 254,
- SD_DHCP_OPTION_END = 255, /* [RFC2132] */
-};
-
-/* Suboptions for SD_DHCP_OPTION_RELAY_AGENT_INFORMATION option */
-enum {
- SD_DHCP_RELAY_AGENT_CIRCUIT_ID = 1,
- SD_DHCP_RELAY_AGENT_REMOTE_ID = 2,
-};
-
-typedef struct sd_dhcp_client sd_dhcp_client;
-
-typedef int (*sd_dhcp_client_callback_t)(sd_dhcp_client *client, int event, void *userdata);
-int sd_dhcp_client_set_callback(
- sd_dhcp_client *client,
- sd_dhcp_client_callback_t cb,
- void *userdata);
-
-int sd_dhcp_client_set_request_option(
- sd_dhcp_client *client,
- uint8_t option);
-int sd_dhcp_client_set_request_address(
- sd_dhcp_client *client,
- const struct in_addr *last_address);
-int sd_dhcp_client_set_request_broadcast(
- sd_dhcp_client *client,
- int broadcast);
-int sd_dhcp_client_set_ifindex(
- sd_dhcp_client *client,
- int interface_index);
-int sd_dhcp_client_set_ifname(
- sd_dhcp_client *client,
- const char *interface_name);
-int sd_dhcp_client_get_ifname(sd_dhcp_client *client, const char **ret);
-int sd_dhcp_client_set_mac(
- sd_dhcp_client *client,
- const uint8_t *addr,
- const uint8_t *bcast_addr,
- size_t addr_len,
- uint16_t arp_type);
-int sd_dhcp_client_set_client_id(
- sd_dhcp_client *client,
- uint8_t type,
- const uint8_t *data,
- size_t data_len);
-int sd_dhcp_client_set_iaid_duid(
- sd_dhcp_client *client,
- bool iaid_set,
- uint32_t iaid,
- uint16_t duid_type,
- const void *duid,
- size_t duid_len);
-int sd_dhcp_client_set_iaid_duid_llt(
- sd_dhcp_client *client,
- bool iaid_set,
- uint32_t iaid,
- uint64_t llt_time);
-int sd_dhcp_client_set_duid(
- sd_dhcp_client *client,
- uint16_t duid_type,
- const void *duid,
- size_t duid_len);
-int sd_dhcp_client_set_duid_llt(
- sd_dhcp_client *client,
- uint64_t llt_time);
-int sd_dhcp_client_get_client_id(
- sd_dhcp_client *client,
- uint8_t *type,
- const uint8_t **data,
- size_t *data_len);
-int sd_dhcp_client_set_mtu(
- sd_dhcp_client *client,
- uint32_t mtu);
-int sd_dhcp_client_set_max_attempts(
- sd_dhcp_client *client,
- uint64_t attempt);
-int sd_dhcp_client_set_client_port(
- sd_dhcp_client *client,
- uint16_t port);
-int sd_dhcp_client_set_hostname(
- sd_dhcp_client *client,
- const char *hostname);
-int sd_dhcp_client_set_vendor_class_identifier(
- sd_dhcp_client *client,
- const char *vci);
-int sd_dhcp_client_set_mud_url(
- sd_dhcp_client *client,
- const char *mudurl);
-int sd_dhcp_client_set_user_class(
- sd_dhcp_client *client,
- char * const *user_class);
-int sd_dhcp_client_get_lease(
- sd_dhcp_client *client,
- sd_dhcp_lease **ret);
-int sd_dhcp_client_set_service_type(
- sd_dhcp_client *client,
- int type);
-int sd_dhcp_client_set_fallback_lease_lifetime(
- sd_dhcp_client *client,
- uint32_t fallback_lease_lifetime);
-
-int sd_dhcp_client_add_option(sd_dhcp_client *client, sd_dhcp_option *v);
-int sd_dhcp_client_add_vendor_option(sd_dhcp_client *client, sd_dhcp_option *v);
-
-int sd_dhcp_client_is_running(sd_dhcp_client *client);
-int sd_dhcp_client_stop(sd_dhcp_client *client);
-int sd_dhcp_client_start(sd_dhcp_client *client);
-int sd_dhcp_client_send_release(sd_dhcp_client *client);
-int sd_dhcp_client_send_decline(sd_dhcp_client *client);
-int sd_dhcp_client_send_renew(sd_dhcp_client *client);
-
-sd_dhcp_client *sd_dhcp_client_ref(sd_dhcp_client *client);
-sd_dhcp_client *sd_dhcp_client_unref(sd_dhcp_client *client);
-
-/* NOTE: anonymize parameter is used to initialize PRL memory with different
- * options when using RFC7844 Anonymity Profiles */
-int sd_dhcp_client_new(sd_dhcp_client **ret, int anonymize);
-
-int sd_dhcp_client_id_to_string(const void *data, size_t len, char **ret);
-
-int sd_dhcp_client_attach_event(
- sd_dhcp_client *client,
- sd_event *event,
- int64_t priority);
-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_END_DECLARATIONS;
-
-#endif
diff --git a/src/libnm-systemd-core/src/systemd/sd-dhcp-lease.h b/src/libnm-systemd-core/src/systemd/sd-dhcp-lease.h
deleted file mode 100644
index 578ac6d4db..0000000000
--- a/src/libnm-systemd-core/src/systemd/sd-dhcp-lease.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#ifndef foosddhcpleasehfoo
-#define foosddhcpleasehfoo
-
-/***
- 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 <http://www.gnu.org/licenses/>.
-***/
-
-#include <errno.h>
-#include <inttypes.h>
-#include <net/ethernet.h>
-#include <netinet/in.h>
-#include <sys/types.h>
-
-#include "_sd-common.h"
-
-_SD_BEGIN_DECLARATIONS;
-
-typedef struct sd_dhcp_lease sd_dhcp_lease;
-typedef struct sd_dhcp_route sd_dhcp_route;
-
-sd_dhcp_lease *sd_dhcp_lease_ref(sd_dhcp_lease *lease);
-sd_dhcp_lease *sd_dhcp_lease_unref(sd_dhcp_lease *lease);
-
-typedef enum sd_dhcp_lease_server_type_t {
- SD_DHCP_LEASE_DNS,
- SD_DHCP_LEASE_NTP,
- SD_DHCP_LEASE_SIP,
- SD_DHCP_LEASE_POP3,
- SD_DHCP_LEASE_SMTP,
- SD_DHCP_LEASE_LPR,
- _SD_DHCP_LEASE_SERVER_TYPE_MAX,
- _SD_DHCP_LEASE_SERVER_TYPE_INVALID = -EINVAL,
- _SD_ENUM_FORCE_S64(DHCP_LEASE_SERVER_TYPE),
-} sd_dhcp_lease_server_type_t;
-
-int sd_dhcp_lease_get_address(sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_lifetime(sd_dhcp_lease *lease, uint32_t *lifetime);
-int sd_dhcp_lease_get_t1(sd_dhcp_lease *lease, uint32_t *t1);
-int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint32_t *t2);
-int sd_dhcp_lease_get_broadcast(sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_next_server(sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_servers(sd_dhcp_lease *lease, sd_dhcp_lease_server_type_t what, const struct in_addr **addr);
-int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_sip(sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_pop3(sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_smtp(sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_lpr(sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu);
-int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname);
-int sd_dhcp_lease_get_search_domains(sd_dhcp_lease *lease, char ***domains);
-int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname);
-int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path);
-int sd_dhcp_lease_get_static_routes(sd_dhcp_lease *lease, sd_dhcp_route ***ret);
-int sd_dhcp_lease_get_classless_routes(sd_dhcp_lease *lease, sd_dhcp_route ***ret);
-int sd_dhcp_lease_get_vendor_specific(sd_dhcp_lease *lease, const void **data, size_t *data_len);
-int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const void **client_id, size_t *client_id_len);
-int sd_dhcp_lease_get_timezone(sd_dhcp_lease *lease, const char **timezone);
-int sd_dhcp_lease_get_6rd(
- sd_dhcp_lease *lease,
- uint8_t *ret_ipv4masklen,
- uint8_t *ret_prefixlen,
- struct in6_addr *ret_prefix,
- const struct in_addr **ret_br_addresses,
- size_t *ret_n_br_addresses);
-
-int sd_dhcp_route_get_destination(sd_dhcp_route *route, struct in_addr *destination);
-int sd_dhcp_route_get_destination_prefix_length(sd_dhcp_route *route, uint8_t *length);
-int sd_dhcp_route_get_gateway(sd_dhcp_route *route, struct in_addr *gateway);
-
-_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_dhcp_lease, sd_dhcp_lease_unref);
-
-_SD_END_DECLARATIONS;
-
-#endif
diff --git a/src/libnm-systemd-core/src/systemd/sd-dhcp-option.h b/src/libnm-systemd-core/src/systemd/sd-dhcp-option.h
deleted file mode 100644
index 71aa479b5e..0000000000
--- a/src/libnm-systemd-core/src/systemd/sd-dhcp-option.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#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 <http://www.gnu.org/licenses/>.
-***/
-
-#include <inttypes.h>
-#include <sys/types.h>
-
-#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/libnm-systemd-core/src/systemd/sd-dhcp6-client.h b/src/libnm-systemd-core/src/systemd/sd-dhcp6-client.h
index d89b7d1c83..7fe60c356c 100644
--- a/src/libnm-systemd-core/src/systemd/sd-dhcp6-client.h
+++ b/src/libnm-systemd-core/src/systemd/sd-dhcp6-client.h
@@ -16,7 +16,7 @@
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 <http://www.gnu.org/licenses/>.
+ along with systemd; If not, see <https://www.gnu.org/licenses/>.
***/
#include <inttypes.h>
@@ -36,7 +36,7 @@ enum {
SD_DHCP6_CLIENT_EVENT_RESEND_EXPIRE = 10,
SD_DHCP6_CLIENT_EVENT_RETRANS_MAX = 11,
SD_DHCP6_CLIENT_EVENT_IP_ACQUIRE = 12,
- SD_DHCP6_CLIENT_EVENT_INFORMATION_REQUEST = 13,
+ SD_DHCP6_CLIENT_EVENT_INFORMATION_REQUEST = 13
};
/* https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml#dhcpv6-parameters-2 */
@@ -63,15 +63,15 @@ enum {
SD_DHCP6_OPTION_RECONF_ACCEPT = 20, /* RFC 8415 */
SD_DHCP6_OPTION_SIP_SERVER_DOMAIN_NAME = 21, /* RFC 3319 */
SD_DHCP6_OPTION_SIP_SERVER_ADDRESS = 22, /* RFC 3319 */
- SD_DHCP6_OPTION_DNS_SERVERS = 23, /* RFC 3646 */
- SD_DHCP6_OPTION_DOMAIN_LIST = 24, /* RFC 3646 */
+ SD_DHCP6_OPTION_DNS_SERVER = 23, /* RFC 3646 */
+ SD_DHCP6_OPTION_DOMAIN = 24, /* RFC 3646 */
SD_DHCP6_OPTION_IA_PD = 25, /* RFC 3633, RFC 8415 */
SD_DHCP6_OPTION_IA_PD_PREFIX = 26, /* RFC 3633, RFC 8415 */
- SD_DHCP6_OPTION_NIS_SERVERS = 27, /* RFC 3898 */
- SD_DHCP6_OPTION_NISP_SERVERS = 28, /* RFC 3898 */
+ SD_DHCP6_OPTION_NIS_SERVER = 27, /* RFC 3898 */
+ SD_DHCP6_OPTION_NISP_SERVER = 28, /* RFC 3898 */
SD_DHCP6_OPTION_NIS_DOMAIN_NAME = 29, /* RFC 3898 */
SD_DHCP6_OPTION_NISP_DOMAIN_NAME = 30, /* RFC 3898 */
- SD_DHCP6_OPTION_SNTP_SERVERS = 31, /* RFC 4075, deprecated */
+ SD_DHCP6_OPTION_SNTP_SERVER = 31, /* RFC 4075, deprecated */
SD_DHCP6_OPTION_INFORMATION_REFRESH_TIME = 32, /* RFC 4242, 8415, sec. 21.23 */
SD_DHCP6_OPTION_BCMCS_SERVER_D = 33, /* RFC 4280 */
SD_DHCP6_OPTION_BCMCS_SERVER_A = 34, /* RFC 4280 */
@@ -183,7 +183,7 @@ enum {
SD_DHCP6_OPTION_SLAP_QUAD = 140, /* RFC 8948 */
SD_DHCP6_OPTION_V6_DOTS_RI = 141, /* RFC 8973 */
SD_DHCP6_OPTION_V6_DOTS_ADDRESS = 142, /* RFC 8973 */
- SD_DHCP6_OPTION_IPV6_ADDRESS_ANDSF = 143, /* RFC 6153 */
+ SD_DHCP6_OPTION_IPV6_ADDRESS_ANDSF = 143 /* RFC 6153 */
/* option codes 144-65535 are unassigned */
};
diff --git a/src/libnm-systemd-core/src/systemd/sd-dhcp6-lease.h b/src/libnm-systemd-core/src/systemd/sd-dhcp6-lease.h
index 472276def1..716f6fc17c 100644
--- a/src/libnm-systemd-core/src/systemd/sd-dhcp6-lease.h
+++ b/src/libnm-systemd-core/src/systemd/sd-dhcp6-lease.h
@@ -16,7 +16,7 @@
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 <http://www.gnu.org/licenses/>.
+ along with systemd; If not, see <https://www.gnu.org/licenses/>.
***/
#include <inttypes.h>
diff --git a/src/libnm-systemd-core/src/systemd/sd-dhcp6-option.h b/src/libnm-systemd-core/src/systemd/sd-dhcp6-option.h
index ddb2c7cecd..b4b4671e4a 100644
--- a/src/libnm-systemd-core/src/systemd/sd-dhcp6-option.h
+++ b/src/libnm-systemd-core/src/systemd/sd-dhcp6-option.h
@@ -14,7 +14,7 @@
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 <http://www.gnu.org/licenses/>.
+ along with systemd; If not, see <https://www.gnu.org/licenses/>.
***/
#include <inttypes.h>
diff --git a/src/libnm-systemd-core/src/systemd/sd-event.h b/src/libnm-systemd-core/src/systemd/sd-event.h
index 63984eef15..e782339c4a 100644
--- a/src/libnm-systemd-core/src/systemd/sd-event.h
+++ b/src/libnm-systemd-core/src/systemd/sd-event.h
@@ -14,7 +14,7 @@
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 <http://www.gnu.org/licenses/>.
+ along with systemd; If not, see <https://www.gnu.org/licenses/>.
***/
#include <inttypes.h>
diff --git a/src/libnm-systemd-core/src/systemd/sd-id128.h b/src/libnm-systemd-core/src/systemd/sd-id128.h
index f7d3244bb3..3303c374ce 100644
--- a/src/libnm-systemd-core/src/systemd/sd-id128.h
+++ b/src/libnm-systemd-core/src/systemd/sd-id128.h
@@ -14,7 +14,7 @@
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 <http://www.gnu.org/licenses/>.
+ along with systemd; If not, see <https://www.gnu.org/licenses/>.
***/
#include <inttypes.h>
@@ -116,9 +116,11 @@ int sd_id128_get_boot_app_specific(sd_id128_t app_id, sd_id128_t *ret);
#a #b #c #d "-" #e #f "-" #g #h "-" #i #j "-" #k #l #m #n #o #p
_sd_pure_ static __inline__ int sd_id128_equal(sd_id128_t a, sd_id128_t b) {
- return memcmp(&a, &b, 16) == 0;
+ return a.qwords[0] == b.qwords[0] && a.qwords[1] == b.qwords[1];
}
+int sd_id128_string_equal(const char *s, sd_id128_t id);
+
_sd_pure_ static __inline__ int sd_id128_is_null(sd_id128_t a) {
return a.qwords[0] == 0 && a.qwords[1] == 0;
}
diff --git a/src/libnm-systemd-core/src/systemd/sd-ipv4acd.h b/src/libnm-systemd-core/src/systemd/sd-ipv4acd.h
deleted file mode 100644
index 90d3f0a0d1..0000000000
--- a/src/libnm-systemd-core/src/systemd/sd-ipv4acd.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#ifndef foosdipv4acdfoo
-#define foosdipv4acdfoo
-
-/***
- Copyright © 2014 Axis Communications AB. 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 <http://www.gnu.org/licenses/>.
-***/
-
-#include <net/ethernet.h>
-#include <netinet/in.h>
-#include <stdbool.h>
-
-#include "sd-event.h"
-
-#include "_sd-common.h"
-
-_SD_BEGIN_DECLARATIONS;
-
-enum {
- SD_IPV4ACD_EVENT_STOP = 0,
- SD_IPV4ACD_EVENT_BIND = 1,
- SD_IPV4ACD_EVENT_CONFLICT = 2,
-};
-
-typedef struct sd_ipv4acd sd_ipv4acd;
-typedef void (*sd_ipv4acd_callback_t)(sd_ipv4acd *acd, int event, void *userdata);
-typedef int (*sd_ipv4acd_check_mac_callback_t)(sd_ipv4acd *acd, const struct ether_addr *mac, void *userdata);
-
-int sd_ipv4acd_detach_event(sd_ipv4acd *acd);
-int sd_ipv4acd_attach_event(sd_ipv4acd *acd, sd_event *event, int64_t priority);
-int sd_ipv4acd_get_address(sd_ipv4acd *acd, struct in_addr *address);
-int sd_ipv4acd_set_callback(sd_ipv4acd *acd, sd_ipv4acd_callback_t cb, void *userdata);
-int sd_ipv4acd_set_check_mac_callback(sd_ipv4acd *acd, sd_ipv4acd_check_mac_callback_t cb, void *userdata);
-int sd_ipv4acd_set_mac(sd_ipv4acd *acd, const struct ether_addr *addr);
-int sd_ipv4acd_set_ifindex(sd_ipv4acd *acd, int interface_index);
-int sd_ipv4acd_get_ifindex(sd_ipv4acd *acd);
-int sd_ipv4acd_set_ifname(sd_ipv4acd *acd, const char *interface_name);
-int sd_ipv4acd_get_ifname(sd_ipv4acd *acd, const char **ret);
-int sd_ipv4acd_set_address(sd_ipv4acd *acd, const struct in_addr *address);
-int sd_ipv4acd_is_running(sd_ipv4acd *acd);
-int sd_ipv4acd_start(sd_ipv4acd *acd, bool reset_conflicts);
-int sd_ipv4acd_stop(sd_ipv4acd *acd);
-sd_ipv4acd *sd_ipv4acd_ref(sd_ipv4acd *acd);
-sd_ipv4acd *sd_ipv4acd_unref(sd_ipv4acd *acd);
-int sd_ipv4acd_new(sd_ipv4acd **ret);
-
-_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_ipv4acd, sd_ipv4acd_unref);
-
-_SD_END_DECLARATIONS;
-
-#endif
diff --git a/src/libnm-systemd-core/src/systemd/sd-ipv4ll.h b/src/libnm-systemd-core/src/systemd/sd-ipv4ll.h
deleted file mode 100644
index ed014b53f2..0000000000
--- a/src/libnm-systemd-core/src/systemd/sd-ipv4ll.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#ifndef foosdipv4llfoo
-#define foosdipv4llfoo
-
-/***
- Copyright © 2014 Axis Communications AB. 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 <http://www.gnu.org/licenses/>.
-***/
-
-#include <net/ethernet.h>
-#include <netinet/in.h>
-
-#include "sd-event.h"
-
-#include "_sd-common.h"
-
-_SD_BEGIN_DECLARATIONS;
-
-enum {
- SD_IPV4LL_EVENT_STOP = 0,
- SD_IPV4LL_EVENT_BIND = 1,
- SD_IPV4LL_EVENT_CONFLICT = 2,
-};
-
-typedef struct sd_ipv4ll sd_ipv4ll;
-typedef void (*sd_ipv4ll_callback_t)(sd_ipv4ll *ll, int event, void *userdata);
-typedef int (*sd_ipv4ll_check_mac_callback_t)(sd_ipv4ll *ll, const struct ether_addr *mac, void *userdata);
-
-int sd_ipv4ll_detach_event(sd_ipv4ll *ll);
-int sd_ipv4ll_attach_event(sd_ipv4ll *ll, sd_event *event, int64_t priority);
-int sd_ipv4ll_get_address(sd_ipv4ll *ll, struct in_addr *address);
-int sd_ipv4ll_set_callback(sd_ipv4ll *ll, sd_ipv4ll_callback_t cb, void *userdata);
-int sd_ipv4ll_set_check_mac_callback(sd_ipv4ll *ll, sd_ipv4ll_check_mac_callback_t cb, void *userdata);
-int sd_ipv4ll_set_mac(sd_ipv4ll *ll, const struct ether_addr *addr);
-int sd_ipv4ll_set_ifindex(sd_ipv4ll *ll, int interface_index);
-int sd_ipv4ll_get_ifindex(sd_ipv4ll *ll);
-int sd_ipv4ll_set_ifname(sd_ipv4ll *ll, const char *interface_name);
-int sd_ipv4ll_get_ifname(sd_ipv4ll *ll, const char **ret);
-int sd_ipv4ll_set_address(sd_ipv4ll *ll, const struct in_addr *address);
-int sd_ipv4ll_set_address_seed(sd_ipv4ll *ll, uint64_t seed);
-int sd_ipv4ll_is_running(sd_ipv4ll *ll);
-int sd_ipv4ll_restart(sd_ipv4ll *ll);
-int sd_ipv4ll_start(sd_ipv4ll *ll);
-int sd_ipv4ll_stop(sd_ipv4ll *ll);
-sd_ipv4ll *sd_ipv4ll_ref(sd_ipv4ll *ll);
-sd_ipv4ll *sd_ipv4ll_unref(sd_ipv4ll *ll);
-int sd_ipv4ll_new(sd_ipv4ll **ret);
-
-_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_ipv4ll, sd_ipv4ll_unref);
-
-_SD_END_DECLARATIONS;
-
-#endif
diff --git a/src/libnm-systemd-core/src/systemd/sd-lldp-rx.h b/src/libnm-systemd-core/src/systemd/sd-lldp-rx.h
index bfeac14ce3..504d7f59c1 100644
--- a/src/libnm-systemd-core/src/systemd/sd-lldp-rx.h
+++ b/src/libnm-systemd-core/src/systemd/sd-lldp-rx.h
@@ -14,7 +14,7 @@
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 <http://www.gnu.org/licenses/>.
+ along with systemd; If not, see <https://www.gnu.org/licenses/>.
***/
#include <errno.h>
@@ -32,14 +32,14 @@ _SD_BEGIN_DECLARATIONS;
typedef struct sd_lldp_rx sd_lldp_rx;
typedef struct sd_lldp_neighbor sd_lldp_neighbor;
-typedef enum sd_lldp_rx_event_t {
+__extension__ typedef enum sd_lldp_rx_event_t {
SD_LLDP_RX_EVENT_ADDED,
SD_LLDP_RX_EVENT_REMOVED,
SD_LLDP_RX_EVENT_UPDATED,
SD_LLDP_RX_EVENT_REFRESHED,
_SD_LLDP_RX_EVENT_MAX,
_SD_LLDP_RX_EVENT_INVALID = -EINVAL,
- _SD_ENUM_FORCE_S64(LLDP_RX_EVENT),
+ _SD_ENUM_FORCE_S64(LLDP_RX_EVENT)
} sd_lldp_rx_event_t;
typedef void (*sd_lldp_rx_callback_t)(sd_lldp_rx *lldp_rx, sd_lldp_rx_event_t event, sd_lldp_neighbor *n, void *userdata);
diff --git a/src/libnm-systemd-core/src/systemd/sd-lldp.h b/src/libnm-systemd-core/src/systemd/sd-lldp.h
index c32d789476..4069c5b299 100644
--- a/src/libnm-systemd-core/src/systemd/sd-lldp.h
+++ b/src/libnm-systemd-core/src/systemd/sd-lldp.h
@@ -14,7 +14,7 @@
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 <http://www.gnu.org/licenses/>.
+ along with systemd; If not, see <https://www.gnu.org/licenses/>.
***/
#include <inttypes.h>
@@ -34,7 +34,7 @@ enum {
SD_LLDP_TYPE_SYSTEM_DESCRIPTION = 6,
SD_LLDP_TYPE_SYSTEM_CAPABILITIES = 7,
SD_LLDP_TYPE_MGMT_ADDRESS = 8,
- SD_LLDP_TYPE_PRIVATE = 127,
+ SD_LLDP_TYPE_PRIVATE = 127
};
/* IEEE 802.1AB-2009 Clause 8.5.2: Chassis subtypes */
@@ -46,7 +46,7 @@ enum {
SD_LLDP_CHASSIS_SUBTYPE_MAC_ADDRESS = 4,
SD_LLDP_CHASSIS_SUBTYPE_NETWORK_ADDRESS = 5,
SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_NAME = 6,
- SD_LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED = 7,
+ SD_LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED = 7
};
/* IEEE 802.1AB-2009 Clause 8.5.3: Port subtype */
@@ -58,7 +58,7 @@ enum {
SD_LLDP_PORT_SUBTYPE_NETWORK_ADDRESS = 4,
SD_LLDP_PORT_SUBTYPE_INTERFACE_NAME = 5,
SD_LLDP_PORT_SUBTYPE_AGENT_CIRCUIT_ID = 6,
- SD_LLDP_PORT_SUBTYPE_LOCALLY_ASSIGNED = 7,
+ SD_LLDP_PORT_SUBTYPE_LOCALLY_ASSIGNED = 7
};
/* IEEE 802.1AB-2009 Clause 8.5.8: System capabilities */
@@ -73,7 +73,7 @@ enum {
SD_LLDP_SYSTEM_CAPABILITIES_STATION = 1 << 7,
SD_LLDP_SYSTEM_CAPABILITIES_CVLAN = 1 << 8,
SD_LLDP_SYSTEM_CAPABILITIES_SVLAN = 1 << 9,
- SD_LLDP_SYSTEM_CAPABILITIES_TPMR = 1 << 10,
+ SD_LLDP_SYSTEM_CAPABILITIES_TPMR = 1 << 10
};
#define SD_LLDP_SYSTEM_CAPABILITIES_ALL UINT16_MAX
@@ -107,7 +107,7 @@ enum {
SD_LLDP_OUI_802_1_SUBTYPE_PROTOCOL_IDENTITY = 4,
SD_LLDP_OUI_802_1_SUBTYPE_VID_USAGE_DIGEST = 5,
SD_LLDP_OUI_802_1_SUBTYPE_MANAGEMENT_VID = 6,
- SD_LLDP_OUI_802_1_SUBTYPE_LINK_AGGREGATION = 7,
+ SD_LLDP_OUI_802_1_SUBTYPE_LINK_AGGREGATION = 7
};
/* IEEE 802.1AB-2009 Annex F */
@@ -115,7 +115,7 @@ enum {
SD_LLDP_OUI_802_3_SUBTYPE_MAC_PHY_CONFIG_STATUS = 1,
SD_LLDP_OUI_802_3_SUBTYPE_POWER_VIA_MDI = 2,
SD_LLDP_OUI_802_3_SUBTYPE_LINK_AGGREGATION = 3,
- SD_LLDP_OUI_802_3_SUBTYPE_MAXIMUM_FRAME_SIZE = 4,
+ SD_LLDP_OUI_802_3_SUBTYPE_MAXIMUM_FRAME_SIZE = 4
};
_SD_END_DECLARATIONS;
diff --git a/src/libnm-systemd-core/src/systemd/sd-ndisc.h b/src/libnm-systemd-core/src/systemd/sd-ndisc.h
index ab9ff55ddb..ee309a4253 100644
--- a/src/libnm-systemd-core/src/systemd/sd-ndisc.h
+++ b/src/libnm-systemd-core/src/systemd/sd-ndisc.h
@@ -16,7 +16,7 @@
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 <http://www.gnu.org/licenses/>.
+ along with systemd; If not, see <https://www.gnu.org/licenses/>.
***/
#include <errno.h>
@@ -42,25 +42,25 @@ enum {
SD_NDISC_OPTION_RDNSS = 25,
SD_NDISC_OPTION_FLAGS_EXTENSION = 26,
SD_NDISC_OPTION_DNSSL = 31,
- SD_NDISC_OPTION_CAPTIVE_PORTAL = 37,
+ SD_NDISC_OPTION_CAPTIVE_PORTAL = 37
};
/* Route preference, RFC 4191, Section 2.1 */
enum {
SD_NDISC_PREFERENCE_LOW = 3U,
SD_NDISC_PREFERENCE_MEDIUM = 0U,
- SD_NDISC_PREFERENCE_HIGH = 1U,
+ SD_NDISC_PREFERENCE_HIGH = 1U
};
typedef struct sd_ndisc sd_ndisc;
typedef struct sd_ndisc_router sd_ndisc_router;
-typedef enum sd_ndisc_event_t {
+__extension__ typedef enum sd_ndisc_event_t {
SD_NDISC_EVENT_TIMEOUT,
SD_NDISC_EVENT_ROUTER,
_SD_NDISC_EVENT_MAX,
_SD_NDISC_EVENT_INVALID = -EINVAL,
- _SD_ENUM_FORCE_S64(NDISC_EVENT),
+ _SD_ENUM_FORCE_S64(NDISC_EVENT)
} sd_ndisc_event_t;
typedef void (*sd_ndisc_callback_t)(sd_ndisc *nd, sd_ndisc_event_t event, sd_ndisc_router *rt, void *userdata);
@@ -82,7 +82,6 @@ int sd_ndisc_set_ifname(sd_ndisc *nd, const char *interface_name);
int sd_ndisc_get_ifname(sd_ndisc *nd, const char **ret);
int sd_ndisc_set_mac(sd_ndisc *nd, const struct ether_addr *mac_addr);
-int sd_ndisc_router_from_raw(sd_ndisc_router **ret, const void *raw, size_t raw_size);
sd_ndisc_router *sd_ndisc_router_ref(sd_ndisc_router *rt);
sd_ndisc_router *sd_ndisc_router_unref(sd_ndisc_router *rt);