1
0
mirror of https://github.com/systemd/systemd synced 2026-04-11 09:34:51 +02:00

Compare commits

..

No commits in common. "4bb3437cad715c40c1a183adbb3a7687ec6f6ac6" and "58f62d7079a3d77b859a25d585dd492531bda0a1" have entirely different histories.

26 changed files with 167 additions and 416 deletions

113
NEWS
View File

@ -237,9 +237,6 @@ CHANGES WITH 250 in spe:
* sd-boot will now build with SBAT by default in order to facilitate * sd-boot will now build with SBAT by default in order to facilitate
working with recent versions of Shim that require it to be present. working with recent versions of Shim that require it to be present.
* sd-boot can now parse Microsoft Windows' Boot Configuration Data.
This is used to robustly generate boot entry titles for Windows.
* A new generic target unit factory-reset.target has been added. It is * A new generic target unit factory-reset.target has been added. It is
hooked into systemd-logind similar in fashion to hooked into systemd-logind similar in fashion to
reboot/poweroff/suspend/hibernate, and is supposed to be used to reboot/poweroff/suspend/hibernate, and is supposed to be used to
@ -348,11 +345,6 @@ CHANGES WITH 250 in spe:
interfaces. The Kind= setting in .netdev file accepts "ipoib". And interfaces. The Kind= setting in .netdev file accepts "ipoib". And
systemd.netdev files gained the [IPoIB] section. systemd.netdev files gained the [IPoIB] section.
* systemd-networkd and systemd-udevd now support net.ifname-policy=
option on the kernel command-line. This is implemented through the
systemd-network-generator service that automatically generates
appropriate .link, .network, and .netdev files.
* systemd-networkd's handling of Endpoint= resolution for WireGuard * systemd-networkd's handling of Endpoint= resolution for WireGuard
interfaces has been improved. interfaces has been improved.
@ -490,17 +482,14 @@ CHANGES WITH 250 in spe:
".dtb" and apply it before invoking the kernel. ".dtb" and apply it before invoking the kernel.
* sd-stub (the EFI stub that can be glued in front of a Linux kernel) * sd-stub (the EFI stub that can be glued in front of a Linux kernel)
gained the ability to pick up credentials and sysext files, wrap them gained the ability to pick up credentials and sysext files placed
in a cpio archive, and pass as an additional initrd to the invoked next to the kernel image file, wrap them in a cpio archive and pass
Linux kernel, in effect placing those files in the /.extra/ directory as an additional initrd to the invoked Linux kernel, in effect
of the initrd environment. This is useful to implement trusted initrd placing those files in the /.extra/ directory of the initrd
environments which are fully authenticated but still can be extended environment. This is useful to implement trusted initrd environments
(via sysexts) and parameterized (via encrypted/authenticated which are fully authenticated but still can be extended (via sysexts)
credentials, see above). and parameterized (via encrypted/authenticated credentials, see
above).
Credentials can be located next to the kernel image file (credentials
specific to a single boot entry), or in one of the shared directories
(credentials applicable to multiple boot entries).
* sd-stub now comes with a full man page, that explains its feature set * sd-stub now comes with a full man page, that explains its feature set
and how to combine a kernel image, an initrd and the stub to build a and how to combine a kernel image, an initrd and the stub to build a
@ -515,8 +504,6 @@ CHANGES WITH 250 in spe:
may be used to set the boot menu time-out of the boot loader (for all may be used to set the boot menu time-out of the boot loader (for all
or just the subsequent boot). or just the subsequent boot).
* bootctl and systemd-bless-boot can now be linked statically.
* systemd-sysext now optionally doesn't insist on extension-release.d/ * systemd-sysext now optionally doesn't insist on extension-release.d/
files being placed in the image under the image's file name. If the files being placed in the image under the image's file name. If the
file system xattr user.extension-release.strict is set on the file system xattr user.extension-release.strict is set on the
@ -543,9 +530,6 @@ CHANGES WITH 250 in spe:
* A new rule to allow console users access to rfkill by default has been * A new rule to allow console users access to rfkill by default has been
added to hwdb. added to hwdb.
* Device nodes for the Software Guard eXtension enclaves (sgx_vepc) are
now also owned by the system group "sgx".
* A new build-time meson option "extra-net-naming-schemes=" has been * A new build-time meson option "extra-net-naming-schemes=" has been
added to define additional naming schemes schemes for udev's network added to define additional naming schemes schemes for udev's network
interface naming logic. This is useful for enterprise distributions interface naming logic. This is useful for enterprise distributions
@ -684,14 +668,6 @@ CHANGES WITH 250 in spe:
* The x-systemd.makefs option in /etc/fstab now explicitly supports * The x-systemd.makefs option in /etc/fstab now explicitly supports
ext2, ext3, and f2fs file systems. ext2, ext3, and f2fs file systems.
* Mount units and units generated from /etc/fstab entries with 'noauto'
are now ordered the same as other units. Effectively, they will be
started earlier (if something actually pulled them in) and stopped
later, similarly to normal mount units that are part of
fs-local.target. This change should be invisibile to users, but
should prevent those units from being stopped too early during
shutdown.
* The systemd-getty-generator now honors a new kernel command line * The systemd-getty-generator now honors a new kernel command line
argument systemd.getty_auto= and a new environment variable argument systemd.getty_auto= and a new environment variable
$SYSTEMD_GETTY_AUTO that allows turning it off at boot. This is for $SYSTEMD_GETTY_AUTO that allows turning it off at boot. This is for
@ -765,43 +741,41 @@ CHANGES WITH 250 in spe:
this repository. It also contains the text of all applicable this repository. It also contains the text of all applicable
licenses as they appear on spdx.org. licenses as they appear on spdx.org.
Contributions from: Aakash Singh, acsfer, Adolfo Jayme Barrientos, Contributions from: Aakash Singh, Adolfo Jayme Barrientos, Albert Brox,
Adrian Vovk, Albert Brox, Alberto Mardegan, Alexander Kanavin, Alberto Mardegan, Alexander Kanavin, alexlzhu, Alfonso Sánchez-Beato,
alexlzhu, Alfonso Sánchez-Beato, Alvin Šipraga, Alyssa Ross, Alvin Šipraga, Alyssa Ross, Amir Omidi, Anatol Pomozov,
Amir Omidi, Anatol Pomozov, Andika Triwidada, Andreas Rammhold, Andika Triwidada, Andreas Rammhold, Andreas Valder, Andrej Lajovic,
Andreas Valder, Andrej Lajovic, Andrew Soutar, Andrew Stone, Andy Chi, Andrew Soutar, Andrew Stone, Andy Chi, Anita Zhang, Anssi Hannula,
Anita Zhang, Anssi Hannula, Antonio Alvarez Feijoo, Antonio Alvarez Feijoo, Antony Deepak Thomas, Arnaud Ferraris,
Antony Deepak Thomas, Arnaud Ferraris, Arvid E. Picciani, Arvid E. Picciani, Bastien Nocera, Benjamin Berg,
Bastien Nocera, Benjamin Berg, Benjamin Herrenschmidt, Ben Stockett, Benjamin Herrenschmidt, Ben Stockett, Bogdan Seniuc, Boqun Feng,
Bogdan Seniuc, Boqun Feng, Carl Lei, chlorophyll-zz, Chris Packham, Carl Lei, chlorophyll-zz, Chris Packham, Christian Brauner,
Christian Brauner, Christian Göttsche, Christian Wehrli, Christian Göttsche, Christian Wehrli, Christoph Anton Mitterer,
Christoph Anton Mitterer, Cristian Rodríguez, Daan De Meyer, Cristian Rodríguez, Daan De Meyer, Daniel Maixner, Dann Frazier,
Daniel Maixner, Dann Frazier, Dan Streetman, Davide Cavalca, Dan Streetman, David Seifert, David Tardon, dependabot[bot],
David Seifert, David Tardon, dependabot[bot], Dimitri John Ledkov, Dimitri John Ledkov, Dimitri Papadopoulos, Dimitry Ishenko,
Dimitri Papadopoulos, Dimitry Ishenko, Dmitry Khlebnikov, Dmitry Khlebnikov, Dominique Martinet, duament, Egor, Egor Ignatov,
Dominique Martinet, duament, Egor, Egor Ignatov, Emil Renner Berthing, Emil Renner Berthing, Emily Gonyer, Ettore Atalan, Evgeny Vereshchagin,
Emily Gonyer, Ettore Atalan, Evgeny Vereshchagin, Florian Klink, Florian Klink, Franck Bui, Frantisek Sumsal, Geass-LL, Gibeom Gwon,
Franck Bui, Frantisek Sumsal, Geass-LL, Gibeom Gwon, GnunuX, GnunuX, Gogo Gogsi, gregzuro, Greg Zuro, Gustavo Costa, Hans de Goede,
Gogo Gogsi, gregzuro, Greg Zuro, Gustavo Costa, Hans de Goede,
Hela Basa, Henri Chain, hikigaya58, Hugo Carvalho, Hela Basa, Henri Chain, hikigaya58, Hugo Carvalho,
Hugo Osvaldo Barrera, Iago Lopez Galeiras, Iago López Galeiras, Hugo Osvaldo Barrera, Iago Lopez Galeiras, Iago López Galeiras,
I-dont-need-name, igo95862, Jack Dähn, James Hilliard, Jan Janssen, I-dont-need-name, Jack Dähn, James Hilliard, Jan Janssen,
Jan Kuparinen, Jan Macku, Jan Palus, Jarkko Sakkinen, Jayce Fayne, Jan Kuparinen, Jan Macku, Jan Palus, jiangchuangang, jlempen,
jiangchuangang, jlempen, John Lindgren, Jonas Dreßler, Jonas Jelten, John Lindgren, Jonas Dreßler, Jonas Witschel, Joris Hartog,
Jonas Witschel, Joris Hartog, José Expósito, Julia Kartseva, José Expósito, Julia Kartseva, Kai-Heng Feng, Kai Wohlfahrt,
Kai-Heng Feng, Kai Wohlfahrt, Kay Siver Bø, KennthStailey, Kay Siver Bø, KennthStailey, Kevin Kuehler, Kevin Orr, Khem Raj,
Kevin Kuehler, Kevin Orr, Khem Raj, Kristian Klausen, Kyle Laker, Kristian Klausen, Kyle Laker, lainahai, Lennart Poettering,
lainahai, LaserEyess, Lennart Poettering, Lia Lenckowski, longpanda, Lia Lenckowski, longpanda, Luca Boccassi, Luca BRUNO, Ludwig Nussel,
Luca Boccassi, Luca BRUNO, Ludwig Nussel, Lukas Senionis, Lukas Senionis, Maanya Goenka, Maciek Borzecki, Marcel Menzel,
Maanya Goenka, Maciek Borzecki, Marcel Menzel, Marco Scardovi, Marco Scardovi, Marcus Harrison, Mark Boudreau, Matthijs van Duin,
Marcus Harrison, Mark Boudreau, Matthijs van Duin, Mauricio Vásquez, Mauricio Vásquez, Maxime de Roucy, Max Resch, MertsA, Michael Biebl,
Maxime de Roucy, Max Resch, MertsA, Michael Biebl, Michael Catanzaro, Michael Catanzaro, Michal Koutný, Michal Sekletár, Miika Karanki,
Michal Koutný, Michal Sekletár, Miika Karanki, Mike Gilbert, Mike Gilbert, Milo Turner, ml, monosans, Nacho Barrientos, nassir90,
Milo Turner, ml, monosans, Nacho Barrientos, nassir90, Nishal Kulkarni,
nl6720, Ondrej Kozina, Paulo Neves, Pavel Březina, pedro martelletto, nl6720, Ondrej Kozina, Paulo Neves, Pavel Březina, pedro martelletto,
Peter Hutterer, Peter Morrow, Piotr Drąg, Rasmus Villemoes, ratijas, Peter Hutterer, Peter Morrow, Piotr Drąg, Rasmus Villemoes, ratijas,
Raul Tambre, rene, Riccardo Schirone, Robert-L-Turner, Robert Scheck, Raul Tambre, rene, Riccardo Schirone, Robert-L-Turner, Ross Jennings,
Ross Jennings, saikat0511, Scott Lamb, Sergei Trofimovich, Sho Iizuka, saikat0511, Scott Lamb, Sergei Trofimovich, Sho Iizuka,
Slava Bacherikov, Slimane Selyan Amiri, StefanBruens, Steven Siloti, Slava Bacherikov, Slimane Selyan Amiri, StefanBruens, Steven Siloti,
svonohr, Taiki Sugawara, Takashi Sakamoto, Takuro Onoue, Thomas Blume, svonohr, Taiki Sugawara, Takashi Sakamoto, Takuro Onoue, Thomas Blume,
Thomas Haller, Thomas Mühlbacher, Tianlu Shao, Toke Høiland-Jørgensen, Thomas Haller, Thomas Mühlbacher, Tianlu Shao, Toke Høiland-Jørgensen,
@ -6427,15 +6401,6 @@ CHANGES WITH 234:
temporary directory is passed as the entry directory and removed temporary directory is passed as the entry directory and removed
after all the plugins exit. after all the plugins exit.
* If KERNEL_INSTALL_MACHINE_ID is set in /etc/machine-info, kernel-install
will now use its value as the machine ID instead of the machine ID
from /etc/machine-id. If KERNEL_INSTALL_MACHINE_ID isn't set in
/etc/machine-info and no machine ID is set in /etc/machine-id,
kernel-install will try to store the current machine ID there as
KERNEL_INSTALL_MACHINE_ID. If there is no machine ID, kernel-install
will generate a new UUID, store it in /etc/machine-info as
KERNEL_INSTALL_MACHINE_ID and use it as the machine ID.
Contributions from: Adrian Heine né Lang, Aggelos Avgerinos, Alexander Contributions from: Adrian Heine né Lang, Aggelos Avgerinos, Alexander
Kurtz, Alexandros Frantzis, Alexey Brodkin, Alex Lu, Amir Pakdel, Amir Kurtz, Alexandros Frantzis, Alexey Brodkin, Alex Lu, Amir Pakdel, Amir
Yalon, Anchor Cat, Anthony Parsons, Bastien Nocera, Benjamin Gilbert, Yalon, Anchor Cat, Anthony Parsons, Bastien Nocera, Benjamin Gilbert,

