Compare commits
13 Commits
e6ce785d61
...
b9cbb08e0a
Author | SHA1 | Date |
---|---|---|
Yu Watanabe | b9cbb08e0a | |
Zbigniew Jędrzejewski-Szmek | d407638382 | |
Roman Beranek | 07e4a8dc23 | |
Zbigniew Jędrzejewski-Szmek | 478f5aac07 | |
Zbigniew Jędrzejewski-Szmek | 1598b07da3 | |
Zbigniew Jędrzejewski-Szmek | 485a9202ba | |
Zbigniew Jędrzejewski-Szmek | 905a03e71d | |
Zbigniew Jędrzejewski-Szmek | de70ff66dc | |
Zbigniew Jędrzejewski-Szmek | dbc29e9175 | |
Zbigniew Jędrzejewski-Szmek | 7ad41997d1 | |
Zbigniew Jędrzejewski-Szmek | e375ceb640 | |
Zbigniew Jędrzejewski-Szmek | 2e5811521d | |
Zbigniew Jędrzejewski-Szmek | e318c2a444 |
9
NEWS
9
NEWS
|
@ -457,9 +457,7 @@ CHANGES WITH 247 in spe:
|
||||||
discipline in the [FlowQueuePIE] sections.
|
discipline in the [FlowQueuePIE] sections.
|
||||||
|
|
||||||
* systemd-networkd's .netdev files may now be used to create "BareUDP"
|
* systemd-networkd's .netdev files may now be used to create "BareUDP"
|
||||||
tunnels, configured in the new [BareUDP] setting. VXLAN tunnels may
|
tunnels, configured in the new [BareUDP] setting.
|
||||||
now be marked to be independent of any underlying network interface
|
|
||||||
via the new Independent= boolean setting.
|
|
||||||
|
|
||||||
* systemd-networkd's Gateway= setting in .network files now accepts the
|
* systemd-networkd's Gateway= setting in .network files now accepts the
|
||||||
special values "_dhcp4" and "_ipv6ra" to configure additional,
|
special values "_dhcp4" and "_ipv6ra" to configure additional,
|
||||||
|
@ -482,9 +480,8 @@ CHANGES WITH 247 in spe:
|
||||||
prefix will be announced through IPv6 router advertisement (IPv6 RA).
|
prefix will be announced through IPv6 router advertisement (IPv6 RA).
|
||||||
The setting is enabled by default.
|
The setting is enabled by default.
|
||||||
|
|
||||||
* systemd-networkd's .netdev files gained the Independent= boolean
|
* VXLAN tunnels may now be marked as independent of any underlying
|
||||||
setting in [VXLAN] section. When enabled, the vxlan interface will be
|
network interface via the new Independent= boolean setting.
|
||||||
created without underlying interfaces. Defaults to false.
|
|
||||||
|
|
||||||
* systemctl gained support for two new verbs: "service-log-level" and
|
* systemctl gained support for two new verbs: "service-log-level" and
|
||||||
"service-log-target" may be used on services that implement the
|
"service-log-target" may be used on services that implement the
|
||||||
|
|
|
@ -84,7 +84,7 @@
|
||||||
</row></thead>
|
</row></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<row><entry><varname>bond</varname></entry>
|
<row><entry><varname>bond</varname></entry>
|
||||||
<entry>A bond device is an aggregation of all its slave devices. See <ulink url="https://www.kernel.org/doc/Documentation/networking/bonding.txt">Linux Ethernet Bonding Driver HOWTO</ulink> for details.Local configuration</entry></row>
|
<entry>A bond device is an aggregation of all its slave devices. See <ulink url="https://www.kernel.org/doc/Documentation/networking/bonding.txt">Linux Ethernet Bonding Driver HOWTO</ulink> for details.</entry></row>
|
||||||
|
|
||||||
<row><entry><varname>bridge</varname></entry>
|
<row><entry><varname>bridge</varname></entry>
|
||||||
<entry>A bridge device is a software switch, and each of its slave devices and the bridge itself are ports of the switch.</entry></row>
|
<entry>A bridge device is a software switch, and each of its slave devices and the bridge itself are ports of the switch.</entry></row>
|
||||||
|
@ -754,7 +754,8 @@
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>Id=</varname></term>
|
<term><varname>Id=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Specifies the Virtual Network Identifier (VNI) to use. Ranges [0-16777215]. This field is mandatory.</para>
|
<para>Specifies the Virtual Network Identifier (VNI) to use, a number between 0 and 16777215. This
|
||||||
|
field is mandatory.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
|
@ -766,7 +767,7 @@
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>TOS=</varname></term>
|
<term><varname>TOS=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Specifies the TOS value to use in outgoing packets. Ranges [1-255].</para>
|
<para>Specifies the TOS value to use in outgoing packets. Takes a number between 1 and 255.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
|
@ -818,8 +819,9 @@
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>Independent=</varname></term>
|
<term><varname>Independent=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Takes a boolean. When true, the vxlan interface is created without underlying interfaces.
|
<para>Takes a boolean. When true, the vxlan interface is created without any underlying network
|
||||||
Defaults to <literal>false</literal>.</para>
|
interface. Defaults to false, which means that a .network file that requests this tunnel using
|
||||||
|
<varname>Tunnel=</varname> is required for the tunnel to be created.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
@ -1276,9 +1278,10 @@
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>Independent=</varname></term>
|
<term><varname>Independent=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Takes a boolean. When true tunnel does not require .network file. Created as "tunnel@NONE".
|
<para>Takes a boolean. When false (the default), the tunnel is always created over some network
|
||||||
Defaults to <literal>false</literal>.
|
device, and a .network file that requests this tunnel using <varname>Tunnel=</varname> is required
|
||||||
</para>
|
for the tunnel to be created. When true, the tunnel is created independently of any network as
|
||||||
|
"tunnel@NONE".</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
|
@ -1770,8 +1773,8 @@
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>AdActorSystem=</varname></term>
|
<term><varname>AdActorSystem=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Specifies the 802.3ad system mac address. This can not be either
|
<para>Specifies the 802.3ad system MAC address. This cannot be a null or multicast address.
|
||||||
<constant>NULL</constant> or <constant>Multicast</constant>.</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
@ -1948,10 +1951,8 @@
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>Independent=</varname></term>
|
<term><varname>Independent=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Takes a boolean. If set to <literal>no</literal>, the xfrm interface should have an
|
<para>Takes a boolean. If false (the default), the xfrm interface must have an underlying device
|
||||||
underlying device which can be used for hardware offloading. Defaults to <literal>no</literal>.
|
which can be used for hardware offloading.</para>
|
||||||
See <citerefentry><refentrytitle>systemd.network</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
|
||||||
for how to configure the underlying device.</para>
|
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
|
@ -1594,6 +1594,7 @@ generate_gperfs = find_program('tools/generate-gperfs.py')
|
||||||
|
|
||||||
subdir('po')
|
subdir('po')
|
||||||
subdir('catalog')
|
subdir('catalog')
|
||||||
|
subdir('src/libudev')
|
||||||
subdir('src/systemd')
|
subdir('src/systemd')
|
||||||
subdir('src/basic')
|
subdir('src/basic')
|
||||||
subdir('src/libsystemd')
|
subdir('src/libsystemd')
|
||||||
|
@ -1673,7 +1674,6 @@ update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
|
||||||
# usually, but not always, installed in /bin.
|
# usually, but not always, installed in /bin.
|
||||||
public_programs = []
|
public_programs = []
|
||||||
|
|
||||||
subdir('src/libudev')
|
|
||||||
subdir('src/shared')
|
subdir('src/shared')
|
||||||
subdir('src/core')
|
subdir('src/core')
|
||||||
subdir('src/shutdown')
|
subdir('src/shutdown')
|
||||||
|
|
|
@ -468,6 +468,10 @@ int device_new_from_nulstr(sd_device **ret, uint8_t *nulstr, size_t len) {
|
||||||
|
|
||||||
i += end - key + 1;
|
i += end - key + 1;
|
||||||
|
|
||||||
|
/* netlink messages for some devices contain an unwanted newline at the end of value.
|
||||||
|
* Let's drop the newline and remaining characters after the newline. */
|
||||||
|
truncate_nl(key);
|
||||||
|
|
||||||
r = device_append(device, key, &major, &minor);
|
r = device_append(device, key, &major, &minor);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
|
@ -469,7 +469,7 @@ int config_parse_ad_actor_system(
|
||||||
}
|
}
|
||||||
if (ether_addr_is_null(&n) || (n.ether_addr_octet[0] & 0x01)) {
|
if (ether_addr_is_null(&n) || (n.ether_addr_octet[0] & 0x01)) {
|
||||||
log_syntax(unit, LOG_WARNING, filename, line, 0,
|
log_syntax(unit, LOG_WARNING, filename, line, 0,
|
||||||
"Not a valid MAC address %s, can not be null or multicast. Ignoring assignment.",
|
"Not an appropriate MAC address %s, cannot be null or multicast. Ignoring assignment.",
|
||||||
rvalue);
|
rvalue);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1795,6 +1795,7 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata,
|
||||||
_cleanup_(dnssd_service_freep) DnssdService *service = NULL;
|
_cleanup_(dnssd_service_freep) DnssdService *service = NULL;
|
||||||
_cleanup_(sd_bus_track_unrefp) sd_bus_track *bus_track = NULL;
|
_cleanup_(sd_bus_track_unrefp) sd_bus_track *bus_track = NULL;
|
||||||
_cleanup_free_ char *path = NULL;
|
_cleanup_free_ char *path = NULL;
|
||||||
|
_cleanup_free_ char *instance_name = NULL;
|
||||||
Manager *m = userdata;
|
Manager *m = userdata;
|
||||||
DnssdService *s = NULL;
|
DnssdService *s = NULL;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -1835,10 +1836,6 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata,
|
||||||
if (!dnssd_srv_type_is_valid(type))
|
if (!dnssd_srv_type_is_valid(type))
|
||||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "DNS-SD service type '%s' is invalid", type);
|
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "DNS-SD service type '%s' is invalid", type);
|
||||||
|
|
||||||
r = dnssd_render_instance_name(name_template, NULL);
|
|
||||||
if (r < 0)
|
|
||||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "DNS-SD service name '%s' is invalid", name_template);
|
|
||||||
|
|
||||||
service->name = strdup(name);
|
service->name = strdup(name);
|
||||||
if (!service->name)
|
if (!service->name)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
@ -1851,6 +1848,10 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata,
|
||||||
if (!service->type)
|
if (!service->type)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
|
r = dnssd_render_instance_name(service, &instance_name);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
r = sd_bus_message_enter_container(message, SD_BUS_TYPE_ARRAY, "a{say}");
|
r = sd_bus_message_enter_container(message, SD_BUS_TYPE_ARRAY, "a{say}");
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
|
@ -217,19 +217,21 @@ int config_parse_search_domains(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int config_parse_dnssd_service_name(
|
int config_parse_dnssd_service_name(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) {
|
||||||
const char *unit,
|
static const Specifier specifier_table[] = {
|
||||||
const char *filename,
|
{ 'm', specifier_machine_id, NULL },
|
||||||
unsigned line,
|
{ 'b', specifier_boot_id, NULL },
|
||||||
const char *section,
|
{ 'H', specifier_host_name, NULL },
|
||||||
unsigned section_line,
|
{ 'v', specifier_kernel_release, NULL },
|
||||||
const char *lvalue,
|
{ 'a', specifier_architecture, NULL },
|
||||||
int ltype,
|
{ 'o', specifier_os_id, NULL },
|
||||||
const char *rvalue,
|
{ 'w', specifier_os_version_id, NULL },
|
||||||
void *data,
|
{ 'B', specifier_os_build_id, NULL },
|
||||||
void *userdata) {
|
{ 'W', specifier_os_variant_id, NULL },
|
||||||
|
{}
|
||||||
|
};
|
||||||
DnssdService *s = userdata;
|
DnssdService *s = userdata;
|
||||||
|
_cleanup_free_ char *name = NULL;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(filename);
|
assert(filename);
|
||||||
|
@ -238,23 +240,23 @@ int config_parse_dnssd_service_name(
|
||||||
assert(s);
|
assert(s);
|
||||||
|
|
||||||
if (isempty(rvalue)) {
|
if (isempty(rvalue)) {
|
||||||
s->name_template = mfree(s->name_template);
|
log_syntax(unit, LOG_ERR, filename, line, 0, "Service instance name can't be empty. Ignoring.");
|
||||||
return 0;
|
return -EINVAL;
|
||||||
}
|
|
||||||
|
|
||||||
r = dnssd_render_instance_name(rvalue, NULL);
|
|
||||||
if (r == -ENOMEM)
|
|
||||||
return log_oom();
|
|
||||||
if (r < 0) {
|
|
||||||
log_syntax(unit, LOG_WARNING, filename, line, r,
|
|
||||||
"Invalid service instance name template '%s', ignoring: %m", rvalue);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
r = free_and_strdup(&s->name_template, rvalue);
|
r = free_and_strdup(&s->name_template, rvalue);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
|
r = specifier_printf(s->name_template, specifier_table, NULL, &name);
|
||||||
|
if (r < 0)
|
||||||
|
return log_debug_errno(r, "Failed to replace specifiers: %m");
|
||||||
|
|
||||||
|
if (!dns_service_name_is_valid(name)) {
|
||||||
|
log_syntax(unit, LOG_ERR, filename, line, 0, "Service instance name template renders to invalid name '%s'. Ignoring.", name);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -155,7 +155,7 @@ static int specifier_dnssd_host_name(char specifier, const void *data, const voi
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dnssd_render_instance_name(const char *name_template, char **ret_name) {
|
int dnssd_render_instance_name(DnssdService *s, char **ret_name) {
|
||||||
static const Specifier specifier_table[] = {
|
static const Specifier specifier_table[] = {
|
||||||
{ 'm', specifier_machine_id, NULL },
|
{ 'm', specifier_machine_id, NULL },
|
||||||
{ 'b', specifier_boot_id, NULL },
|
{ 'b', specifier_boot_id, NULL },
|
||||||
|
@ -171,16 +171,18 @@ int dnssd_render_instance_name(const char *name_template, char **ret_name) {
|
||||||
_cleanup_free_ char *name = NULL;
|
_cleanup_free_ char *name = NULL;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(name_template);
|
assert(s);
|
||||||
|
assert(s->name_template);
|
||||||
|
|
||||||
r = specifier_printf(name_template, specifier_table, NULL, &name);
|
r = specifier_printf(s->name_template, specifier_table, s, &name);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return log_debug_errno(r, "Failed to replace specifiers: %m");
|
||||||
|
|
||||||
if (!dns_service_name_is_valid(name))
|
if (!dns_service_name_is_valid(name))
|
||||||
return -EINVAL;
|
return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||||
|
"Service instance name '%s' is invalid.",
|
||||||
|
name);
|
||||||
|
|
||||||
if (ret_name)
|
|
||||||
*ret_name = TAKE_PTR(name);
|
*ret_name = TAKE_PTR(name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -225,7 +227,7 @@ int dnssd_update_rrs(DnssdService *s) {
|
||||||
LIST_FOREACH(items, txt_data, s->txt_data_items)
|
LIST_FOREACH(items, txt_data, s->txt_data_items)
|
||||||
txt_data->rr = dns_resource_record_unref(txt_data->rr);
|
txt_data->rr = dns_resource_record_unref(txt_data->rr);
|
||||||
|
|
||||||
r = dnssd_render_instance_name(s->name_template, &n);
|
r = dnssd_render_instance_name(s, &n);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ DnssdTxtData *dnssd_txtdata_free_all(DnssdTxtData *txt_data);
|
||||||
DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdService*, dnssd_service_free);
|
DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdService*, dnssd_service_free);
|
||||||
DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdTxtData*, dnssd_txtdata_free);
|
DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdTxtData*, dnssd_txtdata_free);
|
||||||
|
|
||||||
int dnssd_render_instance_name(const char *name_template, char **ret_name);
|
int dnssd_render_instance_name(DnssdService *s, char **ret_name);
|
||||||
int dnssd_load(Manager *manager);
|
int dnssd_load(Manager *manager);
|
||||||
int dnssd_txt_item_new_from_string(const char *key, const char *value, DnsTxtItem **ret_item);
|
int dnssd_txt_item_new_from_string(const char *key, const char *value, DnsTxtItem **ret_item);
|
||||||
int dnssd_txt_item_new_from_data(const char *key, const void *value, const size_t size, DnsTxtItem **ret_item);
|
int dnssd_txt_item_new_from_data(const char *key, const void *value, const size_t size, DnsTxtItem **ret_item);
|
||||||
|
|
|
@ -64,9 +64,12 @@ if add_languages('cpp', required : false)
|
||||||
if cxx.has_argument('-std=c++17')
|
if cxx.has_argument('-std=c++17')
|
||||||
opts += [['c++', '-std=c++17']]
|
opts += [['c++', '-std=c++17']]
|
||||||
endif
|
endif
|
||||||
|
if cxx.has_argument('-std=c++20')
|
||||||
|
opts += [['c++', '-std=c++20']]
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
foreach header : _systemd_headers + _not_installed_headers + ['../libudev/libudev.h']
|
foreach header : _systemd_headers + _not_installed_headers + [libudev_h_path]
|
||||||
foreach opt : opts
|
foreach opt : opts
|
||||||
std_name = opt.length() == 2 ? '_'.join(opt[1].split(':')) : ''
|
std_name = opt.length() == 2 ? '_'.join(opt[1].split(':')) : ''
|
||||||
name = ''.join(['cc-', header.split('/')[-1], '_', opt[0], std_name])
|
name = ''.join(['cc-', header.split('/')[-1], '_', opt[0], std_name])
|
||||||
|
|
|
@ -18,11 +18,19 @@
|
||||||
|
|
||||||
use warnings;
|
use warnings;
|
||||||
use strict;
|
use strict;
|
||||||
use POSIX qw(WIFEXITED WEXITSTATUS);
|
|
||||||
use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR IPC_CREAT);
|
BEGIN {
|
||||||
use IPC::Semaphore;
|
my $EXIT_TEST_SKIP = 77;
|
||||||
use Time::HiRes qw(usleep);
|
|
||||||
|
unless (eval "use POSIX qw(WIFEXITED WEXITSTATUS);
|
||||||
use Cwd qw(getcwd abs_path);
|
use Cwd qw(getcwd abs_path);
|
||||||
|
use IPC::Semaphore;
|
||||||
|
use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR IPC_CREAT);
|
||||||
|
use Time::HiRes qw(usleep); 1") {
|
||||||
|
warn "Failed to import dependencies, skipping the test: $@";
|
||||||
|
exit($EXIT_TEST_SKIP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
my $udev_bin = "./test-udev";
|
my $udev_bin = "./test-udev";
|
||||||
my $valgrind = 0;
|
my $valgrind = 0;
|
||||||
|
|
Loading…
Reference in New Issue