]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Merge pull request #16556 from keszybz/test-terminal-colors
authorLennart Poettering <lennart@poettering.net>
Wed, 5 Aug 2020 07:35:16 +0000 (09:35 +0200)
committerGitHub <noreply@github.com>
Wed, 5 Aug 2020 07:35:16 +0000 (09:35 +0200)
Test terminal colors

177 files changed:
.mailmap
.mkosi/mkosi.ubuntu
NEWS
TODO
catalog/systemd.pl.catalog.in
docs/CODING_STYLE.md
docs/DISCOVERABLE_PARTITIONS.md
hwdb.d/20-OUI.hwdb
hwdb.d/20-acpi-vendor.hwdb
hwdb.d/20-acpi-vendor.hwdb.patch
hwdb.d/20-pci-vendor-model.hwdb
hwdb.d/20-usb-vendor-model.hwdb
hwdb.d/60-keyboard.hwdb
hwdb.d/60-sensor.hwdb
hwdb.d/acpi_id_registry.html
hwdb.d/ma-large.txt
hwdb.d/ma-medium.txt
hwdb.d/ma-small.txt
hwdb.d/pci.ids
hwdb.d/usb.ids
man/journald.conf.xml
man/os-release.xml
man/rules/meson.build
man/sd_event_add_time.xml
man/systemctl.xml
man/systemd-detect-virt.xml
man/systemd-repart.xml
man/systemd.exec.xml
man/systemd.network.xml
man/systemd.service.xml
meson.build
semaphoreci/semaphore-runner.sh
src/basic/dlfcn-util.c [new file with mode: 0644]
src/basic/dlfcn-util.h
src/basic/in-addr-util.c
src/basic/list.h
src/basic/meson.build
src/basic/path-util.c
src/basic/siphash24.c
src/basic/siphash24.h
src/core/automount.c
src/core/dbus-execute.c
src/core/execute.c
src/core/execute.h
src/core/load-fragment-gperf.gperf.m4
src/core/load-fragment.c
src/core/load-fragment.h
src/core/manager.c
src/core/mount-setup.c
src/core/namespace.c
src/core/namespace.h
src/core/selinux-setup.c
src/core/transaction.c
src/dissect/dissect.c
src/firstboot/firstboot.c
src/gpt-auto-generator/gpt-auto-generator.c
src/home/homework-luks.c
src/home/user-record-util.c
src/import/curl-util.c
src/journal/catalog.c
src/journal/journal-file.c
src/journal/journal-qrcode.c
src/journal/journal-qrcode.h
src/journal/journalctl.c
src/journal/journald-server.c
src/journal/meson.build
src/journal/pcre2-dlopen.c [new file with mode: 0644]
src/journal/pcre2-dlopen.h [new file with mode: 0644]
src/kernel-install/90-loaderentry.install
src/libsystemd-network/dhcp6-internal.h
src/libsystemd-network/dhcp6-lease-internal.h
src/libsystemd-network/dhcp6-option.c
src/libsystemd-network/sd-dhcp6-client.c
src/libsystemd-network/sd-dhcp6-lease.c
src/libsystemd-network/sd-radv.c
src/libsystemd-network/test-dhcp-client.c
src/libsystemd-network/test-dhcp6-client.c
src/libsystemd-network/test-ndisc-ra.c
src/libsystemd-network/test-ndisc-rs.c
src/libsystemd/libsystemd.sym
src/libsystemd/sd-event/sd-event.c
src/login/logind-dbus.c
src/login/logind-session.c
src/machine/machine-dbus.c
src/network/networkd-address.c
src/network/networkd-address.h
src/network/networkd-dhcp4.c
src/network/networkd-dhcp6.c
src/network/networkd-dhcp6.h
src/network/networkd-ipv4ll.c
src/network/networkd-link-bus.c
src/network/networkd-link.c
src/network/networkd-link.h
src/network/networkd-lldp-tx.c
src/network/networkd-manager.c
src/network/networkd-manager.h
src/network/networkd-ndisc.c
src/network/networkd-ndisc.h
src/network/networkd-neighbor.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
src/network/networkd-radv.c
src/network/networkd-radv.h
src/network/networkd-route.c
src/network/networkd-route.h
src/network/networkd-routing-policy-rule.c
src/network/networkd-util.c
src/network/test-networkd-conf.c
src/network/test-routing-policy-rule.c
src/nspawn/nspawn-def.h
src/nspawn/nspawn-mount.c
src/nspawn/nspawn-mount.h
src/nspawn/nspawn.c
src/partition/repart.c
src/partition/test-repart.sh
src/portable/portable.c
src/resolve/resolvectl.c
src/resolve/resolved-dns-query.c
src/resolve/resolved-dns-scope.c
src/resolve/resolved-dns-server.c
src/resolve/resolved-dns-stream.c
src/shared/bus-unit-util.c
src/shared/dissect-image.c
src/shared/dissect-image.h
src/shared/loop-util.c
src/shared/machine-image.c
src/shared/mount-util.h
src/shared/sleep-config.c
src/shared/udev-util.c
src/socket-proxy/socket-proxyd.c
src/systemd/sd-dhcp6-lease.h
src/systemd/sd-event.h
src/test/test-alloc-util.c
src/test/test-cgroup-util.c
src/test/test-clock.c
src/test/test-dissect-image.c
src/test/test-fs-util.c
src/test/test-list.c
src/test/test-namespace.c
src/test/test-ns.c
src/test/test-ordered-set.c
src/test/test-path.c
src/test/test-sleep.c
src/timedate/timedatectl.c
src/timesync/timesyncd-manager.c
src/timesync/timesyncd-manager.h
src/udev/udev-ctrl.c
src/udev/udevadm-info.c
src/udev/udevd.c
test/README.testsuite
test/TEST-21-SYSUSERS/test.sh
test/TEST-24-UNIT-TESTS/deny-list-ubuntu-ci-ppc64el [moved from test/TEST-24-UNIT-TESTS/blacklist-ubuntu-ci-ppc64el with 100% similarity]
test/TEST-25-IMPORT/deny-list-ubuntu-ci [moved from test/TEST-25-IMPORT/blacklist-ubuntu-ci with 100% similarity]
test/TEST-30-ONCLOCKCHANGE/deny-list-ubuntu-ci-i386 [moved from test/TEST-30-ONCLOCKCHANGE/blacklist-ubuntu-ci-i386 with 100% similarity]
test/TEST-36-NUMAPOLICY/deny-list-ubuntu-ci-s390x [moved from test/TEST-36-NUMAPOLICY/blacklist-ubuntu-ci-s390x with 100% similarity]
test/TEST-40-EXEC-COMMAND-EX/deny-list-ubuntu-ci-arm64 [moved from test/TEST-40-EXEC-COMMAND-EX/blacklist-ubuntu-ci-arm64 with 100% similarity]
test/TEST-50-DISSECT/test.sh
test/create-busybox-container
test/fuzz/fuzz-network-parser/directives.network
test/test-network/conf/25-prefix-route-with-vrf.network [new file with mode: 0644]
test/test-network/conf/25-prefix-route-without-vrf.network [new file with mode: 0644]
test/test-network/conf/ipv6-prefix-veth-token-static-multiple.network
test/test-network/systemd-networkd-tests.py
test/units/testsuite-13.sh
test/units/testsuite-50.sh
units/initrd-cleanup.service
units/initrd-fs.target
units/initrd-parse-etc.service
units/initrd-root-device.target
units/initrd-root-fs.target
units/initrd-switch-root.service
units/initrd-switch-root.target
units/initrd-udevadm-cleanup-db.service
units/initrd.target
units/systemd-hibernate-resume@.service.in
units/tmp.mount

index da93126120843365bf55e2b089ee8fc5cdf93fdb..662ea13a609f11c53599ded097eb23d972f7d673 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -118,6 +118,7 @@ Michael Olbrich <m.olbrich@pengutronix.de>
 Michal Soltys <soltys@ziu.info> <nozo@ziu.info>
 Michal Suchanek <msuchanek@suse.de>
 Michal Suchanek <msuchanek@suse.de> <hramrach@gmail.com>
+Michal Sekletár <msekleta@redhat.com>
 Michał Szczepański <skrzatu@hotmail.com> <skrzatu@gmail.com>
 Michel Kraus <github@demonsphere.de> <27o@users.noreply.github.com>
 Miklos Vajna <vmiklos@frugalware.org> <vmiklos@gmail.com>
@@ -207,3 +208,4 @@ Stephan Edel <se@se-it.eu>
 Andrey Yashkin <38919268+AndreyYashkin@users.noreply.github.com>
 Ronald Tschalär <ronald@innovation.ch>
 Jay Burger <jay.burger@fujitsu.com> <root@new-host-3.home>
+Yi Gao <ymuemc@163.com>
index 990e9c1cbcf245aa92ac8999f041518412b0a783..8dcc67a66270a53750ed19df9c09a66d7e870c16 100644 (file)
@@ -5,7 +5,7 @@
 
 [Distribution]
 Distribution=ubuntu
-Release=bionic
+Release=focal
 Repositories=main,universe
 
 [Output]
@@ -25,7 +25,6 @@ BuildPackages=
         git
         gnu-efi
         gperf
-        iptables-dev
         libacl1-dev
         libaudit-dev
         libblkid-dev
@@ -39,6 +38,8 @@ BuildPackages=
         libgcrypt20-dev
         libgnutls28-dev
         libidn2-0-dev
+        libip4tc-dev
+        libip6tc-dev
         libkmod-dev
         liblz4-dev
         liblz4-tool
@@ -51,6 +52,7 @@ BuildPackages=
         libsmartcols-dev
         libtool
         libxkbcommon-dev
+        libxtables-dev
         libzstd-dev
         m4
         meson
@@ -65,6 +67,6 @@ BuildPackages=
         zstd
 
 Packages=
-        libqrencode3
+        libqrencode4
         locales
         libidn2-0
diff --git a/NEWS b/NEWS
index f47645b1fd4497c2e7d6c335531432a4299cfdc0..95685ed7f71102d6bbe42f34349f008e174031d9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -74,6 +74,18 @@ CHANGES WITH 246:
           notation when the 0o prefix is used and binary notation if the 0b
           prefix is used.
 
+        * Various command line parameters and configuration file settings that
+          configure key or certificate files now optionally take paths to
+          AF_UNIX sockets in the file system. If configured that way a stream
+          connection is made to the socket and the required data read from
+          it. This is a simple and natural extension to the existing regular
+          file logic, and permits other software to provide keys or
+          certificates via simple IPC services, for example when unencrypted
+          storage on disk is not desired. Specifically, systemd-networkd's
+          Wireguard and MACSEC key file settings as well as
+          systemd-journal-gatewayd's and systemd-journal-remote's PEM
+          key/certificate parameters support this now.
+
         * Unit files, tmpfiles.d/ snippets, sysusers.d/ snippets and other
           configuration files that support specifier expansion learnt six new
           specifiers: %a resolves to the current architecture, %o/%w/%B/%W
@@ -100,6 +112,16 @@ CHANGES WITH 246:
           read and even write access to all these otherwise unmappable files,
           which is quite likely a major security problem.
 
+        * tmpfs mounts automatically created by systemd (/tmp, /run, /dev/shm,
+          and others) now have a size and inode limits applied (50% of RAM for
+          /tmp and /dev/shm, 10% of RAM for other mounts, etc.)
+
+        * nss-mymachines lost support for resolution of users and groups, and
+          now only does resolution of hostnames. This functionality is now
+          provided by nss-systemd. Thus, the 'mymachines' entry should be
+          removed from the 'passwd:' and 'group:' lines in /etc/nsswitch.conf
+          (and 'systemd' added if it is not already there).
+
         * A new kernel command line option systemd.hostname= has been added
           that allows controlling the hostname that is initialized early during
           boot.
@@ -163,9 +185,15 @@ CHANGES WITH 246:
           new boolean setting Assign=. If enabled an address from the prefix is
           automatically assigned to the interface.
 
-        * systemd-networkd's [Network] section gained a new setting
-          IPv6PDSubnetId= that allows explicit configuration of the preferred
-          subnet that networkd's Prefix Delegation logic assigns to interfaces.
+        * systemd-networkd gained a new section [DHCPv6PrefixDelegation] which
+          controls delegated prefixes assigned by DHCPv6 client. The section
+          has three settings: SubnetID=, Assign=, and Token=. The setting
+          SubnetID= allows explicit configuration of the preferred subnet that
+          systemd-networkd's Prefix Delegation logic assigns to interfaces. If
+          Assign= is enabled (which is the default) an address from any acquired
+          delegated prefix is automatically chosen and assigned to the
+          interface. The setting Token= specifies an optional address generation
+          mode for Assign=.
 
         * systemd-networkd's [Network] section gained a new setting
           IPv4AcceptLocal=. If enabled the interface accepts packets with local
@@ -238,11 +266,6 @@ CHANGES WITH 246:
           interface which is fully set up for host communication, simply by
           carefully picking an interface name to use.
 
-        * A new boolean option AssignAcquiredDelegatedPrefixAddress= has been
-          added to the [DHCPv6] section of .network files. If enabled (which is
-          the default) an address from any acquired delegated prefix is
-          automatically chosen and assigned to the interface.
-
         * systemd-networkd's [DHCPv6] section gained a new setting RouteMetric=
           which sets the route priority for routes specified by the DHCP server.
 
@@ -259,10 +282,11 @@ CHANGES WITH 246:
           interface. There are new "up" and "down" commands to bring specific
           interfaces up or down.
 
-        * systemd-resolved's DNS= configuration option now optionally accepts
-          DNS server addresses suffixed by "#" followed by a host name. If
-          used, the DNS-over-TLS certificate is validated to match the
-          specified hostname.
+        * systemd-resolved's DNS= configuration option now optionally accepts a
+          port number (after ":") and a host name (after "#"). When the host
+          name is specified, the DNS-over-TLS certificate is validated to match
+          the specified hostname. Additionally, in case of IPv6 addresses, an
+          interface may be specified (after "%").
 
         * systemd-resolved may be configured to forward single-label DNS names.
           This is not standard-conformant, but may make sense in setups where
@@ -329,6 +353,13 @@ CHANGES WITH 246:
           MESSAGE=. This is useful to retrieve a very specific set of fields
           without any decoration.
 
+        * The sd-journal.h API gained two new functions:
+          sd_journal_enumerate_available_unique() and
+          sd_journal_enumerate_available_data() that operate like their
+          counterparts that lack the _available_ in the name, but skip items
+          that cannot be read and processed by the local implementation
+          (i.e. are compressed in an unsupported format or such),
+
         * coredumpctl gained a new --file= switch, matching the same one in
           journalctl: a specific journal file may be specified to read the
           coredump data from.
@@ -438,10 +469,12 @@ CHANGES WITH 246:
           also gained a new switch --root-password-hashed= which is like
           --root-password= but accepts a pre-hashed UNIX password as
           argument. The new option --delete-root-password may be used to unset
-          any password for the root user (dangerous!). A new --force option may
-          be used to override any already set settings with the parameters
-          specified on the command line (by default, the tool will not override
-          what has already been set before, i.e. is purely incremental).
+          any password for the root user (dangerous!). The --root-shell= switch
+          may be used to control the shell to use for the root account. A new
+          --force option may be used to override any already set settings with
+          the parameters specified on the command line (by default, the tool
+          will not override what has already been set before, i.e. is purely
+          incremental).
 
         * systemd-firstboot gained support for a new --image= switch, which is
           similar to --root= but accepts the path to a disk image file, on
@@ -518,7 +551,7 @@ CHANGES WITH 246:
           has been extended by a set of environment variables that expose
           select fields from the host's os-release file to the container
           payload. Similarly, host's os-release files can be mounted into the
-          container underneath /run/hosts. Together, those mechanisms provide a
+          container underneath /run/host. Together, those mechanisms provide a
           standardized way to expose information about the host to the
           container payload. Both interfaces are implemented in systemd-nspawn.
 
@@ -526,56 +559,50 @@ CHANGES WITH 246:
           LogControl1 D-Bus API which allows clients to change log level +
           target of the service during runtime.
 
-        * Various command line parameters and configuration file settings that
-          configure key or certificate files now optionally take paths to
-          AF_UNIX sockets in the file system. If configured that way a stream
-          connection is made to the socket and the required data read from
-          it. This is a simple and natural extension to the existing regular
-          file logic, and permits other software to provide keys or
-          certificates via simple IPC services, for example when unencrypted
-          storage on disk is not desired. Specifically, systemd-networkd's
-          Wireguard and MACSEC key file settings as well as
-          systemd-journal-gatewayd's and systemd-journal-remote's PEM
-          key/certificate parameters support this now.
+        * Only relevant for developers: the mkosi.default symlink has been
+          dropped from version control. Please create a symlink to one of the
+          distribution-specific defaults in .mkosi/ based on your preference.
 
         Contributions from: 24bisquitz, Adam Nielsen, Alan Perry, Alexander
-        Malafeev, Alin Popa, Amos Bird, Andreas Rammhold, AndreRH, Andrew
-        Doran, Anita Zhang, Ankit Jain, antznin, Arnaud Ferraris, Arthur Moraes
-        do Lago, Arusekk, Balaji Punnuru, Balint Reczey, Bastien Nocera,
-        bemarek, Benjamin Berg, Benjamin Dahlhoff, Benjamin Robin, Chris Down,
-        Chris Kerr, Christian Göttsche, Christian Hesse, Christian Oder,
-        Ciprian Hacman, codicodi, Corey Hinshaw, Daan De Meyer, Dana Olson, Dan
-        Callaghan, Daniel Fullmer, Daniel Rusek, Dan Streetman, Dave Reisner,
-        David Edmundson, David Wood, Denis Pronin, Diego Escalante Urrelo,
-        Dimitri John Ledkov, dolphrundgren, duguxy, Einsler Lee, Elisei Roca,
-        Emmanuel Garette, Eric Anderson, Eric DeVolder, Evgeny Vereshchagin,
+        Malafeev, Amitanand.Chikorde, Alin Popa, Alvin Šipraga, Amos Bird,
+        Andreas Rammhold, AndreRH, Andrew Doran, Anita Zhang, Ankit Jain,
+        antznin, Arnaud Ferraris, Arthur Moraes do Lago, Arusekk, Balaji
+        Punnuru, Balint Reczey, Bastien Nocera, bemarek, Benjamin Berg,
+        Benjamin Dahlhoff, Benjamin Robin, Chris Down, Chris Kerr, Christian
+        Göttsche, Christian Hesse, Christian Oder, Ciprian Hacman, Clinton Roy,
+        codicodi, Corey Hinshaw, Daan De Meyer, Dana Olson, Dan Callaghan,
+        Daniel Fullmer, Daniel Rusek, Dan Streetman, Dave Reisner, David
+        Edmundson, David Wood, Denis Pronin, Diego Escalante Urrelo, Dimitri
+        John Ledkov, dolphrundgren, duguxy, Einsler Lee, Elisei Roca, Emmanuel
+        Garette, Eric Anderson, Eric DeVolder, Evgeny Vereshchagin,
         ExtinctFire, fangxiuning, Ferran Pallarès Roca, Filipe Brandenburger,
-        Finn, Florian Klink, Franck Bui, Frantisek Sumsal, Gaoyi, gaurav, Georg
-        Müller, Gergely Polonkai, Giedrius Statkevičius, Gigadoc2, gogogogi,
-        gzjsgdsb, Hans de Goede, Haochen Tong, ianhi, ignapk, Jakov Smolic,
-        James T. Lee, Jan Janssen, Jan Klötzke, Jan Palus, Jay Burger, Jeremy
-        Cline, Jérémy Rosen, Jian-Hong Pan, Jiri Slaby, Joel Shapiro, Joerg
-        Behrmann, Jörg Thalheim, Jouke Witteveen, Kai-Heng Feng, Kenny
-        Levinsen, Kevin Kuehler, Kumar Kartikeya Dwivedi, layderv, laydervus,
-        Lénaïc Huard, Lennart Poettering, Lidong Zhong, Luca Boccassi, Luca
-        BRUNO, Lucas Werkmeister, Lukas Klingsbo, Lukáš Nykrýn, Łukasz
-        Stelmach, Maciej S. Szmigiero, MadMcCrow, Marc-André Lureau, Marcel
-        Holtmann, Marc Kleine-Budde, Martin Hundebøll, Matthew Leeds, Matt
-        Ranostay, Maxim Fomin, MaxVerevkin, Michael Biebl, Michael Chapman,
-        Michael Gubbels, Michael Marley, Michał Bartoszkiewicz, Michal Koutný,
-        Michal Sekletar, Michal Sekletár, Mike Gilbert, Mike Kazantsev, ml,
-        Motiejus Jakštys, nabijaczleweli, nerdopolis, Niccolò Maggioni, Niklas
-        Hambüchen, Norbert Lange, Paul Cercueil, pelzvieh, Peter Hutterer,
-        Piero La Terza, Pieter Lexis, Piotr Drąg, Rafael Fontenelle, Richard
-        Petri, Ronan Pigott, Ross Lagerwall, Rubens Figueiredo, satmandu,
-        Sean-StarLabs, Sebastian Jennen, sterlinghughes, Susant Sahani, Thomas
+        Filippo Falezza, Finn, Florian Klink, Florian Mayer, Franck Bui,
+        Frantisek Sumsal, gaurav, Georg Müller, Gergely Polonkai, Giedrius
+        Statkevičius, Gigadoc2, gogogogi, Gaurav Singh, gzjsgdsb, Hans de
+        Goede, Haochen Tong, ianhi, ignapk, Jakov Smolic, James T. Lee, Jan
+        Janssen, Jan Klötzke, Jan Palus, Jay Burger, Jeremy Cline, Jérémy
+        Rosen, Jian-Hong Pan, Jiri Slaby, Joel Shapiro, Joerg Behrmann, Jörg
+        Thalheim, Jouke Witteveen, Kai-Heng Feng, Kenny Levinsen, Kevin
+        Kuehler, Kumar Kartikeya Dwivedi, layderv, laydervus, Lénaïc Huard,
+        Lennart Poettering, Lidong Zhong, Luca Boccassi, Luca BRUNO, Lucas
+        Werkmeister, Lukas Klingsbo, Lukáš Nykrýn, Łukasz Stelmach, Maciej
+        S. Szmigiero, MadMcCrow, Marc-André Lureau, Marcel Holtmann, Marc
+        Kleine-Budde, Martin Hundebøll, Matthew Leeds, Matt Ranostay, Maxim
+        Fomin, MaxVerevkin, Michael Biebl, Michael Chapman, Michael Gubbels,
+        Michael Marley, Michał Bartoszkiewicz, Michal Koutný, Michal Sekletár,
+        Mike Gilbert, Mike Kazantsev, Mikhail Novosyolov, ml, Motiejus Jakštys,
+        nabijaczleweli, nerdopolis, Niccolò Maggioni, Niklas Hambüchen, Norbert
+        Lange, Paul Cercueil, pelzvieh, Peter Hutterer, Piero La Terza, Pieter
+        Lexis, Piotr Drąg, Rafael Fontenelle, Richard Petri, Ronan Pigott, Ross
+        Lagerwall, Rubens Figueiredo, satmandu, Sean-StarLabs, Sebastian
+        Jennen, sterlinghughes, Surhud More, Susant Sahani, szb512, Thomas
         Haller, Tobias Hunger, Tom, Tomáš Pospíšek, Tomer Shechner, Tom Hughes,
         Topi Miettinen, Tudor Roman, Uwe Kleine-König, Valery0xff, Vito Caputo,
         Vladimir Panteleev, Vladyslav Tronko, Wen Yang, Yegor Vialov, Yigal
-        Korman, YmrDtnJu, Yuri Chornoivan, Yu Watanabe, Zbigniew
+        Korman, Yi Gao, YmrDtnJu, Yuri Chornoivan, Yu Watanabe, Zbigniew
         Jędrzejewski-Szmek, Zhu Li, Дамјан Георгиевски, наб
 
-        – Warsaw, 2020-07-09
+        – Warsaw, 2020-07-30
 
 CHANGES WITH 245:
 
diff --git a/TODO b/TODO
index 099ce36f01a310437e91ad56834030d326ffb17a..88fd20ad3eda0050e33e71bfc1060998c4541da3 100644 (file)
--- a/TODO
+++ b/TODO
@@ -17,6 +17,16 @@ Janitorial Clean-ups:
 
 Features:
 
+* make use of the new statx mountid and rootmount fields in path_get_mnt_id()
+  and fd_is_mount_point()
+
+* make use of new loopback setup ioctl to setup loopback devices in one atomic
+  ioctl
+
+* nspawn: move "incoming mount" directory to /run/host, move "inaccessible"
+  nodes to /run/host, move notify socket (for sd_notify() between payload and
+  container manager)
+
 * cryptsetup: if keyfile specified in crypttab is AF_UNIX socket, connect to it
   and read from it (like we do elsewhere with READ_FULL_FILE_CONNECT_SOCKET)
 
@@ -76,8 +86,6 @@ Features:
 
 * make us use dynamically fewer deps for containers in general purpose distros:
   o turn into dlopen() deps:
-    - pcre2 (always)               — irrelevant on Fedora, since dep by
-                                     libselinux, but should benefit Debian
     - libpwquality (always)        - only relevant for homed, and maybe soon
                                      firstboot
     - elfutils (always)
@@ -929,6 +937,10 @@ Features:
   - allow multiple signal handlers per signal?
   - document chaining of signal handler for SIGCHLD and child handlers
   - define more intervals where we will shift wakeup intervals around in, 1h, 6h, 24h, ...
+  - maybe support iouring as backend, so that we allow hooking read and write
+    operations instead of IO ready events into event loops. See considerations
+    here:
+    http://blog.vmsplice.net/2020/07/rethinking-event-loop-integration-for.html
 
 * investigate endianness issues of UUID vs. GUID
 
@@ -1087,7 +1099,8 @@ Features:
   - document systemd-journal-flush.service properly
   - documentation: recommend to connect the timer units of a service to the service via Also= in [Install]
   - man: document the very specific env the shutdown drop-in tools live in
-  - man: add more examples to man pages
+  - man: add more examples to man pages,
+  -      in particular an example how to do the equivalent of switching runlevels
   - man: maybe sort directives in man pages, and take sections from --help and apply them to man too
   - document root=gpt-auto properly
 
index 961d09a2f545a32110f7d661765081074a0e9197..f82bab8fc34eb40b5b536c1bf0e3edccebbd0d22 100644 (file)
@@ -488,3 +488,39 @@ Mocno zalecane jest unikanie wykonywania usług pod tą tożsamością użytkown
 zwłaszcza na komputerach używających NFS lub mających kontenery. Należy
 przydzielić identyfikator użytkownika dla tej konkretnej usługi, statycznie
 przez systemd-sysusers lub dynamicznie przez ustawienie usługi DynamicUser=.
+
+-- 1c0454c1bd2241e0ac6fefb4bc631433
+Subject: Usługa systemd-udev-settle.service jest przestarzała.
+Defined-By: systemd
+Support: %SUPPORT_URL%
+
+Użycie jednostki usługi systemd „systemd-udev-settle.service” jest
+przestarzałe. Wstawia ona sztuczne opóźnienie do procesu uruchamiania
+bez dostarczania gwarancji, które były oczekiwane przez pozostałe
+podsystemy. Korzystanie z tej usługi może prowadzić do hazardów,
+i zasadniczo jest błędem.
+
+W przeszłości zadaniem tej usługi było oczekiwanie, aż wszystkie urządzenia
+komputera zostaną w pełni wykryte i zainicjowane, opóźniając uruchamianie
+do ukończenia tego etapu. Jednakże, współczesne komputery i urządzenia
+na ogół nie działają już w ten sposób, tylko mogą pojawić się w dowolnej
+chwili i zająć dowolny czas na wykrycie i inicjację. Z tego powodu,
+w ogólnym przypadku, nie jest już możliwe poprawne opóźnienie uruchamiania
+do przetworzenia „wszystkich urządzeń”, ponieważ nie jest jasne, co znaczy
+„wszystkie urządzenia” i kiedy zostały odnalezione. Dotyczy to zwłaszcza
+urządzeń podłączonych przez USB lub sieć.
+
+Nowoczesne oprogramowanie wymagające określonego sprzętu (takiego jak
+urządzenie sieciowe lub urządzenie blokowe) do działania powinno oczekiwać
+tylko na pojawienie się danego urządzenia, a w przeciwnym razie działać
+asynchronicznie, inicjując urządzenia, kiedy te pojawiają się w trakcie
+uruchamiania i w trakcie działania systemu bez opóźniania procesu uruchamiania.
+
+Jest to wada danego oprogramowania, jeśli nie działa ono w ten sposób
+i nadal wciąga usługę systemd-udev-settle.service do procesu uruchamiania.
+
+Prosimy zgłosić błąd w następujących jednostkach z prośbą
+o ich aktualizację tak, aby działały w sposób dynamiczny
+bez zależności od usługi systemd-udev-settle.service:
+
+    @OFFENDING_UNITS@
index f335a1012ebe238c0a5520fd77c865a27debd1a0..119b9a26407d6a282f6b97cac70ec579e7f7032c 100644 (file)
@@ -372,7 +372,7 @@ layout: default
   broken on Linux).
 
 - When applying C-style unescaping as well as specifier expansion on the same
-  string, always apply the C-style unescaping fist, followed by the specifier
+  string, always apply the C-style unescaping first, followed by the specifier
   expansion. When doing the reverse, make sure to escape `%` in specifier-style
   first (i.e. `%` → `%%`), and then do C-style escaping where necessary.
 
@@ -529,7 +529,7 @@ layout: default
 
 - Don't use `fgets()`, it's too hard to properly handle errors such as overly
   long lines. Use `read_line()` instead, which is our own function that handles
-  this much nicer.
+  this much more nicely.
 
 - Don't invoke `exit()`, ever. It is not replacement for proper error
   handling. Please escalate errors up your call chain, and use normal `return`
index f1537b89399a5e180fa7f22da917d9f4676f1927..20f4206d08e938e452e060449cf500be20fec7f5 100644 (file)
@@ -9,21 +9,21 @@ _TL;DR: Let's automatically discover, mount and enable the root partition,
 `/home/`, `/srv/`, `/var/` and `/var/tmp/` and the swap partitions based on
 GUID Partition Tables (GPT)!_
 
-The GUID Partition Table (GPT) is mandatory on EFI systems. It allows
-identification of partition types with UUIDs. So far Linux has made little use
-of this, and mostly just defined one UUID for file system/data partitions and
-another one for swap partitions.  With this specification, we introduce
-additional partition types to enable automatic discovery of partitions and
-their intended mountpoint.  This has many benefits:
+This specification describes the use of GUID Partition Table (GPT) UUIDs to
+enable automatic discovery of partitions and their intended mountpoints.
+Traditionally Linux has made little use of partition types, mostly just
+defining one UUID for file system/data partitions and another one for swap
+partitions. With this specification, we introduce additional partition types
+for specific uses. This has many benefits:
 
 * OS installers can automatically discover and make sense of partitions of
   existing Linux installations.
-* The OS can discover and mount the necessary file systems with a non-existing
+* The OS can discover and mount the necessary file systems with a non-existent
   or incomplete `/etc/fstab` file and without the `root=` kernel command line
   option.
-* Container managers (such as nspawn and libvirt-lxc) can decode and set up
+* Container managers (such as nspawn and libvirt-lxc) can introspect and set up
   file systems contained in GPT disk images automatically and mount them to the
-  right places, thus allowing booting the same, identical images on bare-metal
+  right places, thus allowing booting the same, identical images on bare metal
   and in Linux containers. This enables true, natural portability of disk
   images between physical machines and Linux containers.
 * As a help to administrators and users partition manager tools can show more
index b9819f28d7401502cc8dae98e5d90f4674361aca..eac9c0c1594d4fc6b43c65352783dcde29e809fc 100644 (file)
@@ -32234,6 +32234,9 @@ OUI:0041B4*
 OUI:0041D2*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:004238*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:004252*
  ID_OUI_FROM_DATABASE=RLX Technologies
 
@@ -33887,6 +33890,9 @@ OUI:0060FE*
 OUI:0060FF*
  ID_OUI_FROM_DATABASE=QuVis, Inc.
 
+OUI:006151*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:006171*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -34064,6 +34070,9 @@ OUI:007B18*
 OUI:007C2D*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:007D60*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:007DFA*
  ID_OUI_FROM_DATABASE=Volkswagen Group of America
 
@@ -39797,6 +39806,9 @@ OUI:0475F5*
 OUI:04766E*
  ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO., LTD.
 
+OUI:0476B0*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:047863*
  ID_OUI_FROM_DATABASE=Shanghai MXCHIP Information Technology Co., Ltd.
 
@@ -40229,6 +40241,9 @@ OUI:04E662*
 OUI:04E676*
  ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
 
+OUI:04E795*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:04E9E5*
  ID_OUI_FROM_DATABASE=PJRC.COM, LLC
 
@@ -40937,6 +40952,9 @@ OUI:084027*
 OUI:0840F3*
  ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
 
+OUI:084296*
+ ID_OUI_FROM_DATABASE=Mobile Technology Solutions LLC
+
 OUI:084656*
  ID_OUI_FROM_DATABASE=VEO-LABS
 
@@ -40985,6 +41003,9 @@ OUI:085AE0*
 OUI:085B0E*
  ID_OUI_FROM_DATABASE=Fortinet, Inc.
 
+OUI:085BD6*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:085BDA*
  ID_OUI_FROM_DATABASE=CliniCare LTD
 
@@ -41861,6 +41882,9 @@ OUI:0C8910*
 OUI:0C8A87*
  ID_OUI_FROM_DATABASE=AgLogica Holdings, Inc
 
+OUI:0C8B7D*
+ ID_OUI_FROM_DATABASE=Vizio, Inc
+
 OUI:0C8BD3*
  ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
 
@@ -42449,6 +42473,9 @@ OUI:1013EE*
 OUI:10189E*
  ID_OUI_FROM_DATABASE=Elmo Motion Control
 
+OUI:101965*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
 OUI:101B54*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -42467,6 +42494,9 @@ OUI:101F74*
 OUI:102279*
  ID_OUI_FROM_DATABASE=ZeroDesktop, Inc.
 
+OUI:102779*
+ ID_OUI_FROM_DATABASE=Sadel S.p.A.
+
 OUI:1027BE*
  ID_OUI_FROM_DATABASE=TVIP
 
@@ -43307,6 +43337,9 @@ OUI:142BD2*
 OUI:142BD6*
  ID_OUI_FROM_DATABASE=Guangdong Appscomm Co.,Ltd
 
+OUI:142C78*
+ ID_OUI_FROM_DATABASE=GooWi Wireless Technology Co., Limited
+
 OUI:142D27*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -43373,6 +43406,9 @@ OUI:143EBF*
 OUI:143F27*
  ID_OUI_FROM_DATABASE=Noccela Oy
 
+OUI:143FC3*
+ ID_OUI_FROM_DATABASE=SnapAV
+
 OUI:144146*
  ID_OUI_FROM_DATABASE=Honeywell (China) Co., LTD
 
@@ -43685,6 +43721,9 @@ OUI:14A78B*
 OUI:14A86B*
  ID_OUI_FROM_DATABASE=ShenZhen Telacom Science&Technology Co., Ltd
 
+OUI:14A9D0*
+ ID_OUI_FROM_DATABASE=F5 Networks, Inc.
+
 OUI:14A9E3*
  ID_OUI_FROM_DATABASE=MST CORPORATION
 
@@ -44777,6 +44816,51 @@ OUI:18FB7B*
 OUI:18FC9F*
  ID_OUI_FROM_DATABASE=Changhe Electronics Co., Ltd.
 
+OUI:18FDCB0*
+ ID_OUI_FROM_DATABASE=Shenzhen Rui jiali Electronic Technology Co. Ltd.
+
+OUI:18FDCB1*
+ ID_OUI_FROM_DATABASE=SOTHIS CIC TEC (Shanghai) Co., Ltd
+
+OUI:18FDCB2*
+ ID_OUI_FROM_DATABASE=Cabtronix AG
+
+OUI:18FDCB3*
+ ID_OUI_FROM_DATABASE=Staclar, Inc.
+
+OUI:18FDCB4*
+ ID_OUI_FROM_DATABASE=Gosuncn Technology Group Co.,LTD.
+
+OUI:18FDCB5*
+ ID_OUI_FROM_DATABASE=Accel Robotics
+
+OUI:18FDCB6*
+ ID_OUI_FROM_DATABASE=SKA Organisation
+
+OUI:18FDCB7*
+ ID_OUI_FROM_DATABASE=ENERGIE IP
+
+OUI:18FDCB8*
+ ID_OUI_FROM_DATABASE=CISTECH Solutions
+
+OUI:18FDCB9*
+ ID_OUI_FROM_DATABASE=CreyNox GmbH
+
+OUI:18FDCBA*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation.
+
+OUI:18FDCBB*
+ ID_OUI_FROM_DATABASE=TRANSLITE GLOBAL LLC
+
+OUI:18FDCBC*
+ ID_OUI_FROM_DATABASE=Ark Vision Systems GmbH & Co. KG
+
+OUI:18FDCBD*
+ ID_OUI_FROM_DATABASE=StreamLocator
+
+OUI:18FDCBE*
+ ID_OUI_FROM_DATABASE=KWANG YANG MOTOR CO.,LTD
+
 OUI:18FE34*
  ID_OUI_FROM_DATABASE=Espressif Inc.
 
@@ -45074,6 +45158,9 @@ OUI:1C4D66*
 OUI:1C4D70*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:1C501E*
+ ID_OUI_FROM_DATABASE=Sunplus Technology Co., Ltd.
+
 OUI:1C51B5*
  ID_OUI_FROM_DATABASE=Techaya LTD
 
@@ -46151,6 +46238,9 @@ OUI:20415A*
 OUI:20443A*
  ID_OUI_FROM_DATABASE=Schneider Electric Asia Pacific Ltd
 
+OUI:204441*
+ ID_OUI_FROM_DATABASE=Remote Solution
+
 OUI:2046A1*
  ID_OUI_FROM_DATABASE=VECOW Co., Ltd
 
@@ -46427,6 +46517,9 @@ OUI:20968A*
 OUI:2098D8*
  ID_OUI_FROM_DATABASE=Shenzhen Yingdakang Technology CO., LTD
 
+OUI:209A7D*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+
 OUI:209AE9*
  ID_OUI_FROM_DATABASE=Volacomm Co., Ltd
 
@@ -46610,6 +46703,9 @@ OUI:20DFB9*
 OUI:20E09C*
  ID_OUI_FROM_DATABASE=Nokia
 
+OUI:20E2A8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:20E407*
  ID_OUI_FROM_DATABASE=Spark srl
 
@@ -47000,6 +47096,9 @@ OUI:245880*
 OUI:24590B*
  ID_OUI_FROM_DATABASE=White Sky Inc. Limited
 
+OUI:245A4C*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+
 OUI:245AB5*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -47159,6 +47258,9 @@ OUI:248A07*
 OUI:248BE0*
  ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
 
+OUI:2491BB*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:24920E*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -49772,6 +49874,9 @@ OUI:3055ED*
 OUI:305714*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:30578E*
+ ID_OUI_FROM_DATABASE=eero inc.
+
 OUI:3057AC*
  ID_OUI_FROM_DATABASE=IRLAB LTD.
 
@@ -49940,6 +50045,9 @@ OUI:309435*
 OUI:3095E3*
  ID_OUI_FROM_DATABASE=SHANGHAI SIMCOM LIMITED
 
+OUI:309610*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:3096FB*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -49976,6 +50084,9 @@ OUI:30A889*
 OUI:30A8DB*
  ID_OUI_FROM_DATABASE=Sony Mobile Communications Inc
 
+OUI:30A998*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:30A9DE*
  ID_OUI_FROM_DATABASE=LG Innotek
 
@@ -50492,6 +50603,9 @@ OUI:3432E6*
 OUI:34363B*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:343654*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:343759*
  ID_OUI_FROM_DATABASE=zte corporation
 
@@ -50759,6 +50873,9 @@ OUI:348B75*
 OUI:348F27*
  ID_OUI_FROM_DATABASE=Ruckus Wireless
 
+OUI:34916F*
+ ID_OUI_FROM_DATABASE=UserGate Ltd.
+
 OUI:349342*
  ID_OUI_FROM_DATABASE=TTE Corporation
 
@@ -51155,6 +51272,9 @@ OUI:34EF44*
 OUI:34EF8B*
  ID_OUI_FROM_DATABASE=NTT Communications Corporation
 
+OUI:34EFB6*
+ ID_OUI_FROM_DATABASE=Edgecore Networks Corporation
+
 OUI:34F0CA*
  ID_OUI_FROM_DATABASE=Shenzhen Linghangyuan Digital Technology Co.,Ltd.
 
@@ -51197,6 +51317,9 @@ OUI:34FCB9*
 OUI:34FCEF*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
+OUI:34FD6A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:380025*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -52697,6 +52820,9 @@ OUI:3C7873*
 OUI:3C7A8A*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
+OUI:3C7C3F*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
 OUI:3C7D0A*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -53639,6 +53765,9 @@ OUI:408BF6*
 OUI:408D5C*
  ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
 
+OUI:409505*
+ ID_OUI_FROM_DATABASE=ACOINFO TECHNOLOGY CO.,LTD
+
 OUI:409558*
  ID_OUI_FROM_DATABASE=Aisino Corporation
 
@@ -53999,6 +54128,9 @@ OUI:40F02F*
 OUI:40F04E*
  ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
+OUI:40F078*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:40F14C*
  ID_OUI_FROM_DATABASE=ISE Europe SPRL
 
@@ -54077,6 +54209,9 @@ OUI:40F520*
 OUI:40F52E*
  ID_OUI_FROM_DATABASE=Leica Microsystems (Schweiz) AG
 
+OUI:40F946*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:40F9D5*
  ID_OUI_FROM_DATABASE=Tecore Networks
 
@@ -54278,6 +54413,9 @@ OUI:4434A7*
 OUI:44356F*
  ID_OUI_FROM_DATABASE=Neterix
 
+OUI:443583*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:443708*
  ID_OUI_FROM_DATABASE=MRV Comunications
 
@@ -54383,6 +54521,9 @@ OUI:4456E2*
 OUI:445829*
  ID_OUI_FROM_DATABASE=Cisco SPVTG
 
+OUI:445943*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:44599F*
  ID_OUI_FROM_DATABASE=Criticare Systems, Inc
 
@@ -54518,6 +54659,9 @@ OUI:4486C1*
 OUI:448723*
  ID_OUI_FROM_DATABASE=HOYA SERVICE CORPORATION
 
+OUI:4487DB*
+ ID_OUI_FROM_DATABASE=Tymphany Acoustic Technology (Huizhou) Co.,  Ltd.
+
 OUI:4487FC*
  ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
@@ -54542,6 +54686,9 @@ OUI:448E81*
 OUI:448F17*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co., Ltd. ARTIK
 
+OUI:4490BB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:449160*
  ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
@@ -54585,7 +54732,7 @@ OUI:44A466*
  ID_OUI_FROM_DATABASE=GROUPE LDLC
 
 OUI:44A54E*
- ID_OUI_FROM_DATABASE=Qorvo Utrecht B.V.
+ ID_OUI_FROM_DATABASE=Qorvo International Pte. Ltd.
 
 OUI:44A56E*
  ID_OUI_FROM_DATABASE=NETGEAR
@@ -54608,6 +54755,9 @@ OUI:44A842*
 OUI:44A8C2*
  ID_OUI_FROM_DATABASE=SEWOO TECH CO., LTD
 
+OUI:44A8FC*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:44AA27*
  ID_OUI_FROM_DATABASE=udworks Co., Ltd.
 
@@ -55115,6 +55265,9 @@ OUI:484AE9*
 OUI:484BAA*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:484BD4*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+
 OUI:484C86*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
@@ -57353,6 +57506,9 @@ OUI:50C4DD*
 OUI:50C58D*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
+OUI:50C68E*
+ ID_OUI_FROM_DATABASE=Biwin Semiconductor (HK) Company Limted
+
 OUI:50C6AD*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
@@ -58454,6 +58610,15 @@ OUI:581FEF*
 OUI:582059*
  ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
+OUI:58208A4*
+ ID_OUI_FROM_DATABASE=TRING
+
+OUI:58208A8*
+ ID_OUI_FROM_DATABASE=SAMIL CTS Co., Ltd.
+
+OUI:58208A9*
+ ID_OUI_FROM_DATABASE=Suzhou Ruilisi Technology Ltd.
+
 OUI:5820B1*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
@@ -58868,6 +59033,9 @@ OUI:58CB52*
 OUI:58CF4B*
  ID_OUI_FROM_DATABASE=Lufkin Industries
 
+OUI:58D061*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:58D071*
  ID_OUI_FROM_DATABASE=BW Broadcast
 
@@ -59093,6 +59261,9 @@ OUI:5C0038*
 OUI:5C026A*
  ID_OUI_FROM_DATABASE=Applied Vision Corporation
 
+OUI:5C0272*
+ ID_OUI_FROM_DATABASE=Silicon Laboratories
+
 OUI:5C0339*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -59213,6 +59384,9 @@ OUI:5C335C*
 OUI:5C338E*
  ID_OUI_FROM_DATABASE=Alpha Networks Inc.
 
+OUI:5C3400*
+ ID_OUI_FROM_DATABASE=HISENSE VISUAL TECHNOLOGY CO.,LTD
+
 OUI:5C353B*
  ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
 
@@ -59495,6 +59669,9 @@ OUI:5C9012*
 OUI:5C9157*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:5C91FD*
+ ID_OUI_FROM_DATABASE=Jaewoncnc
+
 OUI:5C925E*
  ID_OUI_FROM_DATABASE=Zioncom Electronics (Shenzhen) Ltd.
 
@@ -59699,6 +59876,9 @@ OUI:5CD5B5*
 OUI:5CD61F*
  ID_OUI_FROM_DATABASE=Qardio, Inc
 
+OUI:5CD89E*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:5CD998*
  ID_OUI_FROM_DATABASE=D-Link Corporation
 
@@ -60809,6 +60989,9 @@ OUI:642184*
 OUI:642216*
  ID_OUI_FROM_DATABASE=Shandong Taixin Electronic co.,Ltd
 
+OUI:642315*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:642400*
  ID_OUI_FROM_DATABASE=Xorcom Ltd.
 
@@ -60983,6 +61166,9 @@ OUI:645D92*
 OUI:645DD7*
  ID_OUI_FROM_DATABASE=Shenzhen Lifesense Medical Electronics Co., Ltd.
 
+OUI:645E10*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:645E2C*
  ID_OUI_FROM_DATABASE=IRay Technology Co., Ltd.
 
@@ -61268,6 +61454,9 @@ OUI:64AEF1*
 OUI:64B0A6*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:64B0E8*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:64B21D*
  ID_OUI_FROM_DATABASE=Chengdu Phycom Tech Co., Ltd.
 
@@ -61367,6 +61556,9 @@ OUI:64D1A3*
 OUI:64D241*
  ID_OUI_FROM_DATABASE=Keith & Koep GmbH
 
+OUI:64D2C4*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:64D4BD*
  ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO., LTD.
 
@@ -61475,6 +61667,9 @@ OUI:64F2FB*
 OUI:64F50E*
  ID_OUI_FROM_DATABASE=Kinion Technology Company Limited
 
+OUI:64F54E*
+ ID_OUI_FROM_DATABASE=EM Microelectronic
+
 OUI:64F69D*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -61490,6 +61685,9 @@ OUI:64F81C*
 OUI:64F88A*
  ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
 
+OUI:64F947*
+ ID_OUI_FROM_DATABASE=Senscomm Semiconductor Co., Ltd.
+
 OUI:64F970*
  ID_OUI_FROM_DATABASE=Kenade Electronics Technology Co.,LTD.
 
@@ -61592,6 +61790,9 @@ OUI:68122D*
 OUI:681295*
  ID_OUI_FROM_DATABASE=Lupine Lighting Systems GmbH
 
+OUI:681324*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:681401*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -62003,6 +62204,9 @@ OUI:689C70*
 OUI:689CE2*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:689E0B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:689E19*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
@@ -63171,7 +63375,7 @@ OUI:702F35*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
 OUI:702F4B*
- ID_OUI_FROM_DATABASE=PolyVision Inc.
+ ID_OUI_FROM_DATABASE=Steelcase Inc.
 
 OUI:702F97*
  ID_OUI_FROM_DATABASE=Aava Mobile Oy
@@ -63479,6 +63683,9 @@ OUI:7072CF*
 OUI:7073CB*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:707414*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+
 OUI:707630*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
@@ -63947,6 +64154,9 @@ OUI:70B3D5053*
 OUI:70B3D5054*
  ID_OUI_FROM_DATABASE=Groupeer Technologies
 
+OUI:70B3D5055*
+ ID_OUI_FROM_DATABASE=BAE SYSTEMS
+
 OUI:70B3D5056*
  ID_OUI_FROM_DATABASE=MIRAE INFORMATION TECHNOLOGY CO., LTD.
 
@@ -64152,7 +64362,7 @@ OUI:70B3D509B*
  ID_OUI_FROM_DATABASE=Jacarta Ltd
 
 OUI:70B3D509D*
- ID_OUI_FROM_DATABASE=P&S GmbH
+ ID_OUI_FROM_DATABASE=PuS GmbH und Co. KG
 
 OUI:70B3D509E*
  ID_OUI_FROM_DATABASE=MobiPromo
@@ -65309,6 +65519,9 @@ OUI:70B3D5240*
 OUI:70B3D5241*
  ID_OUI_FROM_DATABASE=Bolide Technology Group, Inc.
 
+OUI:70B3D5242*
+ ID_OUI_FROM_DATABASE=Comeo Technology Co.,Ltd
+
 OUI:70B3D5243*
  ID_OUI_FROM_DATABASE=Rohde&Schwarz Topex SA
 
@@ -65735,6 +65948,9 @@ OUI:70B3D52DB*
 OUI:70B3D52DC*
  ID_OUI_FROM_DATABASE=Bolide Technology Group, Inc.
 
+OUI:70B3D52DD*
+ ID_OUI_FROM_DATABASE=Melissa Climate Jsc
+
 OUI:70B3D52DE*
  ID_OUI_FROM_DATABASE=YUYAMA MFG Co.,Ltd
 
@@ -66035,6 +66251,9 @@ OUI:70B3D534D*
 OUI:70B3D534E*
  ID_OUI_FROM_DATABASE=Risk Expert sarl
 
+OUI:70B3D534F*
+ ID_OUI_FROM_DATABASE=Royal Engineering Consultancy Private Limited
+
 OUI:70B3D5350*
  ID_OUI_FROM_DATABASE=Tickster AB
 
@@ -66185,6 +66404,9 @@ OUI:70B3D5384*
 OUI:70B3D5385*
  ID_OUI_FROM_DATABASE=Kamacho Scale Co., Ltd.
 
+OUI:70B3D5386*
+ ID_OUI_FROM_DATABASE=GPSat Systems
+
 OUI:70B3D5387*
  ID_OUI_FROM_DATABASE=GWF MessSysteme AG
 
@@ -66497,6 +66719,9 @@ OUI:70B3D53FB*
 OUI:70B3D53FC*
  ID_OUI_FROM_DATABASE=TangRen C&S CO., Ltd
 
+OUI:70B3D53FD*
+ ID_OUI_FROM_DATABASE=NaraControls Inc
+
 OUI:70B3D53FE*
  ID_OUI_FROM_DATABASE=Mentor Graphics
 
@@ -66563,6 +66788,9 @@ OUI:70B3D5414*
 OUI:70B3D5415*
  ID_OUI_FROM_DATABASE=IDEA SPA
 
+OUI:70B3D5416*
+ ID_OUI_FROM_DATABASE=Antlia Systems
+
 OUI:70B3D5417*
  ID_OUI_FROM_DATABASE=Figment Design Laboratories
 
@@ -66701,6 +66929,9 @@ OUI:70B3D5448*
 OUI:70B3D5449*
  ID_OUI_FROM_DATABASE=Edgeware AB
 
+OUI:70B3D544A*
+ ID_OUI_FROM_DATABASE=CANON ELECTRON TUBES & DEVICES CO., LTD.
+
 OUI:70B3D544B*
  ID_OUI_FROM_DATABASE=Open System Solutions Limited
 
@@ -67142,6 +67373,9 @@ OUI:70B3D54F3*
 OUI:70B3D54F4*
  ID_OUI_FROM_DATABASE=WiTagg, Inc
 
+OUI:70B3D54F5*
+ ID_OUI_FROM_DATABASE=Orlaco Products B.V.
+
 OUI:70B3D54F6*
  ID_OUI_FROM_DATABASE=DORLET SAU
 
@@ -67682,6 +67916,9 @@ OUI:70B3D55BE*
 OUI:70B3D55BF*
  ID_OUI_FROM_DATABASE=Aton srl
 
+OUI:70B3D55C0*
+ ID_OUI_FROM_DATABASE=Shenzhen Lianfaxun Electronic Technology Co., Ltd
+
 OUI:70B3D55C1*
  ID_OUI_FROM_DATABASE=Shanghai JaWay Information Technology Co., Ltd.
 
@@ -68063,6 +68300,9 @@ OUI:70B3D564B*
 OUI:70B3D564C*
  ID_OUI_FROM_DATABASE=ACEMIS FRANCE
 
+OUI:70B3D564D*
+ ID_OUI_FROM_DATABASE=SANMINA ISRAEL MEDICAL SYSTEMS LTD
+
 OUI:70B3D564E*
  ID_OUI_FROM_DATABASE=BigStuff3, Inc.
 
@@ -68225,6 +68465,9 @@ OUI:70B3D5688*
 OUI:70B3D5689*
  ID_OUI_FROM_DATABASE=Prisma Telecom Testing Srl
 
+OUI:70B3D568A*
+ ID_OUI_FROM_DATABASE=Advanced Telecommunications Research Institute International
+
 OUI:70B3D568B*
  ID_OUI_FROM_DATABASE=Sadel S.p.A.
 
@@ -68303,6 +68546,9 @@ OUI:70B3D56A5*
 OUI:70B3D56A6*
  ID_OUI_FROM_DATABASE=WOW System
 
+OUI:70B3D56A7*
+ ID_OUI_FROM_DATABASE=Partilink Inc.
+
 OUI:70B3D56A8*
  ID_OUI_FROM_DATABASE=Vitsch Electronics
 
@@ -68421,7 +68667,7 @@ OUI:70B3D56D3*
  ID_OUI_FROM_DATABASE=DEUTA-WERKE GmbH
 
 OUI:70B3D56D6*
- ID_OUI_FROM_DATABASE=KMtronic Ltd.
+ ID_OUI_FROM_DATABASE=KMtronic ltd
 
 OUI:70B3D56D7*
  ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
@@ -68615,6 +68861,9 @@ OUI:70B3D5719*
 OUI:70B3D571B*
  ID_OUI_FROM_DATABASE=elsys
 
+OUI:70B3D571C*
+ ID_OUI_FROM_DATABASE=Konzept Informationssysteme GmbH
+
 OUI:70B3D571E*
  ID_OUI_FROM_DATABASE=Motec Pty Ltd
 
@@ -69083,6 +69332,9 @@ OUI:70B3D57C3*
 OUI:70B3D57C4*
  ID_OUI_FROM_DATABASE=MECT SRL
 
+OUI:70B3D57C5*
+ ID_OUI_FROM_DATABASE=Projects Unlimited Inc.
+
 OUI:70B3D57C6*
  ID_OUI_FROM_DATABASE=Utrend Technology (Shanghai) Co., Ltd
 
@@ -69353,6 +69605,9 @@ OUI:70B3D5828*
 OUI:70B3D582A*
  ID_OUI_FROM_DATABASE=C W F Hamilton & Co Ltd
 
+OUI:70B3D582B*
+ ID_OUI_FROM_DATABASE=Shangnuo company
+
 OUI:70B3D582C*
  ID_OUI_FROM_DATABASE=NELS Ltd.
 
@@ -69473,6 +69728,9 @@ OUI:70B3D5854*
 OUI:70B3D5855*
  ID_OUI_FROM_DATABASE=CRDE
 
+OUI:70B3D5856*
+ ID_OUI_FROM_DATABASE=Shanghai Westwell Information and Technology Company Ltd
+
 OUI:70B3D5857*
  ID_OUI_FROM_DATABASE=RCH ITALIA SPA
 
@@ -70091,6 +70349,9 @@ OUI:70B3D593B*
 OUI:70B3D593E*
  ID_OUI_FROM_DATABASE=Systems With Intelligence Inc.
 
+OUI:70B3D593F*
+ ID_OUI_FROM_DATABASE=Vision Sensing Co., Ltd.
+
 OUI:70B3D5940*
  ID_OUI_FROM_DATABASE=Paradigm Technology Services B.V.
 
@@ -70349,6 +70610,9 @@ OUI:70B3D599B*
 OUI:70B3D599C*
  ID_OUI_FROM_DATABASE=Enerwise Solutions Ltd.
 
+OUI:70B3D599D*
+ ID_OUI_FROM_DATABASE=Opsys-Tech
+
 OUI:70B3D599E*
  ID_OUI_FROM_DATABASE=Trinity College Dublin
 
@@ -70688,6 +70952,9 @@ OUI:70B3D5A18*
 OUI:70B3D5A19*
  ID_OUI_FROM_DATABASE=Qualitronix Madrass Pvt Ltd
 
+OUI:70B3D5A1A*
+ ID_OUI_FROM_DATABASE=Nueon - The COR
+
 OUI:70B3D5A1B*
  ID_OUI_FROM_DATABASE=Potter Electric Signal Co. LLC
 
@@ -71006,6 +71273,9 @@ OUI:70B3D5A8A*
 OUI:70B3D5A8B*
  ID_OUI_FROM_DATABASE=Giant Power Technology Biomedical Corporation
 
+OUI:70B3D5A8C*
+ ID_OUI_FROM_DATABASE=CYG CONTRON CO.LTD
+
 OUI:70B3D5A8D*
  ID_OUI_FROM_DATABASE=Code Blue Corporation
 
@@ -71261,6 +71531,9 @@ OUI:70B3D5AE6*
 OUI:70B3D5AE7*
  ID_OUI_FROM_DATABASE=E-T-A Elektrotechnische Apparate GmbH
 
+OUI:70B3D5AE8*
+ ID_OUI_FROM_DATABASE=Innoknight
+
 OUI:70B3D5AE9*
  ID_OUI_FROM_DATABASE=Cari Electronic
 
@@ -71633,6 +71906,9 @@ OUI:70B3D5B78*
 OUI:70B3D5B7A*
  ID_OUI_FROM_DATABASE=MAHLE
 
+OUI:70B3D5B7B*
+ ID_OUI_FROM_DATABASE=Doosan Digital Innovation America
+
 OUI:70B3D5B7C*
  ID_OUI_FROM_DATABASE=Electronic Navigation Ltd
 
@@ -72722,6 +72998,9 @@ OUI:70B3D5D11*
 OUI:70B3D5D12*
  ID_OUI_FROM_DATABASE=FIDELTRONIK POLAND SP. Z O.O.
 
+OUI:70B3D5D14*
+ ID_OUI_FROM_DATABASE=LIGPT
+
 OUI:70B3D5D15*
  ID_OUI_FROM_DATABASE=3DGence sp. z o.o.
 
@@ -72887,6 +73166,9 @@ OUI:70B3D5D50*
 OUI:70B3D5D51*
  ID_OUI_FROM_DATABASE=Azcom Technology S.r.l.
 
+OUI:70B3D5D53*
+ ID_OUI_FROM_DATABASE=BeiLi eTek (Zhangjiagang) Co., Ltd.
+
 OUI:70B3D5D54*
  ID_OUI_FROM_DATABASE=JL World Corporation Limited
 
@@ -73397,6 +73679,9 @@ OUI:70B3D5E0F*
 OUI:70B3D5E10*
  ID_OUI_FROM_DATABASE=Leidos
 
+OUI:70B3D5E11*
+ ID_OUI_FROM_DATABASE=Engage Technologies
+
 OUI:70B3D5E12*
  ID_OUI_FROM_DATABASE=SNK, Inc.
 
@@ -74045,6 +74330,9 @@ OUI:70B3D5F00*
 OUI:70B3D5F01*
  ID_OUI_FROM_DATABASE=Software Systems Plus
 
+OUI:70B3D5F02*
+ ID_OUI_FROM_DATABASE=ABECO Industrie Computer GmbH
+
 OUI:70B3D5F03*
  ID_OUI_FROM_DATABASE=GMI Ltd
 
@@ -74174,6 +74462,9 @@ OUI:70B3D5F2F*
 OUI:70B3D5F30*
  ID_OUI_FROM_DATABASE=ADE Technology Inc.
 
+OUI:70B3D5F32*
+ ID_OUI_FROM_DATABASE=Elektronik Art
+
 OUI:70B3D5F33*
  ID_OUI_FROM_DATABASE=Beijing Vizum Technology Co.,Ltd.
 
@@ -75248,6 +75539,9 @@ OUI:7440BB*
 OUI:7440BE*
  ID_OUI_FROM_DATABASE=LG Innotek
 
+OUI:74427F*
+ ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
+
 OUI:74428B*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -75521,6 +75815,9 @@ OUI:748EF8*
 OUI:748F1B*
  ID_OUI_FROM_DATABASE=MasterImage 3D
 
+OUI:748F3C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:748F4D*
  ID_OUI_FROM_DATABASE=MEN Mikro Elektronik GmbH
 
@@ -75959,6 +76256,9 @@ OUI:74F8DBF*
 OUI:74F91A*
  ID_OUI_FROM_DATABASE=Onface
 
+OUI:74F9CA*
+ ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
+
 OUI:74FDA0*
  ID_OUI_FROM_DATABASE=Compupal (Group) Corporation
 
@@ -76175,6 +76475,9 @@ OUI:7844FD*
 OUI:784501*
  ID_OUI_FROM_DATABASE=Biamp Systems
 
+OUI:784558*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+
 OUI:784561*
  ID_OUI_FROM_DATABASE=CyberTAN Technology Inc.
 
@@ -76233,7 +76536,7 @@ OUI:785364*
  ID_OUI_FROM_DATABASE=SHIFT GmbH
 
 OUI:7853F2*
- ID_OUI_FROM_DATABASE=ROXTON Ltd.
+ ID_OUI_FROM_DATABASE=Roxton Systems Ltd.
 
 OUI:78542E*
  ID_OUI_FROM_DATABASE=D-Link International
@@ -76736,6 +77039,9 @@ OUI:78D6B2*
 OUI:78D6F0*
  ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
+OUI:78D71A*
+ ID_OUI_FROM_DATABASE=Ciena Corporation
+
 OUI:78D752*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -76829,6 +77135,9 @@ OUI:78E2BD*
 OUI:78E3B5*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
+OUI:78E3DE*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:78E400*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -78551,6 +78860,9 @@ OUI:80C7C5*
 OUI:80C862*
  ID_OUI_FROM_DATABASE=Openpeak, Inc
 
+OUI:80CA4B*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LTD
+
 OUI:80CC12*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
@@ -78701,9 +79013,15 @@ OUI:80EB77*
 OUI:80ED2C*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:80EE25*
+ ID_OUI_FROM_DATABASE=Shenzhen Skyworth  Digital  Technology  CO., Ltd
+
 OUI:80EE73*
  ID_OUI_FROM_DATABASE=Shuttle Inc.
 
+OUI:80F1F1*
+ ID_OUI_FROM_DATABASE=Tech4home, Lda
+
 OUI:80F25E*
  ID_OUI_FROM_DATABASE=Kyynel
 
@@ -81308,6 +81626,9 @@ OUI:8CD48E*
 OUI:8CD628*
  ID_OUI_FROM_DATABASE=Ikor Metering
 
+OUI:8CD67F*
+ ID_OUI_FROM_DATABASE=EM Microelectronic
+
 OUI:8CDB25*
  ID_OUI_FROM_DATABASE=ESG Solutions
 
@@ -81875,6 +82196,9 @@ OUI:907F61*
 OUI:90812A*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:908158*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:908260*
  ID_OUI_FROM_DATABASE=IEEE 1904.1 Working Group
 
@@ -82004,6 +82328,9 @@ OUI:90A46A*
 OUI:90A4DE*
  ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
+OUI:90A5AF*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:90A62F*
  ID_OUI_FROM_DATABASE=NAVER
 
@@ -82145,6 +82472,9 @@ OUI:90C99B*
 OUI:90CC24*
  ID_OUI_FROM_DATABASE=Synaptics, Inc
 
+OUI:90CCDF*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:90CDB6*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -82346,6 +82676,9 @@ OUI:940149*
 OUI:9401C2*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:94026B*
+ ID_OUI_FROM_DATABASE=Optictimes Co.,Ltd
+
 OUI:94049C*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -83201,6 +83534,9 @@ OUI:94FE9D*
 OUI:94FEF4*
  ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
+OUI:94FF61*
+ ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
+
 OUI:98006A*
  ID_OUI_FROM_DATABASE=zte corporation
 
@@ -83570,6 +83906,9 @@ OUI:985FD3*
 OUI:986022*
  ID_OUI_FROM_DATABASE=EMW Co., Ltd.
 
+OUI:9860CA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:9866EA*
  ID_OUI_FROM_DATABASE=Industrial Control Communications, Inc.
 
@@ -84074,6 +84413,51 @@ OUI:98FB12*
 OUI:98FC11*
  ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
+OUI:98FC840*
+ ID_OUI_FROM_DATABASE=Leia, Inc
+
+OUI:98FC841*
+ ID_OUI_FROM_DATABASE=go-e GmbH
+
+OUI:98FC842*
+ ID_OUI_FROM_DATABASE=Juketek Co., Ltd.
+
+OUI:98FC843*
+ ID_OUI_FROM_DATABASE=Shanghai ZeXin Information Technologies Co. Ltd.
+
+OUI:98FC844*
+ ID_OUI_FROM_DATABASE=Sferrum GmbH
+
+OUI:98FC845*
+ ID_OUI_FROM_DATABASE=Zymbit
+
+OUI:98FC846*
+ ID_OUI_FROM_DATABASE=ZERONE CO., LTD.
+
+OUI:98FC847*
+ ID_OUI_FROM_DATABASE=Broadtech Technologies Co., Ltd.
+
+OUI:98FC848*
+ ID_OUI_FROM_DATABASE=Guangdong DE at science and technology co., LTD
+
+OUI:98FC849*
+ ID_OUI_FROM_DATABASE=Fath Mechatronics
+
+OUI:98FC84A*
+ ID_OUI_FROM_DATABASE=Shield Inc.
+
+OUI:98FC84B*
+ ID_OUI_FROM_DATABASE=chiconypower
+
+OUI:98FC84C*
+ ID_OUI_FROM_DATABASE=Shenzhen Incar Technology Co., Ltd.
+
+OUI:98FC84D*
+ ID_OUI_FROM_DATABASE=Jazwares LLC
+
+OUI:98FC84E*
+ ID_OUI_FROM_DATABASE=Dongguan Kingtron Electronics Tech Co., Ltd
+
 OUI:98FD74*
  ID_OUI_FROM_DATABASE=ACT.CO.LTD
 
@@ -84417,7 +84801,7 @@ OUI:9C685B*
  ID_OUI_FROM_DATABASE=Octonion SA
 
 OUI:9C6937*
- ID_OUI_FROM_DATABASE=Qorvo Utrecht B.V.
+ ID_OUI_FROM_DATABASE=Qorvo International Pte. Ltd.
 
 OUI:9C69B40*
  ID_OUI_FROM_DATABASE=Suzhou Fitcan Technology Co.,LTD
@@ -85433,6 +85817,9 @@ OUI:A07591*
 OUI:A075EA*
  ID_OUI_FROM_DATABASE=BoxLock, Inc.
 
+OUI:A0764E*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
+
 OUI:A07771*
  ID_OUI_FROM_DATABASE=Vialis BV
 
@@ -85451,6 +85838,9 @@ OUI:A082C7*
 OUI:A084CB*
  ID_OUI_FROM_DATABASE=SonicSensory,Inc.
 
+OUI:A085FC*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
+
 OUI:A0861D*
  ID_OUI_FROM_DATABASE=Chengdu Fuhuaxin Technology co.,Ltd
 
@@ -85772,6 +86162,9 @@ OUI:A0CF5B*
 OUI:A0CFF5*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:A0D0DC*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
 OUI:A0D12A*
  ID_OUI_FROM_DATABASE=AXPRO Technology Inc.
 
@@ -85904,6 +86297,9 @@ OUI:A0F9B7*
 OUI:A0F9E0*
  ID_OUI_FROM_DATABASE=VIVATEL COMPANY LIMITED
 
+OUI:A0FBC5*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:A0FC6E*
  ID_OUI_FROM_DATABASE=Telegrafia a.s.
 
@@ -86705,6 +87101,9 @@ OUI:A4C54E*
 OUI:A4C64F*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:A4C74B*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:A4C7DE*
  ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
 
@@ -87491,6 +87890,9 @@ OUI:A8BE27*
 OUI:A8BF3C*
  ID_OUI_FROM_DATABASE=HDV Phoelectron Technology Limited
 
+OUI:A8C092*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:A8C0EA*
  ID_OUI_FROM_DATABASE=Pepwave Limited
 
@@ -87713,6 +88115,9 @@ OUI:AC1826*
 OUI:AC199F*
  ID_OUI_FROM_DATABASE=SUNGROW POWER SUPPLY CO.,LTD.
 
+OUI:AC1D06*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:AC1DDF0*
  ID_OUI_FROM_DATABASE=PiOctave Solutions Pvt Ltd
 
@@ -88679,6 +89084,9 @@ OUI:B0416F*
 OUI:B0435D*
  ID_OUI_FROM_DATABASE=NuLEDs, Inc.
 
+OUI:B04414*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
 OUI:B04502*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
@@ -89504,6 +89912,9 @@ OUI:B435F7*
 OUI:B436A9*
  ID_OUI_FROM_DATABASE=Fibocom Wireless Inc.
 
+OUI:B436D1*
+ ID_OUI_FROM_DATABASE=Renesas Electronics (Penang) Sdn. Bhd.
+
 OUI:B436E3*
  ID_OUI_FROM_DATABASE=KBVISION GROUP
 
@@ -89939,6 +90350,9 @@ OUI:B4AA4D*
 OUI:B4AB2C*
  ID_OUI_FROM_DATABASE=MtM Technology Corporation
 
+OUI:B4ADA3*
+ ID_OUI_FROM_DATABASE=Guangzhou Shiyuan Electronic Technology Company Limited
+
 OUI:B4AE2B*
  ID_OUI_FROM_DATABASE=Microsoft
 
@@ -90416,6 +90830,9 @@ OUI:B85D0A*
 OUI:B85E7B*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:B85F98*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
 OUI:B86091*
  ID_OUI_FROM_DATABASE=Onnet Technologies and Innovations LLC
 
@@ -90782,6 +91199,9 @@ OUI:B8CEF6*
 OUI:B8D06F*
  ID_OUI_FROM_DATABASE=GUANGZHOU HKUST FOK YING TUNG RESEARCH INSTITUTE
 
+OUI:B8D309*
+ ID_OUI_FROM_DATABASE=Cox Communications, Inc
+
 OUI:B8D49D*
  ID_OUI_FROM_DATABASE=M Seven System Ltd.
 
@@ -91427,6 +91847,9 @@ OUI:BC765E*
 OUI:BC7670*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:BC76C5*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:BC7737*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -91601,6 +92024,9 @@ OUI:BCA511*
 OUI:BCA58B*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:BCA5A9*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:BCA8A6*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -92048,6 +92474,9 @@ OUI:C05E79*
 OUI:C06118*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
+OUI:C0619A0*
+ ID_OUI_FROM_DATABASE=Paragon Robotics LLC
+
 OUI:C0619A1*
  ID_OUI_FROM_DATABASE=KidKraft
 
@@ -92078,12 +92507,18 @@ OUI:C0619A9*
 OUI:C0619AA*
  ID_OUI_FROM_DATABASE=Gronn Kontakt AS
 
+OUI:C0619AB*
+ ID_OUI_FROM_DATABASE=Victron Energy B.V.
+
 OUI:C0619AC*
  ID_OUI_FROM_DATABASE=JAM-Labs Corp
 
 OUI:C0619AD*
  ID_OUI_FROM_DATABASE=Uhnder
 
+OUI:C0619AE*
+ ID_OUI_FROM_DATABASE=Zhejiang Haikang Science And Technology Co.,Ltd
+
 OUI:C0626B*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -92714,6 +93149,9 @@ OUI:C413E2*
 OUI:C4143C*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:C41688*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:C416FA*
  ID_OUI_FROM_DATABASE=Prysm Inc
 
@@ -93195,7 +93633,7 @@ OUI:C49880*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
 OUI:C49886*
- ID_OUI_FROM_DATABASE=Qorvo Utrecht B.V.
+ ID_OUI_FROM_DATABASE=Qorvo International Pte. Ltd.
 
 OUI:C49A02*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
@@ -93344,6 +93782,9 @@ OUI:C4DA26*
 OUI:C4DA7D*
  ID_OUI_FROM_DATABASE=Ivium Technologies B.V.
 
+OUI:C4DD57*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
+
 OUI:C4E032*
  ID_OUI_FROM_DATABASE=IEEE 1904.1 Working Group
 
@@ -93548,6 +93989,12 @@ OUI:C816A5*
 OUI:C816BD*
  ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
 
+OUI:C816DA*
+ ID_OUI_FROM_DATABASE=Realme Chongqing Mobile Telecommunications Corp.,Ltd.
+
+OUI:C81739*
+ ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
+
 OUI:C819F7*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -93783,7 +94230,7 @@ OUI:C863141*
  ID_OUI_FROM_DATABASE=Autonics Co., Ltd.
 
 OUI:C863142*
- ID_OUI_FROM_DATABASE=Tymphany Acoustic Technology (Huizhou) Co., Ltd.
+ ID_OUI_FROM_DATABASE=Tymphany Acoustic Technology (Huizhou) Co.,  Ltd.
 
 OUI:C863143*
  ID_OUI_FROM_DATABASE=TrackMan
@@ -94229,6 +94676,9 @@ OUI:C8E1A7*
 OUI:C8E42F*
  ID_OUI_FROM_DATABASE=Technical Research Design and Development
 
+OUI:C8E600*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:C8E776*
  ID_OUI_FROM_DATABASE=PTCOM Technology
 
@@ -94319,6 +94769,9 @@ OUI:C8FD19*
 OUI:C8FE30*
  ID_OUI_FROM_DATABASE=Bejing DAYO Mobile Communication Technology Ltd.
 
+OUI:C8FE6A*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
 OUI:C8FF28*
  ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
@@ -95364,7 +95817,7 @@ OUI:D01411A*
  ID_OUI_FROM_DATABASE=ABB EVI SPA
 
 OUI:D01411B*
- ID_OUI_FROM_DATABASE=CYLTek Co.,LTD.
+ ID_OUI_FROM_DATABASE=CYLTek Limited
 
 OUI:D01411C*
  ID_OUI_FROM_DATABASE=Shen Zhen HaiHe Hi-Tech Co., Ltd
@@ -95402,6 +95855,9 @@ OUI:D01C3C*
 OUI:D01CBB*
  ID_OUI_FROM_DATABASE=Beijing Ctimes Digital Technology Co., Ltd.
 
+OUI:D021F9*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+
 OUI:D022120*
  ID_OUI_FROM_DATABASE=Spirit IT B.V.
 
@@ -95505,7 +95961,7 @@ OUI:D039EA*
  ID_OUI_FROM_DATABASE=NetApp
 
 OUI:D03D52*
- ID_OUI_FROM_DATABASE=Vaion Limited
+ ID_OUI_FROM_DATABASE=Ava Security Limited
 
 OUI:D03DC3*
  ID_OUI_FROM_DATABASE=AQ Corporation
@@ -96050,6 +96506,9 @@ OUI:D0D0FD*
 OUI:D0D212*
  ID_OUI_FROM_DATABASE=K2NET Co.,Ltd.
 
+OUI:D0D23C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:D0D286*
  ID_OUI_FROM_DATABASE=Beckman Coulter K.K.
 
@@ -96434,6 +96893,9 @@ OUI:D44649*
 OUI:D446E1*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:D4482D*
+ ID_OUI_FROM_DATABASE=Shenzhen Deejoy Lighting Technology Co.,Ltd.
+
 OUI:D44B5E*
  ID_OUI_FROM_DATABASE=TAIYO YUDEN CO., LTD.
 
@@ -96576,7 +97038,7 @@ OUI:D46A6A*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
 OUI:D46A91*
- ID_OUI_FROM_DATABASE=Snap AV
+ ID_OUI_FROM_DATABASE=SnapAV
 
 OUI:D46AA8*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
@@ -96956,6 +97418,9 @@ OUI:D4D2E5*
 OUI:D4D50D*
  ID_OUI_FROM_DATABASE=Southwest Microwave, Inc
 
+OUI:D4D51B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:D4D748*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -97595,6 +98060,9 @@ OUI:D8A25E*
 OUI:D8A315*
  ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
+OUI:D8A491*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:D8A534*
  ID_OUI_FROM_DATABASE=Spectronix Corporation
 
@@ -97847,6 +98315,12 @@ OUI:D8F3DB*
 OUI:D8F710*
  ID_OUI_FROM_DATABASE=Libre Wireless Technologies Inc.
 
+OUI:D8F883*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
+OUI:D8F8AF*
+ ID_OUI_FROM_DATABASE=DAONTEC
+
 OUI:D8FB11*
  ID_OUI_FROM_DATABASE=AXACORE
 
@@ -97871,6 +98345,9 @@ OUI:D8FEE3*
 OUI:DC0077*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
+OUI:DC00B0*
+ ID_OUI_FROM_DATABASE=FREEBOX SAS
+
 OUI:DC0265*
  ID_OUI_FROM_DATABASE=Meditech Kft
 
@@ -98153,6 +98630,9 @@ OUI:DC4F22*
 OUI:DC503A*
  ID_OUI_FROM_DATABASE=Nanjing Ticom Tech Co., Ltd.
 
+OUI:DC5285*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:DC5360*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -98246,6 +98726,9 @@ OUI:DC7385*
 OUI:DC74A8*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:DC774C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:DC7834*
  ID_OUI_FROM_DATABASE=LOGICOM SA
 
@@ -99782,6 +100265,9 @@ OUI:E45D75*
 OUI:E45E37*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:E45F01*
+ ID_OUI_FROM_DATABASE=Raspberry Pi Trading Ltd
+
 OUI:E46059*
  ID_OUI_FROM_DATABASE=Pingtek Co., Ltd.
 
@@ -99821,6 +100307,9 @@ OUI:E472E2*
 OUI:E4751E*
  ID_OUI_FROM_DATABASE=Getinge Sterilization AB
 
+OUI:E475DC*
+ ID_OUI_FROM_DATABASE=Arcadyan Corporation
+
 OUI:E47684*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -99875,6 +100364,9 @@ OUI:E48326*
 OUI:E48399*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
+OUI:E4842B*
+ ID_OUI_FROM_DATABASE=HANGZHOU SOFTEL OPTIC CO., LTD
+
 OUI:E48501*
  ID_OUI_FROM_DATABASE=Geberit International AG
 
@@ -100601,6 +101093,9 @@ OUI:E86FF2*
 OUI:E8718D*
  ID_OUI_FROM_DATABASE=Elsys Equipamentos Eletronicos Ltda
 
+OUI:E874C7*
+ ID_OUI_FROM_DATABASE=Sentinhealth
+
 OUI:E874E6*
  ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
@@ -100622,6 +101117,9 @@ OUI:E8802E*
 OUI:E880D8*
  ID_OUI_FROM_DATABASE=GNTEK Electronics Co.,Ltd.
 
+OUI:E88152*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:E8825B*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
@@ -101159,6 +101657,9 @@ OUI:EC3DFD*
 OUI:EC3E09*
  ID_OUI_FROM_DATABASE=PERFORMANCE DESIGNED PRODUCTS, LLC
 
+OUI:EC3EB3*
+ ID_OUI_FROM_DATABASE=Zyxel Communications Corporation
+
 OUI:EC3EF7*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
@@ -101201,6 +101702,9 @@ OUI:EC4993*
 OUI:EC4C4D*
  ID_OUI_FROM_DATABASE=ZAO NPK RoTeK
 
+OUI:EC4D3E*
+ ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
+
 OUI:EC4D47*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -101630,6 +102134,9 @@ OUI:ECF00E*
 OUI:ECF0FE*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:ECF22B*
+ ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
+
 OUI:ECF236*
  ID_OUI_FROM_DATABASE=NEOMONTANA ELECTRONICS
 
@@ -103547,6 +104054,9 @@ OUI:F80FF9*
 OUI:F81037*
  ID_OUI_FROM_DATABASE=Atopia Systems, LP
 
+OUI:F81093*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:F81308*
  ID_OUI_FROM_DATABASE=Nokia
 
@@ -103667,6 +104177,9 @@ OUI:F82D7C*
 OUI:F82DC0*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
+OUI:F82E3F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:F82E8E*
  ID_OUI_FROM_DATABASE=Nanjing Kechen Electric Co., Ltd.
 
@@ -104618,9 +105131,15 @@ OUI:FC4203*
 OUI:FC4463*
  ID_OUI_FROM_DATABASE=Universal Audio, Inc
 
+OUI:FC4482*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:FC4499*
  ID_OUI_FROM_DATABASE=Swarco LEA d.o.o.
 
+OUI:FC449F*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:FC455F*
  ID_OUI_FROM_DATABASE=JIANGXI SHANSHUI OPTOELECTRONIC TECHNOLOGY CO.,LTD
 
@@ -104711,6 +105230,9 @@ OUI:FC64BA*
 OUI:FC65DE*
  ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
+OUI:FC66CF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:FC683E*
  ID_OUI_FROM_DATABASE=Directed Perception, Inc
 
@@ -104945,6 +105467,9 @@ OUI:FCB0C4*
 OUI:FCB10D*
  ID_OUI_FROM_DATABASE=Shenzhen Tian Kun Technology Co.,LTD.
 
+OUI:FCB3BC*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:FCB4E6*
  ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
index efd26dc1ef521a5ce7ab63e14782cb4c6f2b9dab..f6f948e35580e43790e526ed476e685325d18de3 100644 (file)
@@ -132,6 +132,9 @@ acpi:HWPE*:
 acpi:HXTS*:
  ID_VENDOR_FROM_DATABASE=Guizhou Huaxintong Semiconductor Technology Co., Ltd
 
+acpi:HYGO*:
+ ID_VENDOR_FROM_DATABASE=CHENGDU HAIGUANG IC DESIGN CO., LTD
+
 acpi:IBMX*:
  ID_VENDOR_FROM_DATABASE=IBM
 
index d2284b5c7e066ac9a64cdbde2f1b62c0057f5727..c7a88660eab4d2737cc484b8e825b6d42be5af20 100644 (file)
@@ -1,5 +1,5 @@
---- 20-acpi-vendor.hwdb.base   2020-07-06 17:50:38.655308539 +0200
-+++ 20-acpi-vendor.hwdb        2020-07-06 17:50:38.678308990 +0200
+--- 20-acpi-vendor.hwdb.base   2020-07-23 17:21:29.955652649 +0200
++++ 20-acpi-vendor.hwdb        2020-07-23 17:21:29.974652774 +0200
 @@ -3,6 +3,8 @@
  # Data imported from:
  #     https://uefi.org/uefi-pnp-export
@@ -19,7 +19,7 @@
  acpi:AMDI*:
   ID_VENDOR_FROM_DATABASE=AMD
  
-@@ -286,6 +285,9 @@
+@@ -289,6 +288,9 @@
  acpi:AAA*:
   ID_VENDOR_FROM_DATABASE=Avolites Ltd
  
@@ -29,7 +29,7 @@
  acpi:AAE*:
   ID_VENDOR_FROM_DATABASE=Anatek Electronics Inc.
  
-@@ -313,6 +315,9 @@
+@@ -316,6 +318,9 @@
  acpi:ABO*:
   ID_VENDOR_FROM_DATABASE=D-Link Systems Inc
  
@@ -39,7 +39,7 @@
  acpi:ABS*:
   ID_VENDOR_FROM_DATABASE=Abaco Systems, Inc.
  
-@@ -358,7 +363,7 @@
+@@ -361,7 +366,7 @@
  acpi:ACO*:
   ID_VENDOR_FROM_DATABASE=Allion Computer Inc.
  
@@ -48,7 +48,7 @@
   ID_VENDOR_FROM_DATABASE=Aspen Tech Inc
  
  acpi:ACR*:
-@@ -631,6 +636,9 @@
+@@ -634,6 +639,9 @@
  acpi:AMT*:
   ID_VENDOR_FROM_DATABASE=AMT International Industry
  
@@ -58,7 +58,7 @@
  acpi:AMX*:
   ID_VENDOR_FROM_DATABASE=AMX LLC
  
-@@ -679,6 +687,9 @@
+@@ -682,6 +690,9 @@
  acpi:AOA*:
   ID_VENDOR_FROM_DATABASE=AOpen Inc.
  
@@ -68,7 +68,7 @@
  acpi:AOE*:
   ID_VENDOR_FROM_DATABASE=Advanced Optics Electronics, Inc.
  
-@@ -688,6 +699,9 @@
+@@ -691,6 +702,9 @@
  acpi:AOT*:
   ID_VENDOR_FROM_DATABASE=Alcatel
  
@@ -78,7 +78,7 @@
  acpi:APC*:
   ID_VENDOR_FROM_DATABASE=American Power Conversion
  
-@@ -863,7 +877,7 @@
+@@ -866,7 +880,7 @@
   ID_VENDOR_FROM_DATABASE=Alps Electric Inc
  
  acpi:AUO*:
@@ -87,7 +87,7 @@
  
  acpi:AUR*:
   ID_VENDOR_FROM_DATABASE=Aureal Semiconductor
-@@ -943,6 +957,9 @@
+@@ -946,6 +960,9 @@
  acpi:AXE*:
   ID_VENDOR_FROM_DATABASE=Axell Corporation
  
@@ -97,7 +97,7 @@
  acpi:AXI*:
   ID_VENDOR_FROM_DATABASE=American Magnetics
  
-@@ -1093,6 +1110,9 @@
+@@ -1096,6 +1113,9 @@
  acpi:BML*:
   ID_VENDOR_FROM_DATABASE=BIOMED Lab
  
  acpi:BMS*:
   ID_VENDOR_FROM_DATABASE=BIOMEDISYS
  
-@@ -1105,6 +1125,9 @@
+@@ -1108,6 +1128,9 @@
  acpi:BNO*:
   ID_VENDOR_FROM_DATABASE=Bang & Olufsen
  
  acpi:BNS*:
   ID_VENDOR_FROM_DATABASE=Boulder Nonlinear Systems
  
-@@ -1345,6 +1368,9 @@
+@@ -1348,6 +1371,9 @@
  acpi:CHA*:
   ID_VENDOR_FROM_DATABASE=Chase Research PLC
  
  acpi:CHD*:
   ID_VENDOR_FROM_DATABASE=ChangHong Electric Co.,Ltd
  
-@@ -1498,6 +1524,9 @@
+@@ -1501,6 +1527,9 @@
  acpi:COD*:
   ID_VENDOR_FROM_DATABASE=CODAN Pty. Ltd.
  
  acpi:COI*:
   ID_VENDOR_FROM_DATABASE=Codec Inc.
  
-@@ -1904,7 +1933,7 @@
+@@ -1907,7 +1936,7 @@
   ID_VENDOR_FROM_DATABASE=Dragon Information Technology
  
  acpi:DJE*:
  
  acpi:DJP*:
   ID_VENDOR_FROM_DATABASE=Maygay Machines, Ltd
-@@ -2236,6 +2265,9 @@
+@@ -2239,6 +2268,9 @@
  acpi:EIN*:
   ID_VENDOR_FROM_DATABASE=Elegant Invention
  
  acpi:EKA*:
   ID_VENDOR_FROM_DATABASE=MagTek Inc.
  
-@@ -2497,6 +2529,9 @@
+@@ -2500,6 +2532,9 @@
  acpi:FCG*:
   ID_VENDOR_FROM_DATABASE=First International Computer Ltd
  
  acpi:FCS*:
   ID_VENDOR_FROM_DATABASE=Focus Enhancements, Inc.
  
-@@ -2870,7 +2905,7 @@
+@@ -2873,7 +2908,7 @@
   ID_VENDOR_FROM_DATABASE=General Standards Corporation
  
  acpi:GSM*:
  
  acpi:GSN*:
   ID_VENDOR_FROM_DATABASE=Grandstream Networks, Inc.
-@@ -2971,6 +3006,9 @@
+@@ -2974,6 +3009,9 @@
  acpi:HEC*:
   ID_VENDOR_FROM_DATABASE=Hisense Electric Co., Ltd.
  
  acpi:HEL*:
   ID_VENDOR_FROM_DATABASE=Hitachi Micro Systems Europe Ltd
  
-@@ -3100,6 +3138,9 @@
+@@ -3103,6 +3141,9 @@
  acpi:HSD*:
   ID_VENDOR_FROM_DATABASE=HannStar Display Corp
  
  acpi:HSM*:
   ID_VENDOR_FROM_DATABASE=AT&T Microelectronics
  
-@@ -3223,6 +3264,9 @@
+@@ -3226,6 +3267,9 @@
  acpi:ICI*:
   ID_VENDOR_FROM_DATABASE=Infotek Communication Inc
  
  acpi:ICM*:
   ID_VENDOR_FROM_DATABASE=Intracom SA
  
-@@ -3319,6 +3363,9 @@
+@@ -3322,6 +3366,9 @@
  acpi:IKE*:
   ID_VENDOR_FROM_DATABASE=Ikegami Tsushinki Co. Ltd.
  
  acpi:IKS*:
   ID_VENDOR_FROM_DATABASE=Ikos Systems Inc
  
-@@ -3364,6 +3411,9 @@
+@@ -3367,6 +3414,9 @@
  acpi:IMT*:
   ID_VENDOR_FROM_DATABASE=Inmax Technology Corporation
  
  acpi:INA*:
   ID_VENDOR_FROM_DATABASE=Inventec Corporation
  
-@@ -3871,6 +3921,9 @@
+@@ -3874,6 +3924,9 @@
  acpi:LAN*:
   ID_VENDOR_FROM_DATABASE=Sodeman Lancom Inc
  
  acpi:LAS*:
   ID_VENDOR_FROM_DATABASE=LASAT Comm. A/S
  
-@@ -3916,6 +3969,9 @@
+@@ -3919,6 +3972,9 @@
  acpi:LED*:
   ID_VENDOR_FROM_DATABASE=Long Engineering Design Inc
  
  acpi:LEG*:
   ID_VENDOR_FROM_DATABASE=Legerity, Inc
  
-@@ -3931,6 +3987,9 @@
+@@ -3934,6 +3990,9 @@
  acpi:LGC*:
   ID_VENDOR_FROM_DATABASE=Logic Ltd
  
  acpi:LGI*:
   ID_VENDOR_FROM_DATABASE=Logitech Inc
  
-@@ -3985,6 +4044,9 @@
+@@ -3988,6 +4047,9 @@
  acpi:LND*:
   ID_VENDOR_FROM_DATABASE=Land Computer Company Ltd
  
  acpi:LNK*:
   ID_VENDOR_FROM_DATABASE=Link Tech Inc
  
-@@ -4019,7 +4081,7 @@
+@@ -4022,7 +4084,7 @@
   ID_VENDOR_FROM_DATABASE=Design Technology
  
  acpi:LPL*:
  
  acpi:LSC*:
   ID_VENDOR_FROM_DATABASE=LifeSize Communications
-@@ -4195,6 +4257,9 @@
+@@ -4198,6 +4260,9 @@
  acpi:MCX*:
   ID_VENDOR_FROM_DATABASE=Millson Custom Solutions Inc.
  
  acpi:MDA*:
   ID_VENDOR_FROM_DATABASE=Media4 Inc
  
-@@ -4432,6 +4497,9 @@
+@@ -4435,6 +4500,9 @@
  acpi:MOM*:
   ID_VENDOR_FROM_DATABASE=Momentum Data Systems
  
  acpi:MOS*:
   ID_VENDOR_FROM_DATABASE=Moses Corporation
  
-@@ -4657,6 +4725,9 @@
+@@ -4660,6 +4728,9 @@
  acpi:NAL*:
   ID_VENDOR_FROM_DATABASE=Network Alchemy
  
  acpi:NAT*:
   ID_VENDOR_FROM_DATABASE=NaturalPoint Inc.
  
-@@ -5161,6 +5232,9 @@
+@@ -5164,6 +5235,9 @@
  acpi:PCX*:
   ID_VENDOR_FROM_DATABASE=PC Xperten
  
  acpi:PDM*:
   ID_VENDOR_FROM_DATABASE=Psion Dacom Plc.
  
-@@ -5224,9 +5298,6 @@
+@@ -5227,9 +5301,6 @@
  acpi:PHE*:
   ID_VENDOR_FROM_DATABASE=Philips Medical Systems Boeblingen GmbH
  
  acpi:PHL*:
   ID_VENDOR_FROM_DATABASE=Philips Consumer Electronics Company
  
-@@ -5314,9 +5385,6 @@
+@@ -5317,9 +5388,6 @@
  acpi:PNL*:
   ID_VENDOR_FROM_DATABASE=Panelview, Inc.
  
  acpi:PNR*:
   ID_VENDOR_FROM_DATABASE=Planar Systems, Inc.
  
-@@ -5452,15 +5520,9 @@
+@@ -5455,15 +5523,9 @@
  acpi:PTS*:
   ID_VENDOR_FROM_DATABASE=Plain Tree Systems Inc
  
  acpi:PVG*:
   ID_VENDOR_FROM_DATABASE=Proview Global Co., Ltd
  
-@@ -5776,9 +5838,6 @@
+@@ -5779,9 +5841,6 @@
  acpi:RTI*:
   ID_VENDOR_FROM_DATABASE=Rancho Tech Inc
  
  acpi:RTL*:
   ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Company Ltd
  
-@@ -5944,9 +6003,6 @@
+@@ -5947,9 +6006,6 @@
  acpi:SEE*:
   ID_VENDOR_FROM_DATABASE=SeeColor Corporation
  
  acpi:SEI*:
   ID_VENDOR_FROM_DATABASE=Seitz & Associates Inc
  
-@@ -6403,6 +6459,9 @@
+@@ -6406,6 +6462,9 @@
  acpi:SVD*:
   ID_VENDOR_FROM_DATABASE=SVD Computer
  
  acpi:SVI*:
   ID_VENDOR_FROM_DATABASE=Sun Microsystems
  
-@@ -6487,6 +6546,9 @@
+@@ -6490,6 +6549,9 @@
  acpi:SZM*:
   ID_VENDOR_FROM_DATABASE=Shenzhen MTC Co., Ltd
  
  acpi:TAA*:
   ID_VENDOR_FROM_DATABASE=Tandberg
  
-@@ -6577,6 +6639,9 @@
+@@ -6580,6 +6642,9 @@
  acpi:TDG*:
   ID_VENDOR_FROM_DATABASE=Six15 Technologies
  
  acpi:TDM*:
   ID_VENDOR_FROM_DATABASE=Tandem Computer Europe Inc
  
-@@ -6619,6 +6684,9 @@
+@@ -6622,6 +6687,9 @@
  acpi:TEV*:
   ID_VENDOR_FROM_DATABASE=Televés, S.A.
  
  acpi:TEZ*:
   ID_VENDOR_FROM_DATABASE=Tech Source Inc.
  
-@@ -6733,9 +6801,6 @@
+@@ -6736,9 +6804,6 @@
  acpi:TNC*:
   ID_VENDOR_FROM_DATABASE=TNC Industrial Company Ltd
  
  acpi:TNM*:
   ID_VENDOR_FROM_DATABASE=TECNIMAGEN SA
  
-@@ -7042,14 +7107,14 @@
+@@ -7045,14 +7110,14 @@
  acpi:UNC*:
   ID_VENDOR_FROM_DATABASE=Unisys Corporation
  
  
  acpi:UNI*:
   ID_VENDOR_FROM_DATABASE=Uniform Industry Corp.
-@@ -7084,6 +7149,9 @@
+@@ -7087,6 +7152,9 @@
  acpi:USA*:
   ID_VENDOR_FROM_DATABASE=Utimaco Safeware AG
  
  acpi:USD*:
   ID_VENDOR_FROM_DATABASE=U.S. Digital Corporation
  
-@@ -7327,9 +7395,6 @@
+@@ -7330,9 +7398,6 @@
  acpi:WAL*:
   ID_VENDOR_FROM_DATABASE=Wave Access
  
  acpi:WAV*:
   ID_VENDOR_FROM_DATABASE=Wavephore
  
-@@ -7454,7 +7519,7 @@
+@@ -7457,7 +7522,7 @@
   ID_VENDOR_FROM_DATABASE=WyreStorm Technologies LLC
  
  acpi:WYS*:
  
  acpi:WYT*:
   ID_VENDOR_FROM_DATABASE=Wooyoung Image & Information Co.,Ltd.
-@@ -7468,9 +7533,6 @@
+@@ -7471,9 +7536,6 @@
  acpi:XDM*:
   ID_VENDOR_FROM_DATABASE=XDM Ltd.
  
  acpi:XES*:
   ID_VENDOR_FROM_DATABASE=Extreme Engineering Solutions, Inc.
  
-@@ -7501,9 +7563,6 @@
+@@ -7504,9 +7566,6 @@
  acpi:XNT*:
   ID_VENDOR_FROM_DATABASE=XN Technologies, Inc.
  
  acpi:XQU*:
   ID_VENDOR_FROM_DATABASE=SHANGHAI SVA-DAV ELECTRONICS CO., LTD
  
-@@ -7570,6 +7629,9 @@
+@@ -7573,6 +7632,9 @@
  acpi:ZBX*:
   ID_VENDOR_FROM_DATABASE=Zebax Technologies
  
index f82236b83e87f14f67125697c570cfdb814ab169..d2ab691b4f094557a9898feae7552c6f0e03cb86 100644 (file)
@@ -50,6 +50,9 @@ pci:v00000014d00007A0C*
 pci:v00000014d00007A0F*
  ID_MODEL_FROM_DATABASE=DMA (Direct Memory Access) Controller
 
+pci:v00000014d00007A10*
+ ID_MODEL_FROM_DATABASE=Hyper Transport Bridge Controller
+
 pci:v00000014d00007A14*
  ID_MODEL_FROM_DATABASE=EHCI USB Controller
 
@@ -725,6 +728,15 @@ pci:v00001000d00000013sv00001000sd00001000*
 pci:v00001000d00000014*
  ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3516
 
+pci:v00001000d00000014sv00001000sd00009460*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3516 (MegaRAID 9460-16i)
+
+pci:v00001000d00000014sv00001000sd00009480*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3516 (MegaRAID 9480-8i8e)
+
+pci:v00001000d00000014sv00001000sd00009481*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3516 (MegaRAID 9480-8e)
+
 pci:v00001000d00000014sv00001028sd00001F3A*
  ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3516 (PERC H745 Adapter)
 
@@ -758,6 +770,9 @@ pci:v00001000d00000014sv00008086sd00009480*
 pci:v00001000d00000015*
  ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3416
 
+pci:v00001000d00000015sv00001000sd00009441*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3416 (MegaRAID 9440-16i)
+
 pci:v00001000d00000015sv00001028sd00001F3C*
  ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3416 (PERC H345 Adapter)
 
@@ -770,6 +785,18 @@ pci:v00001000d00000015sv00001D49sd00000503*
 pci:v00001000d00000016*
  ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508
 
+pci:v00001000d00000016sv00001000sd00009461*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (MegaRAID 9460-8i)
+
+pci:v00001000d00000016sv00001000sd00009462*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (MegaRAID 9460-4i)
+
+pci:v00001000d00000016sv00001000sd00009463*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (MegaRAID 9365-28i)
+
+pci:v00001000d00000016sv00001000sd00009464*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (MegaRAID 9365-24i)
+
 pci:v00001000d00000016sv00001028sd00001FC9*
  ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (PERC H840 Adapter)
 
@@ -800,6 +827,12 @@ pci:v00001000d00000016sv00008086sd00009461*
 pci:v00001000d00000017*
  ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3408
 
+pci:v00001000d00000017sv00001000sd00009440*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3408 (MegaRAID 9440-8i)
+
+pci:v00001000d00000017sv00001000sd00009442*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3408 (MegaRAID 9440-4i)
+
 pci:v00001000d00000017sv00001D49sd00000500*
  ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3408 (ThinkSystem RAID 530-8i PCIe 12Gb Adapter)
 
@@ -1979,6 +2012,9 @@ pci:v00001000d000000C3*
 pci:v00001000d000000C4*
  ID_MODEL_FROM_DATABASE=SAS3224 PCI-Express Fusion-MPT SAS-3
 
+pci:v00001000d000000C4sv00001170sd00000002*
+ ID_MODEL_FROM_DATABASE=SAS3224 PCI-Express Fusion-MPT SAS-3 (SAS3224 PCI Express to 12Gb HBA MEZZ CARD)
+
 pci:v00001000d000000C5*
  ID_MODEL_FROM_DATABASE=SAS3316 PCI-Express Fusion-MPT SAS-3
 
@@ -2081,6 +2117,18 @@ pci:v00001000d000000E5sv00001D49sd00000206*
 pci:v00001000d000000E6*
  ID_MODEL_FROM_DATABASE=Fusion-MPT 12GSAS/PCIe Secure SAS38xx
 
+pci:v00001000d000000E6sv00001000sd00004050*
+ ID_MODEL_FROM_DATABASE=Fusion-MPT 12GSAS/PCIe Secure SAS38xx (9500-16i Tri-Mode HBA)
+
+pci:v00001000d000000E6sv00001000sd00004060*
+ ID_MODEL_FROM_DATABASE=Fusion-MPT 12GSAS/PCIe Secure SAS38xx (9500-8i Tri-Mode HBA)
+
+pci:v00001000d000000E6sv00001000sd00004070*
+ ID_MODEL_FROM_DATABASE=Fusion-MPT 12GSAS/PCIe Secure SAS38xx (9500-16e Tri-Mode HBA)
+
+pci:v00001000d000000E6sv00001000sd00004080*
+ ID_MODEL_FROM_DATABASE=Fusion-MPT 12GSAS/PCIe Secure SAS38xx (9500-8e Tri-Mode HBA)
+
 pci:v00001000d000000E6sv00001028sd0000200B*
  ID_MODEL_FROM_DATABASE=Fusion-MPT 12GSAS/PCIe Secure SAS38xx (HBA355i Adapter)
 
@@ -5564,6 +5612,9 @@ pci:v00001002d00006649sv0000103Csd0000230C*
 pci:v00001002d00006649sv000013CCsd00003D2A*
  ID_MODEL_FROM_DATABASE=Bonaire [FirePro W5100] (MXRT-5600)
 
+pci:v00001002d0000664D*
+ ID_MODEL_FROM_DATABASE=Bonaire [FirePro W5100 / Barco MXRT-5600]
+
 pci:v00001002d00006650*
  ID_MODEL_FROM_DATABASE=Bonaire
 
@@ -7574,6 +7625,9 @@ pci:v00001002d000067DFsv00001462sd00003416*
 pci:v00001002d000067DFsv00001462sd00003418*
  ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Radeon RX 580 Armor 4G OC)
 
+pci:v00001002d000067DFsv00001462sd0000341B*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Radeon RX 570 Armor 8G OC)
+
 pci:v00001002d000067DFsv00001462sd0000341E*
  ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Radeon RX 570 Armor 4G OC)
 
@@ -7586,6 +7640,15 @@ pci:v00001002d000067DFsv0000148Csd00002372*
 pci:v00001002d000067DFsv0000148Csd00002373*
  ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Radeon RX 470)
 
+pci:v00001002d000067DFsv0000148Csd00002377*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Red Devil RX 580 8G Golden)
+
+pci:v00001002d000067DFsv0000148Csd00002378*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Radeon RX 580)
+
+pci:v00001002d000067DFsv0000148Csd00002379*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Radeon RX 570 4G [Red Dragon])
+
 pci:v00001002d000067DFsv00001682sd00009470*
  ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Radeon RX 470)
 
@@ -7622,6 +7685,9 @@ pci:v00001002d000067DFsv00001DA2sd0000E353*
 pci:v00001002d000067DFsv00001DA2sd0000E366*
  ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Nitro+ Radeon RX 570/580/590)
 
+pci:v00001002d000067DFsv00001DA2sd0000E387*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Radeon RX 570 Pulse 4GB)
+
 pci:v00001002d000067E0*
  ID_MODEL_FROM_DATABASE=Baffin [Radeon Pro WX 4170]
 
@@ -10247,6 +10313,9 @@ pci:v00001002d000071C1sv0000174Bsd00000880*
 pci:v00001002d000071C2*
  ID_MODEL_FROM_DATABASE=RV530 [Radeon X1600 PRO]
 
+pci:v00001002d000071C3*
+ ID_MODEL_FROM_DATABASE=RV530 [Radeon X1600 PRO]
+
 pci:v00001002d000071C4*
  ID_MODEL_FROM_DATABASE=RV530/M56 GL [Mobility FireGL V5200]
 
@@ -10436,6 +10505,9 @@ pci:v00001002d00007312*
 pci:v00001002d0000731F*
  ID_MODEL_FROM_DATABASE=Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT]
 
+pci:v00001002d0000731Fsv00001458sd00002313*
+ ID_MODEL_FROM_DATABASE=Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT] (Radeon RX 5700 XT Gaming OC)
+
 pci:v00001002d0000731Fsv00001DA2sd0000E411*
  ID_MODEL_FROM_DATABASE=Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT] (Radeon RX 5600 XT)
 
@@ -30954,7 +31026,7 @@ pci:v000010DEd000006ED*
  ID_MODEL_FROM_DATABASE=G98 [GeForce 9600 GT / 9800 GT]
 
 pci:v000010DEd000006EE*
- ID_MODEL_FROM_DATABASE=G98 [GeForce 9600 GT / 9800 GT]
+ ID_MODEL_FROM_DATABASE=G98 [GeForce 9600 GT / 9800 GT / GT 240]
 
 pci:v000010DEd000006EF*
  ID_MODEL_FROM_DATABASE=G98M [GeForce G 103M]
@@ -35570,6 +35642,9 @@ pci:v000010DEd00001ED1*
 pci:v000010DEd00001ED3*
  ID_MODEL_FROM_DATABASE=TU104BM [GeForce RTX 2080 SUPER Mobile / Max-Q]
 
+pci:v000010DEd00001EF5*
+ ID_MODEL_FROM_DATABASE=TU104GLM [Quadro RTX 5000 Mobile Refresh]
+
 pci:v000010DEd00001F02*
  ID_MODEL_FROM_DATABASE=TU106 [GeForce RTX 2070]
 
@@ -35654,6 +35729,9 @@ pci:v000010DEd00001F95*
 pci:v000010DEd00001F96*
  ID_MODEL_FROM_DATABASE=TU117M [GeForce GTX 1650 Mobile / Max-Q]
 
+pci:v000010DEd00001F97*
+ ID_MODEL_FROM_DATABASE=TU117M [GeForce MX450]
+
 pci:v000010DEd00001F99*
  ID_MODEL_FROM_DATABASE=TU117M
 
@@ -35669,8 +35747,14 @@ pci:v000010DEd00001FB9*
 pci:v000010DEd00001FBF*
  ID_MODEL_FROM_DATABASE=TU117GL
 
+pci:v000010DEd00001FD9*
+ ID_MODEL_FROM_DATABASE=TU117BM [GeForce GTX 1650 Mobile Refresh]
+
+pci:v000010DEd00001FF9*
+ ID_MODEL_FROM_DATABASE=TU117GLM [Quadro T1000 Mobile]
+
 pci:v000010DEd000020B0*
- ID_MODEL_FROM_DATABASE=GA100 [GRID A100X]
+ ID_MODEL_FROM_DATABASE=GA100 [A100 SXM4 40GB]
 
 pci:v000010DEd000020BE*
  ID_MODEL_FROM_DATABASE=GA100 [GRID A100A]
@@ -35679,7 +35763,7 @@ pci:v000010DEd000020BF*
  ID_MODEL_FROM_DATABASE=GA100 [GRID A100B]
 
 pci:v000010DEd000020F1*
- ID_MODEL_FROM_DATABASE=GA100 [GRID A100 PCIe 40GB]
+ ID_MODEL_FROM_DATABASE=GA100 [A100 PCIe 40GB]
 
 pci:v000010DEd00002182*
  ID_MODEL_FROM_DATABASE=TU116 [GeForce GTX 1660 Ti]
@@ -36971,6 +37055,9 @@ pci:v000010EEd00003FC5*
 pci:v000010EEd00003FC6*
  ID_MODEL_FROM_DATABASE=RME Hammerfall DSP MADI
 
+pci:v000010EEd00005005*
+ ID_MODEL_FROM_DATABASE=Alveo U250
+
 pci:v000010EEd00007038*
  ID_MODEL_FROM_DATABASE=FPGA Card XC7VX690T
 
@@ -56738,6 +56825,9 @@ pci:v000014E4d000043A2*
 pci:v000014E4d000043A3*
  ID_MODEL_FROM_DATABASE=BCM4350 802.11ac Wireless Network Adapter
 
+pci:v000014E4d000043A3sv000017AAsd0000075A*
+ ID_MODEL_FROM_DATABASE=BCM4350 802.11ac Wireless Network Adapter (00JT494)
+
 pci:v000014E4d000043A9*
  ID_MODEL_FROM_DATABASE=BCM43217 802.11b/g/n
 
@@ -59069,6 +59159,9 @@ pci:v000015B3d00000251*
 pci:v000015B3d00000252*
  ID_MODEL_FROM_DATABASE=Amos chiplet
 
+pci:v000015B3d00000253*
+ ID_MODEL_FROM_DATABASE=Amos GearBox Manager
+
 pci:v000015B3d00000254*
  ID_MODEL_FROM_DATABASE=Spectrum-4, Flash recovery mode
 
@@ -59303,12 +59396,18 @@ pci:v000015B3d00001017*
 pci:v000015B3d00001017sv000015B3sd00000006*
  ID_MODEL_FROM_DATABASE=MT27800 Family [ConnectX-5] (ConnectX®-5 EN network interface card, 100GbE single-port QSFP28, PCIe3.0 x16, tall bracket; MCX515A-CCAT)
 
+pci:v000015B3d00001017sv000015B3sd00000007*
+ ID_MODEL_FROM_DATABASE=MT27800 Family [ConnectX-5] (Mellanox ConnectX®-5 MCX516A-CCAT)
+
 pci:v000015B3d00001017sv000015B3sd00000020*
  ID_MODEL_FROM_DATABASE=MT27800 Family [ConnectX-5] (ConnectX®-5 EN network interface card, 10/25GbE dual-port SFP28, PCIe3.0 x8, tall bracket ; MCX512A-ACAT)
 
 pci:v000015B3d00001017sv000015B3sd00000068*
  ID_MODEL_FROM_DATABASE=MT27800 Family [ConnectX-5] (ConnectX®-5 EN network interface card for OCP2.0, Type 1, with host management, 25GbE dual-port SFP28, PCIe3.0 x8, no bracket Halogen free ; MCX542B-ACAN)
 
+pci:v000015B3d00001017sv000015B3sd00000125*
+ ID_MODEL_FROM_DATABASE=MT27800 Family [ConnectX-5] (Tencent ConnectX-5 EN Ex network interface card for OCP 3.0, with host management, 50GbE Dual-port QSFP28, PCIe4.0 x16, Thumbscrew (pull-tab) bracket)
+
 pci:v000015B3d00001018*
  ID_MODEL_FROM_DATABASE=MT27800 Family [ConnectX-5 Virtual Function]
 
@@ -60539,6 +60638,9 @@ pci:v00001681*
 pci:v00001682*
  ID_VENDOR_FROM_DATABASE=XFX Pine Group Inc.
 
+pci:v00001682d00005701*
+ ID_MODEL_FROM_DATABASE=Radeon 5700 XT Thicc III Ultra
+
 pci:v00001682d0000C580*
  ID_MODEL_FROM_DATABASE=Radeon RX 580
 
@@ -60551,6 +60653,15 @@ pci:v00001688d00001170*
 pci:v0000168A*
  ID_VENDOR_FROM_DATABASE=Utimaco IS GmbH
 
+pci:v0000168Ad00002086*
+ ID_MODEL_FROM_DATABASE=CryptoServer Se-Series Hardware Security Module
+
+pci:v0000168Ad0000C040*
+ ID_MODEL_FROM_DATABASE=CryptoServer CSe-Series Hardware Security Module
+
+pci:v0000168Ad0000C051*
+ ID_MODEL_FROM_DATABASE=CryptoServer Se-Series Gen2 Hardware Security Module
+
 pci:v0000168C*
  ID_VENDOR_FROM_DATABASE=Qualcomm Atheros
 
@@ -67277,6 +67388,9 @@ pci:v00001D0Fd0000EC20*
 pci:v00001D0Fd0000EFA0*
  ID_MODEL_FROM_DATABASE=Elastic Fabric Adapter (EFA)
 
+pci:v00001D0Fd0000EFA1*
+ ID_MODEL_FROM_DATABASE=Elastic Fabric Adapter (EFA)
+
 pci:v00001D17*
  ID_VENDOR_FROM_DATABASE=Zhaoxin
 
@@ -67646,6 +67760,12 @@ pci:v00001D6Cd00001013*
 pci:v00001D6Cd00001014*
  ID_MODEL_FROM_DATABASE=AR-MAN-U280 [Manitou Class Accelerator for U280]
 
+pci:v00001D6Cd00001015*
+ ID_MODEL_FROM_DATABASE=AR-ARK-BBDEV-FX0 [Arkville 32B DPDK Baseband Device]
+
+pci:v00001D6Cd00001016*
+ ID_MODEL_FROM_DATABASE=AR-ARK-BBDEV-FX1 [Arkville 64B DPDK Baseband Device]
+
 pci:v00001D6Cd00004200*
  ID_MODEL_FROM_DATABASE=A5PL-E1-10GETI [10 GbE Ethernet Traffic Instrument]
 
@@ -67653,7 +67773,46 @@ pci:v00001D72*
  ID_VENDOR_FROM_DATABASE=Xiaomi
 
 pci:v00001D78*
- ID_VENDOR_FROM_DATABASE=DERA
+ ID_VENDOR_FROM_DATABASE=DERA Storage
+
+pci:v00001D78d00001512*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller
+
+pci:v00001D78d00001512sv00001D78sd00002003*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5457 HHHL 1.6TB NVMe SSD)
+
+pci:v00001D78d00001512sv00001D78sd00002004*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5437 HHHL 2TB NVMe SSD)
+
+pci:v00001D78d00001512sv00001D78sd00002005*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5457 HHHL 3.2TB NVMe SSD)
+
+pci:v00001D78d00001512sv00001D78sd00002006*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5437 HHHL 4TB NVMe SSD)
+
+pci:v00001D78d00001512sv00001D78sd00002007*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5457 HHHL 6.4TB NVMe SSD)
+
+pci:v00001D78d00001512sv00001D78sd00002008*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5437 HHHL 8TB NVMe SSD)
+
+pci:v00001D78d00001512sv00001D78sd00002103*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5457 U.2 1.6TB NVMe SSD)
+
+pci:v00001D78d00001512sv00001D78sd00002104*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5437 U.2 2TB NVMe SSD)
+
+pci:v00001D78d00001512sv00001D78sd00002105*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5457 U.2 3.2TB NVMe SSD)
+
+pci:v00001D78d00001512sv00001D78sd00002106*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5437 U.2 4TB NVMe SSD)
+
+pci:v00001D78d00001512sv00001D78sd00002107*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5457 U.2 6.4TB NVMe SSD)
+
+pci:v00001D78d00001512sv00001D78sd00002108*
+ ID_MODEL_FROM_DATABASE=TAI NVMe Controller (D5437 U.2 8TB NVMe SSD)
 
 pci:v00001D7C*
  ID_VENDOR_FROM_DATABASE=Aerotech, Inc.
@@ -67811,6 +67970,9 @@ pci:v00001DA3d00000001*
 pci:v00001DA3d00001000*
  ID_MODEL_FROM_DATABASE=HL-2000 AI Training Accelerator [Gaudi]
 
+pci:v00001DB2*
+ ID_VENDOR_FROM_DATABASE=ATP ELECTRONICS INC
+
 pci:v00001DBB*
  ID_VENDOR_FROM_DATABASE=NGD Systems, Inc.
 
@@ -67949,6 +68111,9 @@ pci:v00001DE5d00001000*
 pci:v00001DE5d00002000*
  ID_MODEL_FROM_DATABASE=NoLoad Hardware Development Kit
 
+pci:v00001DEE*
+ ID_VENDOR_FROM_DATABASE=Biwin Storage Technology Co., Ltd.
+
 pci:v00001DEF*
  ID_VENDOR_FROM_DATABASE=Ampere Computing, LLC
 
@@ -68096,6 +68261,27 @@ pci:v00001E3D*
 pci:v00001E49*
  ID_VENDOR_FROM_DATABASE=Yangtze Memory Technologies Co.,Ltd
 
+pci:v00001E4B*
+ ID_VENDOR_FROM_DATABASE=MAXIO Technology (Hangzhou) Ltd.
+
+pci:v00001E4Bd00001001*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller MAP1001
+
+pci:v00001E4Bd00001002*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller MAP1002
+
+pci:v00001E4Bd00001003*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller MAP1003
+
+pci:v00001E4Bd00001201*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller MAP1201
+
+pci:v00001E4Bd00001202*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller MAP1202
+
+pci:v00001E4Bd00001601*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller MAP1601
+
 pci:v00001E4C*
  ID_VENDOR_FROM_DATABASE=GSI Technology
 
@@ -70853,6 +71039,9 @@ pci:v00008086d000002E9*
 pci:v00008086d000002F0*
  ID_MODEL_FROM_DATABASE=Wireless-AC 9462
 
+pci:v00008086d000002F0sv00008086sd00000070*
+ ID_MODEL_FROM_DATABASE=Wireless-AC 9462 (Intel(R) Wi-Fi 6 AX201 160MHz)
+
 pci:v00008086d000002F9*
  ID_MODEL_FROM_DATABASE=Comet Lake Thermal Subsytem
 
@@ -76367,9 +76556,6 @@ pci:v00008086d0000158Bsv00008086sd00000009*
 pci:v00008086d0000158Bsv00008086sd0000000A*
  ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet 25G 2P XXV710 OCP)
 
-pci:v00008086d0000158Bsv00008086sd0000000C*
- ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter XXV710-DA2 for OCP 3.0)
-
 pci:v00008086d0000158Bsv00008086sd00004001*
  ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter XXV710-2)
 
@@ -76400,6 +76586,9 @@ pci:v00008086d00001592sv00008086sd00000009*
 pci:v00008086d00001592sv00008086sd0000000A*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for QSFP (Ethernet Network Adapter E810-C-Q1 for OCP)
 
+pci:v00008086d00001592sv00008086sd0000000B*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for QSFP (Ethernet 100G 2P E810-C Adapter)
+
 pci:v00008086d00001593*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for SFP
 
@@ -76424,6 +76613,9 @@ pci:v00008086d00001593sv00008086sd00000008*
 pci:v00008086d00001593sv00008086sd00000009*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for SFP (Ethernet Network Adapter E810-XXV-2 for OCP 2.0)
 
+pci:v00008086d00001593sv00008086sd0000000A*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for SFP (Ethernet 25G 4P E810-XXV Adapter)
+
 pci:v00008086d00001599*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for backplane
 
@@ -93476,6 +93668,9 @@ pci:v00008086d0000A36F*
 pci:v00008086d0000A370*
  ID_MODEL_FROM_DATABASE=Wireless-AC 9560 [Jefferson Peak]
 
+pci:v00008086d0000A370sv00001A56sd00001552*
+ ID_MODEL_FROM_DATABASE=Wireless-AC 9560 [Jefferson Peak] (Killer(R) Wireless-AC 1550i Wireless Network Adapter (9560NGW))
+
 pci:v00008086d0000A379*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH Thermal Controller
 
index 74d0609aa06170870a09be993e49a63ae6652e96..b459dc380ce088bea417928e83a71411dea0346d 100644 (file)
@@ -57923,6 +57923,15 @@ usb:v1A7Cp0191*
 usb:v1A7Cp0195*
  ID_MODEL_FROM_DATABASE=VerticalMouse C Wireless
 
+usb:v1A7E*
+ ID_VENDOR_FROM_DATABASE=Meltec Systementwicklung
+
+usb:v1A7Ep1001*
+ ID_MODEL_FROM_DATABASE=UFT75, UT150, UT60
+
+usb:v1A7Ep1003*
+ ID_MODEL_FROM_DATABASE=Thermostick
+
 usb:v1A81*
  ID_VENDOR_FROM_DATABASE=Holtek Semiconductor, Inc.
 
index 7b08e2643e9f54cc5d5b3e1aac93a66b37b6151f..84d997ebdc27c468286134717c38b063064bfa24 100644 (file)
@@ -598,8 +598,9 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHDX9494NR:pvr*
 
 # HP EliteBook 725 G2
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHPLicrice:pvr*
-# HP EliteBook 840 G1
-evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHPEliteBook840G1:pvr*
+# HP EliteBook
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHPEliteBook*:pvr*
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHP*:pnHPEliteBook*:pvr*
 # HP ProBook 440 G2
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHP440G2:pvr*
 # several HP ProBooks 4xx
@@ -608,8 +609,6 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHP*:pnHP*ProBook*4*:pvr*
 # HP ZBook
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHPZBook*:pvr*
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHP*:pnHPZBook*:pvr*
-# Elitebook x360 1040 G6
-evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHP:pn*EliteBook*x3601040G6:pvr*
  KEYBOARD_KEY_81=f20                                    # Fn+F8; Microphone mute button, should be micmute
 
 # HP ZBook 15 G2
@@ -628,7 +627,6 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHP:pnHPZBookStudioG4:pvr*
 
 # HP Folio 1040g2
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHPEliteBookFolio1040G2:pvr*
- KEYBOARD_KEY_81=f20                                    # Fn+F8; Microphone mute button, should be micmute
  KEYBOARD_KEY_d8=!f23                                   # touchpad off
  KEYBOARD_KEY_d9=!f22                                   # touchpad on
 
index 576b314d3cd82e761a11879492723ecc98c0a35e..092d356b64195972be065d7925695e1918410c42 100644 (file)
@@ -680,6 +680,10 @@ sensor:modalias:acpi:KIOX000A*:dmi:*:svnTREKSTOR:pnPrimetabT13B:*
 sensor:modalias:acpi:BOSC0200*:dmi:*:svnTrekStor*:pnSurfTabtwin11.6:*
  ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1
 
+# alternative version of Trekstor's SurfTab Twin 11.6
+sensor:modalias:acpi:BOSC0200*:dmi:*:bvrTP15-VT5.2.1.3:*:svnTrekStor*:pnSurfTabtwin11.6:*
+ ACCEL_MOUNT_MATRIX=-1, 0, 0; 0, 1, 0; 0, 0, -1
+
 sensor:modalias:acpi:KIOX010A*:dmi:*:svnTREKSTOR:pnPrimebookC11B:*
 sensor:modalias:acpi:KIOX010A*:dmi:*:svnTREKSTOR:pnPRIMEBOOKC11B:*
  ACCEL_MOUNT_MATRIX=-1, 0, 0; 0, -1, 0; 0, 0, -1
index bfd631504f617c79cfd8d19b2f676b8468ae87cc..3e4c3f096746ad340c02b1a7ea3e682322069d41 100644 (file)
@@ -97,6 +97,7 @@
  <tr class="odd"><td>ASEM S.p.A.</td><td>ASEM</td><td>04/29/2019</td> </tr>
  <tr class="even"><td>Fujitsu Limited</td><td>FUJI</td><td>06/18/2019</td> </tr>
  <tr class="odd"><td>Phytium Technology Co. Ltd.</td><td>PHYT</td><td>02/14/2020</td> </tr>
+ <tr class="even"><td>CHENGDU HAIGUANG IC DESIGN CO., LTD</td><td>HYGO</td><td>07/15/2020</td> </tr>
       </tbody>
     </table>
   </body>
index 4e30f6c49b4cb5a9edfe008f7f6f915755c495d3..43558082b3a17b6224b0831b3e0cf57168eb79ca 100644 (file)
@@ -2762,12 +2762,6 @@ C0D0FF     (base 16)             China Mobile IOT Company Limited
                                Seoul    05836\r
                                KR\r
 \r
-FC-4A-E9   (hex)               Castlenet Technology Inc.\r
-FC4AE9     (base 16)           Castlenet Technology Inc.\r
-                               No.64, Chung-Shan Rd.\r
-                               New Taipei City    23680\r
-                               TW\r
-\r
 40-31-3C   (hex)               XIAOMI Electronics,CO.,LTD\r
 40313C     (base 16)           XIAOMI Electronics,CO.,LTD\r
                                Xiaomi Building, No.68 Qinghe Middle Street\r
@@ -33359,12 +33353,6 @@ DC7385     (base 16)           Huawei Device Co., Ltd.
                                Suzhou  Jiangsu  215412\r
                                CN\r
 \r
-C4-98-86   (hex)               Qorvo Utrecht B.V.\r
-C49886     (base 16)           Qorvo Utrecht B.V.\r
-                               Leidseveer 10\r
-                               Utrecht  Utrecht  3511SB\r
-                               NL\r
-\r
 CC-9E-CA   (hex)               HMD Global Oy\r
 CC9ECA     (base 16)           HMD Global Oy\r
                                Bertel Jungin aukio 9\r
@@ -34061,11 +34049,17 @@ A45129     (base 16)          XAG
                                Guangzhou    510663\r
                                CN\r
 \r
-CC-87-4A   (hex)               Nokia\r
-CC874A     (base 16)           Nokia\r
-                               600 March Road\r
-                               Kanata  Ontario  K2K 2E6\r
-                               CA\r
+5C-02-72   (hex)               Silicon Laboratories\r
+5C0272     (base 16)           Silicon Laboratories\r
+                               400 West Cesar Chavez Street\r
+                               Austin  TX  78701\r
+                               US\r
+\r
+FC-4A-E9   (hex)               Castlenet Technology Inc.\r
+FC4AE9     (base 16)           Castlenet Technology Inc.\r
+                               5F., No. 10, Daye Rd., Beitou Dist.\r
+                               Taipei City    112030\r
+                               TW\r
 \r
 04-46-CF   (hex)               Beijing Venustech Cybervision Co.,Ltd.\r
 0446CF     (base 16)           Beijing Venustech Cybervision Co.,Ltd.\r
@@ -34073,12 +34067,150 @@ CC874A     (base 16)         Nokia
                                Beijing  Beijing  100193\r
                                CN\r
 \r
+CC-87-4A   (hex)               Nokia\r
+CC874A     (base 16)           Nokia\r
+                               600 March Road\r
+                               Kanata  Ontario  K2K 2E6\r
+                               CA\r
+\r
 00-07-8E   (hex)               Garz & Fricke GmbH\r
 00078E     (base 16)           Garz & Fricke GmbH\r
                                Schlachthofstrasse 20\r
                                Hamburg  Hamburg  21079\r
                                DE\r
 \r
+B4-36-D1   (hex)               Renesas Electronics (Penang) Sdn. Bhd.\r
+B436D1     (base 16)           Renesas Electronics (Penang) Sdn. Bhd.\r
+                               Phase 3, Bayan Lepas FIZ\r
+                               Bayan Lepas  Penang  11900\r
+                               MY\r
+\r
+00-61-51   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+006151     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+BC-76-C5   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+BC76C5     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+DC-77-4C   (hex)               Cisco Systems, Inc\r
+DC774C     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+20-44-41   (hex)               Remote Solution\r
+204441     (base 16)           Remote Solution\r
+                               71, Gunpo Cheom Dan San eop 2-ro\r
+                               Gunpo-si  Gyeonggi-do  15880\r
+                               KR\r
+\r
+FC-44-82   (hex)               Intel Corporate\r
+FC4482     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+D8-F8-83   (hex)               Intel Corporate\r
+D8F883     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+B8-5F-98   (hex)               Amazon Technologies Inc.\r
+B85F98     (base 16)           Amazon Technologies Inc.\r
+                               P.O Box 8102\r
+                               Reno  NV  89507\r
+                               US\r
+\r
+A0-85-FC   (hex)               Microsoft Corporation\r
+A085FC     (base 16)           Microsoft Corporation\r
+                               One Microsoft Way\r
+                               REDMOND  WA  98052\r
+                               US\r
+\r
+C4-98-86   (hex)               Qorvo International Pte. Ltd.\r
+C49886     (base 16)           Qorvo International Pte. Ltd.\r
+                               1 Changi Business Park Avenue 1\r
+                               #04-01    486058\r
+                               SG\r
+\r
+94-FF-61   (hex)               China Mobile Group Device Co.,Ltd.\r
+94FF61     (base 16)           China Mobile Group Device Co.,Ltd.\r
+                               32 Xuanwumen West Street,Xicheng District\r
+                               Beijing    100053\r
+                               CN\r
+\r
+10-19-65   (hex)               New H3C Technologies Co., Ltd\r
+101965     (base 16)           New H3C Technologies Co., Ltd\r
+                               466 Changhe Road, Binjiang District\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+24-5A-4C   (hex)               Ubiquiti Networks Inc.\r
+245A4C     (base 16)           Ubiquiti Networks Inc.\r
+                               685 Third Avenue, 27th Floor\r
+                               New York  NY  10017\r
+                               US\r
+\r
+80-F1-F1   (hex)               Tech4home, Lda\r
+80F1F1     (base 16)           Tech4home, Lda\r
+                               Rua de Fundoes N151\r
+                               Sao Joao da Madeira  Aveiro  3700-121\r
+                               PT\r
+\r
+14-A9-D0   (hex)               F5 Networks, Inc.\r
+14A9D0     (base 16)           F5 Networks, Inc.\r
+                               801 5th Avenue\r
+                               Seattle  WA  98104\r
+                               US\r
+\r
+1C-50-1E   (hex)               Sunplus Technology Co., Ltd.\r
+1C501E     (base 16)           Sunplus Technology Co., Ltd.\r
+                               19, Innovation First Road, Hsinchu Science Park\r
+                               Hsinchu    300\r
+                               TW\r
+\r
+40-95-05   (hex)               ACOINFO TECHNOLOGY CO.,LTD\r
+409505     (base 16)           ACOINFO TECHNOLOGY CO.,LTD\r
+                               Building No.12,Zhongguancun Cuihu Technology Park,Haidian District,Beijing,China\r
+                               Beijing    100095\r
+                               CN\r
+\r
+FC-66-CF   (hex)               Apple, Inc.\r
+FC66CF     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+AC-1D-06   (hex)               Apple, Inc.\r
+AC1D06     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+44-A8-FC   (hex)               Apple, Inc.\r
+44A8FC     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+F8-10-93   (hex)               Apple, Inc.\r
+F81093     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+5C-D8-9E   (hex)               Huawei Device Co., Ltd.\r
+5CD89E     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
 9C-FF-C2   (hex)               AVI Systems GmbH\r
 9CFFC2     (base 16)           AVI Systems GmbH\r
                                Dr. Franz Wilhelmstraße 2A\r
@@ -67445,18 +67577,150 @@ CCFF90     (base 16)         Huawei Device Co., Ltd.
                                Hefei  Anhui  230000\r
                                CN\r
 \r
-44-A5-4E   (hex)               Qorvo Utrecht B.V.\r
-44A54E     (base 16)           Qorvo Utrecht B.V.\r
-                               Leidseveer 10\r
-                               Utrecht  Utrecht  3511SB\r
-                               NL\r
+D4-D5-1B   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+D4D51B     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+24-91-BB   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+2491BB     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+64-5E-10   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+645E10     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+EC-F2-2B   (hex)               TECNO MOBILE LIMITED\r
+ECF22B     (base 16)           TECNO MOBILE LIMITED\r
+                               ROOMS 05-15, 13A/F., SOUTH TOWER, WORLD FINANCE CENTRE, HARBOUR CITY, 17 CANTON ROAD, TSIM SHA TSUI, KOWLOON, HONG KONG\r
+                               Hong Kong  Hong Kong  999077\r
+                               HK\r
+\r
+E4-5F-01   (hex)               Raspberry Pi Trading Ltd\r
+E45F01     (base 16)           Raspberry Pi Trading Ltd\r
+                               Maurice Wilkes Building, Cowley Road\r
+                               Cambridge    CB4 0DS\r
+                               GB\r
+\r
+44-A5-4E   (hex)               Qorvo International Pte. Ltd.\r
+44A54E     (base 16)           Qorvo International Pte. Ltd.\r
+                               1 Changi Business Park Avenue 1\r
+                               #04-01    486058\r
+                               SG\r
+\r
+C8-E6-00   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+C8E600     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+FC-B3-BC   (hex)               Intel Corporate\r
+FCB3BC     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+30-57-8E   (hex)               eero inc.\r
+30578E     (base 16)           eero inc.\r
+                               660 3rd Street\r
+                               San Francisco  CA  94107\r
+                               US\r
 \r
 00-30-54   (hex)               Castlenet Technology Inc.\r
 003054     (base 16)           Castlenet Technology Inc.\r
-                               NO. 130 WU-KUNG RD.,\r
-                               TAIWAN  TAIWAN  R.O.C.\r
+                               5F., No. 10, Daye Rd., Beitou Dist.\r
+                               Taipei City    112030\r
                                TW\r
 \r
+C8-16-DA   (hex)               Realme Chongqing Mobile Telecommunications Corp.,Ltd.\r
+C816DA     (base 16)           Realme Chongqing Mobile Telecommunications Corp.,Ltd.\r
+                               No.178 Yulong Avenue, Yufengshan, Yubei District, Chongqing.\r
+                               Chongqing   China  401120\r
+                               CN\r
+\r
+B0-44-14   (hex)               New H3C Technologies Co., Ltd\r
+B04414     (base 16)           New H3C Technologies Co., Ltd\r
+                               466 Changhe Road, Binjiang District\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+48-4B-D4   (hex)               Technicolor CH USA Inc.\r
+484BD4     (base 16)           Technicolor CH USA Inc.\r
+                               5030 Sugarloaf Parkway Bldg 6 \r
+                               Lawrenceville  GA  30044\r
+                               US\r
+\r
+30-96-10   (hex)               Huawei Device Co., Ltd.\r
+309610     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+5C-34-00   (hex)               HISENSE VISUAL TECHNOLOGY CO.,LTD\r
+5C3400     (base 16)           HISENSE VISUAL TECHNOLOGY CO.,LTD\r
+                               Qianwangang Road 218\r
+                               Qingdao  Shandong  266510\r
+                               CN\r
+\r
+78-45-58   (hex)               Ubiquiti Networks Inc.\r
+784558     (base 16)           Ubiquiti Networks Inc.\r
+                               685 Third Avenue, 27th Floor\r
+                               New York  NY  10017\r
+                               US\r
+\r
+74-8F-3C   (hex)               Apple, Inc.\r
+748F3C     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+40-F9-46   (hex)               Apple, Inc.\r
+40F946     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+44-59-43   (hex)               zte corporation\r
+445943     (base 16)           zte corporation\r
+                               12/F.,zte R&D building ,kejinan Road,Shenzhen,P.R.China\r
+                               shenzhen  guangdong  518057\r
+                               CN\r
+\r
+34-36-54   (hex)               zte corporation\r
+343654     (base 16)           zte corporation\r
+                               12/F.,zte R&D building ,kejinan Road,Shenzhen,P.R.China\r
+                               shenzhen  guangdong  518057\r
+                               CN\r
+\r
+64-F9-47   (hex)               Senscomm Semiconductor Co., Ltd.\r
+64F947     (base 16)           Senscomm Semiconductor Co., Ltd.\r
+                               Room 303-309, 3rd Floor International Building, NO.2 Suzhou Avenue West\r
+                               Suzhou  Jiangsu  215000\r
+                               CN\r
+\r
+DC-00-B0   (hex)               FREEBOX SAS\r
+DC00B0     (base 16)           FREEBOX SAS\r
+                               16 rue de la Ville l'Eveque\r
+                               PARIS  IdF  75008\r
+                               FR\r
+\r
+70-74-14   (hex)               Murata Manufacturing Co., Ltd.\r
+707414     (base 16)           Murata Manufacturing Co., Ltd.\r
+                               1-10-1, Higashikotari\r
+                               Nagaokakyo-shi  Kyoto  617-8555\r
+                               JP\r
+\r
+A0-76-4E   (hex)               Espressif Inc.\r
+A0764E     (base 16)           Espressif Inc.\r
+                               Room 204, Building 2, 690 Bibo Rd, Pudong New Area\r
+                               Shanghai  Shanghai  201203\r
+                               CN\r
+\r
 84-80-94   (hex)               Meter, Inc.\r
 848094     (base 16)           Meter, Inc.\r
                                148 Townsend St\r
@@ -81608,12 +81872,6 @@ E89218     (base 16)           Arcontia International AB
                                Fort Collins  Colorado  80525\r
                                US\r
 \r
-D4-6A-91   (hex)               Snap AV\r
-D46A91     (base 16)           Snap AV\r
-                               1800 Continental Blvd\r
-                               Charlotte  North Carolina  28273\r
-                               US\r
-\r
 98-CD-B4   (hex)               Virident Systems, Inc.\r
 98CDB4     (base 16)           Virident Systems, Inc.\r
                                500 Yosemite Dr.\r
@@ -82973,12 +83231,6 @@ E47185     (base 16)           Securifi Ltd
                                Hong Kong  nil  nil\r
                                HK\r
 \r
-F4-90-EA   (hex)               Deciso B.V.\r
-F490EA     (base 16)           Deciso B.V.\r
-                               Burgemeester Mijslaan 2\r
-                               Middelharnis  Zuid Holland  3241 XA\r
-                               NL\r
-\r
 5C-EE-79   (hex)               Global Digitech Co LTD\r
 5CEE79     (base 16)           Global Digitech Co LTD\r
                                1F., No.25, Aly.56, Ln. 245, Sec. 4, Bade Rd.,\r
@@ -88256,12 +88508,6 @@ D8D67E     (base 16)           GSK CNC EQUIPMENT CO.,LTD
                                Kwai Chung    \r
                                HK\r
 \r
-00-1C-7B   (hex)               Castlenet Technology Inc.\r
-001C7B     (base 16)           Castlenet Technology Inc.\r
-                               No.64, Chung-Shan Rd.\r
-                               Tu-Cheng City  Taipei  236\r
-                               TW\r
-\r
 00-1C-53   (hex)               Synergy Lighting Controls\r
 001C53     (base 16)           Synergy Lighting Controls\r
                                One Lithonia Way\r
@@ -99080,12 +99326,6 @@ F0264C     (base 16)           Sigrist-Photometer AG
                                Ennetbürgen    6373\r
                                CH\r
 \r
-D0-3D-52   (hex)               Vaion Limited\r
-D03D52     (base 16)           Vaion Limited\r
-                               The Charter Building, Charter Place\r
-                               Uxbridge    UB8 1JG \r
-                               GB\r
-\r
 D8-0B-9A   (hex)               Samsung Electronics Co.,Ltd\r
 D80B9A     (base 16)           Samsung Electronics Co.,Ltd\r
                                #94-1, Imsoo-Dong\r
@@ -101306,6 +101546,12 @@ DCCD2F     (base 16)         Seiko Epson Corporation
                                shenzhen  guangdong  518057\r
                                CN\r
 \r
+08-42-96   (hex)               Mobile Technology Solutions LLC\r
+084296     (base 16)           Mobile Technology Solutions LLC\r
+                               20379 Bannister Dr.\r
+                               Macomb  MI  48044\r
+                               US\r
+\r
 8C-8D-28   (hex)               Intel Corporate\r
 8C8D28     (base 16)           Intel Corporate\r
                                Lot 8, Jalan Hi-Tech 2/3 \r
@@ -101318,24 +101564,192 @@ DCCD2F     (base 16)               Seiko Epson Corporation
                                Santa Monica  CA  90404\r
                                US\r
 \r
+04-C1-D8   (hex)               Huawei Device Co., Ltd.\r
+04C1D8     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+C8-BC-9C   (hex)               Huawei Device Co., Ltd.\r
+C8BC9C     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
 B0-FE-E5   (hex)               Huawei Device Co., Ltd.\r
 B0FEE5     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-04-C1-D8   (hex)               Huawei Device Co., Ltd.\r
-04C1D8     (base 16)           Huawei Device Co., Ltd.\r
+C8-17-39   (hex)               ITEL MOBILE LIMITED\r
+C81739     (base 16)           ITEL MOBILE LIMITED\r
+                               RM B3 & B4 BLOCK B, KO FAI INDUSTRIAL BUILDING  NO.7 KO FAI ROAD, YAU TONG, KLN, H.K\r
+                               Hong Kong  KOWLOON  999077\r
+                               HK\r
+\r
+58-D0-61   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+58D061     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+34-EF-B6   (hex)               Edgecore Networks Corporation\r
+34EFB6     (base 16)           Edgecore Networks Corporation\r
+                               1 Creation RD 3.\r
+                               Hsinchu    30077\r
+                               TW\r
+\r
+E8-74-C7   (hex)               Sentinhealth\r
+E874C7     (base 16)           Sentinhealth\r
+                               5, Avenude du Grand Sablon\r
+                               LA TRONCHE    38700\r
+                               FR\r
+\r
+00-1C-7B   (hex)               Castlenet Technology Inc.\r
+001C7B     (base 16)           Castlenet Technology Inc.\r
+                               5F., No. 10, Daye Rd., Beitou Dist.\r
+                               Taipei City    112030\r
+                               TW\r
+\r
+E4-84-2B   (hex)               HANGZHOU SOFTEL OPTIC CO., LTD\r
+E4842B     (base 16)           HANGZHOU SOFTEL OPTIC CO., LTD\r
+                               101 BINKANG ROAD, BINJIANG DISTRICT\r
+                               HANGZHOU  ZHEJIANG  310052\r
+                               CN\r
+\r
+B8-D3-09   (hex)               Cox Communications, Inc\r
+B8D309     (base 16)           Cox Communications, Inc\r
+                               6205 Peachtree Dunwoody Rd\r
+                               Atlanta  GA  30328\r
+                               US\r
+\r
+94-02-6B   (hex)               Optictimes Co.,Ltd\r
+94026B     (base 16)           Optictimes Co.,Ltd\r
+                               Hangzhou City, Zhejiang Province\r
+                               Hangzhou  Zhejiang  310023\r
+                               CN\r
+\r
+90-CC-DF   (hex)               Intel Corporate\r
+90CCDF     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+D4-6A-91   (hex)               SnapAV\r
+D46A91     (base 16)           SnapAV\r
+                               1800 Continental Blvd\r
+                               Charlotte  North Carolina  28273\r
+                               US\r
+\r
+80-EE-25   (hex)               Shenzhen Skyworth  Digital  Technology  CO., Ltd\r
+80EE25     (base 16)           Shenzhen Skyworth  Digital  Technology  CO., Ltd\r
+                               4F,Block A, Skyworth?Building,\r
+                               Shenzhen  Guangdong  518057\r
+                               CN\r
+\r
+44-87-DB   (hex)               Tymphany Acoustic Technology (Huizhou) Co.,  Ltd.\r
+4487DB     (base 16)           Tymphany Acoustic Technology (Huizhou) Co.,  Ltd.\r
+                               Tymphany Acoustic Technology (Huizhou) Co., Ltd.\r
+                               Huizhou  Guangdong  516223\r
+                               CN\r
+\r
+D0-21-F9   (hex)               Ubiquiti Networks Inc.\r
+D021F9     (base 16)           Ubiquiti Networks Inc.\r
+                               685 Third Avenue, 27th Floor\r
+                               New York  NY  10017\r
+                               US\r
+\r
+08-5B-D6   (hex)               Intel Corporate\r
+085BD6     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+D0-3D-52   (hex)               Ava Security Limited\r
+D03D52     (base 16)           Ava Security Limited\r
+                               The Charter Building, Charter Place\r
+                               Uxbridge    UB8 1JG \r
+                               GB\r
+\r
+F4-90-EA   (hex)               Deciso B.V.\r
+F490EA     (base 16)           Deciso B.V.\r
+                               Edison 43\r
+                               Midddelharnis  Zuid Holland  3241LS\r
+                               NL\r
+\r
+64-D2-C4   (hex)               Apple, Inc.\r
+64D2C4     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+DC-52-85   (hex)               Apple, Inc.\r
+DC5285     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+E8-81-52   (hex)               Apple, Inc.\r
+E88152     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+90-81-58   (hex)               Apple, Inc.\r
+908158     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+B4-AD-A3   (hex)               Guangzhou Shiyuan Electronic Technology Company Limited\r
+B4ADA3     (base 16)           Guangzhou Shiyuan Electronic Technology Company Limited\r
+                               No.6, 4th Yunpu Road, Yunpu industry District\r
+                               Guangzhou  Guangdong  510530\r
+                               CN\r
+\r
+64-23-15   (hex)               Huawei Device Co., Ltd.\r
+642315     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-C8-BC-9C   (hex)               Huawei Device Co., Ltd.\r
-C8BC9C     (base 16)           Huawei Device Co., Ltd.\r
+A4-C7-4B   (hex)               Huawei Device Co., Ltd.\r
+A4C74B     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
+D0-D2-3C   (hex)               Apple, Inc.\r
+D0D23C     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+78-E3-DE   (hex)               Apple, Inc.\r
+78E3DE     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+18-FD-CB   (hex)               IEEE Registration Authority\r
+18FDCB     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+D8-F8-AF   (hex)               DAONTEC\r
+D8F8AF     (base 16)           DAONTEC\r
+                               219, Gasan digital 1-ro\r
+                               Seoul    KS013\r
+                               KR\r
+\r
+D4-48-2D   (hex)               Shenzhen Deejoy Lighting Technology Co.,Ltd.\r
+D4482D     (base 16)           Shenzhen Deejoy Lighting Technology Co.,Ltd.\r
+                               3rd Floor, Building B3, Xujingchang Industrial Park,Xinhe Community Fuyong Town,Baoan District\r
+                               Shenzhen  Guangdong  518103\r
+                               CN\r
+\r
 F8-D0-27   (hex)               Seiko Epson Corporation\r
 F8D027     (base 16)           Seiko Epson Corporation\r
                                2070 Kotobuki Koaka\r
@@ -103022,12 +103436,6 @@ ACAE19     (base 16)         Roku, Inc
 AC-F8-5C   (hex)               Private\r
 ACF85C     (base 16)           Private\r
 \r
-9C-69-37   (hex)               Qorvo Utrecht B.V.\r
-9C6937     (base 16)           Qorvo Utrecht B.V.\r
-                               Leidseveer 10\r
-                               Utrecht  Utrecht  3511SB\r
-                               NL\r
-\r
 3C-37-86   (hex)               NETGEAR\r
 3C3786     (base 16)           NETGEAR\r
                                350 East Plumeria Drive\r
@@ -112547,12 +112955,6 @@ C01173     (base 16)         Samsung Electronics Co.,Ltd
                                Gumi  Gyeongbuk  730-350\r
                                KR\r
 \r
-78-53-F2   (hex)               ROXTON Ltd.\r
-7853F2     (base 16)           ROXTON Ltd.\r
-                               15 Ostapovsky proezd\r
-                               Moscow  Moscow  109316\r
-                               RU\r
-\r
 BC-E6-3F   (hex)               Samsung Electronics Co.,Ltd\r
 BCE63F     (base 16)           Samsung Electronics Co.,Ltd\r
                                #94-1, Imsoo-Dong\r
@@ -134966,36 +135368,180 @@ DC7223     (base 16)               Hui Zhou Gaoshengda Technology Co.,LTD
                                Sunnyvale  CA  94089\r
                                US\r
 \r
+24-5F-9F   (hex)               Huawei Device Co., Ltd.\r
+245F9F     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+CC-B0-A8   (hex)               Huawei Device Co., Ltd.\r
+CCB0A8     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+50-28-73   (hex)               Huawei Device Co., Ltd.\r
+502873     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
 8C-47-BE   (hex)               Dell Inc.\r
 8C47BE     (base 16)           Dell Inc.\r
                                One Dell Way\r
                                Round Rock  TX  78682\r
                                US\r
 \r
+14-2C-78   (hex)               GooWi Wireless Technology Co., Limited\r
+142C78     (base 16)           GooWi Wireless Technology Co., Limited\r
+                               RM402 Building212, Tairan Technology Park, Futian District\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+98-FC-84   (hex)               IEEE Registration Authority\r
+98FC84     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
 20-F4-4F   (hex)               Nokia\r
 20F44F     (base 16)           Nokia\r
                                600 March Road\r
                                Kanata  Ontario  K2K 2E6\r
                                CA\r
 \r
-24-5F-9F   (hex)               Huawei Device Co., Ltd.\r
-245F9F     (base 16)           Huawei Device Co., Ltd.\r
+04-76-B0   (hex)               Cisco Systems, Inc\r
+0476B0     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+40-F0-78   (hex)               Cisco Systems, Inc\r
+40F078     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+78-D7-1A   (hex)               Ciena Corporation\r
+78D71A     (base 16)           Ciena Corporation\r
+                               7035 Ridge Road\r
+                               Hanover  MD  21076\r
+                               US\r
+\r
+78-53-F2   (hex)               Roxton Systems Ltd.\r
+7853F2     (base 16)           Roxton Systems Ltd.\r
+                               Floor 4, premise 1, room 6, Ostapovsky proezd,15k2\r
+                               Moscow  Moscow  109316\r
+                               RU\r
+\r
+9C-69-37   (hex)               Qorvo International Pte. Ltd.\r
+9C6937     (base 16)           Qorvo International Pte. Ltd.\r
+                               1 Changi Business Park Avenue 1\r
+                               #04-01    486058\r
+                               SG\r
+\r
+F8-2E-3F   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+F82E3F     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+90-A5-AF   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+90A5AF     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+3C-7C-3F   (hex)               ASUSTek COMPUTER INC.\r
+3C7C3F     (base 16)           ASUSTek COMPUTER INC.\r
+                               15,Li-Te Rd., Peitou, Taipei 112, Taiwan\r
+                               Taipei  Taiwan  112\r
+                               TW\r
+\r
+34-91-6F   (hex)               UserGate Ltd.\r
+34916F     (base 16)           UserGate Ltd.\r
+                               Nikolaeva str., 11, 602\r
+                               Novosibirsk    630090\r
+                               RU\r
+\r
+0C-8B-7D   (hex)               Vizio, Inc\r
+0C8B7D     (base 16)           Vizio, Inc\r
+                               39 Tesla\r
+                               Irvine  CA  92618\r
+                               US\r
+\r
+EC-4D-3E   (hex)               Beijing Xiaomi Mobile Software Co., Ltd\r
+EC4D3E     (base 16)           Beijing Xiaomi Mobile Software Co., Ltd\r
+                               The Rainbow City Office Building, 68 Qinghe Middle Street Haidian District\r
+                               Beijing  Beijing  100085\r
+                               CN\r
+\r
+D8-A4-91   (hex)               Huawei Device Co., Ltd.\r
+D8A491     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-CC-B0-A8   (hex)               Huawei Device Co., Ltd.\r
-CCB0A8     (base 16)           Huawei Device Co., Ltd.\r
+68-13-24   (hex)               Huawei Device Co., Ltd.\r
+681324     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-50-28-73   (hex)               Huawei Device Co., Ltd.\r
-502873     (base 16)           Huawei Device Co., Ltd.\r
+A8-C0-92   (hex)               Huawei Device Co., Ltd.\r
+A8C092     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
+98-60-CA   (hex)               Apple, Inc.\r
+9860CA     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+44-90-BB   (hex)               Apple, Inc.\r
+4490BB     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+34-FD-6A   (hex)               Apple, Inc.\r
+34FD6A     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+EC-3E-B3   (hex)               Zyxel Communications Corporation\r
+EC3EB3     (base 16)           Zyxel Communications Corporation\r
+                               No. 6 Innovation Road II, Science Park\r
+                               Hsichu  Taiwan  300\r
+                               TW\r
+\r
+8C-D6-7F   (hex)               EM Microelectronic\r
+8CD67F     (base 16)           EM Microelectronic\r
+                               Rue des Sors 3\r
+                               Marin-Epagnier  Neuchatel  2074\r
+                               CH\r
+\r
+5C-91-FD   (hex)               Jaewoncnc\r
+5C91FD     (base 16)           Jaewoncnc\r
+                               A-501~507, H-Businesspark, 25 Beobwon-ro11gil, Songpa-gu, Seoul, Korea\r
+                               Seoul    05836\r
+                               KR\r
+\r
+44-35-83   (hex)               Apple, Inc.\r
+443583     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+FC-44-9F   (hex)               zte corporation\r
+FC449F     (base 16)           zte corporation\r
+                               12/F.,zte R&D building ,kejinan Road,Shenzhen,P.R.China\r
+                               shenzhen  guangdong  518057\r
+                               CN\r
+\r
 7C-8A-E1   (hex)               COMPAL INFORMATION (KUNSHAN) CO., LTD. \r
 7C8AE1     (base 16)           COMPAL INFORMATION (KUNSHAN) CO., LTD. \r
                                NO. 25, THE 3RD Street KUNSHAN EXPORT PROCESSING ZONE \r
@@ -150545,12 +151091,6 @@ AC0A61     (base 16)         Labor S.r.L.
                                Santa Clara  CA  95051\r
                                US\r
 \r
-70-2F-4B   (hex)               PolyVision Inc.\r
-702F4B     (base 16)           PolyVision Inc.\r
-                               3970 Johns Creek Ct.\r
-                               Suwanee  Georgia  30024\r
-                               US\r
-\r
 74-14-89   (hex)               SRT Wireless\r
 741489     (base 16)           SRT Wireless\r
                                4101 SW 47th Avenue #102\r
@@ -168749,26 +169289,170 @@ C0619A     (base 16)               IEEE Registration Authority
                                Piscataway  NJ  08554\r
                                US\r
 \r
+C4-2B-44   (hex)               Huawei Device Co., Ltd.\r
+C42B44     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+F8-A2-6D   (hex)               CANON INC.\r
+F8A26D     (base 16)           CANON INC.\r
+                               30-2 Shimomaruko 3-chome,\r
+                               Ohta-ku  Tokyo  146-8501\r
+                               JP\r
+\r
+74-42-7F   (hex)               AVM Audiovisuelles Marketing und Computersysteme GmbH\r
+74427F     (base 16)           AVM Audiovisuelles Marketing und Computersysteme GmbH\r
+                               Alt-Moabit 95\r
+                               Berlin  Berlin  10559\r
+                               DE\r
+\r
+40-06-34   (hex)               Huawei Device Co., Ltd.\r
+400634     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
 70-61-EE   (hex)               Sunwoda Electronic Co.,Ltd\r
 7061EE     (base 16)           Sunwoda Electronic Co.,Ltd\r
                                No 2,Yihe Road, shiyan Street?shilong Community ,Baoan District\r
                                Shenzhen    518105\r
                                CN\r
 \r
-40-06-34   (hex)               Huawei Device Co., Ltd.\r
-400634     (base 16)           Huawei Device Co., Ltd.\r
+14-3F-C3   (hex)               SnapAV\r
+143FC3     (base 16)           SnapAV\r
+                               1800 Continental Blvd\r
+                               Charlotte  NC  28273\r
+                               US\r
+\r
+20-9A-7D   (hex)               Sagemcom Broadband SAS\r
+209A7D     (base 16)           Sagemcom Broadband SAS\r
+                               250, route de l'Empereur\r
+                               Rueil Malmaison Cedex  hauts de seine  92848\r
+                               FR\r
+\r
+74-F9-CA   (hex)               Nintendo Co.,Ltd\r
+74F9CA     (base 16)           Nintendo Co.,Ltd\r
+                               11-1 HOKOTATE-CHO KAMITOBA,MINAMI-KU\r
+                               KYOTO  KYOTO  601-8501\r
+                               JP\r
+\r
+50-C6-8E   (hex)               Biwin Semiconductor (HK) Company Limted\r
+50C68E     (base 16)           Biwin Semiconductor (HK) Company Limted\r
+                               5th/F., Block 4, Tongfuyu Industrial Park, Tanglang, Xili, Nanshan\r
+                               Shenzhen  Guangdong  518055\r
+                               CN\r
+\r
+04-E7-95   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+04E795     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+A0-D0-DC   (hex)               Amazon Technologies Inc.\r
+A0D0DC     (base 16)           Amazon Technologies Inc.\r
+                               P.O Box 8102\r
+                               Reno  NV  89507\r
+                               US\r
+\r
+68-9E-0B   (hex)               Cisco Systems, Inc\r
+689E0B     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+00-42-38   (hex)               Intel Corporate\r
+004238     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+C8-FE-6A   (hex)               Juniper Networks\r
+C8FE6A     (base 16)           Juniper Networks\r
+                               1133 Innovation Way\r
+                               Sunnyvale  CA  94089\r
+                               US\r
+\r
+80-CA-4B   (hex)               SHENZHEN GONGJIN ELECTRONICS CO.,LTD\r
+80CA4B     (base 16)           SHENZHEN GONGJIN ELECTRONICS CO.,LTD\r
+                               No.2, Danzi North Road, Kengzi Street,Pingshan District,\r
+                               SHENZHEN  GUANGDONG  518122\r
+                               CN\r
+\r
+64-F5-4E   (hex)               EM Microelectronic\r
+64F54E     (base 16)           EM Microelectronic\r
+                               Rue des Sors 3\r
+                               Marin-Epagnier  Neuchatel  2074\r
+                               CH\r
+\r
+10-27-79   (hex)               Sadel S.p.A.\r
+102779     (base 16)           Sadel S.p.A.\r
+                               via Marino Serenari, 1\r
+                               Castel Maggiore  Bologna  40013\r
+                               IT\r
+\r
+C4-DD-57   (hex)               Espressif Inc.\r
+C4DD57     (base 16)           Espressif Inc.\r
+                               Room 204, Building 2, 690 Bibo Rd, Pudong New Area\r
+                               Shanghai  Shanghai  201203\r
+                               CN\r
+\r
+70-2F-4B   (hex)               Steelcase Inc.\r
+702F4B     (base 16)           Steelcase Inc.\r
+                               901 44th Street SE\r
+                               Grand Rapids  MI  49508-7594\r
+                               US\r
+\r
+E4-75-DC   (hex)               Arcadyan Corporation\r
+E475DC     (base 16)           Arcadyan Corporation\r
+                               No.8, Sec.2, Guangfu Rd.\r
+                               Hsinchu City  Hsinchu  30071\r
+                               TW\r
+\r
+C4-16-88   (hex)               Huawei Device Co., Ltd.\r
+C41688     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-C4-2B-44   (hex)               Huawei Device Co., Ltd.\r
-C42B44     (base 16)           Huawei Device Co., Ltd.\r
+64-B0-E8   (hex)               Huawei Device Co., Ltd.\r
+64B0E8     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-F8-A2-6D   (hex)               CANON INC.\r
-F8A26D     (base 16)           CANON INC.\r
-                               30-2 Shimomaruko 3-chome,\r
-                               Ohta-ku  Tokyo  146-8501\r
-                               JP\r
+BC-A5-A9   (hex)               Apple, Inc.\r
+BCA5A9     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+20-E2-A8   (hex)               Apple, Inc.\r
+20E2A8     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+A0-FB-C5   (hex)               Apple, Inc.\r
+A0FBC5     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+30-A9-98   (hex)               Huawei Device Co., Ltd.\r
+30A998     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+00-7D-60   (hex)               Apple, Inc.\r
+007D60     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+58-20-8A   (hex)               IEEE Registration Authority\r
+58208A     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
index d46c9dabde20418509e7b8dac0f8d004efe3d965..83657c6c32be6c678204cb2e2e5593f0d6ad62c1 100644 (file)
@@ -3845,12 +3845,6 @@ D0-14-11   (hex)         powerall
                                Gyeonggi-do province    14445\r
                                KR\r
 \r
-D0-14-11   (hex)               CYLTek Co.,LTD.\r
-B00000-BFFFFF     (base 16)            CYLTek Co.,LTD.\r
-                               R603,6F.,NO.168,Sec.2,Fuxing 3rd.Rd.\r
-                               Zhubei City,Hsinchu County    30273\r
-                               TW\r
-\r
 D0-14-11   (hex)               ABB EVI SPA\r
 A00000-AFFFFF     (base 16)            ABB EVI SPA\r
                                VIA DI SAN GIORGIO, 642\r
@@ -3962,12 +3956,72 @@ C0-61-9A   (hex)                MAD PIECE LLC.
                                BROOKLYN  NY  11234\r
                                US\r
 \r
+98-FC-84   (hex)               Shanghai ZeXin Information Technologies Co. Ltd.\r
+300000-3FFFFF     (base 16)            Shanghai ZeXin Information Technologies Co. Ltd.\r
+                               Room 205E Building 5#,545 Hulan Road,Baoshan District,Shanghai City\r
+                               Shanghai    200000\r
+                               CN\r
+\r
 C0-61-9A   (hex)               Uhnder\r
 D00000-DFFFFF     (base 16)            Uhnder\r
                                3409 Executive Center Drive Ste205\r
                                Austin  TX  78731\r
                                US\r
 \r
+98-FC-84   (hex)               Jazwares LLC\r
+D00000-DFFFFF     (base 16)            Jazwares LLC\r
+                               1067 Shotgun Rd\r
+                               Sunrise  FL  33326\r
+                               US\r
+\r
+98-FC-84   (hex)               Sferrum GmbH\r
+400000-4FFFFF     (base 16)            Sferrum GmbH\r
+                               Kytyzovsky avenue, build 36/3, office 216\r
+                               Moscow    121170\r
+                               RU\r
+\r
+98-FC-84   (hex)               Shenzhen Incar Technology Co., Ltd.\r
+C00000-CFFFFF     (base 16)            Shenzhen Incar Technology Co., Ltd.\r
+                               Zhongxi ECO International Building, Shuiku Rd., Baoan District\r
+                               Shenzhen     518000\r
+                               CN\r
+\r
+98-FC-84   (hex)               Leia, Inc\r
+000000-0FFFFF     (base 16)            Leia, Inc\r
+                               2440 Sand Hill Road, STE 100, Menlo Park\r
+                               Menlo Park  CA  94025\r
+                               US\r
+\r
+18-FD-CB   (hex)               Staclar, Inc.\r
+300000-3FFFFF     (base 16)            Staclar, Inc.\r
+                               2093 Philadelphia Pike\r
+                               Claymont  DE  19703\r
+                               US\r
+\r
+18-FD-CB   (hex)               Ark Vision Systems GmbH & Co. KG\r
+C00000-CFFFFF     (base 16)            Ark Vision Systems GmbH & Co. KG\r
+                               Limburger Str., 51\r
+                               Merenberg  Hessen  35799\r
+                               DE\r
+\r
+D0-14-11   (hex)               CYLTek Limited\r
+B00000-BFFFFF     (base 16)            CYLTek Limited\r
+                               R603,6F.,NO.168,Sec.2,Fuxing 3rd.Rd.\r
+                               Zhubei City,Hsinchu County    30273\r
+                               TW\r
+\r
+18-FD-CB   (hex)               SKA Organisation\r
+600000-6FFFFF     (base 16)            SKA Organisation\r
+                               Jodrell Bank, Lower Withington\r
+                               Macclesfield  Cheshire  SK11 9FT\r
+                               GB\r
+\r
+18-FD-CB   (hex)               KWANG YANG MOTOR CO.,LTD\r
+E00000-EFFFFF     (base 16)            KWANG YANG MOTOR CO.,LTD\r
+                               NO. 35, WAN HSING ST., SAN MIN DIST., KAOHSIUNG, TAIWAN, R.O.C\r
+                               Kaohsiung    807\r
+                               TW\r
+\r
 4C-4B-F9   (hex)               Shenzhen dingsheng technology co., LTD\r
 400000-4FFFFF     (base 16)            Shenzhen dingsheng technology co., LTD\r
                                Floor 3, building 5, kaijeda industrial zone, no.97, huaxing road, langkou community, dalang street, longhua district\r
@@ -7676,6 +7730,48 @@ A00000-AFFFFF     (base 16)              Gronn Kontakt AS
                                Kristiansand    4630\r
                                NO\r
 \r
+98-FC-84   (hex)               Juketek Co., Ltd.\r
+200000-2FFFFF     (base 16)            Juketek Co., Ltd.\r
+                               18F-6, No. 75, Sec. 1, Xintai 5th Rd., Xizhi Dist., \r
+                               New Taipei City    221\r
+                               TW\r
+\r
+98-FC-84   (hex)               Shield Inc.\r
+A00000-AFFFFF     (base 16)            Shield Inc.\r
+                               8F-5, No.57, Sec.1, Dunhua S. Rd., Songshan Dist.,\r
+                               Taipei City    10557\r
+                               TW\r
+\r
+18-FD-CB   (hex)               CISTECH Solutions\r
+800000-8FFFFF     (base 16)            CISTECH Solutions\r
+                               170 JAMES ST\r
+                               TOOWOOMBA  QLD  4350\r
+                               AU\r
+\r
+18-FD-CB   (hex)               SOTHIS CIC TEC (Shanghai) Co., Ltd\r
+100000-1FFFFF     (base 16)            SOTHIS CIC TEC (Shanghai) Co., Ltd\r
+                               Shanghai Jiading sichenglu1250-7\r
+                               SHANGHAI  SHANGHAI  200000\r
+                               CN\r
+\r
+18-FD-CB   (hex)               Sercomm Corporation.\r
+A00000-AFFFFF     (base 16)            Sercomm Corporation.\r
+                               3F,No.81,Yu-Yih Rd.,Chu-Nan Chen\r
+                               Miao-Lih Hsuan    115\r
+                               TW\r
+\r
+58-20-8A   (hex)               TRING\r
+400000-4FFFFF     (base 16)            TRING\r
+                               Lejlekusa bb\r
+                               Gracanica  TK  75320\r
+                               BA\r
+\r
+58-20-8A   (hex)               Suzhou Ruilisi Technology Ltd.\r
+900000-9FFFFF     (base 16)            Suzhou Ruilisi Technology Ltd.\r
+                               Gaoqingchuanmei Building, Nantiancheng Road, Xiangcheng District\r
+                               Suzhou  Jiangsu  215000\r
+                               CN\r
+\r
 20-85-93   (hex)               UNILUMIN GROUP CO.,LTD\r
 300000-3FFFFF     (base 16)            UNILUMIN GROUP CO.,LTD\r
                                No.112 Yongfu Rd.,BaoanDistrict,\r
@@ -11453,6 +11549,12 @@ A00000-AFFFFF     (base 16)            Simaudio Ltd
                                Hennef    53773\r
                                DE\r
 \r
+C0-61-9A   (hex)               Grup Arge Enerji ve Kontrol Sistemleri\r
+200000-2FFFFF     (base 16)            Grup Arge Enerji ve Kontrol Sistemleri\r
+                               ?kitelli OSB Mah. YTÜ ?kitelli Teknopark Sok. No:1 / 2B01-2B07-2B08-2B09\r
+                               ?stanbul  ?STANBUL  34490\r
+                               TR\r
+\r
 28-B7-7C   (hex)               Vehant Technologies Pvt Ltd.\r
 B00000-BFFFFF     (base 16)            Vehant Technologies Pvt Ltd.\r
                                Plot no. 97, Ecotech-12, block-Ecotech -12, Sector-Noida Extension\r
@@ -11465,18 +11567,48 @@ C0-61-9A   (hex)              Stello
                                Saint-Bruno-de-Montarville  Quebec  J3V 6L7\r
                                CA\r
 \r
-C0-61-9A   (hex)               Grup Arge Enerji ve Kontrol Sistemleri\r
-200000-2FFFFF     (base 16)            Grup Arge Enerji ve Kontrol Sistemleri\r
-                               ?kitelli OSB Mah. YTÜ ?kitelli Teknopark Sok. No:1 / 2B01-2B07-2B08-2B09\r
-                               ?stanbul  ?STANBUL  34490\r
-                               TR\r
-\r
 C0-61-9A   (hex)               IPG Automotive GmbH\r
 600000-6FFFFF     (base 16)            IPG Automotive GmbH\r
                                Bannwaldallee 60\r
                                Karlsruhe    76185\r
                                DE\r
 \r
+C0-61-9A   (hex)               Victron Energy B.V.\r
+B00000-BFFFFF     (base 16)            Victron Energy B.V.\r
+                               De Paal 35\r
+                               Almere    1351JG\r
+                               NL\r
+\r
+98-FC-84   (hex)               Fath Mechatronics\r
+900000-9FFFFF     (base 16)            Fath Mechatronics\r
+                               Hügelmühle 31\r
+                               Spalt  bavaria  91174\r
+                               DE\r
+\r
+98-FC-84   (hex)               Broadtech Technologies Co., Ltd.\r
+700000-7FFFFF     (base 16)            Broadtech Technologies Co., Ltd.\r
+                               No. 1, Area A, 3rd Floor, Building B1, Shenzhen Digital Technology Park, No. 002, Gaoxin South Seventh Road, Nanshan District,\r
+                               Shenzhen  GuangDong  518057\r
+                               CN\r
+\r
+98-FC-84   (hex)               Dongguan Kingtron Electronics Tech Co., Ltd\r
+E00000-EFFFFF     (base 16)            Dongguan Kingtron Electronics Tech Co., Ltd\r
+                               No.3 Fumin North Rd,Shu'an Industrial Park, Humen Town\r
+                               Dongguan  Guangdong China  523929\r
+                               CN\r
+\r
+18-FD-CB   (hex)               StreamLocator\r
+D00000-DFFFFF     (base 16)            StreamLocator\r
+                               200-155 East Beaver Creek Rd\r
+                               Richmond Hill  ON  L4B 2N1\r
+                               CA\r
+\r
+18-FD-CB   (hex)               Gosuncn Technology Group Co.,LTD.\r
+400000-4FFFFF     (base 16)            Gosuncn Technology Group Co.,LTD.\r
+                               6F,2819 KaiChuang Blvd.,Science Town,Huangpu District\r
+                               Guangzhou City  Guangdong  510530\r
+                               CN\r
+\r
 4C-4B-F9   (hex)               Shandong Linkotech Electronic Co., Ltd.\r
 600000-6FFFFF     (base 16)            Shandong Linkotech Electronic Co., Ltd.\r
                                22nd Floor, Building 2, Aosheng Building, No.1166 Xinyi Street, High-tech Zone\r
@@ -11939,12 +12071,6 @@ A00000-AFFFFF     (base 16)            OrCam Technologies
                                JERUSALEM    97775603\r
                                IL\r
 \r
-C8-63-14   (hex)               Tymphany Acoustic Technology (Huizhou) Co., Ltd.\r
-200000-2FFFFF     (base 16)            Tymphany Acoustic Technology (Huizhou) Co., Ltd.\r
-                               Tymphany Industrial Area, Xin Lian Village, XinXu Town, HuiYang District\r
-                               Huizhou  Guangdong  516223\r
-                               CN\r
-\r
 FC-D2-B6   (hex)               Cirque Audio Technology Co.,Ltd\r
 600000-6FFFFF     (base 16)            Cirque Audio Technology Co.,Ltd\r
                                No.2 Road BeiYiHeng,HuangJiaBao Industrial Park,ShiPai Town,DongGuan City,GuangDong,China\r
@@ -15257,6 +15383,36 @@ E00000-EFFFFF     (base 16)            Ray Pte Ltd
                                Singapore    049319\r
                                SG\r
 \r
+18-FD-CB   (hex)               Cabtronix AG\r
+200000-2FFFFF     (base 16)            Cabtronix AG\r
+                               Hohstrass 1\r
+                               Kloten  Zuerich  8302\r
+                               CH\r
+\r
+98-FC-84   (hex)               chiconypower\r
+B00000-BFFFFF     (base 16)            chiconypower\r
+                               23F, No.69, Sec. 2, Guangfu Rd., Sanchong Dist., New Taipei City 241, Taiwan (R.O.C.)\r
+                               New Taipei  Taiwan  241\r
+                               TW\r
+\r
+98-FC-84   (hex)               Guangdong DE at science and technology co., LTD\r
+800000-8FFFFF     (base 16)            Guangdong DE at science and technology co., LTD\r
+                               Taide Technology Park,Jinfenghuang Industrial District, Fenggang Town,\r
+                               Dongguan  GuangDong  523000\r
+                               CN\r
+\r
+C8-63-14   (hex)               Tymphany Acoustic Technology (Huizhou) Co.,  Ltd.\r
+200000-2FFFFF     (base 16)            Tymphany Acoustic Technology (Huizhou) Co.,  Ltd.\r
+                               Tymphany Industrial Area, Xin Lian Village, XinXu Town, HuiYang District\r
+                               Huizhou  Guangdong  516223\r
+                               CN\r
+\r
+18-FD-CB   (hex)               Accel Robotics\r
+500000-5FFFFF     (base 16)            Accel Robotics\r
+                               9160 KEARNY VILLA CT\r
+                               San Diego  CA  92123\r
+                               US\r
+\r
 20-85-93   (hex)               Great Lite International\r
 700000-7FFFFF     (base 16)            Great Lite International\r
                                11F., No.207-2, Sec. 3, Beixin Rd., Xindian Dist.,\r
@@ -19040,8 +19196,68 @@ C0-61-9A   (hex)               LYAND ACOUSTIC TECHNOLOGY CO.,LTD.
                                Huizhou city   GuangDong  516023\r
                                CN\r
 \r
+C0-61-9A   (hex)               Paragon Robotics LLC\r
+000000-0FFFFF     (base 16)            Paragon Robotics LLC\r
+                               5386 Majestic Pkwy Ste 2\r
+                               Bedford Heights  OH  44146\r
+                               US\r
+\r
+C0-61-9A   (hex)               Zhejiang Haikang Science And Technology Co.,Ltd\r
+E00000-EFFFFF     (base 16)            Zhejiang Haikang Science And Technology Co.,Ltd\r
+                               No.797 Binkang Rd, Binjiang District\r
+                               Hangzhou    310053\r
+                               CN\r
+\r
+98-FC-84   (hex)               go-e GmbH\r
+100000-1FFFFF     (base 16)            go-e GmbH\r
+                               Satellitenstrasse 1\r
+                               Feldkirchen  Kaernten  9560\r
+                               AT\r
+\r
 C0-61-9A   (hex)               KidKraft\r
 100000-1FFFFF     (base 16)            KidKraft\r
                                4630 Olin Rd\r
                                Dallas  TX  75244\r
                                US\r
+\r
+98-FC-84   (hex)               ZERONE CO., LTD.\r
+600000-6FFFFF     (base 16)            ZERONE CO., LTD.\r
+                               Shinil IT UTO Bldg. #810, LS-ro 13, Gunpo-si, Gyeonggi-do, Korea\r
+                               SEOUL    15843\r
+                               KR\r
+\r
+98-FC-84   (hex)               Zymbit\r
+500000-5FFFFF     (base 16)            Zymbit\r
+                               53 Cass Place, Suite B\r
+                               Goleta  CA  93117\r
+                               US\r
+\r
+18-FD-CB   (hex)               TRANSLITE GLOBAL LLC\r
+B00000-BFFFFF     (base 16)            TRANSLITE GLOBAL LLC\r
+                               6644 ANTOINE DRIVE \r
+                               HOUSTON  TX  77091\r
+                               US\r
+\r
+18-FD-CB   (hex)               Shenzhen Rui jiali Electronic Technology Co. Ltd.\r
+000000-0FFFFF     (base 16)            Shenzhen Rui jiali Electronic Technology Co. Ltd.\r
+                               306 ROOM,Building B, ShenZhaoYe Science Park, BaoLong 5 Road No. 1,Baolong Industrial City ,Pingshan District\r
+                               Shenzhen    518118\r
+                               CN\r
+\r
+18-FD-CB   (hex)               CreyNox GmbH\r
+900000-9FFFFF     (base 16)            CreyNox GmbH\r
+                               Autokaderstrasse 29, BT2\r
+                               Vienna    1210\r
+                               AT\r
+\r
+18-FD-CB   (hex)               ENERGIE IP\r
+700000-7FFFFF     (base 16)            ENERGIE IP\r
+                               48 rue du Château d’eau \r
+                               Paris  Ile-de-France  75010\r
+                               FR\r
+\r
+58-20-8A   (hex)               SAMIL CTS Co., Ltd.\r
+800000-8FFFFF     (base 16)            SAMIL CTS Co., Ltd.\r
+                               8F, Woolim Lion's Valley 3cha, 24 Dunchon Daero 388beon-gil, Jungwon-gu\r
+                               Seongnam-si  Gyeonggi-do, KOREA  13403\r
+                               KR\r
index dc40087604454c8e40e19f18a3945fc85b08c536..4931652249d308a00b674dcfacd0be9574014b70 100644 (file)
@@ -2621,12 +2621,6 @@ F65000-F65FFF     (base 16)              MARKUS LABS
                                Kosice    04001\r
                                SK\r
 \r
-70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
-261000-261FFF     (base 16)            Potter Electric Signal Co. LLC\r
-                               1609 Park 370 Place\r
-                               Hazelwood  MO  63042\r
-                               US\r
-\r
 70-B3-D5   (hex)               MobiPromo\r
 09E000-09EFFF     (base 16)            MobiPromo\r
                                10, 64-72 Beresford Rd\r
@@ -4193,6 +4187,12 @@ EF1000-EF1FFF     (base 16)              Nanotok LLC
                                Hong Kong  Hong Kong  00000\r
                                HK\r
 \r
+70-B3-D5   (hex)               Technology Link Corporation\r
+B1B000-B1BFFF     (base 16)            Technology Link Corporation\r
+                               Shin-Yokohama Kohoku-ku\r
+                               yokohama  kanagawa  222-0033\r
+                               JP\r
+\r
 70-B3-D5   (hex)               VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD\r
 6BE000-6BEFFF     (base 16)            VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD\r
                                B3, Bredon House, 321, Tettenhall Road, Tettenhall\r
@@ -4217,11 +4217,11 @@ F47000-F47FFF     (base 16)             TXMission Ltd.
                                Watford  Hertfordshire  WD25 8HU\r
                                GB\r
 \r
-70-B3-D5   (hex)               Technology Link Corporation\r
-B1B000-B1BFFF     (base 16)            Technology Link Corporation\r
-                               Shin-Yokohama Kohoku-ku\r
-                               yokohama  kanagawa  222-0033\r
-                               JP\r
+70-B3-D5   (hex)               sensorway\r
+C52000-C52FFF     (base 16)            sensorway\r
+                               A-339 samsong techno valley, 140 tongilro, deockyanggu\r
+                               goyangsi  gyeonggido  10594\r
+                               KR\r
 \r
 70-B3-D5   (hex)               Tucsen Photonics Co., Ltd. \r
 8A7000-8A7FFF     (base 16)            Tucsen Photonics Co., Ltd. \r
@@ -4229,11 +4229,11 @@ B1B000-B1BFFF     (base 16)             Technology Link Corporation
                                fuzhou    350000\r
                                CN\r
 \r
-70-B3-D5   (hex)               sensorway\r
-C52000-C52FFF     (base 16)            sensorway\r
-                               A-339 samsong techno valley, 140 tongilro, deockyanggu\r
-                               goyangsi  gyeonggido  10594\r
-                               KR\r
+70-B3-D5   (hex)               Beijing Yourong Runda Rechnology Development Co.Ltd.\r
+980000-980FFF     (base 16)            Beijing Yourong Runda Rechnology Development Co.Ltd.\r
+                               Changping District Science and Technology Park Advanced Road 37\r
+                               Beijing    6219650\r
+                               CN\r
 \r
 70-B3-D5   (hex)               KDT Corp.\r
 E72000-E72FFF     (base 16)            KDT Corp.\r
@@ -4241,11 +4241,11 @@ E72000-E72FFF     (base 16)             KDT Corp.
                                shaoxing  zhejiang  312030\r
                                CN\r
 \r
-70-B3-D5   (hex)               Beijing Yourong Runda Rechnology Development Co.Ltd.\r
-980000-980FFF     (base 16)            Beijing Yourong Runda Rechnology Development Co.Ltd.\r
-                               Changping District Science and Technology Park Advanced Road 37\r
-                               Beijing    6219650\r
-                               CN\r
+70-B3-D5   (hex)               AUTOMATICA Y REGULACION S.A.\r
+EBF000-EBFFFF     (base 16)            AUTOMATICA Y REGULACION S.A.\r
+                               Condell 1735, Nunoa\r
+                               Santiago  RM  7770331\r
+                               CL\r
 \r
 70-B3-D5   (hex)               R.C. Systems Inc\r
 52F000-52FFFF     (base 16)            R.C. Systems Inc\r
@@ -4259,18 +4259,18 @@ E72000-E72FFF     (base 16)             KDT Corp.
                                Brendola  Vicenza  36040\r
                                IT\r
 \r
-70-B3-D5   (hex)               AUTOMATICA Y REGULACION S.A.\r
-EBF000-EBFFFF     (base 16)            AUTOMATICA Y REGULACION S.A.\r
-                               Condell 1735, Nunoa\r
-                               Santiago  RM  7770331\r
-                               CL\r
-\r
 70-B3-D5   (hex)               Digital Solutions JSC\r
 D9F000-D9FFFF     (base 16)            Digital Solutions JSC\r
                                room 4, office 1, 3rd floor, building 7, house 9a, 2nd Sinichkina Str.\r
                                Moscow    111020\r
                                RU\r
 \r
+70-B3-D5   (hex)               DOGA\r
+62A000-62AFFF     (base 16)            DOGA\r
+                               11 rue Lavoisier\r
+                               MAUREPAS    78310\r
+                               FR\r
+\r
 70-B3-D5   (hex)               Oculii\r
 B96000-B96FFF     (base 16)            Oculii\r
                                829 Space Dr\r
@@ -4289,29 +4289,17 @@ B96000-B96FFF     (base 16)             Oculii
                                Woodside  NY  11377\r
                                US\r
 \r
-70-B3-D5   (hex)               DOGA\r
-62A000-62AFFF     (base 16)            DOGA\r
-                               11 rue Lavoisier\r
-                               MAUREPAS    78310\r
-                               FR\r
-\r
-70-B3-D5   (hex)               NEUROPHET, Inc.\r
-E31000-E31FFF     (base 16)            NEUROPHET, Inc.\r
-                               3rd Floor, 175, Yeoksam-ro, Gangnam-gu, seoul\r
-                               Seoul  Province  06247\r
-                               KR\r
-\r
 70-B3-D5   (hex)               Remote Diagnostic Technologies Ltd\r
 C99000-C99FFF     (base 16)            Remote Diagnostic Technologies Ltd\r
                                Pavilion C2 Ashwood Park, Ashwood Way\r
                                Basingstoke  Hampshire  RG23 8BG\r
                                GB\r
 \r
-70-B3-D5   (hex)               Gogo Business Aviation\r
-3E0000-3E0FFF     (base 16)            Gogo Business Aviation\r
-                               105 Edgeview Dr., Suite 300\r
-                               Broomfield  CO  80021\r
-                               US\r
+70-B3-D5   (hex)               NEUROPHET, Inc.\r
+E31000-E31FFF     (base 16)            NEUROPHET, Inc.\r
+                               3rd Floor, 175, Yeoksam-ro, Gangnam-gu, seoul\r
+                               Seoul  Province  06247\r
+                               KR\r
 \r
 70-B3-D5   (hex)               Chromateq\r
 944000-944FFF     (base 16)            Chromateq\r
@@ -4331,12 +4319,30 @@ F3D000-F3DFFF     (base 16)             KAYA Instruments
                                Nesher     3688520\r
                                IL\r
 \r
+70-B3-D5   (hex)               Gogo Business Aviation\r
+3E0000-3E0FFF     (base 16)            Gogo Business Aviation\r
+                               105 Edgeview Dr., Suite 300\r
+                               Broomfield  CO  80021\r
+                               US\r
+\r
 70-B3-D5   (hex)               Asiga Pty Ltd\r
 53E000-53EFFF     (base 16)            Asiga Pty Ltd\r
                                Unit 2, 19-21 Bourke Road\r
                                Alexandria  New South Wales  2015\r
                                AU\r
 \r
+70-B3-D5   (hex)               ENABLER LTD.\r
+15A000-15AFFF     (base 16)            ENABLER LTD.\r
+                               29F Shiroyama Trust Tower 4-3-1 Toranomon \r
+                               Minato-ku  Tokyo  105-6029\r
+                               JP\r
+\r
+70-B3-D5   (hex)               LINEAGE POWER PVT LTD.,\r
+62E000-62EFFF     (base 16)            LINEAGE POWER PVT LTD.,\r
+                               30-A1, KIADB, 1ST PHASE INDUSTRIAL ESTATE,KUMBALGODU, BANGALORE-MYSORE ROAD\r
+                               BANGALORE  KARNATAKA  560074\r
+                               IN\r
+\r
 70-B3-D5   (hex)               Salupo Sas\r
 898000-898FFF     (base 16)            Salupo Sas\r
                                Via Laganeto n. 129\r
@@ -4349,53 +4355,35 @@ F3D000-F3DFFF     (base 16)             KAYA Instruments
                                Amagasaki  Hyogo  660-0082\r
                                JP\r
 \r
-70-B3-D5   (hex)               LINEAGE POWER PVT LTD.,\r
-62E000-62EFFF     (base 16)            LINEAGE POWER PVT LTD.,\r
-                               30-A1, KIADB, 1ST PHASE INDUSTRIAL ESTATE,KUMBALGODU, BANGALORE-MYSORE ROAD\r
-                               BANGALORE  KARNATAKA  560074\r
-                               IN\r
-\r
-70-B3-D5   (hex)               ENABLER LTD.\r
-15A000-15AFFF     (base 16)            ENABLER LTD.\r
-                               29F Shiroyama Trust Tower 4-3-1 Toranomon \r
-                               Minato-ku  Tokyo  105-6029\r
-                               JP\r
-\r
 70-B3-D5   (hex)               Grupo Epelsa S.L.\r
 40D000-40DFFF     (base 16)            Grupo Epelsa S.L.\r
                                C/ Punto Net,3\r
                                Alcala de Henares  Madrid  28805\r
                                ES\r
 \r
-70-B3-D5   (hex)               WEPTECH elektronik GmbH\r
-9CD000-9CDFFF     (base 16)            WEPTECH elektronik GmbH\r
-                               Ostring 10\r
-                               Landau    76829\r
-                               DE\r
-\r
 70-B3-D5   (hex)               AnaPico AG\r
 0BB000-0BBFFF     (base 16)            AnaPico AG\r
                                Europa-Strasse 9\r
                                Glattbrugg  Schweiz  8152\r
                                CH\r
 \r
-70-B3-D5   (hex)               Egag, LLC\r
-9A8000-9A8FFF     (base 16)            Egag, LLC\r
-                               303 King James Ct\r
-                               Upper Marlboro  MD  20774\r
-                               US\r
-\r
 70-B3-D5   (hex)               Season Electronics Ltd\r
 F46000-F46FFF     (base 16)            Season Electronics Ltd\r
                                600 Nest Business Park \r
                                Havant  Hampshire  PO9 5TL\r
                                GB\r
 \r
-70-B3-D5   (hex)               Algodue Elettronica Srl\r
-191000-191FFF     (base 16)            Algodue Elettronica Srl\r
-                               Via P. Gobetti, 16F\r
-                               Maggiora  NO  28014\r
-                               IT\r
+70-B3-D5   (hex)               WEPTECH elektronik GmbH\r
+9CD000-9CDFFF     (base 16)            WEPTECH elektronik GmbH\r
+                               Ostring 10\r
+                               Landau    76829\r
+                               DE\r
+\r
+70-B3-D5   (hex)               Egag, LLC\r
+9A8000-9A8FFF     (base 16)            Egag, LLC\r
+                               303 King James Ct\r
+                               Upper Marlboro  MD  20774\r
+                               US\r
 \r
 70-B3-D5   (hex)               Hermann Sewerin GmbH\r
 484000-484FFF     (base 16)            Hermann Sewerin GmbH\r
@@ -4409,30 +4397,18 @@ F46000-F46FFF     (base 16)             Season Electronics Ltd
                                GwangMyung-si  Gyeonggi-do, Korea  14322\r
                                KR\r
 \r
+70-B3-D5   (hex)               Algodue Elettronica Srl\r
+191000-191FFF     (base 16)            Algodue Elettronica Srl\r
+                               Via P. Gobetti, 16F\r
+                               Maggiora  NO  28014\r
+                               IT\r
+\r
 70-B3-D5   (hex)               Beijing Vizum Technology Co.,Ltd.\r
 F33000-F33FFF     (base 16)            Beijing Vizum Technology Co.,Ltd.\r
                                Room603, Floor6, Block2, No.1 Zhongguancun, No.81 Beiqing Road\r
                                Beijing  Beijing  100094\r
                                CN\r
 \r
-70-B3-D5   (hex)               Monnit Corporation\r
-393000-393FFF     (base 16)            Monnit Corporation\r
-                               3400 S West Temple\r
-                               Salt Lake City  UT  84115\r
-                               US\r
-\r
-70-B3-D5   (hex)               eSight\r
-FD9000-FD9FFF     (base 16)            eSight\r
-                               515 Legget Drive, Suite 200\r
-                               Ottawa  ON  K2K3G4\r
-                               CA\r
-\r
-70-B3-D5   (hex)               Nilar AB\r
-D99000-D99FFF     (base 16)            Nilar AB\r
-                               Bönavägen 55\r
-                               Gävle  Gavleborg  80647\r
-                               SE\r
-\r
 70-B3-D5   (hex)               Volution Group UK\r
 687000-687FFF     (base 16)            Volution Group UK\r
                                Vent-Axia Ltd, Fleming Way\r
@@ -4445,12 +4421,30 @@ D99000-D99FFF     (base 16)             Nilar AB
                                Sagamihara  Kanagawa  252-0203\r
                                JP\r
 \r
+70-B3-D5   (hex)               Monnit Corporation\r
+393000-393FFF     (base 16)            Monnit Corporation\r
+                               3400 S West Temple\r
+                               Salt Lake City  UT  84115\r
+                               US\r
+\r
 70-B3-D5   (hex)               Specialized Communications Corp.\r
 867000-867FFF     (base 16)            Specialized Communications Corp.\r
                                20940 Twin Springs Drive\r
                                Smithsburg    21783\r
                                US\r
 \r
+70-B3-D5   (hex)               eSight\r
+FD9000-FD9FFF     (base 16)            eSight\r
+                               515 Legget Drive, Suite 200\r
+                               Ottawa  ON  K2K3G4\r
+                               CA\r
+\r
+70-B3-D5   (hex)               Nilar AB\r
+D99000-D99FFF     (base 16)            Nilar AB\r
+                               Bönavägen 55\r
+                               Gävle  Gavleborg  80647\r
+                               SE\r
+\r
 70-B3-D5   (hex)               Jabil, Inc.\r
 736000-736FFF     (base 16)            Jabil, Inc.\r
                                888 Executive Center Dr. W.\r
@@ -4505,12 +4499,6 @@ D06000-D06FFF     (base 16)              YUYAMA MFG Co.,Ltd
                                Guangzhou  Guangdong  510665\r
                                CN\r
 \r
-70-B3-D5   (hex)               7thSense Design Limited\r
-E46000-E46FFF     (base 16)            7thSense Design Limited\r
-                               2 The Courtyard, Shoreham Road\r
-                               Upper Beeding  West Sussex  BN44 3TN\r
-                               GB\r
-\r
 70-B3-D5   (hex)               Cominfo, Inc.\r
 6F5000-6F5FFF     (base 16)            Cominfo, Inc.\r
                                Nabrezi 695\r
@@ -4523,12 +4511,24 @@ E46000-E46FFF     (base 16)             7thSense Design Limited
                                Shenyang  Liaoning  110000\r
                                CN\r
 \r
+70-B3-D5   (hex)               7thSense Design Limited\r
+E46000-E46FFF     (base 16)            7thSense Design Limited\r
+                               2 The Courtyard, Shoreham Road\r
+                               Upper Beeding  West Sussex  BN44 3TN\r
+                               GB\r
+\r
 70-B3-D5   (hex)               Weltek Technologies Co. Ltd.\r
 C48000-C48FFF     (base 16)            Weltek Technologies Co. Ltd.\r
                                Flat A-B, 12/F, Block 1, Wah Fung Ind. Centre, 33-39 Kwai Fung Crescent, Kwai Chung, N.T.\r
                                HK    852\r
                                HK\r
 \r
+70-B3-D5   (hex)               TimeMachines Inc.\r
+756000-756FFF     (base 16)            TimeMachines Inc.\r
+                               300 S 68th Street Place, Suite 100\r
+                               Lincoln  NE  68510\r
+                               US\r
+\r
 70-B3-D5   (hex)               BirdDog Australia\r
 3B9000-3B9FFF     (base 16)            BirdDog Australia\r
                                Unit 1, 8 Theobald St\r
@@ -4541,11 +4541,11 @@ C0D000-C0DFFF     (base 16)             Clarity Medical Pvt Ltd
                                MOHALI  Punjab  140306\r
                                IN\r
 \r
-70-B3-D5   (hex)               TimeMachines Inc.\r
-756000-756FFF     (base 16)            TimeMachines Inc.\r
-                               300 S 68th Street Place, Suite 100\r
-                               Lincoln  NE  68510\r
-                               US\r
+70-B3-D5   (hex)               KRONOTECH SRL\r
+626000-626FFF     (base 16)            KRONOTECH SRL\r
+                               VIALE UNGHERIA 125\r
+                               UDINE  ITALY/UDINE  33100\r
+                               IT\r
 \r
 70-B3-D5   (hex)               Algra tec AG\r
 80C000-80CFFF     (base 16)            Algra tec AG\r
@@ -4553,24 +4553,72 @@ C0D000-C0DFFF     (base 16)             Clarity Medical Pvt Ltd
                                Merenschwand  Aargau  5634\r
                                CH\r
 \r
-70-B3-D5   (hex)               KRONOTECH SRL\r
-626000-626FFF     (base 16)            KRONOTECH SRL\r
-                               VIALE UNGHERIA 125\r
-                               UDINE  ITALY/UDINE  33100\r
-                               IT\r
-\r
 70-B3-D5   (hex)               Enlaps\r
 2AF000-2AFFFF     (base 16)            Enlaps\r
                                29 chemin du vieux chene, Tarmac\r
                                MEYLAN    38240\r
                                FR\r
 \r
+70-B3-D5   (hex)               Comeo Technology Co.,Ltd\r
+242000-242FFF     (base 16)            Comeo Technology Co.,Ltd\r
+                               5F-2,NO.237 , Zhong-Xiao  RD., BANG-QIAO Dist., New Taipei City\r
+                               New Taipei CIty    22064\r
+                               TW\r
+\r
 70-B3-D5   (hex)               BORMANN EDV und Zubehoer\r
 864000-864FFF     (base 16)            BORMANN EDV und Zubehoer\r
                                Lohwaldstr. 53\r
                                Neusaess  Bayern  85356\r
                                DE\r
 \r
+70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
+261000-261FFF     (base 16)            Potter Electric Signal Co. LLC\r
+                               5757 Phantom Drive, Suite 125\r
+                               Hazelwood  MO  63042\r
+                               US\r
+\r
+70-B3-D5   (hex)               Shangnuo company\r
+82B000-82BFFF     (base 16)            Shangnuo company\r
+                               Nong'an district\r
+                               Changchun  Jilin  130000\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Shanghai Westwell Information and Technology Company Ltd\r
+856000-856FFF     (base 16)            Shanghai Westwell Information and Technology Company Ltd\r
+                               No.102,Lixi Road.ChangNing district\r
+                               Shanghai  Shanghai  200050\r
+                               CN\r
+\r
+70-B3-D5   (hex)               NaraControls Inc\r
+3FD000-3FDFFF     (base 16)            NaraControls Inc\r
+                               youngdong daero\r
+                               Seoul    06072\r
+                               KR\r
+\r
+70-B3-D5   (hex)               Vision Sensing Co., Ltd.\r
+93F000-93FFFF     (base 16)            Vision Sensing Co., Ltd.\r
+                               Yorikimachi park bld.5F, Yorikimachi1-5, Kita-ku\r
+                               Osaka  Osaka  530-0036\r
+                               JP\r
+\r
+70-B3-D5   (hex)               Opsys-Tech\r
+99D000-99DFFF     (base 16)            Opsys-Tech\r
+                               26 Harokmim st\r
+                               Holon    5885849\r
+                               IL\r
+\r
+70-B3-D5   (hex)               Elektronik Art\r
+F32000-F32FFF     (base 16)            Elektronik Art\r
+                               80 Melgiewska Str.\r
+                               Lublin  Lublin  20234\r
+                               PL\r
+\r
+70-B3-D5   (hex)               Nueon - The COR\r
+A1A000-A1AFFF     (base 16)            Nueon - The COR\r
+                               101 Jefferson Drive\r
+                               Menlo Park    94025\r
+                               US\r
+\r
 70-B3-D5   (hex)               EVCO SPA\r
 A80000-A80FFF     (base 16)            EVCO SPA\r
                                VIA FELTRE N. 81\r
@@ -5243,12 +5291,6 @@ A84000-A84FFF     (base 16)              SOREL GmbH Mikroelektronik
                                Lancaster  PA  17601\r
                                US\r
 \r
-70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
-B9A000-B9AFFF     (base 16)            Potter Electric Signal Co. LLC\r
-                               1609 Park 370 Place\r
-                               Hazelwood  MO  63042\r
-                               US\r
-\r
 70-B3-D5   (hex)               CAPTEMP, Lda\r
 49E000-49EFFF     (base 16)            CAPTEMP, Lda\r
                                Rua São João, s/n - Ladeira das Leais\r
@@ -5627,12 +5669,6 @@ E9E000-E9EFFF     (base 16)              MSB Elektronik und Gerätebau GmbH
                                Crailsheim    74564\r
                                DE\r
 \r
-70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
-1BE000-1BEFFF     (base 16)            Potter Electric Signal Co. LLC\r
-                               1609 Park 370 Place\r
-                               Hazelwood  MO  63042\r
-                               US\r
-\r
 70-B3-D5   (hex)               DiTEST Fahrzeugdiagnose GmbH\r
 109000-109FFF     (base 16)            DiTEST Fahrzeugdiagnose GmbH\r
                                ALTE POSTSTRASSE 152\r
@@ -6998,12 +7034,6 @@ BE6000-BE6FFF     (base 16)              CCII Systems (Pty) Ltd
                                Bucuresti  Romania  014142\r
                                RO\r
 \r
-70-B3-D5   (hex)               P&S GmbH\r
-09D000-09DFFF     (base 16)            P&S GmbH\r
-                               Hainstr. 13\r
-                               Gera  Germany  07545\r
-                               DE\r
-\r
 70-B3-D5   (hex)               Dynamic Connect (Suzhou) Hi-Tech Electronic Co.,Ltd.\r
 33E000-33EFFF     (base 16)            Dynamic Connect (Suzhou) Hi-Tech Electronic Co.,Ltd.\r
                                Unit C&D, No.201 WuXiang, Export Processing Zone A No.200Suhong Road SIP\r
@@ -8891,24 +8921,30 @@ A7F000-A7FFFF     (base 16)             AUDIO VISUAL DIGITAL SYSTEMS
                                Bergisch Gladbach  North Rhine-Westphalia  51465\r
                                DE\r
 \r
-70-B3-D5   (hex)               DONG IL VISION Co., Ltd.\r
-038000-038FFF     (base 16)            DONG IL VISION Co., Ltd.\r
-                               #9 Ftrek tower, 11-25, Simindaero 327 beongil,Dongan-gu\r
-                               Anyangi-Si  Gyeonggi-Do  14055\r
-                               KR\r
-\r
 70-B3-D5   (hex)               Cetitec GmbH\r
 B36000-B36FFF     (base 16)            Cetitec GmbH\r
                                Mannheimer Strasse 17\r
                                Pforzheim    75179\r
                                DE\r
 \r
-70-B3-D5   (hex)               Kamacho Scale Co., Ltd.\r
-385000-385FFF     (base 16)            Kamacho Scale Co., Ltd.\r
-                               2246 Mure\r
+70-B3-D5   (hex)               DONG IL VISION Co., Ltd.\r
+038000-038FFF     (base 16)            DONG IL VISION Co., Ltd.\r
+                               #9 Ftrek tower, 11-25, Simindaero 327 beongil,Dongan-gu\r
+                               Anyangi-Si  Gyeonggi-Do  14055\r
+                               KR\r
+\r
+70-B3-D5   (hex)               Kamacho Scale Co., Ltd.\r
+385000-385FFF     (base 16)            Kamacho Scale Co., Ltd.\r
+                               2246 Mure\r
                                Takamatsu-shi  Kagawa-ken  761-0196\r
                                JP\r
 \r
+70-B3-D5   (hex)               Visual Robotics\r
+0F4000-0F4FFF     (base 16)            Visual Robotics\r
+                               38 Irving Rd\r
+                               Eugene  OR  97404\r
+                               US\r
+\r
 70-B3-D5   (hex)               Vessel Technology Ltd\r
 44D000-44DFFF     (base 16)            Vessel Technology Ltd\r
                                Banchory Business Centre, Burn O'Bennie Road\r
@@ -8921,11 +8957,11 @@ FA8000-FA8FFF     (base 16)             Munters
                                Pethch Tikva  Israel  4959376\r
                                IL\r
 \r
-70-B3-D5   (hex)               Visual Robotics\r
-0F4000-0F4FFF     (base 16)            Visual Robotics\r
-                               38 Irving Rd\r
-                               Eugene  OR  97404\r
-                               US\r
+70-B3-D5   (hex)               TEX COMPUTER SRL \r
+6C2000-6C2FFF     (base 16)            TEX COMPUTER SRL \r
+                               VIA MERCADANTE 35\r
+                               CATTOLICA   RIMINI   47841\r
+                               IT\r
 \r
 70-B3-D5   (hex)               TangRen C&S CO., Ltd\r
 3FC000-3FCFFF     (base 16)            TangRen C&S CO., Ltd\r
@@ -8933,29 +8969,29 @@ FA8000-FA8FFF     (base 16)             Munters
                                Shenzhen  Guangdong  518052\r
                                CN\r
 \r
-70-B3-D5   (hex)               TEX COMPUTER SRL \r
-6C2000-6C2FFF     (base 16)            TEX COMPUTER SRL \r
-                               VIA MERCADANTE 35\r
-                               CATTOLICA   RIMINI   47841\r
-                               IT\r
-\r
 70-B3-D5   (hex)               LOTES TM OOO\r
 EA5000-EA5FFF     (base 16)            LOTES TM OOO\r
                                Barklaya 22, str.1\r
                                Moscow    121309\r
                                RU\r
 \r
+70-B3-D5   (hex)               Yi An Electronics Co., Ltd\r
+F28000-F28FFF     (base 16)            Yi An Electronics Co., Ltd\r
+                               5F.-2, No. 81, Sec. 1, Xintai 5th Rd., Xizhi Dist\r
+                                New Taipei City    22101\r
+                               TW\r
+\r
 70-B3-D5   (hex)               Ariston Thermo s.p.a.\r
 3D6000-3D6FFF     (base 16)            Ariston Thermo s.p.a.\r
                                Via Aristide Merloni 45\r
                                Fabriano  Ancona  60044\r
                                IT\r
 \r
-70-B3-D5   (hex)               Yi An Electronics Co., Ltd\r
-F28000-F28FFF     (base 16)            Yi An Electronics Co., Ltd\r
-                               5F.-2, No. 81, Sec. 1, Xintai 5th Rd., Xizhi Dist\r
-                                New Taipei City    22101\r
-                               TW\r
+70-B3-D5   (hex)               MG s.r.l.\r
+130000-130FFF     (base 16)            MG s.r.l.\r
+                               via Monte Bianco, 1\r
+                               Solbiate Olona  VA  21058\r
+                               IT\r
 \r
 70-B3-D5   (hex)               DORLET SAU\r
 639000-639FFF     (base 16)            DORLET SAU\r
@@ -8969,18 +9005,6 @@ F28000-F28FFF     (base 16)              Yi An Electronics Co., Ltd
                                Ryazan    390048\r
                                RU\r
 \r
-70-B3-D5   (hex)               MG s.r.l.\r
-130000-130FFF     (base 16)            MG s.r.l.\r
-                               via Monte Bianco, 1\r
-                               Solbiate Olona  VA  21058\r
-                               IT\r
-\r
-70-B3-D5   (hex)               Postmark Incorporated \r
-CBB000-CBBFFF     (base 16)            Postmark Incorporated \r
-                               3197 Duncan Lane\r
-                               San Luis Obispo  CA  93401\r
-                               US\r
-\r
 70-B3-D5   (hex)               Glory Technology Service Inc.\r
 801000-801FFF     (base 16)            Glory Technology Service Inc.\r
                                3F., No.43-1, Ln. 11, Sec. 6, Minquan E. Rd\r
@@ -8993,6 +9017,12 @@ CBB000-CBBFFF     (base 16)              Postmark Incorporated
                                Gifu-shi  Gifu  500-8122\r
                                JP\r
 \r
+70-B3-D5   (hex)               Postmark Incorporated \r
+CBB000-CBBFFF     (base 16)            Postmark Incorporated \r
+                               3197 Duncan Lane\r
+                               San Luis Obispo  CA  93401\r
+                               US\r
+\r
 70-B3-D5   (hex)               Abbott Diagnostics Technologies AS\r
 53F000-53FFFF     (base 16)            Abbott Diagnostics Technologies AS\r
                                P. O.  Box 6863 Rodeløkka\r
@@ -9017,6 +9047,12 @@ CBB000-CBBFFF     (base 16)              Postmark Incorporated
                                VILLA BARTOLOMEA  IT  37049\r
                                IT\r
 \r
+70-B3-D5   (hex)               Global Power Products\r
+3B1000-3B1FFF     (base 16)            Global Power Products\r
+                               225 Arnold Road\r
+                               Lawrenceville    30044\r
+                               US\r
+\r
 70-B3-D5   (hex)               Sankyo Intec Co,ltd\r
 E7F000-E7FFFF     (base 16)            Sankyo Intec Co,ltd\r
                                127 Tokimata\r
@@ -9029,18 +9065,6 @@ E7F000-E7FFFF     (base 16)              Sankyo Intec Co,ltd
                                waltham  MA  02453\r
                                US\r
 \r
-70-B3-D5   (hex)               Global Power Products\r
-3B1000-3B1FFF     (base 16)            Global Power Products\r
-                               225 Arnold Road\r
-                               Lawrenceville    30044\r
-                               US\r
-\r
-70-B3-D5   (hex)               Nidec asi spa\r
-D88000-D88FFF     (base 16)            Nidec asi spa\r
-                               s.s11 , ca sordis 4\r
-                               Montebello Vicentino  vicenza  36054\r
-                               IT\r
-\r
 70-B3-D5   (hex)               EnergizeEV\r
 EB6000-EB6FFF     (base 16)            EnergizeEV\r
                                #160, 1684 Decoto Road\r
@@ -9053,6 +9077,12 @@ F66000-F66FFF     (base 16)              Seznam.cz, a.s., CZ26168685
                                Praha  Czech Republic  15000\r
                                CZ\r
 \r
+70-B3-D5   (hex)               Nidec asi spa\r
+D88000-D88FFF     (base 16)            Nidec asi spa\r
+                               s.s11 , ca sordis 4\r
+                               Montebello Vicentino  vicenza  36054\r
+                               IT\r
+\r
 70-B3-D5   (hex)               Frog Cellsat Limited\r
 C5E000-C5EFFF     (base 16)            Frog Cellsat Limited\r
                                D-213, Sector-63, Noida\r
@@ -9095,11 +9125,11 @@ C5E000-C5EFFF     (base 16)             Frog Cellsat Limited
                                Shanghai  Shanghai  201114\r
                                CN\r
 \r
-70-B3-D5   (hex)               Sphere of economical technologies Ltd\r
-1C1000-1C1FFF     (base 16)            Sphere of economical technologies Ltd\r
-                               132, 7-ya Liniya Str.\r
-                               Omsk  Omskaya oblast  644021\r
-                               RU\r
+70-B3-D5   (hex)               NooliTIC\r
+E51000-E51FFF     (base 16)            NooliTIC\r
+                               165 avenue de bretagne\r
+                               LILLE    59000\r
+                               FR\r
 \r
 70-B3-D5   (hex)               Simplified MFG\r
 66F000-66FFFF     (base 16)            Simplified MFG\r
@@ -9107,11 +9137,11 @@ C5E000-C5EFFF     (base 16)             Frog Cellsat Limited
                                Mesa  AZ  85206\r
                                US\r
 \r
-70-B3-D5   (hex)               NooliTIC\r
-E51000-E51FFF     (base 16)            NooliTIC\r
-                               165 avenue de bretagne\r
-                               LILLE    59000\r
-                               FR\r
+70-B3-D5   (hex)               Sphere of economical technologies Ltd\r
+1C1000-1C1FFF     (base 16)            Sphere of economical technologies Ltd\r
+                               132, 7-ya Liniya Str.\r
+                               Omsk  Omskaya oblast  644021\r
+                               RU\r
 \r
 70-B3-D5   (hex)               Scenario Automation\r
 43C000-43CFFF     (base 16)            Scenario Automation\r
@@ -9149,18 +9179,18 @@ D35000-D35FFF     (base 16)             King-On Technology Ltd.
                                New Taipei City  Taiwan  23143\r
                                TW\r
 \r
-70-B3-D5   (hex)               Nuance Hearing Ltd.\r
-AE4000-AE4FFF     (base 16)            Nuance Hearing Ltd.\r
-                               Raoul Wallenberg 24, Building A1, Floor 3\r
-                               Tel Aviv    6971920\r
-                               IL\r
-\r
 70-B3-D5   (hex)               BRS Sistemas Eletrônicos\r
 3CD000-3CDFFF     (base 16)            BRS Sistemas Eletrônicos\r
                                Rua Gomes de Freitas, 491 / 204\r
                                Porto Alegre  RS  91380-000\r
                                BR\r
 \r
+70-B3-D5   (hex)               Nuance Hearing Ltd.\r
+AE4000-AE4FFF     (base 16)            Nuance Hearing Ltd.\r
+                               Raoul Wallenberg 24, Building A1, Floor 3\r
+                               Tel Aviv    6971920\r
+                               IL\r
+\r
 70-B3-D5   (hex)               HONG JIANG ELECTRONICS CO., LTD.\r
 E64000-E64FFF     (base 16)            HONG JIANG ELECTRONICS CO., LTD.\r
                                9F, No. 649-3, Zhong Zheng Rd.,, Xin Zhuang Dist., New Taipei City,, TAIWAN(R.O.C.)\r
@@ -9173,18 +9203,18 @@ E64000-E64FFF     (base 16)             HONG JIANG ELECTRONICS CO., LTD.
                                TianHe  GuangZhou  515800\r
                                CN\r
 \r
-70-B3-D5   (hex)               OLEDCOMM\r
-7D3000-7D3FFF     (base 16)            OLEDCOMM\r
-                               10-12 avenue de l'Europe\r
-                               Vélizy Villacoublay  Ile de France  78140\r
-                               FR\r
-\r
 70-B3-D5   (hex)               Malin Space Science System\r
 FE5000-FE5FFF     (base 16)            Malin Space Science System\r
                                5880 Pacific Center Blvd \r
                                San Diego  CA  92121\r
                                US\r
 \r
+70-B3-D5   (hex)               OLEDCOMM\r
+7D3000-7D3FFF     (base 16)            OLEDCOMM\r
+                               10-12 avenue de l'Europe\r
+                               Vélizy Villacoublay  Ile de France  78140\r
+                               FR\r
+\r
 70-B3-D5   (hex)               Wexiodisk AB\r
 905000-905FFF     (base 16)            Wexiodisk AB\r
                                Mardvagen 4\r
@@ -9209,6 +9239,48 @@ D18000-D18FFF     (base 16)              MetCom Solutions GmbH
                                Mannheim  Baden-Wuerttemberg  68219\r
                                DE\r
 \r
+70-B3-D5   (hex)               BeiLi eTek (Zhangjiagang) Co., Ltd.\r
+D53000-D53FFF     (base 16)            BeiLi eTek (Zhangjiagang) Co., Ltd.\r
+                               Dongnan Industrial Park, Nanfeng Town\r
+                               Zhangjiagang  Jiangsu  215619\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Konzept Informationssysteme GmbH\r
+71C000-71CFFF     (base 16)            Konzept Informationssysteme GmbH\r
+                               Am Weiher 13\r
+                               Meersburg    88709\r
+                               DE\r
+\r
+70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
+1BE000-1BEFFF     (base 16)            Potter Electric Signal Co. LLC\r
+                               5757 Phantom Drive, Suite 125\r
+                               Hazelwood  MO  63042\r
+                               US\r
+\r
+70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
+B9A000-B9AFFF     (base 16)            Potter Electric Signal Co. LLC\r
+                               5757 Phantom Drive, Suite 125\r
+                               Hazelwood  MO  63042\r
+                               US\r
+\r
+70-B3-D5   (hex)               ABECO Industrie Computer GmbH\r
+F02000-F02FFF     (base 16)            ABECO Industrie Computer GmbH\r
+                               Industriestrasse 2\r
+                               Straelen  NRW  47638\r
+                               DE\r
+\r
+70-B3-D5   (hex)               PuS GmbH und Co. KG\r
+09D000-09DFFF     (base 16)            PuS GmbH und Co. KG\r
+                               Hainstr. 13\r
+                               Gera  Germany  07545\r
+                               DE\r
+\r
+70-B3-D5   (hex)               Partilink Inc.\r
+6A7000-6A7FFF     (base 16)            Partilink Inc.\r
+                               2F-2, No.18, Ln. 48. Xingshan Rd, Neihu Dist.\r
+                               Taipei     114\r
+                               TW\r
+\r
 70-B3-D5   (hex)               System West dba ICS Electronics\r
 E06000-E06FFF     (base 16)            System West dba ICS Electronics\r
                                7034 Commerce Circle Suite A\r
@@ -10823,12 +10895,6 @@ AA3000-AA3FFF     (base 16)            LINEAGE POWER PVT LTD.,
                                MAIRANO  BRESCIA  25030\r
                                IT\r
 \r
-70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
-C17000-C17FFF     (base 16)            Potter Electric Signal Co. LLC\r
-                               1609 Park 370 Place\r
-                               Hazelwood    63042\r
-                               US\r
-\r
 70-B3-D5   (hex)               PEEK TRAFFIC\r
 A28000-A28FFF     (base 16)            PEEK TRAFFIC\r
                                5401 N SAM HOUSTON PKWY W\r
@@ -13436,18 +13502,6 @@ F23000-F23FFF     (base 16)            Lyse AS
                                Bad Marienberg  Rheinland-Pfalz  56470\r
                                DE\r
 \r
-70-B3-D5   (hex)               Walton Hi-Tech Industries Ltd.\r
-E5C000-E5CFFF     (base 16)            Walton Hi-Tech Industries Ltd.\r
-                               HOLDING NO. I-65/2, WARD NO-07\r
-                               CHANDRA, KALIAKOIR, GAZIPUR.    1750\r
-                               BD\r
-\r
-70-B3-D5   (hex)               Flextronics International Kft\r
-699000-699FFF     (base 16)            Flextronics International Kft\r
-                               38. Zrinyi Str.\r
-                               Zalaegerszeg  Zala  8900\r
-                               HU\r
-\r
 70-B3-D5   (hex)               JFA Electronics Industry and Commerce EIRELI\r
 5F7000-5F7FFF     (base 16)            JFA Electronics Industry and Commerce EIRELI\r
                                Rua Flor das Pedras, 175\r
@@ -13460,6 +13514,12 @@ E5C000-E5CFFF     (base 16)            Walton Hi-Tech Industries Ltd.
                                Boonton Township  NJ  07005\r
                                US\r
 \r
+70-B3-D5   (hex)               Walton Hi-Tech Industries Ltd.\r
+E5C000-E5CFFF     (base 16)            Walton Hi-Tech Industries Ltd.\r
+                               HOLDING NO. I-65/2, WARD NO-07\r
+                               CHANDRA, KALIAKOIR, GAZIPUR.    1750\r
+                               BD\r
+\r
 70-B3-D5   (hex)               aquila biolabs GmbH\r
 7DB000-7DBFFF     (base 16)            aquila biolabs GmbH\r
                                Arnold-Sommerfeld-Ring 2\r
@@ -13472,6 +13532,12 @@ C82000-C82FFF     (base 16)            Sicon srl
                                Isola Vicentina  Vicenza  36033\r
                                IT\r
 \r
+70-B3-D5   (hex)               Flextronics International Kft\r
+699000-699FFF     (base 16)            Flextronics International Kft\r
+                               38. Zrinyi Str.\r
+                               Zalaegerszeg  Zala  8900\r
+                               HU\r
+\r
 70-B3-D5   (hex)               LGE\r
 DAE000-DAEFFF     (base 16)            LGE\r
                                10, Magokjungang 10-ro, Gangseo-gu\r
@@ -13526,12 +13592,6 @@ F64000-F64FFF     (base 16)            silicom
                                Borehamwood  Hert  WD6 1NA\r
                                GB\r
 \r
-70-B3-D5   (hex)               Kospel S.A.\r
-249000-249FFF     (base 16)            Kospel S.A.\r
-                               Olchowa 1\r
-                               Koszalin    75-136\r
-                               PL\r
-\r
 70-B3-D5   (hex)               Microchip Technology Germany II GmbH&Co.KG\r
 77F000-77FFFF     (base 16)            Microchip Technology Germany II GmbH&Co.KG\r
                                Emmy-Noether-Straße 14\r
@@ -13544,6 +13604,12 @@ C98000-C98FFF     (base 16)            Trust Automation
                                San Luis Obispo  CA  93401\r
                                US\r
 \r
+70-B3-D5   (hex)               Kospel S.A.\r
+249000-249FFF     (base 16)            Kospel S.A.\r
+                               Olchowa 1\r
+                               Koszalin    75-136\r
+                               PL\r
+\r
 70-B3-D5   (hex)               Coheros Oy\r
 D2E000-D2EFFF     (base 16)            Coheros Oy\r
                                Tammukkakatu 6\r
@@ -13556,18 +13622,6 @@ E24000-E24FFF     (base 16)            Gogo Business Aviation
                                Broomfield  CO  80021\r
                                US\r
 \r
-70-B3-D5   (hex)               Smart Embedded Systems\r
-A09000-A09FFF     (base 16)            Smart Embedded Systems\r
-                               6701  Koll Center Parkway #250\r
-                               Pleasonton  CA  94566\r
-                               US\r
-\r
-70-B3-D5   (hex)               Guan Show Technologe Co., Ltd.\r
-F6A000-F6AFFF     (base 16)            Guan Show Technologe Co., Ltd.\r
-                               No.127, Jianguo 1st Rd., Lingya Dist.\r
-                                Kaohsiung City     802\r
-                               TW\r
-\r
 70-B3-D5   (hex)               Taejin InfoTech\r
 A75000-A75FFF     (base 16)            Taejin InfoTech\r
                                40, Imi-ro, A-411\r
@@ -13580,6 +13634,18 @@ A75000-A75FFF     (base 16)            Taejin InfoTech
                                AIX EN PROVENCE    13290\r
                                FR\r
 \r
+70-B3-D5   (hex)               Smart Embedded Systems\r
+A09000-A09FFF     (base 16)            Smart Embedded Systems\r
+                               6701  Koll Center Parkway #250\r
+                               Pleasonton  CA  94566\r
+                               US\r
+\r
+70-B3-D5   (hex)               Guan Show Technologe Co., Ltd.\r
+F6A000-F6AFFF     (base 16)            Guan Show Technologe Co., Ltd.\r
+                               No.127, Jianguo 1st Rd., Lingya Dist.\r
+                                Kaohsiung City     802\r
+                               TW\r
+\r
 70-B3-D5   (hex)               LLC Sarov Innovative Technologies (WIZOLUTION)\r
 50F000-50FFFF     (base 16)            LLC Sarov Innovative Technologies (WIZOLUTION)\r
                                RUSSIAN FEDERATION, Nizhny Novgorod region, Varlamovskaya road, 7, build 2\r
@@ -13592,12 +13658,6 @@ A77000-A77FFF     (base 16)            SPX Radiodetection
                                Bristol  Avon  BS14 0AF\r
                                GB\r
 \r
-70-B3-D5   (hex)               INVISSYS\r
-AD4000-AD4FFF     (base 16)            INVISSYS\r
-                               25 rue marcel issartier\r
-                               merignac    33700\r
-                               FR\r
-\r
 70-B3-D5   (hex)               LM-Instruments Oy\r
 5AC000-5ACFFF     (base 16)            LM-Instruments Oy\r
                                Norrbyn rantatie 8\r
@@ -13610,16 +13670,28 @@ DBB000-DBBFFF     (base 16)           Fuhr GmbH Filtertechnik
                                Klein-Winternheim  Rheinland-Pfalz  55270\r
                                DE\r
 \r
+70-B3-D5   (hex)               Sanmina Israel\r
+C18000-C18FFF     (base 16)            Sanmina Israel\r
+                               Koren Industrial Zone , POBox 102\r
+                               Maalot  Israel  2101002\r
+                               IL\r
+\r
+70-B3-D5   (hex)               INVISSYS\r
+AD4000-AD4FFF     (base 16)            INVISSYS\r
+                               25 rue marcel issartier\r
+                               merignac    33700\r
+                               FR\r
+\r
 70-B3-D5   (hex)               Panoramic Power\r
 669000-669FFF     (base 16)            Panoramic Power\r
                                15 Atir Yeda\r
                                Kfar Saba    4464312\r
                                IL\r
 \r
-70-B3-D5   (hex)               Sanmina Israel\r
-C18000-C18FFF     (base 16)            Sanmina Israel\r
-                               Koren Industrial Zone , POBox 102\r
-                               Maalot  Israel  2101002\r
+70-B3-D5   (hex)               Panoramic Power\r
+06D000-06DFFF     (base 16)            Panoramic Power\r
+                               Atir Yeda 15\r
+                               Kfar Saba    4464312\r
                                IL\r
 \r
 70-B3-D5   (hex)               Avlinkpro\r
@@ -13628,11 +13700,11 @@ C18000-C18FFF     (base 16)           Sanmina Israel
                                Totowa  NJ  07512\r
                                US\r
 \r
-70-B3-D5   (hex)               Panoramic Power\r
-06D000-06DFFF     (base 16)            Panoramic Power\r
-                               Atir Yeda 15\r
-                               Kfar Saba    4464312\r
-                               IL\r
+70-B3-D5   (hex)               DECYBEN\r
+683000-683FFF     (base 16)            DECYBEN\r
+                               170 Rue Raymond Losserand\r
+                               Paris    75014\r
+                               FR\r
 \r
 70-B3-D5   (hex)               C4I Systems Ltd\r
 5C6000-5C6FFF     (base 16)            C4I Systems Ltd\r
@@ -13646,11 +13718,11 @@ C36000-C36FFF     (base 16)           Knowledge Resources GmbH
                                Bsel  BS  4057\r
                                CH\r
 \r
-70-B3-D5   (hex)               DECYBEN\r
-683000-683FFF     (base 16)            DECYBEN\r
-                               170 Rue Raymond Losserand\r
-                               Paris    75014\r
-                               FR\r
+70-B3-D5   (hex)               CoreEL Technologies Pvt Ltd\r
+10D000-10DFFF     (base 16)            CoreEL Technologies Pvt Ltd\r
+                               #21, 7th Main, 1st Block ,Koramangala, \r
+                               Bangalore  Karnataka  560034\r
+                               IN\r
 \r
 70-B3-D5   (hex)               adnexo GmbH\r
 4E3000-4E3FFF     (base 16)            adnexo GmbH\r
@@ -13670,12 +13742,6 @@ C23000-C23FFF     (base 16)            Sumitomo Heavy Industries, Ltd.
                                Moscow  Moscow  109380\r
                                RU\r
 \r
-70-B3-D5   (hex)               CoreEL Technologies Pvt Ltd\r
-10D000-10DFFF     (base 16)            CoreEL Technologies Pvt Ltd\r
-                               #21, 7th Main, 1st Block ,Koramangala, \r
-                               Bangalore  Karnataka  560034\r
-                               IN\r
-\r
 70-B3-D5   (hex)               Shenzhen Vikings Technology Co., Ltd.\r
 46A000-46AFFF     (base 16)            Shenzhen Vikings Technology Co., Ltd.\r
                                Floor 3, building 2, tiantong industrial park, gaofeng community, dalang street, longhua district\r
@@ -13688,18 +13754,18 @@ C23000-C23FFF     (base 16)           Sumitomo Heavy Industries, Ltd.
                                Ho Chi Minh City  Ho Chi Minh  70000\r
                                VN\r
 \r
-70-B3-D5   (hex)               C W F Hamilton & Co Ltd\r
-82A000-82AFFF     (base 16)            C W F Hamilton & Co Ltd\r
-                               20 Lunns Road, Middleton\r
-                               Christchurch  Canterbury  8024\r
-                               NZ\r
-\r
 70-B3-D5   (hex)               aelettronica group srl\r
 AD9000-AD9FFF     (base 16)            aelettronica group srl\r
                                via matteotti,22\r
                                gaggiano  milano  20083\r
                                IT\r
 \r
+70-B3-D5   (hex)               C W F Hamilton & Co Ltd\r
+82A000-82AFFF     (base 16)            C W F Hamilton & Co Ltd\r
+                               20 Lunns Road, Middleton\r
+                               Christchurch  Canterbury  8024\r
+                               NZ\r
+\r
 70-B3-D5   (hex)               Wuhan Xingtuxinke ELectronic Co.,Ltd\r
 165000-165FFF     (base 16)            Wuhan Xingtuxinke ELectronic Co.,Ltd\r
                                NO.C3-8F,Software Park,Optics Valley,East Lake Development Zone,Wuhan,Hubei,China\r
@@ -13718,12 +13784,6 @@ ED2000-ED2FFF     (base 16)            PCTEL
                                Clarksburg  MD  20871\r
                                US\r
 \r
-70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
-70C000-70CFFF     (base 16)            Potter Electric Signal Co. LLC\r
-                               1609 Park 370 Place\r
-                               Hazelwood  MO  63042\r
-                               US\r
-\r
 70-B3-D5   (hex)               Computechnic AG\r
 7D4000-7D4FFF     (base 16)            Computechnic AG\r
                                Rietlistrasse 3\r
@@ -13760,18 +13820,18 @@ B90000-B90FFF     (base 16)           Amico Corporation
                                Seung-nam Si  Gyeonggi-Do  13488\r
                                KR\r
 \r
-70-B3-D5   (hex)               Honeywell/Intelligrated\r
-94C000-94CFFF     (base 16)            Honeywell/Intelligrated\r
-                               10045 International Blvd\r
-                               Cincinnati  OH  45246\r
-                               US\r
-\r
 70-B3-D5   (hex)               TIAMA\r
 8A1000-8A1FFF     (base 16)            TIAMA\r
                                ZA des Plattes - 1 Chemin des Plattes\r
                                VOURLES     69390 \r
                                FR\r
 \r
+70-B3-D5   (hex)               Honeywell/Intelligrated\r
+94C000-94CFFF     (base 16)            Honeywell/Intelligrated\r
+                               10045 International Blvd\r
+                               Cincinnati  OH  45246\r
+                               US\r
+\r
 70-B3-D5   (hex)               LARIMART SPA\r
 536000-536FFF     (base 16)            LARIMART SPA\r
                                VIA DI TORREVECCHIA\r
@@ -13790,18 +13850,18 @@ EDA000-EDAFFF     (base 16)           Breas Medical AB
                                Mölnlycke    SE-435 33\r
                                SE\r
 \r
-70-B3-D5   (hex)               Ketronixs Sdn Bhd\r
-6AC000-6ACFFF     (base 16)            Ketronixs Sdn Bhd\r
-                               51-17-B Menara BHL Bank, Jalan Sultan Ahmad Shah\r
-                               Georgetown  Penang  10050\r
-                               MY\r
-\r
 70-B3-D5   (hex)               Packet Power\r
 B54000-B54FFF     (base 16)            Packet Power\r
                                2716 Summer Str. N.E.\r
                                Minneapolis  MN  55413\r
                                US\r
 \r
+70-B3-D5   (hex)               Ketronixs Sdn Bhd\r
+6AC000-6ACFFF     (base 16)            Ketronixs Sdn Bhd\r
+                               51-17-B Menara BHL Bank, Jalan Sultan Ahmad Shah\r
+                               Georgetown  Penang  10050\r
+                               MY\r
+\r
 70-B3-D5   (hex)               Alto Aviation\r
 D0F000-D0FFFF     (base 16)            Alto Aviation\r
                                86 Leominster Road\r
@@ -13826,6 +13886,54 @@ A23000-A23FFF     (base 16)            LG Electronics
                                SEOUL    07796\r
                                KR\r
 \r
+70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
+C17000-C17FFF     (base 16)            Potter Electric Signal Co. LLC\r
+                               5757 Phantom Drive, Suite 125\r
+                               Hazelwood  MO  63042\r
+                               US\r
+\r
+70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
+70C000-70CFFF     (base 16)            Potter Electric Signal Co. LLC\r
+                               5757 Phantom Drive, Suite 125\r
+                               Hazelwood  MO  63042\r
+                               US\r
+\r
+70-B3-D5   (hex)               Antlia Systems\r
+416000-416FFF     (base 16)            Antlia Systems\r
+                               401 N Michigan Ave Ste 1200\r
+                               Chicago  IL  60611\r
+                               US\r
+\r
+70-B3-D5   (hex)               BAE SYSTEMS \r
+055000-055FFF     (base 16)            BAE SYSTEMS \r
+                               150 PARISH DRIVE \r
+                               WAYNE  NJ  07470\r
+                               US\r
+\r
+70-B3-D5   (hex)               Advanced Telecommunications Research Institute International\r
+68A000-68AFFF     (base 16)            Advanced Telecommunications Research Institute International\r
+                               2-2-2 Hikaridai\r
+                               Seika-cho, Sorakugun  Kyoto  619-0288\r
+                               JP\r
+\r
+70-B3-D5   (hex)               Doosan Digital Innovation America\r
+B7B000-B7BFFF     (base 16)            Doosan Digital Innovation America\r
+                               195 GOVERNORS HWY\r
+                               SOUTH WINDSOR  CT  06074-2419\r
+                               US\r
+\r
+70-B3-D5   (hex)               Engage Technologies\r
+E11000-E11FFF     (base 16)            Engage Technologies\r
+                               7041 Boone Avenue North\r
+                               Brooklyn Park  MN  55428\r
+                               US\r
+\r
+70-B3-D5   (hex)               GPSat Systems\r
+386000-386FFF     (base 16)            GPSat Systems\r
+                               Suite 1 22 Aberdeen Road\r
+                               Macleod  VIC  3085\r
+                               AU\r
+\r
 70-B3-D5   (hex)               YUYAMA MFG Co.,Ltd\r
 BBB000-BBBFFF     (base 16)            YUYAMA MFG Co.,Ltd\r
                                3-3-1\r
@@ -15932,12 +16040,6 @@ A89000-A89FFF     (base 16)            GBS COMMUNICATIONS, LLC
                                DORAL  FL  33178\r
                                US\r
 \r
-70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
-A1B000-A1BFFF     (base 16)            Potter Electric Signal Co. LLC\r
-                               1609 Park 370 Place\r
-                               Hazelwood  MO  63042\r
-                               US\r
-\r
 70-B3-D5   (hex)               Aquavision Distribution Ltd\r
 0DA000-0DAFFF     (base 16)            Aquavision Distribution Ltd\r
                                unit 7 Riverpark, Billet Lane\r
@@ -18050,24 +18152,30 @@ BE0000-BE0FFF     (base 16)           Cognosos, Inc.
                                Taoyuan      330\r
                                TW\r
 \r
-70-B3-D5   (hex)               PolyTech A/S\r
-F4C000-F4CFFF     (base 16)            PolyTech A/S\r
-                               HI Park 445\r
-                               Herning  Herning  7400\r
-                               DK\r
-\r
 70-B3-D5   (hex)               Zhuhai Lonl electric Co.,Ltd.\r
 EA9000-EA9FFF     (base 16)            Zhuhai Lonl electric Co.,Ltd.\r
                                2nd floor, building B3, nanfang software park, xiangzhou district\r
                                Zhuhai  Guangdong   519000\r
                                CN\r
 \r
+70-B3-D5   (hex)               PolyTech A/S\r
+F4C000-F4CFFF     (base 16)            PolyTech A/S\r
+                               HI Park 445\r
+                               Herning  Herning  7400\r
+                               DK\r
+\r
 70-B3-D5   (hex)               Shanghai Tiancheng Communication Technology Corporation\r
 1C3000-1C3FFF     (base 16)            Shanghai Tiancheng Communication Technology Corporation\r
                                No.618,Guangxing Rd.,Songjiang \r
                                shanghai    200090\r
                                CN\r
 \r
+70-B3-D5   (hex)               T&M Media Pty Ltd\r
+B41000-B41FFF     (base 16)            T&M Media Pty Ltd\r
+                               6, 476 Gardeners Road\r
+                               Alexandria  NSW  2015\r
+                               AU\r
+\r
 70-B3-D5   (hex)               SAMBO HITECH\r
 282000-282FFF     (base 16)            SAMBO HITECH\r
                                469,Seokjung-ro,Namdong-Gu\r
@@ -18080,40 +18188,34 @@ F9F000-F9FFFF     (base 16)           M.A.C. Solutions (UK) Ltd
                                Redditch  Worcestershire  B98 8LG\r
                                GB\r
 \r
+70-B3-D5   (hex)               Shenzhen CAMERAY ELECTRONIC CO., LTD\r
+1E2000-1E2FFF     (base 16)            Shenzhen CAMERAY ELECTRONIC CO., LTD\r
+                               4-5FL, Building 1, Guanghui Science, and Technology Park; Minqing Road, Longhua Town\r
+                               shenzhen  GD  518109\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Vulcan Wireless Inc.\r
+E4D000-E4DFFF     (base 16)            Vulcan Wireless Inc.\r
+                               2218 Faraday Ave Suite 110\r
+                               Carlsbad  CA  92008\r
+                               US\r
+\r
 70-B3-D5   (hex)               ERA TOYS LIMITED\r
 193000-193FFF     (base 16)            ERA TOYS LIMITED\r
                                Room 505, 5th Floor, Beverley Commercial Centre, 87-105 Chatham Road South\r
                                Tsim Sha Tsui  Kowloon  0000\r
                                HK\r
 \r
-70-B3-D5   (hex)               T&M Media Pty Ltd\r
-B41000-B41FFF     (base 16)            T&M Media Pty Ltd\r
-                               6, 476 Gardeners Road\r
-                               Alexandria  NSW  2015\r
-                               AU\r
-\r
-70-B3-D5   (hex)               A&T Corporation\r
-32E000-32EFFF     (base 16)            A&T Corporation\r
-                               2023-1\r
-                               Endo, Fujisawa, Kanagawa    252-0816\r
-                               JP\r
-\r
 70-B3-D5   (hex)               Scorpion Precision Industry (HK)CO. Ltd.\r
 02B000-02BFFF     (base 16)            Scorpion Precision Industry (HK)CO. Ltd.\r
                                16th Floor, Excelsior Industrial Building,68-76 Sha Tsui Road,\r
                                Tsuen Wan  New Territories  999077\r
                                HK\r
 \r
-70-B3-D5   (hex)               Shenzhen CAMERAY ELECTRONIC CO., LTD\r
-1E2000-1E2FFF     (base 16)            Shenzhen CAMERAY ELECTRONIC CO., LTD\r
-                               4-5FL, Building 1, Guanghui Science, and Technology Park; Minqing Road, Longhua Town\r
-                               shenzhen  GD  518109\r
-                               CN\r
-\r
-70-B3-D5   (hex)               Vulcan Wireless Inc.\r
-E4D000-E4DFFF     (base 16)            Vulcan Wireless Inc.\r
-                               2218 Faraday Ave Suite 110\r
-                               Carlsbad  CA  92008\r
+70-B3-D5   (hex)               Cryptotronix LLC\r
+0DB000-0DBFFF     (base 16)            Cryptotronix LLC\r
+                               P.O. Box 273029\r
+                               Fort Collins  CO  80525\r
                                US\r
 \r
 70-B3-D5   (hex)               MIVO Technology AB\r
@@ -18122,11 +18224,11 @@ E4D000-E4DFFF     (base 16)           Vulcan Wireless Inc.
                                Stockholm    11215\r
                                SE\r
 \r
-70-B3-D5   (hex)               Cryptotronix LLC\r
-0DB000-0DBFFF     (base 16)            Cryptotronix LLC\r
-                               P.O. Box 273029\r
-                               Fort Collins  CO  80525\r
-                               US\r
+70-B3-D5   (hex)               A&T Corporation\r
+32E000-32EFFF     (base 16)            A&T Corporation\r
+                               2023-1\r
+                               Endo, Fujisawa, Kanagawa    252-0816\r
+                               JP\r
 \r
 70-B3-D5   (hex)               TOMEI TSUSHIN KOGYO CO,.LTD\r
 FB1000-FB1FFF     (base 16)            TOMEI TSUSHIN KOGYO CO,.LTD\r
@@ -18134,6 +18236,12 @@ FB1000-FB1FFF     (base 16)            TOMEI TSUSHIN KOGYO CO,.LTD
                                Inazawa Shi  Aichi ken  4928274\r
                                JP\r
 \r
+70-B3-D5   (hex)               DogWatch Inc\r
+1E7000-1E7FFF     (base 16)            DogWatch Inc\r
+                               10 Michigan Drive\r
+                               Natick    01760\r
+                               US\r
+\r
 70-B3-D5   (hex)               RCH Vietnam Limited Liability Company\r
 C09000-C09FFF     (base 16)            RCH Vietnam Limited Liability Company\r
                                Workshop F.01B-2, Lot No. F.01B Long Hau\r
@@ -18146,24 +18254,6 @@ F69000-F69FFF     (base 16)            Copper Labs, Inc.
                                Boulder  CO  80301\r
                                US\r
 \r
-70-B3-D5   (hex)               DogWatch Inc\r
-1E7000-1E7FFF     (base 16)            DogWatch Inc\r
-                               10 Michigan Drive\r
-                               Natick    01760\r
-                               US\r
-\r
-70-B3-D5   (hex)               Grossenbacher Systeme AG\r
-B75000-B75FFF     (base 16)            Grossenbacher Systeme AG\r
-                               Spinnereistrasse 10\r
-                               St. Gallen    9008\r
-                               CH\r
-\r
-70-B3-D5   (hex)               ITsynergy Ltd\r
-D2A000-D2AFFF     (base 16)            ITsynergy Ltd\r
-                               9 Bonhill Street\r
-                               London    EC2A 4DJ\r
-                               GB\r
-\r
 70-B3-D5   (hex)               SHENZHEN HUINENGYUAN Technology Co., Ltd\r
 A83000-A83FFF     (base 16)            SHENZHEN HUINENGYUAN Technology Co., Ltd\r
                                Room 206, 3 Building, Hongwanchuangke Center, Gushu, Xixiang, Baoan District\r
@@ -18188,28 +18278,34 @@ C94000-C94FFF     (base 16)           Vars Technology
                                Blaricum    1261WT\r
                                NL\r
 \r
+70-B3-D5   (hex)               Grossenbacher Systeme AG\r
+B75000-B75FFF     (base 16)            Grossenbacher Systeme AG\r
+                               Spinnereistrasse 10\r
+                               St. Gallen    9008\r
+                               CH\r
+\r
+70-B3-D5   (hex)               ITsynergy Ltd\r
+D2A000-D2AFFF     (base 16)            ITsynergy Ltd\r
+                               9 Bonhill Street\r
+                               London    EC2A 4DJ\r
+                               GB\r
+\r
 70-B3-D5   (hex)               Vaunix Technology Corporation\r
 EE6000-EE6FFF     (base 16)            Vaunix Technology Corporation\r
                                7 New Pasture Rd\r
                                Newburyport  MA  01950\r
                                US\r
 \r
-70-B3-D5   (hex)               Portrait Displays, Inc.\r
-D77000-D77FFF     (base 16)            Portrait Displays, Inc.\r
-                               6663 OWENS DR\r
-                               PLEASANTON  CA  94588\r
-                               US\r
-\r
 70-B3-D5   (hex)               chargeBIG\r
 869000-869FFF     (base 16)            chargeBIG\r
                                Pragstraße 26-46\r
                                Stuttgart    70376\r
                                DE\r
 \r
-70-B3-D5   (hex)               Tricom Research Inc.\r
-601000-601FFF     (base 16)            Tricom Research Inc.\r
-                               17791 Sky Park Circle Suite GHJ\r
-                               Irvine  CA  92614\r
+70-B3-D5   (hex)               Portrait Displays, Inc.\r
+D77000-D77FFF     (base 16)            Portrait Displays, Inc.\r
+                               6663 OWENS DR\r
+                               PLEASANTON  CA  94588\r
                                US\r
 \r
 70-B3-D5   (hex)               Sprintshield d.o.o.\r
@@ -18218,16 +18314,40 @@ B03000-B03FFF     (base 16)           Sprintshield d.o.o.
                                Velika Gorica    10410\r
                                HR\r
 \r
+70-B3-D5   (hex)               Tricom Research Inc.\r
+601000-601FFF     (base 16)            Tricom Research Inc.\r
+                               17791 Sky Park Circle Suite GHJ\r
+                               Irvine  CA  92614\r
+                               US\r
+\r
+70-B3-D5   (hex)               Mictrotrac Retsch GmbH\r
+F09000-F09FFF     (base 16)            Mictrotrac Retsch GmbH\r
+                               Retsch-Allee 1-5\r
+                               Haan  NRW  42781\r
+                               DE\r
+\r
 70-B3-D5   (hex)               KeyProd\r
 473000-473FFF     (base 16)            KeyProd\r
                                66 avenue des Champs Elysées\r
                                Paris    77008\r
                                FR\r
 \r
-70-B3-D5   (hex)               Mictrotrac Retsch GmbH\r
-F09000-F09FFF     (base 16)            Mictrotrac Retsch GmbH\r
-                               Retsch-Allee 1-5\r
-                               Haan  NRW  42781\r
+70-B3-D5   (hex)               WARECUBE,INC\r
+AD3000-AD3FFF     (base 16)            WARECUBE,INC\r
+                               #A-811, 142-10, Saneop-ro, 156beon-gil, Gwonseon-gu\r
+                               Suwon-si    16648\r
+                               KR\r
+\r
+70-B3-D5   (hex)               myUpTech AB\r
+FC3000-FC3FFF     (base 16)            myUpTech AB\r
+                               Box 14\r
+                               Markaryd    28532\r
+                               SE\r
+\r
+70-B3-D5   (hex)               Scharco Elektronik GmbH\r
+C72000-C72FFF     (base 16)            Scharco Elektronik GmbH\r
+                               Tilsiter Strasse 8\r
+                               Wuppertal  NRW  42277\r
                                DE\r
 \r
 70-B3-D5   (hex)               MB connect line GmbH Fernwartungssysteme\r
@@ -18242,30 +18362,12 @@ E01000-E01FFF     (base 16)           EarTex
                                London  England  N1 6DR\r
                                GB\r
 \r
-70-B3-D5   (hex)               Scharco Elektronik GmbH\r
-C72000-C72FFF     (base 16)            Scharco Elektronik GmbH\r
-                               Tilsiter Strasse 8\r
-                               Wuppertal  NRW  42277\r
-                               DE\r
-\r
 70-B3-D5   (hex)               AVL DiTEST GmbH\r
 78D000-78DFFF     (base 16)            AVL DiTEST GmbH\r
                                Alte Poststrasse 156\r
                                Graz    8020\r
                                AT\r
 \r
-70-B3-D5   (hex)               WARECUBE,INC\r
-AD3000-AD3FFF     (base 16)            WARECUBE,INC\r
-                               #A-811, 142-10, Saneop-ro, 156beon-gil, Gwonseon-gu\r
-                               Suwon-si    16648\r
-                               KR\r
-\r
-70-B3-D5   (hex)               myUpTech AB\r
-FC3000-FC3FFF     (base 16)            myUpTech AB\r
-                               Box 14\r
-                               Markaryd    28532\r
-                               SE\r
-\r
 70-B3-D5   (hex)               TextSpeak Corporation\r
 F0E000-F0EFFF     (base 16)            TextSpeak Corporation\r
                                55 Greensfarm RD 2nd Flr 200-69\r
@@ -18278,18 +18380,18 @@ F0E000-F0EFFF     (base 16)           TextSpeak Corporation
                                Zola Predosa  Bologna  40069\r
                                IT\r
 \r
-70-B3-D5   (hex)               WAYNE ANALYTICS LLC\r
-301000-301FFF     (base 16)            WAYNE ANALYTICS LLC\r
-                               100 Rialto Place, Suite 721\r
-                               MELBOURNE  FL  32901\r
-                               US\r
-\r
 70-B3-D5   (hex)               HongSeok Ltd.\r
 30A000-30AFFF     (base 16)            HongSeok Ltd.\r
                                166, Osan-ro, Osan-myeon\r
                                Iksan-si  Jeollabuk-do  54670\r
                                KR\r
 \r
+70-B3-D5   (hex)               WAYNE ANALYTICS LLC\r
+301000-301FFF     (base 16)            WAYNE ANALYTICS LLC\r
+                               100 Rialto Place, Suite 721\r
+                               MELBOURNE  FL  32901\r
+                               US\r
+\r
 70-B3-D5   (hex)               GS Elektromedizinsiche Geräte G. Stemple GmbH\r
 3D3000-3D3FFF     (base 16)            GS Elektromedizinsiche Geräte G. Stemple GmbH\r
                                Hauswiesenstr. 26\r
@@ -18320,22 +18422,16 @@ E1C000-E1CFFF     (base 16)           RoomMate AS
                                Daejeon  Yuseong-gu  34016\r
                                KR\r
 \r
-70-B3-D5   (hex)               Sequent AG\r
-291000-291FFF     (base 16)            Sequent AG\r
-                               Eptingerstrasse 3\r
-                               Basel    4052\r
-                               CH\r
-\r
 70-B3-D5   (hex)               KODENSHI CORP.\r
 DBA000-DBAFFF     (base 16)            KODENSHI CORP.\r
                                161,Jyuichi,Makishima\r
                                UJI  KYOTO  6110041\r
                                JP\r
 \r
-70-B3-D5   (hex)               ID Quantique SA\r
-657000-657FFF     (base 16)            ID Quantique SA\r
-                               3 chemin de la marbrerie\r
-                               Carouge    1227\r
+70-B3-D5   (hex)               Sequent AG\r
+291000-291FFF     (base 16)            Sequent AG\r
+                               Eptingerstrasse 3\r
+                               Basel    4052\r
                                CH\r
 \r
 70-B3-D5   (hex)               Profusion Limited\r
@@ -18344,11 +18440,11 @@ DBA000-DBAFFF     (base 16)           KODENSHI CORP.
                                Southend on Sea  Essex  SS2 6UN\r
                                GB\r
 \r
-70-B3-D5   (hex)               CDS Institute of Management Strategy, Inc.\r
-3A3000-3A3FFF     (base 16)            CDS Institute of Management Strategy, Inc.\r
-                               Fukuyoshi-cho Billding 7F, Roppongi 2-2-6\r
-                               MINATO-KU  TOKYO  1060032\r
-                               JP\r
+70-B3-D5   (hex)               ID Quantique SA\r
+657000-657FFF     (base 16)            ID Quantique SA\r
+                               3 chemin de la marbrerie\r
+                               Carouge    1227\r
+                               CH\r
 \r
 70-B3-D5   (hex)               Cubitech\r
 B86000-B86FFF     (base 16)            Cubitech\r
@@ -18356,6 +18452,12 @@ B86000-B86FFF     (base 16)            Cubitech
                                Tavros  Athens  17778\r
                                GR\r
 \r
+70-B3-D5   (hex)               CDS Institute of Management Strategy, Inc.\r
+3A3000-3A3FFF     (base 16)            CDS Institute of Management Strategy, Inc.\r
+                               Fukuyoshi-cho Billding 7F, Roppongi 2-2-6\r
+                               MINATO-KU  TOKYO  1060032\r
+                               JP\r
+\r
 70-B3-D5   (hex)               BIT Group USA, Inc.\r
 C75000-C75FFF     (base 16)            BIT Group USA, Inc.\r
                                15870 Bernardo center drive \r
@@ -18392,6 +18494,12 @@ B6F000-B6FFFF     (base 16)            Integra Metering SAS
                                Ramsen    8262\r
                                CH\r
 \r
+70-B3-D5   (hex)               K&A Electronics Inc.\r
+9E4000-9E4FFF     (base 16)            K&A Electronics Inc.\r
+                               2609 Pinelawn dr.\r
+                               La Crescenta  CA  91214\r
+                               US\r
+\r
 70-B3-D5   (hex)               Paramount Bed Holdings Co., Ltd.\r
 8F1000-8F1FFF     (base 16)            Paramount Bed Holdings Co., Ltd.\r
                                2-14-5. Higashisuna\r
@@ -18410,12 +18518,6 @@ B6F000-B6FFFF     (base 16)            Integra Metering SAS
                                LONDON  County (optional)  N17 9LJ\r
                                GB\r
 \r
-70-B3-D5   (hex)               K&A Electronics Inc.\r
-9E4000-9E4FFF     (base 16)            K&A Electronics Inc.\r
-                               2609 Pinelawn dr.\r
-                               La Crescenta  CA  91214\r
-                               US\r
-\r
 70-B3-D5   (hex)               Indutherm Giesstechnologie GmbH\r
 8DE000-8DEFFF     (base 16)            Indutherm Giesstechnologie GmbH\r
                                Brettener Straße 32\r
@@ -18440,12 +18542,6 @@ D97000-D97FFF     (base 16)            BRS Sistemas Eletrônicos
                                Porto Alegre - RS  (Non U.S.)  91380-000\r
                                BR\r
 \r
-70-B3-D5   (hex)               Ideas srl\r
-B63000-B63FFF     (base 16)            Ideas srl\r
-                               Via dei Brughi, 21\r
-                               Gessate  Milan  20060\r
-                               IT\r
-\r
 70-B3-D5   (hex)               2M Technology\r
 F7D000-F7DFFF     (base 16)            2M Technology\r
                                802 Greenview Drive \r
@@ -18458,12 +18554,36 @@ F7D000-F7DFFF     (base 16)           2M Technology
                                Natick  MA  01760\r
                                US\r
 \r
+70-B3-D5   (hex)               Ideas srl\r
+B63000-B63FFF     (base 16)            Ideas srl\r
+                               Via dei Brughi, 21\r
+                               Gessate  Milan  20060\r
+                               IT\r
+\r
 70-B3-D5   (hex)               Invert Robotics Ltd.\r
 FC7000-FC7FFF     (base 16)            Invert Robotics Ltd.\r
                                Unit A, 235 Annex Road\r
                                Christchurch    8024\r
                                NZ\r
 \r
+70-B3-D5   (hex)               MPM Micro Präzision Marx GmbH\r
+F60000-F60FFF     (base 16)            MPM Micro Präzision Marx GmbH\r
+                               Neuenweiherstraße 19\r
+                               Erlangen  Deutschland  91056\r
+                               DE\r
+\r
+70-B3-D5   (hex)               DOLBY LABORATORIES, INC.\r
+73A000-73AFFF     (base 16)            DOLBY LABORATORIES, INC.\r
+                               100 Potrero Avenue\r
+                               San Francisco  CA  94103-4938\r
+                               US\r
+\r
+70-B3-D5   (hex)               Underground Systems, Inc.\r
+424000-424FFF     (base 16)            Underground Systems, Inc.\r
+                               3A Trowbridge Drive\r
+                               Bethel  CT  06801\r
+                               US\r
+\r
 70-B3-D5   (hex)               AERIAL CAMERA SYSTEMS Ltd\r
 FC4000-FC4FFF     (base 16)            AERIAL CAMERA SYSTEMS Ltd\r
                                3 The Merlin Centre, Lancaster Road,\r
@@ -18476,23 +18596,29 @@ FC4000-FC4FFF     (base 16)           AERIAL CAMERA SYSTEMS Ltd
                                ANKARA    06530\r
                                TR\r
 \r
-70-B3-D5   (hex)               Underground Systems, Inc.\r
-424000-424FFF     (base 16)            Underground Systems, Inc.\r
-                               3A Trowbridge Drive\r
-                               Bethel  CT  06801\r
-                               US\r
+70-B3-D5   (hex)               Shanghai Jupper Technology Co.Ltd\r
+157000-157FFF     (base 16)            Shanghai Jupper Technology Co.Ltd\r
+                               Room511,building D10, Lane 3188, Xiupu road, Pudong New District\r
+                               Shanghai    201315\r
+                               CN\r
 \r
-70-B3-D5   (hex)               MPM Micro Präzision Marx GmbH\r
-F60000-F60FFF     (base 16)            MPM Micro Präzision Marx GmbH\r
-                               Neuenweiherstraße 19\r
-                               Erlangen  Deutschland  91056\r
-                               DE\r
+70-B3-D5   (hex)               Kron Medidores\r
+C1E000-C1EFFF     (base 16)            Kron Medidores\r
+                               Rua Alexandre de Gusmão, 278\r
+                               São Paulo  São Paulo  04760-020\r
+                               BR\r
 \r
-70-B3-D5   (hex)               DOLBY LABORATORIES, INC.\r
-73A000-73AFFF     (base 16)            DOLBY LABORATORIES, INC.\r
-                               100 Potrero Avenue\r
-                               San Francisco  CA  94103-4938\r
-                               US\r
+70-B3-D5   (hex)               Yokogawa Denshikiki Co.,Ltd\r
+7F0000-7F0FFF     (base 16)            Yokogawa Denshikiki Co.,Ltd\r
+                               Minami Shinjuku Hoshino Bldg.  5-23-13 Sendagaya\r
+                               Shibuya-ku  Tokyo  151-0051\r
+                               JP\r
+\r
+70-B3-D5   (hex)               IK MULTIMEDIA PRODUCTION SRL\r
+2FB000-2FBFFF     (base 16)            IK MULTIMEDIA PRODUCTION SRL\r
+                               Via dell'Industria 46\r
+                               Modena  Italy  41122\r
+                               IT\r
 \r
 70-B3-D5   (hex)               Hensoldt Sensors GmbH\r
 2D3000-2D3FFF     (base 16)            Hensoldt Sensors GmbH\r
@@ -18500,47 +18626,65 @@ F60000-F60FFF     (base 16)           MPM Micro Präzision Marx GmbH
                                Ulm  Baden-Wuerttemberg  89081\r
                                DE\r
 \r
-70-B3-D5   (hex)               Kron Medidores\r
-C1E000-C1EFFF     (base 16)            Kron Medidores\r
-                               Rua Alexandre de Gusmão, 278\r
-                               São Paulo  São Paulo  04760-020\r
-                               BR\r
+70-B3-D5   (hex)               Autonomic Controls, Inc.\r
+BC7000-BC7FFF     (base 16)            Autonomic Controls, Inc.\r
+                               28 Kaysal Ct\r
+                               ARMONK  NY  10504\r
+                               US\r
 \r
-70-B3-D5   (hex)               Shanghai Jupper Technology Co.Ltd\r
-157000-157FFF     (base 16)            Shanghai Jupper Technology Co.Ltd\r
-                               Room511,building D10, Lane 3188, Xiupu road, Pudong New District\r
-                               Shanghai    201315\r
+70-B3-D5   (hex)               CYG CONTRON CO.LTD\r
+A8C000-A8CFFF     (base 16)            CYG CONTRON CO.LTD\r
+                               BUILDING A.NO.11 OF THE 6TH TECHNOGY ROAD,PHASE III OF TECNOLOGY INNOVATION COAST,ZHUHAI NATIONAL HI-TECH INDUSTRIES DEVELOPMENT ZONE\r
+                               Zhuhai    519000\r
                                CN\r
 \r
-70-B3-D5   (hex)               S-Rain Control A/S\r
-B68000-B68FFF     (base 16)            S-Rain Control A/S\r
-                               Oldenvej 6\r
-                               Kvistgård  Copenhagen  DK-3490\r
-                               DK\r
-\r
 70-B3-D5   (hex)               Thermo Fisher Scientific Inc.\r
 D96000-D96FFF     (base 16)            Thermo Fisher Scientific Inc.\r
                                Thermo Fisher Scientific Inc.\r
                                Shanghai  Shanghai  201206\r
                                CN\r
 \r
-70-B3-D5   (hex)               Autonomic Controls, Inc.\r
-BC7000-BC7FFF     (base 16)            Autonomic Controls, Inc.\r
-                               28 Kaysal Ct\r
-                               ARMONK  NY  10504\r
+70-B3-D5   (hex)               S-Rain Control A/S\r
+B68000-B68FFF     (base 16)            S-Rain Control A/S\r
+                               Oldenvej 6\r
+                               Kvistgård  Copenhagen  DK-3490\r
+                               DK\r
+\r
+70-B3-D5   (hex)               LIGPT\r
+D14000-D14FFF     (base 16)            LIGPT\r
+                               167, Jukdong-ro\r
+                               Daejeon   Yuseong-gu  34127\r
+                               KR\r
+\r
+70-B3-D5   (hex)               Royal Engineering Consultancy Private Limited\r
+34F000-34FFFF     (base 16)            Royal Engineering Consultancy Private Limited\r
+                               203 2nd Floor Jyoti Building 66 Nehru Place\r
+                               New Delhi    110019\r
+                               IN\r
+\r
+70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
+A1B000-A1BFFF     (base 16)            Potter Electric Signal Co. LLC\r
+                               5757 Phantom Drive, Suite 125\r
+                               Hazelwood  MO  63042\r
                                US\r
 \r
-70-B3-D5   (hex)               Yokogawa Denshikiki Co.,Ltd\r
-7F0000-7F0FFF     (base 16)            Yokogawa Denshikiki Co.,Ltd\r
-                               Minami Shinjuku Hoshino Bldg.  5-23-13 Sendagaya\r
-                               Shibuya-ku  Tokyo  151-0051\r
-                               JP\r
+70-B3-D5   (hex)               Melissa Climate Jsc\r
+2DD000-2DDFFF     (base 16)            Melissa Climate Jsc\r
+                               Gen. Gurko 4 Street\r
+                               Sofia    1000\r
+                               BG\r
 \r
-70-B3-D5   (hex)               IK MULTIMEDIA PRODUCTION SRL\r
-2FB000-2FBFFF     (base 16)            IK MULTIMEDIA PRODUCTION SRL\r
-                               Via dell'Industria 46\r
-                               Modena  Italy  41122\r
-                               IT\r
+70-B3-D5   (hex)               Innoknight\r
+AE8000-AE8FFF     (base 16)            Innoknight\r
+                               Rm. 1A2-A01, No. 1, Lixing 1st Rd., East Dist., Hsinchu City 300, Taiwan (R.O.C.)\r
+                               Hsinchu    300\r
+                               TW\r
+\r
+70-B3-D5   (hex)               Projects Unlimited Inc.\r
+7C5000-7C5FFF     (base 16)            Projects Unlimited Inc.\r
+                               6300 Sand Lake Road\r
+                               Dayton  OH  45414\r
+                               US\r
 \r
 70-B3-D5   (hex)               DISMUNTEL SAL\r
 92C000-92CFFF     (base 16)            DISMUNTEL SAL\r
@@ -18626,12 +18770,6 @@ D31000-D31FFF     (base 16)            Solace Systems Inc.
                                Horseheads  NY  14845\r
                                US\r
 \r
-70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
-832000-832FFF     (base 16)            Potter Electric Signal Co. LLC\r
-                               1609 Park 370 Place\r
-                               Hazelwood  MO  63042\r
-                               US\r
-\r
 70-B3-D5   (hex)               Mutelcor GmbH\r
 170000-170FFF     (base 16)            Mutelcor GmbH\r
                                An der Bastei, 42A\r
@@ -20756,12 +20894,6 @@ C80000-C80FFF     (base 16)            Link Care Services
                                MAIRANO  BRESCIA  25030\r
                                IT\r
 \r
-70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
-7A4000-7A4FFF     (base 16)            Potter Electric Signal Co. LLC\r
-                               1609 Park 370 Place\r
-                               Hazelwood    63042\r
-                               US\r
-\r
 70-B3-D5   (hex)               Arete Associates\r
 238000-238FFF     (base 16)            Arete Associates\r
                                9301 Corbin Ave Suite 2000\r
@@ -22022,12 +22154,6 @@ ECE000-ECEFFF     (base 16)            COMM-connect A/S
                                Tachikawa-Shi  Tokyo  190-0011\r
                                JP\r
 \r
-70-B3-D5   (hex)               KMtronic Ltd.\r
-6D6000-6D6FFF     (base 16)            KMtronic Ltd.\r
-                               Dobri Czintulov 28A str.\r
-                               Gorna Oryahovica  VT  5100\r
-                               BG\r
-\r
 70-B3-D5   (hex)               EIWA GIKEN INC.\r
 BA4000-BA4FFF     (base 16)            EIWA GIKEN INC.\r
                                5-708 FUSHIYA NAKAGAWA-KU\r
@@ -22808,12 +22934,6 @@ E2A000-E2AFFF     (base 16)            CONTES, spol. s r.o.
                                Eagan  MN  55121\r
                                US\r
 \r
-70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
-F5D000-F5DFFF     (base 16)            Potter Electric Signal Co. LLC\r
-                               1609 Park 370 Place\r
-                               Hazelwood  MO  63042\r
-                               US\r
-\r
 70-B3-D5   (hex)               Viotec USA\r
 899000-899FFF     (base 16)            Viotec USA\r
                                3 East Third Ave\r
@@ -22868,23 +22988,17 @@ A6A000-A6AFFF     (base 16)           Privafy, Inc
                                Oslo  Oslo  0504\r
                                NO\r
 \r
-70-B3-D5   (hex)               RCH Vietnam Limited Liability Company\r
-6BD000-6BDFFF     (base 16)            RCH Vietnam Limited Liability Company\r
-                               Workshop F.01B-2, Lot No. F.01B Long Hau\r
-                               Ho Chi Minh City  Ho Chi Minh  70000\r
-                               VN\r
-\r
 70-B3-D5   (hex)               Gamber Johnson-LLC\r
 E34000-E34FFF     (base 16)            Gamber Johnson-LLC\r
                                3001 Borham Ave\r
                                Stevens Point  WI  54481\r
                                US\r
 \r
-70-B3-D5   (hex)               YUYAMA MFG Co.,Ltd\r
-C2B000-C2BFFF     (base 16)            YUYAMA MFG Co.,Ltd\r
-                               3-3-1\r
-                               TOYONAKASHI  OSAKA  561-0841\r
-                               JP\r
+70-B3-D5   (hex)               RCH Vietnam Limited Liability Company\r
+6BD000-6BDFFF     (base 16)            RCH Vietnam Limited Liability Company\r
+                               Workshop F.01B-2, Lot No. F.01B Long Hau\r
+                               Ho Chi Minh City  Ho Chi Minh  70000\r
+                               VN\r
 \r
 70-B3-D5   (hex)               YUYAMA MFG Co.,Ltd\r
 1F2000-1F2FFF     (base 16)            YUYAMA MFG Co.,Ltd\r
@@ -22898,71 +23012,77 @@ C2B000-C2BFFF     (base 16)           YUYAMA MFG Co.,Ltd
                                Moscow    105484\r
                                RU\r
 \r
+70-B3-D5   (hex)               YUYAMA MFG Co.,Ltd\r
+C2B000-C2BFFF     (base 16)            YUYAMA MFG Co.,Ltd\r
+                               3-3-1\r
+                               TOYONAKASHI  OSAKA  561-0841\r
+                               JP\r
+\r
 70-B3-D5   (hex)               eSMART Technologies SA\r
 979000-979FFF     (base 16)            eSMART Technologies SA\r
                                Chemin de la Rueyre, 118\r
                                Renens VD    1020\r
                                CH\r
 \r
-70-B3-D5   (hex)               Axnes AS\r
-65F000-65FFFF     (base 16)            Axnes AS\r
-                               Terje Løvåsvei 1\r
-                               Grimstad    4879\r
-                               NO\r
-\r
 70-B3-D5   (hex)               Duplomatic MS spa\r
 DE1000-DE1FFF     (base 16)            Duplomatic MS spa\r
                                Via Re Depaolini 24\r
                                Parabiago  Milan  20015\r
                                IT\r
 \r
+70-B3-D5   (hex)               Axnes AS\r
+65F000-65FFFF     (base 16)            Axnes AS\r
+                               Terje Løvåsvei 1\r
+                               Grimstad    4879\r
+                               NO\r
+\r
 70-B3-D5   (hex)               Nanjing Pingguang Electronic Technology Co., Ltd\r
 541000-541FFF     (base 16)            Nanjing Pingguang Electronic Technology Co., Ltd\r
                                B30/B31 4th Floor, Building#11, Shengtai Road, JiangNing District\r
                                NanJing    211100\r
                                CN\r
 \r
-70-B3-D5   (hex)               PHYZHON Health Inc\r
-744000-744FFF     (base 16)            PHYZHON Health Inc\r
-                               180 Blue Ravine Road, suite A\r
-                               Folsom  CA  95630\r
-                               US\r
-\r
 70-B3-D5   (hex)               thingdust AG\r
 3C1000-3C1FFF     (base 16)            thingdust AG\r
                                Moosstrasse 7\r
                                Lucerne  Lucerne  6003\r
                                CH\r
 \r
-70-B3-D5   (hex)               Panoramic Power\r
-53A000-53AFFF     (base 16)            Panoramic Power\r
-                               15 Atir Yeda\r
-                               Kfar Saba    4464312\r
-                               IL\r
-\r
 70-B3-D5   (hex)               ALVAT s.r.o.\r
 369000-369FFF     (base 16)            ALVAT s.r.o.\r
                                Chodovska 228/3\r
                                Praha 4    14100\r
                                CZ\r
 \r
+70-B3-D5   (hex)               PHYZHON Health Inc\r
+744000-744FFF     (base 16)            PHYZHON Health Inc\r
+                               180 Blue Ravine Road, suite A\r
+                               Folsom  CA  95630\r
+                               US\r
+\r
 70-B3-D5   (hex)               PCB Piezotronics\r
 4CA000-4CAFFF     (base 16)            PCB Piezotronics\r
                                3425 Walden Avenue\r
                                Depew  NY  14043\r
                                US\r
 \r
+70-B3-D5   (hex)               Panoramic Power\r
+53A000-53AFFF     (base 16)            Panoramic Power\r
+                               15 Atir Yeda\r
+                               Kfar Saba    4464312\r
+                               IL\r
+\r
 70-B3-D5   (hex)               STEP sarl\r
 481000-481FFF     (base 16)            STEP sarl\r
                                11, avenue Aristide Berges\r
                                LANCEY  ISERE  38190\r
                                FR\r
 \r
-70-B3-D5   (hex)               Mianjie Technology\r
-8FC000-8FCFFF     (base 16)            Mianjie Technology\r
-                               Zhubang2000 Building2 1205\r
-                               Beijing    100000\r
-                               CN\r
+70-B3-D5   (hex)               ZPAS S.A.\r
+2D9000-2D9FFF     (base 16)            ZPAS S.A.\r
+                               Przygorze 209\r
+                               Woliborz  Lower Silesian (Dolno?l?skie)  57-431\r
+                               PL\r
 \r
 70-B3-D5   (hex)               Redstone Sunshine(Beijing)Technology Co.,Ltd.\r
 6C9000-6C9FFF     (base 16)            Redstone Sunshine(Beijing)Technology Co.,Ltd.\r
@@ -22970,11 +23090,11 @@ DE1000-DE1FFF     (base 16)           Duplomatic MS spa
                                Beijing    100020\r
                                CN\r
 \r
-70-B3-D5   (hex)               ZPAS S.A.\r
-2D9000-2D9FFF     (base 16)            ZPAS S.A.\r
-                               Przygorze 209\r
-                               Woliborz  Lower Silesian (Dolno?l?skie)  57-431\r
-                               PL\r
+70-B3-D5   (hex)               Mianjie Technology\r
+8FC000-8FCFFF     (base 16)            Mianjie Technology\r
+                               Zhubang2000 Building2 1205\r
+                               Beijing    100000\r
+                               CN\r
 \r
 70-B3-D5   (hex)               HAI ROBOTICS Co., Ltd.\r
 0B7000-0B7FFF     (base 16)            HAI ROBOTICS Co., Ltd.\r
@@ -23000,18 +23120,18 @@ DE1000-DE1FFF     (base 16)           Duplomatic MS spa
                                Santa Ana  CA  92705\r
                                US\r
 \r
-70-B3-D5   (hex)               Beijing Aumiwalker technology CO.,LTD\r
-C7C000-C7CFFF     (base 16)            Beijing Aumiwalker technology CO.,LTD\r
-                               Floor 6, Tower 1, No.1 Zhonghe Road Fengtai Science Park Beijing P.R.C.\r
-                               Beijing  Beijing  100071\r
-                               CN\r
-\r
 70-B3-D5   (hex)               Peter Huber Kaeltemaschinenbau AG\r
 DC4000-DC4FFF     (base 16)            Peter Huber Kaeltemaschinenbau AG\r
                                Werner-von-Siemens-Str. 1\r
                                Offenburg  Ba-Wue  77656\r
                                DE\r
 \r
+70-B3-D5   (hex)               Beijing Aumiwalker technology CO.,LTD\r
+C7C000-C7CFFF     (base 16)            Beijing Aumiwalker technology CO.,LTD\r
+                               Floor 6, Tower 1, No.1 Zhonghe Road Fengtai Science Park Beijing P.R.C.\r
+                               Beijing  Beijing  100071\r
+                               CN\r
+\r
 70-B3-D5   (hex)               Kazdream Technologies LLP\r
 089000-089FFF     (base 16)            Kazdream Technologies LLP\r
                                10, Turkestan Str.\r
@@ -23024,12 +23144,6 @@ E5A000-E5AFFF     (base 16)            Cardinal Scales Manufacturing Co
                                Webb City  MO  64870\r
                                US\r
 \r
-70-B3-D5   (hex)               Military Research Institute\r
-2F7000-2F7FFF     (base 16)            Military Research Institute\r
-                               Veslarska 230\r
-                               Brno    63700\r
-                               CZ\r
-\r
 70-B3-D5   (hex)               Farmpro Ltd\r
 17C000-17CFFF     (base 16)            Farmpro Ltd\r
                                806, 28 Digitalro 30gil, Gurogu\r
@@ -23042,6 +23156,12 @@ E83000-E83FFF     (base 16)            Talleres de Escoriaza SA
                                Irun  Gipuzkoa  20305\r
                                ES\r
 \r
+70-B3-D5   (hex)               Military Research Institute\r
+2F7000-2F7FFF     (base 16)            Military Research Institute\r
+                               Veslarska 230\r
+                               Brno    63700\r
+                               CZ\r
+\r
 70-B3-D5   (hex)               Network Innovations\r
 DA7000-DA7FFF     (base 16)            Network Innovations\r
                                4950 West Prospect Road\r
@@ -23054,18 +23174,6 @@ DA7000-DA7FFF     (base 16)            Network Innovations
                                Champagne au Mont d'Or  Rhône  69543\r
                                FR\r
 \r
-70-B3-D5   (hex)               Grossenbacher Systeme AG\r
-5FE000-5FEFFF     (base 16)            Grossenbacher Systeme AG\r
-                               Spinnereistrasse 10\r
-                               St. Gallen    9008\r
-                               CH\r
-\r
-70-B3-D5   (hex)               QUISS GmbH\r
-AAB000-AABFFF     (base 16)            QUISS GmbH\r
-                               Lilienthalstraße 5\r
-                               Puchheim    82178\r
-                               DE\r
-\r
 70-B3-D5   (hex)               Shanghai Qinyue Communication Technology Co., Ltd.\r
 B57000-B57FFF     (base 16)            Shanghai Qinyue Communication Technology Co., Ltd.\r
                                Room 101,Building 51,Lane 588,ShuPing Road,Jiading District\r
@@ -23078,18 +23186,24 @@ B57000-B57FFF     (base 16)           Shanghai Qinyue Communication Technology Co., Ltd.
                                Oslo  Select One  1405\r
                                NO\r
 \r
+70-B3-D5   (hex)               QUISS GmbH\r
+AAB000-AABFFF     (base 16)            QUISS GmbH\r
+                               Lilienthalstraße 5\r
+                               Puchheim    82178\r
+                               DE\r
+\r
+70-B3-D5   (hex)               Grossenbacher Systeme AG\r
+5FE000-5FEFFF     (base 16)            Grossenbacher Systeme AG\r
+                               Spinnereistrasse 10\r
+                               St. Gallen    9008\r
+                               CH\r
+\r
 70-B3-D5   (hex)               Accolade Technology Inc\r
 87A000-87AFFF     (base 16)            Accolade Technology Inc\r
                                124 Grove Street, Suite 315\r
                                FRANKLIN  MA  02038\r
                                US\r
 \r
-70-B3-D5   (hex)               Loehnert Elektronik GmbH\r
-8A3000-8A3FFF     (base 16)            Loehnert Elektronik GmbH\r
-                               Oskar-Sembach-Ring 18\r
-                               Lauf a.d.Peg.  Bavaria  91207\r
-                               DE\r
-\r
 70-B3-D5   (hex)               Adcole Space\r
 922000-922FFF     (base 16)            Adcole Space\r
                                734 Forest St.,Suite #100\r
@@ -23108,11 +23222,17 @@ B57000-B57FFF     (base 16)           Shanghai Qinyue Communication Technology Co., Ltd.
                                Dinkelsbuehl  Bavaria  91550\r
                                DE\r
 \r
-70-B3-D5   (hex)               Tobi Tribe Inc\r
-D68000-D68FFF     (base 16)            Tobi Tribe Inc\r
-                               13263 MIDDLETON FARM LN,\r
-                               HERNDON,  VA  20171\r
-                               US\r
+70-B3-D5   (hex)               Loehnert Elektronik GmbH\r
+8A3000-8A3FFF     (base 16)            Loehnert Elektronik GmbH\r
+                               Oskar-Sembach-Ring 18\r
+                               Lauf a.d.Peg.  Bavaria  91207\r
+                               DE\r
+\r
+70-B3-D5   (hex)               plc-tec AG\r
+095000-095FFF     (base 16)            plc-tec AG\r
+                               Panoramastrasse 5\r
+                               Hägglingen    5607\r
+                               CH\r
 \r
 70-B3-D5   (hex)               Edge Power Solutions\r
 612000-612FFF     (base 16)            Edge Power Solutions\r
@@ -23120,11 +23240,11 @@ D68000-D68FFF     (base 16)           Tobi Tribe Inc
                                Melbourne  FL  32940\r
                                US\r
 \r
-70-B3-D5   (hex)               Eurotempest AB\r
-E37000-E37FFF     (base 16)            Eurotempest AB\r
-                               Algolgatan 10\r
-                               Linköping  Other  58335\r
-                               SE\r
+70-B3-D5   (hex)               Tobi Tribe Inc\r
+D68000-D68FFF     (base 16)            Tobi Tribe Inc\r
+                               13263 MIDDLETON FARM LN,\r
+                               HERNDON,  VA  20171\r
+                               US\r
 \r
 70-B3-D5   (hex)               Antek Technology \r
 9E5000-9E5FFF     (base 16)            Antek Technology \r
@@ -23132,17 +23252,11 @@ E37000-E37FFF     (base 16)           Eurotempest AB
                                Taipei    100\r
                                TW\r
 \r
-70-B3-D5   (hex)               plc-tec AG\r
-095000-095FFF     (base 16)            plc-tec AG\r
-                               Panoramastrasse 5\r
-                               Hägglingen    5607\r
-                               CH\r
-\r
-70-B3-D5   (hex)               Weihai Weigao Medical Imaging Technology Co., Ltd\r
-534000-534FFF     (base 16)            Weihai Weigao Medical Imaging Technology Co., Ltd\r
-                               No. 566-1, Qishan Road, Lingang Economic and Technological Development Zone\r
-                               Weihai  Shandong  264210\r
-                               CN\r
+70-B3-D5   (hex)               Eurotempest AB\r
+E37000-E37FFF     (base 16)            Eurotempest AB\r
+                               Algolgatan 10\r
+                               Linköping  Other  58335\r
+                               SE\r
 \r
 70-B3-D5   (hex)               ARECA EMBEDDED SYSTEMS PVT LTD\r
 F15000-F15FFF     (base 16)            ARECA EMBEDDED SYSTEMS PVT LTD\r
@@ -23162,8 +23276,62 @@ F59000-F59FFF     (base 16)            KOREA SPECTRAL PRODUCTS
                                Incheon    21999\r
                                KR\r
 \r
+70-B3-D5   (hex)               Weihai Weigao Medical Imaging Technology Co., Ltd\r
+534000-534FFF     (base 16)            Weihai Weigao Medical Imaging Technology Co., Ltd\r
+                               No. 566-1, Qishan Road, Lingang Economic and Technological Development Zone\r
+                               Weihai  Shandong  264210\r
+                               CN\r
+\r
 70-B3-D5   (hex)               LiveCopper Inc.\r
 9E9000-9E9FFF     (base 16)            LiveCopper Inc.\r
                                600 Greer Rd\r
                                Palo Alto  CA  94303\r
                                US\r
+\r
+70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
+7A4000-7A4FFF     (base 16)            Potter Electric Signal Co. LLC\r
+                               5757 Phantom Drive, Suite 125\r
+                               Hazelwood  MO  63042\r
+                               US\r
+\r
+70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
+832000-832FFF     (base 16)            Potter Electric Signal Co. LLC\r
+                               5757 Phantom Drive, Suite 125\r
+                               Hazelwood  MO  63042\r
+                               US\r
+\r
+70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
+F5D000-F5DFFF     (base 16)            Potter Electric Signal Co. LLC\r
+                               5757 Phantom Drive, Suite 125\r
+                               Hazelwood  MO  63042\r
+                               US\r
+\r
+70-B3-D5   (hex)               KMtronic ltd\r
+6D6000-6D6FFF     (base 16)            KMtronic ltd\r
+                               Dobri Czintulov 28A str.\r
+                               Gorna Oryahovica  VT  5100\r
+                               BG\r
+\r
+70-B3-D5   (hex)               CANON ELECTRON TUBES & DEVICES CO., LTD.\r
+44A000-44AFFF     (base 16)            CANON ELECTRON TUBES & DEVICES CO., LTD.\r
+                               1385, Shimoishigami\r
+                               Otawara-shi  Tochigi  324-8550\r
+                               JP\r
+\r
+70-B3-D5   (hex)               SANMINA ISRAEL MEDICAL SYSTEMS LTD\r
+64D000-64DFFF     (base 16)            SANMINA ISRAEL MEDICAL SYSTEMS LTD\r
+                               Koren industrial zone no 5\r
+                               Mallot  Israel  2101002\r
+                               IL\r
+\r
+70-B3-D5   (hex)               Orlaco Products B.V.\r
+4F5000-4F5FFF     (base 16)            Orlaco Products B.V.\r
+                               Albert Plesmanstraat 42\r
+                               Barneveld    3772MN\r
+                               NL\r
+\r
+70-B3-D5   (hex)               Shenzhen Lianfaxun Electronic Technology Co., Ltd\r
+5C0000-5C0FFF     (base 16)            Shenzhen Lianfaxun Electronic Technology Co., Ltd\r
+                               No. 25, Tianrong road, Tianliao second industrial park, Yutang street, Guangming new district\r
+                               Shenzhen  Guangdong   518132\r
+                               CN\r
index c51a6cfabbb6e86a484ffd33c4d484c3a70246c8..c9e82ed908a228986899821cff9916072ea49bcf 100644 (file)
@@ -1,8 +1,8 @@
 #
 #      List of PCI ID's
 #
-#      Version: 2020.06.24
-#      Date:    2020-06-24 03:15:01
+#      Version: 2020.07.21
+#      Date:    2020-07-21 03:15:02
 #
 #      Maintained by Albert Pool, Martin Mares, and other volunteers from
 #      the PCI ID Project at https://pci-ids.ucw.cz/.
@@ -42,6 +42,8 @@
        7a0b  SPI Controller
        7a0c  LPC Controller
        7a0f  DMA (Direct Memory Access) Controller
+# Found on some boards with two sockets
+       7a10  Hyper Transport Bridge Controller
        7a14  EHCI USB Controller
        7a15  Vivante GPU (Graphics Processing Unit)
        7a19  PCI-to-PCI Bridge
        0013  53c875a
                1000 1000  LSI53C875A PCI to Ultra SCSI Controller
        0014  MegaRAID Tri-Mode SAS3516
+               1000 9460  MegaRAID 9460-16i
+               1000 9480  MegaRAID 9480-8i8e
+               1000 9481  MegaRAID 9480-8e
                1028 1f3a  PERC H745 Adapter
                1028 1f3b  PERC H745 Front
                1028 1fd4  PERC H745P MX
                8086 9460  RAID Controller RSP3TD160F
                8086 9480  RAID Controller RSP3MD088F
        0015  MegaRAID Tri-Mode SAS3416
+               1000 9441  MegaRAID 9440-16i
                1028 1f3c  PERC H345 Adapter
                1028 1f3d  PERC H345 Front
                1d49 0503  ThinkSystem RAID 530-16i PCIe 12Gb Adapter
        0016  MegaRAID Tri-Mode SAS3508
+               1000 9461  MegaRAID 9460-8i
+               1000 9462  MegaRAID 9460-4i
+               1000 9463  MegaRAID 9365-28i
+               1000 9464  MegaRAID 9365-24i
                1028 1fc9  PERC H840 Adapter
                1028 1fcb  PERC H740P Adapter
                1028 1fcd  PERC H740P Mini
                8086 352f  Integrated RAID Module RMSP3HD080E
                8086 9461  RAID Controller RSP3DD080F
        0017  MegaRAID Tri-Mode SAS3408
+               1000 9440  MegaRAID 9440-8i
+               1000 9442  MegaRAID 9440-4i
                1d49 0500  ThinkSystem RAID 530-8i PCIe 12Gb Adapter
                1d49 0502  ThinkSystem RAID 530-8i Dense Adapter
                8086 3528  Integrated RAID RMSP3LD060
        00c2  SAS3324 PCI-Express Fusion-MPT SAS-3
        00c3  SAS3324 PCI-Express Fusion-MPT SAS-3
        00c4  SAS3224 PCI-Express Fusion-MPT SAS-3
+               1170 0002  SAS3224 PCI Express to 12Gb HBA MEZZ CARD
        00c5  SAS3316 PCI-Express Fusion-MPT SAS-3
        00c6  SAS3316 PCI-Express Fusion-MPT SAS-3
        00c7  SAS3316 PCI-Express Fusion-MPT SAS-3
                1d49 0205  ThinkSystem 440-16i SAS/SATA PCIe Gen4 12Gb Internal HBA
                1d49 0206  ThinkSystem 440-16e SAS/SATA PCIe Gen4 12Gb HBA
        00e6  Fusion-MPT 12GSAS/PCIe Secure SAS38xx
+               1000 4050  9500-16i Tri-Mode HBA
+               1000 4060  9500-8i Tri-Mode HBA
+               1000 4070  9500-16e Tri-Mode HBA
+               1000 4080  9500-8e Tri-Mode HBA
                1028 200b  HBA355i Adapter
                1028 200c  HBA355i Front
                1028 200d  HBA355e Adapter
                103c 0b0c  Bonaire [FirePro W4300]
                103c 230c  FirePro W5100
                13cc 3d2a  MXRT-5600
+       664d  Bonaire [FirePro W5100 / Barco MXRT-5600]
        6650  Bonaire
        6651  Bonaire
        6658  Bonaire XTX [Radeon R7 260X/360]
                1462 3413  Radeon RX 480 Gaming X 8GB
                1462 3416  Radeon RX 570
                1462 3418  Radeon RX 580 Armor 4G OC
+               1462 341b  Radeon RX 570 Armor 8G OC
                1462 341e  Radeon RX 570 Armor 4G OC
                1462 8a92  Radeon RX 580
                148c 2372  Radeon RX 480 [Red Dragon]
                148c 2373  Radeon RX 470
+               148c 2377  Red Devil RX 580 8G Golden
+# https://www.techpowerup.com/vgabios/?manufacturer=Powercolor&model=RX+580
+               148c 2378  Radeon RX 580
+               148c 2379  Radeon RX 570 4G [Red Dragon]
                1682 9470  Radeon RX 470
                1682 9480  Radeon RX 480
                1682 9588  Radeon RX 580 XTR
                1849 5030  Phantom Gaming D Radeon RX580 8G OC
                1da2 e353  Radeon RX 570 Pulse 4GB
                1da2 e366  Nitro+ Radeon RX 570/580/590
+               1da2 e387  Radeon RX 570 Pulse 4GB
        67e0  Baffin [Radeon Pro WX 4170]
                103c 8270  Radeon Pro WX 4170
                103c 8272  Radeon Pro WX 4170
        71c1  RV535 [Radeon X1650 PRO]
                174b 0880  Radeon X1700 FSC
        71c2  RV530 [Radeon X1600 PRO]
+       71c3  RV530 [Radeon X1600 PRO]
        71c4  RV530/M56 GL [Mobility FireGL V5200]
                17aa 2007  ThinkPad T60p
        71c5  RV530/M56-P [Mobility Radeon X1600]
        7310  Navi 10 [Radeon Pro W5700X]
        7312  Navi 10 [Radeon Pro W5700]
        731f  Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT]
+               1458 2313  Radeon RX 5700 XT Gaming OC
                1da2 e411  Radeon RX 5600 XT
        7340  Navi 14 [Radeon RX 5500/5500M / Pro 5500M]
        7341  Navi 14 [Radeon Pro W5500]
        06eb  G98M [Quadro NVS 160M]
        06ec  G98M [GeForce G 105M]
        06ed  G98 [GeForce 9600 GT / 9800 GT]
-       06ee  G98 [GeForce 9600 GT / 9800 GT]
+       06ee  G98 [GeForce 9600 GT / 9800 GT / GT 240]
        06ef  G98M [GeForce G 103M]
        06f1  G98M [GeForce G 105M]
        06f8  G98 [Quadro NVS 420]
        1ed0  TU104BM [GeForce RTX 2080 Mobile]
        1ed1  TU104BM [GeForce RTX 2070 SUPER Mobile / Max-Q]
        1ed3  TU104BM [GeForce RTX 2080 SUPER Mobile / Max-Q]
+       1ef5  TU104GLM [Quadro RTX 5000 Mobile Refresh]
        1f02  TU106 [GeForce RTX 2070]
                1043 8673  TURBO RTX 2070
        1f04  TU106
        1f94  TU117M [GeForce GTX 1650 Mobile]
        1f95  TU117M [GeForce GTX 1650 Ti Mobile]
        1f96  TU117M [GeForce GTX 1650 Mobile / Max-Q]
+       1f97  TU117M [GeForce MX450]
        1f99  TU117M
        1fae  TU117GL
        1fb8  TU117GLM [Quadro T2000 Mobile / Max-Q]
        1fb9  TU117GLM [Quadro T1000 Mobile]
        1fbf  TU117GL
-       20b0  GA100 [GRID A100X]
+       1fd9  TU117BM [GeForce GTX 1650 Mobile Refresh]
+       1ff9  TU117GLM [Quadro T1000 Mobile]
+       20b0  GA100 [A100 SXM4 40GB]
        20be  GA100 [GRID A100A]
        20bf  GA100 [GRID A100B]
-       20f1  GA100 [GRID A100 PCIe 40GB]
+       20f1  GA100 [A100 PCIe 40GB]
        2182  TU116 [GeForce GTX 1660 Ti]
        2183  TU116
        2184  TU116 [GeForce GTX 1660]
        3fc4  RME Digi9652 (Hammerfall)
        3fc5  RME Hammerfall DSP
        3fc6  RME Hammerfall DSP MADI
+       5005  Alveo U250
        7038  FPGA Card XC7VX690T
                17aa 402f  FPGA XC7VX690T-3FFG1157E
        8380  Ellips ProfiXpress Profibus Master
        43a1  BCM4360 802.11ac Wireless Network Adapter
        43a2  BCM4360 802.11ac Wireless Network Adapter
        43a3  BCM4350 802.11ac Wireless Network Adapter
+# Manufactured by Foxconn for Lenovo
+               17aa 075a  00JT494
        43a9  BCM43217 802.11b/g/n
        43aa  BCM43131 802.11b/g/n
        43ae  BCM43162 802.11ac Wireless Network Adapter
        0250  Spectrum-3, Flash recovery mode
        0251  Spectrum-3, Secure Flash recovery mode
        0252  Amos chiplet
+       0253  Amos GearBox Manager
        0254  Spectrum-4, Flash recovery mode
        0255  Spectrum-4, Secure Flash recovery mode
        0256  Ofek chiplet
        1016  MT27710 Family [ConnectX-4 Lx Virtual Function]
        1017  MT27800 Family [ConnectX-5]
                15b3 0006  ConnectX®-5 EN network interface card, 100GbE single-port QSFP28, PCIe3.0 x16, tall bracket; MCX515A-CCAT
+               15b3 0007  Mellanox ConnectX®-5 MCX516A-CCAT
                15b3 0020  ConnectX®-5 EN network interface card, 10/25GbE dual-port SFP28, PCIe3.0 x8, tall bracket ; MCX512A-ACAT
                15b3 0068  ConnectX®-5 EN network interface card for OCP2.0, Type 1, with host management, 25GbE dual-port SFP28, PCIe3.0 x8, no bracket Halogen free ; MCX542B-ACAN
+               15b3 0125  Tencent ConnectX-5 EN Ex network interface card for OCP 3.0, with host management, 50GbE Dual-port QSFP28, PCIe4.0 x16, Thumbscrew (pull-tab) bracket
        1018  MT27800 Family [ConnectX-5 Virtual Function]
        1019  MT28800 Family [ConnectX-5 Ex]
                15b3 0008  ConnectX-5 Ex EN network interface card, 100GbE dual-port QSFP28, PCIe4.0 x16, tall bracket; MCX516A-CDAT
 167e  ONNTO Corp.
 1681  Hercules
 1682  XFX Pine Group Inc.
+       5701  Radeon 5700 XT Thicc III Ultra
        c580  Radeon RX 580
 1688  CastleNet Technology Inc.
        1170  WLAN 802.11b card
 168a  Utimaco IS GmbH
+       2086  CryptoServer Se-Series Hardware Security Module
+       c040  CryptoServer CSe-Series Hardware Security Module
+       c051  CryptoServer Se-Series Gen2 Hardware Security Module
 # nee Atheros Communications, Inc.
 168c  Qualcomm Atheros
        0007  AR5210 Wireless Network Adapter [AR5000 802.11a]
        cd01  NVMe SSD Controller
        ec20  Elastic Network Adapter (ENA)
        efa0  Elastic Fabric Adapter (EFA)
+       efa1  Elastic Fabric Adapter (EFA)
 1d17  Zhaoxin
        070f  ZX-100 PCI Express Root Port
        0710  ZX-100/ZX-200 PCI Express Root Port
        1012  AR-MAN-U200 [Manitou Class Accelerator for U200]
        1013  AR-MAN-U250 [Manitou Class Accelerator for U250]
        1014  AR-MAN-U280 [Manitou Class Accelerator for U280]
+       1015  AR-ARK-BBDEV-FX0 [Arkville 32B DPDK Baseband Device]
+       1016  AR-ARK-BBDEV-FX1 [Arkville 64B DPDK Baseband Device]
        4200  A5PL-E1-10GETI [10 GbE Ethernet Traffic Instrument]
 1d72  Xiaomi
-1d78  DERA
+1d78  DERA Storage
+       1512  TAI NVMe Controller
+               1d78 2003  D5457 HHHL 1.6TB NVMe SSD
+               1d78 2004  D5437 HHHL 2TB NVMe SSD
+               1d78 2005  D5457 HHHL 3.2TB NVMe SSD
+               1d78 2006  D5437 HHHL 4TB NVMe SSD
+               1d78 2007  D5457 HHHL 6.4TB NVMe SSD
+               1d78 2008  D5437 HHHL 8TB NVMe SSD
+               1d78 2103  D5457 U.2 1.6TB NVMe SSD
+               1d78 2104  D5437 U.2 2TB NVMe SSD
+               1d78 2105  D5457 U.2 3.2TB NVMe SSD
+               1d78 2106  D5437 U.2 4TB NVMe SSD
+               1d78 2107  D5457 U.2 6.4TB NVMe SSD
+               1d78 2108  D5437 U.2 8TB NVMe SSD
 1d7c  Aerotech, Inc.
 1d82  NETINT Technologies Inc.
        0101  Codensity D400 SSD
        0001  HL-1000 AI Inference Accelerator [Goya]
 # PCIe accelerator card for Deep Learning training tasks
        1000  HL-2000 AI Training Accelerator [Gaudi]
+1db2  ATP ELECTRONICS INC
 1dbb  NGD Systems, Inc.
 1dbf  Guizhou Huaxintong Semiconductor Technology Co., Ltd
        0401  StarDragon4800 PCI Express Root Port
 1de5  Eideticom, Inc
        1000  IO Memory Controller
        2000  NoLoad Hardware Development Kit
+1dee  Biwin Storage Technology Co., Ltd.
 1def  Ampere Computing, LLC
        e005  eMAG PCI Express Root Port 0
        e006  eMAG PCI Express Root Port 1
 1e38  Blaize, Inc
 1e3d  Burlywood, Inc
 1e49  Yangtze Memory Technologies Co.,Ltd
+1e4b  MAXIO Technology (Hangzhou) Ltd.
+       1001  NVMe SSD Controller MAP1001
+       1002  NVMe SSD Controller MAP1002
+       1003  NVMe SSD Controller MAP1003
+       1201  NVMe SSD Controller MAP1201
+       1202  NVMe SSD Controller MAP1202
+       1601  NVMe SSD Controller MAP1601
 1e4c  GSI Technology
 # Associative Processing Unit chip
        0010  Gemini [ Lida ]
        02e8  Serial IO I2C Host Controller
        02e9  Comet Lake Serial IO I2C Host Controller
        02f0  Wireless-AC 9462
+               8086 0070  Intel(R) Wi-Fi 6 AX201 160MHz
        02f9  Comet Lake Thermal Subsytem
        02fc  Comet Lake Integrated Sensor Solution
        0309  80303 I/O Processor PCI-to-PCI Bridge
                8086 0008  Ethernet Network Adapter OCP XXV710-1
                8086 0009  Ethernet 25G 2P XXV710 Adapter
                8086 000a  Ethernet 25G 2P XXV710 OCP
-               8086 000c  Ethernet Network Adapter XXV710-DA2 for OCP 3.0
                8086 4001  Ethernet Network Adapter XXV710-2
        1591  Ethernet Controller E810-C for backplane
        1592  Ethernet Controller E810-C for QSFP
                8086 0006  Ethernet Network Adapter E810-C-Q2 for OCP3.0
                8086 0009  Ethernet Network Adapter E810-C-Q1
                8086 000a  Ethernet Network Adapter E810-C-Q1 for OCP
+               8086 000b  Ethernet 100G 2P E810-C Adapter
        1593  Ethernet Controller E810-C for SFP
                1137 02c3  E810XXVDA4 4x25/10 GbE SFP28 PCIe NIC
                8086 0002  Ethernet Network Adapter E810-L-2
                8086 0007  Ethernet Network Adapter E810-XXV-4
                8086 0008  Ethernet Network Adapter E810-XXV-2
                8086 0009  Ethernet Network Adapter E810-XXV-2 for OCP 2.0
+               8086 000a  Ethernet 25G 4P E810-XXV Adapter
        1599  Ethernet Controller E810-XXV for backplane
        159a  Ethernet Controller E810-XXV for QSFP
        159b  Ethernet Controller E810-XXV for SFP
                1028 0869  Vostro 3470
        a36f  Cannon Lake PCH Shared SRAM
        a370  Wireless-AC 9560 [Jefferson Peak]
+               1a56 1552  Killer(R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)
        a379  Cannon Lake PCH Thermal Controller
                1028 0869  Vostro 3470
        a620  6400/6402 Advanced Memory Buffer (AMB)
index 0b850290d5787cebeb5483227734d61c04cf94d7..ea9dafc0eb97533e343b715e18f2c295179ccc28 100644 (file)
@@ -9,8 +9,8 @@
 #      The latest version can be obtained from
 #              http://www.linux-usb.org/usb.ids
 #
-# Version: 2020.06.22
-# Date:    2020-06-22 20:34:08
+# Version: 2020.07.06
+# Date:    2020-07-06 20:34:08
 #
 
 # Vendors, devices and interfaces. Please keep sorted.
        0168  VerticalMouse 3 Wireless
        0191  VerticalMouse 4
        0195  VerticalMouse C Wireless
+1a7e  Meltec Systementwicklung
+       1001  UFT75, UT150, UT60
+       1003  Thermostick
 1a81  Holtek Semiconductor, Inc.
        1004  Wireless Dongle 2.4 GHZ HT82D40REW
        1701  Wireless dongle
index bfd359a903e0822cd8124f228668c4636f185f16..d792ef7220f7f3f2d1ae8d1944777c731fe5e419 100644 (file)
         <literal>persistent</literal>, data will be stored preferably on disk, i.e. below the
         <filename>/var/log/journal</filename> hierarchy (which is created if needed), with a fallback to
         <filename>/run/log/journal</filename> (which is created if needed), during early boot and if the disk
-        is not writable.  <literal>auto</literal> is similar to <literal>persistent</literal> but the
-        directory <filename>/var/log/journal</filename> is not created if needed, so that its existence
-        controls where log data goes.  <literal>none</literal> turns off all storage, all log data received
-        will be dropped. Forwarding to other targets, such as the console, the kernel log buffer, or a syslog
-        socket will still work however. Defaults to <literal>auto</literal> in the default journal namespace,
-        and <literal>persistent</literal> in all others.</para></listitem>
+        is not writable. <literal>auto</literal> behaves like <literal>persistent</literal> if the
+        <filename>/var/log/journal</filename> directory exists, and <literal>volatile</literal> otherwise
+        (the existence of the directory controls the storage mode). <literal>none</literal> turns off all
+        storage, all log data received will be dropped (but forwarding to other targets, such as the console,
+        the kernel log buffer, or a syslog socket will still work). Defaults to <literal>auto</literal> in
+        the default journal namespace, and <literal>persistent</literal> in all others.</para>
+
+        <para>Note that when this option is changed to <literal>volatile</literal>, existing persistent data
+        is not removed. In the other direction,
+        <citerefentry><refentrytitle>journalctl</refentrytitle><manvolnum>1</manvolnum></citerefentry> with
+        the <option>--flush</option> option may be used to move volatile data to persistent storage.</para>
+        </listitem>
       </varlistentry>
 
       <varlistentry>
index 675daf3ede59abd44938323606f21a9350e7f198..a2164436c37502a5ddb8b2fa9040ae8bd10b0590 100644 (file)
 
     <para>Container and sandbox runtime managers may make the host's
     identification data available to applications by providing the host's
-    <filename>/etc/os-release</filename> and
-    <filename>/usr/lib/os-release</filename> as respectively
-    <filename>/run/host/etc/os-release</filename> and
-    <filename>/run/host/usr/lib/os-release</filename>.</para>
+    <filename>/etc/os-release</filename> (if available, otherwise
+    <filename>/usr/lib/os-release</filename> as a fallback) as
+    <filename>/run/host/os-release</filename>.</para>
   </refsect1>
 
   <refsect1>
index e6083004ea1458108c5a716721ff597c1085b0d9..3fb454faa907d15b87af52095b79522f27709aa1 100644 (file)
@@ -639,6 +639,7 @@ manpages = [
  ['sd_journal_get_data',
   '3',
   ['SD_JOURNAL_FOREACH_DATA',
+   'sd_journal_enumerate_available_data',
    'sd_journal_enumerate_data',
    'sd_journal_get_data_threshold',
    'sd_journal_restart_data',
@@ -699,6 +700,7 @@ manpages = [
  ['sd_journal_query_unique',
   '3',
   ['SD_JOURNAL_FOREACH_UNIQUE',
+   'sd_journal_enumerate_available_unique',
    'sd_journal_enumerate_unique',
    'sd_journal_restart_unique'],
   ''],
@@ -850,7 +852,7 @@ manpages = [
  ['systemd-initctl.service',
   '8',
   ['systemd-initctl', 'systemd-initctl.socket'],
-  ''],
+  'HAVE_SYSV_COMPAT'],
  ['systemd-journal-gatewayd.service',
   '8',
   ['systemd-journal-gatewayd', 'systemd-journal-gatewayd.socket'],
index 8d3511ef638a3052222cd8f526e8ad9193cb3266..1fc24c8ab07994a42f295926049cefcd28638811 100644 (file)
         <paramdef>void *<parameter>userdata</parameter></paramdef>
       </funcprototype>
 
+      <funcprototype>
+        <funcdef>int <function>sd_event_add_time_relative</function></funcdef>
+        <paramdef>sd_event *<parameter>event</parameter></paramdef>
+        <paramdef>sd_event_source **<parameter>source</parameter></paramdef>
+        <paramdef>clockid_t <parameter>clock</parameter></paramdef>
+        <paramdef>uint64_t <parameter>usec</parameter></paramdef>
+        <paramdef>uint64_t <parameter>accuracy</parameter></paramdef>
+        <paramdef>sd_event_time_handler_t <parameter>handler</parameter></paramdef>
+        <paramdef>void *<parameter>userdata</parameter></paramdef>
+      </funcprototype>
+
       <funcprototype>
         <funcdef>int <function>sd_event_source_get_time</function></funcdef>
         <paramdef>sd_event_source *<parameter>source</parameter></paramdef>
         <paramdef>uint64_t <parameter>usec</parameter></paramdef>
       </funcprototype>
 
+      <funcprototype>
+        <funcdef>int <function>sd_event_source_set_time_relative</function></funcdef>
+        <paramdef>sd_event_source *<parameter>source</parameter></paramdef>
+        <paramdef>uint64_t <parameter>usec</parameter></paramdef>
+      </funcprototype>
+
       <funcprototype>
         <funcdef>int <function>sd_event_source_get_time_accuracy</function></funcdef>
         <paramdef>sd_event_source *<parameter>source</parameter></paramdef>
     <function>sd_event_source_set_time()</function>.
     </para>
 
+    <para><function>sd_event_add_time_relative()</function> is like <function>sd_event_add_time()</function>,
+    but takes a relative time specification. It's relative to the current time of the event loop iteration,
+    as returned by
+    <citerefentry><refentrytitle>sd_event_now</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>
+
     <para>To destroy an event source object use
     <citerefentry><refentrytitle>sd_event_source_unref</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     but note that the event source is only removed from the event loop
     events will be regular, while in the latter case the scheduling
     latency will keep accumulating on the timer.</para>
 
-    <para><function>sd_event_source_get_time()</function> retrieves
-    the configured time value of an event source created
-    previously with <function>sd_event_add_time()</function>. It takes
-    the event source object and a pointer to a variable to store the
-    time in, relative to the selected clock's epoch, in µs.</para>
+    <para><function>sd_event_source_get_time()</function> retrieves the configured time value of an event
+    source created previously with <function>sd_event_add_time()</function> or
+    <function>sd_event_add_time_relative()</function>. It takes the event source object and a pointer to a
+    variable to store the time in, relative to the selected clock's epoch, in µs. The returned value is
+    relative to the epoch, even if the event source was created with a relative time via
+    <function>sd_event_add_time_relative()</function>.</para>
+
+    <para><function>sd_event_source_set_time()</function> changes the time of an event source created
+    previously with <function>sd_event_add_time()</function> or
+    <function>sd_event_add_time_relative()</function>. It takes the event source object and a time relative
+    to the selected clock's epoch, in µs.</para>
 
-    <para><function>sd_event_source_set_time()</function> changes the
-    time of an event source created previously with
-    <function>sd_event_add_time()</function>. It takes the event
-    source object and a time relative to the selected clock's epoch,
-    in µs.</para>
+    <para><function>sd_event_source_set_time_relative()</function> is similar to
+    <function>sd_event_source_set_time()</function>, but takes a time relative to the current time of the
+    event loop iteration, as returned by <function>sd_event_now()</function>.</para>
 
     <para><function>sd_event_source_get_time_accuracy()</function>
     retrieves the configured accuracy value of an event source
 
           <listitem><para>The passed event source is not a timer event source.</para></listitem>
         </varlistentry>
+
+        <varlistentry>
+          <term><constant>-EOVERFLOW</constant></term>
+
+          <listitem><para>The passed relative time is outside of the allowed range for time values (i.e. the
+          specified value added to the current time is outside the 64 bit unsigned integer range).</para></listitem>
+        </varlistentry>
       </variablelist>
     </refsect2>
   </refsect1>
index 28c2194285f6d039e124443c98fc797f77bb25b0..506f9ca68f870b4c87928a9833c0c29b4ac00a6e 100644 (file)
@@ -263,11 +263,9 @@ Sun 2017-02-26 20:57:49 EST  2h 3min left  Sun 2017-02-26 11:56:36 EST  6h ago
             If a unit name with no extension is given, an extension of
             <literal>.target</literal> will be assumed.</para>
 
-            <para>This is similar to changing the runlevel in a
-            traditional init system. The <command>isolate</command>
-            command will immediately stop processes that are not enabled
-            in the new unit, possibly including the graphical
-            environment or terminal you are currently using.</para>
+            <para>This command is dangerous, since it will immediately stop processes that are not enabled in
+            the new target, possibly including the graphical environment or terminal you are currently using.
+            </para>
 
             <para>Note that this is allowed only on units where
             <option>AllowIsolate=</option> is enabled. See
index 77bdd80f32ab440e1a614fa58a7ee04ebb73e40b..24cbe9b368c981340358ab60efd199468692d958 100644 (file)
           </row>
 
           <row>
-            <entry valign="top" morerows="7">Container</entry>
+            <entry valign="top" morerows="8">Container</entry>
             <entry><varname>openvz</varname></entry>
             <entry>OpenVZ/Virtuozzo</entry>
           </row>
index ffa88baf67fe48f50754be3428fb6e62cc235e2c..6905e99b11785a70527a4ed066f0180431e05c41 100644 (file)
         and graphic illustrating the changes applied.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>--json=</option><replaceable>MODE</replaceable></term>
+
+        <listitem><para>Shows output formatted as JSON. Expects one of <literal>short</literal> (for the
+        shortest possible output without any redundant whitespace or line breaks), <literal>pretty</literal>
+        (for a pretty version of the same, with indentation and line breaks) or <literal>off</literal> (to turn
+        off json output).</para></listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><option>--definitions=</option></term>
 
index 8afcbd246f7c04ce11b74b1018a158bfa51d4c4b..c5d755e8976471c959537fc956fb624de142e062 100644 (file)
         <xi:include href="system-only.xml" xpointer="singular"/></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>RootImageOptions=</varname></term>
+
+        <listitem><para>Takes a comma-separated list of mount options that will be used on disk images specified by
+        <varname>RootImage=</varname>. Optionally a partition number can be prefixed, followed by colon, in
+        case the image has multiple partitions, otherwise partition number 0 is implied.
+        Options for multiple partitions can be specified in a single line with space separators. Assigning an empty
+        string removes previous assignments. For a list of valid mount options, please refer to
+        <citerefentry><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+
+        <xi:include href="system-only.xml" xpointer="singular"/></listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>RootHash=</varname></term>
 
         the same name (except if the image has the <filename>.raw</filename> suffix, in which case the verity data file must
         not have it in its name), the verity data is read from it and automatically used.</para>
 
-        <para>This option is supported only for disk images that contain a single file system, without an enveloping partition
-        table. Images that contain a GPT partition table should instead include both root file system and matching Verity
-        data in the same image, implementing the
-        [Discoverable Partition Specification](https://systemd.io/DISCOVERABLE_PARTITIONS)</para>
+        <para>This option is supported only for disk images that contain a single file system, without an
+        enveloping partition table. Images that contain a GPT partition table should instead include both
+        root file system and matching Verity data in the same image, implementing the <ulink
+        url="https://systemd.io/DISCOVERABLE_PARTITIONS">Discoverable Partition Specification</ulink>.</para>
 
         <xi:include href="system-only.xml" xpointer="singular"/></listitem>
       </varlistentry>
index 0b0c751e91322aea966246f1a0e96efe48da1a28..e75d612c0535c9b0db13cab2da943e691177500d 100644 (file)
           <literal>false</literal>. See the [IPv6PrefixDelegation] and the [IPv6Prefix] sections for more
           configuration options.</para></listitem>
         </varlistentry>
-        <varlistentry>
-          <term><varname>IPv6PDSubnetId=</varname></term>
-          <listitem><para>Configure a specific subnet ID on the interface from a (previously) received prefix delegation.
-          You can either set "auto" (the default) or a specific subnet ID
-          (as defined in <ulink url="https://tools.ietf.org/html/rfc4291#section-2.5.4">RFC 4291</ulink>, section 2.5.4),
-          in which case the allowed value is hexadecimal, from 0 to 0x7fffffffffffffff inclusive.
-          This option is only effective when used together with <varname>IPv6PrefixDelegation=</varname>
-          and the corresponding configuration on the upstream interface.
-          </para></listitem>
-        </varlistentry>
         <varlistentry>
           <term><varname>IPv6MTUBytes=</varname></term>
           <listitem><para>Configures IPv6 maximum transmission unit (MTU).
           </listitem>
         </varlistentry>
 
-        <varlistentry>
-          <term><varname>AssignAcquiredDelegatedPrefixAddress=</varname></term>
-          <listitem>
-            <para>Takes a boolean. Specifies whether to add an address from the delegated prefixes which are received
-            from the WAN interface by the <varname>IPv6PrefixDelegation=</varname>. When true (on LAN interfce), the EUI-64
-            algorithm will be used to form an interface identifier from the delegated prefixes. Defaults to true.</para>
-          </listitem>
-        </varlistentry>
-
-        <varlistentry>
-        <term><varname>AssignAcquiredDelegatedPrefixToken=</varname></term>
-          <listitem>
-            <para>Specifies an optional address generation mode for <varname>AssignAcquiredDelegatedPrefixAddress=</varname>.
-            Takes an IPv6 address. When set, the lower bits of the supplied address are combined with the upper bits of a
-            delegatad prefix received from the WAN interface by the <varname>IPv6PrefixDelegation=</varname> prefixes to
-            form a complete address.</para>
-          </listitem>
-        </varlistentry>
-
         <varlistentry>
           <term><varname>PrefixDelegationHint=</varname></term>
           <listitem>
       </variablelist>
   </refsect1>
 
+  <refsect1>
+    <title>[DHCPv6PrefixDelegation] Section Options</title>
+    <para>The [DHCPv6PrefixDelegation] section configures delegated prefix assigned by DHCPv6 server.
+    The settings in this section are used only when <varname>IPv6PrefixDelegation=</varname> setting is
+    enabled, or set to <literal>dhcp6</literal>.</para>
+
+    <variablelist class='network-directives'>
+      <varlistentry>
+        <term><varname>SubnetId=</varname></term>
+        <listitem>
+          <para>Configure a specific subnet ID on the interface from a (previously) received prefix
+          delegation. You can either set "auto" (the default) or a specific subnet ID (as defined in
+          <ulink url="https://tools.ietf.org/html/rfc4291#section-2.5.4">RFC 4291</ulink>, section
+          2.5.4), in which case the allowed value is hexadecimal, from 0 to 0x7fffffffffffffff
+          inclusive. This option is only effective when used together with
+          <varname>IPv6PrefixDelegation=</varname> and the corresponding configuration on the upstream
+          interface.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>Assign=</varname></term>
+        <listitem>
+          <para>Takes a boolean. Specifies whether to add an address from the delegated prefixes which
+          are received from the WAN interface by the <varname>IPv6PrefixDelegation=</varname>. When
+          true (on LAN interfce), the EUI-64 algorithm will be used to form an interface identifier
+          from the delegated prefixes. Defaults to true.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>Token=</varname></term>
+        <listitem>
+          <para>Specifies an optional address generation mode for <varname>Assign=</varname>. Takes an
+          IPv6 address. When set, the lower bits of the supplied address are combined with the upper
+          bits of a delegatad prefix received from the WAN interface by the
+          <varname>IPv6PrefixDelegation=</varname> prefixes to form a complete address.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+
   <refsect1>
     <title>[IPv6AcceptRA] Section Options</title>
       <para>The [IPv6AcceptRA] section configures the IPv6 Router Advertisement (RA) client, if it is enabled
@@ -3520,10 +3533,7 @@ DHCP=ipv6</programlisting>
 Name=enp2s0
 
 [Network]
-IPv6PrefixDelegation=dhcpv6
-
-[DHCPv6]
-AssignAcquiredDelegatedPrefixAddress=yes</programlisting>
+IPv6PrefixDelegation=dhcpv6</programlisting>
 
       <para>This will enable IPv6 PD on the interface enp1s0 as an upstream interface where the
       DHCPv6 client is running and enp2s0 as a downstream interface where the prefix is delegated to.</para>
index 4e281ec6d4f80d43151bdce6d91c9d04160b8852..cc13bff7550f6ca7fb456eaaadb29049c00aa6f4 100644 (file)
           <programlisting>SuccessExitStatus=TEMPFAIL 250 SIGUSR1</programlisting>
 
           <para>Exit status 75 (<constant>TEMPFAIL</constant>), 250, and the termination signal
-          <constant>SIGKILL</constant> are considered clean service terminations.</para>
+          <constant>SIGUSR1</constant> are considered clean service terminations.</para>
         </example>
 
         <para>Note: <command>systemd-analyze exit-status</command> may be used to list exit statuses and
index 0c0e1343c175f5957458d2d90334dd886868aff4..134e95d4756f3759e318936174fc201c5f8996e1 100644 (file)
@@ -676,17 +676,17 @@ conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
 
 time_epoch = get_option('time-epoch')
 if time_epoch == -1
-        source_date_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
-        if source_date_epoch != ''
-                time_epoch = source_date_epoch.to_int()
-        elif git.found() and run_command('test', '-e', '.git').returncode() == 0
+        time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
+        if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
                 # If we're in a git repository, use the creation time of the latest git tag.
                 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
-                time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout().to_int()
-        else
+                time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
+        endif
+        if time_epoch == ''
                 NEWS = files('NEWS')
-                time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
+                time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
         endif
+        time_epoch = time_epoch.to_int()
 endif
 conf.set('TIME_EPOCH', time_epoch)
 
@@ -1799,11 +1799,11 @@ public_programs += executable(
         include_directories : includes,
         link_with : [libshared],
         dependencies : [threads,
-                        libqrencode,
+                        libdl,
                         libxz,
                         liblz4,
-                        libpcre2,
-                        libzstd],
+                        libzstd,
+                        libdl],
         install_rpath : rootlibexecdir,
         install : true,
         install_dir : rootbindir)
@@ -2668,6 +2668,7 @@ if conf.get('ENABLE_REPART') == 1
                 install_rpath : rootlibexecdir,
                 install : true,
                 install_dir : rootbindir)
+        public_programs += exe
 
         if want_tests != 'false'
                 test('test-repart',
index 6864a137b17f816525a7794294bc3b371a5d1a6a..abffb205889656d60034354f8f406a712a7d03cc 100755 (executable)
@@ -4,7 +4,7 @@ set -eux
 
 # default to Debian testing
 DISTRO=${DISTRO:-debian}
-RELEASE=${RELEASE:-buster}
+RELEASE=${RELEASE:-bullseye}
 BRANCH=${BRANCH:-upstream-ci}
 ARCH=${ARCH:-amd64}
 CONTAINER=${RELEASE}-${ARCH}
@@ -37,7 +37,7 @@ apt-get -q --allow-releaseinfo-change update
 apt-get -y dist-upgrade
 apt-get install -y eatmydata
 # The following four are needed as long as these deps are not covered by Debian's own packaging
-apt-get install -y fdisk libfdisk-dev libp11-kit-dev libssl-dev libpwquality-dev
+apt-get install -y fdisk tree libfdisk-dev libp11-kit-dev libssl-dev libpwquality-dev
 apt-get purge --auto-remove -y unattended-upgrades
 systemctl unmask systemd-networkd
 systemctl enable systemd-networkd
diff --git a/src/basic/dlfcn-util.c b/src/basic/dlfcn-util.c
new file mode 100644 (file)
index 0000000..08ded96
--- /dev/null
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#include "dlfcn-util.h"
+
+int dlsym_many_and_warn(void *dl, int level, ...) {
+        va_list ap;
+        int r;
+
+        /* Tries to resolve a bunch of function symbols, and logs errors about the ones it cannot
+         * resolve. Note that this function possibly modifies the supplied function pointers if the whole
+         * operation fails */
+
+        va_start(ap, level);
+
+        for (;;) {
+                void (**fn)(void);
+                void (*tfn)(void);
+                const char *symbol;
+
+                fn = va_arg(ap, typeof(fn));
+                if (!fn)
+                        break;
+
+                symbol = va_arg(ap, typeof(symbol));
+
+                tfn = (typeof(tfn)) dlsym(dl, symbol);
+                if (!tfn) {
+                        r = log_full_errno(level,
+                                           SYNTHETIC_ERRNO(ELIBBAD),
+                                           "Can't find symbol %s: %s", symbol, dlerror());
+                        va_end(ap);
+                        return r;
+                }
+
+                *fn = tfn;
+        }
+
+        va_end(ap);
+        return 0;
+}
index d254afb68b5d1d4138420f245fb12e5c562be8a9..df66cdfd38f8a57bbe9424dd2fbe499fb52db424 100644 (file)
@@ -6,3 +6,5 @@
 #include "macro.h"
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(void*, dlclose);
+
+int dlsym_many_and_warn(void *dl, int level, ...);
index 828ea11816625e3cc298c03ead641682fb8cfd63..ea50e26197f48a7253dcb4cfcbaeb1f2de4bbd63 100644 (file)
@@ -108,11 +108,7 @@ int in_addr_equal(int family, const union in_addr_union *a, const union in_addr_
                 return in4_addr_equal(&a->in, &b->in);
 
         if (family == AF_INET6)
-                return
-                        a->in6.s6_addr32[0] == b->in6.s6_addr32[0] &&
-                        a->in6.s6_addr32[1] == b->in6.s6_addr32[1] &&
-                        a->in6.s6_addr32[2] == b->in6.s6_addr32[2] &&
-                        a->in6.s6_addr32[3] == b->in6.s6_addr32[3];
+                return IN6_ARE_ADDR_EQUAL(&a->in6, &b->in6);
 
         return -EAFNOSUPPORT;
 }
index f7f97000e0a2e0e15b0b9628238096e2980bc40b..b62c374985770418b06c3cf1125bf9acc4f124ed 100644 (file)
 
 #define LIST_IS_EMPTY(head)                                             \
         (!(head))
+
+/* Join two lists tail to head: a->b, c->d to a->b->c->d and de-initialise second list */
+#define LIST_JOIN(name,a,b)                                             \
+        do {                                                            \
+                assert(b);                                              \
+                if (!(a))                                               \
+                        (a) = (b);                                      \
+                else {                                                  \
+                        typeof(*(a)) *_head = (b), *_tail;              \
+                        LIST_FIND_TAIL(name, (a), _tail);               \
+                        _tail->name##_next = _head;                     \
+                        _head->name##_prev = _tail;                     \
+                }                                                       \
+                (b) = NULL;                                             \
+        } while (false)
index 90924d6cb895525e1becade481fff0eb5a6600b6..42d0754d6d1891e29a88f3e943f34e43605586ad 100644 (file)
@@ -39,6 +39,7 @@ basic_sources = files('''
         device-nodes.h
         dirent-util.c
         dirent-util.h
+        dlfcn-util.c
         dlfcn-util.h
         efivars.c
         efivars.h
index 986dfe94a4b719b16e13c50b94bf6d041887c42d..c4e022b3a1187806635f771c7825322b42e4913c 100644 (file)
@@ -640,10 +640,8 @@ int find_binary(const char *name, char **ret) {
                 if (access(j, X_OK) >= 0) {
                         /* Found it! */
 
-                        if (ret) {
-                                *ret = path_simplify(j, false);
-                                j = NULL;
-                        }
+                        if (ret)
+                                *ret = path_simplify(TAKE_PTR(j), false);
 
                         return 0;
                 }
index 666431aa31fd0592bd4cb9ed72d01803b6d911fc..61180819b1bf0f995cddb9ca2ee9f02e1be9bb28 100644 (file)
@@ -151,12 +151,6 @@ void siphash24_compress(const void *_in, size_t inlen, struct siphash *state) {
         }
 }
 
-void siphash24_compress_boolean(bool in, struct siphash *state) {
-        int i = in;
-
-        siphash24_compress(&i, sizeof i, state);
-}
-
 uint64_t siphash24_finalize(struct siphash *state) {
         uint64_t b;
 
index 1937fea2985fa1f43fbbc4efe5d4a025e7424bf7..7f799ede3d19628261ac85912c6001334f8b329c 100644 (file)
@@ -17,9 +17,21 @@ struct siphash {
 
 void siphash24_init(struct siphash *state, const uint8_t k[static 16]);
 void siphash24_compress(const void *in, size_t inlen, struct siphash *state);
-void siphash24_compress_boolean(bool in, struct siphash *state);
 #define siphash24_compress_byte(byte, state) siphash24_compress((const uint8_t[]) { (byte) }, 1, (state))
 
+static inline void siphash24_compress_boolean(bool in, struct siphash *state) {
+        uint8_t i = in;
+
+        siphash24_compress(&i, sizeof i, state);
+}
+
+static inline void siphash24_compress_string(const char *in, struct siphash *state) {
+        if (!in)
+                return;
+
+        siphash24_compress(in, strlen(in), state);
+}
+
 uint64_t siphash24_finalize(struct siphash *state);
 
 uint64_t siphash24(const void *in, size_t inlen, const uint8_t k[static 16]);
index 1f0519876653440831df9799e32cb7bdd6ba4be0..def267ddb7fe6db5b565e6c0bce61a4168dbfa1f 100644 (file)
@@ -709,25 +709,25 @@ static int automount_dispatch_expire(sd_event_source *source, usec_t usec, void
 }
 
 static int automount_start_expire(Automount *a) {
-        int r;
         usec_t timeout;
+        int r;
 
         assert(a);
 
         if (a->timeout_idle_usec == 0)
                 return 0;
 
-        timeout = now(CLOCK_MONOTONIC) + MAX(a->timeout_idle_usec/3, USEC_PER_SEC);
+        timeout = MAX(a->timeout_idle_usec/3, USEC_PER_SEC);
 
         if (a->expire_event_source) {
-                r = sd_event_source_set_time(a->expire_event_source, timeout);
+                r = sd_event_source_set_time_relative(a->expire_event_source, timeout);
                 if (r < 0)
                         return r;
 
                 return sd_event_source_set_enabled(a->expire_event_source, SD_EVENT_ONESHOT);
         }
 
-        r = sd_event_add_time(
+        r = sd_event_add_time_relative(
                         UNIT(a)->manager->event,
                         &a->expire_event_source,
                         CLOCK_MONOTONIC, timeout, 0,
index 50f7ada8cefb2f32efe790c5698bdcbbc44ff578..49729799abfd9c6418efa2bf3a342d3ab99b66f2 100644 (file)
@@ -784,6 +784,37 @@ static int property_get_root_hash_sig(
         return sd_bus_message_append_array(reply, 'y', c->root_hash_sig, c->root_hash_sig_size);
 }
 
+static int property_get_root_image_options(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        ExecContext *c = userdata;
+        MountOptions *m;
+        int r;
+
+        assert(bus);
+        assert(c);
+        assert(property);
+        assert(reply);
+
+        r = sd_bus_message_open_container(reply, 'a', "(us)");
+        if (r < 0)
+                return r;
+
+        LIST_FOREACH(mount_options, m, c->root_image_options) {
+                r = sd_bus_message_append(reply, "(us)", m->partition_number, m->options);
+                if (r < 0)
+                        return r;
+        }
+
+        return sd_bus_message_close_container(reply);
+}
+
 const sd_bus_vtable bus_exec_vtable[] = {
         SD_BUS_VTABLE_START(0),
         SD_BUS_PROPERTY("Environment", "as", NULL, offsetof(ExecContext, environment), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -826,6 +857,7 @@ const sd_bus_vtable bus_exec_vtable[] = {
         SD_BUS_PROPERTY("WorkingDirectory", "s", property_get_working_directory, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("RootDirectory", "s", NULL, offsetof(ExecContext, root_directory), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("RootImage", "s", NULL, offsetof(ExecContext, root_image), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("RootImageOptions", "a(us)", property_get_root_image_options, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("RootHash", "ay", property_get_root_hash, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("RootHashPath", "s", NULL, offsetof(ExecContext, root_hash_path), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("RootHashSignature", "ay", property_get_root_hash_sig, 0, SD_BUS_VTABLE_PROPERTY_CONST),
@@ -1301,6 +1333,62 @@ int bus_exec_context_set_transient_property(
         if (streq(name, "RootImage"))
                 return bus_set_transient_path(u, name, &c->root_image, message, flags, error);
 
+        if (streq(name, "RootImageOptions")) {
+                _cleanup_(mount_options_free_allp) MountOptions *options = NULL;
+                _cleanup_free_ char *format_str = NULL;
+                const char *mount_options;
+                unsigned partition_number;
+
+                r = sd_bus_message_enter_container(message, 'a', "(us)");
+                if (r < 0)
+                        return r;
+
+                while ((r = sd_bus_message_read(message, "(us)", &partition_number, &mount_options)) > 0) {
+                        _cleanup_free_ char *previous = TAKE_PTR(format_str);
+                        _cleanup_free_ MountOptions *o = NULL;
+
+                        if (chars_intersect(mount_options, WHITESPACE))
+                                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
+                                                        "Invalid mount options string, contains whitespace character(s): %s", mount_options);
+
+                        if (asprintf(&format_str, "%s%s%u:%s", strempty(previous), previous ? " " : "", partition_number, mount_options) < 0)
+                                return -ENOMEM;
+
+                        o = new(MountOptions, 1);
+                        if (!o)
+                                return -ENOMEM;
+                        *o = (MountOptions) {
+                                .partition_number = partition_number,
+                                .options = strdup(mount_options),
+                        };
+                        if (!o->options)
+                                return -ENOMEM;
+                        LIST_APPEND(mount_options, options, TAKE_PTR(o));
+                }
+                if (r < 0)
+                        return r;
+
+                r = sd_bus_message_exit_container(message);
+                if (r < 0)
+                        return r;
+
+                if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
+                        if (LIST_IS_EMPTY(options)) {
+                                c->root_image_options = mount_options_free_all(c->root_image_options);
+                                unit_write_settingf(u, flags, name, "%s=", name);
+                        } else {
+                                LIST_JOIN(mount_options, c->root_image_options, options);
+                                unit_write_settingf(
+                                                u, flags|UNIT_ESCAPE_SPECIFIERS, name,
+                                                "%s=%s",
+                                                name,
+                                                format_str);
+                        }
+                }
+
+                return 1;
+        }
+
         if (streq(name, "RootHash")) {
                 const void *roothash_decoded;
                 size_t roothash_decoded_size;
index 2a4840a3a9b99c418793a6c6046c68de9097b4ab..39ffcba5802dff4b4e78c4b216fcef9239da1514 100644 (file)
@@ -2660,7 +2660,7 @@ static int apply_mount_namespace(
         if (context->mount_flags == MS_SHARED)
                 log_unit_debug(u, "shared mount propagation hidden by other fs namespacing unit settings: ignoring");
 
-        r = setup_namespace(root_dir, root_image,
+        r = setup_namespace(root_dir, root_image, context->root_image_options,
                             &ns_info, context->read_write_paths,
                             needs_sandboxing ? context->read_only_paths : NULL,
                             needs_sandboxing ? context->inaccessible_paths : NULL,
@@ -4207,6 +4207,7 @@ void exec_context_done(ExecContext *c) {
         c->working_directory = mfree(c->working_directory);
         c->root_directory = mfree(c->root_directory);
         c->root_image = mfree(c->root_image);
+        c->root_image_options = mount_options_free_all(c->root_image_options);
         c->root_hash = mfree(c->root_hash);
         c->root_hash_size = 0;
         c->root_hash_path = mfree(c->root_hash_path);
@@ -4618,6 +4619,16 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
         if (c->root_image)
                 fprintf(f, "%sRootImage: %s\n", prefix, c->root_image);
 
+        if (c->root_image_options) {
+                MountOptions *o;
+
+                fprintf(f, "%sRootImageOptions:", prefix);
+                LIST_FOREACH(mount_options, o, c->root_image_options)
+                        if (!isempty(o->options))
+                                fprintf(f, " %u:%s", o->partition_number, o->options);
+                fprintf(f, "\n");
+        }
+
         if (c->root_hash) {
                 _cleanup_free_ char *encoded = NULL;
                 encoded = hexmem(c->root_hash, c->root_hash_size);
index fc7bc5c24b2a89d0b98b0f182644264fa841117b..349f583c1a6697330e83144f8652b57da4d81c8b 100644 (file)
@@ -158,6 +158,7 @@ struct ExecContext {
         char *working_directory, *root_directory, *root_image, *root_verity, *root_hash_path, *root_hash_sig_path;
         void *root_hash, *root_hash_sig;
         size_t root_hash_size, root_hash_sig_size;
+        LIST_HEAD(MountOptions, root_image_options);
         bool working_directory_missing_ok:1;
         bool working_directory_home:1;
 
index 12ae78eb7dc5d4552665ac3d1916faa3f8bb1244..a7c9bd9f711ec6bfb255bad69c0431a6e4aadb08 100644 (file)
@@ -23,6 +23,7 @@ m4_define(`EXEC_CONTEXT_CONFIG_ITEMS',
 `$1.WorkingDirectory,            config_parse_working_directory,     0,                             offsetof($1, exec_context)
 $1.RootDirectory,                config_parse_unit_path_printf,      true,                          offsetof($1, exec_context.root_directory)
 $1.RootImage,                    config_parse_unit_path_printf,      true,                          offsetof($1, exec_context.root_image)
+$1.RootImageOptions,             config_parse_root_image_options,    0,                             offsetof($1, exec_context)
 $1.RootHash,                     config_parse_exec_root_hash,        0,                             offsetof($1, exec_context)
 $1.RootHashSignature,            config_parse_exec_root_hash_sig,    0,                             offsetof($1, exec_context)
 $1.RootVerity,                   config_parse_unit_path_printf,      true,                          offsetof($1, exec_context.root_verity)
index 3036aa8ba4432c934fe36f0d9f68a7c574dbc8da..2a2a5af58fd8de5dcd1e17b26b4fbe74bf05caae 100644 (file)
@@ -1416,6 +1416,97 @@ int config_parse_exec_cpu_sched_prio(const char *unit,
         return 0;
 }
 
+int config_parse_root_image_options(
+                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) {
+
+        _cleanup_(mount_options_free_allp) MountOptions *options = NULL;
+        ExecContext *c = data;
+        const Unit *u = userdata;
+        const char *p = rvalue;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        if (isempty(rvalue)) {
+                c->root_image_options = mount_options_free_all(c->root_image_options);
+                return 0;
+        }
+
+        for (;;) {
+                _cleanup_free_ char *mount_options_resolved = NULL, *first = NULL, *tuple = NULL;
+                const char *mount_options = NULL, *second = NULL;
+                MountOptions *o = NULL;
+                unsigned int partition_number = 0;
+
+                r = extract_first_word(&p, &tuple, WHITESPACE, EXTRACT_UNQUOTE);
+                if (r == 0)
+                        break;
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse %s: %s", lvalue, rvalue);
+                        return 0;
+                }
+
+                second = tuple;
+                r = extract_first_word(&second, &first, ":", EXTRACT_UNQUOTE|EXTRACT_DONT_COALESCE_SEPARATORS);
+                if (r == 0)
+                        continue;
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse %s: %s", lvalue, rvalue);
+                        continue;
+                }
+
+                /* Format is either '0:foo' or 'foo' (0 is implied) */
+                if (!isempty(second) && second[-1] == ':') {
+                        mount_options = second;
+                        r = safe_atou(first, &partition_number);
+                        if (r < 0) {
+                                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse partition number from \"%s\", ignoring: %m", first);
+                                continue;
+                        }
+                } else
+                        mount_options = first;
+
+                r = unit_full_printf(u, mount_options, &mount_options_resolved);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", mount_options);
+                        continue;
+                }
+
+                o = new(MountOptions, 1);
+                if (!o)
+                        return log_oom();
+                *o = (MountOptions) {
+                        .partition_number = partition_number,
+                        .options = TAKE_PTR(mount_options_resolved),
+                };
+                LIST_APPEND(mount_options, options, o);
+        }
+
+        /* empty spaces/separators only */
+        if (LIST_IS_EMPTY(options))
+                c->root_image_options = mount_options_free_all(c->root_image_options);
+        else
+                LIST_JOIN(mount_options, c->root_image_options, options);
+
+        return 0;
+}
+
 int config_parse_exec_root_hash(
                 const char *unit,
                 const char *filename,
index ac3940a1b7fc092335fc6e0400020b2e4d14c9ae..253de9467f09d10bade6b0e28c24529745ede8b2 100644 (file)
@@ -44,6 +44,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_exec_cpu_sched_policy);
 CONFIG_PARSER_PROTOTYPE(config_parse_exec_cpu_sched_prio);
 CONFIG_PARSER_PROTOTYPE(config_parse_exec_cpu_affinity);
 CONFIG_PARSER_PROTOTYPE(config_parse_exec_secure_bits);
+CONFIG_PARSER_PROTOTYPE(config_parse_root_image_options);
 CONFIG_PARSER_PROTOTYPE(config_parse_exec_root_hash);
 CONFIG_PARSER_PROTOTYPE(config_parse_exec_root_hash_sig);
 CONFIG_PARSER_PROTOTYPE(config_parse_capability_set);
index 54c6321870f66edac683e6bab1aa19ee304e967e..3a8df8245c3b59ec75ee519ce2ea836d179d2703 100644 (file)
@@ -589,6 +589,8 @@ static char** sanitize_environment(char **l) {
         /* Let's remove some environment variables that we need ourselves to communicate with our clients */
         strv_env_unset_many(
                         l,
+                        "CACHE_DIRECTORY",
+                        "CONFIGURATION_DIRECTORY",
                         "EXIT_CODE",
                         "EXIT_STATUS",
                         "INVOCATION_ID",
@@ -596,13 +598,16 @@ static char** sanitize_environment(char **l) {
                         "LISTEN_FDNAMES",
                         "LISTEN_FDS",
                         "LISTEN_PID",
+                        "LOGS_DIRECTORY",
                         "MAINPID",
                         "MANAGERPID",
                         "NOTIFY_SOCKET",
                         "PIDFILE",
                         "REMOTE_ADDR",
                         "REMOTE_PORT",
+                        "RUNTIME_DIRECTORY",
                         "SERVICE_RESULT",
+                        "STATE_DIRECTORY",
                         "WATCHDOG_PID",
                         "WATCHDOG_USEC",
                         NULL);
@@ -2897,15 +2902,13 @@ static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32
 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata) {
         Manager *m = userdata;
         int r;
-        uint64_t next;
 
         assert(m);
         assert(source);
 
         manager_print_jobs_in_progress(m);
 
-        next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_PERIOD_USEC;
-        r = sd_event_source_set_time(source, next);
+        r = sd_event_source_set_time_relative(source, JOBS_IN_PROGRESS_PERIOD_USEC);
         if (r < 0)
                 return r;
 
index 028c4de2802ba827ddb01f1651a9a9c8d726f0d9..feb88f3e6e5f5f1c865a2ecad5d613905ed65017 100644 (file)
@@ -61,51 +61,51 @@ typedef struct MountPoint {
 #endif
 
 static const MountPoint mount_table[] = {
-        { "sysfs",       "/sys",                      "sysfs",      NULL,                                           MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "sysfs",       "/sys",                      "sysfs",      NULL,                                      MS_NOSUID|MS_NOEXEC|MS_NODEV,
           NULL,          MNT_FATAL|MNT_IN_CONTAINER },
-        { "proc",        "/proc",                     "proc",       NULL,                                           MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "proc",        "/proc",                     "proc",       NULL,                                      MS_NOSUID|MS_NOEXEC|MS_NODEV,
           NULL,          MNT_FATAL|MNT_IN_CONTAINER },
-        { "devtmpfs",    "/dev",                      "devtmpfs",   "mode=755" TMPFS_LIMITS_DEV,                    MS_NOSUID|MS_NOEXEC|MS_STRICTATIME,
+        { "devtmpfs",    "/dev",                      "devtmpfs",   "mode=755" TMPFS_LIMITS_DEV,               MS_NOSUID|MS_NOEXEC|MS_STRICTATIME,
           NULL,          MNT_FATAL|MNT_IN_CONTAINER },
-        { "securityfs",  "/sys/kernel/security",      "securityfs", NULL,                                           MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "securityfs",  "/sys/kernel/security",      "securityfs", NULL,                                      MS_NOSUID|MS_NOEXEC|MS_NODEV,
           NULL,          MNT_NONE                   },
 #if ENABLE_SMACK
-        { "smackfs",     "/sys/fs/smackfs",           "smackfs",    "smackfsdef=*",                                 MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "smackfs",     "/sys/fs/smackfs",           "smackfs",    "smackfsdef=*",                            MS_NOSUID|MS_NOEXEC|MS_NODEV,
           mac_smack_use, MNT_FATAL                  },
-        { "tmpfs",       "/dev/shm",                  "tmpfs",      "mode=1777,smackfsroot=*" TMPFS_LIMITS_DEV_SHM, MS_NOSUID|MS_NODEV|MS_STRICTATIME,
+        { "tmpfs",       "/dev/shm",                  "tmpfs",      "mode=1777,smackfsroot=*",                 MS_NOSUID|MS_NODEV|MS_STRICTATIME,
           mac_smack_use, MNT_FATAL                  },
 #endif
-        { "tmpfs",       "/dev/shm",                  "tmpfs",      "mode=1777" TMPFS_LIMITS_DEV_SHM,               MS_NOSUID|MS_NODEV|MS_STRICTATIME,
+        { "tmpfs",       "/dev/shm",                  "tmpfs",      "mode=1777",                               MS_NOSUID|MS_NODEV|MS_STRICTATIME,
           NULL,          MNT_FATAL|MNT_IN_CONTAINER },
-        { "devpts",      "/dev/pts",                  "devpts",     "mode=620,gid=" STRINGIFY(TTY_GID),             MS_NOSUID|MS_NOEXEC,
+        { "devpts",      "/dev/pts",                  "devpts",     "mode=620,gid=" STRINGIFY(TTY_GID),        MS_NOSUID|MS_NOEXEC,
           NULL,          MNT_IN_CONTAINER           },
 #if ENABLE_SMACK
-        { "tmpfs",       "/run",                      "tmpfs",      "mode=755,smackfsroot=*" TMPFS_LIMITS_RUN,      MS_NOSUID|MS_NODEV|MS_STRICTATIME,
+        { "tmpfs",       "/run",                      "tmpfs",      "mode=755,smackfsroot=*" TMPFS_LIMITS_RUN, MS_NOSUID|MS_NODEV|MS_STRICTATIME,
           mac_smack_use, MNT_FATAL                  },
 #endif
-        { "tmpfs",       "/run",                      "tmpfs",      "mode=755" TMPFS_LIMITS_RUN,                    MS_NOSUID|MS_NODEV|MS_STRICTATIME,
+        { "tmpfs",       "/run",                      "tmpfs",      "mode=755" TMPFS_LIMITS_RUN,               MS_NOSUID|MS_NODEV|MS_STRICTATIME,
           NULL,          MNT_FATAL|MNT_IN_CONTAINER },
-        { "cgroup2",     "/sys/fs/cgroup",            "cgroup2",    "nsdelegate",                                   MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "cgroup2",     "/sys/fs/cgroup",            "cgroup2",    "nsdelegate",                              MS_NOSUID|MS_NOEXEC|MS_NODEV,
           cg_is_unified_wanted, MNT_IN_CONTAINER|MNT_CHECK_WRITABLE },
-        { "cgroup2",     "/sys/fs/cgroup",            "cgroup2",    NULL,                                           MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "cgroup2",     "/sys/fs/cgroup",            "cgroup2",    NULL,                                      MS_NOSUID|MS_NOEXEC|MS_NODEV,
           cg_is_unified_wanted, MNT_IN_CONTAINER|MNT_CHECK_WRITABLE },
-        { "tmpfs",       "/sys/fs/cgroup",            "tmpfs",      "mode=755" TMPFS_LIMITS_SYS_FS_CGROUP,          MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME,
+        { "tmpfs",       "/sys/fs/cgroup",            "tmpfs",      "mode=755" TMPFS_LIMITS_SYS_FS_CGROUP,     MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME,
           cg_is_legacy_wanted, MNT_FATAL|MNT_IN_CONTAINER },
-        { "cgroup2",     "/sys/fs/cgroup/unified",    "cgroup2",    "nsdelegate",                                   MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "cgroup2",     "/sys/fs/cgroup/unified",    "cgroup2",    "nsdelegate",                              MS_NOSUID|MS_NOEXEC|MS_NODEV,
           cg_is_hybrid_wanted, MNT_IN_CONTAINER|MNT_CHECK_WRITABLE },
-        { "cgroup2",     "/sys/fs/cgroup/unified",    "cgroup2",    NULL,                                           MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "cgroup2",     "/sys/fs/cgroup/unified",    "cgroup2",    NULL,                                      MS_NOSUID|MS_NOEXEC|MS_NODEV,
           cg_is_hybrid_wanted, MNT_IN_CONTAINER|MNT_CHECK_WRITABLE },
-        { "cgroup",      "/sys/fs/cgroup/systemd",    "cgroup",     "none,name=systemd,xattr",                      MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "cgroup",      "/sys/fs/cgroup/systemd",    "cgroup",     "none,name=systemd,xattr",                 MS_NOSUID|MS_NOEXEC|MS_NODEV,
           cg_is_legacy_wanted, MNT_IN_CONTAINER     },
-        { "cgroup",      "/sys/fs/cgroup/systemd",    "cgroup",     "none,name=systemd",                            MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "cgroup",      "/sys/fs/cgroup/systemd",    "cgroup",     "none,name=systemd",                       MS_NOSUID|MS_NOEXEC|MS_NODEV,
           cg_is_legacy_wanted, MNT_FATAL|MNT_IN_CONTAINER },
-        { "pstore",      "/sys/fs/pstore",            "pstore",     NULL,                                           MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "pstore",      "/sys/fs/pstore",            "pstore",     NULL,                                      MS_NOSUID|MS_NOEXEC|MS_NODEV,
           NULL,          MNT_NONE                   },
 #if ENABLE_EFI
-        { "efivarfs",    "/sys/firmware/efi/efivars", "efivarfs",   NULL,                                           MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "efivarfs",    "/sys/firmware/efi/efivars", "efivarfs",   NULL,                                      MS_NOSUID|MS_NOEXEC|MS_NODEV,
           is_efi_boot,   MNT_NONE                   },
 #endif
-        { "bpf",         "/sys/fs/bpf",               "bpf",        "mode=700",                                     MS_NOSUID|MS_NOEXEC|MS_NODEV,
+        { "bpf",         "/sys/fs/bpf",               "bpf",        "mode=700",                                MS_NOSUID|MS_NOEXEC|MS_NODEV,
           NULL,          MNT_NONE,                  },
 };
 
index 5865dfe93ea6b0592460e09f721ce1396744b178..16d40fedc0c0e5fa54f183984799db93e066d851 100644 (file)
@@ -326,23 +326,21 @@ static int append_bind_mounts(MountEntry **p, const BindMount *binds, size_t n)
 }
 
 static int append_tmpfs_mounts(MountEntry **p, const TemporaryFileSystem *tmpfs, size_t n) {
-        size_t i;
-        int r;
-
         assert(p);
 
-        for (i = 0; i < n; i++) {
+        for (size_t i = 0; i < n; i++) {
                 const TemporaryFileSystem *t = tmpfs + i;
                 _cleanup_free_ char *o = NULL, *str = NULL;
                 unsigned long flags;
                 bool ro = false;
+                int r;
 
                 if (!path_is_absolute(t->path))
                         return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
                                                "Path is not absolute: %s",
                                                t->path);
 
-                str = strjoin("mode=0755" TMPFS_LIMITS_TEMPORARY_FS ",", t->options);
+                str = strjoin("mode=0755" NESTED_TMPFS_LIMITS ",", t->options);
                 if (!str)
                         return -ENOMEM;
 
@@ -1259,6 +1257,7 @@ static bool home_read_only(
 int setup_namespace(
                 const char* root_directory,
                 const char* root_image,
+                const MountOptions *root_image_options,
                 const NamespaceInfo *ns_info,
                 char** read_write_paths,
                 char** read_only_paths,
@@ -1333,6 +1332,7 @@ int setup_namespace(
                                   root_hash ?: root_hash_decoded,
                                   root_hash_size,
                                   root_verity ?: verity_data,
+                                  root_image_options,
                                   dissect_image_flags,
                                   &dissected_image);
                 if (r < 0)
index b182223bd41dddfc50fa51d4c21f29be1e511daa..258bd7c131443865ae236ac3e24e3e8c230b932b 100644 (file)
@@ -75,6 +75,7 @@ struct TemporaryFileSystem {
 int setup_namespace(
                 const char *root_directory,
                 const char *root_image,
+                const MountOptions *root_image_options,
                 const NamespaceInfo *ns_info,
                 char **read_write_paths,
                 char **read_only_paths,
index b8a94a52ab6d21ca2bd844f83277c63eba297714..817069b3fe616e09ffa38516e1b591c205bfbbb2 100644 (file)
@@ -50,7 +50,8 @@ int mac_selinux_setup(bool *loaded_policy) {
 
         /* Already initialized by somebody else? */
         r = getcon_raw(&con);
-        if (r == 0) {
+        /* getcon_raw can return 0, and still give us a NULL pointer. */
+        if (r == 0 && con) {
                 initialized = !streq(con, "kernel");
                 freecon(con);
         }
index 4a57b8e3f9c32f65db09cff8f8b76f97f260f7d5..958243bc94b14747869c9d7805c6cfc5a8db2cba 100644 (file)
@@ -966,6 +966,7 @@ int transaction_add_job_and_dependencies(
                  * Given building up the transaction is a synchronous operation, attempt
                  * to load the unit immediately. */
                 if (r < 0 && manager_unit_file_maybe_loadable_from_cache(unit)) {
+                        sd_bus_error_free(e);
                         unit->load_state = UNIT_STUB;
                         r = unit_load(unit);
                         if (r < 0 || unit->load_state == UNIT_STUB)
index 66ac638401cf50d8c19fceda7073a37df7833d71..318cd37c6f264cf2d1ce89881ff4778d4468c57f 100644 (file)
@@ -244,7 +244,7 @@ static int run(int argc, char *argv[]) {
                 return log_error_errno(r, "Failed to read verity artefacts for %s: %m", arg_image);
         arg_flags |= arg_verity_data ? DISSECT_IMAGE_NO_PARTITION_TABLE : 0;
 
-        r = dissect_image_and_warn(d->fd, arg_image, arg_root_hash, arg_root_hash_size, arg_verity_data, arg_flags, &m);
+        r = dissect_image_and_warn(d->fd, arg_image, arg_root_hash, arg_root_hash_size, arg_verity_data, NULL, arg_flags, &m);
         if (r < 0)
                 return r;
 
index 82cd4040f9cfd1935e382eec8738f723128335ef..78abcbeff6ca4d4dd7ff29593cf2b5df6f8391c4 100644 (file)
@@ -604,6 +604,24 @@ static int prompt_root_password(void) {
         return 0;
 }
 
+static int find_shell(const char *path, const char *root) {
+        int r;
+
+        assert(path);
+
+        if (!valid_shell(path))
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "%s is not a valid shell", path);
+
+        r = chase_symlinks(path, root, CHASE_PREFIX_ROOT, NULL, NULL);
+        if (r < 0) {
+                const char *p;
+                p = prefix_roota(root, path);
+                return log_error_errno(r, "Failed to resolve shell %s: %m", p);
+        }
+
+        return 0;
+}
+
 static int prompt_root_shell(void) {
         int r;
 
@@ -625,10 +643,9 @@ static int prompt_root_shell(void) {
                         break;
                 }
 
-                if (!valid_shell(s)) {
-                        log_error("Specified shell invalid.");
+                r = find_shell(s, arg_root);
+                if (r < 0)
                         continue;
-                }
 
                 arg_root_shell = TAKE_PTR(s);
                 break;
@@ -685,7 +702,7 @@ static int write_root_passwd(const char *passwd_path, const char *password, cons
                 if (errno != ENOENT)
                         return -errno;
 
-                r = fchmod(fileno(passwd), 0000);
+                r = fchmod(fileno(passwd), 0644);
                 if (r < 0)
                         return -errno;
 
@@ -916,7 +933,7 @@ static int setup_image(char **ret_mount_dir, LoopDevice **ret_loop_device, Decry
         if (r < 0)
                 return log_error_errno(r, "Failed to set up loopback device: %m");
 
-        r = dissect_image_and_warn(d->fd, arg_image, NULL, 0, NULL, f, &dissected_image);
+        r = dissect_image_and_warn(d->fd, arg_image, NULL, 0, NULL, NULL, f, &dissected_image);
         if (r < 0)
                 return r;
 
@@ -982,16 +999,19 @@ static int help(void) {
                "     --root-password=PASSWORD               Set root password from plaintext password\n"
                "     --root-password-file=FILE              Set root password from file\n"
                "     --root-password-hashed=HASHED_PASSWORD Set root password from hashed password\n"
+               "     --root-shell=SHELL                     Set root shell\n"
                "     --prompt-locale                        Prompt the user for locale settings\n"
                "     --prompt-keymap                        Prompt the user for keymap settings\n"
                "     --prompt-timezone                      Prompt the user for timezone\n"
                "     --prompt-hostname                      Prompt the user for hostname\n"
                "     --prompt-root-password                 Prompt the user for root password\n"
+               "     --prompt-root-shell                    Prompt the user for root shell\n"
                "     --prompt                               Prompt for all of the above\n"
                "     --copy-locale                          Copy locale from host\n"
                "     --copy-keymap                          Copy keymap from host\n"
                "     --copy-timezone                        Copy timezone from host\n"
                "     --copy-root-password                   Copy root password from host\n"
+               "     --copy-root-shell                      Copy root shell from host\n"
                "     --copy                                 Copy locale, keymap, timezone, root password\n"
                "     --setup-machine-id                     Generate a new random machine ID\n"
                "     --force                                Overwrite existing files\n"
@@ -1167,9 +1187,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_ROOT_SHELL:
-                        if (!valid_shell(optarg))
-                                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
-                                                       "%s is not a valid shell path", optarg);
+                        r = find_shell(optarg, arg_root);
+                        if (r < 0)
+                                return r;
 
                         r = free_and_strdup(&arg_root_shell, optarg);
                         if (r < 0)
index a9478b9dbd886d2ce3dd96ccf76775e0747d9df3..02d8837ca9b09b8119a5d2054a8881122257d8e0 100644 (file)
@@ -665,7 +665,7 @@ static int enumerate_partitions(dev_t devnum) {
         if (r <= 0)
                 return r;
 
-        r = dissect_image(fd, NULL, 0, NULL, DISSECT_IMAGE_GPT_ONLY|DISSECT_IMAGE_NO_UDEV, &m);
+        r = dissect_image(fd, NULL, 0, NULL, NULL, DISSECT_IMAGE_GPT_ONLY|DISSECT_IMAGE_NO_UDEV, &m);
         if (r == -ENOPKG) {
                 log_debug_errno(r, "No suitable partition table found, ignoring.");
                 return 0;
index ba47688b0f187f940913bcedb59622eae5ba7757..b0f237c51b26d6ceb3500b96010d221610cc813a 100644 (file)
@@ -1480,9 +1480,9 @@ static int luks_format(
         _cleanup_(crypt_freep) struct crypt_device *cd = NULL;
         _cleanup_(erase_and_freep) void *volume_key = NULL;
         struct crypt_pbkdf_type good_pbkdf, minimal_pbkdf;
+        char suuid[ID128_UUID_STRING_MAX], **pp;
         _cleanup_free_ char *text = NULL;
         size_t volume_key_size;
-        char suuid[37], **pp;
         int slot = 0, r;
 
         assert(node);
@@ -1614,7 +1614,7 @@ static int make_partition_table(
         _cleanup_free_ char *path = NULL, *disk_uuid_as_string = NULL;
         uint64_t offset, size;
         sd_id128_t disk_uuid;
-        char uuids[37];
+        char uuids[ID128_UUID_STRING_MAX];
         int r;
 
         assert(fd >= 0);
index 5d0ac8653387de240f98b727e84efe86eff73f2c..a9f6f05e137435625a457e7f3eb9661f586fe245 100644 (file)
@@ -275,7 +275,7 @@ int user_record_add_binding(
                 gid_t gid) {
 
         _cleanup_(json_variant_unrefp) JsonVariant *new_binding_entry = NULL, *binding = NULL;
-        char smid[SD_ID128_STRING_MAX], partition_uuids[37], luks_uuids[37], fs_uuids[37];
+        char smid[SD_ID128_STRING_MAX], partition_uuids[ID128_UUID_STRING_MAX], luks_uuids[ID128_UUID_STRING_MAX], fs_uuids[ID128_UUID_STRING_MAX];
         _cleanup_free_ char *ip = NULL, *hd = NULL, *ip_auto = NULL, *lc = NULL, *lcm = NULL, *fst = NULL;
         sd_id128_t mid;
         int r;
index 261fbece7159640030bdb7c422adeffb498cffd6..a1b3147f658bb8ec93ea341b50150d28dc4d93cc 100644 (file)
@@ -139,16 +139,16 @@ static int curl_glue_timer_callback(CURLM *curl, long timeout_ms, void *userdata
                 return 0;
         }
 
-        usec = now(clock_boottime_or_monotonic()) + (usec_t) timeout_ms * USEC_PER_MSEC + USEC_PER_MSEC - 1;
+        usec = (usec_t) timeout_ms * USEC_PER_MSEC + USEC_PER_MSEC - 1;
 
         if (g->timer) {
-                if (sd_event_source_set_time(g->timer, usec) < 0)
+                if (sd_event_source_set_time_relative(g->timer, usec) < 0)
                         return -1;
 
                 if (sd_event_source_set_enabled(g->timer, SD_EVENT_ONESHOT) < 0)
                         return -1;
         } else {
-                if (sd_event_add_time(g->event, &g->timer, clock_boottime_or_monotonic(), usec, 0, curl_glue_on_timer, g) < 0)
+                if (sd_event_add_time_relative(g->event, &g->timer, clock_boottime_or_monotonic(), usec, 0, curl_glue_on_timer, g) < 0)
                         return -1;
 
                 (void) sd_event_source_set_description(g->timer, "curl-timer");
index 70b2c8b46c4e445821f87ac206d7eaaf855a424c..b2589271cacf2c0d6ff3014a6ebc429d653f2ead 100644 (file)
@@ -55,7 +55,7 @@ typedef struct CatalogItem {
 
 static void catalog_hash_func(const CatalogItem *i, struct siphash *state) {
         siphash24_compress(&i->id, sizeof(i->id), state);
-        siphash24_compress(i->language, strlen(i->language), state);
+        siphash24_compress_string(i->language, state);
 }
 
 static int catalog_compare_func(const CatalogItem *a, const CatalogItem *b) {
index cdcded2e24b4805a247f24b9ae7cc117381804d5..feff3bd9f03669033185088766b1a9ad2f3ef0d6 100644 (file)
@@ -1978,7 +1978,6 @@ static int post_change_thunk(sd_event_source *timer, uint64_t usec, void *userda
 }
 
 static void schedule_post_change(JournalFile *f) {
-        uint64_t now;
         int r;
 
         assert(f);
@@ -1992,13 +1991,7 @@ static void schedule_post_change(JournalFile *f) {
         if (r > 0)
                 return;
 
-        r = sd_event_now(sd_event_source_get_event(f->post_change_timer), CLOCK_MONOTONIC, &now);
-        if (r < 0) {
-                log_debug_errno(r, "Failed to get clock's now for scheduling ftruncate: %m");
-                goto fail;
-        }
-
-        r = sd_event_source_set_time(f->post_change_timer, now + f->post_change_timer_period);
+        r = sd_event_source_set_time_relative(f->post_change_timer, f->post_change_timer_period);
         if (r < 0) {
                 log_debug_errno(r, "Failed to set time for scheduling ftruncate: %m");
                 goto fail;
index 678654f773e36e7a8d242a5ed48e09865f4fa24f..dddbd7b3813fa65e5e7967fa8e94e762bb295378 100644 (file)
@@ -6,29 +6,34 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "alloc-util.h"
+#include "dlfcn-util.h"
+#include "fd-util.h"
 #include "fileio.h"
 #include "journal-qrcode.h"
+#include "locale-util.h"
 #include "macro.h"
+#include "terminal-util.h"
 
-#define WHITE_ON_BLACK "\033[40;37;1m"
-#define NORMAL "\033[0m"
+#define ANSI_WHITE_ON_BLACK "\033[40;37;1m"
 
 static void print_border(FILE *output, unsigned width) {
         unsigned x, y;
 
         /* Four rows of border */
         for (y = 0; y < 4; y += 2) {
-                fputs(WHITE_ON_BLACK, output);
+                fputs(ANSI_WHITE_ON_BLACK, output);
 
                 for (x = 0; x < 4 + width + 4; x++)
                         fputs("\342\226\210", output);
 
-                fputs(NORMAL "\n", output);
+                fputs(ANSI_NORMAL "\n", output);
         }
 }
 
 int print_qr_code(
                 FILE *output,
+                const char *prefix_text,
                 const void *seed,
                 size_t seed_size,
                 uint64_t start,
@@ -36,15 +41,38 @@ int print_qr_code(
                 const char *hn,
                 sd_id128_t machine) {
 
-        FILE *f;
-        char *url = NULL;
+        QRcode* (*sym_QRcode_encodeString)(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);
+        void (*sym_QRcode_free)(QRcode *qrcode);
+        _cleanup_(dlclosep) void *dl = NULL;
+        _cleanup_free_ char *url = NULL;
+        _cleanup_fclose_ FILE *f = NULL;
         size_t url_size = 0, i;
-        QRcode* qr;
         unsigned x, y;
+        QRcode* qr;
+        int r;
 
         assert(seed);
         assert(seed_size > 0);
 
+        /* If this is not an UTF-8 system or ANSI colors aren't supported/disabled don't print any QR
+         * codes */
+        if (!is_locale_utf8() || !colors_enabled())
+                return -EOPNOTSUPP;
+
+        dl = dlopen("libqrencode.so.4", RTLD_LAZY);
+        if (!dl)
+                return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
+                                       "QRCODE support is not installed: %s", dlerror());
+
+        r = dlsym_many_and_warn(
+                        dl,
+                        LOG_DEBUG,
+                        &sym_QRcode_encodeString, "QRcode_encodeString",
+                        &sym_QRcode_free, "QRcode_free",
+                        NULL);
+        if (r < 0)
+                return r;
+
         f = open_memstream_unlocked(&url, &url_size);
         if (!f)
                 return -ENOMEM;
@@ -65,20 +93,19 @@ int print_qr_code(
         if (hn)
                 fprintf(f, ";hostname=%s", hn);
 
-        if (ferror(f)) {
-                fclose(f);
-                free(url);
-                return -ENOMEM;
-        }
-
-        fclose(f);
+        r = fflush_and_check(f);
+        if (r < 0)
+                return r;
 
-        qr = QRcode_encodeString(url, 0, QR_ECLEVEL_L, QR_MODE_8, 1);
-        free(url);
+        f = safe_fclose(f);
 
+        qr = sym_QRcode_encodeString(url, 0, QR_ECLEVEL_L, QR_MODE_8, 1);
         if (!qr)
                 return -ENOMEM;
 
+        if (prefix_text)
+                fputs(prefix_text, output);
+
         print_border(output, qr->width);
 
         for (y = 0; y < (unsigned) qr->width; y += 2) {
@@ -87,7 +114,7 @@ int print_qr_code(
                 row1 = qr->data + qr->width * y;
                 row2 = row1 + qr->width;
 
-                fputs(WHITE_ON_BLACK, output);
+                fputs(ANSI_WHITE_ON_BLACK, output);
                 for (x = 0; x < 4; x++)
                         fputs("\342\226\210", output);
 
@@ -109,11 +136,11 @@ int print_qr_code(
 
                 for (x = 0; x < 4; x++)
                         fputs("\342\226\210", output);
-                fputs(NORMAL "\n", output);
+                fputs(ANSI_NORMAL "\n", output);
         }
 
         print_border(output, qr->width);
 
-        QRcode_free(qr);
+        sym_QRcode_free(qr);
         return 0;
 }
index 0774608edf4f7a078700631a0b1441f4c7d12b82..24ae9d32eebd7f523cd3ec5ffee00b11e8e0d369 100644 (file)
@@ -6,4 +6,4 @@
 
 #include "sd-id128.h"
 
-int print_qr_code(FILE *f, const void *seed, size_t seed_size, uint64_t start, uint64_t interval, const char *hn, sd_id128_t machine);
+int print_qr_code(FILE *f, const char *prefix_text, const void *seed, size_t seed_size, uint64_t start, uint64_t interval, const char *hn, sd_id128_t machine);
index 8d4897b942f778807e168415deecec262bec92cf..79daa43494db41d73d0d4df7e98817015e4706c5 100644 (file)
 #include "pager.h"
 #include "parse-util.h"
 #include "path-util.h"
+#include "pcre2-dlopen.h"
 #include "pretty-print.h"
+#include "random-util.h"
 #include "rlimit-util.h"
 #include "set.h"
 #include "sigbus.h"
+#include "stdio-util.h"
 #include "string-table.h"
 #include "strv.h"
-#include "stdio-util.h"
 #include "syslog-util.h"
 #include "terminal-util.h"
 #include "tmpfile-util.h"
@@ -160,20 +162,20 @@ typedef struct BootId {
 } BootId;
 
 #if HAVE_PCRE2
-DEFINE_TRIVIAL_CLEANUP_FUNC(pcre2_match_data*, pcre2_match_data_free);
-DEFINE_TRIVIAL_CLEANUP_FUNC(pcre2_code*, pcre2_code_free);
+DEFINE_TRIVIAL_CLEANUP_FUNC(pcre2_match_data*, sym_pcre2_match_data_free);
+DEFINE_TRIVIAL_CLEANUP_FUNC(pcre2_code*, sym_pcre2_code_free);
 
 static int pattern_compile(const char *pattern, unsigned flags, pcre2_code **out) {
         int errorcode, r;
         PCRE2_SIZE erroroffset;
         pcre2_code *p;
 
-        p = pcre2_compile((PCRE2_SPTR8) pattern,
-                          PCRE2_ZERO_TERMINATED, flags, &errorcode, &erroroffset, NULL);
+        p = sym_pcre2_compile((PCRE2_SPTR8) pattern,
+                              PCRE2_ZERO_TERMINATED, flags, &errorcode, &erroroffset, NULL);
         if (!p) {
                 unsigned char buf[LINE_MAX];
 
-                r = pcre2_get_error_message(errorcode, buf, sizeof buf);
+                r = sym_pcre2_get_error_message(errorcode, buf, sizeof buf);
 
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                        "Bad pattern \"%s\": %s", pattern,
@@ -183,7 +185,6 @@ static int pattern_compile(const char *pattern, unsigned flags, pcre2_code **out
         *out = p;
         return 0;
 }
-
 #endif
 
 static int add_matches_for_device(sd_journal *j, const char *devpath) {
@@ -1087,14 +1088,18 @@ static int parse_argv(int argc, char *argv[]) {
         if (arg_pattern) {
                 unsigned flags;
 
+                r = dlopen_pcre2();
+                if (r < 0)
+                        return r;
+
                 if (arg_case_sensitive >= 0)
                         flags = !arg_case_sensitive * PCRE2_CASELESS;
                 else {
-                        _cleanup_(pcre2_match_data_freep) pcre2_match_data *md = NULL;
+                        _cleanup_(sym_pcre2_match_data_freep) pcre2_match_data *md = NULL;
                         bool has_case;
-                        _cleanup_(pcre2_code_freep) pcre2_code *cs = NULL;
+                        _cleanup_(sym_pcre2_code_freep) pcre2_code *cs = NULL;
 
-                        md = pcre2_match_data_create(1, NULL);
+                        md = sym_pcre2_match_data_create(1, NULL);
                         if (!md)
                                 return log_oom();
 
@@ -1102,7 +1107,7 @@ static int parse_argv(int argc, char *argv[]) {
                         if (r < 0)
                                 return r;
 
-                        r = pcre2_match(cs, (PCRE2_SPTR8) arg_pattern, PCRE2_ZERO_TERMINATED, 0, 0, md, NULL);
+                        r = sym_pcre2_match(cs, (PCRE2_SPTR8) arg_pattern, PCRE2_ZERO_TERMINATED, 0, 0, md, NULL);
                         has_case = r >= 0;
 
                         flags = !has_case * PCRE2_CASELESS;
@@ -1774,12 +1779,14 @@ static int add_syslog_identifier(sd_journal *j) {
 static int setup_keys(void) {
 #if HAVE_GCRYPT
         size_t mpk_size, seed_size, state_size, i;
+        _cleanup_(unlink_and_freep) char *k = NULL;
+        _cleanup_free_ char *p = NULL;
         uint8_t *mpk, *seed, *state;
-        int fd = -1, r;
+        _cleanup_close_ int fd = -1;
         sd_id128_t machine, boot;
-        char *p = NULL, *k = NULL;
-        uint64_t n;
         struct stat st;
+        uint64_t n;
+        int r;
 
         r = stat("/var/log/journal", &st);
         if (r < 0 && !IN_SET(errno, ENOENT, ENOTDIR))
@@ -1805,21 +1812,15 @@ static int setup_keys(void) {
 
         if (arg_force) {
                 r = unlink(p);
-                if (r < 0 && errno != ENOENT) {
-                        r = log_error_errno(errno, "unlink(\"%s\") failed: %m", p);
-                        goto finish;
-                }
-        } else if (access(p, F_OK) >= 0) {
-                log_error("Sealing key file %s exists already. Use --force to recreate.", p);
-                r = -EEXIST;
-                goto finish;
-        }
+                if (r < 0 && errno != ENOENT)
+                        return log_error_errno(errno, "unlink(\"%s\") failed: %m", p);
+        } else if (access(p, F_OK) >= 0)
+                return log_error_errno(SYNTHETIC_ERRNO(EEXIST),
+                                       "Sealing key file %s exists already. Use --force to recreate.", p);
 
         if (asprintf(&k, "/var/log/journal/" SD_ID128_FORMAT_STR "/fss.tmp.XXXXXX",
-                     SD_ID128_FORMAT_VAL(machine)) < 0) {
-                r = log_oom();
-                goto finish;
-        }
+                     SD_ID128_FORMAT_VAL(machine)) < 0)
+                return log_oom();
 
         mpk_size = FSPRG_mskinbytes(FSPRG_RECOMMENDED_SECPAR);
         mpk = alloca(mpk_size);
@@ -1830,18 +1831,10 @@ static int setup_keys(void) {
         state_size = FSPRG_stateinbytes(FSPRG_RECOMMENDED_SECPAR);
         state = alloca(state_size);
 
-        fd = open("/dev/random", O_RDONLY|O_CLOEXEC|O_NOCTTY);
-        if (fd < 0) {
-                r = log_error_errno(errno, "Failed to open /dev/random: %m");
-                goto finish;
-        }
-
         log_info("Generating seed...");
-        r = loop_read_exact(fd, seed, seed_size, true);
-        if (r < 0) {
-                log_error_errno(r, "Failed to read random seed: %m");
-                goto finish;
-        }
+        r = genuine_random_bytes(seed, seed_size, RANDOM_BLOCK);
+        if (r < 0)
+                return log_error_errno(r, "Failed to acquire random seed: %m");
 
         log_info("Generating key pair...");
         FSPRG_GenMK(NULL, mpk, seed, seed_size, FSPRG_RECOMMENDED_SECPAR);
@@ -1856,18 +1849,25 @@ static int setup_keys(void) {
 
         safe_close(fd);
         fd = mkostemp_safe(k);
-        if (fd < 0) {
-                r = log_error_errno(fd, "Failed to open %s: %m", k);
-                goto finish;
+        if (fd < 0)
+                return log_error_errno(fd, "Failed to open %s: %m", k);
+
+        /* Enable secure remove, exclusion from dump, synchronous writing and in-place updating */
+        static const unsigned chattr_flags[] = {
+                FS_SECRM_FL,
+                FS_NODUMP_FL,
+                FS_SYNC_FL,
+                FS_NOCOW_FL,
+        };
+        for (size_t j = 0; j < ELEMENTSOF(chattr_flags); j++) {
+                r = chattr_fd(fd, chattr_flags[j], chattr_flags[j], NULL);
+                if (r < 0)
+                        log_full_errno(ERRNO_IS_NOT_SUPPORTED(r) ? LOG_DEBUG : LOG_WARNING, r,
+                                       "Failed to set file attribute 0x%x: %m", chattr_flags[j]);
         }
 
-        /* Enable secure remove, exclusion from dump, synchronous
-         * writing and in-place updating */
-        r = chattr_fd(fd, FS_SECRM_FL|FS_NODUMP_FL|FS_SYNC_FL|FS_NOCOW_FL, FS_SECRM_FL|FS_NODUMP_FL|FS_SYNC_FL|FS_NOCOW_FL, NULL);
-        if (r < 0)
-                log_warning_errno(r, "Failed to set file attributes: %m");
-
         struct FSSHeader h = {
+                .signature = { 'K', 'S', 'H', 'H', 'R', 'H', 'L', 'P' },
                 .machine_id = machine,
                 .boot_id = boot,
                 .header_size = htole64(sizeof(h)),
@@ -1877,24 +1877,18 @@ static int setup_keys(void) {
                 .fsprg_state_size = htole64(state_size),
         };
 
-        memcpy(h.signature, "KSHHRHLP", 8);
-
         r = loop_write(fd, &h, sizeof(h), false);
-        if (r < 0) {
-                log_error_errno(r, "Failed to write header: %m");
-                goto finish;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Failed to write header: %m");
 
         r = loop_write(fd, state, state_size, false);
-        if (r < 0) {
-                log_error_errno(r, "Failed to write state: %m");
-                goto finish;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Failed to write state: %m");
 
-        if (link(k, p) < 0) {
-                r = log_error_errno(errno, "Failed to link file: %m");
-                goto finish;
-        }
+        if (rename(k, p) < 0)
+                return log_error_errno(errno, "Failed to link file: %m");
+
+        k = mfree(k);
 
         if (on_tty()) {
                 fprintf(stderr,
@@ -1923,7 +1917,8 @@ static int setup_keys(void) {
         printf("/%llx-%llx\n", (unsigned long long) n, (unsigned long long) arg_interval);
 
         if (on_tty()) {
-                char tsb[FORMAT_TIMESPAN_MAX], *hn;
+                _cleanup_free_ char *hn = NULL;
+                char tsb[FORMAT_TIMESPAN_MAX];
 
                 fprintf(stderr,
                         "%s\n"
@@ -1932,7 +1927,6 @@ static int setup_keys(void) {
                         format_timespan(tsb, sizeof(tsb), arg_interval, 0));
 
                 hn = gethostname_malloc();
-
                 if (hn) {
                         hostname_cleanup(hn);
                         fprintf(stderr, "\nThe keys have been generated for host %s/" SD_ID128_FORMAT_STR ".\n", hn, SD_ID128_FORMAT_VAL(machine));
@@ -1940,28 +1934,15 @@ static int setup_keys(void) {
                         fprintf(stderr, "\nThe keys have been generated for host " SD_ID128_FORMAT_STR ".\n", SD_ID128_FORMAT_VAL(machine));
 
 #if HAVE_QRENCODE
-                /* If this is not an UTF-8 system don't print any QR codes */
-                if (is_locale_utf8()) {
-                        fputs("\nTo transfer the verification key to your phone please scan the QR code below:\n\n", stderr);
-                        print_qr_code(stderr, seed, seed_size, n, arg_interval, hn, machine);
-                }
+                (void) print_qr_code(stderr,
+                                     "\nTo transfer the verification key to your phone please scan the QR code below:\n\n",
+                                     seed, seed_size,
+                                     n, arg_interval,
+                                     hn, machine);
 #endif
-                free(hn);
         }
 
-        r = 0;
-
-finish:
-        safe_close(fd);
-
-        if (k) {
-                (void) unlink(k);
-                free(k);
-        }
-
-        free(p);
-
-        return r;
+        return 0;
 #else
         return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
                                "Forward-secure sealing not available.");
@@ -2630,12 +2611,12 @@ int main(int argc, char *argv[]) {
 
 #if HAVE_PCRE2
                         if (arg_compiled_pattern) {
-                                _cleanup_(pcre2_match_data_freep) pcre2_match_data *md = NULL;
+                                _cleanup_(sym_pcre2_match_data_freep) pcre2_match_data *md = NULL;
                                 const void *message;
                                 size_t len;
                                 PCRE2_SIZE *ovec;
 
-                                md = pcre2_match_data_create(1, NULL);
+                                md = sym_pcre2_match_data_create(1, NULL);
                                 if (!md)
                                         return log_oom();
 
@@ -2652,13 +2633,13 @@ int main(int argc, char *argv[]) {
 
                                 assert_se(message = startswith(message, "MESSAGE="));
 
-                                r = pcre2_match(arg_compiled_pattern,
-                                                message,
-                                                len - strlen("MESSAGE="),
-                                                0,      /* start at offset 0 in the subject */
-                                                0,      /* default options */
-                                                md,
-                                                NULL);
+                                r = sym_pcre2_match(arg_compiled_pattern,
+                                                    message,
+                                                    len - strlen("MESSAGE="),
+                                                    0,      /* start at offset 0 in the subject */
+                                                    0,      /* default options */
+                                                    md,
+                                                    NULL);
                                 if (r == PCRE2_ERROR_NOMATCH) {
                                         need_seek = true;
                                         continue;
@@ -2667,14 +2648,14 @@ int main(int argc, char *argv[]) {
                                         unsigned char buf[LINE_MAX];
                                         int r2;
 
-                                        r2 = pcre2_get_error_message(r, buf, sizeof buf);
+                                        r2 = sym_pcre2_get_error_message(r, buf, sizeof buf);
                                         log_error("Pattern matching failed: %s",
                                                   r2 < 0 ? "unknown error" : (char*) buf);
                                         r = -EINVAL;
                                         goto finish;
                                 }
 
-                                ovec = pcre2_get_ovector_pointer(md);
+                                ovec = sym_pcre2_get_ovector_pointer(md);
                                 highlight[0] = ovec[0];
                                 highlight[1] = ovec[1];
                         }
@@ -2766,7 +2747,7 @@ finish:
 
 #if HAVE_PCRE2
         if (arg_compiled_pattern) {
-                pcre2_code_free(arg_compiled_pattern);
+                sym_pcre2_code_free(arg_compiled_pattern);
 
                 /* --grep was used, no error was thrown, but the pattern didn't
                  * match anything. Let's mimic grep's behavior here and return
index 5865bf980962e7a73b7608fd54afcb090b61ff80..0d8e3618ee77742937fc7b8c376cc9035b67ab5b 100644 (file)
@@ -1677,27 +1677,20 @@ int server_schedule_sync(Server *s, int priority) {
                 return 0;
 
         if (s->sync_interval_usec > 0) {
-                usec_t when;
-
-                r = sd_event_now(s->event, CLOCK_MONOTONIC, &when);
-                if (r < 0)
-                        return r;
-
-                when += s->sync_interval_usec;
 
                 if (!s->sync_event_source) {
-                        r = sd_event_add_time(
+                        r = sd_event_add_time_relative(
                                         s->event,
                                         &s->sync_event_source,
                                         CLOCK_MONOTONIC,
-                                        when, 0,
+                                        s->sync_interval_usec, 0,
                                         server_dispatch_sync, s);
                         if (r < 0)
                                 return r;
 
                         r = sd_event_source_set_priority(s->sync_event_source, SD_EVENT_PRIORITY_IMPORTANT);
                 } else {
-                        r = sd_event_source_set_time(s->sync_event_source, when);
+                        r = sd_event_source_set_time_relative(s->sync_event_source, s->sync_interval_usec);
                         if (r < 0)
                                 return r;
 
@@ -1888,7 +1881,7 @@ static int server_connect_notify(Server *s) {
         if (sd_watchdog_enabled(false, &s->watchdog_usec) > 0) {
                 s->send_watchdog = true;
 
-                r = sd_event_add_time(s->event, &s->watchdog_event_source, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + s->watchdog_usec/2, s->watchdog_usec/4, dispatch_watchdog, s);
+                r = sd_event_add_time_relative(s->event, &s->watchdog_event_source, CLOCK_MONOTONIC, s->watchdog_usec/2, s->watchdog_usec/4, dispatch_watchdog, s);
                 if (r < 0)
                         return log_error_errno(r, "Failed to add watchdog time event: %m");
         }
@@ -2116,7 +2109,6 @@ static int server_idle_handler(sd_event_source *source, uint64_t usec, void *use
 
 int server_start_or_stop_idle_timer(Server *s) {
         _cleanup_(sd_event_source_unrefp) sd_event_source *source = NULL;
-        usec_t when;
         int r;
 
         assert(s);
@@ -2129,11 +2121,7 @@ int server_start_or_stop_idle_timer(Server *s) {
         if (s->idle_event_source)
                 return 1;
 
-        r = sd_event_now(s->event, CLOCK_MONOTONIC, &when);
-        if (r < 0)
-                return log_error_errno(r, "Failed to determine current time: %m");
-
-        r = sd_event_add_time(s->event, &source, CLOCK_MONOTONIC, usec_add(when, IDLE_TIMEOUT_USEC), 0, server_idle_handler, s);
+        r = sd_event_add_time_relative(s->event, &source, CLOCK_MONOTONIC, IDLE_TIMEOUT_USEC, 0, server_idle_handler, s);
         if (r < 0)
                 return log_error_errno(r, "Failed to allocate idle timer: %m");
 
@@ -2148,7 +2136,6 @@ int server_start_or_stop_idle_timer(Server *s) {
 }
 
 int server_refresh_idle_timer(Server *s) {
-        usec_t when;
         int r;
 
         assert(s);
@@ -2156,11 +2143,7 @@ int server_refresh_idle_timer(Server *s) {
         if (!s->idle_event_source)
                 return 0;
 
-        r = sd_event_now(s->event, CLOCK_MONOTONIC, &when);
-        if (r < 0)
-                return log_error_errno(r, "Failed to determine current time: %m");
-
-        r = sd_event_source_set_time(s->idle_event_source, usec_add(when, IDLE_TIMEOUT_USEC));
+        r = sd_event_source_set_time_relative(s->idle_event_source, IDLE_TIMEOUT_USEC);
         if (r < 0)
                 return log_error_errno(r, "Failed to refresh idle timer: %m");
 
index 5796f77cac365c80c02da0ca3e2e0a1720060f4c..3a590bdc6c50777a4033359d2a05f3a793b543c0 100644 (file)
@@ -101,7 +101,11 @@ journald_gperf_c = custom_target(
 
 systemd_cat_sources = files('cat.c')
 
-journalctl_sources = files('journalctl.c')
+journalctl_sources = files('''
+        journalctl.c
+        pcre2-dlopen.c
+        pcre2-dlopen.h
+'''.split())
 
 if conf.get('HAVE_QRENCODE') == 1
         journalctl_sources += files('journal-qrcode.c',
diff --git a/src/journal/pcre2-dlopen.c b/src/journal/pcre2-dlopen.c
new file mode 100644 (file)
index 0000000..1e1108c
--- /dev/null
@@ -0,0 +1,57 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#include "alloc-util.h"
+#include "dlfcn-util.h"
+#include "pcre2-dlopen.h"
+
+#if HAVE_PCRE2
+static void *pcre2_dl = NULL;
+
+pcre2_match_data* (*sym_pcre2_match_data_create)(uint32_t, pcre2_general_context *);
+void (*sym_pcre2_match_data_free)(pcre2_match_data *);
+void (*sym_pcre2_code_free)(pcre2_code *);
+pcre2_code* (*sym_pcre2_compile)(PCRE2_SPTR, PCRE2_SIZE, uint32_t, int *, PCRE2_SIZE *, pcre2_compile_context *);
+int (*sym_pcre2_get_error_message)(int, PCRE2_UCHAR *, PCRE2_SIZE);
+int (*sym_pcre2_match)(const pcre2_code *, PCRE2_SPTR, PCRE2_SIZE, PCRE2_SIZE, uint32_t, pcre2_match_data *, pcre2_match_context *);
+PCRE2_SIZE* (*sym_pcre2_get_ovector_pointer)(pcre2_match_data *);
+
+int dlopen_pcre2(void) {
+        _cleanup_(dlclosep) void *dl = NULL;
+        int r;
+
+        if (pcre2_dl)
+                return 0; /* Already loaded */
+
+        dl = dlopen("libpcre2-8.so.0", RTLD_LAZY);
+        if (!dl)
+                return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
+                                       "PCRE2 support is not installed: %s", dlerror());
+
+        r = dlsym_many_and_warn(
+                        dl,
+                        LOG_ERR,
+                        &sym_pcre2_match_data_create, "pcre2_match_data_create_8",
+                        &sym_pcre2_match_data_free, "pcre2_match_data_free_8",
+                        &sym_pcre2_code_free, "pcre2_code_free_8",
+                        &sym_pcre2_compile, "pcre2_compile_8",
+                        &sym_pcre2_get_error_message, "pcre2_get_error_message_8",
+                        &sym_pcre2_match, "pcre2_match_8",
+                        &sym_pcre2_get_ovector_pointer, "pcre2_get_ovector_pointer_8",
+                        NULL);
+        if (r < 0)
+                return r;
+
+        /* Note that we never release the reference here, because there's no real reason to, after all this
+         * was traditionally a regular shared library dependency which lives forever too. */
+        pcre2_dl = TAKE_PTR(dl);
+
+        return 1;
+}
+
+#else
+
+int dlopen_pcre2(void) {
+        return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
+                               "PCRE2 support is not compiled in.");
+}
+#endif
diff --git a/src/journal/pcre2-dlopen.h b/src/journal/pcre2-dlopen.h
new file mode 100644 (file)
index 0000000..e7cb0a5
--- /dev/null
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#if HAVE_PCRE2
+
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
+
+extern pcre2_match_data* (*sym_pcre2_match_data_create)(uint32_t, pcre2_general_context *);
+extern void (*sym_pcre2_match_data_free)(pcre2_match_data *);
+extern void (*sym_pcre2_code_free)(pcre2_code *);
+extern pcre2_code* (*sym_pcre2_compile)(PCRE2_SPTR, PCRE2_SIZE, uint32_t, int *, PCRE2_SIZE *, pcre2_compile_context *);
+extern int (*sym_pcre2_get_error_message)(int, PCRE2_UCHAR *, PCRE2_SIZE);
+extern int (*sym_pcre2_match)(const pcre2_code *, PCRE2_SPTR, PCRE2_SIZE, PCRE2_SIZE, uint32_t, pcre2_match_data *, pcre2_match_context *);
+extern PCRE2_SIZE* (*sym_pcre2_get_ovector_pointer)(pcre2_match_data *);
+#endif
+
+int dlopen_pcre2(void);
index 6c0e27ba3a6ef991600bf36e65b27916c1142589..97fc3bcc3525de24ebaac9b6cecbe515dea5347f 100644 (file)
@@ -18,8 +18,9 @@ fi
 
 MACHINE_ID=$KERNEL_INSTALL_MACHINE_ID
 
-ENTRY_DIR="/$MACHINE_ID/$KERNEL_VERSION"
-BOOT_ROOT=${ENTRY_DIR_ABS%$ENTRY_DIR}
+BOOT_ROOT=${ENTRY_DIR_ABS%/$MACHINE_ID/$KERNEL_VERSION}
+BOOT_MNT=$(stat -c %m $BOOT_ROOT)
+ENTRY_DIR=/${ENTRY_DIR_ABS#$BOOT_MNT}
 
 if [[ $COMMAND == remove ]]; then
     rm -f "$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION.conf"
index baf7bb2ef4ad79714fd01f624fdf486b1dc40f1b..9ce6dcd02c3b5611febadfaba091208cd6557f60 100644 (file)
@@ -109,8 +109,9 @@ int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_stat
 int dhcp6_option_parse_ip6addrs(uint8_t *optval, uint16_t optlen,
                                 struct in6_addr **addrs, size_t count,
                                 size_t *allocated);
-int dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen,
-                                  char ***str_arr);
+int dhcp6_option_parse_domainname_list(const uint8_t *optval, uint16_t optlen,
+                                       char ***str_arr);
+int dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen, char **str);
 
 int dhcp6_network_bind_udp_socket(int ifindex, struct in6_addr *address);
 int dhcp6_network_send_udp_socket(int s, struct in6_addr *address,
index e004f48b4e24f441bd5eef669a5d9cfe45157d90..df6c95e0b360c0dac6e3ef86ade805c0e4624c76 100644 (file)
@@ -35,6 +35,7 @@ struct sd_dhcp6_lease {
         size_t ntp_allocated;
         char **ntp_fqdn;
         size_t ntp_fqdn_count;
+        char *fqdn;
 };
 
 int dhcp6_lease_ia_rebind_expire(const DHCP6IA *ia, uint32_t *expire);
@@ -57,5 +58,6 @@ int dhcp6_lease_set_domains(sd_dhcp6_lease *lease, uint8_t *optval,
 int dhcp6_lease_set_ntp(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen);
 int dhcp6_lease_set_sntp(sd_dhcp6_lease *lease, uint8_t *optval,
                          size_t optlen) ;
+int dhcp6_lease_set_fqdn(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
 
 int dhcp6_lease_new(sd_dhcp6_lease **ret);
index fa43587686b224d6a41ffda415380ed7fa377892..cfa6bb50086aa7e859468ddf59aa5d933f9cabb8 100644 (file)
@@ -642,59 +642,103 @@ int dhcp6_option_parse_ip6addrs(uint8_t *optval, uint16_t optlen,
         return count;
 }
 
-int dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen, char ***str_arr) {
-        size_t pos = 0, idx = 0;
-        _cleanup_strv_free_ char **names = NULL;
+static int parse_domain(const uint8_t **data, uint16_t *len, char **out_domain) {
+        _cleanup_free_ char *ret = NULL;
+        size_t n = 0, allocated = 0;
+        const uint8_t *optval = *data;
+        uint16_t optlen = *len;
+        bool first = true;
         int r;
 
-        assert_return(optlen > 1, -ENODATA);
-        assert_return(optval[optlen - 1] == '\0', -EINVAL);
-
-        while (pos < optlen) {
-                _cleanup_free_ char *ret = NULL;
-                size_t n = 0, allocated = 0;
-                bool first = true;
+        if (optlen <= 1)
+                return -ENODATA;
 
-                for (;;) {
-                        const char *label;
-                        uint8_t c;
+        for (;;) {
+                const char *label;
+                uint8_t c;
 
-                        c = optval[pos++];
+                if (optlen == 0)
+                        break;
 
-                        if (c == 0)
-                                /* End of name */
-                                break;
-                        if (c > 63)
-                                return -EBADMSG;
+                c = *optval;
+                optval++;
+                optlen--;
 
-                        /* Literal label */
-                        label = (const char *)&optval[pos];
-                        pos += c;
-                        if (pos >= optlen)
-                                return -EMSGSIZE;
+                if (c == 0)
+                        /* End label */
+                        break;
+                if (c > 63)
+                        return -EBADMSG;
+                if (c > optlen)
+                        return -EMSGSIZE;
 
-                        if (!GREEDY_REALLOC(ret, allocated, n + !first + DNS_LABEL_ESCAPED_MAX))
-                                return -ENOMEM;
+                /* Literal label */
+                label = (const char *)optval;
+                optval += c;
+                optlen -= c;
 
-                        if (first)
-                                first = false;
-                        else
-                                ret[n++] = '.';
+                if (!GREEDY_REALLOC(ret, allocated, n + !first + DNS_LABEL_ESCAPED_MAX))
+                        return -ENOMEM;
 
-                        r = dns_label_escape(label, c, ret + n, DNS_LABEL_ESCAPED_MAX);
-                        if (r < 0)
-                                return r;
+                if (first)
+                        first = false;
+                else
+                        ret[n++] = '.';
 
-                        n += r;
-                }
+                r = dns_label_escape(label, c, ret + n, DNS_LABEL_ESCAPED_MAX);
+                if (r < 0)
+                        return r;
 
-                if (n == 0)
-                        continue;
+                n += r;
+        }
 
+        if (n) {
                 if (!GREEDY_REALLOC(ret, allocated, n + 1))
                         return -ENOMEM;
-
                 ret[n] = 0;
+        }
+
+        *out_domain = TAKE_PTR(ret);
+        *data = optval;
+        *len = optlen;
+
+        return n;
+}
+
+int dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen, char **str) {
+        _cleanup_free_ char *domain = NULL;
+        int r;
+
+        r = parse_domain(&optval, &optlen, &domain);
+        if (r < 0)
+                return r;
+        if (r == 0)
+                return -ENODATA;
+        if (optlen != 0)
+                return -EINVAL;
+
+        *str = TAKE_PTR(domain);
+        return 0;
+}
+
+int dhcp6_option_parse_domainname_list(const uint8_t *optval, uint16_t optlen, char ***str_arr) {
+        size_t idx = 0;
+        _cleanup_strv_free_ char **names = NULL;
+        int r;
+
+        if (optlen <= 1)
+                return -ENODATA;
+        if (optval[optlen - 1] != '\0')
+                return -EINVAL;
+
+        while (optlen > 0) {
+                _cleanup_free_ char *ret = NULL;
+
+                r = parse_domain(&optval, &optlen, &ret);
+                if (r < 0)
+                        return r;
+                if (r == 0)
+                        continue;
 
                 r = strv_extend(&names, ret);
                 if (r < 0)
index 5cdb82bc6f30298ec3b3fba0df6f70a04407ee09..66499f7be01feee7d76c959951007ee4ab9218d7 100644 (file)
@@ -1282,6 +1282,13 @@ static int client_parse_message(
 
                         break;
 
+                case SD_DHCP6_OPTION_FQDN:
+                        r = dhcp6_lease_set_fqdn(lease, optval, optlen);
+                        if (r < 0)
+                                return r;
+
+                        break;
+
                 case SD_DHCP6_OPTION_INFORMATION_REFRESH_TIME:
                         if (optlen != 4)
                                 return -EINVAL;
index 4eee10ea896b7264236181e0f0e2e185001b276f..9aad22124dce6cc9ddb51e36fe040d07e5ed73d3 100644 (file)
@@ -236,7 +236,7 @@ int dhcp6_lease_set_domains(sd_dhcp6_lease *lease, uint8_t *optval,
         if (!optlen)
                 return 0;
 
-        r = dhcp6_option_parse_domainname(optval, optlen, &domains);
+        r = dhcp6_option_parse_domainname_list(optval, optlen, &domains);
         if (r < 0)
                 return 0;
 
@@ -294,8 +294,8 @@ int dhcp6_lease_set_ntp(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen) {
                         break;
 
                 case DHCP6_NTP_SUBOPTION_SRV_FQDN:
-                        r = dhcp6_option_parse_domainname(subval, sublen,
-                                                          &servers);
+                        r = dhcp6_option_parse_domainname_list(subval, sublen,
+                                                               &servers);
                         if (r < 0)
                                 return 0;
 
@@ -365,6 +365,38 @@ int sd_dhcp6_lease_get_ntp_fqdn(sd_dhcp6_lease *lease, char ***ntp_fqdn) {
         return -ENOENT;
 }
 
+int dhcp6_lease_set_fqdn(sd_dhcp6_lease *lease, const uint8_t *optval,
+                         size_t optlen) {
+        int r;
+        char *fqdn;
+
+        assert_return(lease, -EINVAL);
+        assert_return(optval, -EINVAL);
+
+        if (optlen < 2)
+                return -ENODATA;
+
+        /* Ignore the flags field, it doesn't carry any useful
+           information for clients. */
+        r = dhcp6_option_parse_domainname(optval + 1, optlen - 1, &fqdn);
+        if (r < 0)
+                return r;
+
+        return free_and_replace(lease->fqdn, fqdn);
+}
+
+int sd_dhcp6_lease_get_fqdn(sd_dhcp6_lease *lease, const char **fqdn) {
+        assert_return(lease, -EINVAL);
+        assert_return(fqdn, -EINVAL);
+
+        if (lease->fqdn) {
+                *fqdn = lease->fqdn;
+                return 0;
+        }
+
+        return -ENOENT;
+}
+
 static sd_dhcp6_lease *dhcp6_lease_free(sd_dhcp6_lease *lease) {
         assert(lease);
 
@@ -373,6 +405,7 @@ static sd_dhcp6_lease *dhcp6_lease_free(sd_dhcp6_lease *lease) {
         dhcp6_lease_free_ia(&lease->pd);
 
         free(lease->dns);
+        free(lease->fqdn);
 
         lease->domains = strv_free(lease->domains);
 
index 7383c84724a06a9abe183e563b65a871acd2c702..6163cf169143467713c6b64213f840f20e872a59 100644 (file)
@@ -578,6 +578,15 @@ _public_ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p, int dynamic) {
 
         cur = p;
 
+        /* If RAs have already been sent, send an RA immediately to announce the newly-added prefix */
+        if (ra->ra_sent > 0) {
+            r = radv_send(ra, NULL, ra->lifetime);
+            if (r < 0)
+                    log_radv_errno(r, "Unable to send Router Advertisement for added prefix: %m");
+            else
+                    log_radv("Sent Router Advertisement for added prefix");
+        }
+
  update:
         r = sd_event_now(ra->event, clock_boottime_or_monotonic(), &time_now);
         if (r < 0)
@@ -686,6 +695,15 @@ _public_ int sd_radv_add_route_prefix(sd_radv *ra, sd_radv_route_prefix *p, int
                 return 0;
         }
 
+        /* If RAs have already been sent, send an RA immediately to announce the newly-added route prefix */
+        if (ra->ra_sent > 0) {
+            r = radv_send(ra, NULL, ra->lifetime);
+            if (r < 0)
+                    log_radv_errno(r, "Unable to send Router Advertisement for added route prefix: %m");
+            else
+                    log_radv("Sent Router Advertisement for added route prefix");
+        }
+
  update:
         r = sd_event_now(ra->event, clock_boottime_or_monotonic(), &time_now);
         if (r < 0)
index 8f2f4462be3513f9a0ad34c7f3c9cf2010c293b6..4a0b71be1cf036fc8ef3e52302a4e1cbaccd357a 100644 (file)
@@ -514,7 +514,6 @@ static int test_addr_acq_recv_discover(size_t size, DHCPMessage *discover) {
 }
 
 static void test_addr_acq(sd_event *e) {
-        usec_t time_now = now(clock_boottime_or_monotonic());
         sd_dhcp_client *client;
         int res, r;
 
@@ -535,10 +534,11 @@ static void test_addr_acq(sd_event *e) {
 
         callback_recv = test_addr_acq_recv_discover;
 
-        assert_se(sd_event_add_time(e, &test_hangcheck,
-                                    clock_boottime_or_monotonic(),
-                                    time_now + 2 * USEC_PER_SEC, 0,
-                                    test_dhcp_hangcheck, NULL) >= 0);
+        assert_se(sd_event_add_time_relative(
+                                  e, &test_hangcheck,
+                                  clock_boottime_or_monotonic(),
+                                  2 * USEC_PER_SEC, 0,
+                                  test_dhcp_hangcheck, NULL) >= 0);
 
         res = sd_dhcp_client_start(client);
         assert_se(IN_SET(res, 0, -EINPROGRESS));
index 7af7d670b5917ca2879d52c17855839f733391ae..e198814ba0732a931ca7f054aa8959e9ac284ce3 100644 (file)
@@ -20,6 +20,8 @@
 #include "macro.h"
 #include "memory-util.h"
 #include "socket-util.h"
+#include "string-util.h"
+#include "strv.h"
 #include "tests.h"
 #include "time-util.h"
 #include "virt.h"
@@ -106,6 +108,52 @@ static int test_client_basic(sd_event *e) {
         return 0;
 }
 
+static int test_parse_domain(sd_event *e) {
+        uint8_t *data;
+        char *domain;
+        char **list;
+        int r;
+
+        log_debug("/* %s */", __func__);
+
+        data = (uint8_t []) { 7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 3, 'c', 'o', 'm', 0 };
+        r = dhcp6_option_parse_domainname(data, 13, &domain);
+        assert_se(r == 0);
+        assert_se(domain);
+        assert_se(streq(domain, "example.com"));
+        free(domain);
+
+        data = (uint8_t []) { 4, 't', 'e', 's', 't' };
+        r = dhcp6_option_parse_domainname(data, 5, &domain);
+        assert_se(r == 0);
+        assert_se(domain);
+        assert_se(streq(domain, "test"));
+        free(domain);
+
+        data = (uint8_t []) { 0 };
+        r = dhcp6_option_parse_domainname(data, 1, &domain);
+        assert_se(r < 0);
+
+        data = (uint8_t []) { 7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 3, 'c', 'o', 'm', 0,
+                              6, 'f', 'o', 'o', 'b', 'a', 'r', 0 };
+        r = dhcp6_option_parse_domainname_list(data, 21, &list);
+        assert_se(r == 2);
+        assert_se(list);
+        assert_se(streq(list[0], "example.com"));
+        assert_se(streq(list[1], "foobar"));
+        strv_free(list);
+
+        data = (uint8_t []) { 1, 'a', 0, 20, 'b', 'c' };
+        r = dhcp6_option_parse_domainname_list(data, 6, &list);
+        assert_se(r < 0);
+
+        data = (uint8_t []) { 0 , 0 };
+        r = dhcp6_option_parse_domainname_list(data, 2, &list);
+        assert_se(r < 0);
+
+        return 0;
+}
+
 static int test_option(sd_event *e) {
         uint8_t packet[] = {
                 'F', 'O', 'O',
@@ -330,7 +378,7 @@ static uint8_t msg_advertise[198] = {
         0x53, 0x00, 0x07, 0x00, 0x01, 0x00
 };
 
-static uint8_t msg_reply[173] = {
+static uint8_t msg_reply[191] = {
         0x07, 0xf7, 0x4e, 0x57, 0x00, 0x02, 0x00, 0x0e,
         0x00, 0x01, 0x00, 0x01, 0x19, 0x40, 0x5c, 0x53,
         0x78, 0x2b, 0xcb, 0xb3, 0x6d, 0x53, 0x00, 0x01,
@@ -352,7 +400,9 @@ static uint8_t msg_reply[173] = {
         0x61, 0x62, 0x05, 0x69, 0x6e, 0x74, 0x72, 0x61,
         0x00, 0x00, 0x1f, 0x00, 0x10, 0x20, 0x01, 0x0d,
         0xb8, 0xde, 0xad, 0xbe, 0xef, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x01
+        0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, 0x00,
+        0x0e, 0x01, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e,
+        0x74, 0x05, 0x69, 0x6e, 0x74, 0x72, 0x61
 };
 
 static uint8_t fqdn_wire[16] = {
@@ -747,6 +797,7 @@ static void test_client_information_cb(sd_dhcp6_client *client, int event,
         const struct in6_addr *addrs;
         struct in6_addr address = { { { 0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01 } } };
         char **domains;
+        const char *fqdn;
 
         log_debug("/* %s */", __func__);
 
@@ -759,6 +810,9 @@ static void test_client_information_cb(sd_dhcp6_client *client, int event,
         assert_se(!strcmp("lab.intra", domains[0]));
         assert_se(domains[1] == NULL);
 
+        assert_se(sd_dhcp6_lease_get_fqdn(lease, &fqdn) >= 0);
+        assert_se(streq(fqdn, "client.intra"));
+
         assert_se(sd_dhcp6_lease_get_dns(lease, &addrs) == 1);
         assert_se(!memcmp(addrs, &msg_advertise[124], 16));
 
@@ -888,7 +942,6 @@ int dhcp6_network_bind_udp_socket(int ifindex, struct in6_addr *local_address) {
 
 static int test_client_solicit(sd_event *e) {
         sd_dhcp6_client *client;
-        usec_t time_now = now(clock_boottime_or_monotonic());
         struct in6_addr address = { { { 0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01 } } };
         int val;
 
@@ -914,9 +967,9 @@ static int test_client_solicit(sd_event *e) {
         assert_se(sd_dhcp6_client_set_callback(client,
                                                test_client_information_cb, e) >= 0);
 
-        assert_se(sd_event_add_time(e, &hangcheck, clock_boottime_or_monotonic(),
-                                    time_now + 2 * USEC_PER_SEC, 0,
-                                    test_hangcheck, NULL) >= 0);
+        assert_se(sd_event_add_time_relative(e, &hangcheck, clock_boottime_or_monotonic(),
+                                             2 * USEC_PER_SEC, 0,
+                                             test_hangcheck, NULL) >= 0);
 
         assert_se(sd_dhcp6_client_set_local_address(client, &address) >= 0);
 
@@ -945,6 +998,7 @@ int main(int argc, char *argv[]) {
         test_option_status(e);
         test_advertise_option(e);
         test_client_solicit(e);
+        test_parse_domain(e);
 
         return 0;
 }
index d759ec03a8ad9efbda2a28cfb66855bfc4a7372a..942a128cae2d6f0aabc3206c0acf6b14689697b3 100644 (file)
@@ -293,7 +293,6 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat
 static void test_ra(void) {
         sd_event *e;
         sd_radv *ra;
-        usec_t time_now = now(clock_boottime_or_monotonic());
         unsigned i;
 
         printf("* %s\n", __FUNCTION__);
@@ -339,9 +338,10 @@ static void test_ra(void) {
         assert_se(sd_event_add_io(e, &recv_router_advertisement, test_fd[0],
                                   EPOLLIN, radv_recv, ra) >= 0);
 
-        assert_se(sd_event_add_time(e, &test_hangcheck, clock_boottime_or_monotonic(),
-                                 time_now + 2 *USEC_PER_SEC, 0,
-                                 test_rs_hangcheck, NULL) >= 0);
+        assert_se(sd_event_add_time_relative(
+                                  e, &test_hangcheck, clock_boottime_or_monotonic(),
+                                  2 *USEC_PER_SEC, 0,
+                                  test_rs_hangcheck, NULL) >= 0);
 
         assert_se(sd_radv_start(ra) >= 0);
 
index 5d1e66fcdc96900772d66866f71edc8461c9d64e..2c4ffb94dd8f278093aa8a0c0392a72a3ce58e12 100644 (file)
@@ -217,7 +217,7 @@ static int send_ra(uint8_t flags) {
         advertisement[5] = flags;
 
         assert_se(write(test_fd[1], advertisement, sizeof(advertisement)) ==
-               sizeof(advertisement));
+                  sizeof(advertisement));
 
         if (verbose)
                 printf("  sent RA with flag 0x%02x\n", flags);
@@ -272,7 +272,6 @@ static void test_callback(sd_ndisc *nd, sd_ndisc_event event, sd_ndisc_router *r
 static void test_rs(void) {
         sd_event *e;
         sd_ndisc *nd;
-        usec_t time_now = now(clock_boottime_or_monotonic());
 
         if (verbose)
                 printf("* %s\n", __FUNCTION__);
@@ -290,9 +289,10 @@ static void test_rs(void) {
         assert_se(sd_ndisc_set_mac(nd, &mac_addr) >= 0);
         assert_se(sd_ndisc_set_callback(nd, test_callback, e) >= 0);
 
-        assert_se(sd_event_add_time(e, &test_hangcheck, clock_boottime_or_monotonic(),
-                                 time_now + 2 *USEC_PER_SEC, 0,
-                                 test_rs_hangcheck, NULL) >= 0);
+        assert_se(sd_event_add_time_relative(
+                                  e, &test_hangcheck, clock_boottime_or_monotonic(),
+                                  30 * USEC_PER_SEC, 0,
+                                  test_rs_hangcheck, NULL) >= 0);
 
         assert_se(sd_ndisc_stop(nd) >= 0);
         assert_se(sd_ndisc_start(nd) >= 0);
@@ -373,7 +373,6 @@ static int test_timeout_value(uint8_t flags) {
 static void test_timeout(void) {
         sd_event *e;
         sd_ndisc *nd;
-        usec_t time_now = now(clock_boottime_or_monotonic());
 
         if (verbose)
                 printf("* %s\n", __FUNCTION__);
@@ -392,9 +391,10 @@ static void test_timeout(void) {
         assert_se(sd_ndisc_set_ifindex(nd, 42) >= 0);
         assert_se(sd_ndisc_set_mac(nd, &mac_addr) >= 0);
 
-        assert_se(sd_event_add_time(e, &test_hangcheck, clock_boottime_or_monotonic(),
-                                 time_now + 2U * USEC_PER_SEC, 0,
-                                 test_rs_hangcheck, NULL) >= 0);
+        assert_se(sd_event_add_time_relative(
+                                  e, &test_hangcheck, clock_boottime_or_monotonic(),
+                                  30 * USEC_PER_SEC, 0,
+                                  test_rs_hangcheck, NULL) >= 0);
 
         assert_se(sd_ndisc_start(nd) >= 0);
 
index 1e654b49ea3c1b07b10b87327bd993efa65a1917..3168a4dcc4fd41d9390be83cdf9f58e9be9296cb 100644 (file)
@@ -721,3 +721,9 @@ global:
         sd_journal_enumerate_available_data;
         sd_journal_enumerate_available_unique;
 } LIBSYSTEMD_245;
+
+LIBSYSTEMD_247 {
+global:
+        sd_event_add_time_relative;
+        sd_event_source_set_time_relative;
+} LIBSYSTEMD_246;
index 860eb048ff5be1975a3fdfb140fbaa25587dacb7..8b338f5db6c910d21aefdb0da16af5e560b1946b 100644 (file)
@@ -1146,6 +1146,31 @@ _public_ int sd_event_add_time(
         return 0;
 }
 
+_public_ int sd_event_add_time_relative(
+                sd_event *e,
+                sd_event_source **ret,
+                clockid_t clock,
+                uint64_t usec,
+                uint64_t accuracy,
+                sd_event_time_handler_t callback,
+                void *userdata) {
+
+        usec_t t;
+        int r;
+
+        /* Same as sd_event_add_time() but operates relative to the event loop's current point in time, and
+         * checks for overflow. */
+
+        r = sd_event_now(e, clock, &t);
+        if (r < 0)
+                return r;
+
+        if (usec >= USEC_INFINITY - t)
+                return -EOVERFLOW;
+
+        return sd_event_add_time(e, ret, clock, t + usec, accuracy, callback, userdata);
+}
+
 static int signal_exit_callback(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
         assert(s);
 
@@ -2402,6 +2427,23 @@ _public_ int sd_event_source_set_time(sd_event_source *s, uint64_t usec) {
         return 0;
 }
 
+_public_ int sd_event_source_set_time_relative(sd_event_source *s, uint64_t usec) {
+        usec_t t;
+        int r;
+
+        assert_return(s, -EINVAL);
+        assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
+
+        r = sd_event_now(s->event, event_source_type_to_clock(s->type), &t);
+        if (r < 0)
+                return r;
+
+        if (usec >= USEC_INFINITY - t)
+                return -EOVERFLOW;
+
+        return sd_event_source_set_time(s, t + usec);
+}
+
 _public_ int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec) {
         assert_return(s, -EINVAL);
         assert_return(usec, -EINVAL);
index 75a48300adbcb212af606620405a183fe14c36d3..40e9790159a99d5bc6bdd4a2ae9c4aa09386741a 100644 (file)
@@ -1720,26 +1720,26 @@ static int delay_shutdown_or_sleep(
                 const char *unit_name) {
 
         int r;
-        usec_t timeout_val;
 
         assert(m);
         assert(w >= 0);
         assert(w < _INHIBIT_WHAT_MAX);
         assert(unit_name);
 
-        timeout_val = now(CLOCK_MONOTONIC) + m->inhibit_delay_max;
-
         if (m->inhibit_timeout_source) {
-                r = sd_event_source_set_time(m->inhibit_timeout_source, timeout_val);
+                r = sd_event_source_set_time_relative(m->inhibit_timeout_source, m->inhibit_delay_max);
                 if (r < 0)
-                        return log_error_errno(r, "sd_event_source_set_time() failed: %m");
+                        return log_error_errno(r, "sd_event_source_set_time_relative() failed: %m");
 
                 r = sd_event_source_set_enabled(m->inhibit_timeout_source, SD_EVENT_ONESHOT);
                 if (r < 0)
                         return log_error_errno(r, "sd_event_source_set_enabled() failed: %m");
         } else {
-                r = sd_event_add_time(m->event, &m->inhibit_timeout_source, CLOCK_MONOTONIC,
-                                      timeout_val, 0, manager_inhibit_timeout_handler, m);
+                r = sd_event_add_time_relative(
+                                m->event,
+                                &m->inhibit_timeout_source,
+                                CLOCK_MONOTONIC, m->inhibit_delay_max, 0,
+                                manager_inhibit_timeout_handler, m);
                 if (r < 0)
                         return r;
         }
index 5c4149e1bd377328496ab2c423fe7b47bdeb3562..8e8a1666ac44c7fd0d8474382ca67a075a1500b6 100644 (file)
@@ -896,11 +896,12 @@ int session_release(Session *s) {
         if (s->timer_event_source)
                 return 0;
 
-        return sd_event_add_time(s->manager->event,
-                                 &s->timer_event_source,
-                                 CLOCK_MONOTONIC,
-                                 usec_add(now(CLOCK_MONOTONIC), RELEASE_USEC), 0,
-                                 release_timeout_callback, s);
+        return sd_event_add_time_relative(
+                        s->manager->event,
+                        &s->timer_event_source,
+                        CLOCK_MONOTONIC,
+                        RELEASE_USEC, 0,
+                        release_timeout_callback, s);
 }
 
 bool session_is_active(Session *s) {
index 73ef5949bf366f6e5ad4ed10120ac4afb251f809..a3c97d8d8f8328ab5a3fe81d879e1f683851d508 100644 (file)
@@ -585,7 +585,7 @@ int bus_machine_method_open_shell(sd_bus_message *message, void *userdata, sd_bu
         r = sd_bus_message_read(message, "ss", &user, &path);
         if (r < 0)
                 return r;
-        user = empty_to_null(user);
+        user = isempty(user) ? "root" : user;
         r = sd_bus_message_read_strv(message, &args_wire);
         if (r < 0)
                 return r;
@@ -604,7 +604,7 @@ int bus_machine_method_open_shell(sd_bus_message *message, void *userdata, sd_bu
                 r = asprintf(&args[2],
                              "shell=$(getent passwd %s 2>/dev/null | { IFS=: read _ _ _ _ _ _ x; echo \"$x\"; })\n"\
                              "exec \"${shell:-/bin/sh}\" -l", /* -l is means --login */
-                             isempty(user) ? "root" : user);
+                             user);
                 if (r < 0) {
                         args[2] = NULL;
                         return -ENOMEM;
@@ -628,11 +628,18 @@ int bus_machine_method_open_shell(sd_bus_message *message, void *userdata, sd_bu
         if (!strv_env_is_valid(env))
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid environment assignments");
 
+        const char *details[] = {
+                "machine", m->name,
+                "user", user,
+                "program", path,
+                NULL
+        };
+
         r = bus_verify_polkit_async(
                         message,
                         CAP_SYS_ADMIN,
                         m->class == MACHINE_HOST ? "org.freedesktop.machine1.host-shell" : "org.freedesktop.machine1.shell",
-                        NULL,
+                        details,
                         false,
                         UID_INVALID,
                         &m->manager->polkit_registry,
@@ -677,7 +684,7 @@ int bus_machine_method_open_shell(sd_bus_message *message, void *userdata, sd_bu
         if (r < 0)
                 return r;
 
-        description = strjoina("Shell for User ", isempty(user) ? "root" : user);
+        description = strjoina("Shell for User ", user);
         r = sd_bus_message_append(tm,
                                   "(sv)(sv)(sv)(sv)(sv)(sv)(sv)(sv)(sv)(sv)(sv)(sv)",
                                   "Description", "s", description,
@@ -695,7 +702,7 @@ int bus_machine_method_open_shell(sd_bus_message *message, void *userdata, sd_bu
         if (r < 0)
                 return r;
 
-        r = sd_bus_message_append(tm, "(sv)", "User", "s", isempty(user) ? "root" : user);
+        r = sd_bus_message_append(tm, "(sv)", "User", "s", user);
         if (r < 0)
                 return r;
 
index 2c36854588d09960a7bb1a3fcdaf051f8a831c2e..b09d75e6158e7e6e39ba0ce891eaad5aa93ee1ad 100644 (file)
@@ -125,6 +125,17 @@ void address_free(Address *address) {
         if (address->link && !address->acd) {
                 set_remove(address->link->addresses, address);
                 set_remove(address->link->addresses_foreign, address);
+                set_remove(address->link->static_addresses, address);
+                if (address->link->dhcp_address == address)
+                        address->link->dhcp_address = NULL;
+                if (address->link->dhcp_address_old == address)
+                        address->link->dhcp_address_old = NULL;
+                set_remove(address->link->dhcp6_addresses, address);
+                set_remove(address->link->dhcp6_addresses_old, address);
+                set_remove(address->link->dhcp6_pd_addresses, address);
+                set_remove(address->link->dhcp6_pd_addresses_old, address);
+                set_remove(address->link->ndisc_addresses, address);
+                set_remove(address->link->ndisc_addresses_old, address);
 
                 if (in_addr_equal(AF_INET6, &address->in_addr, (const union in_addr_union *) &address->link->ipv6ll_address))
                         memzero(&address->link->ipv6ll_address, sizeof(struct in6_addr));
@@ -205,7 +216,7 @@ static int address_compare_func(const Address *a1, const Address *a2) {
         }
 }
 
-DEFINE_HASH_OPS(address_hash_ops, Address, address_hash_func, address_compare_func);
+DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR(address_hash_ops, Address, address_hash_func, address_compare_func, address_free);
 
 bool address_equal(Address *a1, Address *a2) {
         if (a1 == a2)
@@ -344,11 +355,8 @@ int address_update(
         int r;
 
         assert(address);
+        assert(address->link);
         assert(cinfo);
-        assert_return(address->link, 1);
-
-        if (IN_SET(address->link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
-                return 1;
 
         ready = address_is_ready(address);
 
@@ -356,18 +364,27 @@ int address_update(
         address->scope = scope;
         address->cinfo = *cinfo;
 
+        if (IN_SET(address->link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
+                return 0;
+
         link_update_operstate(address->link, true);
         link_check_ready(address->link);
 
-        if (!ready &&
-            address_is_ready(address) &&
-            address->family == AF_INET6 &&
-            in_addr_is_link_local(AF_INET6, &address->in_addr) > 0 &&
-            in_addr_is_null(AF_INET6, (const union in_addr_union*) &address->link->ipv6ll_address) > 0) {
+        if (!ready && address_is_ready(address)) {
+                if (address->callback) {
+                        r = address->callback(address);
+                        if (r < 0)
+                                return r;
+                }
 
-                r = link_ipv6ll_gained(address->link, &address->in_addr.in6);
-                if (r < 0)
-                        return r;
+                if (address->family == AF_INET6 &&
+                    in_addr_is_link_local(AF_INET6, &address->in_addr) > 0 &&
+                    IN6_IS_ADDR_UNSPECIFIED(&address->link->ipv6ll_address) > 0) {
+
+                        r = link_ipv6ll_gained(address->link, &address->in_addr.in6);
+                        if (r < 0)
+                                return r;
+                }
         }
 
         return 0;
@@ -586,9 +603,11 @@ int address_configure(
                 Address *address,
                 Link *link,
                 link_netlink_message_handler_t callback,
-                bool update) {
+                bool update,
+                Address **ret) {
 
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+        Address *a;
         int r;
 
         assert(address);
@@ -609,6 +628,13 @@ int address_configure(
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to acquire an address from pool: %m");
 
+        if (DEBUG_LOGGING) {
+                _cleanup_free_ char *str = NULL;
+
+                (void) in_addr_to_string(address->family, &address->in_addr, &str);
+                log_link_debug(link, "%s address: %s", update ? "Updating" : "Configuring", strna(str));
+        }
+
         if (update)
                 r = sd_rtnl_message_new_addr_update(link->manager->rtnl, &req,
                                                     link->ifindex, address->family);
@@ -690,9 +716,9 @@ int address_configure(
         link_ref(link);
 
         if (address->family == AF_INET6 && !in_addr_is_null(address->family, &address->in_addr_peer))
-                r = address_add(link, address->family, &address->in_addr_peer, address->prefixlen, NULL);
+                r = address_add(link, address->family, &address->in_addr_peer, address->prefixlen, &a);
         else
-                r = address_add(link, address->family, &address->in_addr, address->prefixlen, NULL);
+                r = address_add(link, address->family, &address->in_addr, address->prefixlen, &a);
         if (r < 0) {
                 address_release(address);
                 return log_link_error_errno(link, r, "Could not add address: %m");
@@ -712,6 +738,9 @@ int address_configure(
                         log_link_warning_errno(link, r, "Failed to start IPv4ACD client, ignoring: %m");
         }
 
+        if (ret)
+                *ret = a;
+
         return 1;
 }
 
index d55059ee252edfbddf65a0fad5bb56bef51fd5de..3fc9935d16ba7b2e5c7e089e5794762a9bf3ad38 100644 (file)
@@ -20,6 +20,7 @@ typedef struct Address Address;
 typedef struct Network Network;
 typedef struct Link Link;
 typedef struct NetworkConfigSection NetworkConfigSection;
+typedef int (*address_ready_callback_t)(Address *address);
 
 struct Address {
         Network *network;
@@ -47,6 +48,9 @@ struct Address {
         bool autojoin:1;
         AddressFamily duplicate_address_detection;
 
+        /* Called when address become ready */
+        address_ready_callback_t callback;
+
         sd_ipv4acd *acd;
 
         LIST_FIELDS(Address, addresses);
@@ -60,7 +64,7 @@ int address_get(Link *link, int family, const union in_addr_union *in_addr, unsi
 bool address_exists(Link *link, int family, const union in_addr_union *in_addr);
 int address_update(Address *address, unsigned char flags, unsigned char scope, const struct ifa_cacheinfo *cinfo);
 int address_drop(Address *address);
-int address_configure(Address *address, Link *link, link_netlink_message_handler_t callback, bool update);
+int address_configure(Address *address, Link *link, link_netlink_message_handler_t callback, bool update, Address **ret);
 int address_remove(Address *address, Link *link, link_netlink_message_handler_t callback);
 bool address_equal(Address *a1, Address *a2);
 bool address_is_ready(const Address *a);
index e076965ee6aa5da78b01e96b45655d9218a12306..722e0d213bb045cb7dcf1b0566e9ada283885c99 100644 (file)
 #include "sysctl-util.h"
 #include "web-util.h"
 
-static int dhcp_remove_routes(Link *link, sd_dhcp_lease *lease, const struct in_addr *address, bool remove_all, link_netlink_message_handler_t callback);
-static int dhcp_remove_router(Link *link, sd_dhcp_lease *lease, const struct in_addr *address, bool remove_all, link_netlink_message_handler_t callback);
-static int dhcp_remove_dns_routes(Link *link, sd_dhcp_lease *lease, const struct in_addr *address, bool remove_all, link_netlink_message_handler_t callback);
-static int dhcp_remove_address(Link *link, sd_dhcp_lease *lease, const struct in_addr *address, link_netlink_message_handler_t callback);
 static int dhcp4_update_address(Link *link, bool announce);
 static int dhcp4_remove_all(Link *link);
+static int dhcp4_release_old_lease(Link *link, bool force);
 
-static void dhcp4_release_old_lease(Link *link) {
-        struct in_addr address = {}, address_old = {};
+static int dhcp4_address_callback(Address *address) {
+        assert(address);
+        assert(address->link);
 
-        assert(link);
+        /* Do not call this callback again. */
+        address->callback = NULL;
 
-        if (!link->dhcp_lease_old)
-                return;
+        return dhcp4_release_old_lease(address->link, true);
+}
 
-        assert(link->dhcp_lease);
+static int dhcp4_release_old_lease(Link *link, bool force) {
+        Route *route;
+        Iterator i;
+        int k, r = 0;
+
+        assert(link);
 
-        (void) sd_dhcp_lease_get_address(link->dhcp_lease_old, &address_old);
-        (void) sd_dhcp_lease_get_address(link->dhcp_lease, &address);
+        if (!link->dhcp_address_old && set_isempty(link->dhcp_routes_old))
+                return 0;
 
-        (void) dhcp_remove_routes(link, link->dhcp_lease_old, &address_old, false, NULL);
-        (void) dhcp_remove_router(link, link->dhcp_lease_old, &address_old, false, NULL);
-        (void) dhcp_remove_dns_routes(link, link->dhcp_lease_old, &address_old, false, NULL);
+        if (!force && (link->dhcp_address && !address_is_ready(link->dhcp_address))) {
+                log_link_debug(link, "New DHCPv4 address is not ready. The old lease will be removed later.");
+                link->dhcp_address->callback = dhcp4_address_callback;
+                return 0;
+        }
 
-        if (!in4_addr_equal(&address_old, &address))
-                (void) dhcp_remove_address(link, link->dhcp_lease_old, &address_old, NULL);
+        log_link_debug(link, "Removing old DHCPv4 address and routes.");
 
-        link->dhcp_lease_old = sd_dhcp_lease_unref(link->dhcp_lease_old);
         link_dirty(link);
+
+        SET_FOREACH(route, link->dhcp_routes_old, i) {
+                k = route_remove(route, link, NULL);
+                if (k < 0)
+                        r = k;
+        }
+
+        if (link->dhcp_address_old) {
+                k = address_remove(link->dhcp_address_old, link, NULL);
+                if (k < 0)
+                        r = k;
+        }
+
+        return r;
 }
 
 static void dhcp4_check_ready(Link *link) {
+        int r;
+
         if (link->network->dhcp_send_decline && !link->dhcp4_address_bind)
                 return;
 
@@ -59,8 +79,14 @@ static void dhcp4_check_ready(Link *link) {
                 return;
 
         link->dhcp4_configured = true;
+
         /* New address and routes are configured now. Let's release old lease. */
-        dhcp4_release_old_lease(link);
+        r = dhcp4_release_old_lease(link, false);
+        if (r < 0) {
+                link_enter_failed(link);
+                return;
+        }
+
         link_check_ready(link);
 }
 
@@ -124,27 +150,25 @@ static bool link_prefixroute(Link *link) {
                 link->manager->dhcp4_prefix_root_cannot_set_table;
 }
 
-static int dhcp_route_configure(Route **route, Link *link) {
+static int dhcp_route_configure(Route *route, Link *link) {
+        Route *ret;
         int r;
 
         assert(route);
-        assert(*route);
         assert(link);
 
-        if (set_contains(link->dhcp_routes, *route))
-                return 0;
-
-        r = route_configure(*route, link, dhcp4_route_handler);
-        if (r <= 0)
-                return r;
+        r = route_configure(route, link, dhcp4_route_handler, &ret);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to set DHCPv4 route: %m");
 
         link->dhcp4_messages++;
 
-        r = set_put(link->dhcp_routes, *route);
+        r = set_ensure_put(&link->dhcp_routes, &route_hash_ops, ret);
         if (r < 0)
-                return r;
+                return log_link_error_errno(link, r, "Failed to store DHCPv4 route: %m");
+
+        (void) set_remove(link->dhcp_routes_old, ret);
 
-        TAKE_PTR(*route);
         return 0;
 }
 
@@ -187,7 +211,7 @@ static int link_set_dns_routes(Link *link, const struct in_addr *address) {
                 route->priority = link->network->dhcp_route_metric;
                 route->table = table;
 
-                r = dhcp_route_configure(&route, link);
+                r = dhcp_route_configure(route, link);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Could not set route to DNS server: %m");
         }
@@ -231,6 +255,7 @@ static int link_set_dhcp_routes(Link *link) {
         struct in_addr address;
         int r, n, i;
         uint32_t table;
+        Route *rt;
 
         assert(link);
 
@@ -245,12 +270,11 @@ static int link_set_dhcp_routes(Link *link) {
                  * the addresses now, let's not configure the routes either. */
                 return 0;
 
-        r = set_ensure_allocated(&link->dhcp_routes, &route_hash_ops);
-        if (r < 0)
-                return log_oom();
-
-        /* Clear old entries in case the set was already allocated */
-        set_clear(link->dhcp_routes);
+        while ((rt = set_steal_first(link->dhcp_routes))) {
+                r = set_ensure_put(&link->dhcp_routes_old, &route_hash_ops, rt);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Failed to store old DHCPv4 route: %m");
+        }
 
         table = link_get_dhcp_route_table(link);
 
@@ -265,7 +289,7 @@ static int link_set_dhcp_routes(Link *link) {
                 if (r < 0)
                         return log_link_error_errno(link, r, "Could not create prefix route: %m");
 
-                r = dhcp_route_configure(&prefix_route, link);
+                r = dhcp_route_configure(prefix_route, link);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Could not set prefix route: %m");
         }
@@ -316,7 +340,7 @@ static int link_set_dhcp_routes(Link *link) {
                         if (set_contains(link->dhcp_routes, route))
                                 continue;
 
-                        r = dhcp_route_configure(&route, link);
+                        r = dhcp_route_configure(route, link);
                         if (r < 0)
                                 return log_link_error_errno(link, r, "Could not set route: %m");
                 }
@@ -356,7 +380,7 @@ static int link_set_dhcp_routes(Link *link) {
                         route_gw->table = table;
                         route_gw->mtu = link->network->dhcp_route_mtu;
 
-                        r = dhcp_route_configure(&route_gw, link);
+                        r = dhcp_route_configure(route_gw, link);
                         if (r < 0)
                                 return log_link_error_errno(link, r, "Could not set host route: %m");
 
@@ -372,12 +396,11 @@ static int link_set_dhcp_routes(Link *link) {
                         route->table = table;
                         route->mtu = link->network->dhcp_route_mtu;
 
-                        r = dhcp_route_configure(&route, link);
+                        r = dhcp_route_configure(route, link);
                         if (r < 0)
                                 return log_link_error_errno(link, r, "Could not set router: %m");
                 }
 
-                Route *rt;
                 LIST_FOREACH(routes, rt, link->network->static_routes) {
                         if (!rt->gateway_from_dhcp)
                                 continue;
@@ -387,272 +410,15 @@ static int link_set_dhcp_routes(Link *link) {
 
                         rt->gw.in = router[0];
 
-                        r = route_configure(rt, link, dhcp4_route_handler);
+                        r = dhcp_route_configure(rt, link);
                         if (r < 0)
                                 return log_link_error_errno(link, r, "Could not set gateway: %m");
-                        if (r > 0)
-                                link->dhcp4_messages++;
                 }
         }
 
         return link_set_dns_routes(link, &address);
 }
 
-static int dhcp_route_remove(Route *route, Link *link, link_netlink_message_handler_t callback) {
-        int r;
-
-        r = route_remove(route, link, callback);
-        if (r < 0)
-                return r;
-
-        if (callback)
-                link->dhcp4_remove_messages++;
-
-        return 0;
-}
-
-static int dhcp_remove_routes(
-                        Link *link,
-                        sd_dhcp_lease *lease,
-                        const struct in_addr *address,
-                        bool remove_all,
-                        link_netlink_message_handler_t callback) {
-
-        _cleanup_free_ sd_dhcp_route **routes = NULL;
-        uint32_t table;
-        int n, i, r;
-
-        assert(link);
-        assert(address);
-
-        if (!link->network->dhcp_use_routes)
-                return 0;
-
-        n = sd_dhcp_lease_get_routes(lease, &routes);
-        if (IN_SET(n, 0, -ENODATA))
-                return 0;
-        else if (n < 0)
-                return log_link_error_errno(link, n, "DHCP error: Failed to get routes: %m");
-
-        table = link_get_dhcp_route_table(link);
-
-        for (i = 0; i < n; i++) {
-                _cleanup_(route_freep) Route *route = NULL;
-
-                r = route_new(&route);
-                if (r < 0)
-                        return log_oom();
-
-                route->family = AF_INET;
-                assert_se(sd_dhcp_route_get_gateway(routes[i], &route->gw.in) >= 0);
-                assert_se(sd_dhcp_route_get_destination(routes[i], &route->dst.in) >= 0);
-                assert_se(sd_dhcp_route_get_destination_prefix_length(routes[i], &route->dst_prefixlen) >= 0);
-                route->priority = link->network->dhcp_route_metric;
-                route->table = table;
-                route->scope = route_scope_from_address(route, address);
-                if (IN_SET(route->scope, RT_SCOPE_LINK, RT_SCOPE_UNIVERSE))
-                        route->prefsrc.in = *address;
-
-                if (!remove_all && set_contains(link->dhcp_routes, route))
-                        continue;
-
-                r = dhcp_route_remove(route, link, callback);
-                if (r < 0)
-                        return r;
-        }
-
-        return n;
-}
-
-static int dhcp_remove_router(
-                        Link *link,
-                        sd_dhcp_lease *lease,
-                        const struct in_addr *address,
-                        bool remove_all,
-                        link_netlink_message_handler_t callback) {
-
-        _cleanup_(route_freep) Route *route_gw = NULL, *route = NULL;
-        const struct in_addr *router;
-        uint32_t table;
-        int r;
-
-        assert(link);
-        assert(address);
-
-        if (!link->network->dhcp_use_gateway)
-                return 0;
-
-        r = sd_dhcp_lease_get_router(lease, &router);
-        if (IN_SET(r, 0, -ENODATA)) {
-                log_link_debug(link, "DHCP: No gateway received from DHCP server.");
-                return 0;
-        } else if (r < 0)
-                return log_link_error_errno(link, r, "DHCP error: could not get gateway: %m");
-        else if (in4_addr_is_null(&router[0])) {
-                log_link_info(link, "DHCP: Received gateway is null, ignoring.");
-                return 0;
-        }
-
-        table = link_get_dhcp_route_table(link);
-
-        r = route_new(&route_gw);
-        if (r < 0)
-                return log_oom();
-
-        route_gw->family = AF_INET;
-        route_gw->dst.in = router[0];
-        route_gw->dst_prefixlen = 32;
-        route_gw->prefsrc.in = *address;
-        route_gw->scope = RT_SCOPE_LINK;
-        route_gw->protocol = RTPROT_DHCP;
-        route_gw->priority = link->network->dhcp_route_metric;
-        route_gw->table = table;
-
-        if (remove_all || !set_contains(link->dhcp_routes, route_gw)) {
-                r = dhcp_route_remove(route_gw, link, callback);
-                if (r < 0)
-                        return r;
-        }
-
-        r = route_new(&route);
-        if (r < 0)
-                return log_oom();
-
-        route->family = AF_INET;
-        route->gw.in = router[0];
-        route->prefsrc.in = *address;
-        route->protocol = RTPROT_DHCP;
-        route->priority = link->network->dhcp_route_metric;
-        route->table = table;
-
-        if (remove_all || !set_contains(link->dhcp_routes, route)) {
-                r = dhcp_route_remove(route, link, callback);
-                if (r < 0)
-                        return r;
-        }
-
-        Route *rt;
-        LIST_FOREACH(routes, rt, link->network->static_routes) {
-                if (!rt->gateway_from_dhcp)
-                        continue;
-
-                if (rt->family != AF_INET)
-                        continue;
-
-                if (!remove_all && in4_addr_equal(router, &rt->gw.in))
-                        continue;
-
-                r = dhcp_route_remove(rt, link, callback);
-                if (r < 0)
-                        return r;
-        }
-
-        return 0;
-}
-
-static int dhcp_remove_dns_routes(
-                        Link *link,
-                        sd_dhcp_lease *lease,
-                        const struct in_addr *address,
-                        bool remove_all,
-                        link_netlink_message_handler_t callback) {
-
-        const struct in_addr *dns;
-        uint32_t table;
-        int i, n, r;
-
-        assert(link);
-        assert(lease);
-        assert(link->network);
-
-        if (!link->network->dhcp_use_dns ||
-            !link->network->dhcp_routes_to_dns)
-                return 0;
-
-        n = sd_dhcp_lease_get_dns(lease, &dns);
-        if (IN_SET(n, 0, -ENODATA))
-                return 0;
-        if (n < 0)
-                return log_link_warning_errno(link, n, "DHCP error: could not get DNS servers: %m");
-
-        table = link_get_dhcp_route_table(link);
-
-        for (i = 0; i < n; i ++) {
-                _cleanup_(route_freep) Route *route = NULL;
-
-                r = route_new(&route);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not allocate route: %m");
-
-                route->family = AF_INET;
-                route->dst.in = dns[i];
-                route->dst_prefixlen = 32;
-                route->prefsrc.in = *address;
-                route->scope = RT_SCOPE_LINK;
-                route->protocol = RTPROT_DHCP;
-                route->priority = link->network->dhcp_route_metric;
-                route->table = table;
-
-                if (!remove_all && set_contains(link->dhcp_routes, route))
-                        continue;
-
-                r = dhcp_route_remove(route, link, callback);
-                if (r < 0)
-                        return r;
-        }
-
-        if (!link_prefixroute(link)) {
-                _cleanup_(route_freep) Route *prefix_route = NULL;
-
-                r = dhcp_prefix_route_from_lease(lease, table, address, &prefix_route);
-                if (r < 0)
-                        return log_link_warning_errno(link, r, "Could not create prefix route: %m");
-
-                if (remove_all || !set_contains(link->dhcp_routes, prefix_route)) {
-                        r = dhcp_route_remove(prefix_route, link, callback);
-                        if (r < 0)
-                                return r;
-                }
-        }
-
-        return 0;
-}
-
-static int dhcp_remove_address(
-                        Link *link, sd_dhcp_lease *lease,
-                        const struct in_addr *address,
-                        link_netlink_message_handler_t callback) {
-
-        _cleanup_(address_freep) Address *a = NULL;
-        struct in_addr netmask;
-        int r;
-
-        assert(link);
-        assert(address);
-
-        if (in4_addr_is_null(address))
-                return 0;
-
-        r = address_new(&a);
-        if (r < 0)
-                return log_oom();
-
-        a->family = AF_INET;
-        a->in_addr.in = *address;
-
-        if (sd_dhcp_lease_get_netmask(lease, &netmask) >= 0)
-                a->prefixlen = in4_addr_netmask_to_prefixlen(&netmask);
-
-        r = address_remove(a, link, callback);
-        if (r < 0)
-                return r;
-
-        if (callback)
-                link->dhcp4_remove_messages++;
-
-        return 0;
-}
-
 static int dhcp_reset_mtu(Link *link) {
         uint16_t mtu;
         int r;
@@ -756,37 +522,33 @@ static int dhcp4_remove_address_handler(sd_netlink *rtnl, sd_netlink_message *m,
 }
 
 static int dhcp4_remove_all(Link *link) {
-        struct in_addr address;
-        int r;
+        Route *route;
+        Iterator i;
+        int k, r = 0;
 
         assert(link);
-        assert(link->dhcp_lease);
 
-        r = sd_dhcp_lease_get_address(link->dhcp_lease, &address);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Failed to get DHCPv4 address: %m");
-
-        r = dhcp_remove_routes(link, link->dhcp_lease, &address, true, dhcp4_remove_route_handler);
-        if (r < 0)
-                return r;
-
-        r = dhcp_remove_router(link, link->dhcp_lease, &address, true, dhcp4_remove_route_handler);
-        if (r < 0)
-                return r;
-
-        r = dhcp_remove_dns_routes(link, link->dhcp_lease, &address, true, dhcp4_remove_route_handler);
-        if (r < 0)
-                return r;
+        SET_FOREACH(route, link->dhcp_routes, i) {
+                k = route_remove(route, link, dhcp4_remove_route_handler);
+                if (k < 0)
+                        r = k;
+                else
+                        link->dhcp4_remove_messages++;
+        }
 
-        r = dhcp_remove_address(link, link->dhcp_lease, &address, dhcp4_remove_address_handler);
-        if (r < 0)
-                return r;
+        if (link->dhcp_address) {
+                k = address_remove(link->dhcp_address, link, dhcp4_remove_address_handler);
+                if (k < 0)
+                        r = k;
+                else
+                        link->dhcp4_remove_messages++;
+        }
 
-        return 0;
+        return r;
 }
 
 static int dhcp_lease_lost(Link *link) {
-        int r;
+        int k, r = 0;
 
         assert(link);
         assert(link->dhcp_lease);
@@ -796,24 +558,26 @@ static int dhcp_lease_lost(Link *link) {
         link->dhcp4_configured = false;
 
         /* dhcp_lease_lost() may be called during renewing IP address. */
-        dhcp4_release_old_lease(link);
+        k = dhcp4_release_old_lease(link, true);
+        if (k < 0)
+                r = k;
 
-        r = dhcp4_remove_all(link);
-        if (r < 0)
-                return r;
+        k = dhcp4_remove_all(link);
+        if (k < 0)
+                r = k;
 
-        r = dhcp_reset_mtu(link);
-        if (r < 0)
-                return r;
+        k = dhcp_reset_mtu(link);
+        if (k < 0)
+                r = k;
 
-        r = dhcp_reset_hostname(link);
-        if (r < 0)
-                return r;
+        k = dhcp_reset_hostname(link);
+        if (k < 0)
+                r = k;
 
         link->dhcp_lease = sd_dhcp_lease_unref(link->dhcp_lease);
         link_dirty(link);
 
-        return 0;
+        return r;
 }
 
 static void dhcp_address_on_acd(sd_ipv4acd *acd, int event, void *userdata) {
@@ -975,6 +739,7 @@ static int dhcp4_update_address(Link *link, bool announce) {
         uint32_t lifetime = CACHE_INFO_INFINITY_LIFE_TIME;
         struct in_addr address, netmask;
         unsigned prefixlen;
+        Address *ret;
         int r;
 
         assert(link);
@@ -1049,9 +814,13 @@ static int dhcp4_update_address(Link *link, bool announce) {
 
         /* allow reusing an existing address and simply update its lifetime
          * in case it already exists */
-        r = address_configure(addr, link, dhcp4_address_handler, true);
+        r = address_configure(addr, link, dhcp4_address_handler, true, &ret);
         if (r < 0)
-                return r;
+                return log_link_error_errno(link, r, "Failed to set DHCPv4 address: %m");
+
+        if (!address_equal(link->dhcp_address, ret))
+                link->dhcp_address_old = link->dhcp_address;
+        link->dhcp_address = ret;
 
         return 0;
 }
@@ -1151,32 +920,11 @@ static int dhcp_lease_acquired(sd_dhcp_client *client, Link *link) {
 static int dhcp_lease_ip_change(sd_dhcp_client *client, Link *link) {
         int r;
 
-        link->dhcp_lease_old = TAKE_PTR(link->dhcp_lease);
-
-        /* On IP address change, to keep the connectability, we would like to assign new address and
-         * routes, and then release old lease. There are two possible success paths:
-         *
-         * 1. new address and routes are configured.
-         *    -> handled by dhcp_release_old_lease() in dhcp4_route_handler().
-         * 2. new address is configured and no route is requested.
-         *    -> handled by dhcp_release_old_lease() in dhcp4_address_handler().
-         *
-         * On error in assigning new address and routes, then the link always enters to the failed
-         * state. And link_enter_failed() leads to the DHCP client to be stopped. So,
-         * dhcp_release_old_lease() will be also called by link_stop_clients().
-         */
-
         r = dhcp_lease_acquired(client, link);
-        if (r < 0) {
-                /* If it fails, then the new address is not configured yet.
-                 * So, let's simply drop the old lease. */
-                sd_dhcp_lease_unref(link->dhcp_lease);
-                link->dhcp_lease = TAKE_PTR(link->dhcp_lease_old);
+        if (r < 0)
                 (void) dhcp_lease_lost(link);
-                return r;
-        }
 
-        return 0;
+        return r;
 }
 
 static int dhcp_server_is_deny_listed(Link *link, sd_dhcp_client *client) {
index 1f78e24110f7a2c45d6d8c9f316814c858c1b6e6..d671284b001906975a8e0ec4a421217838dd804f 100644 (file)
 #include "radv-internal.h"
 #include "web-util.h"
 
-static Link *dhcp6_prefix_get(Manager *m, struct in6_addr *addr);
-static int dhcp6_prefix_add(Manager *m, struct in6_addr *addr, Link *link);
-static int dhcp6_prefix_remove_all(Manager *m, Link *link);
-static int dhcp6_assign_delegated_prefix(Link *link, const struct in6_addr *prefix,
-                                         uint8_t prefix_len,
-                                         uint32_t lifetime_preferred,
-                                         uint32_t lifetime_valid);
-
-bool dhcp6_get_prefix_delegation(Link *link) {
-        if (!link->network)
+static bool dhcp6_lease_has_pd_prefix(sd_dhcp6_lease *lease) {
+        uint32_t lifetime_preferred, lifetime_valid;
+        union in_addr_union pd_prefix;
+        uint8_t pd_prefix_len;
+
+        if (!lease)
                 return false;
 
-        return IN_SET(link->network->router_prefix_delegation,
-                      RADV_PREFIX_DELEGATION_DHCP6,
-                      RADV_PREFIX_DELEGATION_BOTH);
+        sd_dhcp6_lease_reset_pd_prefix_iter(lease);
+
+        return sd_dhcp6_lease_get_pd(lease, &pd_prefix.in6, &pd_prefix_len, &lifetime_preferred, &lifetime_valid) >= 0;
 }
 
-static bool dhcp6_has_preferred_subnet_id(Link *link) {
-        if (!link->network)
-                return false;
+DHCP6DelegatedPrefix *dhcp6_pd_free(DHCP6DelegatedPrefix *p) {
+        if (!p)
+                return NULL;
+
+        if (p->link && p->link->manager) {
+                hashmap_remove(p->link->manager->dhcp6_prefixes, &p->prefix);
+                set_remove(p->link->manager->dhcp6_pd_prefixes, p);
+        }
 
-        return link->network->router_prefix_subnet_id >= 0;
+        link_unref(p->link);
+        return mfree(p);
 }
 
-static int dhcp6_get_preferred_delegated_prefix(
-                Manager* manager,
-                Link *link,
-                const struct in6_addr *pd_prefix,
-                uint8_t pd_prefix_len,
-                struct in6_addr *ret_addr) {
-
-        int64_t subnet_id = link->network->router_prefix_subnet_id;
-        uint8_t prefix_bits = 64 - pd_prefix_len;
-        uint64_t n_prefixes = UINT64_C(1) << prefix_bits;
-        _cleanup_free_ char *assigned_buf = NULL;
-        union in_addr_union pd_prefix_union = {
-                .in6 = *pd_prefix,
-        };
-        /* We start off with the original PD prefix we have been assigned and
-         * iterate from there */
-        union in_addr_union prefix = {
-                .in6 = *pd_prefix,
-        };
+static void dhcp6_pd_hash_func(const DHCP6DelegatedPrefix *p, struct siphash *state) {
+        assert(p);
+
+        siphash24_compress(&p->pd_prefix, sizeof(p->pd_prefix), state);
+        siphash24_compress(&p->link, sizeof(p->link), state);
+}
+
+static int dhcp6_pd_compare_func(const DHCP6DelegatedPrefix *a, const DHCP6DelegatedPrefix *b) {
         int r;
 
-        assert(pd_prefix_len <= 64);
-        assert(manager);
+        r = memcmp(&a->pd_prefix, &b->pd_prefix, sizeof(a->pd_prefix));
+        if (r != 0)
+                return r;
+
+        return CMP(a->link, b->link);
+}
+
+DEFINE_HASH_OPS(dhcp6_pd_hash_ops, DHCP6DelegatedPrefix, dhcp6_pd_hash_func, dhcp6_pd_compare_func);
+
+static Link *dhcp6_pd_get_link_by_prefix(Link *link, const union in_addr_union *prefix) {
+        DHCP6DelegatedPrefix *pd;
+
         assert(link);
-        assert(link->network);
+        assert(link->manager);
+        assert(prefix);
 
-        if (subnet_id >= 0) {
-                /* If the link has a preference for a particular subnet id try to allocate that */
-                if ((uint64_t) subnet_id >= n_prefixes)
-                        return log_link_debug_errno(link,
-                                        SYNTHETIC_ERRNO(ERANGE),
-                                        "subnet id %" PRIi64 " is out of range. Only have %" PRIu64 " subnets.",
-                                        subnet_id,
-                                        n_prefixes);
+        pd = hashmap_get(link->manager->dhcp6_prefixes, &prefix->in6);
+        if (!pd)
+                return NULL;
 
-                r = in_addr_prefix_nth(AF_INET6, &prefix, 64, subnet_id);
-                if (r < 0)
-                        return log_link_debug_errno(link,
-                                        r,
-                                        "subnet id %" PRIi64 " is out of range. Only have %" PRIu64 " subnets.",
-                                        subnet_id,
-                                        n_prefixes);
+        return pd->link;
+}
 
-                /* Verify that the prefix we did calculate fits in the pd prefix.
-                 * This should not fail as we checked the prefix size beforehand */
-                assert_se(in_addr_prefix_covers(AF_INET6, &pd_prefix_union, pd_prefix_len, &prefix) > 0);
+static int dhcp6_pd_get_assigned_prefix(Link *link, const union in_addr_union *pd_prefix, union in_addr_union *ret_prefix) {
+        DHCP6DelegatedPrefix *pd, in;
+
+        assert(link);
+        assert(link->manager);
+        assert(pd_prefix);
+        assert(ret_prefix);
+
+        in = (DHCP6DelegatedPrefix) {
+                .pd_prefix = pd_prefix->in6,
+                .link = link,
+        };
+
+        pd = set_get(link->manager->dhcp6_pd_prefixes, &in);
+        if (!pd)
+                return -ENOENT;
 
-                Link* assigned_link = dhcp6_prefix_get(manager, &prefix.in6);
+        ret_prefix->in6 = pd->prefix;
+        return 0;
+}
 
-                (void) in_addr_to_string(AF_INET6, &prefix, &assigned_buf);
+static int dhcp6_pd_remove_old(Link *link, bool force);
+
+static int dhcp6_pd_address_callback(Address *address) {
+        Address *a;
+        Iterator i;
 
-                if (assigned_link && assigned_link != link)
-                        return log_link_error_errno(link, SYNTHETIC_ERRNO(EAGAIN),
-                                       "The requested prefix %s is already assigned to another link: %s",
-                                       strnull(assigned_buf),
-                                       strnull(assigned_link->ifname));
+        assert(address);
+        assert(address->link);
 
-                *ret_addr = prefix.in6;
+        /* Make this called only once */
+        SET_FOREACH(a, address->link->dhcp6_pd_addresses, i)
+                a->callback = NULL;
 
-                log_link_debug(link, "The requested prefix %s is available. Using it.",
-                               strnull(assigned_buf));
+        return dhcp6_pd_remove_old(address->link, true);
+}
+
+static int dhcp6_pd_remove_old(Link *link, bool force) {
+        Address *address;
+        Route *route;
+        Iterator i;
+        int k, r = 0;
+
+        assert(link);
+        assert(link->manager);
+
+        if (!force && (link->dhcp6_pd_address_messages != 0 || link->dhcp6_pd_route_configured != 0))
                 return 0;
-        }
 
-        for (uint64_t n = 0; n < n_prefixes; n++) {
-                /* if we do not have an allocation preference just iterate
-                 * through the address space and return the first free prefix. */
-                Link* assigned_link = dhcp6_prefix_get(manager, &prefix.in6);
+        if (set_isempty(link->dhcp6_pd_addresses_old) && set_isempty(link->dhcp6_pd_routes_old))
+                return 0;
 
-                if (!assigned_link || assigned_link == link) {
-                        *ret_addr = prefix.in6;
+        if (!force) {
+                bool set_callback = !set_isempty(link->dhcp6_pd_addresses);
+
+                SET_FOREACH(address, link->dhcp6_pd_addresses, i)
+                        if (address_is_ready(address)) {
+                                set_callback = false;
+                                break;
+                        }
+
+                if (set_callback) {
+                        SET_FOREACH(address, link->dhcp6_pd_addresses, i)
+                                address->callback = dhcp6_pd_address_callback;
                         return 0;
                 }
+        }
 
-                r = in_addr_prefix_next(AF_INET6, &prefix, 64);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Can't allocate another prefix. Out of address space?: %m");
+        log_link_debug(link, "Removing old DHCPv6 Prefix Delegation addresses and routes.");
+
+        link_dirty(link);
+
+        SET_FOREACH(route, link->dhcp6_pd_routes_old, i) {
+                k = route_remove(route, link, NULL);
+                if (k < 0)
+                        r = k;
+
+                (void) sd_radv_remove_prefix(link->radv, &route->dst.in6, 64);
+                dhcp6_pd_free(hashmap_get(link->manager->dhcp6_prefixes, &route->dst.in6));
         }
 
-        return log_link_warning_errno(link, SYNTHETIC_ERRNO(ERANGE), "Couldn't find a suitable prefix. Ran out of address space.");
+        SET_FOREACH(address, link->dhcp6_pd_addresses_old, i) {
+                k = address_remove(address, link, NULL);
+                if (k < 0)
+                        r = k;
+        }
+
+        return r;
 }
 
-static bool dhcp6_enable_prefix_delegation(Link *dhcp6_link) {
-        Manager *manager;
-        Link *l;
+int dhcp6_pd_remove(Link *link) {
+        Address *address;
+        Route *route;
         Iterator i;
+        int k, r = 0;
 
-        assert(dhcp6_link);
+        assert(link);
+        assert(link->manager);
 
-        manager = dhcp6_link->manager;
-        assert(manager);
+        link->dhcp6_pd_address_configured = false;
+        link->dhcp6_pd_route_configured = false;
 
-        HASHMAP_FOREACH(l, manager->links, i) {
-                if (l == dhcp6_link)
-                        continue;
+        k = dhcp6_pd_remove_old(link, true);
+        if (k < 0)
+                r = k;
 
-                if (!dhcp6_get_prefix_delegation(l))
-                        continue;
+        if (set_isempty(link->dhcp6_pd_addresses) && set_isempty(link->dhcp6_pd_routes))
+                return r;
 
-                return true;
+        log_link_debug(link, "Removing DHCPv6 Prefix Delegation addresses and routes.");
+
+        link_dirty(link);
+
+        SET_FOREACH(route, link->dhcp6_pd_routes, i) {
+                k = route_remove(route, link, NULL);
+                if (k < 0)
+                        r = k;
+
+                (void) sd_radv_remove_prefix(link->radv, &route->dst.in6, 64);
+                dhcp6_pd_free(hashmap_get(link->manager->dhcp6_prefixes, &route->dst.in6));
         }
 
-        return false;
+        SET_FOREACH(address, link->dhcp6_pd_addresses, i) {
+                k = address_remove(address, link, NULL);
+                if (k < 0)
+                        r = k;
+        }
+
+        return r;
 }
 
-static int dhcp6_lease_information_acquired(sd_dhcp6_client *client, Link *link) {
-        return 0;
+static int dhcp6_pd_route_handler(sd_netlink *nl, sd_netlink_message *m, Link *link) {
+        int r;
+
+        assert(link);
+        assert(link->dhcp6_pd_route_messages > 0);
+
+        link->dhcp6_pd_route_messages--;
+
+        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
+                return 1;
+
+        r = sd_netlink_message_get_errno(m);
+        if (r < 0 && r != -EEXIST) {
+                log_link_message_warning_errno(link, m, r, "Failed to add DHCPv6 Prefix Delegation route");
+                link_enter_failed(link);
+                return 1;
+        }
+
+        if (link->dhcp6_pd_route_messages == 0) {
+                log_link_debug(link, "DHCPv6 prefix delegation routes set");
+                if (link->dhcp6_pd_prefixes_assigned)
+                        link->dhcp6_pd_route_configured = true;
+
+                r = dhcp6_pd_remove_old(link, false);
+                if (r < 0) {
+                        link_enter_failed(link);
+                        return 1;
+                }
+
+                link_check_ready(link);
+        }
+
+        return 1;
 }
 
-static int dhcp6_pd_prefix_assign(Link *link, struct in6_addr *prefix,
-                                  uint8_t prefix_len,
-                                  uint32_t lifetime_preferred,
-                                  uint32_t lifetime_valid) {
+static int dhcp6_set_pd_route(Link *link, const union in_addr_union *prefix, const union in_addr_union *pd_prefix) {
+        _cleanup_(dhcp6_pd_freep) DHCP6DelegatedPrefix *pd = NULL;
+        _cleanup_(route_freep) Route *route = NULL;
+        Link *assigned_link;
+        Route *ret;
         int r;
 
-        r = radv_add_prefix(link, prefix, prefix_len, lifetime_preferred, lifetime_valid);
+        assert(link);
+        assert(link->manager);
+        assert(prefix);
+        assert(pd_prefix);
+
+        r = route_new(&route);
         if (r < 0)
                 return r;
 
-        r = dhcp6_prefix_add(link->manager, prefix, link);
+        route->family = AF_INET6;
+        route->dst = *prefix;
+        route->dst_prefixlen = 64;
+
+        r = route_configure(route, link, dhcp6_pd_route_handler, &ret);
         if (r < 0)
-                return r;
+                return log_link_error_errno(link, r, "Failed to set DHCPv6 prefix route: %m");
 
-        r = dhcp6_assign_delegated_prefix(link, prefix, prefix_len, lifetime_preferred, lifetime_valid);
+        link->dhcp6_pd_route_messages++;
+
+        r = set_ensure_put(&link->dhcp6_pd_routes, &route_hash_ops, ret);
         if (r < 0)
-                return r;
+                return log_link_error_errno(link, r, "Failed to store DHCPv6 prefix route: %m");
+
+        (void) set_remove(link->dhcp6_pd_routes_old, ret);
+
+        assigned_link = dhcp6_pd_get_link_by_prefix(link, prefix);
+        if (assigned_link) {
+                assert(assigned_link == link);
+                return 0;
+        }
+
+        pd = new(DHCP6DelegatedPrefix, 1);
+        if (!pd)
+                return log_oom();
+
+        *pd = (DHCP6DelegatedPrefix) {
+                .prefix = prefix->in6,
+                .pd_prefix = pd_prefix->in6,
+                .link = link_ref(link),
+        };
+
+        r = hashmap_ensure_allocated(&link->manager->dhcp6_prefixes, &in6_addr_hash_ops);
+        if (r < 0)
+                return log_oom();
+
+        r = hashmap_put(link->manager->dhcp6_prefixes, &pd->prefix, pd);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to store DHCPv6 prefix route at manager: %m");
+
+        r = set_ensure_put(&link->manager->dhcp6_pd_prefixes, &dhcp6_pd_hash_ops, pd);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to store DHCPv6 prefix route at manager: %m");
 
+        TAKE_PTR(pd);
         return 0;
 }
 
-static int dhcp6_route_remove_handler(sd_netlink *nl, sd_netlink_message *m, Link *link) {
+static int dhcp6_pd_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
         int r;
 
         assert(link);
+        assert(link->dhcp6_pd_address_messages > 0);
+
+        link->dhcp6_pd_address_messages--;
 
         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
                 return 1;
 
         r = sd_netlink_message_get_errno(m);
-        if (r < 0)
-                log_link_message_warning_errno(link, m, r, "Received error on unreachable route removal for DHCPv6 delegated subnet");
+        if (r < 0 && r != -EEXIST) {
+                log_link_message_warning_errno(link, m, r, "Could not set DHCPv6 delegated prefix address");
+                link_enter_failed(link);
+                return 1;
+        } else if (r >= 0)
+                (void) manager_rtnl_process_address(rtnl, m, link->manager);
+
+        if (link->dhcp6_pd_address_messages == 0) {
+                log_link_debug(link, "DHCPv6 delegated prefix addresses set");
+                if (link->dhcp6_pd_prefixes_assigned)
+                        link->dhcp6_pd_address_configured = true;
+
+                r = dhcp6_pd_remove_old(link, false);
+                if (r < 0) {
+                        link_enter_failed(link);
+                        return 1;
+                }
+
+                r = link_request_set_routes(link);
+                if (r < 0) {
+                        link_enter_failed(link);
+                        return 1;
+                }
+        }
 
         return 1;
 }
 
-int dhcp6_lease_pd_prefix_lost(sd_dhcp6_client *client, Link* link) {
-        uint32_t lifetime_preferred, lifetime_valid;
-        union in_addr_union pd_prefix;
-        uint8_t pd_prefix_len;
-        sd_dhcp6_lease *lease;
+static int dhcp6_set_pd_address(Link *link,
+                                const union in_addr_union *prefix,
+                                uint8_t prefix_len,
+                                uint32_t lifetime_preferred,
+                                uint32_t lifetime_valid) {
+
+        _cleanup_(address_freep) Address *address = NULL;
+        Address *ret;
         int r;
 
-        r = sd_dhcp6_client_get_lease(client, &lease);
+        assert(link);
+        assert(link->network);
+        assert(prefix);
+
+        if (!link->network->dhcp6_pd_assign)
+                return 0;
+
+        r = address_new(&address);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to allocate address for DHCPv6 delegated prefix: %m");
+
+        address->in_addr = *prefix;
+
+        if (!in_addr_is_null(AF_INET6, &link->network->dhcp6_pd_token))
+                memcpy(address->in_addr.in6.s6_addr + 8, link->network->dhcp6_pd_token.in6.s6_addr + 8, 8);
+        else {
+                r = generate_ipv6_eui_64_address(link, &address->in_addr.in6);
+                if (r < 0)
+                        return log_link_warning_errno(link, r, "Failed to generate EUI64 address for acquired DHCPv6 delegated prefix: %m");
+        }
+
+        address->prefixlen = prefix_len;
+        address->family = AF_INET6;
+        address->cinfo.ifa_prefered = lifetime_preferred;
+        address->cinfo.ifa_valid = lifetime_valid;
+
+        r = address_configure(address, link, dhcp6_pd_address_handler, true, &ret);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to set DHCPv6 delegated prefix address: %m");
+
+        link->dhcp6_pd_address_messages++;
+
+        r = set_ensure_put(&link->dhcp6_pd_addresses, &address_hash_ops, ret);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to store DHCPv6 delegated prefix address: %m");
+
+        (void) set_remove(link->dhcp6_pd_addresses_old, ret);
+
+        return 0;
+}
+
+static int dhcp6_pd_assign_prefix(Link *link, const union in_addr_union *prefix, const union in_addr_union *pd_prefix,
+                                  uint8_t prefix_len, uint32_t lifetime_preferred, uint32_t lifetime_valid) {
+        int r;
+
+        assert(link);
+        assert(prefix);
+
+        r = radv_add_prefix(link, &prefix->in6, prefix_len, lifetime_preferred, lifetime_valid);
         if (r < 0)
                 return r;
 
-        sd_dhcp6_lease_reset_pd_prefix_iter(lease);
+        r = dhcp6_set_pd_route(link, prefix, pd_prefix);
+        if (r < 0)
+                return r;
 
-        while (sd_dhcp6_lease_get_pd(lease, &pd_prefix.in6, &pd_prefix_len,
-                                     &lifetime_preferred,
-                                     &lifetime_valid) >= 0) {
-                _cleanup_free_ char *buf = NULL;
-                _cleanup_(route_freep) Route *route = NULL;
+        r = dhcp6_set_pd_address(link, prefix, prefix_len, lifetime_preferred, lifetime_valid);
+        if (r < 0)
+                return r;
 
-                if (pd_prefix_len >= 64)
-                        continue;
+        return 0;
+}
+
+bool link_dhcp6_pd_is_enabled(Link *link) {
+        if (!link->network)
+                return false;
+
+        return link->network->router_prefix_delegation & RADV_PREFIX_DELEGATION_DHCP6;
+}
+
+static bool link_has_preferred_subnet_id(Link *link) {
+        if (!link->network)
+                return false;
+
+        return link->network->dhcp6_pd_subnet_id >= 0;
+}
+
+static int dhcp6_get_preferred_delegated_prefix(
+                Link *link,
+                const union in_addr_union *masked_pd_prefix,
+                uint8_t pd_prefix_len,
+                union in_addr_union *ret) {
 
-                (void) in_addr_to_string(AF_INET6, &pd_prefix, &buf);
+        /* We start off with the original PD prefix we have been assigned and iterate from there */
+        union in_addr_union prefix;
+        uint64_t n_prefixes;
+        Link *assigned_link;
+        int r;
+
+        assert(link);
+        assert(link->manager);
+        assert(masked_pd_prefix);
+        assert(pd_prefix_len <= 64);
 
-                r = route_new(&route);
+        n_prefixes = UINT64_C(1) << (64 - pd_prefix_len);
+        prefix = *masked_pd_prefix;
+
+        if (link_has_preferred_subnet_id(link)) {
+                uint64_t subnet_id = link->network->dhcp6_pd_subnet_id;
+
+                /* If the link has a preference for a particular subnet id try to allocate that */
+                if (subnet_id >= n_prefixes)
+                        return log_link_warning_errno(link, SYNTHETIC_ERRNO(ERANGE),
+                                                      "subnet id %" PRIu64 " is out of range. Only have %" PRIu64 " subnets.",
+                                                      subnet_id, n_prefixes);
+
+                r = in_addr_prefix_nth(AF_INET6, &prefix, 64, subnet_id);
                 if (r < 0)
-                        return r;
+                        return log_link_warning_errno(link, r,
+                                                      "subnet id %" PRIu64 " is out of range. Only have %" PRIu64 " subnets.",
+                                                      subnet_id, n_prefixes);
 
-                route->family = AF_INET6;
-                route->dst = pd_prefix;
-                route->dst_prefixlen = pd_prefix_len;
-                route->type = RTN_UNREACHABLE;
+                /* Verify that the prefix we did calculate fits in the pd prefix.
+                 * This should not fail as we checked the prefix size beforehand */
+                assert_se(in_addr_prefix_covers(AF_INET6, masked_pd_prefix, pd_prefix_len, &prefix) > 0);
 
-                r = route_remove(route, link, dhcp6_route_remove_handler);
-                if (r < 0) {
-                        log_link_warning_errno(link, r, "Cannot delete unreachable route for DHCPv6 delegated subnet %s/%u: %m",
-                                               strnull(buf),
-                                               pd_prefix_len);
-                        continue;
+                assigned_link = dhcp6_pd_get_link_by_prefix(link, &prefix);
+                if (assigned_link && assigned_link != link) {
+                        _cleanup_free_ char *assigned_buf = NULL;
+
+                        (void) in_addr_to_string(AF_INET6, &prefix, &assigned_buf);
+                        return log_link_warning_errno(link, SYNTHETIC_ERRNO(EAGAIN),
+                                                      "The requested prefix %s is already assigned to another link.",
+                                                      strna(assigned_buf));
                 }
 
-                log_link_debug(link, "Removing unreachable route %s/%u",
-                               strnull(buf), pd_prefix_len);
+                *ret = prefix;
+                return 0;
         }
 
-        return 0;
+        for (uint64_t n = 0; n < n_prefixes; n++) {
+                /* If we do not have an allocation preference just iterate
+                 * through the address space and return the first free prefix. */
+                assigned_link = dhcp6_pd_get_link_by_prefix(link, &prefix);
+                if (!assigned_link || assigned_link == link) {
+                        *ret = prefix;
+                        return 0;
+                }
+
+                r = in_addr_prefix_next(AF_INET6, &prefix, 64);
+                if (r < 0)
+                        return log_link_warning_errno(link, r, "Can't allocate another prefix. Out of address space?: %m");
+        }
+
+        return log_link_warning_errno(link, SYNTHETIC_ERRNO(ERANGE), "Couldn't find a suitable prefix. Ran out of address space.");
 }
 
-static int dhcp6_pd_prefix_distribute(Link *dhcp6_link,
-                                      struct in6_addr *pd_prefix,
+static void dhcp6_pd_prefix_distribute(Link *dhcp6_link,
+                                      const union in_addr_union *masked_pd_prefix,
                                       uint8_t pd_prefix_len,
                                       uint32_t lifetime_preferred,
                                       uint32_t lifetime_valid,
                                       bool assign_preferred_subnet_id) {
 
-        _cleanup_free_ char *assigned_buf = NULL, *buf = NULL;
-        Manager *manager = dhcp6_link->manager;
-        union in_addr_union prefix = {
-                .in6 = *pd_prefix,
-        };
-        bool pool_depleted = false;
-        uint64_t n_prefixes;
         Iterator i;
         Link *link;
         int r;
 
-        assert(manager);
+        assert(dhcp6_link);
+        assert(dhcp6_link->manager);
+        assert(masked_pd_prefix);
         assert(pd_prefix_len <= 64);
 
-        r = in_addr_mask(AF_INET6, &prefix, pd_prefix_len);
-        if (r < 0)
-                return r;
-
-        n_prefixes = UINT64_C(1) << (64 - pd_prefix_len);
-
-        (void) in_addr_to_string(AF_INET6, &prefix, &buf);
-        log_link_debug(dhcp6_link, "Assigning up to %" PRIu64 " prefixes from %s/%u",
-                       n_prefixes, strnull(buf), pd_prefix_len);
-
-        HASHMAP_FOREACH(link, manager->links, i) {
+        HASHMAP_FOREACH(link, dhcp6_link->manager->links, i) {
+                _cleanup_free_ char *assigned_buf = NULL;
                 union in_addr_union assigned_prefix;
 
                 if (link == dhcp6_link)
                         continue;
 
-                if (!dhcp6_get_prefix_delegation(link))
+                if (!link_dhcp6_pd_is_enabled(link))
                         continue;
 
-                if (assign_preferred_subnet_id != dhcp6_has_preferred_subnet_id(link))
+                if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
                         continue;
 
-                r = dhcp6_get_preferred_delegated_prefix(manager, link, &prefix.in6, pd_prefix_len,
-                                                         &assigned_prefix.in6);
-
-                if (assign_preferred_subnet_id && r == -EAGAIN) {
-                        /* A link has a preferred subnet_id but that one is
-                         * already taken by another link. Now all the remaining
-                         * links will also not obtain a prefix. */
-                        pool_depleted = true;
+                if (assign_preferred_subnet_id != link_has_preferred_subnet_id(link))
                         continue;
-                } else if (r < 0)
-                        return r;
+
+                r = dhcp6_pd_get_assigned_prefix(link, masked_pd_prefix, &assigned_prefix);
+                if (r < 0) {
+                        r = dhcp6_get_preferred_delegated_prefix(link, masked_pd_prefix, pd_prefix_len, &assigned_prefix);
+                        if (r < 0) {
+                                link->dhcp6_pd_prefixes_assigned = false;
+                                continue;
+                        }
+                }
 
                 (void) in_addr_to_string(AF_INET6, &assigned_prefix, &assigned_buf);
-                r = dhcp6_pd_prefix_assign(link, &assigned_prefix.in6, 64,
+                r = dhcp6_pd_assign_prefix(link, &assigned_prefix, masked_pd_prefix, 64,
                                            lifetime_preferred, lifetime_valid);
                 if (r < 0) {
-                        log_link_error_errno(link, r, "Unable to assign/update prefix %s/64 from %s/%u for link: %m",
-                                             strnull(assigned_buf),
-                                             strnull(buf), pd_prefix_len);
+                        log_link_error_errno(link, r, "Unable to assign/update prefix %s/64: %m",
+                                             strna(assigned_buf));
+                        link_enter_failed(link);
                 } else
-                        log_link_debug(link, "Assigned prefix %s/64 from %s/%u to link",
-                                       strnull(assigned_buf),
-                                       strnull(buf), pd_prefix_len);
+                        log_link_debug(link, "Assigned prefix %s/64", strna(assigned_buf));
         }
+}
 
-        /* If one of the link requests couldn't be fulfilled, signal that we
-           should try again with another prefix. */
-        if (pool_depleted)
-                return -EAGAIN;
+static int dhcp6_pd_prepare(Link *link) {
+        Address *address;
+        Route *route;
+        int r;
+
+        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
+                return 0;
+
+        if (!link_dhcp6_pd_is_enabled(link))
+                return 0;
+
+        link_dirty(link);
+
+        link->dhcp6_pd_address_configured = false;
+        link->dhcp6_pd_route_configured = false;
+        link->dhcp6_pd_prefixes_assigned = true;
+
+        while ((address = set_steal_first(link->dhcp6_pd_addresses))) {
+                r = set_ensure_put(&link->dhcp6_pd_addresses_old, &address_hash_ops, address);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Failed to store old DHCPv6 Prefix Delegation address: %m");
+        }
+
+        while ((route = set_steal_first(link->dhcp6_pd_routes))) {
+                r = set_ensure_put(&link->dhcp6_pd_routes_old, &route_hash_ops, route);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Failed to store old DHCPv6 Prefix Delegation route: %m");
+        }
 
         return 0;
 }
 
-static int dhcp6_route_handler(sd_netlink *nl, sd_netlink_message *m, Link *link) {
+static int dhcp6_pd_finalize(Link *link) {
+        int r;
+
+        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
+                return 0;
+
+        if (!link_dhcp6_pd_is_enabled(link))
+                return 0;
+
+        if (link->dhcp6_pd_address_messages == 0) {
+                if (link->dhcp6_pd_prefixes_assigned)
+                        link->dhcp6_pd_address_configured = true;
+        } else {
+                log_link_debug(link, "Setting DHCPv6 PD addresses");
+                /* address_handler calls link_request_set_routes() and link_request_set_nexthop().
+                 * Before they are called, the related flags must be cleared. Otherwise, the link
+                 * becomes configured state before routes are configured. */
+                link->static_routes_configured = false;
+                link->static_nexthops_configured = false;
+        }
+
+        if (link->dhcp6_pd_route_messages == 0) {
+                if (link->dhcp6_pd_prefixes_assigned)
+                        link->dhcp6_pd_route_configured = true;
+        } else
+                log_link_debug(link, "Setting DHCPv6 PD routes");
+
+        r = dhcp6_pd_remove_old(link, false);
+        if (r < 0)
+                return r;
+
+        if (link->dhcp6_pd_address_configured && link->dhcp6_pd_route_configured)
+                link_check_ready(link);
+        else
+                link_set_state(link, LINK_STATE_CONFIGURING);
+
+        return 0;
+}
+
+static void dhcp6_pd_prefix_lost(Link *dhcp6_link) {
+        Link *link;
+        Iterator i;
         int r;
 
+        assert(dhcp6_link);
+        assert(dhcp6_link->manager);
+
+        HASHMAP_FOREACH(link, dhcp6_link->manager->links, i) {
+                if (link == dhcp6_link)
+                        continue;
+
+                if (!link_dhcp6_pd_is_enabled(link))
+                        continue;
+
+                r = dhcp6_pd_remove(link);
+                if (r < 0)
+                        link_enter_failed(link);
+        }
+}
+
+static int dhcp6_remove_old(Link *link, bool force);
+
+static int dhcp6_address_callback(Address *address) {
+        Address *a;
+        Iterator i;
+
+        assert(address);
+        assert(address->link);
+
+        /* Make this called only once */
+        SET_FOREACH(a, address->link->dhcp6_addresses, i)
+                a->callback = NULL;
+
+        return dhcp6_remove_old(address->link, true);
+}
+
+static int dhcp6_remove_old(Link *link, bool force) {
+        Address *address;
+        Route *route;
+        Iterator i;
+        int k, r = 0;
+
         assert(link);
-        assert(link->dhcp6_route_messages > 0);
 
-        link->dhcp6_route_messages--;
+        if (!force && (!link->dhcp6_address_configured || !link->dhcp6_route_configured))
+                return 0;
 
-        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
-                return 1;
+        if (set_isempty(link->dhcp6_addresses_old) && set_isempty(link->dhcp6_routes_old))
+                return 0;
 
-        r = sd_netlink_message_get_errno(m);
-        if (r < 0 && r != -EEXIST) {
-                log_link_message_warning_errno(link, m, r, "Failed to add unreachable route for DHCPv6 delegated subnet");
-                link_enter_failed(link);
-                return 1;
+        if (!force) {
+                bool set_callback = !set_isempty(link->dhcp6_addresses);
+
+                SET_FOREACH(address, link->dhcp6_addresses, i)
+                        if (address_is_ready(address)) {
+                                set_callback = false;
+                                break;
+                        }
+
+                if (set_callback) {
+                        SET_FOREACH(address, link->dhcp6_addresses, i)
+                                address->callback = dhcp6_address_callback;
+                        return 0;
+                }
         }
 
-        if (link->dhcp6_route_messages == 0) {
-                log_link_debug(link, "Unreachable routes for DHCPv6 delegated subnets set");
-                link->dhcp6_route_configured = true;
-                link_check_ready(link);
+        log_link_debug(link, "Removing old DHCPv6 addresses and routes.");
+
+        link_dirty(link);
+
+        SET_FOREACH(route, link->dhcp6_routes_old, i) {
+                k = route_remove(route, link, NULL);
+                if (k < 0)
+                        r = k;
         }
 
-        return 1;
+        SET_FOREACH(address, link->dhcp6_addresses_old, i) {
+                k = address_remove(address, link, NULL);
+                if (k < 0)
+                        r = k;
+        }
+
+        return r;
 }
 
-static int dhcp6_lease_pd_prefix_acquired(sd_dhcp6_client *client, Link *link) {
-        uint32_t lifetime_preferred, lifetime_valid;
-        union in_addr_union pd_prefix;
-        sd_dhcp6_lease *lease;
-        uint8_t pd_prefix_len;
-        int r;
+static int dhcp6_remove(Link *link) {
+        Address *address;
+        Route *route;
+        Iterator i;
+        int k, r = 0;
+
+        assert(link);
 
+        link->dhcp6_address_configured = false;
         link->dhcp6_route_configured = false;
 
-        r = sd_dhcp6_client_get_lease(client, &lease);
-        if (r < 0)
+        k = dhcp6_remove_old(link, true);
+        if (k < 0)
+                r = k;
+
+        if (set_isempty(link->dhcp6_addresses) && set_isempty(link->dhcp6_routes))
                 return r;
 
-        sd_dhcp6_lease_reset_pd_prefix_iter(lease);
+        log_link_debug(link, "Removing DHCPv6 addresses and routes.");
 
-        while (sd_dhcp6_lease_get_pd(lease, &pd_prefix.in6, &pd_prefix_len,
-                                     &lifetime_preferred,
-                                     &lifetime_valid) >= 0) {
+        link_dirty(link);
+
+        SET_FOREACH(route, link->dhcp6_routes, i) {
+                k = route_remove(route, link, NULL);
+                if (k < 0)
+                        r = k;
+        }
 
-                _cleanup_free_ char *buf = NULL;
+        SET_FOREACH(address, link->dhcp6_addresses, i) {
+                k = address_remove(address, link, NULL);
+                if (k < 0)
+                        r = k;
+        }
+
+        return r;
+}
+
+static int dhcp6_route_handler(sd_netlink *nl, sd_netlink_message *m, Link *link) {
+        int r;
+
+        assert(link);
+        assert(link->dhcp6_route_messages > 0);
+
+        link->dhcp6_route_messages--;
+
+        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
+                return 1;
+
+        r = sd_netlink_message_get_errno(m);
+        if (r < 0 && r != -EEXIST) {
+                log_link_message_warning_errno(link, m, r, "Failed to add unreachable route for DHCPv6 delegated subnet");
+                link_enter_failed(link);
+                return 1;
+        }
 
-                (void) in_addr_to_string(AF_INET6, &pd_prefix, &buf);
+        if (link->dhcp6_route_messages == 0) {
+                log_link_debug(link, "Unreachable routes for DHCPv6 delegated subnets set");
+                link->dhcp6_route_configured = true;
 
-                if (pd_prefix_len > 64) {
-                        log_link_debug(link, "PD Prefix length > 64, ignoring prefix %s/%u",
-                                       strnull(buf), pd_prefix_len);
-                        continue;
+                r = dhcp6_remove_old(link, false);
+                if (r < 0) {
+                        link_enter_failed(link);
+                        return 1;
                 }
 
-                if (pd_prefix_len < 48)
-                        log_link_warning(link, "PD Prefix length < 48, looks unusual %s/%u",
-                                       strnull(buf), pd_prefix_len);
+                link_check_ready(link);
+        }
 
-                if (pd_prefix_len < 64) {
-                        _cleanup_(route_freep) Route *route = NULL;
+        return 1;
+}
 
-                        r = route_new(&route);
-                        if (r < 0)
-                                return r;
+static int dhcp6_set_unreachable_route(Link *link, const union in_addr_union *addr, uint8_t prefixlen) {
+        _cleanup_(route_freep) Route *route = NULL;
+        _cleanup_free_ char *buf = NULL;
+        Route *ret;
+        int r;
 
-                        route->family = AF_INET6;
-                        route->dst = pd_prefix;
-                        route->dst_prefixlen = pd_prefix_len;
-                        route->table = link_get_dhcp_route_table(link);
-                        route->type = RTN_UNREACHABLE;
+        assert(link);
+        assert(addr);
 
-                        r = route_configure(route, link, dhcp6_route_handler);
-                        if (r < 0) {
-                                log_link_warning_errno(link, r, "Cannot configure unreachable route for delegated subnet %s/%u: %m",
-                                                       strnull(buf),
-                                                       pd_prefix_len);
-                                continue;
-                        }
-                        if (r > 0)
-                                link->dhcp6_route_messages++;
+        (void) in_addr_to_string(AF_INET6, addr, &buf);
 
-                        log_link_debug(link, "Configuring unreachable route for %s/%u",
-                                       strnull(buf), pd_prefix_len);
-                } else
-                        log_link_debug(link, "Not adding a blocking route since distributed prefix is /64");
+        if (prefixlen > 64) {
+                log_link_debug(link, "PD Prefix length > 64, ignoring prefix %s/%u",
+                               strna(buf), prefixlen);
+                return 0;
+        }
 
-                /* We are doing prefix allocation in two steps:
-                 * 1. all those links that have a preferred subnet id will be assigned their subnet
-                 * 2. all those links that remain will receive prefixes in sequential
-                 *    order. Prefixes that were previously already allocated to another
-                 *    link will be skipped.
+        if (prefixlen == 64) {
+                log_link_debug(link, "Not adding a blocking route for DHCPv6 delegated subnet %s/64 since distributed prefix is 64",
+                               strna(buf));
+                return 1;
+        }
 
-                 * If a subnet id request couldn't be fulfilled the failure will be logged (as error)
-                 * and no further attempts at obtaining a prefix will be made.
+        if (prefixlen < 48)
+                log_link_warning(link, "PD Prefix length < 48, looks unusual %s/%u",
+                                 strna(buf), prefixlen);
 
-                 * The assignment has to be split in two phases since subnet id
-                 * preferences should be honored. Meaning that any subnet id should be
-                 * handed out to the requesting link and not to some link that didn't
-                 * specify any preference. */
+        r = route_new(&route);
+        if (r < 0)
+                return log_oom();
 
-                r = dhcp6_pd_prefix_distribute(link, &pd_prefix.in6,
-                                               pd_prefix_len,
-                                               lifetime_preferred,
-                                               lifetime_valid,
-                                               true);
-                if (r < 0 && r != -EAGAIN)
-                        return r;
+        route->family = AF_INET6;
+        route->dst = *addr;
+        route->dst_prefixlen = prefixlen;
+        route->table = link_get_dhcp_route_table(link);
+        route->type = RTN_UNREACHABLE;
 
-                /* if r == -EAGAIN then the allocation failed because we ran
-                 * out of addresses for the preferred subnet id's. This doesn't
-                 * mean we can't fulfill other prefix requests.
-                 *
-                 * Since we do not have dedicated lists of links that request
-                 * specific subnet id's and those that accept any prefix we
-                 * *must* reset the iterator to the start as otherwise some
-                 * links might not get their requested prefix. */
-
-                r = dhcp6_pd_prefix_distribute(link, &pd_prefix.in6,
-                                               pd_prefix_len,
-                                               lifetime_preferred,
-                                               lifetime_valid,
-                                               false);
-                if (r < 0 && r != -EAGAIN)
-                        return r;
+        r = route_configure(route, link, dhcp6_route_handler, &ret);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to set unreachable route for DHCPv6 delegated subnet %s/%u: %m",
+                                            strna(buf), prefixlen);
 
-                /* If the prefix distribution did return -EAGAIN we will try to
-                 * fulfill those with the next available pd delegated prefix. */
-        }
+        link->dhcp6_route_messages++;
 
-        if (link->dhcp6_route_messages == 0) {
-                link->dhcp6_route_configured = true;
-                link_check_ready(link);
-        } else {
-                log_link_debug(link, "Setting unreachable routes for DHCPv6 delegated subnets");
-                link_set_state(link, LINK_STATE_CONFIGURING);
-        }
+        r = set_ensure_put(&link->dhcp6_routes, &route_hash_ops, ret);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to store unreachable route for DHCPv6 delegated subnet %s/%u: %m",
+                                            strna(buf), prefixlen);
 
-        return 0;
+        (void) set_remove(link->dhcp6_routes_old, ret);
+
+        return 1;
 }
 
-int dhcp6_request_prefix_delegation(Link *link) {
-        Link *l;
+static int dhcp6_pd_prefix_acquired(Link *dhcp6_link) {
         Iterator i;
+        Link *link;
+        int r;
 
-        assert_return(link, -EINVAL);
-        assert_return(link->manager, -EOPNOTSUPP);
+        assert(dhcp6_link);
+        assert(dhcp6_link->dhcp6_lease);
 
-        if (dhcp6_get_prefix_delegation(link) <= 0)
-                return 0;
+        HASHMAP_FOREACH(link, dhcp6_link->manager->links, i) {
+                if (link == dhcp6_link)
+                        continue;
 
-        log_link_debug(link, "Requesting DHCPv6 prefixes to be delegated for new link");
+                r = dhcp6_pd_prepare(link);
+                if (r < 0)
+                        link_enter_failed(link);
+        }
 
-        HASHMAP_FOREACH(l, link->manager->links, i) {
-                int r, enabled;
+        for (sd_dhcp6_lease_reset_pd_prefix_iter(dhcp6_link->dhcp6_lease);;) {
+                uint32_t lifetime_preferred, lifetime_valid;
+                union in_addr_union pd_prefix, prefix;
+                uint8_t pd_prefix_len;
 
-                if (l == link)
-                        continue;
+                r = sd_dhcp6_lease_get_pd(dhcp6_link->dhcp6_lease, &pd_prefix.in6, &pd_prefix_len,
+                                          &lifetime_preferred, &lifetime_valid);
+                if (r < 0)
+                        break;
 
-                if (!l->dhcp6_client)
+                r = dhcp6_set_unreachable_route(dhcp6_link, &pd_prefix, pd_prefix_len);
+                if (r < 0)
+                        return r;
+                if (r == 0)
                         continue;
 
-                r = sd_dhcp6_client_get_prefix_delegation(l->dhcp6_client, &enabled);
-                if (r < 0) {
-                        log_link_warning_errno(l, r, "Cannot get prefix delegation when adding new link: %m");
-                        continue;
-                }
+                /* We are doing prefix allocation in two steps:
+                 * 1. all those links that have a preferred subnet id will be assigned their subnet
+                 * 2. all those links that remain will receive prefixes in sequential order. Prefixes
+                 *    that were previously already allocated to another link will be skipped.
+                 * The assignment has to be split in two phases since subnet id
+                 * preferences should be honored. Meaning that any subnet id should be
+                 * handed out to the requesting link and not to some link that didn't
+                 * specify any preference. */
 
-                if (enabled == 0) {
-                        r = sd_dhcp6_client_set_prefix_delegation(l->dhcp6_client, 1);
-                        if (r < 0) {
-                                log_link_warning_errno(l, r, "Cannot enable prefix delegation when adding new link: %m");
-                                continue;
-                        }
-                }
+                assert(pd_prefix_len <= 64);
 
-                r = sd_dhcp6_client_is_running(l->dhcp6_client);
-                if (r <= 0)
-                        continue;
+                prefix = pd_prefix;
+                r = in_addr_mask(AF_INET6, &prefix, pd_prefix_len);
+                if (r < 0)
+                        return log_link_error_errno(dhcp6_link, r, "Failed to mask DHCPv6 PD prefix: %m");
 
-                if (enabled != 0) {
-                        log_link_debug(l, "Requesting re-assignment of delegated prefixes after adding new link");
-                        (void) dhcp6_lease_pd_prefix_acquired(l->dhcp6_client, l);
+                if (DEBUG_LOGGING) {
+                        uint64_t n_prefixes = UINT64_C(1) << (64 - pd_prefix_len);
+                        _cleanup_free_ char *buf = NULL;
 
-                        continue;
+                        (void) in_addr_to_string(AF_INET6, &prefix, &buf);
+                        log_link_debug(dhcp6_link, "Assigning up to %" PRIu64 " prefixes from %s/%u",
+                                       n_prefixes, strna(buf), pd_prefix_len);
                 }
 
-                r = sd_dhcp6_client_stop(l->dhcp6_client);
-                if (r < 0) {
-                        log_link_warning_errno(l, r, "Cannot stop DHCPv6 prefix delegation client after adding new link: %m");
-                        continue;
-                }
+                dhcp6_pd_prefix_distribute(dhcp6_link,
+                                           &prefix,
+                                           pd_prefix_len,
+                                           lifetime_preferred,
+                                           lifetime_valid,
+                                           true);
+
+                dhcp6_pd_prefix_distribute(dhcp6_link,
+                                           &prefix,
+                                           pd_prefix_len,
+                                           lifetime_preferred,
+                                           lifetime_valid,
+                                           false);
+        }
 
-                r = sd_dhcp6_client_start(l->dhcp6_client);
-                if (r < 0) {
-                        log_link_warning_errno(l, r, "Cannot restart DHCPv6 prefix delegation client after adding new link: %m");
+        HASHMAP_FOREACH(link, dhcp6_link->manager->links, i) {
+                if (link == dhcp6_link)
                         continue;
-                }
 
-                log_link_debug(l, "Restarted DHCPv6 client to acquire prefix delegations after adding new link");
+                r = dhcp6_pd_finalize(link);
+                if (r < 0)
+                        link_enter_failed(link);
         }
 
         return 0;
@@ -545,6 +952,13 @@ static int dhcp6_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *
         if (link->dhcp6_address_messages == 0) {
                 log_link_debug(link, "DHCPv6 addresses set");
                 link->dhcp6_address_configured = true;
+
+                r = dhcp6_remove_old(link, false);
+                if (r < 0) {
+                        link_enter_failed(link);
+                        return 1;
+                }
+
                 r = link_request_set_routes(link);
                 if (r < 0) {
                         link_enter_failed(link);
@@ -555,19 +969,20 @@ static int dhcp6_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *
         return 1;
 }
 
-static int dhcp6_address_change(
+static int dhcp6_update_address(
                 Link *link,
-                struct in6_addr *ip6_addr,
+                const struct in6_addr *ip6_addr,
                 uint32_t lifetime_preferred,
                 uint32_t lifetime_valid) {
 
         _cleanup_(address_freep) Address *addr = NULL;
         _cleanup_free_ char *buffer = NULL;
+        Address *ret;
         int r;
 
         r = address_new(&addr);
         if (r < 0)
-                return r;
+                return log_oom();
 
         addr->family = AF_INET6;
         addr->in_addr.in6 = *ip6_addr;
@@ -577,60 +992,146 @@ static int dhcp6_address_change(
         addr->cinfo.ifa_valid = lifetime_valid;
 
         (void) in_addr_to_string(addr->family, &addr->in_addr, &buffer);
-        log_link_info(link,
-                      "DHCPv6 address %s/%d timeout preferred %d valid %d",
-                      strnull(buffer), addr->prefixlen, lifetime_preferred, lifetime_valid);
+        log_link_info(link, "DHCPv6 address %s/%u timeout preferred %d valid %d",
+                      strna(buffer), addr->prefixlen, lifetime_preferred, lifetime_valid);
+
+        r = address_configure(addr, link, dhcp6_address_handler, true, &ret);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to set DHCPv6 address %s/%u: %m",
+                                            strna(buffer), addr->prefixlen);
 
-        r = address_configure(addr, link, dhcp6_address_handler, true);
+        link->dhcp6_address_messages++;
+
+        r = set_ensure_put(&link->dhcp6_addresses, &address_hash_ops, ret);
         if (r < 0)
-                return log_link_warning_errno(link, r, "Could not assign DHCPv6 address: %m");
-        if (r > 0)
-                link->dhcp6_address_messages++;
+                return log_link_error_errno(link, r, "Failed to store DHCPv6 address %s/%u: %m",
+                                            strna(buffer), addr->prefixlen);
+
+        (void) set_remove(link->dhcp6_addresses_old, ret);
 
         return 0;
 }
 
-static int dhcp6_lease_address_acquired(sd_dhcp6_client *client, Link *link) {
+static int dhcp6_address_acquired(Link *link) {
         int r;
+
+        assert(link);
+        assert(link->dhcp6_lease);
+
+        for (sd_dhcp6_lease_reset_address_iter(link->dhcp6_lease);;) {
+                uint32_t lifetime_preferred, lifetime_valid;
+                struct in6_addr ip6_addr;
+
+                r = sd_dhcp6_lease_get_address(link->dhcp6_lease, &ip6_addr, &lifetime_preferred, &lifetime_valid);
+                if (r < 0)
+                        break;
+
+                r = dhcp6_update_address(link, &ip6_addr, lifetime_preferred, lifetime_valid);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
+
+static int dhcp6_lease_ip_acquired(sd_dhcp6_client *client, Link *link) {
+        _cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease_old = NULL;
         sd_dhcp6_lease *lease;
-        struct in6_addr ip6_addr;
-        uint32_t lifetime_preferred, lifetime_valid;
+        Address *a;
+        Route *rt;
+        int r;
 
         link->dhcp6_address_configured = false;
+        link->dhcp6_route_configured = false;
+
+        link_dirty(link);
+
+        while ((a = set_steal_first(link->dhcp6_addresses))) {
+                r = set_ensure_put(&link->dhcp6_addresses_old, &address_hash_ops, a);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Failed to store old DHCPv6 address: %m");
+        }
+
+        while ((rt = set_steal_first(link->dhcp6_routes))) {
+                r = set_ensure_put(&link->dhcp6_routes_old, &route_hash_ops, rt);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Failed to store old DHCPv6 route: %m");
+        }
 
         r = sd_dhcp6_client_get_lease(client, &lease);
         if (r < 0)
-                return r;
+                return log_link_error_errno(link, r, "Failed to get DHCPv6 lease: %m");
 
-        sd_dhcp6_lease_reset_address_iter(lease);
-        while (sd_dhcp6_lease_get_address(lease, &ip6_addr,
-                                                 &lifetime_preferred,
-                                                 &lifetime_valid) >= 0) {
+        lease_old = TAKE_PTR(link->dhcp6_lease);
+        link->dhcp6_lease = sd_dhcp6_lease_ref(lease);
+
+        r = dhcp6_address_acquired(link);
+        if (r < 0)
+                return r;
 
-                r = dhcp6_address_change(link, &ip6_addr, lifetime_preferred, lifetime_valid);
+        if (dhcp6_lease_has_pd_prefix(lease)) {
+                r = dhcp6_pd_prefix_acquired(link);
                 if (r < 0)
                         return r;
-        }
+        } else if (dhcp6_lease_has_pd_prefix(lease_old))
+                /* When we had PD prefixes but not now, we need to remove them. */
+                dhcp6_pd_prefix_lost(link);
 
-        if (link->dhcp6_address_messages == 0) {
+        if (link->dhcp6_address_messages == 0)
                 link->dhcp6_address_configured = true;
-                return link_request_set_routes(link);
-        } else {
+        else {
                 log_link_debug(link, "Setting DHCPv6 addresses");
                 /* address_handler calls link_request_set_routes() and link_request_set_nexthop().
                  * Before they are called, the related flags must be cleared. Otherwise, the link
                  * becomes configured state before routes are configured. */
                 link->static_routes_configured = false;
                 link->static_nexthops_configured = false;
-                link_set_state(link, LINK_STATE_CONFIGURING);
         }
 
+        if (link->dhcp6_route_messages == 0)
+                link->dhcp6_route_configured = true;
+        else
+                log_link_debug(link, "Setting unreachable routes for DHCPv6 delegated subnets");
+
+        r = dhcp6_remove_old(link, false);
+        if (r < 0)
+                return r;
+
+        if (link->dhcp6_address_configured && link->dhcp6_route_configured)
+                link_check_ready(link);
+        else
+                link_set_state(link, LINK_STATE_CONFIGURING);
+
         return 0;
 }
 
-static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
+static int dhcp6_lease_information_acquired(sd_dhcp6_client *client, Link *link) {
+        return 0;
+}
+
+static int dhcp6_lease_lost(Link *link) {
         int r;
+
+        assert(link);
+        assert(link->manager);
+
+        log_link_info(link, "DHCPv6 lease lost");
+
+        if (dhcp6_lease_has_pd_prefix(link->dhcp6_lease))
+                dhcp6_pd_prefix_lost(link);
+
+        link->dhcp6_lease = sd_dhcp6_lease_unref(link->dhcp6_lease);
+
+        r = dhcp6_remove(link);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
+static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
         Link *link = userdata;
+        int r;
 
         assert(link);
         assert(link->network);
@@ -638,39 +1139,27 @@ static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
                 return;
 
-        switch(event) {
+        switch (event) {
         case SD_DHCP6_CLIENT_EVENT_STOP:
         case SD_DHCP6_CLIENT_EVENT_RESEND_EXPIRE:
         case SD_DHCP6_CLIENT_EVENT_RETRANS_MAX:
-                if (sd_dhcp6_client_get_lease(client, NULL) >= 0)
-                        log_link_warning(link, "DHCPv6 lease lost");
-
-                (void) dhcp6_lease_pd_prefix_lost(client, link);
-                (void) dhcp6_prefix_remove_all(link->manager, link);
-
-                link_dirty(link);
+                r = dhcp6_lease_lost(link);
+                if (r < 0)
+                        link_enter_failed(link);
                 break;
 
         case SD_DHCP6_CLIENT_EVENT_IP_ACQUIRE:
-                r = dhcp6_lease_address_acquired(client, link);
+                r = dhcp6_lease_ip_acquired(client, link);
                 if (r < 0) {
                         link_enter_failed(link);
                         return;
                 }
 
-                r = dhcp6_lease_pd_prefix_acquired(client, link);
-                if (r < 0)
-                        log_link_debug_errno(link, r, "DHCPv6 did not receive prefixes to delegate: %m");
-
                 _fallthrough_;
         case SD_DHCP6_CLIENT_EVENT_INFORMATION_REQUEST:
                 r = dhcp6_lease_information_acquired(client, link);
-                if (r < 0) {
+                if (r < 0)
                         link_enter_failed(link);
-                        return;
-                }
-
-                link_dirty(link);
                 break;
 
         default:
@@ -680,8 +1169,6 @@ static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
                         log_link_warning(link, "DHCPv6 unknown event: %d", event);
                 return;
         }
-
-        link_check_ready(link);
 }
 
 int dhcp6_request_address(Link *link, int ir) {
@@ -691,7 +1178,7 @@ int dhcp6_request_address(Link *link, int ir) {
         assert(link);
         assert(link->dhcp6_client);
         assert(link->network);
-        assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*)&link->ipv6ll_address) > 0);
+        assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*) &link->ipv6ll_address) > 0);
 
         r = sd_dhcp6_client_is_running(link->dhcp6_client);
         if (r < 0)
@@ -705,8 +1192,7 @@ int dhcp6_request_address(Link *link, int ir) {
         if (pd && ir && link->network->dhcp6_force_pd_other_information) {
                 log_link_debug(link, "Enabling managed mode to request DHCPv6 PD with 'Other Information' set");
 
-                r = sd_dhcp6_client_set_address_request(link->dhcp6_client,
-                                                        false);
+                r = sd_dhcp6_client_set_address_request(link->dhcp6_client, false);
                 if (r < 0)
                         return r;
 
@@ -730,13 +1216,88 @@ int dhcp6_request_address(Link *link, int ir) {
                         return r;
         }
 
-        r = sd_dhcp6_client_set_information_request(link->dhcp6_client, ir);
-        if (r < 0)
-                return r;
+        r = sd_dhcp6_client_set_information_request(link->dhcp6_client, ir);
+        if (r < 0)
+                return r;
+
+        r = sd_dhcp6_client_start(link->dhcp6_client);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
+int dhcp6_request_prefix_delegation(Link *link) {
+        Link *l;
+        Iterator i;
+
+        assert(link);
+        assert(link->manager);
+
+        if (!link_dhcp6_pd_is_enabled(link))
+                return 0;
+
+        log_link_debug(link, "Requesting DHCPv6 prefixes to be delegated for new link");
+
+        HASHMAP_FOREACH(l, link->manager->links, i) {
+                int r, enabled;
+
+                if (l == link)
+                        continue;
+
+                if (!l->dhcp6_client)
+                        continue;
+
+                r = sd_dhcp6_client_get_prefix_delegation(l->dhcp6_client, &enabled);
+                if (r < 0) {
+                        log_link_warning_errno(l, r, "Cannot get prefix delegation when adding new link: %m");
+                        link_enter_failed(l);
+                        continue;
+                }
+
+                if (enabled == 0) {
+                        r = sd_dhcp6_client_set_prefix_delegation(l->dhcp6_client, 1);
+                        if (r < 0) {
+                                log_link_warning_errno(l, r, "Cannot enable prefix delegation when adding new link: %m");
+                                link_enter_failed(l);
+                                continue;
+                        }
+                }
+
+                r = sd_dhcp6_client_is_running(l->dhcp6_client);
+                if (r <= 0)
+                        continue;
+
+                if (enabled != 0) {
+                        if (dhcp6_lease_has_pd_prefix(l->dhcp6_lease)) {
+                                log_link_debug(l, "Requesting re-assignment of delegated prefixes after adding new link");
+                                r = dhcp6_pd_prefix_acquired(l);
+                                if (r < 0)
+                                        link_enter_failed(l);
+                        }
+                        continue;
+                }
+
+                r = sd_dhcp6_client_stop(l->dhcp6_client);
+                if (r < 0) {
+                        log_link_warning_errno(l, r, "Cannot stop DHCPv6 prefix delegation client after adding new link: %m");
+                        link_enter_failed(l);
+                        continue;
+                }
+
+                r = sd_dhcp6_client_start(l->dhcp6_client);
+                if (r < 0) {
+                        log_link_warning_errno(l, r, "Cannot restart DHCPv6 prefix delegation client after adding new link: %m");
+                        link_enter_failed(l);
+                        continue;
+                }
+
+                log_link_debug(l, "Restarted DHCPv6 client to acquire prefix delegations after adding new link");
+        }
 
-        r = sd_dhcp6_client_start(link->dhcp6_client);
-        if (r < 0)
-                return r;
+        /* dhcp6_pd_prefix_acquired() may make the link in failed state. */
+        if (link->state == LINK_STATE_FAILED)
+                return -ENOANO;
 
         return 0;
 }
@@ -770,6 +1331,26 @@ static int dhcp6_set_hostname(sd_dhcp6_client *client, Link *link) {
         return 0;
 }
 
+static bool dhcp6_enable_prefix_delegation(Link *dhcp6_link) {
+        Link *link;
+        Iterator i;
+
+        assert(dhcp6_link);
+        assert(dhcp6_link->manager);
+
+        HASHMAP_FOREACH(link, dhcp6_link->manager->links, i) {
+                if (link == dhcp6_link)
+                        continue;
+
+                if (!link_dhcp6_pd_is_enabled(link))
+                        continue;
+
+                return true;
+        }
+
+        return false;
+}
+
 int dhcp6_configure(Link *link) {
         _cleanup_(sd_dhcp6_client_unrefp) sd_dhcp6_client *client = NULL;
         sd_dhcp6_option *vendor_option;
@@ -899,246 +1480,6 @@ int dhcp6_configure(Link *link) {
         return 0;
 }
 
-static Link *dhcp6_prefix_get(Manager *m, struct in6_addr *addr) {
-        assert_return(m, NULL);
-        assert_return(addr, NULL);
-
-        return hashmap_get(m->dhcp6_prefixes, addr);
-}
-
-static int dhcp6_pd_route_handler(sd_netlink *nl, sd_netlink_message *m, Link *link) {
-        int r;
-
-        assert(link);
-        assert(link->dhcp6_pd_route_messages > 0);
-
-        link->dhcp6_pd_route_messages--;
-
-        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
-                return 1;
-
-        r = sd_netlink_message_get_errno(m);
-        if (r < 0 && r != -EEXIST) {
-                log_link_message_warning_errno(link, m, r, "Failed to add DHCPv6 Prefix Delegation route");
-                link_enter_failed(link);
-                return 1;
-        }
-
-        if (link->dhcp6_pd_route_messages == 0) {
-                log_link_debug(link, "DHCPv6 prefix delegation routes set");
-                link->dhcp6_pd_route_configured = true;
-                link_check_ready(link);
-        }
-
-        return 1;
-}
-
-static int dhcp6_prefix_add(Manager *m, struct in6_addr *addr, Link *link) {
-        _cleanup_(route_freep) Route *route = NULL;
-        _cleanup_free_ struct in6_addr *a = NULL;
-        _cleanup_free_ char *buf = NULL;
-        Link *assigned_link;
-        int r;
-
-        assert_return(m, -EINVAL);
-        assert_return(addr, -EINVAL);
-
-        r = route_new(&route);
-        if (r < 0)
-                return r;
-
-        route->family = AF_INET6;
-        route->dst.in6 = *addr;
-        route->dst_prefixlen = 64;
-
-        link->dhcp6_pd_route_configured = false;
-        link_set_state(link, LINK_STATE_CONFIGURING);
-
-        r = route_configure(route, link, dhcp6_pd_route_handler);
-        if (r < 0)
-                return r;
-        if (r > 0)
-                link->dhcp6_pd_route_messages++;
-
-        (void) in_addr_to_string(AF_INET6, (union in_addr_union *) addr, &buf);
-        log_link_debug(link, "Adding prefix route %s/64", strnull(buf));
-
-        assigned_link = hashmap_get(m->dhcp6_prefixes, addr);
-        if (assigned_link) {
-                assert(assigned_link == link);
-                return 0;
-        }
-
-        a = newdup(struct in6_addr, addr, 1);
-        if (!a)
-                return -ENOMEM;
-
-        r = hashmap_ensure_allocated(&m->dhcp6_prefixes, &in6_addr_hash_ops);
-        if (r < 0)
-                return r;
-
-        r = hashmap_put(m->dhcp6_prefixes, a, link);
-        if (r < 0)
-                return r;
-
-        TAKE_PTR(a);
-        link_ref(link);
-        return 0;
-}
-
-static int dhcp6_prefix_remove_handler(sd_netlink *nl, sd_netlink_message *m, Link *link) {
-        int r;
-
-        assert(link);
-
-        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
-                return 1;
-
-        r = sd_netlink_message_get_errno(m);
-        if (r < 0) {
-                log_link_message_warning_errno(link, m, r, "Received error on DHCPv6 Prefix Delegation route removal");
-                link_enter_failed(link);
-                return 1;
-        }
-
-        return 1;
-}
-
-int dhcp6_prefix_remove(Manager *m, struct in6_addr *addr) {
-        _cleanup_free_ struct in6_addr *a = NULL;
-        _cleanup_(link_unrefp) Link *l = NULL;
-        _cleanup_(route_freep) Route *route = NULL;
-        _cleanup_free_ char *buf = NULL;
-        int r;
-
-        assert_return(m, -EINVAL);
-        assert_return(addr, -EINVAL);
-
-        l = hashmap_remove2(m->dhcp6_prefixes, addr, (void **) &a);
-        if (!l)
-                return -EINVAL;
-
-        (void) sd_radv_remove_prefix(l->radv, addr, 64);
-
-        r = route_new(&route);
-        if (r < 0)
-                return r;
-
-        route->family = AF_INET6;
-        route->dst.in6 = *addr;
-        route->dst_prefixlen = 64;
-
-        r = route_remove(route, l, dhcp6_prefix_remove_handler);
-        if (r < 0)
-                return r;
-
-        (void) in_addr_to_string(AF_INET6, (union in_addr_union *) addr, &buf);
-        log_link_debug(l, "Removing prefix route %s/64", strnull(buf));
-
-        return 0;
-}
-
-static int dhcp6_prefix_remove_all(Manager *m, Link *link) {
-        struct in6_addr *addr;
-        Iterator i;
-        Link *l;
-
-        assert_return(m, -EINVAL);
-        assert_return(link, -EINVAL);
-
-        HASHMAP_FOREACH_KEY(l, addr, m->dhcp6_prefixes, i)
-                if (l == link)
-                        (void) dhcp6_prefix_remove(m, addr);
-
-        return 0;
-}
-
-static int dhcp6_pd_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
-        int r;
-
-        assert(link);
-        assert(link->dhcp6_pd_address_messages > 0);
-
-        link->dhcp6_pd_address_messages--;
-
-        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
-                return 1;
-
-        r = sd_netlink_message_get_errno(m);
-        if (r < 0 && r != -EEXIST) {
-                log_link_message_warning_errno(link, m, r, "Could not set DHCPv6 delegated prefix address");
-                link_enter_failed(link);
-                return 1;
-        } else if (r >= 0)
-                (void) manager_rtnl_process_address(rtnl, m, link->manager);
-
-        if (link->dhcp6_pd_address_messages == 0) {
-                log_link_debug(link, "DHCPv6 delegated prefix addresses set");
-                link->dhcp6_pd_address_configured = true;
-                r = link_request_set_routes(link);
-                if (r < 0) {
-                        link_enter_failed(link);
-                        return 1;
-                }
-        }
-
-        return 1;
-}
-
-static int dhcp6_assign_delegated_prefix(Link *link,
-                                         const struct in6_addr *prefix,
-                                         uint8_t prefix_len,
-                                         uint32_t lifetime_preferred,
-                                         uint32_t lifetime_valid) {
-
-        _cleanup_(address_freep) Address *address = NULL;
-        int r;
-
-        assert(link);
-        assert(link->network);
-        assert(prefix);
-
-        if (!link->network->dhcp6_pd_assign_prefix) {
-                link->dhcp6_pd_address_configured = true;
-                return 0;
-        }
-
-        r = address_new(&address);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Failed to allocate address for DHCPv6 delegated prefix: %m");
-
-        address->in_addr.in6 = *prefix;
-
-        if (!in_addr_is_null(AF_INET6, &link->network->dhcp6_delegation_prefix_token))
-                memcpy(address->in_addr.in6.s6_addr + 8, link->network->dhcp6_delegation_prefix_token.in6.s6_addr + 8, 8);
-        else {
-                r = generate_ipv6_eui_64_address(link, &address->in_addr.in6);
-                if (r < 0)
-                        return log_link_warning_errno(link, r, "Failed to generate EUI64 address for acquired DHCPv6 delegated prefix: %m");
-        }
-
-        address->prefixlen = prefix_len;
-        address->family = AF_INET6;
-        address->cinfo.ifa_prefered = lifetime_preferred;
-        address->cinfo.ifa_valid = lifetime_valid;
-
-        /* address_handler calls link_request_set_routes() and link_request_set_nexthop(). Before they
-         * are called, the related flags must be cleared. Otherwise, the link becomes configured state
-         * before routes are configured. */
-        link->static_routes_configured = false;
-        link->static_nexthops_configured = false;
-        link->dhcp6_pd_address_configured = false;
-        link_set_state(link, LINK_STATE_CONFIGURING);
-
-        r = address_configure(address, link, dhcp6_pd_address_handler, true);
-        if (r < 0)
-                return log_link_warning_errno(link, r, "Failed to set acquired DHCPv6 delegated prefix address: %m");
-        if (r > 0)
-                link->dhcp6_pd_address_messages++;
-
-        return 0;
-}
-
 int config_parse_dhcp6_pd_hint(
                 const char* unit,
                 const char *filename,
@@ -1209,14 +1550,24 @@ int config_parse_dhcp6_mud_url(
         if (!http_url_is_valid(unescaped) || strlen(unescaped) > UINT8_MAX) {
                 log_syntax(unit, LOG_WARNING, filename, line, 0,
                            "Failed to parse MUD URL '%s', ignoring: %m", rvalue);
-
                 return 0;
         }
 
         return free_and_replace(network->dhcp6_mudurl, unescaped);
 }
 
-int config_parse_dhcp6_delegated_prefix_token(
+DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp6_client_start_mode, dhcp6_client_start_mode, DHCP6ClientStartMode,
+                         "Failed to parse WithoutRA= setting");
+
+static const char* const dhcp6_client_start_mode_table[_DHCP6_CLIENT_START_MODE_MAX] = {
+        [DHCP6_CLIENT_START_MODE_NO]                  = "no",
+        [DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST] = "information-request",
+        [DHCP6_CLIENT_START_MODE_SOLICIT]             = "solicit",
+};
+
+DEFINE_STRING_TABLE_LOOKUP(dhcp6_client_start_mode, DHCP6ClientStartMode);
+
+int config_parse_dhcp6_pd_subnet_id(
                 const char *unit,
                 const char *filename,
                 unsigned line,
@@ -1228,7 +1579,8 @@ int config_parse_dhcp6_delegated_prefix_token(
                 void *data,
                 void *userdata) {
 
-        Network *network = data;
+        int64_t *p = data;
+        uint64_t t;
         int r;
 
         assert(filename);
@@ -1236,34 +1588,69 @@ int config_parse_dhcp6_delegated_prefix_token(
         assert(rvalue);
         assert(data);
 
-        if (isempty(rvalue)) {
-                network->dhcp6_delegation_prefix_token = IN_ADDR_NULL;
+        if (isempty(rvalue) || streq(rvalue, "auto")) {
+                *p = -1;
                 return 0;
         }
 
-        r = in_addr_from_string(AF_INET6, rvalue, &network->dhcp6_delegation_prefix_token);
+        r = safe_atoux64(rvalue, &t);
         if (r < 0) {
                 log_syntax(unit, LOG_WARNING, filename, line, r,
-                           "Failed to parse DHCPv6 %s, ignoring: %s", lvalue, rvalue);
+                           "Failed to parse %s=, ignoring assignment: %s",
+                           lvalue, rvalue);
                 return 0;
         }
-
-        if (in_addr_is_null(AF_INET6, &network->dhcp6_delegation_prefix_token)) {
+        if (t > INT64_MAX) {
                 log_syntax(unit, LOG_WARNING, filename, line, 0,
-                           "DHCPv6 %s cannot be the ANY address, ignoring: %s", lvalue, rvalue);
+                           "Invalid subnet id '%s', ignoring assignment.",
+                           rvalue);
                 return 0;
         }
 
+        *p = (int64_t) t;
+
         return 0;
 }
 
-DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp6_client_start_mode, dhcp6_client_start_mode, DHCP6ClientStartMode,
-                         "Failed to parse WithoutRA= setting");
+int config_parse_dhcp6_pd_token(
+                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) {
 
-static const char* const dhcp6_client_start_mode_table[_DHCP6_CLIENT_START_MODE_MAX] = {
-        [DHCP6_CLIENT_START_MODE_NO]                  = "no",
-        [DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST] = "information-request",
-        [DHCP6_CLIENT_START_MODE_SOLICIT]             = "solicit",
-};
+        union in_addr_union *addr = data, tmp;
+        int r;
 
-DEFINE_STRING_TABLE_LOOKUP(dhcp6_client_start_mode, DHCP6ClientStartMode);
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        if (isempty(rvalue)) {
+                *addr = IN_ADDR_NULL;
+                return 0;
+        }
+
+        r = in_addr_from_string(AF_INET6, rvalue, &tmp);
+        if (r < 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "Failed to parse DHCPv6 Prefix Delegation token, ignoring: %s", rvalue);
+                return 0;
+        }
+
+        if (in_addr_is_null(AF_INET6, &tmp)) {
+                log_syntax(unit, LOG_WARNING, filename, line, 0,
+                           "DHCPv6 Prefix Delegation token cannot be the ANY address, ignoring: %s", rvalue);
+                return 0;
+        }
+
+        *addr = tmp;
+
+        return 0;
+}
index cc416b98d2e45fddc6b2f96f7f8ac39d1df5d1d5..214456096da7f9440a3ade1d2ab64bd37ec34640 100644 (file)
@@ -17,17 +17,26 @@ typedef enum DHCP6ClientStartMode {
 typedef struct Link Link;
 typedef struct Manager Manager;
 
-bool dhcp6_get_prefix_delegation(Link *link);
-int dhcp6_request_prefix_delegation(Link *link);
+typedef struct DHCP6DelegatedPrefix {
+        struct in6_addr prefix;     /* Prefix assigned to the link */
+        struct in6_addr pd_prefix;  /* PD prefix provided by DHCP6 lease */
+        Link *link;
+} DHCP6DelegatedPrefix;
+
+DHCP6DelegatedPrefix *dhcp6_pd_free(DHCP6DelegatedPrefix *p);
+DEFINE_TRIVIAL_CLEANUP_FUNC(DHCP6DelegatedPrefix*, dhcp6_pd_free);
+
+bool link_dhcp6_pd_is_enabled(Link *link);
+int dhcp6_pd_remove(Link *link);
 int dhcp6_configure(Link *link);
 int dhcp6_request_address(Link *link, int ir);
-int dhcp6_lease_pd_prefix_lost(sd_dhcp6_client *client, Link* link);
-int dhcp6_prefix_remove(Manager *m, struct in6_addr *addr);
+int dhcp6_request_prefix_delegation(Link *link);
 
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp6_pd_hint);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp6_mud_url);
-CONFIG_PARSER_PROTOTYPE(config_parse_dhcp6_delegated_prefix_token);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp6_client_start_mode);
+CONFIG_PARSER_PROTOTYPE(config_parse_dhcp6_pd_subnet_id);
+CONFIG_PARSER_PROTOTYPE(config_parse_dhcp6_pd_token);
 
 const char* dhcp6_client_start_mode_to_string(DHCP6ClientStartMode i) _const_;
 DHCP6ClientStartMode dhcp6_client_start_mode_from_string(const char *s) _pure_;
index aaca215e56b3ec9c497e6963c9d994c109a62fa2..e844799b5735393545d0aa2afde23a823792605d 100644 (file)
@@ -17,7 +17,7 @@ static int ipv4ll_address_lost(Link *link) {
 
         assert(link);
 
-        link->ipv4ll_address = false;
+        link->ipv4ll_address_configured = false;
 
         r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
         if (r < 0)
@@ -47,7 +47,7 @@ static int ipv4ll_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link
         int r;
 
         assert(link);
-        assert(!link->ipv4ll_address);
+        assert(!link->ipv4ll_address_configured);
 
         r = sd_netlink_message_get_errno(m);
         if (r < 0 && r != -EEXIST) {
@@ -57,7 +57,7 @@ static int ipv4ll_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link
         } else if (r >= 0)
                 (void) manager_rtnl_process_address(rtnl, m, link->manager);
 
-        link->ipv4ll_address = true;
+        link->ipv4ll_address_configured = true;
         link_check_ready(link);
 
         return 1;
@@ -71,7 +71,7 @@ static int ipv4ll_address_claimed(sd_ipv4ll *ll, Link *link) {
         assert(ll);
         assert(link);
 
-        link->ipv4ll_address = false;
+        link->ipv4ll_address_configured = false;
 
         r = sd_ipv4ll_get_address(ll, &address);
         if (r == -ENOENT)
@@ -92,7 +92,7 @@ static int ipv4ll_address_claimed(sd_ipv4ll *ll, Link *link) {
         ll_addr->broadcast.s_addr = ll_addr->in_addr.in.s_addr | htobe32(0xfffffffflu >> ll_addr->prefixlen);
         ll_addr->scope = RT_SCOPE_LINK;
 
-        r = address_configure(ll_addr, link, ipv4ll_address_handler, false);
+        r = address_configure(ll_addr, link, ipv4ll_address_handler, false, NULL);
         if (r < 0)
                 return r;
 
index be1967150533376db94fa21873b46dec2d1f1b3f..f623a9b4a1a22e1910891843da8ece621c79e6a8 100644 (file)
@@ -110,7 +110,10 @@ int bus_link_method_set_ntp_servers(sd_bus_message *message, void *userdata, sd_
 
         strv_free_and_replace(l->ntp, ntp);
 
-        (void) link_dirty(l);
+        link_dirty(l);
+        r = link_save_and_clean(l);
+        if (r < 0)
+                return r;
 
         return sd_bus_reply_method_return(message, NULL);
 }
@@ -150,7 +153,10 @@ static int bus_link_method_set_dns_servers_internal(sd_bus_message *message, voi
         free_and_replace(l->dns, dns);
         l->n_dns = n;
 
-        (void) link_dirty(l);
+        link_dirty(l);
+        r = link_save_and_clean(l);
+        if (r < 0)
+                return r;
 
         return sd_bus_reply_method_return(message, NULL);
 
@@ -240,7 +246,10 @@ int bus_link_method_set_domains(sd_bus_message *message, void *userdata, sd_bus_
         l->search_domains = TAKE_PTR(search_domains);
         l->route_domains = TAKE_PTR(route_domains);
 
-        (void) link_dirty(l);
+        link_dirty(l);
+        r = link_save_and_clean(l);
+        if (r < 0)
+                return r;
 
         return sd_bus_reply_method_return(message, NULL);
 }
@@ -271,7 +280,11 @@ int bus_link_method_set_default_route(sd_bus_message *message, void *userdata, s
 
         if (l->dns_default_route != b) {
                 l->dns_default_route = b;
-                (void) link_dirty(l);
+
+                link_dirty(l);
+                r = link_save_and_clean(l);
+                if (r < 0)
+                        return r;
         }
 
         return sd_bus_reply_method_return(message, NULL);
@@ -313,7 +326,11 @@ int bus_link_method_set_llmnr(sd_bus_message *message, void *userdata, sd_bus_er
 
         if (l->llmnr != mode) {
                 l->llmnr = mode;
-                (void) link_dirty(l);
+
+                link_dirty(l);
+                r = link_save_and_clean(l);
+                if (r < 0)
+                        return r;
         }
 
         return sd_bus_reply_method_return(message, NULL);
@@ -355,7 +372,11 @@ int bus_link_method_set_mdns(sd_bus_message *message, void *userdata, sd_bus_err
 
         if (l->mdns != mode) {
                 l->mdns = mode;
-                (void) link_dirty(l);
+
+                link_dirty(l);
+                r = link_save_and_clean(l);
+                if (r < 0)
+                        return r;
         }
 
         return sd_bus_reply_method_return(message, NULL);
@@ -397,7 +418,11 @@ int bus_link_method_set_dns_over_tls(sd_bus_message *message, void *userdata, sd
 
         if (l->dns_over_tls_mode != mode) {
                 l->dns_over_tls_mode = mode;
-                (void) link_dirty(l);
+
+                link_dirty(l);
+                r = link_save_and_clean(l);
+                if (r < 0)
+                        return r;
         }
 
         return sd_bus_reply_method_return(message, NULL);
@@ -439,7 +464,11 @@ int bus_link_method_set_dnssec(sd_bus_message *message, void *userdata, sd_bus_e
 
         if (l->dnssec_mode != mode) {
                 l->dnssec_mode = mode;
-                (void) link_dirty(l);
+
+                link_dirty(l);
+                r = link_save_and_clean(l);
+                if (r < 0)
+                        return r;
         }
 
         return sd_bus_reply_method_return(message, NULL);
@@ -493,7 +522,10 @@ int bus_link_method_set_dnssec_negative_trust_anchors(sd_bus_message *message, v
         set_free_free(l->dnssec_negative_trust_anchors);
         l->dnssec_negative_trust_anchors = TAKE_PTR(ns);
 
-        (void) link_dirty(l);
+        link_dirty(l);
+        r = link_save_and_clean(l);
+        if (r < 0)
+                return r;
 
         return sd_bus_reply_method_return(message, NULL);
 }
@@ -519,7 +551,11 @@ int bus_link_method_revert_ntp(sd_bus_message *message, void *userdata, sd_bus_e
                 return 1; /* Polkit will call us back */
 
         link_ntp_settings_clear(l);
-        (void) link_dirty(l);
+
+        link_dirty(l);
+        r = link_save_and_clean(l);
+        if (r < 0)
+                return r;
 
         return sd_bus_reply_method_return(message, NULL);
 }
@@ -545,7 +581,11 @@ int bus_link_method_revert_dns(sd_bus_message *message, void *userdata, sd_bus_e
                 return 1; /* Polkit will call us back */
 
         link_dns_settings_clear(l);
-        (void) link_dirty(l);
+
+        link_dirty(l);
+        r = link_save_and_clean(l);
+        if (r < 0)
+                return r;
 
         return sd_bus_reply_method_return(message, NULL);
 }
@@ -629,10 +669,9 @@ int bus_link_method_reconfigure(sd_bus_message *message, void *userdata, sd_bus_
                 return r;
 
         link_set_state(l, LINK_STATE_INITIALIZED);
-        r = link_save(l);
+        r = link_save_and_clean(l);
         if (r < 0)
                 return r;
-        link_clean(l);
 
         return sd_bus_reply_method_return(message, NULL);
 }
index 1d73a3c34fe3ce0bde74cf40a67679240e72c66b..0057d184f7658c88d61dfffd699dffb7d0e7aca2 100644 (file)
@@ -691,7 +691,6 @@ static void link_free_engines(Link *link) {
         link->dhcp_server = sd_dhcp_server_unref(link->dhcp_server);
         link->dhcp_client = sd_dhcp_client_unref(link->dhcp_client);
         link->dhcp_lease = sd_dhcp_lease_unref(link->dhcp_lease);
-        link->dhcp_routes = set_free(link->dhcp_routes);
 
         link->lldp = sd_lldp_unref(link->lldp);
 
@@ -699,6 +698,7 @@ static void link_free_engines(Link *link) {
 
         link->ipv4ll = sd_ipv4ll_unref(link->ipv4ll);
         link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
+        link->dhcp6_lease = sd_dhcp6_lease_unref(link->dhcp6_lease);
         link->ndisc = sd_ndisc_unref(link->ndisc);
         link->radv = sd_radv_unref(link->radv);
 }
@@ -711,17 +711,32 @@ static Link *link_free(Link *link) {
         link_ntp_settings_clear(link);
         link_dns_settings_clear(link);
 
-        link->routes = set_free_with_destructor(link->routes, route_free);
-        link->routes_foreign = set_free_with_destructor(link->routes_foreign, route_free);
-
-        link->nexthops = set_free_with_destructor(link->nexthops, nexthop_free);
-        link->nexthops_foreign = set_free_with_destructor(link->nexthops_foreign, nexthop_free);
-
-        link->neighbors = set_free_with_destructor(link->neighbors, neighbor_free);
-        link->neighbors_foreign = set_free_with_destructor(link->neighbors_foreign, neighbor_free);
-
-        link->addresses = set_free_with_destructor(link->addresses, address_free);
-        link->addresses_foreign = set_free_with_destructor(link->addresses_foreign, address_free);
+        link->routes = set_free(link->routes);
+        link->routes_foreign = set_free(link->routes_foreign);
+        link->dhcp_routes = set_free(link->dhcp_routes);
+        link->dhcp_routes_old = set_free(link->dhcp_routes_old);
+        link->dhcp6_routes = set_free(link->dhcp6_routes);
+        link->dhcp6_routes_old = set_free(link->dhcp6_routes_old);
+        link->dhcp6_pd_routes = set_free(link->dhcp6_pd_routes);
+        link->dhcp6_pd_routes_old = set_free(link->dhcp6_pd_routes_old);
+        link->ndisc_routes = set_free(link->ndisc_routes);
+        link->ndisc_routes_old = set_free(link->ndisc_routes_old);
+
+        link->nexthops = set_free(link->nexthops);
+        link->nexthops_foreign = set_free(link->nexthops_foreign);
+
+        link->neighbors = set_free(link->neighbors);
+        link->neighbors_foreign = set_free(link->neighbors_foreign);
+
+        link->addresses = set_free(link->addresses);
+        link->addresses_foreign = set_free(link->addresses_foreign);
+        link->static_addresses = set_free(link->static_addresses);
+        link->dhcp6_addresses = set_free(link->dhcp6_addresses);
+        link->dhcp6_addresses_old = set_free(link->dhcp6_addresses_old);
+        link->dhcp6_pd_addresses = set_free(link->dhcp6_pd_addresses);
+        link->dhcp6_pd_addresses_old = set_free(link->dhcp6_pd_addresses_old);
+        link->ndisc_addresses = set_free(link->ndisc_addresses);
+        link->ndisc_addresses_old = set_free(link->ndisc_addresses_old);
 
         while ((address = link->pool_addresses)) {
                 LIST_REMOVE(addresses, link->pool_addresses, address);
@@ -834,6 +849,12 @@ int link_stop_clients(Link *link, bool may_keep_dhcp) {
                         r = log_link_warning_errno(link, k, "Could not stop DHCPv6 client: %m");
         }
 
+        if (link_dhcp6_pd_is_enabled(link)) {
+                k = dhcp6_pd_remove(link);
+                if (k < 0)
+                        r = log_link_warning_errno(link, k, "Could not remove DHCPv6 PD addresses and routes: %m");
+        }
+
         if (link->ndisc) {
                 k = sd_ndisc_stop(link->ndisc);
                 if (k < 0)
@@ -1037,12 +1058,13 @@ int link_request_set_routes(Link *link) {
 
         assert(link);
         assert(link->network);
-        assert(link->addresses_configured);
-        assert(link->address_messages == 0);
         assert(link->state != _LINK_STATE_INVALID);
 
         link->static_routes_configured = false;
 
+        if (!link->addresses_ready)
+                return 0;
+
         if (!link_has_carrier(link) && !link->network->configure_without_carrier)
                 /* During configuring addresses, the link lost its carrier. As networkd is dropping
                  * the addresses now, let's not configure the routes either. */
@@ -1061,7 +1083,7 @@ int link_request_set_routes(Link *link) {
                         if ((in_addr_is_null(rt->family, &rt->gw) && ordered_set_isempty(rt->multipath_routes)) != (phase == PHASE_NON_GATEWAY))
                                 continue;
 
-                        r = route_configure(rt, link, route_handler);
+                        r = route_configure(rt, link, route_handler, NULL);
                         if (r < 0)
                                 return log_link_warning_errno(link, r, "Could not set routes: %m");
                         if (r > 0)
@@ -1082,12 +1104,14 @@ int link_request_set_routes(Link *link) {
 void link_check_ready(Link *link) {
         Address *a;
         Iterator i;
-        int r;
 
         assert(link);
 
-        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
-                log_link_debug(link, "%s(): link is in failed or linger state.", __func__);
+        if (link->state == LINK_STATE_CONFIGURED)
+                return;
+
+        if (link->state != LINK_STATE_CONFIGURING) {
+                log_link_debug(link, "%s(): link is in %s state.", __func__, link_state_to_string(link->state));
                 return;
         }
 
@@ -1113,15 +1137,6 @@ void link_check_ready(Link *link) {
                         return;
                 }
 
-        if (!link->addresses_ready) {
-                link->addresses_ready = true;
-                r = link_request_set_routes(link);
-                if (r < 0)
-                        link_enter_failed(link);
-                log_link_debug(link, "%s(): static addresses are configured. Configuring static routes.", __func__);
-                return;
-        }
-
         if (!link->static_routes_configured) {
                 log_link_debug(link, "%s(): static routes are not configured.", __func__);
                 return;
@@ -1149,7 +1164,7 @@ void link_check_ready(Link *link) {
 
         if (link_has_carrier(link) || !link->network->configure_without_carrier) {
 
-                if (link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4) && !link->ipv4ll_address) {
+                if (link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4) && !link->ipv4ll_address_configured) {
                         log_link_debug(link, "%s(): IPv4LL is not configured.", __func__);
                         return;
                 }
@@ -1160,17 +1175,19 @@ void link_check_ready(Link *link) {
                         return;
                 }
 
-                if ((link_dhcp4_enabled(link) || link_dhcp6_enabled(link)) && set_isempty(link->addresses)) {
-                        log_link_debug(link, "%s(): DHCP4 or DHCP6 is enabled but no address is assigned yet.", __func__);
+                if ((link_dhcp4_enabled(link) || link_dhcp6_enabled(link)) &&
+                    !link->dhcp_address && set_isempty(link->dhcp6_addresses) && set_isempty(link->ndisc_addresses) &&
+                    !(link_ipv4ll_enabled(link, ADDRESS_FAMILY_FALLBACK_IPV4) && link->ipv4ll_address_configured)) {
+                        log_link_debug(link, "%s(): DHCP4 or DHCP6 is enabled but no dynamic address is assigned yet.", __func__);
                         return;
                 }
 
-                if (link_dhcp4_enabled(link) || link_dhcp6_enabled(link) || dhcp6_get_prefix_delegation(link) || link_ipv6_accept_ra_enabled(link)) {
+                if (link_dhcp4_enabled(link) || link_dhcp6_enabled(link) || link_dhcp6_pd_is_enabled(link) || link_ipv6_accept_ra_enabled(link)) {
                         if (!link->dhcp4_configured &&
                             !(link->dhcp6_address_configured && link->dhcp6_route_configured) &&
                             !(link->dhcp6_pd_address_configured && link->dhcp6_pd_route_configured) &&
                             !(link->ndisc_addresses_configured && link->ndisc_routes_configured) &&
-                            !(link_ipv4ll_enabled(link, ADDRESS_FAMILY_FALLBACK_IPV4) && link->ipv4ll_address)) {
+                            !(link_ipv4ll_enabled(link, ADDRESS_FAMILY_FALLBACK_IPV4) && link->ipv4ll_address_configured)) {
                                 /* When DHCP or RA is enabled, at least one protocol must provide an address, or
                                  * an IPv4ll fallback address must be configured. */
                                 log_link_debug(link, "%s(): dynamic addresses or routes are not configured.", __func__);
@@ -1189,8 +1206,7 @@ void link_check_ready(Link *link) {
                 }
         }
 
-        if (link->state != LINK_STATE_CONFIGURED)
-                link_enter_configured(link);
+        link_enter_configured(link);
 
         return;
 }
@@ -1222,6 +1238,50 @@ static int link_request_set_neighbors(Link *link) {
         return 0;
 }
 
+static int link_set_bridge_fdb(Link *link) {
+        FdbEntry *fdb_entry;
+        int r;
+
+        LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {
+                r = fdb_entry_configure(link, fdb_entry);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Failed to add MAC entry to static MAC table: %m");
+        }
+
+        return 0;
+}
+
+static int static_address_ready_callback(Address *address) {
+        Address *a;
+        Iterator i;
+        Link *link;
+
+        assert(address);
+        assert(address->link);
+
+        link = address->link;
+
+        if (!link->addresses_configured)
+                return 0;
+
+        SET_FOREACH(a, link->static_addresses, i)
+                if (!address_is_ready(a)) {
+                        _cleanup_free_ char *str = NULL;
+
+                        (void) in_addr_to_string(a->family, &a->in_addr, &str);
+                        log_link_debug(link, "an address %s/%u is not ready", strnull(str), a->prefixlen);
+                        return 0;
+                }
+
+        /* This should not be called again */
+        SET_FOREACH(a, link->static_addresses, i)
+                a->callback = NULL;
+
+        link->addresses_ready = true;
+
+        return link_request_set_routes(link);
+}
+
 static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
         int r;
 
@@ -1247,23 +1307,50 @@ static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link)
                 (void) manager_rtnl_process_address(rtnl, m, link->manager);
 
         if (link->address_messages == 0) {
+                Address *a;
+
                 log_link_debug(link, "Addresses set");
                 link->addresses_configured = true;
-                link_check_ready(link);
+
+                /* When all static addresses are already ready, then static_address_ready_callback()
+                 * will not be called automatically. So, call it here. */
+                a = set_first(link->static_addresses);
+                if (!a) {
+                        log_link_warning(link, "No static address is stored.");
+                        link_enter_failed(link);
+                        return 1;
+                }
+                if (!a->callback) {
+                        log_link_warning(link, "Address ready callback is not set.");
+                        link_enter_failed(link);
+                        return 1;
+                }
+                r = a->callback(a);
+                if (r < 0)
+                        link_enter_failed(link);
         }
 
         return 1;
 }
 
-static int link_set_bridge_fdb(Link *link) {
-        FdbEntry *fdb_entry;
+static int static_address_configure(Address *address, Link *link, bool update) {
+        Address *ret;
         int r;
 
-        LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {
-                r = fdb_entry_configure(link, fdb_entry);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Failed to add MAC entry to static MAC table: %m");
-        }
+        assert(address);
+        assert(link);
+
+        r = address_configure(address, link, address_handler, update, &ret);
+        if (r < 0)
+                return log_link_warning_errno(link, r, "Could not configure static address: %m");
+
+        link->address_messages++;
+
+        r = set_ensure_put(&link->static_addresses, &address_hash_ops, ret);
+        if (r < 0)
+                return log_link_warning_errno(link, r, "Failed to store static address: %m");
+
+        ret->callback = static_address_ready_callback;
 
         return 0;
 }
@@ -1297,18 +1384,17 @@ static int link_request_set_addresses(Link *link) {
         LIST_FOREACH(addresses, ad, link->network->static_addresses) {
                 bool update;
 
-                update = address_get(link, ad->family, &ad->in_addr, ad->prefixlen, NULL) > 0;
+                if (ad->family == AF_INET6 && !in_addr_is_null(ad->family, &ad->in_addr_peer))
+                        update = address_get(link, ad->family, &ad->in_addr_peer, ad->prefixlen, NULL) > 0;
+                else
+                        update = address_get(link, ad->family, &ad->in_addr, ad->prefixlen, NULL) > 0;
 
-                r = address_configure(ad, link, address_handler, update);
+                r = static_address_configure(ad, link, update);
                 if (r < 0)
-                        return log_link_warning_errno(link, r, "Could not set addresses: %m");
-                if (r > 0)
-                        link->address_messages++;
+                        return r;
         }
 
-        if (IN_SET(link->network->router_prefix_delegation,
-                   RADV_PREFIX_DELEGATION_STATIC,
-                   RADV_PREFIX_DELEGATION_BOTH))
+        if (link->network->router_prefix_delegation & RADV_PREFIX_DELEGATION_STATIC)
                 LIST_FOREACH(prefixes, p, link->network->static_prefixes) {
                         _cleanup_(address_freep) Address *address = NULL;
 
@@ -1317,22 +1403,20 @@ static int link_request_set_addresses(Link *link) {
 
                         r = address_new(&address);
                         if (r < 0)
-                                return log_link_error_errno(link, r, "Could not allocate address: %m");
+                                return log_oom();
 
                         r = sd_radv_prefix_get_prefix(p->radv_prefix, &address->in_addr.in6, &address->prefixlen);
                         if (r < 0)
-                                return r;
+                                return log_link_warning_errno(link, r, "Could not get RA prefix: %m");
 
                         r = generate_ipv6_eui_64_address(link, &address->in_addr.in6);
                         if (r < 0)
-                                return r;
+                                return log_link_warning_errno(link, r, "Could not generate EUI64 address: %m");
 
                         address->family = AF_INET6;
-                        r = address_configure(address, link, address_handler, true);
+                        r = static_address_configure(address, link, true);
                         if (r < 0)
-                                return log_link_warning_errno(link, r, "Could not set addresses: %m");
-                        if (r > 0)
-                                link->address_messages++;
+                                return r;
                 }
 
         LIST_FOREACH(labels, label, link->network->address_labels) {
@@ -1343,8 +1427,7 @@ static int link_request_set_addresses(Link *link) {
                 link->address_label_messages++;
         }
 
-        /* now that we can figure out a default address for the dhcp server,
-           start it */
+        /* now that we can figure out a default address for the dhcp server, start it */
         if (link_dhcp4_server_enabled(link) && (link->flags & IFF_UP)) {
                 r = dhcp4_server_configure(link);
                 if (r < 0)
@@ -1354,7 +1437,10 @@ static int link_request_set_addresses(Link *link) {
 
         if (link->address_messages == 0) {
                 link->addresses_configured = true;
-                link_check_ready(link);
+                link->addresses_ready = true;
+                r = link_request_set_routes(link);
+                if (r < 0)
+                        return r;
         } else {
                 log_link_debug(link, "Setting addresses");
                 link_set_state(link, LINK_STATE_CONFIGURING);
@@ -1609,12 +1695,14 @@ static int link_acquire_ipv6_conf(Link *link) {
 
                 r = dhcp6_request_address(link, link->network->dhcp6_without_ra == DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST);
                 if (r < 0 && r != -EBUSY)
-                        return log_link_warning_errno(link, r,  "Could not acquire DHCPv6 lease: %m");
+                        return log_link_warning_errno(link, r, "Could not acquire DHCPv6 lease: %m");
                 else
                         log_link_debug(link, "Acquiring DHCPv6 lease");
         }
 
-        (void) dhcp6_request_prefix_delegation(link);
+        r = dhcp6_request_prefix_delegation(link);
+        if (r < 0)
+                return log_link_warning_errno(link, r, "Failed to request DHCPv6 prefix delegation: %m");
 
         return 0;
 }
@@ -2603,6 +2691,9 @@ static bool link_is_static_address_configured(Link *link, Address *address) {
         LIST_FOREACH(addresses, net_address, link->network->static_addresses)
                 if (address_equal(net_address, address))
                         return true;
+                else if (address->family == AF_INET6 && net_address->family == AF_INET6 &&
+                         in_addr_equal(AF_INET6, &address->in_addr, &net_address->in_addr_peer) > 0)
+                        return true;
 
         return false;
 }
@@ -4229,7 +4320,6 @@ int link_save(Link *link) {
         if (link->network) {
                 char **dhcp6_domains = NULL, **dhcp_domains = NULL;
                 const char *dhcp_domainname = NULL, *p;
-                sd_dhcp6_lease *dhcp6_lease = NULL;
                 bool space;
 
                 fprintf(f, "REQUIRED_FOR_ONLINE=%s\n",
@@ -4241,12 +4331,6 @@ int link_save(Link *link) {
                         st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? ":" : "",
                         st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? strempty(link_operstate_to_string(st.max)) : "");
 
-                if (link->dhcp6_client) {
-                        r = sd_dhcp6_client_get_lease(link->dhcp6_client, &dhcp6_lease);
-                        if (r < 0 && r != -ENOMSG)
-                                log_link_debug_errno(link, r, "Failed to get DHCPv6 lease: %m");
-                }
-
                 fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
 
                 /************************************************************/
@@ -4263,7 +4347,7 @@ int link_save(Link *link) {
                                     link->dhcp_lease,
                                     link->network->dhcp_use_dns,
                                     SD_DHCP_LEASE_DNS,
-                                    dhcp6_lease,
+                                    link->dhcp6_lease,
                                     link->network->dhcp6_use_dns,
                                     sd_dhcp6_lease_get_dns,
                                     NULL);
@@ -4287,7 +4371,7 @@ int link_save(Link *link) {
                                     link->dhcp_lease,
                                     link->network->dhcp_use_ntp,
                                     SD_DHCP_LEASE_NTP,
-                                    dhcp6_lease,
+                                    link->dhcp6_lease,
                                     link->network->dhcp6_use_ntp,
                                     sd_dhcp6_lease_get_ntp_addrs,
                                     sd_dhcp6_lease_get_ntp_fqdn);
@@ -4306,8 +4390,8 @@ int link_save(Link *link) {
                                 (void) sd_dhcp_lease_get_domainname(link->dhcp_lease, &dhcp_domainname);
                                 (void) sd_dhcp_lease_get_search_domains(link->dhcp_lease, &dhcp_domains);
                         }
-                        if (dhcp6_lease)
-                                (void) sd_dhcp6_lease_get_domains(dhcp6_lease, &dhcp6_domains);
+                        if (link->dhcp6_lease)
+                                (void) sd_dhcp6_lease_get_domains(link->dhcp6_lease, &dhcp6_domains);
                 }
 
                 fputs("DOMAINS=", f);
@@ -4525,6 +4609,17 @@ void link_clean(Link *link) {
         link_unref(set_remove(link->manager->dirty_links, link));
 }
 
+int link_save_and_clean(Link *link) {
+        int r;
+
+        r = link_save(link);
+        if (r < 0)
+                return r;
+
+        link_clean(link);
+        return 0;
+}
+
 static const char* const link_state_table[_LINK_STATE_MAX] = {
         [LINK_STATE_PENDING] = "pending",
         [LINK_STATE_INITIALIZED] = "initialized",
index e73697050307f26fb018ad40de59690bc7665698..7f99c0f47b2ac4932fbedf4a262da3c684f4b609 100644 (file)
@@ -87,6 +87,7 @@ typedef struct Link {
 
         Set *addresses;
         Set *addresses_foreign;
+        Set *static_addresses;
         Set *neighbors;
         Set *neighbors_foreign;
         Set *routes;
@@ -95,32 +96,20 @@ typedef struct Link {
         Set *nexthops_foreign;
 
         sd_dhcp_client *dhcp_client;
-        sd_dhcp_lease *dhcp_lease, *dhcp_lease_old;
-        Set *dhcp_routes;
+        sd_dhcp_lease *dhcp_lease;
+        Address *dhcp_address, *dhcp_address_old;
+        Set *dhcp_routes, *dhcp_routes_old;
         char *lease_file;
         uint32_t original_mtu;
         unsigned dhcp4_messages;
         unsigned dhcp4_remove_messages;
-        unsigned dhcp6_address_messages;
-        unsigned dhcp6_route_messages;
-        unsigned dhcp6_pd_address_messages;
-        unsigned dhcp6_pd_route_messages;
         bool dhcp4_route_failed:1;
         bool dhcp4_route_retrying:1;
         bool dhcp4_configured:1;
         bool dhcp4_address_bind:1;
-        bool dhcp6_address_configured:1;
-        bool dhcp6_route_configured:1;
-        bool dhcp6_pd_address_configured:1;
-        bool dhcp6_pd_route_configured:1;
-
-        unsigned ndisc_addresses_messages;
-        unsigned ndisc_routes_messages;
-        bool ndisc_addresses_configured:1;
-        bool ndisc_routes_configured:1;
 
         sd_ipv4ll *ipv4ll;
-        bool ipv4ll_address:1;
+        bool ipv4ll_address_configured:1;
 
         bool addresses_configured:1;
         bool addresses_ready:1;
@@ -141,10 +130,30 @@ typedef struct Link {
         sd_ndisc *ndisc;
         Set *ndisc_rdnss;
         Set *ndisc_dnssl;
+        Set *ndisc_addresses, *ndisc_addresses_old;
+        Set *ndisc_routes, *ndisc_routes_old;
+        unsigned ndisc_addresses_messages;
+        unsigned ndisc_routes_messages;
+        bool ndisc_addresses_configured:1;
+        bool ndisc_routes_configured:1;
 
         sd_radv *radv;
 
         sd_dhcp6_client *dhcp6_client;
+        sd_dhcp6_lease *dhcp6_lease;
+        Set *dhcp6_addresses, *dhcp6_addresses_old;
+        Set *dhcp6_routes, *dhcp6_routes_old;
+        Set *dhcp6_pd_addresses, *dhcp6_pd_addresses_old;
+        Set *dhcp6_pd_routes, *dhcp6_pd_routes_old;
+        unsigned dhcp6_address_messages;
+        unsigned dhcp6_route_messages;
+        unsigned dhcp6_pd_address_messages;
+        unsigned dhcp6_pd_route_messages;
+        bool dhcp6_address_configured:1;
+        bool dhcp6_route_configured:1;
+        bool dhcp6_pd_address_configured:1;
+        bool dhcp6_pd_route_configured:1;
+        bool dhcp6_pd_prefixes_assigned:1;
 
         /* This is about LLDP reception */
         sd_lldp *lldp;
@@ -208,6 +217,7 @@ int link_update(Link *link, sd_netlink_message *message);
 void link_dirty(Link *link);
 void link_clean(Link *link);
 int link_save(Link *link);
+int link_save_and_clean(Link *link);
 
 int link_carrier_reset(Link *link);
 bool link_has_carrier(Link *link);
index 9e0b4475240be697a2390cdefe733933d8af6456..16147b9c7a166069a5a63aa7624a0401f016d6a7 100644 (file)
@@ -332,7 +332,7 @@ static int link_send_lldp(Link *link) {
 
 static int on_lldp_timer(sd_event_source *s, usec_t t, void *userdata) {
         Link *link = userdata;
-        usec_t current, delay, next;
+        usec_t delay;
         int r;
 
         assert(s);
@@ -347,12 +347,10 @@ static int on_lldp_timer(sd_event_source *s, usec_t t, void *userdata) {
         if (link->lldp_tx_fast > 0)
                 link->lldp_tx_fast--;
 
-        assert_se(sd_event_now(sd_event_source_get_event(s), clock_boottime_or_monotonic(), &current) >= 0);
-
         delay = link->lldp_tx_fast > 0 ? LLDP_FAST_TX_USEC : LLDP_TX_INTERVAL_USEC;
-        next = usec_add(usec_add(current, delay), (usec_t) random_u64() % LLDP_JITTER_USEC);
+        delay = usec_add(delay, (usec_t) random_u64() % LLDP_JITTER_USEC);
 
-        r = sd_event_source_set_time(s, next);
+        r = sd_event_source_set_time_relative(s, delay);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to restart LLDP timer: %m");
 
index c287367d29aaa7e1ec34116624a0de0e65595098..a6c1a39e2384064a448bdf7eb9a28b4807ec6940 100644 (file)
@@ -857,8 +857,10 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message,
                                                valid_str ? "for " : "forever", strempty(valid_str));
                 }
 
-                /* address_update() logs internally, so we don't need to. */
-                (void) address_update(address, flags, scope, &cinfo);
+                /* address_update() logs internally, so we don't need to here. */
+                r = address_update(address, flags, scope, &cinfo);
+                if (r < 0)
+                        link_enter_failed(link);
 
                 break;
 
@@ -1727,8 +1729,7 @@ static int manager_dirty_handler(sd_event_source *s, void *userdata) {
                 manager_save(m);
 
         SET_FOREACH(link, m->dirty_links, i)
-                if (link_save(link) >= 0)
-                        link_clean(link);
+                (void) link_save_and_clean(link);
 
         return 1;
 }
@@ -1822,27 +1823,20 @@ int manager_new(Manager **ret) {
 }
 
 void manager_free(Manager *m) {
-        struct in6_addr *a;
         AddressPool *pool;
         Link *link;
+        Iterator i;
 
         if (!m)
                 return;
 
         free(m->state_file);
 
-        while ((a = hashmap_first_key(m->dhcp6_prefixes)))
-                (void) dhcp6_prefix_remove(m, a);
-        m->dhcp6_prefixes = hashmap_free(m->dhcp6_prefixes);
-
-        while ((link = hashmap_steal_first(m->links))) {
-                if (link->dhcp6_client)
-                        (void) dhcp6_lease_pd_prefix_lost(link->dhcp6_client, link);
-
+        HASHMAP_FOREACH(link, m->links, i)
                 (void) link_stop_clients(link, true);
 
-                link_unref(link);
-        }
+        m->dhcp6_prefixes = hashmap_free_with_destructor(m->dhcp6_prefixes, dhcp6_pd_free);
+        m->dhcp6_pd_prefixes = set_free_with_destructor(m->dhcp6_pd_prefixes, dhcp6_pd_free);
 
         m->dirty_links = set_free_with_destructor(m->dirty_links, link_unref);
         m->links_requesting_uuid = set_free_with_destructor(m->links_requesting_uuid, link_unref);
@@ -1858,9 +1852,9 @@ void manager_free(Manager *m) {
 
         /* routing_policy_rule_free() access m->rules and m->rules_foreign.
          * So, it is necessary to set NULL after the sets are freed. */
-        m->rules = set_free_with_destructor(m->rules, routing_policy_rule_free);
-        m->rules_foreign = set_free_with_destructor(m->rules_foreign, routing_policy_rule_free);
-        set_free_with_destructor(m->rules_saved, routing_policy_rule_free);
+        m->rules = set_free(m->rules);
+        m->rules_foreign = set_free(m->rules_foreign);
+        set_free(m->rules_saved);
 
         sd_netlink_unref(m->rtnl);
         sd_netlink_unref(m->genl);
@@ -1899,7 +1893,7 @@ int manager_start(Manager *m) {
         manager_save(m);
 
         HASHMAP_FOREACH(link, m->links, i)
-                link_save(link);
+                (void) link_save(link);
 
         return 0;
 }
index 0b3ce911c8c439da76f0b21c283e27c6e5d2de14..f4b37bd6a9577f4c3510b437f3f4781ef81de1cc 100644 (file)
@@ -44,6 +44,7 @@ struct Manager {
         Hashmap *netdevs;
         OrderedHashmap *networks;
         Hashmap *dhcp6_prefixes;
+        Set *dhcp6_pd_prefixes;
         LIST_HEAD(AddressPool, address_pools);
 
         usec_t network_dirs_ts_usec;
index 409db8c3c5ab23e79e08dd64019b2e495eb7755f..349f0548afd7d645d41e674721dbf445850f1b59 100644 (file)
 
 #define NDISC_APP_ID SD_ID128_MAKE(13,ac,81,a7,d5,3f,49,78,92,79,5d,0c,29,3a,bc,7e)
 
-static bool stableprivate_address_is_valid(const struct in6_addr *addr) {
-        assert(addr);
-
-        /* According to rfc4291, generated address should not be in the following ranges. */
+static int ndisc_remove_old(Link *link, bool force);
 
-        if (memcmp(addr, &SUBNET_ROUTER_ANYCAST_ADDRESS_RFC4291, SUBNET_ROUTER_ANYCAST_PREFIXLEN) == 0)
-                return false;
+static int ndisc_address_callback(Address *address) {
+        Address *a;
+        Iterator i;
 
-        if (memcmp(addr, &RESERVED_IPV6_INTERFACE_IDENTIFIERS_ADDRESS_RFC4291, RESERVED_IPV6_INTERFACE_IDENTIFIERS_PREFIXLEN) == 0)
-                return false;
+        assert(address);
+        assert(address->link);
 
-        if (memcmp(addr, &RESERVED_SUBNET_ANYCAST_ADDRESSES_RFC4291, RESERVED_SUBNET_ANYCAST_PREFIXLEN) == 0)
-                return false;
+        /* Make this called only once */
+        SET_FOREACH(a, address->link->ndisc_addresses, i)
+                a->callback = NULL;
 
-        return true;
+        return ndisc_remove_old(address->link, true);
 }
 
-static int make_stableprivate_address(Link *link, const struct in6_addr *prefix, uint8_t prefix_len, uint8_t dad_counter, struct in6_addr *addr) {
-        sd_id128_t secret_key;
-        struct siphash state;
-        uint64_t rid;
-        size_t l;
-        int r;
+static int ndisc_remove_old(Link *link, bool force) {
+        Address *address;
+        Route *route;
+        NDiscDNSSL *dnssl;
+        NDiscRDNSS *rdnss;
+        Iterator i;
+        int k, r = 0;
 
-        /* According to rfc7217 section 5.1
-         * RID = F(Prefix, Net_Iface, Network_ID, DAD_Counter, secret_key) */
+        assert(link);
 
-        r = sd_id128_get_machine_app_specific(NDISC_APP_ID, &secret_key);
-        if (r < 0)
-                return log_error_errno(r, "Failed to generate key: %m");
+        if (!force) {
+                bool set_callback = !set_isempty(link->ndisc_addresses);
 
-        siphash24_init(&state, secret_key.bytes);
+                if (!link->ndisc_addresses_configured || !link->ndisc_routes_configured)
+                        return 0;
 
-        l = MAX(DIV_ROUND_UP(prefix_len, 8), 8);
-        siphash24_compress(prefix, l, &state);
-        siphash24_compress(link->ifname, strlen(link->ifname), &state);
-        siphash24_compress(&link->mac, sizeof(struct ether_addr), &state);
-        siphash24_compress(&dad_counter, sizeof(uint8_t), &state);
+                SET_FOREACH(address, link->ndisc_addresses, i)
+                        if (address_is_ready(address)) {
+                                set_callback = false;
+                                break;
+                        }
 
-        rid = htole64(siphash24_finalize(&state));
+                if (set_callback) {
+                        SET_FOREACH(address, link->ndisc_addresses, i)
+                                address->callback = ndisc_address_callback;
+                        return 0;
+                }
+        }
 
-        memcpy(addr->s6_addr, prefix->s6_addr, l);
-        memcpy(addr->s6_addr + l, &rid, 16 - l);
+        if (!set_isempty(link->ndisc_addresses_old) || !set_isempty(link->ndisc_routes_old))
+                log_link_debug(link, "Removing old NDisc addresses and routes.");
 
-        return 0;
+        link_dirty(link);
+
+        SET_FOREACH(address, link->ndisc_addresses_old, i) {
+                k = address_remove(address, link, NULL);
+                if (k < 0)
+                        r = k;
+        }
+
+        SET_FOREACH(route, link->ndisc_routes_old, i) {
+                k = route_remove(route, link, NULL);
+                if (k < 0)
+                        r = k;
+        }
+
+        SET_FOREACH(rdnss, link->ndisc_rdnss, i)
+                if (rdnss->marked)
+                        free(set_remove(link->ndisc_rdnss, rdnss));
+
+        SET_FOREACH(dnssl, link->ndisc_dnssl, i)
+                if (dnssl->marked)
+                        free(set_remove(link->ndisc_dnssl, dnssl));
+
+        return r;
 }
 
 static int ndisc_route_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
@@ -103,6 +129,13 @@ static int ndisc_route_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *li
         if (link->ndisc_routes_messages == 0) {
                 log_link_debug(link, "NDisc routes set.");
                 link->ndisc_routes_configured = true;
+
+                r = ndisc_remove_old(link, false);
+                if (r < 0) {
+                        link_enter_failed(link);
+                        return 1;
+                }
+
                 link_check_ready(link);
         }
 
@@ -131,6 +164,13 @@ static int ndisc_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *
         if (link->ndisc_addresses_messages == 0) {
                 log_link_debug(link, "NDisc SLAAC addresses set.");
                 link->ndisc_addresses_configured = true;
+
+                r = ndisc_remove_old(link, false);
+                if (r < 0) {
+                        link_enter_failed(link);
+                        return 1;
+                }
+
                 r = link_request_set_routes(link);
                 if (r < 0) {
                         link_enter_failed(link);
@@ -141,6 +181,50 @@ static int ndisc_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *
         return 1;
 }
 
+static int ndisc_route_configure(Route *route, Link *link) {
+        Route *ret;
+        int r;
+
+        assert(route);
+        assert(link);
+
+        r = route_configure(route, link, ndisc_route_handler, &ret);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to set NDisc route: %m");
+
+        link->ndisc_routes_messages++;
+
+        r = set_ensure_put(&link->ndisc_routes, &route_hash_ops, ret);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to store NDisc route: %m");
+
+        (void) set_remove(link->ndisc_routes_old, ret);
+
+        return 0;
+}
+
+static int ndisc_address_configure(Address *address, Link *link) {
+        Address *ret;
+        int r;
+
+        assert(address);
+        assert(link);
+
+        r = address_configure(address, link, ndisc_address_handler, true, &ret);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to set NDisc SLAAC address: %m");
+
+        link->ndisc_addresses_messages++;
+
+        r = set_ensure_put(&link->ndisc_addresses, &address_hash_ops, ret);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to store NDisc SLAAC address: %m");
+
+        (void) set_remove(link->ndisc_addresses_old, ret);
+
+        return 0;
+}
+
 static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
         _cleanup_(route_freep) Route *route = NULL;
         union in_addr_union gateway;
@@ -202,11 +286,9 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
         route->lifetime = time_now + lifetime * USEC_PER_SEC;
         route->mtu = mtu;
 
-        r = route_configure(route, link, ndisc_route_handler);
+        r = ndisc_route_configure(route, link);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not set default route: %m");
-        if (r > 0)
-                link->ndisc_routes_messages++;
 
         Route *route_gw;
         LIST_FOREACH(routes, route_gw, link->network->static_routes) {
@@ -218,19 +300,74 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
 
                 route_gw->gw = gateway;
 
-                r = route_configure(route_gw, link, ndisc_route_handler);
+                r = ndisc_route_configure(route_gw, link);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Could not set gateway: %m");
-                if (r > 0)
-                        link->ndisc_routes_messages++;
         }
 
         return 0;
 }
 
-static int ndisc_router_generate_addresses(Link *link, unsigned prefixlen, uint32_t lifetime_preferred, Address *address, Set **ret) {
+static bool stableprivate_address_is_valid(const struct in6_addr *addr) {
+        assert(addr);
+
+        /* According to rfc4291, generated address should not be in the following ranges. */
+
+        if (memcmp(addr, &SUBNET_ROUTER_ANYCAST_ADDRESS_RFC4291, SUBNET_ROUTER_ANYCAST_PREFIXLEN) == 0)
+                return false;
+
+        if (memcmp(addr, &RESERVED_IPV6_INTERFACE_IDENTIFIERS_ADDRESS_RFC4291, RESERVED_IPV6_INTERFACE_IDENTIFIERS_PREFIXLEN) == 0)
+                return false;
+
+        if (memcmp(addr, &RESERVED_SUBNET_ANYCAST_ADDRESSES_RFC4291, RESERVED_SUBNET_ANYCAST_PREFIXLEN) == 0)
+                return false;
+
+        return true;
+}
+
+static int make_stableprivate_address(Link *link, const struct in6_addr *prefix, uint8_t prefix_len, uint8_t dad_counter, struct in6_addr **ret) {
+        _cleanup_free_ struct in6_addr *addr = NULL;
+        sd_id128_t secret_key;
+        struct siphash state;
+        uint64_t rid;
+        size_t l;
+        int r;
+
+        /* According to rfc7217 section 5.1
+         * RID = F(Prefix, Net_Iface, Network_ID, DAD_Counter, secret_key) */
+
+        r = sd_id128_get_machine_app_specific(NDISC_APP_ID, &secret_key);
+        if (r < 0)
+                return log_error_errno(r, "Failed to generate key: %m");
+
+        siphash24_init(&state, secret_key.bytes);
+
+        l = MAX(DIV_ROUND_UP(prefix_len, 8), 8);
+        siphash24_compress(prefix, l, &state);
+        siphash24_compress_string(link->ifname, &state);
+        siphash24_compress(&link->mac, sizeof(struct ether_addr), &state);
+        siphash24_compress(&dad_counter, sizeof(uint8_t), &state);
+
+        rid = htole64(siphash24_finalize(&state));
+
+        addr = new(struct in6_addr, 1);
+        if (!addr)
+                return log_oom();
+
+        memcpy(addr->s6_addr, prefix->s6_addr, l);
+        memcpy(addr->s6_addr + l, &rid, 16 - l);
+
+        if (!stableprivate_address_is_valid(addr)) {
+                *ret = NULL;
+                return 0;
+        }
+
+        *ret = TAKE_PTR(addr);
+        return 1;
+}
+
+static int ndisc_router_generate_addresses(Link *link, struct in6_addr *address, uint8_t prefixlen, Set **ret) {
         _cleanup_set_free_free_ Set *addresses = NULL;
-        struct in6_addr addr;
         IPv6Token *j;
         Iterator i;
         int r;
@@ -239,76 +376,63 @@ static int ndisc_router_generate_addresses(Link *link, unsigned prefixlen, uint3
         assert(address);
         assert(ret);
 
-        addresses = set_new(&address_hash_ops);
+        addresses = set_new(&in6_addr_hash_ops);
         if (!addresses)
                 return log_oom();
 
-        addr = address->in_addr.in6;
-        ORDERED_HASHMAP_FOREACH(j, link->network->ipv6_tokens, i) {
-                bool have_address = false;
-                _cleanup_(address_freep) Address *new_address = NULL;
-
-                r = address_new(&new_address);
-                if (r < 0)
-                        return log_oom();
-
-                *new_address = *address;
+        ORDERED_SET_FOREACH(j, link->network->ipv6_tokens, i) {
+                _cleanup_free_ struct in6_addr *new_address = NULL;
 
                 if (j->address_generation_type == IPV6_TOKEN_ADDRESS_GENERATION_PREFIXSTABLE
-                    && memcmp(&j->prefix, &addr, FAMILY_ADDRESS_SIZE(address->family)) == 0) {
+                    && IN6_ARE_ADDR_EQUAL(&j->prefix, address)) {
                         /* While this loop uses dad_counter and a retry limit as specified in RFC 7217, the loop
                            does not actually attempt Duplicate Address Detection; the counter will be incremented
                            only when the address generation algorithm produces an invalid address, and the loop
                            may exit with an address which ends up being unusable due to duplication on the link.
                         */
                         for (; j->dad_counter < DAD_CONFLICTS_IDGEN_RETRIES_RFC7217; j->dad_counter++) {
-                                r = make_stableprivate_address(link, &j->prefix, prefixlen, j->dad_counter, &new_address->in_addr.in6);
+                                r = make_stableprivate_address(link, &j->prefix, prefixlen, j->dad_counter, &new_address);
                                 if (r < 0)
+                                        return r;
+                                if (r > 0)
                                         break;
-
-                                if (stableprivate_address_is_valid(&new_address->in_addr.in6)) {
-                                        have_address = true;
-                                        break;
-                                }
                         }
                 } else if (j->address_generation_type == IPV6_TOKEN_ADDRESS_GENERATION_STATIC) {
-                        memcpy(new_address->in_addr.in6.s6_addr + 8, j->prefix.s6_addr + 8, 8);
-                        have_address = true;
-                }
+                        new_address = new(struct in6_addr, 1);
+                        if (!new_address)
+                                return log_oom();
 
-                if (have_address) {
-                        new_address->prefixlen = prefixlen;
-                        new_address->flags = IFA_F_NOPREFIXROUTE|IFA_F_MANAGETEMPADDR;
-                        new_address->cinfo.ifa_prefered = lifetime_preferred;
+                        memcpy(new_address->s6_addr, address->s6_addr, 8);
+                        memcpy(new_address->s6_addr + 8, j->prefix.s6_addr + 8, 8);
+                }
 
+                if (new_address) {
                         r = set_put(addresses, new_address);
                         if (r < 0)
                                 return log_link_error_errno(link, r, "Failed to store SLAAC address: %m");
-                        TAKE_PTR(new_address);
+                        else if (r == 0)
+                                log_link_debug_errno(link, r, "Generated SLAAC address is duplicated, ignoring.");
+                        else
+                                TAKE_PTR(new_address);
                 }
         }
 
         /* fall back to EUI-64 if no tokens provided addresses */
         if (set_isempty(addresses)) {
-                _cleanup_(address_freep) Address *new_address = NULL;
+                _cleanup_free_ struct in6_addr *new_address = NULL;
 
-                r = address_new(&new_address);
-                if (r < 0)
+                new_address = newdup(struct in6_addr, address, 1);
+                if (!new_address)
                         return log_oom();
 
-                *new_address = *address;
-
-                r = generate_ipv6_eui_64_address(link, &new_address->in_addr.in6);
+                r = generate_ipv6_eui_64_address(link, new_address);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Failed to generate EUI64 address: %m");
 
-                new_address->prefixlen = prefixlen;
-                new_address->flags = IFA_F_NOPREFIXROUTE|IFA_F_MANAGETEMPADDR;
-                new_address->cinfo.ifa_prefered = lifetime_preferred;
-
                 r = set_put(addresses, new_address);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Failed to store SLAAC address: %m");
+
                 TAKE_PTR(new_address);
         }
 
@@ -321,9 +445,9 @@ static int ndisc_router_process_autonomous_prefix(Link *link, sd_ndisc_router *r
         uint32_t lifetime_valid, lifetime_preferred, lifetime_remaining;
         _cleanup_set_free_free_ Set *addresses = NULL;
         _cleanup_(address_freep) Address *address = NULL;
+        struct in6_addr addr, *a;
         unsigned prefixlen;
         usec_t time_now;
-        Address *a;
         Iterator i;
         int r;
 
@@ -350,45 +474,49 @@ static int ndisc_router_process_autonomous_prefix(Link *link, sd_ndisc_router *r
         if (lifetime_preferred > lifetime_valid)
                 return 0;
 
-        r = address_new(&address);
-        if (r < 0)
-                return log_oom();
-
-        address->family = AF_INET6;
-        r = sd_ndisc_router_prefix_get_address(rt, &address->in_addr.in6);
+        r = sd_ndisc_router_prefix_get_address(rt, &addr);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to get prefix address: %m");
 
-        r = ndisc_router_generate_addresses(link, prefixlen, lifetime_preferred, address, &addresses);
+        r = ndisc_router_generate_addresses(link, &addr, prefixlen, &addresses);
         if (r < 0)
                 return r;
 
+        r = address_new(&address);
+        if (r < 0)
+                return log_oom();
+
+        address->family = AF_INET6;
+        address->prefixlen = prefixlen;
+        address->flags = IFA_F_NOPREFIXROUTE|IFA_F_MANAGETEMPADDR;
+        address->cinfo.ifa_prefered = lifetime_preferred;
+
         SET_FOREACH(a, addresses, i) {
                 Address *existing_address;
 
                 /* see RFC4862 section 5.5.3.e */
-                r = address_get(link, a->family, &a->in_addr, a->prefixlen, &existing_address);
+                r = address_get(link, AF_INET6, (union in_addr_union *) a, prefixlen, &existing_address);
                 if (r > 0) {
                         lifetime_remaining = existing_address->cinfo.tstamp / 100 + existing_address->cinfo.ifa_valid - time_now / USEC_PER_SEC;
                         if (lifetime_valid > NDISC_PREFIX_LFT_MIN || lifetime_valid > lifetime_remaining)
-                                a->cinfo.ifa_valid = lifetime_valid;
+                                address->cinfo.ifa_valid = lifetime_valid;
                         else if (lifetime_remaining <= NDISC_PREFIX_LFT_MIN)
-                                a->cinfo.ifa_valid = lifetime_remaining;
+                                address->cinfo.ifa_valid = lifetime_remaining;
                         else
-                                a->cinfo.ifa_valid = NDISC_PREFIX_LFT_MIN;
+                                address->cinfo.ifa_valid = NDISC_PREFIX_LFT_MIN;
                 } else if (lifetime_valid > 0)
-                        a->cinfo.ifa_valid = lifetime_valid;
+                        address->cinfo.ifa_valid = lifetime_valid;
                 else
                         continue; /* see RFC4862 section 5.5.3.d */
 
-                if (a->cinfo.ifa_valid == 0)
+                if (address->cinfo.ifa_valid == 0)
                         continue;
 
-                r = address_configure(a, link, ndisc_address_handler, true);
+                address->in_addr.in6 = *a;
+
+                r = ndisc_address_configure(address, link);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Could not set SLAAC address: %m");
-                if (r > 0)
-                        link->ndisc_addresses_messages++;
         }
 
         return 0;
@@ -432,11 +560,9 @@ static int ndisc_router_process_onlink_prefix(Link *link, sd_ndisc_router *rt) {
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to get prefix address: %m");
 
-        r = route_configure(route, link, ndisc_route_handler);
+        r = ndisc_route_configure(route, link);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not set prefix route: %m");;
-        if (r > 0)
-                link->ndisc_routes_messages++;
 
         return 0;
 }
@@ -491,11 +617,9 @@ static int ndisc_router_process_route(Link *link, sd_ndisc_router *rt) {
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to get route address: %m");
 
-        r = route_configure(route, link, ndisc_route_handler);
+        r = ndisc_route_configure(route, link);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not set additional route: %m");
-        if (r > 0)
-                link->ndisc_routes_messages++;
 
         return 0;
 }
@@ -508,12 +632,19 @@ static int ndisc_rdnss_compare_func(const NDiscRDNSS *a, const NDiscRDNSS *b) {
         return memcmp(&a->address, &b->address, sizeof(a->address));
 }
 
-DEFINE_PRIVATE_HASH_OPS(ndisc_rdnss_hash_ops, NDiscRDNSS, ndisc_rdnss_hash_func, ndisc_rdnss_compare_func);
+DEFINE_PRIVATE_HASH_OPS_WITH_KEY_DESTRUCTOR(
+                ndisc_rdnss_hash_ops,
+                NDiscRDNSS,
+                ndisc_rdnss_hash_func,
+                ndisc_rdnss_compare_func,
+                free);
 
 static int ndisc_router_process_rdnss(Link *link, sd_ndisc_router *rt) {
         uint32_t lifetime;
         const struct in6_addr *a;
+        NDiscRDNSS *rdnss;
         usec_t time_now;
+        Iterator i;
         int n, r;
 
         assert(link);
@@ -531,28 +662,27 @@ static int ndisc_router_process_rdnss(Link *link, sd_ndisc_router *rt) {
         if (n < 0)
                 return log_link_error_errno(link, n, "Failed to get RDNSS addresses: %m");
 
-        for (int i = 0; i < n; i++) {
-                _cleanup_free_ NDiscRDNSS *x = NULL;
-                NDiscRDNSS d = {
-                        .address = a[i],
-                }, *y;
+        SET_FOREACH(rdnss, link->ndisc_rdnss, i)
+                rdnss->marked = true;
 
-                if (lifetime == 0) {
-                        (void) set_remove(link->ndisc_rdnss, &d);
-                        link_dirty(link);
-                        continue;
-                }
+        if (lifetime == 0)
+                return 0;
 
-                y = set_get(link->ndisc_rdnss, &d);
-                if (y) {
-                        y->valid_until = time_now + lifetime * USEC_PER_SEC;
-                        continue;
-                }
+        if (n >= (int) NDISC_RDNSS_MAX) {
+                log_link_warning(link, "Too many RDNSS records per link. Only first %i records will be used.", NDISC_RDNSS_MAX);
+                n = NDISC_RDNSS_MAX;
+        }
 
-                ndisc_vacuum(link);
+        for (int j = 0; j < n; j++) {
+                _cleanup_free_ NDiscRDNSS *x = NULL;
+                NDiscRDNSS d = {
+                        .address = a[j],
+                };
 
-                if (set_size(link->ndisc_rdnss) >= NDISC_RDNSS_MAX) {
-                        log_link_warning(link, "Too many RDNSS records per link, ignoring.");
+                rdnss = set_get(link->ndisc_rdnss, &d);
+                if (rdnss) {
+                        rdnss->marked = false;
+                        rdnss->valid_until = time_now + lifetime * USEC_PER_SEC;
                         continue;
                 }
 
@@ -561,7 +691,7 @@ static int ndisc_router_process_rdnss(Link *link, sd_ndisc_router *rt) {
                         return log_oom();
 
                 *x = (NDiscRDNSS) {
-                        .address = a[i],
+                        .address = a[j],
                         .valid_until = time_now + lifetime * USEC_PER_SEC,
                 };
 
@@ -569,28 +699,33 @@ static int ndisc_router_process_rdnss(Link *link, sd_ndisc_router *rt) {
                 if (r < 0)
                         return log_oom();
                 assert(r > 0);
-
-                link_dirty(link);
         }
 
         return 0;
 }
 
 static void ndisc_dnssl_hash_func(const NDiscDNSSL *x, struct siphash *state) {
-        siphash24_compress(NDISC_DNSSL_DOMAIN(x), strlen(NDISC_DNSSL_DOMAIN(x)), state);
+        siphash24_compress_string(NDISC_DNSSL_DOMAIN(x), state);
 }
 
 static int ndisc_dnssl_compare_func(const NDiscDNSSL *a, const NDiscDNSSL *b) {
         return strcmp(NDISC_DNSSL_DOMAIN(a), NDISC_DNSSL_DOMAIN(b));
 }
 
-DEFINE_PRIVATE_HASH_OPS(ndisc_dnssl_hash_ops, NDiscDNSSL, ndisc_dnssl_hash_func, ndisc_dnssl_compare_func);
+DEFINE_PRIVATE_HASH_OPS_WITH_KEY_DESTRUCTOR(
+                ndisc_dnssl_hash_ops,
+                NDiscDNSSL,
+                ndisc_dnssl_hash_func,
+                ndisc_dnssl_compare_func,
+                free);
 
 static int ndisc_router_process_dnssl(Link *link, sd_ndisc_router *rt) {
         _cleanup_strv_free_ char **l = NULL;
         uint32_t lifetime;
         usec_t time_now;
-        char **i;
+        NDiscDNSSL *dnssl;
+        Iterator i;
+        char **j;
         int r;
 
         assert(link);
@@ -608,32 +743,31 @@ static int ndisc_router_process_dnssl(Link *link, sd_ndisc_router *rt) {
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to get DNSSL addresses: %m");
 
-        STRV_FOREACH(i, l) {
-                _cleanup_free_ NDiscDNSSL *s = NULL;
-                NDiscDNSSL *x;
+        SET_FOREACH(dnssl, link->ndisc_dnssl, i)
+                dnssl->marked = true;
 
-                s = malloc0(ALIGN(sizeof(NDiscDNSSL)) + strlen(*i) + 1);
-                if (!s)
-                        return log_oom();
+        if (lifetime == 0)
+                return 0;
 
-                strcpy(NDISC_DNSSL_DOMAIN(s), *i);
+        if (strv_length(l) >= NDISC_DNSSL_MAX) {
+                log_link_warning(link, "Too many DNSSL records per link. Only first %i records will be used.", NDISC_DNSSL_MAX);
+                STRV_FOREACH(j, l + NDISC_DNSSL_MAX)
+                        *j = mfree(*j);
+        }
 
-                if (lifetime == 0) {
-                        (void) set_remove(link->ndisc_dnssl, s);
-                        link_dirty(link);
-                        continue;
-                }
+        STRV_FOREACH(j, l) {
+                _cleanup_free_ NDiscDNSSL *s = NULL;
 
-                x = set_get(link->ndisc_dnssl, s);
-                if (x) {
-                        x->valid_until = time_now + lifetime * USEC_PER_SEC;
-                        continue;
-                }
+                s = malloc0(ALIGN(sizeof(NDiscDNSSL)) + strlen(*j) + 1);
+                if (!s)
+                        return log_oom();
 
-                ndisc_vacuum(link);
+                strcpy(NDISC_DNSSL_DOMAIN(s), *j);
 
-                if (set_size(link->ndisc_dnssl) >= NDISC_DNSSL_MAX) {
-                        log_link_warning(link, "Too many DNSSL records per link, ignoring.");
+                dnssl = set_get(link->ndisc_dnssl, s);
+                if (dnssl) {
+                        dnssl->marked = false;
+                        dnssl->valid_until = time_now + lifetime * USEC_PER_SEC;
                         continue;
                 }
 
@@ -643,8 +777,6 @@ static int ndisc_router_process_dnssl(Link *link, sd_ndisc_router *rt) {
                 if (r < 0)
                         return log_oom();
                 assert(r > 0);
-
-                link_dirty(link);
         }
 
         return 0;
@@ -733,6 +865,8 @@ static int ndisc_router_process_options(Link *link, sd_ndisc_router *rt) {
 }
 
 static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
+        Address *address;
+        Route *route;
         uint64_t flags;
         int r;
 
@@ -741,6 +875,23 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
         assert(link->manager);
         assert(rt);
 
+        link->ndisc_addresses_configured = false;
+        link->ndisc_routes_configured = false;
+
+        link_dirty(link);
+
+        while ((address = set_steal_first(link->ndisc_addresses))) {
+                r = set_ensure_put(&link->ndisc_addresses_old, &address_hash_ops, address);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Failed to store old NDisc SLAAC address: %m");
+        }
+
+        while ((route = set_steal_first(link->ndisc_routes))) {
+                r = set_ensure_put(&link->ndisc_routes_old, &route_hash_ops, route);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Failed to store old NDisc route: %m");
+        }
+
         r = sd_ndisc_router_get_flags(rt, &flags);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to get RA flags: %m");
@@ -754,10 +905,8 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
                         r = dhcp6_request_address(link, !(flags & ND_RA_FLAG_MANAGED));
                 if (r < 0 && r != -EBUSY)
                         return log_link_error_errno(link, r, "Could not acquire DHCPv6 lease on NDisc request: %m");
-                else {
+                else
                         log_link_debug(link, "Acquiring DHCPv6 lease on NDisc request");
-                        r = 0;
-                }
         }
 
         r = ndisc_router_process_default(link, rt);
@@ -767,7 +916,33 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
         if (r < 0)
                 return r;
 
-        return r;
+        if (link->ndisc_addresses_messages == 0)
+                link->ndisc_addresses_configured = true;
+        else {
+                log_link_debug(link, "Setting SLAAC addresses.");
+
+                /* address_handler calls link_request_set_routes() and link_request_set_nexthop().
+                 * Before they are called, the related flags must be cleared. Otherwise, the link
+                 * becomes configured state before routes are configured. */
+                link->static_routes_configured = false;
+                link->static_nexthops_configured = false;
+        }
+
+        if (link->ndisc_routes_messages == 0)
+                link->ndisc_routes_configured = true;
+        else
+                log_link_debug(link, "Setting NDisc routes.");
+
+        r = ndisc_remove_old(link, false);
+        if (r < 0)
+                return r;
+
+        if (link->ndisc_addresses_configured && link->ndisc_routes_configured)
+                link_check_ready(link);
+        else
+                link_set_state(link, LINK_STATE_CONFIGURING);
+
+        return 0;
 }
 
 static void ndisc_handler(sd_ndisc *nd, sd_ndisc_event event, sd_ndisc_router *rt, void *userdata) {
@@ -782,44 +957,20 @@ static void ndisc_handler(sd_ndisc *nd, sd_ndisc_event event, sd_ndisc_router *r
         switch (event) {
 
         case SD_NDISC_EVENT_ROUTER:
-                link->ndisc_addresses_configured = false;
-                link->ndisc_routes_configured = false;
-
                 r = ndisc_router_handler(link, rt);
                 if (r < 0) {
                         link_enter_failed(link);
                         return;
                 }
-
-                if (link->ndisc_addresses_messages == 0)
-                        link->ndisc_addresses_configured = true;
-                else {
-                        log_link_debug(link, "Setting SLAAC addresses.");
-
-                        /* address_handler calls link_request_set_routes() and link_request_set_nexthop().
-                         * Before they are called, the related flags must be cleared. Otherwise, the link
-                         * becomes configured state before routes are configured. */
-                        link->static_routes_configured = false;
-                        link->static_nexthops_configured = false;
-                }
-
-                if (link->ndisc_routes_messages == 0)
-                        link->ndisc_routes_configured = true;
-                else
-                        log_link_debug(link, "Setting NDisc routes.");
-
-                if (link->ndisc_addresses_configured && link->ndisc_routes_configured)
-                        link_check_ready(link);
-                else
-                        link_set_state(link, LINK_STATE_CONFIGURING);
                 break;
 
         case SD_NDISC_EVENT_TIMEOUT:
                 log_link_debug(link, "NDisc handler get timeout event");
-                link->ndisc_addresses_configured = true;
-                link->ndisc_routes_configured = true;
-                link_check_ready(link);
-
+                if (link->ndisc_addresses_messages == 0 && link->ndisc_routes_messages == 0) {
+                        link->ndisc_addresses_configured = true;
+                        link->ndisc_routes_configured = true;
+                        link_check_ready(link);
+                }
                 break;
         default:
                 assert_not_reached("Unknown NDisc event");
@@ -859,6 +1010,7 @@ void ndisc_vacuum(Link *link) {
         NDiscDNSSL *d;
         Iterator i;
         usec_t time_now;
+        bool updated = false;
 
         assert(link);
 
@@ -869,14 +1021,17 @@ void ndisc_vacuum(Link *link) {
         SET_FOREACH(r, link->ndisc_rdnss, i)
                 if (r->valid_until < time_now) {
                         free(set_remove(link->ndisc_rdnss, r));
-                        link_dirty(link);
+                        updated = true;
                 }
 
         SET_FOREACH(d, link->ndisc_dnssl, i)
                 if (d->valid_until < time_now) {
                         free(set_remove(link->ndisc_dnssl, d));
-                        link_dirty(link);
+                        updated = true;
                 }
+
+        if (updated)
+                link_dirty(link);
 }
 
 void ndisc_flush(Link *link) {
@@ -884,8 +1039,8 @@ void ndisc_flush(Link *link) {
 
         /* Removes all RDNSS and DNSSL entries, without exception */
 
-        link->ndisc_rdnss = set_free_free(link->ndisc_rdnss);
-        link->ndisc_dnssl = set_free_free(link->ndisc_dnssl);
+        link->ndisc_rdnss = set_free(link->ndisc_rdnss);
+        link->ndisc_dnssl = set_free(link->ndisc_dnssl);
 }
 
 int ipv6token_new(IPv6Token **ret) {
@@ -904,12 +1059,26 @@ int ipv6token_new(IPv6Token **ret) {
         return 0;
 }
 
-DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(
+static void ipv6_token_hash_func(const IPv6Token *p, struct siphash *state) {
+        siphash24_compress(&p->address_generation_type, sizeof(p->address_generation_type), state);
+        siphash24_compress(&p->prefix, sizeof(p->prefix), state);
+}
+
+static int ipv6_token_compare_func(const IPv6Token *a, const IPv6Token *b) {
+        int r;
+
+        r = CMP(a->address_generation_type, b->address_generation_type);
+        if (r != 0)
+                return r;
+
+        return memcmp(&a->prefix, &b->prefix, sizeof(struct in6_addr));
+}
+
+DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR(
                 ipv6_token_hash_ops,
-                void,
-                trivial_hash_func,
-                trivial_compare_func,
                 IPv6Token,
+                ipv6_token_hash_func,
+                ipv6_token_compare_func,
                 free);
 
 int config_parse_ndisc_deny_listed_prefix(
@@ -999,7 +1168,7 @@ int config_parse_address_generation_type(
         assert(data);
 
         if (isempty(rvalue)) {
-                network->ipv6_tokens = ordered_hashmap_free(network->ipv6_tokens);
+                network->ipv6_tokens = ordered_set_free(network->ipv6_tokens);
                 return 0;
         }
 
@@ -1031,18 +1200,19 @@ int config_parse_address_generation_type(
 
         token->prefix = buffer.in6;
 
-        r = ordered_hashmap_ensure_allocated(&network->ipv6_tokens, &ipv6_token_hash_ops);
+        r = ordered_set_ensure_allocated(&network->ipv6_tokens, &ipv6_token_hash_ops);
         if (r < 0)
                 return log_oom();
 
-        r = ordered_hashmap_put(network->ipv6_tokens, &token->prefix, token);
-        if (r < 0) {
+        r = ordered_set_put(network->ipv6_tokens, token);
+        if (r == -EEXIST)
+                log_syntax(unit, LOG_DEBUG, filename, line, r,
+                           "IPv6 token '%s' is duplicated, ignoring: %m", rvalue);
+        else if (r < 0)
                 log_syntax(unit, LOG_WARNING, filename, line, r,
-                           "Failed to store IPv6 token '%s'", rvalue);
-                return 0;
-        }
-
-        TAKE_PTR(token);
+                           "Failed to store IPv6 token '%s', ignoring: %m", rvalue);
+        else
+                TAKE_PTR(token);
 
         return 0;
 }
index 0bc2882a6c2e973444cc972d68d12d4f35156171..c459f42456f9251e0a3e7e5d56fac835ac6b612b 100644 (file)
@@ -24,11 +24,15 @@ typedef enum IPv6AcceptRAStartDHCP6Client {
 } IPv6AcceptRAStartDHCP6Client;
 
 typedef struct NDiscRDNSS {
+        /* Used when GC'ing old DNS servers when configuration changes. */
+        bool marked;
         usec_t valid_until;
         struct in6_addr address;
 } NDiscRDNSS;
 
 typedef struct NDiscDNSSL {
+        /* Used when GC'ing old domains when configuration changes. */
+        bool marked;
         usec_t valid_until;
         /* The domain name follows immediately. */
 } NDiscDNSSL;
index 0e97b225c4547ddff63dd5e2864db39a26767fe7..09ddb9c8a56b809db09ba702d404efc5cac8cfed 100644 (file)
@@ -247,7 +247,7 @@ static int neighbor_compare_func(const Neighbor *a, const Neighbor *b) {
         return memcmp(&a->lladdr, &b->lladdr, a->lladdr_size);
 }
 
-DEFINE_PRIVATE_HASH_OPS(neighbor_hash_ops, Neighbor, neighbor_hash_func, neighbor_compare_func);
+DEFINE_PRIVATE_HASH_OPS_WITH_KEY_DESTRUCTOR(neighbor_hash_ops, Neighbor, neighbor_hash_func, neighbor_compare_func, neighbor_free);
 
 int neighbor_get(Link *link, int family, const union in_addr_union *addr, const union lladdr_union *lladdr, size_t lladdr_size, Neighbor **ret) {
         Neighbor neighbor, *existing;
index f3c578cbb4c8ca61e2c972ab8036d290643ec524..3f1652b1904ffa622973dd91f29a97701d347880 100644 (file)
@@ -213,8 +213,6 @@ DHCPv6.UserClass,                            config_parse_dhcp_user_class,
 DHCPv6.VendorClass,                          config_parse_dhcp_vendor_class,                           0,                             offsetof(Network, dhcp6_vendor_class)
 DHCPv6.SendVendorOption,                     config_parse_dhcp_send_option,                            AF_INET6,                      offsetof(Network, dhcp6_client_send_vendor_options)
 DHCPv6.ForceDHCPv6PDOtherInformation,        config_parse_bool,                                        0,                             offsetof(Network, dhcp6_force_pd_other_information)
-DHCPv6.AssignAcquiredDelegatedPrefixAddress, config_parse_bool,                                        0,                             offsetof(Network, dhcp6_pd_assign_prefix)
-DHCPv6.AssignAcquiredDelegatedPrefixToken,   config_parse_dhcp6_delegated_prefix_token,                0,                             0
 DHCPv6.PrefixDelegationHint,                 config_parse_dhcp6_pd_hint,                               0,                             0
 DHCPv6.WithoutRA,                            config_parse_dhcp6_client_start_mode,                     0,                             offsetof(Network, dhcp6_without_ra)
 DHCPv6.SendOption,                           config_parse_dhcp_send_option,                            AF_INET6,                      offsetof(Network, dhcp6_client_send_options)
@@ -271,7 +269,9 @@ BridgeVLAN.PVID,                             config_parse_brvlan_pvid,
 BridgeVLAN.VLAN,                             config_parse_brvlan_vlan,                                 0,                             0
 BridgeVLAN.EgressUntagged,                   config_parse_brvlan_untagged,                             0,                             0
 Network.IPv6PrefixDelegation,                config_parse_router_prefix_delegation,                    0,                             offsetof(Network, router_prefix_delegation)
-Network.IPv6PDSubnetId,                      config_parse_router_prefix_subnet_id,                     0,                             0
+DHCPv6PrefixDelegation.SubnetId,             config_parse_dhcp6_pd_subnet_id,                          0,                             offsetof(Network, dhcp6_pd_subnet_id)
+DHCPv6PrefixDelegation.Assign,               config_parse_bool,                                        0,                             offsetof(Network, dhcp6_pd_assign)
+DHCPv6PrefixDelegation.Token,                config_parse_dhcp6_pd_token,                              0,                             offsetof(Network, dhcp6_pd_token)
 IPv6PrefixDelegation.RouterLifetimeSec,      config_parse_sec,                                         0,                             offsetof(Network, router_lifetime_usec)
 IPv6PrefixDelegation.Managed,                config_parse_bool,                                        0,                             offsetof(Network, router_managed)
 IPv6PrefixDelegation.OtherInformation,       config_parse_bool,                                        0,                             offsetof(Network, router_other_information)
index 94a1a6100fed6cd2b1736d3127cf5316d1c49b69..d34155b19f4c3e1e35652c66d1d7717f8d4bb969 100644 (file)
@@ -420,7 +420,8 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                 .dhcp6_use_ntp = true,
                 .dhcp6_use_dns = true,
 
-                .dhcp6_pd_assign_prefix = true,
+                .dhcp6_pd_subnet_id = -1,
+                .dhcp6_pd_assign = true,
 
                 .dhcp_server_emit[SD_DHCP_LEASE_DNS].emit = true,
                 .dhcp_server_emit[SD_DHCP_LEASE_NTP].emit = true,
@@ -429,7 +430,6 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                 .dhcp_server_emit_router = true,
                 .dhcp_server_emit_timezone = true,
 
-                .router_prefix_subnet_id = -1,
                 .router_emit_dns = true,
                 .router_emit_domains = true,
 
@@ -501,6 +501,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                         "DHCP\0" /* compat */
                         "DHCPv4\0"
                         "DHCPv6\0"
+                        "DHCPv6PrefixDelegation\0"
                         "DHCPServer\0"
                         "IPv6AcceptRA\0"
                         "IPv6NDPProxyAddress\0"
@@ -763,7 +764,7 @@ static Network *network_free(Network *network) {
         ordered_hashmap_free(network->dhcp_client_send_vendor_options);
         ordered_hashmap_free(network->dhcp_server_send_options);
         ordered_hashmap_free(network->dhcp_server_send_vendor_options);
-        ordered_hashmap_free(network->ipv6_tokens);
+        ordered_set_free(network->ipv6_tokens);
         ordered_hashmap_free(network->dhcp6_client_send_options);
         ordered_hashmap_free(network->dhcp6_client_send_vendor_options);
 
index 17109d139cfac7ff034272d34da5d61a33175715..5dcb3c548bcc74c8ec59e82f0433c01c84bbc8c0 100644 (file)
@@ -184,7 +184,6 @@ struct Network {
 
         /* IPv6 prefix delegation support */
         RADVPrefixDelegation router_prefix_delegation;
-        int64_t router_prefix_subnet_id;
         usec_t router_lifetime_usec;
         uint8_t router_preference;
         bool router_managed;
@@ -198,8 +197,11 @@ struct Network {
         bool dhcp6_force_pd_other_information; /* Start DHCPv6 PD also when 'O'
                                                   RA flag is set, see RFC 7084,
                                                   WPD-4 */
-        bool dhcp6_pd_assign_prefix;
-        union in_addr_union dhcp6_delegation_prefix_token;
+
+        /* DHCPv6 Prefix Delegation support */
+        int64_t dhcp6_pd_subnet_id;
+        bool dhcp6_pd_assign;
+        union in_addr_union dhcp6_pd_token;
 
         /* Bridge Support */
         int use_bpdu;
@@ -255,7 +257,7 @@ struct Network {
         IPv6AcceptRAStartDHCP6Client ipv6_accept_ra_start_dhcp6_client;
         uint32_t ipv6_accept_ra_route_table;
         Set *ndisc_deny_listed_prefix;
-        OrderedHashmap *ipv6_tokens;
+        OrderedSet *ipv6_tokens;
 
         IPv6PrivacyExtensions ipv6_privacy_extensions;
 
index 088cdf11a3660b581b47687e8e605ef45c783286..e0c490babab6a1e6798f062d6bf0876912ca9b4c 100644 (file)
@@ -650,10 +650,7 @@ int radv_configure(Link *link) {
                         return r;
         }
 
-        if (IN_SET(link->network->router_prefix_delegation,
-                   RADV_PREFIX_DELEGATION_STATIC,
-                   RADV_PREFIX_DELEGATION_BOTH)) {
-
+        if (link->network->router_prefix_delegation & RADV_PREFIX_DELEGATION_STATIC) {
                 LIST_FOREACH(prefixes, p, link->network->static_prefixes) {
                         r = sd_radv_add_prefix(link->radv, p->radv_prefix, false);
                         if (r == -EEXIST)
@@ -673,13 +670,12 @@ int radv_configure(Link *link) {
                         if (r < 0)
                                 return r;
                 }
-
         }
 
         return 0;
 }
 
-int radv_add_prefix(Link *link, struct in6_addr *prefix, uint8_t prefix_len,
+int radv_add_prefix(Link *link, const struct in6_addr *prefix, uint8_t prefix_len,
                     uint32_t lifetime_preferred, uint32_t lifetime_valid) {
         _cleanup_(sd_radv_prefix_unrefp) sd_radv_prefix *p = NULL;
         int r;
@@ -870,46 +866,3 @@ int config_parse_router_preference(const char *unit,
 
         return 0;
 }
-
-int config_parse_router_prefix_subnet_id(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) {
-        Network *network = userdata;
-        uint64_t t;
-        int r;
-
-        assert(filename);
-        assert(lvalue);
-        assert(rvalue);
-        assert(data);
-
-        if (isempty(rvalue) || streq(rvalue, "auto")) {
-                network->router_prefix_subnet_id = -1;
-                return 0;
-        }
-
-        r = safe_atoux64(rvalue, &t);
-        if (r < 0) {
-                log_syntax(unit, LOG_WARNING, filename, line, r,
-                           "Failed to parse %s=, ignoring assignment: %s",
-                           lvalue, rvalue);
-                return 0;
-        }
-        if (t > INT64_MAX) {
-                log_syntax(unit, LOG_WARNING, filename, line, r,
-                           "Invalid subnet id '%s', ignoring assignment.",
-                           rvalue);
-                return 0;
-        }
-
-        network->router_prefix_subnet_id = (int64_t)t;
-
-        return 0;
-}
index 741aa8692f040540ed91bd8866e9e57faf78ba59..496ef97adcf6cca844e2a0b821138d39e78ae243 100644 (file)
@@ -14,10 +14,10 @@ typedef struct Prefix Prefix;
 typedef struct RoutePrefix RoutePrefix;
 
 typedef enum RADVPrefixDelegation {
-        RADV_PREFIX_DELEGATION_NONE,
-        RADV_PREFIX_DELEGATION_STATIC,
-        RADV_PREFIX_DELEGATION_DHCP6,
-        RADV_PREFIX_DELEGATION_BOTH,
+        RADV_PREFIX_DELEGATION_NONE   = 0,
+        RADV_PREFIX_DELEGATION_STATIC = 1 << 0,
+        RADV_PREFIX_DELEGATION_DHCP6  = 1 << 1,
+        RADV_PREFIX_DELEGATION_BOTH   = RADV_PREFIX_DELEGATION_STATIC | RADV_PREFIX_DELEGATION_DHCP6,
         _RADV_PREFIX_DELEGATION_MAX,
         _RADV_PREFIX_DELEGATION_INVALID = -1,
 } RADVPrefixDelegation;
@@ -52,7 +52,7 @@ DEFINE_NETWORK_SECTION_FUNCTIONS(RoutePrefix, route_prefix_free);
 
 int radv_emit_dns(Link *link);
 int radv_configure(Link *link);
-int radv_add_prefix(Link *link, struct in6_addr *prefix, uint8_t prefix_len,
+int radv_add_prefix(Link *link, const struct in6_addr *prefix, uint8_t prefix_len,
                     uint32_t lifetime_preferred, uint32_t lifetime_valid);
 
 const char* radv_prefix_delegation_to_string(RADVPrefixDelegation i) _const_;
@@ -60,7 +60,6 @@ RADVPrefixDelegation radv_prefix_delegation_from_string(const char *s) _pure_;
 
 CONFIG_PARSER_PROTOTYPE(config_parse_router_prefix_delegation);
 CONFIG_PARSER_PROTOTYPE(config_parse_router_preference);
-CONFIG_PARSER_PROTOTYPE(config_parse_router_prefix_subnet_id);
 CONFIG_PARSER_PROTOTYPE(config_parse_prefix);
 CONFIG_PARSER_PROTOTYPE(config_parse_prefix_flags);
 CONFIG_PARSER_PROTOTYPE(config_parse_prefix_lifetime);
index 62a9b8b9b3d7cba36e472f7de69af011d78b81dc..541bf1e793ea5c70fa9dc9f63578ee0012c8741e 100644 (file)
@@ -144,6 +144,14 @@ void route_free(Route *route) {
         if (route->link) {
                 set_remove(route->link->routes, route);
                 set_remove(route->link->routes_foreign, route);
+                set_remove(route->link->dhcp_routes, route);
+                set_remove(route->link->dhcp_routes_old, route);
+                set_remove(route->link->dhcp6_routes, route);
+                set_remove(route->link->dhcp6_routes_old, route);
+                set_remove(route->link->dhcp6_pd_routes, route);
+                set_remove(route->link->dhcp6_pd_routes_old, route);
+                set_remove(route->link->ndisc_routes, route);
+                set_remove(route->link->ndisc_routes_old, route);
         }
 
         ordered_set_free_free(route->multipath_routes);
@@ -597,7 +605,8 @@ static int append_nexthops(Route *route, sd_netlink_message *req) {
 int route_configure(
                 Route *route,
                 Link *link,
-                link_netlink_message_handler_t callback) {
+                link_netlink_message_handler_t callback,
+                Route **ret) {
 
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         _cleanup_(sd_event_source_unrefp) sd_event_source *expire = NULL;
@@ -803,6 +812,9 @@ int route_configure(
         sd_event_source_unref(route->expire);
         route->expire = TAKE_PTR(expire);
 
+        if (ret)
+                *ret = route;
+
         return 1;
 }
 
index e926ccd7a42987246def7009cd20aa736e322722..3beee9b03b159aa023f9bf14e8a68cb162b618a9 100644 (file)
@@ -66,7 +66,7 @@ extern const struct hash_ops route_hash_ops;
 
 int route_new(Route **ret);
 void route_free(Route *route);
-int route_configure(Route *route, Link *link, link_netlink_message_handler_t callback);
+int route_configure(Route *route, Link *link, link_netlink_message_handler_t callback, Route **ret);
 int route_remove(Route *route, Link *link, link_netlink_message_handler_t callback);
 
 int route_get(Link *link, Route *in, Route **ret);
index 9777e020ed2e4815653367a87ba2f5155c13429d..36dad527d0969e501c03fc6a1b3debb9543d4606 100644 (file)
@@ -132,11 +132,8 @@ static void routing_policy_rule_hash_func(const RoutingPolicyRule *rule, struct
                 siphash24_compress(&rule->dport, sizeof(rule->dport), state);
                 siphash24_compress(&rule->uid_range, sizeof(rule->uid_range), state);
 
-                if (rule->iif)
-                        siphash24_compress(rule->iif, strlen(rule->iif), state);
-
-                if (rule->oif)
-                        siphash24_compress(rule->oif, strlen(rule->oif), state);
+                siphash24_compress_string(rule->iif, state);
+                siphash24_compress_string(rule->oif, state);
 
                 break;
         default:
@@ -230,7 +227,12 @@ static int routing_policy_rule_compare_func(const RoutingPolicyRule *a, const Ro
         }
 }
 
-DEFINE_PRIVATE_HASH_OPS(routing_policy_rule_hash_ops, RoutingPolicyRule, routing_policy_rule_hash_func, routing_policy_rule_compare_func);
+DEFINE_PRIVATE_HASH_OPS_WITH_KEY_DESTRUCTOR(
+                routing_policy_rule_hash_ops,
+                RoutingPolicyRule,
+                routing_policy_rule_hash_func,
+                routing_policy_rule_compare_func,
+                routing_policy_rule_free);
 
 int routing_policy_rule_get(Manager *m, RoutingPolicyRule *rule, RoutingPolicyRule **ret) {
 
index 43507d8c635e25b2e454cf493cef2d2ff98b7a20..ce9319d942a3aa450fe438484d7e5cbd1d2cbde8 100644 (file)
@@ -117,7 +117,7 @@ int kernel_route_expiration_supported(void) {
 }
 
 static void network_config_hash_func(const NetworkConfigSection *c, struct siphash *state) {
-        siphash24_compress(c->filename, strlen(c->filename), state);
+        siphash24_compress_string(c->filename, state);
         siphash24_compress(&c->line, sizeof(c->line), state);
 }
 
index 2007acb7812e5c2854ea9fc9b058958d0d67d822..5d338e6f1a3a90f92f9bb77568d80d4e1432cfe1 100644 (file)
@@ -101,7 +101,7 @@ static void test_config_parse_duid_rawdata(void) {
         test_config_parse_duid_rawdata_one("11::", 0, &(DUID){0, 1, {0x11}});  /* FIXME: should this be an error? */
         test_config_parse_duid_rawdata_one("abcdef", 0, &(DUID){});
         test_config_parse_duid_rawdata_one(BYTES_0_128, 0, &(DUID){});
-        test_config_parse_duid_rawdata_one(BYTES_0_128 + 2, 0, &(DUID){0, 128, BYTES_1_128});
+        test_config_parse_duid_rawdata_one(&BYTES_0_128[2], 0, &(DUID){0, 128, BYTES_1_128});
 }
 
 static void test_config_parse_hwaddr(void) {
index d441099b5a5c07262820d5ea5846d996027d00f2..d84d746c3fa8e2dd423b159bb716b4546437bd86 100644 (file)
@@ -53,7 +53,7 @@ static void test_rule_serialization(const char *title, const char *ruleset, cons
         log_info("$ %s", cmd);
         assert_se(system(cmd) == 0);
 
-        set_free_with_destructor(rules, routing_policy_rule_free);
+        set_free(rules);
 }
 
 int main(int argc, char **argv) {
index 9b54cda2f723e1c5616a941dc40a32cbe1dd6d71..ac3a1a02c4857e488544a1189aa79331f03970a3 100644 (file)
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
 #pragma once
 
 #include <sys/types.h>
index 4687ac4c18d88cde8268f2879666b0d8826da9db..5599c6a1b3b307c676de3d705f362bef944cda74 100644 (file)
@@ -549,7 +549,7 @@ int mount_all(const char *dest,
                   MOUNT_IN_USERNS|MOUNT_MKDIR },
 
                 /* Then we list outer child mounts (i.e. mounts applied *before* entering user namespacing) */
-                { "tmpfs",                  "/tmp",                         "tmpfs", "mode=1777" TMPFS_LIMITS_TMP,     MS_NOSUID|MS_NODEV|MS_STRICTATIME,
+                { "tmpfs",                  "/tmp",                         "tmpfs", "mode=1777" NESTED_TMPFS_LIMITS,  MS_NOSUID|MS_NODEV|MS_STRICTATIME,
                   MOUNT_FATAL|MOUNT_APPLY_TMPFS_TMP|MOUNT_MKDIR },
                 { "tmpfs",                  "/sys",                         "tmpfs", "mode=555" TMPFS_LIMITS_SYS,      MS_NOSUID|MS_NOEXEC|MS_NODEV,
                   MOUNT_FATAL|MOUNT_APPLY_APIVFS_NETNS|MOUNT_MKDIR },
@@ -559,19 +559,20 @@ int mount_all(const char *dest,
                   MOUNT_FATAL|MOUNT_MKDIR },                          /* skipped if above was mounted */
                 { "tmpfs",                  "/dev",                         "tmpfs", "mode=755" TMPFS_LIMITS_DEV,      MS_NOSUID|MS_STRICTATIME,
                   MOUNT_FATAL|MOUNT_MKDIR },
-                { "tmpfs",                  "/dev/shm",                     "tmpfs", "mode=1777" TMPFS_LIMITS_DEV_SHM, MS_NOSUID|MS_NODEV|MS_STRICTATIME,
+                { "tmpfs",                  "/dev/shm",                     "tmpfs", "mode=1777" NESTED_TMPFS_LIMITS,  MS_NOSUID|MS_NODEV|MS_STRICTATIME,
                   MOUNT_FATAL|MOUNT_MKDIR },
                 { "tmpfs",                  "/run",                         "tmpfs", "mode=755" TMPFS_LIMITS_RUN,      MS_NOSUID|MS_NODEV|MS_STRICTATIME,
                   MOUNT_FATAL|MOUNT_MKDIR },
-                { "/usr/lib/os-release",    "/run/host/usr/lib/os-release", NULL,    NULL,                             MS_BIND,
-                  MOUNT_FATAL|MOUNT_MKDIR|MOUNT_TOUCH }, /* As per kernel interface requirements, bind mount first (creating mount points) and make read-only later */
-                { NULL,                     "/run/host/usr/lib/os-release", NULL,    NULL,                             MS_BIND|MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT,
-                  0 },
-                { "/etc/os-release",        "/run/host/etc/os-release",     NULL,    NULL,                             MS_BIND,
-                  MOUNT_MKDIR|MOUNT_TOUCH },
-                { NULL,                     "/run/host/etc/os-release",     NULL,    NULL,                             MS_BIND|MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT,
-                  0 },
-
+                { "/run/host",              "/run/host",                    NULL,    NULL,                             MS_BIND,
+                  MOUNT_FATAL|MOUNT_MKDIR|MOUNT_PREFIX_ROOT }, /* Prepare this so that we can make it read-only when we are done */
+                { "/etc/os-release",        "/run/host/os-release",         NULL,    NULL,                             MS_BIND,
+                  MOUNT_TOUCH }, /* As per kernel interface requirements, bind mount first (creating mount points) and make read-only later */
+                { "/usr/lib/os-release",    "/run/host/os-release",         NULL,    NULL,                             MS_BIND,
+                  MOUNT_FATAL }, /* If /etc/os-release doesn't exist use the version in /usr/lib as fallback */
+                { NULL,                     "/run/host/os-release",         NULL,    NULL,                             MS_BIND|MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT,
+                  MOUNT_FATAL },
+                { NULL,                     "/run/host",                    NULL,    NULL,                             MS_BIND|MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT,
+                  MOUNT_FATAL|MOUNT_IN_USERNS },
 #if HAVE_SELINUX
                 { "/sys/fs/selinux",        "/sys/fs/selinux",              NULL,    NULL,                             MS_BIND,
                   MOUNT_MKDIR },  /* Bind mount first (mkdir/chown the mount point in case /sys/ is mounted as minimal skeleton tmpfs) */
@@ -589,9 +590,9 @@ int mount_all(const char *dest,
         int r;
 
         for (k = 0; k < ELEMENTSOF(mount_table); k++) {
-                _cleanup_free_ char *where = NULL, *options = NULL;
-                const char *o;
+                _cleanup_free_ char *where = NULL, *options = NULL, *prefixed = NULL;
                 bool fatal = FLAGS_SET(mount_table[k].mount_settings, MOUNT_FATAL);
+                const char *o;
 
                 if (in_userns != FLAGS_SET(mount_table[k].mount_settings, MOUNT_IN_USERNS))
                         continue;
@@ -616,20 +617,9 @@ int mount_all(const char *dest,
                                 return log_error_errno(r, "Failed to detect whether %s is a mount point: %m", where);
                         if (r > 0)
                                 continue;
-
-                        /* Shortcut for optional bind mounts: if the source can't be found skip ahead to avoid creating
-                         * empty and unused directories. */
-                        if (!fatal && FLAGS_SET(mount_table[k].mount_settings, MOUNT_MKDIR) && FLAGS_SET(mount_table[k].flags, MS_BIND)) {
-                                r = access(mount_table[k].what, F_OK);
-                                if (r < 0) {
-                                        if (errno == ENOENT)
-                                                continue;
-                                        return log_error_errno(errno, "Failed to stat %s: %m", mount_table[k].what);
-                                }
-                        }
                 }
 
-                if (FLAGS_SET(mount_table[k].mount_settings, MOUNT_MKDIR)) {
+                if ((mount_table[k].mount_settings & (MOUNT_MKDIR|MOUNT_TOUCH)) != 0) {
                         uid_t u = (use_userns && !in_userns) ? uid_shift : UID_INVALID;
 
                         if (FLAGS_SET(mount_table[k].mount_settings, MOUNT_TOUCH))
@@ -647,13 +637,17 @@ int mount_all(const char *dest,
                                 if (r != -EROFS)
                                         continue;
                         }
-                        if (FLAGS_SET(mount_table[k].mount_settings, MOUNT_TOUCH)) {
-                                r = touch(where);
-                                if (r < 0 && r != -EEXIST) {
-                                        if (fatal)
-                                                return log_error_errno(r, "Failed to create mount point %s: %m", where);
-                                        log_debug_errno(r, "Failed to create mount point %s: %m", where);
-                                }
+                }
+
+                if (FLAGS_SET(mount_table[k].mount_settings, MOUNT_TOUCH)) {
+                        r = touch(where);
+                        if (r < 0 && r != -EEXIST) {
+                                if (fatal && r != -EROFS)
+                                        return log_error_errno(r, "Failed to create file %s: %m", where);
+
+                                log_debug_errno(r, "Failed to create file %s: %m", where);
+                                if (r != -EROFS)
+                                        continue;
                         }
                 }
 
@@ -666,8 +660,18 @@ int mount_all(const char *dest,
                                 o = options;
                 }
 
+                if (FLAGS_SET(mount_table[k].mount_settings, MOUNT_PREFIX_ROOT)) {
+                        /* Optionally prefix the mount source with the root dir. This is useful in bind
+                         * mounts to be created within the container image before we transition into it. Note
+                         * that MOUNT_IN_USERNS is run after we transitioned hence prefixing is not ncessary
+                         * for those. */
+                        r = chase_symlinks(mount_table[k].what, dest, CHASE_PREFIX_ROOT, &prefixed, NULL);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to resolve %s/%s: %m", dest, mount_table[k].what);
+                }
+
                 r = mount_verbose(fatal ? LOG_ERR : LOG_DEBUG,
-                                  mount_table[k].what,
+                                  prefixed ?: mount_table[k].what,
                                   where,
                                   mount_table[k].type,
                                   mount_table[k].flags,
index 062ed8b57daa768af8209fc102bc211614fc6f73..3898c74f18eaaf0897d769288df3b064ad882c33 100644 (file)
@@ -18,6 +18,7 @@ typedef enum MountSettingsMask {
         MOUNT_NON_ROOT_ONLY      = 1 << 7, /* if set, only non-root mounts are mounted */
         MOUNT_MKDIR              = 1 << 8, /* if set, make directory to mount over first */
         MOUNT_TOUCH              = 1 << 9, /* if set, touch file to mount over first */
+        MOUNT_PREFIX_ROOT        = 1 << 10,/* if set, prefix the source path with the container's root directory */
 } MountSettingsMask;
 
 typedef enum CustomMountType {
index 3020ef975ce861b2c9f5f6574a143f0f63e47d53..6d6fe87ed14654427c9937f27fa6d0bbf50b956b 100644 (file)
@@ -2977,13 +2977,20 @@ static int inner_child(
 
                 /* Wait until the parent wrote the UID map */
                 if (!barrier_place_and_sync(barrier)) /* #2 */
-                        return log_error_errno(SYNTHETIC_ERRNO(ESRCH),
-                                               "Parent died too early");
-        }
+                        return log_error_errno(SYNTHETIC_ERRNO(ESRCH), "Parent died too early");
 
-        r = reset_uid_gid();
-        if (r < 0)
-                return log_error_errno(r, "Couldn't become new root: %m");
+                /* Become the new root user inside our namespace */
+                r = reset_uid_gid();
+                if (r < 0)
+                        return log_error_errno(r, "Couldn't become new root: %m");
+
+                /* Creating a new user namespace means all MS_SHARED mounts become MS_SLAVE. Let's put them
+                 * back to MS_SHARED here, since that's what we want as defaults. (This will not reconnect
+                 * propagation, but simply create new peer groups for all our mounts). */
+                r = mount_verbose(LOG_ERR, NULL, "/", NULL, MS_SHARED|MS_REC, NULL);
+                if (r < 0)
+                        return r;
+        }
 
         r = mount_all(NULL,
                       arg_mount_settings | MOUNT_IN_USERNS,
@@ -3252,7 +3259,7 @@ static int inner_child(
                  * binary. */
                 dollar_path = strv_env_get(env_use, "PATH");
                 if (dollar_path) {
-                        if (putenv((char*) dollar_path) != 0)
+                        if (setenv("PATH", dollar_path, 1) < 0)
                                 return log_error_errno(errno, "Failed to update $PATH: %m");
                 }
 
@@ -3350,9 +3357,8 @@ static int outer_child(
         if (r < 0)
                 return r;
 
-        /* Mark everything as slave, so that we still
-         * receive mounts from the real root, but don't
-         * propagate mounts to the real root. */
+        /* Mark everything as slave, so that we still receive mounts from the real root, but don't propagate
+         * mounts to the real root. */
         r = mount_verbose(LOG_ERR, NULL, "/", NULL, MS_SLAVE|MS_REC, NULL);
         if (r < 0)
                 return r;
@@ -3598,9 +3604,8 @@ static int outer_child(
                 notify_socket = safe_close(notify_socket);
                 uid_shift_socket = safe_close(uid_shift_socket);
 
-                /* The inner child has all namespaces that are
-                 * requested, so that we all are owned by the user if
-                 * user namespaces are turned on. */
+                /* The inner child has all namespaces that are requested, so that we all are owned by the
+                 * user if user namespaces are turned on. */
 
                 if (arg_network_namespace_path) {
                         r = namespace_enter(-1, -1, netns_fd, -1, -1);
@@ -5218,6 +5223,7 @@ static int run(int argc, char *argv[]) {
                                 arg_image,
                                 arg_root_hash, arg_root_hash_size,
                                 arg_verity_data,
+                                NULL,
                                 dissect_image_flags,
                                 &dissected_image);
                 if (r == -ENOPKG) {
index 69df7515635bc6b0e23fdd25a8c3ea32303f62ab..9a9fd6dff3a3cf0e340cb0c6d5311b661c6a51e5 100644 (file)
@@ -33,6 +33,7 @@
 #include "fs-util.h"
 #include "gpt.h"
 #include "id128-util.h"
+#include "json.h"
 #include "list.h"
 #include "locale-util.h"
 #include "main-func.h"
@@ -79,6 +80,8 @@ static sd_id128_t arg_seed = SD_ID128_NULL;
 static bool arg_randomize = false;
 static int arg_pretty = -1;
 static uint64_t arg_size = UINT64_MAX;
+static bool arg_json = false;
+static JsonFormatFlags arg_json_format_flags = 0;
 
 STATIC_DESTRUCTOR_REGISTER(arg_root, freep);
 STATIC_DESTRUCTOR_REGISTER(arg_definitions, freep);
@@ -952,7 +955,7 @@ static int config_parse_weight(
         }
 
         if (v > 1000U*1000U) {
-                log_syntax(unit, LOG_WARNING, filename, line, r,
+                log_syntax(unit, LOG_WARNING, filename, line, 0,
                            "Weight needs to be in range 0…10000000, ignoring: %" PRIu32, v);
                 return 0;
         }
@@ -981,7 +984,7 @@ static int config_parse_size4096(
 
         r = parse_size(rvalue, 1024, &parsed);
         if (r < 0)
-                return log_syntax(unit, LOG_WARNING, filename, line, r,
+                return log_syntax(unit, LOG_ERR, filename, line, r,
                                   "Failed to parse size value: %s", rvalue);
 
         if (ltype > 0)
@@ -1620,12 +1623,23 @@ static int context_dump_partitions(Context *context, const char *node) {
         Partition *p;
         int r;
 
-        t = table_new("type", "label", "uuid", "file", "node", "offset", "raw size", "size", "raw padding", "padding");
+        if (!arg_json && context->n_partitions == 0) {
+                log_info("Empty partition table.");
+                return 0;
+        }
+
+        t = table_new("type", "label", "uuid", "file", "node", "offset", "old size", "raw size", "size", "old padding", "raw padding", "padding", "activity");
         if (!t)
                 return log_oom();
 
-        if (!DEBUG_LOGGING)
-                (void) table_set_display(t, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4, (size_t) 7, (size_t) 9, (size_t) -1);
+        if (!DEBUG_LOGGING) {
+                if (arg_json)
+                        (void) table_set_display(t, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4,
+                                                    (size_t) 5, (size_t) 6, (size_t) 7, (size_t) 9, (size_t) 10, (size_t) 12, (size_t) -1);
+                else
+                        (void) table_set_display(t, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4,
+                                                    (size_t) 8, (size_t) 11, (size_t) -1);
+        }
 
         (void) table_set_align_percent(t, table_get_cell(t, 0, 4), 100);
         (void) table_set_align_percent(t, table_get_cell(t, 0, 5), 100);
@@ -1633,11 +1647,16 @@ static int context_dump_partitions(Context *context, const char *node) {
         LIST_FOREACH(partitions, p, context->partitions) {
                 _cleanup_free_ char *size_change = NULL, *padding_change = NULL, *partname = NULL;
                 char uuid_buffer[ID128_UUID_STRING_MAX];
-                const char *label;
+                const char *label, *activity = NULL;
 
                 if (p->dropped)
                         continue;
 
+                if (p->current_size == UINT64_MAX)
+                        activity = "create";
+                else if (p->current_size != p->new_size)
+                        activity = "resize";
+
                 label = partition_label(p);
                 partname = p->partno != UINT64_MAX ? fdisk_partname(node, p->partno+1) : NULL;
 
@@ -1660,17 +1679,20 @@ static int context_dump_partitions(Context *context, const char *node) {
                                 TABLE_STRING, label ?: "-", TABLE_SET_COLOR, label ? NULL : ansi_grey(),
                                 TABLE_UUID, sd_id128_is_null(p->new_uuid) ? p->current_uuid : p->new_uuid,
                                 TABLE_STRING, p->definition_path ? basename(p->definition_path) : "-", TABLE_SET_COLOR, p->definition_path ? NULL : ansi_grey(),
-                                TABLE_STRING, partname ?: "no", TABLE_SET_COLOR, partname ? NULL : ansi_highlight(),
+                                TABLE_STRING, partname ?: "-", TABLE_SET_COLOR, partname ? NULL : ansi_highlight(),
                                 TABLE_UINT64, p->offset,
+                                TABLE_UINT64, p->current_size == UINT64_MAX ? 0 : p->current_size,
                                 TABLE_UINT64, p->new_size,
                                 TABLE_STRING, size_change, TABLE_SET_COLOR, !p->partitions_next && sum_size > 0 ? ansi_underline() : NULL,
+                                TABLE_UINT64, p->current_padding == UINT64_MAX ? 0 : p->current_padding,
                                 TABLE_UINT64, p->new_padding,
-                                TABLE_STRING, padding_change, TABLE_SET_COLOR, !p->partitions_next && sum_padding > 0 ? ansi_underline() : NULL);
+                                TABLE_STRING, padding_change, TABLE_SET_COLOR, !p->partitions_next && sum_padding > 0 ? ansi_underline() : NULL,
+                                TABLE_STRING, activity ?: "unknown");
                 if (r < 0)
                         return table_log_add_error(r);
         }
 
-        if (sum_padding > 0 || sum_size > 0) {
+        if (!arg_json && (sum_padding > 0 || sum_size > 0)) {
                 char s[FORMAT_BYTES_MAX];
                 const char *a, *b;
 
@@ -1686,14 +1708,20 @@ static int context_dump_partitions(Context *context, const char *node) {
                                 TABLE_EMPTY,
                                 TABLE_EMPTY,
                                 TABLE_EMPTY,
+                                TABLE_EMPTY,
                                 TABLE_STRING, a,
                                 TABLE_EMPTY,
-                                TABLE_STRING, b);
+                                TABLE_EMPTY,
+                                TABLE_STRING, b,
+                                TABLE_EMPTY);
                 if (r < 0)
                         return table_log_add_error(r);
         }
 
-        r = table_print(t, stdout);
+        if (arg_json)
+                r = table_print_json(t, stdout, arg_json_format_flags);
+        else
+                r = table_print(t, stdout);
         if (r < 0)
                 return log_error_errno(r, "Failed to dump table: %m");
 
@@ -2399,16 +2427,14 @@ static int context_write_partition_table(
         assert(context);
 
         if (arg_pretty > 0 ||
-            (arg_pretty < 0 && isatty(STDOUT_FILENO) > 0)) {
+            (arg_pretty < 0 && isatty(STDOUT_FILENO) > 0) || arg_json) {
 
-                if (context->n_partitions == 0)
-                        puts("Empty partition table.");
-                else
-                        (void) context_dump_partitions(context, node);
+                (void) context_dump_partitions(context, node);
 
                 putc('\n', stdout);
 
-                (void) context_dump_partition_bar(context, node);
+                if (!arg_json)
+                        (void) context_dump_partition_bar(context, node);
                 putc('\n', stdout);
                 fflush(stdout);
         }
@@ -2791,7 +2817,7 @@ static int help(void) {
                "     --empty=MODE         One of refuse, allow, require, force, create; controls\n"
                "                          how to handle empty disks lacking partition tables\n"
                "     --discard=BOOL       Whether to discard backing blocks for new partitions\n"
-               "     --pretty=BOOL        Whether to show pretty summary before executing operation\n"
+               "     --pretty=BOOL        Whether to show pretty summary before doing changes\n"
                "     --factory-reset=BOOL Whether to remove data partitions before recreating\n"
                "                          them\n"
                "     --can-factory-reset  Test whether factory reset is defined\n"
@@ -2799,6 +2825,8 @@ static int help(void) {
                "     --definitions=DIR    Find partitions in specified directory\n"
                "     --seed=UUID          128bit seed UUID to derive all UUIDs from\n"
                "     --size=BYTES         Grow loopback file to specified size\n"
+               "     --json=pretty|short|off\n"
+               "                          Generate json output\n"
                "\nSee the %s for details.\n"
                , program_invocation_short_name
                , ansi_highlight(), ansi_normal()
@@ -2822,6 +2850,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_PRETTY,
                 ARG_DEFINITIONS,
                 ARG_SIZE,
+                ARG_JSON,
         };
 
         static const struct option options[] = {
@@ -2837,6 +2866,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "pretty",            required_argument, NULL, ARG_PRETTY            },
                 { "definitions",       required_argument, NULL, ARG_DEFINITIONS       },
                 { "size",              required_argument, NULL, ARG_SIZE              },
+                { "json",              required_argument, NULL, ARG_JSON              },
                 {}
         };
 
@@ -2960,6 +2990,26 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_size = rounded;
                         break;
                 }
+                case ARG_JSON:
+                        if (streq(optarg, "pretty")) {
+                                arg_json = true;
+                                arg_json_format_flags = JSON_FORMAT_PRETTY|JSON_FORMAT_COLOR_AUTO;
+                        } else if (streq(optarg, "short")) {
+                                arg_json = true;
+                                arg_json_format_flags = JSON_FORMAT_NEWLINE;
+                        } else if (streq(optarg, "off")) {
+                                arg_json = false;
+                                arg_json_format_flags = 0;
+                        } else if (streq(optarg, "help")) {
+                                puts("pretty\n"
+                                     "short\n"
+                                     "off");
+                                return 0;
+                        } else
+                                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown argument to --json=: %s", optarg);
+
+                        break;
+
 
                 case '?':
                         return -EINVAL;
index bfb9bcb4c9b7192465f6dda873e798a2aa650668..730f9cc9c3f250af2192c61a08fe50ad66c6208a 100755 (executable)
@@ -10,6 +10,8 @@ mkdir -p $D/definitions
 
 SEED=e2a40bf9-73f1-4278-9160-49c031e7aef8
 
+echo "### Testing systemd-repart --empty=create ###"
+
 $repart $D/zzz --empty=create --size=1G --seed=$SEED
 
 sfdisk -d $D/zzz | grep -v -e 'sector-size' -e '^$' >$D/empty
@@ -23,6 +25,8 @@ first-lba: 2048
 last-lba: 2097118
 EOF
 
+echo "### Testing with root, root2, home, & swap ###"
+
 cat >$D/definitions/root.conf <<EOF
 [Partition]
 Type=root-x86-64
@@ -61,6 +65,8 @@ $D/zzz3 : start=     1185760, size=      591864, type=4F68BCE3-E8CD-4DB1-96E7-FB
 $D/zzz4 : start=     1777624, size=      131072, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F, uuid=2AA78CDB-59C7-4173-AF11-C7453737A5D1, name="swap"
 EOF
 
+echo "### Testing with root, root2, home, swap, & another partition ###"
+
 cat >$D/definitions/swap.conf <<EOF
 [Partition]
 Type=swap
@@ -95,6 +101,8 @@ $D/zzz4 : start=     1777624, size=      131072, type=0657FD6D-A4AB-43C4-84E5-09
 $D/zzz5 : start=     1908696, size=      188416, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=A0A1A2A3-A4A5-A6A7-A8A9-AAABACADAEAF, name="custom_label"
 EOF
 
+echo "### Resizing to 2G ###"
+
 $repart $D/zzz --size=2G --dry-run=no --seed=$SEED --definitions=$D/definitions
 
 sfdisk -d $D/zzz | grep -v -e 'sector-size' -e '^$' >$D/populated3
@@ -115,6 +123,8 @@ EOF
 
 dd if=/dev/urandom of=$D/block-copy bs=4096 count=10240
 
+echo "### Testing with root, root2, home, swap, another partition, & partition copy ###"
+
 cat >$D/definitions/extra2.conf <<EOF
 [Partition]
 Type=linux-generic
@@ -143,3 +153,8 @@ $D/zzz6 : start=     4194264, size=     2097152, type=0FC63DAF-8483-4772-8E79-3D
 EOF
 
 cmp --bytes=41943040 --ignore-initial=0:$((512*4194264)) $D/block-copy $D/zzz
+
+echo "### Testing json output ###"
+$repart $D/zzz --size=3G --dry-run=no --seed=$SEED --definitions=$D/definitions --json=help
+$repart $D/zzz --size=3G --dry-run=no --seed=$SEED --definitions=$D/definitions --json=pretty
+$repart $D/zzz --size=3G --dry-run=no --seed=$SEED --definitions=$D/definitions --json=short
index 48294d4c492abf9701df8432face2a111469de28..bd7edce8075f5500754f66d93c88cf9de6c30d25 100644 (file)
@@ -380,7 +380,7 @@ static int portable_extract_by_path(
                 if (r < 0)
                         return log_debug_errno(r, "Failed to create temporary directory: %m");
 
-                r = dissect_image(d->fd, NULL, 0, NULL, DISSECT_IMAGE_READ_ONLY|DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_DISCARD_ON_LOOP|DISSECT_IMAGE_RELAX_VAR_CHECK, &m);
+                r = dissect_image(d->fd, NULL, 0, NULL, NULL, DISSECT_IMAGE_READ_ONLY|DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_DISCARD_ON_LOOP|DISSECT_IMAGE_RELAX_VAR_CHECK, &m);
                 if (r == -ENOPKG)
                         sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Couldn't identify a suitable partition table or file system in '%s'.", path);
                 else if (r == -EADDRNOTAVAIL)
@@ -695,17 +695,28 @@ static int install_chroot_dropin(
         if (!text)
                 return -ENOMEM;
 
-        if (endswith(m->name, ".service"))
+        if (endswith(m->name, ".service")) {
+                const char *os_release_source;
+
+                if (access("/etc/os-release", F_OK) < 0) {
+                        if (errno != ENOENT)
+                                return log_debug_errno(errno, "Failed to check if /etc/os-release exists: %m");
+
+                        os_release_source = "/usr/lib/os-release";
+                } else
+                        os_release_source = "/etc/os-release";
+
                 if (!strextend(&text,
                                "\n"
                                "[Service]\n",
                                IN_SET(type, IMAGE_DIRECTORY, IMAGE_SUBVOLUME) ? "RootDirectory=" : "RootImage=", image_path, "\n"
                                "Environment=PORTABLE=", basename(image_path), "\n"
-                               "BindReadOnlyPaths=-/etc/os-release:/run/host/etc/os-release /usr/lib/os-release:/run/host/usr/lib/os-release\n"
+                               "BindReadOnlyPaths=", os_release_source, ":/run/host/os-release\n"
                                "LogExtraFields=PORTABLE=", basename(image_path), "\n",
                                NULL))
 
                         return -ENOMEM;
+        }
 
         r = write_string_file(dropin, text, WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC);
         if (r < 0)
index 476c5e4a3c032a16dcfde4d08e04be7d076c0de9..3072b984e5d52a3ecbbbf8545a131cb15bf97fbd 100644 (file)
@@ -1969,8 +1969,10 @@ static int call_dns(sd_bus *bus, char **dns, const BusLocator *locator, sd_bus_e
                 return bus_log_create_error(r);
 
         r = sd_bus_call(bus, req, 0, error, NULL);
-        if (r < 0 && extended && sd_bus_error_has_name(error, SD_BUS_ERROR_UNKNOWN_METHOD))
+        if (r < 0 && extended && sd_bus_error_has_name(error, SD_BUS_ERROR_UNKNOWN_METHOD)) {
+                sd_bus_error_free(error);
                 return call_dns(bus, dns, locator, error, false);
+        }
         return r;
 }
 
index 906158c5cedba892e6503d7c92ac0662da4e3669..87c1ced85745558b4fe1ff59d8ec2e6b67685eb3 100644 (file)
@@ -687,11 +687,11 @@ int dns_query_go(DnsQuery *q) {
 
         dns_query_reset_answer(q);
 
-        r = sd_event_add_time(
+        r = sd_event_add_time_relative(
                         q->manager->event,
                         &q->timeout_event_source,
                         clock_boottime_or_monotonic(),
-                        now(clock_boottime_or_monotonic()) + SD_RESOLVED_QUERY_TIMEOUT_USEC,
+                        SD_RESOLVED_QUERY_TIMEOUT_USEC,
                         0, on_query_timeout, q);
         if (r < 0)
                 goto fail;
index bd4b59ea8e18ee6afd415054bd56d18aaceef324..f1afc456035c6f8c9c1bc223478a7960e5cdb6bf 100644 (file)
@@ -1059,12 +1059,13 @@ int dns_scope_notify_conflict(DnsScope *scope, DnsResourceRecord *rr) {
         random_bytes(&jitter, sizeof(jitter));
         jitter %= LLMNR_JITTER_INTERVAL_USEC;
 
-        r = sd_event_add_time(scope->manager->event,
-                              &scope->conflict_event_source,
-                              clock_boottime_or_monotonic(),
-                              now(clock_boottime_or_monotonic()) + jitter,
-                              LLMNR_JITTER_INTERVAL_USEC,
-                              on_conflict_dispatch, scope);
+        r = sd_event_add_time_relative(
+                        scope->manager->event,
+                        &scope->conflict_event_source,
+                        clock_boottime_or_monotonic(),
+                        jitter,
+                        LLMNR_JITTER_INTERVAL_USEC,
+                        on_conflict_dispatch, scope);
         if (r < 0)
                 return log_debug_errno(r, "Failed to add conflict dispatch event: %m");
 
@@ -1318,18 +1319,13 @@ int dns_scope_announce(DnsScope *scope, bool goodbye) {
         /* In section 8.3 of RFC6762: "The Multicast DNS responder MUST send at least two unsolicited
          * responses, one second apart." */
         if (!scope->announced) {
-                usec_t ts;
-
                 scope->announced = true;
 
-                assert_se(sd_event_now(scope->manager->event, clock_boottime_or_monotonic(), &ts) >= 0);
-                ts += MDNS_ANNOUNCE_DELAY;
-
-                r = sd_event_add_time(
+                r = sd_event_add_time_relative(
                                 scope->manager->event,
                                 &scope->announce_event_source,
                                 clock_boottime_or_monotonic(),
-                                ts,
+                                MDNS_ANNOUNCE_DELAY,
                                 MDNS_JITTER_RANGE_USEC,
                                 on_announcement_timeout, scope);
                 if (r < 0)
index c87026f434e81752375a35f04ea67fbdb237de1b..9c221e1989bd19b85a5140aa32a305ceca9a59e8 100644 (file)
@@ -627,8 +627,7 @@ static void dns_server_hash_func(const DnsServer *s, struct siphash *state) {
         siphash24_compress(&s->address, FAMILY_ADDRESS_SIZE(s->family), state);
         siphash24_compress(&s->port, sizeof(s->port), state);
         siphash24_compress(&s->ifindex, sizeof(s->ifindex), state);
-        if (s->server_name)
-                siphash24_compress(s->server_name, strlen(s->server_name), state);
+        siphash24_compress_string(s->server_name, state);
 }
 
 static int dns_server_compare_func(const DnsServer *x, const DnsServer *y) {
index d4c49e673ef8a65dbca4df91e3968b7870a24fec..12f69aef382ced4ac07a7365de8c2d422896ae6d 100644 (file)
@@ -445,7 +445,7 @@ static int on_stream_io(sd_event_source *es, int fd, uint32_t revents, void *use
 
         /* If we did something, let's restart the timeout event source */
         if (progressed && s->timeout_event_source) {
-                r = sd_event_source_set_time(s->timeout_event_source, now(clock_boottime_or_monotonic()) + DNS_STREAM_TIMEOUT_USEC);
+                r = sd_event_source_set_time_relative(s->timeout_event_source, DNS_STREAM_TIMEOUT_USEC);
                 if (r < 0)
                         log_warning_errno(errno, "Couldn't restart TCP connection timeout, ignoring: %m");
         }
@@ -528,11 +528,11 @@ int dns_stream_new(
 
         (void) sd_event_source_set_description(s->io_event_source, "dns-stream-io");
 
-        r = sd_event_add_time(
+        r = sd_event_add_time_relative(
                         m->event,
                         &s->timeout_event_source,
                         clock_boottime_or_monotonic(),
-                        now(clock_boottime_or_monotonic()) + DNS_STREAM_TIMEOUT_USEC, 0,
+                        DNS_STREAM_TIMEOUT_USEC, 0,
                         on_stream_timeout, s);
         if (r < 0)
                 return r;
index f2652ed9a59dafeef5a03940b338a96d066056f0..30a872342ff732847d1310690eedbda887c3c633 100644 (file)
@@ -1454,6 +1454,74 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
                 return bus_append_byte_array(m, field, roothash_sig_decoded, roothash_sig_decoded_size);
         }
 
+        if (streq(field, "RootImageOptions")) {
+                const char *p = eq;
+
+                r = sd_bus_message_open_container(m, SD_BUS_TYPE_STRUCT, "sv");
+                if (r < 0)
+                        return bus_log_create_error(r);
+
+                r = sd_bus_message_append_basic(m, SD_BUS_TYPE_STRING, field);
+                if (r < 0)
+                        return bus_log_create_error(r);
+
+                r = sd_bus_message_open_container(m, 'v', "a(us)");
+                if (r < 0)
+                        return bus_log_create_error(r);
+
+                r = sd_bus_message_open_container(m, 'a', "(us)");
+                if (r < 0)
+                        return bus_log_create_error(r);
+
+                for (;;) {
+                        _cleanup_free_ char *first = NULL, *tuple = NULL;
+                        const char *mount_options = NULL, *second = NULL;
+                        unsigned partition_number = 0;
+
+                        r = extract_first_word(&p, &tuple, WHITESPACE, EXTRACT_UNQUOTE);
+                        if (r == 0)
+                                break;
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse argument: %m");
+
+                        second = tuple;
+                        r = extract_first_word(&second, &first, ":", EXTRACT_UNQUOTE|EXTRACT_DONT_COALESCE_SEPARATORS);
+                        if (r == 0)
+                                continue;
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse argument: %m");
+
+                        /* Format is either '0:foo' or 'foo' (0 is implied) */
+                        if (!isempty(second) && second[-1] == ':') {
+                                mount_options = second;
+                                r = safe_atou(first, &partition_number);
+                                if (r < 0) {
+                                        log_error_errno(r, "Failed to parse partition number from %s: %m", first);
+                                        continue;
+                                }
+                        } else
+                                mount_options = first;
+
+                        r = sd_bus_message_append(m, "(us)", partition_number, mount_options);
+                        if (r < 0)
+                                return bus_log_create_error(r);
+                }
+
+                r = sd_bus_message_close_container(m);
+                if (r < 0)
+                        return bus_log_create_error(r);
+
+                r = sd_bus_message_close_container(m);
+                if (r < 0)
+                        return bus_log_create_error(r);
+
+                r = sd_bus_message_close_container(m);
+                if (r < 0)
+                        return bus_log_create_error(r);
+
+                return 1;
+        }
+
         return 0;
 }
 
index 24be6de6c546fa84e39afa693ff26051ebb8d6b7..e96658ca66933ab0ed23255ffa664cb6276a1436 100644 (file)
@@ -308,6 +308,7 @@ int dissect_image(
                 const void *root_hash,
                 size_t root_hash_size,
                 const char *verity_data,
+                const MountOptions *mount_options,
                 DissectImageFlags flags,
                 DissectedImage **ret) {
 
@@ -400,8 +401,8 @@ int dissect_image(
 
                 (void) blkid_probe_lookup_value(b, "USAGE", &usage, NULL);
                 if (STRPTR_IN_SET(usage, "filesystem", "crypto")) {
-                        _cleanup_free_ char *t = NULL, *n = NULL;
-                        const char *fstype = NULL;
+                        _cleanup_free_ char *t = NULL, *n = NULL, *o = NULL;
+                        const char *fstype = NULL, *options = NULL;
 
                         /* OK, we have found a file system, that's our root partition then. */
                         (void) blkid_probe_lookup_value(b, "TYPE", &fstype, NULL);
@@ -420,6 +421,13 @@ int dissect_image(
                         m->verity = root_hash && verity_data;
                         m->can_verity = !!verity_data;
 
+                        options = mount_options_from_part(mount_options, 0);
+                        if (options) {
+                                o = strdup(options);
+                                if (!o)
+                                        return -ENOMEM;
+                        }
+
                         m->partitions[PARTITION_ROOT] = (DissectedPartition) {
                                 .found = true,
                                 .rw = !m->verity,
@@ -427,6 +435,7 @@ int dissect_image(
                                 .architecture = _ARCHITECTURE_INVALID,
                                 .fstype = TAKE_PTR(t),
                                 .node = TAKE_PTR(n),
+                                .mount_options = TAKE_PTR(o),
                         };
 
                         m->encrypted = streq_ptr(fstype, "crypto_LUKS");
@@ -691,7 +700,8 @@ int dissect_image(
                         }
 
                         if (designator != _PARTITION_DESIGNATOR_INVALID) {
-                                _cleanup_free_ char *t = NULL, *n = NULL;
+                                _cleanup_free_ char *t = NULL, *n = NULL, *o = NULL;
+                                const char *options = NULL;
 
                                 /* First one wins */
                                 if (m->partitions[designator].found)
@@ -707,6 +717,13 @@ int dissect_image(
                                 if (!n)
                                         return -ENOMEM;
 
+                                options = mount_options_from_part(mount_options, nr);
+                                if (options) {
+                                        o = strdup(options);
+                                        if (!o)
+                                                return -ENOMEM;
+                                }
+
                                 m->partitions[designator] = (DissectedPartition) {
                                         .found = true,
                                         .partno = nr,
@@ -715,6 +732,7 @@ int dissect_image(
                                         .node = TAKE_PTR(n),
                                         .fstype = TAKE_PTR(t),
                                         .uuid = id,
+                                        .mount_options = TAKE_PTR(o),
                                 };
                         }
 
@@ -740,9 +758,9 @@ int dissect_image(
                                 break;
 
                         case 0xEA: { /* Boot Loader Spec extended $BOOT partition */
-                                _cleanup_free_ char *n = NULL;
+                                _cleanup_free_ char *n = NULL, *o = NULL;
                                 sd_id128_t id = SD_ID128_NULL;
-                                const char *sid;
+                                const char *sid, *options = NULL;
 
                                 /* First one wins */
                                 if (m->partitions[PARTITION_XBOOTLDR].found)
@@ -756,6 +774,13 @@ int dissect_image(
                                 if (!n)
                                         return -ENOMEM;
 
+                                options = mount_options_from_part(mount_options, nr);
+                                if (options) {
+                                        o = strdup(options);
+                                        if (!o)
+                                                return -ENOMEM;
+                                }
+
                                 m->partitions[PARTITION_XBOOTLDR] = (DissectedPartition) {
                                         .found = true,
                                         .partno = nr,
@@ -763,6 +788,7 @@ int dissect_image(
                                         .architecture = _ARCHITECTURE_INVALID,
                                         .node = TAKE_PTR(n),
                                         .uuid = id,
+                                        .mount_options = TAKE_PTR(o),
                                 };
 
                                 break;
@@ -785,6 +811,8 @@ int dissect_image(
                         zero(m->partitions[PARTITION_ROOT_SECONDARY_VERITY]);
 
                 } else if (flags & DISSECT_IMAGE_REQUIRE_ROOT) {
+                        _cleanup_free_ char *o = NULL;
+                        const char *options = NULL;
 
                         /* If the root has was set, then we won't fallback to a generic node, because the root hash
                          * decides */
@@ -800,6 +828,13 @@ int dissect_image(
                         if (multiple_generic)
                                 return -ENOTUNIQ;
 
+                        options = mount_options_from_part(mount_options, generic_nr);
+                        if (options) {
+                                o = strdup(options);
+                                if (!o)
+                                        return -ENOMEM;
+                        }
+
                         m->partitions[PARTITION_ROOT] = (DissectedPartition) {
                                 .found = true,
                                 .rw = generic_rw,
@@ -807,6 +842,7 @@ int dissect_image(
                                 .architecture = _ARCHITECTURE_INVALID,
                                 .node = TAKE_PTR(generic_node),
                                 .uuid = generic_uuid,
+                                .mount_options = TAKE_PTR(o),
                         };
                 }
         }
@@ -869,6 +905,7 @@ DissectedImage* dissected_image_unref(DissectedImage *m) {
                 free(m->partitions[i].node);
                 free(m->partitions[i].decrypted_fstype);
                 free(m->partitions[i].decrypted_node);
+                free(m->partitions[i].mount_options);
         }
 
         free(m->hostname);
@@ -1008,6 +1045,10 @@ static int mount_partition(
                         return -ENOMEM;
         }
 
+        if (!isempty(m->mount_options))
+                if (!strextend_with_separator(&options, ",", m->mount_options, NULL))
+                        return -ENOMEM;
+
         r = mount_verbose(LOG_DEBUG, node, p, fstype, MS_NODEV|(rw ? 0 : MS_RDONLY), options);
         if (r < 0)
                 return r;
@@ -1819,6 +1860,7 @@ int dissect_image_and_warn(
                 const void *root_hash,
                 size_t root_hash_size,
                 const char *verity_data,
+                const MountOptions *mount_options,
                 DissectImageFlags flags,
                 DissectedImage **ret) {
 
@@ -1833,7 +1875,7 @@ int dissect_image_and_warn(
                 name = buffer;
         }
 
-        r = dissect_image(fd, root_hash, root_hash_size, verity_data, flags, ret);
+        r = dissect_image(fd, root_hash, root_hash_size, verity_data, mount_options, flags, ret);
 
         switch (r) {
 
@@ -1880,6 +1922,27 @@ bool dissected_image_has_verity(const DissectedImage *image, unsigned partition_
         return k >= 0 && image->partitions[k].found;
 }
 
+MountOptions* mount_options_free_all(MountOptions *options) {
+        MountOptions *m;
+
+        while ((m = options)) {
+                LIST_REMOVE(mount_options, options, m);
+                free(m->options);
+                free(m);
+        }
+
+        return NULL;
+}
+
+const char* mount_options_from_part(const MountOptions *options, unsigned int partition_number) {
+        MountOptions *m;
+
+        LIST_FOREACH(mount_options, m, (MountOptions *)options)
+                if (partition_number == m->partition_number && !isempty(m->options))
+                        return m->options;
+        return NULL;
+}
+
 static const char *const partition_designator_table[] = {
         [PARTITION_ROOT] = "root",
         [PARTITION_ROOT_SECONDARY] = "root-secondary",
index 84ec1ce331163c6bffd61474ec233d09119ad549..52aa377a671a32616ce11a7162ae5c68c1b7912c 100644 (file)
@@ -5,11 +5,13 @@
 
 #include "sd-id128.h"
 
+#include "list.h"
 #include "macro.h"
 
 typedef struct DissectedImage DissectedImage;
 typedef struct DissectedPartition DissectedPartition;
 typedef struct DecryptedImage DecryptedImage;
+typedef struct MountOptions MountOptions;
 
 struct DissectedPartition {
         bool found:1;
@@ -21,6 +23,7 @@ struct DissectedPartition {
         char *node;
         char *decrypted_node;
         char *decrypted_fstype;
+        char *mount_options;
 };
 
 enum  {
@@ -81,9 +84,19 @@ struct DissectedImage {
         char **os_release;
 };
 
+struct MountOptions {
+        unsigned partition_number;
+        char *options;
+        LIST_FIELDS(MountOptions, mount_options);
+};
+
+MountOptions* mount_options_free_all(MountOptions *options);
+DEFINE_TRIVIAL_CLEANUP_FUNC(MountOptions*, mount_options_free_all);
+const char* mount_options_from_part(const MountOptions *options, unsigned int partition_number);
+
 int probe_filesystem(const char *node, char **ret_fstype);
-int dissect_image(int fd, const void *root_hash, size_t root_hash_size, const char *verity_data, DissectImageFlags flags, DissectedImage **ret);
-int dissect_image_and_warn(int fd, const char *name, const void *root_hash, size_t root_hash_size, const char *verity_data, DissectImageFlags flags, DissectedImage **ret);
+int dissect_image(int fd, const void *root_hash, size_t root_hash_size, const char *verity_data, const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret);
+int dissect_image_and_warn(int fd, const char *name, const void *root_hash, size_t root_hash_size, const char *verity_data, const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret);
 
 DissectedImage* dissected_image_unref(DissectedImage *m);
 DEFINE_TRIVIAL_CLEANUP_FUNC(DissectedImage*, dissected_image_unref);
index 7aee239e33a81c82b2e314407dc62758aa50be45..4a593b05f3c90073b6fd87e8ad60d66d040b7562 100644 (file)
@@ -191,6 +191,10 @@ LoopDevice* loop_device_unref(LoopDevice *d) {
                 return NULL;
 
         if (d->fd >= 0) {
+                /* Implicitly sync the device, since otherwise in-flight blocks might not get written */
+                if (fsync(d->fd) < 0)
+                        log_debug_errno(errno, "Failed to sync loop block device, ignoring: %m");
+
                 if (d->nr >= 0 && !d->relinquished) {
                         if (ioctl(d->fd, LOOP_CLR_FD) < 0)
                                 log_debug_errno(errno, "Failed to clear loop device: %m");
@@ -216,7 +220,7 @@ LoopDevice* loop_device_unref(LoopDevice *d) {
                                         log_warning_errno(errno, "Failed to remove device %s: %m", strna(d->node));
                                         break;
                                 }
-                                usleep(50 * USEC_PER_MSEC);
+                                (void) usleep(50 * USEC_PER_MSEC);
                         }
         }
 
index 1b7cfb5028adf763b2724dc9733c69e4774f24ee..c6ff41898b25b3befbed373bd7e295bba21aa9a7 100644 (file)
@@ -1171,7 +1171,7 @@ int image_read_metadata(Image *i) {
                 if (r < 0)
                         return r;
 
-                r = dissect_image(d->fd, NULL, 0, NULL, DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_RELAX_VAR_CHECK, &m);
+                r = dissect_image(d->fd, NULL, 0, NULL, NULL, DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_RELAX_VAR_CHECK, &m);
                 if (r < 0)
                         return r;
 
index 5934d716786e5ec8e745236d10723f35db3cfe23..8fb597e7c039de33ba61a04b5ee5692d61c91153 100644 (file)
@@ -8,21 +8,25 @@
 #include "errno-util.h"
 #include "macro.h"
 
-/* 4MB for contents of regular files, 64k inodes for directories, symbolic links and device specials,
  using large storage array systems as a baseline */
+/* 4MB for contents of regular files, 64k inodes for directories, symbolic links and device specials, using
* large storage array systems as a baseline */
 #define TMPFS_LIMITS_DEV             ",size=4m,nr_inodes=64k"
+
 /* Very little, if any use expected */
 #define TMPFS_LIMITS_EMPTY_OR_ALMOST ",size=4m,nr_inodes=1k"
 #define TMPFS_LIMITS_SYS             TMPFS_LIMITS_EMPTY_OR_ALMOST
 #define TMPFS_LIMITS_SYS_FS_CGROUP   TMPFS_LIMITS_EMPTY_OR_ALMOST
-/* On an extremely small device with only 256MB of RAM, 20% of RAM for /run should be enough for re-exec of
-   PID1 because 16MB of free space is required. */
+
+/* On an extremely small device with only 256MB of RAM, 20% of RAM should be enough for the re-execution of
+ * PID1 because 16MB of free space is required. */
 #define TMPFS_LIMITS_RUN             ",size=20%,nr_inodes=800k"
-/* 10% of RAM (using 16GB of RAM as a baseline) translates to 400k inodes (assuming 4k each) and 25%
-   translates to 1M inodes */
-#define TMPFS_LIMITS_TMP             ",size=10%,nr_inodes=400k"
-#define TMPFS_LIMITS_DEV_SHM         TMPFS_LIMITS_TMP
-#define TMPFS_LIMITS_TEMPORARY_FS    TMPFS_LIMITS_TMP
+
+/* The limit used for various nested tmpfs mounts, in paricular for guests started by systemd-nspawn.
+ * 10% of RAM (using 16GB of RAM as a baseline) translates to 400k inodes (assuming 4k each) and 25%
+ * translates to 1M inodes.
+ * (On the host, /tmp is configured through a .mount unit file.) */
+#define NESTED_TMPFS_LIMITS          ",size=10%,nr_inodes=400k"
+
 /* More space for volatile root and /var */
 #define TMPFS_LIMITS_VAR             ",size=25%,nr_inodes=1m"
 #define TMPFS_LIMITS_ROOTFS          TMPFS_LIMITS_VAR
index 6b9074ce2b23afc03b04bc943deb4069723b5938..0dccc8f9700491e5d7b1705065e75ca66a1a09ac 100644 (file)
@@ -125,10 +125,16 @@ int can_sleep_state(char **types) {
 
                 k = strlen(*type);
                 FOREACH_WORD_SEPARATOR(word, l, p, WHITESPACE, state)
-                        if (l == k && memcmp(word, *type, l) == 0)
+                        if (l == k && memcmp(word, *type, l) == 0) {
+                                log_debug("Sleep mode \"%s\" is supported by the kernel.", *type);
                                 return true;
+                        }
         }
 
+        if (DEBUG_LOGGING) {
+                _cleanup_free_ char *t = strv_join(types, "/");
+                log_debug("Sleep mode %s not supported by the kernel, sorry.", strnull(t));
+        }
         return false;
 }
 
index 419c73318fbbcac35ffca3e483f6c736a94d9af2..7cd7156a892fb57b8aa2b66c817dafb68b9e6cd2 100644 (file)
@@ -182,9 +182,10 @@ int device_wait_for_initialization(sd_device *device, const char *subsystem, use
                 return log_error_errno(r, "Failed to start device monitor: %m");
 
         if (timeout != USEC_INFINITY) {
-                r = sd_event_add_time(event, &timeout_source,
-                                      CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + timeout, 0,
-                                      device_timeout_handler, NULL);
+                r = sd_event_add_time_relative(
+                                event, &timeout_source,
+                                CLOCK_MONOTONIC, timeout, 0,
+                                device_timeout_handler, NULL);
                 if (r < 0)
                         return log_error_errno(r, "Failed to add timeout event source: %m");
         }
index b461aead60cd9bc459e4604af001d25c24562d3d..50f5b9c9c536a21ffc83508761e3b633b38401be 100644 (file)
@@ -95,16 +95,14 @@ static int idle_time_cb(sd_event_source *s, uint64_t usec, void *userdata) {
 }
 
 static int connection_release(Connection *c) {
-        int r;
         Context *context = c->context;
-        usec_t idle_instant;
+        int r;
 
         connection_free(c);
 
         if (arg_exit_idle_time < USEC_INFINITY && set_isempty(context->connections)) {
-                idle_instant = usec_add(now(CLOCK_MONOTONIC), arg_exit_idle_time);
                 if (context->idle_time) {
-                        r = sd_event_source_set_time(context->idle_time, idle_instant);
+                        r = sd_event_source_set_time_relative(context->idle_time, arg_exit_idle_time);
                         if (r < 0)
                                 return log_error_errno(r, "Error while setting idle time: %m");
 
@@ -112,8 +110,9 @@ static int connection_release(Connection *c) {
                         if (r < 0)
                                 return log_error_errno(r, "Error while enabling idle time: %m");
                 } else {
-                        r = sd_event_add_time(context->event, &context->idle_time, CLOCK_MONOTONIC,
-                                              idle_instant, 0, idle_time_cb, context);
+                        r = sd_event_add_time_relative(
+                                        context->event, &context->idle_time, CLOCK_MONOTONIC,
+                                        arg_exit_idle_time, 0, idle_time_cb, context);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to create idle timer: %m");
                 }
index 4301c6db878b4e5e556507a05f5d76124145e371..240df74af8c520cf707f9bde280ddfcc17d8129d 100644 (file)
@@ -43,6 +43,7 @@ int sd_dhcp6_lease_get_dns(sd_dhcp6_lease *lease, const struct in6_addr **addrs)
 int sd_dhcp6_lease_get_domains(sd_dhcp6_lease *lease, char ***domains);
 int sd_dhcp6_lease_get_ntp_addrs(sd_dhcp6_lease *lease, const struct in6_addr **addrs);
 int sd_dhcp6_lease_get_ntp_fqdn(sd_dhcp6_lease *lease, char ***ntp_fqdn);
+int sd_dhcp6_lease_get_fqdn(sd_dhcp6_lease *lease, const char **fqdn);
 
 sd_dhcp6_lease *sd_dhcp6_lease_ref(sd_dhcp6_lease *lease);
 sd_dhcp6_lease *sd_dhcp6_lease_unref(sd_dhcp6_lease *lease);
index 2ec726a897abb23cd56d2e30514c258e9e599ee7..dc96bfa68176aa05f2c62cae93016358e8b46d8f 100644 (file)
@@ -88,6 +88,7 @@ sd_event* sd_event_unref(sd_event *e);
 
 int sd_event_add_io(sd_event *e, sd_event_source **s, int fd, uint32_t events, sd_event_io_handler_t callback, void *userdata);
 int sd_event_add_time(sd_event *e, sd_event_source **s, clockid_t clock, uint64_t usec, uint64_t accuracy, sd_event_time_handler_t callback, void *userdata);
+int sd_event_add_time_relative(sd_event *e, sd_event_source **s, clockid_t clock, uint64_t usec, uint64_t accuracy, sd_event_time_handler_t callback, void *userdata);
 int sd_event_add_signal(sd_event *e, sd_event_source **s, int sig, sd_event_signal_handler_t callback, void *userdata);
 int sd_event_add_child(sd_event *e, sd_event_source **s, pid_t pid, int options, sd_event_child_handler_t callback, void *userdata);
 int sd_event_add_child_pidfd(sd_event *e, sd_event_source **s, int pidfd, int options, sd_event_child_handler_t callback, void *userdata);
@@ -138,6 +139,7 @@ int sd_event_source_set_io_events(sd_event_source *s, uint32_t events);
 int sd_event_source_get_io_revents(sd_event_source *s, uint32_t* revents);
 int sd_event_source_get_time(sd_event_source *s, uint64_t *usec);
 int sd_event_source_set_time(sd_event_source *s, uint64_t usec);
+int sd_event_source_set_time_relative(sd_event_source *s, uint64_t usec);
 int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec);
 int sd_event_source_set_time_accuracy(sd_event_source *s, uint64_t usec);
 int sd_event_source_get_time_clock(sd_event_source *s, clockid_t *clock);
index d85f705504403cdd9240e966adb17c8cce9e29b4..72356aeaa4da2bec0fcf8923686d3a6d69e4f3df 100644 (file)
@@ -136,6 +136,9 @@ static void test_cleanup_order(void) {
 static void test_auto_erase_memory(void) {
         _cleanup_(erase_and_freep) uint8_t *p1, *p2;
 
+        /* print address of p2, else e.g. clang-11 will optimize it out */
+        log_debug("p1: %p p2: %p", &p1, &p2);
+
         assert_se(p1 = new(uint8_t, 1024));
         assert_se(p2 = new(uint8_t, 1024));
 
index ea47f5affaba4fe0b99ea3e6f158313771087982..eff586a2e1d5497f5e1e34e7204219dfce1a352b 100644 (file)
@@ -23,7 +23,7 @@ static void check_p_d_u(const char *path, int code, const char *result) {
         int r;
 
         r = cg_path_decode_unit(path, &unit);
-        printf("%s: %s → %s %d expected %s %d\n", __func__, path, unit, r, result, code);
+        printf("%s: %s → %s %d expected %s %d\n", __func__, path, unit, r, strnull(result), code);
         assert_se(r == code);
         assert_se(streq_ptr(unit, result));
 }
@@ -45,7 +45,7 @@ static void check_p_g_u(const char *path, int code, const char *result) {
         int r;
 
         r = cg_path_get_unit(path, &unit);
-        printf("%s: %s → %s %d expected %s %d\n", __func__, path, unit, r, result, code);
+        printf("%s: %s → %s %d expected %s %d\n", __func__, path, unit, r, strnull(result), code);
         assert_se(r == code);
         assert_se(streq_ptr(unit, result));
 }
@@ -69,7 +69,7 @@ static void check_p_g_u_u(const char *path, int code, const char *result) {
         int r;
 
         r = cg_path_get_user_unit(path, &unit);
-        printf("%s: %s → %s %d expected %s %d\n", __func__, path, unit, r, result, code);
+        printf("%s: %s → %s %d expected %s %d\n", __func__, path, unit, r, strnull(result), code);
         assert_se(r == code);
         assert_se(streq_ptr(unit, result));
 }
index e5a3de8a59a65bdf7a7872cad052efdf507a8539..271d4655463a183b97addc37b04aa671ee21b073 100644 (file)
@@ -49,7 +49,7 @@ static void test_clock_is_localtime(void) {
                 log_info("scenario #%zu:, expected result %i", i, scenarios[i].expected_result);
                 log_info("%s", scenarios[i].contents);
                 rewind(f);
-                ftruncate(fileno(f), 0);
+                assert_se(ftruncate(fileno(f), 0) == 0);
                 assert_se(write_string_stream(f, scenarios[i].contents, WRITE_STRING_FILE_AVOID_NEWLINE) == 0);
                 assert_se(clock_is_localtime(adjtime) == scenarios[i].expected_result);
         }
index 13ff8add5da3e970de3d0d0458b7e249e2722be1..fe78216b781b37fc18157701a61800a39bb76419 100644 (file)
@@ -28,7 +28,7 @@ int main(int argc, char *argv[]) {
                 return EXIT_FAILURE;
         }
 
-        r = dissect_image(d->fd, NULL, 0, NULL, DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_RELAX_VAR_CHECK, &m);
+        r = dissect_image(d->fd, NULL, 0, NULL, NULL, DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_RELAX_VAR_CHECK, &m);
         if (r < 0) {
                 log_error_errno(r, "Failed to dissect image: %m");
                 return EXIT_FAILURE;
index 8d9a1974b24de4c1b65948a51e5505ca0b83fa8d..dfea70ca27390a4bcfa504f1d695ef8c2db2a175 100644 (file)
@@ -864,14 +864,17 @@ static void test_path_is_encrypted_one(const char *p, int expect) {
 }
 
 static void test_path_is_encrypted(void) {
-        log_info("/* %s */", __func__);
+        int booted = sd_booted(); /* If this is run in build environments such as koji, /dev might be a
+                                   * reguar fs. Don't assume too much if not running under systemd. */
+
+        log_info("/* %s (sd_booted=%d)*/", __func__, booted);
 
         test_path_is_encrypted_one("/home", -1);
         test_path_is_encrypted_one("/var", -1);
         test_path_is_encrypted_one("/", -1);
         test_path_is_encrypted_one("/proc", false);
         test_path_is_encrypted_one("/sys", false);
-        test_path_is_encrypted_one("/dev", false);
+        test_path_is_encrypted_one("/dev", booted > 0 ? false : -1);
 }
 
 int main(int argc, char *argv[]) {
index 24e0496d46b415d8433bf02eadd135287b2ef211..ca5361adb9d599f45abd0c059998c1a2c73ffa1c 100644 (file)
@@ -12,11 +12,14 @@ int main(int argc, const char *argv[]) {
                 LIST_FIELDS(struct list_item, item);
         } list_item;
         LIST_HEAD(list_item, head);
+        LIST_HEAD(list_item, head2);
         list_item items[4];
         list_item *cursor;
 
         LIST_HEAD_INIT(head);
+        LIST_HEAD_INIT(head2);
         assert_se(head == NULL);
+        assert_se(head2 == NULL);
 
         for (i = 0; i < ELEMENTSOF(items); i++) {
                 LIST_INIT(item, &items[i]);
@@ -203,5 +206,49 @@ int main(int argc, const char *argv[]) {
 
         assert_se(head == NULL);
 
+        for (i = 0; i < ELEMENTSOF(items) / 2; i++) {
+                LIST_INIT(item, &items[i]);
+                assert_se(LIST_JUST_US(item, &items[i]));
+                LIST_PREPEND(item, head, &items[i]);
+        }
+
+        for (i = ELEMENTSOF(items) / 2; i < ELEMENTSOF(items); i++) {
+                LIST_INIT(item, &items[i]);
+                assert_se(LIST_JUST_US(item, &items[i]));
+                LIST_PREPEND(item, head2, &items[i]);
+        }
+
+        assert_se(items[0].item_next == NULL);
+        assert_se(items[1].item_next == &items[0]);
+        assert_se(items[2].item_next == NULL);
+        assert_se(items[3].item_next == &items[2]);
+
+        assert_se(items[0].item_prev == &items[1]);
+        assert_se(items[1].item_prev == NULL);
+        assert_se(items[2].item_prev == &items[3]);
+        assert_se(items[3].item_prev == NULL);
+
+        LIST_JOIN(item, head2, head);
+        assert_se(head == NULL);
+
+        assert_se(items[0].item_next == NULL);
+        assert_se(items[1].item_next == &items[0]);
+        assert_se(items[2].item_next == &items[1]);
+        assert_se(items[3].item_next == &items[2]);
+
+        assert_se(items[0].item_prev == &items[1]);
+        assert_se(items[1].item_prev == &items[2]);
+        assert_se(items[2].item_prev == &items[3]);
+        assert_se(items[3].item_prev == NULL);
+
+        LIST_JOIN(item, head, head2);
+        assert_se(head2 == NULL);
+        assert_se(!LIST_IS_EMPTY(head));
+
+        for (i = 0; i < ELEMENTSOF(items); i++)
+                LIST_REMOVE(item, head, &items[i]);
+
+        assert_se(head == NULL);
+
         return 0;
 }
index a7ad4828370f4444d784732dcf761d58182b7c42..95021ee7bf7260c597f401f6d24f9e61fd05c9a1 100644 (file)
@@ -150,6 +150,7 @@ static void test_protect_kernel_logs(void) {
                 assert_se(fd > 0);
 
                 r = setup_namespace(NULL,
+                                    NULL,
                                     NULL,
                                     &ns_info,
                                     NULL,
index cbc41b7a385ef57a115f46207effc0dbb17d60f7..ced287dd6e06d83a1b63d869ac8690ac35f9571c 100644 (file)
@@ -62,6 +62,7 @@ int main(int argc, char *argv[]) {
                 log_info("Not chrooted");
 
         r = setup_namespace(root_directory,
+                            NULL,
                             NULL,
                             &ns_info,
                             (char **) writable,
index 0d29fcfad25baa8cb6d755f717040e4aaa99feaf..268c54fccc78ab54cc81cc52e5331135c63b3390 100644 (file)
@@ -7,6 +7,8 @@
 #include "strv.h"
 
 static void test_set_steal_first(void) {
+        log_info("/* %s */", __func__);
+
         _cleanup_ordered_set_free_ OrderedSet *m = NULL;
         int seen[3] = {};
         char *val;
@@ -42,12 +44,18 @@ DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(item_hash_ops, void, trivial_hash_
 static void test_set_free_with_hash_ops(void) {
         OrderedSet *m;
         struct Item items[4] = {};
-        unsigned i;
+
+        log_info("/* %s */", __func__);
 
         assert_se(m = ordered_set_new(&item_hash_ops));
-        for (i = 0; i < ELEMENTSOF(items) - 1; i++)
+
+        for (size_t i = 0; i < ELEMENTSOF(items) - 1; i++)
                 assert_se(ordered_set_put(m, items + i) == 1);
 
+        for (size_t i = 0; i < ELEMENTSOF(items) - 1; i++)
+                assert_se(ordered_set_put(m, items + i) == 0);  /* We get 0 here, because we use trivial hash
+                                                                 * ops. Also see below... */
+
         m = ordered_set_free(m);
         assert_se(items[0].seen == 1);
         assert_se(items[1].seen == 1);
@@ -57,7 +65,9 @@ static void test_set_free_with_hash_ops(void) {
 
 static void test_set_put(void) {
         _cleanup_ordered_set_free_ OrderedSet *m = NULL;
-        _cleanup_free_ char **t = NULL;
+        _cleanup_free_ char **t = NULL, *str = NULL;
+
+        log_info("/* %s */", __func__);
 
         m = ordered_set_new(&string_hash_ops);
         assert_se(m);
@@ -71,6 +81,10 @@ static void test_set_put(void) {
         assert_se(ordered_set_put(m, (void*) "333") == 0);
         assert_se(ordered_set_put(m, (void*) "22") == 0);
 
+        assert_se(str = strdup("333"));
+        assert_se(ordered_set_put(m, str) == -EEXIST); /* ... and we get -EEXIST here, because we use
+                                                        * non-trivial hash ops. */
+
         assert_se(t = ordered_set_get_strv(m));
         assert_se(streq(t[0], "1"));
         assert_se(streq(t[1], "22"));
@@ -86,6 +100,8 @@ static void test_set_put_string_set(void) {
         _cleanup_free_ char **final = NULL; /* "just free" because the strings are in the set */
         void *t;
 
+        log_info("/* %s */", __func__);
+
         m = ordered_set_new(&string_hash_ops);
         assert_se(m);
 
index e8844fd5ef4fc1178e92d269cdb9252f55192ac3..1075f31bc6c720c7b55ebdbee3217b4a63b9bf0f 100644 (file)
@@ -79,21 +79,15 @@ static Service *service_for_path(Manager *m, Path *path, const char *service_nam
 }
 
 static void check_states(Manager *m, Path *path, Service *service, PathState path_state, ServiceState service_state) {
-        usec_t ts;
-        usec_t timeout = 2 * USEC_PER_SEC;
-
         assert_se(m);
         assert_se(service);
 
-        ts = now(CLOCK_MONOTONIC);
+        usec_t end = now(CLOCK_MONOTONIC) + 30 * USEC_PER_SEC;
 
         while (path->result != PATH_SUCCESS || service->result != SERVICE_SUCCESS ||
                path->state != path_state || service->state != service_state) {
-                usec_t n;
-                int r;
 
-                r = sd_event_run(m->event, 100 * USEC_PER_MSEC);
-                assert_se(r >= 0);
+                assert_se(sd_event_run(m->event, 100 * USEC_PER_MSEC) >= 0);
 
                 printf("%s: state = %s; result = %s \n",
                                 UNIT(path)->id,
@@ -104,8 +98,7 @@ static void check_states(Manager *m, Path *path, Service *service, PathState pat
                                 service_state_to_string(service->state),
                                 service_result_to_string(service->result));
 
-                n = now(CLOCK_MONOTONIC);
-                if (ts + timeout < n) {
+                if (now(CLOCK_MONOTONIC) >= end) {
                         log_error("Test timeout when testing %s", UNIT(path)->id);
                         exit(EXIT_FAILURE);
                 }
index 2e63aace0201ab696fb5ba04af384dd2f6459d2a..8b4fa82640b443f660c149609fbd843c72f69828 100644 (file)
@@ -7,6 +7,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include "efivars.h"
 #include "errno-util.h"
 #include "fd-util.h"
 #include "log.h"
@@ -84,7 +85,9 @@ static void test_sleep(void) {
 
         log_info("/* %s */", __func__);
 
-        log_info("/= configuration =/");
+        printf("Secure boot: %sd\n", enable_disable(is_efi_secure_boot()));
+
+        log_info("/= individual sleep modes =/");
         log_info("Standby configured: %s", yes_no(can_sleep_state(standby) > 0));
         log_info("Suspend configured: %s", yes_no(can_sleep_state(mem) > 0));
         log_info("Hibernate configured: %s", yes_no(can_sleep_state(disk) > 0));
@@ -94,7 +97,7 @@ static void test_sleep(void) {
         log_info("Hibernate+Shutdown configured: %s", yes_no(can_sleep_disk(shutdown) > 0));
         log_info("Freeze configured: %s", yes_no(can_sleep_state(freeze) > 0));
 
-        log_info("/= running system =/");
+        log_info("/= high-level sleep verbs =/");
         r = can_sleep("suspend");
         log_info("Suspend configured and possible: %s", r >= 0 ? yes_no(r) : strerror_safe(r));
         r = can_sleep("hibernate");
index 26d3e203530ae4e2e0476ddf0b90c8374371566c..7afc37d9e338c81a87e5c817f095f7374ba7542f 100644 (file)
@@ -409,7 +409,7 @@ static int print_ntp_status_info(NTPStatusInfo *i) {
         if (r < 0)
                 return table_log_add_error(r);
 
-        r = table_add_cell_stringf(table, NULL, "%s (%s)", i->server_address, i->server_name);
+        r = table_add_cell_stringf(table, NULL, "%s (%s)", strna(i->server_address), strna(i->server_name));
         if (r < 0)
                 return table_log_add_error(r);
 
index dadf213a809ff741fe18eb05031c09d55be3ed83..637a3b81c6aa3fddfacf68c9047a2b778ff8cfeb 100644 (file)
@@ -137,11 +137,10 @@ static int manager_send_request(Manager *m) {
         }
 
         /* re-arm timer with increasing timeout, in case the packets never arrive back */
-        if (m->retry_interval > 0) {
-                if (m->retry_interval < m->poll_interval_max_usec)
-                        m->retry_interval *= 2;
-        } else
-                m->retry_interval = m->poll_interval_min_usec;
+        if (m->retry_interval == 0)
+                m->retry_interval = NTP_RETRY_INTERVAL_MIN_USEC;
+        else
+                m->retry_interval = MIN(m->retry_interval * 4/3, NTP_RETRY_INTERVAL_MAX_USEC);
 
         r = manager_arm_timer(m, m->retry_interval);
         if (r < 0)
@@ -181,18 +180,18 @@ static int manager_arm_timer(Manager *m, usec_t next) {
         }
 
         if (m->event_timer) {
-                r = sd_event_source_set_time(m->event_timer, now(clock_boottime_or_monotonic()) + next);
+                r = sd_event_source_set_time_relative(m->event_timer, next);
                 if (r < 0)
                         return r;
 
                 return sd_event_source_set_enabled(m->event_timer, SD_EVENT_ONESHOT);
         }
 
-        return sd_event_add_time(
+        return sd_event_add_time_relative(
                         m->event,
                         &m->event_timer,
                         clock_boottime_or_monotonic(),
-                        now(clock_boottime_or_monotonic()) + next, 0,
+                        next, 0,
                         manager_timer, m);
 }
 
@@ -787,7 +786,7 @@ int manager_connect(Manager *m) {
         if (!ratelimit_below(&m->ratelimit)) {
                 log_debug("Delaying attempts to contact servers.");
 
-                r = sd_event_add_time(m->event, &m->event_retry, clock_boottime_or_monotonic(), now(clock_boottime_or_monotonic()) + RETRY_USEC, 0, manager_retry_connect, m);
+                r = sd_event_add_time_relative(m->event, &m->event_retry, clock_boottime_or_monotonic(), RETRY_USEC, 0, manager_retry_connect, m);
                 if (r < 0)
                         return log_error_errno(r, "Failed to create retry timer: %m");
 
@@ -841,7 +840,7 @@ int manager_connect(Manager *m) {
 
                         if (restart && !m->exhausted_servers && m->poll_interval_usec) {
                                 log_debug("Waiting after exhausting servers.");
-                                r = sd_event_add_time(m->event, &m->event_retry, clock_boottime_or_monotonic(), now(clock_boottime_or_monotonic()) + m->poll_interval_usec, 0, manager_retry_connect, m);
+                                r = sd_event_add_time_relative(m->event, &m->event_retry, clock_boottime_or_monotonic(), m->poll_interval_usec, 0, manager_retry_connect, m);
                                 if (r < 0)
                                         return log_error_errno(r, "Failed to create retry timer: %m");
 
index 97c4e2ff34d90f65b0b2e1392311151bdd491cea..d74521c9cf59a64abeca0031bb12c20979eed71b 100644 (file)
@@ -24,6 +24,9 @@ typedef struct Manager Manager;
 #define NTP_POLL_INTERVAL_MIN_USEC      (32 * USEC_PER_SEC)
 #define NTP_POLL_INTERVAL_MAX_USEC      (2048 * USEC_PER_SEC)
 
+#define NTP_RETRY_INTERVAL_MIN_USEC     (15 * USEC_PER_SEC)
+#define NTP_RETRY_INTERVAL_MAX_USEC     (6 * 60 * USEC_PER_SEC) /* 6 minutes */
+
 struct Manager {
         sd_bus *bus;
         sd_event *event;
index 1e51f22e26035c41b0873e9a314c1488d430f004..dafe3da2511b39ac55f701160277a3614f3adba6 100644 (file)
@@ -392,9 +392,10 @@ int udev_ctrl_wait(struct udev_ctrl *uctrl, usec_t timeout) {
         (void) sd_event_source_set_description(source_io, "udev-ctrl-wait-io");
 
         if (timeout != USEC_INFINITY) {
-                r = sd_event_add_time(uctrl->event, &source_timeout, clock_boottime_or_monotonic(),
-                                      usec_add(now(clock_boottime_or_monotonic()), timeout),
-                                      0, NULL, INT_TO_PTR(-ETIMEDOUT));
+                r = sd_event_add_time_relative(
+                                uctrl->event, &source_timeout, clock_boottime_or_monotonic(),
+                                timeout,
+                                0, NULL, INT_TO_PTR(-ETIMEDOUT));
                 if (r < 0)
                         return r;
 
index 7eec84abd5d8e2485f36a8e0a7e7ccc157af8cf1..ae6d8caf54e02c39c4b5f4245b5523cc9713eb97 100644 (file)
@@ -100,7 +100,7 @@ static int print_all_attributes(sd_device *device, bool is_parent) {
 
                 /* skip nonprintable attributes */
                 len = strlen(value);
-                while (len > 0 && isprint(value[len-1]))
+                while (len > 0 && isprint((unsigned char) value[len-1]))
                         len--;
                 if (len > 0)
                         continue;
index f3236dedfab75c3b865d121fc923130967e11150..8c7c7046e71e5a1e1d589e5722161937ccd673b9 100644 (file)
@@ -251,7 +251,6 @@ static int on_event_timeout_warning(sd_event_source *s, uint64_t usec, void *use
 
 static void worker_attach_event(struct worker *worker, struct event *event) {
         sd_event *e;
-        uint64_t usec;
 
         assert(worker);
         assert(worker->manager);
@@ -266,13 +265,13 @@ static void worker_attach_event(struct worker *worker, struct event *event) {
 
         e = worker->manager->event;
 
-        assert_se(sd_event_now(e, CLOCK_MONOTONIC, &usec) >= 0);
+        (void) sd_event_add_time_relative(e, &event->timeout_warning_event, CLOCK_MONOTONIC,
+                                          udev_warn_timeout(arg_event_timeout_usec), USEC_PER_SEC,
+                                          on_event_timeout_warning, event);
 
-        (void) sd_event_add_time(e, &event->timeout_warning_event, CLOCK_MONOTONIC,
-                                 usec + udev_warn_timeout(arg_event_timeout_usec), USEC_PER_SEC, on_event_timeout_warning, event);
-
-        (void) sd_event_add_time(e, &event->timeout_event, CLOCK_MONOTONIC,
-                                 usec + arg_event_timeout_usec, USEC_PER_SEC, on_event_timeout, event);
+        (void) sd_event_add_time_relative(e, &event->timeout_event, CLOCK_MONOTONIC,
+                                          arg_event_timeout_usec, USEC_PER_SEC,
+                                          on_event_timeout, event);
 }
 
 static void manager_clear_for_worker(Manager *manager) {
index 7204fdb00b1a4d58018284b609b49a240c0324e4..34c7ab3f7de6082c1f04ac37ddfbea541925ffd5 100644 (file)
@@ -104,19 +104,19 @@ Ubuntu CI
 New PR submitted to the project are run through regression tests, and one set
 of those is the 'autopkgtest' runs for several different architectures, called
 'Ubuntu CI'.  Part of that testing is to run all these tests.  Sometimes these
-tests are temporarily blacklisted from running in the 'autopkgtest' tests while
+tests are temporarily deny-listed from running in the 'autopkgtest' tests while
 debugging a flaky test; that is done by creating a file in the test directory
-named 'blacklist-ubuntu-ci', for example to prevent the TEST-01-BASIC test from
+named 'deny-list-ubuntu-ci', for example to prevent the TEST-01-BASIC test from
 running in the 'autopkgtest' runs, create the file
-'TEST-01-BASIC/blacklist-ubuntu-ci'.
+'TEST-01-BASIC/deny-list-ubuntu-ci'.
 
-The tests may be disabled only for specific archs, by creating a blacklist file
+The tests may be disabled only for specific archs, by creating a deny-list file
 with the arch name at the end, e.g.
-'TEST-01-BASIC/blacklist-ubuntu-ci-arm64' to disable the TEST-01-BASIC test
+'TEST-01-BASIC/deny-list-ubuntu-ci-arm64' to disable the TEST-01-BASIC test
 only on test runs for the 'arm64' architecture.
 
 Note the arch naming is not from 'uname -m', it is Debian arch names:
 https://wiki.debian.org/ArchitectureSpecificsMemo
 
-For PRs that fix a currently blacklisted test, the PR should include removal
-of the blacklist file.
+For PRs that fix a currently deny-listed test, the PR should include removal
+of the deny-list file.
index 2992beaa0b88213775bce9618860d3d7be42e132..3b37f7eaa626bb4e4c8bfff1c9934626cb3923f4 100755 (executable)
@@ -22,8 +22,9 @@ preprocess() {
     # see meson.build how to extract this. gcc -E was used before to
     # get this value from config.h, however the autopkgtest fails with
     # it
-    SYSTEM_UID_MAX=$(awk 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }' /etc/login.defs)
-    SYSTEM_GID_MAX=$(awk 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }' /etc/login.defs)
+    [[ -e /etc/login.defs ]] && login_defs_file="/etc/login.defs" || login_defs_file="/usr/etc/login.defs"
+    SYSTEM_UID_MAX=$(awk 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }' $login_defs_file)
+    SYSTEM_GID_MAX=$(awk 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }' $login_defs_file)
 
     # we can't rely on config.h to get the nologin path, as autopkgtest
     # uses pre-compiled binaries, so extract it from the systemd-sysusers
index 3882658053854cf426a4b01b0f60de571cc0c701..00f51479f40c4048b05a1c025f262d22ee1efd4e 100755 (executable)
@@ -34,6 +34,7 @@ test_create_image() {
         BASICTOOLS=(
             bash
             cat
+            mount
         )
         oldinitdir=$initdir
         export initdir=$TESTDIR/minimal
index 08fb5d4aa6d75aa24a88f799901282c53f6c743b..3ff14b5fd348c2ff70c1e91c2c39fef5665ceb14 100755 (executable)
@@ -9,6 +9,16 @@ mkdir -p "$root"
 mkdir "$root/bin"
 cp $(type -P busybox) "$root/bin"
 
+ID_LIKE=$(awk -F= '$1=="ID_LIKE" { print $2 ;}' /etc/os-release)
+if [[ "$ID_LIKE" = *"suse"* ]]; then
+    mkdir -p "$root/lib"
+    mkdir -p "$root/lib64"
+    for lib in $(find /lib*/ld*); do
+        [[ -d $root/$(dirname $lib) ]] || mkdir -p $root/$(dirname $lib)
+        cp $lib $root/$lib
+    done
+fi
+
 mkdir -p "$root/usr/lib"
 touch "$root/usr/lib/os-release"
 
index aa04c1192a3015f0834b3ea5c984b827811489a3..5d804707197f48fd0c47f087c57adde27ea90b9d 100644 (file)
@@ -130,10 +130,12 @@ SendOption=
 RequestOptions=
 UserClass=
 VendorClass=
-AssignAcquiredDelegatedPrefixAddress=
-AssignAcquiredDelegatedPrefixToken=
 SendVendorOption=
 RouteMetric=
+[DHCPv6PrefixDelegation]
+SubnetId=
+Assign=
+Token=
 [Route]
 Destination=
 Protocol=
@@ -203,7 +205,6 @@ NTP=
 DHCP=
 Domains=
 IPv6PrefixDelegation=
-IPv6PDSubnetId=
 VLAN=
 DHCPServer=
 BindCarrier=
diff --git a/test/test-network/conf/25-prefix-route-with-vrf.network b/test/test-network/conf/25-prefix-route-with-vrf.network
new file mode 100644 (file)
index 0000000..fdc1e11
--- /dev/null
@@ -0,0 +1,26 @@
+[Match]
+Name=dummy98
+
+[Network]
+IPv6AcceptRA=no
+VRF=vrf99
+Address=fdde:11:22::1/128
+Address=fdde:11:33::1/64
+Address=10.20.22.1/32
+Address=10.20.33.1/24
+
+[Address]
+Address=fdde:11:44::1/128
+AddPrefixRoute=no
+
+[Address]
+Address=fdde:11:55::1/64
+AddPrefixRoute=no
+
+[Address]
+Address=10.20.44.1/32
+AddPrefixRoute=no
+
+[Address]
+Address=10.20.55.1/24
+AddPrefixRoute=no
diff --git a/test/test-network/conf/25-prefix-route-without-vrf.network b/test/test-network/conf/25-prefix-route-without-vrf.network
new file mode 100644 (file)
index 0000000..9354b55
--- /dev/null
@@ -0,0 +1,25 @@
+[Match]
+Name=test1
+
+[Network]
+IPv6AcceptRA=no
+Address=fdde:12:22::1/128
+Address=fdde:12:33::1/64
+Address=10.21.22.1/32
+Address=10.21.33.1/24
+
+[Address]
+Address=fdde:12:44::1/128
+AddPrefixRoute=no
+
+[Address]
+Address=fdde:12:55::1/64
+AddPrefixRoute=no
+
+[Address]
+Address=10.21.44.1/32
+AddPrefixRoute=no
+
+[Address]
+Address=10.21.55.1/24
+AddPrefixRoute=no
index 49c6f31e77e66af5ef96ddd65384a2fbbebae613..18fecb880280c3bf402731478388605e12a79e9d 100644 (file)
@@ -4,4 +4,6 @@ Name=veth99
 [Network]
 IPv6AcceptRA=true
 IPv6Token=::1a:2b:3c:4d
+IPv6Token=::1a:2b:3c:4d
+IPv6Token=::1a:2b:3c:4d
 IPv6Token=::fa:de:ca:fe
index 677e39765e143e60a3d1f6e5f0c179ae739f67d6..0ca1fb3bf93e303d541c1946ac2f7931cf03891d 100755 (executable)
@@ -1717,6 +1717,8 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
         '25-qdisc-ingress-netem-compat.network',
         '25-qdisc-pie.network',
         '25-qdisc-qfq.network',
+        '25-prefix-route-with-vrf.network',
+        '25-prefix-route-without-vrf.network',
         '25-route-ipv6-src.network',
         '25-route-static.network',
         '25-route-vrf.network',
@@ -1729,6 +1731,7 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
         '25-veth-peer.network',
         '25-veth.netdev',
         '25-vrf.netdev',
+        '25-vrf.network',
         '26-link-local-addressing-ipv6.network',
         'routing-policy-rule-dummy98.network',
         'routing-policy-rule-test1.network']
@@ -1815,6 +1818,77 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
         print(output)
         self.assertNotRegex(output, '192.168.100.10/24')
 
+    @expectedFailureIfModuleIsNotAvailable('vrf')
+    def test_prefix_route(self):
+        copy_unit_to_networkd_unit_path('25-prefix-route-with-vrf.network', '12-dummy.netdev',
+                                        '25-prefix-route-without-vrf.network', '11-dummy.netdev',
+                                        '25-vrf.netdev', '25-vrf.network')
+        for trial in range(2):
+            if trial == 0:
+                start_networkd()
+            else:
+                restart_networkd(3)
+
+            self.wait_online(['dummy98:routable', 'test1:routable', 'vrf99:carrier'])
+
+            output = check_output('ip route show table 42 dev dummy98')
+            print('### ip route show table 42 dev dummy98')
+            print(output)
+            self.assertRegex(output, 'local 10.20.22.1 proto kernel scope host src 10.20.22.1')
+            self.assertRegex(output, 'broadcast 10.20.33.0 proto kernel scope link src 10.20.33.1')
+            self.assertRegex(output, '10.20.33.0/24 proto kernel scope link src 10.20.33.1')
+            self.assertRegex(output, 'local 10.20.33.1 proto kernel scope host src 10.20.33.1')
+            self.assertRegex(output, 'broadcast 10.20.33.255 proto kernel scope link src 10.20.33.1')
+            self.assertRegex(output, 'local 10.20.44.1 proto kernel scope host src 10.20.44.1')
+            self.assertRegex(output, 'broadcast 10.20.55.0 proto kernel scope link src 10.20.55.1')
+            self.assertRegex(output, 'local 10.20.55.1 proto kernel scope host src 10.20.55.1')
+            self.assertRegex(output, 'broadcast 10.20.55.255 proto kernel scope link src 10.20.55.1')
+            output = check_output('ip -6 route show table 42 dev dummy98')
+            print('### ip -6 route show table 42 dev dummy98')
+            print(output)
+            if trial == 0:
+                # Kernel's bug?
+                self.assertRegex(output, 'local fdde:11:22::1 proto kernel metric 0 pref medium')
+            #self.assertRegex(output, 'fdde:11:22::1 proto kernel metric 256 pref medium')
+            self.assertRegex(output, 'local fdde:11:33::1 proto kernel metric 0 pref medium')
+            self.assertRegex(output, 'fdde:11:33::/64 proto kernel metric 256 pref medium')
+            self.assertRegex(output, 'local fdde:11:44::1 proto kernel metric 0 pref medium')
+            self.assertRegex(output, 'local fdde:11:55::1 proto kernel metric 0 pref medium')
+            self.assertRegex(output, 'fe80::/64 proto kernel metric 256 pref medium')
+            self.assertRegex(output, 'ff00::/8 metric 256 pref medium')
+
+            print()
+
+            output = check_output('ip route show dev test1')
+            print('### ip route show dev test1')
+            print(output)
+            self.assertRegex(output, '10.21.33.0/24 proto kernel scope link src 10.21.33.1')
+            output = check_output('ip route show table local dev test1')
+            print('### ip route show table local dev test1')
+            print(output)
+            self.assertRegex(output, 'local 10.21.22.1 proto kernel scope host src 10.21.22.1')
+            self.assertRegex(output, 'broadcast 10.21.33.0 proto kernel scope link src 10.21.33.1')
+            self.assertRegex(output, 'local 10.21.33.1 proto kernel scope host src 10.21.33.1')
+            self.assertRegex(output, 'broadcast 10.21.33.255 proto kernel scope link src 10.21.33.1')
+            self.assertRegex(output, 'local 10.21.44.1 proto kernel scope host src 10.21.44.1')
+            self.assertRegex(output, 'broadcast 10.21.55.0 proto kernel scope link src 10.21.55.1')
+            self.assertRegex(output, 'local 10.21.55.1 proto kernel scope host src 10.21.55.1')
+            self.assertRegex(output, 'broadcast 10.21.55.255 proto kernel scope link src 10.21.55.1')
+            output = check_output('ip -6 route show dev test1')
+            print('### ip -6 route show dev test1')
+            print(output)
+            self.assertRegex(output, 'fdde:12:22::1 proto kernel metric 256 pref medium')
+            self.assertRegex(output, 'fdde:12:33::/64 proto kernel metric 256 pref medium')
+            self.assertRegex(output, 'fe80::/64 proto kernel metric 256 pref medium')
+            output = check_output('ip -6 route show table local dev test1')
+            print('### ip -6 route show table local dev test1')
+            print(output)
+            self.assertRegex(output, 'local fdde:12:22::1 proto kernel metric 0 pref medium')
+            self.assertRegex(output, 'local fdde:12:33::1 proto kernel metric 0 pref medium')
+            self.assertRegex(output, 'local fdde:12:44::1 proto kernel metric 0 pref medium')
+            self.assertRegex(output, 'local fdde:12:55::1 proto kernel metric 0 pref medium')
+            self.assertRegex(output, 'ff00::/8 metric 256 pref medium')
+
     def test_configure_without_carrier(self):
         copy_unit_to_networkd_unit_path('11-dummy.netdev')
         start_networkd()
@@ -2592,7 +2666,9 @@ class NetworkdStateFileTests(unittest.TestCase, Utilities):
 
         path = os.path.join('/run/systemd/netif/links/', ifindex)
         self.assertTrue(os.path.exists(path))
-        time.sleep(2)
+
+        # make link state file updated
+        check_output(*resolvectl_cmd, 'revert', 'dummy98', env=env)
 
         with open(path) as f:
             data = f.read()
@@ -2616,7 +2692,6 @@ class NetworkdStateFileTests(unittest.TestCase, Utilities):
         check_output(*resolvectl_cmd, 'mdns', 'dummy98', 'no', env=env)
         check_output(*resolvectl_cmd, 'dnssec', 'dummy98', 'yes', env=env)
         check_output(*timedatectl_cmd, 'ntp-servers', 'dummy98', '2.fedora.pool.ntp.org', '3.fedora.pool.ntp.org', env=env)
-        time.sleep(2)
 
         with open(path) as f:
             data = f.read()
@@ -2629,7 +2704,6 @@ class NetworkdStateFileTests(unittest.TestCase, Utilities):
             self.assertRegex(data, r'DNSSEC=yes')
 
         check_output(*timedatectl_cmd, 'revert', 'dummy98', env=env)
-        time.sleep(2)
 
         with open(path) as f:
             data = f.read()
@@ -2642,7 +2716,6 @@ class NetworkdStateFileTests(unittest.TestCase, Utilities):
             self.assertRegex(data, r'DNSSEC=yes')
 
         check_output(*resolvectl_cmd, 'revert', 'dummy98', env=env)
-        time.sleep(2)
 
         with open(path) as f:
             data = f.read()
index 0ad75ac8b0576a7b6fa3beb0622c20fe196d433f..d2dba0751bc0636e6321273bc2c716f32f0ac80b 100755 (executable)
@@ -31,13 +31,19 @@ if unshare -U sh -c :; then
     is_user_ns_supported=yes
 fi
 
+SUSE_OPTS=""
+ID_LIKE=$(awk -F= '$1=="ID_LIKE" { print $2 ;}' /etc/os-release)
+if [[ "$ID_LIKE" = *"suse"* ]]; then
+    SUSE_OPTS="--bind /lib64 --bind /usr/lib64 "
+fi
+
 function check_bind_tmp_path {
     # https://github.com/systemd/systemd/issues/4789
     local _root="/var/lib/machines/testsuite-13.bind-tmp-path"
     rm -rf "$_root"
     /usr/lib/systemd/tests/testdata/create-busybox-container "$_root"
     >/tmp/bind
-    systemd-nspawn --register=no -D "$_root" --bind=/tmp/bind /bin/sh -c 'test -e /tmp/bind'
+    systemd-nspawn $SUSE_OPTS--register=no -D "$_root" --bind=/tmp/bind /bin/sh -c 'test -e /tmp/bind'
 }
 
 function check_norbind {
@@ -49,15 +55,15 @@ function check_norbind {
     mount -t tmpfs tmpfs /tmp/binddir/subdir
     echo -n "inner" > /tmp/binddir/subdir/file
     /usr/lib/systemd/tests/testdata/create-busybox-container "$_root"
-    systemd-nspawn --register=no -D "$_root" --bind=/tmp/binddir:/mnt:norbind /bin/sh -c 'CONTENT=$(cat /mnt/subdir/file); if [[ $CONTENT != "outer" ]]; then echo "*** unexpected content: $CONTENT"; return 1; fi'
+    systemd-nspawn $SUSE_OPTS--register=no -D "$_root" --bind=/tmp/binddir:/mnt:norbind /bin/sh -c 'CONTENT=$(cat /mnt/subdir/file); if [[ $CONTENT != "outer" ]]; then echo "*** unexpected content: $CONTENT"; return 1; fi'
 }
 
 function check_notification_socket {
     # https://github.com/systemd/systemd/issues/4944
     local _cmd='echo a | $(busybox which nc) -U -u -w 1 /run/systemd/nspawn/notify'
     # /testsuite-13.nc-container is prepared by test.sh
-    systemd-nspawn --register=no -D /testsuite-13.nc-container /bin/sh -x -c "$_cmd"
-    systemd-nspawn --register=no -D /testsuite-13.nc-container -U /bin/sh -x -c "$_cmd"
+    systemd-nspawn $SUSE_OPTS--register=no -D /testsuite-13.nc-container /bin/sh -x -c "$_cmd"
+    systemd-nspawn $SUSE_OPTS--register=no -D /testsuite-13.nc-container -U /bin/sh -x -c "$_cmd"
 }
 
 function check_os_release {
@@ -66,12 +72,25 @@ if [ -n "${ID:+set}" ] && [ "${ID}" != "${container_host_id}" ]; then exit 1; fi
 if [ -n "${VERSION_ID:+set}" ] && [ "${VERSION_ID}" != "${container_host_version_id}" ]; then exit 1; fi
 if [ -n "${BUILD_ID:+set}" ] && [ "${BUILD_ID}" != "${container_host_build_id}" ]; then exit 1; fi
 if [ -n "${VARIANT_ID:+set}" ] && [ "${VARIANT_ID}" != "${container_host_variant_id}" ]; then exit 1; fi
-cd /tmp; (cd /run/host/usr/lib; md5sum os-release) | md5sum -c
-if echo test >> /run/host/usr/lib/os-release; then exit 1; fi
-if echo test >> /run/host/etc/os-release; then exit 1; fi
+cd /tmp; (cd /run/host; md5sum os-release) | md5sum -c
+if echo test >> /run/host/os-release; then exit 1; fi
 '
 
-    systemd-nspawn --register=no -D /testsuite-13.nc-container --bind=/etc/os-release:/tmp/os-release /bin/sh -x -e -c "$_cmd"
+    local _os_release_source="/etc/os-release"
+    if [ ! -r "${_os_release_source}" ]; then
+        _os_release_source="/usr/lib/os-release"
+    elif [ -L "${_os_release_source}" ] && rm /etc/os-release; then
+        # Ensure that /etc always wins if available
+        cp /usr/lib/os-release /etc
+        echo MARKER=1 >> /etc/os-release
+    fi
+
+    systemd-nspawn $SUSE_OPTS--register=no -D /testsuite-13.nc-container --bind="${_os_release_source}":/tmp/os-release /bin/sh -x -e -c "$_cmd"
+
+    if grep -q MARKER /etc/os-release; then
+        rm /etc/os-release
+        ln -s ../usr/lib/os-release /etc/os-release
+    fi
 }
 
 function run {
@@ -87,16 +106,16 @@ function run {
     local _root="/var/lib/machines/testsuite-13.unified-$1-cgns-$2-api-vfs-writable-$3"
     rm -rf "$_root"
     /usr/lib/systemd/tests/testdata/create-busybox-container "$_root"
-    SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" -b
-    SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" --private-network -b
+    SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" -b
+    SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" --private-network -b
 
-    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" -U -b; then
+    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" -U -b; then
         [[ "$is_user_ns_supported" = "yes" && "$3" = "network" ]] && return 1
     else
         [[ "$is_user_ns_supported" = "no" && "$3" = "network" ]] && return 1
     fi
 
-    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" --private-network -U -b; then
+    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" --private-network -U -b; then
         [[ "$is_user_ns_supported" = "yes" && "$3" = "yes" ]] && return 1
     else
         [[ "$is_user_ns_supported" = "no" && "$3" = "yes" ]] && return 1
@@ -105,43 +124,43 @@ function run {
     local _netns_opt="--network-namespace-path=/proc/self/ns/net"
 
     # --network-namespace-path and network-related options cannot be used together
-    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" "$_netns_opt" --network-interface=lo -b; then
+    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" "$_netns_opt" --network-interface=lo -b; then
         return 1
     fi
 
-    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" "$_netns_opt" --network-macvlan=lo -b; then
+    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" "$_netns_opt" --network-macvlan=lo -b; then
         return 1
     fi
 
-    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" "$_netns_opt" --network-ipvlan=lo -b; then
+    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" "$_netns_opt" --network-ipvlan=lo -b; then
         return 1
     fi
 
-    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" "$_netns_opt" --network-veth -b; then
+    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" "$_netns_opt" --network-veth -b; then
         return 1
     fi
 
-    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" "$_netns_opt" --network-veth-extra=lo -b; then
+    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" "$_netns_opt" --network-veth-extra=lo -b; then
         return 1
     fi
 
-    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" "$_netns_opt" --network-bridge=lo -b; then
+    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" "$_netns_opt" --network-bridge=lo -b; then
         return 1
     fi
 
-    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" "$_netns_opt" --network-zone=zone -b; then
+    if SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" "$_netns_opt" --network-zone=zone -b; then
         return 1
     fi
 
     # allow combination of --network-namespace-path and --private-network
-    if ! SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" "$_netns_opt" --private-network -b; then
+    if ! SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" "$_netns_opt" --private-network -b; then
         return 1
     fi
 
     # test --network-namespace-path works with a network namespace created by "ip netns"
     ip netns add nspawn_test
     _netns_opt="--network-namespace-path=/run/netns/nspawn_test"
-    SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" "$_netns_opt" /bin/ip a | grep -v -E '^1: lo.*UP'
+    SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn $SUSE_OPTS--register=no -D "$_root" "$_netns_opt" /bin/ip a | grep -v -E '^1: lo.*UP'
     local r=$?
     ip netns del nspawn_test
 
index 81e48e0ad191cfa1a1c92aadbad84622d2cf05bd..28144b378fdd73b40d0b6b3ef04755e6d355b181 100755 (executable)
@@ -124,6 +124,37 @@ umount ${image_dir}/mount
 
 systemd-run -t --property RootImage=${image}.gpt --property RootHash=${roothash} /usr/bin/cat /usr/lib/os-release | grep -q -F "MARKER=1"
 
+systemd-run -t --property RootImage=${image}.raw --property RootImageOptions="1:ro,noatime 2:ro,dev nosuid,dev" --property MountAPIVFS=yes mount | grep -F "squashfs" | grep -q -F "nosuid"
+systemd-run -t --property RootImage=${image}.gpt --property RootImageOptions="1:ro,noatime 1:ro,dev" --property MountAPIVFS=yes mount | grep -F "squashfs" | grep -q -F "noatime"
+
+cat > /run/systemd/system/testservice-50a.service <<EOF
+[Service]
+Type=oneshot
+ExecStart=mount
+MountAPIVFS=yes
+RootImage=${image}.raw
+RootImageOptions=1:ro,noatime,nosuid 2:ro,dev noatime,dev
+RootImageOptions=nosuid,dev
+EOF
+systemctl start testservice-50a.service
+journalctl -b -u testservice-50a.service | grep -F "squashfs" | grep -q -F "noatime"
+journalctl -b -u testservice-50a.service | grep -F "squashfs" | grep -q -F -v "nosuid"
+
+cat > /run/systemd/system/testservice-50b.service <<EOF
+[Service]
+Type=oneshot
+ExecStart=mount
+MountAPIVFS=yes
+RootImage=${image}.gpt
+RootImageOptions=1:ro,noatime,nosuid 2:ro,dev nosuid,dev
+RootImageOptions=2:ro,dev nosuid,dev,%%foo
+EOF
+systemctl start testservice-50b.service
+journalctl -b -u testservice-50b.service | grep -F "squashfs" | grep -q -F "noatime"
+
+# Check that specifier escape is applied %%foo -> %foo
+busctl get-property org.freedesktop.systemd1 /org/freedesktop/systemd1/unit/testservice_2d50b_2eservice org.freedesktop.systemd1.Service RootImageOptions | grep -F "nosuid,dev,%foo"
+
 echo OK > /testok
 
 exit 0
index b04607671503fcf043c11ba32c9daffe971de330..1120ef3effeaaffb328ca3010eaab5e3728e6d5e 100644 (file)
@@ -10,7 +10,7 @@
 [Unit]
 Description=Cleaning Up and Shutting Down Daemons
 DefaultDependencies=no
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
 OnFailure=emergency.target
 OnFailureJobMode=replace-irreversibly
 After=initrd-root-fs.target initrd-fs.target initrd.target
index 33822bde66b9ec3e761046f4512a5c589e6a473c..49577c364f3a8f30c270c68aee3170d35152d5bd 100644 (file)
@@ -12,7 +12,7 @@ Description=Initrd File Systems
 Documentation=man:systemd.special(7)
 OnFailure=emergency.target
 OnFailureJobMode=replace-irreversibly
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
 After=initrd-parse-etc.service
 DefaultDependencies=no
 Conflicts=shutdown.target
index b0e38368cfbd3782d861675c8b97a707c68c3850..94a9719b502c3500d0191d5dae413669508c6cd4 100644 (file)
@@ -14,7 +14,7 @@ Requires=initrd-root-fs.target
 After=initrd-root-fs.target
 OnFailure=emergency.target
 OnFailureJobMode=replace-irreversibly
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
 
 [Service]
 Type=oneshot
index 580c666b2310fcde64ac3a9d5c234e1f978c6fb0..bcb69093203d0e6013fcb444f969d98b6aba0dfc 100644 (file)
@@ -10,7 +10,7 @@
 [Unit]
 Description=Initrd Root Device
 Documentation=man:systemd.special(7)
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
 OnFailure=emergency.target
 OnFailureJobMode=replace-irreversibly
 DefaultDependencies=no
index 9b955f618a5fb080c73e2c989958988c97a6d8e1..f5a8855b6c6a848e4be3fc3fb97d7b5ac97d54c1 100644 (file)
@@ -10,7 +10,7 @@
 [Unit]
 Description=Initrd Root File System
 Documentation=man:systemd.special(7)
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
 OnFailure=emergency.target
 OnFailureJobMode=replace-irreversibly
 DefaultDependencies=no
index c1a37928880535435318a74e982ec76f8e385bd6..682b8af875b805806bd5696b34e1fedce2f0de77 100644 (file)
@@ -10,7 +10,7 @@
 [Unit]
 Description=Switch Root
 DefaultDependencies=no
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
 OnFailure=emergency.target
 OnFailureJobMode=replace-irreversibly
 AllowIsolate=yes
index ea4f02618f1c175460cf3d78a4fd5a6994790505..32ff40a3f6840f51ede1dfde8a550c73f77e29b2 100644 (file)
@@ -9,9 +9,9 @@
 
 [Unit]
 Description=Switch Root
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
 DefaultDependencies=no
-Requires=initrd-switch-root.service
+Wants=initrd-switch-root.service
 Before=initrd-switch-root.service
 AllowIsolate=yes
 Wants=initrd-udevadm-cleanup-db.service initrd-root-fs.target initrd-fs.target systemd-journald.service initrd-cleanup.service
index 810cf5775e497e6d03df5909c5718c09669f5ea2..0d66080de73d1a63255eac62e78e3a9097d5266f 100644 (file)
@@ -10,7 +10,7 @@
 [Unit]
 Description=Cleanup udev Database
 DefaultDependencies=no
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
 Conflicts=systemd-udevd.service systemd-udevd-control.socket systemd-udevd-kernel.socket systemd-udev-trigger.service systemd-udev-settle.service
 After=systemd-udevd.service systemd-udevd-control.socket systemd-udevd-kernel.socket systemd-udev-trigger.service systemd-udev-settle.service
 Before=initrd-switch-root.target
index a74a447c91ec0ce530c9dae61b9e59f54a862720..bfd497ecc3099b0edb919774fd0ba4d72cbc4912 100644 (file)
@@ -12,7 +12,7 @@ Description=Initrd Default Target
 Documentation=man:systemd.special(7)
 OnFailure=emergency.target
 OnFailureJobMode=replace-irreversibly
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
 Requires=basic.target
 Wants=initrd-root-fs.target initrd-root-device.target initrd-fs.target initrd-parse-etc.service
 After=initrd-root-fs.target initrd-root-device.target initrd-fs.target basic.target rescue.service rescue.target
index d1b1aeeabb22d8fb46197703a1967db114579846..a2db06b031dfefbb68f2ef7d1017c6c643650a47 100644 (file)
@@ -15,7 +15,7 @@ BindsTo=%i.device
 Wants=local-fs-pre.target
 After=%i.device
 Before=local-fs-pre.target
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
 
 [Service]
 Type=oneshot
index 7066e522612514c1ad0dc92f71953fee1e322d50..cf6837852fc2f930ed50e0fe339ecdcf513c9e3a 100644 (file)
@@ -22,4 +22,4 @@ After=swap.target
 What=tmpfs
 Where=/tmp
 Type=tmpfs
-Options=mode=1777,strictatime,nosuid,nodev,size=10%,nr_inodes=400k
+Options=mode=1777,strictatime,nosuid,nodev,size=50%,nr_inodes=400k