View File

@ -228,18 +228,6 @@
<command>kernel-install</command> will use <literal>Default</literal> instead.</para> <command>kernel-install</command> will use <literal>Default</literal> instead.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term>
<filename>/etc/machine-info</filename>
</term>
<listitem>
<para>If this file contains the <varname>KERNEL_INSTALL_MACHINE_ID</varname> variable,
<command>kernel-install</command> will use it as <replaceable>MACHINE-ID</replaceable> instead of
the contents of <filename>/etc/machine-id</filename>. If the variable is not found in
<filename>/etc/machine-info</filename>, <command>kernel-install</command> will try to save the
machine ID it uses to install to <varname>$BOOT</varname> to this file.</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term> <term>
<filename>/etc/os-release</filename> <filename>/etc/os-release</filename>

View File

@ -128,16 +128,6 @@
specific as <literal>Left Rack, 2nd Shelf</literal>. specific as <literal>Left Rack, 2nd Shelf</literal>.
</para></listitem> </para></listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><varname>KERNEL_INSTALL_MACHINE_ID=</varname></term>
<listitem><para>Specifies the installation-specific installation directory
<command>kernel-install</command> should use. The value must be a valid machine ID (32 hexadecimal
characters). This would generally be the original machine-id that was used when the boot loader
entries for this installation were first added. When not set, the current value of
<cite>machine-id(5)</cite> will be used.</para></listitem>
</varlistentry>
</variablelist> </variablelist>
</refsect1> </refsect1>

