mirror of
https://github.com/systemd/systemd
synced 2026-04-07 15:44:49 +02:00
Compare commits
No commits in common. "7547c3e06abfe1ddebf0457625f686e3dd55b91c" and "d8e38d4aaac23cb27cc7e0f410449c3a6034db4f" have entirely different histories.
7547c3e06a
...
d8e38d4aaa
@ -839,10 +839,3 @@ Tools using the Varlink protocol (such as `varlinkctl`) or sd-bus (such as
|
|||||||
|
|
||||||
* `$SYSTEMD_ETC_VCONSOLE_CONF` - override the path to the virtual console
|
* `$SYSTEMD_ETC_VCONSOLE_CONF` - override the path to the virtual console
|
||||||
configuration file. The default is `/etc/vconsole.conf`.
|
configuration file. The default is `/etc/vconsole.conf`.
|
||||||
|
|
||||||
`systemd-modules-load`:
|
|
||||||
|
|
||||||
* `$SYSTEMD_MODULES_LOAD_NUM_THREADS` - takes a number, which controls the
|
|
||||||
overall number of threads used to load modules by `systemd-modules-load`.
|
|
||||||
If unset, the default number of threads is equal to the number of online CPUs,
|
|
||||||
with a maximum of 16. If set to `0`, multi-threaded loading is disabled.
|
|
||||||
|
|||||||
@ -13,10 +13,6 @@
|
|||||||
# Not bash?
|
# Not bash?
|
||||||
[ -n "${BASH_VERSION:-}" ] || return 0
|
[ -n "${BASH_VERSION:-}" ] || return 0
|
||||||
|
|
||||||
# If we're on a "dumb" terminal, do not install the prompt.
|
|
||||||
# Treat missing $TERM same as "dumb".
|
|
||||||
[ "${TERM:-dumb}" = "dumb" ] && return 0
|
|
||||||
|
|
||||||
__systemd_osc_context_escape() {
|
__systemd_osc_context_escape() {
|
||||||
# Escape according to the OSC 3008 spec. Since this requires shelling out
|
# Escape according to the OSC 3008 spec. Since this requires shelling out
|
||||||
# to 'sed' we'll only do it where it's strictly necessary, and skip it when
|
# to 'sed' we'll only do it where it's strictly necessary, and skip it when
|
||||||
@ -60,12 +56,8 @@ __systemd_osc_context_precmdline() {
|
|||||||
read -r systemd_osc_context_cmd_id </proc/sys/kernel/random/uuid
|
read -r systemd_osc_context_cmd_id </proc/sys/kernel/random/uuid
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ -n "${BASH_VERSION:-}" ]; then
|
if [[ -n "${BASH_VERSION:-}" ]] && [[ "${TERM:-}" != "dumb" ]]; then
|
||||||
# Legacy bashrc will assign PROMPT_COMMAND=, which is equivalent to assigning
|
# Whenever a new prompt is shown close the previous command, and prepare new command
|
||||||
# index 0 in the array. Leave an empty spot to handle this gracefully.
|
|
||||||
[ -n "$(declare -p PROMPT_COMMAND 2>/dev/null)" ] || PROMPT_COMMAND+=('')
|
|
||||||
|
|
||||||
# Whenever a new prompt is shown, close the previous command, and prepare new command
|
|
||||||
PROMPT_COMMAND+=(__systemd_osc_context_precmdline)
|
PROMPT_COMMAND+=(__systemd_osc_context_precmdline)
|
||||||
|
|
||||||
# PS0 is shown right after a prompt completed, but before the command is executed
|
# PS0 is shown right after a prompt completed, but before the command is executed
|
||||||
|
|||||||
@ -68,7 +68,7 @@ static int log_autofs_mount_point(int fd, const char *path, ChaseFlags flags) {
|
|||||||
(void) fd_get_path(fd, &n1);
|
(void) fd_get_path(fd, &n1);
|
||||||
|
|
||||||
return log_warning_errno(SYNTHETIC_ERRNO(EREMOTE),
|
return log_warning_errno(SYNTHETIC_ERRNO(EREMOTE),
|
||||||
"Detected autofs mount point '%s' during canonicalization of '%s'.",
|
"Detected autofs mount point %s during canonicalization of %s.",
|
||||||
strna(n1), path);
|
strna(n1), path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,7 +83,7 @@ static int log_prohibited_symlink(int fd, ChaseFlags flags) {
|
|||||||
(void) fd_get_path(fd, &n1);
|
(void) fd_get_path(fd, &n1);
|
||||||
|
|
||||||
return log_warning_errno(SYNTHETIC_ERRNO(EREMCHG),
|
return log_warning_errno(SYNTHETIC_ERRNO(EREMCHG),
|
||||||
"Detected symlink where no symlink is allowed at '%s', refusing.",
|
"Detected symlink where not symlink is allowed at %s, refusing.",
|
||||||
strna(n1));
|
strna(n1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2009,7 +2009,6 @@ static int build_environment(
|
|||||||
|
|
||||||
_cleanup_strv_free_ char **e = NULL;
|
_cleanup_strv_free_ char **e = NULL;
|
||||||
size_t n = 0;
|
size_t n = 0;
|
||||||
pid_t exec_pid;
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(c);
|
assert(c);
|
||||||
@ -2017,12 +2016,10 @@ static int build_environment(
|
|||||||
assert(cgroup_context);
|
assert(cgroup_context);
|
||||||
assert(ret);
|
assert(ret);
|
||||||
|
|
||||||
exec_pid = needs_sandboxing && exec_needs_pid_namespace(c, p) ? 1 : getpid_cached();
|
|
||||||
|
|
||||||
if (p->n_socket_fds + p->n_stashed_fds > 0) {
|
if (p->n_socket_fds + p->n_stashed_fds > 0) {
|
||||||
_cleanup_free_ char *joined = NULL;
|
_cleanup_free_ char *joined = NULL;
|
||||||
|
|
||||||
r = strv_extendf_with_size(&e, &n, "LISTEN_PID="PID_FMT, exec_pid);
|
r = strv_extendf_with_size(&e, &n, "LISTEN_PID="PID_FMT, getpid_cached());
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
@ -2047,7 +2044,7 @@ static int build_environment(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((p->flags & EXEC_SET_WATCHDOG) && p->watchdog_usec > 0) {
|
if ((p->flags & EXEC_SET_WATCHDOG) && p->watchdog_usec > 0) {
|
||||||
r = strv_extendf_with_size(&e, &n, "WATCHDOG_PID="PID_FMT, exec_pid);
|
r = strv_extendf_with_size(&e, &n, "WATCHDOG_PID="PID_FMT, getpid_cached());
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
@ -2177,7 +2174,7 @@ static int build_environment(
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = strv_extendf_with_size(&e, &n, "SYSTEMD_EXEC_PID=" PID_FMT, exec_pid);
|
r = strv_extendf_with_size(&e, &n, "SYSTEMD_EXEC_PID=" PID_FMT, getpid_cached());
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
|||||||
@ -1810,9 +1810,7 @@ static int service_spawn_internal(
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MANAGER_IS_USER(UNIT(s)->manager) &&
|
if (MANAGER_IS_USER(UNIT(s)->manager)) {
|
||||||
!exec_needs_pid_namespace(&s->exec_context, /* params = */ NULL)) {
|
|
||||||
|
|
||||||
if (asprintf(our_env + n_env++, "MANAGERPID="PID_FMT, getpid_cached()) < 0)
|
if (asprintf(our_env + n_env++, "MANAGERPID="PID_FMT, getpid_cached()) < 0)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|||||||
@ -1580,27 +1580,31 @@ static int socket_address_listen_in_cgroup(
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_unit_error_errno(UNIT(s), r, "Failed to acquire runtime: %m");
|
return log_unit_error_errno(UNIT(s), r, "Failed to acquire runtime: %m");
|
||||||
|
|
||||||
if (s->exec_runtime && s->exec_runtime->shared) {
|
if (s->exec_context.user_namespace_path &&
|
||||||
if (s->exec_context.user_namespace_path &&
|
s->exec_runtime &&
|
||||||
s->exec_runtime->shared->userns_storage_socket[0] >= 0) {
|
s->exec_runtime->shared &&
|
||||||
r = open_shareable_ns_path(s->exec_runtime->shared->userns_storage_socket, s->exec_context.user_namespace_path, CLONE_NEWUSER);
|
s->exec_runtime->shared->userns_storage_socket[0] >= 0) {
|
||||||
if (r < 0)
|
r = open_shareable_ns_path(s->exec_runtime->shared->userns_storage_socket, s->exec_context.user_namespace_path, CLONE_NEWUSER);
|
||||||
return log_unit_error_errno(UNIT(s), r, "Failed to open user namespace path %s: %m", s->exec_context.user_namespace_path);
|
if (r < 0)
|
||||||
}
|
return log_unit_error_errno(UNIT(s), r, "Failed to open user namespace path %s: %m", s->exec_context.user_namespace_path);
|
||||||
|
}
|
||||||
|
|
||||||
if (s->exec_context.network_namespace_path &&
|
if (s->exec_context.network_namespace_path &&
|
||||||
s->exec_runtime->shared->netns_storage_socket[0] >= 0) {
|
s->exec_runtime &&
|
||||||
r = open_shareable_ns_path(s->exec_runtime->shared->netns_storage_socket, s->exec_context.network_namespace_path, CLONE_NEWNET);
|
s->exec_runtime->shared &&
|
||||||
if (r < 0)
|
s->exec_runtime->shared->netns_storage_socket[0] >= 0) {
|
||||||
return log_unit_error_errno(UNIT(s), r, "Failed to open network namespace path %s: %m", s->exec_context.network_namespace_path);
|
r = open_shareable_ns_path(s->exec_runtime->shared->netns_storage_socket, s->exec_context.network_namespace_path, CLONE_NEWNET);
|
||||||
}
|
if (r < 0)
|
||||||
|
return log_unit_error_errno(UNIT(s), r, "Failed to open network namespace path %s: %m", s->exec_context.network_namespace_path);
|
||||||
|
}
|
||||||
|
|
||||||
if (s->exec_context.ipc_namespace_path &&
|
if (s->exec_context.ipc_namespace_path &&
|
||||||
s->exec_runtime->shared->ipcns_storage_socket[0] >= 0) {
|
s->exec_runtime &&
|
||||||
r = open_shareable_ns_path(s->exec_runtime->shared->ipcns_storage_socket, s->exec_context.ipc_namespace_path, CLONE_NEWIPC);
|
s->exec_runtime->shared &&
|
||||||
if (r < 0)
|
s->exec_runtime->shared->ipcns_storage_socket[0] >= 0) {
|
||||||
return log_unit_error_errno(UNIT(s), r, "Failed to open IPC namespace path %s: %m", s->exec_context.ipc_namespace_path);
|
r = open_shareable_ns_path(s->exec_runtime->shared->ipcns_storage_socket, s->exec_context.ipc_namespace_path, CLONE_NEWIPC);
|
||||||
}
|
if (r < 0)
|
||||||
|
return log_unit_error_errno(UNIT(s), r, "Failed to open IPC namespace path %s: %m", s->exec_context.ipc_namespace_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, pair) < 0)
|
if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, pair) < 0)
|
||||||
|
|||||||
@ -1,14 +1,9 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <limits.h>
|
#include <sys/stat.h>
|
||||||
#include <pthread.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "alloc-util.h"
|
#include "alloc-util.h"
|
||||||
#include "assert.h"
|
|
||||||
#include "build.h"
|
#include "build.h"
|
||||||
#include "conf-files.h"
|
#include "conf-files.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
@ -16,61 +11,18 @@
|
|||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "macro.h"
|
|
||||||
#include "main-func.h"
|
#include "main-func.h"
|
||||||
#include "module-util.h"
|
#include "module-util.h"
|
||||||
#include "ordered-set.h"
|
|
||||||
#include "parse-util.h"
|
|
||||||
#include "pretty-print.h"
|
#include "pretty-print.h"
|
||||||
#include "proc-cmdline.h"
|
#include "proc-cmdline.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
|
||||||
#define MODULE_NAME_MAX_LEN (4096UL)
|
|
||||||
|
|
||||||
static char **arg_proc_cmdline_modules = NULL;
|
static char **arg_proc_cmdline_modules = NULL;
|
||||||
static const char conf_file_dirs[] = CONF_PATHS_NULSTR("modules-load.d");
|
static const char conf_file_dirs[] = CONF_PATHS_NULSTR("modules-load.d");
|
||||||
|
|
||||||
STATIC_DESTRUCTOR_REGISTER(arg_proc_cmdline_modules, strv_freep);
|
STATIC_DESTRUCTOR_REGISTER(arg_proc_cmdline_modules, strv_freep);
|
||||||
|
|
||||||
static int modules_list_append_suffix(OrderedSet **module_set, char *modp) {
|
|
||||||
/* take possession of string no matter what */
|
|
||||||
_cleanup_free_ char *mod = modp;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
assert(module_set);
|
|
||||||
assert(mod);
|
|
||||||
|
|
||||||
if (strlen(mod) > MODULE_NAME_MAX_LEN)
|
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Module name max length exceeded (%lu): %s",
|
|
||||||
MODULE_NAME_MAX_LEN, mod);
|
|
||||||
|
|
||||||
/* kmod will do it anyway later, so replace now dashes with
|
|
||||||
underscores to detect duplications due to different spelling. */
|
|
||||||
string_replace_char(mod, '-', '_');
|
|
||||||
|
|
||||||
r = ordered_set_ensure_put(module_set, &string_hash_ops_free, mod);
|
|
||||||
if (r == -EEXIST)
|
|
||||||
return 0;
|
|
||||||
if (r < 0)
|
|
||||||
return log_error_errno(r, "Failed to enqueue module '%s': %m", mod);
|
|
||||||
|
|
||||||
TAKE_PTR(mod);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int modules_list_append_dup(OrderedSet **module_set, const char *module) {
|
|
||||||
_cleanup_free_ char *m = NULL;
|
|
||||||
|
|
||||||
assert(module);
|
|
||||||
|
|
||||||
if (strdup_to(&m, module) < 0)
|
|
||||||
return log_oom();
|
|
||||||
|
|
||||||
return modules_list_append_suffix(module_set, TAKE_PTR(m));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
|
static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
@ -87,19 +39,31 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int apply_file(FILE *f, const char *filename, OrderedSet **module_set) {
|
static int apply_file(struct kmod_ctx *ctx, const char *path, bool ignore_enoent) {
|
||||||
int ret = 0, r;
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
|
_cleanup_free_ char *pp = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(f);
|
assert(ctx);
|
||||||
|
assert(path);
|
||||||
|
|
||||||
log_debug("apply: %s", filename);
|
r = search_and_fopen_nulstr(path, "re", NULL, conf_file_dirs, &f, &pp);
|
||||||
|
if (r < 0) {
|
||||||
|
if (ignore_enoent && r == -ENOENT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return log_error_errno(r, "Failed to open %s: %m", path);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug("apply: %s", pp);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
_cleanup_free_ char *line = NULL;
|
_cleanup_free_ char *line = NULL;
|
||||||
|
int k;
|
||||||
|
|
||||||
r = read_stripped_line(f, LONG_LINE_MAX, &line);
|
k = read_stripped_line(f, LONG_LINE_MAX, &line);
|
||||||
if (r < 0)
|
if (k < 0)
|
||||||
return log_error_errno(r, "Failed to read file '%s': %m", filename);
|
return log_error_errno(k, "Failed to read file '%s': %m", pp);
|
||||||
if (r == 0)
|
if (k == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (isempty(line))
|
if (isempty(line))
|
||||||
@ -107,232 +71,21 @@ static int apply_file(FILE *f, const char *filename, OrderedSet **module_set) {
|
|||||||
if (strchr(COMMENTS, *line))
|
if (strchr(COMMENTS, *line))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
RET_GATHER(ret, modules_list_append_suffix(module_set, TAKE_PTR(line)));
|
k = module_load_and_warn(ctx, line, true);
|
||||||
}
|
if (k == -ENOENT)
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int apply_file_from_path(const char *path, OrderedSet **module_set) {
|
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
|
||||||
_cleanup_free_ char *pp = NULL;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
assert(path);
|
|
||||||
|
|
||||||
r = search_and_fopen_nulstr(path, "re", NULL, conf_file_dirs, &f, &pp);
|
|
||||||
if (r < 0)
|
|
||||||
return log_error_errno(r, "Failed to open %s: %m", path);
|
|
||||||
|
|
||||||
return apply_file(f, pp, module_set);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int apply_conf_file(ConfFile *c, OrderedSet **module_set) {
|
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
|
||||||
|
|
||||||
f = fopen(FORMAT_PROC_FD_PATH(c->fd), "re");
|
|
||||||
if (!f) {
|
|
||||||
if (errno == ENOENT)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return log_error_errno(errno, "Failed to open %s: %m", c->original_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply_file(f, c->original_path, module_set);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int do_direct_probe(OrderedSet *module_set) {
|
|
||||||
_cleanup_(kmod_unrefp) struct kmod_ctx *ctx = NULL;
|
|
||||||
char *module;
|
|
||||||
int ret = 0, r;
|
|
||||||
|
|
||||||
r = module_setup_context(&ctx);
|
|
||||||
if (r < 0)
|
|
||||||
return log_error_errno(r, "Failed to initialize libkmod context: %m");
|
|
||||||
|
|
||||||
ORDERED_SET_FOREACH(module, module_set) {
|
|
||||||
r = module_load_and_warn(ctx, module, /* verbose = */ true);
|
|
||||||
if (r != -ENOENT)
|
|
||||||
RET_GATHER(ret, r);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int enqueue_module_to_load(int sock, const char *module) {
|
|
||||||
ssize_t bytes;
|
|
||||||
|
|
||||||
assert(sock >= 0);
|
|
||||||
assert(module);
|
|
||||||
|
|
||||||
bytes = send(sock, module, strlen(module), /* flags = */ 0);
|
|
||||||
if (bytes < 0)
|
|
||||||
return log_error_errno(errno, "Failed to send '%s' to thread pool: %m", module);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dequeue_module_to_load(int sock, char *buffer, size_t buffer_len) {
|
|
||||||
ssize_t bytes;
|
|
||||||
|
|
||||||
assert(sock >= 0);
|
|
||||||
assert(buffer);
|
|
||||||
|
|
||||||
/* Dequeue one module to be loaded from the socket pair. In case no more
|
|
||||||
* modules are present, recv() will return 0. */
|
|
||||||
bytes = recv(sock, buffer, buffer_len, /* flags = */ 0);
|
|
||||||
if (bytes == 0)
|
|
||||||
return 0;
|
|
||||||
if (bytes < 0)
|
|
||||||
return negative_errno();
|
|
||||||
if ((size_t)bytes == buffer_len)
|
|
||||||
return -E2BIG;
|
|
||||||
|
|
||||||
buffer[bytes] = '\0';
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int run_prober(int sock) {
|
|
||||||
_cleanup_(kmod_unrefp) struct kmod_ctx *ctx = NULL;
|
|
||||||
char buffer[MODULE_NAME_MAX_LEN + 1];
|
|
||||||
int ret = 0, r;
|
|
||||||
|
|
||||||
r = module_setup_context(&ctx);
|
|
||||||
if (r < 0)
|
|
||||||
return log_error_errno(r, "Failed to initialize libkmod context: %m");
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
r = dequeue_module_to_load(sock, buffer, sizeof(buffer));
|
|
||||||
if (ERRNO_IS_NEG_TRANSIENT(r))
|
|
||||||
continue;
|
continue;
|
||||||
if (r == -E2BIG) {
|
RET_GATHER(r, k);
|
||||||
log_warning_errno(SYNTHETIC_ERRNO(E2BIG), "Dequeued module name too long, proceeding anyway");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (r < 0)
|
|
||||||
return log_error_errno(r, "Failed to receive from module queue: %m");
|
|
||||||
if (r == 0) {
|
|
||||||
log_debug("No more queued modules, terminate thread");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = module_load_and_warn(ctx, buffer, /* verbose = */ true);
|
|
||||||
if (r != -ENOENT)
|
|
||||||
RET_GATHER(ret, r);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return r;
|
||||||
}
|
|
||||||
|
|
||||||
static void *prober_thread(void *arg) {
|
|
||||||
int sock = PTR_TO_FD(arg);
|
|
||||||
return INT_TO_PTR(run_prober(sock));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int create_worker_threads(size_t n_threads, void *arg, pthread_t **ret_threads, size_t *ret_n_threads) {
|
|
||||||
_cleanup_free_ pthread_t *new_threads = NULL;
|
|
||||||
size_t created_threads;
|
|
||||||
sigset_t ss, saved_ss;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
assert(ret_threads);
|
|
||||||
assert(ret_n_threads);
|
|
||||||
|
|
||||||
if (n_threads == 0) {
|
|
||||||
*ret_threads = NULL;
|
|
||||||
*ret_n_threads = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create worker threads with masked signals */
|
|
||||||
new_threads = new(pthread_t, n_threads);
|
|
||||||
if (!new_threads)
|
|
||||||
return log_oom();
|
|
||||||
|
|
||||||
/* No signals in worker threads. */
|
|
||||||
assert_se(sigfillset(&ss) >= 0);
|
|
||||||
r = pthread_sigmask(SIG_BLOCK, &ss, &saved_ss);
|
|
||||||
if (r != 0)
|
|
||||||
return log_error_errno(r, "Failed to mask signals for workers: %m");
|
|
||||||
|
|
||||||
for (created_threads = 0; created_threads < n_threads; ++created_threads) {
|
|
||||||
r = pthread_create(&new_threads[created_threads], /* attr = */ NULL, prober_thread, arg);
|
|
||||||
if (r != 0) {
|
|
||||||
log_error_errno(r, "Failed to create worker thread %zu: %m", created_threads);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Restore the signal mask */
|
|
||||||
r = pthread_sigmask(SIG_SETMASK, &saved_ss, NULL);
|
|
||||||
if (r != 0)
|
|
||||||
log_warning_errno(r, "Failed to restore signal mask, ignoring: %m");
|
|
||||||
|
|
||||||
*ret_threads = TAKE_PTR(new_threads);
|
|
||||||
*ret_n_threads = created_threads;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int destroy_worker_threads(pthread_t **threads, size_t n_threads) {
|
|
||||||
int ret = 0, r;
|
|
||||||
|
|
||||||
assert(threads);
|
|
||||||
assert(n_threads == 0 || *threads);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < n_threads; ++i) {
|
|
||||||
void *p;
|
|
||||||
r = pthread_join((*threads)[i], &p);
|
|
||||||
if (r != 0)
|
|
||||||
RET_GATHER(ret, log_warning_errno(r, "Failed to join worker thread, proceeding anyway: %m"));
|
|
||||||
else
|
|
||||||
RET_GATHER(ret, PTR_TO_INT(p));
|
|
||||||
}
|
|
||||||
|
|
||||||
*threads = mfree(*threads);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Determine number of workers, either from env or from online CPUs */
|
|
||||||
static unsigned determine_num_worker_threads(unsigned n_modules) {
|
|
||||||
unsigned n_threads = UINT_MAX;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
if (n_modules == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
const char *e = secure_getenv("SYSTEMD_MODULES_LOAD_NUM_THREADS");
|
|
||||||
if (e) {
|
|
||||||
r = safe_atou(e, &n_threads);
|
|
||||||
if (r < 0)
|
|
||||||
log_debug("Invalid value in $SYSTEMD_MODULES_LOAD_NUM_THREADS, ignoring: %s", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n_threads == UINT_MAX) {
|
|
||||||
/* By default, use a number of worker threads equal the number of online CPUs,
|
|
||||||
* but clamp it to avoid a probing storm on machines with many CPUs. */
|
|
||||||
long ncpus = sysconf(_SC_NPROCESSORS_ONLN);
|
|
||||||
if (ncpus < 0) {
|
|
||||||
log_warning_errno(errno, "Failed to get number of online CPUs, ignoring: %m");
|
|
||||||
ncpus = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
n_threads = CLAMP((unsigned)ncpus, 1U, 16U);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* There's no reason to spawn more threads than the modules that need to be loaded */
|
|
||||||
n_threads = CLAMP(n_threads, 1U, n_modules);
|
|
||||||
|
|
||||||
/* One of the probe threads is the main process */
|
|
||||||
return n_threads - 1U;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int help(void) {
|
static int help(void) {
|
||||||
_cleanup_free_ char *link = NULL;
|
_cleanup_free_ char *link = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
if (terminal_urlify_man("systemd-modules-load.service", "8", &link) < 0)
|
r = terminal_urlify_man("systemd-modules-load.service", "8", &link);
|
||||||
|
if (r < 0)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n"
|
printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n"
|
||||||
@ -382,18 +135,8 @@ static int parse_argv(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int run(int argc, char *argv[]) {
|
static int run(int argc, char *argv[]) {
|
||||||
/* A OrderedSet instead of a plain Set is used here to make debug easier:
|
_cleanup_(kmod_unrefp) struct kmod_ctx *ctx = NULL;
|
||||||
* in case a race condition is observed during module probing, the threading
|
int r, k;
|
||||||
* can be disabled through the SYSTEMD_MODULES_LOAD_NUM_THREADS environment
|
|
||||||
* variable and the modules reordered at will by the user that is debugging it.
|
|
||||||
* In that case, the probing order would be the same in which the modules
|
|
||||||
* appear inside the modules-load.d files (this wouldn't be true with a Set). */
|
|
||||||
_cleanup_ordered_set_free_ OrderedSet *module_set = NULL;
|
|
||||||
_cleanup_close_pair_ int pair[2] = EBADF_PAIR;
|
|
||||||
_cleanup_free_ pthread_t *threads = NULL;
|
|
||||||
size_t n_threads = 0;
|
|
||||||
char *module;
|
|
||||||
int ret = 0, r;
|
|
||||||
|
|
||||||
r = parse_argv(argc, argv);
|
r = parse_argv(argc, argv);
|
||||||
if (r <= 0)
|
if (r <= 0)
|
||||||
@ -403,69 +146,39 @@ static int run(int argc, char *argv[]) {
|
|||||||
|
|
||||||
umask(0022);
|
umask(0022);
|
||||||
|
|
||||||
r = proc_cmdline_parse(parse_proc_cmdline_item, /* userdata = */ NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
|
r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
|
log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
|
||||||
|
|
||||||
|
r = module_setup_context(&ctx);
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to initialize libkmod context: %m");
|
||||||
|
|
||||||
|
r = 0;
|
||||||
|
|
||||||
if (argc > optind) {
|
if (argc > optind) {
|
||||||
for (int i = optind; i < argc; i++) {
|
for (int i = optind; i < argc; i++)
|
||||||
r = apply_file_from_path(argv[i], &module_set);
|
RET_GATHER(r, apply_file(ctx, argv[i], false));
|
||||||
if (r < 0)
|
|
||||||
RET_GATHER(ret, r);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
ConfFile **files = NULL;
|
_cleanup_strv_free_ char **files = NULL;
|
||||||
size_t n_files = 0;
|
|
||||||
|
|
||||||
CLEANUP_ARRAY(files, n_files, conf_file_free_many);
|
STRV_FOREACH(i, arg_proc_cmdline_modules) {
|
||||||
|
k = module_load_and_warn(ctx, *i, true);
|
||||||
|
if (k == -ENOENT)
|
||||||
|
continue;
|
||||||
|
RET_GATHER(r, k);
|
||||||
|
}
|
||||||
|
|
||||||
STRV_FOREACH(i, arg_proc_cmdline_modules)
|
k = conf_files_list_nulstr(&files, ".conf", NULL, 0, conf_file_dirs);
|
||||||
RET_GATHER(ret, modules_list_append_dup(&module_set, *i));
|
if (k < 0)
|
||||||
|
return log_error_errno(k, "Failed to enumerate modules-load.d files: %m");
|
||||||
|
|
||||||
r = conf_files_list_nulstr_full(".conf", /* root = */ NULL,
|
STRV_FOREACH(fn, files)
|
||||||
CONF_FILES_REGULAR | CONF_FILES_FILTER_MASKED,
|
RET_GATHER(r, apply_file(ctx, *fn, true));
|
||||||
conf_file_dirs, &files, &n_files);
|
|
||||||
if (r < 0)
|
|
||||||
RET_GATHER(ret, log_error_errno(r, "Failed to enumerate modules-load.d files: %m"));
|
|
||||||
else
|
|
||||||
FOREACH_ARRAY(cf, files, n_files)
|
|
||||||
RET_GATHER(ret, apply_conf_file(*cf, &module_set));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
n_threads = determine_num_worker_threads((size_t) ordered_set_size(module_set));
|
return r;
|
||||||
|
|
||||||
/* If no additional thread is required, there is no need to create the
|
|
||||||
* thread pool or the mean to communicate with its members. */
|
|
||||||
if (n_threads == 0) {
|
|
||||||
log_debug("Single-threaded probe");
|
|
||||||
return RET_GATHER(ret, do_direct_probe(module_set));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create a socketpair for communication with probe workers */
|
|
||||||
r = RET_NERRNO(socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, /* protocol = */ 0, pair));
|
|
||||||
if (r < 0)
|
|
||||||
return log_error_errno(r, "Failed to create socket pair: %m");
|
|
||||||
|
|
||||||
/* Create threads, which will then wait for modules to probe. */
|
|
||||||
log_info("Using %zu probe threads", n_threads + 1);
|
|
||||||
r = create_worker_threads(n_threads, FD_TO_PTR(pair[1]), &threads, &n_threads);
|
|
||||||
if (r < 0)
|
|
||||||
log_warning_errno(r, "Failed to create probe threads, continuing as single-threaded probe");
|
|
||||||
|
|
||||||
/* Send modules to be probed */
|
|
||||||
ORDERED_SET_FOREACH(module, module_set)
|
|
||||||
RET_GATHER(ret, enqueue_module_to_load(pair[0], module));
|
|
||||||
|
|
||||||
/* Close one end of the socketpair; workers will run until the queue is empty */
|
|
||||||
pair[0] = safe_close(pair[0]);
|
|
||||||
|
|
||||||
/* Run the prober function also in original thread */
|
|
||||||
RET_GATHER(ret, run_prober(pair[1]));
|
|
||||||
|
|
||||||
/* Wait for all threads (if any) to finish and gather errors */
|
|
||||||
RET_GATHER(ret, destroy_worker_threads(&threads, n_threads));
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_MAIN_FUNCTION(run);
|
DEFINE_MAIN_FUNCTION(run);
|
||||||
|
|||||||
@ -1,8 +1,11 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||||
|
|
||||||
#include "sd-varlink.h"
|
#include "sd-bus.h"
|
||||||
|
|
||||||
#include "alloc-util.h"
|
#include "alloc-util.h"
|
||||||
|
#include "bus-error.h"
|
||||||
|
#include "bus-locator.h"
|
||||||
|
#include "bus-util.h"
|
||||||
#include "glob-util.h"
|
#include "glob-util.h"
|
||||||
#include "json-util.h"
|
#include "json-util.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
@ -11,34 +14,56 @@
|
|||||||
#include "networkctl-util.h"
|
#include "networkctl-util.h"
|
||||||
#include "stdio-util.h"
|
#include "stdio-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "varlink-util.h"
|
|
||||||
|
|
||||||
static int dump_manager_description(sd_varlink *vl) {
|
static int get_description(sd_bus *bus, sd_json_variant **ret) {
|
||||||
sd_json_variant *v;
|
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||||
|
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||||
|
const char *text;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(vl);
|
assert(bus);
|
||||||
|
assert(ret);
|
||||||
|
|
||||||
r = varlink_call_and_log(vl, "io.systemd.Network.Describe", /* parameters = */ NULL, &v);
|
r = bus_call_method(bus, bus_network_mgr, "Describe", &error, &reply, NULL);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return log_error_errno(r, "Failed to get description: %s", bus_error_message(&error, r));
|
||||||
|
|
||||||
r = sd_json_variant_dump(v, arg_json_format_flags, /* f = */ NULL, /* prefix = */ NULL);
|
r = sd_bus_message_read(reply, "s", &text);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to dump json object: %m");
|
return bus_log_parse_error(r);
|
||||||
|
|
||||||
|
r = sd_json_parse(text, 0, ret, NULL, NULL);
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to parse JSON: %m");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dump_link_description(sd_varlink *vl, char * const *patterns) {
|
static int dump_manager_description(sd_bus *bus) {
|
||||||
|
_cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(bus);
|
||||||
|
|
||||||
|
r = get_description(bus, &v);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
sd_json_variant_dump(v, arg_json_format_flags, NULL, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dump_link_description(sd_bus *bus, char * const *patterns) {
|
||||||
|
_cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL;
|
||||||
_cleanup_free_ bool *matched_patterns = NULL;
|
_cleanup_free_ bool *matched_patterns = NULL;
|
||||||
sd_json_variant *i, *v;
|
sd_json_variant *i;
|
||||||
size_t c = 0;
|
size_t c = 0;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(vl);
|
assert(bus);
|
||||||
assert(patterns);
|
assert(patterns);
|
||||||
|
|
||||||
r = varlink_call_and_log(vl, "io.systemd.Network.Describe", /* parameters = */ NULL, &v);
|
r = get_description(bus, &v);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
@ -97,20 +122,20 @@ static int dump_link_description(sd_varlink *vl, char * const *patterns) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int dump_description(int argc, char *argv[]) {
|
int dump_description(int argc, char *argv[]) {
|
||||||
_cleanup_(sd_varlink_flush_close_unrefp) sd_varlink *vl = NULL;
|
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (!sd_json_format_enabled(arg_json_format_flags))
|
if (!sd_json_format_enabled(arg_json_format_flags))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
r = varlink_connect_networkd(&vl);
|
r = acquire_bus(&bus);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
if (arg_all || argc <= 1)
|
if (arg_all || argc <= 1)
|
||||||
r = dump_manager_description(vl);
|
r = dump_manager_description(bus);
|
||||||
else
|
else
|
||||||
r = dump_link_description(vl, strv_skip(argv, 1));
|
r = dump_link_description(bus, strv_skip(argv, 1));
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,6 @@
|
|||||||
#include "lldp-rx-internal.h"
|
#include "lldp-rx-internal.h"
|
||||||
#include "network-util.h"
|
#include "network-util.h"
|
||||||
#include "networkd-dhcp-server.h"
|
#include "networkd-dhcp-server.h"
|
||||||
#include "networkd-json.h"
|
|
||||||
#include "networkd-link.h"
|
#include "networkd-link.h"
|
||||||
#include "networkd-manager.h"
|
#include "networkd-manager.h"
|
||||||
#include "networkd-manager-varlink.h"
|
#include "networkd-manager-varlink.h"
|
||||||
@ -21,25 +20,6 @@
|
|||||||
#include "varlink-io.systemd.service.h"
|
#include "varlink-io.systemd.service.h"
|
||||||
#include "varlink-util.h"
|
#include "varlink-util.h"
|
||||||
|
|
||||||
static int vl_method_describe(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
|
|
||||||
_cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL;
|
|
||||||
Manager *m = ASSERT_PTR(userdata);
|
|
||||||
int r;
|
|
||||||
|
|
||||||
assert(parameters);
|
|
||||||
assert(link);
|
|
||||||
|
|
||||||
r = sd_varlink_dispatch(link, parameters, /* dispatch_table = */ NULL, /* userdata = */ NULL);
|
|
||||||
if (r != 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = manager_build_json(m, &v);
|
|
||||||
if (r < 0)
|
|
||||||
return log_error_errno(r, "Failed to format JSON data: %m");
|
|
||||||
|
|
||||||
return sd_varlink_reply(link, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int vl_method_get_states(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
|
static int vl_method_get_states(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
|
||||||
Manager *m = ASSERT_PTR(userdata);
|
Manager *m = ASSERT_PTR(userdata);
|
||||||
int r;
|
int r;
|
||||||
@ -308,7 +288,6 @@ int manager_connect_varlink(Manager *m, int fd) {
|
|||||||
|
|
||||||
r = sd_varlink_server_bind_method_many(
|
r = sd_varlink_server_bind_method_many(
|
||||||
s,
|
s,
|
||||||
"io.systemd.Network.Describe", vl_method_describe,
|
|
||||||
"io.systemd.Network.GetStates", vl_method_get_states,
|
"io.systemd.Network.GetStates", vl_method_get_states,
|
||||||
"io.systemd.Network.GetNamespaceId", vl_method_get_namespace_id,
|
"io.systemd.Network.GetNamespaceId", vl_method_get_namespace_id,
|
||||||
"io.systemd.Network.GetLLDPNeighbors", vl_method_get_lldp_neighbors,
|
"io.systemd.Network.GetLLDPNeighbors", vl_method_get_lldp_neighbors,
|
||||||
|
|||||||
@ -345,7 +345,7 @@ static int extend_nvpcr_now(
|
|||||||
"MESSAGE_ID=" SD_MESSAGE_TPM_NVPCR_EXTEND_STR,
|
"MESSAGE_ID=" SD_MESSAGE_TPM_NVPCR_EXTEND_STR,
|
||||||
LOG_MESSAGE("Extended NvPCR index '%s' with '%s'.", name, safe),
|
LOG_MESSAGE("Extended NvPCR index '%s' with '%s'.", name, safe),
|
||||||
"MEASURING=%s", safe,
|
"MEASURING=%s", safe,
|
||||||
"NVPCR=%s", name);
|
"NVPCR=%u", name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -827,7 +827,7 @@ int tar_x(int input_fd, int tree_fd, TarFlags flags) {
|
|||||||
"Invalid hardlink path name '%s' in entry, refusing.", target);
|
"Invalid hardlink path name '%s' in entry, refusing.", target);
|
||||||
|
|
||||||
_cleanup_close_ int target_fd = -EBADF;
|
_cleanup_close_ int target_fd = -EBADF;
|
||||||
r = chaseat(tree_fd, target, CHASE_PROHIBIT_SYMLINKS|CHASE_AT_RESOLVE_IN_ROOT|CHASE_NOFOLLOW, /* ret_path= */ NULL, &target_fd);
|
r = chaseat(tree_fd, target, CHASE_PROHIBIT_SYMLINKS|CHASE_AT_RESOLVE_IN_ROOT, /* ret_path= */ NULL, &target_fd);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(
|
return log_error_errno(
|
||||||
r,
|
r,
|
||||||
@ -856,7 +856,7 @@ int tar_x(int input_fd, int tree_fd, TarFlags flags) {
|
|||||||
|
|
||||||
_cleanup_close_ int target_parent_fd = -EBADF;
|
_cleanup_close_ int target_parent_fd = -EBADF;
|
||||||
_cleanup_free_ char *target_filename = NULL;
|
_cleanup_free_ char *target_filename = NULL;
|
||||||
r = chaseat(tree_fd, target, CHASE_PROHIBIT_SYMLINKS|CHASE_AT_RESOLVE_IN_ROOT|CHASE_PARENT|CHASE_EXTRACT_FILENAME|CHASE_NOFOLLOW, &target_filename, &target_parent_fd);
|
r = chaseat(tree_fd, target, CHASE_PROHIBIT_SYMLINKS|CHASE_AT_RESOLVE_IN_ROOT|CHASE_PARENT|CHASE_EXTRACT_FILENAME, &target_filename, &target_parent_fd);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(
|
return log_error_errno(
|
||||||
r,
|
r,
|
||||||
|
|||||||
@ -2,606 +2,47 @@
|
|||||||
|
|
||||||
#include "varlink-io.systemd.Network.h"
|
#include "varlink-io.systemd.Network.h"
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_ENUM_TYPE(
|
|
||||||
LinkState,
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(pending),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(initialized),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(configuring),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(configured),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(unmanaged),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(failed),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(linger));
|
|
||||||
|
|
||||||
SD_VARLINK_DEFINE_ENUM_TYPE(
|
|
||||||
LinkAddressState,
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(off),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(degraded),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(routable));
|
|
||||||
|
|
||||||
SD_VARLINK_DEFINE_ENUM_TYPE(
|
|
||||||
LinkOnlineState,
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(offline),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(partial),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(online));
|
|
||||||
|
|
||||||
SD_VARLINK_DEFINE_ENUM_TYPE(
|
|
||||||
LinkRequiredAddressFamily,
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(any),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(ipv4),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(ipv6),
|
|
||||||
SD_VARLINK_DEFINE_ENUM_VALUE(both));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
RoutingPolicyRule,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Source address prefix to match"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(FromPrefix, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Length of source prefix in bits"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(FromPrefixLength, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Destination address prefix to match"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ToPrefix, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Length of destination prefix in bits"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ToPrefixLength, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Routing protocol identifier"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Protocol, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable routing protocol name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ProtocolString, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Type of Service (TOS) field to match"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(TOS, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Rule action type (FR_ACT_* value)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Type, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable rule action type"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(TypeString, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("IP protocol number to match"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(IPProtocol, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable IP protocol name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(IPProtocolString, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Rule priority (lower value means higher priority)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Priority, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Firewall mark value to match"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(FirewallMark, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Firewall mark mask to apply"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(FirewallMask, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Routing table number to use"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Table, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable routing table name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(TableString, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Whether rule matching is inverted"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Invert, SD_VARLINK_BOOL, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Suppress route lookup if prefix length is less than or equal to this value"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(SuppressPrefixLength, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Suppress route lookup if interface group matches"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(SuppressInterfaceGroup, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Source port range to match [start, end]"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(SourcePort, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Destination port range to match [start, end]"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(DestinationPort, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("User ID range to match [start, end]"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(User, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Incoming interface name to match"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(IncomingInterface, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Outgoing interface name to match"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(OutgoingInterface, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration source for this rule"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration state of this rule"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigState, SD_VARLINK_STRING, 0));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
Route,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Destination network address"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Destination, SD_VARLINK_INT, SD_VARLINK_ARRAY),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Destination network prefix length"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(DestinationPrefixLength, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Gateway address for this route"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Gateway, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Source address prefix for route selection"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Source, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Source prefix length"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(SourcePrefixLength, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Preferred source address for outgoing packets"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PreferredSource, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Type of Service (TOS) field"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(TOS, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Route scope (RT_SCOPE_* value)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Scope, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable scope string"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ScopeString, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Routing protocol identifier"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Protocol, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable routing protocol name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ProtocolString, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Route type (RTN_* value)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Type, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable route type"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(TypeString, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Route priority/metric"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Priority, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Routing table number"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Table, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable routing table name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(TableString, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Route flags (RTM_F_* values)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Flags, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable flags string"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(FlagsString, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Next hop ID for multipath routing"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(NextHopID, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Maximum Transmission Unit for this route"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(MTU, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Route preference for IPv6 (low/medium/high)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Preference, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Route lifetime in microseconds"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(LifetimeUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration source for this route"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address of the configuration provider"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigProvider, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration state of this route"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigState, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Interface index for serialization"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(InterfaceIndex, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Route metrics (RTAX_* values)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Metrics, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("TCP congestion control algorithm for this route"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(TCPCongestionControlAlgorithm, SD_VARLINK_STRING, SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
NextHopGroup,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Next hop identifier in the multipath group"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ID, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Weight for load balancing (higher means more traffic)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Weight, SD_VARLINK_INT, 0));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
NextHop,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Next hop identifier"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ID, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Gateway address for this next hop"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Gateway, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Next hop flags (RTNH_F_* values)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Flags, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable flags string"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(FlagsString, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Routing protocol identifier"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Protocol, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable routing protocol name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ProtocolString, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Whether this is a blackhole next hop (drops packets)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Blackhole, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Multipath group members with weights for load balancing"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Group, NextHopGroup, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration source for this next hop"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address of the configuration provider"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigProvider, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration state of this next hop"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigState, SD_VARLINK_STRING, SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
LLDPNeighbor,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Chassis identifier in human-readable format"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ChassisID, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Raw chassis identifier bytes"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(RawChassisID, SD_VARLINK_INT, SD_VARLINK_ARRAY),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Port identifier in human-readable format"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PortID, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Raw port identifier bytes"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(RawPortID, SD_VARLINK_INT, SD_VARLINK_ARRAY),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Description of the port"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PortDescription, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("System name of the LLDP neighbor"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(SystemName, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("System description of the LLDP neighbor"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(SystemDescription, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Enabled capabilities bitmap (bridge, router, WLAN, etc.)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(EnabledCapabilities, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Manufacturer Usage Description URL (RFC8520)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(MUDURL, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("VLAN identifier"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(VlanID, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
DNS,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DNS server IP address"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Address, SD_VARLINK_INT, SD_VARLINK_ARRAY),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DNS server port number"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Port, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Interface index for link-local DNS servers"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(InterfaceIndex, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DNS server hostname for DoT/DoH"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ServerName, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration source for this DNS server"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address of the configuration provider"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigProvider, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
NTP,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6) for address-based servers"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("NTP server IP address"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Address, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("NTP server"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Server, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration source for this NTP server"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address of the configuration provider"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigProvider, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
SIP,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6) for address-based servers"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("SIP server IP address"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Address, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("SIP server domain name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Domain, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration source for this SIP server"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address of the configuration provider"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigProvider, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
Domain,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DNS search or route domain name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Domain, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration source for this domain"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address of the configuration provider"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigProvider, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
DNSSECNegativeTrustAnchor,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Domain name for which DNSSEC validation is disabled"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(DNSSECNegativeTrustAnchor, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration source for this negative trust anchor"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
DNSSetting,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Link-Local Multicast Name Resolution setting"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(LLMNR, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Multicast DNS setting"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(MDNS, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Whether this connection can be used as a default route for DNS lookups"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(DNSDefaultRoute, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DNS-over-TLS mode setting"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(DNSOverTLS, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration source for this DNS setting"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
Pref64,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("IPv6 prefix for NAT64/DNS64"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Prefix, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Length of the prefix in bits"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PrefixLength, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Lifetime of the prefix in microseconds"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(LifetimeUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address of router that provided this prefix"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigProvider, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
NDisc,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("PREF64 (RFC8781) prefixes advertised via IPv6 Router Advertisements"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(PREF64, Pref64, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
Address,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("IP address"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Address, SD_VARLINK_INT, SD_VARLINK_ARRAY),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Peer address for point-to-point interfaces"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Peer, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Network prefix length"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PrefixLength, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration source for this address"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address of the configuration provider (DHCP server, router, etc.)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigProvider, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Broadcast address for IPv4 networks"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Broadcast, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address scope (RT_SCOPE_* value)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Scope, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable scope string"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ScopeString, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address flags (IFA_F_* values)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Flags, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable flags string"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(FlagsString, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address label for IPv4"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Label, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Preferred lifetime in microseconds"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PreferredLifetimeUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Preferred lifetime in microseconds (deprecated, for backward compatibility)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PreferredLifetimeUsec, SD_VARLINK_INT, SD_VARLINK_NULLABLE), /* for backward compat */
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Valid lifetime in microseconds"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ValidLifetimeUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Valid lifetime in microseconds (deprecated, for backward compatibility)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ValidLifetimeUsec, SD_VARLINK_INT, SD_VARLINK_NULLABLE), /* for backward compat */
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration state of this address"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigState, SD_VARLINK_STRING, SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
Neighbor,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("IP address of the neighbor"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Destination, SD_VARLINK_INT, SD_VARLINK_ARRAY),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Link layer (MAC) address of the neighbor"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(LinkLayerAddress, SD_VARLINK_INT, SD_VARLINK_ARRAY),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration source for this neighbor entry"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Configuration state of this neighbor entry"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ConfigState, SD_VARLINK_STRING, 0));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
DHCPLease,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Timestamp when the lease was acquired in microseconds"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(LeaseTimestampUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("T1 timeout (lease renewal time) in microseconds"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Timeout1USec, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("T2 timeout (lease rebinding time) in microseconds"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Timeout2USec, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
PrivateOption,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DHCP option number"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Option, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Raw data of the private DHCP option"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PrivateOptionData, SD_VARLINK_STRING, SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
DHCPv6ClientPD,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Delegated IPv6 prefix"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Prefix, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Length of the delegated prefix in bits"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PrefixLength, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Preferred lifetime of the prefix in microseconds"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PreferredLifetimeUsec, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Valid lifetime of the prefix in microseconds"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ValidLifetimeUsec, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
DHCPv6ClientVendorOption,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("IANA enterprise number identifying the vendor"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(EnterpriseId, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Vendor-specific sub-option code"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(SubOptionCode, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Raw data of the vendor-specific sub-option"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(SubOptionData, SD_VARLINK_STRING, 0));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
DHCPv6Client,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DHCPv6 lease information including timestamps and timeouts"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Lease, DHCPLease, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Delegated prefixes received from DHCPv6 server"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Prefixes, DHCPv6ClientPD, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Vendor-specific options received in DHCPv6 response"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(VendorSpecificOptions, DHCPv6ClientVendorOption, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DHCP Unique Identifier (DUID) of the client"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(DUID, SD_VARLINK_INT, SD_VARLINK_ARRAY));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
DHCPServerLease,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DHCP client identifier"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ClientId, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address assigned to the client"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Address, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Hostname provided by the DHCP client"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Hostname, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Hardware address type (ARPHRD_* value)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(HardwareAddressType, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Length of hardware address in bytes"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(HardwareAddressLength, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Hardware (MAC) address of the DHCP client"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(HardwareAddress, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Lease expiration time in monotonic microseconds"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ExpirationUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Lease expiration time in realtime microseconds"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ExpirationRealtimeUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
DHCPServer,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Offset from the network address for the DHCP address pool"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PoolOffset, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Size of the DHCP address pool"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PoolSize, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Active DHCP leases assigned by the server"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Leases, DHCPServerLease, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Static DHCP leases configured for specific clients"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(StaticLeases, DHCPServerLease, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
|
||||||
Interface,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Network interface index"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Index, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Primary interface name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Name, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Alternative interface names"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(AlternativeNames, SD_VARLINK_STRING, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Interface index of the master device (for bridge/bond slaves)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(MasterInterfaceIndex, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Interface kind (vlan, bridge, bond, etc.)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Kind, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Interface type (ether, loopback, etc.)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Type, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Kernel driver name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Driver, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Interface flags (IFF_* values)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Flags, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable interface flags"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(FlagsString, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Kernel operational state (IF_OPER_* value)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(KernelOperationalState, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable kernel operational state"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(KernelOperationalStateString, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Current MTU in bytes"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(MTU, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Minimum allowed MTU in bytes"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(MinimumMTU, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Maximum allowed MTU in bytes"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(MaximumMTU, SD_VARLINK_INT, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Current hardware (MAC) address"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(HardwareAddress, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Permanent hardware (MAC) address from factory"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(PermanentHardwareAddress, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Broadcast address for Ethernet interfaces"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(BroadcastAddress, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("IPv6 link-local address"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(IPv6LinkLocalAddress, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Wireless LAN interface type (NL80211_IFTYPE_* value)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(WirelessLanInterfaceType, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Human-readable wireless LAN interface type"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(WirelessLanInterfaceTypeString, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Wireless network SSID"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(SSID, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Wireless access point BSSID (MAC address)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(BSSID, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Administrative state (configuring, configured, etc.)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(AdministrativeState, LinkState, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Operational state (routable, degraded, etc.)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(OperationalState, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Carrier state (carrier, no-carrier, etc.)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(CarrierState, SD_VARLINK_STRING, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Address configuration state"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(AddressState, LinkAddressState, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("IPv4 address configuration state"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(IPv4AddressState, LinkAddressState, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("IPv6 address configuration state"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(IPv6AddressState, LinkAddressState, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Online state (online, offline, etc.)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(OnlineState, LinkOnlineState, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Path to .network configuration file"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(NetworkFile, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Paths to .network drop-in configuration files"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(NetworkFileDropins, SD_VARLINK_STRING, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Whether this interface is required for online state"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(RequiredForOnline, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Required operational state range for considering interface online [min, max]"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(RequiredOperationalStateForOnline, SD_VARLINK_STRING, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Required address family for considering interface online"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(RequiredFamilyForOnline, LinkRequiredAddressFamily, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Activation policy (up, always-up, manual, etc.)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(ActivationPolicy, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Path to .netdev configuration file"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(NetDevFile, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Paths to .netdev drop-in configuration files"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(NetDevFileDropins, SD_VARLINK_STRING, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Path to .link configuration file"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(LinkFile, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Paths to .link drop-in configuration files"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(LinkFileDropins, SD_VARLINK_STRING, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Device path in sysfs"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Path, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Hardware vendor name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Vendor, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Hardware model name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(Model, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DNS servers configured for this interface"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(DNS, DNS, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
/* FIXME: DNR Addresses fied (json array or arrays) is incompatible with Varlink type system */
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Discovery of Network-designated Resolvers (RFC9463)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(DNR, SD_VARLINK_OBJECT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("NTP servers configured for this interface"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(NTP, NTP, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("SIP servers configured for this interface"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(SIP, SIP, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DNS search domains"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(SearchDomains, Domain, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DNS route-only domains"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(RouteDomains, Domain, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DNSSEC negative trust anchors"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(DNSSECNegativeTrustAnchors, DNSSECNegativeTrustAnchor, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DNS resolution settings (LLMNR, mDNS, etc.)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(DNSSettings, DNSSetting, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Captive portal detection URL (RFC8910)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(CaptivePortal, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("IPv6 Neighbor Discovery information"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(NDisc, NDisc, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("IP addresses configured on this interface"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Addresses, Address, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Neighbor entries (ARP/NDP cache)"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Neighbors, Neighbor, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Next hops for multipath routing"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(NextHops, NextHop, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Routes configured on this interface"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Routes, Route, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DHCP server configuration and leases"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(DHCPServer, DHCPServer, SD_VARLINK_NULLABLE),
|
|
||||||
/* FIXME: DHCPv4Client has 6rdPrefix field that is incompatible with Varlink naming */
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DHCPv4 client configuration and lease information"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(DHCPv4Client, SD_VARLINK_OBJECT, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("DHCPv6 client configuration and lease information"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(DHCPv6Client, DHCPv6Client, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("LLDP neighbors discovered on this interface"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(LLDP, LLDPNeighbor, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_METHOD(
|
|
||||||
Describe,
|
|
||||||
SD_VARLINK_FIELD_COMMENT("All network interfaces managed by systemd-networkd"),
|
|
||||||
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(Interfaces, Interface, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("All configured next hops for multipath routing"),
|
|
||||||
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(NextHops, NextHop, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("All configured routes across all interfaces"),
|
|
||||||
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(Routes, Route, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("All configured routing policy rules"),
|
|
||||||
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(RoutingPolicyRules, RoutingPolicyRule, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE));
|
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_METHOD(
|
static SD_VARLINK_DEFINE_METHOD(
|
||||||
GetStates,
|
GetStates,
|
||||||
SD_VARLINK_FIELD_COMMENT("Overall address configuration state across all interfaces"),
|
SD_VARLINK_DEFINE_OUTPUT(AddressState, SD_VARLINK_STRING, 0),
|
||||||
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(AddressState, LinkAddressState, 0),
|
SD_VARLINK_DEFINE_OUTPUT(IPv4AddressState, SD_VARLINK_STRING, 0),
|
||||||
SD_VARLINK_FIELD_COMMENT("IPv4 address configuration state across all interfaces"),
|
SD_VARLINK_DEFINE_OUTPUT(IPv6AddressState, SD_VARLINK_STRING, 0),
|
||||||
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(IPv4AddressState, LinkAddressState, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("IPv6 address configuration state across all interfaces"),
|
|
||||||
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(IPv6AddressState, LinkAddressState, 0),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Carrier state across all interfaces"),
|
|
||||||
SD_VARLINK_DEFINE_OUTPUT(CarrierState, SD_VARLINK_STRING, 0),
|
SD_VARLINK_DEFINE_OUTPUT(CarrierState, SD_VARLINK_STRING, 0),
|
||||||
SD_VARLINK_FIELD_COMMENT("Online state across all interfaces"),
|
SD_VARLINK_DEFINE_OUTPUT(OnlineState, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||||
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(OnlineState, LinkOnlineState, SD_VARLINK_NULLABLE),
|
|
||||||
SD_VARLINK_FIELD_COMMENT("Operational state across all interfaces"),
|
|
||||||
SD_VARLINK_DEFINE_OUTPUT(OperationalState, SD_VARLINK_STRING, 0));
|
SD_VARLINK_DEFINE_OUTPUT(OperationalState, SD_VARLINK_STRING, 0));
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_METHOD(
|
static SD_VARLINK_DEFINE_METHOD(
|
||||||
GetNamespaceId,
|
GetNamespaceId,
|
||||||
SD_VARLINK_FIELD_COMMENT("Network namespace inode number"),
|
|
||||||
SD_VARLINK_DEFINE_OUTPUT(NamespaceId, SD_VARLINK_INT, 0),
|
SD_VARLINK_DEFINE_OUTPUT(NamespaceId, SD_VARLINK_INT, 0),
|
||||||
SD_VARLINK_FIELD_COMMENT("Network namespace ID (cookie) assigned by the kernel"),
|
|
||||||
SD_VARLINK_DEFINE_OUTPUT(NamespaceNSID, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
|
SD_VARLINK_DEFINE_OUTPUT(NamespaceNSID, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
|
||||||
|
|
||||||
|
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||||
|
LLDPNeighbor,
|
||||||
|
SD_VARLINK_DEFINE_FIELD(ChassisID, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||||
|
SD_VARLINK_DEFINE_FIELD(RawChassisID, SD_VARLINK_INT, SD_VARLINK_ARRAY),
|
||||||
|
SD_VARLINK_DEFINE_FIELD(PortID, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||||
|
SD_VARLINK_DEFINE_FIELD(RawPortID, SD_VARLINK_INT, SD_VARLINK_ARRAY),
|
||||||
|
SD_VARLINK_DEFINE_FIELD(PortDescription, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||||
|
SD_VARLINK_DEFINE_FIELD(SystemName, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||||
|
SD_VARLINK_DEFINE_FIELD(SystemDescription, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||||
|
SD_VARLINK_DEFINE_FIELD(EnabledCapabilities, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
||||||
|
SD_VARLINK_DEFINE_FIELD(VlanID, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||||
LLDPNeighborsByInterface,
|
LLDPNeighborsByInterface,
|
||||||
SD_VARLINK_FIELD_COMMENT("Network interface index"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(InterfaceIndex, SD_VARLINK_INT, 0),
|
SD_VARLINK_DEFINE_FIELD(InterfaceIndex, SD_VARLINK_INT, 0),
|
||||||
SD_VARLINK_FIELD_COMMENT("Primary interface name"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(InterfaceName, SD_VARLINK_STRING, 0),
|
SD_VARLINK_DEFINE_FIELD(InterfaceName, SD_VARLINK_STRING, 0),
|
||||||
SD_VARLINK_FIELD_COMMENT("Alternative interface names"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD(InterfaceAlternativeNames, SD_VARLINK_STRING, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
SD_VARLINK_DEFINE_FIELD(InterfaceAlternativeNames, SD_VARLINK_STRING, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
|
||||||
SD_VARLINK_FIELD_COMMENT("LLDP neighbors discovered on this interface"),
|
|
||||||
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Neighbors, LLDPNeighbor, SD_VARLINK_ARRAY));
|
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Neighbors, LLDPNeighbor, SD_VARLINK_ARRAY));
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_METHOD(
|
static SD_VARLINK_DEFINE_METHOD(
|
||||||
GetLLDPNeighbors,
|
GetLLDPNeighbors,
|
||||||
SD_VARLINK_FIELD_COMMENT("Filter by interface index (optional)"),
|
|
||||||
SD_VARLINK_DEFINE_INPUT(InterfaceIndex, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
SD_VARLINK_DEFINE_INPUT(InterfaceIndex, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
||||||
SD_VARLINK_FIELD_COMMENT("Filter by interface name (optional)"),
|
|
||||||
SD_VARLINK_DEFINE_INPUT(InterfaceName, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
SD_VARLINK_DEFINE_INPUT(InterfaceName, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||||
SD_VARLINK_FIELD_COMMENT("LLDP neighbors grouped by interface"),
|
|
||||||
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(Neighbors, LLDPNeighborsByInterface, SD_VARLINK_ARRAY));
|
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(Neighbors, LLDPNeighborsByInterface, SD_VARLINK_ARRAY));
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_METHOD(
|
static SD_VARLINK_DEFINE_METHOD(
|
||||||
SetPersistentStorage,
|
SetPersistentStorage,
|
||||||
SD_VARLINK_FIELD_COMMENT("Whether persistent storage is ready and writable"),
|
|
||||||
SD_VARLINK_DEFINE_INPUT(Ready, SD_VARLINK_BOOL, 0));
|
SD_VARLINK_DEFINE_INPUT(Ready, SD_VARLINK_BOOL, 0));
|
||||||
|
|
||||||
static SD_VARLINK_DEFINE_ERROR(StorageReadOnly);
|
static SD_VARLINK_DEFINE_ERROR(StorageReadOnly);
|
||||||
@ -609,37 +50,10 @@ static SD_VARLINK_DEFINE_ERROR(StorageReadOnly);
|
|||||||
SD_VARLINK_DEFINE_INTERFACE(
|
SD_VARLINK_DEFINE_INTERFACE(
|
||||||
io_systemd_Network,
|
io_systemd_Network,
|
||||||
"io.systemd.Network",
|
"io.systemd.Network",
|
||||||
&vl_method_Describe,
|
|
||||||
&vl_method_GetStates,
|
&vl_method_GetStates,
|
||||||
&vl_method_GetNamespaceId,
|
&vl_method_GetNamespaceId,
|
||||||
&vl_method_GetLLDPNeighbors,
|
&vl_method_GetLLDPNeighbors,
|
||||||
&vl_method_SetPersistentStorage,
|
&vl_method_SetPersistentStorage,
|
||||||
&vl_type_Address,
|
|
||||||
&vl_type_DHCPLease,
|
|
||||||
&vl_type_DHCPServer,
|
|
||||||
&vl_type_DHCPServerLease,
|
|
||||||
&vl_type_DHCPv6Client,
|
|
||||||
&vl_type_DHCPv6ClientPD,
|
|
||||||
&vl_type_DHCPv6ClientVendorOption,
|
|
||||||
&vl_type_DNS,
|
|
||||||
&vl_type_DNSSECNegativeTrustAnchor,
|
|
||||||
&vl_type_DNSSetting,
|
|
||||||
&vl_type_Domain,
|
|
||||||
&vl_type_Interface,
|
|
||||||
&vl_type_LinkState,
|
|
||||||
&vl_type_LinkAddressState,
|
|
||||||
&vl_type_LinkOnlineState,
|
|
||||||
&vl_type_LinkRequiredAddressFamily,
|
|
||||||
&vl_type_LLDPNeighbor,
|
&vl_type_LLDPNeighbor,
|
||||||
&vl_type_LLDPNeighborsByInterface,
|
&vl_type_LLDPNeighborsByInterface,
|
||||||
&vl_type_NDisc,
|
|
||||||
&vl_type_Neighbor,
|
|
||||||
&vl_type_NextHop,
|
|
||||||
&vl_type_NextHopGroup,
|
|
||||||
&vl_type_NTP,
|
|
||||||
&vl_type_Pref64,
|
|
||||||
&vl_type_PrivateOption,
|
|
||||||
&vl_type_Route,
|
|
||||||
&vl_type_RoutingPolicyRule,
|
|
||||||
&vl_type_SIP,
|
|
||||||
&vl_error_StorageReadOnly);
|
&vl_error_StorageReadOnly);
|
||||||
|
|||||||
@ -4,6 +4,3 @@
|
|||||||
#include "sd-varlink-idl.h"
|
#include "sd-varlink-idl.h"
|
||||||
|
|
||||||
extern const sd_varlink_interface vl_interface_io_systemd_Network;
|
extern const sd_varlink_interface vl_interface_io_systemd_Network;
|
||||||
extern const sd_varlink_symbol vl_type_LinkAddressState;
|
|
||||||
extern const sd_varlink_symbol vl_type_LinkOnlineState;
|
|
||||||
extern const sd_varlink_symbol vl_type_LinkRequiredAddressFamily;
|
|
||||||
|
|||||||
@ -11,7 +11,6 @@
|
|||||||
#include "dissect-image.h"
|
#include "dissect-image.h"
|
||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
#include "json-util.h"
|
#include "json-util.h"
|
||||||
#include "network-util.h"
|
|
||||||
#include "pretty-print.h"
|
#include "pretty-print.h"
|
||||||
#include "tests.h"
|
#include "tests.h"
|
||||||
#include "varlink-idl-util.h"
|
#include "varlink-idl-util.h"
|
||||||
@ -513,12 +512,6 @@ TEST(enums_idl) {
|
|||||||
TEST_IDL_ENUM(BootEntryType, boot_entry_type, vl_type_BootEntryType);
|
TEST_IDL_ENUM(BootEntryType, boot_entry_type, vl_type_BootEntryType);
|
||||||
TEST_IDL_ENUM_TO_STRING(BootEntrySource, boot_entry_source, vl_type_BootEntrySource);
|
TEST_IDL_ENUM_TO_STRING(BootEntrySource, boot_entry_source, vl_type_BootEntrySource);
|
||||||
TEST_IDL_ENUM(PartitionDesignator, partition_designator, vl_type_PartitionDesignator);
|
TEST_IDL_ENUM(PartitionDesignator, partition_designator, vl_type_PartitionDesignator);
|
||||||
TEST_IDL_ENUM(LinkAddressState, link_address_state, vl_type_LinkAddressState);
|
|
||||||
TEST_IDL_ENUM_TO_STRING(LinkAddressState, link_address_state, vl_type_LinkAddressState);
|
|
||||||
TEST_IDL_ENUM(LinkOnlineState, link_online_state, vl_type_LinkOnlineState);
|
|
||||||
TEST_IDL_ENUM_TO_STRING(LinkOnlineState, link_online_state, vl_type_LinkOnlineState);
|
|
||||||
TEST_IDL_ENUM(AddressFamily, link_required_address_family, vl_type_LinkRequiredAddressFamily);
|
|
||||||
TEST_IDL_ENUM_TO_STRING(AddressFamily, link_required_address_family, vl_type_LinkRequiredAddressFamily);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_TEST_MAIN(LOG_DEBUG);
|
DEFINE_TEST_MAIN(LOG_DEBUG);
|
||||||
|
|||||||
@ -175,15 +175,9 @@ chattr +A /home/testuser/.local/state/machines/inodetest/testfile
|
|||||||
chown foreign-0:foreign-0 /home/testuser/.local/state/machines/inodetest/testfile.hard /home/testuser/.local/state/machines/inodetest
|
chown foreign-0:foreign-0 /home/testuser/.local/state/machines/inodetest/testfile.hard /home/testuser/.local/state/machines/inodetest
|
||||||
ls -al /home/testuser/.local/state/machines/inodetest
|
ls -al /home/testuser/.local/state/machines/inodetest
|
||||||
|
|
||||||
# Verify UID squashing
|
|
||||||
echo gaga > /home/testuser/.local/state/machines/inodetest/squashtest
|
echo gaga > /home/testuser/.local/state/machines/inodetest/squashtest
|
||||||
chown 1000:1000 /home/testuser/.local/state/machines/inodetest/squashtest
|
chown 1000:1000 /home/testuser/.local/state/machines/inodetest/squashtest
|
||||||
|
|
||||||
# Ensure hardlinked symlinks work
|
|
||||||
ln -s sometarget /home/testuser/.local/state/machines/inodetest/testfile.sym
|
|
||||||
ln /home/testuser/.local/state/machines/inodetest/testfile.sym /home/testuser/.local/state/machines/inodetest/testfile.symhard
|
|
||||||
chown -h foreign-0:foreign-0 /home/testuser/.local/state/machines/inodetest/testfile.symhard
|
|
||||||
|
|
||||||
run0 --pipe -u testuser importctl -m --user export-tar inodetest |
|
run0 --pipe -u testuser importctl -m --user export-tar inodetest |
|
||||||
run0 --pipe -u testuser importctl -m --user import-tar - inodetest2
|
run0 --pipe -u testuser importctl -m --user import-tar - inodetest2
|
||||||
|
|
||||||
@ -205,11 +199,7 @@ cmp <(lsattr /home/testuser/.local/state/machines/inodetest/testfile | cut -d "
|
|||||||
# verify that squashing outside of 64K works
|
# verify that squashing outside of 64K works
|
||||||
test "$(stat -c'%U:%G' /home/testuser/.local/state/machines/inodetest2/squashtest)" = "foreign-65534:foreign-65534"
|
test "$(stat -c'%U:%G' /home/testuser/.local/state/machines/inodetest2/squashtest)" = "foreign-65534:foreign-65534"
|
||||||
|
|
||||||
# Verify that the hardlinked symlink is restored as such
|
# chown to foreing UID range, so that removal works
|
||||||
cmp <(stat -c"%i" /home/testuser/.local/state/machines/inodetest2/testfile.sym) <(stat -c"%i" /home/testuser/.local/state/machines/inodetest2/testfile.symhard)
|
|
||||||
test "$(readlink /home/testuser/.local/state/machines/inodetest2/testfile.symhard)" = "sometarget"
|
|
||||||
|
|
||||||
# chown to foreign UID range, so that removal works
|
|
||||||
chown foreign-4711:foreign-4711 /home/testuser/.local/state/machines/inodetest/squashtest
|
chown foreign-4711:foreign-4711 /home/testuser/.local/state/machines/inodetest/squashtest
|
||||||
|
|
||||||
run0 -u testuser machinectl --user remove inodetest
|
run0 -u testuser machinectl --user remove inodetest
|
||||||
|
|||||||
@ -185,11 +185,6 @@ varlinkctl info /run/systemd/io.systemd.Manager
|
|||||||
varlinkctl introspect /run/systemd/io.systemd.Manager io.systemd.Manager
|
varlinkctl introspect /run/systemd/io.systemd.Manager io.systemd.Manager
|
||||||
varlinkctl call /run/systemd/io.systemd.Manager io.systemd.Manager.Describe '{}'
|
varlinkctl call /run/systemd/io.systemd.Manager io.systemd.Manager.Describe '{}'
|
||||||
|
|
||||||
# test io.systemd.Network
|
|
||||||
varlinkctl info /run/systemd/netif/io.systemd.Network
|
|
||||||
varlinkctl introspect /run/systemd/netif/io.systemd.Network io.systemd.Network
|
|
||||||
varlinkctl call /run/systemd/netif/io.systemd.Network io.systemd.Network.Describe '{}'
|
|
||||||
|
|
||||||
# test io.systemd.Unit
|
# test io.systemd.Unit
|
||||||
varlinkctl info /run/systemd/io.systemd.Manager
|
varlinkctl info /run/systemd/io.systemd.Manager
|
||||||
varlinkctl introspect /run/systemd/io.systemd.Manager io.systemd.Unit
|
varlinkctl introspect /run/systemd/io.systemd.Manager io.systemd.Unit
|
||||||
|
|||||||
@ -50,22 +50,17 @@ dummy
|
|||||||
|
|
||||||
dumm!@@123##2455
|
dumm!@@123##2455
|
||||||
# This is a comment
|
# This is a comment
|
||||||
$(printf "%.0sx" {1..4096})
|
$(printf "%.0sx" {0..4096})
|
||||||
dummy
|
dummy
|
||||||
dummy
|
dummy
|
||||||
foo-bar-baz
|
foo-bar-baz
|
||||||
foo_bar_baz
|
|
||||||
foo_bar-baz
|
|
||||||
1
|
1
|
||||||
"
|
"
|
||||||
'
|
'
|
||||||
EOF
|
EOF
|
||||||
"$MODULES_LOAD_BIN" |& tee /tmp/out.log
|
"$MODULES_LOAD_BIN" |& tee /tmp/out.log
|
||||||
grep -E "^Inserted module .*dummy" /tmp/out.log
|
grep -E "^Inserted module .*dummy" /tmp/out.log
|
||||||
# Module names are "normalized", i.e., dashes are converted to underscores
|
grep -E "^Failed to find module .*foo-bar-baz" /tmp/out.log
|
||||||
grep -E "^Failed to find module .*foo_bar_baz" /tmp/out.log
|
|
||||||
(! grep -E "^Failed to find module .*foo-bar-baz" /tmp/out.log)
|
|
||||||
(! grep -E "^Failed to find module .*foo_bar-baz" /tmp/out.log)
|
|
||||||
(! grep -E "This is a comment" /tmp/out.log)
|
(! grep -E "This is a comment" /tmp/out.log)
|
||||||
# Each module should be loaded only once, even if specified multiple times
|
# Each module should be loaded only once, even if specified multiple times
|
||||||
[[ "$(grep -Ec "^Inserted module" /tmp/out.log)" -eq 1 ]]
|
[[ "$(grep -Ec "^Inserted module" /tmp/out.log)" -eq 1 ]]
|
||||||
@ -80,9 +75,7 @@ rm -fv "$CONFIG_FILE"
|
|||||||
CMDLINE="ro root= modules_load= modules_load=, / = modules_load=foo-bar-baz,dummy modules_load=dummy,dummy,dummy"
|
CMDLINE="ro root= modules_load= modules_load=, / = modules_load=foo-bar-baz,dummy modules_load=dummy,dummy,dummy"
|
||||||
SYSTEMD_PROC_CMDLINE="$CMDLINE" "$MODULES_LOAD_BIN" |& tee /tmp/out.log
|
SYSTEMD_PROC_CMDLINE="$CMDLINE" "$MODULES_LOAD_BIN" |& tee /tmp/out.log
|
||||||
grep -E "^Inserted module .*dummy" /tmp/out.log
|
grep -E "^Inserted module .*dummy" /tmp/out.log
|
||||||
# Module names are "normalized", i.e., dashes are converted to underscores
|
grep -E "^Failed to find module .*foo-bar-baz" /tmp/out.log
|
||||||
(! grep -E "^Failed to find module .*foo-bar-baz" /tmp/out.log)
|
|
||||||
grep -E "^Failed to find module .*foo_bar_baz" /tmp/out.log
|
|
||||||
# Each module should be loaded only once, even if specified multiple times
|
# Each module should be loaded only once, even if specified multiple times
|
||||||
[[ "$(grep -Ec "^Inserted module" /tmp/out.log)" -eq 1 ]]
|
[[ "$(grep -Ec "^Inserted module" /tmp/out.log)" -eq 1 ]]
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user