mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager
synced 2024-10-06 16:21:50 +00:00
systemd: merge branch systemd into master
This commit is contained in:
commit
787a18c467
|
@ -1701,6 +1701,7 @@ src_libnm_systemd_core_la_SOURCES = \
|
|||
src/systemd/nm-sd.h \
|
||||
src/systemd/sd-adapt-core/condition.h \
|
||||
src/systemd/sd-adapt-core/conf-parser.h \
|
||||
src/systemd/sd-adapt-core/device-util.h \
|
||||
src/systemd/sd-adapt-core/khash.h \
|
||||
src/systemd/sd-adapt-core/nm-sd-adapt-core.c \
|
||||
src/systemd/sd-adapt-core/nm-sd-adapt-core.h \
|
||||
|
|
|
@ -215,7 +215,6 @@ int write_string_filef(
|
|||
|
||||
int read_one_line_file(const char *fn, char **line) {
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
int r;
|
||||
|
||||
assert(fn);
|
||||
assert(line);
|
||||
|
@ -226,8 +225,7 @@ int read_one_line_file(const char *fn, char **line) {
|
|||
|
||||
(void) __fsetlocking(f, FSETLOCKING_BYCALLER);
|
||||
|
||||
r = read_line(f, LONG_LINE_MAX, line);
|
||||
return r < 0 ? r : 0;
|
||||
return read_line(f, LONG_LINE_MAX, line);
|
||||
}
|
||||
|
||||
int verify_file(const char *fn, const char *blob, bool accept_extra_nl) {
|
||||
|
|
|
@ -1518,8 +1518,11 @@ void *internal_hashmap_first_key_and_value(HashmapBase *h, bool remove, void **r
|
|||
unsigned idx;
|
||||
|
||||
idx = find_first_entry(h);
|
||||
if (idx == IDX_NIL)
|
||||
if (idx == IDX_NIL) {
|
||||
if (ret_key)
|
||||
*ret_key = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
e = bucket_at(h, idx);
|
||||
key = (void*) e->key;
|
||||
|
|
|
@ -606,10 +606,11 @@ static int base64_append_width(
|
|||
lines = DIV_ROUND_UP(len, width);
|
||||
|
||||
slen = strlen_ptr(sep);
|
||||
if (lines > (SSIZE_MAX - plen - 1 - slen) / (indent + width + 1))
|
||||
if (plen >= SSIZE_MAX - 1 - slen ||
|
||||
lines > (SSIZE_MAX - plen - 1 - slen) / (indent + width + 1))
|
||||
return -ENOMEM;
|
||||
|
||||
t = realloc(*prefix, plen + 1 + slen + (indent + width + 1) * lines);
|
||||
t = realloc(*prefix, (ssize_t) plen + 1 + slen + (indent + width + 1) * lines);
|
||||
if (!t)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -644,7 +645,7 @@ int base64_append(
|
|||
return base64_append_width(prefix, plen, "\n", indent, p, l, width - indent - 1);
|
||||
else
|
||||
/* leave plen on the left, keep last column free */
|
||||
return base64_append_width(prefix, plen, NULL, plen, p, l, width - plen - 1);
|
||||
return base64_append_width(prefix, plen, " ", plen, p, l, width - plen - 1);
|
||||
}
|
||||
#endif /* NM_IGNORED */
|
||||
|
||||
|
|
|
@ -1036,6 +1036,15 @@ int parse_sec_fix_0(const char *t, usec_t *ret) {
|
|||
return r;
|
||||
}
|
||||
|
||||
int parse_sec_def_infinity(const char *t, usec_t *ret) {
|
||||
t += strspn(t, WHITESPACE);
|
||||
if (isempty(t)) {
|
||||
*ret = USEC_INFINITY;
|
||||
return 0;
|
||||
}
|
||||
return parse_sec(t, ret);
|
||||
}
|
||||
|
||||
static const char* extract_nsec_multiplier(const char *p, nsec_t *multiplier) {
|
||||
static const struct {
|
||||
const char *suffix;
|
||||
|
|
|
@ -112,6 +112,7 @@ int parse_timestamp(const char *t, usec_t *usec);
|
|||
|
||||
int parse_sec(const char *t, usec_t *usec);
|
||||
int parse_sec_fix_0(const char *t, usec_t *usec);
|
||||
int parse_sec_def_infinity(const char *t, usec_t *usec);
|
||||
int parse_time(const char *t, usec_t *usec, usec_t default_unit);
|
||||
int parse_nsec(const char *t, nsec_t *nsec);
|
||||
|
||||
|
|
|
@ -174,12 +174,21 @@ static inline void *mempset(void *s, int c, size_t n) {
|
|||
}
|
||||
|
||||
static inline void _reset_errno_(int *saved_errno) {
|
||||
if (*saved_errno < 0) /* Invalidated by UNPROTECT_ERRNO? */
|
||||
return;
|
||||
|
||||
errno = *saved_errno;
|
||||
}
|
||||
|
||||
#define PROTECT_ERRNO \
|
||||
_cleanup_(_reset_errno_) _unused_ int _saved_errno_ = errno
|
||||
|
||||
#define UNPROTECT_ERRNO \
|
||||
do { \
|
||||
errno = _saved_errno_; \
|
||||
_saved_errno_ = -1; \
|
||||
} while (false)
|
||||
|
||||
static inline int negative_errno(void) {
|
||||
/* This helper should be used to shut up gcc if you know 'errno' is
|
||||
* negative. Instead of "return -errno;", use "return negative_errno();"
|
||||
|
|
3
src/systemd/sd-adapt-core/device-util.h
Normal file
3
src/systemd/sd-adapt-core/device-util.h
Normal file
|
@ -0,0 +1,3 @@
|
|||
#pragma once
|
||||
|
||||
/* dummy header */
|
|
@ -51,12 +51,16 @@ static int _bind_raw_socket(int ifindex, union sockaddr_union *link,
|
|||
BPF_STMT(BPF_LD + BPF_B + BPF_ABS, offsetof(DHCPPacket, dhcp.htype)), /* A <- DHCP header type */
|
||||
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arp_type, 1, 0), /* header type == arp_type ? */
|
||||
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
|
||||
BPF_STMT(BPF_LD + BPF_B + BPF_ABS, offsetof(DHCPPacket, dhcp.hlen)), /* A <- MAC address length */
|
||||
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, dhcp_hlen, 1, 0), /* address length == dhcp_hlen ? */
|
||||
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
|
||||
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(DHCPPacket, dhcp.xid)), /* A <- client identifier */
|
||||
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, xid, 1, 0), /* client identifier == xid ? */
|
||||
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
|
||||
BPF_STMT(BPF_LD + BPF_B + BPF_ABS, offsetof(DHCPPacket, dhcp.hlen)), /* A <- MAC address length */
|
||||
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, dhcp_hlen, 1, 0), /* address length == dhcp_hlen ? */
|
||||
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
|
||||
|
||||
/* We only support MAC address length to be either 0 or 6 (ETH_ALEN). Optionally
|
||||
* compare chaddr for ETH_ALEN bytes. */
|
||||
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETH_ALEN, 0, 12), /* A (the MAC address length) == ETH_ALEN ? */
|
||||
BPF_STMT(BPF_LD + BPF_IMM, unaligned_read_be32(ð_mac->ether_addr_octet[0])), /* A <- 4 bytes of client's MAC */
|
||||
BPF_STMT(BPF_MISC + BPF_TAX, 0), /* X <- A */
|
||||
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(DHCPPacket, dhcp.chaddr)), /* A <- 4 bytes of MAC from dhcp.chaddr */
|
||||
|
@ -69,6 +73,7 @@ static int _bind_raw_socket(int ifindex, union sockaddr_union *link,
|
|||
BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0), /* A xor X */
|
||||
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 1, 0), /* A == 0 ? */
|
||||
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
|
||||
|
||||
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(DHCPPacket, dhcp.magic)), /* A <- DHCP magic cookie */
|
||||
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, DHCP_MAGIC_COOKIE, 1, 0), /* cookie == DHCP magic cookie ? */
|
||||
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include "alloc-util.h"
|
||||
#include "condition.h"
|
||||
#include "conf-parser.h"
|
||||
#include "device-util.h"
|
||||
#include "dhcp-lease-internal.h"
|
||||
#include "ether-addr-util.h"
|
||||
#include "hexdecoct.h"
|
||||
|
@ -43,31 +44,35 @@ const char *net_get_name(sd_device *device) {
|
|||
|
||||
int net_get_unique_predictable_data(sd_device *device, uint64_t *result) {
|
||||
size_t l, sz = 0;
|
||||
const char *name = NULL;
|
||||
const char *name;
|
||||
int r;
|
||||
uint8_t *v;
|
||||
|
||||
assert(device);
|
||||
|
||||
/* net_get_name() will return one of the device names based on stable information about the
|
||||
* device. If this is not available, we fall back to using the device name. */
|
||||
name = net_get_name(device);
|
||||
if (!name)
|
||||
return -ENOENT;
|
||||
(void) sd_device_get_sysname(device, &name);
|
||||
if (!name)
|
||||
return log_device_debug_errno(device, SYNTHETIC_ERRNO(ENODATA),
|
||||
"No stable identifying information found");
|
||||
|
||||
log_device_debug(device, "Using \"%s\" as stable identifying information", name);
|
||||
l = strlen(name);
|
||||
sz = sizeof(sd_id128_t) + l;
|
||||
v = newa(uint8_t, sz);
|
||||
|
||||
/* fetch some persistent data unique to this machine */
|
||||
/* Fetch some persistent data unique to this machine */
|
||||
r = sd_id128_get_machine((sd_id128_t*) v);
|
||||
if (r < 0)
|
||||
return r;
|
||||
memcpy(v + sizeof(sd_id128_t), name, l);
|
||||
|
||||
/* Let's hash the machine ID plus the device name. We
|
||||
* use a fixed, but originally randomly created hash
|
||||
* key here. */
|
||||
/* Let's hash the machine ID plus the device name. We use
|
||||
* a fixed, but originally randomly created hash key here. */
|
||||
*result = htole64(siphash24(v, sz, HASH_KEY.bytes));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -105,7 +110,6 @@ bool net_match_config(Set *match_mac,
|
|||
Condition *match_arch,
|
||||
const struct ether_addr *dev_mac,
|
||||
const char *dev_path,
|
||||
const char *dev_parent_driver,
|
||||
const char *dev_driver,
|
||||
const char *dev_type,
|
||||
const char *dev_name) {
|
||||
|
|
|
@ -8,7 +8,9 @@
|
|||
|
||||
#include "condition.h"
|
||||
#include "conf-parser.h"
|
||||
#include "def.h"
|
||||
#include "set.h"
|
||||
#include "strv.h"
|
||||
|
||||
#define LINK_BRIDGE_PORT_PRIORITY_INVALID 128
|
||||
#define LINK_BRIDGE_PORT_PRIORITY_MAX 63
|
||||
|
@ -25,7 +27,6 @@ bool net_match_config(Set *match_mac,
|
|||
Condition *match_arch,
|
||||
const struct ether_addr *dev_mac,
|
||||
const char *dev_path,
|
||||
const char *dev_parent_driver,
|
||||
const char *dev_driver,
|
||||
const char *dev_type,
|
||||
const char *dev_name);
|
||||
|
@ -60,3 +61,5 @@ int deserialize_dhcp_routes(struct sd_dhcp_route **ret, size_t *ret_size, size_t
|
|||
|
||||
/* It is not necessary to add deserialize_dhcp_option(). Use unhexmem() instead. */
|
||||
int serialize_dhcp_option(FILE *f, const char *key, const void *data, size_t size);
|
||||
|
||||
#define NETWORK_DIRS ((const char* const*) CONF_PATHS_STRV("systemd/network"))
|
||||
|
|
|
@ -1680,8 +1680,7 @@ static int client_receive_message_udp(
|
|||
|
||||
sd_dhcp_client *client = userdata;
|
||||
_cleanup_free_ DHCPMessage *message = NULL;
|
||||
const struct ether_addr zero_mac = {};
|
||||
const struct ether_addr *expected_chaddr = NULL;
|
||||
const uint8_t *expected_chaddr = NULL;
|
||||
uint8_t expected_hlen = 0;
|
||||
ssize_t len, buflen;
|
||||
|
||||
|
@ -1689,6 +1688,12 @@ static int client_receive_message_udp(
|
|||
assert(client);
|
||||
|
||||
buflen = next_datagram_size_fd(fd);
|
||||
if (buflen == -ENETDOWN) {
|
||||
/* the link is down. Don't return an error or the I/O event
|
||||
source will be disconnected and we won't be able to receive
|
||||
packets again when the link comes back. */
|
||||
return 0;
|
||||
}
|
||||
if (buflen < 0)
|
||||
return buflen;
|
||||
|
||||
|
@ -1698,7 +1703,8 @@ static int client_receive_message_udp(
|
|||
|
||||
len = recv(fd, message, buflen, 0);
|
||||
if (len < 0) {
|
||||
if (IN_SET(errno, EAGAIN, EINTR))
|
||||
/* see comment above for why we shouldn't error out on ENETDOWN. */
|
||||
if (IN_SET(errno, EAGAIN, EINTR, ENETDOWN))
|
||||
return 0;
|
||||
|
||||
return log_dhcp_client_errno(client, errno,
|
||||
|
@ -1726,11 +1732,7 @@ static int client_receive_message_udp(
|
|||
|
||||
if (client->arp_type == ARPHRD_ETHER) {
|
||||
expected_hlen = ETH_ALEN;
|
||||
expected_chaddr = (const struct ether_addr *) &client->mac_addr;
|
||||
} else {
|
||||
/* Non-Ethernet links expect zero chaddr */
|
||||
expected_hlen = 0;
|
||||
expected_chaddr = &zero_mac;
|
||||
expected_chaddr = &client->mac_addr[0];
|
||||
}
|
||||
|
||||
if (message->hlen != expected_hlen) {
|
||||
|
@ -1738,7 +1740,7 @@ static int client_receive_message_udp(
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (memcmp(&message->chaddr[0], expected_chaddr, ETH_ALEN)) {
|
||||
if (expected_hlen > 0 && memcmp(&message->chaddr[0], expected_chaddr, expected_hlen)) {
|
||||
log_dhcp_client(client, "Received chaddr does not match expected: ignoring");
|
||||
return 0;
|
||||
}
|
||||
|
@ -1780,6 +1782,8 @@ static int client_receive_message_raw(
|
|||
assert(client);
|
||||
|
||||
buflen = next_datagram_size_fd(fd);
|
||||
if (buflen == -ENETDOWN)
|
||||
return 0;
|
||||
if (buflen < 0)
|
||||
return buflen;
|
||||
|
||||
|
@ -1791,7 +1795,7 @@ static int client_receive_message_raw(
|
|||
|
||||
len = recvmsg(fd, &msg, 0);
|
||||
if (len < 0) {
|
||||
if (IN_SET(errno, EAGAIN, EINTR))
|
||||
if (IN_SET(errno, EAGAIN, EINTR, ENETDOWN))
|
||||
return 0;
|
||||
|
||||
return log_dhcp_client_errno(client, errno,
|
||||
|
|
|
@ -1117,6 +1117,12 @@ static int client_receive_message(
|
|||
assert(client->event);
|
||||
|
||||
buflen = next_datagram_size_fd(fd);
|
||||
if (buflen == -ENETDOWN) {
|
||||
/* the link is down. Don't return an error or the I/O event
|
||||
source will be disconnected and we won't be able to receive
|
||||
packets again when the link comes back. */
|
||||
return 0;
|
||||
}
|
||||
if (buflen < 0)
|
||||
return buflen;
|
||||
|
||||
|
@ -1126,7 +1132,8 @@ static int client_receive_message(
|
|||
|
||||
len = recv(fd, message, buflen, 0);
|
||||
if (len < 0) {
|
||||
if (IN_SET(errno, EAGAIN, EINTR))
|
||||
/* see comment above for why we shouldn't error out on ENETDOWN. */
|
||||
if (IN_SET(errno, EAGAIN, EINTR, ENETDOWN))
|
||||
return 0;
|
||||
|
||||
return log_dhcp6_client_errno(client, errno, "Could not receive message from UDP socket: %m");
|
||||
|
|
Loading…
Reference in a new issue