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>
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>
[Distribution]
Distribution=ubuntu
-Release=bionic
+Release=focal
Repositories=main,universe
[Output]
git
gnu-efi
gperf
- iptables-dev
libacl1-dev
libaudit-dev
libblkid-dev
libgcrypt20-dev
libgnutls28-dev
libidn2-0-dev
+ libip4tc-dev
+ libip6tc-dev
libkmod-dev
liblz4-dev
liblz4-tool
libsmartcols-dev
libtool
libxkbcommon-dev
+ libxtables-dev
libzstd-dev
m4
meson
zstd
Packages=
- libqrencode3
+ libqrencode4
locales
libidn2-0
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
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.
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
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.
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
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.
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
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.
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:
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)
* 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)
- 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
- 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
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@
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.
- 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`
`/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
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
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.
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
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.
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
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
OUI:085B0E*
ID_OUI_FROM_DATABASE=Fortinet, Inc.
+OUI:085BD6*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:085BDA*
ID_OUI_FROM_DATABASE=CliniCare LTD
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
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
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
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.
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
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
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.
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
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
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
OUI:20E09C*
ID_OUI_FROM_DATABASE=Nokia
+OUI:20E2A8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:20E407*
ID_OUI_FROM_DATABASE=Spark srl
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
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
OUI:305714*
ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:30578E*
+ ID_OUI_FROM_DATABASE=eero inc.
+
OUI:3057AC*
ID_OUI_FROM_DATABASE=IRLAB LTD.
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
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
OUI:34363B*
ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:343654*
+ ID_OUI_FROM_DATABASE=zte corporation
+
OUI:343759*
ID_OUI_FROM_DATABASE=zte corporation
OUI:348F27*
ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:34916F*
+ ID_OUI_FROM_DATABASE=UserGate Ltd.
+
OUI:349342*
ID_OUI_FROM_DATABASE=TTE Corporation
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.
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
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.
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
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
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
OUI:44356F*
ID_OUI_FROM_DATABASE=Neterix
+OUI:443583*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:443708*
ID_OUI_FROM_DATABASE=MRV Comunications
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
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.
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.
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
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.
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.
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
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
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
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
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.
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.
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
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.
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.
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.
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.
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
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.
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.
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
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
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.
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.
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
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
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
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
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
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
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
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
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
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.
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.
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.
OUI:70B3D56A6*
ID_OUI_FROM_DATABASE=WOW System
+OUI:70B3D56A7*
+ ID_OUI_FROM_DATABASE=Partilink Inc.
+
OUI:70B3D56A8*
ID_OUI_FROM_DATABASE=Vitsch Electronics
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
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
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
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.
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
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.
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
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
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
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
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
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.
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
OUI:70B3D5E10*
ID_OUI_FROM_DATABASE=Leidos
+OUI:70B3D5E11*
+ ID_OUI_FROM_DATABASE=Engage Technologies
+
OUI:70B3D5E12*
ID_OUI_FROM_DATABASE=SNK, Inc.
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
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.
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.
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
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
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.
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
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
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.
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.
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
OUI:8CD628*
ID_OUI_FROM_DATABASE=Ikor Metering
+OUI:8CD67F*
+ ID_OUI_FROM_DATABASE=EM Microelectronic
+
OUI:8CDB25*
ID_OUI_FROM_DATABASE=ESG Solutions
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
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
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.
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
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
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.
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
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
OUI:A075EA*
ID_OUI_FROM_DATABASE=BoxLock, Inc.
+OUI:A0764E*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
+
OUI:A07771*
ID_OUI_FROM_DATABASE=Vialis BV
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
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.
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.
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.
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
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
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.
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
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
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
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.
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
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
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
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
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
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)
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
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
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
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
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
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
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.
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
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.
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.
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
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
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
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
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
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
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
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.
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.
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
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
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.
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
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
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
OUI:F81037*
ID_OUI_FROM_DATABASE=Atopia Systems, LP
+OUI:F81093*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:F81308*
ID_OUI_FROM_DATABASE=Nokia
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.
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
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
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
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
---- 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
acpi:AMDI*:
ID_VENDOR_FROM_DATABASE=AMD
-@@ -286,6 +285,9 @@
+@@ -289,6 +288,9 @@
acpi:AAA*:
ID_VENDOR_FROM_DATABASE=Avolites Ltd
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
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.
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
acpi:AMX*:
ID_VENDOR_FROM_DATABASE=AMX LLC
-@@ -679,6 +687,9 @@
+@@ -682,6 +690,9 @@
acpi:AOA*:
ID_VENDOR_FROM_DATABASE=AOpen Inc.
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
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*:
acpi:AUR*:
ID_VENDOR_FROM_DATABASE=Aureal Semiconductor
-@@ -943,6 +957,9 @@
+@@ -946,6 +960,9 @@
acpi:AXE*:
ID_VENDOR_FROM_DATABASE=Axell Corporation
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
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
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)
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)
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)
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)
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
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)
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
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)
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)
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]
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]
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)
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]
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]
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
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]
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]
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
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
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
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]
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
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
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
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]
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.
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.
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
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
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
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)
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
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
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
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.
# 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
# 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
# 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
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
<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>
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
#
# 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/.
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)
# 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
<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>
<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>
['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',
['sd_journal_query_unique',
'3',
['SD_JOURNAL_FOREACH_UNIQUE',
+ 'sd_journal_enumerate_available_unique',
'sd_journal_enumerate_unique',
'sd_journal_restart_unique'],
''],
['systemd-initctl.service',
'8',
['systemd-initctl', 'systemd-initctl.socket'],
- ''],
+ 'HAVE_SYSV_COMPAT'],
['systemd-journal-gatewayd.service',
'8',
['systemd-journal-gatewayd', 'systemd-journal-gatewayd.socket'],
<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>
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
</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>
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>
<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>
<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
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>
<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
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)
include_directories : includes,
link_with : [libshared],
dependencies : [threads,
- libqrencode,
+ libdl,
libxz,
liblz4,
- libpcre2,
- libzstd],
+ libzstd,
+ libdl],
install_rpath : rootlibexecdir,
install : true,
install_dir : rootbindir)
install_rpath : rootlibexecdir,
install : true,
install_dir : rootbindir)
+ public_programs += exe
if want_tests != 'false'
test('test-repart',
# default to Debian testing
DISTRO=${DISTRO:-debian}
-RELEASE=${RELEASE:-buster}
+RELEASE=${RELEASE:-bullseye}
BRANCH=${BRANCH:-upstream-ci}
ARCH=${ARCH:-amd64}
CONTAINER=${RELEASE}-${ARCH}
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
--- /dev/null
+/* 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;
+}
#include "macro.h"
DEFINE_TRIVIAL_CLEANUP_FUNC(void*, dlclose);
+
+int dlsym_many_and_warn(void *dl, int level, ...);
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;
}
#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)
device-nodes.h
dirent-util.c
dirent-util.h
+ dlfcn-util.c
dlfcn-util.h
efivars.c
efivars.h
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;
}
}
}
-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;
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]);
}
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,
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),
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),
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;
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,
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);
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);
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;
`$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)
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,
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);
/* 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",
"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);
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;
#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, },
};
}
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;
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,
root_hash ?: root_hash_decoded,
root_hash_size,
root_verity ?: verity_data,
+ root_image_options,
dissect_image_flags,
&dissected_image);
if (r < 0)
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,
/* 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);
}
* 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)
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;
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;
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;
if (errno != ENOENT)
return -errno;
- r = fchmod(fileno(passwd), 0000);
+ r = fchmod(fileno(passwd), 0644);
if (r < 0)
return -errno;
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;
" --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"
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)
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;
_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);
_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);
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;
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");
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) {
}
static void schedule_post_change(JournalFile *f) {
- uint64_t now;
int r;
assert(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;
#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,
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;
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) {
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);
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;
}
#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);
#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"
} 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,
*out = p;
return 0;
}
-
#endif
static int add_matches_for_device(sd_journal *j, const char *devpath) {
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();
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;
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))
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);
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);
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)),
.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,
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"
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));
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.");
#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();
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;
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];
}
#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
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;
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");
}
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);
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");
}
int server_refresh_idle_timer(Server *s) {
- usec_t when;
int r;
assert(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");
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',
--- /dev/null
+/* 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
--- /dev/null
+/* 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);
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"
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,
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);
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);
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)
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;
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;
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;
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);
dhcp6_lease_free_ia(&lease->pd);
free(lease->dns);
+ free(lease->fqdn);
lease->domains = strv_free(lease->domains);
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)
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)
}
static void test_addr_acq(sd_event *e) {
- usec_t time_now = now(clock_boottime_or_monotonic());
sd_dhcp_client *client;
int res, r;
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));
#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"
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',
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,
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] = {
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__);
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));
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;
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);
test_option_status(e);
test_advertise_option(e);
test_client_solicit(e);
+ test_parse_domain(e);
return 0;
}
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__);
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);
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);
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__);
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);
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__);
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);
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;
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);
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);
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;
}
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) {
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;
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;
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,
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,
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;
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));
}
}
-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)
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);
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;
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);
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);
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");
log_link_warning_errno(link, r, "Failed to start IPv4ACD client, ignoring: %m");
}
+ if (ret)
+ *ret = a;
+
return 1;
}
typedef struct Network Network;
typedef struct Link Link;
typedef struct NetworkConfigSection NetworkConfigSection;
+typedef int (*address_ready_callback_t)(Address *address);
struct Address {
Network *network;
bool autojoin:1;
AddressFamily duplicate_address_detection;
+ /* Called when address become ready */
+ address_ready_callback_t callback;
+
sd_ipv4acd *acd;
LIST_FIELDS(Address, addresses);
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);
#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;
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);
}
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;
}
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");
}
struct in_addr address;
int r, n, i;
uint32_t table;
+ Route *rt;
assert(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);
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");
}
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");
}
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");
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;
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;
}
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);
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) {
uint32_t lifetime = CACHE_INFO_INFINITY_LIFE_TIME;
struct in_addr address, netmask;
unsigned prefixlen;
+ Address *ret;
int r;
assert(link);
/* 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;
}
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) {
#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;
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);
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;
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);
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:
log_link_warning(link, "DHCPv6 unknown event: %d", event);
return;
}
-
- link_check_ready(link);
}
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)
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;
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;
}
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;
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,
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,
void *data,
void *userdata) {
- Network *network = data;
+ int64_t *p = data;
+ uint64_t t;
int r;
assert(filename);
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;
+}
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_;
assert(link);
- link->ipv4ll_address = false;
+ link->ipv4ll_address_configured = false;
r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
if (r < 0)
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) {
} 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;
assert(ll);
assert(link);
- link->ipv4ll_address = false;
+ link->ipv4ll_address_configured = false;
r = sd_ipv4ll_get_address(ll, &address);
if (r == -ENOENT)
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;
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);
}
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);
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);
}
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);
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);
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);
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);
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);
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);
}
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);
}
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);
}
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);
}
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);
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);
}
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);
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)
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. */
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)
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;
}
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;
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;
}
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__);
}
}
- if (link->state != LINK_STATE_CONFIGURED)
- link_enter_configured(link);
+ link_enter_configured(link);
return;
}
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;
(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;
}
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;
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) {
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)
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);
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;
}
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;
}
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",
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);
/************************************************************/
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);
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);
(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);
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",
Set *addresses;
Set *addresses_foreign;
+ Set *static_addresses;
Set *neighbors;
Set *neighbors_foreign;
Set *routes;
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;
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;
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);
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);
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(), ¤t) >= 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");
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;
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;
}
}
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);
/* 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);
manager_save(m);
HASHMAP_FOREACH(link, m->links, i)
- link_save(link);
+ (void) link_save(link);
return 0;
}
Hashmap *netdevs;
OrderedHashmap *networks;
Hashmap *dhcp6_prefixes;
+ Set *dhcp6_pd_prefixes;
LIST_HEAD(AddressPool, address_pools);
usec_t network_dirs_ts_usec;
#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) {
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);
}
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);
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;
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) {
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;
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);
}
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;
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;
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;
}
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;
}
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);
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;
}
return log_oom();
*x = (NDiscRDNSS) {
- .address = a[i],
+ .address = a[j],
.valid_until = time_now + lifetime * USEC_PER_SEC,
};
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);
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;
}
if (r < 0)
return log_oom();
assert(r > 0);
-
- link_dirty(link);
}
return 0;
}
static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
+ Address *address;
+ Route *route;
uint64_t flags;
int r;
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");
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);
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) {
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");
NDiscDNSSL *d;
Iterator i;
usec_t time_now;
+ bool updated = false;
assert(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) {
/* 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) {
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(
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;
}
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;
}
} 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;
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;
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)
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)
.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,
.dhcp_server_emit_router = true,
.dhcp_server_emit_timezone = true,
- .router_prefix_subnet_id = -1,
.router_emit_dns = true,
.router_emit_domains = true,
"DHCP\0" /* compat */
"DHCPv4\0"
"DHCPv6\0"
+ "DHCPv6PrefixDelegation\0"
"DHCPServer\0"
"IPv6AcceptRA\0"
"IPv6NDPProxyAddress\0"
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);
/* 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;
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;
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;
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)
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;
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;
-}
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;
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_;
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);
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);
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;
sd_event_source_unref(route->expire);
route->expire = TAKE_PTR(expire);
+ if (ret)
+ *ret = route;
+
return 1;
}
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);
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:
}
}
-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) {
}
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);
}
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) {
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) {
+/* SPDX-License-Identifier: LGPL-2.1+ */
#pragma once
#include <sys/types.h>
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 },
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) */
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;
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))
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;
}
}
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,
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 {
/* 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,
* 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");
}
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;
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);
arg_image,
arg_root_hash, arg_root_hash_size,
arg_verity_data,
+ NULL,
dissect_image_flags,
&dissected_image);
if (r == -ENOPKG) {
#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"
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);
}
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;
}
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)
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);
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;
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;
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");
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);
}
" --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"
" --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()
ARG_PRETTY,
ARG_DEFINITIONS,
ARG_SIZE,
+ ARG_JSON,
};
static const struct option options[] = {
{ "pretty", required_argument, NULL, ARG_PRETTY },
{ "definitions", required_argument, NULL, ARG_DEFINITIONS },
{ "size", required_argument, NULL, ARG_SIZE },
+ { "json", required_argument, NULL, ARG_JSON },
{}
};
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;
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
last-lba: 2097118
EOF
+echo "### Testing with root, root2, home, & swap ###"
+
cat >$D/definitions/root.conf <<EOF
[Partition]
Type=root-x86-64
$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
$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
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
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
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)
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)
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;
}
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;
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");
/* 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)
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) {
/* 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");
}
(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;
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;
}
const void *root_hash,
size_t root_hash_size,
const char *verity_data,
+ const MountOptions *mount_options,
DissectImageFlags flags,
DissectedImage **ret) {
(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);
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,
.architecture = _ARCHITECTURE_INVALID,
.fstype = TAKE_PTR(t),
.node = TAKE_PTR(n),
+ .mount_options = TAKE_PTR(o),
};
m->encrypted = streq_ptr(fstype, "crypto_LUKS");
}
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)
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,
.node = TAKE_PTR(n),
.fstype = TAKE_PTR(t),
.uuid = id,
+ .mount_options = TAKE_PTR(o),
};
}
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)
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,
.architecture = _ARCHITECTURE_INVALID,
.node = TAKE_PTR(n),
.uuid = id,
+ .mount_options = TAKE_PTR(o),
};
break;
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 */
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,
.architecture = _ARCHITECTURE_INVALID,
.node = TAKE_PTR(generic_node),
.uuid = generic_uuid,
+ .mount_options = TAKE_PTR(o),
};
}
}
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);
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;
const void *root_hash,
size_t root_hash_size,
const char *verity_data,
+ const MountOptions *mount_options,
DissectImageFlags flags,
DissectedImage **ret) {
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) {
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",
#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;
char *node;
char *decrypted_node;
char *decrypted_fstype;
+ char *mount_options;
};
enum {
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);
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");
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);
}
}
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;
#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
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;
}
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");
}
}
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");
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");
}
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);
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);
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);
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));
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));
}
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));
}
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));
}
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);
}
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;
}
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[]) {
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]);
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;
}
assert_se(fd > 0);
r = setup_namespace(NULL,
+ NULL,
NULL,
&ns_info,
NULL,
log_info("Not chrooted");
r = setup_namespace(root_directory,
+ NULL,
NULL,
&ns_info,
(char **) writable,
#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;
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);
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);
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"));
_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);
}
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,
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);
}
#include <sys/types.h>
#include <unistd.h>
+#include "efivars.h"
#include "errno-util.h"
#include "fd-util.h"
#include "log.h"
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));
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");
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);
}
/* 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)
}
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);
}
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");
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");
#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;
(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;
/* 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;
static void worker_attach_event(struct worker *worker, struct event *event) {
sd_event *e;
- uint64_t usec;
assert(worker);
assert(worker->manager);
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) {
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.
# 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
BASICTOOLS=(
bash
cat
+ mount
)
oldinitdir=$initdir
export initdir=$TESTDIR/minimal
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"
RequestOptions=
UserClass=
VendorClass=
-AssignAcquiredDelegatedPrefixAddress=
-AssignAcquiredDelegatedPrefixToken=
SendVendorOption=
RouteMetric=
+[DHCPv6PrefixDelegation]
+SubnetId=
+Assign=
+Token=
[Route]
Destination=
Protocol=
DHCP=
Domains=
IPv6PrefixDelegation=
-IPv6PDSubnetId=
VLAN=
DHCPServer=
BindCarrier=
--- /dev/null
+[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
--- /dev/null
+[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
[Network]
IPv6AcceptRA=true
IPv6Token=::1a:2b:3c:4d
+IPv6Token=::1a:2b:3c:4d
+IPv6Token=::1a:2b:3c:4d
IPv6Token=::fa:de:ca:fe
'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',
'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']
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()
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()
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()
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()
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()
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 {
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 {
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 {
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
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
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
[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
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
After=initrd-root-fs.target
OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
[Service]
Type=oneshot
[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
[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
[Unit]
Description=Switch Root
DefaultDependencies=no
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly
AllowIsolate=yes
[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
[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
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
Wants=local-fs-pre.target
After=%i.device
Before=local-fs-pre.target
-ConditionPathExists=/etc/initrd-release
+AssertPathExists=/etc/initrd-release
[Service]
Type=oneshot
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