View File

@ -929,7 +929,10 @@ manpages = [
''], ''],
['systemd-modules-load.service', '8', ['systemd-modules-load'], 'HAVE_KMOD'], ['systemd-modules-load.service', '8', ['systemd-modules-load'], 'HAVE_KMOD'],
['systemd-mount', '1', ['systemd-umount'], ''], ['systemd-mount', '1', ['systemd-umount'], ''],
['systemd-network-generator.service', '8', ['systemd-network-generator'], ''], ['systemd-network-generator.service',
'8',
['systemd-network-generator'],
'ENABLE_NETWORKD'],
['systemd-networkd-wait-online.service', ['systemd-networkd-wait-online.service',
'8', '8',
['systemd-networkd-wait-online'], ['systemd-networkd-wait-online'],

View File

@ -3,7 +3,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<!-- SPDX-License-Identifier: LGPL-2.1-or-later --> <!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
<refentry id="systemd-network-generator.service"> <refentry id="systemd-network-generator.service" conditional='ENABLE_NETWORKD'>
<refentryinfo> <refentryinfo>
<title>systemd-network-generator.service</title> <title>systemd-network-generator.service</title>
@ -59,7 +59,6 @@
<varlistentry> <varlistentry>
<term><varname>ifname=</varname></term> <term><varname>ifname=</varname></term>
<term><varname>net.ifname-policy=</varname></term>
<listitem> <listitem>
<para>— translated into <para>— translated into
<citerefentry><refentrytitle>systemd.link</refentrytitle><manvolnum>5</manvolnum></citerefentry> files.</para> <citerefentry><refentrytitle>systemd.link</refentrytitle><manvolnum>5</manvolnum></citerefentry> files.</para>
@ -89,8 +88,6 @@
<para>See <para>See
<citerefentry project='man-pages'><refentrytitle>dracut.kernel</refentrytitle><manvolnum>7</manvolnum></citerefentry> <citerefentry project='man-pages'><refentrytitle>dracut.kernel</refentrytitle><manvolnum>7</manvolnum></citerefentry>
and
<citerefentry><refentrytitle>systemd-udevd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
for option syntax and details.</para> for option syntax and details.</para>
</refsect1> </refsect1>

View File

@ -224,45 +224,6 @@
appear, which affects older name derivation algorithms, too.</para> appear, which affects older name derivation algorithms, too.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><varname>net.ifname-policy=<replaceable>policy1</replaceable>[,<replaceable>policy2</replaceable>,…][,<replaceable>MAC</replaceable>]</varname></term>
<listitem>
<para>Specifies naming policies applied when renaming network interfaces. Takes a list of
policies and an optional MAC address separated with comma. Each policy value must be one of
the policies understood by the <varname>NamePolicy=</varname> setting in .link files, e.g.
<literal>onboard</literal> or <literal>path</literal>. See
<citerefentry><refentrytitle>systemd.link</refentrytitle><manvolnum>5</manvolnum></citerefentry>
for more details. When the MAC address is specified, the policies are applied to the
interface which has the address. When no MAC address is specified, the policies are applied
to all interfaces. This kernel command line argument can be specified multiple times. This
argument is not directly read from <command>systemd-udevd</command>, but read and converted
to a .link file by <command>systemd-network-generator</command>. So, to make this argument
take effect, <filename>systemd-network-generator.service</filename> must be enabled and
started before starting <filename>systemd-udevd.service</filename>. See
<citerefentry><refentrytitle>systemd-network-generator.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
for more details about the service.</para>
<para>Example:
<programlisting>net.ifname-policy=keep,kernel,path,slot,onboard,01:23:45:67:89:ab
net.ifname-policy=keep,kernel,path,slot,onboard,mac</programlisting>
This is mostly equivalent to creating the following .link files:
<programlisting># 91-name-policy-with-mac.link
[Match]
MACAddress=01:23:45:67:89:ab
[Link]
NamePolicy=keep kernel path slot onboard
AlternativeNamePolicy=path slot onboard</programlisting>
and
<programlisting># 92-name-policy-for-all.link
[Match]
OriginalName=*
[Link]
NamePolicy=keep kernel path slot onboard mac
AlternativeNamePolicy=path slot onboard mac</programlisting>
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
<!-- when adding entries here, consider also adding them in kernel-command-line.xml --> <!-- when adding entries here, consider also adding them in kernel-command-line.xml -->
</refsect1> </refsect1>

View File

@ -3467,22 +3467,22 @@ if conf.get('ENABLE_NETWORKD') == 1
install_rpath : rootlibexecdir, install_rpath : rootlibexecdir,
install : true, install : true,
install_dir : rootbindir) install_dir : rootbindir)
endif
exe = executable( exe = executable(
'systemd-network-generator', 'systemd-network-generator',
network_generator_sources, network_generator_sources,
include_directories : includes, include_directories : includes,
link_with : [networkd_link_with], link_with : [networkd_link_with],
install_rpath : rootlibexecdir, install_rpath : rootlibexecdir,
install : true, install : true,
install_dir : rootlibexecdir) install_dir : rootlibexecdir)
if want_tests != 'false' if want_tests != 'false'
test('test-network-generator-conversion', test('test-network-generator-conversion',
test_network_generator_conversion_sh, test_network_generator_conversion_sh,
# https://github.com/mesonbuild/meson/issues/2681 # https://github.com/mesonbuild/meson/issues/2681
args : exe.full_path()) args : exe.full_path())
endif
endif endif
executable( executable(

View File

@ -90,18 +90,10 @@ if [[ ! $COMMAND ]] || [[ ! $KERNEL_VERSION ]]; then
exit 1 exit 1
fi fi
# Prefer to use an existing machine ID from /etc/machine-info or /etc/machine-id. If we're using the machine [ -z "$MACHINE_ID" ] && [ -f /etc/machine-id ] && [ "$(stat -fc %T /etc/machine-id)" != "tmpfs" ] && read -r MACHINE_ID < /etc/machine-id
# ID /etc/machine-id, try to persist it in /etc/machine-info. If no machine ID is found, try to generate
# a new machine ID in /etc/machine-info. If that fails, use "Default".
[ -z "$MACHINE_ID" ] && [ -f /etc/machine-info ] && source /etc/machine-info && MACHINE_ID="$KERNEL_INSTALL_MACHINE_ID"
[ -z "$MACHINE_ID" ] && [ -f /etc/machine-id ] && read -r MACHINE_ID </etc/machine-id
[ -n "$MACHINE_ID" ] && [ -z "$KERNEL_INSTALL_MACHINE_ID" ] && echo "KERNEL_INSTALL_MACHINE_ID=$MACHINE_ID" >>/etc/machine-info
[ -z "$MACHINE_ID" ] && NEW_MACHINE_ID="$(systemd-id128 new)" && echo "KERNEL_INSTALL_MACHINE_ID=$NEW_MACHINE_ID" >>/etc/machine-info
[ -z "$MACHINE_ID" ] && [ -f /etc/machine-info ] && source /etc/machine-info && MACHINE_ID="$KERNEL_INSTALL_MACHINE_ID"
[ -z "$MACHINE_ID" ] && MACHINE_ID="Default" [ -z "$MACHINE_ID" ] && MACHINE_ID="Default"
[ -z "$BOOT_ROOT" ] && for suff in "$MACHINE_ID" "loader/entries"; do [ -z "$BOOT_ROOT" ] && for suff in "$MACHINE_ID" "Default" "loader/entries"; do
for pref in "/efi" "/boot/efi" "/boot"; do for pref in "/efi" "/boot/efi" "/boot"; do
if [ -d "$pref/$suff" ]; then if [ -d "$pref/$suff" ]; then
BOOT_ROOT="$pref" BOOT_ROOT="$pref"

View File

@ -65,10 +65,9 @@ static int link_save(Link *link, const char *dest_dir) {
assert(link); assert(link);
filename = strjoin(!isempty(link->ifname) ? "90" : r = asprintf(&filename, "90-%s.link",
!hw_addr_is_null(&link->mac) ? "91" : "92", link->ifname);
"-", link->filename, ".link"); if (r < 0)
if (!filename)
return log_oom(); return log_oom();
r = generator_open_unit_file(dest_dir, "kernel command line", filename, &f); r = generator_open_unit_file(dest_dir, "kernel command line", filename, &f);
@ -105,7 +104,7 @@ static int context_save(Context *context) {
r = k; r = k;
} }
HASHMAP_FOREACH(link, context->links_by_filename) { HASHMAP_FOREACH(link, context->links_by_name) {
k = link_save(link, p); k = link_save(link, p);
if (k < 0 && r >= 0) if (k < 0 && r >= 0)
r = k; r = k;

View File

@ -1,11 +1,11 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "ether-addr-util.h"
#include "fd-util.h" #include "fd-util.h"
#include "fileio.h" #include "fileio.h"
#include "hostname-util.h" #include "hostname-util.h"
#include "log.h" #include "log.h"
#include "macro.h" #include "macro.h"
#include "netif-naming-scheme.h"
#include "network-generator.h" #include "network-generator.h"
#include "parse-util.h" #include "parse-util.h"
#include "proc-cmdline.h" #include "proc-cmdline.h"
@ -26,7 +26,6 @@
# .link # .link
ifname=<interface>:<MAC> ifname=<interface>:<MAC>
net.ifname-policy=policy1[,policy2,...][,<MAC>] # This is an original rule, not supported by other tools.
# .netdev # .netdev
vlan=<vlanname>:<phydevice> vlan=<vlanname>:<phydevice>
@ -265,59 +264,36 @@ static Link *link_free(Link *link) {
if (!link) if (!link)
return NULL; return NULL;
free(link->filename);
free(link->ifname); free(link->ifname);
strv_free(link->policies);
strv_free(link->alt_policies);
return mfree(link); return mfree(link);
} }
DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free); DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free);
static int link_new( static int link_new(Context *context, const char *name, struct ether_addr *mac, Link **ret) {
Context *context,
const char *name,
const struct hw_addr_data *mac,
Link **ret) {
_cleanup_(link_freep) Link *link = NULL; _cleanup_(link_freep) Link *link = NULL;
_cleanup_free_ char *ifname = NULL, *filename = NULL; _cleanup_free_ char *ifname = NULL;
int r; int r;
assert(context); assert(context);
assert(mac);
if (name) { if (!ifname_valid(name))
if (!ifname_valid(name)) return -EINVAL;
return -EINVAL;
ifname = strdup(name); ifname = strdup(name);
if (!ifname) if (!ifname)
return -ENOMEM; return -ENOMEM;
filename = strdup(name);
if (!filename)
return -ENOMEM;
}
if (!filename) {
filename = strdup(hw_addr_is_null(mac) ? "default" :
HW_ADDR_TO_STR_FULL(mac, HW_ADDR_TO_STRING_NO_COLON));
if (!filename)
return -ENOMEM;
}
link = new(Link, 1); link = new(Link, 1);
if (!link) if (!link)
return -ENOMEM; return -ENOMEM;
*link = (Link) { *link = (Link) {
.filename = TAKE_PTR(filename),
.ifname = TAKE_PTR(ifname), .ifname = TAKE_PTR(ifname),
.mac = *mac, .mac = *mac,
}; };
r = hashmap_ensure_put(&context->links_by_filename, &string_hash_ops, link->filename, link); r = hashmap_ensure_put(&context->links_by_name, &string_hash_ops, link->ifname, link);
if (r < 0) if (r < 0)
return r; return r;
@ -328,10 +304,8 @@ static int link_new(
return 0; return 0;
} }
Link *link_get(Context *context, const char *filename) { Link *link_get(Context *context, const char *ifname) {
assert(context); return hashmap_get(context->links_by_name, ifname);
assert(filename);
return hashmap_get(context->links_by_filename, filename);
} }
static int network_set_dhcp_type(Context *context, const char *ifname, const char *dhcp_type) { static int network_set_dhcp_type(Context *context, const char *ifname, const char *dhcp_type) {
@ -922,7 +896,7 @@ static int parse_cmdline_bond(Context *context, const char *key, const char *val
} }
static int parse_cmdline_ifname(Context *context, const char *key, const char *value) { static int parse_cmdline_ifname(Context *context, const char *key, const char *value) {
struct hw_addr_data mac; struct ether_addr mac;
const char *name, *p; const char *name, *p;
int r; int r;
@ -937,72 +911,13 @@ static int parse_cmdline_ifname(Context *context, const char *key, const char *v
name = strndupa_safe(value, p - value); name = strndupa_safe(value, p - value);
r = parse_hw_addr(p + 1, &mac); r = parse_ether_addr(p + 1, &mac);
if (r < 0) if (r < 0)
return r; return r;
return link_new(context, name, &mac, NULL); return link_new(context, name, &mac, NULL);
} }
static int parse_cmdline_ifname_policy(Context *context, const char *key, const char *value) {
_cleanup_strv_free_ char **policies = NULL, **alt_policies = NULL;
struct hw_addr_data mac = HW_ADDR_NULL;
Link *link;
int r;
/* net.ifname-policy=policy1[,policy2,...][,<MAC>] */
if (proc_cmdline_value_missing(key, value))
return -EINVAL;
for (const char *q = value; ; ) {
_cleanup_free_ char *word = NULL;
NamePolicy p;
r = extract_first_word(&q, &word, ",", 0);
if (r == 0)
break;
if (r < 0)
return r;
p = name_policy_from_string(word);
if (p < 0) {
r = parse_hw_addr(word, &mac);
if (r < 0)
return r;
if (hw_addr_is_null(&mac))
return -EINVAL;
if (!isempty(q))
return -EINVAL;
break;
}
if (alternative_names_policy_from_string(word) >= 0) {
r = strv_extend(&alt_policies, word);
if (r < 0)
return r;
}
r = strv_consume(&policies, TAKE_PTR(word));
if (r < 0)
return r;
}
if (strv_isempty(policies))
return -EINVAL;
r = link_new(context, NULL, &mac, &link);
if (r < 0)
return r;
link->policies = TAKE_PTR(policies);
link->alt_policies = TAKE_PTR(alt_policies);
return 0;
}
int parse_cmdline_item(const char *key, const char *value, void *data) { int parse_cmdline_item(const char *key, const char *value, void *data) {
Context *context = data; Context *context = data;
@ -1025,8 +940,6 @@ int parse_cmdline_item(const char *key, const char *value, void *data) {
return parse_cmdline_bond(context, key, value); return parse_cmdline_bond(context, key, value);
if (streq(key, "ifname")) if (streq(key, "ifname"))
return parse_cmdline_ifname(context, key, value); return parse_cmdline_ifname(context, key, value);
if (streq(key, "net.ifname-policy"))
return parse_cmdline_ifname_policy(context, key, value);
return 0; return 0;
} }
@ -1078,7 +991,7 @@ void context_clear(Context *context) {
hashmap_free_with_destructor(context->networks_by_name, network_free); hashmap_free_with_destructor(context->networks_by_name, network_free);
hashmap_free_with_destructor(context->netdevs_by_name, netdev_free); hashmap_free_with_destructor(context->netdevs_by_name, netdev_free);
hashmap_free_with_destructor(context->links_by_filename, link_free); hashmap_free_with_destructor(context->links_by_name, link_free);
} }
static int address_dump(Address *address, FILE *f) { static int address_dump(Address *address, FILE *f) {
@ -1204,27 +1117,13 @@ void link_dump(Link *link, FILE *f) {
fputs("[Match]\n", f); fputs("[Match]\n", f);
if (!hw_addr_is_null(&link->mac)) if (!ether_addr_is_null(&link->mac))
fprintf(f, "MACAddress=%s\n", HW_ADDR_TO_STR(&link->mac)); fprintf(f, "MACAddress=%s\n", ETHER_ADDR_TO_STR(&link->mac));
else
fputs("OriginalName=*\n", f);
fputs("\n[Link]\n", f); fprintf(f,
"\n[Link]\n"
if (!isempty(link->ifname)) "Name=%s\n",
fprintf(f, "Name=%s\n", link->ifname); link->ifname);
if (!strv_isempty(link->policies)) {
fputs("NamePolicy=", f);
fputstrv(f, link->policies, " ", NULL);
fputc('\n', f);
}
if (!strv_isempty(link->alt_policies)) {
fputs("AlternativeNamesPolicy=", f);
fputstrv(f, link->alt_policies, " ", NULL);
fputc('\n', f);
}
} }
int network_format(Network *network, char **ret) { int network_format(Network *network, char **ret) {

View File

@ -1,9 +1,9 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once #pragma once
#include <net/ethernet.h>
#include <stdio.h> #include <stdio.h>
#include "ether-addr-util.h"
#include "hashmap.h" #include "hashmap.h"
#include "in-addr-util.h" #include "in-addr-util.h"
#include "list.h" #include "list.h"
@ -81,21 +81,15 @@ struct NetDev {
}; };
struct Link { struct Link {
char *filename;
/* [Match] */ /* [Match] */
struct hw_addr_data mac;
/* [Link] */
char *ifname; char *ifname;
char **policies; struct ether_addr mac;
char **alt_policies;
}; };
typedef struct Context { typedef struct Context {
Hashmap *networks_by_name; Hashmap *networks_by_name;
Hashmap *netdevs_by_name; Hashmap *netdevs_by_name;
Hashmap *links_by_filename; Hashmap *links_by_name;
} Context; } Context;
int parse_cmdline_item(const char *key, const char *value, void *data); int parse_cmdline_item(const char *key, const char *value, void *data);
@ -110,6 +104,6 @@ NetDev *netdev_get(Context *context, const char *ifname);
void netdev_dump(NetDev *netdev, FILE *f); void netdev_dump(NetDev *netdev, FILE *f);
int netdev_format(NetDev *netdev, char **ret); int netdev_format(NetDev *netdev, char **ret);
Link *link_get(Context *context, const char *filename); Link *link_get(Context *context, const char *ifname);
void link_dump(Link *link, FILE *f); void link_dump(Link *link, FILE *f);
int link_format(Link *link, char **ret); int link_format(Link *link, char **ret);

View File

@ -49,14 +49,14 @@ static void test_netdev_one(const char *ifname, const char *key, const char *val
assert_se(streq(output, expected)); assert_se(streq(output, expected));
} }
static void test_link_one(const char *filename, const char *key, const char *value, const char *expected) { static void test_link_one(const char *ifname, const char *key, const char *value, const char *expected) {
_cleanup_(context_clear) Context context = {}; _cleanup_(context_clear) Context context = {};
_cleanup_free_ char *output = NULL; _cleanup_free_ char *output = NULL;
Link *link; Link *link;
printf("# %s=%s\n", key, value); printf("# %s=%s\n", key, value);
assert_se(parse_cmdline_item(key, value, &context) >= 0); assert_se(parse_cmdline_item(key, value, &context) >= 0);
assert_se(link = link_get(&context, filename)); assert_se(link = link_get(&context, ifname));
assert_se(link_format(link, &output) >= 0); assert_se(link_format(link, &output) >= 0);
puts(output); puts(output);
assert_se(streq(output, expected)); assert_se(streq(output, expected));
@ -334,22 +334,6 @@ int main(int argc, char *argv[]) {
"Name=hogehoge\n" "Name=hogehoge\n"
); );
test_link_one("001122334455", "net.ifname-policy", "keep,kernel,database,onboard,slot,path,mac,00:11:22:33:44:55",
"[Match]\n"
"MACAddress=00:11:22:33:44:55\n"
"\n[Link]\n"
"NamePolicy=keep kernel database onboard slot path mac\n"
"AlternativeNamesPolicy=database onboard slot path mac\n"
);
test_link_one("default", "net.ifname-policy", "keep,kernel,database,onboard,slot,path,mac",
"[Match]\n"
"OriginalName=*\n"
"\n[Link]\n"
"NamePolicy=keep kernel database onboard slot path mac\n"
"AlternativeNamesPolicy=database onboard slot path mac\n"
);
test_network_two("eth0", test_network_two("eth0",
"ip", "192.168.0.10:192.168.0.2:192.168.0.1:255.255.255.0:hogehoge:eth0:on:10.10.10.10:10.10.10.11", "ip", "192.168.0.10:192.168.0.2:192.168.0.1:255.255.255.0:hogehoge:eth0:on:10.10.10.10:10.10.10.11",
"rd.route", "10.1.2.3/16:10.0.2.3", "rd.route", "10.1.2.3/16:10.0.2.3",

View File

@ -35,16 +35,15 @@ static int manager_add_dns_server_by_string(Manager *m, DnsServerType type, cons
if (r < 0) if (r < 0)
return r; return r;
/* By default, the port number is determined by the transaction feature level. /* Silently filter out 0.0.0.0, 127.0.0.53, 127.0.0.54 (our own stub DNS listener) */
if (!dns_server_address_valid(family, &address))
return 0;
/* By default, the port number is determined with the transaction feature level.
* See dns_transaction_port() and dns_server_port(). */ * See dns_transaction_port() and dns_server_port(). */
if (IN_SET(port, 53, 853)) if (IN_SET(port, 53, 853))
port = 0; port = 0;
/* Refuse 0.0.0.0, 127.0.0.53, 127.0.0.54 and the rest of our own stub DNS listeners. */
if (!dns_server_address_valid(family, &address) ||
manager_server_address_is_stub(m, family, &address, port ?: 53))
return -ELOOP;
/* Filter out duplicates */ /* Filter out duplicates */
s = dns_server_find(manager_get_first_dns_server(m, type), family, &address, port, ifindex, server_name); s = dns_server_find(manager_get_first_dns_server(m, type), family, &address, port, ifindex, server_name);
if (s) { if (s) {
@ -57,7 +56,7 @@ static int manager_add_dns_server_by_string(Manager *m, DnsServerType type, cons
return dns_server_new(m, NULL, type, NULL, family, &address, port, ifindex, server_name); return dns_server_new(m, NULL, type, NULL, family, &address, port, ifindex, server_name);
} }
int manager_parse_dns_server_string_and_warn(Manager *m, DnsServerType type, const char *string, bool ignore_self_quietly) { int manager_parse_dns_server_string_and_warn(Manager *m, DnsServerType type, const char *string) {
int r; int r;
assert(m); assert(m);
@ -67,16 +66,17 @@ int manager_parse_dns_server_string_and_warn(Manager *m, DnsServerType type, con
_cleanup_free_ char *word = NULL; _cleanup_free_ char *word = NULL;
r = extract_first_word(&string, &word, NULL, 0); r = extract_first_word(&string, &word, NULL, 0);
if (r <= 0) if (r < 0)
return r; return r;
if (r == 0)
break;
r = manager_add_dns_server_by_string(m, type, word); r = manager_add_dns_server_by_string(m, type, word);
if (r == -ELOOP) if (r < 0)
log_full(ignore_self_quietly ? LOG_DEBUG : LOG_INFO,
"DNS server string '%s' points to our own listener, ignoring.", word);
else if (r < 0)
log_warning_errno(r, "Failed to add DNS server address '%s', ignoring: %m", word); log_warning_errno(r, "Failed to add DNS server address '%s', ignoring: %m", word);
} }
return 0;
} }
static int manager_add_search_domain_by_string(Manager *m, const char *domain) { static int manager_add_search_domain_by_string(Manager *m, const char *domain) {
@ -121,13 +121,17 @@ int manager_parse_search_domains_and_warn(Manager *m, const char *string) {
_cleanup_free_ char *word = NULL; _cleanup_free_ char *word = NULL;
r = extract_first_word(&string, &word, NULL, EXTRACT_UNQUOTE); r = extract_first_word(&string, &word, NULL, EXTRACT_UNQUOTE);
if (r <= 0) if (r < 0)
return r; return r;
if (r == 0)
break;
r = manager_add_search_domain_by_string(m, word); r = manager_add_search_domain_by_string(m, word);
if (r < 0) if (r < 0)
log_warning_errno(r, "Failed to add search domain '%s', ignoring: %m", word); log_warning_errno(r, "Failed to add search domain '%s', ignoring: %m", word);
} }
return 0;
} }
int config_parse_dns_servers( int config_parse_dns_servers(
@ -155,7 +159,7 @@ int config_parse_dns_servers(
dns_server_unlink_all(manager_get_first_dns_server(m, ltype)); dns_server_unlink_all(manager_get_first_dns_server(m, ltype));
else { else {
/* Otherwise, add to the list */ /* Otherwise, add to the list */
r = manager_parse_dns_server_string_and_warn(m, ltype, rvalue, false); r = manager_parse_dns_server_string_and_warn(m, ltype, rvalue);
if (r < 0) { if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to parse DNS server string '%s', ignoring.", rvalue); "Failed to parse DNS server string '%s', ignoring.", rvalue);
@ -163,7 +167,8 @@ int config_parse_dns_servers(
} }
} }
/* If we have a manual setting, then we stop reading /etc/resolv.conf */ /* If we have a manual setting, then we stop reading
* /etc/resolv.conf */
if (ltype == DNS_SERVER_SYSTEM) if (ltype == DNS_SERVER_SYSTEM)
m->read_resolv_conf = false; m->read_resolv_conf = false;
if (ltype == DNS_SERVER_FALLBACK) if (ltype == DNS_SERVER_FALLBACK)
@ -205,7 +210,8 @@ int config_parse_search_domains(
} }
} }
/* If we have a manual setting, then we stop reading /etc/resolv.conf */ /* If we have a manual setting, then we stop reading
* /etc/resolv.conf */
m->read_resolv_conf = false; m->read_resolv_conf = false;
return 0; return 0;
@ -487,7 +493,7 @@ int manager_parse_config_file(Manager *m) {
return r; return r;
if (m->need_builtin_fallbacks) { if (m->need_builtin_fallbacks) {
r = manager_parse_dns_server_string_and_warn(m, DNS_SERVER_FALLBACK, DNS_SERVERS, false); r = manager_parse_dns_server_string_and_warn(m, DNS_SERVER_FALLBACK, DNS_SERVERS);
if (r < 0) if (r < 0)
return r; return r;
} }

View File

@ -8,7 +8,7 @@
int manager_parse_config_file(Manager *m); int manager_parse_config_file(Manager *m);
int manager_parse_search_domains_and_warn(Manager *m, const char *string); int manager_parse_search_domains_and_warn(Manager *m, const char *string);
int manager_parse_dns_server_string_and_warn(Manager *m, DnsServerType type, const char *string, bool ignore_self_quietly); int manager_parse_dns_server_string_and_warn(Manager *m, DnsServerType type, const char *string);
const struct ConfigPerfItem* resolved_gperf_lookup(const char *key, GPERF_LEN_TYPE length); const struct ConfigPerfItem* resolved_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
const struct ConfigPerfItem* resolved_dnssd_gperf_lookup(const char *key, GPERF_LEN_TYPE length); const struct ConfigPerfItem* resolved_dnssd_gperf_lookup(const char *key, GPERF_LEN_TYPE length);

View File

@ -875,18 +875,9 @@ DnsServer *manager_get_dns_server(Manager *m) {
manager_read_resolv_conf(m); manager_read_resolv_conf(m);
/* If no DNS server was chosen so far, pick the first one */ /* If no DNS server was chosen so far, pick the first one */
if (!m->current_dns_server || if (!m->current_dns_server)
/* In case m->current_dns_server != m->dns_servers */
manager_server_is_stub(m, m->current_dns_server))
manager_set_dns_server(m, m->dns_servers); manager_set_dns_server(m, m->dns_servers);
while (m->current_dns_server &&
manager_server_is_stub(m, m->current_dns_server)) {
manager_next_dns_server(m, NULL);
if (m->current_dns_server == m->dns_servers)
manager_set_dns_server(m, NULL);
}
if (!m->current_dns_server) { if (!m->current_dns_server) {
bool found = false; bool found = false;

View File

@ -1620,37 +1620,30 @@ bool manager_next_dnssd_names(Manager *m) {
return tried; return tried;
} }
bool manager_server_address_is_stub(Manager *m, int family, const union in_addr_union *address, uint16_t port) { bool manager_server_is_stub(Manager *m, DnsServer *s) {
DnsStubListenerExtra *l; DnsStubListenerExtra *l;
assert(m); assert(m);
assert(address); assert(s);
/* Safety check: we generally already skip the main stub when parsing configuration. But let's be /* Safety check: we generally already skip the main stub when parsing configuration. But let's be
* extra careful, and check here again */ * extra careful, and check here again */
if (family == AF_INET && if (s->family == AF_INET &&
address->in.s_addr == htobe32(INADDR_DNS_STUB) && s->address.in.s_addr == htobe32(INADDR_DNS_STUB) &&
port == 53) dns_server_port(s) == 53)
return true; return true;
/* Main reason to call this is to check server data against the extra listeners, and filter things /* Main reason to call this is to check server data against the extra listeners, and filter things
* out. */ * out. */
ORDERED_SET_FOREACH(l, m->dns_extra_stub_listeners) ORDERED_SET_FOREACH(l, m->dns_extra_stub_listeners)
if (family == l->family && if (s->family == l->family &&
in_addr_equal(family, address, &l->address) && in_addr_equal(s->family, &s->address, &l->address) &&
port == dns_stub_listener_extra_port(l)) dns_server_port(s) == dns_stub_listener_extra_port(l))
return true; return true;
return false; return false;
} }
bool manager_server_is_stub(Manager *m, DnsServer *s) {
assert(m);
assert(s);
return manager_server_address_is_stub(m, s->family, &s->address, dns_server_port(s));
}
int socket_disable_pmtud(int fd, int af) { int socket_disable_pmtud(int fd, int af) {
int r; int r;

View File

@ -207,7 +207,6 @@ void manager_cleanup_saved_user(Manager *m);
bool manager_next_dnssd_names(Manager *m); bool manager_next_dnssd_names(Manager *m);
bool manager_server_address_is_stub(Manager *m, int family, const union in_addr_union *address, uint16_t port);
bool manager_server_is_stub(Manager *m, DnsServer *s); bool manager_server_is_stub(Manager *m, DnsServer *s);
int socket_disable_pmtud(int fd, int af); int socket_disable_pmtud(int fd, int af);

View File

@ -143,8 +143,7 @@ int manager_read_resolv_conf(Manager *m) {
a = first_word(l, "nameserver"); a = first_word(l, "nameserver");
if (a) { if (a) {
r = manager_parse_dns_server_string_and_warn(m, DNS_SERVER_SYSTEM, a, r = manager_parse_dns_server_string_and_warn(m, DNS_SERVER_SYSTEM, a);
true /* don't warn about loops to our own stub listeners */);
if (r < 0) if (r < 0)
log_warning_errno(r, "Failed to parse DNS server address '%s', ignoring.", a); log_warning_errno(r, "Failed to parse DNS server address '%s', ignoring.", a);

View File

@ -4,7 +4,6 @@
#include "netif-naming-scheme.h" #include "netif-naming-scheme.h"
#include "proc-cmdline.h" #include "proc-cmdline.h"
#include "string-util.h" #include "string-util.h"
#include "string-table.h"
#ifdef _DEFAULT_NET_NAMING_SCHEME_TEST #ifdef _DEFAULT_NET_NAMING_SCHEME_TEST
/* The primary purpose of this check is to verify that _DEFAULT_NET_NAMING_SCHEME_TEST /* The primary purpose of this check is to verify that _DEFAULT_NET_NAMING_SCHEME_TEST
@ -81,25 +80,3 @@ const NamingScheme* naming_scheme(void) {
return cache; return cache;
} }
static const char* const name_policy_table[_NAMEPOLICY_MAX] = {
[NAMEPOLICY_KERNEL] = "kernel",
[NAMEPOLICY_KEEP] = "keep",
[NAMEPOLICY_DATABASE] = "database",
[NAMEPOLICY_ONBOARD] = "onboard",
[NAMEPOLICY_SLOT] = "slot",
[NAMEPOLICY_PATH] = "path",
[NAMEPOLICY_MAC] = "mac",
};
DEFINE_STRING_TABLE_LOOKUP(name_policy, NamePolicy);
static const char* const alternative_names_policy_table[_NAMEPOLICY_MAX] = {
[NAMEPOLICY_DATABASE] = "database",
[NAMEPOLICY_ONBOARD] = "onboard",
[NAMEPOLICY_SLOT] = "slot",
[NAMEPOLICY_PATH] = "path",
[NAMEPOLICY_MAC] = "mac",
};
DEFINE_STRING_TABLE_LOOKUP(alternative_names_policy, NamePolicy);

View File

@ -64,21 +64,3 @@ const NamingScheme* naming_scheme(void);
static inline bool naming_scheme_has(NamingSchemeFlags flags) { static inline bool naming_scheme_has(NamingSchemeFlags flags) {
return FLAGS_SET(naming_scheme()->flags, flags); return FLAGS_SET(naming_scheme()->flags, flags);
} }
typedef enum NamePolicy {
NAMEPOLICY_KERNEL,
NAMEPOLICY_KEEP,
NAMEPOLICY_DATABASE,
NAMEPOLICY_ONBOARD,
NAMEPOLICY_SLOT,
NAMEPOLICY_PATH,
NAMEPOLICY_MAC,
_NAMEPOLICY_MAX,
_NAMEPOLICY_INVALID = -EINVAL,
} NamePolicy;
const char *name_policy_to_string(NamePolicy p) _const_;
NamePolicy name_policy_from_string(const char *p) _pure_;
const char *alternative_names_policy_to_string(NamePolicy p) _const_;
NamePolicy alternative_names_policy_from_string(const char *p) _pure_;

View File

@ -22,6 +22,7 @@
#include "log-link.h" #include "log-link.h"
#include "memory-util.h" #include "memory-util.h"
#include "net-condition.h" #include "net-condition.h"
#include "netif-naming-scheme.h"
#include "netif-util.h" #include "netif-util.h"
#include "netlink-util.h" #include "netlink-util.h"
#include "parse-util.h" #include "parse-util.h"
@ -1031,10 +1032,30 @@ DEFINE_CONFIG_PARSE_ENUM_WITH_DEFAULT(
MAC_ADDRESS_POLICY_NONE, MAC_ADDRESS_POLICY_NONE,
"Failed to parse MAC address policy"); "Failed to parse MAC address policy");
static const char* const name_policy_table[_NAMEPOLICY_MAX] = {
[NAMEPOLICY_KERNEL] = "kernel",
[NAMEPOLICY_KEEP] = "keep",
[NAMEPOLICY_DATABASE] = "database",
[NAMEPOLICY_ONBOARD] = "onboard",
[NAMEPOLICY_SLOT] = "slot",
[NAMEPOLICY_PATH] = "path",
[NAMEPOLICY_MAC] = "mac",
};
DEFINE_STRING_TABLE_LOOKUP(name_policy, NamePolicy);
DEFINE_CONFIG_PARSE_ENUMV(config_parse_name_policy, name_policy, NamePolicy, DEFINE_CONFIG_PARSE_ENUMV(config_parse_name_policy, name_policy, NamePolicy,
_NAMEPOLICY_INVALID, _NAMEPOLICY_INVALID,
"Failed to parse interface name policy"); "Failed to parse interface name policy");
static const char* const alternative_names_policy_table[_NAMEPOLICY_MAX] = {
[NAMEPOLICY_DATABASE] = "database",
[NAMEPOLICY_ONBOARD] = "onboard",
[NAMEPOLICY_SLOT] = "slot",
[NAMEPOLICY_PATH] = "path",
[NAMEPOLICY_MAC] = "mac",
};
DEFINE_STRING_TABLE_LOOKUP(alternative_names_policy, NamePolicy);
DEFINE_CONFIG_PARSE_ENUMV(config_parse_alternative_names_policy, alternative_names_policy, NamePolicy, DEFINE_CONFIG_PARSE_ENUMV(config_parse_alternative_names_policy, alternative_names_policy, NamePolicy,
_NAMEPOLICY_INVALID, _NAMEPOLICY_INVALID,
"Failed to parse alternative names policy"); "Failed to parse alternative names policy");

View File

@ -9,7 +9,6 @@
#include "ethtool-util.h" #include "ethtool-util.h"
#include "list.h" #include "list.h"
#include "net-condition.h" #include "net-condition.h"
#include "netif-naming-scheme.h"
typedef struct LinkConfigContext LinkConfigContext; typedef struct LinkConfigContext LinkConfigContext;
typedef struct LinkConfig LinkConfig; typedef struct LinkConfig LinkConfig;
@ -22,6 +21,18 @@ typedef enum MACAddressPolicy {
_MAC_ADDRESS_POLICY_INVALID = -EINVAL, _MAC_ADDRESS_POLICY_INVALID = -EINVAL,
} MACAddressPolicy; } MACAddressPolicy;
typedef enum NamePolicy {
NAMEPOLICY_KERNEL,
NAMEPOLICY_KEEP,
NAMEPOLICY_DATABASE,
NAMEPOLICY_ONBOARD,
NAMEPOLICY_SLOT,
NAMEPOLICY_PATH,
NAMEPOLICY_MAC,
_NAMEPOLICY_MAX,
_NAMEPOLICY_INVALID = -EINVAL,
} NamePolicy;
typedef struct Link { typedef struct Link {
int ifindex; int ifindex;
const char *ifname; const char *ifname;
@ -94,6 +105,12 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free);
int link_get_config(LinkConfigContext *ctx, Link *link); int link_get_config(LinkConfigContext *ctx, Link *link);
int link_apply_config(LinkConfigContext *ctx, sd_netlink **rtnl, Link *link); int link_apply_config(LinkConfigContext *ctx, sd_netlink **rtnl, Link *link);
const char *name_policy_to_string(NamePolicy p) _const_;
NamePolicy name_policy_from_string(const char *p) _pure_;
const char *alternative_names_policy_to_string(NamePolicy p) _const_;
NamePolicy alternative_names_policy_from_string(const char *p) _pure_;
const char *mac_address_policy_to_string(MACAddressPolicy p) _const_; const char *mac_address_policy_to_string(MACAddressPolicy p) _const_;
MACAddressPolicy mac_address_policy_from_string(const char *p) _pure_; MACAddressPolicy mac_address_policy_from_string(const char *p) _pure_;

View File

@ -215,7 +215,7 @@ testcase_virtio_scsi_identically_named_partitions() {
# and attach them to a virtio-scsi controller # and attach them to a virtio-scsi controller
local qemu_opts=("-device virtio-scsi-pci,id=scsi0,num_queues=4") local qemu_opts=("-device virtio-scsi-pci,id=scsi0,num_queues=4")
local diskpath="${TESTDIR:?}/namedpart0.img" local diskpath="${TESTDIR:?}/namedpart0.img"
local lodev qemu_timeout local lodev
dd if=/dev/zero of="$diskpath" bs=1M count=18 dd if=/dev/zero of="$diskpath" bs=1M count=18
lodev="$(losetup --show -f -P "$diskpath")" lodev="$(losetup --show -f -P "$diskpath")"
@ -245,14 +245,10 @@ EOF
) )
done done
# Bump the timeout when collecting test coverage, since the test is a bit
# slower in that case
is_built_with_coverage && qemu_timeout=120 || qemu_timeout=60
KERNEL_APPEND="systemd.setenv=TEST_FUNCTION_NAME=${FUNCNAME[0]} ${USER_KERNEL_APPEND:-}" KERNEL_APPEND="systemd.setenv=TEST_FUNCTION_NAME=${FUNCNAME[0]} ${USER_KERNEL_APPEND:-}"
# Limit the number of VCPUs and set a timeout to make sure we trigger the issue # Limit the number of VCPUs and set a timeout to make sure we trigger the issue
QEMU_OPTIONS="${qemu_opts[*]} ${USER_QEMU_OPTIONS:-}" QEMU_OPTIONS="${qemu_opts[*]} ${USER_QEMU_OPTIONS:-}"
QEMU_SMP=1 QEMU_TIMEOUT=$qemu_timeout test_run_one "${1:?}" || return $? QEMU_SMP=1 QEMU_TIMEOUT=60 test_run_one "${1:?}" || return $?
rm -f "${TESTDIR:?}"/namedpart*.img rm -f "${TESTDIR:?}"/namedpart*.img
} }

View File

@ -673,8 +673,6 @@ testcase_long_sysfs_path() {
swapon -v -L swap_vol swapon -v -L swap_vol
swapoff -v -L swap_vol swapoff -v -L swap_vol
udevadm settle
logfile="$(mktemp)" logfile="$(mktemp)"
journalctl -b -q --no-pager -o short-monotonic -p info --grep "Device path.*vda.?' too long to fit into unit name" journalctl -b -q --no-pager -o short-monotonic -p info --grep "Device path.*vda.?' too long to fit into unit name"
# Make sure we don't unnecessarily spam the log # Make sure we don't unnecessarily spam the log

View File

@ -217,7 +217,7 @@ in_units = [
'dbus-org.freedesktop.machine1.service'], 'dbus-org.freedesktop.machine1.service'],
['systemd-modules-load.service', 'HAVE_KMOD', ['systemd-modules-load.service', 'HAVE_KMOD',
'sysinit.target.wants/'], 'sysinit.target.wants/'],
['systemd-network-generator.service', ''], ['systemd-network-generator.service', 'ENABLE_NETWORKD'],
['systemd-networkd.service', 'ENABLE_NETWORKD'], ['systemd-networkd.service', 'ENABLE_NETWORKD'],
['systemd-networkd-wait-online.service', 'ENABLE_NETWORKD'], ['systemd-networkd-wait-online.service', 'ENABLE_NETWORKD'],
['systemd-nspawn@.service', ''], ['systemd-nspawn@.service', ''],

View File

@ -11,7 +11,7 @@
Description=Generate network units from Kernel command line Description=Generate network units from Kernel command line
Documentation=man:systemd-network-generator.service(8) Documentation=man:systemd-network-generator.service(8)
DefaultDependencies=no DefaultDependencies=no
Before=network-pre.target systemd-udevd.service Before=network-pre.target
Wants=network-pre.target Wants=network-pre.target
[Service] [Service]