]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Merge pull request #15891 from bluca/host_os_release
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 8 Jul 2020 21:52:13 +0000 (23:52 +0200)
committerGitHub <noreply@github.com>
Wed, 8 Jul 2020 21:52:13 +0000 (23:52 +0200)
Container Interface: expose the host's os-release metadata to nspawn and portable guests

563 files changed:
.mailmap
.travis.yml
NEWS
README
TODO
catalog/systemd.catalog.in
catalog/systemd.pl.catalog.in
coccinelle/set_ensure_put.cocci [new file with mode: 0644]
docs/BOOT_LOADER_SPECIFICATION.md
docs/CODING_STYLE.md
docs/CONTRIBUTING.md
docs/DESKTOP_ENVIRONMENTS.md
docs/HOME_DIRECTORY.md
docs/INITRD_INTERFACE.md
docs/JOURNAL_FILE_FORMAT.md [new file with mode: 0644]
docs/PORTABILITY_AND_STABILITY.md
docs/RANDOM_SEEDS.md
docs/TRANSIENT-SETTINGS.md
docs/USER_NAMES.md
docs/USER_RECORD.md
hwdb.d/20-OUI.hwdb
hwdb.d/20-acpi-vendor.hwdb.patch
hwdb.d/20-pci-classes.hwdb
hwdb.d/20-pci-vendor-model.hwdb
hwdb.d/20-usb-vendor-model.hwdb
hwdb.d/60-evdev.hwdb
hwdb.d/60-keyboard.hwdb
hwdb.d/60-sensor.hwdb
hwdb.d/70-mouse.hwdb
hwdb.d/ma-large.txt
hwdb.d/ma-medium.txt
hwdb.d/ma-small.txt
hwdb.d/pci.ids
hwdb.d/usb.ids
man/bootup.xml
man/coredump.conf.xml
man/coredumpctl.xml
man/crypttab.xml
man/daemon.xml
man/file-hierarchy.xml
man/homectl.xml
man/homed.conf.xml
man/html.in
man/journal-remote.conf.xml
man/journal-upload.conf.xml
man/journalctl.xml
man/journald.conf.xml
man/kernel-command-line.xml
man/kernel-install.xml
man/logind.conf.xml
man/machine-id.xml
man/machinectl.xml
man/man.in
man/networkctl.xml
man/networkd.conf.xml
man/nss-myhostname.xml
man/nss-mymachines.xml
man/nss-resolve.xml
man/nss-systemd.xml
man/org.freedesktop.LogControl1.xml
man/org.freedesktop.home1.xml
man/org.freedesktop.hostname1.xml
man/org.freedesktop.import1.xml
man/org.freedesktop.login1.xml
man/org.freedesktop.machine1.xml
man/org.freedesktop.systemd1.xml
man/pam_systemd.xml
man/portablectl.xml
man/pstore.conf.xml
man/repart.d.xml
man/resolvectl.xml
man/resolved.conf.xml
man/sd-bus.xml
man/sd_bus_creds_get_pid.xml
man/sd_bus_enqueue_for_read.xml
man/sd_bus_get_fd.xml
man/sd_bus_interface_name_is_valid.xml
man/sd_bus_is_open.xml
man/sd_bus_message_get_type.xml
man/sd_bus_message_new_method_error.xml
man/sd_bus_message_new_signal.xml
man/sd_bus_negotiate_fds.xml
man/sd_bus_reply_method_error.xml
man/sd_bus_set_connected_signal.xml
man/sd_bus_set_watch_bind.xml
man/sd_bus_slot_set_destroy_callback.xml
man/sd_bus_slot_set_floating.xml
man/sd_event_new.xml
man/sd_event_source_set_destroy_callback.xml
man/sd_hwdb_get.xml
man/sd_hwdb_new.xml
man/sd_journal_has_runtime_files.xml
man/sd_login_monitor_new.xml
man/sd_machine_get_class.xml
man/sd_pid_get_owner_uid.xml
man/standard-conf.xml
man/sysctl.d.xml
man/systemctl.xml
man/systemd-analyze.xml
man/systemd-bless-boot-generator.xml
man/systemd-boot.xml
man/systemd-firstboot.xml
man/systemd-gpt-auto-generator.xml
man/systemd-journal-gatewayd.service.xml
man/systemd-journal-upload.service.xml
man/systemd-journald.service.xml
man/systemd-logind.service.xml
man/systemd-machined.service.xml
man/systemd-mount.xml
man/systemd-network-generator.service.xml
man/systemd-networkd.service.xml
man/systemd-nspawn.xml
man/systemd-random-seed.service.xml
man/systemd-repart.xml
man/systemd-sleep.conf.xml
man/systemd-socket-proxyd.xml
man/systemd-suspend.service.xml
man/systemd-system.conf.xml
man/systemd-time-wait-sync.service.xml
man/systemd-udevd.service.xml
man/systemd.automount.xml
man/systemd.device.xml
man/systemd.dnssd.xml
man/systemd.exec.xml
man/systemd.journal-fields.xml
man/systemd.kill.xml
man/systemd.link.xml
man/systemd.mount.xml
man/systemd.net-naming-scheme.xml
man/systemd.netdev.xml
man/systemd.network.xml
man/systemd.nspawn.xml
man/systemd.offline-updates.xml
man/systemd.path.xml
man/systemd.resource-control.xml
man/systemd.scope.xml
man/systemd.service.xml
man/systemd.slice.xml
man/systemd.socket.xml
man/systemd.special.xml
man/systemd.swap.xml
man/systemd.syntax.xml
man/systemd.target.xml
man/systemd.time.xml
man/systemd.timer.xml
man/systemd.unit.xml
man/systemd.xml
man/tc.xml
man/timesyncd.conf.xml
man/userdbctl.xml
meson.build
meson_options.txt
po/cs.po
rules.d/60-persistent-storage.rules
semaphoreci/semaphore-runner.sh
shell-completion/bash/networkctl
shell-completion/bash/systemd-nspawn
src/analyze/analyze-security.c
src/analyze/analyze.c
src/backlight/backlight.c
src/basic/device-nodes.c
src/basic/device-nodes.h
src/basic/dlfcn-util.h [new file with mode: 0644]
src/basic/efivars.c
src/basic/fs-util.c
src/basic/hashmap.c
src/basic/hashmap.h
src/basic/locale-util.c
src/basic/locale-util.h
src/basic/log.c
src/basic/log.h
src/basic/macro.h
src/basic/meson.build
src/basic/missing_capability.h
src/basic/namespace-util.c
src/basic/namespace-util.h
src/basic/process-util.c
src/basic/random-util.c
src/basic/random-util.h
src/basic/selinux-util.c
src/basic/set.h
src/basic/socket-util.c
src/basic/tmpfile-util.c
src/basic/unit-name.c
src/basic/user-util.c
src/busctl/busctl.c
src/cgls/cgls.c
src/cgtop/cgtop.c
src/core/automount.c
src/core/bpf-devices.c
src/core/bpf-devices.h
src/core/bpf-firewall.c
src/core/cgroup.c
src/core/dbus-automount.c
src/core/dbus-cgroup.c
src/core/dbus-execute.c
src/core/dbus-job.c
src/core/dbus-job.h
src/core/dbus-kill.c
src/core/dbus-manager.c
src/core/dbus-mount.c
src/core/dbus-path.c
src/core/dbus-scope.c
src/core/dbus-service.c
src/core/dbus-socket.c
src/core/dbus-swap.c
src/core/dbus-timer.c
src/core/dbus-unit.c
src/core/efi-random.c
src/core/emergency-action.c
src/core/execute.c
src/core/execute.h
src/core/load-fragment-gperf.gperf.m4
src/core/load-fragment.c
src/core/load-fragment.h
src/core/machine-id-setup.c
src/core/main.c
src/core/manager.c
src/core/manager.h
src/core/mount.c
src/core/namespace.c
src/core/namespace.h
src/core/path.c
src/core/path.h
src/core/transaction.c
src/core/unit.c
src/core/unit.h
src/coredump/coredump.c
src/coredump/coredumpctl.c
src/cryptsetup/cryptsetup-generator.c
src/delta/delta.c
src/detect-virt/detect-virt.c
src/dissect/dissect.c
src/escape/escape.c
src/firstboot/firstboot.c
src/fstab-generator/fstab-generator.c
src/fuzz/fuzz-udev-rules.c
src/home/homectl-fido2.c [new file with mode: 0644]
src/home/homectl-fido2.h [new file with mode: 0644]
src/home/homectl-pkcs11.c [new file with mode: 0644]
src/home/homectl-pkcs11.h [new file with mode: 0644]
src/home/homectl.c
src/home/homed-home-bus.h
src/home/homed-home.c
src/home/homed.c
src/home/homework-cifs.c
src/home/homework-cifs.h
src/home/homework-directory.c
src/home/homework-directory.h
src/home/homework-fido2.c [new file with mode: 0644]
src/home/homework-fido2.h [new file with mode: 0644]
src/home/homework-fscrypt.c
src/home/homework-fscrypt.h
src/home/homework-luks.c
src/home/homework-luks.h
src/home/homework-pkcs11.c
src/home/homework.c
src/home/homework.h
src/home/meson.build
src/home/pam_systemd_home.c
src/home/user-record-util.c
src/home/user-record-util.h
src/hostname/hostnamectl.c
src/hostname/hostnamed.c
src/hwdb/hwdb.c
src/id128/id128.c
src/import/importd.c
src/initctl/initctl.c
src/journal-remote/journal-gatewayd.c
src/journal-remote/journal-remote-main.c
src/journal-remote/journal-upload.c
src/journal-remote/microhttpd-util.h
src/journal/cat.c
src/journal/compress.c
src/journal/compress.h
src/journal/journal-def.h
src/journal/journal-file.c
src/journal/journal-file.h
src/journal/journal-internal.h
src/journal/journal-verify.c
src/journal/journalctl.c
src/journal/journald-kmsg.c
src/journal/lookup3.h
src/journal/sd-journal.c
src/journal/test-compress-benchmark.c
src/journal/test-compress.c
src/journal/test-journal-stream.c
src/journal/test-journal.c
src/libsystemd-network/dhcp-lease-internal.h
src/libsystemd-network/dhcp6-internal.h
src/libsystemd-network/dhcp6-network.c
src/libsystemd-network/icmp6-util.c
src/libsystemd-network/icmp6-util.h
src/libsystemd-network/network-internal.h
src/libsystemd-network/sd-dhcp-client.c
src/libsystemd-network/sd-dhcp-lease.c
src/libsystemd-network/sd-dhcp6-client.c
src/libsystemd-network/sd-radv.c
src/libsystemd-network/test-dhcp-client.c
src/libsystemd-network/test-dhcp6-client.c
src/libsystemd-network/test-ipv4ll.c
src/libsystemd-network/test-ndisc-ra.c
src/libsystemd-network/test-ndisc-rs.c
src/libsystemd/sd-bus/bus-common-errors.c
src/libsystemd/sd-bus/bus-common-errors.h
src/libsystemd/sd-bus/bus-internal.h
src/libsystemd/sd-bus/bus-track.c
src/libsystemd/sd-device/device-monitor.c
src/libsystemd/sd-device/sd-device.c
src/libsystemd/sd-event/sd-event.c
src/libsystemd/sd-netlink/netlink-types.c
src/libsystemd/sd-netlink/netlink-types.h
src/libsystemd/sd-network/sd-network.c
src/libudev/libudev-util.c
src/locale/localectl.c
src/locale/localed.c
src/locale/meson.build
src/login/inhibit.c
src/login/loginctl.c
src/login/logind-brightness.c
src/login/logind-core.c
src/login/logind-dbus.c
src/login/logind-dbus.h
src/login/logind-seat-dbus.c
src/login/logind-seat-dbus.h
src/login/logind-session-dbus.c
src/login/logind-session-dbus.h
src/login/logind-user-dbus.c
src/login/logind.c
src/login/logind.h
src/login/pam_systemd.c
src/login/user-runtime-dir.c
src/machine/image-dbus.c
src/machine/image-dbus.h
src/machine/machine-dbus.c
src/machine/machinectl.c
src/machine/machined-dbus.c
src/machine/machined.c
src/mount/mount-tool.c
src/network/meson.build
src/network/netdev/bond.c
src/network/netdev/macvlan.c
src/network/netdev/macvlan.h
src/network/netdev/netdev-gperf.gperf
src/network/netdev/netdev.c
src/network/netdev/wireguard.c
src/network/networkctl.c
src/network/networkd-address.c
src/network/networkd-dhcp-common.c
src/network/networkd-dhcp4.c
src/network/networkd-dhcp4.h
src/network/networkd-dhcp6.c
src/network/networkd-dhcp6.h
src/network/networkd-link-bus.c
src/network/networkd-link.c
src/network/networkd-link.h
src/network/networkd-manager.c
src/network/networkd-ndisc.c
src/network/networkd-ndisc.h
src/network/networkd-neighbor.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
src/network/networkd-nexthop.c
src/network/networkd-radv.c
src/network/networkd-radv.h
src/network/networkd-route.c
src/network/networkd-routing-policy-rule.c
src/network/networkd-sriov.c [new file with mode: 0644]
src/network/networkd-sriov.h [new file with mode: 0644]
src/network/networkd.c
src/network/tc/cake.c
src/network/tc/drr.c
src/network/tc/ets.c [new file with mode: 0644]
src/network/tc/ets.h [new file with mode: 0644]
src/network/tc/fifo.c
src/network/tc/fq-codel.c
src/network/tc/fq.c
src/network/tc/htb.c
src/network/tc/htb.h
src/network/tc/qdisc.c
src/network/tc/qdisc.h
src/network/tc/qfq.c
src/network/tc/tbf.c
src/network/tc/tbf.h
src/network/tc/tc-util.c
src/network/tc/tc-util.h
src/network/tc/tclass.c
src/network/wait-online/wait-online.c
src/nspawn/nspawn-oci.c
src/nspawn/nspawn-register.c
src/nspawn/nspawn-seccomp.c
src/nspawn/nspawn-seccomp.h
src/nspawn/nspawn-settings.c
src/nspawn/nspawn-settings.h
src/nspawn/nspawn.c
src/nss-mymachines/nss-mymachines.c
src/nss-resolve/nss-resolve.c
src/nss-systemd/nss-systemd.c
src/nss-systemd/nss-systemd.h [new file with mode: 0644]
src/nss-systemd/nss-systemd.sym
src/nss-systemd/userdb-glue.c
src/partition/growfs.c
src/partition/repart.c
src/partition/test-repart.sh
src/portable/portable.c
src/portable/portablectl.c
src/portable/portabled-image-bus.c
src/random-seed/random-seed.c
src/resolve/resolvectl.c
src/resolve/resolved-bus.c
src/resolve/resolved-bus.h
src/resolve/resolved-dns-packet.c
src/resolve/resolved-dns-query.c
src/resolve/resolved-dns-rr.c
src/resolve/resolved-dns-rr.h
src/resolve/resolved-dns-scope.c
src/resolve/resolved-dns-stream.c
src/resolve/resolved-dns-stub.c
src/resolve/resolved-dns-transaction.c
src/resolve/resolved-dns-transaction.h
src/resolve/resolved-dns-trust-anchor.c
src/resolve/resolved-dns-zone.c
src/resolve/resolved-dnssd-bus.h
src/resolve/resolved-etc-hosts.c
src/resolve/resolved-link-bus.c
src/resolve/resolved.c
src/resolve/test-resolved-etc-hosts.c
src/run/run.c
src/shared/bus-get-properties.c [new file with mode: 0644]
src/shared/bus-get-properties.h [new file with mode: 0644]
src/shared/bus-locator.c
src/shared/bus-locator.h
src/shared/bus-log-control-api.c
src/shared/bus-log-control-api.h
src/shared/bus-map-properties.c [new file with mode: 0644]
src/shared/bus-map-properties.h [new file with mode: 0644]
src/shared/bus-object.c [new file with mode: 0644]
src/shared/bus-object.h [new file with mode: 0644]
src/shared/bus-print-properties.c [new file with mode: 0644]
src/shared/bus-print-properties.h [new file with mode: 0644]
src/shared/bus-unit-util.c
src/shared/bus-util.c
src/shared/bus-util.h
src/shared/bus-wait-for-units.c
src/shared/dissect-image.c
src/shared/dissect-image.h
src/shared/dropin.c
src/shared/efi-loader.c
src/shared/efi-loader.h
src/shared/format-table.h
src/shared/install.c
src/shared/linux/nl80211.h
src/shared/logs-show.c
src/shared/macvlan-util.c
src/shared/macvlan-util.h
src/shared/meson.build
src/shared/module-util.c
src/shared/mount-util.c
src/shared/mount-util.h
src/shared/pkcs11-util.c
src/shared/pkcs11-util.h
src/shared/seccomp-util.c
src/shared/seccomp-util.h
src/shared/service-util.h
src/shared/tests.c
src/shared/user-record-show.c
src/shared/user-record.c
src/shared/user-record.h
src/shared/userdb.c
src/shared/userdb.h
src/shared/utmp-wtmp.c
src/shared/utmp-wtmp.h
src/shared/varlink.c
src/sleep/sleep.c
src/socket-proxy/socket-proxyd.c
src/systemctl/systemctl.c
src/systemd/sd-lldp.h
src/systemd/sd-messages.h
src/systemd/sd-network.h
src/sysusers/sysusers.c
src/sysv-generator/sysv-generator.c
src/test/test-bpf-devices.c
src/test/test-chase-symlinks.c
src/test/test-execute.c
src/test/test-install-root.c
src/test/test-load-fragment.c
src/test/test-locale-util.c
src/test/test-namespace.c
src/test/test-ns.c
src/test/test-path.c
src/test/test-process-util.c
src/test/test-seccomp.c
src/test/test-set.c
src/test/test-udev.c
src/test/test-unit-name.c
src/test/test-util.c
src/test/test-xdg-autostart.c
src/timedate/timedatectl.c
src/timedate/timedated.c
src/timesync/timesyncd-bus.c
src/timesync/timesyncd.c
src/tmpfiles/tmpfiles.c
src/udev/udev-builtin-path_id.c
src/udev/udev-rules.c
src/udev/udev-rules.h
src/udev/udevadm-info.c
src/udev/udevadm-monitor.c
src/udev/udevadm-test.c
src/udev/udevadm.c
src/udev/udevd.c
src/update-done/update-done.c
src/update-utmp/update-utmp.c
src/user-sessions/user-sessions.c
src/userdb/userdbctl.c
src/userdb/userdbd.c
src/userdb/userwork.c
src/veritysetup/veritysetup.c
src/xdg-autostart-generator/xdg-autostart-service.c
test/TEST-48-START-STOP-NO-RELOAD/blacklist-ubuntu-ci [deleted file]
test/TEST-52-HONORFIRSTSHUTDOWN/Makefile [new file with mode: 0644]
test/TEST-52-HONORFIRSTSHUTDOWN/fini.sh [new file with mode: 0755]
test/TEST-52-HONORFIRSTSHUTDOWN/test.sh [new file with mode: 0755]
test/fuzz/fuzz-journal-remote/oss-fuzz-21122 [new file with mode: 0644]
test/fuzz/fuzz-netdev-parser/directives.netdev
test/fuzz/fuzz-netdev-parser/wireguard-duplicated-endpoint [new file with mode: 0644]
test/fuzz/fuzz-network-parser/directives.network
test/fuzz/fuzz-network-parser/dns-trust-anchor-duplicate.network [new file with mode: 0644]
test/fuzz/fuzz-network-parser/oss-fuzz-15678
test/fuzz/fuzz-network-parser/oss-fuzz-23895 [new file with mode: 0644]
test/fuzz/fuzz-network-parser/oss-fuzz-23950 [new file with mode: 0644]
test/fuzz/fuzz-udev-rules/line-too-long [new file with mode: 0644]
test/fuzz/fuzz-unit-file/directives.service
test/fuzz/fuzz-xdg-desktop/oss-fuzz-22812 [new file with mode: 0644]
test/meson.build
test/test-execute/exec-restrictnamespaces-mnt-deny-list.service [moved from test/test-execute/exec-restrictnamespaces-mnt-blacklist.service with 100% similarity]
test/test-functions
test/test-network/conf/25-netdevsim.netdev [deleted file]
test/test-network/conf/25-qdisc-cake.network
test/test-network/conf/25-qdisc-clsact-and-htb.network
test/test-network/conf/25-qdisc-drr.network
test/test-network/conf/25-qdisc-ets.network [new file with mode: 0644]
test/test-network/conf/25-qdisc-qfq.network
test/test-network/conf/25-sriov.network [new file with mode: 0644]
test/test-network/systemd-networkd-tests.py
test/test-path/path-changed.service
test/test-path/path-directorynotempty.service
test/test-path/path-exists.service
test/test-path/path-existsglob.service
test/test-path/path-makedirectory.service
test/test-path/path-modified.service
test/test-path/path-mycustomunit.service
test/testsuite-52.units/testsuite-52.service [new file with mode: 0755]
test/testsuite-52.units/testsuite-52.sh [new file with mode: 0755]
test/units/test-honor-first-shutdown.service [new file with mode: 0644]
test/units/test-honor-first-shutdown.sh [new file with mode: 0755]
test/units/testsuite-36.sh
test/units/testsuite-47.sh
test/units/testsuite-48.sh
tools/git-contrib.sh
tools/make-autosuspend-rules.py
travis-ci/managers/fedora.sh
travis-ci/managers/fuzzbuzz.sh

index 3f3af64d777c4259fb20ec21a663808b58d90bf5..da93126120843365bf55e2b089ee8fc5cdf93fdb 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -206,3 +206,4 @@ Roger James <roger@beardandsandals.co.uk>
 Stephan Edel <se@se-it.eu>
 Andrey Yashkin <38919268+AndreyYashkin@users.noreply.github.com>
 Ronald Tschalär <ronald@innovation.ch>
+Jay Burger <jay.burger@fujitsu.com> <root@new-host-3.home>
index a72e81552fe1c9c93fc58da41b02fa34c1fd3b18..6df8d11f80987cb3b952531f08b43f38bddc2689 100644 (file)
@@ -47,6 +47,8 @@ jobs:
       env:
         - FEDORA_RELEASE="latest"
         - TOOL_BASE="/var/tmp/coverity-scan-analysis"
+        - CONT_NAME="coverity-fedora-$FEDORA_RELEASE"
+        - DOCKER_EXEC="docker exec -ti $CONT_NAME"
         - DOCKER_RUN="docker run -v $TOOL_BASE:$TOOL_BASE:rw --env-file .cov-env"
           # Coverity env variables
         - PLATFORM="$(uname)"
diff --git a/NEWS b/NEWS
index 8d93d0c813609e7adfce57eed49563ae1a71172a..cab0f1ee6f60c2f57f3f2e557c1c6475c15f1695 100644 (file)
--- a/NEWS
+++ b/NEWS
 systemd System and Service Manager
 
-CHANGES WITH 246 in spe:
+CHANGES WITH 246:
 
-        * The various programs included in systemd can now optionally output
-          their log messages on stderr prefixed with a timestamp, controlled by
-          the $SYSTEMD_LOG_TIME environment variable.
+        * The service manager gained basic support for cgroup v2 freezer. Units
+          can now be suspended or resumed either using new systemctl verbs,
+          freeze and thaw respectively, or via D-Bus.
+
+        * PID 1 may now automatically load pre-compiled AppArmor policies from
+          /etc/apparmor/earlypolicy during early boot.
+
+        * The CPUAffinity= setting in service unit files now supports a new
+          special value "numa" that causes the CPU affinity masked to be set
+          based on the NUMA mask.
+
+        * systemd will now log about all left-over processes remaining in a
+          unit when the unit is stopped. It will now warn about services using
+          KillMode=none, as this is generally an unsafe thing to make use of.
+
+        * Two new unit file settings
+          ConditionPathIsEncrypted=/AssertPathIsEncrypted= have been
+          added. They may be used to check whether a specific file system path
+          resides on a block device that is encrypted on the block level
+          (i.e. using dm-crypt/LUKS).
+
+        * Another pair of new settings ConditionEnvironment=/AssertEnvironment=
+          has been added that may be used for simple environment checks. This
+          is particularly useful when passing in environment variables from a
+          container manager (or from PAM in case of the systemd --user
+          instance).
+
+        * .service unit files now accept a new setting CoredumpFilter= which
+          allows configuration of the memory sections coredumps of the
+          service's processes shall include.
+
+        * .mount units gained a new ReadWriteOnly= boolean option. If set
+          it will not be attempted to mount a file system read-only if mounting
+          in read-write mode doesn't succeed. An option x-systemd.rw-only is
+          available in /etc/fstab to control the same.
+
+        * .socket units gained a new boolean setting PassPacketInfo=. If
+          enabled, the kernel will attach additional per-packet metadata to all
+          packets read from the socket, as ancillary message. This controls the
+          IP_PKTINFO, IPV6_RECVPKTINFO, NETLINK_PKTINFO socket options,
+          depending on socket type.
+
+        * .service units gained a new setting RootHash= which may be used to
+          specify the root hash for verity enabled disk images which are
+          specified in RootImage=. RootVerity= may be used to specify a path to
+          the Verity data matching a RootImage= file system. (The latter is
+          only useful for images that do not contain the Verity data embedded
+          into the same image that carries a GPT partition table following the
+          Discoverable Partition Specification). Similarly, systemd-nspawn
+          gained a new switch --verity-data= that takes a path to a file with
+          the verity data of the disk image supplied in --image=, if the image
+          doesn't contain the verity data itself.
+
+        * .service units gained a new setting RootHashSignature= which takes
+          either a base64 encoded PKCS#7 signature of the root hash specified
+          with RootHash=, or a path to a file to read the signature from. This
+          allows validation of the root hash against public keys available in
+          the kernel keyring, and is only supported on recent kernels
+          (>= 5.4)/libcryptsetup (>= 2.30). A similar switch has been added to
+          systemd-nspawn and systemd-dissect (--root-hash-sig=). Support for
+          this mechanism has also been added to systemd-veritysetup.
+
+        * .service unit files gained two new options
+          TimeoutStartFailureMode=/TimeoutStopFailureMode= that may be used to
+          tune behaviour if a start or stop timeout is hit, i.e. whether to
+          terminate the service with SIGTERM, SIGABRT or SIGKILL.
+
+        * Most options in systemd that accept hexadecimal values prefixed with
+          0x in additional to the usual decimal notation now also support octal
+          notation when the 0o prefix is used and binary notation if the 0b
+          prefix is used.
+
+        * 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
+          resolve to the various ID fields from /etc/os-release, %l resolves to
+          the "short" hostname of the system, i.e. the hostname configured in
+          the kernel truncated at the first dot.
+
+        * Support for the .include syntax in unit files has been removed. The
+          concept has been obsolete for 6 years and we started warning about
+          its pending removal 2 years ago (also see NEWS file below). It's
+          finally gone now.
+
+        * StandardError= and StandardOutput= in unit files no longer support
+          the "syslog" and "syslog-console" switches. They were long removed
+          from the documentation, but will now result in warnings when used,
+          and be converted to "journal" and "journal+console" automatically.
+
+        * If the service setting User= is set to the "nobody" user, a warning
+          message is now written to the logs (but the value is nonetheless
+          accepted). Setting User=nobody is unsafe, since the primary purpose
+          of the "nobody" user is to own all files whose owner cannot be mapped
+          locally. It's in particular used by the NFS subsystem and in user
+          namespacing. By running a service under this user's UID it might get
+          read and even write access to all these otherwise unmappable files,
+          which is quite likely a major security problem.
+
+        * A new kernel command line option systemd.hostname= has been added
+          that allows controlling the hostname that is initialized early during
+          boot.
+
+        * A kernel command line option "udev.blockdev_read_only" has been
+          added. If specified all hardware block devices that show up are
+          immediately marked as read-only by udev. This option is useful for
+          making sure that a specific boot under no circumstances modifies data
+          on disk. Use "blockdev --setrw" to undo the effect of this, per
+          device.
 
         * A new boolean kernel command line option systemd.swap= has been
           added, which may be used to turn off automatic activation of swap
-          devices, as listed in /etc/fstab.
+          devices listed in /etc/fstab.
 
-        * The CPUAffinity= setting in service unit files now supports a new
-          special value "numa". If used, the NUMA mask is copied into the CPU
-          affinity mask.
+        * New kernel command line options systemd.condition-needs-update= and
+          systemd.condition-first-boot= have been added, which override the
+          result of the ConditionNeedsUpdate= and ConditionFirstBoot=
+          conditions.
 
-        * The man pages for the sd-bus and sd-hwdb APIs have been completed.
+        * A new kernel command line option systemd.clock-usec= has been added
+          that allows setting the system clock to the specified time in µs
+          since Jan 1st, 1970 early during boot. This is in particular useful
+          in order to make test cases more reliable.
 
-        * networkctl gained the new "forcerenew" command for forcing all DHCP
-          server clients to renew their lease. The interface "status" output
-          will now show numerous additional fields of information about an
-          interface. There are new "up" and "down" commands to bring specific
-          interfaces up or down.
+        * The fs.suid_dumpable sysctl is set to 2 / "suidsafe". This allows
+          systemd-coredump to save core files for suid processes. When saving
+          the core file, systemd-coredump will use the effective uid and gid of
+          the process that faulted.
+
+        * The /sys/module/kernel/parameters/crash_kexec_post_notifiers file is
+          now automatically set to "Y" at boot, in order to enable pstore
+          generation for collection with systemd-pstore.
+
+        * A new 'hwdb' file has been added that collects information about PCI
+          and USB devices that correctly support auto-suspend, on top of the
+          databases for this we import from the ChromiumOS project. If you have
+          a device that supports auto-suspend correctly and where it should be
+          enabled by default, please submit a patch that adds it to the
+          database (see /usr/lib/udev/hwdb.d/60-autosuspend.hwdb).
+
+        * systemd-udevd gained new configuration option timeout_signal= as well
+          as corresponding kernel command line option udev.timeout_signal=.
+          The option can be used to configure the UNIX signal that the main
+          daemon sends to the worker processes on timeout. Setting the signal
+          to SIGABRT is useful for debugging.
+
+        * .link files managed by systemd-udevd gained options RxFlowControl=,
+          TxFlowControl=, AutoNegotiationFlowControl= in the [Link] section, in
+          order to configure various flow control parameters. They also gained
+          RxMiniBufferSize= and RxJumboBufferSize= in order to configure jumbo
+          frame ring buffer sizes.
+
+        * networkd.conf gained a new boolean setting ManageForeignRoutes=. If
+          enabled systemd-networkd manages all routes configured by other tools.
+
+        * .network files managed by systemd-networkd gained a new section
+          [SR-IOV], in order to configure SR-IOV capable network devices.
 
         * systemd-networkd's [IPv6Prefix] section in .network files gained a
           new boolean setting Assign=. If enabled an address from the prefix is
@@ -28,8 +165,11 @@ CHANGES WITH 246 in spe:
 
         * 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 an
-          interfaces.
+          subnet that networkd's Prefix Delegation logic assigns to interfaces.
+
+        * systemd-networkd's [Network] section gained a new setting
+          IPv4AcceptLocal=. If enabled the interface accepts packets with local
+          source addresses.
 
         * systemd-networkd gained support for configuring the HTB queuing
           discipline in the [HierarchyTokenBucket] and
@@ -38,8 +178,9 @@ CHANGES WITH 246 in spe:
           [GenericRandomEarlyDetection], "SFB" in [StochasticFairBlue], "cake"
           in [CAKE], "PIE" in [PIE], "DRR" in [DeficitRoundRobinScheduler] and
           [DeficitRoundRobinSchedulerClass], "BFIFO" in [BFIFO],
-          "PFIFOHeadDrop" in [PFIFOHeadDrop], "PFIFOFast" in [PFIFOFast] and
-          "HHF" in [HeavyHitterFilter].
+          "PFIFOHeadDrop" in [PFIFOHeadDrop], "PFIFOFast" in [PFIFOFast], "HHF"
+          in [HeavyHitterFilter], "ETS" in [EnhancedTransmissionSelection] and
+          "QFQ" in [QuickFairQueueing] and [QuickFairQueueingClass].
 
         * systemd-networkd gained support for a new Termination= setting in the
           [CAN] section for configuring the termination resistor. It also
@@ -49,16 +190,10 @@ CHANGES WITH 246 in spe:
           traffic). DataBitRate=, DataSamplePoint=, FDMode=, FDNonISO= have
           been added to configure various CAN-FD aspects.
 
-        * .link files managed by systemd-udevd gained options RxFlowControl=,
-          TxFlowControl=, AutoNegotiationFlowControl= in the [Link] section, in
-          order to configure various flow control parameters. They also gained
-          RxMiniBufferSize= and RxJumboBufferSize= in order to configure jumbo
-          frame ring buffer sizes.
-
-        * systemd-networkd's [DHCPv6] section gained a new WithoutRA= boolean
-          setting. If enabled, DHCPv6 will be attempted right-away without
-          requiring an Router Advertisement packet suggesting it
-          first. Conversely, the [IPv6AcceptRA] gained a boolean option
+        * systemd-networkd's [DHCPv6] section gained a new option WithoutRA=.
+          When enabled, DHCPv6 will be attempted right-away without requiring an
+          Router Advertisement packet suggesting it first (i.e. without the 'M'
+          or 'O' flags set). The [IPv6AcceptRA] section gained a boolean option
           DHCPv6Client= that may be used to turn off the DHCPv6 client even if
           the RA packets suggest it.
 
@@ -82,6 +217,45 @@ CHANGES WITH 246 in spe:
           Description"). Support for "MUD" URLs was also added to the LLDP
           stack, configurable in the [LLDP] section in .network files.
 
+        * systemd-networkd's .netdev files now support a new setting
+          VLANProtocol= in the [Bridge] section that allows configuration of
+          the VLAN protocol to use.
+
+        * systemd-networkd supports a new Group= setting in the [Link] section
+          of the .network files, to control the link group.
+
+        * systemd-networkd's [Network] section gained a new
+          IPv6LinkLocalAddressGenerationMode= setting, which specifies how IPv6
+          link local address is generated.
+
+        * A new default .network file is now shipped that matches TUN/TAP
+          devices that begin with "vt-" in their name. Such interfaces will
+          have IP routing onto the host links set up automatically. This is
+          supposed to be used by VM managers to trivially acquire a network
+          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.
+
+        * systemd-networkd's [DHCPv6] section gained a new setting VendorClass=
+          which configures the vendor class information sent to DHCP server.
+
+        * The BlackList= settings in .network files' [DHCPv4] and
+          [IPv6AcceptRA] sections have been renamed DenyList=. The old names
+          are still understood to provide compatibility.
+
+        * networkctl gained the new "forcerenew" command for forcing all DHCP
+          server clients to renew their lease. The interface "status" output
+          will now show numerous additional fields of information about an
+          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
@@ -93,174 +267,89 @@ CHANGES WITH 246 in spe:
 
         * systemd-resolved's DNS-over-TLS support gained SNI validation.
 
-        * The fs.suid_dumpable sysctl is set to 2 / "suidsafe". This allows
-          systemd-coredump to save core files for suid processes. When saving
-          the core file, systemd-coredump will use the effective uid and gid of
-          the process that faulted.
-
-        * "systemctl list-units" and "systemctl list-machines" no longer hide
-          their first output column with --no-legend. To hide the first column,
-          use --plain.
-
-        * The service manager gained basic support for cgroup v2 freezer. Units
-          can now be suspended or resumed either using new systemctl verbs,
-          freeze and thaw respectively, or via D-Bus.
-
-        * systemd-udevd gained new configuration option timeout_signal= as well
-          as coresponding kernel command line option udev.timeout_signal.
-          The option can be used to configure the UNIX signal that the main
-          daemon sends to the worker processes on timeout.
-
-        * A new sd-path.h API has been added to libsystemd. It provides a
-          simple API for retrieving various search paths and primary
-          directories for various resources.
-
-        * The sd-bus API gained a number of convenience functions that take
-          va_list arguments rather than "...". For example, there's now
-          sd_bus_call_methodv() to match sd_bus_call_method(). Previously,
-          these were missing since the calls are convenience calls only and
-          could be put together from the more low-level functions they build
-          on.
-
-        * sd-bus vtable entries learnt a new flag SD_BUS_VTABLE_ABSOLUTE_OFFSET
-          which alters how the userdata pointer to pass to the callbacks is
-          determined. If the flag is set the offset field is converted as-is
-          into a pointer, without adding it to the object pointer the vtable is
-          associated with.
-
-        * sd-bus now exposes four new functions:
-          sd_bus_interface_name_is_valid() + sd_bus_service_name_is_valid() +
-          sd_bus_member_name_is_valid() + sd_bus_object_path_is_valid() will
-          validate strings to check if they qualify as various D-Bus concepts.
+        * systemd-nspawn's --resolv-conf= switch gained a number of new
+          supported values. Specifically, options starting with "replace-" are
+          like those prefixed "copy-" but replace any existing resolv.conf
+          file. And options ending in "-uplink" and "-stub" can now be used to
+          propagate other flavours of resolv.conf into the container (as
+          defined by systemd-resolved).
 
-        * The sd-bus API gained the SD_BUS_METHOD_WITH_ARGS(),
-          SD_BUS_METHOD_WITH_ARGS_OFFSET() and SD_BUS_SIGNAL_WITH_ARGS() macros
-          that simplify adding argument names to D-Bus methods and signals.
+        * The various programs included in systemd can now optionally output
+          their log messages on stderr prefixed with a timestamp, controlled by
+          the $SYSTEMD_LOG_TIME environment variable.
 
         * systemctl gained a new "-P" switch that is a shortcut for "--value
           --property=…".
 
-        * The expectations on user/group name syntax are now documented in
-          detail; documentation how classic home directories may be converted
-          into home directories managed by homed has been added; documentation
-          regarding integration of homed/userdb functionality in desktops has
-          been added:
+        * "systemctl list-units" and "systemctl list-machines" no longer hide
+          their first output column with --no-legend. To hide the first column,
+          use --plain.
 
-              https://systemd.io/USER_NAMES
-              https://systemd.io/CONVERTING_TO_HOMED
-              https://systemd.io/USERDB_AND_DESKTOPS
+        * "systemctl reboot" takes the option "--reboot-argument=".
+          The optional positional argument to "systemctl reboot" is now
+          being deprecated in favor of this option.
 
         * systemd-run gained a new switch --slice-inherit. If specified the
           unit it generates is placed in the same slice as the systemd-run
           process itself.
 
-        * service unit files now accept a new setting CoredumpFilter= which
-          allows configuration of the memory sections coredumps of the
-          service's processes shall include.
-
-        * 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.
-
-        * Various D-Bus APIs of systemd daemons now have man pages that
-          document the methods, signals and properties.
+        * systemd-journald gained support for zstd compression of large fields
+          in journal files. The hash tables in journal files have been hardened
+          against hash collisions. This is an incompatible change and means
+          that journal files created with new systemd versions are not readable
+          with old versions. If the $SYSTEMD_JOURNAL_KEYED_HASH boolean
+          environment variable for systemd-journald.service is set to 0 this
+          new hardening functionality may be turned off, so that generated
+          journal files remain compatible with older journalctl
+          implementations.
+
+        * journalctl will now include a clickable link in the default output for
+          each log message for which an URL with further documentation is
+          known. This is only supported on terminal emulators that support
+          clickable hyperlinks, and is turned off if a pager is used (since
+          "less" still doesn't support hyperlinks,
+          unfortunately). Documentation URLs may be included in log messages
+          either by including a DOCUMENTATION= journal field in it, or by
+          associating a journal message catalog entry with the log message's
+          MESSAGE_ID, which then carries a "Documentation:" tag.
 
         * journald.conf gained a new boolean setting Audit= that may be used to
           control whether systemd-journald will enable audit during
           initialization.
 
-        * A new default .network file is now shipped that matches TUN/TAP
-          devices that begin with "vt-" in their name. Such interfaces will
-          have IP routing onto the host links set up automatically. This is
-          supposed to be used by VM managers to trivially acquire a network
-          interface which is fully set up for host communication, simply by
-          carefully picking an interface name to use.
+        * when systemd-journald's log stream is broken up into multiple lines
+          because the PID of the sender changed this is indicated in the
+          generated log records via the _LINE_BREAK=pid-change field.
 
-        * All D-Bus services shipped in systemd now implement the generic
-          LogControl1 D-Bus API which allows clients to change log level +
-          target of the service during runtime.
+        * journalctl's "-o cat" output mode will now show one or more journal
+          fields specified with --output-fields= instead of unconditionally
+          MESSAGE=. This is useful to retrieve a very specific set of fields
+          without any decoration.
 
-        * systemd-nspawn's --resolv-conf= switch gained a number of new
-          supported values. Specifically, options starting with "replace-" are
-          like those prefixed "copy-" but replace any existing resolv.conf
-          file. And options ending in "-uplink" and "-stub" can now be used to
-          propagate other flavours of resolv.conf into the container (as
-          defined by systemd-resolved).
+        * 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.
+
+        * coredumps collected by systemd-coredump may now be compressed using
+          the zstd algorithm.
 
         * systemd-binfmt gained a new switch --unregister for unregistering all
           registered entries at once. This is now invoked automatically at
           shutdown, so that binary formats registered with the "F" flag will
           not block clean file system unmounting.
 
-        * 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
-          resolve to the various ID fields from /etc/os-release, %l resolves to
-          the "short" hostname of the system, i.e. the kernel configured
-          hostname, truncated at the first dot.
-
         * systemd-notify's --pid= switch gained new values: "parent", "self",
           "auto" for controlling which PID to send to the service manager: the
           systemd-notify process' PID, or the one of the process invoking it.
 
-        * When sending a file descriptor (fd) to the service manager to keep
-          track of, using the sd_notify() mechanism, a new parameter FDPOLL=0
-          may be specified. If passed the service manager will refrain from
-          poll()ing on the file descriptor. Traditionally (and when the
-          parameter is not specified), the service manager will poll it for
-          POLLHUP or POLLERR events, and immediately close the fds in that
-          case.
-
-        * A new call sd_notify_barrier() has been added to the sd-daemon.h
-          API. The call will block until all previously sent sd_notify()
-          messages have been processed by the service manager. This is useful
-          to remove races caused by a process already having disappeared at the
-          time a notification message is processed by the service manager,
-          making correct attribution impossible. The systemd-notify tool will
-          now make use of this call implicitly, but this can be turned off again
-          via the new --no-block switch.
-
         * systemd-logind's Session bus object learnt a new method call
           SetType() for temporarily updating the session type of an already
           allocated session. This is useful for upgrading tty sessions to
           graphical ones once a compositor is invoked.
 
-        * .mount units gained a new ReadWriteOnly= boolean option. If set
-          it will not be attempted to mount a file system read-only if mounting
-          in read-write mode doesn't succeed. An option x-systemd.rw-only is
-          available in /etc/fstab to control the same.
-
-        * coredumps collected by systemd-coredump may now be compressed using
-          the zstd algorithm.
-
-        * journalctl's "-o cat" output mode will now show one or more journal
-          fields specified with --output-fields= instead of unconditionally
-          MESSAGE=. This is useful to retrieve a very specific set of fields
-          without any decoration.
-
         * systemd-socket-proxy gained a new switch --exit-idle-time= for
           configuring an exit-on-idle time.
 
-        * systemd-homed's LUKS backend gained the ability to discard empty file
-          system blocks automatically when the user logs out. This is enabled
-          by default to ensure that home directories take minimal space when
-          logged out but get full size guarantees when logged in. This may be
-          controlled with the new --luks-offline-discard= switch to homectl.
-
-        * If systemd-homed detects that /home/ is encrypted as a whole it will
-          now default to the directory or subvolume backends instead of the
-          LUKS backend, in order to avoid double encryption. The default
-          storage and file system may now be configured explicitly, too, via
-          the new /etc/systemd/homed.conf configuration file.
-
-        * when systemd-journald's log stream is broken up into multiple lines
-          because the PID of the sender changed this is indicated in the
-          generated log records via the _LINE_BREAK=pid-change field.
-
-        * systemd-networkd's .netdev files now support a new setting
-          VLANProtocol= in the [Bridge] section that allows configuration of
-          the VLAN protocol to use.
-
         * systemd-repart's --empty= setting gained a new value "create". If
           specified a new empty regular disk image file is created under the
           specified name. Its size may be specified with the new --size=
@@ -272,43 +361,38 @@ CHANGES WITH 246 in spe:
         * systemd-repart drop-ins now support a new UUID= setting to control
           the UUID to assign to a newly created partition.
 
-        * StandardError= and StandardOutput= in unit files no longer support
-          the "syslog" and "syslog-console" switches. They were long removed
-          from the documentation, but will now result in warnings when used,
-          and be converted to "journal" and "journal+console" automatically.
-
-        * systemd-networkd supports a new Group= setting in the [Link] section
-          of the .network files, to control the link group.
+        * systemd-repart's SizeMin= per-partition parameter now defaults to 10M
+          instead of 0.
 
-        * Two new unit file settings
-          ConditionPathIsEncrypted=/AssertPathIsEncrypted= have been
-          added. They may be used to check whether a specific file system path
-          resides on a block device that is encrypted on the block level
-          (i.e. using dm-crypt/LUKS).
+        * systemd-repart's Label= setting now support the usual, simple
+          specifier expansion.
 
-        * Another pair of new settings ConditionEnvironment=/AssertEnvironment=
-          has been added that may be used for simple environment checks. This
-          is particularly useful when passing in environment variables from a
-          container manager (or from PAM in case of the systemd --user
-          instance).
-
-        * The /sys/module/kernel/parameters/crash_kexec_post_notifiers file is
-          now automatically set to "Y" at boot, in order to enable pstore
-          generation for collection with systemd-pstore.
+        * systemd-homed's LUKS backend gained the ability to discard empty file
+          system blocks automatically when the user logs out. This is enabled
+          by default to ensure that home directories take minimal space when
+          logged out but get full size guarantees when logged in. This may be
+          controlled with the new --luks-offline-discard= switch to homectl.
 
-        * New kernel command line options systemd.condition-needs-update= and
-          systemd.condition-first-boot= have been added, which override the
-          result of the ConditionNeedsUpdate= and ConditionFirstBoot=
-          conditions.
+        * If systemd-homed detects that /home/ is encrypted as a whole it will
+          now default to the directory or subvolume backends instead of the
+          LUKS backend, in order to avoid double encryption. The default
+          storage and file system may now be configured explicitly, too, via
+          the new /etc/systemd/homed.conf configuration file.
 
-        * A new kernel command line option systemd.clock-usec= has been added
-          that allows setting the system clock to the specified time in µs
-          since Jan 1st, 1970 early during boot. This is in particular useful
-          in order to make test cases more reliable.
-
-        * A new kernel command line option systemd.hostname= has been added
-          that allows controlling the hostname that is initialized early during
-          boot.
+        * systemd-homed now supports unlocking home directories with FIDO2
+          security tokens that support the 'hmac-secret' extension, in addition
+          to the existing support for PKCS#11 security token unlocking
+          support. Note that many recent hardware security tokens support both
+          interfaces. The FIDO2 support is accessible via homectl's
+          --fido2-device= option.
+
+        * homectl's --pkcs11-uri= setting now accepts two special parameters:
+          if "auto" is specified and only one suitable PKCS#11 security token
+          is plugged in, its URL is automatically determined and enrolled for
+          unlocking the home directory. If "list" is specified a brief table of
+          suitable PKCS#11 security tokens is shown. Similar, the new
+          --fido2-device= option also supports these two special values, for
+          automatically selecting and listing suitable FIDO2 devices.
 
         * The /etc/crypttab tmp option now optionally takes an argument
           selecting the file system to use. Moreover, the default is now
@@ -331,6 +415,9 @@ CHANGES WITH 246 in spe:
           /etc/cryptsetup-keys.d/<volume>.key and
           /run/cryptsetup-keys.d/<volume>.key, if any of these files exist.
 
+        * systemd-cryptsetup may now activate Microsoft BitLocker volumes via
+          /etc/crypttab, during boot.
+
         * logind.conf gained a new RuntimeDirectoryInodesMax= setting to
           control the inode limit for the per-user $XDG_RUNTIME_DIR tmpfs
           instance.
@@ -345,33 +432,130 @@ CHANGES WITH 246 in spe:
           set the /etc/kernel/cmdline file of an OS image.
 
         * A new generator systemd-xdg-autostart-generator has been added. It
-          automatically generates systemd unit files from XDG autostart
-          .desktop files, and is useful for allowing systemd to manage services
-          defined that way safely and automatically.
+          generates systemd unit files from XDG autostart .desktop files, and
+          may be used to let the systemd user instance manage services that are
+          started automatically as part of the desktop session.
+
+        * "bootctl" gained a new verb "reboot-to-firmware" that may be used
+          to query and change the firmware's 'reboot into firmware' setup flag.
+
+        * systemd-firstboot gained a new switch --kernel-command-line= that may
+          be used to initialize the /etc/kernel/cmdline file of the image. It
+          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).
 
-        * systemd will now log about all left-over processes remaining in a
-          unit when the unit is stopped. It will now warn about services using
-          KillMode=none, as this is generally an unsafe thing to make use of.
+        * A new sd-path.h API has been added to libsystemd. It provides a
+          simple API for retrieving various search paths and primary
+          directories for various resources.
 
-        * .socket units gained a new boolean setting PassPacketInfo=. If
-          enabled, the kernel will attach additional per-packet metadata to all
-          packets read from the socket, as ancillary message. This controls the
-          IP_PKTINFO, IPV6_RECVPKTINFO, NETLINK_PKTINFO socket options,
-          depending on socket type.
+        * A new call sd_notify_barrier() has been added to the sd-daemon.h
+          API. The call will block until all previously sent sd_notify()
+          messages have been processed by the service manager. This is useful
+          to remove races caused by a process already having disappeared at the
+          time a notification message is processed by the service manager,
+          making correct attribution impossible. The systemd-notify tool will
+          now make use of this call implicitly, but this can be turned off again
+          via the new --no-block switch.
 
-        * 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.
+        * When sending a file descriptor (fd) to the service manager to keep
+          track of, using the sd_notify() mechanism, a new parameter FDPOLL=0
+          may be specified. If passed the service manager will refrain from
+          poll()ing on the file descriptor. Traditionally (and when the
+          parameter is not specified), the service manager will poll it for
+          POLLHUP or POLLERR events, and immediately close the fds in that
+          case.
 
-        * "systemctl reboot" takes the option "--reboot-argument=".
-          The optional positional argument to "systemctl reboot" is now
-          being deprecated in favor of this option.
+        * The service manager (PID1) gained a new D-Bus method call
+          SetShowStatus() which may be used to control whether it shall show
+          boot-time status output on the console. This method has a similar
+          effect to sending SIGRTMIN+20/SIGRTMIN+21 to PID 1.
 
-        * Support for the .include syntax in unit files has been removed. The
-          concept has been obsolete for 6 years and we started warning about
-          its pending removal 2 years ago (also see NEWS file below). It's
-          finally gone now.
+        * The sd-bus API gained a number of convenience functions that take
+          va_list arguments rather than "...". For example, there's now
+          sd_bus_call_methodv() to match sd_bus_call_method(). Those calls make
+          it easier to build wrappers that accept variadic arguments and want
+          to pass a ready va_list structure to sd-bus.
+
+        * sd-bus vtable entries can have a new SD_BUS_VTABLE_ABSOLUTE_OFFSET
+          flag which alters how the userdata pointer to pass to the callbacks
+          is determined. When the flag is set, the offset field is converted
+          as-is into a pointer, without adding it to the object pointer the
+          vtable is associated with.
+
+        * sd-bus now exposes four new functions:
+          sd_bus_interface_name_is_valid() + sd_bus_service_name_is_valid() +
+          sd_bus_member_name_is_valid() + sd_bus_object_path_is_valid() will
+          validate strings to check if they qualify as various D-Bus concepts.
+
+        * The sd-bus API gained the SD_BUS_METHOD_WITH_ARGS(),
+          SD_BUS_METHOD_WITH_ARGS_OFFSET() and SD_BUS_SIGNAL_WITH_ARGS() macros
+          that simplify adding argument names to D-Bus methods and signals.
+
+        * The man pages for the sd-bus and sd-hwdb APIs have been completed.
+
+        * Various D-Bus APIs of systemd daemons now have man pages that
+          document the methods, signals and properties.
+
+        * The expectations on user/group name syntax are now documented in
+          detail; documentation how classic home directories may be converted
+          into home directories managed by homed has been added; documentation
+          regarding integration of homed/userdb functionality in desktops has
+          been added:
+
+              https://systemd.io/USER_NAMES
+              https://systemd.io/CONVERTING_TO_HOMED
+              https://systemd.io/USERDB_AND_DESKTOPS
+
+        * Documentation for the on-disk Journal file format has been updated
+          and has now moved to:
+
+              https://systemd.io/JOURNAL_FILE_FORMAT
+
+        * All D-Bus services shipped in systemd now implement the generic
+          LogControl1 D-Bus API which allows clients to change log level +
+          target of the service during runtime.
+
+        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,
+        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
+        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
+        Jędrzejewski-Szmek, Zhu Li, Дамјан Георгиевски, наб
 
 CHANGES WITH 245:
 
@@ -744,7 +928,7 @@ CHANGES WITH 244:
           of the PAM session, for example for time-limited logins.
 
         * A new @pkey system call group is now defined to make it easier to
-          whitelist memory protection syscalls for containers and services
+          allow-list memory protection syscalls for containers and services
           which need to use them.
 
         * systemd-udevd: removed the 30s timeout for killing stale workers on
@@ -761,10 +945,10 @@ CHANGES WITH 244:
         * udev now provides a program (fido_id) that identifies FIDO CTAP1
           ("U2F")/CTAP2 security tokens based on the usage declared in their
           report and descriptor and outputs suitable environment variables.
-          This replaces the externally maintained whitelists of all known
+          This replaces the externally maintained allow lists of all known
           security tokens that were used previously.
 
-        * Automatically generated autosuspend udev rules for whitelisted
+        * Automatically generated autosuspend udev rules for allow-listed
           devices have been imported from the Chromium OS project. This should
           improve power saving with many more devices.
 
@@ -1131,7 +1315,7 @@ CHANGES WITH 243:
 
         * systemd-networkd's DHCPv4 support now understands a new MaxAttempts=
           option for configuring the maximum number of DHCP lease requests.  It
-          also learnt a new BlackList= option for blacklisting DHCP servers (a
+          also learnt a new BlackList= option for deny-listing DHCP servers (a
           similar setting has also been added to the IPv6 RA client), as well
           as a SendRelease= option for configuring whether to send a DHCP
           RELEASE message when terminating.
@@ -2363,12 +2547,12 @@ CHANGES WITH 239:
           any relevant symlinks both in /run and /etc.
 
         * Note that all long-running system services shipped with systemd will
-          now default to a system call whitelist (rather than a blacklist, as
+          now default to a system call allow list (rather than a deny list, as
           before). In particular, systemd-udevd will now enforce one too. For
           most cases this should be safe, however downstream distributions
           which disabled sandboxing of systemd-udevd (specifically the
           MountFlags= setting), might want to disable this security feature
-          too, as the default whitelisting will prohibit all mount, swap,
+          too, as the default allow-listing will prohibit all mount, swap,
           reboot and clock changing operations from udev rules.
 
         * sd-boot acquired new loader configuration settings to optionally turn
@@ -3396,7 +3580,7 @@ CHANGES WITH 235:
         * systemd-nspawn gained support for a new --system-call-filter= command
           line option for adding and removing entries in the default system
           call filter it applies. Moreover systemd-nspawn has been changed to
-          implement a system call whitelist instead of a blacklist.
+          implement a system call allow list instead of a deny list.
 
         * systemd-run gained support for a new --pipe command line option. If
           used the STDIN/STDOUT/STDERR file descriptors passed to systemd-run
@@ -6109,11 +6293,10 @@ CHANGES WITH 220:
           fsck's progress report to an AF_UNIX socket in the file
           system.
 
-        * udev will no longer create device symlinks for all block
-          devices by default. A blacklist for excluding special block
-          devices from this logic has been turned into a whitelist
-          that requires picking block devices explicitly that require
-          device symlinks.
+        * udev will no longer create device symlinks for all block devices by
+          default. A deny list for excluding special block devices from this
+          logic has been turned into a allow list that requires picking block
+          devices explicitly that require device symlinks.
 
         * A new (currently still internal) API sd-device.h has been
           added to libsystemd. This modernized API is supposed to
@@ -8002,11 +8185,11 @@ CHANGES WITH 210:
           Wikipedia. We explicitly document which base applies for
           each configuration option.
 
-        * The DeviceAllow= setting in unit files now supports a syntax
-          to whitelist an entire group of devices node majors at once,
-          based on the /proc/devices listing. For example, with the
-          string "char-pts", it is now possible to whitelist all
-          current and future pseudo-TTYs at once.
+        * The DeviceAllow= setting in unit files now supports a syntax to
+          allow-list an entire group of devices node majors at once, based on
+          the /proc/devices listing. For example, with the string "char-pts",
+          it is now possible to allow-list all current and future pseudo-TTYs
+          at once.
 
         * sd-event learned a new "post" event source. Event sources of
           this type are triggered by the dispatching of any event
@@ -10249,9 +10432,9 @@ CHANGES WITH 187:
         * journalctl gained the new "--header" switch to introspect
           header data of journal files.
 
-        * A new setting SystemCallFilters= has been added to services
-          which may be used to apply blacklists or whitelists to
-          system calls. This is based on SECCOMP Mode 2 of Linux 3.5.
+        * A new setting SystemCallFilters= has been added to services which may
+          be used to apply deny lists or allow lists to system calls. This is
+          based on SECCOMP Mode 2 of Linux 3.5.
 
         * nspawn gained a new --link-journal= switch (and quicker: -j)
           to link the container journal with the host. This makes it
diff --git a/README b/README
index 4f4a21eeca7ea1e824542b3eda148d54ee88cfa8..4269f0c73df1c2937902d4ab89e744ba48dcae19 100644 (file)
--- a/README
+++ b/README
@@ -35,6 +35,7 @@ LICENSE:
 REQUIREMENTS:
         Linux kernel >= 3.13
         Linux kernel >= 4.2 for unified cgroup hierarchy support
+        Linux kernel >= 5.4 for signed Verity images support
 
         Kernel Config Options:
           CONFIG_DEVTMPFS
@@ -102,6 +103,9 @@ REQUIREMENTS:
           CONFIG_EFIVAR_FS
           CONFIG_EFI_PARTITION
 
+        Required for signed Verity images support:
+          CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG
+
         We recommend to turn off Real-Time group scheduling in the
         kernel when using systemd. RT group scheduling effectively
         makes RT scheduling unavailable for most userspace, since it
@@ -144,7 +148,7 @@ REQUIREMENTS:
         libblkid >= 2.24 (from util-linux) (optional)
         libkmod >= 15 (optional)
         PAM >= 1.1.2 (optional)
-        libcryptsetup (optional)
+        libcryptsetup (optional), >= 2.3.0 required for signed Verity images support
         libaudit (optional)
         libacl (optional)
         libselinux (optional)
diff --git a/TODO b/TODO
index 8926c9f5eabb167571fd5f7360766ac75005fe8b..7ee5f26cc1ca3a3b6497499e929c590ee548f41e 100644 (file)
--- a/TODO
+++ b/TODO
@@ -8,8 +8,6 @@ External:
 
 * Fedora: add an rpmlint check that verifies that all unit files in the RPM are listed in %systemd_post macros.
 
-* wiki: update journal format documentation for lz4 additions
-
 Janitorial Clean-ups:
 
 * Rearrange tests so that the various test-xyz.c match a specific src/basic/xyz.c again
@@ -22,16 +20,13 @@ Features:
 * add --copy-from and --copy-to command to systemd-dissect which copies stuff
   in and out of a disk image
 
-* add systemd.random_seed= on the kernel cmdline, taking some hex or base64
-  encoded data. During earliest boot, credit it to entropy. This is not useful
-  for general purpose systems, but certainly for testing environments in VMs
-  and such, as it allows us to boot up instantly with fully initialized entropy
-  pool even if RNG pass-thru is not available.
-
 * Support ProtectProc= or so, using: https://patchwork.kernel.org/cover/11310197/
 
 * if /usr/bin/swapoff fails due to OOM, log a friendly explanatory message about it
 
+* add loud warning to the logs (with catalog entry) if systemd-udev-settle is
+  pulled into the boot process
+
 * build short web pages out of each catalog entry, build them along with man
   pages, and include hyperlinks to them in the journal output
 
@@ -41,6 +36,10 @@ Features:
   so that the client side can remain entirely unprivileged, with SUID or
   anything like that.
 
+* journald: do journal file writing out-of-process, with one writer process per
+  client UID, so that synthetic hash table collisions can slow down a specific
+  user's journal stream down but not the others.
+
 * add "throttling" to sd-event event sources: optionally, when we wake up too
   often for one, let's turn it off entirely for a while. Use that for the
   /proc/self/mountinfo logic.
@@ -50,6 +49,9 @@ Features:
 
 * nspawn: support time namespaces
 
+* systemd-firstboot: make sure to always use chase_symlinks() before
+  reading/writing files
+
 * add ConditionSecurity=tpm2
 
 * Remove any support for booting without /usr pre-mounted in the initrd entirely.
@@ -95,8 +97,9 @@ Features:
   this, it's useful to have one that can dump contents of them, too.
 
 * All tools that support --root= should also learn --image= so that they can
-  operate on disk images directly. Specifically: bootctl, firstboot, tmpfiles,
-  sysusers, systemctl, repart, journalctl, coredumpctl.
+  operate on disk images directly. Specifically: bootctl, tmpfiles, sysusers,
+  systemctl, repart, journalctl, coredumpctl. (Already done: systemd-nspawn,
+  systemd-firstboot)
 
 * seccomp: by default mask x32 ABI system wide on x86-64. it's on its way out
 
@@ -139,20 +142,20 @@ Features:
 
 * homed: support new FS_IOC_ADD_ENCRYPTION_KEY ioctl for setting up fscrypt
 
-* busctl: maybe expose a verb "ping" for pinging a dbus service to see if it
-  exists and responds.
-
 * homed: maybe pre-create ~/.cache as subvol so that it can have separate quota
   easily?
 
+* busctl: maybe expose a verb "ping" for pinging a dbus service to see if it
+  exists and responds.
+
 * when systemd-nspawn and suchlike dissect an OS image, and there are multiple
   root partitions, do an strverscmp() on the partition label and boot
   first. That is inspired how sd-boot figures out which kernel to boot, and
   thus allows defining OS images which can be A/B updated and we default to the
   newest version automatically, both in nspawn and in sd-boot
 
-* cryptsetup/homed: also support FIDO2 HMAC password logic for unlocking
-  devices. (see: https://github.com/mjec/fido2-hmac-secret)
+* cryptsetup: support FIDO2 tokens for deriving keys (i.e. do what homed can do
+  also in plain cryptsetup)
 
 * systemd-gpt-auto should probably set x-systemd.growfs on the mounts it
   creates
@@ -167,6 +170,10 @@ Features:
   - teach it to copy in unified kernel images and maybe type #1 boot loader spec entries from host
   - make it operate on loopback files, dissecting enough to find ESP to operate on
 
+* Maybe add a separate GPT partition type to the discoverable partition spec
+  for "hibernate" partitions, that are exactly like swap partitions but only
+  activated right before hibernation and thus never used for regular swapping.
+
 * by default, in systemd --user service bump the OOMAdjust to 100, as privs
   allow so that systemd survives
 
@@ -206,13 +213,6 @@ Features:
   end), in order to maximize dd'ability. Requires libfdisk work, see
   https://github.com/karelzak/util-linux/issues/907
 
-* systemd-repart: optionally, allow specifying a path to initialize new
-  partitions from, i.e. an fs image file or a source device node. This would
-  then turn systemd-repart into a simple installer: with a few .repart files
-  you could replicate the host system on another device. a full installer would
-  then be: "systemd-repart /dev/sda && bootctl install /dev/sda &&
-  systemd-firstboot --image= …"
-
 * systemd-repart: MBR partition table support. Care needs to be taken regarding
   Type=, so that partition definitions can sanely apply to both the GPT and the
   MBR case. Idea: accept syntax "Type=gpt:home mbr:0x83" for setting the types
@@ -228,18 +228,29 @@ Features:
 
 * systemd-repart: allow managing the gpt read-only partition flag + auto-mount flag
 
+* systemd-repart: allow boolean option that ensures that if existing partition
+  doesn't exist within the configured size bounds the whole command fails. This
+  is useful to implement ESP vs. XBOOTLDR schemes in installers: have one set
+  of repart files for the case where ESP is large enough and one where it isn't
+  and XBOOTLDR is added in instead.  Then apply the former first, and if it
+  fails to apply use the latter.
+
+* systemd-repart: add per-partition option to never reuse existing partition
+  and always create anew even if matching partition already exists.
+
+* systemd-repart: add per-partition option to fail if partition already exist,
+  i.e. is not added new. Similar, add option to fail if partition does not exist yet.
+
+* systemd-repart: add --size=auto for generating/resizing images of minimal
+  size, i.e. where the image file is sized exactly as large as necessary taking
+  SizeMin= into account, but not a single byte larger.
+
 * systemd-repart: allow disabling growing of specific partitions, or making
   them (think ESP: we don't ever want to grow it, since we cannot resize vfat)
 
-* systemd-repart: add specifier expansion, add especifier that refers to root
-  device node of current system, /usr device node, and matching verity, so that
-  an installer can be made a "copy" installer of the booted OS
-
 * systemd-repart: make it a static checker during early boot for existence and
   absence of other partitions for trusted boot environments
 
-* systemd-repart: allow config of partition uuid
-
 * userdb: allow username prefix searches in varlink API, allow realname and
   realname substr searches in varlink API
 
@@ -336,7 +347,8 @@ Features:
     beefing up logind to make pam session close hook synchronous and wait until
     systemd --user is shut down.
   - logind: maybe keep a "busy fd" as long as there's a non-released session around or the user@.service
-  - maybe make automatic, read-only, time-based reflink-copies of LUKS disk images (think: time machine)
+  - maybe make automatic, read-only, time-based reflink-copies of LUKS disk
+    images (and btrfs snapshots of subvolumes) (think: time machine)
   - distinguish destroy / remove (i.e. currently we can unregister a user, unregister+remove their home directory, but not just remove their home directory)
   - in systemd's PAMName= logic: query passwords with ssh-askpassword, so that we can make "loginctl set-linger" mode work
   - fingerprint authentication, pattern authentication, …
@@ -352,6 +364,9 @@ Features:
   - make slice for users configurable (requires logind rework)
   - logind: populate auto-login list bus property from PKCS#11 token
   - when determining state of a LUKS home directory, check DM suspended sysfs file
+  - introduce API for "making room", that grows/shrinks home directory
+    according to elastic parameters, discards blocks, and removes additional snapshots. Call it
+    either from UI when disk space gets low
 
 * introduce a new per-process uuid, similar to the boot id, the machine id, the
   invocation id, that is derived from process creds, specifically a hashed
index 9ba5656f166514f1d002bfa193ce8ef24849b331..1d3b62a2f49a43f4e2933aac956240a385e9805c 100644 (file)
@@ -464,3 +464,23 @@ system shutdown.
 It is generally recommended to avoid such overly long mount point paths, or —
 if used anyway – manage them independently of systemd, i.e. establish them as
 well as tear them down automatically at system shutdown by other software.
+
+-- b480325f9c394a7b802c231e51a2752c
+Subject: Special user @OFFENDING_USER@ configured, this is not safe!
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: https://systemd.io/UIDS-GIDS
+
+The unit @UNIT@ is configured to use User=@OFFENDING_USER@.
+
+This is not safe. The @OFFENDING_USER@ user's main purpose on Linux-based
+operating systems is to be the owner of files that otherwise cannot be mapped
+to any local user. It's used by the NFS client and Linux user namespacing,
+among others. By running a unit's processes under the identity of this user
+they might possibly get read and even write access to such files that cannot
+otherwise be mapped.
+
+It is strongly recommended to avoid running services under this user identity,
+in particular on systems using NFS or running containers. Allocate a user ID
+specific to this service, either statically via systemd-sysusers or dynamically
+via the DynamicUser= service setting.
index 5f3d41632266fc4058119966be271db5407d7873..961d09a2f545a32110f7d661765081074a0e9197 100644 (file)
@@ -298,7 +298,8 @@ Maszyna wirtualna @NAME@ (PID prowadzący @LEADER@) została wyłączona.
 Subject: Wyłączono tryb DNSSEC, ponieważ serwer go nie obsługuje
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: man:systemd-resolved.service(8) resolved.conf(5)
+Documentation: man:systemd-resolved.service(8)
+Documentation: man:resolved.conf(5)
 
 Usługa resolver (systemd-resolved.service) wykryła, że skonfigurowany serwer
 DNS nie obsługuje DNSSEC, w wyniku czego walidacja DNSSEC została wyłączona.
@@ -416,6 +417,7 @@ przez jednostkę @UNIT@.
 Subject: Przyjmowanie nazwy użytkownika/grupy @USER_GROUP_NAME@, która nie zgadza się ze ścisłymi regułami nazw użytkowników/grup.
 Defined-By: systemd
 Support: %SUPPORT_URL%
+Documentation: https://systemd.io/USER_NAMES
 
 Podano nazwę użytkownika/grupy @USER_GROUP_NAME@, co zostało przyjęte
 zgodnie z rozluźnionymi regułami nazw użytkowników/grup, ale nie spełnia
@@ -432,5 +434,57 @@ nazw z początkową lub końcową spacją, ciągów „.” lub „..”, ciąg
 zawierających tylko cyfry lub ciągów zaczynających się myślnikiem
 i zawierających oprócz niego tylko cyfry.
 
-https://systemd.io/USER_NAMES zawiera więcej informacji o ścisłych
-i rozluźnionych regułach nazw użytkowników/grup.
+-- 1b3bb94037f04bbf81028e135a12d293
+Subject: Utworzenie prawidłowej nazwy jednostki ze ścieżki „@MOUNT_POINT@” się nie powiodło.
+Defined-By: systemd
+Support: %SUPPORT_URL%
+
+Następująca ścieżka do punktu montowania nie może zostać przekonwertowana
+na prawidłową nazwę jednostki .mount:
+
+    @MOUNT_POINT@
+
+Zwykle oznacza to, że ścieżka do punktu montowania jest dłuższa niż dozwolona
+dla prawidłowych nazw jednostek.
+
+systemd dynamicznie syntetyzuje jednostki .mount dla wszystkich punktów
+montowania pojawiających się na komputerze. Stosowany do tego jest prosty
+algorytm: używana jest bezwzględna nazwa ścieżki ze wszystkimi znakami „/”
+zastąpionymi znakami „-” (początkowy jest usuwany). Co więcej, wszystkie
+niealfanumeryczne znaki (a także „:”, „-”, „_”, „.”, „\”) są zastępowane
+„\xNN”, gdzie „NN” jest szesnastkowym kodem znaki. Na końcu dołączany jest
+przyrostek „.mount”. Wynikowy ciąg musi mieć poniżej 256 znaków długości,
+aby był prawidłową nazwą jednostki. To ograniczenie obowiązuje, aby wszystkie
+nazwy jednostek mogły być używane także jako nazwy plików. Jeśli punkt
+montowania — po zastosowaniu algorytmu — jest dłuższy niż to ograniczenie,
+to nie może zostać zmapowany do jednostki. W takim przypadku systemd nie
+zsyntetyzuje jednostki i nie może być używany do zarządzania punktem
+montowania. Nie pojawi się w tabeli jednostek menedżera usług, przez co
+nie zostanie także bezpiecznie i automatycznie zdjęty podczas wyłączania
+komputera.
+
+Zasadniczo zalecane jest unikanie takich za długich ścieżek do punktów
+montowania, a jeśli są używane mimo to, zarządzanie nimi niezależnie
+od systemd, tzn. stawianie ich i automatyczne zdejmowanie podczas
+wyłączania komputera przez inne oprogramowanie.
+
+-- b480325f9c394a7b802c231e51a2752c
+Subject: Skonfigurowany jest szczególny użytkownik @OFFENDING_USER@, jest to niebezpieczne!
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: https://systemd.io/UIDS-GIDS
+
+Jednostka @UNIT@ jest skonfigurowana do używania User=@OFFENDING_USER@.
+
+Nie jest to bezpieczne. Głównym zastosowaniem użytkownika @OFFENDING_USER@
+w linuksowych systemach operacyjnych jest bycie właścicielem plików, których
+nie można w inny sposób zmapować do żadnego lokalnego użytkownika. Jest
+używany między innymi przez klienta NFS i przestrzenie nazw użytkowników
+Linuksa. Wykonywanie procesów jednostki pod tożsamością tego użytkownika
+może spowodować, że będą one miały dostęp do odczytu, a może nawet do zapisu,
+plików, których nie można zmapować w inny sposób.
+
+Mocno zalecane jest unikanie wykonywania usług pod tą tożsamością użytkownika,
+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=.
diff --git a/coccinelle/set_ensure_put.cocci b/coccinelle/set_ensure_put.cocci
new file mode 100644 (file)
index 0000000..92d7970
--- /dev/null
@@ -0,0 +1,18 @@
+@@
+local idexpression r;
+expression p, k, x;
+@@
+- r = set_ensure_allocated(&p, k);
+- if (r < 0)
+-   return ...;
+- r = set_put(p, x);
++ r = set_ensure_put(&p, k, x);
+@@
+local idexpression r;
+expression p, k, x;
+@@
+- r = set_ensure_allocated(p, k);
+- if (r < 0)
+-   return ...;
+- r = set_put(*p, x);
++ r = set_ensure_put(p, k, x);
index 6bb72e0faaa9608ab54ee310ad0b62e7f5b18a7b..803ba5440faffc6a3a76120fa9222dcd5e161505 100644 (file)
@@ -47,7 +47,7 @@ functionality. Here's why we think that it is not enough for our uses:
 
 * The various EFI implementations implement the boot order/boot item logic to different levels. Some firmware implementations do not offer a boot menu at all and instead unconditionally follow the EFI boot order, booting the first item that is working.
 * If the firmware setup is used to reset all data usually all EFI boot entries are lost, making the system entirely unbootable, as the firmware setups generally do not offer a UI to define additional boot items. By placing the menu item information on disk, it is always available, regardless if the BIOS setup data is lost.
-* Harddisk images should be moveable between machines and be bootable without requiring explicit EFI variables to be set. This also requires that the list of boot options is defined on disk, and not in EFI variables alone.
+* Harddisk images should be movable between machines and be bootable without requiring explicit EFI variables to be set. This also requires that the list of boot options is defined on disk, and not in EFI variables alone.
 * EFI is not universal yet (especially on non-x86 platforms), this specification is useful both for EFI and non-EFI boot loaders.
 * Many EFI systems disable USB support during early boot to optimize boot times, thus making keyboard input unavailable in the EFI menu. It is thus useful if the OS UI has a standardized way to discover available boot options which can be booted to.
 
index 12a0c993fc99f37eb224458983d4adc48a25f078..f335a1012ebe238c0a5520fd77c865a27debd1a0 100644 (file)
@@ -521,7 +521,7 @@ layout: default
   hence we might want to call it "big endian" right-away.
 
 - Please never use `dup()`. Use `fcntl(fd, F_DUPFD_CLOEXEC, 3)` instead. For
-  two reason: first, you want `O_CLOEXEC` set on the new `fd` (see
+  two reasons: first, you want `O_CLOEXEC` set on the new `fd` (see
   above). Second, `dup()` will happily duplicate your `fd` as 0, 1, 2,
   i.e. stdin, stdout, stderr, should those `fd`s be closed. Given the special
   semantics of those `fd`s, it's probably a good idea to avoid
index 064f6ef69bee143a83815861f28d0fbbd6b89114..7d7bb38ebd9f8773be0bf5d7c245e17628d607bd 100644 (file)
@@ -20,7 +20,7 @@ Following these guidelines makes it easier for us to process your issue, and ens
 ### Older downstream versions
 For older versions that are still supported by your distribution please use respective downstream tracker:
 * **Fedora** - [bugzilla](https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora&component=systemd)
-* **RHEL-7/CentOS-7** - [bugzilla](https://bugzilla.redhat.com/enter_bug.cgi?product=Red%20Hat%20Enterprise%20Linux%207&component=systemd) or [systemd-rhel github](https://github.com/lnykryn/systemd-rhel/issues)
+* **RHEL/CentOS** - [bugzilla](https://bugzilla.redhat.com/) or [systemd-rhel github](https://github.com/systemd-rhel/)
 * **Debian** - [bugs.debian.org](https://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=systemd)
 
 ## Security vulnerability reports
index b0ac5b824d6ccae00d27742fefea6f50165522b5..7c8331f9a9b419fce10fd6f113b942a76b4c280c 100644 (file)
@@ -64,7 +64,7 @@ desktop environments should adhere to the following conventions:
    is encouraged.
  * The RANDOM should be a string of random characters to ensure that multiple instances
  of the application can be launched.
- It can be ommitted in the case of a non-transient application services which can ensure
+ It can be omitted in the case of a non-transient application services which can ensure
  multiple instances are not spawned, such as a DBus activated application.
  * If no application ID is available, the launcher should generate a reasonable
    name when possible (e.g. using `basename(argv[0])`). This name must not
index d82aca70653209531e0098c064aa7d0365980df8..a3eabb7e635f87c88faa9e44cbb09340939cfa1b 100644 (file)
@@ -125,7 +125,7 @@ medium. (Moreover it allows to embed additional partitions later on, for
 example for allowing a multi-purpose USB stick that contains both a home
 directory and a generic storage volume.)
 
-Rationale for including the encrypted user record in the the LUKS2 header:
+Rationale for including the encrypted user record in the LUKS2 header:
 Linux kernel file system implementations are generally not robust towards
 maliciously formatted file systems; there's a good chance that file system
 images can be used as attack vectors, exploiting the kernel. Thus it is
index 8985f2761c8faa8c06aba80ea14527f424a3c74e..e59bbcce15c24283855f54ede139c71fe599846e 100644 (file)
@@ -36,7 +36,7 @@ interfaces are currently used by dracut and the ArchLinux initrds.
   optionally followed (in `argv[2]`, `argv[3]`, … systemd's original command
   line options, for example `--log-level=` and similar.
 
-* Storage daemons run from the initrd should follow the the guide on [systemd
+* Storage daemons run from the initrd should follow the guide on [systemd
   and Storage Daemons for the Root File
   System](https://systemd.io/ROOT_STORAGE_DAEMONS) to survive properly from the
   boot initrd all the way to the point where systemd jumps back into the initrd
diff --git a/docs/JOURNAL_FILE_FORMAT.md b/docs/JOURNAL_FILE_FORMAT.md
new file mode 100644 (file)
index 0000000..523ed62
--- /dev/null
@@ -0,0 +1,694 @@
+---
+title: Journal File Format
+category: Interfaces
+layout: default
+---
+
+# Journal File Format
+
+_Note that this document describes the binary on-disk format of journals
+only. For interfacing with web technologies there's the [Journal JSON
+Format](http://www.freedesktop.org/wiki/Software/systemd/json). For transfer
+of journal data across the network there's the [Journal Export
+Format](http://www.freedesktop.org/wiki/Software/systemd/export)._
+
+The systemd journal stores log data in a binary format with several features:
+
+* Fully indexed by all fields
+* Can store binary data, up to 2^64-1 in size
+* Seekable
+* Primarily append-based, hence robust to corruption
+* Support for in-line compression
+* Support for in-line Forward Secure Sealing
+
+This document explains the basic structure of the file format on disk. We are
+making this available primarily to allow review and provide documentation. Note
+that the actual implementation in the [systemd
+codebase](https://github.com/systemd/systemd/blob/master/src/journal/) is the
+only ultimately authoritative description of the format, so if this document
+and the code disagree, the code is right. That said we'll of course try hard to
+keep this document up-to-date and accurate.
+
+Instead of implementing your own reader or writer for journal files we ask you
+to use the [Journal's native C
+API](http://www.freedesktop.org/software/systemd/man/sd-journal.html) to access
+these files. It provides you with full access to the files, and will not
+withhold any data. If you find a limitation, please ping us and we might add
+some additional interfaces for you.
+
+If you need access to the raw journal data in serialized stream form without C
+API our recommendation is to make use of the [Journal Export
+Format](http://www.freedesktop.org/wiki/Software/systemd/export), which you can
+get via "journalctl -o export" or via systemd-journal-gatewayd. The export
+format is much simpler to parse, but complete and accurate. Due to its
+stream-based nature it is not indexed.
+
+_Or, to put this in other words: this low-level document is probably not what
+you want to use as base of your project. You want our [C
+API](http://www.freedesktop.org/software/systemd/man/sd-journal.html) instead!
+And if you really don't want the C API, then you want the [Journal Export
+Format](http://www.freedesktop.org/wiki/Software/systemd/export) instead! This
+document is primarily for your entertainment and education. Thank you!_
+
+This document assumes you have a basic understanding of the journal concepts,
+the properties of a journal entry and so on. If not, please go and read up,
+then come back! This is a good opportunity to read about the [basic properties
+of journal
+entries](http://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html),
+in particular realize that they may include binary non-text data (though
+usually don't), and the same field might have multiple values assigned within
+the same entry.
+
+This document describes the current format of systemd 246. The documented
+format is compatible with the format used in the first versions of the journal,
+but received various compatible and incompatible additions since.
+
+If you are wondering why the journal file format has been created in the first
+place instead of adopting an existing database implementation, please have a
+look [at this
+thread](https://lists.freedesktop.org/archives/systemd-devel/2012-October/007054.html).
+
+
+## Basics
+
+* All offsets, sizes, time values, hashes (and most other numeric values) are 64bit unsigned integers in LE format.
+* Offsets are always relative to the beginning of the file.
+* The 64bit hash function siphash24 is used for newer journal files. For older files [Jenkins lookup3](https://en.wikipedia.org/wiki/Jenkins_hash_function) is used, more specifically `jenkins_hashlittle2()` with the first 32bit integer it returns as higher 32bit part of the 64bit value, and the second one uses as lower 32bit part.
+* All structures are aligned to 64bit boundaries and padded to multiples of 64bit
+* The format is designed to be read and written via memory mapping using multiple mapped windows.
+* All time values are stored in usec since the respective epoch.
+* Wall clock time values are relative to the Unix time epoch, i.e. January 1st, 1970. (`CLOCK_REALTIME`)
+* Monotonic time values are always stored jointly with the kernel boot ID value (i.e. `/proc/sys/kernel/random/boot_id`) they belong to. They tend to be relative to the start of the boot, but aren't for containers. (`CLOCK_MONOTONIC`)
+* Randomized, unique 128bit IDs are used in various locations. These are generally UUID v4 compatible, but this is not a requirement.
+
+## General Rules
+
+If any kind of corruption is noticed by a writer it should immediately rotate
+the file and start a new one. No further writes should be attempted to the
+original file, but it should be left around so that as little data as possible
+is lost.
+
+If any kind of corruption is noticed by a reader it should try hard to handle
+this gracefully, such as skipping over the corrupted data, but allowing access
+to as much data around it as possible.
+
+A reader should verify all offsets and other data as it reads it. This includes
+checking for alignment and range of offsets in the file, especially before
+trying to read it via a memory map.
+
+A reader must interleave rotated and corrupted files as good as possible and
+present them as single stream to the user.
+
+All fields marked as "reserved" must be initialized with 0 when writing and be
+ignored on reading. They are currently not used but might be used later on.
+
+
+## Structure
+
+The file format's data structures are declared in
+[journal-def.h](https://github.com/systemd/systemd/blob/master/src/journal/journal-def.h).
+
+The file format begins with a header structure. After the header structure
+object structures follow. Objects are appended to the end as time
+progresses. Most data stored in these objects is not altered anymore after
+having been written once, with the exception of records necessary for
+indexing. When new data is appended to a file the writer first writes all new
+objects to the end of the file, and then links them up at front after that's
+done. Currently, seven different object types are known:
+
+```c
+enum {
+        OBJECT_UNUSED,
+        OBJECT_DATA,
+        OBJECT_FIELD,
+        OBJECT_ENTRY,
+        OBJECT_DATA_HASH_TABLE,
+        OBJECT_FIELD_HASH_TABLE,
+        OBJECT_ENTRY_ARRAY,
+        OBJECT_TAG,
+        _OBJECT_TYPE_MAX
+};
+```
+
+* A **DATA** object, which encapsulates the contents of one field of an entry, i.e. a string such as `_SYSTEMD_UNIT=avahi-daemon.service`, or `MESSAGE=Foobar made a booboo.` but possibly including large or binary data, and always prefixed by the field name and "=".
+* A **FIELD** object, which encapsulates a field name, i.e. a string such as `_SYSTEMD_UNIT` or `MESSAGE`, without any `=` or even value.
+* An **ENTRY** object, which binds several **DATA** objects together into a log entry.
+* A **DATA_HASH_TABLE** object, which encapsulates a hash table for finding existing **DATA** objects.
+* A **FIELD_HASH_TABLE** object, which encapsulates a hash table for finding existing **FIELD** objects.
+* An **ENTRY_ARRAY** object, which encapsulates a sorted array of offsets to entries, used for seeking by binary search.
+* A **TAG** object, consisting of an FSS sealing tag for all data from the beginning of the file or the last tag written (whichever is later).
+
+## Header
+
+The Header struct defines, well, you guessed it, the file header:
+
+```c
+_packed_ struct Header {
+        uint8_t signature[8]; /* "LPKSHHRH" */
+        le32_t compatible_flags;
+        le32_t incompatible_flags;
+        uint8_t state;
+        uint8_t reserved[7];
+        sd_id128_t file_id;
+        sd_id128_t machine_id;
+        sd_id128_t boot_id;    /* last writer */
+        sd_id128_t seqnum_id;
+        le64_t header_size;
+        le64_t arena_size;
+        le64_t data_hash_table_offset;
+        le64_t data_hash_table_size;
+        le64_t field_hash_table_offset;
+        le64_t field_hash_table_size;
+        le64_t tail_object_offset;
+        le64_t n_objects;
+        le64_t n_entries;
+        le64_t tail_entry_seqnum;
+        le64_t head_entry_seqnum;
+        le64_t entry_array_offset;
+        le64_t head_entry_realtime;
+        le64_t tail_entry_realtime;
+        le64_t tail_entry_monotonic;
+        /* Added in 187 */
+        le64_t n_data;
+        le64_t n_fields;
+        /* Added in 189 */
+        le64_t n_tags;
+        le64_t n_entry_arrays;
+        /* Added in 246 */
+        le64_t data_hash_chain_depth;
+        le64_t field_hash_chain_depth;
+};
+```
+
+The first 8 bytes of Journal files must contain the ASCII characters `LPKSHHRH`.
+
+If a writer finds that the **machine_id** of a file to write to does not match
+the machine it is running on it should immediately rotate the file and start a
+new one.
+
+When journal file is first created the **file_id** is randomly and uniquely
+initialized.
+
+When a writer opens a file it shall initialize the **boot_id** to the current
+boot id of the system.
+
+The currently used part of the file is the **header_size** plus the
+**arena_size** field of the header. If a writer needs to write to a file where
+the actual file size on disk is smaller than the reported value it shall
+immediately rotate the file and start a new one. If a writer is asked to write
+to a file with a header that is shorter than his own definition of the struct
+Header, he shall immediately rotate the file and start a new one.
+
+The **n_objects** field contains a counter for objects currently available in
+this file. As objects are appended to the end of the file this counter is
+increased.
+
+The first object in the file starts immediately after the header. The last
+object in the file is at the offset **tail_object_offset**, which may be 0 if
+no object is in the file yet.
+
+The **n_entries**, **n_data**, **n_fields**, **n_tags**, **n_entry_arrays** are
+counters of the objects of the specific types.
+
+**tail_entry_seqnum** and **head_entry_seqnum** contain the sequential number
+(see below) of the last or first entry in the file, respectively, or 0 if no
+entry has been written yet.
+
+**tail_entry_realtime** and **head_entry_realtime** contain the wallclock
+timestamp of the last or first entry in the file, respectively, or 0 if no
+entry has been written yet.
+
+**tail_entry_monotonic** is the monotonic timestamp of the last entry in the
+file, referring to monotonic time of the boot identified by **boot_id**.
+
+**data_hash_chain_depth** is a counter of the deepest chain in the data hash
+table, minus one. This is updated whenever a chain is found that is longer than
+the previous deepest chain found. Note that the counter is updated during hash
+table lookups, as the chains are traversed. This counter is used to determine
+when it is a good time to rotate the journal file, because hash collisions
+became too frequent.
+
+Similar, **field_hash_chain_depth** is a counter of the deepest chain in the
+field hash table, minus one.
+
+
+## Extensibility
+
+The format is supposed to be extensible in order to enable future additions of
+features. Readers should simply skip objects of unknown types as they read
+them. If a compatible feature extension is made a new bit is registered in the
+header's **compatible_flags** field. If a feature extension is used that makes
+the format incompatible a new bit is registered in the header's
+**incompatible_flags** field. Readers should check these two bit fields, if
+they find a flag they don't understand in compatible_flags they should continue
+to read the file, but if they find one in **incompatible_flags** they should
+fail, asking for an update of the software. Writers should refuse writing if
+there's an unknown bit flag in either of these fields.
+
+The file header may be extended as new features are added. The size of the file
+header is stored in the header. All header fields up to **n_data** are known to
+unconditionally exist in all revisions of the file format, all fields starting
+with **n_data** needs to be explicitly checked for via a size check, since they
+were additions after the initial release.
+
+Currently only five extensions flagged in the flags fields are known:
+
+```c
+enum {
+        HEADER_INCOMPATIBLE_COMPRESSED_XZ   = 1 << 0,
+        HEADER_INCOMPATIBLE_COMPRESSED_LZ4  = 1 << 1,
+        HEADER_INCOMPATIBLE_KEYED_HASH      = 1 << 2,
+        HEADER_INCOMPATIBLE_COMPRESSED_ZSTD = 1 << 3,
+};
+
+enum {
+        HEADER_COMPATIBLE_SEALED = 1 << 0,
+};
+```
+
+HEADER_INCOMPATIBLE_COMPRESSED_XZ indicates that the file includes DATA objects
+that are compressed using XZ. Similarly, HEADER_INCOMPATIBLE_COMPRESSED_LZ4
+indicates that the file includes DATA objects that are compressed with the LZ4
+algorithm. And HEADER_INCOMPATIBLE_COMPRESSED_ZSTD indicates that there are
+objects compressed with ZSTD.
+
+HEADER_INCOMPATIBLE_KEYED_HASH indicates that instead of the unkeyed Jenkins
+hash function the keyed siphash24 hash function is used for the two hash
+tables, see below.
+
+HEADER_COMPATIBLE_SEALED indicates that the file includes TAG objects required
+for Forward Secure Sealing.
+
+
+## Dirty Detection
+
+```c
+enum {
+        STATE_OFFLINE = 0,
+        STATE_ONLINE = 1,
+        STATE_ARCHIVED = 2,
+        _STATE_MAX
+};
+```
+
+If a file is opened for writing the **state** field should be set to
+STATE_ONLINE. If a file is closed after writing the **state** field should be
+set to STATE_OFFLINE. After a file has been rotated it should be set to
+STATE_ARCHIVED. If a writer is asked to write to a file that is not in
+STATE_OFFLINE it should immediately rotate the file and start a new one,
+without changing the file.
+
+After and before the state field is changed `fdatasync()` should be executed on
+the file to ensure the dirty state hits disk.
+
+
+## Sequence Numbers
+
+All entries carry sequence numbers that are monotonically counted up for each
+entry (starting at 1) and are unique among all files which carry the same
+**seqnum_id** field. This field is randomly generated when the journal daemon
+creates its first file. All files generated by the same journal daemon instance
+should hence carry the same seqnum_id. This should guarantee a monotonic stream
+of sequential numbers for easy interleaving even if entries are distributed
+among several files, such as the system journal and many per-user journals.
+
+
+## Concurrency
+
+The file format is designed to be usable in a simultaneous
+single-writer/multiple-reader scenario. The synchronization model is very weak
+in order to facilitate storage on the most basic of file systems (well, the
+most basic ones that provide us with `mmap()` that is), and allow good
+performance. No file locking is used. The only time where disk synchronization
+via `fdatasync()` should be enforced is after and before changing the **state**
+field in the file header (see below). It is recommended to execute a memory
+barrier after appending and initializing new objects at the end of the file,
+and before linking them up in the earlier objects.
+
+This weak synchronization model means that it is crucial that readers verify
+the structural integrity of the file as they read it and handle invalid
+structure gracefully. (Checking what you read is a pretty good idea out of
+security considerations anyway.) This specifically includes checking offset
+values, and that they point to valid objects, with valid sizes and of the type
+and hash value expected. All code must be written with the fact in mind that a
+file with inconsistent structure might just be inconsistent temporarily, and
+might become consistent later on. Payload OTOH requires less scrutiny, as it
+should only be linked up (and hence visible to readers) after it was
+successfully written to memory (though not necessarily to disk). On non-local
+file systems it is a good idea to verify the payload hashes when reading, in
+order to avoid annoyances with `mmap()` inconsistencies.
+
+Clients intending to show a live view of the journal should use `inotify()` for
+this to watch for files changes. Since file writes done via `mmap()` do not
+result in `inotify()` writers shall truncate the file to its current size after
+writing one or more entries, which results in inotify events being
+generated. Note that this is not used as a transaction scheme (it doesn't
+protect anything), but merely for triggering wakeups.
+
+Note that inotify will not work on network file systems if reader and writer
+reside on different hosts. Readers which detect they are run on journal files
+on a non-local file system should hence not rely on inotify for live views but
+fall back to simple time based polling of the files (maybe recheck every 2s).
+
+
+## Objects
+
+All objects carry a common header:
+
+```c
+enum {
+        OBJECT_COMPRESSED_XZ   = 1 << 0,
+        OBJECT_COMPRESSED_LZ4  = 1 << 1,
+        OBJECT_COMPRESSED_ZSTD = 1 << 2,
+};
+
+_packed_ struct ObjectHeader {
+        uint8_t type;
+        uint8_t flags;
+        uint8_t reserved[6];
+        le64_t size;
+        uint8_t payload[];
+};
+```
+
+The **type** field is one of the object types listed above. The **flags** field
+currently knows three flags: OBJECT_COMPRESSED_XZ, OBJECT_COMPRESSED_LZ4 and
+OBJECT_COMPRESSED_ZSTD. It is only valid for DATA objects and indicates that
+the data payload is compressed with XZ/LZ4/ZSTD. If one of the
+OBJECT_COMPRESSED_* flags is set for an object then the matching
+HEADER_INCOMPATIBLE_COMPRESSED_XZ/HEADER_INCOMPATIBLE_COMPRESSED_LZ4/HEADER_INCOMPATIBLE_COMPRESSED_ZSTD
+flag must be set for the file as well. At most one of these three bits may be
+set. The **size** field encodes the size of the object including all its
+headers and payload.
+
+
+## Data Objects
+
+```c
+_packed_ struct DataObject {
+        ObjectHeader object;
+        le64_t hash;
+        le64_t next_hash_offset;
+        le64_t next_field_offset;
+        le64_t entry_offset; /* the first array entry we store inline */
+        le64_t entry_array_offset;
+        le64_t n_entries;
+        uint8_t payload[];
+};
+```
+
+Data objects carry actual field data in the **payload[]** array, including a
+field name, a `=` and the field data. Example:
+`_SYSTEMD_UNIT=foobar.service`. The **hash** field is a hash value of the
+payload. If the `HEADER_INCOMPATIBLE_KEYED_HASH` flag is set in the file header
+this is the siphash24 hash value of the payload, keyed by the file ID as stored
+in the **file_id** field of the file header. If the flag is not set it is the
+non-keyed Jenkins hash of the payload instead. The keyed hash is preferred as
+it makes the format more robust against attackers that want to trigger hash
+collisions in the hash table.
+
+**next_hash_offset** is used to link up DATA objects in the DATA_HASH_TABLE if
+a hash collision happens (in a singly linked list, with an offset of 0
+indicating the end). **next_field_offset** is used to link up data objects with
+the same field name from the FIELD object of the field used.
+
+**entry_offset** is an offset to the first ENTRY object referring to this DATA
+object. **entry_array_offset** is an offset to an ENTRY_ARRAY object with
+offsets to other entries referencing this DATA object. Storing the offset to
+the first ENTRY object in-line is an optimization given that many DATA objects
+will be referenced from a single entry only (for example, `MESSAGE=` frequently
+includes a practically unique string). **n_entries** is a counter of the total
+number of ENTRY objects that reference this object, i.e. the sum of all
+ENTRY_ARRAYS chained up from this object, plus 1.
+
+The **payload[]** field contains the field name and date unencoded, unless
+OBJECT_COMPRESSED_XZ/OBJECT_COMPRESSED_LZ4/OBJECT_COMPRESSED_ZSTD is set in the
+`ObjectHeader`, in which case the payload is compressed with the indicated
+compression algorithm.
+
+
+## Field Objects
+
+```c
+_packed_ struct FieldObject {
+        ObjectHeader object;
+        le64_t hash;
+        le64_t next_hash_offset;
+        le64_t head_data_offset;
+        uint8_t payload[];
+};
+```
+
+Field objects are used to enumerate all possible values a certain field name
+can take in the entire journal file.
+
+The **payload[]** array contains the actual field name, without '=' or any
+field value. Example: `_SYSTEMD_UNIT`. The **hash** field is a hash value of
+the payload. As for the DATA objects, this too is either the `.file_id` keyed
+siphash24 hash of the payload, or the non-keyed Jenkins hash.
+
+**next_hash_offset** is used to link up FIELD objects in the FIELD_HASH_TABLE
+if a hash collision happens (in singly linked list, offset 0 indicating the
+end). **head_data_offset** points to the first DATA object that shares this
+field name. It is the head of a singly linked list using DATA's
+**next_field_offset** offset.
+
+
+## Entry Objects
+
+```
+_packed_ struct EntryItem {
+        le64_t object_offset;
+        le64_t hash;
+};
+
+_packed_ struct EntryObject {
+        ObjectHeader object;
+        le64_t seqnum;
+        le64_t realtime;
+        le64_t monotonic;
+        sd_id128_t boot_id;
+        le64_t xor_hash;
+        EntryItem items[];
+};
+```
+
+An ENTRY object binds several DATA objects together into one log entry, and
+includes other metadata such as various timestamps.
+
+The **seqnum** field contains the sequence number of the entry, **realtime**
+the realtime timestamp, and **monotonic** the monotonic timestamp for the boot
+identified by **boot_id**.
+
+The **xor_hash** field contains a binary XOR of the hashes of the payload of
+all DATA objects referenced by this ENTRY. This value is usable to check the
+contents of the entry, being independent of the order of the DATA objects in
+the array. Note that even for files that have the
+`HEADER_INCOMPATIBLE_KEYED_HASH` flag set (and thus siphash24 the otherwise
+used hash function) the hash function used for this field, as singular
+exception, is the Jenkins lookup3 hash function. The XOR hash value is used to
+quickly compare the contents of two entries, and to define a well-defined order
+between two entries that otherwise have the same sequence numbers and
+timestamps.
+
+The **items[]** array contains references to all DATA objects of this entry,
+plus their respective hashes (which are calculated the same way as in the DATA
+objects, i.e. keyed by the file ID).
+
+In the file ENTRY objects are written ordered monotonically by sequence
+number. For continuous parts of the file written during the same boot
+(i.e. with the same boot_id) the monotonic timestamp is monotonic too. Modulo
+wallclock time jumps (due to incorrect clocks being corrected) the realtime
+timestamps are monotonic too.
+
+
+## Hash Table Objects
+
+```c
+_packed_ struct HashItem {
+        le64_t head_hash_offset;
+        le64_t tail_hash_offset;
+};
+
+_packed_ struct HashTableObject {
+        ObjectHeader object;
+        HashItem items[];
+};
+```
+
+The structure of both DATA_HASH_TABLE and FIELD_HASH_TABLE objects are
+identical. They implement a simple hash table, which each cell containing
+offsets to the head and tail of the singly linked list of the DATA and FIELD
+objects, respectively. DATA's and FIELD's next_hash_offset field are used to
+chain up the objects. Empty cells have both offsets set to 0.
+
+Each file contains exactly one DATA_HASH_TABLE and one FIELD_HASH_TABLE
+objects. Their payload is directly referred to by the file header in the
+**data_hash_table_offset**, **data_hash_table_size**,
+**field_hash_table_offset**, **field_hash_table_size** fields. These offsets do
+_not_ point to the object headers but directly to the payloads. When a new
+journal file is created the two hash table objects need to be created right
+away as first two objects in the stream.
+
+If the hash table fill level is increasing over a certain fill level (Learning
+from Java's Hashtable for example: > 75%), the writer should rotate the file
+and create a new one.
+
+The DATA_HASH_TABLE should be sized taking into account to the maximum size the
+file is expected to grow, as configured by the administrator or disk space
+considerations. The FIELD_HASH_TABLE should be sized to a fixed size; the
+number of fields should be pretty static as it depends only on developers'
+creativity rather than runtime parameters.
+
+
+## Entry Array Objects
+
+
+```c
+_packed_ struct EntryArrayObject {
+        ObjectHeader object;
+        le64_t next_entry_array_offset;
+        le64_t items[];
+};
+```
+
+Entry Arrays are used to store a sorted array of offsets to entries. Entry
+arrays are strictly sorted by offsets on disk, and hence by their timestamps
+and sequence numbers (with some restrictions, see above).
+
+Entry Arrays are chained up. If one entry array is full another one is
+allocated and the **next_entry_array_offset** field of the old one pointed to
+it. An Entry Array with **next_entry_array_offset** set to 0 is the last in the
+list. To optimize allocation and seeking, as entry arrays are appended to a
+chain of entry arrays they should increase in size (double).
+
+Due to being monotonically ordered entry arrays may be searched with a binary
+search (bisection).
+
+One chain of entry arrays links up all entries written to the journal. The
+first entry array is referenced in the **entry_array_offset** field of the
+header.
+
+Each DATA object also references an entry array chain listing all entries
+referencing a specific DATA object. Since many DATA objects are only referenced
+by a single ENTRY the first offset of the list is stored inside the DATA object
+itself, an ENTRY_ARRAY object is only needed if it is referenced by more than
+one ENTRY.
+
+
+## Tag Object
+
+```c
+#define TAG_LENGTH (256/8)
+
+_packed_ struct TagObject {
+        ObjectHeader object;
+        le64_t seqnum;
+        le64_t epoch;
+        uint8_t tag[TAG_LENGTH]; /* SHA-256 HMAC */
+};
+```
+
+Tag objects are used to seal off the journal for alteration. In regular
+intervals a tag object is appended to the file. The tag object consists of a
+SHA-256 HMAC tag that is calculated from the objects stored in the file since
+the last tag was written, or from the beginning if no tag was written yet. The
+key for the HMAC is calculated via the externally maintained FSPRG logic for
+the epoch that is written into **epoch**. The sequence number **seqnum** is
+increased with each tag. When calculating the HMAC of objects header fields
+that are volatile are excluded (skipped). More specifically all fields that
+might validly be altered to maintain a consistent file structure (such as
+offsets to objects added later for the purpose of linked lists and suchlike)
+after an object has been written are not protected by the tag. This means a
+verifier has to independently check these fields for consistency of
+structure. For the fields excluded from the HMAC please consult the source code
+directly. A verifier should read the file from the beginning to the end, always
+calculating the HMAC for the objects it reads. Each time a tag object is
+encountered the HMAC should be verified and restarted. The tag object sequence
+numbers need to increase strictly monotonically. Tag objects themselves are
+partially protected by the HMAC (i.e. seqnum and epoch is included, the tag
+itself not).
+
+
+## Algorithms
+
+### Reading
+
+Given an offset to an entry all data fields are easily found by following the
+offsets in the data item array of the entry.
+
+Listing entries without filter is done by traversing the list of entry arrays
+starting with the headers' **entry_array_offset** field.
+
+Seeking to an entry by timestamp or sequence number (without any matches) is
+done via binary search in the entry arrays starting with the header's
+**entry_array_offset** field. Since these arrays double in size as more are
+added the time cost of seeking is O(log(n)*log(n)) if n is the number of
+entries in the file.
+
+When seeking or listing with one field match applied the DATA object of the
+match is first identified, and then its data entry array chain traversed. The
+time cost is the same as for seeks/listings with no match.
+
+If multiple matches are applied, multiple chains of entry arrays should be
+traversed in parallel. Since they all are strictly monotonically ordered by
+offset of the entries, advancing in one can be directly applied to the others,
+until an entry matching all matches is found. In the worst case seeking like
+this is O(n) where n is the number of matching entries of the "loosest" match,
+but in the common case should be much more efficient at least for the
+well-known fields, where the set of possible field values tend to be closely
+related. Checking whether an entry matches a number of matches is efficient
+since the item array of the entry contains hashes of all data fields
+referenced, and the number of data fields of an entry is generally small (<
+30).
+
+When interleaving multiple journal files seeking tends to be a frequently used
+operation, but in this case can be effectively suppressed by caching results
+from previous entries.
+
+When listing all possible values a certain field can take it is sufficient to
+look up the FIELD object and follow the chain of links to all DATA it includes.
+
+### Writing
+
+When an entry is appended to the journal for each of its data fields the data
+hash table should be checked. If the data field does not yet exist in the file
+it should be appended and added to the data hash table. When a field data
+object is added the field hash table should be checked for the field name of
+the data field, and a field object be added if necessary. After all data fields
+(and recursively all field names) of the new entry are appended and linked up
+in the hashtables the entry object should be appended and linked up too.
+
+In regular intervals a tag object should be written if sealing is enabled (see
+above). Before the file is closed a tag should be written too, to seal it off.
+
+Before writing an object, time and disk space limits should be checked and
+rotation triggered if necessary.
+
+
+## Optimizing Disk IO
+
+_A few general ideas to keep in mind:_
+
+The hash tables for looking up fields and data should be quickly in the memory
+cache and not hurt performance. All entries and entry arrays are ordered
+strictly by time on disk, and hence should expose an OK access pattern on
+rotating media, when read sequentially (which should be the most common case,
+given the nature of log data).
+
+The disk access patterns of the binary search for entries needed for seeking
+are problematic on rotating disks. This should not be a major issue though,
+since seeking should not be a frequent operation.
+
+When reading, collecting data fields for presenting entries to the user is
+problematic on rotating disks. In order to optimize these patterns the item
+array of entry objects should be sorted by disk offset before
+writing. Effectively, frequently used data objects should be in the memory
+cache quickly. Non-frequently used data objects are likely to be located
+between the previous and current entry when reading and hence should expose an
+OK access pattern. Problematic are data objects that are neither frequently nor
+infrequently referenced, which will cost seek time.
+
+And that's all there is to it.
+
+Thanks for your interest!
index 064932970ffd64b43050c15363f6063ea5ca973c..4b138b593c1442b4d670b0a54192e6c31ceca60c 100644 (file)
@@ -98,7 +98,7 @@ And now, here's the list of (hopefully) all APIs that we have introduced with sy
 | [Unit file format](https://www.freedesktop.org/software/systemd/man/systemd.unit.html) | File format | yes | yes | numerous | no | - | no |
 | [Network](https://www.freedesktop.org/software/systemd/man/systemd.network.html) & [Netdev file format](https://www.freedesktop.org/software/systemd/man/systemd.netdev.html) | File format | yes | yes | no | no | - | no |
 | [Link file format](https://www.freedesktop.org/software/systemd/man/systemd.link.html) | File format | yes | yes | no | no | - | no |
-| [Journal File Format](https://www.freedesktop.org/wiki/Software/systemd/journal-files) | File format | yes | yes | - | maybe | - | no |
+| [Journal File Format](https://systemd.io/JOURNAL_FILE_FORMAT) | File format | yes | yes | - | maybe | - | no |
 | [Journal Export Format](https://www.freedesktop.org/wiki/Software/systemd/export) | File format | yes | yes | - | yes | - | no |
 | [Cooperation in cgroup tree](https://www.freedesktop.org/wiki/Software/systemd/PaxControlGroups) | Treaty | yes | yes | libvirt | yes | libvirt | no |
 | [Password Agents](https://www.freedesktop.org/wiki/Software/systemd/PasswordAgents) | Socket+Files | yes | yes | - | yes | - | no |
index d3b68e967aa09d85c42633eca23cf8770610f10e..da3fe40baad1418683e64cab1c245d087738e31b 100644 (file)
@@ -118,7 +118,7 @@ requires random numbers as well, including for the following uses:
 
 * systemd maintains various hash tables internally. In order to harden them
   against [collision
-  attacks](https://rt.perl.org/Public/Bug/Display.html?CSRF_Token=165691af9ddaa95f653402f1b68de728)
+  attacks](https://www.cs.auckland.ac.nz/~mcw/Teaching/refs/misc/denial-of-service.pdf)
   they are seeded with random numbers.
 
 * At various places systemd needs random bytes for temporary file name
@@ -212,10 +212,10 @@ boot, in order to ensure the entropy pool is filled up quickly.
    random-seed`](https://www.freedesktop.org/software/systemd/man/bootctl.html#random-seed))
    a seed file with an initial seed is placed in a file `/loader/random-seed`
    in the ESP. In addition, an identically sized randomized EFI variable called
-   the the 'system token' is set, which is written to the machine's firmware
-   NVRAM. During boot, when `systemd-boot` finds both the random seed file and
-   the system token they are combined and hashed with SHA256 (in counter mode,
-   to generate sufficient data), to generate a new random seed file to store in
+   the 'system token' is set, which is written to the machine's firmware NVRAM.
+   During boot, when `systemd-boot` finds both the random seed file and the
+   system token they are combined and hashed with SHA256 (in counter mode, to
+   generate sufficient data), to generate a new random seed file to store in
    the ESP as well as a random seed to pass to the OS kernel. The new random
    seed file for the ESP is then written to the ESP, ensuring this is completed
    before the OS is invoked. Very early during initialization PID 1 will read
@@ -257,7 +257,16 @@ boot, in order to ensure the entropy pool is filled up quickly.
    file. If done, `systemd-boot` will use the random seed file even if no
    system token is found in EFI variables.
 
-With the three mechanisms described above it should be possible to provide
+4. A kernel command line option `systemd.random_seed=` may be used to pass in a
+   base64 encoded seed to initialize the kernel's entropy pool from during
+   early service manager initialization. This option is only safe in testing
+   environments, as the random seed passed this way is accessible to
+   unprivileged programs via `/proc/cmdline`. Using this option outside of
+   testing environments is a security problem since cryptographic key material
+   derived from the entropy pool initialized with a seed accessible to
+   unprivileged programs should not be considered secret.
+
+With the four mechanisms described above it should be possible to provide
 early-boot entropy in most cases. Specifically:
 
 1. On EFI systems, `systemd-boot`'s random seed logic should make sure good
@@ -267,7 +276,8 @@ early-boot entropy in most cases. Specifically:
 2. On virtualized systems, the early `virtio-rng` hookup should ensure entropy
    is available early on — as long as the VM environment provides virtualized
    RNG devices, which they really should all do in 2019. Complain to your
-   hosting provider if they don't.
+   hosting provider if they don't. For VMs used in testing environments,
+   `systemd.random_seed=` may be used as an alternative to a virtualized RNG.
 
 3. On Intel/AMD systems systemd's own reliance on the kernel entropy pool is
    minimal (as RDRAND is used on those for UUID generation). This only works if
@@ -286,8 +296,9 @@ This primarily leaves two kind of systems in the cold:
    boot. Alternatively, consider implementing a solution similar to
    systemd-boot's random seed concept in your platform's boot loader.
 
-2. Virtualized environments that lack both virtio-rng and RDRAND. Tough
-   luck. Talk to your hosting provider, and ask them to fix this.
+2. Virtualized environments that lack both virtio-rng and RDRAND, outside of
+   test environments. Tough luck. Talk to your hosting provider, and ask them
+   to fix this.
 
 3. Also note: if you deploy an image without any random seed and/or without
    installing any 'system token' in an EFI variable, as described above, this
@@ -410,6 +421,10 @@ This primarily leaves two kind of systems in the cold:
     information to possibly gain too much information about the current state
     of the kernel's entropy pool.
 
+    That said, we actually do implement this with the `systemd.random_seed=`
+    kernel command line option. Don't use this outside of testing environments,
+    however, for the aforementioned reasons.
+
 12. *Why doesn't `systemd-boot` rewrite the 'system token' too each time
     when updating the random seed file stored in the ESP?*
 
index f8282752973f6a0fc93e27abdf5ef7aaa72e6957..19944d08b804104c5ab69d13c1463fc9c01bd53a 100644 (file)
@@ -159,6 +159,9 @@ All execution-related settings are available for transient units.
 ✓ RestrictRealtime=
 ✓ RestrictSUIDSGID=
 ✓ RestrictAddressFamilies=
+✓ RootHash=
+✓ RootHashSignature=
+✓ RootVerity=
 ✓ LockPersonality=
 ✓ LimitCPU=
 ✓ LimitFSIZE=
@@ -285,37 +288,39 @@ All process killing settings are available for transient units:
 Most service unit settings are available for transient units.
 
 ```
-✓ PIDFile=
+✓ BusName=
 ✓ ExecCondition=
-✓ ExecStartPre=
+✓ ExecReload=
 ✓ ExecStart=
 ✓ ExecStartPost=
-✓ ExecReload=
+✓ ExecStartPre=
 ✓ ExecStop=
 ✓ ExecStopPost=
-✓ RestartSec=
-✓ TimeoutStartSec=
-✓ TimeoutStopSec=
-✓ TimeoutAbortSec=
-✓ TimeoutSec=
-✓ RuntimeMaxSec=
-✓ WatchdogSec=
-✓ Type=
-✓ Restart=
-✓ RootDirectoryStartOnly=
-✓ RemainAfterExit=
+✓ FileDescriptorStoreMax=
 ✓ GuessMainPID=
-✓ RestartPreventExitStatus=
-✓ RestartForceExitStatus=
-✓ SuccessExitStatus=
 ✓ NonBlocking=
-✓ BusName=
-✓ FileDescriptorStoreMax=
 ✓ NotifyAccess=
+✓ OOMPolicy=
+✓ PIDFile=
+✓ RemainAfterExit=
+✓ Restart=
+✓ RestartForceExitStatus=
+✓ RestartPreventExitStatus=
+✓ RestartSec=
+✓ RootDirectoryStartOnly=
+✓ RuntimeMaxSec=
   Sockets=
+✓ SuccessExitStatus=
+✓ TimeoutAbortSec=
+✓ TimeoutSec=
+✓ TimeoutStartFailureMode=
+✓ TimeoutStartSec=
+✓ TimeoutStopFailureMode=
+✓ TimeoutStopSec=
+✓ Type=
 ✓ USBFunctionDescriptors=
 ✓ USBFunctionStrings=
-✓ OOMPolicy=
+✓ WatchdogSec=
 ```
 
 ## Mount Unit Settings
index 50ac8355216bbca2fd604e0d7620eeef604c7d42..ec07b19f306b44b17332fac374e7ba022742d5c8 100644 (file)
@@ -68,9 +68,9 @@ Distilled from the above, below are the rules systemd enforces on user/group
 names. An additional, common rule between both modes listed below is that empty
 strings are not valid user/group names.
 
-Philosophically, the strict mode described below enforces a white-list of what's
-allowed and prohibits everything else, while the relaxed mode described below
-implements a blacklist of what's not allowed and permits everything else.
+Philosophically, the strict mode described below enforces an allow list of
+what's allowed and prohibits everything else, while the relaxed mode described
+below implements a deny list of what's not allowed and permits everything else.
 
 ### Strict mode
 
index 7b6fe47665ae1825d9ed95f0c020795142d28b0b..f6d22c217b0026dfd6f3a4cf83b05800b9f3322e 100644 (file)
@@ -180,7 +180,7 @@ strictly local context and without signatures doesn't have to deal with the
 `perMachine` or `binding` sections and can include its data exclusively in the
 regular section. A service that uses a separate, private channel for
 authenticating users (or that doesn't have a concept of authentication at all)
-does not need to to be concerned with the `secret` section of user records, as
+does not need to be concerned with the `secret` section of user records, as
 the fields included therein are only useful when executing authentication
 operations natively against JSON user records.
 
@@ -368,11 +368,11 @@ directory is first created, and defaults to `/etc/skel` if not defined.
 access mask for the home directory when it is first created.
 
 `tasksMax` → Takes an unsigned 64bit integer indicating the maximum number of
-tasks the user may start in parallel during system runtime. This value is
-enforced on all tasks (i.e. processes and threads) the user starts or that are
-forked off these processes regardless if the change user identity (for example
-by setuid binaries/`su`/`sudo` and
-similar). [`systemd-logind.service`](https://www.freedesktop.org/software/systemd/man/systemd-logind.service.html)
+tasks the user may start in parallel during system runtime. This counts
+all tasks (i.e. threads, where each process is at least one thread) the user starts or that are
+forked from these processes even if the user identity is changed (for example
+by setuid binaries/`su`/`sudo` and similar).
+[`systemd-logind.service`](https://www.freedesktop.org/software/systemd/man/systemd-logind.service.html)
 enforces this by setting the `TasksMax` slice property for the user's slice
 `user-$UID.slice`.
 
@@ -546,6 +546,11 @@ below). It's undefined how precise the URI is: during log-in it is tested
 against all plugged in security tokens and if there's exactly one matching
 private key found with it it is used.
 
+`fido2HmacCredential` → An array of strings, each with a Base64-encoded FIDO2
+credential ID that shell be used for authentication with FIDO2 devices that
+implement the `hmac-secret` extension. The salt to pass to the FIDO2 device is
+found in `fido2HmacSalt`.
+
 `privileged` → An object, which contains the fields of the `privileged` section
 of the user record, see below.
 
@@ -594,7 +599,7 @@ as the lines in the traditional `~/.ssh/authorized_key` file.
 
 `pkcs11EncryptedKey` → An array of objects. Each element of the array should be
 an object consisting of three string fields: `uri` shall contain a PKCS#11
-security token URI, `data` shall contain a Base64 encoded encrypted key and
+security token URI, `data` shall contain a Base64-encoded encrypted key and
 `hashedPassword` shall contain a UNIX password hash to test the key
 against. Authenticating with a security token against this account shall work
 as follows: the encrypted secret key is converted from its Base64
@@ -602,13 +607,29 @@ representation into binary, then decrypted with the PKCS#11 `C_Decrypt()`
 function of the PKCS#11 module referenced by the specified URI, using the
 private key found on the same token. The resulting decrypted key is then
 Base64-encoded and tested against the specified UNIX hashed password. The
-Base64-enceded decrypted key may also be used to unlock further resources
+Base64-encoded decrypted key may also be used to unlock further resources
 during log-in, for example the LUKS or `fscrypt` storage backend. It is
 generally recommended that for each entry in `pkcs11EncryptedKey` there's also
 a matching one in `pkcs11TokenUri` and vice versa, with the same URI, appearing
 in the same order, but this should not be required by applications processing
 user records.
 
+`fido2HmacSalt` → An array of objects, implementing authentication support with
+FIDO2 devices that implement the `hmac-secret` extension. Each element of the
+array should be an object consisting of three string fields: `credential`,
+`salt`, `hashedPassword`. The first two shall contain Base64-encoded binary
+data: the FIDO2 credential ID and the salt value to pass to the FIDO2
+device. During authentication this salt along with the credential ID is sent to
+the FIDO2 token, which will HMAC hash the salt with its internal secret key and
+return the result. This resulting binary key should then be Base64-encoded and
+used as string password for the further layers of the stack. The
+`hashedPassword` field of the `fido2HmacSalt` field shall be a UNIX password
+hash to test this derived secret key against for authentication. It is
+generally recommended that for each entry in `fido2HmacSalt` there's also a
+matching one in `fido2HmacCredential`, and vice versa, with the same credential
+ID, appearing in the same order, but this should not be required by
+applications processing user records.
+
 ## Fields in the `perMachine` section
 
 As mentioned, the `perMachine` section contains settings that shall apply to
@@ -652,13 +673,13 @@ that may be used in this section are identical to the equally named ones in the
 `mountNoDevices`, `mountNoSuid`, `mountNoExecute`, `cifsDomain`,
 `cifsUserName`, `cifsService`, `imagePath`, `uid`, `gid`, `memberOf`,
 `fileSystemType`, `partitionUuid`, `luksUuid`, `fileSystemUuid`, `luksDiscard`,
-`luksOfflineDiscard`, `luksOfflineDiscard`, `luksCipher`, `luksCipherMode`,
-`luksVolumeKeySize`, `luksPbkdfHashAlgorithm`, `luksPbkdfType`,
-`luksPbkdfTimeCostUSec`, `luksPbkdfMemoryCost`, `luksPbkdfParallelThreads`,
-`rateLimitIntervalUSec`, `rateLimitBurst`, `enforcePasswordPolicy`,
-`autoLogin`, `stopDelayUSec`, `killProcesses`, `passwordChangeMinUSec`,
-`passwordChangeMaxUSec`, `passwordChangeWarnUSec`,
-`passwordChangeInactiveUSec`, `passwordChangeNow`, `pkcs11TokenUri`.
+`luksOfflineDiscard`, `luksCipher`, `luksCipherMode`, `luksVolumeKeySize`,
+`luksPbkdfHashAlgorithm`, `luksPbkdfType`, `luksPbkdfTimeCostUSec`,
+`luksPbkdfMemoryCost`, `luksPbkdfParallelThreads`, `rateLimitIntervalUSec`,
+`rateLimitBurst`, `enforcePasswordPolicy`, `autoLogin`, `stopDelayUSec`,
+`killProcesses`, `passwordChangeMinUSec`, `passwordChangeMaxUSec`,
+`passwordChangeWarnUSec`, `passwordChangeInactiveUSec`, `passwordChangeNow`,
+`pkcs11TokenUri`, `fido2HmacCredential`.
 
 ## Fields in the `binding` section
 
@@ -810,7 +831,7 @@ public key.
 The `signature` field in the top-level user record object is an array of
 objects. Each object encapsulates one signature and has two fields: `data` and
 `key` (both are strings). The `data` field contains the actual signature,
-encoded in base64, the `key` field contains a copy of the public key whose
+encoded in Base64, the `key` field contains a copy of the public key whose
 private key was used to make the signature, in PEM format. Currently only
 signatures with Ed25519 keys are defined.
 
@@ -864,13 +885,20 @@ The `secret` field of the top-level user record contains the following fields:
 
 `password` → an array of strings, each containing a plain text password.
 
-`pkcs11Pin` → an array of strings, each containing a plain text PIN, suitable
-for unlocking PKCS#11 security tokens that require that.
+`tokenPin` → an array of strings, each containing a plain text PIN, suitable
+for unlocking security tokens that require that. (The field `pkcs11Pin` should
+be considered a compatibility alias for this field, and merged with `tokenPin`
+in case both are set.)
 
 `pkcs11ProtectedAuthenticationPathPermitted` → a boolean. If set to true allows
 the receiver to use the PKCS#11 "protected authentication path" (i.e. a
 physical button/touch element on the security token) for authenticating the
-user. If false or unset authentication this way shall not be attempted.
+user. If false or unset, authentication this way shall not be attempted.
+
+`fido2UserPresencePermitted` → a boolean. If set to true allows the receiver to
+use the FIDO2 "user presence" flag. This is similar to the concept of
+`pkcs11ProtectedAuthenticationPathPermitted`, but exposes the FIDO2 concept
+behind it. If false or unset authentication this way shall not be attempted.
 
 ## Mapping to `struct passwd` and `struct spwd`
 
index 15afdaf71951b0f5830c9071b9cbea480a4e7c56..b9819f28d7401502cc8dae98e5d90f4674361aca 100644 (file)
@@ -291,7 +291,7 @@ OUI:00005E*
  ID_OUI_FROM_DATABASE=ICANN, IANA Department
 
 OUI:00005F*
- ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
+ ID_OUI_FROM_DATABASE=Sumitomo Electric Industries, Ltd
 
 OUI:000060*
  ID_OUI_FROM_DATABASE=KONTRON ELEKTRONIK GMBH
@@ -2130,7 +2130,7 @@ OUI:0002C3*
  ID_OUI_FROM_DATABASE=Arelnet Ltd.
 
 OUI:0002C4*
- ID_OUI_FROM_DATABASE=Vector International BVBA
+ ID_OUI_FROM_DATABASE=OPT Machine Vision Tech Co., Ltd
 
 OUI:0002C5*
  ID_OUI_FROM_DATABASE=Evertz Microsystems Ltd.
@@ -3006,7 +3006,7 @@ OUI:0003E7*
  ID_OUI_FROM_DATABASE=Logostek Co. Ltd.
 
 OUI:0003E8*
- ID_OUI_FROM_DATABASE=Wavelength Digital Limited
+ ID_OUI_FROM_DATABASE=Wavesight Limited
 
 OUI:0003E9*
  ID_OUI_FROM_DATABASE=Akara Canada, Inc.
@@ -4449,7 +4449,7 @@ OUI:0005C8*
  ID_OUI_FROM_DATABASE=VERYTECH
 
 OUI:0005C9*
- ID_OUI_FROM_DATABASE=LG Innotek Co., Ltd.
+ ID_OUI_FROM_DATABASE=LG Innotek
 
 OUI:0005CA*
  ID_OUI_FROM_DATABASE=Hitron Technology, Inc.
@@ -5808,7 +5808,7 @@ OUI:00078D*
  ID_OUI_FROM_DATABASE=NetEngines Ltd.
 
 OUI:00078E*
- ID_OUI_FROM_DATABASE=Garz & Friche GmbH
+ ID_OUI_FROM_DATABASE=Garz & Fricke GmbH
 
 OUI:00078F*
  ID_OUI_FROM_DATABASE=Emkay Innovative Products
@@ -6807,7 +6807,7 @@ OUI:0008F5*
  ID_OUI_FROM_DATABASE=YESTECHNOLOGY Co.,Ltd.
 
 OUI:0008F6*
- ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
+ ID_OUI_FROM_DATABASE=Sumitomo Electric Industries, Ltd
 
 OUI:0008F7*
  ID_OUI_FROM_DATABASE=Hitachi Ltd, Semiconductor & Integrated Circuits Gr
@@ -8856,7 +8856,7 @@ OUI:000BA1*
  ID_OUI_FROM_DATABASE=Fujikura Solutions Ltd.
 
 OUI:000BA2*
- ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
+ ID_OUI_FROM_DATABASE=Sumitomo Electric Industries, Ltd
 
 OUI:000BA3*
  ID_OUI_FROM_DATABASE=Siemens AG
@@ -14427,7 +14427,7 @@ OUI:0012E2*
  ID_OUI_FROM_DATABASE=ALAXALA Networks Corporation
 
 OUI:0012E3*
- ID_OUI_FROM_DATABASE=Agat-RT, Ltd.
+ ID_OUI_FROM_DATABASE=Agat Soft LLC
 
 OUI:0012E4*
  ID_OUI_FROM_DATABASE=ZIEHL industrie-electronik GmbH + Co KG
@@ -16980,7 +16980,7 @@ OUI:001635*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
 OUI:001636*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:001637*
  ID_OUI_FROM_DATABASE=CITEL SpA
@@ -17637,7 +17637,7 @@ OUI:001710*
  ID_OUI_FROM_DATABASE=Casa Systems Inc.
 
 OUI:001711*
- ID_OUI_FROM_DATABASE=GE Healthcare Bio-Sciences AB
+ ID_OUI_FROM_DATABASE=Cytiva Sweden AB
 
 OUI:001712*
  ID_OUI_FROM_DATABASE=ISCO International
@@ -19272,7 +19272,7 @@ OUI:001931*
  ID_OUI_FROM_DATABASE=Balluff GmbH
 
 OUI:001932*
- ID_OUI_FROM_DATABASE=Gude Analog- und Digialsysteme GmbH
+ ID_OUI_FROM_DATABASE=Gude Systems GmbH
 
 OUI:001933*
  ID_OUI_FROM_DATABASE=Strix Systems, Inc.
@@ -20766,7 +20766,7 @@ OUI:001B23*
  ID_OUI_FROM_DATABASE=SimpleComTools
 
 OUI:001B24*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:001B25*
  ID_OUI_FROM_DATABASE=Nortel Networks
@@ -21726,7 +21726,7 @@ OUI:001BC509F*
  ID_OUI_FROM_DATABASE=ENTE Sp. z o.o.
 
 OUI:001BC50A0*
- ID_OUI_FROM_DATABASE=HomerSoft sp. z o.o.
+ ID_OUI_FROM_DATABASE=Silvair
 
 OUI:001BC50A1*
  ID_OUI_FROM_DATABASE=Hangzhou Zhiping Technology Co., Ltd.
@@ -22461,7 +22461,7 @@ OUI:001C90*
  ID_OUI_FROM_DATABASE=Empacket Corporation
 
 OUI:001C91*
- ID_OUI_FROM_DATABASE=Gefen Inc.
+ ID_OUI_FROM_DATABASE=Gefen LLC
 
 OUI:001C92*
  ID_OUI_FROM_DATABASE=Tervela
@@ -22782,7 +22782,7 @@ OUI:001CFB*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
 OUI:001CFC*
- ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
+ ID_OUI_FROM_DATABASE=Sumitomo Electric Industries, Ltd
 
 OUI:001CFD*
  ID_OUI_FROM_DATABASE=Universal Electronics, Inc.
@@ -22809,7 +22809,7 @@ OUI:001D04*
  ID_OUI_FROM_DATABASE=Zipit Wireless, Inc.
 
 OUI:001D05*
- ID_OUI_FROM_DATABASE=Eaton Corporation
+ ID_OUI_FROM_DATABASE=Cooper Lighting Solutions
 
 OUI:001D06*
  ID_OUI_FROM_DATABASE=HM Electronics, Inc.
@@ -23709,7 +23709,7 @@ OUI:001E30*
  ID_OUI_FROM_DATABASE=Shireen Inc
 
 OUI:001E31*
- ID_OUI_FROM_DATABASE=INFOMARK CO.,LTD.
+ ID_OUI_FROM_DATABASE=infomark
 
 OUI:001E32*
  ID_OUI_FROM_DATABASE=Zensys
@@ -23874,7 +23874,7 @@ OUI:001E67*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
 OUI:001E68*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:001E69*
  ID_OUI_FROM_DATABASE=Thomson Inc.
@@ -24096,7 +24096,7 @@ OUI:001EB1*
  ID_OUI_FROM_DATABASE=Cryptsoft Pty Ltd
 
 OUI:001EB2*
- ID_OUI_FROM_DATABASE=LG innotek
+ ID_OUI_FROM_DATABASE=LG Innotek
 
 OUI:001EB3*
  ID_OUI_FROM_DATABASE=Primex Wireless
@@ -24234,7 +24234,7 @@ OUI:001EDF*
  ID_OUI_FROM_DATABASE=Master Industrialization Center Kista
 
 OUI:001EE0*
- ID_OUI_FROM_DATABASE=Urmet Domus SpA
+ ID_OUI_FROM_DATABASE=Urmet SpA
 
 OUI:001EE1*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
@@ -27819,7 +27819,7 @@ OUI:00238A*
  ID_OUI_FROM_DATABASE=Ciena Corporation
 
 OUI:00238B*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:00238C*
  ID_OUI_FROM_DATABASE=Private
@@ -29583,7 +29583,7 @@ OUI:0025DB*
  ID_OUI_FROM_DATABASE=ATI Electronics(Shenzhen) Co., LTD
 
 OUI:0025DC*
- ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
+ ID_OUI_FROM_DATABASE=Sumitomo Electric Industries, Ltd
 
 OUI:0025DD*
  ID_OUI_FROM_DATABASE=SUNNYTEK INFORMATION CO., LTD.
@@ -30156,7 +30156,7 @@ OUI:00269D*
  ID_OUI_FROM_DATABASE=M2Mnet Co., Ltd.
 
 OUI:00269E*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:00269F*
  ID_OUI_FROM_DATABASE=Private
@@ -30584,6 +30584,9 @@ OUI:002A6A*
 OUI:002AAF*
  ID_OUI_FROM_DATABASE=LARsys-Automation GmbH
 
+OUI:002B67*
+ ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology co., ltd
+
 OUI:002CC8*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -30852,7 +30855,7 @@ OUI:003053*
  ID_OUI_FROM_DATABASE=Basler AG
 
 OUI:003054*
- ID_OUI_FROM_DATABASE=CASTLENET TECHNOLOGY, INC.
+ ID_OUI_FROM_DATABASE=Castlenet Technology Inc.
 
 OUI:003055*
  ID_OUI_FROM_DATABASE=Renesas Technology America, Inc.
@@ -32952,7 +32955,7 @@ OUI:0050F0*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
 OUI:0050F1*
- ID_OUI_FROM_DATABASE=Intel Corporation
+ ID_OUI_FROM_DATABASE=Maxlinear, Inc
 
 OUI:0050F2*
  ID_OUI_FROM_DATABASE=MICROSOFT CORP.
@@ -33890,6 +33893,9 @@ OUI:006171*
 OUI:0062EC*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:0063DE*
+ ID_OUI_FROM_DATABASE=CLOUDWALK TECHNOLOGY CO.,LTD
+
 OUI:006440*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -35672,6 +35678,9 @@ OUI:0091D6*
 OUI:0091FA*
  ID_OUI_FROM_DATABASE=Synapse Product Development
 
+OUI:00927D*
+ ID_OUI_FROM_DATABASE=Ficosa Internationa(Taicang) C0.,Ltd.
+
 OUI:0092FA*
  ID_OUI_FROM_DATABASE=SHENZHEN WISKY TECHNOLOGY CO.,LTD
 
@@ -36722,6 +36731,9 @@ OUI:00B810*
 OUI:00B8B3*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:00B8B6*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+
 OUI:00B8C2*
  ID_OUI_FROM_DATABASE=Heights Telecom T ltd
 
@@ -36773,6 +36785,9 @@ OUI:00BE75*
 OUI:00BE9E*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
+OUI:00BED5*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
 OUI:00BF15*
  ID_OUI_FROM_DATABASE=Genetec Inc.
 
@@ -37260,7 +37275,7 @@ OUI:00C09E*
  ID_OUI_FROM_DATABASE=CACHE COMPUTERS, INC.
 
 OUI:00C09F*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:00C0A0*
  ID_OUI_FROM_DATABASE=ADVANCE MICRO RESEARCH, INC.
@@ -37587,7 +37602,7 @@ OUI:00CBB4*
  ID_OUI_FROM_DATABASE=SHENZHEN ATEKO PHOTOELECTRICITY CO.,LTD
 
 OUI:00CBBD*
- ID_OUI_FROM_DATABASE=Cambridge Broadband Networks Ltd.
+ ID_OUI_FROM_DATABASE=Cambridge Broadband Networks Group
 
 OUI:00CC3F*
  ID_OUI_FROM_DATABASE=Universal Electronics, Inc.
@@ -39024,7 +39039,7 @@ OUI:00E0B6*
  ID_OUI_FROM_DATABASE=Entrada Networks
 
 OUI:00E0B7*
- ID_OUI_FROM_DATABASE=PI GROUP, LTD.
+ ID_OUI_FROM_DATABASE=Cosworth Electronics Ltd
 
 OUI:00E0B8*
  ID_OUI_FROM_DATABASE=GATEWAY 2000
@@ -39251,12 +39266,21 @@ OUI:00E175*
 OUI:00E18C*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:00E22C*
+ ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
+
 OUI:00E3B2*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
 OUI:00E400*
  ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
+OUI:00E406*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:00E5E4*
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+
 OUI:00E666*
  ID_OUI_FROM_DATABASE=ARIMA Communications Corp.
 
@@ -39560,12 +39584,18 @@ OUI:044169*
 OUI:0444A1*
  ID_OUI_FROM_DATABASE=TELECON GALICIA,S.A.
 
+OUI:044562*
+ ID_OUI_FROM_DATABASE=ANDRA Sp. z o. o.
+
 OUI:0445A1*
  ID_OUI_FROM_DATABASE=NIRIT- Xinwei  Telecom Technology Co., Ltd.
 
 OUI:044665*
  ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
+OUI:0446CF*
+ ID_OUI_FROM_DATABASE=Beijing Venustech Cybervision Co.,Ltd.
+
 OUI:04489A*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -39575,6 +39605,9 @@ OUI:044A50*
 OUI:044A6C*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:044AC6*
+ ID_OUI_FROM_DATABASE=Aipon Electronics Co., Ltd
+
 OUI:044BED*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -39686,6 +39719,9 @@ OUI:046B1B*
 OUI:046B25*
  ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
 
+OUI:046C59*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:046C9D*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -39774,7 +39810,10 @@ OUI:047D50*
  ID_OUI_FROM_DATABASE=Shenzhen Kang Ying Technology Co.Ltd.
 
 OUI:047D7B*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
+
+OUI:047E23*
+ ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
 
 OUI:047E4A*
  ID_OUI_FROM_DATABASE=moobox CO., Ltd.
@@ -39878,6 +39917,9 @@ OUI:04A151*
 OUI:04A222*
  ID_OUI_FROM_DATABASE=Arcadyan Corporation
 
+OUI:04A2F3*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
 OUI:04A316*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
@@ -39962,6 +40004,9 @@ OUI:04C103*
 OUI:04C1B9*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
+OUI:04C1D8*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:04C23E*
  ID_OUI_FROM_DATABASE=HTC Corporation
 
@@ -40031,6 +40076,9 @@ OUI:04C9D9*
 OUI:04CB1D*
  ID_OUI_FROM_DATABASE=Traka plc
 
+OUI:04CB88*
+ ID_OUI_FROM_DATABASE=Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd
+
 OUI:04CE14*
  ID_OUI_FROM_DATABASE=Wilocity LTD.
 
@@ -40229,6 +40277,9 @@ OUI:04F7E4*
 OUI:04F8C2*
  ID_OUI_FROM_DATABASE=Flaircomm Microelectronics, Inc.
 
+OUI:04F8F8*
+ ID_OUI_FROM_DATABASE=Edgecore Networks Corporation
+
 OUI:04F938*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -40817,6 +40868,9 @@ OUI:08306B*
 OUI:08318B*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:0831A4*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:08351B*
  ID_OUI_FROM_DATABASE=Shenzhen Jialihua Electronic Technology Co., Ltd
 
@@ -40835,6 +40889,9 @@ OUI:08373D*
 OUI:08379C*
  ID_OUI_FROM_DATABASE=Topaz Co. LTD.
 
+OUI:083869*
+ ID_OUI_FROM_DATABASE=Hong Kong AMobile Intelligent Corp. Limited Taiwan Branch
+
 OUI:0838A5*
  ID_OUI_FROM_DATABASE=Funkwerk plettac electronic GmbH
 
@@ -40850,6 +40907,9 @@ OUI:083A88*
 OUI:083AB8*
  ID_OUI_FROM_DATABASE=Shinoda Plasma Co., Ltd.
 
+OUI:083AF2*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
+
 OUI:083D88*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -40893,7 +40953,7 @@ OUI:084E1C*
  ID_OUI_FROM_DATABASE=H2A Systems, LLC
 
 OUI:084EBF*
- ID_OUI_FROM_DATABASE=Broad Net Mux Corporation
+ ID_OUI_FROM_DATABASE=Sumitomo Electric Industries, Ltd
 
 OUI:084F0A*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
@@ -40913,6 +40973,9 @@ OUI:08512E*
 OUI:085240*
  ID_OUI_FROM_DATABASE=EbV Elektronikbau- und Vertriebs GmbH
 
+OUI:0854BB*
+ ID_OUI_FROM_DATABASE=SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD
+
 OUI:085700*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
@@ -41058,7 +41121,7 @@ OUI:088E4F*
  ID_OUI_FROM_DATABASE=SF Software Solutions
 
 OUI:088F2C*
- ID_OUI_FROM_DATABASE=Hills Sound Vision & Lighting
+ ID_OUI_FROM_DATABASE=Amber Technology Ltd.
 
 OUI:0890BA*
  ID_OUI_FROM_DATABASE=Danlaw Inc
@@ -41087,11 +41150,14 @@ OUI:089798*
 OUI:089B4B*
  ID_OUI_FROM_DATABASE=iKuai Networks
 
+OUI:089BB9*
+ ID_OUI_FROM_DATABASE=Nokia
+
 OUI:089C86*
  ID_OUI_FROM_DATABASE=Nokia Shanghai Bell Co., Ltd.
 
 OUI:089E01*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:089E08*
  ID_OUI_FROM_DATABASE=Google, Inc.
@@ -41120,6 +41186,9 @@ OUI:08AA55*
 OUI:08ACA5*
  ID_OUI_FROM_DATABASE=Benu Video, Inc.
 
+OUI:08ACC4*
+ ID_OUI_FROM_DATABASE=FMTech
+
 OUI:08AED6*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -41129,6 +41198,9 @@ OUI:08AF78*
 OUI:08B055*
  ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
+OUI:08B0A7*
+ ID_OUI_FROM_DATABASE=Truebeyond Co., Ltd
+
 OUI:08B258*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
@@ -41252,6 +41324,9 @@ OUI:08E689*
 OUI:08E84F*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:08E9F6*
+ ID_OUI_FROM_DATABASE=AMPAK Technology,Inc.
+
 OUI:08EA40*
  ID_OUI_FROM_DATABASE=SHENZHEN BILIAN ELECTRONIC CO.,LTD
 
@@ -41318,6 +41393,9 @@ OUI:08ED02D*
 OUI:08ED02E*
  ID_OUI_FROM_DATABASE=Telstra Corporation Limited
 
+OUI:08ED9D*
+ ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
+
 OUI:08EDB9*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -41363,9 +41441,15 @@ OUI:08F7E9*
 OUI:08F8BC*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:08FA79*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+
 OUI:08FAE0*
  ID_OUI_FROM_DATABASE=Fohhn Audio AG
 
+OUI:08FBEA*
+ ID_OUI_FROM_DATABASE=AMPAK Technology,Inc.
+
 OUI:08FC52*
  ID_OUI_FROM_DATABASE=OpenXS BV
 
@@ -41483,6 +41567,9 @@ OUI:0C2FB0*
 OUI:0C3021*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:0C31DC*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:0C35FE*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
@@ -41501,6 +41588,9 @@ OUI:0C383E*
 OUI:0C3956*
  ID_OUI_FROM_DATABASE=Observator instruments
 
+OUI:0C3B50*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:0C3C65*
  ID_OUI_FROM_DATABASE=Dome Imaging Inc
 
@@ -41588,6 +41678,9 @@ OUI:0C57EB*
 OUI:0C5842*
  ID_OUI_FROM_DATABASE=DME Micro
 
+OUI:0C599C*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
 OUI:0C5A19*
  ID_OUI_FROM_DATABASE=Axtion Sdn Bhd
 
@@ -41945,6 +42038,9 @@ OUI:0CC731*
 OUI:0CC81F*
  ID_OUI_FROM_DATABASE=Summer Infant, Inc.
 
+OUI:0CC844*
+ ID_OUI_FROM_DATABASE=Cambridge Mobile Telematics, Inc.
+
 OUI:0CC9C6*
  ID_OUI_FROM_DATABASE=Samwin Hong Kong Limited
 
@@ -42005,6 +42101,9 @@ OUI:0CD9C1*
 OUI:0CDA41*
  ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
+OUI:0CDC7E*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
+
 OUI:0CDCCC*
  ID_OUI_FROM_DATABASE=Inala Technologies
 
@@ -42050,6 +42149,9 @@ OUI:0CE99A*
 OUI:0CEAC9*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
+OUI:0CEC80*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:0CEC84*
  ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
 
@@ -42335,6 +42437,9 @@ OUI:101250*
 OUI:1012B4*
  ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
 
+OUI:1012FB*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+
 OUI:101331*
  ID_OUI_FROM_DATABASE=Technicolor
 
@@ -42413,6 +42518,9 @@ OUI:103378*
 OUI:1033BF*
  ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
+OUI:10341B*
+ ID_OUI_FROM_DATABASE=Spacelink
+
 OUI:10364A*
  ID_OUI_FROM_DATABASE=Boston Dynamics
 
@@ -42527,6 +42635,9 @@ OUI:105C3B*
 OUI:105CBF*
  ID_OUI_FROM_DATABASE=DuroByte Inc
 
+OUI:105DDC*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:105F06*
  ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
@@ -42561,7 +42672,7 @@ OUI:106530*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
 OUI:1065A3*
- ID_OUI_FROM_DATABASE=Core Brands LLC
+ ID_OUI_FROM_DATABASE=Panamax LLC
 
 OUI:1065CF*
  ID_OUI_FROM_DATABASE=IQSIM
@@ -42587,6 +42698,9 @@ OUI:1071F9*
 OUI:107223*
  ID_OUI_FROM_DATABASE=TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO
 
+OUI:10746F*
+ ID_OUI_FROM_DATABASE=MOTOROLA SOLUTIONS MALAYSIA SDN. BHD.
+
 OUI:10768A*
  ID_OUI_FROM_DATABASE=EoCell
 
@@ -42650,6 +42764,9 @@ OUI:1089FB*
 OUI:108A1B*
  ID_OUI_FROM_DATABASE=RAONIX Inc.
 
+OUI:108B6A*
+ ID_OUI_FROM_DATABASE=Antailiye Technology Co.,Ltd
+
 OUI:108CCF*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -42761,6 +42878,9 @@ OUI:10B9FE*
 OUI:10BAA5*
  ID_OUI_FROM_DATABASE=GANA I&C CO., LTD
 
+OUI:10BC97*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+
 OUI:10BD18*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -42941,6 +43061,9 @@ OUI:10E68F*
 OUI:10E6AE*
  ID_OUI_FROM_DATABASE=Source Technologies, LLC
 
+OUI:10E77A*
+ ID_OUI_FROM_DATABASE=STMicrolectronics International NV
+
 OUI:10E7C6*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
@@ -42980,6 +43103,9 @@ OUI:10F49A*
 OUI:10F681*
  ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
+OUI:10F920*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:10F96F*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
@@ -43010,6 +43136,9 @@ OUI:1100AA*
 OUI:111111*
  ID_OUI_FROM_DATABASE=Private
 
+OUI:14007D*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:140152*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -43061,6 +43190,9 @@ OUI:141346*
 OUI:141357*
  ID_OUI_FROM_DATABASE=ATP Electronics, Inc.
 
+OUI:1413FB*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:14144B*
  ID_OUI_FROM_DATABASE=Ruijie Networks Co.,LTD
 
@@ -43337,6 +43469,9 @@ OUI:144FD7D*
 OUI:144FD7E*
  ID_OUI_FROM_DATABASE=Edan Instruments, Inc.
 
+OUI:145120*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:145290*
  ID_OUI_FROM_DATABASE=KNS Group LLC (YADRO Company)
 
@@ -43436,6 +43571,9 @@ OUI:147DB3*
 OUI:147DC5*
  ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
+OUI:147DDA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:14825B*
  ID_OUI_FROM_DATABASE=Hefei Radio Communication Technology Co., Ltd
 
@@ -43655,6 +43793,9 @@ OUI:14C089*
 OUI:14C126*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
+OUI:14C14E*
+ ID_OUI_FROM_DATABASE=Google, Inc.
+
 OUI:14C1FF*
  ID_OUI_FROM_DATABASE=ShenZhen QianHai Comlan communication Co.,LTD
 
@@ -43670,6 +43811,9 @@ OUI:14C3C2*
 OUI:14C697*
  ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
+OUI:14C88B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:14C913*
  ID_OUI_FROM_DATABASE=LG Electronics
 
@@ -43679,6 +43823,9 @@ OUI:14CAA0*
 OUI:14CC20*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
+OUI:14CCB3*
+ ID_OUI_FROM_DATABASE=AO GK NATEKS
+
 OUI:14CF8D*
  ID_OUI_FROM_DATABASE=OHSUNG
 
@@ -43898,6 +44045,9 @@ OUI:182195*
 OUI:18227E*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:182649*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:182666*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -43976,18 +44126,27 @@ OUI:183A48*
 OUI:183BD2*
  ID_OUI_FROM_DATABASE=BYD Precision Manufacture Company Ltd.
 
+OUI:183CB7*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:183D5E*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
 OUI:183DA2*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:183EEF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:183F47*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
 OUI:1840A4*
  ID_OUI_FROM_DATABASE=Shenzhen Trylong Smart Science and Technology Co., Ltd.
 
+OUI:1841FE*
+ ID_OUI_FROM_DATABASE=Digital 14
+
 OUI:18421D*
  ID_OUI_FROM_DATABASE=Private
 
@@ -44000,12 +44159,18 @@ OUI:184462*
 OUI:1844E6*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:184593*
+ ID_OUI_FROM_DATABASE=Taicang T&W Electronics
+
 OUI:184617*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
 OUI:184644*
  ID_OUI_FROM_DATABASE=Home Control Singapore Pte Ltd
 
+OUI:18473D*
+ ID_OUI_FROM_DATABASE=CHONGQING FUGUI ELECTRONICS CO.,LTD.
+
 OUI:1848CA*
  ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
@@ -44024,6 +44189,9 @@ OUI:184BDF*
 OUI:184C08*
  ID_OUI_FROM_DATABASE=Rockwell Automation
 
+OUI:184E16*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:184E94*
  ID_OUI_FROM_DATABASE=MESSOA TECHNOLOGIES INC.
 
@@ -44267,6 +44435,9 @@ OUI:1893D7*
 OUI:1894C6*
  ID_OUI_FROM_DATABASE=ShenZhen Chenyee Technology Co., Ltd.
 
+OUI:189552*
+ ID_OUI_FROM_DATABASE=1MORE
+
 OUI:1897FF*
  ID_OUI_FROM_DATABASE=TechFaith Wireless Technology Limited
 
@@ -44357,12 +44528,18 @@ OUI:18A958*
 OUI:18A99B*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
+OUI:18AA0F*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:18AA45*
  ID_OUI_FROM_DATABASE=Fon Technology
 
 OUI:18AACA*
  ID_OUI_FROM_DATABASE=Sichuan tianyi kanghe communications co., LTD
 
+OUI:18AB1D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:18ABF5*
  ID_OUI_FROM_DATABASE=Ultra Electronics Electrics
 
@@ -44477,6 +44654,9 @@ OUI:18D276*
 OUI:18D5B6*
  ID_OUI_FROM_DATABASE=SMG Holdings LLC
 
+OUI:18D61C*
+ ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
+
 OUI:18D66A*
  ID_OUI_FROM_DATABASE=Inmarsat
 
@@ -44510,6 +44690,9 @@ OUI:18DED7*
 OUI:18DFB4*
  ID_OUI_FROM_DATABASE=BOSUNG POWERTEC CO.,LTD.
 
+OUI:18DFC1*
+ ID_OUI_FROM_DATABASE=Aetheros
+
 OUI:18E1CA*
  ID_OUI_FROM_DATABASE=wanze
 
@@ -44543,6 +44726,9 @@ OUI:18E829*
 OUI:18E8DD*
  ID_OUI_FROM_DATABASE=MODULETEK
 
+OUI:18ECE7*
+ ID_OUI_FROM_DATABASE=BUFFALO.INC
+
 OUI:18EE69*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -44603,6 +44789,9 @@ OUI:18FF2E*
 OUI:1C0042*
  ID_OUI_FROM_DATABASE=NARI Technology Co., Ltd.
 
+OUI:1C012D*
+ ID_OUI_FROM_DATABASE=Ficer Technology
+
 OUI:1C0219*
  ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
@@ -44613,7 +44802,7 @@ OUI:1C0656*
  ID_OUI_FROM_DATABASE=IDY Corporation
 
 OUI:1C08C1*
- ID_OUI_FROM_DATABASE=Lg Innotek
+ ID_OUI_FROM_DATABASE=LG Innotek
 
 OUI:1C0B52*
  ID_OUI_FROM_DATABASE=EPICOM S.A
@@ -44768,6 +44957,9 @@ OUI:1C2704*
 OUI:1C27DD*
  ID_OUI_FROM_DATABASE=Datang Gohighsec(zhejiang)Information Technology Co.,Ltd.
 
+OUI:1C28AF*
+ ID_OUI_FROM_DATABASE=Aruba, a Hewlett Packard Enterprise Company
+
 OUI:1C2AA3*
  ID_OUI_FROM_DATABASE=Shenzhen HongRui Optical Technology Co., Ltd.
 
@@ -44816,6 +45008,9 @@ OUI:1C3B8F*
 OUI:1C3BF3*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
+OUI:1C3D2F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:1C3DE7*
  ID_OUI_FROM_DATABASE=Sigma Koki Co.,Ltd.
 
@@ -44921,6 +45116,9 @@ OUI:1C5C60*
 OUI:1C5CF2*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:1C5D80*
+ ID_OUI_FROM_DATABASE=Mitubishi Hitachi Power Systems Industries Co., Ltd.
+
 OUI:1C5F2B*
  ID_OUI_FROM_DATABASE=D-Link International
 
@@ -45237,7 +45435,7 @@ OUI:1C88790*
  ID_OUI_FROM_DATABASE=Newps co.,ltd
 
 OUI:1C88791*
- ID_OUI_FROM_DATABASE=ANDRA Sp. z o.o.
+ ID_OUI_FROM_DATABASE=ANDRA Sp. z o. o.
 
 OUI:1C88792*
  ID_OUI_FROM_DATABASE=Airsmart System Co.,Ltd
@@ -45314,6 +45512,9 @@ OUI:1C973D*
 OUI:1C97C5*
  ID_OUI_FROM_DATABASE=Ynomia Pty Ltd
 
+OUI:1C98C1*
+ ID_OUI_FROM_DATABASE=CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.
+
 OUI:1C98EC*
  ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
@@ -45602,6 +45803,9 @@ OUI:1CD5E2*
 OUI:1CD6BD*
  ID_OUI_FROM_DATABASE=LEEDARSON LIGHTING CO., LTD.
 
+OUI:1CD6BE*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+
 OUI:1CDA27*
  ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
@@ -45629,6 +45833,9 @@ OUI:1CE192*
 OUI:1CE2CC*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
+OUI:1CE61D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:1CE62B*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -45719,9 +45926,15 @@ OUI:1CFD08D*
 OUI:1CFD08E*
  ID_OUI_FROM_DATABASE=MESHBOX FOUNDATION PTE. LTD.
 
+OUI:1CFE2B*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
 OUI:1CFEA7*
  ID_OUI_FROM_DATABASE=IDentytech Solutins Ltd.
 
+OUI:1CFF59*
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+
 OUI:20014F*
  ID_OUI_FROM_DATABASE=Linea Research Ltd
 
@@ -46034,6 +46247,9 @@ OUI:20635F*
 OUI:206432*
  ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
+OUI:2064CB*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
 OUI:20658E*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -46046,6 +46262,9 @@ OUI:2067B1*
 OUI:20689D*
  ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
+OUI:206980*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:206A8A*
  ID_OUI_FROM_DATABASE=Wistron Infocomm (Zhongshan) Corporation
 
@@ -46205,6 +46424,9 @@ OUI:20934D*
 OUI:20968A*
  ID_OUI_FROM_DATABASE=China Mobile (Hangzhou) Information Technology Co., Ltd.
 
+OUI:2098D8*
+ ID_OUI_FROM_DATABASE=Shenzhen Yingdakang Technology CO., LTD
+
 OUI:209AE9*
  ID_OUI_FROM_DATABASE=Volacomm Co., Ltd
 
@@ -46214,9 +46436,15 @@ OUI:209BA5*
 OUI:209BCD*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:209E79*
+ ID_OUI_FROM_DATABASE=Universal Electronics, Inc.
+
 OUI:209EF7*
  ID_OUI_FROM_DATABASE=Extreme Networks, Inc.
 
+OUI:20A171*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
 OUI:20A2E4*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -46256,6 +46484,9 @@ OUI:20AA4B*
 OUI:20AB37*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:20AB48*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:20AD56*
  ID_OUI_FROM_DATABASE=Continental Automotive Systems Inc.
 
@@ -46427,6 +46658,9 @@ OUI:20F3A3*
 OUI:20F41B*
  ID_OUI_FROM_DATABASE=Shenzhen Bilian electronic CO.,LTD
 
+OUI:20F44F*
+ ID_OUI_FROM_DATABASE=Nokia
+
 OUI:20F452*
  ID_OUI_FROM_DATABASE=Shanghai IUV Software Development Co. Ltd
 
@@ -46460,6 +46694,9 @@ OUI:20FEDB*
 OUI:2400BA*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:2400FA*
+ ID_OUI_FROM_DATABASE=China Mobile (Hangzhou) Information Technology Co., Ltd
+
 OUI:2401C7*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -46520,6 +46757,9 @@ OUI:241148*
 OUI:2411D0*
  ID_OUI_FROM_DATABASE=Chongqing Ehs Science and Technology Development Co.,Ltd.
 
+OUI:241407*
+ ID_OUI_FROM_DATABASE=Xiamen Sigmastar Technology Ltd.
+
 OUI:2415100*
  ID_OUI_FROM_DATABASE=Safetrust Inc
 
@@ -46545,7 +46785,7 @@ OUI:2415107*
  ID_OUI_FROM_DATABASE=SuZhou A-rack Information Technology Co.,Ltd
 
 OUI:2415108*
- ID_OUI_FROM_DATABASE=Private
+ ID_OUI_FROM_DATABASE=Medicomp, Inc
 
 OUI:2415109*
  ID_OUI_FROM_DATABASE=Topgolf Sweden AB
@@ -46577,6 +46817,9 @@ OUI:24181D*
 OUI:241A8C*
  ID_OUI_FROM_DATABASE=Squarehead Technology AS
 
+OUI:241AE6*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:241B13*
  ID_OUI_FROM_DATABASE=Shanghai Nutshell Electronic Co., Ltd.
 
@@ -46685,6 +46928,9 @@ OUI:244B03*
 OUI:244B81*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:244BFE*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
 OUI:244C07*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -46772,6 +47018,9 @@ OUI:245CCB*
 OUI:245EBE*
  ID_OUI_FROM_DATABASE=QNAP Systems, Inc.
 
+OUI:245F9F*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:245FDF*
  ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
 
@@ -46829,6 +47078,9 @@ OUI:246F28*
 OUI:246F8C*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
+OUI:247152*
+ ID_OUI_FROM_DATABASE=Dell Inc.
+
 OUI:247189*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
@@ -46850,6 +47102,9 @@ OUI:247703*
 OUI:24792A*
  ID_OUI_FROM_DATABASE=Ruckus Wireless
 
+OUI:2479EF*
+ ID_OUI_FROM_DATABASE=Greenpacket Berhad, Taiwan
+
 OUI:2479F3*
  ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
@@ -46880,6 +47135,9 @@ OUI:248000*
 OUI:2481AA*
  ID_OUI_FROM_DATABASE=KSH International Co., Ltd.
 
+OUI:2481C7*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:24828A*
  ID_OUI_FROM_DATABASE=Prowave Technologies Ltd.
 
@@ -46922,6 +47180,9 @@ OUI:249EAB*
 OUI:24A074*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:24A160*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
+
 OUI:24A2E1*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -46961,6 +47222,9 @@ OUI:24AF54*
 OUI:24B0A9*
  ID_OUI_FROM_DATABASE=Shanghai Mobiletek Communication Ltd.
 
+OUI:24B105*
+ ID_OUI_FROM_DATABASE=Prama Hikvision India Private Limited
+
 OUI:24B209*
  ID_OUI_FROM_DATABASE=Avaya Inc
 
@@ -47123,6 +47387,9 @@ OUI:24E6BA*
 OUI:24E9B3*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:24E9CA*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:24EA40*
  ID_OUI_FROM_DATABASE=Helmholz GmbH & Co. KG
 
@@ -47153,6 +47420,9 @@ OUI:24F0FF*
 OUI:24F128*
  ID_OUI_FROM_DATABASE=Telstra
 
+OUI:24F150*
+ ID_OUI_FROM_DATABASE=Guangzhou Qi'an Technology Co., Ltd.
+
 OUI:24F27F*
  ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
@@ -47181,7 +47451,7 @@ OUI:24FCE5*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
 OUI:24FD0D*
- ID_OUI_FROM_DATABASE=INDÚSTRIA DE TELECOMUNICAÇÃO ELETRÔNICA
+ ID_OUI_FROM_DATABASE=Intelbras
 
 OUI:24FD52*
  ID_OUI_FROM_DATABASE=Liteon Technology Corporation
@@ -47471,6 +47741,9 @@ OUI:2847AA*
 OUI:284846*
  ID_OUI_FROM_DATABASE=GridCentric Inc.
 
+OUI:2848E7*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:284C53*
  ID_OUI_FROM_DATABASE=Intune Networks
 
@@ -47540,6 +47813,9 @@ OUI:28656B*
 OUI:2866E3*
  ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
+OUI:2868D2*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:286AB8*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -47720,6 +47996,9 @@ OUI:28B0CC*
 OUI:28B2BD*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:28B371*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
 OUI:28B3AB*
  ID_OUI_FROM_DATABASE=Genmark Automation
 
@@ -47729,6 +48008,51 @@ OUI:28B448*
 OUI:28B4FB*
  ID_OUI_FROM_DATABASE=Sprocomm Technologies CO.,LTD.
 
+OUI:28B77C0*
+ ID_OUI_FROM_DATABASE=SHENZHEN EVIEW GPS TECHNOLOGY
+
+OUI:28B77C1*
+ ID_OUI_FROM_DATABASE=SolarEdge Technologies
+
+OUI:28B77C2*
+ ID_OUI_FROM_DATABASE=Zhuhai RongBang Electronic Technology Co., Ltd.
+
+OUI:28B77C3*
+ ID_OUI_FROM_DATABASE=Beijing Kitten&Puppy Technology Co.,Ltd.
+
+OUI:28B77C4*
+ ID_OUI_FROM_DATABASE=Annapurna labs
+
+OUI:28B77C5*
+ ID_OUI_FROM_DATABASE=GROTHE GmbH
+
+OUI:28B77C6*
+ ID_OUI_FROM_DATABASE=Shanghai Taiji Software Co.,Limited
+
+OUI:28B77C7*
+ ID_OUI_FROM_DATABASE=Convertertec Deutschland GmbH
+
+OUI:28B77C8*
+ ID_OUI_FROM_DATABASE=Shenzhen PUAS Industrial Co.,LTD
+
+OUI:28B77C9*
+ ID_OUI_FROM_DATABASE=Anser Coding Inc.
+
+OUI:28B77CA*
+ ID_OUI_FROM_DATABASE=Simaudio Ltd
+
+OUI:28B77CB*
+ ID_OUI_FROM_DATABASE=Vehant Technologies Pvt Ltd.
+
+OUI:28B77CC*
+ ID_OUI_FROM_DATABASE=AnyLink LLC
+
+OUI:28B77CD*
+ ID_OUI_FROM_DATABASE=Enedo Finland Oy
+
+OUI:28B77CE*
+ ID_OUI_FROM_DATABASE=Ray Pte Ltd
+
 OUI:28B9D9*
  ID_OUI_FROM_DATABASE=Radisys Corporation
 
@@ -47765,6 +48089,9 @@ OUI:28C0DA*
 OUI:28C13C*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co., Ltd.
 
+OUI:28C21F*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+
 OUI:28C2DD*
  ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
@@ -47828,6 +48155,9 @@ OUI:28CFE9*
 OUI:28D0CB*
  ID_OUI_FROM_DATABASE=Cambridge Communication Systems Ltd
 
+OUI:28D127*
+ ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
+
 OUI:28D1AF*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
@@ -47897,6 +48227,9 @@ OUI:28E7CF*
 OUI:28E98E*
  ID_OUI_FROM_DATABASE=Mitsubishi Electric Corporation
 
+OUI:28EC95*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:28EC9A*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
@@ -48564,7 +48897,7 @@ OUI:2C5FF3*
  ID_OUI_FROM_DATABASE=Pertronic Industries
 
 OUI:2C600C*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:2C6104*
  ID_OUI_FROM_DATABASE=SHENZHEN FENGLIAN TECHNOLOGY CO., LTD.
@@ -48650,6 +48983,9 @@ OUI:2C6BF5*
 OUI:2C6E85*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:2C6F51*
+ ID_OUI_FROM_DATABASE=Herospeed Digital Technology Limited
+
 OUI:2C6FC9*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -48761,6 +49097,9 @@ OUI:2C9FFB*
 OUI:2CA02F*
  ID_OUI_FROM_DATABASE=Veroguard Systems Pty Ltd
 
+OUI:2CA042*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:2CA157*
  ID_OUI_FROM_DATABASE=acromate, Inc.
 
@@ -48893,6 +49232,9 @@ OUI:2CD02D*
 OUI:2CD05A*
  ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
+OUI:2CD066*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+
 OUI:2CD1410*
  ID_OUI_FROM_DATABASE=iCIRROUND Inc
 
@@ -48956,6 +49298,9 @@ OUI:2CD444*
 OUI:2CD974*
  ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
 
+OUI:2CDB07*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:2CDCAD*
  ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
@@ -49319,6 +49664,9 @@ OUI:304174*
 OUI:304225*
  ID_OUI_FROM_DATABASE=BURG-WÄCHTER KG
 
+OUI:304240*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:3042A1*
  ID_OUI_FROM_DATABASE=ilumisys Inc. DBA Toggled
 
@@ -49343,6 +49691,51 @@ OUI:30469A*
 OUI:30493B*
  ID_OUI_FROM_DATABASE=Nanjing Z-Com Wireless Co.,Ltd
 
+OUI:3049500*
+ ID_OUI_FROM_DATABASE=Guangzhou Lian-med Technology Co.,Ltd.
+
+OUI:3049501*
+ ID_OUI_FROM_DATABASE=ATLI WORLD LIMITED
+
+OUI:3049502*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation.
+
+OUI:3049503*
+ ID_OUI_FROM_DATABASE=Morgan Schaffer Inc.
+
+OUI:3049504*
+ ID_OUI_FROM_DATABASE=ADVANCED MICROWAVE ENGINEERING SRL
+
+OUI:3049505*
+ ID_OUI_FROM_DATABASE=IK Elektronik GmbH
+
+OUI:3049506*
+ ID_OUI_FROM_DATABASE=Curb, Inc.
+
+OUI:3049507*
+ ID_OUI_FROM_DATABASE=Shenzhen iTG robot Co.,Ltd.
+
+OUI:3049508*
+ ID_OUI_FROM_DATABASE=SHENZHEN LDROBOT CO., LTD.
+
+OUI:3049509*
+ ID_OUI_FROM_DATABASE=Shanghai gatang technology CO.,LTD
+
+OUI:304950A*
+ ID_OUI_FROM_DATABASE=Ledworks SRL
+
+OUI:304950B*
+ ID_OUI_FROM_DATABASE=HANGZHOU EV-TECH CO.,LTD
+
+OUI:304950C*
+ ID_OUI_FROM_DATABASE=Anacove LLC
+
+OUI:304950D*
+ ID_OUI_FROM_DATABASE=Xio Research, Inc
+
+OUI:304950E*
+ ID_OUI_FROM_DATABASE=IoTmaxx GmbH
+
 OUI:304A26*
  ID_OUI_FROM_DATABASE=Shenzhen Trolink Technology CO, LTD
 
@@ -49415,6 +49808,9 @@ OUI:30636B*
 OUI:3065EC*
  ID_OUI_FROM_DATABASE=Wistron (ChongQing)
 
+OUI:3066D0*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:30688C*
  ID_OUI_FROM_DATABASE=Reach Technology Inc.
 
@@ -49508,6 +49904,9 @@ OUI:308999*
 OUI:3089D3*
  ID_OUI_FROM_DATABASE=HONGKONG UCLOUDLINK NETWORK TECHNOLOGY LIMITED
 
+OUI:308AF7*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:308BB2*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -49568,6 +49967,9 @@ OUI:30A243*
 OUI:30A2C2*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
+OUI:30A452*
+ ID_OUI_FROM_DATABASE=Arrival Elements BV
+
 OUI:30A889*
  ID_OUI_FROM_DATABASE=DECIMATOR DESIGN
 
@@ -49640,6 +50042,9 @@ OUI:30C3D9*
 OUI:30C507*
  ID_OUI_FROM_DATABASE=ECI Telecom Ltd.
 
+OUI:30C50F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:30C750*
  ID_OUI_FROM_DATABASE=MIC Technology Group
 
@@ -49649,9 +50054,15 @@ OUI:30C7AE*
 OUI:30C82A*
  ID_OUI_FROM_DATABASE=WI-BIZ srl
 
+OUI:30C9AB*
+ ID_OUI_FROM_DATABASE=CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.
+
 OUI:30CBF8*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:30CC21*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:30CDA7*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -49907,6 +50318,9 @@ OUI:3408BC*
 OUI:340A22*
  ID_OUI_FROM_DATABASE=TOP-ACCESS ELECTRONICS CO LTD
 
+OUI:340A33*
+ ID_OUI_FROM_DATABASE=D-Link International
+
 OUI:340A98*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -49920,7 +50334,7 @@ OUI:340CED*
  ID_OUI_FROM_DATABASE=Moduel AB
 
 OUI:340F66*
- ID_OUI_FROM_DATABASE=MicroArx Corporation
+ ID_OUI_FROM_DATABASE=Web Sensing LLC
 
 OUI:341290*
  ID_OUI_FROM_DATABASE=Treeview Co.,Ltd.
@@ -49970,6 +50384,9 @@ OUI:341FE4*
 OUI:342003*
  ID_OUI_FROM_DATABASE=Shenzhen Feitengyun Technology Co.,LTD
 
+OUI:3420E3*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
 OUI:342109*
  ID_OUI_FROM_DATABASE=Jensen Scandinavia AS
 
@@ -50054,6 +50471,9 @@ OUI:342D0D*
 OUI:342EB6*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:342EB7*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:342F6E*
  ID_OUI_FROM_DATABASE=Anywire corporation
 
@@ -50090,6 +50510,9 @@ OUI:343D98*
 OUI:343DC4*
  ID_OUI_FROM_DATABASE=BUFFALO.INC
 
+OUI:343EA4*
+ ID_OUI_FROM_DATABASE=Ring LLC
+
 OUI:3440B5*
  ID_OUI_FROM_DATABASE=IBM
 
@@ -50153,12 +50576,18 @@ OUI:3451C9*
 OUI:34543C*
  ID_OUI_FROM_DATABASE=TAKAOKA TOKO CO.,LTD.
 
+OUI:345594*
+ ID_OUI_FROM_DATABASE=FUJIAN STAR-NET COMMUNICATION CO.,LTD
+
 OUI:3456FE*
  ID_OUI_FROM_DATABASE=Cisco Meraki
 
 OUI:345760*
  ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
 
+OUI:345840*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:345A06*
  ID_OUI_FROM_DATABASE=SHARP Corporation
 
@@ -50216,6 +50645,9 @@ OUI:346BD3*
 OUI:346C0F*
  ID_OUI_FROM_DATABASE=Pramod Telecom Pvt. Ltd
 
+OUI:346D9C*
+ ID_OUI_FROM_DATABASE=Carrier Corporation
+
 OUI:346E8A*
  ID_OUI_FROM_DATABASE=Ecosense
 
@@ -50261,6 +50693,9 @@ OUI:347A60*
 OUI:347C25*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:347DF6*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:347E00*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
@@ -50288,6 +50723,9 @@ OUI:3481C4*
 OUI:3481F4*
  ID_OUI_FROM_DATABASE=SST Taiwan Ltd.
 
+OUI:3482C5*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:3482DE*
  ID_OUI_FROM_DATABASE=Kiio Inc
 
@@ -50304,7 +50742,7 @@ OUI:34862A*
  ID_OUI_FROM_DATABASE=Heinz Lackmann GmbH & Co KG
 
 OUI:34873D*
- ID_OUI_FROM_DATABASE=Quectel Wireless Solution Co.,Ltd.
+ ID_OUI_FROM_DATABASE=Quectel Wireless Solutions Co., Ltd.
 
 OUI:34885D*
  ID_OUI_FROM_DATABASE=Logitech Far East
@@ -50702,6 +51140,9 @@ OUI:34E911*
 OUI:34EA34*
  ID_OUI_FROM_DATABASE=HangZhou Gubei Electronics Technology Co.,Ltd
 
+OUI:34EAE7*
+ ID_OUI_FROM_DATABASE=Shanghai High-Flying Electronics  Technology Co., Ltd
+
 OUI:34ED0B*
  ID_OUI_FROM_DATABASE=Shanghai XZ-COM.CO.,Ltd.
 
@@ -51047,6 +51488,9 @@ OUI:38521A*
 OUI:38539C*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:38549B*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:385610*
  ID_OUI_FROM_DATABASE=CANDY HOUSE, Inc.
 
@@ -51089,6 +51533,9 @@ OUI:3866F0*
 OUI:386793*
  ID_OUI_FROM_DATABASE=Asia Optical Co., Inc.
 
+OUI:386893*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:3868A4*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,LTD
 
@@ -51200,6 +51647,9 @@ OUI:388479*
 OUI:388602*
  ID_OUI_FROM_DATABASE=Flexoptix GmbH
 
+OUI:38881E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:38892C*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -51209,6 +51659,9 @@ OUI:3889DC*
 OUI:388AB7*
  ID_OUI_FROM_DATABASE=ITC Networks
 
+OUI:388ABE*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
 OUI:388B59*
  ID_OUI_FROM_DATABASE=Google, Inc.
 
@@ -51570,7 +52023,7 @@ OUI:38F098*
  ID_OUI_FROM_DATABASE=Vapor Stone Rail Systems
 
 OUI:38F0C8*
- ID_OUI_FROM_DATABASE=Livestream
+ ID_OUI_FROM_DATABASE=Mevo Inc.
 
 OUI:38F135*
  ID_OUI_FROM_DATABASE=SensorTec-Canada
@@ -51605,6 +52058,51 @@ OUI:38F73D*
 OUI:38F7B2*
  ID_OUI_FROM_DATABASE=SEOJUN ELECTRIC
 
+OUI:38F7CD0*
+ ID_OUI_FROM_DATABASE=Polska Fabryka Wodomierzy i Ciep?omierzy FILA
+
+OUI:38F7CD1*
+ ID_OUI_FROM_DATABASE=NZIA Connect Inc
+
+OUI:38F7CD2*
+ ID_OUI_FROM_DATABASE=RIPower Co.,Ltd
+
+OUI:38F7CD3*
+ ID_OUI_FROM_DATABASE=VANGUARD
+
+OUI:38F7CD4*
+ ID_OUI_FROM_DATABASE=NORDI TELEKOMMUNIKATSIOONI OÜ
+
+OUI:38F7CD5*
+ ID_OUI_FROM_DATABASE=Shanghai qinzhuo Electronic Co., Ltd.
+
+OUI:38F7CD6*
+ ID_OUI_FROM_DATABASE=Fast Cotton(Beijing) Limited
+
+OUI:38F7CD7*
+ ID_OUI_FROM_DATABASE=ARUNAS PTY LTD
+
+OUI:38F7CD8*
+ ID_OUI_FROM_DATABASE=BlastWave Inc.
+
+OUI:38F7CD9*
+ ID_OUI_FROM_DATABASE=RFbeam Microwave GmbH
+
+OUI:38F7CDA*
+ ID_OUI_FROM_DATABASE=Distech Controls
+
+OUI:38F7CDB*
+ ID_OUI_FROM_DATABASE=Fibergate Inc.
+
+OUI:38F7CDC*
+ ID_OUI_FROM_DATABASE=Shenzhen MADIGI Electronic Technology Co., Ltd
+
+OUI:38F7CDD*
+ ID_OUI_FROM_DATABASE=Macherey-Nagel GmbH & Co. KG
+
+OUI:38F7CDE*
+ ID_OUI_FROM_DATABASE=APT MOBILE SATCOM LIMITED
+
 OUI:38F85E*
  ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
@@ -51737,6 +52235,9 @@ OUI:3C10E6*
 OUI:3C11B2*
  ID_OUI_FROM_DATABASE=Fraunhofer FIT
 
+OUI:3C13CC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:3C15C2*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -51770,6 +52271,9 @@ OUI:3C1A57*
 OUI:3C1A79*
  ID_OUI_FROM_DATABASE=Huayuan Technology CO.,LTD
 
+OUI:3C1A9E*
+ ID_OUI_FROM_DATABASE=VitalThings AS
+
 OUI:3C1CBE*
  ID_OUI_FROM_DATABASE=JADAK LLC
 
@@ -51872,6 +52376,9 @@ OUI:3C2F3A*
 OUI:3C300C*
  ID_OUI_FROM_DATABASE=Dewar Electronics Pty Ltd
 
+OUI:3C306F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:3C3178*
  ID_OUI_FROM_DATABASE=Qolsys Inc.
 
@@ -52022,6 +52529,9 @@ OUI:3C4C69*
 OUI:3C4CD0*
  ID_OUI_FROM_DATABASE=CERAGON NETWORKS
 
+OUI:3C4DBE*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:3C4E47*
  ID_OUI_FROM_DATABASE=Etronic A/S
 
@@ -52031,6 +52541,9 @@ OUI:3C510E*
 OUI:3C5282*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
+OUI:3C53D7*
+ ID_OUI_FROM_DATABASE=CEDES AG
+
 OUI:3C5731*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -52211,6 +52724,9 @@ OUI:3C8375*
 OUI:3C83B5*
  ID_OUI_FROM_DATABASE=Advance Vision Electronics Co. Ltd.
 
+OUI:3C846A*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
 OUI:3C86A8*
  ID_OUI_FROM_DATABASE=Sangshin elecom .co,, LTD
 
@@ -52301,6 +52817,9 @@ OUI:3C9A77*
 OUI:3C9BD6*
  ID_OUI_FROM_DATABASE=Vizio, Inc
 
+OUI:3C9C0F*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:3C9D56*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -52331,6 +52850,9 @@ OUI:3CA581*
 OUI:3CA616*
  ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
+OUI:3CA62F*
+ ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
+
 OUI:3CA72B*
  ID_OUI_FROM_DATABASE=MRV Communications (Networks) LTD
 
@@ -52355,6 +52877,9 @@ OUI:3CB15B*
 OUI:3CB17F*
  ID_OUI_FROM_DATABASE=Wattwatchers Pty Ld
 
+OUI:3CB233*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:3CB53D*
  ID_OUI_FROM_DATABASE=HUNAN GOKE MICROELECTRONICS CO.,LTD
 
@@ -52487,6 +53012,9 @@ OUI:3CE072*
 OUI:3CE1A1*
  ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
+OUI:3CE3E7*
+ ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
+
 OUI:3CE5A6*
  ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
@@ -52625,6 +53153,9 @@ OUI:40040C*
 OUI:400589*
  ID_OUI_FROM_DATABASE=T-Mobile, USA
 
+OUI:400634*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:4006A0*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
@@ -53090,6 +53621,9 @@ OUI:40862E*
 OUI:408805*
  ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
+OUI:40882F*
+ ID_OUI_FROM_DATABASE=Extreme Networks, Inc.
+
 OUI:4088E0*
  ID_OUI_FROM_DATABASE=Beijing Ereneben Information Technology Limited Shenzhen Branch
 
@@ -53222,6 +53756,9 @@ OUI:40A8F0*
 OUI:40A93F*
  ID_OUI_FROM_DATABASE=Pivotal Commware, Inc.
 
+OUI:40AA56*
+ ID_OUI_FROM_DATABASE=China Dragon Technology Limited
+
 OUI:40AC8D*
  ID_OUI_FROM_DATABASE=Data Management, Inc.
 
@@ -53342,6 +53879,9 @@ OUI:40CD7A*
 OUI:40CE24*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:40D25F*
+ ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
+
 OUI:40D28A*
  ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
@@ -53369,6 +53909,12 @@ OUI:40D855*
 OUI:40DC9D*
  ID_OUI_FROM_DATABASE=HAJEN
 
+OUI:40DCA5*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
+OUI:40DDD1*
+ ID_OUI_FROM_DATABASE=Beautiful Card Corporation
+
 OUI:40DEAD*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
@@ -53552,6 +54098,9 @@ OUI:440049*
 OUI:44004D*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:4401BB*
+ ID_OUI_FROM_DATABASE=SHENZHEN BILIAN ELECTRONIC CO.,LTD
+
 OUI:44032C*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -53633,6 +54182,9 @@ OUI:4413D0*
 OUI:441441*
  ID_OUI_FROM_DATABASE=AudioControl Inc.
 
+OUI:441622*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
+
 OUI:441847*
  ID_OUI_FROM_DATABASE=HUNAN SCROWN ELECTRONIC INFORMATION TECH.CO.,LTD
 
@@ -53651,6 +54203,9 @@ OUI:441AFA*
 OUI:441C12*
  ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
+OUI:441C7F*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+
 OUI:441CA8*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -53663,6 +54218,9 @@ OUI:441E98*
 OUI:441EA1*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
+OUI:44227C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:442295*
  ID_OUI_FROM_DATABASE=China Mobile Iot Limited company
 
@@ -53678,6 +54236,9 @@ OUI:4423AA*
 OUI:4425BB*
  ID_OUI_FROM_DATABASE=Bamboo Entertainment Corporation
 
+OUI:4427F3*
+ ID_OUI_FROM_DATABASE=70mai Co.,Ltd.
+
 OUI:4428A3*
  ID_OUI_FROM_DATABASE=Jiangsu fulian  Communication Technology Co., Ltd.
 
@@ -53816,6 +54377,9 @@ OUI:44568D*
 OUI:4456B7*
  ID_OUI_FROM_DATABASE=Spawn Labs, Inc
 
+OUI:4456E2*
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+
 OUI:445829*
  ID_OUI_FROM_DATABASE=Cisco SPVTG
 
@@ -53873,6 +54437,9 @@ OUI:446747*
 OUI:446755*
  ID_OUI_FROM_DATABASE=Orbit Irrigation
 
+OUI:44680C*
+ ID_OUI_FROM_DATABASE=Wacom Co.,Ltd.
+
 OUI:4468AB*
  ID_OUI_FROM_DATABASE=JUIN COMPANY, LIMITED
 
@@ -53978,6 +54545,9 @@ OUI:448F17*
 OUI:449160*
  ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
+OUI:44917C*
+ ID_OUI_FROM_DATABASE=HMD Global Oy
+
 OUI:4491DB*
  ID_OUI_FROM_DATABASE=Shanghai Huaqin Telecom Technology Co.,Ltd
 
@@ -54014,6 +54584,9 @@ OUI:44A42D*
 OUI:44A466*
  ID_OUI_FROM_DATABASE=GROUPE LDLC
 
+OUI:44A54E*
+ ID_OUI_FROM_DATABASE=Qorvo Utrecht B.V.
+
 OUI:44A56E*
  ID_OUI_FROM_DATABASE=NETGEAR
 
@@ -54050,12 +54623,18 @@ OUI:44AAF5*
 OUI:44AD19*
  ID_OUI_FROM_DATABASE=XINGFEI (H.K)LIMITED
 
+OUI:44ADB1*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+
 OUI:44ADD9*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
 OUI:44AEAB*
  ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
+OUI:44AF28*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:44B295*
  ID_OUI_FROM_DATABASE=Sichuan AI-Link Technology Co., Ltd.
 
@@ -54080,6 +54659,9 @@ OUI:44B994*
 OUI:44BA46*
  ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
+OUI:44BB3B*
+ ID_OUI_FROM_DATABASE=Google, Inc.
+
 OUI:44BFE3*
  ID_OUI_FROM_DATABASE=Shenzhen Longtech Electronics Co.,Ltd
 
@@ -54248,6 +54830,9 @@ OUI:44E4EE*
 OUI:44E66E*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:44E6B0*
+ ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
+
 OUI:44E8A5*
  ID_OUI_FROM_DATABASE=Myreka Technologies Sdn. Bhd.
 
@@ -54290,6 +54875,9 @@ OUI:44F459*
 OUI:44F477*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
+OUI:44F4E7*
+ ID_OUI_FROM_DATABASE=Cohesity Inc
+
 OUI:44F849*
  ID_OUI_FROM_DATABASE=Union Pacific Railroad
 
@@ -54329,6 +54917,9 @@ OUI:480362*
 OUI:48049F*
  ID_OUI_FROM_DATABASE=ELECOM CO., LTD
 
+OUI:4805E2*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:48066A*
  ID_OUI_FROM_DATABASE=Tempered Networks, Inc.
 
@@ -54398,6 +54989,9 @@ OUI:48137E*
 OUI:4813F3*
  ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
 
+OUI:481693*
+ ID_OUI_FROM_DATABASE=Lear Corporation GmbH
+
 OUI:48174C*
  ID_OUI_FROM_DATABASE=MicroPower technologies
 
@@ -54422,6 +55016,12 @@ OUI:48210B*
 OUI:48216C*
  ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
 
+OUI:482335*
+ ID_OUI_FROM_DATABASE=Dialog Semiconductor Hellas SA
+
+OUI:48262C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:4826E8*
  ID_OUI_FROM_DATABASE=Tek-Air Systems, Inc.
 
@@ -54440,6 +55040,9 @@ OUI:482AE3*
 OUI:482CA0*
  ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
+OUI:482CD0*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:482CEA*
  ID_OUI_FROM_DATABASE=Motorola Inc Business Light Radios
 
@@ -54479,6 +55082,9 @@ OUI:48435A*
 OUI:48437C*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:4843DD*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
 OUI:484487*
  ID_OUI_FROM_DATABASE=Cisco SPVTG
 
@@ -54740,6 +55346,9 @@ OUI:488EEF*
 OUI:488F5A*
  ID_OUI_FROM_DATABASE=Routerboard.com
 
+OUI:48902F*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+
 OUI:489153*
  ID_OUI_FROM_DATABASE=Weinmann Geräte für Medizin GmbH + Co. KG
 
@@ -54782,6 +55391,9 @@ OUI:48A22D*
 OUI:48A2B7*
  ID_OUI_FROM_DATABASE=Kodofon JSC
 
+OUI:48A2B8*
+ ID_OUI_FROM_DATABASE=Chengdu Vision-Zenith Tech.Co,.Ltd
+
 OUI:48A2E6*
  ID_OUI_FROM_DATABASE=Resideo
 
@@ -55163,12 +55775,18 @@ OUI:4C1D96*
 OUI:4C1FCC*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:4C2113*
+ ID_OUI_FROM_DATABASE=Nokia Shanghai Bell Co., Ltd.
+
 OUI:4C218C*
  ID_OUI_FROM_DATABASE=Panasonic India Private limited
 
 OUI:4C21D0*
  ID_OUI_FROM_DATABASE=Sony Mobile Communications Inc
 
+OUI:4C2219*
+ ID_OUI_FROM_DATABASE=YUANFUDAO HK LIMTED
+
 OUI:4C2258*
  ID_OUI_FROM_DATABASE=cozybit, Inc.
 
@@ -55187,6 +55805,9 @@ OUI:4C2C80*
 OUI:4C2C83*
  ID_OUI_FROM_DATABASE=Zhejiang KaNong Network Technology Co.,Ltd.
 
+OUI:4C2EFE*
+ ID_OUI_FROM_DATABASE=Shenzhen Comnect Technology Co.,LTD
+
 OUI:4C2F9D*
  ID_OUI_FROM_DATABASE=ICM Controls
 
@@ -55478,6 +56099,9 @@ OUI:4C7A48*
 OUI:4C7C5F*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:4C7CD9*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:4C7F62*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
@@ -55574,6 +56198,51 @@ OUI:4C917AD*
 OUI:4C917AE*
  ID_OUI_FROM_DATABASE=Annapurna labs
 
+OUI:4C93A60*
+ ID_OUI_FROM_DATABASE=Vestaboard, Inc.
+
+OUI:4C93A61*
+ ID_OUI_FROM_DATABASE=Atrie Technology Fzc
+
+OUI:4C93A62*
+ ID_OUI_FROM_DATABASE=Diehl Controls Nanjing Co., Ltd.
+
+OUI:4C93A63*
+ ID_OUI_FROM_DATABASE=Commsignia, Ltd.
+
+OUI:4C93A64*
+ ID_OUI_FROM_DATABASE=4D Sistem Ticaret A.S.
+
+OUI:4C93A65*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:4C93A66*
+ ID_OUI_FROM_DATABASE=Shandong Senter Electronic Co., Ltd
+
+OUI:4C93A67*
+ ID_OUI_FROM_DATABASE=5Voxel Co., Ltd.
+
+OUI:4C93A68*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation.
+
+OUI:4C93A69*
+ ID_OUI_FROM_DATABASE=Advantics
+
+OUI:4C93A6A*
+ ID_OUI_FROM_DATABASE=Hanwang Technology Co.,Ltd
+
+OUI:4C93A6B*
+ ID_OUI_FROM_DATABASE=Felten Electronics
+
+OUI:4C93A6C*
+ ID_OUI_FROM_DATABASE=Wuhan Maiwe communication Co.,Ltd
+
+OUI:4C93A6D*
+ ID_OUI_FROM_DATABASE=Cantronic Systems (Canada) Inc
+
+OUI:4C93A6E*
+ ID_OUI_FROM_DATABASE=CELLTRON
+
 OUI:4C9614*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
@@ -55628,6 +56297,9 @@ OUI:4CAC0A*
 OUI:4CADA8*
  ID_OUI_FROM_DATABASE=PANOPTICS CORP.
 
+OUI:4CAE13*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:4CAE1C*
  ID_OUI_FROM_DATABASE=SaiNXT Technologies LLP
 
@@ -55637,6 +56309,9 @@ OUI:4CAE31*
 OUI:4CAEA3*
  ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
+OUI:4CAEEC*
+ ID_OUI_FROM_DATABASE=Guangzhou limee technology co.,LTD
+
 OUI:4CB008*
  ID_OUI_FROM_DATABASE=Shenzhen Gwelltimes Technology Co.,Ltd
 
@@ -55676,6 +56351,9 @@ OUI:4CB8B5*
 OUI:4CB911*
  ID_OUI_FROM_DATABASE=Raisecom Technology CO.,LTD
 
+OUI:4CB99B*
+ ID_OUI_FROM_DATABASE=WEIFANG GOERTEK ELECTRONICS CO.,LTD
+
 OUI:4CB9C8*
  ID_OUI_FROM_DATABASE=CONET CO., LTD.
 
@@ -55775,6 +56453,9 @@ OUI:4CC8A1*
 OUI:4CC94F*
  ID_OUI_FROM_DATABASE=Nokia
 
+OUI:4CC95E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:4CCA53*
  ID_OUI_FROM_DATABASE=Skyera, Inc.
 
@@ -56105,6 +56786,9 @@ OUI:502690*
 OUI:5027C7*
  ID_OUI_FROM_DATABASE=TECHNART Co.,Ltd
 
+OUI:502873*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:50294D*
  ID_OUI_FROM_DATABASE=NANJING IOT SENSOR TECHNOLOGY CO,LTD
 
@@ -56405,6 +57089,9 @@ OUI:506F98*
 OUI:506F9A*
  ID_OUI_FROM_DATABASE=Wi-Fi Alliance
 
+OUI:507043*
+ ID_OUI_FROM_DATABASE=BSkyB Ltd
+
 OUI:5070E5*
  ID_OUI_FROM_DATABASE=He Shan World Fair Electronics Technology Limited
 
@@ -56669,6 +57356,9 @@ OUI:50C58D*
 OUI:50C6AD*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
+OUI:50C709*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
 OUI:50C7BF*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
@@ -56786,6 +57476,9 @@ OUI:50DE19E*
 OUI:50DF95*
  ID_OUI_FROM_DATABASE=Lytx
 
+OUI:50E039*
+ ID_OUI_FROM_DATABASE=Zyxel Communications Corporation
+
 OUI:50E085*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -56849,15 +57542,24 @@ OUI:50F61A*
 OUI:50F722*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:50F7ED*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:50F8A5*
  ID_OUI_FROM_DATABASE=eWBM Co., Ltd.
 
+OUI:50F958*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:50FA84*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
 OUI:50FAAB*
  ID_OUI_FROM_DATABASE=L-tek d.o.o.
 
+OUI:50FB19*
+ ID_OUI_FROM_DATABASE=CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.
+
 OUI:50FC30*
  ID_OUI_FROM_DATABASE=Treehouse Labs
 
@@ -56939,6 +57641,9 @@ OUI:54055F*
 OUI:540593*
  ID_OUI_FROM_DATABASE=WOORI ELEC Co.,Ltd
 
+OUI:5405DB*
+ ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology co., ltd
+
 OUI:54068B*
  ID_OUI_FROM_DATABASE=Ningbo Deli Kebei Technology Co.LTD
 
@@ -57111,7 +57816,7 @@ OUI:54489C*
  ID_OUI_FROM_DATABASE=CDOUBLES ELECTRONICS CO. LTD.
 
 OUI:5448E6*
- ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co.,Ltd
+ ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
 
 OUI:544A00*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
@@ -57146,6 +57851,9 @@ OUI:545414*
 OUI:5454CF*
  ID_OUI_FROM_DATABASE=PROBEDIGITAL CO.,LTD
 
+OUI:5455D5*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:545AA6*
  ID_OUI_FROM_DATABASE=Espressif Inc.
 
@@ -57209,6 +57917,9 @@ OUI:547595*
 OUI:5475D0*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:54778A*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+
 OUI:54781A*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -57251,12 +57962,18 @@ OUI:54833A*
 OUI:54847B*
  ID_OUI_FROM_DATABASE=Digital Devices GmbH
 
+OUI:5484DC*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:5486BC*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
 OUI:54880E*
  ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
+OUI:5488DE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:548922*
  ID_OUI_FROM_DATABASE=Zelfy Inc
 
@@ -57441,7 +58158,7 @@ OUI:54A9D4*
  ID_OUI_FROM_DATABASE=Minibar Systems
 
 OUI:54AB3A*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:54AE27*
  ID_OUI_FROM_DATABASE=Apple, Inc.
@@ -57536,6 +58253,9 @@ OUI:54D46F*
 OUI:54D751*
  ID_OUI_FROM_DATABASE=Proximus
 
+OUI:54D9C6*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:54D9E4*
  ID_OUI_FROM_DATABASE=BRILLIANTTS CO., LTD
 
@@ -57620,6 +58340,9 @@ OUI:54EF92*
 OUI:54EFFE*
  ID_OUI_FROM_DATABASE=Fullpower Technologies, Inc.
 
+OUI:54F15F*
+ ID_OUI_FROM_DATABASE=Sichuan AI-Link Technology Co., Ltd.
+
 OUI:54F201*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -57879,7 +58602,7 @@ OUI:58639A*
  ID_OUI_FROM_DATABASE=TPL SYSTEMES
 
 OUI:5865E6*
- ID_OUI_FROM_DATABASE=INFOMARK CO., LTD.
+ ID_OUI_FROM_DATABASE=infomark
 
 OUI:5866BA*
  ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
@@ -58007,6 +58730,9 @@ OUI:5893D8*
 OUI:58946B*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:5894A2*
+ ID_OUI_FROM_DATABASE=KETEK GmbH
+
 OUI:5894B2*
  ID_OUI_FROM_DATABASE=BrainCo
 
@@ -58082,6 +58808,9 @@ OUI:58B42D*
 OUI:58B568*
  ID_OUI_FROM_DATABASE=SECURITAS DIRECT ESPAÑA, SAU
 
+OUI:58B623*
+ ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
+
 OUI:58B633*
  ID_OUI_FROM_DATABASE=Ruckus Wireless
 
@@ -58202,6 +58931,9 @@ OUI:58E747*
 OUI:58E808*
  ID_OUI_FROM_DATABASE=AUTONICS CORPORATION
 
+OUI:58E873*
+ ID_OUI_FROM_DATABASE=HANGZHOU DANGBEI NETWORK TECH.Co.,Ltd
+
 OUI:58E8760*
  ID_OUI_FROM_DATABASE=Private
 
@@ -58268,6 +59000,9 @@ OUI:58EF68*
 OUI:58F102*
  ID_OUI_FROM_DATABASE=BLU Products Inc.
 
+OUI:58F2FC*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:58F387*
  ID_OUI_FROM_DATABASE=HCCP
 
@@ -58346,6 +59081,9 @@ OUI:58FCDBF*
 OUI:58FD20*
  ID_OUI_FROM_DATABASE=Bravida Sakerhet AB
 
+OUI:58FDB1*
+ ID_OUI_FROM_DATABASE=LG Electronics
+
 OUI:58FDBE*
  ID_OUI_FROM_DATABASE=Shenzhen Taikaida Technology Co., Ltd
 
@@ -58511,6 +59249,9 @@ OUI:5C41E7*
 OUI:5C43D2*
  ID_OUI_FROM_DATABASE=HAZEMEYER
 
+OUI:5C443E*
+ ID_OUI_FROM_DATABASE=Skullcandy
+
 OUI:5C4527*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
@@ -58589,6 +59330,9 @@ OUI:5C63BF*
 OUI:5C63C9*
  ID_OUI_FROM_DATABASE=Intellithings Ltd.
 
+OUI:5C647A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:5C666C*
  ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
@@ -58646,6 +59390,9 @@ OUI:5C78F8*
 OUI:5C7D5E*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:5C7D7D*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+
 OUI:5C80B6*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -58658,6 +59405,51 @@ OUI:5C838F*
 OUI:5C8486*
  ID_OUI_FROM_DATABASE=Brightsource Industries Israel LTD
 
+OUI:5C857E0*
+ ID_OUI_FROM_DATABASE=28 Gorilla
+
+OUI:5C857E1*
+ ID_OUI_FROM_DATABASE=Sichuan C.H Control Technology Co., Ltd.
+
+OUI:5C857E2*
+ ID_OUI_FROM_DATABASE=mobilogix HongKong
+
+OUI:5C857E3*
+ ID_OUI_FROM_DATABASE=Cable Matters Inc.
+
+OUI:5C857E4*
+ ID_OUI_FROM_DATABASE=Shenzhen IP3 Century Intelligent Technology CO.,Ltd
+
+OUI:5C857E5*
+ ID_OUI_FROM_DATABASE=Shanghai Yanhe automation technology co.,LTD
+
+OUI:5C857E6*
+ ID_OUI_FROM_DATABASE=ProdataKey
+
+OUI:5C857E7*
+ ID_OUI_FROM_DATABASE=Beijing HZFD Technology Co., Ltd
+
+OUI:5C857E8*
+ ID_OUI_FROM_DATABASE=BeiJing Xinsheng Technology Co.,Ltd
+
+OUI:5C857E9*
+ ID_OUI_FROM_DATABASE=Express LUCK Industrial Ltd.
+
+OUI:5C857EA*
+ ID_OUI_FROM_DATABASE=Zhejiang Jetron Ark Digital Technology Co., Ltd
+
+OUI:5C857EB*
+ ID_OUI_FROM_DATABASE=HHCC Plant Technology Co., Ltd.
+
+OUI:5C857EC*
+ ID_OUI_FROM_DATABASE=Annapurna labs
+
+OUI:5C857ED*
+ ID_OUI_FROM_DATABASE=Nautech Electronics Ltd
+
+OUI:5C857EE*
+ ID_OUI_FROM_DATABASE=Guoyi Liangzi (Hefei) Technology Co., Ltd(CIQTEK)
+
 OUI:5C8613*
  ID_OUI_FROM_DATABASE=Beijing Zhoenet Technology Co., Ltd
 
@@ -58697,6 +59489,12 @@ OUI:5C8D4E*
 OUI:5C8FE0*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
+OUI:5C9012*
+ ID_OUI_FROM_DATABASE=Owl Cyber Defense Solutions, LLC
+
+OUI:5C9157*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:5C925E*
  ID_OUI_FROM_DATABASE=Zioncom Electronics (Shenzhen) Ltd.
 
@@ -58742,6 +59540,9 @@ OUI:5CA3EB*
 OUI:5CA48A*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:5CA5BC*
+ ID_OUI_FROM_DATABASE=eero inc.
+
 OUI:5CA62D*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -58892,6 +59693,9 @@ OUI:5CD41B*
 OUI:5CD4AB*
  ID_OUI_FROM_DATABASE=Zektor
 
+OUI:5CD5B5*
+ ID_OUI_FROM_DATABASE=Shenzhen WiSiYiLink Technology Co.,Ltd
+
 OUI:5CD61F*
  ID_OUI_FROM_DATABASE=Qardio, Inc
 
@@ -59066,6 +59870,9 @@ OUI:5CFB7C*
 OUI:5CFC66*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:5CFE9E*
+ ID_OUI_FROM_DATABASE=Wiwynn Corporation Tainan Branch
+
 OUI:5CFF35*
  ID_OUI_FROM_DATABASE=Wistron Corporation
 
@@ -59096,6 +59903,9 @@ OUI:600417*
 OUI:60058A*
  ID_OUI_FROM_DATABASE=Hitachi Metals, Ltd.
 
+OUI:60077C*
+ ID_OUI_FROM_DATABASE=Jala Group
+
 OUI:600810*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -59207,6 +60017,9 @@ OUI:60313B*
 OUI:603197*
  ID_OUI_FROM_DATABASE=Zyxel Communications Corporation
 
+OUI:6032B1*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
 OUI:6032F0*
  ID_OUI_FROM_DATABASE=Mplus technology
 
@@ -59303,6 +60116,9 @@ OUI:605317*
 OUI:605464*
  ID_OUI_FROM_DATABASE=Eyedro Green Solutions Inc.
 
+OUI:605661*
+ ID_OUI_FROM_DATABASE=IXECLOUD Tech
+
 OUI:605718*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -59390,6 +60206,9 @@ OUI:607771*
 OUI:6077E2*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:607EC9*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:607ECD*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -59519,6 +60338,9 @@ OUI:6097DD*
 OUI:609813*
  ID_OUI_FROM_DATABASE=Shanghai Visking Digital Technology Co. LTD
 
+OUI:609866*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:6099D1*
  ID_OUI_FROM_DATABASE=Vuzix / Lenovo
 
@@ -59552,6 +60374,9 @@ OUI:60A11E*
 OUI:60A37D*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:60A423*
+ ID_OUI_FROM_DATABASE=Silicon Laboratories
+
 OUI:60A44C*
  ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
@@ -59567,6 +60392,9 @@ OUI:60A8FE*
 OUI:60A9B0*
  ID_OUI_FROM_DATABASE=Merchandising Technologies, Inc
 
+OUI:60AAEF*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:60AB14*
  ID_OUI_FROM_DATABASE=LG Innotek
 
@@ -59600,6 +60428,9 @@ OUI:60B606*
 OUI:60B617*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
+OUI:60B76E*
+ ID_OUI_FROM_DATABASE=Google, Inc.
+
 OUI:60B933*
  ID_OUI_FROM_DATABASE=Deutron Electronics Corp.
 
@@ -59690,6 +60521,9 @@ OUI:60D2DD*
 OUI:60D30A*
  ID_OUI_FROM_DATABASE=Quatius Limited
 
+OUI:60D4E9*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
 OUI:60D755*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -59789,8 +60623,11 @@ OUI:60E78A*
 OUI:60E956*
  ID_OUI_FROM_DATABASE=Ayla Networks, Inc
 
+OUI:60EB5A*
+ ID_OUI_FROM_DATABASE=Asterfusion Data Technologies Co.,Ltd
+
 OUI:60EB69*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:60EE5C*
  ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
@@ -59897,6 +60734,9 @@ OUI:6409AC*
 OUI:640B4A*
  ID_OUI_FROM_DATABASE=Digital Telecom Technology Limited
 
+OUI:640BD7*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:640DCE*
  ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
 
@@ -59984,6 +60824,9 @@ OUI:6429ED*
 OUI:642B8A*
  ID_OUI_FROM_DATABASE=ALL BEST Industrial Co., Ltd.
 
+OUI:642C0F*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+
 OUI:642CAC*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -60038,6 +60881,9 @@ OUI:64317E*
 OUI:6432A8*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:6433DB*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:643409*
  ID_OUI_FROM_DATABASE=BITwave Pte Ltd
 
@@ -60047,6 +60893,9 @@ OUI:64351C*
 OUI:643AB1*
  ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
+OUI:643AEA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:643E8C*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -60230,6 +61079,9 @@ OUI:646A52*
 OUI:646A74*
  ID_OUI_FROM_DATABASE=AUTH-SERVERS, LLC
 
+OUI:646C80*
+ ID_OUI_FROM_DATABASE=CHONGQING FUGUI ELECTRONICS CO.,LTD.
+
 OUI:646CB2*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -60431,6 +61283,9 @@ OUI:64B473*
 OUI:64B5C6*
  ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
 
+OUI:64B623*
+ ID_OUI_FROM_DATABASE=CCS Care Communication Solutions GmbH
+
 OUI:64B64A*
  ID_OUI_FROM_DATABASE=ViVOtech, Inc.
 
@@ -60578,6 +61433,9 @@ OUI:64E625*
 OUI:64E682*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:64E7D8*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:64E84F*
  ID_OUI_FROM_DATABASE=Serialway Communication Technology Co. Ltd
 
@@ -60887,12 +61745,18 @@ OUI:684F64*
 OUI:6851B7*
  ID_OUI_FROM_DATABASE=PowerCloud Systems, Inc.
 
+OUI:6852D6*
+ ID_OUI_FROM_DATABASE=UGame Technology Co.,Ltd
+
 OUI:68536C*
  ID_OUI_FROM_DATABASE=SPnS Co.,Ltd
 
 OUI:685388*
  ID_OUI_FROM_DATABASE=P&S Technology
 
+OUI:68545A*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:6854C1*
  ID_OUI_FROM_DATABASE=ColorTokens, Inc.
 
@@ -60989,6 +61853,9 @@ OUI:687CD5*
 OUI:687D6B*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:687DB4*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:687F74*
  ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
@@ -61019,6 +61886,9 @@ OUI:6886E7*
 OUI:68876B*
  ID_OUI_FROM_DATABASE=INQ Mobile Limited
 
+OUI:6888A1*
+ ID_OUI_FROM_DATABASE=Universal Electronics, Inc.
+
 OUI:688975*
  ID_OUI_FROM_DATABASE=nuoxc
 
@@ -61094,6 +61964,9 @@ OUI:6891D0E*
 OUI:689234*
  ID_OUI_FROM_DATABASE=Ruckus Wireless
 
+OUI:689320*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
 OUI:689361*
  ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
@@ -61262,6 +62135,9 @@ OUI:68D247*
 OUI:68D482*
  ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
+OUI:68D6ED*
+ ID_OUI_FROM_DATABASE=GooWi Wireless Technology Co., Limited
+
 OUI:68D79A*
  ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
 
@@ -61559,6 +62435,9 @@ OUI:6C42AB*
 OUI:6C4418*
  ID_OUI_FROM_DATABASE=Zappware
 
+OUI:6C442A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:6C4598*
  ID_OUI_FROM_DATABASE=Antex Electronic Corp.
 
@@ -61796,6 +62675,9 @@ OUI:6C96CF*
 OUI:6C98EB*
  ID_OUI_FROM_DATABASE=Riverbed Technology, Inc.
 
+OUI:6C9961*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+
 OUI:6C9989*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -61820,6 +62702,9 @@ OUI:6C9E7C*
 OUI:6CA100*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:6CA4D1*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
 OUI:6CA604*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
@@ -61919,6 +62804,9 @@ OUI:6CB7F4*
 OUI:6CB9C5*
  ID_OUI_FROM_DATABASE=Delta Networks, Inc.
 
+OUI:6CBAB8*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+
 OUI:6CBEE9*
  ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
 
@@ -61952,6 +62840,9 @@ OUI:6CC7EC*
 OUI:6CCA08*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
+OUI:6CCE44*
+ ID_OUI_FROM_DATABASE=1MORE
+
 OUI:6CD032*
  ID_OUI_FROM_DATABASE=LG Electronics
 
@@ -61982,6 +62873,9 @@ OUI:6CDD30*
 OUI:6CDDBC*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:6CDEA9*
+ ID_OUI_FROM_DATABASE=Cisco Meraki
+
 OUI:6CDFFB0*
  ID_OUI_FROM_DATABASE=Shenzhen HDCVT Technology
 
@@ -62042,6 +62936,9 @@ OUI:6CE4CE*
 OUI:6CE4DA*
  ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
 
+OUI:6CE5F7*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
 OUI:6CE85C*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -62249,6 +63146,9 @@ OUI:702AD5*
 OUI:702B1D*
  ID_OUI_FROM_DATABASE=E-Domus International Limited
 
+OUI:702C09*
+ ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
+
 OUI:702C1F*
  ID_OUI_FROM_DATABASE=Wisol
 
@@ -62312,6 +63212,9 @@ OUI:703A51*
 OUI:703A73*
  ID_OUI_FROM_DATABASE=Shenzhen Sundray Technologies Company Limited
 
+OUI:703AA6*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
 OUI:703ACB*
  ID_OUI_FROM_DATABASE=Google, Inc.
 
@@ -62462,6 +63365,9 @@ OUI:706173*
 OUI:70617B*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:7061EE*
+ ID_OUI_FROM_DATABASE=Sunwoda Electronic Co.,Ltd
+
 OUI:7062B8*
  ID_OUI_FROM_DATABASE=D-Link International
 
@@ -62486,6 +63392,51 @@ OUI:706879*
 OUI:70695A*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:7069790*
+ ID_OUI_FROM_DATABASE=Full Solution Telecom
+
+OUI:7069791*
+ ID_OUI_FROM_DATABASE=Linksys Telecom Shenzhen CO., LTD
+
+OUI:7069792*
+ ID_OUI_FROM_DATABASE=Graphcore Ltd
+
+OUI:7069793*
+ ID_OUI_FROM_DATABASE=Hebei Baina Xinda Technology Co., Ltd.
+
+OUI:7069794*
+ ID_OUI_FROM_DATABASE=SelectTech GeoSpatial, LLC
+
+OUI:7069795*
+ ID_OUI_FROM_DATABASE=Ibyte
+
+OUI:7069796*
+ ID_OUI_FROM_DATABASE=Beijing Security Union Information Technology Co.,Ltd
+
+OUI:7069797*
+ ID_OUI_FROM_DATABASE=Intelitech SIA
+
+OUI:7069798*
+ ID_OUI_FROM_DATABASE=An Phat Information Technology Co., Ltd
+
+OUI:7069799*
+ ID_OUI_FROM_DATABASE=Faurecia Clarion Electronics (Dongguan) Co., Ltd
+
+OUI:706979A*
+ ID_OUI_FROM_DATABASE=Foxconn Brasil Industria e Comercio Ltda
+
+OUI:706979B*
+ ID_OUI_FROM_DATABASE=Liquid Instruments Pty Ltd
+
+OUI:706979C*
+ ID_OUI_FROM_DATABASE=Rivian Automotive LLC
+
+OUI:706979D*
+ ID_OUI_FROM_DATABASE=FREUND ELEKTRONIKA D.O.O., IP-INTEGRA TECHNOLOGIES
+
+OUI:706979E*
+ ID_OUI_FROM_DATABASE=BAS-IP LP
+
 OUI:706BB9*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -62654,6 +63605,9 @@ OUI:708BCD*
 OUI:708CB6*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:708CBB*
+ ID_OUI_FROM_DATABASE=MIMODISPLAYKOREA
+
 OUI:708D09*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
@@ -62690,6 +63644,9 @@ OUI:709BFC*
 OUI:709C8F*
  ID_OUI_FROM_DATABASE=Nero AG
 
+OUI:709CD1*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:709E29*
  ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
@@ -62762,6 +63719,9 @@ OUI:70B3D5002*
 OUI:70B3D5003*
  ID_OUI_FROM_DATABASE=ANYROAM
 
+OUI:70B3D5005*
+ ID_OUI_FROM_DATABASE=CT Company
+
 OUI:70B3D5006*
  ID_OUI_FROM_DATABASE=Piranha EMS Inc.
 
@@ -62789,6 +63749,9 @@ OUI:70B3D500D*
 OUI:70B3D500E*
  ID_OUI_FROM_DATABASE=Magosys Systems LTD
 
+OUI:70B3D500F*
+ ID_OUI_FROM_DATABASE=Neusoft Reach Automotive Technology (Shenyang) Co.,Ltd
+
 OUI:70B3D5010*
  ID_OUI_FROM_DATABASE=Hanwa Electronic Ind.Co.,Ltd.
 
@@ -62972,6 +63935,9 @@ OUI:70B3D504E*
 OUI:70B3D5050*
  ID_OUI_FROM_DATABASE=Compusign Systems Pty Ltd
 
+OUI:70B3D5051*
+ ID_OUI_FROM_DATABASE=JT
+
 OUI:70B3D5052*
  ID_OUI_FROM_DATABASE=Sudo Premium Engineering
 
@@ -63128,6 +64094,9 @@ OUI:70B3D5087*
 OUI:70B3D5088*
  ID_OUI_FROM_DATABASE=OptiScan Biomedical Corp.
 
+OUI:70B3D5089*
+ ID_OUI_FROM_DATABASE=Kazdream Technologies LLP
+
 OUI:70B3D508A*
  ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
 
@@ -63161,6 +64130,9 @@ OUI:70B3D5093*
 OUI:70B3D5094*
  ID_OUI_FROM_DATABASE=Circuitlink Pty Ltd
 
+OUI:70B3D5095*
+ ID_OUI_FROM_DATABASE=plc-tec AG
+
 OUI:70B3D5096*
  ID_OUI_FROM_DATABASE=HAVELSAN A.Ş.
 
@@ -63257,6 +64229,9 @@ OUI:70B3D50B5*
 OUI:70B3D50B6*
  ID_OUI_FROM_DATABASE=Landis Gyr
 
+OUI:70B3D50B7*
+ ID_OUI_FROM_DATABASE=HAI ROBOTICS Co., Ltd.
+
 OUI:70B3D50B8*
  ID_OUI_FROM_DATABASE=Lucas-Nülle GmbH
 
@@ -63266,6 +64241,9 @@ OUI:70B3D50B9*
 OUI:70B3D50BA*
  ID_OUI_FROM_DATABASE=Ayre Acoustics, Inc.
 
+OUI:70B3D50BB*
+ ID_OUI_FROM_DATABASE=AnaPico AG
+
 OUI:70B3D50BC*
  ID_OUI_FROM_DATABASE=Practical Software Studio LLC
 
@@ -63401,6 +64379,9 @@ OUI:70B3D50E9*
 OUI:70B3D50EA*
  ID_OUI_FROM_DATABASE=AEV Broadcast Srl
 
+OUI:70B3D50EB*
+ ID_OUI_FROM_DATABASE=Tomahawk Robotics
+
 OUI:70B3D50EC*
  ID_OUI_FROM_DATABASE=ACS MOTION CONTROL
 
@@ -63491,12 +64472,18 @@ OUI:70B3D510A*
 OUI:70B3D510C*
  ID_OUI_FROM_DATABASE=Vocality International Ltd
 
+OUI:70B3D510D*
+ ID_OUI_FROM_DATABASE=CoreEL Technologies Pvt Ltd
+
 OUI:70B3D510E*
  ID_OUI_FROM_DATABASE=Colorimetry Research, Inc
 
 OUI:70B3D510F*
  ID_OUI_FROM_DATABASE=neQis
 
+OUI:70B3D5110*
+ ID_OUI_FROM_DATABASE=Orion Power Systems, Inc.
+
 OUI:70B3D5111*
  ID_OUI_FROM_DATABASE=Leonardo Sistemi Integrati S.r.l.
 
@@ -63689,6 +64676,9 @@ OUI:70B3D5154*
 OUI:70B3D5155*
  ID_OUI_FROM_DATABASE=Sanwa New Tec Co.,Ltd
 
+OUI:70B3D5157*
+ ID_OUI_FROM_DATABASE=Shanghai Jupper Technology Co.Ltd
+
 OUI:70B3D5158*
  ID_OUI_FROM_DATABASE=EAX Labs s.r.o.
 
@@ -63725,6 +64715,9 @@ OUI:70B3D5163*
 OUI:70B3D5164*
  ID_OUI_FROM_DATABASE=Tokyo Drawing Ltd.
 
+OUI:70B3D5165*
+ ID_OUI_FROM_DATABASE=Wuhan Xingtuxinke ELectronic Co.,Ltd
+
 OUI:70B3D5166*
  ID_OUI_FROM_DATABASE=SERIAL IMAGE INC.
 
@@ -63770,6 +64763,9 @@ OUI:70B3D5174*
 OUI:70B3D5175*
  ID_OUI_FROM_DATABASE=Akribis Systems
 
+OUI:70B3D5177*
+ ID_OUI_FROM_DATABASE=Wired Broadcast Ltd
+
 OUI:70B3D5178*
  ID_OUI_FROM_DATABASE=Gamber Johnson-LLC
 
@@ -63782,6 +64778,9 @@ OUI:70B3D517A*
 OUI:70B3D517B*
  ID_OUI_FROM_DATABASE=Vistec Electron Beam GmbH
 
+OUI:70B3D517C*
+ ID_OUI_FROM_DATABASE=Farmpro Ltd
+
 OUI:70B3D517D*
  ID_OUI_FROM_DATABASE=Entech Electronics
 
@@ -63842,6 +64841,9 @@ OUI:70B3D518F*
 OUI:70B3D5190*
  ID_OUI_FROM_DATABASE=Fantom Wireless, Inc.
 
+OUI:70B3D5191*
+ ID_OUI_FROM_DATABASE=Algodue Elettronica Srl
+
 OUI:70B3D5192*
  ID_OUI_FROM_DATABASE=ASPT, INC.
 
@@ -63917,6 +64919,9 @@ OUI:70B3D51AF*
 OUI:70B3D51B1*
  ID_OUI_FROM_DATABASE=Shanghai Danyan Information Technology Co., Ltd.
 
+OUI:70B3D51B2*
+ ID_OUI_FROM_DATABASE=Cavagna Group Spa
+
 OUI:70B3D51B3*
  ID_OUI_FROM_DATABASE=Graphcore Ltd
 
@@ -63950,6 +64955,9 @@ OUI:70B3D51BF*
 OUI:70B3D51C0*
  ID_OUI_FROM_DATABASE=W. H. Leary Co., Inc.
 
+OUI:70B3D51C1*
+ ID_OUI_FROM_DATABASE=Sphere of economical technologies Ltd
+
 OUI:70B3D51C2*
  ID_OUI_FROM_DATABASE=CENSIS, Uiversity of Glasgow
 
@@ -63971,6 +64979,9 @@ OUI:70B3D51C8*
 OUI:70B3D51C9*
  ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
 
+OUI:70B3D51CA*
+ ID_OUI_FROM_DATABASE=inomatic GmbH
+
 OUI:70B3D51CB*
  ID_OUI_FROM_DATABASE=MatchX GmbH
 
@@ -64385,6 +65396,9 @@ OUI:70B3D5261*
 OUI:70B3D5262*
  ID_OUI_FROM_DATABASE=OOO Research and Production Center Computer Technologies
 
+OUI:70B3D5263*
+ ID_OUI_FROM_DATABASE=AXING AG
+
 OUI:70B3D5264*
  ID_OUI_FROM_DATABASE=ifak technology + service GmbH
 
@@ -64508,12 +65522,18 @@ OUI:70B3D528E*
 OUI:70B3D528F*
  ID_OUI_FROM_DATABASE=Overline Systems
 
+OUI:70B3D5291*
+ ID_OUI_FROM_DATABASE=Sequent AG
+
 OUI:70B3D5292*
  ID_OUI_FROM_DATABASE=Boston Dynamics
 
 OUI:70B3D5293*
  ID_OUI_FROM_DATABASE=Solar RIg Technologies
 
+OUI:70B3D5294*
+ ID_OUI_FROM_DATABASE=RCH Vietnam Limited Liability Company
+
 OUI:70B3D5295*
  ID_OUI_FROM_DATABASE=Cello Electronics (UK) Ltd
 
@@ -64526,6 +65546,9 @@ OUI:70B3D5297*
 OUI:70B3D5299*
  ID_OUI_FROM_DATABASE=KMtronic ltd
 
+OUI:70B3D529A*
+ ID_OUI_FROM_DATABASE=Profusion Limited
+
 OUI:70B3D529B*
  ID_OUI_FROM_DATABASE=DermaLumics S.L.
 
@@ -64583,6 +65606,9 @@ OUI:70B3D52AD*
 OUI:70B3D52AE*
  ID_OUI_FROM_DATABASE=Alere Technologies AS
 
+OUI:70B3D52AF*
+ ID_OUI_FROM_DATABASE=Enlaps
+
 OUI:70B3D52B0*
  ID_OUI_FROM_DATABASE=Beijing Zhongyi Yue Tai Technology Co., Ltd
 
@@ -64646,12 +65672,18 @@ OUI:70B3D52C4*
 OUI:70B3D52C7*
  ID_OUI_FROM_DATABASE=Worldsensing
 
+OUI:70B3D52C8*
+ ID_OUI_FROM_DATABASE=SLAT
+
 OUI:70B3D52C9*
  ID_OUI_FROM_DATABASE=SEASON DESIGN TECHNOLOGY
 
 OUI:70B3D52CA*
  ID_OUI_FROM_DATABASE=TATTILE SRL
 
+OUI:70B3D52CB*
+ ID_OUI_FROM_DATABASE=Yongtong tech
+
 OUI:70B3D52CC*
  ID_OUI_FROM_DATABASE=WeWork Companies, Inc.
 
@@ -64667,9 +65699,15 @@ OUI:70B3D52CF*
 OUI:70B3D52D0*
  ID_OUI_FROM_DATABASE=ijin co.,ltd.
 
+OUI:70B3D52D1*
+ ID_OUI_FROM_DATABASE=Integer.pl S.A.
+
 OUI:70B3D52D2*
  ID_OUI_FROM_DATABASE=SHANGHAI IRISIAN OPTRONICS TECHNOLOGY CO.,LTD.
 
+OUI:70B3D52D3*
+ ID_OUI_FROM_DATABASE=Hensoldt Sensors GmbH
+
 OUI:70B3D52D4*
  ID_OUI_FROM_DATABASE=CT Company
 
@@ -64685,6 +65723,9 @@ OUI:70B3D52D7*
 OUI:70B3D52D8*
  ID_OUI_FROM_DATABASE=Unisight Digital Products
 
+OUI:70B3D52D9*
+ ID_OUI_FROM_DATABASE=ZPAS S.A.
+
 OUI:70B3D52DA*
  ID_OUI_FROM_DATABASE=Skywave Networks Private Limited
 
@@ -64763,6 +65804,9 @@ OUI:70B3D52F5*
 OUI:70B3D52F6*
  ID_OUI_FROM_DATABASE=TATTILE SRL
 
+OUI:70B3D52F7*
+ ID_OUI_FROM_DATABASE=Military Research Institute
+
 OUI:70B3D52F8*
  ID_OUI_FROM_DATABASE=Tunstall A/S
 
@@ -64772,6 +65816,9 @@ OUI:70B3D52F9*
 OUI:70B3D52FA*
  ID_OUI_FROM_DATABASE=Toray Medical Co.,Ltd
 
+OUI:70B3D52FB*
+ ID_OUI_FROM_DATABASE=IK MULTIMEDIA PRODUCTION SRL
+
 OUI:70B3D52FC*
  ID_OUI_FROM_DATABASE=Loanguard T/A SE Controls
 
@@ -64787,6 +65834,9 @@ OUI:70B3D52FF*
 OUI:70B3D5300*
  ID_OUI_FROM_DATABASE=Novo DR Ltd.
 
+OUI:70B3D5301*
+ ID_OUI_FROM_DATABASE=WAYNE ANALYTICS LLC
+
 OUI:70B3D5302*
  ID_OUI_FROM_DATABASE=DogWatch Inc
 
@@ -64808,6 +65858,9 @@ OUI:70B3D5307*
 OUI:70B3D5308*
  ID_OUI_FROM_DATABASE=DSD MICROTECHNOLOGY,INC.
 
+OUI:70B3D530A*
+ ID_OUI_FROM_DATABASE=HongSeok Ltd.
+
 OUI:70B3D530B*
  ID_OUI_FROM_DATABASE=Ash Technologies
 
@@ -64880,6 +65933,9 @@ OUI:70B3D5329*
 OUI:70B3D532A*
  ID_OUI_FROM_DATABASE=Wuhan Xingtuxinke ELectronic Co.,Ltd
 
+OUI:70B3D532B*
+ ID_OUI_FROM_DATABASE=RTA srl
+
 OUI:70B3D532C*
  ID_OUI_FROM_DATABASE=ATION Corporation
 
@@ -64925,6 +65981,9 @@ OUI:70B3D533B*
 OUI:70B3D533C*
  ID_OUI_FROM_DATABASE=Videri Inc.
 
+OUI:70B3D533D*
+ ID_OUI_FROM_DATABASE=Schneider Electric Motion USA
+
 OUI:70B3D533E*
  ID_OUI_FROM_DATABASE=Dynamic Connect (Suzhou) Hi-Tech Electronic Co.,Ltd.
 
@@ -65156,6 +66215,9 @@ OUI:70B3D5391*
 OUI:70B3D5392*
  ID_OUI_FROM_DATABASE=Contec Americas Inc.
 
+OUI:70B3D5393*
+ ID_OUI_FROM_DATABASE=Monnit Corporation
+
 OUI:70B3D5394*
  ID_OUI_FROM_DATABASE=Romteck Australia
 
@@ -65189,6 +66251,9 @@ OUI:70B3D53A0*
 OUI:70B3D53A1*
  ID_OUI_FROM_DATABASE=Reckeen HDP Media sp. z o.o. sp. k.
 
+OUI:70B3D53A3*
+ ID_OUI_FROM_DATABASE=CDS Institute of Management Strategy, Inc.
+
 OUI:70B3D53A4*
  ID_OUI_FROM_DATABASE=Ascenix Corporation
 
@@ -65207,6 +66272,9 @@ OUI:70B3D53A9*
 OUI:70B3D53AA*
  ID_OUI_FROM_DATABASE=RCATSONE
 
+OUI:70B3D53AC*
+ ID_OUI_FROM_DATABASE=RF-Tuote Oy
+
 OUI:70B3D53AD*
  ID_OUI_FROM_DATABASE=CT Company
 
@@ -65219,9 +66287,15 @@ OUI:70B3D53AF*
 OUI:70B3D53B0*
  ID_OUI_FROM_DATABASE=Millennial Net, Inc.
 
+OUI:70B3D53B1*
+ ID_OUI_FROM_DATABASE=Global Power Products
+
 OUI:70B3D53B2*
  ID_OUI_FROM_DATABASE=Sicon srl
 
+OUI:70B3D53B4*
+ ID_OUI_FROM_DATABASE=YOUSUNG
+
 OUI:70B3D53B5*
  ID_OUI_FROM_DATABASE=Preston Industries dba PolyScience
 
@@ -65231,6 +66305,9 @@ OUI:70B3D53B7*
 OUI:70B3D53B8*
  ID_OUI_FROM_DATABASE=nVideon, Inc.
 
+OUI:70B3D53B9*
+ ID_OUI_FROM_DATABASE=BirdDog Australia
+
 OUI:70B3D53BA*
  ID_OUI_FROM_DATABASE=Silex Inside
 
@@ -65285,6 +66362,9 @@ OUI:70B3D53CB*
 OUI:70B3D53CC*
  ID_OUI_FROM_DATABASE=TerOpta Ltd
 
+OUI:70B3D53CD*
+ ID_OUI_FROM_DATABASE=BRS Sistemas Eletrônicos
+
 OUI:70B3D53CE*
  ID_OUI_FROM_DATABASE=Aditec GmbH
 
@@ -65297,6 +66377,9 @@ OUI:70B3D53D0*
 OUI:70B3D53D2*
  ID_OUI_FROM_DATABASE=Imagine Inc.
 
+OUI:70B3D53D3*
+ ID_OUI_FROM_DATABASE=GS Elektromedizinsiche Geräte G. Stemple GmbH
+
 OUI:70B3D53D4*
  ID_OUI_FROM_DATABASE=Sanmina Israel
 
@@ -65510,6 +66593,9 @@ OUI:70B3D5421*
 OUI:70B3D5422*
  ID_OUI_FROM_DATABASE=SUS Corporation
 
+OUI:70B3D5424*
+ ID_OUI_FROM_DATABASE=Underground Systems, Inc.
+
 OUI:70B3D5425*
  ID_OUI_FROM_DATABASE=SinterCast
 
@@ -65573,6 +66659,9 @@ OUI:70B3D5439*
 OUI:70B3D543B*
  ID_OUI_FROM_DATABASE=Kalycito Infotech Private Limited
 
+OUI:70B3D543C*
+ ID_OUI_FROM_DATABASE=Scenario Automation
+
 OUI:70B3D543D*
  ID_OUI_FROM_DATABASE=Veryx Technologies Private Limited
 
@@ -65678,9 +66767,15 @@ OUI:70B3D5466*
 OUI:70B3D5467*
  ID_OUI_FROM_DATABASE=GreenWake Technologies
 
+OUI:70B3D5468*
+ ID_OUI_FROM_DATABASE=Shanghai Junqian Sensing Technology Co., LTD
+
 OUI:70B3D5469*
  ID_OUI_FROM_DATABASE=Gentec Systems  Co.
 
+OUI:70B3D546A*
+ ID_OUI_FROM_DATABASE=Shenzhen Vikings Technology Co., Ltd.
+
 OUI:70B3D546B*
  ID_OUI_FROM_DATABASE=Airborne Engineering Limited
 
@@ -65744,6 +66839,9 @@ OUI:70B3D5481*
 OUI:70B3D5482*
  ID_OUI_FROM_DATABASE=Aeryon Labs Inc
 
+OUI:70B3D5484*
+ ID_OUI_FROM_DATABASE=Hermann Sewerin GmbH
+
 OUI:70B3D5486*
  ID_OUI_FROM_DATABASE=ChongQing JianTao Technology Co., Ltd.
 
@@ -65825,6 +66923,9 @@ OUI:70B3D54A1*
 OUI:70B3D54A2*
  ID_OUI_FROM_DATABASE=DEVAU Lemppenau GmbH
 
+OUI:70B3D54A3*
+ ID_OUI_FROM_DATABASE=TUALCOM ELEKTRONIK A.S.
+
 OUI:70B3D54A4*
  ID_OUI_FROM_DATABASE=DEUTA-WERKE GmbH
 
@@ -65993,6 +67094,9 @@ OUI:70B3D54E0*
 OUI:70B3D54E1*
  ID_OUI_FROM_DATABASE=Grupo Epelsa S.L.
 
+OUI:70B3D54E3*
+ ID_OUI_FROM_DATABASE=adnexo GmbH
+
 OUI:70B3D54E4*
  ID_OUI_FROM_DATABASE=W.A. Benjamin Electric Co.
 
@@ -66206,9 +67310,15 @@ OUI:70B3D5532*
 OUI:70B3D5533*
  ID_OUI_FROM_DATABASE=Nippon Marine Enterprises, Ltd.
 
+OUI:70B3D5534*
+ ID_OUI_FROM_DATABASE=Weihai Weigao Medical Imaging Technology Co., Ltd
+
 OUI:70B3D5535*
  ID_OUI_FROM_DATABASE=SITA Messtechnik GmbH
 
+OUI:70B3D5536*
+ ID_OUI_FROM_DATABASE=LARIMART SPA
+
 OUI:70B3D5537*
  ID_OUI_FROM_DATABASE=Biennebi s.r.l.
 
@@ -66338,6 +67448,9 @@ OUI:70B3D5565*
 OUI:70B3D5566*
  ID_OUI_FROM_DATABASE=Data Informs LLC
 
+OUI:70B3D5567*
+ ID_OUI_FROM_DATABASE=DogWatch Inc
+
 OUI:70B3D5568*
  ID_OUI_FROM_DATABASE=Small Data Garden Oy
 
@@ -66491,6 +67604,9 @@ OUI:70B3D559D*
 OUI:70B3D55A0*
  ID_OUI_FROM_DATABASE=Ascon Tecnologic S.r.l.
 
+OUI:70B3D55A1*
+ ID_OUI_FROM_DATABASE=BOE Technology Group Co., Ltd.
+
 OUI:70B3D55A2*
  ID_OUI_FROM_DATABASE=Wallner Automation GmbH
 
@@ -66578,12 +67694,21 @@ OUI:70B3D55C5*
 OUI:70B3D55C6*
  ID_OUI_FROM_DATABASE=C4I Systems Ltd
 
+OUI:70B3D55C7*
+ ID_OUI_FROM_DATABASE=QSnet Visual Technologies Ltd
+
 OUI:70B3D55C8*
  ID_OUI_FROM_DATABASE=YUYAMA MFG Co.,Ltd
 
+OUI:70B3D55C9*
+ ID_OUI_FROM_DATABASE=ICTK Holdings
+
 OUI:70B3D55CA*
  ID_OUI_FROM_DATABASE=ACD Elekronik GmbH
 
+OUI:70B3D55CB*
+ ID_OUI_FROM_DATABASE=ECoCoMS Ltd.
+
 OUI:70B3D55CC*
  ID_OUI_FROM_DATABASE=Akse srl
 
@@ -66617,6 +67742,9 @@ OUI:70B3D55D6*
 OUI:70B3D55D8*
  ID_OUI_FROM_DATABASE=LYNX Technik AG
 
+OUI:70B3D55D9*
+ ID_OUI_FROM_DATABASE=olympus-ossa
+
 OUI:70B3D55DA*
  ID_OUI_FROM_DATABASE=Valk Welding B.V.
 
@@ -66722,6 +67850,9 @@ OUI:70B3D55FC*
 OUI:70B3D55FD*
  ID_OUI_FROM_DATABASE=Windar Photonics
 
+OUI:70B3D55FE*
+ ID_OUI_FROM_DATABASE=Grossenbacher Systeme AG
+
 OUI:70B3D55FF*
  ID_OUI_FROM_DATABASE=Vaisala Oyj
 
@@ -66776,6 +67907,9 @@ OUI:70B3D5610*
 OUI:70B3D5611*
  ID_OUI_FROM_DATABASE=Avionica
 
+OUI:70B3D5612*
+ ID_OUI_FROM_DATABASE=Edge Power Solutions
+
 OUI:70B3D5613*
  ID_OUI_FROM_DATABASE=Suprock Technologies
 
@@ -66821,9 +67955,15 @@ OUI:70B3D5623*
 OUI:70B3D5625*
  ID_OUI_FROM_DATABASE=VX Instruments GmbH
 
+OUI:70B3D5626*
+ ID_OUI_FROM_DATABASE=KRONOTECH SRL
+
 OUI:70B3D5628*
  ID_OUI_FROM_DATABASE=MECT SRL
 
+OUI:70B3D5629*
+ ID_OUI_FROM_DATABASE=OZRAY
+
 OUI:70B3D562A*
  ID_OUI_FROM_DATABASE=DOGA
 
@@ -66848,6 +67988,9 @@ OUI:70B3D5630*
 OUI:70B3D5631*
  ID_OUI_FROM_DATABASE=SENSO2ME
 
+OUI:70B3D5632*
+ ID_OUI_FROM_DATABASE=Power Electronics Espana, S.L.
+
 OUI:70B3D5633*
  ID_OUI_FROM_DATABASE=OBSERVER FOUNDATION
 
@@ -66878,14 +68021,11 @@ OUI:70B3D563B*
 OUI:70B3D563C*
  ID_OUI_FROM_DATABASE=Pivothead
 
-OUI:70B3D563D*
- ID_OUI_FROM_DATABASE=Storbyte, Inc.
-
 OUI:70B3D563E*
  ID_OUI_FROM_DATABASE=RIKEN OPTECH CORPORATION
 
 OUI:70B3D563F*
- ID_OUI_FROM_DATABASE=YG COMPANY CO., LTD
+ ID_OUI_FROM_DATABASE=DARBS Inc.
 
 OUI:70B3D5640*
  ID_OUI_FROM_DATABASE=Electronic Equipment Company Pvt. Ltd.
@@ -66947,6 +68087,9 @@ OUI:70B3D5655*
 OUI:70B3D5656*
  ID_OUI_FROM_DATABASE=SonoSound ApS
 
+OUI:70B3D5657*
+ ID_OUI_FROM_DATABASE=ID Quantique SA
+
 OUI:70B3D5658*
  ID_OUI_FROM_DATABASE=emperor brands
 
@@ -67007,6 +68150,9 @@ OUI:70B3D566C*
 OUI:70B3D566D*
  ID_OUI_FROM_DATABASE=Sanmina Israel
 
+OUI:70B3D566F*
+ ID_OUI_FROM_DATABASE=Simplified MFG
+
 OUI:70B3D5670*
  ID_OUI_FROM_DATABASE=Particle sizing systems
 
@@ -67043,6 +68189,9 @@ OUI:70B3D567A*
 OUI:70B3D567B*
  ID_OUI_FROM_DATABASE=Stesalit Systems Ltd
 
+OUI:70B3D567C*
+ ID_OUI_FROM_DATABASE=Benchmark Electronics - Secure Technology
+
 OUI:70B3D567D*
  ID_OUI_FROM_DATABASE=Acrodea, Inc.
 
@@ -67067,6 +68216,9 @@ OUI:70B3D5684*
 OUI:70B3D5686*
  ID_OUI_FROM_DATABASE=Access Protocol Pty Ltd
 
+OUI:70B3D5687*
+ ID_OUI_FROM_DATABASE=Volution Group UK
+
 OUI:70B3D5688*
  ID_OUI_FROM_DATABASE=MG s.r.l.
 
@@ -67121,6 +68273,9 @@ OUI:70B3D569B*
 OUI:70B3D569C*
  ID_OUI_FROM_DATABASE=Keepen
 
+OUI:70B3D569D*
+ ID_OUI_FROM_DATABASE=JPEmbedded Mazan Filipek Sp. J.
+
 OUI:70B3D569E*
  ID_OUI_FROM_DATABASE=PTYPE Co., LTD.
 
@@ -67154,9 +68309,15 @@ OUI:70B3D56A8*
 OUI:70B3D56A9*
  ID_OUI_FROM_DATABASE=OHMORI ELECTRIC INDUSTRIES CO.LTD
 
+OUI:70B3D56AA*
+ ID_OUI_FROM_DATABASE=Intermobility
+
 OUI:70B3D56AB*
  ID_OUI_FROM_DATABASE=ARROW (CHINA) ELECTRONICS TRADING CO., LTD.
 
+OUI:70B3D56AC*
+ ID_OUI_FROM_DATABASE=Ketronixs Sdn Bhd
+
 OUI:70B3D56AD*
  ID_OUI_FROM_DATABASE=CONNIT
 
@@ -67229,6 +68390,9 @@ OUI:70B3D56C6*
 OUI:70B3D56C7*
  ID_OUI_FROM_DATABASE=Becton Dickinson
 
+OUI:70B3D56C9*
+ ID_OUI_FROM_DATABASE=Redstone Sunshine(Beijing)Technology Co.,Ltd.
+
 OUI:70B3D56CA*
  ID_OUI_FROM_DATABASE=LINEAGE POWER PVT LTD.,
 
@@ -67271,6 +68435,12 @@ OUI:70B3D56D9*
 OUI:70B3D56DA*
  ID_OUI_FROM_DATABASE=Enovative Networks, Inc.
 
+OUI:70B3D56DB*
+ ID_OUI_FROM_DATABASE=Techimp - Altanova group Srl
+
+OUI:70B3D56DC*
+ ID_OUI_FROM_DATABASE=DEUTA-WERKE GmbH
+
 OUI:70B3D56DD*
  ID_OUI_FROM_DATABASE=Abbott Diagnostics Technologies AS
 
@@ -67337,6 +68507,9 @@ OUI:70B3D56F3*
 OUI:70B3D56F4*
  ID_OUI_FROM_DATABASE=Private
 
+OUI:70B3D56F5*
+ ID_OUI_FROM_DATABASE=Cominfo, Inc.
+
 OUI:70B3D56F6*
  ID_OUI_FROM_DATABASE=Acco Brands Europe
 
@@ -67403,6 +68576,9 @@ OUI:70B3D570A*
 OUI:70B3D570B*
  ID_OUI_FROM_DATABASE=Alere Technologies AS
 
+OUI:70B3D570C*
+ ID_OUI_FROM_DATABASE=Potter Electric Signal Co. LLC
+
 OUI:70B3D570E*
  ID_OUI_FROM_DATABASE=Wuhan Xingtuxinke ELectronic Co.,Ltd
 
@@ -67502,6 +68678,9 @@ OUI:70B3D5734*
 OUI:70B3D5735*
  ID_OUI_FROM_DATABASE=Swiss Audio
 
+OUI:70B3D5736*
+ ID_OUI_FROM_DATABASE=Jabil, Inc.
+
 OUI:70B3D5737*
  ID_OUI_FROM_DATABASE=SD Biosensor
 
@@ -67512,7 +68691,7 @@ OUI:70B3D5739*
  ID_OUI_FROM_DATABASE=Zigencorp, Inc
 
 OUI:70B3D573A*
- ID_OUI_FROM_DATABASE=Private
+ ID_OUI_FROM_DATABASE=DOLBY LABORATORIES, INC.
 
 OUI:70B3D573B*
  ID_OUI_FROM_DATABASE=S-I-C
@@ -67526,6 +68705,9 @@ OUI:70B3D573D*
 OUI:70B3D573E*
  ID_OUI_FROM_DATABASE=Trident RFID Pty Ltd
 
+OUI:70B3D573F*
+ ID_OUI_FROM_DATABASE=LLC Open Converged Networks
+
 OUI:70B3D5740*
  ID_OUI_FROM_DATABASE=Prisma Telecom Testing Srl
 
@@ -67589,6 +68771,9 @@ OUI:70B3D5754*
 OUI:70B3D5755*
  ID_OUI_FROM_DATABASE=LandmarkTech Systems Technology Co.,Ltd.
 
+OUI:70B3D5756*
+ ID_OUI_FROM_DATABASE=TimeMachines Inc.
+
 OUI:70B3D5757*
  ID_OUI_FROM_DATABASE=GABO
 
@@ -67622,6 +68807,9 @@ OUI:70B3D5760*
 OUI:70B3D5761*
  ID_OUI_FROM_DATABASE=Critical Link LLC
 
+OUI:70B3D5762*
+ ID_OUI_FROM_DATABASE=Transformational Security, LLC
+
 OUI:70B3D5763*
  ID_OUI_FROM_DATABASE=A Trap, USA
 
@@ -67931,6 +69119,12 @@ OUI:70B3D57D1*
 OUI:70B3D57D2*
  ID_OUI_FROM_DATABASE=SDK Kristall
 
+OUI:70B3D57D3*
+ ID_OUI_FROM_DATABASE=OLEDCOMM
+
+OUI:70B3D57D4*
+ ID_OUI_FROM_DATABASE=Computechnic AG
+
 OUI:70B3D57D5*
  ID_OUI_FROM_DATABASE=SICS Swedish ICT
 
@@ -68006,6 +69200,9 @@ OUI:70B3D57EE*
 OUI:70B3D57EF*
  ID_OUI_FROM_DATABASE=CRAVIS CO., LIMITED
 
+OUI:70B3D57F0*
+ ID_OUI_FROM_DATABASE=Yokogawa Denshikiki Co.,Ltd
+
 OUI:70B3D57F1*
  ID_OUI_FROM_DATABASE=AeroVision Avionics, Inc.
 
@@ -68078,6 +69275,9 @@ OUI:70B3D580A*
 OUI:70B3D580B*
  ID_OUI_FROM_DATABASE=Fischer Block, Inc.
 
+OUI:70B3D580C*
+ ID_OUI_FROM_DATABASE=Algra tec AG
+
 OUI:70B3D580D*
  ID_OUI_FROM_DATABASE=Data Physics Corporation
 
@@ -68150,6 +69350,9 @@ OUI:70B3D5827*
 OUI:70B3D5828*
  ID_OUI_FROM_DATABASE=Xacti Corporation
 
+OUI:70B3D582A*
+ ID_OUI_FROM_DATABASE=C W F Hamilton & Co Ltd
+
 OUI:70B3D582C*
  ID_OUI_FROM_DATABASE=NELS Ltd.
 
@@ -68222,6 +69425,9 @@ OUI:70B3D5844*
 OUI:70B3D5845*
  ID_OUI_FROM_DATABASE=Harborside Technology
 
+OUI:70B3D5846*
+ ID_OUI_FROM_DATABASE=National Time & Signal Corp.
+
 OUI:70B3D5847*
  ID_OUI_FROM_DATABASE=Ai-Lynx
 
@@ -68303,12 +69509,18 @@ OUI:70B3D5862*
 OUI:70B3D5863*
  ID_OUI_FROM_DATABASE=Shenzhen Wesion Technology Co., Ltd
 
+OUI:70B3D5864*
+ ID_OUI_FROM_DATABASE=BORMANN EDV und Zubehoer
+
 OUI:70B3D5865*
  ID_OUI_FROM_DATABASE=Insitu, Inc.
 
 OUI:70B3D5866*
  ID_OUI_FROM_DATABASE=MEPS Realtime
 
+OUI:70B3D5867*
+ ID_OUI_FROM_DATABASE=Specialized Communications Corp.
+
 OUI:70B3D5868*
  ID_OUI_FROM_DATABASE=U-JIN Mesco Co., Ltd.
 
@@ -68363,6 +69575,9 @@ OUI:70B3D5878*
 OUI:70B3D5879*
  ID_OUI_FROM_DATABASE=ZIGPOS GmbH
 
+OUI:70B3D587A*
+ ID_OUI_FROM_DATABASE=Accolade Technology Inc
+
 OUI:70B3D587B*
  ID_OUI_FROM_DATABASE=Liquid Instruments Pty Ltd
 
@@ -68393,6 +69608,9 @@ OUI:70B3D5884*
 OUI:70B3D5885*
  ID_OUI_FROM_DATABASE=QuirkLogic
 
+OUI:70B3D5886*
+ ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
+
 OUI:70B3D5888*
  ID_OUI_FROM_DATABASE=Zetechtics Ltd
 
@@ -68459,12 +69677,21 @@ OUI:70B3D589D*
 OUI:70B3D589E*
  ID_OUI_FROM_DATABASE=Innovative Control Systems, LP
 
+OUI:70B3D589F*
+ ID_OUI_FROM_DATABASE=Levelup Holding, Inc.
+
 OUI:70B3D58A0*
  ID_OUI_FROM_DATABASE=DM RADIOCOM
 
+OUI:70B3D58A1*
+ ID_OUI_FROM_DATABASE=TIAMA
+
 OUI:70B3D58A2*
  ID_OUI_FROM_DATABASE=WINNERS DIGITAL CORPORATION
 
+OUI:70B3D58A3*
+ ID_OUI_FROM_DATABASE=Loehnert Elektronik GmbH
+
 OUI:70B3D58A4*
  ID_OUI_FROM_DATABASE=Phyton, Inc. Microsystems and Development Tools
 
@@ -68534,6 +69761,9 @@ OUI:70B3D58BB*
 OUI:70B3D58BC*
  ID_OUI_FROM_DATABASE=GSI GeoSolutions International Ltd
 
+OUI:70B3D58BD*
+ ID_OUI_FROM_DATABASE=MAHLE ELECTRONICS, SLU
+
 OUI:70B3D58BE*
  ID_OUI_FROM_DATABASE=Connoiseur Electronics Private Limited
 
@@ -68591,6 +69821,9 @@ OUI:70B3D58D0*
 OUI:70B3D58D3*
  ID_OUI_FROM_DATABASE=PERFORMANCE CONTROLS, INC.
 
+OUI:70B3D58D5*
+ ID_OUI_FROM_DATABASE=Guangzhou Wanglu
+
 OUI:70B3D58D7*
  ID_OUI_FROM_DATABASE=Schneider Electric Motion USA
 
@@ -68609,6 +69842,12 @@ OUI:70B3D58DB*
 OUI:70B3D58DC*
  ID_OUI_FROM_DATABASE=Niveo International BV
 
+OUI:70B3D58DD*
+ ID_OUI_FROM_DATABASE=Vertex Co.,Ltd.
+
+OUI:70B3D58DE*
+ ID_OUI_FROM_DATABASE=Indutherm Giesstechnologie GmbH
+
 OUI:70B3D58DF*
  ID_OUI_FROM_DATABASE=DORLET SAU
 
@@ -68654,6 +69893,9 @@ OUI:70B3D58EF*
 OUI:70B3D58F0*
  ID_OUI_FROM_DATABASE=ERAESEEDS co.,ltd.
 
+OUI:70B3D58F1*
+ ID_OUI_FROM_DATABASE=Paramount Bed Holdings Co., Ltd.
+
 OUI:70B3D58F2*
  ID_OUI_FROM_DATABASE=Rimota Limited
 
@@ -68678,6 +69920,12 @@ OUI:70B3D58F8*
 OUI:70B3D58FA*
  ID_OUI_FROM_DATABASE=DEA SYSTEM SPA
 
+OUI:70B3D58FC*
+ ID_OUI_FROM_DATABASE=Mianjie Technology
+
+OUI:70B3D58FE*
+ ID_OUI_FROM_DATABASE=Selmatec AS
+
 OUI:70B3D58FF*
  ID_OUI_FROM_DATABASE=IMST GmbH
 
@@ -68693,6 +69941,9 @@ OUI:70B3D5903*
 OUI:70B3D5904*
  ID_OUI_FROM_DATABASE=PHB Eletronica Ltda.
 
+OUI:70B3D5905*
+ ID_OUI_FROM_DATABASE=Wexiodisk AB
+
 OUI:70B3D5906*
  ID_OUI_FROM_DATABASE=Aplex Technology Inc.
 
@@ -68763,7 +70014,7 @@ OUI:70B3D5920*
  ID_OUI_FROM_DATABASE=SLAT
 
 OUI:70B3D5922*
- ID_OUI_FROM_DATABASE=Adcole Maryland Aerospace
+ ID_OUI_FROM_DATABASE=Adcole Space
 
 OUI:70B3D5923*
  ID_OUI_FROM_DATABASE=eumig industrie-tv GmbH
@@ -68876,6 +70127,9 @@ OUI:70B3D594A*
 OUI:70B3D594B*
  ID_OUI_FROM_DATABASE=RF Code
 
+OUI:70B3D594C*
+ ID_OUI_FROM_DATABASE=Honeywell/Intelligrated
+
 OUI:70B3D594D*
  ID_OUI_FROM_DATABASE=SEASON DESIGN TECHNOLOGY
 
@@ -69065,6 +70319,9 @@ OUI:70B3D5990*
 OUI:70B3D5991*
  ID_OUI_FROM_DATABASE=Javasparrow Inc.
 
+OUI:70B3D5992*
+ ID_OUI_FROM_DATABASE=KAEONIT
+
 OUI:70B3D5993*
  ID_OUI_FROM_DATABASE=ioThings
 
@@ -69116,6 +70373,9 @@ OUI:70B3D59A5*
 OUI:70B3D59A7*
  ID_OUI_FROM_DATABASE=Honeywell
 
+OUI:70B3D59A8*
+ ID_OUI_FROM_DATABASE=Egag, LLC
+
 OUI:70B3D59A9*
  ID_OUI_FROM_DATABASE=PABLO AIR Co., LTD
 
@@ -69185,6 +70445,9 @@ OUI:70B3D59C0*
 OUI:70B3D59C1*
  ID_OUI_FROM_DATABASE=Zeroplus Technology Co.,Ltd.
 
+OUI:70B3D59C2*
+ ID_OUI_FROM_DATABASE=Sportsbeams Lighting, Inc.
+
 OUI:70B3D59C3*
  ID_OUI_FROM_DATABASE=Sevensense Robotics AG
 
@@ -69215,6 +70478,9 @@ OUI:70B3D59CB*
 OUI:70B3D59CC*
  ID_OUI_FROM_DATABASE=Zaxcom Inc
 
+OUI:70B3D59CD*
+ ID_OUI_FROM_DATABASE=WEPTECH elektronik GmbH
+
 OUI:70B3D59CE*
  ID_OUI_FROM_DATABASE=Terragene S.A
 
@@ -69278,6 +70544,12 @@ OUI:70B3D59E2*
 OUI:70B3D59E3*
  ID_OUI_FROM_DATABASE=LG Electronics
 
+OUI:70B3D59E4*
+ ID_OUI_FROM_DATABASE=K&A Electronics Inc.
+
+OUI:70B3D59E5*
+ ID_OUI_FROM_DATABASE=Antek Technology
+
 OUI:70B3D59E6*
  ID_OUI_FROM_DATABASE=BLOCKSI LLC
 
@@ -69287,6 +70559,9 @@ OUI:70B3D59E7*
 OUI:70B3D59E8*
  ID_OUI_FROM_DATABASE=Zerospace ICT Services B.V.
 
+OUI:70B3D59E9*
+ ID_OUI_FROM_DATABASE=LiveCopper Inc.
+
 OUI:70B3D59EA*
  ID_OUI_FROM_DATABASE=Blue Storm Associates, Inc.
 
@@ -69434,6 +70709,9 @@ OUI:70B3D5A21*
 OUI:70B3D5A22*
  ID_OUI_FROM_DATABASE=eSys Solutions Sweden AB
 
+OUI:70B3D5A23*
+ ID_OUI_FROM_DATABASE=LG Electronics
+
 OUI:70B3D5A24*
  ID_OUI_FROM_DATABASE=Booz Allen Hamilton
 
@@ -69815,6 +71093,9 @@ OUI:70B3D5AA9*
 OUI:70B3D5AAA*
  ID_OUI_FROM_DATABASE=Xemex NV
 
+OUI:70B3D5AAB*
+ ID_OUI_FROM_DATABASE=QUISS GmbH
+
 OUI:70B3D5AAC*
  ID_OUI_FROM_DATABASE=SensoTec GmbH
 
@@ -69935,6 +71216,9 @@ OUI:70B3D5AD6*
 OUI:70B3D5AD8*
  ID_OUI_FROM_DATABASE=Euklis by GSG International
 
+OUI:70B3D5AD9*
+ ID_OUI_FROM_DATABASE=aelettronica group srl
+
 OUI:70B3D5ADA*
  ID_OUI_FROM_DATABASE=Private
 
@@ -69965,6 +71249,9 @@ OUI:70B3D5AE2*
 OUI:70B3D5AE3*
  ID_OUI_FROM_DATABASE=Zhejiang Wellsun Electric Meter Co.,Ltd
 
+OUI:70B3D5AE4*
+ ID_OUI_FROM_DATABASE=Nuance Hearing Ltd.
+
 OUI:70B3D5AE5*
  ID_OUI_FROM_DATABASE=BeatCraft, Inc.
 
@@ -70241,12 +71528,18 @@ OUI:70B3D5B52*
 OUI:70B3D5B53*
  ID_OUI_FROM_DATABASE=Revolution Retail Systems, LLC
 
+OUI:70B3D5B54*
+ ID_OUI_FROM_DATABASE=Packet Power
+
 OUI:70B3D5B55*
  ID_OUI_FROM_DATABASE=CTAG - ESG36871424
 
 OUI:70B3D5B56*
  ID_OUI_FROM_DATABASE=Power Electronics Espana, S.L.
 
+OUI:70B3D5B57*
+ ID_OUI_FROM_DATABASE=Shanghai Qinyue Communication Technology Co., Ltd.
+
 OUI:70B3D5B58*
  ID_OUI_FROM_DATABASE=INTERNET PROTOCOLO LOGICA SL
 
@@ -70277,6 +71570,9 @@ OUI:70B3D5B60*
 OUI:70B3D5B62*
  ID_OUI_FROM_DATABASE=Sakura Seiki Co.,Ltd.
 
+OUI:70B3D5B63*
+ ID_OUI_FROM_DATABASE=Ideas srl
+
 OUI:70B3D5B64*
  ID_OUI_FROM_DATABASE=OSUNG LST CO.,LTD.
 
@@ -70289,6 +71585,9 @@ OUI:70B3D5B66*
 OUI:70B3D5B67*
  ID_OUI_FROM_DATABASE=RedWave Labs Ltd
 
+OUI:70B3D5B68*
+ ID_OUI_FROM_DATABASE=S-Rain Control A/S
+
 OUI:70B3D5B6A*
  ID_OUI_FROM_DATABASE=YUYAMA MFG Co.,Ltd
 
@@ -70304,6 +71603,9 @@ OUI:70B3D5B6D*
 OUI:70B3D5B6E*
  ID_OUI_FROM_DATABASE=Edgeware AB
 
+OUI:70B3D5B6F*
+ ID_OUI_FROM_DATABASE=Integra Metering SAS
+
 OUI:70B3D5B71*
  ID_OUI_FROM_DATABASE=Private
 
@@ -70358,6 +71660,9 @@ OUI:70B3D5B84*
 OUI:70B3D5B85*
  ID_OUI_FROM_DATABASE=Fenotech Inc.
 
+OUI:70B3D5B86*
+ ID_OUI_FROM_DATABASE=Cubitech
+
 OUI:70B3D5B87*
  ID_OUI_FROM_DATABASE=CAITRON GmbH
 
@@ -70385,6 +71690,9 @@ OUI:70B3D5B8E*
 OUI:70B3D5B8F*
  ID_OUI_FROM_DATABASE=Assembly Contracts Ltd
 
+OUI:70B3D5B90*
+ ID_OUI_FROM_DATABASE=Amico Corporation
+
 OUI:70B3D5B91*
  ID_OUI_FROM_DATABASE=Dynetics, Inc.
 
@@ -70535,6 +71843,9 @@ OUI:70B3D5BC5*
 OUI:70B3D5BC6*
  ID_OUI_FROM_DATABASE=Hatteland Display AS
 
+OUI:70B3D5BC7*
+ ID_OUI_FROM_DATABASE=Autonomic Controls, Inc.
+
 OUI:70B3D5BC9*
  ID_OUI_FROM_DATABASE=Yite technology
 
@@ -70679,6 +71990,9 @@ OUI:70B3D5C00*
 OUI:70B3D5C01*
  ID_OUI_FROM_DATABASE=SmartGuard LLC
 
+OUI:70B3D5C02*
+ ID_OUI_FROM_DATABASE=Garmo Instruments S.L.
+
 OUI:70B3D5C03*
  ID_OUI_FROM_DATABASE=XAVi Technologies Corp.
 
@@ -70709,6 +72023,9 @@ OUI:70B3D5C0B*
 OUI:70B3D5C0C*
  ID_OUI_FROM_DATABASE=Tech4Race
 
+OUI:70B3D5C0D*
+ ID_OUI_FROM_DATABASE=Clarity Medical Pvt Ltd
+
 OUI:70B3D5C0E*
  ID_OUI_FROM_DATABASE=SYSDEV Srl
 
@@ -70751,6 +72068,9 @@ OUI:70B3D5C1C*
 OUI:70B3D5C1D*
  ID_OUI_FROM_DATABASE=Kranze Technology Solutions
 
+OUI:70B3D5C1E*
+ ID_OUI_FROM_DATABASE=Kron Medidores
+
 OUI:70B3D5C1F*
  ID_OUI_FROM_DATABASE=Behr Technologies Inc
 
@@ -70763,6 +72083,9 @@ OUI:70B3D5C21*
 OUI:70B3D5C22*
  ID_OUI_FROM_DATABASE=Skyriver Communications Inc.
 
+OUI:70B3D5C23*
+ ID_OUI_FROM_DATABASE=Sumitomo Heavy Industries, Ltd.
+
 OUI:70B3D5C24*
  ID_OUI_FROM_DATABASE=Elbit Systems of America
 
@@ -70859,6 +72182,9 @@ OUI:70B3D5C44*
 OUI:70B3D5C45*
  ID_OUI_FROM_DATABASE=Stiebel Eltron GmbH
 
+OUI:70B3D5C48*
+ ID_OUI_FROM_DATABASE=Weltek Technologies Co. Ltd.
+
 OUI:70B3D5C49*
  ID_OUI_FROM_DATABASE=BTG Instruments AB
 
@@ -70919,6 +72245,9 @@ OUI:70B3D5C5C*
 OUI:70B3D5C5D*
  ID_OUI_FROM_DATABASE=FOSHAN SHILANTIAN NETWORK S.T. CO., LTD.
 
+OUI:70B3D5C5E*
+ ID_OUI_FROM_DATABASE=Frog Cellsat Limited
+
 OUI:70B3D5C5F*
  ID_OUI_FROM_DATABASE=Clean-Lasersysteme GmbH
 
@@ -70979,6 +72308,9 @@ OUI:70B3D5C73*
 OUI:70B3D5C74*
  ID_OUI_FROM_DATABASE=Qtechnology A/S
 
+OUI:70B3D5C75*
+ ID_OUI_FROM_DATABASE=BIT Group USA, Inc.
+
 OUI:70B3D5C76*
  ID_OUI_FROM_DATABASE=ELA INNOVATION
 
@@ -70997,6 +72329,9 @@ OUI:70B3D5C7A*
 OUI:70B3D5C7B*
  ID_OUI_FROM_DATABASE=EM Clarity Pty Ltd
 
+OUI:70B3D5C7C*
+ ID_OUI_FROM_DATABASE=Beijing Aumiwalker technology CO.,LTD
+
 OUI:70B3D5C7D*
  ID_OUI_FROM_DATABASE=Metatronics B.V.
 
@@ -71054,6 +72389,9 @@ OUI:70B3D5C8E*
 OUI:70B3D5C8F*
  ID_OUI_FROM_DATABASE=TRIDENT INFOSOL PVT LTD
 
+OUI:70B3D5C90*
+ ID_OUI_FROM_DATABASE=Diretta
+
 OUI:70B3D5C91*
  ID_OUI_FROM_DATABASE=Grossenbacher Systeme AG
 
@@ -71348,6 +72686,9 @@ OUI:70B3D5D02*
 OUI:70B3D5D05*
  ID_OUI_FROM_DATABASE=Colmek
 
+OUI:70B3D5D06*
+ ID_OUI_FROM_DATABASE=YUYAMA MFG Co.,Ltd
+
 OUI:70B3D5D07*
  ID_OUI_FROM_DATABASE=Waversa Systems
 
@@ -71369,6 +72710,9 @@ OUI:70B3D5D0D*
 OUI:70B3D5D0E*
  ID_OUI_FROM_DATABASE=Beijing Aumiwalker technology CO.,LTD
 
+OUI:70B3D5D0F*
+ ID_OUI_FROM_DATABASE=Alto Aviation
+
 OUI:70B3D5D10*
  ID_OUI_FROM_DATABASE=Contec Americas Inc.
 
@@ -71384,6 +72728,12 @@ OUI:70B3D5D15*
 OUI:70B3D5D16*
  ID_OUI_FROM_DATABASE=Monnit Corporation
 
+OUI:70B3D5D18*
+ ID_OUI_FROM_DATABASE=MetCom Solutions GmbH
+
+OUI:70B3D5D19*
+ ID_OUI_FROM_DATABASE=Senior Group LLC
+
 OUI:70B3D5D1A*
  ID_OUI_FROM_DATABASE=Monnit Corporation
 
@@ -71456,6 +72806,9 @@ OUI:70B3D5D33*
 OUI:70B3D5D34*
  ID_OUI_FROM_DATABASE=G-PHILOS CO.,LTD
 
+OUI:70B3D5D35*
+ ID_OUI_FROM_DATABASE=King-On Technology Ltd.
+
 OUI:70B3D5D36*
  ID_OUI_FROM_DATABASE=Insitu Inc.
 
@@ -71588,6 +72941,9 @@ OUI:70B3D5D66*
 OUI:70B3D5D67*
  ID_OUI_FROM_DATABASE=ALPHA Corporation
 
+OUI:70B3D5D68*
+ ID_OUI_FROM_DATABASE=Tobi Tribe Inc
+
 OUI:70B3D5D69*
  ID_OUI_FROM_DATABASE=Thermo Fisher Scientific
 
@@ -71642,6 +72998,9 @@ OUI:70B3D5D7B*
 OUI:70B3D5D7C*
  ID_OUI_FROM_DATABASE=D.T.S Illuminazione Srl
 
+OUI:70B3D5D7D*
+ ID_OUI_FROM_DATABASE=BESO sp. z o.o.
+
 OUI:70B3D5D7E*
  ID_OUI_FROM_DATABASE=Triax A/S
 
@@ -71663,6 +73022,9 @@ OUI:70B3D5D86*
 OUI:70B3D5D87*
  ID_OUI_FROM_DATABASE=Zigen Corp
 
+OUI:70B3D5D88*
+ ID_OUI_FROM_DATABASE=Nidec asi spa
+
 OUI:70B3D5D89*
  ID_OUI_FROM_DATABASE=Resolution Systems
 
@@ -71702,12 +73064,18 @@ OUI:70B3D5D94*
 OUI:70B3D5D95*
  ID_OUI_FROM_DATABASE=SANO SERVICE Co.,Ltd
 
+OUI:70B3D5D96*
+ ID_OUI_FROM_DATABASE=Thermo Fisher Scientific Inc.
+
 OUI:70B3D5D97*
- ID_OUI_FROM_DATABASE=BRS Sistemas Eletronicos
+ ID_OUI_FROM_DATABASE=BRS Sistemas Eletrônicos
 
 OUI:70B3D5D98*
  ID_OUI_FROM_DATABASE=ACD Elekronik GmbH
 
+OUI:70B3D5D99*
+ ID_OUI_FROM_DATABASE=Nilar AB
+
 OUI:70B3D5D9A*
  ID_OUI_FROM_DATABASE=Wuhan Xingtuxinke ELectronic Co.,Ltd
 
@@ -71744,6 +73112,9 @@ OUI:70B3D5DA5*
 OUI:70B3D5DA6*
  ID_OUI_FROM_DATABASE=Redfish Group Pty Ltd
 
+OUI:70B3D5DA7*
+ ID_OUI_FROM_DATABASE=Network Innovations
+
 OUI:70B3D5DA8*
  ID_OUI_FROM_DATABASE=Tagarno AS
 
@@ -71777,6 +73148,9 @@ OUI:70B3D5DB1*
 OUI:70B3D5DB2*
  ID_OUI_FROM_DATABASE=Micro Electroninc Products
 
+OUI:70B3D5DB3*
+ ID_OUI_FROM_DATABASE=Klaxoon
+
 OUI:70B3D5DB4*
  ID_OUI_FROM_DATABASE=YUYAMA MFG Co.,Ltd
 
@@ -71792,6 +73166,9 @@ OUI:70B3D5DB7*
 OUI:70B3D5DB8*
  ID_OUI_FROM_DATABASE=SISTEM SA
 
+OUI:70B3D5DBA*
+ ID_OUI_FROM_DATABASE=KODENSHI CORP.
+
 OUI:70B3D5DBB*
  ID_OUI_FROM_DATABASE=Fuhr GmbH Filtertechnik
 
@@ -71819,6 +73196,9 @@ OUI:70B3D5DC2*
 OUI:70B3D5DC3*
  ID_OUI_FROM_DATABASE=Fath Mechatronics
 
+OUI:70B3D5DC4*
+ ID_OUI_FROM_DATABASE=Peter Huber Kaeltemaschinenbau AG
+
 OUI:70B3D5DC5*
  ID_OUI_FROM_DATABASE=Excel Medical Electronics LLC
 
@@ -72042,7 +73422,7 @@ OUI:70B3D5E1B*
  ID_OUI_FROM_DATABASE=Neuron GmbH
 
 OUI:70B3D5E1C*
- ID_OUI_FROM_DATABASE=Xcenter AS
+ ID_OUI_FROM_DATABASE=RoomMate AS
 
 OUI:70B3D5E1E*
  ID_OUI_FROM_DATABASE=Umano Medical Inc.
@@ -72095,6 +73475,9 @@ OUI:70B3D5E2D*
 OUI:70B3D5E2E*
  ID_OUI_FROM_DATABASE=Merz s.r.o.
 
+OUI:70B3D5E2F*
+ ID_OUI_FROM_DATABASE=Flextronics International Kft.
+
 OUI:70B3D5E30*
  ID_OUI_FROM_DATABASE=QUISS AG
 
@@ -72116,6 +73499,9 @@ OUI:70B3D5E35*
 OUI:70B3D5E36*
  ID_OUI_FROM_DATABASE=Guidance Navigation Limited
 
+OUI:70B3D5E37*
+ ID_OUI_FROM_DATABASE=Eurotempest AB
+
 OUI:70B3D5E38*
  ID_OUI_FROM_DATABASE=Cursor Systems NV
 
@@ -72149,6 +73535,9 @@ OUI:70B3D5E43*
 OUI:70B3D5E45*
  ID_OUI_FROM_DATABASE=Momentum Data Systems
 
+OUI:70B3D5E46*
+ ID_OUI_FROM_DATABASE=7thSense Design Limited
+
 OUI:70B3D5E47*
  ID_OUI_FROM_DATABASE=DEUTA-WERKE GmbH
 
@@ -72179,6 +73568,9 @@ OUI:70B3D5E4F*
 OUI:70B3D5E50*
  ID_OUI_FROM_DATABASE=Advanced Vision Technology Ltd
 
+OUI:70B3D5E51*
+ ID_OUI_FROM_DATABASE=NooliTIC
+
 OUI:70B3D5E52*
  ID_OUI_FROM_DATABASE=Guangzhou Moblin Technology Co., Ltd.
 
@@ -72203,6 +73595,9 @@ OUI:70B3D5E58*
 OUI:70B3D5E59*
  ID_OUI_FROM_DATABASE=Fracarro srl
 
+OUI:70B3D5E5A*
+ ID_OUI_FROM_DATABASE=Cardinal Scales Manufacturing Co
+
 OUI:70B3D5E5B*
  ID_OUI_FROM_DATABASE=Argosy Labs Inc.
 
@@ -72221,6 +73616,9 @@ OUI:70B3D5E61*
 OUI:70B3D5E63*
  ID_OUI_FROM_DATABASE=Potomac Electric Corporation
 
+OUI:70B3D5E64*
+ ID_OUI_FROM_DATABASE=HONG JIANG ELECTRONICS CO., LTD.
+
 OUI:70B3D5E67*
  ID_OUI_FROM_DATABASE=APPLIED PROCESSING
 
@@ -72251,6 +73649,9 @@ OUI:70B3D5E71*
 OUI:70B3D5E72*
  ID_OUI_FROM_DATABASE=KDT Corp.
 
+OUI:70B3D5E73*
+ ID_OUI_FROM_DATABASE=Zeus Control Systems Ltd
+
 OUI:70B3D5E74*
  ID_OUI_FROM_DATABASE=Exfrontier Co., Ltd.
 
@@ -72284,6 +73685,9 @@ OUI:70B3D5E7D*
 OUI:70B3D5E7E*
  ID_OUI_FROM_DATABASE=Groupe Citypassenger Inc
 
+OUI:70B3D5E7F*
+ ID_OUI_FROM_DATABASE=Sankyo Intec Co,ltd
+
 OUI:70B3D5E80*
  ID_OUI_FROM_DATABASE=Changzhou Rapid Information Technology Co,Ltd
 
@@ -72293,6 +73697,9 @@ OUI:70B3D5E81*
 OUI:70B3D5E82*
  ID_OUI_FROM_DATABASE=RF Track
 
+OUI:70B3D5E83*
+ ID_OUI_FROM_DATABASE=Talleres de Escoriaza SA
+
 OUI:70B3D5E84*
  ID_OUI_FROM_DATABASE=ENTEC Electric & Electronic Co., LTD.
 
@@ -72413,6 +73820,9 @@ OUI:70B3D5EAD*
 OUI:70B3D5EAE*
  ID_OUI_FROM_DATABASE=Orlaco Products B.V.
 
+OUI:70B3D5EAF*
+ ID_OUI_FROM_DATABASE=Sicon srl
+
 OUI:70B3D5EB0*
  ID_OUI_FROM_DATABASE=Nautel Limted
 
@@ -72431,6 +73841,9 @@ OUI:70B3D5EB4*
 OUI:70B3D5EB5*
  ID_OUI_FROM_DATABASE=JUSTEK INC
 
+OUI:70B3D5EB6*
+ ID_OUI_FROM_DATABASE=EnergizeEV
+
 OUI:70B3D5EB7*
  ID_OUI_FROM_DATABASE=Skreens
 
@@ -72503,6 +73916,12 @@ OUI:70B3D5ED0*
 OUI:70B3D5ED1*
  ID_OUI_FROM_DATABASE=Przemyslowy Instytut Automatyki i Pomiarow
 
+OUI:70B3D5ED2*
+ ID_OUI_FROM_DATABASE=PCTEL
+
+OUI:70B3D5ED3*
+ ID_OUI_FROM_DATABASE=Beijing Lihong Create Co., Ltd.
+
 OUI:70B3D5ED5*
  ID_OUI_FROM_DATABASE=hangzhou battle link technology Co.,Ltd
 
@@ -72512,6 +73931,9 @@ OUI:70B3D5ED7*
 OUI:70B3D5ED8*
  ID_OUI_FROM_DATABASE=Wartsila Voyage Limited
 
+OUI:70B3D5EDA*
+ ID_OUI_FROM_DATABASE=Breas Medical AB
+
 OUI:70B3D5EDB*
  ID_OUI_FROM_DATABASE=Netfort Solutions
 
@@ -72656,6 +74078,9 @@ OUI:70B3D5F0C*
 OUI:70B3D5F0D*
  ID_OUI_FROM_DATABASE=MeQ Inc.
 
+OUI:70B3D5F0E*
+ ID_OUI_FROM_DATABASE=TextSpeak Corporation
+
 OUI:70B3D5F0F*
  ID_OUI_FROM_DATABASE=Kyoto Denkiki
 
@@ -72674,6 +74099,9 @@ OUI:70B3D5F13*
 OUI:70B3D5F14*
  ID_OUI_FROM_DATABASE=SANYU SWITCH CO., LTD.
 
+OUI:70B3D5F15*
+ ID_OUI_FROM_DATABASE=ARECA EMBEDDED SYSTEMS PVT LTD
+
 OUI:70B3D5F16*
  ID_OUI_FROM_DATABASE=BRS Sistemas Eletrônicos
 
@@ -72746,6 +74174,9 @@ OUI:70B3D5F2F*
 OUI:70B3D5F30*
  ID_OUI_FROM_DATABASE=ADE Technology Inc.
 
+OUI:70B3D5F33*
+ ID_OUI_FROM_DATABASE=Beijing Vizum Technology Co.,Ltd.
+
 OUI:70B3D5F34*
  ID_OUI_FROM_DATABASE=MacGray Services
 
@@ -72794,12 +74225,18 @@ OUI:70B3D5F44*
 OUI:70B3D5F45*
  ID_OUI_FROM_DATABASE=Norbit ODM AS
 
+OUI:70B3D5F46*
+ ID_OUI_FROM_DATABASE=Season Electronics Ltd
+
 OUI:70B3D5F47*
  ID_OUI_FROM_DATABASE=TXMission Ltd.
 
 OUI:70B3D5F48*
  ID_OUI_FROM_DATABASE=HEITEC AG
 
+OUI:70B3D5F4A*
+ ID_OUI_FROM_DATABASE=LACS SRL
+
 OUI:70B3D5F4B*
  ID_OUI_FROM_DATABASE=Chengdu Lingya Technology Co., Ltd.
 
@@ -72809,6 +74246,9 @@ OUI:70B3D5F4C*
 OUI:70B3D5F4D*
  ID_OUI_FROM_DATABASE=Honeywell
 
+OUI:70B3D5F4E*
+ ID_OUI_FROM_DATABASE=Hunan Lianzhong Technology Co.,Ltd.
+
 OUI:70B3D5F4F*
  ID_OUI_FROM_DATABASE=Power Electronics Espana, S.L.
 
@@ -72839,6 +74279,9 @@ OUI:70B3D5F57*
 OUI:70B3D5F58*
  ID_OUI_FROM_DATABASE=CDR SRL
 
+OUI:70B3D5F59*
+ ID_OUI_FROM_DATABASE=KOREA SPECTRAL PRODUCTS
+
 OUI:70B3D5F5A*
  ID_OUI_FROM_DATABASE=HAMEG GmbH
 
@@ -72857,6 +74300,9 @@ OUI:70B3D5F5E*
 OUI:70B3D5F5F*
  ID_OUI_FROM_DATABASE=RFRain LLC
 
+OUI:70B3D5F60*
+ ID_OUI_FROM_DATABASE=MPM Micro Präzision Marx GmbH
+
 OUI:70B3D5F61*
  ID_OUI_FROM_DATABASE=Power Diagnostic Service
 
@@ -72872,6 +74318,9 @@ OUI:70B3D5F64*
 OUI:70B3D5F65*
  ID_OUI_FROM_DATABASE=MARKUS LABS
 
+OUI:70B3D5F66*
+ ID_OUI_FROM_DATABASE=Seznam.cz, a.s., CZ26168685
+
 OUI:70B3D5F67*
  ID_OUI_FROM_DATABASE=winsun AG
 
@@ -72932,6 +74381,9 @@ OUI:70B3D5F7B*
 OUI:70B3D5F7C*
  ID_OUI_FROM_DATABASE=Private
 
+OUI:70B3D5F7D*
+ ID_OUI_FROM_DATABASE=2M Technology
+
 OUI:70B3D5F7E*
  ID_OUI_FROM_DATABASE=Alpha Elettronica s.r.l.
 
@@ -73127,12 +74579,18 @@ OUI:70B3D5FC2*
 OUI:70B3D5FC3*
  ID_OUI_FROM_DATABASE=myUpTech AB
 
+OUI:70B3D5FC4*
+ ID_OUI_FROM_DATABASE=AERIAL CAMERA SYSTEMS Ltd
+
 OUI:70B3D5FC5*
  ID_OUI_FROM_DATABASE=Eltwin A/S
 
 OUI:70B3D5FC6*
  ID_OUI_FROM_DATABASE=Tecnint HTE SRL
 
+OUI:70B3D5FC7*
+ ID_OUI_FROM_DATABASE=Invert Robotics Ltd.
+
 OUI:70B3D5FC8*
  ID_OUI_FROM_DATABASE=Moduware PTY LTD
 
@@ -73184,6 +74642,9 @@ OUI:70B3D5FD7*
 OUI:70B3D5FD8*
  ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
 
+OUI:70B3D5FD9*
+ ID_OUI_FROM_DATABASE=eSight
+
 OUI:70B3D5FDA*
  ID_OUI_FROM_DATABASE=ACD Elektronik GmbH
 
@@ -73211,6 +74672,9 @@ OUI:70B3D5FE3*
 OUI:70B3D5FE4*
  ID_OUI_FROM_DATABASE=CARE PVT LTD
 
+OUI:70B3D5FE5*
+ ID_OUI_FROM_DATABASE=Malin Space Science System
+
 OUI:70B3D5FE6*
  ID_OUI_FROM_DATABASE=SHIZUKI ELECTRIC CO.,INC
 
@@ -73286,6 +74750,9 @@ OUI:70B3D5FFF*
 OUI:70B599*
  ID_OUI_FROM_DATABASE=Embedded Technologies s.r.o.
 
+OUI:70B5E8*
+ ID_OUI_FROM_DATABASE=Dell Inc.
+
 OUI:70B7AA*
  ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
@@ -73565,6 +75032,9 @@ OUI:740AE1*
 OUI:740EDB*
  ID_OUI_FROM_DATABASE=Optowiz Co., Ltd
 
+OUI:7412B3*
+ ID_OUI_FROM_DATABASE=CHONGQING FUGUI ELECTRONICS CO.,LTD.
+
 OUI:7412BB*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
@@ -73754,6 +75224,9 @@ OUI:743889*
 OUI:7438B7*
  ID_OUI_FROM_DATABASE=CANON INC.
 
+OUI:743A20*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
 OUI:743A65*
  ID_OUI_FROM_DATABASE=NEC Corporation
 
@@ -73964,6 +75437,9 @@ OUI:747548*
 OUI:747818*
  ID_OUI_FROM_DATABASE=Jurumani Solutions
 
+OUI:747A90*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+
 OUI:747B7A*
  ID_OUI_FROM_DATABASE=ETH Inc.
 
@@ -74129,6 +75605,12 @@ OUI:74A722*
 OUI:74A78E*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:74A7EA*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
+OUI:74AB93*
+ ID_OUI_FROM_DATABASE=Blink by Amazon
+
 OUI:74AC5F*
  ID_OUI_FROM_DATABASE=Qiku Internet Network Scientific (Shenzhen) Co., Ltd.
 
@@ -74210,6 +75692,9 @@ OUI:74C9A3*
 OUI:74CA25*
  ID_OUI_FROM_DATABASE=Calxeda, Inc.
 
+OUI:74CBF3*
+ ID_OUI_FROM_DATABASE=Lava international limited
+
 OUI:74CC39*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
@@ -74417,6 +75902,9 @@ OUI:74F726*
 OUI:74F737*
  ID_OUI_FROM_DATABASE=KCE
 
+OUI:74F7F6*
+ ID_OUI_FROM_DATABASE=Shanghai Sunmi Technology Co.,Ltd.
+
 OUI:74F85D*
  ID_OUI_FROM_DATABASE=Berkeley Nucleonics Corp
 
@@ -74501,6 +75989,9 @@ OUI:7802F8*
 OUI:780473*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
+OUI:7804E3*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:780541*
  ID_OUI_FROM_DATABASE=Queclink Wireless Solutions Co., Ltd
 
@@ -74525,6 +76016,9 @@ OUI:780ED1*
 OUI:780F77*
  ID_OUI_FROM_DATABASE=HangZhou Gubei Electronics Technology Co.,Ltd
 
+OUI:781100*
+ ID_OUI_FROM_DATABASE=Quantumsolution
+
 OUI:781185*
  ID_OUI_FROM_DATABASE=NBS Payment Solutions Inc.
 
@@ -74600,6 +76094,9 @@ OUI:782A79*
 OUI:782B46*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:782B64*
+ ID_OUI_FROM_DATABASE=Bose Corporation
+
 OUI:782BCB*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
@@ -74687,6 +76184,9 @@ OUI:7845C4*
 OUI:7846C4*
  ID_OUI_FROM_DATABASE=DAEHAP HYPER-TECH
 
+OUI:7846D4*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:78471D*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -75377,6 +76877,9 @@ OUI:78F7D0*
 OUI:78F882*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
+OUI:78F8B8*
+ ID_OUI_FROM_DATABASE=Rako Controls Ltd
+
 OUI:78F944*
  ID_OUI_FROM_DATABASE=Private
 
@@ -75536,6 +77039,9 @@ OUI:7C2586*
 OUI:7C2587*
  ID_OUI_FROM_DATABASE=chaowifi.com
 
+OUI:7C25DA*
+ ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
+
 OUI:7C2634*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
@@ -75545,6 +77051,9 @@ OUI:7C2664*
 OUI:7C2A31*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:7C2ADB*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+
 OUI:7C2BE1*
  ID_OUI_FROM_DATABASE=Shenzhen Ferex Electrical Co.,Ltd
 
@@ -75968,6 +77477,9 @@ OUI:7CA61D*
 OUI:7CA7B0*
  ID_OUI_FROM_DATABASE=SHENZHEN BILIAN ELECTRONIC CO.,LTD
 
+OUI:7CA96B*
+ ID_OUI_FROM_DATABASE=Syrotech Networks. Ltd.
+
 OUI:7CA97D*
  ID_OUI_FROM_DATABASE=Objenious
 
@@ -75980,6 +77492,9 @@ OUI:7CAB60*
 OUI:7CACB2*
  ID_OUI_FROM_DATABASE=Bosch Software Innovations GmbH
 
+OUI:7CAD4F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:7CAD74*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -76148,6 +77663,9 @@ OUI:7CC6C4*
 OUI:7CC709*
  ID_OUI_FROM_DATABASE=SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.
 
+OUI:7CC77E*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
 OUI:7CC8AB*
  ID_OUI_FROM_DATABASE=Acro Associates, Inc.
 
@@ -76271,6 +77789,9 @@ OUI:7CDD76*
 OUI:7CDD90*
  ID_OUI_FROM_DATABASE=Shenzhen Ogemray Technology Co., Ltd.
 
+OUI:7CDDE9*
+ ID_OUI_FROM_DATABASE=ATOM tech Inc.
+
 OUI:7CDFA1*
  ID_OUI_FROM_DATABASE=Espressif Inc.
 
@@ -76334,6 +77855,9 @@ OUI:7CF098*
 OUI:7CF0BA*
  ID_OUI_FROM_DATABASE=Linkwell Telesystems Pvt Ltd
 
+OUI:7CF2DD*
+ ID_OUI_FROM_DATABASE=Vence Corp
+
 OUI:7CF31B*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
@@ -76349,12 +77873,18 @@ OUI:7CF90E*
 OUI:7CF95C*
  ID_OUI_FROM_DATABASE=U.I. Lapp GmbH
 
+OUI:7CF9A0*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
 OUI:7CFADF*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
 OUI:7CFC3C*
  ID_OUI_FROM_DATABASE=Visteon Corporation
 
+OUI:7CFD6B*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+
 OUI:7CFD82*
  ID_OUI_FROM_DATABASE=GUANGDONG GENIUS TECHNOLOGY CO., LTD.
 
@@ -76442,6 +77972,9 @@ OUI:800DD7*
 OUI:800E24*
  ID_OUI_FROM_DATABASE=ForgetBox
 
+OUI:8012DF*
+ ID_OUI_FROM_DATABASE=Shenzhen SuperElectron Technology Co.,Ltd.
+
 OUI:801382*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -76451,6 +77984,9 @@ OUI:801440*
 OUI:8014A8*
  ID_OUI_FROM_DATABASE=Guangzhou V-SOLUTION Electronic Technology Co., Ltd.
 
+OUI:801605*
+ ID_OUI_FROM_DATABASE=Vodafone Italia S.p.A.
+
 OUI:801609*
  ID_OUI_FROM_DATABASE=Sleep Number
 
@@ -76517,6 +78053,9 @@ OUI:802AFA*
 OUI:802BF9*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
+OUI:802DBF*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:802DE1*
  ID_OUI_FROM_DATABASE=Solarbridge Technologies
 
@@ -76661,9 +78200,15 @@ OUI:805E4F*
 OUI:805EC0*
  ID_OUI_FROM_DATABASE=YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD.
 
+OUI:805FC5*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:806007*
  ID_OUI_FROM_DATABASE=RIM
 
+OUI:8060B7*
+ ID_OUI_FROM_DATABASE=CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.
+
 OUI:80615F*
  ID_OUI_FROM_DATABASE=Beijing Sinead Technology Co., Ltd.
 
@@ -76703,6 +78248,9 @@ OUI:806C8B*
 OUI:806CBC*
  ID_OUI_FROM_DATABASE=NET New Electronic Technology GmbH
 
+OUI:806D97*
+ ID_OUI_FROM_DATABASE=Private
+
 OUI:806FB0*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
@@ -77003,6 +78551,9 @@ OUI:80C7C5*
 OUI:80C862*
  ID_OUI_FROM_DATABASE=Openpeak, Inc
 
+OUI:80CC12*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:80CE62*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
@@ -77066,6 +78617,9 @@ OUI:80DB31*
 OUI:80E01D*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:80E1BF*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:80E455*
  ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
 
@@ -77129,6 +78683,9 @@ OUI:80E82C*
 OUI:80E86F*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:80EA07*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
 OUI:80EA23*
  ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
@@ -77186,6 +78743,12 @@ OUI:8400D2*
 OUI:8401A7*
  ID_OUI_FROM_DATABASE=Greyware Automation Products, Inc
 
+OUI:840283*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+
+OUI:840328*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
 OUI:8404D2*
  ID_OUI_FROM_DATABASE=Kirale Technologies SL
 
@@ -77252,6 +78815,9 @@ OUI:842141*
 OUI:8421F1*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:84225E*
+ ID_OUI_FROM_DATABASE=SHENZHEN TECHNEWCHIP TECHNOLOGY CO.,LTD.
+
 OUI:84248D*
  ID_OUI_FROM_DATABASE=Zebra Technologies Inc
 
@@ -77288,6 +78854,9 @@ OUI:842914*
 OUI:842999*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:842AFD*
+ ID_OUI_FROM_DATABASE=HP Inc.
+
 OUI:842B2B*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
@@ -77324,6 +78893,9 @@ OUI:843497*
 OUI:843611*
  ID_OUI_FROM_DATABASE=hyungseul publishing networks
 
+OUI:8437D5*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:843835*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -77474,6 +79046,9 @@ OUI:846A66*
 OUI:846AED*
  ID_OUI_FROM_DATABASE=Wireless Tsukamoto.,co.LTD
 
+OUI:846B48*
+ ID_OUI_FROM_DATABASE=ShenZhen EepuLink Co., Ltd.
+
 OUI:846EB1*
  ID_OUI_FROM_DATABASE=Park Assist LLC
 
@@ -77888,6 +79463,9 @@ OUI:84D6C5*
 OUI:84D6D0*
  ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
+OUI:84D81B*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
 OUI:84D931*
  ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
@@ -77996,6 +79574,9 @@ OUI:84EA97*
 OUI:84EA99*
  ID_OUI_FROM_DATABASE=Vieworks
 
+OUI:84EAED*
+ ID_OUI_FROM_DATABASE=Roku, Inc
+
 OUI:84EB18*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
@@ -78050,6 +79631,9 @@ OUI:8801F2*
 OUI:880355*
  ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
+OUI:8803E9*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
 OUI:88074B*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
@@ -78101,6 +79685,9 @@ OUI:881908*
 OUI:881B99*
  ID_OUI_FROM_DATABASE=SHENZHEN XIN FEI JIA ELECTRONIC CO. LTD.
 
+OUI:881C95*
+ ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
+
 OUI:881DFC*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -78128,6 +79715,9 @@ OUI:882593*
 OUI:8828B3*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:882949*
+ ID_OUI_FROM_DATABASE=Renesas Electronics (Penang) Sdn. Bhd.
+
 OUI:882950*
  ID_OUI_FROM_DATABASE=Netmoon Technology Co., Ltd
 
@@ -78206,6 +79796,9 @@ OUI:884033*
 OUI:88403B*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:884067*
+ ID_OUI_FROM_DATABASE=infomark
+
 OUI:884157*
  ID_OUI_FROM_DATABASE=Shenzhen Atsmart Technology Co.,Ltd.
 
@@ -78521,6 +80114,9 @@ OUI:889471*
 OUI:88947E*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
+OUI:88948F*
+ ID_OUI_FROM_DATABASE=Xi'an Zhisensor Technologies Co.,Ltd
+
 OUI:8894F9*
  ID_OUI_FROM_DATABASE=Gemicom Technology, Inc.
 
@@ -78722,6 +80318,9 @@ OUI:88BFD5*
 OUI:88BFE4*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:88C08B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:88C242*
  ID_OUI_FROM_DATABASE=Poynt Co.
 
@@ -78941,6 +80540,9 @@ OUI:8C0CA3*
 OUI:8C0D76*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:8C0E60*
+ ID_OUI_FROM_DATABASE=Nanjing Juplink Intelligent Technologies Co., Ltd.
+
 OUI:8C0EE3*
  ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
@@ -79193,6 +80795,9 @@ OUI:8C444F*
 OUI:8C4500*
  ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
+OUI:8C47BE*
+ ID_OUI_FROM_DATABASE=Dell Inc.
+
 OUI:8C4962*
  ID_OUI_FROM_DATABASE=Roku, Inc
 
@@ -79322,6 +80927,9 @@ OUI:8C5CA1*
 OUI:8C5D60*
  ID_OUI_FROM_DATABASE=UCI Corporation Co.,Ltd.
 
+OUI:8C5EBD*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:8C5F48*
  ID_OUI_FROM_DATABASE=Continental Intelligent Transportation Systems LLC
 
@@ -79376,6 +80984,9 @@ OUI:8C6DC4*
 OUI:8C705A*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:8C7086*
+ ID_OUI_FROM_DATABASE=Gesellschaft für Sonder-EDV-Anlagen mbH
+
 OUI:8C71F8*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -79445,6 +81056,9 @@ OUI:8C8580*
 OUI:8C8590*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:8C85C1*
+ ID_OUI_FROM_DATABASE=Aruba, a Hewlett Packard Enterprise Company
+
 OUI:8C85E6*
  ID_OUI_FROM_DATABASE=Cleondris GmbH
 
@@ -79472,6 +81086,9 @@ OUI:8C8ABB*
 OUI:8C8B83*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
+OUI:8C8D28*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:8C8E76*
  ID_OUI_FROM_DATABASE=taskit GmbH
 
@@ -79499,6 +81116,9 @@ OUI:8C9246*
 OUI:8C9351*
  ID_OUI_FROM_DATABASE=Jigowatts Inc.
 
+OUI:8C941F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:8C94CF*
  ID_OUI_FROM_DATABASE=Encell Technology, Inc.
 
@@ -79586,6 +81206,9 @@ OUI:8CBFA6*
 OUI:8CC121*
  ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company
 
+OUI:8CC5B4*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+
 OUI:8CC5E1*
  ID_OUI_FROM_DATABASE=ShenZhen Konka Telecommunication Technology Co.,Ltd
 
@@ -79658,6 +81281,9 @@ OUI:8CCDA2*
 OUI:8CCDE8*
  ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
+OUI:8CCEFD*
+ ID_OUI_FROM_DATABASE=Shenzhen zhouhai technology co.,LTD
+
 OUI:8CCF09*
  ID_OUI_FROM_DATABASE=Dell EMC
 
@@ -79715,6 +81341,9 @@ OUI:8CE2DA*
 OUI:8CE38E*
  ID_OUI_FROM_DATABASE=Kioxia Corporation
 
+OUI:8CE468*
+ ID_OUI_FROM_DATABASE=Guangzhou Sageran Technology Co., Ltd.
+
 OUI:8CE5C0*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -79859,9 +81488,15 @@ OUI:900EB3*
 OUI:901234*
  ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
+OUI:9012A1*
+ ID_OUI_FROM_DATABASE=We Corporation Inc.
+
 OUI:9013DA*
  ID_OUI_FROM_DATABASE=Athom B.V.
 
+OUI:9016BA*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:901711*
  ID_OUI_FROM_DATABASE=Hagenuk Marinekommunikation GmbH
 
@@ -79997,6 +81632,9 @@ OUI:903DBD*
 OUI:903EAB*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
+OUI:903FEA*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:9043E2*
  ID_OUI_FROM_DATABASE=Cornami, Inc
 
@@ -80195,6 +81833,12 @@ OUI:90735A*
 OUI:90749D*
  ID_OUI_FROM_DATABASE=IRay Technology Co., Ltd.
 
+OUI:90769F*
+ ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
+
+OUI:9077EE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:907841*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -80291,6 +81935,9 @@ OUI:90903C*
 OUI:909060*
  ID_OUI_FROM_DATABASE=RSI VIDEO TECHNOLOGIES
 
+OUI:909164*
+ ID_OUI_FROM_DATABASE=ChongQing Lavid Technology Co., Ltd.
+
 OUI:9092B4*
  ID_OUI_FROM_DATABASE=Diehl BGT Defence GmbH & Co. KG
 
@@ -80366,6 +82013,12 @@ OUI:90A783*
 OUI:90A7C1*
  ID_OUI_FROM_DATABASE=Pakedge Device and Software Inc.
 
+OUI:90A935*
+ ID_OUI_FROM_DATABASE=JWEntertainment
+
+OUI:90AAC3*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+
 OUI:90AC3F*
  ID_OUI_FROM_DATABASE=BrightSign LLC
 
@@ -80648,6 +82301,9 @@ OUI:90F3B7*
 OUI:90F4C1*
  ID_OUI_FROM_DATABASE=Rand McNally
 
+OUI:90F644*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:90F652*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
@@ -80681,6 +82337,9 @@ OUI:940006*
 OUI:940070*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
+OUI:9400B0*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:940149*
  ID_OUI_FROM_DATABASE=AutoHotBox
 
@@ -80738,6 +82397,12 @@ OUI:9405BBD*
 OUI:9405BBE*
  ID_OUI_FROM_DATABASE=BAE Systems
 
+OUI:940853*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+
+OUI:9408C7*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:940937*
  ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
@@ -80774,6 +82439,9 @@ OUI:941625*
 OUI:941673*
  ID_OUI_FROM_DATABASE=Point Core SARL
 
+OUI:941700*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+
 OUI:941882*
  ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
@@ -80801,6 +82469,9 @@ OUI:9424B8*
 OUI:9424E1*
  ID_OUI_FROM_DATABASE=Alcatel-Lucent Enterprise
 
+OUI:942533*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:942790*
  ID_OUI_FROM_DATABASE=TCT mobile ltd
 
@@ -80843,6 +82514,9 @@ OUI:94350A*
 OUI:9436E0*
  ID_OUI_FROM_DATABASE=Sichuan Bihong Broadcast &amp; Television New Technologies Co.,Ltd
 
+OUI:9437F7*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:9439E5*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -80882,6 +82556,9 @@ OUI:944452*
 OUI:944696*
  ID_OUI_FROM_DATABASE=BaudTec Corporation
 
+OUI:9447B0*
+ ID_OUI_FROM_DATABASE=BEIJING ESWIN COMPUTING TECHNOLOGY CO., LTD
+
 OUI:944996*
  ID_OUI_FROM_DATABASE=WiSilica Inc
 
@@ -80915,6 +82592,9 @@ OUI:945330*
 OUI:945493*
  ID_OUI_FROM_DATABASE=Rigado, LLC
 
+OUI:9454CE*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
 OUI:9454DF*
  ID_OUI_FROM_DATABASE=YST CORP.
 
@@ -81131,6 +82811,9 @@ OUI:94AE61*
 OUI:94AEE3*
  ID_OUI_FROM_DATABASE=Belden Hirschmann Industries (Suzhou) Ltd.
 
+OUI:94AEF0*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:94B01F*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -81371,12 +83054,18 @@ OUI:94E2FD*
 OUI:94E36D*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
+OUI:94E3EE*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:94E4BA*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
 OUI:94E6F7*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:94E70B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:94E711*
  ID_OUI_FROM_DATABASE=Xirka Dama Persada PT
 
@@ -81449,14 +83138,50 @@ OUI:94FAE8*
 OUI:94FB29*
  ID_OUI_FROM_DATABASE=Zebra Technologies Inc.
 
+OUI:94FBA70*
+ ID_OUI_FROM_DATABASE=Reichert Inc.
+
+OUI:94FBA71*
+ ID_OUI_FROM_DATABASE=Inaxsys Security Systems inc.
+
+OUI:94FBA72*
+ ID_OUI_FROM_DATABASE=Beijing Leja Tech co., Ltd.
+
+OUI:94FBA73*
+ ID_OUI_FROM_DATABASE=GUANG DONG TAKSTAR ELECTRONIC CO.,LTD.
+
+OUI:94FBA74*
+ ID_OUI_FROM_DATABASE=UOI TECHNOLOGY CORPORATION
+
+OUI:94FBA75*
+ ID_OUI_FROM_DATABASE=CAVITY EYE
+
+OUI:94FBA76*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation.
+
+OUI:94FBA77*
+ ID_OUI_FROM_DATABASE=Anvil Systems Group, Inc.
+
 OUI:94FBA78*
  ID_OUI_FROM_DATABASE=Silver-I Co.,LTD.
 
 OUI:94FBA79*
  ID_OUI_FROM_DATABASE=Shanghai Hyco Genyong Technology Co., Ltd.
 
+OUI:94FBA7A*
+ ID_OUI_FROM_DATABASE=ELKRON
+
+OUI:94FBA7B*
+ ID_OUI_FROM_DATABASE=Shenzhen Golden Star Technology Ltd
+
+OUI:94FBA7C*
+ ID_OUI_FROM_DATABASE=Solaborate Inc.
+
 OUI:94FBA7D*
- ID_OUI_FROM_DATABASE=Creotech Instruments S.A.
+ ID_OUI_FROM_DATABASE=Rosenberger Technologies Co.,Ltd.
+
+OUI:94FBA7E*
+ ID_OUI_FROM_DATABASE=Skyring Smart Technologies(Shenzhen) Co., Ltd.
 
 OUI:94FBB2*
  ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
@@ -81596,6 +83321,9 @@ OUI:980637D*
 OUI:980637E*
  ID_OUI_FROM_DATABASE=Shanghai Jinnian information technology Co. Ltd
 
+OUI:98063C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:98072D*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
@@ -81617,6 +83345,9 @@ OUI:980D51*
 OUI:980D67*
  ID_OUI_FROM_DATABASE=Zyxel Communications Corporation
 
+OUI:980E24*
+ ID_OUI_FROM_DATABASE=Phytium Technology Co.,Ltd.
+
 OUI:980EE4*
  ID_OUI_FROM_DATABASE=Private
 
@@ -81695,6 +83426,9 @@ OUI:982DBA*
 OUI:982F3C*
  ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
+OUI:982FF8*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:983000*
  ID_OUI_FROM_DATABASE=Beijing KEMACOM Technologies Co., Ltd.
 
@@ -81743,6 +83477,9 @@ OUI:9843DA*
 OUI:9844B6*
  ID_OUI_FROM_DATABASE=INFRANOR SAS
 
+OUI:9844CE*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:984562*
  ID_OUI_FROM_DATABASE=Shanghai Baud Data Communication Co.,Ltd.
 
@@ -81962,12 +83699,18 @@ OUI:988B5D*
 OUI:988BAD*
  ID_OUI_FROM_DATABASE=Corintech Ltd.
 
+OUI:988D46*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:988E34*
  ID_OUI_FROM_DATABASE=ZHEJIANG BOXSAM ELECTRONIC CO.,LTD
 
 OUI:988E4A*
  ID_OUI_FROM_DATABASE=NOXUS(BEIJING) TECHNOLOGY CO.,LTD
 
+OUI:988E79*
+ ID_OUI_FROM_DATABASE=Qudelix, Inc.
+
 OUI:988ED4*
  ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
 
@@ -82010,6 +83753,9 @@ OUI:98A40E*
 OUI:98A7B0*
  ID_OUI_FROM_DATABASE=MCST ZAO
 
+OUI:98A942*
+ ID_OUI_FROM_DATABASE=Guangzhou Tozed Kangwei Intelligent Technology Co., LTD
+
 OUI:98AA3C*
  ID_OUI_FROM_DATABASE=Will i-tech Co., Ltd.
 
@@ -82070,12 +83816,18 @@ OUI:98AF65*
 OUI:98B039*
  ID_OUI_FROM_DATABASE=Nokia
 
+OUI:98B3EF*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:98B6E9*
  ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
 
 OUI:98B8BA*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
+OUI:98B8BC*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:98B8E3*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -82103,18 +83855,27 @@ OUI:98C0EB*
 OUI:98C5DB*
  ID_OUI_FROM_DATABASE=Ericsson AB
 
+OUI:98C7A4*
+ ID_OUI_FROM_DATABASE=Shenzhen HS Fiber Communication Equipment CO., LTD
+
 OUI:98C845*
  ID_OUI_FROM_DATABASE=PacketAccess
 
 OUI:98C8B8*
  ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
+OUI:98C97C*
+ ID_OUI_FROM_DATABASE=Shenzhen iComm Semiconductor CO,LTD
+
 OUI:98CA33*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
 OUI:98CB27*
  ID_OUI_FROM_DATABASE=Galore Networks Pvt. Ltd.
 
+OUI:98CBA4*
+ ID_OUI_FROM_DATABASE=Benchmark Electronics
+
 OUI:98CC4D*
  ID_OUI_FROM_DATABASE=Shenzhen mantunsci co., LTD
 
@@ -82238,6 +83999,9 @@ OUI:98F537*
 OUI:98F5A9*
  ID_OUI_FROM_DATABASE=OHSUNG
 
+OUI:98F621*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+
 OUI:98F781*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
@@ -82370,6 +84134,9 @@ OUI:9C1465*
 OUI:9C1874*
  ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
+OUI:9C19C2*
+ ID_OUI_FROM_DATABASE=Dongguan Liesheng Electronic Co., Ltd.
+
 OUI:9C1C12*
  ID_OUI_FROM_DATABASE=Aruba, a Hewlett Packard Enterprise Company
 
@@ -82412,6 +84179,9 @@ OUI:9C28F7*
 OUI:9C293F*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:9C2976*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:9C2A70*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -82521,7 +84291,7 @@ OUI:9C431ED*
  ID_OUI_FROM_DATABASE=HK ELEPHONE Communication Tech Co.,Limited
 
 OUI:9C431EE*
- ID_OUI_FROM_DATABASE=Midas Technology, Inc. dba Stem Audio / Phoenix Au
+ ID_OUI_FROM_DATABASE=Phoenix Audio Technologies
 
 OUI:9C443D*
  ID_OUI_FROM_DATABASE=CHENGDU XUGUANG TECHNOLOGY CO, LTD
@@ -82700,6 +84470,9 @@ OUI:9C69D1*
 OUI:9C6ABE*
  ID_OUI_FROM_DATABASE=QEES ApS.
 
+OUI:9C6B37*
+ ID_OUI_FROM_DATABASE=Renesas Electronics (Penang) Sdn. Bhd.
+
 OUI:9C6B72*
  ID_OUI_FROM_DATABASE=Realme Chongqing MobileTelecommunications Corp Ltd
 
@@ -82832,6 +84605,9 @@ OUI:9C9C40*
 OUI:9C9D5D*
  ID_OUI_FROM_DATABASE=Raden Inc
 
+OUI:9C9D7E*
+ ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
+
 OUI:9CA10A*
  ID_OUI_FROM_DATABASE=SCLE SFE
 
@@ -83067,7 +84843,7 @@ OUI:9CF531*
  ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
 OUI:9CF61A*
- ID_OUI_FROM_DATABASE=UTC Fire and Security
+ ID_OUI_FROM_DATABASE=Carrier Fire & Security
 
 OUI:9CF67D*
  ID_OUI_FROM_DATABASE=Ricardo Prague, s.r.o.
@@ -83330,6 +85106,9 @@ OUI:A0224ED*
 OUI:A0224EE*
  ID_OUI_FROM_DATABASE=Hunan Youmei Science&Technology Development Co.,Ltd.
 
+OUI:A022DE*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+
 OUI:A0231B*
  ID_OUI_FROM_DATABASE=TeleComp R&D Corp.
 
@@ -83585,6 +85364,9 @@ OUI:A05E6B*
 OUI:A06090*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:A06260*
+ ID_OUI_FROM_DATABASE=Private
+
 OUI:A06391*
  ID_OUI_FROM_DATABASE=NETGEAR
 
@@ -83600,6 +85382,9 @@ OUI:A06610*
 OUI:A067BE*
  ID_OUI_FROM_DATABASE=Sicon srl
 
+OUI:A0681C*
+ ID_OUI_FROM_DATABASE=GD Midea Air-Conditioning Equipment Co.,Ltd.
+
 OUI:A0687E*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
@@ -83741,6 +85526,12 @@ OUI:A0999B*
 OUI:A09A5A*
  ID_OUI_FROM_DATABASE=Time Domain
 
+OUI:A09B12*
+ ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
+
+OUI:A09B17*
+ ID_OUI_FROM_DATABASE=Taicang T&W Electronics
+
 OUI:A09BBD*
  ID_OUI_FROM_DATABASE=Total Aviation Solutions Pty Ltd
 
@@ -83963,6 +85754,9 @@ OUI:A0C6EC*
 OUI:A0C9A0*
  ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
+OUI:A0CAA5*
+ ID_OUI_FROM_DATABASE=INTELLIGENCE TECHNOLOGY OF CEC CO., LTD
+
 OUI:A0CBFD*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -83975,6 +85769,9 @@ OUI:A0CEC8*
 OUI:A0CF5B*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:A0CFF5*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:A0D12A*
  ID_OUI_FROM_DATABASE=AXPRO Technology Inc.
 
@@ -83996,6 +85793,9 @@ OUI:A0D795*
 OUI:A0D807*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
+OUI:A0D83D*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
 OUI:A0D86F*
  ID_OUI_FROM_DATABASE=ARGO AI, LLC
 
@@ -84131,6 +85931,9 @@ OUI:A40450*
 OUI:A4059E*
  ID_OUI_FROM_DATABASE=STA Infinity LLP
 
+OUI:A406E9*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:A407B6*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -84338,6 +86141,9 @@ OUI:A438FC*
 OUI:A43A69*
  ID_OUI_FROM_DATABASE=Vers Inc
 
+OUI:A43B0E*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:A43BFA0*
  ID_OUI_FROM_DATABASE=Chengdu Territory Technology Co.,Ltd
 
@@ -84410,6 +86216,9 @@ OUI:A445CD*
 OUI:A4466B*
  ID_OUI_FROM_DATABASE=EOC Technology
 
+OUI:A446B4*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:A446FA*
  ID_OUI_FROM_DATABASE=AmTRAN Video Corporation
 
@@ -84491,6 +86300,9 @@ OUI:A45046*
 OUI:A45055*
  ID_OUI_FROM_DATABASE=BUSWARE.DE
 
+OUI:A45129*
+ ID_OUI_FROM_DATABASE=XAG
+
 OUI:A4516F*
  ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
 
@@ -84653,6 +86465,9 @@ OUI:A47C14*
 OUI:A47C1F*
  ID_OUI_FROM_DATABASE=Cobham plc
 
+OUI:A47CC9*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:A47E39*
  ID_OUI_FROM_DATABASE=zte corporation
 
@@ -84675,7 +86490,10 @@ OUI:A4856B*
  ID_OUI_FROM_DATABASE=Q Electronics Ltd
 
 OUI:A486AE*
- ID_OUI_FROM_DATABASE=Quectel Wireless Solutions
+ ID_OUI_FROM_DATABASE=Quectel Wireless Solutions Co., Ltd.
+
+OUI:A48873*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
 OUI:A4895B*
  ID_OUI_FROM_DATABASE=ARK INFOSOLUTIONS PVT LTD
@@ -84704,6 +86522,9 @@ OUI:A492CB*
 OUI:A4933F*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:A49340*
+ ID_OUI_FROM_DATABASE=Beijing Supvan Information Technology Co.,Ltd.
+
 OUI:A4934C*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -84713,6 +86534,9 @@ OUI:A49426*
 OUI:A4975C*
  ID_OUI_FROM_DATABASE=VTech Telecommunications Ltd.
 
+OUI:A497B1*
+ ID_OUI_FROM_DATABASE=CHONGQING FUGUI ELECTRONICS CO.,LTD.
+
 OUI:A497BB*
  ID_OUI_FROM_DATABASE=Hitachi Industrial Equipment Systems Co.,Ltd
 
@@ -84770,6 +86594,9 @@ OUI:A4A6A9*
 OUI:A4A80F*
  ID_OUI_FROM_DATABASE=Shenzhen Coship Electronics Co., Ltd.
 
+OUI:A4AC0F*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:A4AD00*
  ID_OUI_FROM_DATABASE=Ragsdale Technology
 
@@ -84779,6 +86606,9 @@ OUI:A4ADB8*
 OUI:A4AE11*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co., Ltd.
 
+OUI:A4AE12*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co., Ltd.
+
 OUI:A4AE9A*
  ID_OUI_FROM_DATABASE=Maestro Wireless Solutions ltd.
 
@@ -84836,6 +86666,9 @@ OUI:A4BB6D*
 OUI:A4BBAF*
  ID_OUI_FROM_DATABASE=Lime Instruments
 
+OUI:A4BDC4*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:A4BE2B*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -85139,6 +86972,12 @@ OUI:A8016D*
 OUI:A80180*
  ID_OUI_FROM_DATABASE=IMAGO Technologies GmbH
 
+OUI:A802DB*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:A8032A*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
+
 OUI:A80577*
  ID_OUI_FROM_DATABASE=Netlist, Inc.
 
@@ -85197,7 +87036,7 @@ OUI:A81D16*
  ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
 OUI:A81E84*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:A81FAF*
  ID_OUI_FROM_DATABASE=KRYPTON POLSKA
@@ -85238,15 +87077,24 @@ OUI:A82BD6*
 OUI:A830AD*
  ID_OUI_FROM_DATABASE=WEIFANG GOERTEK ELECTRONICS CO.,LTD
 
+OUI:A830BC*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:A8329A*
  ID_OUI_FROM_DATABASE=Digicom Futuristic Technologies Ltd.
 
 OUI:A8346A*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:A83512*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:A8367A*
  ID_OUI_FROM_DATABASE=frogblue TECHNOLOGY GmbH
 
+OUI:A83759*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:A83944*
  ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
@@ -85301,6 +87149,9 @@ OUI:A83FA1D*
 OUI:A83FA1E*
  ID_OUI_FROM_DATABASE=Guangzhou Navigateworx Technologies Co., Limited
 
+OUI:A84025*
+ ID_OUI_FROM_DATABASE=Oxide Computer Company
+
 OUI:A84041*
  ID_OUI_FROM_DATABASE=Dragino Technology Co., Limited
 
@@ -85316,6 +87167,9 @@ OUI:A845CD*
 OUI:A845E9*
  ID_OUI_FROM_DATABASE=Firich Enterprises CO., LTD.
 
+OUI:A8469D*
+ ID_OUI_FROM_DATABASE=Cisco Meraki
+
 OUI:A8474A*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -85400,6 +87254,9 @@ OUI:A865B2*
 OUI:A8667F*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:A8698C*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
+
 OUI:A86A6F*
  ID_OUI_FROM_DATABASE=RIM
 
@@ -85505,6 +87362,9 @@ OUI:A89008*
 OUI:A89042*
  ID_OUI_FROM_DATABASE=Beijing Wanwei Intelligent Technology Co., Ltd.
 
+OUI:A8913D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:A8922C*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
@@ -85727,6 +87587,9 @@ OUI:A8E77D*
 OUI:A8E824*
  ID_OUI_FROM_DATABASE=INIM ELECTRONICS S.R.L.
 
+OUI:A8E978*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:A8EEC6*
  ID_OUI_FROM_DATABASE=Muuselabs NV/SA
 
@@ -85884,7 +87747,7 @@ OUI:AC1DDFA*
  ID_OUI_FROM_DATABASE=WESCO INTEGRATED SUPPLY
 
 OUI:AC1DDFB*
- ID_OUI_FROM_DATABASE=Fine Inc.
+ ID_OUI_FROM_DATABASE=FINEpowerX INC
 
 OUI:AC1DDFC*
  ID_OUI_FROM_DATABASE=Beijing Chunhong Technology Co., Ltd.
@@ -85901,6 +87764,9 @@ OUI:AC1E92*
 OUI:AC1ED0*
  ID_OUI_FROM_DATABASE=Temic Automotive Philippines Inc.
 
+OUI:AC1F09*
+ ID_OUI_FROM_DATABASE=shenzhen RAKwireless technology  Co.,Ltd
+
 OUI:AC1F6B*
  ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
 
@@ -85925,6 +87791,9 @@ OUI:AC2205*
 OUI:AC220B*
  ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
+OUI:AC2334*
+ ID_OUI_FROM_DATABASE=Infinix mobility limited
+
 OUI:AC233F*
  ID_OUI_FROM_DATABASE=Shenzhen Minew Technologies Co., Ltd.
 
@@ -86093,6 +87962,9 @@ OUI:AC5E8C*
 OUI:AC5F3E*
  ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
+OUI:AC5FEA*
+ ID_OUI_FROM_DATABASE=OnePlus Technology (Shenzhen) Co., Ltd
+
 OUI:AC6089*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -86174,6 +88046,9 @@ OUI:AC64DDE*
 OUI:AC6706*
  ID_OUI_FROM_DATABASE=Ruckus Wireless
 
+OUI:AC675D*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:AC676F*
  ID_OUI_FROM_DATABASE=Electrocompaniet A.S.
 
@@ -86306,11 +88181,14 @@ OUI:AC932F*
 OUI:AC9403*
  ID_OUI_FROM_DATABASE=Envision Peripherals Inc
 
+OUI:AC9572*
+ ID_OUI_FROM_DATABASE=Jovision Technology Co., Ltd.
+
 OUI:AC9A22*
  ID_OUI_FROM_DATABASE=NXP Semiconductors
 
 OUI:AC9A96*
- ID_OUI_FROM_DATABASE=Lantiq Deutschland GmbH
+ ID_OUI_FROM_DATABASE=Maxlinear, Inc
 
 OUI:AC9B0A*
  ID_OUI_FROM_DATABASE=Sony Corporation
@@ -86573,6 +88451,9 @@ OUI:ACEE9E*
 OUI:ACF0B2*
  ID_OUI_FROM_DATABASE=Becker Electronics Taiwan Ltd.
 
+OUI:ACF108*
+ ID_OUI_FROM_DATABASE=LG Innotek
+
 OUI:ACF1DF*
  ID_OUI_FROM_DATABASE=D-Link International
 
@@ -86747,6 +88628,9 @@ OUI:B02A43*
 OUI:B03055*
  ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
 
+OUI:B030C8*
+ ID_OUI_FROM_DATABASE=Teal Drones, Inc.
+
 OUI:B033A6*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
@@ -86867,6 +88751,9 @@ OUI:B05B1F*
 OUI:B05B67*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:B05CDA*
+ ID_OUI_FROM_DATABASE=HP Inc.
+
 OUI:B05CE5*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
@@ -86924,6 +88811,9 @@ OUI:B0754D*
 OUI:B075D5*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:B0761B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:B077AC*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
@@ -86948,6 +88838,9 @@ OUI:B07D47*
 OUI:B07D62*
  ID_OUI_FROM_DATABASE=Dipl.-Ing. H. Horstmann GmbH
 
+OUI:B07D64*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:B07E11*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
@@ -87053,6 +88946,9 @@ OUI:B0A37E*
 OUI:B0A454*
  ID_OUI_FROM_DATABASE=Tripwire Inc.
 
+OUI:B0A460*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:B0A6F5*
  ID_OUI_FROM_DATABASE=Xaptum, Inc.
 
@@ -87086,6 +88982,9 @@ OUI:B0ADAA*
 OUI:B0AE25*
  ID_OUI_FROM_DATABASE=Varikorea
 
+OUI:B0B113*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:B0B194*
  ID_OUI_FROM_DATABASE=zte corporation
 
@@ -87452,6 +89351,9 @@ OUI:B0FD0BE*
 OUI:B0FEBD*
  ID_OUI_FROM_DATABASE=Private
 
+OUI:B0FEE5*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:B40016*
  ID_OUI_FROM_DATABASE=INGENICO TERMINALS SAS
 
@@ -87545,6 +89447,9 @@ OUI:B4218A*
 OUI:B42200*
  ID_OUI_FROM_DATABASE=Brother Industries, LTD.
 
+OUI:B42330*
+ ID_OUI_FROM_DATABASE=Itron Inc
+
 OUI:B424E7*
  ID_OUI_FROM_DATABASE=Codetek Technology Co.,Ltd
 
@@ -87785,6 +89690,9 @@ OUI:B45D50*
 OUI:B46077*
  ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
+OUI:B460ED*
+ ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
+
 OUI:B461FF*
  ID_OUI_FROM_DATABASE=Lumigon A/S
 
@@ -87821,6 +89729,9 @@ OUI:B46D83*
 OUI:B46E08*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:B46F2D*
+ ID_OUI_FROM_DATABASE=Wahoo Fitness
+
 OUI:B47356*
  ID_OUI_FROM_DATABASE=Hangzhou Treebear Networking Co., Ltd.
 
@@ -87839,6 +89750,9 @@ OUI:B4750E*
 OUI:B47748*
  ID_OUI_FROM_DATABASE=Shenzhen Neoway Technology Co.,Ltd.
 
+OUI:B47947*
+ ID_OUI_FROM_DATABASE=Nutanix
+
 OUI:B479A7*
  ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
@@ -87917,6 +89831,9 @@ OUI:B49D0B*
 OUI:B49DB4*
  ID_OUI_FROM_DATABASE=Axion Technologies Inc.
 
+OUI:B49E80*
+ ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
+
 OUI:B49EAC*
  ID_OUI_FROM_DATABASE=Imagik Int'l Corp
 
@@ -88079,6 +89996,9 @@ OUI:B4C0F5*
 OUI:B4C170*
  ID_OUI_FROM_DATABASE=Yi chip Microelectronics (Hangzhou) Co., Ltd
 
+OUI:B4C26A*
+ ID_OUI_FROM_DATABASE=Garmin International
+
 OUI:B4C44E*
  ID_OUI_FROM_DATABASE=VXL eTech Pvt Ltd
 
@@ -88448,6 +90368,9 @@ OUI:B844D9*
 OUI:B847C6*
  ID_OUI_FROM_DATABASE=SanJet Technology Corp.
 
+OUI:B848AA*
+ ID_OUI_FROM_DATABASE=EM Microelectronic
+
 OUI:B84DEE*
  ID_OUI_FROM_DATABASE=Hisense broadband multimedia technology Co.,Ltd
 
@@ -88466,6 +90389,9 @@ OUI:B85510*
 OUI:B856BD*
  ID_OUI_FROM_DATABASE=ITT LLC
 
+OUI:B85776*
+ ID_OUI_FROM_DATABASE=lignex1
+
 OUI:B857D8*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -88577,6 +90503,12 @@ OUI:B87C6F*
 OUI:B87CF2*
  ID_OUI_FROM_DATABASE=Extreme Networks, Inc.
 
+OUI:B88035*
+ ID_OUI_FROM_DATABASE=Shenzhen Qihu Intelligent Technology Company Limited
+
+OUI:B8804F*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:B88198*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -88835,6 +90767,9 @@ OUI:B8CA04*
 OUI:B8CA3A*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
+OUI:B8CB29*
+ ID_OUI_FROM_DATABASE=Dell Inc.
+
 OUI:B8CD93*
  ID_OUI_FROM_DATABASE=Penetek, Inc
 
@@ -88928,6 +90863,9 @@ OUI:B8DB1C*
 OUI:B8DC87*
  ID_OUI_FROM_DATABASE=IAI Corporation
 
+OUI:B8DD71*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:B8DE5E*
  ID_OUI_FROM_DATABASE=LONGCHEER TELECOMMUNICATION LIMITED
 
@@ -89042,6 +90980,9 @@ OUI:BC0200*
 OUI:BC024A*
  ID_OUI_FROM_DATABASE=HMD Global Oy
 
+OUI:BC03A7*
+ ID_OUI_FROM_DATABASE=MFP MICHELIN
+
 OUI:BC0543*
  ID_OUI_FROM_DATABASE=AVM GmbH
 
@@ -89066,6 +91007,9 @@ OUI:BC0FA7*
 OUI:BC125E*
  ID_OUI_FROM_DATABASE=Beijing  WisVideo  INC.
 
+OUI:BC13A8*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
+
 OUI:BC1401*
  ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
 
@@ -89090,6 +91034,9 @@ OUI:BC1695*
 OUI:BC16F5*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:BC17B8*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:BC1A67*
  ID_OUI_FROM_DATABASE=YF Technology Co., Ltd
 
@@ -89123,6 +91070,9 @@ OUI:BC261D*
 OUI:BC2643*
  ID_OUI_FROM_DATABASE=Elprotronic Inc.
 
+OUI:BC26A1*
+ ID_OUI_FROM_DATABASE=FACTORY FIVE Corporation
+
 OUI:BC26C7*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -89492,6 +91442,12 @@ OUI:BC7ABF*
 OUI:BC7DD1*
  ID_OUI_FROM_DATABASE=Radio Data Comms
 
+OUI:BC7E8B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:BC7F7B*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:BC7FA4*
  ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
@@ -89651,6 +91607,9 @@ OUI:BCA8A6*
 OUI:BCA920*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:BCA993*
+ ID_OUI_FROM_DATABASE=Cambium Networks Limited
+
 OUI:BCA9D6*
  ID_OUI_FROM_DATABASE=Cyber-Rain, Inc.
 
@@ -89792,6 +91751,9 @@ OUI:BCE767*
 OUI:BCE796*
  ID_OUI_FROM_DATABASE=Wireless CCTV Ltd
 
+OUI:BCE92F*
+ ID_OUI_FROM_DATABASE=HP Inc.
+
 OUI:BCEA2B*
  ID_OUI_FROM_DATABASE=CityCom GmbH
 
@@ -89888,12 +91850,18 @@ OUI:C0143D*
 OUI:C014B8*
  ID_OUI_FROM_DATABASE=Nokia
 
+OUI:C014FE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:C01692*
  ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
 
 OUI:C0174D*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:C01850*
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
+
 OUI:C01885*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -89903,6 +91871,9 @@ OUI:C01ADA*
 OUI:C01B23*
  ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
 
+OUI:C01C30*
+ ID_OUI_FROM_DATABASE=Shenzhen WIFI-3L Technology Co.,Ltd
+
 OUI:C01E9B*
  ID_OUI_FROM_DATABASE=Pixavi AS
 
@@ -89984,9 +91955,15 @@ OUI:C038F9*
 OUI:C03937*
  ID_OUI_FROM_DATABASE=GREE ELECTRIC APPLIANCES, INC. OF ZHUHAI
 
+OUI:C0395A*
+ ID_OUI_FROM_DATABASE=Zhejiang Dahua Technology Co., Ltd.
+
 OUI:C03B8F*
  ID_OUI_FROM_DATABASE=Minicom Digital Signage
 
+OUI:C03D03*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:C03D46*
  ID_OUI_FROM_DATABASE=Shanghai Sango Network Technology Co.,Ltd
 
@@ -89996,6 +91973,9 @@ OUI:C03DD9*
 OUI:C03E0F*
  ID_OUI_FROM_DATABASE=BSkyB Ltd
 
+OUI:C03EBA*
+ ID_OUI_FROM_DATABASE=Dell Inc.
+
 OUI:C03F0E*
  ID_OUI_FROM_DATABASE=NETGEAR
 
@@ -90041,6 +92021,9 @@ OUI:C04A09*
 OUI:C04DF7*
  ID_OUI_FROM_DATABASE=SERELEC
 
+OUI:C0517E*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+
 OUI:C05336*
  ID_OUI_FROM_DATABASE=Beijing National Railway Research & Design Institute of Signal & Communication Group Co..Ltd.
 
@@ -90065,9 +92048,48 @@ OUI:C05E79*
 OUI:C06118*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
+OUI:C0619A1*
+ ID_OUI_FROM_DATABASE=KidKraft
+
+OUI:C0619A2*
+ ID_OUI_FROM_DATABASE=Grup Arge Enerji ve Kontrol Sistemleri
+
+OUI:C0619A3*
+ ID_OUI_FROM_DATABASE=LYAND ACOUSTIC TECHNOLOGY CO.,LTD.
+
+OUI:C0619A4*
+ ID_OUI_FROM_DATABASE=Stello
+
+OUI:C0619A5*
+ ID_OUI_FROM_DATABASE=Nanjing Balance Network Technology Co., Ltd
+
+OUI:C0619A6*
+ ID_OUI_FROM_DATABASE=IPG Automotive GmbH
+
+OUI:C0619A7*
+ ID_OUI_FROM_DATABASE=MAD PIECE LLC.
+
+OUI:C0619A8*
+ ID_OUI_FROM_DATABASE=Nanjing SinoVatio Technology Co., Ltd
+
+OUI:C0619A9*
+ ID_OUI_FROM_DATABASE=Wingtech Mobile Communications  Co.,Ltd.
+
+OUI:C0619AA*
+ ID_OUI_FROM_DATABASE=Gronn Kontakt AS
+
+OUI:C0619AC*
+ ID_OUI_FROM_DATABASE=JAM-Labs Corp
+
+OUI:C0619AD*
+ ID_OUI_FROM_DATABASE=Uhnder
+
 OUI:C0626B*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:C06369*
+ ID_OUI_FROM_DATABASE=BINXIN TECHNOLOGY(ZHEJIANG) LTD.
+
 OUI:C06394*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -90167,6 +92189,9 @@ OUI:C08359D*
 OUI:C08359E*
  ID_OUI_FROM_DATABASE=Cyber Sciences, Inc.
 
+OUI:C083C9*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:C0847A*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -90179,6 +92204,9 @@ OUI:C08488*
 OUI:C0854C*
  ID_OUI_FROM_DATABASE=Ragentek Technology Group
 
+OUI:C086B3*
+ ID_OUI_FROM_DATABASE=Shenzhen Voxtech Co., Ltd.
+
 OUI:C087EB*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -90206,6 +92234,9 @@ OUI:C08C60*
 OUI:C08C71*
  ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
+OUI:C08F20*
+ ID_OUI_FROM_DATABASE=Shenzhen Skyworth  Digital  Technology  CO., Ltd
+
 OUI:C09132*
  ID_OUI_FROM_DATABASE=Patriot Memory
 
@@ -90320,6 +92351,9 @@ OUI:C0A26D*
 OUI:C0A364*
  ID_OUI_FROM_DATABASE=3D Systems Massachusetts
 
+OUI:C0A36E*
+ ID_OUI_FROM_DATABASE=BSkyB Ltd
+
 OUI:C0A39E*
  ID_OUI_FROM_DATABASE=EarthCam, Inc.
 
@@ -90377,9 +92411,15 @@ OUI:C0B883*
 OUI:C0B8B1*
  ID_OUI_FROM_DATABASE=BitBox Ltd
 
+OUI:C0B8E6*
+ ID_OUI_FROM_DATABASE=Ruijie Networks Co.,LTD
+
 OUI:C0BAE6*
  ID_OUI_FROM_DATABASE=Application Solutions (Electronics and Vision) Ltd
 
+OUI:C0BC9A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:C0BD42*
  ID_OUI_FROM_DATABASE=ZPA Smart Energy a.s.
 
@@ -90425,6 +92465,9 @@ OUI:C0CB38*
 OUI:C0CBF1*
  ID_OUI_FROM_DATABASE=Mobiwire Mobiles (NingBo) Co., LTD
 
+OUI:C0CC42*
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+
 OUI:C0CCF8*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -90443,6 +92486,9 @@ OUI:C0D044*
 OUI:C0D0FF*
  ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
 
+OUI:C0D193*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:C0D2DD*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -90521,6 +92567,9 @@ OUI:C0DCDA*
 OUI:C0DF77*
  ID_OUI_FROM_DATABASE=Conrad Electronic SE
 
+OUI:C0E3A0*
+ ID_OUI_FROM_DATABASE=Renesas Electronics (Penang) Sdn. Bhd.
+
 OUI:C0E422*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
@@ -90533,6 +92582,9 @@ OUI:C0E434*
 OUI:C0E54E*
  ID_OUI_FROM_DATABASE=ARIES Embedded GmbH
 
+OUI:C0E7BF*
+ ID_OUI_FROM_DATABASE=Sichuan AI-Link Technology Co., Ltd.
+
 OUI:C0E862*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -90560,6 +92612,9 @@ OUI:C0F4E6*
 OUI:C0F636*
  ID_OUI_FROM_DATABASE=Hangzhou Kuaiyue Technologies, Ltd.
 
+OUI:C0F6C2*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:C0F79D*
  ID_OUI_FROM_DATABASE=Powercode
 
@@ -90575,6 +92630,9 @@ OUI:C0F991*
 OUI:C0FD84*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:C0FFA8*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:C0FFD4*
  ID_OUI_FROM_DATABASE=NETGEAR
 
@@ -90632,6 +92690,9 @@ OUI:C40ACB*
 OUI:C40BCB*
  ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
+OUI:C40D96*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:C40E45*
  ID_OUI_FROM_DATABASE=ACK Networks,Inc.
 
@@ -90707,6 +92768,9 @@ OUI:C42996*
 OUI:C42AD0*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:C42B44*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:C42C03*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -90822,7 +92886,7 @@ OUI:C4518D*
  ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
 OUI:C45444*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:C455A6*
  ID_OUI_FROM_DATABASE=Cadac Holdings Ltd
@@ -91046,6 +93110,9 @@ OUI:C48F07*
 OUI:C48FC1*
  ID_OUI_FROM_DATABASE=DEEPTRACK S.L.U.
 
+OUI:C4910C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:C4913A*
  ID_OUI_FROM_DATABASE=Shenzhen Sanland Electronic Co., ltd.
 
@@ -91127,6 +93194,9 @@ OUI:C49878*
 OUI:C49880*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:C49886*
+ ID_OUI_FROM_DATABASE=Qorvo Utrecht B.V.
+
 OUI:C49A02*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
@@ -91142,6 +93212,9 @@ OUI:C49F4C*
 OUI:C49FF3*
  ID_OUI_FROM_DATABASE=Mciao Technologies, Inc.
 
+OUI:C4A151*
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+
 OUI:C4A366*
  ID_OUI_FROM_DATABASE=zte corporation
 
@@ -91256,6 +93329,9 @@ OUI:C4D489*
 OUI:C4D655*
  ID_OUI_FROM_DATABASE=Tercel technology co.,ltd
 
+OUI:C4D738*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:C4D8F3*
  ID_OUI_FROM_DATABASE=iZotope
 
@@ -91440,7 +93516,7 @@ OUI:C809A8*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
 OUI:C80AA9*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:C80CC8*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
@@ -91614,7 +93690,7 @@ OUI:C83DDC*
  ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
 OUI:C83DFC*
- ID_OUI_FROM_DATABASE=Pioneer DJ Corporation
+ ID_OUI_FROM_DATABASE=AlphaTheta Corporation
 
 OUI:C83E99*
  ID_OUI_FROM_DATABASE=Texas Instruments
@@ -91691,6 +93767,9 @@ OUI:C85A9F*
 OUI:C85B76*
  ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology co., ltd
 
+OUI:C85BA0*
+ ID_OUI_FROM_DATABASE=Shenzhen Qihu Intelligent Technology Company Limited
+
 OUI:C85D38*
  ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
@@ -91760,6 +93839,9 @@ OUI:C8665D*
 OUI:C8675E*
  ID_OUI_FROM_DATABASE=Extreme Networks, Inc.
 
+OUI:C868DE*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:C869CD*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -91805,6 +93887,9 @@ OUI:C87D77*
 OUI:C87E75*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:C87EA1*
+ ID_OUI_FROM_DATABASE=TCL MOKA International Limited
+
 OUI:C88314*
  ID_OUI_FROM_DATABASE=Tempo Communications
 
@@ -91814,6 +93899,9 @@ OUI:C88439*
 OUI:C88447*
  ID_OUI_FROM_DATABASE=Beautiful Enterprise Co., Ltd
 
+OUI:C884A1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:C88550*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -91982,6 +94070,9 @@ OUI:C8B1EE*
 OUI:C8B21E*
  ID_OUI_FROM_DATABASE=CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.
 
+OUI:C8B29B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:C8B373*
  ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
@@ -92003,6 +94094,9 @@ OUI:C8BAE9*
 OUI:C8BBD3*
  ID_OUI_FROM_DATABASE=Embrane
 
+OUI:C8BC9C*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:C8BCC8*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -92042,6 +94136,9 @@ OUI:C8C750*
 OUI:C8C791*
  ID_OUI_FROM_DATABASE=Zero1.tv GmbH
 
+OUI:C8CA63*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:C8CBB8*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
@@ -92519,6 +94616,12 @@ OUI:CC46D6*
 OUI:CC4703*
  ID_OUI_FROM_DATABASE=Intercon Systems Co., Ltd.
 
+OUI:CC47BD*
+ ID_OUI_FROM_DATABASE=Rhombus Systems
+
+OUI:CC483A*
+ ID_OUI_FROM_DATABASE=Dell Inc.
+
 OUI:CC4AE1*
  ID_OUI_FROM_DATABASE=fourtec -Fourier Technologies
 
@@ -92693,6 +94796,9 @@ OUI:CC82EB*
 OUI:CC856C*
  ID_OUI_FROM_DATABASE=SHENZHEN MDK DIGITAL TECHNOLOGY CO.,LTD
 
+OUI:CC874A*
+ ID_OUI_FROM_DATABASE=Nokia
+
 OUI:CC8826*
  ID_OUI_FROM_DATABASE=LG Innotek
 
@@ -92753,6 +94859,9 @@ OUI:CC9E00*
 OUI:CC9EA2*
  ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
+OUI:CC9ECA*
+ ID_OUI_FROM_DATABASE=HMD Global Oy
+
 OUI:CC9F35*
  ID_OUI_FROM_DATABASE=Transbit Sp. z o.o.
 
@@ -92795,12 +94904,18 @@ OUI:CCAB2C*
 OUI:CCAF78*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
+OUI:CCB0A8*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:CCB0DA*
  ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
 OUI:CCB11A*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:CCB182*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:CCB255*
  ID_OUI_FROM_DATABASE=D-Link International
 
@@ -92846,6 +94961,48 @@ OUI:CCC079*
 OUI:CCC104*
  ID_OUI_FROM_DATABASE=Applied Technical Systems
 
+OUI:CCC2610*
+ ID_OUI_FROM_DATABASE=Ebiologic Technology Co., Ltd.
+
+OUI:CCC2611*
+ ID_OUI_FROM_DATABASE=NWL Inc.
+
+OUI:CCC2612*
+ ID_OUI_FROM_DATABASE=Tecnoideal Srl
+
+OUI:CCC2613*
+ ID_OUI_FROM_DATABASE=NETRADYNE, INC.
+
+OUI:CCC2614*
+ ID_OUI_FROM_DATABASE=EDAG Engineering GmbH
+
+OUI:CCC2615*
+ ID_OUI_FROM_DATABASE=Viper Design, LLC
+
+OUI:CCC2616*
+ ID_OUI_FROM_DATABASE=Guardiar USA
+
+OUI:CCC2617*
+ ID_OUI_FROM_DATABASE=Ability Enterprise Co., Ltd
+
+OUI:CCC2619*
+ ID_OUI_FROM_DATABASE=BYTERG LLC
+
+OUI:CCC261A*
+ ID_OUI_FROM_DATABASE=Shenzhen Uyesee Technology Co.,Ltd
+
+OUI:CCC261B*
+ ID_OUI_FROM_DATABASE=Winterthur Gas & Diesel Ltd.
+
+OUI:CCC261C*
+ ID_OUI_FROM_DATABASE=Nortek Security & Control
+
+OUI:CCC261D*
+ ID_OUI_FROM_DATABASE=Dspread Technology (Beijing) Inc.
+
+OUI:CCC261E*
+ ID_OUI_FROM_DATABASE=Toong In Electronic Corp.
+
 OUI:CCC2E0*
  ID_OUI_FROM_DATABASE=Raisecom Technology CO., LTD
 
@@ -92891,6 +95048,9 @@ OUI:CCCE1E*
 OUI:CCCE40*
  ID_OUI_FROM_DATABASE=Janteq Corp
 
+OUI:CCD083*
+ ID_OUI_FROM_DATABASE=Aruba, a Hewlett Packard Enterprise Company
+
 OUI:CCD281*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -93002,6 +95162,9 @@ OUI:CCD4A1*
 OUI:CCD539*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:CCD73C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:CCD811*
  ID_OUI_FROM_DATABASE=Aiconn Technology Corporation
 
@@ -93011,9 +95174,15 @@ OUI:CCD81F*
 OUI:CCD8C1*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:CCD9AC*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:CCD9E9*
  ID_OUI_FROM_DATABASE=SCR Engineers Ltd.
 
+OUI:CCDB93*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:CCDC55*
  ID_OUI_FROM_DATABASE=Dragonchip Limited
 
@@ -93110,6 +95279,9 @@ OUI:CCFD17*
 OUI:CCFE3C*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:CCFF90*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:D0034B*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -93140,6 +95312,9 @@ OUI:D007CA*
 OUI:D00AAB*
  ID_OUI_FROM_DATABASE=Yokogawa Digital Computer Corporation
 
+OUI:D00DF7*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:D00EA4*
  ID_OUI_FROM_DATABASE=Porsche Cars North America
 
@@ -93158,6 +95333,48 @@ OUI:D0131E*
 OUI:D013FD*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
+OUI:D014110*
+ ID_OUI_FROM_DATABASE=EkkoSense Ltd
+
+OUI:D014111*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:D014112*
+ ID_OUI_FROM_DATABASE=Evoco Labs CO., LTD
+
+OUI:D014113*
+ ID_OUI_FROM_DATABASE=iLOQ Oy
+
+OUI:D014114*
+ ID_OUI_FROM_DATABASE=powerall
+
+OUI:D014116*
+ ID_OUI_FROM_DATABASE=Ahnnet
+
+OUI:D014117*
+ ID_OUI_FROM_DATABASE=Realwave Inc.
+
+OUI:D014118*
+ ID_OUI_FROM_DATABASE=Video Security, Inc.
+
+OUI:D014119*
+ ID_OUI_FROM_DATABASE=Airthings
+
+OUI:D01411A*
+ ID_OUI_FROM_DATABASE=ABB EVI SPA
+
+OUI:D01411B*
+ ID_OUI_FROM_DATABASE=CYLTek Co.,LTD.
+
+OUI:D01411C*
+ ID_OUI_FROM_DATABASE=Shen Zhen HaiHe Hi-Tech Co., Ltd
+
+OUI:D01411D*
+ ID_OUI_FROM_DATABASE=Guangdong Shiqi Manufacture Co., Ltd.
+
+OUI:D01411E*
+ ID_OUI_FROM_DATABASE=Tecnosoft srl
+
 OUI:D0154A*
  ID_OUI_FROM_DATABASE=zte corporation
 
@@ -93563,6 +95780,9 @@ OUI:D07650E*
 OUI:D07650F*
  ID_OUI_FROM_DATABASE=Private
 
+OUI:D0768F*
+ ID_OUI_FROM_DATABASE=Calix Inc.
+
 OUI:D076E7*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
@@ -93876,7 +96096,7 @@ OUI:D0D94F6*
  ID_OUI_FROM_DATABASE=Hyundai Autohow
 
 OUI:D0D94F7*
- ID_OUI_FROM_DATABASE=Private
+ ID_OUI_FROM_DATABASE=Mitsubishi Electric US, Inc.
 
 OUI:D0D94F8*
  ID_OUI_FROM_DATABASE=Apption Labs Limited
@@ -93950,6 +96170,9 @@ OUI:D0F0DB*
 OUI:D0F27F*
  ID_OUI_FROM_DATABASE=SteadyServ Technoligies, LLC
 
+OUI:D0F3F5*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:D0F73B*
  ID_OUI_FROM_DATABASE=Helmut Mauell GmbH Werk Weida
 
@@ -94190,6 +96413,9 @@ OUI:D43D7E*
 OUI:D43FCB*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
+OUI:D440D0*
+ ID_OUI_FROM_DATABASE=OCOSMOS Co., LTD
+
 OUI:D440F0*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -94202,6 +96428,9 @@ OUI:D443A8*
 OUI:D445E8*
  ID_OUI_FROM_DATABASE=Jiangxi Hongpai Technology Co., Ltd.
 
+OUI:D44649*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:D446E1*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -94320,7 +96549,7 @@ OUI:D466A8*
  ID_OUI_FROM_DATABASE=Riedo Networks Ltd
 
 OUI:D46761*
- ID_OUI_FROM_DATABASE=United Gulf Gate Co.
+ ID_OUI_FROM_DATABASE=XonTel Technology Co.
 
 OUI:D467D3*
  ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
@@ -94391,6 +96620,9 @@ OUI:D476EA*
 OUI:D4772B*
  ID_OUI_FROM_DATABASE=Nanjing Ztlink Network Technology Co.,Ltd
 
+OUI:D477B2*
+ ID_OUI_FROM_DATABASE=Netix Global B.V.
+
 OUI:D47856*
  ID_OUI_FROM_DATABASE=Avaya Inc
 
@@ -94583,6 +96815,9 @@ OUI:D4A425*
 OUI:D4A499*
  ID_OUI_FROM_DATABASE=InView Technology Corporation
 
+OUI:D4A651*
+ ID_OUI_FROM_DATABASE=HANGZHOU AIXIANGJI TECHNOLOGY CO., LTD
+
 OUI:D4A928*
  ID_OUI_FROM_DATABASE=GreenWave Reality Inc
 
@@ -94592,6 +96827,9 @@ OUI:D4AAFF*
 OUI:D4AB82*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
+OUI:D4ABCD*
+ ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
+
 OUI:D4AC4E*
  ID_OUI_FROM_DATABASE=BODi rS, LLC
 
@@ -94610,6 +96848,9 @@ OUI:D4AE05*
 OUI:D4AE52*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
+OUI:D4AFF7*
+ ID_OUI_FROM_DATABASE=Arista Networks
+
 OUI:D4B110*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -94787,6 +97028,9 @@ OUI:D4F143*
 OUI:D4F207*
  ID_OUI_FROM_DATABASE=DIAODIAO(Beijing)Technology CO.,Ltd
 
+OUI:D4F337*
+ ID_OUI_FROM_DATABASE=Xunison Ltd.
+
 OUI:D4F46F*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -94808,9 +97052,15 @@ OUI:D4F5EF*
 OUI:D4F63F*
  ID_OUI_FROM_DATABASE=IEA S.R.L.
 
+OUI:D4F756*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:D4F786*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
+OUI:D4F829*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+
 OUI:D4F9A1*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -94979,6 +97229,9 @@ OUI:D832E3*
 OUI:D8337F*
  ID_OUI_FROM_DATABASE=Office FA.com Co.,Ltd.
 
+OUI:D834EE*
+ ID_OUI_FROM_DATABASE=Stem Audio
+
 OUI:D837BE*
  ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
@@ -95042,6 +97295,9 @@ OUI:D84C90*
 OUI:D84DB9*
  ID_OUI_FROM_DATABASE=Wu Qi Technologies,Inc.
 
+OUI:D84F37*
+ ID_OUI_FROM_DATABASE=Proxis, spol. s r.o.
+
 OUI:D84FB8*
  ID_OUI_FROM_DATABASE=LG ELECTRONICS
 
@@ -95135,6 +97391,9 @@ OUI:D86C63*
 OUI:D86CE9*
  ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
+OUI:D8714D*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:D87157*
  ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
 
@@ -95147,6 +97406,9 @@ OUI:D87533*
 OUI:D8760A*
  ID_OUI_FROM_DATABASE=Escort, Inc.
 
+OUI:D8778B*
+ ID_OUI_FROM_DATABASE=Intelbras
+
 OUI:D8787F*
  ID_OUI_FROM_DATABASE=Ubee Interactive Co., Limited
 
@@ -95240,6 +97502,9 @@ OUI:D88ADC*
 OUI:D88B4C*
  ID_OUI_FROM_DATABASE=KingTing Tech.
 
+OUI:D88C79*
+ ID_OUI_FROM_DATABASE=Google, Inc.
+
 OUI:D88D5C*
  ID_OUI_FROM_DATABASE=Elentec
 
@@ -95312,6 +97577,9 @@ OUI:D89E3F*
 OUI:D89E61*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
+OUI:D89ED4*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
 OUI:D89EF3*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
@@ -95411,6 +97679,9 @@ OUI:D8C068*
 OUI:D8C06A*
  ID_OUI_FROM_DATABASE=Hunantv.com Interactive Entertainment Media Co.,Ltd.
 
+OUI:D8C0A6*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+
 OUI:D8C3FB*
  ID_OUI_FROM_DATABASE=DETRACOM
 
@@ -95426,6 +97697,9 @@ OUI:D8C4E9*
 OUI:D8C561*
  ID_OUI_FROM_DATABASE=CommFront Communications Pte Ltd
 
+OUI:D8C678*
+ ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
+
 OUI:D8C691*
  ID_OUI_FROM_DATABASE=Hichan Technology Corp.
 
@@ -95495,6 +97769,9 @@ OUI:D8D866*
 OUI:D8DA52*
  ID_OUI_FROM_DATABASE=APATOR S.A.
 
+OUI:D8DC40*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:D8DCE9*
  ID_OUI_FROM_DATABASE=Kunshan Erlab ductless filtration system Co.,Ltd
 
@@ -95546,6 +97823,9 @@ OUI:D8ED1C*
 OUI:D8EE78*
  ID_OUI_FROM_DATABASE=Moog Protokraft
 
+OUI:D8EF42*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:D8EFCD*
  ID_OUI_FROM_DATABASE=Nokia
 
@@ -95660,6 +97940,9 @@ OUI:DC1A01*
 OUI:DC1AC5*
  ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
+OUI:DC1BA1*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:DC1D9F*
  ID_OUI_FROM_DATABASE=U & B tech
 
@@ -95777,6 +98060,9 @@ OUI:DC3EF8*
 OUI:DC415F*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:DC41A9*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:DC41E5*
  ID_OUI_FROM_DATABASE=Shenzhen Zhixin Data Service Co., Ltd.
 
@@ -95864,6 +98150,9 @@ OUI:DC4EF4*
 OUI:DC4F22*
  ID_OUI_FROM_DATABASE=Espressif Inc.
 
+OUI:DC503A*
+ ID_OUI_FROM_DATABASE=Nanjing Ticom Tech Co., Ltd.
+
 OUI:DC5360*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -95945,9 +98234,15 @@ OUI:DC7144*
 OUI:DC7196*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
+OUI:DC7223*
+ ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
+
 OUI:DC729B*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:DC7385*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:DC74A8*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -95984,6 +98279,9 @@ OUI:DC8C37*
 OUI:DC9088*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:DC91BF*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
 OUI:DC962C*
  ID_OUI_FROM_DATABASE=NST Audio Ltd
 
@@ -96020,6 +98318,9 @@ OUI:DCA266*
 OUI:DCA333*
  ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
+OUI:DCA3A2*
+ ID_OUI_FROM_DATABASE=Feng mi(Beijing)technology co., LTD
+
 OUI:DCA3AC*
  ID_OUI_FROM_DATABASE=RBcloudtech
 
@@ -96056,6 +98357,9 @@ OUI:DCAD9E*
 OUI:DCAE04*
  ID_OUI_FROM_DATABASE=CELOXICA Ltd
 
+OUI:DCAEEB*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
 OUI:DCAF68*
  ID_OUI_FROM_DATABASE=WEIFANG GOERTEK ELECTRONICS CO.,LTD
 
@@ -96077,6 +98381,9 @@ OUI:DCB4C4*
 OUI:DCB808*
  ID_OUI_FROM_DATABASE=Extreme Networks, Inc.
 
+OUI:DCBD7A*
+ ID_OUI_FROM_DATABASE=Guangzhou Shiyuan Electronic Technology Company Limited
+
 OUI:DCBE7A*
  ID_OUI_FROM_DATABASE=Zhejiang Nurotron Biotechnology Co.
 
@@ -96116,6 +98423,9 @@ OUI:DCCBA8*
 OUI:DCCC8D*
  ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
+OUI:DCCD2F*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
+
 OUI:DCCE41*
  ID_OUI_FROM_DATABASE=FE GLOBAL HONG KONG LIMITED
 
@@ -96146,6 +98456,9 @@ OUI:DCD321*
 OUI:DCD3A2*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:DCD444*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:DCD52A*
  ID_OUI_FROM_DATABASE=Sunny Heart Limited
 
@@ -96158,6 +98471,9 @@ OUI:DCD87F*
 OUI:DCD916*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:DCD9AE*
+ ID_OUI_FROM_DATABASE=Nokia Shanghai Bell Co., Ltd.
+
 OUI:DCDA4F*
  ID_OUI_FROM_DATABASE=GETCK TECHNOLOGY,  INC
 
@@ -96275,6 +98591,9 @@ OUI:DCEE06*
 OUI:DCEF09*
  ID_OUI_FROM_DATABASE=NETGEAR
 
+OUI:DCEF80*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:DCEFCA*
  ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
@@ -96359,6 +98678,9 @@ OUI:E00EDA*
 OUI:E00EE1*
  ID_OUI_FROM_DATABASE=We Corporation Inc.
 
+OUI:E00EE4*
+ ID_OUI_FROM_DATABASE=DWnet Technologies(Suzhou) Corporation
+
 OUI:E0107F*
  ID_OUI_FROM_DATABASE=Ruckus Wireless
 
@@ -96383,6 +98705,9 @@ OUI:E0191D*
 OUI:E01954*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:E01995*
+ ID_OUI_FROM_DATABASE=Nutanix
+
 OUI:E019D8*
  ID_OUI_FROM_DATABASE=BH TECHNOLOGIES
 
@@ -96446,6 +98771,9 @@ OUI:E02A82*
 OUI:E02AE6*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
+OUI:E02B96*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:E02CB2*
  ID_OUI_FROM_DATABASE=Lenovo Mobile Communication (Wuhan) Company Limited
 
@@ -96632,6 +98960,9 @@ OUI:E06089*
 OUI:E061B2*
  ID_OUI_FROM_DATABASE=HANGZHOU ZENOINTEL TECHNOLOGY CO., LTD
 
+OUI:E06234*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:E06267*
  ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
@@ -96656,9 +98987,15 @@ OUI:E067B3*
 OUI:E0686D*
  ID_OUI_FROM_DATABASE=Raybased AB
 
+OUI:E0693A*
+ ID_OUI_FROM_DATABASE=Innophase Inc.
+
 OUI:E06995*
  ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
+OUI:E06CA6*
+ ID_OUI_FROM_DATABASE=Creotech Instruments S.A.
+
 OUI:E0735F*
  ID_OUI_FROM_DATABASE=NUCOM
 
@@ -96677,6 +99014,9 @@ OUI:E078A3*
 OUI:E0795E*
  ID_OUI_FROM_DATABASE=Wuxi Xiaohu Technology Co.,Ltd.
 
+OUI:E079C4*
+ ID_OUI_FROM_DATABASE=iRay Technology Company Limited
+
 OUI:E07C13*
  ID_OUI_FROM_DATABASE=zte corporation
 
@@ -96728,6 +99068,9 @@ OUI:E09153*
 OUI:E091F5*
  ID_OUI_FROM_DATABASE=NETGEAR
 
+OUI:E092A7*
+ ID_OUI_FROM_DATABASE=Feitian Technologies Co., Ltd
+
 OUI:E09467*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -96818,6 +99161,9 @@ OUI:E0AF4B*
 OUI:E0AF4F*
  ID_OUI_FROM_DATABASE=Deutsche Telekom AG
 
+OUI:E0B260*
+ ID_OUI_FROM_DATABASE=TENO NETWORK TECHNOLOGIES COMPANY LIMITED
+
 OUI:E0B2F1*
  ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
 
@@ -96902,6 +99248,9 @@ OUI:E0BB9E*
 OUI:E0BC43*
  ID_OUI_FROM_DATABASE=C2 Microsystems, Inc.
 
+OUI:E0BE03*
+ ID_OUI_FROM_DATABASE=Lite-On Network Communication (Dongguan) Limited
+
 OUI:E0C0D1*
  ID_OUI_FROM_DATABASE=CK Telecom (Shenzhen) Limited
 
@@ -96986,6 +99335,9 @@ OUI:E0D31A*
 OUI:E0D462*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
+OUI:E0D464*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:E0D4E8*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -97190,6 +99542,9 @@ OUI:E41E0AE*
 OUI:E41F13*
  ID_OUI_FROM_DATABASE=IBM Corp
 
+OUI:E41F7B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:E41FE9*
  ID_OUI_FROM_DATABASE=Dunkermotoren GmbH
 
@@ -97199,6 +99554,9 @@ OUI:E422A5*
 OUI:E42354*
  ID_OUI_FROM_DATABASE=SHENZHEN FUZHI SOFTWARE TECHNOLOGY CO.,LTD
 
+OUI:E4246C*
+ ID_OUI_FROM_DATABASE=Zhejiang Dahua Technology Co., Ltd.
+
 OUI:E425E7*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -97208,6 +99566,9 @@ OUI:E425E9*
 OUI:E42686*
  ID_OUI_FROM_DATABASE=DWnet Technologies(Suzhou) Corporation
 
+OUI:E4268B*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:E42771*
  ID_OUI_FROM_DATABASE=Smartlabs
 
@@ -97271,6 +99632,12 @@ OUI:E43A6E*
 OUI:E43C80*
  ID_OUI_FROM_DATABASE=University of Oklahoma
 
+OUI:E43D1A*
+ ID_OUI_FROM_DATABASE=Broadcom Limited
+
+OUI:E43EC6*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:E43ED7*
  ID_OUI_FROM_DATABASE=Arcadyan Corporation
 
@@ -97280,6 +99647,9 @@ OUI:E43FA2*
 OUI:E440E2*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:E44122*
+ ID_OUI_FROM_DATABASE=OnePlus Technology (Shenzhen) Co., Ltd
+
 OUI:E441E6*
  ID_OUI_FROM_DATABASE=Ottec Technology GmbH
 
@@ -97394,6 +99764,9 @@ OUI:E458E7*
 OUI:E45AA2*
  ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
+OUI:E45AD4*
+ ID_OUI_FROM_DATABASE=Eltex Enterprise Ltd.
+
 OUI:E45D37*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
@@ -97751,6 +100124,9 @@ OUI:E4D124*
 OUI:E4D332*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
+OUI:E4D373*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:E4D3AA*
  ID_OUI_FROM_DATABASE=FUJITSU CONNECTED TECHNOLOGIES LIMITED
 
@@ -97940,6 +100316,9 @@ OUI:E81363*
 OUI:E81367*
  ID_OUI_FROM_DATABASE=AIRSOUND Inc.
 
+OUI:E8136E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:E8150E*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
@@ -98003,6 +100382,9 @@ OUI:E81AAC*
 OUI:E81B4B*
  ID_OUI_FROM_DATABASE=amnimo Inc.
 
+OUI:E81B69*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation.
+
 OUI:E81CBA*
  ID_OUI_FROM_DATABASE=Fortinet, Inc.
 
@@ -98207,6 +100589,9 @@ OUI:E86D65*
 OUI:E86D6E*
  ID_OUI_FROM_DATABASE=voestalpine SIGNALING Fareham Ltd.
 
+OUI:E86DCB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:E86F38*
  ID_OUI_FROM_DATABASE=CHONGQING FUGUI ELECTRONICS CO.,LTD.
 
@@ -98228,6 +100613,9 @@ OUI:E878A1*
 OUI:E87AF3*
  ID_OUI_FROM_DATABASE=S5 Tech S.r.l.
 
+OUI:E87F95*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:E8802E*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -98240,6 +100628,9 @@ OUI:E8825B*
 OUI:E884C6*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:E8854B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:E887A3*
  ID_OUI_FROM_DATABASE=Loxley Public Company Limited
 
@@ -98298,7 +100689,7 @@ OUI:E899C4*
  ID_OUI_FROM_DATABASE=HTC Corporation
 
 OUI:E89A8F*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
 OUI:E89AFF*
  ID_OUI_FROM_DATABASE=Fujian LANDI Commercial Equipment Co.,Ltd
@@ -98312,9 +100703,18 @@ OUI:E89E0C*
 OUI:E89EB4*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
+OUI:E89F80*
+ ID_OUI_FROM_DATABASE=Belkin International Inc.
+
 OUI:E89FEC*
  ID_OUI_FROM_DATABASE=CHENGDU KT ELECTRONIC HI-TECH CO.,LTD
 
+OUI:E8A1F8*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:E8A245*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
 OUI:E8A364*
  ID_OUI_FROM_DATABASE=Signal Path International / Peachtree Audio
 
@@ -98489,6 +100889,9 @@ OUI:E8D819*
 OUI:E8D8D1*
  ID_OUI_FROM_DATABASE=HP Inc.
 
+OUI:E8DA20*
+ ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
+
 OUI:E8DA96*
  ID_OUI_FROM_DATABASE=Zhuhai Tianrui Electrical Power Tech. Co., Ltd.
 
@@ -98558,6 +100961,9 @@ OUI:E8EADA*
 OUI:E8EB11*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
+OUI:E8EB1B*
+ ID_OUI_FROM_DATABASE=Microchip Technology Inc.
+
 OUI:E8ECA3*
  ID_OUI_FROM_DATABASE=Dongguan Liesheng Electronic Co.Ltd
 
@@ -98696,6 +101102,9 @@ OUI:EC237B*
 OUI:EC24B8*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
+OUI:EC2651*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:EC26CA*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
@@ -98813,6 +101222,9 @@ OUI:EC55F9*
 OUI:EC5623*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:EC570D*
+ ID_OUI_FROM_DATABASE=AFE Inc.
+
 OUI:EC58EA*
  ID_OUI_FROM_DATABASE=Ruckus Wireless
 
@@ -98858,6 +101270,9 @@ OUI:EC66D1*
 OUI:EC6881*
  ID_OUI_FROM_DATABASE=Palo Alto Networks
 
+OUI:EC6C9A*
+ ID_OUI_FROM_DATABASE=Arcadyan Corporation
+
 OUI:EC6C9F*
  ID_OUI_FROM_DATABASE=Chengdu Volans Technology CO.,LTD
 
@@ -98876,6 +101291,9 @@ OUI:EC71DB*
 OUI:EC74BA*
  ID_OUI_FROM_DATABASE=Hirschmann Automation and Control GmbH
 
+OUI:EC753E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:EC7949*
  ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
@@ -99107,6 +101525,9 @@ OUI:ECBD1D*
 OUI:ECBEDD*
  ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
+OUI:ECC01B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:ECC06A*
  ID_OUI_FROM_DATABASE=PowerChord Group Limited
 
@@ -99155,6 +101576,9 @@ OUI:ECD950*
 OUI:ECD9D1*
  ID_OUI_FROM_DATABASE=Shenzhen TG-NET Botone Technology Co.,Ltd.
 
+OUI:ECDB86*
+ ID_OUI_FROM_DATABASE=API-K
+
 OUI:ECDE3D*
  ID_OUI_FROM_DATABASE=Lamprey Networks, Inc.
 
@@ -99419,6 +101843,9 @@ OUI:F02A23*
 OUI:F02A61*
  ID_OUI_FROM_DATABASE=Waldo Networks, Inc.
 
+OUI:F02E51*
+ ID_OUI_FROM_DATABASE=Casa Systems
+
 OUI:F02FA7*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -99557,6 +101984,9 @@ OUI:F051EA*
 OUI:F05494*
  ID_OUI_FROM_DATABASE=Honeywell Connected Building
 
+OUI:F05501*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:F05849*
  ID_OUI_FROM_DATABASE=CareView Communications
 
@@ -99755,6 +102185,9 @@ OUI:F099BF*
 OUI:F09A51*
  ID_OUI_FROM_DATABASE=Shanghai Viroyal Electronic Technology Company Limited
 
+OUI:F09BB8*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:F09CBB*
  ID_OUI_FROM_DATABASE=RaonThink Inc.
 
@@ -99977,6 +102410,51 @@ OUI:F0D767*
 OUI:F0D7AA*
  ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
+OUI:F0D7AF0*
+ ID_OUI_FROM_DATABASE=ID Tech Japan Co.,Ltd.
+
+OUI:F0D7AF1*
+ ID_OUI_FROM_DATABASE=Beijing Serviatech lnformation Tech Co.,Ltd
+
+OUI:F0D7AF2*
+ ID_OUI_FROM_DATABASE=Blacknight Internet Solutions Limited
+
+OUI:F0D7AF3*
+ ID_OUI_FROM_DATABASE=720?bei jing?Health iTech Co.,Ltd
+
+OUI:F0D7AF4*
+ ID_OUI_FROM_DATABASE=ADAM Audio GmbH
+
+OUI:F0D7AF5*
+ ID_OUI_FROM_DATABASE=Dongguan Huili electroacoustic Industrial Co.,ltd
+
+OUI:F0D7AF6*
+ ID_OUI_FROM_DATABASE=Anord Mardix (USA) Inc.
+
+OUI:F0D7AF7*
+ ID_OUI_FROM_DATABASE=Rievtech Electronic Co.,Ltd
+
+OUI:F0D7AF8*
+ ID_OUI_FROM_DATABASE=SHEN ZHEN MICHIP TECHNOLOGIES CO.,LTD.
+
+OUI:F0D7AF9*
+ ID_OUI_FROM_DATABASE=New IT Project LLC
+
+OUI:F0D7AFA*
+ ID_OUI_FROM_DATABASE=MSTAR TECHNOLOGIES,INC
+
+OUI:F0D7AFB*
+ ID_OUI_FROM_DATABASE=EVCO SPA
+
+OUI:F0D7AFC*
+ ID_OUI_FROM_DATABASE=Shenzhen Virtual Clusters Information Technology Co.,Ltd.
+
+OUI:F0D7AFD*
+ ID_OUI_FROM_DATABASE=Dongguan Gedi Electrons Techeology Co.,LTD
+
+OUI:F0D7AFE*
+ ID_OUI_FROM_DATABASE=Wren Associates, LTD
+
 OUI:F0D7DC*
  ID_OUI_FROM_DATABASE=Wesine (Wuhan) Technology Co., Ltd.
 
@@ -100091,6 +102569,9 @@ OUI:F0F8F2*
 OUI:F0F9F7*
  ID_OUI_FROM_DATABASE=IES GmbH & Co. KG
 
+OUI:F0FAC7*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:F0FCC8*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
@@ -100427,6 +102908,51 @@ OUI:F4645D*
 OUI:F4672D*
  ID_OUI_FROM_DATABASE=ShenZhen Topstar Technology Company
 
+OUI:F46942*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+
+OUI:F469D50*
+ ID_OUI_FROM_DATABASE=Mossman Limited
+
+OUI:F469D51*
+ ID_OUI_FROM_DATABASE=Junchuang (Xiamen) Automation Technology Co.,Ltd
+
+OUI:F469D52*
+ ID_OUI_FROM_DATABASE=Pulsar Engineering srl
+
+OUI:F469D53*
+ ID_OUI_FROM_DATABASE=ITS Co., Ltd.
+
+OUI:F469D54*
+ ID_OUI_FROM_DATABASE=Stype CS d.o.o.
+
+OUI:F469D55*
+ ID_OUI_FROM_DATABASE=Hefei STAROT Technology Co.,Ltd
+
+OUI:F469D56*
+ ID_OUI_FROM_DATABASE=TianJin KCHT Information Technology Co., Ltd.
+
+OUI:F469D57*
+ ID_OUI_FROM_DATABASE=Rosco, Inc
+
+OUI:F469D59*
+ ID_OUI_FROM_DATABASE=Terminus (Shanghai) Technology Co.,Ltd.
+
+OUI:F469D5A*
+ ID_OUI_FROM_DATABASE=ShenZhenShi EVADA technology Co.,Ltd
+
+OUI:F469D5B*
+ ID_OUI_FROM_DATABASE=Konntek Inc
+
+OUI:F469D5C*
+ ID_OUI_FROM_DATABASE=Huaqin Telecom Technology Co.,Ltd.
+
+OUI:F469D5D*
+ ID_OUI_FROM_DATABASE=Nantong ZYDZ Electronic.,Co.Ltd
+
+OUI:F469D5E*
+ ID_OUI_FROM_DATABASE=ORtek Technology, Inc.
+
 OUI:F46A92*
  ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
 
@@ -100703,6 +103229,12 @@ OUI:F4BD9E*
 OUI:F4BF80*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:F4BFA8*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
+OUI:F4C114*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+
 OUI:F4C248*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -100820,6 +103352,9 @@ OUI:F4E3FB*
 OUI:F4E4AD*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:F4E578*
+ ID_OUI_FROM_DATABASE=LLC Proizvodstvennaya Kompania TransService
+
 OUI:F4E5F2*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -101027,6 +103562,9 @@ OUI:F81897*
 OUI:F81A67*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
+OUI:F81B04*
+ ID_OUI_FROM_DATABASE=Zhong Shan City Richsound Electronic Industrial Ltd
+
 OUI:F81CE5*
  ID_OUI_FROM_DATABASE=Telefonbau Behnke GmbH
 
@@ -101141,6 +103679,9 @@ OUI:F82F08*
 OUI:F82F5B*
  ID_OUI_FROM_DATABASE=eGauge Systems LLC
 
+OUI:F82F65*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:F82F6A*
  ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
 
@@ -101246,6 +103787,9 @@ OUI:F8501C*
 OUI:F85063*
  ID_OUI_FROM_DATABASE=Verathon
 
+OUI:F85128*
+ ID_OUI_FROM_DATABASE=SimpliSafe
+
 OUI:F8516D*
  ID_OUI_FROM_DATABASE=Denwa Technology Corp.
 
@@ -101285,6 +103829,9 @@ OUI:F85C45*
 OUI:F85C4D*
  ID_OUI_FROM_DATABASE=Nokia
 
+OUI:F85C7D*
+ ID_OUI_FROM_DATABASE=Shenzhen Honesty Electronics Co.,Ltd.
+
 OUI:F85E3C*
  ID_OUI_FROM_DATABASE=SHENZHEN ZHIBOTONG ELECTRONICS CO.,LTD
 
@@ -101306,6 +103853,9 @@ OUI:F8633F*
 OUI:F86465*
  ID_OUI_FROM_DATABASE=Anova Applied Electronics, Inc.
 
+OUI:F864B8*
+ ID_OUI_FROM_DATABASE=zte corporation
+
 OUI:F86601*
  ID_OUI_FROM_DATABASE=Suzhou Chi-tek information technology Co., Ltd
 
@@ -101318,6 +103868,12 @@ OUI:F866F2*
 OUI:F86971*
  ID_OUI_FROM_DATABASE=Seibu Electric Co.,
 
+OUI:F86BD9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:F86C03*
+ ID_OUI_FROM_DATABASE=Shenzhen Teleone Technology Co., Ltd
+
 OUI:F86CE1*
  ID_OUI_FROM_DATABASE=Taicang T&W Electronics
 
@@ -101378,6 +103934,9 @@ OUI:F88096*
 OUI:F8811A*
  ID_OUI_FROM_DATABASE=OVERKIZ
 
+OUI:F88200*
+ ID_OUI_FROM_DATABASE=CaptionCall
+
 OUI:F88479*
  ID_OUI_FROM_DATABASE=Yaojin Technology(Shenzhen)Co.,Ltd
 
@@ -101519,6 +104078,9 @@ OUI:F8A097*
 OUI:F8A188*
  ID_OUI_FROM_DATABASE=LED Roadway Lighting
 
+OUI:F8A26D*
+ ID_OUI_FROM_DATABASE=CANON INC.
+
 OUI:F8A2B4*
  ID_OUI_FROM_DATABASE=RHEWA-WAAGENFABRIK August Freudewald GmbH &amp;Co. KG
 
@@ -101552,6 +104114,9 @@ OUI:F8AA8A*
 OUI:F8AB05*
  ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
+OUI:F8AC65*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:F8AC6D*
  ID_OUI_FROM_DATABASE=Deltenna Ltd
 
@@ -101633,6 +104198,9 @@ OUI:F8B7E2*
 OUI:F8BBBF*
  ID_OUI_FROM_DATABASE=eero inc.
 
+OUI:F8BC0E*
+ ID_OUI_FROM_DATABASE=eero inc.
+
 OUI:F8BC12*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
@@ -101783,6 +104351,9 @@ OUI:F8E7B5*
 OUI:F8E811*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:F8E877*
+ ID_OUI_FROM_DATABASE=Harman/Becker Automotive Systems GmbH
+
 OUI:F8E903*
  ID_OUI_FROM_DATABASE=D-Link International
 
@@ -101906,6 +104477,9 @@ OUI:FC1186*
 OUI:FC1349*
  ID_OUI_FROM_DATABASE=Global Apps Corp.
 
+OUI:FC1499*
+ ID_OUI_FROM_DATABASE=Aimore Acoustics Incorporation
+
 OUI:FC15B4*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
@@ -101921,6 +104495,9 @@ OUI:FC183C*
 OUI:FC1910*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:FC1999*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+
 OUI:FC19D0*
  ID_OUI_FROM_DATABASE=Cloud Vision Networks Technology Co.,Ltd.
 
@@ -102110,6 +104687,9 @@ OUI:FC5B39*
 OUI:FC6018*
  ID_OUI_FROM_DATABASE=Zhejiang Kangtai Electric Co., Ltd.
 
+OUI:FC609B*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
 OUI:FC6198*
  ID_OUI_FROM_DATABASE=NEC Personal Products, Ltd
 
@@ -102152,6 +104732,9 @@ OUI:FC6FB7*
 OUI:FC71FA*
  ID_OUI_FROM_DATABASE=Trane Technologies
 
+OUI:FC73FB*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:FC7516*
  ID_OUI_FROM_DATABASE=D-Link International
 
@@ -102188,6 +104771,9 @@ OUI:FC83C6*
 OUI:FC8596*
  ID_OUI_FROM_DATABASE=Axonne Inc.
 
+OUI:FC862A*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:FC8743*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -102311,6 +104897,9 @@ OUI:FCA47AD*
 OUI:FCA47AE*
  ID_OUI_FROM_DATABASE=Hefei Feier Smart Science&Technology Co. Ltd
 
+OUI:FCA5D0*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
 OUI:FCA621*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -102377,6 +104966,9 @@ OUI:FCB7F0*
 OUI:FCBBA1*
  ID_OUI_FROM_DATABASE=Shenzhen Minicreate Technology Co.,Ltd
 
+OUI:FCBC0E*
+ ID_OUI_FROM_DATABASE=Zhejiang Cainiao Supply Chain Management Co., Ltd
+
 OUI:FCBC9C*
  ID_OUI_FROM_DATABASE=Vimar Spa
 
index fff78628715593c255f6b23ebc7a44c8f83fc5ec..d2284b5c7e066ac9a64cdbde2f1b62c0057f5727 100644 (file)
@@ -1,5 +1,5 @@
---- 20-acpi-vendor.hwdb.base   2020-03-06 12:40:11.417307950 +0100
-+++ 20-acpi-vendor.hwdb        2020-03-06 12:40:11.433308177 +0100
+--- 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
 @@ -3,6 +3,8 @@
  # Data imported from:
  #     https://uefi.org/uefi-pnp-export
index b81fa2c3c416172f086242f3c8cad780c4f1bfd9..4faf1336674fe41df55da7b28355953d5e220412 100644 (file)
@@ -470,6 +470,9 @@ pci:v*d*sv*sd*bc0Csc03i20*
 pci:v*d*sv*sd*bc0Csc03i30*
  ID_PCI_INTERFACE_FROM_DATABASE=XHCI
 
+pci:v*d*sv*sd*bc0Csc03i40*
+ ID_PCI_INTERFACE_FROM_DATABASE=USB4 Host Interface
+
 pci:v*d*sv*sd*bc0Csc03i80*
  ID_PCI_INTERFACE_FROM_DATABASE=Unspecified
 
index f26bd3b81b8f50f38275593ff5567852c4965814..f82236b83e87f14f67125697c570cfdb814ab169 100644 (file)
@@ -182,6 +182,12 @@ pci:v00000675d00001704*
 pci:v00000721*
  ID_VENDOR_FROM_DATABASE=Sapphire, Inc.
 
+pci:v00000731*
+ ID_VENDOR_FROM_DATABASE=Jingjia Microelectronics Co Ltd
+
+pci:v00000731d00007200*
+ ID_MODEL_FROM_DATABASE=JM7200 Series GPU
+
 pci:v00000777*
  ID_VENDOR_FROM_DATABASE=Ubiquiti Networks, Inc.
 
@@ -1271,6 +1277,9 @@ pci:v00001000d0000005Fsv00001028sd00001F4D*
 pci:v00001000d0000005Fsv00001054sd0000306A*
  ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3008 [Fury] (SAS 3004 iMR ROMB)
 
+pci:v00001000d0000005Fsv00001734sd00001211*
+ ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3008 [Fury] (PRAID CP400i [D3307-A12])
+
 pci:v00001000d0000005Fsv00001D49sd000004DB*
  ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3008 [Fury] (ServeRAID M1210 SAS/SATA Controller)
 
@@ -1862,6 +1871,9 @@ pci:v00001000d00000097sv00001028sd00001FD3*
 pci:v00001000d00000097sv000015D9sd00000808*
  ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (AOC-S3008L-L8e)
 
+pci:v00001000d00000097sv00001BD4sd00000008*
+ ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (12G SAS3008IMR Onboard)
+
 pci:v00001000d00000097sv00001BD4sd0000000B*
  ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (12G SAS3008IR)
 
@@ -1874,6 +1886,12 @@ pci:v00001000d00000097sv00001BD4sd00000011*
 pci:v00001000d00000097sv00001BD4sd00000012*
  ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (12Gb SAS3008IR UDM)
 
+pci:v00001000d00000097sv00001BD4sd0000001F*
+ ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (12G SAS3008IR Onboard)
+
+pci:v00001000d00000097sv00001BD4sd00000020*
+ ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (12G SAS3008IT Onboard)
+
 pci:v00001000d00000097sv00001BD4sd00000026*
  ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (12G SAS3008IT RACK)
 
@@ -3197,6 +3215,9 @@ pci:v00001002d00004383sv00001179sd0000FF50*
 pci:v00001002d00004383sv00001458sd0000A022*
  ID_MODEL_FROM_DATABASE=SBx00 Azalia (Intel HDA) (GA-MA770-DS3rev2.0 Motherboard)
 
+pci:v00001002d00004383sv00001458sd0000A102*
+ ID_MODEL_FROM_DATABASE=SBx00 Azalia (Intel HDA) (GA-880GMA-USB3)
+
 pci:v00001002d00004383sv000017F2sd00005000*
  ID_MODEL_FROM_DATABASE=SBx00 Azalia (Intel HDA) (KI690-AM2 Motherboard)
 
@@ -3407,6 +3428,9 @@ pci:v00001002d00004391sv00001043sd000084DD*
 pci:v00001002d00004391sv0000105Bsd00000E13*
  ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode] (N15235/A74MX mainboard / AMD SB700)
 
+pci:v00001002d00004391sv00001458sd0000B002*
+ ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode] (GA-880GMA-USB3)
+
 pci:v00001002d00004391sv0000174Bsd00001001*
  ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode] (PURE Fusion Mini)
 
@@ -3446,6 +3470,9 @@ pci:v00001002d00004396sv00001043sd00008443*
 pci:v00001002d00004396sv0000105Bsd00000E13*
  ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 USB EHCI Controller (N15235/A74MX mainboard / AMD SB700)
 
+pci:v00001002d00004396sv00001458sd00005004*
+ ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 USB EHCI Controller (GA-880GMA-USB3)
+
 pci:v00001002d00004396sv000015D9sd0000A811*
  ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 USB EHCI Controller (H8DGU)
 
@@ -3473,6 +3500,9 @@ pci:v00001002d00004397sv00001043sd00008443*
 pci:v00001002d00004397sv0000105Bsd00000E13*
  ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 USB OHCI0 Controller (N15235/A74MX mainboard / AMD SB700)
 
+pci:v00001002d00004397sv00001458sd00005004*
+ ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 USB OHCI0 Controller (GA-880GMA-USB3)
+
 pci:v00001002d00004397sv000015D9sd0000A811*
  ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 USB OHCI0 Controller (H8DGU)
 
@@ -3509,6 +3539,9 @@ pci:v00001002d00004399sv00001043sd00008443*
 pci:v00001002d00004399sv0000105Bsd00000E13*
  ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 USB OHCI2 Controller (N15235/A74MX mainboard / AMD SB700)
 
+pci:v00001002d00004399sv00001458sd00005004*
+ ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 USB OHCI2 Controller (GA-880GMA-USB3)
+
 pci:v00001002d00004399sv0000174Bsd00001001*
  ID_MODEL_FROM_DATABASE=SB7x0/SB8x0/SB9x0 USB OHCI2 Controller (PURE Fusion Mini)
 
@@ -5540,6 +5573,9 @@ pci:v00001002d00006651*
 pci:v00001002d00006658*
  ID_MODEL_FROM_DATABASE=Bonaire XTX [Radeon R7 260X/360]
 
+pci:v00001002d00006658sv00001043sd0000048F*
+ ID_MODEL_FROM_DATABASE=Bonaire XTX [Radeon R7 260X/360] (R7260X-DC2OC-2GD5)
+
 pci:v00001002d00006658sv00001043sd000004D3*
  ID_MODEL_FROM_DATABASE=Bonaire XTX [Radeon R7 260X/360] (AMD Radeon R7 260X)
 
@@ -7493,6 +7529,9 @@ pci:v00001002d000067DFsv00001028sd00001722*
 pci:v00001002d000067DFsv00001028sd00001723*
  ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Radeon RX 580X)
 
+pci:v00001002d000067DFsv0000103Csd0000840E*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Radeon RX 580 4GB)
+
 pci:v00001002d000067DFsv00001043sd000004A8*
  ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (Radeon RX 480)
 
@@ -8343,7 +8382,7 @@ pci:v00001002d00006863*
  ID_MODEL_FROM_DATABASE=Vega 10 XTX [Radeon Vega Frontier Edition]
 
 pci:v00001002d00006864*
- ID_MODEL_FROM_DATABASE=Vega
+ ID_MODEL_FROM_DATABASE=Vega 10 [Radeon Pro V340]
 
 pci:v00001002d00006867*
  ID_MODEL_FROM_DATABASE=Vega 10 XL [Radeon Pro Vega 56]
@@ -8361,7 +8400,7 @@ pci:v00001002d0000687Fsv00001002sd00000B36*
  ID_MODEL_FROM_DATABASE=Vega 10 XL/XT [Radeon RX Vega 56/64] (RX Vega64)
 
 pci:v00001002d0000687Fsv00001002sd00006B76*
- ID_MODEL_FROM_DATABASE=Vega 10 XL/XT [Radeon RX Vega 56/64] (RX Vega56)
+ ID_MODEL_FROM_DATABASE=Vega 10 XL/XT [Radeon RX Vega 56/64] (RX Vega64)
 
 pci:v00001002d00006880*
  ID_MODEL_FROM_DATABASE=Lexington [Radeon HD 6550M]
@@ -9851,8 +9890,11 @@ pci:v00001002d00006901sv0000103Csd00001318*
 pci:v00001002d00006907*
  ID_MODEL_FROM_DATABASE=Meso XT [Radeon R5 M315]
 
+pci:v00001002d00006920*
+ ID_MODEL_FROM_DATABASE=Amethyst [Radeon R9 M395/ M395X Mac Edition]
+
 pci:v00001002d00006921*
- ID_MODEL_FROM_DATABASE=Amethyst XT [Radeon R9 M295X]
+ ID_MODEL_FROM_DATABASE=Amethyst XT [Radeon R9 M295X / M390X]
 
 pci:v00001002d00006929*
  ID_MODEL_FROM_DATABASE=Tonga XT GL [FirePro S7150]
@@ -10386,7 +10428,7 @@ pci:v00001002d00007300sv0000174Bsd0000E329*
  ID_MODEL_FROM_DATABASE=Fiji [Radeon R9 FURY / NANO Series] (Radeon R9 FURY)
 
 pci:v00001002d00007310*
- ID_MODEL_FROM_DATABASE=Navi 10
+ ID_MODEL_FROM_DATABASE=Navi 10 [Radeon Pro W5700X]
 
 pci:v00001002d00007312*
  ID_MODEL_FROM_DATABASE=Navi 10 [Radeon Pro W5700]
@@ -10394,6 +10436,9 @@ pci:v00001002d00007312*
 pci:v00001002d0000731F*
  ID_MODEL_FROM_DATABASE=Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT]
 
+pci:v00001002d0000731Fsv00001DA2sd0000E411*
+ ID_MODEL_FROM_DATABASE=Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT] (Radeon RX 5600 XT)
+
 pci:v00001002d00007340*
  ID_MODEL_FROM_DATABASE=Navi 14 [Radeon RX 5500/5500M / Pro 5500M]
 
@@ -10406,6 +10451,9 @@ pci:v00001002d00007347*
 pci:v00001002d0000734F*
  ID_MODEL_FROM_DATABASE=Navi 14 [Radeon Pro W5300M]
 
+pci:v00001002d00007360*
+ ID_MODEL_FROM_DATABASE=Navi 12 [Radeon Pro 5600M]
+
 pci:v00001002d00007833*
  ID_MODEL_FROM_DATABASE=RS350 Host Bridge
 
@@ -10976,6 +11024,9 @@ pci:v00001002d000095C0*
 pci:v00001002d000095C0sv00001002sd000095C0*
  ID_MODEL_FROM_DATABASE=RV620 PRO [Radeon HD 3470] (Mobility Radeon HD 3470)
 
+pci:v00001002d000095C0sv00001028sd00003243*
+ ID_MODEL_FROM_DATABASE=RV620 PRO [Radeon HD 3470] (C120D)
+
 pci:v00001002d000095C2*
  ID_MODEL_FROM_DATABASE=RV620/M82 [Mobility Radeon HD 3410/3430]
 
@@ -11525,6 +11576,9 @@ pci:v00001002d0000AAB8*
 pci:v00001002d0000AAC0*
  ID_MODEL_FROM_DATABASE=Tobago HDMI Audio [Radeon R7 360 / R9 360 OEM]
 
+pci:v00001002d0000AAC0sv00001043sd0000AAC0*
+ ID_MODEL_FROM_DATABASE=Tobago HDMI Audio [Radeon R7 360 / R9 360 OEM] (R7260X-DC2OC-2GD5)
+
 pci:v00001002d0000AAC8*
  ID_MODEL_FROM_DATABASE=Hawaii HDMI Audio [Radeon R9 290/290X / 390/390X]
 
@@ -15296,6 +15350,9 @@ pci:v0000102Bd0000051A*
 pci:v0000102Bd0000051Asv0000102Bsd00000100*
  ID_MODEL_FROM_DATABASE=MGA 1064SG [Mystique] (MGA-1064SG Mystique)
 
+pci:v0000102Bd0000051Asv0000102Bsd0000051A*
+ ID_MODEL_FROM_DATABASE=MGA 1064SG [Mystique] (MGA-1164SG Mystique 220)
+
 pci:v0000102Bd0000051Asv0000102Bsd00001100*
  ID_MODEL_FROM_DATABASE=MGA 1064SG [Mystique] (MGA-1084SG Mystique)
 
@@ -32630,6 +32687,9 @@ pci:v000010DEd00000FD4*
 pci:v000010DEd00000FD5*
  ID_MODEL_FROM_DATABASE=GK107M [GeForce GT 650M Mac Edition]
 
+pci:v000010DEd00000FD6*
+ ID_MODEL_FROM_DATABASE=GK107M
+
 pci:v000010DEd00000FD8*
  ID_MODEL_FROM_DATABASE=GK107M [GeForce GT 640M Mac Edition]
 
@@ -32675,6 +32735,9 @@ pci:v000010DEd00000FE7*
 pci:v000010DEd00000FE7sv000010DEsd0000101E*
  ID_MODEL_FROM_DATABASE=GK107GL [GRID K100 vGPU] (GRID K100)
 
+pci:v000010DEd00000FE8*
+ ID_MODEL_FROM_DATABASE=GK107M
+
 pci:v000010DEd00000FE9*
  ID_MODEL_FROM_DATABASE=GK107M [GeForce GT 750M Mac Edition]
 
@@ -34220,6 +34283,9 @@ pci:v000010DEd000011A3sv0000106Bsd0000010D*
 pci:v000010DEd000011A7*
  ID_MODEL_FROM_DATABASE=GK104M [GeForce GTX 675MX]
 
+pci:v000010DEd000011A9*
+ ID_MODEL_FROM_DATABASE=GK104M [GeForce GTX 870M]
+
 pci:v000010DEd000011AF*
  ID_MODEL_FROM_DATABASE=GK104GLM [GRID IceCube]
 
@@ -34496,12 +34562,18 @@ pci:v000010DEd00001288*
 pci:v000010DEd00001289*
  ID_MODEL_FROM_DATABASE=GK208 [GeForce GT 710]
 
+pci:v000010DEd0000128A*
+ ID_MODEL_FROM_DATABASE=GK208B
+
 pci:v000010DEd0000128B*
  ID_MODEL_FROM_DATABASE=GK208B [GeForce GT 710]
 
 pci:v000010DEd0000128Bsv00001043sd000085F7*
  ID_MODEL_FROM_DATABASE=GK208B [GeForce GT 710] (GT710-SL-1GD5)
 
+pci:v000010DEd0000128C*
+ ID_MODEL_FROM_DATABASE=GK208B
+
 pci:v000010DEd00001290*
  ID_MODEL_FROM_DATABASE=GK208M [GeForce GT 730M]
 
@@ -34970,8 +35042,11 @@ pci:v000010DEd00001ADBsv00001043sd00008673*
 pci:v000010DEd00001AEB*
  ID_MODEL_FROM_DATABASE=TU116 High Definition Audio Controller
 
+pci:v000010DEd00001AEC*
+ ID_MODEL_FROM_DATABASE=TU116 USB 3.1 Host Controller
+
 pci:v000010DEd00001AED*
- ID_MODEL_FROM_DATABASE=TU116 [GeForce GTX 1650 SUPER]
+ ID_MODEL_FROM_DATABASE=TU116 USB Type-C UCSI Controller
 
 pci:v000010DEd00001B00*
  ID_MODEL_FROM_DATABASE=GP102 [TITAN X]
@@ -35216,6 +35291,9 @@ pci:v000010DEd00001C92*
 pci:v000010DEd00001C94*
  ID_MODEL_FROM_DATABASE=GP107M [GeForce MX350]
 
+pci:v000010DEd00001C96*
+ ID_MODEL_FROM_DATABASE=GP107M [GeForce MX350]
+
 pci:v000010DEd00001CA7*
  ID_MODEL_FROM_DATABASE=GP107GL
 
@@ -35312,6 +35390,9 @@ pci:v000010DEd00001D34*
 pci:v000010DEd00001D52*
  ID_MODEL_FROM_DATABASE=GP108BM [GeForce MX250]
 
+pci:v000010DEd00001D56*
+ ID_MODEL_FROM_DATABASE=GP108BM [GeForce MX330]
+
 pci:v000010DEd00001D81*
  ID_MODEL_FROM_DATABASE=GV100 [TITAN V]
 
@@ -35387,6 +35468,9 @@ pci:v000010DEd00001E30sv000010DEsd0000129E*
 pci:v000010DEd00001E30sv000010DEsd000012BA*
  ID_MODEL_FROM_DATABASE=TU102GL [Quadro RTX 6000/8000] (Quadro RTX 6000)
 
+pci:v000010DEd00001E36*
+ ID_MODEL_FROM_DATABASE=TU102GL
+
 pci:v000010DEd00001E37*
  ID_MODEL_FROM_DATABASE=TU102GL [GRID RTX T10-4/T10-8/T10-16]
 
@@ -35438,6 +35522,12 @@ pci:v000010DEd00001E89*
 pci:v000010DEd00001E90*
  ID_MODEL_FROM_DATABASE=TU104M [GeForce RTX 2080 Mobile]
 
+pci:v000010DEd00001E91*
+ ID_MODEL_FROM_DATABASE=TU104M [GeForce RTX 2070 SUPER Mobile / Max-Q]
+
+pci:v000010DEd00001E93*
+ ID_MODEL_FROM_DATABASE=TU104M [GeForce RTX 2080 SUPER Mobile / Max-Q]
+
 pci:v000010DEd00001EAB*
  ID_MODEL_FROM_DATABASE=TU104M
 
@@ -35474,6 +35564,12 @@ pci:v000010DEd00001EC7*
 pci:v000010DEd00001ED0*
  ID_MODEL_FROM_DATABASE=TU104BM [GeForce RTX 2080 Mobile]
 
+pci:v000010DEd00001ED1*
+ ID_MODEL_FROM_DATABASE=TU104BM [GeForce RTX 2070 SUPER Mobile / Max-Q]
+
+pci:v000010DEd00001ED3*
+ ID_MODEL_FROM_DATABASE=TU104BM [GeForce RTX 2080 SUPER Mobile / Max-Q]
+
 pci:v000010DEd00001F02*
  ID_MODEL_FROM_DATABASE=TU106 [GeForce RTX 2070]
 
@@ -35492,12 +35588,27 @@ pci:v000010DEd00001F07*
 pci:v000010DEd00001F08*
  ID_MODEL_FROM_DATABASE=TU106 [GeForce RTX 2060 Rev. A]
 
+pci:v000010DEd00001F09*
+ ID_MODEL_FROM_DATABASE=TU106 [GeForce GTX 1660 SUPER]
+
+pci:v000010DEd00001F0A*
+ ID_MODEL_FROM_DATABASE=TU106 [GeForce GTX 1650]
+
 pci:v000010DEd00001F10*
  ID_MODEL_FROM_DATABASE=TU106M [GeForce RTX 2070 Mobile]
 
 pci:v000010DEd00001F11*
  ID_MODEL_FROM_DATABASE=TU106M [GeForce RTX 2060 Mobile]
 
+pci:v000010DEd00001F12*
+ ID_MODEL_FROM_DATABASE=TU106M [GeForce RTX 2060 Max-Q]
+
+pci:v000010DEd00001F14*
+ ID_MODEL_FROM_DATABASE=TU106M [GeForce RTX 2070 Mobile / Max-Q Refresh]
+
+pci:v000010DEd00001F15*
+ ID_MODEL_FROM_DATABASE=TU106M [GeForce RTX 2060 Mobile]
+
 pci:v000010DEd00001F2E*
  ID_MODEL_FROM_DATABASE=TU106M
 
@@ -35511,11 +35622,17 @@ pci:v000010DEd00001F47*
  ID_MODEL_FROM_DATABASE=TU106 [GeForce RTX 2060 SUPER]
 
 pci:v000010DEd00001F50*
- ID_MODEL_FROM_DATABASE=TU106BM [GeForce RTX 2070 Mobile]
+ ID_MODEL_FROM_DATABASE=TU106BM [GeForce RTX 2070 Mobile / Max-Q]
 
 pci:v000010DEd00001F51*
  ID_MODEL_FROM_DATABASE=TU106BM [GeForce RTX 2060 Mobile]
 
+pci:v000010DEd00001F54*
+ ID_MODEL_FROM_DATABASE=TU106BM [GeForce RTX 2070 Mobile]
+
+pci:v000010DEd00001F55*
+ ID_MODEL_FROM_DATABASE=TU106BM [GeForce RTX 2060 Mobile]
+
 pci:v000010DEd00001F81*
  ID_MODEL_FROM_DATABASE=TU117
 
@@ -35528,9 +35645,18 @@ pci:v000010DEd00001F91*
 pci:v000010DEd00001F92*
  ID_MODEL_FROM_DATABASE=TU117M [GeForce GTX 1650 Mobile]
 
+pci:v000010DEd00001F94*
+ ID_MODEL_FROM_DATABASE=TU117M [GeForce GTX 1650 Mobile]
+
+pci:v000010DEd00001F95*
+ ID_MODEL_FROM_DATABASE=TU117M [GeForce GTX 1650 Ti Mobile]
+
 pci:v000010DEd00001F96*
  ID_MODEL_FROM_DATABASE=TU117M [GeForce GTX 1650 Mobile / Max-Q]
 
+pci:v000010DEd00001F99*
+ ID_MODEL_FROM_DATABASE=TU117M
+
 pci:v000010DEd00001FAE*
  ID_MODEL_FROM_DATABASE=TU117GL
 
@@ -35543,6 +35669,18 @@ pci:v000010DEd00001FB9*
 pci:v000010DEd00001FBF*
  ID_MODEL_FROM_DATABASE=TU117GL
 
+pci:v000010DEd000020B0*
+ ID_MODEL_FROM_DATABASE=GA100 [GRID A100X]
+
+pci:v000010DEd000020BE*
+ ID_MODEL_FROM_DATABASE=GA100 [GRID A100A]
+
+pci:v000010DEd000020BF*
+ ID_MODEL_FROM_DATABASE=GA100 [GRID A100B]
+
+pci:v000010DEd000020F1*
+ ID_MODEL_FROM_DATABASE=GA100 [GRID A100 PCIe 40GB]
+
 pci:v000010DEd00002182*
  ID_MODEL_FROM_DATABASE=TU116 [GeForce GTX 1660 Ti]
 
@@ -35555,9 +35693,15 @@ pci:v000010DEd00002184*
 pci:v000010DEd00002187*
  ID_MODEL_FROM_DATABASE=TU116 [GeForce GTX 1650 SUPER]
 
+pci:v000010DEd00002188*
+ ID_MODEL_FROM_DATABASE=TU116 [GeForce GTX 1650]
+
 pci:v000010DEd00002191*
  ID_MODEL_FROM_DATABASE=TU116M [GeForce GTX 1660 Ti Mobile]
 
+pci:v000010DEd00002192*
+ ID_MODEL_FROM_DATABASE=TU116M [GeForce GTX 1650 Ti Mobile]
+
 pci:v000010DEd000021AE*
  ID_MODEL_FROM_DATABASE=TU116GL
 
@@ -36224,6 +36368,9 @@ pci:v000010ECd00005250*
 pci:v000010ECd0000525A*
  ID_MODEL_FROM_DATABASE=RTS525A PCI Express Card Reader
 
+pci:v000010ECd0000525Asv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=RTS525A PCI Express Card Reader (Latitude 7275 tablet)
+
 pci:v000010ECd0000525Asv00001028sd000006DC*
  ID_MODEL_FROM_DATABASE=RTS525A PCI Express Card Reader (Latitude E7470)
 
@@ -36509,6 +36656,9 @@ pci:v000010ECd00008168sv00001028sd000006F2*
 pci:v000010ECd00008168sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Latitude 3570)
 
+pci:v000010ECd00008168sv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Vostro 3470)
+
 pci:v000010ECd00008168sv0000103Csd00001611*
  ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Pavilion DM1Z-3000)
 
@@ -36581,6 +36731,9 @@ pci:v000010ECd00008168sv00001775sd000011CC*
 pci:v000010ECd00008168sv000017AAsd00003814*
  ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Z50-75)
 
+pci:v000010ECd00008168sv000017AAsd00003823*
+ ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Lenovo V130-15IGM Laptop - Type 81HL)
+
 pci:v000010ECd00008168sv000017AAsd00005124*
  ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (ThinkPad E595)
 
@@ -37067,6 +37220,15 @@ pci:v00001102d00000002sv00001102sd00008071*
 pci:v00001102d00000003*
  ID_MODEL_FROM_DATABASE=SB AWE64(D)
 
+pci:v00001102d00000003sv00001102sd00000010*
+ ID_MODEL_FROM_DATABASE=SB AWE64(D) (CT4600 AWE64D)
+
+pci:v00001102d00000003sv00001102sd00000030*
+ ID_MODEL_FROM_DATABASE=SB AWE64(D) (CT4650 AWE64D)
+
+pci:v00001102d00000003sv00001102sd00000031*
+ ID_MODEL_FROM_DATABASE=SB AWE64(D) (CT4655 AWE64D)
+
 pci:v00001102d00000004*
  ID_MODEL_FROM_DATABASE=EMU10k2/CA0100/CA0102/CA10200 [Sound Blaster Audigy Series]
 
@@ -48128,6 +48290,12 @@ pci:v000012D8*
 pci:v000012D8d000001A7*
  ID_MODEL_FROM_DATABASE=7C21P100 2-port PCI-X to PCI-X Bridge
 
+pci:v000012D8d00000303*
+ ID_MODEL_FROM_DATABASE=PCI Express Switch 3-3
+
+pci:v000012D8d00000508*
+ ID_MODEL_FROM_DATABASE=PI7C9X20508GP PCI Express Switch 5Port-8Lane
+
 pci:v000012D8d00002304*
  ID_MODEL_FROM_DATABASE=PI7C9X2G304 EL/SL PCIe2 3-Port/4-Lane Packet Switch
 
@@ -53765,6 +53933,78 @@ pci:v0000144Dd0000A822sv00001028sd00001FFA*
 pci:v0000144Dd0000A824*
  ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X
 
+pci:v0000144Dd0000A824sv00001028sd00002040*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 1.6TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002041*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 3.2TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002042*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 6.4TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002043*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 12.8TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002044*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN MU AIC Gen4 1.6TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002045*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN MU AIC Gen4 3.2TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002046*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN MU AIC Gen4 6.4TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002070*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 1.92TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002071*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 3.84TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002072*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 7.68TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002073*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 15.36TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002074*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN RI AIC Gen4 1.92TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002075*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN RI AIC Gen4 3.84TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002076*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN RI AIC Gen4 7.68TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002090*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 1.6TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002091*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 3.2TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002092*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 6.4TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002093*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 12.8TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002094*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED MU AIC Gen4 1.6TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002095*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED MU AIC Gen4 3.2TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002096*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED MU AIC Gen4 6.4TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002097*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 1.92TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002098*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 3.84TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002099*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 7.68TB)
+
 pci:v0000144E*
  ID_VENDOR_FROM_DATABASE=OLITEC
 
@@ -58796,6 +59036,24 @@ pci:v000015B3d00000216*
 pci:v000015B3d00000217*
  ID_MODEL_FROM_DATABASE=MT2894 Family [ConnectX-6 Lx Secure Flash Recovery]
 
+pci:v000015B3d00000218*
+ ID_MODEL_FROM_DATABASE=MT2910 Family [ConnectX-7 Flash Recovery]
+
+pci:v000015B3d00000219*
+ ID_MODEL_FROM_DATABASE=MT2910 Family [ConnectX-7 Secure Flash Recovery]
+
+pci:v000015B3d0000021A*
+ ID_MODEL_FROM_DATABASE=MT43162 Family [BlueField-3 Lx SoC Flash Recovery]
+
+pci:v000015B3d0000021B*
+ ID_MODEL_FROM_DATABASE=MT43162 Family [BlueField-3 Lx Secure Flash Recovery]
+
+pci:v000015B3d0000021C*
+ ID_MODEL_FROM_DATABASE=MT43244 Family [BlueField-3 SoC Flash Recovery]
+
+pci:v000015B3d0000021D*
+ ID_MODEL_FROM_DATABASE=MT43244 Family [BlueField-3 Secure Flash Recovery]
+
 pci:v000015B3d0000024E*
  ID_MODEL_FROM_DATABASE=MT53100 [Spectrum-2, Flash recovery mode]
 
@@ -58835,12 +59093,6 @@ pci:v000015B3d00000264*
 pci:v000015B3d00000281*
  ID_MODEL_FROM_DATABASE=NPS-600 Flash Recovery
 
-pci:v000015B3d00000538*
- ID_MODEL_FROM_DATABASE=MT2910 Family [ConnectX-7 Flash Recovery]
-
-pci:v000015B3d00000539*
- ID_MODEL_FROM_DATABASE=MT2910 Family [ConnectX-7 Secure Flash Recovery]
-
 pci:v000015B3d00001002*
  ID_MODEL_FROM_DATABASE=MT25400 Family [ConnectX-2 Virtual Function]
 
@@ -59105,6 +59357,15 @@ pci:v000015B3d00001977*
 pci:v000015B3d00001978*
  ID_MODEL_FROM_DATABASE=MT42822 Family [BlueField-2 SoC PCIe Bridge]
 
+pci:v000015B3d00001979*
+ ID_MODEL_FROM_DATABASE=MT2910 Family [ConnectX-7 PCIe Bridge]
+
+pci:v000015B3d0000197A*
+ ID_MODEL_FROM_DATABASE=MT43162 Family [BlueField-3 Lx SoC PCIe Bridge]
+
+pci:v000015B3d0000197B*
+ ID_MODEL_FROM_DATABASE=MT43244 Family [BlueField-3 SoC PCIe Bridge]
+
 pci:v000015B3d00004117*
  ID_MODEL_FROM_DATABASE=MT27712A0-FDCF-AE
 
@@ -59264,12 +59525,36 @@ pci:v000015B3d0000A2D5*
 pci:v000015B3d0000A2D6*
  ID_MODEL_FROM_DATABASE=MT42822 BlueField-2 integrated ConnectX-6 Dx network controller
 
+pci:v000015B3d0000A2D7*
+ ID_MODEL_FROM_DATABASE=MT43162 BlueField-3 Lx SoC Crypto enabled
+
+pci:v000015B3d0000A2D8*
+ ID_MODEL_FROM_DATABASE=MT43162 BlueField-3 Lx SoC Crypto disabled
+
+pci:v000015B3d0000A2D9*
+ ID_MODEL_FROM_DATABASE=MT43162 BlueField-3 Lx integrated ConnectX-7 network controller
+
+pci:v000015B3d0000A2DA*
+ ID_MODEL_FROM_DATABASE=MT43244 BlueField-3 SoC Crypto enabled
+
+pci:v000015B3d0000A2DB*
+ ID_MODEL_FROM_DATABASE=MT43244 BlueField-3 SoC Crypto disabled
+
+pci:v000015B3d0000A2DC*
+ ID_MODEL_FROM_DATABASE=MT43244 BlueField-3 integrated ConnectX-7 network controller
+
 pci:v000015B3d0000C2D2*
  ID_MODEL_FROM_DATABASE=MT416842 BlueField SoC management interfac
 
 pci:v000015B3d0000C2D3*
  ID_MODEL_FROM_DATABASE=MT42822 BlueField-2 SoC Management Interface
 
+pci:v000015B3d0000C2D4*
+ ID_MODEL_FROM_DATABASE=MT43162 BlueField-3 Lx SoC Management Interface
+
+pci:v000015B3d0000C2D5*
+ ID_MODEL_FROM_DATABASE=MT43244 BlueField-3 SoC Management Interface
+
 pci:v000015B3d0000C738*
  ID_MODEL_FROM_DATABASE=MT51136
 
@@ -60263,6 +60548,9 @@ pci:v00001688*
 pci:v00001688d00001170*
  ID_MODEL_FROM_DATABASE=WLAN 802.11b card
 
+pci:v0000168A*
+ ID_VENDOR_FROM_DATABASE=Utimaco IS GmbH
+
 pci:v0000168C*
  ID_VENDOR_FROM_DATABASE=Qualcomm Atheros
 
@@ -60929,6 +61217,9 @@ pci:v0000168Cd00000034sv00001A56sd00002003*
 pci:v0000168Cd00000036*
  ID_MODEL_FROM_DATABASE=QCA9565 / AR9565 Wireless Network Adapter
 
+pci:v0000168Cd00000036sv00001028sd0000020E*
+ ID_MODEL_FROM_DATABASE=QCA9565 / AR9565 Wireless Network Adapter (Vostro 3470)
+
 pci:v0000168Cd00000037*
  ID_MODEL_FROM_DATABASE=AR9485 Wireless Network Adapter
 
@@ -61622,6 +61913,18 @@ pci:v00001760d00000122*
 pci:v00001760d00000123*
  ID_MODEL_FROM_DATABASE=PCT-7424 PCI card with standard counters
 
+pci:v00001760d00000141*
+ ID_MODEL_FROM_DATABASE=PCA7208AL - Analog Inputs/Outputs
+
+pci:v00001760d00000142*
+ ID_MODEL_FROM_DATABASE=PCA7208AS - Analog inputs/Outputs
+
+pci:v00001760d00000143*
+ ID_MODEL_FROM_DATABASE=PCA7408AL - Analog Inputs/Outputs
+
+pci:v00001760d00000144*
+ ID_MODEL_FROM_DATABASE=PCA7408AS - Analog Inputs/Outputs
+
 pci:v00001760d00000214*
  ID_MODEL_FROM_DATABASE=PCT-7424C (F0) PC card with standard counters
 
@@ -61634,9 +61937,30 @@ pci:v00001760d00000216*
 pci:v00001760d00000217*
  ID_MODEL_FROM_DATABASE=PCT-7424E (F1) PC card with standard counters
 
+pci:v00001760d00000240*
+ ID_MODEL_FROM_DATABASE=PCA7428CL_F0 - analog Inputs
+
+pci:v00001760d00000241*
+ ID_MODEL_FROM_DATABASE=PCA7428CL_F1 - analog Inputs
+
+pci:v00001760d00000242*
+ ID_MODEL_FROM_DATABASE=PCA7428CS_F0 - Analog Inputs/Outputs non isolated
+
+pci:v00001760d00000243*
+ ID_MODEL_FROM_DATABASE=PCA7428CS_F1 - Analog Inputs/Outputs non isolated
+
+pci:v00001760d00000244*
+ ID_MODEL_FROM_DATABASE=PCA7428CE_F0 - Analog Inputs isolated
+
+pci:v00001760d00000245*
+ ID_MODEL_FROM_DATABASE=PCA7428CE_F1 - Analog Inputs isolated
+
 pci:v00001760d00000303*
  ID_MODEL_FROM_DATABASE=PCD-7006C Digital Input & Output PCI Card
 
+pci:v00001760d00000800*
+ ID_MODEL_FROM_DATABASE=PCD8006 - PCIe digital Inputs/Outputs
+
 pci:v00001760d0000FF00*
  ID_MODEL_FROM_DATABASE=CTU CAN FD PCIe Card
 
@@ -62630,21 +62954,57 @@ pci:v000017F3d00001012*
 pci:v000017F3d00001031*
  ID_MODEL_FROM_DATABASE=PCI/PCI-X to PCI-E Bridge
 
+pci:v000017F3d00001070*
+ ID_MODEL_FROM_DATABASE=CAN Bus Controller
+
+pci:v000017F3d00001331*
+ ID_MODEL_FROM_DATABASE=Motion Control Interface
+
+pci:v000017F3d00001930*
+ ID_MODEL_FROM_DATABASE=Hybrid Function Control Register
+
+pci:v000017F3d00002010*
+ ID_MODEL_FROM_DATABASE=RDC M2010 VGA-compatible graphics adapter
+
 pci:v000017F3d00002012*
  ID_MODEL_FROM_DATABASE=M2012/R3308 VGA-compatible graphics adapter
 
+pci:v000017F3d00002015*
+ ID_MODEL_FROM_DATABASE=RDC M2015 VGA-compatible graphics adapter
+
+pci:v000017F3d00006011*
+ ID_MODEL_FROM_DATABASE=R6011 ISA Bridge
+
+pci:v000017F3d00006013*
+ ID_MODEL_FROM_DATABASE=R6013 ISA Bridge
+
 pci:v000017F3d00006020*
  ID_MODEL_FROM_DATABASE=R6020 North Bridge
 
 pci:v000017F3d00006021*
  ID_MODEL_FROM_DATABASE=R6021 Host Bridge
 
+pci:v000017F3d00006023*
+ ID_MODEL_FROM_DATABASE=R6023 Host Bridge
+
+pci:v000017F3d00006025*
+ ID_MODEL_FROM_DATABASE=R6025 Host Bridge
+
+pci:v000017F3d00006026*
+ ID_MODEL_FROM_DATABASE=R6026 Host Bridge
+
 pci:v000017F3d00006030*
  ID_MODEL_FROM_DATABASE=R6030 ISA Bridge
 
 pci:v000017F3d00006031*
  ID_MODEL_FROM_DATABASE=R6031 ISA Bridge
 
+pci:v000017F3d00006035*
+ ID_MODEL_FROM_DATABASE=R6035 ISA Bridge
+
+pci:v000017F3d00006036*
+ ID_MODEL_FROM_DATABASE=R6036 ISA Bridge
+
 pci:v000017F3d00006040*
  ID_MODEL_FROM_DATABASE=R6040 MAC Controller
 
@@ -64754,6 +65114,9 @@ pci:v00001987d00005007*
 pci:v00001987d00005012*
  ID_MODEL_FROM_DATABASE=E12 NVMe Controller
 
+pci:v00001987d00005013*
+ ID_MODEL_FROM_DATABASE=PS5013 E13 NVMe Controller
+
 pci:v00001987d00005016*
  ID_MODEL_FROM_DATABASE=E16 PCIe4 NVMe Controller
 
@@ -64994,9 +65357,15 @@ pci:v000019E5d00000200sv000019E5sd0000D139*
 pci:v000019E5d00000200sv000019E5sd0000D13D*
  ID_MODEL_FROM_DATABASE=Hi1822 Family (2*100GE) (Hi1822 SC371 (2*100GE))
 
+pci:v000019E5d00000200sv000019E5sd0000D147*
+ ID_MODEL_FROM_DATABASE=Hi1822 Family (2*100GE) (Hi1822 SP573 (2*100GE))
+
 pci:v000019E5d00000202*
  ID_MODEL_FROM_DATABASE=Hi1822 Family (2*32G FC)
 
+pci:v000019E5d00000202sv000019E5sd0000D149*
+ ID_MODEL_FROM_DATABASE=Hi1822 Family (2*32G FC) (Hi1822 SP528 (2*32G FC))
+
 pci:v000019E5d00000202sv000019E5sd0000D302*
  ID_MODEL_FROM_DATABASE=Hi1822 Family (2*32G FC) (Hi1822 SP521 (2*32G FC))
 
@@ -65006,6 +65375,9 @@ pci:v000019E5d00000202sv000019E5sd0000D304*
 pci:v000019E5d00000203*
  ID_MODEL_FROM_DATABASE=Hi1822 Family (2*16G FC)
 
+pci:v000019E5d00000203sv000019E5sd0000D148*
+ ID_MODEL_FROM_DATABASE=Hi1822 Family (2*16G FC) (Hi1822 SP527 (2*16G FC))
+
 pci:v000019E5d00000203sv000019E5sd0000D301*
  ID_MODEL_FROM_DATABASE=Hi1822 Family (2*16G FC) (Hi1822 SP520 (2*16G FC))
 
@@ -65027,6 +65399,9 @@ pci:v000019E5d00000206sv000019E5sd0000D138*
 pci:v000019E5d00000206sv000019E5sd0000D13A*
  ID_MODEL_FROM_DATABASE=Hi1822 Family (2*25GE) (Hi1822 SC381 (2*25GE))
 
+pci:v000019E5d00000206sv000019E5sd0000D145*
+ ID_MODEL_FROM_DATABASE=Hi1822 Family (2*25GE) (Hi1822 SP586 (2*25GE))
+
 pci:v000019E5d00000210*
  ID_MODEL_FROM_DATABASE=Hi1822 Family (4*25GE)
 
@@ -65072,6 +65447,9 @@ pci:v000019E5d00001822sv000019E5sd0000D136*
 pci:v000019E5d00001822sv000019E5sd0000D141*
  ID_MODEL_FROM_DATABASE=Hi1822 Family (4*25GE) (Hi1822 SP583 (4*25GE))
 
+pci:v000019E5d00001822sv000019E5sd0000D146*
+ ID_MODEL_FROM_DATABASE=Hi1822 Family (4*25GE) (Hi1822 SP585 (4*25GE))
+
 pci:v000019E5d0000371E*
  ID_MODEL_FROM_DATABASE=Hi1822 Family Virtual Bridge
 
@@ -65111,6 +65489,18 @@ pci:v000019E5d0000A220*
 pci:v000019E5d0000A221*
  ID_MODEL_FROM_DATABASE=HNS GE/10GE/25GE Network Controller
 
+pci:v000019E5d0000A221sv000019E5sd00000454*
+ ID_MODEL_FROM_DATABASE=HNS GE/10GE/25GE Network Controller (TM280)
+
+pci:v000019E5d0000A221sv000019E5sd000004CC*
+ ID_MODEL_FROM_DATABASE=HNS GE/10GE/25GE Network Controller (TM210)
+
+pci:v000019E5d0000A221sv000019E5sd0000D14A*
+ ID_MODEL_FROM_DATABASE=HNS GE/10GE/25GE Network Controller (TM280 4*25G)
+
+pci:v000019E5d0000A221sv000019E5sd0000D14B*
+ ID_MODEL_FROM_DATABASE=HNS GE/10GE/25GE Network Controller (TM210 4*GE)
+
 pci:v000019E5d0000A222*
  ID_MODEL_FROM_DATABASE=HNS GE/10GE/25GE RDMA Network Controller
 
@@ -65747,6 +66137,9 @@ pci:v00001AF4d00001050*
 pci:v00001AF4d00001052*
  ID_MODEL_FROM_DATABASE=Virtio input
 
+pci:v00001AF4d00001053*
+ ID_MODEL_FROM_DATABASE=Virtio socket
+
 pci:v00001AF4d00001110*
  ID_MODEL_FROM_DATABASE=Inter-VM shared memory
 
@@ -66125,6 +66518,9 @@ pci:v00001B6F*
 pci:v00001B6Fd00007023*
  ID_MODEL_FROM_DATABASE=EJ168 USB 3.0 Host Controller
 
+pci:v00001B6Fd00007023sv00001458sd00005007*
+ ID_MODEL_FROM_DATABASE=EJ168 USB 3.0 Host Controller (GA-880GMA-USB3)
+
 pci:v00001B6Fd00007052*
  ID_MODEL_FROM_DATABASE=EJ188/EJ198 USB 3.0 Host Controller
 
@@ -66383,6 +66779,9 @@ pci:v00001BD0d00001103*
 pci:v00001BD4*
  ID_VENDOR_FROM_DATABASE=Inspur Electronic Information Industry Co., Ltd.
 
+pci:v00001BD4d00000911*
+ ID_MODEL_FROM_DATABASE=Arria10_PCIe_F10A1150
+
 pci:v00001BEE*
  ID_VENDOR_FROM_DATABASE=IXXAT Automation GmbH
 
@@ -66455,6 +66854,24 @@ pci:v00001C1Cd00000001*
 pci:v00001C1F*
  ID_VENDOR_FROM_DATABASE=SoftLab-NSK
 
+pci:v00001C1Fd00000015*
+ ID_MODEL_FROM_DATABASE=FD842
+
+pci:v00001C1Fd00000019*
+ ID_MODEL_FROM_DATABASE=FD722
+
+pci:v00001C1Fd0000001A*
+ ID_MODEL_FROM_DATABASE=FD788
+
+pci:v00001C1Fd0000001B*
+ ID_MODEL_FROM_DATABASE=FD720
+
+pci:v00001C1Fd0000001C*
+ ID_MODEL_FROM_DATABASE=FD922
+
+pci:v00001C1Fd0000001D*
+ ID_MODEL_FROM_DATABASE=Vega
+
 pci:v00001C28*
  ID_VENDOR_FROM_DATABASE=Lite-On IT Corp. / Plextor
 
@@ -66539,12 +66956,24 @@ pci:v00001C2Cd0000A00E*
 pci:v00001C2Cd0000A00F*
  ID_MODEL_FROM_DATABASE=FB2CG Capture 2x40Gb [Savona]
 
+pci:v00001C2Cd0000A010*
+ ID_MODEL_FROM_DATABASE=FB2CGHH Capture 2x40Gb [Tivoli]
+
 pci:v00001C2Cd0000A011*
  ID_MODEL_FROM_DATABASE=FB2CG Capture 2x25Gb [Savona]
 
 pci:v00001C2Cd0000A012*
  ID_MODEL_FROM_DATABASE=FB2CG Capture 8x10Gb [Savona]
 
+pci:v00001C2Cd0000A013*
+ ID_MODEL_FROM_DATABASE=FB2CGHH Capture 2x25Gb [Tivoli]
+
+pci:v00001C2Cd0000A014*
+ ID_MODEL_FROM_DATABASE=FB2CGHH Capture 8x10Gb [Tivoli]
+
+pci:v00001C2Cd0000A015*
+ ID_MODEL_FROM_DATABASE=FB2CGHH Capture 2x100Gb [Tivoli]
+
 pci:v00001C32*
  ID_VENDOR_FROM_DATABASE=Highland Technology, Inc.
 
@@ -66770,6 +67199,18 @@ pci:v00001CD7d00000014*
 pci:v00001CD7d00000017*
  ID_MODEL_FROM_DATABASE=PRO CAPTURE AIO 4K
 
+pci:v00001CD7d00000051*
+ ID_MODEL_FROM_DATABASE=Eco Capture Dual HDMI M.2
+
+pci:v00001CD7d00000052*
+ ID_MODEL_FROM_DATABASE=Eco Capture HDMI 4K M.2
+
+pci:v00001CD7d00000053*
+ ID_MODEL_FROM_DATABASE=Eco Capture Dual SDI M.2
+
+pci:v00001CD7d00000054*
+ ID_MODEL_FROM_DATABASE=Eco Capture Quad SDI M.2
+
 pci:v00001CDD*
  ID_VENDOR_FROM_DATABASE=secunet Security Networks AG
 
@@ -67109,6 +67550,9 @@ pci:v00001D6A*
 pci:v00001D6Ad00000001*
  ID_MODEL_FROM_DATABASE=AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion]
 
+pci:v00001D6Ad000000B1*
+ ID_MODEL_FROM_DATABASE=AQC100 10G Ethernet MAC controller [AQtion]
+
 pci:v00001D6Ad000007B1*
  ID_MODEL_FROM_DATABASE=AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion]
 
@@ -67340,6 +67784,9 @@ pci:v00001D95d00000001*
 pci:v00001D95d00000002*
  ID_MODEL_FROM_DATABASE=Colossus GC1 [S1]
 
+pci:v00001D97*
+ ID_VENDOR_FROM_DATABASE=Shenzhen Longsys Electronics Co., Ltd.
+
 pci:v00001D9B*
  ID_VENDOR_FROM_DATABASE=Facebook, Inc.
 
@@ -67394,6 +67841,9 @@ pci:v00001DD8d00001000sv00001DD8sd00004001*
 pci:v00001DD8d00001000sv00001DD8sd00004002*
  ID_MODEL_FROM_DATABASE=DSC Capri Upstream Port (Naples 25Gb 2-port SFP28 x8 4GB)
 
+pci:v00001DD8d00001000sv00001DD8sd00004008*
+ ID_MODEL_FROM_DATABASE=DSC Capri Upstream Port (DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC)
+
 pci:v00001DD8d00001001*
  ID_MODEL_FROM_DATABASE=DSC Virtual Downstream Port
 
@@ -67406,6 +67856,9 @@ pci:v00001DD8d00001001sv00001DD8sd00004001*
 pci:v00001DD8d00001001sv00001DD8sd00004002*
  ID_MODEL_FROM_DATABASE=DSC Virtual Downstream Port (Naples 25Gb 2-port SFP28 x8 4GB)
 
+pci:v00001DD8d00001001sv00001DD8sd00004008*
+ ID_MODEL_FROM_DATABASE=DSC Virtual Downstream Port (DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC)
+
 pci:v00001DD8d00001002*
  ID_MODEL_FROM_DATABASE=DSC Ethernet Controller
 
@@ -67418,6 +67871,9 @@ pci:v00001DD8d00001002sv00001DD8sd00004001*
 pci:v00001DD8d00001002sv00001DD8sd00004002*
  ID_MODEL_FROM_DATABASE=DSC Ethernet Controller (Naples 25Gb 2-port SFP28 x8 4GB)
 
+pci:v00001DD8d00001002sv00001DD8sd00004008*
+ ID_MODEL_FROM_DATABASE=DSC Ethernet Controller (DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC)
+
 pci:v00001DD8d00001003*
  ID_MODEL_FROM_DATABASE=DSC Ethernet Controller VF
 
@@ -67430,6 +67886,9 @@ pci:v00001DD8d00001003sv00001DD8sd00004001*
 pci:v00001DD8d00001003sv00001DD8sd00004002*
  ID_MODEL_FROM_DATABASE=DSC Ethernet Controller VF (Naples 25Gb 2-port SFP28 x8 4GB)
 
+pci:v00001DD8d00001003sv00001DD8sd00004008*
+ ID_MODEL_FROM_DATABASE=DSC Ethernet Controller VF (DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC)
+
 pci:v00001DD8d00001004*
  ID_MODEL_FROM_DATABASE=DSC Management Controller
 
@@ -67442,6 +67901,9 @@ pci:v00001DD8d00001004sv00001DD8sd00004001*
 pci:v00001DD8d00001004sv00001DD8sd00004002*
  ID_MODEL_FROM_DATABASE=DSC Management Controller (Naples 25Gb 2-port SFP28 x8 4GB)
 
+pci:v00001DD8d00001004sv00001DD8sd00004008*
+ ID_MODEL_FROM_DATABASE=DSC Management Controller (DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC)
+
 pci:v00001DD8d00001007*
  ID_MODEL_FROM_DATABASE=DSC Storage Accelerator
 
@@ -67454,6 +67916,9 @@ pci:v00001DD8d00001007sv00001DD8sd00004001*
 pci:v00001DD8d00001007sv00001DD8sd00004002*
  ID_MODEL_FROM_DATABASE=DSC Storage Accelerator (Naples 25Gb 2-port SFP28 x8 4GB)
 
+pci:v00001DD8d00001007sv00001DD8sd00004008*
+ ID_MODEL_FROM_DATABASE=DSC Storage Accelerator (DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC)
+
 pci:v00001DE0*
  ID_VENDOR_FROM_DATABASE=Groq
 
@@ -67580,6 +68045,12 @@ pci:v00001DFC*
 pci:v00001DFCd00001181*
  ID_MODEL_FROM_DATABASE=TDM 8 Port E1/T1/J1 Adapter
 
+pci:v00001E0F*
+ ID_VENDOR_FROM_DATABASE=KIOXIA Corporation
+
+pci:v00001E0Fd00000007*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller Cx6
+
 pci:v00001E17*
  ID_VENDOR_FROM_DATABASE=Arnold & Richter Cine Technik GmbH & Co. Betriebs KG
 
@@ -67646,6 +68117,9 @@ pci:v00001E57d00000100sv00000000sd00000100*
 pci:v00001E6B*
  ID_VENDOR_FROM_DATABASE=Axiado Corp.
 
+pci:v00001E85*
+ ID_VENDOR_FROM_DATABASE=Heitec AG
+
 pci:v00001E89*
  ID_VENDOR_FROM_DATABASE=ID Quantique SA
 
@@ -67658,6 +68132,9 @@ pci:v00001E89d00000003*
 pci:v00001E94*
  ID_VENDOR_FROM_DATABASE=Calian SED
 
+pci:v00001E95*
+ ID_VENDOR_FROM_DATABASE=Solid State Storage Technology Corporation
+
 pci:v00001FC0*
  ID_VENDOR_FROM_DATABASE=Ascom (Finland) Oy
 
@@ -70370,6 +70847,9 @@ pci:v00008086d000002E0*
 pci:v00008086d000002E8*
  ID_MODEL_FROM_DATABASE=Serial IO I2C Host Controller
 
+pci:v00008086d000002E9*
+ ID_MODEL_FROM_DATABASE=Comet Lake Serial IO I2C Host Controller
+
 pci:v00008086d000002F0*
  ID_MODEL_FROM_DATABASE=Wireless-AC 9462
 
@@ -70601,6 +71081,69 @@ pci:v00008086d00000600sv00008086sd000001F7*
 pci:v00008086d0000061F*
  ID_MODEL_FROM_DATABASE=80303 I/O Processor
 
+pci:v00008086d0000068D*
+ ID_MODEL_FROM_DATABASE=Comet Lake LPC Controller
+
+pci:v00008086d000006A3*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH SMBus Controller
+
+pci:v00008086d000006A4*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH SPI Controller
+
+pci:v00008086d000006A8*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH Serial IO UART Host Controller #0
+
+pci:v00008086d000006A9*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH Serial IO UART Host Controller #1
+
+pci:v00008086d000006AA*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH Serial IO SPI Controller #0
+
+pci:v00008086d000006AB*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH Serial IO SPI Controller #1
+
+pci:v00008086d000006AC*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCI Express Root Port #21
+
+pci:v00008086d000006B0*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCI Express Root Port #9
+
+pci:v00008086d000006C0*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCI Express Root Port #17
+
+pci:v00008086d000006C8*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH cAVS
+
+pci:v00008086d000006E0*
+ ID_MODEL_FROM_DATABASE=Comet Lake HECI Controller
+
+pci:v00008086d000006E8*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH Serial IO I2C Controller #0
+
+pci:v00008086d000006E9*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH Serial IO I2C Controller #1
+
+pci:v00008086d000006EA*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH Serial IO I2C Controller #2
+
+pci:v00008086d000006EB*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH Serial IO I2C Controller #3
+
+pci:v00008086d000006ED*
+ ID_MODEL_FROM_DATABASE=Comet Lake USB 3.1 xHCI Host Controller
+
+pci:v00008086d000006EF*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH Shared SRAM
+
+pci:v00008086d000006F0*
+ ID_MODEL_FROM_DATABASE=Wi-Fi 6 AX201
+
+pci:v00008086d000006F9*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH Thermal Controller
+
+pci:v00008086d000006FB*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCH Serial IO SPI Controller #2
+
 pci:v00008086d00000700*
  ID_MODEL_FROM_DATABASE=CE Media Processor A/V Bridge
 
@@ -71606,6 +72149,45 @@ pci:v00008086d00000A55sv00001028sd00001FE8*
 pci:v00008086d00000A55sv00001028sd00001FE9*
  ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (Express Flash NVMe 4.0TB HHHL AIC (P4600))
 
+pci:v00008086d00000B60*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller]
+
+pci:v00008086d00000B60sv00001028sd00002060*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe SED MU U.2 1.6TB (P5600))
+
+pci:v00008086d00000B60sv00001028sd00002061*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe SED MU U.2 3.2TB (P5600))
+
+pci:v00008086d00000B60sv00001028sd00002062*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe SED MU U.2 6.4TB (P5600))
+
+pci:v00008086d00000B60sv00001028sd00002064*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe SED RI U.2 1.92TB (P5500))
+
+pci:v00008086d00000B60sv00001028sd00002065*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe SED RI U.2 3.84TB (P5500))
+
+pci:v00008086d00000B60sv00001028sd00002066*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe SED RI U.2 7.68TB (P5500))
+
+pci:v00008086d00000B60sv00001028sd0000209E*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe MU U.2 1.6TB (P5600))
+
+pci:v00008086d00000B60sv00001028sd0000209F*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe MU U.2 3.2TB (P5600))
+
+pci:v00008086d00000B60sv00001028sd00002100*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe MU U.2 6.4TB (P5600))
+
+pci:v00008086d00000B60sv00001028sd00002102*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe RI U.2 1.92TB (P5500))
+
+pci:v00008086d00000B60sv00001028sd00002103*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe RI U.2 3.84TB (P5500))
+
+pci:v00008086d00000B60sv00001028sd00002104*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Beta Rock Controller] (NVMe RI U.2 7.68TB (P5500))
+
 pci:v00008086d00000BE0*
  ID_MODEL_FROM_DATABASE=Atom Processor D2xxx/N2xxx Integrated Graphics Controller
 
@@ -71891,6 +72473,9 @@ pci:v00008086d00000D58sv00008086sd00000000*
 pci:v00008086d00000D58sv00008086sd00000001*
  ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
 
+pci:v00008086d00000D9F*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller (2) I225-IT
+
 pci:v00008086d00000E00*
  ID_MODEL_FROM_DATABASE=Xeon E7 v2/Xeon E5 v2/Core i7 DMI2
 
@@ -75434,6 +76019,9 @@ pci:v00008086d00001572sv000017AAsd00004002*
 pci:v00008086d00001572sv000019E5sd0000D11C*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet 2-port X710 10Gb SFP+ Adapter SP330)
 
+pci:v00008086d00001572sv00001BD4sd00000056*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Network Adapter X710-BM2 for OCP NIC 3.0)
+
 pci:v00008086d00001572sv00008086sd00000000*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Converged Network Adapter X710)
 
@@ -75779,6 +76367,9 @@ pci:v00008086d0000158Bsv00008086sd00000009*
 pci:v00008086d0000158Bsv00008086sd0000000A*
  ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet 25G 2P XXV710 OCP)
 
+pci:v00008086d0000158Bsv00008086sd0000000C*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter XXV710-DA2 for OCP 3.0)
+
 pci:v00008086d0000158Bsv00008086sd00004001*
  ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter XXV710-2)
 
@@ -75788,6 +76379,9 @@ pci:v00008086d00001591*
 pci:v00008086d00001592*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for QSFP
 
+pci:v00008086d00001592sv00001137sd000002BF*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for QSFP (E810CQDA2 2x100 GbE QSFP28 PCIe NIC)
+
 pci:v00008086d00001592sv00008086sd00000002*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for QSFP (Ethernet Network Adapter E810-C-Q2)
 
@@ -75803,9 +76397,15 @@ pci:v00008086d00001592sv00008086sd00000006*
 pci:v00008086d00001592sv00008086sd00000009*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for QSFP (Ethernet Network Adapter E810-C-Q1)
 
+pci:v00008086d00001592sv00008086sd0000000A*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for QSFP (Ethernet Network Adapter E810-C-Q1 for OCP)
+
 pci:v00008086d00001593*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for SFP
 
+pci:v00008086d00001593sv00001137sd000002C3*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for SFP (E810XXVDA4 4x25/10 GbE SFP28 PCIe NIC)
+
 pci:v00008086d00001593sv00008086sd00000002*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for SFP (Ethernet Network Adapter E810-L-2)
 
@@ -75824,6 +76424,42 @@ pci:v00008086d00001593sv00008086sd00000008*
 pci:v00008086d00001593sv00008086sd00000009*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for SFP (Ethernet Network Adapter E810-XXV-2 for OCP 2.0)
 
+pci:v00008086d00001599*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for backplane
+
+pci:v00008086d0000159A*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for QSFP
+
+pci:v00008086d0000159B*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for SFP
+
+pci:v00008086d0000159Bsv00001137sd000002BE*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for SFP (E810XXVDA2 2x25/10 GbE SFP28 PCIe NIC)
+
+pci:v00008086d0000159Bsv00001BD4sd00000057*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for SFP (Ethernet Network Adapter E810-XXVAM2)
+
+pci:v00008086d0000159Bsv00001BD4sd00000058*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for SFP (Ethernet Network Adapter E810-XXVAM2 for OCP 3.0)
+
+pci:v00008086d0000159Bsv00008086sd00000001*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for SFP (Ethernet 25G 2P E810-XXV OCP)
+
+pci:v00008086d0000159Bsv00008086sd00000002*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for SFP (Ethernet 25G 2P E810-XXV Adapter)
+
+pci:v00008086d0000159Bsv00008086sd00000003*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for SFP (Ethernet Network Adapter E810-XXV-2)
+
+pci:v00008086d0000159Bsv00008086sd00000005*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for SFP (Ethernet Network Adapter E810-XXV-2 for OCP 3.0)
+
+pci:v00008086d0000159Bsv00008086sd00004001*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for SFP (Ethernet Network Adapter E810-XXV-2)
+
+pci:v00008086d0000159Bsv00008086sd00004002*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-XXV for SFP (Ethernet Network Adapter E810-XXV-2 for OCP 3.0)
+
 pci:v00008086d000015A0*
  ID_MODEL_FROM_DATABASE=Ethernet Connection (2) I218-LM
 
@@ -76052,6 +76688,12 @@ pci:v00008086d000015EF*
 pci:v00008086d000015F0*
  ID_MODEL_FROM_DATABASE=JHL7540 Thunderbolt 3 USB Controller [Titan Ridge DD 2018]
 
+pci:v00008086d000015F2*
+ ID_MODEL_FROM_DATABASE=Intel(R) Ethernet Controller I225-LM
+
+pci:v00008086d000015F3*
+ ID_MODEL_FROM_DATABASE=Intel(R) Ethernet Controller I225-V
+
 pci:v00008086d000015F4*
  ID_MODEL_FROM_DATABASE=Ethernet Connection (15) I219-LM
 
@@ -76262,6 +76904,9 @@ pci:v00008086d00001902*
 pci:v00008086d00001903*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem
 
+pci:v00008086d00001903sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem (Latitude 7275 tablet)
+
 pci:v00008086d00001903sv00001028sd000006DC*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem (Latitude E7470)
 
@@ -76307,6 +76952,9 @@ pci:v00008086d00001909*
 pci:v00008086d0000190C*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers
 
+pci:v00008086d0000190Csv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers (Latitude 7275 tablet)
+
 pci:v00008086d0000190F*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers
 
@@ -76322,6 +76970,9 @@ pci:v00008086d00001910sv0000103Csd0000825B*
 pci:v00008086d00001911*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model
 
+pci:v00008086d00001911sv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model (Vostro 3470)
+
 pci:v00008086d00001911sv000017AAsd00002247*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model (ThinkPad T570)
 
@@ -76352,6 +77003,9 @@ pci:v00008086d00001918*
 pci:v00008086d00001919*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Imaging Unit
 
+pci:v00008086d00001919sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Imaging Unit (Latitude 7275 tablet)
+
 pci:v00008086d0000191B*
  ID_MODEL_FROM_DATABASE=HD Graphics 530
 
@@ -76367,6 +77021,9 @@ pci:v00008086d0000191D*
 pci:v00008086d0000191E*
  ID_MODEL_FROM_DATABASE=HD Graphics 515
 
+pci:v00008086d0000191Esv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=HD Graphics 515 (Latitude 7275 tablet)
+
 pci:v00008086d0000191F*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers
 
@@ -86279,6 +86936,9 @@ pci:v00008086d00003165sv00008086sd00004210*
 pci:v00008086d00003166*
  ID_MODEL_FROM_DATABASE=Dual Band Wireless-AC 3165 Plus Bluetooth
 
+pci:v00008086d00003166sv00008086sd00004210*
+ ID_MODEL_FROM_DATABASE=Dual Band Wireless-AC 3165 Plus Bluetooth (Dual Band Wireless-AC 3165)
+
 pci:v00008086d00003184*
  ID_MODEL_FROM_DATABASE=UHD Graphics 605
 
@@ -86297,6 +86957,12 @@ pci:v00008086d00003192*
 pci:v00008086d00003197*
  ID_MODEL_FROM_DATABASE=Celeron/Pentium Silver Processor PCI-default ISA-bridge
 
+pci:v00008086d00003198*
+ ID_MODEL_FROM_DATABASE=Celeron/Pentium Silver Processor High Definition Audio
+
+pci:v00008086d00003198sv000017AAsd0000380B*
+ ID_MODEL_FROM_DATABASE=Celeron/Pentium Silver Processor High Definition Audio (V130-15IGM Laptop (Lenovo) - Type 81HL)
+
 pci:v00008086d0000319A*
  ID_MODEL_FROM_DATABASE=Celeron/Pentium Silver Processor Trusted Execution Engine Interface
 
@@ -88481,6 +89147,9 @@ pci:v00008086d00003E91*
 pci:v00008086d00003E92*
  ID_MODEL_FROM_DATABASE=UHD Graphics 630 (Desktop)
 
+pci:v00008086d00003E92sv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=UHD Graphics 630 (Desktop) (Vostro 3470)
+
 pci:v00008086d00003E93*
  ID_MODEL_FROM_DATABASE=UHD Graphics 610
 
@@ -88505,6 +89174,9 @@ pci:v00008086d00003EA5*
 pci:v00008086d00003EC2*
  ID_MODEL_FROM_DATABASE=8th Gen Core Processor Host Bridge/DRAM Registers
 
+pci:v00008086d00003EC2sv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=8th Gen Core Processor Host Bridge/DRAM Registers (Vostro 3470)
+
 pci:v00008086d00003EC2sv00001043sd00008694*
  ID_MODEL_FROM_DATABASE=8th Gen Core Processor Host Bridge/DRAM Registers (PRIME H310M-D)
 
@@ -89048,6 +89720,9 @@ pci:v00008086d00005201sv00008086sd00000001*
 pci:v00008086d0000530D*
  ID_MODEL_FROM_DATABASE=80310 (IOP) IO Processor
 
+pci:v00008086d00005502*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller (2) I225-LMvP
+
 pci:v00008086d00005845*
  ID_MODEL_FROM_DATABASE=QEMU NVM Express Controller
 
@@ -90341,9 +91016,21 @@ pci:v00008086d00008A21*
 pci:v00008086d00008A23*
  ID_MODEL_FROM_DATABASE=Ice Lake Thunderbolt 3 PCI Express Root Port #3
 
+pci:v00008086d00008A51*
+ ID_MODEL_FROM_DATABASE=Intel Iris Plus Graphics G7 (Ice Lake)
+
 pci:v00008086d00008A52*
  ID_MODEL_FROM_DATABASE=Iris Plus Graphics G7
 
+pci:v00008086d00008A56*
+ ID_MODEL_FROM_DATABASE=Iris Plus Graphics G1 (Ice Lake)
+
+pci:v00008086d00008A5A*
+ ID_MODEL_FROM_DATABASE=Iris Plus Graphics G4 (Ice Lake)
+
+pci:v00008086d00008A5C*
+ ID_MODEL_FROM_DATABASE=Intel Iris Plus Graphics G4 (Ice Lake)
+
 pci:v00008086d00008C00*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family 4-port SATA Controller 1 [IDE mode]
 
@@ -90392,6 +91079,9 @@ pci:v00008086d00008C0F*
 pci:v00008086d00008C10*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family PCI Express Root Port #1
 
+pci:v00008086d00008C10sv00001043sd00008534*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family PCI Express Root Port #1 (ASUS H81I-PLUS)
+
 pci:v00008086d00008C10sv000017AAsd0000220E*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family PCI Express Root Port #1 (ThinkPad T440p)
 
@@ -90995,12 +91685,57 @@ pci:v00008086d00009641*
 pci:v00008086d000096A1*
  ID_MODEL_FROM_DATABASE=Integrated RAID
 
+pci:v00008086d00009A09*
+ ID_MODEL_FROM_DATABASE=11th Gen Core Processor PCIe Controller
+
 pci:v00008086d00009A0B*
  ID_MODEL_FROM_DATABASE=Volume Management Device NVMe RAID Controller
 
+pci:v00008086d00009A13*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt USB Controller
+
+pci:v00008086d00009A14*
+ ID_MODEL_FROM_DATABASE=11th Gen Core Processor Host Bridge/DRAM Registers
+
+pci:v00008086d00009A1B*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt NHI #0
+
+pci:v00008086d00009A1D*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt NHI #1
+
+pci:v00008086d00009A23*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt PCI Express Root Port #0
+
+pci:v00008086d00009A25*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt PCI Express Root Port #1
+
+pci:v00008086d00009A27*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt PCI Express Root Port #2
+
+pci:v00008086d00009A29*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt PCI Express Root Port #3
+
+pci:v00008086d00009A33*
+ ID_MODEL_FROM_DATABASE=Tiger Lake Trace Hub
+
+pci:v00008086d00009A49*
+ ID_MODEL_FROM_DATABASE=UHD Graphics
+
 pci:v00008086d00009B41*
  ID_MODEL_FROM_DATABASE=UHD Graphics
 
+pci:v00008086d00009B44*
+ ID_MODEL_FROM_DATABASE=10th Gen Core Processor Host Bridge/DRAM Registers
+
+pci:v00008086d00009B54*
+ ID_MODEL_FROM_DATABASE=10th Gen Core Processor Host Bridge/DRAM Registers
+
+pci:v00008086d00009B64*
+ ID_MODEL_FROM_DATABASE=10th Gen Core Processor Host Bridge/DRAM Registers
+
+pci:v00008086d00009BC4*
+ ID_MODEL_FROM_DATABASE=UHD Graphics
+
 pci:v00008086d00009C00*
  ID_MODEL_FROM_DATABASE=8 Series SATA Controller 1 [IDE mode]
 
@@ -91385,6 +92120,9 @@ pci:v00008086d00009D21*
 pci:v00008086d00009D21sv00001025sd0000115F*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (Acer Aspire E5-575G)
 
+pci:v00008086d00009D21sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (Latitude 7275 tablet)
+
 pci:v00008086d00009D21sv00001028sd000006DC*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (Latitude E7470)
 
@@ -91409,6 +92147,9 @@ pci:v00008086d00009D23*
 pci:v00008086d00009D23sv00001025sd0000115F*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (Acer Aspire E5-575G)
 
+pci:v00008086d00009D23sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (Latitude 7275 tablet)
+
 pci:v00008086d00009D23sv00001028sd000006DC*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (Latitude E7470)
 
@@ -91451,6 +92192,9 @@ pci:v00008086d00009D2F*
 pci:v00008086d00009D2Fsv00001025sd0000115F*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP USB 3.0 xHCI Controller (Acer Aspire E5-575G)
 
+pci:v00008086d00009D2Fsv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP USB 3.0 xHCI Controller (Latitude 7275 tablet)
+
 pci:v00008086d00009D2Fsv00001028sd000006DC*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP USB 3.0 xHCI Controller (Latitude E7470)
 
@@ -91475,6 +92219,9 @@ pci:v00008086d00009D31*
 pci:v00008086d00009D31sv00001025sd0000115F*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (Acer Aspire E5-575G)
 
+pci:v00008086d00009D31sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (Latitude 7275 tablet)
+
 pci:v00008086d00009D31sv00001028sd000006DC*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (Latitude E7470)
 
@@ -91496,15 +92243,27 @@ pci:v00008086d00009D31sv000017AAsd0000225D*
 pci:v00008086d00009D31sv000017AAsd0000382A*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (B51-80 Laptop)
 
+pci:v00008086d00009D32*
+ ID_MODEL_FROM_DATABASE=CSI-2 Host Controller
+
+pci:v00008086d00009D32sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=CSI-2 Host Controller (Latitude 7275 tablet)
+
 pci:v00008086d00009D35*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Integrated Sensor Hub
 
+pci:v00008086d00009D35sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP Integrated Sensor Hub (Latitude 7275 tablet)
+
 pci:v00008086d00009D3A*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1
 
 pci:v00008086d00009D3Asv00001025sd0000115F*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (Acer Aspire E5-575G)
 
+pci:v00008086d00009D3Asv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (Latitude 7275 tablet)
+
 pci:v00008086d00009D3Asv00001028sd000006DC*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (Latitude E7470)
 
@@ -91538,6 +92297,12 @@ pci:v00008086d00009D43*
 pci:v00008086d00009D43sv000017AAsd0000382A*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP LPC Controller (B51-80 Laptop)
 
+pci:v00008086d00009D46*
+ ID_MODEL_FROM_DATABASE=LPC/eSPI Controller
+
+pci:v00008086d00009D46sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=LPC/eSPI Controller (Latitude 7275 tablet)
+
 pci:v00008086d00009D48*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP LPC Controller
 
@@ -91580,6 +92345,9 @@ pci:v00008086d00009D60*
 pci:v00008086d00009D60sv00001025sd0000115F*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Serial IO I2C Controller #0 (Acer Aspire E5-575G)
 
+pci:v00008086d00009D60sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP Serial IO I2C Controller #0 (Latitude 7275 tablet)
+
 pci:v00008086d00009D60sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Serial IO I2C Controller #0 (Latitude 3570)
 
@@ -91595,9 +92363,15 @@ pci:v00008086d00009D60sv00008086sd00009D60*
 pci:v00008086d00009D61*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Serial IO I2C Controller #1
 
+pci:v00008086d00009D61sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP Serial IO I2C Controller #1 (Latitude 7275 tablet)
+
 pci:v00008086d00009D62*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Serial IO I2C Controller #2
 
+pci:v00008086d00009D62sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP Serial IO I2C Controller #2 (Latitude 7275 tablet)
+
 pci:v00008086d00009D63*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Serial IO I2C Controller #3
 
@@ -91613,6 +92387,9 @@ pci:v00008086d00009D66*
 pci:v00008086d00009D70*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP HD Audio
 
+pci:v00008086d00009D70sv00001028sd000006D6*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP HD Audio (Latitude 7275 tablet)
+
 pci:v00008086d00009D70sv00001028sd000006DC*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP HD Audio (Latitude E7470)
 
@@ -91649,6 +92426,12 @@ pci:v00008086d00009DA3*
 pci:v00008086d00009DA4*
  ID_MODEL_FROM_DATABASE=Cannon Point-LP SPI Controller
 
+pci:v00008086d00009DA8*
+ ID_MODEL_FROM_DATABASE=Cannon Point-LP Serial IO UART Controller #2
+
+pci:v00008086d00009DAA*
+ ID_MODEL_FROM_DATABASE=Cannon Point-LP Serial IO SPI Controller
+
 pci:v00008086d00009DB0*
  ID_MODEL_FROM_DATABASE=Cannon Point-LP PCI Express Root Port #9
 
@@ -91787,6 +92570,69 @@ pci:v00008086d0000A012sv0000144Dsd0000C072*
 pci:v00008086d0000A013*
  ID_MODEL_FROM_DATABASE=Atom Processor D4xx/D5xx/N4xx/N5xx CHAPS counter
 
+pci:v00008086d0000A082*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP LPC Controller
+
+pci:v00008086d0000A0A3*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP SMBus Controller
+
+pci:v00008086d0000A0A4*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP SPI Controller
+
+pci:v00008086d0000A0A6*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Trace Hub
+
+pci:v00008086d0000A0A8*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Serial IO UART Controller #0
+
+pci:v00008086d0000A0A9*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Serial IO UART Controller #1
+
+pci:v00008086d0000A0AB*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Serial IO SPI Controller #1
+
+pci:v00008086d0000A0B0*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP PCI Express Root Port #9
+
+pci:v00008086d0000A0BF*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP PCI Express Root Port #8
+
+pci:v00008086d0000A0C5*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Serial IO I2C Controller #4
+
+pci:v00008086d0000A0C6*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Serial IO I2C Controller #5
+
+pci:v00008086d0000A0C8*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Smart Sound Technology Audio Controller
+
+pci:v00008086d0000A0E0*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Management Engine Interface
+
+pci:v00008086d0000A0E8*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Serial IO I2C Controller #0
+
+pci:v00008086d0000A0E9*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Serial IO I2C Controller #1
+
+pci:v00008086d0000A0EA*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Serial IO I2C Controller #2
+
+pci:v00008086d0000A0EB*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Serial IO I2C Controller #3
+
+pci:v00008086d0000A0ED*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP USB 3.2 Gen 2x1 xHCI Host Controller
+
+pci:v00008086d0000A0EF*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Shared SRAM
+
+pci:v00008086d0000A0F0*
+ ID_MODEL_FROM_DATABASE=Wi-Fi 6 AX201
+
+pci:v00008086d0000A0FC*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-LP Integrated Sensor Hub
+
 pci:v00008086d0000A102*
  ID_MODEL_FROM_DATABASE=Q170/Q150/B150/H170/H110/Z170/CM236 Chipset SATA Controller [AHCI Mode]
 
@@ -92471,6 +93317,9 @@ pci:v00008086d0000A2F0*
 pci:v00008086d0000A304*
  ID_MODEL_FROM_DATABASE=H370 Chipset LPC/eSPI Controller
 
+pci:v00008086d0000A304sv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=H370 Chipset LPC/eSPI Controller (Vostro 3470)
+
 pci:v00008086d0000A305*
  ID_MODEL_FROM_DATABASE=Z390 Chipset LPC/eSPI Controller
 
@@ -92483,12 +93332,24 @@ pci:v00008086d0000A309*
 pci:v00008086d0000A30C*
  ID_MODEL_FROM_DATABASE=QM370 Chipset LPC/eSPI Controller
 
+pci:v00008086d0000A30D*
+ ID_MODEL_FROM_DATABASE=HM470 Chipset LPC/eSPI Controller
+
+pci:v00008086d0000A30E*
+ ID_MODEL_FROM_DATABASE=Cannon Lake LPC Controller
+
 pci:v00008086d0000A323*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH SMBus Controller
 
+pci:v00008086d0000A323sv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=Cannon Lake PCH SMBus Controller (Vostro 3470)
+
 pci:v00008086d0000A324*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH SPI Controller
 
+pci:v00008086d0000A324sv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=Cannon Lake PCH SPI Controller (Vostro 3470)
+
 pci:v00008086d0000A328*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH Serial IO UART Host Controller
 
@@ -92567,15 +93428,24 @@ pci:v00008086d0000A343*
 pci:v00008086d0000A348*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH cAVS
 
+pci:v00008086d0000A348sv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=Cannon Lake PCH cAVS (Vostro 3470)
+
 pci:v00008086d0000A352*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH SATA AHCI Controller
 
+pci:v00008086d0000A352sv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=Cannon Lake PCH SATA AHCI Controller (Vostro 3470)
+
 pci:v00008086d0000A353*
  ID_MODEL_FROM_DATABASE=Cannon Lake Mobile PCH SATA AHCI Controller
 
 pci:v00008086d0000A360*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH HECI Controller
 
+pci:v00008086d0000A360sv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=Cannon Lake PCH HECI Controller (Vostro 3470)
+
 pci:v00008086d0000A363*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH Active Management Technology - SOL
 
@@ -92597,6 +93467,9 @@ pci:v00008086d0000A36B*
 pci:v00008086d0000A36D*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH USB 3.1 xHCI Host Controller
 
+pci:v00008086d0000A36Dsv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=Cannon Lake PCH USB 3.1 xHCI Host Controller (Vostro 3470)
+
 pci:v00008086d0000A36F*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH Shared SRAM
 
@@ -92606,6 +93479,9 @@ pci:v00008086d0000A370*
 pci:v00008086d0000A379*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH Thermal Controller
 
+pci:v00008086d0000A379sv00001028sd00000869*
+ ID_MODEL_FROM_DATABASE=Cannon Lake PCH Thermal Controller (Vostro 3470)
+
 pci:v00008086d0000A620*
  ID_MODEL_FROM_DATABASE=6400/6402 Advanced Memory Buffer (AMB)
 
@@ -94301,6 +95177,27 @@ pci:v00009902d00000002*
 pci:v00009902d00000003*
  ID_MODEL_FROM_DATABASE=SG1010 Starfabric Switch and PCI Bridge
 
+pci:v00009D32*
+ ID_VENDOR_FROM_DATABASE=Beijing Starblaze Technology Co. Ltd.
+
+pci:v00009D32d00000000*
+ ID_MODEL_FROM_DATABASE=STAR1000 PCIe NVMe SSD Controller
+
+pci:v00009D32d00001001*
+ ID_MODEL_FROM_DATABASE=STAR1000P PCIe NVMe SSD Controller
+
+pci:v00009D32d00001201*
+ ID_MODEL_FROM_DATABASE=STAR1200C NVMe SSD
+
+pci:v00009D32d00001202*
+ ID_MODEL_FROM_DATABASE=STAR1200I NVMe SSD
+
+pci:v00009D32d00001203*
+ ID_MODEL_FROM_DATABASE=STAR1200L NVMe SSD
+
+pci:v00009D32d00001204*
+ ID_MODEL_FROM_DATABASE=STAR1200E NVMe SSD
+
 pci:v0000A0A0*
  ID_VENDOR_FROM_DATABASE=AOPEN Inc.
 
index 38de451b51f27ad3f00ef16dc8389577dd5f9b87..74d0609aa06170870a09be993e49a63ae6652e96 100644 (file)
@@ -11,6 +11,9 @@ usb:v0001p7778*
 usb:v0002*
  ID_VENDOR_FROM_DATABASE=Ingram
 
+usb:v0002p0002*
+ ID_MODEL_FROM_DATABASE=passport00
+
 usb:v0003*
  ID_VENDOR_FROM_DATABASE=Club Mac
 
@@ -57,10 +60,10 @@ usb:v0079p1844*
  ID_MODEL_FROM_DATABASE=Mayflash GameCube Controller
 
 usb:v0080*
- ID_VENDOR_FROM_DATABASE=Assmann Electronic GmbH
+ ID_VENDOR_FROM_DATABASE=Unknown
 
 usb:v0080pA001*
- ID_MODEL_FROM_DATABASE=Digitus DA-71114 SATA
+ ID_MODEL_FROM_DATABASE=JMS578 based SATA bridge
 
 usb:v0085*
  ID_VENDOR_FROM_DATABASE=Boeye Technology Co., Ltd.
@@ -1187,6 +1190,9 @@ usb:v03F0p241D*
 usb:v03F0p2424*
  ID_MODEL_FROM_DATABASE=LP1965 19" Monitor Hub
 
+usb:v03F0p2441*
+ ID_MODEL_FROM_DATABASE=Prime G2 [2AP18AA]
+
 usb:v03F0p2502*
  ID_MODEL_FROM_DATABASE=PhotoSmart 7700 series
 
@@ -1391,6 +1397,9 @@ usb:v03F0p3511*
 usb:v03F0p3517*
  ID_MODEL_FROM_DATABASE=LaserJet 3390
 
+usb:v03F0p354A*
+ ID_MODEL_FROM_DATABASE=Slim Keyboard
+
 usb:v03F0p3602*
  ID_MODEL_FROM_DATABASE=PhotoSmart 1315
 
@@ -1490,6 +1499,9 @@ usb:v03F0p3F02*
 usb:v03F0p3F11*
  ID_MODEL_FROM_DATABASE=PSC-1315/PSC-1317
 
+usb:v03F0p3F17*
+ ID_MODEL_FROM_DATABASE=Laserjet P1505
+
 usb:v03F0p4002*
  ID_MODEL_FROM_DATABASE=PhotoSmart 635/715/720/735/935/E337 (storage)
 
@@ -1853,6 +1865,9 @@ usb:v03F0p7A02*
 usb:v03F0p7A04*
  ID_MODEL_FROM_DATABASE=DeskJet D2460
 
+usb:v03F0p7A11*
+ ID_MODEL_FROM_DATABASE=Photosmart B109
+
 usb:v03F0p7A17*
  ID_MODEL_FROM_DATABASE=LaserJet M3027 MFP
 
@@ -2315,6 +2330,9 @@ usb:v0403p6014*
 usb:v0403p6015*
  ID_MODEL_FROM_DATABASE=Bridge(I2C/SPI/UART/FIFO)
 
+usb:v0403p601F*
+ ID_MODEL_FROM_DATABASE=Myriad-RF LimeSDR-Mini
+
 usb:v0403p6F70*
  ID_MODEL_FROM_DATABASE=HB-RF-USB
 
@@ -2849,6 +2867,9 @@ usb:v0408p3000*
 usb:v0408p3001*
  ID_MODEL_FROM_DATABASE=Optical Touch Screen
 
+usb:v0408p3008*
+ ID_MODEL_FROM_DATABASE=Optical Touch Screen
+
 usb:v0408pA060*
  ID_MODEL_FROM_DATABASE=HD Webcam
 
@@ -3830,6 +3851,30 @@ usb:v0416p3813*
 usb:v0416p5011*
  ID_MODEL_FROM_DATABASE=Virtual Com Port
 
+usb:v0416p511B*
+ ID_MODEL_FROM_DATABASE=Nuvoton Nu-Link1 ICE
+
+usb:v0416p511C*
+ ID_MODEL_FROM_DATABASE=Nuvoton Nu-Link1 ICE
+
+usb:v0416p511D*
+ ID_MODEL_FROM_DATABASE=Nuvoton Nu-Link1 ICE/VCOM
+
+usb:v0416p511E*
+ ID_MODEL_FROM_DATABASE=Nuvoton Nu-Link1 MSC/VCOM
+
+usb:v0416p5200*
+ ID_MODEL_FROM_DATABASE=Nuvoton Nu-Link2-ME ICE/MSC/VCOM
+
+usb:v0416p5201*
+ ID_MODEL_FROM_DATABASE=Nuvoton Nu-Link2-Pro ICE/MSC/VCOM
+
+usb:v0416p5210*
+ ID_MODEL_FROM_DATABASE=Nuvoton Nu-Link2 MSC FW UPGRADE
+
+usb:v0416p5211*
+ ID_MODEL_FROM_DATABASE=Nuvoton Nu-Link2 HID FW UPGRADE
+
 usb:v0416p5518*
  ID_MODEL_FROM_DATABASE=4-Port Hub
 
@@ -4889,6 +4934,9 @@ usb:v0424p274D*
 usb:v0424p2807*
  ID_MODEL_FROM_DATABASE=Hub
 
+usb:v0424p3FC7*
+ ID_MODEL_FROM_DATABASE=RME Babyface audio system
+
 usb:v0424p3FCC*
  ID_MODEL_FROM_DATABASE=RME MADIface
 
@@ -5618,6 +5666,9 @@ usb:v043Ep3001*
 usb:v043Ep3004*
  ID_MODEL_FROM_DATABASE=TWFM-B003D 802.11abgn Wireless Module [Broadcom BCM43236B]
 
+usb:v043Ep3009*
+ ID_MODEL_FROM_DATABASE=VC400
+
 usb:v043Ep3101*
  ID_MODEL_FROM_DATABASE=AN-WF500 802.11abgn + BT Wireless Adapter [Broadcom BCM43242]
 
@@ -5849,6 +5900,9 @@ usb:v044FpB30B*
 usb:v044FpB315*
  ID_MODEL_FROM_DATABASE=Firestorm Dual Analog 3
 
+usb:v044FpB320*
+ ID_MODEL_FROM_DATABASE=Dual Trigger gamepad PC/PS2 2.0
+
 usb:v044FpB323*
  ID_MODEL_FROM_DATABASE=Dual Trigger 3-in-1 (PC Mode)
 
@@ -5936,6 +5990,9 @@ usb:v0451p2077*
 usb:v0451p2F90*
  ID_MODEL_FROM_DATABASE=SM-USB-DIG
 
+usb:v0451p3200*
+ ID_MODEL_FROM_DATABASE=TUSB3200 Boot Loader
+
 usb:v0451p3410*
  ID_MODEL_FROM_DATABASE=TUSB3410 Microcontroller
 
@@ -6027,7 +6084,7 @@ usb:v0451pE01C*
  ID_MODEL_FROM_DATABASE=Data Collection Sled [Nspire Lab Cradle, Nspire Datatracker Cradle]
 
 usb:v0451pE01E*
- ID_MODEL_FROM_DATABASE=Nspire\99 CX Navigator\99 Access Point
+ ID_MODEL_FROM_DATABASE=Nspire CX Navigator Access Point
 
 usb:v0451pE01F*
  ID_MODEL_FROM_DATABASE=Python Adapter (firmware install mode)
@@ -6194,6 +6251,9 @@ usb:v0458p0083*
 usb:v0458p0087*
  ID_MODEL_FROM_DATABASE=Ergo 525V Laser Mouse
 
+usb:v0458p0088*
+ ID_MODEL_FROM_DATABASE=Genius Traveler 515 Laser
+
 usb:v0458p0089*
  ID_MODEL_FROM_DATABASE=Genius Traveler 350
 
@@ -6503,6 +6563,9 @@ usb:v045Ap501F*
 usb:v045Ap503F*
  ID_MODEL_FROM_DATABASE=Cali256 MP3 Player
 
+usb:v045Ap5042*
+ ID_MODEL_FROM_DATABASE=Rio Forge
+
 usb:v045Ap5202*
  ID_MODEL_FROM_DATABASE=Rio Riot MP3 Player
 
@@ -7389,7 +7452,7 @@ usb:v045Ep07B9*
  ID_MODEL_FROM_DATABASE=Wired Keyboard 200
 
 usb:v045Ep07C6*
- ID_MODEL_FROM_DATABASE=RTL8153 GigE [Surface Dock Ethernet]
+ ID_MODEL_FROM_DATABASE=RTL8153 GigE [Surface Ethernet Adapter]
 
 usb:v045Ep07CA*
  ID_MODEL_FROM_DATABASE=Surface Pro 3 Docking Station Audio Device
@@ -7403,9 +7466,15 @@ usb:v045Ep07F8*
 usb:v045Ep07FD*
  ID_MODEL_FROM_DATABASE=Nano Transceiver 1.1
 
+usb:v045Ep0800*
+ ID_MODEL_FROM_DATABASE=Wireless keyboard (All-in-One-Media)
+
 usb:v045Ep0810*
  ID_MODEL_FROM_DATABASE=LifeCam HD-3000
 
+usb:v045Ep0823*
+ ID_MODEL_FROM_DATABASE=Classic IntelliMouse
+
 usb:v045Ep0900*
  ID_MODEL_FROM_DATABASE=Surface Dock Hub
 
@@ -7433,6 +7502,18 @@ usb:v045Ep090C*
 usb:v045Ep091A*
  ID_MODEL_FROM_DATABASE=Hub
 
+usb:v045Ep0927*
+ ID_MODEL_FROM_DATABASE=RTL8153B GigE [Surface Ethernet Adapter]
+
+usb:v045Ep0955*
+ ID_MODEL_FROM_DATABASE=Hub
+
+usb:v045Ep0957*
+ ID_MODEL_FROM_DATABASE=Hub
+
+usb:v045Ep09A0*
+ ID_MODEL_FROM_DATABASE=RTL8153B GigE [Surface Ethernet Adapter]
+
 usb:v045Ep09C0*
  ID_MODEL_FROM_DATABASE=Surface Type Cover
 
@@ -7658,6 +7739,9 @@ usb:v0461p4DE7*
 usb:v0461p4E04*
  ID_MODEL_FROM_DATABASE=Lenovo Keyboard KB1021
 
+usb:v0461p4E22*
+ ID_MODEL_FROM_DATABASE=Dell Mouse, 2 Buttons, Modell: MS111-P
+
 usb:v0461p4E6F*
  ID_MODEL_FROM_DATABASE=Acer Wired Keyboard Model KBAY211
 
@@ -8183,6 +8267,9 @@ usb:v046Dp0A0B*
 usb:v046Dp0A0C*
  ID_MODEL_FROM_DATABASE=Clear Chat Comfort USB Headset
 
+usb:v046Dp0A10*
+ ID_MODEL_FROM_DATABASE=V10 Notebook Speakers
+
 usb:v046Dp0A13*
  ID_MODEL_FROM_DATABASE=Z-5 Speakers
 
@@ -8459,6 +8546,9 @@ usb:v046DpC083*
 usb:v046DpC084*
  ID_MODEL_FROM_DATABASE=G203 Gaming Mouse
 
+usb:v046DpC08B*
+ ID_MODEL_FROM_DATABASE=G502 SE HERO Gaming Mouse
+
 usb:v046DpC101*
  ID_MODEL_FROM_DATABASE=UltraX Media Remote
 
@@ -8627,6 +8717,12 @@ usb:v046DpC24D*
 usb:v046DpC24E*
  ID_MODEL_FROM_DATABASE=G500s Laser Gaming Mouse
 
+usb:v046DpC24F*
+ ID_MODEL_FROM_DATABASE=G29 Driving Force Racing Wheel [PS3]
+
+usb:v046DpC260*
+ ID_MODEL_FROM_DATABASE=G29 Driving Force Racing Wheel [PS4]
+
 usb:v046DpC281*
  ID_MODEL_FROM_DATABASE=WingMan Force
 
@@ -9368,6 +9464,9 @@ usb:v0471p21E0*
 usb:v0471p262C*
  ID_MODEL_FROM_DATABASE=SPC230NC Webcam
 
+usb:v0471p2721*
+ ID_MODEL_FROM_DATABASE=PTA 317 TV Camera
+
 usb:v0471p485D*
  ID_MODEL_FROM_DATABASE=Senselock SenseIV v2.x
 
@@ -9764,6 +9863,9 @@ usb:v047Fp0CA1*
 usb:v047Fp4254*
  ID_MODEL_FROM_DATABASE=BUA-100 Bluetooth Adapter
 
+usb:v047FpAA05*
+ ID_MODEL_FROM_DATABASE=DA45
+
 usb:v047FpAC01*
  ID_MODEL_FROM_DATABASE=Savi 7xx
 
@@ -10118,6 +10220,9 @@ usb:v048Dp1336*
 usb:v048Dp1345*
  ID_MODEL_FROM_DATABASE=Multi Cardreader
 
+usb:v048Dp8297*
+ ID_MODEL_FROM_DATABASE=IT8297 RGB LED Controller
+
 usb:v048Dp9006*
  ID_MODEL_FROM_DATABASE=IT9135 BDA Afatech DVB-T HDTV Dongle
 
@@ -11957,6 +12062,9 @@ usb:v04A9p2736*
 usb:v04A9p2737*
  ID_MODEL_FROM_DATABASE=MF4410
 
+usb:v04A9p2742*
+ ID_MODEL_FROM_DATABASE=imageRUNNER1133 series
+
 usb:v04A9p2771*
  ID_MODEL_FROM_DATABASE=LBP6020
 
@@ -13304,6 +13412,9 @@ usb:v04B4p0033*
 usb:v04B4p0060*
  ID_MODEL_FROM_DATABASE=Wireless optical mouse
 
+usb:v04B4p00F3*
+ ID_MODEL_FROM_DATABASE=FX3 micro-controller (DFU mode)
+
 usb:v04B4p0100*
  ID_MODEL_FROM_DATABASE=Cino FuzzyScan F760-B
 
@@ -13445,8 +13556,14 @@ usb:v04B4pF231*
 usb:v04B4pF232*
  ID_MODEL_FROM_DATABASE=Mono embedded computer
 
+usb:v04B4pFD10*
+ ID_MODEL_FROM_DATABASE=Gembird MSIS-PM
+
 usb:v04B4pFD13*
- ID_MODEL_FROM_DATABASE=Programmable power socket
+ ID_MODEL_FROM_DATABASE=Energenie EG-PMS
+
+usb:v04B4pFD15*
+ ID_MODEL_FROM_DATABASE=Energenie EG-PMS2
 
 usb:v04B5*
  ID_VENDOR_FROM_DATABASE=ROHM LSI Systems USA, LLC
@@ -13641,7 +13758,7 @@ usb:v04B8p0151*
  ID_MODEL_FROM_DATABASE=Perfection V800 Photo
 
 usb:v04B8p0202*
- ID_MODEL_FROM_DATABASE=Receipt Printer M129C/TM-T70
+ ID_MODEL_FROM_DATABASE=Interface Card UB-U05 for Thermal Receipt Printers [M129C/TM-T70/TM-T88IV]
 
 usb:v04B8p0401*
  ID_MODEL_FROM_DATABASE=CP 800 Digital Camera
@@ -13875,7 +13992,7 @@ usb:v04B8p084D*
  ID_MODEL_FROM_DATABASE=PX-402A [Stylus SX115/Stylus NX110 Series]
 
 usb:v04B8p084F*
- ID_MODEL_FROM_DATABASE=ME OFFICE 510
+ ID_MODEL_FROM_DATABASE=Multifunctional Printer Scanner [ME Office 510 / Epson Stylus SX215]
 
 usb:v04B8p0850*
  ID_MODEL_FROM_DATABASE=EP-702A [Stylus Photo PX650/TX650 Series]
@@ -13997,6 +14114,9 @@ usb:v04B8p0892*
 usb:v04B8p0893*
  ID_MODEL_FROM_DATABASE=EP-774A
 
+usb:v04B8p0E03*
+ ID_MODEL_FROM_DATABASE=Thermal Receipt Printer [TM-T20]
+
 usb:v04B8p1114*
  ID_MODEL_FROM_DATABASE=XP-440 [Expression Home Small-in-One Printer]
 
@@ -14084,6 +14204,9 @@ usb:v04BB*
 usb:v04BBp0101*
  ID_MODEL_FROM_DATABASE=USB2-IDE/ATAPI Bridge Adapter
 
+usb:v04BBp014A*
+ ID_MODEL_FROM_DATABASE=HDCL-UT
+
 usb:v04BBp0201*
  ID_MODEL_FROM_DATABASE=USB2-IDE/ATAPI Bridge Adapter
 
@@ -14399,12 +14522,18 @@ usb:v04C8p072D*
 usb:v04CA*
  ID_VENDOR_FROM_DATABASE=Lite-On Technology Corp.
 
+usb:v04CAp0020*
+ ID_MODEL_FROM_DATABASE=USB Keyboard
+
 usb:v04CAp004B*
  ID_MODEL_FROM_DATABASE=Keyboard
 
 usb:v04CAp004F*
  ID_MODEL_FROM_DATABASE=SK-9020 keyboard
 
+usb:v04CAp008A*
+ ID_MODEL_FROM_DATABASE=Acer Wired Mouse Model SM-9023
+
 usb:v04CAp1766*
  ID_MODEL_FROM_DATABASE=HID Monitor Controls
 
@@ -14432,6 +14561,9 @@ usb:v04CAp300F*
 usb:v04CAp3014*
  ID_MODEL_FROM_DATABASE=Qualcomm Atheros Bluetooth
 
+usb:v04CAp3015*
+ ID_MODEL_FROM_DATABASE=Qualcomm Atheros QCA9377 Bluetooth
+
 usb:v04CAp7022*
  ID_MODEL_FROM_DATABASE=HP HD Webcam
 
@@ -14894,6 +15026,9 @@ usb:v04D8p8108*
 usb:v04D8p9004*
  ID_MODEL_FROM_DATABASE=Microchip REAL ICE
 
+usb:v04D8p9009*
+ ID_MODEL_FROM_DATABASE=ICD3
+
 usb:v04D8p900A*
  ID_MODEL_FROM_DATABASE=PICkit3
 
@@ -14909,6 +15044,9 @@ usb:v04D8pC001*
 usb:v04D8pE11C*
  ID_MODEL_FROM_DATABASE=TL866CS EEPROM Programmer [MiniPRO]
 
+usb:v04D8pED16*
+ ID_MODEL_FROM_DATABASE=BeamiRC 2.0 CNC remote controller analoge
+
 usb:v04D8pEDB4*
  ID_MODEL_FROM_DATABASE=micro PLC (ATSAMD51G19A) [Black Brix ECU II]
 
@@ -14972,9 +15110,15 @@ usb:v04D8pFFEF*
 usb:v04D9*
  ID_VENDOR_FROM_DATABASE=Holtek Semiconductor, Inc.
 
+usb:v04D9p0006*
+ ID_MODEL_FROM_DATABASE=Wired Keyboard (78/79 key) [RPI Wired Keyboard 5]
+
 usb:v04D9p0022*
  ID_MODEL_FROM_DATABASE=Portable Keyboard
 
+usb:v04D9p0348*
+ ID_MODEL_FROM_DATABASE=Keyboard
+
 usb:v04D9p048E*
  ID_MODEL_FROM_DATABASE=Optical Mouse
 
@@ -15053,6 +15197,12 @@ usb:v04D9pA100*
 usb:v04D9pA11B*
  ID_MODEL_FROM_DATABASE=Mouse [MX-3200]
 
+usb:v04D9pA29F*
+ ID_MODEL_FROM_DATABASE=Microarray fingerprint reader
+
+usb:v04D9pB534*
+ ID_MODEL_FROM_DATABASE=LGT8F328P Microprocessor
+
 usb:v04D9pE002*
  ID_MODEL_FROM_DATABASE=MCU
 
@@ -15620,6 +15770,9 @@ usb:v04E8p0111*
 usb:v04E8p0300*
  ID_MODEL_FROM_DATABASE=E2530 / GT-C3350 Phones (Mass storage mode)
 
+usb:v04E8p04E8*
+ ID_MODEL_FROM_DATABASE=Galaxy (MIDI mode)
+
 usb:v04E8p1003*
  ID_MODEL_FROM_DATABASE=MP3 Player and Recorder
 
@@ -16271,6 +16424,12 @@ usb:v04E8p7301*
 usb:v04E8p8001*
  ID_MODEL_FROM_DATABASE=Handheld
 
+usb:v04E8p8002*
+ ID_MODEL_FROM_DATABASE=Portable SSD 500GB Model Number: MU - P8500B
+
+usb:v04E8p8003*
+ ID_MODEL_FROM_DATABASE=Portable SSD T1
+
 usb:v04E8pD003*
  ID_MODEL_FROM_DATABASE=GT-I9003
 
@@ -16400,6 +16559,9 @@ usb:v04F2p0841*
 usb:v04F2p0860*
  ID_MODEL_FROM_DATABASE=2.4G Multimedia Wireless Kit
 
+usb:v04F2p0939*
+ ID_MODEL_FROM_DATABASE=Amazon Basics mouse
+
 usb:v04F2p1061*
  ID_MODEL_FROM_DATABASE=HP KG-1061 Wireless Keyboard+Mouse
 
@@ -16583,6 +16745,9 @@ usb:v04F2pB221*
 usb:v04F2pB230*
  ID_MODEL_FROM_DATABASE=Integrated HP HD Webcam
 
+usb:v04F2pB249*
+ ID_MODEL_FROM_DATABASE=HP Integrated Webcam
+
 usb:v04F2pB257*
  ID_MODEL_FROM_DATABASE=Lenovo Integrated Camera
 
@@ -16634,6 +16799,9 @@ usb:v04F2pB40E*
 usb:v04F2pB444*
  ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam
 
+usb:v04F2pB49F*
+ ID_MODEL_FROM_DATABASE=Bluetooth (RTL8723BE)
+
 usb:v04F2pB563*
  ID_MODEL_FROM_DATABASE=Integrated Camera
 
@@ -16649,6 +16817,9 @@ usb:v04F2pB5DB*
 usb:v04F2pB604*
  ID_MODEL_FROM_DATABASE=Integrated Camera (1280x720@30)
 
+usb:v04F2pB681*
+ ID_MODEL_FROM_DATABASE=ThinkPad T490 Webcam
+
 usb:v04F3*
  ID_VENDOR_FROM_DATABASE=Elan Microelectronics Corp.
 
@@ -16838,6 +17009,12 @@ usb:v04F9p0041*
 usb:v04F9p0042*
  ID_MODEL_FROM_DATABASE=HL-2270DW Laser Printer
 
+usb:v04F9p004D*
+ ID_MODEL_FROM_DATABASE=HL-6180DW series
+
+usb:v04F9p0080*
+ ID_MODEL_FROM_DATABASE=HL-L6250DN series
+
 usb:v04F9p0100*
  ID_MODEL_FROM_DATABASE=MFC8600/9650 series
 
@@ -17468,6 +17645,9 @@ usb:v04F9p023F*
 usb:v04F9p0240*
  ID_MODEL_FROM_DATABASE=MFC-J950DN
 
+usb:v04F9p0245*
+ ID_MODEL_FROM_DATABASE=MFC-9560CDW
+
 usb:v04F9p0248*
  ID_MODEL_FROM_DATABASE=DCP-7055 scanner/printer
 
@@ -18191,6 +18371,9 @@ usb:v04F9p03BC*
 usb:v04F9p03BD*
  ID_MODEL_FROM_DATABASE=DCP-J762N
 
+usb:v04F9p03FD*
+ ID_MODEL_FROM_DATABASE=ADS-2700W
+
 usb:v04F9p1000*
  ID_MODEL_FROM_DATABASE=Printer
 
@@ -18207,29 +18390,56 @@ usb:v04F9p2007*
  ID_MODEL_FROM_DATABASE=PT-2420PC P-touch Label Printer
 
 usb:v04F9p2015*
- ID_MODEL_FROM_DATABASE=QL-500 P-touch label printer
+ ID_MODEL_FROM_DATABASE=QL-500 label printer
 
 usb:v04F9p2016*
- ID_MODEL_FROM_DATABASE=QL-550 P-touch label printer
+ ID_MODEL_FROM_DATABASE=QL-550 printer
 
 usb:v04F9p201A*
  ID_MODEL_FROM_DATABASE=PT-18R P-touch label printer
 
 usb:v04F9p201B*
- ID_MODEL_FROM_DATABASE=QL-650TD P-touch Label Printer
+ ID_MODEL_FROM_DATABASE=QL-650TD Label Printer
+
+usb:v04F9p2020*
+ ID_MODEL_FROM_DATABASE=QL-1050 Label Printer
 
 usb:v04F9p2027*
- ID_MODEL_FROM_DATABASE=QL-560 P-touch Label Printer
+ ID_MODEL_FROM_DATABASE=QL-560 Label Printer
 
 usb:v04F9p2028*
- ID_MODEL_FROM_DATABASE=QL-570 P-touch Label Printer
+ ID_MODEL_FROM_DATABASE=QL-570 Label Printer
+
+usb:v04F9p202A*
+ ID_MODEL_FROM_DATABASE=QL-1060N Label Printer
 
 usb:v04F9p202B*
  ID_MODEL_FROM_DATABASE=PT-7600 P-touch Label Printer
 
+usb:v04F9p202C*
+ ID_MODEL_FROM_DATABASE=PT-1230PC P-touch Label Printer E mode
+
+usb:v04F9p202D*
+ ID_MODEL_FROM_DATABASE=PT-2430PC P-touch Label Printer
+
+usb:v04F9p2030*
+ ID_MODEL_FROM_DATABASE=PT-1230PC P-touch Label Printer EL mode
+
 usb:v04F9p2041*
  ID_MODEL_FROM_DATABASE=PT-2730 P-touch Label Printer
 
+usb:v04F9p2042*
+ ID_MODEL_FROM_DATABASE=QL-700 Label Printer
+
+usb:v04F9p2043*
+ ID_MODEL_FROM_DATABASE=QL-710W Label Printer
+
+usb:v04F9p2044*
+ ID_MODEL_FROM_DATABASE=QL-720NW Label Printer
+
+usb:v04F9p204D*
+ ID_MODEL_FROM_DATABASE=QL-720NW Label Printer (mass storage mode)
+
 usb:v04F9p2061*
  ID_MODEL_FROM_DATABASE=PT-P700 P-touch Label Printer
 
@@ -18237,13 +18447,34 @@ usb:v04F9p2064*
  ID_MODEL_FROM_DATABASE=PT-P700 P-touch Label Printer RemovableDisk
 
 usb:v04F9p209B*
- ID_MODEL_FROM_DATABASE=QL-800 P-touch Label Printer
+ ID_MODEL_FROM_DATABASE=QL-800 Label Printer
 
 usb:v04F9p209C*
- ID_MODEL_FROM_DATABASE=QL-810W P-touch Label Printer
+ ID_MODEL_FROM_DATABASE=QL-810W Label Printer
 
 usb:v04F9p209D*
- ID_MODEL_FROM_DATABASE=QL-820NWB P-touch Label Printer
+ ID_MODEL_FROM_DATABASE=QL-820NWB Label Printer
+
+usb:v04F9p20A7*
+ ID_MODEL_FROM_DATABASE=QL-1100 Label Printer
+
+usb:v04F9p20A8*
+ ID_MODEL_FROM_DATABASE=QL-1110NWB Label Printer
+
+usb:v04F9p20A9*
+ ID_MODEL_FROM_DATABASE=QL-1100 Label Printer (mass storage)
+
+usb:v04F9p20AA*
+ ID_MODEL_FROM_DATABASE=QL-1110NWB Label Printer (mass storage)
+
+usb:v04F9p20AB*
+ ID_MODEL_FROM_DATABASE=QL-1115NWB Label Printer
+
+usb:v04F9p20AC*
+ ID_MODEL_FROM_DATABASE=QL-1115NWB Label Printer (mass storage)
+
+usb:v04F9p20C0*
+ ID_MODEL_FROM_DATABASE=QL-600 Label Printer
 
 usb:v04F9p2100*
  ID_MODEL_FROM_DATABASE=Card Reader Writer
@@ -18996,7 +19227,7 @@ usb:v0525pA4A4*
  ID_MODEL_FROM_DATABASE=Linux-USB user-mode bulk source/sink
 
 usb:v0525pA4A5*
- ID_MODEL_FROM_DATABASE=Pocketbook Pro 903 / Mobius 2 Action Cam
+ ID_MODEL_FROM_DATABASE=Pocketbook Pro 903 / Mobius 2 Action Cam / xDuoo X3
 
 usb:v0525pA4A6*
  ID_MODEL_FROM_DATABASE=Linux-USB Serial Gadget
@@ -19886,6 +20117,9 @@ usb:v054Cp02D1*
 usb:v054Cp02D2*
  ID_MODEL_FROM_DATABASE=PSP Slim
 
+usb:v054Cp02D4*
+ ID_MODEL_FROM_DATABASE=UP-CX1
+
 usb:v054Cp02D8*
  ID_MODEL_FROM_DATABASE=SBAC-US10 SxS PRO memory card reader/writer
 
@@ -19940,6 +20174,15 @@ usb:v054Cp0387*
 usb:v054Cp03BC*
  ID_MODEL_FROM_DATABASE=Webbie HD - MHS-CM1
 
+usb:v054Cp03C3*
+ ID_MODEL_FROM_DATABASE=UP-DR80MD
+
+usb:v054Cp03C4*
+ ID_MODEL_FROM_DATABASE=Stryker SDP1000
+
+usb:v054Cp03C5*
+ ID_MODEL_FROM_DATABASE=UP-DR80
+
 usb:v054Cp03CC*
  ID_MODEL_FROM_DATABASE=SD Card Reader
 
@@ -20027,6 +20270,9 @@ usb:v054Cp0C03*
 usb:v054Cp0C34*
  ID_MODEL_FROM_DATABASE=ILCE-7M3 [A7III] in PC Remote mode
 
+usb:v054Cp0CD3*
+ ID_MODEL_FROM_DATABASE=WH-1000XM3 [Wireless Noise-Canceling Headphones]
+
 usb:v054Cp0CDA*
  ID_MODEL_FROM_DATABASE=PlayStation Classic controller
 
@@ -20498,6 +20744,12 @@ usb:v0566p3002*
 usb:v0566p3004*
  ID_MODEL_FROM_DATABASE=Genius KB-29E
 
+usb:v0566p3013*
+ ID_MODEL_FROM_DATABASE=BakkerElkhuizen Wired Keyboard S-board 840 Design
+
+usb:v0566p3020*
+ ID_MODEL_FROM_DATABASE=BakkerElkhuizen Wired Keyboard S-board 840 Design USB-Hub
+
 usb:v0566p3027*
  ID_MODEL_FROM_DATABASE=Sun-Flex ProTouch
 
@@ -20708,6 +20960,9 @@ usb:v056Ap0097*
 usb:v056Ap009A*
  ID_MODEL_FROM_DATABASE=TPC9A
 
+usb:v056Ap00A2*
+ ID_MODEL_FROM_DATABASE=STU-300B [LCD signature pad]
+
 usb:v056Ap00B0*
  ID_MODEL_FROM_DATABASE=PTZ-430 [Intuos3 (4x5)]
 
@@ -20843,6 +21098,9 @@ usb:v056Ap00F6*
 usb:v056Ap00F8*
  ID_MODEL_FROM_DATABASE=DTH-2400 [Cintiq 24HD touch] tablet
 
+usb:v056Ap00F9*
+ ID_MODEL_FROM_DATABASE=DTK-2200 [Cintiq 22HD] hub
+
 usb:v056Ap00FA*
  ID_MODEL_FROM_DATABASE=DTK-2200 [Cintiq 22HD] tablet
 
@@ -20955,10 +21213,10 @@ usb:v056Ap0343*
  ID_MODEL_FROM_DATABASE=DTK-1651
 
 usb:v056Ap0347*
- ID_MODEL_FROM_DATABASE=Integrated Hub
+ ID_MODEL_FROM_DATABASE=DTH-W1620 [MobileStudio Pro 16] internal hub
 
 usb:v056Ap0348*
- ID_MODEL_FROM_DATABASE=Integrated Hub
+ ID_MODEL_FROM_DATABASE=DTH-W1620 [MobileStudio Pro 16] external hub
 
 usb:v056Ap034A*
  ID_MODEL_FROM_DATABASE=DTH-W1320 [MobileStudio Pro 13] touchscreen
@@ -21056,6 +21314,36 @@ usb:v056Ap038F*
 usb:v056Ap0390*
  ID_MODEL_FROM_DATABASE=DTK-1660 [Cintiq 16]
 
+usb:v056Ap0392*
+ ID_MODEL_FROM_DATABASE=PTH-460 [Intuos Pro (S)]
+
+usb:v056Ap0396*
+ ID_MODEL_FROM_DATABASE=DTK-1660E
+
+usb:v056Ap0398*
+ ID_MODEL_FROM_DATABASE=DTH-W1320 [MobileStudio Pro 13] tablet
+
+usb:v056Ap0399*
+ ID_MODEL_FROM_DATABASE=DTH-W1620 [MobileStudio Pro 16] tablet
+
+usb:v056Ap039A*
+ ID_MODEL_FROM_DATABASE=DTH-W1320 [MobileStudio Pro 13] touchscreen
+
+usb:v056Ap039B*
+ ID_MODEL_FROM_DATABASE=DTH-W1620 [MobileStudio Pro 16] touchscreen
+
+usb:v056Ap039C*
+ ID_MODEL_FROM_DATABASE=DTH-W1320 [MobileStudio Pro 16] external hub
+
+usb:v056Ap039D*
+ ID_MODEL_FROM_DATABASE=DTH-W1320 [MobileStudio Pro 16] internal hub
+
+usb:v056Ap03AA*
+ ID_MODEL_FROM_DATABASE=DTH-W1620 [MobileStudio Pro 16] tablet
+
+usb:v056Ap03AC*
+ ID_MODEL_FROM_DATABASE=DTH-W1620 [MobileStudio Pro 16] touchscreen
+
 usb:v056Ap0400*
  ID_MODEL_FROM_DATABASE=PenPartner 4x5
 
@@ -21110,6 +21398,9 @@ usb:v056Dp0002*
 usb:v056Dp0003*
  ID_MODEL_FROM_DATABASE=Device Bay Controller
 
+usb:v056Dp4001*
+ ID_MODEL_FROM_DATABASE=Monitor
+
 usb:v056E*
  ID_VENDOR_FROM_DATABASE=Elecom Co., Ltd
 
@@ -21215,6 +21506,231 @@ usb:v056Ep00A5*
 usb:v056Ep00A7*
  ID_MODEL_FROM_DATABASE=Blue LED Mouse M-BL08DB
 
+usb:v056Ep00A8*
+ ID_MODEL_FROM_DATABASE=M-BL09DB Mouse
+
+usb:v056Ep00A9*
+ ID_MODEL_FROM_DATABASE=M-BL10UB Mouse
+
+usb:v056Ep00AA*
+ ID_MODEL_FROM_DATABASE=M-BL11DB Mouse
+
+usb:v056Ep00AC*
+ ID_MODEL_FROM_DATABASE=M-A-BL01UL / M-BL15DB Mouse
+
+usb:v056Ep00B4*
+ ID_MODEL_FROM_DATABASE=Track on Glass Mouse M-TG02DL
+
+usb:v056Ep00B5*
+ ID_MODEL_FROM_DATABASE=Track on Glass Mouse M-TG03UL
+
+usb:v056Ep00B6*
+ ID_MODEL_FROM_DATABASE=Track on Glass Mouse M-TG04DL
+
+usb:v056Ep00B8*
+ ID_MODEL_FROM_DATABASE=M-A-BL01UL or M-ASKL2 Mouse
+
+usb:v056Ep00B9*
+ ID_MODEL_FROM_DATABASE=M-A-BL02DB or M-ASKL Mouse
+
+usb:v056Ep00CB*
+ ID_MODEL_FROM_DATABASE=M-BL21DB Mouse
+
+usb:v056Ep00CD*
+ ID_MODEL_FROM_DATABASE=M-XG1UB Mouse
+
+usb:v056Ep00CE*
+ ID_MODEL_FROM_DATABASE=M-XG1DB Mouse
+
+usb:v056Ep00CF*
+ ID_MODEL_FROM_DATABASE=M-XG1BB Bluetooth Mouse
+
+usb:v056Ep00D0*
+ ID_MODEL_FROM_DATABASE=M-XG2UB Mouse
+
+usb:v056Ep00D1*
+ ID_MODEL_FROM_DATABASE=M-XG2DB Mouse
+
+usb:v056Ep00D2*
+ ID_MODEL_FROM_DATABASE=M-XG2BB Bluetooth Mouse
+
+usb:v056Ep00D3*
+ ID_MODEL_FROM_DATABASE=M-XG3DL Mouse
+
+usb:v056Ep00D4*
+ ID_MODEL_FROM_DATABASE=M-LS11DL Mouse
+
+usb:v056Ep00DA*
+ ID_MODEL_FROM_DATABASE=M-XG4UB Mouse
+
+usb:v056Ep00DB*
+ ID_MODEL_FROM_DATABASE=M-XG4DB Mouse
+
+usb:v056Ep00DC*
+ ID_MODEL_FROM_DATABASE=M-XG4BB Bluetooth Mouse
+
+usb:v056Ep00DD*
+ ID_MODEL_FROM_DATABASE=M-LS12UL Mouse
+
+usb:v056Ep00DE*
+ ID_MODEL_FROM_DATABASE=M-LS13UL Mouse
+
+usb:v056Ep00DF*
+ ID_MODEL_FROM_DATABASE=M-BL22DB Mouse
+
+usb:v056Ep00E1*
+ ID_MODEL_FROM_DATABASE=M-WK01DB or M-A-BL04DB
+
+usb:v056Ep00E2*
+ ID_MODEL_FROM_DATABASE=M-A-BL03DB
+
+usb:v056Ep00E3*
+ ID_MODEL_FROM_DATABASE=M-XGx10UB
+
+usb:v056Ep00E4*
+ ID_MODEL_FROM_DATABASE=M-XGx10DB
+
+usb:v056Ep00E5*
+ ID_MODEL_FROM_DATABASE=M-XGx10BB
+
+usb:v056Ep00E6*
+ ID_MODEL_FROM_DATABASE=M-XGx20DL or M-XGx20DB UltimateLaser Mouse
+
+usb:v056Ep00F1*
+ ID_MODEL_FROM_DATABASE=M-XT1DRBK USB EX-G Wireless Optical TrackBall
+
+usb:v056Ep00F2*
+ ID_MODEL_FROM_DATABASE=M-XT1URBK EX-G Optical Trackball
+
+usb:v056Ep00F3*
+ ID_MODEL_FROM_DATABASE=M-BL23DB
+
+usb:v056Ep00F4*
+ ID_MODEL_FROM_DATABASE=M-BT13BL LBT-UAN05C2
+
+usb:v056Ep00F7*
+ ID_MODEL_FROM_DATABASE=M-KN1DB
+
+usb:v056Ep00F8*
+ ID_MODEL_FROM_DATABASE=M-BL22DB Mouse (other version)
+
+usb:v056Ep00F9*
+ ID_MODEL_FROM_DATABASE=M-XT2URBK EX-G Optical TrackBall
+
+usb:v056Ep00FA*
+ ID_MODEL_FROM_DATABASE=M-XT2DRBK EX-G Wireless Optical TrackBall
+
+usb:v056Ep00FB*
+ ID_MODEL_FROM_DATABASE=M-XT3URBK EX-G Optical TrackBall
+
+usb:v056Ep00FC*
+ ID_MODEL_FROM_DATABASE=M-XT3DRBK EX-G Wireless Optical TrackBall
+
+usb:v056Ep00FD*
+ ID_MODEL_FROM_DATABASE=M-XT4DRBK EX-G Wireless Optical TrackBall
+
+usb:v056Ep00FE*
+ ID_MODEL_FROM_DATABASE=M-DT1URBK or M-DT2URBK DEFT Optical TrackBall
+
+usb:v056Ep00FF*
+ ID_MODEL_FROM_DATABASE=M-DT1DRBK or M-DT2DRBK DEFT Wireless Optical Mouse
+
+usb:v056Ep0101*
+ ID_MODEL_FROM_DATABASE=M-BL25UBS
+
+usb:v056Ep0103*
+ ID_MODEL_FROM_DATABASE=M-BT16BBS
+
+usb:v056Ep0104*
+ ID_MODEL_FROM_DATABASE=M-BL26UBC
+
+usb:v056Ep0105*
+ ID_MODEL_FROM_DATABASE=M-BL26DBC
+
+usb:v056Ep0107*
+ ID_MODEL_FROM_DATABASE=M-LS15UL
+
+usb:v056Ep0108*
+ ID_MODEL_FROM_DATABASE=M-LS15DL
+
+usb:v056Ep0109*
+ ID_MODEL_FROM_DATABASE=M-LS16UL Mouse
+
+usb:v056Ep010A*
+ ID_MODEL_FROM_DATABASE=M-LS16DL / M-KN2DLS
+
+usb:v056Ep010B*
+ ID_MODEL_FROM_DATABASE=M-BL21DB Mouse
+
+usb:v056Ep010C*
+ ID_MODEL_FROM_DATABASE=M-HT1URBK HUGE Optical TrackBall
+
+usb:v056Ep010D*
+ ID_MODEL_FROM_DATABASE=M-HT1DRBK HUGE Wireless Optical TrackBall
+
+usb:v056Ep010E*
+ ID_MODEL_FROM_DATABASE=M-KS1DBS / M-FPG3DBS
+
+usb:v056Ep010F*
+ ID_MODEL_FROM_DATABASE=M-FBG3DB
+
+usb:v056Ep0115*
+ ID_MODEL_FROM_DATABASE=M-BT13BL
+
+usb:v056Ep0121*
+ ID_MODEL_FROM_DATABASE=M-ED01DB
+
+usb:v056Ep0122*
+ ID_MODEL_FROM_DATABASE=M-NK01DB
+
+usb:v056Ep0124*
+ ID_MODEL_FROM_DATABASE=Dual connect Mouse M-DC01MB Bluetooth
+
+usb:v056Ep0128*
+ ID_MODEL_FROM_DATABASE=TrackBall Mouse M-XPT1MR Wired
+
+usb:v056Ep0129*
+ ID_MODEL_FROM_DATABASE=TrackBall Mouse M-XPT1MR Wireless
+
+usb:v056Ep0130*
+ ID_MODEL_FROM_DATABASE=TrackBall Mouse M-XPT1MR Bluetooth
+
+usb:v056Ep0131*
+ ID_MODEL_FROM_DATABASE=TrackBall Mouse M-DPT1MR Wired
+
+usb:v056Ep0132*
+ ID_MODEL_FROM_DATABASE=TrackBall Mouse M-DPT1MR Wireless
+
+usb:v056Ep0133*
+ ID_MODEL_FROM_DATABASE=TrackBall Mouse M-DPT1MR Bluetooth
+
+usb:v056Ep0136*
+ ID_MODEL_FROM_DATABASE=M-BT20BB
+
+usb:v056Ep0137*
+ ID_MODEL_FROM_DATABASE=BlueTooth 4.0 Mouse M-BT21BB
+
+usb:v056Ep0138*
+ ID_MODEL_FROM_DATABASE=M-A-BL07DB
+
+usb:v056Ep0140*
+ ID_MODEL_FROM_DATABASE=M-G01UR
+
+usb:v056Ep0141*
+ ID_MODEL_FROM_DATABASE=M-Y9UB
+
+usb:v056Ep0142*
+ ID_MODEL_FROM_DATABASE=M-DY13DB
+
+usb:v056Ep0144*
+ ID_MODEL_FROM_DATABASE=M-FBL01DB
+
+usb:v056Ep1055*
+ ID_MODEL_FROM_DATABASE=TK-DCP03 WIRED
+
+usb:v056Ep1057*
+ ID_MODEL_FROM_DATABASE=TK-DCP03 BT
+
 usb:v056Ep2003*
  ID_MODEL_FROM_DATABASE=JC-U3613M
 
@@ -21224,6 +21740,9 @@ usb:v056Ep2004*
 usb:v056Ep200C*
  ID_MODEL_FROM_DATABASE=LD-USB/TX
 
+usb:v056Ep200F*
+ ID_MODEL_FROM_DATABASE=JC-U4013S Gamepad
+
 usb:v056Ep2012*
  ID_MODEL_FROM_DATABASE=JC-U4013S Gamepad
 
@@ -21686,6 +22205,12 @@ usb:v057D*
 usb:v057E*
  ID_VENDOR_FROM_DATABASE=Nintendo Co., Ltd
 
+usb:v057Ep0300*
+ ID_MODEL_FROM_DATABASE=USB-EXI Adapter (GCP-2000)
+
+usb:v057Ep0304*
+ ID_MODEL_FROM_DATABASE=RVT-H Reader
+
 usb:v057Ep0305*
  ID_MODEL_FROM_DATABASE=Broadcom BCM2045A Bluetooth Radio [Nintendo Wii]
 
@@ -21695,12 +22220,24 @@ usb:v057Ep0306*
 usb:v057Ep0337*
  ID_MODEL_FROM_DATABASE=Wii U GameCube Controller Adapter
 
+usb:v057Ep2000*
+ ID_MODEL_FROM_DATABASE=Switch
+
 usb:v057Ep2006*
  ID_MODEL_FROM_DATABASE=Joy-Con L
 
 usb:v057Ep2007*
  ID_MODEL_FROM_DATABASE=Joy-Con R
 
+usb:v057Ep2009*
+ ID_MODEL_FROM_DATABASE=Switch Pro Controller
+
+usb:v057Ep200E*
+ ID_MODEL_FROM_DATABASE=Joy-Con Charging Grip
+
+usb:v057Ep3000*
+ ID_MODEL_FROM_DATABASE=SDK Debugger
+
 usb:v057F*
  ID_VENDOR_FROM_DATABASE=QuickShot, Ltd
 
@@ -21713,6 +22250,12 @@ usb:v0580*
 usb:v0581*
  ID_VENDOR_FROM_DATABASE=Racal Data Group
 
+usb:v0581p0107*
+ ID_MODEL_FROM_DATABASE=Tera Barcode Scanner 2.4 GHz Receiver
+
+usb:v0581p020C*
+ ID_MODEL_FROM_DATABASE=Tera 2D Barcode Scanner EVHK0012
+
 usb:v0582*
  ID_VENDOR_FROM_DATABASE=Roland Corp.
 
@@ -22202,6 +22745,24 @@ usb:v0582p015B*
 usb:v0582p015D*
  ID_MODEL_FROM_DATABASE=R-88
 
+usb:v0582p01B5*
+ ID_MODEL_FROM_DATABASE=Boutique Series Synthesizer (Normal mode)
+
+usb:v0582p01B6*
+ ID_MODEL_FROM_DATABASE=Boutique Series Synthesizer (Storage mode)
+
+usb:v0582p01DF*
+ ID_MODEL_FROM_DATABASE=Rubix22
+
+usb:v0582p01E0*
+ ID_MODEL_FROM_DATABASE=Rubix24
+
+usb:v0582p01E1*
+ ID_MODEL_FROM_DATABASE=Rubix44
+
+usb:v0582p01EF*
+ ID_MODEL_FROM_DATABASE=Go:KEYS MIDI
+
 usb:v0582p0505*
  ID_MODEL_FROM_DATABASE=EDIROL UA-101
 
@@ -22232,6 +22793,9 @@ usb:v0583p2050*
 usb:v0583p205F*
  ID_MODEL_FROM_DATABASE=PSX/USB converter
 
+usb:v0583p2060*
+ ID_MODEL_FROM_DATABASE=2-axis 8-button gamepad
+
 usb:v0583p206F*
  ID_MODEL_FROM_DATABASE=USB, 2-axis 8-button gamepad
 
@@ -22658,6 +23222,9 @@ usb:v058F*
 usb:v058Fp1234*
  ID_MODEL_FROM_DATABASE=Flash Drive
 
+usb:v058Fp198B*
+ ID_MODEL_FROM_DATABASE=Webcam (Gigatech P-09)
+
 usb:v058Fp2412*
  ID_MODEL_FROM_DATABASE=SCard R/W CSR-145
 
@@ -22712,6 +23279,9 @@ usb:v058Fp6390*
 usb:v058Fp6391*
  ID_MODEL_FROM_DATABASE=IDE Bridge
 
+usb:v058Fp6998*
+ ID_MODEL_FROM_DATABASE=AU6998 Flash Disk Controller
+
 usb:v058Fp9213*
  ID_MODEL_FROM_DATABASE=MacAlly Kbd Hub
 
@@ -22799,6 +23369,9 @@ usb:v0590p000B*
 usb:v0590p0028*
  ID_MODEL_FROM_DATABASE=HJ-720IT / HEM-7080IT-E / HEM-790IT
 
+usb:v0590p0051*
+ ID_MODEL_FROM_DATABASE=FT232BM [E58CIFQ1 with FTDI USB2Serial Converter]
+
 usb:v0591*
  ID_VENDOR_FROM_DATABASE=Questra Consulting
 
@@ -23033,6 +23606,9 @@ usb:v059Fp0525*
 usb:v059Fp0641*
  ID_MODEL_FROM_DATABASE=Mobile Hard Drive
 
+usb:v059Fp0828*
+ ID_MODEL_FROM_DATABASE=d2 Quadra
+
 usb:v059Fp0829*
  ID_MODEL_FROM_DATABASE=BigDisk Extreme+
 
@@ -23063,12 +23639,18 @@ usb:v059Fp1027*
 usb:v059Fp102A*
  ID_MODEL_FROM_DATABASE=Rikiki Hard Drive
 
+usb:v059Fp103D*
+ ID_MODEL_FROM_DATABASE=D2
+
 usb:v059Fp1049*
  ID_MODEL_FROM_DATABASE=rikiki Harddrive
 
 usb:v059Fp1052*
  ID_MODEL_FROM_DATABASE=P'9220 Mobile Drive
 
+usb:v059Fp1053*
+ ID_MODEL_FROM_DATABASE=P'9230 2TB [Porsche Design Desktop Drive 2TB]
+
 usb:v059Fp1061*
  ID_MODEL_FROM_DATABASE=Rugged USB3-FW
 
@@ -23084,6 +23666,9 @@ usb:v059Fp106D*
 usb:v059Fp106E*
  ID_MODEL_FROM_DATABASE=Porsche Design Desktop Drive
 
+usb:v059Fp1094*
+ ID_MODEL_FROM_DATABASE=Rugged THB
+
 usb:v059FpA601*
  ID_MODEL_FROM_DATABASE=HardDrive
 
@@ -23168,6 +23753,9 @@ usb:v05A6p0003*
 usb:v05A6p0004*
  ID_MODEL_FROM_DATABASE=CVA122E Cable Voice Adapter (WDM)
 
+usb:v05A6p0008*
+ ID_MODEL_FROM_DATABASE=STA1520 Tuning Adapter
+
 usb:v05A6p0A00*
  ID_MODEL_FROM_DATABASE=Integrated Management Controller Hub
 
@@ -23222,6 +23810,9 @@ usb:v05A9p1550*
 usb:v05A9p2640*
  ID_MODEL_FROM_DATABASE=OV2640 Webcam
 
+usb:v05A9p2642*
+ ID_MODEL_FROM_DATABASE=Integrated Webcam for Dell XPS 2010
+
 usb:v05A9p2643*
  ID_MODEL_FROM_DATABASE=Monitor Webcam
 
@@ -23465,6 +24056,9 @@ usb:v05ACp024A*
 usb:v05ACp024D*
  ID_MODEL_FROM_DATABASE=Internal Keyboard/Trackpad (MacBook Air) (ISO)
 
+usb:v05ACp024F*
+ ID_MODEL_FROM_DATABASE=Aluminium Keyboard (ANSI)
+
 usb:v05ACp0250*
  ID_MODEL_FROM_DATABASE=Aluminium Keyboard (ISO)
 
@@ -23480,6 +24074,9 @@ usb:v05ACp0254*
 usb:v05ACp0259*
  ID_MODEL_FROM_DATABASE=Internal Keyboard/Trackpad
 
+usb:v05ACp025A*
+ ID_MODEL_FROM_DATABASE=Internal Keyboard/Trackpad
+
 usb:v05ACp0263*
  ID_MODEL_FROM_DATABASE=Apple Internal Keyboard / Trackpad (MacBook Retina)
 
@@ -23688,7 +24285,7 @@ usb:v05ACp12A6*
  ID_MODEL_FROM_DATABASE=iPad 3 (3G, 16 GB)
 
 usb:v05ACp12A8*
- ID_MODEL_FROM_DATABASE=iPhone5/5C/5S/6
+ ID_MODEL_FROM_DATABASE=iPhone 5/5C/5S/6/SE
 
 usb:v05ACp12A9*
  ID_MODEL_FROM_DATABASE=iPad 2
@@ -23711,6 +24308,18 @@ usb:v05ACp1302*
 usb:v05ACp1303*
  ID_MODEL_FROM_DATABASE=iPod Shuffle 4.Gen
 
+usb:v05ACp1392*
+ ID_MODEL_FROM_DATABASE=Apple Watch charger
+
+usb:v05ACp1393*
+ ID_MODEL_FROM_DATABASE=AirPods case
+
+usb:v05ACp1395*
+ ID_MODEL_FROM_DATABASE=Smart Battery Case [iPhone 6]
+
+usb:v05ACp1398*
+ ID_MODEL_FROM_DATABASE=Smart Battery Case
+
 usb:v05ACp1401*
  ID_MODEL_FROM_DATABASE=Modem
 
@@ -23789,6 +24398,9 @@ usb:v05ACp8281*
 usb:v05ACp8286*
  ID_MODEL_FROM_DATABASE=Bluetooth Host Controller
 
+usb:v05ACp8289*
+ ID_MODEL_FROM_DATABASE=Bluetooth Host Controller
+
 usb:v05ACp828C*
  ID_MODEL_FROM_DATABASE=Bluetooth Host Controller
 
@@ -23804,6 +24416,9 @@ usb:v05ACp8403*
 usb:v05ACp8404*
  ID_MODEL_FROM_DATABASE=Internal Memory Card Reader
 
+usb:v05ACp8406*
+ ID_MODEL_FROM_DATABASE=Internal Memory Card Reader
+
 usb:v05ACp8501*
  ID_MODEL_FROM_DATABASE=Built-in iSight [Micron]
 
@@ -23828,6 +24443,9 @@ usb:v05ACp850A*
 usb:v05ACp8510*
  ID_MODEL_FROM_DATABASE=FaceTime HD Camera (Built-in)
 
+usb:v05ACp8600*
+ ID_MODEL_FROM_DATABASE=iBridge
+
 usb:v05ACp911C*
  ID_MODEL_FROM_DATABASE=Hub in A1082 [Cinema HD Display 23"]
 
@@ -23925,11 +24543,14 @@ usb:v05B7*
  ID_VENDOR_FROM_DATABASE=Medianix Semiconductor, Inc.
 
 usb:v05B8*
- ID_VENDOR_FROM_DATABASE=Agiler, Inc.
+ ID_VENDOR_FROM_DATABASE=SYSGRATION
 
 usb:v05B8p3002*
  ID_MODEL_FROM_DATABASE=Scroll Mouse
 
+usb:v05B8p3126*
+ ID_MODEL_FROM_DATABASE=APT-905 Wireless presenter
+
 usb:v05B8p3223*
  ID_MODEL_FROM_DATABASE=ISY Wireless Presenter
 
@@ -23993,6 +24614,15 @@ usb:v05C6*
 usb:v05C6p0114*
  ID_MODEL_FROM_DATABASE=Select RW-200 CDMA Wireless Modem
 
+usb:v05C6p0A02*
+ ID_MODEL_FROM_DATABASE=Jolla Device Developer Mode
+
+usb:v05C6p0A07*
+ ID_MODEL_FROM_DATABASE=Jolla Device MTP
+
+usb:v05C6p0AFE*
+ ID_MODEL_FROM_DATABASE=Jolla Device Charging Only
+
 usb:v05C6p1000*
  ID_MODEL_FROM_DATABASE=Mass Storage Device
 
@@ -24036,7 +24666,25 @@ usb:v05C6p9018*
  ID_MODEL_FROM_DATABASE=Qualcomm HSUSB Device
 
 usb:v05C6p9025*
- ID_MODEL_FROM_DATABASE=Qualcomm HSUSB Device
+ ID_MODEL_FROM_DATABASE=HSUSB Device
+
+usb:v05C6p9090*
+ ID_MODEL_FROM_DATABASE=Quectel UC15
+
+usb:v05C6p9091*
+ ID_MODEL_FROM_DATABASE=Intex Aqua Fish & Jolla C Diagnostic Mode
+
+usb:v05C6p9092*
+ ID_MODEL_FROM_DATABASE=Nokia 8110 4G
+
+usb:v05C6p90BA*
+ ID_MODEL_FROM_DATABASE=Audio 1.0 device
+
+usb:v05C6p90BB*
+ ID_MODEL_FROM_DATABASE=Snapdragon interface (MIDI + ADB)
+
+usb:v05C6p90DC*
+ ID_MODEL_FROM_DATABASE=Fairphone 2 (Charging & ADB)
 
 usb:v05C6p9201*
  ID_MODEL_FROM_DATABASE=Gobi Wireless Modem (QDL mode)
@@ -24060,7 +24708,7 @@ usb:v05C6p9214*
  ID_MODEL_FROM_DATABASE=Acer Gobi 2000 Wireless Modem (QDL mode)
 
 usb:v05C6p9215*
- ID_MODEL_FROM_DATABASE=Acer Gobi 2000 Wireless Modem
+ ID_MODEL_FROM_DATABASE=Quectel EC20 LTE modem / Acer Gobi 2000 Wireless Modem
 
 usb:v05C6p9221*
  ID_MODEL_FROM_DATABASE=Gobi Wireless Modem (QDL mode)
@@ -24101,6 +24749,9 @@ usb:v05C6p9274*
 usb:v05C6p9275*
  ID_MODEL_FROM_DATABASE=iRex Technologies Gobi 2000 Wireless Modem
 
+usb:v05C6pF003*
+ ID_MODEL_FROM_DATABASE=Nokia 8110 4G
+
 usb:v05C7*
  ID_VENDOR_FROM_DATABASE=Qtronix Corp.
 
@@ -24131,6 +24782,9 @@ usb:v05C8p010B*
 usb:v05C8p021A*
  ID_MODEL_FROM_DATABASE=HP Webcam
 
+usb:v05C8p0233*
+ ID_MODEL_FROM_DATABASE=HP Webcam
+
 usb:v05C8p0318*
  ID_MODEL_FROM_DATABASE=Webcam
 
@@ -24140,6 +24794,21 @@ usb:v05C8p0361*
 usb:v05C8p036E*
  ID_MODEL_FROM_DATABASE=Webcam
 
+usb:v05C8p0374*
+ ID_MODEL_FROM_DATABASE=HP EliteBook integrated HD Webcam
+
+usb:v05C8p03A1*
+ ID_MODEL_FROM_DATABASE=XiaoMi Webcam
+
+usb:v05C8p03B1*
+ ID_MODEL_FROM_DATABASE=Webcam
+
+usb:v05C8p03BC*
+ ID_MODEL_FROM_DATABASE=HP Wide Vision HD Integrated Webcam
+
+usb:v05C8p03CB*
+ ID_MODEL_FROM_DATABASE=HP Wide Vision HD Integrated Webcam
+
 usb:v05C8p0403*
  ID_MODEL_FROM_DATABASE=Webcam
 
@@ -24176,6 +24845,12 @@ usb:v05CAp0405*
 usb:v05CAp0406*
  ID_MODEL_FROM_DATABASE=Type 102
 
+usb:v05CAp0437*
+ ID_MODEL_FROM_DATABASE=Aficio SP 3510SF
+
+usb:v05CAp044E*
+ ID_MODEL_FROM_DATABASE=SP C250SF (multifunction device: printer, scanner, fax)
+
 usb:v05CAp1803*
  ID_MODEL_FROM_DATABASE=V5 camera [R5U870]
 
@@ -24230,12 +24905,18 @@ usb:v05CAp183D*
 usb:v05CAp183E*
  ID_MODEL_FROM_DATABASE=Visual Communication Camera VGP-VCC9 [R5U870]
 
+usb:v05CAp183F*
+ ID_MODEL_FROM_DATABASE=Sony Visual Communication Camera Integrated Webcam
+
 usb:v05CAp1841*
  ID_MODEL_FROM_DATABASE=Fujitsu F01/ Lifebook U810 [R5U870]
 
 usb:v05CAp1870*
  ID_MODEL_FROM_DATABASE=Webcam 1000
 
+usb:v05CAp1880*
+ ID_MODEL_FROM_DATABASE=R5U880
+
 usb:v05CAp18B0*
  ID_MODEL_FROM_DATABASE=Sony Vaio Integrated Webcam
 
@@ -24893,6 +25574,9 @@ usb:v05DCp4D12*
 usb:v05DCp4D30*
  ID_MODEL_FROM_DATABASE=MP3 Player
 
+usb:v05DCpA201*
+ ID_MODEL_FROM_DATABASE=JumpDrive S70 4GB
+
 usb:v05DCpA209*
  ID_MODEL_FROM_DATABASE=JumpDrive S70
 
@@ -25010,6 +25694,9 @@ usb:v05DCpC75C*
 usb:v05DD*
  ID_VENDOR_FROM_DATABASE=Delta Electronics, Inc.
 
+usb:v05DDpA011*
+ ID_MODEL_FROM_DATABASE=HID UPS Battery
+
 usb:v05DDpFF31*
  ID_MODEL_FROM_DATABASE=AWU-120
 
@@ -25142,11 +25829,14 @@ usb:v05E3p0503*
 usb:v05E3p0504*
  ID_MODEL_FROM_DATABASE=HID Keyboard Filter
 
+usb:v05E3p0510*
+ ID_MODEL_FROM_DATABASE=Camera
+
 usb:v05E3p0604*
  ID_MODEL_FROM_DATABASE=USB 1.1 Hub
 
 usb:v05E3p0605*
- ID_MODEL_FROM_DATABASE=USB 2.0 Hub
+ ID_MODEL_FROM_DATABASE=Hub
 
 usb:v05E3p0606*
  ID_MODEL_FROM_DATABASE=USB 2.0 Hub / D-Link DUB-H4 USB 2.0 Hub
@@ -25158,7 +25848,7 @@ usb:v05E3p0608*
  ID_MODEL_FROM_DATABASE=Hub
 
 usb:v05E3p0610*
- ID_MODEL_FROM_DATABASE=4-port hub
+ ID_MODEL_FROM_DATABASE=Hub
 
 usb:v05E3p0612*
  ID_MODEL_FROM_DATABASE=Hub
@@ -25224,7 +25914,7 @@ usb:v05E3p0715*
  ID_MODEL_FROM_DATABASE=USB 2.0 microSD Reader
 
 usb:v05E3p0716*
- ID_MODEL_FROM_DATABASE=USB 2.0 Multislot Card Reader/Writer
+ ID_MODEL_FROM_DATABASE=Multislot Card Reader/Writer
 
 usb:v05E3p0717*
  ID_MODEL_FROM_DATABASE=All-in-1 Card Reader
@@ -25254,7 +25944,7 @@ usb:v05E3p0732*
  ID_MODEL_FROM_DATABASE=All-in-One Cardreader
 
 usb:v05E3p0736*
- ID_MODEL_FROM_DATABASE=microSD Reader/Writer
+ ID_MODEL_FROM_DATABASE=Colour arc SD Card Reader [PISEN]
 
 usb:v05E3p0738*
  ID_MODEL_FROM_DATABASE=Card reader
@@ -25271,6 +25961,9 @@ usb:v05E3p0745*
 usb:v05E3p0748*
  ID_MODEL_FROM_DATABASE=All-in-One Cardreader
 
+usb:v05E3p0749*
+ ID_MODEL_FROM_DATABASE=SD Card Reader and Writer
+
 usb:v05E3p0751*
  ID_MODEL_FROM_DATABASE=microSD Card Reader
 
@@ -25430,6 +26123,9 @@ usb:v05F9p1104*
 usb:v05F9p1206*
  ID_MODEL_FROM_DATABASE=Gryphon series (OEM mode)
 
+usb:v05F9p120C*
+ ID_MODEL_FROM_DATABASE=Gryphon GD4430-BK
+
 usb:v05F9p2202*
  ID_MODEL_FROM_DATABASE=Point of Sale Handheld Scanner
 
@@ -25490,6 +26186,9 @@ usb:v05FDp0253*
 usb:v05FDp0286*
  ID_MODEL_FROM_DATABASE=SV-286 Cyclone Digital
 
+usb:v05FDp1007*
+ ID_MODEL_FROM_DATABASE=Mad Catz Controller
+
 usb:v05FDp107A*
  ID_MODEL_FROM_DATABASE=PowerPad Pro X-Box pad
 
@@ -25535,6 +26234,12 @@ usb:v05FEp1010*
 usb:v05FEp2001*
  ID_MODEL_FROM_DATABASE=Microsoft Wireless Receiver 700
 
+usb:v05FEp3030*
+ ID_MODEL_FROM_DATABASE=Controller
+
+usb:v05FEp3031*
+ ID_MODEL_FROM_DATABASE=Controller
+
 usb:v05FF*
  ID_VENDOR_FROM_DATABASE=LeCroy Corp.
 
@@ -25556,6 +26261,9 @@ usb:v0602p1001*
 usb:v0603*
  ID_VENDOR_FROM_DATABASE=Novatek Microelectronics Corp.
 
+usb:v0603p0002*
+ ID_MODEL_FROM_DATABASE=Sino Wealth keyboard/mouse 2.4 GHz receiver
+
 usb:v0603p00F1*
  ID_MODEL_FROM_DATABASE=Keyboard (Labtec Ultra Flat Keyboard)
 
@@ -25625,6 +26333,9 @@ usb:v060Bp2231*
 usb:v060Bp2270*
  ID_MODEL_FROM_DATABASE=Gigabyte K8100 Aivia Gaming Keyboard
 
+usb:v060Bp500A*
+ ID_MODEL_FROM_DATABASE=Cougar 500k Gaming Keyboard
+
 usb:v060Bp5253*
  ID_MODEL_FROM_DATABASE=Thermaltake MEKA G-Unit Gaming Keyboard
 
@@ -25784,6 +26495,9 @@ usb:v0623*
 usb:v0624*
  ID_VENDOR_FROM_DATABASE=Avocent Corp.
 
+usb:v0624p0013*
+ ID_MODEL_FROM_DATABASE=SC Secure KVM
+
 usb:v0624p0248*
  ID_MODEL_FROM_DATABASE=Virtual Hub
 
@@ -25793,6 +26507,9 @@ usb:v0624p0249*
 usb:v0624p0251*
  ID_MODEL_FROM_DATABASE=Virtual Mass Storage
 
+usb:v0624p0252*
+ ID_MODEL_FROM_DATABASE=Virtual SD card reader
+
 usb:v0624p0294*
  ID_MODEL_FROM_DATABASE=Dell 03R874 KVM dongle
 
@@ -25802,6 +26519,9 @@ usb:v0624p0402*
 usb:v0624p0403*
  ID_MODEL_FROM_DATABASE=Cisco Virtual Mass Storage
 
+usb:v0624p1774*
+ ID_MODEL_FROM_DATABASE=Cybex SC985
+
 usb:v0625*
  ID_VENDOR_FROM_DATABASE=TiMedia Technology Co., Ltd
 
@@ -25826,6 +26546,12 @@ usb:v062Ap0000*
 usb:v062Ap0001*
  ID_MODEL_FROM_DATABASE=Notebook Optical Mouse
 
+usb:v062Ap0020*
+ ID_MODEL_FROM_DATABASE=Logic3 Gamepad
+
+usb:v062Ap0033*
+ ID_MODEL_FROM_DATABASE=Competition Pro Steering Wheel
+
 usb:v062Ap0102*
  ID_MODEL_FROM_DATABASE=Wireless Keyboard/Mouse Combo [MK1152WC]
 
@@ -25844,6 +26570,15 @@ usb:v062Ap3286*
 usb:v062Ap4101*
  ID_MODEL_FROM_DATABASE=Wireless Keyboard/Mouse
 
+usb:v062Ap4102*
+ ID_MODEL_FROM_DATABASE=Wireless Mouse
+
+usb:v062Ap4106*
+ ID_MODEL_FROM_DATABASE=Wireless Mouse 2.4G
+
+usb:v062Ap4C01*
+ ID_MODEL_FROM_DATABASE=2,4Ghz Wireless Transceiver [for Delux M618 Plus Wireless Vertical Mouse]
+
 usb:v062Ap6301*
  ID_MODEL_FROM_DATABASE=Trust Wireless Optical Mouse MI-4150K
 
@@ -25910,6 +26645,9 @@ usb:v0638p0A15*
 usb:v0638p0A16*
  ID_MODEL_FROM_DATABASE=Konica Minolta SC-215
 
+usb:v0638p0A2A*
+ ID_MODEL_FROM_DATABASE=AV220 C2
+
 usb:v0638p0A30*
  ID_MODEL_FROM_DATABASE=UMAX Astra 6700 Scanner
 
@@ -26045,6 +26783,9 @@ usb:v064E*
 usb:v064Ep2100*
  ID_MODEL_FROM_DATABASE=Sony Visual Communication Camera
 
+usb:v064Ep3410*
+ ID_MODEL_FROM_DATABASE=RGBIR Camera
+
 usb:v064Ep9700*
  ID_MODEL_FROM_DATABASE=Asus Integrated Webcam
 
@@ -26069,6 +26810,9 @@ usb:v064EpA114*
 usb:v064EpA116*
  ID_MODEL_FROM_DATABASE=UVC 1.3MPixel WebCam
 
+usb:v064EpA127*
+ ID_MODEL_FROM_DATABASE=HP Integrated Webcam
+
 usb:v064EpA136*
  ID_MODEL_FROM_DATABASE=Asus Integrated Webcam [CN031B]
 
@@ -26108,6 +26852,9 @@ usb:v064EpF102*
 usb:v064EpF103*
  ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam [R5U877]
 
+usb:v064EpF207*
+ ID_MODEL_FROM_DATABASE=Lenovo EasyCamera Integrated Webcam
+
 usb:v064EpF209*
  ID_MODEL_FROM_DATABASE=HP Webcam
 
@@ -26633,6 +27380,9 @@ usb:v066Fp8320*
 usb:v066Fp835D*
  ID_MODEL_FROM_DATABASE=MP3 Player
 
+usb:v066Fp83B5*
+ ID_MODEL_FROM_DATABASE=Transcend T.sonic 530 MP3 Player
+
 usb:v066Fp9000*
  ID_MODEL_FROM_DATABASE=MP3 Player
 
@@ -26726,6 +27476,9 @@ usb:v067Bp0610*
 usb:v067Bp0611*
  ID_MODEL_FROM_DATABASE=AlDiga AL-11U Quad-band GSM/GPRS/EDGE modem
 
+usb:v067Bp1231*
+ ID_MODEL_FROM_DATABASE=Orico SATA External Hard Disk Drive Lay-Flat Docking Station with USB 3.0 & eSATA interfaces.
+
 usb:v067Bp2303*
  ID_MODEL_FROM_DATABASE=PL2303 Serial Port
 
@@ -26768,6 +27521,9 @@ usb:v067Bp2517*
 usb:v067Bp2528*
  ID_MODEL_FROM_DATABASE=Storage device (8gB thumb drive)
 
+usb:v067Bp2571*
+ ID_MODEL_FROM_DATABASE=LG Electronics GE24LU21
+
 usb:v067Bp25A1*
  ID_MODEL_FROM_DATABASE=PL25A1 Host-Host Bridge
 
@@ -26966,6 +27722,12 @@ usb:v0686p300B*
 usb:v0686p300C*
  ID_MODEL_FROM_DATABASE=PagePro 1300W
 
+usb:v0686p301B*
+ ID_MODEL_FROM_DATABASE=Develop D 1650iD
+
+usb:v0686p3023*
+ ID_MODEL_FROM_DATABASE=Develop D 2050iD
+
 usb:v0686p302E*
  ID_MODEL_FROM_DATABASE=Develop D 1650iD PCL
 
@@ -27095,6 +27857,12 @@ usb:v068Ep0501*
 usb:v068Ep0504*
  ID_MODEL_FROM_DATABASE=F-16 Combat Stick
 
+usb:v068F*
+ ID_VENDOR_FROM_DATABASE=Nihon KOHDEN
+
+usb:v068FpC00D*
+ ID_MODEL_FROM_DATABASE=MEK-6500
+
 usb:v0690*
  ID_VENDOR_FROM_DATABASE=Golden Bridge Electech, Inc.
 
@@ -27152,6 +27920,9 @@ usb:v0699*
 usb:v0699p0347*
  ID_MODEL_FROM_DATABASE=AFG 3022B
 
+usb:v0699p0365*
+ ID_MODEL_FROM_DATABASE=TDS 2004B
+
 usb:v0699p036A*
  ID_MODEL_FROM_DATABASE=TDS 2024B
 
@@ -27294,7 +28065,10 @@ usb:v06A3p0160*
  ID_MODEL_FROM_DATABASE=ST290 Pro
 
 usb:v06A3p0200*
- ID_MODEL_FROM_DATABASE=Xbox Adrenalin Hub
+ ID_MODEL_FROM_DATABASE=Racing Wheel
+
+usb:v06A3p0201*
+ ID_MODEL_FROM_DATABASE=Adrenalin Gamepad
 
 usb:v06A3p0241*
  ID_MODEL_FROM_DATABASE=Xbox Adrenalin Gamepad
@@ -27461,6 +28235,9 @@ usb:v06A3pA502*
 usb:v06A3pF518*
  ID_MODEL_FROM_DATABASE=P3200 Rumble Force Game Pad
 
+usb:v06A3pF51A*
+ ID_MODEL_FROM_DATABASE=P3600
+
 usb:v06A3pFF04*
  ID_MODEL_FROM_DATABASE=R440 Force Wheel
 
@@ -27815,6 +28592,15 @@ usb:v06CBp0010*
 usb:v06CBp0013*
  ID_MODEL_FROM_DATABASE=DisplayPad
 
+usb:v06CBp009A*
+ ID_MODEL_FROM_DATABASE=Metallica MIS Touch Fingerprint Reader
+
+usb:v06CBp00A2*
+ ID_MODEL_FROM_DATABASE=Metallica MOH Touch Fingerprint Reader
+
+usb:v06CBp00BD*
+ ID_MODEL_FROM_DATABASE=Prometheus MIS Touch Fingerprint Reader
+
 usb:v06CBp2970*
  ID_MODEL_FROM_DATABASE=touchpad
 
@@ -28016,6 +28802,9 @@ usb:v06D3p03AD*
 usb:v06D3p03AE*
  ID_MODEL_FROM_DATABASE=CP-9800DW-S
 
+usb:v06D3p0F10*
+ ID_MODEL_FROM_DATABASE=Hori/Namco FlightStick 2
+
 usb:v06D3p3B10*
  ID_MODEL_FROM_DATABASE=P95D
 
@@ -28037,6 +28826,9 @@ usb:v06D3p3B50*
 usb:v06D3p3B60*
  ID_MODEL_FROM_DATABASE=CP-D90DW
 
+usb:v06D3p3B80*
+ ID_MODEL_FROM_DATABASE=CP-M1
+
 usb:v06D4*
  ID_VENDOR_FROM_DATABASE=Cisco Systems
 
@@ -28667,6 +29459,9 @@ usb:v0711p0232*
 usb:v0711p0240*
  ID_MODEL_FROM_DATABASE=PS/2 to USB Converter
 
+usb:v0711p0260*
+ ID_MODEL_FROM_DATABASE=PS/2 Keyboard and Mouse
+
 usb:v0711p0300*
  ID_MODEL_FROM_DATABASE=BAY-3U1S1P Parallel Port
 
@@ -29075,26 +29870,41 @@ usb:v0736*
 usb:v0738*
  ID_VENDOR_FROM_DATABASE=Mad Catz, Inc.
 
+usb:v0738p2215*
+ ID_MODEL_FROM_DATABASE=X-55 Rhino Stick
+
+usb:v0738p2237*
+ ID_MODEL_FROM_DATABASE=V.1 Stick
+
+usb:v0738p4506*
+ ID_MODEL_FROM_DATABASE=Wireless Controller
+
 usb:v0738p4507*
  ID_MODEL_FROM_DATABASE=XBox Device
 
 usb:v0738p4516*
- ID_MODEL_FROM_DATABASE=XBox Device
+ ID_MODEL_FROM_DATABASE=Control Pad
 
 usb:v0738p4520*
- ID_MODEL_FROM_DATABASE=XBox Device
+ ID_MODEL_FROM_DATABASE=Control Pad Pro
+
+usb:v0738p4522*
+ ID_MODEL_FROM_DATABASE=LumiCON
 
 usb:v0738p4526*
- ID_MODEL_FROM_DATABASE=XBox Device
+ ID_MODEL_FROM_DATABASE=Control Pad Pro
+
+usb:v0738p4530*
+ ID_MODEL_FROM_DATABASE=Universal MC2 Racing Wheel and Pedals
 
 usb:v0738p4536*
- ID_MODEL_FROM_DATABASE=XBox Device
+ ID_MODEL_FROM_DATABASE=MicroCON
 
 usb:v0738p4540*
- ID_MODEL_FROM_DATABASE=XBox Device
+ ID_MODEL_FROM_DATABASE=Beat Pad
 
 usb:v0738p4556*
- ID_MODEL_FROM_DATABASE=XBox Device
+ ID_MODEL_FROM_DATABASE=Lynx Wireless Controller
 
 usb:v0738p4566*
  ID_MODEL_FROM_DATABASE=XBox Device
@@ -29103,14 +29913,83 @@ usb:v0738p4576*
  ID_MODEL_FROM_DATABASE=XBox Device
 
 usb:v0738p4586*
- ID_MODEL_FROM_DATABASE=XBox Device
+ ID_MODEL_FROM_DATABASE=MicroCON Wireless Controller
 
 usb:v0738p4588*
- ID_MODEL_FROM_DATABASE=XBox Device
+ ID_MODEL_FROM_DATABASE=Blaster
+
+usb:v0738p45FF*
+ ID_MODEL_FROM_DATABASE=Beat Pad
+
+usb:v0738p4716*
+ ID_MODEL_FROM_DATABASE=Wired Xbox 360 Controller
+
+usb:v0738p4718*
+ ID_MODEL_FROM_DATABASE=Street Fighter IV FightStick SE for Xbox 360
+
+usb:v0738p4726*
+ ID_MODEL_FROM_DATABASE=Xbox 360 Controller
+
+usb:v0738p4728*
+ ID_MODEL_FROM_DATABASE=Street Fighter IV FightPad for Xbox 360
+
+usb:v0738p4730*
+ ID_MODEL_FROM_DATABASE=MC2 Racing Wheel for Xbox 360
+
+usb:v0738p4736*
+ ID_MODEL_FROM_DATABASE=MicroCON for Xbox 360
+
+usb:v0738p4738*
+ ID_MODEL_FROM_DATABASE=Street Fighter IV Wired Controller for Xbox 360
+
+usb:v0738p4740*
+ ID_MODEL_FROM_DATABASE=Beat Pad for Xbox 360
+
+usb:v0738p4743*
+ ID_MODEL_FROM_DATABASE=Beat Pad Pro
+
+usb:v0738p4758*
+ ID_MODEL_FROM_DATABASE=Arcade Game Stick
+
+usb:v0738p4A01*
+ ID_MODEL_FROM_DATABASE=FightStick TE 2 for Xbox One
+
+usb:v0738p6040*
+ ID_MODEL_FROM_DATABASE=Beat Pad Pro
 
 usb:v0738p8818*
  ID_MODEL_FROM_DATABASE=Street Fighter IV Arcade FightStick (PS3)
 
+usb:v0738p9871*
+ ID_MODEL_FROM_DATABASE=Portable Drum Kit
+
+usb:v0738pA109*
+ ID_MODEL_FROM_DATABASE=S.T.R.I.K.E.7 Keyboard
+
+usb:v0738pA215*
+ ID_MODEL_FROM_DATABASE=X-55 Rhino Throttle
+
+usb:v0738pB726*
+ ID_MODEL_FROM_DATABASE=Modern Warfare 2 Controller for Xbox 360
+
+usb:v0738pB738*
+ ID_MODEL_FROM_DATABASE=Marvel VS Capcom 2 TE FightStick for Xbox 360
+
+usb:v0738pBEEF*
+ ID_MODEL_FROM_DATABASE=Joytech Neo SE Advanced Gamepad
+
+usb:v0738pCB02*
+ ID_MODEL_FROM_DATABASE=Saitek Cyborg Rumble Pad
+
+usb:v0738pCB03*
+ ID_MODEL_FROM_DATABASE=Saitek P3200 Rumble Pad
+
+usb:v0738pCB29*
+ ID_MODEL_FROM_DATABASE=Saitek Aviator Stick AV8R02
+
+usb:v0738pF738*
+ ID_MODEL_FROM_DATABASE=Super Street Fighter IV FightStick TE S for Xbox 360
+
 usb:v073A*
  ID_VENDOR_FROM_DATABASE=Chaplet Systems, Inc.
 
@@ -29153,6 +30032,9 @@ usb:v073Cp0624*
 usb:v073D*
  ID_VENDOR_FROM_DATABASE=Eutron S.p.a.
 
+usb:v073Dp0000*
+ ID_MODEL_FROM_DATABASE=SmartKey
+
 usb:v073Dp0005*
  ID_MODEL_FROM_DATABASE=Crypto Token
 
@@ -29192,6 +30074,9 @@ usb:v0745*
 usb:v0746*
  ID_VENDOR_FROM_DATABASE=Onkyo Corp.
 
+usb:v0746p4700*
+ ID_MODEL_FROM_DATABASE=Integra MZA-4.7
+
 usb:v0746p5500*
  ID_MODEL_FROM_DATABASE=SE-U55 Audio Device
 
@@ -29240,6 +30125,9 @@ usb:v0755*
 usb:v0757*
  ID_VENDOR_FROM_DATABASE=Network Technologies, Inc.
 
+usb:v0757p0A00*
+ ID_MODEL_FROM_DATABASE=SUN Adapter
+
 usb:v0758*
  ID_VENDOR_FROM_DATABASE=Carl Zeiss Microscopy GmbH
 
@@ -29465,6 +30353,9 @@ usb:v0765pD094*
 usb:v0766*
  ID_VENDOR_FROM_DATABASE=Jess-Link Products Co., Ltd
 
+usb:v0766p0017*
+ ID_MODEL_FROM_DATABASE=Packard Bell Carbon
+
 usb:v0766p001B*
  ID_MODEL_FROM_DATABASE=Packard Bell Go
 
@@ -29517,10 +30408,10 @@ usb:v076Bp1784*
  ID_MODEL_FROM_DATABASE=CardMan 6020
 
 usb:v076Bp3021*
- ID_MODEL_FROM_DATABASE=CardMan 3121
+ ID_MODEL_FROM_DATABASE=CardMan 3021 / 3121
 
 usb:v076Bp3022*
- ID_MODEL_FROM_DATABASE=CardMan 3021
+ ID_MODEL_FROM_DATABASE=CardMan 3121 (HID Technologies)
 
 usb:v076Bp3610*
  ID_MODEL_FROM_DATABASE=CardMan 3620
@@ -29567,6 +30458,12 @@ usb:v076BpC001*
 usb:v076C*
  ID_VENDOR_FROM_DATABASE=Partner Tech
 
+usb:v076Cp0204*
+ ID_MODEL_FROM_DATABASE=CD7220 Communications Port
+
+usb:v076Cp0302*
+ ID_MODEL_FROM_DATABASE=RP-600
+
 usb:v076D*
  ID_VENDOR_FROM_DATABASE=Denso Corp.
 
@@ -29607,7 +30504,13 @@ usb:v0778*
  ID_VENDOR_FROM_DATABASE=Volex, Inc.
 
 usb:v0779*
- ID_VENDOR_FROM_DATABASE=Fairchild Semiconductor
+ ID_VENDOR_FROM_DATABASE=ON Semiconductor (formerly Fairchild)
+
+usb:v0779p0133*
+ ID_MODEL_FROM_DATABASE=FUSB307B
+
+usb:v0779p0134*
+ ID_MODEL_FROM_DATABASE=FUSB308B
 
 usb:v077A*
  ID_VENDOR_FROM_DATABASE=Sankyo Seiki Mfg. Co., Ltd
@@ -29660,6 +30563,18 @@ usb:v077Dp1016*
 usb:v077Dp627A*
  ID_MODEL_FROM_DATABASE=Radio SHARK
 
+usb:v077E*
+ ID_VENDOR_FROM_DATABASE=Softing AG
+
+usb:v077Ep008A*
+ ID_MODEL_FROM_DATABASE=NetLink Compact MPI/Profibus adapter
+
+usb:v077Ep0160*
+ ID_MODEL_FROM_DATABASE=EDICblue
+
+usb:v077Ep0220*
+ ID_MODEL_FROM_DATABASE=VAS5054A
+
 usb:v077F*
  ID_VENDOR_FROM_DATABASE=Well Excellent & Most Corp.
 
@@ -29769,7 +30684,7 @@ usb:v0781p5577*
  ID_MODEL_FROM_DATABASE=Cruzer Pop (8GB)
 
 usb:v0781p557D*
- ID_MODEL_FROM_DATABASE=Cruzer Force (64GB)
+ ID_MODEL_FROM_DATABASE=Cruzer Force
 
 usb:v0781p5580*
  ID_MODEL_FROM_DATABASE=SDCZ80 Flash Drive
@@ -29780,6 +30695,15 @@ usb:v0781p5581*
 usb:v0781p5583*
  ID_MODEL_FROM_DATABASE=Ultra Fit
 
+usb:v0781p5588*
+ ID_MODEL_FROM_DATABASE=Extreme Pro
+
+usb:v0781p5589*
+ ID_MODEL_FROM_DATABASE=SD8SB8U512G[Extreme 500]
+
+usb:v0781p558C*
+ ID_MODEL_FROM_DATABASE=Extreme Portable SSD
+
 usb:v0781p5590*
  ID_MODEL_FROM_DATABASE=Ultra Dual
 
@@ -29792,6 +30716,9 @@ usb:v0781p5E10*
 usb:v0781p6100*
  ID_MODEL_FROM_DATABASE=Ultra II SD Plus 2GB
 
+usb:v0781p6500*
+ ID_MODEL_FROM_DATABASE=uSSD 5000
+
 usb:v0781p7100*
  ID_MODEL_FROM_DATABASE=Cruzer Mini
 
@@ -29963,9 +30890,15 @@ usb:v0781pA7E8*
 usb:v0781pB2B3*
  ID_MODEL_FROM_DATABASE=SDDR-103 MobileMate SD+ Reader
 
+usb:v0781pB2B5*
+ ID_MODEL_FROM_DATABASE=SDDR-104 MobileMate SD+ Reader
+
 usb:v0781pB4B5*
  ID_MODEL_FROM_DATABASE=SDDR-89 V4 ImageMate 12-in-1 Reader
 
+usb:v0781pB6B7*
+ ID_MODEL_FROM_DATABASE=SDDR-99 V4 ImageMate 5-in-1 Reader
+
 usb:v0781pB6BA*
  ID_MODEL_FROM_DATABASE=CF SDDR-289
 
@@ -30047,6 +30980,9 @@ usb:v0789p0064*
 usb:v0789p00B3*
  ID_MODEL_FROM_DATABASE=DVD Multi-plus unit LDR-H443U2
 
+usb:v0789p00CC*
+ ID_MODEL_FROM_DATABASE=LHD Device
+
 usb:v0789p0105*
  ID_MODEL_FROM_DATABASE=LAN-TX/U1H2 10/100 Ethernet Adapter [pegasus II]
 
@@ -30255,10 +31191,10 @@ usb:v07A6p8511*
  ID_MODEL_FROM_DATABASE=ADM8511 Pegasus II Ethernet
 
 usb:v07A6p8513*
- ID_MODEL_FROM_DATABASE=AN8513 Ethernet
+ ID_MODEL_FROM_DATABASE=ADM8513 Pegasus II Ethernet
 
 usb:v07A6p8515*
- ID_MODEL_FROM_DATABASE=AN8515 Ethernet
+ ID_MODEL_FROM_DATABASE=ADM8515 Pegasus II Ethernet
 
 usb:v07AA*
  ID_VENDOR_FROM_DATABASE=Corega K.K.
@@ -30344,6 +31280,9 @@ usb:v07ABpFC02*
 usb:v07ABpFC03*
  ID_MODEL_FROM_DATABASE=USB2-IDE IDE bridge
 
+usb:v07ABpFC77*
+ ID_MODEL_FROM_DATABASE=Quattro 3.0
+
 usb:v07ABpFCD6*
  ID_MODEL_FROM_DATABASE=Freecom HD Classic
 
@@ -30446,6 +31385,9 @@ usb:v07B2p5120*
 usb:v07B2p5121*
  ID_MODEL_FROM_DATABASE=Surfboard 5121 Cable Modem
 
+usb:v07B2p6002*
+ ID_MODEL_FROM_DATABASE=MTR7000 Cable Tuning Adapter
+
 usb:v07B2p7030*
  ID_MODEL_FROM_DATABASE=WU830G 802.11bg Wireless Adapter [Envara WiND512]
 
@@ -30512,6 +31454,9 @@ usb:v07B3p0601*
 usb:v07B3p0800*
  ID_MODEL_FROM_DATABASE=OpticPro ST48 Scanner
 
+usb:v07B3p0807*
+ ID_MODEL_FROM_DATABASE=OpticFilm 7200 scanner
+
 usb:v07B3p0900*
  ID_MODEL_FROM_DATABASE=OpticBook 3600 Scanner
 
@@ -30551,6 +31496,9 @@ usb:v07B3p1300*
 usb:v07B3p1301*
  ID_MODEL_FROM_DATABASE=OpticBook 4800 Scanner
 
+usb:v07B3p130F*
+ ID_MODEL_FROM_DATABASE=Bookreader v200
+
 usb:v07B4*
  ID_VENDOR_FROM_DATABASE=Olympus Optical Co., Ltd
 
@@ -30626,6 +31574,9 @@ usb:v07B4p024F*
 usb:v07B4p0280*
  ID_MODEL_FROM_DATABASE=m:robe 100
 
+usb:v07B4p0295*
+ ID_MODEL_FROM_DATABASE=Digital Voice Recorder VN-541PC
+
 usb:v07B5*
  ID_VENDOR_FROM_DATABASE=Mega World International, Ltd
 
@@ -30821,6 +31772,9 @@ usb:v07BD*
 usb:v07BE*
  ID_VENDOR_FROM_DATABASE=Veridicom
 
+usb:v07BEp1935*
+ ID_MODEL_FROM_DATABASE=Elektron Music Machines
+
 usb:v07C0*
  ID_VENDOR_FROM_DATABASE=Code Mercenaries Hard- und Software GmbH
 
@@ -30998,6 +31952,9 @@ usb:v07CAp1228*
 usb:v07CAp1830*
  ID_MODEL_FROM_DATABASE=AVerTV Volar Video Capture (H830)
 
+usb:v07CAp1871*
+ ID_MODEL_FROM_DATABASE=TD310 DVB-T/T2/C dongle
+
 usb:v07CAp3835*
  ID_MODEL_FROM_DATABASE=AVerTV Volar Green HD (A835B)
 
@@ -31220,6 +32177,18 @@ usb:v07CD*
 usb:v07CDp0001*
  ID_MODEL_FROM_DATABASE=USBuart Serial Port
 
+usb:v07CE*
+ ID_VENDOR_FROM_DATABASE=Nidec Copal
+
+usb:v07CEpC007*
+ ID_MODEL_FROM_DATABASE=DPB-4000
+
+usb:v07CEpC009*
+ ID_MODEL_FROM_DATABASE=DPB-6000
+
+usb:v07CEpC010*
+ ID_MODEL_FROM_DATABASE=CPB-7000
+
 usb:v07CF*
  ID_VENDOR_FROM_DATABASE=Casio Computer Co., Ltd
 
@@ -31283,6 +32252,9 @@ usb:v07CFp6801*
 usb:v07CFp6802*
  ID_MODEL_FROM_DATABASE=MIDI Keyboard
 
+usb:v07CFp6803*
+ ID_MODEL_FROM_DATABASE=CTK-3500 (MIDI keyboard)
+
 usb:v07D0*
  ID_VENDOR_FROM_DATABASE=Dazzle
 
@@ -31619,12 +32591,21 @@ usb:v07FDp0001*
 usb:v07FDp0002*
  ID_MODEL_FROM_DATABASE=MOTU Audio for 64 bit
 
+usb:v07FDp0004*
+ ID_MODEL_FROM_DATABASE=MicroBook
+
+usb:v07FDp0008*
+ ID_MODEL_FROM_DATABASE=M Series
+
 usb:v07FF*
  ID_VENDOR_FROM_DATABASE=Unknown
 
 usb:v07FFp00FF*
  ID_MODEL_FROM_DATABASE=Portable Hard Drive
 
+usb:v07FFpFFFF*
+ ID_MODEL_FROM_DATABASE=Mad Catz Gamepad
+
 usb:v0801*
  ID_VENDOR_FROM_DATABASE=MagTek
 
@@ -31769,6 +32750,12 @@ usb:v081E*
 usb:v081EpDF00*
  ID_MODEL_FROM_DATABASE=Handheld
 
+usb:v081F*
+ ID_VENDOR_FROM_DATABASE=Manta
+
+usb:v081FpE401*
+ ID_MODEL_FROM_DATABASE=MM812
+
 usb:v0822*
  ID_VENDOR_FROM_DATABASE=Reudo Corp.
 
@@ -32003,6 +32990,9 @@ usb:v0839p1009*
 usb:v0839p1012*
  ID_MODEL_FROM_DATABASE=6500 Document Camera
 
+usb:v0839p103F*
+ ID_MODEL_FROM_DATABASE=Digimax S500
+
 usb:v0839p1058*
  ID_MODEL_FROM_DATABASE=S730 Camera
 
@@ -32204,6 +33194,9 @@ usb:v0846p4301*
 usb:v0846p5F00*
  ID_MODEL_FROM_DATABASE=WPN111 802.11g Wireless Adapter [Atheros AR5523]
 
+usb:v0846p68E1*
+ ID_MODEL_FROM_DATABASE=LB1120-100NAS
+
 usb:v0846p6A00*
  ID_MODEL_FROM_DATABASE=WG111v2 54 Mbps Wireless [RealTek RTL8187L]
 
@@ -32261,6 +33254,9 @@ usb:v0846p9051*
 usb:v0846p9052*
  ID_MODEL_FROM_DATABASE=A6100 AC600 DB Wireless Adapter [Realtek RTL8811AU]
 
+usb:v0846p9054*
+ ID_MODEL_FROM_DATABASE=Nighthawk A7000 802.11ac Wireless Adapter AC1900 [Realtek 8814AU]
+
 usb:v0846pA001*
  ID_MODEL_FROM_DATABASE=PA101 10 Mbps HPNA Home Phoneline RJ-1
 
@@ -32333,6 +33329,12 @@ usb:v0853*
 usb:v0853p0100*
  ID_MODEL_FROM_DATABASE=HHKB Professional
 
+usb:v0853p0119*
+ ID_MODEL_FROM_DATABASE=RealForce 105UB
+
+usb:v0853p0200*
+ ID_MODEL_FROM_DATABASE=RealForce Compact Keyboard
+
 usb:v0854*
  ID_VENDOR_FROM_DATABASE=ActiveWire, Inc.
 
@@ -33776,6 +34778,9 @@ usb:v0910*
 usb:v0911*
  ID_VENDOR_FROM_DATABASE=Philips Speech Processing
 
+usb:v0911p0C1C*
+ ID_MODEL_FROM_DATABASE=SpeechMike III
+
 usb:v0911p149A*
  ID_MODEL_FROM_DATABASE=SpeechMike II Pro Plus LFH5276
 
@@ -33938,6 +34943,9 @@ usb:v091Ep2459*
 usb:v091Ep2491*
  ID_MODEL_FROM_DATABASE=Edge 800
 
+usb:v091Ep2518*
+ ID_MODEL_FROM_DATABASE=eTrex 10
+
 usb:v091Ep2519*
  ID_MODEL_FROM_DATABASE=eTrex 30
 
@@ -33950,12 +34958,24 @@ usb:v091Ep253C*
 usb:v091Ep255B*
  ID_MODEL_FROM_DATABASE=Nuvi 2505LM
 
+usb:v091Ep2613*
+ ID_MODEL_FROM_DATABASE=Edge 200 TWN
+
 usb:v091Ep26A1*
  ID_MODEL_FROM_DATABASE=Nuvi 55
 
+usb:v091Ep2802*
+ ID_MODEL_FROM_DATABASE=fenix 3
+
+usb:v091Ep28DB*
+ ID_MODEL_FROM_DATABASE=Drive 5
+
 usb:v091Ep47FB*
  ID_MODEL_FROM_DATABASE=nuviCam
 
+usb:v091Ep4CDB*
+ ID_MODEL_FROM_DATABASE=Fenix 6
+
 usb:v0920*
  ID_VENDOR_FROM_DATABASE=Echelon Co.
 
@@ -33977,6 +34997,9 @@ usb:v0922p0007*
 usb:v0922p0009*
  ID_MODEL_FROM_DATABASE=LabelWriter 310
 
+usb:v0922p0013*
+ ID_MODEL_FROM_DATABASE=LabelManager 400
+
 usb:v0922p0019*
  ID_MODEL_FROM_DATABASE=LabelWriter 400
 
@@ -33986,12 +35009,21 @@ usb:v0922p001A*
 usb:v0922p0020*
  ID_MODEL_FROM_DATABASE=LabelWriter 450
 
+usb:v0922p0400*
+ ID_MODEL_FROM_DATABASE=LabelWriter SE450
+
 usb:v0922p1001*
  ID_MODEL_FROM_DATABASE=LabelManager PnP
 
+usb:v0922p8003*
+ ID_MODEL_FROM_DATABASE=M10 Digital Postal Scale
+
 usb:v0922p8004*
  ID_MODEL_FROM_DATABASE=M25 Digital Postal Scale
 
+usb:v0922p8009*
+ ID_MODEL_FROM_DATABASE=S250 Digital Postal Scale
+
 usb:v0923*
  ID_VENDOR_FROM_DATABASE=IC Media Corp.
 
@@ -34046,6 +35078,12 @@ usb:v0925p0005*
 usb:v0925p03E8*
  ID_MODEL_FROM_DATABASE=Wii Classic Controller Adapter
 
+usb:v0925p1031*
+ ID_MODEL_FROM_DATABASE=WiseGroup Ltd, Gameport Controller
+
+usb:v0925p1700*
+ ID_MODEL_FROM_DATABASE=PS/SS/N64 Joypad
+
 usb:v0925p3881*
  ID_MODEL_FROM_DATABASE=Saleae Logic
 
@@ -34082,6 +35120,9 @@ usb:v092A*
 usb:v092B*
  ID_VENDOR_FROM_DATABASE=Sena Technologies, Inc.
 
+usb:v092Bp4210*
+ ID_MODEL_FROM_DATABASE=20S - Bluetooth Motorcycle headset & universal intercom
+
 usb:v092F*
  ID_VENDOR_FROM_DATABASE=Northern Embedded Science/CAVNEX
 
@@ -34164,7 +35205,7 @@ usb:v0930p0707*
  ID_MODEL_FROM_DATABASE=Pocket PC e330 Series
 
 usb:v0930p0708*
- ID_MODEL_FROM_DATABASE=Pocket PC e350 Series
+ ID_MODEL_FROM_DATABASE=Pocket PC e350 Series
 
 usb:v0930p0709*
  ID_MODEL_FROM_DATABASE=Pocket PC e750 Series
@@ -34223,6 +35264,9 @@ usb:v0930p1311*
 usb:v0930p1400*
  ID_MODEL_FROM_DATABASE=Memory Stick 2GB
 
+usb:v0930p140B*
+ ID_MODEL_FROM_DATABASE=Memory Stick 64GB
+
 usb:v0930p642F*
  ID_MODEL_FROM_DATABASE=TravelDrive
 
@@ -34346,6 +35390,9 @@ usb:v0930p6544*
 usb:v0930p6545*
  ID_MODEL_FROM_DATABASE=Kingston DataTraveler 102/2.0 / HEMA Flash Drive 2 GB / PNY Attache 4GB Stick
 
+usb:v0930pA002*
+ ID_MODEL_FROM_DATABASE=SunplusIT SATA bridge
+
 usb:v0931*
  ID_VENDOR_FROM_DATABASE=Harmonic Data Systems, Ltd
 
@@ -34412,6 +35459,9 @@ usb:v0939*
 usb:v0939p0B15*
  ID_MODEL_FROM_DATABASE=Toshiba Stor.E Alu 2
 
+usb:v0939p0B16*
+ ID_MODEL_FROM_DATABASE=Toshiba StorE HDD
+
 usb:v093A*
  ID_VENDOR_FROM_DATABASE=Pixart Imaging, Inc.
 
@@ -34478,6 +35528,12 @@ usb:v093Ap2622*
 usb:v093Ap2624*
  ID_MODEL_FROM_DATABASE=Webcam
 
+usb:v093Ap2628*
+ ID_MODEL_FROM_DATABASE=Webcam Genius iLook 300
+
+usb:v093Ap2700*
+ ID_MODEL_FROM_DATABASE=GE 1.3 MP MiniCam Pro
+
 usb:v093B*
  ID_VENDOR_FROM_DATABASE=Plextor Corp.
 
@@ -34487,6 +35543,9 @@ usb:v093Bp0010*
 usb:v093Bp0011*
  ID_MODEL_FROM_DATABASE=PlexWriter 40/12/40U
 
+usb:v093Bp0012*
+ ID_MODEL_FROM_DATABASE=PlexWriter 48/24/48U
+
 usb:v093Bp0041*
  ID_MODEL_FROM_DATABASE=PX-708A DVD RW
 
@@ -34616,6 +35675,9 @@ usb:v0951p0008*
 usb:v0951p000A*
  ID_MODEL_FROM_DATABASE=KNU101TX 100baseTX Ethernet
 
+usb:v0951p1539*
+ ID_MODEL_FROM_DATABASE=Iron Key D300 (Virtual CD-ROM and USB Stick)
+
 usb:v0951p1600*
  ID_MODEL_FROM_DATABASE=DataTraveler II Pen Drive
 
@@ -34689,10 +35751,10 @@ usb:v0951p1660*
  ID_MODEL_FROM_DATABASE=Data Traveller 108
 
 usb:v0951p1665*
- ID_MODEL_FROM_DATABASE=Digital DataTraveler SE9 64GB
+ ID_MODEL_FROM_DATABASE=Digital DataTraveler SE9
 
 usb:v0951p1666*
- ID_MODEL_FROM_DATABASE=DataTraveler 100 G3/G4/SE9 G2
+ ID_MODEL_FROM_DATABASE=DataTraveler 100 G3/G4/SE9 G2/50
 
 usb:v0951p1689*
  ID_MODEL_FROM_DATABASE=DataTraveler SE9
@@ -34703,15 +35765,36 @@ usb:v0951p168A*
 usb:v0951p168C*
  ID_MODEL_FROM_DATABASE=DT Elite 3.0
 
+usb:v0951p16A4*
+ ID_MODEL_FROM_DATABASE=HyperX 7.1 Audio
+
 usb:v0951p16B3*
  ID_MODEL_FROM_DATABASE=HyperX Savage
 
+usb:v0951p16D2*
+ ID_MODEL_FROM_DATABASE=HX-KB4BL1-US [HYPERX Alloy FPS Pro]
+
+usb:v0951p16D4*
+ ID_MODEL_FROM_DATABASE=HyperX SavageEXO [0382]
+
+usb:v0951p16D5*
+ ID_MODEL_FROM_DATABASE=DataTraveler Elite G2
+
+usb:v0951p16DF*
+ ID_MODEL_FROM_DATABASE=HyperX QuadCast
+
+usb:v0951p16E4*
+ ID_MODEL_FROM_DATABASE=HyperX Pulsefire Raid
+
 usb:v0954*
  ID_VENDOR_FROM_DATABASE=RPM Systems Corp.
 
 usb:v0955*
  ID_VENDOR_FROM_DATABASE=NVIDIA Corp.
 
+usb:v0955p7005*
+ ID_MODEL_FROM_DATABASE=Bootloader
+
 usb:v0955p7018*
  ID_MODEL_FROM_DATABASE=T186 [Tegra Parker]
 
@@ -34733,12 +35816,18 @@ usb:v0955p7140*
 usb:v0955p7210*
  ID_MODEL_FROM_DATABASE=SHIELD Controller
 
+usb:v0955p7321*
+ ID_MODEL_FROM_DATABASE=Switch [Tegra Erista] recovery mode
+
 usb:v0955p7721*
- ID_MODEL_FROM_DATABASE=T210 [Tegra Erista]
+ ID_MODEL_FROM_DATABASE=T210 [TX1 Tegra Erista] recovery mode
 
 usb:v0955p7820*
  ID_MODEL_FROM_DATABASE=T20 [Tegra 2] recovery mode
 
+usb:v0955p7C18*
+ ID_MODEL_FROM_DATABASE=T186 [TX2 Tegra Parker] recovery mode
+
 usb:v0955pB400*
  ID_MODEL_FROM_DATABASE=SHIELD (debug)
 
@@ -34787,6 +35876,9 @@ usb:v0957p1507*
 usb:v0957p1745*
  ID_MODEL_FROM_DATABASE=Test and Measurement Device (IVI)
 
+usb:v0957p1F01*
+ ID_MODEL_FROM_DATABASE=N5181A MXG Analog Signal Generator
+
 usb:v0957p2918*
  ID_MODEL_FROM_DATABASE=U2702A oscilloscope
 
@@ -34850,6 +35942,12 @@ usb:v096Ep0309*
 usb:v096Ep0401*
  ID_MODEL_FROM_DATABASE=ePass3000
 
+usb:v096Ep0405*
+ ID_MODEL_FROM_DATABASE=Zzkey Dongle
+
+usb:v096Ep0608*
+ ID_MODEL_FROM_DATABASE=SC Reader KP382
+
 usb:v096Ep0702*
  ID_MODEL_FROM_DATABASE=ePass3003
 
@@ -34952,6 +36050,9 @@ usb:v0984p0040*
 usb:v0984p0200*
  ID_MODEL_FROM_DATABASE=Hard Drive Storage (TPP)
 
+usb:v0984p1407*
+ ID_MODEL_FROM_DATABASE=Secure Key 3.0
+
 usb:v0985*
  ID_VENDOR_FROM_DATABASE=cab Produkttechnik GmbH & Co KG
 
@@ -34994,9 +36095,15 @@ usb:v099A*
 usb:v099Ap0638*
  ID_MODEL_FROM_DATABASE=Sanwa Supply Inc. Small Keyboard
 
+usb:v099Ap2620*
+ ID_MODEL_FROM_DATABASE=Graphics tablet [Polostar PT1001, Zeniq PT1001, Leogics PT1001]
+
 usb:v099Ap610C*
  ID_MODEL_FROM_DATABASE=EL-610 Super Mini Electron luminescent Keyboard
 
+usb:v099Ap6330*
+ ID_MODEL_FROM_DATABASE=SANWA Supply Inc. Slim Keyboard
+
 usb:v099Ap713A*
  ID_MODEL_FROM_DATABASE=WK-713 Multimedia Keyboard
 
@@ -35045,6 +36152,15 @@ usb:v09AB*
 usb:v09AE*
  ID_VENDOR_FROM_DATABASE=Tripp Lite
 
+usb:v09AEp0002*
+ ID_MODEL_FROM_DATABASE=Any Device (see discussion)
+
+usb:v09B0*
+ ID_VENDOR_FROM_DATABASE=Fargo
+
+usb:v09B0p2400*
+ ID_MODEL_FROM_DATABASE=HDP5000
+
 usb:v09B2*
  ID_VENDOR_FROM_DATABASE=Franklin Electronic Publishers, Inc.
 
@@ -35219,6 +36335,9 @@ usb:v09CBp1008*
 usb:v09CBp1996*
  ID_MODEL_FROM_DATABASE=FLIR ONE Camera
 
+usb:v09CBp4007*
+ ID_MODEL_FROM_DATABASE=Breach
+
 usb:v09CC*
  ID_VENDOR_FROM_DATABASE=Workbit Corp.
 
@@ -35250,16 +36369,19 @@ usb:v09D3p0001*
  ID_MODEL_FROM_DATABASE=ISDN TA / Light Rider 128K
 
 usb:v09D3p000B*
- ID_MODEL_FROM_DATABASE=Bluetooth Adapter class 1 [BlueLight]
+ ID_MODEL_FROM_DATABASE=Bluetooth Adapter class 2
 
 usb:v09D7*
- ID_VENDOR_FROM_DATABASE=NovAtel Inc.
+ ID_VENDOR_FROM_DATABASE=Hexagon NovAtel Inc.
 
 usb:v09D7p0100*
- ID_MODEL_FROM_DATABASE=NovAtel FlexPack GPS receiver
+ ID_MODEL_FROM_DATABASE=GPS/GNSS/SPAN sensor
 
 usb:v09D8*
- ID_VENDOR_FROM_DATABASE=ELATEC
+ ID_VENDOR_FROM_DATABASE=ELATEC GmbH
+
+usb:v09D8p0320*
+ ID_MODEL_FROM_DATABASE=TWN3 Multi125
 
 usb:v09D8p0406*
  ID_MODEL_FROM_DATABASE=TWN4 MIFARE NFC
@@ -35300,9 +36422,18 @@ usb:v09DAp0260*
 usb:v09DAp032B*
  ID_MODEL_FROM_DATABASE=Wireless Mouse (Battery Free)
 
+usb:v09DAp09DA*
+ ID_MODEL_FROM_DATABASE=Bloody V8 Mouse
+
 usb:v09DAp1068*
  ID_MODEL_FROM_DATABASE=Bloody A90 Mouse
 
+usb:v09DAp112C*
+ ID_MODEL_FROM_DATABASE=Bloody V5 Mouse
+
+usb:v09DAp3A60*
+ ID_MODEL_FROM_DATABASE=Bloody V8M Core 2 Mouse
+
 usb:v09DAp8090*
  ID_MODEL_FROM_DATABASE=X-718BK Oscar Optical Gaming Mouse
 
@@ -35315,6 +36446,9 @@ usb:v09DAp9066*
 usb:v09DAp9090*
  ID_MODEL_FROM_DATABASE=XL-730K / XL-750BK / XL-755BK Mice
 
+usb:v09DApF613*
+ ID_MODEL_FROM_DATABASE=Bloody V7M Mouse
+
 usb:v09DB*
  ID_VENDOR_FROM_DATABASE=Measurement Computing Corp.
 
@@ -35363,6 +36497,9 @@ usb:v09E7*
 usb:v09E8*
  ID_VENDOR_FROM_DATABASE=AKAI  Professional M.I. Corp.
 
+usb:v09E8p0045*
+ ID_MODEL_FROM_DATABASE=MPK Mini Mk II MIDI Controller
+
 usb:v09E8p0062*
  ID_MODEL_FROM_DATABASE=MPD16 MIDI Pad Controller Unit
 
@@ -35789,6 +36926,9 @@ usb:v0A48p5025*
 usb:v0A4A*
  ID_VENDOR_FROM_DATABASE=Ploytec GmbH
 
+usb:v0A4ApA400*
+ ID_MODEL_FROM_DATABASE=AUDIO JUNCTION 2.0
+
 usb:v0A4B*
  ID_VENDOR_FROM_DATABASE=Fujitsu Media Devices, Ltd
 
@@ -35936,6 +37076,9 @@ usb:v0A5C*
 usb:v0A5Cp0201*
  ID_MODEL_FROM_DATABASE=iLine10(tm) Network Adapter
 
+usb:v0A5Cp0BDC*
+ ID_MODEL_FROM_DATABASE=802.11a/b/g/n/ac Wireless Adapter
+
 usb:v0A5Cp2000*
  ID_MODEL_FROM_DATABASE=Bluetooth Device
 
@@ -36095,6 +37238,9 @@ usb:v0A5Cp21E6*
 usb:v0A5Cp21E8*
  ID_MODEL_FROM_DATABASE=BCM20702A0 Bluetooth 4.0
 
+usb:v0A5Cp21EC*
+ ID_MODEL_FROM_DATABASE=BCM20702A0 Bluetooth 4.0
+
 usb:v0A5Cp21F1*
  ID_MODEL_FROM_DATABASE=HP Portable Bumble Bee
 
@@ -36167,9 +37313,15 @@ usb:v0A5F*
 usb:v0A5Fp0009*
  ID_MODEL_FROM_DATABASE=LP2844 Printer
 
+usb:v0A5Fp0050*
+ ID_MODEL_FROM_DATABASE=P120i / WM120i
+
 usb:v0A5Fp0081*
  ID_MODEL_FROM_DATABASE=GK420t Label Printer
 
+usb:v0A5Fp0084*
+ ID_MODEL_FROM_DATABASE=GX420d Desktop Label Printer
+
 usb:v0A5Fp008B*
  ID_MODEL_FROM_DATABASE=HC100 wristbands Printer
 
@@ -36179,6 +37331,9 @@ usb:v0A5Fp008C*
 usb:v0A5Fp00D1*
  ID_MODEL_FROM_DATABASE=Zebra GC420d Label Printer
 
+usb:v0A5Fp0110*
+ ID_MODEL_FROM_DATABASE=ZD500 Desktop Label Printer
+
 usb:v0A5Fp930A*
  ID_MODEL_FROM_DATABASE=Printer
 
@@ -36806,6 +37961,9 @@ usb:v0AC8pC326*
 usb:v0AC8pC33F*
  ID_MODEL_FROM_DATABASE=Webcam
 
+usb:v0AC8pC412*
+ ID_MODEL_FROM_DATABASE=Lenovo IdeaCentre Web Camera
+
 usb:v0AC8pC429*
  ID_MODEL_FROM_DATABASE=Lenovo ThinkCentre Web Camera
 
@@ -37208,6 +38366,9 @@ usb:v0B05p1788*
 usb:v0B05p1791*
  ID_MODEL_FROM_DATABASE=WL-167G v3 802.11n Adapter [Realtek RTL8188SU]
 
+usb:v0B05p179C*
+ ID_MODEL_FROM_DATABASE=Bluetooth Adapter
+
 usb:v0B05p179D*
  ID_MODEL_FROM_DATABASE=USB-N53 802.11abgn Network Adapter [Ralink RT3572]
 
@@ -37229,6 +38390,9 @@ usb:v0B05p17AB*
 usb:v0B05p17BA*
  ID_MODEL_FROM_DATABASE=N10 Nano 802.11n Network Adapter [Realtek RTL8192CU]
 
+usb:v0B05p17C2*
+ ID_MODEL_FROM_DATABASE=ROG Spitfire
+
 usb:v0B05p17C7*
  ID_MODEL_FROM_DATABASE=WL-330NUL
 
@@ -37256,6 +38420,9 @@ usb:v0B05p17E8*
 usb:v0B05p17EB*
  ID_MODEL_FROM_DATABASE=USB-AC55 802.11a/b/g/n/ac Wireless Adapter [MediaTek MT7612U]
 
+usb:v0B05p17F5*
+ ID_MODEL_FROM_DATABASE=Xonar U5 sound card
+
 usb:v0B05p180A*
  ID_MODEL_FROM_DATABASE=Broadcom BCM20702 Single-Chip Bluetooth 4.0 + LE
 
@@ -37265,6 +38432,9 @@ usb:v0B05p1817*
 usb:v0B05p1825*
  ID_MODEL_FROM_DATABASE=Qualcomm Bluetooth 4.1
 
+usb:v0B05p18F0*
+ ID_MODEL_FROM_DATABASE=Realtek 8188EUS [USB-N10 Nano]
+
 usb:v0B05p4C80*
  ID_MODEL_FROM_DATABASE=Transformer Pad TF300TG
 
@@ -37358,18 +38528,39 @@ usb:v0B0Dp0000*
 usb:v0B0E*
  ID_VENDOR_FROM_DATABASE=GN Netcom
 
+usb:v0B0Ep0305*
+ ID_MODEL_FROM_DATABASE=Jabra EVOLVE Link MS
+
+usb:v0B0Ep0311*
+ ID_MODEL_FROM_DATABASE=Jabra EVOLVE 65
+
+usb:v0B0Ep0312*
+ ID_MODEL_FROM_DATABASE=enc060:Buttons Volume up/down/mute + phone [Jabra]
+
+usb:v0B0Ep0343*
+ ID_MODEL_FROM_DATABASE=Jabra UC VOICE 150a
+
 usb:v0B0Ep0348*
  ID_MODEL_FROM_DATABASE=Jabra UC VOICE 550a MS
 
 usb:v0B0Ep034C*
  ID_MODEL_FROM_DATABASE=Jabra UC Voice 750 MS
 
+usb:v0B0Ep034D*
+ ID_MODEL_FROM_DATABASE=Jabra UC VOICE 750
+
 usb:v0B0Ep0410*
  ID_MODEL_FROM_DATABASE=Jabra SPEAK 410
 
 usb:v0B0Ep0420*
  ID_MODEL_FROM_DATABASE=Jabra SPEAK 510
 
+usb:v0B0Ep0422*
+ ID_MODEL_FROM_DATABASE=Jabra SPEAK 510 USB
+
+usb:v0B0Ep0933*
+ ID_MODEL_FROM_DATABASE=Jabra Freeway
+
 usb:v0B0Ep094D*
  ID_MODEL_FROM_DATABASE=GN Netcom / Jabra REVO Wireless
 
@@ -37388,15 +38579,30 @@ usb:v0B0Ep1900*
 usb:v0B0Ep2007*
  ID_MODEL_FROM_DATABASE=GN 2000 Stereo Corded Headset
 
+usb:v0B0Ep2456*
+ ID_MODEL_FROM_DATABASE=Jabra SPEAK 810
+
+usb:v0B0Ep245E*
+ ID_MODEL_FROM_DATABASE=Jabra Link 370
+
 usb:v0B0Ep620C*
  ID_MODEL_FROM_DATABASE=Jabra BT620s
 
 usb:v0B0Ep9330*
  ID_MODEL_FROM_DATABASE=Jabra GN9330 Headset
 
+usb:v0B0EpA346*
+ ID_MODEL_FROM_DATABASE=Jabra Engage 75 Stereo
+
+usb:v0B0EpA50A*
+ ID_MODEL_FROM_DATABASE=Alienware Wireless Gaming Headset AW988
+
 usb:v0B0F*
  ID_VENDOR_FROM_DATABASE=AVID Technology
 
+usb:v0B0Fp0400*
+ ID_MODEL_FROM_DATABASE=DNxID
+
 usb:v0B10*
  ID_VENDOR_FROM_DATABASE=Pcally
 
@@ -37457,6 +38663,15 @@ usb:v0B33p0401*
 usb:v0B33p0700*
  ID_MODEL_FROM_DATABASE=RollerMouse Pro
 
+usb:v0B33p08A0*
+ ID_MODEL_FROM_DATABASE=Perfit Mouse
+
+usb:v0B33p1000*
+ ID_MODEL_FROM_DATABASE=RollerMouse Red
+
+usb:v0B33p1010*
+ ID_MODEL_FROM_DATABASE=Vidamic Technomouse IQ
+
 usb:v0B37*
  ID_VENDOR_FROM_DATABASE=Hitachi ULSI Systems Co., Ltd
 
@@ -37655,6 +38870,9 @@ usb:v0B4D*
 usb:v0B4Dp110A*
  ID_MODEL_FROM_DATABASE=Graphtec CC200-20
 
+usb:v0B4Dp1123*
+ ID_MODEL_FROM_DATABASE=Electronic Cutting Tool [Silhouette Portrait]
+
 usb:v0B4E*
  ID_VENDOR_FROM_DATABASE=Musical Electronics, Ltd
 
@@ -37871,6 +39089,9 @@ usb:v0B95p1780*
 usb:v0B95p1790*
  ID_MODEL_FROM_DATABASE=AX88179 Gigabit Ethernet
 
+usb:v0B95p6802*
+ ID_MODEL_FROM_DATABASE=AX68002 KVM Switch SoC
+
 usb:v0B95p7720*
  ID_MODEL_FROM_DATABASE=AX88772
 
@@ -38012,6 +39233,9 @@ usb:v0BB4p00CE*
 usb:v0BB4p00CF*
  ID_MODEL_FROM_DATABASE=SPV C500 Smart Phone
 
+usb:v0BB4p0306*
+ ID_MODEL_FROM_DATABASE=Vive Hub Bluetooth 4.1 (Broadcom BCM920703)
+
 usb:v0BB4p0A01*
  ID_MODEL_FROM_DATABASE=PocketPC Sync
 
@@ -38517,7 +39741,7 @@ usb:v0BB4p0BCE*
  ID_MODEL_FROM_DATABASE=Vario MDA
 
 usb:v0BB4p0C01*
- ID_MODEL_FROM_DATABASE=Dream / ADP1 / G1 / Magic / Tattoo
+ ID_MODEL_FROM_DATABASE=Dream / ADP1 / G1 / Magic / Tattoo / FP1
 
 usb:v0BB4p0C02*
  ID_MODEL_FROM_DATABASE=Dream / ADP1 / G1 / Magic / Tattoo (Debug)
@@ -38564,6 +39788,9 @@ usb:v0BB4p0CA2*
 usb:v0BB4p0CA5*
  ID_MODEL_FROM_DATABASE=Android Phone [Evo Shift 4G]
 
+usb:v0BB4p0CAB*
+ ID_MODEL_FROM_DATABASE=Desire / Desire HD / Hero / Thunderbolt (HTC Sync Mode)
+
 usb:v0BB4p0CAE*
  ID_MODEL_FROM_DATABASE=T-Mobile MyTouch 4G Slide [Doubleshot]
 
@@ -38585,6 +39812,9 @@ usb:v0BB4p0F64*
 usb:v0BB4p0FB4*
  ID_MODEL_FROM_DATABASE=Remote NDIS based Device
 
+usb:v0BB4p0FF0*
+ ID_MODEL_FROM_DATABASE=One Mini (M4)
+
 usb:v0BB4p0FF8*
  ID_MODEL_FROM_DATABASE=Desire HD (Tethering Mode)
 
@@ -38598,11 +39828,20 @@ usb:v0BB4p0FFF*
  ID_MODEL_FROM_DATABASE=Android Fastboot Bootloader
 
 usb:v0BB4p2008*
- ID_MODEL_FROM_DATABASE=Android Phone via MTP [Wiko Cink Peax 2]
+ ID_MODEL_FROM_DATABASE=Android Phone via MTP [MT65xx]
 
 usb:v0BB4p200B*
  ID_MODEL_FROM_DATABASE=Android Phone via PTP [Wiko Cink Peax 2]
 
+usb:v0BB4p2134*
+ ID_MODEL_FROM_DATABASE=Vive Hub (SMSC USB2137B)
+
+usb:v0BB4p2744*
+ ID_MODEL_FROM_DATABASE=Vive Hub (HTC CB USB2)
+
+usb:v0BB4p2C87*
+ ID_MODEL_FROM_DATABASE=Vive
+
 usb:v0BB5*
  ID_VENDOR_FROM_DATABASE=Murata Manufacturing Co., Ltd
 
@@ -38660,6 +39899,9 @@ usb:v0BC2p2300*
 usb:v0BC2p231A*
  ID_MODEL_FROM_DATABASE=Expansion Portable
 
+usb:v0BC2p231C*
+ ID_MODEL_FROM_DATABASE=Expansion Portable
+
 usb:v0BC2p2320*
  ID_MODEL_FROM_DATABASE=USB 3.0 bridge [Portable Expansion Drive]
 
@@ -38684,15 +39926,24 @@ usb:v0BC2p3101*
 usb:v0BC2p3312*
  ID_MODEL_FROM_DATABASE=SRD00F2 Expansion Desktop Drive (STBV)
 
+usb:v0BC2p331A*
+ ID_MODEL_FROM_DATABASE=Desktop HDD 5TB (ST5000DM000)
+
 usb:v0BC2p3320*
  ID_MODEL_FROM_DATABASE=SRD00F2 [Expansion Desktop Drive]
 
 usb:v0BC2p3322*
  ID_MODEL_FROM_DATABASE=SRD0NF2 [Expansion Desktop Drive]
 
+usb:v0BC2p3323*
+ ID_MODEL_FROM_DATABASE=Seagate RSS LLC
+
 usb:v0BC2p3332*
  ID_MODEL_FROM_DATABASE=Expansion
 
+usb:v0BC2p3343*
+ ID_MODEL_FROM_DATABASE=desktop drive stgy8000400
+
 usb:v0BC2p5020*
  ID_MODEL_FROM_DATABASE=FreeAgent GoFlex
 
@@ -38729,6 +39980,9 @@ usb:v0BC2p5161*
 usb:v0BC2p6126*
  ID_MODEL_FROM_DATABASE=Maxtor D3 Station 5TB
 
+usb:v0BC2p61B5*
+ ID_MODEL_FROM_DATABASE=Maxtor HX-M201TCB [M3 Portable 2TB]
+
 usb:v0BC2p61B6*
  ID_MODEL_FROM_DATABASE=Maxtor HX-M101TCB/GM [M3 Portable 1TB]
 
@@ -38744,6 +39998,9 @@ usb:v0BC2pA0A1*
 usb:v0BC2pA0A4*
  ID_MODEL_FROM_DATABASE=Backup Plus Desktop Drive
 
+usb:v0BC2pAA14*
+ ID_MODEL_FROM_DATABASE=STJ4000400 [Seagate Basic Portable Drive 4TB]
+
 usb:v0BC2pAB00*
  ID_MODEL_FROM_DATABASE=Slim Portable Drive
 
@@ -38762,6 +40019,12 @@ usb:v0BC2pAB24*
 usb:v0BC2pAB26*
  ID_MODEL_FROM_DATABASE=Backup Plus Slim Portable Drive 1 TB
 
+usb:v0BC2pAB28*
+ ID_MODEL_FROM_DATABASE=Seagate Backup Plus Portable 5TB SRD00F1
+
+usb:v0BC2pAB2D*
+ ID_MODEL_FROM_DATABASE=SRD00F1 [Backup Plus Ultra Slim]
+
 usb:v0BC2pAB31*
  ID_MODEL_FROM_DATABASE=Backup Plus Desktop Drive (5TB)
 
@@ -38769,8 +40032,14 @@ usb:v0BC2pAB34*
  ID_MODEL_FROM_DATABASE=Backup Plus
 
 usb:v0BC2pAB38*
+ ID_MODEL_FROM_DATABASE=Backup Plus Hub (Mass Storage)
+
+usb:v0BC2pAB44*
  ID_MODEL_FROM_DATABASE=Backup Plus Hub
 
+usb:v0BC2pAC20*
+ ID_MODEL_FROM_DATABASE=Backup Plus Slim 2TB
+
 usb:v0BC3*
  ID_VENDOR_FROM_DATABASE=IPWireless, Inc.
 
@@ -38957,12 +40226,27 @@ usb:v0BDAp0301*
 usb:v0BDAp0307*
  ID_MODEL_FROM_DATABASE=Card Reader
 
+usb:v0BDAp0316*
+ ID_MODEL_FROM_DATABASE=Card Reader
+
 usb:v0BDAp0326*
  ID_MODEL_FROM_DATABASE=Card reader
 
+usb:v0BDAp0411*
+ ID_MODEL_FROM_DATABASE=Hub
+
+usb:v0BDAp0811*
+ ID_MODEL_FROM_DATABASE=Realtek 8812AU/8821AU 802.11ac WLAN Adapter [USB Wireless Dual-Band Adapter 2.4/5Ghz]
+
+usb:v0BDAp0821*
+ ID_MODEL_FROM_DATABASE=RTL8821A Bluetooth
+
 usb:v0BDAp1724*
  ID_MODEL_FROM_DATABASE=RTL8723AU 802.11n WLAN Adapter
 
+usb:v0BDAp1A2B*
+ ID_MODEL_FROM_DATABASE=RTL8188GU 802.11n WLAN Adapter (Driver CDROM Mode)
+
 usb:v0BDAp2831*
  ID_MODEL_FROM_DATABASE=RTL2831U DVB-T
 
@@ -38975,6 +40259,12 @@ usb:v0BDAp2838*
 usb:v0BDAp5401*
  ID_MODEL_FROM_DATABASE=RTL 8153 USB 3.0 hub with gigabit ethernet
 
+usb:v0BDAp5411*
+ ID_MODEL_FROM_DATABASE=RTS5411 Hub
+
+usb:v0BDAp568C*
+ ID_MODEL_FROM_DATABASE=Integrated Webcam HD
+
 usb:v0BDAp570C*
  ID_MODEL_FROM_DATABASE=Asus laptop camera
 
@@ -38987,12 +40277,24 @@ usb:v0BDAp5751*
 usb:v0BDAp5775*
  ID_MODEL_FROM_DATABASE=HP "Truevision HD" laptop camera
 
+usb:v0BDAp5776*
+ ID_MODEL_FROM_DATABASE=HP Truevision HD integrated webcam
+
 usb:v0BDAp57B3*
  ID_MODEL_FROM_DATABASE=Acer 640 × 480 laptop camera
 
+usb:v0BDAp57CC*
+ ID_MODEL_FROM_DATABASE=HD Webcam - Realtek Semiconductor
+
+usb:v0BDAp57CF*
+ ID_MODEL_FROM_DATABASE=HD WebCam
+
 usb:v0BDAp57DA*
  ID_MODEL_FROM_DATABASE=Built-In Video Camera
 
+usb:v0BDAp58C2*
+ ID_MODEL_FROM_DATABASE=Integrated Webcam HD
+
 usb:v0BDAp58C8*
  ID_MODEL_FROM_DATABASE=Integrated Webcam HD
 
@@ -39053,15 +40355,57 @@ usb:v0BDAp8198*
 usb:v0BDAp8199*
  ID_MODEL_FROM_DATABASE=RTL8187SU 802.11g WLAN Adapter
 
+usb:v0BDAp8723*
+ ID_MODEL_FROM_DATABASE=RTL8723A Bluetooth
+
 usb:v0BDAp8812*
  ID_MODEL_FROM_DATABASE=RTL8812AU 802.11a/b/g/n/ac 2T2R DB WLAN Adapter
 
 usb:v0BDAp8813*
  ID_MODEL_FROM_DATABASE=RTL8814AU 802.11a/b/g/n/ac Wireless Adapter
 
+usb:v0BDAp881A*
+ ID_MODEL_FROM_DATABASE=RTL8812AU-VS 802.11a/b/g/n/ac 2T2R DB WLAN Adapter
+
+usb:v0BDAp8821*
+ ID_MODEL_FROM_DATABASE=RTL8821A Bluetooth
+
+usb:v0BDAp9210*
+ ID_MODEL_FROM_DATABASE=RTL9210 M.2 NVME Adapter
+
 usb:v0BDApA811*
  ID_MODEL_FROM_DATABASE=RTL8811AU 802.11a/b/g/n/ac WLAN Adapter
 
+usb:v0BDApB009*
+ ID_MODEL_FROM_DATABASE=Realtek Bluetooth 4.2 Adapter
+
+usb:v0BDApB00A*
+ ID_MODEL_FROM_DATABASE=Realtek Bluetooth 4.2 Adapter
+
+usb:v0BDApB00B*
+ ID_MODEL_FROM_DATABASE=Realtek Bluetooth 4.2 Adapter
+
+usb:v0BDApB023*
+ ID_MODEL_FROM_DATABASE=RTL8822BE Bluetooth 4.2 Adapter
+
+usb:v0BDApB711*
+ ID_MODEL_FROM_DATABASE=RTL8188GU 802.11n WLAN Adapter (After Modeswitch)
+
+usb:v0BDApB720*
+ ID_MODEL_FROM_DATABASE=RTL8723BU 802.11b/g/n WLAN Adapter
+
+usb:v0BDApB723*
+ ID_MODEL_FROM_DATABASE=RTL8723B Bluetooth
+
+usb:v0BDApB728*
+ ID_MODEL_FROM_DATABASE=RTL8723B Bluetooth
+
+usb:v0BDApB72A*
+ ID_MODEL_FROM_DATABASE=RTL8723B Bluetooth
+
+usb:v0BDApB812*
+ ID_MODEL_FROM_DATABASE=RTL88x2bu [AC1200 Techkey]
+
 usb:v0BDB*
  ID_VENDOR_FROM_DATABASE=Ericsson Business Mobile Networks BV
 
@@ -39099,7 +40443,7 @@ usb:v0BDBp190B*
  ID_MODEL_FROM_DATABASE=C3607w v2 Mobile Broadband Module
 
 usb:v0BDBp1926*
- ID_MODEL_FROM_DATABASE=H5321 gw Mobile Broadband Driver
+ ID_MODEL_FROM_DATABASE=H5321 gw Mobile Broadband Module
 
 usb:v0BDC*
  ID_VENDOR_FROM_DATABASE=Y Media Corp.
@@ -39140,6 +40484,9 @@ usb:v0BEF*
 usb:v0BF0*
  ID_VENDOR_FROM_DATABASE=Pace Micro Technology PLC
 
+usb:v0BF0pC010*
+ ID_MODEL_FROM_DATABASE=EHD100SD
+
 usb:v0BF1*
  ID_VENDOR_FROM_DATABASE=Intracom S.A.
 
@@ -39203,6 +40550,12 @@ usb:v0BF8p1017*
 usb:v0BF8p101F*
  ID_MODEL_FROM_DATABASE=Fujitsu Full HD Pro Webcam
 
+usb:v0BFB*
+ ID_VENDOR_FROM_DATABASE=Grass Valley Group
+
+usb:v0BFBp0200*
+ ID_MODEL_FROM_DATABASE=TURBO iDDR Front Panel
+
 usb:v0BFD*
  ID_VENDOR_FROM_DATABASE=Kvaser AB
 
@@ -39248,6 +40601,9 @@ usb:v0C09pA5A5*
 usb:v0C0A*
  ID_VENDOR_FROM_DATABASE=Highpoint Technologies, Inc.
 
+usb:v0C0Ap6124*
+ ID_MODEL_FROM_DATABASE=RocketStor 6124V
+
 usb:v0C0B*
  ID_VENDOR_FROM_DATABASE=Dura Micro, Inc. (Acomdata)
 
@@ -39297,7 +40653,7 @@ usb:v0C12*
  ID_VENDOR_FROM_DATABASE=Zeroplus
 
 usb:v0C12p0005*
- ID_MODEL_FROM_DATABASE=PSX Vibration Feedback Converter
+ ID_MODEL_FROM_DATABASE=PSX Vibration Feedback Converter / Intec Wireless Controller for Xbox
 
 usb:v0C12p0030*
  ID_MODEL_FROM_DATABASE=PSX Vibration Feedback Converter
@@ -39306,7 +40662,7 @@ usb:v0C12p700E*
  ID_MODEL_FROM_DATABASE=Logic Analyzer (LAP-C-16032)
 
 usb:v0C12p8801*
- ID_MODEL_FROM_DATABASE=Xbox Controller
+ ID_MODEL_FROM_DATABASE=Nyko Xbox Controller
 
 usb:v0C12p8802*
  ID_MODEL_FROM_DATABASE=Xbox Controller
@@ -39362,6 +40718,12 @@ usb:v0C1B*
 usb:v0C1C*
  ID_VENDOR_FROM_DATABASE=Hang Zhou Silan Electronics Co., Ltd
 
+usb:v0C1F*
+ ID_VENDOR_FROM_DATABASE=Magicard
+
+usb:v0C1Fp1800*
+ ID_MODEL_FROM_DATABASE=Tango 2E
+
 usb:v0C22*
  ID_VENDOR_FROM_DATABASE=Tally Printer Corp.
 
@@ -39425,9 +40787,15 @@ usb:v0C26*
 usb:v0C26p0018*
  ID_MODEL_FROM_DATABASE=USB-Serial Controller [Icom Inc. OPC-478UC]
 
+usb:v0C26p002B*
+ ID_MODEL_FROM_DATABASE=Icom Inc. IC-R30
+
 usb:v0C27*
  ID_VENDOR_FROM_DATABASE=RFIDeas, Inc
 
+usb:v0C27p232A*
+ ID_MODEL_FROM_DATABASE=pcProx Plus RFID Reader (CDC serial)
+
 usb:v0C27p3BFA*
  ID_MODEL_FROM_DATABASE=pcProx Card Reader
 
@@ -39452,6 +40820,9 @@ usb:v0C2Ep0700*
 usb:v0C2Ep0720*
  ID_MODEL_FROM_DATABASE=Metrologic MS7120 Barcode Scanner (bi-directional serial mode)
 
+usb:v0C2Ep0A64*
+ ID_MODEL_FROM_DATABASE=[Stratos 2700]
+
 usb:v0C2Ep0B61*
  ID_MODEL_FROM_DATABASE=Vuquest 3310g
 
@@ -39590,6 +40961,12 @@ usb:v0C45p1158*
 usb:v0C45p184C*
  ID_MODEL_FROM_DATABASE=VoIP Phone
 
+usb:v0C45p1A90*
+ ID_MODEL_FROM_DATABASE=2M pixel Microscope Camera (with capture button) [Andonstar V160]
+
+usb:v0C45p5101*
+ ID_MODEL_FROM_DATABASE=2.4G Wireless Device [Rii MX3]
+
 usb:v0C45p6001*
  ID_MODEL_FROM_DATABASE=Genius VideoCAM NB
 
@@ -39881,12 +41258,18 @@ usb:v0C45p6300*
 usb:v0C45p6310*
  ID_MODEL_FROM_DATABASE=Sonix USB 2.0 Camera
 
+usb:v0C45p6321*
+ ID_MODEL_FROM_DATABASE=HP Integrated Webcam
+
 usb:v0C45p6340*
  ID_MODEL_FROM_DATABASE=Camera
 
 usb:v0C45p6341*
  ID_MODEL_FROM_DATABASE=Defender G-Lens 2577 HD720p Camera
 
+usb:v0C45p6366*
+ ID_MODEL_FROM_DATABASE=Webcam Vitade AF
+
 usb:v0C45p63E0*
  ID_MODEL_FROM_DATABASE=Sonix Integrated Webcam
 
@@ -39926,6 +41309,9 @@ usb:v0C45p6480*
 usb:v0C45p648B*
  ID_MODEL_FROM_DATABASE=Integrated Webcam
 
+usb:v0C45p64AD*
+ ID_MODEL_FROM_DATABASE=Dell Laptop Integrated Webcam HD
+
 usb:v0C45p64BD*
  ID_MODEL_FROM_DATABASE=Sony Visual Communication Camera
 
@@ -39938,12 +41324,24 @@ usb:v0C45p64D2*
 usb:v0C45p651B*
  ID_MODEL_FROM_DATABASE=HP Webcam
 
+usb:v0C45p652F*
+ ID_MODEL_FROM_DATABASE=Backlit Gaming Keyboard
+
 usb:v0C45p6705*
  ID_MODEL_FROM_DATABASE=Integrated HD Webcam
 
+usb:v0C45p670C*
+ ID_MODEL_FROM_DATABASE=Integrated Webcam HD
+
 usb:v0C45p6710*
  ID_MODEL_FROM_DATABASE=Integrated Webcam
 
+usb:v0C45p6712*
+ ID_MODEL_FROM_DATABASE=Integrated Webcam HD
+
+usb:v0C45p671D*
+ ID_MODEL_FROM_DATABASE=Integrated_Webcam_HD
+
 usb:v0C45p7401*
  ID_MODEL_FROM_DATABASE=TEMPer Temperature Sensor
 
@@ -40331,6 +41729,9 @@ usb:v0C76p1605*
 usb:v0C76p1607*
  ID_MODEL_FROM_DATABASE=audio controller
 
+usb:v0C76p5663*
+ ID_MODEL_FROM_DATABASE=Audio Device
+
 usb:v0C77*
  ID_VENDOR_FROM_DATABASE=Sipix Group, Ltd
 
@@ -40415,6 +41816,21 @@ usb:v0C9A*
 usb:v0C9B*
  ID_VENDOR_FROM_DATABASE=Jobin Yvon, Inc.
 
+usb:v0C9C*
+ ID_VENDOR_FROM_DATABASE=Brand Innovators BV
+
+usb:v0C9Cp1511*
+ ID_MODEL_FROM_DATABASE=BI-1511 Laser Simulator
+
+usb:v0C9Cp1512*
+ ID_MODEL_FROM_DATABASE=BI-1512 Syncbus Monitor
+
+usb:v0C9Cp1514*
+ ID_MODEL_FROM_DATABASE=BI-1514 HPC
+
+usb:v0C9Cp1532*
+ ID_MODEL_FROM_DATABASE=BI-1532 GPC
+
 usb:v0C9D*
  ID_VENDOR_FROM_DATABASE=SemTek
 
@@ -40457,6 +41873,12 @@ usb:v0CA6p3050*
 usb:v0CA7*
  ID_VENDOR_FROM_DATABASE=Information Systems Laboratories
 
+usb:v0CAA*
+ ID_VENDOR_FROM_DATABASE=Allied Telesis KK.
+
+usb:v0CAAp3001*
+ ID_MODEL_FROM_DATABASE=AT-VT-Kit3 Serial Adapter
+
 usb:v0CAD*
  ID_VENDOR_FROM_DATABASE=Motorola CGISS
 
@@ -40476,7 +41898,7 @@ usb:v0CADp1602*
  ID_MODEL_FROM_DATABASE=IMPRES Battery Data Reader
 
 usb:v0CADp9001*
- ID_MODEL_FROM_DATABASE=PowerPad Pocket PC Device
+ ID_MODEL_FROM_DATABASE=PowerPad Pocket PC Device
 
 usb:v0CAE*
  ID_VENDOR_FROM_DATABASE=Ascom Business Systems, Ltd
@@ -40694,6 +42116,9 @@ usb:v0CCDp00A9*
 usb:v0CCDp00B3*
  ID_MODEL_FROM_DATABASE=NOXON DAB/DAB+ Stick
 
+usb:v0CCDp00B9*
+ ID_MODEL_FROM_DATABASE=WDR DAB/DAB+ Stick
+
 usb:v0CCDp00E0*
  ID_MODEL_FROM_DATABASE=NOXON DAB/DAB+ Stick V2
 
@@ -40706,6 +42131,9 @@ usb:v0CCDp0105*
 usb:v0CCDp10A7*
  ID_MODEL_FROM_DATABASE=TerraTec G3
 
+usb:v0CCDp10AD*
+ ID_MODEL_FROM_DATABASE=Cinergy H5 Rev. 2
+
 usb:v0CD4*
  ID_VENDOR_FROM_DATABASE=Bang Olufsen
 
@@ -40910,6 +42338,9 @@ usb:v0CF3p0005*
 usb:v0CF3p0006*
  ID_MODEL_FROM_DATABASE=AR5523 (no firmware)
 
+usb:v0CF3p0036*
+ ID_MODEL_FROM_DATABASE=AR9462 Bluetooth
+
 usb:v0CF3p1001*
  ID_MODEL_FROM_DATABASE=Thomson TG121N [Atheros AR9001U-(2)NG]
 
@@ -40943,6 +42374,9 @@ usb:v0CF3p3007*
 usb:v0CF3p3008*
  ID_MODEL_FROM_DATABASE=Bluetooth (AR3011)
 
+usb:v0CF3p311D*
+ ID_MODEL_FROM_DATABASE=Bluetooth
+
 usb:v0CF3p311F*
  ID_MODEL_FROM_DATABASE=AR3012 Bluetooth
 
@@ -40955,6 +42389,9 @@ usb:v0CF3p9170*
 usb:v0CF3p9271*
  ID_MODEL_FROM_DATABASE=AR9271 802.11n
 
+usb:v0CF3p9378*
+ ID_MODEL_FROM_DATABASE=QCA9377-7
+
 usb:v0CF3pB002*
  ID_MODEL_FROM_DATABASE=Ubiquiti WiFiStation 802.11n [Atheros AR9271]
 
@@ -40964,6 +42401,9 @@ usb:v0CF3pB003*
 usb:v0CF3pE006*
  ID_MODEL_FROM_DATABASE=Dell Wireless 1802 Bluetooth 4.0 LE
 
+usb:v0CF3pE300*
+ ID_MODEL_FROM_DATABASE=QCA61x4 Bluetooth 4.0
+
 usb:v0CF4*
  ID_VENDOR_FROM_DATABASE=Fomtex Corp.
 
@@ -41069,9 +42509,27 @@ usb:v0D16p0002*
 usb:v0D16p0004*
  ID_MODEL_FROM_DATABASE=Photo Printer 63xPL/PS
 
+usb:v0D16p0007*
+ ID_MODEL_FROM_DATABASE=P510K
+
+usb:v0D16p0009*
+ ID_MODEL_FROM_DATABASE=P72x Series
+
+usb:v0D16p000A*
+ ID_MODEL_FROM_DATABASE=P728L
+
+usb:v0D16p000B*
+ ID_MODEL_FROM_DATABASE=P510L
+
+usb:v0D16p000D*
+ ID_MODEL_FROM_DATABASE=P518A
+
 usb:v0D16p000E*
  ID_MODEL_FROM_DATABASE=P910L
 
+usb:v0D16p0010*
+ ID_MODEL_FROM_DATABASE=M610
+
 usb:v0D16p0100*
  ID_MODEL_FROM_DATABASE=Photo Printer 63xPL/PS
 
@@ -41087,9 +42545,45 @@ usb:v0D16p0104*
 usb:v0D16p0105*
  ID_MODEL_FROM_DATABASE=Photo Printer 64xPS
 
+usb:v0D16p010E*
+ ID_MODEL_FROM_DATABASE=P510S
+
+usb:v0D16p0110*
+ ID_MODEL_FROM_DATABASE=P110S
+
+usb:v0D16p0111*
+ ID_MODEL_FROM_DATABASE=P510Si
+
+usb:v0D16p0112*
+ ID_MODEL_FROM_DATABASE=P518S
+
 usb:v0D16p0200*
  ID_MODEL_FROM_DATABASE=Photo Printer 64xDL
 
+usb:v0D16p0309*
+ ID_MODEL_FROM_DATABASE=CS-200e
+
+usb:v0D16p030A*
+ ID_MODEL_FROM_DATABASE=CS-220e
+
+usb:v0D16p0501*
+ ID_MODEL_FROM_DATABASE=P75x Series
+
+usb:v0D16p0502*
+ ID_MODEL_FROM_DATABASE=P52x Series
+
+usb:v0D16p0503*
+ ID_MODEL_FROM_DATABASE=P310L
+
+usb:v0D16p050A*
+ ID_MODEL_FROM_DATABASE=P310W
+
+usb:v0D16p050F*
+ ID_MODEL_FROM_DATABASE=P530D
+
+usb:v0D16p0800*
+ ID_MODEL_FROM_DATABASE=X610
+
 usb:v0D17*
  ID_VENDOR_FROM_DATABASE=NALTEC, Inc.
 
@@ -41105,6 +42599,12 @@ usb:v0D28*
 usb:v0D28p0204*
  ID_MODEL_FROM_DATABASE=ARM mbed
 
+usb:v0D2F*
+ ID_VENDOR_FROM_DATABASE=Andamiro
+
+usb:v0D2Fp0002*
+ ID_MODEL_FROM_DATABASE=Pump It Up Pad
+
 usb:v0D32*
  ID_VENDOR_FROM_DATABASE=Leo Hui Electric Wire & Cable Co., Ltd
 
@@ -41195,6 +42695,9 @@ usb:v0D49*
 usb:v0D49p3000*
  ID_MODEL_FROM_DATABASE=Drive
 
+usb:v0D49p3005*
+ ID_MODEL_FROM_DATABASE=Personal Storage 3000LS
+
 usb:v0D49p3010*
  ID_MODEL_FROM_DATABASE=3000LE Drive
 
@@ -41264,6 +42767,9 @@ usb:v0D50*
 usb:v0D50p0011*
  ID_MODEL_FROM_DATABASE=USB-Temp2 Thermometer
 
+usb:v0D50p0030*
+ ID_MODEL_FROM_DATABASE=Multiplexer
+
 usb:v0D50p0040*
  ID_MODEL_FROM_DATABASE=F4 foot switch
 
@@ -41285,6 +42791,12 @@ usb:v0D56*
 usb:v0D57*
  ID_VENDOR_FROM_DATABASE=Solomon Microtech, Ltd
 
+usb:v0D59*
+ ID_VENDOR_FROM_DATABASE=TRC Simulators b.v.
+
+usb:v0D59p02A8*
+ ID_MODEL_FROM_DATABASE=Digital Clock
+
 usb:v0D5C*
  ID_VENDOR_FROM_DATABASE=SMC Networks, Inc.
 
@@ -41342,6 +42854,9 @@ usb:v0D62p2050*
 usb:v0D62p2106*
  ID_MODEL_FROM_DATABASE=Dell L20U Multimedia Keyboard
 
+usb:v0D62p910E*
+ ID_MODEL_FROM_DATABASE=HP Business Slim Keyboard
+
 usb:v0D62pA100*
  ID_MODEL_FROM_DATABASE=Optical Mouse
 
@@ -41549,6 +43064,9 @@ usb:v0D8Cp0002*
 usb:v0D8Cp0003*
  ID_MODEL_FROM_DATABASE=Sound Device
 
+usb:v0D8Cp0004*
+ ID_MODEL_FROM_DATABASE=CM6631A Audio Processor
+
 usb:v0D8Cp0005*
  ID_MODEL_FROM_DATABASE=Blue Snowball
 
@@ -41858,6 +43376,9 @@ usb:v0DA4*
 usb:v0DA4p0001*
  ID_MODEL_FROM_DATABASE=Interface
 
+usb:v0DA4p0003*
+ ID_MODEL_FROM_DATABASE=FlowLink
+
 usb:v0DA4p0008*
  ID_MODEL_FROM_DATABASE=Loop
 
@@ -41990,6 +43511,9 @@ usb:v0DB0pB970*
 usb:v0DB0pB97A*
  ID_MODEL_FROM_DATABASE=Bluetooth EDR Device
 
+usb:v0DB0pFFFF*
+ ID_MODEL_FROM_DATABASE=Bluetooth Adapter in DFU mode
+
 usb:v0DB1*
  ID_VENDOR_FROM_DATABASE=Wen Te Electronics Co., Ltd
 
@@ -42017,6 +43541,9 @@ usb:v0DB5p013B*
 usb:v0DB5p0160*
  ID_MODEL_FROM_DATABASE=NFC and Smartcard Module (NSM)
 
+usb:v0DB5p0164*
+ ID_MODEL_FROM_DATABASE=NFC and Smartcard Module (NSM)with 4 SAM slots
+
 usb:v0DB7*
  ID_VENDOR_FROM_DATABASE=ELCON Systemtechnik
 
@@ -42113,6 +43640,9 @@ usb:v0DC4p0209*
 usb:v0DC4p020A*
  ID_MODEL_FROM_DATABASE=Oyen Digital MiniPro 2.5" hard drive enclosure
 
+usb:v0DC4p0290*
+ ID_MODEL_FROM_DATABASE=Mass Storage Device [NT2 U3.1]
+
 usb:v0DC5*
  ID_VENDOR_FROM_DATABASE=SDK Co., Ltd
 
@@ -42155,6 +43685,9 @@ usb:v0DD3*
 usb:v0DD4*
  ID_VENDOR_FROM_DATABASE=Custom Engineering SPA
 
+usb:v0DD4p0237*
+ ID_MODEL_FROM_DATABASE=K80 80mm Thermal Printer
+
 usb:v0DD5*
  ID_VENDOR_FROM_DATABASE=California Micro Devices
 
@@ -42164,6 +43697,9 @@ usb:v0DD7*
 usb:v0DD8*
  ID_VENDOR_FROM_DATABASE=Netac Technology Co., Ltd
 
+usb:v0DD8p0562*
+ ID_MODEL_FROM_DATABASE=Netac Portable SSD Z6s
+
 usb:v0DD8p1060*
  ID_MODEL_FROM_DATABASE=USB-CF-Card
 
@@ -42171,7 +43707,7 @@ usb:v0DD8pE007*
  ID_MODEL_FROM_DATABASE=OnlyDisk U222 Pendrive
 
 usb:v0DD8pF607*
- ID_MODEL_FROM_DATABASE=OnlyDisk U208 1G flash drive [U-SAFE]
+ ID_MODEL_FROM_DATABASE=OnlyDisk U210 1G flash drive [U-SAFE]
 
 usb:v0DD9*
  ID_VENDOR_FROM_DATABASE=HighSpeed Surfing
@@ -42494,9 +44030,15 @@ usb:v0DFC*
 usb:v0DFCp0001*
  ID_MODEL_FROM_DATABASE=Touchscreen
 
+usb:v0DFCp0003*
+ ID_MODEL_FROM_DATABASE=MultiTouch TouchScreen(Dualtouch)
+
 usb:v0DFCp0101*
  ID_MODEL_FROM_DATABASE=5-point Touch Screen
 
+usb:v0DFCpD107*
+ ID_MODEL_FROM_DATABASE=MultiTouch TouchScreen
+
 usb:v0E03*
  ID_VENDOR_FROM_DATABASE=Nippon Systemware Co., Ltd
 
@@ -42545,6 +44087,9 @@ usb:v0E0Fp0005*
 usb:v0E0Fp0006*
  ID_MODEL_FROM_DATABASE=Virtual Keyboard
 
+usb:v0E0Fp000A*
+ ID_MODEL_FROM_DATABASE=Virtual Sensors
+
 usb:v0E0Fp8001*
  ID_MODEL_FROM_DATABASE=Root Hub
 
@@ -42569,6 +44114,9 @@ usb:v0E1A*
 usb:v0E1B*
  ID_VENDOR_FROM_DATABASE=Crewave
 
+usb:v0E1E*
+ ID_VENDOR_FROM_DATABASE=Green Hills Software
+
 usb:v0E20*
  ID_VENDOR_FROM_DATABASE=Pegasus Technologies Ltd.
 
@@ -42761,8 +44309,14 @@ usb:v0E4C*
 usb:v0E4Cp1097*
  ID_MODEL_FROM_DATABASE=Gamester Controller
 
+usb:v0E4Cp1103*
+ ID_MODEL_FROM_DATABASE=Gamester Reflex
+
 usb:v0E4Cp2390*
- ID_MODEL_FROM_DATABASE=Games Jtech Controller
+ ID_MODEL_FROM_DATABASE=Jtech Controller
+
+usb:v0E4Cp3510*
+ ID_MODEL_FROM_DATABASE=Gamester for Xbox
 
 usb:v0E4Cp7288*
  ID_MODEL_FROM_DATABASE=funkey reader
@@ -42863,6 +44417,9 @@ usb:v0E6A*
 usb:v0E6Ap0101*
  ID_MODEL_FROM_DATABASE=MA100 [USB-UART Bridge IC]
 
+usb:v0E6Ap02C0*
+ ID_MODEL_FROM_DATABASE=Defender Gaming Keyboard
+
 usb:v0E6Ap030B*
  ID_MODEL_FROM_DATABASE=Truly Ergonomic Computer Keyboard (Device Firmware Update mode)
 
@@ -42887,9 +44444,90 @@ usb:v0E6Fp0005*
 usb:v0E6Fp0006*
  ID_MODEL_FROM_DATABASE=Edge wireless Controller
 
+usb:v0E6Fp0008*
+ ID_MODEL_FROM_DATABASE=After Glow Pro Controller
+
+usb:v0E6Fp0105*
+ ID_MODEL_FROM_DATABASE=Disney's High School Musical 3 Dance Pad for Xbox 360
+
+usb:v0E6Fp0113*
+ ID_MODEL_FROM_DATABASE=Afterglow AX.1 Gamepad
+
+usb:v0E6Fp011F*
+ ID_MODEL_FROM_DATABASE=Rock Candy Wired Controller for Xbox 360
+
 usb:v0E6Fp0128*
  ID_MODEL_FROM_DATABASE=Wireless PS3 Controller
 
+usb:v0E6Fp0131*
+ ID_MODEL_FROM_DATABASE=PDP EA Sports Controller
+
+usb:v0E6Fp0133*
+ ID_MODEL_FROM_DATABASE=Wired Controller
+
+usb:v0E6Fp0139*
+ ID_MODEL_FROM_DATABASE=Afterglow Prismatic Wired Controller for Xbox One
+
+usb:v0E6Fp013A*
+ ID_MODEL_FROM_DATABASE=PDP Xbox One Controller
+
+usb:v0E6Fp0146*
+ ID_MODEL_FROM_DATABASE=Rock Candy Wired Controller for Xbox One
+
+usb:v0E6Fp0147*
+ ID_MODEL_FROM_DATABASE=PDP Marvel Controller for Xbox One
+
+usb:v0E6Fp015C*
+ ID_MODEL_FROM_DATABASE=PDP Arcade Stick for Xbox One
+
+usb:v0E6Fp0161*
+ ID_MODEL_FROM_DATABASE=Camo Wired Controller for Xbox One
+
+usb:v0E6Fp0162*
+ ID_MODEL_FROM_DATABASE=Xbox One Wired Controller
+
+usb:v0E6Fp0163*
+ ID_MODEL_FROM_DATABASE=Legendary Collection Deliverer of Truth
+
+usb:v0E6Fp0164*
+ ID_MODEL_FROM_DATABASE=Battlefield 1 Wired Controller for Xbox One
+
+usb:v0E6Fp0165*
+ ID_MODEL_FROM_DATABASE=Titanfall 2 Wired Controller for Xbox One
+
+usb:v0E6Fp0201*
+ ID_MODEL_FROM_DATABASE=Pelican PL-3601
+
+usb:v0E6Fp0213*
+ ID_MODEL_FROM_DATABASE=Afterglow Gamepad for Xbox 360
+
+usb:v0E6Fp021F*
+ ID_MODEL_FROM_DATABASE=Rock Candy Gamepad for Xbox 360
+
+usb:v0E6Fp0246*
+ ID_MODEL_FROM_DATABASE=Rock Candy Gamepad for Xbox One
+
+usb:v0E6Fp0301*
+ ID_MODEL_FROM_DATABASE=Controller
+
+usb:v0E6Fp0346*
+ ID_MODEL_FROM_DATABASE=Rock Candy Wired Controller for Xbox One
+
+usb:v0E6Fp0401*
+ ID_MODEL_FROM_DATABASE=Controller
+
+usb:v0E6Fp0413*
+ ID_MODEL_FROM_DATABASE=Afterglow AX.1 Gamepad for Xbox 360
+
+usb:v0E6Fp0501*
+ ID_MODEL_FROM_DATABASE=Wired Controller
+
+usb:v0E6FpF501*
+ ID_MODEL_FROM_DATABASE=Hi-TEC Essentials Wired Gamepad
+
+usb:v0E6FpF900*
+ ID_MODEL_FROM_DATABASE=Afterglow AX.1
+
 usb:v0E70*
  ID_VENDOR_FROM_DATABASE=Tokyo Electronic Industry Co., Ltd
 
@@ -42956,6 +44594,9 @@ usb:v0E8C*
 usb:v0E8D*
  ID_VENDOR_FROM_DATABASE=MediaTek Inc.
 
+usb:v0E8Dp0002*
+ ID_MODEL_FROM_DATABASE=phone (mass storage mode) [Doro Primo 413]
+
 usb:v0E8Dp0003*
  ID_MODEL_FROM_DATABASE=MT6227 phone
 
@@ -42963,7 +44604,7 @@ usb:v0E8Dp0004*
  ID_MODEL_FROM_DATABASE=MT6227 phone
 
 usb:v0E8Dp0023*
- ID_MODEL_FROM_DATABASE=S103
+ ID_MODEL_FROM_DATABASE=S103 / Powertel M6200
 
 usb:v0E8Dp00A5*
  ID_MODEL_FROM_DATABASE=GSM modem [Medion Surfstick Model:S4222]
@@ -42974,18 +44615,30 @@ usb:v0E8Dp1806*
 usb:v0E8Dp1836*
  ID_MODEL_FROM_DATABASE=Samsung SE-S084 Super WriteMaster Slim External DVD writer
 
+usb:v0E8Dp1887*
+ ID_MODEL_FROM_DATABASE=Slim Portable DVD Writer
+
 usb:v0E8Dp1956*
  ID_MODEL_FROM_DATABASE=Samsung SE-506 Portable BluRay Disc Writer
 
 usb:v0E8Dp2000*
  ID_MODEL_FROM_DATABASE=MT65xx Preloader
 
+usb:v0E8Dp2008*
+ ID_MODEL_FROM_DATABASE=Cyrus Technology CS 24
+
 usb:v0E8Dp3329*
  ID_MODEL_FROM_DATABASE=Qstarz BT-Q1000XT
 
+usb:v0E8Dp7612*
+ ID_MODEL_FROM_DATABASE=MT7612U 802.11a/b/g/n/ac Wireless Adapter
+
 usb:v0E8Dp763E*
  ID_MODEL_FROM_DATABASE=MT7630e Bluetooth Adapter
 
+usb:v0E8Dp7668*
+ ID_MODEL_FROM_DATABASE=MT7668 2x2 Dual Band Dual Concurrent 802.11a/b/g/n/ac WiFi with MU-MIMO and Bluetooth 5.0 Radios
+
 usb:v0E8F*
  ID_VENDOR_FROM_DATABASE=GreenAsia Inc.
 
@@ -43010,6 +44663,9 @@ usb:v0E8Fp0022*
 usb:v0E8Fp0201*
  ID_MODEL_FROM_DATABASE=SmartJoy Frag Xpad/PS2 adaptor
 
+usb:v0E8Fp3008*
+ ID_MODEL_FROM_DATABASE=Xbox Controller
+
 usb:v0E8Fp300A*
  ID_MODEL_FROM_DATABASE=steering Wheel
 
@@ -43076,6 +44732,9 @@ usb:v0EA0p2153*
 usb:v0EA0p2168*
  ID_MODEL_FROM_DATABASE=Transcend JetFlash 2.0 / Astone USB Drive / Intellegent Stick 2.0
 
+usb:v0EA0p2213*
+ ID_MODEL_FROM_DATABASE=WinDroid N287 AH7N2502.013317
+
 usb:v0EA0p6803*
  ID_MODEL_FROM_DATABASE=OTI-6803 Flash Disk
 
@@ -43137,7 +44796,7 @@ usb:v0EB8p2200*
  ID_MODEL_FROM_DATABASE=Ariva Scale
 
 usb:v0EB8pF000*
- ID_MODEL_FROM_DATABASE=PS60 Scale
+ ID_MODEL_FROM_DATABASE=BC60 Scale
 
 usb:v0EBB*
  ID_VENDOR_FROM_DATABASE=Thermo Fisher Scientific
@@ -43263,7 +44922,7 @@ usb:v0EEF*
  ID_VENDOR_FROM_DATABASE=D-WAV Scientific Co., Ltd
 
 usb:v0EEFp0001*
- ID_MODEL_FROM_DATABASE=eGalax TouchScreen
+ ID_MODEL_FROM_DATABASE=Titan6001 Surface Acoustic Wave Touchscreen Controller [eGalax]
 
 usb:v0EEFp0002*
  ID_MODEL_FROM_DATABASE=Touchscreen Controller(Professional)
@@ -43271,9 +44930,18 @@ usb:v0EEFp0002*
 usb:v0EEFp7200*
  ID_MODEL_FROM_DATABASE=Touchscreen Controller
 
+usb:v0EEFp7904*
+ ID_MODEL_FROM_DATABASE=Multitouch Capacitive Touchscreen eGalaxTouch EXC7904-21v00_T13 [IIyama Prolite T1932-MSC]
+
 usb:v0EEFpA802*
  ID_MODEL_FROM_DATABASE=eGalaxTouch EXC7920
 
+usb:v0EEFpB10E*
+ ID_MODEL_FROM_DATABASE=eGalaxTouch EXC3000
+
+usb:v0EEFpC000*
+ ID_MODEL_FROM_DATABASE=Multitouch Capacitive Touchscreen eGalaxTouch EXC3188-4643-08.00.00.00 Sirius_4643 PCAP3188UR Series [IIyama Prolite PLT1932MSC]
+
 usb:v0EF0*
  ID_VENDOR_FROM_DATABASE=Hitachi Cable, Ltd
 
@@ -43328,9 +44996,39 @@ usb:v0F0C*
 usb:v0F0D*
  ID_VENDOR_FROM_DATABASE=Hori Co., Ltd
 
+usb:v0F0Dp000A*
+ ID_MODEL_FROM_DATABASE=Dead or Alive 4 FightStick for Xbox 360
+
+usb:v0F0Dp000C*
+ ID_MODEL_FROM_DATABASE=Horipad EX Turbo for Xbox 360
+
+usb:v0F0Dp000D*
+ ID_MODEL_FROM_DATABASE=Fighting Stick EX2 for Xbox 360
+
 usb:v0F0Dp0011*
  ID_MODEL_FROM_DATABASE=Real Arcade Pro 3
 
+usb:v0F0Dp0016*
+ ID_MODEL_FROM_DATABASE=Real Arcade Pro.EX for Xbox 360
+
+usb:v0F0Dp001B*
+ ID_MODEL_FROM_DATABASE=Real Aracde Pro.VX
+
+usb:v0F0Dp0063*
+ ID_MODEL_FROM_DATABASE=Real Arcade Pro Hayabusa for Xbox One
+
+usb:v0F0Dp0067*
+ ID_MODEL_FROM_DATABASE=Horipad One
+
+usb:v0F0Dp0078*
+ ID_MODEL_FROM_DATABASE=Real Arcade Pro V Kai for Xbox One / Xbox 360
+
+usb:v0F0Dp0090*
+ ID_MODEL_FROM_DATABASE=Horipad Ultimate
+
+usb:v0F0Dp00C1*
+ ID_MODEL_FROM_DATABASE=HORIPAD for Nintendo Switch
+
 usb:v0F0E*
  ID_VENDOR_FROM_DATABASE=Energy Full Corp.
 
@@ -43466,15 +45164,24 @@ usb:v0F30*
 usb:v0F30p001C*
  ID_MODEL_FROM_DATABASE=PS3 Guitar Controller Dongle
 
+usb:v0F30p010B*
+ ID_MODEL_FROM_DATABASE=Philips Recoil
+
 usb:v0F30p0110*
  ID_MODEL_FROM_DATABASE=Dual Analog Rumble Pad
 
 usb:v0F30p0111*
  ID_MODEL_FROM_DATABASE=Colour Rumble Pad
 
+usb:v0F30p0202*
+ ID_MODEL_FROM_DATABASE=Joytech Advanced Controller
+
 usb:v0F30p0208*
  ID_MODEL_FROM_DATABASE=Xbox & PC Gamepad
 
+usb:v0F30p8888*
+ ID_MODEL_FROM_DATABASE=BigBen XBMiniPad Controller
+
 usb:v0F31*
  ID_VENDOR_FROM_DATABASE=Chrysalis Development
 
@@ -43490,6 +45197,9 @@ usb:v0F38*
 usb:v0F39*
  ID_VENDOR_FROM_DATABASE=TG3 Electronics
 
+usb:v0F39p0404*
+ ID_MODEL_FROM_DATABASE=Recreated ZX Spectrum Keyboard
+
 usb:v0F39p0876*
  ID_MODEL_FROM_DATABASE=Keyboard [87 Francium Pro]
 
@@ -43523,6 +45233,12 @@ usb:v0F44pFF11*
 usb:v0F44pFF12*
  ID_MODEL_FROM_DATABASE=Liberty
 
+usb:v0F49*
+ ID_VENDOR_FROM_DATABASE=Evolis SA
+
+usb:v0F49p0A00*
+ ID_MODEL_FROM_DATABASE=Zenius
+
 usb:v0F4B*
  ID_VENDOR_FROM_DATABASE=St. John Technology Co., Ltd
 
@@ -43823,6 +45539,9 @@ usb:v0FCAp8010*
 usb:v0FCAp8011*
  ID_MODEL_FROM_DATABASE=Blackberry Playbook (Connect to Mac mode)
 
+usb:v0FCAp8014*
+ ID_MODEL_FROM_DATABASE=Blackberry Handheld Z30
+
 usb:v0FCAp8020*
  ID_MODEL_FROM_DATABASE=Blackberry Playbook (CD-Rom mode)
 
@@ -43889,8 +45608,14 @@ usb:v0FCEp01BA*
 usb:v0FCEp01BB*
  ID_MODEL_FROM_DATABASE=D5803 [Xperia Z3 Compact] (MTP mode)
 
-usb:v0FCEp0DDE*
- ID_MODEL_FROM_DATABASE=Xperia Mini Pro Bootloader
+usb:v0FCEp01E0*
+ ID_MODEL_FROM_DATABASE=F5122 [Xperia X dual] (MTP mode)
+
+usb:v0FCEp01E8*
+ ID_MODEL_FROM_DATABASE=F5321 [Xperia X Compact] (MTP mode)
+
+usb:v0FCEp01F9*
+ ID_MODEL_FROM_DATABASE=H8314 [Xperia XZ2 Compact]
 
 usb:v0FCEp1010*
  ID_MODEL_FROM_DATABASE=WMC Modem
@@ -43940,6 +45665,9 @@ usb:v0FCEp518C*
 usb:v0FCEp51A7*
  ID_MODEL_FROM_DATABASE=D5503 (Xperia Z1 Compact)
 
+usb:v0FCEp51E0*
+ ID_MODEL_FROM_DATABASE=F5122 [Xperia X dual] (developer mode)
+
 usb:v0FCEp614F*
  ID_MODEL_FROM_DATABASE=Xperia X12 (debug mode)
 
@@ -43958,12 +45686,30 @@ usb:v0FCEp7166*
 usb:v0FCEp7177*
  ID_MODEL_FROM_DATABASE=Xperia Ion [Tethering]
 
+usb:v0FCEp71F4*
+ ID_MODEL_FROM_DATABASE=G8441 (Xperia XZ1 Compact) [Tethering]
+
+usb:v0FCEp71F9*
+ ID_MODEL_FROM_DATABASE=H8314 [Xperia XZ2 Compact] (Tethering)
+
 usb:v0FCEp8004*
  ID_MODEL_FROM_DATABASE=9000 Phone [Mass Storage]
 
+usb:v0FCEp81F4*
+ ID_MODEL_FROM_DATABASE=G8441 (Xperia XZ1 Compact) [Tethering]
+
 usb:v0FCEpADDE*
  ID_MODEL_FROM_DATABASE=C2005 (Xperia M dual) in service mode
 
+usb:v0FCEpC1E0*
+ ID_MODEL_FROM_DATABASE=F5122 [Xperia X dual] (MIDI mode)
+
+usb:v0FCEpC1E8*
+ ID_MODEL_FROM_DATABASE=F5321 [Xperia X Compact] (MIDI mode)
+
+usb:v0FCEpC1F9*
+ ID_MODEL_FROM_DATABASE=H8314 [Xperia XZ2 Compact] (MIDI)
+
 usb:v0FCEpD008*
  ID_MODEL_FROM_DATABASE=V800-Vodafone 802SE Phone
 
@@ -44006,6 +45752,9 @@ usb:v0FCEpD065*
 usb:v0FCEpD076*
  ID_MODEL_FROM_DATABASE=W910i (Phone mode)
 
+usb:v0FCEpD079*
+ ID_MODEL_FROM_DATABASE=K530 Phone
+
 usb:v0FCEpD089*
  ID_MODEL_FROM_DATABASE=W580i Phone (mass storage)
 
@@ -44210,6 +45959,18 @@ usb:v0FD9p0033*
 usb:v0FD9p0037*
  ID_MODEL_FROM_DATABASE=Video Capture v2
 
+usb:v0FD9p0060*
+ ID_MODEL_FROM_DATABASE=Stream Deck
+
+usb:v0FD9p0063*
+ ID_MODEL_FROM_DATABASE=Stream Deck Mini
+
+usb:v0FD9p006C*
+ ID_MODEL_FROM_DATABASE=Stream Deck XL
+
+usb:v0FD9p006D*
+ ID_MODEL_FROM_DATABASE=Stream Deck original V2
+
 usb:v0FDA*
  ID_VENDOR_FROM_DATABASE=Quantec Networks GmbH
 
@@ -44228,6 +45989,9 @@ usb:v0FDEpCA01*
 usb:v0FDEpCA05*
  ID_MODEL_FROM_DATABASE=CM160
 
+usb:v0FDEpCA08*
+ ID_MODEL_FROM_DATABASE=WMR300 Professional Weather System
+
 usb:v0FE0*
  ID_VENDOR_FROM_DATABASE=Osterhout Design Group
 
@@ -44315,6 +46079,9 @@ usb:v0FFC*
 usb:v0FFCp0021*
  ID_MODEL_FROM_DATABASE=Nord Stage 2
 
+usb:v0FFCp002A*
+ ID_MODEL_FROM_DATABASE=Nord Piano 4
+
 usb:v0FFD*
  ID_VENDOR_FROM_DATABASE=EarlySense
 
@@ -44342,6 +46109,9 @@ usb:v1003p0003*
 usb:v1003p0100*
  ID_MODEL_FROM_DATABASE=SD9/SD10
 
+usb:v1003p8781*
+ ID_MODEL_FROM_DATABASE=Dock UD-01
+
 usb:v1004*
  ID_VENDOR_FROM_DATABASE=LG Electronics, Inc.
 
@@ -44394,13 +46164,13 @@ usb:v1004p6300*
  ID_MODEL_FROM_DATABASE=G2/Optimus Android Phone [Charge mode]
 
 usb:v1004p631C*
- ID_MODEL_FROM_DATABASE=G2/Optimus Android Phone [MTP mode]
+ ID_MODEL_FROM_DATABASE=LM-X420xxx/G2/Optimus Android Phone (charge mode)
 
 usb:v1004p631D*
  ID_MODEL_FROM_DATABASE=Optimus Android Phone (Camera/PTP Mode)
 
 usb:v1004p631E*
- ID_MODEL_FROM_DATABASE=G2/Optimus Android Phone [Camera/PTP mode]
+ ID_MODEL_FROM_DATABASE=LM-X420xxx/G2/Optimus Android Phone (PTP/camera mode)
 
 usb:v1004p631F*
  ID_MODEL_FROM_DATABASE=Optimus Android Phone (Charge Mode)
@@ -44409,10 +46179,13 @@ usb:v1004p633A*
  ID_MODEL_FROM_DATABASE=Ultimate 2 Android Phone L41C
 
 usb:v1004p633E*
- ID_MODEL_FROM_DATABASE=G2/G3 Android Phone [MTP/PTP/Download mode]
+ ID_MODEL_FROM_DATABASE=LM-X420xxx/G2/G3 Android Phone (MTP/download mode)
 
 usb:v1004p6344*
- ID_MODEL_FROM_DATABASE=G2 Android Phone [tethering mode]
+ ID_MODEL_FROM_DATABASE=LM-X420xxx/G2 Android Phone (USB tethering mode)
+
+usb:v1004p6348*
+ ID_MODEL_FROM_DATABASE=LM-X420xxx Android Phone (MIDI mode)
 
 usb:v1004p6356*
  ID_MODEL_FROM_DATABASE=Optimus Android Phone [Virtual CD mode]
@@ -44444,6 +46217,9 @@ usb:v1005p1006*
 usb:v1005pB113*
  ID_MODEL_FROM_DATABASE=Handy Steno/AH123 / Handy Steno 2.0/HT203
 
+usb:v1005pB155*
+ ID_MODEL_FROM_DATABASE=Disk Module
+
 usb:v1005pB223*
  ID_MODEL_FROM_DATABASE=CD-RW + 6in1 Card Reader Digital Storage / Converter
 
@@ -44546,6 +46322,9 @@ usb:v1016*
 usb:v1017*
  ID_VENDOR_FROM_DATABASE=Speedy Industrial Supplies, Pte., Ltd
 
+usb:v1017p9015*
+ ID_MODEL_FROM_DATABASE=M625 [Vendor: DELUX]
+
 usb:v1019*
  ID_VENDOR_FROM_DATABASE=Elitegroup Computer Systems (ECS)
 
@@ -44565,7 +46344,7 @@ usb:v1020p000A*
  ID_MODEL_FROM_DATABASE=Wireless Optical Mouse
 
 usb:v1020p0106*
- ID_MODEL_FROM_DATABASE=Wireless Optical Mouse
+ ID_MODEL_FROM_DATABASE=Wireless Optical Mouse/Keyboard
 
 usb:v1022*
  ID_VENDOR_FROM_DATABASE=Shinko Shoji Co., Ltd
@@ -44612,6 +46391,9 @@ usb:v102Cp6151*
 usb:v102Cp6251*
  ID_MODEL_FROM_DATABASE=Q-Cam VGA
 
+usb:v102CpFF0C*
+ ID_MODEL_FROM_DATABASE=Joytech Wireless Advanced Controller
+
 usb:v102D*
  ID_VENDOR_FROM_DATABASE=Winic Corp.
 
@@ -44633,9 +46415,18 @@ usb:v1038*
 usb:v1038p0100*
  ID_MODEL_FROM_DATABASE=Ideazon Zboard
 
+usb:v1038p1260*
+ ID_MODEL_FROM_DATABASE=Arctis 7 wireless adapter
+
 usb:v1038p1361*
  ID_MODEL_FROM_DATABASE=Ideazon Sensei
 
+usb:v1038p1410*
+ ID_MODEL_FROM_DATABASE=SRW-S1 [Simraceway Steering Wheel]
+
+usb:v1038p1720*
+ ID_MODEL_FROM_DATABASE=Mouse
+
 usb:v1039*
  ID_VENDOR_FROM_DATABASE=devolo AG
 
@@ -44759,6 +46550,9 @@ usb:v104D*
 usb:v104Dp1003*
  ID_MODEL_FROM_DATABASE=Model-52 LED Light Source Power Supply and Driver
 
+usb:v104Dp3001*
+ ID_MODEL_FROM_DATABASE=ESP301 3 Axis Motion Controller
+
 usb:v104F*
  ID_VENDOR_FROM_DATABASE=WB Electronics
 
@@ -44823,25 +46617,25 @@ usb:v1050p0211*
  ID_MODEL_FROM_DATABASE=Gnubby
 
 usb:v1050p0401*
- ID_MODEL_FROM_DATABASE=Yubikey 4 OTP
+ ID_MODEL_FROM_DATABASE=Yubikey 4/5 OTP
 
 usb:v1050p0402*
- ID_MODEL_FROM_DATABASE=Yubikey 4 U2F
+ ID_MODEL_FROM_DATABASE=Yubikey 4/5 U2F
 
 usb:v1050p0403*
- ID_MODEL_FROM_DATABASE=Yubikey 4 OTP+U2F
+ ID_MODEL_FROM_DATABASE=Yubikey 4/5 OTP+U2F
 
 usb:v1050p0404*
- ID_MODEL_FROM_DATABASE=Yubikey 4 CCID
+ ID_MODEL_FROM_DATABASE=Yubikey 4/5 CCID
 
 usb:v1050p0405*
- ID_MODEL_FROM_DATABASE=Yubikey 4 OTP+CCID
+ ID_MODEL_FROM_DATABASE=Yubikey 4/5 OTP+CCID
 
 usb:v1050p0406*
- ID_MODEL_FROM_DATABASE=Yubikey 4 U2F+CCID
+ ID_MODEL_FROM_DATABASE=Yubikey 4/5 U2F+CCID
 
 usb:v1050p0407*
- ID_MODEL_FROM_DATABASE=Yubikey 4 OTP+U2F+CCID
+ ID_MODEL_FROM_DATABASE=Yubikey 4/5 OTP+U2F+CCID
 
 usb:v1050p0410*
  ID_MODEL_FROM_DATABASE=Yubikey plus OTP+U2F
@@ -45041,6 +46835,9 @@ usb:v1058p1130*
 usb:v1058p1140*
  ID_MODEL_FROM_DATABASE=My Book Essential (WDBACW)
 
+usb:v1058p1170*
+ ID_MODEL_FROM_DATABASE=My Book Essential 3TB (WDBACW0030HBK)
+
 usb:v1058p1230*
  ID_MODEL_FROM_DATABASE=My Book (WDBFJK)
 
@@ -45057,7 +46854,7 @@ usb:v1058p259F*
  ID_MODEL_FROM_DATABASE=My Passport Ultra (WD10JMVW)
 
 usb:v1058p25A1*
- ID_MODEL_FROM_DATABASE=Elements / My Passport (WD20NMVW)
+ ID_MODEL_FROM_DATABASE=Elements / My Passport
 
 usb:v1058p25A2*
  ID_MODEL_FROM_DATABASE=Elements 25A2
@@ -45065,9 +46862,36 @@ usb:v1058p25A2*
 usb:v1058p25A3*
  ID_MODEL_FROM_DATABASE=Elements Desktop (WDBWLG)
 
+usb:v1058p25DA*
+ ID_MODEL_FROM_DATABASE=My Book (WDBFJK)
+
+usb:v1058p25E1*
+ ID_MODEL_FROM_DATABASE=My Passport (WD20NMVW)
+
 usb:v1058p25E2*
  ID_MODEL_FROM_DATABASE=My Passport (WD40NMZW)
 
+usb:v1058p25EE*
+ ID_MODEL_FROM_DATABASE=My Book 25EE
+
+usb:v1058p25F3*
+ ID_MODEL_FROM_DATABASE=My Passport SSD (WDBK3E)
+
+usb:v1058p25FA*
+ ID_MODEL_FROM_DATABASE=easystore Portable 5TB (WDBKUZ0050)
+
+usb:v1058p25FB*
+ ID_MODEL_FROM_DATABASE=easystore Desktop (WDBCKA)
+
+usb:v1058p2603*
+ ID_MODEL_FROM_DATABASE=My Passport Game Storage for PS4 4TB (WDBZGE0040)
+
+usb:v1058p2624*
+ ID_MODEL_FROM_DATABASE=easystore Portable 5TB (WDBKUZ0050)
+
+usb:v1058p2626*
+ ID_MODEL_FROM_DATABASE=My Passport (WDBPKJ)
+
 usb:v1058p30A0*
  ID_MODEL_FROM_DATABASE=SATA adapter cable
 
@@ -45500,6 +47324,9 @@ usb:v108Bp0005*
 usb:v108C*
  ID_VENDOR_FROM_DATABASE=Robert Bosch GmbH
 
+usb:v108Cp017E*
+ ID_MODEL_FROM_DATABASE=GTC 400 C
+
 usb:v108E*
  ID_VENDOR_FROM_DATABASE=Lotes Co., Ltd.
 
@@ -45518,9 +47345,18 @@ usb:v109A*
 usb:v109B*
  ID_VENDOR_FROM_DATABASE=Hisense
 
+usb:v109Bp9109*
+ ID_MODEL_FROM_DATABASE=CROSSCALL Trekker-M1 Core (MTP-Mode)
+
 usb:v109Bp9118*
  ID_MODEL_FROM_DATABASE=Medion P4013 Mobile
 
+usb:v109Bp9119*
+ ID_MODEL_FROM_DATABASE=CROSSCALL Trekker-M1 Core (PTP-Mode)
+
+usb:v109BpF009*
+ ID_MODEL_FROM_DATABASE=CROSSCALL Trekker-M1 Core (CD-ROM-Mode)
+
 usb:v109F*
  ID_VENDOR_FROM_DATABASE=eSOL Co., Ltd
 
@@ -45971,6 +47807,12 @@ usb:v10CEp001D*
 usb:v10CEp001E*
  ID_MODEL_FROM_DATABASE=Ciaat Brava 21
 
+usb:v10CEp0039*
+ ID_MODEL_FROM_DATABASE=Sinfonia CHC-S2245
+
+usb:v10CEp10CE*
+ ID_MODEL_FROM_DATABASE=Sinfonia CHC-S2245
+
 usb:v10CEpEA6A*
  ID_MODEL_FROM_DATABASE=MobiData EDGE USB Modem
 
@@ -46025,6 +47867,9 @@ usb:v10D5p5552*
 usb:v10D5p55A2*
  ID_MODEL_FROM_DATABASE=2Port KVMSwitcher
 
+usb:v10D5p5A08*
+ ID_MODEL_FROM_DATABASE=Dual Bay Docking Station
+
 usb:v10D6*
  ID_VENDOR_FROM_DATABASE=Actions Semiconductor Co., Ltd
 
@@ -46103,6 +47948,90 @@ usb:v10F5*
 usb:v10F5p0200*
  ID_MODEL_FROM_DATABASE=Audio Advantage Roadie
 
+usb:v10F5p0231*
+ ID_MODEL_FROM_DATABASE=Ear Force P11 Headset
+
+usb:v10F5p10F5*
+ ID_MODEL_FROM_DATABASE=EarForce PX21 Gaming Headset
+
+usb:v10F8*
+ ID_VENDOR_FROM_DATABASE=Cesys GmbH
+
+usb:v10F8p3201*
+ ID_MODEL_FROM_DATABASE=CeboLC
+
+usb:v10F8p3202*
+ ID_MODEL_FROM_DATABASE=CeboStick
+
+usb:v10F8p3203*
+ ID_MODEL_FROM_DATABASE=CeboMSA64
+
+usb:v10F8p3204*
+ ID_MODEL_FROM_DATABASE=CeboDFN
+
+usb:v10F8p3205*
+ ID_MODEL_FROM_DATABASE=PSAA2304W_CASC
+
+usb:v10F8pC401*
+ ID_MODEL_FROM_DATABASE=USBV4F unconfigured
+
+usb:v10F8pC402*
+ ID_MODEL_FROM_DATABASE=EFM01 unconfigured
+
+usb:v10F8pC403*
+ ID_MODEL_FROM_DATABASE=MISS2 unconfigured
+
+usb:v10F8pC404*
+ ID_MODEL_FROM_DATABASE=CID unconfigured
+
+usb:v10F8pC405*
+ ID_MODEL_FROM_DATABASE=USBS6 unconfigured
+
+usb:v10F8pC406*
+ ID_MODEL_FROM_DATABASE=OP_MISS2 unconfigured
+
+usb:v10F8pC407*
+ ID_MODEL_FROM_DATABASE=NanoUsb uncofigured
+
+usb:v10F8pC481*
+ ID_MODEL_FROM_DATABASE=USBV4F
+
+usb:v10F8pC482*
+ ID_MODEL_FROM_DATABASE=EFM01
+
+usb:v10F8pC483*
+ ID_MODEL_FROM_DATABASE=MISS2
+
+usb:v10F8pC484*
+ ID_MODEL_FROM_DATABASE=CID
+
+usb:v10F8pC485*
+ ID_MODEL_FROM_DATABASE=USBS6
+
+usb:v10F8pC486*
+ ID_MODEL_FROM_DATABASE=OP_MISS2
+
+usb:v10F8pC487*
+ ID_MODEL_FROM_DATABASE=NanoUsb
+
+usb:v10F8pC501*
+ ID_MODEL_FROM_DATABASE=EFM02 unconfigured
+
+usb:v10F8pC502*
+ ID_MODEL_FROM_DATABASE=EFM02/B unconfigured
+
+usb:v10F8pC503*
+ ID_MODEL_FROM_DATABASE=EFM03 unconfigured
+
+usb:v10F8pC581*
+ ID_MODEL_FROM_DATABASE=EFM02
+
+usb:v10F8pC582*
+ ID_MODEL_FROM_DATABASE=EFM02/B
+
+usb:v10F8pC583*
+ ID_MODEL_FROM_DATABASE=EFM03
+
 usb:v10FB*
  ID_VENDOR_FROM_DATABASE=Pictos Technologies, Inc.
 
@@ -46145,6 +48074,12 @@ usb:v1108*
 usb:v110A*
  ID_VENDOR_FROM_DATABASE=Moxa Technologies Co., Ltd.
 
+usb:v110Ap1110*
+ ID_MODEL_FROM_DATABASE=UPort 1110
+
+usb:v110Ap1150*
+ ID_MODEL_FROM_DATABASE=UPort 1150 1-Port RS-232/422/485
+
 usb:v110Ap1250*
  ID_MODEL_FROM_DATABASE=UPort 1250 2-Port RS-232/422/485
 
@@ -46253,12 +48188,18 @@ usb:v1130p0001*
 usb:v1130p0002*
  ID_MODEL_FROM_DATABASE=iBuddy
 
+usb:v1130p0004*
+ ID_MODEL_FROM_DATABASE=iBuddy Twins
+
 usb:v1130p0202*
  ID_MODEL_FROM_DATABASE=Rocket Launcher
 
 usb:v1130p6604*
  ID_MODEL_FROM_DATABASE=MCE IR-Receiver
 
+usb:v1130p6606*
+ ID_MODEL_FROM_DATABASE=U+P Mouse
+
 usb:v1130p660C*
  ID_MODEL_FROM_DATABASE=Foot Pedal/Thermometer
 
@@ -46634,15 +48575,27 @@ usb:v1199p9009*
 usb:v1199p900A*
  ID_MODEL_FROM_DATABASE=Gobi 2000 Wireless Modem
 
+usb:v1199p9011*
+ ID_MODEL_FROM_DATABASE=MC8305 Modem
+
 usb:v1199p9013*
  ID_MODEL_FROM_DATABASE=Sierra Wireless Gobi 3000 Modem device (MC8355)
 
+usb:v1199p9041*
+ ID_MODEL_FROM_DATABASE=EM7305 Modem
+
 usb:v1199p9055*
  ID_MODEL_FROM_DATABASE=Gobi 9x15 Multimode 3G/4G LTE Modem (NAT mode)
 
 usb:v1199p9057*
  ID_MODEL_FROM_DATABASE=Gobi 9x15 Multimode 3G/4G LTE Modem (IP passthrough mode)
 
+usb:v1199p9071*
+ ID_MODEL_FROM_DATABASE=AirPrime MC7455 3G/4G LTE Modem
+
+usb:v1199p9079*
+ ID_MODEL_FROM_DATABASE=EM7455
+
 usb:v119A*
  ID_VENDOR_FROM_DATABASE=ZHAN QI Technology Co., Ltd
 
@@ -46688,6 +48641,9 @@ usb:v11B0*
 usb:v11B0p6208*
  ID_MODEL_FROM_DATABASE=PRO-28U
 
+usb:v11B0p6298*
+ ID_MODEL_FROM_DATABASE=Kingston SNA-DC/U
+
 usb:v11BE*
  ID_VENDOR_FROM_DATABASE=R&D International NV
 
@@ -46706,9 +48662,18 @@ usb:v11C5*
 usb:v11C5p0521*
  ID_MODEL_FROM_DATABASE=IMT-0521 Smartcard Reader
 
+usb:v11C9*
+ ID_VENDOR_FROM_DATABASE=Nacon
+
+usb:v11C9p55F0*
+ ID_MODEL_FROM_DATABASE=GC-100XF
+
 usb:v11CA*
  ID_VENDOR_FROM_DATABASE=VeriFone Inc
 
+usb:v11CAp0201*
+ ID_MODEL_FROM_DATABASE=MX870/MX880
+
 usb:v11CAp0207*
  ID_MODEL_FROM_DATABASE=PIN Pad VX 810
 
@@ -46772,6 +48737,51 @@ usb:v1209*
 usb:v1209p0001*
  ID_MODEL_FROM_DATABASE=pid.codes Test PID
 
+usb:v1209p0002*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p0003*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p0004*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p0005*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p0006*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p0007*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p0008*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p0009*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p000A*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p000B*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p000C*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p000D*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p000E*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p000F*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
+usb:v1209p0010*
+ ID_MODEL_FROM_DATABASE=pid.codes Test PID
+
 usb:v1209p01C0*
  ID_MODEL_FROM_DATABASE=Input Club Kiibohd Device
 
@@ -46851,7 +48861,7 @@ usb:v1209p2020*
  ID_MODEL_FROM_DATABASE=Captain Credible Gate Crystal
 
 usb:v1209p2048*
- ID_MODEL_FROM_DATABASE=Housedillon.com MRF49XA Transciever
+ ID_MODEL_FROM_DATABASE=Housedillon.com MRF49XA Transceiver
 
 usb:v1209p2100*
  ID_MODEL_FROM_DATABASE=TinyFPGA B1 and B2 Boards
@@ -46949,6 +48959,12 @@ usb:v1209p3210*
 usb:v1209p3333*
  ID_MODEL_FROM_DATABASE=LabConnect Digitalnetzteil
 
+usb:v1209p345B*
+ ID_MODEL_FROM_DATABASE=kinX Hub
+
+usb:v1209p345C*
+ ID_MODEL_FROM_DATABASE=kinX Keyboard Controller
+
 usb:v1209p3690*
  ID_MODEL_FROM_DATABASE=Kigakudoh TouchMIDI32
 
@@ -47018,6 +49034,12 @@ usb:v1209p5039*
 usb:v1209p5050*
  ID_MODEL_FROM_DATABASE=trebb ISO50
 
+usb:v1209p5070*
+ ID_MODEL_FROM_DATABASE=SoloHacker security key [SoloKey]
+
+usb:v1209p50B0*
+ ID_MODEL_FROM_DATABASE=boot for security key [SoloKey]
+
 usb:v1209p5222*
  ID_MODEL_FROM_DATABASE=telavivmakers attami
 
@@ -47108,6 +49130,21 @@ usb:v1209p7777*
 usb:v1209p7778*
  ID_MODEL_FROM_DATABASE=circuitvalley IO Board V3 Bootloader
 
+usb:v1209p7950*
+ ID_MODEL_FROM_DATABASE=PIC18F87J94 Bootloader [GenII]
+
+usb:v1209p7951*
+ ID_MODEL_FROM_DATABASE=PIC18F87J94 Application [GenII]
+
+usb:v1209p7952*
+ ID_MODEL_FROM_DATABASE=PIC18F87J94 Bootloader [GenIII/IV]
+
+usb:v1209p7953*
+ ID_MODEL_FROM_DATABASE=PIC18F87J94 Application [GenIII/IV]
+
+usb:v1209p7954*
+ ID_MODEL_FROM_DATABASE=PIC18F87J94 Application [GenIII/IV]
+
 usb:v1209p7BD0*
  ID_MODEL_FROM_DATABASE=pokey9000 Tiny Bit Dingus
 
@@ -47405,6 +49442,9 @@ usb:v1209pDEAF*
 usb:v1209pDED1*
  ID_MODEL_FROM_DATABASE=ManCave Made Quark One
 
+usb:v1209pDEED*
+ ID_MODEL_FROM_DATABASE=Kroneum Time Tracker
+
 usb:v1209pDF00*
  ID_MODEL_FROM_DATABASE=D.F.Mac. @TripArts Music mi:muz:tuch
 
@@ -47516,6 +49556,9 @@ usb:v120Fp5260*
 usb:v1210*
  ID_VENDOR_FROM_DATABASE=DigiTech
 
+usb:v1210p000D*
+ ID_MODEL_FROM_DATABASE=RP250 Guitar Multi-Effects Processor
+
 usb:v1210p0016*
  ID_MODEL_FROM_DATABASE=RP500 Guitar Multi-Effects Processor
 
@@ -47531,6 +49574,33 @@ usb:v121E*
 usb:v121Ep3403*
  ID_MODEL_FROM_DATABASE=Muzio JM250 Audio Player
 
+usb:v121F*
+ ID_VENDOR_FROM_DATABASE=Panini S.p.A.
+
+usb:v121Fp0001*
+ ID_MODEL_FROM_DATABASE=VisionX without Firmware
+
+usb:v121Fp0002*
+ ID_MODEL_FROM_DATABASE=VisionX with Firmware
+
+usb:v121Fp0010*
+ ID_MODEL_FROM_DATABASE=I-Deal
+
+usb:v121Fp0020*
+ ID_MODEL_FROM_DATABASE=wI-Deal
+
+usb:v121Fp0021*
+ ID_MODEL_FROM_DATABASE=VisionX Page Scanner Extension
+
+usb:v121Fp0030*
+ ID_MODEL_FROM_DATABASE=VisionNext
+
+usb:v121Fp0040*
+ ID_MODEL_FROM_DATABASE=mI:Deal Check Scanner
+
+usb:v121Fp0041*
+ ID_MODEL_FROM_DATABASE=EverNext Check Scanner
+
 usb:v1220*
  ID_VENDOR_FROM_DATABASE=TC Electronic
 
@@ -47552,6 +49622,12 @@ usb:v1221*
 usb:v1221p3234*
  ID_MODEL_FROM_DATABASE=Disk (Thumb drive)
 
+usb:v1222*
+ ID_VENDOR_FROM_DATABASE=TiPro
+
+usb:v1222pFACA*
+ ID_MODEL_FROM_DATABASE=programmable keyboard
+
 usb:v1223*
  ID_VENDOR_FROM_DATABASE=SKYCABLE ENTERPRISE. CO., LTD.
 
@@ -47663,6 +49739,15 @@ usb:v1235p001A*
 usb:v1235p001B*
  ID_MODEL_FROM_DATABASE=Impulse 61
 
+usb:v1235p0032*
+ ID_MODEL_FROM_DATABASE=Launchkey 61
+
+usb:v1235p0069*
+ ID_MODEL_FROM_DATABASE=Launchpad MK2
+
+usb:v1235p0102*
+ ID_MODEL_FROM_DATABASE=LaunchKey Mini MK3
+
 usb:v1235p4661*
  ID_MODEL_FROM_DATABASE=ReMOTE25
 
@@ -47699,12 +49784,27 @@ usb:v1235p8014*
 usb:v1235p8016*
  ID_MODEL_FROM_DATABASE=Focusrite Scarlett 2i2
 
+usb:v1235p8202*
+ ID_MODEL_FROM_DATABASE=Focusrite Scarlett 2i2 2nd Gen
+
 usb:v1235p8203*
  ID_MODEL_FROM_DATABASE=Focusrite Scarlett 6i6
 
 usb:v1235p8204*
  ID_MODEL_FROM_DATABASE=Scarlett 18i8 2nd Gen
 
+usb:v1235p8210*
+ ID_MODEL_FROM_DATABASE=Scarlett 2i2 Camera
+
+usb:v1235p8211*
+ ID_MODEL_FROM_DATABASE=Scarlett Solo (3rd Gen.)
+
+usb:v1235p8214*
+ ID_MODEL_FROM_DATABASE=Scarlett 18i8 3rd Gen
+
+usb:v1235p8215*
+ ID_MODEL_FROM_DATABASE=Scarlett 18i20 3rd Gen
+
 usb:v1241*
  ID_VENDOR_FROM_DATABASE=Belkin
 
@@ -47735,6 +49835,12 @@ usb:v1241p1603*
 usb:v1241pF767*
  ID_MODEL_FROM_DATABASE=Keyboard
 
+usb:v1243*
+ ID_VENDOR_FROM_DATABASE=Holtek Semiconductor, Inc.
+
+usb:v1243pE000*
+ ID_MODEL_FROM_DATABASE=Unique NFC/RFID reader (keyboard emulation)
+
 usb:v124A*
  ID_VENDOR_FROM_DATABASE=AirVast
 
@@ -47768,6 +49874,12 @@ usb:v125C*
 usb:v125Cp0010*
  ID_MODEL_FROM_DATABASE=Alta series CCD
 
+usb:v125D*
+ ID_VENDOR_FROM_DATABASE=JMicron
+
+usb:v125Dp0580*
+ ID_MODEL_FROM_DATABASE=JM580
+
 usb:v125F*
  ID_VENDOR_FROM_DATABASE=A-DATA Technology Co., Ltd.
 
@@ -47783,6 +49895,9 @@ usb:v125FpA15A*
 usb:v125FpA22A*
  ID_MODEL_FROM_DATABASE=DashDrive Elite HE720 500GB
 
+usb:v125FpA31A*
+ ID_MODEL_FROM_DATABASE=HV620 Portable HDD
+
 usb:v125FpA91A*
  ID_MODEL_FROM_DATABASE=Portable HDD CH91
 
@@ -47873,6 +49988,9 @@ usb:v1275p0002*
 usb:v1275p0080*
  ID_MODEL_FROM_DATABASE=SkyEye Weather Satellite Receiver
 
+usb:v1275p0090*
+ ID_MODEL_FROM_DATABASE=WeatherFax 2000 Demodulator
+
 usb:v1278*
  ID_VENDOR_FROM_DATABASE=Starlight Xpress
 
@@ -47978,6 +50096,9 @@ usb:v1286p2006*
 usb:v1286p203C*
  ID_MODEL_FROM_DATABASE=K30326 802.11bgn Wireless Module [Marvell 88W8786U]
 
+usb:v1286p204C*
+ ID_MODEL_FROM_DATABASE=Bluetooth and Wireless LAN Composite
+
 usb:v1286p8001*
  ID_MODEL_FROM_DATABASE=BLOB boot loader firmware
 
@@ -48044,6 +50165,18 @@ usb:v12A7*
 usb:v12AB*
  ID_VENDOR_FROM_DATABASE=Honey Bee Electronic International Ltd.
 
+usb:v12ABp0004*
+ ID_MODEL_FROM_DATABASE=Dance Pad for Xbox 360
+
+usb:v12ABp0301*
+ ID_MODEL_FROM_DATABASE=Afterglow Wired Controller for Xbox 360
+
+usb:v12ABp0303*
+ ID_MODEL_FROM_DATABASE=Mortal Kombat Klassic FightStick for Xbox 360
+
+usb:v12ABp8809*
+ ID_MODEL_FROM_DATABASE=Dance Dance Revolution Dance Pad
+
 usb:v12B8*
  ID_VENDOR_FROM_DATABASE=Zhejiang Xinya Electronic Technology Co., Ltd.
 
@@ -48135,7 +50268,19 @@ usb:v12D1p1039*
  ID_MODEL_FROM_DATABASE=Ideos (tethering mode)
 
 usb:v12D1p1052*
- ID_MODEL_FROM_DATABASE=MT7-L09
+ ID_MODEL_FROM_DATABASE=MT7-L09 / P7-L10 / Y330-U01
+
+usb:v12D1p1053*
+ ID_MODEL_FROM_DATABASE=P7-L10 (PTP)
+
+usb:v12D1p1054*
+ ID_MODEL_FROM_DATABASE=P7-L10 (PTP + debug)
+
+usb:v12D1p1079*
+ ID_MODEL_FROM_DATABASE=GEM-703LT [Honor/MediaPad X2]
+
+usb:v12D1p107E*
+ ID_MODEL_FROM_DATABASE=P10 smartphone
 
 usb:v12D1p1404*
  ID_MODEL_FROM_DATABASE=EM770W miniPCI WCDMA Modem
@@ -48183,7 +50328,7 @@ usb:v12D1p14DB*
  ID_MODEL_FROM_DATABASE=E353/E3131
 
 usb:v12D1p14DC*
- ID_MODEL_FROM_DATABASE=E33372 LTE/UMTS/GSM HiLink Modem/Networkcard
+ ID_MODEL_FROM_DATABASE=E3372 LTE/UMTS/GSM HiLink Modem/Networkcard
 
 usb:v12D1p14F1*
  ID_MODEL_FROM_DATABASE=Gobi 3000 HSPA+ Modem
@@ -48212,6 +50357,9 @@ usb:v12D1p1521*
 usb:v12D1p155A*
  ID_MODEL_FROM_DATABASE=R205 Mobile WiFi (CD-ROM mode)
 
+usb:v12D1p1573*
+ ID_MODEL_FROM_DATABASE=ME909u-521 mPCIe LTE/GPS card
+
 usb:v12D1p1575*
  ID_MODEL_FROM_DATABASE=K5150 LTE modem
 
@@ -48245,12 +50393,21 @@ usb:v12D1p1F01*
 usb:v12D1p1F16*
  ID_MODEL_FROM_DATABASE=K5150 LTE modem (Mass Storage Mode)
 
+usb:v12D1p360E*
+ ID_MODEL_FROM_DATABASE=Y330-U01 (MTP Mode)
+
 usb:v12D1p380B*
  ID_MODEL_FROM_DATABASE=WiMAX USB modem(s)
 
 usb:v12D2*
  ID_VENDOR_FROM_DATABASE=LINE TECH INDUSTRIAL CO., LTD.
 
+usb:v12D3*
+ ID_VENDOR_FROM_DATABASE=LINAK
+
+usb:v12D3p0002*
+ ID_MODEL_FROM_DATABASE=DeskLine CBD Control Box
+
 usb:v12D6*
  ID_VENDOR_FROM_DATABASE=EMS Dr. Thomas Wuensche
 
@@ -48311,6 +50468,9 @@ usb:v12FF*
 usb:v12FFp0101*
  ID_MODEL_FROM_DATABASE=Advanced RC Servo Controller
 
+usb:v1306*
+ ID_VENDOR_FROM_DATABASE=FM20 Barcode Scanner
+
 usb:v1307*
  ID_VENDOR_FROM_DATABASE=Transcend Information, Inc.
 
@@ -48380,12 +50540,18 @@ usb:v1313p0112*
 usb:v1313p8001*
  ID_MODEL_FROM_DATABASE=TXP-Series Slot (TXP5001, TXP5004)
 
+usb:v1313p8011*
+ ID_MODEL_FROM_DATABASE=BP1 Slit Beam Profiler
+
 usb:v1313p8012*
  ID_MODEL_FROM_DATABASE=BC106 Camera Beam Profiler
 
 usb:v1313p8013*
  ID_MODEL_FROM_DATABASE=WFS10 Wavefront Sensor
 
+usb:v1313p8016*
+ ID_MODEL_FROM_DATABASE=DMP40 Deformable Mirror
+
 usb:v1313p8017*
  ID_MODEL_FROM_DATABASE=BC206 Camera Beam Profiler
 
@@ -48401,21 +50567,111 @@ usb:v1313p8021*
 usb:v1313p8022*
  ID_MODEL_FROM_DATABASE=PM320E Optical Power and Energy Meter
 
+usb:v1313p8025*
+ ID_MODEL_FROM_DATABASE=WFS20 Wavefront Sensor
+
 usb:v1313p8030*
  ID_MODEL_FROM_DATABASE=ER100 Extinction Ratio Meter
 
+usb:v1313p8039*
+ ID_MODEL_FROM_DATABASE=PAX1000 Rotating Waveplate Polarimeter
+
+usb:v1313p8047*
+ ID_MODEL_FROM_DATABASE=CLD1000
+
+usb:v1313p8048*
+ ID_MODEL_FROM_DATABASE=TED4000
+
+usb:v1313p8049*
+ ID_MODEL_FROM_DATABASE=LDC4000
+
+usb:v1313p804A*
+ ID_MODEL_FROM_DATABASE=ITC4000
+
+usb:v1313p8058*
+ ID_MODEL_FROM_DATABASE=LC-100
+
+usb:v1313p8060*
+ ID_MODEL_FROM_DATABASE=DC3100
+
+usb:v1313p8061*
+ ID_MODEL_FROM_DATABASE=DC4100
+
+usb:v1313p8062*
+ ID_MODEL_FROM_DATABASE=DC2100
+
+usb:v1313p8065*
+ ID_MODEL_FROM_DATABASE=CS2010
+
+usb:v1313p8066*
+ ID_MODEL_FROM_DATABASE=DC4104
+
 usb:v1313p8070*
  ID_MODEL_FROM_DATABASE=PM100D
 
 usb:v1313p8072*
  ID_MODEL_FROM_DATABASE=PM100USB Power and Energy Meter Interface
 
+usb:v1313p8073*
+ ID_MODEL_FROM_DATABASE=PM106 Wireless Powermeter Photodiode Sensor
+
+usb:v1313p8074*
+ ID_MODEL_FROM_DATABASE=PM160T Wireless Powermeter Thermal Sensor
+
+usb:v1313p8075*
+ ID_MODEL_FROM_DATABASE=PM400 Handheld Optical Power/Energy Meter
+
+usb:v1313p8076*
+ ID_MODEL_FROM_DATABASE=PM101 Serial PD Power Meter
+
 usb:v1313p8078*
  ID_MODEL_FROM_DATABASE=PM100D Compact Power and Energy Meter Console
 
 usb:v1313p8080*
  ID_MODEL_FROM_DATABASE=CCS100 - Compact Spectrometer
 
+usb:v1313p8081*
+ ID_MODEL_FROM_DATABASE=CCS100 Compact Spectrometer
+
+usb:v1313p8083*
+ ID_MODEL_FROM_DATABASE=CCS125 Spectrometer
+
+usb:v1313p8085*
+ ID_MODEL_FROM_DATABASE=CCS150 UV Spectrometer
+
+usb:v1313p8087*
+ ID_MODEL_FROM_DATABASE=CCS175 NIR Spectrometer
+
+usb:v1313p8089*
+ ID_MODEL_FROM_DATABASE=CCS200 Wide Range Spectrometer
+
+usb:v1313p8090*
+ ID_MODEL_FROM_DATABASE=SPCM Single Photon Counter
+
+usb:v1313p80A0*
+ ID_MODEL_FROM_DATABASE=LC100 series smart line camera
+
+usb:v1313p80B0*
+ ID_MODEL_FROM_DATABASE=PM200 Handheld Power and Energy Meter
+
+usb:v1313p80C0*
+ ID_MODEL_FROM_DATABASE=DC2200
+
+usb:v1313p80C9*
+ ID_MODEL_FROM_DATABASE=MTD Series
+
+usb:v1313p80F0*
+ ID_MODEL_FROM_DATABASE=TSP01
+
+usb:v1313p80F1*
+ ID_MODEL_FROM_DATABASE=M2SET Dongle
+
+usb:v1313p8180*
+ ID_MODEL_FROM_DATABASE=OCT Probe Controller (OCTH-1300)
+
+usb:v1313p8181*
+ ID_MODEL_FROM_DATABASE=OCT Device
+
 usb:v131D*
  ID_VENDOR_FROM_DATABASE=Natural Point
 
@@ -48431,6 +50687,12 @@ usb:v131Dp0158*
 usb:v1325*
  ID_VENDOR_FROM_DATABASE=ams AG
 
+usb:v1325p00D6*
+ ID_MODEL_FROM_DATABASE=I2C/SPI InterfaceBoard
+
+usb:v1325p0C08*
+ ID_MODEL_FROM_DATABASE=Embedded Linux Sensor Bridge
+
 usb:v1325p4002*
  ID_MODEL_FROM_DATABASE=I2C Dongle
 
@@ -48573,13 +50835,19 @@ usb:v1343p0005*
  ID_MODEL_FROM_DATABASE=CY / DNP DSRX1
 
 usb:v1343p0006*
- ID_MODEL_FROM_DATABASE=CW-02
+ ID_MODEL_FROM_DATABASE=CW-02 / OP900ii
 
 usb:v1343p0007*
  ID_MODEL_FROM_DATABASE=DNP DS80DX
 
 usb:v1343p0008*
- ID_MODEL_FROM_DATABASE=CX2 / DNP DS620
+ ID_MODEL_FROM_DATABASE=DNP DS620 (old)
+
+usb:v1343p000A*
+ ID_MODEL_FROM_DATABASE=CX-02
+
+usb:v1343p000B*
+ ID_MODEL_FROM_DATABASE=CX-02W
 
 usb:v1345*
  ID_VENDOR_FROM_DATABASE=Sino Lite Technology Corp.
@@ -48671,6 +50939,30 @@ usb:v1357p0503*
 usb:v1357p0504*
  ID_MODEL_FROM_DATABASE=DEMOJM
 
+usb:v1357p1000*
+ ID_MODEL_FROM_DATABASE=Smart Control Touchpad
+
+usb:v135E*
+ ID_VENDOR_FROM_DATABASE=Insta GmbH
+
+usb:v135Ep0021*
+ ID_MODEL_FROM_DATABASE=Berker KNX Data Interface
+
+usb:v135Ep0022*
+ ID_MODEL_FROM_DATABASE=Gira KNX Data Interface
+
+usb:v135Ep0023*
+ ID_MODEL_FROM_DATABASE=JUNG KNX Data Interface
+
+usb:v135Ep0024*
+ ID_MODEL_FROM_DATABASE=Merten/Schneider Electric KNX Data Interface
+
+usb:v135Ep0025*
+ ID_MODEL_FROM_DATABASE=Hager KNX Data Interface
+
+usb:v135Ep0026*
+ ID_MODEL_FROM_DATABASE=Feller KNX Data Interface
+
 usb:v135F*
  ID_VENDOR_FROM_DATABASE=Control Development Inc.
 
@@ -48695,6 +50987,9 @@ usb:v1366*
 usb:v1366p0101*
  ID_MODEL_FROM_DATABASE=J-Link PLUS
 
+usb:v1366p1015*
+ ID_MODEL_FROM_DATABASE=J-Link
+
 usb:v136B*
  ID_VENDOR_FROM_DATABASE=STEC
 
@@ -48758,6 +51053,18 @@ usb:v137B*
 usb:v137Bp0002*
  ID_MODEL_FROM_DATABASE=SCAPS USC-2 Scanner Controller
 
+usb:v137C*
+ ID_VENDOR_FROM_DATABASE=YASKAWA ELECTRIC CORP.
+
+usb:v137Cp0220*
+ ID_MODEL_FROM_DATABASE=MP Series
+
+usb:v137Cp0250*
+ ID_MODEL_FROM_DATABASE=SIGMA Series
+
+usb:v137Cp0401*
+ ID_MODEL_FROM_DATABASE=AC Drive
+
 usb:v1385*
  ID_VENDOR_FROM_DATABASE=Netgear, Inc
 
@@ -48837,7 +51144,7 @@ usb:v1390*
  ID_VENDOR_FROM_DATABASE=TOMTOM B.V.
 
 usb:v1390p0001*
- ID_MODEL_FROM_DATABASE=GO 520 T/GO 630/ONE XL (v9)
+ ID_MODEL_FROM_DATABASE=GO 520 T / GO 630 / ONE / ONE XL
 
 usb:v1390p5454*
  ID_MODEL_FROM_DATABASE=Blue & Me 2
@@ -48860,15 +51167,141 @@ usb:v1395*
 usb:v1395p0025*
  ID_MODEL_FROM_DATABASE=Headset [PC 8]
 
+usb:v1395p0026*
+ ID_MODEL_FROM_DATABASE=SC230
+
+usb:v1395p0027*
+ ID_MODEL_FROM_DATABASE=SC260
+
+usb:v1395p0028*
+ ID_MODEL_FROM_DATABASE=SC230 CTRL
+
+usb:v1395p0029*
+ ID_MODEL_FROM_DATABASE=SC260 CTRL
+
+usb:v1395p002A*
+ ID_MODEL_FROM_DATABASE=SC230 for Lync
+
+usb:v1395p002B*
+ ID_MODEL_FROM_DATABASE=SC260 for Lync
+
+usb:v1395p002D*
+ ID_MODEL_FROM_DATABASE=BTD-800
+
+usb:v1395p002E*
+ ID_MODEL_FROM_DATABASE=Presence
+
+usb:v1395p0030*
+ ID_MODEL_FROM_DATABASE=CEHS-CI 02
+
+usb:v1395p0031*
+ ID_MODEL_FROM_DATABASE=U320 Gaming
+
+usb:v1395p0032*
+ ID_MODEL_FROM_DATABASE=SC30 for Lync
+
+usb:v1395p0033*
+ ID_MODEL_FROM_DATABASE=SC60 for Lync
+
+usb:v1395p0034*
+ ID_MODEL_FROM_DATABASE=SC30 Control
+
+usb:v1395p0035*
+ ID_MODEL_FROM_DATABASE=SC60 Control
+
+usb:v1395p0036*
+ ID_MODEL_FROM_DATABASE=SC630 for Lync
+
+usb:v1395p0037*
+ ID_MODEL_FROM_DATABASE=SC660 for Lync
+
+usb:v1395p0038*
+ ID_MODEL_FROM_DATABASE=SC630 CTRL
+
+usb:v1395p0039*
+ ID_MODEL_FROM_DATABASE=SC660 CTRL
+
+usb:v1395p003F*
+ ID_MODEL_FROM_DATABASE=SP 20
+
+usb:v1395p0040*
+ ID_MODEL_FROM_DATABASE=MB Pro 1/2
+
+usb:v1395p0041*
+ ID_MODEL_FROM_DATABASE=SP 20 for Lync
+
+usb:v1395p0042*
+ ID_MODEL_FROM_DATABASE=SP 10
+
+usb:v1395p0043*
+ ID_MODEL_FROM_DATABASE=SP 10 for Lync
+
 usb:v1395p0046*
  ID_MODEL_FROM_DATABASE=PXC 550
 
+usb:v1395p004A*
+ ID_MODEL_FROM_DATABASE=MOMENTUM M2 OEBT
+
+usb:v1395p004B*
+ ID_MODEL_FROM_DATABASE=MOMENTUM M2 AEBT
+
+usb:v1395p004F*
+ ID_MODEL_FROM_DATABASE=SC230 for MS II
+
+usb:v1395p0050*
+ ID_MODEL_FROM_DATABASE=SC260 for MS II
+
+usb:v1395p0051*
+ ID_MODEL_FROM_DATABASE=USB-ED CC 01
+
+usb:v1395p0058*
+ ID_MODEL_FROM_DATABASE=USB-ED CC 01 for MS
+
+usb:v1395p0059*
+ ID_MODEL_FROM_DATABASE=SC40 for MS
+
+usb:v1395p005A*
+ ID_MODEL_FROM_DATABASE=SC70 for MS
+
+usb:v1395p005B*
+ ID_MODEL_FROM_DATABASE=SC40 CTRL
+
+usb:v1395p005C*
+ ID_MODEL_FROM_DATABASE=SC70 CTRL
+
+usb:v1395p0060*
+ ID_MODEL_FROM_DATABASE=SCx5 MS
+
+usb:v1395p0061*
+ ID_MODEL_FROM_DATABASE=SCx5 CTRL
+
+usb:v1395p0064*
+ ID_MODEL_FROM_DATABASE=MB 660 MS
+
+usb:v1395p0065*
+ ID_MODEL_FROM_DATABASE=MB 660
+
+usb:v1395p0066*
+ ID_MODEL_FROM_DATABASE=SP 20 D UC
+
+usb:v1395p0067*
+ ID_MODEL_FROM_DATABASE=SP 20 D MS
+
+usb:v1395p006B*
+ ID_MODEL_FROM_DATABASE=SC5x5 MS
+
+usb:v1395p0072*
+ ID_MODEL_FROM_DATABASE=Headset
+
 usb:v1395p3556*
  ID_MODEL_FROM_DATABASE=USB Headset
 
 usb:v1397*
  ID_VENDOR_FROM_DATABASE=BEHRINGER International GmbH
 
+usb:v1397p0004*
+ ID_MODEL_FROM_DATABASE=FCA1616
+
 usb:v1397p00BC*
  ID_MODEL_FROM_DATABASE=BCF2000
 
@@ -49172,6 +51605,9 @@ usb:v13D3p3394*
 usb:v13D3p3474*
  ID_MODEL_FROM_DATABASE=Atheros AR3012 Bluetooth
 
+usb:v13D3p3526*
+ ID_MODEL_FROM_DATABASE=Bluetooth Radio
+
 usb:v13D3p5070*
  ID_MODEL_FROM_DATABASE=Webcam
 
@@ -49196,6 +51632,15 @@ usb:v13D3p5130*
 usb:v13D3p5134*
  ID_MODEL_FROM_DATABASE=Integrated Webcam
 
+usb:v13D3p5615*
+ ID_MODEL_FROM_DATABASE=Lenovo EasyCamera
+
+usb:v13D3p5670*
+ ID_MODEL_FROM_DATABASE=HP TrueVision HD
+
+usb:v13D3p5682*
+ ID_MODEL_FROM_DATABASE=SunplusIT Integrated Camera
+
 usb:v13D3p5702*
  ID_MODEL_FROM_DATABASE=UVC VGA Webcam
 
@@ -49205,12 +51650,18 @@ usb:v13D3p5710*
 usb:v13D3p5716*
  ID_MODEL_FROM_DATABASE=UVC VGA Webcam
 
+usb:v13D3p5A07*
+ ID_MODEL_FROM_DATABASE=VGA UVC WebCam
+
 usb:v13D3p7020*
  ID_MODEL_FROM_DATABASE=DTV-DVB UDST7020BDA DVB-S Box(DVBS for MCE2005)
 
 usb:v13D3p7022*
  ID_MODEL_FROM_DATABASE=DTV-DVB UDST7022BDA DVB-S Box(Without HID)
 
+usb:v13D3p784B*
+ ID_MODEL_FROM_DATABASE=XHC Camera
+
 usb:v13D7*
  ID_VENDOR_FROM_DATABASE=Guidance Software, Inc.
 
@@ -49265,6 +51716,9 @@ usb:v13EEp0003*
 usb:v13FD*
  ID_VENDOR_FROM_DATABASE=Initio Corporation
 
+usb:v13FDp0550*
+ ID_MODEL_FROM_DATABASE=INIC-1530 PATA Bridge
+
 usb:v13FDp0840*
  ID_MODEL_FROM_DATABASE=INIC-1618L SATA
 
@@ -49298,9 +51752,15 @@ usb:v13FDp1E40*
 usb:v13FDp2040*
  ID_MODEL_FROM_DATABASE=Samsung Writemaster external DVD writer
 
+usb:v13FDp3920*
+ ID_MODEL_FROM_DATABASE=INIC-3619PN SATA Bridge
+
 usb:v13FDp3940*
  ID_MODEL_FROM_DATABASE=external DVD burner ECD819-SU3
 
+usb:v13FDp3960*
+ ID_MODEL_FROM_DATABASE=INIC-3639
+
 usb:v13FDp3E40*
  ID_MODEL_FROM_DATABASE=ZALMAN ZM-VE350
 
@@ -49337,18 +51797,27 @@ usb:v13FEp3100*
 usb:v13FEp3123*
  ID_MODEL_FROM_DATABASE=Verbatim STORE N GO 4GB
 
+usb:v13FEp3200*
+ ID_MODEL_FROM_DATABASE=flash drive (2GB, EMTEC)
+
 usb:v13FEp3600*
  ID_MODEL_FROM_DATABASE=flash drive (4GB, EMTEC)
 
 usb:v13FEp3800*
  ID_MODEL_FROM_DATABASE=Rage XT Flash Drive
 
+usb:v13FEp3D00*
+ ID_MODEL_FROM_DATABASE=Flash Drive
+
 usb:v13FEp3E00*
  ID_MODEL_FROM_DATABASE=Flash Drive
 
 usb:v13FEp4100*
  ID_MODEL_FROM_DATABASE=Flash drive
 
+usb:v13FEp4200*
+ ID_MODEL_FROM_DATABASE=Platinum USB drive mini
+
 usb:v13FEp5000*
  ID_MODEL_FROM_DATABASE=USB flash drive (32 GB SHARKOON Accelerate)
 
@@ -49358,6 +51827,12 @@ usb:v13FEp5100*
 usb:v13FEp5200*
  ID_MODEL_FROM_DATABASE=DataTraveler R3.0
 
+usb:v13FEp5500*
+ ID_MODEL_FROM_DATABASE=Flash drive
+
+usb:v13FEp6300*
+ ID_MODEL_FROM_DATABASE=SP Mobile C31 (64GB)
+
 usb:v1400*
  ID_VENDOR_FROM_DATABASE=Axxion Group Corp.
 
@@ -49373,6 +51848,12 @@ usb:v1403p0001*
 usb:v1403p0003*
  ID_MODEL_FROM_DATABASE=Digital Photo Frame (DPF-1104)
 
+usb:v1404*
+ ID_VENDOR_FROM_DATABASE=Fundamental Software, Inc.
+
+usb:v1404pCDDC*
+ ID_MODEL_FROM_DATABASE=Dongle
+
 usb:v1409*
  ID_VENDOR_FROM_DATABASE=IDS Imaging Development Systems GmbH
 
@@ -49382,6 +51863,9 @@ usb:v1409p1000*
 usb:v1409p1485*
  ID_MODEL_FROM_DATABASE=uEye UI1485
 
+usb:v1409p3240*
+ ID_MODEL_FROM_DATABASE=uEye UI3240
+
 usb:v140E*
  ID_VENDOR_FROM_DATABASE=Telechips, Inc.
 
@@ -49565,9 +52049,18 @@ usb:v1430p0150*
 usb:v1430p4734*
  ID_MODEL_FROM_DATABASE=Guitar Hero4 hub
 
+usb:v1430p4748*
+ ID_MODEL_FROM_DATABASE=Guitar Hero X-plorer
+
 usb:v1430p474B*
  ID_MODEL_FROM_DATABASE=Guitar Hero MIDI interface
 
+usb:v1430p8888*
+ ID_MODEL_FROM_DATABASE=TX6500+ Dance Pad
+
+usb:v1430pF801*
+ ID_MODEL_FROM_DATABASE=Controller
+
 usb:v1431*
  ID_VENDOR_FROM_DATABASE=Pertech Resources, Inc.
 
@@ -49658,6 +52151,9 @@ usb:v1452*
 usb:v1452p8B01*
  ID_MODEL_FROM_DATABASE=DS620
 
+usb:v1452p9001*
+ ID_MODEL_FROM_DATABASE=DS820
+
 usb:v1453*
  ID_VENDOR_FROM_DATABASE=Radio Shack
 
@@ -49733,6 +52229,18 @@ usb:v145Fp0167*
 usb:v145Fp0176*
  ID_MODEL_FROM_DATABASE=Isla Keyboard
 
+usb:v145Fp019F*
+ ID_MODEL_FROM_DATABASE=17676 Webcam
+
+usb:v145Fp01E5*
+ ID_MODEL_FROM_DATABASE=Keyboard [GXT 830]
+
+usb:v145Fp0212*
+ ID_MODEL_FROM_DATABASE=Panora Widescreen Graphic Tablet
+
+usb:v145Fp023F*
+ ID_MODEL_FROM_DATABASE=Mouse [GXT 168]
+
 usb:v1460*
  ID_VENDOR_FROM_DATABASE=Tatung Co.
 
@@ -49751,6 +52259,15 @@ usb:v1462p5512*
 usb:v1462p8807*
  ID_MODEL_FROM_DATABASE=DIGIVOX mini III [af9015]
 
+usb:v146B*
+ ID_VENDOR_FROM_DATABASE=BigBen Interactive
+
+usb:v146Bp0601*
+ ID_MODEL_FROM_DATABASE=Controller for Xbox 360
+
+usb:v146Bp0902*
+ ID_MODEL_FROM_DATABASE=Wired Mini PS3 Game Controller
+
 usb:v1472*
  ID_VENDOR_FROM_DATABASE=Huawei-3Com
 
@@ -49961,6 +52478,9 @@ usb:v1498pA090*
 usb:v149A*
  ID_VENDOR_FROM_DATABASE=Imagination Technologies
 
+usb:v149Ap069B*
+ ID_MODEL_FROM_DATABASE=PURE Digital Evoke-1XT Tri-band
+
 usb:v149Ap2107*
  ID_MODEL_FROM_DATABASE=DBX1 DSP core
 
@@ -49997,6 +52517,9 @@ usb:v14AF*
 usb:v14B0*
  ID_VENDOR_FROM_DATABASE=StarTech.com Ltd.
 
+usb:v14B0p3410*
+ ID_MODEL_FROM_DATABASE=Serial Adapter ICUSB2321X [TUSB3410I]
+
 usb:v14B2*
  ID_VENDOR_FROM_DATABASE=Ralink Technology, Corp.
 
@@ -50087,6 +52610,9 @@ usb:v14CDp125C*
 usb:v14CDp127B*
  ID_MODEL_FROM_DATABASE=SDXC Reader
 
+usb:v14CDp168A*
+ ID_MODEL_FROM_DATABASE=Elecom Co., Ltd MR-K013 Multicard Reader
+
 usb:v14CDp6116*
  ID_MODEL_FROM_DATABASE=M6116 SATA Bridge
 
@@ -50150,9 +52676,36 @@ usb:v14EApAB13*
 usb:v14ED*
  ID_VENDOR_FROM_DATABASE=Shure Inc.
 
+usb:v14EDp1000*
+ ID_MODEL_FROM_DATABASE=MV5
+
+usb:v14EDp1002*
+ ID_MODEL_FROM_DATABASE=MV51
+
+usb:v14EDp1003*
+ ID_MODEL_FROM_DATABASE=MVi
+
+usb:v14EDp1004*
+ ID_MODEL_FROM_DATABASE=SHA900
+
+usb:v14EDp1005*
+ ID_MODEL_FROM_DATABASE=KSE1500
+
+usb:v14EDp1011*
+ ID_MODEL_FROM_DATABASE=MV88+
+
+usb:v14EDp1100*
+ ID_MODEL_FROM_DATABASE=ANIUSB-MATRIX
+
+usb:v14EDp1101*
+ ID_MODEL_FROM_DATABASE=P300
+
 usb:v14EDp29B6*
  ID_MODEL_FROM_DATABASE=X2u Adapter
 
+usb:v14EDp3000*
+ ID_MODEL_FROM_DATABASE=RMCE-USB
+
 usb:v14F7*
  ID_VENDOR_FROM_DATABASE=TechniSat Digital GmbH
 
@@ -50177,6 +52730,12 @@ usb:v1500*
 usb:v1501*
  ID_VENDOR_FROM_DATABASE=Pine-Tum Enterprise Co., Ltd.
 
+usb:v1504*
+ ID_VENDOR_FROM_DATABASE=Bixolon CO LTD
+
+usb:v1504p001F*
+ ID_MODEL_FROM_DATABASE=SRP-350II Thermal Receipt Printer
+
 usb:v1509*
  ID_VENDOR_FROM_DATABASE=First International Computer, Inc.
 
@@ -50438,11 +52997,20 @@ usb:v152Dp0551*
 usb:v152Dp0561*
  ID_MODEL_FROM_DATABASE=JMS551 - Sharkoon SATA QuickPort Duo
 
+usb:v152Dp0562*
+ ID_MODEL_FROM_DATABASE=JMS567 SATA 6Gb/s bridge
+
 usb:v152Dp0567*
  ID_MODEL_FROM_DATABASE=JMS567 SATA 6Gb/s bridge
 
+usb:v152Dp0576*
+ ID_MODEL_FROM_DATABASE=Gen1 SATA 6Gb/s Bridge
+
 usb:v152Dp0578*
- ID_MODEL_FROM_DATABASE=JMS567 SATA 6Gb/s bridge
+ ID_MODEL_FROM_DATABASE=JMS578 SATA 6Gb/s
+
+usb:v152Dp0583*
+ ID_MODEL_FROM_DATABASE=JMS583Gen 2 to PCIe Gen3x2 Bridge
 
 usb:v152Dp0770*
  ID_MODEL_FROM_DATABASE=Alienware Integrated Webcam
@@ -50450,6 +53018,9 @@ usb:v152Dp0770*
 usb:v152Dp1561*
  ID_MODEL_FROM_DATABASE=JMS561U two ports SATA 6Gb/s bridge
 
+usb:v152Dp1576*
+ ID_MODEL_FROM_DATABASE=External Disk 3.0
+
 usb:v152Dp2329*
  ID_MODEL_FROM_DATABASE=JM20329 SATA Bridge
 
@@ -50492,12 +53063,24 @@ usb:v152Dp3562*
 usb:v152Dp3569*
  ID_MODEL_FROM_DATABASE=JMS566 SATA 3Gb/s bridge
 
+usb:v152Dp578E*
+ ID_MODEL_FROM_DATABASE=JMS578 SATA 6Gb/s bridge
+
+usb:v152Dp8561*
+ ID_MODEL_FROM_DATABASE=salcar docking station two disks
+
 usb:v152E*
  ID_VENDOR_FROM_DATABASE=LG (HLDS)
 
+usb:v152Ep1640*
+ ID_MODEL_FROM_DATABASE=INIC-1605 SATA Bridge
+
 usb:v152Ep2507*
  ID_MODEL_FROM_DATABASE=PL-2507 IDE Controller
 
+usb:v152Ep2571*
+ ID_MODEL_FROM_DATABASE=GP08NU6W DVD-RW
+
 usb:v152EpE001*
  ID_MODEL_FROM_DATABASE=GSA-5120D DVD-RW
 
@@ -50507,38 +53090,143 @@ usb:v1532*
 usb:v1532p0001*
  ID_MODEL_FROM_DATABASE=RZ01-020300 Optical Mouse [Diamondback]
 
+usb:v1532p0002*
+ ID_MODEL_FROM_DATABASE=Diamondback Optical Mouse
+
 usb:v1532p0003*
  ID_MODEL_FROM_DATABASE=Krait Mouse
 
+usb:v1532p0005*
+ ID_MODEL_FROM_DATABASE=Boomslang CE
+
 usb:v1532p0007*
  ID_MODEL_FROM_DATABASE=DeathAdder Mouse
 
+usb:v1532p0009*
+ ID_MODEL_FROM_DATABASE=Gaming Mouse [Tempest Habu]
+
+usb:v1532p000A*
+ ID_MODEL_FROM_DATABASE=Mamba (Wired)
+
+usb:v1532p000C*
+ ID_MODEL_FROM_DATABASE=Lachesis
+
+usb:v1532p000D*
+ ID_MODEL_FROM_DATABASE=DiamondBack 3G
+
+usb:v1532p000E*
+ ID_MODEL_FROM_DATABASE=Megalodon
+
+usb:v1532p000F*
+ ID_MODEL_FROM_DATABASE=Mamba (Wireless)
+
+usb:v1532p0012*
+ ID_MODEL_FROM_DATABASE=Gaming Mouse [Salmosa]
+
 usb:v1532p0013*
- ID_MODEL_FROM_DATABASE=Orochi mouse
+ ID_MODEL_FROM_DATABASE=Orochi 2011
 
 usb:v1532p0015*
  ID_MODEL_FROM_DATABASE=Naga Mouse
 
 usb:v1532p0016*
- ID_MODEL_FROM_DATABASE=DeathAdder Mouse
+ ID_MODEL_FROM_DATABASE=DeathAdder 3.5G
 
 usb:v1532p0017*
  ID_MODEL_FROM_DATABASE=RZ01-0035 Laser Gaming Mouse [Imperator]
 
+usb:v1532p0019*
+ ID_MODEL_FROM_DATABASE=Marauder
+
+usb:v1532p001A*
+ ID_MODEL_FROM_DATABASE=Spectre
+
+usb:v1532p001B*
+ ID_MODEL_FROM_DATABASE=Gaming Headset
+
 usb:v1532p001C*
  ID_MODEL_FROM_DATABASE=RZ01-0036 Optical Gaming Mouse [Abyssus]
 
+usb:v1532p001E*
+ ID_MODEL_FROM_DATABASE=Lachesis (5600 DPI)
+
+usb:v1532p001F*
+ ID_MODEL_FROM_DATABASE=Naga Epic (Wired)
+
+usb:v1532p0020*
+ ID_MODEL_FROM_DATABASE=Abyssus 1800
+
+usb:v1532p0021*
+ ID_MODEL_FROM_DATABASE=Naga Epic Dock (Wireless, Bluetooth)
+
+usb:v1532p0022*
+ ID_MODEL_FROM_DATABASE=Gaming Mouse [TRON]
+
+usb:v1532p0023*
+ ID_MODEL_FROM_DATABASE=Gaming Keyboard [TRON]
+
 usb:v1532p0024*
- ID_MODEL_FROM_DATABASE=Mamba
+ ID_MODEL_FROM_DATABASE=Mamba 2012 (Wired)
+
+usb:v1532p0025*
+ ID_MODEL_FROM_DATABASE=Mamba 2012 (Wireless)
+
+usb:v1532p0029*
+ ID_MODEL_FROM_DATABASE=DeathAdder Black Edition
+
+usb:v1532p002A*
+ ID_MODEL_FROM_DATABASE=Gaming Mouse [Star Wars: The Old Republic]
+
+usb:v1532p002B*
+ ID_MODEL_FROM_DATABASE=Gaming Keyboard [Star Wars: The Old Republic]
+
+usb:v1532p002C*
+ ID_MODEL_FROM_DATABASE=Gaming Headset [Star Wars: The Old Republic]
 
 usb:v1532p002E*
- ID_MODEL_FROM_DATABASE=RZ01-0058 Gaming Mouse [Naga]
+ ID_MODEL_FROM_DATABASE=RZ01-0058 Gaming Mouse [Naga 2012]
 
 usb:v1532p002F*
  ID_MODEL_FROM_DATABASE=Imperator 2012
 
+usb:v1532p0031*
+ ID_MODEL_FROM_DATABASE=Gaming Mouse Dock [Star Wars: The Old Republic]
+
+usb:v1532p0032*
+ ID_MODEL_FROM_DATABASE=Ouroboros 2012 (Wired)
+
+usb:v1532p0033*
+ ID_MODEL_FROM_DATABASE=Ouroboros 2012 (Wireless)
+
+usb:v1532p0034*
+ ID_MODEL_FROM_DATABASE=Taipan
+
+usb:v1532p0035*
+ ID_MODEL_FROM_DATABASE=Krait 2013 Essential
+
 usb:v1532p0036*
- ID_MODEL_FROM_DATABASE=RZ01-0075, Gaming Mouse [Naga Hex]
+ ID_MODEL_FROM_DATABASE=RZ01-0075, Gaming Mouse [Naga Hex (Red)]
+
+usb:v1532p0037*
+ ID_MODEL_FROM_DATABASE=DeathAdder 2013
+
+usb:v1532p0038*
+ ID_MODEL_FROM_DATABASE=DeathAdder 1800
+
+usb:v1532p0039*
+ ID_MODEL_FROM_DATABASE=Orochi 2013
+
+usb:v1532p003E*
+ ID_MODEL_FROM_DATABASE=Naga Epic Chroma (Wired)
+
+usb:v1532p003F*
+ ID_MODEL_FROM_DATABASE=Naga Epic Chroma (Wireless)
+
+usb:v1532p0040*
+ ID_MODEL_FROM_DATABASE=Naga 2014
+
+usb:v1532p0041*
+ ID_MODEL_FROM_DATABASE=Naga Hex
 
 usb:v1532p0042*
  ID_MODEL_FROM_DATABASE=Abyssus 2014
@@ -50556,7 +53244,115 @@ usb:v1532p0046*
  ID_MODEL_FROM_DATABASE=Mamba 2015 Tournament Edition [RZ01-01370100-R3]
 
 usb:v1532p0048*
- ID_MODEL_FROM_DATABASE=Orochi (Wired)
+ ID_MODEL_FROM_DATABASE=Orochi 2015 (Wired)
+
+usb:v1532p004A*
+ ID_MODEL_FROM_DATABASE=RZ03-0133 Gaming Lapboard, Keyboard Mouse Combo, Dongle [Turret Dongle]
+
+usb:v1532p004C*
+ ID_MODEL_FROM_DATABASE=Diamondback Chroma
+
+usb:v1532p004D*
+ ID_MODEL_FROM_DATABASE=DeathAdder 2000 (Cynosa Pro Bundle)
+
+usb:v1532p0050*
+ ID_MODEL_FROM_DATABASE=Naga Hex V2
+
+usb:v1532p0053*
+ ID_MODEL_FROM_DATABASE=Naga Chroma
+
+usb:v1532p0054*
+ ID_MODEL_FROM_DATABASE=DeathAdder 3500
+
+usb:v1532p0056*
+ ID_MODEL_FROM_DATABASE=Orochi 2015 (Wireless)
+
+usb:v1532p0059*
+ ID_MODEL_FROM_DATABASE=RZ01-0212 Gaming Mouse [Lancehead (Wired)]
+
+usb:v1532p005A*
+ ID_MODEL_FROM_DATABASE=RZ01-0212 Gaming Mouse [Lancehead (Wireless)]
+
+usb:v1532p005B*
+ ID_MODEL_FROM_DATABASE=Abyssus V2
+
+usb:v1532p005C*
+ ID_MODEL_FROM_DATABASE=DeathAdder Elite
+
+usb:v1532p005E*
+ ID_MODEL_FROM_DATABASE=Abyssus 2000
+
+usb:v1532p005F*
+ ID_MODEL_FROM_DATABASE=DeathAdder 2000
+
+usb:v1532p0060*
+ ID_MODEL_FROM_DATABASE=RZ01-0213 Gaming Mouse [Lancehead Tournament Edition]
+
+usb:v1532p0062*
+ ID_MODEL_FROM_DATABASE=Atheris
+
+usb:v1532p0064*
+ ID_MODEL_FROM_DATABASE=Basilisk
+
+usb:v1532p0065*
+ ID_MODEL_FROM_DATABASE=RZ01-0265, Gaming Mouse [Basilisk Essential]
+
+usb:v1532p0067*
+ ID_MODEL_FROM_DATABASE=Naga Trinity
+
+usb:v1532p0068*
+ ID_MODEL_FROM_DATABASE=Gaming Mouse Mat [Firefly Hyperflux]
+
+usb:v1532p0069*
+ ID_MODEL_FROM_DATABASE=Gaming Mouse [Mamba Hyperflux]
+
+usb:v1532p006A*
+ ID_MODEL_FROM_DATABASE=Abyssus Elite (D.Va Edition)
+
+usb:v1532p006B*
+ ID_MODEL_FROM_DATABASE=Abyssus Essential
+
+usb:v1532p006C*
+ ID_MODEL_FROM_DATABASE=Mamba Elite (Wired)
+
+usb:v1532p006E*
+ ID_MODEL_FROM_DATABASE=DeathAdder Essential
+
+usb:v1532p006F*
+ ID_MODEL_FROM_DATABASE=RZ01-0257 Gaming Mouse [Lancehead Wireless (2019, Wireless, Receiver)]
+
+usb:v1532p0070*
+ ID_MODEL_FROM_DATABASE=RZ01-0257 Gaming Mouse [Lancehead Wireless (2019, Wired)]
+
+usb:v1532p0071*
+ ID_MODEL_FROM_DATABASE=RZ01-0254 Gaming Mouse [DeathAdder Essential White Edition]
+
+usb:v1532p0072*
+ ID_MODEL_FROM_DATABASE=Mamba 2018 (Wireless)
+
+usb:v1532p0073*
+ ID_MODEL_FROM_DATABASE=Mamba 2018 (Wired)
+
+usb:v1532p0078*
+ ID_MODEL_FROM_DATABASE=Viper (wired)
+
+usb:v1532p007A*
+ ID_MODEL_FROM_DATABASE=RC30-0305 Gaming Mouse [Viper Ultimate (Wired)]
+
+usb:v1532p007B*
+ ID_MODEL_FROM_DATABASE=RC30-0305 Gaming Mouse Dongle [Viper Ultimate (Wireless)]
+
+usb:v1532p007E*
+ ID_MODEL_FROM_DATABASE=RC30-030502 Mouse Dock
+
+usb:v1532p0084*
+ ID_MODEL_FROM_DATABASE=RZ01-0321 Gaming Mouse [DeathAdder V2]
+
+usb:v1532p0085*
+ ID_MODEL_FROM_DATABASE=RZ01-0316 Gaming Mouse [Basilisk V2]
+
+usb:v1532p0088*
+ ID_MODEL_FROM_DATABASE=Razer Basilisk Ultimate Dongle
 
 usb:v1532p0101*
  ID_MODEL_FROM_DATABASE=Copperhead Mouse
@@ -50564,17 +53360,50 @@ usb:v1532p0101*
 usb:v1532p0102*
  ID_MODEL_FROM_DATABASE=Tarantula Keyboard
 
+usb:v1532p0103*
+ ID_MODEL_FROM_DATABASE=Gaming Keyboard [Reclusa]
+
+usb:v1532p0105*
+ ID_MODEL_FROM_DATABASE=Gaming Keyboard [ProType]
+
+usb:v1532p0106*
+ ID_MODEL_FROM_DATABASE=Gaming Keyboard [ProType]
+
 usb:v1532p0109*
  ID_MODEL_FROM_DATABASE=Lycosa Keyboard
 
+usb:v1532p010B*
+ ID_MODEL_FROM_DATABASE=Gaming Keyboard [Arctosa]
+
 usb:v1532p010D*
  ID_MODEL_FROM_DATABASE=BlackWidow Ultimate 2012
 
+usb:v1532p010E*
+ ID_MODEL_FROM_DATABASE=BlackWidow Classic (Alternate)
+
+usb:v1532p010F*
+ ID_MODEL_FROM_DATABASE=Anansi
+
+usb:v1532p0110*
+ ID_MODEL_FROM_DATABASE=Cyclosa
+
+usb:v1532p0111*
+ ID_MODEL_FROM_DATABASE=Nostromo
+
 usb:v1532p0113*
  ID_MODEL_FROM_DATABASE=RZ07-0074 Gaming Keypad [Orbweaver]
 
+usb:v1532p0114*
+ ID_MODEL_FROM_DATABASE=DeathStalker Ultimate
+
+usb:v1532p0116*
+ ID_MODEL_FROM_DATABASE=Blade Pro (2015)
+
 usb:v1532p0118*
- ID_MODEL_FROM_DATABASE=RZ03-0080, Gaming Keyboard [Deathstalker]
+ ID_MODEL_FROM_DATABASE=RZ03-0080, Gaming Keyboard [Deathstalker Essential]
+
+usb:v1532p0119*
+ ID_MODEL_FROM_DATABASE=Gaming Keyboard [Lycosa]
 
 usb:v1532p011A*
  ID_MODEL_FROM_DATABASE=BlackWidow Ultimate 2013
@@ -50582,35 +53411,302 @@ usb:v1532p011A*
 usb:v1532p011B*
  ID_MODEL_FROM_DATABASE=BlackWidow Classic
 
+usb:v1532p011C*
+ ID_MODEL_FROM_DATABASE=BlackWidow Tournament Edition Stealth
+
+usb:v1532p011D*
+ ID_MODEL_FROM_DATABASE=Blade 2013
+
+usb:v1532p011E*
+ ID_MODEL_FROM_DATABASE=Gaming Keyboard Dock [Edge Keyboard Dock]
+
+usb:v1532p011F*
+ ID_MODEL_FROM_DATABASE=Deathstalker Essential 2014
+
+usb:v1532p0200*
+ ID_MODEL_FROM_DATABASE=Gaming Keyboard [Reclusa]
+
+usb:v1532p0201*
+ ID_MODEL_FROM_DATABASE=Tartarus
+
+usb:v1532p0202*
+ ID_MODEL_FROM_DATABASE=DeathStalker Expert
+
 usb:v1532p0203*
  ID_MODEL_FROM_DATABASE=BlackWidow Chroma
 
+usb:v1532p0204*
+ ID_MODEL_FROM_DATABASE=DeathStalker Chroma
+
 usb:v1532p0205*
  ID_MODEL_FROM_DATABASE=Blade Stealth
 
+usb:v1532p0207*
+ ID_MODEL_FROM_DATABASE=Orbweaver Chroma keypad
+
 usb:v1532p0208*
- ID_MODEL_FROM_DATABASE=Tartarus
+ ID_MODEL_FROM_DATABASE=Tartarus Chroma
 
 usb:v1532p0209*
  ID_MODEL_FROM_DATABASE=BlackWidow Tournament Edition Chroma
 
+usb:v1532p020D*
+ ID_MODEL_FROM_DATABASE=Cynosa Pro keyboard (Cynosa Pro Bundle)
+
+usb:v1532p020F*
+ ID_MODEL_FROM_DATABASE=Blade QHD
+
+usb:v1532p0210*
+ ID_MODEL_FROM_DATABASE=Blade Pro (Late 2016)
+
+usb:v1532p0211*
+ ID_MODEL_FROM_DATABASE=BlackWidow Chroma (Overwatch)
+
 usb:v1532p0214*
  ID_MODEL_FROM_DATABASE=BlackWidow Ultimate 2016
 
+usb:v1532p0215*
+ ID_MODEL_FROM_DATABASE=Core
+
 usb:v1532p0216*
  ID_MODEL_FROM_DATABASE=BlackWidow X Chroma
 
+usb:v1532p0217*
+ ID_MODEL_FROM_DATABASE=BlackWidow X Ultimate
+
 usb:v1532p021A*
  ID_MODEL_FROM_DATABASE=BlackWidow X Tournament Edition Chroma
 
+usb:v1532p021B*
+ ID_MODEL_FROM_DATABASE=Gaming Keyboard [BlackWidow X Tournament Edition]
+
+usb:v1532p021E*
+ ID_MODEL_FROM_DATABASE=Ornata Chroma
+
+usb:v1532p021F*
+ ID_MODEL_FROM_DATABASE=Ornata
+
 usb:v1532p0220*
  ID_MODEL_FROM_DATABASE=Blade Stealth (2016)
 
+usb:v1532p0221*
+ ID_MODEL_FROM_DATABASE=RZ03-0203 Gaming Keyboard [BlackWidow Chroma V2]
+
+usb:v1532p0224*
+ ID_MODEL_FROM_DATABASE=Blade (Late 2016)
+
+usb:v1532p0225*
+ ID_MODEL_FROM_DATABASE=Blade Pro (2017)
+
+usb:v1532p0226*
+ ID_MODEL_FROM_DATABASE=Huntsman Elite
+
+usb:v1532p0227*
+ ID_MODEL_FROM_DATABASE=Huntsman
+
+usb:v1532p0228*
+ ID_MODEL_FROM_DATABASE=BlackWidow Elite
+
+usb:v1532p022A*
+ ID_MODEL_FROM_DATABASE=Cynosa Chroma
+
+usb:v1532p022B*
+ ID_MODEL_FROM_DATABASE=Tartarus V2
+
+usb:v1532p022C*
+ ID_MODEL_FROM_DATABASE=Cynosa Chroma Pro
+
+usb:v1532p022D*
+ ID_MODEL_FROM_DATABASE=Blade Stealth (Mid 2017)
+
+usb:v1532p022F*
+ ID_MODEL_FROM_DATABASE=Blade Pro FullHD (2017)
+
+usb:v1532p0232*
+ ID_MODEL_FROM_DATABASE=Blade Stealth (Late 2017)
+
+usb:v1532p0233*
+ ID_MODEL_FROM_DATABASE=Blade 15 (2018)
+
+usb:v1532p0234*
+ ID_MODEL_FROM_DATABASE=Blade Pro 17 (2019)
+
+usb:v1532p0235*
+ ID_MODEL_FROM_DATABASE=BlackWidow Lite (2018)
+
+usb:v1532p0237*
+ ID_MODEL_FROM_DATABASE=BlackWidow Essential
+
+usb:v1532p0239*
+ ID_MODEL_FROM_DATABASE=Blade Stealth (2019)
+
+usb:v1532p023A*
+ ID_MODEL_FROM_DATABASE=Blade 15 (2019) Advanced
+
+usb:v1532p023B*
+ ID_MODEL_FROM_DATABASE=Blade 15 (2018) Base Model
+
+usb:v1532p023F*
+ ID_MODEL_FROM_DATABASE=RZ03-0274 Gaming Keyboard [Cynosa Lite]
+
+usb:v1532p0240*
+ ID_MODEL_FROM_DATABASE=Blade 15 (2018) Mercury
+
+usb:v1532p0241*
+ ID_MODEL_FROM_DATABASE=BlackWidow (2019)
+
+usb:v1532p0243*
+ ID_MODEL_FROM_DATABASE=Huntsman Tournament Edition
+
+usb:v1532p0244*
+ ID_MODEL_FROM_DATABASE=RZ07-0311 Gaming Keypad [Tartarus Pro]
+
+usb:v1532p0245*
+ ID_MODEL_FROM_DATABASE=Blade 15 (Mid 2019) Mercury
+
+usb:v1532p0246*
+ ID_MODEL_FROM_DATABASE=Blade 15 (Mid 2019) Base Model
+
+usb:v1532p024A*
+ ID_MODEL_FROM_DATABASE=Blade Stealth (Late 2019)
+
+usb:v1532p024B*
+ ID_MODEL_FROM_DATABASE=Gaming Laptop [Blade 15 Advanced (Late 2019)]
+
+usb:v1532p024C*
+ ID_MODEL_FROM_DATABASE=Gaming Laptop [Blade Pro (Late 2019)]
+
+usb:v1532p024D*
+ ID_MODEL_FROM_DATABASE=Blade 15 Studio Edition (2019)
+
+usb:v1532p0253*
+ ID_MODEL_FROM_DATABASE=RZ09-0330, Gaming Laptop [Blade 15 Advanced (Early 2020)]
+
+usb:v1532p0255*
+ ID_MODEL_FROM_DATABASE=RZ09-0328, Gaming Laptop [Blade 15 Base Model (2020)]
+
 usb:v1532p0300*
  ID_MODEL_FROM_DATABASE=RZ06-0063 Motion Sensing Controllers [Hydra]
 
+usb:v1532p0401*
+ ID_MODEL_FROM_DATABASE=Gaming Arcade Stick [Panthera]
+
+usb:v1532p0501*
+ ID_MODEL_FROM_DATABASE=Kraken 7.1
+
+usb:v1532p0502*
+ ID_MODEL_FROM_DATABASE=Gaming Headset [Kraken USB]
+
+usb:v1532p0504*
+ ID_MODEL_FROM_DATABASE=Kraken 7.1 Chroma
+
+usb:v1532p0506*
+ ID_MODEL_FROM_DATABASE=Kraken 7.1 (Alternate Version)
+
+usb:v1532p0510*
+ ID_MODEL_FROM_DATABASE=Kraken 7.1 V2
+
+usb:v1532p0511*
+ ID_MODEL_FROM_DATABASE=RZ19-0229 Gaming Microphone
+
+usb:v1532p0514*
+ ID_MODEL_FROM_DATABASE=Electra V2 USB
+
+usb:v1532p0517*
+ ID_MODEL_FROM_DATABASE=Nommo Chroma
+
+usb:v1532p0518*
+ ID_MODEL_FROM_DATABASE=Nommo Pro
+
+usb:v1532p051A*
+ ID_MODEL_FROM_DATABASE=Nari Ultimate
+
+usb:v1532p051C*
+ ID_MODEL_FROM_DATABASE=Nari (Wireless)
+
+usb:v1532p051D*
+ ID_MODEL_FROM_DATABASE=Nari (Wired)
+
+usb:v1532p0520*
+ ID_MODEL_FROM_DATABASE=Kraken Tournament Edition
+
+usb:v1532p0521*
+ ID_MODEL_FROM_DATABASE=Kraken Kitty Edition
+
+usb:v1532p0527*
+ ID_MODEL_FROM_DATABASE=RZ04-0318 Gaming Headset [Kraken Ultimate]
+
+usb:v1532p0904*
+ ID_MODEL_FROM_DATABASE=R201-0282 Gaming Keyboard, Mouse Combination [Turret For Xbox One]
+
+usb:v1532p0A00*
+ ID_MODEL_FROM_DATABASE=Atrox Arcade Stick for Xbox One
+
+usb:v1532p0A02*
+ ID_MODEL_FROM_DATABASE=ManO'War
+
+usb:v1532p0A03*
+ ID_MODEL_FROM_DATABASE=Wildcat
+
 usb:v1532p0C00*
- ID_MODEL_FROM_DATABASE=Firefly
+ ID_MODEL_FROM_DATABASE=RZ02-0135 Hard Gaming Mouse Mat [Firefly]
+
+usb:v1532p0C01*
+ ID_MODEL_FROM_DATABASE=Goliathus
+
+usb:v1532p0C02*
+ ID_MODEL_FROM_DATABASE=Goliathus Extended
+
+usb:v1532p0C04*
+ ID_MODEL_FROM_DATABASE=Firefly V2
+
+usb:v1532p0E03*
+ ID_MODEL_FROM_DATABASE=Gaming Webcam [Kiyo]
+
+usb:v1532p0F03*
+ ID_MODEL_FROM_DATABASE=Tiamat 7.1 V2
+
+usb:v1532p0F07*
+ ID_MODEL_FROM_DATABASE=Chroma Mug Holder
+
+usb:v1532p0F08*
+ ID_MODEL_FROM_DATABASE=Base Station Chroma
+
+usb:v1532p0F09*
+ ID_MODEL_FROM_DATABASE=Chroma HDK
+
+usb:v1532p0F0D*
+ ID_MODEL_FROM_DATABASE=Laptop Stand Chroma
+
+usb:v1532p0F13*
+ ID_MODEL_FROM_DATABASE=Lian Li O11 Dynamic Razer Edition
+
+usb:v1532p0F1A*
+ ID_MODEL_FROM_DATABASE=Core X Chroma
+
+usb:v1532p1000*
+ ID_MODEL_FROM_DATABASE=Gaming Controller [Raiju]
+
+usb:v1532p1004*
+ ID_MODEL_FROM_DATABASE=Gaming Controller [Raiju Ultimate Wired]
+
+usb:v1532p1007*
+ ID_MODEL_FROM_DATABASE=Gaming Controller [Raiju 2 Tournament Edition (USB)]
+
+usb:v1532p1008*
+ ID_MODEL_FROM_DATABASE=Gaming Flightstick [Panthera Evo]
+
+usb:v1532p1009*
+ ID_MODEL_FROM_DATABASE=Gaming Controller [Raiju 2 Ultimate Edition (BT)]
+
+usb:v1532p100A*
+ ID_MODEL_FROM_DATABASE=Gaming Controller [Raiju 2 Tournament Edition (BT)]
+
+usb:v1532p110D*
+ ID_MODEL_FROM_DATABASE=Bootloader (Alternate)
+
+usb:v1532p800E*
+ ID_MODEL_FROM_DATABASE=Bootloader
 
 usb:v153B*
  ID_VENDOR_FROM_DATABASE=TerraTec Electronic GmbH
@@ -50657,6 +53753,9 @@ usb:v154Ap8180*
 usb:v154B*
  ID_VENDOR_FROM_DATABASE=PNY
 
+usb:v154Bp000F*
+ ID_MODEL_FROM_DATABASE=Flash Drive
+
 usb:v154Bp0010*
  ID_MODEL_FROM_DATABASE=USB 2.0 Flash Drive
 
@@ -50681,6 +53780,12 @@ usb:v154Bp0062*
 usb:v154Bp007A*
  ID_MODEL_FROM_DATABASE=Classic Attache Flash Drive
 
+usb:v154Bp5408*
+ ID_MODEL_FROM_DATABASE=2.5in drive enclosure
+
+usb:v154Bp6000*
+ ID_MODEL_FROM_DATABASE=Flash Drive
+
 usb:v154Bp6545*
  ID_MODEL_FROM_DATABASE=FD Device
 
@@ -50810,9 +53915,15 @@ usb:v15A2p0038*
 usb:v15A2p003B*
  ID_MODEL_FROM_DATABASE=USB2CAN Application for ColdFire DEMOJM board
 
+usb:v15A2p0041*
+ ID_MODEL_FROM_DATABASE=i.MX51 SystemOnChip in RecoveryMode
+
 usb:v15A2p0042*
  ID_MODEL_FROM_DATABASE=OSBDM - Debug Port
 
+usb:v15A2p004E*
+ ID_MODEL_FROM_DATABASE=i.MX53 SystemOnChip in RecoveryMode
+
 usb:v15A2p004F*
  ID_MODEL_FROM_DATABASE=i.MX28 SystemOnChip in RecoveryMode
 
@@ -50825,6 +53936,15 @@ usb:v15A2p0054*
 usb:v15A2p0061*
  ID_MODEL_FROM_DATABASE=i.MX 6Solo/6DualLite SystemOnChip in RecoveryMode
 
+usb:v15A2p006A*
+ ID_MODEL_FROM_DATABASE=Vybrid series SystemOnChip in RecoveryMode
+
+usb:v15A2p0076*
+ ID_MODEL_FROM_DATABASE=i.MX 7Solo/7Dual SystemOnChip in RecoveryMode
+
+usb:v15A2p0080*
+ ID_MODEL_FROM_DATABASE=i.MX 6ULL SystemOnChip in RecoveryMode
+
 usb:v15A4*
  ID_VENDOR_FROM_DATABASE=Afatech Technologies, Inc.
 
@@ -50888,6 +54008,9 @@ usb:v15BAp002A*
 usb:v15BAp002B*
  ID_MODEL_FROM_DATABASE=ARM-USB-OCD-H JTAG+RS232
 
+usb:v15BAp003C*
+ ID_MODEL_FROM_DATABASE=TERES Keyboard+Touchpad
+
 usb:v15C0*
  ID_VENDOR_FROM_DATABASE=XL Imaging
 
@@ -51023,6 +54146,9 @@ usb:v15D9p0A4C*
 usb:v15D9p0A4D*
  ID_MODEL_FROM_DATABASE=Optical Mouse
 
+usb:v15D9p0A4E*
+ ID_MODEL_FROM_DATABASE=AM-5400 [Optical Mouse]
+
 usb:v15D9p0A4F*
  ID_MODEL_FROM_DATABASE=Optical Mouse
 
@@ -51044,9 +54170,21 @@ usb:v15E4*
 usb:v15E4p0024*
  ID_MODEL_FROM_DATABASE=Mixtrack
 
+usb:v15E4p003C*
+ ID_MODEL_FROM_DATABASE=DJ2GO2 Touch
+
 usb:v15E4p0140*
  ID_MODEL_FROM_DATABASE=ION VCR 2 PC / Video 2 PC
 
+usb:v15E4p3F00*
+ ID_MODEL_FROM_DATABASE=Power A Mini Pro Elite
+
+usb:v15E4p3F0A*
+ ID_MODEL_FROM_DATABASE=Airflo Wired Controller for Xbox 360
+
+usb:v15E4p3F10*
+ ID_MODEL_FROM_DATABASE=Batarang controller for Xbox 360
+
 usb:v15E8*
  ID_VENDOR_FROM_DATABASE=SohoWare
 
@@ -51080,12 +54218,18 @@ usb:v15F4p0001*
 usb:v15F4p0025*
  ID_MODEL_FROM_DATABASE=HanfTek UMT-010 USB2.0 DVB-T (warm)
 
+usb:v15F4p0131*
+ ID_MODEL_FROM_DATABASE=Astrometa DVB-T/T2/C FM & DAB receiver [RTL2832P]
+
 usb:v15F4p0135*
  ID_MODEL_FROM_DATABASE=Astrometa T2hybrid
 
 usb:v1604*
  ID_VENDOR_FROM_DATABASE=Tascam
 
+usb:v1604p10C0*
+ ID_MODEL_FROM_DATABASE=Dell Integrated Hub
+
 usb:v1604p8000*
  ID_MODEL_FROM_DATABASE=US-428 Audio/Midi Controller (without fw)
 
@@ -51464,6 +54608,18 @@ usb:v1631p6200*
 usb:v1631pC019*
  ID_MODEL_FROM_DATABASE=RT2573
 
+usb:v1633*
+ ID_VENDOR_FROM_DATABASE=AIM GmbH
+
+usb:v1633p4510*
+ ID_MODEL_FROM_DATABASE=ASC1553
+
+usb:v1633p4520*
+ ID_MODEL_FROM_DATABASE=ASC429
+
+usb:v1633p4560*
+ ID_MODEL_FROM_DATABASE=ASC-FDX
+
 usb:v1645*
  ID_VENDOR_FROM_DATABASE=Entrega [hex]
 
@@ -51695,6 +54851,12 @@ usb:v1679p2001*
 usb:v1679p2002*
  ID_MODEL_FROM_DATABASE=Cheetah SPI Host Adapter
 
+usb:v167B*
+ ID_VENDOR_FROM_DATABASE=Pure Digital Technologies, Inc.
+
+usb:v167Bp2009*
+ ID_MODEL_FROM_DATABASE=Flip Ultra U1120
+
 usb:v1680*
  ID_VENDOR_FROM_DATABASE=Golden Bridge Electech Inc.
 
@@ -51735,7 +54897,16 @@ usb:v1686*
  ID_VENDOR_FROM_DATABASE=ZOOM Corporation
 
 usb:v1686p0045*
- ID_MODEL_FROM_DATABASE=H4 Digital Recorder
+ ID_MODEL_FROM_DATABASE=Handy Recorder stereo mix
+
+usb:v1686p01C0*
+ ID_MODEL_FROM_DATABASE=Zoom Handy Recorder card reader
+
+usb:v1686p01C5*
+ ID_MODEL_FROM_DATABASE=Zoom Handy Recorder multi track
+
+usb:v1686p03D5*
+ ID_MODEL_FROM_DATABASE=LiveTrak L-12
 
 usb:v1687*
  ID_VENDOR_FROM_DATABASE=Kingmax Digital Inc.
@@ -51758,6 +54929,12 @@ usb:v1689*
 usb:v1689pFD00*
  ID_MODEL_FROM_DATABASE=Onza Tournament Edition controller
 
+usb:v1689pFD01*
+ ID_MODEL_FROM_DATABASE=Onza Classic Edition
+
+usb:v1689pFE00*
+ ID_MODEL_FROM_DATABASE=Sabertooth Elite
+
 usb:v168C*
  ID_VENDOR_FROM_DATABASE=Atheros Communications
 
@@ -52004,12 +55181,18 @@ usb:v16C0p0487*
 usb:v16C0p0488*
  ID_MODEL_FROM_DATABASE=Teensyduino Flight Sim Controls
 
+usb:v16C0p05B5*
+ ID_MODEL_FROM_DATABASE=BU0836
+
 usb:v16C0p05DC*
  ID_MODEL_FROM_DATABASE=shared ID for use with libusb
 
 usb:v16C0p05DD*
  ID_MODEL_FROM_DATABASE=BlackcatUSB2
 
+usb:v16C0p05DE*
+ ID_MODEL_FROM_DATABASE=Flashcat
+
 usb:v16C0p05DF*
  ID_MODEL_FROM_DATABASE=HID device except mice, keyboards, and joysticks
 
@@ -52055,6 +55238,9 @@ usb:v16C0p08CC*
 usb:v16C0p08CD*
  ID_MODEL_FROM_DATABASE=Alpermann+Velte SAM7X MT Boot Loader
 
+usb:v16C0p09CE*
+ ID_MODEL_FROM_DATABASE=LINKUSB
+
 usb:v16C0p0A32*
  ID_MODEL_FROM_DATABASE=jbmedia Light-Manager Pro
 
@@ -52112,12 +55298,27 @@ usb:v16D0p054B*
 usb:v16D0p05BE*
  ID_MODEL_FROM_DATABASE=EasyLogic Board
 
+usb:v16D0p05F0*
+ ID_MODEL_FROM_DATABASE=Superior Freedom Programmable IR Remote
+
 usb:v16D0p06CC*
  ID_MODEL_FROM_DATABASE=Trinamic TMCM-3110
 
+usb:v16D0p06F0*
+ ID_MODEL_FROM_DATABASE=Axium AX-R4C Controller
+
+usb:v16D0p06F1*
+ ID_MODEL_FROM_DATABASE=Axium AX-R1D Controller
+
 usb:v16D0p06F9*
  ID_MODEL_FROM_DATABASE=Gabotronics Xminilab
 
+usb:v16D0p0726*
+ ID_MODEL_FROM_DATABASE=Autonomic M400 Amplifier
+
+usb:v16D0p0727*
+ ID_MODEL_FROM_DATABASE=Autonomic M800 Amplifier
+
 usb:v16D0p0753*
  ID_MODEL_FROM_DATABASE=Digistump DigiSpark
 
@@ -52127,18 +55328,60 @@ usb:v16D0p075C*
 usb:v16D0p075D*
  ID_MODEL_FROM_DATABASE=AB-1.x UAC2 [Audio Widget]
 
+usb:v16D0p07CC*
+ ID_MODEL_FROM_DATABASE=Xylanta Ltd, Saint3 Device
+
+usb:v16D0p07F8*
+ ID_MODEL_FROM_DATABASE=Axium AX-R4D Controller
+
 usb:v16D0p080A*
  ID_MODEL_FROM_DATABASE=S2E1 Interface
 
+usb:v16D0p0830*
+ ID_MODEL_FROM_DATABASE=DMXControl Projects e.V., Nodle U1
+
+usb:v16D0p0831*
+ ID_MODEL_FROM_DATABASE=DMXControl Projects e.V., Desklamp
+
+usb:v16D0p0832*
+ ID_MODEL_FROM_DATABASE=DMXControl Projects e.V., Nodle U2
+
+usb:v16D0p0833*
+ ID_MODEL_FROM_DATABASE=DMXControl Projects e.V., Nodle R4S
+
 usb:v16D0p0870*
  ID_MODEL_FROM_DATABASE=Kaufmann Automotive GmbH, RKS+CAN Interface
 
+usb:v16D0p09F2*
+ ID_MODEL_FROM_DATABASE=Axium AX-1250 Amplifier
+
+usb:v16D0p09F4*
+ ID_MODEL_FROM_DATABASE=Axium AX-Mini4 Amplifier
+
 usb:v16D0p0B03*
  ID_MODEL_FROM_DATABASE=AIS Receiver [dAISy]
 
+usb:v16D0p0B7D*
+ ID_MODEL_FROM_DATABASE=Autonomic M801 Amplifier
+
+usb:v16D0p0B7E*
+ ID_MODEL_FROM_DATABASE=Autonomic M401 Amplifier
+
+usb:v16D0p0B7F*
+ ID_MODEL_FROM_DATABASE=Autonomic M120e Amplifier
+
 usb:v16D0p0BD4*
  ID_MODEL_FROM_DATABASE=codesrc SCSI2SD
 
+usb:v16D0p0C9B*
+ ID_MODEL_FROM_DATABASE=Fermium LABS srl/LabTrek srl Hall Effect Apparatus
+
+usb:v16D0p0D3C*
+ ID_MODEL_FROM_DATABASE=InputStick BT4.0
+
+usb:v16D0p0E1E*
+ ID_MODEL_FROM_DATABASE=AtomMiner
+
 usb:v16D1*
  ID_VENDOR_FROM_DATABASE=Suprema Inc.
 
@@ -52236,7 +55479,7 @@ usb:v16DF*
  ID_VENDOR_FROM_DATABASE=King Billion Electronics Co., Ltd.
 
 usb:v16F0*
- ID_VENDOR_FROM_DATABASE=GN ReSound A/S
+ ID_VENDOR_FROM_DATABASE=GN Hearing A/S
 
 usb:v16F0p0001*
  ID_MODEL_FROM_DATABASE=Speedlink Programming Interface
@@ -52244,9 +55487,18 @@ usb:v16F0p0001*
 usb:v16F0p0003*
  ID_MODEL_FROM_DATABASE=Airlink Wireless Programming Interface
 
+usb:v16F0p0004*
+ ID_MODEL_FROM_DATABASE=Accessory Programming Interface
+
 usb:v16F5*
  ID_VENDOR_FROM_DATABASE=Futurelogic Inc.
 
+usb:v1702*
+ ID_VENDOR_FROM_DATABASE=FDI-MATELEC
+
+usb:v1702p0002*
+ ID_MODEL_FROM_DATABASE=Encodeur
+
 usb:v1706*
  ID_VENDOR_FROM_DATABASE=BlueView Technologies, Inc.
 
@@ -52338,7 +55590,7 @@ usb:v1736*
  ID_VENDOR_FROM_DATABASE=CANON IMAGING SYSTEM TECHNOLOGIES INC.
 
 usb:v1737*
- ID_VENDOR_FROM_DATABASE=Linksys
+ ID_VENDOR_FROM_DATABASE=802.11g Adapter [Linksys WUSB54GC v3]
 
 usb:v1737p0039*
  ID_MODEL_FROM_DATABASE=USB1000 Gigabit Notebook Adapter
@@ -52439,6 +55691,9 @@ usb:v174C*
 usb:v174Cp07D1*
  ID_MODEL_FROM_DATABASE=Transcend ESD400 Portable SSD (USB 3.0)
 
+usb:v174Cp1151*
+ ID_MODEL_FROM_DATABASE=ASM1151W
+
 usb:v174Cp1153*
  ID_MODEL_FROM_DATABASE=ASM1153 SATA 3Gb/s bridge
 
@@ -52458,7 +55713,7 @@ usb:v174Cp51D6*
  ID_MODEL_FROM_DATABASE=ASM1051W SATA 3Gb/s bridge
 
 usb:v174Cp55AA*
- ID_MODEL_FROM_DATABASE=Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge
+ ID_MODEL_FROM_DATABASE=ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge
 
 usb:v174F*
  ID_VENDOR_FROM_DATABASE=Syntek
@@ -52469,12 +55724,24 @@ usb:v174Fp1105*
 usb:v174Fp110B*
  ID_MODEL_FROM_DATABASE=HP Webcam
 
+usb:v174Fp1122*
+ ID_MODEL_FROM_DATABASE=HP Webcam
+
+usb:v174Fp1169*
+ ID_MODEL_FROM_DATABASE=Lenovo EasyCamera
+
 usb:v174Fp1403*
  ID_MODEL_FROM_DATABASE=Integrated Webcam
 
 usb:v174Fp1404*
  ID_MODEL_FROM_DATABASE=USB Camera device, 1.3 MPixel Web Cam
 
+usb:v174Fp1758*
+ ID_MODEL_FROM_DATABASE=XYZ printing cameraR2
+
+usb:v174Fp1759*
+ ID_MODEL_FROM_DATABASE=XYZ printing cameraL2
+
 usb:v174Fp5212*
  ID_MODEL_FROM_DATABASE=USB 2.0 UVC PC Camera
 
@@ -52541,6 +55808,12 @@ usb:v1761*
 usb:v1761p0B05*
  ID_MODEL_FROM_DATABASE=802.11n Network Adapter (wrong ID - swapped vendor and device)
 
+usb:v1770*
+ ID_VENDOR_FROM_DATABASE=MSI
+
+usb:v1770pFF00*
+ ID_MODEL_FROM_DATABASE=steel series rgb keyboard
+
 usb:v1772*
  ID_VENDOR_FROM_DATABASE=System Level Solutions, Inc.
 
@@ -52550,6 +55823,12 @@ usb:v1776*
 usb:v1776p501C*
  ID_MODEL_FROM_DATABASE=300K CMOS Camera
 
+usb:v1777*
+ ID_VENDOR_FROM_DATABASE=Microscan Systems, Inc.
+
+usb:v1777p0003*
+ ID_MODEL_FROM_DATABASE=MicroHAWK ID-20
+
 usb:v177F*
  ID_VENDOR_FROM_DATABASE=Sweex
 
@@ -52568,6 +55847,18 @@ usb:v177Fp0313*
 usb:v1781*
  ID_VENDOR_FROM_DATABASE=Multiple Vendors
 
+usb:v1781p07DF*
+ ID_MODEL_FROM_DATABASE=Axium AX-800DAV Amplifier
+
+usb:v1781p07E1*
+ ID_MODEL_FROM_DATABASE=Axium AX-KPC Keypad
+
+usb:v1781p07E2*
+ ID_MODEL_FROM_DATABASE=Axium AX-KPD Keypad
+
+usb:v1781p07E3*
+ ID_MODEL_FROM_DATABASE=Axium AX-400DA Amplifier
+
 usb:v1781p083E*
  ID_MODEL_FROM_DATABASE=MetaGeek Wi-Spy
 
@@ -52577,6 +55868,9 @@ usb:v1781p083F*
 usb:v1781p0938*
  ID_MODEL_FROM_DATABASE=Iguanaworks USB IR Transceiver
 
+usb:v1781p0941*
+ ID_MODEL_FROM_DATABASE=qNimble Quark
+
 usb:v1781p0A96*
  ID_MODEL_FROM_DATABASE=raphnet.net usb_game12
 
@@ -52607,6 +55901,9 @@ usb:v1781p0A9E*
 usb:v1781p0A9F*
  ID_MODEL_FROM_DATABASE=raphnet.net MultiDB9joy
 
+usb:v1781p0BAD*
+ ID_MODEL_FROM_DATABASE=Mantracourt Load Cell
+
 usb:v1781p0C30*
  ID_MODEL_FROM_DATABASE=Telldus TellStick
 
@@ -52625,9 +55922,15 @@ usb:v1781p1EF0*
 usb:v1781p1EF1*
  ID_MODEL_FROM_DATABASE=E1701 Modular Controller Card
 
+usb:v1781p1EF2*
+ ID_MODEL_FROM_DATABASE=E1803 Compact Controller Card
+
 usb:v1782*
  ID_VENDOR_FROM_DATABASE=Spreadtrum Communications Inc.
 
+usb:v1782p3D00*
+ ID_MODEL_FROM_DATABASE=F200n mobile phone
+
 usb:v1784*
  ID_VENDOR_FROM_DATABASE=TopSeed Technology Corp.
 
@@ -52658,6 +55961,12 @@ usb:v1787*
 usb:v1788*
  ID_VENDOR_FROM_DATABASE=ShenZhen Litkconn Technology Co., Ltd.
 
+usb:v178E*
+ ID_VENDOR_FROM_DATABASE=ASUSTek Computer, Inc. (wrong ID)
+
+usb:v178Ep0B05*
+ ID_MODEL_FROM_DATABASE=CrossLink cable 2GB (wrong ID - swapped vendor and device)
+
 usb:v1796*
  ID_VENDOR_FROM_DATABASE=Printrex, Inc.
 
@@ -52697,6 +56006,12 @@ usb:v17A0p0101*
 usb:v17A0p0120*
  ID_MODEL_FROM_DATABASE=Meteorite condenser microphone
 
+usb:v17A0p0130*
+ ID_MODEL_FROM_DATABASE=Go Mic Direct
+
+usb:v17A0p0132*
+ ID_MODEL_FROM_DATABASE=Go Mic Mobile wireless receiver
+
 usb:v17A0p0200*
  ID_MODEL_FROM_DATABASE=StudioDock monitors (internal hub)
 
@@ -52706,6 +56021,15 @@ usb:v17A0p0201*
 usb:v17A0p0210*
  ID_MODEL_FROM_DATABASE=StudioGT monitors
 
+usb:v17A0p0211*
+ ID_MODEL_FROM_DATABASE=StudioGT monitors [CM6400]
+
+usb:v17A0p0240*
+ ID_MODEL_FROM_DATABASE=Go Mic Connect
+
+usb:v17A0p0241*
+ ID_MODEL_FROM_DATABASE=G-Track Pro microphone
+
 usb:v17A0p0301*
  ID_MODEL_FROM_DATABASE=Q2U handheld microphone with XLR
 
@@ -52724,6 +56048,18 @@ usb:v17A0p0305*
 usb:v17A0p0310*
  ID_MODEL_FROM_DATABASE=Meteor condenser microphone
 
+usb:v17A0p0311*
+ ID_MODEL_FROM_DATABASE=Satellite condenser microphone
+
+usb:v17A0p1616*
+ ID_MODEL_FROM_DATABASE=RXD1 wireless receiver
+
+usb:v17A0pB241*
+ ID_MODEL_FROM_DATABASE=G-Track Pro firmware update
+
+usb:v17A0pB311*
+ ID_MODEL_FROM_DATABASE=Satellite firmware update
+
 usb:v17A4*
  ID_VENDOR_FROM_DATABASE=Concept2
 
@@ -52748,6 +56084,18 @@ usb:v17A8p0001*
 usb:v17A8p0005*
  ID_MODEL_FROM_DATABASE=M-Bus Master MultiPort 250D
 
+usb:v17A8p0010*
+ ID_MODEL_FROM_DATABASE=444MHz Radio Mesh Frontend
+
+usb:v17A8p0011*
+ ID_MODEL_FROM_DATABASE=444MHz RF sniffer
+
+usb:v17A8p0012*
+ ID_MODEL_FROM_DATABASE=870MHz Radio Mesh Frontend
+
+usb:v17A8p0013*
+ ID_MODEL_FROM_DATABASE=870MHz RF sniffer
+
 usb:v17B3*
  ID_VENDOR_FROM_DATABASE=Grey Innovation
 
@@ -52787,6 +56135,9 @@ usb:v17CC*
 usb:v17CCp041C*
  ID_MODEL_FROM_DATABASE=Audio 2 DJ
 
+usb:v17CCp041D*
+ ID_MODEL_FROM_DATABASE=Traktor Audio 2
+
 usb:v17CCp0808*
  ID_MODEL_FROM_DATABASE=Maschine Controller
 
@@ -52799,6 +56150,12 @@ usb:v17CCp0839*
 usb:v17CCp0D8D*
  ID_MODEL_FROM_DATABASE=Guitarrig Mobile
 
+usb:v17CCp1001*
+ ID_MODEL_FROM_DATABASE=Komplete Audio 6
+
+usb:v17CCp1110*
+ ID_MODEL_FROM_DATABASE=Maschine Mikro
+
 usb:v17CCp1915*
  ID_MODEL_FROM_DATABASE=Session I/O
 
@@ -52841,6 +56198,15 @@ usb:v17E9*
 usb:v17E9p0051*
  ID_MODEL_FROM_DATABASE=USB VGA Adaptor
 
+usb:v17E9p0198*
+ ID_MODEL_FROM_DATABASE=DisplayLink
+
+usb:v17E9p019E*
+ ID_MODEL_FROM_DATABASE=Overfly FY-1016A
+
+usb:v17E9p028F*
+ ID_MODEL_FROM_DATABASE=HIS Multi-View II
+
 usb:v17E9p030B*
  ID_MODEL_FROM_DATABASE=HP T100
 
@@ -52871,9 +56237,18 @@ usb:v17E9p410A*
 usb:v17E9p430A*
  ID_MODEL_FROM_DATABASE=HP Port Replicator (Composite Device)
 
+usb:v17E9p430F*
+ ID_MODEL_FROM_DATABASE=Kensington Dock (Composite Device)
+
 usb:v17E9p4312*
  ID_MODEL_FROM_DATABASE=S2340T
 
+usb:v17E9p436E*
+ ID_MODEL_FROM_DATABASE=Dell D3100 Docking Station
+
+usb:v17E9pFF10*
+ ID_MODEL_FROM_DATABASE=I1659FWUX {AOC Powered Monitor]
+
 usb:v17EB*
  ID_VENDOR_FROM_DATABASE=Cornice, Inc.
 
@@ -52881,7 +56256,7 @@ usb:v17EF*
  ID_VENDOR_FROM_DATABASE=Lenovo
 
 usb:v17EFp1000*
- ID_MODEL_FROM_DATABASE=Hub
+ ID_MODEL_FROM_DATABASE=ThinkPad X6 UltraBase
 
 usb:v17EFp1003*
  ID_MODEL_FROM_DATABASE=Integrated Smart Card Reader
@@ -52889,20 +56264,59 @@ usb:v17EFp1003*
 usb:v17EFp1004*
  ID_MODEL_FROM_DATABASE=Integrated Webcam
 
+usb:v17EFp1005*
+ ID_MODEL_FROM_DATABASE=ThinkPad X200 Ultrabase (42X4963 )
+
 usb:v17EFp1008*
  ID_MODEL_FROM_DATABASE=Hub
 
 usb:v17EFp100A*
  ID_MODEL_FROM_DATABASE=ThinkPad Mini Dock Plus Series 3
 
+usb:v17EFp100F*
+ ID_MODEL_FROM_DATABASE=ThinkPad Ultra Dock Hub
+
+usb:v17EFp1010*
+ ID_MODEL_FROM_DATABASE=ThinkPad Ultra Dock Hub
+
+usb:v17EFp1020*
+ ID_MODEL_FROM_DATABASE=ThinkPad Dock Hub
+
+usb:v17EFp1021*
+ ID_MODEL_FROM_DATABASE=ThinkPad Dock Hub [Cypress HX2VL]
+
+usb:v17EFp3049*
+ ID_MODEL_FROM_DATABASE=ThinkPad OneLink integrated audio
+
 usb:v17EFp304B*
  ID_MODEL_FROM_DATABASE=AX88179 Gigabit Ethernet [ThinkPad OneLink GigaLAN]
 
+usb:v17EFp304F*
+ ID_MODEL_FROM_DATABASE=RTL8153 Gigabit Ethernet [ThinkPad OneLink Pro Dock]
+
+usb:v17EFp3060*
+ ID_MODEL_FROM_DATABASE=ThinkPad Dock
+
+usb:v17EFp3062*
+ ID_MODEL_FROM_DATABASE=ThinkPad Dock Ethernet [Realtek RTL8153B]
+
+usb:v17EFp3063*
+ ID_MODEL_FROM_DATABASE=ThinkPad Dock Audio
+
+usb:v17EFp3066*
+ ID_MODEL_FROM_DATABASE=ThinkPad Thunderbolt 3 Dock MCU
+
+usb:v17EFp3069*
+ ID_MODEL_FROM_DATABASE=ThinkPad TBT3 LAN
+
+usb:v17EFp306A*
+ ID_MODEL_FROM_DATABASE=ThinkPad Thunderbolt 3 Dock Audio
+
 usb:v17EFp3815*
  ID_MODEL_FROM_DATABASE=ChipsBnk 2GB USB Stick
 
 usb:v17EFp4802*
- ID_MODEL_FROM_DATABASE=Lenovo Vc0323+MI1310_SOC Camera
+ ID_MODEL_FROM_DATABASE=Vc0323+MI1310_SOC Camera
 
 usb:v17EFp4807*
  ID_MODEL_FROM_DATABASE=UVC Camera
@@ -52955,15 +56369,54 @@ usb:v17EFp6007*
 usb:v17EFp6009*
  ID_MODEL_FROM_DATABASE=ThinkPad Keyboard with TrackPoint
 
+usb:v17EFp600E*
+ ID_MODEL_FROM_DATABASE=Optical Mouse
+
 usb:v17EFp6014*
  ID_MODEL_FROM_DATABASE=Mini Wireless Keyboard N5901
 
+usb:v17EFp6019*
+ ID_MODEL_FROM_DATABASE=M-U0025-O Mouse
+
+usb:v17EFp6022*
+ ID_MODEL_FROM_DATABASE=Ultraslim Plus Wireless Keyboard and Mouse
+
 usb:v17EFp6025*
  ID_MODEL_FROM_DATABASE=ThinkPad Travel Mouse
 
+usb:v17EFp602D*
+ ID_MODEL_FROM_DATABASE=Black Silk Keyboard
+
+usb:v17EFp6032*
+ ID_MODEL_FROM_DATABASE=Wireless Dongle for Keyboard and Mouse
+
+usb:v17EFp6044*
+ ID_MODEL_FROM_DATABASE=ThinkPad Laser Mouse
+
+usb:v17EFp6047*
+ ID_MODEL_FROM_DATABASE=ThinkPad Compact Keyboard with TrackPoint
+
+usb:v17EFp604B*
+ ID_MODEL_FROM_DATABASE=Precision Wireless Mouse
+
+usb:v17EFp608D*
+ ID_MODEL_FROM_DATABASE=Optical Mouse
+
+usb:v17EFp609B*
+ ID_MODEL_FROM_DATABASE=Professional Wireless Keyboard and Mouse Combo
+
+usb:v17EFp609C*
+ ID_MODEL_FROM_DATABASE=Professional Wireless Keyboard
+
 usb:v17EFp7203*
  ID_MODEL_FROM_DATABASE=Ethernet adapter [U2L 100P-Y1]
 
+usb:v17EFp7205*
+ ID_MODEL_FROM_DATABASE=Thinkpad LAN
+
+usb:v17EFp7217*
+ ID_MODEL_FROM_DATABASE=VGA adapter
+
 usb:v17EFp7423*
  ID_MODEL_FROM_DATABASE=IdeaPad A1 Tablet
 
@@ -52985,6 +56438,69 @@ usb:v17EFp749A*
 usb:v17EFp749B*
  ID_MODEL_FROM_DATABASE=A789 (PTP mode, with debug)
 
+usb:v17EFp7604*
+ ID_MODEL_FROM_DATABASE=A760 (Mass Storage mode)
+
+usb:v17EFp7605*
+ ID_MODEL_FROM_DATABASE=A760 (Mass Storage mode, with debug)
+
+usb:v17EFp760A*
+ ID_MODEL_FROM_DATABASE=A760 (MTP mode)
+
+usb:v17EFp760B*
+ ID_MODEL_FROM_DATABASE=A760 (MTP mode, with debug)
+
+usb:v17EFp760C*
+ ID_MODEL_FROM_DATABASE=A760 (PTP mode)
+
+usb:v17EFp760D*
+ ID_MODEL_FROM_DATABASE=A760 (PTP mode, with debug)
+
+usb:v17EFp76FC*
+ ID_MODEL_FROM_DATABASE=B8000-H (Yoga Tablet 10) (mass storage)
+
+usb:v17EFp76FD*
+ ID_MODEL_FROM_DATABASE=B8000-H (Yoga Tablet 10) (debug , mass storage)
+
+usb:v17EFp76FE*
+ ID_MODEL_FROM_DATABASE=B8000-H (Yoga Tablet 10) (MTP)
+
+usb:v17EFp76FF*
+ ID_MODEL_FROM_DATABASE=B8000-H (Yoga Tablet 10) (debug , MTP)
+
+usb:v17EFp7702*
+ ID_MODEL_FROM_DATABASE=B8000-H (Yoga Tablet 10) (PTP)
+
+usb:v17EFp7703*
+ ID_MODEL_FROM_DATABASE=B8000-H (Yoga Tablet 10) (debug , PTP)
+
+usb:v17EFp7704*
+ ID_MODEL_FROM_DATABASE=B8000-H (Yoga Tablet 10) (USB tether)
+
+usb:v17EFp7705*
+ ID_MODEL_FROM_DATABASE=B8000-H (Yoga Tablet 10) (debug , USB tether)
+
+usb:v17EFp7706*
+ ID_MODEL_FROM_DATABASE=B8000-H (Yoga Tablet 10) (zerocd)
+
+usb:v17EFp7707*
+ ID_MODEL_FROM_DATABASE=B8000-H (Yoga Tablet 10) (debug , zerocd)
+
+usb:v17EFp785F*
+ ID_MODEL_FROM_DATABASE=TAB 2 A7-10 Tablet
+
+usb:v17EFpB000*
+ ID_MODEL_FROM_DATABASE=Virtual Keyboard and Mouse
+
+usb:v17EFpB001*
+ ID_MODEL_FROM_DATABASE=Ethernet
+
+usb:v17EFpB003*
+ ID_MODEL_FROM_DATABASE=Virtual Keyboard and Mouse / Mass Storage
+
+usb:v17EFpF003*
+ ID_MODEL_FROM_DATABASE=MEDION LIFETAB X10605 MTP mode
+
 usb:v17F4*
  ID_VENDOR_FROM_DATABASE=WaveSense
 
@@ -52995,11 +56511,14 @@ usb:v17F5*
  ID_VENDOR_FROM_DATABASE=K.K. Rocky
 
 usb:v17F6*
- ID_VENDOR_FROM_DATABASE=Unicomp, Inc
+ ID_VENDOR_FROM_DATABASE=Unicomp, Inc.
 
 usb:v17F6p0709*
  ID_MODEL_FROM_DATABASE=Model M Keyboard
 
+usb:v17F6p0822*
+ ID_MODEL_FROM_DATABASE=Ruffian 6 Keyboard v3 [Model M]
+
 usb:v1809*
  ID_VENDOR_FROM_DATABASE=Advantech
 
@@ -53036,9 +56555,21 @@ usb:v1843*
 usb:v1849*
  ID_VENDOR_FROM_DATABASE=ASRock Incorporation
 
+usb:v184F*
+ ID_VENDOR_FROM_DATABASE=K2L GmbH
+
+usb:v184Fp0012*
+ ID_MODEL_FROM_DATABASE=MOCCA compact
+
 usb:v1852*
  ID_VENDOR_FROM_DATABASE=GYROCOM C&C Co., LTD
 
+usb:v1852p7022*
+ ID_MODEL_FROM_DATABASE=Fiio E10
+
+usb:v1852p7921*
+ ID_MODEL_FROM_DATABASE=Audiotrak ProDigy CUBE
+
 usb:v1852p7922*
  ID_MODEL_FROM_DATABASE=Audiotrak DR.DAC2 DX [GYROCOM C&C]
 
@@ -53096,6 +56627,12 @@ usb:v187C*
 usb:v187Cp0511*
  ID_MODEL_FROM_DATABASE=AlienFX Mobile lighting
 
+usb:v187Cp0513*
+ ID_MODEL_FROM_DATABASE=Gaming Desktop [Aurora R4]
+
+usb:v187Cp0550*
+ ID_MODEL_FROM_DATABASE=LED controller
+
 usb:v187Cp0600*
  ID_MODEL_FROM_DATABASE=Dual Compatible Game Pad
 
@@ -53177,12 +56714,18 @@ usb:v18A5p0237*
 usb:v18A5p0243*
  ID_MODEL_FROM_DATABASE=Flash Drive (Store'n'Go)
 
+usb:v18A5p0245*
+ ID_MODEL_FROM_DATABASE=Store'n'Stay
+
 usb:v18A5p0302*
  ID_MODEL_FROM_DATABASE=Flash Drive
 
 usb:v18A5p0304*
  ID_MODEL_FROM_DATABASE=Store 'n' Go
 
+usb:v18A5p0408*
+ ID_MODEL_FROM_DATABASE=Store 'n' Go
+
 usb:v18A5p4123*
  ID_MODEL_FROM_DATABASE=Store N Go
 
@@ -53253,10 +56796,22 @@ usb:v18D1p0D02*
  ID_MODEL_FROM_DATABASE=Celkon A88
 
 usb:v18D1p2D00*
- ID_MODEL_FROM_DATABASE=Android-powered device in accessory mode
+ ID_MODEL_FROM_DATABASE=Android Open Accessory device (accessory)
 
 usb:v18D1p2D01*
- ID_MODEL_FROM_DATABASE=Android-powered device in accessory mode with ADB support
+ ID_MODEL_FROM_DATABASE=Android Open Accessory device (accessory + ADB)
+
+usb:v18D1p2D02*
+ ID_MODEL_FROM_DATABASE=Android Open Accessory device (audio)
+
+usb:v18D1p2D03*
+ ID_MODEL_FROM_DATABASE=Android Open Accessory device (audio + ADB)
+
+usb:v18D1p2D04*
+ ID_MODEL_FROM_DATABASE=Android Open Accessory device (accessory + audio)
+
+usb:v18D1p2D05*
+ ID_MODEL_FROM_DATABASE=Android Open Accessory device (accessory + audio + ADB)
 
 usb:v18D1p4E11*
  ID_MODEL_FROM_DATABASE=Nexus One
@@ -53298,25 +56853,37 @@ usb:v18D1p4E44*
  ID_MODEL_FROM_DATABASE=Nexus 7 2012 (PTP)
 
 usb:v18D1p4EE0*
- ID_MODEL_FROM_DATABASE=Nexus 4 (bootloader)
+ ID_MODEL_FROM_DATABASE=Nexus/Pixel Device (fastboot)
 
 usb:v18D1p4EE1*
- ID_MODEL_FROM_DATABASE=Nexus Device (MTP)
+ ID_MODEL_FROM_DATABASE=Nexus/Pixel Device (MTP)
 
 usb:v18D1p4EE2*
- ID_MODEL_FROM_DATABASE=Nexus Device (debug)
+ ID_MODEL_FROM_DATABASE=Nexus/Pixel Device (MTP + debug)
 
 usb:v18D1p4EE3*
- ID_MODEL_FROM_DATABASE=Nexus 4/5/7/10 (tether)
+ ID_MODEL_FROM_DATABASE=Nexus/Pixel Device (tether)
 
 usb:v18D1p4EE4*
- ID_MODEL_FROM_DATABASE=Nexus 4/5/7/10 (debug + tether)
+ ID_MODEL_FROM_DATABASE=Nexus/Pixel Device (tether+ debug)
 
 usb:v18D1p4EE5*
- ID_MODEL_FROM_DATABASE=Nexus 4 (PTP)
+ ID_MODEL_FROM_DATABASE=Nexus/Pixel Device (PTP)
 
 usb:v18D1p4EE6*
- ID_MODEL_FROM_DATABASE=Nexus 4/5 (PTP + debug)
+ ID_MODEL_FROM_DATABASE=Nexus/Pixel Device (PTP + debug)
+
+usb:v18D1p4EE7*
+ ID_MODEL_FROM_DATABASE=Nexus/Pixel Device (charging + debug)
+
+usb:v18D1p4EE8*
+ ID_MODEL_FROM_DATABASE=Nexus/Pixel Device (MIDI)
+
+usb:v18D1p4EE9*
+ ID_MODEL_FROM_DATABASE=Nexus/Pixel Device (MIDI + debug)
+
+usb:v18D1p5033*
+ ID_MODEL_FROM_DATABASE=Pixel earbuds
 
 usb:v18D1p7102*
  ID_MODEL_FROM_DATABASE=Toshiba Thrive tablet
@@ -53330,6 +56897,9 @@ usb:v18D1pD001*
 usb:v18D1pD002*
  ID_MODEL_FROM_DATABASE=Nexus 4 (debug)
 
+usb:v18D1pD00D*
+ ID_MODEL_FROM_DATABASE=Xiaomi Mi/Redmi 2 (fastboot)
+
 usb:v18D1pD109*
  ID_MODEL_FROM_DATABASE=LG G2x MTP
 
@@ -53408,12 +56978,36 @@ usb:v18ECp3299*
 usb:v18ECp3366*
  ID_MODEL_FROM_DATABASE=Bresser Biolux NV
 
+usb:v18ECp5850*
+ ID_MODEL_FROM_DATABASE=CVBS / S-Video Capture Device [UVC]
+
+usb:v18EF*
+ ID_VENDOR_FROM_DATABASE=ELV Elektronik AG
+
+usb:v18EFpE014*
+ ID_MODEL_FROM_DATABASE=FS20PCE
+
+usb:v18EFpE015*
+ ID_MODEL_FROM_DATABASE=FS20PCS
+
+usb:v18EFpE01A*
+ ID_MODEL_FROM_DATABASE=Bedien-Anzeige-Terminal
+
 usb:v18F8*
  ID_VENDOR_FROM_DATABASE=[Maxxter]
 
+usb:v18F8p0F97*
+ ID_MODEL_FROM_DATABASE=Optical Gaming Mouse [Xtrem]
+
 usb:v18F8p0F99*
  ID_MODEL_FROM_DATABASE=Optical gaming mouse
 
+usb:v18F8p1142*
+ ID_MODEL_FROM_DATABASE=Optical gaming mouse
+
+usb:v18F8p1486*
+ ID_MODEL_FROM_DATABASE=X5s ZEUS Macro Pro Gaming Mouse
+
 usb:v18FB*
  ID_VENDOR_FROM_DATABASE=Scriptel Corporation
 
@@ -53477,8 +57071,26 @@ usb:v1901p0015*
 usb:v1908*
  ID_VENDOR_FROM_DATABASE=GEMBIRD
 
+usb:v1908p0102*
+ ID_MODEL_FROM_DATABASE=Digital Photo Frame
+
+usb:v1908p0226*
+ ID_MODEL_FROM_DATABASE=MicroSD Card Reader/Writer
+
+usb:v1908p1315*
+ ID_MODEL_FROM_DATABASE=Digital Photo Frame
+
 usb:v1908p1320*
- ID_MODEL_FROM_DATABASE=PhotoFrame PF-15-1
+ ID_MODEL_FROM_DATABASE=DM8261 Flashdisc
+
+usb:v1908p2070*
+ ID_MODEL_FROM_DATABASE=Honk HK-5002 USB Speaker
+
+usb:v1908p2220*
+ ID_MODEL_FROM_DATABASE=Buildwin Media-Player
+
+usb:v1908p2311*
+ ID_MODEL_FROM_DATABASE=Generic UVC 1.00 camera [AppoTech AX2311]
 
 usb:v190D*
  ID_VENDOR_FROM_DATABASE=Motorola GSG
@@ -53492,6 +57104,9 @@ usb:v1915*
 usb:v1915p000C*
  ID_MODEL_FROM_DATABASE=Wireless Desktop nRF24L01 CX-1766
 
+usb:v1915p0101*
+ ID_MODEL_FROM_DATABASE=HP Prime Wireless Kit [FOK65AA] (Flash mode)
+
 usb:v1915p2233*
  ID_MODEL_FROM_DATABASE=Linksys WUSB11 v2.8 802.11b Adapter [Atmel AT76C505]
 
@@ -53504,6 +57119,9 @@ usb:v1915p2235*
 usb:v1915p2236*
  ID_MODEL_FROM_DATABASE=Linksys WUSB11 v3.0 802.11b Adapter [Intersil PRISM 3]
 
+usb:v1915p7777*
+ ID_MODEL_FROM_DATABASE=Bitcraze Crazyradio (PA) dongle
+
 usb:v191C*
  ID_VENDOR_FROM_DATABASE=Innovative Technology LTD
 
@@ -53603,9 +57221,18 @@ usb:v1926p0086*
 usb:v1926p0087*
  ID_MODEL_FROM_DATABASE=1950 HID Touchscreen
 
+usb:v1926p0DBF*
+ ID_MODEL_FROM_DATABASE=HID Touchscreen
+
 usb:v1926p0DC2*
  ID_MODEL_FROM_DATABASE=HID Touchscreen
 
+usb:v1928*
+ ID_VENDOR_FROM_DATABASE=Proceq SA
+
+usb:v1928p0400*
+ ID_MODEL_FROM_DATABASE=Equotip Piccolo
+
 usb:v192F*
  ID_VENDOR_FROM_DATABASE=Avago Technologies, Pte.
 
@@ -53618,6 +57245,9 @@ usb:v192Fp0416*
 usb:v192Fp0616*
  ID_MODEL_FROM_DATABASE=ADNS-5700 Optical Mouse Controller (5-button)
 
+usb:v192Fp0916*
+ ID_MODEL_FROM_DATABASE=ADNS-2710 Optical Mouse Controller
+
 usb:v1930*
  ID_VENDOR_FROM_DATABASE=Shenzhen Xianhe Technology Co., Ltd.
 
@@ -53636,12 +57266,21 @@ usb:v1934p0702*
 usb:v1934p5168*
  ID_MODEL_FROM_DATABASE=F71610A or F71612A Consumer Infrared Receiver/Transceiver
 
+usb:v1935*
+ ID_VENDOR_FROM_DATABASE=Elektron Music Machines
+
+usb:v1935p000D*
+ ID_MODEL_FROM_DATABASE=Elektron Digitakt
+
 usb:v1938*
  ID_VENDOR_FROM_DATABASE=Meinberg Funkuhren GmbH & Co. KG
 
 usb:v1938p0501*
  ID_MODEL_FROM_DATABASE=TCR51USB IRIG Time Code Reader
 
+usb:v1938p0502*
+ ID_MODEL_FROM_DATABASE=TCR600USB IRIG Time Code Reader
+
 usb:v1941*
  ID_VENDOR_FROM_DATABASE=Dream Link
 
@@ -53663,6 +57302,9 @@ usb:v1943p2255*
 usb:v1943p2257*
  ID_MODEL_FROM_DATABASE=Model 2257 4 Channel Capture Card
 
+usb:v1943p2263*
+ ID_MODEL_FROM_DATABASE=Model 2263 UVC HD Audio/Video Codec Card
+
 usb:v1943pA250*
  ID_MODEL_FROM_DATABASE=Model 2250 MPEG and JPEG Capture Card (cold)
 
@@ -53679,11 +57321,23 @@ usb:v1949p0004*
  ID_MODEL_FROM_DATABASE=Amazon Kindle 3/4/Paperwhite
 
 usb:v1949p0006*
- ID_MODEL_FROM_DATABASE=Kindle Fire
+ ID_MODEL_FROM_DATABASE=Amazon Kindle Fire
 
 usb:v1949p0008*
  ID_MODEL_FROM_DATABASE=Amazon Kindle Fire HD 8.9"
 
+usb:v1949p000A*
+ ID_MODEL_FROM_DATABASE=Amazon Kindle Fire 2nd generation (2012)
+
+usb:v1949p0331*
+ ID_MODEL_FROM_DATABASE=Kindle Fire HD 8 (2018)
+
+usb:v1949p0417*
+ ID_MODEL_FROM_DATABASE=Amazon Zukey; clone of Yubikey 4 OTP+U2F
+
+usb:v1949p0800*
+ ID_MODEL_FROM_DATABASE=Fire Phone
+
 usb:v194F*
  ID_VENDOR_FROM_DATABASE=PreSonus Audio Electronics, Inc.
 
@@ -53696,6 +57350,9 @@ usb:v194Fp0102*
 usb:v194Fp0103*
  ID_MODEL_FROM_DATABASE=AudioBox 1818 VSL
 
+usb:v194Fp0201*
+ ID_MODEL_FROM_DATABASE=FaderPort
+
 usb:v194Fp0301*
  ID_MODEL_FROM_DATABASE=AudioBox
 
@@ -53714,6 +57371,9 @@ usb:v1954*
 usb:v195D*
  ID_VENDOR_FROM_DATABASE=Itron Technology iONE
 
+usb:v195Dp2030*
+ ID_MODEL_FROM_DATABASE=Func KB-460 Gaming Keyboard
+
 usb:v195Dp7002*
  ID_MODEL_FROM_DATABASE=Libra-Q11 IR remote
 
@@ -53726,12 +57386,27 @@ usb:v195Dp7777*
 usb:v195Dp7779*
  ID_MODEL_FROM_DATABASE=Scorpius-P20MT
 
+usb:v1963*
+ ID_VENDOR_FROM_DATABASE=IK Multimedia
+
+usb:v1963p0005*
+ ID_MODEL_FROM_DATABASE=iRig KEYS
+
+usb:v1963p0046*
+ ID_MODEL_FROM_DATABASE=UNO Synth
+
 usb:v1965*
  ID_VENDOR_FROM_DATABASE=Uniden Corporation
 
 usb:v1965p0016*
  ID_MODEL_FROM_DATABASE=HomePatrol-1
 
+usb:v1965p0018*
+ ID_MODEL_FROM_DATABASE=UBC125XLT
+
+usb:v1965p001A*
+ ID_MODEL_FROM_DATABASE=BCD436HP Scanner
+
 usb:v1967*
  ID_VENDOR_FROM_DATABASE=CASIO HITACHI Mobile Communications Co., Ltd.
 
@@ -53744,14 +57419,29 @@ usb:v1970*
 usb:v1970p0000*
  ID_MODEL_FROM_DATABASE=Z Mate 16GB
 
+usb:v1973*
+ ID_VENDOR_FROM_DATABASE=Spectralink Corporation
+
+usb:v1973p0002*
+ ID_MODEL_FROM_DATABASE=Pivot recovery
+
+usb:v1973p0003*
+ ID_MODEL_FROM_DATABASE=Pivot Media Transfer Protocol
+
+usb:v1973p0004*
+ ID_MODEL_FROM_DATABASE=Pivot Media Transfer Protocol
+
 usb:v1975*
  ID_VENDOR_FROM_DATABASE=Dongguan Guneetal Wire & Cable Co., Ltd.
 
 usb:v1976*
  ID_VENDOR_FROM_DATABASE=Chipsbrand Microelectronics (HK) Co., Ltd.
 
+usb:v1976p1307*
+ ID_MODEL_FROM_DATABASE=microSD Card Reader
+
 usb:v1976p6025*
- ID_MODEL_FROM_DATABASE=Flash Drive 512 MB
+ ID_MODEL_FROM_DATABASE=CBM2090 Flash Drive
 
 usb:v1977*
  ID_VENDOR_FROM_DATABASE=T-Logic
@@ -53765,6 +57455,12 @@ usb:v197D*
 usb:v197Dp0222*
  ID_MODEL_FROM_DATABASE=BCL 508i
 
+usb:v1980*
+ ID_VENDOR_FROM_DATABASE=Storage Appliance Corporation
+
+usb:v1980p0808*
+ ID_MODEL_FROM_DATABASE=Clickfree C2 Slimline (527SE)
+
 usb:v1989*
  ID_VENDOR_FROM_DATABASE=Nuconn Technology Corp.
 
@@ -53801,6 +57497,15 @@ usb:v1996p3011*
 usb:v1996p3012*
  ID_MODEL_FROM_DATABASE=e-ImageData Corp. ScanPro
 
+usb:v1997*
+ ID_VENDOR_FROM_DATABASE=Shenzhen Riitek Technology Co., Ltd
+
+usb:v1997p0409*
+ ID_MODEL_FROM_DATABASE=wireless mini keyboard with touchpad
+
+usb:v1997p2433*
+ ID_MODEL_FROM_DATABASE=wireless mini keyboard with touchpad
+
 usb:v199B*
  ID_VENDOR_FROM_DATABASE=MicroStrain, Inc.
 
@@ -53813,9 +57518,27 @@ usb:v199E*
 usb:v199Ep8101*
  ID_MODEL_FROM_DATABASE=DFx 21BU04 Camera
 
+usb:v199Ep8457*
+ ID_MODEL_FROM_DATABASE=DFK AFU130-L53 camera
+
 usb:v199F*
  ID_VENDOR_FROM_DATABASE=Benica Corporation
 
+usb:v19A5*
+ ID_VENDOR_FROM_DATABASE=HARRIS Corp.
+
+usb:v19A5p0004*
+ ID_MODEL_FROM_DATABASE=Remote NDIS Network Device
+
+usb:v19A5p0012*
+ ID_MODEL_FROM_DATABASE=RF-7800S Secure Personal Radio
+
+usb:v19A5p0401*
+ ID_MODEL_FROM_DATABASE=Mass Storage Device
+
+usb:v19A5p0402*
+ ID_MODEL_FROM_DATABASE=Falcon III RF-7800V family RNDIS
+
 usb:v19A8*
  ID_VENDOR_FROM_DATABASE=Biforst Technology Inc.
 
@@ -53864,6 +57587,9 @@ usb:v19B6*
 usb:v19B9*
  ID_VENDOR_FROM_DATABASE=Data Robotics
 
+usb:v19B9p4B10*
+ ID_MODEL_FROM_DATABASE=Drobo
+
 usb:v19B9p8D20*
  ID_MODEL_FROM_DATABASE=Drobo Elite
 
@@ -53882,6 +57608,12 @@ usb:v19CAp0001*
 usb:v19CF*
  ID_VENDOR_FROM_DATABASE=Parrot SA
 
+usb:v19CFp0001*
+ ID_MODEL_FROM_DATABASE=MiniKit Slim handsfree car kit in firmware update mode
+
+usb:v19D1*
+ ID_VENDOR_FROM_DATABASE=BYD
+
 usb:v19D2*
  ID_VENDOR_FROM_DATABASE=ZTE WCDMA Technologies MSM
 
@@ -53894,9 +57626,18 @@ usb:v19D2p0002*
 usb:v19D2p0007*
  ID_MODEL_FROM_DATABASE=TU25 WiMAX Adapter [Beceem BCS200]
 
+usb:v19D2p0017*
+ ID_MODEL_FROM_DATABASE=MF669
+
 usb:v19D2p0031*
  ID_MODEL_FROM_DATABASE=MF110/MF627/MF636
 
+usb:v19D2p0037*
+ ID_MODEL_FROM_DATABASE=ONDA MC503HSA
+
+usb:v19D2p0039*
+ ID_MODEL_FROM_DATABASE=MF100
+
 usb:v19D2p0063*
  ID_MODEL_FROM_DATABASE=K3565-Z HSDPA
 
@@ -53912,6 +57653,9 @@ usb:v19D2p0103*
 usb:v19D2p0104*
  ID_MODEL_FROM_DATABASE=K4505-Z
 
+usb:v19D2p0117*
+ ID_MODEL_FROM_DATABASE=MF667
+
 usb:v19D2p0146*
  ID_MODEL_FROM_DATABASE=MF 195E (HSPA+ Modem)
 
@@ -53927,6 +57671,15 @@ usb:v19D2p0325*
 usb:v19D2p0326*
  ID_MODEL_FROM_DATABASE=LTE4G O2 ZTE MF821D LTE/UMTS/GSM Modem/Networkcard
 
+usb:v19D2p0501*
+ ID_MODEL_FROM_DATABASE=Lever Cell Phone Model Z936L
+
+usb:v19D2p1001*
+ ID_MODEL_FROM_DATABASE=K3805-Z vodafone WCDMA/GSM Modem - storage mode (made by ZTE)
+
+usb:v19D2p1002*
+ ID_MODEL_FROM_DATABASE=K3805-Z vodafone WCDMA/GSM Modem/Networkcard (made by ZTE)
+
 usb:v19D2p1008*
  ID_MODEL_FROM_DATABASE=K3570-Z
 
@@ -53948,6 +57701,9 @@ usb:v19D2p1217*
 usb:v19D2p1218*
  ID_MODEL_FROM_DATABASE=MF652
 
+usb:v19D2p1270*
+ ID_MODEL_FROM_DATABASE=MF667
+
 usb:v19D2p2000*
  ID_MODEL_FROM_DATABASE=MF627/MF628/MF628+/MF636+ HSDPA/HSUPA
 
@@ -53981,9 +57737,15 @@ usb:v19F7p0001*
 usb:v19FA*
  ID_VENDOR_FROM_DATABASE=Gampaq Co.Ltd
 
+usb:v19FAp0607*
+ ID_MODEL_FROM_DATABASE=GAME CONTROLLER
+
 usb:v19FAp0703*
  ID_MODEL_FROM_DATABASE=Steering Wheel
 
+usb:v19FD*
+ ID_VENDOR_FROM_DATABASE=MTI Instruments Inc.
+
 usb:v19FF*
  ID_VENDOR_FROM_DATABASE=Dynex
 
@@ -53993,9 +57755,15 @@ usb:v19FFp0102*
 usb:v19FFp0201*
  ID_MODEL_FROM_DATABASE=Rocketfish Wireless 2.4G Laser Mouse
 
+usb:v19FFp0220*
+ ID_MODEL_FROM_DATABASE=RF-HDWEBLT RocketFish HD WebCam
+
 usb:v19FFp0238*
  ID_MODEL_FROM_DATABASE=DX-WRM1401 Mouse
 
+usb:v19FFp0239*
+ ID_MODEL_FROM_DATABASE=Bluetooth 4.0 Adapter [Broadcom, 1.12, BCM20702A0]
+
 usb:v1A08*
  ID_VENDOR_FROM_DATABASE=Bellwood International, Inc.
 
@@ -54029,6 +57797,15 @@ usb:v1A2Cp0021*
 usb:v1A2Cp0024*
  ID_MODEL_FROM_DATABASE=Multimedia Keyboard
 
+usb:v1A2Cp2124*
+ ID_MODEL_FROM_DATABASE=Keyboard
+
+usb:v1A2Cp2D23*
+ ID_MODEL_FROM_DATABASE=Keyboard
+
+usb:v1A2Cp427C*
+ ID_MODEL_FROM_DATABASE=Backlit Keyboard [Cougar Vantar]
+
 usb:v1A32*
  ID_VENDOR_FROM_DATABASE=Quanta Microsystems, Inc.
 
@@ -54077,6 +57854,21 @@ usb:v1A61*
 usb:v1A61p3410*
  ID_MODEL_FROM_DATABASE=CoPilot System Cable
 
+usb:v1A61p3650*
+ ID_MODEL_FROM_DATABASE=FreeStyle Libre
+
+usb:v1A61p3850*
+ ID_MODEL_FROM_DATABASE=FreeStyle Optium/Precision Neo
+
+usb:v1A61p3950*
+ ID_MODEL_FROM_DATABASE=FreeStyle Libre 2
+
+usb:v1A64*
+ ID_VENDOR_FROM_DATABASE=Mastervolt
+
+usb:v1A64p0000*
+ ID_MODEL_FROM_DATABASE=MasterBus Link
+
 usb:v1A6A*
  ID_VENDOR_FROM_DATABASE=Spansion Inc.
 
@@ -54101,9 +57893,18 @@ usb:v1A79*
 usb:v1A79p6002*
  ID_MODEL_FROM_DATABASE=Contour
 
+usb:v1A79p6210*
+ ID_MODEL_FROM_DATABASE=Contour Next Link 2.4 glucometer
+
+usb:v1A79p6300*
+ ID_MODEL_FROM_DATABASE=Contour next link
+
 usb:v1A79p7410*
  ID_MODEL_FROM_DATABASE=Contour Next
 
+usb:v1A79p7800*
+ ID_MODEL_FROM_DATABASE=Contour Plus One
+
 usb:v1A7B*
  ID_VENDOR_FROM_DATABASE=Lumberg Connect  GmbH & Co. KG
 
@@ -54119,9 +57920,21 @@ usb:v1A7Cp0168*
 usb:v1A7Cp0191*
  ID_MODEL_FROM_DATABASE=VerticalMouse 4
 
+usb:v1A7Cp0195*
+ ID_MODEL_FROM_DATABASE=VerticalMouse C Wireless
+
 usb:v1A81*
  ID_VENDOR_FROM_DATABASE=Holtek Semiconductor, Inc.
 
+usb:v1A81p1004*
+ ID_MODEL_FROM_DATABASE=Wireless Dongle 2.4 GHZ HT82D40REW
+
+usb:v1A81p1701*
+ ID_MODEL_FROM_DATABASE=Wireless dongle
+
+usb:v1A81p2004*
+ ID_MODEL_FROM_DATABASE=Keyboard
+
 usb:v1A81p2203*
  ID_MODEL_FROM_DATABASE=Laser Gaming mouse
 
@@ -54131,6 +57944,9 @@ usb:v1A81p2204*
 usb:v1A81p2205*
  ID_MODEL_FROM_DATABASE=Laser Mouse
 
+usb:v1A81p4001*
+ ID_MODEL_FROM_DATABASE=Keyboard
+
 usb:v1A86*
  ID_VENDOR_FROM_DATABASE=QinHeng Electronics
 
@@ -54144,7 +57960,7 @@ usb:v1A86p5584*
  ID_MODEL_FROM_DATABASE=CH341 in parallel mode, usb to printer port converter
 
 usb:v1A86p7523*
- ID_MODEL_FROM_DATABASE=HL-340 USB-Serial adapter
+ ID_MODEL_FROM_DATABASE=CH340 serial converter
 
 usb:v1A86p752D*
  ID_MODEL_FROM_DATABASE=CH345 MIDI adapter
@@ -54185,6 +58001,21 @@ usb:v1AA5*
 usb:v1AA6*
  ID_VENDOR_FROM_DATABASE=eFortune Technology Corp.
 
+usb:v1AAB*
+ ID_VENDOR_FROM_DATABASE=Silvercreations Software AG
+
+usb:v1AABp7736*
+ ID_MODEL_FROM_DATABASE=sceye (Gen 2)
+
+usb:v1AABp7737*
+ ID_MODEL_FROM_DATABASE=sceye (Gen 3)
+
+usb:v1AABp7738*
+ ID_MODEL_FROM_DATABASE=sceye (Gen 4, 3 Mpix)
+
+usb:v1AABp7750*
+ ID_MODEL_FROM_DATABASE=sceyeS (Gen 5, 5 MPix)
+
 usb:v1AAD*
  ID_VENDOR_FROM_DATABASE=KeeTouch
 
@@ -54194,9 +58025,24 @@ usb:v1AADp0001*
 usb:v1AB1*
  ID_VENDOR_FROM_DATABASE=Rigol Technologies
 
+usb:v1AB1p04B0*
+ ID_MODEL_FROM_DATABASE=DS6000 SERIES
+
+usb:v1AB1p04BE*
+ ID_MODEL_FROM_DATABASE=DS4000 SERIES
+
+usb:v1AB1p04CE*
+ ID_MODEL_FROM_DATABASE=DS1xx4Z/MSO1xxZ series
+
 usb:v1AB1p0588*
  ID_MODEL_FROM_DATABASE=DS1000 SERIES
 
+usb:v1AB2*
+ ID_VENDOR_FROM_DATABASE=Allied Vision
+
+usb:v1AB2p0001*
+ ID_MODEL_FROM_DATABASE=Vision device
+
 usb:v1ACB*
  ID_VENDOR_FROM_DATABASE=Salcomp Plc
 
@@ -54216,7 +58062,13 @@ usb:v1AD4p0002*
  ID_MODEL_FROM_DATABASE=KM290-HRS
 
 usb:v1ADB*
- ID_VENDOR_FROM_DATABASE=SEL C662 Serial Cable
+ ID_VENDOR_FROM_DATABASE=Schweitzer Engineering Laboratories, Inc
+
+usb:v1ADBp0001*
+ ID_MODEL_FROM_DATABASE=C662 Serial Cable
+
+usb:v1ADBp0003*
+ ID_MODEL_FROM_DATABASE=CDC Ethernet Gadget
 
 usb:v1AE4*
  ID_VENDOR_FROM_DATABASE=ic-design Reinhard Gottinger GmbH
@@ -54227,6 +58079,9 @@ usb:v1AE7*
 usb:v1AE7p0381*
  ID_MODEL_FROM_DATABASE=VS-DVB-T 380U (af9015 based)
 
+usb:v1AE7p0525*
+ ID_MODEL_FROM_DATABASE=X-Tensions ISDN TA XC-525 [HFC-S USB]
+
 usb:v1AE7p2001*
  ID_MODEL_FROM_DATABASE=SpeedLink Snappy Mic webcam (SL-6825-SBK)
 
@@ -54245,6 +58100,12 @@ usb:v1AEF*
 usb:v1AF1*
  ID_VENDOR_FROM_DATABASE=Connect One Ltd.
 
+usb:v1AF3*
+ ID_VENDOR_FROM_DATABASE=Kingsis Technology Corporation
+
+usb:v1AF3p0001*
+ ID_MODEL_FROM_DATABASE=ZOWIE Gaming mouse
+
 usb:v1AFE*
  ID_VENDOR_FROM_DATABASE=A. Eberle GmbH & Co. KG
 
@@ -54494,6 +58355,12 @@ usb:v1B0Ep1079*
 usb:v1B0Ep1080*
  ID_MODEL_FROM_DATABASE=WRITECHIP II CCID
 
+usb:v1B12*
+ ID_VENDOR_FROM_DATABASE=Eventide
+
+usb:v1B12p0011*
+ ID_MODEL_FROM_DATABASE=ModFactor
+
 usb:v1B1C*
  ID_VENDOR_FROM_DATABASE=Corsair
 
@@ -54509,6 +58376,21 @@ usb:v1B1Cp0A60*
 usb:v1B1Cp0C04*
  ID_MODEL_FROM_DATABASE=Link Cooling Node
 
+usb:v1B1Cp0C06*
+ ID_MODEL_FROM_DATABASE=RM-Series C-Link Adapter
+
+usb:v1B1Cp0C0A*
+ ID_MODEL_FROM_DATABASE=Hydro Series H115i Liquid CPU Cooler
+
+usb:v1B1Cp0C0B*
+ ID_MODEL_FROM_DATABASE=Lighting Node Pro
+
+usb:v1B1Cp0C0C*
+ ID_MODEL_FROM_DATABASE=Lighting Node Loader
+
+usb:v1B1Cp0C22*
+ ID_MODEL_FROM_DATABASE=iCUE H150i RGB PRO XT Liquid CPU Cooler
+
 usb:v1B1Cp1A01*
  ID_MODEL_FROM_DATABASE=Flash Voyager GT
 
@@ -54524,6 +58406,12 @@ usb:v1B1Cp1A0A*
 usb:v1B1Cp1A0B*
  ID_MODEL_FROM_DATABASE=Flash Voyager LS
 
+usb:v1B1Cp1A0E*
+ ID_MODEL_FROM_DATABASE=Voyager GTX
+
+usb:v1B1Cp1A14*
+ ID_MODEL_FROM_DATABASE=Voyager Vega
+
 usb:v1B1Cp1A15*
  ID_MODEL_FROM_DATABASE=Voyager Slider Flash Drive
 
@@ -54551,24 +58439,78 @@ usb:v1B1Cp1B11*
 usb:v1B1Cp1B13*
  ID_MODEL_FROM_DATABASE=Vengeance K70RGB keyboard
 
+usb:v1B1Cp1B20*
+ ID_MODEL_FROM_DATABASE=STRAFE RGB Gaming Keyboard
+
+usb:v1B1Cp1B2D*
+ ID_MODEL_FROM_DATABASE=K95 RGB Platinum Keyboard [RGP0056]
+
+usb:v1B1Cp1B2E*
+ ID_MODEL_FROM_DATABASE=Corsair Corsair Gaming M65 Pro RGB Mouse
+
+usb:v1B1Cp1B2F*
+ ID_MODEL_FROM_DATABASE=Sabre RGB [CH-9303011-XX]
+
+usb:v1B1Cp1B3D*
+ ID_MODEL_FROM_DATABASE=Corsair Corsair Gaming K55 RGB Keyboard
+
+usb:v1B1Cp1B5E*
+ ID_MODEL_FROM_DATABASE=Harpoon Wireless Mouse
+
+usb:v1B1Cp1B65*
+ ID_MODEL_FROM_DATABASE=Harpoon Wireless Dongle
+
 usb:v1B1Cp1C00*
  ID_MODEL_FROM_DATABASE=Controller for Corsair Link
 
+usb:v1B1Cp1C02*
+ ID_MODEL_FROM_DATABASE=AX1500i Power Supply
+
+usb:v1B1Cp1C05*
+ ID_MODEL_FROM_DATABASE=HX750i Power Supply
+
+usb:v1B1Cp1C07*
+ ID_MODEL_FROM_DATABASE=HX1000i Power Supply
+
+usb:v1B1Cp1C08*
+ ID_MODEL_FROM_DATABASE=HX1200i Power Supply
+
+usb:v1B1Cp1C0B*
+ ID_MODEL_FROM_DATABASE=RM750i Power Supply
+
 usb:v1B1Cp1C0C*
  ID_MODEL_FROM_DATABASE=RM850i Power Supply
 
+usb:v1B1Cp1C1A*
+ ID_MODEL_FROM_DATABASE=Corsair CORSAIR Lighting Node CORE
+
+usb:v1B1E*
+ ID_VENDOR_FROM_DATABASE=General Imaging / General Electric
+
+usb:v1B1Ep1003*
+ ID_MODEL_FROM_DATABASE=A1250
+
 usb:v1B1F*
  ID_VENDOR_FROM_DATABASE=eQ-3 Entwicklung GmbH
 
 usb:v1B1FpC00F*
  ID_MODEL_FROM_DATABASE=HM-CFG-USB/HM-CFG-USB-2 [HomeMatic Configuration adapter]
 
+usb:v1B1FpC020*
+ ID_MODEL_FROM_DATABASE=HmIP-RFUSB
+
 usb:v1B20*
  ID_VENDOR_FROM_DATABASE=MStar Semiconductor, Inc.
 
 usb:v1B22*
  ID_VENDOR_FROM_DATABASE=WiLinx Corp.
 
+usb:v1B24*
+ ID_VENDOR_FROM_DATABASE=Telegent Systems, Inc.
+
+usb:v1B24p4001*
+ ID_MODEL_FROM_DATABASE=TLG2300 Hybrid TV Device
+
 usb:v1B26*
  ID_VENDOR_FROM_DATABASE=Cellex Power Products, Inc.
 
@@ -54671,6 +58613,9 @@ usb:v1B3Fp0C52*
 usb:v1B3Fp2002*
  ID_MODEL_FROM_DATABASE=808 Camera #9 (web-cam mode)
 
+usb:v1B3Fp2003*
+ ID_MODEL_FROM_DATABASE=GPD6000 [Digital MP3 Player]
+
 usb:v1B47*
  ID_VENDOR_FROM_DATABASE=Energizer Holdings, Inc.
 
@@ -54761,6 +58706,9 @@ usb:v1B65*
 usb:v1B71*
  ID_VENDOR_FROM_DATABASE=Fushicai
 
+usb:v1B71p0050*
+ ID_MODEL_FROM_DATABASE=Encore ENUTV-4 Analog TV Tuner
+
 usb:v1B71p3002*
  ID_MODEL_FROM_DATABASE=USBTV007 Video Grabber [EasyCAP]
 
@@ -54818,6 +58766,12 @@ usb:v1B80pD700*
 usb:v1B80pE297*
  ID_MODEL_FROM_DATABASE=Conceptronic DVB-T CTVDIGRCU V3.0
 
+usb:v1B80pE302*
+ ID_MODEL_FROM_DATABASE=CVBS / S-Video Capture Device [Pinnacle Dazzle / UB315-E]
+
+usb:v1B80pE34C*
+ ID_MODEL_FROM_DATABASE=UB435-Q ATSC TV Stick
+
 usb:v1B80pE383*
  ID_MODEL_FROM_DATABASE=DVB-T UB383-T [af9015]
 
@@ -54884,6 +58838,9 @@ usb:v1BA4*
 usb:v1BA4p0001*
  ID_MODEL_FROM_DATABASE=InSight USB Link
 
+usb:v1BA4p0002*
+ ID_MODEL_FROM_DATABASE=EM358 Virtual COM Port
+
 usb:v1BA6*
  ID_VENDOR_FROM_DATABASE=Abilis Systems
 
@@ -54894,10 +58851,121 @@ usb:v1BAD*
  ID_VENDOR_FROM_DATABASE=Harmonix Music
 
 usb:v1BADp0002*
- ID_MODEL_FROM_DATABASE=Guitar for Xbox 360
+ ID_MODEL_FROM_DATABASE=Rock Band Guitar for Xbox 360
 
 usb:v1BADp0003*
- ID_MODEL_FROM_DATABASE=Drum Kit for Xbox 360
+ ID_MODEL_FROM_DATABASE=Rock Band Drum Kit for Xbox 360
+
+usb:v1BADp0130*
+ ID_MODEL_FROM_DATABASE=Ion Drum Rocker for Xbox 360
+
+usb:v1BADp028E*
+ ID_MODEL_FROM_DATABASE=Controller
+
+usb:v1BADp3330*
+ ID_MODEL_FROM_DATABASE=Rock Band 3 Keyboard wii interface
+
+usb:v1BADpF016*
+ ID_MODEL_FROM_DATABASE=Controller
+
+usb:v1BADpF018*
+ ID_MODEL_FROM_DATABASE=Street Fighter IV SE FightStick for Xbox 360
+
+usb:v1BADpF019*
+ ID_MODEL_FROM_DATABASE=BrawlStick for Xbox 360
+
+usb:v1BADpF021*
+ ID_MODEL_FROM_DATABASE=Ghost Recon Future Soldier Gamepad for Xbox 360
+
+usb:v1BADpF023*
+ ID_MODEL_FROM_DATABASE=MLG Pro Circuit Controller for Xbox 360
+
+usb:v1BADpF025*
+ ID_MODEL_FROM_DATABASE=Call of Duty Controller for Xbox 360
+
+usb:v1BADpF027*
+ ID_MODEL_FROM_DATABASE=FPS Pro Controller for Xbox 360
+
+usb:v1BADpF028*
+ ID_MODEL_FROM_DATABASE=Street Fighter IV FightPad for Xbox 360
+
+usb:v1BADpF02E*
+ ID_MODEL_FROM_DATABASE=FightPad
+
+usb:v1BADpF030*
+ ID_MODEL_FROM_DATABASE=MC2 MicroCON Racing Wheel for Xbox 360
+
+usb:v1BADpF036*
+ ID_MODEL_FROM_DATABASE=MicroCON Gamepad Pro for Xbox 360
+
+usb:v1BADpF038*
+ ID_MODEL_FROM_DATABASE=Street Fighter IV FightStick TE for Xbox 360
+
+usb:v1BADpF039*
+ ID_MODEL_FROM_DATABASE=Marvel VS Capcom 2 Tournament Stick for Xbox 360
+
+usb:v1BADpF03A*
+ ID_MODEL_FROM_DATABASE=Street Fighter X Tekken FightStick Pro for Xbox 360
+
+usb:v1BADpF03D*
+ ID_MODEL_FROM_DATABASE=Street Fighter IV Arcade Stick TE for Xbox 360
+
+usb:v1BADpF03E*
+ ID_MODEL_FROM_DATABASE=MLG Arcade FightStick TE for Xbox 360
+
+usb:v1BADpF03F*
+ ID_MODEL_FROM_DATABASE=Soulcalibur FightStick for Xbox 360
+
+usb:v1BADpF042*
+ ID_MODEL_FROM_DATABASE=Arcade FightStick TE S+ for Xbox 360
+
+usb:v1BADpF080*
+ ID_MODEL_FROM_DATABASE=FightStick TE2 for Xbox 360
+
+usb:v1BADpF501*
+ ID_MODEL_FROM_DATABASE=Horipad EX2 Turbo for Xbox 360
+
+usb:v1BADpF502*
+ ID_MODEL_FROM_DATABASE=Real Arcade Pro.VX SA for Xbox 360
+
+usb:v1BADpF503*
+ ID_MODEL_FROM_DATABASE=Fighting Stick VX for Xbox 360
+
+usb:v1BADpF504*
+ ID_MODEL_FROM_DATABASE=Real Arcade Pro.EX
+
+usb:v1BADpF505*
+ ID_MODEL_FROM_DATABASE=Fighting Stick EX2B for Xbox 360
+
+usb:v1BADpF506*
+ ID_MODEL_FROM_DATABASE=Real Arcade Pro.EX Premium VLX for Xbox 360
+
+usb:v1BADpF900*
+ ID_MODEL_FROM_DATABASE=Controller
+
+usb:v1BADpF901*
+ ID_MODEL_FROM_DATABASE=GameStop Controller
+
+usb:v1BADpF903*
+ ID_MODEL_FROM_DATABASE=Tron Controller for Xbox 360
+
+usb:v1BADpF904*
+ ID_MODEL_FROM_DATABASE=PDP Versus Fighting Pad for Xbox 360
+
+usb:v1BADpF906*
+ ID_MODEL_FROM_DATABASE=Mortal Kombat FightStick for Xbox 360
+
+usb:v1BADpF907*
+ ID_MODEL_FROM_DATABASE=Afterglow Gamepad
+
+usb:v1BADpFA01*
+ ID_MODEL_FROM_DATABASE=Gamepad
+
+usb:v1BADpFD00*
+ ID_MODEL_FROM_DATABASE=Razer Onza Tournament Edition
+
+usb:v1BADpFD01*
+ ID_MODEL_FROM_DATABASE=Razer Onza Classic Edition
 
 usb:v1BAE*
  ID_VENDOR_FROM_DATABASE=Vuzix Corporation
@@ -54908,12 +58976,69 @@ usb:v1BAEp0002*
 usb:v1BBB*
  ID_VENDOR_FROM_DATABASE=T & A Mobile Phones
 
+usb:v1BBBp0003*
+ ID_MODEL_FROM_DATABASE=Alcatel one touch 4030D modem connection
+
+usb:v1BBBp0017*
+ ID_MODEL_FROM_DATABASE=HSPA Data Card
+
+usb:v1BBBp007A*
+ ID_MODEL_FROM_DATABASE=Alcatel OneTouch (firmware upgrade mode)
+
 usb:v1BBBp011E*
  ID_MODEL_FROM_DATABASE=Alcatel One Touch L100V / Telekom Speedstick LTE II
 
+usb:v1BBBp0169*
+ ID_MODEL_FROM_DATABASE=Alcatel ONE TOUCH Fierce
+
+usb:v1BBBp0195*
+ ID_MODEL_FROM_DATABASE=Alcatel OneTouch L850V / Telekom Speedstick LTE
+
+usb:v1BBBpA00E*
+ ID_MODEL_FROM_DATABASE=Vodafone Smart Tab 4G
+
+usb:v1BBBpF000*
+ ID_MODEL_FROM_DATABASE=Alcatel OneTouch (mass storage mode)
+
 usb:v1BBBpF017*
  ID_MODEL_FROM_DATABASE=Alcatel One Touch L100V / Telekom Speedstick LTE II
 
+usb:v1BBD*
+ ID_VENDOR_FROM_DATABASE=Videology Imaging Solutions, Inc.
+
+usb:v1BBDp0060*
+ ID_MODEL_FROM_DATABASE=1.3MP Mono Camera
+
+usb:v1BBDp0066*
+ ID_MODEL_FROM_DATABASE=1.3MP Mono Camera
+
+usb:v1BBDp0067*
+ ID_MODEL_FROM_DATABASE=1.3MP Mono Camera
+
+usb:v1BC0*
+ ID_VENDOR_FROM_DATABASE=Beijing Senseshield Technology Co.,Ltd.
+
+usb:v1BC0p0013*
+ ID_MODEL_FROM_DATABASE=Elitee-e
+
+usb:v1BC0p0014*
+ ID_MODEL_FROM_DATABASE=Elite4
+
+usb:v1BC0p0020*
+ ID_MODEL_FROM_DATABASE=iToken
+
+usb:v1BC0p0021*
+ ID_MODEL_FROM_DATABASE=Mikey
+
+usb:v1BC0p0051*
+ ID_MODEL_FROM_DATABASE=Elite5
+
+usb:v1BC0p0055*
+ ID_MODEL_FROM_DATABASE=Elite5 v3.x
+
+usb:v1BC0p485D*
+ ID_MODEL_FROM_DATABASE=EliteIV
+
 usb:v1BC4*
  ID_VENDOR_FROM_DATABASE=Ford Motor Co.
 
@@ -54929,9 +59054,15 @@ usb:v1BC7p0020*
 usb:v1BC7p0021*
  ID_MODEL_FROM_DATABASE=HE910
 
+usb:v1BC7p0022*
+ ID_MODEL_FROM_DATABASE=GE910-QUAD
+
 usb:v1BC7p0023*
  ID_MODEL_FROM_DATABASE=HE910-D ECM
 
+usb:v1BC7p0032*
+ ID_MODEL_FROM_DATABASE=LE910-EU V2
+
 usb:v1BC7p1003*
  ID_MODEL_FROM_DATABASE=UC864-E
 
@@ -54950,8 +59081,20 @@ usb:v1BC7p1010*
 usb:v1BC7p1011*
  ID_MODEL_FROM_DATABASE=CE910-DUAL
 
+usb:v1BC7p1012*
+ ID_MODEL_FROM_DATABASE=UE910 V2
+
+usb:v1BC7p1101*
+ ID_MODEL_FROM_DATABASE=ME910C1
+
+usb:v1BC7p110A*
+ ID_MODEL_FROM_DATABASE=ME310
+
 usb:v1BC7p1200*
- ID_MODEL_FROM_DATABASE=LE920
+ ID_MODEL_FROM_DATABASE=LE920 (old firmware)
+
+usb:v1BC7p1201*
+ ID_MODEL_FROM_DATABASE=LE910 / LE920
 
 usb:v1BCE*
  ID_VENDOR_FROM_DATABASE=Contac Cable Industrial Limited
@@ -54974,18 +59117,30 @@ usb:v1BCFp05C5*
 usb:v1BCFp05CF*
  ID_MODEL_FROM_DATABASE=Micro keyboard & mouse receiver
 
+usb:v1BCFp08A0*
+ ID_MODEL_FROM_DATABASE=Gaming mouse [Philips SPK9304]
+
 usb:v1BCFp0C31*
  ID_MODEL_FROM_DATABASE=SPIF30x Serial-ATA bridge
 
+usb:v1BCFp2281*
+ ID_MODEL_FROM_DATABASE=SPCA2281 Web Camera
+
 usb:v1BCFp2880*
  ID_MODEL_FROM_DATABASE=Dell HD Webcam
 
+usb:v1BCFp2883*
+ ID_MODEL_FROM_DATABASE=Asus Webcam
+
 usb:v1BCFp2885*
  ID_MODEL_FROM_DATABASE=ASUS Webcam
 
 usb:v1BCFp2888*
  ID_MODEL_FROM_DATABASE=HP Universal Camera
 
+usb:v1BCFp2895*
+ ID_MODEL_FROM_DATABASE=Dell Integrated Webcam
+
 usb:v1BCFp28A2*
  ID_MODEL_FROM_DATABASE=Dell Integrated Webcam
 
@@ -55004,12 +59159,30 @@ usb:v1BCFp2985*
 usb:v1BCFp2B83*
  ID_MODEL_FROM_DATABASE=Laptop Integrated Webcam FHD
 
+usb:v1BCFp2B91*
+ ID_MODEL_FROM_DATABASE=Dell E5570 integrated webcam
+
+usb:v1BCFp2B97*
+ ID_MODEL_FROM_DATABASE=Laptop Integrated Webcam FHD
+
+usb:v1BCFp2C6E*
+ ID_MODEL_FROM_DATABASE=Laptop Integrated WebCam HD
+
 usb:v1BD0*
  ID_VENDOR_FROM_DATABASE=Hangzhou Riyue Electronic Co., Ltd.
 
 usb:v1BD5*
  ID_VENDOR_FROM_DATABASE=BG Systems, Inc.
 
+usb:v1BDA*
+ ID_VENDOR_FROM_DATABASE=University Of Southampton
+
+usb:v1BDAp0010*
+ ID_MODEL_FROM_DATABASE=Power Board v4 Rev B
+
+usb:v1BDAp0011*
+ ID_MODEL_FROM_DATABASE=Student Robotics SBv4B
+
 usb:v1BDE*
  ID_VENDOR_FROM_DATABASE=P-TWO INDUSTRIES, INC.
 
@@ -55058,6 +59231,18 @@ usb:v1C02*
 usb:v1C04*
  ID_VENDOR_FROM_DATABASE=QNAP System Inc.
 
+usb:v1C04p2074*
+ ID_MODEL_FROM_DATABASE=ASM1074 High-Speed hub
+
+usb:v1C04p3074*
+ ID_MODEL_FROM_DATABASE=ASM1074 SuperSpeed hub
+
+usb:v1C05*
+ ID_VENDOR_FROM_DATABASE=Shenxhen Stager Electric
+
+usb:v1C05pEA75*
+ ID_MODEL_FROM_DATABASE=G540 Programmer
+
 usb:v1C0C*
  ID_VENDOR_FROM_DATABASE=Ionics EMS, Inc.
 
@@ -55070,12 +59255,21 @@ usb:v1C0D*
 usb:v1C10*
  ID_VENDOR_FROM_DATABASE=Lanterra Industrial Co., Ltd.
 
+usb:v1C11*
+ ID_VENDOR_FROM_DATABASE=Input Club Inc.
+
+usb:v1C11pB04D*
+ ID_MODEL_FROM_DATABASE=ErgoDox Infinity
+
 usb:v1C13*
  ID_VENDOR_FROM_DATABASE=ALECTRONIC LIMITED
 
 usb:v1C1A*
  ID_VENDOR_FROM_DATABASE=Datel Electronics Ltd.
 
+usb:v1C1Ap0100*
+ ID_MODEL_FROM_DATABASE=Action Replay DS "3DS/DSi/DS/Lite Compatible"
+
 usb:v1C1B*
  ID_VENDOR_FROM_DATABASE=Volkswagen of America, Inc.
 
@@ -55097,6 +59291,39 @@ usb:v1C26*
 usb:v1C27*
  ID_VENDOR_FROM_DATABASE=HuiYang D & S Cable Co., Ltd.
 
+usb:v1C28*
+ ID_VENDOR_FROM_DATABASE=PMD Technologies
+
+usb:v1C28pC003*
+ ID_MODEL_FROM_DATABASE=CamCube
+
+usb:v1C28pC004*
+ ID_MODEL_FROM_DATABASE=CamBoard
+
+usb:v1C28pC005*
+ ID_MODEL_FROM_DATABASE=ConceptCam
+
+usb:v1C28pC006*
+ ID_MODEL_FROM_DATABASE=CamBoard 22
+
+usb:v1C28pC007*
+ ID_MODEL_FROM_DATABASE=CamBoard nano
+
+usb:v1C28pC008*
+ ID_MODEL_FROM_DATABASE=CamBoard mod
+
+usb:v1C28pC009*
+ ID_MODEL_FROM_DATABASE=CamBoard plus
+
+usb:v1C28pC00A*
+ ID_MODEL_FROM_DATABASE=DigiCam
+
+usb:v1C28pC00D*
+ ID_MODEL_FROM_DATABASE=CamBoard pico LDD
+
+usb:v1C28pC00F*
+ ID_MODEL_FROM_DATABASE=CamBoard pico
+
 usb:v1C29*
  ID_VENDOR_FROM_DATABASE=Elster GmbH
 
@@ -55118,6 +59345,9 @@ usb:v1C34p7241*
 usb:v1C37*
  ID_VENDOR_FROM_DATABASE=Authorizer Technologies, Inc.
 
+usb:v1C37p6190*
+ ID_MODEL_FROM_DATABASE=U2F Fido-compliant cryptotoken
+
 usb:v1C3D*
  ID_VENDOR_FROM_DATABASE=NONIN MEDICAL INC.
 
@@ -55139,9 +59369,18 @@ usb:v1C40p0535*
 usb:v1C40p0536*
  ID_MODEL_FROM_DATABASE=Swiss ColorPAL
 
+usb:v1C40p0537*
+ ID_MODEL_FROM_DATABASE=MIST Board
+
 usb:v1C49*
  ID_VENDOR_FROM_DATABASE=Cherng Weei Technology Corp.
 
+usb:v1C4B*
+ ID_VENDOR_FROM_DATABASE=Geratherm Medical AG
+
+usb:v1C4Bp026F*
+ ID_MODEL_FROM_DATABASE=Spirostik
+
 usb:v1C4F*
  ID_VENDOR_FROM_DATABASE=SiGma Micro
 
@@ -55157,27 +59396,63 @@ usb:v1C4Fp000E*
 usb:v1C4Fp0026*
  ID_MODEL_FROM_DATABASE=Keyboard
 
+usb:v1C4Fp0032*
+ ID_MODEL_FROM_DATABASE=Optical Mouse with Scroll Wheel
+
+usb:v1C4Fp0034*
+ ID_MODEL_FROM_DATABASE=XM102K Optical Wheel Mouse
+
+usb:v1C4Fp0063*
+ ID_MODEL_FROM_DATABASE=Touchpad (integrated in detachable keyboard of Chuwi SurBook)
+
+usb:v1C4Fp0065*
+ ID_MODEL_FROM_DATABASE=Optical Wheel Mouse [Rapoo N1130]
+
 usb:v1C4Fp3000*
  ID_MODEL_FROM_DATABASE=Micro USB Web Camera
 
 usb:v1C4Fp3002*
  ID_MODEL_FROM_DATABASE=WebCam SiGma Micro
 
+usb:v1C57*
+ ID_VENDOR_FROM_DATABASE=Zalman Tech Co., Ltd.
+
+usb:v1C57p1E45*
+ ID_MODEL_FROM_DATABASE=FPSGUN FG1000 Mouse
+
 usb:v1C6B*
  ID_VENDOR_FROM_DATABASE=Philips & Lite-ON Digital Solutions Corporation
 
+usb:v1C6BpA220*
+ ID_MODEL_FROM_DATABASE=DVD Writer Slimtype eSAU108
+
 usb:v1C6BpA222*
  ID_MODEL_FROM_DATABASE=DVD Writer Slimtype eTAU108
 
+usb:v1C6BpA223*
+ ID_MODEL_FROM_DATABASE=DVD Writer Slimtype eUAU108
+
 usb:v1C6C*
  ID_VENDOR_FROM_DATABASE=Skydigital Inc.
 
+usb:v1C71*
+ ID_VENDOR_FROM_DATABASE=Humanware Inc
+
+usb:v1C71pC004*
+ ID_MODEL_FROM_DATABASE=Braille Note Apex (braille terminal mode)
+
 usb:v1C73*
  ID_VENDOR_FROM_DATABASE=AMT
 
 usb:v1C73p861F*
  ID_MODEL_FROM_DATABASE=Anysee E30 USB 2.0 DVB-T Receiver
 
+usb:v1C75*
+ ID_VENDOR_FROM_DATABASE=Arturia
+
+usb:v1C75p0288*
+ ID_MODEL_FROM_DATABASE=KeyStep
+
 usb:v1C77*
  ID_VENDOR_FROM_DATABASE=Kaetat Industrial Co., Ltd.
 
@@ -55190,18 +59465,39 @@ usb:v1C79*
 usb:v1C7A*
  ID_VENDOR_FROM_DATABASE=LighTuning Technology Inc.
 
+usb:v1C7Ap0577*
+ ID_MODEL_FROM_DATABASE=Fingerprint Sensor
+
+usb:v1C7Ap0603*
+ ID_MODEL_FROM_DATABASE=ES603 Swipe Fingerprint Sensor
+
 usb:v1C7Ap0801*
  ID_MODEL_FROM_DATABASE=Fingerprint Reader
 
 usb:v1C7B*
  ID_VENDOR_FROM_DATABASE=LUXSHARE PRECISION INDUSTRY (SHENZHEN) CO., LTD.
 
+usb:v1C82*
+ ID_VENDOR_FROM_DATABASE=Atracsys
+
+usb:v1C82p0200*
+ ID_MODEL_FROM_DATABASE=spryTrac
+
 usb:v1C83*
  ID_VENDOR_FROM_DATABASE=Schomaecker GmbH
 
 usb:v1C83p0001*
  ID_MODEL_FROM_DATABASE=RS150 V2
 
+usb:v1C83p0002*
+ ID_MODEL_FROM_DATABASE=RFID card reader
+
+usb:v1C83p0003*
+ ID_MODEL_FROM_DATABASE=Communicator
+
+usb:v1C83p0005*
+ ID_MODEL_FROM_DATABASE=Mobile RFID Reader
+
 usb:v1C87*
  ID_VENDOR_FROM_DATABASE=2N TELEKOMUNIKACE a.s.
 
@@ -55262,6 +59558,9 @@ usb:v1CB6p6681*
 usb:v1CBE*
  ID_VENDOR_FROM_DATABASE=Luminary Micro Inc.
 
+usb:v1CBEp0002*
+ ID_MODEL_FROM_DATABASE=CDC serial port [TivaWare]
+
 usb:v1CBEp00FD*
  ID_MODEL_FROM_DATABASE=In-Circuit Debug Interface
 
@@ -55271,6 +59570,9 @@ usb:v1CBEp00FF*
 usb:v1CBEp0166*
  ID_MODEL_FROM_DATABASE=CANAL USB2CAN
 
+usb:v1CBEp0240*
+ ID_MODEL_FROM_DATABASE=McGill Robotics TM4C Microcontroller
+
 usb:v1CBF*
  ID_VENDOR_FROM_DATABASE=FORTAT SKYMARK INDUSTRIAL COMPANY
 
@@ -55346,6 +59648,9 @@ usb:v1CF1p0025*
 usb:v1CF1p0027*
  ID_MODEL_FROM_DATABASE=deRFusb13E06
 
+usb:v1CF1p0030*
+ ID_MODEL_FROM_DATABASE=ZigBee gateway [ConBee II]
+
 usb:v1CFC*
  ID_VENDOR_FROM_DATABASE=ANDES TECHNOLOGY CORPORATION
 
@@ -55376,6 +59681,12 @@ usb:v1D0A*
 usb:v1D0B*
  ID_VENDOR_FROM_DATABASE=HAN HUA CABLE & WIRE TECHNOLOGY (J.X.) CO., LTD.
 
+usb:v1D0D*
+ ID_VENDOR_FROM_DATABASE=TDKMedia
+
+usb:v1D0Dp0214*
+ ID_MODEL_FROM_DATABASE=Trans-It Drive
+
 usb:v1D0F*
  ID_VENDOR_FROM_DATABASE=Sonix Technology Co., Ltd.
 
@@ -55400,9 +59711,15 @@ usb:v1D19p1102*
 usb:v1D19p1103*
  ID_MODEL_FROM_DATABASE=DK 5217 DVB-T Dongle
 
+usb:v1D19p1104*
+ ID_MODEL_FROM_DATABASE=MSI DigiVox Micro HD
+
 usb:v1D19p6105*
  ID_MODEL_FROM_DATABASE=Video grabber
 
+usb:v1D19p610A*
+ ID_MODEL_FROM_DATABASE=Video grabber
+
 usb:v1D19p8202*
  ID_MODEL_FROM_DATABASE=DK DVBC/T DONGLE
 
@@ -55415,26 +59732,38 @@ usb:v1D20*
 usb:v1D27*
  ID_VENDOR_FROM_DATABASE=ASUS
 
+usb:v1D27p0601*
+ ID_MODEL_FROM_DATABASE=Xtion
+
 usb:v1D34*
  ID_VENDOR_FROM_DATABASE=Dream Cheeky
 
 usb:v1D34p0001*
- ID_MODEL_FROM_DATABASE=Dream Cheeky Fidget
+ ID_MODEL_FROM_DATABASE=Fidget
+
+usb:v1D34p0002*
+ ID_MODEL_FROM_DATABASE=Fidget (Basketball)
+
+usb:v1D34p0003*
+ ID_MODEL_FROM_DATABASE=Fidget (Golf Ball)
 
 usb:v1D34p0004*
- ID_MODEL_FROM_DATABASE=Dream Cheeky Webmail Notifier
+ ID_MODEL_FROM_DATABASE=Webmail Notifier
 
 usb:v1D34p0008*
- ID_MODEL_FROM_DATABASE=Dream Cheeky button
+ ID_MODEL_FROM_DATABASE=button
 
 usb:v1D34p000A*
- ID_MODEL_FROM_DATABASE=Dream Cheeky Mailbox Friends Alert
+ ID_MODEL_FROM_DATABASE=Mailbox Friends Alert
 
 usb:v1D34p000D*
- ID_MODEL_FROM_DATABASE=Dream Cheeky Big Red Button
+ ID_MODEL_FROM_DATABASE=Big Red Button
 
 usb:v1D34p0013*
- ID_MODEL_FROM_DATABASE=Dream Cheeky LED Message Board
+ ID_MODEL_FROM_DATABASE=LED Message Board
+
+usb:v1D34p0020*
+ ID_MODEL_FROM_DATABASE=Stress Ball
 
 usb:v1D45*
  ID_VENDOR_FROM_DATABASE=Touch
@@ -55442,6 +59771,12 @@ usb:v1D45*
 usb:v1D45p1D45*
  ID_MODEL_FROM_DATABASE=Foxlink Optical touch sensor
 
+usb:v1D45p459D*
+ ID_MODEL_FROM_DATABASE=BenQ F5
+
+usb:v1D45p465C*
+ ID_MODEL_FROM_DATABASE=Harrier Mini by EE
+
 usb:v1D4D*
  ID_VENDOR_FROM_DATABASE=PEGATRON CORPORATION
 
@@ -55502,6 +59837,171 @@ usb:v1D50p5124*
 usb:v1D50p5300*
  ID_MODEL_FROM_DATABASE=Rockbox
 
+usb:v1D50p530E*
+ ID_MODEL_FROM_DATABASE=iriver H10 20GB (Rockbox)
+
+usb:v1D50p530F*
+ ID_MODEL_FROM_DATABASE=iriver H10 5/6GB (Rockbox)
+
+usb:v1D50p5314*
+ ID_MODEL_FROM_DATABASE=Apple iPod Color/Photo (Rockbox)
+
+usb:v1D50p5315*
+ ID_MODEL_FROM_DATABASE=Apple iPod Nano 1g (Rockbox)
+
+usb:v1D50p5316*
+ ID_MODEL_FROM_DATABASE=Apple iPod Video (Rockbox)
+
+usb:v1D50p5318*
+ ID_MODEL_FROM_DATABASE=Apple iPod 4g Grayscale (Rockbox)
+
+usb:v1D50p5319*
+ ID_MODEL_FROM_DATABASE=Apple iPod Mini 1g (Rockbox)
+
+usb:v1D50p531A*
+ ID_MODEL_FROM_DATABASE=Apple iPod Mini 2g (Rockbox)
+
+usb:v1D50p531C*
+ ID_MODEL_FROM_DATABASE=Apple iPod Nano 2g (Rockbox)
+
+usb:v1D50p531D*
+ ID_MODEL_FROM_DATABASE=Apple iPod Classic/6G (Rockbox)
+
+usb:v1D50p5321*
+ ID_MODEL_FROM_DATABASE=Cowon D2 (Rockbox)
+
+usb:v1D50p5329*
+ ID_MODEL_FROM_DATABASE=Toshiba Gigabeat S (Rockbox)
+
+usb:v1D50p5332*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa e200 series (Rockbox)
+
+usb:v1D50p5334*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa c200 series (Rockbox)
+
+usb:v1D50p5337*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa Clip (Rockbox)
+
+usb:v1D50p5338*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa e200v2 series (Rockbox)
+
+usb:v1D50p5339*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa m200 v4 series (Rockbox)
+
+usb:v1D50p533A*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa Fuze (Rockbox)
+
+usb:v1D50p533B*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa c200v2 series (Rockbox)
+
+usb:v1D50p533C*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa Clipv2 (Rockbox)
+
+usb:v1D50p533E*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa Clip+ (Rockbox)
+
+usb:v1D50p533F*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa Fuze v2 (Rockbox)
+
+usb:v1D50p5340*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa Fuze+ (Rockbox)
+
+usb:v1D50p5341*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa Zip (Rockbox)
+
+usb:v1D50p5342*
+ ID_MODEL_FROM_DATABASE=Sandisk Sansa Connect (Rockbox)
+
+usb:v1D50p5346*
+ ID_MODEL_FROM_DATABASE=Olympus M:Robe 500i (Rockbox)
+
+usb:v1D50p5347*
+ ID_MODEL_FROM_DATABASE=Olympus m:robe MR-100 (Rockbox)
+
+usb:v1D50p5359*
+ ID_MODEL_FROM_DATABASE=Creative Zen X-Fi Style (Rockbox)
+
+usb:v1D50p535D*
+ ID_MODEL_FROM_DATABASE=Creative Zen X-Fi2 (Rockbox)
+
+usb:v1D50p535E*
+ ID_MODEL_FROM_DATABASE=Creative Zen X-Fi3 (Rockbox)
+
+usb:v1D50p5360*
+ ID_MODEL_FROM_DATABASE=Creative Zen X-Fi (Rockbox)
+
+usb:v1D50p5361*
+ ID_MODEL_FROM_DATABASE=Creative ZEN Mozaic (Rockbox)
+
+usb:v1D50p5362*
+ ID_MODEL_FROM_DATABASE=Creative Zen (Rockbox)
+
+usb:v1D50p5364*
+ ID_MODEL_FROM_DATABASE=Philips GoGear SA9200 (Rockbox)
+
+usb:v1D50p5365*
+ ID_MODEL_FROM_DATABASE=Philips GoGear HDD16x0 (Rockbox)
+
+usb:v1D50p5366*
+ ID_MODEL_FROM_DATABASE=Philips GoGear HDD63x0 (Rockbox)
+
+usb:v1D50p5378*
+ ID_MODEL_FROM_DATABASE=Onda VX747 (Rockbox)
+
+usb:v1D50p5379*
+ ID_MODEL_FROM_DATABASE=Onda VX767 (Rockbox)
+
+usb:v1D50p537B*
+ ID_MODEL_FROM_DATABASE=Onda VX777 (Rockbox)
+
+usb:v1D50p538C*
+ ID_MODEL_FROM_DATABASE=Samsung YH-820 (Rockbox)
+
+usb:v1D50p538D*
+ ID_MODEL_FROM_DATABASE=Samsung YH-920 (Rockbox)
+
+usb:v1D50p538E*
+ ID_MODEL_FROM_DATABASE=Samsung YH-925 (Rockbox)
+
+usb:v1D50p53A0*
+ ID_MODEL_FROM_DATABASE=Packard Bell Vibe 500 (Rockbox)
+
+usb:v1D50p53B4*
+ ID_MODEL_FROM_DATABASE=Rockchip 27xx generic (Rockbox)
+
+usb:v1D50p53BE*
+ ID_MODEL_FROM_DATABASE=HiFiMAN HM-60x (Rockbox)
+
+usb:v1D50p53BF*
+ ID_MODEL_FROM_DATABASE=HiFiMAN HM-801 (Rockbox)
+
+usb:v1D50p53D2*
+ ID_MODEL_FROM_DATABASE=HiFi E.T. MA9 (Rockbox)
+
+usb:v1D50p53D3*
+ ID_MODEL_FROM_DATABASE=HiFi E.T. MA9C (Rockbox)
+
+usb:v1D50p53D4*
+ ID_MODEL_FROM_DATABASE=HiFi E.T. MA8 (Rockbox)
+
+usb:v1D50p53D5*
+ ID_MODEL_FROM_DATABASE=HiFi E.T. MA8C (Rockbox)
+
+usb:v1D50p53DC*
+ ID_MODEL_FROM_DATABASE=Sony NWZ-E370/E380 series (Rockbox)
+
+usb:v1D50p53DD*
+ ID_MODEL_FROM_DATABASE=Sony NWZ-E360 series (Rockbox)
+
+usb:v1D50p53E6*
+ ID_MODEL_FROM_DATABASE=IHIFI 760 (Rockbox)
+
+usb:v1D50p53E7*
+ ID_MODEL_FROM_DATABASE=IHIFI 960 (Rockbox)
+
+usb:v1D50p53FF*
+ ID_MODEL_FROM_DATABASE=Generic Rockbox device
+
 usb:v1D50p6000*
  ID_MODEL_FROM_DATABASE=Ubertooth Zero
 
@@ -55589,6 +60089,9 @@ usb:v1D50p601B*
 usb:v1D50p601C*
  ID_MODEL_FROM_DATABASE=EPOSMote II
 
+usb:v1D50p601D*
+ ID_MODEL_FROM_DATABASE=UDS18B20 temperature sensor
+
 usb:v1D50p601E*
  ID_MODEL_FROM_DATABASE=5x5 STM32 prototyping board
 
@@ -55613,12 +60116,18 @@ usb:v1D50p6024*
 usb:v1D50p6025*
  ID_MODEL_FROM_DATABASE=Keyglove (HID)
 
+usb:v1D50p6026*
+ ID_MODEL_FROM_DATABASE=Keyglove (Serial)
+
 usb:v1D50p6027*
  ID_MODEL_FROM_DATABASE=Key64 Keyboard
 
 usb:v1D50p6028*
  ID_MODEL_FROM_DATABASE=Teensy 2.0 Development Board [ErgoDox Keyboard]
 
+usb:v1D50p6029*
+ ID_MODEL_FROM_DATABASE=Marlin 2.0 (Serial)
+
 usb:v1D50p602A*
  ID_MODEL_FROM_DATABASE=Marlin 2.0 (Mass Storage)
 
@@ -55643,6 +60152,9 @@ usb:v1D50p6030*
 usb:v1D50p6031*
  ID_MODEL_FROM_DATABASE=Handmade GSM GPS tracker
 
+usb:v1D50p6032*
+ ID_MODEL_FROM_DATABASE=ncrmnt.org uISP
+
 usb:v1D50p6033*
  ID_MODEL_FROM_DATABASE=frobiac / adnw keyboard
 
@@ -55745,9 +60257,24 @@ usb:v1D50p6053*
 usb:v1D50p6054*
  ID_MODEL_FROM_DATABASE=Satlab/AAUSAT3 BlueBox
 
+usb:v1D50p6055*
+ ID_MODEL_FROM_DATABASE=RADiuS ER900TRS-02 transciever with SMA Connector
+
 usb:v1D50p6056*
  ID_MODEL_FROM_DATABASE=The Glitch
 
+usb:v1D50p6057*
+ ID_MODEL_FROM_DATABASE=OpenPipe MIDI Shield
+
+usb:v1D50p6058*
+ ID_MODEL_FROM_DATABASE=Novena OTG port
+
+usb:v1D50p6059*
+ ID_MODEL_FROM_DATABASE=xser serial
+
+usb:v1D50p605A*
+ ID_MODEL_FROM_DATABASE=Daisho test
+
 usb:v1D50p605B*
  ID_MODEL_FROM_DATABASE=RfCat YARD Stick One
 
@@ -55769,6 +60296,9 @@ usb:v1D50p6060*
 usb:v1D50p6061*
  ID_MODEL_FROM_DATABASE=Power Manager
 
+usb:v1D50p6062*
+ ID_MODEL_FROM_DATABASE=WhiteRabbit console and Wishbone bridge
+
 usb:v1D50p6063*
  ID_MODEL_FROM_DATABASE=CPC FPGA
 
@@ -55805,6 +60335,9 @@ usb:v1D50p606D*
 usb:v1D50p606E*
  ID_MODEL_FROM_DATABASE=Reefangel Evolution 1.0
 
+usb:v1D50p606F*
+ ID_MODEL_FROM_DATABASE=Geschwister Schneider CAN adapter
+
 usb:v1D50p6070*
  ID_MODEL_FROM_DATABASE=Open Pinball Project
 
@@ -55832,6 +60365,9 @@ usb:v1D50p6077*
 usb:v1D50p6078*
  ID_MODEL_FROM_DATABASE=DTplug
 
+usb:v1D50p6079*
+ ID_MODEL_FROM_DATABASE=Mood Light
+
 usb:v1D50p607A*
  ID_MODEL_FROM_DATABASE=Fadecandy
 
@@ -55844,6 +60380,9 @@ usb:v1D50p607C*
 usb:v1D50p607D*
  ID_MODEL_FROM_DATABASE=Spark Core Arduino-compatible board with WiFi
 
+usb:v1D50p607E*
+ ID_MODEL_FROM_DATABASE=OSHUG Wuthering multi-tool
+
 usb:v1D50p607F*
  ID_MODEL_FROM_DATABASE=Spark Core Arduino-compatible board with WiFi (bootloader)
 
@@ -55868,6 +60407,9 @@ usb:v1D50p6085*
 usb:v1D50p6086*
  ID_MODEL_FROM_DATABASE=OneRNG entropy device
 
+usb:v1D50p6087*
+ ID_MODEL_FROM_DATABASE=Blinkytape (alternate endpoint config)
+
 usb:v1D50p6088*
  ID_MODEL_FROM_DATABASE=picp PIC16F145x based PIC16F145x programmer
 
@@ -55979,6 +60521,15 @@ usb:v1D50p60AB*
 usb:v1D50p60AC*
  ID_MODEL_FROM_DATABASE=OpenBLT generic microcontroller (bootloader)
 
+usb:v1D50p60AD*
+ ID_MODEL_FROM_DATABASE=Clasic Gamepad Adapter (NES)
+
+usb:v1D50p60AE*
+ ID_MODEL_FROM_DATABASE=Clasic Gamepad Adapter (N64)
+
+usb:v1D50p60AF*
+ ID_MODEL_FROM_DATABASE=Clasic Gamepad Adapter (DB9)
+
 usb:v1D50p60B0*
  ID_MODEL_FROM_DATABASE=Waterott Arduino based Clock (caterina bootloader)
 
@@ -56024,6 +60575,9 @@ usb:v1D50p60BE*
 usb:v1D50p60BF*
  ID_MODEL_FROM_DATABASE=Pixelmatix Aurora
 
+usb:v1D50p60C0*
+ ID_MODEL_FROM_DATABASE=Nucular Keyboard adapter
+
 usb:v1D50p60C1*
  ID_MODEL_FROM_DATABASE=BrewBit Model-T pOSHW temperature controller for homebrewers (bootloader)
 
@@ -56033,6 +60587,12 @@ usb:v1D50p60C2*
 usb:v1D50p60C3*
  ID_MODEL_FROM_DATABASE=X Antenna Tracker arduino board
 
+usb:v1D50p60C4*
+ ID_MODEL_FROM_DATABASE=CAN bus communication device
+
+usb:v1D50p60C5*
+ ID_MODEL_FROM_DATABASE=PIC16F1 bootloader
+
 usb:v1D50p60C6*
  ID_MODEL_FROM_DATABASE=USBtrng hardware random number generator
 
@@ -56054,6 +60614,9 @@ usb:v1D50p60CB*
 usb:v1D50p60CC*
  ID_MODEL_FROM_DATABASE=LamDiNao
 
+usb:v1D50p60CD*
+ ID_MODEL_FROM_DATABASE=Open Lighting DMX512 / RDM widget
+
 usb:v1D50p60DE*
  ID_MODEL_FROM_DATABASE=Cryptech.is random number generator
 
@@ -56093,8 +60656,17 @@ usb:v1D50p60E9*
 usb:v1D50p60EA*
  ID_MODEL_FROM_DATABASE=Wiggleport FPGA-based I/O board
 
+usb:v1D50p60EB*
+ ID_MODEL_FROM_DATABASE=candleLight CAN adapter
+
 usb:v1D50p60EC*
- ID_MODEL_FROM_DATABASE=Duet 3D Printer Controller
+ ID_MODEL_FROM_DATABASE=Duet 2 WiFi or Duet 2 Ethernet 3D printer control electronics
+
+usb:v1D50p60ED*
+ ID_MODEL_FROM_DATABASE=Duet 2 Maestro 3D printer control electronics
+
+usb:v1D50p60EE*
+ ID_MODEL_FROM_DATABASE=Duet 3 motion control electronics
 
 usb:v1D50p60F0*
  ID_MODEL_FROM_DATABASE=UDAD-T1 data aquisition device (boot)
@@ -56141,11 +60713,23 @@ usb:v1D50p610C*
 usb:v1D50p610D*
  ID_MODEL_FROM_DATABASE=Magic Keys
 
+usb:v1D50p6114*
+ ID_MODEL_FROM_DATABASE=MIDI key
+
+usb:v1D50p6118*
+ ID_MODEL_FROM_DATABASE=Thomson MO5 keyboard
+
+usb:v1D50p6122*
+ ID_MODEL_FROM_DATABASE=Ultimate Hacking Keyboard
+
+usb:v1D50p614C*
+ ID_MODEL_FROM_DATABASE=dwtk In-Circuit Emulator
+
 usb:v1D50p8085*
  ID_MODEL_FROM_DATABASE=Box0 (box0-v5)
 
 usb:v1D50pCC15*
- ID_MODEL_FROM_DATABASE=rad1o badge for CCC congress 2015
+ ID_MODEL_FROM_DATABASE=rad1o badge for CCC summer camp 2015
 
 usb:v1D57*
  ID_VENDOR_FROM_DATABASE=Xenta
@@ -56159,6 +60743,9 @@ usb:v1D57p0006*
 usb:v1D57p000C*
  ID_MODEL_FROM_DATABASE=Optical Mouse
 
+usb:v1D57p130F*
+ ID_MODEL_FROM_DATABASE=2.4Ghz wireless optical mouse receiver
+
 usb:v1D57p2400*
  ID_MODEL_FROM_DATABASE=Wireless Mouse Receiver
 
@@ -56171,12 +60758,27 @@ usb:v1D57p83D0*
 usb:v1D57pAC01*
  ID_MODEL_FROM_DATABASE=Wireless Receiver (Keyboard and Mouse)
 
+usb:v1D57pAC02*
+ ID_MODEL_FROM_DATABASE=ViFit Activity Tracker
+
+usb:v1D57pAC08*
+ ID_MODEL_FROM_DATABASE=RFID Receiver (Keyboard)
+
 usb:v1D57pAD02*
  ID_MODEL_FROM_DATABASE=SE340D PC Remote Control
 
+usb:v1D57pAD03*
+ ID_MODEL_FROM_DATABASE=[T3] 2.4GHz and IR Air Mouse Remote Control
+
 usb:v1D57pAF01*
  ID_MODEL_FROM_DATABASE=AUVIO Universal Remote Receiver for PlayStation 3
 
+usb:v1D57pAF03*
+ ID_MODEL_FROM_DATABASE=Wireless Receiver
+
+usb:v1D57pFA20*
+ ID_MODEL_FROM_DATABASE=2.4GHz Wireless Reciever (Mini Keyboard & Mouse)
+
 usb:v1D5B*
  ID_VENDOR_FROM_DATABASE=Smartronix, Inc.
 
@@ -56219,12 +60821,30 @@ usb:v1D6Bp0105*
 usb:v1D6Bp0200*
  ID_MODEL_FROM_DATABASE=Qemu Audio Device
 
+usb:v1D88*
+ ID_VENDOR_FROM_DATABASE=Mahr GmbH
+
+usb:v1D88p0001*
+ ID_MODEL_FROM_DATABASE=Measurement Device [MarECon]
+
+usb:v1D88p0002*
+ ID_MODEL_FROM_DATABASE=Probe
+
+usb:v1D88p0003*
+ ID_MODEL_FROM_DATABASE=Surface Measurement [PS10]
+
 usb:v1D90*
  ID_VENDOR_FROM_DATABASE=Citizen
 
 usb:v1D90p201E*
  ID_MODEL_FROM_DATABASE=PPU-700
 
+usb:v1D90p2037*
+ ID_MODEL_FROM_DATABASE=CL-S631 Barcode Printer
+
+usb:v1D90p20F0*
+ ID_MODEL_FROM_DATABASE=Thermal Receipt Printer [CT-E351]
+
 usb:v1D9D*
  ID_VENDOR_FROM_DATABASE=Sigma Sport
 
@@ -56234,6 +60854,18 @@ usb:v1D9Dp1010*
 usb:v1D9Dp1011*
  ID_MODEL_FROM_DATABASE=Docking Station Topline 2012
 
+usb:v1D9Dp1012*
+ ID_MODEL_FROM_DATABASE=Docking Station Topline 2016
+
+usb:v1DD2*
+ ID_VENDOR_FROM_DATABASE=Leo Bodnar Electronics Ltd
+
+usb:v1DD3*
+ ID_VENDOR_FROM_DATABASE=Dajc Inc.
+
+usb:v1DD3p0001*
+ ID_MODEL_FROM_DATABASE=Expert I/O 1000
+
 usb:v1DE1*
  ID_VENDOR_FROM_DATABASE=Actions Microelectronics Co.
 
@@ -56243,6 +60875,9 @@ usb:v1DE1p1101*
 usb:v1DE1pC101*
  ID_MODEL_FROM_DATABASE=Generic Display Device
 
+usb:v1DE6*
+ ID_VENDOR_FROM_DATABASE=MICRORISC s.r.o.
+
 usb:v1E0E*
  ID_VENDOR_FROM_DATABASE=Qualcomm / Option
 
@@ -56324,15 +60959,51 @@ usb:v1E29p040D*
 usb:v1E29p040E*
  ID_MODEL_FROM_DATABASE=LPC2378 [Robotino 3 Bootloader]
 
+usb:v1E29p040F*
+ ID_MODEL_FROM_DATABASE=LPC2148 [Robotino gripper]
+
+usb:v1E29p0410*
+ ID_MODEL_FROM_DATABASE=LPC2148 [Robotino IR panel]
+
 usb:v1E29p0501*
  ID_MODEL_FROM_DATABASE=CP2102 [CMSP]
 
 usb:v1E29p0601*
  ID_MODEL_FROM_DATABASE=CMMP-AS
 
+usb:v1E29p0602*
+ ID_MODEL_FROM_DATABASE=FTDI232 [CMMS]
+
+usb:v1E2D*
+ ID_VENDOR_FROM_DATABASE=Gemalto M2M GmbH
+
+usb:v1E2Dp004F*
+ ID_MODEL_FROM_DATABASE=EGS3 GSM/GPRS modem
+
+usb:v1E2Dp0054*
+ ID_MODEL_FROM_DATABASE=PH8 wireless module
+
+usb:v1E2Dp0058*
+ ID_MODEL_FROM_DATABASE=Wireless Module [Cinterion EHS6]
+
+usb:v1E2Dp0059*
+ ID_MODEL_FROM_DATABASE=Wireless Module [Cinterion BGx]
+
+usb:v1E2Dp005B*
+ ID_MODEL_FROM_DATABASE=Zoom 4625 Modem
+
+usb:v1E2Dp0061*
+ ID_MODEL_FROM_DATABASE=ALSx PLSx LTE modem
+
+usb:v1E2Dp00A0*
+ ID_MODEL_FROM_DATABASE=Cinterion ELS31-V
+
 usb:v1E3D*
  ID_VENDOR_FROM_DATABASE=Chipsbank Microelectronics Co., Ltd
 
+usb:v1E3Dp198A*
+ ID_MODEL_FROM_DATABASE=Flash Disk
+
 usb:v1E3Dp2093*
  ID_MODEL_FROM_DATABASE=CBM209x Flash Drive (OEM)
 
@@ -56345,6 +61016,15 @@ usb:v1E41*
 usb:v1E41p0001*
  ID_MODEL_FROM_DATABASE=CS328A PC Oscilloscope
 
+usb:v1E41p0004*
+ ID_MODEL_FROM_DATABASE=CS448
+
+usb:v1E44*
+ ID_VENDOR_FROM_DATABASE=SHIMANO INC.
+
+usb:v1E44p7220*
+ ID_MODEL_FROM_DATABASE=SM-BCR2
+
 usb:v1E4E*
  ID_VENDOR_FROM_DATABASE=Cubeternet
 
@@ -56354,6 +61034,9 @@ usb:v1E4Ep0100*
 usb:v1E4Ep0102*
  ID_MODEL_FROM_DATABASE=GL-UPC822 UVC WebCam
 
+usb:v1E4Ep0109*
+ ID_MODEL_FROM_DATABASE=EtronTech CMOS based eSP570 WebCam [Onyx Titanium TC101]
+
 usb:v1E54*
  ID_VENDOR_FROM_DATABASE=TypeMatrix
 
@@ -56366,15 +61049,39 @@ usb:v1E68*
 usb:v1E68p001B*
  ID_MODEL_FROM_DATABASE=DataStation maxi g.u
 
+usb:v1E68p004C*
+ ID_MODEL_FROM_DATABASE=DataStation Pocket Click
+
 usb:v1E68p0050*
  ID_MODEL_FROM_DATABASE=DataStation maxi light
 
+usb:v1E68p1045*
+ ID_MODEL_FROM_DATABASE=ST70408-3 [SurfTab breeze 7.0 quad 3G] (MTP Mode)
+
+usb:v1E68p1046*
+ ID_MODEL_FROM_DATABASE=ST70408-3 [SurfTab breeze 7.0 quad 3G] (PTP Mode)
+
 usb:v1E71*
  ID_VENDOR_FROM_DATABASE=NZXT
 
 usb:v1E71p0001*
  ID_MODEL_FROM_DATABASE=Avatar Optical Mouse
 
+usb:v1E71p170E*
+ ID_MODEL_FROM_DATABASE=Kraken X
+
+usb:v1E71p1711*
+ ID_MODEL_FROM_DATABASE=Grid+ V3
+
+usb:v1E71p1714*
+ ID_MODEL_FROM_DATABASE=Smart Device
+
+usb:v1E71p1715*
+ ID_MODEL_FROM_DATABASE=Kraken M22
+
+usb:v1E71p2006*
+ ID_MODEL_FROM_DATABASE=Smart Device V2
+
 usb:v1E74*
  ID_VENDOR_FROM_DATABASE=Coby Electronics Corporation
 
@@ -56399,42 +61106,360 @@ usb:v1E74p6512*
 usb:v1E74p7111*
  ID_MODEL_FROM_DATABASE=MP957 Music and Video Player
 
+usb:v1E7B*
+ ID_VENDOR_FROM_DATABASE=Zurich Instruments
+
+usb:v1E7Bp0002*
+ ID_MODEL_FROM_DATABASE=HF2
+
+usb:v1E7Bp0003*
+ ID_MODEL_FROM_DATABASE=UHF
+
+usb:v1E7Bp0004*
+ ID_MODEL_FROM_DATABASE=MFLI
+
 usb:v1E7D*
  ID_VENDOR_FROM_DATABASE=ROCCAT
 
 usb:v1E7Dp2C24*
  ID_MODEL_FROM_DATABASE=Pyra Mouse (wired)
 
+usb:v1E7Dp2C2E*
+ ID_MODEL_FROM_DATABASE=Lua Mouse
+
+usb:v1E7Dp2C38*
+ ID_MODEL_FROM_DATABASE=Kiro Mouse
+
 usb:v1E7Dp2CED*
  ID_MODEL_FROM_DATABASE=Kone Mouse
 
+usb:v1E7Dp2CEE*
+ ID_MODEL_FROM_DATABASE=Kova 2016 Gray Mouse
+
+usb:v1E7Dp2CEF*
+ ID_MODEL_FROM_DATABASE=Kova 2016 White Mouse
+
+usb:v1E7Dp2CF0*
+ ID_MODEL_FROM_DATABASE=Kova 2016 Black Mouse
+
 usb:v1E7Dp2CF6*
  ID_MODEL_FROM_DATABASE=Pyra Mouse (wireless)
 
 usb:v1E7Dp2D50*
- ID_MODEL_FROM_DATABASE=Kova+ Mouse
+ ID_MODEL_FROM_DATABASE=Kova[+] Mouse
 
 usb:v1E7Dp2D51*
- ID_MODEL_FROM_DATABASE=Kone+ Mouse
+ ID_MODEL_FROM_DATABASE=Kone[+] Mouse
+
+usb:v1E7Dp2D5A*
+ ID_MODEL_FROM_DATABASE=Savu Mouse
+
+usb:v1E7Dp2DB4*
+ ID_MODEL_FROM_DATABASE=Kone Pure Optical Mouse
+
+usb:v1E7Dp2DBE*
+ ID_MODEL_FROM_DATABASE=Kone Pure Mouse
+
+usb:v1E7Dp2DBF*
+ ID_MODEL_FROM_DATABASE=Kone Pure Military Mouse
+
+usb:v1E7Dp2DC2*
+ ID_MODEL_FROM_DATABASE=Kone Pure Optical Black Mouse
+
+usb:v1E7Dp2DCB*
+ ID_MODEL_FROM_DATABASE=Kone Pure SE(L) Mouse
 
 usb:v1E7Dp2E22*
  ID_MODEL_FROM_DATABASE=Kone XTD Mouse
 
+usb:v1E7Dp2E23*
+ ID_MODEL_FROM_DATABASE=Kone XTD Optical Mouse
+
+usb:v1E7Dp2E27*
+ ID_MODEL_FROM_DATABASE=Kone AIMO Mouse
+
+usb:v1E7Dp2E4A*
+ ID_MODEL_FROM_DATABASE=Tyon Black Mouse
+
+usb:v1E7Dp2E4B*
+ ID_MODEL_FROM_DATABASE=Tyon White Mouse
+
+usb:v1E7Dp2E7C*
+ ID_MODEL_FROM_DATABASE=Nyth Black Mouse
+
+usb:v1E7Dp2E7D*
+ ID_MODEL_FROM_DATABASE=Nyth White Mouse
+
+usb:v1E7Dp2F76*
+ ID_MODEL_FROM_DATABASE=Sova Keyboard
+
+usb:v1E7Dp2F94*
+ ID_MODEL_FROM_DATABASE=Sova MK Keyboard
+
+usb:v1E7Dp2FA8*
+ ID_MODEL_FROM_DATABASE=Suora Keyboard
+
+usb:v1E7Dp2FC6*
+ ID_MODEL_FROM_DATABASE=Skeltr Keyboard
+
+usb:v1E7Dp2FDA*
+ ID_MODEL_FROM_DATABASE=Ryos MK FX Keyboard
+
 usb:v1E7Dp30D4*
  ID_MODEL_FROM_DATABASE=Arvo Keyboard
 
+usb:v1E7Dp3138*
+ ID_MODEL_FROM_DATABASE=Ryos MK Keyboard
+
+usb:v1E7Dp316A*
+ ID_MODEL_FROM_DATABASE=Ryos TKL Keyboard
+
+usb:v1E7Dp319C*
+ ID_MODEL_FROM_DATABASE=Isku Keyboard
+
+usb:v1E7Dp31CE*
+ ID_MODEL_FROM_DATABASE=Ryos MK Glow Keyboard
+
+usb:v1E7Dp3232*
+ ID_MODEL_FROM_DATABASE=Ryos MK Pro Keyboard
+
+usb:v1E7Dp3246*
+ ID_MODEL_FROM_DATABASE=Suora FX Keyboard
+
+usb:v1E7Dp3264*
+ ID_MODEL_FROM_DATABASE=Isku FX Keyboard
+
+usb:v1E8E*
+ ID_VENDOR_FROM_DATABASE=Airbus Defence and Space
+
+usb:v1E8Ep6001*
+ ID_MODEL_FROM_DATABASE=P8GR
+
+usb:v1E91*
+ ID_VENDOR_FROM_DATABASE=Other World Computing
+
+usb:v1E91pB0B1*
+ ID_MODEL_FROM_DATABASE=miniStack
+
 usb:v1EA7*
  ID_VENDOR_FROM_DATABASE=SHARKOON Technologies GmbH
 
+usb:v1EA7p0030*
+ ID_MODEL_FROM_DATABASE=Trust GXT 158 Orna Laser Gaming Mouse
+
+usb:v1EA7p0064*
+ ID_MODEL_FROM_DATABASE=2.4GHz Wireless rechargeable vertical mouse [More&Better]
+
 usb:v1EA7p0066*
  ID_MODEL_FROM_DATABASE=[Mediatrack Edge Mini Keyboard]
 
+usb:v1EA7p0907*
+ ID_MODEL_FROM_DATABASE=Keyboard
+
+usb:v1EA7p1002*
+ ID_MODEL_FROM_DATABASE=Vintorez Gaming Mouse
+
 usb:v1EA7p2007*
  ID_MODEL_FROM_DATABASE=SHARK ZONE K30 Illuminated Gaming Keyboard
 
+usb:v1EAB*
+ ID_VENDOR_FROM_DATABASE=Fujian Newland Computer Co., Ltd
+
+usb:v1EABp0103*
+ ID_MODEL_FROM_DATABASE=HR200 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp0106*
+ ID_MODEL_FROM_DATABASE=HR200 Barcode scanner engine (Serial CDC)
+
+usb:v1EABp0110*
+ ID_MODEL_FROM_DATABASE=HR200 Barcode scanner engine (HID Pos)
+
+usb:v1EABp0C03*
+ ID_MODEL_FROM_DATABASE=HR100/HR3260 cordless/HR3290 cordless/BS80 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp0C06*
+ ID_MODEL_FROM_DATABASE=HR100/HR3260 cordless/HR3290 cordless/BS80 Barcode scanner engine (USB Serial CDC)
+
+usb:v1EABp0C10*
+ ID_MODEL_FROM_DATABASE=HR100/HR3260 cordless/HR3290 cordless/BS80 Barcode scanner engine (HID Pos)
+
+usb:v1EABp0D03*
+ ID_MODEL_FROM_DATABASE=EM2028 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp0D06*
+ ID_MODEL_FROM_DATABASE=EM2028 Barcode scanner engine (Serial CDC)
+
+usb:v1EABp0D10*
+ ID_MODEL_FROM_DATABASE=EM2028 Barcode scanner engine (HID Pos)
+
+usb:v1EABp1303*
+ ID_MODEL_FROM_DATABASE=EM30xx/EM20xx/HR3260 corded/HR200C Barcode scanner engine (HID keyboard)
+
+usb:v1EABp1306*
+ ID_MODEL_FROM_DATABASE=EM30xx/EM20xx/HR3260 corded/HR200C Barcode scanner engine (USB serial CDC)
+
+usb:v1EABp1310*
+ ID_MODEL_FROM_DATABASE=EM30xx/EM20xx/HR3260 corded/HR200C Barcode scanner engine (HID Pos)
+
+usb:v1EABp1403*
+ ID_MODEL_FROM_DATABASE=HR15-xx Barcode scanner engine (HID keyboard)
+
+usb:v1EABp1406*
+ ID_MODEL_FROM_DATABASE=HR15-xx Barcode scanner engine (Serial CDC)
+
+usb:v1EABp1410*
+ ID_MODEL_FROM_DATABASE=HR15-xx Barcode scanner engine (HID Pos)
+
+usb:v1EABp1603*
+ ID_MODEL_FROM_DATABASE=FM100-M/3250 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp1606*
+ ID_MODEL_FROM_DATABASE=FM100-M/3250 Barcode scanner engine (Serial CDC)
+
+usb:v1EABp1610*
+ ID_MODEL_FROM_DATABASE=FM100-M/3250 Barcode scanner engine (HID Pos)
+
+usb:v1EABp1903*
+ ID_MODEL_FROM_DATABASE=EM1300 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp1906*
+ ID_MODEL_FROM_DATABASE=EM1300 Barcode scanner engine (Serial CDC)
+
+usb:v1EABp1910*
+ ID_MODEL_FROM_DATABASE=EM1300 Barcode scanner engine (HID Pos)
+
+usb:v1EABp1A03*
+ ID_MODEL_FROM_DATABASE=HR3290 corded/HR22 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp1A06*
+ ID_MODEL_FROM_DATABASE=HR3290 corded/HR22 Barcode scanner engine (Serial CDC)
+
+usb:v1EABp1A10*
+ ID_MODEL_FROM_DATABASE=HR3290 corded/HR22 Barcode scanner engine (HID Pos)
+
+usb:v1EABp1C03*
+ ID_MODEL_FROM_DATABASE=HR2150 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp1C06*
+ ID_MODEL_FROM_DATABASE=HR2150 Barcode scanner engine (Serial CDC)
+
+usb:v1EABp1C10*
+ ID_MODEL_FROM_DATABASE=HR2150 Barcode scanner engine (HID Pos)
+
+usb:v1EABp1D03*
+ ID_MODEL_FROM_DATABASE=FM430 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp1D06*
+ ID_MODEL_FROM_DATABASE=FM430 Barcode scanner engine (Serial CDC)
+
+usb:v1EABp1D10*
+ ID_MODEL_FROM_DATABASE=FM430 Barcode scanner engine (HID Pos)
+
+usb:v1EABp1E03*
+ ID_MODEL_FROM_DATABASE=HR42 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp1E06*
+ ID_MODEL_FROM_DATABASE=HR42 Barcode scanner engine (Serial CDC)
+
+usb:v1EABp1E10*
+ ID_MODEL_FROM_DATABASE=HR42 Barcode scanner engine (HID Pos)
+
+usb:v1EABp1F03*
+ ID_MODEL_FROM_DATABASE=HR11+ Barcode scanner engine (HID keyboard)
+
+usb:v1EABp1F06*
+ ID_MODEL_FROM_DATABASE=HR11+ Barcode scanner engine (Serial CDC)
+
+usb:v1EABp1F10*
+ ID_MODEL_FROM_DATABASE=HR11+ Barcode scanner engine (HID Pos)
+
+usb:v1EABp2003*
+ ID_MODEL_FROM_DATABASE=EM2037v2 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp2006*
+ ID_MODEL_FROM_DATABASE=EM2037v2 Barcode scanner engine (Serial CDC)
+
+usb:v1EABp2010*
+ ID_MODEL_FROM_DATABASE=EM2037v2 Barcode scanner engine (HID Pos)
+
+usb:v1EABp8003*
+ ID_MODEL_FROM_DATABASE=EM13x5-LD/HR15-70/HR100-70/HR12/HR1150-70 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp8006*
+ ID_MODEL_FROM_DATABASE=EM13x5-LD/HR15-70/HR100-70/HR12/HR1150-70 Barcode scanner engine (USB Serial CDC)
+
+usb:v1EABp8010*
+ ID_MODEL_FROM_DATABASE=EM13x5-LD/HR15-70/HR100-70/HR12/HR1150-70 Barcode scanner engine (HID Pos)
+
+usb:v1EABp8203*
+ ID_MODEL_FROM_DATABASE=EM3080-01/EM3095/FR20/FM30 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp8206*
+ ID_MODEL_FROM_DATABASE=EM3080-01/EM3095/FR20/FM30 Barcode scanner engine (USB Serial CDC)
+
+usb:v1EABp8210*
+ ID_MODEL_FROM_DATABASE=EM3080-01/EM3095/FR20/FM30 Barcode scanner engine (HID Pos)
+
+usb:v1EABp8303*
+ ID_MODEL_FROM_DATABASE=HR2160 Barcode scanner engine (HID keyboard)
+
+usb:v1EABp8306*
+ ID_MODEL_FROM_DATABASE=HR2160 Barcode scanner engine (Serial CDC)
+
+usb:v1EABp8310*
+ ID_MODEL_FROM_DATABASE=HR2160 Barcode scanner engine (HID Pos)
+
+usb:v1EAF*
+ ID_VENDOR_FROM_DATABASE=Leaflabs
+
+usb:v1EAFp0003*
+ ID_MODEL_FROM_DATABASE=Maple DFU interface
+
+usb:v1EAFp0004*
+ ID_MODEL_FROM_DATABASE=Maple serial interface
+
+usb:v1EB8*
+ ID_VENDOR_FROM_DATABASE=Modacom Co., Ltd.
+
+usb:v1EB8p7F00*
+ ID_MODEL_FROM_DATABASE=MW-U3500 WiMAX adapter
+
 usb:v1EBB*
  ID_VENDOR_FROM_DATABASE=NuCORE Technology, Inc.
 
+usb:v1ECB*
+ ID_VENDOR_FROM_DATABASE=AMTelecom
+
+usb:v1ECBp02E2*
+ ID_MODEL_FROM_DATABASE=JMR1140 [Jiofi]
+
+usb:v1ED8*
+ ID_VENDOR_FROM_DATABASE=FENDER MUSICAL INSTRUMENTS CORPORATION
+
+usb:v1ED8p0004*
+ ID_MODEL_FROM_DATABASE=Mustang I/II
+
+usb:v1ED8p0005*
+ ID_MODEL_FROM_DATABASE=Mustang III/IV/V
+
+usb:v1ED8p0006*
+ ID_MODEL_FROM_DATABASE=Mustang I/II [Firmware Update]
+
+usb:v1ED8p0007*
+ ID_MODEL_FROM_DATABASE=Mustang III/IV/V [Firmware Update]
+
+usb:v1ED8p0010*
+ ID_MODEL_FROM_DATABASE=Mustang Mini
+
+usb:v1ED8p0011*
+ ID_MODEL_FROM_DATABASE=Mustang Mini [Firmware Update]
+
+usb:v1ED8p0014*
+ ID_MODEL_FROM_DATABASE=Mustang I (V.2)
+
+usb:v1ED8p0016*
+ ID_MODEL_FROM_DATABASE=Mustang IV v.2
+
 usb:v1EDA*
  ID_VENDOR_FROM_DATABASE=AirTies Wireless Networks
 
@@ -56456,6 +61481,12 @@ usb:v1EDB*
 usb:v1EDBpBD3B*
  ID_MODEL_FROM_DATABASE=Intensity Shuttle
 
+usb:v1EDBpBD46*
+ ID_MODEL_FROM_DATABASE=Mini Converter Analog to SDI
+
+usb:v1EDBpBD75*
+ ID_MODEL_FROM_DATABASE=2.5K Cinema Camera (BMCC)
+
 usb:v1EE8*
  ID_VENDOR_FROM_DATABASE=ONDA COMMUNICATION S.p.a.
 
@@ -56483,6 +61514,12 @@ usb:v1EF6p5648*
 usb:v1EF6p564A*
  ID_MODEL_FROM_DATABASE=Cassidian RIU CSMU/BSD Simulator
 
+usb:v1F0C*
+ ID_VENDOR_FROM_DATABASE=CMX Systems
+
+usb:v1F0Cp2000*
+ ID_MODEL_FROM_DATABASE=HP StreamSmart 410 [NW278AA]
+
 usb:v1F28*
  ID_VENDOR_FROM_DATABASE=Cal-Comp
 
@@ -56493,10 +61530,19 @@ usb:v1F28p0021*
  ID_MODEL_FROM_DATABASE=CD INSTALLER USB Device
 
 usb:v1F3A*
- ID_VENDOR_FROM_DATABASE=Onda (unverified)
+ ID_VENDOR_FROM_DATABASE=Allwinner Technology
+
+usb:v1F3Ap1000*
+ ID_MODEL_FROM_DATABASE=Prestigio PER3464B ebook reader (Mass storage mode)
+
+usb:v1F3Ap1002*
+ ID_MODEL_FROM_DATABASE=mediacom XPRO 415
+
+usb:v1F3Ap1010*
+ ID_MODEL_FROM_DATABASE=Android device in fastboot mode
 
 usb:v1F3ApEFE8*
- ID_MODEL_FROM_DATABASE=V972 tablet in flashing mode
+ ID_MODEL_FROM_DATABASE=sunxi SoC OTG connector in FEL/flashing mode
 
 usb:v1F44*
  ID_VENDOR_FROM_DATABASE=The Neat Company
@@ -56516,12 +61562,33 @@ usb:v1F48p0628*
 usb:v1F4D*
  ID_VENDOR_FROM_DATABASE=G-Tek Electronics Group
 
+usb:v1F4DpA115*
+ ID_MODEL_FROM_DATABASE=EVOLVEO XtraTV stick [DVB-T]
+
 usb:v1F4DpB803*
  ID_MODEL_FROM_DATABASE=Lifeview LV5TDLX DVB-T [RTL2832U]
 
+usb:v1F4DpC803*
+ ID_MODEL_FROM_DATABASE=NotOnlyTV (Lifeview) LV5TDLX DVB-T [RTL2832U]
+
 usb:v1F4DpD220*
  ID_MODEL_FROM_DATABASE=Geniatech T220 DVB-T2 TV Stick
 
+usb:v1F52*
+ ID_VENDOR_FROM_DATABASE=Systems & Electronic Development FZCO (SEDCO)
+
+usb:v1F52p0001*
+ ID_MODEL_FROM_DATABASE=Ultima 49 Printer
+
+usb:v1F52p0002*
+ ID_MODEL_FROM_DATABASE=Ultima 90 Printer
+
+usb:v1F52p0003*
+ ID_MODEL_FROM_DATABASE=FormsPro 50 Printer
+
+usb:v1F52p0004*
+ ID_MODEL_FROM_DATABASE=Ultima 90+ Printer
+
 usb:v1F6F*
  ID_VENDOR_FROM_DATABASE=Aliph
 
@@ -56534,12 +61601,27 @@ usb:v1F6Fp8000*
 usb:v1F75*
  ID_VENDOR_FROM_DATABASE=Innostor Technology Corporation
 
+usb:v1F75p0611*
+ ID_MODEL_FROM_DATABASE=IS611 SATA/PATA Bridge Controller
+
+usb:v1F75p0621*
+ ID_MODEL_FROM_DATABASE=IS621 SATA Storage Controller
+
 usb:v1F75p0888*
  ID_MODEL_FROM_DATABASE=IS888 SATA Storage Controller
 
 usb:v1F75p0902*
  ID_MODEL_FROM_DATABASE=IS902 UFD controller
 
+usb:v1F75p0916*
+ ID_MODEL_FROM_DATABASE=IS916 Flash Drive
+
+usb:v1F75p0917*
+ ID_MODEL_FROM_DATABASE=IS917 Mass storage
+
+usb:v1F75p0918*
+ ID_MODEL_FROM_DATABASE=IS918 Flash Drive
+
 usb:v1F82*
  ID_VENDOR_FROM_DATABASE=TANDBERG
 
@@ -56549,6 +61631,9 @@ usb:v1F82p0001*
 usb:v1F84*
  ID_VENDOR_FROM_DATABASE=Alere, Inc.
 
+usb:v1F84p1F7E*
+ ID_MODEL_FROM_DATABASE=Lateral Flow Engine
+
 usb:v1F87*
  ID_VENDOR_FROM_DATABASE=Stantum
 
@@ -56561,12 +61646,39 @@ usb:v1F9B*
 usb:v1F9Bp0241*
  ID_MODEL_FROM_DATABASE=AirView2-EXT
 
+usb:v1F9BpB0B1*
+ ID_MODEL_FROM_DATABASE=UniFi VoIP Phone
+
 usb:v1FAB*
  ID_VENDOR_FROM_DATABASE=Samsung Opto-Electroncs Co., Ltd.
 
 usb:v1FABp104D*
  ID_MODEL_FROM_DATABASE=ES65
 
+usb:v1FAC*
+ ID_VENDOR_FROM_DATABASE=Franklin Wireless
+
+usb:v1FACp0232*
+ ID_MODEL_FROM_DATABASE=U770 3G/4G Wimax/4G LTE Modem
+
+usb:v1FAE*
+ ID_VENDOR_FROM_DATABASE=Lumidigm
+
+usb:v1FAEp0040*
+ ID_MODEL_FROM_DATABASE=M311 Fingerprint Scanner
+
+usb:v1FAEp212C*
+ ID_MODEL_FROM_DATABASE=M30x (Mercury) fingerprint sensor
+
+usb:v1FB2*
+ ID_VENDOR_FROM_DATABASE=Withings
+
+usb:v1FB2p0001*
+ ID_MODEL_FROM_DATABASE=Wi-Fi Body Scale (WBS01)
+
+usb:v1FBA*
+ ID_VENDOR_FROM_DATABASE=DERMALOG Identification Systems GmbH
+
 usb:v1FBD*
  ID_VENDOR_FROM_DATABASE=Delphin Technology AG
 
@@ -56579,12 +61691,30 @@ usb:v1FC9*
 usb:v1FC9p0003*
  ID_MODEL_FROM_DATABASE=LPC1343
 
+usb:v1FC9p000C*
+ ID_MODEL_FROM_DATABASE=LPC4330FET180 [ARM Cortex M4 + M0] (device firmware upgrade mode)
+
+usb:v1FC9p0082*
+ ID_MODEL_FROM_DATABASE=LPC4330FET180 [ARM Cortex M4 + M0] (mass storage controller mode)
+
 usb:v1FC9p010B*
  ID_MODEL_FROM_DATABASE=PR533
 
+usb:v1FC9p0126*
+ ID_MODEL_FROM_DATABASE=i.MX 7ULP SystemOnChip in RecoveryMode
+
 usb:v1FC9p012B*
  ID_MODEL_FROM_DATABASE=i.MX 8M Dual/8M QuadLite/8M Quad Serial Downloader
 
+usb:v1FC9p5002*
+ ID_MODEL_FROM_DATABASE=PTN5002 [Startech VGA/DVI-D adapter]
+
+usb:v1FC9p8124*
+ ID_MODEL_FROM_DATABASE=SharkRF Bootloader
+
+usb:v1FC9p824C*
+ ID_MODEL_FROM_DATABASE=LumiNode1
+
 usb:v1FDE*
  ID_VENDOR_FROM_DATABASE=ILX Lightwave Corporation
 
@@ -56606,9 +61736,39 @@ usb:v1FF7p0013*
 usb:v1FF7p001A*
  ID_MODEL_FROM_DATABASE=Human Interface Device
 
+usb:v1FFB*
+ ID_VENDOR_FROM_DATABASE=Pololu Corporation
+
+usb:v1FFBp0081*
+ ID_MODEL_FROM_DATABASE=AVR Programmer
+
+usb:v1FFBp0083*
+ ID_MODEL_FROM_DATABASE=Jrk 21v3 Motor Controller
+
+usb:v1FFBp0089*
+ ID_MODEL_FROM_DATABASE=Micro Maestro 6-Servo Controller
+
+usb:v1FFBp008A*
+ ID_MODEL_FROM_DATABASE=Mini Maestro 12-Channel Servo Controller
+
+usb:v1FFBp008B*
+ ID_MODEL_FROM_DATABASE=Mini Maestro 18-Channel Servo Controller
+
+usb:v1FFBp008C*
+ ID_MODEL_FROM_DATABASE=Mini Maestro 24-Channel Servo Controller
+
+usb:v1FFBp00B0*
+ ID_MODEL_FROM_DATABASE=AVR Programmer v2
+
 usb:v1FFF*
  ID_VENDOR_FROM_DATABASE=Ideofy Inc.
 
+usb:v2000*
+ ID_VENDOR_FROM_DATABASE=CMX Systems
+
+usb:v2000p1F0C*
+ ID_MODEL_FROM_DATABASE=HP StreamSmart 410 [NW278AA]
+
 usb:v2001*
  ID_VENDOR_FROM_DATABASE=D-Link Corp.
 
@@ -56627,6 +61787,9 @@ usb:v2001p1A02*
 usb:v2001p200C*
  ID_MODEL_FROM_DATABASE=10/100 Ethernet
 
+usb:v2001p3101*
+ ID_MODEL_FROM_DATABASE=DWA-182 AC1200 DB Wireless Adapter(rev.A1) [Broadcom BCM43526]
+
 usb:v2001p3200*
  ID_MODEL_FROM_DATABASE=DWL-120 802.11b Wireless Adapter(rev.E1) [Atmel at76c503a]
 
@@ -56645,6 +61808,27 @@ usb:v2001p3309*
 usb:v2001p330A*
  ID_MODEL_FROM_DATABASE=DWA-133 802.11n Wireless N Adapter [Realtek RTL8192CU]
 
+usb:v2001p330D*
+ ID_MODEL_FROM_DATABASE=DWA-131 802.11n Wireless N Nano Adapter (rev.B1) [Realtek RTL8192CU]
+
+usb:v2001p330F*
+ ID_MODEL_FROM_DATABASE=DWA-125 Wireless N 150 Adapter(rev.D1) [Realtek RTL8188ETV]
+
+usb:v2001p3310*
+ ID_MODEL_FROM_DATABASE=DWA-123 Wireless N 150 Adapter (rev.D1)
+
+usb:v2001p3314*
+ ID_MODEL_FROM_DATABASE=DWA-171 AC600 DB Wireless Adapter(rev.A1) [Realtek RTL8811AU]
+
+usb:v2001p3315*
+ ID_MODEL_FROM_DATABASE=DWA-182 Wireless AC Dualband Adapter(rev.C) [Realtek RTL8812AU]
+
+usb:v2001p3317*
+ ID_MODEL_FROM_DATABASE=DWA-137 Wireless N High-Gain Adapter [Ralink RT5372]
+
+usb:v2001p3319*
+ ID_MODEL_FROM_DATABASE=DWA-131 Wireless N Nano Adapter (Rev. E1) [Realtek RTL8192EU]
+
 usb:v2001p3500*
  ID_MODEL_FROM_DATABASE=Elitegroup Computer Systems WLAN card WL-162
 
@@ -56732,6 +61916,9 @@ usb:v2001p3C1A*
 usb:v2001p3C1B*
  ID_MODEL_FROM_DATABASE=DWA-127 Wireless N 150 High-Gain Adapter(rev.A1) [Ralink RT3070]
 
+usb:v2001p3C1E*
+ ID_MODEL_FROM_DATABASE=DWA-125 Wireless N 150 Adapter(rev.B1) [Ralink RT5370]
+
 usb:v2001p4000*
  ID_MODEL_FROM_DATABASE=DSB-650C Ethernet [klsi]
 
@@ -56750,6 +61937,9 @@ usb:v2001p400B*
 usb:v2001p4102*
  ID_MODEL_FROM_DATABASE=10/100 Ethernet
 
+usb:v2001p4A00*
+ ID_MODEL_FROM_DATABASE=DUB-1312 Gigabit Ethernet Adapter
+
 usb:v2001p5100*
  ID_MODEL_FROM_DATABASE=DSL-200 ADSL ATM Modem
 
@@ -56804,6 +61994,21 @@ usb:v2003*
 usb:v2003pEA61*
  ID_MODEL_FROM_DATABASE=dc3500
 
+usb:v2006*
+ ID_VENDOR_FROM_DATABASE=LenovoMobile
+
+usb:v2009*
+ ID_VENDOR_FROM_DATABASE=iStorage
+
+usb:v2009p5004*
+ ID_MODEL_FROM_DATABASE=datAshur 4GB
+
+usb:v2009p5016*
+ ID_MODEL_FROM_DATABASE=datAshur 16GB
+
+usb:v2009p5032*
+ ID_MODEL_FROM_DATABASE=datAshur 32GB
+
 usb:v200C*
  ID_VENDOR_FROM_DATABASE=Reloop
 
@@ -56813,6 +62018,9 @@ usb:v200Cp100B*
 usb:v2013*
  ID_VENDOR_FROM_DATABASE=PCTV Systems
 
+usb:v2013p0242*
+ ID_MODEL_FROM_DATABASE=QuatroStick 510e
+
 usb:v2013p0245*
  ID_MODEL_FROM_DATABASE=PCTV 73ESE
 
@@ -56822,9 +62030,36 @@ usb:v2013p0246*
 usb:v2013p0248*
  ID_MODEL_FROM_DATABASE=PCTV 282E
 
+usb:v2013p024C*
+ ID_MODEL_FROM_DATABASE=DVB-S2 Stick 460e
+
 usb:v2013p024F*
  ID_MODEL_FROM_DATABASE=nanoStick T2 290e
 
+usb:v2013p0251*
+ ID_MODEL_FROM_DATABASE=QuatroStick nano 520e
+
+usb:v2013p0258*
+ ID_MODEL_FROM_DATABASE=DVB-S2 Stick 461e
+
+usb:v2013p025A*
+ ID_MODEL_FROM_DATABASE=AndroiDTV 78e
+
+usb:v2013p025F*
+ ID_MODEL_FROM_DATABASE=tripleStick 292e
+
+usb:v2013p0262*
+ ID_MODEL_FROM_DATABASE=microStick 79e
+
+usb:v2018*
+ ID_VENDOR_FROM_DATABASE=Deutsche Telekom AG
+
+usb:v2018p0406*
+ ID_MODEL_FROM_DATABASE=Eumex 800
+
+usb:v2018p0408*
+ ID_MODEL_FROM_DATABASE=Eumex 800
+
 usb:v2019*
  ID_VENDOR_FROM_DATABASE=PLANEX
 
@@ -56900,6 +62135,15 @@ usb:v2019pED17*
 usb:v2019pED18*
  ID_MODEL_FROM_DATABASE=GW-USHyper300 / GW-USH300N 802.11bgn Wireless Adapter [Realtek RTL8191SU]
 
+usb:v201E*
+ ID_VENDOR_FROM_DATABASE=Haier
+
+usb:v201Ep2009*
+ ID_MODEL_FROM_DATABASE=CE100 CDMA EVDO
+
+usb:v203A*
+ ID_VENDOR_FROM_DATABASE=PARALLELS
+
 usb:v203D*
  ID_VENDOR_FROM_DATABASE=Encore Electronics Inc.
 
@@ -56909,12 +62153,21 @@ usb:v203Dp1480*
 usb:v2040*
  ID_VENDOR_FROM_DATABASE=Hauppauge
 
+usb:v2040p0265*
+ ID_MODEL_FROM_DATABASE=WinTV-dualHD DVB
+
+usb:v2040p026D*
+ ID_MODEL_FROM_DATABASE=WinTV-dualHD ATSC
+
 usb:v2040p0C80*
  ID_MODEL_FROM_DATABASE=Windham
 
 usb:v2040p0C90*
  ID_MODEL_FROM_DATABASE=Windham
 
+usb:v2040p1605*
+ ID_MODEL_FROM_DATABASE=WinTV-HVR 930C HD
+
 usb:v2040p1700*
  ID_MODEL_FROM_DATABASE=CataMount
 
@@ -56945,6 +62198,9 @@ usb:v2040p2019*
 usb:v2040p2400*
  ID_MODEL_FROM_DATABASE=WinTV PVR USB2 (Model 24019)
 
+usb:v2040p4200*
+ ID_MODEL_FROM_DATABASE=WinTV
+
 usb:v2040p4700*
  ID_MODEL_FROM_DATABASE=WinTV Nova-S-USB2
 
@@ -56985,7 +62241,10 @@ usb:v2040p6503*
  ID_MODEL_FROM_DATABASE=WinTV HVR-930
 
 usb:v2040p6513*
- ID_MODEL_FROM_DATABASE=WinTV HVR-980
+ ID_MODEL_FROM_DATABASE=WinTV HVR-950/HVR-980
+
+usb:v2040p6600*
+ ID_MODEL_FROM_DATABASE=WinTV HVR-900H (Model 660xx)
 
 usb:v2040p7050*
  ID_MODEL_FROM_DATABASE=Nova-T Stick
@@ -57014,6 +62273,12 @@ usb:v2040p9941*
 usb:v2040p9950*
  ID_MODEL_FROM_DATABASE=WinTV Nova-T-500
 
+usb:v2040pB123*
+ ID_MODEL_FROM_DATABASE=WinTV-HVR-955Q
+
+usb:v2040pB138*
+ ID_MODEL_FROM_DATABASE=WinTV-HVR-900 model 00246 [WinTV-T Video]
+
 usb:v2040pB910*
  ID_MODEL_FROM_DATABASE=Windham
 
@@ -57032,15 +62297,177 @@ usb:v2040pC010*
 usb:v2047*
  ID_VENDOR_FROM_DATABASE=Texas Instruments
 
+usb:v2047p0013*
+ ID_MODEL_FROM_DATABASE=MSP eZ-FET lite
+
+usb:v2047p0014*
+ ID_MODEL_FROM_DATABASE=MSP-FET
+
 usb:v2047p0200*
- ID_MODEL_FROM_DATABASE=MSP430 USB HID Bootstrap Loader
+ ID_MODEL_FROM_DATABASE=MSP430 Bootloader
+
+usb:v2047p0203*
+ ID_MODEL_FROM_DATABASE=eZ-FET Bootloader
+
+usb:v2047p0204*
+ ID_MODEL_FROM_DATABASE=MSP-FET Bootloader
+
+usb:v2047p0300*
+ ID_MODEL_FROM_DATABASE=MSP430 CDC Example
+
+usb:v2047p0301*
+ ID_MODEL_FROM_DATABASE=MSP430 HID Datapipe Example
+
+usb:v2047p0302*
+ ID_MODEL_FROM_DATABASE=MSP430 CDC+HID Example
+
+usb:v2047p0309*
+ ID_MODEL_FROM_DATABASE=MSP430 HID Mouse Example
+
+usb:v2047p0313*
+ ID_MODEL_FROM_DATABASE=MSP430 CDC+CDC Example
+
+usb:v2047p0314*
+ ID_MODEL_FROM_DATABASE=MSP430 HID+HID Example
+
+usb:v2047p0315*
+ ID_MODEL_FROM_DATABASE=MSP430 HID Keyboard Example
+
+usb:v2047p0316*
+ ID_MODEL_FROM_DATABASE=MSP430 MSC File System Emulation Example
+
+usb:v2047p0317*
+ ID_MODEL_FROM_DATABASE=MSP430 MSC SD Card Example
+
+usb:v2047p0318*
+ ID_MODEL_FROM_DATABASE=MSP430 MSC Multiple LUNs Example
+
+usb:v2047p0319*
+ ID_MODEL_FROM_DATABASE=MSP430 MSC+CDC+HID Example
+
+usb:v2047p0320*
+ ID_MODEL_FROM_DATABASE=MSP430 SYSBIOS Tasks MSC+CDC+HID Example
+
+usb:v2047p0321*
+ ID_MODEL_FROM_DATABASE=MSP430 SYSBIOS SWIs MSC+CDC+HID Example
+
+usb:v2047p0322*
+ ID_MODEL_FROM_DATABASE=MSP430 MSC Double-Buffering Example
+
+usb:v2047p0323*
+ ID_MODEL_FROM_DATABASE=MSP430 MSC CD-ROM Example
+
+usb:v2047p03DF*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03E0*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03E1*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03E2*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03E3*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03E4*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03E5*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03E6*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03E7*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03E8*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03E9*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03EA*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03EB*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03EC*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03ED*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03EE*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03EF*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03F0*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03F1*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03F2*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03F3*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03F4*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03F5*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03F6*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03F7*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03F8*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03F9*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03FA*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03FB*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03FC*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p03FD*
+ ID_MODEL_FROM_DATABASE=MSP430 User Experiment
+
+usb:v2047p0401*
+ ID_MODEL_FROM_DATABASE=MSP430 Keyboard Example
 
 usb:v2047p0855*
  ID_MODEL_FROM_DATABASE=Invensense Embedded MotionApp HID Sensor
 
+usb:v2047p08F8*
+ ID_MODEL_FROM_DATABASE=FDC2x14/LDC13xx/LDC16xx EVM
+
 usb:v2047p0964*
  ID_MODEL_FROM_DATABASE=Inventio Software MSP430
 
+usb:v2047p0A76*
+ ID_MODEL_FROM_DATABASE=GEOKON S-3810A-5 USB-RS485 CONVERTER
+
+usb:v2047pFFE7*
+ ID_MODEL_FROM_DATABASE=HID v1.00 Device [Improv Device]
+
 usb:v2058*
  ID_VENDOR_FROM_DATABASE=Nano River Technology
 
@@ -57068,6 +62495,24 @@ usb:v2080p0003*
 usb:v2080p0004*
  ID_MODEL_FROM_DATABASE=NOOK Tablet
 
+usb:v2080p0005*
+ ID_MODEL_FROM_DATABASE=BNTV600 [Nook HD+]
+
+usb:v2080p0006*
+ ID_MODEL_FROM_DATABASE=BNTV400 [Nook HD]
+
+usb:v2080p0007*
+ ID_MODEL_FROM_DATABASE=BNRV500 [Nook Glowlight]
+
+usb:v2080p000A*
+ ID_MODEL_FROM_DATABASE=BNRV510 [Nook Glowlight Plus]
+
+usb:v2080p000B*
+ ID_MODEL_FROM_DATABASE=BNRV520 [Nook Glowlight 3]
+
+usb:v2080p000C*
+ ID_MODEL_FROM_DATABASE=BNRV700 [Nook Glowlight Plus]
+
 usb:v2086*
  ID_VENDOR_FROM_DATABASE=SIMPASS
 
@@ -57086,6 +62531,12 @@ usb:v2087p0B03*
 usb:v20A0*
  ID_VENDOR_FROM_DATABASE=Clay Logic
 
+usb:v20A0p0006*
+ ID_MODEL_FROM_DATABASE=flirc
+
+usb:v20A0p4107*
+ ID_MODEL_FROM_DATABASE=GPF Crypto Stick V1.2
+
 usb:v20A0p4123*
  ID_MODEL_FROM_DATABASE=IKALOGIC SCANALOGIC 2
 
@@ -57101,6 +62552,18 @@ usb:v20A0p415B*
 usb:v20A0p415C*
  ID_MODEL_FROM_DATABASE=PipXtreme
 
+usb:v20A0p41E5*
+ ID_MODEL_FROM_DATABASE=BlinkStick
+
+usb:v20A0p4211*
+ ID_MODEL_FROM_DATABASE=Nitrokey Start
+
+usb:v20A0p4223*
+ ID_MODEL_FROM_DATABASE=ATSAMD21 [castAR]
+
+usb:v20A0p428D*
+ ID_MODEL_FROM_DATABASE=Electrosense wideband converter
+
 usb:v20B1*
  ID_VENDOR_FROM_DATABASE=XMOS Ltd
 
@@ -57131,12 +62594,21 @@ usb:v20B7p1DB5*
 usb:v20B7p1DB6*
  ID_MODEL_FROM_DATABASE=IDBG in normal mode
 
+usb:v20B7p9DB1*
+ ID_MODEL_FROM_DATABASE=Glasgow Debug Tool
+
 usb:v20B7pC25B*
  ID_MODEL_FROM_DATABASE=C2 Dongle
 
 usb:v20B7pCB72*
  ID_MODEL_FROM_DATABASE=ben-wpan, cntr
 
+usb:v20BC*
+ ID_VENDOR_FROM_DATABASE=ShenZhen ShanWan Technology Co., Ltd.
+
+usb:v20BCp5500*
+ ID_MODEL_FROM_DATABASE=Frostbite controller
+
 usb:v20CE*
  ID_VENDOR_FROM_DATABASE=Minicircuits
 
@@ -57155,6 +62627,12 @@ usb:v20DF*
 usb:v20DFp0001*
  ID_MODEL_FROM_DATABASE=Entropy Key [UDEKEY01]
 
+usb:v20F0*
+ ID_VENDOR_FROM_DATABASE=L3Harris Technologies
+
+usb:v20F0p2102*
+ ID_MODEL_FROM_DATABASE=EWLA V2 Module
+
 usb:v20F1*
  ID_VENDOR_FROM_DATABASE=NET New Electronic Technology GmbH
 
@@ -57164,9 +62642,24 @@ usb:v20F1p0101*
 usb:v20F4*
  ID_VENDOR_FROM_DATABASE=TRENDnet
 
+usb:v20F4p646B*
+ ID_MODEL_FROM_DATABASE=TEW-646UBH High Power 150Mbps Wireless N Adapter [Realtek RTL8188SU]
+
 usb:v20F4p648B*
  ID_MODEL_FROM_DATABASE=TEW-648UBM 802.11n 150Mbps Micro Wireless N Adapter [Realtek RTL8188CUS]
 
+usb:v20F4p664B*
+ ID_MODEL_FROM_DATABASE=TEW-664UB H/W:V2.0R
+
+usb:v20F4p804B*
+ ID_MODEL_FROM_DATABASE=TEW-804UB 802.11a/b/g/n/ac (1x1) Wireless Adapter [Realtek RTL8811AU]
+
+usb:v20F4p805B*
+ ID_MODEL_FROM_DATABASE=TEW-805UB 300Mbps+867Mbps Wireless AC Adapter [Realtek RTL8812AU]
+
+usb:v20F4p806B*
+ ID_MODEL_FROM_DATABASE=TEW-806UBH 802.11a/b/g/n/ac (1x1) Wireless Adapter [MediaTek MT7610U]
+
 usb:v20F7*
  ID_VENDOR_FROM_DATABASE=XIMEA
 
@@ -57188,6 +62681,12 @@ usb:v20F7pA003*
 usb:v2100*
  ID_VENDOR_FROM_DATABASE=RT Systems
 
+usb:v2100p0E56*
+ ID_MODEL_FROM_DATABASE=USB62C Radio Cable [Yaesu 857/D - 897/D]
+
+usb:v2100p9E50*
+ ID_MODEL_FROM_DATABASE=USB-59 Radio Cable [Yaesu VX-8/D/DR]
+
 usb:v2100p9E52*
  ID_MODEL_FROM_DATABASE=Yaesu VX-7
 
@@ -57197,6 +62696,9 @@ usb:v2100p9E54*
 usb:v2100p9E57*
  ID_MODEL_FROM_DATABASE=RTS01 Radio Cable
 
+usb:v2100p9E58*
+ ID_MODEL_FROM_DATABASE=USB63C Radio Cable [Yaesu FTDX-1200]
+
 usb:v2100p9E5D*
  ID_MODEL_FROM_DATABASE=K4Y Radio Cable
 
@@ -57209,15 +62711,39 @@ usb:v2101*
 usb:v2101p0201*
  ID_MODEL_FROM_DATABASE=SIIG 4-to-2 Printer Switch
 
+usb:v2101p1402*
+ ID_MODEL_FROM_DATABASE=Keyboard/Mouse Switch
+
+usb:v2104*
+ ID_VENDOR_FROM_DATABASE=Tobii Technology AB
+
+usb:v2104p0050*
+ ID_MODEL_FROM_DATABASE=Eye tracker [EYEX2]
+
+usb:v2104p0124*
+ ID_MODEL_FROM_DATABASE=Eyechip
+
+usb:v2107*
+ ID_VENDOR_FROM_DATABASE=RDING TECH CO.,LTD
+
 usb:v2109*
  ID_VENDOR_FROM_DATABASE=VIA Labs, Inc.
 
+usb:v2109p0210*
+ ID_MODEL_FROM_DATABASE=Hub
+
 usb:v2109p0700*
  ID_MODEL_FROM_DATABASE=VL700 SATA 3Gb/s bridge
 
 usb:v2109p0701*
  ID_MODEL_FROM_DATABASE=VL701 SATA 3Gb/s bridge
 
+usb:v2109p0711*
+ ID_MODEL_FROM_DATABASE=VL711 SATA 6Gb/s bridge
+
+usb:v2109p0715*
+ ID_MODEL_FROM_DATABASE=VL817 SATA Adaptor
+
 usb:v2109p0810*
  ID_MODEL_FROM_DATABASE=VL81x Hub
 
@@ -57227,15 +62753,33 @@ usb:v2109p0811*
 usb:v2109p0812*
  ID_MODEL_FROM_DATABASE=VL812 Hub
 
+usb:v2109p0813*
+ ID_MODEL_FROM_DATABASE=VL813 Hub
+
+usb:v2109p0820*
+ ID_MODEL_FROM_DATABASE=VL820 Hub
+
+usb:v2109p2210*
+ ID_MODEL_FROM_DATABASE=Hub
+
 usb:v2109p2811*
  ID_MODEL_FROM_DATABASE=Hub
 
 usb:v2109p2812*
  ID_MODEL_FROM_DATABASE=VL812 Hub
 
+usb:v2109p2813*
+ ID_MODEL_FROM_DATABASE=VL813 Hub
+
+usb:v2109p2820*
+ ID_MODEL_FROM_DATABASE=VL820 Hub
+
 usb:v2109p3431*
  ID_MODEL_FROM_DATABASE=Hub
 
+usb:v2109p711F*
+ ID_MODEL_FROM_DATABASE=External
+
 usb:v2109p8110*
  ID_MODEL_FROM_DATABASE=Hub
 
@@ -57251,17 +62795,77 @@ usb:v2113p0145*
 usb:v2113p8000*
  ID_MODEL_FROM_DATABASE=DepthSense 311 (Color)
 
+usb:v2116*
+ ID_VENDOR_FROM_DATABASE=KT Tech
+
+usb:v2116p000A*
+ ID_MODEL_FROM_DATABASE=IDE Hard Drive Enclosure
+
+usb:v211F*
+ ID_VENDOR_FROM_DATABASE=CELOT Corporation
+
+usb:v211Fp6801*
+ ID_MODEL_FROM_DATABASE=CDMA Products
+
+usb:v2123*
+ ID_VENDOR_FROM_DATABASE=Cheeky Dream
+
+usb:v2123p1010*
+ ID_MODEL_FROM_DATABASE=Rocket Launcher
+
+usb:v2125*
+ ID_VENDOR_FROM_DATABASE=Fiberpro Inc.
+
+usb:v2125p0000*
+ ID_MODEL_FROM_DATABASE=Bootloader
+
+usb:v2125p0010*
+ ID_MODEL_FROM_DATABASE=MCB-100 Series
+
+usb:v2133*
+ ID_VENDOR_FROM_DATABASE=signotec GmbH
+
+usb:v2133p0001*
+ ID_MODEL_FROM_DATABASE=LCD Signature Pad Sigma
+
+usb:v2133p0018*
+ ID_MODEL_FROM_DATABASE=Delta Pen
+
+usb:v2133p0019*
+ ID_MODEL_FROM_DATABASE=Delta Touch
+
+usb:v2133p001C*
+ ID_MODEL_FROM_DATABASE=Kronos Pen
+
+usb:v2133p0022*
+ ID_MODEL_FROM_DATABASE=Epsilon Pen
+
 usb:v2149*
  ID_VENDOR_FROM_DATABASE=Advanced Silicon S.A.
 
 usb:v2149p211B*
  ID_MODEL_FROM_DATABASE=Touchscreen Controller
 
+usb:v2149p2306*
+ ID_MODEL_FROM_DATABASE=TS58xxA/TC56xxA [CoolTouch]
+
 usb:v2149p2703*
  ID_MODEL_FROM_DATABASE=TS58xxA/TC56xxA [CoolTouch]
 
+usb:v214B*
+ ID_VENDOR_FROM_DATABASE=Huasheng Electronics
+
+usb:v214Bp7000*
+ ID_MODEL_FROM_DATABASE=4-port hub [Maxxter ACT-HUB2-4P, HS8836, iSoul ultra-slim]
+
+usb:v214E*
+ ID_VENDOR_FROM_DATABASE=Swiftpoint
+
+usb:v214Ep0005*
+ ID_MODEL_FROM_DATABASE=Z - Gaming mouse [SM700]
+
 usb:v2162*
- ID_VENDOR_FROM_DATABASE=Creative (?)
+ ID_VENDOR_FROM_DATABASE=Broadxent (Creative Labs)
 
 usb:v2162p2031*
  ID_MODEL_FROM_DATABASE=Network Blaster Wireless Adapter
@@ -57272,6 +62876,12 @@ usb:v2162p500C*
 usb:v2162p8001*
  ID_MODEL_FROM_DATABASE=Broadxent BritePort DSL Bridge 8010U
 
+usb:v2166*
+ ID_VENDOR_FROM_DATABASE=JVC Kenwood
+
+usb:v2166p600B*
+ ID_MODEL_FROM_DATABASE=TH-D74
+
 usb:v2184*
  ID_VENDOR_FROM_DATABASE=GW Instek
 
@@ -57284,12 +62894,93 @@ usb:v2184p0006*
 usb:v2184p0011*
  ID_MODEL_FROM_DATABASE=AFG Function Generator (CDC)
 
+usb:v2184p0017*
+ ID_MODEL_FROM_DATABASE=DSO
+
+usb:v2184p0018*
+ ID_MODEL_FROM_DATABASE=DSO
+
+usb:v2184p0036*
+ ID_MODEL_FROM_DATABASE=AFG-125 Function Generator (CDC)
+
+usb:v2188*
+ ID_VENDOR_FROM_DATABASE=No brand
+
+usb:v2188p0610*
+ ID_MODEL_FROM_DATABASE=Hub
+
+usb:v2188p0611*
+ ID_MODEL_FROM_DATABASE=Hub
+
+usb:v2188p0620*
+ ID_MODEL_FROM_DATABASE=Hub
+
+usb:v2188p0625*
+ ID_MODEL_FROM_DATABASE=Hub
+
+usb:v2188p0754*
+ ID_MODEL_FROM_DATABASE=Card Reader
+
+usb:v2188p4042*
+ ID_MODEL_FROM_DATABASE=CalDigit Pro Audio
+
+usb:v219C*
+ ID_VENDOR_FROM_DATABASE=Seal One AG
+
+usb:v219Cp0010*
+ ID_MODEL_FROM_DATABASE=USB 2200 K Secure Sign Token
+
 usb:v21A1*
  ID_VENDOR_FROM_DATABASE=Emotiv Systems Pty. Ltd.
 
 usb:v21A1p0001*
  ID_MODEL_FROM_DATABASE=EPOC Consumer Headset Wireless Dongle
 
+usb:v21A4*
+ ID_VENDOR_FROM_DATABASE=Electronic Arts Inc.
+
+usb:v21A4pAC27*
+ ID_MODEL_FROM_DATABASE=SPORTS Active 2 Wireless Controller for PS3
+
+usb:v21A4pAC40*
+ ID_MODEL_FROM_DATABASE=SPORTS Active 2 Wireless Controller for Wii
+
+usb:v21A9*
+ ID_VENDOR_FROM_DATABASE=Saleae, Inc.
+
+usb:v21A9p1001*
+ ID_MODEL_FROM_DATABASE=16-channel Logic Analyzer [Logic16]
+
+usb:v21A9p1003*
+ ID_MODEL_FROM_DATABASE=Logic 4
+
+usb:v21A9p1004*
+ ID_MODEL_FROM_DATABASE=Logic8
+
+usb:v21A9p1005*
+ ID_MODEL_FROM_DATABASE=Logic Pro 8
+
+usb:v21A9p1006*
+ ID_MODEL_FROM_DATABASE=Logic Pro 16
+
+usb:v21AB*
+ ID_VENDOR_FROM_DATABASE=Planeta Informatica
+
+usb:v21ABp0010*
+ ID_MODEL_FROM_DATABASE=RC700 NFC SmartCard Reader
+
+usb:v21ABp0011*
+ ID_MODEL_FROM_DATABASE=DSR700 SmartCard Reader
+
+usb:v21B4*
+ ID_VENDOR_FROM_DATABASE=AudioQuest
+
+usb:v21B4p0081*
+ ID_MODEL_FROM_DATABASE=DragonFly
+
+usb:v21B4p0082*
+ ID_MODEL_FROM_DATABASE=DragonFly Red
+
 usb:v21D6*
  ID_VENDOR_FROM_DATABASE=Agecodagis SARL
 
@@ -57353,30 +63044,66 @@ usb:v2207p330A*
 usb:v2207p330C*
  ID_MODEL_FROM_DATABASE=RK3399 in Mask ROM mode
 
+usb:v221A*
+ ID_VENDOR_FROM_DATABASE=ZTEX GmbH
+
+usb:v221Ap0100*
+ ID_MODEL_FROM_DATABASE=FPGA Boards
+
 usb:v2222*
  ID_VENDOR_FROM_DATABASE=MacAlly
 
 usb:v2222p0004*
  ID_MODEL_FROM_DATABASE=iWebKey Keyboard
 
+usb:v2222p0005*
+ ID_MODEL_FROM_DATABASE=ICEKey Keyboard
+
+usb:v2222p1001*
+ ID_MODEL_FROM_DATABASE=Generic Hub
+
 usb:v2222p2520*
  ID_MODEL_FROM_DATABASE=Mini Tablet
 
 usb:v2222p4050*
  ID_MODEL_FROM_DATABASE=AirStick joystick
 
+usb:v2226*
+ ID_VENDOR_FROM_DATABASE=Copper Mountain technologies
+
 usb:v2227*
  ID_VENDOR_FROM_DATABASE=SAMWOO Enterprise
 
 usb:v2227p3105*
  ID_MODEL_FROM_DATABASE=SKYDATA SKD-U100
 
+usb:v222A*
+ ID_VENDOR_FROM_DATABASE=ILI Technology Corp.
+
+usb:v222Ap0001*
+ ID_MODEL_FROM_DATABASE=Multi-Touch Screen
+
+usb:v222Ap0037*
+ ID_MODEL_FROM_DATABASE=Multi-Touch Screen
+
+usb:v2230*
+ ID_VENDOR_FROM_DATABASE=Plugable
+
+usb:v2230p0001*
+ ID_MODEL_FROM_DATABASE=UD-160-A / M Integrated Hub
+
+usb:v2230p0003*
+ ID_MODEL_FROM_DATABASE=DC-125 / M Integrated Hub
+
 usb:v2232*
  ID_VENDOR_FROM_DATABASE=Silicon Motion
 
 usb:v2232p1005*
  ID_MODEL_FROM_DATABASE=WebCam SCB-0385N
 
+usb:v2232p1024*
+ ID_MODEL_FROM_DATABASE=Webcam SC-13HDL11624N [Namuga Co., Ltd.]
+
 usb:v2232p1028*
  ID_MODEL_FROM_DATABASE=WebCam SC-03FFL11939N
 
@@ -57386,6 +63113,9 @@ usb:v2232p1029*
 usb:v2232p1037*
  ID_MODEL_FROM_DATABASE=WebCam SC-03FFM12339N
 
+usb:v2232p1045*
+ ID_MODEL_FROM_DATABASE=WebCam SC-10HDP12631N
+
 usb:v2233*
  ID_VENDOR_FROM_DATABASE=RadioShack Corporation
 
@@ -57398,6 +63128,18 @@ usb:v2237*
 usb:v2237p4161*
  ID_MODEL_FROM_DATABASE=eReader White
 
+usb:v2237p4163*
+ ID_MODEL_FROM_DATABASE=Touch
+
+usb:v2237p4173*
+ ID_MODEL_FROM_DATABASE=Glo
+
+usb:v2245*
+ ID_VENDOR_FROM_DATABASE=Aspeed Technology, Inc.
+
+usb:v2245p1500*
+ ID_MODEL_FROM_DATABASE=AST1500/1510 PC-over-LAN Virtual Hub
+
 usb:v224F*
  ID_VENDOR_FROM_DATABASE=APDM
 
@@ -57422,6 +63164,12 @@ usb:v224Fp0007*
 usb:v224Fp0008*
  ID_MODEL_FROM_DATABASE=V2 Access Point
 
+usb:v2256*
+ ID_VENDOR_FROM_DATABASE=Faderfox
+
+usb:v2256p1007*
+ ID_MODEL_FROM_DATABASE=LV3 MIDI Controller
+
 usb:v225D*
  ID_VENDOR_FROM_DATABASE=Morpho
 
@@ -57432,35 +63180,86 @@ usb:v225Dp0008*
  ID_MODEL_FROM_DATABASE=CBM-E3 Fingerprint Sensor
 
 usb:v225Dp0009*
- ID_MODEL_FROM_DATABASE=CBM Fingerprint Sensor [CBM-V3]
+ ID_MODEL_FROM_DATABASE=CBM-V3 Fingerprint Sensor
 
 usb:v225Dp000A*
  ID_MODEL_FROM_DATABASE=MSO1300-E3 Fingerprint Sensor
 
 usb:v225Dp000B*
- ID_MODEL_FROM_DATABASE=MSO1300 Fingerprint Sensor [MSO1300-V3]
+ ID_MODEL_FROM_DATABASE=MSO1300-V3 Fingerprint Sensor
 
 usb:v225Dp000C*
  ID_MODEL_FROM_DATABASE=MSO1350-E3 Fingerprint Sensor & SmartCard Reader
 
 usb:v225Dp000D*
- ID_MODEL_FROM_DATABASE=MSO1350 Fingerprint Sensor & SmartCard Reader [MSO1350-V3]
+ ID_MODEL_FROM_DATABASE=MSO1350-V3 Fingerprint Sensor & SmartCard Reader
 
 usb:v225Dp000E*
  ID_MODEL_FROM_DATABASE=MorphoAccess SIGMA Biometric Access Control Terminal
 
+usb:v225Dp9015*
+ ID_MODEL_FROM_DATABASE=Tablet 2
+
+usb:v225Dp9024*
+ ID_MODEL_FROM_DATABASE=Tablet 2
+
+usb:v225Dp9039*
+ ID_MODEL_FROM_DATABASE=Tablet 2 secure multifunction biometric tablet
+
+usb:v225Dp904D*
+ ID_MODEL_FROM_DATABASE=Tablet 2 secure multifunction biometric tablet
+
+usb:v225Dp904E*
+ ID_MODEL_FROM_DATABASE=Tablet 2 secure multifunction biometric tablet
+
+usb:v225Dp9091*
+ ID_MODEL_FROM_DATABASE=Tablet 2 secure multifunction biometric tablet
+
+usb:v225Dp9092*
+ ID_MODEL_FROM_DATABASE=Tablet 2 secure multifunction biometric tablet
+
+usb:v225DpF000*
+ ID_MODEL_FROM_DATABASE=Tablet 2 secure multifunction biometric tablet
+
+usb:v225DpF003*
+ ID_MODEL_FROM_DATABASE=Tablet 2 secure multifunction biometric tablet
+
+usb:v225DpF006*
+ ID_MODEL_FROM_DATABASE=Tablet 2 secure multifunction biometric tablet
+
+usb:v225DpF00E*
+ ID_MODEL_FROM_DATABASE=Tablet 2 secure multifunction biometric tablet
+
+usb:v226E*
+ ID_VENDOR_FROM_DATABASE=DISPLAX
+
 usb:v228D*
  ID_VENDOR_FROM_DATABASE=8D Technologies inc.
 
 usb:v228Dp0001*
  ID_MODEL_FROM_DATABASE=Terminal Bike Key Reader
 
+usb:v22A4*
+ ID_VENDOR_FROM_DATABASE=VERZO Technology
+
 usb:v22A6*
  ID_VENDOR_FROM_DATABASE=Pie Digital, Inc.
 
 usb:v22A6pFFFF*
  ID_MODEL_FROM_DATABASE=PieKey "beta" 4GB model 4E4F41482E4F5247 (SM3251Q BB)
 
+usb:v22A7*
+ ID_VENDOR_FROM_DATABASE=Fortinet Technologies
+
+usb:v22A7p1001*
+ ID_MODEL_FROM_DATABASE=FortiGate Device
+
+usb:v22B1*
+ ID_VENDOR_FROM_DATABASE=Secret Labs LLC
+
+usb:v22B1p1000*
+ ID_MODEL_FROM_DATABASE=Netduino MCU pcb
+
 usb:v22B8*
  ID_VENDOR_FROM_DATABASE=Motorola PCS
 
@@ -57473,6 +63272,9 @@ usb:v22B8p0002*
 usb:v22B8p0005*
  ID_MODEL_FROM_DATABASE=V.60c/V.60i GSM Phone
 
+usb:v22B8p002E*
+ ID_MODEL_FROM_DATABASE=XT1806
+
 usb:v22B8p0830*
  ID_MODEL_FROM_DATABASE=2386C-HT820
 
@@ -57563,6 +63365,12 @@ usb:v22B8p2AC3*
 usb:v22B8p2D78*
  ID_MODEL_FROM_DATABASE=XT300[SPICE]
 
+usb:v22B8p2E82*
+ ID_MODEL_FROM_DATABASE=XT1541 [Moto G 3rd Gen]
+
+usb:v22B8p2E83*
+ ID_MODEL_FROM_DATABASE=XT1033 [Moto G], PTP mode
+
 usb:v22B8p3001*
  ID_MODEL_FROM_DATABASE=A835/E1000 GSM Phone (P2K)
 
@@ -57620,6 +63428,9 @@ usb:v22B8p4244*
 usb:v22B8p4285*
  ID_MODEL_FROM_DATABASE=Droid X (Mass storage)
 
+usb:v22B8p42D9*
+ ID_MODEL_FROM_DATABASE=XT910 [Droid RAZR]
+
 usb:v22B8p4801*
  ID_MODEL_FROM_DATABASE=Neptune LTS chipset
 
@@ -57710,9 +63521,18 @@ usb:v22B8p6401*
 usb:v22B8p6403*
  ID_MODEL_FROM_DATABASE=Argon chipset flash
 
+usb:v22B8p6411*
+ ID_MODEL_FROM_DATABASE=ROKR Z6 (print mode)
+
 usb:v22B8p6415*
  ID_MODEL_FROM_DATABASE=ROKR Z6 (MTP mode)
 
+usb:v22B8p6422*
+ ID_MODEL_FROM_DATABASE=ROKR Z6 (modem mode)
+
+usb:v22B8p6426*
+ ID_MODEL_FROM_DATABASE=ROKR Z6 (storage mode)
+
 usb:v22B8p6604*
  ID_MODEL_FROM_DATABASE=Washington CDMA Phone
 
@@ -57722,6 +63542,12 @@ usb:v22B8p6631*
 usb:v22B8p7001*
  ID_MODEL_FROM_DATABASE=Q Smartphone
 
+usb:v22B8p7086*
+ ID_MODEL_FROM_DATABASE=Atrix
+
+usb:v22B8p70A8*
+ ID_MODEL_FROM_DATABASE=Xoom Tablet
+
 usb:v22B8pFE01*
  ID_MODEL_FROM_DATABASE=StarTAC III MS900
 
@@ -57734,6 +63560,90 @@ usb:v22B9p0006*
 usb:v22BA*
  ID_VENDOR_FROM_DATABASE=Technology Innovation Holdings, Ltd
 
+usb:v22BAp0108*
+ ID_MODEL_FROM_DATABASE=Double Shock Steering Wheel HID
+
+usb:v22BAp0109*
+ ID_MODEL_FROM_DATABASE=Double Shock Steering Wheel Hub
+
+usb:v22C9*
+ ID_VENDOR_FROM_DATABASE=StepOver GmbH
+
+usb:v22C9p0601*
+ ID_MODEL_FROM_DATABASE=naturaSign Pad Colour
+
+usb:v22C9p0701*
+ ID_MODEL_FROM_DATABASE=naturaSign Pad Mobile
+
+usb:v22C9p0801*
+ ID_MODEL_FROM_DATABASE=naturaSign Pad Comfort
+
+usb:v22C9p0881*
+ ID_MODEL_FROM_DATABASE=naturaSign Pad Flawless
+
+usb:v22C9p0901*
+ ID_MODEL_FROM_DATABASE=naturaSign Pad Classic
+
+usb:v22C9p09E1*
+ ID_MODEL_FROM_DATABASE=naturaSign Pad Biometric
+
+usb:v22C9p0CE1*
+ ID_MODEL_FROM_DATABASE=duraSign Pad Brilliance
+
+usb:v22C9p0CF1*
+ ID_MODEL_FROM_DATABASE=duraSign Pad Biometric 5.0
+
+usb:v22C9p0D01*
+ ID_MODEL_FROM_DATABASE=duraSign 10.0
+
+usb:v22C9p0DF1*
+ ID_MODEL_FROM_DATABASE=duraSign Pad Biometric 10.0
+
+usb:v22CD*
+ ID_VENDOR_FROM_DATABASE=Kinova Robotics Inc.
+
+usb:v22D4*
+ ID_VENDOR_FROM_DATABASE=Laview Technology
+
+usb:v22D4p1301*
+ ID_MODEL_FROM_DATABASE=Mionix NAOS 8200 [STM32F103 MCU]
+
+usb:v22D4p1308*
+ ID_MODEL_FROM_DATABASE=Mionix Avior 7000
+
+usb:v22D4p130C*
+ ID_MODEL_FROM_DATABASE=Mionix Naos 7000
+
+usb:v22D4p1316*
+ ID_MODEL_FROM_DATABASE=Mionix Castor
+
+usb:v22D9*
+ ID_VENDOR_FROM_DATABASE=OPPO Electronics Corp.
+
+usb:v22D9p2765*
+ ID_MODEL_FROM_DATABASE=Oppo N1
+
+usb:v22D9p2767*
+ ID_MODEL_FROM_DATABASE=Oppo Find 5 (X909)
+
+usb:v22DB*
+ ID_VENDOR_FROM_DATABASE=Phase One
+
+usb:v22DBp0003*
+ ID_MODEL_FROM_DATABASE=IQ3 100MP IG030372
+
+usb:v22DC*
+ ID_VENDOR_FROM_DATABASE=Mellanox Technologies
+
+usb:v22DCp0004*
+ ID_MODEL_FROM_DATABASE=BlueField SOC
+
+usb:v22DE*
+ ID_VENDOR_FROM_DATABASE=WeTelecom Incorporated
+
+usb:v22DF*
+ ID_VENDOR_FROM_DATABASE=Medicom MTD, Ltd
+
 usb:v22E0*
  ID_VENDOR_FROM_DATABASE=secunet Security Networks AG
 
@@ -57743,6 +63653,51 @@ usb:v22E0p0002*
 usb:v22E0p0003*
  ID_MODEL_FROM_DATABASE=SINA ID Token A
 
+usb:v22E8*
+ ID_VENDOR_FROM_DATABASE=Cambridge Audio
+
+usb:v22E8p6512*
+ ID_MODEL_FROM_DATABASE=651N Audio
+
+usb:v22E8p6969*
+ ID_MODEL_FROM_DATABASE=Audio Prototype
+
+usb:v22E8p7512*
+ ID_MODEL_FROM_DATABASE=751R Audio
+
+usb:v22E8p770A*
+ ID_MODEL_FROM_DATABASE=X70A Audio
+
+usb:v22E8p850C*
+ ID_MODEL_FROM_DATABASE=851C Audio [Azur 850C]
+
+usb:v22E8p851D*
+ ID_MODEL_FROM_DATABASE=851D Audio [Azur 851D]
+
+usb:v22E8pCA02*
+ ID_MODEL_FROM_DATABASE=Audio
+
+usb:v22E8pCA04*
+ ID_MODEL_FROM_DATABASE=Audio
+
+usb:v22E8pCA06*
+ ID_MODEL_FROM_DATABASE=AmpMagic
+
+usb:v22E8pDAC2*
+ ID_MODEL_FROM_DATABASE=DacMagic Plus
+
+usb:v22E8pDAC3*
+ ID_MODEL_FROM_DATABASE=Azur DacMagic 100
+
+usb:v22E8pDAC4*
+ ID_MODEL_FROM_DATABASE=Azur DacMagic 100
+
+usb:v22E8pDAC6*
+ ID_MODEL_FROM_DATABASE=DacMagicXS 2.0
+
+usb:v22E8pDAC8*
+ ID_MODEL_FROM_DATABASE=Audio
+
 usb:v2304*
  ID_VENDOR_FROM_DATABASE=Pinnacle Systems, Inc.
 
@@ -57881,12 +63836,45 @@ usb:v2304p061D*
 usb:v2304p061E*
  ID_MODEL_FROM_DATABASE=PCTV Deluxe (PAL) Device
 
+usb:v2304p2304*
+ ID_MODEL_FROM_DATABASE=1689
+
+usb:v230D*
+ ID_VENDOR_FROM_DATABASE=Teracom
+
+usb:v230Dp0103*
+ ID_MODEL_FROM_DATABASE=Huwaii 3g wireless modem
+
+usb:v2314*
+ ID_VENDOR_FROM_DATABASE=INQ Mobile
+
 usb:v2318*
  ID_VENDOR_FROM_DATABASE=Shining Technologies, Inc. [hex]
 
 usb:v2318p0011*
  ID_MODEL_FROM_DATABASE=CitiDISK Jr. IDE Enclosure
 
+usb:v2319*
+ ID_VENDOR_FROM_DATABASE=Tronsmart
+
+usb:v2319p0014*
+ ID_MODEL_FROM_DATABASE=TSM01 Air Mouse + Keyboard
+
+usb:v232B*
+ ID_VENDOR_FROM_DATABASE=Pantum Ltd.
+
+usb:v232Bp0810*
+ ID_MODEL_FROM_DATABASE=P2000
+
+usb:v232E*
+ ID_VENDOR_FROM_DATABASE=EA Elektro-Automatik GmbH & Co. KG
+
+usb:v232Ep0010*
+ ID_MODEL_FROM_DATABASE=EA-PS-2000 B Series Power Supply
+
+usb:v2340*
+ ID_VENDOR_FROM_DATABASE=Teleepoch
+
 usb:v2341*
  ID_VENDOR_FROM_DATABASE=Arduino SA
 
@@ -57896,9 +63884,18 @@ usb:v2341p0001*
 usb:v2341p0010*
  ID_MODEL_FROM_DATABASE=Mega 2560 (CDC ACM)
 
+usb:v2341p0036*
+ ID_MODEL_FROM_DATABASE=Leonardo Bootloader
+
 usb:v2341p003B*
  ID_MODEL_FROM_DATABASE=Serial Adapter (CDC ACM)
 
+usb:v2341p003D*
+ ID_MODEL_FROM_DATABASE=Due Programming Port
+
+usb:v2341p003E*
+ ID_MODEL_FROM_DATABASE=Due
+
 usb:v2341p003F*
  ID_MODEL_FROM_DATABASE=Mega ADK (CDC ACM)
 
@@ -57914,12 +63911,36 @@ usb:v2341p0044*
 usb:v2341p0045*
  ID_MODEL_FROM_DATABASE=Serial R3 (CDC ACM)
 
+usb:v2341p0049*
+ ID_MODEL_FROM_DATABASE=ISP
+
 usb:v2341p8036*
  ID_MODEL_FROM_DATABASE=Leonardo (CDC ACM, HID)
 
+usb:v2341p8038*
+ ID_MODEL_FROM_DATABASE=Robot Control Board (CDC ACM, HID)
+
+usb:v2341p8039*
+ ID_MODEL_FROM_DATABASE=Robot Motor Board (CDC ACM, HID)
+
+usb:v2349*
+ ID_VENDOR_FROM_DATABASE=P2 Engineering Group, LLC
+
+usb:v234B*
+ ID_VENDOR_FROM_DATABASE=Free Software Initiative of Japan
+
+usb:v234Bp0000*
+ ID_MODEL_FROM_DATABASE=Gnuk Token
+
+usb:v234Bp0001*
+ ID_MODEL_FROM_DATABASE=NeuG True RNG
+
 usb:v2357*
  ID_VENDOR_FROM_DATABASE=TP-Link
 
+usb:v2357p0005*
+ ID_MODEL_FROM_DATABASE=M7350 4G Mi-Fi Router
+
 usb:v2357p0100*
  ID_MODEL_FROM_DATABASE=TL-WN8200ND [Realtek RTL8192CU]
 
@@ -57936,19 +63957,40 @@ usb:v2357p0106*
  ID_MODEL_FROM_DATABASE=Archer T9UH v1 [Realtek RTL8814AU]
 
 usb:v2357p0107*
- ID_MODEL_FROM_DATABASE=TL-WN821N Version 5 RTL8192EU
+ ID_MODEL_FROM_DATABASE=TL-WN821N v5/v6 [RTL8192EU]
 
 usb:v2357p0108*
  ID_MODEL_FROM_DATABASE=TL-WN822N Version 4 RTL8192EU
 
 usb:v2357p0109*
- ID_MODEL_FROM_DATABASE=TL WN823N RTL8192EU
+ ID_MODEL_FROM_DATABASE=TL-WN823N v2/v3 [Realtek RTL8192EU]
+
+usb:v2357p010B*
+ ID_MODEL_FROM_DATABASE=Archer T2UHP [MediaTek MT7610U]
 
 usb:v2357p010C*
- ID_MODEL_FROM_DATABASE=TL-WN722N v2
+ ID_MODEL_FROM_DATABASE=TL-WN722N v2/v3 [Realtek RTL8188EUS]
+
+usb:v2357p010D*
+ ID_MODEL_FROM_DATABASE=Archer T4U v2 [Realtek RTL8812AU]
 
 usb:v2357p010E*
- ID_MODEL_FROM_DATABASE=TL-WN722N v2
+ ID_MODEL_FROM_DATABASE=Archer T4UH v2 [Realtek RTL8812AU]
+
+usb:v2357p010F*
+ ID_MODEL_FROM_DATABASE=Archer T4UHP [Realtek RTL8812AU]
+
+usb:v2357p0115*
+ ID_MODEL_FROM_DATABASE=Archer T4U ver.3
+
+usb:v2357p011E*
+ ID_MODEL_FROM_DATABASE=AC600 wireless Realtek RTL8811AU [Archer T2U Nano]
+
+usb:v2357p0120*
+ ID_MODEL_FROM_DATABASE=Archer T2U PLUS [RTL8821AU]
+
+usb:v2357p012D*
+ ID_MODEL_FROM_DATABASE=Archer T3U [Realtek RTL8812BU]
 
 usb:v2357p0200*
  ID_MODEL_FROM_DATABASE=MA 180 Zero CD
@@ -57956,6 +63998,66 @@ usb:v2357p0200*
 usb:v2357p0201*
  ID_MODEL_FROM_DATABASE=HSUPA Modem MA180
 
+usb:v2357p0600*
+ ID_MODEL_FROM_DATABASE=UE300 10/100/1000 LAN (mass storage CD-ROM mode) [Realtek RTL8153]
+
+usb:v2357p0601*
+ ID_MODEL_FROM_DATABASE=UE300 10/100/1000 LAN (ethernet mode) [Realtek RTL8153]
+
+usb:v2366*
+ ID_VENDOR_FROM_DATABASE=Bitmanufaktur GmbH
+
+usb:v2366p0001*
+ ID_MODEL_FROM_DATABASE=Reserved Prototyping PID
+
+usb:v2366p0002*
+ ID_MODEL_FROM_DATABASE=OpenBeacon USB 2
+
+usb:v2366p0003*
+ ID_MODEL_FROM_DATABASE=OpenPCD 2 RFID Reader for 13.56MHz
+
+usb:v2366p0004*
+ ID_MODEL_FROM_DATABASE=OpenBeacon
+
+usb:v2366p0005*
+ ID_MODEL_FROM_DATABASE=Blinkenlights WDIM
+
+usb:v2366p0006*
+ ID_MODEL_FROM_DATABASE=Blinkenlights WMCU
+
+usb:v2366p0007*
+ ID_MODEL_FROM_DATABASE=OpenBeacon Ethernet EasyReader PoE II - Active 2.4GHz RFID Reader
+
+usb:v2366p0008*
+ ID_MODEL_FROM_DATABASE=OpenBeacon WLAN
+
+usb:v2366p0009*
+ ID_MODEL_FROM_DATABASE=OpenPCD 2 RFID Reader for 13.56MHz
+
+usb:v2366p000A*
+ ID_MODEL_FROM_DATABASE=OpenPCD 2 Audio & LCD Display
+
+usb:v2367*
+ ID_VENDOR_FROM_DATABASE=Teenage Engineering
+
+usb:v2367p0002*
+ ID_MODEL_FROM_DATABASE=OP-1 Portable synthesizer
+
+usb:v2367p000C*
+ ID_MODEL_FROM_DATABASE=OP-Z Portable synthesizer
+
+usb:v2368*
+ ID_VENDOR_FROM_DATABASE=Peterson Electro-Musical Products Inc.
+
+usb:v2368p0001*
+ ID_MODEL_FROM_DATABASE=BBS-1 [BodyBeat Sync]
+
+usb:v236A*
+ ID_VENDOR_FROM_DATABASE=SiBEAM
+
+usb:v236Ap1965*
+ ID_MODEL_FROM_DATABASE=SB6501 802.11ad Wireless Network Adapter
+
 usb:v2373*
  ID_VENDOR_FROM_DATABASE=Pumatronix Ltda
 
@@ -57968,18 +64070,195 @@ usb:v2375*
 usb:v2375p0001*
  ID_MODEL_FROM_DATABASE=Digital Audio Player
 
+usb:v2378*
+ ID_VENDOR_FROM_DATABASE=OnLive
+
+usb:v2378p100A*
+ ID_MODEL_FROM_DATABASE=Universal Wireless Controller
+
+usb:v237D*
+ ID_VENDOR_FROM_DATABASE=Cradlepoint
+
+usb:v237Dp0400*
+ ID_MODEL_FROM_DATABASE=MC400
+
+usb:v2386*
+ ID_VENDOR_FROM_DATABASE=Raydium Corporation
+
+usb:v2386p3125*
+ ID_MODEL_FROM_DATABASE=Touch System
+
+usb:v2386p4328*
+ ID_MODEL_FROM_DATABASE=Touch System
+
+usb:v2386p432F*
+ ID_MODEL_FROM_DATABASE=Touch System
+
+usb:v238B*
+ ID_VENDOR_FROM_DATABASE=Hytera Communications
+
+usb:v238Bp0A11*
+ ID_MODEL_FROM_DATABASE=DMR Radio
+
+usb:v239A*
+ ID_VENDOR_FROM_DATABASE=Adafruit
+
+usb:v239Ap0001*
+ ID_MODEL_FROM_DATABASE=CDC Bootloader
+
+usb:v239Ap801E*
+ ID_MODEL_FROM_DATABASE=Trinket M0
+
+usb:v23A0*
+ ID_VENDOR_FROM_DATABASE=BIFIT
+
+usb:v23A0p0001*
+ ID_MODEL_FROM_DATABASE=Token iBank2key
+
+usb:v23A0p0002*
+ ID_MODEL_FROM_DATABASE=iBank2Key Type M Token
+
+usb:v23A0p0003*
+ ID_MODEL_FROM_DATABASE=iToken
+
+usb:v23A0p0008*
+ ID_MODEL_FROM_DATABASE=MS_KEY K - Angara
+
+usb:v23A6*
+ ID_VENDOR_FROM_DATABASE=Tronical Components GmbH
+
+usb:v23A6p2000*
+ ID_MODEL_FROM_DATABASE=Gibson Firebird X Pedal Board
+
+usb:v23A6p2001*
+ ID_MODEL_FROM_DATABASE=Gibson Firebird X Switch Board
+
+usb:v23B4*
+ ID_VENDOR_FROM_DATABASE=Dental Wings Inc.
+
+usb:v23B4p0200*
+ ID_MODEL_FROM_DATABASE=DW0200 Color Camera
+
+usb:v23B4p0300*
+ ID_MODEL_FROM_DATABASE=DW0300 Hight Speed Monochrome Camera
+
+usb:v23C7*
+ ID_VENDOR_FROM_DATABASE=Gemini
+
+usb:v23C7p1021*
+ ID_MODEL_FROM_DATABASE=FirstMix
+
+usb:v23FC*
+ ID_VENDOR_FROM_DATABASE=SesKion GmbH
+
+usb:v23FCp0201*
+ ID_MODEL_FROM_DATABASE=SPI-Simulyzer box for SPI data communication
+
+usb:v23FCp0202*
+ ID_MODEL_FROM_DATABASE=PSI5-Simulyzer box for PSI5 (Peripheral-Sensor-Interfacs) data communication
+
+usb:v23FCp0203*
+ ID_MODEL_FROM_DATABASE=SENT-Simulyzer box for SENT data communication
+
+usb:v23FCp0204*
+ ID_MODEL_FROM_DATABASE=DSI-Simulyzer box for DSI3 data communication
+
+usb:v2405*
+ ID_VENDOR_FROM_DATABASE=Custom Computer Services, Inc
+
+usb:v2405p0002*
+ ID_MODEL_FROM_DATABASE=West Mountain Radio RIGblaster Advantage Audio
+
+usb:v2405p0003*
+ ID_MODEL_FROM_DATABASE=West Mountain Radio RIGblaster Advantage
+
 usb:v2406*
  ID_VENDOR_FROM_DATABASE=SANHO Digital Electronics Co., Ltd.
 
 usb:v2406p6688*
  ID_MODEL_FROM_DATABASE=PD7X Portable Storage
 
+usb:v2420*
+ ID_VENDOR_FROM_DATABASE=IRiver
+
+usb:v242E*
+ ID_VENDOR_FROM_DATABASE=Vossloh-Schwabe Deutschland GmbH
+
+usb:v242Ep0001*
+ ID_MODEL_FROM_DATABASE=DALI Master
+
+usb:v242Ep0002*
+ ID_MODEL_FROM_DATABASE=LiCS Bootloader Mode
+
+usb:v242Ep0003*
+ ID_MODEL_FROM_DATABASE=LiCS Running Mode
+
+usb:v242Ep0004*
+ ID_MODEL_FROM_DATABASE=iProgrammer
+
+usb:v242Ep0005*
+ ID_MODEL_FROM_DATABASE=NFC programming device
+
+usb:v2433*
+ ID_VENDOR_FROM_DATABASE=ASETEK
+
+usb:v2433pB200*
+ ID_MODEL_FROM_DATABASE=[NZXT Kraken X60]
+
 usb:v2443*
  ID_VENDOR_FROM_DATABASE=Aessent Technology Ltd
 
 usb:v2443p00DC*
  ID_MODEL_FROM_DATABASE=aes220 FPGA Mini-Module
 
+usb:v2457*
+ ID_VENDOR_FROM_DATABASE=Ocean Optics Inc.
+
+usb:v2457p100A*
+ ID_MODEL_FROM_DATABASE=HR2000 Spectrometer 1.00.0
+
+usb:v2457p1012*
+ ID_MODEL_FROM_DATABASE=HR4000 Spectrometer
+
+usb:v2458*
+ ID_VENDOR_FROM_DATABASE=Bluegiga Technologies
+
+usb:v2458p0001*
+ ID_MODEL_FROM_DATABASE=BLED112 Bluetooth 4.0 Single Mode Dongle
+
+usb:v245F*
+ ID_VENDOR_FROM_DATABASE=Chord Electronics Limited
+
+usb:v2464*
+ ID_VENDOR_FROM_DATABASE=Nest
+
+usb:v2464p0001*
+ ID_MODEL_FROM_DATABASE=Learning Thermostat
+
+usb:v2464p0002*
+ ID_MODEL_FROM_DATABASE=Learning Thermostat (2nd Generation)
+
+usb:v2464p0010*
+ ID_MODEL_FROM_DATABASE=Protect : Smoke + Carbon Monoxide
+
+usb:v2464p0020*
+ ID_MODEL_FROM_DATABASE=Heat Link
+
+usb:v2466*
+ ID_VENDOR_FROM_DATABASE=Fractal Audio Systems
+
+usb:v2466p8003*
+ ID_MODEL_FROM_DATABASE=Axe-Fx II
+
+usb:v2466p8010*
+ ID_MODEL_FROM_DATABASE=Axe-FX III
+
+usb:v2476*
+ ID_VENDOR_FROM_DATABASE=YEI Technology
+
+usb:v2476p1040*
+ ID_MODEL_FROM_DATABASE=3-Space Embedded Sensor
+
 usb:v2478*
  ID_VENDOR_FROM_DATABASE=Tripp-Lite
 
@@ -57992,9 +64271,144 @@ usb:v248A*
 usb:v248Ap8366*
  ID_MODEL_FROM_DATABASE=Wireless Optical Mouse ACT-MUSW-002
 
+usb:v248Ap8367*
+ ID_MODEL_FROM_DATABASE=Telink Wireless Receiver
+
 usb:v249C*
  ID_VENDOR_FROM_DATABASE=M2Tech s.r.l.
 
+usb:v24A4*
+ ID_VENDOR_FROM_DATABASE=Primare AB
+
+usb:v24A4p0002*
+ ID_MODEL_FROM_DATABASE=I15_v1.06 [Primare Audio DAC]
+
+usb:v24AE*
+ ID_VENDOR_FROM_DATABASE=Shenzhen Rapoo Technology Co., Ltd.
+
+usb:v24AEp0001*
+ ID_MODEL_FROM_DATABASE=KX Keyboard
+
+usb:v24AEp0197*
+ ID_MODEL_FROM_DATABASE=meva Barcode Scanner
+
+usb:v24AEp1813*
+ ID_MODEL_FROM_DATABASE=E9260 Wireless Multi-mode Keyboard
+
+usb:v24AEp2000*
+ ID_MODEL_FROM_DATABASE=2.4G Wireless Device Serial
+
+usb:v24AEp2001*
+ ID_MODEL_FROM_DATABASE=5 GHz Wireless Receiver
+
+usb:v24AEp2003*
+ ID_MODEL_FROM_DATABASE=5GHz Wireless Transceiver
+
+usb:v24AEp4110*
+ ID_MODEL_FROM_DATABASE=Optical Gaming Mouse [V280]
+
+usb:v24AEp6000*
+ ID_MODEL_FROM_DATABASE=Wireless Audio
+
+usb:v24C0*
+ ID_VENDOR_FROM_DATABASE=Chaney Instrument
+
+usb:v24C0p0003*
+ ID_MODEL_FROM_DATABASE=Model 01036 weather center
+
+usb:v24C6*
+ ID_VENDOR_FROM_DATABASE=ThrustMaster, Inc.
+
+usb:v24C6p5000*
+ ID_MODEL_FROM_DATABASE=Razer Atrox Gaming Arcade Stick
+
+usb:v24C6p5300*
+ ID_MODEL_FROM_DATABASE=PowerA Mini ProEX Controller for Xbox 360
+
+usb:v24C6p5303*
+ ID_MODEL_FROM_DATABASE=Airflo Wired Controller for Xbox 360
+
+usb:v24C6p530A*
+ ID_MODEL_FROM_DATABASE=ProEX Controller for Xbox 360
+
+usb:v24C6p531A*
+ ID_MODEL_FROM_DATABASE=Pro Ex mini for XBOX
+
+usb:v24C6p5397*
+ ID_MODEL_FROM_DATABASE=FUS1ON Tournament Controller
+
+usb:v24C6p541A*
+ ID_MODEL_FROM_DATABASE=PowerA CPFA115320-01 [Mini Controller for Xbox One]
+
+usb:v24C6p542A*
+ ID_MODEL_FROM_DATABASE=Spectra for Xbox One
+
+usb:v24C6p543A*
+ ID_MODEL_FROM_DATABASE=PowerA Wired Controller for Xbox One
+
+usb:v24C6p5500*
+ ID_MODEL_FROM_DATABASE=Horipad EX2 Turbo
+
+usb:v24C6p5501*
+ ID_MODEL_FROM_DATABASE=Hori Real Arcade Pro.VX-SA for Xbox 360
+
+usb:v24C6p5502*
+ ID_MODEL_FROM_DATABASE=Hori Fighting Stick VX Alt for Xbox 360
+
+usb:v24C6p5503*
+ ID_MODEL_FROM_DATABASE=Hori Fighting Edge for Xbox 360
+
+usb:v24C6p5506*
+ ID_MODEL_FROM_DATABASE=Hori Soulcalibur V Stick for Xbox 360
+
+usb:v24C6p550D*
+ ID_MODEL_FROM_DATABASE=Hori Gem Controller for Xbox 360
+
+usb:v24C6p550E*
+ ID_MODEL_FROM_DATABASE=Real Arcade Pro V Kai for Xbox One / Xbox 360
+
+usb:v24C6p551A*
+ ID_MODEL_FROM_DATABASE=Fusion Pro Controller
+
+usb:v24C6p561A*
+ ID_MODEL_FROM_DATABASE=Fusion Controller for Xbox One
+
+usb:v24C6p5B00*
+ ID_MODEL_FROM_DATABASE=Ferrari 458 Italia Racing Wheel
+
+usb:v24C6p5B02*
+ ID_MODEL_FROM_DATABASE=GPX Controller
+
+usb:v24C6p5D04*
+ ID_MODEL_FROM_DATABASE=Sabertooth Elite
+
+usb:v24C6pFA00*
+ ID_MODEL_FROM_DATABASE=INF-8032385 Disney Infinity Reader
+
+usb:v24C6pFAFB*
+ ID_MODEL_FROM_DATABASE=Aplay Controller
+
+usb:v24C6pFAFD*
+ ID_MODEL_FROM_DATABASE=Afterglow Gamepad for Xbox 360
+
+usb:v24C6pFAFE*
+ ID_MODEL_FROM_DATABASE=Rock Candy Gamepad for Xbox 360
+
+usb:v24CF*
+ ID_VENDOR_FROM_DATABASE=Lytro, Inc.
+
+usb:v24CFp00A1*
+ ID_MODEL_FROM_DATABASE=Light Field Camera
+
+usb:v24DC*
+ ID_VENDOR_FROM_DATABASE=Aladdin R.D.
+
+usb:v24DCp0406*
+ ID_MODEL_FROM_DATABASE=JaCarta SF GOST
+
+usb:v24E0*
+ ID_VENDOR_FROM_DATABASE=Yoctopuce Sarl
+
 usb:v24E1*
  ID_VENDOR_FROM_DATABASE=Paratronic
 
@@ -58004,6 +64418,51 @@ usb:v24E1p3001*
 usb:v24E1p3005*
  ID_MODEL_FROM_DATABASE=Radius
 
+usb:v24E3*
+ ID_VENDOR_FROM_DATABASE=K-Touch
+
+usb:v24EA*
+ ID_VENDOR_FROM_DATABASE=Meva
+
+usb:v24EAp0197*
+ ID_MODEL_FROM_DATABASE=Barcode Scanner
+
+usb:v24ED*
+ ID_VENDOR_FROM_DATABASE=Zen Group
+
+usb:v24EDp044D*
+ ID_MODEL_FROM_DATABASE=Chat Headset
+
+usb:v24F0*
+ ID_VENDOR_FROM_DATABASE=Metadot
+
+usb:v24F0p0105*
+ ID_MODEL_FROM_DATABASE=Das Keyboard 4
+
+usb:v24F0p0140*
+ ID_MODEL_FROM_DATABASE=Das Keyboard 4
+
+usb:v24F0p2020*
+ ID_MODEL_FROM_DATABASE=Das Keyboard 5Q
+
+usb:v24FF*
+ ID_VENDOR_FROM_DATABASE=Acroname Inc.
+
+usb:v2500*
+ ID_VENDOR_FROM_DATABASE=Ettus Research LLC
+
+usb:v2500p0020*
+ ID_MODEL_FROM_DATABASE=USRP B210
+
+usb:v2500p0021*
+ ID_MODEL_FROM_DATABASE=USRP B200-mini
+
+usb:v2500p0022*
+ ID_MODEL_FROM_DATABASE=USRP B205-mini
+
+usb:v2500p0200*
+ ID_MODEL_FROM_DATABASE=USRP B200
+
 usb:v2516*
  ID_VENDOR_FROM_DATABASE=Cooler Master Co., Ltd.
 
@@ -58023,11 +64482,20 @@ usb:v2516p0009*
  ID_MODEL_FROM_DATABASE=Storm Quick Fire PRO
 
 usb:v2516p0011*
- ID_MODEL_FROM_DATABASE=Storm Quick Fire TK
+ ID_MODEL_FROM_DATABASE=Storm Quick Fire TK 6keys
+
+usb:v2516p0014*
+ ID_MODEL_FROM_DATABASE=Storm Quick Fire TK Nkeys
+
+usb:v2516p0015*
+ ID_MODEL_FROM_DATABASE=Storm QuickFire Pro/Ultimate keyboard
 
 usb:v2516p0017*
  ID_MODEL_FROM_DATABASE=CM Storm Quick Fire Stealth
 
+usb:v2516p001A*
+ ID_MODEL_FROM_DATABASE=Storm Quick Fire XT
+
 usb:v2516p0020*
  ID_MODEL_FROM_DATABASE=QuickFire Rapid-i Keyboard
 
@@ -58037,12 +64505,57 @@ usb:v2516p0027*
 usb:v2516p002D*
  ID_MODEL_FROM_DATABASE=Alcor mouse
 
+usb:v2516p0042*
+ ID_MODEL_FROM_DATABASE=Masterkeys Lite L Combo RGB Keyboard
+
+usb:v2516p0044*
+ ID_MODEL_FROM_DATABASE=Masterkeys Lite L Combo RGB Mouse
+
+usb:v2516p0046*
+ ID_MODEL_FROM_DATABASE=Masterkeys PRO L
+
 usb:v2516p0047*
  ID_MODEL_FROM_DATABASE=MasterKeys Pro L
 
+usb:v2516p0055*
+ ID_MODEL_FROM_DATABASE=MasterKeys L
+
+usb:v2516p1006*
+ ID_MODEL_FROM_DATABASE=MasterCase SL600M
+
 usb:v2516p9494*
  ID_MODEL_FROM_DATABASE=Sirus Headset
 
+usb:v2520*
+ ID_VENDOR_FROM_DATABASE=ANA-U GmbH
+
+usb:v2520p0001*
+ ID_MODEL_FROM_DATABASE=EasyPrinter S3
+
+usb:v2527*
+ ID_VENDOR_FROM_DATABASE=Software Bisque
+
+usb:v2527p1388*
+ ID_MODEL_FROM_DATABASE=Paramount 5
+
+usb:v2537*
+ ID_VENDOR_FROM_DATABASE=Norelsys
+
+usb:v2537p1066*
+ ID_MODEL_FROM_DATABASE=NS1066
+
+usb:v2537p1068*
+ ID_MODEL_FROM_DATABASE=NS1068/NS1068X SATA Bridge Controller
+
+usb:v2544*
+ ID_VENDOR_FROM_DATABASE=Energy Micro AS
+
+usb:v2546*
+ ID_VENDOR_FROM_DATABASE=Ravensburger
+
+usb:v2546pE301*
+ ID_MODEL_FROM_DATABASE=TipToi Pen
+
 usb:v2548*
  ID_VENDOR_FROM_DATABASE=Pulse-Eight
 
@@ -58052,12 +64565,297 @@ usb:v2548p1001*
 usb:v2548p1002*
  ID_MODEL_FROM_DATABASE=CEC Adapter
 
+usb:v254E*
+ ID_VENDOR_FROM_DATABASE=SHF Communication Technologies AG
+
+usb:v254EpE2B3*
+ ID_MODEL_FROM_DATABASE=SHF 58035 A BiasBoard
+
+usb:v2554*
+ ID_VENDOR_FROM_DATABASE=ASSA ABLOY AB
+
+usb:v2555*
+ ID_VENDOR_FROM_DATABASE=Basis Science Inc.
+
+usb:v2555p0001*
+ ID_MODEL_FROM_DATABASE=B1 Fitness Band
+
+usb:v255E*
+ ID_VENDOR_FROM_DATABASE=Beijing Bonxeon Technology Co., Ltd.
+
+usb:v255Ep0001*
+ ID_MODEL_FROM_DATABASE=Device
+
+usb:v255Ep0002*
+ ID_MODEL_FROM_DATABASE=Dual
+
+usb:v2560*
+ ID_VENDOR_FROM_DATABASE=e-con Systems
+
+usb:v2560pC152*
+ ID_MODEL_FROM_DATABASE=See3CAM_CU51 5 Mpx monochrome camera
+
+usb:v2563*
+ ID_VENDOR_FROM_DATABASE=ShenZhen ShanWan Technology Co., Ltd.
+
+usb:v2563p031D*
+ ID_MODEL_FROM_DATABASE=DXT Mouse
+
+usb:v2563p0523*
+ ID_MODEL_FROM_DATABASE=BM0523 WirelessGamepad
+
+usb:v2563p0575*
+ ID_MODEL_FROM_DATABASE=ZD-V+ Wired Gaming Controller
+
+usb:v256B*
+ ID_VENDOR_FROM_DATABASE=Perreaux Industries Ltd
+
+usb:v256Bp0121*
+ ID_MODEL_FROM_DATABASE=Audiant 80i
+
+usb:v256F*
+ ID_VENDOR_FROM_DATABASE=3Dconnexion
+
+usb:v256FpC62E*
+ ID_MODEL_FROM_DATABASE=SpaceMouse Wireless (cabled)
+
+usb:v256FpC62F*
+ ID_MODEL_FROM_DATABASE=SpaceMouse Wireless Receiver
+
+usb:v256FpC631*
+ ID_MODEL_FROM_DATABASE=SpaceMouse Pro Wireless (cabled)
+
+usb:v256FpC632*
+ ID_MODEL_FROM_DATABASE=SpaceMouse Pro Wireless Receiver
+
+usb:v256FpC633*
+ ID_MODEL_FROM_DATABASE=SpaceMouse Enterprise
+
+usb:v256FpC635*
+ ID_MODEL_FROM_DATABASE=SpaceMouse Compact
+
+usb:v256FpC651*
+ ID_MODEL_FROM_DATABASE=CadMouse Wireless
+
+usb:v256FpC652*
+ ID_MODEL_FROM_DATABASE=Universal Receiver
+
+usb:v256FpC654*
+ ID_MODEL_FROM_DATABASE=CadMouse Pro Wireless
+
+usb:v256FpC657*
+ ID_MODEL_FROM_DATABASE=CadMouse Pro Wireless Left
+
+usb:v2573*
+ ID_VENDOR_FROM_DATABASE=ESI Audiotechnik GmbH
+
+usb:v2573p0017*
+ ID_MODEL_FROM_DATABASE=MAYA22
+
+usb:v2574*
+ ID_VENDOR_FROM_DATABASE=AVer Information, Inc.
+
+usb:v2574p0901*
+ ID_MODEL_FROM_DATABASE=VC520
+
+usb:v2574p0910*
+ ID_MODEL_FROM_DATABASE=CAM520
+
+usb:v2574p0920*
+ ID_MODEL_FROM_DATABASE=VC320
+
+usb:v2574p0930*
+ ID_MODEL_FROM_DATABASE=CAM530
+
+usb:v2574p0940*
+ ID_MODEL_FROM_DATABASE=CAM340
+
+usb:v2574p0950*
+ ID_MODEL_FROM_DATABASE=VC322
+
+usb:v2574p0960*
+ ID_MODEL_FROM_DATABASE=VB342
+
+usb:v2575*
+ ID_VENDOR_FROM_DATABASE=Weida Hi-Tech Co., Ltd.
+
+usb:v2576*
+ ID_VENDOR_FROM_DATABASE=AFO Co., Ltd.
+
+usb:v2576p0003*
+ ID_MODEL_FROM_DATABASE=TCM
+
+usb:v2576p0005*
+ ID_MODEL_FROM_DATABASE=BL [Boot Loader]
+
+usb:v2576p0011*
+ ID_MODEL_FROM_DATABASE=THM
+
+usb:v2578*
+ ID_VENDOR_FROM_DATABASE=Pluscom
+
+usb:v2578p4168*
+ ID_MODEL_FROM_DATABASE=2.4GHZ Wireless Arc Folding Mouse
+
+usb:v2581*
+ ID_VENDOR_FROM_DATABASE=Plug-up
+
+usb:v2581p1807*
+ ID_MODEL_FROM_DATABASE=Generic HID Smartcard
+
+usb:v2581p1808*
+ ID_MODEL_FROM_DATABASE=WinUSB Smartcard
+
+usb:v2581pF1D0*
+ ID_MODEL_FROM_DATABASE=FIDO U2F Security Key
+
+usb:v258D*
+ ID_VENDOR_FROM_DATABASE=Sequans Communications
+
+usb:v259A*
+ ID_VENDOR_FROM_DATABASE=TriQuint Semiconductor
+
+usb:v25A7*
+ ID_VENDOR_FROM_DATABASE=Areson Technology Corp
+
+usb:v25A7p2410*
+ ID_MODEL_FROM_DATABASE=Laser mouse
+
+usb:v25A7pFA23*
+ ID_MODEL_FROM_DATABASE=2.4G Receiver
+
+usb:v25A7pFA61*
+ ID_MODEL_FROM_DATABASE=Elecom Co., Ltd MR-K013 Multicard Reader
+
 usb:v25B5*
  ID_VENDOR_FROM_DATABASE=FlatFrog
 
 usb:v25B5p0002*
  ID_MODEL_FROM_DATABASE=Multitouch 3200
 
+usb:v25BB*
+ ID_VENDOR_FROM_DATABASE=Brunner Elektronik AG
+
+usb:v25BBp0063*
+ ID_MODEL_FROM_DATABASE=PRT.5105 [Yoke]
+
+usb:v25BBp0064*
+ ID_MODEL_FROM_DATABASE=PRT.5105 [reserved]
+
+usb:v25BBp0065*
+ ID_MODEL_FROM_DATABASE=PRT.5096 [Battery Management System]
+
+usb:v25BBp0066*
+ ID_MODEL_FROM_DATABASE=PRT.5096 [Battery Management System]
+
+usb:v25BBp0067*
+ ID_MODEL_FROM_DATABASE=PRT.5094
+
+usb:v25BBp0068*
+ ID_MODEL_FROM_DATABASE=PRT.5094
+
+usb:v25BBp0069*
+ ID_MODEL_FROM_DATABASE=PRT.5119 [Ethernet2CAN LC Gateway]
+
+usb:v25BBp006A*
+ ID_MODEL_FROM_DATABASE=PRT.5113 [CLS CANaerospace Gateway]
+
+usb:v25BBp006B*
+ ID_MODEL_FROM_DATABASE=PRT.5123
+
+usb:v25BBp006C*
+ ID_MODEL_FROM_DATABASE=PRT.5123 [reserved]
+
+usb:v25BBp006D*
+ ID_MODEL_FROM_DATABASE=PRT.5127
+
+usb:v25BBp00FF*
+ ID_MODEL_FROM_DATABASE=MSP430 HID Update Agent
+
+usb:v25BF*
+ ID_VENDOR_FROM_DATABASE=Elegant Invention
+
+usb:v25BFp0001*
+ ID_MODEL_FROM_DATABASE=Isostick
+
+usb:v25BFp0002*
+ ID_MODEL_FROM_DATABASE=Isostick updater
+
+usb:v25C4*
+ ID_VENDOR_FROM_DATABASE=ARCAM
+
+usb:v25C6*
+ ID_VENDOR_FROM_DATABASE=Vitus Audio (AVA Group A/S)
+
+usb:v25C8*
+ ID_VENDOR_FROM_DATABASE=Visual Planet Ltd
+
+usb:v25C8p0014*
+ ID_MODEL_FROM_DATABASE=Single User touchfoil(tm) (SU2-80)
+
+usb:v25DA*
+ ID_VENDOR_FROM_DATABASE=Netatmo
+
+usb:v25DAp0001*
+ ID_MODEL_FROM_DATABASE=Weather Station
+
+usb:v25E3*
+ ID_VENDOR_FROM_DATABASE=Lumigon
+
+usb:v25F0*
+ ID_VENDOR_FROM_DATABASE=ShanWan
+
+usb:v25F0pC131*
+ ID_MODEL_FROM_DATABASE=Gioteck PS3 2.4G Wireless Controller
+
+usb:v25FB*
+ ID_VENDOR_FROM_DATABASE=Pentax Ricoh Imaging Co., Ltd
+
+usb:v25FBp0102*
+ ID_MODEL_FROM_DATABASE=K-5
+
+usb:v2604*
+ ID_VENDOR_FROM_DATABASE=Tenda
+
+usb:v2604p0012*
+ ID_MODEL_FROM_DATABASE=U12
+
+usb:v2625*
+ ID_VENDOR_FROM_DATABASE=MilDef AB
+
+usb:v2626*
+ ID_VENDOR_FROM_DATABASE=Aruba Networks
+
+usb:v2626pEA60*
+ ID_MODEL_FROM_DATABASE=UART Bridge Controller [cp210x]
+
+usb:v262A*
+ ID_VENDOR_FROM_DATABASE=SAVITECH Corp.
+
+usb:v262Ap100E*
+ ID_MODEL_FROM_DATABASE=SA9027 Audio Streaming Controller
+
+usb:v262Ap10E0*
+ ID_MODEL_FROM_DATABASE=SA9023 Audio Streaming Controller
+
+usb:v262Ap9020*
+ ID_MODEL_FROM_DATABASE=SA9020 audio controller
+
+usb:v262Ap9023*
+ ID_MODEL_FROM_DATABASE=SA9023 audio controller
+
+usb:v262Ap9027*
+ ID_MODEL_FROM_DATABASE=SA9027 audio controller
+
+usb:v262Ap9226*
+ ID_MODEL_FROM_DATABASE=SA9226 192KHz audio controller
+
+usb:v262Ap9227*
+ ID_MODEL_FROM_DATABASE=SA9227 384KHz audio controller
+
+usb:v262Ap9228*
+ ID_MODEL_FROM_DATABASE=SA9228 384KHz/DSD audio controller
+
 usb:v2632*
  ID_VENDOR_FROM_DATABASE=TwinMOS
 
@@ -58103,12 +64901,27 @@ usb:v2639p0103*
 usb:v2639p0200*
  ID_MODEL_FROM_DATABASE=MTw
 
+usb:v2639p0300*
+ ID_MODEL_FROM_DATABASE=Motion Tracker Development Board
+
+usb:v2639p0301*
+ ID_MODEL_FROM_DATABASE=MTi Converter
+
 usb:v2639pD00D*
  ID_MODEL_FROM_DATABASE=Wireless Receiver
 
+usb:v264A*
+ ID_VENDOR_FROM_DATABASE=Thermaltake
+
+usb:v264Ap1004*
+ ID_MODEL_FROM_DATABASE=Ventus
+
 usb:v2650*
  ID_VENDOR_FROM_DATABASE=Electronics For Imaging, Inc. [hex]
 
+usb:v2650p1311*
+ ID_MODEL_FROM_DATABASE=eBeam Classic [Luidia]
+
 usb:v2659*
  ID_VENDOR_FROM_DATABASE=Sundtek
 
@@ -58154,12 +64967,279 @@ usb:v2659p1212*
 usb:v2659p1213*
  ID_MODEL_FROM_DATABASE=MediaTV Pro III MiniPCIe (US)
 
+usb:v2662*
+ ID_VENDOR_FROM_DATABASE=Moog Music Inc.
+
+usb:v266E*
+ ID_VENDOR_FROM_DATABASE=Silicon Integrated Systems
+
+usb:v2672*
+ ID_VENDOR_FROM_DATABASE=GoPro
+
+usb:v2672p0004*
+ ID_MODEL_FROM_DATABASE=Hero 3
+
+usb:v2672p0006*
+ ID_MODEL_FROM_DATABASE=HERO 3+ Silver Edition
+
+usb:v2672p0007*
+ ID_MODEL_FROM_DATABASE=HERO 3+ Black
+
+usb:v2672p000E*
+ ID_MODEL_FROM_DATABASE=HERO4 Black
+
+usb:v2672p0011*
+ ID_MODEL_FROM_DATABASE=Hero 3+ Black
+
 usb:v2676*
  ID_VENDOR_FROM_DATABASE=Basler AG
 
 usb:v2676pBA02*
  ID_MODEL_FROM_DATABASE=ace
 
+usb:v2676pBA03*
+ ID_MODEL_FROM_DATABASE=ba03 dart Vision Caera
+
+usb:v2676pBA04*
+ ID_MODEL_FROM_DATABASE=ba04 pulse Vision Camera
+
+usb:v2676pBA05*
+ ID_MODEL_FROM_DATABASE=Vision Camera
+
+usb:v2676pBA06*
+ ID_MODEL_FROM_DATABASE=Vision Camera
+
+usb:v2676pBA07*
+ ID_MODEL_FROM_DATABASE=Vision Camera
+
+usb:v2676pBA08*
+ ID_MODEL_FROM_DATABASE=Vision Camera
+
+usb:v2676pBA09*
+ ID_MODEL_FROM_DATABASE=Vision Camera
+
+usb:v2676pBA0A*
+ ID_MODEL_FROM_DATABASE=Vision Camera
+
+usb:v2676pBA0B*
+ ID_MODEL_FROM_DATABASE=Vision Camera
+
+usb:v2676pBA0C*
+ ID_MODEL_FROM_DATABASE=Vision Camera
+
+usb:v2676pBA0D*
+ ID_MODEL_FROM_DATABASE=Vision Camera
+
+usb:v2676pBA0E*
+ ID_MODEL_FROM_DATABASE=Vision Camera
+
+usb:v2676pBA0F*
+ ID_MODEL_FROM_DATABASE=Vision Camera
+
+usb:v2685*
+ ID_VENDOR_FROM_DATABASE=Cardo Peripheral Systems LTD
+
+usb:v2685p0900*
+ ID_MODEL_FROM_DATABASE=[Packtalk Bold Bluetooth Motorcycle Intercom]
+
+usb:v2687*
+ ID_VENDOR_FROM_DATABASE=Fitbit Inc.
+
+usb:v2687pFB01*
+ ID_MODEL_FROM_DATABASE=Base Station
+
+usb:v2689*
+ ID_VENDOR_FROM_DATABASE=StepOver International GmbH
+
+usb:v2689p0601*
+ ID_MODEL_FROM_DATABASE=naturaSign Pad POS
+
+usb:v2689p0901*
+ ID_MODEL_FROM_DATABASE=naturaSign Pad Light
+
+usb:v2689p0CE1*
+ ID_MODEL_FROM_DATABASE=Pad Vivid US
+
+usb:v2689p0CF1*
+ ID_MODEL_FROM_DATABASE=Pad Biometric US 5.0
+
+usb:v2689p0D01*
+ ID_MODEL_FROM_DATABASE=duraSign Pad US 10.0
+
+usb:v2689p0DF1*
+ ID_MODEL_FROM_DATABASE=duraSign Pad Biometric US 10.0
+
+usb:v268B*
+ ID_VENDOR_FROM_DATABASE=Dimension Engineering
+
+usb:v268Bp0101*
+ ID_MODEL_FROM_DATABASE=DELink 2
+
+usb:v268Bp0201*
+ ID_MODEL_FROM_DATABASE=Sabertooth 2x32
+
+usb:v268Bp0405*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 200
+
+usb:v268Bp0406*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 200
+
+usb:v268Bp0407*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 200
+
+usb:v268Bp0408*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 75
+
+usb:v268Bp0409*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 250
+
+usb:v268Bp0412*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 60
+
+usb:v268Bp0413*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 200
+
+usb:v268Bp0414*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 250
+
+usb:v268Bp0415*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 75
+
+usb:v268Bp0416*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 60
+
+usb:v268Bp0417*
+ ID_MODEL_FROM_DATABASE=Evolv DNA Go
+
+usb:v268Bp0419*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 250 Color
+
+usb:v268Bp0423*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 200
+
+usb:v268Bp0424*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 250
+
+usb:v268Bp0425*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 75
+
+usb:v268Bp0426*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 60
+
+usb:v268Bp8405*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 200 (recovery mode)
+
+usb:v268Bp8406*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 200 (recovery mode)
+
+usb:v268Bp8407*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 200 (recovery mode)
+
+usb:v268Bp8408*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 75 (recovery mode)
+
+usb:v268Bp8409*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 250 (recovery mode)
+
+usb:v268Bp8412*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 60 (recovery mode)
+
+usb:v268Bp8413*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 200 (recovery mode)
+
+usb:v268Bp8414*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 250 (recovery mode)
+
+usb:v268Bp8415*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 75 (recovery mode)
+
+usb:v268Bp8416*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 60 (recovery mode)
+
+usb:v268Bp8423*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 200 (recovery mode)
+
+usb:v268Bp8424*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 250 (recovery mode)
+
+usb:v268Bp8425*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 75 (recovery mode)
+
+usb:v268Bp8426*
+ ID_MODEL_FROM_DATABASE=Evolv DNA 60 (recovery mode)
+
+usb:v26A9*
+ ID_VENDOR_FROM_DATABASE=Research Industrial Systems Engineering
+
+usb:v26A9p0001*
+ ID_MODEL_FROM_DATABASE=Payment Terminal v1.0
+
+usb:v26AA*
+ ID_VENDOR_FROM_DATABASE=Yaesu Musen
+
+usb:v26AAp0001*
+ ID_MODEL_FROM_DATABASE=FT-1D
+
+usb:v26AAp000E*
+ ID_MODEL_FROM_DATABASE=FTA-550
+
+usb:v26AAp000F*
+ ID_MODEL_FROM_DATABASE=FTA-750
+
+usb:v26B5*
+ ID_VENDOR_FROM_DATABASE=Electrocompaniet
+
+usb:v26B5p0002*
+ ID_MODEL_FROM_DATABASE=ECD 2
+
+usb:v26B5p0003*
+ ID_MODEL_FROM_DATABASE=ECD 2 (Audio Class 1)
+
+usb:v26B5p0004*
+ ID_MODEL_FROM_DATABASE=PI 2D
+
+usb:v26B5p0005*
+ ID_MODEL_FROM_DATABASE=PI 2D (Audio Class 1)
+
+usb:v26B5p0006*
+ ID_MODEL_FROM_DATABASE=ECI 6
+
+usb:v26B5p0007*
+ ID_MODEL_FROM_DATABASE=ECI 6 (Audio Class 1)
+
+usb:v26B5p0020*
+ ID_MODEL_FROM_DATABASE=ECI 80
+
+usb:v26BD*
+ ID_VENDOR_FROM_DATABASE=Integral Memory
+
+usb:v26BDp9917*
+ ID_MODEL_FROM_DATABASE=Fusion Flash Drive
+
+usb:v26E2*
+ ID_VENDOR_FROM_DATABASE=Ingenieurbuero Dietzsch und Thiele, PartG
+
+usb:v26F2*
+ ID_VENDOR_FROM_DATABASE=Micromega
+
+usb:v26F2p0200*
+ ID_MODEL_FROM_DATABASE=MyDac
+
+usb:v2707*
+ ID_VENDOR_FROM_DATABASE=Bardac Corporation
+
+usb:v2707p0005*
+ ID_MODEL_FROM_DATABASE=drive.web
+
+usb:v270D*
+ ID_VENDOR_FROM_DATABASE=Rosand Technologies
+
+usb:v270Dp1001*
+ ID_MODEL_FROM_DATABASE=R-Idge Bootloader
+
+usb:v270Dp1002*
+ ID_MODEL_FROM_DATABASE=R-Idge Router
+
 usb:v2717*
  ID_VENDOR_FROM_DATABASE=Xiaomi Inc.
 
@@ -58205,9 +65285,27 @@ usb:v2717pFF80*
 usb:v2717pFF88*
  ID_MODEL_FROM_DATABASE=Mi/Redmi series (RNDIS + ADB)
 
+usb:v272A*
+ ID_VENDOR_FROM_DATABASE=StarLeaf Ltd.
+
+usb:v272C*
+ ID_VENDOR_FROM_DATABASE=Signum Systems
+
+usb:v272Cp7D13*
+ ID_MODEL_FROM_DATABASE=I-jet
+
 usb:v2730*
  ID_VENDOR_FROM_DATABASE=Citizen
 
+usb:v2730p0FFF*
+ ID_MODEL_FROM_DATABASE=CT-S2000/4000/310/CLP-521/621/631/CL-S700 Series
+
+usb:v2730p1004*
+ ID_MODEL_FROM_DATABASE=PPU-700
+
+usb:v2730p2002*
+ ID_MODEL_FROM_DATABASE=CT-S2000 Thermal Printer (Parallel mode)
+
 usb:v2730p200F*
  ID_MODEL_FROM_DATABASE=CT-S310 Label printer
 
@@ -58334,6 +65432,30 @@ usb:v273Fp1004*
 usb:v273Fp1005*
  ID_MODEL_FROM_DATABASE=ColorHug2 bootloader
 
+usb:v2756*
+ ID_VENDOR_FROM_DATABASE=Victor Hasselblad AB
+
+usb:v2756p0002*
+ ID_MODEL_FROM_DATABASE=X1D Camera
+
+usb:v2759*
+ ID_VENDOR_FROM_DATABASE=Philip Morris Products S.A.
+
+usb:v2759p0003*
+ ID_MODEL_FROM_DATABASE=IQOS Pocket Charger 2.4
+
+usb:v2765*
+ ID_VENDOR_FROM_DATABASE=Firstbeat Technologies, Ltd.
+
+usb:v2765p0004*
+ ID_MODEL_FROM_DATABASE=Bodyguard 2
+
+usb:v2766*
+ ID_VENDOR_FROM_DATABASE=LifeScan
+
+usb:v2766p0000*
+ ID_MODEL_FROM_DATABASE=OneTouch Verio
+
 usb:v2770*
  ID_VENDOR_FROM_DATABASE=NHJ, Ltd
 
@@ -58370,12 +65492,33 @@ usb:v2770p930B*
 usb:v2770p930C*
  ID_MODEL_FROM_DATABASE=CCD Webcam(PC370R)
 
+usb:v27A8*
+ ID_VENDOR_FROM_DATABASE=Square, Inc.
+
+usb:v27A8pA120*
+ ID_MODEL_FROM_DATABASE=Contactless + Chip Reader
+
 usb:v27B8*
  ID_VENDOR_FROM_DATABASE=ThingM
 
 usb:v27B8p01ED*
  ID_MODEL_FROM_DATABASE=blink(1)
 
+usb:v27BD*
+ ID_VENDOR_FROM_DATABASE=Codethink Ltd.
+
+usb:v27BDp0001*
+ ID_MODEL_FROM_DATABASE=Slab Node Manager
+
+usb:v27BDp0002*
+ ID_MODEL_FROM_DATABASE=Slab Node Manager JTAG
+
+usb:v27C0*
+ ID_VENDOR_FROM_DATABASE=Cadwell Laboratories, Inc.
+
+usb:v27C0p0818*
+ ID_MODEL_FROM_DATABASE=Paperlike HD-FT
+
 usb:v27C6*
  ID_VENDOR_FROM_DATABASE=Shenzhen Goodix Technology Co.,Ltd.
 
@@ -58391,6 +65534,12 @@ usb:v27C6p5301*
 usb:v27C6p530C*
  ID_MODEL_FROM_DATABASE=Fingerprint Reader
 
+usb:v27C6p532D*
+ ID_MODEL_FROM_DATABASE=Fingerprint
+
+usb:v27C6p5381*
+ ID_MODEL_FROM_DATABASE=Fingerprint Reader
+
 usb:v27C6p5385*
  ID_MODEL_FROM_DATABASE=Fingerprint Reader
 
@@ -58409,6 +65558,45 @@ usb:v27C6p55B4*
 usb:v27C6p5740*
  ID_MODEL_FROM_DATABASE=Fingerprint Reader
 
+usb:v27D4*
+ ID_VENDOR_FROM_DATABASE=Blackstar Amplification Limited
+
+usb:v27DD*
+ ID_VENDOR_FROM_DATABASE=Mindeo
+
+usb:v27DDp0002*
+ ID_MODEL_FROM_DATABASE=Mindeo Virtual COM Port
+
+usb:v27F2*
+ ID_VENDOR_FROM_DATABASE=Softnautics LLP
+
+usb:v2803*
+ ID_VENDOR_FROM_DATABASE=StarLine LLC.
+
+usb:v2803p0001*
+ ID_MODEL_FROM_DATABASE=Controller Area Network car alarm module [SLCAN-2]
+
+usb:v2806*
+ ID_VENDOR_FROM_DATABASE=SIMPASS
+
+usb:v2806p0001*
+ ID_MODEL_FROM_DATABASE=N-PASS X1
+
+usb:v2817*
+ ID_VENDOR_FROM_DATABASE=Signal Hound, Inc.
+
+usb:v2817p0002*
+ ID_MODEL_FROM_DATABASE=BB60C Spectrum Analyzer
+
+usb:v2817p0004*
+ ID_MODEL_FROM_DATABASE=SM200A Spectrum Analyzer
+
+usb:v2818*
+ ID_VENDOR_FROM_DATABASE=Codex Digital Limited
+
+usb:v2818p0001*
+ ID_MODEL_FROM_DATABASE=Transfer Drive Dock
+
 usb:v2821*
  ID_VENDOR_FROM_DATABASE=ASUSTek Computer Inc.
 
@@ -58421,6 +65609,69 @@ usb:v2821p160F*
 usb:v2821p3300*
  ID_MODEL_FROM_DATABASE=WL-140 / Hawking HWU36D 802.11b Wireless Adapter [Intersil PRISM 3]
 
+usb:v2822*
+ ID_VENDOR_FROM_DATABASE=REFLEXdigital
+
+usb:v2833*
+ ID_VENDOR_FROM_DATABASE=Oculus VR, Inc.
+
+usb:v2833p0001*
+ ID_MODEL_FROM_DATABASE=Rift Developer Kit 1
+
+usb:v2833p0021*
+ ID_MODEL_FROM_DATABASE=Rift DK2
+
+usb:v2833p0031*
+ ID_MODEL_FROM_DATABASE=Rift CV1
+
+usb:v2833p0101*
+ ID_MODEL_FROM_DATABASE=Latency Tester
+
+usb:v2833p0137*
+ ID_MODEL_FROM_DATABASE=Quest Headset
+
+usb:v2833p0201*
+ ID_MODEL_FROM_DATABASE=Camera DK2
+
+usb:v2833p0211*
+ ID_MODEL_FROM_DATABASE=Rift CV1 Sensor
+
+usb:v2833p0330*
+ ID_MODEL_FROM_DATABASE=Rift CV1 Audio
+
+usb:v2833p1031*
+ ID_MODEL_FROM_DATABASE=Rift CV1
+
+usb:v2833p2021*
+ ID_MODEL_FROM_DATABASE=Rift DK2
+
+usb:v2833p2031*
+ ID_MODEL_FROM_DATABASE=Rift CV1
+
+usb:v2833p3031*
+ ID_MODEL_FROM_DATABASE=Rift CV1
+
+usb:v2836*
+ ID_VENDOR_FROM_DATABASE=OUYA
+
+usb:v286B*
+ ID_VENDOR_FROM_DATABASE=STANEO SAS
+
+usb:v286Bp0003*
+ ID_MODEL_FROM_DATABASE=D6BB/D9 seismic digitizer
+
+usb:v2886*
+ ID_VENDOR_FROM_DATABASE=Seeed Technology Co., Ltd.
+
+usb:v2886p0002*
+ ID_MODEL_FROM_DATABASE=Seeeduino Lite
+
+usb:v2890*
+ ID_VENDOR_FROM_DATABASE=Teknic, Inc
+
+usb:v2890p0213*
+ ID_MODEL_FROM_DATABASE=ClearPath 4-axis Comm Hub
+
 usb:v2899*
  ID_VENDOR_FROM_DATABASE=Toptronic Industrial Co., Ltd
 
@@ -58466,6 +65717,42 @@ usb:v289Bp000B*
 usb:v289Bp000C*
  ID_MODEL_FROM_DATABASE=Gamecube/N64 controller v2.9 (Joystick mode)
 
+usb:v289Bp000E*
+ ID_MODEL_FROM_DATABASE=VirtualBoy controller
+
+usb:v289Bp0010*
+ ID_MODEL_FROM_DATABASE=WUSBMote v1.2 (Joystick mode)
+
+usb:v289Bp0011*
+ ID_MODEL_FROM_DATABASE=WUSBMote v1.2 (Mouse mode)
+
+usb:v289Bp0012*
+ ID_MODEL_FROM_DATABASE=WUSBMote v1.2.1 (Joystick mode)
+
+usb:v289Bp0013*
+ ID_MODEL_FROM_DATABASE=WUSBMote v1.2.1 (Mouse mode)
+
+usb:v289Bp0014*
+ ID_MODEL_FROM_DATABASE=WUSBMote v1.3 (Joystick mode)
+
+usb:v289Bp0015*
+ ID_MODEL_FROM_DATABASE=WUSBMote v1.3 (Mouse mode)
+
+usb:v289Bp0016*
+ ID_MODEL_FROM_DATABASE=WUSBMote v1.3 (I2C interface mode)
+
+usb:v289Bp0017*
+ ID_MODEL_FROM_DATABASE=Gamecube/N64 controller v3.0
+
+usb:v289Bp0018*
+ ID_MODEL_FROM_DATABASE=Atari Jaguar controller
+
+usb:v289Bp0019*
+ ID_MODEL_FROM_DATABASE=MultiDB9joy v3
+
+usb:v289Bp001A*
+ ID_MODEL_FROM_DATABASE=MultiDB9joy v3 (multitap mode)
+
 usb:v289Bp0100*
  ID_MODEL_FROM_DATABASE=Dual-relay board
 
@@ -58475,6 +65762,30 @@ usb:v289Bp0500*
 usb:v289Bp0502*
  ID_MODEL_FROM_DATABASE=Precision barometer
 
+usb:v289D*
+ ID_VENDOR_FROM_DATABASE=Seek Thermal, Inc.
+
+usb:v289Dp0010*
+ ID_MODEL_FROM_DATABASE=PIR206 Thermal Camera [Seek Compact]
+
+usb:v28BD*
+ ID_VENDOR_FROM_DATABASE=XP-Pen
+
+usb:v28BDp0920*
+ ID_MODEL_FROM_DATABASE=Star G960 Graphic Tablet
+
+usb:v28C7*
+ ID_VENDOR_FROM_DATABASE=Ultimaker B.V.
+
+usb:v28C7p0001*
+ ID_MODEL_FROM_DATABASE=3D printer serial interface
+
+usb:v28D4*
+ ID_VENDOR_FROM_DATABASE=Devialet
+
+usb:v28D4p0008*
+ ID_MODEL_FROM_DATABASE=120/200/250/400/800/D-Premier
+
 usb:v28DE*
  ID_VENDOR_FROM_DATABASE=Valve Software
 
@@ -58487,9 +65798,81 @@ usb:v28DEp1142*
 usb:v28DEp2000*
  ID_MODEL_FROM_DATABASE=Lighthouse FPGA RX
 
+usb:v28DEp2012*
+ ID_MODEL_FROM_DATABASE=Virtual Reality Controller [VRC]
+
 usb:v28DEp2101*
  ID_MODEL_FROM_DATABASE=Watchman Dongle
 
+usb:v28DEp2500*
+ ID_MODEL_FROM_DATABASE=Lighthouse Base Station
+
+usb:v28E0*
+ ID_VENDOR_FROM_DATABASE=PT. Prasimax Inovasi Teknologi
+
+usb:v28E0p1001*
+ ID_MODEL_FROM_DATABASE=BTS Monitoring Config for Prototype
+
+usb:v28E0p5740*
+ ID_MODEL_FROM_DATABASE=TRUMON TS-107
+
+usb:v28E0p5741*
+ ID_MODEL_FROM_DATABASE=TRUMON TS-108
+
+usb:v28E9*
+ ID_VENDOR_FROM_DATABASE=GDMicroelectronics
+
+usb:v28E9p0189*
+ ID_MODEL_FROM_DATABASE=GD32 DFU Bootloader (Longan Nano)
+
+usb:v28F3*
+ ID_VENDOR_FROM_DATABASE=Clover Network, Inc.
+
+usb:v28F3p2000*
+ ID_MODEL_FROM_DATABASE=Mobile Wi-Fi (C200)
+
+usb:v28F3p3000*
+ ID_MODEL_FROM_DATABASE=Mini
+
+usb:v28F3p4000*
+ ID_MODEL_FROM_DATABASE=Flex
+
+usb:v28F9*
+ ID_VENDOR_FROM_DATABASE=Profitap HQ BV
+
+usb:v28F9p0001*
+ ID_MODEL_FROM_DATABASE=Profishark 1G Black
+
+usb:v28F9p0003*
+ ID_MODEL_FROM_DATABASE=Profishark 1G+
+
+usb:v28F9p0004*
+ ID_MODEL_FROM_DATABASE=Profishark 1G
+
+usb:v28F9p0005*
+ ID_MODEL_FROM_DATABASE=Profishark 10G
+
+usb:v28F9p0006*
+ ID_MODEL_FROM_DATABASE=Profishark 100M
+
+usb:v290C*
+ ID_VENDOR_FROM_DATABASE=R. Hamilton & Co. Ltd.
+
+usb:v290Cp4B4D*
+ ID_MODEL_FROM_DATABASE=Mercury iPod Dock
+
+usb:v2912*
+ ID_VENDOR_FROM_DATABASE=Audioengine
+
+usb:v2912p20C8*
+ ID_MODEL_FROM_DATABASE=D1 24-bit DAC
+
+usb:v2912p30C8*
+ ID_MODEL_FROM_DATABASE=D1 24-bit DAC
+
+usb:v2916*
+ ID_VENDOR_FROM_DATABASE=Yota Devices
+
 usb:v2931*
  ID_VENDOR_FROM_DATABASE=Jolla Oy
 
@@ -58502,6 +65885,9 @@ usb:v2931p0A02*
 usb:v2931p0A05*
  ID_MODEL_FROM_DATABASE=Jolla PC connection
 
+usb:v2931p0A07*
+ ID_MODEL_FROM_DATABASE=Phone MTP
+
 usb:v2931p0AFE*
  ID_MODEL_FROM_DATABASE=Jolla charging only
 
@@ -58517,6 +65903,117 @@ usb:v2939p495A*
 usb:v2939p495B*
  ID_MODEL_FROM_DATABASE=X-MCB2
 
+usb:v2939p49B1*
+ ID_MODEL_FROM_DATABASE=X-MCB1
+
+usb:v2939p49B2*
+ ID_MODEL_FROM_DATABASE=X-MCB2
+
+usb:v2939p49C1*
+ ID_MODEL_FROM_DATABASE=X-MCC1
+
+usb:v2939p49C2*
+ ID_MODEL_FROM_DATABASE=X-MCC2
+
+usb:v2939p49C3*
+ ID_MODEL_FROM_DATABASE=X-MCC3
+
+usb:v2939p49C4*
+ ID_MODEL_FROM_DATABASE=X-MCC4
+
+usb:v2957*
+ ID_VENDOR_FROM_DATABASE=Obsidian Research Corporation
+
+usb:v2957p0001*
+ ID_MODEL_FROM_DATABASE=Management Console
+
+usb:v2961*
+ ID_VENDOR_FROM_DATABASE=Miselu
+
+usb:v2961p0001*
+ ID_MODEL_FROM_DATABASE=C.24 keyboard
+
+usb:v296B*
+ ID_VENDOR_FROM_DATABASE=Xacti Corporation
+
+usb:v296Bp3917*
+ ID_MODEL_FROM_DATABASE=CX-WE100 Camera
+
+usb:v2972*
+ ID_VENDOR_FROM_DATABASE=FiiO Electronics Technology
+
+usb:v2972p0007*
+ ID_MODEL_FROM_DATABASE=X3 2nd gen audio player / DAC
+
+usb:v298D*
+ ID_VENDOR_FROM_DATABASE=Next Biometrics
+
+usb:v298Dp2020*
+ ID_MODEL_FROM_DATABASE=NB-2020-U Fingerprint Reader
+
+usb:v29BD*
+ ID_VENDOR_FROM_DATABASE=Silicon Works
+
+usb:v29BDp4101*
+ ID_MODEL_FROM_DATABASE=Multi-touch Device
+
+usb:v29C1*
+ ID_VENDOR_FROM_DATABASE=Taztag
+
+usb:v29C1p1105*
+ ID_MODEL_FROM_DATABASE=M17-G903-1 [Tazpad]
+
+usb:v29C1p1107*
+ ID_MODEL_FROM_DATABASE=M17-G903-A [Tazpad] (CCID)
+
+usb:v29C2*
+ ID_VENDOR_FROM_DATABASE=Lewitt GmbH
+
+usb:v29C2p0001*
+ ID_MODEL_FROM_DATABASE=DGT 650
+
+usb:v29C2p0003*
+ ID_MODEL_FROM_DATABASE=DGT 450
+
+usb:v29C2p0009*
+ ID_MODEL_FROM_DATABASE=DGT 260
+
+usb:v29C2p0011*
+ ID_MODEL_FROM_DATABASE=Stream 4x5
+
+usb:v29C3*
+ ID_VENDOR_FROM_DATABASE=Noviga
+
+usb:v29E2*
+ ID_VENDOR_FROM_DATABASE=Huatune Technology (Shanghai) Co., Ltd.
+
+usb:v29E7*
+ ID_VENDOR_FROM_DATABASE=Brunel University
+
+usb:v29E8*
+ ID_VENDOR_FROM_DATABASE=4Links Limited
+
+usb:v29EA*
+ ID_VENDOR_FROM_DATABASE=Kinesis Corporation
+
+usb:v29EAp0102*
+ ID_MODEL_FROM_DATABASE=Advantage2 Keyboard
+
+usb:v29F1*
+ ID_VENDOR_FROM_DATABASE=Canaan Creative Co., Ltd
+
+usb:v29F1p33F1*
+ ID_MODEL_FROM_DATABASE=Avalon nano 1.0
+
+usb:v29F1p33F2*
+ ID_MODEL_FROM_DATABASE=Avalon USB2IIC Converter
+
+usb:v29F1p33F3*
+ ID_MODEL_FROM_DATABASE=Avalon nano 2.0
+
+usb:v29F1p40F1*
+ ID_MODEL_FROM_DATABASE=Avalon4 mini
+
 usb:v2A03*
  ID_VENDOR_FROM_DATABASE=dog hunter AG
 
@@ -58539,7 +66036,7 @@ usb:v2A03p003A*
  ID_MODEL_FROM_DATABASE=Arduino Micro ADK rev3 (bootloader)
 
 usb:v2A03p003B*
- ID_MODEL_FROM_DATABASE=Arduino Serial
+ ID_MODEL_FROM_DATABASE=Arduino usb2serial
 
 usb:v2A03p003C*
  ID_MODEL_FROM_DATABASE=Arduino Explora (bootloader)
@@ -58589,12 +66086,105 @@ usb:v2A03p8041*
 usb:v2A03p804D*
  ID_MODEL_FROM_DATABASE=Arduino Zero Pro (CDC ACM)
 
+usb:v2A0E*
+ ID_VENDOR_FROM_DATABASE=Shenzhen DreamSource Technology Co., Ltd.
+
+usb:v2A13*
+ ID_VENDOR_FROM_DATABASE=Grabba International
+
+usb:v2A13p0000*
+ ID_MODEL_FROM_DATABASE=S-Series data capture device
+
+usb:v2A19*
+ ID_VENDOR_FROM_DATABASE=Numato Systems Pvt. Ltd
+
+usb:v2A19p1002*
+ ID_MODEL_FROM_DATABASE=Mimas V2 Spartan6 FPGA Development Board
+
+usb:v2A19p5440*
+ ID_MODEL_FROM_DATABASE=TimVideos' HDMI2USB Opsis (FX2) - Unconfigured device
+
+usb:v2A19p5441*
+ ID_MODEL_FROM_DATABASE=TimVideos' HDMI2USB Opsis (FX2) - Firmware load/upgrade
+
+usb:v2A19p5442*
+ ID_MODEL_FROM_DATABASE=TimVideos' HDMI2USB Opsis (FX2) - HDMI/DVI Capture Device
+
+usb:v2A1D*
+ ID_VENDOR_FROM_DATABASE=Oxford Nanopore Technologies, Ltd
+
+usb:v2A1Dp0000*
+ ID_MODEL_FROM_DATABASE=MinION
+
+usb:v2A1Dp0001*
+ ID_MODEL_FROM_DATABASE=MinION
+
+usb:v2A1Dp0010*
+ ID_MODEL_FROM_DATABASE=VolTRAX
+
+usb:v2A1Dp0011*
+ ID_MODEL_FROM_DATABASE=VolTRAX
+
+usb:v2A1Dp0020*
+ ID_MODEL_FROM_DATABASE=GridION
+
+usb:v2A1Dp0021*
+ ID_MODEL_FROM_DATABASE=GridION
+
 usb:v2A37*
  ID_VENDOR_FROM_DATABASE=RTD Embedded Technologies, Inc.
 
 usb:v2A37p5110*
  ID_MODEL_FROM_DATABASE=UPS35110/UPS25110
 
+usb:v2A39*
+ ID_VENDOR_FROM_DATABASE=RME
+
+usb:v2A39p3FB0*
+ ID_MODEL_FROM_DATABASE=Babyface Pro (Class Compliant Mode)
+
+usb:v2A39p3FC0*
+ ID_MODEL_FROM_DATABASE=Babyface Pro
+
+usb:v2A39p3FC1*
+ ID_MODEL_FROM_DATABASE=Fireface UFX+
+
+usb:v2A39p3FC2*
+ ID_MODEL_FROM_DATABASE=Fireface UFX+
+
+usb:v2A39p3FD1*
+ ID_MODEL_FROM_DATABASE=Fireface UFX+
+
+usb:v2A3C*
+ ID_VENDOR_FROM_DATABASE=Trinamic Motion Control GmbH & Co KG
+
+usb:v2A3Cp0100*
+ ID_MODEL_FROM_DATABASE=Stepper Device
+
+usb:v2A3Cp0200*
+ ID_MODEL_FROM_DATABASE=BLDC/PMSM Device
+
+usb:v2A3Cp0300*
+ ID_MODEL_FROM_DATABASE=Motor Control Device
+
+usb:v2A3Cp0400*
+ ID_MODEL_FROM_DATABASE=Motor Control Device
+
+usb:v2A3Cp0500*
+ ID_MODEL_FROM_DATABASE=PANdrive(TM)
+
+usb:v2A3Cp0600*
+ ID_MODEL_FROM_DATABASE=motionCookie(TM)
+
+usb:v2A3Cp0700*
+ ID_MODEL_FROM_DATABASE=Evaluation Device
+
+usb:v2A3Cp0800*
+ ID_MODEL_FROM_DATABASE=Interface Device
+
+usb:v2A3Cp0900*
+ ID_MODEL_FROM_DATABASE=Generic Device
+
 usb:v2A45*
  ID_VENDOR_FROM_DATABASE=Meizu Corp.
 
@@ -58622,6 +66212,75 @@ usb:v2A45p200C*
 usb:v2A45p2012*
  ID_MODEL_FROM_DATABASE=MX Phone (MTP & ACM)
 
+usb:v2A47*
+ ID_VENDOR_FROM_DATABASE=Mundo Reader, S.L.
+
+usb:v2A47p0C02*
+ ID_MODEL_FROM_DATABASE=bq Aquaris E4.5
+
+usb:v2A47p201D*
+ ID_MODEL_FROM_DATABASE=Tablet Edison 3
+
+usb:v2A47p903A*
+ ID_MODEL_FROM_DATABASE=bq Aquaris U
+
+usb:v2A4B*
+ ID_VENDOR_FROM_DATABASE=EMULEX Corporation
+
+usb:v2A4Bp0400*
+ ID_MODEL_FROM_DATABASE=Pilot4 Integrated Hub
+
+usb:v2A62*
+ ID_VENDOR_FROM_DATABASE=Flymaster Avionics
+
+usb:v2A62pB301*
+ ID_MODEL_FROM_DATABASE=LiveSD
+
+usb:v2A62pB302*
+ ID_MODEL_FROM_DATABASE=NavSD
+
+usb:v2A6E*
+ ID_VENDOR_FROM_DATABASE=Bare Conductive
+
+usb:v2A6Ep0003*
+ ID_MODEL_FROM_DATABASE=Touch Board
+
+usb:v2A6Ep8003*
+ ID_MODEL_FROM_DATABASE=Touch Board
+
+usb:v2A70*
+ ID_VENDOR_FROM_DATABASE=OnePlus Technology (Shenzhen) Co., Ltd.
+
+usb:v2A70p4EE7*
+ ID_MODEL_FROM_DATABASE=ONEPLUS A3010 [OnePlus 3T] / A5010 [OnePlus 5T] / A6003 [OnePlus 6] (Charging + USB debugging modes)
+
+usb:v2A70p904D*
+ ID_MODEL_FROM_DATABASE=A3000 phone (PTP mode) [3T]
+
+usb:v2A70p904E*
+ ID_MODEL_FROM_DATABASE=A3000 phone (PTP mode, with debug) [3T]
+
+usb:v2A88*
+ ID_VENDOR_FROM_DATABASE=DFU Technology Ltd
+
+usb:v2A88pFFFF*
+ ID_MODEL_FROM_DATABASE=DFU
+
+usb:v2A8D*
+ ID_VENDOR_FROM_DATABASE=Keysight Technologies, Inc.
+
+usb:v2AB6*
+ ID_VENDOR_FROM_DATABASE=T+A elektroakustik GmbH & Co KG, Germany
+
+usb:v2AB6p0001*
+ ID_MODEL_FROM_DATABASE=PDP3000HV DAC
+
+usb:v2AB6p0002*
+ ID_MODEL_FROM_DATABASE=MP1000E, MP2000R, MP2500R, MP3100HV
+
+usb:v2AB6p0003*
+ ID_MODEL_FROM_DATABASE=TA HD AUDIO V2
+
 usb:v2AC7*
  ID_VENDOR_FROM_DATABASE=Ultrahaptics Ltd.
 
@@ -58649,11 +66308,173 @@ usb:v2AC7p0113*
 usb:v2AC7pFFFF*
  ID_MODEL_FROM_DATABASE=DFU
 
+usb:v2AD1*
+ ID_VENDOR_FROM_DATABASE=Picotronic GmbH
+
+usb:v2AD1p7AB8*
+ ID_MODEL_FROM_DATABASE=Turningtable
+
+usb:v2AE5*
+ ID_VENDOR_FROM_DATABASE=Fairphone B.V.
+
+usb:v2AE5p9015*
+ ID_MODEL_FROM_DATABASE=2 (Mass storage & ADB)
+
+usb:v2AE5p9024*
+ ID_MODEL_FROM_DATABASE=2 (RNDIS & ADB)
+
+usb:v2AE5p9039*
+ ID_MODEL_FROM_DATABASE=2 (MTP & ADB)
+
+usb:v2AE5p904D*
+ ID_MODEL_FROM_DATABASE=2 (PTP)
+
+usb:v2AE5p904E*
+ ID_MODEL_FROM_DATABASE=2 (PTP & ADB)
+
+usb:v2AE5p90DE*
+ ID_MODEL_FROM_DATABASE=2 (Charging)
+
+usb:v2AE5pF000*
+ ID_MODEL_FROM_DATABASE=2 (Mass storage)
+
+usb:v2AE5pF003*
+ ID_MODEL_FROM_DATABASE=2 (MTP)
+
+usb:v2AE5pF005*
+ ID_MODEL_FROM_DATABASE=2 (tethering)
+
+usb:v2AE5pF00E*
+ ID_MODEL_FROM_DATABASE=2 (RNDIS)
+
+usb:v2AEC*
+ ID_VENDOR_FROM_DATABASE=Ambiq Micro, Inc.
+
+usb:v2AECp6011*
+ ID_MODEL_FROM_DATABASE=Converter
+
+usb:v2AF4*
+ ID_VENDOR_FROM_DATABASE=ROLI Ltd.
+
+usb:v2AF4p0100*
+ ID_MODEL_FROM_DATABASE=Seaboard GRAND
+
+usb:v2AF4p0200*
+ ID_MODEL_FROM_DATABASE=Seaboard RISE
+
+usb:v2AF4p0300*
+ ID_MODEL_FROM_DATABASE=BlueWing Proto
+
+usb:v2AF4p0400*
+ ID_MODEL_FROM_DATABASE=VOICE
+
+usb:v2AF4p0500*
+ ID_MODEL_FROM_DATABASE=BLOCKS
+
+usb:v2B03*
+ ID_VENDOR_FROM_DATABASE=STEREOLABS
+
+usb:v2B03pF580*
+ ID_MODEL_FROM_DATABASE=ZED camera
+
+usb:v2B03pF582*
+ ID_MODEL_FROM_DATABASE=ZED camera
+
+usb:v2B03pF680*
+ ID_MODEL_FROM_DATABASE=ZED-M camera
+
+usb:v2B03pF681*
+ ID_MODEL_FROM_DATABASE=ZED-M HID Interface
+
+usb:v2B03pF682*
+ ID_MODEL_FROM_DATABASE=ZED-M camera
+
+usb:v2B03pF683*
+ ID_MODEL_FROM_DATABASE=ZED-M HID Interface
+
+usb:v2B03pF684*
+ ID_MODEL_FROM_DATABASE=ZED-M camera
+
+usb:v2B0E*
+ ID_VENDOR_FROM_DATABASE=LeEco
+
+usb:v2B0Ep171B*
+ ID_MODEL_FROM_DATABASE=Le2
+
+usb:v2B0Ep171E*
+ ID_MODEL_FROM_DATABASE=Le2 in USB tethering mode
+
+usb:v2B0Ep1830*
+ ID_MODEL_FROM_DATABASE=Le1 Pro
+
+usb:v2B0Ep1844*
+ ID_MODEL_FROM_DATABASE=Le Max2
+
+usb:v2B0Ep2B0E*
+ ID_MODEL_FROM_DATABASE=LeEco
+
+usb:v2B0Ep6108*
+ ID_MODEL_FROM_DATABASE=Lex720 [LePro 3] in connection sharing usb
+
+usb:v2B0Ep610B*
+ ID_MODEL_FROM_DATABASE=Lex720 [LePro 3] in Camera mode
+
+usb:v2B0Ep610C*
+ ID_MODEL_FROM_DATABASE=Lex720 [LePro 3]
+
+usb:v2B0Ep610D*
+ ID_MODEL_FROM_DATABASE=Lex720 [LePro 3] in debug
+
+usb:v2B23*
+ ID_VENDOR_FROM_DATABASE=Red Hat, Inc.
+
+usb:v2B23pCAFE*
+ ID_MODEL_FROM_DATABASE=UsbDk (USB Development Kit)
+
 usb:v2B24*
  ID_VENDOR_FROM_DATABASE=KeepKey LLC
 
 usb:v2B24p0001*
- ID_MODEL_FROM_DATABASE=Bitcoin hardware wallet
+ ID_MODEL_FROM_DATABASE=Bitcoin Wallet [KeepKey]
+
+usb:v2B24p0002*
+ ID_MODEL_FROM_DATABASE=Bitcoin Wallet
+
+usb:v2B3E*
+ ID_VENDOR_FROM_DATABASE=NewAE Technology Inc.
+
+usb:v2B3EpACE2*
+ ID_MODEL_FROM_DATABASE=CW1173 [ChipWhisperer-Lite]
+
+usb:v2B4C*
+ ID_VENDOR_FROM_DATABASE=ZUK
+
+usb:v2B4Cp1004*
+ ID_MODEL_FROM_DATABASE=Z1 MTP
+
+usb:v2BC5*
+ ID_VENDOR_FROM_DATABASE=Orbbec 3D Technology International, Inc
+
+usb:v2BC5p0401*
+ ID_MODEL_FROM_DATABASE=Astra
+
+usb:v2BC5p0403*
+ ID_MODEL_FROM_DATABASE=Astra Pro
+
+usb:v2BC5p0407*
+ ID_MODEL_FROM_DATABASE=Astra Mini S
+
+usb:v2BCC*
+ ID_VENDOR_FROM_DATABASE=InoTec GmbH Organisationssysteme
+
+usb:v2BD6*
+ ID_VENDOR_FROM_DATABASE=Coroware, Inc.
+
+usb:v2BD6p4201*
+ ID_MODEL_FROM_DATABASE=RS-485 Controller and Interface [Cypress Semiconductor]
+
+usb:v2BD8*
+ ID_VENDOR_FROM_DATABASE=ROPEX Industrie-Elektronik GmbH
 
 usb:v2C02*
  ID_VENDOR_FROM_DATABASE=Planex Communications
@@ -58667,6 +66488,39 @@ usb:v2C1A*
 usb:v2C1Ap0000*
  ID_MODEL_FROM_DATABASE=Wireless Optical Mouse
 
+usb:v2C23*
+ ID_VENDOR_FROM_DATABASE=Supermicro Computer Incorporated
+
+usb:v2C23p1B83*
+ ID_MODEL_FROM_DATABASE=NIC
+
+usb:v2C4E*
+ ID_VENDOR_FROM_DATABASE=Mercucys INC
+
+usb:v2C4Ep0100*
+ ID_MODEL_FROM_DATABASE=MW300UM RTL8192EU wifi
+
+usb:v2C4F*
+ ID_VENDOR_FROM_DATABASE=Canon Electronic Business Machines Co., Ltd.
+
+usb:v2C4Fp3003*
+ ID_MODEL_FROM_DATABASE=PR Wireless Presenter
+
+usb:v2C55*
+ ID_VENDOR_FROM_DATABASE=Magic Leap, Inc.
+
+usb:v2C55pA100*
+ ID_MODEL_FROM_DATABASE=ML1 Lightpack (MLDB)
+
+usb:v2C55pB100*
+ ID_MODEL_FROM_DATABASE=ML1 Lightpack (fastboot)
+
+usb:v2C55pC001*
+ ID_MODEL_FROM_DATABASE=ML1 Control (COM)
+
+usb:v2C55pC002*
+ ID_MODEL_FROM_DATABASE=ML1 Control (Bootloader)
+
 usb:v2C7C*
  ID_VENDOR_FROM_DATABASE=Quectel Wireless Solutions Co., Ltd.
 
@@ -58691,27 +66545,456 @@ usb:v2C7Cp0306*
 usb:v2C7Cp0435*
  ID_MODEL_FROM_DATABASE=AG35 LTE modem
 
+usb:v2C97*
+ ID_VENDOR_FROM_DATABASE=Ledger
+
+usb:v2C97p0000*
+ ID_MODEL_FROM_DATABASE=Blue
+
+usb:v2C97p0001*
+ ID_MODEL_FROM_DATABASE=Nano S
+
+usb:v2C97p0004*
+ ID_MODEL_FROM_DATABASE=Nano X
+
+usb:v2C99*
+ ID_VENDOR_FROM_DATABASE=Prusa
+
+usb:v2C99p0001*
+ ID_MODEL_FROM_DATABASE=i3 MK2S
+
+usb:v2C9C*
+ ID_VENDOR_FROM_DATABASE=Vayyar Imaging Ltd.
+
+usb:v2C9Cp1000*
+ ID_MODEL_FROM_DATABASE=Walabot Makers Series
+
+usb:v2C9Cp1020*
+ ID_MODEL_FROM_DATABASE=Walabot DIY
+
+usb:v2C9Cp1022*
+ ID_MODEL_FROM_DATABASE=Walabot DIY Plus
+
+usb:v2C9Cp1030*
+ ID_MODEL_FROM_DATABASE=Walabot Home (vHC)
+
+usb:v2C9Cp9100*
+ ID_MODEL_FROM_DATABASE=VNAKit
+
+usb:v2C9D*
+ ID_VENDOR_FROM_DATABASE=Nod Inc
+
+usb:v2C9Dp90A0*
+ ID_MODEL_FROM_DATABASE=Goa
+
+usb:v2C9DpBAC5*
+ ID_MODEL_FROM_DATABASE=Backspin
+
+usb:v2CA3*
+ ID_VENDOR_FROM_DATABASE=DJI Technology Co., Ltd.
+
+usb:v2CA3p0008*
+ ID_MODEL_FROM_DATABASE=Mavic Mini MR1SD25 Remote controller
+
+usb:v2CB7*
+ ID_VENDOR_FROM_DATABASE=Fibocom
+
+usb:v2CB7p0210*
+ ID_MODEL_FROM_DATABASE=L830-EB-00 LTE WWAN Modem
+
+usb:v2CC0*
+ ID_VENDOR_FROM_DATABASE=Hangzhou Zero Zero Infinity Technology Co., Ltd.
+
+usb:v2CC2*
+ ID_VENDOR_FROM_DATABASE=Lautsprecher Teufel GmbH
+
+usb:v2CCF*
+ ID_VENDOR_FROM_DATABASE=Hypersecu
+
+usb:v2CCFp0880*
+ ID_MODEL_FROM_DATABASE=HyperFIDO
+
+usb:v2CD9*
+ ID_VENDOR_FROM_DATABASE=Cambrionix Ltd
+
+usb:v2CD9p0804*
+ ID_MODEL_FROM_DATABASE=PowerSync4 USBPD Hub
+
 usb:v2CDC*
  ID_VENDOR_FROM_DATABASE=Sea & Sun Technology GmbH
 
 usb:v2CDCpF232*
  ID_MODEL_FROM_DATABASE=CTD48Mc CTD Probe
 
+usb:v2CE5*
+ ID_VENDOR_FROM_DATABASE=InX8 Inc [AKiTiO]
+
+usb:v2CE5p0014*
+ ID_MODEL_FROM_DATABASE=Mass Storage [NT2 U31C]
+
+usb:v2CF0*
+ ID_VENDOR_FROM_DATABASE=Nuand LLC
+
+usb:v2CF0p5246*
+ ID_MODEL_FROM_DATABASE=bladeRF
+
+usb:v2CF0p5250*
+ ID_MODEL_FROM_DATABASE=bladeRF 2.0 micro
+
+usb:v2D1F*
+ ID_VENDOR_FROM_DATABASE=Wacom Taiwan Information Co. Ltd.
+
+usb:v2D25*
+ ID_VENDOR_FROM_DATABASE=Kronegger GmbH.
+
+usb:v2D2D*
+ ID_VENDOR_FROM_DATABASE=proxmark.org
+
+usb:v2D2Dp504D*
+ ID_MODEL_FROM_DATABASE=Proxmark3
+
+usb:v2D37*
+ ID_VENDOR_FROM_DATABASE=Zhuhai Poskey Technology Co.,Ltd
+
+usb:v2D6B*
+ ID_VENDOR_FROM_DATABASE=NetUP Inc.
+
+usb:v2D6Bp7777*
+ ID_MODEL_FROM_DATABASE=Joker TV universal DTV receiver
+
+usb:v2D81*
+ ID_VENDOR_FROM_DATABASE=Evollve Inc.
+
+usb:v2D81p4F01*
+ ID_MODEL_FROM_DATABASE=Ozobot Evo
+
+usb:v2D84*
+ ID_VENDOR_FROM_DATABASE=Zhuhai Poskey Technology Co.,Ltd
+
+usb:v2D84pB806*
+ ID_MODEL_FROM_DATABASE=DT-108B Thermal Label Printer
+
+usb:v2DC8*
+ ID_VENDOR_FROM_DATABASE=8BitDo
+
+usb:v2DC8p5006*
+ ID_MODEL_FROM_DATABASE=M30 Bluetooth gamepad
+
+usb:v2DC8p5750*
+ ID_MODEL_FROM_DATABASE=Bootloader
+
+usb:v2DC8p6000*
+ ID_MODEL_FROM_DATABASE=SF30 Pro gamepad
+
+usb:v2DC8p6001*
+ ID_MODEL_FROM_DATABASE=SN30/SF30 Pro gamepad
+
+usb:v2DC8pAB11*
+ ID_MODEL_FROM_DATABASE=F30 gamepad
+
+usb:v2DC8pAB12*
+ ID_MODEL_FROM_DATABASE=N30 gamepad
+
+usb:v2DC8pAB20*
+ ID_MODEL_FROM_DATABASE=SN30/SF30 gamepad
+
+usb:v2DC8pAB21*
+ ID_MODEL_FROM_DATABASE=SF30 gamepad
+
 usb:v2DCF*
  ID_VENDOR_FROM_DATABASE=Dialog Semiconductor
 
+usb:v2DCFpC951*
+ ID_MODEL_FROM_DATABASE=Audio Class 1.0 Devices
+
 usb:v2DCFpC952*
  ID_MODEL_FROM_DATABASE=Audio Class 2.0 Devices
 
+usb:v2DEF*
+ ID_VENDOR_FROM_DATABASE=Kirale Technologies
+
+usb:v2DEFp0000*
+ ID_MODEL_FROM_DATABASE=KiNOS Boot DFU
+
+usb:v2DEFp0102*
+ ID_MODEL_FROM_DATABASE=KTWM102 Module
+
+usb:v2DF2*
+ ID_VENDOR_FROM_DATABASE=LIPS Corporation
+
+usb:v2DF2p0213*
+ ID_MODEL_FROM_DATABASE=LIPSedge DL 3D ToF Camera
+
+usb:v2DF2p0215*
+ ID_MODEL_FROM_DATABASE=LIPSedge DL RGB Camera
+
+usb:v2DF2p2102*
+ ID_MODEL_FROM_DATABASE=LIPSedge 5 Megapixel RGB Camera
+
+usb:v2E04*
+ ID_VENDOR_FROM_DATABASE=HMD Global
+
+usb:v2E04p0001*
+ ID_MODEL_FROM_DATABASE=Nokia 3310 3G
+
+usb:v2E04p0002*
+ ID_MODEL_FROM_DATABASE=Nokia 3310 3G
+
+usb:v2E04p0A14*
+ ID_MODEL_FROM_DATABASE=Nokia 3310 3G
+
+usb:v2E04pC008*
+ ID_MODEL_FROM_DATABASE=Tethering Network Interface
+
+usb:v2E04pC009*
+ ID_MODEL_FROM_DATABASE=Nokia 1 (bootloader)
+
+usb:v2E04pC025*
+ ID_MODEL_FROM_DATABASE=Nokia 8 (MTP mode)
+
+usb:v2E04pC026*
+ ID_MODEL_FROM_DATABASE=Nokia Smartphone
+
+usb:v2E04pC029*
+ ID_MODEL_FROM_DATABASE=Nokia 8 (PTP mode)
+
+usb:v2E04pC031*
+ ID_MODEL_FROM_DATABASE=Nokia 1 (PTP)
+
+usb:v2E04pC03F*
+ ID_MODEL_FROM_DATABASE=Nokia 8 (MIDI mode)
+
+usb:v2E0E*
+ ID_VENDOR_FROM_DATABASE=Hatteland Display AS
+
+usb:v2E0Ep0001*
+ ID_MODEL_FROM_DATABASE=CAN Gateway
+
+usb:v2E24*
+ ID_VENDOR_FROM_DATABASE=Hyperkin
+
+usb:v2E24p0652*
+ ID_MODEL_FROM_DATABASE=Duke Xbox One controller
+
+usb:v2E24p1688*
+ ID_MODEL_FROM_DATABASE=X91 Xbox One controller
+
+usb:v2E3B*
+ ID_VENDOR_FROM_DATABASE=uSens Inc.
+
+usb:v2E57*
+ ID_VENDOR_FROM_DATABASE=MEGWARE Computer Vertrieb und Service GmbH
+
+usb:v2E57p454D*
+ ID_MODEL_FROM_DATABASE=SlideSX EnergyMeter
+
+usb:v2E57p454E*
+ ID_MODEL_FROM_DATABASE=SlideSX EnergyMeter DFU
+
+usb:v2E57p5CBA*
+ ID_MODEL_FROM_DATABASE=SlideSX / ClustSafe Bus Adapter
+
+usb:v2E69*
+ ID_VENDOR_FROM_DATABASE=Swift Navigation
+
+usb:v2E69p1001*
+ ID_MODEL_FROM_DATABASE=Piksi Multi
+
+usb:v2E95*
+ ID_VENDOR_FROM_DATABASE=SCUF Gaming
+
+usb:v2E95p7725*
+ ID_MODEL_FROM_DATABASE=Controller
+
+usb:v2F76*
+ ID_VENDOR_FROM_DATABASE=KeyXentic Inc.
+
+usb:v2F76p0905*
+ ID_MODEL_FROM_DATABASE=KX905 Smart Terminal
+
+usb:v2F76p0906*
+ ID_MODEL_FROM_DATABASE=KX906 Smart Card Reader
+
+usb:v2F76p1906*
+ ID_MODEL_FROM_DATABASE=KX906 Smart Token (Mass Storage)
+
+usb:v2FAD*
+ ID_VENDOR_FROM_DATABASE=Definium Technologies
+
+usb:v2FB0*
+ ID_VENDOR_FROM_DATABASE=Infocrypt
+
 usb:v2FB2*
  ID_VENDOR_FROM_DATABASE=Fujitsu, Ltd
 
+usb:v2FC0*
+ ID_VENDOR_FROM_DATABASE=Sensidyne, LP
+
+usb:v2FC0p0001*
+ ID_MODEL_FROM_DATABASE=Project Archer
+
+usb:v2FC6*
+ ID_VENDOR_FROM_DATABASE=Comtrue Inc.
+
+usb:v2FC6p6012*
+ ID_MODEL_FROM_DATABASE=UAC2 Device GB
+
+usb:v2FE0*
+ ID_VENDOR_FROM_DATABASE=Xaptum, Inc.
+
+usb:v2FE0p8B01*
+ ID_MODEL_FROM_DATABASE=XAP-RC-001 ENF Router Card
+
+usb:v2FE0p8B02*
+ ID_MODEL_FROM_DATABASE=XAP-RW-001 ENF Router Card with WiFi
+
+usb:v2FE0p8BDE*
+ ID_MODEL_FROM_DATABASE=XAP-EA-002 ENF Access Card
+
+usb:v2FE0p8BEE*
+ ID_MODEL_FROM_DATABASE=XAP-EA-003 ENF Access Card
+
+usb:v2FE3*
+ ID_VENDOR_FROM_DATABASE=NordicSemiconductor
+
+usb:v2FE7*
+ ID_VENDOR_FROM_DATABASE=ELGIN S.A.
+
+usb:v2FE7p0001*
+ ID_MODEL_FROM_DATABASE=SMART S@T
+
+usb:v2FEB*
+ ID_VENDOR_FROM_DATABASE=Beijing Veikk E-Commerce Co., Ltd.
+
+usb:v2FEBp0004*
+ ID_MODEL_FROM_DATABASE=Veikk A15 Pen Tablet
+
+usb:v2FF4*
+ ID_VENDOR_FROM_DATABASE=Quixant Plc
+
 usb:v3016*
  ID_VENDOR_FROM_DATABASE=Boundary Devices, LLC
 
 usb:v3016p0001*
  ID_MODEL_FROM_DATABASE=Nitrogen Bootloader
 
+usb:v3036*
+ ID_VENDOR_FROM_DATABASE=Control iD
+
+usb:v3036p0001*
+ ID_MODEL_FROM_DATABASE=Print iD
+
+usb:v3036p0002*
+ ID_MODEL_FROM_DATABASE=iDBio
+
+usb:v3037*
+ ID_VENDOR_FROM_DATABASE=Beijing Chushifengmang Technology Development Co.,Ltd.
+
+usb:v3057*
+ ID_VENDOR_FROM_DATABASE=Kingsis Corporation
+
+usb:v3057p0002*
+ ID_MODEL_FROM_DATABASE=ZOWIE Gaming mouse
+
+usb:v308F*
+ ID_VENDOR_FROM_DATABASE=Input Club
+
+usb:v308Fp0000*
+ ID_MODEL_FROM_DATABASE=Infinity 60% Bootloader
+
+usb:v308Fp0001*
+ ID_MODEL_FROM_DATABASE=Infinity 60% - Standard
+
+usb:v308Fp0002*
+ ID_MODEL_FROM_DATABASE=Infinity 60% - Hacker
+
+usb:v308Fp0003*
+ ID_MODEL_FROM_DATABASE=Infinity Ergodox Bootloader
+
+usb:v308Fp0004*
+ ID_MODEL_FROM_DATABASE=Infinity Ergodox
+
+usb:v308Fp0005*
+ ID_MODEL_FROM_DATABASE=WhiteFox Bootloader
+
+usb:v308Fp0006*
+ ID_MODEL_FROM_DATABASE=WhiteFox - Vanilla
+
+usb:v308Fp0007*
+ ID_MODEL_FROM_DATABASE=WhiteFox - ISO
+
+usb:v308Fp0008*
+ ID_MODEL_FROM_DATABASE=WhiteFox - Aria
+
+usb:v308Fp0009*
+ ID_MODEL_FROM_DATABASE=WhiteFox - Winkeyless
+
+usb:v308Fp000A*
+ ID_MODEL_FROM_DATABASE=WhiteFox - True Fox
+
+usb:v308Fp000B*
+ ID_MODEL_FROM_DATABASE=WhiteFox - Jack of All Trades
+
+usb:v308Fp000C*
+ ID_MODEL_FROM_DATABASE=Infinity 60% LED Bootloader
+
+usb:v308Fp000D*
+ ID_MODEL_FROM_DATABASE=Infinity 60% LED - Standard
+
+usb:v308Fp000E*
+ ID_MODEL_FROM_DATABASE=Infinity 60% LED - Hacker
+
+usb:v308Fp000F*
+ ID_MODEL_FROM_DATABASE=Infinity 60% LED - Alphabet
+
+usb:v308Fp0010*
+ ID_MODEL_FROM_DATABASE=K-Type Bootloader
+
+usb:v308Fp0011*
+ ID_MODEL_FROM_DATABASE=K-Type
+
+usb:v308Fp0012*
+ ID_MODEL_FROM_DATABASE=Kira Bootloader
+
+usb:v308Fp0013*
+ ID_MODEL_FROM_DATABASE=Kira
+
+usb:v308Fp0014*
+ ID_MODEL_FROM_DATABASE=Gemini Dawn/Dusk Bootloader
+
+usb:v308Fp0015*
+ ID_MODEL_FROM_DATABASE=Gemini Dawn/Dusk
+
+usb:v308Fp0016*
+ ID_MODEL_FROM_DATABASE=Re:Type Bootloader
+
+usb:v308Fp0017*
+ ID_MODEL_FROM_DATABASE=Re:Type
+
+usb:v308Fp0018*
+ ID_MODEL_FROM_DATABASE=Re:Type USB Hub
+
+usb:v308Fp0019*
+ ID_MODEL_FROM_DATABASE=WhiteFox (SAM4S) Bootloader
+
+usb:v308Fp001A*
+ ID_MODEL_FROM_DATABASE=WhiteFox (SAM4S) - Vanilla
+
+usb:v308Fp001B*
+ ID_MODEL_FROM_DATABASE=WhiteFox (SAM4S) - ISO
+
+usb:v308Fp001C*
+ ID_MODEL_FROM_DATABASE=WhiteFox (SAM4S) - Aria
+
+usb:v308Fp001D*
+ ID_MODEL_FROM_DATABASE=WhiteFox (SAM4S) - Winkeyless
+
+usb:v308Fp001E*
+ ID_MODEL_FROM_DATABASE=WhiteFox (SAM4S) - True Fox
+
+usb:v308Fp001F*
+ ID_MODEL_FROM_DATABASE=WhiteFox (SAM4S) - Jack of All Trades
+
 usb:v30A4*
  ID_VENDOR_FROM_DATABASE=Blues Wireless
 
@@ -58724,12 +67007,39 @@ usb:v30C2*
 usb:v30C2p1388*
  ID_MODEL_FROM_DATABASE=SPL Meter
 
+usb:v30C9*
+ ID_VENDOR_FROM_DATABASE=Luxvisions Innotech Limited
+
 usb:v30EE*
  ID_VENDOR_FROM_DATABASE=Fujitsu Connected Technologies Limited
 
 usb:v30EEp1001*
  ID_MODEL_FROM_DATABASE=F-01L
 
+usb:v30F2*
+ ID_VENDOR_FROM_DATABASE=Varex Imaging
+
+usb:v3111*
+ ID_VENDOR_FROM_DATABASE=Hiperscan GmbH
+
+usb:v3111p0000*
+ ID_MODEL_FROM_DATABASE=SGS-NT Microspectrometer
+
+usb:v3112*
+ ID_VENDOR_FROM_DATABASE=Meteca SA
+
+usb:v3112p0001*
+ ID_MODEL_FROM_DATABASE=MBC-WB01 (CDC-ACM)
+
+usb:v3112p0002*
+ ID_MODEL_FROM_DATABASE=MBC-WB01 (Bootloader)
+
+usb:v3112p0003*
+ ID_MODEL_FROM_DATABASE=ABC (CDC ACM)
+
+usb:v3112p0004*
+ ID_MODEL_FROM_DATABASE=ABC (Bootloader)
+
 usb:v3125*
  ID_VENDOR_FROM_DATABASE=Eagletron
 
@@ -58739,6 +67049,45 @@ usb:v3125p0001*
 usb:v3136*
  ID_VENDOR_FROM_DATABASE=Navini Networks
 
+usb:v3145*
+ ID_VENDOR_FROM_DATABASE=SafeLogic Inc.
+
+usb:v3147*
+ ID_VENDOR_FROM_DATABASE=Tanvas, Inc.
+
+usb:v316C*
+ ID_VENDOR_FROM_DATABASE=SigmaSense, LLC
+
+usb:v316D*
+ ID_VENDOR_FROM_DATABASE=Purism, SPC
+
+usb:v316Dp4C4B*
+ ID_MODEL_FROM_DATABASE=Librem Key
+
+usb:v316E*
+ ID_VENDOR_FROM_DATABASE=SPECINFOSYSTEMS
+
+usb:v316Ep0001*
+ ID_MODEL_FROM_DATABASE=DIAMOND token
+
+usb:v3171*
+ ID_VENDOR_FROM_DATABASE=8086 Consultancy
+
+usb:v3171p0011*
+ ID_MODEL_FROM_DATABASE=ClusterCTRL DA
+
+usb:v3171p0012*
+ ID_MODEL_FROM_DATABASE=ClusterCTRL pHAT
+
+usb:v3171p0013*
+ ID_MODEL_FROM_DATABASE=ClusterCTRL A+6
+
+usb:v3171p0014*
+ ID_MODEL_FROM_DATABASE=ClusterCTRL Triple
+
+usb:v3171p0015*
+ ID_MODEL_FROM_DATABASE=ClusterCTRL Single
+
 usb:v3176*
  ID_VENDOR_FROM_DATABASE=Whanam Electronics Co., Ltd
 
@@ -58754,12 +67103,66 @@ usb:v3195pF280*
 usb:v3195pF281*
  ID_MODEL_FROM_DATABASE=MSO-28
 
+usb:v31C9*
+ ID_VENDOR_FROM_DATABASE=BeiJing LanXum Computer Technology Co., Ltd.
+
+usb:v31C9p1001*
+ ID_MODEL_FROM_DATABASE=Printer
+
+usb:v31C9p1301*
+ ID_MODEL_FROM_DATABASE=Black and White Laser Printer
+
+usb:v31C9p1501*
+ ID_MODEL_FROM_DATABASE=LaserPrint GA50 series
+
+usb:v3200*
+ ID_VENDOR_FROM_DATABASE=Alcatel-Lucent Enterprise
+
+usb:v3200p2100*
+ ID_MODEL_FROM_DATABASE=ALE 8058s
+
+usb:v3200p2101*
+ ID_MODEL_FROM_DATABASE=ALE 8068s
+
+usb:v3200p2102*
+ ID_MODEL_FROM_DATABASE=8078s
+
+usb:v3219*
+ ID_VENDOR_FROM_DATABASE=Smak Tecnologia e Automacao LTDA
+
+usb:v3219p0044*
+ ID_MODEL_FROM_DATABASE=SKO44 Optical Keyboard
+
+usb:v321C*
+ ID_VENDOR_FROM_DATABASE=Premio, Inc.
+
+usb:v324C*
+ ID_VENDOR_FROM_DATABASE=CUPRIS Ltd.
+
+usb:v326D*
+ ID_VENDOR_FROM_DATABASE=Agile Display Solutions Co., Ltd
+
+usb:v326Dp0001*
+ ID_MODEL_FROM_DATABASE=Avocor USB Camera
+
 usb:v3275*
  ID_VENDOR_FROM_DATABASE=VidzMedia Pte Ltd
 
 usb:v3275p4FB1*
  ID_MODEL_FROM_DATABASE=MonsterTV P2H
 
+usb:v3293*
+ ID_VENDOR_FROM_DATABASE=Unhuman Inc.
+
+usb:v32B3*
+ ID_VENDOR_FROM_DATABASE=TEXA
+
+usb:v32B3pD1A6*
+ ID_MODEL_FROM_DATABASE=TXT Multihub
+
+usb:v32B3pD1A7*
+ ID_MODEL_FROM_DATABASE=TXT Multihub
+
 usb:v3333*
  ID_VENDOR_FROM_DATABASE=InLine
 
@@ -58784,12 +67187,21 @@ usb:v3340p0E3A*
 usb:v3340pA0A3*
  ID_MODEL_FROM_DATABASE=deltaX 5 BT (D) PDA
 
+usb:v3340pFFFF*
+ ID_MODEL_FROM_DATABASE=Mio DigiWalker Sync
+
 usb:v3344*
  ID_VENDOR_FROM_DATABASE=Leaguer Microelectronics (LME)
 
 usb:v3344p3744*
  ID_MODEL_FROM_DATABASE=OEM PC Remote
 
+usb:v348F*
+ ID_VENDOR_FROM_DATABASE=ISY
+
+usb:v348Fp2322*
+ ID_MODEL_FROM_DATABASE=Wireless Presenter
+
 usb:v3504*
  ID_VENDOR_FROM_DATABASE=Micro Star
 
@@ -58814,6 +67226,9 @@ usb:v3538p0042*
 usb:v3538p0054*
  ID_MODEL_FROM_DATABASE=Flash Drive (2GB)
 
+usb:v3538p0901*
+ ID_MODEL_FROM_DATABASE=Traveling Disk U273 (4GB)
+
 usb:v3579*
  ID_VENDOR_FROM_DATABASE=DIVA
 
@@ -58824,17 +67239,26 @@ usb:v357D*
  ID_VENDOR_FROM_DATABASE=Sharkoon
 
 usb:v357Dp7788*
- ID_MODEL_FROM_DATABASE=QuickPort XT
+ ID_MODEL_FROM_DATABASE=JMicron JMS567 ATA/ATAPI Bridge
 
 usb:v3636*
  ID_VENDOR_FROM_DATABASE=InVibro
 
+usb:v3767*
+ ID_VENDOR_FROM_DATABASE=Fanatec
+
+usb:v3767p0101*
+ ID_MODEL_FROM_DATABASE=Speedster 3 Forceshock Wheel
+
 usb:v3838*
  ID_VENDOR_FROM_DATABASE=WEM
 
 usb:v3838p0001*
  ID_MODEL_FROM_DATABASE=5-in-1 Card Reader
 
+usb:v3838p1031*
+ ID_MODEL_FROM_DATABASE=2.4G Wireless Mouse
+
 usb:v3923*
  ID_VENDOR_FROM_DATABASE=National Instruments Corp.
 
@@ -58886,21 +67310,75 @@ usb:v3923p2F80*
 usb:v3923p2F90*
  ID_MODEL_FROM_DATABASE=DAQPad-6052E
 
-usb:v3923p702B*
+usb:v3923p702A*
  ID_MODEL_FROM_DATABASE=GPIB-USB-B
 
+usb:v3923p702B*
+ ID_MODEL_FROM_DATABASE=GPIB-USB-B Initialization
+
 usb:v3923p703C*
  ID_MODEL_FROM_DATABASE=USB-485 RS485 Cable
 
 usb:v3923p709B*
  ID_MODEL_FROM_DATABASE=GPIB-USB-HS
 
+usb:v3923p7166*
+ ID_MODEL_FROM_DATABASE=USB-8451
+
+usb:v3923p716E*
+ ID_MODEL_FROM_DATABASE=USB-8451 Firmware Loader
+
+usb:v3923p717A*
+ ID_MODEL_FROM_DATABASE=USB-6008
+
+usb:v3923p717B*
+ ID_MODEL_FROM_DATABASE=USB-6009
+
+usb:v3923p71D6*
+ ID_MODEL_FROM_DATABASE=USB-6008 OEM
+
+usb:v3923p71D7*
+ ID_MODEL_FROM_DATABASE=USB-6009 OEM
+
+usb:v3923p71D8*
+ ID_MODEL_FROM_DATABASE=USB-6009 OEM
+
 usb:v3923p7254*
  ID_MODEL_FROM_DATABASE=NI MIO (data acquisition card) firmware updater
 
 usb:v3923p729E*
  ID_MODEL_FROM_DATABASE=USB-6251 (OEM) data acquisition card
 
+usb:v3923p7346*
+ ID_MODEL_FROM_DATABASE=USB-6229
+
+usb:v3923p755B*
+ ID_MODEL_FROM_DATABASE=myDAQ
+
+usb:v3923p76AF*
+ ID_MODEL_FROM_DATABASE=USB-6000
+
+usb:v3923p76B0*
+ ID_MODEL_FROM_DATABASE=USB-6000 OEM
+
+usb:v3923p76BF*
+ ID_MODEL_FROM_DATABASE=USB-6001
+
+usb:v3923p76C0*
+ ID_MODEL_FROM_DATABASE=USB-6001 OEM
+
+usb:v3923p76C4*
+ ID_MODEL_FROM_DATABASE=USB-6002
+
+usb:v3923p76C5*
+ ID_MODEL_FROM_DATABASE=USB-6002 OEM
+
+usb:v3923p76C6*
+ ID_MODEL_FROM_DATABASE=USB-6003
+
+usb:v3923p76C7*
+ ID_MODEL_FROM_DATABASE=USB-6003 OEM
+
 usb:v40BB*
  ID_VENDOR_FROM_DATABASE=I-O Data
 
@@ -59013,7 +67491,7 @@ usb:v413Cp2002*
  ID_MODEL_FROM_DATABASE=SK-8125 Keyboard
 
 usb:v413Cp2003*
- ID_MODEL_FROM_DATABASE=Keyboard
+ ID_MODEL_FROM_DATABASE=Keyboard SK-8115
 
 usb:v413Cp2005*
  ID_MODEL_FROM_DATABASE=RT7D50 Keyboard
@@ -59028,17 +67506,32 @@ usb:v413Cp2100*
  ID_MODEL_FROM_DATABASE=SK-3106 Keyboard
 
 usb:v413Cp2101*
- ID_MODEL_FROM_DATABASE=SmartCard Reader Keyboard
+ ID_MODEL_FROM_DATABASE=SK-3205 SmartCard Reader Keyboard
 
 usb:v413Cp2105*
  ID_MODEL_FROM_DATABASE=Model L100 Keyboard
 
 usb:v413Cp2106*
- ID_MODEL_FROM_DATABASE=Dell QuietKey Keyboard
+ ID_MODEL_FROM_DATABASE=QuietKey Keyboard
+
+usb:v413Cp2107*
+ ID_MODEL_FROM_DATABASE=KB212-B Quiet Key Keyboard
+
+usb:v413Cp2113*
+ ID_MODEL_FROM_DATABASE=KB216 Wired Keyboard
+
+usb:v413Cp2134*
+ ID_MODEL_FROM_DATABASE=Hub of E-Port Replicator
+
+usb:v413Cp21D7*
+ ID_MODEL_FROM_DATABASE=Dell Wireless 5560 HSPA+ Mobile Broadband Modem
 
 usb:v413Cp2500*
  ID_MODEL_FROM_DATABASE=DRAC4 Remote Access Card
 
+usb:v413Cp2501*
+ ID_MODEL_FROM_DATABASE=Keyboard and mouse dongle
+
 usb:v413Cp2513*
  ID_MODEL_FROM_DATABASE=internal USB Hub of E-Port Replicator
 
@@ -59051,6 +67544,12 @@ usb:v413Cp3012*
 usb:v413Cp3016*
  ID_MODEL_FROM_DATABASE=Optical 5-Button Wheel Mouse
 
+usb:v413Cp301A*
+ ID_MODEL_FROM_DATABASE=Dell MS116 Optical Mouse
+
+usb:v413Cp301B*
+ ID_MODEL_FROM_DATABASE=Universal Bluetooth Receiver
+
 usb:v413Cp3200*
  ID_MODEL_FROM_DATABASE=Mouse
 
@@ -59129,6 +67628,9 @@ usb:v413Cp5124*
 usb:v413Cp5128*
  ID_MODEL_FROM_DATABASE=Photo AIO 928
 
+usb:v413Cp5133*
+ ID_MODEL_FROM_DATABASE=968 AIO Printer
+
 usb:v413Cp5200*
  ID_MODEL_FROM_DATABASE=Laser Printer
 
@@ -59153,6 +67655,9 @@ usb:v413Cp5225*
 usb:v413Cp5226*
  ID_MODEL_FROM_DATABASE=Printing Support
 
+usb:v413Cp5228*
+ ID_MODEL_FROM_DATABASE=Laser Printer 1720dn
+
 usb:v413Cp5300*
  ID_MODEL_FROM_DATABASE=Laser Printer
 
@@ -59162,18 +67667,30 @@ usb:v413Cp5400*
 usb:v413Cp5401*
  ID_MODEL_FROM_DATABASE=Laser Printer
 
+usb:v413Cp5404*
+ ID_MODEL_FROM_DATABASE=1250c Color Printer
+
 usb:v413Cp5513*
  ID_MODEL_FROM_DATABASE=WLA3310 Wireless Adapter [Intersil ISL3887]
 
+usb:v413Cp5534*
+ ID_MODEL_FROM_DATABASE=Hub of E-Port Replicator
+
 usb:v413Cp5601*
  ID_MODEL_FROM_DATABASE=Laser Printer 3100cn
 
 usb:v413Cp5602*
  ID_MODEL_FROM_DATABASE=Laser Printer 3000cn
 
+usb:v413Cp5607*
+ ID_MODEL_FROM_DATABASE=MFP Color Laser Printer 3115cn
+
 usb:v413Cp5631*
  ID_MODEL_FROM_DATABASE=Laser Printer 5100cn
 
+usb:v413Cp564A*
+ ID_MODEL_FROM_DATABASE=C1765 series Multifunction Color LaserPrinter, Scanner & Copier
+
 usb:v413Cp5905*
  ID_MODEL_FROM_DATABASE=Printing Support
 
@@ -59276,6 +67793,9 @@ usb:v413Cp8140*
 usb:v413Cp8142*
  ID_MODEL_FROM_DATABASE=Mobile 360 in DFU
 
+usb:v413Cp8143*
+ ID_MODEL_FROM_DATABASE=Broadcom BCM20702A0 Bluetooth
+
 usb:v413Cp8147*
  ID_MODEL_FROM_DATABASE=F3507g Mobile Broadband Module
 
@@ -59318,9 +67838,30 @@ usb:v413Cp8186*
 usb:v413Cp8187*
  ID_MODEL_FROM_DATABASE=DW375 Bluetooth Module
 
+usb:v413Cp818E*
+ ID_MODEL_FROM_DATABASE=DW5560 miniPCIe HSPA+ Mobile Broadband Modem
+
+usb:v413Cp8197*
+ ID_MODEL_FROM_DATABASE=BCM20702A0 Bluetooth Module
+
+usb:v413Cp81A0*
+ ID_MODEL_FROM_DATABASE=Wireless 5808 Mobile Broadband (Sierra Wireless MC7355 Mini PCIE, 4G UMTS,HSDPA,HSPA+,LTE,1xRTT,EVDO Rev A,GSM,GPRS)
+
+usb:v413Cp81A3*
+ ID_MODEL_FROM_DATABASE=Hub of E-Port Replicator
+
+usb:v413Cp81A8*
+ ID_MODEL_FROM_DATABASE=Wireless 5808 Mobile Broadband (Sierra Wireless Mini PCIE, 4G UMTS,HSDPA,HSPA+,LTE,1xRTT,EVDO Rev A,GSM,GPRS)
+
 usb:v413Cp8501*
  ID_MODEL_FROM_DATABASE=Bluetooth Adapter
 
+usb:v413Cp9001*
+ ID_MODEL_FROM_DATABASE=ATA Bridge
+
+usb:v413Cp9009*
+ ID_MODEL_FROM_DATABASE=Portable Device
+
 usb:v413Cp9500*
  ID_MODEL_FROM_DATABASE=USB CP210x UART Bridge Controller [DW700]
 
@@ -59330,9 +67871,21 @@ usb:v413CpA001*
 usb:v413CpA005*
  ID_MODEL_FROM_DATABASE=Internal 2.0 Hub
 
+usb:v413CpA101*
+ ID_MODEL_FROM_DATABASE=Internal Dual SD Card module
+
+usb:v413CpA102*
+ ID_MODEL_FROM_DATABASE=iDRAC Virtual NIC
+
+usb:v413CpA503*
+ ID_MODEL_FROM_DATABASE=AC511 Sound Bar
+
 usb:v413CpA700*
  ID_MODEL_FROM_DATABASE=Hub (in 1905FP LCD Monitor)
 
+usb:v413CpB007*
+ ID_MODEL_FROM_DATABASE=Streak 5 Android Tablet
+
 usb:v4146*
  ID_VENDOR_FROM_DATABASE=USBest Technology
 
@@ -59381,11 +67934,14 @@ usb:v4317p0711*
 usb:v4317p0720*
  ID_MODEL_FROM_DATABASE=Dynex DX-BUSB
 
+usb:v4317p0721*
+ ID_MODEL_FROM_DATABASE=Dynex DX-EBUSB
+
 usb:v4348*
  ID_VENDOR_FROM_DATABASE=WinChipHead
 
 usb:v4348p5523*
- ID_MODEL_FROM_DATABASE=USB->RS 232 adapter with Prolifec PL 2303 chipset
+ ID_MODEL_FROM_DATABASE=USB->RS 232 adapter with Prolific PL 2303 chipset
 
 usb:v4348p5537*
  ID_MODEL_FROM_DATABASE=13.56Mhz RFID Card Reader and Writer
@@ -59411,6 +67967,9 @@ usb:v4670*
 usb:v4670p9394*
  ID_MODEL_FROM_DATABASE=Game Cube USB Memory Adaptor 64M
 
+usb:v46F4*
+ ID_VENDOR_FROM_DATABASE=QEMU
+
 usb:v4752*
  ID_VENDOR_FROM_DATABASE=Miditech
 
@@ -59441,12 +68000,42 @@ usb:v4855p7288*
 usb:v4971*
  ID_VENDOR_FROM_DATABASE=SimpleTech
 
+usb:v4971p1004*
+ ID_MODEL_FROM_DATABASE=Hitachi LifeStudio Desk (3.5" HDD) [w/o flash key]
+
+usb:v4971p1013*
+ ID_MODEL_FROM_DATABASE=Touro Desk Pro
+
+usb:v4971p1015*
+ ID_MODEL_FROM_DATABASE=Touro Desk 3.0
+
+usb:v4971p8001*
+ ID_MODEL_FROM_DATABASE=G-Tech G-DRIVE Mobile
+
 usb:v4971pCB01*
  ID_MODEL_FROM_DATABASE=SP-U25/120G
 
+usb:v4971pCD15*
+ ID_MODEL_FROM_DATABASE=Simple Drive Mini (2.5" HDD)
+
+usb:v4971pCE07*
+ ID_MODEL_FROM_DATABASE=SimpleDrive (3.5" HDD)
+
+usb:v4971pCE12*
+ ID_MODEL_FROM_DATABASE=FV-U35
+
 usb:v4971pCE17*
  ID_MODEL_FROM_DATABASE=1TB SimpleDrive II USB External Hard Drive
 
+usb:v4971pCE18*
+ ID_MODEL_FROM_DATABASE=(re)Drive
+
+usb:v4971pCE21*
+ ID_MODEL_FROM_DATABASE=JMicron JM20329 SATA Bridge [eg. HITACHI SimpleDrive mini]
+
+usb:v4971pCE22*
+ ID_MODEL_FROM_DATABASE=Hitachi SimpleTough (3.5" HDD)
+
 usb:v4D46*
  ID_VENDOR_FROM_DATABASE=Musical Fidelity
 
@@ -59471,21 +68060,18 @@ usb:v5032p0FA0*
 usb:v5032p0FA1*
  ID_MODEL_FROM_DATABASE=Grandtec USB1.1 DVB-T (warm)
 
-usb:v5041*
- ID_VENDOR_FROM_DATABASE=Linksys (?)
-
-usb:v5041p2234*
- ID_MODEL_FROM_DATABASE=WUSB54G v1 802.11g Adapter [Intersil ISL3886]
-
-usb:v5041p2235*
- ID_MODEL_FROM_DATABASE=WUSB54GP v1 802.11g Adapter [Intersil ISL3886]
-
 usb:v50C2*
  ID_VENDOR_FROM_DATABASE=Averatec (?)
 
 usb:v50C2p4013*
  ID_MODEL_FROM_DATABASE=WLAN Adapter
 
+usb:v5131*
+ ID_VENDOR_FROM_DATABASE=MSR
+
+usb:v5131p2007*
+ ID_MODEL_FROM_DATABASE=MSR-101U Mini HID magnetic card reader
+
 usb:v5173*
  ID_VENDOR_FROM_DATABASE=Sweex
 
@@ -59498,6 +68084,12 @@ usb:v5219*
 usb:v5219p1001*
  ID_MODEL_FROM_DATABASE=Cetus CDC Device
 
+usb:v5332*
+ ID_VENDOR_FROM_DATABASE=Clearly Superior Technologies, Inc.
+
+usb:v5332p1300*
+ ID_MODEL_FROM_DATABASE=CST2545-5W (L-Trac)
+
 usb:v5345*
  ID_VENDOR_FROM_DATABASE=Owon
 
@@ -59510,6 +68102,18 @@ usb:v534C*
 usb:v534Cp0001*
  ID_MODEL_FROM_DATABASE=Bitcoin Wallet [TREZOR]
 
+usb:v534Cp0002*
+ ID_MODEL_FROM_DATABASE=Bitcoin Wallet [TREZOR v2]
+
+usb:v534D*
+ ID_VENDOR_FROM_DATABASE=MacroSilicon
+
+usb:v534Dp0021*
+ ID_MODEL_FROM_DATABASE=MS210x Video Grabber [EasierCAP]
+
+usb:v534Dp6021*
+ ID_MODEL_FROM_DATABASE=VGA Display Adapter
+
 usb:v5354*
  ID_VENDOR_FROM_DATABASE=Meyer Instruments (MIS)
 
@@ -59540,9 +68144,18 @@ usb:v5543p0041*
 usb:v5543p0042*
  ID_MODEL_FROM_DATABASE=Tablet PF1209
 
+usb:v5543p004A*
+ ID_MODEL_FROM_DATABASE=XP-Pen Artist 10S tablet
+
+usb:v5543p004D*
+ ID_MODEL_FROM_DATABASE=Tablet Monitor MSP19U
+
 usb:v5543p0064*
  ID_MODEL_FROM_DATABASE=Aiptek HyperPen 10000U
 
+usb:v5543p3031*
+ ID_MODEL_FROM_DATABASE=Graphics tablet [DrawImage G3, Ugee G3]
+
 usb:v5555*
  ID_VENDOR_FROM_DATABASE=Epiphan Systems Inc.
 
@@ -59573,6 +68186,18 @@ usb:v5555p3411*
 usb:v5555p3422*
  ID_MODEL_FROM_DATABASE=DVI2USB Duo
 
+usb:v5555p3500*
+ ID_MODEL_FROM_DATABASE=DVI2USB3
+
+usb:v5555p3501*
+ ID_MODEL_FROM_DATABASE=DVI2USB3 Rev3
+
+usb:v5555p3510*
+ ID_MODEL_FROM_DATABASE=DVI2USB3_ET
+
+usb:v5555p3520*
+ ID_MODEL_FROM_DATABASE=SDI2USB3
+
 usb:v55AA*
  ID_VENDOR_FROM_DATABASE=OnSpec Electronic, Inc.
 
@@ -59648,6 +68273,18 @@ usb:v5986p0101*
 usb:v5986p0102*
  ID_MODEL_FROM_DATABASE=Crystal Eye Webcam
 
+usb:v5986p0137*
+ ID_MODEL_FROM_DATABASE=HP Webcam
+
+usb:v5986p0141*
+ ID_MODEL_FROM_DATABASE=BisonCam, NB Pro
+
+usb:v5986p0149*
+ ID_MODEL_FROM_DATABASE=HP Webcam-101
+
+usb:v5986p014C*
+ ID_MODEL_FROM_DATABASE=MSI Integrated Webcam
+
 usb:v5986p01A6*
  ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam
 
@@ -59660,18 +68297,87 @@ usb:v5986p01A9*
 usb:v5986p0200*
  ID_MODEL_FROM_DATABASE=OrbiCam
 
+usb:v5986p0202*
+ ID_MODEL_FROM_DATABASE=Fujitsu Webcam
+
 usb:v5986p0203*
  ID_MODEL_FROM_DATABASE=BisonCam NB Pro 1300
 
+usb:v5986p0205*
+ ID_MODEL_FROM_DATABASE=Lenovo EasyCamera
+
+usb:v5986p0217*
+ ID_MODEL_FROM_DATABASE=Integrated Webcam
+
 usb:v5986p0241*
  ID_MODEL_FROM_DATABASE=BisonCam, NB Pro
 
+usb:v5986p0268*
+ ID_MODEL_FROM_DATABASE=SunplusIT INC. Integrated Camera
+
+usb:v5986p026A*
+ ID_MODEL_FROM_DATABASE=Integrated Camera
+
+usb:v5986p0292*
+ ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam
+
+usb:v5986p0294*
+ ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam
+
+usb:v5986p0295*
+ ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam
+
+usb:v5986p0299*
+ ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam
+
+usb:v5986p029C*
+ ID_MODEL_FROM_DATABASE=Lenovo EasyCamera
+
+usb:v5986p02AC*
+ ID_MODEL_FROM_DATABASE=HP TrueVision HD Webcam
+
 usb:v5986p02D0*
  ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam [R5U877]
 
+usb:v5986p02D2*
+ ID_MODEL_FROM_DATABASE=ThinkPad Integrated Camera
+
+usb:v5986p02D5*
+ ID_MODEL_FROM_DATABASE=Integrated Camera
+
+usb:v5986p03B3*
+ ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam
+
 usb:v5986p03D0*
  ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam [R5U877]
 
+usb:v5986p0400*
+ ID_MODEL_FROM_DATABASE=BisonCam, NB Pro
+
+usb:v5986p0535*
+ ID_MODEL_FROM_DATABASE=Lenovo EasyCamera integrated webcam
+
+usb:v5986p055A*
+ ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam
+
+usb:v5986p0652*
+ ID_MODEL_FROM_DATABASE=Lenovo EasyCamera
+
+usb:v5986p0670*
+ ID_MODEL_FROM_DATABASE=Lenovo EasyCamera
+
+usb:v5986p0671*
+ ID_MODEL_FROM_DATABASE=Lenovo EasyCamera
+
+usb:v5986p0706*
+ ID_MODEL_FROM_DATABASE=ThinkPad P50 Integrated Camera
+
+usb:v5986p2113*
+ ID_MODEL_FROM_DATABASE=SunplusIT Integrated Camera
+
+usb:v5986pA002*
+ ID_MODEL_FROM_DATABASE=Lenovo EasyCamera Integrated Webcam
+
 usb:v59E3*
  ID_VENDOR_FROM_DATABASE=Nonolith Labs
 
@@ -59694,7 +68400,7 @@ usb:v5A57p0284*
  ID_MODEL_FROM_DATABASE=802.11a/b/g/n USB Wireless LAN Card
 
 usb:v5A57p0290*
- ID_MODEL_FROM_DATABASE=ZW-N290 802.11n [Realtek RTL8192SU]
+ ID_MODEL_FROM_DATABASE=ZW-N290 802.11n [Realtek RTL8192U]
 
 usb:v5A57p5257*
  ID_MODEL_FROM_DATABASE=Metronic 495257 wifi 802.11ng
@@ -59702,6 +68408,9 @@ usb:v5A57p5257*
 usb:v6000*
  ID_VENDOR_FROM_DATABASE=Beholder International Ltd.
 
+usb:v6000p0001*
+ ID_MODEL_FROM_DATABASE=Trident TVBOX Video Grabber
+
 usb:v6000pDEC0*
  ID_MODEL_FROM_DATABASE=TV Wander
 
@@ -59714,11 +68423,20 @@ usb:v601A*
 usb:v601Ap4740*
  ID_MODEL_FROM_DATABASE=XBurst Jz4740 boot mode
 
+usb:v601Ap4760*
+ ID_MODEL_FROM_DATABASE=JZ4760 Boot Device
+
+usb:v6022*
+ ID_VENDOR_FROM_DATABASE=Xektek
+
+usb:v6022p0500*
+ ID_MODEL_FROM_DATABASE=SuperPro Universal Device Programmer
+
 usb:v6189*
  ID_VENDOR_FROM_DATABASE=Sitecom
 
 usb:v6189p182D*
- ID_MODEL_FROM_DATABASE=USB 2.0 Ethernet
+ ID_MODEL_FROM_DATABASE=LN-029 10/100 Ethernet Adapter
 
 usb:v6189p2068*
  ID_MODEL_FROM_DATABASE=USB to serial cable (v2)
@@ -59810,6 +68528,48 @@ usb:v6244p0500*
 usb:v6244p0501*
  ID_MODEL_FROM_DATABASE=Touch Sensitive Intelligent Control Keypad STICK2B
 
+usb:v6244p0520*
+ ID_MODEL_FROM_DATABASE=Touch Sensitive Intelligent Control Keypad (STICK2C Firmware download, 32/64bits
+
+usb:v6244p0521*
+ ID_MODEL_FROM_DATABASE=Touch Sensitive Intelligent Control Keypad (STICK2C, 32/64bits)
+
+usb:v6244p0540*
+ ID_MODEL_FROM_DATABASE=Sunlite Universal Smart Handy Interface (SUSHI1A Firmware download, 32/64bits)
+
+usb:v6244p0541*
+ ID_MODEL_FROM_DATABASE=Sunlite Universal Smart Handy Interface (SUSHI1A, 32/64bits)
+
+usb:v6244p0570*
+ ID_MODEL_FROM_DATABASE=Touch Sensitive Intelligent Control Keypad (STICK4A Firmware download, 32/64bits)
+
+usb:v6244p0571*
+ ID_MODEL_FROM_DATABASE=Touch Sensitive Intelligent Control Keypad (STICK4A, 32/64bits)
+
+usb:v6244p0580*
+ ID_MODEL_FROM_DATABASE=Touch Sensitive Intelligent Control Keypad (STICK5A Firmware download, 32/64bits)
+
+usb:v6244p0581*
+ ID_MODEL_FROM_DATABASE=Touch Sensitive Intelligent Control Keypad (STICK5A, 32/64bits)
+
+usb:v6244p0590*
+ ID_MODEL_FROM_DATABASE=Intelligent Dmx Interface (SIUDI9S Firmware Download, 32/64bits)
+
+usb:v6244p0591*
+ ID_MODEL_FROM_DATABASE=Intelligent Dmx Interface (SIUDI9S, 32/64bits)
+
+usb:v6244p0600*
+ ID_MODEL_FROM_DATABASE=Intelligent Dmx Interface (SIUDI9M Firmware Download, 32/64bits)
+
+usb:v6244p0601*
+ ID_MODEL_FROM_DATABASE=Intelligent Dmx Interface (SIUDI9M, 32/64bits)
+
+usb:v6244p0610*
+ ID_MODEL_FROM_DATABASE=Intelligent Dmx Interface SIUDI10A Firmware Download
+
+usb:v6244p0611*
+ ID_MODEL_FROM_DATABASE=Intelligent Dmx Interface SIUDI10A
+
 usb:v6253*
  ID_VENDOR_FROM_DATABASE=TwinHan Technology Co., Ltd
 
@@ -59820,7 +68580,7 @@ usb:v636C*
  ID_VENDOR_FROM_DATABASE=CoreLogic, Inc.
 
 usb:v6472*
- ID_VENDOR_FROM_DATABASE=Unknown (Sony?)
+ ID_VENDOR_FROM_DATABASE=Sony Corp.
 
 usb:v6472p01C8*
  ID_MODEL_FROM_DATABASE=PlayStation Portable [Mass Storage]
@@ -59831,18 +68591,39 @@ usb:v6547*
 usb:v6547p0232*
  ID_MODEL_FROM_DATABASE=ARK3116 Serial
 
+usb:v6557*
+ ID_VENDOR_FROM_DATABASE=Emtec
+
+usb:v6557p5500*
+ ID_MODEL_FROM_DATABASE=Mass Storage Device
+
+usb:v6557p8005*
+ ID_MODEL_FROM_DATABASE=Car Key
+
 usb:v6615*
  ID_VENDOR_FROM_DATABASE=IRTOUCHSYSTEMS Co. Ltd.
 
 usb:v6615p0001*
  ID_MODEL_FROM_DATABASE=Touchscreen
 
+usb:v6615p0020*
+ ID_MODEL_FROM_DATABASE=IRTOUCH InfraRed TouchScreen
+
+usb:v6615p0081*
+ ID_MODEL_FROM_DATABASE=TouchScreen
+
 usb:v6666*
  ID_VENDOR_FROM_DATABASE=Prototype product Vendor ID
 
 usb:v6666p0667*
  ID_MODEL_FROM_DATABASE=WiseGroup Smart Joy PSX, PS-PC Smart JoyPad
 
+usb:v6666p1C40*
+ ID_MODEL_FROM_DATABASE=TELEMIC 802.15.4 Sensor node (Bootloader)
+
+usb:v6666p1C41*
+ ID_MODEL_FROM_DATABASE=TELEMIC 802.15.4 Sensor node
+
 usb:v6666p2667*
  ID_MODEL_FROM_DATABASE=JCOP BlueZ Smartcard reader
 
@@ -59861,6 +68642,12 @@ usb:v6677p8802*
 usb:v6677p8811*
  ID_MODEL_FROM_DATABASE=Deluxe Dance Mat
 
+usb:v675D*
+ ID_VENDOR_FROM_DATABASE=Humanscale
+
+usb:v675Dp062A*
+ ID_MODEL_FROM_DATABASE=Switch Mouse
+
 usb:v6891*
  ID_VENDOR_FROM_DATABASE=3Com
 
@@ -59894,6 +68681,12 @@ usb:v726C*
 usb:v726Cp2149*
  ID_MODEL_FROM_DATABASE=EntropyKing Random Number Generator
 
+usb:v7302*
+ ID_VENDOR_FROM_DATABASE=Solinftec
+
+usb:v7302p0001*
+ ID_MODEL_FROM_DATABASE=HUB 4X232
+
 usb:v734C*
  ID_VENDOR_FROM_DATABASE=TBS Technologies China
 
@@ -59913,20 +68706,104 @@ usb:v7392*
  ID_VENDOR_FROM_DATABASE=Edimax Technology Co., Ltd
 
 usb:v7392p7711*
- ID_MODEL_FROM_DATABASE=EW-7711UTn nLite Wireless Adapter [Ralink RT2870]
+ ID_MODEL_FROM_DATABASE=EW-7711UTn nLite Wireless Adapter [Ralink RT3070]
 
 usb:v7392p7717*
- ID_MODEL_FROM_DATABASE=EW-7717UN 802.11n Wireless Adapter [Ralink RT2870]
+ ID_MODEL_FROM_DATABASE=EW-7717UN 802.11n Wireless Adapter [Ralink RT2770]
 
 usb:v7392p7718*
  ID_MODEL_FROM_DATABASE=EW-7718UN 802.11n Wireless Adapter [Ralink RT2870]
 
 usb:v7392p7722*
- ID_MODEL_FROM_DATABASE=EW-7722UTn 802.11n Wireless Adapter [Ralink RT307x]
+ ID_MODEL_FROM_DATABASE=EW-7722UTn 802.11n Wireless Adapter [Ralink RT3072]
+
+usb:v7392p7733*
+ ID_MODEL_FROM_DATABASE=EW-7733UnD 802.11abgn 3x3:3 [Ralink RT3573]
 
 usb:v7392p7811*
  ID_MODEL_FROM_DATABASE=EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]
 
+usb:v7392p7822*
+ ID_MODEL_FROM_DATABASE=EW-7612UAn V2 802.11n Wireless Adapter [Realtek RTL8192CU]
+
+usb:v7392pA611*
+ ID_MODEL_FROM_DATABASE=EW-7611ULB 802.11b/g/n and Bluetooth 4.0 Adapter
+
+usb:v7392pA711*
+ ID_MODEL_FROM_DATABASE=EW-7711MAC 802.11ac Wireless Adapter
+
+usb:v7392pA811*
+ ID_MODEL_FROM_DATABASE=EW-7811UTC 802.11ac Wireless Adapter
+
+usb:v7392pB711*
+ ID_MODEL_FROM_DATABASE=EW-7722UAC 802.11a/b/g/n/ac (2x2) Wireless Adapter [MediaTek MT7612U]
+
+usb:v7392pB822*
+ ID_MODEL_FROM_DATABASE=EW-7822ULC 802.11ac Wireless Adapter [Realtek RTL8812AU]
+
+usb:v73D8*
+ ID_VENDOR_FROM_DATABASE=Progeny Dental Equipment Specialists
+
+usb:v73D8p0104*
+ ID_MODEL_FROM_DATABASE=VetPro DR, Size 1
+
+usb:v73D8p0105*
+ ID_MODEL_FROM_DATABASE=VetPro DR, Size 2
+
+usb:v7669*
+ ID_VENDOR_FROM_DATABASE=Venable Instruments
+
+usb:v7669p350C*
+ ID_MODEL_FROM_DATABASE=Model 350c, Frequency Response Analyzer
+
+usb:v7669p5140*
+ ID_MODEL_FROM_DATABASE=Model 5140, Frequency Response Analyzer
+
+usb:v7669p6305*
+ ID_MODEL_FROM_DATABASE=Model 6305, Frequency Response Analyzer
+
+usb:v7669p6320*
+ ID_MODEL_FROM_DATABASE=Model 6320, Frequency Response Analyzer
+
+usb:v7669p6340*
+ ID_MODEL_FROM_DATABASE=Model 6340, Frequency Response Analyzer
+
+usb:v7669p7405*
+ ID_MODEL_FROM_DATABASE=Model 7405, Frequency Response Analyzer
+
+usb:v7669p7420*
+ ID_MODEL_FROM_DATABASE=Model 7420, Frequency Response Analyzer
+
+usb:v7669p7440*
+ ID_MODEL_FROM_DATABASE=Model 7440, Frequency Response Analyzer
+
+usb:v7669p8805*
+ ID_MODEL_FROM_DATABASE=Model 8805, Frequency Response Analyzer
+
+usb:v7669p8820*
+ ID_MODEL_FROM_DATABASE=Model 8820, Frequency Response Analyzer
+
+usb:v7669p8840*
+ ID_MODEL_FROM_DATABASE=Model 8840, Frequency Response Analyzer
+
+usb:v7825*
+ ID_VENDOR_FROM_DATABASE=Other World Computing
+
+usb:v7825pA2A4*
+ ID_MODEL_FROM_DATABASE=External SATA Hard Drive Adapter cable PA023U3
+
+usb:v7825pB0B3*
+ ID_MODEL_FROM_DATABASE=miniStack MAX
+
+usb:v8070*
+ ID_VENDOR_FROM_DATABASE=ACCES I/O Products, Inc.
+
+usb:v8070p8003*
+ ID_MODEL_FROM_DATABASE=USB-DIO-96
+
+usb:v8070p8070*
+ ID_MODEL_FROM_DATABASE=USB-AO16-16A
+
 usb:v8086*
  ID_VENDOR_FROM_DATABASE=Intel Corp.
 
@@ -59966,11 +68843,14 @@ usb:v8086p0186*
 usb:v8086p0188*
  ID_MODEL_FROM_DATABASE=WiMAX Connection 2400m
 
+usb:v8086p0189*
+ ID_MODEL_FROM_DATABASE=Centrino Advanced-N 6230 Bluetooth adapter
+
 usb:v8086p0200*
  ID_MODEL_FROM_DATABASE=AnyPoint(TM) Wireless II Network 11Mbps Adapter [Atmel AT76C503A]
 
 usb:v8086p0431*
- ID_MODEL_FROM_DATABASE=Intel Pro Video PC Camera
+ ID_MODEL_FROM_DATABASE=Pro Video PC Camera
 
 usb:v8086p0510*
  ID_MODEL_FROM_DATABASE=Digital Movie Creator
@@ -59984,6 +68864,12 @@ usb:v8086p0780*
 usb:v8086p07D3*
  ID_MODEL_FROM_DATABASE=BLOB boot loader firmware
 
+usb:v8086p07DC*
+ ID_MODEL_FROM_DATABASE=Bluetooth 4.0* Smart Ready (low energy)
+
+usb:v8086p0B07*
+ ID_MODEL_FROM_DATABASE=RealSense D435
+
 usb:v8086p0DAD*
  ID_MODEL_FROM_DATABASE=Cherry MiniatureCard Keyboard
 
@@ -60002,6 +68888,9 @@ usb:v8086p1110*
 usb:v8086p1111*
  ID_MODEL_FROM_DATABASE=PRO/Wireless 2011B 802.11b Adapter [Intersil PRISM 2.5]
 
+usb:v8086p1122*
+ ID_MODEL_FROM_DATABASE=Integrated Hub
+
 usb:v8086p1134*
  ID_MODEL_FROM_DATABASE=Hollister Mobile Monitor
 
@@ -60038,8 +68927,17 @@ usb:v8086p3241*
 usb:v8086p8602*
  ID_MODEL_FROM_DATABASE=Miniature Card Slot
 
+usb:v8086p8C26*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series  EHCI #1
+
+usb:v8086p8C2D*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series EHCI #2
+
+usb:v8086p8C31*
+ ID_MODEL_FROM_DATABASE=eXtensible Host Controller
+
 usb:v8086p9303*
- ID_MODEL_FROM_DATABASE=Intel 8x930Hx Hub
+ ID_MODEL_FROM_DATABASE=8x930Hx Hub
 
 usb:v8086p9500*
  ID_MODEL_FROM_DATABASE=CE 9500 DVB-T
@@ -60053,6 +68951,9 @@ usb:v8086pBEEF*
 usb:v8086pC013*
  ID_MODEL_FROM_DATABASE=Wireless HID Station
 
+usb:v8086pDEAD*
+ ID_MODEL_FROM_DATABASE=Galileo
+
 usb:v8086pF001*
  ID_MODEL_FROM_DATABASE=XScale PXA27x Bulverde flash
 
@@ -60068,12 +68969,66 @@ usb:v8087p0020*
 usb:v8087p0024*
  ID_MODEL_FROM_DATABASE=Integrated Rate Matching Hub
 
+usb:v8087p0025*
+ ID_MODEL_FROM_DATABASE=Wireless-AC 9260 Bluetooth Adapter
+
+usb:v8087p0029*
+ ID_MODEL_FROM_DATABASE=AX200 Bluetooth
+
+usb:v8087p0716*
+ ID_MODEL_FROM_DATABASE=Modem Flashloader
+
+usb:v8087p07DA*
+ ID_MODEL_FROM_DATABASE=Centrino Bluetooth Wireless Transceiver
+
+usb:v8087p07DC*
+ ID_MODEL_FROM_DATABASE=Bluetooth wireless interface
+
+usb:v8087p07EB*
+ ID_MODEL_FROM_DATABASE=Oaktrail tablet
+
+usb:v8087p0A2A*
+ ID_MODEL_FROM_DATABASE=Bluetooth wireless interface
+
+usb:v8087p0A2B*
+ ID_MODEL_FROM_DATABASE=Bluetooth wireless interface
+
+usb:v8087p0A9E*
+ ID_MODEL_FROM_DATABASE=Edison
+
+usb:v8087p0AA7*
+ ID_MODEL_FROM_DATABASE=Wireless-AC 3168 Bluetooth
+
+usb:v8087p0AAA*
+ ID_MODEL_FROM_DATABASE=Bluetooth 9460/9560 Jefferson Peak (JfP)
+
+usb:v8087p0FFF*
+ ID_MODEL_FROM_DATABASE=Intel Android Bootloader Interface
+
+usb:v8087p8000*
+ ID_MODEL_FROM_DATABASE=Integrated Rate Matching Hub
+
+usb:v8087p8001*
+ ID_MODEL_FROM_DATABASE=Integrated Hub
+
+usb:v8087p8002*
+ ID_MODEL_FROM_DATABASE=8 channel internal hub
+
+usb:v8087p8008*
+ ID_MODEL_FROM_DATABASE=Integrated Rate Matching Hub
+
+usb:v8087p800A*
+ ID_MODEL_FROM_DATABASE=Hub
+
 usb:v80EE*
  ID_VENDOR_FROM_DATABASE=VirtualBox
 
 usb:v80EEp0021*
  ID_MODEL_FROM_DATABASE=USB Tablet
 
+usb:v80EEp0022*
+ ID_MODEL_FROM_DATABASE=multitouch tablet
+
 usb:v8282*
  ID_VENDOR_FROM_DATABASE=Keio
 
@@ -60083,6 +69038,12 @@ usb:v8282p3201*
 usb:v8282p3301*
  ID_MODEL_FROM_DATABASE=Retro Adapter Mouse
 
+usb:v8301*
+ ID_VENDOR_FROM_DATABASE=Hapurs
+
+usb:v8301p0089*
+ ID_MODEL_FROM_DATABASE=HPBT05R 2.4 G Mini Wireless Touchpad Keyboard
+
 usb:v8341*
  ID_VENDOR_FROM_DATABASE=EGO Systems, Inc.
 
@@ -60096,7 +69057,16 @@ usb:v8564p1000*
  ID_MODEL_FROM_DATABASE=JetFlash
 
 usb:v8564p4000*
- ID_MODEL_FROM_DATABASE=RDF8
+ ID_MODEL_FROM_DATABASE=microSD/SD/CF UHS-II Card Reader [RDF8, RDF9]
+
+usb:v8564p6000*
+ ID_MODEL_FROM_DATABASE=digital photo frame PF830
+
+usb:v8564p6002*
+ ID_MODEL_FROM_DATABASE=digital photo frame PF830
+
+usb:v8564p7000*
+ ID_MODEL_FROM_DATABASE=StoreJet 25H3
 
 usb:v8644*
  ID_VENDOR_FROM_DATABASE=Intenso GmbG
@@ -60113,6 +69083,12 @@ usb:v8E06*
 usb:v8E06pF700*
  ID_MODEL_FROM_DATABASE=DT225 Trackball
 
+usb:v8EA3*
+ ID_VENDOR_FROM_DATABASE=Doosl
+
+usb:v8EA3pA02C*
+ ID_MODEL_FROM_DATABASE=Wireless Presenter Receiver
+
 usb:v9016*
  ID_VENDOR_FROM_DATABASE=Sitecom
 
@@ -60137,6 +69113,9 @@ usb:v9148*
 usb:v9148p0004*
  ID_MODEL_FROM_DATABASE=R3 Compatible Device
 
+usb:v9516*
+ ID_VENDOR_FROM_DATABASE=Studiologic
+
 usb:v9710*
  ID_VENDOR_FROM_DATABASE=MosChip Semiconductor
 
@@ -60161,6 +69140,15 @@ usb:v9710p7730*
 usb:v9710p7780*
  ID_MODEL_FROM_DATABASE=MCS7780 4Mbps Fast IrDA Adapter
 
+usb:v9710p7784*
+ ID_MODEL_FROM_DATABASE=MCS7784 115.2Kb IrDA Adapter
+
+usb:v9710p7810*
+ ID_MODEL_FROM_DATABASE=MCS7810 Serial Port Adapter
+
+usb:v9710p7820*
+ ID_MODEL_FROM_DATABASE=MCS7820 Dual Serial Port Adapter
+
 usb:v9710p7830*
  ID_MODEL_FROM_DATABASE=MCS7830 10/100 Mbps Ethernet adapter
 
@@ -60170,12 +69158,21 @@ usb:v9710p7832*
 usb:v9710p7840*
  ID_MODEL_FROM_DATABASE=MCS7820/MCS7840 2/4 port serial adapter
 
+usb:v9710p9990*
+ ID_MODEL_FROM_DATABASE=MCS9990 PCIe Host Controller
+
 usb:v9849*
  ID_VENDOR_FROM_DATABASE=Bestmedia CD Recordable GmbH & Co. KG
 
 usb:v9849p0701*
  ID_MODEL_FROM_DATABASE=Platinum MyDrive HP
 
+usb:v9886*
+ ID_VENDOR_FROM_DATABASE=Astro Gaming
+
+usb:v9886p0015*
+ ID_MODEL_FROM_DATABASE=A50
+
 usb:v9999*
  ID_VENDOR_FROM_DATABASE=Odeon
 
@@ -60200,6 +69197,21 @@ usb:v9E88*
 usb:v9E88p9E8F*
  ID_MODEL_FROM_DATABASE=Plug Computer Basic [SheevaPlug]
 
+usb:vA014*
+ ID_VENDOR_FROM_DATABASE=Insignia (Best Buy)
+
+usb:vA014pB014*
+ ID_MODEL_FROM_DATABASE=Desktop Microphone NS-PAUM50
+
+usb:vA108*
+ ID_VENDOR_FROM_DATABASE=Ingenic Semiconductor Co.,Ltd
+
+usb:vA108p1000*
+ ID_MODEL_FROM_DATABASE=X1000
+
+usb:vA108p4775*
+ ID_MODEL_FROM_DATABASE=JZ4775 Boot Device
+
 usb:vA128*
  ID_VENDOR_FROM_DATABASE=AnMo Electronics Corp. / Dino-Lite (?)
 
@@ -60254,12 +69266,51 @@ usb:vA168p0617*
 usb:vA168p0618*
  ID_MODEL_FROM_DATABASE=Dino-Lite Digital Microscope
 
+usb:vA466*
+ ID_VENDOR_FROM_DATABASE=Haikou Xingong Electronics Co.,Ltd
+
+usb:vA466p0A53*
+ ID_MODEL_FROM_DATABASE=TL866II Plus Device Programmer [MiniPRO]
+
 usb:vA600*
- ID_VENDOR_FROM_DATABASE=Asix
+ ID_VENDOR_FROM_DATABASE=ASIX s.r.o.
+
+usb:vA600p5500*
+ ID_MODEL_FROM_DATABASE=zuban H2OPS - GPS for canoeing
+
+usb:vA600pA000*
+ ID_MODEL_FROM_DATABASE=SIGMA Logic Analyzer
+
+usb:vA600pA002*
+ ID_MODEL_FROM_DATABASE=EMUSB interface pro MU Beta
+
+usb:vA600pC000*
+ ID_MODEL_FROM_DATABASE=MREL Data Trap II
+
+usb:vA600pC001*
+ ID_MODEL_FROM_DATABASE=VUTS DMU4
+
+usb:vA600pC002*
+ ID_MODEL_FROM_DATABASE=Electrone MASH
+
+usb:vA600pC005*
+ ID_MODEL_FROM_DATABASE=MREL HTU HandiTrap cable
+
+usb:vA600pC006*
+ ID_MODEL_FROM_DATABASE=JRC COmeter
 
 usb:vA600pE110*
  ID_MODEL_FROM_DATABASE=OK1ZIA Davac 4.x
 
+usb:vA600pE112*
+ ID_MODEL_FROM_DATABASE=OK1ZIA Antenna rotator
+
+usb:vA600pE113*
+ ID_MODEL_FROM_DATABASE=OK1ZIA GPIO
+
+usb:vA600pE114*
+ ID_MODEL_FROM_DATABASE=OK1ZIA HD&Keyb
+
 usb:vA727*
  ID_VENDOR_FROM_DATABASE=3Com
 
@@ -60272,14 +69323,35 @@ usb:vA727p6895*
 usb:vA727p6897*
  ID_MODEL_FROM_DATABASE=AR5523
 
+usb:vA88A*
+ ID_VENDOR_FROM_DATABASE=Clas Ohlsson
+
+usb:vA88Ap3003*
+ ID_MODEL_FROM_DATABASE=PCFree Multimedia Remote Control PC
+
 usb:vAAAA*
  ID_VENDOR_FROM_DATABASE=MXT
 
 usb:vAAAAp8815*
  ID_MODEL_FROM_DATABASE=microSD CardReader
 
+usb:vAAAAp8816*
+ ID_MODEL_FROM_DATABASE=microSD CardReader
+
+usb:vAB12*
+ ID_VENDOR_FROM_DATABASE=aplic
+
+usb:vAB12p34CD*
+ ID_MODEL_FROM_DATABASE=JMICRON JMS578 SATA 6Gb/s bridge
+
 usb:vABCD*
- ID_VENDOR_FROM_DATABASE=Unknown
+ ID_VENDOR_FROM_DATABASE=LogiLink
+
+usb:vABCDp1234*
+ ID_MODEL_FROM_DATABASE=UDisk flash drive
+
+usb:vABCDp6104*
+ ID_MODEL_FROM_DATABASE=PCCloneEX Lite+ SATA docking station [QP0017]
 
 usb:vABCDpCDEE*
  ID_MODEL_FROM_DATABASE=Petcam
@@ -60290,6 +69362,12 @@ usb:vB58E*
 usb:vB58Ep9E84*
  ID_MODEL_FROM_DATABASE=Yeti Stereo Microphone
 
+usb:vBA77*
+ ID_VENDOR_FROM_DATABASE=Clockmaker
+
+usb:vBA77p7147*
+ ID_MODEL_FROM_DATABASE=Agterbosch
+
 usb:vC216*
  ID_VENDOR_FROM_DATABASE=Card Device Expert Co., LTD
 
@@ -60299,9 +69377,21 @@ usb:vC216p0180*
 usb:vC251*
  ID_VENDOR_FROM_DATABASE=Keil Software, Inc.
 
+usb:vC251p1705*
+ ID_MODEL_FROM_DATABASE=MCB2300
+
 usb:vC251p2710*
  ID_MODEL_FROM_DATABASE=ULink
 
+usb:vC251p2723*
+ ID_MODEL_FROM_DATABASE=ULink-ME
+
+usb:vC502*
+ ID_VENDOR_FROM_DATABASE=AGPTek
+
+usb:vC502p0029*
+ ID_MODEL_FROM_DATABASE=Rocker
+
 usb:vCACE*
  ID_VENDOR_FROM_DATABASE=CACE Technologies Inc.
 
@@ -60309,7 +69399,7 @@ usb:vCACEp0002*
  ID_MODEL_FROM_DATABASE=AirPCAP Classic 802.11 packet capture adapter
 
 usb:vCACEp0300*
- ID_MODEL_FROM_DATABASE=AirPcap NX [Atheros AR9001U-(2)NG]
+ ID_MODEL_FROM_DATABASE=AirPcap NX [Atheros AR9170+AR9104]
 
 usb:vCD12*
  ID_VENDOR_FROM_DATABASE=SMART TECHNOLOGY INDUSTRIAL LTD.
@@ -60329,12 +69419,24 @@ usb:vD209p0301*
 usb:vD209p0501*
  ID_MODEL_FROM_DATABASE=Ultra-Stik Ultimarc Ultra-Stik Player 1
 
+usb:vD209p1571*
+ ID_MODEL_FROM_DATABASE=A-PAC Arcade Control Interface
+
 usb:vD904*
  ID_VENDOR_FROM_DATABASE=LogiLink
 
 usb:vD904p0003*
  ID_MODEL_FROM_DATABASE=Laser Mouse (ID0009A)
 
+usb:vE2B7*
+ ID_VENDOR_FROM_DATABASE=Jie Li
+
+usb:vE2B7p0811*
+ ID_MODEL_FROM_DATABASE=CD002
+
+usb:vE2B7p0812*
+ ID_MODEL_FROM_DATABASE=CD005 MP3 Player
+
 usb:vE4E4*
  ID_VENDOR_FROM_DATABASE=Xorcom Ltd.
 
@@ -60405,10 +69507,25 @@ usb:vEB1Ap2776*
  ID_MODEL_FROM_DATABASE=Combined audio and video input device
 
 usb:vEB1Ap2800*
- ID_MODEL_FROM_DATABASE=Terratec Cinergy 200
+ ID_MODEL_FROM_DATABASE=EM2800 Video Capture
 
 usb:vEB1Ap2801*
- ID_MODEL_FROM_DATABASE=GrabBeeX+ Video Encoder
+ ID_MODEL_FROM_DATABASE=EM2801 Video Capture
+
+usb:vEB1Ap2820*
+ ID_MODEL_FROM_DATABASE=EM2820 Video Capture
+
+usb:vEB1Ap2821*
+ ID_MODEL_FROM_DATABASE=EM2820 Video Capture
+
+usb:vEB1Ap2840*
+ ID_MODEL_FROM_DATABASE=EM2840 Video Capture
+
+usb:vEB1Ap2841*
+ ID_MODEL_FROM_DATABASE=EM2840 Video Capture
+
+usb:vEB1Ap2861*
+ ID_MODEL_FROM_DATABASE=EasyCAP DC60+ [EM2861]
 
 usb:vEB1Ap2863*
  ID_MODEL_FROM_DATABASE=Video Grabber
@@ -60425,6 +69542,18 @@ usb:vEB1Ap50A3*
 usb:vEB1Ap50A6*
  ID_MODEL_FROM_DATABASE=Gadmei UTV330 TV Box
 
+usb:vEB1Ap5166*
+ ID_MODEL_FROM_DATABASE=video grabber 28282
+
+usb:vEB1Ap5184*
+ ID_MODEL_FROM_DATABASE=VIDBOX NW06 [EM28281]
+
+usb:vEB1Ap8179*
+ ID_MODEL_FROM_DATABASE=Terratec Cinergy T2 Stick HD
+
+usb:vEB1ApE305*
+ ID_MODEL_FROM_DATABASE=KWorld PlusTV Analog Stick
+
 usb:vEB1ApE355*
  ID_MODEL_FROM_DATABASE=KWorld DVB-T 355U Digital TV Dongle
 
@@ -60440,12 +69569,36 @@ usb:vF003*
 usb:vF003p6002*
  ID_MODEL_FROM_DATABASE=PhotoSmart C500
 
+usb:vF007*
+ ID_VENDOR_FROM_DATABASE=Teslong
+
+usb:vF007pA999*
+ ID_MODEL_FROM_DATABASE=Endoscope Camera
+
+usb:vF007pB999*
+ ID_MODEL_FROM_DATABASE=Otoscope Camera
+
 usb:vF182*
  ID_VENDOR_FROM_DATABASE=Leap Motion
 
 usb:vF182p0003*
  ID_MODEL_FROM_DATABASE=Controller
 
+usb:vF3F0*
+ ID_VENDOR_FROM_DATABASE=CCT, Inc
+
+usb:vF3F0p0740*
+ ID_MODEL_FROM_DATABASE=multi-function device
+
+usb:vF3F0p1340*
+ ID_MODEL_FROM_DATABASE=multi-function printer
+
+usb:vF3F0p1440*
+ ID_MODEL_FROM_DATABASE=printer device
+
+usb:vF3F0p1921*
+ ID_MODEL_FROM_DATABASE=printer
+
 usb:vF4EC*
  ID_VENDOR_FROM_DATABASE=Atten Electronics / Siglent Technologies
 
@@ -60467,12 +69620,21 @@ usb:vF766*
 usb:vF766p0001*
  ID_MODEL_FROM_DATABASE=PC-Gamepad "Greystorm"
 
+usb:vFA11*
+ ID_VENDOR_FROM_DATABASE=DyingLight
+
+usb:vFA11p5AFE*
+ ID_MODEL_FROM_DATABASE=DyingLight
+
 usb:vFC08*
  ID_VENDOR_FROM_DATABASE=Conrad Electronic SE
 
 usb:vFC08p0101*
  ID_MODEL_FROM_DATABASE=MIDI Cable UA0037
 
+usb:vFF00*
+ ID_VENDOR_FROM_DATABASE=Power Delivery
+
 usb:vFFEE*
  ID_VENDOR_FROM_DATABASE=FNK Tech
 
index 2ee205a92f7465ef5cba86fee56db46ea6745848..6d760b2be0720c5f8fd839461661c9c434036a88 100644 (file)
@@ -434,6 +434,13 @@ evdev:name:Synaptics TM3289-002:dmi:*svnLENOVO*:pvrThinkPadX1Carbon5th*
  EVDEV_ABS_35=::19
  EVDEV_ABS_36=::19
 
+# Lenovo Thinkpad X1 Tablet Gen3
+evdev:input:b0003v17EFp60B5*
+ EVDEV_ABS_00=::12
+ EVDEV_ABS_01=::11
+ EVDEV_ABS_35=::12
+ EVDEV_ABS_36=::11
+
 # Lenovo T460
 evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pn*ThinkPad*T460*
  EVDEV_ABS_00=1266:5677:44
index 5886ef2a6370f40f7bc8e82411f8d06a1bca174e..3284cced1a93880a163da99e9568eca0d18175c4 100644 (file)
@@ -526,10 +526,15 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHP*Pavilion*dv7*Notebook*PC:
  KEYBOARD_KEY_c6=break
  KEYBOARD_KEY_94=reserved
 
-# Pavilion and Spectre x360 13 (Prevents random airplane mode activation)
+# Pavilion 13 x360 (Tablet mode and SYSRQ key)
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pn*[pP][aA][vV][iI][lL][iI][oO][nN]*13*x360*:pvr*
+ KEYBOARD_KEY_d7=!f22                                   # touchpad off
+ KEYBOARD_KEY_d9=unknown
+ KEYBOARD_KEY_d2=sysrq                                  # Fn+Print = SYSRQ
+
+# Spectre x360 13 (Prevents random airplane mode activation)
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pn*[sS][pP][eE][cC][tT][rR][eE]*x360*13*:pvr*
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHP*:pn*[sS][pP][eE][cC][tT][rR][eE]*x360Convertible*:pvr*
-evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pn*[pP][aA][vV][iI][lL][iI][oO][nN]*13*x360*:pvr*
  KEYBOARD_KEY_d7=unknown
 
 # Spectre x360 13
index b14b05fde622b48ea01106461ddbb9f4fa29a46e..576b314d3cd82e761a11879492723ecc98c0a35e 100644 (file)
@@ -316,6 +316,10 @@ sensor:modalias:platform:cros-ec-accel:dmi:*:svnGoogle:pnCaroline*
 sensor:modalias:platform:cros-ec-accel:dmi:*svnGoogle:pnVayne*
  ACCEL_MOUNT_MATRIX=-1, 0, 0; 0, -1, 0; 0, 0, -1
 
+# nocturne board (Google Pixel Slate)
+sensor:modalias:platform:cros-ec-accel:dmi:*Google_Nocturne*
+ ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1
+
 #########################################
 # GP-electronic
 #########################################
@@ -689,6 +693,9 @@ sensor:modalias:acpi:KIOX020A*:dmi:*:svnTREKSTOR:pnPRIMEBOOKC11B:*
 #########################################
 # Umax
 #########################################
+sensor:modalias:acpi:KIOX000A*:dmi:*:svnUMAX:pnVisionBook10WiPro:*
+ ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1
+
 sensor:modalias:acpi:SMO8500*:dmi:*:svnUMAX:pnVisionBook10WiPlus:*
  ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
 
index ef5a473e87ae5ea990db48d9955fa81c1f7d3acf..d0a2a22709a063ad0142f4b3d9204b078a14f256 100644 (file)
@@ -349,6 +349,8 @@ mouse:usb:v046dpc068:name:Logitech G500:
 mouse:usb:v046dpc332:name:Logitech Gaming Mouse G502:
 # Logitech G502 HERO SE
 mouse:usb:v046dpc08b:name:Logitech G502 HERO SE:
+# Logitech G502 Hero
+mouse:usb:v046dpc08b:name:Logitech G502 HERO Gaming Mouse:
  MOUSE_DPI=1200@1000 *2400@1000 3200@1000 6400@1000
 
 # Logitech G700 Laser Mouse (Wired)
@@ -379,6 +381,10 @@ mouse:usb:v046dp101b:name:Logitech M705:
 mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:101b:
  MOUSE_DPI=1000@125
 
+# Logitech M705 (newer version?)
+mouse:usb:v046dp406d:name:Logitech M705:
+ MOUSE_DPI=1000@167
+
 # Logitech M305 Wireless Optical Mouse
 mouse:usb:v046dpc52f:name:Logitech USB Receiver:
  MOUSE_DPI=1000@170
index e8169498ef843fcf433d8a252a49477885e594dc..4e30f6c49b4cb5a9edfe008f7f6f915755c495d3 100644 (file)
@@ -38,12 +38,6 @@ BC2392     (base 16)         BYD Precision Manufacture Company Ltd.
                                shenzhen    518116\r
                                CN\r
 \r
-94-E6-F7   (hex)               Intel Corporate\r
-94E6F7     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 40-55-82   (hex)               Nokia\r
 405582     (base 16)           Nokia\r
                                600 March Road\r
@@ -92,12 +86,6 @@ C419D1     (base 16)         Telink Semiconductor (Shanghai) Co., Ltd.
                                Shanghai    201203\r
                                CN\r
 \r
-4C-1D-96   (hex)               Intel Corporate\r
-4C1D96     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 88-7E-25   (hex)               Extreme Networks, Inc.\r
 887E25     (base 16)           Extreme Networks, Inc.\r
                                6480 Via Del Oro\r
@@ -521,12 +509,6 @@ D03745     (base 16)               TP-LINK TECHNOLOGIES CO.,LTD.
                                Lenoir City  TN  37771\r
                                US\r
 \r
-50-E0-85   (hex)               Intel Corporate\r
-50E085     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 24-16-6D   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
 24166D     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
                                No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
@@ -767,12 +749,6 @@ D44DA4     (base 16)               Murata Manufacturing Co., Ltd.
                                Nagaokakyo-shi  Kyoto  617-8555\r
                                JP\r
 \r
-DC-71-96   (hex)               Intel Corporate\r
-DC7196     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 F8-E5-CF   (hex)               CGI IT UK LIMITED\r
 F8E5CF     (base 16)           CGI IT UK LIMITED\r
                                20 Fenchurch Street, 14th Floor\r
@@ -821,12 +797,6 @@ A091A2     (base 16)               OnePlus Electronics (Shenzhen) Co., Ltd.
                                SAN JOSE  CA  95131\r
                                US\r
 \r
-B8-08-CF   (hex)               Intel Corporate\r
-B808CF     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 1C-69-7A   (hex)               EliteGroup Computer Systems Co., LTD\r
 1C697A     (base 16)           EliteGroup Computer Systems Co., LTD\r
                                No.239, Sec. 2, TiDing Blvd. Nei-Hu Dist.\r
@@ -1106,12 +1076,6 @@ B0518E     (base 16)             Holl technology CO.Ltd.
                                Shenzhen  Guangdong  518052\r
                                CN\r
 \r
-68-17-29   (hex)               Intel Corporate\r
-681729     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 28-52-E0   (hex)               Layon international Electronic & Telecom Co.,Ltd\r
 2852E0     (base 16)           Layon international Electronic & Telecom Co.,Ltd\r
                                4rd Floor, Building 15, Juda Industrial Zone, ShiBei Industrial Road, HuiJiang , Da Shi Street, PanYu District,Guangzhou,China\r
@@ -1379,12 +1343,6 @@ D88DC8     (base 16)             Atil Technology Co., LTD
                                Da’an Dist., Taipei City    106\r
                                TW\r
 \r
-D0-AB-D5   (hex)               Intel Corporate\r
-D0ABD5     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 88-DE-7C   (hex)               Askey Computer Corp.\r
 88DE7C     (base 16)           Askey Computer Corp.\r
                                10F, No.119, JIANKANG RD.,ZHINGHE DIST,\r
@@ -1574,12 +1532,6 @@ B4ED19     (base 16)             Pie Digital, Inc.
                                Seongnam  Gyeonggi  13529\r
                                KR\r
 \r
-D4-3B-04   (hex)               Intel Corporate\r
-D43B04     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 CC-E1-94   (hex)               Juniper Networks\r
 CCE194     (base 16)           Juniper Networks\r
                                1133 Innovation Way\r
@@ -1802,18 +1754,6 @@ F00EBF     (base 16)             ZettaHash Inc.
                                San Jose  CA  94568\r
                                US\r
 \r
-04-EA-56   (hex)               Intel Corporate\r
-04EA56     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
-D0-C6-37   (hex)               Intel Corporate\r
-D0C637     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 44-1A-FA   (hex)               New H3C Technologies Co., Ltd\r
 441AFA     (base 16)           New H3C Technologies Co., Ltd\r
                                466 Changhe Road, Binjiang District\r
@@ -2318,12 +2258,6 @@ E063DA     (base 16)             Ubiquiti Networks Inc.
                                Matsumoto-shi  Nagano-ken  399-8702\r
                                JP\r
 \r
-98-3B-8F   (hex)               Intel Corporate\r
-983B8F     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 54-27-8D   (hex)               NXP (China) Management Ltd.\r
 54278D     (base 16)           NXP (China) Management Ltd.\r
                                21F, BM InterContinental Business Center, 100 Yu Tong Road\r
@@ -2636,12 +2570,6 @@ FC039F     (base 16)             Samsung Electronics Co.,Ltd
                                Fort Washington  PA  19034\r
                                US\r
 \r
-1C-1B-B5   (hex)               Intel Corporate\r
-1C1BB5     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 A4-D9-90   (hex)               Samsung Electronics Co.,Ltd\r
 A4D990     (base 16)           Samsung Electronics Co.,Ltd\r
                                #94-1, Imsoo-Dong\r
@@ -2768,12 +2696,6 @@ E0AF4F     (base 16)             Deutsche Telekom AG
                                Bonn    53113\r
                                DE\r
 \r
-DC-8B-28   (hex)               Intel Corporate\r
-DC8B28     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 B8-69-F4   (hex)               Routerboard.com\r
 B869F4     (base 16)           Routerboard.com\r
                                Mikrotikls SIA\r
@@ -3026,12 +2948,6 @@ D47C44     (base 16)             IEEE Registration Authority
                                Dongguan  Guangdong  523560\r
                                CN\r
 \r
-30-24-32   (hex)               Intel Corporate\r
-302432     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 C0-42-D0   (hex)               Juniper Networks\r
 C042D0     (base 16)           Juniper Networks\r
                                1133 Innovation Way\r
@@ -3140,12 +3056,6 @@ B44326     (base 16)             HUAWEI TECHNOLOGIES CO.,LTD
                                Dongguan    523808\r
                                CN\r
 \r
-04-AB-18   (hex)               ELECOM CO.,LTD.\r
-04AB18     (base 16)           ELECOM CO.,LTD.\r
-                               11F Tokyubancho Bldg. 6-2,\r
-                               Chiyoda-ku  Tokyo  102-0081\r
-                               JP\r
-\r
 78-D2-94   (hex)               NETGEAR\r
 78D294     (base 16)           NETGEAR\r
                                350 East Plumeria Drive\r
@@ -3860,12 +3770,6 @@ F4DCA5     (base 16)             DAWON DNS
                                Gwangju    61011\r
                                KR\r
 \r
-0C-54-15   (hex)               Intel Corporate\r
-0C5415     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 80-CE-62   (hex)               Hewlett Packard\r
 80CE62     (base 16)           Hewlett Packard\r
                                11445 Compaq Center Drive\r
@@ -4016,12 +3920,6 @@ CC6EA4     (base 16)             Samsung Electronics Co.,Ltd
                                Suwon  Gyeonggi-Do  16677\r
                                KR\r
 \r
-5C-5F-67   (hex)               Intel Corporate\r
-5C5F67     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 80-3A-59   (hex)               AT&T\r
 803A59     (base 16)           AT&T\r
                                1025 Lenox Park Blvd\r
@@ -5060,12 +4958,6 @@ D4D2E5     (base 16)             BKAV Corporation
                                Yokohama City  Kanagawa Prefecture  224-8539\r
                                JP\r
 \r
-E4-70-B8   (hex)               Intel Corporate\r
-E470B8     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 74-1C-27   (hex)               ITEL MOBILE LIMITED\r
 741C27     (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
@@ -5204,12 +5096,6 @@ E0AA96     (base 16)             Samsung Electronics Co.,Ltd
                                Gumi  Gyeongbuk  730-350\r
                                KR\r
 \r
-F8-34-41   (hex)               Intel Corporate\r
-F83441     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 28-D4-36   (hex)               Jiangsu dewosi electric co., LTD\r
 28D436     (base 16)           Jiangsu dewosi electric co., LTD\r
                                Dantu district fengjingchengbang  xibanya 503, building 6\r
@@ -5594,12 +5480,6 @@ D0F88C     (base 16)             Motorola (Wuhan) Mobility Technologies Communication Co.,
                                Bayan Lepas  Penang  11900\r
                                MY\r
 \r
-34-87-3D   (hex)               Quectel Wireless Solution Co.,Ltd.\r
-34873D     (base 16)           Quectel Wireless Solution Co.,Ltd.\r
-                               RM501,Building 13,No.99 TianZhou Road,Xuhui District,Shanghai,China\r
-                               Shanghai  Shanghai  200233\r
-                               CN\r
-\r
 10-D0-7A   (hex)               AMPAK Technology, Inc.\r
 10D07A     (base 16)           AMPAK Technology, Inc.\r
                                No.1,Jen Ai Road Hsinchu Industrial Park, Hukou\r
@@ -7925,18 +7805,6 @@ F485C6     (base 16)             FDT Technologies
                                Houston  TX  77024\r
                                US\r
 \r
-60-EB-69   (hex)               QUANTA COMPUTER INC.\r
-60EB69     (base 16)           QUANTA COMPUTER INC.\r
-                               211, Wen Hwa 2nd Rd.,Kuei Shan, \r
-                               Tao Yuan    33377\r
-                               TW\r
-\r
-C8-0A-A9   (hex)               QUANTA COMPUTER INC.\r
-C80AA9     (base 16)           QUANTA COMPUTER INC.\r
-                               211, Wen Hwa 2nd Rd.,\r
-                               Tao Yuan  Kuei Shan  33377\r
-                               TW\r
-\r
 D4-04-FF   (hex)               Juniper Networks\r
 D404FF     (base 16)           Juniper Networks\r
                                1133 Innovation Way\r
@@ -7949,30 +7817,6 @@ C8755B     (base 16)             Quantify Technology Pty. Ltd.
                                Bentley  Western Australia  6102\r
                                AU\r
 \r
-00-1B-24   (hex)               QUANTA COMPUTER INC.\r
-001B24     (base 16)           QUANTA COMPUTER INC.\r
-                               No. 211, Wen Hwa 2nd Rd.,\r
-                               Kuei Shan Hsiang  Tao Yuan Shien  333\r
-                               TW\r
-\r
-00-C0-9F   (hex)               QUANTA COMPUTER INC.\r
-00C09F     (base 16)           QUANTA COMPUTER INC.\r
-                               7F., 116, HOU-KANG ST.,\r
-                               TAIWAN  TAIWAN  R.O.C.\r
-                               TW\r
-\r
-C4-54-44   (hex)               QUANTA COMPUTER INC.\r
-C45444     (base 16)           QUANTA COMPUTER INC.\r
-                               No.211, Wen Hwa 2nd Rd., Kuei Shan Hsiang, Tao Yuan Shien, Taiwan, R. O. C.\r
-                               Taoyuan  Taiwan  33377\r
-                               TW\r
-\r
-00-26-9E   (hex)               QUANTA COMPUTER INC.\r
-00269E     (base 16)           QUANTA COMPUTER INC.\r
-                               NO. 211, WEN HWA 2RD., KUEI SHAN HSIANG, TAIPEI, SHIEN\r
-                               TAO YUAN    333\r
-                               TW\r
-\r
 88-12-4E   (hex)               Qualcomm Inc.\r
 88124E     (base 16)           Qualcomm Inc.\r
                                1700 Technology Drive\r
@@ -12680,12 +12524,6 @@ D05C7A     (base 16)           Sartura d.o.o.
                                  Zagreb  10000\r
                                HR\r
 \r
-BC-5C-4C   (hex)               ELECOM CO.,LTD.\r
-BC5C4C     (base 16)           ELECOM CO.,LTD.\r
-                               11F Tokyubancho Bldg. 6-2,\r
-                               Chiyoda-ku  Tokyo  102-0081\r
-                               JP\r
-\r
 88-70-33   (hex)               Hangzhou Silan Microelectronic Inc\r
 887033     (base 16)           Hangzhou Silan Microelectronic Inc\r
                                No.4 HuangGuShan Road\r
@@ -14615,12 +14453,6 @@ A4FCCE     (base 16)           Security Expert Ltd.
                                Perm  Perm region  614000\r
                                RU\r
 \r
-1C-08-C1   (hex)               Lg Innotek\r
-1C08C1     (base 16)           Lg Innotek\r
-                               978-1 Jangduk dong, Gwangsangu\r
-                               Gwangju  Gwangju  506-731\r
-                               KR\r
-\r
 34-A6-8C   (hex)               Shine Profit Development Limited\r
 34A68C     (base 16)           Shine Profit Development Limited\r
                                Unit 1401B Telecom Tower\r
@@ -15239,12 +15071,6 @@ B0ACFA     (base 16)           FUJITSU LIMITED
                                shenzhen  guangdong  518057\r
                                CN\r
 \r
-58-65-E6   (hex)               INFOMARK CO., LTD.\r
-5865E6     (base 16)           INFOMARK CO., LTD.\r
-                               #801, KINS TOWER, JEONGJA-DONG\r
-                               SEONGNAM  GYOUNGGI  463-847\r
-                               KR\r
-\r
 A4-4E-2D   (hex)               Adaptive Wireless Solutions, LLC\r
 A44E2D     (base 16)           Adaptive Wireless Solutions, LLC\r
                                577 Main Street\r
@@ -17570,12 +17396,6 @@ B4749F     (base 16)           ASKEY COMPUTER CORP
                                Richardson  TX  75081\r
                                US\r
 \r
-08-4E-BF   (hex)               Broad Net Mux Corporation\r
-084EBF     (base 16)           Broad Net Mux Corporation\r
-                               4-1-8 Kounan Minato-ku\r
-                               Tokyo    108-0075\r
-                               JP\r
-\r
 E0-5F-B9   (hex)               Cisco Systems, Inc\r
 E05FB9     (base 16)           Cisco Systems, Inc\r
                                80 West Tasman Drive\r
@@ -17990,12 +17810,6 @@ CCFCB1     (base 16)           Wireless Technology, Inc.
                                Beijing    100085\r
                                CN\r
 \r
-9C-F6-1A   (hex)               UTC Fire and Security\r
-9CF61A     (base 16)           UTC Fire and Security\r
-                               2955 Red Hill Ave.\r
-                               Costa Mesa  CA  92626\r
-                               US\r
-\r
 7C-F0-98   (hex)               Bee Beans Technologies, Inc.\r
 7CF098     (base 16)           Bee Beans Technologies, Inc.\r
                                TCI B5\r
@@ -20438,12 +20252,6 @@ D4C766     (base 16)           Acentic GmbH
                                SEOUL    KSXX 0022\r
                                KR\r
 \r
-00-1F-40   (hex)               Speakercraft Inc.\r
-001F40     (base 16)           Speakercraft Inc.\r
-                               940 Columbia Ave.,\r
-                               Riverside  CA  92507\r
-                               US\r
-\r
 00-1F-6C   (hex)               Cisco Systems, Inc\r
 001F6C     (base 16)           Cisco Systems, Inc\r
                                80 West Tasman Drive\r
@@ -20558,12 +20366,6 @@ D4C766     (base 16)           Acentic GmbH
                                KWAI CHUNG  N.T.  \r
                                HK\r
 \r
-00-1E-E0   (hex)               Urmet Domus SpA\r
-001EE0     (base 16)           Urmet Domus SpA\r
-                               Via Bologna 188/C\r
-                               Torino  TO  I-10154\r
-                               IT\r
-\r
 00-1E-DA   (hex)               Wesemann Elektrotechniek B.V.\r
 001EDA     (base 16)           Wesemann Elektrotechniek B.V.\r
                                Droogbloem 31\r
@@ -21896,12 +21698,6 @@ D4C766     (base 16)           Acentic GmbH
                                Bietigheim-Bissingen  Baden-Wuerttemberg  74321\r
                                DE\r
 \r
-00-19-32   (hex)               Gude Analog- und Digialsysteme GmbH\r
-001932     (base 16)           Gude Analog- und Digialsysteme GmbH\r
-                               Eintrachstrasse 113\r
-                               Cologne  NRW  50668\r
-                               DE\r
-\r
 00-19-10   (hex)               Knick Elektronische Messgeraete GmbH & Co. KG\r
 001910     (base 16)           Knick Elektronische Messgeraete GmbH & Co. KG\r
                                Beuckestraße 22\r
@@ -22358,12 +22154,6 @@ D4C766     (base 16)           Acentic GmbH
                                Guyancourt    78280\r
                                FR\r
 \r
-00-17-11   (hex)               GE Healthcare Bio-Sciences AB\r
-001711     (base 16)           GE Healthcare Bio-Sciences AB\r
-                               Björkgatan 30\r
-                               Uppsala  SE  75184\r
-                               SE\r
-\r
 00-17-45   (hex)               INNOTZ CO., Ltd\r
 001745     (base 16)           INNOTZ CO., Ltd\r
                                14F, Prime Center 546-4 Guui-Dong Kwanggin-Gu\r
@@ -22598,12 +22388,6 @@ D4C766     (base 16)           Acentic GmbH
                                Camarillo  CA  93012\r
                                US\r
 \r
-00-15-D2   (hex)               Xantech Corporation\r
-0015D2     (base 16)           Xantech Corporation\r
-                               13100 Telfair Avenue\r
-                               Sylmar  CA  91342-3573\r
-                               US\r
-\r
 00-15-D4   (hex)               Emitor AB\r
 0015D4     (base 16)           Emitor AB\r
                                Sjöviksbacken 14\r
@@ -22622,12 +22406,6 @@ D4C766     (base 16)           Acentic GmbH
                                  D.F.  11480\r
                                MX\r
 \r
-00-16-12   (hex)               Otsuka Electronics Co., Ltd.\r
-001612     (base 16)           Otsuka Electronics Co., Ltd.\r
-                               1-10 Sasagaoka, Minakuchi\r
-                               kouka  shiga  528-0061\r
-                               US\r
-\r
 00-16-0B   (hex)               TVWorks LLC\r
 00160B     (base 16)           TVWorks LLC\r
                                Two Belvedere Place, #200\r
@@ -26267,12 +26045,6 @@ D4C766     (base 16)           Acentic GmbH
                                Seoul    \r
                                KR\r
 \r
-00-07-8E   (hex)               Garz & Friche GmbH\r
-00078E     (base 16)           Garz & Friche GmbH\r
-                               Tempowerhving 4\r
-                                   \r
-                               DE\r
-\r
 00-07-54   (hex)               Xyterra Computing, Inc.\r
 000754     (base 16)           Xyterra Computing, Inc.\r
                                14505 Hayden Rd.,\r
@@ -28826,12 +28598,6 @@ D4C766     (base 16)           Acentic GmbH
                                Roy  UT  84067\r
                                US\r
 \r
-00-50-F1   (hex)               Intel Corporation\r
-0050F1     (base 16)           Intel Corporation\r
-                               94 Em-Hamoshavot Way.\r
-                               Petach-Tikva    \r
-                               IL\r
-\r
 00-50-CB   (hex)               JETTER\r
 0050CB     (base 16)           JETTER\r
                                GRAETERSTRASSE 2\r
@@ -32252,12 +32018,6 @@ D44F68     (base 16)           Eidetic Communications Inc
                                GUMI  GYEONG BUK  730-030\r
                                KR\r
 \r
-34-0F-66   (hex)               MicroArx Corporation\r
-340F66     (base 16)           MicroArx Corporation\r
-                               P.O. Box 692\r
-                               Hanover  NH  03755\r
-                               US\r
-\r
 8C-C8-4B   (hex)               CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
 8CC84B     (base 16)           CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
                                Building D21,No.1, East Zone 1st Road,Xiyong Town,Shapingba District\r
@@ -32654,12 +32414,6 @@ BC1AE4     (base 16)           Huawei Device Co., Ltd.
                                Reno  NV  89507\r
                                US\r
 \r
-D8-3B-BF   (hex)               Intel Corporate\r
-D83BBF     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 50-2C-C6   (hex)               GREE ELECTRIC APPLIANCES, INC. OF ZHUHAI\r
 502CC6     (base 16)           GREE ELECTRIC APPLIANCES, INC. OF ZHUHAI\r
                                Jinji West Road, Qianshan,\r
@@ -32861,12 +32615,6 @@ F05CD5     (base 16)           Apple, Inc.
                                Cupertino  CA  95014\r
                                US\r
 \r
-14-F6-D8   (hex)               Intel Corporate\r
-14F6D8     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 3C-DA-6D   (hex)               Tiandy Technologies CO.,LTD\r
 3CDA6D     (base 16)           Tiandy Technologies CO.,LTD\r
                                NO.8,haitai huake rd2 (outside ring road),huayuan new technology industrial park\r
@@ -33227,12 +32975,6 @@ E0E0FC     (base 16)           Huawei Device Co., Ltd.
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-E0-D4-E8   (hex)               Intel Corporate\r
-E0D4E8     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 30-50-75   (hex)               GN Audio A/S\r
 305075     (base 16)           GN Audio A/S\r
                                Lautrupbjerg 7\r
@@ -33521,48 +33263,822 @@ CC4E24     (base 16)         Brocade Communications Systems LLC
                                San Jose  CA  95131\r
                                US\r
 \r
+A8-05-77   (hex)               Netlist, Inc.\r
+A80577     (base 16)           Netlist, Inc.\r
+                               175 Technology\r
+                               Irvine  CA  92618\r
+                               US\r
+\r
+E4-3A-65   (hex)               MofiNetwork Inc\r
+E43A65     (base 16)           MofiNetwork Inc\r
+                               11 Boynton Cir\r
+                               Markham  Ontario  L6C 1A8\r
+                               CA\r
+\r
 08-AA-55   (hex)               Motorola Mobility LLC, a Lenovo Company\r
 08AA55     (base 16)           Motorola Mobility LLC, a Lenovo Company\r
                                222 West Merchandise Mart Plaza\r
                                Chicago  IL  60654\r
                                US\r
 \r
+54-21-9D   (hex)               Samsung Electronics Co.,Ltd\r
+54219D     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
 C8-8B-E8   (hex)               Masimo Corporation\r
 C88BE8     (base 16)           Masimo Corporation\r
                                40 Parker\r
                                Irvine  CA  92618\r
                                US\r
 \r
+F0-41-C6   (hex)               Heat Tech Company, Ltd.\r
+F041C6     (base 16)           Heat Tech Company, Ltd.\r
+                               221A, Tikhookeanskaya st.\r
+                               Khabarovsk    680033\r
+                               RU\r
+\r
 40-40-28   (hex)               ZIV\r
 404028     (base 16)           ZIV\r
                                Polígono Parque Tecnológico, 210\r
                                ZAMUDIO  VIZCAYA  48170\r
                                ES\r
 \r
-54-21-9D   (hex)               Samsung Electronics Co.,Ltd\r
-54219D     (base 16)           Samsung Electronics Co.,Ltd\r
+F8-6C-03   (hex)               Shenzhen Teleone Technology Co., Ltd\r
+F86C03     (base 16)           Shenzhen Teleone Technology Co., Ltd\r
+                               TOWER B 5/F, SHANSHUI BUILDING, NANSHAN YUNGU INNOVATION INDUSTRY PARK, 1183 LIUXIAN AVENUE, NANSHAN, SHENZHEN, CHINA\r
+                               Shenzhen    518000\r
+                               CN\r
+\r
+D8-71-4D   (hex)               Texas Instruments\r
+D8714D     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+0C-EC-80   (hex)               Texas Instruments\r
+0CEC80     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+10-5D-DC   (hex)               Huawei Device Co., Ltd.\r
+105DDC     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+DC-73-85   (hex)               Huawei Device Co., Ltd.\r
+DC7385     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+54-55-D5   (hex)               Huawei Device Co., Ltd.\r
+5455D5     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+00-15-D2   (hex)               Xantech Corporation\r
+0015D2     (base 16)           Xantech Corporation\r
+                               5919 Sea Otter Place\r
+                               Carlsbad  CA  92010\r
+                               US\r
+\r
+00-1F-40   (hex)               Speakercraft Inc.\r
+001F40     (base 16)           Speakercraft Inc.\r
+                               5919 Sea Otter Place\r
+                               Carlsbad  CA  92010\r
+                               US\r
+\r
+18-45-93   (hex)               Taicang T&W Electronics\r
+184593     (base 16)           Taicang T&W Electronics\r
+                               89# Jiang Nan RD\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
+                               Espoo  Espoo  02600\r
+                               FI\r
+\r
+3C-30-6F   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+3C306F     (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-EA-E7   (hex)               Shanghai High-Flying Electronics  Technology Co., Ltd\r
+34EAE7     (base 16)           Shanghai High-Flying Electronics  Technology Co., Ltd\r
+                               Room 1002,#1Building,No.3000 Longdong Avenue,Pudong\r
+                               Shanghai  Shanghai  201202\r
+                               CN\r
+\r
+D4-AB-CD   (hex)               Hui Zhou Gaoshengda Technology Co.,LTD\r
+D4ABCD     (base 16)           Hui Zhou Gaoshengda Technology Co.,LTD\r
+                               No.75,Zhongkai High-Tech Development District,Huizhou\r
+                               Hui Zhou  Guangdong  516006\r
+                               CN\r
+\r
+80-E1-BF   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+80E1BF     (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
+48-2C-D0   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+482CD0     (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
+00-19-32   (hex)               Gude Systems GmbH\r
+001932     (base 16)           Gude Systems GmbH\r
+                               Von-der-Wettern-Str. 23\r
+                               Cologne  NRW  51149\r
+                               DE\r
+\r
+A0-CA-A5   (hex)               INTELLIGENCE TECHNOLOGY OF CEC CO., LTD\r
+A0CAA5     (base 16)           INTELLIGENCE TECHNOLOGY OF CEC CO., LTD\r
+                               Tower A, NO.2 Lutuan Road, The sountern Of Future Science and Tech Zone, Changping District\r
+                               Beijing  Beijing  102209\r
+                               CN\r
+\r
+5C-5F-67   (hex)               Intel Corporate\r
+5C5F67     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+0C-54-15   (hex)               Intel Corporate\r
+0C5415     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+30-24-32   (hex)               Intel Corporate\r
+302432     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+DC-8B-28   (hex)               Intel Corporate\r
+DC8B28     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+1C-1B-B5   (hex)               Intel Corporate\r
+1C1BB5     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+F8-34-41   (hex)               Intel Corporate\r
+F83441     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+E4-70-B8   (hex)               Intel Corporate\r
+E470B8     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+E0-0E-E4   (hex)               DWnet Technologies(Suzhou) Corporation\r
+E00EE4     (base 16)           DWnet Technologies(Suzhou) Corporation\r
+                               No.8,Tangzhuang Road, Suzhou Industrial Park, Jiangsu, China\r
+                               Suzhou    21500\r
+                               CN\r
+\r
+E8-85-4B   (hex)               Apple, Inc.\r
+E8854B     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+28-EC-95   (hex)               Apple, Inc.\r
+28EC95     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+58-FD-B1   (hex)               LG Electronics\r
+58FDB1     (base 16)           LG Electronics\r
+                               222 LG-ro, JINWI-MYEON\r
+                               Pyeongtaek-si  Gyeonggi-do  451-713\r
+                               KR\r
+\r
+E0-2B-96   (hex)               Apple, Inc.\r
+E02B96     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+A8-46-9D   (hex)               Cisco Meraki\r
+A8469D     (base 16)           Cisco Meraki\r
+                               500 Terry A. Francois Blvd\r
+                               San Francisco    94158\r
+                               US\r
+\r
+6C-DE-A9   (hex)               Cisco Meraki\r
+6CDEA9     (base 16)           Cisco Meraki\r
+                               500 Terry A. Francois Blvd\r
+                               San Francisco    94158\r
+                               US\r
+\r
+8C-CE-FD   (hex)               Shenzhen zhouhai technology co.,LTD\r
+8CCEFD     (base 16)           Shenzhen zhouhai technology co.,LTD\r
+                               401-403,415-416, Area A, Block B, West Silicon Valley, 5010 Baoan Avenue, Baoan District, Shenzhen, China\r
+                               Shenzhen  Guangdong  518110\r
+                               CN\r
+\r
+50-FB-19   (hex)               CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.\r
+50FB19     (base 16)           CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.\r
+                               9F,BLOCK A,GARDEN CITY DIGITAL BUILDING,NO.1079 NANHAI ROAD,NANSHAN DISTRICT\r
+                               SHEN ZHEN  GUANG DONG  518000\r
+                               CN\r
+\r
+D0-AB-D5   (hex)               Intel Corporate\r
+D0ABD5     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+68-17-29   (hex)               Intel Corporate\r
+681729     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+B8-08-CF   (hex)               Intel Corporate\r
+B808CF     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+DC-71-96   (hex)               Intel Corporate\r
+DC7196     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+50-E0-85   (hex)               Intel Corporate\r
+50E085     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+94-08-C7   (hex)               Huawei Device Co., Ltd.\r
+9408C7     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+C8-CA-63   (hex)               Huawei Device Co., Ltd.\r
+C8CA63     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+98-3B-8F   (hex)               Intel Corporate\r
+983B8F     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+D0-C6-37   (hex)               Intel Corporate\r
+D0C637     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+04-EA-56   (hex)               Intel Corporate\r
+04EA56     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+D4-3B-04   (hex)               Intel Corporate\r
+D43B04     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+38-68-93   (hex)               Intel Corporate\r
+386893     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+D8-3B-BF   (hex)               Intel Corporate\r
+D83BBF     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+14-F6-D8   (hex)               Intel Corporate\r
+14F6D8     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+E0-D4-E8   (hex)               Intel Corporate\r
+E0D4E8     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+94-E6-F7   (hex)               Intel Corporate\r
+94E6F7     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+4C-1D-96   (hex)               Intel Corporate\r
+4C1D96     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+70-3A-A6   (hex)               New H3C Technologies Co., Ltd\r
+703AA6     (base 16)           New H3C Technologies Co., Ltd\r
+                               466 Changhe Road, Binjiang District\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+94-37-F7   (hex)               Huawei Device Co., Ltd.\r
+9437F7     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+04-6C-59   (hex)               Intel Corporate\r
+046C59     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+90-3F-EA   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+903FEA     (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
+20-AB-48   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+20AB48     (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
+CC-D7-3C   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+CCD73C     (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
+D4-40-D0   (hex)               OCOSMOS Co., LTD\r
+D440D0     (base 16)           OCOSMOS Co., LTD\r
+                               (Tamnip-Dong) #1, 263-1 Techno 2-Ro Yuseong-Gu\r
+                               Daejeon  Daejeon  34026\r
+                               KR\r
+\r
+94-E7-0B   (hex)               Intel Corporate\r
+94E70B     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+00-1E-E0   (hex)               Urmet SpA\r
+001EE0     (base 16)           Urmet SpA\r
+                               Via Bologna 188/C\r
+                               Torino  TO  I-10154\r
+                               IT\r
+\r
+DC-D9-AE   (hex)               Nokia Shanghai Bell Co., Ltd.\r
+DCD9AE     (base 16)           Nokia Shanghai Bell Co., Ltd.\r
+                               No.388 Ning Qiao Road,Jin Qiao Pudong Shanghai\r
+                               Shanghai     201206\r
+                               CN\r
+\r
+98-B8-BC   (hex)               Samsung Electronics Co.,Ltd\r
+98B8BC     (base 16)           Samsung Electronics Co.,Ltd\r
                                #94-1, Imsoo-Dong\r
                                Gumi  Gyeongbuk  730-350\r
                                KR\r
 \r
-A8-05-77   (hex)               Netlist, Inc.\r
-A80577     (base 16)           Netlist, Inc.\r
-                               175 Technology\r
-                               Irvine  CA  92618\r
+18-4E-16   (hex)               Samsung Electronics Co.,Ltd\r
+184E16     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+C0-3D-03   (hex)               Samsung Electronics Co.,Ltd\r
+C03D03     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+A4-97-B1   (hex)               CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+A497B1     (base 16)           CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+                               Building D21,No.1, East Zone 1st Road,Xiyong Town,Shapingba District\r
+                               Chongqing  Chongqing  401332\r
+                               CN\r
+\r
+BC-A9-93   (hex)               Cambium Networks Limited\r
+BCA993     (base 16)           Cambium Networks Limited\r
+                               Unit B2, Linhay Business Park,\r
+                               Ashburton  Devon  TQ13 7UP\r
+                               GB\r
+\r
+10-74-6F   (hex)               MOTOROLA SOLUTIONS MALAYSIA SDN. BHD.\r
+10746F     (base 16)           MOTOROLA SOLUTIONS MALAYSIA SDN. BHD.\r
+                               INNOPLEX, NO. 2A, MEDAN BAYAN LEPAS, BAYAN LEPAS TECHNOPLEX\r
+                               BAYAN LEPAS  PENANG  11900\r
+                               MY\r
+\r
+00-92-7D   (hex)               Ficosa Internationa(Taicang) C0.,Ltd.\r
+00927D     (base 16)           Ficosa Internationa(Taicang) C0.,Ltd.\r
+                               No.518, Middle Suzhou Rd., Taicang Economy Developing Area,  Taicang,\r
+                               Suzhou  Jiangsu  215400\r
+                               CN\r
+\r
+44-16-22   (hex)               Microsoft Corporation\r
+441622     (base 16)           Microsoft Corporation\r
+                               One Microsoft Way\r
+                               REDMOND  WA  98052\r
                                US\r
 \r
-F0-41-C6   (hex)               Heat Tech Company, Ltd.\r
-F041C6     (base 16)           Heat Tech Company, Ltd.\r
-                               221A, Tikhookeanskaya st.\r
-                               Khabarovsk    680033\r
+44-E6-B0   (hex)               China Mobile IOT Company Limited\r
+44E6B0     (base 16)           China Mobile IOT Company Limited\r
+                               NO.8 Yu Ma Road, NanAn Area\r
+                               Chongqing  Chongqing  401336\r
+                               CN\r
+\r
+74-7A-90   (hex)               Murata Manufacturing Co., Ltd.\r
+747A90     (base 16)           Murata Manufacturing Co., Ltd.\r
+                               1-10-1, Higashikotari\r
+                               Nagaokakyo-shi  Kyoto  617-8555\r
+                               JP\r
+\r
+24-E9-CA   (hex)               Huawei Device Co., Ltd.\r
+24E9CA     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+14-00-7D   (hex)               zte corporation\r
+14007D     (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
+94-AE-F0   (hex)               Cisco Systems, Inc\r
+94AEF0     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+1C-08-C1   (hex)               LG Innotek\r
+1C08C1     (base 16)           LG Innotek\r
+                               978-1 Jangduk dong, Gwangsangu\r
+                               Gwangju  Gwangju  506-731\r
+                               KR\r
+\r
+34-87-3D   (hex)               Quectel Wireless Solutions Co., Ltd.\r
+34873D     (base 16)           Quectel Wireless Solutions Co., Ltd.\r
+                               RM501,Building 13,No.99 TianZhou Road,Xuhui District,Shanghai,China\r
+                               Shanghai  Shanghai  200233\r
+                               CN\r
+\r
+9C-F6-1A   (hex)               Carrier Fire & Security\r
+9CF61A     (base 16)           Carrier Fire & Security\r
+                               Kelvinstraat 7\r
+                               DH Weert    6003\r
+                               NL\r
+\r
+58-B6-23   (hex)               Beijing Xiaomi Mobile Software Co., Ltd\r
+58B623     (base 16)           Beijing Xiaomi Mobile Software Co., Ltd\r
+                               Xiaomi Campus, No. 33 Xi erqi Middle Road, Haidian District\r
+                               Beijing  Beijing  100085\r
+                               CN\r
+\r
+A0-22-DE   (hex)               vivo Mobile Communication Co., Ltd.\r
+A022DE     (base 16)           vivo Mobile Communication Co., Ltd.\r
+                               #283,BBK Road\r
+                               Wusha,Chang'An  DongGuan City,Guangdong,  523860\r
+                               CN\r
+\r
+FC-73-FB   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+FC73FB     (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
+04-45-62   (hex)               ANDRA Sp. z o. o.\r
+044562     (base 16)           ANDRA Sp. z o. o.\r
+                               Pryzmaty 6/8\r
+                               Warszawa    02-226\r
+                               PL\r
+\r
+00-26-9E   (hex)               Quanta Computer Inc.\r
+00269E     (base 16)           Quanta Computer Inc.\r
+                               NO. 211, WEN HWA 2RD., KUEI SHAN HSIANG, TAIPEI, SHIEN\r
+                               TAO YUAN    333\r
+                               TW\r
+\r
+C4-54-44   (hex)               Quanta Computer Inc.\r
+C45444     (base 16)           Quanta Computer Inc.\r
+                               No.211, Wen Hwa 2nd Rd., Kuei Shan Hsiang, Tao Yuan Shien, Taiwan, R. O. C.\r
+                               Taoyuan  Taiwan  33377\r
+                               TW\r
+\r
+00-C0-9F   (hex)               Quanta Computer Inc.\r
+00C09F     (base 16)           Quanta Computer Inc.\r
+                               7F., 116, HOU-KANG ST.,\r
+                               TAIWAN  TAIWAN  R.O.C.\r
+                               TW\r
+\r
+00-1B-24   (hex)               Quanta Computer Inc.\r
+001B24     (base 16)           Quanta Computer Inc.\r
+                               No. 211, Wen Hwa 2nd Rd.,\r
+                               Kuei Shan Hsiang  Tao Yuan Shien  333\r
+                               TW\r
+\r
+C8-0A-A9   (hex)               Quanta Computer Inc.\r
+C80AA9     (base 16)           Quanta Computer Inc.\r
+                               211, Wen Hwa 2nd Rd.,\r
+                               Tao Yuan  Kuei Shan  33377\r
+                               TW\r
+\r
+60-EB-69   (hex)               Quanta Computer Inc.\r
+60EB69     (base 16)           Quanta Computer Inc.\r
+                               211, Wen Hwa 2nd Rd.,Kuei Shan, \r
+                               Tao Yuan    33377\r
+                               TW\r
+\r
+C0-8F-20   (hex)               Shenzhen Skyworth  Digital  Technology  CO., Ltd\r
+C08F20     (base 16)           Shenzhen Skyworth  Digital  Technology  CO., Ltd\r
+                               4F,Block A, Skyworth?Building,\r
+                               Shenzhen  Guangdong  518057\r
+                               CN\r
+\r
+74-F7-F6   (hex)               Shanghai Sunmi Technology Co.,Ltd.\r
+74F7F6     (base 16)           Shanghai Sunmi Technology Co.,Ltd.\r
+                               Room 505, KIC Plaza, No.388 Song Hu Road, Yang Pu District, Shanghai, China\r
+                               Shanghai  Yang Pu District  200433\r
+                               CN\r
+\r
+C0-CC-42   (hex)               Sichuan Tianyi Comheart Telecom Co., Ltd.\r
+C0CC42     (base 16)           Sichuan Tianyi Comheart Telecom Co., Ltd.\r
+                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+                               Chengdu  Sichuan  611330\r
+                               CN\r
+\r
+24-1A-E6   (hex)               Huawei Device Co., Ltd.\r
+241AE6     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+60-B7-6E   (hex)               Google, Inc.\r
+60B76E     (base 16)           Google, Inc.\r
+                               1600 Amphitheatre Parkway\r
+                               Mountain View  CA  94043\r
+                               US\r
+\r
+B4-23-30   (hex)               Itron Inc\r
+B42330     (base 16)           Itron Inc\r
+                               2111 N Molter Rd\r
+                               Liberty Lake  WA  99019\r
+                               US\r
+\r
+08-4E-BF   (hex)               Sumitomo Electric Industries, Ltd\r
+084EBF     (base 16)           Sumitomo Electric Industries, Ltd\r
+                               1-1-3, Shimaya, Konohana-ku\r
+                               Osaka    554-0024\r
+                               JP\r
+\r
+A8-02-DB   (hex)               zte corporation\r
+A802DB     (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
+1C-5D-80   (hex)               Mitubishi Hitachi Power Systems Industries Co., Ltd.\r
+1C5D80     (base 16)           Mitubishi Hitachi Power Systems Industries Co., Ltd.\r
+                               Nakaku Aioimachi\r
+                               Yokohama    2310012\r
+                               JP\r
+\r
+80-16-05   (hex)               Vodafone Italia S.p.A.\r
+801605     (base 16)           Vodafone Italia S.p.A.\r
+                               Via Lorenteggio nr. 240\r
+                               Milan  Italy  20147\r
+                               IT\r
+\r
+3C-9C-0F   (hex)               Intel Corporate\r
+3C9C0F     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+5C-44-3E   (hex)               Skullcandy\r
+5C443E     (base 16)           Skullcandy\r
+                               6301 N. Landmark Dr. \r
+                               Park City  UT  84098\r
+                               US\r
+\r
+F8-82-00   (hex)               CaptionCall\r
+F88200     (base 16)           CaptionCall\r
+                               4215 Riverboat Road\r
+                               Salt Lake City  UT  84123\r
+                               US\r
+\r
+08-FB-EA   (hex)               AMPAK Technology,Inc.\r
+08FBEA     (base 16)           AMPAK Technology,Inc.\r
+                               3F, No.15-1 Zhonghua Road, Hsinchu Industrail Park, Hukou,\r
+                               Hsinchu  Hsinchu,Taiwan R.O.C.  30352\r
+                               TW\r
+\r
+34-0F-66   (hex)               Web Sensing LLC\r
+340F66     (base 16)           Web Sensing LLC\r
+                               P.O. Box 692\r
+                               Hanover  NH  03755\r
+                               US\r
+\r
+58-65-E6   (hex)               infomark\r
+5865E6     (base 16)           infomark\r
+                               #801, KINS TOWER, JEONGJA-DONG\r
+                               SEONGNAM  GYOUNGGI  463-847\r
+                               KR\r
+\r
+00-50-F1   (hex)               Maxlinear, Inc\r
+0050F1     (base 16)           Maxlinear, Inc\r
+                               94 Em-Hamoshavot Way.\r
+                               Petach-Tikva    \r
+                               IL\r
+\r
+F4-E5-78   (hex)               LLC Proizvodstvennaya Kompania TransService\r
+F4E578     (base 16)           LLC Proizvodstvennaya Kompania TransService\r
+                               Ulitsa Podolskih Kursantov,  build. 3, of. 133\r
+                               Moscow  Moscow  117545\r
                                RU\r
 \r
-E4-3A-65   (hex)               MofiNetwork Inc\r
-E43A65     (base 16)           MofiNetwork Inc\r
-                               11 Boynton Cir\r
-                               Markham  Ontario  L6C 1A8\r
+08-54-BB   (hex)               SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD\r
+0854BB     (base 16)           SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD\r
+                               Unit East Block22-24/F,Skyworth semiconductor design  Bldg., Gaoxin Ave.4.S.,Nanshan District,Shenzhen,China\r
+                               SHENZHEN  GUANGDONG  518057\r
+                               CN\r
+\r
+60-EB-5A   (hex)               Asterfusion Data Technologies Co.,Ltd\r
+60EB5A     (base 16)           Asterfusion Data Technologies Co.,Ltd\r
+                               B401, Building 2, Creative Industry Park, No.328 Xinghu Street, SIP, Suzhou\r
+                               suzhou    215123\r
+                               CN\r
+\r
+E4-D3-73   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+E4D373     (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
+C0-BC-9A   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+C0BC9A     (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
+70-2C-09   (hex)               Nintendo Co.,Ltd\r
+702C09     (base 16)           Nintendo Co.,Ltd\r
+                               11-1 HOKOTATE-CHO KAMITOBA,MINAMI-KU\r
+                               KYOTO  KYOTO  601-8501\r
+                               JP\r
+\r
+E8-1B-69   (hex)               Sercomm Corporation.\r
+E81B69     (base 16)           Sercomm Corporation.\r
+                               3F,No.81,Yu-Yih Rd.,Chu-Nan Chen\r
+                               Miao-Lih Hsuan    115\r
+                               TW\r
+\r
+68-52-D6   (hex)               UGame Technology Co.,Ltd\r
+6852D6     (base 16)           UGame Technology Co.,Ltd\r
+                               3F, Bld.7, F518 Idea Land, No. 1065 Baoyuan Road, Xixiang Street, Baoan District\r
+                               Shenzhen    518102\r
+                               CN\r
+\r
+FC-19-99   (hex)               Xiaomi Communications Co Ltd\r
+FC1999     (base 16)           Xiaomi Communications Co Ltd\r
+                               The Rainbow City of China Resources\r
+                               NO.68, Qinghe Middle Street  Haidian District, Beijing  100085\r
+                               CN\r
+\r
+90-12-A1   (hex)               We Corporation Inc.\r
+9012A1     (base 16)           We Corporation Inc.\r
+                               201, 33, Deokcheon-ro, Manan-gu\r
+                               Anyang-si  Gyeonggi-do  14088\r
+                               KR\r
+\r
+B8-80-35   (hex)               Shenzhen Qihu Intelligent Technology Company Limited\r
+B88035     (base 16)           Shenzhen Qihu Intelligent Technology Company Limited\r
+                               Room 201, Block A, No.1, Qianwan Road 1,Qianhai Shenzhen HongKong Modern Service Industry Cooperation Zone\r
+                               Shenzhen  Guangdong  518057\r
+                               CN\r
+\r
+00-17-11   (hex)               Cytiva Sweden AB\r
+001711     (base 16)           Cytiva Sweden AB\r
+                               Björkgatan 30\r
+                               Uppsala  SE  75184\r
+                               SE\r
+\r
+B4-C2-6A   (hex)               Garmin International\r
+B4C26A     (base 16)           Garmin International\r
+                               1200 E. 151st St\r
+                               Olathe  KS  66062\r
+                               US\r
+\r
+64-B6-23   (hex)               CCS Care Communication Solutions GmbH\r
+64B623     (base 16)           CCS Care Communication Solutions GmbH\r
+                               Computerstrasse 6\r
+                               Vienna    1100\r
+                               AT\r
+\r
+E8-9F-80   (hex)               Belkin International Inc.\r
+E89F80     (base 16)           Belkin International Inc.\r
+                               12045 East Waterfront Drive\r
+                               Playa Vista    90094\r
+                               US\r
+\r
+BC-5C-4C   (hex)               ELECOM CO.,LTD.\r
+BC5C4C     (base 16)           ELECOM CO.,LTD.\r
+                               2F Kudan First Place Bldg. 4-1-28\r
+                               Chiyoda-ku  Kudan Kita  102-0073\r
+                               JP\r
+\r
+04-AB-18   (hex)               ELECOM CO.,LTD.\r
+04AB18     (base 16)           ELECOM CO.,LTD.\r
+                               2F Kudan First Place Bldg. 4-1-28\r
+                               Chiyoda-ku  Kudan Kita  102-0073\r
+                               JP\r
+\r
+6C-E5-F7   (hex)               New H3C Technologies Co., Ltd\r
+6CE5F7     (base 16)           New H3C Technologies Co., Ltd\r
+                               466 Changhe Road, Binjiang District\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+B8-DD-71   (hex)               zte corporation\r
+B8DD71     (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
+78-F8-B8   (hex)               Rako Controls Ltd\r
+78F8B8     (base 16)           Rako Controls Ltd\r
+                               Knight Road\r
+                               Rochester  Kent  ME2 2AH\r
+                               GB\r
+\r
+00-16-12   (hex)               Otsuka Electronics Co., Ltd.\r
+001612     (base 16)           Otsuka Electronics Co., Ltd.\r
+                               1-10 Sasagaoka, Minakuchi\r
+                               kouka  shiga  528-0061\r
+                               JP\r
+\r
+A4-51-29   (hex)               XAG\r
+A45129     (base 16)           XAG\r
+                               Block C, 115 Gaopu Road\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
 \r
+04-46-CF   (hex)               Beijing Venustech Cybervision Co.,Ltd.\r
+0446CF     (base 16)           Beijing Venustech Cybervision Co.,Ltd.\r
+                               Venus Plaza No.21Zhongguancun Software Park,No.8 Dongbeiwang Xilu, Haidian District\r
+                               Beijing  Beijing  100193\r
+                               CN\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
 9C-FF-C2   (hex)               AVI Systems GmbH\r
 9CFFC2     (base 16)           AVI Systems GmbH\r
                                Dr. Franz Wilhelmstraße 2A\r
@@ -33851,12 +34367,6 @@ ACFE05     (base 16)           ITEL MOBILE LIMITED
                                NO.68, Qinghe Middle Street  Haidian District, Beijing  100085\r
                                CN\r
 \r
-08-71-90   (hex)               Intel Corporate\r
-087190     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 B0-3E-51   (hex)               BSkyB Ltd\r
 B03E51     (base 16)           BSkyB Ltd\r
                                130 Kings Road\r
@@ -34046,12 +34556,6 @@ B8F12A     (base 16)           Apple, Inc.
                                Dongguan    523808\r
                                CN\r
 \r
-40-74-E0   (hex)               Intel Corporate\r
-4074E0     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 DC-54-D7   (hex)               Amazon Technologies Inc.\r
 DC54D7     (base 16)           Amazon Technologies Inc.\r
                                P.O Box 8102\r
@@ -34331,12 +34835,6 @@ D0196A     (base 16)           Ciena Corporation
 88-B4-36   (hex)               Private\r
 88B436     (base 16)           Private\r
 \r
-84-FD-D1   (hex)               Intel Corporate\r
-84FDD1     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 6C-AB-05   (hex)               Cisco Systems, Inc\r
 6CAB05     (base 16)           Cisco Systems, Inc\r
                                80 West Tasman Drive\r
@@ -34550,12 +35048,6 @@ F8BBBF     (base 16)           eero inc.
                                San Francisco  CA  94105\r
                                US\r
 \r
-DC-FB-48   (hex)               Intel Corporate\r
-DCFB48     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 84-6F-CE   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
 846FCE     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
                                NO.18 HAIBIN ROAD,\r
@@ -34610,12 +35102,6 @@ DC7137     (base 16)           zte corporation
                                Taipei  Taiwan  112\r
                                TW\r
 \r
-A0-51-0B   (hex)               Intel Corporate\r
-A0510B     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 F0-D4-E2   (hex)               Dell Inc.\r
 F0D4E2     (base 16)           Dell Inc.\r
                                One Dell Way\r
@@ -34988,12 +35474,6 @@ C4346B     (base 16)           Hewlett Packard
                                Houston    77070\r
                                US\r
 \r
-48-F1-7F   (hex)               Intel Corporate\r
-48F17F     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 80-84-A9   (hex)               oshkosh Corporation\r
 8084A9     (base 16)           oshkosh Corporation\r
                                2307 Oregon Street\r
@@ -35234,12 +35714,6 @@ F80F6F     (base 16)           Cisco Systems, Inc
                                SANTA CLARA  CA  95052-8185\r
                                US\r
 \r
-D8-F2-CA   (hex)               Intel Corporate\r
-D8F2CA     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 B4-C6-2E   (hex)               Molex CMS\r
 B4C62E     (base 16)           Molex CMS\r
                                2222 Wellington Court\r
@@ -35789,12 +36263,6 @@ A8016D     (base 16)           Aiwa Corporation
                                Hangzhou  Zhejiang  310052\r
                                CN\r
 \r
-48-A4-72   (hex)               Intel Corporate\r
-48A472     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 4C-01-43   (hex)               eero inc.\r
 4C0143     (base 16)           eero inc.\r
                                660 3rd Street\r
@@ -36095,12 +36563,6 @@ D01CBB     (base 16)           Beijing Ctimes Digital Technology Co., Ltd.
                                Hanover  MD  21076\r
                                US\r
 \r
-C0-B6-F9   (hex)               Intel Corporate\r
-C0B6F9     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 68-DD-26   (hex)               Shanghai Focus Vision Security Technology Co.,Ltd\r
 68DD26     (base 16)           Shanghai Focus Vision Security Technology Co.,Ltd\r
                                No.4888 Hunan Rd, Pudong New District\r
@@ -36197,12 +36659,6 @@ D8B6B7     (base 16)           Comtrend Corporation
                                New Taipei City,  Taiwan  24159\r
                                TW\r
 \r
-14-4F-8A   (hex)               Intel Corporate\r
-144F8A     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 00-21-06   (hex)               RIM Testing Services\r
 002106     (base 16)           RIM Testing Services\r
                                440 Phillip Street\r
@@ -36359,12 +36815,6 @@ AC3B77     (base 16)           Sagemcom Broadband SAS
                                Rueil Malmaison Cedex  hauts de seine  92848\r
                                FR\r
 \r
-B4-6B-FC   (hex)               Intel Corporate\r
-B46BFC     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 B0-FC-0D   (hex)               Amazon Technologies Inc.\r
 B0FC0D     (base 16)           Amazon Technologies Inc.\r
                                P.O Box 8102\r
@@ -36749,12 +37199,6 @@ EC7FC6     (base 16)           ECCEL CORPORATION SAS
                                shenzhen  guangdong  518057\r
                                CN\r
 \r
-7C-2A-31   (hex)               Intel Corporate\r
-7C2A31     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 00-10-D8   (hex)               CALISTA\r
 0010D8     (base 16)           CALISTA\r
                                56A Packhorse Road\r
@@ -36827,12 +37271,6 @@ BCDDC2     (base 16)           Espressif Inc.
                                Berlin  Berlin  10559\r
                                DE\r
 \r
-74-70-FD   (hex)               Intel Corporate\r
-7470FD     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 C8-8F-26   (hex)               Skyworth Digital Technology(Shenzhen) Co.,Ltd\r
 C88F26     (base 16)           Skyworth Digital Technology(Shenzhen) Co.,Ltd\r
                                7F,Block A,Skyworth Building,\r
@@ -37169,12 +37607,6 @@ CC40D0     (base 16)           NETGEAR
                                New Taipei City  Taiwan  23585\r
                                TW\r
 \r
-7C-76-35   (hex)               Intel Corporate\r
-7C7635     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 78-80-38   (hex)               FUNAI ELECTRIC CO., LTD.\r
 788038     (base 16)           FUNAI ELECTRIC CO., LTD.\r
                                7-1, NAKAGAITO 7-CHOME\r
@@ -37757,12 +38189,6 @@ CC66B2     (base 16)           Nokia
                                Kanata  Ontario  K2K 2E6\r
                                CA\r
 \r
-68-EC-C5   (hex)               Intel Corporate\r
-68ECC5     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 9C-65-EE   (hex)               DASAN Network Solutions\r
 9C65EE     (base 16)           DASAN Network Solutions\r
                                DASAN Tower 8F, 49 Daewangpangyo-ro644beon-gil Bundang-gu\r
@@ -38945,12 +39371,6 @@ DCD255     (base 16)           Kinpo Electronics, Inc.
                                Shenkeng Dist.  New Taipei City  222\r
                                TW\r
 \r
-00-13-51   (hex)               Niles Audio Corporation\r
-001351     (base 16)           Niles Audio Corporation\r
-                               12331 SW 130th Street\r
-                               Miami  FL  33186\r
-                               US\r
-\r
 A0-2C-36   (hex)               FN-LINK TECHNOLOGY LIMITED\r
 A02C36     (base 16)           FN-LINK TECHNOLOGY LIMITED\r
                                A Building,HuiXin industial park,No 31, YongHe road, Fuyong town, Bao'an District\r
@@ -39221,12 +39641,6 @@ F4F524     (base 16)           Motorola Mobility LLC, a Lenovo Company
                                Ohta-ku  Tokyo  146-8501\r
                                JP\r
 \r
-A8-1E-84   (hex)               QUANTA COMPUTER INC. \r
-A81E84     (base 16)           QUANTA COMPUTER INC. \r
-                               No.211, Wen Hwa 2nd Rd., Kuei Shan Hsiang\r
-                               Tao Yuan    33377\r
-                               TW\r
-\r
 24-C1-BD   (hex)               CRRC DALIAN R&D CO.,LTD.\r
 24C1BD     (base 16)           CRRC DALIAN R&D CO.,LTD.\r
                                No.1 Haoyang North Street,Lvshun Economic Deveopment Zone\r
@@ -40391,18 +40805,6 @@ E8886C     (base 16)           Shenzhen SC Technologies Co.,LTD
                                000    0000\r
                                IL\r
 \r
-08-9E-01   (hex)               QUANTA COMPUTER INC.\r
-089E01     (base 16)           QUANTA COMPUTER INC.\r
-                               No.211, Wen Hwa 2nd Rd\r
-                               Taoyuan  Taiwan  33377\r
-                               TW\r
-\r
-04-7D-7B   (hex)               QUANTA COMPUTER INC.\r
-047D7B     (base 16)           QUANTA COMPUTER INC.\r
-                               NO. 211, WEN HWA 2RD.,KUEI SHAN HSIANG, TAO YUAN SHIEN,\r
-                               TAIPEI  TAIWAN  333\r
-                               TW\r
-\r
 9C-61-21   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
 9C6121     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
                                FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
@@ -40649,12 +41051,6 @@ C86C87     (base 16)           Zyxel Communications Corporation
                                Zhuhai  Guangdong  519085\r
                                CN\r
 \r
-38-F0-C8   (hex)               Livestream\r
-38F0C8     (base 16)           Livestream\r
-                               195 Morgan Avenue\r
-                               Brooklyn  NY  11237\r
-                               US\r
-\r
 80-29-94   (hex)               Technicolor CH USA Inc.\r
 802994     (base 16)           Technicolor CH USA Inc.\r
                                5030 Sugarloaf Parkway Bldg 6\r
@@ -48689,12 +49085,6 @@ C035BD     (base 16)           Velocytech Aps
                                HsinChu  HsinFun Shiang  304\r
                                TW\r
 \r
-08-8F-2C   (hex)               Hills Sound Vision & Lighting\r
-088F2C     (base 16)           Hills Sound Vision & Lighting\r
-                               1 Clyde Street\r
-                               Silverwater  New South Wales  2128\r
-                               AU\r
-\r
 44-13-19   (hex)               WKK TECHNOLOGY LTD.\r
 441319     (base 16)           WKK TECHNOLOGY LTD.\r
                                23/F., One Kowloon, No.1, Wang Yuen Street, \r
@@ -51233,12 +51623,6 @@ E4751E     (base 16)           Getinge Sterilization AB
                                Getinge    31044\r
                                SE\r
 \r
-10-65-A3   (hex)               Core Brands LLC\r
-1065A3     (base 16)           Core Brands LLC\r
-                               1880 South McDowell Blvd\r
-                               Petaluma  CA  94954\r
-                               US\r
-\r
 9C-5B-96   (hex)               NMR Corporation\r
 9C5B96     (base 16)           NMR Corporation\r
                                3F Esprit Build.,1-3-6 Nishi-Nippori\r
@@ -51698,12 +52082,6 @@ D4AAFF     (base 16)           MICRO WORLD
                                Daejeon    302-809\r
                                KR\r
 \r
-00-25-DC   (hex)               Sumitomo Electric Industries,Ltd\r
-0025DC     (base 16)           Sumitomo Electric Industries,Ltd\r
-                               1-1-3, Shimaya, Konohana-ku\r
-                               Osaka    554-0024\r
-                               JP\r
-\r
 00-25-D4   (hex)               General Dynamics Mission Systems\r
 0025D4     (base 16)           General Dynamics Mission Systems\r
                                150 Rustcraft Road\r
@@ -56231,12 +56609,6 @@ D4AAFF     (base 16)           MICRO WORLD
                                Taipei    105\r
                                TW\r
 \r
-00-12-E3   (hex)               Agat-RT, Ltd.\r
-0012E3     (base 16)           Agat-RT, Ltd.\r
-                               101 pr. Mira #1220,\r
-                               Moscow    129085\r
-                               RU\r
-\r
 00-12-36   (hex)               ConSentry Networks\r
 001236     (base 16)           ConSentry Networks\r
                                1690 McCandless Dr\r
@@ -59627,12 +59999,6 @@ D4AAFF     (base 16)           MICRO WORLD
                                    \r
                                BE\r
 \r
-00-05-C9   (hex)               LG Innotek Co., Ltd.\r
-0005C9     (base 16)           LG Innotek Co., Ltd.\r
-                               LG Component R&D Center\r
-                               Ansan-si  Gyeonggi-do  426-791\r
-                               KR\r
-\r
 00-05-FB   (hex)               ShareGate, Inc.\r
 0005FB     (base 16)           ShareGate, Inc.\r
                                9805 Double R Blvd.\r
@@ -60479,12 +60845,6 @@ D4AAFF     (base 16)           MICRO WORLD
                                Tottori City    680-8634\r
                                JP\r
 \r
-00-02-C4   (hex)               Vector International BVBA\r
-0002C4     (base 16)           Vector International BVBA\r
-                               Technologielaan 4\r
-                               3001  Leuven  \r
-                               BE\r
-\r
 00-02-BF   (hex)               dotRocket, Inc.\r
 0002BF     (base 16)           dotRocket, Inc.\r
                                1901 S. Bascom, Suite 300\r
@@ -61133,12 +61493,6 @@ D4AAFF     (base 16)           MICRO WORLD
                                Washington  DC  20008\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
-                               TW\r
-\r
 00-30-0B   (hex)               mPHASE Technologies, Inc.\r
 00300B     (base 16)           mPHASE Technologies, Inc.\r
                                250 14th Street\r
@@ -64769,12 +65123,6 @@ B43939     (base 16)           Shenzhen TINNO Mobile Technology Corp.
                                Shenzhen   guangdong  518053\r
                                CN\r
 \r
-5C-CD-5B   (hex)               Intel Corporate\r
-5CCD5B     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 A0-AB-51   (hex)               WEIFANG GOERTEK ELECTRONICS CO.,LTD\r
 A0AB51     (base 16)           WEIFANG GOERTEK ELECTRONICS CO.,LTD\r
                                Gaoxin 2 Road, Free Trade Zone,Weifang,Shandong,261205,P.R.China\r
@@ -64907,12 +65255,6 @@ E85A8B     (base 16)           Xiaomi Communications Co Ltd
                                Chong Qing  Chong Qing  401120\r
                                CN\r
 \r
-98-AF-65   (hex)               Intel Corporate\r
-98AF65     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 5C-71-0D   (hex)               Cisco Systems, Inc\r
 5C710D     (base 16)           Cisco Systems, Inc\r
                                80 West Tasman Dr.\r
@@ -65081,24 +65423,12 @@ E0EB40     (base 16)          Apple, Inc.
                                Cupertino  CA  95014\r
                                US\r
 \r
-40-A6-B7   (hex)               Intel Corporate\r
-40A6B7     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 64-69-4E   (hex)               Texas Instruments\r
 64694E     (base 16)           Texas Instruments\r
                                12500 TI Blvd\r
                                Dallas  TX  75243\r
                                US\r
 \r
-0C-7A-15   (hex)               Intel Corporate\r
-0C7A15     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 94-D6-DB   (hex)               NexFi\r
 94D6DB     (base 16)           NexFi\r
                                Room 417, Building 14, No. 498, Guoshoujing Road, Pudong New Area\r
@@ -65180,12 +65510,6 @@ A0224E     (base 16)           IEEE Registration Authority
 30-27-CF   (hex)               Private\r
 3027CF     (base 16)           Private\r
 \r
-54-8D-5A   (hex)               Intel Corporate\r
-548D5A     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 38-43-E5   (hex)               Grotech Inc\r
 3843E5     (base 16)           Grotech Inc\r
                                19, Ojeongongeop-gil\r
@@ -65234,12 +65558,6 @@ D8D5B9     (base 16)           Rainforest Automation, Inc.
                                BANGALORE  KARNATAKA  560013\r
                                IN\r
 \r
-58-96-1D   (hex)               Intel Corporate\r
-58961D     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 68-AF-FF   (hex)               Shanghai Cambricon Information Technology Co., Ltd.\r
 68AFFF     (base 16)           Shanghai Cambricon Information Technology Co., Ltd.\r
                                888 West Huanhu Road No.2, Nanhui New Town, Pudong New Area\r
@@ -65288,12 +65606,6 @@ D01C3C     (base 16)           TECNO MOBILE LIMITED
                                Shanghai  Shanghai  201203\r
                                CN\r
 \r
-B8-9A-2A   (hex)               Intel Corporate\r
-B89A2A     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 40-2C-76   (hex)               IEEE Registration Authority\r
 402C76     (base 16)           IEEE Registration Authority\r
                                445 Hoes Lane\r
@@ -65408,18 +65720,6 @@ AC15F4     (base 16)           Apple, Inc.
                                Shenzhen  Guangdong  518057\r
                                CN\r
 \r
-74-D8-3E   (hex)               Intel Corporate\r
-74D83E     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
-08-D2-3E   (hex)               Intel Corporate\r
-08D23E     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 88-A4-79   (hex)               Apple, Inc.\r
 88A479     (base 16)           Apple, Inc.\r
                                1 Infinite Loop\r
@@ -65492,12 +65792,6 @@ B00AD5     (base 16)           zte corporation
                                shenzhen  guangdong  518057\r
                                CN\r
 \r
-A8-7E-EA   (hex)               Intel Corporate\r
-A87EEA     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 20-11-4E   (hex)               MeteRSit S.R.L.\r
 20114E     (base 16)           MeteRSit S.R.L.\r
                                Viale dell'Industria 31\r
@@ -65642,12 +65936,6 @@ EC97B2     (base 16)           SUMEC Machinery & Electric Co.,Ltd.
                                Odawara  Kanagawa  250-0011\r
                                JP\r
 \r
-40-EC-99   (hex)               Intel Corporate\r
-40EC99     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 6C-D9-4C   (hex)               vivo Mobile Communication Co., Ltd.\r
 6CD94C     (base 16)           vivo Mobile Communication Co., Ltd.\r
                                #283,BBK Road\r
@@ -65660,12 +65948,6 @@ EC316D     (base 16)           Hansgrohe
                                Schiltach    77761\r
                                DE\r
 \r
-BC-54-2F   (hex)               Intel Corporate\r
-BC542F     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 44-10-FE   (hex)               Huizhou Foryou General Electronics Co., Ltd.\r
 4410FE     (base 16)           Huizhou Foryou General Electronics Co., Ltd.\r
                                North Shangxia Road, Dongjiang Hi-tech Industry Park\r
@@ -65876,12 +66158,6 @@ B8E3B1     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD
                                Rosenheim  BY  83026\r
                                DE\r
 \r
-34-CF-F6   (hex)               Intel Corporate\r
-34CFF6     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 EC-79-49   (hex)               FUJITSU LIMITED\r
 EC7949     (base 16)           FUJITSU LIMITED\r
                                403, Kosugi-cho 1-chome, Nakahara-ku\r
@@ -66044,12 +66320,6 @@ C4A402     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD
                                San Diego  CA  92121\r
                                US\r
 \r
-78-2B-46   (hex)               Intel Corporate\r
-782B46     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 68-33-2C   (hex)               KENSTEL NETWORKS LIMITED\r
 68332C     (base 16)           KENSTEL NETWORKS LIMITED\r
                                34D SECTOR 57 HSIIDC INDUSTRIAL AREA PHASE 4\r
@@ -66272,6 +66542,921 @@ CC0DF2     (base 16)          Motorola Mobility LLC, a Lenovo Company
                                Hanover  MD  21076\r
                                US\r
 \r
+A8-40-25   (hex)               Oxide Computer Company\r
+A84025     (base 16)           Oxide Computer Company\r
+                               1251 Park Avenue\r
+                               Emeryville  CA  94608\r
+                               US\r
+\r
+10-65-A3   (hex)               Panamax LLC\r
+1065A3     (base 16)           Panamax LLC\r
+                               5919 Sea Otter Place\r
+                               Carlsbad   CA  92010\r
+                               US\r
+\r
+C8-5B-A0   (hex)               Shenzhen Qihu Intelligent Technology Company Limited\r
+C85BA0     (base 16)           Shenzhen Qihu Intelligent Technology Company Limited\r
+                               Room 201, Block A, No.1, Qianwan Road 1,Qianhai Shenzhen HongKong Modern Service Industry Cooperation Zone\r
+                               Shenzhen  Guangdong  518057\r
+                               CN\r
+\r
+E0-BE-03   (hex)               Lite-On Network Communication (Dongguan) Limited\r
+E0BE03     (base 16)           Lite-On Network Communication (Dongguan) Limited\r
+                               30#Keji Rd,YinHu Industrial Area,Qingxi Town Dongguan City,Guang Dong China\r
+                               Dongguan  Guang Dong  523648\r
+                               CN\r
+\r
+5C-90-12   (hex)               Owl Cyber Defense Solutions, LLC\r
+5C9012     (base 16)           Owl Cyber Defense Solutions, LLC\r
+                               38A Grove Street\r
+                               Ridgefield  CT  06877\r
+                               US\r
+\r
+38-F7-CD   (hex)               IEEE Registration Authority\r
+38F7CD     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+98-CB-A4   (hex)               Benchmark Electronics\r
+98CBA4     (base 16)           Benchmark Electronics\r
+                               Free Industrial Zone, Phase 1, \r
+                               Bayan Lepas  Penang  11900\r
+                               MY\r
+\r
+00-12-E3   (hex)               Agat Soft LLC\r
+0012E3     (base 16)           Agat Soft LLC\r
+                               building 14, stroenie 15, room 7\r
+                               Moscow  Serebryakova proezd  129343\r
+                               RU\r
+\r
+00-13-51   (hex)               Niles Audio Corporation\r
+001351     (base 16)           Niles Audio Corporation\r
+                               5919 Sea Otter Place\r
+                               Carlsbad  CA  92010\r
+                               US\r
+\r
+18-3C-B7   (hex)               Huawei Device Co., Ltd.\r
+183CB7     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+A4-88-73   (hex)               Cisco Systems, Inc\r
+A48873     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+B8-80-4F   (hex)               Texas Instruments\r
+B8804F     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+FC-A5-D0   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+FCA5D0     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+                               NO.18 HAIBIN ROAD,\r
+                               DONG GUAN  GUANG DONG  523860\r
+                               CN\r
+\r
+04-CB-88   (hex)               Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd\r
+04CB88     (base 16)           Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd\r
+                               3/F,A5 Building Zhiyuan Community No.1001,Xueyuan Road Nanshan District\r
+                               Shenzhen  Guangdong  518055\r
+                               CN\r
+\r
+A0-62-60   (hex)               Private\r
+A06260     (base 16)           Private\r
+\r
+A4-BD-C4   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+A4BDC4     (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
+5C-91-57   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+5C9157     (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
+48-16-93   (hex)               Lear Corporation GmbH\r
+481693     (base 16)           Lear Corporation GmbH\r
+                               Industriestrasse 48\r
+                               Kronach  Bavaria  96317\r
+                               DE\r
+\r
+B4-79-47   (hex)               Nutanix\r
+B47947     (base 16)           Nutanix\r
+                               1740 Technology Drive Ste #150\r
+                               San Jose  CA  95110\r
+                               US\r
+\r
+04-F8-F8   (hex)               Edgecore Networks Corporation\r
+04F8F8     (base 16)           Edgecore Networks Corporation\r
+                               1 Creation RD 3.\r
+                               Hsinchu    30077\r
+                               TW\r
+\r
+38-F0-C8   (hex)               Mevo Inc.\r
+38F0C8     (base 16)           Mevo Inc.\r
+                               19 Morris Avenue\r
+                               Brooklyn  NY  11205\r
+                               US\r
+\r
+5C-FE-9E   (hex)               Wiwynn Corporation Tainan Branch\r
+5CFE9E     (base 16)           Wiwynn Corporation Tainan Branch\r
+                               4F, NO. 8, Beiyuan 3rd Rd., Anding Dist.,\r
+                               Tainan    745\r
+                               TW\r
+\r
+88-1C-95   (hex)               ITEL MOBILE LIMITED\r
+881C95     (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
+F4-69-42   (hex)               ASKEY COMPUTER CORP\r
+F46942     (base 16)           ASKEY COMPUTER CORP\r
+                               10F,No.119,JIANKANG RD,ZHONGHE DIST\r
+                               NEW TAIPEI  TAIWAN  23585\r
+                               TW\r
+\r
+24-14-07   (hex)               Xiamen Sigmastar Technology Ltd.\r
+241407     (base 16)           Xiamen Sigmastar Technology Ltd.\r
+                               15th Floor ,Unit A,Chuangxin Building, Software Park, Xiamen Torch Hi-Tech Industrial Development Zone, Xiamen,China\r
+                               Xiamen  Fujian  361005\r
+                               CN\r
+\r
+08-E9-F6   (hex)               AMPAK Technology,Inc.\r
+08E9F6     (base 16)           AMPAK Technology,Inc.\r
+                               3F, No.15-1 Zhonghua Road, Hsinchu Industrail Park, Hukou,\r
+                               Hsinchu  Hsinchu,Taiwan R.O.C.  30352\r
+                               TW\r
+\r
+F0-2E-51   (hex)               Casa Systems\r
+F02E51     (base 16)           Casa Systems\r
+                               18-20 Orion Road Lane Cove West\r
+                               LANE COVE  NSW  2066\r
+                               AU\r
+\r
+CC-C2-61   (hex)               IEEE Registration Authority\r
+CCC261     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+74-70-FD   (hex)               Intel Corporate\r
+7470FD     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+7C-2A-31   (hex)               Intel Corporate\r
+7C2A31     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+B4-6B-FC   (hex)               Intel Corporate\r
+B46BFC     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+14-4F-8A   (hex)               Intel Corporate\r
+144F8A     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+C0-B6-F9   (hex)               Intel Corporate\r
+C0B6F9     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+48-A4-72   (hex)               Intel Corporate\r
+48A472     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+D8-F2-CA   (hex)               Intel Corporate\r
+D8F2CA     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+48-F1-7F   (hex)               Intel Corporate\r
+48F17F     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+44-56-E2   (hex)               Sichuan Tianyi Comheart Telecom Co., Ltd.\r
+4456E2     (base 16)           Sichuan Tianyi Comheart Telecom Co., Ltd.\r
+                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+                               Chengdu  Sichuan  611330\r
+                               CN\r
+\r
+68-EC-C5   (hex)               Intel Corporate\r
+68ECC5     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+7C-76-35   (hex)               Intel Corporate\r
+7C7635     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+64-0B-D7   (hex)               Apple, Inc.\r
+640BD7     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+A8-91-3D   (hex)               Apple, Inc.\r
+A8913D     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+4C-C9-5E   (hex)               Samsung Electronics Co.,Ltd\r
+4CC95E     (base 16)           Samsung Electronics Co.,Ltd\r
+                               129, Samsung-ro, Youngtongl-Gu\r
+                               Suwon  Gyeonggi-Do  16677\r
+                               KR\r
+\r
+0C-3B-50   (hex)               Apple, Inc.\r
+0C3B50     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+78-2B-46   (hex)               Intel Corporate\r
+782B46     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+34-7D-F6   (hex)               Intel Corporate\r
+347DF6     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+CC-D9-AC   (hex)               Intel Corporate\r
+CCD9AC     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+9C-29-76   (hex)               Intel Corporate\r
+9C2976     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+B8-9A-2A   (hex)               Intel Corporate\r
+B89A2A     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+58-96-1D   (hex)               Intel Corporate\r
+58961D     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+74-D8-3E   (hex)               Intel Corporate\r
+74D83E     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+08-D2-3E   (hex)               Intel Corporate\r
+08D23E     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+A8-7E-EA   (hex)               Intel Corporate\r
+A87EEA     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+40-EC-99   (hex)               Intel Corporate\r
+40EC99     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+BC-54-2F   (hex)               Intel Corporate\r
+BC542F     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+34-CF-F6   (hex)               Intel Corporate\r
+34CFF6     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+C8-7E-A1   (hex)               TCL MOKA International Limited\r
+C87EA1     (base 16)           TCL MOKA International Limited\r
+                               7/F, Building 22E 22 Science Park East Avenue\r
+                               Hong Kong    999077\r
+                               HK\r
+\r
+64-2C-0F   (hex)               vivo Mobile Communication Co., Ltd.\r
+642C0F     (base 16)           vivo Mobile Communication Co., Ltd.\r
+                               #283,BBK Road\r
+                               Wusha,Chang'An  DongGuan City,Guangdong,  523860\r
+                               CN\r
+\r
+A0-51-0B   (hex)               Intel Corporate\r
+A0510B     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+DC-FB-48   (hex)               Intel Corporate\r
+DCFB48     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+84-FD-D1   (hex)               Intel Corporate\r
+84FDD1     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+40-74-E0   (hex)               Intel Corporate\r
+4074E0     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+08-71-90   (hex)               Intel Corporate\r
+087190     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+5C-CD-5B   (hex)               Intel Corporate\r
+5CCD5B     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+98-AF-65   (hex)               Intel Corporate\r
+98AF65     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+40-A6-B7   (hex)               Intel Corporate\r
+40A6B7     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+0C-7A-15   (hex)               Intel Corporate\r
+0C7A15     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+54-8D-5A   (hex)               Intel Corporate\r
+548D5A     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+30-66-D0   (hex)               Huawei Device Co., Ltd.\r
+3066D0     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+3C-B2-33   (hex)               Huawei Device Co., Ltd.\r
+3CB233     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+20-9E-79   (hex)               Universal Electronics, Inc.\r
+209E79     (base 16)           Universal Electronics, Inc.\r
+                               201 E. Sandpointe Ave\r
+                               Santa Ana  CA  92707\r
+                               US\r
+\r
+AC-5F-EA   (hex)               OnePlus Technology (Shenzhen) Co., Ltd\r
+AC5FEA     (base 16)           OnePlus Technology (Shenzhen) Co., Ltd\r
+                               18C02, 18C03, 18C04 ,18C05,TAIRAN BUILDING,\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+04-4A-C6   (hex)               Aipon Electronics Co., Ltd\r
+044AC6     (base 16)           Aipon Electronics Co., Ltd\r
+                               #78, Qiaojiao Dong road, Qiaolong, Tangxia Town\r
+                               Dongguan City  Guangdong Province  523-710\r
+                               CN\r
+\r
+5C-D5-B5   (hex)               Shenzhen WiSiYiLink Technology Co.,Ltd\r
+5CD5B5     (base 16)           Shenzhen WiSiYiLink Technology Co.,Ltd\r
+                               Building a 3, huafengzhigu Yuanshan hi tech Industrial Park, No.62, Yinhe Road, he'ao community, Yuanshan street, Longgang District\r
+                               Shenzhen    518100\r
+                               CN\r
+\r
+88-94-8F   (hex)               Xi'an Zhisensor Technologies Co.,Ltd\r
+88948F     (base 16)           Xi'an Zhisensor Technologies Co.,Ltd\r
+                                No.52 Jinye 1st Road Xi'an,Shaanxi,China\r
+                               Xi an  Xi an High-Tech Zone  710077\r
+                               CN\r
+\r
+18-95-52   (hex)               1MORE\r
+189552     (base 16)           1MORE\r
+                               TianliaoBuilding F14, New Materials Industrial Park, Xueyuan Blvd?Nanshan\r
+                               Shenzhen  Guangdong  518055\r
+                               CN\r
+\r
+C0-FF-A8   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+C0FFA8     (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
+C0-51-7E   (hex)               Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+C0517E     (base 16)           Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+                               No.555 Qianmo Road\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+FC-14-99   (hex)               Aimore Acoustics Incorporation\r
+FC1499     (base 16)           Aimore Acoustics Incorporation\r
+                               16F,Tianliao Building(New Material industrial Park), Xueyuan Avenue, Nanshan District\r
+                               Shenzhen   Guangdong  518055\r
+                               CN\r
+\r
+98-C7-A4   (hex)               Shenzhen HS Fiber Communication Equipment CO., LTD\r
+98C7A4     (base 16)           Shenzhen HS Fiber Communication Equipment CO., LTD\r
+                               6F, Bld#A, Dezhong Industrial Park, Yangmei Village, Bantian Town, Longgang District\r
+                               Shenzhen  Guangdong  518129\r
+                               CN\r
+\r
+00-BE-D5   (hex)               New H3C Technologies Co., Ltd\r
+00BED5     (base 16)           New H3C Technologies Co., Ltd\r
+                               466 Changhe Road, Binjiang District\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+00-02-C4   (hex)               OPT Machine Vision Tech Co., Ltd\r
+0002C4     (base 16)           OPT Machine Vision Tech Co., Ltd\r
+                               no. 8 JInSheng Road, JinXia Zone, Chang'An Town\r
+                               Dongguan  Guangdong  523000\r
+                               CN\r
+\r
+AC-F1-08   (hex)               LG Innotek\r
+ACF108     (base 16)           LG Innotek\r
+                               26, Hanamsandan 5beon-ro\r
+                               Gwangju  Gwangsan-gu  506-731\r
+                               KR\r
+\r
+08-ED-9D   (hex)               TECNO MOBILE LIMITED\r
+08ED9D     (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
+E8-6D-CB   (hex)               Samsung Electronics Co.,Ltd\r
+E86DCB     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+30-49-50   (hex)               IEEE Registration Authority\r
+304950     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+00-05-C9   (hex)               LG Innotek\r
+0005C9     (base 16)           LG Innotek\r
+                               LG Component R&D Center\r
+                               Ansan-si  Gyeonggi-do  426-791\r
+                               KR\r
+\r
+0C-DC-7E   (hex)               Espressif Inc.\r
+0CDC7E     (base 16)           Espressif Inc.\r
+                               Room 204, Building 2, 690 Bibo Rd, Pudong New Area\r
+                               Shanghai  Shanghai  201203\r
+                               CN\r
+\r
+20-98-D8   (hex)               Shenzhen Yingdakang Technology CO., LTD\r
+2098D8     (base 16)           Shenzhen Yingdakang Technology CO., LTD\r
+                               8004,Building 51,Block 2,Shangtang Songzi Park, MinZhi St., Longhua Dist\r
+                               Shenzhen    518055\r
+                               CN\r
+\r
+7C-C7-7E   (hex)               Fiberhome Telecommunication Technologies Co.,LTD\r
+7CC77E     (base 16)           Fiberhome Telecommunication Technologies Co.,LTD\r
+                               No.5 DongXin Road\r
+                               Wuhan  Hubei  430074\r
+                               CN\r
+\r
+A0-CF-F5   (hex)               zte corporation\r
+A0CFF5     (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
+1C-01-2D   (hex)               Ficer Technology\r
+1C012D     (base 16)           Ficer Technology\r
+                               2F, No.138, Daye Rd., Beitou Dist.,\r
+                               Taipei City    11268\r
+                               TW\r
+\r
+3C-A6-2F   (hex)               AVM Audiovisuelles Marketing und Computersysteme GmbH\r
+3CA62F     (base 16)           AVM Audiovisuelles Marketing und Computersysteme GmbH\r
+                               Alt-Moabit 95\r
+                               Berlin  Berlin  10559\r
+                               DE\r
+\r
+98-B3-EF   (hex)               Huawei Device Co., Ltd.\r
+98B3EF     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+50-F9-58   (hex)               Huawei Device Co., Ltd.\r
+50F958     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+C0-A3-6E   (hex)               BSkyB Ltd\r
+C0A36E     (base 16)           BSkyB Ltd\r
+                               130 Kings Road\r
+                               Brentwood  Essex  08854\r
+                               GB\r
+\r
+60-32-B1   (hex)               TP-LINK TECHNOLOGIES CO.,LTD.\r
+6032B1     (base 16)           TP-LINK TECHNOLOGIES CO.,LTD.\r
+                               Building 24(floors 1,3,4,5)and 28(floors 1-4)Central Science and Technology Park,Shennan Road,Nanshan\r
+                               Shenzhen  Guangdong  518057\r
+                               CN\r
+\r
+7C-FD-6B   (hex)               Xiaomi Communications Co Ltd\r
+7CFD6B     (base 16)           Xiaomi Communications Co Ltd\r
+                               The Rainbow City of China Resources\r
+                               NO.68, Qinghe Middle Street  Haidian District, Beijing  100085\r
+                               CN\r
+\r
+E4-1F-7B   (hex)               Cisco Systems, Inc\r
+E41F7B     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+18-26-49   (hex)               Intel Corporate\r
+182649     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+88-03-E9   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+8803E9     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+                               NO.18 HAIBIN ROAD,\r
+                               DONG GUAN  GUANG DONG  523860\r
+                               CN\r
+\r
+34-58-40   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+345840     (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
+5C-64-7A   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+5C647A     (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-7F-7B   (hex)               Huawei Device Co., Ltd.\r
+BC7F7B     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+F0-FA-C7   (hex)               Huawei Device Co., Ltd.\r
+F0FAC7     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+DC-EF-80   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+DCEF80     (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
+B4-6F-2D   (hex)               Wahoo Fitness\r
+B46F2D     (base 16)           Wahoo Fitness\r
+                               90 W Wieuca Rd, Suite 110\r
+                               Atlanta  GA  30342\r
+                               US\r
+\r
+5C-85-7E   (hex)               IEEE Registration Authority\r
+5C857E     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+84-6B-48   (hex)               ShenZhen EepuLink Co., Ltd.\r
+846B48     (base 16)           ShenZhen EepuLink Co., Ltd.\r
+                               4th Floor, Building 3, Nangang 1st industrial zone, Xili street, Nanshan district,\r
+                               ShenZhen  Guangdong  518000\r
+                               CN\r
+\r
+B4-60-ED   (hex)               Beijing Xiaomi Mobile Software Co., Ltd\r
+B460ED     (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
+30-CC-21   (hex)               zte corporation\r
+30CC21     (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-6C-80   (hex)               CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+646C80     (base 16)           CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+                               Building D21,No.1, East Zone 1st Road,Xiyong Town,Shapingba District\r
+                               Chongqing  Chongqing  401332\r
+                               CN\r
+\r
+08-9E-01   (hex)               Quanta Computer Inc.\r
+089E01     (base 16)           Quanta Computer Inc.\r
+                               No.211, Wen Hwa 2nd Rd\r
+                               Taoyuan  Taiwan  33377\r
+                               TW\r
+\r
+A8-1E-84   (hex)               Quanta Computer Inc.\r
+A81E84     (base 16)           Quanta Computer Inc.\r
+                               No.211, Wen Hwa 2nd Rd., Kuei Shan Hsiang\r
+                               Tao Yuan    33377\r
+                               TW\r
+\r
+C0-18-50   (hex)               Quanta Computer Inc.\r
+C01850     (base 16)           Quanta Computer Inc.\r
+                               No. 211, Wen-Hwa 2nd Rd.,Kuei-Shan Dist.\r
+                               Taoyuan City  Taiwan  33377\r
+                               TW\r
+\r
+44-27-F3   (hex)               70mai Co.,Ltd.\r
+4427F3     (base 16)           70mai Co.,Ltd.\r
+                               Room 2220, building 2, No. 588, Zixing road\r
+                               Shanghai  MinHang District  201100\r
+                               CN\r
+\r
+04-7D-7B   (hex)               Quanta Computer Inc.\r
+047D7B     (base 16)           Quanta Computer Inc.\r
+                               NO. 211, WEN HWA 2RD.,KUEI SHAN HSIANG, TAO YUAN SHIEN,\r
+                               TAIPEI  TAIWAN  333\r
+                               TW\r
+\r
+00-25-DC   (hex)               Sumitomo Electric Industries, Ltd\r
+0025DC     (base 16)           Sumitomo Electric Industries, Ltd\r
+                               1-1-3, Shimaya, Konohana-ku\r
+                               Osaka    554-0024\r
+                               JP\r
+\r
+D4-F3-37   (hex)               Xunison Ltd.\r
+D4F337     (base 16)           Xunison Ltd.\r
+                               25 Kilbarbery Business Park, Upper Nangor Road\r
+                               Dublin 22  Co. Dublin  D22 NH32\r
+                               IE\r
+\r
+48-A2-B8   (hex)               Chengdu Vision-Zenith Tech.Co,.Ltd\r
+48A2B8     (base 16)           Chengdu Vision-Zenith Tech.Co,.Ltd\r
+                               China (Sichuan) Free Trade Test Zone Chengdu Hi-tech Zone 300 Jiaozi Avenue 3 buildings 22\r
+                               Chengdu  Sichuan  610041\r
+                               CN\r
+\r
+C0-B8-E6   (hex)               Ruijie Networks Co.,LTD\r
+C0B8E6     (base 16)           Ruijie Networks Co.,LTD\r
+                               No. 2, 7th floor, xingwangruijie, haixi hi-tech industrial park, high-tech zone, fuzhou city\r
+                               Fuzhou  Fujian  350002\r
+                               CN\r
+\r
+8C-94-1F   (hex)               Cisco Systems, Inc\r
+8C941F     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+68-7D-B4   (hex)               Cisco Systems, Inc\r
+687DB4     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+58-E8-73   (hex)               HANGZHOU DANGBEI NETWORK TECH.Co.,Ltd\r
+58E873     (base 16)           HANGZHOU DANGBEI NETWORK TECH.Co.,Ltd\r
+                               Build C,Wanfu Center,Binkang Road No.228,Binjiang Area\r
+                               China    210051\r
+                               CN\r
+\r
+B0-30-C8   (hex)               Teal Drones, Inc.\r
+B030C8     (base 16)           Teal Drones, Inc.\r
+                               5200 South Highland Drive\r
+                               Holladay   UT  84117\r
+                               US\r
+\r
+DC-41-A9   (hex)               Intel Corporate\r
+DC41A9     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+08-8F-2C   (hex)               Amber Technology Ltd.\r
+088F2C     (base 16)           Amber Technology Ltd.\r
+                               Unit 1, 2 Daydream Street\r
+                               Warriewood  New South Wales  2102\r
+                               AU\r
+\r
+A8-35-12   (hex)               Huawei Device Co., Ltd.\r
+A83512     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+D4-A6-51   (hex)               HANGZHOU AIXIANGJI TECHNOLOGY CO., LTD\r
+D4A651     (base 16)           HANGZHOU AIXIANGJI TECHNOLOGY CO., LTD\r
+                               34/F.,ICBC Tower,3 Garden Road, Central, Hong Kong.\r
+                               Hong Kong  Central Garden Road  510031\r
+                               CN\r
+\r
+90-F6-44   (hex)               Huawei Device Co., Ltd.\r
+90F644     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+44-AF-28   (hex)               Intel Corporate\r
+44AF28     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+9C-9D-7E   (hex)               Beijing Xiaomi Mobile Software Co., Ltd\r
+9C9D7E     (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
+74-12-B3   (hex)               CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+7412B3     (base 16)           CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+                               Building D21,No.1, East Zone 1st Road,Xiyong Town,Shapingba District\r
+                               Chongqing  Chongqing  401332\r
+                               CN\r
+\r
+94-47-B0   (hex)               BEIJING ESWIN COMPUTING TECHNOLOGY CO., LTD\r
+9447B0     (base 16)           BEIJING ESWIN COMPUTING TECHNOLOGY CO., LTD\r
+                               Room 2179, Floor2,Block D, Building 33, Centralised Office Area, No.99, Kechuangshisi Road, BDA, Beijing\r
+                               BEIJING  BEIJING  100176\r
+                               CN\r
+\r
+A0-68-1C   (hex)               GD Midea Air-Conditioning Equipment Co.,Ltd.\r
+A0681C     (base 16)           GD Midea Air-Conditioning Equipment Co.,Ltd.\r
+                               Midea Global Innovation Center,Beijiao Town,Shunde\r
+                               Foshan  Guangdong  528311\r
+                               CN\r
+\r
+6C-44-2A   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+6C442A     (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
+A4-7C-C9   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+A47CC9     (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
+C4-0D-96   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+C40D96     (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
+F8-5C-7D   (hex)               Shenzhen Honesty Electronics Co.,Ltd.\r
+F85C7D     (base 16)           Shenzhen Honesty Electronics Co.,Ltd.\r
+                               5/F,Zone B,Chitat Industrial Park,West Longping Road, Longgang District,Shenzhen City\r
+                               Shenzhen  Guangdong  518172\r
+                               CN\r
+\r
+84-22-5E   (hex)               SHENZHEN TECHNEWCHIP TECHNOLOGY CO.,LTD.\r
+84225E     (base 16)           SHENZHEN TECHNEWCHIP TECHNOLOGY CO.,LTD.\r
+                               XILI STREET\r
+                               SHENZHEN  GUANGDONG  5180000\r
+                               CN\r
+\r
+E4-5A-D4   (hex)               Eltex Enterprise Ltd.\r
+E45AD4     (base 16)           Eltex Enterprise Ltd.\r
+                               Okruzhnaya st. 29v\r
+                               Novosibirsk    630020\r
+                               RU\r
+\r
+84-2A-FD   (hex)               HP Inc.\r
+842AFD     (base 16)           HP Inc.\r
+                               10300 Energy Dr\r
+                               Spring  TX  77389\r
+                               US\r
+\r
+1C-FE-2B   (hex)               Amazon Technologies Inc.\r
+1CFE2B     (base 16)           Amazon Technologies Inc.\r
+                               P.O Box 8102\r
+                               Reno  NV  89507\r
+                               US\r
+\r
+CC-48-3A   (hex)               Dell Inc.\r
+CC483A     (base 16)           Dell Inc.\r
+                               One Dell Way\r
+                               Round Rock  TX  78682\r
+                               US\r
+\r
+A4-AE-12   (hex)               Hon Hai Precision Ind. Co., Ltd.\r
+A4AE12     (base 16)           Hon Hai Precision Ind. Co., Ltd.\r
+                               GuangDongShenZhen\r
+                               ShenZhen  GuangDong  518109\r
+                               CN\r
+\r
+DC-A3-A2   (hex)               Feng mi(Beijing)technology co., LTD\r
+DCA3A2     (base 16)           Feng mi(Beijing)technology co., LTD\r
+                               RenHe Town barracks south street 10 yuan 33 level 301\r
+                               shunyi district  Beijing  101300\r
+                               CN\r
+\r
+7C-25-DA   (hex)               FN-LINK TECHNOLOGY LIMITED\r
+7C25DA     (base 16)           FN-LINK TECHNOLOGY LIMITED\r
+                               A Building,HuiXin industial park,No 31, YongHe road, Fuyong town, Bao'an District\r
+                               SHENZHEN  GUANGDONG  518100\r
+                               CN\r
+\r
+A8-69-8C   (hex)               Oracle Corporation \r
+A8698C     (base 16)           Oracle Corporation \r
+                               500 Oracle Parkway\r
+                               Redwood Shores  CA  94065\r
+                               US\r
+\r
+EC-57-0D   (hex)               AFE Inc.\r
+EC570D     (base 16)           AFE Inc.\r
+                               11210 County Line Rd\r
+                               Mount Pleasant  WI  53177\r
+                               US\r
+\r
+A4-AC-0F   (hex)               Huawei Device Co., Ltd.\r
+A4AC0F     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+CC-FF-90   (hex)               Huawei Device Co., Ltd.\r
+CCFF90     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+54-05-DB   (hex)               LCFC(HeFei) Electronics Technology co., ltd\r
+5405DB     (base 16)           LCFC(HeFei) Electronics Technology co., ltd\r
+                               YunGu Road 3188-1\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
+\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
+                               TW\r
+\r
 84-80-94   (hex)               Meter, Inc.\r
 848094     (base 16)           Meter, Inc.\r
                                148 Townsend St\r
@@ -66434,12 +67619,6 @@ BC62D2     (base 16)           Genexis International B.V.
                                Piscataway  NJ  08554\r
                                US\r
 \r
-0C-DD-24   (hex)               Intel Corporate\r
-0CDD24     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 00-0C-86   (hex)               Cisco Systems, Inc\r
 000C86     (base 16)           Cisco Systems, Inc\r
                                80 West Tasman Drive\r
@@ -66599,12 +67778,6 @@ ECA5DE     (base 16)           ONYX WIFI Inc
                                Beijing  Beijing  100085\r
                                CN\r
 \r
-50-EB-71   (hex)               Intel Corporate\r
-50EB71     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 C0-64-E4   (hex)               Cisco Systems, Inc\r
 C064E4     (base 16)           Cisco Systems, Inc\r
                                80 West Tasman Drive\r
@@ -66770,18 +67943,6 @@ CC3ADF     (base 16)           Private
                                Shenzhen  Guangdong  518057\r
                                CN\r
 \r
-5C-87-9C   (hex)               Intel Corporate\r
-5C879C     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
-24-EE-9A   (hex)               Intel Corporate\r
-24EE9A     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 00-1F-47   (hex)               MCS Logic Inc.\r
 001F47     (base 16)           MCS Logic Inc.\r
                                6F. Samho Center B Bldg., 275-6\r
@@ -67355,12 +68516,6 @@ F8AFDB     (base 16)           Fiberhome Telecommunication Technologies Co.,LTD
                                Wuhan  Hubei  430074\r
                                CN\r
 \r
-48-89-E7   (hex)               Intel Corporate\r
-4889E7     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 A0-BD-1D   (hex)               Zhejiang Dahua Technology Co., Ltd.\r
 A0BD1D     (base 16)           Zhejiang Dahua Technology Co., Ltd.\r
                                No.1199,Waterfront Road \r
@@ -67427,12 +68582,6 @@ DCED84     (base 16)           Haverford Systems Inc
                                Downingtown  PA  19335\r
                                US\r
 \r
-64-4C-36   (hex)               Intel Corporate\r
-644C36     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 7C-57-3C   (hex)               Aruba, a Hewlett Packard Enterprise Company\r
 7C573C     (base 16)           Aruba, a Hewlett Packard Enterprise Company\r
                                3333 Scott Blvd\r
@@ -67568,12 +68717,6 @@ CCEDDC     (base 16)           MitraStar Technology Corp.
                                Hsinchu    300\r
                                TW\r
 \r
-3C-F0-11   (hex)               Intel Corporate\r
-3CF011     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 CC-D8-1F   (hex)               Maipu Communication Technology Co.,Ltd.\r
 CCD81F     (base 16)           Maipu Communication Technology Co.,Ltd.\r
                                Maipu Mansion, No.288 Tianfu 3rd Street, High-tech Zone\r
@@ -67928,12 +69071,6 @@ D83AF5     (base 16)           Wideband Labs LLC
                                Framingham  MA  01701-9168\r
                                US\r
 \r
-98-2C-BC   (hex)               Intel Corporate\r
-982CBC     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 B0-E7-DE   (hex)               Homa Technologies JSC\r
 B0E7DE     (base 16)           Homa Technologies JSC\r
                                Building 5, Quang Trung Software City, District 12\r
@@ -68174,12 +69311,6 @@ A40C66     (base 16)           Shenzhen Colorful Yugong Technology and Development Co., L
                                Piscataway  NJ  08554\r
                                US\r
 \r
-FC-77-74   (hex)               Intel Corporate\r
-FC7774     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 70-0B-4F   (hex)               Cisco Systems, Inc\r
 700B4F     (base 16)           Cisco Systems, Inc\r
                                80 West Tasman Drive\r
@@ -68816,12 +69947,6 @@ EC6F0B     (base 16)           FADU, Inc.
                                Melbourne  FL  32919\r
                                US\r
 \r
-00-BB-60   (hex)               Intel Corporate\r
-00BB60     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 7C-6D-A6   (hex)               Superwave Group LLC\r
 7C6DA6     (base 16)           Superwave Group LLC\r
                                poselok Krasnaya Zarya, dom 15\r
@@ -68942,12 +70067,6 @@ A42618     (base 16)           Integrated Device Technology (Malaysia) Sdn. Bhd.
                                Bayan Lepas  Penang  11900\r
                                MY\r
 \r
-34-E1-2D   (hex)               Intel Corporate\r
-34E12D     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 A4-61-91   (hex)               NamJunSa\r
 A46191     (base 16)           NamJunSa\r
                                12, Gimhae-daero 2635 beon-gil\r
@@ -69212,12 +70331,6 @@ FC6BF0     (base 16)           TOPWELL INTERNATIONAL HOLDINDS LIMITED
                                TAOYUAN    33068\r
                                TW\r
 \r
-3C-6A-A7   (hex)               Intel Corporate\r
-3C6AA7     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 B8-B7-F1   (hex)               Wistron Neweb Corporation\r
 B8B7F1     (base 16)           Wistron Neweb Corporation\r
                                No.20,Park Avenue II,Hsinchu Science Park\r
@@ -69410,12 +70523,6 @@ EC9365     (base 16)           Mapper.ai, Inc.
                                San Francisco  CA  94110\r
                                US\r
 \r
-38-BA-F8   (hex)               Intel Corporate\r
-38BAF8     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 C4-BA-A3   (hex)               Beijing Winicssec Technologies Co., Ltd.\r
 C4BAA3     (base 16)           Beijing Winicssec Technologies Co., Ltd.\r
                                F block 9th floor 907 of Jiahua Building, No.9 Shangdi 3rd Street\r
@@ -69530,12 +70637,6 @@ E0338E     (base 16)           Apple, Inc.
                                Espoo  Finland  02610\r
                                FI\r
 \r
-20-16-B9   (hex)               Intel Corporate\r
-2016B9     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 D0-76-E7   (hex)               TP-LINK TECHNOLOGIES CO.,LTD.\r
 D076E7     (base 16)           TP-LINK TECHNOLOGIES CO.,LTD.\r
                                Building 24(floors 1,3,4,5)and 28(floors 1-4)Central Science and Technology Park,Shennan Road,Nanshan\r
@@ -69710,12 +70811,6 @@ D4F786     (base 16)           Fiberhome Telecommunication Technologies Co.,LTD
                                Dallas  TX  75243\r
                                US\r
 \r
-94-B8-6D   (hex)               Intel Corporate\r
-94B86D     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 24-0A-63   (hex)               ARRIS Group, Inc.\r
 240A63     (base 16)           ARRIS Group, Inc.\r
                                6450 Sequence Drive\r
@@ -70046,12 +71141,6 @@ C477AF     (base 16)           Advanced Digital Broadcast SA
                                Eysins    CH-1262\r
                                CH\r
 \r
-A4-86-AE   (hex)               Quectel Wireless Solutions\r
-A486AE     (base 16)           Quectel Wireless Solutions\r
-                               No.1801 Hongmei Road, Xuhui District\r
-                               Shanghai    200233\r
-                               CN\r
-\r
 94-29-0C   (hex)               Shenyang wisdom Foundation Technology Development Co., Ltd.\r
 94290C     (base 16)           Shenyang wisdom Foundation Technology Development Co., Ltd.\r
                                No. 262 North Main Street, Huanggu District, the Yellow River\r
@@ -70100,12 +71189,6 @@ A486AE     (base 16)           Quectel Wireless Solutions
                                Round Rock  TX  78682\r
                                US\r
 \r
-34-41-5D   (hex)               Intel Corporate\r
-34415D     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 00-50-91   (hex)               NETACCESS, INC.\r
 005091     (base 16)           NETACCESS, INC.\r
                                18 KEEWAYDIN DRIVE\r
@@ -70406,12 +71489,6 @@ B0FC36     (base 16)           CyberTAN Technology Inc.
                                Burnaby  BC  V5J 3J1\r
                                CA\r
 \r
-80-00-0B   (hex)               Intel Corporate\r
-80000B     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 EC-B0-E1   (hex)               Ciena Corporation\r
 ECB0E1     (base 16)           Ciena Corporation\r
                                7035 Ridge Road\r
@@ -70862,12 +71939,6 @@ CC9891     (base 16)           Cisco Systems, Inc
                                Seoul    01849\r
                                KR\r
 \r
-74-E5-F9   (hex)               Intel Corporate\r
-74E5F9     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 20-04-0F   (hex)               Dell Inc.\r
 20040F     (base 16)           Dell Inc.\r
                                One Dell Way\r
@@ -71012,12 +72083,6 @@ F86465     (base 16)           Anova Applied Electronics, Inc.
                                20059 VIMERCATE (MI)    \r
                                IT\r
 \r
-A0-88-69   (hex)               Intel Corporate\r
-A08869     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 50-8F-4C   (hex)               Xiaomi Communications Co Ltd\r
 508F4C     (base 16)           Xiaomi Communications Co Ltd\r
                                The Rainbow City of China Resources\r
@@ -71132,12 +72197,6 @@ A82BB5     (base 16)           Edgecore Networks Corporation
                                Hsinchu    30077\r
                                TW\r
 \r
-60-F6-77   (hex)               Intel Corporate\r
-60F677     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 E8-E1-E2   (hex)               Energotest\r
 E8E1E2     (base 16)           Energotest\r
                                Chorzowska 44B\r
@@ -73940,12 +74999,6 @@ C01ADA     (base 16)           Apple, Inc.
                                Cupertino  CA  95014\r
                                US\r
 \r
-2C-60-0C   (hex)               QUANTA COMPUTER INC.\r
-2C600C     (base 16)           QUANTA COMPUTER INC.\r
-                               No.211, Wen Hwa 2nd Rd\r
-                               Taoyuan  Taiwan  33377\r
-                               TW\r
-\r
 00-00-31   (hex)               QPSX COMMUNICATIONS, LTD.\r
 000031     (base 16)           QPSX COMMUNICATIONS, LTD.\r
                                33 RICHARDSON STREET\r
@@ -73964,18 +75017,6 @@ C01ADA     (base 16)           Apple, Inc.
                                Torrance  CA  90501\r
                                US\r
 \r
-00-23-8B   (hex)               QUANTA COMPUTER INC.\r
-00238B     (base 16)           QUANTA COMPUTER INC.\r
-                               NO. 211, WEN HWA 2RD.,KUEI SHAN HSIANG, TAO YUAN SHIEN,\r
-                               TAIPEI  TAIWAN  333\r
-                               TW\r
-\r
-00-1E-68   (hex)               QUANTA COMPUTER INC.\r
-001E68     (base 16)           QUANTA COMPUTER INC.\r
-                               NO. 211, WEN HWA 2RD., KUEI SHAN HSIANG\r
-                               TAIPEI  TAO YUAN SHIEN  333\r
-                               TW\r
-\r
 CC-52-AF   (hex)               Universal Global Scientific Industrial Co., Ltd.\r
 CC52AF     (base 16)           Universal Global Scientific Industrial Co., Ltd.\r
                                141, LANE 351, TAIPING RD.\r
@@ -75572,24 +76613,6 @@ D05349     (base 16)           Liteon Technology Corporation
                                New Taipei City  Taiwan  23585\r
                                TW\r
 \r
-00-0B-A2   (hex)               Sumitomo Electric Industries,Ltd\r
-000BA2     (base 16)           Sumitomo Electric Industries,Ltd\r
-                               1-1-3, Shimaya, Konohana-ku\r
-                               Osaka    554-0024\r
-                               JP\r
-\r
-00-08-F6   (hex)               Sumitomo Electric Industries,Ltd\r
-0008F6     (base 16)           Sumitomo Electric Industries,Ltd\r
-                               1-1-3, Shimaya, Konohana-ku\r
-                               Osaka    554-0024\r
-                               JP\r
-\r
-00-00-5F   (hex)               Sumitomo Electric Industries,Ltd\r
-00005F     (base 16)           Sumitomo Electric Industries,Ltd\r
-                               1-1-3, Shimaya, Konohana-ku\r
-                               Osaka    554-0024\r
-                               JP\r
-\r
 E8-F7-24   (hex)               Hewlett Packard Enterprise\r
 E8F724     (base 16)           Hewlett Packard Enterprise\r
                                8000 Foothills Blvd.\r
@@ -80021,12 +81044,6 @@ E0E631     (base 16)           SNB TECHNOLOGIES LIMITED
                                Sheung Wan    852\r
                                HK\r
 \r
-F8-57-2E   (hex)               Core Brands, LLC\r
-F8572E     (base 16)           Core Brands, LLC\r
-                               1800 South McDowell Blvd.\r
-                               Petaluma  CA  94954\r
-                               US\r
-\r
 50-ED-78   (hex)               Changzhou Yongse Infotech Co.,Ltd\r
 50ED78     (base 16)           Changzhou Yongse Infotech Co.,Ltd\r
                                No.128 Zhengzhong Rd, Xixiashua Town\r
@@ -87227,12 +88244,6 @@ D8D67E     (base 16)           GSK CNC EQUIPMENT CO.,LTD
                                    999077\r
                                HK\r
 \r
-00-1C-91   (hex)               Gefen Inc.\r
-001C91     (base 16)           Gefen Inc.\r
-                               20600 Nordhoff Street\r
-                               Chatsworth  CA  91311\r
-                               US\r
-\r
 00-1C-81   (hex)               NextGen Venturi LTD\r
 001C81     (base 16)           NextGen Venturi LTD\r
                                Technium 2\r
@@ -93374,12 +94385,6 @@ D8D67E     (base 16)           GSK CNC EQUIPMENT CO.,LTD
                                    \r
                                DE\r
 \r
-00-03-E8   (hex)               Wavelength Digital Limited\r
-0003E8     (base 16)           Wavelength Digital Limited\r
-                               12 Vincent Avenue\r
-                               MK8 0AB  MK8 0AB  ENGLAND\r
-                               GB\r
-\r
 00-04-21   (hex)               Ocular Networks\r
 000421     (base 16)           Ocular Networks\r
                                12700, Fair Lakes Circle\r
@@ -98015,12 +99020,6 @@ FCC233     (base 16)           ASUSTek COMPUTER INC.
                                Suwon  Gyeonggi-Do  16677\r
                                KR\r
 \r
-28-7F-CF   (hex)               Intel Corporate\r
-287FCF     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 58-35-26   (hex)               DEEPLET TECHNOLOGY CORP\r
 583526     (base 16)           DEEPLET TECHNOLOGY CORP\r
                                5F,No.9,Lane235,Pao-Chiao Rd., Hsin-Tien,\r
@@ -98165,12 +99164,6 @@ BC2EF6     (base 16)           Huawei Device Co., Ltd.
                                Lueneburg    21339\r
                                DE\r
 \r
-80-32-53   (hex)               Intel Corporate\r
-803253     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 F8-8A-5E   (hex)               Texas Instruments\r
 F88A5E     (base 16)           Texas Instruments\r
                                12500 TI Blvd\r
@@ -98759,12 +99752,6 @@ AC9085     (base 16)           Apple, Inc.
                                Lawrenceville  GA  30044\r
                                US\r
 \r
-9C-FC-E8   (hex)               Intel Corporate\r
-9CFCE8     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 34-2F-BD   (hex)               Nintendo Co.,Ltd\r
 342FBD     (base 16)           Nintendo Co.,Ltd\r
                                11-1 HOKOTATE-CHO KAMITOBA,MINAMI-KU\r
@@ -99149,12 +100136,6 @@ D003EB     (base 16)          Texas Instruments
                                Seongnam-si  Gyeonggi-do  13517\r
                                KR\r
 \r
-54-48-E6   (hex)               Beijing Xiaomi Mobile Software Co.,Ltd\r
-5448E6     (base 16)           Beijing Xiaomi Mobile Software Co.,Ltd\r
-                               Xiaomi Campus, No. 33 Xi erqi Middle Road, Haidian District\r
-                               Beijing  Beijing  100085\r
-                               CN\r
-\r
 18-9E-2C   (hex)               Huawei Device Co., Ltd.\r
 189E2C     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
@@ -99479,6 +100460,882 @@ F0B022     (base 16)         TOHO Electronics INC.
                                Beijing    100053\r
                                CN\r
 \r
+D4-F8-29   (hex)               Sagemcom Broadband SAS\r
+D4F829     (base 16)           Sagemcom Broadband SAS\r
+                               250, route de l'Empereur\r
+                               Rueil Malmaison Cedex  hauts de seine  92848\r
+                               FR\r
+\r
+E0-62-34   (hex)               Texas Instruments\r
+E06234     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+70-8C-BB   (hex)               MIMODISPLAYKOREA\r
+708CBB     (base 16)           MIMODISPLAYKOREA\r
+                               #812, 19, Ojeongongeop-gil\r
+                               Uiwang-si  Gyeonggi-do  16072\r
+                               KR\r
+\r
+B8-48-AA   (hex)               EM Microelectronic\r
+B848AA     (base 16)           EM Microelectronic\r
+                               Rue des Sors 3\r
+                               Marin-Epagnier  Neuchatel  2074\r
+                               CH\r
+\r
+D8-34-EE   (hex)               Stem Audio\r
+D834EE     (base 16)           Stem Audio\r
+                               2552 White Road, Suite A\r
+                               Irvine  CA  92614\r
+                               US\r
+\r
+F8-57-2E   (hex)               Core Brands, LLC\r
+F8572E     (base 16)           Core Brands, LLC\r
+                               5919 Sea Otter Place\r
+                               Carlsbad  CA  92010\r
+                               US\r
+\r
+00-1C-91   (hex)               Gefen LLC\r
+001C91     (base 16)           Gefen LLC\r
+                               5919 Sea Otter Place\r
+                               Carlsbad  CA  92010\r
+                               US\r
+\r
+24-4B-FE   (hex)               ASUSTek COMPUTER INC.\r
+244BFE     (base 16)           ASUSTek COMPUTER INC.\r
+                               15,Li-Te Rd., Peitou, Taipei 112, Taiwan\r
+                               Taipei  Taiwan  112\r
+                               TW\r
+\r
+7C-DD-E9   (hex)               ATOM tech Inc.\r
+7CDDE9     (base 16)           ATOM tech Inc.\r
+                               Sky Menor Yokohama 422, 2-11-2 Takashima, Nishi-ku \r
+                               Yokohama-shi  Kanagawa  220-0011\r
+                               JP\r
+\r
+F8-6B-D9   (hex)               Cisco Systems, Inc\r
+F86BD9     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+C0-14-FE   (hex)               Cisco Systems, Inc\r
+C014FE     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+7C-AD-4F   (hex)               Cisco Systems, Inc\r
+7CAD4F     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+08-31-A4   (hex)               Huawei Device Co., Ltd.\r
+0831A4     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+A8-E9-78   (hex)               Huawei Device Co., Ltd.\r
+A8E978     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+F8-2F-65   (hex)               Huawei Device Co., Ltd.\r
+F82F65     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+28-B3-71   (hex)               Ruckus Wireless\r
+28B371     (base 16)           Ruckus Wireless\r
+                               350 West Java Drive\r
+                               Sunnyvale  CA  94089\r
+                               US\r
+\r
+08-AC-C4   (hex)               FMTech\r
+08ACC4     (base 16)           FMTech\r
+                               yuehai\r
+                               ShenZhen    518000\r
+                               CN\r
+\r
+DC-50-3A   (hex)               Nanjing Ticom Tech Co., Ltd.\r
+DC503A     (base 16)           Nanjing Ticom Tech Co., Ltd.\r
+                               No.35 Fenghui Road, Yuhuatai District\r
+                               Nanjing  Jiangsu  210039\r
+                               CN\r
+\r
+18-47-3D   (hex)               CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+18473D     (base 16)           CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+                               Building D21,No.1, East Zone 1st Road,Xiyong Town,Shapingba District\r
+                               Chongqing  Chongqing  401332\r
+                               CN\r
+\r
+D4-77-B2   (hex)               Netix Global B.V.\r
+D477B2     (base 16)           Netix Global B.V.\r
+                               1119RB Schipol - Rijk, Beechavenue, 113, Schipol,\r
+                               Amsterdam NL    1119\r
+                               NL\r
+\r
+70-B5-E8   (hex)               Dell Inc.\r
+70B5E8     (base 16)           Dell Inc.\r
+                               One Dell Way\r
+                               Round Rock  TX  78682\r
+                               US\r
+\r
+94-25-33   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+942533     (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
+60-56-61   (hex)               IXECLOUD Tech\r
+605661     (base 16)           IXECLOUD Tech\r
+                               118, 3rd Floor, Building 195, Area 1 Beiwa Road,Haidian District, Beijing\r
+                               Beijing    100000\r
+                               CN\r
+\r
+0C-59-9C   (hex)               Juniper Networks\r
+0C599C     (base 16)           Juniper Networks\r
+                               1133 Innovation Way\r
+                               Sunnyvale  CA  94089\r
+                               US\r
+\r
+44-F4-E7   (hex)               Cohesity Inc\r
+44F4E7     (base 16)           Cohesity Inc\r
+                               300 park ave\r
+                               san jose  CA  95110\r
+                               US\r
+\r
+70-69-79   (hex)               IEEE Registration Authority\r
+706979     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+FC-60-9B   (hex)               New H3C Technologies Co., Ltd\r
+FC609B     (base 16)           New H3C Technologies Co., Ltd\r
+                               466 Changhe Road, Binjiang District\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+E8-A1-F8   (hex)               zte corporation\r
+E8A1F8     (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
+98-A9-42   (hex)               Guangzhou Tozed Kangwei Intelligent Technology Co., LTD\r
+98A942     (base 16)           Guangzhou Tozed Kangwei Intelligent Technology Co., LTD\r
+                               Room 1301, NO. 37 Jinlong , Nansha Street, Xiangjiang Financial Business Center, Nansha District\r
+                               Guangzhou  Guangdong  511458\r
+                               CN\r
+\r
+30-42-40   (hex)               zte corporation\r
+304240     (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
+4C-21-13   (hex)               Nokia Shanghai Bell Co., Ltd.\r
+4C2113     (base 16)           Nokia Shanghai Bell Co., Ltd.\r
+                               No.388 Ning Qiao Road,Jin Qiao Pudong Shanghai\r
+                               Shanghai     201206\r
+                               CN\r
+\r
+80-2D-BF   (hex)               Cisco Systems, Inc\r
+802DBF     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+24-F1-50   (hex)               Guangzhou Qi'an Technology Co., Ltd.\r
+24F150     (base 16)           Guangzhou Qi'an Technology Co., Ltd.\r
+                               No. 3, Dasonggang, Jiangnan Avenue Middle Road, Haizhu District, Guangzhou (office only)\r
+                               Guangzhou  Guangdong  510220\r
+                               CN\r
+\r
+10-8B-6A   (hex)               Antailiye Technology Co.,Ltd\r
+108B6A     (base 16)           Antailiye Technology Co.,Ltd\r
+                               7/F,Zhengjiyuan Buiding,2 Road,Qianjing, Xixiang, Baoan District,Shenzhen\r
+                               SHEN ZHEN  GUANGDONG  518000\r
+                               CN\r
+\r
+14-C8-8B   (hex)               Apple, Inc.\r
+14C88B     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+EC-26-51   (hex)               Apple, Inc.\r
+EC2651     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+18-3E-EF   (hex)               Apple, Inc.\r
+183EEF     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+60-7E-C9   (hex)               Apple, Inc.\r
+607EC9     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+40-88-2F   (hex)               Extreme Networks, Inc.\r
+40882F     (base 16)           Extreme Networks, Inc.\r
+                               6480 Via Del Oro\r
+                               San Jose  CA  95119\r
+                               US\r
+\r
+E4-3D-1A   (hex)               Broadcom Limited\r
+E43D1A     (base 16)           Broadcom Limited\r
+                               15191 Alton Parkway\r
+                               Irvine  CA  92618\r
+                               US\r
+\r
+64-4C-36   (hex)               Intel Corporate\r
+644C36     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+48-89-E7   (hex)               Intel Corporate\r
+4889E7     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+24-EE-9A   (hex)               Intel Corporate\r
+24EE9A     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+5C-87-9C   (hex)               Intel Corporate\r
+5C879C     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+50-EB-71   (hex)               Intel Corporate\r
+50EB71     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+0C-DD-24   (hex)               Intel Corporate\r
+0CDD24     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+94-B8-6D   (hex)               Intel Corporate\r
+94B86D     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+20-16-B9   (hex)               Intel Corporate\r
+2016B9     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+38-BA-F8   (hex)               Intel Corporate\r
+38BAF8     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+3C-6A-A7   (hex)               Intel Corporate\r
+3C6AA7     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+34-E1-2D   (hex)               Intel Corporate\r
+34E12D     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+00-BB-60   (hex)               Intel Corporate\r
+00BB60     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+60-F6-77   (hex)               Intel Corporate\r
+60F677     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+A0-88-69   (hex)               Intel Corporate\r
+A08869     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+74-E5-F9   (hex)               Intel Corporate\r
+74E5F9     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+80-00-0B   (hex)               Intel Corporate\r
+80000B     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+34-41-5D   (hex)               Intel Corporate\r
+34415D     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+FC-77-74   (hex)               Intel Corporate\r
+FC7774     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+98-2C-BC   (hex)               Intel Corporate\r
+982CBC     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+3C-F0-11   (hex)               Intel Corporate\r
+3CF011     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+28-7F-CF   (hex)               Intel Corporate\r
+287FCF     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+80-32-53   (hex)               Intel Corporate\r
+803253     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+D8-C0-A6   (hex)               AzureWave Technology Inc.\r
+D8C0A6     (base 16)           AzureWave Technology Inc.\r
+                               8F., No. 94, Baozhong Rd.\r
+                               New Taipei City  Taiwan  231\r
+                               TW\r
+\r
+9C-FC-E8   (hex)               Intel Corporate\r
+9CFCE8     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+F8-AC-65   (hex)               Intel Corporate\r
+F8AC65     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+10-12-FB   (hex)               Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+1012FB     (base 16)           Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+                               No.555 Qianmo Road\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+08-FA-79   (hex)               vivo Mobile Communication Co., Ltd.\r
+08FA79     (base 16)           vivo Mobile Communication Co., Ltd.\r
+                               #283,BBK Road\r
+                               Wusha,Chang'An  DongGuan City,Guangdong,  523860\r
+                               CN\r
+\r
+F0-9B-B8   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+F09BB8     (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-17-B8   (hex)               Intel Corporate\r
+BC17B8     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+B8-CB-29   (hex)               Dell Inc.\r
+B8CB29     (base 16)           Dell Inc.\r
+                               One Dell Way\r
+                               Round Rock  TX  78682\r
+                               US\r
+\r
+44-BB-3B   (hex)               Google, Inc.\r
+44BB3B     (base 16)           Google, Inc.\r
+                               1600 Amphitheatre Parkway\r
+                               Mountain View  CA  94043\r
+                               US\r
+\r
+14-C1-4E   (hex)               Google, Inc.\r
+14C14E     (base 16)           Google, Inc.\r
+                               1600 Amphitheatre Parkway\r
+                               Mountain View  CA  94043\r
+                               US\r
+\r
+8C-5E-BD   (hex)               Huawei Device Co., Ltd.\r
+8C5EBD     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+2C-A0-42   (hex)               Huawei Device Co., Ltd.\r
+2CA042     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+EC-C0-1B   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+ECC01B     (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
+98-44-CE   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+9844CE     (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
+CC-D0-83   (hex)               Aruba, a Hewlett Packard Enterprise Company\r
+CCD083     (base 16)           Aruba, a Hewlett Packard Enterprise Company\r
+                               3333 Scott Blvd\r
+                               Santa Clara  CA  95054\r
+                               US\r
+\r
+C0-83-C9   (hex)               Huawei Device Co., Ltd.\r
+C083C9     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+C0-1C-30   (hex)               Shenzhen WIFI-3L Technology Co.,Ltd\r
+C01C30     (base 16)           Shenzhen WIFI-3L Technology Co.,Ltd\r
+                               East 5 Floor,B Building, WeiHao Technology Park,Sunny Indusrtrial zone, Xili Town, Nanshan District\r
+                               Shenzhen  Guangdong  518055\r
+                               CN\r
+\r
+D8-C6-78   (hex)               MitraStar Technology Corp.\r
+D8C678     (base 16)           MitraStar Technology Corp.\r
+                               No. 6, Innovation Road II,\r
+                               Hsinchu    300\r
+                               TW\r
+\r
+44-1C-7F   (hex)               Motorola Mobility LLC, a Lenovo Company\r
+441C7F     (base 16)           Motorola Mobility LLC, a Lenovo Company\r
+                               222 West Merchandise Mart Plaza\r
+                               Chicago  IL  60654\r
+                               US\r
+\r
+00-B8-B6   (hex)               Motorola Mobility LLC, a Lenovo Company\r
+00B8B6     (base 16)           Motorola Mobility LLC, a Lenovo Company\r
+                               222 West Merchandise Mart Plaza\r
+                               Chicago  IL  60654\r
+                               US\r
+\r
+1C-E6-1D   (hex)               Samsung Electronics Co.,Ltd\r
+1CE61D     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+80-12-DF   (hex)               Shenzhen SuperElectron Technology Co.,Ltd.\r
+8012DF     (base 16)           Shenzhen SuperElectron Technology Co.,Ltd.\r
+                               1213-1214, haosheng business center, dongbin road, nanshan street, nanshan district, shenzhen city\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+C4-A1-51   (hex)               Sichuan Tianyi Comheart Telecom Co., Ltd.\r
+C4A151     (base 16)           Sichuan Tianyi Comheart Telecom Co., Ltd.\r
+                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+                               Chengdu  Sichuan  611330\r
+                               CN\r
+\r
+10-E7-7A   (hex)               STMicrolectronics International NV\r
+10E77A     (base 16)           STMicrolectronics International NV\r
+                               39, Chemin du Champ-des-Filles\r
+                                Geneva, Plan-les-Quates    1228\r
+                               CH\r
+\r
+80-EA-07   (hex)               TP-LINK TECHNOLOGIES CO.,LTD.\r
+80EA07     (base 16)           TP-LINK TECHNOLOGIES CO.,LTD.\r
+                               Building 24(floors 1,3,4,5)and 28(floors 1-4)Central Science and Technology Park,Shennan Road,Nanshan\r
+                               Shenzhen  Guangdong  518057\r
+                               CN\r
+\r
+BC-03-A7   (hex)               MFP MICHELIN\r
+BC03A7     (base 16)           MFP MICHELIN\r
+                               23 place des Carmes Dechaux\r
+                               Clermont-Ferrand    63000\r
+                               FR\r
+\r
+90-76-9F   (hex)               SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.\r
+90769F     (base 16)           SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.\r
+                               3/F, Building R1-B, High-Tech Industrial Park, Nanshan District\r
+                               Shenzhen  Guangdong  518057\r
+                               CN\r
+\r
+98-2F-F8   (hex)               Huawei Device Co., Ltd.\r
+982FF8     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+40-DC-A5   (hex)               Huawei Device Co., Ltd.\r
+40DCA5     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+2C-6F-51   (hex)               Herospeed Digital Technology Limited\r
+2C6F51     (base 16)           Herospeed Digital Technology Limited\r
+                               728 Kaichuang Avenue,Huangpu Distric\r
+                               Guangzhou  Guangdong  510530\r
+                               CN\r
+\r
+04-A2-F3   (hex)               Fiberhome Telecommunication Technologies Co.,LTD\r
+04A2F3     (base 16)           Fiberhome Telecommunication Technologies Co.,LTD\r
+                               No.5 DongXin Road\r
+                               Wuhan  Hubei  430074\r
+                               CN\r
+\r
+CC-DB-93   (hex)               Cisco Systems, Inc\r
+CCDB93     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+18-D6-1C   (hex)               Shenzhen TINNO Mobile Technology Corp.\r
+18D61C     (base 16)           Shenzhen TINNO Mobile Technology Corp.\r
+                               4/F, H-3 Building, Qiao Cheng Eastern Industrial Park, Overseas Chinese Town, Shenzhen \r
+                               Shenzhen   guangdong  518053\r
+                               CN\r
+\r
+54-48-E6   (hex)               Beijing Xiaomi Mobile Software Co., Ltd\r
+5448E6     (base 16)           Beijing Xiaomi Mobile Software Co., Ltd\r
+                               Xiaomi Campus, No. 33 Xi erqi Middle Road, Haidian District\r
+                               Beijing  Beijing  100085\r
+                               CN\r
+\r
+60-D4-E9   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+60D4E9     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+                               NO.18 HAIBIN ROAD,\r
+                               DONG GUAN  GUANG DONG  523860\r
+                               CN\r
+\r
+30-C5-0F   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+30C50F     (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
+28-68-D2   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+2868D2     (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-A9-35   (hex)               JWEntertainment\r
+90A935     (base 16)           JWEntertainment\r
+                               3f 10 Dwitgol-ro\r
+                               Gwacheon-si  Gyeonggi-do  13814\r
+                               KR\r
+\r
+A4-86-AE   (hex)               Quectel Wireless Solutions Co., Ltd.\r
+A486AE     (base 16)           Quectel Wireless Solutions Co., Ltd.\r
+                               No.1801 Hongmei Road, Xuhui District\r
+                               Shanghai    200233\r
+                               CN\r
+\r
+1C-D6-BE   (hex)               Wistron Neweb Corporation\r
+1CD6BE     (base 16)           Wistron Neweb Corporation\r
+                               No.20,Park Avenue II,Hsinchu Science Park\r
+                               Hsin-Chu  R.O.C.  308\r
+                               TW\r
+\r
+28-D1-27   (hex)               Beijing Xiaomi Mobile Software Co., Ltd\r
+28D127     (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
+C8-68-DE   (hex)               Huawei Device Co., Ltd.\r
+C868DE     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+D0-0D-F7   (hex)               Huawei Device Co., Ltd.\r
+D00DF7     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+48-05-E2   (hex)               Huawei Device Co., Ltd.\r
+4805E2     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+F8-1B-04   (hex)               Zhong Shan City Richsound Electronic Industrial Ltd\r
+F81B04     (base 16)           Zhong Shan City Richsound Electronic Industrial Ltd\r
+                               Qunle Industrial Area,East ShaGang Road,GangKou ZhongShan,GuangDong,China\r
+                               ZhongShan  GuangDong  528400\r
+                               CN\r
+\r
+D8-8C-79   (hex)               Google, Inc.\r
+D88C79     (base 16)           Google, Inc.\r
+                               1600 Amphitheatre Parkway\r
+                               Mountain View  CA  94043\r
+                               US\r
+\r
+10-34-1B   (hex)               Spacelink\r
+10341B     (base 16)           Spacelink\r
+                               8830 Complex dr\r
+                               San Diego  CA  92123\r
+                               US\r
+\r
+30-A4-52   (hex)               Arrival Elements BV\r
+30A452     (base 16)           Arrival Elements BV\r
+                               M. Keynesplein 12-46\r
+                               Amsterdam    1066 EP\r
+                               NL\r
+\r
+00-1E-68   (hex)               Quanta Computer Inc.\r
+001E68     (base 16)           Quanta Computer Inc.\r
+                               NO. 211, WEN HWA 2RD., KUEI SHAN HSIANG\r
+                               TAIPEI  TAO YUAN SHIEN  333\r
+                               TW\r
+\r
+00-23-8B   (hex)               Quanta Computer Inc.\r
+00238B     (base 16)           Quanta Computer Inc.\r
+                               NO. 211, WEN HWA 2RD.,KUEI SHAN HSIANG, TAO YUAN SHIEN,\r
+                               TAIPEI  TAIWAN  333\r
+                               TW\r
+\r
+2C-60-0C   (hex)               Quanta Computer Inc.\r
+2C600C     (base 16)           Quanta Computer Inc.\r
+                               No.211, Wen Hwa 2nd Rd\r
+                               Taoyuan  Taiwan  33377\r
+                               TW\r
+\r
+8C-C5-B4   (hex)               Sagemcom Broadband SAS\r
+8CC5B4     (base 16)           Sagemcom Broadband SAS\r
+                               250, route de l'Empereur\r
+                               Rueil Malmaison Cedex  hauts de seine  92848\r
+                               FR\r
+\r
+00-0B-A2   (hex)               Sumitomo Electric Industries, Ltd\r
+000BA2     (base 16)           Sumitomo Electric Industries, Ltd\r
+                               1-1-3, Shimaya, Konohana-ku\r
+                               Osaka    554-0024\r
+                               JP\r
+\r
+00-08-F6   (hex)               Sumitomo Electric Industries, Ltd\r
+0008F6     (base 16)           Sumitomo Electric Industries, Ltd\r
+                               1-1-3, Shimaya, Konohana-ku\r
+                               Osaka    554-0024\r
+                               JP\r
+\r
+00-00-5F   (hex)               Sumitomo Electric Industries, Ltd\r
+00005F     (base 16)           Sumitomo Electric Industries, Ltd\r
+                               1-1-3, Shimaya, Konohana-ku\r
+                               Osaka    554-0024\r
+                               JP\r
+\r
+18-EC-E7   (hex)               BUFFALO.INC\r
+18ECE7     (base 16)           BUFFALO.INC\r
+                               AKAMONDORI Bld.,30-20,Ohsu 3-chome,Naka-ku\r
+                               Nagoya  Aichi Pref.  460-8315\r
+                               JP\r
+\r
+F4-69-D5   (hex)               IEEE Registration Authority\r
+F469D5     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+08-3A-F2   (hex)               Espressif Inc.\r
+083AF2     (base 16)           Espressif Inc.\r
+                               Room 204, Building 2, 690 Bibo Rd, Pudong New Area\r
+                               Shanghai  Shanghai  201203\r
+                               CN\r
+\r
+74-3A-20   (hex)               New H3C Technologies Co., Ltd\r
+743A20     (base 16)           New H3C Technologies Co., Ltd\r
+                               466 Changhe Road, Binjiang District\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+30-C9-AB   (hex)               CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.\r
+30C9AB     (base 16)           CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.\r
+                               B22 Building,NO.51 Tongle Road, Shajing Town, Jiangnan District, Nanning, Guangxi Province, China\r
+                               Nanning  Guangxi  530007\r
+                               CN\r
+\r
+3C-1A-9E   (hex)               VitalThings AS\r
+3C1A9E     (base 16)           VitalThings AS\r
+                               Jarlsoveien 48\r
+                               Tonsberg    3124\r
+                               NO\r
+\r
+C4-D7-38   (hex)               Huawei Device Co., Ltd.\r
+C4D738     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+C8-84-A1   (hex)               Cisco Systems, Inc\r
+C884A1     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+D8-77-8B   (hex)               Intelbras\r
+D8778B     (base 16)           Intelbras\r
+                               BR 101, KM 210\r
+                               São Jose  Santa Catarina  88104-800\r
+                               BR\r
+\r
+00-03-E8   (hex)               Wavesight Limited\r
+0003E8     (base 16)           Wavesight Limited\r
+                               13 Dencora Way\r
+                               Luton  Sundon Business Park  LU3 3HP\r
+                               GB\r
+\r
+6C-BA-B8   (hex)               Sagemcom Broadband SAS\r
+6CBAB8     (base 16)           Sagemcom Broadband SAS\r
+                               250, route de l'Empereur\r
+                               Rueil Malmaison Cedex  hauts de seine  92848\r
+                               FR\r
+\r
+E0-D4-64   (hex)               Intel Corporate\r
+E0D464     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+C0-F6-C2   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+C0F6C2     (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
+D4-AF-F7   (hex)               Arista Networks\r
+D4AFF7     (base 16)           Arista Networks\r
+                               5453 Great America Parkway\r
+                               Santa Clara  CA  95054\r
+                               US\r
+\r
+60-07-7C   (hex)               Jala Group\r
+60077C     (base 16)           Jala Group\r
+                               Melchor Pérez de Holguín N 2643\r
+                               Cochabamba  Cochabamba  0000\r
+                               BO\r
+\r
+60-98-66   (hex)               Texas Instruments\r
+609866     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+04-7E-23   (hex)               China Mobile IOT Company Limited\r
+047E23     (base 16)           China Mobile IOT Company Limited\r
+                               NO.8 Yu Ma Road, NanAn Area\r
+                               Chongqing  Chongqing  401336\r
+                               CN\r
+\r
+14-CC-B3   (hex)               AO GK NATEKS\r
+14CCB3     (base 16)           AO GK NATEKS\r
+                               Kamenshiki B. str., 4\r
+                               Moscow    115172\r
+                               RU\r
+\r
+DC-CD-2F   (hex)               Seiko Epson Corporation\r
+DCCD2F     (base 16)           Seiko Epson Corporation\r
+                               2070 Kotobuki Koaka\r
+                               Matsumoto-shi  Nagano-ken  399-8702\r
+                               JP\r
+\r
+94-54-CE   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+9454CE     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+                               NO.18 HAIBIN ROAD,\r
+                               DONG GUAN  GUANG DONG  523860\r
+                               CN\r
+\r
+38-8A-BE   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+388ABE     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+                               NO.18 HAIBIN ROAD,\r
+                               DONG GUAN  GUANG DONG  523860\r
+                               CN\r
+\r
+68-93-20   (hex)               New H3C Technologies Co., Ltd\r
+689320     (base 16)           New H3C Technologies Co., Ltd\r
+                               466 Changhe Road, Binjiang District\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+54-84-DC   (hex)               zte corporation\r
+5484DC     (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
+38-54-9B   (hex)               zte corporation\r
+38549B     (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
+8C-8D-28   (hex)               Intel Corporate\r
+8C8D28     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+34-3E-A4   (hex)               Ring LLC\r
+343EA4     (base 16)           Ring LLC\r
+                               1523 26th St\r
+                               Santa Monica  CA  90404\r
+                               US\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
+                               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
 F8-D0-27   (hex)               Seiko Epson Corporation\r
 F8D027     (base 16)           Seiko Epson Corporation\r
                                2070 Kotobuki Koaka\r
@@ -99503,12 +101360,6 @@ F8D027     (base 16)          Seiko Epson Corporation
                                Hsinchu    30077\r
                                TW\r
 \r
-24-41-8C   (hex)               Intel Corporate\r
-24418C     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 44-EF-BF   (hex)               China Dragon Technology Limited\r
 44EFBF     (base 16)           China Dragon Technology Limited\r
                                B4 Bldg.Haoshan 1st Industry Park,\r
@@ -99539,12 +101390,6 @@ D81265     (base 16)          CHONGQING FUGUI ELECTRONICS CO.,LTD.
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-60-F2-62   (hex)               Intel Corporate\r
-60F262     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 EC-3C-BB   (hex)               Huawei Device Co., Ltd.\r
 EC3CBB     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
@@ -100130,12 +101975,6 @@ ACF5E6     (base 16)         Cisco Systems, Inc
                                San Jose  CA  94568\r
                                US\r
 \r
-58-A0-23   (hex)               Intel Corporate\r
-58A023     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 DC-B0-82   (hex)               Nokia\r
 DCB082     (base 16)           Nokia\r
                                600 March Road\r
@@ -100178,12 +102017,6 @@ BC9FE4     (base 16)         Aruba, a Hewlett Packard Enterprise Company
                                Nürnberg  Bayern  90478\r
                                DE\r
 \r
-D4-D2-52   (hex)               Intel Corporate\r
-D4D252     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 AC-A4-6E   (hex)               SHENZHEN GONGJIN ELECTRONICS CO.,LT\r
 ACA46E     (base 16)           SHENZHEN GONGJIN ELECTRONICS CO.,LT\r
                                SONGGANG\r
@@ -100328,12 +102161,6 @@ CC37AB     (base 16)         Edgecore Networks Corporation
                                Hsinchu  Hsinchu  30077\r
                                TW\r
 \r
-90-78-41   (hex)               Intel Corporate\r
-907841     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 14-22-DB   (hex)               eero inc.\r
 1422DB     (base 16)           eero inc.\r
                                230 9th St.\r
@@ -100724,12 +102551,6 @@ E458E7     (base 16)         Samsung Electronics Co.,Ltd
                                Salt Lake City  UT  84115\r
                                US\r
 \r
-38-00-25   (hex)               Intel Corporate\r
-380025     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 D0-58-C0   (hex)               Qingdao Haier Multimedia Limited. \r
 D058C0     (base 16)           Qingdao Haier Multimedia Limited. \r
                                Pingban Building, Haier Industry Park, Laoshan District,\r
@@ -100856,12 +102677,6 @@ ECC57F     (base 16)         Suzhou Pairlink Network Technology
                                Suzhou  Jiangsu  215011\r
                                CN\r
 \r
-A8-6D-AA   (hex)               Intel Corporate\r
-A86DAA     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 38-C2-BA   (hex)               CCTV NEOTECH\r
 38C2BA     (base 16)           CCTV NEOTECH\r
                                68, Digital-ro 9-gil, Geumcheon-gu\r
@@ -101162,12 +102977,6 @@ B40B78     (base 16)         Brusa Elektronik AG
                                Sennwald  St. Gallen  9466\r
                                CH\r
 \r
-20-79-18   (hex)               Intel Corporate\r
-207918     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 C0-3D-D9   (hex)               MitraStar Technology Corp.\r
 C03DD9     (base 16)           MitraStar Technology Corp.\r
                                No. 6, Innovation Road II,\r
@@ -101357,18 +103166,6 @@ B8599F     (base 16)         Mellanox Technologies, Inc.
                                Sunnyvale  CA  94085\r
                                US\r
 \r
-A0-A4-C5   (hex)               Intel Corporate\r
-A0A4C5     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
-F4-D1-08   (hex)               Intel Corporate\r
-F4D108     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 30-13-89   (hex)               Siemens AG, Automations & Drives,\r
 301389     (base 16)           Siemens AG, Automations & Drives,\r
                                Systems Engineering\r
@@ -101453,18 +103250,6 @@ F063F9     (base 16)         HUAWEI TECHNOLOGIES CO.,LTD
                                Ohta-ku  Tokyo  146-8501\r
                                JP\r
 \r
-18-1D-EA   (hex)               Intel Corporate\r
-181DEA     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
-18-56-80   (hex)               Intel Corporate\r
-185680     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 C8-D9-D2   (hex)               Hewlett Packard\r
 C8D9D2     (base 16)           Hewlett Packard\r
                                11445 Compaq Center Drive\r
@@ -101741,12 +103526,6 @@ A85AF3     (base 16)         Shanghai Siflower Communication Technology Co., Ltd
                                Tel Aviv  Israel  6971072\r
                                IL\r
 \r
-64-5D-86   (hex)               Intel Corporate\r
-645D86     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 0C-96-E6   (hex)               Cloud Network Technology (Samoa) Limited\r
 0C96E6     (base 16)           Cloud Network Technology (Samoa) Limited\r
                                Building D21,No.1, East Zone 1st Road,Xiyong Town,Shapingba District\r
@@ -102569,12 +104348,6 @@ E8FAF7     (base 16)         Guangdong Uniteddata Holding Group Co., Ltd.
                                San Jose  CA  94568\r
                                US\r
 \r
-04-D3-B0   (hex)               Intel Corporate\r
-04D3B0     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 64-5A-ED   (hex)               Apple, Inc.\r
 645AED     (base 16)           Apple, Inc.\r
                                1 Infinite Loop\r
@@ -103187,12 +104960,6 @@ C8458F     (base 16)         Wyler AG
                                Seoul    152-866\r
                                KR\r
 \r
-E4-A7-A0   (hex)               Intel Corporate\r
-E4A7A0     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 0C-52-03   (hex)               AGM GROUP LIMITED\r
 0C5203     (base 16)           AGM GROUP LIMITED\r
                                4F,Building B,HuaFeng Ind park,Gushu,Xixiang,BaoAn,ShenZhen,China\r
@@ -103607,12 +105374,6 @@ F4F3AA     (base 16)         JBL GmbH & Co. KG
                                Neuhofen    67141\r
                                DE\r
 \r
-40-A3-CC   (hex)               Intel Corporate\r
-40A3CC     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 90-50-CA   (hex)               Hitron Technologies. Inc\r
 9050CA     (base 16)           Hitron Technologies. Inc\r
                                No. 1-8, Lising 1st Rd. Hsinchu Science Park, Hsinchu, 300, Taiwan, R.O.C\r
@@ -103733,12 +105494,6 @@ D8DECE     (base 16)         ISUNG CO.,LTD
                                Siheung-si  Kyunggido  429-859\r
                                KR\r
 \r
-80-19-34   (hex)               Intel Corporate\r
-801934     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 70-3E-AC   (hex)               Apple, Inc.\r
 703EAC     (base 16)           Apple, Inc.\r
                                1 Infinite Loop\r
@@ -103859,12 +105614,6 @@ CC2F71     (base 16)         Intel Corporate
                                Dallas  TX  75243\r
                                US\r
 \r
-64-32-A8   (hex)               Intel Corporate\r
-6432A8     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 74-7D-24   (hex)               Phicomm (Shanghai) Co., Ltd.\r
 747D24     (base 16)           Phicomm (Shanghai) Co., Ltd.\r
                                3666 SiXian Rd.,Songjiang District\r
@@ -106313,12 +108062,6 @@ B437D1     (base 16)         IEEE Registration Authority
                                SANTA CLARA  CA  95054\r
                                US\r
 \r
-54-AB-3A   (hex)               QUANTA COMPUTER INC.\r
-54AB3A     (base 16)           QUANTA COMPUTER INC.\r
-                               No.211, Wen Hwa 2nd Rd., Kuei Shan Hsiang, Tao Yuan Shien, Taiwan, R. O. C.\r
-                               Taoyuan  Taiwan  33377\r
-                               TW\r
-\r
 68-35-63   (hex)               SHENZHEN LIOWN ELECTRONICS CO.,LTD.\r
 683563     (base 16)           SHENZHEN LIOWN ELECTRONICS CO.,LTD.\r
                                ROOM 301, NO.7, GONGYE 3RD ROAD\r
@@ -106355,12 +108098,6 @@ B437D1     (base 16)         IEEE Registration Authority
                                TSAOTUEN,  NANTOU  54261\r
                                TW\r
 \r
-E8-9A-8F   (hex)               QUANTA COMPUTER INC.\r
-E89A8F     (base 16)           QUANTA COMPUTER INC.\r
-                               211, Wen Hwa 2nd Rd.,Kuei Shan, Tao Yuan \r
-                               TAIPEI    33377\r
-                               TW\r
-\r
 1C-57-D8   (hex)               Kraftway Corporation PLC\r
 1C57D8     (base 16)           Kraftway Corporation PLC\r
                                16, 3rd Mytischinskaya st.\r
@@ -106769,12 +108506,6 @@ FCA89A     (base 16)         Sunitec Enterprise Co.,Ltd
                                Heidelberg    69123\r
                                DE\r
 \r
-C8-3D-FC   (hex)               Pioneer DJ Corporation\r
-C83DFC     (base 16)           Pioneer DJ Corporation\r
-                               6F,Yokohama i-Mark Place, 4-4-5 Minatomirai, Nishi-ku\r
-                               Yokohama  Kanagawa  220-0012\r
-                               JP\r
-\r
 CC-D3-1E   (hex)               IEEE Registration Authority\r
 CCD31E     (base 16)           IEEE Registration Authority\r
                                445 Hoes Lane\r
@@ -111950,12 +113681,6 @@ EC2E4E     (base 16)         HITACHI-LG DATA STORAGE INC
                                TOKYO  TOKYO  108-0022\r
                                JP\r
 \r
-D4-67-61   (hex)               United Gulf Gate Co.\r
-D46761     (base 16)           United Gulf Gate Co.\r
-                               XonTel, Borj ALadel Tower, Fahad Al-Salem St Fl 21\r
-                               Kuwait    0000\r
-                               KW\r
-\r
 34-81-C4   (hex)               AVM GmbH\r
 3481C4     (base 16)           AVM GmbH\r
                                Alt-Moabit 95\r
@@ -114422,12 +116147,6 @@ F85063     (base 16)         Verathon
                                Bothell  WA  98011\r
                                US\r
 \r
-F0-D1-4F   (hex)               LINEAR LLC\r
-F0D14F     (base 16)           LINEAR LLC\r
-                               1950 CAMINO VIDA ROBLE #150\r
-                               CARLSBAD  CA  92008-6517\r
-                               US\r
-\r
 2C-36-F8   (hex)               Cisco Systems, Inc\r
 2C36F8     (base 16)           Cisco Systems, Inc\r
                                80 West Tasman Drive\r
@@ -119318,12 +121037,6 @@ A07332     (base 16)         Cashmaster International Limited
                                Kaohsiung    811\r
                                TW\r
 \r
-00-1E-B2   (hex)               LG innotek\r
-001EB2     (base 16)           LG innotek\r
-                               Hanyang Univ. 1271, Sa-dong, Sangrok-gu\r
-                               Ansan-si  Gyeonggi-do  426-791\r
-                               KR\r
-\r
 00-1E-B7   (hex)               TBTech, Co., Ltd.\r
 001EB7     (base 16)           TBTech, Co., Ltd.\r
                                1109, Hyundai Krim, 1330-18, Seocho-dong,\r
@@ -119450,12 +121163,6 @@ A07332     (base 16)         Cashmaster International Limited
                                SEOUL    153-803\r
                                KR\r
 \r
-00-1E-31   (hex)               INFOMARK CO.,LTD.\r
-001E31     (base 16)           INFOMARK CO.,LTD.\r
-                               5F.,Geown Bldg.,1360-53\r
-                               Seoul  Seocho-dong,Seocho-gu  137-863\r
-                               KR\r
-\r
 00-1E-2C   (hex)               CyVerse Corporation\r
 001E2C     (base 16)           CyVerse Corporation\r
                                Shoutou Roukubankan Bldg. 4F\r
@@ -122462,12 +124169,6 @@ A07332     (base 16)         Cashmaster International Limited
                                Bingley    BD16 1PY\r
                                GB\r
 \r
-00-12-B4   (hex)               Work Microwave GmbH\r
-0012B4     (base 16)           Work Microwave GmbH\r
-                               Raiffeisenstrasse 12\r
-                               Holzkirchen    83607\r
-                               DE\r
-\r
 00-12-ED   (hex)               AVG Advanced Technologies\r
 0012ED     (base 16)           AVG Advanced Technologies\r
                                4140 Utica Ridge Road\r
@@ -122912,12 +124613,6 @@ A07332     (base 16)         Cashmaster International Limited
                                Alexandria  Virginia  22307\r
                                US\r
 \r
-00-11-68   (hex)               HomeLogic LLC\r
-001168     (base 16)           HomeLogic LLC\r
-                               100 Hoods Lane\r
-                               Marblehead  MA  01945\r
-                               US\r
-\r
 00-11-63   (hex)               SYSTEM SPA DEPT. ELECTRONICS\r
 001163     (base 16)           SYSTEM SPA DEPT. ELECTRONICS\r
                                VIA GHIAROLA VECCHIA 73\r
@@ -130139,12 +131834,6 @@ A06A00     (base 16)         Verilink Corporation
                                    \r
                                TW\r
 \r
-00-40-AB   (hex)               ROLAND DG CORPORATION\r
-0040AB     (base 16)           ROLAND DG CORPORATION\r
-                               1227 OKUBO-CHO, HAMAMATSU-SHI\r
-                                 432  \r
-                               JP\r
-\r
 00-40-B6   (hex)               COMPUTERM  CORPORATION\r
 0040B6     (base 16)           COMPUTERM  CORPORATION\r
                                111 WOOD STREET\r
@@ -131105,18 +132794,6 @@ D8A315     (base 16)         vivo Mobile Communication Co., Ltd.
                                Redondo Beach    90277\r
                                US\r
 \r
-C0-B8-83   (hex)               Intel Corporate\r
-C0B883     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
-24-FD-0D   (hex)               INDÚSTRIA DE TELECOMUNICAÇÃO ELETRÔNICA\r
-24FD0D     (base 16)           INDÚSTRIA DE TELECOMUNICAÇÃO ELETRÔNICA\r
-                               BR 101, KM 210\r
-                               São Jose  Santa Catarina  88104-800\r
-                               BR\r
-\r
 70-F8-2B   (hex)               DWnet Technologies(Suzhou) Corporation\r
 70F82B     (base 16)           DWnet Technologies(Suzhou) Corporation\r
                                No.8,Tangzhuang Road, Suzhou Industrial Park, Jiangsu, China\r
@@ -131213,12 +132890,6 @@ ACBD70     (base 16)         Huawei Device Co., Ltd.
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-C8-09-A8   (hex)               Intel Corporate\r
-C809A8     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 C0-2E-26   (hex)               Private\r
 C02E26     (base 16)           Private\r
 \r
@@ -131672,12 +133343,6 @@ C8C750     (base 16)         Motorola Mobility LLC, a Lenovo Company
                                New Taipei City  Taiwan  231\r
                                TW\r
 \r
-8C-C6-81   (hex)               Intel Corporate\r
-8CC681     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 34-E3-DA   (hex)               Hoval Aktiengesellschaft\r
 34E3DA     (base 16)           Hoval Aktiengesellschaft\r
                                Austrasse 70\r
@@ -131828,18 +133493,6 @@ D0D3E0     (base 16)         Aruba, a Hewlett Packard Enterprise Company
                                Santa Clara  CA  95054\r
                                US\r
 \r
-3C-58-C2   (hex)               Intel Corporate\r
-3C58C2     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
-CC-F9-E4   (hex)               Intel Corporate\r
-CCF9E4     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 64-5C-F3   (hex)               ParanTek Inc.\r
 645CF3     (base 16)           ParanTek Inc.\r
                                3F, 40-15 Gilju-Ro, 411 Beon-Gil\r
@@ -131870,12 +133523,6 @@ FC3964     (base 16)         ITEL MOBILE LIMITED
                                Hong Kong  KOWLOON  999077\r
                                HK\r
 \r
-E4-5E-37   (hex)               Intel Corporate\r
-E45E37     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 14-47-2D   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
 14472D     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
                                NO.18 HAIBIN ROAD,\r
@@ -132056,12 +133703,6 @@ CC418E     (base 16)         MSA Innovation
                                Cranberry Township  PA  16066\r
                                US\r
 \r
-6C-6A-77   (hex)               Intel Corporate\r
-6C6A77     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 CC-A7-C1   (hex)               Google, Inc.\r
 CCA7C1     (base 16)           Google, Inc.\r
                                1600 Amphitheatre Parkway\r
@@ -132176,12 +133817,6 @@ D422CD     (base 16)         Xsens Technologies B.V.
                                Enschede    7521 PR\r
                                NL\r
 \r
-A4-B1-C1   (hex)               Intel Corporate\r
-A4B1C1     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 C8-67-5E   (hex)               Extreme Networks, Inc.\r
 C8675E     (base 16)           Extreme Networks, Inc.\r
                                1011 McCarthy Blvd\r
@@ -132374,11 +134009,11 @@ CCBE59     (base 16)                Calix Inc.
                                San Jose  CA  95131\r
                                US\r
 \r
-24-68-B0   (hex)               Samsung Electronics Co.,Ltd\r
-2468B0     (base 16)           Samsung Electronics Co.,Ltd\r
-                               #94-1, Imsoo-Dong\r
-                               Gumi  Gyeongbuk  730-350\r
-                               KR\r
+84-A3-B5   (hex)               Propulsion systems\r
+84A3B5     (base 16)           Propulsion systems\r
+                               Dooren 72\r
+                               Merchtem  Vlaams brabant  1785\r
+                               BE\r
 \r
 30-FC-EB   (hex)               LG Electronics (Mobile Communications)\r
 30FCEB     (base 16)           LG Electronics (Mobile Communications)\r
@@ -132386,30 +134021,981 @@ CCBE59     (base 16)               Calix Inc.
                                Seoul    153-801\r
                                KR\r
 \r
+24-68-B0   (hex)               Samsung Electronics Co.,Ltd\r
+2468B0     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
 1C-13-38   (hex)               Kimball Electronics Group, LLC\r
 1C1338     (base 16)           Kimball Electronics Group, LLC\r
                                1205 Kimball Blvd\r
                                Jasper  IN  47546\r
                                US\r
 \r
+9C-ED-FA   (hex)               EVUlution AG\r
+9CEDFA     (base 16)           EVUlution AG\r
+                               Via da Clalt 12\r
+                               Poschiavo  GR  7742\r
+                               CH\r
+\r
 EC-63-ED   (hex)               Hyundai Autoever Corp.\r
 EC63ED     (base 16)           Hyundai Autoever Corp.\r
                                38, Teheran-ro 114-gil\r
                                Gangnam-gu, Seoul    06176\r
                                KR\r
 \r
-84-A3-B5   (hex)               Propulsion systems\r
-84A3B5     (base 16)           Propulsion systems\r
-                               Dooren 72\r
-                               Merchtem  Vlaams brabant  1785\r
-                               BE\r
+D4-67-61   (hex)               XonTel Technology Co.\r
+D46761     (base 16)           XonTel Technology Co.\r
+                               XonTel, Borj ALadel Tower, Fahad Al-Salem St Fl 21\r
+                               Kuwait    0000\r
+                               KW\r
 \r
-9C-ED-FA   (hex)               EVUlution AG\r
-9CEDFA     (base 16)           EVUlution AG\r
-                               Via da Clalt 12\r
-                               Poschiavo  GR  7742\r
+E4-41-22   (hex)               OnePlus Technology (Shenzhen) Co., Ltd\r
+E44122     (base 16)           OnePlus Technology (Shenzhen) Co., Ltd\r
+                               18C02, 18C03, 18C04 ,18C05,TAIRAN BUILDING,\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+9C-19-C2   (hex)               Dongguan Liesheng Electronic Co., Ltd.\r
+9C19C2     (base 16)           Dongguan Liesheng Electronic Co., Ltd.\r
+                               F5, Building B, North Block, Gaosheng Tech Park, No. 84 Zhongli Road, Nancheng District, Dongguan Ci\r
+                               dongguan   guangdong  523000\r
+                               CN\r
+\r
+BC-26-A1   (hex)               FACTORY FIVE Corporation\r
+BC26A1     (base 16)           FACTORY FIVE Corporation\r
+                               3-391-1, Kamikitadai,\r
+                                Higashiyamato  Tokyo  207-0023\r
+                               JP\r
+\r
+74-CB-F3   (hex)               Lava international limited\r
+74CBF3     (base 16)           Lava international limited\r
+                               A-154D, Sector-63\r
+                               Noida  Uttar Pradesh  201301\r
+                               IN\r
+\r
+F0-D1-4F   (hex)               LINEAR LLC\r
+F0D14F     (base 16)           LINEAR LLC\r
+                               5919 Sea Otter Place\r
+                               Carlsbad  CA  92010\r
+                               US\r
+\r
+00-11-68   (hex)               HomeLogic LLC\r
+001168     (base 16)           HomeLogic LLC\r
+                               5919 Sea Otter Place\r
+                               Carlsbad  CA  92010\r
+                               US\r
+\r
+18-DF-C1   (hex)               Aetheros\r
+18DFC1     (base 16)           Aetheros\r
+                               909 Montgomery Street, Suite 104\r
+                               San Francisco    94133\r
+                               US\r
+\r
+FC-BC-0E   (hex)               Zhejiang Cainiao Supply Chain Management Co., Ltd\r
+FCBC0E     (base 16)           Zhejiang Cainiao Supply Chain Management Co., Ltd\r
+                               Block B1, XIXI center, No.588 West Wenyi Road, Xihu District\r
+                               Hangzhou  Zhejiang  310000\r
+                               CN\r
+\r
+2C-D0-66   (hex)               Xiaomi Communications Co Ltd\r
+2CD066     (base 16)           Xiaomi Communications Co Ltd\r
+                               The Rainbow City of China Resources\r
+                               NO.68, Qinghe Middle Street  Haidian District, Beijing  100085\r
+                               CN\r
+\r
+B0-5C-DA   (hex)               HP Inc.\r
+B05CDA     (base 16)           HP Inc.\r
+                               10300 Energy Dr\r
+                               Spring  TX  77389\r
+                               US\r
+\r
+DC-BD-7A   (hex)               Guangzhou Shiyuan Electronic Technology Company Limited\r
+DCBD7A     (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
+90-16-BA   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+9016BA     (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
+60-AA-EF   (hex)               Huawei Device Co., Ltd.\r
+60AAEF     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+D0-F3-F5   (hex)               Huawei Device Co., Ltd.\r
+D0F3F5     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+D4-46-49   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+D44649     (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
+94-00-B0   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+9400B0     (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-79-EF   (hex)               Greenpacket Berhad, Taiwan\r
+2479EF     (base 16)           Greenpacket Berhad, Taiwan\r
+                               B-23A-3, The Ascent Paradigm, No. 1, Jalan SS7/26A, Kelana Jaya, 47301 Petaling Jaya\r
+                               Petaling Jaya  Selangor  47301\r
+                               MY\r
+\r
+AC-23-34   (hex)               Infinix mobility limited\r
+AC2334     (base 16)           Infinix mobility limited\r
+                               RMS 05-15, 13A/F SOUTH TOWER WORLD FINANCE CTR HARBOUR CITY 17 CANTON RD TST KLN HONG KONG\r
+                               HongKong  HongKong  999077\r
+                               HK\r
+\r
+00-2B-67   (hex)               LCFC(HeFei) Electronics Technology co., ltd\r
+002B67     (base 16)           LCFC(HeFei) Electronics Technology co., ltd\r
+                               YunGu Road 3188-1\r
+                               Hefei  Anhui  230000\r
+                               CN\r
+\r
+F8-BC-0E   (hex)               eero inc.\r
+F8BC0E     (base 16)           eero inc.\r
+                               660 3rd Street\r
+                               San Francisco  CA  94107\r
+                               US\r
+\r
+50-E0-39   (hex)               Zyxel Communications Corporation\r
+50E039     (base 16)           Zyxel Communications Corporation\r
+                               No. 6 Innovation Road II, Science Park\r
+                               Hsichu  Taiwan  300\r
+                               TW\r
+\r
+B8-57-76   (hex)               lignex1\r
+B85776     (base 16)           lignex1\r
+                               354-25, Sanhodae-ro\r
+                               Gumi-si  Gyeongsangbuk-do, Korea  39262\r
+                               KR\r
+\r
+24-00-FA   (hex)               China Mobile (Hangzhou) Information Technology Co., Ltd\r
+2400FA     (base 16)           China Mobile (Hangzhou) Information Technology Co., Ltd\r
+                               No. 1600 Yuhangtang Road, Wuchang Street, Yuhang District\r
+                               Hangzhou  Zhejiang  311100\r
+                               CN\r
+\r
+C8-3D-FC   (hex)               AlphaTheta Corporation\r
+C83DFC     (base 16)           AlphaTheta Corporation\r
+                               6F,Yokohama i-Mark Place, 4-4-5 Minatomirai, Nishi-ku\r
+                               Yokohama  Kanagawa  220-0012\r
+                               JP\r
+\r
+E0-19-95   (hex)               Nutanix\r
+E01995     (base 16)           Nutanix\r
+                               1740 Technology Drive Ste #150\r
+                               San Jose  CA  95110\r
+                               US\r
+\r
+F8-51-28   (hex)               SimpliSafe\r
+F85128     (base 16)           SimpliSafe\r
+                               294 Washington St\r
+                               Boston  MA  02108\r
+                               US\r
+\r
+AC-1F-09   (hex)               shenzhen RAKwireless technology  Co.,Ltd\r
+AC1F09     (base 16)           shenzhen RAKwireless technology  Co.,Ltd\r
+                               Room 506, Bldg B, New Compark, Pingshan First Road, Taoyuan Street,Nanshan District\r
+                               shenzhen  guangdong  518057\r
+                               CN\r
+\r
+BC-13-A8   (hex)               Shenzhen YOUHUA Technology Co., Ltd\r
+BC13A8     (base 16)           Shenzhen YOUHUA Technology Co., Ltd\r
+                               Room 407 Shenzhen University-town Business Park,Lishan Road,Taoyuan Street,Nanshan District\r
+                               Shenzhen  Guangdong  518055\r
+                               CN\r
+\r
+90-77-EE   (hex)               Cisco Systems, Inc\r
+9077EE     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+3C-13-CC   (hex)               Cisco Systems, Inc\r
+3C13CC     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+94-E3-EE   (hex)               zte corporation\r
+94E3EE     (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
+D8-DC-40   (hex)               Apple, Inc.\r
+D8DC40     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+80-5F-C5   (hex)               Apple, Inc.\r
+805FC5     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+10-F9-20   (hex)               Cisco Systems, Inc\r
+10F920     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+20-69-80   (hex)               Apple, Inc.\r
+206980     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+64-32-A8   (hex)               Intel Corporate\r
+6432A8     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+80-19-34   (hex)               Intel Corporate\r
+801934     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+40-A3-CC   (hex)               Intel Corporate\r
+40A3CC     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+E4-A7-A0   (hex)               Intel Corporate\r
+E4A7A0     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+3C-4D-BE   (hex)               Apple, Inc.\r
+3C4DBE     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+48-26-2C   (hex)               Apple, Inc.\r
+48262C     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+14-7D-DA   (hex)               Apple, Inc.\r
+147DDA     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+C4-91-0C   (hex)               Apple, Inc.\r
+C4910C     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+6C-99-61   (hex)               Sagemcom Broadband SAS\r
+6C9961     (base 16)           Sagemcom Broadband SAS\r
+                               250, route de l'Empereur\r
+                               Rueil Malmaison Cedex  hauts de seine  92848\r
+                               FR\r
+\r
+50-C7-09   (hex)               Juniper Networks\r
+50C709     (base 16)           Juniper Networks\r
+                               1133 Innovation Way\r
+                               Sunnyvale  CA  94089\r
+                               US\r
+\r
+80-6D-97   (hex)               Private\r
+806D97     (base 16)           Private\r
+\r
+64-5D-86   (hex)               Intel Corporate\r
+645D86     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+18-1D-EA   (hex)               Intel Corporate\r
+181DEA     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+18-56-80   (hex)               Intel Corporate\r
+185680     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+A0-A4-C5   (hex)               Intel Corporate\r
+A0A4C5     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+F4-D1-08   (hex)               Intel Corporate\r
+F4D108     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+20-79-18   (hex)               Intel Corporate\r
+207918     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+A8-6D-AA   (hex)               Intel Corporate\r
+A86DAA     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+38-00-25   (hex)               Intel Corporate\r
+380025     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+C0-E3-A0   (hex)               Renesas Electronics (Penang) Sdn. Bhd.\r
+C0E3A0     (base 16)           Renesas Electronics (Penang) Sdn. Bhd.\r
+                               Phase 3, Bayan Lepas FIZ\r
+                               Bayan Lepas  Penang  11900\r
+                               MY\r
+\r
+F4-C1-14   (hex)               Technicolor CH USA Inc.\r
+F4C114     (base 16)           Technicolor CH USA Inc.\r
+                               5030 Sugarloaf Parkway Bldg 6 \r
+                               Lawrenceville  GA  30044\r
+                               US\r
+\r
+8C-E4-68   (hex)               Guangzhou Sageran Technology Co., Ltd.\r
+8CE468     (base 16)           Guangzhou Sageran Technology Co., Ltd.\r
+                               Room 1902, Ruian Guangzhou Center, 374 Beijing Road, Yuexiu District\r
+                               Guangzhou  Guangdong  510030\r
+                               CN\r
+\r
+C8-B2-9B   (hex)               Intel Corporate\r
+C8B29B     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+6C-6A-77   (hex)               Intel Corporate\r
+6C6A77     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+A4-B1-C1   (hex)               Intel Corporate\r
+A4B1C1     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+34-2E-B7   (hex)               Intel Corporate\r
+342EB7     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+8C-C6-81   (hex)               Intel Corporate\r
+8CC681     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+CC-F9-E4   (hex)               Intel Corporate\r
+CCF9E4     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+3C-58-C2   (hex)               Intel Corporate\r
+3C58C2     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+E4-5E-37   (hex)               Intel Corporate\r
+E45E37     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+24-41-8C   (hex)               Intel Corporate\r
+24418C     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+60-F2-62   (hex)               Intel Corporate\r
+60F262     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+C0-B8-83   (hex)               Intel Corporate\r
+C0B883     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+C8-09-A8   (hex)               Intel Corporate\r
+C809A8     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+90-78-41   (hex)               Intel Corporate\r
+907841     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+58-A0-23   (hex)               Intel Corporate\r
+58A023     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+D4-D2-52   (hex)               Intel Corporate\r
+D4D252     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+28-48-E7   (hex)               Huawei Device Co., Ltd.\r
+2848E7     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+04-D3-B0   (hex)               Intel Corporate\r
+04D3B0     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+E0-6C-A6   (hex)               Creotech Instruments S.A.\r
+E06CA6     (base 16)           Creotech Instruments S.A.\r
+                               ul. Gen. L. Okulickiego 7/9\r
+                               Piaseczno  Mazovia  05-500\r
+                               PL\r
+\r
+44-68-0C   (hex)               Wacom Co.,Ltd.\r
+44680C     (base 16)           Wacom Co.,Ltd.\r
+                               Sumitomo Fudosan Shinjuku Grand Tower 31F,8-17-1\r
+                               Nishi-shinjuku,Shinjuku-ku  Tokyo  160-6131\r
+                               JP\r
+\r
+98-0E-24   (hex)               Phytium Technology Co.,Ltd.\r
+980E24     (base 16)           Phytium Technology Co.,Ltd.\r
+                               Building5,XinAn Business Square,Haiyuan Middle Road Binhai New District,\r
+                               Tianjin    300450\r
+                               CN\r
+\r
+A8-30-BC   (hex)               Samsung Electronics Co.,Ltd\r
+A830BC     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+00-63-DE   (hex)               CLOUDWALK TECHNOLOGY CO.,LTD\r
+0063DE     (base 16)           CLOUDWALK TECHNOLOGY CO.,LTD\r
+                               Five Floors of Block 106, West Jinkai Avenue, Yubei District\r
+                               Chongqing  Chongqing  401120\r
+                               CN\r
+\r
+60-A4-23   (hex)               Silicon Laboratories\r
+60A423     (base 16)           Silicon Laboratories\r
+                               7000 W. William Cannon Dr.\r
+                               Austin  TX  78735\r
+                               US\r
+\r
+78-46-D4   (hex)               Samsung Electronics Co.,Ltd\r
+7846D4     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+E4-3E-C6   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+E43EC6     (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
+38-88-1E   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+38881E     (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
+2C-DB-07   (hex)               Intel Corporate\r
+2CDB07     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+98-8D-46   (hex)               Intel Corporate\r
+988D46     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+E4-26-8B   (hex)               Huawei Device Co., Ltd.\r
+E4268B     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+68-88-A1   (hex)               Universal Electronics, Inc.\r
+6888A1     (base 16)           Universal Electronics, Inc.\r
+                               201 E. Sandpointe Ave\r
+                               Santa Ana  CA  92707\r
+                               US\r
+\r
+00-1E-B2   (hex)               LG Innotek\r
+001EB2     (base 16)           LG Innotek\r
+                               Hanyang Univ. 1271, Sa-dong, Sangrok-gu\r
+                               Ansan-si  Gyeonggi-do  426-791\r
+                               KR\r
+\r
+C0-86-B3   (hex)               Shenzhen Voxtech Co., Ltd.\r
+C086B3     (base 16)           Shenzhen Voxtech Co., Ltd.\r
+                               Floors 1-4,Factory Building 26,Shancheng Industrial Park,Shiyan Street,Bao'an District,Shenzhen, Guangdong,China\r
+                               Shenzhen     518000\r
+                               CN\r
+\r
+44-AD-B1   (hex)               Sagemcom Broadband SAS\r
+44ADB1     (base 16)           Sagemcom Broadband SAS\r
+                               250, route de l'Empereur\r
+                               Rueil Malmaison Cedex  hauts de seine  92848\r
+                               FR\r
+\r
+1C-98-C1   (hex)               CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.\r
+1C98C1     (base 16)           CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.\r
+                               B22 Building,NO.51 Tongle Road, Shajing Town, Jiangnan District, Nanning, Guangxi Province, China\r
+                               Nanning  Guangxi  530007\r
+                               CN\r
+\r
+A0-9B-17   (hex)               Taicang T&W Electronics\r
+A09B17     (base 16)           Taicang T&W Electronics\r
+                               89# Jiang Nan RD\r
+                               Suzhou  Jiangsu  215412\r
+                               CN\r
+\r
+44-01-BB   (hex)               SHENZHEN BILIAN ELECTRONIC CO.,LTD\r
+4401BB     (base 16)           SHENZHEN BILIAN ELECTRONIC CO.,LTD\r
+                               NO.268? Fuqian Rd, Jutang community, Guanlan Town, Longhua New district\r
+                               shenzhen  guangdong  518000\r
+                               CN\r
+\r
+A0-D8-3D   (hex)               Fiberhome Telecommunication Technologies Co.,LTD\r
+A0D83D     (base 16)           Fiberhome Telecommunication Technologies Co.,LTD\r
+                               No.5 DongXin Road\r
+                               Wuhan  Hubei  430074\r
+                               CN\r
+\r
+58-F2-FC   (hex)               Huawei Device Co., Ltd.\r
+58F2FC     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+64-3A-EA   (hex)               Cisco Systems, Inc\r
+643AEA     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+50-70-43   (hex)               BSkyB Ltd\r
+507043     (base 16)           BSkyB Ltd\r
+                               130 Kings Road\r
+                               Brentwood  Essex  08854\r
+                               GB\r
+\r
+D0-14-11   (hex)               IEEE Registration Authority\r
+D01411     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+3C-53-D7   (hex)               CEDES AG\r
+3C53D7     (base 16)           CEDES AG\r
+                               Kantonsstrasse 14\r
+                               Landquart    7302\r
                                CH\r
 \r
+00-E5-E4   (hex)               Sichuan Tianyi Comheart Telecom Co., Ltd.\r
+00E5E4     (base 16)           Sichuan Tianyi Comheart Telecom Co., Ltd.\r
+                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+                               Chengdu  Sichuan  611330\r
+                               CN\r
+\r
+E8-13-6E   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+E8136E     (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
+4C-AE-13   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+4CAE13     (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
+4C-2E-FE   (hex)               Shenzhen Comnect Technology Co.,LTD\r
+4C2EFE     (base 16)           Shenzhen Comnect Technology Co.,LTD\r
+                               G Zone, 3/F, Building 1, Baisha High-Tech Park, No. 3011, Shahe Road West, XiLi Street, Nanshan District\r
+                               Shenzhen    518055\r
+                               CN\r
+\r
+10-BC-97   (hex)               vivo Mobile Communication Co., Ltd.\r
+10BC97     (base 16)           vivo Mobile Communication Co., Ltd.\r
+                               #283,BBK Road\r
+                               Wusha,Chang'An  DongGuan City,Guangdong,  523860\r
+                               CN\r
+\r
+DC-D4-44   (hex)               Huawei Device Co., Ltd.\r
+DCD444     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+E0-B2-60   (hex)               TENO NETWORK TECHNOLOGIES COMPANY LIMITED\r
+E0B260     (base 16)           TENO NETWORK TECHNOLOGIES COMPANY LIMITED\r
+                               RM 1302, 13/F CHEONG K BLDG 84-86 DES VOEUX RD CENTRAL  HONG KONG\r
+                               Hong Kong    999077\r
+                               HK\r
+\r
+A4-46-B4   (hex)               Huawei Device Co., Ltd.\r
+A446B4     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+0C-C8-44   (hex)               Cambridge Mobile Telematics, Inc.\r
+0CC844     (base 16)           Cambridge Mobile Telematics, Inc.\r
+                               One Broadway, 14th Floor\r
+                               Cambridge  MA  02142\r
+                               US\r
+\r
+E8-DA-20   (hex)               Nintendo Co.,Ltd\r
+E8DA20     (base 16)           Nintendo Co.,Ltd\r
+                               11-1 HOKOTATE-CHO KAMITOBA,MINAMI-KU\r
+                               KYOTO  KYOTO  601-8501\r
+                               JP\r
+\r
+48-23-35   (hex)               Dialog Semiconductor Hellas SA\r
+482335     (base 16)           Dialog Semiconductor Hellas SA\r
+                               Achileos 8 & Katsoni Str\r
+                               Kalithea, Athens    17674\r
+                               GR\r
+\r
+8C-85-C1   (hex)               Aruba, a Hewlett Packard Enterprise Company\r
+8C85C1     (base 16)           Aruba, a Hewlett Packard Enterprise Company\r
+                               3333 Scott Blvd\r
+                               Santa Clara  CA  95054\r
+                               US\r
+\r
+20-A1-71   (hex)               Amazon Technologies Inc.\r
+20A171     (base 16)           Amazon Technologies Inc.\r
+                               P.O Box 8102\r
+                               Reno  NV  89507\r
+                               US\r
+\r
+7C-F9-A0   (hex)               Fiberhome Telecommunication Technologies Co.,LTD\r
+7CF9A0     (base 16)           Fiberhome Telecommunication Technologies Co.,LTD\r
+                               No.5 DongXin Road\r
+                               Wuhan  Hubei  430074\r
+                               CN\r
+\r
+6C-A4-D1   (hex)               Fiberhome Telecommunication Technologies Co.,LTD\r
+6CA4D1     (base 16)           Fiberhome Telecommunication Technologies Co.,LTD\r
+                               No.5 DongXin Road\r
+                               Wuhan  Hubei  430074\r
+                               CN\r
+\r
+54-AB-3A   (hex)               Quanta Computer Inc.\r
+54AB3A     (base 16)           Quanta Computer Inc.\r
+                               No.211, Wen Hwa 2nd Rd., Kuei Shan Hsiang, Tao Yuan Shien, Taiwan, R. O. C.\r
+                               Taoyuan  Taiwan  33377\r
+                               TW\r
+\r
+E8-9A-8F   (hex)               Quanta Computer Inc.\r
+E89A8F     (base 16)           Quanta Computer Inc.\r
+                               211, Wen Hwa 2nd Rd.,Kuei Shan, Tao Yuan \r
+                               TAIPEI    33377\r
+                               TW\r
+\r
+EC-6C-9A   (hex)               Arcadyan Corporation\r
+EC6C9A     (base 16)           Arcadyan Corporation\r
+                               No.8, Sec.2, Guangfu Rd.\r
+                               Hsinchu City  Hsinchu  30071\r
+                               TW\r
+\r
+34-6D-9C   (hex)               Carrier Corporation\r
+346D9C     (base 16)           Carrier Corporation\r
+                               6304 Thompson Rd\r
+                               East Syracuse  NY  13057\r
+                               US\r
+\r
+D4-F7-56   (hex)               zte corporation\r
+D4F756     (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
+E0-69-3A   (hex)               Innophase Inc.\r
+E0693A     (base 16)           Innophase Inc.\r
+                               6815 Flanders Drive Suite 150\r
+                               San Diego  CA  92121\r
+                               US\r
+\r
+54-88-DE   (hex)               Cisco Systems, Inc\r
+5488DE     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+78-2B-64   (hex)               Bose Corporation\r
+782B64     (base 16)           Bose Corporation\r
+                               The Mountain\r
+                               Framingham  MA  01701-9168\r
+                               US\r
+\r
+24-FD-0D   (hex)               Intelbras\r
+24FD0D     (base 16)           Intelbras\r
+                               BR 101, KM 210\r
+                               São Jose  Santa Catarina  88104-800\r
+                               BR\r
+\r
+34-55-94   (hex)               FUJIAN STAR-NET COMMUNICATION CO.,LTD\r
+345594     (base 16)           FUJIAN STAR-NET COMMUNICATION CO.,LTD\r
+                               19-22# Building, Star-net Science Plaza, Juyuanzhou,\r
+                               FUZHOU  FUJIAN  350002\r
+                               CN\r
+\r
+9C-6B-37   (hex)               Renesas Electronics (Penang) Sdn. Bhd.\r
+9C6B37     (base 16)           Renesas Electronics (Penang) Sdn. Bhd.\r
+                               Phase 3, Bayan Lepas FIZ\r
+                               Bayan Lepas  Penang  11900\r
+                               MY\r
+\r
+A8-37-59   (hex)               Huawei Device Co., Ltd.\r
+A83759     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+40-AA-56   (hex)               China Dragon Technology Limited\r
+40AA56     (base 16)           China Dragon Technology Limited\r
+                               B4 Bldg.Haoshan 1st Industry Park,\r
+                               Shenzhen  Guangdong  518104\r
+                               CN\r
+\r
+68-54-5A   (hex)               Intel Corporate\r
+68545A     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+3C-E3-E7   (hex)               China Mobile Group Device Co.,Ltd.\r
+3CE3E7     (base 16)           China Mobile Group Device Co.,Ltd.\r
+                               32 Xuanwumen West Street,Xicheng District\r
+                               Beijing    100053\r
+                               CN\r
+\r
+CC-47-BD   (hex)               Rhombus Systems\r
+CC47BD     (base 16)           Rhombus Systems\r
+                               770 L St, Suite 1480\r
+                               Sacramento  CA  95814\r
+                               US\r
+\r
+4C-93-A6   (hex)               IEEE Registration Authority\r
+4C93A6     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+00-1E-31   (hex)               infomark\r
+001E31     (base 16)           infomark\r
+                               5F.,Geown Bldg.,1360-53\r
+                               Seoul  Seocho-dong,Seocho-gu  137-863\r
+                               KR\r
+\r
+50-F7-ED   (hex)               Huawei Device Co., Ltd.\r
+50F7ED     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+4C-B9-9B   (hex)               WEIFANG GOERTEK ELECTRONICS CO.,LTD\r
+4CB99B     (base 16)           WEIFANG GOERTEK ELECTRONICS CO.,LTD\r
+                               Gaoxin 2 Road, Free Trade Zone,Weifang,Shandong,261205,P.R.China\r
+                               Weifang  Shandong  261205\r
+                               CN\r
+\r
+BC-7E-8B   (hex)               Samsung Electronics Co.,Ltd\r
+BC7E8B     (base 16)           Samsung Electronics Co.,Ltd\r
+                               129, Samsung-ro, Youngtongl-Gu\r
+                               Suwon  Gyeonggi-Do  16677\r
+                               KR\r
+\r
+0C-31-DC   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+0C31DC     (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
+40-DD-D1   (hex)               Beautiful Card Corporation\r
+40DDD1     (base 16)           Beautiful Card Corporation\r
+                               Wenming 1st St.,\r
+                               Taoyuan    33383\r
+                               TW\r
+\r
+C0-E7-BF   (hex)               Sichuan AI-Link Technology Co., Ltd.\r
+C0E7BF     (base 16)           Sichuan AI-Link Technology Co., Ltd.\r
+                               Anzhou, Industrial Park\r
+                               Mianyang  Sichuan  622650\r
+                               CN\r
+\r
+54-77-8A   (hex)               Hewlett Packard Enterprise\r
+54778A     (base 16)           Hewlett Packard Enterprise\r
+                               8000 Foothills Blvd.\r
+                               Roseville  CA  95747\r
+                               US\r
+\r
+24-71-52   (hex)               Dell Inc.\r
+247152     (base 16)           Dell Inc.\r
+                               One Dell Way\r
+                               Round Rock  TX  78682\r
+                               US\r
+\r
+64-33-DB   (hex)               Texas Instruments\r
+6433DB     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+A4-06-E9   (hex)               Texas Instruments\r
+A406E9     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+B0-B1-13   (hex)               Texas Instruments\r
+B0B113     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+4C-AE-EC   (hex)               Guangzhou limee technology co.,LTD\r
+4CAEEC     (base 16)           Guangzhou limee technology co.,LTD\r
+                               No.2, Yichuang Street, Zhongxin Guangzhou Knowledge City, Huangpu District, Guangzhou\r
+                               Guangzhou  Guangdong  510555\r
+                               CN\r
+\r
+00-40-AB   (hex)               ROLAND DG CORPORATION\r
+0040AB     (base 16)           ROLAND DG CORPORATION\r
+                               1-1-3 Shinmiyakoda, Kita-ku\r
+                               Hamamatsu-shi  Shizuoka-ken  431-2103\r
+                               JP\r
+\r
+00-12-B4   (hex)               Work Microwave GmbH\r
+0012B4     (base 16)           Work Microwave GmbH\r
+                               Rudolf-Diesel-Ring 2\r
+                               Holzkirchen    83607\r
+                               DE\r
+\r
+24-B1-05   (hex)               Prama Hikvision India Private Limited\r
+24B105     (base 16)           Prama Hikvision India Private Limited\r
+                               Prama Hikvision India Pvt Ltd, Akurli Cross Road No 1, Kandivali East\r
+                               Mumbai  Maharashtra  400101\r
+                               IN\r
+\r
+70-9C-D1   (hex)               Intel Corporate\r
+709CD1     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+80-60-B7   (hex)               CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.\r
+8060B7     (base 16)           CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.\r
+                               B22 Building,NO.51 Tongle Road, Shajing Town, Jiangnan District, Nanning, Guangxi Province, China\r
+                               Nanning  Guangxi  530007\r
+                               CN\r
+\r
+90-AA-C3   (hex)               Hitron Technologies. Inc\r
+90AAC3     (base 16)           Hitron Technologies. Inc\r
+                               No. 1-8, Lising 1st Rd. Hsinchu Science Park, Hsinchu, 300, Taiwan, R.O.C\r
+                               Hsin-chu  Taiwan  300\r
+                               TW\r
+\r
+44-91-7C   (hex)               HMD Global Oy\r
+44917C     (base 16)           HMD Global Oy\r
+                               Bertel Jungin aukio 9\r
+                               Espoo  Paimio  02600\r
+                               FI\r
+\r
+DC-72-23   (hex)               Hui Zhou Gaoshengda Technology Co.,LTD\r
+DC7223     (base 16)           Hui Zhou Gaoshengda Technology Co.,LTD\r
+                               No.75,Zhongkai High-Tech Development District,Huizhou\r
+                               Hui Zhou  Guangdong  516006\r
+                               CN\r
+\r
+34-20-E3   (hex)               Ruckus Wireless\r
+3420E3     (base 16)           Ruckus Wireless\r
+                               350 West Java Drive\r
+                               Sunnyvale  CA  94089\r
+                               US\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
+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
+                               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
 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
@@ -132494,12 +135080,6 @@ A04147     (base 16)         Huawei Device Co., Ltd.
                                Hull  East Yorkshire  HU5 4JB\r
                                GB\r
 \r
-04-ED-33   (hex)               Intel Corporate\r
-04ED33     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 20-36-D7   (hex)               Shanghai Reacheng  Communication Technology Co.,Ltd\r
 2036D7     (base 16)           Shanghai Reacheng  Communication Technology Co.,Ltd\r
                                No. 80, Lane 1505 Zuchongzhi Road\r
@@ -132572,12 +135152,6 @@ F0E4A2     (base 16)         HUAWEI TECHNOLOGIES CO.,LTD
                                Tsuen Wan    NA\r
                                HK\r
 \r
-7C-B2-7D   (hex)               Intel Corporate\r
-7CB27D     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 10-63-C8   (hex)               Liteon Technology Corporation\r
 1063C8     (base 16)           Liteon Technology Corporation\r
                                4F, 90, Chien 1 Road\r
@@ -133442,12 +136016,6 @@ CCDC55     (base 16)         Dragonchip Limited
                                Hong Kong    NA\r
                                HK\r
 \r
-A4-C3-F0   (hex)               Intel Corporate\r
-A4C3F0     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 28-FF-B2   (hex)               Toshiba Corp.\r
 28FFB2     (base 16)           Toshiba Corp.\r
                                1-1 Shibaura 1-Chome, Minato-Ku\r
@@ -133562,12 +136130,6 @@ D411A3     (base 16)         Samsung Electronics Co.,Ltd
                                Riga  Riga  LV1009\r
                                LV\r
 \r
-A4-11-62   (hex)               Arlo Technology\r
-A41162     (base 16)           Arlo Technology\r
-                               350 East Plumeria Drive\r
-                               san jose  CA  95134\r
-                               US\r
-\r
 00-A0-85   (hex)               Private\r
 00A085     (base 16)           Private\r
 \r
@@ -134348,12 +136910,6 @@ B87826     (base 16)         Nintendo Co.,Ltd
                                KYOTO  KYOTO  601-8501\r
                                JP\r
 \r
-50-76-AF   (hex)               Intel Corporate\r
-5076AF     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 DC-CB-A8   (hex)               Explora Technologies Inc\r
 DCCBA8     (base 16)           Explora Technologies Inc\r
                                360, Franquet Street\r
@@ -134372,12 +136928,6 @@ E4B97A     (base 16)         Dell Inc.
                                Round Rock  TX  78682\r
                                US\r
 \r
-00-16-36   (hex)               QUANTA COMPUTER INC.\r
-001636     (base 16)           QUANTA COMPUTER INC.\r
-                               No. 211, Wen Hwa 2Rd., Kuei Shan Hsiang\r
-                               Tao Yuan Shien    0000\r
-                               TW\r
-\r
 34-DA-C1   (hex)               SAE Technologies Development(Dongguan) Co., Ltd.\r
 34DAC1     (base 16)           SAE Technologies Development(Dongguan) Co., Ltd.\r
                                Winnerway Industrial Area,Nancheng\r
@@ -134930,12 +137480,6 @@ CC2119     (base 16)         Samsung Electronics Co.,Ltd
                                San Jose  CA  94568\r
                                US\r
 \r
-B4-69-21   (hex)               Intel Corporate\r
-B46921     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 90-2B-D2   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
 902BD2     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
                                No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
@@ -135740,18 +138284,6 @@ F4844C     (base 16)         Texas Instruments
                                Dallas  TX  75243\r
                                US\r
 \r
-38-DE-AD   (hex)               Intel Corporate\r
-38DEAD     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
-D4-6D-6D   (hex)               Intel Corporate\r
-D46D6D     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 B4-F2-E8   (hex)               ARRIS Group, Inc.\r
 B4F2E8     (base 16)           ARRIS Group, Inc.\r
                                6450 Sequence Drive\r
@@ -136319,12 +138851,6 @@ B0ECE1     (base 16)         Private
                                Hwaseong-si  Gyeonggi-do  18510\r
                                KR\r
 \r
-F8-F2-1E   (hex)               Intel Corporate\r
-F8F21E     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 28-29-86   (hex)               APC by Schneider Electric\r
 282986     (base 16)           APC by Schneider Electric\r
                                800 Federal St.\r
@@ -141134,12 +143660,6 @@ B83241     (base 16)         Wuhan Tianyu Information Industry Co., Ltd.
                                Copenhagen  V  DK-1790\r
                                DK\r
 \r
-00-1C-FC   (hex)               Sumitomo Electric Industries,Ltd\r
-001CFC     (base 16)           Sumitomo Electric Industries,Ltd\r
-                               1-1-3, Shimaya, Konohana-ku\r
-                               Osaka    554-0024\r
-                               JP\r
-\r
 00-23-B4   (hex)               Nokia Danmark A/S\r
 0023B4     (base 16)           Nokia Danmark A/S\r
                                Frederikskaj\r
@@ -150404,12 +152924,6 @@ EC5C69     (base 16)         MITSUBISHI HEAVY INDUSTRIES MECHATRONICS SYSTEMS,LTD.
                                GUNPO-SI  KYUNGGI-DO  435-862\r
                                KR\r
 \r
-AC-9A-96   (hex)               Lantiq Deutschland GmbH\r
-AC9A96     (base 16)           Lantiq Deutschland GmbH\r
-                               Am Campeon 3\r
-                               Neubiberg  Bavaria  85579\r
-                               DE\r
-\r
 80-EE-73   (hex)               Shuttle Inc.\r
 80EE73     (base 16)           Shuttle Inc.\r
                                No. 30 Lane 76, Rei Kuang Rd\r
@@ -153089,12 +155603,6 @@ EC6C9F     (base 16)         Chengdu Volans Technology CO.,LTD
                                SAKU  Nagano  385-0021\r
                                JP\r
 \r
-00-1D-05   (hex)               Eaton Corporation\r
-001D05     (base 16)           Eaton Corporation\r
-                               203 Cooper Circle\r
-                               Peachtree City  GA  30269\r
-                               US\r
-\r
 00-1C-C2   (hex)               Part II Research, Inc.\r
 001CC2     (base 16)           Part II Research, Inc.\r
                                4601 E. Airport Dr.\r
@@ -153821,12 +156329,6 @@ EC6C9F     (base 16)         Chengdu Volans Technology CO.,LTD
                                Colorado Springs  CO  80915\r
                                US\r
 \r
-00-19-F5   (hex)               Imagination Technologies Ltd\r
-0019F5     (base 16)           Imagination Technologies Ltd\r
-                               Zurich House\r
-                               Leeds  West Yorkshire  LS11 5DB\r
-                               GB\r
-\r
 00-19-EF   (hex)               SHENZHEN LINNKING ELECTRONICS CO.,LTD\r
 0019EF     (base 16)           SHENZHEN LINNKING ELECTRONICS CO.,LTD\r
                                Room 901,B Block,Qinghua Information Center Hi-tec park North District,Nanshan District,Shenzhen\r
@@ -158972,12 +161474,6 @@ EC6C9F     (base 16)         Chengdu Volans Technology CO.,LTD
                                Taipei Hsien    \r
                                TW\r
 \r
-00-CB-BD   (hex)               Cambridge Broadband Networks Ltd.\r
-00CBBD     (base 16)           Cambridge Broadband Networks Ltd.\r
-                               Selwyn House Cambridge Business Park\r
-                               Cambridge    CB4 0WZ\r
-                               GB\r
-\r
 00-05-88   (hex)               Sensoria Corp.\r
 000588     (base 16)           Sensoria Corp.\r
                                15950 Bernardo Ctr. Dr.\r
@@ -161678,12 +164174,6 @@ EC6C9F     (base 16)         Chengdu Volans Technology CO.,LTD
                                ALBUQUERQUE  NM  87184-0173\r
                                US\r
 \r
-00-E0-B7   (hex)               PI GROUP, LTD.\r
-00E0B7     (base 16)           PI GROUP, LTD.\r
-                               MILTON HALL, CHURCH LANE\r
-                               MILTON, CAMBRIDGE CBA 6AB    \r
-                               GB\r
-\r
 00-E0-83   (hex)               JATO TECHNOLOGIES, INC.\r
 00E083     (base 16)           JATO TECHNOLOGIES, INC.\r
                                505 EAST HUNTLAND DR. STE #550\r
@@ -164519,18 +167009,6 @@ D4B709     (base 16)         zte corporation
                                Wuhan  Hubei  430074\r
                                CN\r
 \r
-5C-80-B6   (hex)               Intel Corporate\r
-5C80B6     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
-F8-E4-E3   (hex)               Intel Corporate\r
-F8E4E3     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 AC-BD-0B   (hex)               Leimac Ltd.\r
 ACBD0B     (base 16)           Leimac Ltd.\r
                                1551, Sazukawa-chou\r
@@ -164549,12 +167027,6 @@ E0CCF8     (base 16)         Xiaomi Communications Co Ltd
                                Lawrenceville  GA  30044\r
                                US\r
 \r
-84-C5-A6   (hex)               Intel Corporate\r
-84C5A6     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 38-68-A4   (hex)               Samsung Electronics Co.,LTD\r
 3868A4     (base 16)           Samsung Electronics Co.,LTD\r
                                129, Samsung-ro, Youngtongl-Gu\r
@@ -164687,12 +167159,6 @@ CCF411     (base 16)         Google, Inc.
                                Zhuhai  Guangdong  519070\r
                                CN\r
 \r
-04-33-C2   (hex)               Intel Corporate\r
-0433C2     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 C8-03-F5   (hex)               Ruckus Wireless\r
 C803F5     (base 16)           Ruckus Wireless\r
                                350 West Java Drive\r
@@ -165065,12 +167531,6 @@ B48107     (base 16)         SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD
                                New Taipei City  Taiwan  231\r
                                TW\r
 \r
-C8-58-C0   (hex)               Intel Corporate\r
-C858C0     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 64-7C-34   (hex)               Ubee Interactive Co., Limited\r
 647C34     (base 16)           Ubee Interactive Co., Limited\r
                                Flat/RM 1202, 12/F, AT Tower \r
@@ -165221,18 +167681,6 @@ C01692     (base 16)         China Mobile Group Device Co.,Ltd.
                                Dongguan    523808\r
                                CN\r
 \r
-AC-12-03   (hex)               Intel Corporate\r
-AC1203     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
-64-BC-58   (hex)               Intel Corporate\r
-64BC58     (base 16)           Intel Corporate\r
-                               Lot 8, Jalan Hi-Tech 2/3\r
-                               Kulim  Kedah  09000\r
-                               MY\r
-\r
 D4-52-EE   (hex)               BSkyB Ltd\r
 D452EE     (base 16)           BSkyB Ltd\r
                                130 Kings Road\r
@@ -165515,17 +167963,11 @@ C87125     (base 16)                Johnson Outdoors Marine Electronics d/b/a Minnkota
                                Santa Clara  CA  95054\r
                                US\r
 \r
-EC-6C-B5   (hex)               zte corporation\r
-EC6CB5     (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
-C0-B1-01   (hex)               zte corporation\r
-C0B101     (base 16)           zte corporation\r
-                               12/F.,zte R&D building ,kejinan Road,Shenzhen,P.R.China\r
-                               shenzhen  guangdong  518057\r
-                               CN\r
+FC-3D-A5   (hex)               Arcadyan Corporation\r
+FC3DA5     (base 16)           Arcadyan Corporation\r
+                               No.8, Sec.2, Guangfu Rd.\r
+                               Hsinchu City  Hsinchu  30071\r
+                               TW\r
 \r
 EC-4F-82   (hex)               Calix Inc.\r
 EC4F82     (base 16)           Calix Inc.\r
@@ -165545,11 +167987,23 @@ EC4F82     (base 16)                Calix Inc.
                                San Jose  CA  95131\r
                                US\r
 \r
-FC-3D-A5   (hex)               Arcadyan Corporation\r
-FC3DA5     (base 16)           Arcadyan Corporation\r
-                               No.8, Sec.2, Guangfu Rd.\r
-                               Hsinchu City  Hsinchu  30071\r
-                               TW\r
+EC-6C-B5   (hex)               zte corporation\r
+EC6CB5     (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
+C0-B1-01   (hex)               zte corporation\r
+C0B101     (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
+14-01-52   (hex)               Samsung Electronics Co.,Ltd\r
+140152     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
 \r
 BC-33-AC   (hex)               Silicon Laboratories\r
 BC33AC     (base 16)           Silicon Laboratories\r
@@ -165557,14 +168011,764 @@ BC33AC     (base 16)               Silicon Laboratories
                                Austin  TX  78735\r
                                US\r
 \r
-14-01-52   (hex)               Samsung Electronics Co.,Ltd\r
-140152     (base 16)           Samsung Electronics Co.,Ltd\r
+94-FB-A7   (hex)               IEEE Registration Authority\r
+94FBA7     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+98-8E-79   (hex)               Qudelix, Inc.\r
+988E79     (base 16)           Qudelix, Inc.\r
+                               605-ho, 21, Baekbeom-ro 31-gil, Mapo-gu\r
+                               Seoul    12110\r
+                               KR\r
+\r
+98-F6-21   (hex)               Xiaomi Communications Co Ltd\r
+98F621     (base 16)           Xiaomi Communications Co Ltd\r
+                               The Rainbow City of China Resources\r
+                               NO.68, Qinghe Middle Street  Haidian District, Beijing  100085\r
+                               CN\r
+\r
+C0-3E-BA   (hex)               Dell Inc.\r
+C03EBA     (base 16)           Dell Inc.\r
+                               One Dell Way\r
+                               Round Rock  TX  78682\r
+                               US\r
+\r
+C0-39-5A   (hex)               Zhejiang Dahua Technology Co., Ltd.\r
+C0395A     (base 16)           Zhejiang Dahua Technology Co., Ltd.\r
+                               No.1199,Waterfront Road \r
+                               Hangzhou  Zhejiang  310053\r
+                               CN\r
+\r
+20-64-CB   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+2064CB     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+                               NO.18 HAIBIN ROAD,\r
+                               DONG GUAN  GUANG DONG  523860\r
+                               CN\r
+\r
+F0-55-01   (hex)               Huawei Device Co., Ltd.\r
+F05501     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+7C-F2-DD   (hex)               Vence Corp\r
+7CF2DD     (base 16)           Vence Corp\r
+                               16885 W Bernardo Dr., STE 209\r
+                               San Diego  CA  92127\r
+                               US\r
+\r
+D0-76-8F   (hex)               Calix Inc.\r
+D0768F     (base 16)           Calix Inc.\r
+                               2777 Orchard Pkwy\r
+                               San Jose  CA  95131\r
+                               US\r
+\r
+1C-FF-59   (hex)               Sichuan Tianyi Comheart Telecom Co., Ltd.\r
+1CFF59     (base 16)           Sichuan Tianyi Comheart Telecom Co., Ltd.\r
+                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+                               Chengdu  Sichuan  611330\r
+                               CN\r
+\r
+14-13-FB   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+1413FB     (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
+00-E0-B7   (hex)               Cosworth Electronics Ltd\r
+00E0B7     (base 16)           Cosworth Electronics Ltd\r
+                               The Octagon, St. James Mill Road\r
+                               Northampton  Northamptonshire  NN5 5RA, GB\r
+                               GB\r
+\r
+A4-93-40   (hex)               Beijing Supvan Information Technology Co.,Ltd.\r
+A49340     (base 16)           Beijing Supvan Information Technology Co.,Ltd.\r
+                               206.2/F,Building No.1.No.1 Gaoxin Three Street. Huilongguan Town,Changping District\r
+                               Beijing  Beijing  102206\r
+                               CN\r
+\r
+F8-E8-77   (hex)               Harman/Becker Automotive Systems GmbH\r
+F8E877     (base 16)           Harman/Becker Automotive Systems GmbH\r
+                               Becker-Göring-Straße 16\r
+                               Karlsbad  Baden-Württemberg  76307\r
+                               DE\r
+\r
+A0-9B-12   (hex)               China Mobile IOT Company Limited\r
+A09B12     (base 16)           China Mobile IOT Company Limited\r
+                               NO.8 Yu Ma Road, NanAn Area\r
+                               Chongqing  Chongqing  401336\r
+                               CN\r
+\r
+94-08-53   (hex)               Liteon Technology Corporation\r
+940853     (base 16)           Liteon Technology Corporation\r
+                               4F, 90, Chien 1 Road\r
+                               New Taipei City  Taiwan  23585\r
+                               TW\r
+\r
+B4-9E-80   (hex)               Sichuan Changhong Electric Ltd.\r
+B49E80     (base 16)           Sichuan Changhong Electric Ltd.\r
+                               No.35,East MianXin Road,MianYang,Sichaun,China.\r
+                               MianYang  SiChuan  PRC 621000\r
+                               CN\r
+\r
+00-E2-2C   (hex)               China Mobile Group Device Co.,Ltd.\r
+00E22C     (base 16)           China Mobile Group Device Co.,Ltd.\r
+                               32 Xuanwumen West Street,Xicheng District\r
+                               Beijing    100053\r
+                               CN\r
+\r
+78-11-00   (hex)               Quantumsolution\r
+781100     (base 16)           Quantumsolution\r
+                               Rm 903, STX V-Tower, 128, Gasandigital 1-ro, Geumcheon-gu\r
+                               Seoul    08507\r
+                               KR\r
+\r
+E8-7F-95   (hex)               Apple, Inc.\r
+E87F95     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+88-C0-8B   (hex)               Apple, Inc.\r
+88C08B     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+74-AB-93   (hex)               Blink by Amazon \r
+74AB93     (base 16)           Blink by Amazon \r
+                               100 Riverpark Drive\r
+                               North Reading   MA  01864\r
+                               US\r
+\r
+7C-A9-6B   (hex)               Syrotech Networks. Ltd.\r
+7CA96B     (base 16)           Syrotech Networks. Ltd.\r
+                               UNIT NO.-5 20F, KIN WING INDUSTERIAL BUILDING,33 KIN WING STREET\r
+                               TUEN MUN    999077\r
+                               HK\r
+\r
+98-06-3C   (hex)               Samsung Electronics Co.,Ltd\r
+98063C     (base 16)           Samsung Electronics Co.,Ltd\r
+                               129, Samsung-ro, Youngtongl-Gu\r
+                               Suwon  Gyeonggi-Do  16677\r
+                               KR\r
+\r
+38-DE-AD   (hex)               Intel Corporate\r
+38DEAD     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+D4-6D-6D   (hex)               Intel Corporate\r
+D46D6D     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+B4-69-21   (hex)               Intel Corporate\r
+B46921     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+F8-F2-1E   (hex)               Intel Corporate\r
+F8F21E     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+74-A7-EA   (hex)               Amazon Technologies Inc.\r
+74A7EA     (base 16)           Amazon Technologies Inc.\r
+                               P.O Box 8102\r
+                               Reno  NV  89507\r
+                               US\r
+\r
+4C-7C-D9   (hex)               Apple, Inc.\r
+4C7CD9     (base 16)           Apple, Inc.\r
+                               1 Infinite Loop\r
+                               Cupertino  CA  95014\r
+                               US\r
+\r
+F0-D7-AF   (hex)               IEEE Registration Authority\r
+F0D7AF     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+84-EA-ED   (hex)               Roku, Inc\r
+84EAED     (base 16)           Roku, Inc\r
+                               150 Winchester Circle\r
+                               Los Gatos  CA  95032\r
+                               US\r
+\r
+7C-B2-7D   (hex)               Intel Corporate\r
+7CB27D     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+04-ED-33   (hex)               Intel Corporate\r
+04ED33     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+5C-80-B6   (hex)               Intel Corporate\r
+5C80B6     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+84-C5-A6   (hex)               Intel Corporate\r
+84C5A6     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+AC-67-5D   (hex)               Intel Corporate\r
+AC675D     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+F8-E4-E3   (hex)               Intel Corporate\r
+F8E4E3     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+D8-4F-37   (hex)               Proxis, spol. s r.o.\r
+D84F37     (base 16)           Proxis, spol. s r.o.\r
+                               Slovenska 1\r
+                               Bardejov  PSK  08501\r
+                               SK\r
+\r
+AC-12-03   (hex)               Intel Corporate\r
+AC1203     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+DC-1B-A1   (hex)               Intel Corporate\r
+DC1BA1     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+5C-A5-BC   (hex)               eero inc.\r
+5CA5BC     (base 16)           eero inc.\r
+                               660 3rd Street\r
+                               San Francisco    94107\r
+                               US\r
+\r
+04-33-C2   (hex)               Intel Corporate\r
+0433C2     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+C8-58-C0   (hex)               Intel Corporate\r
+C858C0     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+64-BC-58   (hex)               Intel Corporate\r
+64BC58     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+A4-C3-F0   (hex)               Intel Corporate\r
+A4C3F0     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+50-76-AF   (hex)               Intel Corporate\r
+5076AF     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+DC-91-BF   (hex)               Amazon Technologies Inc.\r
+DC91BF     (base 16)           Amazon Technologies Inc.\r
+                               P.O Box 8102\r
+                               Reno  NV  89507\r
+                               US\r
+\r
+98-C9-7C   (hex)               Shenzhen iComm Semiconductor CO,LTD\r
+98C97C     (base 16)           Shenzhen iComm Semiconductor CO,LTD\r
+                               Room 504A,Block B,Digital Building,Garden City,No.1079 Nanhai Road,Nanshan District,Shenzhen\r
+                               shenzhen  Guangdong  518067\r
+                               CN\r
+\r
+E0-92-A7   (hex)               Feitian Technologies Co., Ltd\r
+E092A7     (base 16)           Feitian Technologies Co., Ltd\r
+                               Floor 17, Tower B, Huizhi Mansion, No.9 Xueqing Rd, Haidian District\r
+                               Beijing    100085\r
+                               CN\r
+\r
+08-B0-A7   (hex)               Truebeyond Co., Ltd\r
+08B0A7     (base 16)           Truebeyond Co., Ltd\r
+                               D-906, 60, Haan-ro\r
+                               Gwangmyeong  Gyeonggi  14322\r
+                               KR\r
+\r
+C0-63-69   (hex)               BINXIN TECHNOLOGY(ZHEJIANG) LTD.\r
+C06369     (base 16)           BINXIN TECHNOLOGY(ZHEJIANG) LTD.\r
+                               B4066 Haichuang Park,368 Liuhe Road, Binjiang District\r
+                               Hangzhou  Zhejiang  310051\r
+                               CN\r
+\r
+18-41-FE   (hex)               Digital 14\r
+1841FE     (base 16)           Digital 14\r
+                               Elektroniikkatie 8\r
+                               Oulu    90590\r
+                               FI\r
+\r
+6C-CE-44   (hex)               1MORE\r
+6CCE44     (base 16)           1MORE\r
+                               TianliaoBuilding F14?New Materials Industrial Park,Xueyuan Blvd,Nanshan\r
+                               Shenzhen  Guangdong  518055\r
+                               CN\r
+\r
+B0-76-1B   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+B0761B     (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
+A4-11-62   (hex)               Arlo Technology\r
+A41162     (base 16)           Arlo Technology\r
+                               3030 Orchard Parkway\r
+                               San Jose  CA  95134\r
+                               US\r
+\r
+00-1D-05   (hex)               Cooper Lighting Solutions\r
+001D05     (base 16)           Cooper Lighting Solutions\r
+                               1121 Highway 74 S\r
+                               Peachtree City  GA  30269\r
+                               US\r
+\r
+8C-0E-60   (hex)               Nanjing Juplink Intelligent Technologies Co., Ltd.\r
+8C0E60     (base 16)           Nanjing Juplink Intelligent Technologies Co., Ltd.\r
+                                No. 757 Dixiu Road, Binjiang Economic Development Zone, Jiangning District\r
+                               Nanjing  Jiangsu  211100\r
+                               CN\r
+\r
+18-AB-1D   (hex)               Samsung Electronics Co.,Ltd\r
+18AB1D     (base 16)           Samsung Electronics Co.,Ltd\r
                                #94-1, Imsoo-Dong\r
                                Gumi  Gyeongbuk  730-350\r
                                KR\r
 \r
-94-FB-A7   (hex)               IEEE Registration Authority\r
-94FBA7     (base 16)           IEEE Registration Authority\r
+BC-E9-2F   (hex)               HP Inc.\r
+BCE92F     (base 16)           HP Inc.\r
+                               10300 Energy Dr\r
+                               Spring  TX  77389\r
+                               US\r
+\r
+84-37-D5   (hex)               Samsung Electronics Co.,Ltd\r
+8437D5     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+34-82-C5   (hex)               Samsung Electronics Co.,Ltd\r
+3482C5     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+34-0A-33   (hex)               D-Link International\r
+340A33     (base 16)           D-Link International\r
+                               1 Internal Business Park, #03-12,The Synergy, Singapore\r
+                               Singapore  Singapore  609917\r
+                               SG\r
+\r
+84-D8-1B   (hex)               TP-LINK TECHNOLOGIES CO.,LTD.\r
+84D81B     (base 16)           TP-LINK TECHNOLOGIES CO.,LTD.\r
+                               Building 24(floors 1,3,4,5)and 28(floors 1-4)Central Science and Technology Park,Shennan Road,Nanshan\r
+                               Shenzhen  Guangdong  518057\r
+                               CN\r
+\r
+7C-2A-DB   (hex)               Xiaomi Communications Co Ltd\r
+7C2ADB     (base 16)           Xiaomi Communications Co Ltd\r
+                               The Rainbow City of China Resources\r
+                               NO.68, Qinghe Middle Street  Haidian District, Beijing  100085\r
+                               CN\r
+\r
+E8-A2-45   (hex)               Juniper Networks\r
+E8A245     (base 16)           Juniper Networks\r
+                               1133 Innovation Way\r
+                               Sunnyvale  CA  94089\r
+                               US\r
+\r
+88-29-49   (hex)               Renesas Electronics (Penang) Sdn. Bhd.\r
+882949     (base 16)           Renesas Electronics (Penang) Sdn. Bhd.\r
+                               Phase 3, Bayan Lepas FIZ\r
+                               Bayan Lepas  Penang  11900\r
+                               MY\r
+\r
+F8-64-B8   (hex)               zte corporation\r
+F864B8     (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
+14-51-20   (hex)               Huawei Device Co., Ltd.\r
+145120     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+C0-D1-93   (hex)               Huawei Device Co., Ltd.\r
+C0D193     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+3C-84-6A   (hex)               TP-LINK TECHNOLOGIES CO.,LTD.\r
+3C846A     (base 16)           TP-LINK TECHNOLOGIES CO.,LTD.\r
+                               Building 24(floors 1,3,4,5)and 28(floors 1-4)Central Science and Technology Park,Shennan Road,Nanshan\r
+                               Shenzhen  Guangdong  518057\r
+                               CN\r
+\r
+78-04-E3   (hex)               Huawei Device Co., Ltd.\r
+7804E3     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+A4-3B-0E   (hex)               Huawei Device Co., Ltd.\r
+A43B0E     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+24-A1-60   (hex)               Espressif Inc.\r
+24A160     (base 16)           Espressif Inc.\r
+                               Room 204, Building 2, 690 Bibo Rd, Pudong New Area\r
+                               Shanghai  Shanghai  201203\r
+                               CN\r
+\r
+DC-AE-EB   (hex)               Ruckus Wireless\r
+DCAEEB     (base 16)           Ruckus Wireless\r
+                               350 West Java Drive\r
+                               Sunnyvale  CA  94089\r
+                               US\r
+\r
+24-81-C7   (hex)               Huawei Device Co., Ltd.\r
+2481C7     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+FC-86-2A   (hex)               Huawei Device Co., Ltd.\r
+FC862A     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+1C-3D-2F   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+1C3D2F     (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-75-3E   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+EC753E     (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-91-64   (hex)               ChongQing Lavid Technology Co., Ltd.\r
+909164     (base 16)           ChongQing Lavid Technology Co., Ltd.\r
+                               Plant No. 3, Block M2, Photoelectric Park, Wuqiao Lianhe Economic Development Zone, Wanzhou District\r
+                               Chongqing    404100\r
+                               CN\r
+\r
+EC-DB-86   (hex)               API-K\r
+ECDB86     (base 16)           API-K\r
+                               ZA Tire Poix\r
+                               Saint Vincent de Mercuze  Isère  38660\r
+                               FR\r
+\r
+48-43-DD   (hex)               Amazon Technologies Inc.\r
+4843DD     (base 16)           Amazon Technologies Inc.\r
+                               P.O Box 8102\r
+                               Reno  NV  89507\r
+                               US\r
+\r
+08-38-69   (hex)               Hong Kong AMobile Intelligent Corp. Limited Taiwan Branch\r
+083869     (base 16)           Hong Kong AMobile Intelligent Corp. Limited Taiwan Branch\r
+                               8F.-1, No.700, Zhongzheng Rd., Zhonghe Dist.\r
+                               New Taipei City 235    23552\r
+                               TW\r
+\r
+D8-9E-D4   (hex)               Fiberhome Telecommunication Technologies Co.,LTD\r
+D89ED4     (base 16)           Fiberhome Telecommunication Technologies Co.,LTD\r
+                               No.5 DongXin Road\r
+                               Wuhan  Hubei  430074\r
+                               CN\r
+\r
+84-03-28   (hex)               Juniper Networks\r
+840328     (base 16)           Juniper Networks\r
+                               1133 Innovation Way\r
+                               Sunnyvale  CA  94089\r
+                               US\r
+\r
+08-9B-B9   (hex)               Nokia\r
+089BB9     (base 16)           Nokia\r
+                               Karaportti 3\r
+                               Espoo  Finland  02610\r
+                               FI\r
+\r
+00-1C-FC   (hex)               Sumitomo Electric Industries, Ltd\r
+001CFC     (base 16)           Sumitomo Electric Industries, Ltd\r
+                               1-1-3, Shimaya, Konohana-ku\r
+                               Osaka    554-0024\r
+                               JP\r
+\r
+00-16-36   (hex)               Quanta Computer Inc.\r
+001636     (base 16)           Quanta Computer Inc.\r
+                               No. 211, Wen Hwa 2Rd., Kuei Shan Hsiang\r
+                               Tao Yuan Shien    0000\r
+                               TW\r
+\r
+54-F1-5F   (hex)               Sichuan AI-Link Technology Co., Ltd.\r
+54F15F     (base 16)           Sichuan AI-Link Technology Co., Ltd.\r
+                               Anzhou, Industrial Park\r
+                               Mianyang  Sichuan  622650\r
+                               CN\r
+\r
+E0-79-C4   (hex)               iRay Technology Company Limited\r
+E079C4     (base 16)           iRay Technology Company Limited\r
+                               Building 45, No. 1000, Jinhai RD., Pudong New Area\r
+                               Shanghai    201206\r
+                               CN\r
+\r
+88-40-67   (hex)               infomark\r
+884067     (base 16)           infomark\r
+                               3F. Humaxvillage, 216 Hwangsaeul-ro\r
+                               Seongnam-si    13595\r
+                               KR\r
+\r
+AC-95-72   (hex)               Jovision Technology Co., Ltd.\r
+AC9572     (base 16)           Jovision Technology Co., Ltd.\r
+                               Floor 12, Building 3, Aosheng Square, No.1166 Xinluo Street\r
+                               Jinan  Shandong  250101\r
+                               CN\r
+\r
+40-D2-5F   (hex)               ITEL MOBILE LIMITED\r
+40D25F     (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
+A8-03-2A   (hex)               Espressif Inc.\r
+A8032A     (base 16)           Espressif Inc.\r
+                               Room 204, Building 2, 690 Bibo Rd, Pudong New Area\r
+                               Shanghai  Shanghai  201203\r
+                               CN\r
+\r
+00-19-F5   (hex)               Imagination Technologies Ltd\r
+0019F5     (base 16)           Imagination Technologies Ltd\r
+                               Home Park Estate\r
+                               Kings Langley  Hertfordshire  WD4 8LZ\r
+                               GB\r
+\r
+00-CB-BD   (hex)               Cambridge Broadband Networks Group\r
+00CBBD     (base 16)           Cambridge Broadband Networks Group\r
+                               1 Hammersmith Broadway\r
+                               London    W6 9DL\r
+                               GB\r
+\r
+58-94-A2   (hex)               KETEK GmbH\r
+5894A2     (base 16)           KETEK GmbH\r
+                               Hofer Str. 3\r
+                               München    81737\r
+                               DE\r
+\r
+4C-22-19   (hex)               YUANFUDAO HK LIMTED\r
+4C2219     (base 16)           YUANFUDAO HK LIMTED\r
+                               Building C, global creative center, No. 10, Furong street\r
+                               Beijing    100102\r
+                               CN\r
+\r
+54-D9-C6   (hex)               Huawei Device Co., Ltd.\r
+54D9C6     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+30-8A-F7   (hex)               Huawei Device Co., Ltd.\r
+308AF7     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+64-E7-D8   (hex)               Samsung Electronics Co.,Ltd\r
+64E7D8     (base 16)           Samsung Electronics Co.,Ltd\r
+                               129, Samsung-ro, Youngtongl-Gu\r
+                               Suwon  Gyeonggi-Do  16677\r
+                               KR\r
+\r
+D8-EF-42   (hex)               Huawei Device Co., Ltd.\r
+D8EF42     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+80-CC-12   (hex)               Huawei Device Co., Ltd.\r
+80CC12     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+18-AA-0F   (hex)               Huawei Device Co., Ltd.\r
+18AA0F     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+B0-A4-60   (hex)               Intel Corporate\r
+B0A460     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+AC-9A-96   (hex)               Maxlinear, Inc\r
+AC9A96     (base 16)           Maxlinear, Inc\r
+                               Am Campeon 3\r
+                               Neubiberg  Bavaria  85579\r
+                               DE\r
+\r
+8C-70-86   (hex)               Gesellschaft für Sonder-EDV-Anlagen mbH\r
+8C7086     (base 16)           Gesellschaft für Sonder-EDV-Anlagen mbH\r
+                               Lorsbacher Straße 31\r
+                               Hofheim    65719\r
+                               DE\r
+\r
+1C-28-AF   (hex)               Aruba, a Hewlett Packard Enterprise Company\r
+1C28AF     (base 16)           Aruba, a Hewlett Packard Enterprise Company\r
+                               3333 Scott Blvd\r
+                               Santa Clara  CA  95054\r
+                               US\r
+\r
+E4-24-6C   (hex)               Zhejiang Dahua Technology Co., Ltd.\r
+E4246C     (base 16)           Zhejiang Dahua Technology Co., Ltd.\r
+                               No.1199,Waterfront Road \r
+                               Hangzhou  Zhejiang  310053\r
+                               CN\r
+\r
+E8-EB-1B   (hex)               Microchip Technology Inc.\r
+E8EB1B     (base 16)           Microchip Technology Inc.\r
+                               2355 W. Chandler Blvd.\r
+                               Chandler  AZ  85224\r
+                               US\r
+\r
+84-02-83   (hex)               HUMAX Co., Ltd.\r
+840283     (base 16)           HUMAX Co., Ltd.\r
+                               HUMAX Village, 216, Hwangsaeul-ro, Bu\r
+                               Seongnam-si  Gyeonggi-do  463-875\r
+                               KR\r
+\r
+94-17-00   (hex)               Xiaomi Communications Co Ltd\r
+941700     (base 16)           Xiaomi Communications Co Ltd\r
+                               The Rainbow City of China Resources\r
+                               NO.68, Qinghe Middle Street  Haidian District, Beijing  100085\r
+                               CN\r
+\r
+68-D6-ED   (hex)               GooWi Wireless Technology Co., Limited\r
+68D6ED     (base 16)           GooWi Wireless Technology Co., Limited\r
+                               RM402 Building212, Tairan Technology Park, Futian District\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+00-E4-06   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+00E406     (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
+44-22-7C   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+44227C     (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
+CC-B1-82   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+CCB182     (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
+48-90-2F   (hex)               LG Electronics (Mobile Communications)\r
+48902F     (base 16)           LG Electronics (Mobile Communications)\r
+                               60-39, Gasan-dong, Geumcheon-gu\r
+                               Seoul    153-801\r
+                               KR\r
+\r
+28-B7-7C   (hex)               IEEE Registration Authority\r
+28B77C     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+28-C2-1F   (hex)               SAMSUNG ELECTRO-MECHANICS(THAILAND)\r
+28C21F     (base 16)           SAMSUNG ELECTRO-MECHANICS(THAILAND)\r
+                               93Moo5T. Bangsamak SEMTHAI, WELLGROW INDUSTRIAL ESTATE\r
+                               Bangpakong  Chachoengsao  24180\r
+                               TH\r
+\r
+5C-7D-7D   (hex)               Technicolor CH USA Inc.\r
+5C7D7D     (base 16)           Technicolor CH USA Inc.\r
+                               5030 Sugarloaf Parkway Bldg 6 \r
+                               Lawrenceville  GA  30044\r
+                               US\r
+\r
+B0-7D-64   (hex)               Intel Corporate\r
+B07D64     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3 \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+F4-BF-A8   (hex)               Juniper Networks\r
+F4BFA8     (base 16)           Juniper Networks\r
+                               1133 Innovation Way\r
+                               Sunnyvale  CA  94089\r
+                               US\r
+\r
+C0-61-9A   (hex)               IEEE Registration Authority\r
+C0619A     (base 16)           IEEE Registration Authority\r
                                445 Hoes Lane\r
                                Piscataway  NJ  08554\r
                                US\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
+                               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
+                               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
index 319fc7d8de9bf27c33f034d8a0beb92824a68cee..d46c9dabde20418509e7b8dac0f8d004efe3d965 100644 (file)
@@ -929,9 +929,6 @@ B4-4B-D6   (hex)            G4S Monitoring Technologies Ltd
                                Leicester  Leicestershire  LE19 1TP\r
                                GB\r
 \r
-D0-D9-4F   (hex)               Private\r
-700000-7FFFFF     (base 16)            Private\r
-\r
 D4-7C-44   (hex)               SHENZHEN ANYSEC TECHNOLOGY CO. LTD\r
 E00000-EFFFFF     (base 16)            SHENZHEN ANYSEC TECHNOLOGY CO. LTD\r
                                601, 1 BUILDING,MeiLin Dolly Industrial Zone,Futian District\r
@@ -1331,12 +1328,6 @@ EC-9F-0D   (hex)         WisIOE
                                Shenzhen  Guangdong  518000\r
                                CN\r
 \r
-AC-1D-DF   (hex)               Fine Inc.\r
-B00000-BFFFFF     (base 16)            Fine Inc.\r
-                               Rm 2208, U-Tower, 120 HeungDeok JungAng-ro, GiHeung-Gu\r
-                               YongIn-si  Gyeonggi-do  16950\r
-                               KR\r
-\r
 AC-1D-DF   (hex)               Elekon AG\r
 D00000-DFFFFF     (base 16)            Elekon AG\r
                                Cheerstrasse 16\r
@@ -3710,12 +3701,6 @@ F4-90-CB   (hex)         TEQ SA
                                Barbengo  Ticino  6917\r
                                CH\r
 \r
-9C-43-1E   (hex)               Midas Technology, Inc. dba Stem Audio / Phoenix Au\r
-E00000-EFFFFF     (base 16)            Midas Technology, Inc. dba Stem Audio / Phoenix Au\r
-                               2552 White Road, Suite A\r
-                               Irvine  CA  92614\r
-                               US\r
-\r
 E8-B4-70   (hex)               YAWATA ELECTRIC INDUSTRIAL CO.,LTD.\r
 400000-4FFFFF     (base 16)            YAWATA ELECTRIC INDUSTRIAL CO.,LTD.\r
                                1-17-1 Ohmorihigashi\r
@@ -3740,11 +3725,248 @@ E8-B4-70   (hex)               Tibit Communications
                                Shanghai    201702\r
                                CN\r
 \r
-94-FB-A7   (hex)               Creotech Instruments S.A.\r
-D00000-DFFFFF     (base 16)            Creotech Instruments S.A.\r
-                               ul. Gen. L. Okulickiego 7/9\r
-                               Piaseczno  Mazovia  05-500\r
-                               PL\r
+94-FB-A7   (hex)               UOI TECHNOLOGY CORPORATION\r
+400000-4FFFFF     (base 16)            UOI TECHNOLOGY CORPORATION\r
+                               1F., No. 50, Ln. 148, Lide St.\r
+                               Zhonghe Dist.  New Taipei City  23512\r
+                               TW\r
+\r
+94-FB-A7   (hex)               Reichert Inc.\r
+000000-0FFFFF     (base 16)            Reichert Inc.\r
+                               3362 Walden Ave\r
+                               Depew  NY  14043\r
+                               US\r
+\r
+38-F7-CD   (hex)               VANGUARD\r
+300000-3FFFFF     (base 16)            VANGUARD\r
+                               1st Floor 3 Moore \r
+                               London    SE1 2RE\r
+                               GB\r
+\r
+38-F7-CD   (hex)               RIPower Co.,Ltd\r
+200000-2FFFFF     (base 16)            RIPower Co.,Ltd\r
+                               3F,1,Bongeunsa-ro 44-gil, Gangnam-gu\r
+                               Seoul    06143\r
+                               KR\r
+\r
+38-F7-CD   (hex)               Fibergate Inc.\r
+B00000-BFFFFF     (base 16)            Fibergate Inc.\r
+                               KDX Shibadaimon.Bld 2F 2-10-12 Shibadaimon\r
+                               Tokyo  Minato-ku  1050012\r
+                               JP\r
+\r
+38-F7-CD   (hex)               Fast Cotton(Beijing) Limited\r
+600000-6FFFFF     (base 16)            Fast Cotton(Beijing) Limited\r
+                               Fast Cotton(Beijing)Limited\r
+                               Beijing  Beijing  100037\r
+                               CN\r
+\r
+9C-43-1E   (hex)               Phoenix Audio Technologies\r
+E00000-EFFFFF     (base 16)            Phoenix Audio Technologies\r
+                               2552 White Road, Suite A\r
+                               Irvine  CA  92614\r
+                               US\r
+\r
+70-69-79   (hex)               Rivian Automotive LLC\r
+C00000-CFFFFF     (base 16)            Rivian Automotive LLC\r
+                               13250 N. Haggerty Road\r
+                               Plymouth  MI  48170\r
+                               US\r
+\r
+70-69-79   (hex)               Foxconn Brasil Industria e Comercio Ltda\r
+A00000-AFFFFF     (base 16)            Foxconn Brasil Industria e Comercio Ltda\r
+                               Av. Marginal da Rodovia dos Bandeirantes, 800 - Distrito Industrial\r
+                               Jundiaí  Sao Paulo  13213-008\r
+                               BR\r
+\r
+70-69-79   (hex)               SelectTech GeoSpatial, LLC\r
+400000-4FFFFF     (base 16)            SelectTech GeoSpatial, LLC\r
+                               8045 Washington Village Dr.\r
+                               Centerville  OH  45458\r
+                               US\r
+\r
+F0-D7-AF   (hex)               720?bei jing?Health iTech Co.,Ltd\r
+300000-3FFFFF     (base 16)            720?bei jing?Health iTech Co.,Ltd\r
+                               Room 9001, D Building, Kangjianbaosheng Plaza, No.8 Heiquan Road, Haidian District, Beijing\r
+                               bei jing    100085\r
+                               CN\r
+\r
+F0-D7-AF   (hex)               EVCO SPA\r
+B00000-BFFFFF     (base 16)            EVCO SPA\r
+                               VIA FELTRE N. 81\r
+                               SEDICO  BELLUNO  32036\r
+                               IT\r
+\r
+AC-1D-DF   (hex)               FINEpowerX INC\r
+B00000-BFFFFF     (base 16)            FINEpowerX INC\r
+                               Rm 2208, U-Tower, 120 HeungDeok JungAng-ro, GiHeung-Gu\r
+                               YongIn-si  Gyeonggi-do  16950\r
+                               KR\r
+\r
+F0-D7-AF   (hex)               Shenzhen Virtual Clusters Information Technology Co.,Ltd.\r
+C00000-CFFFFF     (base 16)            Shenzhen Virtual Clusters Information Technology Co.,Ltd.\r
+                               Room 201,Building A,No.1,Qianhai 1st Road,Shengang cooperation zone,Qianhai\r
+                               Shenzhen    518054\r
+                               CN\r
+\r
+F0-D7-AF   (hex)               Rievtech Electronic Co.,Ltd \r
+700000-7FFFFF     (base 16)            Rievtech Electronic Co.,Ltd \r
+                               Room 505, Building A, No.88,Dazhou Road,Tiexinqiao,Yu huatai District, Nanjing City, Jiangsu Province,P.R.China +0086 25 52895099                 52890138 info@rievtech.com sales@rievtech.com\r
+                               Nanjing City  Jiangsu Province  210000\r
+                               CN\r
+\r
+30-49-50   (hex)               ATLI WORLD LIMITED\r
+100000-1FFFFF     (base 16)            ATLI WORLD LIMITED\r
+                               306 Beverley Commercial Center, 87-105 Chatham Road, TST,\r
+                               Kowloon  Hong Kong  852\r
+                               HK\r
+\r
+30-49-50   (hex)               Ledworks SRL\r
+A00000-AFFFFF     (base 16)            Ledworks SRL\r
+                               Via Tortona 37\r
+                               Milano  Milano  20144\r
+                               IT\r
+\r
+30-49-50   (hex)               Sercomm Corporation.\r
+200000-2FFFFF     (base 16)            Sercomm Corporation.\r
+                               3F,No.81,Yu-Yih Rd.,Chu-Nan Chen\r
+                               Miao-Lih Hsuan    115\r
+                               TW\r
+\r
+30-49-50   (hex)               Anacove LLC\r
+C00000-CFFFFF     (base 16)            Anacove LLC\r
+                               7856 Revelle drive\r
+                               LA JOLLA  CA  92037\r
+                               US\r
+\r
+D0-14-11   (hex)               powerall\r
+400000-4FFFFF     (base 16)            powerall\r
+                               75,Ojeong-ro,Bucheon-si,Gyeonggi-do,Republic of korea\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
+                               TERRANUOVA BRACCIOLINI  AREZZO  52028\r
+                               IT\r
+\r
+D0-D9-4F   (hex)               Mitsubishi Electric US, Inc.\r
+700000-7FFFFF     (base 16)            Mitsubishi Electric US, Inc.\r
+                               1340 Satellite Boulevard\r
+                               Suwanee  GA  30345\r
+                               US\r
+\r
+D0-14-11   (hex)               Airthings\r
+900000-9FFFFF     (base 16)            Airthings\r
+                               Wergelandsveien 7\r
+                               Oslo    0167\r
+                               NO\r
+\r
+5C-85-7E   (hex)               Shenzhen IP3 Century Intelligent Technology CO.,Ltd\r
+400000-4FFFFF     (base 16)            Shenzhen IP3 Century Intelligent Technology CO.,Ltd\r
+                               aiying.li@ip3-tech.com\r
+                               Shenzhen    518057\r
+                               CN\r
+\r
+5C-85-7E   (hex)               Shanghai Yanhe automation technology co.,LTD\r
+500000-5FFFFF     (base 16)            Shanghai Yanhe automation technology co.,LTD\r
+                               Room E2204, Building 1, 5500 Yuan Jiang Road, MinHang District\r
+                               ShangHai    201100\r
+                               CN\r
+\r
+F4-69-D5   (hex)               ShenZhenShi EVADA technology Co.,Ltd\r
+A00000-AFFFFF     (base 16)            ShenZhenShi EVADA technology Co.,Ltd\r
+                               Qianhai,No.1 qianwan Road\r
+                               ShenZhen  Guangdong  518000\r
+                               CN\r
+\r
+F4-69-D5   (hex)               Mossman Limited\r
+000000-0FFFFF     (base 16)            Mossman Limited\r
+                               1014, 10/F, Leader Industrial Building,\r
+                               57-59 Au Pui Wan Street, Fotan, Shatin  Hong Kong  NT\r
+                               HK\r
+\r
+5C-85-7E   (hex)               ProdataKey\r
+600000-6FFFFF     (base 16)            ProdataKey\r
+                               67 W 13490 S\r
+                               Draper  UT  84020\r
+                               US\r
+\r
+F4-69-D5   (hex)               Huaqin Telecom Technology Co.,Ltd.\r
+C00000-CFFFFF     (base 16)            Huaqin Telecom Technology Co.,Ltd.\r
+                               Building 1,No.399, Keyuan Road, Pudong, Shanghai China\r
+                               Shanghai    200120\r
+                               CN\r
+\r
+F4-69-D5   (hex)               Pulsar Engineering srl\r
+200000-2FFFFF     (base 16)            Pulsar Engineering srl\r
+                               Via Giuseppe Caimi\r
+                               Milano  MI  20136\r
+                               IT\r
+\r
+F4-69-D5   (hex)               Rosco, Inc\r
+700000-7FFFFF     (base 16)            Rosco, Inc\r
+                               90-21 144th Place\r
+                               Jamaica  NY  11435\r
+                               US\r
+\r
+4C-93-A6   (hex)               4D Sistem Ticaret A.S.\r
+400000-4FFFFF     (base 16)            4D Sistem Ticaret A.S.\r
+                               Oran Mah. Turan Gunes Bul. Park Oran Ofis 180-Y No:6 Cankaya \r
+                               ANKARA    06550\r
+                               TR\r
+\r
+4C-93-A6   (hex)               Private\r
+500000-5FFFFF     (base 16)            Private\r
+\r
+4C-93-A6   (hex)               Diehl Controls Nanjing Co., Ltd.\r
+200000-2FFFFF     (base 16)            Diehl Controls Nanjing Co., Ltd.\r
+                               Jiangjun Avenue 139\r
+                               Nanjing  Jiangsu  211100\r
+                               CN\r
+\r
+28-B7-7C   (hex)               Shenzhen PUAS Industrial Co.,LTD\r
+800000-8FFFFF     (base 16)            Shenzhen PUAS Industrial Co.,LTD\r
+                               2/F, C/Building, Huawang Industrial Park, LongHua New Area In Shenzhen 518106 P.R.C\r
+                               Shenzhen  Guangdong  518106\r
+                               CN\r
+\r
+4C-93-A6   (hex)               Commsignia, Ltd.\r
+300000-3FFFFF     (base 16)            Commsignia, Ltd.\r
+                               Irinyi Jozsef u 4-20\r
+                               Budapest    1117\r
+                               HU\r
+\r
+28-B7-7C   (hex)               SolarEdge Technologies\r
+100000-1FFFFF     (base 16)            SolarEdge Technologies\r
+                               1 Abba Eban St.\r
+                               Herzelia    46725\r
+                               IL\r
+\r
+C0-61-9A   (hex)               Nanjing Balance Network Technology Co., Ltd\r
+500000-5FFFFF     (base 16)            Nanjing Balance Network Technology Co., Ltd\r
+                               9-10/F,building 01, No.8,Bailongjiang East Street,Jianye District\r
+                               Nanjing  Jiangsu  210017\r
+                               CN\r
+\r
+C0-61-9A   (hex)               MAD PIECE LLC.\r
+700000-7FFFFF     (base 16)            MAD PIECE LLC.\r
+                               2196 flatbush ave.\r
+                               BROOKLYN  NY  11234\r
+                               US\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
 4C-4B-F9   (hex)               Shenzhen dingsheng technology co., LTD\r
 400000-4FFFFF     (base 16)            Shenzhen dingsheng technology co., LTD\r
@@ -3836,9 +4058,6 @@ C00000-CFFFFF     (base 16)               Shenzhen Xtooltech Co., Ltd
                                Panama  Panama  33131\r
                                PA\r
 \r
-24-15-10   (hex)               Private\r
-800000-8FFFFF     (base 16)            Private\r
-\r
 24-15-10   (hex)               SMaBiT GmbH\r
 100000-1FFFFF     (base 16)            SMaBiT GmbH\r
                                Friedrichstrasse 95\r
@@ -7253,6 +7472,210 @@ D00000-DFFFFF     (base 16)             Medica Corporation
                                Bedford  MA  01730\r
                                US\r
 \r
+94-FB-A7   (hex)               Sercomm Corporation.\r
+600000-6FFFFF     (base 16)            Sercomm Corporation.\r
+                               3F,No.81,Yu-Yih Rd.,Chu-Nan Chen\r
+                               Miao-Lih Hsuan    115\r
+                               TW\r
+\r
+94-FB-A7   (hex)               GUANG DONG TAKSTAR ELECTRONIC CO.,LTD.\r
+300000-3FFFFF     (base 16)            GUANG DONG TAKSTAR ELECTRONIC CO.,LTD.\r
+                               Dinggang,Group 5, Xialiao Village,Longxi Town, Boluo County\r
+                               Huizhou City  Guangdong  516121\r
+                               CN\r
+\r
+94-FB-A7   (hex)               Solaborate Inc.\r
+C00000-CFFFFF     (base 16)            Solaborate Inc.\r
+                               #283 - 8300 Utica Ave\r
+                               Rancho Cucamonga  CA  91730\r
+                               US\r
+\r
+94-FB-A7   (hex)               CAVITY EYE\r
+500000-5FFFFF     (base 16)            CAVITY EYE\r
+                               Ébner György köz 4.\r
+                               Budaörs    2040\r
+                               HU\r
+\r
+94-FB-A7   (hex)               Shenzhen Golden Star Technology Ltd\r
+B00000-BFFFFF     (base 16)            Shenzhen Golden Star Technology Ltd\r
+                               Rm.622,building B,MingYou Industrial products Exhibition&Procurement center, Baoyuan Road,Xixiang,Bao’an District,\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+38-F7-CD   (hex)               NZIA Connect Inc\r
+100000-1FFFFF     (base 16)            NZIA Connect Inc\r
+                               1109 ho, Bupyeong tech city Bld, 293 Bupyeong-daero, Bupyeong-gu\r
+                               Incheon    21315\r
+                               KR\r
+\r
+94-FB-A7   (hex)               Anvil Systems Group, Inc.\r
+700000-7FFFFF     (base 16)            Anvil Systems Group, Inc.\r
+                               8211 Terminal Road, Suite 1900\r
+                               Lorton   VA  22079\r
+                               US\r
+\r
+38-F7-CD   (hex)               Distech Controls\r
+A00000-AFFFFF     (base 16)            Distech Controls\r
+                               4205 place de Java\r
+                               Brossard  QC  J4Y 0C4\r
+                               CA\r
+\r
+70-69-79   (hex)               Graphcore Ltd\r
+200000-2FFFFF     (base 16)            Graphcore Ltd\r
+                               11-19 Wine Street\r
+                               Bristol    BS1 2PH\r
+                               GB\r
+\r
+CC-C2-61   (hex)               Ability Enterprise Co., Ltd\r
+700000-7FFFFF     (base 16)            Ability Enterprise Co., Ltd\r
+                               No. 200, Sec. 3, Zhonghuan Rd., Xinzhuang Dist., New Taipei City 24242, Taiwan (R.O.C.)\r
+                               Taipei    24242\r
+                               TW\r
+\r
+CC-C2-61   (hex)               EDAG Engineering GmbH\r
+400000-4FFFFF     (base 16)            EDAG Engineering GmbH\r
+                               Dr.- Ludwig-Kraus-Str. 2\r
+                               Gaimersheim  Bavaria  85080\r
+                               DE\r
+\r
+70-69-79   (hex)               Hebei Baina Xinda Technology Co., Ltd.\r
+300000-3FFFFF     (base 16)            Hebei Baina Xinda Technology Co., Ltd.\r
+                               Building C, e-commerce Industrial Park, Xianghe robot Town\r
+                               Langfang City  Hebei Province  065400\r
+                               CN\r
+\r
+F0-D7-AF   (hex)               Dongguan Gedi Electrons Techeology Co.,LTD\r
+D00000-DFFFFF     (base 16)            Dongguan Gedi Electrons Techeology Co.,LTD\r
+                               Dongguan Gedi Electrons Techeology Co.,LTD\r
+                               Dongguan  Guangdong  523000\r
+                               CN\r
+\r
+F0-D7-AF   (hex)               ID Tech Japan Co.,Ltd.\r
+000000-0FFFFF     (base 16)            ID Tech Japan Co.,Ltd.\r
+                               Matsumura BLDG, 2-2-23,Shibazaki-cho, Tachikawa-shi\r
+                               Tokyo  Japan  1900023\r
+                               JP\r
+\r
+F0-D7-AF   (hex)               Beijing Serviatech lnformation Tech Co.,Ltd\r
+100000-1FFFFF     (base 16)            Beijing Serviatech lnformation Tech Co.,Ltd\r
+                               Floor?Building17 NO.1A?Chaoqian Rd?Changping?Beijing\r
+                               Beijing    102200\r
+                               CN\r
+\r
+F0-D7-AF   (hex)               Wren Associates, LTD\r
+E00000-EFFFFF     (base 16)            Wren Associates, LTD\r
+                               124 Wren Parkway\r
+                               Jefferson City  MO  65109-6332\r
+                               US\r
+\r
+30-49-50   (hex)               HANGZHOU EV-TECH CO.,LTD\r
+B00000-BFFFFF     (base 16)            HANGZHOU EV-TECH CO.,LTD\r
+                               No. 205, Zhenzhong Road, Xihu District\r
+                               HANGZHOU  ZHEJIANG  310012\r
+                               CN\r
+\r
+30-49-50   (hex)               Curb, Inc.\r
+600000-6FFFFF     (base 16)            Curb, Inc.\r
+                               1524 S IH35, Suite 345, Apt 134\r
+                               Austin  TX  78704\r
+                               US\r
+\r
+30-49-50   (hex)               Shanghai gatang technology CO.,LTD\r
+900000-9FFFFF     (base 16)            Shanghai gatang technology CO.,LTD\r
+                               Room 507, building 1, No. 2071, Hongmei Road, Xuhui District, \r
+                               Shanghai    200030\r
+                               CN\r
+\r
+5C-85-7E   (hex)               Annapurna labs\r
+C00000-CFFFFF     (base 16)            Annapurna labs\r
+                               Matam Scientific Industries Center,   Building 8.2\r
+                               Mail box 15123  Haifa  3508409\r
+                               IL\r
+\r
+5C-85-7E   (hex)               mobilogix HongKong\r
+200000-2FFFFF     (base 16)            mobilogix HongKong\r
+                               Limited Flat/RM 705A, 7/F, New East Ocean Centre No. 9 Science Museum Road Kowloon\r
+                               Hong Kong    000000\r
+                               CN\r
+\r
+F4-69-D5   (hex)               Terminus (Shanghai) Technology Co.,Ltd.\r
+900000-9FFFFF     (base 16)            Terminus (Shanghai) Technology Co.,Ltd.\r
+                               17F,building 2,CES west bund center,No.277 longlan road,xuhui,district\r
+                               Shanghai    200232\r
+                               CN\r
+\r
+4C-93-A6   (hex)               Vestaboard, Inc.\r
+000000-0FFFFF     (base 16)            Vestaboard, Inc.\r
+                               1777 Yosemite Avenue STE 220\r
+                               San Francisco  CA  94124\r
+                               US\r
+\r
+4C-93-A6   (hex)               Sercomm Corporation.\r
+800000-8FFFFF     (base 16)            Sercomm Corporation.\r
+                               3F,No.81,Yu-Yih Rd.,Chu-Nan Chen\r
+                               Miao-Lih Hsuan    115\r
+                               TW\r
+\r
+4C-93-A6   (hex)               5Voxel Co., Ltd.\r
+700000-7FFFFF     (base 16)            5Voxel Co., Ltd.\r
+                               6F-2, No.273, Nong-an St.\r
+                               Taipei City    10482\r
+                               TW\r
+\r
+24-15-10   (hex)               Medicomp, Inc\r
+800000-8FFFFF     (base 16)            Medicomp, Inc\r
+                               \r
+                                   \r
+                               \r
+\r
+28-B7-7C   (hex)               Annapurna labs\r
+400000-4FFFFF     (base 16)            Annapurna labs\r
+                               Matam Scientific Industries Center,   Building 8.2\r
+                               Mail box 15123  Haifa  3508409\r
+                               IL\r
+\r
+28-B7-7C   (hex)               Zhuhai RongBang Electronic Technology Co., Ltd.\r
+200000-2FFFFF     (base 16)            Zhuhai RongBang Electronic Technology Co., Ltd.\r
+                               Room 110-400(central office) , building 18, Creative Valley, 1889 Huandao East road, Hengqin New District,\r
+                               Zhuhai  GuangDong  519000\r
+                               CN\r
+\r
+4C-93-A6   (hex)               Shandong Senter Electronic Co., Ltd\r
+600000-6FFFFF     (base 16)            Shandong Senter Electronic Co., Ltd\r
+                               No. 18 Liuyishan Road, New&High-tech area\r
+                               Zibo  Shandong  255086\r
+                               CN\r
+\r
+4C-93-A6   (hex)               CELLTRON\r
+E00000-EFFFFF     (base 16)            CELLTRON\r
+                               #601 L&C TOWER, 153-18 LS-ro,Sanbon\r
+                               Gunpo  Gyeonggi  15808\r
+                               KR\r
+\r
+28-B7-7C   (hex)               Convertertec Deutschland GmbH\r
+700000-7FFFFF     (base 16)            Convertertec Deutschland GmbH\r
+                               Krefelder Weg 47\r
+                               Kempen    47906\r
+                               DE\r
+\r
+C0-61-9A   (hex)               Wingtech Mobile Communications  Co.,Ltd.\r
+900000-9FFFFF     (base 16)            Wingtech Mobile Communications  Co.,Ltd.\r
+                               No.777,Yazhong Road,Nanhu District\r
+                               Jiaxing  Zhejiang  314001\r
+                               CN\r
+\r
+C0-61-9A   (hex)               Nanjing SinoVatio Technology Co., Ltd\r
+800000-8FFFFF     (base 16)            Nanjing SinoVatio Technology Co., Ltd\r
+                               No. 888 Zhengfang Middle Rd, Jiangning District\r
+                               Nanjing  JiangSu  211153\r
+                               CN\r
+\r
+C0-61-9A   (hex)               Gronn Kontakt AS\r
+A00000-AFFFFF     (base 16)            Gronn Kontakt AS\r
+                               Kjøita 18\r
+                               Kristiansand    4630\r
+                               NO\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
@@ -10844,6 +11267,216 @@ E8-B4-70   (hex)              Alperia Fiber srl
                                Bolzano   bz  39100\r
                                IT\r
 \r
+70-69-79   (hex)               Linksys Telecom Shenzhen CO., LTD\r
+100000-1FFFFF     (base 16)            Linksys Telecom Shenzhen CO., LTD\r
+                               RoomC303-A, Number 2223 road Banxuegang Xinweizai Gangtou Community Bantian street\r
+                               Longgang Township  Guangdong  514349\r
+                               CN\r
+\r
+70-69-79   (hex)               FREUND ELEKTRONIKA D.O.O., IP-INTEGRA TECHNOLOGIES\r
+D00000-DFFFFF     (base 16)            FREUND ELEKTRONIKA D.O.O., IP-INTEGRA TECHNOLOGIES\r
+                               HAMDIJE KRESEVLJAKOVICA 18\r
+                               SARAJEVO    71000\r
+                               BA\r
+\r
+38-F7-CD   (hex)               APT MOBILE SATCOM LIMITED\r
+E00000-EFFFFF     (base 16)            APT MOBILE SATCOM LIMITED\r
+                               18th Floor, Building C, Shenye U Center, Zhoushi Road, Baoan District\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+CC-C2-61   (hex)               Nortek Security & Control\r
+C00000-CFFFFF     (base 16)            Nortek Security & Control\r
+                               5919 Sea Otter Place\r
+                               Carlsbad  CA  92010\r
+                               US\r
+\r
+CC-C2-61   (hex)               Guardiar USA\r
+600000-6FFFFF     (base 16)            Guardiar USA\r
+                               3309 S Kaufman St\r
+                               Ennis  TX  75119\r
+                               US\r
+\r
+CC-C2-61   (hex)               NWL Inc.\r
+100000-1FFFFF     (base 16)            NWL Inc.\r
+                               312 Rising Sun Road\r
+                               Bordentown  NJ  08505\r
+                               US\r
+\r
+CC-C2-61   (hex)               Winterthur Gas & Diesel Ltd.\r
+B00000-BFFFFF     (base 16)            Winterthur Gas & Diesel Ltd.\r
+                               Schützenstrasse 3\r
+                               Winterthur    8401\r
+                               CH\r
+\r
+CC-C2-61   (hex)               NETRADYNE, INC.\r
+300000-3FFFFF     (base 16)            NETRADYNE, INC.\r
+                               9191 TOWNE CENTRE DR STE 200\r
+                               SAN DIEGO  CA  92122\r
+                               US\r
+\r
+F0-D7-AF   (hex)               New IT Project LLC\r
+900000-9FFFFF     (base 16)            New IT Project LLC\r
+                               Nagatinskaya St. 16, bld. 9, space VII, room 15, office 5\r
+                               Moscow    115487\r
+                               RU\r
+\r
+F0-D7-AF   (hex)               Dongguan Huili electroacoustic Industrial Co.,ltd\r
+500000-5FFFFF     (base 16)            Dongguan Huili electroacoustic Industrial Co.,ltd\r
+                               Dalang Town, Biyun Cai Bai Cun East Second Street 66,A4 Building 501\r
+                               Dongguan  Guangdong  523770\r
+                               CN\r
+\r
+F0-D7-AF   (hex)               Blacknight Internet Solutions Limited\r
+200000-2FFFFF     (base 16)            Blacknight Internet Solutions Limited\r
+                               Unit 12a, Barrowside Business Park, Sleaty Rd.\r
+                               Carlow  Carlow  R93 X265\r
+                               IE\r
+\r
+F0-D7-AF   (hex)               MSTAR TECHNOLOGIES,INC\r
+A00000-AFFFFF     (base 16)            MSTAR TECHNOLOGIES,INC\r
+                               #998 West Wenyi Road\r
+                               Hangzhou  Zhejiang  310012\r
+                               CN\r
+\r
+30-49-50   (hex)               SHENZHEN LDROBOT CO., LTD.\r
+800000-8FFFFF     (base 16)            SHENZHEN LDROBOT CO., LTD.\r
+                               Nanshan\r
+                               Shenzhen    518000\r
+                               CN\r
+\r
+D0-14-11   (hex)               Video Security, Inc.\r
+800000-8FFFFF     (base 16)            Video Security, Inc.\r
+                               No. 59, Cinghua St. San Min Dist.\r
+                               Kaohsiung, Taiwan, R.O.C.  Kaohsiung City  807\r
+                               TW\r
+\r
+30-49-50   (hex)               Xio Research, Inc\r
+D00000-DFFFFF     (base 16)            Xio Research, Inc\r
+                               405 Lexington Avenue, Suite 3504\r
+                               New York  NY  10174\r
+                               US\r
+\r
+D0-14-11   (hex)               Realwave Inc.\r
+700000-7FFFFF     (base 16)            Realwave Inc.\r
+                               5857 Owens Avenue, Suite 300\r
+                               Carlsbad  CA  92008-5507\r
+                               US\r
+\r
+5C-85-7E   (hex)               HHCC Plant Technology Co., Ltd.\r
+B00000-BFFFFF     (base 16)            HHCC Plant Technology Co., Ltd.\r
+                               RM626, 6th Floor, Zhongguoleshili,’,#35 Xiaoyun Road, Chaoyang District,Beijing, China\r
+                               Beijing  Beijing  100028\r
+                               CN\r
+\r
+D0-14-11   (hex)               Tecnosoft srl\r
+E00000-EFFFFF     (base 16)            Tecnosoft srl\r
+                               via Galvani, 4\r
+                               Peschiera Borromeo  Milan  20068\r
+                               IT\r
+\r
+D0-14-11   (hex)               iLOQ Oy\r
+300000-3FFFFF     (base 16)            iLOQ Oy\r
+                               Yrttipellontie 10\r
+                               Oulu  EMEA  90230\r
+                               FI\r
+\r
+5C-85-7E   (hex)               28 Gorilla\r
+000000-0FFFFF     (base 16)            28 Gorilla\r
+                               12 S San Marcos Pl\r
+                               Chandler  AZ  85225\r
+                               US\r
+\r
+5C-85-7E   (hex)               BeiJing Xinsheng Technology Co.,Ltd\r
+800000-8FFFFF     (base 16)            BeiJing Xinsheng Technology Co.,Ltd\r
+                               1-1827, East (LIANHANG building), chaichangtun village, Yongledian Town, Tongzhou District\r
+                               BeiJing  BeiJing  250100\r
+                               CN\r
+\r
+F4-69-D5   (hex)               Konntek Inc\r
+B00000-BFFFFF     (base 16)            Konntek Inc\r
+                               3600 F-X Tessier, Unit #H\r
+                               Vaudreuil  Quebec  J7V 5V5\r
+                               CA\r
+\r
+F4-69-D5   (hex)               Hefei STAROT Technology Co.,Ltd\r
+500000-5FFFFF     (base 16)            Hefei STAROT Technology Co.,Ltd\r
+                               406, 4th Floor, Quality Control Building, Saipu Science Park, No. 6 Yunfei Road, High-tech Zone\r
+                               hefei  anhui  230000\r
+                               CN\r
+\r
+F4-69-D5   (hex)               ORtek Technology, Inc.\r
+E00000-EFFFFF     (base 16)            ORtek Technology, Inc.\r
+                               13F, no.150, Jian-Yi Rd., ZhongHe Dist.\r
+                               New Taipei City  Taiwan  23511\r
+                               TW\r
+\r
+F4-69-D5   (hex)               TianJin KCHT Information Technology Co., Ltd.\r
+600000-6FFFFF     (base 16)            TianJin KCHT Information Technology Co., Ltd.\r
+                               1704 Huicheng Technology Building, No. 65 Pioneer Road, Dongli District\r
+                               Tianjin    300000\r
+                               CN\r
+\r
+4C-93-A6   (hex)               Felten Electronics\r
+B00000-BFFFFF     (base 16)            Felten Electronics\r
+                               Wilhelmstrasse 43\r
+                               Aachen  NRW  52070\r
+                               DE\r
+\r
+4C-93-A6   (hex)               Advantics\r
+900000-9FFFFF     (base 16)            Advantics\r
+                               55C Rue Auguste Piccard\r
+                               Saint-Genis-Pouilly    01630\r
+                               FR\r
+\r
+28-B7-7C   (hex)               SHENZHEN EVIEW GPS TECHNOLOGY\r
+000000-0FFFFF     (base 16)            SHENZHEN EVIEW GPS TECHNOLOGY\r
+                               Rm 201, building 1-A, Nankechuang Industrial Park, Gaofeng Road, Longhua district\r
+                               Shenzhen  Guangdong  518109\r
+                               CN\r
+\r
+28-B7-7C   (hex)               Beijing Kitten&Puppy Technology Co.,Ltd.\r
+300000-3FFFFF     (base 16)            Beijing Kitten&Puppy Technology Co.,Ltd.\r
+                               Room Q-101? Floor 2?Q Area, Anningzhuang Back Street?Haidian District\r
+                               Beijing    100096\r
+                               CN\r
+\r
+28-B7-7C   (hex)               Simaudio Ltd\r
+A00000-AFFFFF     (base 16)            Simaudio Ltd\r
+                               1345 rue Newton\r
+                               Boucherville  Quebec  J4B 5H2\r
+                               CA\r
+\r
+28-B7-7C   (hex)               GROTHE GmbH\r
+500000-5FFFFF     (base 16)            GROTHE GmbH\r
+                               Loehestrasse 22\r
+                               Hennef    53773\r
+                               DE\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
+                               Greater Noida  Uttar Pradesh  201310\r
+                               IN\r
+\r
+C0-61-9A   (hex)               Stello\r
+400000-4FFFFF     (base 16)            Stello\r
+                               1041 Rue Parent\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
 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
@@ -14417,6 +15050,213 @@ A00000-AFFFFF     (base 16)           Inveo
                                Kozy    43-340\r
                                PL\r
 \r
+94-FB-A7   (hex)               Beijing Leja Tech co., Ltd.\r
+200000-2FFFFF     (base 16)            Beijing Leja Tech co., Ltd.\r
+                               5F-Building1, Longyu center East Tower,Longyu Middle street, Changping District\r
+                               Beijing  Beijing  100000\r
+                               CN\r
+\r
+94-FB-A7   (hex)               ELKRON \r
+A00000-AFFFFF     (base 16)            ELKRON \r
+                               Via Bologna 188/C\r
+                               TURIN  ITALY  10154\r
+                               IT\r
+\r
+38-F7-CD   (hex)               ARUNAS PTY LTD\r
+700000-7FFFFF     (base 16)            ARUNAS PTY LTD\r
+                               Freedom Taxation Building, 1 Ransley St\r
+                               PENRITH  NSW  2750\r
+                               AU\r
+\r
+38-F7-CD   (hex)               Macherey-Nagel GmbH & Co. KG\r
+D00000-DFFFFF     (base 16)            Macherey-Nagel GmbH & Co. KG\r
+                               Neumann-Neander-Str. 6-8\r
+                               Düren  Deutschland  52355\r
+                               DE\r
+\r
+94-FB-A7   (hex)               Skyring Smart Technologies(Shenzhen) Co., Ltd.\r
+E00000-EFFFFF     (base 16)            Skyring Smart Technologies(Shenzhen) Co., Ltd.\r
+                               6F GDC Building, 9Gaoxin Centeral Avenue 3rd, Nanshan District\r
+                               Shenzhen  Guangdong  518057\r
+                               CN\r
+\r
+94-FB-A7   (hex)               Inaxsys Security Systems inc.\r
+100000-1FFFFF     (base 16)            Inaxsys Security Systems inc.\r
+                               11685 Philippe-Panneton\r
+                               Montreal  Quebec  H1E 4M1\r
+                               CA\r
+\r
+38-F7-CD   (hex)               Polska Fabryka Wodomierzy i Ciep?omierzy FILA \r
+000000-0FFFFF     (base 16)            Polska Fabryka Wodomierzy i Ciep?omierzy FILA \r
+                               ?eromskiego 30\r
+                               Sztum  POMORSKIE  82-400\r
+                               PL\r
+\r
+70-69-79   (hex)               Liquid Instruments Pty Ltd\r
+B00000-BFFFFF     (base 16)            Liquid Instruments Pty Ltd\r
+                               243 Northbourne Avenue\r
+                               Lynham  ACT  2602\r
+                               AU\r
+\r
+70-69-79   (hex)               An Phat Information Technology Co., Ltd\r
+800000-8FFFFF     (base 16)            An Phat Information Technology Co., Ltd\r
+                               3C Tran Phu, Ward 4, District 5\r
+                               Ho Chi Minh City    70000\r
+                               VN\r
+\r
+70-69-79   (hex)               Ibyte\r
+500000-5FFFFF     (base 16)            Ibyte\r
+                               Rua Cleia, 460\r
+                               Fortaleza  Ceara  60863280\r
+                               BR\r
+\r
+70-69-79   (hex)               BAS-IP LP\r
+E00000-EFFFFF     (base 16)            BAS-IP LP\r
+                               Suite 1, 4 Queen Street\r
+                               Edinburgh    EH2 1JE\r
+                               GB\r
+\r
+70-69-79   (hex)               Full Solution Telecom\r
+000000-0FFFFF     (base 16)            Full Solution Telecom\r
+                               Calle 130A #59C-42, Barrio Ciudad Jardin Norte\r
+                               Bogota  Distrito Capital de Bogota  111111\r
+                               CO\r
+\r
+CC-C2-61   (hex)               Tecnoideal Srl\r
+200000-2FFFFF     (base 16)            Tecnoideal Srl\r
+                               Via Lea Cazzuoli nr.43\r
+                               Mirandola  Modena  41037\r
+                               IT\r
+\r
+CC-C2-61   (hex)               Shenzhen Uyesee Technology Co.,Ltd\r
+A00000-AFFFFF     (base 16)            Shenzhen Uyesee Technology Co.,Ltd\r
+                               201C, C6 Building, HengFeng Industry Park Hezhou, Baoan District\r
+                               shenzhen  Guangdong  518102\r
+                               CN\r
+\r
+CC-C2-61   (hex)               Toong In Electronic Corp.\r
+E00000-EFFFFF     (base 16)            Toong In Electronic Corp.\r
+                               10F-8, No.738, Chung Cheng Road, Chung Ho Dist,.\r
+                               New Taipei City  Taiwan  235\r
+                               TW\r
+\r
+30-49-50   (hex)               Shenzhen iTG robot Co.,Ltd.\r
+700000-7FFFFF     (base 16)            Shenzhen iTG robot Co.,Ltd.\r
+                               3rd Floor, 5th Floor, No. 5, Elephant Factory Building, Baiyunshan New Village, Tongsheng Community, Dalang Street, Longhua District\r
+                               Shenzhen    518109\r
+                               CN\r
+\r
+30-49-50   (hex)               ADVANCED MICROWAVE ENGINEERING SRL\r
+400000-4FFFFF     (base 16)            ADVANCED MICROWAVE ENGINEERING SRL\r
+                               VIA LUCCA 50/54\r
+                               FIRENZE    50142\r
+                               IT\r
+\r
+30-49-50   (hex)               Morgan Schaffer Inc.\r
+300000-3FFFFF     (base 16)            Morgan Schaffer Inc.\r
+                               8300 rue St-Patrick bureau 150\r
+                               LaSalle  Quebec  H8N 2H1\r
+                               CA\r
+\r
+D0-14-11   (hex)               Evoco Labs CO., LTD\r
+200000-2FFFFF     (base 16)            Evoco Labs CO., LTD\r
+                               Room 315, Building 1, No.58 Xiangke Rd, Pudong New Area\r
+                               Shanghai  Shanghai  201203\r
+                               CN\r
+\r
+D0-14-11   (hex)               Shen Zhen HaiHe Hi-Tech Co., Ltd\r
+C00000-CFFFFF     (base 16)            Shen Zhen HaiHe Hi-Tech Co., Ltd\r
+                               Bldg 10,Fumin Industrial Zone,Pinghu Subdistrict,Longgang District\r
+                               Shen Zhen  Guang Dong  518111\r
+                               CN\r
+\r
+D0-14-11   (hex)               EkkoSense Ltd\r
+000000-0FFFFF     (base 16)            EkkoSense Ltd\r
+                               Sir Colin Campbell Building, UNIP\r
+                               Triumph Road, Nottingham  UK Mainland  NG7 2TU\r
+                               GB\r
+\r
+30-49-50   (hex)               IK Elektronik GmbH\r
+500000-5FFFFF     (base 16)            IK Elektronik GmbH\r
+                               Friedrichsgruener Str. 11-13\r
+                               Muldenhammer    08262\r
+                               DE\r
+\r
+D0-14-11   (hex)               Private\r
+100000-1FFFFF     (base 16)            Private\r
+\r
+5C-85-7E   (hex)               Sichuan C.H Control Technology Co., Ltd.\r
+100000-1FFFFF     (base 16)            Sichuan C.H Control Technology Co., Ltd.\r
+                               4F,B8,Tianfu Software Park, No. 99, Tianhua 1st Road\r
+                               Chengdu  Si chuan  610000\r
+                               CN\r
+\r
+5C-85-7E   (hex)               Nautech Electronics Ltd\r
+D00000-DFFFFF     (base 16)            Nautech Electronics Ltd\r
+                               120 Cryers Road\r
+                               East Tamaki  Auckland  2013\r
+                               NZ\r
+\r
+5C-85-7E   (hex)               Cable Matters Inc.\r
+300000-3FFFFF     (base 16)            Cable Matters Inc.\r
+                               153 Northboro Road, Suite 5\r
+                               Southborough  MA  01772\r
+                               US\r
+\r
+5C-85-7E   (hex)               Zhejiang Jetron Ark Digital Technology Co., Ltd\r
+A00000-AFFFFF     (base 16)            Zhejiang Jetron Ark Digital Technology Co., Ltd\r
+                               Room 12-9, building B (Hongmao building), No. 338, Juxing West Road, Jiangbei District, Ningbo, ZheJiang, China\r
+                               Ningbo    315000\r
+                               CN\r
+\r
+5C-85-7E   (hex)               Beijing HZFD Technology Co., Ltd\r
+700000-7FFFFF     (base 16)            Beijing HZFD Technology Co., Ltd\r
+                               Room 502, Tower A, Fangyuan Building, No. 56, South Zhongguancun Street, Haidian District\r
+                               Beijing  Beiijng  100044\r
+                               CN\r
+\r
+F4-69-D5   (hex)               Junchuang (Xiamen) Automation Technology Co.,Ltd\r
+100000-1FFFFF     (base 16)            Junchuang (Xiamen) Automation Technology Co.,Ltd\r
+                               Room 705, building a, No. 96, Xiangxing Road, industrial zone, Xiamen Torch High tech Zone\r
+                               Xiamen   Fujian  361101\r
+                               CN\r
+\r
+4C-93-A6   (hex)               Wuhan Maiwe communication Co.,Ltd\r
+C00000-CFFFFF     (base 16)            Wuhan Maiwe communication Co.,Ltd\r
+                               Building 2,Area E, Phase ii, Optical valley core center, No.52, Liufang road, East Lake Hi-tech Development Zone,Wuhan,China\r
+                               Wuhan  Hubei  430000\r
+                               CN\r
+\r
+F4-69-D5   (hex)               ITS Co., Ltd. \r
+300000-3FFFFF     (base 16)            ITS Co., Ltd. \r
+                               Wooyang building 7F, 68, Wolpyeong-ro, Nam-gu, Ulsan, Republic of Korea\r
+                               Ulsan    44690\r
+                               KR\r
+\r
+4C-93-A6   (hex)               Atrie Technology Fzc\r
+100000-1FFFFF     (base 16)            Atrie Technology Fzc\r
+                               ELOB office no E-44F-41, Hamriya Free zone\r
+                               Sharjah  Sharjah  10001\r
+                               AE\r
+\r
+4C-93-A6   (hex)               Cantronic Systems (Canada) Inc\r
+D00000-DFFFFF     (base 16)            Cantronic Systems (Canada) Inc\r
+                               Unit 8, 62 Fawcett\r
+                               Coquitlam  British Columbia  V3K 6V5\r
+                               CA\r
+\r
+28-B7-7C   (hex)               Anser Coding Inc.\r
+900000-9FFFFF     (base 16)            Anser Coding Inc.\r
+                               34F., No. 99, Sec. 1, XinTai 5th Rd., Xizhi Dist.,\r
+                               New Taipei City    221\r
+                               TW\r
+\r
+28-B7-7C   (hex)               Ray Pte Ltd\r
+E00000-EFFFFF     (base 16)            Ray Pte Ltd\r
+                               Suite #09-01, 20 Collyer Quay, \r
+                               Singapore    049319\r
+                               SG\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
@@ -16706,12 +17546,6 @@ E00000-EFFFFF     (base 16)            Artis GmbH
                                Egestorf    21272\r
                                DE\r
 \r
-1C-88-79   (hex)               ANDRA Sp. z o.o.\r
-100000-1FFFFF     (base 16)            ANDRA Sp. z o.o.\r
-                               Pryzmaty 6/8\r
-                               Warszawa    02-226\r
-                               PL\r
-\r
 1C-87-79   (hex)               ASSYSTEM France\r
 E00000-EFFFFF     (base 16)            ASSYSTEM France\r
                                13 rue Marie Louise Dissard\r
@@ -17792,12 +18626,6 @@ E00000-EFFFFF     (base 16)            LS Energy Solutions
                                Reykjavik    105\r
                                IS\r
 \r
-B0-B3-53   (hex)               AD HOC DEVELOPMENTS S.L\r
-300000-3FFFFF     (base 16)            AD HOC DEVELOPMENTS S.L\r
-                               C/ Crisol 3\r
-                               RIVAS-VACIAMADRID  Madrid  28522\r
-                               ES\r
-\r
 B0-B3-53   (hex)               Hangzhou Hikrobot Technology Co., Ltd.\r
 600000-6FFFFF     (base 16)            Hangzhou Hikrobot Technology Co., Ltd.\r
                                Room 304, Unit B, Building 2, 399 Danfeng Road, Binjiang District, Hangzhou, Zhejiang\r
@@ -18019,3 +18847,201 @@ B00000-BFFFFF     (base 16)           Digifocus Technology Inc.
                                2-14-4 Shinyokohama,kohoku-ku\r
                                Yokohama  Kanagawa  222-0033\r
                                JP\r
+\r
+38-F7-CD   (hex)               RFbeam Microwave GmbH\r
+900000-9FFFFF     (base 16)            RFbeam Microwave GmbH\r
+                               Schuppisstrasse 7\r
+                               St. Gallen    9016\r
+                               CH\r
+\r
+38-F7-CD   (hex)               Shenzhen MADIGI Electronic Technology Co., Ltd\r
+C00000-CFFFFF     (base 16)            Shenzhen MADIGI Electronic Technology Co., Ltd\r
+                               Room 111,1A Floor,Kanghesheng Blgg,No.1.Chuangsheng Rd.Nanshan District\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+38-F7-CD   (hex)               Shanghai qinzhuo Electronic Co., Ltd.\r
+500000-5FFFFF     (base 16)            Shanghai qinzhuo Electronic Co., Ltd.\r
+                               No. W, floor 1, building 2, No. 258, Minfeng Road, Pudong New Area\r
+                               Shanghai  Shanghai  201209\r
+                               CN\r
+\r
+38-F7-CD   (hex)               NORDI TELEKOMMUNIKATSIOONI OÜ\r
+400000-4FFFFF     (base 16)            NORDI TELEKOMMUNIKATSIOONI OÜ\r
+                               Valukoja 8\r
+                               Tallinn city  Estonian Republic  11415\r
+                               EE\r
+\r
+38-F7-CD   (hex)               BlastWave Inc.\r
+800000-8FFFFF     (base 16)            BlastWave Inc.\r
+                               1987 Leghorn Street, Suite 100\r
+                               Moutain View  CA  94043\r
+                               US\r
+\r
+70-69-79   (hex)               Faurecia Clarion Electronics (Dongguan) Co., Ltd\r
+900000-9FFFFF     (base 16)            Faurecia Clarion Electronics (Dongguan) Co., Ltd\r
+                               South of Dongkeng Avenue, Dongkeng Town, Dongguan City, Guangdong\r
+                               DONGGUAN  GUANGDONG  523455\r
+                               CN\r
+\r
+70-69-79   (hex)               Beijing Security Union Information Technology Co.,Ltd\r
+600000-6FFFFF     (base 16)            Beijing Security Union Information Technology Co.,Ltd\r
+                               Beijing Security Union Information Technology Co.,Ltd \r
+                               Beijing  Beijing  100085\r
+                               CN\r
+\r
+70-69-79   (hex)               Intelitech SIA\r
+700000-7FFFFF     (base 16)            Intelitech SIA\r
+                               2-22 Kruzes str.\r
+                               Riga  Other  LV-1046\r
+                               LV\r
+\r
+CC-C2-61   (hex)               Ebiologic Technology Co., Ltd.\r
+000000-0FFFFF     (base 16)            Ebiologic Technology Co., Ltd.\r
+                               9F., No.33, Ln. 3, Sec. 1, Zhongzheng E. Rd., Tamsui Dist., New Taipei City 251, Taiwan (R.O.C.)\r
+                               New Taipei City    251\r
+                               TW\r
+\r
+CC-C2-61   (hex)               Dspread Technology (Beijing) Inc.\r
+D00000-DFFFFF     (base 16)            Dspread Technology (Beijing) Inc.\r
+                               Jingxin Building, 2045 Suite , Chaoyang District\r
+                               Beijing    100027\r
+                               CN\r
+\r
+CC-C2-61   (hex)               Viper Design, LLC\r
+500000-5FFFFF     (base 16)            Viper Design, LLC\r
+                               125 Glancy St.\r
+                               Goodlettsville  TN  37072\r
+                               US\r
+\r
+CC-C2-61   (hex)               BYTERG LLC\r
+900000-9FFFFF     (base 16)            BYTERG LLC\r
+                               1st Nagatinsky proezd 10 build.1\r
+                               Moscow  Moscow  115230\r
+                               RU\r
+\r
+F0-D7-AF   (hex)               ADAM Audio GmbH\r
+400000-4FFFFF     (base 16)            ADAM Audio GmbH\r
+                               Rudower Chaussee 50\r
+                               Berlin    12489\r
+                               DE\r
+\r
+B0-B3-53   (hex)               AD HOC DEVELOPMENTS S.L\r
+300000-3FFFFF     (base 16)            AD HOC DEVELOPMENTS S.L\r
+                               C/ Crisol 3, despacho 17\r
+                               Rivas-Vaciamadrid  Madrid  28522\r
+                               ES\r
+\r
+F0-D7-AF   (hex)               Anord Mardix (USA) Inc.\r
+600000-6FFFFF     (base 16)            Anord Mardix (USA) Inc.\r
+                               3930 Technology Court\r
+                               Sandston  VA  23150\r
+                               US\r
+\r
+94-FB-A7   (hex)               Rosenberger Technologies Co.,Ltd.\r
+D00000-DFFFFF     (base 16)            Rosenberger Technologies Co.,Ltd.\r
+                               NO.6, ShenAn Rd, Dianshanhu Town\r
+                               Kunshan City  Jiangsu Province  215345\r
+                               CN\r
+\r
+F0-D7-AF   (hex)               SHEN ZHEN MICHIP TECHNOLOGIES CO.,LTD.\r
+800000-8FFFFF     (base 16)            SHEN ZHEN MICHIP TECHNOLOGIES CO.,LTD.\r
+                               Fuxingda Indestrial park.Floor4?Building4\r
+                               SHEN ZHEN  GUANG DONG  518126\r
+                               CN\r
+\r
+30-49-50   (hex)               Guangzhou Lian-med Technology Co.,Ltd.\r
+000000-0FFFFF     (base 16)            Guangzhou Lian-med Technology Co.,Ltd.\r
+                               Room 501, Building G1,No. 31 Kefeng Road, Huangpu district\r
+                               Guangzhou    510670\r
+                               CN\r
+\r
+30-49-50   (hex)               IoTmaxx GmbH\r
+E00000-EFFFFF     (base 16)            IoTmaxx GmbH\r
+                               Bultstrasse 5a\r
+                               Hannover    30159\r
+                               DE\r
+\r
+D0-14-11   (hex)               Guangdong Shiqi Manufacture Co., Ltd.\r
+D00000-DFFFFF     (base 16)            Guangdong Shiqi Manufacture Co., Ltd.\r
+                               No. D10~11, Lunjiao intensive industrial Zone,  Licun  Village committee, Lunjiao street office, Shunde District\r
+                               Foshan  Guangdong  528300\r
+                               CN\r
+\r
+D0-14-11   (hex)               Ahnnet\r
+600000-6FFFFF     (base 16)            Ahnnet\r
+                               B-313, Samhwan HIPEX, 230, Pangyoyeok-ro, Bundang-gu\r
+                               Seongnam-si  Gyeonggi-do  13493\r
+                               KR\r
+\r
+1C-88-79   (hex)               ANDRA Sp. z o. o.\r
+100000-1FFFFF     (base 16)            ANDRA Sp. z o. o.\r
+                               Pryzmaty 6/8\r
+                               Warszawa    02-226\r
+                               PL\r
+\r
+5C-85-7E   (hex)               Guoyi Liangzi (Hefei) Technology Co., Ltd(CIQTEK)\r
+E00000-EFFFFF     (base 16)            Guoyi Liangzi (Hefei) Technology Co., Ltd(CIQTEK)\r
+                               1-4th Floor, Building No.E2, Chuangxin Industrial Park, No.2800, Chuangxin Road Gaoxin District\r
+                               Hefei   Anhui  Hefei \r
+                               CN\r
+\r
+5C-85-7E   (hex)               Express LUCK Industrial Ltd.\r
+900000-9FFFFF     (base 16)            Express LUCK Industrial Ltd.\r
+                               No. 88, Baotongnan Road, Xikeng, Yuanshan Street, Longgang District\r
+                               Shenzhen  Guangdong  518100\r
+                               CN\r
+\r
+F4-69-D5   (hex)               Nantong ZYDZ Electronic.,Co.Ltd\r
+D00000-DFFFFF     (base 16)            Nantong ZYDZ Electronic.,Co.Ltd\r
+                               # F, High-Tech business Incubator, No.86 East Waihuan Road,\r
+                               Nantong  Jiangsu  226300\r
+                               CN\r
+\r
+F4-69-D5   (hex)               Stype CS d.o.o.\r
+400000-4FFFFF     (base 16)            Stype CS d.o.o.\r
+                               Velikopoljska 32\r
+                               Zagreb    10010\r
+                               HR\r
+\r
+4C-93-A6   (hex)               Hanwang Technology Co.,Ltd\r
+A00000-AFFFFF     (base 16)            Hanwang Technology Co.,Ltd\r
+                               HANVON TOWER, BUILDING NO.5, ZHONGGUANCUN SOFTWARE PARK, HAIDIAN DISTRICT, BEIJING, CHINA  100193 \r
+                               BEIJING  BEIJING  100193 \r
+                               CN\r
+\r
+28-B7-7C   (hex)               AnyLink LLC\r
+C00000-CFFFFF     (base 16)            AnyLink LLC\r
+                               100 N Washington St. Floor 6\r
+                               Boston  MA  02114\r
+                               US\r
+\r
+28-B7-7C   (hex)               Shanghai Taiji Software Co.,Limited\r
+600000-6FFFFF     (base 16)            Shanghai Taiji Software Co.,Limited\r
+                               Room J1224, No. 6, Lane 129, Huajiang Road, Jiading District\r
+                               Shanghai  Shanghai  201800\r
+                               CN\r
+\r
+28-B7-7C   (hex)               Enedo Finland Oy\r
+D00000-DFFFFF     (base 16)            Enedo Finland Oy\r
+                               Martinkyläntie 43\r
+                               Vantaa    01720\r
+                               FI\r
+\r
+C0-61-9A   (hex)               JAM-Labs Corp\r
+C00000-CFFFFF     (base 16)            JAM-Labs Corp\r
+                               4109 Clipper Ct\r
+                               Fremont  CA  94538\r
+                               US\r
+\r
+C0-61-9A   (hex)               LYAND ACOUSTIC TECHNOLOGY CO.,LTD.\r
+300000-3FFFFF     (base 16)            LYAND ACOUSTIC TECHNOLOGY CO.,LTD.\r
+                               No. 73 JinFu Road XiaoJinKou\r
+                               Huizhou city   GuangDong  516023\r
+                               CN\r
+\r
+C0-61-9A   (hex)               KidKraft\r
+100000-1FFFFF     (base 16)            KidKraft\r
+                               4630 Olin Rd\r
+                               Dallas  TX  75244\r
+                               US\r
index e31a6ea3803585450687ad813d0100d1f9608bbf..dc40087604454c8e40e19f18a3945fc85b08c536 100644 (file)
@@ -3686,12 +3686,6 @@ ECD000-ECDFFF     (base 16)              SBS-Feintechnik GmbH & Co. KG
                                Auburn  CA  95603\r
                                US\r
 \r
-00-1B-C5   (hex)               HomerSoft sp. z o.o.\r
-0A0000-0A0FFF     (base 16)            HomerSoft sp. z o.o.\r
-                               Kapelanka 13B\r
-                               Krakow    30-347\r
-                               PL\r
-\r
 00-1B-C5   (hex)               Navitar Inc\r
 09D000-09DFFF     (base 16)            Navitar Inc\r
                                200 Commerce Dr\r
@@ -4199,12 +4193,6 @@ EF1000-EF1FFF     (base 16)              Nanotok LLC
                                Hong Kong  Hong Kong  00000\r
                                HK\r
 \r
-70-B3-D5   (hex)               Technology Link Corporation\r
-B1B000-B1BFFF     (base 16)            Technology Link Corporation\r
-                               Shin-Yokohama Kohoku-ku\r
-                               yokohama  kanagawa  222-0033\r
-                               JP\r
-\r
 70-B3-D5   (hex)               VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD\r
 6BE000-6BEFFF     (base 16)            VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD\r
                                B3, Bredon House, 321, Tettenhall Road, Tettenhall\r
@@ -4229,11 +4217,11 @@ F47000-F47FFF     (base 16)             TXMission Ltd.
                                Watford  Hertfordshire  WD25 8HU\r
                                GB\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)               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)               Tucsen Photonics Co., Ltd. \r
 8A7000-8A7FFF     (base 16)            Tucsen Photonics Co., Ltd. \r
@@ -4241,11 +4229,11 @@ C52000-C52FFF     (base 16)             sensorway
                                fuzhou    350000\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)               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)               KDT Corp.\r
 E72000-E72FFF     (base 16)            KDT Corp.\r
@@ -4253,11 +4241,11 @@ E72000-E72FFF     (base 16)             KDT Corp.
                                shaoxing  zhejiang  312030\r
                                CN\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
+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)               R.C. Systems Inc\r
 52F000-52FFFF     (base 16)            R.C. Systems Inc\r
@@ -4271,18 +4259,18 @@ EBF000-EBFFFF     (base 16)             AUTOMATICA Y REGULACION S.A.
                                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
@@ -4301,11 +4289,11 @@ B96000-B96FFF     (base 16)             Oculii
                                Woodside  NY  11377\r
                                US\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
+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
@@ -4313,6 +4301,18 @@ E31000-E31FFF     (base 16)              NEUROPHET, Inc.
                                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
+\r
 70-B3-D5   (hex)               Chromateq\r
 944000-944FFF     (base 16)            Chromateq\r
                                191, allée de Lauzard, Bat. B, RDC 1 (Chromateq)\r
@@ -4331,30 +4331,12 @@ F3D000-F3DFFF     (base 16)             KAYA Instruments
                                Nesher     3688520\r
                                IL\r
 \r
-70-B3-D5   (hex)               Gogo Business Aviation\r
-3E0000-3E0FFF     (base 16)            Gogo Business Aviation\r
-                               105 Edgeview Dr., Suite 300\r
-                               Broomfield  CO  80021\r
-                               US\r
-\r
 70-B3-D5   (hex)               Asiga Pty Ltd\r
 53E000-53EFFF     (base 16)            Asiga Pty Ltd\r
                                Unit 2, 19-21 Bourke Road\r
                                Alexandria  New South Wales  2015\r
                                AU\r
 \r
-70-B3-D5   (hex)               ENABLER LTD.\r
-15A000-15AFFF     (base 16)            ENABLER LTD.\r
-                               29F Shiroyama Trust Tower 4-3-1 Toranomon \r
-                               Minato-ku  Tokyo  105-6029\r
-                               JP\r
-\r
-70-B3-D5   (hex)               LINEAGE POWER PVT LTD.,\r
-62E000-62EFFF     (base 16)            LINEAGE POWER PVT LTD.,\r
-                               30-A1, KIADB, 1ST PHASE INDUSTRIAL ESTATE,KUMBALGODU, BANGALORE-MYSORE ROAD\r
-                               BANGALORE  KARNATAKA  560074\r
-                               IN\r
-\r
 70-B3-D5   (hex)               Salupo Sas\r
 898000-898FFF     (base 16)            Salupo Sas\r
                                Via Laganeto n. 129\r
@@ -4367,12 +4349,228 @@ F3D000-F3DFFF     (base 16)            KAYA Instruments
                                Amagasaki  Hyogo  660-0082\r
                                JP\r
 \r
+70-B3-D5   (hex)               LINEAGE POWER PVT LTD.,\r
+62E000-62EFFF     (base 16)            LINEAGE POWER PVT LTD.,\r
+                               30-A1, KIADB, 1ST PHASE INDUSTRIAL ESTATE,KUMBALGODU, BANGALORE-MYSORE ROAD\r
+                               BANGALORE  KARNATAKA  560074\r
+                               IN\r
+\r
+70-B3-D5   (hex)               ENABLER LTD.\r
+15A000-15AFFF     (base 16)            ENABLER LTD.\r
+                               29F Shiroyama Trust Tower 4-3-1 Toranomon \r
+                               Minato-ku  Tokyo  105-6029\r
+                               JP\r
+\r
 70-B3-D5   (hex)               Grupo Epelsa S.L.\r
 40D000-40DFFF     (base 16)            Grupo Epelsa S.L.\r
                                C/ Punto Net,3\r
                                Alcala de Henares  Madrid  28805\r
                                ES\r
 \r
+70-B3-D5   (hex)               WEPTECH elektronik GmbH\r
+9CD000-9CDFFF     (base 16)            WEPTECH elektronik GmbH\r
+                               Ostring 10\r
+                               Landau    76829\r
+                               DE\r
+\r
+70-B3-D5   (hex)               AnaPico AG\r
+0BB000-0BBFFF     (base 16)            AnaPico AG\r
+                               Europa-Strasse 9\r
+                               Glattbrugg  Schweiz  8152\r
+                               CH\r
+\r
+70-B3-D5   (hex)               Egag, LLC\r
+9A8000-9A8FFF     (base 16)            Egag, LLC\r
+                               303 King James Ct\r
+                               Upper Marlboro  MD  20774\r
+                               US\r
+\r
+70-B3-D5   (hex)               Season Electronics Ltd\r
+F46000-F46FFF     (base 16)            Season Electronics Ltd\r
+                               600 Nest Business Park \r
+                               Havant  Hampshire  PO9 5TL\r
+                               GB\r
+\r
+70-B3-D5   (hex)               Algodue Elettronica Srl\r
+191000-191FFF     (base 16)            Algodue Elettronica Srl\r
+                               Via P. Gobetti, 16F\r
+                               Maggiora  NO  28014\r
+                               IT\r
+\r
+70-B3-D5   (hex)               Hermann Sewerin GmbH\r
+484000-484FFF     (base 16)            Hermann Sewerin GmbH\r
+                               Robert-Bosch-Str. 3\r
+                               Gütersloh  NRW  33334\r
+                               DE\r
+\r
+70-B3-D5   (hex)               OZRAY\r
+629000-629FFF     (base 16)            OZRAY\r
+                               D-#1514, GwangMyung SK Techno park, 60, Haan-ro, GwangMyung-si, Gyeonggi-do, Korea\r
+                               GwangMyung-si  Gyeonggi-do, Korea  14322\r
+                               KR\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
+                               Crawley  WEST SUSSEX  RH10 9YX\r
+                               GB\r
+\r
+70-B3-D5   (hex)               Vertex Co.,Ltd.\r
+8DD000-8DDFFF     (base 16)            Vertex Co.,Ltd.\r
+                               4-1-17 Higashifuchinobe,Chuo-ku\r
+                               Sagamihara  Kanagawa  252-0203\r
+                               JP\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)               Jabil, Inc.\r
+736000-736FFF     (base 16)            Jabil, Inc.\r
+                               888 Executive Center Dr. W.\r
+                               St.Petersubrg  FL  33702\r
+                               US\r
+\r
+70-B3-D5   (hex)               Power Electronics Espana, S.L.\r
+632000-632FFF     (base 16)            Power Electronics Espana, S.L.\r
+                               C/ Leonardo Da Vinci, 24-26\r
+                               Paterna  Valencia  46980\r
+                               ES\r
+\r
+70-B3-D5   (hex)               CT Company\r
+005000-005FFF     (base 16)            CT Company\r
+                               Godovikova , 9, Moscow\r
+                               Moscow  RUSSIA  129085\r
+                               RU\r
+\r
+70-B3-D5   (hex)               Tomahawk Robotics\r
+0EB000-0EBFFF     (base 16)            Tomahawk Robotics\r
+                               2412 Irwin St\r
+                               Melbourne  FL  32901\r
+                               US\r
+\r
+00-1B-C5   (hex)               Silvair\r
+0A0000-0A0FFF     (base 16)            Silvair\r
+                               ul. Jasnogórska 44\r
+                               Kraków    31-358\r
+                               PL\r
+\r
+70-B3-D5   (hex)               JPEmbedded Mazan Filipek Sp. J.\r
+69D000-69DFFF     (base 16)            JPEmbedded Mazan Filipek Sp. J.\r
+                               Strumienna 12\r
+                               Krakow  Lesser Poland Voivodeship  30-609\r
+                               PL\r
+\r
+70-B3-D5   (hex)               JT\r
+051000-051FFF     (base 16)            JT\r
+                               203, Business Incubator Center,  Korea Polytechnic University, 237, Sangidaehak-ro,\r
+                               Siheung-si  Gyeonggi-do  15073\r
+                               KR\r
+\r
+70-B3-D5   (hex)               YUYAMA MFG Co.,Ltd\r
+D06000-D06FFF     (base 16)            YUYAMA MFG Co.,Ltd\r
+                               1-4-30\r
+                               MEISHINGUCHI,TOYONAKA  OSAKA  561-0841\r
+                               JP\r
+\r
+70-B3-D5   (hex)               Guangzhou Wanglu \r
+8D5000-8D5FFF     (base 16)            Guangzhou Wanglu \r
+                               2nd floor, Block C, DET building, No.2 Ruitai Road,Kaitai Street, Huangpu District\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
+                               Zlin    760 01\r
+                               CZ\r
+\r
+70-B3-D5   (hex)               Neusoft Reach Automotive Technology (Shenyang) Co.,Ltd\r
+00F000-00FFFF     (base 16)            Neusoft Reach Automotive Technology (Shenyang) Co.,Ltd\r
+                               No.2 Xinxiu Street, Hunnan District, Shenyang\r
+                               Shenyang  Liaoning  110000\r
+                               CN\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)               BirdDog Australia\r
+3B9000-3B9FFF     (base 16)            BirdDog Australia\r
+                               Unit 1, 8 Theobald St\r
+                               THORNBURY  VIC  3071\r
+                               AU\r
+\r
+70-B3-D5   (hex)               Clarity Medical Pvt Ltd\r
+C0D000-C0DFFF     (base 16)            Clarity Medical Pvt Ltd\r
+                               PLOT No. 1687A, JLPL  INDUSTRIAL AREA, SECTOR 82, MOHALI\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
+\r
+70-B3-D5   (hex)               Algra tec AG\r
+80C000-80CFFF     (base 16)            Algra tec AG\r
+                               Rigistr. 1\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)               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)               EVCO SPA\r
 A80000-A80FFF     (base 16)            EVCO SPA\r
                                VIA FELTRE N. 81\r
@@ -8693,30 +8891,24 @@ A7F000-A7FFFF     (base 16)             AUDIO VISUAL DIGITAL SYSTEMS
                                Bergisch Gladbach  North Rhine-Westphalia  51465\r
                                DE\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)               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
                                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
@@ -8729,11 +8921,11 @@ FA8000-FA8FFF     (base 16)             Munters
                                Pethch Tikva  Israel  4959376\r
                                IL\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
+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)               TangRen C&S CO., Ltd\r
 3FC000-3FCFFF     (base 16)            TangRen C&S CO., Ltd\r
@@ -8741,29 +8933,29 @@ FA8000-FA8FFF     (base 16)             Munters
                                Shenzhen  Guangdong  518052\r
                                CN\r
 \r
+70-B3-D5   (hex)               TEX COMPUTER SRL \r
+6C2000-6C2FFF     (base 16)            TEX COMPUTER SRL \r
+                               VIA MERCADANTE 35\r
+                               CATTOLICA   RIMINI   47841\r
+                               IT\r
+\r
 70-B3-D5   (hex)               LOTES TM OOO\r
 EA5000-EA5FFF     (base 16)            LOTES TM OOO\r
                                Barklaya 22, str.1\r
                                Moscow    121309\r
                                RU\r
 \r
-70-B3-D5   (hex)               Yi An Electronics Co., Ltd\r
-F28000-F28FFF     (base 16)            Yi An Electronics Co., Ltd\r
-                               5F.-2, No. 81, Sec. 1, Xintai 5th Rd., Xizhi Dist\r
-                                New Taipei City    22101\r
-                               TW\r
-\r
 70-B3-D5   (hex)               Ariston Thermo s.p.a.\r
 3D6000-3D6FFF     (base 16)            Ariston Thermo s.p.a.\r
                                Via Aristide Merloni 45\r
                                Fabriano  Ancona  60044\r
                                IT\r
 \r
-70-B3-D5   (hex)               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
+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)               DORLET SAU\r
 639000-639FFF     (base 16)            DORLET SAU\r
@@ -8777,6 +8969,18 @@ F28000-F28FFF     (base 16)              Yi An Electronics Co., Ltd
                                Ryazan    390048\r
                                RU\r
 \r
+70-B3-D5   (hex)               MG s.r.l.\r
+130000-130FFF     (base 16)            MG s.r.l.\r
+                               via Monte Bianco, 1\r
+                               Solbiate Olona  VA  21058\r
+                               IT\r
+\r
+70-B3-D5   (hex)               Postmark Incorporated \r
+CBB000-CBBFFF     (base 16)            Postmark Incorporated \r
+                               3197 Duncan Lane\r
+                               San Luis Obispo  CA  93401\r
+                               US\r
+\r
 70-B3-D5   (hex)               Glory Technology Service Inc.\r
 801000-801FFF     (base 16)            Glory Technology Service Inc.\r
                                3F., No.43-1, Ln. 11, Sec. 6, Minquan E. Rd\r
@@ -8789,12 +8993,6 @@ F28000-F28FFF     (base 16)              Yi An Electronics Co., Ltd
                                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
@@ -8819,6 +9017,198 @@ CBB000-CBBFFF     (base 16)             Postmark Incorporated
                                VILLA BARTOLOMEA  IT  37049\r
                                IT\r
 \r
+70-B3-D5   (hex)               Sankyo Intec Co,ltd\r
+E7F000-E7FFFF     (base 16)            Sankyo Intec Co,ltd\r
+                               127 Tokimata\r
+                               Iida-shi  Nagano-ken  399-2563\r
+                               JP\r
+\r
+70-B3-D5   (hex)               olympus-ossa\r
+5D9000-5D9FFF     (base 16)            olympus-ossa\r
+                               48 woerd ave\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
+                               Union City  CA  94587\r
+                               US\r
+\r
+70-B3-D5   (hex)               Seznam.cz, a.s., CZ26168685\r
+F66000-F66FFF     (base 16)            Seznam.cz, a.s., CZ26168685\r
+                               Radlicka 3294/10\r
+                               Praha  Czech Republic  15000\r
+                               CZ\r
+\r
+70-B3-D5   (hex)               Frog Cellsat Limited\r
+C5E000-C5EFFF     (base 16)            Frog Cellsat Limited\r
+                               D-213, Sector-63, Noida\r
+                               Noida  Utter Pardesh  201301\r
+                               IN\r
+\r
+70-B3-D5   (hex)               DEUTA-WERKE GmbH\r
+6DC000-6DCFFF     (base 16)            DEUTA-WERKE GmbH\r
+                               Paffrather Str. 140\r
+                               Bergisch Gladbach  North Rhine-Westphalia  51465\r
+                               DE\r
+\r
+70-B3-D5   (hex)               Levelup Holding, Inc.\r
+89F000-89FFFF     (base 16)            Levelup Holding, Inc.\r
+                               3015 W Weldon Ave\r
+                               Phoenix  AZ  85017\r
+                               US\r
+\r
+70-B3-D5   (hex)               Cavagna Group Spa\r
+1B2000-1B2FFF     (base 16)            Cavagna Group Spa\r
+                               Via Statale 11/13\r
+                               Ponte S.Marco di Calcinato (BS)    25011\r
+                               IT\r
+\r
+70-B3-D5   (hex)               RTA srl\r
+32B000-32BFFF     (base 16)            RTA srl\r
+                               Via Mattei Fraz. Divisa\r
+                               Marcignago  PV  27020\r
+                               IT\r
+\r
+70-B3-D5   (hex)               RF-Tuote Oy\r
+3AC000-3ACFFF     (base 16)            RF-Tuote Oy\r
+                               Joensuunkatu 13\r
+                               Salo  246  24130\r
+                               FI\r
+\r
+70-B3-D5   (hex)               Shanghai Junqian Sensing Technology Co., LTD\r
+468000-468FFF     (base 16)            Shanghai Junqian Sensing Technology Co., LTD\r
+                               Room 602,Building 1,NO.760,Xinjunhuan Road, Caohejing High-Tech Park\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
+\r
+70-B3-D5   (hex)               Simplified MFG\r
+66F000-66FFFF     (base 16)            Simplified MFG\r
+                               1707 S Gilmore Cir\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
+\r
+70-B3-D5   (hex)               Scenario Automation\r
+43C000-43CFFF     (base 16)            Scenario Automation\r
+                               Rua Paulo Elias, 216\r
+                               São Carlos  São Paulo  13564400\r
+                               BR\r
+\r
+70-B3-D5   (hex)               LACS SRL\r
+F4A000-F4AFFF     (base 16)            LACS SRL\r
+                               VIA MONTE NERO 4\r
+                               ROSA'  VI  36027\r
+                               IT\r
+\r
+70-B3-D5   (hex)               Orion Power Systems, Inc.\r
+110000-110FFF     (base 16)            Orion Power Systems, Inc.\r
+                               2939 W. Beaver Street\r
+                               Jacksonville  FL  32254\r
+                               US\r
+\r
+70-B3-D5   (hex)               Sicon srl\r
+EAF000-EAFFFF     (base 16)            Sicon srl\r
+                               Via Sila 1/3\r
+                               Isola Vicentina  Vicenza  36033\r
+                               IT\r
+\r
+70-B3-D5   (hex)               Garmo Instruments S.L.\r
+C02000-C02FFF     (base 16)            Garmo Instruments S.L.\r
+                               Polig. Malpica, Calle E, 32-39, nave 43\r
+                               Zaragoza  Aragon   50016\r
+                               ES\r
+\r
+70-B3-D5   (hex)               King-On Technology Ltd.\r
+D35000-D35FFF     (base 16)            King-On Technology Ltd.\r
+                               13F, No.207, Sec#3, Beixin Rd., Xindian District.\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)               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
+                               24257  Taiwan  SHINJUANG\r
+                               TW\r
+\r
+70-B3-D5   (hex)               Yongtong tech\r
+2CB000-2CBFFF     (base 16)            Yongtong tech\r
+                               D18,NO.6 Road HuangChunBei\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)               Wexiodisk AB\r
+905000-905FFF     (base 16)            Wexiodisk AB\r
+                               Mardvagen 4\r
+                               Vaxjo  Kronoberg  352 45\r
+                               SE\r
+\r
+70-B3-D5   (hex)               Klaxoon\r
+DB3000-DB3FFF     (base 16)            Klaxoon\r
+                               3 av de Belle Fontaine\r
+                               Cesson-Sevigne    35510\r
+                               FR\r
+\r
+70-B3-D5   (hex)               ECoCoMS Ltd.\r
+5CB000-5CBFFF     (base 16)            ECoCoMS Ltd.\r
+                               BIC-ISOT, Tzarigradsko shose blvd., 7-th km, Corpus 3, fl. 4,\r
+                               Sofia  BG  1784\r
+                               BG\r
+\r
+70-B3-D5   (hex)               MetCom Solutions GmbH\r
+D18000-D18FFF     (base 16)            MetCom Solutions GmbH\r
+                               Marie-Curie-Str. 19\r
+                               Mannheim  Baden-Wuerttemberg  68219\r
+                               DE\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
@@ -13046,6 +13436,18 @@ F23000-F23FFF     (base 16)            Lyse AS
                                Bad Marienberg  Rheinland-Pfalz  56470\r
                                DE\r
 \r
+70-B3-D5   (hex)               Walton Hi-Tech Industries Ltd.\r
+E5C000-E5CFFF     (base 16)            Walton Hi-Tech Industries Ltd.\r
+                               HOLDING NO. I-65/2, WARD NO-07\r
+                               CHANDRA, KALIAKOIR, GAZIPUR.    1750\r
+                               BD\r
+\r
+70-B3-D5   (hex)               Flextronics International Kft\r
+699000-699FFF     (base 16)            Flextronics International Kft\r
+                               38. Zrinyi Str.\r
+                               Zalaegerszeg  Zala  8900\r
+                               HU\r
+\r
 70-B3-D5   (hex)               JFA Electronics Industry and Commerce EIRELI\r
 5F7000-5F7FFF     (base 16)            JFA Electronics Industry and Commerce EIRELI\r
                                Rua Flor das Pedras, 175\r
@@ -13058,12 +13460,6 @@ F23000-F23FFF     (base 16)            Lyse AS
                                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
@@ -13076,12 +13472,6 @@ C82000-C82FFF     (base 16)            Sicon srl
                                Isola Vicentina  Vicenza  36033\r
                                IT\r
 \r
-70-B3-D5   (hex)               Flextronics International Kft\r
-699000-699FFF     (base 16)            Flextronics International Kft\r
-                               38. Zrinyi Str.\r
-                               Zalaegerszeg  Zala  8900\r
-                               HU\r
-\r
 70-B3-D5   (hex)               LGE\r
 DAE000-DAEFFF     (base 16)            LGE\r
                                10, Magokjungang 10-ro, Gangseo-gu\r
@@ -13136,6 +13526,12 @@ F64000-F64FFF     (base 16)            silicom
                                Borehamwood  Hert  WD6 1NA\r
                                GB\r
 \r
+70-B3-D5   (hex)               Kospel S.A.\r
+249000-249FFF     (base 16)            Kospel S.A.\r
+                               Olchowa 1\r
+                               Koszalin    75-136\r
+                               PL\r
+\r
 70-B3-D5   (hex)               Microchip Technology Germany II GmbH&Co.KG\r
 77F000-77FFFF     (base 16)            Microchip Technology Germany II GmbH&Co.KG\r
                                Emmy-Noether-Straße 14\r
@@ -13148,12 +13544,6 @@ C98000-C98FFF     (base 16)            Trust Automation
                                San Luis Obispo  CA  93401\r
                                US\r
 \r
-70-B3-D5   (hex)               Kospel S.A.\r
-249000-249FFF     (base 16)            Kospel S.A.\r
-                               Olchowa 1\r
-                               Koszalin    75-136\r
-                               PL\r
-\r
 70-B3-D5   (hex)               Coheros Oy\r
 D2E000-D2EFFF     (base 16)            Coheros Oy\r
                                Tammukkakatu 6\r
@@ -13166,18 +13556,6 @@ E24000-E24FFF     (base 16)            Gogo Business Aviation
                                Broomfield  CO  80021\r
                                US\r
 \r
-70-B3-D5   (hex)               Taejin InfoTech\r
-A75000-A75FFF     (base 16)            Taejin InfoTech\r
-                               40, Imi-ro, A-411\r
-                               Uiwang-si  Gyeonggi-do  16006\r
-                               KR\r
-\r
-70-B3-D5   (hex)               ARCLAN'SYSTEM\r
-25C000-25CFFF     (base 16)            ARCLAN'SYSTEM\r
-                               1140 rue Ampère - Actimart II - Lot 9\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
@@ -13190,6 +13568,18 @@ F6A000-F6AFFF     (base 16)            Guan Show Technologe Co., Ltd.
                                 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
+                               Uiwang-si  Gyeonggi-do  16006\r
+                               KR\r
+\r
+70-B3-D5   (hex)               ARCLAN'SYSTEM\r
+25C000-25CFFF     (base 16)            ARCLAN'SYSTEM\r
+                               1140 rue Ampère - Actimart II - Lot 9\r
+                               AIX EN PROVENCE    13290\r
+                               FR\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
@@ -13202,6 +13592,12 @@ A77000-A77FFF     (base 16)            SPX Radiodetection
                                Bristol  Avon  BS14 0AF\r
                                GB\r
 \r
+70-B3-D5   (hex)               INVISSYS\r
+AD4000-AD4FFF     (base 16)            INVISSYS\r
+                               25 rue marcel issartier\r
+                               merignac    33700\r
+                               FR\r
+\r
 70-B3-D5   (hex)               LM-Instruments Oy\r
 5AC000-5ACFFF     (base 16)            LM-Instruments Oy\r
                                Norrbyn rantatie 8\r
@@ -13214,28 +13610,16 @@ DBB000-DBBFFF     (base 16)           Fuhr GmbH Filtertechnik
                                Klein-Winternheim  Rheinland-Pfalz  55270\r
                                DE\r
 \r
-70-B3-D5   (hex)               Sanmina Israel\r
-C18000-C18FFF     (base 16)            Sanmina Israel\r
-                               Koren Industrial Zone , POBox 102\r
-                               Maalot  Israel  2101002\r
-                               IL\r
-\r
-70-B3-D5   (hex)               INVISSYS\r
-AD4000-AD4FFF     (base 16)            INVISSYS\r
-                               25 rue marcel issartier\r
-                               merignac    33700\r
-                               FR\r
-\r
 70-B3-D5   (hex)               Panoramic Power\r
 669000-669FFF     (base 16)            Panoramic Power\r
                                15 Atir Yeda\r
                                Kfar Saba    4464312\r
                                IL\r
 \r
-70-B3-D5   (hex)               Panoramic Power\r
-06D000-06DFFF     (base 16)            Panoramic Power\r
-                               Atir Yeda 15\r
-                               Kfar Saba    4464312\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)               Avlinkpro\r
@@ -13244,11 +13628,11 @@ AD4000-AD4FFF     (base 16)           INVISSYS
                                Totowa  NJ  07512\r
                                US\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)               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)               C4I Systems Ltd\r
 5C6000-5C6FFF     (base 16)            C4I Systems Ltd\r
@@ -13262,47 +13646,227 @@ C36000-C36FFF     (base 16)          Knowledge Resources GmbH
                                Bsel  BS  4057\r
                                CH\r
 \r
-70-B3-D5   (hex)               YUYAMA MFG Co.,Ltd\r
-BBB000-BBBFFF     (base 16)            YUYAMA MFG Co.,Ltd\r
-                               3-3-1\r
-                               TOYONAKASHI  OSAKA  561-0841\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)               adnexo GmbH\r
+4E3000-4E3FFF     (base 16)            adnexo GmbH\r
+                               Rennweg 38\r
+                               Zürich  Zurich  8001\r
+                               CH\r
+\r
+70-B3-D5   (hex)               Sumitomo Heavy Industries, Ltd.\r
+C23000-C23FFF     (base 16)            Sumitomo Heavy Industries, Ltd.\r
+                               5-2, Soubiraki-cho\r
+                               Niihama  Ehime  792-8588\r
                                JP\r
 \r
-70-B3-D5   (hex)               D-E-K GmbH & Co.KG\r
-219000-219FFF     (base 16)            D-E-K GmbH & Co.KG\r
-                               Südfeld 9\r
-                               Ascheberg / Herbern    58387\r
-                               DE\r
+70-B3-D5   (hex)               LLC Open Converged Networks\r
+73F000-73FFFF     (base 16)            LLC Open Converged Networks\r
+                               st. Stepana Shutova 8-1-34\r
+                               Moscow  Moscow  109380\r
+                               RU\r
 \r
-70-B3-D5   (hex)               AvMap srlu\r
-B4F000-B4FFFF     (base 16)            AvMap srlu\r
-                               Viale Zaccagna 6\r
-                               Carrara    54033\r
-                               IT\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)               Theatrixx Technologies, Inc.\r
-5DD000-5DDFFF     (base 16)            Theatrixx Technologies, Inc.\r
-                               1655 Richardson\r
-                               Montreal  QC  H3K3J7\r
-                               CA\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
+                               Shenzhen  Guangdong  518109\r
+                               CN\r
 \r
-70-B3-D5   (hex)               EA Elektroautomatik GmbH & Co. KG\r
-6BC000-6BCFFF     (base 16)            EA Elektroautomatik GmbH & Co. KG\r
-                               Helmholtzstraße 31-33\r
-                               Viersen  NRW  41747\r
-                               DE\r
+70-B3-D5   (hex)               RCH Vietnam Limited Liability Company\r
+294000-294FFF     (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)               Adolf Nissen Elektrobau GmbH + Co. KG\r
-101000-101FFF     (base 16)            Adolf Nissen Elektrobau GmbH + Co. KG\r
-                               Friedrichstädter Chaussee 4\r
-                               Tönning    25832\r
-                               DE\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)               TinTec Co., Ltd.\r
-5AE000-5AEFFF     (base 16)            TinTec Co., Ltd.\r
-                               #825 101, Magokseo-ro, Gangseo-gu\r
-                               Seoul    07798\r
-                               KR\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)               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
+                               Wuhan  Hubei  430074\r
+                               CN\r
+\r
+70-B3-D5   (hex)               BESO sp. z o.o.\r
+D7D000-D7DFFF     (base 16)            BESO sp. z o.o.\r
+                               Mlynska 1a\r
+                               Brzeg Dolny    56-120\r
+                               PL\r
+\r
+70-B3-D5   (hex)               PCTEL\r
+ED2000-ED2FFF     (base 16)            PCTEL\r
+                               22600 gateway center drive, Suite 100\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
+                               Rorschacherberg  Goldach  9403\r
+                               CH\r
+\r
+70-B3-D5   (hex)               National Time & Signal Corp.\r
+846000-846FFF     (base 16)            National Time & Signal Corp.\r
+                               28045 Oakland Oaks Ct\r
+                               Wixom  MI  48393\r
+                               US\r
+\r
+70-B3-D5   (hex)               Senior Group LLC\r
+D19000-D19FFF     (base 16)            Senior Group LLC\r
+                               1300 West Main Street\r
+                               Louisville  KY  40203\r
+                               US\r
+\r
+70-B3-D5   (hex)               Sportsbeams Lighting, Inc.\r
+9C2000-9C2FFF     (base 16)            Sportsbeams Lighting, Inc.\r
+                               1260 Pine Forest Cir\r
+                               Round Rock  TX  78665\r
+                               US\r
+\r
+70-B3-D5   (hex)               Amico Corporation\r
+B90000-B90FFF     (base 16)            Amico Corporation\r
+                               85 Fulton Way\r
+                               Richmond Hill  ON   L4B 2N4\r
+                               CA\r
+\r
+70-B3-D5   (hex)               ICTK Holdings\r
+5C9000-5C9FFF     (base 16)            ICTK Holdings\r
+                               3F Ventureforum B'd, Pangyodae-ro\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)               LARIMART SPA\r
+536000-536FFF     (base 16)            LARIMART SPA\r
+                               VIA DI TORREVECCHIA\r
+                               ROMA    00168\r
+                               IT\r
+\r
+70-B3-D5   (hex)               Transformational Security, LLC\r
+762000-762FFF     (base 16)            Transformational Security, LLC\r
+                               9101 Guilford Rd\r
+                               Columbia  MD  21046\r
+                               US\r
+\r
+70-B3-D5   (hex)               Breas Medical AB\r
+EDA000-EDAFFF     (base 16)            Breas Medical AB\r
+                               Företagsvägen 1\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)               Alto Aviation\r
+D0F000-D0FFFF     (base 16)            Alto Aviation\r
+                               86 Leominster Road\r
+                               Sterling  MA  01564\r
+                               US\r
+\r
+70-B3-D5   (hex)               BOE Technology Group Co., Ltd.\r
+5A1000-5A1FFF     (base 16)            BOE Technology Group Co., Ltd.\r
+                               No.12 Xihuanzhong RD, BDA\r
+                               Beijing  Beijing  100176\r
+                               CN\r
+\r
+70-B3-D5   (hex)               KAEONIT\r
+992000-992FFF     (base 16)            KAEONIT\r
+                               51 boulevard Tristan Corbiere\r
+                               Marseille    13012\r
+                               FR\r
+\r
+70-B3-D5   (hex)               LG Electronics\r
+A23000-A23FFF     (base 16)            LG Electronics\r
+                               LG Science Park, 10, Magokjungang 10-ro, GangSeo-gu\r
+                               SEOUL    07796\r
+                               KR\r
+\r
+70-B3-D5   (hex)               YUYAMA MFG Co.,Ltd\r
+BBB000-BBBFFF     (base 16)            YUYAMA MFG Co.,Ltd\r
+                               3-3-1\r
+                               TOYONAKASHI  OSAKA  561-0841\r
+                               JP\r
+\r
+70-B3-D5   (hex)               D-E-K GmbH & Co.KG\r
+219000-219FFF     (base 16)            D-E-K GmbH & Co.KG\r
+                               Südfeld 9\r
+                               Ascheberg / Herbern    58387\r
+                               DE\r
+\r
+70-B3-D5   (hex)               AvMap srlu\r
+B4F000-B4FFFF     (base 16)            AvMap srlu\r
+                               Viale Zaccagna 6\r
+                               Carrara    54033\r
+                               IT\r
+\r
+70-B3-D5   (hex)               Theatrixx Technologies, Inc.\r
+5DD000-5DDFFF     (base 16)            Theatrixx Technologies, Inc.\r
+                               1655 Richardson\r
+                               Montreal  QC  H3K3J7\r
+                               CA\r
+\r
+70-B3-D5   (hex)               EA Elektroautomatik GmbH & Co. KG\r
+6BC000-6BCFFF     (base 16)            EA Elektroautomatik GmbH & Co. KG\r
+                               Helmholtzstraße 31-33\r
+                               Viersen  NRW  41747\r
+                               DE\r
+\r
+70-B3-D5   (hex)               Adolf Nissen Elektrobau GmbH + Co. KG\r
+101000-101FFF     (base 16)            Adolf Nissen Elektrobau GmbH + Co. KG\r
+                               Friedrichstädter Chaussee 4\r
+                               Tönning    25832\r
+                               DE\r
+\r
+70-B3-D5   (hex)               TinTec Co., Ltd.\r
+5AE000-5AEFFF     (base 16)            TinTec Co., Ltd.\r
+                               #825 101, Magokseo-ro, Gangseo-gu\r
+                               Seoul    07798\r
+                               KR\r
 \r
 70-B3-D5   (hex)               Blue Storm Associates, Inc.\r
 9EA000-9EAFFF     (base 16)            Blue Storm Associates, Inc.\r
@@ -14162,9 +14726,6 @@ C9E000-C9EFFF     (base 16)             FUKUDA SANGYO CO., LTD.
                                Nagareyama  Chiba  2700145\r
                                JP\r
 \r
-70-B3-D5   (hex)               Private\r
-73A000-73AFFF     (base 16)            Private\r
-\r
 70-B3-D5   (hex)               Rako Controls Ltd\r
 084000-084FFF     (base 16)            Rako Controls Ltd\r
                                Knight Road\r
@@ -14537,12 +15098,6 @@ D5C000-D5CFFF     (base 16)            Critical Link LLC
                                F-13752  LES PENNES MIRABEAU  CS30084\r
                                FR\r
 \r
-70-B3-D5   (hex)               YG COMPANY CO., LTD\r
-63F000-63FFFF     (base 16)            YG COMPANY CO., LTD\r
-                               65, Techno 3-ro\r
-                               Daejeon  Yuseong-gu  34016\r
-                               KR\r
-\r
 70-B3-D5   (hex)               SYS TEC electronic GmbH\r
 7FD000-7FDFFF     (base 16)            SYS TEC electronic GmbH\r
                                Am Windrad 2\r
@@ -15935,12 +16490,6 @@ FD2000-FD2FFF     (base 16)            DALIAN  LEVEAR ELECTRIC  CO., LTD
                                Hanoi    123456\r
                                VN\r
 \r
-70-B3-D5   (hex)               Xcenter AS\r
-E1C000-E1CFFF     (base 16)            Xcenter AS\r
-                               Kjorbokollen 30\r
-                               Sandvika  -  1337\r
-                               NO\r
-\r
 70-B3-D5   (hex)               Kohler Mira Ltd\r
 F55000-F55FFF     (base 16)            Kohler Mira Ltd\r
                                Cromwell Road\r
@@ -16544,12 +17093,6 @@ A00000-A00FFF     (base 16)            ATX NETWORKS LTD
                                Nijkerk  n.a.  3861SC\r
                                NL\r
 \r
-70-B3-D5   (hex)               BRS Sistemas Eletronicos\r
-D97000-D97FFF     (base 16)            BRS Sistemas Eletronicos\r
-                               Rua Gomes de Freitas, 491/204\r
-                               Porto Alegre - RS  (Non U.S.)  91380-000\r
-                               BR\r
-\r
 70-B3-D5   (hex)               Li Seng Technology Ltd.,\r
 4F0000-4F0FFF     (base 16)            Li Seng Technology Ltd.,\r
                                901., Siu Fung Hong Building\r
@@ -17507,30 +18050,24 @@ BE0000-BE0FFF     (base 16)           Cognosos, Inc.
                                Taoyuan      330\r
                                TW\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)               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)               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
@@ -17543,34 +18080,40 @@ F9F000-F9FFFF     (base 16)           M.A.C. Solutions (UK) Ltd
                                Redditch  Worcestershire  B98 8LG\r
                                GB\r
 \r
-70-B3-D5   (hex)               Shenzhen CAMERAY ELECTRONIC CO., LTD\r
-1E2000-1E2FFF     (base 16)            Shenzhen CAMERAY ELECTRONIC CO., LTD\r
-                               4-5FL, Building 1, Guanghui Science, and Technology Park; Minqing Road, Longhua Town\r
-                               shenzhen  GD  518109\r
-                               CN\r
-\r
-70-B3-D5   (hex)               Vulcan Wireless Inc.\r
-E4D000-E4DFFF     (base 16)            Vulcan Wireless Inc.\r
-                               2218 Faraday Ave Suite 110\r
-                               Carlsbad  CA  92008\r
-                               US\r
-\r
 70-B3-D5   (hex)               ERA TOYS LIMITED\r
 193000-193FFF     (base 16)            ERA TOYS LIMITED\r
                                Room 505, 5th Floor, Beverley Commercial Centre, 87-105 Chatham Road South\r
                                Tsim Sha Tsui  Kowloon  0000\r
                                HK\r
 \r
+70-B3-D5   (hex)               T&M Media Pty Ltd\r
+B41000-B41FFF     (base 16)            T&M Media Pty Ltd\r
+                               6, 476 Gardeners Road\r
+                               Alexandria  NSW  2015\r
+                               AU\r
+\r
+70-B3-D5   (hex)               A&T Corporation\r
+32E000-32EFFF     (base 16)            A&T Corporation\r
+                               2023-1\r
+                               Endo, Fujisawa, Kanagawa    252-0816\r
+                               JP\r
+\r
 70-B3-D5   (hex)               Scorpion Precision Industry (HK)CO. Ltd.\r
 02B000-02BFFF     (base 16)            Scorpion Precision Industry (HK)CO. Ltd.\r
                                16th Floor, Excelsior Industrial Building,68-76 Sha Tsui Road,\r
                                Tsuen Wan  New Territories  999077\r
                                HK\r
 \r
-70-B3-D5   (hex)               Cryptotronix LLC\r
-0DB000-0DBFFF     (base 16)            Cryptotronix LLC\r
-                               P.O. Box 273029\r
-                               Fort Collins  CO  80525\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)               MIVO Technology AB\r
@@ -17579,11 +18122,11 @@ E4D000-E4DFFF     (base 16)           Vulcan Wireless Inc.
                                Stockholm    11215\r
                                SE\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
+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)               TOMEI TSUSHIN KOGYO CO,.LTD\r
 FB1000-FB1FFF     (base 16)            TOMEI TSUSHIN KOGYO CO,.LTD\r
@@ -17591,12 +18134,6 @@ FB1000-FB1FFF     (base 16)            TOMEI TSUSHIN KOGYO CO,.LTD
                                Inazawa Shi  Aichi ken  4928274\r
                                JP\r
 \r
-70-B3-D5   (hex)               DogWatch Inc\r
-1E7000-1E7FFF     (base 16)            DogWatch Inc\r
-                               10 Michigan Drive\r
-                               Natick    01760\r
-                               US\r
-\r
 70-B3-D5   (hex)               RCH Vietnam Limited Liability Company\r
 C09000-C09FFF     (base 16)            RCH Vietnam Limited Liability Company\r
                                Workshop F.01B-2, Lot No. F.01B Long Hau\r
@@ -17609,6 +18146,24 @@ F69000-F69FFF     (base 16)            Copper Labs, Inc.
                                Boulder  CO  80301\r
                                US\r
 \r
+70-B3-D5   (hex)               DogWatch Inc\r
+1E7000-1E7FFF     (base 16)            DogWatch Inc\r
+                               10 Michigan Drive\r
+                               Natick    01760\r
+                               US\r
+\r
+70-B3-D5   (hex)               Grossenbacher Systeme AG\r
+B75000-B75FFF     (base 16)            Grossenbacher Systeme AG\r
+                               Spinnereistrasse 10\r
+                               St. Gallen    9008\r
+                               CH\r
+\r
+70-B3-D5   (hex)               ITsynergy Ltd\r
+D2A000-D2AFFF     (base 16)            ITsynergy Ltd\r
+                               9 Bonhill Street\r
+                               London    EC2A 4DJ\r
+                               GB\r
+\r
 70-B3-D5   (hex)               SHENZHEN HUINENGYUAN Technology Co., Ltd\r
 A83000-A83FFF     (base 16)            SHENZHEN HUINENGYUAN Technology Co., Ltd\r
                                Room 206, 3 Building, Hongwanchuangke Center, Gushu, Xixiang, Baoan District\r
@@ -17627,101 +18182,365 @@ C94000-C94FFF     (base 16)         Vars Technology
                                Littleton  MA  01460\r
                                US\r
 \r
-70-B3-D5   (hex)               Inventeq B.V.\r
-529000-529FFF     (base 16)            Inventeq B.V.\r
-                               Ravenlaan 27\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
+70-B3-D5   (hex)               Inventeq B.V.\r
+529000-529FFF     (base 16)            Inventeq B.V.\r
+                               Ravenlaan 27\r
+                               Blaricum    1261WT\r
+                               NL\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
+                               US\r
+\r
+70-B3-D5   (hex)               Sprintshield d.o.o.\r
+B03000-B03FFF     (base 16)            Sprintshield d.o.o.\r
+                               Marina Getaldi?a 3\r
+                               Velika Gorica    10410\r
+                               HR\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
+                               DE\r
+\r
+70-B3-D5   (hex)               MB connect line GmbH Fernwartungssysteme\r
+6D7000-6D7FFF     (base 16)            MB connect line GmbH Fernwartungssysteme\r
+                               Winnettener Straße 6\r
+                               Dinkelsbuehl  Bavaria  91550\r
+                               DE\r
+\r
+70-B3-D5   (hex)               EarTex\r
+E01000-E01FFF     (base 16)            EarTex\r
+                               41 Corsham Street\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
+                               Westport  CT  06880\r
+                               US\r
+\r
+70-B3-D5   (hex)               Techimp - Altanova group Srl\r
+6DB000-6DBFFF     (base 16)            Techimp - Altanova group Srl\r
+                               via Toscana 11/C\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)               GS Elektromedizinsiche Geräte G. Stemple GmbH\r
+3D3000-3D3FFF     (base 16)            GS Elektromedizinsiche Geräte G. Stemple GmbH\r
+                               Hauswiesenstr. 26\r
+                               Kaufering  Bayern  86916\r
+                               DE\r
+\r
+70-B3-D5   (hex)               Hunan Lianzhong Technology Co.,Ltd.\r
+F4E000-F4EFFF     (base 16)            Hunan Lianzhong Technology Co.,Ltd.\r
+                               5th Floor, Chuangye Building, Economic and Technological Development Zone,\r
+                               Loudi  Hunan   417000\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Diretta\r
+C90000-C90FFF     (base 16)            Diretta\r
+                               3-4-9 HigashiKomagata Sumida-ku\r
+                               Tokyo    1300005\r
+                               JP\r
+\r
+70-B3-D5   (hex)               RoomMate AS\r
+E1C000-E1CFFF     (base 16)            RoomMate AS\r
+                               Hamangskogen 60\r
+                               Sandvika  -  1338\r
+                               NO\r
+\r
+70-B3-D5   (hex)               DARBS Inc.\r
+63F000-63FFFF     (base 16)            DARBS Inc.\r
+                               #153, #154, 65 Techno 3-ro\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
+                               CH\r
+\r
+70-B3-D5   (hex)               Profusion Limited\r
+29A000-29AFFF     (base 16)            Profusion Limited\r
+                               Aviation Way\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
+\r
+70-B3-D5   (hex)               Cubitech\r
+B86000-B86FFF     (base 16)            Cubitech\r
+                               4-6 Kiprou str\r
+                               Tavros  Athens  17778\r
+                               GR\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
+                               San Diego   CA  92127\r
+                               US\r
+\r
+70-B3-D5   (hex)               Zeus Control Systems Ltd\r
+E73000-E73FFF     (base 16)            Zeus Control Systems Ltd\r
+                               1-4 Alexander House Station Road\r
+                               Nuneaton    CV13 0PE\r
+                               GB\r
+\r
+70-B3-D5   (hex)               Flextronics International Kft.\r
+E2F000-E2FFFF     (base 16)            Flextronics International Kft.\r
+                               Zrínyi Miklós str. 38.\r
+                               Zalaegerszeg    8900\r
+                               HU\r
+\r
+70-B3-D5   (hex)               Beijing Lihong Create Co., Ltd.\r
+ED3000-ED3FFF     (base 16)            Beijing Lihong Create Co., Ltd.\r
+                               Changping, Zhenxinglu. 46\r
+                               Beijing    102299\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Integra Metering SAS\r
+B6F000-B6FFFF     (base 16)            Integra Metering SAS\r
+                               12 rue Font Grasse\r
+                               Blagnac    31700\r
+                               FR\r
+\r
+70-B3-D5   (hex)               AXING AG\r
+263000-263FFF     (base 16)            AXING AG\r
+                               Gewerbehaus Moskau\r
+                               Ramsen    8262\r
+                               CH\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
+                                Koto-ku  Tokyo  136-8671\r
+                               JP\r
+\r
+70-B3-D5   (hex)               Schneider Electric Motion USA\r
+33D000-33DFFF     (base 16)            Schneider Electric Motion USA\r
+                               370 N. Main St.\r
+                               Marlborough  CT  06447\r
+                               US\r
+\r
+70-B3-D5   (hex)               Wired Broadcast Ltd\r
+177000-177FFF     (base 16)            Wired Broadcast Ltd\r
+                                Berol House, 25 Ashley Road\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
+                               Walzbachtal  Baden-Württemberg  75045\r
+                               DE\r
+\r
+70-B3-D5   (hex)               MAHLE ELECTRONICS, SLU\r
+8BD000-8BDFFF     (base 16)            MAHLE ELECTRONICS, SLU\r
+                               CTRA.MADRID-VALENCIA,KM.196\r
+                               MOTILLA DEL PALANCAR  CUENCA  16200\r
+                               ES\r
+\r
+70-B3-D5   (hex)               Intermobility\r
+6AA000-6AAFFF     (base 16)            Intermobility\r
+                               Gabelle 18a\r
+                               Bienne  berne  2503\r
+                               CH\r
+\r
+70-B3-D5   (hex)               BRS Sistemas Eletrônicos\r
+D97000-D97FFF     (base 16)            BRS Sistemas Eletrônicos\r
+                               Rua Gomes de Freitas, 491/204\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
+                               Grand Prairie  TX  75050\r
+                               US\r
+\r
+70-B3-D5   (hex)               DogWatch Inc\r
+567000-567FFF     (base 16)            DogWatch Inc\r
+                               10 Michigan Drive\r
+                               Natick  MA  01760\r
+                               US\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)               ITsynergy Ltd\r
-D2A000-D2AFFF     (base 16)            ITsynergy Ltd\r
-                               9 Bonhill Street\r
-                               London    EC2A 4DJ\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
+                               HIGH WYCOMBE    HP12 3QL\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)               chargeBIG\r
-869000-869FFF     (base 16)            chargeBIG\r
-                               Pragstraße 26-46\r
-                               Stuttgart    70376\r
-                               DE\r
+70-B3-D5   (hex)               TUALCOM ELEKTRONIK A.S.\r
+4A3000-4A3FFF     (base 16)            TUALCOM ELEKTRONIK A.S.\r
+                               Mustafa Kemal mah.\r
+                               ANKARA    06530\r
+                               TR\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
+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)               Sprintshield d.o.o.\r
-B03000-B03FFF     (base 16)            Sprintshield d.o.o.\r
-                               Marina Getaldi?a 3\r
-                               Velika Gorica    10410\r
-                               HR\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)               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)               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)               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)               Hensoldt Sensors GmbH\r
+2D3000-2D3FFF     (base 16)            Hensoldt Sensors GmbH\r
+                               Woerthstrasse 85\r
+                               Ulm  Baden-Wuerttemberg  89081\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
+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)               MB connect line GmbH Fernwartungssysteme\r
-6D7000-6D7FFF     (base 16)            MB connect line GmbH Fernwartungssysteme\r
-                               Winnettener Straße 6\r
-                               Dinkelsbuehl  Bavaria  91550\r
-                               DE\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)               EarTex\r
-E01000-E01FFF     (base 16)            EarTex\r
-                               41 Corsham Street\r
-                               London  England  N1 6DR\r
-                               GB\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)               AVL DiTEST GmbH\r
-78D000-78DFFF     (base 16)            AVL DiTEST GmbH\r
-                               Alte Poststrasse 156\r
-                               Graz    8020\r
-                               AT\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)               Scharco Elektronik GmbH\r
-C72000-C72FFF     (base 16)            Scharco Elektronik GmbH\r
-                               Tilsiter Strasse 8\r
-                               Wuppertal  NRW  42277\r
-                               DE\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)               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
+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)               myUpTech AB\r
-FC3000-FC3FFF     (base 16)            myUpTech AB\r
-                               Box 14\r
-                               Markaryd    28532\r
-                               SE\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)               DISMUNTEL SAL\r
 92C000-92CFFF     (base 16)            DISMUNTEL SAL\r
@@ -19004,12 +19823,6 @@ D7B000-D7BFFF     (base 16)            Peter Huber Kaeltemaschinenbau AG
                                shenzhen  China  518102\r
                                CN\r
 \r
-70-B3-D5   (hex)               Storbyte, Inc.\r
-63D000-63DFFF     (base 16)            Storbyte, Inc.\r
-                               1800 Washington Blvd Suite 412\r
-                               Baltimore  MD  21230\r
-                               US\r
-\r
 70-B3-D5   (hex)               Savari Inc\r
 207000-207FFF     (base 16)            Savari Inc\r
                                2005 De la cruz blvd, st 111,\r
@@ -22055,17 +22868,23 @@ A6A000-A6AFFF     (base 16)           Privafy, Inc
                                Oslo  Oslo  0504\r
                                NO\r
 \r
+70-B3-D5   (hex)               RCH Vietnam Limited Liability Company\r
+6BD000-6BDFFF     (base 16)            RCH Vietnam Limited Liability Company\r
+                               Workshop F.01B-2, Lot No. F.01B Long Hau\r
+                               Ho Chi Minh City  Ho Chi Minh  70000\r
+                               VN\r
+\r
 70-B3-D5   (hex)               Gamber Johnson-LLC\r
 E34000-E34FFF     (base 16)            Gamber Johnson-LLC\r
                                3001 Borham Ave\r
                                Stevens Point  WI  54481\r
                                US\r
 \r
-70-B3-D5   (hex)               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
+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)               YUYAMA MFG Co.,Ltd\r
 1F2000-1F2FFF     (base 16)            YUYAMA MFG Co.,Ltd\r
@@ -22079,74 +22898,272 @@ E34000-E34FFF     (base 16)          Gamber Johnson-LLC
                                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)               Adcole Maryland Aerospace\r
-922000-922FFF     (base 16)            Adcole Maryland Aerospace\r
-                               669 Forest St\r
-                               Marlborough  MA  01752\r
-                               US\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)               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)               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)               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
+\r
+70-B3-D5   (hex)               Redstone Sunshine(Beijing)Technology Co.,Ltd.\r
+6C9000-6C9FFF     (base 16)            Redstone Sunshine(Beijing)Technology Co.,Ltd.\r
+                               Floor 2,Block B,Fu Xing Office Building,He Tao Yuan NO.30,Guan Dong Dian Bei Jie,Chao Yang District\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
+\r
+70-B3-D5   (hex)               HAI ROBOTICS Co., Ltd.\r
+0B7000-0B7FFF     (base 16)            HAI ROBOTICS Co., Ltd.\r
+                               Room 101, 1st Floor, Xuda Industrial Park, Xiaweiyuanyixiang Xixiang, Bao'an District\r
+                               SHENZHEN  GUANGDONG  518000\r
+                               CN\r
+\r
+70-B3-D5   (hex)               inomatic GmbH\r
+1CA000-1CAFFF     (base 16)            inomatic GmbH\r
+                               Karl-Braun-Straße 12\r
+                               Nordhorn    48531\r
+                               DE\r
+\r
+70-B3-D5   (hex)               Integer.pl S.A.\r
+2D1000-2D1FFF     (base 16)            Integer.pl S.A.\r
+                               Wielicka 28\r
+                               Krakow    30-552\r
+                               PL\r
+\r
+70-B3-D5   (hex)               Benchmark Electronics - Secure Technology\r
+67C000-67CFFF     (base 16)            Benchmark Electronics - Secure Technology\r
+                               1740 E Wilshire Ave\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)               Kazdream Technologies LLP\r
+089000-089FFF     (base 16)            Kazdream Technologies LLP\r
+                               10, Turkestan Str.\r
+                               Nur-Sultan    010000\r
+                               KZ\r
+\r
+70-B3-D5   (hex)               Cardinal Scales Manufacturing Co\r
+E5A000-E5AFFF     (base 16)            Cardinal Scales Manufacturing Co\r
+                               203 East Daugherty Street\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
+                               Seoul    08389\r
+                               KR\r
+\r
+70-B3-D5   (hex)               Talleres de Escoriaza SA\r
+E83000-E83FFF     (base 16)            Talleres de Escoriaza SA\r
+                               Barrio Ventas, 35\r
+                               Irun  Gipuzkoa  20305\r
+                               ES\r
+\r
+70-B3-D5   (hex)               Network Innovations\r
+DA7000-DA7FFF     (base 16)            Network Innovations\r
+                               4950 West Prospect Road\r
+                               Fort Lauderdale  FL  33309\r
+                               US\r
+\r
+70-B3-D5   (hex)               SLAT\r
+2C8000-2C8FFF     (base 16)            SLAT\r
+                               11 Rue Jean-Elysée DUPUY\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
+                               Shanghai    201808\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Selmatec AS\r
+8FE000-8FEFFF     (base 16)            Selmatec AS\r
+                               Berghagen 3\r
+                               Oslo  Select One  1405\r
+                               NO\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
+                               Marlborough  MA  01752\r
+                               US\r
+\r
+70-B3-D5   (hex)               QSnet Visual Technologies Ltd\r
+5C7000-5C7FFF     (base 16)            QSnet Visual Technologies Ltd\r
+                               13 Gan Rave\r
+                               YAVNE  ISRAEL  8122321\r
+                               IL\r
+\r
+70-B3-D5   (hex)               MB connect line GmbH Fernwartungssysteme\r
+886000-886FFF     (base 16)            MB connect line GmbH Fernwartungssysteme\r
+                               Winnettener Straße 6\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
+\r
+70-B3-D5   (hex)               Edge Power Solutions\r
+612000-612FFF     (base 16)            Edge Power Solutions\r
+                               5131 Industry Drive, Suite 107\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
+\r
+70-B3-D5   (hex)               Antek Technology \r
+9E5000-9E5FFF     (base 16)            Antek Technology \r
+                               11F, No. 51 Heng Yang Road\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
+\r
+70-B3-D5   (hex)               ARECA EMBEDDED SYSTEMS PVT LTD\r
+F15000-F15FFF     (base 16)            ARECA EMBEDDED SYSTEMS PVT LTD\r
+                               Plot No.5B, Survey No.184-185, P-V, Cherlapally\r
+                               HYDERABAD  TELANGANA  500051\r
+                               IN\r
+\r
+70-B3-D5   (hex)               KOREA SPECTRAL PRODUCTS\r
+F59000-F59FFF     (base 16)            KOREA SPECTRAL PRODUCTS\r
+                               Room #402, 273, DIGITAL-RO,\r
+                               GURO-GU  SEOUL  08381\r
+                               KR\r
+\r
+70-B3-D5   (hex)               YOUSUNG\r
+3B4000-3B4FFF     (base 16)            YOUSUNG\r
+                               76, Gaetbeol-ro, Yeonsu-gu\r
+                               Incheon    21999\r
+                               KR\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
index 8bbe57abbc318e4d71b8a79af8cd42320f376853..c51a6cfabbb6e86a484ffd33c4d484c3a70246c8 100644 (file)
@@ -1,8 +1,8 @@
 #
 #      List of PCI ID's
 #
-#      Version: 2020.03.05
-#      Date:    2020-03-05 03:15:04
+#      Version: 2020.06.24
+#      Date:    2020-06-24 03:15:01
 #
 #      Maintained by Albert Pool, Martin Mares, and other volunteers from
 #      the PCI ID Project at https://pci-ids.ucw.cz/.
@@ -91,6 +91,8 @@
        1703  ISDN Adapter (PCI Bus, DV, W)
        1704  ISDN Adapter (PCI Bus, D, C)
 0721  Sapphire, Inc.
+0731  Jingjia Microelectronics Co Ltd
+       7200  JM7200 Series GPU
 0777  Ubiquiti Networks, Inc.
 0795  Wired Inc.
        6663  Butane II (MPEG2 encoder board)
                1028 1f4c  PERC H330 Mini (for blades)
                1028 1f4d  PERC H330 Embedded (for monolithic)
                1054 306a  SAS 3004 iMR ROMB
+               1734 1211  PRAID CP400i [D3307-A12]
                1d49 04db  ServeRAID M1210 SAS/SATA Controller
                1d49 0504  ThinkSystem RAID 520-8i PCIe 12Gb Adapter
        0060  MegaRAID SAS 1078
                1028 1fd3  HBA330 MMZ
 # Supermicro AOC-S3008L-L8e uses 0808 for their SAS3008 SAS controller
                15d9 0808  AOC-S3008L-L8e
+               1bd4 0008  12G SAS3008IMR Onboard
                1bd4 000b  12G SAS3008IR
                1bd4 000c  12G SAS3008IT
                1bd4 0011  Inspur 12Gb 8i-3008 IT SAS HBA
                1bd4 0012  12Gb SAS3008IR UDM
+               1bd4 001f  12G SAS3008IR Onboard
+               1bd4 0020  12G SAS3008IT Onboard
                1bd4 0026  12G SAS3008IT RACK
                1bd4 0027  12G SAS3008IMR RACK
                1bd4 0028  12G SAS3008IR RACK
                105b 0e13  N15235/A74MX mainboard / AMD SB700
                1179 ff50  Satellite P305D-S8995E
                1458 a022  GA-MA770-DS3rev2.0 Motherboard
+               1458 a102  GA-880GMA-USB3
                17f2 5000  KI690-AM2 Motherboard
        4384  SBx00 PCI to PCI Bridge
        4385  SBx00 SMBus Controller
                1043 8443  M5A88-V EVO
                1043 84dd  M5A99X EVO (R1.0) SB950
                105b 0e13  N15235/A74MX mainboard / AMD SB700
+               1458 b002  GA-880GMA-USB3
                174b 1001  PURE Fusion Mini
        4392  SB7x0/SB8x0/SB9x0 SATA Controller [Non-RAID5 mode]
                105b 0e13  N15235/A74MX mainboard / AMD SB700
                1043 82ef  M3A78-EH Motherboard
                1043 8443  M5A88-V EVO
                105b 0e13  N15235/A74MX mainboard / AMD SB700
+               1458 5004  GA-880GMA-USB3
                15d9 a811  H8DGU
                174b 1001  PURE Fusion Mini
        4397  SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
                1043 82ef  M3A78-EH Motherboard
                1043 8443  M5A88-V EVO
                105b 0e13  N15235/A74MX mainboard / AMD SB700
+               1458 5004  GA-880GMA-USB3
                15d9 a811  H8DGU
                174b 1001  PURE Fusion Mini
        4398  SB7x0 USB OHCI1 Controller
                1043 82ef  M3A78-EH Motherboard
                1043 8443  M5A88-V EVO
                105b 0e13  N15235/A74MX mainboard / AMD SB700
+               1458 5004  GA-880GMA-USB3
                174b 1001  PURE Fusion Mini
        439c  SB7x0/SB8x0/SB9x0 IDE Controller
                1002 4392  MSI MS-7713 motherboard
        6650  Bonaire
        6651  Bonaire
        6658  Bonaire XTX [Radeon R7 260X/360]
+               1043 048f  R7260X-DC2OC-2GD5
                1043 04d3  AMD Radeon R7 260X
                148c 0907  Radeon R7 360
                1682 0907  Radeon R7 360
                1002 0b37  Radeon RX 480
                1028 1722  Radeon RX 570X
                1028 1723  Radeon RX 580X
+# OEM card found in desktops sold by HP.
+               103c 840e  Radeon RX 580 4GB
                1043 04a8  Radeon RX 480
                1043 04b0  Radeon RX 470
                1043 04fb  Radeon RX 480
        6861  Vega 10 XT [Radeon PRO WX 9100]
        6862  Vega 10 XT [Radeon PRO SSG]
        6863  Vega 10 XTX [Radeon Vega Frontier Edition]
-       6864  Vega
+       6864  Vega 10 [Radeon Pro V340]
        6867  Vega 10 XL [Radeon Pro Vega 56]
        6868  Vega 10 [Radeon PRO WX 8100/8200]
        686c  Vega 10 [Radeon Instinct MI25 MxGPU]
        687f  Vega 10 XL/XT [Radeon RX Vega 56/64]
                1002 0b36  RX Vega64
-               1002 6b76  RX Vega56
+               1002 6b76  RX Vega64
        6880  Lexington [Radeon HD 6550M]
                103c 163c  Pavilion dv6 Radeon HD 6550M
        6888  Cypress XT [FirePro V8800]
        6901  Topaz PRO [Radeon R5 M255]
                103c 1318  Radeon R6 M255DX
        6907  Meso XT [Radeon R5 M315]
-       6921  Amethyst XT [Radeon R9 M295X]
+       6920  Amethyst [Radeon R9 M395/ M395X Mac Edition]
+       6921  Amethyst XT [Radeon R9 M295X / M390X]
        6929  Tonga XT GL [FirePro S7150]
        692b  Tonga PRO GL [FirePro W7100]
                13cc 3d2b  MXRT-7600
                1043 049e  Radeon R9 FURY
                1043 04a0  Radeon R9 FURY X
                174b e329  Radeon R9 FURY
-       7310  Navi 10
+       7310  Navi 10 [Radeon Pro W5700X]
        7312  Navi 10 [Radeon Pro W5700]
        731f  Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT]
+               1da2 e411  Radeon RX 5600 XT
        7340  Navi 14 [Radeon RX 5500/5500M / Pro 5500M]
        7341  Navi 14 [Radeon Pro W5500]
        7347  Navi 14 [Radeon Pro W5500M]
        734f  Navi 14 [Radeon Pro W5300M]
+       7360  Navi 12 [Radeon Pro 5600M]
        7833  RS350 Host Bridge
        7834  RS350 [Radeon 9100 PRO/XT IGP]
        7835  RS350M [Mobility Radeon 9000 IGP]
        9599  RV635 PRO [Radeon HD 3650 AGP]
        95c0  RV620 PRO [Radeon HD 3470]
                1002 95c0  Mobility Radeon HD 3470
+               1028 3243  C120D
        95c2  RV620/M82 [Mobility Radeon HD 3410/3430]
        95c4  RV620/M82 [Mobility Radeon HD 3450/3470]
                1002 95c4  Mobility Radeon HD 3400
        aab0  Oland/Hainan/Cape Verde/Pitcairn HDMI Audio [Radeon HD 7000 Series]
        aab8  Tiran HDMI Audio
        aac0  Tobago HDMI Audio [Radeon R7 360 / R9 360 OEM]
+               1043 aac0  R7260X-DC2OC-2GD5
        aac8  Hawaii HDMI Audio [Radeon R9 290/290X / 390/390X]
        aad8  Tonga HDMI Audio [Radeon R9 285/380]
                174b aad8  Radeon R9 285/380 HDMI Audio
        0519  MGA 2064W [Millennium]
        051a  MGA 1064SG [Mystique]
                102b 0100  MGA-1064SG Mystique
+               102b 051a  MGA-1164SG Mystique 220
                102b 1100  MGA-1084SG Mystique
                102b 1200  MGA-1084SG Mystique
                1100 102b  MGA-1084SG Mystique
        0fd3  GK107M [GeForce GT 640M LE]
        0fd4  GK107M [GeForce GTX 660M]
        0fd5  GK107M [GeForce GT 650M Mac Edition]
+       0fd6  GK107M
        0fd8  GK107M [GeForce GT 640M Mac Edition]
        0fd9  GK107M [GeForce GT 645M]
        0fdb  GK107M
 # GRID K1 USM
        0fe7  GK107GL [GRID K100 vGPU]
                10de 101e  GRID K100
+       0fe8  GK107M
        0fe9  GK107M [GeForce GT 750M Mac Edition]
        0fea  GK107M [GeForce GT 755M Mac Edition]
        0fec  GK107M [GeForce 710A]
        11a3  GK104M [GeForce GTX 680MX]
                106b 010d  iMac 13,2
        11a7  GK104M [GeForce GTX 675MX]
+       11a9  GK104M [GeForce GTX 870M]
        11af  GK104GLM [GRID IceCube]
        11b0  GK104GL [GRID K240Q / K260Q vGPU]
                10de 101a  GRID K240Q
        1287  GK208B [GeForce GT 730]
        1288  GK208B [GeForce GT 720]
        1289  GK208 [GeForce GT 710]
+       128a  GK208B
        128b  GK208B [GeForce GT 710]
                1043 85f7  GT710-SL-1GD5
+       128c  GK208B
        1290  GK208M [GeForce GT 730M]
                103c 2afa  GeForce GT 730A
                103c 2b04  GeForce GT 730A
        1adb  TU106 USB Type-C UCSI Controller
                1043 8673  TURBO-RTX2070-8G
        1aeb  TU116 High Definition Audio Controller
-       1aed  TU116 [GeForce GTX 1650 SUPER]
+       1aec  TU116 USB 3.1 Host Controller
+       1aed  TU116 USB Type-C UCSI Controller
        1b00  GP102 [TITAN X]
        1b01  GP102 [GeForce GTX 1080 Ti 10GB]
        1b02  GP102 [TITAN Xp]
        1c91  GP107M [GeForce GTX 1050 3 GB Max-Q]
        1c92  GP107M [GeForce GTX 1050 Mobile]
        1c94  GP107M [GeForce MX350]
+       1c96  GP107M [GeForce MX350]
        1ca7  GP107GL
        1ca8  GP107GL
        1caa  GP107GL
        1d33  GP108GLM [Quadro P500 Mobile]
        1d34  GP108GLM [Quadro P520]
        1d52  GP108BM [GeForce MX250]
+       1d56  GP108BM [GeForce MX330]
        1d81  GV100 [TITAN V]
        1db1  GV100GL [Tesla V100 SXM2 16GB]
        1db2  GV100GL [Tesla V100 DGXS 16GB]
        1e30  TU102GL [Quadro RTX 6000/8000]
                10de 129e  Quadro RTX 8000
                10de 12ba  Quadro RTX 6000
+       1e36  TU102GL
        1e37  TU102GL [GRID RTX T10-4/T10-8/T10-16]
                10de 1347  GRID RTX T10-8
                10de 1348  GRID RTX T10-4
        1e87  TU104 [GeForce RTX 2080 Rev. A]
        1e89  TU104 [GeForce RTX 2060]
        1e90  TU104M [GeForce RTX 2080 Mobile]
+       1e91  TU104M [GeForce RTX 2070 SUPER Mobile / Max-Q]
+       1e93  TU104M [GeForce RTX 2080 SUPER Mobile / Max-Q]
        1eab  TU104M
        1eae  TU104M
        1eb0  TU104GL [Quadro RTX 5000]
        1ec2  TU104 [GeForce RTX 2070 SUPER]
        1ec7  TU104 [GeForce RTX 2070 SUPER]
        1ed0  TU104BM [GeForce RTX 2080 Mobile]
+       1ed1  TU104BM [GeForce RTX 2070 SUPER Mobile / Max-Q]
+       1ed3  TU104BM [GeForce RTX 2080 SUPER Mobile / Max-Q]
        1f02  TU106 [GeForce RTX 2070]
                1043 8673  TURBO RTX 2070
        1f04  TU106
        1f06  TU106 [GeForce RTX 2060 SUPER]
        1f07  TU106 [GeForce RTX 2070 Rev. A]
        1f08  TU106 [GeForce RTX 2060 Rev. A]
+       1f09  TU106 [GeForce GTX 1660 SUPER]
+       1f0a  TU106 [GeForce GTX 1650]
        1f10  TU106M [GeForce RTX 2070 Mobile]
        1f11  TU106M [GeForce RTX 2060 Mobile]
+       1f12  TU106M [GeForce RTX 2060 Max-Q]
+       1f14  TU106M [GeForce RTX 2070 Mobile / Max-Q Refresh]
+       1f15  TU106M [GeForce RTX 2060 Mobile]
        1f2e  TU106M
        1f36  TU106GLM [Quadro RTX 3000 Mobile / Max-Q]
        1f42  TU106 [GeForce RTX 2060 SUPER]
        1f47  TU106 [GeForce RTX 2060 SUPER]
-       1f50  TU106BM [GeForce RTX 2070 Mobile]
+       1f50  TU106BM [GeForce RTX 2070 Mobile / Max-Q]
        1f51  TU106BM [GeForce RTX 2060 Mobile]
+       1f54  TU106BM [GeForce RTX 2070 Mobile]
+       1f55  TU106BM [GeForce RTX 2060 Mobile]
        1f81  TU117
        1f82  TU117 [GeForce GTX 1650]
        1f91  TU117M [GeForce GTX 1650 Mobile / Max-Q]
        1f92  TU117M [GeForce GTX 1650 Mobile]
+       1f94  TU117M [GeForce GTX 1650 Mobile]
+       1f95  TU117M [GeForce GTX 1650 Ti Mobile]
        1f96  TU117M [GeForce GTX 1650 Mobile / Max-Q]
+       1f99  TU117M
        1fae  TU117GL
        1fb8  TU117GLM [Quadro T2000 Mobile / Max-Q]
        1fb9  TU117GLM [Quadro T1000 Mobile]
        1fbf  TU117GL
+       20b0  GA100 [GRID A100X]
+       20be  GA100 [GRID A100A]
+       20bf  GA100 [GRID A100B]
+       20f1  GA100 [GRID A100 PCIe 40GB]
        2182  TU116 [GeForce GTX 1660 Ti]
        2183  TU116
        2184  TU116 [GeForce GTX 1660]
        2187  TU116 [GeForce GTX 1650 SUPER]
+       2188  TU116 [GeForce GTX 1650]
        2191  TU116M [GeForce GTX 1660 Ti Mobile]
+       2192  TU116M [GeForce GTX 1650 Ti Mobile]
        21ae  TU116GL
        21bf  TU116GL
        21c4  TU116 [GeForce GTX 1660 SUPER]
        524a  RTS524A PCI Express Card Reader
        5250  RTS5250 PCI Express Card Reader
        525a  RTS525A PCI Express Card Reader
+               1028 06d6  Latitude 7275 tablet
                1028 06dc  Latitude E7470
                1028 06e4  XPS 15 9550
                17aa 224f  ThinkPad X1 Carbon 5th Gen
                1028 04da  Vostro 3750
                1028 06f2  Latitude 3470
                1028 06f3  Latitude 3570
+               1028 0869  Vostro 3470
                103c 1611  Pavilion DM1Z-3000
                103c 1950  ProBook 450/455
                103c 2a6f  Asus IPIBL-LB Motherboard
                1462 7c37  X570-A PRO motherboard
                1775 11cc  CC11/CL11
                17aa 3814  Z50-75
+               17aa 3823  Lenovo V130-15IGM Laptop - Type 81HL
                17aa 5124  ThinkPad E595
                1849 8168  Motherboard (one of many)
                7470 3468  TG-3468 Gigabit PCI Express Network Adapter
                1102 8071  SB0150 SoundBlaster PCI512
 # EMU8008 PCI version of emu8000 chip
        0003  SB AWE64(D)
+               1102 0010  CT4600 AWE64D
+               1102 0030  CT4650 AWE64D
+               1102 0031  CT4655 AWE64D
        0004  EMU10k2/CA0100/CA0102/CA10200 [Sound Blaster Audigy Series]
                1102 0040  SB0090 Audigy Player
 # Probably an early engineering sample
 # acquired by Diodes Inc.
 12d8  Pericom Semiconductor
        01a7  7C21P100 2-port PCI-X to PCI-X Bridge
+# 3Port-3Lane PCI Express Switch GreenPacket Family
+       0303  PCI Express Switch 3-3
+# PI7C9X20508GP 5Port-8Lane PCI Express Switch GreenPacket Family
+       0508  PI7C9X20508GP PCI Express Switch 5Port-8Lane
        2304  PI7C9X2G304 EL/SL PCIe2 3-Port/4-Lane Packet Switch
        2404  PI7C9X2G404 EL/SL PCIe2 4-Port/4-Lane Packet Switch
        2608  PI7C9X2G608GP PCIe2 6-Port/8-Lane Packet Switch
                1028 1ff9  Express Flash PM1725b 6.4TB AIC
                1028 1ffa  Express Flash PM1725b 12.8TB AIC
        a824  NVMe SSD Controller PM173X
+               1028 2040  EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 1.6TB
+               1028 2041  EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 3.2TB
+               1028 2042  EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 6.4TB
+               1028 2043  EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 12.8TB
+               1028 2044  EMC PowerEdge Express Flash Ent NVMe AGN MU AIC Gen4 1.6TB
+               1028 2045  EMC PowerEdge Express Flash Ent NVMe AGN MU AIC Gen4 3.2TB
+               1028 2046  EMC PowerEdge Express Flash Ent NVMe AGN MU AIC Gen4 6.4TB
+               1028 2070  EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 1.92TB
+               1028 2071  EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 3.84TB
+               1028 2072  EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 7.68TB
+               1028 2073  EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 15.36TB
+               1028 2074  EMC PowerEdge Express Flash Ent NVMe AGN RI AIC Gen4 1.92TB
+               1028 2075  EMC PowerEdge Express Flash Ent NVMe AGN RI AIC Gen4 3.84TB
+               1028 2076  EMC PowerEdge Express Flash Ent NVMe AGN RI AIC Gen4 7.68TB
+               1028 2090  EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 1.6TB
+               1028 2091  EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 3.2TB
+               1028 2092  EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 6.4TB
+               1028 2093  EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 12.8TB
+               1028 2094  EMC PowerEdge Express Flash Ent NVMe AGN SED MU AIC Gen4 1.6TB
+               1028 2095  EMC PowerEdge Express Flash Ent NVMe AGN SED MU AIC Gen4 3.2TB
+               1028 2096  EMC PowerEdge Express Flash Ent NVMe AGN SED MU AIC Gen4 6.4TB
+               1028 2097  EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 1.92TB
+               1028 2098  EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 3.84TB
+               1028 2099  EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 7.68TB
 144e  OLITEC
 144f  Askey Computer Corp.
 1450  Octave Communications Ind.
        0215  MT42822 Family [BlueField-2 Secure Flash Recovery]
        0216  MT2894 Family [ConnectX-6 Lx Flash Recovery]
        0217  MT2894 Family [ConnectX-6 Lx Secure Flash Recovery]
+       0218  MT2910 Family [ConnectX-7 Flash Recovery]
+       0219  MT2910 Family [ConnectX-7 Secure Flash Recovery]
+       021a  MT43162 Family [BlueField-3 Lx SoC Flash Recovery]
+       021b  MT43162 Family [BlueField-3 Lx Secure Flash Recovery]
+       021c  MT43244 Family [BlueField-3 SoC Flash Recovery]
+       021d  MT43244 Family [BlueField-3 Secure Flash Recovery]
        024e  MT53100 [Spectrum-2, Flash recovery mode]
        024f  MT53100 [Spectrum-2, Secure Flash recovery mode]
        0250  Spectrum-3, Flash recovery mode
        0263  MT27710 [ConnectX-4 Lx Programmable Virtual Function] EN
        0264  Innova-2 Flex Burn image
        0281  NPS-600 Flash Recovery
-       0538  MT2910 Family [ConnectX-7 Flash Recovery]
-       0539  MT2910 Family [ConnectX-7 Secure Flash Recovery]
        1002  MT25400 Family [ConnectX-2 Virtual Function]
        1003  MT27500 Family [ConnectX-3]
                1014 04b5  PCIe3 40GbE RoCE Converged Host Bus Adapter for Power
        1976  MT28908 Family [ConnectX-6 PCIe Bridge]
        1977  MT2892 Family [ConnectX-6 Dx PCIe Bridge]
        1978  MT42822 Family [BlueField-2 SoC PCIe Bridge]
+       1979  MT2910 Family [ConnectX-7 PCIe Bridge]
+       197a  MT43162 Family [BlueField-3 Lx SoC PCIe Bridge]
+       197b  MT43244 Family [BlueField-3 SoC PCIe Bridge]
        4117  MT27712A0-FDCF-AE
                1bd4 0039  SN10XMP2P25
                1bd4 003a  25G SFP28 SP EO251FM9 Adapter
        a2d4  MT42822 BlueField-2 SoC Crypto enabled
        a2d5  MT42822 BlueField-2 SoC Crypto disabled
        a2d6  MT42822 BlueField-2 integrated ConnectX-6 Dx network controller
+       a2d7  MT43162 BlueField-3 Lx SoC Crypto enabled
+       a2d8  MT43162 BlueField-3 Lx SoC Crypto disabled
+       a2d9  MT43162 BlueField-3 Lx integrated ConnectX-7 network controller
+       a2da  MT43244 BlueField-3 SoC Crypto enabled
+       a2db  MT43244 BlueField-3 SoC Crypto disabled
+       a2dc  MT43244 BlueField-3 integrated ConnectX-7 network controller
        c2d2  MT416842 BlueField SoC management interfac
        c2d3  MT42822 BlueField-2 SoC Management Interface
+       c2d4  MT43162 BlueField-3 Lx SoC Management Interface
+       c2d5  MT43244 BlueField-3 SoC Management Interface
 # SwitchX-2, 40GbE switch
        c738  MT51136
        c739  MT51136 GW
        c580  Radeon RX 580
 1688  CastleNet Technology Inc.
        1170  WLAN 802.11b card
+168a  Utimaco IS GmbH
 # nee Atheros Communications, Inc.
 168c  Qualcomm Atheros
        0007  AR5210 Wireless Network Adapter [AR5000 802.11a]
                1028 0300  Wireless 1802 802.11abgn Adapter
                1a56 2003  Killer Wireless-N 1202 Half-size Mini PCIe Card
        0036  QCA9565 / AR9565 Wireless Network Adapter
+               1028 020e  Vostro 3470
        0037  AR9485 Wireless Network Adapter
 # Also used as Gigabyte GC-WB150 on a PCIe-to-mini-PCIe converter
                1a3b 2100  AW-NB100H 802.11n Wireless Mini PCIe Card
        0121  PCT-7303A PC card with IRC counters
        0122  PCT-7408A PC card with counters and timers
        0123  PCT-7424 PCI card with standard counters
+       0141  PCA7208AL - Analog Inputs/Outputs
+       0142  PCA7208AS - Analog inputs/Outputs
+       0143  PCA7408AL - Analog Inputs/Outputs
+       0144  PCA7408AS - Analog Inputs/Outputs
        0214  PCT-7424C (F0) PC card with standard counters
        0215  PCT-7424C (F1) PC card with standard counters
        0216  PCT-7424E (F0) PC card with standard counters
        0217  PCT-7424E (F1) PC card with standard counters
+       0240  PCA7428CL_F0 - analog Inputs
+       0241  PCA7428CL_F1 - analog Inputs
+       0242  PCA7428CS_F0 - Analog Inputs/Outputs non isolated
+       0243  PCA7428CS_F1 - Analog Inputs/Outputs non isolated
+       0244  PCA7428CE_F0 - Analog Inputs isolated
+       0245  PCA7428CE_F1 - Analog Inputs isolated
        0303  PCD-7006C Digital Input & Output PCI Card
+       0800  PCD8006 - PCIe digital Inputs/Outputs
        ff00  CTU CAN FD PCIe Card
 1761  Pickering Interfaces Ltd
 1771  InnoVISION Multimedia Ltd.
        1011  R1011 IDE Controller
        1012  R1012 IDE Controller
        1031  PCI/PCI-X to PCI-E Bridge
+# Integrated in Vortex86EX, Vortex86EX2 SoC
+       1070  CAN Bus Controller
+# Integrated in Vortex86EX, Vortex86EX2 SoCs
+       1331  Motion Control Interface
+# Found in the Vortex86EX2 SoC
+       1930  Hybrid Function Control Register
+# IGP = on-chip integrated in the MSTI-PMX-1000 (Vortex86MX).
+       2010  RDC M2010 VGA-compatible graphics adapter
        2012  M2012/R3308 VGA-compatible graphics adapter
+# IGP = on-chip integrated in the Vortex86DX3. Basic 2D accel. UMA architecture.
+       2015  RDC M2015 VGA-compatible graphics adapter
+# Found in the Vortex86EX SoC
+       6011  R6011 ISA Bridge
+# Found in the Vortex86EX2 SoC
+       6013  R6013 ISA Bridge
        6020  R6020 North Bridge
        6021  R6021 Host Bridge
+# Found in the Vortex86DX3 SoC
+       6023  R6023 Host Bridge
+# Found in the Vortex86EX SoC
+       6025  R6025 Host Bridge
+# Found in the Vortex86EX2 SoC
+       6026  R6026 Host Bridge
        6030  R6030 ISA Bridge
        6031  R6031 ISA Bridge
+# Found in the Vortex86DX3 SoC
+       6035  R6035 ISA Bridge
+# Found in MSTI-PMX-1000 (Vortex86MX) SoC.
+       6036  R6036 ISA Bridge
        6040  R6040 MAC Controller
        6060  R6060 USB 1.1 Controller
        6061  R6061 USB 2.0 Controller
 1987  Phison Electronics Corporation
        5007  E7 NVMe Controller
        5012  E12 NVMe Controller
+       5013  PS5013 E13 NVMe Controller
        5016  E16 PCIe4 NVMe Controller
 1989  Montilio Inc.
        0001  RapidFile Bridge
        0200  Hi1822 Family (2*100GE)
                19e5 d139  Hi1822 SP572 (2*100GE)
                19e5 d13d  Hi1822 SC371 (2*100GE)
+               19e5 d147  Hi1822 SP573 (2*100GE)
        0202  Hi1822 Family (2*32G FC)
+               19e5 d149  Hi1822 SP528 (2*32G FC)
                19e5 d302  Hi1822 SP521 (2*32G FC)
                19e5 d304  Hi1822 SP526 (2*32G FC)
        0203  Hi1822 Family (2*16G FC)
+               19e5 d148  Hi1822 SP527 (2*16G FC)
                19e5 d301  Hi1822 SP520 (2*16G FC)
                19e5 d305  Hi1822 SP525 (2*16G FC)
        0205  Hi1822 Family (2*100GE)
        0206  Hi1822 Family (2*25GE)
                19e5 d138  Hi1822 SP582 (2*25GE)
                19e5 d13a  Hi1822 SC381 (2*25GE)
+               19e5 d145  Hi1822 SP586 (2*25GE)
        0210  Hi1822 Family (4*25GE)
                19e5 df2e  Hi1822 MZ532 MEZZ (4*25GE)
        0211  Hi1822 Family (4*25GE)
                19e5 d129  Hi1822 SP570 (4*25GE)
                19e5 d136  Hi1822 SP580 (4*25GE)
                19e5 d141  Hi1822 SP583 (4*25GE)
+               19e5 d146  Hi1822 SP585 (4*25GE)
        371e  Hi1822 Family Virtual Bridge
        375e  Hi1822 Family Virtual Function
        379e  Hi1822 Family Virtual Function
        a12a  HiSilicon Add-on PCI-PCI Bridge
        a220  HNS GE Network Controller
        a221  HNS GE/10GE/25GE Network Controller
+               19e5 0454  TM280
+               19e5 04cc  TM210
+               19e5 d14a  TM280 4*25G
+               19e5 d14b  TM210 4*GE
        a222  HNS GE/10GE/25GE RDMA Network Controller
        a224  HNS GE/10GE/25GE/50GE RDMA Network Controller
        a226  HNS GE/10GE/25GE/50GE/100GE RDMA Network Controller
        1050  Virtio GPU
 # virtio 1.0
        1052  Virtio input
+# virtio 1.0
+       1053  Virtio socket
        1110  Inter-VM shared memory
                1af4 1100  QEMU Virtual Machine
 1af5  Netezza Corp.
        0007  DELTA-3G-elp-d
 1b6f  Etron Technology, Inc.
        7023  EJ168 USB 3.0 Host Controller
+               1458 5007  GA-880GMA-USB3
        7052  EJ188/EJ198 USB 3.0 Host Controller
                1849 7052  QC5000-ITX/PH
 1b73  Fresco Logic
        1102  OmniBusBox II Multi-Protocol Interface Core
        1103  OmniBus II cPCIe/PXIe Multi-Protocol Interface Card
 1bd4  Inspur Electronic Information Industry Co., Ltd.
+       0911  Arria10_PCIe_F10A1150
 1bee  IXXAT Automation GmbH
        0003  CAN-IB200/PCIe
 1bef  Lantiq
 1c1c  Symphony
        0001  82C101
 1c1f  SoftLab-NSK
+       0015  FD842
+       0019  FD722
+       001a  FD788
+       001b  FD720
+       001c  FD922
+       001d  Vega
 1c28  Lite-On IT Corp. / Plextor
        0122  M6e PCI Express SSD [Marvell 88SS9183]
 # previously Fiberblaze
        a00a  FBC2CGG3 Capture 8x10Gb [Mango]
        a00e  FB2CG Capture 2x100Gb [Savona]
        a00f  FB2CG Capture 2x40Gb [Savona]
+       a010  FB2CGHH Capture 2x40Gb [Tivoli]
        a011  FB2CG Capture 2x25Gb [Savona]
        a012  FB2CG Capture 8x10Gb [Savona]
+       a013  FB2CGHH Capture 2x25Gb [Tivoli]
+       a014  FB2CGHH Capture 8x10Gb [Tivoli]
+       a015  FB2CGHH Capture 2x100Gb [Tivoli]
 # Used on V120 VME Crate Controller
 1c32  Highland Technology, Inc.
 1c33  Daktronics, Inc
        0010  Pro Capture Endpoint
        0014  PRO CAPTURE AIO 4K PLUS
        0017  PRO CAPTURE AIO 4K
+       0051  Eco Capture Dual HDMI M.2
+       0052  Eco Capture HDMI 4K M.2
+       0053  Eco Capture Dual SDI M.2
+       0054  Eco Capture Quad SDI M.2
 1cdd  secunet Security Networks AG
 1ce4  Exablaze
        0001  ExaNIC X4
        04de  Taurus/McKinley
 1d6a  Aquantia Corp.
        0001  AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion]
+       00b1  AQC100 10G Ethernet MAC controller [AQtion]
        07b1  AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion]
        08b1  AQC108 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion]
        11b1  AQC111 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion]
 1d95  Graphcore Ltd
        0001  Colossus GC2 [C2]
        0002  Colossus GC1 [S1]
+1d97  Shenzhen Longsys Electronics Co., Ltd.
 1d9b  Facebook, Inc.
        0010  Networking DOM Engine
        0011  IO Bridge
                1dd8 4000  Naples 100Gb 2-port QSFP28 x16 8GB
                1dd8 4001  Naples 100Gb 2-port QSFP28 x16 4GB
                1dd8 4002  Naples 25Gb 2-port SFP28 x8 4GB
+               1dd8 4008  DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC
        1001  DSC Virtual Downstream Port
                1dd8 4000  Naples 100Gb 2-port QSFP28 x16 8GB
                1dd8 4001  Naples 100Gb 2-port QSFP28 x16 4GB
                1dd8 4002  Naples 25Gb 2-port SFP28 x8 4GB
+               1dd8 4008  DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC
        1002  DSC Ethernet Controller
                1dd8 4000  Naples 100Gb 2-port QSFP28 x16 8GB
                1dd8 4001  Naples 100Gb 2-port QSFP28 x16 4GB
                1dd8 4002  Naples 25Gb 2-port SFP28 x8 4GB
+               1dd8 4008  DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC
        1003  DSC Ethernet Controller VF
                1dd8 4000  Naples 100Gb 2-port QSFP28 x16 8GB
                1dd8 4001  Naples 100Gb 2-port QSFP28 x16 4GB
                1dd8 4002  Naples 25Gb 2-port SFP28 x8 4GB
+               1dd8 4008  DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC
        1004  DSC Management Controller
                1dd8 4000  Naples 100Gb 2-port QSFP28 x16 8GB
                1dd8 4001  Naples 100Gb 2-port QSFP28 x16 4GB
                1dd8 4002  Naples 25Gb 2-port SFP28 x8 4GB
+               1dd8 4008  DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC
        1007  DSC Storage Accelerator
                1dd8 4000  Naples 100Gb 2-port QSFP28 x16 8GB
                1dd8 4001  Naples 100Gb 2-port QSFP28 x16 4GB
                1dd8 4002  Naples 25Gb 2-port SFP28 x8 4GB
+               1dd8 4008  DSC-25 10/25G 2-port SFP28 x8 4GB RAM 8GB eMMC
 1de0  Groq
        0000  Q100 Tensor Streaming Processor
 1de1  Tekram Technology Co.,Ltd.
        0003  alst4x
 1dfc  JSC NT-COM
        1181  TDM 8 Port E1/T1/J1 Adapter
+1e0f  KIOXIA Corporation
+       0007  NVMe SSD Controller Cx6
 1e17  Arnold & Richter Cine Technik GmbH & Co. Betriebs KG
 1e24  Squirrels Research Labs
        0101  Acorn CLE-101
        0100  The device has already been deleted.
                0000 0100  PY8800 64GB Accelerator
 1e6b  Axiado Corp.
+1e85  Heitec AG
 1e89  ID Quantique SA
        0002  Quantis-PCIe-40M
        0003  Quantis-PCIe-240M
 # aka SED Systems
 1e94  Calian SED
+1e95  Solid State Storage Technology Corporation
 # nee Tumsan Oy
 1fc0  Ascom (Finland) Oy
        0300  E2200 Dual E1/Rawpipe Card
        02d3  Comet Lake SATA AHCI Controller
        02e0  Comet Lake Management Engine Interface
        02e8  Serial IO I2C Host Controller
+       02e9  Comet Lake Serial IO I2C Host Controller
        02f0  Wireless-AC 9462
        02f9  Comet Lake Thermal Subsytem
        02fc  Comet Lake Integrated Sensor Solution
                8086 01f7  SCRU32
 # uninitialized SRCU32 RAID Controller
        061f  80303 I/O Processor
+       068d  Comet Lake LPC Controller
+       06a3  Comet Lake PCH SMBus Controller
+       06a4  Comet Lake PCH SPI Controller
+       06a8  Comet Lake PCH Serial IO UART Host Controller #0
+       06a9  Comet Lake PCH Serial IO UART Host Controller #1
+       06aa  Comet Lake PCH Serial IO SPI Controller #0
+       06ab  Comet Lake PCH Serial IO SPI Controller #1
+       06ac  Comet Lake PCI Express Root Port #21
+       06b0  Comet Lake PCI Express Root Port #9
+       06c0  Comet Lake PCI Express Root Port #17
+       06c8  Comet Lake PCH cAVS
+       06e0  Comet Lake HECI Controller
+       06e8  Comet Lake PCH Serial IO I2C Controller #0
+       06e9  Comet Lake PCH Serial IO I2C Controller #1
+       06ea  Comet Lake PCH Serial IO I2C Controller #2
+       06eb  Comet Lake PCH Serial IO I2C Controller #3
+       06ed  Comet Lake USB 3.1 xHCI Host Controller
+       06ef  Comet Lake PCH Shared SRAM
+       06f0  Wi-Fi 6 AX201
+       06f9  Comet Lake PCH Thermal Controller
+       06fb  Comet Lake PCH Serial IO SPI Controller #2
        0700  CE Media Processor A/V Bridge
        0701  CE Media Processor NAND Flash Controller
        0703  CE Media Processor Media Control Unit 1
                1028 1fe7  Express Flash NVMe 3.2TB 2.5" U.2 (P4600)
                1028 1fe8  Express Flash NVMe 2.0TB HHHL AIC (P4600)
                1028 1fe9  Express Flash NVMe 4.0TB HHHL AIC (P4600)
+       0b60  NVMe DC SSD [3DNAND, Beta Rock Controller]
+               1028 2060  NVMe SED MU U.2 1.6TB (P5600)
+               1028 2061  NVMe SED MU U.2 3.2TB (P5600)
+               1028 2062  NVMe SED MU U.2 6.4TB (P5600)
+               1028 2064  NVMe SED RI U.2 1.92TB (P5500)
+               1028 2065  NVMe SED RI U.2 3.84TB (P5500)
+               1028 2066  NVMe SED RI U.2 7.68TB (P5500)
+               1028 209e  NVMe MU U.2 1.6TB (P5600)
+               1028 209f  NVMe MU U.2 3.2TB (P5600)
+               1028 2100  NVMe MU U.2 6.4TB (P5600)
+               1028 2102  NVMe RI U.2 1.92TB (P5500)
+               1028 2103  NVMe RI U.2 3.84TB (P5500)
+               1028 2104  NVMe RI U.2 7.68TB (P5500)
        0be0  Atom Processor D2xxx/N2xxx Integrated Graphics Controller
        0be1  Atom Processor D2xxx/N2xxx Integrated Graphics Controller
                105b 0d7c  D270S/D250S Motherboard
        0d58  Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
                8086 0000  Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
                8086 0001  Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
+       0d9f  Ethernet Controller (2) I225-IT
        0e00  Xeon E7 v2/Xeon E5 v2/Core i7 DMI2
                1028 04f7  Xeon E5 v2 on PowerEdge R320 server
                15d9 066b  X9SRL-F
                17aa 4001  ThinkServer X710-4 AnyFabric for 10GbE SFP+
                17aa 4002  ThinkServer X710-2 AnyFabric for 10GbE SFP+
                19e5 d11c  Ethernet 2-port X710 10Gb SFP+ Adapter SP330
+               1bd4 0056  Ethernet Network Adapter X710-BM2 for OCP NIC 3.0
                8086 0000  Ethernet Converged Network Adapter X710
                8086 0001  Ethernet Converged Network Adapter X710-4
                8086 0002  Ethernet Converged Network Adapter X710-4
                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
+               1137 02bf  E810CQDA2 2x100 GbE QSFP28 PCIe NIC
                8086 0002  Ethernet Network Adapter E810-C-Q2
                8086 0004  Ethernet Network Adapter E810-C-Q2
                8086 0005  Ethernet Network Adapter E810-C-Q1 for OCP3.0
                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
        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 0005  Ethernet Network Adapter E810-XXV-4
                8086 0006  Ethernet Network Adapter E810-XXV-4
                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
+       1599  Ethernet Controller E810-XXV for backplane
+       159a  Ethernet Controller E810-XXV for QSFP
+       159b  Ethernet Controller E810-XXV for SFP
+               1137 02be  E810XXVDA2 2x25/10 GbE SFP28 PCIe NIC
+               1bd4 0057  Ethernet Network Adapter E810-XXVAM2
+               1bd4 0058  Ethernet Network Adapter E810-XXVAM2 for OCP 3.0
+               8086 0001  Ethernet 25G 2P E810-XXV OCP
+               8086 0002  Ethernet 25G 2P E810-XXV Adapter
+               8086 0003  Ethernet Network Adapter E810-XXV-2
+               8086 0005  Ethernet Network Adapter E810-XXV-2 for OCP 3.0
+               8086 4001  Ethernet Network Adapter E810-XXV-2
+               8086 4002  Ethernet Network Adapter E810-XXV-2 for OCP 3.0
        15a0  Ethernet Connection (2) I218-LM
        15a1  Ethernet Connection (2) I218-V
        15a2  Ethernet Connection (3) I218-LM
        15ec  JHL7540 Thunderbolt 3 USB Controller [Titan Ridge 4C 2018]
        15ef  JHL7540 Thunderbolt 3 Bridge [Titan Ridge DD 2018]
        15f0  JHL7540 Thunderbolt 3 USB Controller [Titan Ridge DD 2018]
+       15f2  Intel(R) Ethernet Controller I225-LM
+       15f3  Intel(R) Ethernet Controller I225-V
        15f4  Ethernet Connection (15) I219-LM
        15f5  Ethernet Connection (15) I219-V
        15f6  I210 Gigabit Ethernet Connection
        1901  Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x16)
        1902  HD Graphics 510
        1903  Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem
+               1028 06d6  Latitude 7275 tablet
                1028 06dc  Latitude E7470
                1028 06e4  XPS 15 9550
                103c 825b  OMEN-17-w001nv
        1908  Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers
        1909  Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x4)
        190c  Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers
+               1028 06d6  Latitude 7275 tablet
        190f  Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers
        1910  Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers
                1028 06e4  XPS 15 9550
                103c 825b  OMEN-17-w001nv
        1911  Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model
+               1028 0869  Vostro 3470
                17aa 2247  ThinkPad T570
                17aa 224f  ThinkPad X1 Carbon 5th Gen
                17aa 225d  ThinkPad T480
                103c 8079  EliteBook 840 G3
        1918  Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers
        1919  Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Imaging Unit
+               1028 06d6  Latitude 7275 tablet
        191b  HD Graphics 530
                1028 06e4  XPS 15 9550
                103c 825b  OMEN-17-w001nv
        191d  HD Graphics P530
        191e  HD Graphics 515
+               1028 06d6  Latitude 7275 tablet
        191f  Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers
        1921  HD Graphics 520
        1926  Iris Graphics 540
 # Stone Peak 1x1
                8086 4210  Dual Band Wireless AC 3165
        3166  Dual Band Wireless-AC 3165 Plus Bluetooth
+               8086 4210  Dual Band Wireless-AC 3165
        3184  UHD Graphics 605
        3185  UHD Graphics 605
        318c  Celeron/Pentium Silver Processor Dynamic Platform and Thermal Framework Processor Participant
        318e  Celeron/Pentium Silver Processor NorthPeak
        3192  Gemini Lake P2SB
        3197  Celeron/Pentium Silver Processor PCI-default ISA-bridge
+       3198  Celeron/Pentium Silver Processor High Definition Audio
+               17aa 380b  V130-15IGM Laptop (Lenovo) - Type 81HL
        319a  Celeron/Pentium Silver Processor Trusted Execution Engine Interface
        31a2  Celeron/Pentium Silver Processor Integrated Sensor Solution
        31ac  Celeron/Pentium Silver Processor Serial IO I2C Host Controller
        3e89  8th Gen Core Processor PCIe Controller (x4)
        3e91  8th Gen Core Processor Gaussian Mixture Model
        3e92  UHD Graphics 630 (Desktop)
+               1028 0869  Vostro 3470
        3e93  UHD Graphics 610
        3e96  HD Graphics P630
        3e98  UHD Graphics 630 (Desktop 9 Series)
                1028 089e  Inspiron 5482
        3ea5  Iris Plus Graphics 655
        3ec2  8th Gen Core Processor Host Bridge/DRAM Registers
+               1028 0869  Vostro 3470
                1043 8694  PRIME H310M-D
        3ec4  8th Gen Core Processor Host Bridge/DRAM Registers
        3ec6  8th Gen Core Processor Host Bridge/DRAM Registers
        5201  EtherExpress PRO/100 Intelligent Server Fast Ethernet Controller
                8086 0001  EtherExpress PRO/100 Server Ethernet Adapter
        530d  80310 (IOP) IO Processor
+       5502  Ethernet Controller (2) I225-LMvP
        5845  QEMU NVM Express Controller
                1af4 1100  QEMU Virtual Machine
        5900  Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
        8a1f  Ice Lake Thunderbolt 3 PCI Express Root Port #1
        8a21  Ice Lake Thunderbolt 3 PCI Express Root Port #2
        8a23  Ice Lake Thunderbolt 3 PCI Express Root Port #3
+       8a51  Intel Iris Plus Graphics G7 (Ice Lake)
        8a52  Iris Plus Graphics G7
+       8a56  Iris Plus Graphics G1 (Ice Lake)
+       8a5a  Iris Plus Graphics G4 (Ice Lake)
+       8a5c  Intel Iris Plus Graphics G4 (Ice Lake)
        8c00  8 Series/C220 Series Chipset Family 4-port SATA Controller 1 [IDE mode]
        8c01  8 Series Chipset Family 4-port SATA Controller 1 [IDE mode] - Mobile
        8c02  8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode]
        8c0e  8 Series/C220 Series Chipset Family SATA Controller 1 [RAID mode]
        8c0f  8 Series/C220 Series Chipset Family SATA Controller 1 [RAID mode]
        8c10  8 Series/C220 Series Chipset Family PCI Express Root Port #1
+               1043 8534  ASUS H81I-PLUS
                17aa 220e  ThinkPad T440p
        8c11  8 Series/C220 Series Chipset Family PCI Express Root Port #1
        8c12  8 Series/C220 Series Chipset Family PCI Express Root Port #2
        9622  Integrated RAID
        9641  Integrated RAID
        96a1  Integrated RAID
+       9a09  11th Gen Core Processor PCIe Controller
        9a0b  Volume Management Device NVMe RAID Controller
+       9a13  Tiger Lake-LP Thunderbolt USB Controller
+       9a14  11th Gen Core Processor Host Bridge/DRAM Registers
+       9a1b  Tiger Lake-LP Thunderbolt NHI #0
+       9a1d  Tiger Lake-LP Thunderbolt NHI #1
+       9a23  Tiger Lake-LP Thunderbolt PCI Express Root Port #0
+       9a25  Tiger Lake-LP Thunderbolt PCI Express Root Port #1
+       9a27  Tiger Lake-LP Thunderbolt PCI Express Root Port #2
+       9a29  Tiger Lake-LP Thunderbolt PCI Express Root Port #3
+       9a33  Tiger Lake Trace Hub
+       9a49  UHD Graphics
        9b41  UHD Graphics
+       9b44  10th Gen Core Processor Host Bridge/DRAM Registers
+       9b54  10th Gen Core Processor Host Bridge/DRAM Registers
+       9b64  10th Gen Core Processor Host Bridge/DRAM Registers
+       9bc4  UHD Graphics
        9c00  8 Series SATA Controller 1 [IDE mode]
        9c01  8 Series SATA Controller 1 [IDE mode]
        9c02  8 Series SATA Controller 1 [AHCI mode]
        9d1a  Sunrise Point-LP PCI Express Root Port #11
        9d21  Sunrise Point-LP PMC
                1025 115f  Acer Aspire E5-575G
+               1028 06d6  Latitude 7275 tablet
                1028 06dc  Latitude E7470
                1028 06f3  Latitude 3570
                103c 8079  EliteBook 840 G3
                17aa 382a  B51-80 Laptop
        9d23  Sunrise Point-LP SMBus
                1025 115f  Acer Aspire E5-575G
+               1028 06d6  Latitude 7275 tablet
                1028 06dc  Latitude E7470
                1028 06f3  Latitude 3570
                103c 8079  EliteBook 840 G3
        9d2d  Sunrise Point-LP Secure Digital IO Controller
        9d2f  Sunrise Point-LP USB 3.0 xHCI Controller
                1025 115f  Acer Aspire E5-575G
+               1028 06d6  Latitude 7275 tablet
                1028 06dc  Latitude E7470
                1028 06f3  Latitude 3570
                103c 8079  EliteBook 840 G3
                17aa 382a  B51-80 Laptop
        9d31  Sunrise Point-LP Thermal subsystem
                1025 115f  Acer Aspire E5-575G
+               1028 06d6  Latitude 7275 tablet
                1028 06dc  Latitude E7470
                1028 06f3  Latitude 3570
                103c 8079  EliteBook 840 G3
                17aa 224f  ThinkPad X1 Carbon 5th Gen
                17aa 225d  ThinkPad T480
                17aa 382a  B51-80 Laptop
+       9d32  CSI-2 Host Controller
+               1028 06d6  Latitude 7275 tablet
        9d35  Sunrise Point-LP Integrated Sensor Hub
+               1028 06d6  Latitude 7275 tablet
        9d3a  Sunrise Point-LP CSME HECI #1
                1025 115f  Acer Aspire E5-575G
+               1028 06d6  Latitude 7275 tablet
                1028 06dc  Latitude E7470
                1028 06f3  Latitude 3570
                103c 8079  EliteBook 840 G3
                103c 8079  EliteBook 840 G3
        9d43  Sunrise Point-LP LPC Controller
                17aa 382a  B51-80 Laptop
+       9d46  LPC/eSPI Controller
+               1028 06d6  Latitude 7275 tablet
        9d48  Sunrise Point-LP LPC Controller
                1028 06dc  Latitude E7470
                1028 06f3  Latitude 3570
                17aa 224f  ThinkPad X1 Carbon 5th Gen
        9d60  Sunrise Point-LP Serial IO I2C Controller #0
                1025 115f  Acer Aspire E5-575G
+               1028 06d6  Latitude 7275 tablet
                1028 06f3  Latitude 3570
                103c 8079  EliteBook 840 G3
                17aa 225d  ThinkPad T480
                8086 9d60  100 Series PCH/Sunrise Point PCH I2C0 [Skylake/Kaby Lake LPSS I2C]
        9d61  Sunrise Point-LP Serial IO I2C Controller #1
+               1028 06d6  Latitude 7275 tablet
        9d62  Sunrise Point-LP Serial IO I2C Controller #2
+               1028 06d6  Latitude 7275 tablet
        9d63  Sunrise Point-LP Serial IO I2C Controller #3
        9d64  Sunrise Point-LP Serial IO I2C Controller #4
        9d65  Sunrise Point-LP Serial IO I2C Controller #5
        9d66  Sunrise Point-LP Serial IO UART Controller #2
        9d70  Sunrise Point-LP HD Audio
+               1028 06d6  Latitude 7275 tablet
                1028 06dc  Latitude E7470
                1028 06f3  Latitude 3570
                103c 8079  EliteBook 840 G3
                1028 089e  Inspiron 5482
        9da3  Cannon Point-LP SMBus Controller
        9da4  Cannon Point-LP SPI Controller
+       9da8  Cannon Point-LP Serial IO UART Controller #2
+       9daa  Cannon Point-LP Serial IO SPI Controller
        9db0  Cannon Point-LP PCI Express Root Port #9
        9db1  Cannon Point-LP PCI Express Root Port #10
        9db2  Cannon Point-LP PCI Express Root Port #1
                1043 83ac  Eee PC 1015PX
                144d c072  Notebook N150P
        a013  Atom Processor D4xx/D5xx/N4xx/N5xx CHAPS counter
+       a082  Tiger Lake-LP LPC Controller
+       a0a3  Tiger Lake-LP SMBus Controller
+       a0a4  Tiger Lake-LP SPI Controller
+       a0a6  Tiger Lake-LP Trace Hub
+       a0a8  Tiger Lake-LP Serial IO UART Controller #0
+       a0a9  Tiger Lake-LP Serial IO UART Controller #1
+       a0ab  Tiger Lake-LP Serial IO SPI Controller #1
+       a0b0  Tiger Lake-LP PCI Express Root Port #9
+       a0bf  Tiger Lake-LP PCI Express Root Port #8
+       a0c5  Tiger Lake-LP Serial IO I2C Controller #4
+       a0c6  Tiger Lake-LP Serial IO I2C Controller #5
+       a0c8  Tiger Lake-LP Smart Sound Technology Audio Controller
+       a0e0  Tiger Lake-LP Management Engine Interface
+       a0e8  Tiger Lake-LP Serial IO I2C Controller #0
+       a0e9  Tiger Lake-LP Serial IO I2C Controller #1
+       a0ea  Tiger Lake-LP Serial IO I2C Controller #2
+       a0eb  Tiger Lake-LP Serial IO I2C Controller #3
+       a0ed  Tiger Lake-LP USB 3.2 Gen 2x1 xHCI Host Controller
+       a0ef  Tiger Lake-LP Shared SRAM
+       a0f0  Wi-Fi 6 AX201
+       a0fc  Tiger Lake-LP Integrated Sensor Hub
        a102  Q170/Q150/B150/H170/H110/Z170/CM236 Chipset SATA Controller [AHCI Mode]
        a103  HM170/QM170 Chipset SATA Controller [AHCI Mode]
                1028 06e4  XPS 15 9550
        a2ee  200 Series PCH PCI Express Root Port #24
        a2f0  200 Series PCH HD Audio
        a304  H370 Chipset LPC/eSPI Controller
+               1028 0869  Vostro 3470
        a305  Z390 Chipset LPC/eSPI Controller
        a306  Q370 Chipset LPC/eSPI Controller
        a309  Cannon Point-LP LPC Controller
        a30c  QM370 Chipset LPC/eSPI Controller
+       a30d  HM470 Chipset LPC/eSPI Controller
+       a30e  Cannon Lake LPC Controller
        a323  Cannon Lake PCH SMBus Controller
+               1028 0869  Vostro 3470
        a324  Cannon Lake PCH SPI Controller
+               1028 0869  Vostro 3470
        a328  Cannon Lake PCH Serial IO UART Host Controller
        a32c  Cannon Lake PCH PCI Express Root Port #21
        a32d  Cannon Lake PCH PCI Express Root Port #22
        a342  Cannon Lake PCH PCI Express Root Port #19
        a343  Cannon Lake PCH PCI Express Root Port #20
        a348  Cannon Lake PCH cAVS
+               1028 0869  Vostro 3470
        a352  Cannon Lake PCH SATA AHCI Controller
+               1028 0869  Vostro 3470
        a353  Cannon Lake Mobile PCH SATA AHCI Controller
        a360  Cannon Lake PCH HECI Controller
+               1028 0869  Vostro 3470
        a363  Cannon Lake PCH Active Management Technology - SOL
        a364  Cannon Lake PCH HECI Controller #2
        a368  Cannon Lake PCH Serial IO I2C Controller #0
        a36a  Cannon Lake PCH Serial IO I2C Controller #2
        a36b  Cannon Lake PCH Serial IO I2C Controller #3
        a36d  Cannon Lake PCH USB 3.1 xHCI Host Controller
+               1028 0869  Vostro 3470
        a36f  Cannon Lake PCH Shared SRAM
        a370  Wireless-AC 9560 [Jefferson Peak]
        a379  Cannon Lake PCH Thermal Controller
+               1028 0869  Vostro 3470
        a620  6400/6402 Advanced Memory Buffer (AMB)
        abc0  Omni-Path Fabric Switch Silicon 100 Series
        b152  21152 PCI-to-PCI Bridge
        0001  SG2010 PCI over Starfabric Bridge
        0002  SG2010 PCI to Starfabric Gateway
        0003  SG1010 Starfabric Switch and PCI Bridge
+9d32  Beijing Starblaze Technology Co. Ltd.
+       0000  STAR1000 PCIe NVMe SSD Controller
+       1001  STAR1000P PCIe NVMe SSD Controller
+       1201  STAR1200C NVMe SSD
+       1202  STAR1200I NVMe SSD
+       1203  STAR1200L NVMe SSD
+       1204  STAR1200E NVMe SSD
 a0a0  AOPEN Inc.
 a0f1  UNISYS Corporation
 a200  NEC Corporation
@@ -32507,6 +32822,7 @@ C 0c  Serial bus controller
                10  OHCI
                20  EHCI
                30  XHCI
+               40  USB4 Host Interface
                80  Unspecified
                fe  USB Device
        04  Fibre Channel
index 1e63bb517751a20f0ec6b114987c80b29f196dfb..0b850290d5787cebeb5483227734d61c04cf94d7 100644 (file)
@@ -9,8 +9,8 @@
 #      The latest version can be obtained from
 #              http://www.linux-usb.org/usb.ids
 #
-# Version: 2020.02.28
-# Date:    2020-02-28 20:34:06
+# Version: 2020.06.22
+# Date:    2020-06-22 20:34:08
 #
 
 # Vendors, devices and interfaces. Please keep sorted.
@@ -23,6 +23,7 @@
 0001  Fry's Electronics
        7778  Counterfeit flash drive [Kingston]
 0002  Ingram
+       0002  passport00
 0003  Club Mac
 0004  Nebraska Furniture Mart
 0011  Unknown
@@ -38,8 +39,8 @@
        181b  Venom Arcade Joystick
        1843  Mayflash GameCube Controller Adapter
        1844  Mayflash GameCube Controller
-0080  Assmann Electronic GmbH
-       a001  Digitus DA-71114 SATA
+0080  Unknown
+       a001  JMS578 based SATA bridge
 0085  Boeye Technology Co., Ltd.
        0600  eBook Reader
 0102  miniSTREAK
        2417  LaserJet 4250
        241d  Gobi 2000 Wireless Modem (QDL mode)
        2424  LP1965 19" Monitor Hub
+       2441  Prime G2 [2AP18AA]
        2502  PhotoSmart 7700 series
        2504  DeskJet F4200 series
        2505  ScanJet 3770
        3504  DeskJet 6127c
        3511  PSC 2300
        3517  LaserJet 3390
+       354a  Slim Keyboard
        3602  PhotoSmart 1315
        3611  PSC 2410 PhotoSmart
        3612  Officejet Pro 8000 A809
        3e17  LaserJet P1006
        3f02  PhotoSmart 7550~
        3f11  PSC-1315/PSC-1317
+       3f17  Laserjet P1505
        4002  PhotoSmart 635/715/720/735/935/E337 (storage)
        4004  CP1160
        4102  PhotoSmart 618
        7917  LaserJet M5025 MFP
        7a02  PhotoSmart M415 (PTP mode)
        7a04  DeskJet D2460
+       7a11  Photosmart B109
        7a17  LaserJet M3027 MFP
        7b02  PhotoSmart M23 (PTP mode)
        7b17  Color LaserJet CP4005
        6011  FT4232H Quad HS USB-UART/FIFO IC
        6014  FT232H Single HS USB-UART/FIFO IC
        6015  Bridge(I2C/SPI/UART/FIFO)
+       601f  Myriad-RF LimeSDR-Mini
        6f70  HB-RF-USB
        8028  Dev board JTAG (FT232H based)
        8040  4 Port Hub
        1030  FV TouchCam N1 (Video)
        3000  Optical dual-touch panel
        3001  Optical Touch Screen
+       3008  Optical Touch Screen
        a060  HD Webcam
 0409  NEC Corp.
        0011  PC98 Series Layout Keyboard Mouse
        3812  Smart Card Controller_2Interface
        3813  Panel Display
        5011  Virtual Com Port
+       511b  Nuvoton Nu-Link1 ICE
+       511c  Nuvoton Nu-Link1 ICE
+       511d  Nuvoton Nu-Link1 ICE/VCOM
+       511e  Nuvoton Nu-Link1 MSC/VCOM
+       5200  Nuvoton Nu-Link2-ME ICE/MSC/VCOM
+       5201  Nuvoton Nu-Link2-Pro ICE/MSC/VCOM
+       5210  Nuvoton Nu-Link2 MSC FW UPGRADE
+       5211  Nuvoton Nu-Link2 HID FW UPGRADE
        5518  4-Port Hub
        551a  PC Sync Keypad
        551b  PC Async Keypad
        2744  Hub
        274d  HTC Hub Controller
        2807  Hub
+       3fc7  RME Babyface audio system
        3fcc  RME MADIface
        4041  Hub and media card controller
        4060  Ultra Fast Media Reader
 043e  LG Electronics USA, Inc.
        3001  AN-WF100 802.11abgn Wireless Adapter [Broadcom BCM4323]
        3004  TWFM-B003D 802.11abgn Wireless Module [Broadcom BCM43236B]
+       3009  VC400
        3101  AN-WF500 802.11abgn + BT Wireless Adapter [Broadcom BCM43242]
        42bd  Flatron 795FT Plus Monitor
        4a4d  Flatron 915FT Plus Monitor
        b307  vibrating Upad
        b30b  Wireless VibrationPad
        b315  Firestorm Dual Analog 3
+       b320  Dual Trigger gamepad PC/PS2 2.0
        b323  Dual Trigger 3-in-1 (PC Mode)
        b324  Dual Trigger 3-in-1 (PS3 Mode)
        b326  Gamepad GP XID
        2046  TUSB2046 Hub
        2077  TUSB2077 Hub
        2f90  SM-USB-DIG
+       3200  TUSB3200 Boot Loader
        3410  TUSB3410 Microcontroller
        3f00  OMAP1610
        3f02  SMC WSKP100 Wi-Fi Phone
        e012  TI-Nspire Calculator
        e013  Network Bridge
        e01c  Data Collection Sled [Nspire Lab Cradle, Nspire Datatracker Cradle]
-       e01e  Nspire\99 CX Navigator\99 Access Point
+       e01e  Nspire CX Navigator Access Point
        e01f  Python Adapter (firmware install mode)
        e020  Python Adapter
        e022  Nspire CX II
        0072  Navigator 335
        0083  Bluetooth Dongle
        0087  Ergo 525V Laser Mouse
+       0088  Genius Traveler 515 Laser
        0089  Genius Traveler 350
        00ca  Pen Mouse
        0100  EasyPen Tablet
        501e  Rio Chiba
        501f  Rio Cali
        503f  Cali256 MP3 Player
+       5042  Rio Forge
        5202  Rio Riot MP3 Player
        5210  Rio Karma Music Player
        5220  Rio Nitrus MP3 Player
        07b2  2.4GHz Transceiver v8.0 used by mouse Wireless Desktop 900
        07b6  Comfort Curve Keyboard 3000
        07b9  Wired Keyboard 200
-       07c6  RTL8153 GigE [Surface Dock Ethernet]
+       07c6  RTL8153 GigE [Surface Ethernet Adapter]
        07ca  Surface Pro 3 Docking Station Audio Device
        07cd  Surface Keyboard
        07f8  Wired Keyboard 600 (model 1576)
        07fd  Nano Transceiver 1.1
+       0800  Wireless keyboard (All-in-One-Media)
        0810  LifeCam HD-3000
+       0823  Classic IntelliMouse
        0900  Surface Dock Hub
        0901  Surface Dock Hub
        0902  Surface Dock Hub
        090b  Hub
        090c  SD Card
        091a  Hub
+       0927  RTL8153B GigE [Surface Ethernet Adapter]
+       0955  Hub
+       0957  Hub
+       09a0  RTL8153B GigE [Surface Ethernet Adapter]
        09c0  Surface Type Cover
        0a00  Lumia 950 Dual SIM (RM-1118)
        930a  ISOUSB.SYS Intel 82930 Isochronous IO Test Board
        4de3  HP 5-Button Optical Comfort Mouse
        4de7  webcam
        4e04  Lenovo Keyboard KB1021
+       4e22  Dell Mouse, 2 Buttons, Modell: MS111-P
        4e6f  Acer Wired Keyboard Model KBAY211
 0463  MGE UPS Systems
        0001  UPS
        0a07  Z-10 Speakers
        0a0b  ClearChat Pro USB
        0a0c  Clear Chat Comfort USB Headset
+       0a10  V10 Notebook Speakers
        0a13  Z-5 Speakers
        0a14  USB Headset
        0a15  G35 Headset
        c080  G303 Gaming Mouse
        c083  G403 Prodigy Gaming Mouse
        c084  G203 Gaming Mouse
+       c08b  G502 SE HERO Gaming Mouse
        c101  UltraX Media Remote
        c110  Harmony 785/880/885 Remote
        c111  Harmony 525 Remote
        c24c  G400s Optical Mouse
        c24d  G710 Gaming Keyboard
        c24e  G500s Laser Gaming Mouse
+       c24f  G29 Driving Force Racing Wheel [PS3]
+       c260  G29 Driving Force Racing Wheel [PS4]
        c281  WingMan Force
        c283  WingMan Force 3D
        c285  WingMan Strike Force 3D
        2160  Mio LINK Heart Rate Monitor
        21e0  GoGEAR Raga
        262c  SPC230NC Webcam
+       2721  PTA 317 TV Camera
        485d  Senselock SenseIV v2.x
        df55  LPCXpresso LPC-Link
 0472  Chicony Electronics Co., Ltd
        0411  Savi Office Base Station
        0ca1  USB DSP v4 Audio Interface
        4254  BUA-100 Bluetooth Adapter
+       aa05  DA45
        ac01  Savi 7xx
        ad01  GameCom 777 5.1 Headset
        af01  DA80
        1234  Mass storage
        1336  SD/MMC Cardreader
        1345  Multi Cardreader
+       8297  IT8297 RGB LED Controller
        9006  IT9135 BDA Afatech DVB-T HDTV Dongle
        9009  Zolid HD DVD Maker
        9135  Zolid Mini DVB-T Stick
        271c  LBP7010C/7018C
        2736  I-SENSYS MF4550d
        2737  MF4410
+       2742  imageRUNNER1133 series
        2771  LBP6020
        2796  LBP6230/6240
        3041  PowerShot S10
        0002  CY7C63x0x Thermometer
        0033  Mouse
        0060  Wireless optical mouse
+       00f3  FX3 micro-controller (DFU mode)
        0100  Cino FuzzyScan F760-B
        0101  Keyboard/Hub
        0102  Keyboard with APM
        f115  PSoC FirstTouch Programmer
        f231  DELLY Changer 4in1 universal IR remote
        f232  Mono embedded computer
-       fd13  Programmable power socket
+       fd10  Gembird MSIS-PM
+       fd13  Energenie EG-PMS
+       fd15  Energenie EG-PMS2
 04b5  ROHM LSI Systems USA, LLC
        3064  Hantek DSO-3064
 04b6  Hint Corp.
        0143  GT-S55
        0144  GT-S85
        0151  Perfection V800 Photo
-       0202  Receipt Printer M129C/TM-T70
+       0202  Interface Card UB-U05 for Thermal Receipt Printers [M129C/TM-T70/TM-T88IV]
        0401  CP 800 Digital Camera
        0402  PhotoPC 850z
        0403  PhotoPC 3000z
        0849  Stylus SX205
        084a  PX-501A [Stylus NX400]
        084d  PX-402A [Stylus SX115/Stylus NX110 Series]
-       084f  ME OFFICE 510
+       084f  Multifunctional Printer Scanner [ME Office 510 / Epson Stylus SX215]
        0850  EP-702A [Stylus Photo PX650/TX650 Series]
        0851  Stylus SX410
        0852  EP-802A [Artisan 710 Series/Stylus Photo PX710W/TX720W Series]
        0891  Stylus Office BX535WD
        0892  Stylus Office BX935FWD
        0893  EP-774A
+       0e03  Thermal Receipt Printer [TM-T20]
        1114  XP-440 [Expression Home Small-in-One Printer]
        1129  ET-4750 [WorkForce ET-4750 EcoTank All-in-One]
 04b9  Rainbow Technologies, Inc.
 04ba  Toucan Systems, Ltd
 04bb  I-O Data Device, Inc.
        0101  USB2-IDE/ATAPI Bridge Adapter
+       014a  HDCL-UT
        0201  USB2-IDE/ATAPI Bridge Adapter
        0204  DVD Multi-plus unit iU-CD2
        0206  DVD Multi-plus unit DVR-UEH8
        072c  Revio KD20M
        072d  Revio KD410Z
 04ca  Lite-On Technology Corp.
+       0020  USB Keyboard
        004b  Keyboard
        004f  SK-9020 keyboard
+       008a  Acer Wired Mouse Model SM-9023
        1766  HID Monitor Controls
        2004  Bluetooth 4.0 [Broadcom BCM20702A0]
        2006  Broadcom BCM43142A0 Bluetooth Device
        300d  Atheros AR3012 Bluetooth
        300f  Atheros AR3012 Bluetooth
        3014  Qualcomm Atheros Bluetooth
+       3015  Qualcomm Atheros QCA9377 Bluetooth
        7022  HP HD Webcam
        7025  HP HD Webcam
        7046  TOSHIBA Web Camera - HD
        8107  Microstick II
        8108  ChipKit Pro MX7 (PIC32MX)
        9004  Microchip REAL ICE
+       9009  ICD3
        900a  PICkit3
        9012  PICkit4
        9015  ICD 4 In-Circuit Debugger
        c001  PicoLCD 20x4
        e11c  TL866CS EEPROM Programmer [MiniPRO]
+       ed16  BeamiRC 2.0 CNC remote controller analoge
        edb4  micro PLC (ATSAMD51G19A) [Black Brix ECU II]
        edb5  ATMEGA32U4 [Black Brix ECU]
        f2c4  Macareux-labs Hygrometry Temperature Sensor
        ffee  Devantech USB-ISS
        ffef  PICoPLC [APStech]
 04d9  Holtek Semiconductor, Inc.
+       0006  Wired Keyboard (78/79 key) [RPI Wired Keyboard 5]
        0022  Portable Keyboard
+       0348  Keyboard
        048e  Optical Mouse
        0499  Optical Mouse
        1135  Mouse [MGK-15BU/MLK-15BU]
        a09f  E-Signal LUOM G10 Mechanical Gaming Mouse
        a100  Mouse [HV-MS735]
        a11b  Mouse [MX-3200]
+       a29f  Microarray fingerprint reader
+       b534  LGT8F328P Microprocessor
        e002  MCU
 04da  Panasonic (Matsushita)
        0901  LS-120 Camera
        0110  Connect3D Flash Drive
        0111  Connect3D Flash Drive
        0300  E2530 / GT-C3350 Phones (Mass storage mode)
+       04e8  Galaxy (MIDI mode)
        1003  MP3 Player and Recorder
        1006  SDC-200Z
        130c  NX100
        7081  Human Interface Device
        7301  Fingerprint Device
        8001  Handheld
+       8002  Portable SSD 500GB Model Number: MU - P8500B
+       8003  Portable SSD T1
        d003  GT-I9003
        e020  SERI E02 SCOM 6200 UMTS Phone
        e021  SERI E02 SCOM 6200 Virtual UARTs
        0833  KU-0833 Keyboard
        0841  HP Multimedia Keyboard
        0860  2.4G Multimedia Wireless Kit
+       0939  Amazon Basics mouse
        1061  HP KG-1061 Wireless Keyboard+Mouse
        1121  Periboard 717 Mini Wireless Keyboard
        a001  E-Video DC-100 Camera
        b217  Lenovo Integrated Camera (0.3MP)
        b221  integrated camera
        b230  Integrated HP HD Webcam
+       b249  HP Integrated Webcam
        b257  Lenovo Integrated Camera
        b26b  Sony Visual Communication Camera
        b272  Lenovo EasyCamera
        b3fd  HD WebCam (Asus N-series)
        b40e  HP Truevision HD camera
        b444  Lenovo Integrated Webcam
+       b49f  Bluetooth (RTL8723BE)
        b563  Integrated Camera
        b5ce  Integrated Camera
        b5cf  Integrated IR Camera
        b5db  HP Webcam
        b604  Integrated Camera (1280x720@30)
+       b681  ThinkPad T490 Webcam
 04f3  Elan Microelectronics Corp.
        000a  Touchscreen
        0103  ActiveJet K-2024 Multimedia Keyboard
        0039  HL-5340 series
        0041  HL-2250DN Laser Printer
        0042  HL-2270DW Laser Printer
+       004d  HL-6180DW series
+       0080  HL-L6250DN series
        0100  MFC8600/9650 series
        0101  MFC9600/9870 series
        0102  MFC9750/1200 series
        023e  DCP-197C
        023f  MFC-8680DN
        0240  MFC-J950DN
+       0245  MFC-9560CDW
        0248  DCP-7055 scanner/printer
        024e  MFC-7460DN
        0253  DCP-J125
        03bb  MFC-L2680W
        03bc  MFC-L2700DN
        03bd  DCP-J762N
+       03fd  ADS-2700W
        1000  Printer
        1002  Printer
        2002  PTUSB Printing
        2004  PT-2300/2310 p-Touch Laber Printer
        2007  PT-2420PC P-touch Label Printer
-       2015  QL-500 P-touch label printer
-       2016  QL-550 P-touch label printer
+       2015  QL-500 label printer
+       2016  QL-550 printer
        201a  PT-18R P-touch label printer
-       201b  QL-650TD P-touch Label Printer
-       2027  QL-560 P-touch Label Printer
-       2028  QL-570 P-touch Label Printer
+       201b  QL-650TD Label Printer
+       2020  QL-1050 Label Printer
+       2027  QL-560 Label Printer
+       2028  QL-570 Label Printer
+       202a  QL-1060N Label Printer
        202b  PT-7600 P-touch Label Printer
+       202c  PT-1230PC P-touch Label Printer E mode
+       202d  PT-2430PC P-touch Label Printer
+       2030  PT-1230PC P-touch Label Printer EL mode
        2041  PT-2730 P-touch Label Printer
+       2042  QL-700 Label Printer
+       2043  QL-710W Label Printer
+       2044  QL-720NW Label Printer
+       204d  QL-720NW Label Printer (mass storage mode)
        2061  PT-P700 P-touch Label Printer
        2064  PT-P700 P-touch Label Printer RemovableDisk
-       209b  QL-800 P-touch Label Printer
-       209c  QL-810W P-touch Label Printer
-       209d  QL-820NWB P-touch Label Printer
+       209b  QL-800 Label Printer
+       209c  QL-810W Label Printer
+       209d  QL-820NWB Label Printer
+       20a7  QL-1100 Label Printer
+       20a8  QL-1110NWB Label Printer
+       20a9  QL-1100 Label Printer (mass storage)
+       20aa  QL-1110NWB Label Printer (mass storage)
+       20ab  QL-1115NWB Label Printer
+       20ac  QL-1115NWB Label Printer (mass storage)
+       20c0  QL-600 Label Printer
        2100  Card Reader Writer
        2102  Sewing machine
        60a0  ADS-2000
        a4a2  Linux-USB Ethernet/RNDIS Gadget
        a4a3  Linux-USB user-mode isochronous source/sink
        a4a4  Linux-USB user-mode bulk source/sink
-       a4a5  Pocketbook Pro 903 / Mobius 2 Action Cam
+       a4a5  Pocketbook Pro 903 / Mobius 2 Action Cam / xDuoo X3
        a4a6  Linux-USB Serial Gadget
        a4a7  Linux-USB Serial Gadget (CDC ACM mode)
        a4a8  Linux-USB Printer Gadget
        02c4  Device
        02d1  DVD RW
        02d2  PSP Slim
+       02d4  UP-CX1
        02d8  SBAC-US10 SxS PRO memory card reader/writer
        02e1  FeliCa S330 [PaSoRi]
        02ea  PlayStation 3 Memory Card Adaptor
        0385  Walkman NWZ-E436F
        0387  IC Recorder (P)
        03bc  Webbie HD - MHS-CM1
+       03c3  UP-DR80MD
+       03c4  Stryker SDP1000
+       03c5  UP-DR80
        03cc  SD Card Reader
        03d1  DPF-X95
        03d3  DR-BT100CX
        0c02  ILCE-7M3 [A7III] in Mass Storage mode
        0c03  ILCE-7M3 [A7III] in MTP mode
        0c34  ILCE-7M3 [A7III] in PC Remote mode
+       0cd3  WH-1000XM3 [Wireless Noise-Canceling Headphones]
        0cda  PlayStation Classic controller
        1000  Wireless Buzz! Receiver
 054d  Try Corp.
        2802  Kbd Hub
        3002  Keyboard
        3004  Genius KB-29E
+       3013  BakkerElkhuizen Wired Keyboard S-board 840 Design
+       3020  BakkerElkhuizen Wired Keyboard S-board 840 Design USB-Hub
        3027  Sun-Flex ProTouch
        3107  Keyboard
        3132  Optical mouse M-DY4DR / M-DY6DR
        0093  TPC93
        0097  TPC97
        009a  TPC9A
+       00a2  STU-300B [LCD signature pad]
        00b0  PTZ-430 [Intuos3 (4x5)]
        00b1  PTZ-630 [Intuos3 (6x8)]
        00b2  PTZ-930 [Intuos3 (9x12)]
        00f4  DTK-2400 [Cintiq 24HD] tablet
        00f6  DTH-2400 [Cintiq 24HD touch] touchscreen
        00f8  DTH-2400 [Cintiq 24HD touch] tablet
+       00f9  DTK-2200 [Cintiq 22HD] hub
        00fa  DTK-2200 [Cintiq 22HD] tablet
        00fb  DTU-1031
        0100  TPC100
        033d  CTL-690 [Intuos Draw (M)]
        033e  CTH-690 [Intuos Art (M)]
        0343  DTK-1651
-       0347  Integrated Hub
-       0348  Integrated Hub
+       0347  DTH-W1620 [MobileStudio Pro 16] internal hub
+       0348  DTH-W1620 [MobileStudio Pro 16] external hub
        034a  DTH-W1320 [MobileStudio Pro 13] touchscreen
        034b  DTH-W1620 [MobileStudio Pro 16] touchscreen
        034d  DTH-W1320 [MobileStudio Pro 13] tablet
        038e  DTH-3220 [Cintiq Pro 32] external hub
        038f  DTH-3220 [Cintiq Pro 32] internal hub
        0390  DTK-1660 [Cintiq 16]
+       0392  PTH-460 [Intuos Pro (S)]
+       0396  DTK-1660E
+       0398  DTH-W1320 [MobileStudio Pro 13] tablet
+       0399  DTH-W1620 [MobileStudio Pro 16] tablet
+       039a  DTH-W1320 [MobileStudio Pro 13] touchscreen
+       039b  DTH-W1620 [MobileStudio Pro 16] touchscreen
+       039c  DTH-W1320 [MobileStudio Pro 16] external hub
+       039d  DTH-W1320 [MobileStudio Pro 16] internal hub
+       03aa  DTH-W1620 [MobileStudio Pro 16] tablet
+       03ac  DTH-W1620 [MobileStudio Pro 16] touchscreen
        0400  PenPartner 4x5
        4001  TPC4001
        4004  TPC4004
        0001  Monitor
        0002  HID Monitor Controls
        0003  Device Bay Controller
+       4001  Monitor
 056e  Elecom Co., Ltd
        0002  29UO Mouse
        0057  Micro Grast Pop M-PGDL
        00a4  Blue LED Mouse M-BL06DB
        00a5  M-NV1BR Bluetooth Mouse
        00a7  Blue LED Mouse M-BL08DB
+       00a8  M-BL09DB Mouse
+       00a9  M-BL10UB Mouse
+       00aa  M-BL11DB Mouse
+       00ac  M-A-BL01UL / M-BL15DB Mouse
+       00b4  Track on Glass Mouse M-TG02DL
+       00b5  Track on Glass Mouse M-TG03UL
+       00b6  Track on Glass Mouse M-TG04DL
+       00b8  M-A-BL01UL or M-ASKL2 Mouse
+       00b9  M-A-BL02DB or M-ASKL Mouse
+       00cb  M-BL21DB Mouse
+       00cd  M-XG1UB Mouse
+       00ce  M-XG1DB Mouse
+       00cf  M-XG1BB Bluetooth Mouse
+       00d0  M-XG2UB Mouse
+       00d1  M-XG2DB Mouse
+       00d2  M-XG2BB Bluetooth Mouse
+       00d3  M-XG3DL Mouse
+       00d4  M-LS11DL Mouse
+       00da  M-XG4UB Mouse
+       00db  M-XG4DB Mouse
+       00dc  M-XG4BB Bluetooth Mouse
+       00dd  M-LS12UL Mouse
+       00de  M-LS13UL Mouse
+       00df  M-BL22DB Mouse
+       00e1  M-WK01DB or M-A-BL04DB
+       00e2  M-A-BL03DB
+       00e3  M-XGx10UB
+       00e4  M-XGx10DB
+       00e5  M-XGx10BB
+       00e6  M-XGx20DL or M-XGx20DB UltimateLaser Mouse
+       00f1  M-XT1DRBK USB EX-G Wireless Optical TrackBall
+       00f2  M-XT1URBK EX-G Optical Trackball
+       00f3  M-BL23DB
+       00f4  M-BT13BL LBT-UAN05C2
+       00f7  M-KN1DB
+       00f8  M-BL22DB Mouse (other version)
+       00f9  M-XT2URBK EX-G Optical TrackBall
+       00fa  M-XT2DRBK EX-G Wireless Optical TrackBall
+       00fb  M-XT3URBK EX-G Optical TrackBall
+       00fc  M-XT3DRBK EX-G Wireless Optical TrackBall
+       00fd  M-XT4DRBK EX-G Wireless Optical TrackBall
+       00fe  M-DT1URBK or M-DT2URBK DEFT Optical TrackBall
+       00ff  M-DT1DRBK or M-DT2DRBK DEFT Wireless Optical Mouse
+       0101  M-BL25UBS
+       0103  M-BT16BBS
+       0104  M-BL26UBC
+       0105  M-BL26DBC
+       0107  M-LS15UL
+       0108  M-LS15DL
+       0109  M-LS16UL Mouse
+       010a  M-LS16DL / M-KN2DLS
+       010b  M-BL21DB Mouse
+       010c  M-HT1URBK HUGE Optical TrackBall
+       010d  M-HT1DRBK HUGE Wireless Optical TrackBall
+       010e  M-KS1DBS / M-FPG3DBS
+       010f  M-FBG3DB
+       0115  M-BT13BL
+       0121  M-ED01DB
+       0122  M-NK01DB
+       0124  Dual connect Mouse M-DC01MB Bluetooth
+       0128  TrackBall Mouse M-XPT1MR Wired
+       0129  TrackBall Mouse M-XPT1MR Wireless
+       0130  TrackBall Mouse M-XPT1MR Bluetooth
+       0131  TrackBall Mouse M-DPT1MR Wired
+       0132  TrackBall Mouse M-DPT1MR Wireless
+       0133  TrackBall Mouse M-DPT1MR Bluetooth
+       0136  M-BT20BB
+       0137  BlueTooth 4.0 Mouse M-BT21BB
+       0138  M-A-BL07DB
+       0140  M-G01UR
+       0141  M-Y9UB
+       0142  M-DY13DB
+       0144  M-FBL01DB
+       1055  TK-DCP03 WIRED
+       1057  TK-DCP03 BT
        2003  JC-U3613M
        2004  JC-U3613M
        200c  LD-USB/TX
+       200f  JC-U4013S Gamepad
        2012  JC-U4013S Gamepad
        4002  Laneed 100Mbps Ethernet LD-USB/TX [pegasus]
        4005  LD-USBL/TX
        8501  FRITZ WLAN N v2 [RT5572/rt2870.bin]
 057d  Shark Multimedia, Inc.
 057e  Nintendo Co., Ltd
+       0300  USB-EXI Adapter (GCP-2000)
+       0304  RVT-H Reader
        0305  Broadcom BCM2045A Bluetooth Radio [Nintendo Wii]
        0306  Wii Remote Controller RVL-003
        0337  Wii U GameCube Controller Adapter
+       2000  Switch
        2006  Joy-Con L
        2007  Joy-Con R
+       2009  Switch Pro Controller
+       200e  Joy-Con Charging Grip
+       3000  SDK Debugger
 057f  QuickShot, Ltd
        6238  USB StrikePad
 0580  Denron, Inc.
 0581  Racal Data Group
+       0107  Tera Barcode Scanner 2.4 GHz Receiver
+       020c  Tera 2D Barcode Scanner EVHK0012
 0582  Roland Corp.
        0000  UA-100(G)
        0002  UM-4/MPU-64 MIDI Interface
        0159  DUO-CAPTURE EX
        015b  INTEGRA-7
        015d  R-88
+       01b5  Boutique Series Synthesizer (Normal mode)
+       01b6  Boutique Series Synthesizer (Storage mode)
+       01df  Rubix22
+       01e0  Rubix24
+       01e1  Rubix44
+       01ef  Go:KEYS MIDI
        0505  EDIROL UA-101
 0583  Padix Co., Ltd (Rockfire)
        0001  4 Axis 12 button +POV
        2033  RM-203 USB Nest [mode 4]
        2050  PX-205 PSX Bridge
        205f  PSX/USB converter
+       2060  2-axis 8-button gamepad
        206f  USB, 2-axis 8-button gamepad
        3050  QF-305u Gamepad
        3379  Rockfire X-Force
 058e  Tripath Technology, Inc.
 058f  Alcor Micro Corp.
        1234  Flash Drive
+       198b  Webcam (Gigatech P-09)
        2412  SCard R/W CSR-145
        2802  Monterey Keyboard
        5492  Hub
        6387  Flash Drive
        6390  USB 2.0-IDE bridge
        6391  IDE Bridge
+       6998  AU6998 Flash Disk Controller
        9213  MacAlly Kbd Hub
        9215  AU9814 Hub
        9254  Hub
        0004  Cable Modem
        000b  MR56SVS
        0028  HJ-720IT / HEM-7080IT-E / HEM-790IT
+       0051  FT232BM [E58CIFQ1 with FTDI USB2Serial Converter]
 0591  Questra Consulting
 0592  Powerware Corp.
        0002  UPS (X-Slot)
        0421  Big Disk G465
        0525  BigDisk Extreme 500
        0641  Mobile Hard Drive
+       0828  d2 Quadra
        0829  BigDisk Extreme+
        1004  Little Disk 20 GB
        100c  Rugged Triple Interface Mobile Hard Drive
        1021  Little Disk
        1027  iamaKey V2
        102a  Rikiki Hard Drive
+       103d  D2
        1049  rikiki Harddrive
        1052  P'9220 Mobile Drive
+       1053  P'9230 2TB [Porsche Design Desktop Drive 2TB]
        1061  Rugged USB3-FW
        1064  Rugged 16 and 32 GB
        106b  Rugged Mini HDD
        106d  Porsche Design Mobile Drive
        106e  Porsche Design Desktop Drive
+       1094  Rugged THB
        a601  HardDrive
        a602  CD R/W
 05a0  Vetronix Corp.
        0002  CVA122 Cable Voice Adapter (WDM)
        0003  CVA124E Cable Voice Adapter (WDM)
        0004  CVA122E Cable Voice Adapter (WDM)
+       0008  STA1520 Tuning Adapter
        0a00  Integrated Management Controller Hub
        0a01  Virtual Keyboard/Mouse
        0a02  Virtual Mass Storage
        0519  OV519 Microphone
        1550  VEHO Filmscanner
        2640  OV2640 Webcam
+       2642  Integrated Webcam for Dell XPS 2010
        2643  Monitor Webcam
        264b  Monitor Webcam
        2800  SuperCAM
        0247  Internal Keyboard/Trackpad (JIS)
        024a  Internal Keyboard/Trackpad (MacBook Air) (ISO)
        024d  Internal Keyboard/Trackpad (MacBook Air) (ISO)
+       024f  Aluminium Keyboard (ANSI)
        0250  Aluminium Keyboard (ISO)
        0252  Internal Keyboard/Trackpad (ANSI)
        0253  Internal Keyboard/Trackpad (ISO)
        0254  Internal Keyboard/Trackpad (JIS)
        0259  Internal Keyboard/Trackpad
+       025a  Internal Keyboard/Trackpad
        0263  Apple Internal Keyboard / Trackpad (MacBook Retina)
        0267  Magic Keyboard A1644
        0269  Magic Mouse 2 (Lightning connector)
        12a4  iPad 3 (wifi)
        12a5  iPad 3 (CDMA)
        12a6  iPad 3 (3G, 16 GB)
-       12a8  iPhone5/5C/5S/6
+       12a8  iPhone 5/5C/5S/6/SE
        12a9  iPad 2
        12aa  iPod Touch 5.Gen [A1421]
        12ab  iPad 4/Mini1
        1301  iPod Shuffle 2.Gen
        1302  iPod Shuffle 3.Gen
        1303  iPod Shuffle 4.Gen
+       1392  Apple Watch charger
+       1393  AirPods case
+       1395  Smart Battery Case [iPhone 6]
+       1398  Smart Battery Case
        1401  Modem
        1402  Ethernet Adapter [A1277]
        1500  SuperDrive [A1379]
        8242  Built-in IR Receiver
        8281  Bluetooth Host Controller
        8286  Bluetooth Host Controller
+       8289  Bluetooth Host Controller
        828c  Bluetooth Host Controller
        8290  Bluetooth Host Controller
        8300  Built-in iSight (no firmware loaded)
        8403  Internal Memory Card Reader
        8404  Internal Memory Card Reader
+       8406  Internal Memory Card Reader
        8501  Built-in iSight [Micron]
        8502  Built-in iSight
        8505  Built-in iSight
        8509  FaceTime HD Camera
        850a  FaceTime Camera
        8510  FaceTime HD Camera (Built-in)
+       8600  iBridge
        911c  Hub in A1082 [Cinema HD Display 23"]
        9127  Hub in Thunderbolt Display
        912f  Hub in 30" Cinema Display
 05b5  Dialogic Corp.
 05b6  Proxima Corp.
 05b7  Medianix Semiconductor, Inc.
-05b8  Agiler, Inc.
+05b8  SYSGRATION
        3002  Scroll Mouse
+       3126  APT-905 Wireless presenter
        3223  ISY Wireless Presenter
 05b9  Philips Research Laboratories
 05ba  DigitalPersona, Inc.
        0008  AccelePort USB 8
 05c6  Qualcomm, Inc.
        0114  Select RW-200 CDMA Wireless Modem
+       0a02  Jolla Device Developer Mode
+       0a07  Jolla Device MTP
+       0afe  Jolla Device Charging Only
        1000  Mass Storage Device
        3100  CDMA Wireless Modem/Phone
        3196  CDMA Wireless Modem
        9003  Quectel UC20
        9008  Gobi Wireless Modem (QDL mode)
        9018  Qualcomm HSUSB Device
-       9025  Qualcomm HSUSB Device
+       9025  HSUSB Device
+       9090  Quectel UC15
+       9091  Intex Aqua Fish & Jolla C Diagnostic Mode
+       9092  Nokia 8110 4G
+       90ba  Audio 1.0 device
+       90bb  Snapdragon interface (MIDI + ADB)
+       90dc  Fairphone 2 (Charging & ADB)
        9201  Gobi Wireless Modem (QDL mode)
        9202  Gobi Wireless Modem
        9203  Gobi Wireless Modem
        9211  Acer Gobi Wireless Modem (QDL mode)
        9212  Acer Gobi Wireless Modem
        9214  Acer Gobi 2000 Wireless Modem (QDL mode)
-       9215  Acer Gobi 2000 Wireless Modem
+       9215  Quectel EC20 LTE modem / Acer Gobi 2000 Wireless Modem
        9221  Gobi Wireless Modem (QDL mode)
        9222  Gobi Wireless Modem
        9224  Sony Gobi 2000 Wireless Modem (QDL mode)
        9265  Asus Gobi 2000 Wireless Modem
        9274  iRex Technologies Gobi 2000 Wireless Modem (QDL mode)
        9275  iRex Technologies Gobi 2000 Wireless Modem
+       f003  Nokia 8110 4G
 05c7  Qtronix Corp.
        0113  PC Line Mouse
        1001  Lynx Mouse
        0103  FO13FF-65 PC-CAM
        010b  Webcam (UVC)
        021a  HP Webcam
+       0233  HP Webcam
        0318  Webcam
        0361  SunplusIT INC. HP Truevision HD Webcam
        036e  Webcam
+       0374  HP EliteBook integrated HD Webcam
+       03a1  XiaoMi Webcam
+       03b1  Webcam
+       03bc  HP Wide Vision HD Integrated Webcam
+       03cb  HP Wide Vision HD Integrated Webcam
        0403  Webcam
        041b  HP 2.0MP High Definition Webcam
 05c9  Semtech Corp.
        0403  Printing Support
        0405  Type 101
        0406  Type 102
+       0437  Aficio SP 3510SF
+       044e  SP C250SF (multifunction device: printer, scanner, fax)
        1803  V5 camera [R5U870]
        1810  Pavilion Webcam [R5U870]
        1812  Pavilion Webcam
        183b  Visual Communication Camera VGP-VCC8 [R5U870]
        183d  Sony Vaio Integrated Webcam
        183e  Visual Communication Camera VGP-VCC9 [R5U870]
+       183f  Sony Visual Communication Camera Integrated Webcam
        1841  Fujitsu F01/ Lifebook U810 [R5U870]
        1870  Webcam 1000
+       1880  R5U880
        18b0  Sony Vaio Integrated Webcam
        18b1  Sony Vaio Integrated Webcam
        18b3  Sony Vaio Integrated Webcam
        4d02  MP3 Player
        4d12  MP3 Player
        4d30  MP3 Player
+       a201  JumpDrive S70 4GB
        a209  JumpDrive S70
        a300  JumpDrive2
        a400  JumpDrive trade; Pro 40-501
        c753  JumpDrive TwistTurn
        c75c  JumpDrive V10
 05dd  Delta Electronics, Inc.
+       a011  HID UPS Battery
        ff31  AWU-120
        ff32  FriendlyNET AeroLAN AL2011
        ff35  PCW 100 - Wireless 802.11b Adapter
        0502  GL620USB-A GeneLink USB-USB Bridge
        0503  Webcam
        0504  HID Keyboard Filter
+       0510  Camera
        0604  USB 1.1 Hub
-       0605  USB 2.0 Hub
+       0605  Hub
        0606  USB 2.0 Hub / D-Link DUB-H4 USB 2.0 Hub
        0607  Logitech G110 Hub
        0608  Hub
-       0610  4-port hub
+       0610  Hub
        0612  Hub
        0616  hub
        0660  USB 2.0 Hub
        0711  Card Reader
        0712  Delkin Mass Storage Device
        0715  USB 2.0 microSD Reader
-       0716  USB 2.0 Multislot Card Reader/Writer
+       0716  Multislot Card Reader/Writer
        0717  All-in-1 Card Reader
        0718  IDE/SATA Adapter
        0719  SATA adapter
        0727  microSD Reader/Writer
        0731  GL3310 SATA 3Gb/s Bridge Controller
        0732  All-in-One Cardreader
-       0736  microSD Reader/Writer
+       0736  Colour arc SD Card Reader [PISEN]
        0738  Card reader
        0741  microSD Card Reader
        0743  SDXC and microSDXC CardReader
        0745  Logilink CR0012
        0748  All-in-One Cardreader
+       0749  SD Card Reader and Writer
        0751  microSD Card Reader
        0760  USB 2.0 Card Reader/Writer
        0761  Genesys Mass Storage Device
 05f9  PSC Scanning, Inc.
        1104  Magellan 2200VS
        1206  Gryphon series (OEM mode)
+       120c  Gryphon GD4430-BK
        2202  Point of Sale Handheld Scanner
        2206  Gryphon series (keyboard emulation mode)
        220c  Datalogic Gryphon GD4430
        0251  Raider Pro
        0253  ProPad 8 Digital
        0286  SV-286 Cyclone Digital
+       1007  Mad Catz Controller
        107a  PowerPad Pro X-Box pad
        262a  3dfx HammerHead FX
        262f  HammerHead Fx
        0014  Gamepad
        1010  Optical Wireless
        2001  Microsoft Wireless Receiver 700
+       3030  Controller
+       3031  Controller
 05ff  LeCroy Corp.
 0600  Barco Display Systems
 0601  Jazz Hipster Corp.
 0602  Vista Imaging, Inc.
        1001  ViCam Webcam
 0603  Novatek Microelectronics Corp.
+       0002  Sino Wealth keyboard/mouse 2.4 GHz receiver
        00f1  Keyboard (Labtec Ultra Flat Keyboard)
        00f2  Keyboard (Labtec Ultra Flat Keyboard)
        6871  Mouse
        2101  Keyboard
        2231  KSK-6001 UELX Keyboard
        2270  Gigabyte K8100 Aivia Gaming Keyboard
+       500a  Cougar 500k Gaming Keyboard
        5253  Thermaltake MEKA G-Unit Gaming Keyboard
        5811  ACK-571U Wireless Keyboard
        5903  Japanese Keyboard - 595U
 0622  Iotech, Inc.
 0623  Littelfuse, Inc.
 0624  Avocent Corp.
+       0013  SC Secure KVM
        0248  Virtual Hub
        0249  Virtual Keyboard/Mouse
        0251  Virtual Mass Storage
+       0252  Virtual SD card reader
        0294  Dell 03R874 KVM dongle
        0402  Cisco Virtual Keyboard and Mouse
        0403  Cisco Virtual Mass Storage
+       1774  Cybex SC985
 0625  TiMedia Technology Co., Ltd
 0626  Nippon Systems Development Co., Ltd
 0627  Adomax Technology Co., Ltd
 062a  MosArt Semiconductor Corp.
        0000  Optical mouse
        0001  Notebook Optical Mouse
+       0020  Logic3 Gamepad
+       0033  Competition Pro Steering Wheel
        0102  Wireless Keyboard/Mouse Combo [MK1152WC]
        0201  Defender Office Keyboard (K7310) S Zodiak KM-9010
        0252  Emerge Uni-retractable Laser Mouse
        2410  Wireless PS3 gamepad
        3286  Nano Receiver [Sandstrom Laser Mouse SMWLL11]
        4101  Wireless Keyboard/Mouse
+       4102  Wireless Mouse
+       4106  Wireless Mouse 2.4G
+       4c01  2,4Ghz Wireless Transceiver [for Delux M618 Plus Wireless Vertical Mouse]
        6301  Trust Wireless Optical Mouse MI-4150K
        9003  VoIP Conference Hub (A16GH)
        9004  USR9602 USB Internet Mini Phone
        0a13  AV600U
        0a15  Konica Minolta SC-110
        0a16  Konica Minolta SC-215
+       0a2a  AV220 C2
        0a30  UMAX Astra 6700 Scanner
        0a41  Avision AM3000/MF3000 Series
        0f01  fi-4010CU
 064d  TriTech Microelectronics, Ltd
 064e  Suyin Corp.
        2100  Sony Visual Communication Camera
+       3410  RGBIR Camera
        9700  Asus Integrated Webcam
        a100  Acer OrbiCam
        a101  Acer CrystalEye Webcam
        a110  HP Webcam
        a114  Lemote Webcam
        a116  UVC 1.3MPixel WebCam
+       a127  HP Integrated Webcam
        a136  Asus Integrated Webcam [CN031B]
        a219  1.3M WebCam (notebook emachines E730, Acer sub-brand)
        c107  HP webcam [dv6-1190en]
        e263  HP TrueVision HD Integrated Webcam
        f102  Lenovo Integrated Webcam [R5U877]
        f103  Lenovo Integrated Webcam [R5U877]
+       f207  Lenovo EasyCamera Integrated Webcam
        f209  HP Webcam
        f300  UVC 0.3M Webcam
 064f  WIBU-Systems AG
        82e0  MP3 Player
        8320  TrekStor i.Beat fun
        835d  MP3 Player
+       83b5  Transcend T.sonic 530 MP3 Player
        9000  MP3 Player
        9001  MP3 Player
        9002  MP3 Player
        0600  IDE Bridge
        0610  Onext EG210U MODEM
        0611  AlDiga AL-11U Quad-band GSM/GPRS/EDGE modem
+       1231  Orico SATA External Hard Disk Drive Lay-Flat Docking Station with USB 3.0 & eSATA interfaces.
        2303  PL2303 Serial Port
        2305  PL2305 Parallel Port
        2306  Raylink Bridge Controller
        2515  Flash Disk Embedded Hub
        2517  Flash Disk Mass Storage Device
        2528  Storage device (8gB thumb drive)
+       2571  LG Electronics GE24LU21
        25a1  PL25A1 Host-Host Bridge
        2773  PL2773 SATAII bridge controller
        3400  Hi-Speed Flash Disk with TruePrint AES3400
        3009  Magicolor 2300W
        300b  PagePro 1350W
        300c  PagePro 1300W
+       301b  Develop D 1650iD
+       3023  Develop D 2050iD
        302e  Develop D 1650iD PCL
        3034  Develop D 2050iD PCL
        4001  Dimage 2300
        0500  GameStick 3D
        0501  CH Pro Pedals
        0504  F-16 Combat Stick
+068f  Nihon KOHDEN
+       c00d  MEK-6500
 0690  Golden Bridge Electech, Inc.
 0693  Hagiwara Sys-Com Co., Ltd
        0002  FlashGate SmartMedia Card Reader
        9999  VLxxxx Monitor+Hub
 0699  Tektronix, Inc.
        0347  AFG 3022B
+       0365  TDS 2004B
        036a  TDS 2024B
 069a  Askey Computer Corp.
        0001  VC010 Webcam [pwc]
        0006  Cyborg Gold Joystick
        0109  P880 Pad
        0160  ST290 Pro
-       0200  Xbox Adrenalin Hub
+       0200  Racing Wheel
+       0201  Adrenalin Gamepad
        0241  Xbox Adrenalin Gamepad
        0255  X52 Flight Controller
        040b  P990 Dual Analog Pad
        a2ae  Pro Flight Instrument Panel
        a502  Gaming Mouse
        f518  P3200 Rumble Force Game Pad
+       f51a  P3600
        ff04  R440 Force Wheel
        ff0c  Cyborg Force Rumble Pad
        ff0d  P2600 Rumble Force Pad
        000e  HID Device
        0010  Wireless TouchPad
        0013  DisplayPad
+       009a  Metallica MIS Touch Fingerprint Reader
+       00a2  Metallica MOH Touch Fingerprint Reader
+       00bd  Prometheus MIS Touch Fingerprint Reader
        2970  touchpad
 06cc  Terayon Communication Systems
        0101  Cable Modem
        03aa  CP3020DA
        03ad  CP-9800D/DW
        03ae  CP-9800DW-S
+       0f10  Hori/Namco FlightStick 2
        3b10  P95D
        3b21  CP-9810D/DW
        3b30  CP-D70DW / CP-D707DW
        3b36  CP-D80DW
        3b50  CP-W5000DW
        3b60  CP-D90DW
+       3b80  CP-M1
 06d4  Cisco Systems
 06d5  Toshiba
        4000  Japanese Keyboard
        0231  PS/2 Mouse Port
        0232  Serial On Port
        0240  PS/2 to USB Converter
+       0260  PS/2 Keyboard and Mouse
        0300  BAY-3U1S1P Parallel Port
        0302  Parallel Port
        0900  SVGA Adapter
        c541  ISDN TA 280
 0736  Lorom Industrial Co., Ltd
 0738  Mad Catz, Inc.
+       2215  X-55 Rhino Stick
+       2237  V.1 Stick
+       4506  Wireless Controller
        4507  XBox Device
-       4516  XBox Device
-       4520  XBox Device
-       4526  XBox Device
-       4536  XBox Device
-       4540  XBox Device
-       4556  XBox Device
+       4516  Control Pad
+       4520  Control Pad Pro
+       4522  LumiCON
+       4526  Control Pad Pro
+       4530  Universal MC2 Racing Wheel and Pedals
+       4536  MicroCON
+       4540  Beat Pad
+       4556  Lynx Wireless Controller
        4566  XBox Device
        4576  XBox Device
-       4586  XBox Device
-       4588  XBox Device
+       4586  MicroCON Wireless Controller
+       4588  Blaster
+       45ff  Beat Pad
+       4716  Wired Xbox 360 Controller
+       4718  Street Fighter IV FightStick SE for Xbox 360
+       4726  Xbox 360 Controller
+       4728  Street Fighter IV FightPad for Xbox 360
+       4730  MC2 Racing Wheel for Xbox 360
+       4736  MicroCON for Xbox 360
+       4738  Street Fighter IV Wired Controller for Xbox 360
+       4740  Beat Pad for Xbox 360
+       4743  Beat Pad Pro
+       4758  Arcade Game Stick
+       4a01  FightStick TE 2 for Xbox One
+       6040  Beat Pad Pro
        8818  Street Fighter IV Arcade FightStick (PS3)
+       9871  Portable Drum Kit
+       a109  S.T.R.I.K.E.7 Keyboard
+       a215  X-55 Rhino Throttle
+       b726  Modern Warfare 2 Controller for Xbox 360
+       b738  Marvel VS Capcom 2 TE FightStick for Xbox 360
+       beef  Joytech Neo SE Advanced Gamepad
+       cb02  Saitek Cyborg Rumble Pad
+       cb03  Saitek P3200 Rumble Pad
+       cb29  Saitek Aviator Stick AV8R02
+       f738  Super Street Fighter IV FightStick TE S for Xbox 360
 073a  Chaplet Systems, Inc.
        2230  infrared dongle for remote
 073b  Suncom Technologies
        0522  Pole Display (SPC522-3415 2 x 20 Line Display)
        0624  Pole Display (SP324-3415  4 x 20 Line Display)
 073d  Eutron S.p.a.
+       0000  SmartKey
        0005  Crypto Token
        0007  CryptoIdentity CCID
        0025  SmartKey 3
        200a  ISDN TA [HFC-S]
 0745  Syntech Information Co., Ltd
 0746  Onkyo Corp.
+       4700  Integra MZA-4.7
        5500  SE-U55 Audio Device
 0747  Labway Corp.
 0748  Strong Man Enterprise Co., Ltd
        0002  PS/2 Adapter
 0755  Aureal Semiconductor
 0757  Network Technologies, Inc.
+       0a00  SUN Adapter
 0758  Carl Zeiss Microscopy GmbH
 075b  Sophisticated Circuits, Inc.
        0001  Kick-off! Watchdog
        6003  ColorMunki Smile
        d094  X-Rite DTP94 [Quato Silver Haze Pro]
 0766  Jess-Link Products Co., Ltd
+       0017  Packard Bell Carbon
        001b  Packard Bell Go
        0204  TopSpeed Cyberlink Remote Control
 0767  Tokheim Corp.
        1021  CardMan 1021
        1221  CardMan 1221
        1784  CardMan 6020
-       3021  CardMan 3121
-       3022  CardMan 3021
+       3021  CardMan 3021 / 3121
+       3022  CardMan 3121 (HID Technologies)
        3610  CardMan 3620
        3621  CardMan 3621
        3821  CardMan 3821
        c000  CardMan 3x21 CS
        c001  CardMan 5121 CS
 076c  Partner Tech
+       0204  CD7220 Communications Port
+       0302  RP-600
 076d  Denso Corp.
 076e  Kuan Tech Enterprise Co., Ltd
 076f  Jhen Vei Electronic Co., Ltd
 0776  Inalways Corp.
 0777  Comda Enterprise Corp.
 0778  Volex, Inc.
-0779  Fairchild Semiconductor
+0779  ON Semiconductor (formerly Fairchild)
+       0133  FUSB307B
+       0134  FUSB308B
 077a  Sankyo Seiki Mfg. Co., Ltd
 077b  Linksys
        08be  BEFCMU10 v4 Cable Modem
        07af  iMic
        1016  AirClick
        627a  Radio SHARK
+077e  Softing AG
+       008a  NetLink Compact MPI/Profibus adapter
+       0160  EDICblue
+       0220  VAS5054A
 077f  Well Excellent & Most Corp.
 0780  Sagem Monetel GmbH
        1202  ORGA 900 Smart Card Terminal Virtual Com Port
        5575  Cruzer Glide
        5576  Cruzer Facet
        5577  Cruzer Pop (8GB)
-       557d  Cruzer Force (64GB)
+       557d  Cruzer Force
        5580  SDCZ80 Flash Drive
        5581  Ultra
        5583  Ultra Fit
+       5588  Extreme Pro
+       5589  SD8SB8U512G[Extreme 500]
+       558c  Extreme Portable SSD
        5590  Ultra Dual
        5591  Ultra Flair
        5e10  Encrypted
        6100  Ultra II SD Plus 2GB
+       6500  uSSD 5000
        7100  Cruzer Mini
        7101  Pen Flash
        7102  Cruzer Mini
        a7c1  Storage device (SD card reader)
        a7e8  SDDR-113 MicroMate SDHC Reader
        b2b3  SDDR-103 MobileMate SD+ Reader
+       b2b5  SDDR-104 MobileMate SD+ Reader
        b4b5  SDDR-89 V4 ImageMate 12-in-1 Reader
+       b6b7  SDDR-99 V4 ImageMate 5-in-1 Reader
        b6ba  CF SDDR-289
 0782  Trackerball
 0783  C3PO
        0063  LDR Device
        0064  LDR-R Device
        00b3  DVD Multi-plus unit LDR-H443U2
+       00cc  LHD Device
        0105  LAN-TX/U1H2 10/100 Ethernet Adapter [pegasus II]
        010c  Realtek RTL8187 Wireless 802.11g 54Mbps Network Adapter
        0160  LAN-GTJ/U2A
        0986  AN986 Pegasus Ethernet
        8266  Infineon WildCard-USB Wireless LAN Adapter
        8511  ADM8511 Pegasus II Ethernet
-       8513  AN8513 Ethernet
-       8515  AN8515 Ethernet
+       8513  ADM8513 Pegasus II Ethernet
+       8515  ADM8515 Pegasus II Ethernet
 07aa  Corega K.K.
        0001  Ether USB-T Ethernet [klsi]
        0004  FEther USB-TX Ethernet [pegasus]
        fc01  IDE bridge
        fc02  Cable II USB-2
        fc03  USB2-IDE IDE bridge
+       fc77  Quattro 3.0
        fcd6  Freecom HD Classic
        fcf6  DataBar
        fcf8  Freecom Classic SL Network Drive
        5101  SurfBoard SB5101 Cable Modem
        5120  SurfBoard SB5120 Cable Modem (RNDIS)
        5121  Surfboard 5121 Cable Modem
+       6002  MTR7000 Cable Tuning Adapter
        7030  WU830G 802.11bg Wireless Adapter [Envara WiND512]
 07b3  Plustek, Inc.
        0001  OpticPro 1212U Scanner
        0413  OpticSlim 1200 Scanner
        0601  OpticPro ST24 Scanner
        0800  OpticPro ST48 Scanner
+       0807  OpticFilm 7200 scanner
        0900  OpticBook 3600 Scanner
        090c  OpticBook 3600 Plus Scanner
        0a06  TVcam VD100
        0e08  OpticBook A300 Scanner
        1300  OpticBook 3800 Scanner
        1301  OpticBook 4800 Scanner
+       130f  Bookreader v200
 07b4  Olympus Optical Co., Ltd
        0100  Camedia C-2100/C-3000 Ultra Zoom Camera
        0102  Camedia E-10/C-220/C-50 Camera
        0244  Digital Voice Recorder VN-8500PC
        024f  Digital Voice Recorder DS-7000
        0280  m:robe 100
+       0295  Digital Voice Recorder VN-541PC
 07b5  Mega World International, Ltd
        0017  Joystick
        0213  Thrustmaster Firestorm Digital 3 Gamepad
 07bc  Canon Computer Systems, Inc.
 07bd  Webgear, Inc.
 07be  Veridicom
+       1935  Elektron Music Machines
 07c0  Code Mercenaries Hard- und Software GmbH
        1113  JoyWarrior24F8
        1116  JoyWarrior24F14
        0837  H837 Hybrid ATSC/QAM
        1228  MPEG-2 Capture Device (M038)
        1830  AVerTV Volar Video Capture (H830)
+       1871  TD310 DVB-T/T2/C dongle
        3835  AVerTV Volar Green HD (A835B)
        850a  AverTV Volar Black HD (A850)
        850b  AverTV Red HD+ (A850T)
        0501  Mass Storage
 07cd  Elektor
        0001  USBuart Serial Port
+07ce  Nidec Copal
+       c007  DPB-4000
+       c009  DPB-6000
+       c010  CPB-7000
 07cf  Casio Computer Co., Ltd
        1001  QV-8000SX/5700/3000EX Digicam; Exilim EX-M20
        1003  Exilim EX-S500
        6102  fx-CP400
        6801  PL-40R
        6802  MIDI Keyboard
+       6803  CTK-3500 (MIDI keyboard)
 07d0  Dazzle
        0001  Digital Video Creator I
        0002  Global Village VideoFX Grabber
        0000  FastLane MIDI Interface
        0001  MIDI Interface
        0002  MOTU Audio for 64 bit
+       0004  MicroBook
+       0008  M Series
 07ff  Unknown
        00ff  Portable Hard Drive
+       ffff  Mad Catz Gamepad
 0801  MagTek
        0001  Mini Swipe Reader (Keyboard Emulation)
        0002  Mini Swipe Reader
 081c  Mipsys
 081e  AlphaSmart, Inc.
        df00  Handheld
+081f  Manta
+       e401  MM812
 0822  Reudo Corp.
        2001  IRXpress Infrared Device
 0825  GC Protronics
        1005  Digimax 220
        1009  Digimax V4
        1012  6500 Document Camera
+       103f  Digimax S500
        1058  S730 Camera
        1064  Digimax D830 Camera
        1542  Digimax 50 Duo
        4300  WG111U Double 108 Mbps Wireless [Atheros AR5004X / AR5005UX]
        4301  WG111U (no firmware) Double 108 Mbps Wireless [Atheros AR5004X / AR5005UX]
        5f00  WPN111 802.11g Wireless Adapter [Atheros AR5523]
+       68e1  LB1120-100NAS
        6a00  WG111v2 54 Mbps Wireless [RealTek RTL8187L]
        7100  WN121T RangeMax Next Wireless-N [Marvell TopDog]
        9000  WN111(v1) RangeMax Next Wireless [Marvell 88W8362+88W8060]
        9050  A6200 802.11a/b/g/n/ac Wireless Adapter [Broadcom BCM43526]
        9051  A6200v2 802.11a/b/g/n/ac (2x2) Wireless Adapter [Realtek RTL8812AU]
        9052  A6100 AC600 DB Wireless Adapter [Realtek RTL8811AU]
+       9054  Nighthawk A7000 802.11ac Wireless Adapter AC1900 [Realtek 8814AU]
        a001  PA101 10 Mbps HPNA Home Phoneline RJ-1
        f001  On Networks N300MA 802.11bgn [Realtek RTL8192CU]
 084d  Minton Optic Industry Co., Inc.
 0852  CSEM
 0853  Topre Corporation
        0100  HHKB Professional
+       0119  RealForce 105UB
+       0200  RealForce Compact Keyboard
 0854  ActiveWire, Inc.
        0100  I/O Board
        0101  I/O Board, rev1
 090f  Fujitsu Devices, Inc.
 0910  Alation Systems, Inc.
 0911  Philips Speech Processing
+       0c1c  SpeechMike III
        149a  SpeechMike II Pro Plus LFH5276
        2512  SpeechMike Pro
 0912  Voquette, Inc.
        23cc  nüvi 1350
        2459  GPSmap 62/78 series
        2491  Edge 800
+       2518  eTrex 10
        2519  eTrex 30
        2535  Edge 800
        253c  GPSmap 62sc
        255b  Nuvi 2505LM
+       2613  Edge 200 TWN
        26a1  Nuvi 55
+       2802  fenix 3
+       28db  Drive 5
        47fb  nuviCam
+       4cdb  Fenix 6
 0920  Echelon Co.
        7500  Network Interface
 0921  GoHubs, Inc.
 0922  Dymo-CoStar Corp.
        0007  LabelWriter 330
        0009  LabelWriter 310
+       0013  LabelManager 400
        0019  LabelWriter 400
        001a  LabelWriter 400 Turbo
        0020  LabelWriter 450
+       0400  LabelWriter SE450
        1001  LabelManager PnP
+       8003  M10 Digital Postal Scale
        8004  M25 Digital Postal Scale
+       8009  S250 Digital Postal Scale
 0923  IC Media Corp.
        010f  SIIG MobileCam
 0924  Xerox
 0925  Lakeview Research
        0005  Gamtec.,Ltd SmartJoy PLUS Adapter
        03e8  Wii Classic Controller Adapter
+       1031  WiseGroup Ltd, Gameport Controller
+       1700  PS/SS/N64 Joypad
        3881  Saleae Logic
        8101  Phidgets, Inc., 1-Motor PhidgetServo v2.0
        8104  Phidgets, Inc., 4-Motor PhidgetServo v2.0
 0929  American Biometric Co.
 092a  Toshiba Information & Industrial Sys. And Services
 092b  Sena Technologies, Inc.
+       4210  20S - Bluetooth Motorcycle headset & universal intercom
 092f  Northern Embedded Science/CAVNEX
        0004  JTAG-4
        0005  JTAG-5
        0509  BT EDR Dongle
        0706  PocketPC e740
        0707  Pocket PC e330 Series
-       0708  Pocket PC e350 Series
+       0708  Pocket PC e350 Series
        0709  Pocket PC e750 Series
        070a  Pocket PC e400 Series
        070b  Pocket PC e800 Series
        130c  F3607gw Mobile Broadband Module
        1311  F3607gw v2 Mobile Broadband Module
        1400  Memory Stick 2GB
+       140b  Memory Stick 64GB
        642f  TravelDrive
        6506  TravelDrive 2C
        6507  TravelDrive 2C
        6540  TransMemory Flash Memory
        6544  TransMemory-Mini / Kingston DataTraveler 2.0 Stick
        6545  Kingston DataTraveler 102/2.0 / HEMA Flash Drive 2 GB / PNY Attache 4GB Stick
+       a002  SunplusIT SATA bridge
 0931  Harmonic Data Systems, Ltd
 0932  Crescentec Corp.
        0300  VideoAdvantage
        003c  Rhythmedics HID Bootloader
 0939  Lumberg, Inc.
        0b15  Toshiba Stor.E Alu 2
+       0b16  Toshiba StorE HDD
 093a  Pixart Imaging, Inc.
        0007  CMOS 100K-R Rev. 1.90
        010e  Digital camera, CD302N/Elta Medi@ digi-cam/HE-501A
        2621  PAC731x Trust Webcam
        2622  Webcam Genius
        2624  Webcam
+       2628  Webcam Genius iLook 300
+       2700  GE 1.3 MP MiniCam Pro
 093b  Plextor Corp.
        0010  Storage Adapter
        0011  PlexWriter 40/12/40U
+       0012  PlexWriter 48/24/48U
        0041  PX-708A DVD RW
        0042  PX-712UF DVD RW
        a002  ConvertX M402U XLOADER
 0951  Kingston Technology
        0008  Ethernet
        000a  KNU101TX 100baseTX Ethernet
+       1539  Iron Key D300 (Virtual CD-ROM and USB Stick)
        1600  DataTraveler II Pen Drive
        1601  DataTraveler II+ Pen Drive
        1602  DataTraveler Mini
        1653  Data Traveler 100 G2 8 GiB
        1656  DataTraveler Ultimate G2
        1660  Data Traveller 108
-       1665  Digital DataTraveler SE9 64GB
-       1666  DataTraveler 100 G3/G4/SE9 G2
+       1665  Digital DataTraveler SE9
+       1666  DataTraveler 100 G3/G4/SE9 G2/50
        1689  DataTraveler SE9
        168a  DataTraveler Micro
        168c  DT Elite 3.0
+       16a4  HyperX 7.1 Audio
        16b3  HyperX Savage
+       16d2  HX-KB4BL1-US [HYPERX Alloy FPS Pro]
+       16d4  HyperX SavageEXO [0382]
+       16d5  DataTraveler Elite G2
+       16df  HyperX QuadCast
+       16e4  HyperX Pulsefire Raid
 0954  RPM Systems Corp.
 0955  NVIDIA Corp.
+       7005  Bootloader
        7018  T186 [Tegra Parker]
        701a  U-Boot running on Tegra
        7020  L4T (Linux for Tegra) running on Tegra
        7100  Tegra Device
        7140  T124 [Tegra K1/Logan 32-bit]
        7210  SHIELD Controller
-       7721  T210 [Tegra Erista]
+       7321  Switch [Tegra Erista] recovery mode
+       7721  T210 [TX1 Tegra Erista] recovery mode
        7820  T20 [Tegra 2] recovery mode
+       7c18  T186 [TX2 Tegra Parker] recovery mode
        b400  SHIELD (debug)
        b401  SHIELD
        cf05  SHIELD Tablet (debug)
        0a07  34411A Multimeter
        1507  33210A Waveform Generator
        1745  Test and Measurement Device (IVI)
+       1f01  N5181A MXG Analog Signal Generator
        2918  U2702A oscilloscope
        fb18  LC Device
 0958  CompuLink Research, Inc.
        0305  ePass2000Auto
        0309  ePass3000GM
        0401  ePass3000
+       0405  Zzkey Dongle
+       0608  SC Reader KP382
        0702  ePass3003
        0703  ePass3003Auto
        0802  ePass2000 (G&D STARCOS SPK 2.4)
 0984  Apricorn
        0040  SATA Wire (2.5")
        0200  Hard Drive Storage (TPP)
+       1407  Secure Key 3.0
 0985  cab Produkttechnik GmbH & Co KG
        0045  Mach4/200 Label Printer
        00a3  A3/200 or A3/300 Label Printer
 0996  Integrated Telecom Express, Inc.
 099a  Zippy Technology Corp.
        0638  Sanwa Supply Inc. Small Keyboard
+       2620  Graphics tablet [Polostar PT1001, Zeniq PT1001, Leogics PT1001]
        610c  EL-610 Super Mini Electron luminescent Keyboard
+       6330  SANWA Supply Inc. Slim Keyboard
        713a  WK-713 Multimedia Keyboard
        7160  Hyper Slim Keyboard
 099e  Trimble Navigation, Ltd
        3642  Prism 2.x 802.11b Adapter
 09ab  Japan Cash Machine Co., Ltd.
 09ae  Tripp Lite
+       0002  Any Device (see discussion)
+09b0  Fargo
+       2400  HDP5000
 09b2  Franklin Electronic Publishers, Inc.
        0001  eBookman Palm Computer
 09b3  Altius Solutions, Inc.
        1007  Ex-Series UVC and MSD interface
        1008  Serial Port
        1996  FLIR ONE Camera
+       4007  Breach
 09cc  Workbit Corp.
        0404  BAFO USB-ATA/ATAPI Bridge Controller
 09cd  Psion Dacom Home Networks, Ltd
 09d2  Vreelin Engineering, Inc.
 09d3  Com One
        0001  ISDN TA / Light Rider 128K
-       000b  Bluetooth Adapter class 1 [BlueLight]
-09d7  NovAtel Inc.
-       0100  NovAtel FlexPack GPS receiver
-09d8  ELATEC
+       000b  Bluetooth Adapter class 2
+09d7  Hexagon NovAtel Inc.
+       0100  GPS/GNSS/SPAN sensor
+09d8  ELATEC GmbH
+       0320  TWN3 Multi125
        0406  TWN4 MIFARE NFC
 09d9  KRF Tech, Ltd
 09da  A4Tech Co., Ltd.
        024f  RF Receiver and G6-20D Wireless Optical Mouse
        0260  KV-300H Isolation Keyboard
        032b  Wireless Mouse (Battery Free)
+       09da  Bloody V8 Mouse
        1068  Bloody A90 Mouse
+       112c  Bloody V5 Mouse
+       3a60  Bloody V8M Core 2 Mouse
        8090  X-718BK Oscar Optical Gaming Mouse
        9033  X-718BK Optical Mouse
        9066  F3 V-Track Gaming Mouse
        9090  XL-730K / XL-750BK / XL-755BK Mice
+       f613  Bloody V7M Mouse
 09db  Measurement Computing Corp.
        0075  MiniLab 1008
        0076  PMD-1024
 09e6  Silutia, Inc.
 09e7  Real 3D, Inc.
 09e8  AKAI  Professional M.I. Corp.
+       0045  MPK Mini Mk II MIDI Controller
        0062  MPD16 MIDI Pad Controller Unit
        006d  EWI electronic wind instrument
        0071  MPK25 MIDI Keyboard
        5024  Mass Storage Device
        5025  Mass Storage Device
 0a4a  Ploytec GmbH
+       a400  AUDIO JUNCTION 2.0
 0a4b  Fujitsu Media Devices, Ltd
 0a4c  Computex Co., Ltd
        15d9  OPTICAL MOUSE
 0a5b  EAsics NV
 0a5c  Broadcom Corp.
        0201  iLine10(tm) Network Adapter
+       0bdc  802.11a/b/g/n/ac Wireless Adapter
        2000  Bluetooth Device
        2001  Bluetooth Device
        2009  BCM2035 Bluetooth
        21e3  HP Portable Valentine
        21e6  BCM20702 Bluetooth 4.0 [ThinkPad]
        21e8  BCM20702A0 Bluetooth 4.0
+       21ec  BCM20702A0 Bluetooth 4.0
        21f1  HP Portable Bumble Bee
        22be  BCM2070 Bluetooth 3.0 + HS
        4500  BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth)
 0a5d  Diatrend Corp.
 0a5f  Zebra
        0009  LP2844 Printer
+       0050  P120i / WM120i
        0081  GK420t Label Printer
+       0084  GX420d Desktop Label Printer
        008b  HC100 wristbands Printer
        008c  ZP 450 Printer
        00d1  Zebra GC420d Label Printer
+       0110  ZD500 Desktop Label Printer
        930a  Printer
 0a62  MPMan
        0010  MPMan MP-F40 MP3 Player
        c303  Saturn USB 2.0 Camera
        c326  Namuga 1.3M Webcam
        c33f  Webcam
+       c412  Lenovo IdeaCentre Web Camera
        c429  Lenovo ThinkCentre Web Camera
        c42d  Lenovo IdeaCentre Web Camera
 0ac9  Micro Solutions, Inc.
        1786  USB-N10 802.11n Network Adapter [Realtek RTL8188SU]
        1788  BT-270 Bluetooth Adapter
        1791  WL-167G v3 802.11n Adapter [Realtek RTL8188SU]
+       179c  Bluetooth Adapter
        179d  USB-N53 802.11abgn Network Adapter [Ralink RT3572]
        179e  Eee Note EA800 (network mode)
        179f  Eee Note EA800 (tablet mode)
        17a1  Eee Note EA800 (mass storage mode)
        17ab  USB-N13 802.11n Network Adapter (rev. B1) [Realtek RTL8192CU]
        17ba  N10 Nano 802.11n Network Adapter [Realtek RTL8192CU]
+       17c2  ROG Spitfire
        17c7  WL-330NUL
        17c9  USB-AC53 802.11a/b/g/n/ac Wireless Adapter [Broadcom BCM43526]
        17cb  Broadcom BCM20702A0 Bluetooth
        17db  USB-AC50 802.11a/b/g/n/ac (1x1) Wireless Adapter [MediaTek MT7610U]
        17e8  USB-N14 802.11b/g/n (2x2) Wireless Adapter [Ralink RT5372]
        17eb  USB-AC55 802.11a/b/g/n/ac Wireless Adapter [MediaTek MT7612U]
+       17f5  Xonar U5 sound card
        180a  Broadcom BCM20702 Single-Chip Bluetooth 4.0 + LE
        1817  USB-AC68 802.11a/b/g/n/ac (4x4) Wireless Adapter [Realtek RTL8814AU]
        1825  Qualcomm Bluetooth 4.1
+       18f0  Realtek 8188EUS [USB-N10 Nano]
        4c80  Transformer Pad TF300TG
        4c90  Transformer Pad Infinity TF700
        4c91  Transformer Pad Infinity TF700 (Debug mode)
 0b0d  ProjectLab
        0000  CenturyCD
 0b0e  GN Netcom
+       0305  Jabra EVOLVE Link MS
+       0311  Jabra EVOLVE 65
+       0312  enc060:Buttons Volume up/down/mute + phone [Jabra]
+       0343  Jabra UC VOICE 150a
        0348  Jabra UC VOICE 550a MS
        034c  Jabra UC Voice 750 MS
+       034d  Jabra UC VOICE 750
        0410  Jabra SPEAK 410
        0420  Jabra SPEAK 510
+       0422  Jabra SPEAK 510 USB
+       0933  Jabra Freeway
        094d  GN Netcom / Jabra REVO Wireless
        1017  Jabra PRO 930
        1022  Jabra PRO 9450, Type 9400BS (DECT Headset)
        1041  Jabra PRO 9460
        1900  Jabra Biz 1900
        2007  GN 2000 Stereo Corded Headset
+       2456  Jabra SPEAK 810
+       245e  Jabra Link 370
        620c  Jabra BT620s
        9330  Jabra GN9330 Headset
+       a346  Jabra Engage 75 Stereo
+       a50a  Alienware Wireless Gaming Headset AW988
 0b0f  AVID Technology
+       0400  DNxID
 0b10  Pcally
 0b11  I Tech Solutions Co., Ltd
 0b1e  Electronic Warfare Assoc., Inc. (EWA)
        0030  ShuttlePro v2
        0401  RollerMouse Free 2
        0700  RollerMouse Pro
+       08a0  Perfit Mouse
+       1000  RollerMouse Red
+       1010  Vidamic Technomouse IQ
 0b37  Hitachi ULSI Systems Co., Ltd
 0b38  Gear Head
        0003  Keyboard
        0100  D'music MP3 Player
 0b4d  Graphtec America, Inc.
        110a  Graphtec CC200-20
+       1123  Electronic Cutting Tool [Silhouette Portrait]
 0b4e  Musical Electronics, Ltd
        6500  MP3 Player
        8028  MP3 Player
        1720  10/100 Ethernet
        1780  AX88178
        1790  AX88179 Gigabit Ethernet
+       6802  AX68002 KVM Switch SoC
        7720  AX88772
        772a  AX88772A Fast Ethernet
        772b  AX88772B
        0001  Android Phone via mass storage [Wiko Cink Peax 2]
        00ce  mmO2 XDA GSM/GPRS Pocket PC
        00cf  SPV C500 Smart Phone
+       0306  Vive Hub Bluetooth 4.1 (Broadcom BCM920703)
        0a01  PocketPC Sync
        0a02  Himalaya GSM/GPRS Pocket PC
        0a03  PocketPC Sync
        0b2f  Rhodium
        0b51  Qtek 8310 mobile phone [Tornado Noble]
        0bce  Vario MDA
-       0c01  Dream / ADP1 / G1 / Magic / Tattoo
+       0c01  Dream / ADP1 / G1 / Magic / Tattoo / FP1
        0c02  Dream / ADP1 / G1 / Magic / Tattoo (Debug)
        0c03  Android Phone [Fairphone First Edition (FP1)]
        0c13  Diamond
        0c9e  Incredible
        0ca2  Desire HD (debug mode)
        0ca5  Android Phone [Evo Shift 4G]
+       0cab  Desire / Desire HD / Hero / Thunderbolt (HTC Sync Mode)
        0cae  T-Mobile MyTouch 4G Slide [Doubleshot]
        0de5  One (M7)
        0dea  M7_UL [HTC One]
        0f63  Desire 610 Via MTP
        0f64  Desire 601
        0fb4  Remote NDIS based Device
+       0ff0  One Mini (M4)
        0ff8  Desire HD (Tethering Mode)
        0ff9  Desire / Desire HD / Hero / Thunderbolt (Charge Mode)
        0ffe  Desire HD (modem mode)
        0fff  Android Fastboot Bootloader
-       2008  Android Phone via MTP [Wiko Cink Peax 2]
+       2008  Android Phone via MTP [MT65xx]
        200b  Android Phone via PTP [Wiko Cink Peax 2]
+       2134  Vive Hub (SMSC USB2137B)
+       2744  Vive Hub (HTC CB USB2)
+       2c87  Vive
 0bb5  Murata Manufacturing Co., Ltd
 0bb6  Network Alchemy
 0bb7  Joytech Computer Co., Ltd
        2200  FreeAgent Go FW
        2300  Expansion Portable
        231a  Expansion Portable
+       231c  Expansion Portable
        2320  USB 3.0 bridge [Portable Expansion Drive]
        2321  Expansion Portable
        2322  SRD0NF1 Expansion Portable (STEA)
        3008  FreeAgent Desk 1TB
        3101  FreeAgent XTreme 640GB
        3312  SRD00F2 Expansion Desktop Drive (STBV)
+       331a  Desktop HDD 5TB (ST5000DM000)
        3320  SRD00F2 [Expansion Desktop Drive]
        3322  SRD0NF2 [Expansion Desktop Drive]
+       3323  Seagate RSS LLC
        3332  Expansion
+       3343  desktop drive stgy8000400
        5020  FreeAgent GoFlex
        5021  FreeAgent GoFlex USB 2.0
        5030  FreeAgent GoFlex Upgrade Cable STAE104
        5121  FreeAgent GoFlex
        5161  FreeAgent GoFlex dock
        6126  Maxtor D3 Station 5TB
+       61b5  Maxtor HX-M201TCB [M3 Portable 2TB]
        61b6  Maxtor HX-M101TCB/GM [M3 Portable 1TB]
        61b7  Maxtor M3 Portable
        a003  Backup Plus
        a0a1  Backup Plus Desktop
        a0a4  Backup Plus Desktop Drive
+       aa14  STJ4000400 [Seagate Basic Portable Drive 4TB]
        ab00  Slim Portable Drive
        ab1e  Backup Plus Portable Drive
        ab20  Backup Plus Portable Drive
        ab21  Backup Plus Slim
        ab24  Backup Plus Portable Drive
        ab26  Backup Plus Slim Portable Drive 1 TB
+       ab28  Seagate Backup Plus Portable 5TB SRD00F1
+       ab2d  SRD00F1 [Backup Plus Ultra Slim]
        ab31  Backup Plus Desktop Drive (5TB)
        ab34  Backup Plus
-       ab38  Backup Plus Hub
+       ab38  Backup Plus Hub (Mass Storage)
+       ab44  Backup Plus Hub
+       ac20  Backup Plus Slim 2TB
 0bc3  IPWireless, Inc.
        0001  UMTS-TDD (TD-CDMA) modem
 0bc4  Microcube Corp.
        0186  Card Reader
        0301  multicard reader
        0307  Card Reader
+       0316  Card Reader
        0326  Card reader
+       0411  Hub
+       0811  Realtek 8812AU/8821AU 802.11ac WLAN Adapter [USB Wireless Dual-Band Adapter 2.4/5Ghz]
+       0821  RTL8821A Bluetooth
        1724  RTL8723AU 802.11n WLAN Adapter
+       1a2b  RTL8188GU 802.11n WLAN Adapter (Driver CDROM Mode)
        2831  RTL2831U DVB-T
        2832  RTL2832U DVB-T
        2838  RTL2838 DVB-T
        5401  RTL 8153 USB 3.0 hub with gigabit ethernet
+       5411  RTS5411 Hub
+       568c  Integrated Webcam HD
        570c  Asus laptop camera
        5730  HP 2.0MP High Definition Webcam
        5751  Integrated Webcam
        5775  HP "Truevision HD" laptop camera
+       5776  HP Truevision HD integrated webcam
        57b3  Acer 640 × 480 laptop camera
+       57cc  HD Webcam - Realtek Semiconductor
+       57cf  HD WebCam
        57da  Built-In Video Camera
+       58c2  Integrated Webcam HD
        58c8  Integrated Webcam HD
        8150  RTL8150 Fast Ethernet Adapter
        8151  RTL8151 Adapteon Business Mobile Networks BV
        8197  RTL8187B Wireless Adapter
        8198  RTL8187B Wireless Adapter
        8199  RTL8187SU 802.11g WLAN Adapter
+       8723  RTL8723A Bluetooth
        8812  RTL8812AU 802.11a/b/g/n/ac 2T2R DB WLAN Adapter
        8813  RTL8814AU 802.11a/b/g/n/ac Wireless Adapter
+       881a  RTL8812AU-VS 802.11a/b/g/n/ac 2T2R DB WLAN Adapter
+       8821  RTL8821A Bluetooth
+       9210  RTL9210 M.2 NVME Adapter
        a811  RTL8811AU 802.11a/b/g/n/ac WLAN Adapter
+       b009  Realtek Bluetooth 4.2 Adapter
+       b00a  Realtek Bluetooth 4.2 Adapter
+       b00b  Realtek Bluetooth 4.2 Adapter
+       b023  RTL8822BE Bluetooth 4.2 Adapter
+       b711  RTL8188GU 802.11n WLAN Adapter (After Modeswitch)
+       b720  RTL8723BU 802.11b/g/n WLAN Adapter
+       b723  RTL8723B Bluetooth
+       b728  RTL8723B Bluetooth
+       b72a  RTL8723B Bluetooth
+       b812  RTL88x2bu [AC1200 Techkey]
 0bdb  Ericsson Business Mobile Networks BV
        1000  BV Bluetooth Device
        1002  Bluetooth Device 1.2
        1909  F3307 v2 Mobile Broadband Module
        190a  F3307 Mobile Broadband Module
        190b  C3607w v2 Mobile Broadband Module
-       1926  H5321 gw Mobile Broadband Driver
+       1926  H5321 gw Mobile Broadband Module
 0bdc  Y Media Corp.
 0bdd  Orange PCS
 0be2  Kanda Tsushin Kogyo Co., Ltd
 0bee  LTK Industries, Ltd
 0bef  Way2Call Communications
 0bf0  Pace Micro Technology PLC
+       c010  EHD100SD
 0bf1  Intracom S.A.
        0001  netMod Driver Ver 2.4.17 (CAPI)
        0002  netMod Driver Ver 2.4 (CAPI)
        100f  miniCard D2301 802.11bg Wireless Module [SiS 163U]
        1017  Keyboard KB SCR
        101f  Fujitsu Full HD Pro Webcam
+0bfb  Grass Valley Group
+       0200  TURBO iDDR Front Panel
 0bfd  Kvaser AB
        0004  USBcan II
        000b  Leaf Light HS
 0c09  Comjet Information System
        a5a5  Litto Version USB2.0
 0c0a  Highpoint Technologies, Inc.
+       6124  RocketStor 6124V
 0c0b  Dura Micro, Inc. (Acomdata)
        27cb  6-in-1 Flash Reader and Writer
        27d7  Multi Memory reader/writer MD-005
        b001  USB 2.0 Mass Storage IDE adapter
        b004  MMC/SD Reader and Writer
 0c12  Zeroplus
-       0005  PSX Vibration Feedback Converter
+       0005  PSX Vibration Feedback Converter / Intec Wireless Controller for Xbox
        0030  PSX Vibration Feedback Converter
        700e  Logic Analyzer (LAP-C-16032)
-       8801  Xbox Controller
+       8801  Nyko Xbox Controller
        8802  Xbox Controller
        8809  Red Octane Ignition Xbox DDR Pad
        880a  Pelican Eclipse PL-2023
 0c1a  Silicon Motion, Inc.
 0c1b  MIPS Technologies
 0c1c  Hang Zhou Silan Electronics Co., Ltd
+0c1f  Magicard
+       1800  Tango 2E
 0c22  Tally Printer Corp.
 0c23  Lernout + Hauspie
 0c24  Taiyo Yuden
        0310  Scream Cam
 0c26  Prolific Technology Inc.
        0018  USB-Serial Controller [Icom Inc. OPC-478UC]
+       002b  Icom Inc. IC-R30
 0c27  RFIDeas, Inc
+       232a  pcProx Plus RFID Reader (CDC serial)
        3bfa  pcProx Card Reader
 0c2e  Metrologic Instruments
        0007  Metrologic MS7120 Barcode Scanner (IBM SurePOS mode)
        0206  Metrologic MS4980 Barcode Scanner
        0700  Metrologic MS7120 Barcode Scanner (uni-directional serial mode)
        0720  Metrologic MS7120 Barcode Scanner (bi-directional serial mode)
+       0a64  [Stratos 2700]
        0b61  Vuquest 3310g
        0b6a  Vuquest 3310 Area-Imaging Scanner
        0b81  Barcode scanner Voyager 1400g Series
        1067  Mass Storage Reader
        1158  A56AK
        184c  VoIP Phone
+       1a90  2M pixel Microscope Camera (with capture button) [Andonstar V160]
+       5101  2.4G Wireless Device [Rii MX3]
        6001  Genius VideoCAM NB
        6005  Sweex Mini Webcam
        6007  VideoCAM Eye
        62e0  MSI Starcam Racer
        6300  PC Microscope camera
        6310  Sonix USB 2.0 Camera
+       6321  HP Integrated Webcam
        6340  Camera
        6341  Defender G-Lens 2577 HD720p Camera
+       6366  Webcam Vitade AF
        63e0  Sonix Integrated Webcam
        63f1  Integrated Webcam
        63f8  Sonix Integrated Webcam
        644d  1.3 MPixel Integrated Webcam
        6480  Sonix 1.3 MP Laptop Integrated Webcam
        648b  Integrated Webcam
+       64ad  Dell Laptop Integrated Webcam HD
        64bd  Sony Visual Communication Camera
        64d0  Integrated Webcam
        64d2  Integrated Webcam
        651b  HP Webcam
+       652f  Backlit Gaming Keyboard
        6705  Integrated HD Webcam
+       670c  Integrated Webcam HD
        6710  Integrated Webcam
+       6712  Integrated Webcam HD
+       671d  Integrated_Webcam_HD
        7401  TEMPer Temperature Sensor
        7402  TEMPerHUM Temperature & Humidity Sensor
        7403  Foot Switch
        1600  Ion Quick Play LP turntable
        1605  SSS Headphone Set
        1607  audio controller
+       5663  Audio Device
 0c77  Sipix Group, Ltd
        1001  SiPix Web2
        1002  SiPix SC2100
 0c99  Innochips Co., Ltd
 0c9a  Hanwool Robotics Corp.
 0c9b  Jobin Yvon, Inc.
+0c9c  Brand Innovators BV
+       1511  BI-1511 Laser Simulator
+       1512  BI-1512 Syncbus Monitor
+       1514  BI-1514 HPC
+       1532  BI-1532 GPC
 0c9d  SemTek
        0170  3873 Manual Insert card reader
 0ca2  Zyfer
        2010  myPad110 PC/SC Smart Card Reader
        3050  EZ710 Smart Card Reader
 0ca7  Information Systems Laboratories
+0caa  Allied Telesis KK.
+       3001  AT-VT-Kit3 Serial Adapter
 0cad  Motorola CGISS
        1007  APX Series Consolette
        1020  MOTOTRBO Series Radio (Portable)
        1030  APX Series Radio (Portable)
        1031  APX Series Radio (Mobile)
        1602  IMPRES Battery Data Reader
-       9001  PowerPad Pocket PC Device
+       9001  PowerPad Pocket PC Device
 0cae  Ascom Business Systems, Ltd
 0caf  Buslink
        2507  Hi-Speed USB-to-IDE Bridge Controller
        00a5  Cinergy Hybrid Stick
        00a9  RTL2838 DVB-T COFDM Demodulator [TerraTec Cinergy T Stick Black]
        00b3  NOXON DAB/DAB+ Stick
+       00b9  WDR DAB/DAB+ Stick
        00e0  NOXON DAB/DAB+ Stick V2
        0102  Cinergy S2 Stick
        0105  Cinergy S2 Box
        10a7  TerraTec G3
+       10ad   Cinergy H5 Rev. 2
 0cd4  Bang Olufsen
        0101  BeolinkPC2
 0cd5  LabJack Corporation
        0004  AR5523 (no firmware)
        0005  AR5523
        0006  AR5523 (no firmware)
+       0036  AR9462 Bluetooth
        1001  Thomson TG121N [Atheros AR9001U-(2)NG]
        1002  TP-Link TL-WN821N v2 / TL-WN822N v1 802.11n [Atheros AR9170]
        1006  TP-Link TL-WN322G v3 / TL-WN422G v2 802.11g [Atheros AR9271]
        3005  AR3011 Bluetooth
        3007  AR3012 Bluetooth 4.0 (no firmware)
        3008  Bluetooth (AR3011)
+       311d  Bluetooth
        311f  AR3012 Bluetooth
        7015  TP-Link TL-WN821N v3 / TL-WN822N v2 802.11n [Atheros AR7010+AR9287]
        9170  AR9170 802.11n
        9271  AR9271 802.11n
+       9378  QCA9377-7
        b002  Ubiquiti WiFiStation 802.11n [Atheros AR9271]
        b003  Ubiquiti WiFiStationEXT 802.11n [Atheros AR9271]
        e006  Dell Wireless 1802 Bluetooth 4.0 LE
+       e300  QCA61x4 Bluetooth 4.0
 0cf4  Fomtex Corp.
 0cf5  Cellink Co., Ltd
 0cf6  Compucable Corp.
        0001  PhotoShuttle
        0002  Photo Printer 730 series
        0004  Photo Printer 63xPL/PS
+       0007  P510K
+       0009  P72x Series
+       000a  P728L
+       000b  P510L
+       000d  P518A
        000e  P910L
+       0010  M610
        0100  Photo Printer 63xPL/PS
        0102  Photo Printer 64xPS
        0103  Photo Printer 730 series
        0104  Photo Printer 63xPL/PS
        0105  Photo Printer 64xPS
+       010e  P510S
+       0110  P110S
+       0111  P510Si
+       0112  P518S
        0200  Photo Printer 64xDL
+       0309  CS-200e
+       030a  CS-220e
+       0501  P75x Series
+       0502  P52x Series
+       0503  P310L
+       050a  P310W
+       050f  P530D
+       0800  X610
 0d17  NALTEC, Inc.
 0d18  coaXmedia
 0d19  Hank Connection Industrial Co., Ltd
 0d28  NXP
        0204  ARM mbed
+0d2f  Andamiro
+       0002  Pump It Up Pad
 0d32  Leo Hui Electric Wire & Cable Co., Ltd
 0d33  AirSpeak, Inc.
 0d34  Rearden Steel Technologies
        0100  Audio
 0d49  Maxtor
        3000  Drive
+       3005  Personal Storage 3000LS
        3010  3000LE Drive
        3100  Hi-Speed USB-IDE Bridge Controller
        3200  Personal Storage 3200
 0d4f  EADS Airbus France
 0d50  Cleware GmbH
        0011  USB-Temp2 Thermometer
+       0030  Multiplexer
        0040  F4 foot switch
 0d51  Volex (Asia) Pte., Ltd
 0d53  HMI Co., Ltd
 0d55  ASKA Technologies, Inc.
 0d56  AVLAB Technology, Inc.
 0d57  Solomon Microtech, Ltd
+0d59  TRC Simulators b.v.
+       02a8  Digital Clock
 0d5c  SMC Networks, Inc.
        a001  SMC2662W (v1) EZ Connect 802.11b Wireless Adapter [Atmel AT76C503A]
        a002  SMC2662W v2 / SMC2662W-AR / Belkin F5D6050 [Atmel at76c503a]
        2026  TECOM Bluetooth Device
        2050  Mouse
        2106  Dell L20U Multimedia Keyboard
+       910e  HP Business Slim Keyboard
        a100  Optical Mouse
 0d63  Fritz Gegauf AG
 0d64  DXG Technology Corp.
        0001  Audio Device
        0002  Composite Device
        0003  Sound Device
+       0004  CM6631A Audio Processor
        0005  Blue Snowball
        0006  Storm HP-USB500 5.1 Headset
        000c  Audio Adapter
 0da3  Nippon Electro-Sensory Devices Corp.
 0da4  Polar Electro Oy
        0001  Interface
+       0003  FlowLink
        0008  Loop
 0da7  IOGear, Inc.
 0da8  softDSP Co., Ltd
        a97a  Bluetooth EDR Device
        b970  Bluetooth EDR Device
        b97a  Bluetooth EDR Device
+       ffff  Bluetooth Adapter in DFU mode
 0db1  Wen Te Electronics Co., Ltd
 0db2  Shian Hwi Plug Parts, Plastic Factory
 0db3  Tekram Technology Co., Ltd
        013a  Barcode Module - Virtual Keyboard
        013b  Barcode Module - HID
        0160  NFC and Smartcard Module (NSM)
+       0164  NFC and Smartcard Module (NSM)with 4 SAM slots
 0db7  ELCON Systemtechnik
        0002  Goldpfeil P-LAN
 0dba  Digidesign
        0101  Hi-Speed Mass Storage Device
        0209  SK-3500 S2
        020a  Oyen Digital MiniPro 2.5" hard drive enclosure
+       0290  Mass Storage Device [NT2 U3.1]
 0dc5  SDK Co., Ltd
 0dc6  Precision Squared Technology Corp.
        2301  Wireless Touchpad Keyboard
        0003  Mass Storage (P)
 0dd3  MediaQ
 0dd4  Custom Engineering SPA
+       0237  K80 80mm Thermal Printer
 0dd5  California Micro Devices
 0dd7  Kocom Co., Ltd
 0dd8  Netac Technology Co., Ltd
+       0562  Netac Portable SSD Z6s
        1060  USB-CF-Card
        e007  OnlyDisk U222 Pendrive
-       f607  OnlyDisk U208 1G flash drive [U-SAFE]
+       f607  OnlyDisk U210 1G flash drive [U-SAFE]
 0dd9  HighSpeed Surfing
 0dda  Integrated Circuit Solution, Inc.
        0001  Multi-Card Reader 6in1
 0dfa  Toyo Communication Equipment Co., Ltd
 0dfc  GeneralTouch Technology Co., Ltd
        0001  Touchscreen
+       0003  MultiTouch TouchScreen(Dualtouch)
        0101  5-point Touch Screen
+       d107  MultiTouch TouchScreen
 0e03  Nippon Systemware Co., Ltd
 0e08  Winbest Technology Co., Ltd
 0e0b  Amigo Technology Inc.
        0004  Virtual CCID
        0005  Virtual Mass Storage
        0006  Virtual Keyboard
+       000a  Virtual Sensors
        8001  Root Hub
        8002  Root Hub
        8003  Root Hub
 0e17  Walex Electronic, Ltd
 0e1a  Unisys
 0e1b  Crewave
+0e1e  Green Hills Software
 0e20  Pegasus Technologies Ltd.
        0101  NoteTaker
        0200  Seiko Instruments InkLink Handwriting System
 0e4a  Shenzhen Bao Hing Electric Wire & Cable Mfr. Co.
 0e4c  Radica Games, Ltd
        1097  Gamester Controller
-       2390  Games Jtech Controller
+       1103  Gamester Reflex
+       2390  Jtech Controller
+       3510  Gamester for Xbox
        7288  funkey reader
 0e50  TechnoData Interware
        0001  Matrix USB-Key
        0002  Wrist PDA
 0e6a  Megawin Technology Co., Ltd
        0101  MA100 [USB-UART Bridge IC]
+       02c0  Defender Gaming Keyboard
        030b  Truly Ergonomic Computer Keyboard (Device Firmware Update mode)
        030c  Truly Ergonomic Computer Keyboard
        6001  GEMBIRD Flexible keyboard KB-109F-B-DE
        0003  Freebird wireless Controller
        0005  Eclipse wireless Controller
        0006  Edge wireless Controller
+       0008  After Glow Pro Controller
+       0105  Disney's High School Musical 3 Dance Pad for Xbox 360
+       0113  Afterglow AX.1 Gamepad
+       011f  Rock Candy Wired Controller for Xbox 360
        0128  Wireless PS3 Controller
+       0131  PDP EA Sports Controller
+       0133  Wired Controller
+       0139  Afterglow Prismatic Wired Controller for Xbox One
+       013a  PDP Xbox One Controller
+       0146  Rock Candy Wired Controller for Xbox One
+       0147  PDP Marvel Controller for Xbox One
+       015c  PDP Arcade Stick for Xbox One
+       0161  Camo Wired Controller for Xbox One
+       0162  Xbox One Wired Controller
+       0163  Legendary Collection Deliverer of Truth
+       0164  Battlefield 1 Wired Controller for Xbox One
+       0165  Titanfall 2 Wired Controller for Xbox One
+       0201  Pelican PL-3601
+       0213  Afterglow Gamepad for Xbox 360
+       021f  Rock Candy Gamepad for Xbox 360
+       0246  Rock Candy Gamepad for Xbox One
+       0301  Controller
+       0346  Rock Candy Wired Controller for Xbox One
+       0401  Controller
+       0413  Afterglow AX.1 Gamepad for Xbox 360
+       0501  Wired Controller
+       f501  Hi-TEC Essentials Wired Gamepad
+       f900  Afterglow AX.1
 0e70  Tokyo Electronic Industry Co., Ltd
 0e72  Hsi-Chin Electronics Co., Ltd
 0e75  TVS Electronics, Ltd
 0e83  Shin An Wire & Cable Co.
 0e8c  Well Force Electronic Co., Ltd
 0e8d  MediaTek Inc.
+       0002  phone (mass storage mode) [Doro Primo 413]
        0003  MT6227 phone
        0004  MT6227 phone
-       0023  S103
+       0023  S103 / Powertel M6200
        00a5  GSM modem [Medion Surfstick Model:S4222]
        1806  Samsung SE-208 Slim Portable DVD Writer
        1836  Samsung SE-S084 Super WriteMaster Slim External DVD writer
+       1887  Slim Portable DVD Writer
        1956  Samsung SE-506 Portable BluRay Disc Writer
        2000  MT65xx Preloader
+       2008  Cyrus Technology CS 24
        3329  Qstarz BT-Q1000XT
+       7612  MT7612U 802.11a/b/g/n/ac Wireless Adapter
        763e  MT7630e Bluetooth Adapter
+       7668  MT7668 2x2 Dual Band Dual Concurrent 802.11a/b/g/n/ac WiFi with MU-MIMO and Bluetooth 5.0 Radios
 0e8f  GreenAsia Inc.
        0003  MaxFire Blaze2
        0012  Joystick/Gamepad
        0021  Multimedia Keyboard Controller
        0022  multimedia keyboard controller
        0201  SmartJoy Frag Xpad/PS2 adaptor
+       3008  Xbox Controller
        300a  steering Wheel
 0e90  WiebeTech, LLC
        0100  Storage Adapter V1
        2126  7-in-1 Card Reader
        2153  SD Card Reader Key
        2168  Transcend JetFlash 2.0 / Astone USB Drive / Intellegent Stick 2.0
+       2213  WinDroid N287 AH7N2502.013317
        6803  OTI-6803 Flash Disk
        6808  OTI-6808 Flash Disk
        6828  OTI-6828 Flash Disk
 0eb7  Endor AG
 0eb8  Mettler Toledo
        2200  Ariva Scale
-       f000  PS60 Scale
+       f000  BC60 Scale
 0ebb  Thermo Fisher Scientific
        0002  FT-IR Spectrometer
 0ebe  VWeb Corp.
 0eee  Digital Stream Technology, Inc.
        8810  Mass Storage Drive
 0eef  D-WAV Scientific Co., Ltd
-       0001  eGalax TouchScreen
+       0001  Titan6001 Surface Acoustic Wave Touchscreen Controller [eGalax]
        0002  Touchscreen Controller(Professional)
        7200  Touchscreen Controller
+       7904  Multitouch Capacitive Touchscreen eGalaxTouch EXC7904-21v00_T13 [IIyama Prolite T1932-MSC]
        a802  eGalaxTouch EXC7920
+       b10e  eGalaxTouch EXC3000
+       c000  Multitouch Capacitive Touchscreen eGalaxTouch EXC3188-4643-08.00.00.00 Sirius_4643 PCAP3188UR Series [IIyama Prolite PLT1932MSC]
 0ef0  Hitachi Cable, Ltd
 0ef1  Aichi Micro Intelligent Corp.
 0ef2  I/O Magic Corp.
 0f08  CSL Wire & Plug (Shen Zhen) Co.
 0f0c  CAS Corp.
 0f0d  Hori Co., Ltd
+       000a  Dead or Alive 4 FightStick for Xbox 360
+       000c  Horipad EX Turbo for Xbox 360
+       000d  Fighting Stick EX2 for Xbox 360
        0011  Real Arcade Pro 3
+       0016  Real Arcade Pro.EX for Xbox 360
+       001b  Real Aracde Pro.VX
+       0063  Real Arcade Pro Hayabusa for Xbox One
+       0067  Horipad One
+       0078  Real Arcade Pro V Kai for Xbox One / Xbox 360
+       0090  Horipad Ultimate
+       00c1  HORIPAD for Nintendo Switch
 0f0e  Energy Full Corp.
 0f0f  Silego Technology Inc
        0006  GreenPak Universal Dev Board (Active Mode)
 0f2f  Priva Design Services
 0f30  Jess Technology Co., Ltd
        001c  PS3 Guitar Controller Dongle
+       010b  Philips Recoil
        0110  Dual Analog Rumble Pad
        0111  Colour Rumble Pad
+       0202  Joytech Advanced Controller
        0208  Xbox & PC Gamepad
+       8888  BigBen XBMiniPad Controller
 0f31  Chrysalis Development
 0f32  YFC-BonEagle Electric Co., Ltd
 0f37  Kokuyo Co., Ltd
 0f38  Nien-Yi Industrial Corp.
 0f39  TG3 Electronics
+       0404  Recreated ZX Spectrum Keyboard
        0876  Keyboard [87 Francium Pro]
        1086  DK2108SZ Keyboard [Ducky Zero]
 0f3d  Airprime, Incorporated
        ef12  Patriot
        ff11  Liberty (firmware not loaded)
        ff12  Liberty
+0f49  Evolis SA
+       0a00  Zenius
 0f4b  St. John Technology Co., Ltd
 0f4c  WorldWide Cable Opto Corp.
 0f4d  Microtune, Inc.
        8007  Blackberry Handheld
        8010  Blackberry Playbook (Connect to Windows mode)
        8011  Blackberry Playbook (Connect to Mac mode)
+       8014  Blackberry Handheld Z30
        8020  Blackberry Playbook (CD-Rom mode)
        8037  Blackberry PRIV
 0fce  Sony Ericsson Mobile Communications AB
        01a7  D5503
        01ba  D6603 [Xperia Z3]
        01bb  D5803 [Xperia Z3 Compact] (MTP mode)
-       0dde  Xperia Mini Pro Bootloader
+       01e0  F5122 [Xperia X dual] (MTP mode)
+       01e8  F5321 [Xperia X Compact] (MTP mode)
+       01f9  H8314 [Xperia XZ2 Compact]
        1010  WMC Modem
        10af  V640i Phone [PictBridge]
        10d4  C902 Phone [PictBridge]
        5177  Xperia Ion [Debug Mode]
        518c  C1605 [Xperia E dual] MTD mode
        51a7  D5503 (Xperia Z1 Compact)
+       51e0  F5122 [Xperia X dual] (developer mode)
        614f  Xperia X12 (debug mode)
        6166  Xperia Mini Pro
        618c  C1605 [Xperia E dual] MSC mode
        715a  Xperia Pro [Tethering]
        7166  Xperia Mini Pro (Tethering mode)
        7177  Xperia Ion [Tethering]
+       71f4  G8441 (Xperia XZ1 Compact) [Tethering]
+       71f9  H8314 [Xperia XZ2 Compact] (Tethering)
        8004  9000 Phone [Mass Storage]
+       81f4  G8441 (Xperia XZ1 Compact) [Tethering]
        adde  C2005 (Xperia M dual) in service mode
+       c1e0  F5122 [Xperia X dual] (MIDI mode)
+       c1e8  F5321 [Xperia X Compact] (MIDI mode)
+       c1f9  H8314 [Xperia XZ2 Compact] (MIDI)
        d008  V800-Vodafone 802SE Phone
        d016  K750i Phone
        d017  K608i Phone
        d046  K610i Phone
        d065  W960i Phone (PC Suite)
        d076  W910i (Phone mode)
+       d079  K530 Phone
        d089  W580i Phone (mass storage)
        d0a1  K810
        d0af  V640i Phone
        002c  EyeTV DTT Deluxe v2
        0033  Video Capture
        0037  Video Capture v2
+       0060  Stream Deck
+       0063  Stream Deck Mini
+       006c  Stream Deck XL
+       006d  Stream Deck original V2
 0fda  Quantec Networks GmbH
        0100  quanton flight control
 0fdc  Micro Plus
 0fde  Oregon Scientific
        ca01  WMRS200 weather station
        ca05  CM160
+       ca08  WMR300 Professional Weather System
 0fe0  Osterhout Design Group
        0100  Bluetooth Mouse
        0101  Bluetooth IMU
 0ff7  CHI SHING Computer Accessories Co., Ltd
 0ffc  Clavia DMI AB
        0021  Nord Stage 2
+       002a  Nord Piano 4
 0ffd  EarlySense
        ff00  OEM
 0fff  Aopen, Inc.
 1003  Sigma Corp.
        0003  SD14
        0100  SD9/SD10
+       8781  Dock UD-01
 1004  LG Electronics, Inc.
        1fae  U8120 3G Cellphone
        6000  Various Mobile Phones
        61fe  Optimus Android Phone [USB tethering mode]
        627f  G3 (VS985) Android Phone (MTP/Download mode)
        6300  G2/Optimus Android Phone [Charge mode]
-       631c  G2/Optimus Android Phone [MTP mode]
+       631c  LM-X420xxx/G2/Optimus Android Phone (charge mode)
        631d  Optimus Android Phone (Camera/PTP Mode)
-       631e  G2/Optimus Android Phone [Camera/PTP mode]
+       631e  LM-X420xxx/G2/Optimus Android Phone (PTP/camera mode)
        631f  Optimus Android Phone (Charge Mode)
        633a  Ultimate 2 Android Phone L41C
-       633e  G2/G3 Android Phone [MTP/PTP/Download mode]
-       6344  G2 Android Phone [tethering mode]
+       633e  LM-X420xxx/G2/G3 Android Phone (MTP/download mode)
+       6344  LM-X420xxx/G2 Android Phone (USB tethering mode)
+       6348  LM-X420xxx Android Phone (MIDI mode)
        6356  Optimus Android Phone [Virtual CD mode]
        6800  CDMA Modem
        7000  LG LDP-7024D(LD)USB
        1004  MP3 Player
        1006  MP3 Player
        b113  Handy Steno/AH123 / Handy Steno 2.0/HT203
+       b155  Disk Module
        b223  CD-RW + 6in1 Card Reader Digital Storage / Converter
 1006  iRiver, Ltd.
        3001  iHP-100
 1015  Softronics Pty., Ltd
 1016  Xiamen Hung's Enterprise Co., Ltd
 1017  Speedy Industrial Supplies, Pte., Ltd
+       9015  M625 [Vendor: DELUX]
 1019  Elitegroup Computer Systems (ECS)
        0c55  Flash Reader, Desknote UCR-61S2B
        0f38  Infrared Receiver
 1020  Labtec
        0006  Wireless Keyboard
        000a  Wireless Optical Mouse
-       0106  Wireless Optical Mouse
+       0106  Wireless Optical Mouse/Keyboard
 1022  Shinko Shoji Co., Ltd
 1025  Hyper-Paltek
        005e  USB DVB-T device
 102c  Etoms Electronics Corp.
        6151  Q-Cam Sangha CIF
        6251  Q-Cam VGA
+       ff0c  Joytech Wireless Advanced Controller
 102d  Winic Corp.
 1031  Comax Technology, Inc.
 1032  C-One Technology Corp.
        0068  3,5'' HDD case MD-231
 1038  SteelSeries ApS
        0100  Ideazon Zboard
+       1260  Arctis 7 wireless adapter
        1361  Ideazon Sensei
+       1410  SRW-S1 [Simraceway Steering Wheel]
+       1720  Mouse
 1039  devolo AG
        0824  1866 802.11bg [Texas Instruments TNETW1450]
        2140  dsl+ 1100 duo
 104c  AMCO TEC International, Inc.
 104d  Newport Corporation
        1003  Model-52 LED Light Source Power Supply and Driver
+       3001  ESP301 3 Axis Motion Controller
 104f  WB Electronics
        0001  Infinity Phoenix
        0002  Smartmouse
        0120  Yubikey Touch U2F Security Key
        0200  Gnubby U2F
        0211  Gnubby
-       0401  Yubikey 4 OTP
-       0402  Yubikey 4 U2F
-       0403  Yubikey 4 OTP+U2F
-       0404  Yubikey 4 CCID
-       0405  Yubikey 4 OTP+CCID
-       0406  Yubikey 4 U2F+CCID
-       0407  Yubikey 4 OTP+U2F+CCID
+       0401  Yubikey 4/5 OTP
+       0402  Yubikey 4/5 U2F
+       0403  Yubikey 4/5 OTP+U2F
+       0404  Yubikey 4/5 CCID
+       0405  Yubikey 4/5 OTP+CCID
+       0406  Yubikey 4/5 U2F+CCID
+       0407  Yubikey 4/5 OTP+U2F+CCID
        0410  Yubikey plus OTP+U2F
 1053  Immanuel Electronics Co., Ltd
 1054  BMS International Beheer N.V.
        1123  My Book 3.0 (WDBABP)
        1130  My Book Essential (WDBACW)
        1140  My Book Essential (WDBACW)
+       1170  My Book Essential 3TB (WDBACW0030HBK)
        1230  My Book (WDBFJK)
        1235  My Book (WDBFJK0040HBK)
        2599  My Passport Ultra (WD40NMZW)
        259d  My Passport Ultra (WDBBKD)
        259f  My Passport Ultra (WD10JMVW)
-       25a1  Elements / My Passport (WD20NMVW)
+       25a1  Elements / My Passport
        25a2  Elements 25A2
        25a3  Elements Desktop (WDBWLG)
+       25da  My Book (WDBFJK)
+       25e1  My Passport (WD20NMVW)
        25e2  My Passport (WD40NMZW)
+       25ee  My Book 25EE
+       25f3  My Passport SSD (WDBK3E)
+       25fa  easystore Portable 5TB (WDBKUZ0050)
+       25fb  easystore Desktop (WDBCKA)
+       2603  My Passport Game Storage for PS4 4TB (WDBZGE0040)
+       2624  easystore Portable 5TB (WDBKUZ0050)
+       2626  My Passport (WDBPKJ)
        30a0  SATA adapter cable
 1059  Giesecke & Devrient GmbH
        000b  StarSign Bio Token 3.0
 108b  Grand-tek Technology Co., Ltd
        0005  HID Keyboard/Mouse PS/2 Translator
 108c  Robert Bosch GmbH
+       017e  GTC 400 C
 108e  Lotes Co., Ltd.
 1091  Numerik Jena
        8101  Absoflex
 1099  Surface Optics Corp.
 109a  DATASOFT Systems GmbH
 109b  Hisense
+       9109  CROSSCALL Trekker-M1 Core (MTP-Mode)
        9118  Medion P4013 Mobile
+       9119  CROSSCALL Trekker-M1 Core (PTP-Mode)
+       f009  CROSSCALL Trekker-M1 Core (CD-ROM-Mode)
 109f  eSOL Co., Ltd
        3163  Trigem Mobile SmartDisplay84
        3164  Trigem Mobile SmartDisplay121
        0019  Shinko/Sinfonia CHC-S6145
        001d  Shinko/Sinfonia CHC-S6245
        001e  Ciaat Brava 21
+       0039  Sinfonia CHC-S2245
+       10ce  Sinfonia CHC-S2245
        ea6a  MobiData EDGE USB Modem
 10cf  Velleman Components, Inc.
        2011  R-Engine MPEG2 encoder/decoder
        0004  PS/2 Converter
        5552  KVM Human Interface Composite Device (Keyboard/Mouse ports)
        55a2  2Port KVMSwitcher
+       5a08  Dual Bay Docking Station
 10d6  Actions Semiconductor Co., Ltd
        0c02  BioniQ 1001 Tablet
        1000  MP3 Player
        1a2e  HP Truevision HD Integrated Webcam
 10f5  Turtle Beach
        0200  Audio Advantage Roadie
+       0231  Ear Force P11 Headset
+       10f5  EarForce PX21 Gaming Headset
+10f8  Cesys GmbH
+       3201  CeboLC
+       3202  CeboStick
+       3203  CeboMSA64
+       3204  CeboDFN
+       3205  PSAA2304W_CASC
+       c401  USBV4F unconfigured
+       c402  EFM01 unconfigured
+       c403  MISS2 unconfigured
+       c404  CID unconfigured
+       c405  USBS6 unconfigured
+       c406  OP_MISS2 unconfigured
+       c407  NanoUsb uncofigured
+       c481  USBV4F
+       c482  EFM01
+       c483  MISS2
+       c484  CID
+       c485  USBS6
+       c486  OP_MISS2
+       c487  NanoUsb
+       c501  EFM02 unconfigured
+       c502  EFM02/B unconfigured
+       c503  EFM03 unconfigured
+       c581  EFM02
+       c582  EFM02/B
+       c583  EFM03
 10fb  Pictos Technologies, Inc.
 10fd  Anubis Electronics, Ltd
        7e50  FlyCam Usb 100
        0001  FSK Electronics Super GSM Reader
 1108  Brightcom Technologies, Ltd
 110a  Moxa Technologies Co., Ltd.
+       1110  UPort 1110
+       1150  UPort 1150 1-Port RS-232/422/485
        1250  UPort 1250 2-Port RS-232/422/485
        1251  UPort 1250I 2-Port RS-232/422/485 with Isolation
        1410  UPort 1410 4-Port RS-232
 1130  Tenx Technology, Inc.
        0001  BlyncLight
        0002  iBuddy
+       0004  iBuddy Twins
        0202  Rocket Launcher
        6604  MCE IR-Receiver
+       6606  U+P Mouse
        660c  Foot Pedal/Thermometer
        6626  Key
        6806  Keychain photo frame
        9008  Gobi 2000 Wireless Modem
        9009  Gobi 2000 Wireless Modem
        900a  Gobi 2000 Wireless Modem
+       9011  MC8305 Modem
        9013  Sierra Wireless Gobi 3000 Modem device (MC8355)
+       9041  EM7305 Modem
        9055  Gobi 9x15 Multimode 3G/4G LTE Modem (NAT mode)
        9057  Gobi 9x15 Multimode 3G/4G LTE Modem (IP passthrough mode)
+       9071  AirPrime MC7455 3G/4G LTE Modem
+       9079  EM7455
 119a  ZHAN QI Technology Co., Ltd
 119b  ruwido austria GmbH
        0400  Infrared Keyboard V2.01
        6565  FuelBand
 11b0  ATECH FLASH TECHNOLOGY
        6208  PRO-28U
+       6298  Kingston SNA-DC/U
 11be  R&D International NV
        f0a0  Martin Maxxyz DMX
 11c0  Betop
        5506  Gamepad
 11c5  Inmax
        0521  IMT-0521 Smartcard Reader
+11c9  Nacon
+       55f0  GC-100XF
 11ca  VeriFone Inc
+       0201  MX870/MX880
        0207  PIN Pad VX 810
        0220  PIN Pad VX 805
 11db  Topfield Co., Ltd.
        0140  TTP-245C
 1209  Generic
        0001  pid.codes Test PID
+       0002  pid.codes Test PID
+       0003  pid.codes Test PID
+       0004  pid.codes Test PID
+       0005  pid.codes Test PID
+       0006  pid.codes Test PID
+       0007  pid.codes Test PID
+       0008  pid.codes Test PID
+       0009  pid.codes Test PID
+       000a  pid.codes Test PID
+       000b  pid.codes Test PID
+       000c  pid.codes Test PID
+       000d  pid.codes Test PID
+       000e  pid.codes Test PID
+       000f  pid.codes Test PID
+       0010  pid.codes Test PID
        01c0  Input Club Kiibohd Device
        01cb  Input Club Kiibohd Device Bootloader
        0256  Schwalm & Tate LLC pISO Raspberry Pi Hat
        2016  Cupkee
        2017  Benjamin Shockley Mini SAM
        2020  Captain Credible Gate Crystal
-       2048  Housedillon.com MRF49XA Transciever
+       2048  Housedillon.com MRF49XA Transceiver
        2100  TinyFPGA B1 and B2 Boards
        2101  TinyFPGA A-Series Programmer
        2200  Dygma Shortcut Bootloader
        317e  Codecrete Wirekite
        3210  OSH Lab, LLC Magic Keys
        3333  LabConnect Digitalnetzteil
+       345b  kinX Hub
+       345c  kinX Keyboard Controller
        3690  Kigakudoh TouchMIDI32
        4096  CynaraKrewe Cynara
        414c  Adi Linden
        5038  frotz.net mdebug rswd protocol
        5039  frotz.net lpcboot protocol
        5050  trebb ISO50
+       5070  SoloHacker security key [SoloKey]
+       50b0  boot for security key [SoloKey]
        5222  telavivmakers attami
        53c0  SatoshiLabs TREZOR Bootloader
        53c1  SatoshiLabs TREZOR
        7551  The Tessel Project Tessel 2
        7777  circuitvalley IO Board V3
        7778  circuitvalley IO Board V3 Bootloader
+       7950  PIC18F87J94 Bootloader [GenII]
+       7951  PIC18F87J94 Application [GenII]
+       7952  PIC18F87J94 Bootloader [GenIII/IV]
+       7953  PIC18F87J94 Application [GenIII/IV]
+       7954  PIC18F87J94 Application [GenIII/IV]
        7bd0  pokey9000 Tiny Bit Dingus
        8000  Autonomii NODii 2
        8086  MisfitTech Nano Zero Bootloader
        dead  chaosfield.at AVR-Ruler
        deaf  CrapLab 4chord MIDI
        ded1  ManCave Made Quark One
+       deed  Kroneum Time Tracker
        df00  D.F.Mac. @TripArts Music mi:muz:tuch
        df01  D.F.Mac. @TripArts Music mi:muz:can
        df02  D.F.Mac. @TripArts Music mi:muz:can-lite
        524e  RoadMate 1475T
        5260  Triton Handheld GPS Receiver (300/400/500/1500/2000)
 1210  DigiTech
+       000d  RP250 Guitar Multi-Effects Processor
        0016  RP500 Guitar Multi-Effects Processor
        001b  RP155 Guitar Multi-Effects Processor
        001c  RP255 Guitar Multi-Effects Processor
 121e  Jungsoft Co., Ltd
        3403  Muzio JM250 Audio Player
+121f  Panini S.p.A.
+       0001  VisionX without Firmware
+       0002  VisionX with Firmware
+       0010  I-Deal
+       0020  wI-Deal
+       0021  VisionX Page Scanner Extension
+       0030  VisionNext
+       0040  mI:Deal Check Scanner
+       0041  EverNext Check Scanner
 1220  TC Electronic
        000a  Hall of Fame Reverb
        002a  Polytune
        0039  Alter Ego X4 Vintage Echo
 1221  Unknown manufacturer
        3234  Disk (Thumb drive)
+1222  TiPro
+       faca  programmable keyboard
 1223  SKYCABLE ENTERPRISE. CO., LTD.
 1228  Datapaq Limited
        0012  Q18 Data Logger
        0019  Impulse 25
        001a  Impulse 49
        001b  Impulse 61
+       0032  Launchkey 61
+       0069  Launchpad MK2
+       0102  LaunchKey Mini MK3
        4661  ReMOTE25
        8000  Scarlett 18i6
        8002  Scarlett 8i6
        8012  Scarlett 6i6
        8014  Scarlett 18i8
        8016  Focusrite Scarlett 2i2
+       8202  Focusrite Scarlett 2i2 2nd Gen
        8203  Focusrite Scarlett 6i6
        8204  Scarlett 18i8 2nd Gen
+       8210  Scarlett 2i2 Camera
+       8211  Scarlett Solo (3rd Gen.)
+       8214  Scarlett 18i8 3rd Gen
+       8215  Scarlett 18i20 3rd Gen
 1241  Belkin
        0504  Wireless Trackball Keyboard
        1111  Mouse
        1503  Keyboard
        1603  Keyboard
        f767  Keyboard
+1243  Holtek Semiconductor, Inc.
+       e000  Unique NFC/RFID reader (keyboard emulation)
 124a  AirVast
        168b  PRISM3 WLAN Adapter
        4017  PC-Chips 802.11b Adapter
        3200  Stealth MXP 1GB
 125c  Apogee Inc.
        0010  Alta series CCD
+125d  JMicron
+       0580  JM580
 125f  A-DATA Technology Co., Ltd.
        312a  Superior S102
        312b  Superior S102 Pro
        a15a  DashDrive Durable HD710 portable HDD various size
        a22a  DashDrive Elite HE720 500GB
+       a31a  HV620 Portable HDD
        a91a  Portable HDD CH91
        c08a  C008 Flash Drive
        c81a  Flash drive
 1275  Xaxero Marine Software Engineering, Ltd.
        0002  WeatherFax 2000 Demodulator
        0080  SkyEye Weather Satellite Receiver
+       0090  WeatherFax 2000 Demodulator
 1278  Starlight Xpress
        0105  SXV-M5
        0107  SXV-M7
        2001  88W8388 802.11a/b/g WLAN
        2006  88W8362 802.11n WLAN
        203c  K30326 802.11bgn Wireless Module [Marvell 88W8786U]
+       204c  Bluetooth and Wireless LAN Composite
        8001  BLOB boot loader firmware
 1291  Qualcomm Flarion Technologies, Inc. / Leadtek Research, Inc.
        0010  FDM 2xxx Flash-OFDM modem
        1828  Gigaset USB Adapter 300
 12a7  Trendchip Technologies Corp.
 12ab  Honey Bee Electronic International Ltd.
+       0004  Dance Pad for Xbox 360
+       0301  Afterglow Wired Controller for Xbox 360
+       0303  Mortal Kombat Klassic FightStick for Xbox 360
+       8809  Dance Dance Revolution Dance Pad
 12b8  Zhejiang Xinya Electronic Technology Co., Ltd.
 12b9  E28
 12ba  Licensed by Sony Computer Entertainment America
        1037  Ideos
        1038  Ideos (debug mode)
        1039  Ideos (tethering mode)
-       1052  MT7-L09
+       1052  MT7-L09 / P7-L10 / Y330-U01
+       1053  P7-L10 (PTP)
+       1054  P7-L10 (PTP + debug)
+       1079  GEM-703LT [Honor/MediaPad X2]
+       107e  P10 smartphone
        1404  EM770W miniPCI WCDMA Modem
        1406  E1750
        140b  EC1260 Wireless Data Modem HSD USB Card
        14cf  K3772
        14d1  K3770 3G Modem (Mass Storage Mode)
        14db  E353/E3131
-       14dc  E33372 LTE/UMTS/GSM HiLink Modem/Networkcard
+       14dc  E3372 LTE/UMTS/GSM HiLink Modem/Networkcard
        14f1  Gobi 3000 HSPA+ Modem
        14fe  Modem (Mass Storage Mode)
        1501  Pulse
        1520  K3765 HSPA
        1521  K4505 HSPA+
        155a  R205 Mobile WiFi (CD-ROM mode)
+       1573  ME909u-521 mPCIe LTE/GPS card
        1575  K5150 LTE modem
        15bb  ME936 LTE/HSDPA+ 4G modem
        15c1  ME906s LTE M.2 Module
        1d50  ET302s TD-SCDMA/TD-HSDPA Mobile Broadband
        1f01  E353/E3131 (Mass storage mode)
        1f16  K5150 LTE modem (Mass Storage Mode)
+       360e  Y330-U01 (MTP Mode)
        380b  WiMAX USB modem(s)
 12d2  LINE TECH INDUSTRIAL CO., LTD.
+12d3  LINAK
+       0002  DeskLine CBD Control Box
 12d6  EMS Dr. Thomas Wuensche
        0444  CPC-USB/ARM7
        0888  CPC-USB/M16C
        1001  AWU2000b 802.11b Stick
 12ff  Fascinating Electronics, Inc.
        0101  Advanced RC Servo Controller
+1306  FM20 Barcode Scanner
 1307  Transcend Information, Inc.
        0163  256MB/512MB/1GB Flash Drive
        0165  2GB/4GB/8GB Flash Drive
        0111  SP1 Spectrometer (VISA)
        0112  SP2 Spectrometer (VISA)
        8001  TXP-Series Slot (TXP5001, TXP5004)
+       8011  BP1 Slit Beam Profiler
        8012  BC106 Camera Beam Profiler
        8013  WFS10 Wavefront Sensor
+       8016  DMP40 Deformable Mirror
        8017  BC206 Camera Beam Profiler
        8019  BP2 Multi Slit Beam Profiler
        8020  PM300 Optical Power Meter
        8021  PM300E Optical Power and Energy Meter
        8022  PM320E Optical Power and Energy Meter
+       8025  WFS20 Wavefront Sensor
        8030  ER100 Extinction Ratio Meter
+       8039  PAX1000 Rotating Waveplate Polarimeter
+       8047  CLD1000
+       8048  TED4000
+       8049  LDC4000
+       804a  ITC4000
+       8058  LC-100
+       8060  DC3100
+       8061  DC4100
+       8062  DC2100
+       8065  CS2010
+       8066  DC4104
        8070  PM100D
        8072  PM100USB Power and Energy Meter Interface
+       8073  PM106 Wireless Powermeter Photodiode Sensor
+       8074  PM160T Wireless Powermeter Thermal Sensor
+       8075  PM400 Handheld Optical Power/Energy Meter
+       8076  PM101 Serial PD Power Meter
        8078  PM100D Compact Power and Energy Meter Console
        8080  CCS100 - Compact Spectrometer
+       8081  CCS100 Compact Spectrometer
+       8083  CCS125 Spectrometer
+       8085  CCS150 UV Spectrometer
+       8087  CCS175 NIR Spectrometer
+       8089  CCS200 Wide Range Spectrometer
+       8090  SPCM Single Photon Counter
+       80a0  LC100 series smart line camera
+       80b0  PM200 Handheld Power and Energy Meter
+       80c0  DC2200
+       80c9  MTD Series
+       80f0  TSP01
+       80f1  M2SET Dongle
+       8180  OCT Probe Controller (OCTH-1300)
+       8181  OCT Device
 131d  Natural Point
        0155  TrackIR 3 Pro Head Tracker
        0156  TrackIR 4 Pro Head Tracker
        0158  TrackIR 5 Pro Head Tracker
 1325  ams AG
+       00d6  I2C/SPI InterfaceBoard
+       0c08  Embedded Linux Sensor Bridge
        4002  I2C Dongle
 132a  Envara Inc.
        1502  WiND 802.11abg / 802.11bg WLAN
        0003  CX / DNP DS40
        0004  CX-W / DNP DS80 / Mitsubishi CP3800
        0005  CY / DNP DSRX1
-       0006  CW-02
+       0006  CW-02 / OP900ii
        0007  DNP DS80DX
-       0008  CX2 / DNP DS620
+       0008  DNP DS620 (old)
+       000a  CX-02
+       000b  CX-02W
 1345  Sino Lite Technology Corp.
        001c  Xbox Controller Hub
        6006  Defender Wireless Controller
        0089  OpenSDA - CDC Serial Port
        0503  USB-ML-12 HCS08/HCS12 Multilink
        0504  DEMOJM
+       1000  Smart Control Touchpad
+135e  Insta GmbH
+       0021  Berker KNX Data Interface
+       0022  Gira KNX Data Interface
+       0023  JUNG KNX Data Interface
+       0024  Merten/Schneider Electric KNX Data Interface
+       0025  Hager KNX Data Interface
+       0026  Feller KNX Data Interface
 135f  Control Development Inc.
        0110  Linear Spectrograph
        0111  Spectrograph - Renumerated
        0240  MPP Spectrograph
 1366  SEGGER
        0101  J-Link PLUS
+       1015  J-Link
 136b  STEC
 136e  Andor Technology Ltd.
        0012  iXon Ultra CCD
        4000  HDVD800
 137b  SCAPS GmbH
        0002  SCAPS USC-2 Scanner Controller
+137c  YASKAWA ELECTRIC CORP.
+       0220  MP Series
+       0250  SIGMA Series
+       0401  AC Drive
 1385  Netgear, Inc
        4250  WG111T
        4251  WG111T (no firmware)
 138e  Jungo LTD
        9000  Raisonance S.A. STM32 ARM evaluation board / RLink dongle
 1390  TOMTOM B.V.
-       0001  GO 520 T/GO 630/ONE XL (v9)
+       0001  GO 520 T / GO 630 / ONE / ONE XL
        5454  Blue & Me 2
        7474  GPS Sport Watch [Runner, Multi-Sport]
        a001  Bandit Action Camera Batt-Stick
        1000  URTC-1000
 1395  Sennheiser Communications
        0025  Headset [PC 8]
+       0026  SC230
+       0027  SC260
+       0028  SC230 CTRL
+       0029  SC260 CTRL
+       002a  SC230 for Lync
+       002b  SC260 for Lync
+       002d  BTD-800
+       002e  Presence
+       0030  CEHS-CI 02
+       0031  U320 Gaming
+       0032  SC30 for Lync
+       0033  SC60 for Lync
+       0034  SC30 Control
+       0035  SC60 Control
+       0036  SC630 for Lync
+       0037  SC660 for Lync
+       0038  SC630 CTRL
+       0039  SC660 CTRL
+       003f  SP 20
+       0040  MB Pro 1/2
+       0041  SP 20 for Lync
+       0042  SP 10
+       0043  SP 10 for Lync
        0046  PXC 550
+       004a  MOMENTUM M2 OEBT
+       004b  MOMENTUM M2 AEBT
+       004f  SC230 for MS II
+       0050  SC260 for MS II
+       0051  USB-ED CC 01
+       0058  USB-ED CC 01 for MS
+       0059  SC40 for MS
+       005a  SC70 for MS
+       005b  SC40 CTRL
+       005c  SC70 CTRL
+       0060  SCx5 MS
+       0061  SCx5 CTRL
+       0064  MB 660 MS
+       0065  MB 660
+       0066  SP 20 D UC
+       0067  SP 20 D MS
+       006b  SC5x5 MS
+       0072  Headset
        3556  USB Headset
 1397  BEHRINGER International GmbH
+       0004  FCA1616
        00bc  BCF2000
 1398  Q-tec
        2103  USB 2.0 Storage Device
        3392  Azurewave 43228+20702
        3394  Bluetooth
        3474  Atheros AR3012 Bluetooth
+       3526  Bluetooth Radio
        5070  Webcam
        5111  Integrated Webcam
        5115  Integrated Webcam
        5126  PC Cam
        5130  Integrated Webcam
        5134  Integrated Webcam
+       5615  Lenovo EasyCamera
+       5670  HP TrueVision HD
+       5682  SunplusIT Integrated Camera
        5702  UVC VGA Webcam
        5710  UVC VGA Webcam
        5716  UVC VGA Webcam
+       5a07  VGA UVC WebCam
        7020  DTV-DVB UDST7020BDA DVB-S Box(DVBS for MCE2005)
        7022  DTV-DVB UDST7022BDA DVB-S Box(Without HID)
+       784b  XHC Camera
 13d7  Guidance Software, Inc.
        0001  T5 PATA forensic bridge
        000c  T8-R2 forensic bridge
        0001  Optical Mouse
        0003  Optical Mouse
 13fd  Initio Corporation
+       0550  INIC-1530 PATA Bridge
        0840  INIC-1618L SATA
        0841  Samsung SE-T084M DVD-RW
        0940  ASUS SBW-06D2X-U
        1840  INIC-1608 SATA bridge
        1e40  INIC-1610P SATA bridge
        2040  Samsung Writemaster external DVD writer
+       3920  INIC-3619PN SATA Bridge
        3940  external DVD burner ECD819-SU3
+       3960  INIC-3639
        3e40  ZALMAN ZM-VE350
 13fe  Kingston Technology Company Inc.
        1a00  512MB/1GB Flash Drive
        2240  microSD card reader
        3100  2/4 GB stick
        3123  Verbatim STORE N GO 4GB
+       3200  flash drive (2GB, EMTEC)
        3600  flash drive (4GB, EMTEC)
        3800  Rage XT Flash Drive
+       3d00  Flash Drive
        3e00  Flash Drive
        4100  Flash drive
+       4200  Platinum USB drive mini
        5000  USB flash drive (32 GB SHARKOON Accelerate)
        5100  Flash Drive
        5200  DataTraveler R3.0
+       5500  Flash drive
+       6300  SP Mobile C31 (64GB)
 1400  Axxion Group Corp.
 1402  Bowe Bell & Howell
 1403  Sitronix
        0001  Digital Photo Frame
        0003  Digital Photo Frame (DPF-1104)
+1404  Fundamental Software, Inc.
+       cddc  Dongle
 1409  IDS Imaging Development Systems GmbH
        1000  generic (firmware not loaded yet)
        1485  uEye UI1485
+       3240  uEye UI3240
 140e  Telechips, Inc.
        b011  TCC780X-based player (USB Boot mode)
        b021  TCC77X-based players (USB Boot mode)
 1430  RedOctane
        0150  wireless receiver for skylanders wii
        4734  Guitar Hero4 hub
+       4748  Guitar Hero X-plorer
        474b  Guitar Hero MIDI interface
+       8888  TX6500+ Dance Pad
+       f801  Controller
 1431  Pertech Resources, Inc.
 1435  Wistron NeWeb
        0427  UR054g 802.11g Wireless Adapter [Intersil ISL3887]
        0408  dedicated haptic device
 1452  Dai Nippon Printing, Inc
        8b01  DS620
+       9001  DS820
 1453  Radio Shack
        4026  26-183 Serial Cable
 1456  Extending Wire & Cable Co., Ltd.
        0161  15901 802.11bg Wireless Adapter [Realtek RTL8187L]
        0167  Widescreen 3MP Webcam
        0176  Isla Keyboard
+       019f  17676 Webcam
+       01e5  Keyboard [GXT 830]
+       0212  Panora Widescreen Graphic Tablet
+       023f  Mouse [GXT 168]
 1460  Tatung Co.
        9150  eHome Infrared Transceiver
 1461  Staccato Communications
 1462  Micro Star International
        5512  MegaStick-1 Flash Stick
        8807  DIGIVOX mini III [af9015]
+146b  BigBen Interactive
+       0601  Controller for Xbox 360
+       0902  Wired Mini PS3 Game Controller
 1472  Huawei-3Com
        0007  Aolynk WUB300g [ZyDAS ZD1211]
        0009  Aolynk WUB320g
 1498  Microtek International Inc.
        a090  DVB-T Tuner
 149a  Imagination Technologies
+       069b  PURE Digital Evoke-1XT Tri-band
        2107  DBX1 DSP core
 14aa  WideView Technology Inc.
        0001  Avermedia AverTV DVBT USB1.1 (cold)
 14ae  Printronix Inc.
 14af  ATP Electronics Inc.
 14b0  StarTech.com Ltd.
+       3410  Serial Adapter ICUSB2321X [TUSB3410I]
 14b2  Ralink Technology, Corp.
        3a93  Topcom 802.11bg Wireless Adapter [Atheros AR5523]
        3a95  Toshiba WUS-G06G-JT 802.11bg Wireless Adapter [Atheros AR5523]
        123a  SD/MMC/RS-MMC Card Reader
        125c  SD card reader
        127b  SDXC Reader
+       168a  Elecom Co., Ltd MR-K013 Multicard Reader
        6116  M6116 SATA Bridge
        6600  M110E PATA bridge
        6700  Card Reader
        ab11  GU-1000T
        ab13  GW-US54Mini 802.11bg
 14ed  Shure Inc.
+       1000  MV5
+       1002  MV51
+       1003  MVi
+       1004  SHA900
+       1005  KSE1500
+       1011  MV88+
+       1100  ANIUSB-MATRIX
+       1101  P300
        29b6  X2u Adapter
+       3000  RMCE-USB
 14f7  TechniSat Digital GmbH
        0001  SkyStar 2 HD CI
        0002  SkyStar 2 HD CI
        0500  DVB-PC TV Star HD
 1500  Ellisys
 1501  Pine-Tum Enterprise Co., Ltd.
+1504  Bixolon CO LTD
+       001f  SRP-350II Thermal Receipt Printer
 1509  First International Computer, Inc.
        0a01  LI-3100 Area Meter
        0a02  LI-7000 CO2/H2O Gas Analyzer
        0539  JMS539/567 SuperSpeed SATA II/III 3.0G/6.0G Bridge
        0551  JMS551 SuperSpeed two ports SATA 3Gb/s bridge
        0561  JMS551 - Sharkoon SATA QuickPort Duo
+       0562  JMS567 SATA 6Gb/s bridge
        0567  JMS567 SATA 6Gb/s bridge
-       0578  JMS567 SATA 6Gb/s bridge
+       0576  Gen1 SATA 6Gb/s Bridge
+       0578  JMS578 SATA 6Gb/s
+       0583  JMS583Gen 2 to PCIe Gen3x2 Bridge
        0770  Alienware Integrated Webcam
        1561  JMS561U two ports SATA 6Gb/s bridge
+       1576  External Disk 3.0
        2329  JM20329 SATA Bridge
        2335  ATA/ATAPI Bridge
        2336  Hard Disk Drive
        2590  JMS567 SATA 6Gb/s bridge
        3562  JMS567 SATA 6Gb/s bridge
        3569  JMS566 SATA 3Gb/s bridge
+       578e  JMS578 SATA 6Gb/s bridge
+       8561  salcar docking station two disks
 152e  LG (HLDS)
+       1640  INIC-1605 SATA Bridge
        2507  PL-2507 IDE Controller
+       2571  GP08NU6W DVD-RW
        e001  GSA-5120D DVD-RW
 1532  Razer USA, Ltd
        0001  RZ01-020300 Optical Mouse [Diamondback]
+       0002  Diamondback Optical Mouse
        0003  Krait Mouse
+       0005  Boomslang CE
        0007  DeathAdder Mouse
-       0013  Orochi mouse
+       0009  Gaming Mouse [Tempest Habu]
+       000a  Mamba (Wired)
+       000c  Lachesis
+       000d  DiamondBack 3G
+       000e  Megalodon
+       000f  Mamba (Wireless)
+       0012  Gaming Mouse [Salmosa]
+       0013  Orochi 2011
        0015  Naga Mouse
-       0016  DeathAdder Mouse
+       0016  DeathAdder 3.5G
        0017  RZ01-0035 Laser Gaming Mouse [Imperator]
+       0019  Marauder
+       001a  Spectre
+       001b  Gaming Headset
        001c  RZ01-0036 Optical Gaming Mouse [Abyssus]
-       0024  Mamba
-       002e  RZ01-0058 Gaming Mouse [Naga]
+       001e  Lachesis (5600 DPI)
+       001f  Naga Epic (Wired)
+       0020  Abyssus 1800
+       0021  Naga Epic Dock (Wireless, Bluetooth)
+       0022  Gaming Mouse [TRON]
+       0023  Gaming Keyboard [TRON]
+       0024  Mamba 2012 (Wired)
+       0025  Mamba 2012 (Wireless)
+       0029  DeathAdder Black Edition
+       002a  Gaming Mouse [Star Wars: The Old Republic]
+       002b  Gaming Keyboard [Star Wars: The Old Republic]
+       002c  Gaming Headset [Star Wars: The Old Republic]
+       002e  RZ01-0058 Gaming Mouse [Naga 2012]
        002f  Imperator 2012
-       0036  RZ01-0075, Gaming Mouse [Naga Hex]
+       0031  Gaming Mouse Dock [Star Wars: The Old Republic]
+       0032  Ouroboros 2012 (Wired)
+       0033  Ouroboros 2012 (Wireless)
+       0034  Taipan
+       0035  Krait 2013 Essential
+       0036  RZ01-0075, Gaming Mouse [Naga Hex (Red)]
+       0037  DeathAdder 2013
+       0038  DeathAdder 1800
+       0039  Orochi 2013
+       003e  Naga Epic Chroma (Wired)
+       003f  Naga Epic Chroma (Wireless)
+       0040  Naga 2014
+       0041  Naga Hex
        0042  Abyssus 2014
        0043  DeathAdder Chroma
        0044  Mamba Chroma (Wired)
        0045  Mamba Chroma (Wireless)
        0046  Mamba 2015 Tournament Edition [RZ01-01370100-R3]
-       0048  Orochi (Wired)
+       0048  Orochi 2015 (Wired)
+       004a  RZ03-0133 Gaming Lapboard, Keyboard Mouse Combo, Dongle [Turret Dongle]
+       004c  Diamondback Chroma
+       004d  DeathAdder 2000 (Cynosa Pro Bundle)
+       0050  Naga Hex V2
+       0053  Naga Chroma
+       0054  DeathAdder 3500
+       0056  Orochi 2015 (Wireless)
+       0059  RZ01-0212 Gaming Mouse [Lancehead (Wired)]
+       005a  RZ01-0212 Gaming Mouse [Lancehead (Wireless)]
+       005b  Abyssus V2
+       005c  DeathAdder Elite
+       005e  Abyssus 2000
+       005f  DeathAdder 2000
+       0060  RZ01-0213 Gaming Mouse [Lancehead Tournament Edition]
+       0062  Atheris
+       0064  Basilisk
+       0065  RZ01-0265, Gaming Mouse [Basilisk Essential]
+       0067  Naga Trinity
+       0068  Gaming Mouse Mat [Firefly Hyperflux]
+       0069  Gaming Mouse [Mamba Hyperflux]
+       006a  Abyssus Elite (D.Va Edition)
+       006b  Abyssus Essential
+       006c  Mamba Elite (Wired)
+       006e  DeathAdder Essential
+       006f  RZ01-0257 Gaming Mouse [Lancehead Wireless (2019, Wireless, Receiver)]
+       0070  RZ01-0257 Gaming Mouse [Lancehead Wireless (2019, Wired)]
+       0071  RZ01-0254 Gaming Mouse [DeathAdder Essential White Edition]
+       0072  Mamba 2018 (Wireless)
+       0073  Mamba 2018 (Wired)
+       0078  Viper (wired)
+       007a  RC30-0305 Gaming Mouse [Viper Ultimate (Wired)]
+       007b  RC30-0305 Gaming Mouse Dongle [Viper Ultimate (Wireless)]
+       007e  RC30-030502 Mouse Dock
+       0084  RZ01-0321 Gaming Mouse [DeathAdder V2]
+       0085  RZ01-0316 Gaming Mouse [Basilisk V2]
+       0088  Razer Basilisk Ultimate Dongle
        0101  Copperhead Mouse
        0102  Tarantula Keyboard
+       0103  Gaming Keyboard [Reclusa]
+       0105  Gaming Keyboard [ProType]
+       0106  Gaming Keyboard [ProType]
        0109  Lycosa Keyboard
+       010b  Gaming Keyboard [Arctosa]
        010d  BlackWidow Ultimate 2012
+       010e  BlackWidow Classic (Alternate)
+       010f  Anansi
+       0110  Cyclosa
+       0111  Nostromo
        0113  RZ07-0074 Gaming Keypad [Orbweaver]
-       0118  RZ03-0080, Gaming Keyboard [Deathstalker]
+       0114  DeathStalker Ultimate
+       0116  Blade Pro (2015)
+       0118  RZ03-0080, Gaming Keyboard [Deathstalker Essential]
+       0119  Gaming Keyboard [Lycosa]
        011a  BlackWidow Ultimate 2013
        011b  BlackWidow Classic
+       011c  BlackWidow Tournament Edition Stealth
+       011d  Blade 2013
+       011e  Gaming Keyboard Dock [Edge Keyboard Dock]
+       011f  Deathstalker Essential 2014
+       0200  Gaming Keyboard [Reclusa]
+       0201  Tartarus
+       0202  DeathStalker Expert
        0203  BlackWidow Chroma
+       0204  DeathStalker Chroma
        0205  Blade Stealth
-       0208  Tartarus
+       0207  Orbweaver Chroma keypad
+       0208  Tartarus Chroma
        0209  BlackWidow Tournament Edition Chroma
+       020d  Cynosa Pro keyboard (Cynosa Pro Bundle)
+       020f  Blade QHD
+       0210  Blade Pro (Late 2016)
+       0211  BlackWidow Chroma (Overwatch)
        0214  BlackWidow Ultimate 2016
+       0215  Core
        0216  BlackWidow X Chroma
+       0217  BlackWidow X Ultimate
        021a  BlackWidow X Tournament Edition Chroma
+       021b  Gaming Keyboard [BlackWidow X Tournament Edition]
+       021e  Ornata Chroma
+       021f  Ornata
        0220  Blade Stealth (2016)
+       0221  RZ03-0203 Gaming Keyboard [BlackWidow Chroma V2]
+       0224  Blade (Late 2016)
+       0225  Blade Pro (2017)
+       0226  Huntsman Elite
+       0227  Huntsman
+       0228  BlackWidow Elite
+       022a  Cynosa Chroma
+       022b  Tartarus V2
+       022c  Cynosa Chroma Pro
+       022d  Blade Stealth (Mid 2017)
+       022f  Blade Pro FullHD (2017)
+       0232  Blade Stealth (Late 2017)
+       0233  Blade 15 (2018)
+       0234  Blade Pro 17 (2019)
+       0235  BlackWidow Lite (2018)
+       0237  BlackWidow Essential
+       0239  Blade Stealth (2019)
+       023a  Blade 15 (2019) Advanced
+       023b  Blade 15 (2018) Base Model
+       023f  RZ03-0274 Gaming Keyboard [Cynosa Lite]
+       0240  Blade 15 (2018) Mercury
+       0241  BlackWidow (2019)
+       0243  Huntsman Tournament Edition
+       0244  RZ07-0311 Gaming Keypad [Tartarus Pro]
+       0245  Blade 15 (Mid 2019) Mercury
+       0246  Blade 15 (Mid 2019) Base Model
+       024a  Blade Stealth (Late 2019)
+       024b  Gaming Laptop [Blade 15 Advanced (Late 2019)]
+       024c  Gaming Laptop [Blade Pro (Late 2019)]
+       024d  Blade 15 Studio Edition (2019)
+       0253  RZ09-0330, Gaming Laptop [Blade 15 Advanced (Early 2020)]
+       0255  RZ09-0328, Gaming Laptop [Blade 15 Base Model (2020)]
        0300  RZ06-0063 Motion Sensing Controllers [Hydra]
-       0c00  Firefly
+       0401  Gaming Arcade Stick [Panthera]
+       0501  Kraken 7.1
+       0502  Gaming Headset [Kraken USB]
+       0504  Kraken 7.1 Chroma
+       0506  Kraken 7.1 (Alternate Version)
+       0510  Kraken 7.1 V2
+       0511  RZ19-0229 Gaming Microphone
+       0514  Electra V2 USB
+       0517  Nommo Chroma
+       0518  Nommo Pro
+       051a  Nari Ultimate
+       051c  Nari (Wireless)
+       051d  Nari (Wired)
+       0520  Kraken Tournament Edition
+       0521  Kraken Kitty Edition
+       0527  RZ04-0318 Gaming Headset [Kraken Ultimate]
+       0904  R201-0282 Gaming Keyboard, Mouse Combination [Turret For Xbox One]
+       0a00  Atrox Arcade Stick for Xbox One
+       0a02  ManO'War
+       0a03  Wildcat
+       0c00  RZ02-0135 Hard Gaming Mouse Mat [Firefly]
+       0c01  Goliathus
+       0c02  Goliathus Extended
+       0c04  Firefly V2
+       0e03  Gaming Webcam [Kiyo]
+       0f03  Tiamat 7.1 V2
+       0f07  Chroma Mug Holder
+       0f08  Base Station Chroma
+       0f09  Chroma HDK
+       0f0d  Laptop Stand Chroma
+       0f13  Lian Li O11 Dynamic Razer Edition
+       0f1a  Core X Chroma
+       1000  Gaming Controller [Raiju]
+       1004  Gaming Controller [Raiju Ultimate Wired]
+       1007  Gaming Controller [Raiju 2 Tournament Edition (USB)]
+       1008  Gaming Flightstick [Panthera Evo]
+       1009  Gaming Controller [Raiju 2 Ultimate Edition (BT)]
+       100a  Gaming Controller [Raiju 2 Tournament Edition (BT)]
+       110d  Bootloader (Alternate)
+       800e  Bootloader
 153b  TerraTec Electronic GmbH
        1181  Cinergy S2 PCIe Dual Port 1
        1182  Cinergy S2 PCIe Dual Port 2
 154a  Celectronic GmbH
        8180  CARD STAR/medic2
 154b  PNY
+       000f  Flash Drive
        0010  USB 2.0 Flash Drive
        0048  Flash Drive
        004d  8 GB Flash Drive
        005b  Flash Drive
        0062  Flash Drive
        007a  Classic Attache Flash Drive
+       5408  2.5in drive enclosure
+       6000  Flash Drive
        6545  FD Device
        fa05  Flash Drive
 154d  ConnectCounty Holdings Berhad
 15a2  Freescale Semiconductor, Inc.
        0038  9S08JS Bootloader
        003b  USB2CAN Application for ColdFire DEMOJM board
+       0041  i.MX51 SystemOnChip in RecoveryMode
        0042  OSBDM - Debug Port
+       004e  i.MX53 SystemOnChip in RecoveryMode
        004f  i.MX28 SystemOnChip in RecoveryMode
        0052  i.MX50 SystemOnChip in RecoveryMode
        0054  i.MX 6Dual/6Quad SystemOnChip in RecoveryMode
        0061  i.MX 6Solo/6DualLite SystemOnChip in RecoveryMode
+       006a  Vybrid series SystemOnChip in RecoveryMode
+       0076  i.MX 7Solo/7Dual SystemOnChip in RecoveryMode
+       0080  i.MX 6ULL SystemOnChip in RecoveryMode
 15a4  Afatech Technologies, Inc.
        1000  AF9015/AF9035 DVB-T stick
        1001  AF9015/AF9035 DVB-T stick
        0004  OpenOCD JTAG TINY
        002a  ARM-USB-TINY-H JTAG interface
        002b  ARM-USB-OCD-H JTAG+RS232
+       003c  TERES Keyboard+Touchpad
 15c0  XL Imaging
        0001  2M pixel Microscope Camera
        0002  3M pixel Microscope Camera
        0a41  MI-2540D [Optical mouse]
        0a4c  USB+PS/2 Optical Mouse
        0a4d  Optical Mouse
+       0a4e  AM-5400 [Optical Mouse]
        0a4f  Optical Mouse
 15dc  Hynix Semiconductor Inc.
 15e0  Seong Ji Industrial Co., Ltd.
        2007  RSA SecurID (R) Authenticator
 15e4  Numark
        0024  Mixtrack
+       003c  DJ2GO2 Touch
        0140  ION VCR 2 PC / Video 2 PC
+       3f00  Power A Mini Pro Elite
+       3f0a  Airflo Wired Controller for Xbox 360
+       3f10  Batarang controller for Xbox 360
 15e8  SohoWare
        9100  NUB100 Ethernet [pegasus]
        9110  10/100 USB Ethernet
 15f4  HanfTek
        0001  HanfTek UMT-010 USB2.0 DVB-T (cold)
        0025  HanfTek UMT-010 USB2.0 DVB-T (warm)
+       0131  Astrometa DVB-T/T2/C FM & DAB receiver [RTL2832P]
        0135  Astrometa T2hybrid
 1604  Tascam
+       10c0  Dell Integrated Hub
        8000  US-428 Audio/Midi Controller (without fw)
        8001  US-428 Audio/Midi Controller
        8004  US-224 Audio/Midi Controller (without fw)
 1631  Good Way Technology
        6200  GWUSB2E
        c019  RT2573
+1633  AIM GmbH
+       4510  ASC1553
+       4520  ASC429
+       4560  ASC-FDX
 1645  Entrega [hex]
        0001  1S Serial Port
        0002  2S Serial Port
 1679  Total Phase
        2001  Beagle Protocol Analyzer
        2002  Cheetah SPI Host Adapter
+167b  Pure Digital Technologies, Inc.
+       2009  Flip Ultra U1120
 1680  Golden Bridge Electech Inc.
        a332  DVB-T Dongle [RTL2832U]
 1681  Prevo Technologies, Inc.
 1685  Delock
        0200  Infrared adapter
 1686  ZOOM Corporation
-       0045  H4 Digital Recorder
+       0045  Handy Recorder stereo mix
+       01c0  Zoom Handy Recorder card reader
+       01c5  Zoom Handy Recorder multi track
+       03d5  LiveTrak L-12
 1687  Kingmax Digital Inc.
        5289  FlashDisk
        6211  FlashDisk
 1688  Saab AB
 1689  Razer USA, Ltd
        fd00  Onza Tournament Edition controller
+       fd01  Onza Classic Edition
+       fe00  Sabertooth Elite
 168c  Atheros Communications
        0001  AR5523
        0002  AR5523 (no firmware)
        0486  Teensyduino RawHID
        0487  Teensyduino Serial+Keyboard+Mouse+Joystick
        0488  Teensyduino Flight Sim Controls
+       05b5  BU0836
        05dc  shared ID for use with libusb
        05dd  BlackcatUSB2
+       05de  Flashcat
        05df  HID device except mice, keyboards, and joysticks
        05e1  Free shared USB VID/PID pair for CDC devices
        05e4  Free shared USB VID/PID pair for MIDI devices
        08cb  Alpermann+Velte Studio Clock
        08cc  Alpermann+Velte SAM7S MT Boot Loader
        08cd  Alpermann+Velte SAM7X MT Boot Loader
+       09ce  LINKUSB
        0a32  jbmedia Light-Manager Pro
        27d8  libusb-bound devices
        27d9  HID device except mice, keyboards, and joysticks
        0504  RETRO Innovations ZoomFloppy
        054b  GrauTec ReelBox OLED Display (external)
        05be  EasyLogic Board
+       05f0  Superior Freedom Programmable IR Remote
        06cc  Trinamic TMCM-3110
+       06f0  Axium AX-R4C Controller
+       06f1  Axium AX-R1D Controller
        06f9  Gabotronics Xminilab
+       0726  Autonomic M400 Amplifier
+       0727  Autonomic M800 Amplifier
        0753  Digistump DigiSpark
        075c  AB-1.x UAC1 [Audio Widget]
        075d  AB-1.x UAC2 [Audio Widget]
+       07cc  Xylanta Ltd, Saint3 Device
+       07f8  Axium AX-R4D Controller
        080a  S2E1 Interface
+       0830  DMXControl Projects e.V., Nodle U1
+       0831  DMXControl Projects e.V., Desklamp
+       0832  DMXControl Projects e.V., Nodle U2
+       0833  DMXControl Projects e.V., Nodle R4S
        0870  Kaufmann Automotive GmbH, RKS+CAN Interface
+       09f2  Axium AX-1250 Amplifier
+       09f4  Axium AX-Mini4 Amplifier
        0b03  AIS Receiver [dAISy]
+       0b7d  Autonomic M801 Amplifier
+       0b7e  Autonomic M401 Amplifier
+       0b7f  Autonomic M120e Amplifier
        0bd4  codesrc SCSI2SD
+       0c9b  Fermium LABS srl/LabTrek srl Hall Effect Apparatus
+       0d3c  InputStick BT4.0
+       0e1e  AtomMiner
 16d1  Suprema Inc.
        0401  SUP-SFR400(A) BioMini Fingerprint Reader
 16d3  Frontline Test Equipment, Inc.
        0015  CML Control, Measurement and Data Logging System
 16de  Telemecanique
 16df  King Billion Electronics Co., Ltd.
-16f0  GN ReSound A/S
+16f0  GN Hearing A/S
        0001  Speedlink Programming Interface
        0003  Airlink Wireless Programming Interface
+       0004  Accessory Programming Interface
 16f5  Futurelogic Inc.
+1702  FDI-MATELEC
+       0002  Encodeur
 1706  BlueView Technologies, Inc.
 1707  ARTIMI
 170b  Swissonic
 1733  Cellink Technology Co., Ltd
        0101  RF Wireless Optical Mouse OP-701
 1736  CANON IMAGING SYSTEM TECHNOLOGIES INC.
-1737  Linksys
+1737  802.11g Adapter [Linksys WUSB54GC v3]
        0039  USB1000 Gigabit Notebook Adapter
        0070  WUSB100 v1 RangePlus Wireless Network Adapter [Ralink RT2870]
        0071  WUSB600N v1 Dual-Band Wireless-N Network Adapter [Ralink RT2870]
        0101  Packet-Master USB12
 174c  ASMedia Technology Inc.
        07d1  Transcend ESD400 Portable SSD (USB 3.0)
+       1151  ASM1151W
        1153  ASM1153 SATA 3Gb/s bridge
        2074  ASM1074 High-Speed hub
        3074  ASM1074 SuperSpeed hub
        5106  ASM1051 SATA 3Gb/s bridge
        5136  ASM1053 SATA 3Gb/s bridge
        51d6  ASM1051W SATA 3Gb/s bridge
-       55aa  Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge
+       55aa  ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge
 174f  Syntek
        1105  SM-MS/Pro-MMC-XD Card Reader
        110b  HP Webcam
+       1122  HP Webcam
+       1169  Lenovo EasyCamera
        1403  Integrated Webcam
        1404  USB Camera device, 1.3 MPixel Web Cam
+       1758  XYZ printing cameraR2
+       1759  XYZ printing cameraL2
        5212  USB 2.0 UVC PC Camera
        5a11  PC Camera
        5a31  Sonix USB 2.0 Camera
 1759  LucidPort Technology, Inc.
 1761  ASUSTek Computer, Inc. (wrong ID)
        0b05  802.11n Network Adapter (wrong ID - swapped vendor and device)
+1770  MSI
+       ff00  steel series rgb keyboard
 1772  System Level Solutions, Inc.
 1776  Arowana
        501c  300K CMOS Camera
+1777  Microscan Systems, Inc.
+       0003  MicroHAWK ID-20
 177f  Sweex
        0004  MM004V5 Photo Key Chain (Digital Photo Frame) 1.5"
        0153  LW153 802.11n Adapter [ralink rt3070]
        0154  LW154 802.11bgn (1x1:1) Wireless Adapter [Realtek RTL8188SU]
        0313  LW313 802.11n Adapter [ralink rt2770 + rt2720]
 1781  Multiple Vendors
+       07df  Axium AX-800DAV Amplifier
+       07e1  Axium AX-KPC Keypad
+       07e2  Axium AX-KPD Keypad
+       07e3  Axium AX-400DA Amplifier
        083e  MetaGeek Wi-Spy
        083f  MetaGeek Wi-Spy 2.4x
        0938  Iguanaworks USB IR Transceiver
+       0941  qNimble Quark
        0a96  raphnet.net usb_game12
        0a97  raphnet.net SNES mouse adapter
        0a98  raphnet.net USBTenki
        0a9d  raphnet.net 4nes4snes
        0a9e  raphnet.net Megadrive multitap
        0a9f  raphnet.net MultiDB9joy
+       0bad  Mantracourt Load Cell
        0c30  Telldus TellStick
        0c31  Telldus TellStick Duo
        0c9f  USBtiny
        1eef  OpenAPC SecuKey
        1ef0  E1701 Modular Controller Card
        1ef1  E1701 Modular Controller Card
+       1ef2  E1803 Compact Controller Card
 1782  Spreadtrum Communications Inc.
+       3d00  F200n mobile phone
 1784  TopSeed Technology Corp.
        0001  eHome Infrared Transceiver
        0004  RF Combo Device
        0011  eHome Infrared Transceiver
 1787  ATI AIB
 1788  ShenZhen Litkconn Technology Co., Ltd.
+178e  ASUSTek Computer, Inc. (wrong ID)
+       0b05  CrossLink cable 2GB (wrong ID - swapped vendor and device)
 1796  Printrex, Inc.
 1797  JALCO CO., LTD.
 1799  Thales Norway A/S
        0100  C03U multi-pattern microphone
        0101  UB1 boundary microphone
        0120  Meteorite condenser microphone
+       0130  Go Mic Direct
+       0132  Go Mic Mobile wireless receiver
        0200  StudioDock monitors (internal hub)
        0201  StudioDock monitors (audio)
        0210  StudioGT monitors
+       0211  StudioGT monitors [CM6400]
+       0240  Go Mic Connect
+       0241  G-Track Pro microphone
        0301  Q2U handheld microphone with XLR
        0302  GoMic compact condenser microphone
        0303  C01U Pro condenser microphone
        0304  Q2U handheld mic with XLR
        0305  GoMic compact condenser mic
        0310  Meteor condenser microphone
+       0311  Satellite condenser microphone
+       1616  RXD1 wireless receiver
+       b241  G-Track Pro firmware update
+       b311  Satellite firmware update
 17a4  Concept2
        0001  Performance Monitor 3
        0002  Performance Monitor 4
 17a8  Kamstrup A/S
        0001  Optical Eye/3-wire
        0005  M-Bus Master MultiPort 250D
+       0010  444MHz Radio Mesh Frontend
+       0011  444MHz RF sniffer
+       0012  870MHz Radio Mesh Frontend
+       0013  870MHz RF sniffer
 17b3  Grey Innovation
        0004  Linux-USB Midi Gadget
 17b5  Lunatone
 17c3  Singim International Corp.
 17cc  Native Instruments
        041c  Audio 2 DJ
+       041d  Traktor Audio 2
        0808  Maschine Controller
        0815  Audio Kontrol 1
        0839  Audio 4 DJ
        0d8d  Guitarrig Mobile
+       1001  Komplete Audio 6
+       1110  Maschine Mikro
        1915  Session I/O
        1940  RigKontrol3
        1969  RigKontrol2
 17d3  Korea Techtron Co., Ltd.
 17e9  DisplayLink
        0051  USB VGA Adaptor
+       0198  DisplayLink
+       019e  Overfly FY-1016A
+       028f  HIS Multi-View II
        030b  HP T100
        0377  Plugable UD-160-A (M)
        0378  Plugable UGA-2K-A
        037d  Plugable USB2-HDMI-165
        410a  HDMI Adapter
        430a  HP Port Replicator (Composite Device)
+       430f  Kensington Dock (Composite Device)
        4312  S2340T
+       436e  Dell D3100 Docking Station
+       ff10  I1659FWUX {AOC Powered Monitor]
 17eb  Cornice, Inc.
 17ef  Lenovo
-       1000  Hub
+       1000  ThinkPad X6 UltraBase
        1003  Integrated Smart Card Reader
        1004  Integrated Webcam
+       1005  ThinkPad X200 Ultrabase (42X4963 )
        1008  Hub
        100a  ThinkPad Mini Dock Plus Series 3
+       100f  ThinkPad Ultra Dock Hub
+       1010  ThinkPad Ultra Dock Hub
+       1020  ThinkPad Dock Hub
+       1021  ThinkPad Dock Hub [Cypress HX2VL]
+       3049  ThinkPad OneLink integrated audio
        304b  AX88179 Gigabit Ethernet [ThinkPad OneLink GigaLAN]
+       304f  RTL8153 Gigabit Ethernet [ThinkPad OneLink Pro Dock]
+       3060  ThinkPad Dock
+       3062  ThinkPad Dock Ethernet [Realtek RTL8153B]
+       3063  ThinkPad Dock Audio
+       3066  ThinkPad Thunderbolt 3 Dock MCU
+       3069  ThinkPad TBT3 LAN
+       306a  ThinkPad Thunderbolt 3 Dock Audio
        3815  ChipsBnk 2GB USB Stick
-       4802  Lenovo Vc0323+MI1310_SOC Camera
+       4802  Vc0323+MI1310_SOC Camera
        4807  UVC Camera
        480c  Integrated Webcam
        480d  Integrated Webcam [R5U877]
        6004  ISD-V4 Tablet Pen
        6007  Smartcard Keyboard
        6009  ThinkPad Keyboard with TrackPoint
+       600e  Optical Mouse
        6014  Mini Wireless Keyboard N5901
+       6019  M-U0025-O Mouse
+       6022  Ultraslim Plus Wireless Keyboard and Mouse
        6025  ThinkPad Travel Mouse
+       602d  Black Silk Keyboard
+       6032  Wireless Dongle for Keyboard and Mouse
+       6044  ThinkPad Laser Mouse
+       6047  ThinkPad Compact Keyboard with TrackPoint
+       604b  Precision Wireless Mouse
+       608d  Optical Mouse
+       609b  Professional Wireless Keyboard and Mouse Combo
+       609c  Professional Wireless Keyboard
        7203  Ethernet adapter [U2L 100P-Y1]
+       7205  Thinkpad LAN
+       7217  VGA adapter
        7423  IdeaPad A1 Tablet
        7435  A789 (Mass Storage mode, with debug)
        743a  A789 (Mass Storage mode)
        7498  A789 (MTP mode, with debug)
        749a  A789 (PTP mode)
        749b  A789 (PTP mode, with debug)
+       7604  A760 (Mass Storage mode)
+       7605  A760 (Mass Storage mode, with debug)
+       760a  A760 (MTP mode)
+       760b  A760 (MTP mode, with debug)
+       760c  A760 (PTP mode)
+       760d  A760 (PTP mode, with debug)
+       76fc  B8000-H (Yoga Tablet 10) (mass storage)
+       76fd  B8000-H (Yoga Tablet 10) (debug , mass storage)
+       76fe  B8000-H (Yoga Tablet 10) (MTP)
+       76ff  B8000-H (Yoga Tablet 10) (debug , MTP)
+       7702  B8000-H (Yoga Tablet 10) (PTP)
+       7703  B8000-H (Yoga Tablet 10) (debug , PTP)
+       7704  B8000-H (Yoga Tablet 10) (USB tether)
+       7705  B8000-H (Yoga Tablet 10) (debug , USB tether)
+       7706  B8000-H (Yoga Tablet 10) (zerocd)
+       7707  B8000-H (Yoga Tablet 10) (debug , zerocd)
+       785f  TAB 2 A7-10 Tablet
+       b000  Virtual Keyboard and Mouse
+       b001  Ethernet
+       b003  Virtual Keyboard and Mouse / Mass Storage
+       f003  MEDION LIFETAB X10605 MTP mode
 17f4  WaveSense
        aaaa  Jazz Blood Glucose Meter
 17f5  K.K. Rocky
-17f6  Unicomp, Inc
+17f6  Unicomp, Inc.
        0709  Model M Keyboard
+       0822  Ruffian 6 Keyboard v3 [Model M]
 1809  Advantech
        4604  USB-4604
        4761  USB-4761 Portable Data Acquisition Module
        0010  VoiceKey
 1843  Vaisala
 1849  ASRock Incorporation
+184f  K2L GmbH
+       0012  MOCCA compact
 1852  GYROCOM C&C Co., LTD
+       7022  Fiio E10
+       7921  Audiotrak ProDigy CUBE
        7922  Audiotrak DR.DAC2 DX [GYROCOM C&C]
 1854  Memory Devices Ltd.
 185b  Compro
        ee93  EasyLogger
 187c  Alienware Corporation
        0511  AlienFX Mobile lighting
+       0513  Gaming Desktop [Aurora R4]
+       0550  LED controller
        0600  Dual Compatible Game Pad
 187f  Siano Mobile Silicon
        0010  Stallar Board
        022b  Portable Hard Drive (Store'n'Go)
        0237  Portable Harddrive
        0243  Flash Drive (Store'n'Go)
+       0245  Store'n'Stay
        0302  Flash Drive
        0304  Store 'n' Go
+       0408  Store 'n' Go
        4123  Store N Go
 18b1  Petalynx
        0037  Maxter Remote Control
        0006  Onda V972 MTP
        0008  Onda V972 PTP (camera)
        0d02  Celkon A88
-       2d00  Android-powered device in accessory mode
-       2d01  Android-powered device in accessory mode with ADB support
+       2d00  Android Open Accessory device (accessory)
+       2d01  Android Open Accessory device (accessory + ADB)
+       2d02  Android Open Accessory device (audio)
+       2d03  Android Open Accessory device (audio + ADB)
+       2d04  Android Open Accessory device (accessory + audio)
+       2d05  Android Open Accessory device (accessory + audio + ADB)
        4e11  Nexus One
        4e12  Nexus One (debug)
        4e13  Nexus One (tether)
        4e42  Nexus 7 (debug)
        4e43  Nexus 7 (PTP)
        4e44  Nexus 7 2012 (PTP)
-       4ee0  Nexus 4 (bootloader)
-       4ee1  Nexus Device (MTP)
-       4ee2  Nexus Device (debug)
-       4ee3  Nexus 4/5/7/10 (tether)
-       4ee4  Nexus 4/5/7/10 (debug + tether)
-       4ee5  Nexus 4 (PTP)
-       4ee6  Nexus 4/5 (PTP + debug)
+       4ee0  Nexus/Pixel Device (fastboot)
+       4ee1  Nexus/Pixel Device (MTP)
+       4ee2  Nexus/Pixel Device (MTP + debug)
+       4ee3  Nexus/Pixel Device (tether)
+       4ee4  Nexus/Pixel Device (tether+ debug)
+       4ee5  Nexus/Pixel Device (PTP)
+       4ee6  Nexus/Pixel Device (PTP + debug)
+       4ee7  Nexus/Pixel Device (charging + debug)
+       4ee8  Nexus/Pixel Device (MIDI)
+       4ee9  Nexus/Pixel Device (MIDI + debug)
+       5033  Pixel earbuds
        7102  Toshiba Thrive tablet
        b004  Pandigital / B&N Novel 9" tablet
        d001  Nexus 4 (fastboot)
        d002  Nexus 4 (debug)
+       d00d  Xiaomi Mi/Redmi 2 (fastboot)
        d109  LG G2x MTP
        d10a  LG G2x MTP (debug)
 18d5  Starline International Group Limited
        3188  ARK3188 UVC Webcam
        3299  Webcam Carrefour
        3366  Bresser Biolux NV
+       5850  CVBS / S-Video Capture Device [UVC]
+18ef  ELV Elektronik AG
+       e014  FS20PCE
+       e015  FS20PCS
+       e01a  Bedien-Anzeige-Terminal
 18f8  [Maxxter]
+       0f97  Optical Gaming Mouse [Xtrem]
        0f99  Optical gaming mouse
+       1142  Optical gaming mouse
+       1486  X5s ZEUS Macro Pro Gaming Mouse
 18fb  Scriptel Corporation
        01c0  ST1501-STN
        01c1  ST1526-STN
 1901  GE Healthcare
        0015  Nemo Tracker
 1908  GEMBIRD
-       1320  PhotoFrame PF-15-1
+       0102  Digital Photo Frame
+       0226  MicroSD Card Reader/Writer
+       1315  Digital Photo Frame
+       1320  DM8261 Flashdisc
+       2070  Honk HK-5002 USB Speaker
+       2220  Buildwin Media-Player
+       2311  Generic UVC 1.00 camera [AppoTech AX2311]
 190d  Motorola GSG
 1914  Alco Digital Devices Limited
 1915  Nordic Semiconductor ASA
        000c  Wireless Desktop nRF24L01 CX-1766
+       0101  HP Prime Wireless Kit [FOK65AA] (Flash mode)
        2233  Linksys WUSB11 v2.8 802.11b Adapter [Atmel AT76C505]
        2234  Linksys WUSB54G v1 OEM 802.11g Adapter [Intersil ISL3886]
        2235  Linksys WUSB54GP v1 OEM 802.11g Adapter [Intersil ISL3886]
        2236  Linksys WUSB11 v3.0 802.11b Adapter [Intersil PRISM 3]
+       7777  Bitcraze Crazyradio (PA) dongle
 191c  Innovative Technology LTD
        4104  Banknote validator NV-150
 1923  FitLinxx
        0085  1950 HID Touchscreen
        0086  1950 HID Touchscreen
        0087  1950 HID Touchscreen
+       0dbf  HID Touchscreen
        0dc2  HID Touchscreen
+1928  Proceq SA
+       0400  Equotip Piccolo
 192f  Avago Technologies, Pte.
        0000  Mouse
        0416  ADNS-5700 Optical Mouse Controller (3-button)
        0616  ADNS-5700 Optical Mouse Controller (5-button)
+       0916  ADNS-2710 Optical Mouse Controller
 1930  Shenzhen Xianhe Technology Co., Ltd.
 1931  Ningbo Broad Telecommunication Co., Ltd.
 1934  Feature Integration Technology Inc. (Fintek)
        0602  F71610 or F71612 Consumer Infrared Receiver/Transceiver
        0702  Integrated Consumer Infrared Receiver/Transceiver
        5168  F71610A or F71612A Consumer Infrared Receiver/Transceiver
+1935  Elektron Music Machines
+       000d  Elektron Digitakt
 1938  Meinberg Funkuhren GmbH & Co. KG
        0501  TCR51USB IRIG Time Code Reader
+       0502  TCR600USB IRIG Time Code Reader
 1941  Dream Link
        8021  WH1080 Weather Station / USB Missile Launcher
 1943  Sensoray Co., Inc.
        2253  Model 2253 Audio/Video Codec Card
        2255  Model 2255 4 Channel Capture Card
        2257  Model 2257 4 Channel Capture Card
+       2263  Model 2263 UVC HD Audio/Video Codec Card
        a250  Model 2250 MPEG and JPEG Capture Card (cold)
        a253  Model 2253 Audio/Video Codec Card (cold)
 1949  Lab126, Inc.
        0002  Amazon Kindle
        0004  Amazon Kindle 3/4/Paperwhite
-       0006  Kindle Fire
+       0006  Amazon Kindle Fire
        0008  Amazon Kindle Fire HD 8.9"
+       000a  Amazon Kindle Fire 2nd generation (2012)
+       0331  Kindle Fire HD 8 (2018)
+       0417  Amazon Zukey; clone of Yubikey 4 OTP+U2F
+       0800  Fire Phone
 194f  PreSonus Audio Electronics, Inc.
        0101  AudioBox 22 VSL
        0102  AudioBox 44 VSL
        0103  AudioBox 1818 VSL
+       0201  FaderPort
        0301  AudioBox
 1951  Hyperstone AG
 1953  Ironkey Inc.
        0202  S200 2GB Rev. 1
 1954  Radiient Technologies
 195d  Itron Technology iONE
+       2030  Func KB-460 Gaming Keyboard
        7002  Libra-Q11 IR remote
        7006  Libra-Q26 / 1.0 Remote
        7777  Scorpius wireless keyboard
        7779  Scorpius-P20MT
+1963  IK Multimedia
+       0005  iRig KEYS
+       0046  UNO Synth
 1965  Uniden Corporation
        0016  HomePatrol-1
+       0018  UBC125XLT
+       001a  BCD436HP Scanner
 1967  CASIO HITACHI Mobile Communications Co., Ltd.
 196b  Wispro Technology Inc.
 1970  Dane-Elec Corp. USA
        0000  Z Mate 16GB
+1973  Spectralink Corporation
+       0002  Pivot recovery
+       0003  Pivot Media Transfer Protocol
+       0004  Pivot Media Transfer Protocol
 1975  Dongguan Guneetal Wire & Cable Co., Ltd.
 1976  Chipsbrand Microelectronics (HK) Co., Ltd.
-       6025  Flash Drive 512 MB
+       1307  microSD Card Reader
+       6025  CBM2090 Flash Drive
 1977  T-Logic
        0111  TL203 MP3 Player and Voice Recorder
 197d  Leuze electronic
        0222  BCL 508i
+1980  Storage Appliance Corporation
+       0808  Clickfree C2 Slimline (527SE)
 1989  Nuconn Technology Corp.
 198f  Beceem Communications Inc.
        0210  BCS200 WiMAX Adapter
        3010  Camera Release 4
        3011  OEM Camera
        3012  e-ImageData Corp. ScanPro
+1997  Shenzhen Riitek Technology Co., Ltd
+       0409  wireless mini keyboard with touchpad
+       2433  wireless mini keyboard with touchpad
 199b  MicroStrain, Inc.
        3065  3DM-GX3-25 Orientation Sensor
 199e  The Imaging Source Europe GmbH
        8101  DFx 21BU04 Camera
+       8457  DFK AFU130-L53 camera
 199f  Benica Corporation
+19a5  HARRIS Corp.
+       0004  Remote NDIS Network Device
+       0012  RF-7800S Secure Personal Radio
+       0401  Mass Storage Device
+       0402  Falcon III RF-7800V family RNDIS
 19a8  Biforst Technology Inc.
 19ab  Bodelin
        1000  ProScope HR
 19b5  B & W Group
 19b6  Infotech Logistic, LLC
 19b9  Data Robotics
+       4b10  Drobo
        8d20  Drobo Elite
 19c2  Futuba
        6a11  MDM166A Fluorescent Display
 19ca  Mindtribe
        0001  Sandio 3D HID Mouse
 19cf  Parrot SA
+       0001  MiniKit Slim handsfree car kit in firmware update mode
+19d1  BYD
 19d2  ZTE WCDMA Technologies MSM
        0001  CDMA Wireless Modem
        0002  MF632/ONDA ET502HS/MT505UP
        0007  TU25 WiMAX Adapter [Beceem BCS200]
+       0017  MF669
        0031  MF110/MF627/MF636
+       0037  ONDA MC503HSA
+       0039  MF100
        0063  K3565-Z HSDPA
        0064  MF627 AU
        0083  MF190
        0103  MF112
        0104  K4505-Z
+       0117  MF667
        0146  MF 195E (HSPA+ Modem)
        0167  MF820 4G LTE
        0172  AX226 WIMAX MODEM (After Modeswitch)
        0325  LTE4G O2 ZTE MF821D LTE/UMTS/GSM Modem/Networkcard
        0326  LTE4G O2 ZTE MF821D LTE/UMTS/GSM Modem/Networkcard
+       0501  Lever Cell Phone Model Z936L
+       1001  K3805-Z vodafone WCDMA/GSM Modem - storage mode (made by ZTE)
+       1002  K3805-Z vodafone WCDMA/GSM Modem/Networkcard (made by ZTE)
        1008  K3570-Z
        1010  K3571-Z
        1017  K5006-Z vodafone LTE/UMTS/GSM Modem/Networkcard
        1203  MF691 [ T-Mobile webConnect Rocket 2.0]
        1217  MF652
        1218  MF652
+       1270  MF667
        2000  MF627/MF628/MF628+/MF636+ HSDPA/HSUPA
        fff2  Gobi Wireless Modem (QDL mode)
        fff3  Gobi Wireless Modem
 19f7  RODE Microphones
        0001  Podcaster
 19fa  Gampaq Co.Ltd
+       0607  GAME CONTROLLER
        0703  Steering Wheel
+19fd  MTI Instruments Inc.
 19ff  Dynex
        0102  1.3MP Webcam
        0201  Rocketfish Wireless 2.4G Laser Mouse
+       0220  RF-HDWEBLT RocketFish HD WebCam
        0238  DX-WRM1401 Mouse
+       0239  Bluetooth 4.0 Adapter [Broadcom, 1.12, BCM20702A0]
 1a08  Bellwood International, Inc.
 1a0a  USB-IF non-workshop
        badd  USB OTG Compliance test device
 1a2c  China Resource Semico Co., Ltd
        0021  Keyboard
        0024  Multimedia Keyboard
+       2124  Keyboard
+       2d23  Keyboard
+       427c  Backlit Keyboard [Cougar Vantar]
 1a32  Quanta Microsystems, Inc.
        0304  802.11n Wireless LAN Card
 1a34  ACRUX
 1a5a  Tandberg Data
 1a61  Abbott Diabetes Care
        3410  CoPilot System Cable
+       3650  FreeStyle Libre
+       3850  FreeStyle Optium/Precision Neo
+       3950  FreeStyle Libre 2
+1a64  Mastervolt
+       0000  MasterBus Link
 1a6a  Spansion Inc.
 1a6d  SamYoung Electronics Co., Ltd
 1a6e  Global Unichip Corp.
        1008  E-861 PiezoWalk NEXACT Controller
 1a79  Bayer Health Care LLC
        6002  Contour
+       6210  Contour Next Link 2.4 glucometer
+       6300  Contour next link
        7410  Contour Next
+       7800  Contour Plus One
 1a7b  Lumberg Connect  GmbH & Co. KG
 1a7c  Evoluent
        0068  VerticalMouse 3
        0168  VerticalMouse 3 Wireless
        0191  VerticalMouse 4
+       0195  VerticalMouse C Wireless
 1a81  Holtek Semiconductor, Inc.
+       1004  Wireless Dongle 2.4 GHZ HT82D40REW
+       1701  Wireless dongle
+       2004  Keyboard
        2203  Laser Gaming mouse
        2204  Optical Mouse
        2205  Laser Mouse
+       4001  Keyboard
 1a86  QinHeng Electronics
        5512  CH341 in EPP/MEM/I2C mode, EPP/I2C adapter
        5523  CH341 in serial mode, usb to serial port converter
        5584  CH341 in parallel mode, usb to printer port converter
-       7523  HL-340 USB-Serial adapter
+       7523  CH340 serial converter
        752d  CH345 MIDI adapter
        7584  CH340S
        e008  HID-based serial adapater
 1aa4  Data Drive Thru, Inc.
 1aa5  UBeacon Technologies, Inc.
 1aa6  eFortune Technology Corp.
+1aab  Silvercreations Software AG
+       7736  sceye (Gen 2)
+       7737  sceye (Gen 3)
+       7738  sceye (Gen 4, 3 Mpix)
+       7750  sceyeS (Gen 5, 5 MPix)
 1aad  KeeTouch
        0001  Touchscreen
 1ab1  Rigol Technologies
+       04b0  DS6000 SERIES
+       04be  DS4000 SERIES
+       04ce  DS1xx4Z/MSO1xxZ series
        0588  DS1000 SERIES
+1ab2  Allied Vision
+       0001  Vision device
 1acb  Salcomp Plc
 1acc  Midiplus Co, Ltd.
        0103  AudioLink plus 4x4 2.9.28
 1ad1  Desay Wire Co., Ltd.
 1ad4  APS
        0002  KM290-HRS
-1adb  SEL C662 Serial Cable
+1adb  Schweitzer Engineering Laboratories, Inc
+       0001  C662 Serial Cable
+       0003  CDC Ethernet Gadget
 1ae4  ic-design Reinhard Gottinger GmbH
 1ae7  X-TENSIONS
        0381  VS-DVB-T 380U (af9015 based)
+       0525  X-Tensions ISDN TA XC-525 [HFC-S USB]
        2001  SpeedLink Snappy Mic webcam (SL-6825-SBK)
        9003  SpeedLink Vicious And Devine Laplace webcam, white (VD-1504-SWT)
        9004  SpeedLink Vicious And Devine Laplace webcam, black (VD-1504-SBK)
 1aed  High Top Precision Electronic Co., Ltd.
 1aef  Conntech Electronic (Suzhou) Corporation
 1af1  Connect One Ltd.
+1af3  Kingsis Technology Corporation
+       0001  ZOWIE Gaming mouse
 1afe  A. Eberle GmbH & Co. KG
        0001  PQ Box 100
 1b04  Meilhaus Electronic GmbH
        1078  BLUDRIVE II CCID
        1079  BLUDRIVE II CCID
        1080  WRITECHIP II CCID
+1b12  Eventide
+       0011  ModFactor
 1b1c  Corsair
        0890  Flash Padlock
        0a00  SP2500 Speakers
        0a60  Vengeance K60 Keyboard
        0c04  Link Cooling Node
+       0c06  RM-Series C-Link Adapter
+       0c0a  Hydro Series H115i Liquid CPU Cooler
+       0c0b  Lighting Node Pro
+       0c0c  Lighting Node Loader
+       0c22  iCUE H150i RGB PRO XT Liquid CPU Cooler
        1a01  Flash Voyager GT
        1a03  Voyager 3.0
        1a09  Voyager GT 3.0
        1a0a  Survivor Stealth Flash Drive
        1a0b  Flash Voyager LS
+       1a0e  Voyager GTX
+       1a14  Voyager Vega
        1a15  Voyager Slider Flash Drive
        1a90  Flash Voyager GT
        1ab1  Voyager
        1b09  Vengeance K70R keyboard
        1b11  K95 RGB Mechanical Gaming Keyboard
        1b13  Vengeance K70RGB keyboard
+       1b20  STRAFE RGB Gaming Keyboard
+       1b2d  K95 RGB Platinum Keyboard [RGP0056]
+       1b2e  Corsair Corsair Gaming M65 Pro RGB Mouse
+       1b2f  Sabre RGB [CH-9303011-XX]
+       1b3d  Corsair Corsair Gaming K55 RGB Keyboard
+       1b5e  Harpoon Wireless Mouse
+       1b65  Harpoon Wireless Dongle
        1c00  Controller for Corsair Link
+       1c02  AX1500i Power Supply
+       1c05  HX750i Power Supply
+       1c07  HX1000i Power Supply
+       1c08  HX1200i Power Supply
+       1c0b  RM750i Power Supply
        1c0c  RM850i Power Supply
+       1c1a  Corsair CORSAIR Lighting Node CORE
+1b1e  General Imaging / General Electric
+       1003  A1250
 1b1f  eQ-3 Entwicklung GmbH
        c00f  HM-CFG-USB/HM-CFG-USB-2 [HomeMatic Configuration adapter]
+       c020  HmIP-RFUSB
 1b20  MStar Semiconductor, Inc.
 1b22  WiLinx Corp.
+1b24  Telegent Systems, Inc.
+       4001  TLG2300 Hybrid TV Device
 1b26  Cellex Power Products, Inc.
 1b27  Current Electronics Inc.
 1b28  NAVIsis Inc.
 1b3f  Generalplus Technology Inc.
        0c52  808 Camera #9 (mass storage mode)
        2002  808 Camera #9 (web-cam mode)
+       2003  GPD6000 [Digital MP3 Player]
 1b47  Energizer Holdings, Inc.
        0001  CHUSB Duo Charger (NiMH AA/AAA USB smart charger)
 1b48  Plastron Precision Co., Ltd.
 1b5a  Chao Zhou Kai Yuan Electric Co., Ltd.
 1b65  The Hong Kong Standards and Testing Centre Ltd.
 1b71  Fushicai
+       0050  Encore ENUTV-4 Analog TV Tuner
        3002  USBTV007 Video Grabber [EasyCAP]
 1b72  ATERGI TECHNOLOGY CO., LTD.
 1b73  Fresco Logic
        d398  DVB-T receiver [RTL2832U]
        d700  FM Radio SnapMusic Mobile 700 (FM700)
        e297  Conceptronic DVB-T CTVDIGRCU V3.0
+       e302  CVBS / S-Video Capture Device [Pinnacle Dazzle / UB315-E]
+       e34c  UB435-Q ATSC TV Stick
        e383  DVB-T UB383-T [af9015]
        e385  DVB-T UB385-T [af9015]
        e386  DVB-T UB385-T [af9015]
 1ba2  Lite Metals & Plastic (Shenzhen) Co., Ltd.
 1ba4  Ember Corporation
        0001  InSight USB Link
+       0002  EM358 Virtual COM Port
 1ba6  Abilis Systems
 1ba8  China Telecommunication Technology Labs
 1bad  Harmonix Music
-       0002  Guitar for Xbox 360
-       0003  Drum Kit for Xbox 360
+       0002  Rock Band Guitar for Xbox 360
+       0003  Rock Band Drum Kit for Xbox 360
+       0130  Ion Drum Rocker for Xbox 360
+       028e  Controller
+       3330  Rock Band 3 Keyboard wii interface
+       f016  Controller
+       f018  Street Fighter IV SE FightStick for Xbox 360
+       f019  BrawlStick for Xbox 360
+       f021  Ghost Recon Future Soldier Gamepad for Xbox 360
+       f023  MLG Pro Circuit Controller for Xbox 360
+       f025  Call of Duty Controller for Xbox 360
+       f027  FPS Pro Controller for Xbox 360
+       f028  Street Fighter IV FightPad for Xbox 360
+       f02e  FightPad
+       f030  MC2 MicroCON Racing Wheel for Xbox 360
+       f036  MicroCON Gamepad Pro for Xbox 360
+       f038  Street Fighter IV FightStick TE for Xbox 360
+       f039  Marvel VS Capcom 2 Tournament Stick for Xbox 360
+       f03a  Street Fighter X Tekken FightStick Pro for Xbox 360
+       f03d  Street Fighter IV Arcade Stick TE for Xbox 360
+       f03e  MLG Arcade FightStick TE for Xbox 360
+       f03f  Soulcalibur FightStick for Xbox 360
+       f042  Arcade FightStick TE S+ for Xbox 360
+       f080  FightStick TE2 for Xbox 360
+       f501  Horipad EX2 Turbo for Xbox 360
+       f502  Real Arcade Pro.VX SA for Xbox 360
+       f503  Fighting Stick VX for Xbox 360
+       f504  Real Arcade Pro.EX
+       f505  Fighting Stick EX2B for Xbox 360
+       f506  Real Arcade Pro.EX Premium VLX for Xbox 360
+       f900  Controller
+       f901  GameStop Controller
+       f903  Tron Controller for Xbox 360
+       f904  PDP Versus Fighting Pad for Xbox 360
+       f906  Mortal Kombat FightStick for Xbox 360
+       f907  Afterglow Gamepad
+       fa01  Gamepad
+       fd00  Razer Onza Tournament Edition
+       fd01  Razer Onza Classic Edition
 1bae  Vuzix Corporation
        0002  VR920 Immersive Eyewear
 1bbb  T & A Mobile Phones
+       0003  Alcatel one touch 4030D modem connection
+       0017  HSPA Data Card
+       007a  Alcatel OneTouch (firmware upgrade mode)
        011e  Alcatel One Touch L100V / Telekom Speedstick LTE II
+       0169  Alcatel ONE TOUCH Fierce
+       0195  Alcatel OneTouch L850V / Telekom Speedstick LTE
+       a00e  Vodafone Smart Tab 4G
+       f000  Alcatel OneTouch (mass storage mode)
        f017  Alcatel One Touch L100V / Telekom Speedstick LTE II
+1bbd  Videology Imaging Solutions, Inc.
+       0060  1.3MP Mono Camera
+       0066  1.3MP Mono Camera
+       0067  1.3MP Mono Camera
+1bc0  Beijing Senseshield Technology Co.,Ltd.
+       0013  Elitee-e
+       0014  Elite4
+       0020  iToken
+       0021  Mikey
+       0051  Elite5
+       0055  Elite5 v3.x
+       485d  EliteIV
 1bc4  Ford Motor Co.
 1bc5  AVIXE Technology (China) Ltd.
 1bc7  Telit Wireless Solutions
        0020  HE863
        0021  HE910
+       0022  GE910-QUAD
        0023  HE910-D ECM
+       0032  LE910-EU V2
        1003  UC864-E
        1004  UC864-G
        1005  CC864-DUAL
        1006  CC864-SINGLE
        1010  DE910-DUAL
        1011  CE910-DUAL
-       1200  LE920
+       1012  UE910 V2
+       1101  ME910C1
+       110a  ME310
+       1200  LE920 (old firmware)
+       1201  LE910 / LE920
 1bce  Contac Cable Industrial Limited
 1bcf  Sunplus Innovation Technology Inc.
        0005  Optical Mouse
        053a  Targa Silvercrest OMC807-C optische Funkmaus
        05c5  SPRF2413A [2.4GHz Wireless Keyboard/Mouse Receiver]
        05cf  Micro keyboard & mouse receiver
+       08a0  Gaming mouse [Philips SPK9304]
        0c31  SPIF30x Serial-ATA bridge
+       2281  SPCA2281 Web Camera
        2880  Dell HD Webcam
+       2883  Asus Webcam
        2885  ASUS Webcam
        2888  HP Universal Camera
+       2895  Dell Integrated Webcam
        28a2  Dell Integrated Webcam
        28a6  DELL XPS Integrated Webcam
        28ae  Laptop Integrated Webcam HD
        28bd  Dell Integrated HD Webcam
        2985  Laptop Integrated Webcam HD
        2b83  Laptop Integrated Webcam FHD
+       2b91  Dell E5570 integrated webcam
+       2b97  Laptop Integrated Webcam FHD
+       2c6e  Laptop Integrated WebCam HD
 1bd0  Hangzhou Riyue Electronic Co., Ltd.
 1bd5  BG Systems, Inc.
+1bda  University Of Southampton
+       0010  Power Board v4 Rev B
+       0011  Student Robotics SBv4B
 1bde  P-TWO INDUSTRIES, INC.
 1bef  Shenzhen Tongyuan Network-Communication Cables Co., Ltd
 1bf0  RealVision Inc.
        6968  Touch Screen
 1c02  Kreton Corporation
 1c04  QNAP System Inc.
+       2074  ASM1074 High-Speed hub
+       3074  ASM1074 SuperSpeed hub
+1c05  Shenxhen Stager Electric
+       ea75  G540 Programmer
 1c0c  Ionics EMS, Inc.
        0102  Plug Computer
 1c0d  Relm Wireless
 1c10  Lanterra Industrial Co., Ltd.
+1c11  Input Club Inc.
+       b04d  ErgoDox Infinity
 1c13  ALECTRONIC LIMITED
 1c1a  Datel Electronics Ltd.
+       0100  Action Replay DS "3DS/DSi/DS/Lite Compatible"
 1c1b  Volkswagen of America, Inc.
 1c1f  Goldvish S.A.
 1c20  Fuji Electric Device Technology Co., Ltd.
 1c22  ZHONGSHAN CHIANG YU ELECTRIC CO., LTD.
 1c26  Shanghai Haiying Electronics Co., Ltd.
 1c27  HuiYang D & S Cable Co., Ltd.
+1c28  PMD Technologies
+       c003  CamCube
+       c004  CamBoard
+       c005  ConceptCam
+       c006  CamBoard 22
+       c007  CamBoard nano
+       c008  CamBoard mod
+       c009  CamBoard plus
+       c00a  DigiCam
+       c00d  CamBoard pico LDD
+       c00f  CamBoard pico
 1c29  Elster GmbH
        0001  ExMFE5 Simulator
        10fc  enCore device
 1c34  SpringCard
        7241  Prox'N'Roll RFID Scanner
 1c37  Authorizer Technologies, Inc.
+       6190  U2F Fido-compliant cryptotoken
 1c3d  NONIN MEDICAL INC.
 1c3e  Wep Peripherals
 1c40  EZPrototypes
        0534  i2c-tiny-usb interface
        0535  glcd2usb interface
        0536  Swiss ColorPAL
+       0537  MIST Board
 1c49  Cherng Weei Technology Corp.
+1c4b  Geratherm Medical AG
+       026f  Spirostik
 1c4f  SiGma Micro
        0002  Keyboard TRACER Gamma Ivory
        0003  HID controller
        000e  Genius KB-120 Keyboard
        0026  Keyboard
+       0032  Optical Mouse with Scroll Wheel
+       0034  XM102K Optical Wheel Mouse
+       0063  Touchpad (integrated in detachable keyboard of Chuwi SurBook)
+       0065  Optical Wheel Mouse [Rapoo N1130]
        3000  Micro USB Web Camera
        3002  WebCam SiGma Micro
+1c57  Zalman Tech Co., Ltd.
+       1e45  FPSGUN FG1000 Mouse
 1c6b  Philips & Lite-ON Digital Solutions Corporation
+       a220  DVD Writer Slimtype eSAU108
        a222  DVD Writer Slimtype eTAU108
+       a223  DVD Writer Slimtype eUAU108
 1c6c  Skydigital Inc.
+1c71  Humanware Inc
+       c004  Braille Note Apex (braille terminal mode)
 1c73  AMT
        861f  Anysee E30 USB 2.0 DVB-T Receiver
+1c75  Arturia
+       0288  KeyStep
 1c77  Kaetat Industrial Co., Ltd.
 1c78  Datascope Corp.
 1c79  Unigen Corporation
 1c7a  LighTuning Technology Inc.
+       0577  Fingerprint Sensor
+       0603  ES603 Swipe Fingerprint Sensor
        0801  Fingerprint Reader
 1c7b  LUXSHARE PRECISION INDUSTRY (SHENZHEN) CO., LTD.
+1c82  Atracsys
+       0200  spryTrac
 1c83  Schomaecker GmbH
        0001  RS150 V2
+       0002  RFID card reader
+       0003  Communicator
+       0005  Mobile RFID Reader
 1c87  2N TELEKOMUNIKACE a.s.
 1c88  Somagic, Inc.
        0007  SMI Grabber (EasyCAP DC60+ clone) (no firmware) [SMI-2021CBE]
 1cb6  IdeaCom Technology Inc.
        6681  IDC6681
 1cbe  Luminary Micro Inc.
+       0002  CDC serial port [TivaWare]
        00fd  In-Circuit Debug Interface
        00ff  Stellaris ROM DFU Bootloader
        0166  CANAL USB2CAN
+       0240  McGill Robotics TM4C Microcontroller
 1cbf  FORTAT SKYMARK INDUSTRIAL COMPANY
 1cc0  PlantSense
 1cca  NextWave Broadband Inc.
        0023  deRFusbSniffer Sub-GHz
        0025  deRFusb23E06
        0027  deRFusb13E06
+       0030  ZigBee gateway [ConBee II]
 1cfc  ANDES TECHNOLOGY CORPORATION
 1cfd  Flextronics Digital Design Japan, LTD.
 1d03  iCON
        1026  HSUPA Modem FLYING-LARK46-VER0.07 [Flying Angel]
 1d0a  Johnson Controls, Inc. The Automotive Business Unit
 1d0b  HAN HUA CABLE & WIRE TECHNOLOGY (J.X.) CO., LTD.
+1d0d  TDKMedia
+       0214  Trans-It Drive
 1d0f  Sonix Technology Co., Ltd.
 1d14  ALPHA-SAT TECHNOLOGY LIMITED
 1d17  C-Thru Music Ltd.
        1101  DK DVB-T Dongle
        1102  DK mini DVB-T Dongle
        1103  DK 5217 DVB-T Dongle
+       1104  MSI DigiVox Micro HD
        6105  Video grabber
+       610a  Video grabber
        8202  DK DVBC/T DONGLE
 1d1f  Diostech Co., Ltd.
 1d20  SAMTACK INC.
 1d27  ASUS
+       0601  Xtion
 1d34  Dream Cheeky
-       0001  Dream Cheeky Fidget
-       0004  Dream Cheeky Webmail Notifier
-       0008  Dream Cheeky button
-       000a  Dream Cheeky Mailbox Friends Alert
-       000d  Dream Cheeky Big Red Button
-       0013  Dream Cheeky LED Message Board
+       0001  Fidget
+       0002  Fidget (Basketball)
+       0003  Fidget (Golf Ball)
+       0004  Webmail Notifier
+       0008  button
+       000a  Mailbox Friends Alert
+       000d  Big Red Button
+       0013  LED Message Board
+       0020  Stress Ball
 1d45  Touch
        1d45  Foxlink Optical touch sensor
+       459d  BenQ F5
+       465c  Harrier Mini by EE
 1d4d  PEGATRON CORPORATION
        0002  Ralink RT2770/2720 802.11b/g/n Wireless LAN Mini-USB Device
        000c  Ralink RT3070 802.11b/g/n Wireless Lan USB Device
        5123  Neo1973/FreeRunner internal USB CSR4 module
        5124  Neo1973/FreeRunner Bluetooth Device ID service
        5300  Rockbox
+       530e  iriver H10 20GB (Rockbox)
+       530f  iriver H10 5/6GB (Rockbox)
+       5314  Apple iPod Color/Photo (Rockbox)
+       5315  Apple iPod Nano 1g (Rockbox)
+       5316  Apple iPod Video (Rockbox)
+       5318  Apple iPod 4g Grayscale (Rockbox)
+       5319  Apple iPod Mini 1g (Rockbox)
+       531a  Apple iPod Mini 2g (Rockbox)
+       531c  Apple iPod Nano 2g (Rockbox)
+       531d  Apple iPod Classic/6G (Rockbox)
+       5321  Cowon D2 (Rockbox)
+       5329  Toshiba Gigabeat S (Rockbox)
+       5332  Sandisk Sansa e200 series (Rockbox)
+       5334  Sandisk Sansa c200 series (Rockbox)
+       5337  Sandisk Sansa Clip (Rockbox)
+       5338  Sandisk Sansa e200v2 series (Rockbox)
+       5339  Sandisk Sansa m200 v4 series (Rockbox)
+       533a  Sandisk Sansa Fuze (Rockbox)
+       533b  Sandisk Sansa c200v2 series (Rockbox)
+       533c  Sandisk Sansa Clipv2 (Rockbox)
+       533e  Sandisk Sansa Clip+ (Rockbox)
+       533f  Sandisk Sansa Fuze v2 (Rockbox)
+       5340  Sandisk Sansa Fuze+ (Rockbox)
+       5341  Sandisk Sansa Zip (Rockbox)
+       5342  Sandisk Sansa Connect (Rockbox)
+       5346  Olympus M:Robe 500i (Rockbox)
+       5347  Olympus m:robe MR-100 (Rockbox)
+       5359  Creative Zen X-Fi Style (Rockbox)
+       535d  Creative Zen X-Fi2 (Rockbox)
+       535e  Creative Zen X-Fi3 (Rockbox)
+       5360  Creative Zen X-Fi (Rockbox)
+       5361  Creative ZEN Mozaic (Rockbox)
+       5362  Creative Zen (Rockbox)
+       5364  Philips GoGear SA9200 (Rockbox)
+       5365  Philips GoGear HDD16x0 (Rockbox)
+       5366  Philips GoGear HDD63x0 (Rockbox)
+       5378  Onda VX747 (Rockbox)
+       5379  Onda VX767 (Rockbox)
+       537b  Onda VX777 (Rockbox)
+       538c  Samsung YH-820 (Rockbox)
+       538d  Samsung YH-920 (Rockbox)
+       538e  Samsung YH-925 (Rockbox)
+       53a0  Packard Bell Vibe 500 (Rockbox)
+       53b4  Rockchip 27xx generic (Rockbox)
+       53be  HiFiMAN HM-60x (Rockbox)
+       53bf  HiFiMAN HM-801 (Rockbox)
+       53d2  HiFi E.T. MA9 (Rockbox)
+       53d3  HiFi E.T. MA9C (Rockbox)
+       53d4  HiFi E.T. MA8 (Rockbox)
+       53d5  HiFi E.T. MA8C (Rockbox)
+       53dc  Sony NWZ-E370/E380 series (Rockbox)
+       53dd  Sony NWZ-E360 series (Rockbox)
+       53e6  IHIFI 760 (Rockbox)
+       53e7  IHIFI 960 (Rockbox)
+       53ff  Generic Rockbox device
        6000  Ubertooth Zero
        6001  Ubertooth Zero (DFU)
        6002  Ubertooth One
        601a  Paparazzi Lisa/M
        601b  IST-2 chronograph for bullet speeds
        601c  EPOSMote II
+       601d  UDS18B20 temperature sensor
        601e  5x5 STM32 prototyping board
        601f  uNSF
        6020  Toad3
        6023  Pixelkit
        6024  Illucia
        6025  Keyglove (HID)
+       6026  Keyglove (Serial)
        6027  Key64 Keyboard
        6028  Teensy 2.0 Development Board [ErgoDox Keyboard]
+       6029  Marlin 2.0 (Serial)
        602a  Marlin 2.0 (Mass Storage)
        602b  FPGALink
        602c  5nes5snes (5x8)
        602f  K-copter
        6030  USB-oscope
        6031  Handmade GSM GPS tracker
+       6032  ncrmnt.org uISP
        6033  frobiac / adnw keyboard
        6034  Tiflomag Ergo 2
        6035  FreeLaserTag Gun
        6052  APB Team Robotic Development Board
        6053  Darkgame Controller
        6054  Satlab/AAUSAT3 BlueBox
+       6055  RADiuS ER900TRS-02 transciever with SMA Connector
        6056  The Glitch
+       6057  OpenPipe MIDI Shield
+       6058  Novena OTG port
+       6059  xser serial
+       605a  Daisho test
        605b  RfCat YARD Stick One
        605c  YARD Stick One bootloader
        605d  Funky Sensor v2
        605f  Small DIP package Cypress FX2
        6060  Data logger using the Cypress FX2
        6061  Power Manager
+       6062  WhiteRabbit console and Wishbone bridge
        6063  CPC FPGA
        6064  CPC FPGA (DFU)
        6065  CPC FPGA (Serial)
        606c  Blinkytape full-color light tape
        606d  TinyG open source motion controller
        606e  Reefangel Evolution 1.0
+       606f  Geschwister Schneider CAN adapter
        6070  Open Pinball Project
        6071  The Glitch HID
        6072  The Glitch Disk
        6076  Vultureprog BIOS chip programmer
        6077  PaintDuino
        6078  DTplug
+       6079  Mood Light
        607a  Fadecandy
        607b  RCDongle for IR remote control
        607c  OpenVizsla USB sniffer/analyzer
        607d  Spark Core Arduino-compatible board with WiFi
+       607e  OSHUG Wuthering multi-tool
        607f  Spark Core Arduino-compatible board with WiFi (bootloader)
        6080  arcin arcade controller
        6081  BladeRF (bootloader)
        6084  arcin arcade controller (DFU)
        6085  IRKit for controlloing home electronics from iOS devices
        6086  OneRNG entropy device
+       6087  Blinkytape (alternate endpoint config)
        6088  picp PIC16F145x based PIC16F145x programmer
        6089  Great Scott Gadgets HackRF One SDR
        608a  BLEduino
        60aa  Blinky Light Controller
        60ab  AllPixel
        60ac  OpenBLT generic microcontroller (bootloader)
+       60ad  Clasic Gamepad Adapter (NES)
+       60ae  Clasic Gamepad Adapter (N64)
+       60af  Clasic Gamepad Adapter (DB9)
        60b0  Waterott Arduino based Clock (caterina bootloader)
        60b1  Drinkbot (processing)
        60b2  Drinkbot (OTG-tablet support)
        60bd  Open Source control interface for multimedia applications
        60be  Pixelmatix Aurora (bootloader)
        60bf  Pixelmatix Aurora
+       60c0  Nucular Keyboard adapter
        60c1  BrewBit Model-T pOSHW temperature controller for homebrewers (bootloader)
        60c2  BrewBit Model-T pOSHW temperature controller for homebrewers
        60c3  X Antenna Tracker arduino board
+       60c4  CAN bus communication device
+       60c5  PIC16F1 bootloader
        60c6  USBtrng hardware random number generator
        60c7  Zubax GNSS positioning module for light UAV systems
        60c8  Xlink data transfer and control system for Commodore C64
        60ca  FinalKey password manager
        60cb  PteroDAQ Data Acquisition on FRDM-KL25Z and future boards
        60cc  LamDiNao
+       60cd  Open Lighting DMX512 / RDM widget
        60de  Cryptech.is random number generator
        60df  Numato Opsis HDMI2USB board (unconfigured)
        60e0  Numato Opsis HDMI2USB board (JTAG Programming Mode)
        60e8  Alpen Clack keyboard
        60e9  keyman64 keyboard itercepter
        60ea  Wiggleport FPGA-based I/O board
-       60ec  Duet 3D Printer Controller
+       60eb  candleLight CAN adapter
+       60ec  Duet 2 WiFi or Duet 2 Ethernet 3D printer control electronics
+       60ed  Duet 2 Maestro 3D printer control electronics
+       60ee  Duet 3 motion control electronics
        60f0  UDAD-T1 data aquisition device (boot)
        60f1  UDAD-T1 data aquisition device
        60f2  UDAD-T2 data aquisition device (boot)
        6108  Myriad-RF LimeSDR
        610c  Magic Keys (boot)
        610d  Magic Keys
+       6114  MIDI key
+       6118  Thomson MO5 keyboard
+       6122  Ultimate Hacking Keyboard
+       614c  dwtk In-Circuit Emulator
        8085  Box0 (box0-v5)
-       cc15  rad1o badge for CCC congress 2015
+       cc15  rad1o badge for CCC summer camp 2015
 1d57  Xenta
        0005  Wireless Receiver (Keyboard and Mouse)
        0006  Wireless Receiver (RC Laser Pointer)
        000c  Optical Mouse
+       130f  2.4Ghz wireless optical mouse receiver
        2400  Wireless Mouse Receiver
        32da  2.4GHz Receiver (Keyboard and Mouse)
        83d0  Click-mouse!
        ac01  Wireless Receiver (Keyboard and Mouse)
+       ac02  ViFit Activity Tracker
+       ac08  RFID Receiver (Keyboard)
        ad02  SE340D PC Remote Control
+       ad03  [T3] 2.4GHz and IR Air Mouse Remote Control
        af01  AUVIO Universal Remote Receiver for PlayStation 3
+       af03  Wireless Receiver
+       fa20  2.4GHz Wireless Reciever (Mini Keyboard & Mouse)
 1d5b  Smartronix, Inc.
 1d5c  Fresco Logic
        2000  FL2000/FL2000DX VGA/DVI/HDMI Adapter
        0104  Multifunction Composite Gadget
        0105  FunctionFS Gadget
        0200  Qemu Audio Device
+1d88  Mahr GmbH
+       0001  Measurement Device [MarECon]
+       0002  Probe
+       0003  Surface Measurement [PS10]
 1d90  Citizen
        201e  PPU-700
+       2037  CL-S631 Barcode Printer
+       20f0  Thermal Receipt Printer [CT-E351]
 1d9d  Sigma Sport
        1010  Docking Station Topline 2009
        1011  Docking Station Topline 2012
+       1012  Docking Station Topline 2016
+1dd2  Leo Bodnar Electronics Ltd
+1dd3  Dajc Inc.
+       0001  Expert I/O 1000
 1de1  Actions Microelectronics Co.
        1101  Generic Display Device (Mass storage mode)
        c101  Generic Display Device
+1de6  MICRORISC s.r.o.
 1e0e  Qualcomm / Option
        f000  iCON 210 UMTS Surfstick
 1e10  Point Grey Research, Inc.
        040c  LPC2378 [Robotino XT Bootloader]
        040d  LPC2378 [Robotino 3]
        040e  LPC2378 [Robotino 3 Bootloader]
+       040f  LPC2148 [Robotino gripper]
+       0410  LPC2148 [Robotino IR panel]
        0501  CP2102 [CMSP]
        0601  CMMP-AS
+       0602  FTDI232 [CMMS]
+1e2d  Gemalto M2M GmbH
+       004f  EGS3 GSM/GPRS modem
+       0054  PH8 wireless module
+       0058  Wireless Module [Cinterion EHS6]
+       0059  Wireless Module [Cinterion BGx]
+       005b  Zoom 4625 Modem
+       0061  ALSx PLSx LTE modem
+       00a0  Cinterion ELS31-V
 1e3d  Chipsbank Microelectronics Co., Ltd
+       198a  Flash Disk
        2093  CBM209x Flash Drive (OEM)
        4082  CBM4082 SD Card Reader
 1e41  Cleverscope
        0001  CS328A PC Oscilloscope
+       0004  CS448
+1e44  SHIMANO INC.
+       7220  SM-BCR2
 1e4e  Cubeternet
        0100  WebCam
        0102  GL-UPC822 UVC WebCam
+       0109  EtronTech CMOS based eSP570 WebCam [Onyx Titanium TC101]
 1e54  TypeMatrix
        2030  2030 USB Keyboard
 1e68  TrekStor GmbH & Co. KG
        001b  DataStation maxi g.u
+       004c  DataStation Pocket Click
        0050  DataStation maxi light
+       1045  ST70408-3 [SurfTab breeze 7.0 quad 3G] (MTP Mode)
+       1046  ST70408-3 [SurfTab breeze 7.0 quad 3G] (PTP Mode)
 1e71  NZXT
        0001  Avatar Optical Mouse
+       170e  Kraken X
+       1711  Grid+ V3
+       1714  Smart Device
+       1715  Kraken M22
+       2006  Smart Device V2
 1e74  Coby Electronics Corporation
        2211  MP300
        2647  2 GB 2 Go Video MP3 Player [MP601-2G]
        6511  MP705-8G MP3 player
        6512  MP705-4G
        7111  MP957 Music and Video Player
+1e7b  Zurich Instruments
+       0002  HF2
+       0003  UHF
+       0004  MFLI
 1e7d  ROCCAT
        2c24  Pyra Mouse (wired)
+       2c2e  Lua Mouse
+       2c38  Kiro Mouse
        2ced  Kone Mouse
+       2cee  Kova 2016 Gray Mouse
+       2cef  Kova 2016 White Mouse
+       2cf0  Kova 2016 Black Mouse
        2cf6  Pyra Mouse (wireless)
-       2d50  Kova+ Mouse
-       2d51  Kone+ Mouse
+       2d50  Kova[+] Mouse
+       2d51  Kone[+] Mouse
+       2d5a  Savu Mouse
+       2db4  Kone Pure Optical Mouse
+       2dbe  Kone Pure Mouse
+       2dbf  Kone Pure Military Mouse
+       2dc2  Kone Pure Optical Black Mouse
+       2dcb  Kone Pure SE(L) Mouse
        2e22  Kone XTD Mouse
+       2e23  Kone XTD Optical Mouse
+       2e27  Kone AIMO Mouse
+       2e4a  Tyon Black Mouse
+       2e4b  Tyon White Mouse
+       2e7c  Nyth Black Mouse
+       2e7d  Nyth White Mouse
+       2f76  Sova Keyboard
+       2f94  Sova MK Keyboard
+       2fa8  Suora Keyboard
+       2fc6  Skeltr Keyboard
+       2fda  Ryos MK FX Keyboard
        30d4  Arvo Keyboard
+       3138  Ryos MK Keyboard
+       316a  Ryos TKL Keyboard
+       319c  Isku Keyboard
+       31ce  Ryos MK Glow Keyboard
+       3232  Ryos MK Pro Keyboard
+       3246  Suora FX Keyboard
+       3264  Isku FX Keyboard
+1e8e  Airbus Defence and Space
+       6001  P8GR
+1e91  Other World Computing
+       b0b1  miniStack
 1ea7  SHARKOON Technologies GmbH
+       0030  Trust GXT 158 Orna Laser Gaming Mouse
+       0064  2.4GHz Wireless rechargeable vertical mouse [More&Better]
        0066  [Mediatrack Edge Mini Keyboard]
+       0907  Keyboard
+       1002  Vintorez Gaming Mouse
        2007  SHARK ZONE K30 Illuminated Gaming Keyboard
+1eab  Fujian Newland Computer Co., Ltd
+       0103  HR200 Barcode scanner engine (HID keyboard)
+       0106  HR200 Barcode scanner engine (Serial CDC)
+       0110  HR200 Barcode scanner engine (HID Pos)
+       0c03  HR100/HR3260 cordless/HR3290 cordless/BS80 Barcode scanner engine (HID keyboard)
+       0c06  HR100/HR3260 cordless/HR3290 cordless/BS80 Barcode scanner engine (USB Serial CDC)
+       0c10  HR100/HR3260 cordless/HR3290 cordless/BS80 Barcode scanner engine (HID Pos)
+       0d03  EM2028 Barcode scanner engine (HID keyboard)
+       0d06  EM2028 Barcode scanner engine (Serial CDC)
+       0d10  EM2028 Barcode scanner engine (HID Pos)
+       1303  EM30xx/EM20xx/HR3260 corded/HR200C Barcode scanner engine (HID keyboard)
+       1306  EM30xx/EM20xx/HR3260 corded/HR200C Barcode scanner engine (USB serial CDC)
+       1310  EM30xx/EM20xx/HR3260 corded/HR200C Barcode scanner engine (HID Pos)
+       1403  HR15-xx Barcode scanner engine (HID keyboard)
+       1406  HR15-xx Barcode scanner engine (Serial CDC)
+       1410  HR15-xx Barcode scanner engine (HID Pos)
+       1603  FM100-M/3250 Barcode scanner engine (HID keyboard)
+       1606  FM100-M/3250 Barcode scanner engine (Serial CDC)
+       1610  FM100-M/3250 Barcode scanner engine (HID Pos)
+       1903  EM1300 Barcode scanner engine (HID keyboard)
+       1906  EM1300 Barcode scanner engine (Serial CDC)
+       1910  EM1300 Barcode scanner engine (HID Pos)
+       1a03  HR3290 corded/HR22 Barcode scanner engine (HID keyboard)
+       1a06  HR3290 corded/HR22 Barcode scanner engine (Serial CDC)
+       1a10  HR3290 corded/HR22 Barcode scanner engine (HID Pos)
+       1c03  HR2150 Barcode scanner engine (HID keyboard)
+       1c06  HR2150 Barcode scanner engine (Serial CDC)
+       1c10  HR2150 Barcode scanner engine (HID Pos)
+       1d03  FM430 Barcode scanner engine (HID keyboard)
+       1d06  FM430 Barcode scanner engine (Serial CDC)
+       1d10  FM430 Barcode scanner engine (HID Pos)
+       1e03  HR42 Barcode scanner engine (HID keyboard)
+       1e06  HR42 Barcode scanner engine (Serial CDC)
+       1e10  HR42 Barcode scanner engine (HID Pos)
+       1f03  HR11+ Barcode scanner engine (HID keyboard)
+       1f06  HR11+ Barcode scanner engine (Serial CDC)
+       1f10  HR11+ Barcode scanner engine (HID Pos)
+       2003  EM2037v2 Barcode scanner engine (HID keyboard)
+       2006  EM2037v2 Barcode scanner engine (Serial CDC)
+       2010  EM2037v2 Barcode scanner engine (HID Pos)
+       8003  EM13x5-LD/HR15-70/HR100-70/HR12/HR1150-70 Barcode scanner engine (HID keyboard)
+       8006  EM13x5-LD/HR15-70/HR100-70/HR12/HR1150-70 Barcode scanner engine (USB Serial CDC)
+       8010  EM13x5-LD/HR15-70/HR100-70/HR12/HR1150-70 Barcode scanner engine (HID Pos)
+       8203  EM3080-01/EM3095/FR20/FM30 Barcode scanner engine (HID keyboard)
+       8206  EM3080-01/EM3095/FR20/FM30 Barcode scanner engine (USB Serial CDC)
+       8210  EM3080-01/EM3095/FR20/FM30 Barcode scanner engine (HID Pos)
+       8303  HR2160 Barcode scanner engine (HID keyboard)
+       8306  HR2160 Barcode scanner engine (Serial CDC)
+       8310  HR2160 Barcode scanner engine (HID Pos)
+1eaf  Leaflabs
+       0003  Maple DFU interface
+       0004  Maple serial interface
+1eb8  Modacom Co., Ltd.
+       7f00  MW-U3500 WiMAX adapter
 1ebb  NuCORE Technology, Inc.
+1ecb  AMTelecom
+       02e2  JMR1140 [Jiofi]
+1ed8  FENDER MUSICAL INSTRUMENTS CORPORATION
+       0004  Mustang I/II
+       0005  Mustang III/IV/V
+       0006  Mustang I/II [Firmware Update]
+       0007  Mustang III/IV/V [Firmware Update]
+       0010  Mustang Mini
+       0011  Mustang Mini [Firmware Update]
+       0014  Mustang I (V.2)
+       0016  Mustang IV v.2
 1eda  AirTies Wireless Networks
        2012  Air2210 54 Mbps Wireless Adapter
        2210  Air2210 54 Mbps Wireless Adapter
        2410  Air2410 300 Mbps Wireless Adapter
 1edb  Blackmagic design
        bd3b  Intensity Shuttle
+       bd46  Mini Converter Analog to SDI
+       bd75  2.5K Cinema Camera (BMCC)
 1ee8  ONDA COMMUNICATION S.p.a.
        0014  MT833UP
 1ef6  EADS Deutschland GmbH
        5545  Cassidian SSDC Adapter III
        5648  RIU CSMU/BSD
        564a  Cassidian RIU CSMU/BSD Simulator
+1f0c  CMX Systems
+       2000  HP StreamSmart 410 [NW278AA]
 1f28  Cal-Comp
        0020  CDMA USB Modem A600
        0021  CD INSTALLER USB Device
-1f3a  Onda (unverified)
-       efe8  V972 tablet in flashing mode
+1f3a  Allwinner Technology
+       1000  Prestigio PER3464B ebook reader (Mass storage mode)
+       1002  mediacom XPRO 415
+       1010  Android device in fastboot mode
+       efe8  sunxi SoC OTG connector in FEL/flashing mode
 1f44  The Neat Company
        0001  NM-1000 scanner
 1f48  H-TRONIC GmbH
        0627  Data capturing system
        0628  Data capturing and control module
 1f4d  G-Tek Electronics Group
+       a115  EVOLVEO XtraTV stick [DVB-T]
        b803  Lifeview LV5TDLX DVB-T [RTL2832U]
+       c803  NotOnlyTV (Lifeview) LV5TDLX DVB-T [RTL2832U]
        d220  Geniatech T220 DVB-T2 TV Stick
+1f52  Systems & Electronic Development FZCO (SEDCO)
+       0001  Ultima 49 Printer
+       0002  Ultima 90 Printer
+       0003  FormsPro 50 Printer
+       0004  Ultima 90+ Printer
 1f6f  Aliph
        0023  Jawbone Jambox
        8000  Jawbone Jambox - Updating
 1f75  Innostor Technology Corporation
+       0611  IS611 SATA/PATA Bridge Controller
+       0621  IS621 SATA Storage Controller
        0888  IS888 SATA Storage Controller
        0902  IS902 UFD controller
+       0916  IS916 Flash Drive
+       0917  IS917 Mass storage
+       0918  IS918 Flash Drive
 1f82  TANDBERG
        0001  PrecisionHD Camera
 1f84  Alere, Inc.
+       1f7e  Lateral Flow Engine
 1f87  Stantum
        0002  Multi-touch HID Controller
 1f9b  Ubiquiti Networks, Inc.
        0241  AirView2-EXT
+       b0b1  UniFi VoIP Phone
 1fab  Samsung Opto-Electroncs Co., Ltd.
        104d  ES65
+1fac  Franklin Wireless
+       0232  U770 3G/4G Wimax/4G LTE Modem
+1fae  Lumidigm
+       0040  M311 Fingerprint Scanner
+       212c  M30x (Mercury) fingerprint sensor
+1fb2  Withings
+       0001  Wi-Fi Body Scale (WBS01)
+1fba  DERMALOG Identification Systems GmbH
 1fbd  Delphin Technology AG
        0001  Expert Key - Data aquisition system
 1fc9  NXP Semiconductors
        0003  LPC1343
+       000c  LPC4330FET180 [ARM Cortex M4 + M0] (device firmware upgrade mode)
+       0082  LPC4330FET180 [ARM Cortex M4 + M0] (mass storage controller mode)
        010b  PR533
+       0126  i.MX 7ULP SystemOnChip in RecoveryMode
        012b  i.MX 8M Dual/8M QuadLite/8M Quad Serial Downloader
+       5002  PTN5002 [Startech VGA/DVI-D adapter]
+       8124  SharkRF Bootloader
+       824c  LumiNode1
 1fde  ILX Lightwave Corporation
        0001  UART Bridge
 1fe7  Vertex Wireless Co., Ltd.
 1ff7  CVT Electronics.Co.,Ltd
        0013  CVTouch Screen (HID)
        001a  Human Interface Device
+1ffb  Pololu Corporation
+       0081  AVR Programmer
+       0083  Jrk 21v3 Motor Controller
+       0089  Micro Maestro 6-Servo Controller
+       008a  Mini Maestro 12-Channel Servo Controller
+       008b  Mini Maestro 18-Channel Servo Controller
+       008c  Mini Maestro 24-Channel Servo Controller
+       00b0  AVR Programmer v2
 1fff  Ideofy Inc.
+2000  CMX Systems
+       1f0c  HP StreamSmart 410 [NW278AA]
 2001  D-Link Corp.
        0001  DWL-120 WIRELESS ADAPTER
        0201  DHN-120 10Mb Home Phoneline Adapter
        1a00  DUB-E100 Fast Ethernet Adapter(rev.A) [ASIX AX88172]
        1a02  DUB-E100 Fast Ethernet Adapter(rev.C1) [ASIX AX88772]
        200c  10/100 Ethernet
+       3101  DWA-182 AC1200 DB Wireless Adapter(rev.A1) [Broadcom BCM43526]
        3200  DWL-120 802.11b Wireless Adapter(rev.E1) [Atmel at76c503a]
        3301  DWA-130 802.11n Wireless N Adapter(rev.C1) [Realtek RTL8192U]
        3306  DWL-G122 Wireless Adapter(rev.F1) [Realtek RTL8188SU]
        3308  DWA-121 802.11n Wireless N 150 Pico Adapter [Realtek RTL8188CUS]
        3309  DWA-135 802.11n Wireless N Adapter(rev.A1) [Realtek RTL8192CU]
        330a  DWA-133 802.11n Wireless N Adapter [Realtek RTL8192CU]
+       330d  DWA-131 802.11n Wireless N Nano Adapter (rev.B1) [Realtek RTL8192CU]
+       330f  DWA-125 Wireless N 150 Adapter(rev.D1) [Realtek RTL8188ETV]
+       3310  DWA-123 Wireless N 150 Adapter (rev.D1)
+       3314  DWA-171 AC600 DB Wireless Adapter(rev.A1) [Realtek RTL8811AU]
+       3315  DWA-182 Wireless AC Dualband Adapter(rev.C) [Realtek RTL8812AU]
+       3317  DWA-137 Wireless N High-Gain Adapter [Ralink RT5372]
+       3319  DWA-131 Wireless N Nano Adapter (Rev. E1) [Realtek RTL8192EU]
        3500  Elitegroup Computer Systems WLAN card WL-162
        3700  DWL-122 802.11b [Intersil Prism 3]
        3701  DWL-G120 Spinnaker 802.11g [Intersil ISL3886]
        3c19  DWA-125 Wireless N 150 Adapter(rev.A3) [Ralink RT5370]
        3c1a  DWA-160 802.11abgn Xtreme N Dual Band Adapter(rev.B2) [Ralink RT5572]
        3c1b  DWA-127 Wireless N 150 High-Gain Adapter(rev.A1) [Ralink RT3070]
+       3c1e  DWA-125 Wireless N 150 Adapter(rev.B1) [Ralink RT5370]
        4000  DSB-650C Ethernet [klsi]
        4001  DSB-650TX Ethernet [pegasus]
        4002  DSB-650TX Ethernet [pegasus]
        4003  DSB-650TX-PNA Ethernet [pegasus]
        400b  10/100 Ethernet
        4102  10/100 Ethernet
+       4a00  DUB-1312 Gigabit Ethernet Adapter
        5100  DSL-200 ADSL ATM Modem
        5102  DSL-200 ADSL Loader
        5b00  Remote NDIS Network Device
 2002  DAP Technologies
 2003  detectomat
        ea61  dc3500
+2006  LenovoMobile
+2009  iStorage
+       5004  datAshur 4GB
+       5016  datAshur 16GB
+       5032  datAshur 32GB
 200c  Reloop
        100b  Play audio soundcard
 2013  PCTV Systems
+       0242  QuatroStick 510e
        0245  PCTV 73ESE
        0246  PCTV 74E
        0248  PCTV 282E
+       024c  DVB-S2 Stick 460e
        024f  nanoStick T2 290e
+       0251  QuatroStick nano 520e
+       0258  DVB-S2 Stick 461e
+       025a  AndroiDTV 78e
+       025f  tripleStick 292e
+       0262  microStick 79e
+2018  Deutsche Telekom AG
+       0406  Eumex 800
+       0408  Eumex 800
 2019  PLANEX
        3220  GW-US11S WLAN [Atmel AT76C503A]
        4901  GW-USSuper300 802.11bgn Wireless Adapter [Realtek RTL8191SU]
        ed16  GW-USMicroN2W 802.11bgn Wireless Adapter [Realtek RTL8188SU]
        ed17  GW-USValue-EZ 802.11n Wireless Adapter [Realtek RTL8188CUS]
        ed18  GW-USHyper300 / GW-USH300N 802.11bgn Wireless Adapter [Realtek RTL8191SU]
+201e  Haier
+       2009  CE100 CDMA EVDO
+203a  PARALLELS
 203d  Encore Electronics Inc.
        1480  ENUWI-N3 [802.11n Wireless N150 Adapter]
 2040  Hauppauge
+       0265  WinTV-dualHD DVB
+       026d  WinTV-dualHD ATSC
        0c80  Windham
        0c90  Windham
+       1605  WinTV-HVR 930C HD
        1700  CataMount
        1800  Okemo A
        1801  Okemo B
        2011  WinTV MiniCard [Dell Digital TV Receiver]
        2019  Tiger Minicard
        2400  WinTV PVR USB2 (Model 24019)
+       4200  WinTV
        4700  WinTV Nova-S-USB2
        4902  HD PVR
        4903  HS PVR
        6500  WinTV HVR-900
        6502  WinTV HVR-900
        6503  WinTV HVR-930
-       6513  WinTV HVR-980
+       6513  WinTV HVR-950/HVR-980
+       6600  WinTV HVR-900H (Model 660xx)
        7050  Nova-T Stick
        7060  Nova-T Stick 2
        7070  Nova-T Stick 3
        9301  WinTV NOVA-T USB2 (warm)
        9941  WinTV Nova-T-500
        9950  WinTV Nova-T-500
+       b123  WinTV-HVR-955Q
+       b138  WinTV-HVR-900 model 00246 [WinTV-T Video]
        b910  Windham
        b980  Windham
        b990  Windham
        c000  Windham
        c010  Windham
 2047  Texas Instruments
-       0200  MSP430 USB HID Bootstrap Loader
+       0013  MSP eZ-FET lite
+       0014  MSP-FET
+       0200  MSP430 Bootloader
+       0203  eZ-FET Bootloader
+       0204  MSP-FET Bootloader
+       0300  MSP430 CDC Example
+       0301  MSP430 HID Datapipe Example
+       0302  MSP430 CDC+HID Example
+       0309  MSP430 HID Mouse Example
+       0313  MSP430 CDC+CDC Example
+       0314  MSP430 HID+HID Example
+       0315  MSP430 HID Keyboard Example
+       0316  MSP430 MSC File System Emulation Example
+       0317  MSP430 MSC SD Card Example
+       0318  MSP430 MSC Multiple LUNs Example
+       0319  MSP430 MSC+CDC+HID Example
+       0320  MSP430 SYSBIOS Tasks MSC+CDC+HID Example
+       0321  MSP430 SYSBIOS SWIs MSC+CDC+HID Example
+       0322  MSP430 MSC Double-Buffering Example
+       0323  MSP430 MSC CD-ROM Example
+       03df  MSP430 User Experiment
+       03e0  MSP430 User Experiment
+       03e1  MSP430 User Experiment
+       03e2  MSP430 User Experiment
+       03e3  MSP430 User Experiment
+       03e4  MSP430 User Experiment
+       03e5  MSP430 User Experiment
+       03e6  MSP430 User Experiment
+       03e7  MSP430 User Experiment
+       03e8  MSP430 User Experiment
+       03e9  MSP430 User Experiment
+       03ea  MSP430 User Experiment
+       03eb  MSP430 User Experiment
+       03ec  MSP430 User Experiment
+       03ed  MSP430 User Experiment
+       03ee  MSP430 User Experiment
+       03ef  MSP430 User Experiment
+       03f0  MSP430 User Experiment
+       03f1  MSP430 User Experiment
+       03f2  MSP430 User Experiment
+       03f3  MSP430 User Experiment
+       03f4  MSP430 User Experiment
+       03f5  MSP430 User Experiment
+       03f6  MSP430 User Experiment
+       03f7  MSP430 User Experiment
+       03f8  MSP430 User Experiment
+       03f9  MSP430 User Experiment
+       03fa  MSP430 User Experiment
+       03fb  MSP430 User Experiment
+       03fc  MSP430 User Experiment
+       03fd  MSP430 User Experiment
+       0401  MSP430 Keyboard Example
        0855  Invensense Embedded MotionApp HID Sensor
+       08f8  FDC2x14/LDC13xx/LDC16xx EVM
        0964  Inventio Software MSP430
+       0a76  GEOKON S-3810A-5 USB-RS485 CONVERTER
+       ffe7  HID v1.00 Device [Improv Device]
 2058  Nano River Technology
        2058  ViperBoard I2C, SPI, GPIO interface
 2077  Taicang T&W Electronics Co. Ltd
        0002  NOOKcolor
        0003  NOOK Simple Touch
        0004  NOOK Tablet
+       0005  BNTV600 [Nook HD+]
+       0006  BNTV400 [Nook HD]
+       0007  BNRV500 [Nook Glowlight]
+       000a  BNRV510 [Nook Glowlight Plus]
+       000b  BNRV520 [Nook Glowlight 3]
+       000c  BNRV700 [Nook Glowlight Plus]
 2086  SIMPASS
 2087  Cando
        0a01  Multi Touch Panel
        0a02  Multi Touch Panel
        0b03  Multi Touch Panel
 20a0  Clay Logic
+       0006  flirc
+       4107  GPF Crypto Stick V1.2
        4123  IKALOGIC SCANALOGIC 2
        414a  MDE SPI Interface
        415a  OpenPilot
        415b  CopterControl
        415c  PipXtreme
+       41e5  BlinkStick
+       4211  Nitrokey Start
+       4223  ATSAMD21 [castAR]
+       428d  Electrosense wideband converter
 20b1  XMOS Ltd
        10ad  XUSB Loader
        f7d1  XTAG2 - JTAG Adapter
        1540  ben-wpan, AT86RF230-based
        1db5  IDBG in DFU mode
        1db6  IDBG in normal mode
+       9db1  Glasgow Debug Tool
        c25b  C2 Dongle
        cb72  ben-wpan, cntr
+20bc  ShenZhen ShanWan Technology Co., Ltd.
+       5500  Frostbite controller
 20ce  Minicircuits
        0012  RF Sythesizer 250-4200MHz model SSG-4000LH
        0021  RF Switch Matrix
        0022  I/O Controller
 20df  Simtec Electronics
        0001  Entropy Key [UDEKEY01]
+20f0  L3Harris Technologies
+       2102  EWLA V2 Module
 20f1  NET New Electronic Technology GmbH
        0101  iCube3 Camera
 20f4  TRENDnet
+       646b  TEW-646UBH High Power 150Mbps Wireless N Adapter [Realtek RTL8188SU]
        648b  TEW-648UBM 802.11n 150Mbps Micro Wireless N Adapter [Realtek RTL8188CUS]
+       664b  TEW-664UB H/W:V2.0R
+       804b  TEW-804UB 802.11a/b/g/n/ac (1x1) Wireless Adapter [Realtek RTL8811AU]
+       805b  TEW-805UB 300Mbps+867Mbps Wireless AC Adapter [Realtek RTL8812AU]
+       806b  TEW-806UBH 802.11a/b/g/n/ac (1x1) Wireless Adapter [MediaTek MT7610U]
 20f7  XIMEA
        3001  MQ or MD camera
        3002  MU camera
        30b3  MQ in U3V mode or MC camera
        a003  MU camera
 2100  RT Systems
+       0e56  USB62C Radio Cable [Yaesu 857/D - 897/D]
+       9e50  USB-59 Radio Cable [Yaesu VX-8/D/DR]
        9e52  Yaesu VX-7
        9e54  CT29B Radio Cable
        9e57  RTS01 Radio Cable
+       9e58  USB63C Radio Cable [Yaesu FTDX-1200]
        9e5d  K4Y Radio Cable
        9e5f  FT232RL [RTS05 Serial Cable]
 2101  ActionStar
        0201  SIIG 4-to-2 Printer Switch
+       1402  Keyboard/Mouse Switch
+2104  Tobii Technology AB
+       0050  Eye tracker [EYEX2]
+       0124  Eyechip
+2107  RDING TECH CO.,LTD
 2109  VIA Labs, Inc.
+       0210  Hub
        0700  VL700 SATA 3Gb/s bridge
        0701  VL701 SATA 3Gb/s bridge
+       0711  VL711 SATA 6Gb/s bridge
+       0715  VL817 SATA Adaptor
        0810  VL81x Hub
        0811  Hub
        0812  VL812 Hub
+       0813  VL813 Hub
+       0820  VL820 Hub
+       2210  Hub
        2811  Hub
        2812  VL812 Hub
+       2813  VL813 Hub
+       2820  VL820 Hub
        3431  Hub
+       711f  External
        8110  Hub
 2113  Softkinetic
        0137  DepthSense 311 (3D)
        0145  DepthSense 325
        8000  DepthSense 311 (Color)
+2116  KT Tech
+       000a  IDE Hard Drive Enclosure
+211f  CELOT Corporation
+       6801  CDMA Products
+2123  Cheeky Dream
+       1010  Rocket Launcher
+2125  Fiberpro Inc.
+       0000  Bootloader
+       0010  MCB-100 Series
+2133  signotec GmbH
+       0001  LCD Signature Pad Sigma
+       0018  Delta Pen
+       0019  Delta Touch
+       001c  Kronos Pen
+       0022  Epsilon Pen
 2149  Advanced Silicon S.A.
        211b  Touchscreen Controller
+       2306  TS58xxA/TC56xxA [CoolTouch]
        2703  TS58xxA/TC56xxA [CoolTouch]
-2162  Creative (?)
+214b  Huasheng Electronics
+       7000  4-port hub [Maxxter ACT-HUB2-4P, HS8836, iSoul ultra-slim]
+214e  Swiftpoint
+       0005  Z - Gaming mouse [SM700]
+2162  Broadxent (Creative Labs)
        2031  Network Blaster Wireless Adapter
        500c  DE5771 Modem Blaster
        8001  Broadxent BritePort DSL Bridge 8010U
+2166  JVC Kenwood
+       600b  TH-D74
 2184  GW Instek
        0005  GDS-3000 Oscilloscope
        0006  GDS-3000 Oscilloscope
        0011  AFG Function Generator (CDC)
+       0017  DSO
+       0018  DSO
+       0036  AFG-125 Function Generator (CDC)
+2188  No brand
+       0610  Hub
+       0611  Hub
+       0620  Hub
+       0625  Hub
+       0754  Card Reader
+       4042  CalDigit Pro Audio
+219c  Seal One AG
+       0010  USB 2200 K Secure Sign Token
 21a1  Emotiv Systems Pty. Ltd.
        0001  EPOC Consumer Headset Wireless Dongle
+21a4  Electronic Arts Inc.
+       ac27  SPORTS Active 2 Wireless Controller for PS3
+       ac40  SPORTS Active 2 Wireless Controller for Wii
+21a9  Saleae, Inc.
+       1001  16-channel Logic Analyzer [Logic16]
+       1003  Logic 4
+       1004  Logic8
+       1005  Logic Pro 8
+       1006  Logic Pro 16
+21ab  Planeta Informatica
+       0010  RC700 NFC SmartCard Reader
+       0011  DSR700 SmartCard Reader
+21b4  AudioQuest
+       0081  DragonFly
+       0082  DragonFly Red
 21d6  Agecodagis SARL
        0002  Seismic recorder [Tellus]
 2207  Fuzhou Rockchip Electronics Company
        320c  RK3328 in Mask ROM mode
        330a  RK3368 in Mask ROM mode
        330c  RK3399 in Mask ROM mode
+221a  ZTEX GmbH
+       0100  FPGA Boards
 2222  MacAlly
        0004  iWebKey Keyboard
+       0005  ICEKey Keyboard
+       1001  Generic Hub
        2520  Mini Tablet
        4050  AirStick joystick
+2226  Copper Mountain technologies
 2227  SAMWOO Enterprise
        3105  SKYDATA SKD-U100
+222a  ILI Technology Corp.
+       0001  Multi-Touch Screen
+       0037  Multi-Touch Screen
+2230  Plugable
+       0001  UD-160-A / M Integrated Hub
+       0003  DC-125 / M Integrated Hub
 2232  Silicon Motion
        1005  WebCam SCB-0385N
+       1024  Webcam SC-13HDL11624N [Namuga Co., Ltd.]
        1028  WebCam SC-03FFL11939N
        1029  WebCam SC-13HDL11939N
        1037  WebCam SC-03FFM12339N
+       1045  WebCam SC-10HDP12631N
 2233  RadioShack Corporation
        6323  USB Electronic Scale
 2237  Kobo Inc.
        4161  eReader White
+       4163  Touch
+       4173  Glo
+2245  Aspeed Technology, Inc.
+       1500  AST1500/1510 PC-over-LAN Virtual Hub
 224f  APDM
        0001  Access Point
        0002  Docking Station
        0006  V2 Docking Station
        0007  V2 Access Point ACM
        0008  V2 Access Point
+2256  Faderfox
+       1007  LV3 MIDI Controller
 225d  Morpho
        0001  FINGER VP Multimodal Biometric Sensor
        0008  CBM-E3 Fingerprint Sensor
-       0009  CBM Fingerprint Sensor [CBM-V3]
+       0009  CBM-V3 Fingerprint Sensor
        000a  MSO1300-E3 Fingerprint Sensor
-       000b  MSO1300 Fingerprint Sensor [MSO1300-V3]
+       000b  MSO1300-V3 Fingerprint Sensor
        000c  MSO1350-E3 Fingerprint Sensor & SmartCard Reader
-       000d  MSO1350 Fingerprint Sensor & SmartCard Reader [MSO1350-V3]
+       000d  MSO1350-V3 Fingerprint Sensor & SmartCard Reader
        000e  MorphoAccess SIGMA Biometric Access Control Terminal
+       9015  Tablet 2
+       9024  Tablet 2
+       9039  Tablet 2 secure multifunction biometric tablet
+       904d  Tablet 2 secure multifunction biometric tablet
+       904e  Tablet 2 secure multifunction biometric tablet
+       9091  Tablet 2 secure multifunction biometric tablet
+       9092  Tablet 2 secure multifunction biometric tablet
+       f000  Tablet 2 secure multifunction biometric tablet
+       f003  Tablet 2 secure multifunction biometric tablet
+       f006  Tablet 2 secure multifunction biometric tablet
+       f00e  Tablet 2 secure multifunction biometric tablet
+226e  DISPLAX
 228d  8D Technologies inc.
        0001  Terminal Bike Key Reader
+22a4  VERZO Technology
 22a6  Pie Digital, Inc.
        ffff  PieKey "beta" 4GB model 4E4F41482E4F5247 (SM3251Q BB)
+22a7  Fortinet Technologies
+       1001  FortiGate Device
+22b1  Secret Labs LLC
+       1000  Netduino MCU pcb
 22b8  Motorola PCS
        0001  Wally 2.2 chipset
        0002  Wally 2.4 chipset
        0005  V.60c/V.60i GSM Phone
+       002e  XT1806
        0830  2386C-HT820
        0833  2386C-HT820 [Flash Mode]
        0850  Bluetooth Device
        2ac1  MSM6100 chipset
        2ac3  MSM6100 chipset flash
        2d78  XT300[SPICE]
+       2e82  XT1541 [Moto G 3rd Gen]
+       2e83  XT1033 [Moto G], PTP mode
        3001  A835/E1000 GSM Phone (P2K)
        3002  A835/E1000 GSM Phone (AT)
        3801  C350L/C450 (P2K)
        4234  MPc CDMA
        4244  MPx100 Smartphone
        4285  Droid X (Mass storage)
+       42d9  XT910 [Droid RAZR]
        4801  Neptune LTS chipset
        4803  Neptune LTS chipset flash
        4810  Triplet GSM Phone (storage)
        6101  Talon integrated chipset
        6401  Argon chipset
        6403  Argon chipset flash
+       6411  ROKR Z6 (print mode)
        6415  ROKR Z6 (MTP mode)
+       6422  ROKR Z6 (modem mode)
+       6426  ROKR Z6 (storage mode)
        6604  Washington CDMA Phone
        6631  CDC Modem
        7001  Q Smartphone
+       7086  Atrix
+       70a8  Xoom Tablet
        fe01  StarTAC III MS900
 22b9  eTurboTouch Technology, Inc.
        0006  Touch Screen
 22ba  Technology Innovation Holdings, Ltd
+       0108  Double Shock Steering Wheel HID
+       0109  Double Shock Steering Wheel Hub
+22c9  StepOver GmbH
+       0601  naturaSign Pad Colour
+       0701  naturaSign Pad Mobile
+       0801  naturaSign Pad Comfort
+       0881  naturaSign Pad Flawless
+       0901  naturaSign Pad Classic
+       09e1  naturaSign Pad Biometric
+       0ce1  duraSign Pad Brilliance
+       0cf1  duraSign Pad Biometric 5.0
+       0d01  duraSign 10.0
+       0df1  duraSign Pad Biometric 10.0
+22cd  Kinova Robotics Inc.
+22d4  Laview Technology
+       1301  Mionix NAOS 8200 [STM32F103 MCU]
+       1308  Mionix Avior 7000
+       130c  Mionix Naos 7000
+       1316  Mionix Castor
+22d9  OPPO Electronics Corp.
+       2765  Oppo N1
+       2767  Oppo Find 5 (X909)
+22db  Phase One
+       0003  IQ3 100MP IG030372
+22dc  Mellanox Technologies
+       0004  BlueField SOC
+22de  WeTelecom Incorporated
+22df  Medicom MTD, Ltd
 22e0  secunet Security Networks AG
        0002  SINA Flash Drive
        0003  SINA ID Token A
+22e8  Cambridge Audio
+       6512  651N Audio
+       6969  Audio Prototype
+       7512  751R Audio
+       770a  X70A Audio
+       850c  851C Audio [Azur 850C]
+       851d  851D Audio [Azur 851D]
+       ca02  Audio
+       ca04  Audio
+       ca06  AmpMagic
+       dac2  DacMagic Plus
+       dac3  Azur DacMagic 100
+       dac4  Azur DacMagic 100
+       dac6  DacMagicXS 2.0
+       dac8  Audio
 2304  Pinnacle Systems, Inc.
        0109  Studio PCTV USB (SECAM)
        0110  Studio PCTV USB (PAL)
        0419  PCTV Bungee USB (PAL) with FM radio
        061d  PCTV Deluxe (NTSC) Device
        061e  PCTV Deluxe (PAL) Device
+       2304  1689
+230d  Teracom
+       0103  Huwaii 3g wireless modem
+2314  INQ Mobile
 2318  Shining Technologies, Inc. [hex]
        0011  CitiDISK Jr. IDE Enclosure
+2319  Tronsmart
+       0014  TSM01 Air Mouse + Keyboard
+232b  Pantum Ltd.
+       0810  P2000
+232e  EA Elektro-Automatik GmbH & Co. KG
+       0010  EA-PS-2000 B Series Power Supply
+2340  Teleepoch
 2341  Arduino SA
        0001  Uno (CDC ACM)
        0010  Mega 2560 (CDC ACM)
+       0036  Leonardo Bootloader
        003b  Serial Adapter (CDC ACM)
+       003d  Due Programming Port
+       003e  Due
        003f  Mega ADK (CDC ACM)
        0042  Mega 2560 R3 (CDC ACM)
        0043  Uno R3 (CDC ACM)
        0044  Mega ADK R3 (CDC ACM)
        0045  Serial R3 (CDC ACM)
+       0049  ISP
        8036  Leonardo (CDC ACM, HID)
+       8038  Robot Control Board (CDC ACM, HID)
+       8039  Robot Motor Board (CDC ACM, HID)
+2349  P2 Engineering Group, LLC
+234b  Free Software Initiative of Japan
+       0000  Gnuk Token
+       0001  NeuG True RNG
 2357  TP-Link
+       0005  M7350 4G Mi-Fi Router
        0100  TL-WN8200ND [Realtek RTL8192CU]
        0101  RTL8812AU Archer T4U 802.11ac
        0103  Archer T4UH wireless Realtek 8812AU
        0105  Archer T1U 802.11a/n/ac Wireless Adapter [MediaTek MT7610U]
        0106  Archer T9UH v1 [Realtek RTL8814AU]
-       0107  TL-WN821N Version 5 RTL8192EU
+       0107  TL-WN821N v5/v6 [RTL8192EU]
        0108  TL-WN822N Version 4 RTL8192EU
-       0109  TL WN823N RTL8192EU
-       010c  TL-WN722N v2
-       010e  TL-WN722N v2
+       0109  TL-WN823N v2/v3 [Realtek RTL8192EU]
+       010b  Archer T2UHP [MediaTek MT7610U]
+       010c  TL-WN722N v2/v3 [Realtek RTL8188EUS]
+       010d  Archer T4U v2 [Realtek RTL8812AU]
+       010e  Archer T4UH v2 [Realtek RTL8812AU]
+       010f  Archer T4UHP [Realtek RTL8812AU]
+       0115  Archer T4U ver.3
+       011e  AC600 wireless Realtek RTL8811AU [Archer T2U Nano]
+       0120  Archer T2U PLUS [RTL8821AU]
+       012d  Archer T3U [Realtek RTL8812BU]
        0200  MA 180 Zero CD
        0201  HSUPA Modem MA180
+       0600  UE300 10/100/1000 LAN (mass storage CD-ROM mode) [Realtek RTL8153]
+       0601  UE300 10/100/1000 LAN (ethernet mode) [Realtek RTL8153]
+2366  Bitmanufaktur GmbH
+       0001  Reserved Prototyping PID
+       0002  OpenBeacon USB 2
+       0003  OpenPCD 2 RFID Reader for 13.56MHz
+       0004  OpenBeacon
+       0005  Blinkenlights WDIM
+       0006  Blinkenlights WMCU
+       0007  OpenBeacon Ethernet EasyReader PoE II - Active 2.4GHz RFID Reader
+       0008  OpenBeacon WLAN
+       0009  OpenPCD 2 RFID Reader for 13.56MHz
+       000a  OpenPCD 2 Audio & LCD Display
+2367  Teenage Engineering
+       0002  OP-1 Portable synthesizer
+       000c  OP-Z Portable synthesizer
+2368  Peterson Electro-Musical Products Inc.
+       0001  BBS-1 [BodyBeat Sync]
+236a  SiBEAM
+       1965  SB6501 802.11ad Wireless Network Adapter
 2373  Pumatronix Ltda
        0001  5 MegaPixel Digital Still Camera [DSC5M]
 2375  Digit@lway, Inc.
        0001  Digital Audio Player
+2378  OnLive
+       100a  Universal Wireless Controller
+237d  Cradlepoint
+       0400  MC400
+2386  Raydium Corporation
+       3125  Touch System
+       4328  Touch System
+       432f  Touch System
+238b  Hytera Communications
+       0a11  DMR Radio
+239a  Adafruit
+       0001  CDC Bootloader
+       801e  Trinket M0
+23a0  BIFIT
+       0001  Token iBank2key
+       0002  iBank2Key Type M Token
+       0003  iToken
+       0008  MS_KEY K - Angara
+23a6  Tronical Components GmbH
+       2000  Gibson Firebird X Pedal Board
+       2001  Gibson Firebird X Switch Board
+23b4  Dental Wings Inc.
+       0200  DW0200 Color Camera
+       0300  DW0300 Hight Speed Monochrome Camera
+23c7  Gemini
+       1021  FirstMix
+23fc  SesKion GmbH
+       0201  SPI-Simulyzer box for SPI data communication
+       0202  PSI5-Simulyzer box for PSI5 (Peripheral-Sensor-Interfacs) data communication
+       0203  SENT-Simulyzer box for SENT data communication
+       0204  DSI-Simulyzer box for DSI3 data communication
+2405  Custom Computer Services, Inc
+       0002  West Mountain Radio RIGblaster Advantage Audio
+       0003  West Mountain Radio RIGblaster Advantage
 2406  SANHO Digital Electronics Co., Ltd.
        6688  PD7X Portable Storage
+2420  IRiver
+242e  Vossloh-Schwabe Deutschland GmbH
+       0001  DALI Master
+       0002  LiCS Bootloader Mode
+       0003  LiCS Running Mode
+       0004  iProgrammer
+       0005  NFC programming device
+2433  ASETEK
+       b200  [NZXT Kraken X60]
 2443  Aessent Technology Ltd
        00dc  aes220 FPGA Mini-Module
+2457  Ocean Optics Inc.
+       100a  HR2000 Spectrometer 1.00.0
+       1012  HR4000 Spectrometer
+2458  Bluegiga Technologies
+       0001  BLED112 Bluetooth 4.0 Single Mode Dongle
+245f  Chord Electronics Limited
+2464  Nest
+       0001  Learning Thermostat
+       0002  Learning Thermostat (2nd Generation)
+       0010  Protect : Smoke + Carbon Monoxide
+       0020  Heat Link
+2466  Fractal Audio Systems
+       8003  Axe-Fx II
+       8010  Axe-FX III
+2476  YEI Technology
+       1040  3-Space Embedded Sensor
 2478  Tripp-Lite
        2008  U209-000-R Serial Port
 248a  Maxxter
        8366  Wireless Optical Mouse ACT-MUSW-002
+       8367  Telink Wireless Receiver
 249c  M2Tech s.r.l.
+24a4  Primare AB
+       0002  I15_v1.06 [Primare Audio DAC]
+24ae  Shenzhen Rapoo Technology Co., Ltd.
+       0001  KX Keyboard
+       0197  meva Barcode Scanner
+       1813  E9260 Wireless Multi-mode Keyboard
+       2000  2.4G Wireless Device Serial
+       2001  5 GHz Wireless Receiver
+       2003  5GHz Wireless Transceiver
+       4110  Optical Gaming Mouse [V280]
+       6000  Wireless Audio
+24c0  Chaney Instrument
+       0003  Model 01036 weather center
+24c6  ThrustMaster, Inc.
+       5000  Razer Atrox Gaming Arcade Stick
+       5300  PowerA Mini ProEX Controller for Xbox 360
+       5303  Airflo Wired Controller for Xbox 360
+       530a  ProEX Controller for Xbox 360
+       531a  Pro Ex mini for XBOX
+       5397  FUS1ON Tournament Controller
+       541a  PowerA CPFA115320-01 [Mini Controller for Xbox One]
+       542a  Spectra for Xbox One
+       543a  PowerA Wired Controller for Xbox One
+       5500  Horipad EX2 Turbo
+       5501  Hori Real Arcade Pro.VX-SA for Xbox 360
+       5502  Hori Fighting Stick VX Alt for Xbox 360
+       5503  Hori Fighting Edge for Xbox 360
+       5506  Hori Soulcalibur V Stick for Xbox 360
+       550d  Hori Gem Controller for Xbox 360
+       550e  Real Arcade Pro V Kai for Xbox One / Xbox 360
+       551a  Fusion Pro Controller
+       561a  Fusion Controller for Xbox One
+       5b00  Ferrari 458 Italia Racing Wheel
+       5b02  GPX Controller
+       5d04  Sabertooth Elite
+       fa00  INF-8032385 Disney Infinity Reader
+       fafb  Aplay Controller
+       fafd  Afterglow Gamepad for Xbox 360
+       fafe  Rock Candy Gamepad for Xbox 360
+24cf  Lytro, Inc.
+       00a1  Light Field Camera
+24dc  Aladdin R.D.
+       0406  JaCarta SF GOST
+24e0  Yoctopuce Sarl
 24e1  Paratronic
        3001  Adp-usb
        3005  Radius
+24e3  K-Touch
+24ea  Meva
+       0197  Barcode Scanner
+24ed  Zen Group
+       044d  Chat Headset
+24f0  Metadot
+       0105  Das Keyboard 4
+       0140  Das Keyboard 4
+       2020  Das Keyboard 5Q
+24ff  Acroname Inc.
+2500  Ettus Research LLC
+       0020  USRP B210
+       0021  USRP B200-mini
+       0022  USRP B205-mini
+       0200  USRP B200
 2516  Cooler Master Co., Ltd.
        0003  Storm Xornet
        0004  Storm QuickFire Rapid Mechanical Keyboard
        0006  Storm Recon
        0007  Storm Sentinel Advance II
        0009  Storm Quick Fire PRO
-       0011  Storm Quick Fire TK
+       0011  Storm Quick Fire TK 6keys
+       0014  Storm Quick Fire TK Nkeys
+       0015  Storm QuickFire Pro/Ultimate keyboard
        0017  CM Storm Quick Fire Stealth
+       001a  Storm Quick Fire XT
        0020  QuickFire Rapid-i Keyboard
        0027  CM Storm Coolermaster Novatouch TKL
        002d  Alcor mouse
+       0042  Masterkeys Lite L Combo RGB Keyboard
+       0044  Masterkeys Lite L Combo RGB Mouse
+       0046  Masterkeys PRO L
        0047  MasterKeys Pro L
+       0055  MasterKeys L
+       1006  MasterCase SL600M
        9494  Sirus Headset
+2520  ANA-U GmbH
+       0001  EasyPrinter S3
+2527  Software Bisque
+       1388  Paramount 5
+2537  Norelsys
+       1066  NS1066
+       1068  NS1068/NS1068X SATA Bridge Controller
+2544  Energy Micro AS
+2546  Ravensburger
+       e301  TipToi Pen
 2548  Pulse-Eight
        1001  CEC Adapter
        1002  CEC Adapter
+254e  SHF Communication Technologies AG
+       e2b3  SHF 58035 A BiasBoard
+2554  ASSA ABLOY AB
+2555  Basis Science Inc.
+       0001  B1 Fitness Band
+255e  Beijing Bonxeon Technology Co., Ltd.
+       0001  Device
+       0002  Dual
+2560  e-con Systems
+       c152  See3CAM_CU51 5 Mpx monochrome camera
+2563  ShenZhen ShanWan Technology Co., Ltd.
+       031d  DXT Mouse
+       0523  BM0523 WirelessGamepad
+       0575  ZD-V+ Wired Gaming Controller
+256b  Perreaux Industries Ltd
+       0121  Audiant 80i
+256f  3Dconnexion
+       c62e  SpaceMouse Wireless (cabled)
+       c62f  SpaceMouse Wireless Receiver
+       c631  SpaceMouse Pro Wireless (cabled)
+       c632  SpaceMouse Pro Wireless Receiver
+       c633  SpaceMouse Enterprise
+       c635  SpaceMouse Compact
+       c651  CadMouse Wireless
+       c652  Universal Receiver
+       c654  CadMouse Pro Wireless
+       c657  CadMouse Pro Wireless Left
+2573  ESI Audiotechnik GmbH
+       0017  MAYA22
+2574  AVer Information, Inc.
+       0901  VC520
+       0910  CAM520
+       0920  VC320
+       0930  CAM530
+       0940  CAM340
+       0950  VC322
+       0960  VB342
+2575  Weida Hi-Tech Co., Ltd.
+2576  AFO Co., Ltd.
+       0003  TCM
+       0005  BL [Boot Loader]
+       0011  THM
+2578  Pluscom
+       4168  2.4GHZ Wireless Arc Folding Mouse
+2581  Plug-up
+       1807  Generic HID Smartcard
+       1808  WinUSB Smartcard
+       f1d0  FIDO U2F Security Key
+258d  Sequans Communications
+259a  TriQuint Semiconductor
+25a7  Areson Technology Corp
+       2410  Laser mouse
+       fa23  2.4G Receiver
+       fa61  Elecom Co., Ltd MR-K013 Multicard Reader
 25b5  FlatFrog
        0002  Multitouch 3200
+25bb  Brunner Elektronik AG
+       0063  PRT.5105 [Yoke]
+       0064  PRT.5105 [reserved]
+       0065  PRT.5096 [Battery Management System]
+       0066  PRT.5096 [Battery Management System]
+       0067  PRT.5094
+       0068  PRT.5094
+       0069  PRT.5119 [Ethernet2CAN LC Gateway]
+       006a  PRT.5113 [CLS CANaerospace Gateway]
+       006b  PRT.5123
+       006c  PRT.5123 [reserved]
+       006d  PRT.5127
+       00ff  MSP430 HID Update Agent
+25bf  Elegant Invention
+       0001  Isostick
+       0002  Isostick updater
+25c4  ARCAM
+25c6  Vitus Audio (AVA Group A/S)
+25c8  Visual Planet Ltd
+       0014  Single User touchfoil(tm) (SU2-80)
+25da  Netatmo
+       0001  Weather Station
+25e3  Lumigon
+25f0  ShanWan
+       c131  Gioteck PS3 2.4G Wireless Controller
+25fb  Pentax Ricoh Imaging Co., Ltd
+       0102  K-5
+2604  Tenda
+       0012  U12
+2625  MilDef AB
+2626  Aruba Networks
+       ea60  UART Bridge Controller [cp210x]
+262a  SAVITECH Corp.
+       100e  SA9027 Audio Streaming Controller
+       10e0  SA9023 Audio Streaming Controller
+       9020  SA9020 audio controller
+       9023  SA9023 audio controller
+       9027  SA9027 audio controller
+       9226  SA9226 192KHz audio controller
+       9227  SA9227 384KHz audio controller
+       9228  SA9228 384KHz/DSD audio controller
 2632  TwinMOS
        3209  7-in-1 Card Reader
 2639  Xsens
        0102  Awinda Dongle
        0103  Sync Station
        0200  MTw
+       0300  Motion Tracker Development Board
+       0301  MTi Converter
        d00d  Wireless Receiver
+264a  Thermaltake
+       1004  Ventus
 2650  Electronics For Imaging, Inc. [hex]
+       1311  eBeam Classic [Luidia]
 2659  Sundtek
        1101  TNT DVB-T/DAB/DAB+/FM
        1201  FM Transmitter/Receiver
        1211  MediaTV Pro III (US)
        1212  MediaTV Pro III MiniPCIe (EU)
        1213  MediaTV Pro III MiniPCIe (US)
+2662  Moog Music Inc.
+266e  Silicon Integrated Systems
+2672  GoPro
+       0004  Hero 3
+       0006  HERO 3+ Silver Edition
+       0007  HERO 3+ Black
+       000e  HERO4 Black
+       0011  Hero 3+ Black
 2676  Basler AG
        ba02  ace
+       ba03  ba03 dart Vision Caera
+       ba04  ba04 pulse Vision Camera
+       ba05  Vision Camera
+       ba06  Vision Camera
+       ba07  Vision Camera
+       ba08  Vision Camera
+       ba09  Vision Camera
+       ba0a  Vision Camera
+       ba0b  Vision Camera
+       ba0c  Vision Camera
+       ba0d  Vision Camera
+       ba0e  Vision Camera
+       ba0f  Vision Camera
+2685  Cardo Peripheral Systems LTD
+       0900  [Packtalk Bold Bluetooth Motorcycle Intercom]
+2687  Fitbit Inc.
+       fb01  Base Station
+2689  StepOver International GmbH
+       0601  naturaSign Pad POS
+       0901  naturaSign Pad Light
+       0ce1  Pad Vivid US
+       0cf1  Pad Biometric US 5.0
+       0d01  duraSign Pad US 10.0
+       0df1  duraSign Pad Biometric US 10.0
+268b  Dimension Engineering
+       0101  DELink 2
+       0201  Sabertooth 2x32
+       0405  Evolv DNA 200
+       0406  Evolv DNA 200
+       0407  Evolv DNA 200
+       0408  Evolv DNA 75
+       0409  Evolv DNA 250
+       0412  Evolv DNA 60
+       0413  Evolv DNA 200
+       0414  Evolv DNA 250
+       0415  Evolv DNA 75
+       0416  Evolv DNA 60
+       0417  Evolv DNA Go
+       0419  Evolv DNA 250 Color
+       0423  Evolv DNA 200
+       0424  Evolv DNA 250
+       0425  Evolv DNA 75
+       0426  Evolv DNA 60
+       8405  Evolv DNA 200 (recovery mode)
+       8406  Evolv DNA 200 (recovery mode)
+       8407  Evolv DNA 200 (recovery mode)
+       8408  Evolv DNA 75 (recovery mode)
+       8409  Evolv DNA 250 (recovery mode)
+       8412  Evolv DNA 60 (recovery mode)
+       8413  Evolv DNA 200 (recovery mode)
+       8414  Evolv DNA 250 (recovery mode)
+       8415  Evolv DNA 75 (recovery mode)
+       8416  Evolv DNA 60 (recovery mode)
+       8423  Evolv DNA 200 (recovery mode)
+       8424  Evolv DNA 250 (recovery mode)
+       8425  Evolv DNA 75 (recovery mode)
+       8426  Evolv DNA 60 (recovery mode)
+26a9  Research Industrial Systems Engineering
+       0001  Payment Terminal v1.0
+26aa  Yaesu Musen
+       0001  FT-1D
+       000e  FTA-550
+       000f  FTA-750
+26b5  Electrocompaniet
+       0002  ECD 2
+       0003  ECD 2 (Audio Class 1)
+       0004  PI 2D
+       0005  PI 2D (Audio Class 1)
+       0006  ECI 6
+       0007  ECI 6 (Audio Class 1)
+       0020  ECI 80
+26bd  Integral Memory
+       9917  Fusion Flash Drive
+26e2  Ingenieurbuero Dietzsch und Thiele, PartG
+26f2  Micromega
+       0200  MyDac
+2707  Bardac Corporation
+       0005  drive.web
+270d  Rosand Technologies
+       1001  R-Idge Bootloader
+       1002  R-Idge Router
 2717  Xiaomi Inc.
        0011  100Mbps Network Card Adapter
        0360  Mi3W
        ff68  Mi-4c
        ff80  Mi/Redmi series (RNDIS)
        ff88  Mi/Redmi series (RNDIS + ADB)
+272a  StarLeaf Ltd.
+272c  Signum Systems
+       7d13  I-jet
 2730  Citizen
+       0fff  CT-S2000/4000/310/CLP-521/621/631/CL-S700 Series
+       1004  PPU-700
+       2002  CT-S2000 Thermal Printer (Parallel mode)
        200f  CT-S310 Label printer
 2735  DigitalWay
        0003  MPIO HS100
        1003  ColorHug+ Bootloader
        1004  ColorHug2
        1005  ColorHug2 bootloader
+2756  Victor Hasselblad AB
+       0002  X1D Camera
+2759  Philip Morris Products S.A.
+       0003  IQOS Pocket Charger 2.4
+2765  Firstbeat Technologies, Ltd.
+       0004  Bodyguard 2
+2766  LifeScan
+       0000  OneTouch Verio
 2770  NHJ, Ltd
        0a01  ScanJet 4600 series
        905c  Che-Ez Snap SNAP-U/Digigr8/Soundstar TDC-35
        915d  Cyberpix S-210S / Little Tikes My Real Digital Camera
        930b  CCD Webcam(PC370R)
        930c  CCD Webcam(PC370R)
+27a8  Square, Inc.
+       a120  Contactless + Chip Reader
 27b8  ThingM
        01ed  blink(1)
+27bd  Codethink Ltd.
+       0001  Slab Node Manager
+       0002  Slab Node Manager JTAG
+27c0  Cadwell Laboratories, Inc.
+       0818  Paperlike HD-FT
 27c6  Shenzhen Goodix Technology Co.,Ltd.
        5117  Fingerprint Reader
        5201  Fingerprint Reader
        5301  Fingerprint Reader
        530c  Fingerprint Reader
+       532d  Fingerprint
+       5381  Fingerprint Reader
        5385  Fingerprint Reader
        538c  Fingerprint Reader
        5395  Fingerprint Reader
        5584  Fingerprint Reader
        55b4  Fingerprint Reader
        5740  Fingerprint Reader
+27d4  Blackstar Amplification Limited
+27dd  Mindeo
+       0002  Mindeo Virtual COM Port
+27f2  Softnautics LLP
+2803  StarLine LLC.
+       0001  Controller Area Network car alarm module [SLCAN-2]
+2806  SIMPASS
+       0001  N-PASS X1
+2817  Signal Hound, Inc.
+       0002  BB60C Spectrum Analyzer
+       0004  SM200A Spectrum Analyzer
+2818  Codex Digital Limited
+       0001  Transfer Drive Dock
 2821  ASUSTek Computer Inc.
        0161  WL-161 802.11b Wireless Adapter [SiS 162U]
        160f  WL-160g 802.11g Wireless Adapter [Envara WiND512]
        3300  WL-140 / Hawking HWU36D 802.11b Wireless Adapter [Intersil PRISM 3]
+2822  REFLEXdigital
+2833  Oculus VR, Inc.
+       0001  Rift Developer Kit 1
+       0021  Rift DK2
+       0031  Rift CV1
+       0101  Latency Tester
+       0137  Quest Headset
+       0201  Camera DK2
+       0211  Rift CV1 Sensor
+       0330  Rift CV1 Audio
+       1031  Rift CV1
+       2021  Rift DK2
+       2031  Rift CV1
+       3031  Rift CV1
+2836  OUYA
+286b  STANEO SAS
+       0003  D6BB/D9 seismic digitizer
+2886  Seeed Technology Co., Ltd.
+       0002  Seeeduino Lite
+2890  Teknic, Inc
+       0213  ClearPath 4-axis Comm Hub
 2899  Toptronic Industrial Co., Ltd
        012c  Camera Device
 289b  Dracal/Raphnet technologies
        000a  Dreamcast (Keyboard mode)
        000b  Gamecube/N64 controller v2.9 (Keyboard mode)
        000c  Gamecube/N64 controller v2.9 (Joystick mode)
+       000e  VirtualBoy controller
+       0010  WUSBMote v1.2 (Joystick mode)
+       0011  WUSBMote v1.2 (Mouse mode)
+       0012  WUSBMote v1.2.1 (Joystick mode)
+       0013  WUSBMote v1.2.1 (Mouse mode)
+       0014  WUSBMote v1.3 (Joystick mode)
+       0015  WUSBMote v1.3 (Mouse mode)
+       0016  WUSBMote v1.3 (I2C interface mode)
+       0017  Gamecube/N64 controller v3.0
+       0018  Atari Jaguar controller
+       0019  MultiDB9joy v3
+       001a  MultiDB9joy v3 (multitap mode)
        0100  Dual-relay board
        0500  Energy meter
        0502  Precision barometer
+289d  Seek Thermal, Inc.
+       0010  PIR206 Thermal Camera [Seek Compact]
+28bd  XP-Pen
+       0920  Star G960 Graphic Tablet
+28c7  Ultimaker B.V.
+       0001  3D printer serial interface
+28d4  Devialet
+       0008  120/200/250/400/800/D-Premier
 28de  Valve Software
        1102  Wired Controller
        1142  Wireless Steam Controller
        2000  Lighthouse FPGA RX
+       2012  Virtual Reality Controller [VRC]
        2101  Watchman Dongle
+       2500  Lighthouse Base Station
+28e0  PT. Prasimax Inovasi Teknologi
+       1001  BTS Monitoring Config for Prototype
+       5740  TRUMON TS-107
+       5741  TRUMON TS-108
+28e9  GDMicroelectronics
+       0189  GD32 DFU Bootloader (Longan Nano)
+28f3  Clover Network, Inc.
+       2000  Mobile Wi-Fi (C200)
+       3000  Mini
+       4000  Flex
+28f9  Profitap HQ BV
+       0001  Profishark 1G Black
+       0003  Profishark 1G+
+       0004  Profishark 1G
+       0005  Profishark 10G
+       0006  Profishark 100M
+290c  R. Hamilton & Co. Ltd.
+       4b4d  Mercury iPod Dock
+2912  Audioengine
+       20c8  D1 24-bit DAC
+       30c8  D1 24-bit DAC
+2916  Yota Devices
 2931  Jolla Oy
        0a01  Jolla Phone MTP
        0a02  Jolla Phone Developer
        0a05  Jolla PC connection
+       0a07  Phone MTP
        0afe  Jolla charging only
 2939  Zaber Technologies Inc.
        4959  A-MCB2
        495a  X-MCB1
        495b  X-MCB2
+       49b1  X-MCB1
+       49b2  X-MCB2
+       49c1  X-MCC1
+       49c2  X-MCC2
+       49c3  X-MCC3
+       49c4  X-MCC4
+2957  Obsidian Research Corporation
+       0001  Management Console
+2961  Miselu
+       0001  C.24 keyboard
+296b  Xacti Corporation
+       3917  CX-WE100 Camera
+2972  FiiO Electronics Technology
+       0007  X3 2nd gen audio player / DAC
+298d  Next Biometrics
+       2020  NB-2020-U Fingerprint Reader
+29bd  Silicon Works
+       4101  Multi-touch Device
+29c1  Taztag
+       1105  M17-G903-1 [Tazpad]
+       1107  M17-G903-A [Tazpad] (CCID)
+29c2  Lewitt GmbH
+       0001  DGT 650
+       0003  DGT 450
+       0009  DGT 260
+       0011  Stream 4x5
+29c3  Noviga
+29e2  Huatune Technology (Shanghai) Co., Ltd.
+29e7  Brunel University
+29e8  4Links Limited
+29ea  Kinesis Corporation
+       0102  Advantage2 Keyboard
+29f1  Canaan Creative Co., Ltd
+       33f1  Avalon nano 1.0
+       33f2  Avalon USB2IIC Converter
+       33f3  Avalon nano 2.0
+       40f1  Avalon4 mini
 2a03  dog hunter AG
        0001  Linino ONE (bootloader)
        0036  Arduino Leonardo (bootloader)
        0038  Arduino Robot Control (bootloader)
        0039  Arduino Robot Motor (bootloader)
        003a  Arduino Micro ADK rev3 (bootloader)
-       003b  Arduino Serial
+       003b  Arduino usb2serial
        003c  Arduino Explora (bootloader)
        003d  Arduino Due (usb2serial)
        003e  Arduino Due
        803c  Arduino Explora (CDC ACM)
        8041  Arduino Yun (CDC ACM)
        804d  Arduino Zero Pro (CDC ACM)
+2a0e  Shenzhen DreamSource Technology Co., Ltd.
+2a13  Grabba International
+       0000  S-Series data capture device
+2a19  Numato Systems Pvt. Ltd
+       1002  Mimas V2 Spartan6 FPGA Development Board
+       5440  TimVideos' HDMI2USB Opsis (FX2) - Unconfigured device
+       5441  TimVideos' HDMI2USB Opsis (FX2) - Firmware load/upgrade
+       5442  TimVideos' HDMI2USB Opsis (FX2) - HDMI/DVI Capture Device
+2a1d  Oxford Nanopore Technologies, Ltd
+       0000  MinION
+       0001  MinION
+       0010  VolTRAX
+       0011  VolTRAX
+       0020  GridION
+       0021  GridION
 2a37  RTD Embedded Technologies, Inc.
        5110  UPS35110/UPS25110
+2a39  RME
+       3fb0  Babyface Pro (Class Compliant Mode)
+       3fc0  Babyface Pro
+       3fc1  Fireface UFX+
+       3fc2  Fireface UFX+
+       3fd1  Fireface UFX+
+2a3c  Trinamic Motion Control GmbH & Co KG
+       0100  Stepper Device
+       0200  BLDC/PMSM Device
+       0300  Motor Control Device
+       0400  Motor Control Device
+       0500  PANdrive(TM)
+       0600  motionCookie(TM)
+       0700  Evaluation Device
+       0800  Interface Device
+       0900  Generic Device
 2a45  Meizu Corp.
        0001  MX Phone (BICR)
        0c02  MX Phone (MTP & ADB)
        200b  MX Phone (PTP)
        200c  MX Phone (PTP & ADB)
        2012  MX Phone (MTP & ACM)
+2a47  Mundo Reader, S.L.
+       0c02  bq Aquaris E4.5
+       201d  Tablet Edison 3
+       903a  bq Aquaris U
+2a4b  EMULEX Corporation
+       0400  Pilot4 Integrated Hub
+2a62  Flymaster Avionics
+       b301  LiveSD
+       b302  NavSD
+2a6e  Bare Conductive
+       0003  Touch Board
+       8003  Touch Board
+2a70  OnePlus Technology (Shenzhen) Co., Ltd.
+       4ee7  ONEPLUS A3010 [OnePlus 3T] / A5010 [OnePlus 5T] / A6003 [OnePlus 6] (Charging + USB debugging modes)
+       904d  A3000 phone (PTP mode) [3T]
+       904e  A3000 phone (PTP mode, with debug) [3T]
+2a88  DFU Technology Ltd
+       ffff  DFU
+2a8d  Keysight Technologies, Inc.
+2ab6  T+A elektroakustik GmbH & Co KG, Germany
+       0001  PDP3000HV DAC
+       0002  MP1000E, MP2000R, MP2500R, MP3100HV
+       0003  TA HD AUDIO V2
 2ac7  Ultrahaptics Ltd.
        0101  Evaluation Kit [Dragonfly]
        0102  UHDK5
        0112  STRATOS Inspire
        0113  STRATOS Inspire DFU
        ffff  DFU
+2ad1  Picotronic GmbH
+       7ab8  Turningtable
+2ae5  Fairphone B.V.
+       9015  2 (Mass storage & ADB)
+       9024  2 (RNDIS & ADB)
+       9039  2 (MTP & ADB)
+       904d  2 (PTP)
+       904e  2 (PTP & ADB)
+       90de  2 (Charging)
+       f000  2 (Mass storage)
+       f003  2 (MTP)
+       f005  2 (tethering)
+       f00e  2 (RNDIS)
+2aec  Ambiq Micro, Inc.
+       6011  Converter
+2af4  ROLI Ltd.
+       0100  Seaboard GRAND
+       0200  Seaboard RISE
+       0300  BlueWing Proto
+       0400  VOICE
+       0500  BLOCKS
+2b03  STEREOLABS
+       f580  ZED camera
+       f582  ZED camera
+       f680  ZED-M camera
+       f681  ZED-M HID Interface
+       f682  ZED-M camera
+       f683  ZED-M HID Interface
+       f684  ZED-M camera
+2b0e  LeEco
+       171b  Le2
+       171e  Le2 in USB tethering mode
+       1830  Le1 Pro
+       1844  Le Max2
+       2b0e  LeEco
+       6108  Lex720 [LePro 3] in connection sharing usb
+       610b  Lex720 [LePro 3] in Camera mode
+       610c  Lex720 [LePro 3]
+       610d  Lex720 [LePro 3] in debug
+2b23  Red Hat, Inc.
+       cafe  UsbDk (USB Development Kit)
 2b24  KeepKey LLC
-       0001  Bitcoin hardware wallet
+       0001  Bitcoin Wallet [KeepKey]
+       0002  Bitcoin Wallet
+2b3e  NewAE Technology Inc.
+       ace2  CW1173 [ChipWhisperer-Lite]
+2b4c  ZUK
+       1004  Z1 MTP
+2bc5  Orbbec 3D Technology International, Inc
+       0401  Astra
+       0403  Astra Pro
+       0407  Astra Mini S
+2bcc  InoTec GmbH Organisationssysteme
+2bd6  Coroware, Inc.
+       4201  RS-485 Controller and Interface [Cypress Semiconductor]
+2bd8  ROPEX Industrie-Elektronik GmbH
 2c02  Planex Communications
        14ea  GW-US11H WLAN
 2c1a  Dolphin Peripherals
        0000  Wireless Optical Mouse
+2c23  Supermicro Computer Incorporated
+       1b83  NIC
+2c4e  Mercucys INC
+       0100  MW300UM RTL8192EU wifi
+2c4f  Canon Electronic Business Machines Co., Ltd.
+       3003  PR Wireless Presenter
+2c55  Magic Leap, Inc.
+       a100  ML1 Lightpack (MLDB)
+       b100  ML1 Lightpack (fastboot)
+       c001  ML1 Control (COM)
+       c002  ML1 Control (Bootloader)
 2c7c  Quectel Wireless Solutions Co., Ltd.
        0121  EC21 LTE modem
        0125  EC25 LTE modem
        0296  BG96 CAT-M1/NB-IoT modem
        0306  EG06/EP06/EM06 LTE-A modem
        0435  AG35 LTE modem
+2c97  Ledger
+       0000  Blue
+       0001  Nano S
+       0004  Nano X
+2c99  Prusa
+       0001  i3 MK2S
+2c9c  Vayyar Imaging Ltd.
+       1000  Walabot Makers Series
+       1020  Walabot DIY
+       1022  Walabot DIY Plus
+       1030  Walabot Home (vHC)
+       9100  VNAKit
+2c9d  Nod Inc
+       90a0  Goa
+       bac5  Backspin
+2ca3  DJI Technology Co., Ltd.
+       0008  Mavic Mini MR1SD25 Remote controller
+2cb7  Fibocom
+       0210  L830-EB-00 LTE WWAN Modem
+2cc0  Hangzhou Zero Zero Infinity Technology Co., Ltd.
+2cc2  Lautsprecher Teufel GmbH
+2ccf  Hypersecu
+       0880  HyperFIDO
+2cd9  Cambrionix Ltd
+       0804  PowerSync4 USBPD Hub
 2cdc  Sea & Sun Technology GmbH
        f232  CTD48Mc CTD Probe
+2ce5  InX8 Inc [AKiTiO]
+       0014  Mass Storage [NT2 U31C]
+2cf0  Nuand LLC
+       5246  bladeRF
+       5250  bladeRF 2.0 micro
+2d1f  Wacom Taiwan Information Co. Ltd.
+2d25  Kronegger GmbH.
+2d2d  proxmark.org
+       504d  Proxmark3
+2d37  Zhuhai Poskey Technology Co.,Ltd
+2d6b  NetUP Inc.
+       7777  Joker TV universal DTV receiver
+2d81  Evollve Inc.
+       4f01  Ozobot Evo
+2d84  Zhuhai Poskey Technology Co.,Ltd
+       b806  DT-108B Thermal Label Printer
+2dc8  8BitDo
+       5006  M30 Bluetooth gamepad
+       5750  Bootloader
+       6000  SF30 Pro gamepad
+       6001  SN30/SF30 Pro gamepad
+       ab11  F30 gamepad
+       ab12  N30 gamepad
+       ab20  SN30/SF30 gamepad
+       ab21  SF30 gamepad
 2dcf  Dialog Semiconductor
+       c951  Audio Class 1.0 Devices
        c952  Audio Class 2.0 Devices
+2def  Kirale Technologies
+       0000  KiNOS Boot DFU
+       0102  KTWM102 Module
+2df2  LIPS Corporation
+       0213  LIPSedge DL 3D ToF Camera
+       0215  LIPSedge DL RGB Camera
+       2102  LIPSedge 5 Megapixel RGB Camera
+2e04  HMD Global
+       0001  Nokia 3310 3G
+       0002  Nokia 3310 3G
+       0a14  Nokia 3310 3G
+       c008  Tethering Network Interface
+       c009  Nokia 1 (bootloader)
+       c025  Nokia 8 (MTP mode)
+       c026  Nokia Smartphone
+       c029  Nokia 8 (PTP mode)
+       c031  Nokia 1 (PTP)
+       c03f  Nokia 8 (MIDI mode)
+2e0e  Hatteland Display AS
+       0001  CAN Gateway
+2e24  Hyperkin
+       0652  Duke Xbox One controller
+       1688  X91 Xbox One controller
+2e3b  uSens Inc.
+2e57  MEGWARE Computer Vertrieb und Service GmbH
+       454d  SlideSX EnergyMeter
+       454e  SlideSX EnergyMeter DFU
+       5cba  SlideSX / ClustSafe Bus Adapter
+2e69  Swift Navigation
+       1001  Piksi Multi
+2e95  SCUF Gaming
+       7725  Controller
+2f76  KeyXentic Inc.
+       0905  KX905 Smart Terminal
+       0906  KX906 Smart Card Reader
+       1906  KX906 Smart Token (Mass Storage)
+2fad  Definium Technologies
+2fb0  Infocrypt
 2fb2  Fujitsu, Ltd
+2fc0  Sensidyne, LP
+       0001  Project Archer
+2fc6  Comtrue Inc.
+       6012  UAC2 Device GB
+2fe0  Xaptum, Inc.
+       8b01  XAP-RC-001 ENF Router Card
+       8b02  XAP-RW-001 ENF Router Card with WiFi
+       8bde  XAP-EA-002 ENF Access Card
+       8bee  XAP-EA-003 ENF Access Card
+2fe3  NordicSemiconductor
+2fe7  ELGIN S.A.
+       0001  SMART S@T
+2feb  Beijing Veikk E-Commerce Co., Ltd.
+       0004  Veikk A15 Pen Tablet
+2ff4  Quixant Plc
 3016  Boundary Devices, LLC
        0001  Nitrogen Bootloader
+3036  Control iD
+       0001  Print iD
+       0002  iDBio
+3037  Beijing Chushifengmang Technology Development Co.,Ltd.
+3057  Kingsis Corporation
+       0002  ZOWIE Gaming mouse
+308f  Input Club
+       0000  Infinity 60% Bootloader
+       0001  Infinity 60% - Standard
+       0002  Infinity 60% - Hacker
+       0003  Infinity Ergodox Bootloader
+       0004  Infinity Ergodox
+       0005  WhiteFox Bootloader
+       0006  WhiteFox - Vanilla
+       0007  WhiteFox - ISO
+       0008  WhiteFox - Aria
+       0009  WhiteFox - Winkeyless
+       000a  WhiteFox - True Fox
+       000b  WhiteFox - Jack of All Trades
+       000c  Infinity 60% LED Bootloader
+       000d  Infinity 60% LED - Standard
+       000e  Infinity 60% LED - Hacker
+       000f  Infinity 60% LED - Alphabet
+       0010  K-Type Bootloader
+       0011  K-Type
+       0012  Kira Bootloader
+       0013  Kira
+       0014  Gemini Dawn/Dusk Bootloader
+       0015  Gemini Dawn/Dusk
+       0016  Re:Type Bootloader
+       0017  Re:Type
+       0018  Re:Type USB Hub
+       0019  WhiteFox (SAM4S) Bootloader
+       001a  WhiteFox (SAM4S) - Vanilla
+       001b  WhiteFox (SAM4S) - ISO
+       001c  WhiteFox (SAM4S) - Aria
+       001d  WhiteFox (SAM4S) - Winkeyless
+       001e  WhiteFox (SAM4S) - True Fox
+       001f  WhiteFox (SAM4S) - Jack of All Trades
 30a4  Blues Wireless
        0001  Notecard
 30c2  UNPARALLEL Innovation, Lda
        1388  SPL Meter
+30c9  Luxvisions Innotech Limited
 30ee  Fujitsu Connected Technologies Limited
        1001  F-01L
+30f2  Varex Imaging
+3111  Hiperscan GmbH
+       0000  SGS-NT Microspectrometer
+3112  Meteca SA
+       0001  MBC-WB01 (CDC-ACM)
+       0002  MBC-WB01 (Bootloader)
+       0003  ABC (CDC ACM)
+       0004  ABC (Bootloader)
 3125  Eagletron
        0001  TrackerPod Camera Stand
 3136  Navini Networks
+3145  SafeLogic Inc.
+3147  Tanvas, Inc.
+316c  SigmaSense, LLC
+316d  Purism, SPC
+       4c4b  Librem Key
+316e  SPECINFOSYSTEMS
+       0001  DIAMOND token
+3171  8086 Consultancy
+       0011  ClusterCTRL DA
+       0012  ClusterCTRL pHAT
+       0013  ClusterCTRL A+6
+       0014  ClusterCTRL Triple
+       0015  ClusterCTRL Single
 3176  Whanam Electronics Co., Ltd
 3195  Link Instruments
        f190  MSO-19
        f280  MSO-28
        f281  MSO-28
+31c9  BeiJing LanXum Computer Technology Co., Ltd.
+       1001  Printer
+       1301  Black and White Laser Printer
+       1501  LaserPrint GA50 series
+3200  Alcatel-Lucent Enterprise
+       2100  ALE 8058s
+       2101  ALE 8068s
+       2102  8078s
+3219  Smak Tecnologia e Automacao LTDA
+       0044  SKO44 Optical Keyboard
+321c  Premio, Inc.
+324c  CUPRIS Ltd.
+326d  Agile Display Solutions Co., Ltd
+       0001  Avocor USB Camera
 3275  VidzMedia Pte Ltd
        4fb1  MonsterTV P2H
+3293  Unhuman Inc.
+32b3  TEXA
+       d1a6  TXT Multihub
+       d1a7  TXT Multihub
 3333  InLine
        3333  2 port KVM switch model 60652K
 3334  AEI
        043a  Mio A701 DigiWalker PPCPhone
        0e3a  Pocket PC 300 GPS SL / Typhoon MyGuide 3500
        a0a3  deltaX 5 BT (D) PDA
+       ffff  Mio DigiWalker Sync
 3344  Leaguer Microelectronics (LME)
        3744  OEM PC Remote
+348f  ISY
+       2322  Wireless Presenter
 3504  Micro Star
        f110  Security Key
 3538  Power Quotient International Co., Ltd
        0022  Hi-Speed Mass Storage Device
        0042  Cool Drive U339 Flash Disk
        0054  Flash Drive (2GB)
+       0901  Traveling Disk U273 (4GB)
 3579  DIVA
        6901  Media Reader
 357d  Sharkoon
-       7788  QuickPort XT
+       7788  JMicron JMS567 ATA/ATAPI Bridge
 3636  InVibro
+3767  Fanatec
+       0101  Speedster 3 Forceshock Wheel
 3838  WEM
        0001  5-in-1 Card Reader
+       1031  2.4G Wireless Mouse
 3923  National Instruments Corp.
        12c0  DAQPad-6020E
        12d0  DAQPad-6507
        1f50  DAQPad-6036E
        2f80  DAQPad-6052E
        2f90  DAQPad-6052E
-       702b  GPIB-USB-B
+       702a  GPIB-USB-B
+       702b  GPIB-USB-B Initialization
        703c  USB-485 RS485 Cable
        709b  GPIB-USB-HS
+       7166  USB-8451
+       716e  USB-8451 Firmware Loader
+       717a  USB-6008
+       717b  USB-6009
+       71d6  USB-6008 OEM
+       71d7  USB-6009 OEM
+       71d8  USB-6009 OEM
        7254  NI MIO (data acquisition card) firmware updater
        729e  USB-6251 (OEM) data acquisition card
+       7346  USB-6229
+       755b  myDAQ
+       76af  USB-6000
+       76b0  USB-6000 OEM
+       76bf  USB-6001
+       76c0  USB-6001 OEM
+       76c4  USB-6002
+       76c5  USB-6002 OEM
+       76c6  USB-6003
+       76c7  USB-6003 OEM
 40bb  I-O Data
        0a09  USB2.0-SCSI Bridge USB2-SC
 4101  i-rocks
        1005  Multimedia Pro Keyboard Hub
        2001  Keyboard HID Support
        2002  SK-8125 Keyboard
-       2003  Keyboard
+       2003  Keyboard SK-8115
        2005  RT7D50 Keyboard
        2010  Keyboard
        2011  Multimedia Pro Keyboard
        2100  SK-3106 Keyboard
-       2101  SmartCard Reader Keyboard
+       2101  SK-3205 SmartCard Reader Keyboard
        2105  Model L100 Keyboard
-       2106  Dell QuietKey Keyboard
+       2106  QuietKey Keyboard
+       2107  KB212-B Quiet Key Keyboard
+       2113  KB216 Wired Keyboard
+       2134  Hub of E-Port Replicator
+       21d7  Dell Wireless 5560 HSPA+ Mobile Broadband Modem
        2500  DRAC4 Remote Access Card
+       2501  Keyboard and mouse dongle
        2513  internal USB Hub of E-Port Replicator
        3010  Optical Wheel Mouse
        3012  Optical Wheel Mouse
        3016  Optical 5-Button Wheel Mouse
+       301a  Dell MS116 Optical Mouse
+       301b  Universal Bluetooth Receiver
        3200  Mouse
        4001  Axim X5
        4002  Axim X3
        5118  AIO 810
        5124  Laser MFP 1815
        5128  Photo AIO 928
+       5133  968 AIO Printer
        5200  Laser Printer
        5202  Printing Support
        5203  Printing Support
        5220  Laser MFP 1600n
        5225  Printing Support
        5226  Printing Support
+       5228  Laser Printer 1720dn
        5300  Laser Printer
        5400  Laser Printer
        5401  Laser Printer
+       5404  1250c Color Printer
        5513  WLA3310 Wireless Adapter [Intersil ISL3887]
+       5534  Hub of E-Port Replicator
        5601  Laser Printer 3100cn
        5602  Laser Printer 3000cn
+       5607  MFP Color Laser Printer 3115cn
        5631  Laser Printer 5100cn
+       564a  C1765 series Multifunction Color LaserPrinter, Scanner & Copier
        5905  Printing Support
        8000  BC02 Bluetooth Adapter
        8010  TrueMobile Bluetooth Module in
        8138  Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard EAP-SIM Port
        8140  Wireless 360 Bluetooth
        8142  Mobile 360 in DFU
+       8143  Broadcom BCM20702A0 Bluetooth
        8147  F3507g Mobile Broadband Module
        8156  Wireless 370 Bluetooth Mini-card
        8157  Integrated Keyboard
        8185  Gobi 2000 Wireless Modem (QDL mode)
        8186  Gobi 2000 Wireless Modem
        8187  DW375 Bluetooth Module
+       818e  DW5560 miniPCIe HSPA+ Mobile Broadband Modem
+       8197  BCM20702A0 Bluetooth Module
+       81a0  Wireless 5808 Mobile Broadband (Sierra Wireless MC7355 Mini PCIE, 4G UMTS,HSDPA,HSPA+,LTE,1xRTT,EVDO Rev A,GSM,GPRS)
+       81a3  Hub of E-Port Replicator
+       81a8  Wireless 5808 Mobile Broadband (Sierra Wireless Mini PCIE, 4G UMTS,HSDPA,HSPA+,LTE,1xRTT,EVDO Rev A,GSM,GPRS)
        8501  Bluetooth Adapter
+       9001  ATA Bridge
+       9009  Portable Device
        9500  USB CP210x UART Bridge Controller [DW700]
        a001  Hub
        a005  Internal 2.0 Hub
+       a101  Internal Dual SD Card module
+       a102  iDRAC Virtual NIC
+       a503  AC511 Sound Bar
        a700  Hub (in 1905FP LCD Monitor)
+       b007  Streak 5 Android Tablet
 4146  USBest Technology
        9281  Iomega Micro Mini 128MB Flash Drive
        ba01  Intuix Flash Drive
        0701  U.S. Robotics USR5425 Wireless MAXg Adapter
        0711  Belkin F5D7051 v3000 802.11g
        0720  Dynex DX-BUSB
+       0721  Dynex DX-EBUSB
 4348  WinChipHead
-       5523  USB->RS 232 adapter with Prolifec PL 2303 chipset
+       5523  USB->RS 232 adapter with Prolific PL 2303 chipset
        5537  13.56Mhz RFID Card Reader and Writer
        5584  CH34x printer adapter cable
 4572  Shuttle, Inc.
        1026  Crystal Bar Flash Drive
 4670  EMS Production
        9394  Game Cube USB Memory Adaptor 64M
+46f4  QEMU
 4752  Miditech
        0011  Midistart-2
 4757  GW Instek
 4855  Memorex
        7288  Ultra Traveldrive 160G 2.5" HDD
 4971  SimpleTech
+       1004  Hitachi LifeStudio Desk (3.5" HDD) [w/o flash key]
+       1013  Touro Desk Pro
+       1015  Touro Desk 3.0
+       8001  G-Tech G-DRIVE Mobile
        cb01  SP-U25/120G
+       cd15  Simple Drive Mini (2.5" HDD)
+       ce07  SimpleDrive (3.5" HDD)
+       ce12  FV-U35
        ce17  1TB SimpleDrive II USB External Hard Drive
+       ce18  (re)Drive
+       ce21  JMicron JM20329 SATA Bridge [eg. HITACHI SimpleDrive mini]
+       ce22  Hitachi SimpleTough (3.5" HDD)
 4d46  Musical Fidelity
        0001  V-Link
        0002  V-DAC II
        0bb9  Grandtec USB1.1 DVB-T (warm)
        0fa0  Grandtec USB1.1 DVB-T (cold)
        0fa1  Grandtec USB1.1 DVB-T (warm)
-5041  Linksys (?)
-       2234  WUSB54G v1 802.11g Adapter [Intersil ISL3886]
-       2235  WUSB54GP v1 802.11g Adapter [Intersil ISL3886]
 50c2  Averatec (?)
        4013  WLAN Adapter
+5131  MSR
+       2007  MSR-101U Mini HID magnetic card reader
 5173  Sweex
        1809  ZD1211
 5219  I-Tetra
        1001  Cetus CDC Device
+5332  Clearly Superior Technologies, Inc.
+       1300  CST2545-5W (L-Trac)
 5345  Owon
        1234  PDS6062T Oscilloscope
 534c  SatoshiLabs
        0001  Bitcoin Wallet [TREZOR]
+       0002  Bitcoin Wallet [TREZOR v2]
+534d  MacroSilicon
+       0021  MS210x Video Grabber [EasierCAP]
+       6021  VGA Display Adapter
 5354  Meyer Instruments (MIS)
        0017  PAXcam2
 544d  Transmeta Corp.
        0005  Tablet WP8060U
        0041  Genius PenSketch 6x8 Tablet
        0042  Tablet PF1209
+       004a  XP-Pen Artist 10S tablet
+       004d  Tablet Monitor MSP19U
        0064  Aiptek HyperPen 10000U
+       3031  Graphics tablet [DrawImage G3, Ugee G3]
 5555  Epiphan Systems Inc.
        1110  VGA2USB
        1120  KVM2USB
        3344  KVM2USB LR
        3411  DVI2USB Solo
        3422  DVI2USB Duo
+       3500  DVI2USB3
+       3501  DVI2USB3 Rev3
+       3510  DVI2USB3_ET
+       3520  SDI2USB3
 55aa  OnSpec Electronic, Inc.
        0015  Hard Drive
        0102  SuperDisk
        0100  Orbicam
        0101  USB2.0 Camera
        0102  Crystal Eye Webcam
+       0137  HP Webcam
+       0141  BisonCam, NB Pro
+       0149  HP Webcam-101
+       014c  MSI Integrated Webcam
        01a6  Lenovo Integrated Webcam
        01a7  Lenovo Integrated Webcam
        01a9  Lenovo Integrated Webcam
        0200  OrbiCam
+       0202  Fujitsu Webcam
        0203  BisonCam NB Pro 1300
+       0205  Lenovo EasyCamera
+       0217  Integrated Webcam
        0241  BisonCam, NB Pro
+       0268  SunplusIT INC. Integrated Camera
+       026a  Integrated Camera
+       0292  Lenovo Integrated Webcam
+       0294  Lenovo Integrated Webcam
+       0295  Lenovo Integrated Webcam
+       0299  Lenovo Integrated Webcam
+       029c  Lenovo EasyCamera
+       02ac  HP TrueVision HD Webcam
        02d0  Lenovo Integrated Webcam [R5U877]
+       02d2  ThinkPad Integrated Camera
+       02d5  Integrated Camera
+       03b3  Lenovo Integrated Webcam
        03d0  Lenovo Integrated Webcam [R5U877]
+       0400  BisonCam, NB Pro
+       0535  Lenovo EasyCamera integrated webcam
+       055a  Lenovo Integrated Webcam
+       0652  Lenovo EasyCamera
+       0670  Lenovo EasyCamera
+       0671  Lenovo EasyCamera
+       0706  ThinkPad P50 Integrated Camera
+       2113  SunplusIT Integrated Camera
+       a002  Lenovo EasyCamera Integrated Webcam
 59e3  Nonolith Labs
 5a57  Zinwell
        0260  RT2570
        0282  802.11b/g/n USB Wireless LAN Card
        0283  802.11b/g/n USB Wireless LAN Card
        0284  802.11a/b/g/n USB Wireless LAN Card
-       0290  ZW-N290 802.11n [Realtek RTL8192SU]
+       0290  ZW-N290 802.11n [Realtek RTL8192U]
        5257  Metronic 495257 wifi 802.11ng
 6000  Beholder International Ltd.
+       0001  Trident TVBOX Video Grabber
        dec0  TV Wander
        dec1  TV Voyage
 601a  Ingenic Semiconductor Ltd.
        4740  XBurst Jz4740 boot mode
+       4760  JZ4760 Boot Device
+6022  Xektek
+       0500  SuperPro Universal Device Programmer
 6189  Sitecom
-       182d  USB 2.0 Ethernet
+       182d  LN-029 10/100 Ethernet Adapter
        2068  USB to serial cable (v2)
 6244  LightingSoft AG
        0101  Intelligent Usb Dmx Interface SIUDI5A
        0491  Intelligent Usb Dmx Interface SIUDI9D
        0500  Touch Sensitive Intelligent Control Keypad STICK2B Firmware download
        0501  Touch Sensitive Intelligent Control Keypad STICK2B
+       0520  Touch Sensitive Intelligent Control Keypad (STICK2C Firmware download, 32/64bits
+       0521  Touch Sensitive Intelligent Control Keypad (STICK2C, 32/64bits)
+       0540  Sunlite Universal Smart Handy Interface (SUSHI1A Firmware download, 32/64bits)
+       0541  Sunlite Universal Smart Handy Interface (SUSHI1A, 32/64bits)
+       0570  Touch Sensitive Intelligent Control Keypad (STICK4A Firmware download, 32/64bits)
+       0571  Touch Sensitive Intelligent Control Keypad (STICK4A, 32/64bits)
+       0580  Touch Sensitive Intelligent Control Keypad (STICK5A Firmware download, 32/64bits)
+       0581  Touch Sensitive Intelligent Control Keypad (STICK5A, 32/64bits)
+       0590  Intelligent Dmx Interface (SIUDI9S Firmware Download, 32/64bits)
+       0591  Intelligent Dmx Interface (SIUDI9S, 32/64bits)
+       0600  Intelligent Dmx Interface (SIUDI9M Firmware Download, 32/64bits)
+       0601  Intelligent Dmx Interface (SIUDI9M, 32/64bits)
+       0610  Intelligent Dmx Interface SIUDI10A Firmware Download
+       0611  Intelligent Dmx Interface SIUDI10A
 6253  TwinHan Technology Co., Ltd
        0100  Ir reciver f. remote control
 636c  CoreLogic, Inc.
-6472  Unknown (Sony?)
+6472  Sony Corp.
        01c8  PlayStation Portable [Mass Storage]
 6547  Arkmicro Technologies Inc.
        0232  ARK3116 Serial
+6557  Emtec
+       5500  Mass Storage Device
+       8005  Car Key
 6615  IRTOUCHSYSTEMS Co. Ltd.
        0001  Touchscreen
+       0020  IRTOUCH InfraRed TouchScreen
+       0081  TouchScreen
 6666  Prototype product Vendor ID
        0667  WiseGroup Smart Joy PSX, PS-PC Smart JoyPad
+       1c40  TELEMIC 802.15.4 Sensor node (Bootloader)
+       1c41  TELEMIC 802.15.4 Sensor node
        2667  JCOP BlueZ Smartcard reader
        8802  SmartJoy Dual Plus PS2 converter
        8804  WiseGroup SuperJoy Box 5
 6677  WiseGroup, Ltd.
        8802  SmartJoy Dual Plus PS2 converter
        8811  Deluxe Dance Mat
+675d  Humanscale
+       062a  Switch Mouse
 6891  3Com
        a727  3CRUSB10075 802.11bg [ZyDAS ZD1211]
 695c  Opera1
        2202  UF5/UF6/UF7/UF8 MIDI Master Keyboard
 726c  StackFoundry LLC
        2149  EntropyKing Random Number Generator
+7302  Solinftec
+       0001  HUB 4X232
 734c  TBS Technologies China
        5920  Q-Box II DVB-S2 HD
        5928  Q-Box II DVB-S2 HD
 7373  Beijing STONE Technology Co. Ltd.
        5740  Intelligent TFT-LCD Module
 7392  Edimax Technology Co., Ltd
-       7711  EW-7711UTn nLite Wireless Adapter [Ralink RT2870]
-       7717  EW-7717UN 802.11n Wireless Adapter [Ralink RT2870]
+       7711  EW-7711UTn nLite Wireless Adapter [Ralink RT3070]
+       7717  EW-7717UN 802.11n Wireless Adapter [Ralink RT2770]
        7718  EW-7718UN 802.11n Wireless Adapter [Ralink RT2870]
-       7722  EW-7722UTn 802.11n Wireless Adapter [Ralink RT307x]
+       7722  EW-7722UTn 802.11n Wireless Adapter [Ralink RT3072]
+       7733  EW-7733UnD 802.11abgn 3x3:3 [Ralink RT3573]
        7811  EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]
+       7822  EW-7612UAn V2 802.11n Wireless Adapter [Realtek RTL8192CU]
+       a611  EW-7611ULB 802.11b/g/n and Bluetooth 4.0 Adapter
+       a711  EW-7711MAC 802.11ac Wireless Adapter
+       a811  EW-7811UTC 802.11ac Wireless Adapter
+       b711  EW-7722UAC 802.11a/b/g/n/ac (2x2) Wireless Adapter [MediaTek MT7612U]
+       b822  EW-7822ULC 802.11ac Wireless Adapter [Realtek RTL8812AU]
+73d8  Progeny Dental Equipment Specialists
+       0104  VetPro DR, Size 1
+       0105  VetPro DR, Size 2
+7669  Venable Instruments
+       350c  Model 350c, Frequency Response Analyzer
+       5140  Model 5140, Frequency Response Analyzer
+       6305  Model 6305, Frequency Response Analyzer
+       6320  Model 6320, Frequency Response Analyzer
+       6340  Model 6340, Frequency Response Analyzer
+       7405  Model 7405, Frequency Response Analyzer
+       7420  Model 7420, Frequency Response Analyzer
+       7440  Model 7440, Frequency Response Analyzer
+       8805  Model 8805, Frequency Response Analyzer
+       8820  Model 8820, Frequency Response Analyzer
+       8840  Model 8840, Frequency Response Analyzer
+7825  Other World Computing
+       a2a4  External SATA Hard Drive Adapter cable PA023U3
+       b0b3  miniStack MAX
+8070  ACCES I/O Products, Inc.
+       8003  USB-DIO-96
+       8070  USB-AO16-16A
 8086  Intel Corp.
        0001  AnyPoint (TM) Home Network 1.6 Mbps Wireless Adapter
        0044  CPU DRAM Controller
        0182  WiMAX Connection 2400m
        0186  WiMAX Connection 2400m
        0188  WiMAX Connection 2400m
+       0189  Centrino Advanced-N 6230 Bluetooth adapter
        0200  AnyPoint(TM) Wireless II Network 11Mbps Adapter [Atmel AT76C503A]
-       0431  Intel Pro Video PC Camera
+       0431  Pro Video PC Camera
        0510  Digital Movie Creator
        0630  Pocket PC Camera
        0780  CS780 Microphone Input
        07d3  BLOB boot loader firmware
+       07dc  Bluetooth 4.0* Smart Ready (low energy)
+       0b07  RealSense D435
        0dad  Cherry MiniatureCard Keyboard
        1010  AnyPoint(TM) Home Network 10 Mbps Phoneline Adapter
        110a  Bluetooth Controller from (Ericsson P4A)
        110b  Bluetooth Controller from (Intel/CSR)
        1110  PRO/Wireless LAN Module
        1111  PRO/Wireless 2011B 802.11b Adapter [Intersil PRISM 2.5]
+       1122  Integrated Hub
        1134  Hollister Mobile Monitor
        1139  In-Target Probe (ITP)
        1234  Prototype Reader/Writer
        3240  AnyPoint® 3240 Modem - WAN
        3241  AnyPoint® 3240 Modem
        8602  Miniature Card Slot
-       9303  Intel 8x930Hx Hub
+       8c26  8 Series/C220 Series  EHCI #1
+       8c2d  8 Series/C220 Series EHCI #2
+       8c31  eXtensible Host Controller
+       9303  8x930Hx Hub
        9500  CE 9500 DVB-T
        9890  82930 Test Board
        beef  SCM Miniature Card Reader/Writer
        c013  Wireless HID Station
+       dead  Galileo
        f001  XScale PXA27x Bulverde flash
        f1a5  Z-U130 [Value Solid State Drive]
 8087  Intel Corp.
        0020  Integrated Rate Matching Hub
        0024  Integrated Rate Matching Hub
+       0025  Wireless-AC 9260 Bluetooth Adapter
+       0029  AX200 Bluetooth
+       0716  Modem Flashloader
+       07da  Centrino Bluetooth Wireless Transceiver
+       07dc  Bluetooth wireless interface
+       07eb  Oaktrail tablet
+       0a2a  Bluetooth wireless interface
+       0a2b  Bluetooth wireless interface
+       0a9e  Edison
+       0aa7  Wireless-AC 3168 Bluetooth
+       0aaa  Bluetooth 9460/9560 Jefferson Peak (JfP)
+       0fff  Intel Android Bootloader Interface
+       8000  Integrated Rate Matching Hub
+       8001  Integrated Hub
+       8002  8 channel internal hub
+       8008  Integrated Rate Matching Hub
+       800a  Hub
 80ee  VirtualBox
        0021  USB Tablet
+       0022  multitouch tablet
 8282  Keio
        3201  Retro Adapter
        3301  Retro Adapter Mouse
+8301  Hapurs
+       0089  HPBT05R 2.4 G Mini Wireless Touchpad Keyboard
 8341  EGO Systems, Inc.
        2000  Flashdisk
 8564  Transcend Information, Inc.
        1000  JetFlash
-       4000  RDF8
+       4000  microSD/SD/CF UHS-II Card Reader [RDF8, RDF9]
+       6000  digital photo frame PF830
+       6002  digital photo frame PF830
+       7000  StoreJet 25H3
 8644  Intenso GmbG
        8003  Micro Line
        800b  Micro Line (4GB)
 8e06  CH Products, Inc.
        f700  DT225 Trackball
+8ea3  Doosl
+       a02c  Wireless Presenter Receiver
 9016  Sitecom
        182d  WL-022 802.11b Adapter
 9022  TeVii Technology Ltd.
 9148  GeoLab, Ltd
 # All of GeoLab's devices share the same ID 0004.
        0004  R3 Compatible Device
+9516  Studiologic
 9710  MosChip Semiconductor
        7703  MCS7703 Serial Port Adapter
        7705  MCS7705 Parallel port adapter
        7720  MCS7720 Dual serial port adapter
        7730  MCS7730 10/100 Mbps Ethernet adapter
        7780  MCS7780 4Mbps Fast IrDA Adapter
+       7784  MCS7784 115.2Kb IrDA Adapter
+       7810  MCS7810 Serial Port Adapter
+       7820  MCS7820 Dual Serial Port Adapter
        7830  MCS7830 10/100 Mbps Ethernet adapter
        7832  MCS7832 10/100 Mbps Ethernet adapter
        7840  MCS7820/MCS7840 2/4 port serial adapter
+       9990  MCS9990 PCIe Host Controller
 9849  Bestmedia CD Recordable GmbH & Co. KG
        0701  Platinum MyDrive HP
+9886  Astro Gaming
+       0015  A50
 9999  Odeon
        0001  JAF Mobile Phone Flasher Interface
 99fa  Grandtec
        4b8f  ProxMark-3 RFID Instrument
 9e88  Marvell Semiconductor, Inc.
        9e8f  Plug Computer Basic [SheevaPlug]
+a014  Insignia (Best Buy)
+       b014  Desktop Microphone NS-PAUM50
+a108  Ingenic Semiconductor Co.,Ltd
+       1000  X1000
+       4775  JZ4775 Boot Device
 a128  AnMo Electronics Corp. / Dino-Lite (?)
        0610  Dino-Lite Digital Microscope (SN9C201 + HV7131R)
        0611  Dino-Lite Digital Microscope (SN9C201 + HV7131R)
@@ -20106,33 +23110,63 @@ a168  AnMo Electronics Corporation
        0615  Dino-Lite Pro Digital Microscope
        0617  Dino-Lite Pro Digital Microscope
        0618  Dino-Lite Digital Microscope
-a600  Asix
+a466  Haikou Xingong Electronics Co.,Ltd
+       0a53  TL866II Plus Device Programmer [MiniPRO]
+a600  ASIX s.r.o.
+       5500  zuban H2OPS - GPS for canoeing
+       a000  SIGMA Logic Analyzer
+       a002  EMUSB interface pro MU Beta
+       c000  MREL Data Trap II
+       c001  VUTS DMU4
+       c002  Electrone MASH
+       c005  MREL HTU HandiTrap cable
+       c006  JRC COmeter
        e110  OK1ZIA Davac 4.x
+       e112  OK1ZIA Antenna rotator
+       e113  OK1ZIA GPIO
+       e114  OK1ZIA HD&Keyb
 a727  3Com
        6893  3CRUSB20075 OfficeConnect Wireless 108Mbps 11g Adapter [Atheros AR5523]
        6895  AR5523
        6897  AR5523
+a88a  Clas Ohlsson
+       3003  PCFree Multimedia Remote Control PC
 aaaa  MXT
        8815  microSD CardReader
-abcd  Unknown
+       8816  microSD CardReader
+ab12  aplic
+       34cd  JMICRON JMS578 SATA 6Gb/s bridge
+abcd  LogiLink
+       1234  UDisk flash drive
+       6104  PCCloneEX Lite+ SATA docking station [QP0017]
        cdee  Petcam
 b58e  Blue Microphones
        9e84  Yeti Stereo Microphone
+ba77  Clockmaker
+       7147  Agterbosch
 c216  Card Device Expert Co., LTD
        0180  MSR90 MagStripe reader
 c251  Keil Software, Inc.
+       1705  MCB2300
        2710  ULink
+       2723  ULink-ME
+c502  AGPTek
+       0029  Rocker
 cace  CACE Technologies Inc.
        0002  AirPCAP Classic 802.11 packet capture adapter
-       0300  AirPcap NX [Atheros AR9001U-(2)NG]
+       0300  AirPcap NX [Atheros AR9170+AR9104]
 cd12  SMART TECHNOLOGY INDUSTRIAL LTD.
 d208  Ultimarc
        0310  Mini-PAC Arcade Control Interface
 d209  Ultimarc
        0301  I-PAC Arcade Control Interface
        0501  Ultra-Stik Ultimarc Ultra-Stik Player 1
+       1571  A-PAC Arcade Control Interface
 d904  LogiLink
        0003  Laser Mouse (ID0009A)
+e2b7  Jie Li
+       0811  CD002
+       0812  CD005 MP3 Player
 e4e4  Xorcom Ltd.
        1130  Astribank series
        1131  Astribank series
@@ -20156,20 +23190,37 @@ eb1a  eMPIA Technology, Inc.
        2750  ECS Elitegroup G220 integrated Webcam
        2761  EeePC 701 integrated Webcam
        2776  Combined audio and video input device
-       2800  Terratec Cinergy 200
-       2801  GrabBeeX+ Video Encoder
+       2800  EM2800 Video Capture
+       2801  EM2801 Video Capture
+       2820  EM2820 Video Capture
+       2821  EM2820 Video Capture
+       2840  EM2840 Video Capture
+       2841  EM2840 Video Capture
+       2861  EasyCAP DC60+ [EM2861]
        2863  Video Grabber
        2870  Pinnacle PCTV Stick
        2881  EM2881 Video Controller
        50a3  Gadmei UTV380 TV Box
        50a6  Gadmei UTV330 TV Box
+       5166  video grabber 28282
+       5184  VIDBOX NW06 [EM28281]
+       8179  Terratec Cinergy T2 Stick HD
+       e305  KWorld PlusTV Analog Stick
        e355  KWorld DVB-T 355U Digital TV Dongle
 eb2a  KWorld
 ef18  SMART TECHNOLOGY INDUSTRIAL LTD.
 f003  Hewlett Packard
        6002  PhotoSmart C500
+f007  Teslong
+       a999  Endoscope Camera
+       b999  Otoscope Camera
 f182  Leap Motion
        0003  Controller
+f3f0  CCT, Inc
+       0740  multi-function device
+       1340  multi-function printer
+       1440  printer device
+       1921  printer
 f4ec  Atten Electronics / Siglent Technologies
        ee38  Digital Storage Oscilloscope
 f4ed  Shenzhen Siglent Co., Ltd.
@@ -20177,8 +23228,11 @@ f4ed  Shenzhen Siglent Co., Ltd.
        ee3a  SDG1010 Waveform Generator (TMC mode)
 f766  Hama
        0001  PC-Gamepad "Greystorm"
+fa11  DyingLight
+       5afe  DyingLight
 fc08  Conrad Electronic SE
        0101  MIDI Cable UA0037
+ff00  Power Delivery
 ffee  FNK Tech
        0100  Card Reader Controller RTS5101/RTS5111/RTS5116
 
index 5770e7828d2c07373e077c4d667dc8a0cd62793e..26f762bf816e220c3042fc37c6f22208853e628f 100644 (file)
@@ -32,7 +32,7 @@
     of firmware, this firmware may also load the kernel directly.</para>
 
     <para>The kernel (optionally) mounts an in-memory file system, often generated by
-    <citerefentry project='die-net'><refentrytitle>dracut</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+    <citerefentry project='man-pages'><refentrytitle>dracut</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
     which looks for the root file system. Nowadays this is usually implemented as an initramfs — a compressed
     archive which is extracted when the kernel boots up into a lightweight in-memory file system based on
     tmpfs, but in the past normal file systems using an in-memory block device (ramdisk) were used, and the
@@ -349,7 +349,7 @@ systemd-reboot.service   systemd-poweroff.service   systemd-halt.service   syste
       <citerefentry><refentrytitle>systemd.special</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.target</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-halt.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-      <citerefentry project='die-net'><refentrytitle>dracut</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+      <citerefentry project='man-pages'><refentrytitle>dracut</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     </para>
   </refsect1>
 
index 81cdc33898f7c31a0ac25378e96ec93ac6058139..46da7741c97e5cf7abcb63cf460f1d31199f31ee 100644 (file)
@@ -49,7 +49,7 @@
     <title>Options</title>
 
     <para>All options are configured in the
-    <literal>[Coredump]</literal> section:</para>
+    [Coredump] section:</para>
 
     <variablelist class='config-directives'>
 
index ab5dffdfb37411dd09da8be8386deb5949af0637..150d410c24cc5d4ad681627aeadfc1cf3cd4f78d 100644 (file)
@@ -52,8 +52,8 @@
         matching specified characteristics. If no command is
         specified, this is the implied default.</para>
 
-        <para>The output is designed to be human readable and contains list contains
-        a table with the following columns:</para>
+        <para>The output is designed to be human readable and contains a table with the following
+        columns:</para>
         <variablelist>
           <varlistentry>
             <term>TIME</term>
 
         <listitem><para>Invoke a debugger on the last core dump
         matching specified characteristics. By default,
-        <citerefentry><refentrytitle>gdb</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+        <citerefentry project='man-pages'><refentrytitle>gdb</refentrytitle><manvolnum>1</manvolnum></citerefentry>
         will be used. This may be changed using the <option>--debugger=</option>
         option or the <varname>$SYSTEMD_DEBUGGER</varname> environment
         variable.</para></listitem>
 
         <listitem><para>Use the given debugger for the <command>debug</command>
         command. If not given and <varname>$SYSTEMD_DEBUGGER</varname> is unset, then
-        <citerefentry><refentrytitle>gdb</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+        <citerefentry project='man-pages'><refentrytitle>gdb</refentrytitle><manvolnum>1</manvolnum></citerefentry>
         will be used. </para></listitem>
       </varlistentry>
 
index 4cdc52dcb887afeb91fc46aeabf5d982466d7e3c..ee54499bfe7a13c86869b3c7c4e355a0e7d511a5 100644 (file)
 
         <listitem><para>Perform encryption using the same cpu that IO was submitted on. The default is to use
         an unbound workqueue so that encryption work is automatically balanced between available CPUs.</para>
+
         <para>This requires kernel 4.0 or newer.</para>
         </listitem>
       </varlistentry>
         <term><option>submit-from-crypt-cpus</option></term>
 
         <listitem><para>Disable offloading writes to a separate thread after encryption. There are some
-        situations where offloading write bios from the encryption threads to a single thread degrades
-        performance significantly. The default is to offload write bios to the same thread because it benefits
-        CFQ to have writes submitted using the same context.</para>
+        situations where offloading write requests from the encryption threads to a dedicated thread degrades
+        performance significantly. The default is to offload write requests to a dedicated thread because it
+        benefits the CFQ scheduler to have writes submitted using the same context.</para>
+
         <para>This requires kernel 4.0 or newer.</para>
         </listitem>
       </varlistentry>
@@ -512,7 +514,8 @@ external   /dev/sda3       keyfile:LABEL=keydev keyfile-timeout=10s</programlist
 
       <para>The PKCS#11 logic allows hooking up any compatible security token that is capable of storing RSA
       decryption keys. Here's an example how to set up a Yubikey security token for this purpose, using
-      <command>ykman</command> from the yubikey-manager project:</para>
+      <citerefentry project='debian'><refentrytitle>ykmap</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+      from the yubikey-manager project:</para>
 
 <programlisting><xi:include href="yubikey-crypttab.sh" parse="text" /></programlisting>
 
index 52b3883607cf9c8ea49339512b24ba8d0a515bd6..072529eeecbce9422e0a95c907c3dcf094020b57 100644 (file)
       special target unit <filename>sockets.target</filename>. It is
       recommended to place a
       <varname>WantedBy=sockets.target</varname> directive in the
-      <literal>[Install]</literal> section to automatically add such a
+      [Install] section to automatically add such a
       dependency on installation of a socket unit. Unless
       <varname>DefaultDependencies=no</varname> is set, the necessary
       ordering dependencies are implicitly created for all socket
         operating system-independent.</para></listitem>
 
         <listitem><para>Make sure to include an
-        <literal>[Install]</literal> section including installation
+        [Install] section including installation
         information for the unit file. See
         <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
         for details. To activate your service on boot, make sure to
index 497cb580c73165e61048365fca7b76201429664f..d5899dc362183d90402d6b5c8354e8aedadaecbe 100644 (file)
     <filename>/usr/share/</filename> hierarchy to the locations
     defined by the various relevant specifications.</para>
 
-    <para>During runtime, and for local configuration and state,
+    <para>During runtime, and for local configuration and runtime state,
     additional directories are defined:</para>
 
     <table>
index 3a4c6e5f5b1de0bd6ac8df5b0603e03ddebfcfea..6a8448f25d29edaad2b05221dad71ea177b06da1 100644 (file)
         <term><option>--identity=</option><replaceable>FILE</replaceable></term>
 
         <listitem><para>Read the user's JSON record from the specified file. If passed as
-        <literal>-</literal> reads the user record from standard input. The supplied JSON object must follow
-        the structure documented on <ulink url="https://systemd.io/USER_RECORDS">JSON User
-        Records</ulink>. This option may be used in conjunction with the <command>create</command> and
+        <literal>-</literal> read the user record from standard input. The supplied JSON object must follow
+        the structure documented on <ulink url="https://systemd.io/USER_RECORD">JSON User Records</ulink>.
+        This option may be used in conjunction with the <command>create</command> and
         <command>update</command> commands (see below), where it allows configuring the user record in JSON
         as-is, instead of setting the individual user record properties (see below).</para></listitem>
       </varlistentry>
         different system and the configured UID is taken by another user there, then
         <command>systemd-homed</command> may assign the user a different UID on that system. The specified
         UID must be outside of the system user range. It is recommended to use the 60001…60513 UID range for
-        this purpose. If not specified the UID is automatically picked. When logging in and the home
-        directory is found to be owned by a UID not matching the user's assigned one the home directory and
-        all files and directories inside it will have their ownership changed automatically before login
-        completes.</para>
+        this purpose. If not specified, the UID is automatically picked. If the home directory is found to be
+        owned by a different UID when logging in, the home directory and everything underneath it will have
+        its ownership changed automatically before login completes.</para>
 
         <para>Note that users managed by <command>systemd-homed</command> always have a matching group
         associated with the same name as well as a GID matching the UID of the user. Thus, configuring the
         privileges. Note that <command>systemd-homed</command> does not manage any groups besides a group
         matching the user in name and numeric UID/GID. Thus any groups listed here must be registered
         independently, for example with <citerefentry
-        project='man-pages'><refentrytitle>groupadd</refentrytitle><manvolnum>8</manvolnum></citerefentry>. If
-        non-existent groups that are listed there are ignored. This option may be used more than once, in
-        which case all specified group lists are combined. If the user is currently a member of a group
-        which is not listed, the user will be removed from the group.</para></listitem>
+        project='man-pages'><refentrytitle>groupadd</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
+        Any non-existent groups are ignored. This option may be used more than once, in which case all
+        specified group lists are combined. If the user is currently a member of a group which is not listed,
+        the user will be removed from the group.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><option>--skel=</option><replaceable>PATH</replaceable></term>
 
         <listitem><para>Takes a file system path to a directory. Specifies the skeleton directory to
-        initialize the home directory with. All files and directories in the specified are copied into any
-        newly create home directory. If not specified defaults to
-        <filename>/etc/skel/</filename>.</para></listitem>
+        initialize the home directory with. All files and directories in the specified path are copied into
+        any newly create home directory. If not specified defaults to <filename>/etc/skel/</filename>.
+        </para></listitem>
       </varlistentry>
 
       <varlistentry>
         <listitem><para>Takes a specifier indicating the preferred language of the user. The
         <varname>$LANG</varname> environment variable is initialized from this value on login, and thus a
         value suitable for this environment variable is accepted here, for example
-        <option>--language=de_DE.UTF8</option></para></listitem>
+        <option>--language=de_DE.UTF8</option>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         security token with exactly one pair of X.509 certificate and private key. A random secret key is
         then generated, encrypted with the public key of the X.509 certificate, and stored as part of the
         user record. At login time it is decrypted with the PKCS#11 module and then used to unlock the
-        account and associated resources. See below for an example how to set up authentication with security
-        token.</para></listitem>
+        account and associated resources. See below for an example how to set up authentication with a
+        security token.</para>
+
+        <para>Instead of a valid PKCS#11 URI, the special strings <literal>list</literal> and
+        <literal>auto</literal> may be specified. If <literal>list</literal> is passed, a brief table of
+        suitable, currently plugged in PKCS#11 hardware tokens is shown, along with their URIs. If
+        <literal>auto</literal> is passed, a suitable PKCS#11 hardware token is automatically selected (this
+        operation will fail if there isn't exactly one suitable token discovered). The latter is a useful
+        shortcut for the most common case where a single PKCS#11 hardware token is plugged in.</para>
+
+        <para>Note that many hardware security tokens implement both PKCS#11/PIV and FIDO2 with the
+        <literal>hmac-secret</literal> extension (for example: the YubiKey 5 series), as supported with the
+        <option>--fido2-device=</option> option below. Both mechanisms are similarly powerful, though FIDO2
+        is the more modern technology. PKCS#11/PIV tokens have the benefit of being recognizable before
+        authentication and hence can be used for implying the user identity to use for logging in, which
+        FIDO2 does not allow. PKCS#11/PIV devices generally require initialization (i.e. storing a
+        private/public key pair on them, see example below) before they can be used; FIDO2 security tokens
+        generally do not required that, and work out of the box.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--fido2-device=</option><replaceable>PATH</replaceable></term>
+
+        <listitem><para>Takes a path to a Linux <literal>hidraw</literal> device
+        (e.g. <filename>/dev/hidraw1</filename>), referring to a FIDO2 security token implementing the
+        <literal>hmac-secret</literal> extension, that shall be able to unlock the user account. If used, a
+        random salt value is generated on the host, which is passed to the FIDO2 device, which calculates a
+        HMAC hash of it, keyed by its internal secret key. The result is then used as key for unlocking the
+        user account. The random salt is included in the user record, so that whenever authentication is
+        needed it can be passed again to the FIDO2 token, to retrieve the actual key.</para>
+
+        <para>Instead of a valid path to a FIDO2 <literal>hidraw</literal> device the special strings
+        <literal>list</literal> and <literal>auto</literal> may be specified. If <literal>list</literal> is
+        passed, a brief table of suitable discovered FIDO2 devices is shown. If <literal>auto</literal> is
+        passed, a suitable FIDO2 token is automatically selected, if exactly one is discovered. The latter is
+        a useful shortcut for the most common case where a single FIDO2 hardware token is plugged in.</para>
+
+        <para>Note that FIDO2 devices suitable for this option must implement the
+        <literal>hmac-secret</literal> extension. Most current devices (such as the YubiKey 5 series) do. If
+        the extension is not implemented the device cannot be used for unlocking home directories.</para>
+
+        <para>Note that many hardware security tokens implement both FIDO2 and PKCS#11/PIV (and thus may be
+        used with either <option>--fido2-device=</option> or <option>--pkcs11-token-uri=</option>), for a
+        discussion see above.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <listitem><para>Each of these options takes a time span specification as argument (in the syntax
         documented in
         <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>5</manvolnum></citerefentry>) and
-        configure various aspects of the user's password expiration policy. Specifically,
+        configures various aspects of the user's password expiration policy. Specifically,
         <option>--password-change-min=</option> configures how much time has to pass after changing the
         password of the user until the password may be changed again. If the user tries to change their
         password before this time passes the attempt is refused. <option>--password-change-max=</option>
-        configures how much time has to pass after the the password is changed until the password expires and
-        needs to be changed again. After this time passes any attempts to log in may only proceed after the
-        password is changed. <option>--password-change-warn=</option> specifies how much earlier than then
-        the time configured with <option>--password-change-max=</option> the user is warned at login to
-        change their password as it will expire soon. Finally <option>--password-change-inactive=</option>
-        configures the time which has to pass after the password as expired until the user is not permitted
-        to log in or change the password anymore. Note that these options only apply to password
-        authentication, and do not apply to other forms of authentication, for example PKCS#11-based security
-        token authentication.</para></listitem>
+        configures how soon after it has been changed the password expires and needs to be changed again.
+        After this time passes logging in may only proceed after the password is changed.
+        <option>--password-change-warn=</option> specifies how much earlier than then the time configured
+        with <option>--password-change-max=</option> the user is warned at login to change their password as
+        it will expire soon. Finally <option>--password-change-inactive=</option> configures the time which
+        has to pass after the password as expired until the user is not permitted to log in or change the
+        password anymore. Note that these options only apply to password authentication, and do not apply to
+        other forms of authentication, for example PKCS#11-based security token
+        authentication.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><option>--tasks-max=</option><replaceable>TASKS</replaceable></term>
 
         <listitem><para>Takes a non-zero unsigned integer as argument. Configures the maximum numer of tasks
-        (i.e. processes and threads) the user may have at any given time. This limit applies to all tasks
-        forked off the user's sessions, even if they change user identity via <citerefentry
-        project='man-pages'><refentrytitle>su</refentrytitle><manvolnum>1</manvolnum></citerefentry> or a
-        similar tool. Use <option>--rlimit=LIMIT_NPROC=</option> to place a limit on the tasks actually
+        (i.e. threads, where each process is at least one thread) the user may have at any given time. This
+        limit applies to all tasks forked off the user's sessions, even if they change user identity via
+        <citerefentry project='man-pages'><refentrytitle>su</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+        or a similar tool. Use <option>--rlimit=LIMIT_NPROC=</option> to place a limit on the tasks actually
         running under the UID of the user, thus excluding any child processes that might have changed user
         identity. This controls the <varname>TasksMax=</varname> setting of the per-user systemd slice unit
         <filename>user-$UID.slice</filename>. See
         <term><option>--cpu-weight=</option><replaceable>WEIGHT</replaceable></term>
         <term><option>--io-weight=</option><replaceable>WEIGHT</replaceable></term>
 
-        <listitem><para>Set CPU and IO scheduling weights of the processes of the user, including those of
+        <listitem><para>Set CPU and IO scheduling weights of the processes of the user, including those of
         processes forked off by the user that changed user credentials. Takes a numeric value in the range
         1…10000. This controls the <varname>CPUWeight=</varname> and <varname>IOWeight=</varname> settings of
         the per-user systemd slice unit <filename>user-$UID.slice</filename>. See
         <para>Activation of a home directory involves various operations that depend on the selected storage
         mechanism. If the LUKS2 mechanism is used, this generally involves: inquiring the user for a
         password, setting up a loopback device, validating and activating the LUKS2 volume, checking the file
-        system, mounting the file system, and potentiatlly changing the ownership of all included files to
-        the correct UID/GID.</para></listitem>
+        system, mounting the file system, and potentially changing the ownership of all included files to the
+        correct UID/GID.</para></listitem>
       </varlistentry>
 
       <varlistentry>
     </example>
 
     <example>
-      <title>Set up authentication with a YubiKey security token:</title>
+      <title>Set up authentication with a YubiKey security token using PKCS#11/PIV:</title>
 
       <programlisting># Clear the Yubikey from any old keys (careful!)
 ykman piv reset
@@ -821,16 +862,18 @@ ykman piv generate-key -a RSA2048 9d pubkey.pem
 # Create a self-signed certificate from this public key, and store it on the device.
 ykman piv generate-certificate --subject "Knobelei" 9d pubkey.pem
 
-# We don't need the publibc key on disk anymore
+# We don't need the public key on disk anymore
 rm pubkey.pem
 
-# Check if the newly create key on the Yubikey shows up as token in PKCS#11. Have a look at the output, and
-# copy the resulting token URI to the clipboard.
-p11tool --list-tokens
+# Allow the security token to unlock the account of user 'lafcadio'.
+homectl update lafcadio --pkcs11-token-uri=auto</programlisting>
+    </example>
+
+    <example>
+      <title>Set up authentication with a FIDO2 security token:</title>
 
-# Allow the security token referenced by the determined PKCS#11 URI to unlock the account of user
-# 'lafcadio'. (Replace the '…' by the URI from the clipboard.)
-homectl update lafcadio --pkcs11-token-uri=…</programlisting>
+      <programlisting># Allow a FIDO2 security token to unlock the account of user 'nihilbaxter'.
+homectl update nihilbaxter --fido2-device=auto</programlisting>
     </example>
   </refsect1>
 
index 9e321940b723e79b9e0f7d72c888988c32f08861..2c5f3355d319d7cef26d45420f653028a7d2a8b5 100644 (file)
@@ -42,7 +42,7 @@
   <refsect1>
     <title>Options</title>
 
-    <para>The following options are available in the <literal>[Home]</literal> section:</para>
+    <para>The following options are available in the [Home] section:</para>
 
     <variablelist class='home-directives'>
 
index c09d300d6fc81c64bf5cada4f870133c5dc935e2..b7e79841d080f47ef61d32e367987f80cc0888a1 100755 (executable)
@@ -6,7 +6,7 @@ if [ -z "$1" ]; then
     exit 1
 fi
 
-# make sure the rules have been regenrated (in case man/update-man-rules was just run)
+# make sure the rules have been regenerated (in case man/update-man-rules was just run)
 ninja -C "@BUILD_ROOT@" version.h
 
 target="man/$1.html"
index ab3dfd0111fbe005c77e47208437135f72d16c3c..3db12dd0ce6321036dbc9a2ef4cef0ad41ffd11b 100644 (file)
@@ -49,7 +49,7 @@
     <title>Options</title>
 
     <para>All options are configured in the
-    <literal>[Remote]</literal> section:</para>
+    [Remote] section:</para>
 
     <variablelist class='config-directives'>
       <varlistentry>
index f2721a75e7d271669a3fcf90d870f516646f757f..6cb1aa474de77f6dcf75c8aea1dc7d51c4a9c00a 100644 (file)
@@ -43,7 +43,7 @@
   <refsect1>
     <title>Options</title>
 
-    <para>All options are configured in the <literal>[Upload]</literal> section:</para>
+    <para>All options are configured in the [Upload] section:</para>
 
     <variablelist class='config-directives'>
       <varlistentry>
index 6e4728b013425be52c9d57db01f089e0517371e2..ea60196e86c52e9777be29101e653f1f1e5f933c 100644 (file)
         is also added for <literal>_SYSTEMD_SLICE=<replaceable>UNIT</replaceable></literal>,
         such that if the provided <replaceable>UNIT</replaceable> is a
         <citerefentry><refentrytitle>systemd.slice</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        unit, all logs of the children of the slice will be logged.
+        unit, all logs of children of the slice will be shown.
        </para>
 
         <para>This parameter can be specified multiple times.</para>
         is also added for <literal>_SYSTEMD_USER_SLICE=<replaceable>UNIT</replaceable></literal>,
         such that if the provided <replaceable>UNIT</replaceable> is a
         <citerefentry><refentrytitle>systemd.slice</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        unit, all logs of the children of the unit will be logged.</para>
+        unit, all logs of children of the unit will be shown.</para>
 
         <para>This parameter can be specified multiple times.</para>
         </listitem>
         <listitem><para>Filter output to entries where the <varname>MESSAGE=</varname>
         field matches the specified regular expression. PERL-compatible regular expressions
         are used, see
-        <citerefentry><refentrytitle>pcre2pattern</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+        <citerefentry project='url'><refentrytitle url='http://pcre.org/current/doc/html/pcre2pattern.html'>pcre2pattern</refentrytitle><manvolnum>3</manvolnum></citerefentry>
         for a detailed description of the syntax.</para>
 
         <para>If the pattern is all lowercase, matching is case insensitive.
         underneath the specified directory instead of the root
         directory (e.g. <option>--update-catalog</option> will create
         <filename><replaceable>ROOT</replaceable>/var/lib/systemd/catalog/database</filename>,
-        and journal files under <filename><replaceable>ROOT</replaceable>/run/journal</filename>
-        or <filename><replaceable>ROOT</replaceable>/var/log/journal</filename> will be displayed).
+        and journal files under <filename><replaceable>ROOT</replaceable>/run/journal/</filename>
+        or <filename><replaceable>ROOT</replaceable>/var/log/journal/</filename> will be displayed).
         </para></listitem>
       </varlistentry>
 
         <filename>/run/log/journal/</filename> into <filename>/var/log/journal/</filename>, if persistent
         storage is enabled. This call does not return until the operation is complete. Note that this call is
         idempotent: the data is only flushed from <filename>/run/log/journal/</filename> into
-        <filename>/var/log/journal</filename> once during system runtime (but see
+        <filename>/var/log/journal/</filename> once during system runtime (but see
         <option>--relinquish-var</option> below), and this command exits cleanly without executing any
         operation if this has already happened. This command effectively guarantees that all data is flushed
-        to <filename>/var/log/journal</filename> at the time it returns.</para></listitem>
+        to <filename>/var/log/journal/</filename> at the time it returns.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 957ec36a68c7d5cb3f9c814b8287be28384a12a6..5c9419b012e3e1819ebcf35450452f9796d9c21f 100644 (file)
@@ -53,7 +53,7 @@
     <title>Options</title>
 
     <para>All options are configured in the
-    <literal>[Journal]</literal> section:</para>
+    [Journal] section:</para>
 
     <variablelist class='config-directives'>
 
index 52939deec0b15967d82a9e45816c2cee7ed5ec7b..b67639c92e5709e618e851597161e1d2b6c34c15 100644 (file)
           <para>During early boot, the generation of core dump files is disabled until a core dump handler (if any)
           takes over. This parameter allows specifying an absolute path where core dump files should be stored until
           a handler is installed. The path should be absolute and may contain specifiers, see
-          <citerefentry><refentrytitle>core</refentrytitle><manvolnum>5</manvolnum></citerefentry> for details.</para>
+          <citerefentry project='man-pages'><refentrytitle>core</refentrytitle><manvolnum>5</manvolnum></citerefentry> for details.</para>
         </listitem>
       </varlistentry>
 
         <term><varname>systemd.clock-usec=</varname></term>
 
         <listitem><para>Takes a decimal, numeric timestamp in µs since January 1st 1970, 00:00am, to set the
-        system clock to. The system time is set to the specified timestamp early during
-        boot. It is not propagated to the hardware clock (RTC).</para></listitem>
+        system clock to. The system time is set to the specified timestamp early during boot. It is not
+        propagated to the hardware clock (RTC).</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>systemd.random-seed=</varname></term>
+
+        <listitem><para>Takes a base64 encoded random seed value to credit with full entropy to the kernel's
+        random pool during early service manager initialization. This option is useful in testing
+        environments where delays due to random pool initialization in entropy starved virtual machines shall
+        be avoided.</para>
+
+        <para>Note that if this option is used the seed is accessible to unprivileged programs from
+        <filename>/proc/cmdline</filename>. This option is hence a security risk when used outside of test
+        systems, since the (possibly) only seed used for initialization of the kernel's entropy pool might be
+        easily acquired by unprivileged programs.</para>
+
+        <para>It is recommended to pass 512 bytes of randomized data (as that matches the Linux kernel pool
+        size), which may be generated with a command like the following:</para>
+
+        <programlisting>dd if=/dev/urandom bs=512 count=1 status=none | base64 -w 0</programlisting>
+
+        <para>Again: do not use this option outside of testing environments, it's a security risk elsewhere,
+        as secret key material derived from the entropy pool can possibly be reconstructed by unprivileged
+        programs.</para>
+        </listitem>
       </varlistentry>
 
       <varlistentry>
index 34bb5d2f1edded63ba4876f8d3f94ca9be91f49a..273270f55013d55f9dd6895b24b11d8112d0676d 100644 (file)
@@ -36,7 +36,7 @@
     <title>Description</title>
     <para><command>kernel-install</command> is used to install and remove kernel and initramfs images to and
     from the boot loader partition, referred to as <varname>$BOOT</varname> here. It will usually be one of
-    <filename>/boot</filename>, <filename>/efi</filename>, or <filename>/boot/efi</filename>, see below.
+    <filename>/boot/</filename>, <filename>/efi/</filename>, or <filename>/boot/efi/</filename>, see below.
     </para>
 
     <para><command>kernel-install</command> will execute the files
@@ -80,7 +80,7 @@
             </para></listitem>
 
             <listitem><para><filename>50-depmod.install</filename> runs
-            <citerefentry><refentrytitle>depmod</refentrytitle><manvolnum>8</manvolnum></citerefentry> for the
+            <citerefentry project='man-pages'><refentrytitle>depmod</refentrytitle><manvolnum>8</manvolnum></citerefentry> for the
             <replaceable>KERNEL-VERSION</replaceable>.</para></listitem>
 
             <listitem><para><filename>90-loaderentry.install</filename> copies <replaceable>KERNEL-IMAGE</replaceable>
     <para>The partition where the kernels and <ulink url="https://systemd.io/BOOT_LOADER_SPECIFICATION">Boot
     Loader Specification</ulink> snippets are located is called <varname>$BOOT</varname>.
     <command>kernel-install</command> determines the location of this partition by checking
-    <filename>/efi/</filename>, <filename>/boot/</filename>, and <filename>/boot/efi</filename>
+    <filename>/efi/</filename>, <filename>/boot/</filename>, and <filename>/boot/efi/</filename>
     in turn. The first location where <filename>$BOOT/loader/entries/</filename> or
     <filename>$BOOT/$MACHINE_ID/</filename> exists is used.</para>
   </refsect1>
     <para>
       <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>os-release</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>depmod</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>depmod</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-boot</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
       <ulink url="https://systemd.io/BOOT_LOADER_SPECIFICATION">Boot Loader Specification</ulink>
     </para>
index b00daf366da7971c538d541c9f210e1bba4673c2..22f21355b625eae5b8183d574f899ec89ad0a017 100644 (file)
@@ -46,7 +46,7 @@
     <title>Options</title>
 
     <para>All options are configured in the
-    <literal>[Login]</literal> section:</para>
+    [Login] section:</para>
 
     <variablelist class='config-directives'>
 
       <varlistentry>
         <term><varname>HoldoffTimeoutSec=</varname></term>
 
-        <listitem><para>Specifies the timeout after system startup or
+        <listitem><para>Specifies a period of time after system startup or
         system resume in which systemd will hold off on reacting to
         lid events. This is required for the system to properly
         detect any hotplugged devices so systemd can ignore lid events
index ebee065a614f901e1000a5ab723be5c1c8ad43db..bd55366ac8805a739ac2d7f4e76a387d1f2b5ec6 100644 (file)
@@ -39,7 +39,7 @@
 
     <para>The machine ID may be set, for example when network booting, with the
     <varname>systemd.machine_id=</varname> kernel command line parameter or by passing the
-    option <option>--machine-id=</option> to systemd. An ID is specified in this manner
+    option <option>--machine-id=</option> to systemd. An ID specified in this manner
     has higher priority and will be used instead of the ID stored in
     <filename>/etc/machine-id</filename>.</para>
 
index e903eca7214aea2a83af521ba390212e569b60e5..37e51f90cf2718bb6c4bf0eee79e706351d536e9 100644 (file)
 
         <listitem><para>Copies files or directories from a container
         into the host system. Takes a container name, followed by the
-        source path in the container the destination path on the host.
+        source path in the container and the destination path on the host.
         If the destination path is omitted, the same as the source path
         is used.</para>
 
index 812c6767fcb06ff57146192de06f5734ebddad64..fa6164b8ded36e17066039ed07852ecf0718346c 100755 (executable)
@@ -6,7 +6,7 @@ if [ -z "$1" ]; then
     exit 1
 fi
 
-# make sure the rules have been regenrated (in case man/update-man-rules was just run)
+# make sure the rules have been regenerated (in case man/update-man-rules was just run)
 ninja -C "@BUILD_ROOT@" version.h
 
 page="$(echo "$1" | sed 's/\./\\./')"
index a6bc61a44fc17919a758293697311d2996438b73..bd958fb1e0152905dd027e2a43f7ce98309202ad 100644 (file)
@@ -233,7 +233,7 @@ s - Service VLAN, m - Two-port MAC Relay (TPMR)
 
         <listitem><para>Show numerical address labels that can be used for address selection.
         This is the same information that
-        <citerefentry><refentrytitle>ip-addrlabel</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+        <citerefentry project='die-net'><refentrytitle>ip-addrlabel</refentrytitle><manvolnum>8</manvolnum></citerefentry>
         shows. See <ulink url="https://tools.ietf.org/html/rfc3484">RFC 3484</ulink>
         for a discussion of address labels.</para>
 
index 6c60f6cf6b25f07b5a40d58329d1a250a097b66c..e8e41ebe920f73676562bef89707ad598e07ce73 100644 (file)
@@ -45,7 +45,7 @@
   <refsect1>
     <title>[Network] Section Options</title>
 
-    <para>The following options are available in the <literal>[Network]</literal> section:</para>
+    <para>The following options are available in the [Network] section:</para>
 
     <variablelist class='network-directives'>
       <varlistentry>
index e23b24483e4fae3e1834db34924f7c4b1706d240..8bb21f2621b5b2533b40427f4316fd0b33abb6a4 100644 (file)
@@ -18,8 +18,7 @@
   <refnamediv>
     <refname>nss-myhostname</refname>
     <refname>libnss_myhostname.so.2</refname>
-    <refpurpose>Provide hostname resolution for the locally
-    configured system hostname.</refpurpose>
+    <refpurpose>Hostname resolution for the locally configured system hostname</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index 1ff88aba2d1dedca9cd80b8c92c27fa69e04cf7b..6e4883555047ecd207a737ba2ece387860d8967f 100644 (file)
@@ -18,8 +18,7 @@
   <refnamediv>
     <refname>nss-mymachines</refname>
     <refname>libnss_mymachines.so.2</refname>
-    <refpurpose>Provide hostname resolution for local
-    container instances.</refpurpose>
+    <refpurpose>Hostname resolution for local container instances</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index 8bc75b1316038901311fc7ab86b14561e66e5d47..332cf0b06d3019b7e24e762c61369fde7ceda009 100644 (file)
@@ -18,7 +18,7 @@
   <refnamediv>
     <refname>nss-resolve</refname>
     <refname>libnss_resolve.so.2</refname>
-    <refpurpose>Provide hostname resolution via <filename>systemd-resolved.service</filename></refpurpose>
+    <refpurpose>Hostname resolution via <filename>systemd-resolved.service</filename></refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index ac22452bc3ed4ab0c23857eba8ccd247d36f6171..26730f0fe90dd1cefc22e9efac47e51c502771ae 100644 (file)
@@ -18,7 +18,7 @@
   <refnamediv>
     <refname>nss-systemd</refname>
     <refname>libnss_systemd.so.2</refname>
-    <refpurpose>Provide UNIX user and group name resolution for user/group lookup via Varlink</refpurpose>
+    <refpurpose>UNIX user and group name resolution for user/group lookup via Varlink</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index 125a008347d11162cd7185f1a77ce8f6fd9d0838..d8ce392c879237609478b7a81122212484c2d282 100644 (file)
@@ -75,7 +75,7 @@ node /org/freedesktop/LogControl1 {
       <title>Properties</title>
 
       <para><varname>LogLevel</varname> describes the
-      <citerefentry><refentrytitle>syslog</refentrytitle><manvolnum>3</manvolnum></citerefentry>-style
+      <citerefentry project='man-pages'><refentrytitle>syslog</refentrytitle><manvolnum>3</manvolnum></citerefentry>-style
       log-level, and should be one of <literal>emerg</literal>, <literal>alert</literal>,
       <literal>crit</literal>, <literal>err</literal>, <literal>warning</literal>, <literal>notice</literal>,
       <literal>info</literal>, <literal>debug</literal>, in order of increasing verbosity.</para>
@@ -83,17 +83,17 @@ node /org/freedesktop/LogControl1 {
       <para><varname>LogTarget</varname> describes the log target (mechanism). It should be one of
       <literal>console</literal> (log to the console or standard output),
       <literal>kmsg</literal> (log to the kernel ring buffer),
-      <literal>journal</literal> (log the the journal natively, see
+      <literal>journal</literal> (log to the journal natively, see
       <citerefentry><refentrytitle>systemd-journald.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>),
       <literal>syslog</literal> (log using the
-      <citerefentry><refentrytitle>syslog</refentrytitle><manvolnum>3</manvolnum></citerefentry> call).
+      <citerefentry project='man-pages'><refentrytitle>syslog</refentrytitle><manvolnum>3</manvolnum></citerefentry> call).
       </para>
 
       <para>Those two properties are writable, so they may be set by sufficiently privileged users.</para>
 
       <para><varname>SyslogIdentifier</varname> is a read-only property that shows the "syslog identifier".
       It is a short string that identifies the program that is the source of log messages that is passed to
-      the <citerefentry><refentrytitle>syslog</refentrytitle><manvolnum>3</manvolnum></citerefentry> call.
+      the <citerefentry project='man-pages'><refentrytitle>syslog</refentrytitle><manvolnum>3</manvolnum></citerefentry> call.
       </para>
 
       <para>Note: <command>journalctl</command> option <option>-p</option>/<option>--priority=</option> may
index 1b2c52af03950f7d7d02ed61f3eea3ba40e2f18c..5cf1159703b1fb9f3e4aa06b9c6877b736439fae 100644 (file)
@@ -24,7 +24,7 @@
     <title>Introduction</title>
 
     <para><citerefentry><refentrytitle>systemd-homed.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
-    is a system service which may be used to to create, remove, change or inspect home areas. This page
+    is a system service which may be used to create, remove, change or inspect home areas. This page
     describes the D-Bus interface.
     </para>
   </refsect1>
@@ -165,7 +165,7 @@ node /org/freedesktop/home1 {
 
       <para><function>GetHomeByName()</function> returns basic user information (a minimal subset of the full
       user record), provided a user name. The information supplied more or less matches what
-      <citerefentry><refentrytitle>getpwnam</refentrytitle><manvolnum>3</manvolnum></citerefentry> returns:
+      <citerefentry project='man-pages'><refentrytitle>getpwnam</refentrytitle><manvolnum>3</manvolnum></citerefentry> returns:
       the numeric UID and GID, the real name, home directory and shell. In addition it returns a state
       identifier describing the state the user's home directory is in, as well as a bus path referring to the
       bus object encapsulating the user record and home directory. This object implements the
@@ -227,7 +227,7 @@ node /org/freedesktop/home1 {
       interface.</para>
 
       <para><function>CreateHome()</function> registers and creates a new home directory. This takes a fully
-      specified JSON user record as argument (including the <literal>secret</literal> section. This registers
+      specified JSON user record as argument (including the <literal>secret</literal> section). This registers
       the user record locally and creates a home directory matching it, depending on the settings specified
       in the record in combination with local configuration.</para>
 
index d17d9a55213d3549c0e4ecaf82a8e935cbbf8284..6b2341e48c08217531e872ee809cb2ecf4195325 100644 (file)
@@ -239,7 +239,7 @@ node /org/freedesktop/hostname1 {
 
       <para><varname>KernelName</varname>, <varname>KernelRelease</varname>, and
       <varname>KernelVersion</varname> expose the kernel name (e.g. <literal>Linux</literal>), release
-      (e.g. <literal>5.0.0-11</literal>, and version (i.e. the build number, e.g. <literal>#11</literal>) as
+      (e.g. <literal>5.0.0-11</literal>), and version (i.e. the build number, e.g. <literal>#11</literal>) as
       reported by
       <citerefentry project="man-pages"><refentrytitle>uname</refentrytitle><manvolnum>2</manvolnum></citerefentry>.
       <varname>OperatingSystemPrettyName</varname>, <varname>OperatingSystemCPEName</varname>, and
index 1414cc15d794eb00380359f0bc2fad84ae03f2b3..56ce9f0b4503c9bab7f86cd37ac63776f46a1ce7 100644 (file)
@@ -37,7 +37,7 @@
     is mostly a small companion service for
     <citerefentry><refentrytitle>systemd-machined.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
     Many operations to manipulate local container and VM images are hence available via the <command>systemd-machined</command> D-Bus API, c.f.
-    <citerefentry><refentrytitle>org.freedesktop.machine1.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+    <citerefentry><refentrytitle>org.freedesktop.machine1</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
     </para>
   </refsect1>
 
index 0292288d3a6402b5162c8bcf4a93b5de3c5cf924..1b7c3b642133b2d2fc5a1467faf8ad51136bfde9 100644 (file)
@@ -567,7 +567,7 @@ node /org/freedesktop/login1 {
 
       <para><function>SetWallMessage()</function> sets the wall message (the message that will be sent out to
       all terminals and stored in a
-      <citerefentry><refentrytitle>utmp</refentrytitle><manvolnum>5</manvolnum></citerefentry> record) for a
+      <citerefentry project='man-pages'><refentrytitle>utmp</refentrytitle><manvolnum>5</manvolnum></citerefentry> record) for a
       subsequent scheduled shutdown operation. The parameter <varname>wall_message</varname> specifies the
       shutdown reason (and may be empty) which will be included in the shutdown message. The parameter
       <varname>enable</varname> specifies whether to print a wall message on shutdown.</para>
index c18e133e7cbc6ff1a0b340b4ced3612110330eca..a54fa040b264263185789221447878dd7126065f 100644 (file)
@@ -368,7 +368,8 @@ node /org/freedesktop/machine1 {
 
       <para><function>OpenMachinePTY()</function> allocates a pseudo TTY in the container and returns a file
       descriptor and its path. This is equivalent to transitioning into the container and invoking
-      <citerefentry><refentrytitle>posix_openpt</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>
+      <citerefentry project='man-pages'><refentrytitle>posix_openpt</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
+      </para>
 
       <para><function>OpenMachineLogin()</function> allocates a pseudo TTY in the container and ensures that
       a getty login prompt of the container is running on the other end. It returns the file descriptor of
index b6a643aaf1b2e66bc827f187d518482816fe025b..6b16ae16da917b1c15eff47d35bc70534de6089f 100644 (file)
@@ -1312,7 +1312,7 @@ node /org/freedesktop/systemd1 {
       <para><function>SetUnitProperties()</function> may be used to modify certain unit properties at
       runtime. Not all properties may be changed at runtime, but many resource management settings (primarily
       those listed in
-      <citerefentry><refentrytitle>systemd.cgroup</refentrytitle><manvolnum>5</manvolnum></citerefentry>)
+      <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>)
       may. The changes are applied instantly and stored on disk for future boots, unless
       <varname>runtime</varname> is true, in which case the settings only apply until the next
       reboot. <varname>name</varname> is the name of the unit to modify. <varname>properties</varname> are
@@ -1472,12 +1472,12 @@ node /org/freedesktop/systemd1 {
       <para>Read access is generally granted to all clients. Additionally, for unprivileged clients, some
       operations are allowed through the polkit privilege system. Operations which modify unit state
       (<function>StartUnit()</function>, <function>StopUnit()</function>, <function>KillUnit()</function>,
-      <function>RestartUnit()</function> and similar, <function>SetProperty</function>) require
+      <function>RestartUnit()</function> and similar, <function>SetProperty()</function>) require
       <interfacename>org.freedesktop.systemd1.manage-units</interfacename>. Operations which modify unit file
       enablement state (<function>EnableUnitFiles()</function>, <function>DisableUnitFiles()</function>,
       <function>ReenableUnitFiles()</function>, <function>LinkUnitFiles()</function>,
       <function>PresetUnitFiles</function>, <function>MaskUnitFiles</function>, and similar) require
-      <interfacename>org.freedesktop.systemd1.manage-unit-files</interfacename>). Operations which modify the
+      <interfacename>org.freedesktop.systemd1.manage-unit-files</interfacename>. Operations which modify the
       exported environment (<function>SetEnvironment()</function>, <function>UnsetEnvironment()</function>,
       <function>UnsetAndSetEnvironment()</function>) require
       <interfacename>org.freedesktop.systemd1.set-environment</interfacename>. <function>Reload()</function>
@@ -8278,16 +8278,16 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
 
       <para>Most of the properties map directly to the corresponding settings in swap unit files. As mount
       units invoke the
-      <citerefentry><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry> command,
+      <citerefentry project='man-pages'><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry> command,
       their bus objects include implicit <varname>ExecActivate</varname> (and similar) fields which contain
       information about processes to execute. They also share most of the fields related to the execution
       context that Service objects expose (see above). In addition to these properties there are the
       following:</para>
 
       <para><varname>ControlPID</varname> contains the PID of the currently running
-      <citerefentry><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry> or
-      <citerefentry><refentrytitle>swapoff</refentrytitle><manvolnum>8</manvolnum></citerefentry> command if
-      there is one running, otherwise 0.</para>
+      <citerefentry project='man-pages'><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry> or
+      <citerefentry project='man-pages'><refentrytitle>swapoff</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+      command if there is one running, otherwise 0.</para>
 
       <para><varname>Result</varname> contains a value explaining why a mount unit failed if it failed. It
       can take the values <literal>success</literal>, <literal>resources</literal>,
index 70927d737423c278e4b48bcc256717c812a029fc..609743be6b2f24b34725c76daa11d3bf146d9d16 100644 (file)
         hence be used to uniquely label files or other resources of this session. Combine this ID with the boot
         identifier, as returned by
         <citerefentry><refentrytitle>sd_id128_get_boot</refentrytitle><manvolnum>3</manvolnum></citerefentry>, for a
-        globally unique identifier for the current session.</para></listitem>
+        globally unique identifier.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
     <para> See
     <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more information about the resources.
-    Also, see <citerefentry><refentrytitle>pam_set_data</refentrytitle><manvolnum>3</manvolnum></citerefentry> for additional information about how to set
+    Also, see <citerefentry project='man-pages'><refentrytitle>pam_set_data</refentrytitle><manvolnum>3</manvolnum></citerefentry> for additional information about how to set
     the context objects.
     </para>
 
index f2d8da40c410ffaff35f3100273fa5b2f09ed61c..962429683d6b38fcbe3424713f575c0c798a1143 100644 (file)
 
         <para>By default all unit files whose names start with a prefix generated from the image's file name are copied
         out. Specifically, the prefix is determined from the image file name with any suffix such as
-        <filename>.raw</filename> removed, truncated at the first occurrence of and underscore character
+        <filename>.raw</filename> removed, truncated at the first occurrence of an underscore character
         (<literal>_</literal>), if there is one. The underscore logic is supposed to be used to versioning so that the
         an image file <filename>foobar_47.11.raw</filename> will result in a unit file matching prefix of
         <filename>foobar</filename>. This prefix is then compared with all unit files names contained in the image in
       </tgroup>
     </table>
 
-    <para>For details on this profiles, and their effects please have a look at their precise definitions,
+    <para>For details on these profiles and their effects see their precise definitions,
     e.g. <filename>/usr/lib/systemd/portable/profile/default/service.conf</filename> and similar.</para>
   </refsect1>
 
index 2b9c8b1a7145ca015ab1079d52c02bdb3a55afe1..501171e78a887f245756cfce1206ef43c6a02816 100644 (file)
@@ -44,7 +44,7 @@
     <title>Options</title>
 
     <para>All options are configured in the
-    <literal>[PStore]</literal> section:</para>
+    [PStore] section:</para>
 
     <variablelist class='config-directives'>
 
@@ -82,7 +82,7 @@
   <refsect1>
     <title>See Also</title>
     <para>
-      <citerefentry><refentrytitle>systemd-journald.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-journald.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     </para>
   </refsect1>
 
index 32df1e3d7f76d40aa7aa4c1c7422a6d16ba2ec94..1b104e76d075c599124a88b7e55c8d172287e2dc 100644 (file)
 
               <row>
                 <entry><constant>root-secondary</constant></entry>
-                <entry>Root file system partition of the secondary architecture of the local architectureusually the matching 32bit architecture for the local 64bit architecture)</entry>
+                <entry>Root file system partition of the secondary architecture of the local architecture (usually the matching 32bit architecture for the local 64bit architecture)</entry>
               </row>
 
               <row>
         <term><varname>PaddingMinBytes=</varname></term>
         <term><varname>PaddingMaxBytes=</varname></term>
 
-        <listitem><para>Specifies minimum and maximum size constrains in bytes for the free space after the
+        <listitem><para>Specifies minimum and maximum size constraints in bytes for the free space after the
         partition (the "padding"). Semantics are similar to <varname>SizeMinBytes=</varname> and
         <varname>SizeMaxBytes=</varname>, except that unlike partition sizes free space can be shrunk and can
         be as small as zero. By default no size constraints on padding are set, so that only
         <varname>PaddingWeight=</varname> determines the size of the padding applied.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>CopyBlocks=</varname></term>
+
+        <listitem><para>Takes a path to a regular file, block device node or directory. If specified and the
+        partition is newly created the data from the specified path is written to the newly created
+        partition, on the block level. If a directory is specified the backing block device of the file
+        system the directory is on is determined and the data read directly from that. This option is useful
+        to efficiently replicate existing file systems on the block level on a new partition, for example to
+        build a simple OS installer or OS image builder.</para>
+
+        <para>The file specified here must have a size that is a multiple of the basic block size 512 and not
+        be empty. If this option is used, the size allocation algorithm is slightly altered: the partition is
+        created as least as big as required to fit the data in, i.e. the data size is an additional minimum
+        size value taken into consideration for the allocation algorithm, similar to and in addition to the
+        <varname>SizeMin=</varname> value configured above.</para>
+
+        <para>This option has no effect if the partition it is declared for already exists, i.e. existing
+        data is never overwritten. Note that the data is copied in before the partition table is updated,
+        i.e. before the partition actually is persistently created. This provides robustness: it is
+        guaranteed that the partition either doesn't exist or exists fully populated; it is not possible that
+        the partition exists but is not or only partially populated.</para></listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>FactoryReset=</varname></term>
 
index e2d00b9cf08c250598bb6138606c61b96ce50c2f..0ae70dc34bd2d324db947f569a654f2f020c7219 100644 (file)
         <term><option>-a</option></term>
         <listitem><para>Registers per-interface DNS configuration data with
         <command>systemd-resolved</command>. Expects a network interface name as only command line argument. Reads
-        <citerefentry><refentrytitle>resolv.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry> compatible DNS
-        configuration data from its standard input. Relevant fields are <literal>nameserver</literal> and
+        <citerefentry project='man-pages'><refentrytitle>resolv.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>-compatible
+        DNS configuration data from its standard input. Relevant fields are <literal>nameserver</literal> and
         <literal>domain</literal>/<literal>search</literal>. This command is mostly identical to invoking
-        <command>resolvectl</command> with a combination of <option>dns</option> and
-        <option>domain</option> commands.</para></listitem>
+        <command>resolvectl</command> with a combination of <option>dns</option> and <option>domain</option>
+        commands.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 0e9b90c1cd9c375b23a1c119b9398564d230128c..0e7a9f4bc664cd8eceaa10ab674faa469e013b74 100644 (file)
@@ -41,7 +41,7 @@
   <refsect1>
     <title>Options</title>
 
-    <para>The following options are available in the <literal>[Resolve]</literal> section:</para>
+    <para>The following options are available in the [Resolve] section:</para>
 
     <variablelist class='network-directives'>
 
@@ -80,7 +80,7 @@
 
         <para>The domains prefixed with <literal>~</literal> are called "routing domains". All domains listed
         here (both search domains and routing domains after removing the <literal>~</literal> prefix) define
-        a search path that preferably directs DNS queries to this inteface. This search path has an effect
+        a search path that preferably directs DNS queries to this interface. This search path has an effect
         only when suitable per-link DNS servers are known. Such servers may be defined through the
         <varname>DNS=</varname> setting (see above) and dynamically at run time, for example from DHCP
         leases. If no per-link DNS servers are known, routing domains have no effect.</para>
index 0938255d5c02cc8313722c8c17d22ae61b309dde..199a4a81e998c36f547c86739d479e05288c50f1 100644 (file)
 <citerefentry><refentrytitle>sd_bus_get_name_machine_id</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_get_name_creds</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_get_owner_creds</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+<citerefentry><refentrytitle>sd_bus_get_property</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+<citerefentry><refentrytitle>sd_bus_get_property_trivial</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+<citerefentry><refentrytitle>sd_bus_get_property_string</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+<citerefentry><refentrytitle>sd_bus_get_property_strv</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_get_scope</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_get_tid</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_get_unique_name</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_get_errno</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_get_error</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_get_monotonic_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-<citerefentry><refentrytitle>sd_bus_message_get_property</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-<citerefentry><refentrytitle>sd_bus_message_get_property_trivial</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-<citerefentry><refentrytitle>sd_bus_message_get_property_string</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-<citerefentry><refentrytitle>sd_bus_message_get_property_strv</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_get_sender</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_get_signature</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_get_type</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
index a7690d5817443da6c6b169d9123c18476e5105ac..a3e8079c5187a930675a1ff3722c3bcb4aeed770 100644 (file)
     information, in particular it should not be used for security-relevant decisions. That's because the
     executable might have been replaced or removed by the time the value can be processed. Moreover, the
     kernel exports this information in an ambiguous way (i.e. a deleted executable cannot be safely
-    distinguished from one whose name suffix is <literal> (deleted)</literal>.</para>
+    distinguished from one whose name suffix is <literal> (deleted)</literal>).</para>
 
     <para><function>sd_bus_creds_get_cmdline()</function> will
     retrieve an array of command line arguments (as stored in
index 3318a3031bc660caec63466374561a0ab619194b..f948b5914f54bcb42a3377b34be07729dfec633a 100644 (file)
@@ -19,7 +19,7 @@
   <refnamediv>
     <refname>sd_bus_enqueue_for_read</refname>
 
-    <refpurpose>Re-enqueue a bus message on a bus connection, for reading.</refpurpose>
+    <refpurpose>Re-enqueue a bus message on a bus connection, for reading</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index 69261af93efa5c11e804c1c2340504a95884880f..466606118bd465e53875d7fac7df8c47cee1f761 100644 (file)
@@ -79,7 +79,7 @@
     <constant>POLLIN</constant>, <constant>POLLOUT</constant>, … events, or negative on error.
     </para>
 
-    <para><function>sd_bus_get_timeout()</function> returns the timeout in µs to pass to to
+    <para><function>sd_bus_get_timeout()</function> returns the timeout in µs to pass to
     <function>poll()</function> or a similar call when waiting for events on the specified bus
     connection. The returned timeout may be zero, in which case a subsequent I/O polling call
     should be invoked in non-blocking mode. The returned timeout may be
index 73c0ba1bf1feef909e3e3acfc7f716603b79e189..a72024e5a7eb8f4812bb8beaf06aa4a8d3a71e73 100644 (file)
@@ -91,7 +91,7 @@
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>sd_bus_message_call_method</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>sd_bus_call_method</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     </para>
   </refsect1>
 
index d993142cb5c9d45d9bfd0272685a050fa7942b57..4a21189c1d2a5f4cd6fb8f2645b485ef3e16aa84 100644 (file)
@@ -20,7 +20,7 @@
     <refname>sd_bus_is_open</refname>
     <refname>sd_bus_is_ready</refname>
 
-    <refpurpose>Check whether the a bus connection is open or ready.</refpurpose>
+    <refpurpose>Check whether the bus connection is open or ready</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index 2b962413d2a4334c2c4157cef0137bdde294ccc4..442c763a4924c22f7fc198ca0413cee0959d0991 100644 (file)
     <constant>SD_BUS_MESSAGE_METHOD_RETURN</constant>, <constant>SD_BUS_MESSAGE_METHOD_ERROR</constant>,
     <constant>SD_BUS_MESSAGE_SIGNAL</constant>. This type is either specified as a parameter when the message
     is created using
-    <citerefentry><refentrytitle>sd_bus_set_message_new</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_message_new</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     or is set automatically when the message is created using
-    <citerefentry><refentrytitle>sd_bus_set_message_new_signal</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_set_message_new_method_call</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_set_message_new_method_error</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    <citerefentry><refentrytitle>sd_bus_message_new_signal</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_message_new_method_call</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_message_new_method_error</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     and similar functions.</para>
 
     <para><function>sd_bus_message_get_error()</function> returns the error stored in the message
     signal message. If <parameter>interface</parameter> is non-null, it also checks if the message has the
     same interface set. If <parameter>member</parameter> is non-null, it also checks if the message has the
     same member set. Also see
-    <citerefentry><refentrytitle>sd_bus_set_message_new_signal</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
+    <citerefentry><refentrytitle>sd_bus_message_new_signal</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
     It returns true when all checks pass.</para>
 
     <para><function>sd_bus_message_is_method_call()</function> checks if message <parameter>m</parameter>
     is a method call message. If <parameter>interface</parameter> is non-null, it also checks if the message
     has the same interface set. If <parameter>member</parameter> is non-null, it also checks if the message
     has the same member set. Also see
-    <citerefentry><refentrytitle>sd_bus_set_message_new_method_call</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
+    <citerefentry><refentrytitle>sd_bus_message_new_method_call</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
     It returns true when all checks pass.</para>
 
     <para><function>sd_bus_message_is_method_error()</function> checks if message <parameter>m</parameter>
     is an error reply message. If <parameter>name</parameter> is non-null, it also checks if the message has
     the same error identifier set. Also see
-    <citerefentry><refentrytitle>sd_bus_set_message_new_method_error</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
+    <citerefentry><refentrytitle>sd_bus_message_new_method_error</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
     It returns true when all checks pass.</para>
   </refsect1>
 
index 0c471c534ff6509b01a7a5979c51e1b3ff9cb397..39bb24c3a53613b10f0f7d45b050f68ee1dffae1 100644 (file)
@@ -22,7 +22,7 @@
     <refname>sd_bus_message_new_method_errno</refname>
     <refname>sd_bus_message_new_method_errnof</refname>
 
-    <refpurpose>Create a an error reply for a method call</refpurpose>
+    <refpurpose>Create an error reply for a method call</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
@@ -98,7 +98,7 @@
     an error reply similarly to
     <function>sd_bus_message_new_method_error()</function>, but in addition to the
     error structure <parameter>p</parameter>, it takes an
-    <citerefentry><refentrytitle>errno</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    <citerefentry project='man-pages'><refentrytitle>errno</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     error value in parameter <parameter>error</parameter>. If the error
     <parameter>p</parameter> is set (see
     <citerefentry><refentrytitle>sd_bus_error_is_set</refentrytitle><manvolnum>3</manvolnum></citerefentry>),
     <para>The <function>sd_bus_message_new_method_errnof()</function> function
     creates an error reply similarly to
     <function>sd_bus_message_new_method_error()</function>. It takes an
-    <citerefentry><refentrytitle>errno</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    <citerefentry project='man-pages'><refentrytitle>errno</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     error value in parameter <parameter>error</parameter>, plus a <citerefentry
     project='man-pages'><refentrytitle>printf</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     format string <parameter>format</parameter> and corresponding arguments.
index 97afcd5c591fba5f0817e72539c44bf15f5cf23e..5ac35e7a3a6dcbf7455f0c7b89f515d71414a904 100644 (file)
@@ -45,7 +45,7 @@
     parameter. The signal will be sent to path <parameter>path</parameter>, on the interface
     <parameter>interface</parameter>, member <parameter>member</parameter>. When this message is
     sent, no reply is expected. See
-    <citerefentry><refentrytitle>sd_bus_message_new_call</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+    <citerefentry><refentrytitle>sd_bus_message_new_method_call</refentrytitle><manvolnum>1</manvolnum></citerefentry>
     for a short description of the meaning of the <parameter>path</parameter>,
     <parameter>interface</parameter>, and <parameter>member</parameter> parameters.
     </para>
index f17a54f26941aded576f64fcfc7a482d3e63902f..340049fc972e384418d9633783a494ba56096762 100644 (file)
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_bus_start</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>sd_bus_message_can_send</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>sd_bus_can_send</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_bus_message_get_monotonic_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_bus_message_get_realtime_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_bus_message_get_seqnum</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
index 0a85557ec6e82e8bdcf6cc205b43d0e3801212b0..dcf9ee299fbe79d53b134d3fd75ccbd07610efe6 100644 (file)
@@ -84,7 +84,7 @@
     <para>The <function>sd_bus_reply_method_error()</function> function sends an error reply to the
     <parameter>call</parameter> message. The error structure <parameter>e</parameter> specifies the
     error to send, and is used as described in
-    <citerefentry><refentrytitle>sd_bus_message_new_error</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
+    <citerefentry><refentrytitle>sd_bus_message_new_method_error</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
     If no reply is expected to <parameter>call</parameter>, this function succeeds without sending a
     reply.</para>
 
index edb0df205a88ba1e08de355657c5d125e65e4d70..b025112b6393e7503a8a86922344c6b0b4732c20 100644 (file)
@@ -20,7 +20,7 @@
     <refname>sd_bus_set_connected_signal</refname>
     <refname>sd_bus_get_connected_signal</refname>
 
-    <refpurpose>Control emmission of local connection establishment signal on bus connections</refpurpose>
+    <refpurpose>Control emission of local connection establishment signal on bus connections</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index cbdc7dd1eda47d3dc1f6ec88434615e179adf439..5638cdc0a62e4cbc503e2976457ac601b6352304 100644 (file)
@@ -48,7 +48,7 @@
     socket binding for a bus connection object. If the <parameter>b</parameter> is true, the feature is enabled,
     otherwise disabled (which is the default). When enabled, and the selected bus address refers to an
     <filename>AF_UNIX</filename> socket in the file system which does not exist while the connection attempt is made an
-    <citerefentry><refentrytitle>inotify</refentrytitle><manvolnum>7</manvolnum></citerefentry> watch is installed on
+    <citerefentry project='man-pages'><refentrytitle>inotify</refentrytitle><manvolnum>7</manvolnum></citerefentry> watch is installed on
     it, waiting for the socket to appear. As soon as the socket appears the connection is made. This functionality is
     useful in particular in early-boot programs that need to run before the system bus is available, but want to
     connect to it the instant it may be connected to.</para>
     <para><function>sd_bus_get_watch_bind()</function> may be used to query the current setting of this feature. It
     returns zero when the feature is disabled, and positive if enabled.</para>
 
-    <para>Note that no timeout is applied while it is waited for the socket to appear. This means that any synchronous
-    remote operation (such as
+    <para>Note that no timeout is applied while we wait for the socket to appear. This means that any
+    synchronous remote operation (such as
     <citerefentry><refentrytitle>sd_bus_call</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_add_match</refentrytitle><manvolnum>3</manvolnum></citerefentry> or
-    <citerefentry><refentrytitle>sd_bus_request_name</refentrytitle><manvolnum>3</manvolnum></citerefentry>), that is
-    used on a connection with this feature enabled that is not established yet might block unbounded if the socket is
-    never created. However, asynchronous remote operations (such as
+    <citerefentry><refentrytitle>sd_bus_request_name</refentrytitle><manvolnum>3</manvolnum></citerefentry>),
+    that is used on a connection with this feature enabled that hasn't been established yet, might block
+    forever if the socket is never created. However, asynchronous remote operations (such as
     <citerefentry><refentrytitle>sd_bus_send</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_add_match_async</refentrytitle><manvolnum>3</manvolnum></citerefentry> or
-    <citerefentry><refentrytitle>sd_bus_request_match_async</refentrytitle><manvolnum>3</manvolnum></citerefentry>) do
-    not block in this case, and safely enqueue the requested operations to be dispatched the instant the connection is
-    set up.</para>
+    <citerefentry><refentrytitle>sd_bus_call_async</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_add_match_async</refentrytitle><manvolnum>3</manvolnum></citerefentry>)
+    do not block in this case, and safely enqueue the requested operations to be dispatched the instant the
+    connection is set up.</para>
 
     <para>Use <citerefentry><refentrytitle>sd_bus_is_ready</refentrytitle><manvolnum>3</manvolnum></citerefentry> to
     determine whether the connection is fully established, i.e. whether the peer socket has been bound, connected to
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>inotify</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>inotify</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_bus_call</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_bus_add_match</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_bus_request_name</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
index c6fe72e37b5ff541488db1cb523793d3678de9d2..c2a0876e212506cd0f3d8b9e8476e21874ba418a 100644 (file)
@@ -23,7 +23,7 @@
     <refname>sd_bus_track_get_destroy_callback</refname>
     <refname>sd_bus_destroy_t</refname>
 
-    <refpurpose>Define the callback function for resource cleanup.</refpurpose>
+    <refpurpose>Define the callback function for resource cleanup</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index f63907aa405f48702cede38f0db8b19bd5b065d6..ecfc07951415536cbc86328e9a43b6d77b2da213 100644 (file)
@@ -19,7 +19,7 @@
     <refname>sd_bus_slot_set_floating</refname>
     <refname>sd_bus_slot_get_floating</refname>
 
-    <refpurpose>Control whether a bus slot object is "floating".</refpurpose>
+    <refpurpose>Control whether a bus slot object is "floating"</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index 3db39c9d06bfdeaf824e4966e294045f279f8e64..0e572c40ee46a60a2ab6e35437dd4b53ed083738 100644 (file)
     automatically as the code block is left:</para>
 
     <programlisting>{
-        __attribute__((cleanup(sd_event_unrefp)) sd_event *event = NULL;
+        __attribute__((cleanup(sd_event_unrefp))) sd_event *event = NULL;
         int r;
         …
         r = sd_event_default(&amp;event);
index 2ffca9ec365bcec45c80619611c4da955763f292..3df926b8634f02728fa71ed3078e850fa177c8fb 100644 (file)
@@ -21,7 +21,7 @@
     <refname>sd_event_source_get_destroy_callback</refname>
     <refname>sd_event_destroy_t</refname>
 
-    <refpurpose>Define the callback function for resource cleanup.</refpurpose>
+    <refpurpose>Define the callback function for resource cleanup</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index ded87215379ef73977ac61a39d9dcac3aacdad2f..dbaaf6292cff8620b09aa9894f77351e05bc0786 100644 (file)
@@ -64,7 +64,7 @@
     <para><function>sd_hwdb_get()</function> queries the <parameter>hwdb</parameter> object created earlier
     with <citerefentry><refentrytitle>sd_hwdb_new</refentrytitle><manvolnum>3</manvolnum></citerefentry> for
     entries matching the specified string <parameter>modalias</parameter>, and returns the value
-    corresponding to the the key <parameter>key</parameter>. The value is returned as a
+    corresponding to the key <parameter>key</parameter>. The value is returned as a
     <constant>NUL</constant>-terminated string in <parameter>value</parameter>. It must not be modified by
     the caller and is valid as long as a reference to <parameter>hwdb</parameter> is kept. When multiple
     patterns in the database match <parameter>modalias</parameter>, the one with the highest priority is
 
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd-udev.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-udevd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd-hwdb</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-hwdb</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     </para>
index 257b347b9b616b2e8d957670412928e5ad7fd628..8f1c01b7314bde75c720ade641030110956288ee 100644 (file)
 
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd-udev.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-udevd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd-hwdb</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-hwdb</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     </para>
index 7e6e7d4b9d29d1238bc4e859cc17fd2d3e3098eb..02fdc12473e57176acb2adb03b923f11fd15fb4c 100644 (file)
@@ -21,7 +21,7 @@
   <refnamediv>
     <refname>sd_journal_has_runtime_files</refname>
     <refname>sd_journal_has_persistent_files</refname>
-    <refpurpose>Query availability of runtime or persistent journal files.</refpurpose>
+    <refpurpose>Query availability of runtime or persistent journal files</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index be1c843ee097a8a28fda34a80ea9fb249978bdd7..d1c83e2d20080a3f8e025f4e370588a0378c4e55 100644 (file)
     code block is left:</para>
 
     <programlisting>{
-  __attribute__((cleanup(sd_login_monitor_unrefp)) sd_login_monitor *m = NULL;
+  __attribute__((cleanup(sd_login_monitor_unrefp))) sd_login_monitor *m = NULL;
   int r;
   …
   r = sd_login_monitor_default(&amp;m);
index db6cf0dbc09b30c8a3244d419507e39b22f2f44d..cd259c863f9fa5e6a8125ba6b7e83028ff1430c9 100644 (file)
@@ -19,7 +19,7 @@
     <refname>sd_machine_get_class</refname>
     <refname>sd_machine_get_ifindices</refname>
     <refpurpose>Determine the class and network interface indices of a
-    locally running virtual machine or container.</refpurpose>
+    locally running virtual machine or container</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index e9d7a8eb696899aa4119f66233c7b9ff78a58541..9c16d5bc9c01c6841f5eebfc62727ab950af78d0 100644 (file)
@@ -35,7 +35,7 @@
     <refname>sd_peer_get_cgroup</refname>
     <refpurpose>Determine the owner uid of the user unit or session,
     or the session, user unit, system unit, container/VM or slice that
-    a specific PID or socket peer belongs to.</refpurpose>
+    a specific PID or socket peer belongs to</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index a58c76d85fa7da19863361beaf8f05bfd6b9eddc..ee8cc7bc0a11b050127416007fd3a22ba6e03fab 100644 (file)
@@ -13,7 +13,7 @@
 
     <para>Configuration files are read from directories in <filename>/etc/</filename>,
     <filename>/run/</filename>, <filename>/usr/local/lib/</filename>, and <filename>/usr/lib/</filename>, in
-    order of precedence, as listed in the SYNOPSIS section above. Files must have the the
+    order of precedence, as listed in the SYNOPSIS section above. Files must have the
     <literal>.conf</literal> extension. Files in <filename>/etc/</filename> override files with the same name
     in <filename>/run/</filename>, <filename>/usr/local/lib/</filename>, and
     <filename>/usr/lib/</filename>. Files in <filename>/run/</filename> override files with the same name
index dc10776e9968a022a9beb916b4e006b537bb5c92..70504510f9ca6354889df72f6ab06f0cf2c4ae6e 100644 (file)
@@ -63,18 +63,18 @@ key.pattern.overridden.with.glob = custom
     <literal>net.ipv4.conf.enp3s0/200.forwarding</literal> or
     <literal>net/ipv4/conf/enp3s0.200/forwarding</literal> may be used to refer to
     <filename>/proc/sys/net/ipv4/conf/enp3s0.200/forwarding</filename>. A glob
-    <citerefentry><refentrytitle>glob</refentrytitle><manvolnum>7</manvolnum></citerefentry> pattern may be
+    <citerefentry project='man-pages'><refentrytitle>glob</refentrytitle><manvolnum>7</manvolnum></citerefentry> pattern may be
     used to write the same value to all matching keys. Keys for which an explicit pattern exists will be
     excluded from any glob matching. In addition, a key may be explicitly excluded from being set by any
     matching glob patterns by specifying the key name prefixed with a <literal>-</literal> character and not
     followed by <literal>=</literal>, see SYNOPSIS.</para>
 
     <para>Any access permission errors and attempts to write variables not present on the local system are
-    logged, but do not cause the service to fail. Debug log level is used, which means that the message will
-    not show up at all by default. Moreover, if a variable assignment is prefixed with a single
-    <literal>-</literal> character, any failure to set the variable will be logged at debug level, but will
-    not cause the service to fail. All other errors when setting variables are logged with higher priority
-    and cause the service to return failure at the end (other variables are still processed).</para>
+    logged at debug level and do not cause the service to fail. Moreover, if a variable assignment is
+    prefixed with a single <literal>-</literal> character, failure to set the variable for other reasons will
+    be logged at debug level and will not cause the service to fail. In other cases, errors when setting
+    variables are logged with higher priority and cause the service to return failure at the end (after
+    processing other variables).</para>
 
     <para>The settings configured with <filename>sysctl.d</filename> files will be applied early on boot. The
     network interface-specific options will also be applied individually for each network interface as it
index 53342c4b9d4405af46f66d58eaca8558d0356635..28c2194285f6d039e124443c98fc797f77bb25b0 100644 (file)
@@ -412,7 +412,7 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
 
             <para>The "Loaded:" line in the output will show <literal>loaded</literal> if the unit has been loaded into
             memory. Other possible values for "Loaded:" include: <literal>error</literal> if there was a problem
-            loading it, <literal>not-found</literal> if not unit file was found for this unit,
+            loading it, <literal>not-found</literal> if no unit file was found for this unit,
             <literal>bad-setting</literal> if an essential unit file setting could not be parsed and
             <literal>masked</literal> if the unit file has been masked. Along with showing the path to the unit file,
             this line will also show the enablement state.  Enabled commands start at boot.  See the full table of
@@ -582,7 +582,7 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
 
           <listitem>
             <para>Enable one or more units or unit instances. This will create a set of symlinks, as encoded in the
-            <literal>[Install]</literal> sections of the indicated unit files. After the symlinks have been created,
+            [Install] sections of the indicated unit files. After the symlinks have been created,
             the system manager configuration is reloaded (in a way equivalent to <command>daemon-reload</command>), in
             order to ensure the changes are taken into account immediately. Note that this does
             <emphasis>not</emphasis> have the effect of also starting any of the units being enabled. If this is
@@ -605,7 +605,7 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
             <option>--quiet</option>.
             </para>
 
-            <para>Note that this operation creates only the symlinks suggested in the <literal>[Install]</literal>
+            <para>Note that this operation creates only the symlinks suggested in the [Install]
             section of the unit files. While this command is the recommended way to manipulate the unit configuration
             directory, the administrator is free to make additional changes manually by placing or removing symlinks
             below this directory. This is particularly useful to create configurations that deviate from the suggested
@@ -645,7 +645,7 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
             <para>This command expects valid unit names only, it does not accept paths to unit files.</para>
 
             <para>In addition to the units specified as arguments, all units are disabled that are listed in the
-            <varname>Also=</varname> setting contained in the <literal>[Install]</literal> section of any of the unit
+            <varname>Also=</varname> setting contained in the [Install] section of any of the unit
             files being operated on.</para>
 
             <para>This command implicitly reloads the system manager configuration after completing the operation. Note
@@ -668,7 +668,7 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
           <listitem>
             <para>Reenable one or more units, as specified on the command line. This is a combination of
             <command>disable</command> and <command>enable</command> and is useful to reset the symlinks a unit file is
-            enabled with to the defaults configured in its <literal>[Install]</literal> section. This command expects
+            enabled with to the defaults configured in its [Install] section. This command expects
             a unit name only, it does not accept paths to unit files.</para>
           </listitem>
         </varlistentry>
@@ -768,17 +768,17 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
                   </row>
                   <row>
                     <entry><literal>static</literal></entry>
-                    <entry>The unit file is not enabled, and has no provisions for enabling in the <literal>[Install]</literal> unit file section.</entry>
+                    <entry>The unit file is not enabled, and has no provisions for enabling in the [Install] unit file section.</entry>
                     <entry>0</entry>
                   </row>
                   <row>
                     <entry><literal>indirect</literal></entry>
-                    <entry>The unit file itself is not enabled, but it has a non-empty <varname>Also=</varname> setting in the <literal>[Install]</literal> unit file section, listing other unit files that might be enabled, or it has an alias under a different name through a symlink that is not specified in <varname>Also=</varname>. For template unit file, an instance different than the one specified in <varname>DefaultInstance=</varname> is enabled.</entry>
+                    <entry>The unit file itself is not enabled, but it has a non-empty <varname>Also=</varname> setting in the [Install] unit file section, listing other unit files that might be enabled, or it has an alias under a different name through a symlink that is not specified in <varname>Also=</varname>. For template unit files, an instance different than the one specified in <varname>DefaultInstance=</varname> is enabled.</entry>
                     <entry>0</entry>
                   </row>
                   <row>
                     <entry><literal>disabled</literal></entry>
-                    <entry>The unit file is not enabled, but contains an <literal>[Install]</literal> section with installation instructions.</entry>
+                    <entry>The unit file is not enabled, but contains an [Install] section with installation instructions.</entry>
                     <entry>&gt; 0</entry>
                   </row>
                   <row>
index 1106c36d0c86664cc6d40ff974bf3f65046328b6..3d6de1710d3946d9d48d7ec251b19f3e5cefbd12 100644 (file)
@@ -509,9 +509,9 @@ NAutoVTs=8
       <para>This command will load unit files and print warnings if any errors are detected. Files specified
       on the command line will be loaded, but also any other units referenced by them. The full unit search
       path is formed by combining the directories for all command line arguments, and the usual unit load
-      paths (variable <varname>$SYSTEMD_UNIT_PATH</varname> is supported, and may be used to replace or
+      paths. The variable <varname>$SYSTEMD_UNIT_PATH</varname> is supported, and may be used to replace or
       augment the compiled in set of unit load paths; see
-      <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>).  All
+      <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>. All
       units files present in the directories containing the command line arguments will be used in preference
       to the other paths.</para>
 
@@ -669,7 +669,7 @@ Service b@0.service not loaded, b.socket cannot be started.
         <command>dot</command> command (see above), this selects which
         relationships are shown in the dependency graph. Both options
         require a
-        <citerefentry project='die-net'><refentrytitle>glob</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+        <citerefentry project='man-pages'><refentrytitle>glob</refentrytitle><manvolnum>7</manvolnum></citerefentry>
         pattern as an argument, which will be matched against the
         left-hand and the right-hand, respectively, nodes of a
         relationship.</para>
@@ -700,9 +700,9 @@ Service b@0.service not loaded, b.socket cannot be started.
       <varlistentry>
         <term><option>--man=no</option></term>
 
-        <listitem><para>Do not invoke man to verify the existence of
-        man pages listed in <varname>Documentation=</varname>.
-        </para></listitem>
+        <listitem><para>Do not invoke
+        <citerefentry project='man-pages'><refentrytitle>man</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+        to verify the existence of man pages listed in <varname>Documentation=</varname>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 0c5144f6b89a87bc2eecdb1df3602cb17f43701d..8275838bce0f3cba40a6241d754796eb05b0fd72 100644 (file)
@@ -17,7 +17,7 @@
 
   <refnamediv>
     <refname>systemd-bless-boot-generator</refname>
-    <refpurpose>Pull <filename>systemd-bless-boot.service</filename> into the initial boot transaction when boot counting is in effect.</refpurpose>
+    <refpurpose>Pull <filename>systemd-bless-boot.service</filename> into the initial boot transaction when boot counting is in effect</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index b666ae1e535d0ccbc8c746a71ad168ea1dd2cace..c3d7bc9d4687b66c454837896d564e4c3eac08d3 100644 (file)
@@ -91,7 +91,7 @@
 
       <listitem><para>The boot manager optionally reads a random seed from the ESP partition, combines it
       with a 'system token' stored in a persistent EFI variable and derives a random seed to use by the OS as
-      entropy pool initializaton, providing a full entropy pool during early boot.</para></listitem>
+      entropy pool initialization, providing a full entropy pool during early boot.</para></listitem>
     </itemizedlist>
 
     <para><citerefentry><refentrytitle>bootctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
         is maintained persistently, while <varname>LoaderConfigTimeoutOneShot</varname> is a one-time override which is
         read once (in which case it takes precedence over <varname>LoaderConfigTimeout</varname>) and then
         removed. <varname>LoaderConfigTimeout</varname> may be manipulated with the
-        <keycap>t</keycap>/<keycap>T</keycap> keys, see above.)</para></listitem>
+        <keycap>t</keycap>/<keycap>T</keycap> keys, see above.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         boots. <citerefentry><refentrytitle>bootctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
         <option>set-default</option> and <option>set-oneshot</option> commands make use of these variables. The boot
         loader modifies <varname>LoaderEntryDefault</varname> on request, when the <keycap>d</keycap> key is used, see
-        above.)</para></listitem>
+        above.</para></listitem>
       </varlistentry>
 
       <varlistentry>
       <varlistentry>
         <term><varname>LoaderSystemToken</varname></term>
 
-        <listitem><para>A binary random data field, that is used for generating the random see to pass to the
-        OS (see above). Note that this random data is generally only generated once, during OS installation,
-        and is then never updated again.</para></listitem>
+        <listitem><para>A binary random data field, that is used for generating the random seed to pass to
+        the OS (see above). Note that this random data is generally only generated once, during OS
+        installation, and is then never updated again.</para></listitem>
       </varlistentry>
     </variablelist>
 
index 81e62484fdb09faf3241ef7e2b016c035e4321ef..491ca6e9bf16f88d8ba01eacb36d219efae323cb 100644 (file)
         </para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>--image=<replaceable>path</replaceable></option></term>
+        <listitem><para>Takes a path to a disk image file or block device node. If specified all operations
+        are applied to file system in the indicated disk image. This is similar to <option>--root=</option>
+        but operates on file systems stored in disk images or block devices. The disk image should either
+        contain just a file system or a set of file systems within a GPT partition table, following the
+        <ulink url="https://systemd.io/DISCOVERABLE_PARTITIONS">Discoverable Partitions
+        Specification</ulink>. For further information on supported disk images, see
+        <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
+        switch of the same name.</para></listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><option>--locale=<replaceable>LOCALE</replaceable></option></term>
         <term><option>--locale-messages=<replaceable>LOCALE</replaceable></option></term>
         option should not be used lightly.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>--welcome=</option></term>
+
+        <listitem><para>Takes a boolean argument. By default when prompting the user for configuration
+        options a brief welcome text is shown before the first question is asked. Pass false to this option
+        to turn off the welcome text.</para></listitem>
+      </varlistentry>
+
       <xi:include href="standard-options.xml" xpointer="help" />
       <xi:include href="standard-options.xml" xpointer="version" />
     </variablelist>
index b0fa617d637899aabde433fdf129b3badbd5a955..78fdacccabac49abf0e8d06c57365b86ba66d569 100644 (file)
@@ -19,7 +19,7 @@
     <refname>systemd-gpt-auto-generator</refname>
     <refpurpose>Generator for automatically discovering and mounting root, <filename>/home/</filename>,
     <filename>/srv/</filename>, <filename>/var/</filename> and <filename>/var/tmp/</filename> partitions, as
-    well as discovering and enabling swap partitions, based on GPT partition type GUIDs.</refpurpose>
+    well as discovering and enabling swap partitions, based on GPT partition type GUIDs</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index 633b4cb55ba60f1029d15e3c1c96fd4f120c89c7..0f7aaab624f19eb3d351db5d1ce350aa2896cce1 100644 (file)
     </para>
 
     <para>where
-      <option>cursor</option> is a cursor string,
-      <option>num_skip</option> is an integer,
-      <option>num_entries</option> is an unsigned integer.
+      <replaceable>cursor</replaceable> is a cursor string,
+      <replaceable>num_skip</replaceable> is an integer,
+      <replaceable>num_entries</replaceable> is an unsigned integer.
     </para>
 
     <para>Range defaults to all available events.</para>
index a073a37a29565dad3c44aa4f3b97354fea851d4a..174bef803f45401f3d231f5df968abea3b9d262d 100644 (file)
@@ -267,7 +267,7 @@ openssl ca -batch -config ca.conf -notext -in $CLIENT.csr -out $CLIENT.pem
       those files can be specified using
       <varname>TrustedCertificateFile=</varname>,
       <varname>ServerCertificateFile=</varname>,
-      <varname>ServerKeyFile=</varname>, in
+      and <varname>ServerKeyFile=</varname> in
       <filename>/etc/systemd/journal-remote.conf</filename> and
       <filename>/etc/systemd/journal-upload.conf</filename>,
       respectively. The default locations can be queried by using
index f4ce4e4fe2079ac8d58461f3e54af71f3f33165d..6b7a0bc4b998a60846de4291e17b943a218de368 100644 (file)
@@ -106,18 +106,19 @@ systemd-tmpfiles --create --prefix /var/log/journal</programlisting>
     errors. In order to react gracefully in this case it is recommended that programs logging to standard output/error
     ignore such errors. If the <constant>SIGPIPE</constant> UNIX signal handler is not blocked or turned off, such
     write attempts will also result in such process signals being generated, see
-    <citerefentry><refentrytitle>signal</refentrytitle><manvolnum>7</manvolnum></citerefentry>. To mitigate this issue,
-    systemd service manager explicitly turns off the <constant>SIGPIPE</constant> signal for all invoked processes by
-    default (this may be changed for each unit individually via the <varname>IgnoreSIGPIPE=</varname> option, see
+    <citerefentry project='man-pages'><refentrytitle>signal</refentrytitle><manvolnum>7</manvolnum></citerefentry>.
+    To mitigate this issue, systemd service manager explicitly turns off the <constant>SIGPIPE</constant>
+    signal for all invoked processes by default (this may be changed for each unit individually via the
+    <varname>IgnoreSIGPIPE=</varname> option, see
     <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
-    details). After the standard output/standard error streams have been terminated they may not be recovered until the
-    services they are associated with are restarted. Note that during normal operation,
-    <filename>systemd-journald.service</filename> stores copies of the file descriptors for those streams in the
-    service manager. If <filename>systemd-journald.service</filename> is restarted using <command>systemctl
-    restart</command> or equivalent operation instead of a pair of separate <command>systemctl stop</command> and
-    <command>systemctl start</command> commands (or equivalent operations), these stream connections are not terminated
-    and survive the restart. It is thus safe to restart <filename>systemd-journald.service</filename>, but stopping it
-    is not recommended.</para>
+    details). After the standard output/standard error streams have been terminated they may not be recovered
+    until the services they are associated with are restarted. Note that during normal operation,
+    <filename>systemd-journald.service</filename> stores copies of the file descriptors for those streams in
+    the service manager. If <filename>systemd-journald.service</filename> is restarted using
+    <command>systemctl restart</command> or equivalent operation instead of a pair of separate
+    <command>systemctl stop</command> and <command>systemctl start</command> commands (or equivalent
+    operations), these stream connections are not terminated and survive the restart. It is thus safe to
+    restart <filename>systemd-journald.service</filename>, but stopping it is not recommended.</para>
 
     <para>Note that the log record metadata for records transferred via such standard output/error streams reflect the
     metadata of the peer the stream was originally created for. If the stream connection is passed on to other
index c602b2e42fe800fcac5a0dd420a01180d3e2f36b..bbfcad4af6b354303b00cdcec9d27dc9d9e1930f 100644 (file)
       <citerefentry><refentrytitle>systemd-user-sessions.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>loginctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>logind.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>pam_systemd</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>pam_systemd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd-login</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     </para>
   </refsect1>
index ab58d8fd3f76fd35f141c234a801f829ad050489..5172f6511a91306d5e5b18266ecc0d825d781b8b 100644 (file)
@@ -76,7 +76,7 @@
       <listitem><para>The
       <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry> library
       exposes the
-      <citerefentry><refentrytitle>sd_bus_open_system_container</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>sd_bus_open_system_machine</refentrytitle><manvolnum>3</manvolnum></citerefentry>
       call to connect to the system bus of any registered container.</para></listitem>
 
       <listitem><para>The
index a6e6dd9b483bd7baede8d74b7c73caeb0318a8c6..f1089eed3b0f3d6ed58fff63be41dca84979c290 100644 (file)
     <replaceable>WHERE</replaceable>.</para>
 
     <para>In many ways, <command>systemd-mount</command> is similar to the lower-level
-    <citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry> command, however instead
-    of executing the mount operation directly and immediately, <command>systemd-mount</command> schedules it through
-    the service manager job queue, so that it may pull in further dependencies (such as parent mounts, or a file system
-    checker to execute a priori), and may make use of the auto-mounting logic.</para>
+    <citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+    command, however instead of executing the mount operation directly and immediately,
+    <command>systemd-mount</command> schedules it through the service manager job queue, so that it may pull
+    in further dependencies (such as parent mounts, or a file system checker to execute a priori), and may
+    make use of the auto-mounting logic.</para>
 
     <para>The command takes either one or two arguments. If only one argument is specified it should refer to
     a block device or regular file containing a file system (e.g. <literal>/dev/sdb1</literal> or
     label and other metadata, and is mounted to a directory below <filename>/run/media/system/</filename>
     whose name is generated from the file system label. In this mode the block device or image file must
     exist at the time of invocation of the command, so that it may be probed. If the device is found to be a
-    removable block device (e.g. a USB stick) an automount point instead of a regular mount point is created
+    removable block device (e.g. a USB stick), an automount point is created instead of a regular mount point
     (i.e. the <option>--automount=</option> option is implied, see below).</para>
 
-    <para>If two arguments are specified the first indicates the mount source (the <replaceable>WHAT</replaceable>) and
-    the second indicates the path to mount it on (the <replaceable>WHERE</replaceable>). In this mode no probing of the
-    source is attempted, and a backing device node doesn't have to exist yet. However, if this mode is combined with
-    <option>--discover</option>, device node probing for additional metadata is enabled, and – much like in the
-    single-argument case discussed above – the specified device has to exist at the time of invocation of the
-    command.</para>
+    <para>If two arguments are specified, the first indicates the mount source (the
+    <replaceable>WHAT</replaceable>) and the second indicates the path to mount it on (the
+    <replaceable>WHERE</replaceable>). In this mode no probing of the source is attempted, and a backing
+    device node doesn't have to exist. However, if this mode is combined with <option>--discover</option>,
+    device node probing for additional metadata is enabled, and – much like in the single-argument case
+    discussed above – the specified device has to exist at the time of invocation of the command.</para>
 
     <para>Use the <option>--list</option> command to show a terse table of all local, known block devices with file
     systems that may be mounted with this command.</para>
index fcb3c69ffbfd611609fa7f7f22fae7337bad47d1..4a3f78a9e57915e18ef427a19487baced68ed262 100644 (file)
@@ -96,7 +96,7 @@
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-networkd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>dracut</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+      <citerefentry project='man-pages'><refentrytitle>dracut</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     </para>
   </refsect1>
 
index 94a7bfd5ef6f50c8fd20f5f329a34c881758c52a..2913bb953df0f68ae86dd61679202aa4c0fe1357 100644 (file)
@@ -92,7 +92,7 @@
       <citerefentry><refentrytitle>systemd.network</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-networkd-wait-online.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd-networkd-generator.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>systemd-network-generator.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     </para>
   </refsect1>
 
index 72d2f1e4bae65dedc1332a2aeddd97d97befd837..69558ac85cbb5a5deb66063b1a2ab54cf32f0e41 100644 (file)
 
         <para>Single file system images (i.e. file systems without a surrounding partition table) can be opened using
         dm-verity if the integrity data is passed using the <option>--root-hash=</option> and
-        <option>--verity-data=</option> options.</para>
+        <option>--verity-data=</option> (and optionally <option>--root-hash-sig=</option>) options.</para>
 
         <para>Any other partitions, such as foreign partitions or swap partitions are not mounted. May not be specified
         together with <option>--directory=</option>, <option>--template=</option>.</para></listitem>
         is read from it and automatically used, also as formatted hexadecimal characters.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>--root-hash-sig=</option></term>
+
+        <listitem><para>Takes a PKCS7 formatted binary signature of the <option>--root-hash=</option> option as a path
+        to a DER encoded signature file or as an ASCII base64 string encoding of the DER encoded signature, prefixed
+        by <literal>base64:</literal>. The dm-verity volume will only be opened if the signature of the root hash hex
+        string is valid and done by a public key present in the kernel keyring. If this option is not specified, but a
+        file with the <filename>.roothash.p7s</filename> suffix is found next to the image file, bearing otherwise the
+        same name (except if the image has the <filename>.raw</filename> suffix, in which case the signature file must
+        not have it in its name), the signature is read from it and automatically used.</para></listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><option>--verity-data=</option></term>
 
         <term><option>-u</option></term>
         <term><option>--user=</option></term>
 
-        <listitem><para>After transitioning into the container, change
-        to the specified user-defined in the container's user
-        database. Like all other systemd-nspawn features, this is not
-        a security feature and provides protection against accidental
-        destructive operations only.</para></listitem>
+        <listitem><para>After transitioning into the container, change to the specified user defined in the
+        container's user database. Like all other systemd-nspawn features, this is not a security feature and
+        provides protection against accidental destructive operations only.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         With option <option>yes</option> systemd-nspawn waits for the
         <literal>READY=1</literal> message from the init process in the container
         before sending its own to systemd. For more details about notifications
-        see <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry>).</para></listitem>
+        see <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para></listitem>
       </varlistentry>
     </variablelist>
 
       <varlistentry>
         <term><option>--no-new-privileges=</option></term>
 
-        <listitem><para>Takes a boolean argument. Specifies the value of the <constant>PR_SET_NO_NEW_PRIVS</constant>
-        flag for the container payload. Defaults to off. When turned on the payload code of the container cannot
-        acquire new privileges, i.e. the "setuid" file bit as well as file system capabilities will not have an effect
-        anymore. See <citerefentry
-        project='man-pages'><refentrytitle>prctl</refentrytitle><manvolnum>2</manvolnum></citerefentry> for details
-        about this flag. </para></listitem>
+        <listitem><para>Takes a boolean argument. Specifies the value of the
+        <constant>PR_SET_NO_NEW_PRIVS</constant> flag for the container payload. Defaults to off. When turned
+        on the payload code of the container cannot acquire new privileges, i.e. the "setuid" file bit as
+        well as file system capabilities will not have an effect anymore. See <citerefentry
+        project='man-pages'><refentrytitle>prctl</refentrytitle><manvolnum>2</manvolnum></citerefentry> for
+        details about this flag. </para></listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><option>--system-call-filter=</option></term>
-
-        <listitem><para>Alter the system call filter applied to containers. Takes a space-separated list of system call
-        names or group names (the latter prefixed with <literal>@</literal>, as listed by the
-        <command>syscall-filter</command> command of
+        <term><option>--system-call-filter=</option></term> <listitem><para>Alter the system call filter
+        applied to containers. Takes a space-separated list of system call names or group names (the latter
+        prefixed with <literal>@</literal>, as listed by the <command>syscall-filter</command> command of
         <citerefentry><refentrytitle>systemd-analyze</refentrytitle><manvolnum>1</manvolnum></citerefentry>). Passed
-        system calls will be permitted. The list may optionally be prefixed by <literal>~</literal>, in which case all
-        listed system calls are prohibited. If this command line option is used multiple times the configured lists are
-        combined. If both a positive and a negative list (that is one system call list without and one with the
-        <literal>~</literal> prefix) are configured, the negative list takes precedence over the positive list. Note
-        that <command>systemd-nspawn</command> always implements a system call whitelist (as opposed to a blacklist),
-        and this command line option hence adds or removes entries from the default whitelist, depending on the
-        <literal>~</literal> prefix. Note that the applied system call filter is also altered implicitly if additional
-        capabilities are passed using the <command>--capabilities=</command>.</para></listitem>
+        system calls will be permitted. The list may optionally be prefixed by <literal>~</literal>, in which
+        case all listed system calls are prohibited. If this command line option is used multiple times the
+        configured lists are combined. If both a positive and a negative list (that is one system call list
+        without and one with the <literal>~</literal> prefix) are configured, the negative list takes
+        precedence over the positive list. Note that <command>systemd-nspawn</command> always implements a
+        system call allow list (as opposed to a deny list!), and this command line option hence adds or
+        removes entries from the default allow list, depending on the <literal>~</literal> prefix. Note that
+        the applied system call filter is also altered implicitly if additional capabilities are passed using
+        the <command>--capabilities=</command>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
         <para>Finally, if set to <literal>auto</literal> the file is left as it is if private networking is
         turned on (see <option>--private-network</option>). Otherwise, if
-        <filename>systemd-resolved.service</filename> is connectible its stub
-        <filename>resolv.conf</filename> file is used, and if not the host's
-        <filename>/etc/resolv.conf</filename> file is used. In the latter cases the file is copied if the
-        image is writable, and bind mounted otherwise.</para>
+        <filename>systemd-resolved.service</filename> is running its stub <filename>resolv.conf</filename>
+        file is used, and if not the host's <filename>/etc/resolv.conf</filename> file. In the latter cases
+        the file is copied if the image is writable, and bind mounted otherwise.</para>
 
         <para>It's recommended to use <literal>copy-…</literal> or <literal>replace-…</literal> if the
         container shall be able to make changes to the DNS configuration on its own, deviating from the
       <varlistentry>
         <term><option>--timezone=</option></term>
 
-        <listitem><para>Configures how <filename>/etc/localtime</filename> inside of the container (i.e. local timezone
-        synchronization from host to container) shall be handled. Takes one of <literal>off</literal>,
-        <literal>copy</literal>, <literal>bind</literal>, <literal>symlink</literal>, <literal>delete</literal> or
-        <literal>auto</literal>. If set to <literal>off</literal> the <filename>/etc/localtime</filename> file in the
-        container is left as it is included in the image, and neither modified nor bind mounted over. If set to
-        <literal>copy</literal> the <filename>/etc/localtime</filename> file of the host is copied into the
-        container. Similar, if <literal>bind</literal> is used, it is bind mounted from the host into the container. If
-        set to <literal>symlink</literal> a symlink from <filename>/etc/localtime</filename> in the container is
-        created pointing to the matching the timezone file of the container that matches the timezone setting on the
-        host. If set to <literal>delete</literal> the file in the container is deleted, should it exist. If set to
-        <literal>auto</literal> and the <filename>/etc/localtime</filename> file of the host is a symlink, then
-        <literal>symlink</literal> mode is used, and <literal>copy</literal> otherwise, except if the image is
-        read-only in which case <literal>bind</literal> is used instead. Defaults to
+        <listitem><para>Configures how <filename>/etc/localtime</filename> inside of the container
+        (i.e. local timezone synchronization from host to container) shall be handled. Takes one of
+        <literal>off</literal>, <literal>copy</literal>, <literal>bind</literal>, <literal>symlink</literal>,
+        <literal>delete</literal> or <literal>auto</literal>. If set to <literal>off</literal> the
+        <filename>/etc/localtime</filename> file in the container is left as it is included in the image, and
+        neither modified nor bind mounted over. If set to <literal>copy</literal> the
+        <filename>/etc/localtime</filename> file of the host is copied into the container. Similarly, if
+        <literal>bind</literal> is used, the file is bind mounted from the host into the container. If set to
+        <literal>symlink</literal>, a symlink is created pointing from <filename>/etc/localtime</filename> in
+        the container to the timezone file in the container that matches the timezone setting on the host. If
+        set to <literal>delete</literal>, the file in the container is deleted, should it exist. If set to
+        <literal>auto</literal> and the <filename>/etc/localtime</filename> file of the host is a symlink,
+        then <literal>symlink</literal> mode is used, and <literal>copy</literal> otherwise, except if the
+        image is read-only in which case <literal>bind</literal> is used instead. Defaults to
         <literal>auto</literal>.</para></listitem>
       </varlistentry>
 
 
       <para>This installs a minimal Fedora distribution into the
       directory <filename index="false">/var/lib/machines/f&fedora_latest_version;</filename>
-      and then boots an OS in a namespace container in it. Because the installation
+      and then boots that OS in a namespace container. Because the installation
       is located underneath the standard <filename>/var/lib/machines/</filename>
       directory, it is also possible to start the machine using
       <command>systemd-nspawn -M f&fedora_latest_version;</command>.</para>
 
       <para>This installs a minimal Debian unstable distribution into
       the directory <filename>~/debian-tree/</filename> and then
-      spawns a shell in a namespace container in it.</para>
+      spawns a shell from this image in a namespace container.</para>
 
       <para><command>debootstrap</command> supports
       <ulink url="https://www.debian.org">Debian</ulink>,
index 28783a15e9266099b41c59735fc9e741ae670de2..a9e322425f5dfe2fdafa597249def2446afb6a61 100644 (file)
@@ -44,7 +44,7 @@
     <citerefentry><refentrytitle>systemd-boot</refentrytitle><manvolnum>7</manvolnum></citerefentry>, with
     its <command>bootctl random-seed</command> functionality.</para>
 
-    <para>When loading the random seed from disk its file is immediately updated with a new seed retrieved
+    <para>When loading the random seed from disk, the file is immediately updated with a new seed retrieved
     from the kernel, in order to ensure no two boots operate with the same random seed. This new seed is
     retrieved synchronously from the kernel, which means the service will not complete start-up until the
     random pool is fully initialized. On entropy-starved systems this may take a while. This functionality is
index 74c6ba95b1400fd36f0696fcd747182fc29b3491..ffa88baf67fe48f50754be3428fb6e62cc235e2c 100644 (file)
     available but not yet used. Specifically the following use cases are among those covered:</para>
 
     <itemizedlist>
-      <listitem><para>The root partition may be grown to cover the whole available disk space</para></listitem>
-      <listitem><para>A <filename>/home/</filename>, swap or <filename>/srv/</filename> partition can be added in</para></listitem>
-      <listitem><para>A second (or third, …) root partition may be added in, to cover A/B style setups
+      <listitem><para>The root partition may be grown to cover the whole available disk space.</para></listitem>
+      <listitem><para>A <filename>/home/</filename>, swap or <filename>/srv/</filename> partition can be
+      added.</para></listitem>
+      <listitem><para>A second (or third, …) root partition may be added, to cover A/B style setups
       where a second version of the root file system is alternatingly used for implementing update
       schemes. The deployed image would carry only a single partition ("A") but on first boot a second
       partition ("B") for this purpose is automatically created.</para></listitem>
@@ -69,7 +70,7 @@
 
     <orderedlist>
       <listitem><para>The <filename>repart.d/*.conf</filename> configuration files are loaded and parsed,
-      and ordered by filename (without the directory suffix). </para></listitem>
+      and ordered by filename (without the directory prefix).</para></listitem>
 
       <listitem><para>The partition table already existing on the block device is loaded and
       parsed.</para></listitem>
     </orderedlist>
 
     <para>As exception to the normally strictly incremental operation, when called in a special "factory
-    reset" mode <command>systemd-repart</command> may also be used to erase select existing partitions to
+    reset" mode, <command>systemd-repart</command> may also be used to erase existing partitions to
     reset an installation back to vendor defaults. This mode of operation is used when either the
     <option>--factory-reset=yes</option> switch is passed on the tool's command line, or the
     <option>systemd.factory_reset=yes</option> option specified on the kernel command line, or the
     <varname>FactoryReset</varname> EFI variable (vendor UUID
     <constant>8cf2644b-4b0b-428f-9387-6d876050dc67</constant>) is set to "yes". It alters the algorithm above
-    slightly: between the 3rd and the 4th step above the any partition marked explicitly via the
+    slightly: between the 3rd and the 4th step above any partition marked explicitly via the
     <varname>FactoryReset=</varname> boolean is deleted, and the algorithm restarted, thus immediately
     re-creating these partitions anew empty.</para>
 
       <varlistentry>
         <term><option>--definitions=</option></term>
 
-        <listitem><para>Takes a file system path. If specified the <filename>*.conf</filename> are directly
-        read from the specified directory instead of searching in
-        <filename>/usr/lib/repart.d/*.conf</filename>, <filename>/etc/repart.d/*.conf</filename>,
+        <listitem><para>Takes a file system path. If specified the <filename>*.conf</filename> files are read
+        from the specified directory instead of searching in <filename>/usr/lib/repart.d/*.conf</filename>,
+        <filename>/etc/repart.d/*.conf</filename>,
         <filename>/run/repart.d/*.conf</filename>.</para></listitem>
       </varlistentry>
 
index a6949b0c3b1ef5283a17666cee2bb82b8b0b5b86..1acf0e890512f73d0fc9e7429178722e09ee969e 100644 (file)
     <title>Options</title>
 
     <para>The following options can be configured in the
-    <literal>[Sleep]</literal> section of
+    [Sleep] section of
     <filename>/etc/systemd/sleep.conf</filename> or a
     <filename>sleep.conf.d</filename> file:</para>
 
index 58b26aad87f4e785de9e5f6d4710f808ecf85a0b..a4e18989fc106900eeada51dd70a153490c1166e 100644 (file)
@@ -16,7 +16,7 @@
   </refmeta>
   <refnamediv>
     <refname>systemd-socket-proxyd</refname>
-    <refpurpose>Bidirectionally proxy local sockets to another (possibly remote) socket.</refpurpose>
+    <refpurpose>Bidirectionally proxy local sockets to another (possibly remote) socket</refpurpose>
   </refnamediv>
   <refsynopsisdiv>
     <cmdsynopsis>
index 2310e6f52634b886fe619b49b04058f974381f80..e57000e09ad91443e04fe66892ed3e9a19f93b4e 100644 (file)
     url="https://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor
     interface</ulink>.</para>
 
-    <para>Note that
-    <filename>systemd-suspend.service</filename>,
-    <filename>systemd-hibernate.service</filename>, and
-    <filename>systemd-hybrid-sleep.service</filename>
-    <filename>systemd-suspend-then-hibernate.service</filename>
-    should never be executed directly. Instead, trigger system sleep
-    states with a command such as <literal>systemctl suspend</literal>
-    or similar.</para>
+    <para>Note that <filename>systemd-suspend.service</filename>,
+    <filename>systemd-hibernate.service</filename>, <filename>systemd-hybrid-sleep.service</filename>, and
+    <filename>systemd-suspend-then-hibernate.service</filename> should never be executed directly. Instead,
+    trigger system sleep with a command such as <command>systemctl suspend</command> or <command>systemctl
+    hibernate</command>.</para>
 
     <para>Internally, this service will echo a string like
     <literal>mem</literal> into <filename>/sys/power/state</filename>,
     to trigger the actual system suspend. What exactly is written
-    where can be configured in the <literal>[Sleep]</literal> section
+    where can be configured in the [Sleep] section
     of <filename>/etc/systemd/sleep.conf</filename> or a
     <filename>sleep.conf.d</filename> file. See
     <citerefentry><refentrytitle>systemd-sleep.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
index 435c3882dbeb4b1e58eb1a71f6e31329f5e86e91..8cf5666f4bdbdf465749e7edbd65d90b06a93a0a 100644 (file)
@@ -58,7 +58,7 @@
     <title>Options</title>
 
     <para>All options are configured in the
-    <literal>[Manager]</literal> section:</para>
+    [Manager] section:</para>
 
     <variablelist class='config-directives'>
 
         for details. During the first phase of the shutdown operation the system and service manager remains running
         and hence <varname>RuntimeWatchdogSec=</varname> is still honoured. In order to define a timeout on this first
         phase of system shutdown, configure <varname>JobTimeoutSec=</varname> and <varname>JobTimeoutAction=</varname>
-        in the <literal>[Unit]</literal> section of the <filename>shutdown.target</filename> unit. By default
+        in the [Unit] section of the <filename>shutdown.target</filename> unit. By default
         <varname>RuntimeWatchdogSec=</varname> defaults to 0 (off), and <varname>RebootWatchdogSec=</varname> to
         10min. <varname>KExecWatchdogSec=</varname> may be used to additionally enable the watchdog when kexec
         is being executed rather than when rebooting. Note that if the kernel does not reset the watchdog on kexec (depending
         units. See
         <citerefentry><refentrytitle>setrlimit</refentrytitle><manvolnum>2</manvolnum></citerefentry> for
         details. These settings may be overridden in individual units using the corresponding
-        <varname>LimitXXX=</varname> directives, see
-        <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>, for
-        details, and they accept the same parameter syntax. Note that these resource limits are only defaults
+        <varname>LimitXXX=</varname> directives and they accept the same parameter syntax,
+        see <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+        for details. Note that these resource limits are only defaults
         for units, they are not applied to the service manager process (i.e. PID 1) itself.</para></listitem>
       </varlistentry>
 
index c8a92f94a83b6a3dc65ec7892cb16ec88b6287f2..685fe74339e999067ac3ed65f34d20ff1efc8bcc 100644 (file)
@@ -18,7 +18,7 @@
   <refnamediv>
     <refname>systemd-time-wait-sync.service</refname>
     <refname>systemd-time-wait-sync</refname>
-    <refpurpose>Wait Until Kernel Time Synchronized</refpurpose>
+    <refpurpose>Wait until kernel time is synchronized</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
index c6c1d9bcc626ac5197e2692b5665b1ed22b46126..da7389c7318e388c16ad7d792a8be6ca7705ecfd 100644 (file)
         <term><option>--timeout-signal=</option></term>
         <listitem>
           <para>Set the signal which <filename>systemd-udevd</filename> will send to
-          forked off processes after reaching event timeout. The setting can be overriden
+          forked off processes after reaching event timeout. The setting can be overridden
           at boot time with the kernel command line option
           <varname>udev.timeout_signal=</varname>. Setting to <constant>SIGABRT</constant>
           may be helpful in order to debug worker timeouts. Defaults to
index fd65f5da798b1377d2047a3c923e23f074f1c381..29b9bb14e14fc659a36a30d0b626f90c3fafe1bc 100644 (file)
@@ -35,9 +35,9 @@
     this unit type. See
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     for the common options of all unit configuration files. The common
-    configuration items are configured in the generic <literal>[Unit]</literal> and
-    <literal>[Install]</literal> sections. The automount specific configuration options
-    are configured in the <literal>[Automount]</literal> section.</para>
+    configuration items are configured in the generic [Unit] and
+    [Install] sections. The automount specific configuration options
+    are configured in the [Automount] section.</para>
 
     <para>Automount units must be named after the automount directories they control. Example: the automount point
     <filename index="false">/home/lennart</filename> must be configured in a unit file
index ae786a32980843bfbae9953bac31072890735a88..085fd62bceef8d2428d48d7b818df4ec375e2d6e 100644 (file)
@@ -36,8 +36,8 @@
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     for the common options of all unit configuration files. The common
     configuration items are configured in the generic
-    <literal>[Unit]</literal> and <literal>[Install]</literal>
-    sections. A separate <literal>[Device]</literal> section does not
+    [Unit] and [Install]
+    sections. A separate [Device] section does not
     exist, since no device-specific options may be configured.</para>
 
     <para>systemd will dynamically create device units for all kernel
@@ -60,7 +60,7 @@
     <para>Device units will be reloaded by systemd whenever the
     corresponding device generates a <literal>changed</literal> event.
     Other units can use <varname>ReloadPropagatedFrom=</varname> to react
-    to that event</para>
+    to that event.</para>
   </refsect1>
 
   <refsect1>
index 2fb0a8ee7067b2924adfa876fca8a94f64375a9a..d7e6caddf1e9bcea4794653cc1e900d0b693fdb1 100644 (file)
@@ -64,7 +64,7 @@
   <refsect1>
     <title>[Service] Section Options</title>
 
-      <para>The network service file contains a <literal>[Service]</literal>
+      <para>The network service file contains a [Service]
       section, which specifies a discoverable network service announced in a
       local network with Multicast DNS broadcasts.</para>
 
index aa8a3f75bc547646545bdb5496589f3ea100bc8a..6d6eca09a133dba29192f93bb71b6e2e8b27087e 100644 (file)
         <xi:include href="system-only.xml" xpointer="singular"/></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>RootHashSignature=</varname></term>
+
+        <listitem><para>Takes a PKCS7 formatted binary signature of the <varname>RootHash=</varname> option as a path
+        to a DER encoded signature file or as an ASCII base64 string encoding of the DER encoded signature, prefixed
+        by <literal>base64:</literal>. The dm-verity volume will only be opened if the signature of the root hash
+        signature is valid and created by a public key present in the kernel keyring. If this option is not specified,
+        but a file with the <filename>.roothash.p7s</filename> suffix is found next to the image file, bearing otherwise
+        the same name (except if the image has the <filename>.raw</filename> suffix, in which case the signature file
+        must not have it in its name), the signature is read from it and automatically used.</para>
+
+        <xi:include href="system-only.xml" xpointer="singular"/></listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>RootVerity=</varname></term>
 
         files or directories. Moreover <varname>ProtectSystem=strict</varname> and
         <varname>ProtectHome=read-only</varname> are implied, thus prohibiting the service to write to
         arbitrary file system locations. In order to allow the service to write to certain directories, they
-        have to be whitelisted using <varname>ReadWritePaths=</varname>, but care must be taken so that
+        have to be allow-listed using <varname>ReadWritePaths=</varname>, but care must be taken so that
         UID/GID recycling doesn't create security issues involving files created by the service. Use
         <varname>RuntimeDirectory=</varname> (see below) in order to assign a writable runtime directory to a
         service, owned by the dynamic user/group and removed automatically when the unit is terminated. Use
@@ -497,10 +511,11 @@ CapabilityBoundingSet=~CAP_B CAP_C</programlisting>
       <varlistentry>
         <term><varname>AppArmorProfile=</varname></term>
 
-        <listitem><para>Takes a profile name as argument. The process executed by the unit will switch to this profile
-        when started.  Profiles must already be loaded in the kernel, or the unit will fail. This result in a non
-        operation if AppArmor is not enabled. If prefixed by <literal>-</literal>, all errors will be ignored. This
-        does not affect commands prefixed with <literal>+</literal>.</para></listitem>
+        <listitem><para>Takes a profile name as argument. The process executed by the unit will switch to
+        this profile when started. Profiles must already be loaded in the kernel, or the unit will fail. If
+        prefixed by <literal>-</literal>, all errors will be ignored. This setting has no effect if AppArmor
+        is not enabled. This setting not affect commands prefixed with <literal>+</literal>.</para>
+        </listitem>
       </varlistentry>
 
       <varlistentry>
@@ -718,9 +733,9 @@ CapabilityBoundingSet=~CAP_B CAP_C</programlisting>
         kernel default of <literal><constant>private-anonymous</constant>
         <constant>shared-anonymous</constant> <constant>elf-headers</constant>
         <constant>private-huge</constant></literal>). See
-        <citerefentry><refentrytitle>core</refentrytitle><manvolnum>5</manvolnum></citerefentry> for the
-        meaning of the mapping types. When specified multiple times, all specified masks are ORed. When not
-        set, or if the empty value is assigned, the inherited value is not changed.</para>
+        <citerefentry project='man-pages'><refentrytitle>core</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+        for the meaning of the mapping types. When specified multiple times, all specified masks are
+        ORed. When not set, or if the empty value is assigned, the inherited value is not changed.</para>
 
         <example>
           <title>Add DAX pages to the dump filter</title>
@@ -866,7 +881,7 @@ CapabilityBoundingSet=~CAP_B CAP_C</programlisting>
         in <varname>NUMAMask=</varname>. For more details on each policy please see,
         <citerefentry><refentrytitle>set_mempolicy</refentrytitle><manvolnum>2</manvolnum></citerefentry>. For overall
         overview of NUMA support in Linux see,
-        <citerefentry><refentrytitle>numa</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+        <citerefentry project='man-pages'><refentrytitle>numa</refentrytitle><manvolnum>7</manvolnum></citerefentry>.
         </para></listitem>
       </varlistentry>
 
@@ -1053,14 +1068,16 @@ CapabilityBoundingSet=~CAP_B CAP_C</programlisting>
         <varname>RootDirectory=</varname> or <varname>RootImage=</varname> these paths always reside on the host and
         are mounted from there into the unit's file system namespace.</para>
 
-        <para>If <varname>DynamicUser=</varname> is used in conjunction with <varname>StateDirectory=</varname>,
-        <varname>CacheDirectory=</varname> and <varname>LogsDirectory=</varname> is slightly altered: the directories
-        are created below <filename>/var/lib/private</filename>, <filename>/var/cache/private</filename> and
+        <para>If <varname>DynamicUser=</varname> is used in conjunction with
+        <varname>StateDirectory=</varname>, the logic for <varname>CacheDirectory=</varname> and
+        <varname>LogsDirectory=</varname> is slightly altered: the directories are created below
+        <filename>/var/lib/private</filename>, <filename>/var/cache/private</filename> and
         <filename>/var/log/private</filename>, respectively, which are host directories made inaccessible to
-        unprivileged users, which ensures that access to these directories cannot be gained through dynamic user ID
-        recycling. Symbolic links are created to hide this difference in behaviour. Both from perspective of the host
-        and from inside the unit, the relevant directories hence always appear directly below
-        <filename>/var/lib</filename>, <filename>/var/cache</filename> and <filename>/var/log</filename>.</para>
+        unprivileged users, which ensures that access to these directories cannot be gained through dynamic
+        user ID recycling. Symbolic links are created to hide this difference in behaviour. Both from
+        perspective of the host and from inside the unit, the relevant directories hence always appear
+        directly below <filename>/var/lib</filename>, <filename>/var/cache</filename> and
+        <filename>/var/log</filename>.</para>
 
         <para>Use <varname>RuntimeDirectory=</varname> to manage one or more runtime directories for the unit and bind
         their lifetime to the daemon runtime. This is particularly useful for unprivileged daemons that cannot create
@@ -1150,12 +1167,13 @@ StateDirectory=aaa/bbb ccc</programlisting>
         contain symlinks, they are resolved relative to the root directory set with
         <varname>RootDirectory=</varname>/<varname>RootImage=</varname>.</para>
 
-        <para>Paths listed in <varname>ReadWritePaths=</varname> are accessible from within the namespace with the same
-        access modes as from outside of it. Paths listed in <varname>ReadOnlyPaths=</varname> are accessible for
-        reading only, writing will be refused even if the usual file access controls would permit this. Nest
-        <varname>ReadWritePaths=</varname> inside of <varname>ReadOnlyPaths=</varname> in order to provide writable
-        subdirectories within read-only directories. Use <varname>ReadWritePaths=</varname> in order to whitelist
-        specific paths for write access if <varname>ProtectSystem=strict</varname> is used.</para>
+        <para>Paths listed in <varname>ReadWritePaths=</varname> are accessible from within the namespace
+        with the same access modes as from outside of it. Paths listed in <varname>ReadOnlyPaths=</varname>
+        are accessible for reading only, writing will be refused even if the usual file access controls would
+        permit this. Nest <varname>ReadWritePaths=</varname> inside of <varname>ReadOnlyPaths=</varname> in
+        order to provide writable subdirectories within read-only directories. Use
+        <varname>ReadWritePaths=</varname> in order to allow-list specific paths for write access if
+        <varname>ProtectSystem=strict</varname> is used.</para>
 
         <para>Paths listed in <varname>InaccessiblePaths=</varname> will be made inaccessible for processes inside
         the namespace along with everything below them in the file system hierarchy. This may be more restrictive than
@@ -1223,8 +1241,8 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
         <term><varname>PrivateTmp=</varname></term>
 
         <listitem><para>Takes a boolean argument. If true, sets up a new file system namespace for the executed
-        processes and mounts private <filename>/tmp</filename> and <filename>/var/tmp</filename> directories inside it
-        that is not shared by processes outside of the namespace. This is useful to secure access to temporary files of
+        processes and mounts private <filename>/tmp/</filename> and <filename>/var/tmp/</filename> directories inside it
+        that are not shared by processes outside of the namespace. This is useful to secure access to temporary files of
         the process, but makes sharing between processes via <filename>/tmp</filename> or <filename>/var/tmp</filename>
         impossible. If this is enabled, all temporary files created by a service in these directories will be removed
         after the service is stopped.  Defaults to false. It is possible to run two or more units within the same
@@ -1384,7 +1402,7 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
         this option removes <constant>CAP_SYS_TIME</constant> and <constant>CAP_WAKE_ALARM</constant> from the
         capability bounding set for this unit, installs a system call filter to block calls that can set the
         clock, and <varname>DeviceAllow=char-rtc r</varname> is implied. This ensures <filename>/dev/rtc0</filename>,
-        <filename>/dev/rtc1</filename>, etc are made read only to the service. See
+        <filename>/dev/rtc1</filename>, etc. are made read-only to the service. See
         <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>
         for the details about <varname>DeviceAllow=</varname>.</para>
 
@@ -1469,29 +1487,31 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
       <varlistentry>
         <term><varname>RestrictAddressFamilies=</varname></term>
 
-        <listitem><para>Restricts the set of socket address families accessible to the processes of this unit. Takes a
-        space-separated list of address family names to whitelist, such as <constant>AF_UNIX</constant>,
-        <constant>AF_INET</constant> or <constant>AF_INET6</constant>. When prefixed with <constant>~</constant> the
-        listed address families will be applied as blacklist, otherwise as whitelist.  Note that this restricts access
-        to the <citerefentry
-        project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>2</manvolnum></citerefentry> system call
-        only. Sockets passed into the process by other means (for example, by using socket activation with socket
-        units, see <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>)
-        are unaffected. Also, sockets created with <function>socketpair()</function> (which creates connected AF_UNIX
-        sockets only) are unaffected. Note that this option has no effect on 32-bit x86, s390, s390x, mips, mips-le,
-        ppc, ppc-le, pcc64, ppc64-le and is ignored (but works correctly on other ABIs, including x86-64). Note that on
-        systems supporting multiple ABIs (such as x86/x86-64) it is recommended to turn off alternative ABIs for
-        services, so that they cannot be used to circumvent the restrictions of this option. Specifically, it is
-        recommended to combine this option with <varname>SystemCallArchitectures=native</varname> or similar. If
-        running in user mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant> capability
-        (e.g. setting <varname>User=nobody</varname>), <varname>NoNewPrivileges=yes</varname> is implied. By default,
-        no restrictions apply, all address families are accessible to processes. If assigned the empty string, any
-        previous address family restriction changes are undone. This setting does not affect commands prefixed with
-        <literal>+</literal>.</para>
+        <listitem><para>Restricts the set of socket address families accessible to the processes of this
+        unit. Takes a space-separated list of address family names to allow-list, such as
+        <constant>AF_UNIX</constant>, <constant>AF_INET</constant> or <constant>AF_INET6</constant>. When
+        prefixed with <constant>~</constant> the listed address families will be applied as deny list,
+        otherwise as allow list.  Note that this restricts access to the <citerefentry
+        project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>2</manvolnum></citerefentry>
+        system call only. Sockets passed into the process by other means (for example, by using socket
+        activation with socket units, see
+        <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>)
+        are unaffected. Also, sockets created with <function>socketpair()</function> (which creates connected
+        AF_UNIX sockets only) are unaffected. Note that this option has no effect on 32-bit x86, s390, s390x,
+        mips, mips-le, ppc, ppc-le, ppc64, ppc64-le and is ignored (but works correctly on other ABIs,
+        including x86-64). Note that on systems supporting multiple ABIs (such as x86/x86-64) it is
+        recommended to turn off alternative ABIs for services, so that they cannot be used to circumvent the
+        restrictions of this option. Specifically, it is recommended to combine this option with
+        <varname>SystemCallArchitectures=native</varname> or similar. If running in user mode, or in system
+        mode, but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting
+        <varname>User=nobody</varname>), <varname>NoNewPrivileges=yes</varname> is implied. By default, no
+        restrictions apply, all address families are accessible to processes. If assigned the empty string,
+        any previous address family restriction changes are undone. This setting does not affect commands
+        prefixed with <literal>+</literal>.</para>
 
         <para>Use this option to limit exposure of processes to remote access, in particular via exotic and sensitive
         network protocols, such as <constant>AF_PACKET</constant>. Note that in most cases, the local
-        <constant>AF_UNIX</constant> address family should be included in the configured whitelist as it is frequently
+        <constant>AF_UNIX</constant> address family should be included in the configured allow list as it is frequently
         used for local communication, including for
         <citerefentry><refentrytitle>syslog</refentrytitle><manvolnum>2</manvolnum></citerefentry>
         logging.</para></listitem>
@@ -1509,9 +1529,9 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
         any combination of: <constant>cgroup</constant>, <constant>ipc</constant>, <constant>net</constant>,
         <constant>mnt</constant>, <constant>pid</constant>, <constant>user</constant> and <constant>uts</constant>. Any
         namespace type listed is made accessible to the unit's processes, access to namespace types not listed is
-        prohibited (whitelisting). By prepending the list with a single tilde character (<literal>~</literal>) the
+        prohibited (allow-listing). By prepending the list with a single tilde character (<literal>~</literal>) the
         effect may be inverted: only the listed namespace types will be made inaccessible, all unlisted ones are
-        permitted (blacklisting). If the empty string is assigned, the default namespace restrictions are applied,
+        permitted (deny-listing). If the empty string is assigned, the default namespace restrictions are applied,
         which is equivalent to false. This option may appear more than once, in which case the namespace types are
         merged by <constant>OR</constant>, or by <constant>AND</constant> if the lines are prefixed with
         <literal>~</literal> (see examples below). Internally, this setting limits access to the
@@ -1679,7 +1699,7 @@ RestrictNamespaces=~cgroup net</programlisting>
         <option>shared</option> mount propagation is used, but — as mentioned — as <option>slave</option> is applied
         first, propagation from the unit's processes to the host is still turned off.</para>
 
-        <para>It is not recommended to to use <option>private</option> mount propagation for units, as this means
+        <para>It is not recommended to use <option>private</option> mount propagation for units, as this means
         temporary mounts (such as removable media) of the host will stay mounted and thus indefinitely busy in forked
         off processes, as unmount propagation events won't be received by the file system namespace of the unit.</para>
 
@@ -1701,15 +1721,15 @@ RestrictNamespaces=~cgroup net</programlisting>
 
         <listitem><para>Takes a space-separated list of system call names. If this setting is used, all
         system calls executed by the unit processes except for the listed ones will result in immediate
-        process termination with the <constant>SIGSYS</constant> signal (whitelisting). (See
+        process termination with the <constant>SIGSYS</constant> signal (allow-listing). (See
         <varname>SystemCallErrorNumber=</varname> below for changing the default action). If the first
         character of the list is <literal>~</literal>, the effect is inverted: only the listed system calls
-        will result in immediate process termination (blacklisting). Blacklisted system calls and system call
+        will result in immediate process termination (deny-listing). Deny-listed system calls and system call
         groups may optionally be suffixed with a colon (<literal>:</literal>) and <literal>errno</literal>
         error number (between 0 and 4095) or errno name such as <constant>EPERM</constant>,
         <constant>EACCES</constant> or <constant>EUCLEAN</constant> (see <citerefentry
         project='man-pages'><refentrytitle>errno</refentrytitle><manvolnum>3</manvolnum></citerefentry> for a
-        full list). This value will be returned when a blacklisted system call is triggered, instead of
+        full list). This value will be returned when a deny-listed system call is triggered, instead of
         terminating the processes immediately.  This value takes precedence over the one given in
         <varname>SystemCallErrorNumber=</varname>, see below.  If running in user mode, or in system mode,
         but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting
@@ -1718,7 +1738,7 @@ RestrictNamespaces=~cgroup net</programlisting>
         for enforcing a minimal sandboxing environment. Note that the <function>execve</function>,
         <function>exit</function>, <function>exit_group</function>, <function>getrlimit</function>,
         <function>rt_sigreturn</function>, <function>sigreturn</function> system calls and the system calls
-        for querying time and sleeping are implicitly whitelisted and do not need to be listed
+        for querying time and sleeping are implicitly allow-listed and do not need to be listed
         explicitly. This option may be specified more than once, in which case the filter masks are
         merged. If the empty string is assigned, the filter is reset, all prior assignments will have no
         effect. This does not affect commands prefixed with <literal>+</literal>.</para>
@@ -1736,12 +1756,13 @@ RestrictNamespaces=~cgroup net</programlisting>
         might be necessary to temporarily disable system call filters in order to simplify debugging of such
         failures.</para>
 
-        <para>If you specify both types of this option (i.e.  whitelisting and blacklisting), the first encountered
-        will take precedence and will dictate the default action (termination or approval of a system call). Then the
-        next occurrences of this option will add or delete the listed system calls from the set of the filtered system
-        calls, depending of its type and the default action. (For example, if you have started with a whitelisting of
-        <function>read</function> and <function>write</function>, and right after it add a blacklisting of
-        <function>write</function>, then <function>write</function> will be removed from the set.)</para>
+        <para>If you specify both types of this option (i.e.  allow-listing and deny-listing), the first
+        encountered will take precedence and will dictate the default action (termination or approval of a
+        system call). Then the next occurrences of this option will add or delete the listed system calls
+        from the set of the filtered system calls, depending of its type and the default action. (For
+        example, if you have started with an allow list rule for <function>read</function> and
+        <function>write</function>, and right after it add a deny list rule for <function>write</function>,
+        then <function>write</function> will be removed from the set.)</para>
 
         <para>As the number of possible system calls is large, predefined sets of system calls are provided.  A set
         starts with <literal>@</literal> character, followed by name of the set.
@@ -1785,7 +1806,7 @@ RestrictNamespaces=~cgroup net</programlisting>
               </row>
               <row>
                 <entry>@file-system</entry>
-                <entry>File system operations: opening, creating files and directories for read and write, renaming and removing them, reading file properties, or creating hard and symbolic links.</entry>
+                <entry>File system operations: opening, creating files and directories for read and write, renaming and removing them, reading file properties, or creating hard and symbolic links</entry>
               </row>
               <row>
                 <entry>@io-event</entry>
@@ -1801,7 +1822,7 @@ RestrictNamespaces=~cgroup net</programlisting>
               </row>
               <row>
                 <entry>@memlock</entry>
-                <entry>Locking of memory into RAM (<citerefentry project='man-pages'><refentrytitle>mlock</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>mlockall</refentrytitle><manvolnum>2</manvolnum></citerefentry> and related calls)</entry>
+                <entry>Locking of memory in RAM (<citerefentry project='man-pages'><refentrytitle>mlock</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>mlockall</refentrytitle><manvolnum>2</manvolnum></citerefentry> and related calls)</entry>
               </row>
               <row>
                 <entry>@module</entry>
@@ -1825,7 +1846,7 @@ RestrictNamespaces=~cgroup net</programlisting>
               </row>
               <row>
                 <entry>@process</entry>
-                <entry>Process control, execution, namespaceing operations (<citerefentry project='man-pages'><refentrytitle>clone</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>kill</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>namespaces</refentrytitle><manvolnum>7</manvolnum></citerefentry>, …</entry>
+                <entry>Process control, execution, namespaceing operations (<citerefentry project='man-pages'><refentrytitle>clone</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>kill</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>namespaces</refentrytitle><manvolnum>7</manvolnum></citerefentry>, …)</entry>
               </row>
               <row>
                 <entry>@raw-io</entry>
@@ -1853,11 +1874,11 @@ RestrictNamespaces=~cgroup net</programlisting>
               </row>
               <row>
                 <entry>@sync</entry>
-                <entry>Synchronizing files and memory to disk: (<citerefentry project='man-pages'><refentrytitle>fsync</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>msync</refentrytitle><manvolnum>2</manvolnum></citerefentry>, and related calls)</entry>
+                <entry>Synchronizing files and memory to disk (<citerefentry project='man-pages'><refentrytitle>fsync</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>msync</refentrytitle><manvolnum>2</manvolnum></citerefentry>, and related calls)</entry>
               </row>
               <row>
                 <entry>@system-service</entry>
-                <entry>A reasonable set of system calls used by common system services, excluding any special purpose calls. This is the recommended starting point for whitelisting system calls for system services, as it contains what is typically needed by system services, but excludes overly specific interfaces. For example, the following APIs are excluded: <literal>@clock</literal>, <literal>@mount</literal>, <literal>@swap</literal>, <literal>@reboot</literal>.</entry>
+                <entry>A reasonable set of system calls used by common system services, excluding any special purpose calls. This is the recommended starting point for allow-listing system calls for system services, as it contains what is typically needed by system services, but excludes overly specific interfaces. For example, the following APIs are excluded: <literal>@clock</literal>, <literal>@mount</literal>, <literal>@swap</literal>, <literal>@reboot</literal>.</entry>
               </row>
               <row>
                 <entry>@timer</entry>
@@ -1873,9 +1894,10 @@ RestrictNamespaces=~cgroup net</programlisting>
         <command>systemd-analyze syscall-filter</command> to list the actual list of system calls in each
         filter.</para>
 
-        <para>Generally, whitelisting system calls (rather than blacklisting) is the safer mode of operation. It is
-        recommended to enforce system call whitelists for all long-running system services. Specifically, the
-        following lines are a relatively safe basic choice for the majority of system services:</para>
+        <para>Generally, allow-listing system calls (rather than deny-listing) is the safer mode of
+        operation. It is recommended to enforce system call allow lists for all long-running system
+        services. Specifically, the following lines are a relatively safe basic choice for the majority of
+        system services:</para>
 
         <programlisting>[Service]
 SystemCallFilter=@system-service
@@ -1886,9 +1908,9 @@ SystemCallErrorNumber=EPERM</programlisting>
         call may be used to execute operations similar to what can be done with the older
         <function>kill()</function> system call, hence blocking the latter without the former only provides
         weak protection. Since new system calls are added regularly to the kernel as development progresses,
-        keeping system call blacklists comprehensive requires constant work. It is thus recommended to use
-        whitelisting instead, which offers the benefit that new system calls are by default implicitly
-        blocked until the whitelist is updated.</para>
+        keeping system call deny lists comprehensive requires constant work. It is thus recommended to use
+        allow-listing instead, which offers the benefit that new system calls are by default implicitly
+        blocked until the allow list is updated.</para>
 
         <para>Also note that a number of system calls are required to be accessible for the dynamic linker to
         work. The dynamic linker is required for running most regular programs (specifically: all dynamic ELF
@@ -1930,7 +1952,7 @@ SystemCallErrorNumber=EPERM</programlisting>
         manager is compiled for). If running in user mode, or in system mode, but without the
         <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting <varname>User=nobody</varname>),
         <varname>NoNewPrivileges=yes</varname> is implied. By default, this option is set to the empty list, i.e. no
-        system call architecture filtering is applied.</para>
+        filtering is applied.</para>
 
         <para>If this setting is used, processes of this unit will only be permitted to call native system calls, and
         system calls of the specified architectures. For the purposes of this option, the x32 architecture is treated
@@ -2194,8 +2216,9 @@ SystemCallErrorNumber=EPERM</programlisting>
         <constant>AF_UNIX</constant> socket in the file system, as in that case only a
         single stream connection is created for both input and output.</para>
 
-        <para><option>append:<replaceable>path</replaceable></option> is similar to <option>file:<replaceable>path
-        </replaceable></option> above, but it opens the file in append mode.</para>
+        <para><option>append:<replaceable>path</replaceable></option> is similar to
+        <option>file:<replaceable>path</replaceable></option> above, but it opens the file in append mode.
+        </para>
 
         <para><option>socket</option> connects standard output to a socket acquired via socket activation. The
         semantics are similar to the same option of <varname>StandardInput=</varname>, see above.</para>
@@ -2532,7 +2555,7 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy
     <varname>UnsetEnvironment=</varname> are removed again from the compiled environment variable list, immediately
     before it is passed to the executed process.</para>
 
-    <para>The following select environment variables are set or propagated by the service manager for each invoked
+    <para>The following environment variables are set or propagated by the service manager for each invoked
     process:</para>
 
     <variablelist class='environment-variables'>
@@ -2603,7 +2626,7 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy
         <term><varname>$LOGS_DIRECTORY</varname></term>
         <term><varname>$CONFIGURATION_DIRECTORY</varname></term>
 
-        <listitem><para>Contains and absolute paths to the directories defined with
+        <listitem><para>Absolute paths to the directories defined with
         <varname>RuntimeDirectory=</varname>, <varname>StateDirectory=</varname>,
         <varname>CacheDirectory=</varname>, <varname>LogsDirectory=</varname>, and
         <varname>ConfigurationDirectory=</varname> when those settings are used.</para>
@@ -3209,7 +3232,7 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy
           <row>
             <entry>242</entry>
             <entry><constant>EXIT_NUMA_POLICY</constant></entry>
-            <entry>Failed to set up unit's NUMA memory policy. See <varname>NUMAPolicy=</varname> and <varname>NUMAMask=</varname>above.</entry>
+            <entry>Failed to set up unit's NUMA memory policy. See <varname>NUMAPolicy=</varname> and <varname>NUMAMask=</varname> above.</entry>
           </row>
 
         </tbody>
index 31ad143113c6f190021bdc33438fa8b2318e4822..197a468f25de8c23e2a73a359fd06b3538f5b6f3 100644 (file)
     structured log entries via calls such as
     <citerefentry><refentrytitle>sd_journal_send</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
     They may also not be used as matches for
-    <citerefentry><refentrytitle>sd_journal_add_match</refentrytitle><manvolnum>3</manvolnum></citerefentry></para>
+    <citerefentry><refentrytitle>sd_journal_add_match</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
+    </para>
 
     <variablelist class='journal-directives'>
       <varlistentry>
index 5e4d430031c60ab27fc0ef1f1f1f9b1fac800540..73f61c80e4fdf28c5c9a5bf9f2a3556b8f334e9c 100644 (file)
         terminate upon receiving the initial <constant>SIGTERM</constant>
         signal. This can be achieved by configuring <varname>LimitCORE=</varname>
         and setting <varname>FinalKillSignal=</varname> to either
-        <constant>SIGQUIT</constant> or <constant>SIGABRT</constant>
+        <constant>SIGQUIT</constant> or <constant>SIGABRT</constant>.
         Defaults to <constant>SIGKILL</constant>.
         </para></listitem>
       </varlistentry>
index 7e17bf095fe8432e2a9ead034fb1988fb4dd56fa..dc59ee4e9a7df38f73727d2cb95e5cfd2b60ccf3 100644 (file)
@@ -27,7 +27,7 @@
     <title>Description</title>
 
     <para>A plain ini-style text file that encodes configuration for matching network devices, used by
-    <citerefentry><refentrytitle>systemd-udev</refentrytitle><manvolnum>8</manvolnum></citerefentry> and in
+    <citerefentry><refentrytitle>systemd-udevd</refentrytitle><manvolnum>8</manvolnum></citerefentry> and in
     particular its <command>net_setup_link</command> builtin. See
     <citerefentry><refentrytitle>systemd.syntax</refentrytitle><manvolnum>5</manvolnum></citerefentry> for a
     general description of the syntax.</para>
@@ -64,8 +64,8 @@
     <title>[Match] Section Options</title>
 
     <para>A link file is said to match a device if all matches specified by the
-    <literal>[Match]</literal> section are satisfied. When a link file does not contain valid settings
-    in <literal>[Match]</literal> section, then the file will match all devices and
+    [Match] section are satisfied. When a link file does not contain valid settings
+    in [Match] section, then the file will match all devices and
     <command>systemd-udevd</command> warns about that. Hint: to avoid the warning and to make it clear
     that all interfaces shall be matched, add the following:
     <programlisting>OriginalName=*</programlisting>
index 07feccb54a06a38869c754888e2dc61f3a8c9634..9e1f5d40fd9f2837aa22b1071d10983071155247 100644 (file)
@@ -34,9 +34,9 @@
     this unit type. See
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     for the common options of all unit configuration files. The common
-    configuration items are configured in the generic <literal>[Unit]</literal> and
-    <literal>[Install]</literal> sections. The mount specific configuration options are
-    configured in the <literal>[Mount]</literal> section.</para>
+    configuration items are configured in the generic [Unit] and
+    [Install] sections. The mount specific configuration options are
+    configured in the [Mount] section.</para>
 
     <para>Additional options are listed in
     <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
         system that merges multiple mount points). See
         <varname>After=</varname> and <varname>Requires=</varname> in
         <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        for details.</para></listitem>
+        for details.</para>
+
+        <para>Note that this option always applies to the created mount unit
+        only regardless whether <option>x-systemd.automount</option> has been
+        specified.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         unit.
         See <varname>Before=</varname> and <varname>After=</varname> in
         <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        for details.</para></listitem>
+        for details.</para>
+
+        <para>Note that these options always apply to the created mount unit
+        only regardless whether <option>x-systemd.automount</option> has been
+        specified.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 4fc85d40ec3892468683d998fc33699f5a13b00f..324c94dbd9fe3a95380916f4bdbc2d72dfb6694c 100644 (file)
       </variablelist>
 
     <para>Note that <constant>latest</constant> may be used to denote the latest scheme known (to this
-    particular version of systemd.</para>
+    particular version of systemd).</para>
   </refsect1>
 
   <refsect1>
index d489ddf989abaea900649e5b2b0d55136882a539..c8ebd45c7f88fc1a3841333d7103ebbf51350acb 100644 (file)
           <entry>An IPv4 over IPv4 tunnel.</entry></row>
 
           <row><entry><varname>ipvlan</varname></entry>
-          <entry>An ipvlan device is a stacked device which receives packets from its underlying device based on IP address filtering.</entry></row>
+          <entry>An IPVLAN device is a stacked device which receives packets from its underlying device based on IP address filtering.</entry></row>
 
           <row><entry><varname>ipvtap</varname></entry>
-          <entry>An ipvtap device is a stacked device which receives packets from its underlying device based on IP address filtering and can be accessed using the tap user space interface.</entry></row>
+          <entry>An IPVTAP device is a stacked device which receives packets from its underlying device based on IP address filtering and can be accessed using the tap user space interface.</entry></row>
 
           <row><entry><varname>macvlan</varname></entry>
           <entry>A macvlan device is a stacked device which receives packets from its underlying device based on MAC address filtering.</entry></row>
           <row><entry><varname>wireguard</varname></entry>
           <entry>WireGuard Secure Network Tunnel.</entry></row>
 
-          <row><entry><varname>netdevsim</varname></entry>
-          <entry>A simulator. This simulated networking device is used for testing various networking APIs and at this time is particularly focused on testing hardware offloading related interfaces.</entry></row>
-
           <row><entry><varname>nlmon</varname></entry>
           <entry>A Netlink monitor device. Use an nlmon device when you want to monitor system Netlink messages.</entry></row>
 
     <title>[Match] Section Options</title>
 
     <para>A virtual network device is only created if the
-    <literal>[Match]</literal> section matches the current
+    [Match] section matches the current
     environment, or if the section is empty. The following keys are
     accepted:</para>
 
   <refsect1>
     <title>[NetDev] Section Options</title>
 
-    <para>The <literal>[NetDev]</literal> section accepts the
+    <para>The [NetDev] section accepts the
     following keys:</para>
 
     <variablelist class='network-directives'>
         <term><varname>Name=</varname></term>
         <listitem>
           <para>The interface name used when creating the netdev.
-          This option is compulsory.</para>
+          This setting is compulsory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>Kind=</varname></term>
         <listitem>
-          <para>The netdev kind. This option is compulsory. See the
+          <para>The netdev kind. This setting is compulsory. See the
           <literal>Supported netdev kinds</literal> section for the
           valid keys.</para>
         </listitem>
       <varlistentry>
         <term><varname>MTUBytes=</varname></term>
         <listitem>
-          <para>The maximum transmission unit in bytes to set for the device. The usual suffixes K, M, G,
+          <para>The maximum transmission unit in bytes to set for the device. The usual suffixes K, M, G
           are supported and are understood to the base of 1024. For <literal>tun</literal> or
           <literal>tap</literal> devices, <varname>MTUBytes=</varname> setting is not currently supported in
-          <literal>[NetDev]</literal> section. Please specify it in <literal>[Link]</literal> section of
+          [NetDev] section. Please specify it in [Link] section of
           corresponding
           <citerefentry><refentrytitle>systemd.network</refentrytitle><manvolnum>5</manvolnum></citerefentry>
           files.</para>
         <term><varname>MACAddress=</varname></term>
         <listitem>
           <para>The MAC address to use for the device. For <literal>tun</literal> or <literal>tap</literal>
-          devices, setting <varname>MACAddress=</varname> in the <literal>[NetDev]</literal> section is not
-          supported. Please specify it in <literal>[Link]</literal> section of the corresponding
+          devices, setting <varname>MACAddress=</varname> in the [NetDev] section is not
+          supported. Please specify it in [Link] section of the corresponding
           <citerefentry><refentrytitle>systemd.network</refentrytitle><manvolnum>5</manvolnum></citerefentry>
           file. If this option is not set, <literal>vlan</literal> devices inherit the MAC address of the
           physical interface. For other kind of netdevs, if this option is not set, then MAC address is
   <refsect1>
     <title>[Bridge] Section Options</title>
 
-    <para>The <literal>[Bridge]</literal> section only applies for
+    <para>The [Bridge] section only applies for
     netdevs of kind <literal>bridge</literal>, and accepts the
     following keys:</para>
 
   <refsect1>
     <title>[VLAN] Section Options</title>
 
-    <para>The <literal>[VLAN]</literal> section only applies for
+    <para>The [VLAN] section only applies for
     netdevs of kind <literal>vlan</literal>, and accepts the
     following key:</para>
 
         <term><varname>Id=</varname></term>
         <listitem>
           <para>The VLAN ID to use. An integer in the range 0–4094.
-          This option is compulsory.</para>
+          This setting is compulsory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
       <varlistentry>
         <term><varname>ReorderHeader=</varname></term>
         <listitem>
-          <para>Takes a boolean. The VLAN reorder header is set VLAN interfaces behave like physical interfaces.
-          When unset, the kernel's default will be used.</para>
+          <para>Takes a boolean. When enabled, the VLAN reorder header is used and VLAN interfaces behave
+          like physical interfaces. When unset, the kernel's default will be used.</para>
         </listitem>
       </varlistentry>
     </variablelist>
   <refsect1>
     <title>[MACVLAN] Section Options</title>
 
-    <para>The <literal>[MACVLAN]</literal> section only applies for
+    <para>The [MACVLAN] section only applies for
     netdevs of kind <literal>macvlan</literal>, and accepts the
     following key:</para>
 
           <para>The MACVLAN mode to use. The supported options are
           <literal>private</literal>,
           <literal>vepa</literal>,
-          <literal>bridge</literal>, and
-          <literal>passthru</literal>.
+          <literal>bridge</literal>,
+          <literal>passthru</literal>, and
+          <literal>source</literal>.
           </para>
         </listitem>
       </varlistentry>
+      <varlistentry>
+        <term><varname>SourceMACAddress=</varname></term>
+        <listitem>
+          <para>A whitespace-separated list of remote hardware addresses allowed on the MACVLAN. This
+          option only has an effect in source mode. Use full colon-, hyphen- or dot-delimited
+          hexadecimal. This option may appear more than once, in which case the lists are merged. If
+          the empty string is assigned to this option, the list of hardware addresses defined prior
+          to this is reset. Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
   <refsect1>
     <title>[MACVTAP] Section Options</title>
 
-    <para>The <literal>[MACVTAP]</literal> section applies for
+    <para>The [MACVTAP] section applies for
     netdevs of kind <literal>macvtap</literal> and accepts the
-    same key as <literal>[MACVLAN]</literal>.</para>
+    same key as [MACVLAN].</para>
   </refsect1>
 
   <refsect1>
     <title>[IPVLAN] Section Options</title>
 
-    <para>The <literal>[IPVLAN]</literal> section only applies for
+    <para>The [IPVLAN] section only applies for
     netdevs of kind <literal>ipvlan</literal>, and accepts the
     following key:</para>
 
   <refsect1>
     <title>[IPVTAP] Section Options</title>
 
-    <para>The <literal>[IPVTAP]</literal> section only applies for
+    <para>The [IPVTAP] section only applies for
     netdevs of kind <literal>ipvtap</literal> and accepts the
-    same key as <literal>[IPVLAN]</literal>.</para>
+    same key as [IPVLAN].</para>
   </refsect1>
 
   <refsect1>
     <title>[VXLAN] Section Options</title>
 
-    <para>The <literal>[VXLAN]</literal> section only applies for
+    <para>The [VXLAN] section only applies for
     netdevs of kind <literal>vxlan</literal>, and accepts the
     following keys:</para>
 
       <varlistentry>
         <term><varname>Group=</varname></term>
         <listitem>
-          <para>Configures VXLAN multicast group IP address. All members of a VXLAN must use the same multicast group address.</para>
+          <para>Configures VXLAN multicast group IP address. All members of a VXLAN must use the same
+          multicast group address.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
       <varlistentry>
         <term><varname>L3MissNotification=</varname></term>
         <listitem>
-          <para>Takes a boolean. When true, enables netlink IP address miss
-          notifications.</para>
+          <para>Takes a boolean. When true, enables netlink IP address miss notifications.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
   <refsect1>
     <title>[GENEVE] Section Options</title>
 
-    <para>The <literal>[GENEVE]</literal> section only applies for
+    <para>The [GENEVE] section only applies for
     netdevs of kind <literal>geneve</literal>, and accepts the
     following keys:</para>
 
       <varlistentry>
         <term><varname>TTL=</varname></term>
         <listitem>
-          <para>Accepts the same key in <literal>[VXLAN]</literal> section except when unset or
-          set to 0, the kernel's default will be used meaning that packets TTL will be set from
+          <para>Accepts the same values as in the [VXLAN] section, except that when unset
+          or set to 0, the kernel's default will be used, meaning that packet TTL will be set from
           <filename>/proc/sys/net/ipv4/ip_default_ttl</filename>.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>UDPChecksum=</varname></term>
         <listitem>
-          <para>Takes a boolean. When true, specifies if UDP checksum is calculated for transmitted packets over IPv4.</para>
+          <para>Takes a boolean. When true, specifies that UDP checksum is calculated for transmitted packets
+          over IPv4.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
       <varlistentry>
         <term><varname>IPDoNotFragment=</varname></term>
         <listitem>
-          <para>Accepts the same key in <literal>[VXLAN]</literal> section.</para>
+          <para>Accepts the same key in [VXLAN] section.</para>
         </listitem>
       </varlistentry>
     </variablelist>
   <refsect1>
     <title>[L2TP] Section Options</title>
 
-    <para>The <literal>[L2TP]</literal> section only applies for
+    <para>The [L2TP] section only applies for
     netdevs of kind <literal>l2tp</literal>, and accepts the
     following keys:</para>
 
       <varlistentry>
         <term><varname>TunnelId=</varname></term>
         <listitem>
-          <para>Specifies the tunnel id. The value used must match the <literal>PeerTunnelId=</literal> value being used at the peer.
-          Ranges a number between 1 and 4294967295). This option is compulsory.</para>
+          <para>Specifies the tunnel identifier. Takes an number in the range 1–4294967295. The value used
+          must match the <literal>PeerTunnelId=</literal> value being used at the peer. This setting is
+          compulsory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>PeerTunnelId=</varname></term>
         <listitem>
-          <para>Specifies the peer tunnel id. The value used must match the <literal>PeerTunnelId=</literal> value being used at the peer.
-          Ranges a number between 1 and 4294967295). This option is compulsory.</para>
+          <para>Specifies the peer tunnel id. Takes a number in the range 1—4294967295. The value used must
+          match the <literal>PeerTunnelId=</literal> value being used at the peer. This setting is
+          compulsory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>Remote=</varname></term>
         <listitem>
-          <para>Specifies the IP address of the remote peer. This option is compulsory.</para>
+          <para>Specifies the IP address of the remote peer. This setting is compulsory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
       <varlistentry>
         <term><varname>EncapsulationType=</varname></term>
         <listitem>
-          <para>Specifies the encapsulation type of the tunnel. Takes one of <literal>udp</literal> or <literal>ip</literal>.</para>
+          <para>Specifies the encapsulation type of the tunnel. Takes one of <literal>udp</literal> or
+          <literal>ip</literal>.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>UDPSourcePort=</varname></term>
         <listitem>
-          <para>Specifies the UDP source port to be used for the tunnel. When UDP encapsulation is selected it's mandotory. Ignored when ip
-          encapsulation is selected.</para>
+          <para>Specifies the UDP source port to be used for the tunnel. When UDP encapsulation is selected
+          it's mandatory. Ignored when IP encapsulation is selected.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>UDPDestinationPort=</varname></term>
         <listitem>
-          <para>Specifies destination port. When UDP encapsulation is selected it's mandotory. Ignored when ip
+          <para>Specifies destination port. When UDP encapsulation is selected it's mandatory. Ignored when IP
           encapsulation is selected.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>UDPChecksum=</varname></term>
         <listitem>
-          <para>Takes a boolean. When true, specifies if UDP checksum is calculated for transmitted packets over IPv4.</para>
+          <para>Takes a boolean. When true, specifies that UDP checksum is calculated for transmitted packets
+          over IPv4.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
   <refsect1>
     <title>[L2TPSession] Section Options</title>
 
-    <para>The <literal>[L2TPSession]</literal> section only applies for
+    <para>The [L2TPSession] section only applies for
     netdevs of kind <literal>l2tp</literal>, and accepts the
     following keys:</para>
     <variablelist class='network-directives'>
       <varlistentry>
         <term><varname>Name=</varname></term>
         <listitem>
-          <para>Specifies the name of the session. This option is compulsory.</para>
+          <para>Specifies the name of the session. This setting is compulsory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>SessionId=</varname></term>
         <listitem>
-          <para>Specifies the session id. The value used must match the <literal>SessionId=</literal> value being used at the peer.
-          Ranges a number between 1 and 4294967295). This option is compulsory.</para>
+          <para>Specifies the session identifier. Takes an number in the range 1–4294967295. The value used
+          must match the <literal>SessionId=</literal> value being used at the peer. This setting is
+          compulsory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>PeerSessionId=</varname></term>
         <listitem>
-          <para>Specifies the peer session id. The value used must match the <literal>PeerSessionId=</literal> value being used at the peer.
-          Ranges a number between 1 and 4294967295). This option is compulsory.</para>
+          <para>Specifies the peer session identifier. Takes an number in the range 1–4294967295.
+          The value used must match the <literal>PeerSessionId=</literal> value being used at the peer.
+          This setting is compulsory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
   <refsect1>
     <title>[MACsec] Section Options</title>
 
-    <para>The <literal>[MACsec]</literal> section only applies for network devices of kind
+    <para>The [MACsec] section only applies for network devices of kind
     <literal>macsec</literal>, and accepts the following keys:</para>
 
     <variablelist class='network-directives'>
 
   <refsect1>
     <title>[MACsecReceiveChannel] Section Options</title>
-    <para>The <literal>[MACsecReceiveChannel]</literal> section only applies for network devices of
+    <para>The [MACsecReceiveChannel] section only applies for network devices of
     kind <literal>macsec</literal>, and accepts the following keys:</para>
 
     <variablelist class='network-directives'>
         <term><varname>MACAddress=</varname></term>
         <listitem>
           <para>Specifies the MAC address to be used for the MACsec receive channel. The MAC address
-          used to make secure channel identifier (SCI). This option is compulsory, and is not set by
+          used to make secure channel identifier (SCI). This setting is compulsory, and is not set by
           default.</para>
         </listitem>
       </varlistentry>
   <refsect1>
     <title>[MACsecTransmitAssociation] Section Options</title>
 
-    <para>The <literal>[MACsecTransmitAssociation]</literal> section only applies for network devices
+    <para>The [MACsecTransmitAssociation] section only applies for network devices
     of kind <literal>macsec</literal>, and accepts the following keys:</para>
 
     <variablelist class='network-directives'>
         <term><varname>Key=</varname></term>
         <listitem>
           <para>Specifies the encryption key used in the transmission channel. The same key must be
-          configured on the peer’s matching receive channel. This option is compulsory, and is not set
+          configured on the peer’s matching receive channel. This setting is compulsory, and is not set
           by default. Takes a 128-bit key encoded in a hexadecimal string, for example
           <literal>dffafc8d7b9a43d5b9a3dfbbf6a30c16</literal>.</para>
         </listitem>
         <term><varname>UseForEncoding=</varname></term>
         <listitem>
           <para>Takes a boolean. If enabled, then the security association is used for encoding. Only
-          one <literal>[MACsecTransmitAssociation]</literal> section can enable this option. When enabled,
+          one [MACsecTransmitAssociation] section can enable this option. When enabled,
           <varname>Activate=yes</varname> is implied. Defaults to unset.</para>
         </listitem>
       </varlistentry>
   <refsect1>
     <title>[MACsecReceiveAssociation] Section Options</title>
 
-    <para>The <literal>[MACsecReceiveAssociation]</literal> section only applies for
+    <para>The [MACsecReceiveAssociation] section only applies for
     network devices of kind <literal>macsec</literal>, and accepts the
     following keys:</para>
 
       <varlistentry>
         <term><varname>Port=</varname></term>
         <listitem>
-          <para>Accepts the same key in <literal>[MACsecReceiveChannel]</literal> section.</para>
+          <para>Accepts the same key in [MACsecReceiveChannel] section.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>MACAddress=</varname></term>
         <listitem>
-          <para>Accepts the same key in <literal>[MACsecReceiveChannel]</literal> section.</para>
+          <para>Accepts the same key in [MACsecReceiveChannel] section.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>PacketNumber=</varname></term>
         <listitem>
-          <para>Accepts the same key in <literal>[MACsecTransmitAssociation]</literal> section.</para>
+          <para>Accepts the same key in [MACsecTransmitAssociation] section.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>KeyId=</varname></term>
         <listitem>
-          <para>Accepts the same key in <literal>[MACsecTransmitAssociation]</literal> section.</para>
+          <para>Accepts the same key in [MACsecTransmitAssociation] section.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>Key=</varname></term>
         <listitem>
-          <para>Accepts the same key in <literal>[MACsecTransmitAssociation]</literal> section.</para>
+          <para>Accepts the same key in [MACsecTransmitAssociation] section.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>KeyFile=</varname></term>
         <listitem>
-          <para>Accepts the same key in <literal>[MACsecTransmitAssociation]</literal> section.</para>
+          <para>Accepts the same key in [MACsecTransmitAssociation] section.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>Activate=</varname></term>
         <listitem>
-          <para>Accepts the same key in <literal>[MACsecTransmitAssociation]</literal> section.</para>
+          <para>Accepts the same key in [MACsecTransmitAssociation] section.</para>
         </listitem>
       </varlistentry>
     </variablelist>
   <refsect1>
     <title>[Tunnel] Section Options</title>
 
-    <para>The <literal>[Tunnel]</literal> section only applies for
+    <para>The [Tunnel] section only applies for
     netdevs of kind
     <literal>ipip</literal>,
     <literal>sit</literal>,
           <para>A fixed Time To Live N on tunneled packets. N is a
           number in the range 1–255. 0 is a special value meaning that
           packets inherit the TTL value. The default value for IPv4
-          tunnels is: inherit. The default value for IPv6 tunnels is
+          tunnels is 0 (inherit). The default value for IPv6 tunnels is
           64.</para>
         </listitem>
       </varlistentry>
           both directions (<varname>InputKey=</varname> and <varname>OutputKey=</varname>).
           The <varname>Key=</varname> is either a number or an IPv4 address-like dotted quad.
           It is used as mark-configured SAD/SPD entry as part of the lookup key (both in data
-          and control path) in ip xfrm (framework used to implement IPsec protocol).
+          and control path) in IP XFRM (framework used to implement IPsec protocol).
           See <ulink url="http://man7.org/linux/man-pages/man8/ip-xfrm.8.html">
           ip-xfrm — transform configuration</ulink> for details. It is only used for VTI/VTI6,
           GRE, GRETAP, and ERSPAN tunnels.</para>
       <varlistentry>
         <term><varname>Encapsulation=</varname></term>
         <listitem>
-          <para>Accepts the same key as in the <literal>[FooOverUDP]</literal> section.</para>
+          <para>Accepts the same key as in the [FooOverUDP] section.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
   <refsect1>
     <title>[FooOverUDP] Section Options</title>
 
-    <para>The <literal>[FooOverUDP]</literal> section only applies for
+    <para>The [FooOverUDP] section only applies for
     netdevs of kind <literal>fou</literal> and accepts the
     following keys:</para>
 
       <varlistentry>
         <term><varname>Encapsulation=</varname></term>
         <listitem>
-          <para>Specifies the encapsulation mechanism used to store networking packets of various protocols inside the UDP packets. Supports the following values:
+          <para>Specifies the encapsulation mechanism used to store networking packets of various protocols
+          inside the UDP packets. Supports the following values:
 
-          <literal>FooOverUDP</literal> provides the simplest no frills model of UDP encapsulation, it simply encapsulates
-          packets directly in the UDP payload.
-          <literal>GenericUDPEncapsulation</literal> is a generic and extensible encapsulation, it allows encapsulation of packets for any IP
-          protocol and optional data as part of the encapsulation.
-          For more detailed information see <ulink url="https://lwn.net/Articles/615044">Generic UDP Encapsulation</ulink>.
-          Defaults to <literal>FooOverUDP</literal>.
+          <literal>FooOverUDP</literal> provides the simplest no frills model of UDP encapsulation, it simply
+          encapsulates packets directly in the UDP payload. <literal>GenericUDPEncapsulation</literal> is a
+          generic and extensible encapsulation, it allows encapsulation of packets for any IP protocol and
+          optional data as part of the encapsulation. For more detailed information see <ulink
+          url="https://lwn.net/Articles/615044">Generic UDP Encapsulation</ulink>. Defaults to
+          <literal>FooOverUDP</literal>.
           </para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>Port=</varname></term>
         <listitem>
-          <para>Specifies the port number, where the IP encapsulation packets will arrive. Please take note that the packets
-          will arrive with the encapsulation will be removed. Then they will be manually fed back into the network stack, and sent ahead
-          for delivery to the real destination. This option is mandatory.</para>
+          <para>Specifies the port number, where the IP encapsulation packets will arrive. Please take note
+          that the packets will arrive with the encapsulation will be removed. Then they will be manually fed
+          back into the network stack, and sent ahead for delivery to the real destination. This option is
+          mandatory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><varname>PeerPort=</varname></term>
         <listitem>
-          <para>Specifies the peer port number. Defaults to unset. Note that when peer port is set <literal>Peer=</literal> address is mandotory.</para>
+          <para>Specifies the peer port number. Defaults to unset. Note that when peer port is set
+          <literal>Peer=</literal> address is mandatory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
       <varlistentry>
         <term><varname>Peer=</varname></term>
         <listitem>
-          <para>Configures peer IP address. Note that when peer address is set <literal>PeerPort=</literal> is mandotory.</para>
+          <para>Configures peer IP address. Note that when peer address is set <literal>PeerPort=</literal>
+          is mandatory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
   <refsect1>
     <title>[Peer] Section Options</title>
 
-    <para>The <literal>[Peer]</literal> section only applies for
+    <para>The [Peer] section only applies for
     netdevs of kind <literal>veth</literal> and accepts the
     following keys:</para>
 
         <term><varname>Name=</varname></term>
         <listitem>
           <para>The interface name used when creating the netdev.
-          This option is compulsory.</para>
+          This setting is compulsory.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
   <refsect1>
     <title>[VXCAN] Section Options</title>
 
-    <para>The <literal>[VXCAN]</literal> section only applies for
+    <para>The [VXCAN] section only applies for
     netdevs of kind <literal>vxcan</literal> and accepts the
     following key:</para>
 
         <term><varname>Peer=</varname></term>
         <listitem>
           <para>The peer interface name used when creating the netdev.
-          This option is compulsory.</para>
+          This setting is compulsory.</para>
         </listitem>
       </varlistentry>
     </variablelist>
   <refsect1>
     <title>[Tun] Section Options</title>
 
-    <para>The <literal>[Tun]</literal> section only applies for
+    <para>The [Tun] section only applies for
     netdevs of kind <literal>tun</literal>, and accepts the following
     keys:</para>
 
   <refsect1>
     <title>[Tap] Section Options</title>
 
-    <para>The <literal>[Tap]</literal> section only applies for
+    <para>The [Tap] section only applies for
     netdevs of kind <literal>tap</literal>, and accepts the same keys
-    as the <literal>[Tun]</literal> section.</para>
+    as the [Tun] section.</para>
   </refsect1>
 
   <refsect1>
     <title>[WireGuard] Section Options</title>
 
-    <para>The <literal>[WireGuard]</literal> section accepts the following
+    <para>The [WireGuard] section accepts the following
     keys:</para>
 
     <variablelist class='network-directives'>
   <refsect1>
     <title>[WireGuardPeer] Section Options</title>
 
-    <para>The <literal>[WireGuardPeer]</literal> section accepts the following
+    <para>The [WireGuardPeer] section accepts the following
     keys:</para>
 
     <variablelist class='network-directives'>
   <refsect1>
     <title>[Bond] Section Options</title>
 
-    <para>The <literal>[Bond]</literal> section accepts the following
+    <para>The [Bond] section accepts the following
     key:</para>
 
     <variablelist class='network-directives'>
       <varlistentry>
         <term><varname>AdActorSystemPriority=</varname></term>
         <listitem>
-          <para>Specifies the 802.3ad actor system priority. Ranges [1-65535].</para>
+          <para>Specifies the 802.3ad actor system priority. Takes a number in the range 1—65535.</para>
         </listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>AdUserPortKey=</varname></term>
         <listitem>
-          <para>Specifies the 802.3ad user defined portion of the port key. Ranges [0-1023].</para>
+          <para>Specifies the 802.3ad user defined portion of the port key. Takes a number in the range
+          0–1023.</para>
         </listitem>
       </varlistentry>
 
   <refsect1>
     <title>[Xfrm] Section Options</title>
 
-    <para>The <literal>[Xfrm]</literal> section accepts the following
+    <para>The [Xfrm] section accepts the following
     keys:</para>
 
     <variablelist class='network-directives'>
     </variablelist>
 
     <para>For more detail information see
-      <ulink url="https://lwn.net/Articles/757391">
-        Virtual xfrm interfaces</ulink></para>
+      <ulink url="https://lwn.net/Articles/757391">Virtual XFRM Interfaces</ulink>.</para>
   </refsect1>
 
   <refsect1>
     <title>[VRF] Section Options</title>
-    <para>The <literal>[VRF]</literal> section only applies for
+    <para>The [VRF] section only applies for
     netdevs of kind <literal>vrf</literal> and accepts the
     following key:</para>
 
       <varlistentry>
         <term><varname>Table=</varname></term>
         <listitem>
-          <para>The numeric routing table identifier. This option is compulsory.</para>
+          <para>The numeric routing table identifier. This setting is compulsory.</para>
         </listitem>
       </varlistentry>
     </variablelist>
index c0d8d979e6a85e9e3182706c811952ad28af34cd..d08543c5fc547a275ce35232aa62bfad8f22bf1f 100644 (file)
   <refsect1>
     <title>[Match] Section Options</title>
 
-      <para>The network file contains a <literal>[Match]</literal>
-      section, which determines if a given network file may be applied
-      to a given device; and a <literal>[Network]</literal> section
-      specifying how the device should be configured. The first (in
-      lexical order) of the network files that matches a given device
-      is applied, all later files are ignored, even if they match as
-      well.</para>
-
-      <para>A network file is said to match a network interface if all matches specified by the
-      <literal>[Match]</literal> section are satisfied. When a network file does not contain valid
-      settings in <literal>[Match]</literal> section, then the file will match all interfaces and
-      <command>systemd-networkd</command> warns about that. Hint: to avoid the warning and to make it
-      clear that all interfaces shall be matched, add the following:
-      <programlisting>Name=*</programlisting>
-      The following keys are accepted:</para>
+      <para>The network file contains a [Match] section, which determines if a given network file may be
+      applied to a given device; and a [Network] section specifying how the device should be configured. The
+      first (in lexical order) of the network files that matches a given device is applied, all later files
+      are ignored, even if they match as well.</para>
+
+      <para>A network file is said to match a network interface if all matches specified by the [Match]
+      section are satisfied. When a network file does not contain valid settings in [Match] section, then the
+      file will match all interfaces and <command>systemd-networkd</command> warns about that. Hint: to avoid
+      the warning and to make it clear that all interfaces shall be matched, add the following:
+      <programlisting>Name=*</programlisting> The following keys are accepted:</para>
 
       <variablelist class='network-directives'>
         <xi:include href="systemd.link.xml" xpointer="mac-address" />
           <listitem>
             <para>A whitespace-separated list of hardware address of the currently connected wireless
             LAN. Use full colon-, hyphen- or dot-delimited hexadecimal. See the example in
-            <varname>MACAddress=</varname>. This option may appear more than one, in which case the
-            lists are merged. If the empty string is assigned to this option, the list of BSSID defined
-            prior to this is reset.</para>
+            <varname>MACAddress=</varname>. This option may appear more than once, in which case the
+            lists are merged. If the empty string is assigned to this option, the list is reset.</para>
           </listitem>
         </varlistentry>
 
   <refsect1>
     <title>[Link] Section Options</title>
 
-    <para> The <literal>[Link]</literal> section accepts the following keys:</para>
+    <para> The [Link] section accepts the following keys:</para>
 
     <variablelist class='network-directives'>
       <varlistentry>
           This happens when multicast routing is enabled.</para>
         </listitem>
       </varlistentry>
-      <varlistentry>
-        <term><varname>IPv6LinkLocalAddressGenerationMode=</varname></term>
-        <listitem>
-          <para>Specifies how IPv6 link local address is generated. Takes one of <literal>eui64</literal>,
-          <literal>none</literal>, <literal>stable-privacy</literal> and <literal>random</literal>.
-          When unset, the kernel's default will be used. Note that if <varname>LinkLocalAdressing=</varname>
-          not configured as <literal>ipv6</literal> then <varname>IPv6LinkLocalAddressGenerationMode=</varname>
-          is ignored.</para>
-        </listitem>
-      </varlistentry>
       <varlistentry>
         <term><varname>Unmanaged=</varname></term>
         <listitem>
           <para>Link groups are similar to port ranges found in managed switches.
           When network interfaces are added to a numbered group, operations on
           all the interfaces from that group can be performed at once. An unsigned
-          integer ranges 0 to 4294967294. Default to unset.</para>
+          integer in the range 0—4294967294. Defaults to unset.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
     </variablelist>
   </refsect1>
 
+  <refsect1>
+      <title>[SR-IOV] Section Options</title>
+      <para>The [SR-IOV] section accepts the following keys. Specify several [SR-IOV] sections to configure
+      several SR-IOVs. SR-IOV provides the ability to partition a single physical PCI resource into virtual
+      PCI functions which can then be injected into a VM. In the case of network VFs, SR-IOV improves
+      north-south network performance (that is, traffic with endpoints outside the host machine) by allowing
+      traffic to bypass the host machine’s network stack.</para>
+
+      <variablelist class='network-directives'>
+        <varlistentry>
+          <term><varname>VirtualFunction=</varname></term>
+          <listitem>
+            <para>Specifies a Virtual Function (VF), lightweight PCIe function designed solely to move data
+            in and out. Takes an unsigned integer in the range 0..2147483646. This option is compulsory.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term><varname>VLANId=</varname></term>
+          <listitem>
+            <para>Specifies VLAN ID of the virtual function. Takes an unsigned integer in the range 1..4095.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term><varname>QualityOfService=</varname></term>
+          <listitem>
+            <para>Specifies quality of service of the virtual function. Takes an unsigned integer in the range 1..4294967294.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term><varname>VLANProtocol=</varname></term>
+          <listitem>
+            <para>Specifies VLAN protocol of the virtual function. Takes <literal>802.1Q</literal> or
+            <literal>802.1ad</literal>.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term><varname>MACSpoofCheck=</varname></term>
+          <listitem>
+            <para>Takes a boolean. Controls the MAC spoof checking. When unset, the kernel's default will be used.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term><varname>QueryReceiveSideScaling=</varname></term>
+          <listitem>
+            <para>Takes a boolean. Toggle the ability of querying the receive side scaling (RSS)
+            configuration of the virtual function (VF). The VF RSS information like RSS hash key may be
+            considered sensitive on some devices where this information is shared between VF and the
+            physical function (PF). When unset, the kernel's default will be used.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term><varname>Trust=</varname></term>
+          <listitem>
+            <para>Takes a boolean. Allows to set trust mode of the virtual function (VF). When set, VF
+            users can set a specific feature which may impact security and/or performance. When unset,
+            the kernel's default will be used.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term><varname>LinkState=</varname></term>
+          <listitem>
+            <para>Allows to set the link state of the virtual function (VF). Takes a boolean or a
+            special value <literal>auto</literal>. Setting to <literal>auto</literal> means a
+            reflection of the physical function (PF) link state, <literal>yes</literal> lets the VF to
+            communicate with other VFs on this host even if the PF link state is down,
+            <literal>no</literal> causes the hardware to drop any packets sent by the VF. When unset,
+            the kernel's default will be used.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term><varname>MACAddress=</varname></term>
+          <listitem>
+            <para>Specifies the MAC address for the virtual function.</para>
+          </listitem>
+        </varlistentry>
+      </variablelist>
+  </refsect1>
+
   <refsect1>
     <title>[Network] Section Options</title>
 
-      <para>The <literal>[Network]</literal> section accepts the following keys:</para>
+      <para>The [Network] section accepts the following keys:</para>
 
       <variablelist class='network-directives'>
         <varlistentry>
             specified through DHCP is not used for name resolution.
             See option <option>UseDomains=</option> below.</para>
 
-            <para>See the <literal>[DHCPv4]</literal> or <literal>[DHCPv6]</literal> section below for
-            further configuration options for the DHCP client support.</para>
+            <para>See the [DHCPv4] or [DHCPv6] sections below for further configuration options for the DHCP
+            client support.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>DHCPServer=</varname></term>
           <listitem>
             <para>Takes a boolean. If set to <literal>yes</literal>, DHCPv4 server will be started. Defaults
-            to <literal>no</literal>. Further settings for the DHCP
-            server may be set in the <literal>[DHCPServer]</literal>
+            to <literal>no</literal>. Further settings for the DHCP server may be set in the [DHCPServer]
             section described below.</para>
           </listitem>
         </varlistentry>
             </para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>IPv6LinkLocalAddressGenerationMode=</varname></term>
+          <listitem>
+            <para>Specifies how IPv6 link local address is generated. Takes one of <literal>eui64</literal>,
+            <literal>none</literal>, <literal>stable-privacy</literal> and <literal>random</literal>.
+            When unset, the kernel's default will be used. Note that if <varname>LinkLocalAdressing=</varname>
+            not configured as <literal>ipv6</literal> then <varname>IPv6LinkLocalAddressGenerationMode=</varname>
+            is ignored.</para>
+          </listitem>
+        </varlistentry>
         <varlistentry>
           <term><varname>IPv4LLRoute=</varname></term>
           <listitem>
         <varlistentry>
           <term><varname>DNSSEC=</varname></term>
           <listitem>
-            <para>Takes a boolean. or
-            <literal>allow-downgrade</literal>. When true, enables
-            <ulink
-            url="https://tools.ietf.org/html/rfc4033">DNSSEC</ulink>
+            <para>Takes a boolean or <literal>allow-downgrade</literal>. When true, enables
+            <ulink url="https://tools.ietf.org/html/rfc4033">DNSSEC</ulink>
             DNS validation support on the link. When set to
             <literal>allow-downgrade</literal>, compatibility with
             non-DNSSEC capable networks is increased, by automatically
           forwarding is enabled, and to enable it otherwise. Cannot be enabled on bond devices and when link
           local addressing is disabled.</para>
 
-          <para>Further settings for the IPv6 RA support may be configured in the
-          <literal>[IPv6AcceptRA]</literal> section, see below.</para>
+          <para>Further settings for the IPv6 RA support may be configured in the [IPv6AcceptRA] section, see
+          below.</para>
 
           <para>Also see <ulink
           url="https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt">ip-sysctl.txt</ulink> in the kernel
           <term><varname>IPv4ProxyARP=</varname></term>
           <listitem><para>Takes a boolean. Configures proxy ARP for IPv4. Proxy ARP is the technique in which one host,
           usually a router, answers ARP requests intended for another machine. By "faking" its identity,
-          the router accepts responsibility for routing packets to the "real" destination. (see <ulink
+          the router accepts responsibility for routing packets to the "real" destination. See <ulink
           url="https://tools.ietf.org/html/rfc1027">RFC 1027</ulink>.
           When unset, the kernel's default will be used.
         </para></listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>IPv6PrefixDelegation=</varname></term>
-          <listitem><para>Whether to enable or disable Router Advertisement sending on a link.
-          Allowed values are <literal>static</literal> which distributes prefixes as defined in
-          the <literal>[IPv6PrefixDelegation]</literal> and any <literal>[IPv6Prefix]</literal>
-          sections, <literal>dhcpv6</literal> which requests prefixes using a DHCPv6 client
-          configured for another link and any values configured in the
-          <literal>[IPv6PrefixDelegation]</literal> section while ignoring all static prefix
-          configuration sections, <literal>yes</literal> which uses both static configuration
-          and DHCPv6, and <literal>false</literal> which turns off IPv6 prefix delegation
-          altogether. Defaults to <literal>false</literal>. See the
-          <literal>[IPv6PrefixDelegation]</literal> and the <literal>[IPv6Prefix]</literal>
-          sections for more configuration options.
-          </para></listitem>
+          <listitem><para>Whether to enable or disable Router Advertisement sending on a link.  Allowed
+          values are <literal>static</literal> which distributes prefixes as defined in the
+          [IPv6PrefixDelegation] and any [IPv6Prefix] sections, <literal>dhcpv6</literal> which requests
+          prefixes using a DHCPv6 client configured for another link and any values configured in the
+          [IPv6PrefixDelegation] section while ignoring all static prefix configuration sections,
+          <literal>yes</literal> which uses both static configuration and DHCPv6, and
+          <literal>false</literal> which turns off IPv6 prefix delegation altogether. Defaults to
+          <literal>false</literal>. See the [IPv6PrefixDelegation] and the [IPv6Prefix] sections for more
+          configuration options.</para></listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>IPv6PDSubnetId=</varname></term>
   <refsect1>
     <title>[Address] Section Options</title>
 
-      <para>An <literal>[Address]</literal> section accepts the
-      following keys. Specify several <literal>[Address]</literal>
+      <para>An [Address] section accepts the following keys. Specify several [Address]
       sections to configure several addresses.</para>
 
       <variablelist class='network-directives'>
         <varlistentry>
           <term><varname>Address=</varname></term>
           <listitem>
-            <para>As in the <literal>[Network]</literal> section. This key is mandatory. Each
-            <literal>[Address]</literal> section can contain one <varname>Address=</varname> setting.</para>
+            <para>As in the [Network] section. This key is mandatory. Each [Address] section can contain one
+            <varname>Address=</varname> setting.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>Scope=</varname></term>
           <listitem>
             <para>The scope of the address, which can be <literal>global</literal>,
-            <literal>link</literal> or <literal>host</literal> or an unsigned integer ranges 0 to 255.
+            <literal>link</literal> or <literal>host</literal> or an unsigned integer in the range 0—255.
             Defaults to <literal>global</literal>.</para>
           </listitem>
         </varlistentry>
 
   <refsect1>
     <title>[Neighbor] Section Options</title>
-      <para>A <literal>[Neighbor]</literal> section accepts the
-      following keys. The neighbor section adds a permanent, static
-      entry to the neighbor table (IPv6) or ARP table (IPv4) for
-      the given hardware address on the links matched for the network.
-      Specify several <literal>[Neighbor]</literal> sections to configure
-      several static neighbors.</para>
+      <para>A [Neighbor] section accepts the following keys. The neighbor section adds a permanent, static
+      entry to the neighbor table (IPv6) or ARP table (IPv4) for the given hardware address on the links
+      matched for the network. Specify several [Neighbor] sections to configure several static neighbors.
+      </para>
 
       <variablelist class='network-directives'>
         <varlistentry>
     <refsect1>
     <title>[IPv6AddressLabel] Section Options</title>
 
-      <para>An <literal>[IPv6AddressLabel]</literal> section accepts the
-      following keys. Specify several <literal>[IPv6AddressLabel]</literal>
-      sections to configure several address labels. IPv6 address labels are
-      used for address selection. See <ulink url="https://tools.ietf.org/html/rfc3484">RFC 3484</ulink>.
-      Precedence is managed by userspace, and only the label itself is stored in the kernel</para>
+      <para>An [IPv6AddressLabel] section accepts the following keys. Specify several [IPv6AddressLabel]
+      sections to configure several address labels. IPv6 address labels are used for address selection. See
+      <ulink url="https://tools.ietf.org/html/rfc3484">RFC 3484</ulink>. Precedence is managed by userspace,
+      and only the label itself is stored in the kernel</para>
 
       <variablelist class='network-directives'>
         <varlistentry>
           <term><varname>Label=</varname></term>
           <listitem>
-            <para> The label for the prefix (an unsigned integer) ranges 0 to 4294967294.
-            0xffffffff is reserved. This key is mandatory.</para>
+            <para>The label for the prefix, an unsigned integer in the range 0–4294967294.
+            0xffffffff is reserved. This setting is mandatory.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
  <refsect1>
     <title>[RoutingPolicyRule] Section Options</title>
 
-      <para>An <literal>[RoutingPolicyRule]</literal> section accepts the
-      following keys. Specify several <literal>[RoutingPolicyRule]</literal>
+      <para>An [RoutingPolicyRule] section accepts the following keys. Specify several [RoutingPolicyRule]
       sections to configure several rules.</para>
 
       <variablelist class='network-directives'>
         <varlistentry>
           <term><varname>TypeOfService=</varname></term>
           <listitem>
-            <para>Specifies the type of service to match a number between 0 to 255.</para>
+            <para>Takes a number between 0 and 255 that specifies the type of service to match.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
 
     <refsect1>
       <title>[NextHop] Section Options</title>
-      <para>The <literal>[NextHop]</literal> section accepts the
-      following keys. Specify several <literal>[NextHop]</literal>
-      sections to configure several nexthop. Nexthop is used to manipulate entries in the kernel's nexthop
-      tables.</para>
+      <para>The [NextHop] section is used to manipulate entries in the kernel's "nexthop" tables.  The
+      [NextHop] section accepts the following keys. Specify several [NextHop] sections to configure several
+      hops.</para>
 
       <variablelist class='network-directives'>
         <varlistentry>
           <term><varname>Gateway=</varname></term>
           <listitem>
-            <para>As in the <literal>[Network]</literal> section. This is mandatory.</para>
+            <para>As in the [Network] section. This is mandatory.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
 
   <refsect1>
     <title>[Route] Section Options</title>
-      <para>The <literal>[Route]</literal> section accepts the
-      following keys. Specify several <literal>[Route]</literal>
-      sections to configure several routes.</para>
+      <para>The [Route] section accepts the following keys. Specify several [Route] sections to configure
+      several routes.</para>
 
       <variablelist class='network-directives'>
         <varlistentry>
           <term><varname>IPv6Preference=</varname></term>
           <listitem>
             <para>Specifies the route preference as defined in <ulink
-            url="https://tools.ietf.org/html/rfc4191">RFC4191</ulink> for Router Discovery messages.
-            Which can be one of <literal>low</literal> the route has a lowest priority,
-            <literal>medium</literal> the route has a default priority or
-            <literal>high</literal> the route has a highest priority.</para>
+            url="https://tools.ietf.org/html/rfc4191">RFC 4191</ulink> for Router Discovery messages.  Which
+            can be one of <literal>low</literal> the route has a lowest priority, <literal>medium</literal>
+            the route has a default priority or <literal>high</literal> the route has a highest priority.
+            </para>
           </listitem>
         </varlistentry>
         <varlistentry>
 
   <refsect1>
     <title>[DHCPv4] Section Options</title>
-      <para>The <literal>[DHCPv4]</literal> section configures the
-      DHCPv4 client, if it is enabled with the
+      <para>The [DHCPv4] section configures the DHCPv4 client, if it is enabled with the
       <varname>DHCP=</varname> setting described above:</para>
 
       <variablelist class='network-directives'>
             <para>The table identifier for DHCP routes (a number between 1 and 4294967295, or 0 to unset).
             The table can be retrieved using <command>ip route show table <replaceable>num</replaceable></command>.
             </para>
-            <para>When used in combination with <varname>VRF=</varname> the
-            VRF's routing table is used unless this parameter is specified.
+            <para>When used in combination with <varname>VRF=</varname>, the
+            VRF's routing table is used when this parameter is not specified.
             </para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>SendDecline=</varname></term>
           <listitem>
-            <para>A boolean. When <literal>true</literal>, DHCPv4 clients receives IP address from DHCP server.
-            After new IP is received, DHCPv4 performs IPv4 Duplicate Address Detection. If duplicate use of IP is detected
-            the DHCPv4 client rejects the IP by sending a DHCPDECLINE packet DHCP clients try to obtain an IP address again.
-            See <ulink url="https://tools.ietf.org/html/rfc5227">RFC 5224</ulink>.
-            Defaults to <literal>unset</literal>.</para>
+            <para>A boolean. When <literal>true</literal>, the DHCPv4 client receives the IP address from the
+            DHCP server.  After a new IP is received, the DHCPv4 client performs IPv4 Duplicate Address
+            Detection. If duplicate use is detected, the DHCPv4 client rejects the IP by sending a
+            DHCPDECLINE packet and tries to obtain an IP address again. See <ulink
+            url="https://tools.ietf.org/html/rfc5227">RFC 5224</ulink>. Defaults to
+            <literal>unset</literal>.</para>
           </listitem>
         </varlistentry>
 
         <varlistentry>
-        <term><varname>BlackList=</varname></term>
+        <term><varname>DenyList=</varname></term>
         <listitem>
-          <para>A whitespace-separated list of IPv4 addresses. DHCP offers from servers in the list are rejected.</para>
+          <para>A whitespace-separated list of IPv4 addresses. DHCP offers from servers in the list are rejected. Note that
+          if <varname>AllowList=</varname> is configured then <varname>DenyList=</varname> is ignored.</para>
+        </listitem>
+        </varlistentry>
+
+        <varlistentry>
+        <term><varname>AllowList=</varname></term>
+        <listitem>
+          <para>A whitespace-separated list of IPv4 addresses. DHCP offers from servers in the list are accepted.</para>
         </listitem>
         </varlistentry>
 
 
   <refsect1>
     <title>[DHCPv6] Section Options</title>
-      <para>The <literal>[DHCPv6]</literal> section configures the DHCPv6 client, if it is enabled with the
+      <para>The [DHCPv6] section configures the DHCPv6 client, if it is enabled with the
       <varname>DHCP=</varname> setting described above, or invoked by the IPv6 Router Advertisement:</para>
 
       <variablelist class='network-directives'>
           <term><varname>UseDNS=</varname></term>
           <term><varname>UseNTP=</varname></term>
           <listitem>
-            <para>As in the <literal>[DHCPv4]</literal> section.</para>
+            <para>As in the [DHCPv4] section.</para>
           </listitem>
         </varlistentry>
 
             <para>Takes a boolean. The DHCPv6 client can obtain configuration parameters from a DHCPv6 server through
             a rapid two-message exchange (solicit and reply). When the rapid commit option is enabled by both
             the DHCPv6 client and the DHCPv6 server, the two-message exchange is used, rather than the default
-            four-method exchange (solicit, advertise, request, and reply). The two-message exchange provides
+            four-message exchange (solicit, advertise, request, and reply). The two-message exchange provides
             faster client configuration and is beneficial in environments in which networks are under a heavy load.
             See <ulink url="https://tools.ietf.org/html/rfc3315#section-17.2.1">RFC 3315</ulink> for details.
             Defaults to true.</para>
         <varlistentry>
           <term><varname>SendVendorOption=</varname></term>
           <listitem>
-            <para>Send an arbitrary vendor option in the DHCPv6 request. Takes an enterprise identifier, DHCP option number,
-            data type, and data separated with a colon
-            (<literal><replaceable>enterprise identifier</replaceable>:<replaceable>option</replaceable>:<replaceable>type</replaceable>:
-            <replaceable>value</replaceable></literal>). Enterprise identifier is an unsigned integer ranges 1..4294967294.
-            The option number must be an integer in the range 1..254. Data type takes one of <literal>uint8</literal>,
-            <literal>uint16</literal>, <literal>uint32</literal>, <literal>ipv4address</literal>, <literal>ipv6address</literal>, or
-            <literal>string</literal>. Special characters in the data string may be escaped using
-            <ulink url="https://en.wikipedia.org/wiki/Escape_sequences_in_C#Table_of_escape_sequences">C-style
+            <para>Send an arbitrary vendor option in the DHCPv6 request. Takes an enterprise identifier, DHCP
+            option number, data type, and data separated with a colon (<literal><replaceable>enterprise
+            identifier</replaceable>:<replaceable>option</replaceable>:<replaceable>type</replaceable>:
+            <replaceable>value</replaceable></literal>). Enterprise identifier is an unsigned integer in the
+            range 1–4294967294. The option number must be an integer in the range 1–254. Data type takes one
+            of <literal>uint8</literal>, <literal>uint16</literal>, <literal>uint32</literal>,
+            <literal>ipv4address</literal>, <literal>ipv6address</literal>, or
+            <literal>string</literal>. Special characters in the data string may be escaped using <ulink
+            url="https://en.wikipedia.org/wiki/Escape_sequences_in_C#Table_of_escape_sequences">C-style
             escapes</ulink>. This setting can be specified multiple times. If an empty string is specified,
             then all options specified earlier are cleared. Defaults to unset.</para>
           </listitem>
         <varlistentry>
           <term><varname>PrefixDelegationHint=</varname></term>
           <listitem>
-            <para>Takes an IPv6 address with prefix length as <varname>Address=</varname> in
-            the "[Network]" section. Specifies the DHCPv6 client for the requesting router to include
-            a prefix-hint in the DHCPv6 solicitation. Prefix ranges 1..128. Defaults to unset.</para>
+            <para>Takes an IPv6 address with prefix length in the same format as the
+            <varname>Address=</varname> in the [Network] section. The DHCPv6 client will include a prefix
+            hint in the DHCPv6 solicitation sent to the server. The prefix length must be in the range
+            1–128. Defaults to unset.</para>
           </listitem>
         </varlistentry>
 
         <varlistentry>
           <term><varname>WithoutRA=</varname></term>
           <listitem>
-            <para>When true, DHCPv6 client starts without router advertisements's managed or other address configuration flag.
-            Defaults to false.</para>
+            <para>Allows DHCPv6 client to start without router advertisements's managed or other address
+            configuration flag. Takes one of <literal>solicit</literal> or
+            <literal>information-request</literal>. Defaults to unset.</para>
           </listitem>
         </varlistentry>
 
         <varlistentry>
           <term><varname>SendOption=</varname></term>
           <listitem>
-            <para>As in the <literal>[DHCPv4]</literal> section, however because DHCPv6 uses 16-bit fields to store
+            <para>As in the [DHCPv4] section, however because DHCPv6 uses 16-bit fields to store
             option numbers, the option number is an integer in the range 1..65536.</para>
           </listitem>
         </varlistentry>
 
   <refsect1>
     <title>[IPv6AcceptRA] Section Options</title>
-      <para>The <literal>[IPv6AcceptRA]</literal> section configures the IPv6 Router Advertisement
-      (RA) client, if it is enabled with the <varname>IPv6AcceptRA=</varname> setting described
-      above:</para>
+      <para>The [IPv6AcceptRA] section configures the IPv6 Router Advertisement (RA) client, if it is enabled
+      with the <varname>IPv6AcceptRA=</varname> setting described above:</para>
 
       <variablelist class='network-directives'>
         <varlistentry>
         </varlistentry>
 
         <varlistentry>
-          <term><varname>BlackList=</varname></term>
+          <term><varname>DenyList=</varname></term>
           <listitem>
             <para>A whitespace-separated list of IPv6 prefixes. IPv6 prefixes supplied via router advertisements in the list are ignored.</para>
           </listitem>
 
   <refsect1>
     <title>[DHCPServer] Section Options</title>
-    <para>The <literal>[DHCPServer]</literal> section contains
-    settings for the DHCP server, if enabled via the
+    <para>The [DHCPServer] section contains settings for the DHCP server, if enabled via the
     <varname>DHCPServer=</varname> option described above:</para>
 
     <variablelist class='network-directives'>
 
   <refsect1>
     <title>[IPv6PrefixDelegation] Section Options</title>
-    <para>The <literal>[IPv6PrefixDelegation]</literal> section contains
-    settings for sending IPv6 Router Advertisements and whether to act as
-    a router, if enabled via the <varname>IPv6PrefixDelegation=</varname>
-    option described above. IPv6 network prefixes are defined with one or
-    more <literal>[IPv6Prefix]</literal> sections.</para>
+    <para>The [IPv6PrefixDelegation] section contains settings for sending IPv6 Router Advertisements and
+    whether to act as a router, if enabled via the <varname>IPv6PrefixDelegation=</varname> option described
+    above. IPv6 network prefixes are defined with one or more [IPv6Prefix] sections.</para>
 
     <variablelist class='network-directives'>
 
         <term><varname>EmitDNS=</varname></term>
         <term><varname>DNS=</varname></term>
 
-        <listitem><para><varname>DNS=</varname> specifies a list of recursive DNS server IPv6 addresses
-        that are distributed via Router Advertisement messages when <varname>EmitDNS=</varname> is
-        true. <varname>DNS=</varname> also takes special value <literal>_link_local</literal>; in that
-        case the IPv6 link local address is distributed. If <varname>DNS=</varname> is empty, DNS
-        servers are read from the <literal>[Network]</literal> section. If the
-        <literal>[Network]</literal> section does not contain any DNS servers either, DNS servers from
-        the uplink with the highest priority default route are used. When <varname>EmitDNS=</varname>
-        is false, no DNS server information is sent in Router Advertisement messages.
-        <varname>EmitDNS=</varname> defaults to true.
-        </para></listitem>
+        <listitem><para><varname>DNS=</varname> specifies a list of recursive DNS server IPv6 addresses that
+        are distributed via Router Advertisement messages when <varname>EmitDNS=</varname> is
+        true. <varname>DNS=</varname> also takes special value <literal>_link_local</literal>; in that case
+        the IPv6 link local address is distributed. If <varname>DNS=</varname> is empty, DNS servers are read
+        from the [Network] section. If the [Network] section does not contain any DNS servers either, DNS
+        servers from the uplink with the highest priority default route are used. When
+        <varname>EmitDNS=</varname> is false, no DNS server information is sent in Router Advertisement
+        messages. <varname>EmitDNS=</varname> defaults to true.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>EmitDomains=</varname></term>
         <term><varname>Domains=</varname></term>
 
-        <listitem><para>A list of DNS search domains distributed via Router
-        Advertisement messages when <varname>EmitDomains=</varname> is true. If
-        <varname>Domains=</varname> is empty, DNS search domains are read from the
-        <literal>[Network]</literal> section. If the <literal>[Network]</literal>
-        section does not contain any DNS search domains either, DNS search
-        domains from the uplink with the highest priority default route are
-        used. When <varname>EmitDomains=</varname> is false, no DNS search domain
-        information is sent in Router Advertisement messages.
-        <varname>EmitDomains=</varname> defaults to true.
-        </para></listitem>
+        <listitem><para>A list of DNS search domains distributed via Router Advertisement messages when
+        <varname>EmitDomains=</varname> is true. If <varname>Domains=</varname> is empty, DNS search domains
+        are read from the [Network] section. If the [Network] section does not contain any DNS search domains
+        either, DNS search domains from the uplink with the highest priority default route are used. When
+        <varname>EmitDomains=</varname> is false, no DNS search domain information is sent in Router
+        Advertisement messages. <varname>EmitDomains=</varname> defaults to true.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
     <refsect1>
     <title>[IPv6Prefix] Section Options</title>
-    <para>One or more <literal>[IPv6Prefix]</literal> sections contain the IPv6
-    prefixes that are announced via Router Advertisements. See
-    <ulink url="https://tools.ietf.org/html/rfc4861">RFC 4861</ulink>
-    for further details.</para>
+    <para>One or more [IPv6Prefix] sections contain the IPv6 prefixes that are announced via Router
+    Advertisements. See <ulink url="https://tools.ietf.org/html/rfc4861">RFC 4861</ulink> for further
+    details.</para>
 
     <variablelist class='network-directives'>
 
       <varlistentry>
         <term><varname>Prefix=</varname></term>
 
-        <listitem><para>The IPv6 prefix that is to be distributed to hosts.
-        Similarly to configuring static IPv6 addresses, the setting is
-        configured as an IPv6 prefix and its prefix length, separated by a
-        <literal>/</literal> character. Use multiple
-        <literal>[IPv6Prefix]</literal> sections to configure multiple IPv6
-        prefixes since prefix lifetimes, address autoconfiguration and onlink
-        status may differ from one prefix to another.</para></listitem>
+        <listitem><para>The IPv6 prefix that is to be distributed to hosts.  Similarly to configuring static
+        IPv6 addresses, the setting is configured as an IPv6 prefix and its prefix length, separated by a
+        <literal>/</literal> character. Use multiple [IPv6Prefix] sections to configure multiple IPv6
+        prefixes since prefix lifetimes, address autoconfiguration and onlink status may differ from one
+        prefix to another.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
     <refsect1>
     <title>[IPv6RoutePrefix] Section Options</title>
-    <para>One or more <literal>[IPv6RoutePrefix]</literal> sections contain the IPv6
+    <para>One or more [IPv6RoutePrefix] sections contain the IPv6
     prefix routes that are announced via Router Advertisements. See
     <ulink url="https://tools.ietf.org/html/rfc4191">RFC 4191</ulink>
     for further details.</para>
       <varlistentry>
         <term><varname>Route=</varname></term>
 
-        <listitem><para>The IPv6 route that is to be distributed to hosts.
-        Similarly to configuring static IPv6 routes, the setting is
-        configured as an IPv6 prefix routes and its prefix route length,
-        separated by a<literal>/</literal> character. Use multiple
-        <literal>[IPv6PrefixRoutes]</literal> sections to configure multiple IPv6
-        prefix routes.</para></listitem>
+        <listitem><para>The IPv6 route that is to be distributed to hosts.  Similarly to configuring static
+        IPv6 routes, the setting is configured as an IPv6 prefix routes and its prefix route length,
+        separated by a <literal>/</literal> character. Use multiple [IPv6PrefixRoutes] sections to configure
+        multiple IPv6 prefix routes.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
     <refsect1>
     <title>[Bridge] Section Options</title>
-      <para>The <literal>[Bridge]</literal> section accepts the
-      following keys.</para>
+      <para>The [Bridge] section accepts the following keys:</para>
       <variablelist class='network-directives'>
         <varlistentry>
           <term><varname>UnicastFlood=</varname></term>
         <varlistentry>
           <term><varname>HairPin=</varname></term>
           <listitem>
-            <para>Takes a boolean. Configures whether traffic may be sent back
-            out of the port on which it was received. When this flag is false, and the bridge
-            will not forward traffic back out of the receiving port.
-            When unset, the kernel's default will be used.</para>
+            <para>Takes a boolean. Configures whether traffic may be sent back out of the port on which it
+            was received. When this flag is false, then the bridge will not forward traffic back out of the
+            receiving port. When unset, the kernel's default will be used.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
   </refsect1>
   <refsect1>
     <title>[BridgeFDB] Section Options</title>
-      <para>The <literal>[BridgeFDB]</literal> section manages the
-      forwarding database table of a port and accepts the following
-      keys. Specify several <literal>[BridgeFDB]</literal> sections to
-      configure several static MAC table entries.</para>
+      <para>The [BridgeFDB] section manages the forwarding database table of a port and accepts the following
+      keys. Specify several [BridgeFDB] sections to configure several static MAC table entries.</para>
 
       <variablelist class='network-directives'>
         <varlistentry>
           <term><varname>MACAddress=</varname></term>
           <listitem>
-            <para>As in the <literal>[Network]</literal> section. This
-            key is mandatory.</para>
+            <para>As in the [Network] section. This key is mandatory.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
 
   <refsect1>
     <title>[LLDP] Section Options</title>
-      <para>The <literal>[LLDP]</literal> section manages the Link Layer Discovery Protocol (LLDP) and accepts the
-      following keys.</para>
+      <para>The [LLDP] section manages the Link Layer Discovery Protocol (LLDP) and accepts the following
+      keys.</para>
       <variablelist class='network-directives'>
         <varlistentry>
           <term><varname>MUDURL=</varname></term>
 
   <refsect1>
     <title>[CAN] Section Options</title>
-      <para>The <literal>[CAN]</literal> section manages the Controller Area Network (CAN bus) and accepts the
-      following keys.</para>
+      <para>The [CAN] section manages the Controller Area Network (CAN bus) and accepts the
+      following keys:</para>
       <variablelist class='network-directives'>
         <varlistentry>
           <term><varname>BitRate=</varname></term>
 
   <refsect1>
     <title>[QDisc] Section Options</title>
-    <para>The <literal>[QDisc]</literal> section manages the traffic control queueing discipline (qdisc).</para>
+    <para>The [QDisc] section manages the traffic control queueing discipline (qdisc).</para>
 
     <variablelist class='network-directives'>
       <varlistentry>
 
   <refsect1>
     <title>[NetworkEmulator] Section Options</title>
-    <para>The <literal>[NetworkEmulator]</literal> section manages the queueing discipline (qdisc) of
-    the network emulator. It can be used to configure the kernel packet scheduler and simulate packet
-    delay and loss for UDP or TCP applications, or limit the bandwidth usage of a particular service to
-    simulate internet connections.</para>
+    <para>The [NetworkEmulator] section manages the queueing discipline (qdisc) of the network emulator. It
+    can be used to configure the kernel packet scheduler and simulate packet delay and loss for UDP or TCP
+    applications, or limit the bandwidth usage of a particular service to simulate internet connections.
+    </para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
         <term><varname>PacketLimit=</varname></term>
         <listitem>
           <para>Specifies the maximum number of packets the qdisc may hold queued at a time.
-          An unsigned integer ranges 0 to 4294967294. Defaults to 1000.</para>
+          An unsigned integer in the range 0–4294967294. Defaults to 1000.</para>
         </listitem>
       </varlistentry>
 
 
   <refsect1>
     <title>[TokenBucketFilter] Section Options</title>
-    <para>The <literal>[TokenBucketFilter]</literal> section manages the queueing discipline (qdisc) of
-    token bucket filter (tbf).</para>
+    <para>The [TokenBucketFilter] section manages the queueing discipline (qdisc) of token bucket filter
+    (tbf).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
       </varlistentry>
 
       <varlistentry>
-        <term><varname>LimitSize=</varname></term>
+        <term><varname>LimitBytes=</varname></term>
         <listitem>
           <para>Takes the number of bytes that can be queued waiting for tokens to become available.
           When the size is suffixed with K, M, or G, it is parsed as Kilobytes, Megabytes, or Gigabytes,
-          respectively, to the base of 1000. Defaults to unset.</para>
+          respectively, to the base of 1024. Defaults to unset.</para>
         </listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><varname>Burst=</varname></term>
+        <term><varname>BurstBytes=</varname></term>
         <listitem>
           <para>Specifies the size of the bucket. This is the maximum amount of bytes that tokens
           can be available for instantaneous transfer. When the size is suffixed with K, M, or G, it is
-          parsed as Kilobytes, Megabytes, or Gigabytes, respectively, to the base of 1000. Defaults to
+          parsed as Kilobytes, Megabytes, or Gigabytes, respectively, to the base of 1024. Defaults to
           unset.</para>
         </listitem>
       </varlistentry>
         <listitem>
           <para>The Minimum Packet Unit (MPU) determines the minimal token usage (specified in bytes)
           for a packet. When suffixed with K, M, or G, the specified size is parsed as Kilobytes,
-          Megabytes, or Gigabytes, respectively, to the base of 1000. Defaults to zero.</para>
+          Megabytes, or Gigabytes, respectively, to the base of 1024. Defaults to zero.</para>
         </listitem>
       </varlistentry>
 
         <term><varname>MTUBytes=</varname></term>
         <listitem>
           <para>Specifies the size of the peakrate bucket. When suffixed with K, M, or G, the specified
-          size is parsed as Kilobytes, Megabytes, or Gigabytes, respectively, to the base of 1000.
+          size is parsed as Kilobytes, Megabytes, or Gigabytes, respectively, to the base of 1024.
           Defaults to unset.</para>
         </listitem>
       </varlistentry>
 
   <refsect1>
     <title>[PIE] Section Options</title>
-    <para>The <literal>[PIE]</literal> section manages the queueing discipline
-    (qdisc) of Proportional Integral controller-Enhanced (PIE).</para>
+    <para>The [PIE] section manages the queueing discipline (qdisc) of Proportional Integral
+    controller-Enhanced (PIE).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
         <term><varname>PacketLimit=</varname></term>
         <listitem>
           <para>Specifies the hard limit on the queue size in number of packets. When this limit is reached, incoming packets are
-          dropped. An unsigned integer ranges 1 to 4294967294. Defaults to unset and kernel's default is used.</para>
+          dropped. An unsigned integer in the range 1–4294967294. Defaults to unset and kernel's default is used.</para>
         </listitem>
       </varlistentry>
     </variablelist>
 
   <refsect1>
     <title>[StochasticFairBlue] Section Options</title>
-    <para>The <literal>[StochasticFairBlue]</literal> section manages the queueing discipline
-    (qdisc) of stochastic fair blue (sfb).</para>
+    <para>The [StochasticFairBlue] section manages the queueing discipline (qdisc) of stochastic fair blue
+    (sfb).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
       <varlistentry>
         <term><varname>PacketLimit=</varname></term>
         <listitem>
-          <para>Specifies the hard limit on the queue size in number of packets. When this limit is reached, incoming packets are
-          dropped. An unsigned integer ranges 0 to 4294967294. Defaults to unset and kernel's default is used.</para>
+          <para>Specifies the hard limit on the queue size in number of packets. When this limit is reached,
+          incoming packets are dropped. An unsigned integer in the range 0–4294967294. Defaults to unset and
+          kernel's default is used.</para>
         </listitem>
       </varlistentry>
     </variablelist>
 
   <refsect1>
     <title>[StochasticFairnessQueueing] Section Options</title>
-    <para>The <literal>[StochasticFairnessQueueing]</literal> section manages the queueing discipline
-    (qdisc) of stochastic fairness queueing (sfq).</para>
+    <para>The [StochasticFairnessQueueing] section manages the queueing discipline (qdisc) of stochastic
+    fairness queueing (sfq).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
 
   <refsect1>
     <title>[BFIFO] Section Options</title>
-    <para>The <literal>[BFIFO]</literal> section manages the queueing discipline (qdisc) of
-    Byte limited Packet First In First Out (bfifo).</para>
+    <para>The [BFIFO] section manages the queueing discipline (qdisc) of Byte limited Packet First In First
+    Out (bfifo).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
       <xi:include href="tc.xml" xpointer="qdisc-handle" />
 
       <varlistentry>
-        <term><varname>LimitSize=</varname></term>
+        <term><varname>LimitBytes=</varname></term>
         <listitem>
-          <para>Specifies the hard limit on the FIFO size in bytes. The size limit (a buffer size) to prevent it
-          from overflowing in case it is unable to dequeue packets as quickly as it receives them. When this limit
-          is reached, incoming packets are dropped. When suffixed with K, M, or G, the specified size is parsed as
-          Kilobytes, Megabytes, or Gigabytes, respectively, to the base of 1024. Defaults to unset and kernel's default is used.</para>
+          <para>Specifies the hard limit on the FIFO size in bytes. The size limit (a buffer size) to prevent
+          it from overflowing in case it is unable to dequeue packets as quickly as it receives them. When
+          this limit is reached, incoming packets are dropped. When suffixed with K, M, or G, the specified
+          size is parsed as Kilobytes, Megabytes, or Gigabytes, respectively, to the base of 1024. Defaults
+          to unset and kernel's default is used.</para>
         </listitem>
       </varlistentry>
     </variablelist>
 
   <refsect1>
     <title>[PFIFO] Section Options</title>
-    <para>The <literal>[PFIFO]</literal> section manages the queueing discipline (qdisc) of
-    Packet First In First Out (pfifo).</para>
+    <para>The [PFIFO] section manages the queueing discipline (qdisc) of Packet First In First Out
+    (pfifo).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
       <varlistentry>
         <term><varname>PacketLimit=</varname></term>
         <listitem>
-          <para>Specifies the hard limit on the FIFO size in number of packets. The size limit (a buffer size) to prevent it
-          from overflowing in case it is unable to dequeue packets as quickly as it receives them. When this limit is reached,
-          incoming packets are dropped. An unsigned integer ranges 0 to 4294967294. Defaults to unset and kernel's default is used.</para>
+          <para>Specifies the hard limit on the FIFO size in number of packets. The size limit (a buffer
+          size) to prevent it from overflowing in case it is unable to dequeue packets as quickly as it
+          receives them. When this limit is reached, incoming packets are dropped. An unsigned integer in the
+          range 0–4294967294. Defaults to unset and kernel's default is used.</para>
         </listitem>
       </varlistentry>
     </variablelist>
 
   <refsect1>
     <title>[PFIFOHeadDrop] Section Options</title>
-    <para>The <literal>[PFIFOHeadDrop]</literal> section manages the queueing discipline (qdisc) of
-    Packet First In First Out Head Drop (pfifo_head_drop).</para>
+    <para>The [PFIFOHeadDrop] section manages the queueing discipline (qdisc) of Packet First In First Out
+    Head Drop (pfifo_head_drop).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
       <varlistentry>
         <term><varname>PacketLimit=</varname></term>
         <listitem>
-          <para>As in <literal>[PFIFO]</literal> section.</para></listitem>
+          <para>As in [PFIFO] section.</para></listitem>
       </varlistentry>
     </variablelist>
   </refsect1>
 
   <refsect1>
      <title>[PFIFOFast] Section Options</title>
-     <para>The <literal>[PFIFOFast]</literal> section manages the queueing discipline (qdisc) of
-     Packet First In First Out Fast (pfifo_fast).</para>
+     <para>The [PFIFOFast] section manages the queueing discipline (qdisc) of Packet First In First Out Fast
+     (pfifo_fast).</para>
 
      <variablelist class='network-directives'>
        <xi:include href="tc.xml" xpointer="qdisc-parent" />
 
   <refsect1>
     <title>[CAKE] Section Options</title>
-    <para>The <literal>[CAKE]</literal> section manages the queueing discipline (qdisc) of
-    Common Applications Kept Enhanced (CAKE).</para>
+    <para>The [CAKE] section manages the queueing discipline (qdisc) of Common Applications Kept Enhanced
+    (CAKE).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
       <xi:include href="tc.xml" xpointer="qdisc-handle" />
 
       <varlistentry>
-        <term><varname>Overhead=</varname></term>
+        <term><varname>OverheadBytes=</varname></term>
         <listitem>
-          <para>Specifies that bytes to be addeded to the size of each packet. Bytes may be negative.
-          Takes an integer ranges -64 to 256. Defaults to unset and kernel's default is used.</para>
+          <para>Specifies that bytes to be addeded to the size of each packet. Bytes may be negative. Takes
+          an integer in the range from -64 to 256. Defaults to unset and kernel's default is used.</para>
         </listitem>
       </varlistentry>
 
 
   <refsect1>
     <title>[ControlledDelay] Section Options</title>
-    <para>The <literal>[ControlledDelay]</literal> section manages the queueing discipline (qdisc) of
+    <para>The [ControlledDelay] section manages the queueing discipline (qdisc) of
     controlled delay (CoDel).</para>
 
     <variablelist class='network-directives'>
       <varlistentry>
         <term><varname>PacketLimit=</varname></term>
         <listitem>
-          <para>Specifies the hard limit on the queue size in number of packets. When this limit is reached, incoming packets are
-          dropped. An unsigned integer ranges 0 to 4294967294. Defaults to unset and kernel's default is used.</para>
+          <para>Specifies the hard limit on the queue size in number of packets. When this limit is reached,
+          incoming packets are dropped. An unsigned integer in the range 0–4294967294. Defaults to unset and
+          kernel's default is used.</para>
         </listitem>
       </varlistentry>
 
 
   <refsect1>
     <title>[DeficitRoundRobinScheduler] Section Options</title>
-    <para>The <literal>[DeficitRoundRobinScheduler]</literal> section manages the queueing discipline (qdisc) of
-    Deficit Round Robin Scheduler (DRR).</para>
+    <para>The [DeficitRoundRobinScheduler] section manages the queueing discipline (qdisc) of Deficit Round
+    Robin Scheduler (DRR).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
 
   <refsect1>
     <title>[DeficitRoundRobinSchedulerClass] Section Options</title>
-    <para>The <literal>[DeficitRoundRobinSchedulerClass]</literal> section manages the traffic control class of
-    Deficit Round Robin Scheduler (DRR).</para>
+    <para>The [DeficitRoundRobinSchedulerClass] section manages the traffic control class of Deficit Round
+    Robin Scheduler (DRR).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="tclass-parent" />
       <xi:include href="tc.xml" xpointer="tclass-classid" />
 
       <varlistentry>
-        <term><varname>Quantum=</varname></term>
+        <term><varname>QuantumBytes=</varname></term>
+        <listitem>
+          <para>Specifies the amount of bytes a flow is allowed to dequeue before the scheduler moves
+          to the next class. When suffixed with K, M, or G, the specified size is parsed as Kilobytes,
+          Megabytes, or Gigabytes, respectively, to the base of 1024. Defaults to the MTU of the
+          interface.</para>
+        </listitem>
+      </varlistentry>
+
+    </variablelist>
+  </refsect1>
+
+  <refsect1>
+    <title>[EnhancedTransmissionSelection] Section Options</title>
+    <para>The [EnhancedTransmissionSelection] section manages the queueing discipline (qdisc) of Enhanced
+    Transmission Selection (ETS).</para>
+
+    <variablelist class='network-directives'>
+      <xi:include href="tc.xml" xpointer="qdisc-parent" />
+      <xi:include href="tc.xml" xpointer="qdisc-handle" />
+
+      <varlistentry>
+        <term><varname>Bands=</varname></term>
+        <listitem>
+          <para>Specifies the number of bands. An unsigned integer in the range 1–16. This value has to be at
+          least large enough to cover the strict bands specified through the <varname>StrictBands=</varname>
+          and bandwidth-sharing bands specified in <varname>QuantumBytes=</varname>.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>StrictBands=</varname></term>
         <listitem>
-          <para>Specifies the amount of bytes a flow is allowed to dequeue before the
-          scheduler moves to the next class. An unsigned integer ranges 1 to 4294967294.
-          Defaults to the MTU of the interface.</para>
+          <para>Specifies the number of bands that should be created in strict mode. An unsigned integer in
+          the range 1–16.</para>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>QuantumBytes=</varname></term>
+        <listitem>
+          <para>Specifies the white-space separated list of quantum used in band-sharing bands. When
+          suffixed with K, M, or G, the specified size is parsed as Kilobytes, Megabytes, or Gigabytes,
+          respectively, to the base of 1024. This setting can be specified multiple times. If an empty
+          string is assigned, then the all previous assignments are cleared.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>PriorityMap=</varname></term>
+        <listitem>
+          <para>The priority map maps the priority of a packet to a band. The argument is a white-space
+          separated list of numbers. The first number indicates which band the packets with priority
+          0 should be put to, the second is for priority 1, and so on. There can be up to 16 numbers in
+          the list. If there are fewer, the default band that traffic with one of the unmentioned
+          priorities goes to is the last one. Each band number must be 0..255. This setting can be
+          specified multiple times. If an empty string is assigned, then the all previous assignments
+          are cleared.</para>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
   <refsect1>
     <title>[GenericRandomEarlyDetection] Section Options</title>
-    <para>The <literal>[GenericRandomEarlyDetection]</literal> section manages the queueing discipline
-    (qdisc) of Generic Random Early Detection (GRED).</para>
+    <para>The [GenericRandomEarlyDetection] section manages the queueing discipline (qdisc) of Generic Random
+    Early Detection (GRED).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
 
   <refsect1>
     <title>[FairQueueingControlledDelay] Section Options</title>
-    <para>The <literal>[FairQueueingControlledDelay]</literal> section manages the queueing discipline
-    (qdisc) of fair queuing controlled delay (FQ-CoDel).</para>
+    <para>The [FairQueueingControlledDelay] section manages the queueing discipline (qdisc) of fair queuing
+    controlled delay (FQ-CoDel).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
       </varlistentry>
 
       <varlistentry>
-        <term><varname>MemoryLimit=</varname></term>
+        <term><varname>MemoryLimitBytes=</varname></term>
         <listitem>
           <para>Specifies the limit on the total number of bytes that can be queued in this FQ-CoDel instance.
           When suffixed with K, M, or G, the specified size is parsed as Kilobytes, Megabytes, or Gigabytes,
       </varlistentry>
 
       <varlistentry>
-        <term><varname>Quantum=</varname></term>
+        <term><varname>QuantumBytes=</varname></term>
         <listitem>
-          <para>Specifies the number of bytes used as 'deficit' in the fair queuing algorithmtimespan.
+          <para>Specifies the number of bytes used as the "deficit" in the fair queuing algorithm timespan.
           When suffixed with K, M, or G, the specified size is parsed as Kilobytes, Megabytes, or Gigabytes,
           respectively, to the base of 1024. Defaults to unset and kernel's default is used.</para>
         </listitem>
 
   <refsect1>
     <title>[FairQueueing] Section Options</title>
-    <para>The <literal>[FairQueueing]</literal> section manages the queueing discipline
-    (qdisc) of fair queue traffic policing (FQ).</para>
+    <para>The [FairQueueing] section manages the queueing discipline (qdisc) of fair queue traffic policing
+    (FQ).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
       </varlistentry>
 
       <varlistentry>
-        <term><varname>Quantum=</varname></term>
+        <term><varname>QuantumBytes=</varname></term>
         <listitem>
           <para>Specifies the credit per dequeue RR round, i.e. the amount of bytes a flow is allowed
           to dequeue at once. When suffixed with K, M, or G, the specified size is parsed as Kilobytes,
       </varlistentry>
 
       <varlistentry>
-        <term><varname>InitialQuantum=</varname></term>
+        <term><varname>InitialQuantumBytes=</varname></term>
         <listitem>
           <para>Specifies the initial sending rate credit, i.e. the amount of bytes a new flow is
           allowed to dequeue initially. When suffixed with K, M, or G, the specified size is parsed as
 
   <refsect1>
     <title>[TrivialLinkEqualizer] Section Options</title>
-    <para>The <literal>[TrivialLinkEqualizer]</literal> section manages the queueing discipline (qdisc) of
-    trivial link equalizer (teql).</para>
+    <para>The [TrivialLinkEqualizer] section manages the queueing discipline (qdisc) of trivial link
+    equalizer (teql).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
 
   <refsect1>
     <title>[HierarchyTokenBucket] Section Options</title>
-    <para>The <literal>[HierarchyTokenBucket]</literal> section manages the queueing discipline (qdisc) of
-    hierarchy token bucket (htb).</para>
+    <para>The [HierarchyTokenBucket] section manages the queueing discipline (qdisc) of hierarchy token
+    bucket (htb).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
           to the class. Defaults to unset.</para>
         </listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>RateToQuantum=</varname></term>
+        <listitem>
+          <para>Takes an unsigned integer. The DRR quantums are calculated by dividing the value
+          configured in <varname>Rate=</varname> by <varname>RateToQuantum=</varname>.</para>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
   <refsect1>
     <title>[HierarchyTokenBucketClass] Section Options</title>
-    <para>The <literal>[HierarchyTokenBucketClass]</literal> section manages the traffic control class of
-    hierarchy token bucket (htb).</para>
+    <para>The [HierarchyTokenBucketClass] section manages the traffic control class of hierarchy token bucket
+    (htb).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="tclass-parent" />
         <term><varname>Priority=</varname></term>
         <listitem>
           <para>Specifies the priority of the class. In the round-robin process, classes with the lowest
-          priority field are tried for packets first. This setting is mandatory.</para>
+          priority field are tried for packets first.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>QuantumBytes=</varname></term>
+        <listitem>
+          <para>Specifies how many bytes to serve from leaf at once. When suffixed with K, M, or G, the
+          specified size is parsed as Kilobytes, Megabytes, or Gigabytes, respectively, to the base of
+          1024.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>MTUBytes=</varname></term>
+        <listitem>
+          <para>Specifies the maximum packet size we create. When suffixed with K, M, or G, the specified
+          size is parsed as Kilobytes, Megabytes, or Gigabytes, respectively, to the base of 1024.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>OverheadBytes=</varname></term>
+        <listitem>
+          <para>Takes an unsigned integer which specifies per-packet size overhead used in rate
+          computations. When suffixed with K, M, or G, the specified size is parsed as Kilobytes,
+          Megabytes, or Gigabytes, respectively, to the base of 1024.</para>
         </listitem>
       </varlistentry>
 
           is used.</para>
         </listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>BufferBytes=</varname></term>
+        <listitem>
+          <para>Specifies the maximum bytes burst which can be accumulated during idle period. When suffixed
+          with K, M, or G, the specified size is parsed as Kilobytes, Megabytes, or Gigabytes, respectively,
+          to the base of 1024.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>CeilBufferBytes=</varname></term>
+        <listitem>
+          <para>Specifies the maximum bytes burst for ceil which can be accumulated during idle period.
+          When suffixed with K, M, or G, the specified size is parsed as Kilobytes, Megabytes, or Gigabytes,
+          respectively, to the base of 1024.</para>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
   <refsect1>
     <title>[HeavyHitterFilter] Section Options</title>
-    <para>The <literal>[HeavyHitterFilter]</literal> section manages the queueing discipline
-    (qdisc) of Heavy Hitter Filter (hhf).</para>
+    <para>The [HeavyHitterFilter] section manages the queueing discipline (qdisc) of Heavy Hitter Filter
+    (hhf).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
       <varlistentry>
         <term><varname>PacketLimit=</varname></term>
         <listitem>
-          <para>Specifies the hard limit on the queue size in number of packets. When this limit is reached, incoming packets are
-          dropped. An unsigned integer ranges 0 to 4294967294. Defaults to unset and kernel's default is used.</para>
+          <para>Specifies the hard limit on the queue size in number of packets. When this limit is reached,
+          incoming packets are dropped. An unsigned integer in the range 0–4294967294. Defaults to unset and
+          kernel's default is used.</para>
         </listitem>
       </varlistentry>
     </variablelist>
 
   <refsect1>
     <title>[QuickFairQueueing] Section Options</title>
-    <para>The <literal>[QuickFairQueueing]</literal> section manages the queueing discipline
-    (qdisc) of Quick Fair Queueing (QFQ).</para>
+    <para>The [QuickFairQueueing] section manages the queueing discipline (qdisc) of Quick Fair Queueing
+    (QFQ).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="qdisc-parent" />
 
   <refsect1>
     <title>[QuickFairQueueingClass] Section Options</title>
-    <para>The <literal>[QuickFairQueueingClass]</literal> section manages the traffic control class of
-    Quick Fair Queueing (qfq).</para>
+    <para>The [QuickFairQueueingClass] section manages the traffic control class of Quick Fair Queueing
+    (qfq).</para>
 
     <variablelist class='network-directives'>
       <xi:include href="tc.xml" xpointer="tclass-parent" />
       </varlistentry>
 
       <varlistentry>
-        <term><varname>MaxPacketSize=</varname></term>
+        <term><varname>MaxPacketBytes=</varname></term>
         <listitem>
           <para>Specifies the maximum packet size in bytes for the class. When suffixed with K, M, or G, the specified
-          size is parsed as Kilobytes, Megabytes, or Gigabytes, respectively, to the base of 1000. When unset,
+          size is parsed as Kilobytes, Megabytes, or Gigabytes, respectively, to the base of 1024. When unset,
           the kernel default is used.</para>
         </listitem>
       </varlistentry>
 
   <refsect1>
     <title>[BridgeVLAN] Section Options</title>
-      <para>The <literal>[BridgeVLAN]</literal> section manages the VLAN ID configuration of a bridge port and accepts
-      the following keys. Specify several <literal>[BridgeVLAN]</literal> sections to configure several VLAN entries.
-      The <varname>VLANFiltering=</varname> option has to be enabled, see <literal>[Bridge]</literal> section in
+      <para>The [BridgeVLAN] section manages the VLAN ID configuration of a bridge port and accepts the
+      following keys. Specify several [BridgeVLAN] sections to configure several VLAN entries. The
+      <varname>VLANFiltering=</varname> option has to be enabled, see the [Bridge] section in
       <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
 
       <variablelist class='network-directives'>
index 27eae50b5170780d7c2c0845144f5ac383d4cf95..4b37c5dc4400b9cb24b18d927e2f63e299d3a8fc 100644 (file)
@@ -80,7 +80,7 @@
   <refsect1>
     <title>[Exec] Section Options</title>
 
-    <para>Settings files may include an <literal>[Exec]</literal>
+    <para>Settings files may include an [Exec]
     section, which carries various execution parameters:</para>
 
     <variablelist class='nspawn-directives'>
   <refsect1>
     <title>[Files] Section Options</title>
 
-    <para>Settings files may include a <literal>[Files]</literal>
+    <para>Settings files may include a [Files]
     section, which carries various parameters configuring the file
     system of the container:</para>
 
       <varlistentry>
         <term><varname>Inaccessible=</varname></term>
 
-        <listitem><para>Masks the specified file or directly in the container, by over-mounting it with an empty file
+        <listitem><para>Masks the specified file or directory in the container, by over-mounting it with an empty file
         node of the same type with the most restrictive access mode. Takes a file system path as argument. This option
         may be used multiple times to mask multiple files or directories. This option is equivalent to the command line
         switch <option>--inaccessible=</option>, see
   <refsect1>
     <title>[Network] Section Options</title>
 
-    <para>Settings files may include a <literal>[Network]</literal>
+    <para>Settings files may include a [Network]
     section, which carries various parameters configuring the network
     connectivity of the container:</para>
 
index 89c12b598bdacc2b6e2565c72f9c2bc5070706a0..81a37f67898c649bc1d42da5fe6b0460167f28e8 100644 (file)
@@ -33,7 +33,7 @@
 
     <orderedlist>
       <listitem>
-        <para>The package manager prepares system updates by downloading all (RPM or DEB or
+        <para>The package manager prepares system updates by downloading all (.rpm or .deb or
         whatever) packages to update off-line in a special directory
         <filename index="false">/var/lib/system-update</filename> (or
         another directory of the package/upgrade manager's choice).</para>
@@ -85,8 +85,8 @@
       </listitem>
 
       <listitem>
-        <para>The upgrade scripts should exit only after the update is finished. It is expected
-        that the service which performs the upgrade will cause the machine to reboot after it
+        <para>The update scripts should exit only after the update is finished. It is expected
+        that the service which performs the update will cause the machine to reboot after it
         is done. If the <filename>system-update.target</filename> is successfully reached, i.e.
         all update services have run, and the <filename>/system-update</filename> symlink still
         exists, it will be removed and the machine rebooted as a safety measure.</para>
index f6fe3d83883eca518563535f522ed27c3d169503..604bf494ba71a6222a4df753a18e3be622a5ebe5 100644 (file)
@@ -34,9 +34,9 @@
     this unit type. See
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     for the common options of all unit configuration files. The common
-    configuration items are configured in the generic <literal>[Unit]</literal> and
-    <literal>[Install]</literal> sections. The path specific configuration options are
-    configured in the <literal>[Path]</literal> section.</para>
+    configuration items are configured in the generic [Unit] and
+    [Install] sections. The path specific configuration options are
+    configured in the [Path] section.</para>
 
     <para>For each path file, a matching unit file must exist,
     describing the unit to activate when the path changes. By default,
index 6d3568576cd5b90ce30c53c78073b105f3a0331a..3ccb5c49271dfcc516f00521fce03697f4cf2292 100644 (file)
             <listitem><para>Otherwise, access is granted.</para></listitem>
           </itemizedlist>
 
-          <para>In order to implement a whitelisting IP firewall, it is recommended to use a
-          <varname>IPAddressDeny=</varname><constant>any</constant> setting on an upper-level slice unit (such as the
-          root slice <filename>-.slice</filename> or the slice containing all system services
+          <para>In order to implement an allow-listing IP firewall, it is recommended to use a
+          <varname>IPAddressDeny=</varname><constant>any</constant> setting on an upper-level slice unit
+          (such as the root slice <filename>-.slice</filename> or the slice containing all system services
           <filename>system.slice</filename> – see
-          <citerefentry><refentrytitle>systemd.special</refentrytitle><manvolnum>7</manvolnum></citerefentry> for
-          details on these slice units), plus individual per-service <varname>IPAddressAllow=</varname> lines
-          permitting network access to relevant services, and only them.</para>
+          <citerefentry><refentrytitle>systemd.special</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+          for details on these slice units), plus individual per-service <varname>IPAddressAllow=</varname>
+          lines permitting network access to relevant services, and only them.</para>
 
           <para>Note that for socket-activated services, the IP access list configured on the socket unit
           applies to all sockets associated with it directly, but not to any sockets created by the
       </varlistentry>
 
       <varlistentry>
-        <term><varname>IPIngressFilterPath=<replaceable>BPF_FS_PROGRAMM_PATH</replaceable></varname></term>
-        <term><varname>IPEgressFilterPath=<replaceable>BPF_FS_PROGRAMM_PATH</replaceable></varname></term>
+        <term><varname>IPIngressFilterPath=<replaceable>BPF_FS_PROGRAM_PATH</replaceable></varname></term>
+        <term><varname>IPEgressFilterPath=<replaceable>BPF_FS_PROGRAM_PATH</replaceable></varname></term>
 
         <listitem>
           <para>Add custom network traffic filters implemented as BPF programs, applying to all IP packets
           <para>The device node specifier is either a path to a device node in the file system, starting with
           <filename>/dev/</filename>, or a string starting with either <literal>char-</literal> or
           <literal>block-</literal> followed by a device group name, as listed in
-          <filename>/proc/devices</filename>. The latter is useful to whitelist all current and future
+          <filename>/proc/devices</filename>. The latter is useful to allow-list all current and future
           devices belonging to a specific device group at once. The device group is matched according to
           filename globbing rules, you may hence use the <literal>*</literal> and <literal>?</literal>
           wildcards. (Note that such globbing wildcards are not available for device node path
           all pseudo TTYs and all ALSA sound devices, respectively. <literal>char-cpu/*</literal> is a
           specifier matching all CPU related device groups.</para>
 
-          <para>Note that whitelists defined this way should only reference device groups which are
+          <para>Note that allow lists defined this way should only reference device groups which are
           resolvable at the time the unit is started. Any device groups not resolvable then are not added to
-          the device whitelist. In order to work around this limitation, consider extending service units
+          the device allow list. In order to work around this limitation, consider extending service units
           with a pair of <command>After=modprobe@xyz.service</command> and
           <command>Wants=modprobe@xyz.service</command> lines that load the necessary kernel module
           implementing the device group if missing.
index b624ac5f9303990683bf502ee1672dd2e4dcc80d..449b90b48455733f35df7712862adf1c1ae90dcf 100644 (file)
@@ -89,7 +89,7 @@
   <refsect1>
     <title>Options</title>
 
-    <para>Scope files may include a <literal>[Scope]</literal>
+    <para>Scope files may include a [Scope]
     section, which carries information about the scope and the
     units it contains. A number of options that may be used in
     this section are shared with other unit types. These options are
@@ -97,7 +97,7 @@
     <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     and
     <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
-    The options specific to the <literal>[Scope]</literal> section
+    The options specific to the [Scope] section
     of scope units are the following:</para>
 
     <variablelist class='unit-directives'>
index a4a49f39af2ecf6e64d45ae91730bf3015fd2228..4e281ec6d4f80d43151bdce6d91c9d04160b8852 100644 (file)
@@ -35,9 +35,9 @@
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     for the common options of all unit configuration files. The common
     configuration items are configured in the generic
-    <literal>[Unit]</literal> and <literal>[Install]</literal>
+    [Unit] and [Install]
     sections. The service specific configuration options are
-    configured in the <literal>[Service]</literal> section.</para>
+    configured in the [Service] section.</para>
 
     <para>Additional options are listed in
     <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
   <refsect1>
     <title>Options</title>
 
-    <para>Service files must include a <literal>[Service]</literal>
+    <para>Service files must include a [Service]
     section, which carries information about the service and the
     process it supervises. A number of options that may be used in
     this section are shared with other unit types. These options are
     <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     and
     <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
-    The options specific to the <literal>[Service]</literal> section
+    The options specific to the [Service] section
     of service units are the following:</para>
 
     <variablelist class='unit-directives'>
         project='man-pages'><refentrytitle>signal</refentrytitle><manvolnum>7</manvolnum></citerefentry> for
         a list of signal names.</para>
 
-        <para>Note that this setting does not change the the mapping between numeric exit statuses and their
+        <para>Note that this setting does not change the mapping between numeric exit statuses and their
         names, i.e. regardless how this setting is used 0 will still be mapped to <literal>SUCCESS</literal>
         (and thus typically shown as <literal>0/SUCCESS</literal> in tool outputs) and 1 to
         <literal>FAILURE</literal> (and thus typically shown as <literal>1/FAILURE</literal>), and so on. It
         this option will have no effect.</para>
 
         <example>
-          <title>A service with with the <varname>SuccessExitStatus=</varname> setting</title>
+          <title>A service with the <varname>SuccessExitStatus=</varname> setting</title>
 
           <programlisting>SuccessExitStatus=TEMPFAIL 250 SIGUSR1</programlisting>
 
         manager. If set to <constant>kill</constant> and one of the service's processes is killed by the OOM
         killer the kernel is instructed to kill all remaining processes of the service, too. Defaults to the
         setting <varname>DefaultOOMPolicy=</varname> in
-        <citerefentry><refentrytitle>system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry> is
-        set to, except for services where <varname>Delegate=</varname> is turned on, where it defaults to
+        <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+        is set to, except for services where <varname>Delegate=</varname> is turned on, where it defaults to
         <constant>continue</constant>.</para>
 
         <para>Use the <varname>OOMScoreAdjust=</varname> setting to configure whether processes of the unit
@@ -1495,7 +1495,7 @@ ExecStart=/usr/sbin/simple-dbus-service
 WantedBy=multi-user.target</programlisting>
 
       <para>For <emphasis>bus-activatable</emphasis> services, do not
-      include a <literal>[Install]</literal> section in the systemd
+      include a [Install] section in the systemd
       service file, but use the <varname>SystemdService=</varname>
       option in the corresponding DBus service file, for example
       (<filename>/usr/share/dbus-1/system-services/org.example.simple-dbus-service.service</filename>):</para>
index 7157dfa32d390ed3f4dda254f64146b0f4d78f70..5019bf9976a4e442685d76b75d18fcad146b1d6d 100644 (file)
@@ -55,9 +55,9 @@
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     for the common options of all unit configuration
     files. The common configuration items are configured
-    in the generic <literal>[Unit]</literal> and <literal>[Install]</literal> sections. The
+    in the generic [Unit] and [Install] sections. The
     slice specific configuration options are configured in
-    the <literal>[Slice]</literal> section. Currently, only generic resource control settings
+    the [Slice] section. Currently, only generic resource control settings
     as described in
     <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry> are allowed.
     </para>
index 46a2dbc7edfb127e185c72b6adf1c0c39d4db84b..f989b99f955cb14d0ffac00ba462229194a2cdf4 100644 (file)
@@ -35,9 +35,9 @@
     this unit type. See
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     for the common options of all unit configuration files. The common
-    configuration items are configured in the generic <literal>[Unit]</literal> and
-    <literal>[Install]</literal> sections. The socket specific configuration options are
-    configured in the <literal>[Socket]</literal> section.</para>
+    configuration items are configured in the generic [Unit] and
+    [Install] sections. The socket specific configuration options are
+    configured in the [Socket] section.</para>
 
     <para>Additional options are listed in
     <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
         <listitem><para>Socket units automatically gain a <varname>Before=</varname>
         dependency on the service units they activate.</para></listitem>
 
-        <listitem><para>Socket units referring to file system paths (such as AF_UNIX
-        sockets or FIFOs) implicitly gain <varname>Requires=</varname> and
-        <varname>After=</varname> dependencies on all mount units
-        necessary to access those paths.</para></listitem>
+        <listitem><para>Socket units referring to file system paths (such as <constant>AF_UNIX</constant>
+        sockets or FIFOs) implicitly gain <varname>Requires=</varname> and <varname>After=</varname>
+        dependencies on all mount units necessary to access those paths.</para></listitem>
 
         <listitem><para>Socket units using the <varname>BindToDevice=</varname>
         setting automatically gain a <varname>BindsTo=</varname> and
         url="https://www.kernel.org/doc/Documentation/usb/functionfs.txt">USB
         FunctionFS</ulink> endpoints location to listen on, for
         implementation of USB gadget functions. This expects an
-        absolute file system path of functionfs mount point as the argument.
+        absolute file system path of FunctionFS mount point as the argument.
         Behavior otherwise is very similar to the <varname>ListenFIFO=</varname>
         directive above. Use this to open the FunctionFS endpoint
         <filename>ep0</filename>. When using this option, the
       <varlistentry>
         <term><varname>SocketProtocol=</varname></term>
         <listitem><para>Takes one of <option>udplite</option>
-        or <option>sctp</option>. Specifies a socket protocol
-        (<constant>IPPROTO_UDPLITE</constant>) UDP-Lite
-        (<constant>IPPROTO_SCTP</constant>) SCTP socket respectively. </para>
+        or <option>sctp</option>. The socket will use the UDP-Lite
+        (<constant>IPPROTO_UDPLITE</constant>) or SCTP
+        (<constant>IPPROTO_SCTP</constant>) protocol, respectively.</para>
         </listitem>
       </varlistentry>
 
 
       <varlistentry>
         <term><varname>BindToDevice=</varname></term>
-        <listitem><para>Specifies a network interface name to bind
-        this socket to. If set, traffic will only be accepted from the
-        specified network interfaces. This controls the
-        SO_BINDTODEVICE socket option (see <citerefentry
-        project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry>
-        for details). If this option is used, an implicit dependency
-        from this socket unit on the network interface device unit
-        (<citerefentry><refentrytitle>systemd.device</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        is created. Note that setting this parameter might result in
-        additional dependencies to be added to the unit (see
+        <listitem><para>Specifies a network interface name to bind this socket to. If set, traffic will only
+        be accepted from the specified network interfaces. This controls the
+        <constant>SO_BINDTODEVICE</constant> socket option (see <citerefentry
+        project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry> for
+        details). If this option is used, an implicit dependency from this socket unit on the network
+        interface device unit is created
+        (see <citerefentry><refentrytitle>systemd.device</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
+        Note that setting this parameter might result in additional dependencies to be added to the unit (see
         above).</para></listitem>
       </varlistentry>
 
         <term><varname>SocketUser=</varname></term>
         <term><varname>SocketGroup=</varname></term>
 
-        <listitem><para>Takes a UNIX user/group name. When specified,
-        all AF_UNIX sockets and FIFO nodes in the file system are
-        owned by the specified user and group. If unset (the default),
-        the nodes are owned by the root user/group (if run in system
-        context) or the invoking user/group (if run in user context).
-        If only a user is specified but no group, then the group is
+        <listitem><para>Takes a UNIX user/group name. When specified, all <constant>AF_UNIX</constant>
+        sockets and FIFO nodes in the file system are owned by the specified user and group. If unset (the
+        default), the nodes are owned by the root user/group (if run in system context) or the invoking
+        user/group (if run in user context).  If only a user is specified but no group, then the group is
         derived from the user's default group.</para></listitem>
       </varlistentry>
 
         to work unmodified with systemd socket
         activation.</para>
 
-        <para>For IPv4 and IPv6 connections, the <varname>REMOTE_ADDR</varname>
-        environment variable will contain the remote IP address, and <varname>REMOTE_PORT</varname>
-        will contain the remote port. This is the same as the format used by CGI.
-        For SOCK_RAW, the port is the IP protocol.</para></listitem>
+        <para>For IPv4 and IPv6 connections, the <varname>REMOTE_ADDR</varname> environment variable will
+        contain the remote IP address, and <varname>REMOTE_PORT</varname> will contain the remote port. This
+        is the same as the format used by CGI. For <constant>SOCK_RAW</constant>, the port is the IP
+        protocol.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
        <varlistentry>
         <term><varname>KeepAlive=</varname></term>
-        <listitem><para>Takes a boolean argument. If true, the TCP/IP
-        stack will send a keep alive message after 2h (depending on
-        the configuration of
-        <filename>/proc/sys/net/ipv4/tcp_keepalive_time</filename>)
-        for all TCP streams accepted on this socket. This controls the
-        SO_KEEPALIVE socket option (see
-        <citerefentry project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry>
-        and the <ulink
-        url="http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/">TCP
-        Keepalive HOWTO</ulink> for details.) Defaults to
-        <option>false</option>.</para></listitem>
+        <listitem><para>Takes a boolean argument. If true, the TCP/IP stack will send a keep alive message
+        after 2h (depending on the configuration of
+        <filename>/proc/sys/net/ipv4/tcp_keepalive_time</filename>) for all TCP streams accepted on this
+        socket. This controls the <constant>SO_KEEPALIVE</constant> socket option (see <citerefentry
+        project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry> and
+        the <ulink url="http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/">TCP Keepalive
+        HOWTO</ulink> for details.) Defaults to <option>false</option>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
       <varlistentry>
         <term><varname>KeepAliveIntervalSec=</varname></term>
-        <listitem><para>Takes time (in seconds) as argument between
-        individual keepalive probes, if the socket option SO_KEEPALIVE
-        has been set on this socket. This controls
-        the TCP_KEEPINTVL socket option (see
-        <citerefentry project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry>
-        and the <ulink
-        url="http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/">TCP
-        Keepalive HOWTO</ulink> for details.) Defaults value is 75
-        seconds.</para></listitem>
+        <listitem><para>Takes time (in seconds) as argument between individual keepalive probes, if the
+        socket option <constant>SO_KEEPALIVE</constant> has been set on this socket. This controls the
+        <constant>TCP_KEEPINTVL</constant> socket option (see <citerefentry
+        project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry> and
+        the <ulink url="http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/">TCP Keepalive
+        HOWTO</ulink> for details.) Defaults value is 75 seconds.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         algorithm works by combining a number of small outgoing
         messages, and sending them all at once. This controls the
         TCP_NODELAY socket option (see
-        <citerefentry project='die-net'><refentrytitle>tcp</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+        <citerefentry project='die-net'><refentrytitle>tcp</refentrytitle><manvolnum>7</manvolnum></citerefentry>).
         Defaults to <option>false</option>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>Priority=</varname></term>
-        <listitem><para>Takes an integer argument controlling the
-        priority for all traffic sent from this socket. This controls
-        the SO_PRIORITY socket option (see
-        <citerefentry project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry>
-        for details.).</para></listitem>
+        <listitem><para>Takes an integer argument controlling the priority for all traffic sent from this
+        socket. This controls the <constant>SO_PRIORITY</constant> socket option (see <citerefentry
+        project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry> for
+        details.).</para></listitem>
       </varlistentry>
 
       <varlistentry>
       <varlistentry>
         <term><varname>ReceiveBuffer=</varname></term>
         <term><varname>SendBuffer=</varname></term>
-        <listitem><para>Takes an integer argument controlling the
-        receive or send buffer sizes of this socket, respectively.
-        This controls the SO_RCVBUF and SO_SNDBUF socket options (see
-        <citerefentry project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry>
-        for details.). The usual suffixes K, M, G are supported and
-        are understood to the base of 1024.</para></listitem>
+        <listitem><para>Takes an integer argument controlling the receive or send buffer sizes of this
+        socket, respectively.  This controls the <constant>SO_RCVBUF</constant> and
+        <constant>SO_SNDBUF</constant> socket options (see <citerefentry
+        project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry> for
+        details.). The usual suffixes K, M, G are supported and are understood to the base of
+        1024.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
       <varlistentry>
         <term><varname>Mark=</varname></term>
-        <listitem><para>Takes an integer value. Controls the firewall
-        mark of packets generated by this socket. This can be used in
-        the firewall logic to filter packets from this socket. This
-        sets the SO_MARK socket option. See
-        <citerefentry project='die-net'><refentrytitle>iptables</refentrytitle><manvolnum>8</manvolnum></citerefentry>
-        for details.</para></listitem>
+        <listitem><para>Takes an integer value. Controls the firewall mark of packets generated by this
+        socket. This can be used in the firewall logic to filter packets from this socket. This sets the
+        <constant>SO_MARK</constant> socket option. See <citerefentry
+        project='die-net'><refentrytitle>iptables</refentrytitle><manvolnum>8</manvolnum></citerefentry> for
+        details.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>ReusePort=</varname></term>
-        <listitem><para>Takes a boolean value. If true, allows
-        multiple
-        <citerefentry><refentrytitle>bind</refentrytitle><manvolnum>2</manvolnum></citerefentry>s
-        to this TCP or UDP port. This controls the SO_REUSEPORT socket
-        option. See
-        <citerefentry project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry>
-        for details.</para></listitem>
+        <listitem><para>Takes a boolean value. If true, allows multiple
+        <citerefentry><refentrytitle>bind</refentrytitle><manvolnum>2</manvolnum></citerefentry>s to this TCP
+        or UDP port. This controls the <constant>SO_REUSEPORT</constant> socket option. See <citerefentry
+        project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry> for
+        details.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
       <varlistentry>
         <term><varname>Broadcast=</varname></term>
-        <listitem><para>Takes a boolean value. This controls the
-        SO_BROADCAST socket option, which allows broadcast datagrams
-        to be sent from this socket. Defaults to
+        <listitem><para>Takes a boolean value. This controls the <constant>SO_BROADCAST</constant> socket
+        option, which allows broadcast datagrams to be sent from this socket. Defaults to
         <option>false</option>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>PassCredentials=</varname></term>
-        <listitem><para>Takes a boolean value. This controls the
-        SO_PASSCRED socket option, which allows
-        <constant>AF_UNIX</constant> sockets to receive the
-        credentials of the sending process in an ancillary message.
-        Defaults to <option>false</option>.</para></listitem>
+        <listitem><para>Takes a boolean value. This controls the <constant>SO_PASSCRED</constant> socket
+        option, which allows <constant>AF_UNIX</constant> sockets to receive the credentials of the sending
+        process in an ancillary message. Defaults to <option>false</option>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>PassSecurity=</varname></term>
-        <listitem><para>Takes a boolean value. This controls the
-        SO_PASSSEC socket option, which allows
-        <constant>AF_UNIX</constant> sockets to receive the security
-        context of the sending process in an ancillary message.
-        Defaults to <option>false</option>.</para></listitem>
+        <listitem><para>Takes a boolean value. This controls the <constant>SO_PASSSEC</constant> socket
+        option, which allows <constant>AF_UNIX</constant> sockets to receive the security context of the
+        sending process in an ancillary message.  Defaults to <option>false</option>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
       <varlistentry>
         <term><varname>TCPCongestion=</varname></term>
-        <listitem><para>Takes a string value. Controls the TCP
-        congestion algorithm used by this socket. Should be one of
-        "westwood", "veno", "cubic", "lp" or any other available
-        algorithm supported by the IP stack. This setting applies only
-        to stream sockets.</para></listitem>
+        <listitem><para>Takes a string value. Controls the TCP congestion algorithm used by this
+        socket. Should be one of <literal>westwood</literal>, <literal>veno</literal>,
+        <literal>cubic</literal>, <literal>lp</literal> or any other available algorithm supported by the IP
+        stack. This setting applies only to stream sockets.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
       <varlistentry>
         <term><varname>RemoveOnStop=</varname></term>
-        <listitem><para>Takes a boolean argument. If enabled, any file
-        nodes created by this socket unit are removed when it is
-        stopped. This applies to AF_UNIX sockets in the file system,
-        POSIX message queues, FIFOs, as well as any symlinks to them
-        configured with <varname>Symlinks=</varname>. Normally, it
-        should not be necessary to use this option, and is not
-        recommended as services might continue to run after the socket
-        unit has been terminated and it should still be possible to
-        communicate with them via their file system node. Defaults to
+        <listitem><para>Takes a boolean argument. If enabled, any file nodes created by this socket unit are
+        removed when it is stopped. This applies to <constant>AF_UNIX</constant> sockets in the file system,
+        POSIX message queues, FIFOs, as well as any symlinks to them configured with
+        <varname>Symlinks=</varname>. Normally, it should not be necessary to use this option, and is not
+        recommended as services might continue to run after the socket unit has been terminated and it should
+        still be possible to communicate with them via their file system node. Defaults to
         off.</para></listitem>
       </varlistentry>
 
index 9f368f903dc8dd2421225c42ab786d863379609a..a948969a8f8efc07ad2700971c7fc8916933ec76 100644 (file)
             this unit (or <filename>multi-user.target</filename>) during
             installation. This is best configured via
             <varname>WantedBy=graphical.target</varname> in the unit's
-            <literal>[Install]</literal> section.</para>
+            [Install] section.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
             add <varname>Wants=</varname> dependencies for their unit to
             this unit during installation. This is best configured via
             <varname>WantedBy=multi-user.target</varname> in the unit's
-            <literal>[Install]</literal> section.</para>
+            [Install] section.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
             applications get pulled in via <varname>Wants=</varname>
             dependencies from this unit. This is best configured via a
             <varname>WantedBy=paths.target</varname> in the path unit's
-            <literal>[Install]</literal> section.</para>
+            [Install] section.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
             <para>Adding slice units to <filename>slices.target</filename> is generally not
             necessary. Instead, when some unit that uses <varname>Slice=</varname> is started, the
             specified slice will be started automatically. Adding
-            <varname>WantedBy=slices.target</varname> lines to the <literal>[Install]</literal>
+            <varname>WantedBy=slices.target</varname> lines to the [Install]
             section should only be done for units that need to be always active. In that case care
             needs to be taken to avoid creating a loop through the automatic dependencies on
             "parent" slices.</para>
             <varname>Wants=</varname> dependencies to this unit for
             their socket unit during installation. This is best
             configured via a <varname>WantedBy=sockets.target</varname>
-            in the socket unit's <literal>[Install]</literal>
+            in the socket unit's [Install]
             section.</para>
           </listitem>
         </varlistentry>
             applications get pulled in via <varname>Wants=</varname>
             dependencies from this unit. This is best configured via
             <varname>WantedBy=timers.target</varname> in the timer
-            unit's <literal>[Install]</literal> section.</para>
+            unit's [Install] section.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
             <para>By default, all user processes and services started on
             behalf of the user, including the per-user systemd instance
             are found in this slice.  This is pulled in by
-            <filename>systemd-logind.service</filename></para>
+            <filename>systemd-logind.service</filename>.</para>
           </listitem>
         </varlistentry>
 
           <listitem>
             <para>By default, all virtual machines and containers
             registered with <command>systemd-machined</command> are
-            found in this slice.  This is pulled in by
-            <filename>systemd-machined.service</filename></para>
+            found in this slice. This is pulled in by
+            <filename>systemd-machined.service</filename>.</para>
           </listitem>
         </varlistentry>
       </variablelist>
             <para>This target is active whenever any graphical session is running. It is used to
             stop user services which only apply to a graphical (X, Wayland, etc.) session when the
             session is terminated. Such services should have
-            <literal>PartOf=graphical-session.target</literal> in their <literal>[Unit]</literal>
+            <literal>PartOf=graphical-session.target</literal> in their [Unit]
             section. A target for a particular session (e. g.
             <filename>gnome-session.target</filename>) starts and stops
             <literal>graphical-session.target</literal> with
index c4160290a5142787f38c00cf9c95c7a0fa0d8efc..4b1f850af4f3c1444e758f8d00f16312065b98b2 100644 (file)
@@ -37,9 +37,9 @@
     this unit type. See
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     for the common options of all unit configuration files. The common
-    configuration items are configured in the generic <literal>[Unit]</literal> and
-    <literal>[Install]</literal> sections. The swap specific configuration options are
-    configured in the <literal>[Swap]</literal> section.</para>
+    configuration items are configured in the generic [Unit] and
+    [Install] sections. The swap specific configuration options are
+    configured in the [Swap] section.</para>
 
     <para>Additional options are listed in
     <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
   <refsect1>
     <title>Options</title>
 
-    <para>Swap files must include a [Swap] section, which carries
+    <para>Swap unit files must include a [Swap] section, which carries
     information about the swap device it supervises. A number of
     options that may be used in this section are shared with other
     unit types. These options are documented in
index 04b1564b1747e8bf62f0c985354cae431b3471ce..df100ec4e7b3634eaa517e22d89ef3ed8ea161f1 100644 (file)
@@ -98,10 +98,10 @@ KeyTwo=value 2 \
        value 2 continued
 
 [Section C]
-KeyThree=value 2\
+KeyThree=value 3\
 # this line is ignored
 ; this line is ignored too
-       value 2 continued
+       value 3 continued
 </programlisting></example>
 
     <para>Boolean arguments used in configuration files can be written in
index 3052b177864c56f5123ba1b4ef642c64388083f6..a706a4588af78c3330901f045e101eb44825dfe7 100644 (file)
@@ -34,8 +34,8 @@
     <para>This unit type has no specific options. See
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     for the common options of all unit configuration files. The common
-    configuration items are configured in the generic <literal>[Unit]</literal> and
-    <literal>[Install]</literal> sections. A separate <literal>[Target]</literal> section does not exist,
+    configuration items are configured in the generic [Unit] and
+    [Install] sections. A separate [Target] section does not exist,
     since no target-specific options may be configured.</para>
 
     <para>Target units do not offer any additional functionality on
index b4656b05d10ba07e108cd3023e75f0410ff82206..5b7800e78b467b329676f6095bbf137165b31dcb 100644 (file)
   <refsect1>
     <title>Parsing Timestamps</title>
 
-    <para>When parsing, systemd will accept a similar syntax, but expects no timezone specification, unless it is given
-    as the literal string <literal>UTC</literal> (for the UTC timezone), or is specified to be the locally configured
-    timezone, or the timezone name in the IANA timezone database format. The complete list of timezones
-    supported on your system can be obtained using the <literal>timedatectl list-timezones</literal>
-    (see <citerefentry><refentrytitle>timedatectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>).
-    Using IANA format is recommended over local timezone names, as less prone to errors (eg: with local timezone it's possible to
-    specify daylight saving time in winter, while it's incorrect). The weekday specification is optional, but when
-    the weekday is specified, it must either be in the abbreviated (<literal>Wed</literal>) or non-abbreviated
-    (<literal>Wednesday</literal>) English language form (case does not matter), and is not subject to the locale
-    choice of the user.  Either the date, or the time part may be omitted, in which case the current date or 00:00:00,
-    respectively, is assumed. The seconds component of the time may also be omitted, in which case ":00" is
-    assumed. Year numbers may be specified in full or may be abbreviated (omitting the century).</para>
+    <para>When parsing, systemd will accept a similar syntax, but expects no timezone specification, unless
+    it is given as the literal string <literal>UTC</literal> (for the UTC timezone), or is specified to be
+    the locally configured timezone, or the timezone name in the IANA timezone database format. The complete
+    list of timezones supported on your system can be obtained using the <literal>timedatectl
+    list-timezones</literal> (see
+    <citerefentry><refentrytitle>timedatectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>).  Using
+    IANA format is recommended over local timezone names, as less prone to errors (e.g. with local timezone
+    it's possible to specify daylight saving time in winter, even though that is not correct). The weekday
+    specification is optional, but when the weekday is specified, it must either be in the abbreviated
+    (<literal>Wed</literal>) or non-abbreviated (<literal>Wednesday</literal>) English language form (case
+    does not matter), and is not subject to the locale choice of the user. Either the date, or the time part
+    may be omitted, in which case the current date or 00:00:00, respectively, is assumed. The seconds
+    component of the time may also be omitted, in which case ":00" is assumed. Year numbers may be specified
+    in full or may be abbreviated (omitting the century).</para>
 
     <para>A timestamp is considered invalid if a weekday is specified and the date does not match the specified day of
     the week.</para>
@@ -282,7 +284,7 @@ Wed..Sat,Tue 12-10-15 1:2:3 → Tue..Sat 2012-10-15 01:02:03
       <para>Use the <command>calendar</command> command of
       <citerefentry><refentrytitle>systemd-analyze</refentrytitle><manvolnum>1</manvolnum></citerefentry> to validate
       and normalize calendar time specifications for testing purposes. The tool also calculates when a specified
-      calendar event would elapse next.</para>
+      calendar event would occur next.</para>
   </refsect1>
 
   <refsect1>
index 040b8e28939eadd20bbc887823f67c21e0c008e7..582240271284781312d0ed98c6674f9da8e04d77 100644 (file)
@@ -35,9 +35,9 @@
     this unit type. See
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     for the common options of all unit configuration files. The common
-    configuration items are configured in the generic <literal>[Unit]</literal> and
-    <literal>[Install]</literal> sections. The timer specific configuration options are
-    configured in the <literal>[Timer]</literal> section.</para>
+    configuration items are configured in the generic [Unit] and
+    [Install] sections. The timer specific configuration options are
+    configured in the [Timer] section.</para>
 
     <para>For each timer file, a matching unit file must exist,
     describing the unit to activate when the timer elapses. By
index 8c0815488b1062e9f338ddf4a4da6cda393cb908..af45900cd0107a095ec4cce9832b14a6521bc297 100644 (file)
         that the listed unit is fully started up before the configured unit is started.</para>
 
         <para>When two units with an ordering dependency between them are shut down, the inverse of the
-        start-up order is applied. i.e. if a unit is configured with <varname>After=</varname> on another
+        start-up order is applied. I.e. if a unit is configured with <varname>After=</varname> on another
         unit, the former is stopped before the latter if both are shut down. Given two units with any
         ordering dependency between them, if one unit is shut down and the other is started up, the shutdown
         is ordered before the start-up. It doesn't matter if the ordering dependency is
         <option>--job-mode=</option> option for details on the
         possible values. If this is set to <literal>isolate</literal>,
         only a single unit may be listed in
-        <varname>OnFailure=</varname>..</para></listitem>
+        <varname>OnFailure=</varname>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>StartLimitAction=</varname></term>
 
         <listitem><para>Configure an additional action to take if the rate limit configured with
-        <varname>StartLimitIntervalSec=</varname> and <varname>StartLimitBurst=</varname> is hit.  Takes the same
-        values as the setting <varname>FailureAction=</varname>/<varname>SuccessAction=</varname> settings and executes
-        the same actions. If <option>none</option> is set, hitting the rate limit will trigger no action besides that
+        <varname>StartLimitIntervalSec=</varname> and <varname>StartLimitBurst=</varname> is hit. Takes the same
+        values as the <varname>FailureAction=</varname>/<varname>SuccessAction=</varname> settings. If
+        <option>none</option> is set, hitting the rate limit will trigger no action except that
         the start will not be permitted. Defaults to <option>none</option>.</para></listitem>
       </varlistentry>
 
   <refsect1>
     <title>[Install] Section Options</title>
 
-    <para>Unit files may include an <literal>[Install]</literal> section, which carries installation information for
+    <para>Unit files may include an [Install] section, which carries installation information for
     the unit. This section is not interpreted by
     <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry> during runtime; it is
     used by the <command>enable</command> and <command>disable</command> commands of the
index 11954a78da8ed2ef14686298245dd50ee78b0ad0..a13d53e72cb8c558ab315a115f46e0012ae4d7b2 100644 (file)
       <varlistentry>
         <term><varname>systemd.crash_chvt</varname></term>
 
-        <listitem><para>Takes a positive integer, or a boolean argument. Can be also
-        specified without an argument, with the same effect as a positive boolean. If
-        a positive integer (in the range 1–63) is specified, the system manager (PID
-        1) will activate the specified virtual terminal (VT) when it
-        crashes. Defaults to disabled, meaning that no such switch is attempted. If
-        set to enabled, the VT the kernel messages are written to is selected.
-        </para></listitem>
+        <listitem><para>Takes a positive integer, or a boolean argument. Can be also specified without an
+        argument, with the same effect as a positive boolean. If a positive integer (in the range 1–63) is
+        specified, the system manager (PID 1) will activate the specified virtual terminal when it crashes.
+        Defaults to disabled, meaning that no such switch is attempted. If set to enabled, the virtual
+        terminal the kernel messages are written to is used instead.</para></listitem>
       </varlistentry>
 
       <varlistentry>
       this context, because they are properly namespaced. When an option is specified both on the kernel
       command line, and as a normal command line argument, the latter has higher precedence.</para>
 
-      <para>When <command>systemd</command> is used a user manager, the kernel command line is ignored and
+      <para>When <command>systemd</command> is used as a user manager, the kernel command line is ignored and
       the options described are understood. Nevertheless, <command>systemd</command> is usually started in
       this mode through the
       <citerefentry><refentrytitle>user@.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
       service, which is shared between all users, and it may be more convenient to use configuration files to
       modify settings, see
       <citerefentry><refentrytitle>systemd-user.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      or a drop-in that specifies one of the environment variables listed above in "Environment, see
+      or a drop-in that specifies one of the environment variables listed above in the Environment section,
+      see
       <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
 
       <variablelist>
         <varlistentry>
           <term><option>--show-status</option></term>
 
-          <listitem><para>Show terse unit status information is shown on the console during boot-up and
-          shutdown. See <varname>systemd.show_status</varname> above.</para></listitem>
+          <listitem><para>Show terse unit status information on the console during boot-up and shutdown. See
+          <varname>systemd.show_status</varname> above.</para></listitem>
         </varlistentry>
 
         <varlistentry>
index 1711915c2204787d49b0ff3df44f8b94308cb174..f312ac269289c55d89b4694c4d94458f14d9e1e2 100644 (file)
     <varlistentry id='qdisc-parent'>
       <term><varname>Parent=</varname></term>
       <listitem>
-        <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
-        <literal>clsact</literal>, <literal>ingress</literal> or a class id. The class id takes the
-        major and minor number in hexadecimal ranges 1 to ffff separated with a colon
-        (<literal>major:minor</literal>). Defaults to <literal>root</literal>.</para>
+        <para>Configures the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
+        <literal>clsact</literal>, <literal>ingress</literal> or a class identifier. The class identifier is
+        specified as the major and minor numbers in hexadecimal in the range 0x1–Oxffff separated with a
+        colon (<literal>major:minor</literal>). Defaults to <literal>root</literal>.</para>
       </listitem>
     </varlistentry>
 
     <varlistentry id='qdisc-handle'>
       <term><varname>Handle=</varname></term>
       <listitem>
-        <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
-        Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
+        <para>Configures the major number of unique identifier of the qdisc, known as the handle.
+        Takes a hexadecimal number in the range 0x1–0xffff. Defaults to unset.</para>
       </listitem>
     </varlistentry>
 
     <varlistentry id='tclass-parent'>
       <term><varname>Parent=</varname></term>
       <listitem>
-        <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
-        or a qdisc id. The qdisc id takes the major and minor number in hexadecimal ranges 1 to ffff
-        separated with a colon (<literal>major:minor</literal>). Defaults to <literal>root</literal>.
+        <para>Configures the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>, or a
+        qdisc identifier. The qdisc identifier is specified as the major and minor numbers in hexadecimal in
+        the range 0x1–Oxffff separated with a colon (<literal>major:minor</literal>). Defaults to
+        <literal>root</literal>.
         </para>
       </listitem>
     </varlistentry>
@@ -38,8 +39,9 @@
     <varlistentry id='tclass-classid'>
       <term><varname>ClassId=</varname></term>
       <listitem>
-        <para>Specifies the major and minur number of unique identifier of the class, known as the
-        class ID. Each number is in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
+        <para>Configues the unique identifier of the class. It is specified as the major and minor numbers in
+        hexadecimal in the range 0x1–Oxffff separated with a colon (<literal>major:minor</literal>).
+        Defaults to unset.</para>
       </listitem>
     </varlistentry>
   </variablelist>
index c64d015400cdb67ed017fee25b194fd5f65e9589..44694e803319372d0c4fbd7da29523ae83c1b07a 100644 (file)
@@ -41,7 +41,7 @@
   <refsect1>
     <title>Options</title>
 
-    <para>The following settings are configured in the <literal>[Time]</literal> section:</para>
+    <para>The following settings are configured in the [Time] section:</para>
 
     <variablelist class='network-directives'>
 
index 606ce673b5645d8ba33a12e8444b8d4702111d93..777393ab750f5754d811ad465a28ca9970c563e2 100644 (file)
     <title>Well-Known Services</title>
 
     <para>The <command>userdbctl services</command> command will list all currently running services that
-    provide user or group definitions to the system. The following are well-known services are shown among
-    this list.</para>
+    provide user or group definitions to the system. The following well-known services are shown among
+    this list:</para>
 
     <variablelist>
-
       <varlistentry>
         <term><constant>io.systemd.DynamicUser</constant></term>
 
 
     <para>Note that <command>userdbctl</command> has internal support for NSS-based lookups too. This means
     that if neither <constant>io.systemd.Multiplexer</constant> nor
-    <constant>io.systemd.NameSeviceSwitch</constant> are running look-ups into the the basic user/group
+    <constant>io.systemd.NameSeviceSwitch</constant> are running look-ups into the basic user/group
     databases will still work.</para>
   </refsect1>
 
index 4a679449ce2793014afdde5823d66887d792c355..0c012b69fe1f81ac15fa1058be8378eba809f308 100644 (file)
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: LGPL-2.1+
 
 project('systemd', 'c',
-        version : '245',
+        version : '246',
         license : 'LGPLv2+',
         default_options: [
                 'c_std=gnu99',
@@ -13,8 +13,8 @@ project('systemd', 'c',
         meson_version : '>= 0.46',
        )
 
-libsystemd_version = '0.28.0'
-libudev_version = '1.6.17'
+libsystemd_version = '0.29.0'
+libudev_version = '1.6.18'
 
 # We need the same data in two different formats, ugh!
 # Also, for hysterical reasons, we use different variable
@@ -1035,6 +1035,8 @@ if want_libcryptsetup != 'false' and not skip_deps
 
         conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
                    have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
+        conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
+                   have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
 else
         have = false
         libcryptsetup = []
@@ -1151,6 +1153,17 @@ else
 endif
 conf.set10('HAVE_P11KIT', have)
 
+want_libfido2 = get_option('libfido2')
+if want_libfido2 != 'false' and not skip_deps
+        libfido2 = dependency('libfido2',
+                              required : want_libfido2 == 'true')
+        have = libfido2.found()
+else
+        have = false
+        libfido2 = []
+endif
+conf.set10('HAVE_LIBFIDO2', have)
+
 want_elfutils = get_option('elfutils')
 if want_elfutils != 'false' and not skip_deps
         libdw = dependency('libdw',
@@ -1188,36 +1201,38 @@ want_xz = get_option('xz')
 if want_xz != 'false' and not skip_deps
         libxz = dependency('liblzma',
                            required : want_xz == 'true')
-        have = libxz.found()
+        have_xz = libxz.found()
 else
-        have = false
+        have_xz = false
         libxz = []
 endif
-conf.set10('HAVE_XZ', have)
+conf.set10('HAVE_XZ', have_xz)
 
 want_lz4 = get_option('lz4')
 if want_lz4 != 'false' and not skip_deps
         liblz4 = dependency('liblz4',
                             version : '>= 1.3.0',
                             required : want_lz4 == 'true')
-        have = liblz4.found()
+        have_lz4 = liblz4.found()
 else
-        have = false
+        have_lz4 = false
         liblz4 = []
 endif
-conf.set10('HAVE_LZ4', have)
+conf.set10('HAVE_LZ4', have_lz4)
 
 want_zstd = get_option('zstd')
 if want_zstd != 'false' and not skip_deps
         libzstd = dependency('libzstd',
                              required : want_zstd == 'true',
                              version : '>= 1.4.0')
-        have = libzstd.found()
+        have_zstd = libzstd.found()
 else
-        have = false
+        have_zstd = false
         libzstd = []
 endif
-conf.set10('HAVE_ZSTD', have)
+conf.set10('HAVE_ZSTD', have_zstd)
+
+conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
 
 want_xkbcommon = get_option('xkbcommon')
 if want_xkbcommon != 'false' and not skip_deps
@@ -1660,7 +1675,7 @@ test_dlopen = executable(
         build_by_default : want_tests != 'false')
 
 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
-                 ['systemd',    'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
+                 ['systemd',    'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
                  ['mymachines', 'ENABLE_NSS_MYMACHINES'],
                  ['resolve',    'ENABLE_NSS_RESOLVE']]
 
@@ -2142,7 +2157,8 @@ if conf.get('ENABLE_HOMED') == 1
                                 libcrypt,
                                 libopenssl,
                                 libfdisk,
-                                libp11kit],
+                                libp11kit,
+                                libfido2],
                 install_rpath : rootlibexecdir,
                 install : true,
                 install_dir : rootlibexecdir)
@@ -2169,6 +2185,7 @@ if conf.get('ENABLE_HOMED') == 1
                                 libcrypt,
                                 libopenssl,
                                 libp11kit,
+                                libfido2,
                                 libpwquality],
                 install_rpath : rootlibexecdir,
                 install : true,
@@ -3571,6 +3588,7 @@ foreach tuple : [
         ['pwquality'],
         ['libfdisk'],
         ['p11kit'],
+        ['libfido2'],
         ['AUDIT'],
         ['IMA'],
         ['AppArmor'],
index e13bfb0c4b9c2de63235c8c1a413bff70648ea96..fd73d5e681f4e50b53b560c8f6a7d6bc4c8de990 100644 (file)
@@ -312,6 +312,8 @@ option('openssl', type : 'combo', choices : ['auto', 'true', 'false'],
        description : 'openssl support')
 option('p11kit', type : 'combo', choices : ['auto', 'true', 'false'],
        description : 'p11kit support')
+option('libfido2', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'FIDO2 support')
 option('elfutils', type : 'combo', choices : ['auto', 'true', 'false'],
        description : 'elfutils support')
 option('zlib', type : 'combo', choices : ['auto', 'true', 'false'],
index 78180f638956961d420a4fb2cfc1cabbefbe072e..8805dce0dbb53c24be67efd925e9a617148f9c63 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: systemd master\n"
 "Report-Msgid-Bugs-To: https://github.com/systemd/systemd/issues\n"
-"POT-Creation-Date: 2020-02-29 15:12+0000\n"
-"PO-Revision-Date: 2020-03-01 13:58+0100\n"
+"POT-Creation-Date: 2020-05-30 13:27+0000\n"
+"PO-Revision-Date: 2020-07-01 16:40+0200\n"
 "Last-Translator: Daniel Rusek <mail@asciiwolf.com>\n"
 "Language-Team: Czech\n"
 "Language: cs\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2);\n"
-"X-Generator: Poedit 2.3\n"
+"X-Generator: Poedit 2.3.1\n"
 
 #: src/core/org.freedesktop.systemd1.policy.in:22
 msgid "Send passphrase back to system"
@@ -740,26 +740,34 @@ msgid "Authentication is required to reset DNS settings."
 msgstr "Pro resetování nastavení DNS je vyžadováno ověření."
 
 #: src/network/org.freedesktop.network1.policy:143
+msgid "DHCP server sends force renew message"
+msgstr "DHCP server posílá zprávu vynuceného obnovení"
+
+#: src/network/org.freedesktop.network1.policy:144
+msgid "Authentication is required to send force renew message."
+msgstr "Pro poslání zprávy vynuceného obnovení je vyžadováno ověření."
+
+#: src/network/org.freedesktop.network1.policy:154
 msgid "Renew dynamic addresses"
 msgstr "Obnovit dynamické adresy"
 
-#: src/network/org.freedesktop.network1.policy:144
+#: src/network/org.freedesktop.network1.policy:155
 msgid "Authentication is required to renew dynamic addresses."
 msgstr "Pro obnovení dynamických adres je vyžadováno ověření."
 
-#: src/network/org.freedesktop.network1.policy:154
+#: src/network/org.freedesktop.network1.policy:165
 msgid "Reload network settings"
 msgstr "Znovu načíst nastavení sítě"
 
-#: src/network/org.freedesktop.network1.policy:155
+#: src/network/org.freedesktop.network1.policy:166
 msgid "Authentication is required to reload network settings."
 msgstr "Pro opětovné načtení nastavení sítě je vyžadováno ověření."
 
-#: src/network/org.freedesktop.network1.policy:165
+#: src/network/org.freedesktop.network1.policy:176
 msgid "Reconfigure network interface"
 msgstr "Přenastavit síťové rozhraní"
 
-#: src/network/org.freedesktop.network1.policy:166
+#: src/network/org.freedesktop.network1.policy:177
 msgid "Authentication is required to reconfigure network interface."
 msgstr "Pro přenastavení síťového rozhraní je vyžadováno ověření."
 
@@ -853,40 +861,47 @@ msgid ""
 "shall be enabled."
 msgstr "Pro kontrolu synchronizace času ze sítě je vyžadováno ověření."
 
-#: src/core/dbus-unit.c:356
+#: src/core/dbus-unit.c:358
 msgid "Authentication is required to start '$(unit)'."
 msgstr "Pro spuštění „$(unit)” je vyžadováno ověření."
 
-#: src/core/dbus-unit.c:357
+#: src/core/dbus-unit.c:359
 msgid "Authentication is required to stop '$(unit)'."
 msgstr "Pro vypnutí „$(unit)” je vyžadováno ověření."
 
-#: src/core/dbus-unit.c:358
+#: src/core/dbus-unit.c:360
 msgid "Authentication is required to reload '$(unit)'."
 msgstr "Pro opětovné načtení „$(unit)” je vyžadováno ověření."
 
-#: src/core/dbus-unit.c:359 src/core/dbus-unit.c:360
+#: src/core/dbus-unit.c:361 src/core/dbus-unit.c:362
 msgid "Authentication is required to restart '$(unit)'."
 msgstr "Pro restart „$(unit)” je vyžadováno ověření."
 
-#: src/core/dbus-unit.c:532
+#: src/core/dbus-unit.c:534
 msgid ""
 "Authentication is required to send a UNIX signal to the processes of "
 "'$(unit)'."
 msgstr "Pro odeslání UNIX signálu procesům „$(unit)” je vyžadováno ověření."
 
-#: src/core/dbus-unit.c:563
+#: src/core/dbus-unit.c:565
 msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
 msgstr "Pro resetování chybného stavu „$(unit)” je vyžadováno ověření."
 
-#: src/core/dbus-unit.c:596
+#: src/core/dbus-unit.c:598
 msgid "Authentication is required to set properties on '$(unit)'."
 msgstr "Pro nastavení vlastností na „$(unit)” je vyžadováno ověření."
 
-#: src/core/dbus-unit.c:705
+#: src/core/dbus-unit.c:707
 msgid ""
 "Authentication is required to delete files and directories associated with "
 "'$(unit)'."
 msgstr ""
 "Pro odstranění souborů nebo adresářů souvisejících s „$(unit)” je vyžadováno "
 "ověření."
+
+#: src/core/dbus-unit.c:756
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Pro zmrazení nebo rozmrazení procesů jednotky „$(unit)” je vyžadováno "
+"ověření."
index 821e9db86f00b5ef101aaa96e6dbde2e62ea0ba0..fc7f733e20058504635dbd8a32e5e645eb795d2b 100644 (file)
@@ -76,8 +76,9 @@ KERNEL=="sd*[!0-9]|sr*", ATTRS{ieee1394_id}=="?*", SYMLINK+="disk/by-id/ieee1394
 KERNEL=="sd*[0-9]", ATTRS{ieee1394_id}=="?*", SYMLINK+="disk/by-id/ieee1394-$attr{ieee1394_id}-part%n"
 
 # MMC
-KERNEL=="mmcblk[0-9]", SUBSYSTEMS=="mmc", ATTRS{name}=="?*", ATTRS{serial}=="?*", \
-  ENV{ID_NAME}="$attr{name}", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/mmc-$env{ID_NAME}_$env{ID_SERIAL}"
+KERNEL=="mmcblk[0-9]", SUBSYSTEMS=="mmc", ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}"
+KERNEL=="mmcblk[0-9]", SUBSYSTEMS=="mmc", ATTRS{name}=="?*", ENV{ID_NAME}="$attr{name}"
+KERNEL=="mmcblk[0-9]", ENV{ID_NAME}=="?*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/mmc-$env{ID_NAME}_$env{ID_SERIAL}"
 KERNEL=="mmcblk[0-9]p[0-9]*", ENV{ID_NAME}=="?*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/mmc-$env{ID_NAME}_$env{ID_SERIAL}-part%n"
 
 # UBI-MTD
index 288b2efd0402df006b0169cf62935523acb8668d..6864a137b17f816525a7794294bc3b371a5d1a6a 100755 (executable)
@@ -13,6 +13,7 @@ AUTOPKGTEST_DIR="${CACHE_DIR}/autopkgtest"
 # semaphore cannot expose these, but useful for interactive/local runs
 ARTIFACTS_DIR=/tmp/artifacts
 PHASES=(${@:-SETUP RUN})
+UBUNTU_RELEASE="$(lsb_release -cs)"
 
 create_container() {
     # create autopkgtest LXC image; this sometimes fails with "Unable to fetch
@@ -51,9 +52,9 @@ for phase in "${PHASES[@]}"; do
             sudo rm -f /etc/apt/sources.list.d/*
 
             # enable backports for latest LXC
-            echo 'deb http://archive.ubuntu.com/ubuntu xenial-backports main restricted universe multiverse' | sudo tee -a /etc/apt/sources.list.d/backports.list
+            echo "deb http://archive.ubuntu.com/ubuntu $UBUNTU_RELEASE-backports main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/backports.list
             sudo apt-get -q update
-            sudo apt-get install -y -t xenial-backports lxc
+            sudo apt-get install -y -t "$UBUNTU_RELEASE-backports" lxc
             sudo apt-get install -y python3-debian git dpkg-dev fakeroot
 
             [ -d $AUTOPKGTEST_DIR ] || git clone --quiet --depth=1 https://salsa.debian.org/ci-team/autopkgtest.git "$AUTOPKGTEST_DIR"
index 8413afa8673226c6093e5a6179c072683f50fa19..02b9c75c4491378bf2c34b614f54cd93f078f9d5 100644 (file)
@@ -37,8 +37,8 @@ _networkctl() {
     )
 
     local -A VERBS=(
-        [STANDALONE]='label'
-        [LINKS]='status list lldp delete renew'
+        [STANDALONE]='label reload'
+        [LINKS]='status list lldp delete renew up down forcerenew reconfigure'
     )
 
     _init_completion || return
index a731167680fbf6908c7b5e6316dfb7d753114576..a8bd406fb3118a11fd1dafc1b1c94e843324a367 100644 (file)
@@ -71,7 +71,7 @@ _systemd_nspawn() {
                       --pivot-root --property --private-users --network-namespace-path --network-ipvlan
                       --network-veth-extra --network-zone -p --port --system-call-filter --overlay --overlay-ro
                       --settings --rlimit --hostname --no-new-privileges --oom-score-adjust --cpu-affinity
-                      --resolv-conf --timezone'
+                      --resolv-conf --timezone --root-hash-sig'
     )
 
     _init_completion || return
@@ -183,6 +183,10 @@ _systemd_nspawn() {
             --timezone)
                 comps=$( systemd-nspawn --timezone=help 2>/dev/null )
                 ;;
+            --root-hash-sig)
+                compopt -o nospace
+                comps=$( compgen -A file -- "$cur" )
+                ;;
         esac
         COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
         return 0
index 013788397668b9a0b09193ab6910ccd7afc3b502..441fb0075c8c72266f9707a5aad6020f5297f5d5 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "analyze-security.h"
 #include "bus-error.h"
+#include "bus-map-properties.h"
 #include "bus-unit-util.h"
 #include "bus-util.h"
 #include "env-util.h"
@@ -91,7 +92,7 @@ struct security_info {
 
         char **system_call_architectures;
 
-        bool system_call_filter_whitelist;
+        bool system_call_filter_allow_list;
         Set *system_call_filter;
 
         uint32_t _umask;
@@ -492,7 +493,7 @@ static int assess_system_call_architectures(
 
 #if HAVE_SECCOMP
 
-static bool syscall_names_in_filter(Set *s, bool whitelist, const SyscallFilterSet *f) {
+static bool syscall_names_in_filter(Set *s, bool allow_list, const SyscallFilterSet *f) {
         const char *syscall;
 
         NULSTR_FOREACH(syscall, f->value) {
@@ -502,7 +503,7 @@ static bool syscall_names_in_filter(Set *s, bool whitelist, const SyscallFilterS
                         const SyscallFilterSet *g;
 
                         assert_se(g = syscall_filter_set_find(syscall));
-                        if (syscall_names_in_filter(s, whitelist, g))
+                        if (syscall_names_in_filter(s, allow_list, g))
                                 return true; /* bad! */
 
                         continue;
@@ -513,7 +514,7 @@ static bool syscall_names_in_filter(Set *s, bool whitelist, const SyscallFilterS
                 if (id < 0)
                         continue;
 
-                if (set_contains(s, syscall) == whitelist) {
+                if (set_contains(s, syscall) == allow_list) {
                         log_debug("Offending syscall filter item: %s", syscall);
                         return true; /* bad! */
                 }
@@ -541,30 +542,30 @@ static int assess_system_call_filter(
         assert(a->parameter < _SYSCALL_FILTER_SET_MAX);
         f = syscall_filter_sets + a->parameter;
 
-        if (!info->system_call_filter_whitelist && set_isempty(info->system_call_filter)) {
+        if (!info->system_call_filter_allow_list && set_isempty(info->system_call_filter)) {
                 d = strdup("Service does not filter system calls");
                 b = 10;
         } else {
                 bool bad;
 
                 log_debug("Analyzing system call filter, checking against: %s", f->name);
-                bad = syscall_names_in_filter(info->system_call_filter, info->system_call_filter_whitelist, f);
+                bad = syscall_names_in_filter(info->system_call_filter, info->system_call_filter_allow_list, f);
                 log_debug("Result: %s", bad ? "bad" : "good");
 
-                if (info->system_call_filter_whitelist) {
+                if (info->system_call_filter_allow_list) {
                         if (bad) {
-                                (void) asprintf(&d, "System call whitelist defined for service, and %s is included", f->name);
+                                (void) asprintf(&d, "System call allow list defined for service, and %s is included", f->name);
                                 b = 9;
                         } else {
-                                (void) asprintf(&d, "System call whitelist defined for service, and %s is not included", f->name);
+                                (void) asprintf(&d, "System call allow list defined for service, and %s is not included", f->name);
                                 b = 0;
                         }
                 } else {
                         if (bad) {
-                                (void) asprintf(&d, "System call blacklist defined for service, and %s is not included", f->name);
+                                (void) asprintf(&d, "System call deny list defined for service, and %s is not included", f->name);
                                 b = 10;
                         } else {
-                                (void) asprintf(&d, "System call blacklist defined for service, and %s is included", f->name);
+                                (void) asprintf(&d, "System call deny list defined for service, and %s is included", f->name);
                                 b = 5;
                         }
                 }
@@ -599,13 +600,13 @@ static int assess_ip_address_allow(
                 d = strdup("Service defines custom ingress/egress IP filters with BPF programs");
                 b = 0;
         } else if (!info->ip_address_deny_all) {
-                d = strdup("Service does not define an IP address whitelist");
+                d = strdup("Service does not define an IP address allow list");
                 b = 10;
         } else if (info->ip_address_allow_other) {
-                d = strdup("Service defines IP address whitelist with non-localhost entries");
+                d = strdup("Service defines IP address allow list with non-localhost entries");
                 b = 5;
         } else if (info->ip_address_allow_localhost) {
-                d = strdup("Service defines IP address whitelist with only localhost entries");
+                d = strdup("Service defines IP address allow list with only localhost entries");
                 b = 2;
         } else {
                 d = strdup("Service blocks all IP address ranges");
@@ -1639,7 +1640,7 @@ static int property_read_restrict_address_families(
                 void *userdata) {
 
         struct security_info *info = userdata;
-        int whitelist, r;
+        int allow_list, r;
 
         assert(bus);
         assert(member);
@@ -1649,7 +1650,7 @@ static int property_read_restrict_address_families(
         if (r < 0)
                 return r;
 
-        r = sd_bus_message_read(m, "b", &whitelist);
+        r = sd_bus_message_read(m, "b", &allow_list);
         if (r < 0)
                 return r;
 
@@ -1657,7 +1658,7 @@ static int property_read_restrict_address_families(
                 info->restrict_address_family_unix =
                 info->restrict_address_family_netlink =
                 info->restrict_address_family_packet =
-                info->restrict_address_family_other = whitelist;
+                info->restrict_address_family_other = allow_list;
 
         r = sd_bus_message_enter_container(m, 'a', "s");
         if (r < 0)
@@ -1673,15 +1674,15 @@ static int property_read_restrict_address_families(
                         break;
 
                 if (STR_IN_SET(name, "AF_INET", "AF_INET6"))
-                        info->restrict_address_family_inet = !whitelist;
+                        info->restrict_address_family_inet = !allow_list;
                 else if (streq(name, "AF_UNIX"))
-                        info->restrict_address_family_unix = !whitelist;
+                        info->restrict_address_family_unix = !allow_list;
                 else if (streq(name, "AF_NETLINK"))
-                        info->restrict_address_family_netlink = !whitelist;
+                        info->restrict_address_family_netlink = !allow_list;
                 else if (streq(name, "AF_PACKET"))
-                        info->restrict_address_family_packet = !whitelist;
+                        info->restrict_address_family_packet = !allow_list;
                 else
-                        info->restrict_address_family_other = !whitelist;
+                        info->restrict_address_family_other = !allow_list;
         }
 
         r = sd_bus_message_exit_container(m);
@@ -1699,7 +1700,7 @@ static int property_read_system_call_filter(
                 void *userdata) {
 
         struct security_info *info = userdata;
-        int whitelist, r;
+        int allow_list, r;
 
         assert(bus);
         assert(member);
@@ -1709,11 +1710,11 @@ static int property_read_system_call_filter(
         if (r < 0)
                 return r;
 
-        r = sd_bus_message_read(m, "b", &whitelist);
+        r = sd_bus_message_read(m, "b", &allow_list);
         if (r < 0)
                 return r;
 
-        info->system_call_filter_whitelist = whitelist;
+        info->system_call_filter_allow_list = allow_list;
 
         r = sd_bus_message_enter_container(m, 'a', "s");
         if (r < 0)
index faf50d2ac315663e9a7ab211a319765220f140c3..e42f7ff935ad41feb14260cf763828e5681df229 100644 (file)
@@ -17,8 +17,9 @@
 #include "analyze-verify.h"
 #include "build.h"
 #include "bus-error.h"
+#include "bus-locator.h"
+#include "bus-map-properties.h"
 #include "bus-unit-util.h"
-#include "bus-util.h"
 #include "calendarspec.h"
 #include "conf-files.h"
 #include "copy.h"
@@ -2376,9 +2377,7 @@ static int run(int argc, char *argv[]) {
         setlocale(LC_ALL, "");
         setlocale(LC_NUMERIC, "C"); /* we want to format/parse floats in C style */
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 048441429025d966b1f629fff84ed2d8ffe07121..3a644363e1f5ef4a52cfedd32a148d847d4f26bc 100644 (file)
@@ -224,10 +224,8 @@ static int get_max_brightness(sd_device *device, unsigned *ret) {
         if (r < 0)
                 return log_device_warning_errno(device, r, "Failed to parse 'max_brightness' \"%s\": %m", max_brightness_str);
 
-        if (max_brightness <= 0) {
-                log_device_warning(device, "Maximum brightness is 0, ignoring device.");
-                return -EINVAL;
-        }
+        if (max_brightness <= 0)
+                return log_device_warning_errno(device, SYNTHETIC_ERRNO(EINVAL), "Maximum brightness is 0, ignoring device.");
 
         *ret = max_brightness;
         return 0;
@@ -299,6 +297,34 @@ static bool shall_clamp(sd_device *d) {
         return r;
 }
 
+static int read_brightness(sd_device *device, const char **ret) {
+        const char *subsystem;
+        int r;
+
+        assert(device);
+        assert(ret);
+
+        r = sd_device_get_subsystem(device, &subsystem);
+        if (r < 0)
+                return log_device_debug_errno(device, r, "Failed to get subsystem: %m");
+
+        if (streq(subsystem, "backlight")) {
+                r = sd_device_get_sysattr_value(device, "actual_brightness", ret);
+                if (r >= 0)
+                        return 0;
+                if (r != -ENOENT)
+                        return log_device_debug_errno(device, r, "Failed to read 'actual_brightness' attribute: %m");
+
+                log_device_debug_errno(device, r, "Failed to read 'actual_brightness' attribute, fall back to use 'brightness' attribute: %m");
+        }
+
+        r = sd_device_get_sysattr_value(device, "brightness", ret);
+        if (r < 0)
+                return log_device_debug_errno(device, r, "Failed to read 'brightness' attribute: %m");
+
+        return 0;
+}
+
 static int run(int argc, char *argv[]) {
         _cleanup_(sd_device_unrefp) sd_device *device = NULL;
         _cleanup_free_ char *escaped_ss = NULL, *escaped_sysname = NULL, *escaped_path_id = NULL;
@@ -306,13 +332,11 @@ static int run(int argc, char *argv[]) {
         unsigned max_brightness;
         int r;
 
-        if (argc != 3) {
-                log_error("This program requires two arguments.");
-                return -EINVAL;
-        }
-
         log_setup_service();
 
+        if (argc != 3)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program requires two arguments.");
+
         umask(0022);
 
         r = mkdir_p("/var/lib/systemd/backlight", 0755);
@@ -320,19 +344,15 @@ static int run(int argc, char *argv[]) {
                 return log_error_errno(r, "Failed to create backlight directory /var/lib/systemd/backlight: %m");
 
         sysname = strchr(argv[2], ':');
-        if (!sysname) {
-                log_error("Requires a subsystem and sysname pair specifying a backlight device.");
-                return -EINVAL;
-        }
+        if (!sysname)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Requires a subsystem and sysname pair specifying a backlight device.");
 
         ss = strndupa(argv[2], sysname - argv[2]);
 
         sysname++;
 
-        if (!STR_IN_SET(ss, "backlight", "leds")) {
-                log_error("Not a backlight or LED device: '%s:%s'", ss, sysname);
-                return -EINVAL;
-        }
+        if (!STR_IN_SET(ss, "backlight", "leds"))
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Not a backlight or LED device: '%s:%s'", ss, sysname);
 
         r = sd_device_new_from_subsystem_sysname(&device, ss, sysname);
         if (r < 0)
@@ -391,9 +411,9 @@ static int run(int argc, char *argv[]) {
                         if (!clamp)
                                 return 0;
 
-                        r = sd_device_get_sysattr_value(device, "brightness", &curval);
+                        r = read_brightness(device, &curval);
                         if (r < 0)
-                                return log_device_warning_errno(device, r, "Failed to read 'brightness' attribute: %m");
+                                return log_device_error_errno(device, r, "Failed to read current brightness: %m");
 
                         value = strdup(curval);
                         if (!value)
@@ -416,18 +436,16 @@ static int run(int argc, char *argv[]) {
                         return 0;
                 }
 
-                r = sd_device_get_sysattr_value(device, "brightness", &value);
+                r = read_brightness(device, &value);
                 if (r < 0)
-                        return log_device_error_errno(device, r, "Failed to read system 'brightness' attribute: %m");
+                        return log_device_error_errno(device, r, "Failed to read current brightness: %m");
 
                 r = write_string_file(saved, value, WRITE_STRING_FILE_CREATE);
                 if (r < 0)
                         return log_device_error_errno(device, r, "Failed to write %s: %m", saved);
 
-        } else {
-                log_error("Unknown verb %s.", argv[1]);
-                return -EINVAL;
-        }
+        } else
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown verb %s.", argv[1]);
 
         return 0;
 }
index 5ebe5b24832c0d58d806ffed3a6db7ca819dc63c..888ef236642e8a4ca696b19f18ad2898a0087fec 100644 (file)
@@ -7,7 +7,7 @@
 #include "device-nodes.h"
 #include "utf8.h"
 
-int whitelisted_char_for_devnode(char c, const char *white) {
+int allow_listed_char_for_devnode(char c, const char *white) {
 
         if ((c >= '0' && c <= '9') ||
             (c >= 'A' && c <= 'Z') ||
@@ -38,7 +38,7 @@ int encode_devnode_name(const char *str, char *str_enc, size_t len) {
                         j += seqlen;
                         i += (seqlen-1);
 
-                } else if (str[i] == '\\' || !whitelisted_char_for_devnode(str[i], NULL)) {
+                } else if (str[i] == '\\' || !allow_listed_char_for_devnode(str[i], NULL)) {
 
                         if (len-j < 4)
                                 return -EINVAL;
index 3840e6d307a78d5d0eff7aac06620ec01bee9a67..0dad8c9c681cd46c4096e750febe336b39251387 100644 (file)
@@ -8,7 +8,7 @@
 #include "stdio-util.h"
 
 int encode_devnode_name(const char *str, char *str_enc, size_t len);
-int whitelisted_char_for_devnode(char c, const char *additional);
+int allow_listed_char_for_devnode(char c, const char *additional);
 
 #define DEV_NUM_PATH_MAX                                                \
         (STRLEN("/dev/block/") + DECIMAL_STR_MAX(dev_t) + 1 + DECIMAL_STR_MAX(dev_t))
diff --git a/src/basic/dlfcn-util.h b/src/basic/dlfcn-util.h
new file mode 100644 (file)
index 0000000..d254afb
--- /dev/null
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include <dlfcn.h>
+
+#include "macro.h"
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(void*, dlclose);
index e7edd17d0b0bd7482270e5174580664c2dbc30d3..007137cf01277aa5eb4ddbaad04b41e8e7eb869b 100644 (file)
@@ -210,9 +210,9 @@ int efi_set_variable(
         if (!p)
                 return -ENOMEM;
 
-        /* Newer efivarfs protects variables that are not in a whitelist with FS_IMMUTABLE_FL by default, to protect
-         * them for accidental removal and modification. We are not changing these variables accidentally however,
-         * hence let's unset the bit first. */
+        /* Newer efivarfs protects variables that are not in an allow list with FS_IMMUTABLE_FL by default,
+         * to protect them for accidental removal and modification. We are not changing these variables
+         * accidentally however, hence let's unset the bit first. */
 
         r = chattr_path(p, 0, FS_IMMUTABLE_FL, &saved_flags);
         if (r < 0 && r != -ENOENT)
index 943bc56319df28fd8373c7aa0e7bd49e1d44dd2f..34a2260783bb1c94dff6b65710d9673b1084f114 100644 (file)
@@ -1576,7 +1576,7 @@ static int blockdev_is_encrypted(const char *sysfs_path, unsigned depth_left) {
 
         d = opendir(p);
         if (!d) {
-                if (errno == ENOENT) /* Doesn't have slaves */
+                if (errno == ENOENT) /* Doesn't have underlying devices */
                         return false;
 
                 return -errno;
@@ -1592,7 +1592,7 @@ static int blockdev_is_encrypted(const char *sysfs_path, unsigned depth_left) {
                         if (errno != 0)
                                 return -errno;
 
-                        break; /* No more slaves */
+                        break; /* No more underlying devices */
                 }
 
                 q = path_join(p, de->d_name);
index 15c8c4723c0480a2499da376d88f8bd50eb844e8..67c439123078d154afd49e2e7b34e926b349c20e 100644 (file)
@@ -768,7 +768,7 @@ static void reset_direct_storage(HashmapBase *h) {
         memset(p, DIB_RAW_INIT, sizeof(dib_raw_t) * hi->n_direct_buckets);
 }
 
-static struct HashmapBase *hashmap_base_new(const struct hash_ops *hash_ops, enum HashmapType type HASHMAP_DEBUG_PARAMS) {
+static struct HashmapBase *hashmap_base_new(const struct hash_ops *hash_ops, enum HashmapType type  HASHMAP_DEBUG_PARAMS) {
         HashmapBase *h;
         const struct hashmap_type_info *hi = &hashmap_type_info[type];
         bool up;
@@ -808,19 +808,19 @@ static struct HashmapBase *hashmap_base_new(const struct hash_ops *hash_ops, enu
 }
 
 Hashmap *_hashmap_new(const struct hash_ops *hash_ops  HASHMAP_DEBUG_PARAMS) {
-        return (Hashmap*)        hashmap_base_new(hash_ops, HASHMAP_TYPE_PLAIN HASHMAP_DEBUG_PASS_ARGS);
+        return (Hashmap*)        hashmap_base_new(hash_ops, HASHMAP_TYPE_PLAIN  HASHMAP_DEBUG_PASS_ARGS);
 }
 
 OrderedHashmap *_ordered_hashmap_new(const struct hash_ops *hash_ops  HASHMAP_DEBUG_PARAMS) {
-        return (OrderedHashmap*) hashmap_base_new(hash_ops, HASHMAP_TYPE_ORDERED HASHMAP_DEBUG_PASS_ARGS);
+        return (OrderedHashmap*) hashmap_base_new(hash_ops, HASHMAP_TYPE_ORDERED  HASHMAP_DEBUG_PASS_ARGS);
 }
 
 Set *_set_new(const struct hash_ops *hash_ops  HASHMAP_DEBUG_PARAMS) {
-        return (Set*)            hashmap_base_new(hash_ops, HASHMAP_TYPE_SET HASHMAP_DEBUG_PASS_ARGS);
+        return (Set*)            hashmap_base_new(hash_ops, HASHMAP_TYPE_SET  HASHMAP_DEBUG_PASS_ARGS);
 }
 
 static int hashmap_base_ensure_allocated(HashmapBase **h, const struct hash_ops *hash_ops,
-                                         enum HashmapType type HASHMAP_DEBUG_PARAMS) {
+                                         enum HashmapType type  HASHMAP_DEBUG_PARAMS) {
         HashmapBase *q;
 
         assert(h);
@@ -828,7 +828,7 @@ static int hashmap_base_ensure_allocated(HashmapBase **h, const struct hash_ops
         if (*h)
                 return 0;
 
-        q = hashmap_base_new(hash_ops, type HASHMAP_DEBUG_PASS_ARGS);
+        q = hashmap_base_new(hash_ops, type  HASHMAP_DEBUG_PASS_ARGS);
         if (!q)
                 return -ENOMEM;
 
@@ -837,15 +837,15 @@ static int hashmap_base_ensure_allocated(HashmapBase **h, const struct hash_ops
 }
 
 int _hashmap_ensure_allocated(Hashmap **h, const struct hash_ops *hash_ops  HASHMAP_DEBUG_PARAMS) {
-        return hashmap_base_ensure_allocated((HashmapBase**)h, hash_ops, HASHMAP_TYPE_PLAIN HASHMAP_DEBUG_PASS_ARGS);
+        return hashmap_base_ensure_allocated((HashmapBase**)h, hash_ops, HASHMAP_TYPE_PLAIN  HASHMAP_DEBUG_PASS_ARGS);
 }
 
 int _ordered_hashmap_ensure_allocated(OrderedHashmap **h, const struct hash_ops *hash_ops  HASHMAP_DEBUG_PARAMS) {
-        return hashmap_base_ensure_allocated((HashmapBase**)h, hash_ops, HASHMAP_TYPE_ORDERED HASHMAP_DEBUG_PASS_ARGS);
+        return hashmap_base_ensure_allocated((HashmapBase**)h, hash_ops, HASHMAP_TYPE_ORDERED  HASHMAP_DEBUG_PASS_ARGS);
 }
 
 int _set_ensure_allocated(Set **s, const struct hash_ops *hash_ops  HASHMAP_DEBUG_PARAMS) {
-        return hashmap_base_ensure_allocated((HashmapBase**)s, hash_ops, HASHMAP_TYPE_SET HASHMAP_DEBUG_PASS_ARGS);
+        return hashmap_base_ensure_allocated((HashmapBase**)s, hash_ops, HASHMAP_TYPE_SET  HASHMAP_DEBUG_PASS_ARGS);
 }
 
 static void hashmap_free_no_clear(HashmapBase *h) {
@@ -1247,6 +1247,30 @@ int set_put(Set *s, const void *key) {
         return hashmap_put_boldly(s, hash, &swap, true);
 }
 
+int _set_ensure_put(Set **s, const struct hash_ops *hash_ops, const void *key  HASHMAP_DEBUG_PARAMS) {
+        int r;
+
+        r = _set_ensure_allocated(s, hash_ops  HASHMAP_DEBUG_PASS_ARGS);
+        if (r < 0)
+                return r;
+
+        return set_put(*s, key);
+}
+
+int _set_ensure_consume(Set **s, const struct hash_ops *hash_ops, void *key  HASHMAP_DEBUG_PARAMS) {
+        int r;
+
+        r = _set_ensure_put(s, hash_ops, key  HASHMAP_DEBUG_PASS_ARGS);
+        if (r <= 0) {
+                if (hash_ops && hash_ops->free_key)
+                        hash_ops->free_key(key);
+                else
+                        free(key);
+        }
+
+        return r;
+}
+
 int hashmap_replace(Hashmap *h, const void *key, void *value) {
         struct swap_entries swap;
         struct plain_hashmap_entry *e;
@@ -1687,13 +1711,13 @@ int _hashmap_move_one(HashmapBase *h, HashmapBase *other, const void *key) {
         return 0;
 }
 
-HashmapBase *_hashmap_copy(HashmapBase *h) {
+HashmapBase *_hashmap_copy(HashmapBase *h  HASHMAP_DEBUG_PARAMS) {
         HashmapBase *copy;
         int r;
 
         assert(h);
 
-        copy = hashmap_base_new(h->hash_ops, h->type  HASHMAP_DEBUG_SRC_ARGS);
+        copy = hashmap_base_new(h->hash_ops, h->type  HASHMAP_DEBUG_PASS_ARGS);
         if (!copy)
                 return NULL;
 
@@ -1709,10 +1733,8 @@ HashmapBase *_hashmap_copy(HashmapBase *h) {
                 assert_not_reached("Unknown hashmap type");
         }
 
-        if (r < 0) {
-                _hashmap_free(copy, false, false);
-                return NULL;
-        }
+        if (r < 0)
+                return _hashmap_free(copy, false, false);
 
         return copy;
 }
@@ -1765,10 +1787,10 @@ int set_consume(Set *s, void *value) {
         return r;
 }
 
-int hashmap_put_strdup(Hashmap **h, const char *k, const char *v) {
+int _hashmap_put_strdup(Hashmap **h, const char *k, const char *v  HASHMAP_DEBUG_PARAMS) {
         int r;
 
-        r = hashmap_ensure_allocated(h, &string_hash_ops_free_free);
+        r = _hashmap_ensure_allocated(h, &string_hash_ops_free_free  HASHMAP_DEBUG_PASS_ARGS);
         if (r < 0)
                 return r;
 
@@ -1799,14 +1821,14 @@ int hashmap_put_strdup(Hashmap **h, const char *k, const char *v) {
         return r;
 }
 
-int set_put_strdup(Set **s, const char *p) {
+int _set_put_strdup(Set **s, const char *p  HASHMAP_DEBUG_PARAMS) {
         char *c;
         int r;
 
         assert(s);
         assert(p);
 
-        r = set_ensure_allocated(s, &string_hash_ops_free);
+        r = _set_ensure_allocated(s, &string_hash_ops_free  HASHMAP_DEBUG_PASS_ARGS);
         if (r < 0)
                 return r;
 
@@ -1820,14 +1842,14 @@ int set_put_strdup(Set **s, const char *p) {
         return set_consume(*s, c);
 }
 
-int set_put_strdupv(Set **s, char **l) {
+int _set_put_strdupv(Set **s, char **l  HASHMAP_DEBUG_PARAMS) {
         int n = 0, r;
         char **i;
 
         assert(s);
 
         STRV_FOREACH(i, l) {
-                r = set_put_strdup(s, *i);
+                r = _set_put_strdup(s, *i  HASHMAP_DEBUG_PASS_ARGS);
                 if (r < 0)
                         return r;
 
index 230d322213bae8e610e1716401a9637c96a7f9a1..6009441621596c310afbabd8466631f0744a8c56 100644 (file)
@@ -128,13 +128,9 @@ static inline OrderedHashmap *ordered_hashmap_free_free_free(OrderedHashmap *h)
 IteratedCache *iterated_cache_free(IteratedCache *cache);
 int iterated_cache_get(IteratedCache *cache, const void ***res_keys, const void ***res_values, unsigned *res_n_entries);
 
-HashmapBase *_hashmap_copy(HashmapBase *h);
-static inline Hashmap *hashmap_copy(Hashmap *h) {
-        return (Hashmap*) _hashmap_copy(HASHMAP_BASE(h));
-}
-static inline OrderedHashmap *ordered_hashmap_copy(OrderedHashmap *h) {
-        return (OrderedHashmap*) _hashmap_copy(HASHMAP_BASE(h));
-}
+HashmapBase *_hashmap_copy(HashmapBase *h  HASHMAP_DEBUG_PARAMS);
+#define hashmap_copy(h) ((Hashmap*) _hashmap_copy(HASHMAP_BASE(h)  HASHMAP_DEBUG_SRC_ARGS))
+#define ordered_hashmap_copy(h) ((OrderedHashmap*) _hashmap_copy(HASHMAP_BASE(h)  HASHMAP_DEBUG_SRC_ARGS))
 
 int _hashmap_ensure_allocated(Hashmap **h, const struct hash_ops *hash_ops  HASHMAP_DEBUG_PARAMS);
 int _ordered_hashmap_ensure_allocated(OrderedHashmap **h, const struct hash_ops *hash_ops  HASHMAP_DEBUG_PARAMS);
@@ -154,7 +150,8 @@ static inline int ordered_hashmap_put(OrderedHashmap *h, const void *key, void *
         return hashmap_put(PLAIN_HASHMAP(h), key, value);
 }
 
-int hashmap_put_strdup(Hashmap **h, const char *k, const char *v);
+int _hashmap_put_strdup(Hashmap **h, const char *k, const char *v  HASHMAP_DEBUG_PARAMS);
+#define hashmap_put_strdup(h, k, v) _hashmap_put_strdup(h, k, v  HASHMAP_DEBUG_SRC_ARGS)
 
 int hashmap_update(Hashmap *h, const void *key, void *value);
 static inline int ordered_hashmap_update(OrderedHashmap *h, const void *key, void *value) {
index 01af759a7dc6a7334a3f7edf880dac8b2a4b6b52..8e6a12b602fc3f4a363da9fe73df07862b40e14d 100644 (file)
@@ -373,7 +373,8 @@ const char *special_glyph(SpecialGlyph code) {
                         [SPECIAL_GLYPH_SLIGHTLY_UNHAPPY_SMILEY] = ":-(",
                         [SPECIAL_GLYPH_UNHAPPY_SMILEY]          = ":-{",
                         [SPECIAL_GLYPH_DEPRESSED_SMILEY]        = ":-[",
-                        [SPECIAL_GLYPH_LOCK_AND_KEY]            = "o-,"
+                        [SPECIAL_GLYPH_LOCK_AND_KEY]            = "o-,",
+                        [SPECIAL_GLYPH_TOUCH]                   = "O=",    /* Yeah, not very convincing, can you do it better? */
                 },
 
                 /* UTF-8 */
@@ -415,6 +416,9 @@ const char *special_glyph(SpecialGlyph code) {
 
                         /* This emoji is a single character cell glyph in Unicode, and three in ASCII */
                         [SPECIAL_GLYPH_LOCK_AND_KEY]            = "\360\237\224\220",         /* 🔐 (actually called: CLOSED LOCK WITH KEY) */
+
+                        /* This emoji is a single character cell glyph in Unicode, and two in ASCII */
+                        [SPECIAL_GLYPH_TOUCH]                   = "\360\237\221\206",         /* 👆 (actually called: BACKHAND INDEX POINTING UP */
                 },
         };
 
index e4f9711b087a3d90cb3f403fa0ce40019a1c94b0..aa25e17f154596ce6803efbd6d1e4f0bc6bbb762 100644 (file)
@@ -65,7 +65,8 @@ typedef enum {
         SPECIAL_GLYPH_UNHAPPY_SMILEY,
         SPECIAL_GLYPH_DEPRESSED_SMILEY,
         SPECIAL_GLYPH_LOCK_AND_KEY,
-        _SPECIAL_GLYPH_MAX
+        SPECIAL_GLYPH_TOUCH,
+        _SPECIAL_GLYPH_MAX,
 } SpecialGlyph;
 
 const char *special_glyph(SpecialGlyph code) _const_;
index 893181b23d65aba23864e9ac77beb22ac1bb1544..c6fe20380830b9e6ff78ac869b392c213798565e 100644 (file)
@@ -1146,16 +1146,20 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
 }
 
 void log_parse_environment_realm(LogRealm realm) {
-        /* Do not call from library code. */
-
-        const char *e;
-
         if (getpid_cached() == 1 || get_ctty_devnr(0, NULL) < 0)
                 /* Only try to read the command line in daemons. We assume that anything that has a
                  * controlling tty is user stuff. For PID1 we do a special check in case it hasn't
                  * closed the console yet. */
                 (void) proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
 
+        log_parse_environment_cli_realm(realm);
+}
+
+void log_parse_environment_cli_realm(LogRealm realm) {
+        /* Do not call from library code. */
+
+        const char *e;
+
         e = getenv("SYSTEMD_LOG_TARGET");
         if (e && log_set_target_from_string(e) < 0)
                 log_warning("Failed to parse log target '%s'. Ignoring.", e);
@@ -1430,3 +1434,11 @@ void log_setup_service(void) {
         log_parse_environment();
         (void) log_open();
 }
+
+void log_setup_cli(void) {
+        /* Sets up logging the way it is most appropriate for running a program as a CLI utility. */
+
+        log_show_color(true);
+        log_parse_environment_cli();
+        (void) log_open();
+}
index 2c1b00fb88f07d0c248e7f9fc015536238457115..15807d3029f95e76e20da8be0526223094e9b4bf 100644 (file)
@@ -84,8 +84,11 @@ void log_close(void);
 void log_forget_fds(void);
 
 void log_parse_environment_realm(LogRealm realm);
+void log_parse_environment_cli_realm(LogRealm realm);
 #define log_parse_environment() \
         log_parse_environment_realm(LOG_REALM)
+#define log_parse_environment_cli() \
+        log_parse_environment_cli_realm(LOG_REALM)
 
 int log_dispatch_internal(
                 int level,
@@ -341,3 +344,4 @@ int log_syntax_invalid_utf8_internal(
 #define DEBUG_LOGGING _unlikely_(log_get_max_level() >= LOG_DEBUG)
 
 void log_setup_service(void);
+void log_setup_cli(void);
index 78e4262e41dcf5ffc8d78a7bb479d5de1206ba9f..ceea8176f5b85321e7966b4e747c386f8ed79980 100644 (file)
@@ -286,6 +286,15 @@ static inline size_t GREEDY_ALLOC_ROUND_UP(size_t l) {
                 UNIQ_T(A, aq) < UNIQ_T(B, bq) ? UNIQ_T(A, aq) : UNIQ_T(B, bq); \
         })
 
+/* evaluates to (void) if _A or _B are not constant or of different types */
+#define CONST_MIN(_A, _B) \
+        (__builtin_choose_expr(                                         \
+                __builtin_constant_p(_A) &&                             \
+                __builtin_constant_p(_B) &&                             \
+                __builtin_types_compatible_p(typeof(_A), typeof(_B)),   \
+                ((_A) < (_B)) ? (_A) : (_B),                            \
+                VOID_0))
+
 #define MIN3(x, y, z)                                   \
         ({                                              \
                 const typeof(x) _c = MIN(x, y);         \
@@ -529,6 +538,12 @@ static inline int __coverity_check_and_return__(int condition) {
                 (y) = (_t);                        \
         } while (false)
 
+/* Iterates through a specified list of pointers. Accepts NULL pointers, but uses (void*) -1 as internal marker for EOL. */
+#define FOREACH_POINTER(p, x, ...)                                                      \
+        for (typeof(p) *_l = (typeof(p)[]) { ({ p = x; }), ##__VA_ARGS__, (void*) -1 }; \
+             p != (typeof(p)) (void*) -1;                                               \
+             p = *(++_l))
+
 /* Define C11 thread_local attribute even on older gcc compiler
  * version */
 #ifndef thread_local
index 5bb49ef4014b2cd9aa9008cc408fd21a00387c61..90924d6cb895525e1becade481fff0eb5a6600b6 100644 (file)
@@ -39,6 +39,7 @@ basic_sources = files('''
         device-nodes.h
         dirent-util.c
         dirent-util.h
+        dlfcn-util.h
         efivars.c
         efivars.h
         env-file.c
@@ -328,7 +329,8 @@ libbasic = static_library(
                         threads,
                         libcap,
                         libselinux,
-                        libm],
+                        libm,
+                        libdl],
         c_args : ['-fvisibility=default'],
         install : false)
 
index 1308a3d636a772a29a198075b56fa1281275b245..dd6bccd8700526181822265b85f6ad6cf861afbb 100644 (file)
 #undef  CAP_LAST_CAP
 #define CAP_LAST_CAP   CAP_AUDIT_READ
 #endif
+
+/* 980737282232b752bb14dab96d77665c15889c36 (5.8) */
+#ifndef CAP_PERFMON
+#define CAP_PERFMON 38
+
+#undef  CAP_LAST_CAP
+#define CAP_LAST_CAP   CAP_PERFMON
+#endif
+
+/* a17b53c4a4b55ec322c132b6670743612229ee9c (5.8) */
+#ifndef CAP_BPF
+#define CAP_BPF 39
+
+#undef  CAP_LAST_CAP
+#define CAP_LAST_CAP   CAP_BPF
+#endif
index b0168ae227caf2fee9344867e05b92f8cc119f60..b34c532604a5fe85b88e6fae3b49f32300d13de6 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <fcntl.h>
 #include <sys/ioctl.h>
+#include <sys/mount.h>
 
 #include "fd-util.h"
 #include "missing_fs.h"
@@ -169,3 +170,16 @@ int fd_is_network_ns(int fd) {
 
         return r == CLONE_NEWNET;
 }
+
+int detach_mount_namespace(void) {
+
+        /* Detaches the mount namespace, disabling propagation from our namespace to the host */
+
+        if (unshare(CLONE_NEWNS) < 0)
+                return -errno;
+
+        if (mount(NULL, "/", NULL, MS_SLAVE | MS_REC, NULL) < 0)
+                return -errno;
+
+        return 0;
+}
index 8c17ce91b21ca4aa781a7c46239734c4e9be870f..99d9b977edf118614406faa34f23381040a9acf1 100644 (file)
@@ -7,3 +7,5 @@ int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *
 int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd);
 
 int fd_is_network_ns(int fd);
+
+int detach_mount_namespace(void);
index f6ecc7f86f5438433e45cf693051d185f5c4eac9..80f13048c1065e033daa42c59be79e453d4c318b 100644 (file)
@@ -1334,7 +1334,7 @@ int safe_fork_full(
 
                 ppid = getppid();
                 if (ppid == 0)
-                        /* Parent is in a differn't PID namespace. */;
+                        /* Parent is in a different PID namespace. */;
                 else if (ppid != original_pid) {
                         log_debug("Parent died early, raising SIGTERM.");
                         (void) raise(SIGTERM);
index 73cc7272db41cfd8c2331da5030043f6e31b8b1c..6eeed9af346cc9037fae96fd240d79efdaa61d6e 100644 (file)
@@ -7,11 +7,13 @@
 #include <elf.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <linux/random.h>
 #include <pthread.h>
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/ioctl.h>
 #include <sys/time.h>
 
 #if HAVE_SYS_AUXV_H
@@ -75,7 +77,7 @@ int rdrand(unsigned long *ret) {
          *           hash functions for its hash tables, with a seed generated randomly. The hash tables
          *           systemd employs watch the fill level closely and reseed if necessary. This allows use of
          *           a low quality RNG initially, as long as it improves should a hash table be under attack:
-         *           the attacker after all needs to to trigger many collisions to exploit it for the purpose
+         *           the attacker after all needs to trigger many collisions to exploit it for the purpose
          *           of DoS, but if doing so improves the seed the attack surface is reduced as the attack
          *           takes place.
          *
@@ -438,3 +440,36 @@ size_t random_pool_size(void) {
         /* Use the minimum as default, if we can't retrieve the correct value */
         return RANDOM_POOL_SIZE_MIN;
 }
+
+int random_write_entropy(int fd, const void *seed, size_t size, bool credit) {
+        int r;
+
+        assert(fd >= 0);
+        assert(seed && size > 0);
+
+        if (credit) {
+                _cleanup_free_ struct rand_pool_info *info = NULL;
+
+                /* The kernel API only accepts "int" as entropy count (which is in bits), let's avoid any
+                 * chance for confusion here. */
+                if (size > INT_MAX / 8)
+                        return -EOVERFLOW;
+
+                info = malloc(offsetof(struct rand_pool_info, buf) + size);
+                if (!info)
+                        return -ENOMEM;
+
+                info->entropy_count = size * 8;
+                info->buf_size = size;
+                memcpy(info->buf, seed, size);
+
+                if (ioctl(fd, RNDADDENTROPY, info) < 0)
+                        return -errno;
+        } else {
+                r = loop_write(fd, seed, size, false);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
index d8e067d96e877af94aaa00fea1e1454eb6d1ee59..7824ffacebb9255ac81783b5866acc6afb6600e0 100644 (file)
@@ -38,3 +38,5 @@ int rdrand(unsigned long *ret);
 #define RANDOM_POOL_SIZE_MAX (10U*1024U*1024U)
 
 size_t random_pool_size(void);
+
+int random_write_entropy(int fd, const void *seed, size_t size, bool credit);
index 0d7a7e1fbed9d53c075dd616dca211218588b0d7..80bd65b1558d1a9376b50005c8a122a687c04978 100644 (file)
@@ -122,7 +122,7 @@ int mac_selinux_init(void) {
 
         label_hnd = selabel_open(SELABEL_CTX_FILE, NULL, 0);
         if (!label_hnd)
-                return log_enforcing_errno(errno, "Failed to initialize SELinux context: %m");
+                return log_enforcing_errno(errno, "Failed to initialize SELinux labeling handle: %m");
 
         after_timestamp = now(CLOCK_MONOTONIC);
         after_mallinfo = mallinfo();
@@ -376,13 +376,9 @@ int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *
 char* mac_selinux_free(char *label) {
 
 #if HAVE_SELINUX
-        if (!label)
-                return NULL;
-
-        if (!mac_selinux_use())
-                return NULL;
-
         freecon(label);
+#else
+        assert(!label);
 #endif
 
         return NULL;
index 621e83bf2773a6b1d40e03d6fb8d173b9f8f0e4a..e4fc1e3c4a01755fbd76873f8a45efee8879c782 100644 (file)
@@ -26,9 +26,7 @@ static inline Set *set_free_free(Set *s) {
 
 /* no set_free_free_free */
 
-static inline Set *set_copy(Set *s) {
-        return (Set*) _hashmap_copy(HASHMAP_BASE(s));
-}
+#define set_copy(s) ((Set*) _hashmap_copy(HASHMAP_BASE(h)  HASHMAP_DEBUG_SRC_ARGS))
 
 int _set_ensure_allocated(Set **s, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS);
 #define set_ensure_allocated(h, ops) _set_ensure_allocated(h, ops HASHMAP_DEBUG_SRC_ARGS)
@@ -120,9 +118,19 @@ static inline char **set_get_strv(Set *s) {
         return _hashmap_get_strv(HASHMAP_BASE(s));
 }
 
+int _set_ensure_put(Set **s, const struct hash_ops *hash_ops, const void *key  HASHMAP_DEBUG_PARAMS);
+#define set_ensure_put(s, hash_ops, key) _set_ensure_put(s, hash_ops, key  HASHMAP_DEBUG_SRC_ARGS)
+
+int _set_ensure_consume(Set **s, const struct hash_ops *hash_ops, void *key  HASHMAP_DEBUG_PARAMS);
+#define set_ensure_consume(s, hash_ops, key) _set_ensure_consume(s, hash_ops, key  HASHMAP_DEBUG_SRC_ARGS)
+
 int set_consume(Set *s, void *value);
-int set_put_strdup(Set **s, const char *p);
-int set_put_strdupv(Set **s, char **l);
+
+int _set_put_strdup(Set **s, const char *p  HASHMAP_DEBUG_PARAMS);
+#define set_put_strdup(s, p) _set_put_strdup(s, p  HASHMAP_DEBUG_SRC_ARGS)
+int _set_put_strdupv(Set **s, char **l  HASHMAP_DEBUG_PARAMS);
+#define set_put_strdupv(s, l) _set_put_strdupv(s, l  HASHMAP_DEBUG_SRC_ARGS)
+
 int set_put_strsplit(Set *s, const char *v, const char *separators, ExtractFlags flags);
 
 #define SET_FOREACH(e, s, i) \
index 07f534f34d1f174972087c79f5df48887683eeb2..fb1265985786c711daee7008b2293eed2ea95bb6 100644 (file)
@@ -105,7 +105,7 @@ int socket_address_verify(const SocketAddress *a, bool strict) {
                                 if (a->size != offsetof(struct sockaddr_un, sun_path) + (e - a->sockaddr.un.sun_path) + 1)
                                         return -EINVAL;
                         } else {
-                                /* If there's no embedded NUL byte, then then the size needs to match the whole
+                                /* If there's no embedded NUL byte, then the size needs to match the whole
                                  * structure or the structure with one extra NUL byte suffixed. (Yeah, Linux is awful,
                                  * and considers both equivalent: getsockname() even extends sockaddr_un beyond its
                                  * size if the path is non NUL terminated.)*/
@@ -1130,6 +1130,7 @@ int socket_bind_to_ifname(int fd, const char *ifname) {
 
 int socket_bind_to_ifindex(int fd, int ifindex) {
         char ifname[IF_NAMESIZE + 1];
+        int r;
 
         assert(fd >= 0);
 
@@ -1141,10 +1142,9 @@ int socket_bind_to_ifindex(int fd, int ifindex) {
                 return 0;
         }
 
-        if (setsockopt(fd, SOL_SOCKET, SO_BINDTOIFINDEX, &ifindex, sizeof(ifindex)) >= 0)
-                return 0;
-        if (errno != ENOPROTOOPT)
-                return -errno;
+        r = setsockopt_int(fd, SOL_SOCKET, SO_BINDTOIFINDEX, ifindex);
+        if (r != -ENOPROTOOPT)
+                return r;
 
         /* Fall back to SO_BINDTODEVICE on kernels < 5.0 which didn't have SO_BINDTOIFINDEX */
         if (!format_ifname(ifindex, ifname))
index 9cbca312fcfcf0aad8dbaa400cfeb6f66ec379a8..a49f7eee702efa7778534e7fcf590d8459926a1e 100644 (file)
@@ -257,7 +257,7 @@ int open_tmpfile_linkable(const char *target, int flags, char **ret_path) {
         assert((flags & O_EXCL) == 0);
 
         /* Creates a temporary file, that shall be renamed to "target" later. If possible, this uses O_TMPFILE – in
-         * which case "ret_path" will be returned as NULL. If not possible a the tempoary path name used is returned in
+         * which case "ret_path" will be returned as NULL. If not possible the temporary path name used is returned in
          * "ret_path". Use link_tmpfile() below to rename the result after writing the file in full. */
 
         fd = open_parent(target, O_TMPFILE|flags, 0640);
index 10405b711f671bbfdd50575523e34731ec13288a..43d8b3477e17ed4ece831387afdf4aa63ac7cf24 100644 (file)
@@ -537,8 +537,7 @@ int unit_name_from_path(const char *path, const char *suffix, char **ret) {
 }
 
 int unit_name_from_path_instance(const char *prefix, const char *path, const char *suffix, char **ret) {
-        _cleanup_free_ char *p = NULL;
-        char *s;
+        _cleanup_free_ char *p = NULL, *s = NULL;
         int r;
 
         assert(prefix);
@@ -564,7 +563,7 @@ int unit_name_from_path_instance(const char *prefix, const char *path, const cha
         if (!unit_name_is_valid(s, UNIT_NAME_INSTANCE))
                 return -EINVAL;
 
-        *ret = s;
+        *ret = TAKE_PTR(s);
         return 0;
 }
 
index 7dd2f6664af6afee792110f95fd64e4ba77482b6..66f8856fdfdfb50f24beb61fa787767ff6d0b625 100644 (file)
@@ -777,7 +777,7 @@ bool valid_user_group_name(const char *u, ValidUserFlags flags) {
                         return false;
 
                 if (in_charset(u, "0123456789")) /* Don't allow fully numeric strings, they might be confused
-                                                  * with with UIDs (note that this test is more broad than
+                                                  * with UIDs (note that this test is more broad than
                                                   * the parse_uid() test above, as it will cover more than
                                                   * the 32bit range, and it will detect 65535 (which is in
                                                   * invalid UID, even though in the unsigned 32 bit range) */
index 8e000ee1196b98b0e20ab3dadb04386e441c41bc..56fb8d936760802d8f26d8045b5af3cbcb05ec8c 100644 (file)
@@ -371,7 +371,7 @@ static int list_bus_names(int argc, char **argv, void *userdata) {
         else
                 r = table_print(table, stdout);
         if (r < 0)
-                return log_error_errno(r, "Failed to show table: %m");
+                return table_log_print_error(r);
 
         return 0;
 }
@@ -2598,9 +2598,7 @@ static int busctl_main(int argc, char *argv[]) {
 static int run(int argc, char *argv[]) {
         int r;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index b55d7299cabf03529f44669af5a8d6578d01c6d2..939a391e21cc85edcf17031101ea81aa0da3465a 100644 (file)
@@ -164,9 +164,7 @@ static void show_cg_info(const char *controller, const char *path) {
 static int run(int argc, char *argv[]) {
         int r, output_flags;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index de25aaae5d1db02df04b08a60596ab30e139eb6d..e6c09d1b38bcc193e3b94af10e1c8bcff32c6abc 100644 (file)
@@ -908,9 +908,7 @@ static int run(int argc, char *argv[]) {
         CGroupMask mask;
         int r;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 566b56eb349ee667ea537b45fb9cc6af1db392ea..1f0519876653440831df9799e32cb7bdd6ba4be0 100644 (file)
@@ -912,13 +912,7 @@ static int automount_deserialize_item(Unit *u, const char *key, const char *valu
                 if (safe_atou(value, &token) < 0)
                         log_unit_debug(u, "Failed to parse token value: %s", value);
                 else {
-                        r = set_ensure_allocated(&a->tokens, NULL);
-                        if (r < 0) {
-                                log_oom();
-                                return 0;
-                        }
-
-                        r = set_put(a->tokens, UINT_TO_PTR(token));
+                        r = set_ensure_put(&a->tokens, NULL, UINT_TO_PTR(token));
                         if (r < 0)
                                 log_unit_error_errno(u, r, "Failed to add token to set: %m");
                 }
@@ -928,13 +922,7 @@ static int automount_deserialize_item(Unit *u, const char *key, const char *valu
                 if (safe_atou(value, &token) < 0)
                         log_unit_debug(u, "Failed to parse token value: %s", value);
                 else {
-                        r = set_ensure_allocated(&a->expire_tokens, NULL);
-                        if (r < 0) {
-                                log_oom();
-                                return 0;
-                        }
-
-                        r = set_put(a->expire_tokens, UINT_TO_PTR(token));
+                        r = set_ensure_put(&a->expire_tokens, NULL, UINT_TO_PTR(token));
                         if (r < 0)
                                 log_unit_error_errno(u, r, "Failed to add expire token to set: %m");
                 }
@@ -1010,13 +998,7 @@ static int automount_dispatch_io(sd_event_source *s, int fd, uint32_t events, vo
                 } else
                         log_unit_debug(UNIT(a), "Got direct mount request on %s", a->where);
 
-                r = set_ensure_allocated(&a->tokens, NULL);
-                if (r < 0) {
-                        log_unit_error(UNIT(a), "Failed to allocate token set.");
-                        goto fail;
-                }
-
-                r = set_put(a->tokens, UINT_TO_PTR(packet.v5_packet.wait_queue_token));
+                r = set_ensure_put(&a->tokens, NULL, UINT_TO_PTR(packet.v5_packet.wait_queue_token));
                 if (r < 0) {
                         log_unit_error_errno(UNIT(a), r, "Failed to remember token: %m");
                         goto fail;
@@ -1030,13 +1012,7 @@ static int automount_dispatch_io(sd_event_source *s, int fd, uint32_t events, vo
 
                 automount_stop_expire(a);
 
-                r = set_ensure_allocated(&a->expire_tokens, NULL);
-                if (r < 0) {
-                        log_unit_error(UNIT(a), "Failed to allocate token set.");
-                        goto fail;
-                }
-
-                r = set_put(a->expire_tokens, UINT_TO_PTR(packet.v5_packet.wait_queue_token));
+                r = set_ensure_put(&a->expire_tokens, NULL, UINT_TO_PTR(packet.v5_packet.wait_queue_token));
                 if (r < 0) {
                         log_unit_error_errno(UNIT(a), r, "Failed to remember token: %m");
                         goto fail;
@@ -1109,6 +1085,7 @@ const UnitVTable automount_vtable = {
                 "Unit\0"
                 "Automount\0"
                 "Install\0",
+        .private_section = "Automount",
 
         .can_transient = true,
         .can_fail = true,
index 07ef9f67771876f5b6addce3afd4e03218fbb9ba..34320e88fb2e701381c6dcb3a0e794f2d0a46576 100644 (file)
@@ -38,7 +38,7 @@ static int bpf_access_type(const char *acc) {
         return r;
 }
 
-static int bpf_prog_whitelist_device(
+static int bpf_prog_allow_list_device(
                 BPFProgram *prog,
                 char type,
                 int major,
@@ -80,7 +80,7 @@ static int bpf_prog_whitelist_device(
         return r;
 }
 
-static int bpf_prog_whitelist_major(
+static int bpf_prog_allow_list_major(
                 BPFProgram *prog,
                 char type,
                 int major,
@@ -120,7 +120,7 @@ static int bpf_prog_whitelist_major(
         return r;
 }
 
-static int bpf_prog_whitelist_class(
+static int bpf_prog_allow_list_class(
                 BPFProgram *prog,
                 char type,
                 const char *acc) {
@@ -161,7 +161,7 @@ static int bpf_prog_whitelist_class(
 int bpf_devices_cgroup_init(
                 BPFProgram **ret,
                 CGroupDevicePolicy policy,
-                bool whitelist) {
+                bool allow_list) {
 
         const struct bpf_insn pre_insn[] = {
                 /* load device type to r2 */
@@ -188,14 +188,14 @@ int bpf_devices_cgroup_init(
 
         assert(ret);
 
-        if (policy == CGROUP_DEVICE_POLICY_AUTO && !whitelist)
+        if (policy == CGROUP_DEVICE_POLICY_AUTO && !allow_list)
                 return 0;
 
         r = bpf_program_new(BPF_PROG_TYPE_CGROUP_DEVICE, &prog);
         if (r < 0)
                 return log_error_errno(r, "Loading device control BPF program failed: %m");
 
-        if (policy == CGROUP_DEVICE_POLICY_CLOSED || whitelist) {
+        if (policy == CGROUP_DEVICE_POLICY_CLOSED || allow_list) {
                 r = bpf_program_add_instructions(prog, pre_insn, ELEMENTSOF(pre_insn));
                 if (r < 0)
                         return log_error_errno(r, "Extending device control BPF program failed: %m");
@@ -209,7 +209,7 @@ int bpf_devices_cgroup_init(
 int bpf_devices_apply_policy(
                 BPFProgram *prog,
                 CGroupDevicePolicy policy,
-                bool whitelist,
+                bool allow_list,
                 const char *cgroup_path,
                 BPFProgram **prog_installed) {
 
@@ -221,7 +221,7 @@ int bpf_devices_apply_policy(
         if (!prog)
                 goto finish;
 
-        const bool deny_everything = policy == CGROUP_DEVICE_POLICY_STRICT && !whitelist;
+        const bool deny_everything = policy == CGROUP_DEVICE_POLICY_STRICT && !allow_list;
 
         const struct bpf_insn post_insn[] = {
                 /* return DENY */
@@ -325,7 +325,7 @@ int bpf_devices_supported(void) {
         return supported = 1;
 }
 
-static int whitelist_device_pattern(
+static int allow_list_device_pattern(
                 BPFProgram *prog,
                 const char *path,
                 char type,
@@ -340,11 +340,11 @@ static int whitelist_device_pattern(
                         return 0;
 
                 if (maj && min)
-                        return bpf_prog_whitelist_device(prog, type, *maj, *min, acc);
+                        return bpf_prog_allow_list_device(prog, type, *maj, *min, acc);
                 else if (maj)
-                        return bpf_prog_whitelist_major(prog, type, *maj, acc);
+                        return bpf_prog_allow_list_major(prog, type, *maj, acc);
                 else
-                        return bpf_prog_whitelist_class(prog, type, acc);
+                        return bpf_prog_allow_list_class(prog, type, acc);
 
         } else {
                 char buf[2+DECIMAL_STR_MAX(unsigned)*2+2+4];
@@ -369,7 +369,7 @@ static int whitelist_device_pattern(
         }
 }
 
-int bpf_devices_whitelist_device(
+int bpf_devices_allow_list_device(
                 BPFProgram *prog,
                 const char *path,
                 const char *node,
@@ -405,10 +405,10 @@ int bpf_devices_whitelist_device(
         }
 
         unsigned maj = major(rdev), min = minor(rdev);
-        return whitelist_device_pattern(prog, path, S_ISCHR(mode) ? 'c' : 'b', &maj, &min, acc);
+        return allow_list_device_pattern(prog, path, S_ISCHR(mode) ? 'c' : 'b', &maj, &min, acc);
 }
 
-int bpf_devices_whitelist_major(
+int bpf_devices_allow_list_major(
                 BPFProgram *prog,
                 const char *path,
                 const char *name,
@@ -424,12 +424,12 @@ int bpf_devices_whitelist_major(
 
         if (streq(name, "*"))
                 /* If the name is a wildcard, then apply this list to all devices of this type */
-                return whitelist_device_pattern(prog, path, type, NULL, NULL, acc);
+                return allow_list_device_pattern(prog, path, type, NULL, NULL, acc);
 
         if (safe_atou(name, &maj) >= 0 && DEVICE_MAJOR_VALID(maj))
                 /* The name is numeric and suitable as major. In that case, let's take its major, and create
                  * the entry directly. */
-                return whitelist_device_pattern(prog, path, type, &maj, NULL, acc);
+                return allow_list_device_pattern(prog, path, type, &maj, NULL, acc);
 
         _cleanup_fclose_ FILE *f = NULL;
         bool good = false, any = false;
@@ -486,17 +486,17 @@ int bpf_devices_whitelist_major(
                         continue;
 
                 any = true;
-                (void) whitelist_device_pattern(prog, path, type, &maj, NULL, acc);
+                (void) allow_list_device_pattern(prog, path, type, &maj, NULL, acc);
         }
 
         if (!any)
                 return log_debug_errno(SYNTHETIC_ERRNO(ENOENT),
-                                       "Device whitelist pattern \"%s\" did not match anything.", name);
+                                       "Device allow list pattern \"%s\" did not match anything.", name);
 
         return 0;
 }
 
-int bpf_devices_whitelist_static(
+int bpf_devices_allow_list_static(
                 BPFProgram *prog,
                 const char *path) {
 
@@ -515,13 +515,13 @@ int bpf_devices_whitelist_static(
 
         const char *node, *acc;
         NULSTR_FOREACH_PAIR(node, acc, auto_devices) {
-                k = bpf_devices_whitelist_device(prog, path, node, acc);
+                k = bpf_devices_allow_list_device(prog, path, node, acc);
                 if (r >= 0 && k < 0)
                         r = k;
         }
 
         /* PTS (/dev/pts) devices may not be duplicated, but accessed */
-        k = bpf_devices_whitelist_major(prog, path, "pts", 'c', "rw");
+        k = bpf_devices_allow_list_major(prog, path, "pts", 'c', "rw");
         if (r >= 0 && k < 0)
                 r = k;
 
index 4a5f4b1fb1895f57eba0e2ac017c1a71a9802c06..e2a08016e374e094355d830a39d1eaf0965355a9 100644 (file)
@@ -7,15 +7,15 @@
 
 typedef struct BPFProgram BPFProgram;
 
-int bpf_devices_cgroup_init(BPFProgram **ret, CGroupDevicePolicy policy, bool whitelist);
+int bpf_devices_cgroup_init(BPFProgram **ret, CGroupDevicePolicy policy, bool allow_list);
 int bpf_devices_apply_policy(
                 BPFProgram *prog,
                 CGroupDevicePolicy policy,
-                bool whitelist,
+                bool allow_list,
                 const char *cgroup_path,
                 BPFProgram **prog_installed);
 
 int bpf_devices_supported(void);
-int bpf_devices_whitelist_device(BPFProgram *prog, const char *path, const char *node, const char *acc);
-int bpf_devices_whitelist_major(BPFProgram *prog, const char *path, const char *name, char type, const char *acc);
-int bpf_devices_whitelist_static(BPFProgram *prog, const char *path);
+int bpf_devices_allow_list_device(BPFProgram *prog, const char *path, const char *node, const char *acc);
+int bpf_devices_allow_list_major(BPFProgram *prog, const char *path, const char *name, char type, const char *acc);
+int bpf_devices_allow_list_static(BPFProgram *prog, const char *path);
index 96c1a28b4fd02adb70e939b564afec32c54c11fb..bceb049b58b6604d206000d6aafec58bf329ca9e 100644 (file)
@@ -544,7 +544,7 @@ int bpf_firewall_compile(Unit *u) {
                                             "BPF_F_ALLOW_MULTI is not supported on this manager, not doing BPF firewall on slice units.");
 
         /* Note that when we compile a new firewall we first flush out the access maps and the BPF programs themselves,
-         * but we reuse the the accounting maps. That way the firewall in effect always maps to the actual
+         * but we reuse the accounting maps. That way the firewall in effect always maps to the actual
          * configuration, but we don't flush out the accounting unnecessarily */
 
         u->ip_bpf_ingress = bpf_program_unref(u->ip_bpf_ingress);
@@ -595,7 +595,7 @@ static int load_bpf_progs_from_fs_to_set(Unit *u, char **filter_paths, Set **set
         set_clear(*set);
 
         STRV_FOREACH(bpf_fs_path, filter_paths) {
-                _cleanup_free_ BPFProgram *prog = NULL;
+                _cleanup_(bpf_program_unrefp) BPFProgram *prog = NULL;
                 int r;
 
                 r = bpf_program_new(BPF_PROG_TYPE_CGROUP_SKB, &prog);
@@ -606,14 +606,9 @@ static int load_bpf_progs_from_fs_to_set(Unit *u, char **filter_paths, Set **set
                 if (r < 0)
                         return log_unit_error_errno(u, r, "Loading of ingress BPF program %s failed: %m", *bpf_fs_path);
 
-                r = set_ensure_allocated(set, &filter_prog_hash_ops);
-                if (r < 0)
-                        return log_unit_error_errno(u, r, "Can't allocate BPF program set: %m");
-
-                r = set_put(*set, prog);
+                r = set_ensure_consume(set, &filter_prog_hash_ops, TAKE_PTR(prog));
                 if (r < 0)
                         return log_unit_error_errno(u, r, "Can't add program to BPF program set: %m");
-                TAKE_PTR(prog);
         }
 
         return 0;
@@ -662,12 +657,9 @@ static int attach_custom_bpf_progs(Unit *u, const char *path, int attach_type, S
                 r = bpf_program_cgroup_attach(prog, attach_type, path, BPF_F_ALLOW_MULTI);
                 if (r < 0)
                         return log_unit_error_errno(u, r, "Attaching custom egress BPF program to cgroup %s failed: %m", path);
-                /* Remember that these BPF programs are installed now. */
-                r = set_ensure_allocated(set_installed, &filter_prog_hash_ops);
-                if (r < 0)
-                        return log_unit_error_errno(u, r, "Can't allocate BPF program set: %m");
 
-                r = set_put(*set_installed, prog);
+                /* Remember that these BPF programs are installed now. */
+                r = set_ensure_put(set_installed, &filter_prog_hash_ops, prog);
                 if (r < 0)
                         return log_unit_error_errno(u, r, "Can't add program to BPF program set: %m");
                 bpf_program_ref(prog);
index 7d45438e85a116aede08dc98e103e6c1e4daa48e..031b28a6846d89c3d896ef91166b5f52b3f2aca6 100644 (file)
@@ -990,12 +990,12 @@ static int cgroup_apply_devices(Unit *u) {
                                       "Failed to reset devices.allow/devices.deny: %m");
         }
 
-        bool whitelist_static = policy == CGROUP_DEVICE_POLICY_CLOSED ||
+        bool allow_list_static = policy == CGROUP_DEVICE_POLICY_CLOSED ||
                 (policy == CGROUP_DEVICE_POLICY_AUTO && c->device_allow);
-        if (whitelist_static)
-                (void) bpf_devices_whitelist_static(prog, path);
+        if (allow_list_static)
+                (void) bpf_devices_allow_list_static(prog, path);
 
-        bool any = whitelist_static;
+        bool any = allow_list_static;
         LIST_FOREACH(device_allow, a, c->device_allow) {
                 char acc[4], *val;
                 unsigned k = 0;
@@ -1011,11 +1011,11 @@ static int cgroup_apply_devices(Unit *u) {
                 acc[k++] = 0;
 
                 if (path_startswith(a->path, "/dev/"))
-                        r = bpf_devices_whitelist_device(prog, path, a->path, acc);
+                        r = bpf_devices_allow_list_device(prog, path, a->path, acc);
                 else if ((val = startswith(a->path, "block-")))
-                        r = bpf_devices_whitelist_major(prog, path, val, 'b', acc);
+                        r = bpf_devices_allow_list_major(prog, path, val, 'b', acc);
                 else if ((val = startswith(a->path, "char-")))
-                        r = bpf_devices_whitelist_major(prog, path, val, 'c', acc);
+                        r = bpf_devices_allow_list_major(prog, path, val, 'c', acc);
                 else {
                         log_unit_debug(u, "Ignoring device '%s' while writing cgroup attribute.", a->path);
                         continue;
@@ -1029,7 +1029,7 @@ static int cgroup_apply_devices(Unit *u) {
                 log_unit_warning_errno(u, SYNTHETIC_ERRNO(ENODEV), "No devices matched by device filter.");
 
                 /* The kernel verifier would reject a program we would build with the normal intro and outro
-                   but no whitelisting rules (outro would contain an unreachable instruction for successful
+                   but no allow-listing rules (outro would contain an unreachable instruction for successful
                    return). */
                 policy = CGROUP_DEVICE_POLICY_STRICT;
         }
index bd6e6a9dde15ea73625272f6fe2988f2ac7a9f16..70b85d8023ff0bf0593b7908693d8be8ee3a3d77 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
 #include "automount.h"
-#include "bus-util.h"
+#include "bus-get-properties.h"
 #include "dbus-automount.h"
 #include "dbus-util.h"
 #include "string-util.h"
index 8587a712e20b62a80aa6d8dd048f487e2b9956a2..b7d2e32639a51699b5df2404c3260e73bb672a9c 100644 (file)
@@ -5,7 +5,7 @@
 #include "af-list.h"
 #include "alloc-util.h"
 #include "bpf-firewall.h"
-#include "bus-util.h"
+#include "bus-get-properties.h"
 #include "cgroup-util.h"
 #include "cgroup.h"
 #include "dbus-cgroup.h"
@@ -707,112 +707,14 @@ static int bus_cgroup_set_boolean(
                 return 1;                                               \
         }
 
-#define BUS_DEFINE_SET_CGROUP_PROTECTION(function, mask, scale)         \
-        static int bus_cgroup_set_##function(                           \
-                        Unit *u,                                        \
-                        const char *name,                               \
-                        uint64_t *p,                                    \
-                        bool *s,                                        \
-                        sd_bus_message *message,                        \
-                        UnitWriteFlags flags,                           \
-                        sd_bus_error *error) {                          \
-                                                                        \
-                uint64_t v = CGROUP_LIMIT_MIN;                          \
-                bool nonempty = true;                                   \
-                char type;                                              \
-                int r;                                                  \
-                                                                        \
-                assert(p);                                              \
-                assert(s);                                              \
-                                                                        \
-                r = sd_bus_message_peek_type(message, &type, NULL);     \
-                if (r < 0)                                              \
-                        return r;                                       \
-                if (type == SD_BUS_TYPE_BOOLEAN) {                      \
-                        r = sd_bus_message_read(message, "b", &nonempty); \
-                        if (r < 0)                                      \
-                                return r;                               \
-                        /* Bool is used to denote empty value only */   \
-                        if (nonempty)                                   \
-                                return -EINVAL;                         \
-                } else if (type != SD_BUS_TYPE_UINT64) {                \
-                        return -EINVAL;                                 \
-                } else {                                                \
-                        r = sd_bus_message_read(message, "t", &v);      \
-                        if (r < 0)                                      \
-                                return r;                               \
-                }                                                       \
-                                                                        \
-                if (!UNIT_WRITE_FLAGS_NOOP(flags)) {                    \
-                        *p = v;                                         \
-                        unit_invalidate_cgroup(u, mask);                \
-                        if (!nonempty) {                                \
-                                *s = false;                             \
-                                unit_write_settingf(u, flags, name,     \
-                                                    "%s=", name);       \
-                        } else if (v == CGROUP_LIMIT_MAX) {             \
-                                *s = true;                              \
-                                unit_write_settingf(u, flags, name,     \
-                                                    "%s=infinity", name); \
-                        } else {                                        \
-                                *s = true;                              \
-                                unit_write_settingf(u, flags, name,     \
-                                                    "%s=%" PRIu64, name, v); \
-                        }                                               \
-                }                                                       \
-                                                                        \
-                return 1;                                               \
-        }                                                               \
-        static int bus_cgroup_set_##function##_scale(                   \
-                        Unit *u,                                        \
-                        const char *name,                               \
-                        uint64_t *p,                                    \
-                        bool *s,                                        \
-                        sd_bus_message *message,                        \
-                        UnitWriteFlags flags,                           \
-                        sd_bus_error *error) {                          \
-                                                                        \
-                uint64_t v;                                             \
-                uint32_t raw;                                           \
-                int r;                                                  \
-                                                                        \
-                assert(p);                                              \
-                assert(s);                                              \
-                                                                        \
-                r = sd_bus_message_read(message, "u", &raw);            \
-                if (r < 0)                                              \
-                        return r;                                       \
-                                                                        \
-                v = scale(raw, UINT32_MAX);                             \
-                if (v >= UINT64_MAX)                                    \
-                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
-                                                 "Value specified in %s is out of range", name); \
-                                                                        \
-                if (!UNIT_WRITE_FLAGS_NOOP(flags)) {                    \
-                        *p = v;                                         \
-                        unit_invalidate_cgroup(u, mask);                \
-                                                                        \
-                        /* Prepare to chop off suffix */                \
-                        assert_se(endswith(name, "Scale"));             \
-                                                                        \
-                        uint32_t scaled = DIV_ROUND_UP((uint64_t) raw * 1000, (uint64_t) UINT32_MAX); \
-                        unit_write_settingf(u, flags, name, "%.*s=%" PRIu32 ".%" PRIu32 "%%", \
-                                            (int)(strlen(name) - strlen("Scale")), name, \
-                                            scaled / 10, scaled % 10);  \
-                }                                                       \
-                                                                        \
-                *s = true;                                              \
-                return 1;                                               \
-        }
-
 DISABLE_WARNING_TYPE_LIMITS;
 BUS_DEFINE_SET_CGROUP_WEIGHT(cpu_weight, CGROUP_MASK_CPU, CGROUP_WEIGHT_IS_OK, CGROUP_WEIGHT_INVALID);
 BUS_DEFINE_SET_CGROUP_WEIGHT(cpu_shares, CGROUP_MASK_CPU, CGROUP_CPU_SHARES_IS_OK, CGROUP_CPU_SHARES_INVALID);
 BUS_DEFINE_SET_CGROUP_WEIGHT(io_weight, CGROUP_MASK_IO, CGROUP_WEIGHT_IS_OK, CGROUP_WEIGHT_INVALID);
 BUS_DEFINE_SET_CGROUP_WEIGHT(blockio_weight, CGROUP_MASK_BLKIO, CGROUP_BLKIO_WEIGHT_IS_OK, CGROUP_BLKIO_WEIGHT_INVALID);
 BUS_DEFINE_SET_CGROUP_LIMIT(memory, CGROUP_MASK_MEMORY, physical_memory_scale, 1);
+BUS_DEFINE_SET_CGROUP_LIMIT(memory_protection, CGROUP_MASK_MEMORY, physical_memory_scale, 0);
 BUS_DEFINE_SET_CGROUP_LIMIT(swap, CGROUP_MASK_MEMORY, physical_memory_scale, 0);
-BUS_DEFINE_SET_CGROUP_PROTECTION(memory_protection, CGROUP_MASK_MEMORY, physical_memory_scale);
 REENABLE_WARNING;
 
 static int bus_cgroup_set_tasks_max(
@@ -938,17 +840,33 @@ int bus_cgroup_set_property(
         if (streq(name, "MemoryAccounting"))
                 return bus_cgroup_set_boolean(u, name, &c->memory_accounting, CGROUP_MASK_MEMORY, message, flags, error);
 
-        if (streq(name, "MemoryMin"))
-                return bus_cgroup_set_memory_protection(u, name, &c->memory_min, &c->memory_min_set, message, flags, error);
+        if (streq(name, "MemoryMin")) {
+                r = bus_cgroup_set_memory_protection(u, name, &c->memory_min, message, flags, error);
+                if (r > 0)
+                        c->memory_min_set = true;
+                return r;
+        }
 
-        if (streq(name, "MemoryLow"))
-                return bus_cgroup_set_memory_protection(u, name, &c->memory_low, &c->memory_low_set, message, flags, error);
+        if (streq(name, "MemoryLow")) {
+                r = bus_cgroup_set_memory_protection(u, name, &c->memory_low, message, flags, error);
+                if (r > 0)
+                        c->memory_low_set = true;
+                return r;
+        }
 
-        if (streq(name, "DefaultMemoryMin"))
-                return bus_cgroup_set_memory_protection(u, name, &c->default_memory_min, &c->default_memory_min_set, message, flags, error);
+        if (streq(name, "DefaultMemoryMin")) {
+                r = bus_cgroup_set_memory_protection(u, name, &c->default_memory_min, message, flags, error);
+                if (r > 0)
+                        c->default_memory_min_set = true;
+                return r;
+        }
 
-        if (streq(name, "DefaultMemoryLow"))
-                return bus_cgroup_set_memory_protection(u, name, &c->default_memory_low, &c->default_memory_low_set, message, flags, error);
+        if (streq(name, "DefaultMemoryLow")) {
+                r = bus_cgroup_set_memory_protection(u, name, &c->default_memory_low, message, flags, error);
+                if (r > 0)
+                        c->default_memory_low_set = true;
+                return r;
+        }
 
         if (streq(name, "MemoryHigh"))
                 return bus_cgroup_set_memory(u, name, &c->memory_high, message, flags, error);
@@ -962,17 +880,33 @@ int bus_cgroup_set_property(
         if (streq(name, "MemoryLimit"))
                 return bus_cgroup_set_memory(u, name, &c->memory_limit, message, flags, error);
 
-        if (streq(name, "MemoryMinScale"))
-                return bus_cgroup_set_memory_protection_scale(u, name, &c->memory_min, &c->memory_min_set, message, flags, error);
+        if (streq(name, "MemoryMinScale")) {
+                r = bus_cgroup_set_memory_protection_scale(u, name, &c->memory_min, message, flags, error);
+                if (r > 0)
+                        c->memory_min_set = true;
+                return r;
+        }
 
-        if (streq(name, "MemoryLowScale"))
-                return bus_cgroup_set_memory_protection_scale(u, name, &c->memory_low, &c->memory_low_set, message, flags, error);
+        if (streq(name, "MemoryLowScale")) {
+                r = bus_cgroup_set_memory_protection_scale(u, name, &c->memory_low, message, flags, error);
+                if (r > 0)
+                        c->memory_low_set = true;
+                return r;
+        }
 
-        if (streq(name, "DefaultMemoryMinScale"))
-                return bus_cgroup_set_memory_protection_scale(u, name, &c->default_memory_min, &c->default_memory_min_set, message, flags, error);
+        if (streq(name, "DefaultMemoryMinScale")) {
+                r = bus_cgroup_set_memory_protection_scale(u, name, &c->default_memory_min, message, flags, error);
+                if (r > 0)
+                        c->default_memory_min_set = true;
+                return r;
+        }
 
-        if (streq(name, "DefaultMemoryLowScale"))
-                return bus_cgroup_set_memory_protection_scale(u, name, &c->default_memory_low, &c->default_memory_low_set, message, flags, error);
+        if (streq(name, "DefaultMemoryLowScale")) {
+                r = bus_cgroup_set_memory_protection_scale(u, name, &c->default_memory_low, message, flags, error);
+                if (r > 0)
+                        c->default_memory_low_set = true;
+                return r;
+        }
 
         if (streq(name, "MemoryHighScale"))
                 return bus_cgroup_set_memory_scale(u, name, &c->memory_high, message, flags, error);
index a584895ea9ee64ba2c1e4e4eb435ccbf6ea61006..50f7ada8cefb2f32efe790c5698bdcbbc44ff578 100644 (file)
@@ -9,7 +9,7 @@
 
 #include "af-list.h"
 #include "alloc-util.h"
-#include "bus-util.h"
+#include "bus-get-properties.h"
 #include "cap-list.h"
 #include "capability-util.h"
 #include "cpu-set-util.h"
@@ -370,7 +370,7 @@ static int property_get_syscall_filter(
         if (r < 0)
                 return r;
 
-        r = sd_bus_message_append(reply, "b", c->syscall_whitelist);
+        r = sd_bus_message_append(reply, "b", c->syscall_allow_list);
         if (r < 0)
                 return r;
 
@@ -536,7 +536,7 @@ static int property_get_address_families(
         if (r < 0)
                 return r;
 
-        r = sd_bus_message_append(reply, "b", c->address_families_whitelist);
+        r = sd_bus_message_append(reply, "b", c->address_families_allow_list);
         if (r < 0)
                 return r;
 
@@ -765,6 +765,25 @@ static int property_get_root_hash(
         return sd_bus_message_append_array(reply, 'y', c->root_hash, c->root_hash_size);
 }
 
+static int property_get_root_hash_sig(
+                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;
+
+        assert(bus);
+        assert(c);
+        assert(property);
+        assert(reply);
+
+        return sd_bus_message_append_array(reply, 'y', c->root_hash_sig, c->root_hash_sig_size);
+}
+
 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),
@@ -809,6 +828,8 @@ const sd_bus_vtable bus_exec_vtable[] = {
         SD_BUS_PROPERTY("RootImage", "s", NULL, offsetof(ExecContext, root_image), 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),
+        SD_BUS_PROPERTY("RootHashSignaturePath", "s", NULL, offsetof(ExecContext, root_hash_sig_path), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("RootVerity", "s", NULL, offsetof(ExecContext, root_verity), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("OOMScoreAdjust", "i", property_get_oom_score_adjust, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("CoredumpFilter", "t", property_get_coredump_filter, 0, SD_BUS_VTABLE_PROPERTY_CONST),
@@ -1326,6 +1347,53 @@ int bus_exec_context_set_transient_property(
                 return bus_set_transient_path(u, "RootHash", &c->root_hash_path, message, flags, error);
         }
 
+        if (streq(name, "RootHashSignature")) {
+                const void *roothash_sig_decoded;
+                size_t roothash_sig_decoded_size;
+
+                r = sd_bus_message_read_array(message, 'y', &roothash_sig_decoded, &roothash_sig_decoded_size);
+                if (r < 0)
+                        return r;
+
+                if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
+                        _cleanup_free_ char *encoded = NULL;
+
+                        if (roothash_sig_decoded_size == 0) {
+                                c->root_hash_sig_path = mfree(c->root_hash_sig_path);
+                                c->root_hash_sig = mfree(c->root_hash_sig);
+                                c->root_hash_sig_size = 0;
+
+                                unit_write_settingf(u, flags, name, "RootHashSignature=");
+                        } else {
+                                _cleanup_free_ void *p;
+                                ssize_t len;
+
+                                len = base64mem(roothash_sig_decoded, roothash_sig_decoded_size, &encoded);
+                                if (len < 0)
+                                        return -ENOMEM;
+
+                                p = memdup(roothash_sig_decoded, roothash_sig_decoded_size);
+                                if (!p)
+                                        return -ENOMEM;
+
+                                free_and_replace(c->root_hash_sig, p);
+                                c->root_hash_sig_size = roothash_sig_decoded_size;
+                                c->root_hash_sig_path = mfree(c->root_hash_sig_path);
+
+                                unit_write_settingf(u, flags, name, "RootHashSignature=base64:%s", encoded);
+                        }
+                }
+
+                return 1;
+        }
+
+        if (streq(name, "RootHashSignaturePath")) {
+                c->root_hash_sig_size = 0;
+                c->root_hash_sig = mfree(c->root_hash_sig);
+
+                return bus_set_transient_path(u, "RootHashSignature", &c->root_hash_sig_path, message, flags, error);
+        }
+
         if (streq(name, "RootVerity"))
                 return bus_set_transient_path(u, name, &c->root_verity, message, flags, error);
 
@@ -1672,14 +1740,14 @@ int bus_exec_context_set_transient_property(
                 return bus_set_transient_errno(u, name, &c->syscall_errno, message, flags, error);
 
         if (streq(name, "SystemCallFilter")) {
-                int whitelist;
+                int allow_list;
                 _cleanup_strv_free_ char **l = NULL;
 
                 r = sd_bus_message_enter_container(message, 'r', "bas");
                 if (r < 0)
                         return r;
 
-                r = sd_bus_message_read(message, "b", &whitelist);
+                r = sd_bus_message_read(message, "b", &allow_list);
                 if (r < 0)
                         return r;
 
@@ -1693,11 +1761,11 @@ int bus_exec_context_set_transient_property(
 
                 if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
                         _cleanup_free_ char *joined = NULL;
-                        SeccompParseFlags invert_flag = whitelist ? 0 : SECCOMP_PARSE_INVERT;
+                        SeccompParseFlags invert_flag = allow_list ? 0 : SECCOMP_PARSE_INVERT;
                         char **s;
 
                         if (strv_isempty(l)) {
-                                c->syscall_whitelist = false;
+                                c->syscall_allow_list = false;
                                 c->syscall_filter = hashmap_free(c->syscall_filter);
 
                                 unit_write_settingf(u, flags, name, "SystemCallFilter=");
@@ -1709,14 +1777,14 @@ int bus_exec_context_set_transient_property(
                                 if (!c->syscall_filter)
                                         return log_oom();
 
-                                c->syscall_whitelist = whitelist;
+                                c->syscall_allow_list = allow_list;
 
-                                if (c->syscall_whitelist) {
+                                if (c->syscall_allow_list) {
                                         r = seccomp_parse_syscall_filter("@default",
                                                                          -1,
                                                                          c->syscall_filter,
                                                                          SECCOMP_PARSE_PERMISSIVE |
-                                                                         SECCOMP_PARSE_WHITELIST | invert_flag,
+                                                                         SECCOMP_PARSE_ALLOW_LIST | invert_flag,
                                                                          u->id,
                                                                          NULL, 0);
                                         if (r < 0)
@@ -1737,7 +1805,7 @@ int bus_exec_context_set_transient_property(
                                                                  c->syscall_filter,
                                                                  SECCOMP_PARSE_LOG | SECCOMP_PARSE_PERMISSIVE |
                                                                  invert_flag |
-                                                                 (c->syscall_whitelist ? SECCOMP_PARSE_WHITELIST : 0),
+                                                                 (c->syscall_allow_list ? SECCOMP_PARSE_ALLOW_LIST : 0),
                                                                  u->id,
                                                                  NULL, 0);
                                 if (r < 0)
@@ -1748,7 +1816,7 @@ int bus_exec_context_set_transient_property(
                         if (!joined)
                                 return -ENOMEM;
 
-                        unit_write_settingf(u, flags, name, "SystemCallFilter=%s%s", whitelist ? "" : "~", joined);
+                        unit_write_settingf(u, flags, name, "SystemCallFilter=%s%s", allow_list ? "" : "~", joined);
                 }
 
                 return 1;
@@ -1768,10 +1836,6 @@ int bus_exec_context_set_transient_property(
                         else {
                                 char **s;
 
-                                r = set_ensure_allocated(&c->syscall_archs, NULL);
-                                if (r < 0)
-                                        return r;
-
                                 STRV_FOREACH(s, l) {
                                         uint32_t a;
 
@@ -1779,7 +1843,7 @@ int bus_exec_context_set_transient_property(
                                         if (r < 0)
                                                 return r;
 
-                                        r = set_put(c->syscall_archs, UINT32_TO_PTR(a + 1));
+                                        r = set_ensure_put(&c->syscall_archs, NULL, UINT32_TO_PTR(a + 1));
                                         if (r < 0)
                                                 return r;
                                 }
@@ -1796,14 +1860,14 @@ int bus_exec_context_set_transient_property(
                 return 1;
 
         } else if (streq(name, "RestrictAddressFamilies")) {
-                int whitelist;
+                int allow_list;
                 _cleanup_strv_free_ char **l = NULL;
 
                 r = sd_bus_message_enter_container(message, 'r', "bas");
                 if (r < 0)
                         return r;
 
-                r = sd_bus_message_read(message, "b", &whitelist);
+                r = sd_bus_message_read(message, "b", &allow_list);
                 if (r < 0)
                         return r;
 
@@ -1820,7 +1884,7 @@ int bus_exec_context_set_transient_property(
                         char **s;
 
                         if (strv_isempty(l)) {
-                                c->address_families_whitelist = false;
+                                c->address_families_allow_list = false;
                                 c->address_families = set_free(c->address_families);
 
                                 unit_write_settingf(u, flags, name, "RestrictAddressFamilies=");
@@ -1832,7 +1896,7 @@ int bus_exec_context_set_transient_property(
                                 if (!c->address_families)
                                         return log_oom();
 
-                                c->address_families_whitelist = whitelist;
+                                c->address_families_allow_list = allow_list;
                         }
 
                         STRV_FOREACH(s, l) {
@@ -1842,7 +1906,7 @@ int bus_exec_context_set_transient_property(
                                 if (af < 0)
                                         return af;
 
-                                if (whitelist == c->address_families_whitelist) {
+                                if (allow_list == c->address_families_allow_list) {
                                         r = set_put(c->address_families, INT_TO_PTR(af));
                                         if (r < 0)
                                                 return r;
@@ -1854,7 +1918,7 @@ int bus_exec_context_set_transient_property(
                         if (!joined)
                                 return -ENOMEM;
 
-                        unit_write_settingf(u, flags, name, "RestrictAddressFamilies=%s%s", whitelist ? "" : "~", joined);
+                        unit_write_settingf(u, flags, name, "RestrictAddressFamilies=%s%s", allow_list ? "" : "~", joined);
                 }
 
                 return 1;
index 404984f664881d06574dfb4460005b7d9d8cb542..33e4128909bbe2e7721e1808106b8488a44cf90a 100644 (file)
@@ -3,6 +3,7 @@
 #include "sd-bus.h"
 
 #include "alloc-util.h"
+#include "bus-get-properties.h"
 #include "bus-util.h"
 #include "dbus-job.h"
 #include "dbus-unit.h"
index a840c6dfe82c5c2428b955bb886039dc7ca5b4bf..96c5b66309a9696aeba1bfd3ac10b36dabada339 100644 (file)
@@ -4,7 +4,7 @@
 #include "sd-bus.h"
 
 #include "unit.h"
-#include "bus-util.h"
+#include "bus-object.h"
 
 extern const sd_bus_vtable bus_job_vtable[];
 extern const BusObjectImplementation job_object;
index 30597e86f0d1dabb6c2087fb2dfa29deafd8463d..eda3410375a30362a98a83632627a4c0e5b0b791 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
-#include "bus-util.h"
+#include "bus-get-properties.h"
 #include "dbus-kill.h"
 #include "dbus-util.h"
 #include "kill.h"
index 5cb06867cb31b75cfb10e05a5cb5267afc2df509..07e139c5ad265680de5bf1a9b1b849b97637e816 100644 (file)
@@ -9,8 +9,8 @@
 #include "architecture.h"
 #include "build.h"
 #include "bus-common-errors.h"
+#include "bus-get-properties.h"
 #include "bus-log-control-api.h"
-#include "bus-util.h"
 #include "dbus-cgroup.h"
 #include "dbus-execute.h"
 #include "dbus-job.h"
index 3ab5ecc425c1e023cebbea51e82d326c88e44259..bab12cc4ff15fa12242fc144501eab506dd5753c 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
-#include "bus-util.h"
+#include "bus-get-properties.h"
 #include "dbus-cgroup.h"
 #include "dbus-execute.h"
 #include "dbus-kill.h"
index 1a97d62486f45f538202a41b3e883a67c5ee4c14..76cd9d32603d4f86db9e61e3d0e454e69078d882 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
 #include "alloc-util.h"
-#include "bus-util.h"
+#include "bus-get-properties.h"
 #include "dbus-path.h"
 #include "dbus-util.h"
 #include "list.h"
index 2d877a8c55fc630e7312d0917ca3944bb76cdd61..aecfda65356caa2e5f370b308371270bd3d4b156 100644 (file)
@@ -2,7 +2,7 @@
 
 #include "alloc-util.h"
 #include "bus-common-errors.h"
-#include "bus-util.h"
+#include "bus-get-properties.h"
 #include "dbus-cgroup.h"
 #include "dbus-kill.h"
 #include "dbus-scope.h"
index 5d4f4ef50684b00b65535f0df5b88123107ae685..3cc453dff5bbc7bb5a69a1b0742b682f95277e56 100644 (file)
@@ -4,7 +4,7 @@
 
 #include "alloc-util.h"
 #include "async.h"
-#include "bus-util.h"
+#include "bus-get-properties.h"
 #include "dbus-cgroup.h"
 #include "dbus-execute.h"
 #include "dbus-kill.h"
index 73e6a7491470f32a697d5d07377e9310ac8aa288..f01489e29a16258610c5420906b5e13961ac3ddf 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
 #include "alloc-util.h"
-#include "bus-util.h"
+#include "bus-get-properties.h"
 #include "dbus-cgroup.h"
 #include "dbus-execute.h"
 #include "dbus-kill.h"
index 57c8c42091fd95750df6684acf8c3e473d3f89c3..cb4824b6bd943aa77f77a8655d23f3f2a3008e8d 100644 (file)
@@ -3,7 +3,7 @@
   Copyright © 2010 Maarten Lankhorst
 ***/
 
-#include "bus-util.h"
+#include "bus-get-properties.h"
 #include "dbus-cgroup.h"
 #include "dbus-execute.h"
 #include "dbus-swap.h"
index 439c276fac90a31bb0132ff5a51330579e3abdf7..da35fa867862ea64d5fc65e61fbda42aa3e8800a 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
 #include "alloc-util.h"
-#include "bus-util.h"
+#include "bus-get-properties.h"
 #include "dbus-timer.h"
 #include "dbus-util.h"
 #include "strv.h"
index 320e830728e1f2acefc4b629381c82bf6ad47bbf..9e9d3b101e50df456991068d4e4ef12db71d29f1 100644 (file)
@@ -5,8 +5,8 @@
 #include "alloc-util.h"
 #include "bpf-firewall.h"
 #include "bus-common-errors.h"
+#include "bus-get-properties.h"
 #include "bus-polkit.h"
-#include "bus-util.h"
 #include "cgroup-util.h"
 #include "condition.h"
 #include "dbus-job.h"
index c4d25d68e426c5cc2b8425dda2153a818a75936a..b6609e63e548d532c8d1cb6f7433e0371607d7f2 100644 (file)
@@ -1,8 +1,6 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
 #include <fcntl.h>
-#include <linux/random.h>
-#include <sys/ioctl.h>
 #include <unistd.h>
 
 #include "alloc-util.h"
@@ -11,6 +9,7 @@
 #include "efivars.h"
 #include "fd-util.h"
 #include "fs-util.h"
+#include "random-util.h"
 #include "strv.h"
 
 /* If a random seed was passed by the boot loader in the LoaderRandomSeed EFI variable, let's credit it to
@@ -43,7 +42,6 @@ static void lock_down_efi_variables(void) {
 }
 
 int efi_take_random_seed(void) {
-        _cleanup_free_ struct rand_pool_info *info = NULL;
         _cleanup_free_ void *value = NULL;
         _cleanup_close_ int random_fd = -1;
         size_t size;
@@ -79,11 +77,6 @@ int efi_take_random_seed(void) {
         if (size == 0)
                 return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), "Random seed passed from boot loader has zero size? Ignoring.");
 
-        /* The kernel API only accepts "int" as entropy count (which is in bits), let's avoid any chance for
-         * confusion here. */
-        if (size > INT_MAX / 8)
-                size = INT_MAX / 8;
-
         random_fd = open("/dev/urandom", O_WRONLY|O_CLOEXEC|O_NOCTTY);
         if (random_fd < 0)
                 return log_warning_errno(errno, "Failed to open /dev/urandom for writing, ignoring: %m");
@@ -94,15 +87,8 @@ int efi_take_random_seed(void) {
         if (r < 0)
                 return log_warning_errno(r, "Unable to mark EFI random seed as used, not using it: %m");
 
-        info = malloc(offsetof(struct rand_pool_info, buf) + size);
-        if (!info)
-                return log_oom();
-
-        info->entropy_count = size * 8;
-        info->buf_size = size;
-        memcpy(info->buf, value, size);
-
-        if (ioctl(random_fd, RNDADDENTROPY, info) < 0)
+        r = random_write_entropy(random_fd, value, size, true);
+        if (r < 0)
                 return log_warning_errno(errno, "Failed to credit entropy, ignoring: %m");
 
         log_info("Successfully credited entropy passed from boot loader.");
index 4330c0f2c1cd25e367d9f33f57ccdacce14433fd..1565a799270c01c2d988dfb648d4fb024a1c486e 100644 (file)
 #include "terminal-util.h"
 #include "virt.h"
 
+static const char* const emergency_action_table[_EMERGENCY_ACTION_MAX] = {
+        [EMERGENCY_ACTION_NONE] =               "none",
+        [EMERGENCY_ACTION_REBOOT] =             "reboot",
+        [EMERGENCY_ACTION_REBOOT_FORCE] =       "reboot-force",
+        [EMERGENCY_ACTION_REBOOT_IMMEDIATE] =   "reboot-immediate",
+        [EMERGENCY_ACTION_POWEROFF] =           "poweroff",
+        [EMERGENCY_ACTION_POWEROFF_FORCE] =     "poweroff-force",
+        [EMERGENCY_ACTION_POWEROFF_IMMEDIATE] = "poweroff-immediate",
+        [EMERGENCY_ACTION_EXIT] =               "exit",
+        [EMERGENCY_ACTION_EXIT_FORCE] =         "exit-force",
+};
+
 static void log_and_status(Manager *m, bool warn, const char *message, const char *reason) {
         log_full(warn ? LOG_WARNING : LOG_DEBUG, "%s: %s", message, reason);
         if (warn)
@@ -28,10 +40,22 @@ void emergency_action(
                 int exit_status,
                 const char *reason) {
 
+        Unit *u;
+
         assert(m);
         assert(action >= 0);
         assert(action < _EMERGENCY_ACTION_MAX);
 
+        /* Is the special shutdown target active or queued? If so, we are in shutdown state */
+        if (IN_SET(action, EMERGENCY_ACTION_REBOOT, EMERGENCY_ACTION_POWEROFF, EMERGENCY_ACTION_EXIT)) {
+                u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
+                if (u && unit_active_or_pending(u)) {
+                        log_notice("Shutdown is already active. Skipping emergency action request %s.",
+                                   emergency_action_table[action]);
+                        return;
+                }
+        }
+
         if (action == EMERGENCY_ACTION_NONE)
                 return;
 
@@ -126,17 +150,6 @@ void emergency_action(
         }
 }
 
-static const char* const emergency_action_table[_EMERGENCY_ACTION_MAX] = {
-        [EMERGENCY_ACTION_NONE] = "none",
-        [EMERGENCY_ACTION_REBOOT] = "reboot",
-        [EMERGENCY_ACTION_REBOOT_FORCE] = "reboot-force",
-        [EMERGENCY_ACTION_REBOOT_IMMEDIATE] = "reboot-immediate",
-        [EMERGENCY_ACTION_POWEROFF] = "poweroff",
-        [EMERGENCY_ACTION_POWEROFF_FORCE] = "poweroff-force",
-        [EMERGENCY_ACTION_POWEROFF_IMMEDIATE] = "poweroff-immediate",
-        [EMERGENCY_ACTION_EXIT] = "exit",
-        [EMERGENCY_ACTION_EXIT_FORCE] = "exit-force",
-};
 DEFINE_STRING_TABLE_LOOKUP(emergency_action, EmergencyAction);
 
 int parse_emergency_action(
index e0835f9b92ca778ad1f86e4861bfac5ae645badb..078aa1441805b56e445953e1d740b53a67194ac4 100644 (file)
@@ -1380,14 +1380,14 @@ static void rename_process_from_path(const char *path) {
 static bool context_has_address_families(const ExecContext *c) {
         assert(c);
 
-        return c->address_families_whitelist ||
+        return c->address_families_allow_list ||
                 !set_isempty(c->address_families);
 }
 
 static bool context_has_syscall_filters(const ExecContext *c) {
         assert(c);
 
-        return c->syscall_whitelist ||
+        return c->syscall_allow_list ||
                 !hashmap_isempty(c->syscall_filter);
 }
 
@@ -1443,7 +1443,7 @@ static int apply_syscall_filter(const Unit* u, const ExecContext *c, bool needs_
 
         negative_action = c->syscall_errno == 0 ? scmp_act_kill_process() : SCMP_ACT_ERRNO(c->syscall_errno);
 
-        if (c->syscall_whitelist) {
+        if (c->syscall_allow_list) {
                 default_action = negative_action;
                 action = SCMP_ACT_ALLOW;
         } else {
@@ -1452,7 +1452,7 @@ static int apply_syscall_filter(const Unit* u, const ExecContext *c, bool needs_
         }
 
         if (needs_ambient_hack) {
-                r = seccomp_filter_set_add(c->syscall_filter, c->syscall_whitelist, syscall_filter_sets + SYSCALL_FILTER_SET_SETUID);
+                r = seccomp_filter_set_add(c->syscall_filter, c->syscall_allow_list, syscall_filter_sets + SYSCALL_FILTER_SET_SETUID);
                 if (r < 0)
                         return r;
         }
@@ -1483,7 +1483,7 @@ static int apply_address_families(const Unit* u, const ExecContext *c) {
         if (skip_seccomp_unavailable(u, "RestrictAddressFamilies="))
                 return 0;
 
-        return seccomp_restrict_address_families(c->address_families, c->address_families_whitelist);
+        return seccomp_restrict_address_families(c->address_families, c->address_families_allow_list);
 }
 
 static int apply_memory_deny_write_execute(const Unit* u, const ExecContext *c) {
@@ -2667,7 +2667,9 @@ static int apply_mount_namespace(
                             needs_sandboxing ? context->protect_home : PROTECT_HOME_NO,
                             needs_sandboxing ? context->protect_system : PROTECT_SYSTEM_NO,
                             context->mount_flags,
-                            context->root_hash, context->root_hash_size, context->root_hash_path, context->root_verity,
+                            context->root_hash, context->root_hash_size, context->root_hash_path,
+                            context->root_hash_sig, context->root_hash_sig_size, context->root_hash_sig_path,
+                            context->root_verity,
                             DISSECT_IMAGE_DISCARD_ON_LOOP|DISSECT_IMAGE_RELAX_VAR_CHECK|DISSECT_IMAGE_FSCK,
                             error_path);
 
@@ -2853,7 +2855,7 @@ static int setup_keyring(
         }
 
 out:
-        /* Revert back uid & gid for the the last time, and exit */
+        /* Revert back uid & gid for the last time, and exit */
         /* no extra logging, as only the first already reported error matters */
         if (getuid() != saved_uid)
                 (void) setreuid(saved_uid, -1);
@@ -4200,6 +4202,9 @@ void exec_context_done(ExecContext *c) {
         c->root_hash = mfree(c->root_hash);
         c->root_hash_size = 0;
         c->root_hash_path = mfree(c->root_hash_path);
+        c->root_hash_sig = mfree(c->root_hash_sig);
+        c->root_hash_sig_size = 0;
+        c->root_hash_sig_path = mfree(c->root_hash_sig_path);
         c->root_verity = mfree(c->root_verity);
         c->tty_path = mfree(c->tty_path);
         c->syslog_identifier = mfree(c->syslog_identifier);
@@ -4615,6 +4620,17 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
         if (c->root_hash_path)
                 fprintf(f, "%sRootHash: %s\n", prefix, c->root_hash_path);
 
+        if (c->root_hash_sig) {
+                _cleanup_free_ char *encoded = NULL;
+                ssize_t len;
+                len = base64mem(c->root_hash_sig, c->root_hash_sig_size, &encoded);
+                if (len)
+                        fprintf(f, "%sRootHashSignature: base64:%s\n", prefix, encoded);
+        }
+
+        if (c->root_hash_sig_path)
+                fprintf(f, "%sRootHashSignature: %s\n", prefix, c->root_hash_sig_path);
+
         if (c->root_verity)
                 fprintf(f, "%sRootVerity: %s\n", prefix, c->root_verity);
 
@@ -4918,7 +4934,7 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
                         "%sSystemCallFilter: ",
                         prefix);
 
-                if (!c->syscall_whitelist)
+                if (!c->syscall_allow_list)
                         fputc('~', f);
 
 #if HAVE_SECCOMP
index 7c9d63c5e414b51b399451326524e9a0950807d4..6bd71c17404e8cc9d18fe724ace655c467e4708f 100644 (file)
@@ -155,9 +155,9 @@ struct ExecContext {
         char **unset_environment;
 
         struct rlimit *rlimit[_RLIMIT_MAX];
-        char *working_directory, *root_directory, *root_image, *root_verity, *root_hash_path;
-        void *root_hash;
-        size_t 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;
         bool working_directory_missing_ok:1;
         bool working_directory_home:1;
 
@@ -287,9 +287,9 @@ struct ExecContext {
         Hashmap *syscall_filter;
         Set *syscall_archs;
         int syscall_errno;
-        bool syscall_whitelist:1;
+        bool syscall_allow_list:1;
 
-        bool address_families_whitelist:1;
+        bool address_families_allow_list:1;
         Set *address_families;
 
         char *network_namespace_path;
index 9cf959edd57432fb603c35e6ce7f2da14ee8e76c..12ae78eb7dc5d4552665ac3d1916faa3f8bb1244 100644 (file)
@@ -24,6 +24,7 @@ m4_define(`EXEC_CONTEXT_CONFIG_ITEMS',
 $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.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)
 $1.User,                         config_parse_user_group_compat,     0,                             offsetof($1, exec_context.user)
 $1.Group,                        config_parse_user_group_compat,     0,                             offsetof($1, exec_context.group)
index 54b35149244384e4105fce973beebbfc8edffdd9..526ed210b34e7cd477f290ccc04b4cbe57dc305f 100644 (file)
@@ -13,6 +13,8 @@
 #include <sched.h>
 #include <sys/resource.h>
 
+#include "sd-messages.h"
+
 #include "af-list.h"
 #include "alloc-util.h"
 #include "all-units.h"
@@ -666,7 +668,7 @@ int config_parse_kill_mode(
         if (m == KILL_NONE)
                 log_syntax(unit, LOG_WARNING, filename, line, 0,
                            "Unit configured to use KillMode=none. "
-                           "This is unsafe, as it disables systemd's process life-cycle management for the service. "
+                           "This is unsafe, as it disables systemd's process lifecycle management for the service. "
                            "Please update your service to use a safer KillMode=, such as 'mixed' or 'control-group'. "
                            "Support for KillMode=none is deprecated and will eventually be removed.");
 
@@ -1472,6 +1474,66 @@ int config_parse_exec_root_hash(
         return 0;
 }
 
+int config_parse_exec_root_hash_sig(
+                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_free_ void *roothash_sig_decoded = NULL;
+        char *value;
+        ExecContext *c = data;
+        size_t roothash_sig_decoded_size = 0;
+        int r;
+
+        assert(data);
+        assert(filename);
+        assert(line);
+        assert(rvalue);
+
+        if (isempty(rvalue)) {
+                /* Reset if the empty string is assigned */
+                c->root_hash_sig_path = mfree(c->root_hash_sig_path);
+                c->root_hash_sig = mfree(c->root_hash_sig);
+                c->root_hash_sig_size = 0;
+                return 0;
+        }
+
+        if (path_is_absolute(rvalue)) {
+                /* We have the path to a roothash signature to load and decode, eg: RootHashSignature=/foo/bar.roothash.p7s */
+                _cleanup_free_ char *p = NULL;
+
+                p = strdup(rvalue);
+                if (!p)
+                        return -ENOMEM;
+
+                free_and_replace(c->root_hash_sig_path, p);
+                c->root_hash_sig = mfree(c->root_hash_sig);
+                c->root_hash_sig_size = 0;
+                return 0;
+        }
+
+        if (!(value = startswith(rvalue, "base64:")))
+                return log_syntax(unit, LOG_ERR, filename, line, SYNTHETIC_ERRNO(EINVAL), "Failed to decode RootHashSignature=, not a path but doesn't start with 'base64:', ignoring: %s", rvalue);
+
+        /* We have a roothash signature to decode, eg: RootHashSignature=base64:012345789abcdef */
+        r = unbase64mem(value, strlen(value), &roothash_sig_decoded, &roothash_sig_decoded_size);
+        if (r < 0)
+                return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to decode RootHashSignature=, ignoring: %s", rvalue);
+
+        free_and_replace(c->root_hash_sig, roothash_sig_decoded);
+        c->root_hash_sig_size = roothash_sig_decoded_size;
+        c->root_hash_sig_path = mfree(c->root_hash_sig_path);
+
+        return 0;
+}
+
 int config_parse_exec_cpu_affinity(const char *unit,
                                    const char *filename,
                                    unsigned line,
@@ -2227,6 +2289,15 @@ int config_parse_user_group_compat(
                 return -ENOEXEC;
         }
 
+        if (strstr(lvalue, "User") && streq(k, NOBODY_USER_NAME))
+                log_struct(LOG_NOTICE,
+                           "MESSAGE=%s:%u: Special user %s configured, this is not safe!", filename, line, k,
+                           "UNIT=%s", unit,
+                           "MESSAGE_ID=" SD_MESSAGE_NOBODY_USER_UNSUITABLE_STR,
+                           "OFFENDING_USER=%s", k,
+                           "CONFIG_FILE=%s", filename,
+                           "CONFIG_LINE=%u", line);
+
         return free_and_replace(*user, k);
 }
 
@@ -3017,7 +3088,7 @@ int config_parse_syscall_filter(
         if (isempty(rvalue)) {
                 /* Empty assignment resets the list */
                 c->syscall_filter = hashmap_free(c->syscall_filter);
-                c->syscall_whitelist = false;
+                c->syscall_allow_list = false;
                 return 0;
         }
 
@@ -3033,15 +3104,15 @@ int config_parse_syscall_filter(
 
                 if (invert)
                         /* Allow everything but the ones listed */
-                        c->syscall_whitelist = false;
+                        c->syscall_allow_list = false;
                 else {
                         /* Allow nothing but the ones listed */
-                        c->syscall_whitelist = true;
+                        c->syscall_allow_list = true;
 
-                        /* Accept default syscalls if we are on a whitelist */
+                        /* Accept default syscalls if we are on a allow_list */
                         r = seccomp_parse_syscall_filter(
                                         "@default", -1, c->syscall_filter,
-                                        SECCOMP_PARSE_PERMISSIVE|SECCOMP_PARSE_WHITELIST,
+                                        SECCOMP_PARSE_PERMISSIVE|SECCOMP_PARSE_ALLOW_LIST,
                                         unit,
                                         NULL, 0);
                         if (r < 0)
@@ -3074,7 +3145,7 @@ int config_parse_syscall_filter(
                                 name, num, c->syscall_filter,
                                 SECCOMP_PARSE_LOG|SECCOMP_PARSE_PERMISSIVE|
                                 (invert ? SECCOMP_PARSE_INVERT : 0)|
-                                (c->syscall_whitelist ? SECCOMP_PARSE_WHITELIST : 0),
+                                (c->syscall_allow_list ? SECCOMP_PARSE_ALLOW_LIST : 0),
                                 unit, filename, line);
                 if (r < 0)
                         return r;
@@ -3102,10 +3173,6 @@ int config_parse_syscall_archs(
                 return 0;
         }
 
-        r = set_ensure_allocated(archs, NULL);
-        if (r < 0)
-                return log_oom();
-
         for (;;) {
                 _cleanup_free_ char *word = NULL;
                 uint32_t a;
@@ -3128,7 +3195,7 @@ int config_parse_syscall_archs(
                         continue;
                 }
 
-                r = set_put(*archs, UINT32_TO_PTR(a + 1));
+                r = set_ensure_put(archs, NULL, UINT32_TO_PTR(a + 1));
                 if (r < 0)
                         return log_oom();
         }
@@ -3193,7 +3260,7 @@ int config_parse_address_families(
         if (isempty(rvalue)) {
                 /* Empty assignment resets the list */
                 c->address_families = set_free(c->address_families);
-                c->address_families_whitelist = false;
+                c->address_families_allow_list = false;
                 return 0;
         }
 
@@ -3207,7 +3274,7 @@ int config_parse_address_families(
                 if (!c->address_families)
                         return log_oom();
 
-                c->address_families_whitelist = !invert;
+                c->address_families_allow_list = !invert;
         }
 
         for (p = rvalue;;) {
@@ -3235,7 +3302,7 @@ int config_parse_address_families(
                 /* If we previously wanted to forbid an address family and now
                  * we want to allow it, then just remove it from the list.
                  */
-                if (!invert == c->address_families_whitelist)  {
+                if (!invert == c->address_families_allow_list)  {
                         r = set_put(c->address_families, INT_TO_PTR(af));
                         if (r < 0)
                                 return log_oom();
@@ -3431,13 +3498,12 @@ int config_parse_memory_limit(
         uint64_t bytes = CGROUP_LIMIT_MAX;
         int r;
 
-        if (STR_IN_SET(lvalue, "DefaultMemoryLow",
-                               "DefaultMemoryMin",
-                               "MemoryLow",
-                               "MemoryMin"))
+        if (isempty(rvalue) && STR_IN_SET(lvalue, "DefaultMemoryLow",
+                                                  "DefaultMemoryMin",
+                                                  "MemoryLow",
+                                                  "MemoryMin"))
                 bytes = CGROUP_LIMIT_MIN;
-
-        if (!isempty(rvalue) && !streq(rvalue, "infinity")) {
+        else if (!isempty(rvalue) && !streq(rvalue, "infinity")) {
 
                 r = parse_permille(rvalue);
                 if (r < 0) {
@@ -3456,8 +3522,6 @@ int config_parse_memory_limit(
                 }
         }
 
-        /* Keep Memory{Low,Min} unset with empty assignment so that we fall back to DefaultMemory* which in
-         * contrast means zeroing the property. */
         if (streq(lvalue, "DefaultMemoryLow")) {
                 c->default_memory_low = bytes;
                 c->default_memory_low_set = true;
@@ -3466,10 +3530,10 @@ int config_parse_memory_limit(
                 c->default_memory_min_set = true;
         } else if (streq(lvalue, "MemoryMin")) {
                 c->memory_min = bytes;
-                c->memory_min_set = !isempty(rvalue);
+                c->memory_min_set = true;
         } else if (streq(lvalue, "MemoryLow")) {
                 c->memory_low = bytes;
-                c->memory_low_set = !isempty(rvalue);
+                c->memory_low_set = true;
         } else if (streq(lvalue, "MemoryHigh"))
                 c->memory_high = bytes;
         else if (streq(lvalue, "MemoryMax"))
index f0e109da3ac3f729a151d0aa03539b7f83760b52..ac3940a1b7fc092335fc6e0400020b2e4d14c9ae 100644 (file)
@@ -45,6 +45,7 @@ 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_exec_root_hash);
+CONFIG_PARSER_PROTOTYPE(config_parse_exec_root_hash_sig);
 CONFIG_PARSER_PROTOTYPE(config_parse_capability_set);
 CONFIG_PARSER_PROTOTYPE(config_parse_exec_mount_flags);
 CONFIG_PARSER_PROTOTYPE(config_parse_timer);
index 284b77c1fcce9d11b4ca0bbb03d13a4c156f96de..f76b82a8a45a18eb7a1981dcc50e1a1e232810db 100644 (file)
@@ -223,11 +223,9 @@ int machine_id_commit(const char *root) {
                 return log_error_errno(r, "Can't fetch current mount namespace: %m");
 
         /* Switch to a new mount namespace, isolate ourself and unmount etc_machine_id in our new namespace */
-        if (unshare(CLONE_NEWNS) < 0)
-                return log_error_errno(errno, "Failed to enter new namespace: %m");
-
-        if (mount(NULL, "/", NULL, MS_SLAVE | MS_REC, NULL) < 0)
-                return log_error_errno(errno, "Couldn't make-rslave / mountpoint in our private namespace: %m");
+        r = detach_mount_namespace();
+        if (r < 0)
+                return log_error_errno(r, "Failed to set up new mount namespace: %m");
 
         if (umount(etc_machine_id) < 0)
                 return log_error_errno(errno, "Failed to unmount transient %s file in our private namespace: %m", etc_machine_id);
index 6e606d412af07b8e13aa223b0c400f5ec8abdd85..4a376976e94f987c416a60fe26e6c3f48bb8d142 100644 (file)
@@ -42,6 +42,7 @@
 #include "fileio.h"
 #include "format-util.h"
 #include "fs-util.h"
+#include "hexdecoct.h"
 #include "hostname-setup.h"
 #include "ima-setup.h"
 #include "killall.h"
@@ -60,6 +61,7 @@
 #include "pretty-print.h"
 #include "proc-cmdline.h"
 #include "process-util.h"
+#include "random-util.h"
 #include "raw-clone.h"
 #include "rlimit-util.h"
 #if HAVE_SECCOMP
@@ -100,8 +102,8 @@ static enum {
 
 static const char *arg_bus_introspect = NULL;
 
-/* Those variables are initialized to 0 automatically, so we avoid uninitialized memory access.
- * Real defaults are assigned in reset_arguments() below. */
+/* Those variables are initialized to 0 automatically, so we avoid uninitialized memory access.  Real
+ * defaults are assigned in reset_arguments() below. */
 static char *arg_default_unit;
 static bool arg_system;
 static bool arg_dump_core;
@@ -149,6 +151,8 @@ static OOMPolicy arg_default_oom_policy;
 static CPUSet arg_cpu_affinity;
 static NUMAPolicy arg_numa_policy;
 static usec_t arg_clock_usec;
+static void *arg_random_seed;
+static size_t arg_random_seed_size;
 
 /* A copy of the original environment block */
 static char **saved_env = NULL;
@@ -503,6 +507,21 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
                 if (r < 0)
                         log_warning_errno(r, "Failed to parse systemd.clock_usec= argument, ignoring: %s", value);
 
+        } else if (proc_cmdline_key_streq(key, "systemd.random_seed")) {
+                void *p;
+                size_t sz;
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = unbase64mem(value, (size_t) -1, &p, &sz);
+                if (r < 0)
+                        log_warning_errno(r, "Failed to parse systemd.random_seed= argument, ignoring: %s", value);
+
+                free(arg_random_seed);
+                arg_random_seed = sz > 0 ? p : mfree(p);
+                arg_random_seed_size = sz;
+
         } else if (streq(key, "quiet") && !value) {
 
                 if (arg_show_status == _SHOW_STATUS_INVALID)
@@ -1574,6 +1593,9 @@ static void apply_clock_update(void) {
         if (arg_clock_usec == 0)
                 return;
 
+        if (getpid_cached() != 1)
+                return;
+
         if (clock_settime(CLOCK_REALTIME, timespec_store(&ts, arg_clock_usec)) < 0)
                 log_error_errno(errno, "Failed to set system clock to time specified on kernel command line: %m");
         else {
@@ -1584,6 +1606,40 @@ static void apply_clock_update(void) {
         }
 }
 
+static void cmdline_take_random_seed(void) {
+        _cleanup_close_ int random_fd = -1;
+        size_t suggested;
+        int r;
+
+        if (arg_random_seed_size == 0)
+                return;
+
+        if (getpid_cached() != 1)
+                return;
+
+        assert(arg_random_seed);
+        suggested = random_pool_size();
+
+        if (arg_random_seed_size < suggested)
+                log_warning("Random seed specified on kernel command line has size %zu, but %zu bytes required to fill entropy pool.",
+                            arg_random_seed_size, suggested);
+
+        random_fd = open("/dev/urandom", O_WRONLY|O_CLOEXEC|O_NOCTTY);
+        if (random_fd < 0) {
+                log_warning_errno(errno, "Failed to open /dev/urandom for writing, ignoring: %m");
+                return;
+        }
+
+        r = random_write_entropy(random_fd, arg_random_seed, arg_random_seed_size, true);
+        if (r < 0) {
+                log_warning_errno(r, "Failed to credit entropy specified on kernel command line, ignoring: %m");
+                return;
+        }
+
+        log_notice("Successfully credited entropy passed on kernel command line.\n"
+                   "Note that the seed provided this way is accessible to unprivileged programs. This functionality should not be used outside of testing environments.");
+}
+
 static void initialize_coredump(bool skip_setup) {
 #if ENABLE_COREDUMP
         if (getpid_cached() != 1)
@@ -2261,6 +2317,10 @@ static void reset_arguments(void) {
 
         cpu_set_reset(&arg_cpu_affinity);
         numa_policy_reset(&arg_numa_policy);
+
+        arg_random_seed = mfree(arg_random_seed);
+        arg_random_seed_size = 0;
+        arg_clock_usec = 0;
 }
 
 static int parse_configuration(const struct rlimit *saved_rlimit_nofile,
@@ -2559,7 +2619,7 @@ int main(int argc, char *argv[]) {
                         }
 
                         if (mac_selinux_init() < 0) {
-                                error_message = "Failed to initialize SELinux policy";
+                                error_message = "Failed to initialize SELinux support";
                                 goto finish;
                         }
 
@@ -2580,8 +2640,7 @@ int main(int argc, char *argv[]) {
                         /* For later on, see above... */
                         log_set_target(LOG_TARGET_JOURNAL);
 
-                        /* clear the kernel timestamp,
-                         * because we are in a container */
+                        /* clear the kernel timestamp, because we are in a container */
                         kernel_timestamp = DUAL_TIMESTAMP_NULL;
                 }
 
@@ -2600,9 +2659,13 @@ int main(int argc, char *argv[]) {
                 log_set_target(LOG_TARGET_AUTO);
                 log_open();
 
-                /* clear the kernel timestamp,
-                 * because we are not PID 1 */
+                /* clear the kernel timestamp, because we are not PID 1 */
                 kernel_timestamp = DUAL_TIMESTAMP_NULL;
+
+                if (mac_selinux_init() < 0) {
+                        error_message = "Failed to initialize SELinux support";
+                        goto finish;
+                }
         }
 
         if (arg_system) {
@@ -2615,8 +2678,7 @@ int main(int argc, char *argv[]) {
                         log_warning_errno(r, "Failed to redirect standard streams to /dev/null, ignoring: %m");
         }
 
-        /* Mount /proc, /sys and friends, so that /proc/cmdline and
-         * /proc/$PID/fd is available. */
+        /* Mount /proc, /sys and friends, so that /proc/cmdline and /proc/$PID/fd is available. */
         if (getpid_cached() == 1) {
 
                 /* Load the kernel modules early. */
@@ -2689,8 +2751,13 @@ int main(int argc, char *argv[]) {
         assert_se(chdir("/") == 0);
 
         if (arg_action == ACTION_RUN) {
-                /* Apply the systemd.clock_usec= kernel command line switch */
-                apply_clock_update();
+                if (!skip_setup) {
+                        /* Apply the systemd.clock_usec= kernel command line switch */
+                        apply_clock_update();
+
+                        /* Apply random seed from kernel command line */
+                        cmdline_take_random_seed();
+                }
 
                 /* A core pattern might have been specified via the cmdline.  */
                 initialize_core_pattern(skip_setup);
index 959181d20478c25b8a0553fbc79bbf4bdb43a41a..743ef6b4fc32eaed79e61222c088be088847774b 100644 (file)
@@ -1932,10 +1932,19 @@ unsigned manager_dispatch_load_queue(Manager *m) {
         return n;
 }
 
-static bool manager_unit_cache_needs_refresh(Manager *m) {
-        assert(m);
+bool manager_unit_file_maybe_loadable_from_cache(Unit *u) {
+        assert(u);
+
+        if (u->load_state != UNIT_NOT_FOUND)
+                return false;
+
+        if (u->manager->unit_cache_mtime == 0)
+                return false;
+
+        if (u->manager->unit_cache_mtime > u->fragment_loadtime)
+                return true;
 
-        return m->unit_cache_mtime > 0 && !lookup_paths_mtime_good(&m->lookup_paths, m->unit_cache_mtime);
+        return !lookup_paths_mtime_good(&u->manager->lookup_paths, u->manager->unit_cache_mtime);
 }
 
 int manager_load_unit_prepare(
@@ -1982,8 +1991,12 @@ int manager_load_unit_prepare(
                  * but if they are already referenced (because of dependencies or ordering)
                  * then we have to force a load of the fragment. As an optimization, check
                  * first if anything in the usual paths was modified since the last time
-                 * the cache was loaded. */
-                if (ret->load_state == UNIT_NOT_FOUND && manager_unit_cache_needs_refresh(m))
+                 * the cache was loaded. Also check if the last time an attempt to load the
+                 * unit was made was before the most recent cache refresh, so that we know
+                 * we need to try again - even if the cache is current, it might have been
+                 * updated in a different context before we had a chance to retry loading
+                 * this particular unit. */
+                if (manager_unit_file_maybe_loadable_from_cache(ret))
                         ret->load_state = UNIT_STUB;
                 else {
                         *_ret = ret;
@@ -4474,12 +4487,9 @@ int manager_update_failed_units(Manager *m, Unit *u, bool failed) {
         size = set_size(m->failed_units);
 
         if (failed) {
-                r = set_ensure_allocated(&m->failed_units, NULL);
+                r = set_ensure_put(&m->failed_units, NULL, u);
                 if (r < 0)
                         return log_oom();
-
-                if (set_put(m->failed_units, u) < 0)
-                        return log_oom();
         } else
                 (void) set_remove(m->failed_units, u);
 
index 2cd0dacdb03d52559b642adc56c2ce2999ca20d5..81b0c13a955a7bcbbb56cc655ce74eaf24215e0f 100644 (file)
@@ -463,6 +463,7 @@ Unit *manager_get_unit(Manager *m, const char *name);
 
 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j);
 
+bool manager_unit_file_maybe_loadable_from_cache(Unit *u);
 int manager_load_unit_prepare(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
 int manager_load_unit(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
 int manager_load_startable_unit_or_warn(Manager *m, const char *name, const char *path, Unit **ret);
index 8b30a4db6a98770d0cbb0792151c46bbd7dd0b80..337e94e90e40fab47ab4a166db38f9ae730098ee 100644 (file)
@@ -1017,8 +1017,11 @@ static void mount_enter_mounting(Mount *m) {
 
         /* Create the source directory for bind-mounts if needed */
         p = get_mount_parameters_fragment(m);
-        if (p && mount_is_bind(p))
-                (void) mkdir_p_label(p->what, m->directory_mode);
+        if (p && mount_is_bind(p)) {
+                r = mkdir_p_label(p->what, m->directory_mode);
+                if (r < 0)
+                        log_unit_error_errno(UNIT(m), r, "Failed to make bind mount source '%s': %m", p->what);
+        }
 
         if (p) {
                 _cleanup_free_ char *opts = NULL;
index 423a47c7b8ce855c81c1ea6f099ea505cc476100..b2bbcf58f2dafb29231270242bab52679fadae94 100644 (file)
@@ -747,7 +747,7 @@ static int mount_private_dev(MountEntry *m) {
 
         NULSTR_FOREACH(d, devnodes) {
                 r = clone_device_node(d, temporary_mount, &can_mknod);
-                /* ENXIO means the the *source* is not a device file, skip creation in that case */
+                /* ENXIO means the *source* is not a device file, skip creation in that case */
                 if (r < 0 && r != -ENXIO)
                         goto fail;
         }
@@ -1034,7 +1034,7 @@ static int apply_mount(
                         /* Hmm, either the source or the destination are missing. Let's see if we can create the destination, then try again */
 
                         if (stat(what, &st) < 0)
-                                log_debug_errno(errno, "Mount point source '%s' is not accessible: %m", what);
+                                log_error_errno(errno, "Mount point source '%s' is not accessible: %m", what);
                         else {
                                 int q;
 
@@ -1046,7 +1046,7 @@ static int apply_mount(
                                         q = touch(mount_entry_path(m));
 
                                 if (q < 0)
-                                        log_debug_errno(q, "Failed to create destination mount point node '%s': %m", mount_entry_path(m));
+                                        log_error_errno(q, "Failed to create destination mount point node '%s': %m", mount_entry_path(m));
                                 else
                                         try_again = true;
                         }
@@ -1060,14 +1060,14 @@ static int apply_mount(
                 }
 
                 if (r < 0)
-                        return log_debug_errno(r, "Failed to mount %s to %s: %m", what, mount_entry_path(m));
+                        return log_error_errno(r, "Failed to mount %s to %s: %m", what, mount_entry_path(m));
         }
 
         log_debug("Successfully mounted %s to %s", what, mount_entry_path(m));
         return 0;
 }
 
-static int make_read_only(const MountEntry *m, char **blacklist, FILE *proc_self_mountinfo) {
+static int make_read_only(const MountEntry *m, char **deny_list, FILE *proc_self_mountinfo) {
         unsigned long new_flags = 0, flags_mask = 0;
         bool submounts = false;
         int r = 0;
@@ -1096,7 +1096,7 @@ static int make_read_only(const MountEntry *m, char **blacklist, FILE *proc_self
                 mount_entry_read_only(m) &&
                 !IN_SET(m->mode, EMPTY_DIR, TMPFS);
         if (submounts)
-                r = bind_remount_recursive_with_mountinfo(mount_entry_path(m), new_flags, flags_mask, blacklist, proc_self_mountinfo);
+                r = bind_remount_recursive_with_mountinfo(mount_entry_path(m), new_flags, flags_mask, deny_list, proc_self_mountinfo);
         else
                 r = bind_remount_one_with_mountinfo(mount_entry_path(m), new_flags, flags_mask, proc_self_mountinfo);
 
@@ -1260,6 +1260,9 @@ int setup_namespace(
                 const void *root_hash,
                 size_t root_hash_size,
                 const char *root_hash_path,
+                const void *root_hash_sig,
+                size_t root_hash_sig_size,
+                const char *root_hash_sig_path,
                 const char *root_verity,
                 DissectImageFlags dissect_image_flags,
                 char **error_path) {
@@ -1268,7 +1271,7 @@ int setup_namespace(
         _cleanup_(decrypted_image_unrefp) DecryptedImage *decrypted_image = NULL;
         _cleanup_(dissected_image_unrefp) DissectedImage *dissected_image = NULL;
         _cleanup_free_ void *root_hash_decoded = NULL;
-        _cleanup_free_ char *verity_data = NULL;
+        _cleanup_free_ char *verity_data = NULL, *hash_sig_path = NULL;
         MountEntry *m = NULL, *mounts = NULL;
         size_t n_mounts;
         bool require_prefix = false;
@@ -1299,7 +1302,7 @@ int setup_namespace(
                 if (r < 0)
                         return log_debug_errno(r, "Failed to create loop device for root image: %m");
 
-                r = verity_metadata_load(root_image, root_hash_path, root_hash ? NULL : &root_hash_decoded, root_hash ? NULL : &root_hash_size, root_verity ? NULL : &verity_data);
+                r = verity_metadata_load(root_image, root_hash_path, root_hash ? NULL : &root_hash_decoded, root_hash ? NULL : &root_hash_size, root_verity ? NULL : &verity_data, root_hash_sig || root_hash_sig_path ? NULL : &hash_sig_path);
                 if (r < 0)
                         return log_debug_errno(r, "Failed to load root hash: %m");
                 dissect_image_flags |= root_verity || verity_data ? DISSECT_IMAGE_NO_PARTITION_TABLE : 0;
@@ -1308,7 +1311,7 @@ int setup_namespace(
                 if (r < 0)
                         return log_debug_errno(r, "Failed to dissect image: %m");
 
-                r = dissected_image_decrypt(dissected_image, NULL, root_hash ?: root_hash_decoded, root_hash_size, root_verity ?: verity_data, dissect_image_flags, &decrypted_image);
+                r = dissected_image_decrypt(dissected_image, NULL, root_hash ?: root_hash_decoded, root_hash_size, root_verity ?: verity_data, root_hash_sig_path ?: hash_sig_path, root_hash_sig, root_hash_sig_size, dissect_image_flags, &decrypted_image);
                 if (r < 0)
                         return log_debug_errno(r, "Failed to decrypt dissected image: %m");
         }
@@ -1538,7 +1541,7 @@ int setup_namespace(
 
         if (n_mounts > 0) {
                 _cleanup_fclose_ FILE *proc_self_mountinfo = NULL;
-                _cleanup_free_ char **blacklist = NULL;
+                _cleanup_free_ char **deny_list = NULL;
                 size_t j;
 
                 /* Open /proc/self/mountinfo now as it may become unavailable if we mount anything on top of /proc.
@@ -1591,19 +1594,19 @@ int setup_namespace(
                         normalize_mounts(root, mounts, &n_mounts);
                 }
 
-                /* Create a blacklist we can pass to bind_mount_recursive() */
-                blacklist = new(char*, n_mounts+1);
-                if (!blacklist) {
+                /* Create a deny list we can pass to bind_mount_recursive() */
+                deny_list = new(char*, n_mounts+1);
+                if (!deny_list) {
                         r = -ENOMEM;
                         goto finish;
                 }
                 for (j = 0; j < n_mounts; j++)
-                        blacklist[j] = (char*) mount_entry_path(mounts+j);
-                blacklist[j] = NULL;
+                        deny_list[j] = (char*) mount_entry_path(mounts+j);
+                deny_list[j] = NULL;
 
                 /* Second round, flip the ro bits if necessary. */
                 for (m = mounts; m < mounts + n_mounts; ++m) {
-                        r = make_read_only(m, blacklist, proc_self_mountinfo);
+                        r = make_read_only(m, deny_list, proc_self_mountinfo);
                         if (r < 0) {
                                 if (error_path && mount_entry_path(m))
                                         *error_path = strdup(mount_entry_path(m));
index a687be5bfda92776dfefbf67690c5cf46f0a778d..b04b9b442ea3bddeb1b9a4855081ec77869fd091 100644 (file)
@@ -91,6 +91,9 @@ int setup_namespace(
                 const void *root_hash,
                 size_t root_hash_size,
                 const char *root_hash_path,
+                const void *root_hash_sig,
+                size_t root_hash_sig_size,
+                const char *root_hash_sig_path,
                 const char *root_verity,
                 DissectImageFlags dissected_image_flags,
                 char **error_path);
index 1bbf27c5c571c1fb2aba6a8cf5060c3609b67a63..1c3c28e34172c2b5484ded964e723283da82f969 100644 (file)
@@ -174,15 +174,13 @@ int path_spec_fd_event(PathSpec *s, uint32_t revents) {
         return r;
 }
 
-static bool path_spec_check_good(PathSpec *s, bool initial) {
+static bool path_spec_check_good(PathSpec *s, bool initial, bool from_trigger_notify) {
         bool b, good = false;
 
         switch (s->type) {
 
         case PATH_EXISTS:
-                b = access(s->path, F_OK) >= 0;
-                good = b && !s->previous_exists;
-                s->previous_exists = b;
+                good = access(s->path, F_OK) >= 0;
                 break;
 
         case PATH_EXISTS_GLOB:
@@ -200,7 +198,7 @@ static bool path_spec_check_good(PathSpec *s, bool initial) {
         case PATH_CHANGED:
         case PATH_MODIFIED:
                 b = access(s->path, F_OK) >= 0;
-                good = !initial && b != s->previous_exists;
+                good = !initial && !from_trigger_notify && b != s->previous_exists;
                 s->previous_exists = b;
                 break;
 
@@ -425,8 +423,7 @@ static void path_set_state(Path *p, PathState state) {
         old_state = p->state;
         p->state = state;
 
-        if (state != PATH_WAITING &&
-            (state != PATH_RUNNING || p->inotify_triggered))
+        if (!IN_SET(state, PATH_WAITING, PATH_RUNNING))
                 path_unwatch(p);
 
         if (state != old_state)
@@ -435,7 +432,7 @@ static void path_set_state(Path *p, PathState state) {
         unit_notify(UNIT(p), state_translation_table[old_state], state_translation_table[state], 0);
 }
 
-static void path_enter_waiting(Path *p, bool initial, bool recheck);
+static void path_enter_waiting(Path *p, bool initial, bool from_trigger_notify);
 
 static int path_coldplug(Unit *u) {
         Path *p = PATH(u);
@@ -446,7 +443,7 @@ static int path_coldplug(Unit *u) {
         if (p->deserialized_state != p->state) {
 
                 if (IN_SET(p->deserialized_state, PATH_WAITING, PATH_RUNNING))
-                        path_enter_waiting(p, true, true);
+                        path_enter_waiting(p, true, false);
                 else
                         path_set_state(p, p->deserialized_state);
         }
@@ -486,8 +483,6 @@ static void path_enter_running(Path *p) {
         if (r < 0)
                 goto fail;
 
-        p->inotify_triggered = false;
-
         path_set_state(p, PATH_RUNNING);
         path_unwatch(p);
 
@@ -498,27 +493,35 @@ fail:
         path_enter_dead(p, PATH_FAILURE_RESOURCES);
 }
 
-static bool path_check_good(Path *p, bool initial) {
+static bool path_check_good(Path *p, bool initial, bool from_trigger_notify) {
         PathSpec *s;
 
         assert(p);
 
         LIST_FOREACH(spec, s, p->specs)
-                if (path_spec_check_good(s, initial))
+                if (path_spec_check_good(s, initial, from_trigger_notify))
                         return true;
 
         return false;
 }
 
-static void path_enter_waiting(Path *p, bool initial, bool recheck) {
+static void path_enter_waiting(Path *p, bool initial, bool from_trigger_notify) {
+        Unit *trigger;
         int r;
 
-        if (recheck)
-                if (path_check_good(p, initial)) {
-                        log_unit_debug(UNIT(p), "Got triggered.");
-                        path_enter_running(p);
-                        return;
-                }
+        /* If the triggered unit is already running, so are we */
+        trigger = UNIT_TRIGGER(UNIT(p));
+        if (trigger && !UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(trigger))) {
+                path_set_state(p, PATH_RUNNING);
+                path_unwatch(p);
+                return;
+        }
+
+        if (path_check_good(p, initial, from_trigger_notify)) {
+                log_unit_debug(UNIT(p), "Got triggered.");
+                path_enter_running(p);
+                return;
+        }
 
         r = path_watch(p);
         if (r < 0)
@@ -528,12 +531,11 @@ static void path_enter_waiting(Path *p, bool initial, bool recheck) {
          * might have appeared/been removed by now, so we must
          * recheck */
 
-        if (recheck)
-                if (path_check_good(p, false)) {
-                        log_unit_debug(UNIT(p), "Got triggered.");
-                        path_enter_running(p);
-                        return;
-                }
+        if (path_check_good(p, false, from_trigger_notify)) {
+                log_unit_debug(UNIT(p), "Got triggered.");
+                path_enter_running(p);
+                return;
+        }
 
         path_set_state(p, PATH_WAITING);
         return;
@@ -579,7 +581,7 @@ static int path_start(Unit *u) {
         path_mkdir(p);
 
         p->result = PATH_SUCCESS;
-        path_enter_waiting(p, true, true);
+        path_enter_waiting(p, true, false);
 
         return 1;
 }
@@ -617,7 +619,7 @@ static int path_serialize(Unit *u, FILE *f, FDSet *fds) {
                 (void) serialize_item_format(f, "path-spec", "%s %i %s",
                                              type,
                                              s->previous_exists,
-                                             s->path);
+                                             escaped);
         }
 
         return 0;
@@ -728,15 +730,10 @@ static int path_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
         if (changed < 0)
                 goto fail;
 
-        /* If we are already running, then remember that one event was
-         * dispatched so that we restart the service only if something
-         * actually changed on disk */
-        p->inotify_triggered = true;
-
         if (changed)
                 path_enter_running(p);
         else
-                path_enter_waiting(p, false, true);
+                path_enter_waiting(p, false, false);
 
         return 0;
 
@@ -760,11 +757,11 @@ static void path_trigger_notify(Unit *u, Unit *other) {
         if (p->state == PATH_RUNNING &&
             UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other))) {
                 log_unit_debug(UNIT(p), "Got notified about unit deactivation.");
-
-                /* Hmm, so inotify was triggered since the
-                 * last activation, so I guess we need to
-                 * recheck what is going on. */
-                path_enter_waiting(p, false, p->inotify_triggered);
+                path_enter_waiting(p, false, true);
+        } else if (p->state == PATH_WAITING &&
+                   !UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other))) {
+                log_unit_debug(UNIT(p), "Got notified about unit activation.");
+                path_enter_waiting(p, false, true);
         }
 }
 
index 4d4b6236c27f155ce866eef120e1829fdb932ee0..9e2836535a978c2caff2350a31349e91a92f3a13 100644 (file)
@@ -56,8 +56,6 @@ struct Path {
 
         PathState state, deserialized_state;
 
-        bool inotify_triggered;
-
         bool make_directory;
         mode_t directory_mode;
 
index ef6470656ce22ec5a242a6ee2adf8c1862d8b7fe..4a57b8e3f9c32f65db09cff8f8b76f97f260f7d5 100644 (file)
@@ -954,6 +954,24 @@ int transaction_add_job_and_dependencies(
 
         if (type != JOB_STOP) {
                 r = bus_unit_validate_load_state(unit, e);
+                /* The time-based cache allows to start new units without daemon-reload,
+                 * but if they are already referenced (because of dependencies or ordering)
+                 * then we have to force a load of the fragment. As an optimization, check
+                 * first if anything in the usual paths was modified since the last time
+                 * the cache was loaded. Also check if the last time an attempt to load the
+                 * unit was made was before the most recent cache refresh, so that we know
+                 * we need to try again - even if the cache is current, it might have been
+                 * updated in a different context before we had a chance to retry loading
+                 * this particular unit.
+                 * 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)) {
+                        unit->load_state = UNIT_STUB;
+                        r = unit_load(unit);
+                        if (r < 0 || unit->load_state == UNIT_STUB)
+                                unit->load_state = UNIT_NOT_FOUND;
+                        r = bus_unit_validate_load_state(unit, e);
+                }
                 if (r < 0)
                         return r;
         }
index e50080cd97ac70533ce5e1fdbed549af9e485fae..2c09def06f3b228450cea414b582287422175fe5 100644 (file)
@@ -258,7 +258,7 @@ int unit_add_name(Unit *u, const char *text) {
         t = unit_name_to_type(name);
         if (t < 0)
                 return log_unit_debug_errno(u, SYNTHETIC_ERRNO(EINVAL),
-                                            "failed to to derive unit type from name '%s': %m", name);
+                                            "failed to derive unit type from name '%s': %m", name);
 
         if (u->type != _UNIT_TYPE_INVALID && t != u->type)
                 return log_unit_debug_errno(u, SYNTHETIC_ERRNO(EINVAL),
@@ -1591,7 +1591,6 @@ static int unit_add_mount_dependencies(Unit *u) {
 
 static int unit_add_startup_units(Unit *u) {
         CGroupContext *c;
-        int r;
 
         c = unit_get_cgroup_context(u);
         if (!c)
@@ -1602,11 +1601,7 @@ static int unit_add_startup_units(Unit *u) {
             c->startup_blockio_weight == CGROUP_BLKIO_WEIGHT_INVALID)
                 return 0;
 
-        r = set_ensure_allocated(&u->manager->startup_units, NULL);
-        if (r < 0)
-                return r;
-
-        return set_put(u->manager->startup_units, u);
+        return set_ensure_put(&u->manager->startup_units, NULL, u);
 }
 
 int unit_load(Unit *u) {
@@ -1687,6 +1682,11 @@ fail:
                                                      UNIT_ERROR;
         u->load_error = r;
 
+        /* Record the last time we tried to load the unit, so that if the cache gets updated between now
+         * and the next time an attempt is made to load this unit, we know we need to check again */
+        if (u->load_state == UNIT_NOT_FOUND)
+                u->fragment_loadtime = now(CLOCK_REALTIME);
+
         unit_add_to_dbus_queue(u);
         unit_add_to_gc_queue(u);
 
@@ -4529,24 +4529,27 @@ int unit_patch_contexts(Unit *u) {
 
                 if (ec->root_image &&
                     (cc->device_policy != CGROUP_DEVICE_POLICY_AUTO || cc->device_allow)) {
+                        const char *p;
 
                         /* When RootImage= is specified, the following devices are touched. */
-                        r = cgroup_add_device_allow(cc, "/dev/loop-control", "rw");
-                        if (r < 0)
-                                return r;
-
-                        r = cgroup_add_device_allow(cc, "block-loop", "rwm");
-                        if (r < 0)
-                                return r;
-
-                        r = cgroup_add_device_allow(cc, "block-blkext", "rwm");
-                        if (r < 0)
-                                return r;
+                        FOREACH_STRING(p, "/dev/loop-control", "/dev/mapper/control") {
+                                r = cgroup_add_device_allow(cc, p, "rw");
+                                if (r < 0)
+                                        return r;
+                        }
+                        FOREACH_STRING(p, "block-loop", "block-blkext", "block-device-mapper") {
+                                r = cgroup_add_device_allow(cc, p, "rwm");
+                                if (r < 0)
+                                        return r;
+                        }
 
-                        /* Make sure "block-loop" can be resolved, i.e. make sure "loop" shows up in /proc/devices */
-                        r = unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_WANTS, "modprobe@loop.service", true, UNIT_DEPENDENCY_FILE);
-                        if (r < 0)
-                                return r;
+                        /* Make sure "block-loop" can be resolved, i.e. make sure "loop" shows up in /proc/devices.
+                         * Same for mapper and verity. */
+                        FOREACH_STRING(p, "modprobe@loop.service", "modprobe@dm_mod.service", "modprobe@dm_verity.service") {
+                                r = unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_WANTS, p, true, UNIT_DEPENDENCY_FILE);
+                                if (r < 0)
+                                        return r;
+                        }
                 }
 
                 if (ec->protect_clock) {
@@ -5952,7 +5955,7 @@ const char *unit_label_path(const Unit *u) {
                 return NULL;
 
         /* If a unit is masked, then don't read the SELinux label of /dev/null, as that really makes no sense */
-        if (path_equal(p, "/dev/null"))
+        if (null_or_empty_path(p) > 0)
                 return NULL;
 
         return p;
index 6a90daa7cedb45263a19ce3fa80a0a174f425000..d5e4c65989e400922724efb333714b91bfa06e67 100644 (file)
@@ -136,6 +136,7 @@ typedef struct Unit {
         char *source_path; /* if converted, the source file */
         char **dropin_paths;
 
+        usec_t fragment_loadtime;
         usec_t fragment_mtime;
         usec_t source_mtime;
         usec_t dropin_mtime;
index d156d98efcd41b3ddf07bc4c2d7ba5d66a8263b8..1a41f260499e4b2641229fe9903cac621f99d951 100644 (file)
@@ -423,7 +423,7 @@ static int save_external_coredump(
                 goto fail;
         }
 
-#if HAVE_XZ || HAVE_LZ4 || HAVE_ZSTD
+#if HAVE_COMPRESSION
         /* If we will remove the coredump anyway, do not compress. */
         if (arg_compress && !maybe_remove_external_coredump(NULL, st.st_size)) {
 
index ed4d06e9866dd1e4af044bc99d33e4d3b1b10139..02502528afe2bf3909d53742410e29f8e19c64e5 100644 (file)
@@ -824,7 +824,7 @@ static int save_core(sd_journal *j, FILE *file, char **path, bool *unlink_temp)
         }
 
         if (filename) {
-#if HAVE_XZ || HAVE_LZ4 || HAVE_ZSTD
+#if HAVE_COMPRESSION
                 _cleanup_close_ int fdf;
 
                 fdf = open(filename, O_RDONLY | O_CLOEXEC);
@@ -839,8 +839,8 @@ static int save_core(sd_journal *j, FILE *file, char **path, bool *unlink_temp)
                         goto error;
                 }
 #else
-                log_error("Cannot decompress file. Compiled without compression support.");
-                r = -EOPNOTSUPP;
+                r = log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
+                                    "Cannot decompress file. Compiled without compression support.");
                 goto error;
 #endif
         } else {
@@ -1091,9 +1091,7 @@ static int run(int argc, char *argv[]) {
         int r, units_active;
 
         setlocale(LC_ALL, "");
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         /* The journal merging logic potentially needs a lot of fds. */
         (void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
index 2c341702dd990288702d44cf14a068689335f6d9..b93fbb86604ece64b63a3d096f5c0927922b6d58 100644 (file)
@@ -39,7 +39,7 @@ static bool arg_enabled = true;
 static bool arg_read_crypttab = true;
 static const char *arg_crypttab = NULL;
 static const char *arg_runtime_directory = NULL;
-static bool arg_whitelist = false;
+static bool arg_allow_list = false;
 static Hashmap *arg_disks = NULL;
 static char *arg_default_options = NULL;
 static char *arg_default_keyfile = NULL;
@@ -495,7 +495,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
                 if (!d)
                         return log_oom();
 
-                d->create = arg_whitelist = true;
+                d->create = arg_allow_list = true;
 
         } else if (streq(key, "luks.options")) {
 
@@ -559,7 +559,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
                         if (!d)
                                 return log_oom();
 
-                        d->create = arg_whitelist = true;
+                        d->create = arg_allow_list = true;
 
                         free_and_replace(d->name, uuid_value);
                 } else
@@ -622,7 +622,7 @@ static int add_crypttab_devices(void) {
                 if (uuid)
                         d = hashmap_get(arg_disks, uuid);
 
-                if (arg_whitelist && !d) {
+                if (arg_allow_list && !d) {
                         log_info("Not creating device '%s' because it was not specified on the kernel command line.", name);
                         continue;
                 }
index 2d80d3a664b3871edcb4c190fba3c5f152c8a6e8..29e5120375e22d52c4892ad191dcde9ee5c323eb 100644 (file)
@@ -643,9 +643,7 @@ static int parse_argv(int argc, char *argv[]) {
 static int run(int argc, char *argv[]) {
         int r, k, n_found = 0;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 7fb80ca138abe6d68f97eb1e7506d7fd22c1080b..4f38de8e29fb8315bcae96c45222e9c7402441d6 100644 (file)
@@ -128,9 +128,7 @@ static int run(int argc, char *argv[]) {
          * to detect whether we are being run in a virtualized
          * environment or not */
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 2a8eaca5bd10945de87700b4792ccbb8791c28fa..66ac638401cf50d8c19fceda7073a37df7833d71 100644 (file)
@@ -28,9 +28,14 @@ static DissectImageFlags arg_flags = DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_DI
 static void *arg_root_hash = NULL;
 static char *arg_verity_data = NULL;
 static size_t arg_root_hash_size = 0;
+static char *arg_root_hash_sig_path = NULL;
+static void *arg_root_hash_sig = NULL;
+static size_t arg_root_hash_sig_size = 0;
 
 STATIC_DESTRUCTOR_REGISTER(arg_root_hash, freep);
 STATIC_DESTRUCTOR_REGISTER(arg_verity_data, freep);
+STATIC_DESTRUCTOR_REGISTER(arg_root_hash_sig_path, freep);
+STATIC_DESTRUCTOR_REGISTER(arg_root_hash_sig, freep);
 
 static void help(void) {
         printf("%s [OPTIONS...] IMAGE\n"
@@ -43,6 +48,10 @@ static void help(void) {
                "     --fsck=BOOL          Run fsck before mounting\n"
                "     --discard=MODE       Choose 'discard' mode (disabled, loop, all, crypto)\n"
                "     --root-hash=HASH     Specify root hash for verity\n"
+               "     --root-hash-sig=SIG  Specify pkcs7 signature of root hash for verity\n"
+               "                          as a DER encoded PKCS7, either as a path to a file\n"
+               "                          or as an ASCII base64 encoded string prefixed by\n"
+               "                          'base64:'\n"
                "     --verity-data=PATH   Specify data file with hash tree for verity if it is\n"
                "                          not embedded in IMAGE\n",
                program_invocation_short_name,
@@ -57,17 +66,19 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_ROOT_HASH,
                 ARG_FSCK,
                 ARG_VERITY_DATA,
+                ARG_ROOT_HASH_SIG,
         };
 
         static const struct option options[] = {
-                { "help",          no_argument,       NULL, 'h'              },
-                { "version",       no_argument,       NULL, ARG_VERSION      },
-                { "mount",         no_argument,       NULL, 'm'              },
-                { "read-only",     no_argument,       NULL, 'r'              },
-                { "discard",       required_argument, NULL, ARG_DISCARD      },
-                { "root-hash",     required_argument, NULL, ARG_ROOT_HASH    },
-                { "fsck",          required_argument, NULL, ARG_FSCK         },
-                { "verity-data",   required_argument, NULL, ARG_VERITY_DATA  },
+                { "help",          no_argument,       NULL, 'h'               },
+                { "version",       no_argument,       NULL, ARG_VERSION       },
+                { "mount",         no_argument,       NULL, 'm'               },
+                { "read-only",     no_argument,       NULL, 'r'               },
+                { "discard",       required_argument, NULL, ARG_DISCARD       },
+                { "root-hash",     required_argument, NULL, ARG_ROOT_HASH     },
+                { "fsck",          required_argument, NULL, ARG_FSCK          },
+                { "verity-data",   required_argument, NULL, ARG_VERITY_DATA   },
+                { "root-hash-sig", required_argument, NULL, ARG_ROOT_HASH_SIG },
                 {}
         };
 
@@ -140,6 +151,31 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_ROOT_HASH_SIG: {
+                        char *value;
+
+                        if ((value = startswith(optarg, "base64:"))) {
+                                void *p;
+                                size_t l;
+
+                                r = unbase64mem(value, strlen(value), &p, &l);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to parse root hash signature '%s': %m", optarg);
+
+                                free_and_replace(arg_root_hash_sig, p);
+                                arg_root_hash_sig_size = l;
+                                arg_root_hash_sig_path = mfree(arg_root_hash_sig_path);
+                        } else {
+                                r = parse_path_argument_and_warn(optarg, false, &arg_root_hash_sig_path);
+                                if (r < 0)
+                                        return r;
+                                arg_root_hash_sig = mfree(arg_root_hash_sig);
+                                arg_root_hash_sig_size = 0;
+                        }
+
+                        break;
+                }
+
                 case ARG_FSCK:
                         r = parse_boolean(optarg);
                         if (r < 0)
@@ -202,7 +238,8 @@ static int run(int argc, char *argv[]) {
                 return log_error_errno(r, "Failed to set up loopback device: %m");
 
         r = verity_metadata_load(arg_image, NULL, arg_root_hash ? NULL : &arg_root_hash, &arg_root_hash_size,
-                           arg_verity_data ? NULL : &arg_verity_data);
+                           arg_verity_data ? NULL : &arg_verity_data,
+                           arg_root_hash_sig_path || arg_root_hash_sig ? NULL : &arg_root_hash_sig_path);
         if (r < 0)
                 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;
@@ -279,7 +316,7 @@ static int run(int argc, char *argv[]) {
         }
 
         case ACTION_MOUNT:
-                r = dissected_image_decrypt_interactively(m, NULL, arg_root_hash, arg_root_hash_size, arg_verity_data, arg_flags, &di);
+                r = dissected_image_decrypt_interactively(m, NULL, arg_root_hash, arg_root_hash_size, arg_verity_data, arg_root_hash_sig_path, arg_root_hash_sig, arg_root_hash_sig_size, arg_flags, &di);
                 if (r < 0)
                         return r;
 
index 9066c30853bc8bfd682d69c3e2d06a34551febb2..0c543a90f6b7994267f42f28ebe32af9642ff398 100644 (file)
@@ -159,9 +159,7 @@ static int run(int argc, char *argv[]) {
         char **i;
         int r;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 0c3ef3e2a7ec3d4d4a1b2a60977b6f8cb3f7f426..5c9ee779ca989cf25c8e7bf4ded47d6e02fc6020 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <fcntl.h>
 #include <getopt.h>
+#include <linux/loop.h>
 #include <unistd.h>
 
 #include "sd-id128.h"
@@ -9,6 +10,7 @@
 #include "alloc-util.h"
 #include "ask-password-api.h"
 #include "copy.h"
+#include "dissect-image.h"
 #include "env-file.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "kbd-util.h"
 #include "libcrypt-util.h"
 #include "locale-util.h"
+#include "loop-util.h"
 #include "main-func.h"
 #include "memory-util.h"
 #include "mkdir.h"
+#include "mount-util.h"
+#include "namespace-util.h"
 #include "os-util.h"
 #include "parse-util.h"
 #include "path-util.h"
 #include "terminal-util.h"
 #include "time-util.h"
 #include "tmpfile-util-label.h"
+#include "tmpfile-util.h"
 #include "umask-util.h"
 #include "user-util.h"
 
 static char *arg_root = NULL;
+static char *arg_image = NULL;
 static char *arg_locale = NULL;  /* $LANG */
 static char *arg_keymap = NULL;
 static char *arg_locale_messages = NULL; /* $LC_MESSAGES */
@@ -55,8 +62,10 @@ static bool arg_copy_root_password = false;
 static bool arg_force = false;
 static bool arg_delete_root_password = false;
 static bool arg_root_password_is_hashed = false;
+static bool arg_welcome = true;
 
 STATIC_DESTRUCTOR_REGISTER(arg_root, freep);
+STATIC_DESTRUCTOR_REGISTER(arg_image, freep);
 STATIC_DESTRUCTOR_REGISTER(arg_locale, freep);
 STATIC_DESTRUCTOR_REGISTER(arg_locale_messages, freep);
 STATIC_DESTRUCTOR_REGISTER(arg_keymap, freep);
@@ -85,6 +94,9 @@ static void print_welcome(void) {
         const char *pn;
         int r;
 
+        if (!arg_welcome)
+                return;
+
         if (done)
                 return;
 
@@ -826,6 +838,75 @@ static int process_kernel_cmdline(void) {
         return 0;
 }
 
+static int setup_image(char **ret_mount_dir, LoopDevice **ret_loop_device, DecryptedImage **ret_decrypted_image) {
+        DissectImageFlags f = DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_VALIDATE_OS|DISSECT_IMAGE_RELAX_VAR_CHECK|DISSECT_IMAGE_FSCK;
+        _cleanup_(loop_device_unrefp) LoopDevice *d = NULL;
+        _cleanup_(decrypted_image_unrefp) DecryptedImage *decrypted_image = NULL;
+        _cleanup_(dissected_image_unrefp) DissectedImage *dissected_image = NULL;
+        _cleanup_(rmdir_and_freep) char *mount_dir = NULL;
+        _cleanup_free_ char *temp = NULL;
+        int r;
+
+        if (!arg_image) {
+                *ret_mount_dir = NULL;
+                *ret_decrypted_image = NULL;
+                *ret_loop_device = NULL;
+                return 0;
+        }
+
+        assert(!arg_root);
+
+        r = tempfn_random_child(NULL, "firstboot", &temp);
+        if (r < 0)
+                return log_error_errno(r, "Failed to generate temporary mount directory: %m");
+
+        r = loop_device_make_by_path(arg_image, O_RDWR, LO_FLAGS_PARTSCAN, &d);
+        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);
+        if (r < 0)
+                return r;
+
+        r = dissected_image_decrypt_interactively(dissected_image, NULL, NULL, 0, NULL, NULL, NULL, 0, f, &decrypted_image);
+        if (r < 0)
+                return r;
+
+        r = detach_mount_namespace();
+        if (r < 0)
+                return log_error_errno(r, "Failed to detach mount namespace: %m");
+
+        mount_dir = strdup(temp);
+        if (!mount_dir)
+                return log_oom();
+
+        r = mkdir_p(mount_dir, 0700);
+        if (r < 0) {
+                mount_dir = mfree(mount_dir);
+                return log_error_errno(r, "Failed to create mount point: %m");
+        }
+
+        r = dissected_image_mount(dissected_image, mount_dir, UID_INVALID, f);
+        if (r < 0)
+                return log_error_errno(r, "Failed to mount image: %m");
+
+        if (decrypted_image) {
+                r = decrypted_image_relinquish(decrypted_image);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to relinquish DM devices: %m");
+        }
+
+        loop_device_relinquish(d);
+
+        arg_root = TAKE_PTR(temp);
+
+        *ret_mount_dir = TAKE_PTR(mount_dir);
+        *ret_decrypted_image = TAKE_PTR(decrypted_image);
+        *ret_loop_device = TAKE_PTR(d);
+
+        return 1;
+}
+
 static int help(void) {
         _cleanup_free_ char *link = NULL;
         int r;
@@ -839,6 +920,7 @@ static int help(void) {
                "  -h --help                                 Show this help\n"
                "     --version                              Show package version\n"
                "     --root=PATH                            Operate on an alternate filesystem root\n"
+               "     --image=PATH                           Operate on an alternate filesystem image\n"
                "     --locale=LOCALE                        Set primary locale (LANG=)\n"
                "     --locale-messages=LOCALE               Set message locale (LC_MESSAGES=)\n"
                "     --keymap=KEYMAP                        Set keymap\n"
@@ -862,6 +944,7 @@ static int help(void) {
                "     --setup-machine-id                     Generate a new random machine ID\n"
                "     --force                                Overwrite existing files\n"
                "     --delete-root-password                 Delete root password\n"
+               "     --welcome=no                           Disable the welcome text\n"
                "\nSee the %s for details.\n"
                , program_invocation_short_name
                , link
@@ -875,6 +958,7 @@ static int parse_argv(int argc, char *argv[]) {
         enum {
                 ARG_VERSION = 0x100,
                 ARG_ROOT,
+                ARG_IMAGE,
                 ARG_LOCALE,
                 ARG_LOCALE_MESSAGES,
                 ARG_KEYMAP,
@@ -899,12 +983,14 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_SETUP_MACHINE_ID,
                 ARG_FORCE,
                 ARG_DELETE_ROOT_PASSWORD,
+                ARG_WELCOME,
         };
 
         static const struct option options[] = {
                 { "help",                    no_argument,       NULL, 'h'                         },
                 { "version",                 no_argument,       NULL, ARG_VERSION                 },
                 { "root",                    required_argument, NULL, ARG_ROOT                    },
+                { "image",                   required_argument, NULL, ARG_IMAGE                   },
                 { "locale",                  required_argument, NULL, ARG_LOCALE                  },
                 { "locale-messages",         required_argument, NULL, ARG_LOCALE_MESSAGES         },
                 { "keymap",                  required_argument, NULL, ARG_KEYMAP                  },
@@ -929,6 +1015,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "setup-machine-id",        no_argument,       NULL, ARG_SETUP_MACHINE_ID        },
                 { "force",                   no_argument,       NULL, ARG_FORCE                   },
                 { "delete-root-password",    no_argument,       NULL, ARG_DELETE_ROOT_PASSWORD    },
+                { "welcome",                 required_argument, NULL, ARG_WELCOME                 },
                 {}
         };
 
@@ -953,6 +1040,12 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_IMAGE:
+                        r = parse_path_argument_and_warn(optarg, false, &arg_image);
+                        if (r < 0)
+                                return r;
+                        break;
+
                 case ARG_LOCALE:
                         r = free_and_strdup(&arg_locale, optarg);
                         if (r < 0)
@@ -1086,7 +1179,6 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_SETUP_MACHINE_ID:
-
                         r = sd_id128_randomize(&arg_machine_id);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to generate randomized machine ID: %m");
@@ -1101,6 +1193,14 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_delete_root_password = true;
                         break;
 
+                case ARG_WELCOME:
+                        r = parse_boolean(optarg);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse --welcome= argument: %s", optarg);
+
+                        arg_welcome = r;
+                        break;
+
                 case '?':
                         return -EINVAL;
 
@@ -1120,11 +1220,16 @@ static int parse_argv(int argc, char *argv[]) {
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                        "--delete-root-password cannot be combined with other root password options");
 
+        if (arg_image && arg_root)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Please specify either --root= or --image=, the combination of both is not supported.");
+
         return 1;
 }
 
 static int run(int argc, char *argv[]) {
-        bool enabled;
+        _cleanup_(loop_device_unrefp) LoopDevice *loop_device = NULL;
+        _cleanup_(decrypted_image_unrefp) DecryptedImage *decrypted_image = NULL;
+        _cleanup_(umount_and_rmdir_and_freep) char *unlink_dir = NULL;
         int r;
 
         r = parse_argv(argc, argv);
@@ -1135,11 +1240,23 @@ static int run(int argc, char *argv[]) {
 
         umask(0022);
 
-        r = proc_cmdline_get_bool("systemd.firstboot", &enabled);
+        if (!arg_root && !arg_image) {
+                bool enabled;
+
+                /* If we are called without --root=/--image= let's honour the systemd.firstboot kernel
+                 * command line option, because we are called to provision the host with basic settings (as
+                 * opposed to some other file system tree/image) */
+
+                r = proc_cmdline_get_bool("systemd.firstboot", &enabled);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to parse systemd.firstboot= kernel command line argument, ignoring: %m");
+                if (r > 0 && !enabled)
+                        return 0; /* disabled */
+        }
+
+        r = setup_image(&unlink_dir, &loop_device, &decrypted_image);
         if (r < 0)
-                return log_error_errno(r, "Failed to parse systemd.firstboot= kernel command line argument, ignoring: %m");
-        if (r > 0 && !enabled)
-                return 0; /* disabled */
+                return r;
 
         r = process_locale();
         if (r < 0)
index 77b90e1a9b808b573d84a995167f60d186e6cee4..91581aed3057afaa72d7fa2082275cbed724ceb2 100644 (file)
@@ -314,6 +314,29 @@ static int write_requires_mounts_for(FILE *f, const char *opts) {
         return 0;
 }
 
+static int write_extra_dependencies(FILE *f, const char *opts) {
+        int r;
+
+        assert(f);
+
+        if (opts) {
+                r = write_after(f, opts);
+                if (r < 0)
+                        return r;
+                r = write_requires_after(f, opts);
+                if (r < 0)
+                        return r;
+                r = write_before(f, opts);
+                if (r < 0)
+                        return r;
+                r = write_requires_mounts_for(f, opts);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
+
 static int add_mount(
                 const char *dest,
                 const char *what,
@@ -406,20 +429,9 @@ static int add_mount(
                 SET_FLAG(flags, NOFAIL, true);
         }
 
-        if (!(flags & AUTOMOUNT) && opts) {
-                 r = write_after(f, opts);
-                 if (r < 0)
-                         return r;
-                 r = write_requires_after(f, opts);
-                 if (r < 0)
-                         return r;
-                 r = write_before(f, opts);
-                 if (r < 0)
-                         return r;
-                 r = write_requires_mounts_for(f, opts);
-                 if (r < 0)
-                         return r;
-        }
+        r = write_extra_dependencies(f, opts);
+        if (r < 0)
+                return r;
 
         if (passno != 0) {
                 r = generator_write_fsck_deps(f, dest, what, where, fstype);
@@ -530,21 +542,6 @@ static int add_mount(
                         "Documentation=man:fstab(5) man:systemd-fstab-generator(8)\n",
                         source);
 
-                if (opts) {
-                        r = write_after(f, opts);
-                        if (r < 0)
-                                return r;
-                        r = write_requires_after(f, opts);
-                        if (r < 0)
-                                return r;
-                        r = write_before(f, opts);
-                        if (r < 0)
-                                return r;
-                        r = write_requires_mounts_for(f, opts);
-                        if (r < 0)
-                                return r;
-                }
-
                 fprintf(f,
                         "\n"
                         "[Automount]\n"
index 3194f7aa8833c5bed11dd817aa2b940c06269934..7530d80befe171ea10cabdfdb68c6d7d1bc8873d 100644 (file)
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
-#include <errno.h>
-#include <sched.h>
-#include <sys/mount.h>
-#include <unistd.h>
+#include <stdio.h>
 
 #include "fd-util.h"
 #include "fs-util.h"
 #include "fuzz.h"
-#include "log.h"
-#include "mkdir.h"
-#include "rm-rf.h"
-#include "string-util.h"
 #include "tests.h"
+#include "tmpfile-util.h"
 #include "udev-rules.h"
 
-static struct fakefs {
-        const char *target;
-        bool ignore_mount_error;
-        bool is_mounted;
-} fakefss[] = {
-        { "/sys",                    false, false },
-        { "/dev",                    false, false },
-        { "/run",                    false, false },
-        { "/etc",                    false, false },
-        { UDEVLIBEXECDIR "/rules.d", true, false },
-};
-
-static int setup_mount_namespace(void) {
-        static thread_local bool is_namespaced = false;
-
-        if (is_namespaced)
-                return 1;
-
-        if (unshare(CLONE_NEWNS) < 0)
-                return log_error_errno(errno, "Failed to call unshare(): %m");
-
-        if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) < 0)
-                return log_error_errno(errno, "Failed to mount / as private: %m");
-
-        is_namespaced = true;
-
-        return 1;
-}
-
-static int setup_fake_filesystems(const char *runtime_dir) {
-        for (unsigned i = 0; i < ELEMENTSOF(fakefss); i++) {
-                if (mount(runtime_dir, fakefss[i].target, NULL, MS_BIND, NULL) < 0) {
-                        log_full_errno(fakefss[i].ignore_mount_error ? LOG_DEBUG : LOG_ERR, errno, "Failed to mount %s: %m", fakefss[i].target);
-                        if (!fakefss[i].ignore_mount_error)
-                                return -errno;
-                } else
-                        fakefss[i].is_mounted = true;
-        }
-
-        return 0;
-}
-
-static int cleanup_fake_filesystems(const char *runtime_dir) {
-        for (unsigned i = 0; i < ELEMENTSOF(fakefss); i++) {
-                if (!fakefss[i].is_mounted)
-                        continue;
-
-                if (umount(fakefss[i].target) < 0) {
-                        log_full_errno(fakefss[i].ignore_mount_error ? LOG_DEBUG : LOG_ERR, errno, "Failed to umount %s: %m", fakefss[i].target);
-                        if (!fakefss[i].ignore_mount_error)
-                                return -errno;
-                } else
-                        fakefss[i].is_mounted = false;
-        }
-        return 0;
-}
-
 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         _cleanup_(udev_rules_freep) UdevRules *rules = NULL;
-        _cleanup_(rm_rf_physical_and_freep) char *runtime_dir = NULL;
-        FILE *f = NULL;
-
-        (void) setup_mount_namespace();
-
-        assert_se(runtime_dir = setup_fake_runtime_dir());
-
-        if (setup_fake_filesystems(runtime_dir) < 0) {
-#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
-                return EXIT_TEST_SKIP;
-#endif
-        }
+        _cleanup_fclose_ FILE *f = NULL;
+        _cleanup_(unlink_tempfilep) char filename[] = "/tmp/fuzz-udev-rules.XXXXXX";
+        int r;
 
         if (!getenv("SYSTEMD_LOG_LEVEL")) {
                 log_set_max_level_realm(LOG_REALM_UDEV, LOG_CRIT);
                 log_set_max_level_realm(LOG_REALM_SYSTEMD, LOG_CRIT);
         }
 
-        assert_se(mkdir_p("/etc/udev/rules.d", 0755) >= 0);
-        f = fopen("/etc/udev/rules.d/fuzz.rules", "we");
-        assert_se(f);
+        assert_se(fmkostemp_safe(filename, "r+", &f) == 0);
         if (size != 0)
                 assert_se(fwrite(data, size, 1, f) == 1);
-        assert_se(fclose(f) == 0);
+        fflush(f);
 
-        assert_se(udev_rules_new(&rules, RESOLVE_NAME_EARLY) == 0);
+        assert_se(rules = udev_rules_new(RESOLVE_NAME_EARLY));
+        r = udev_rules_parse_file(rules, filename);
+        log_info_errno(r, "Parsing %s: %m", filename);
+        assert_se(IN_SET(r,
+                         0,       /* OK */
+                         -ENOBUFS /* line length exceeded */));
 
-        assert_se(cleanup_fake_filesystems(runtime_dir) >= 0);
         return 0;
 }
diff --git a/src/home/homectl-fido2.c b/src/home/homectl-fido2.c
new file mode 100644 (file)
index 0000000..b7b2c1a
--- /dev/null
@@ -0,0 +1,539 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#if HAVE_LIBFIDO2
+#include <fido.h>
+#endif
+
+#include "ask-password-api.h"
+#include "errno-util.h"
+#include "format-table.h"
+#include "hexdecoct.h"
+#include "homectl-fido2.h"
+#include "homectl-pkcs11.h"
+#include "libcrypt-util.h"
+#include "locale-util.h"
+#include "memory-util.h"
+#include "random-util.h"
+#include "strv.h"
+
+#if HAVE_LIBFIDO2
+static int add_fido2_credential_id(
+                JsonVariant **v,
+                const void *cid,
+                size_t cid_size) {
+
+        _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
+        _cleanup_strv_free_ char **l = NULL;
+        _cleanup_free_ char *escaped = NULL;
+        int r;
+
+        assert(v);
+        assert(cid);
+
+        r = base64mem(cid, cid_size, &escaped);
+        if (r < 0)
+                return log_error_errno(r, "Failed to base64 encode FIDO2 credential ID: %m");
+
+        w = json_variant_ref(json_variant_by_key(*v, "fido2HmacCredential"));
+        if (w) {
+                r = json_variant_strv(w, &l);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to parse FIDO2 credential ID list: %m");
+
+                if (strv_contains(l, escaped))
+                        return 0;
+        }
+
+        r = strv_extend(&l, escaped);
+        if (r < 0)
+                return log_oom();
+
+        w = json_variant_unref(w);
+        r = json_variant_new_array_strv(&w, l);
+        if (r < 0)
+                return log_error_errno(r, "Failed to create FIDO2 credential ID JSON: %m");
+
+        r = json_variant_set_field(v, "fido2HmacCredential", w);
+        if (r < 0)
+                return log_error_errno(r, "Failed to update FIDO2 credential ID: %m");
+
+        return 0;
+}
+
+static int add_fido2_salt(
+                JsonVariant **v,
+                const void *cid,
+                size_t cid_size,
+                const void *fido2_salt,
+                size_t fido2_salt_size,
+                const void *secret,
+                size_t secret_size) {
+
+        _cleanup_(json_variant_unrefp) JsonVariant *l = NULL, *w = NULL, *e = NULL;
+        _cleanup_(erase_and_freep) char *base64_encoded = NULL;
+        _cleanup_free_ char *unix_salt = NULL;
+        struct crypt_data cd = {};
+        char *k;
+        int r;
+
+        r = make_salt(&unix_salt);
+        if (r < 0)
+                return log_error_errno(r, "Failed to generate salt: %m");
+
+        /* Before using UNIX hashing on the supplied key we base64 encode it, since crypt_r() and friends
+         * expect a NUL terminated string, and we use a binary key */
+        r = base64mem(secret, secret_size, &base64_encoded);
+        if (r < 0)
+                return log_error_errno(r, "Failed to base64 encode secret key: %m");
+
+        errno = 0;
+        k = crypt_r(base64_encoded, unix_salt, &cd);
+        if (!k)
+                return log_error_errno(errno_or_else(EINVAL), "Failed to UNIX hash secret key: %m");
+
+        r = json_build(&e, JSON_BUILD_OBJECT(
+                                       JSON_BUILD_PAIR("credential", JSON_BUILD_BASE64(cid, cid_size)),
+                                       JSON_BUILD_PAIR("salt", JSON_BUILD_BASE64(fido2_salt, fido2_salt_size)),
+                                       JSON_BUILD_PAIR("hashedPassword", JSON_BUILD_STRING(k))));
+        if (r < 0)
+                return log_error_errno(r, "Failed to build FIDO2 salt JSON key object: %m");
+
+        w = json_variant_ref(json_variant_by_key(*v, "privileged"));
+        l = json_variant_ref(json_variant_by_key(w, "fido2HmacSalt"));
+
+        r = json_variant_append_array(&l, e);
+        if (r < 0)
+                return log_error_errno(r, "Failed append FIDO2 salt: %m");
+
+        r = json_variant_set_field(&w, "fido2HmacSalt", l);
+        if (r < 0)
+                return log_error_errno(r, "Failed to set FDO2 salt: %m");
+
+        r = json_variant_set_field(v, "privileged", w);
+        if (r < 0)
+                return log_error_errno(r, "Failed to update privileged field: %m");
+
+        return 0;
+}
+#endif
+
+#define FIDO2_SALT_SIZE 32
+
+int identity_add_fido2_parameters(
+                JsonVariant **v,
+                const char *device) {
+
+#if HAVE_LIBFIDO2
+        _cleanup_(fido_cbor_info_free) fido_cbor_info_t *di = NULL;
+        _cleanup_(fido_assert_free) fido_assert_t *a = NULL;
+        _cleanup_(erase_and_freep) char *used_pin = NULL;
+        _cleanup_(fido_cred_free) fido_cred_t *c = NULL;
+        _cleanup_(fido_dev_free) fido_dev_t *d = NULL;
+        _cleanup_(erase_and_freep) void *salt = NULL;
+        JsonVariant *un, *realm, *rn;
+        bool found_extension = false;
+        const void *cid, *secret;
+        const char *fido_un;
+        size_t n, cid_size, secret_size;
+        char **e;
+        int r;
+
+        /* Construction is like this: we generate a salt of 32 bytes. We then ask the FIDO2 device to
+         * HMAC-SHA256 it for us with its internal key. The result is the key used by LUKS and account
+         * authentication. LUKS and UNIX password auth all do their own salting before hashing, so that FIDO2
+         * device never sees the volume key.
+         *
+         * S = HMAC-SHA256(I, D)
+         *
+         * with: S → LUKS/account authentication key                                         (never stored)
+         *       I → internal key on FIDO2 device                              (stored in the FIDO2 device)
+         *       D → salt we generate here               (stored in the privileged part of the JSON record)
+         *
+         */
+
+        assert(v);
+        assert(device);
+
+        salt = malloc(FIDO2_SALT_SIZE);
+        if (!salt)
+                return log_oom();
+
+        r = genuine_random_bytes(salt, FIDO2_SALT_SIZE, RANDOM_BLOCK);
+        if (r < 0)
+                return log_error_errno(r, "Failed to generate salt: %m");
+
+        d = fido_dev_new();
+        if (!d)
+                return log_oom();
+
+        r = fido_dev_open(d, device);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to open FIDO2 device %s: %s", device, fido_strerr(r));
+
+        if (!fido_dev_is_fido2(d))
+                return log_error_errno(SYNTHETIC_ERRNO(ENODEV),
+                                       "Specified device %s is not a FIDO2 device.", device);
+
+        di = fido_cbor_info_new();
+        if (!di)
+                return log_oom();
+
+        r = fido_dev_get_cbor_info(d, di);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to get CBOR device info for %s: %s", device, fido_strerr(r));
+
+        e = fido_cbor_info_extensions_ptr(di);
+        n = fido_cbor_info_extensions_len(di);
+
+        for (size_t i = 0; i < n; i++)
+                if (streq(e[i], "hmac-secret")) {
+                        found_extension = true;
+                        break;
+                }
+
+        if (!found_extension)
+                return log_error_errno(SYNTHETIC_ERRNO(ENODEV),
+                                       "Specified device %s is a FIDO2 device, but does not support the required HMAC-SECRET extension.", device);
+
+        c = fido_cred_new();
+        if (!c)
+                return log_oom();
+
+        r = fido_cred_set_extensions(c, FIDO_EXT_HMAC_SECRET);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to enable HMAC-SECRET extension on FIDO2 credential: %s", fido_strerr(r));
+
+        r = fido_cred_set_rp(c, "io.systemd.home", "Home Directory");
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to set FIDO2 credential relying party ID/name: %s", fido_strerr(r));
+
+        r = fido_cred_set_type(c, COSE_ES256);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to set FIDO2 credential type to ES256: %s", fido_strerr(r));
+
+        un = json_variant_by_key(*v, "userName");
+        if (!un)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+                                       "userName field of user record is missing");
+        if (!json_variant_is_string(un))
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+                                       "userName field of user record is not a string");
+
+        realm = json_variant_by_key(*v, "realm");
+        if (realm) {
+                if (!json_variant_is_string(realm))
+                        return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+                                               "realm field of user record is not a string");
+
+                fido_un = strjoina(json_variant_string(un), json_variant_string(realm));
+        } else
+                fido_un = json_variant_string(un);
+
+        rn = json_variant_by_key(*v, "realName");
+        if (rn && !json_variant_is_string(rn))
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+                                       "realName field of user record is not a string");
+
+        r = fido_cred_set_user(c,
+                               (const unsigned char*) fido_un, strlen(fido_un), /* We pass the user ID and name as the same */
+                               fido_un,
+                               rn ? json_variant_string(rn) : NULL,
+                               NULL /* icon URL */);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to set FIDO2 credential user data: %s", fido_strerr(r));
+
+        r = fido_cred_set_clientdata_hash(c, (const unsigned char[32]) {}, 32);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to set FIDO2 client data hash: %s", fido_strerr(r));
+
+        r = fido_cred_set_rk(c, FIDO_OPT_FALSE);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to turn off FIDO2 resident key option of credential: %s", fido_strerr(r));
+
+        r = fido_cred_set_uv(c, FIDO_OPT_FALSE);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to turn off FIDO2 user verification option of credential: %s", fido_strerr(r));
+
+        log_info("Initializing FIDO2 credential on security token.");
+
+        log_notice("%s%s(Hint: This might require verification of user presence on security token.)",
+                   emoji_enabled() ? special_glyph(SPECIAL_GLYPH_TOUCH) : "",
+                   emoji_enabled() ? " " : "");
+
+        r = fido_dev_make_cred(d, c, NULL);
+        if (r == FIDO_ERR_PIN_REQUIRED) {
+                _cleanup_free_ char *text = NULL;
+
+                if (asprintf(&text, "Please enter security token PIN:") < 0)
+                        return log_oom();
+
+                for (;;) {
+                        _cleanup_(strv_free_erasep) char **pin = NULL;
+                        char **i;
+
+                        r = ask_password_auto(text, "user-home", NULL, "fido2-pin", USEC_INFINITY, 0, &pin);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to acquire user PIN: %m");
+
+                        r = FIDO_ERR_PIN_INVALID;
+                        STRV_FOREACH(i, pin) {
+                                if (isempty(*i)) {
+                                        log_info("PIN may not be empty.");
+                                        continue;
+                                }
+
+                                r = fido_dev_make_cred(d, c, *i);
+                                if (r == FIDO_OK) {
+                                        used_pin = strdup(*i);
+                                        if (!used_pin)
+                                                return log_oom();
+                                        break;
+                                }
+                                if (r != FIDO_ERR_PIN_INVALID)
+                                        break;
+                        }
+
+                        if (r != FIDO_ERR_PIN_INVALID)
+                                break;
+
+                        log_notice("PIN incorrect, please try again.");
+                }
+        }
+        if (r == FIDO_ERR_PIN_AUTH_BLOCKED)
+                return log_notice_errno(SYNTHETIC_ERRNO(EPERM),
+                                        "Token PIN is currently blocked, please remove and reinsert token.");
+        if (r == FIDO_ERR_ACTION_TIMEOUT)
+                return log_error_errno(SYNTHETIC_ERRNO(ENOSTR),
+                                       "Token action timeout. (User didn't interact with token quickly enough.)");
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to generate FIDO2 credential: %s", fido_strerr(r));
+
+        cid = fido_cred_id_ptr(c);
+        if (!cid)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to get FIDO2 credential ID.");
+
+        cid_size = fido_cred_id_len(c);
+
+        a = fido_assert_new();
+        if (!a)
+                return log_oom();
+
+        r = fido_assert_set_extensions(a, FIDO_EXT_HMAC_SECRET);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to enable HMAC-SECRET extension on FIDO2 assertion: %s", fido_strerr(r));
+
+        r = fido_assert_set_hmac_salt(a, salt, FIDO2_SALT_SIZE);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to set salt on FIDO2 assertion: %s", fido_strerr(r));
+
+        r = fido_assert_set_rp(a, "io.systemd.home");
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to set FIDO2 assertion ID: %s", fido_strerr(r));
+
+        r = fido_assert_set_clientdata_hash(a, (const unsigned char[32]) {}, 32);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to set FIDO2 assertion client data hash: %s", fido_strerr(r));
+
+        r = fido_assert_allow_cred(a, cid, cid_size);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to add FIDO2 assertion credential ID: %s", fido_strerr(r));
+
+        r = fido_assert_set_up(a, FIDO_OPT_FALSE);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to turn off FIDO2 assertion user presence: %s", fido_strerr(r));
+
+        log_info("Generating secret key on FIDO2 security token.");
+
+        r = fido_dev_get_assert(d, a, used_pin);
+        if (r == FIDO_ERR_UP_REQUIRED) {
+                r = fido_assert_set_up(a, FIDO_OPT_TRUE);
+                if (r != FIDO_OK)
+                        return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                               "Failed to turn on FIDO2 assertion user presence: %s", fido_strerr(r));
+
+                log_notice("%s%sIn order to allow secret key generation, please verify presence on security token.",
+                           emoji_enabled() ? special_glyph(SPECIAL_GLYPH_TOUCH) : "",
+                           emoji_enabled() ? " " : "");
+
+                r = fido_dev_get_assert(d, a, used_pin);
+        }
+        if (r == FIDO_ERR_ACTION_TIMEOUT)
+                return log_error_errno(SYNTHETIC_ERRNO(ENOSTR),
+                                       "Token action timeout. (User didn't interact with token quickly enough.)");
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to ask token for assertion: %s", fido_strerr(r));
+
+        secret = fido_assert_hmac_secret_ptr(a, 0);
+        if (!secret)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to retrieve HMAC secret.");
+
+        secret_size = fido_assert_hmac_secret_len(a, 0);
+
+        r = add_fido2_credential_id(v, cid, cid_size);
+        if (r < 0)
+                return r;
+
+        r = add_fido2_salt(v,
+                           cid,
+                           cid_size,
+                           salt,
+                           FIDO2_SALT_SIZE,
+                           secret,
+                           secret_size);
+        if (r < 0)
+                return r;
+
+        /* If we acquired the PIN also include it in the secret section of the record, so that systemd-homed
+         * can use it if it needs to, given that it likely needs to decrypt the key again to pass to LUKS or
+         * fscrypt. */
+        r = identity_add_token_pin(v, used_pin);
+        if (r < 0)
+                return r;
+
+        return 0;
+#else
+        return log_error_errno(EOPNOTSUPP, "FIDO2 tokens not supported on this build.");
+#endif
+}
+
+int list_fido2_devices(void) {
+#if HAVE_LIBFIDO2
+        _cleanup_(table_unrefp) Table *t = NULL;
+        size_t allocated = 64, found = 0;
+        fido_dev_info_t *di = NULL;
+        int r;
+
+        di = fido_dev_info_new(allocated);
+        if (!di)
+                return log_oom();
+
+        r = fido_dev_info_manifest(di, allocated, &found);
+        if (r == FIDO_ERR_INTERNAL || (r == FIDO_OK && found == 0)) {
+                /* The library returns FIDO_ERR_INTERNAL when no devices are found. I wish it wouldn't. */
+                log_info("No FIDO2 devices found.");
+                r = 0;
+                goto finish;
+        }
+        if (r != FIDO_OK) {
+                r = log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to enumerate FIDO2 devices: %s", fido_strerr(r));
+                goto finish;
+        }
+
+        t = table_new("path", "manufacturer", "product");
+        if (!t) {
+                r = log_oom();
+                goto finish;
+        }
+
+        for (size_t i = 0; i < found; i++) {
+                const fido_dev_info_t *entry;
+
+                entry = fido_dev_info_ptr(di, i);
+                if (!entry) {
+                        r = log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                            "Failed to get device information for FIDO device %zu.", i);
+                        goto finish;
+                }
+
+                r = table_add_many(
+                                t,
+                                TABLE_PATH, fido_dev_info_path(entry),
+                                TABLE_STRING, fido_dev_info_manufacturer_string(entry),
+                                TABLE_STRING, fido_dev_info_product_string(entry));
+                if (r < 0) {
+                        table_log_add_error(r);
+                        goto finish;
+                }
+        }
+
+        r = table_print(t, stdout);
+        if (r < 0) {
+                log_error_errno(r, "Failed to show device table: %m");
+                goto finish;
+        }
+
+        r = 0;
+
+finish:
+        fido_dev_info_free(&di, allocated);
+        return r;
+#else
+        return log_error_errno(EOPNOTSUPP, "FIDO2 tokens not supported on this build.");
+#endif
+}
+
+int find_fido2_auto(char **ret) {
+#if HAVE_LIBFIDO2
+        _cleanup_free_ char *copy = NULL;
+        size_t di_size = 64, found = 0;
+        const fido_dev_info_t *entry;
+        fido_dev_info_t *di = NULL;
+        const char *path;
+        int r;
+
+        di = fido_dev_info_new(di_size);
+        if (!di)
+                return log_oom();
+
+        r = fido_dev_info_manifest(di, di_size, &found);
+        if (r == FIDO_ERR_INTERNAL || (r == FIDO_OK && found == 0)) {
+                /* The library returns FIDO_ERR_INTERNAL when no devices are found. I wish it wouldn't. */
+                r = log_error_errno(SYNTHETIC_ERRNO(ENODEV), "No FIDO2 devices found.");
+                goto finish;
+        }
+        if (r != FIDO_OK) {
+                r = log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to enumerate FIDO2 devices: %s", fido_strerr(r));
+                goto finish;
+        }
+        if (found > 1) {
+                r = log_error_errno(SYNTHETIC_ERRNO(ENOTUNIQ), "More than one FIDO2 device found.");
+                goto finish;
+        }
+
+        entry = fido_dev_info_ptr(di, 0);
+        if (!entry) {
+                r = log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                    "Failed to get device information for FIDO device 0.");
+                goto finish;
+        }
+
+        path = fido_dev_info_path(entry);
+        if (!path) {
+                r = log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                    "Failed to query FIDO device path.");
+                goto finish;
+        }
+
+        copy = strdup(path);
+        if (!copy) {
+                r = log_oom();
+                goto finish;
+        }
+
+        *ret = TAKE_PTR(copy);
+        r = 0;
+
+finish:
+        fido_dev_info_free(&di, di_size);
+        return r;
+#else
+        return log_error_errno(EOPNOTSUPP, "FIDO2 tokens not supported on this build.");
+#endif
+}
diff --git a/src/home/homectl-fido2.h b/src/home/homectl-fido2.h
new file mode 100644 (file)
index 0000000..0d9faef
--- /dev/null
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include "json.h"
+
+int identity_add_fido2_parameters(JsonVariant **v, const char *device);
+
+int list_fido2_devices(void);
+
+int find_fido2_auto(char **ret);
diff --git a/src/home/homectl-pkcs11.c b/src/home/homectl-pkcs11.c
new file mode 100644 (file)
index 0000000..830aafa
--- /dev/null
@@ -0,0 +1,480 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#include "errno-util.h"
+#include "format-table.h"
+#include "hexdecoct.h"
+#include "homectl-pkcs11.h"
+#include "libcrypt-util.h"
+#include "memory-util.h"
+#include "openssl-util.h"
+#include "pkcs11-util.h"
+#include "random-util.h"
+#include "strv.h"
+
+struct pkcs11_callback_data {
+        char *pin_used;
+        X509 *cert;
+};
+
+static void pkcs11_callback_data_release(struct pkcs11_callback_data *data) {
+        erase_and_free(data->pin_used);
+        X509_free(data->cert);
+}
+
+#if HAVE_P11KIT
+static int pkcs11_callback(
+                CK_FUNCTION_LIST *m,
+                CK_SESSION_HANDLE session,
+                CK_SLOT_ID slot_id,
+                const CK_SLOT_INFO *slot_info,
+                const CK_TOKEN_INFO *token_info,
+                P11KitUri *uri,
+                void *userdata) {
+
+        _cleanup_(erase_and_freep) char *pin_used = NULL;
+        struct pkcs11_callback_data *data = userdata;
+        CK_OBJECT_HANDLE object;
+        int r;
+
+        assert(m);
+        assert(slot_info);
+        assert(token_info);
+        assert(uri);
+        assert(data);
+
+        /* Called for every token matching our URI */
+
+        r = pkcs11_token_login(m, session, slot_id, token_info, "home directory operation", "user-home", "pkcs11-pin", UINT64_MAX, &pin_used);
+        if (r < 0)
+                return r;
+
+        r = pkcs11_token_find_x509_certificate(m, session, uri, &object);
+        if (r < 0)
+                return r;
+
+        r = pkcs11_token_read_x509_certificate(m, session, object, &data->cert);
+        if (r < 0)
+                return r;
+
+        /* Let's read some random data off the token and write it to the kernel pool before we generate our
+         * random key from it. This way we can claim the quality of the RNG is at least as good as the
+         * kernel's and the token's pool */
+        (void) pkcs11_token_acquire_rng(m, session);
+
+        data->pin_used = TAKE_PTR(pin_used);
+        return 1;
+}
+#endif
+
+static int acquire_pkcs11_certificate(
+                const char *uri,
+                X509 **ret_cert,
+                char **ret_pin_used) {
+
+#if HAVE_P11KIT
+        _cleanup_(pkcs11_callback_data_release) struct pkcs11_callback_data data = {};
+        int r;
+
+        r = pkcs11_find_token(uri, pkcs11_callback, &data);
+        if (r == -EAGAIN) /* pkcs11_find_token() doesn't log about this error, but all others */
+                return log_error_errno(ENXIO, "Specified PKCS#11 token with URI '%s' not found.", uri);
+        if (r < 0)
+                return r;
+
+        *ret_cert = TAKE_PTR(data.cert);
+        *ret_pin_used = TAKE_PTR(data.pin_used);
+
+        return 0;
+#else
+        return log_error_errno(EOPNOTSUPP, "PKCS#11 tokens not supported on this build.");
+#endif
+}
+
+static int encrypt_bytes(
+                EVP_PKEY *pkey,
+                const void *decrypted_key,
+                size_t decrypted_key_size,
+                void **ret_encrypt_key,
+                size_t *ret_encrypt_key_size) {
+
+        _cleanup_(EVP_PKEY_CTX_freep) EVP_PKEY_CTX *ctx = NULL;
+        _cleanup_free_ void *b = NULL;
+        size_t l;
+
+        ctx = EVP_PKEY_CTX_new(pkey, NULL);
+        if (!ctx)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to allocate public key context");
+
+        if (EVP_PKEY_encrypt_init(ctx) <= 0)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to initialize public key context");
+
+        if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to configure PKCS#1 padding");
+
+        if (EVP_PKEY_encrypt(ctx, NULL, &l, decrypted_key, decrypted_key_size) <= 0)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to determine encrypted key size");
+
+        b = malloc(l);
+        if (!b)
+                return log_oom();
+
+        if (EVP_PKEY_encrypt(ctx, b, &l, decrypted_key, decrypted_key_size) <= 0)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to determine encrypted key size");
+
+        *ret_encrypt_key = TAKE_PTR(b);
+        *ret_encrypt_key_size = l;
+
+        return 0;
+}
+
+static int add_pkcs11_encrypted_key(
+                JsonVariant **v,
+                const char *uri,
+                const void *encrypted_key, size_t encrypted_key_size,
+                const void *decrypted_key, size_t decrypted_key_size) {
+
+        _cleanup_(json_variant_unrefp) JsonVariant *l = NULL, *w = NULL, *e = NULL;
+        _cleanup_(erase_and_freep) char *base64_encoded = NULL;
+        _cleanup_free_ char *salt = NULL;
+        struct crypt_data cd = {};
+        char *k;
+        int r;
+
+        assert(v);
+        assert(uri);
+        assert(encrypted_key);
+        assert(encrypted_key_size > 0);
+        assert(decrypted_key);
+        assert(decrypted_key_size > 0);
+
+        r = make_salt(&salt);
+        if (r < 0)
+                return log_error_errno(r, "Failed to generate salt: %m");
+
+        /* Before using UNIX hashing on the supplied key we base64 encode it, since crypt_r() and friends
+         * expect a NUL terminated string, and we use a binary key */
+        r = base64mem(decrypted_key, decrypted_key_size, &base64_encoded);
+        if (r < 0)
+                return log_error_errno(r, "Failed to base64 encode secret key: %m");
+
+        errno = 0;
+        k = crypt_r(base64_encoded, salt, &cd);
+        if (!k)
+                return log_error_errno(errno_or_else(EINVAL), "Failed to UNIX hash secret key: %m");
+
+        r = json_build(&e, JSON_BUILD_OBJECT(
+                                       JSON_BUILD_PAIR("uri", JSON_BUILD_STRING(uri)),
+                                       JSON_BUILD_PAIR("data", JSON_BUILD_BASE64(encrypted_key, encrypted_key_size)),
+                                       JSON_BUILD_PAIR("hashedPassword", JSON_BUILD_STRING(k))));
+        if (r < 0)
+                return log_error_errno(r, "Failed to build encrypted JSON key object: %m");
+
+        w = json_variant_ref(json_variant_by_key(*v, "privileged"));
+        l = json_variant_ref(json_variant_by_key(w, "pkcs11EncryptedKey"));
+
+        r = json_variant_append_array(&l, e);
+        if (r < 0)
+                return log_error_errno(r, "Failed append PKCS#11 encrypted key: %m");
+
+        r = json_variant_set_field(&w, "pkcs11EncryptedKey", l);
+        if (r < 0)
+                return log_error_errno(r, "Failed to set PKCS#11 encrypted key: %m");
+
+        r = json_variant_set_field(v, "privileged", w);
+        if (r < 0)
+                return log_error_errno(r, "Failed to update privileged field: %m");
+
+        return 0;
+}
+
+static int add_pkcs11_token_uri(JsonVariant **v, const char *uri) {
+        _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
+        _cleanup_strv_free_ char **l = NULL;
+        int r;
+
+        assert(v);
+        assert(uri);
+
+        w = json_variant_ref(json_variant_by_key(*v, "pkcs11TokenUri"));
+        if (w) {
+                r = json_variant_strv(w, &l);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to parse PKCS#11 token list: %m");
+
+                if (strv_contains(l, uri))
+                        return 0;
+        }
+
+        r = strv_extend(&l, uri);
+        if (r < 0)
+                return log_oom();
+
+        w = json_variant_unref(w);
+        r = json_variant_new_array_strv(&w, l);
+        if (r < 0)
+                return log_error_errno(r, "Failed to create PKCS#11 token URI JSON: %m");
+
+        r = json_variant_set_field(v, "pkcs11TokenUri", w);
+        if (r < 0)
+                return log_error_errno(r, "Failed to update PKCS#11 token URI list: %m");
+
+        return 0;
+}
+
+int identity_add_token_pin(JsonVariant **v, const char *pin) {
+        _cleanup_(json_variant_unrefp) JsonVariant *w = NULL, *l = NULL;
+        _cleanup_(strv_free_erasep) char **pins = NULL;
+        int r;
+
+        assert(v);
+
+        if (isempty(pin))
+                return 0;
+
+        w = json_variant_ref(json_variant_by_key(*v, "secret"));
+        l = json_variant_ref(json_variant_by_key(w, "tokenPin"));
+
+        r = json_variant_strv(l, &pins);
+        if (r < 0)
+                return log_error_errno(r, "Failed to convert PIN array: %m");
+
+        if (strv_find(pins, pin))
+                return 0;
+
+        r = strv_extend(&pins, pin);
+        if (r < 0)
+                return log_oom();
+
+        strv_uniq(pins);
+
+        l = json_variant_unref(l);
+
+        r = json_variant_new_array_strv(&l, pins);
+        if (r < 0)
+                return log_error_errno(r, "Failed to allocate new PIN array JSON: %m");
+
+        json_variant_sensitive(l);
+
+        r = json_variant_set_field(&w, "tokenPin", l);
+        if (r < 0)
+                return log_error_errno(r, "Failed to update PIN field: %m");
+
+        r = json_variant_set_field(v, "secret", w);
+        if (r < 0)
+                return log_error_errno(r, "Failed to update secret object: %m");
+
+        return 1;
+}
+
+int identity_add_pkcs11_key_data(JsonVariant **v, const char *uri) {
+        _cleanup_(erase_and_freep) void *decrypted_key = NULL, *encrypted_key = NULL;
+        _cleanup_(erase_and_freep) char *pin = NULL;
+        size_t decrypted_key_size, encrypted_key_size;
+        _cleanup_(X509_freep) X509 *cert = NULL;
+        EVP_PKEY *pkey;
+        RSA *rsa;
+        int bits;
+        int r;
+
+        assert(v);
+
+        r = acquire_pkcs11_certificate(uri, &cert, &pin);
+        if (r < 0)
+                return r;
+
+        pkey = X509_get0_pubkey(cert);
+        if (!pkey)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to extract public key from X.509 certificate.");
+
+        if (EVP_PKEY_base_id(pkey) != EVP_PKEY_RSA)
+                return log_error_errno(SYNTHETIC_ERRNO(EBADMSG), "X.509 certificate does not refer to RSA key.");
+
+        rsa = EVP_PKEY_get0_RSA(pkey);
+        if (!rsa)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to acquire RSA public key from X.509 certificate.");
+
+        bits = RSA_bits(rsa);
+        log_debug("Bits in RSA key: %i", bits);
+
+        /* We use PKCS#1 padding for the RSA cleartext, hence let's leave some extra space for it, hence only
+         * generate a random key half the size of the RSA length */
+        decrypted_key_size = bits / 8 / 2;
+
+        if (decrypted_key_size < 1)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Uh, RSA key size too short?");
+
+        log_debug("Generating %zu bytes random key.", decrypted_key_size);
+
+        decrypted_key = malloc(decrypted_key_size);
+        if (!decrypted_key)
+                return log_oom();
+
+        r = genuine_random_bytes(decrypted_key, decrypted_key_size, RANDOM_BLOCK);
+        if (r < 0)
+                return log_error_errno(r, "Failed to generate random key: %m");
+
+        r = encrypt_bytes(pkey, decrypted_key, decrypted_key_size, &encrypted_key, &encrypted_key_size);
+        if (r < 0)
+                return log_error_errno(r, "Failed to encrypt key: %m");
+
+        /* Add the token URI to the public part of the record. */
+        r = add_pkcs11_token_uri(v, uri);
+        if (r < 0)
+                return r;
+
+        /* Include the encrypted version of the random key we just generated in the privileged part of the record */
+        r = add_pkcs11_encrypted_key(
+                        v,
+                        uri,
+                        encrypted_key, encrypted_key_size,
+                        decrypted_key, decrypted_key_size);
+        if (r < 0)
+                return r;
+
+        /* If we acquired the PIN also include it in the secret section of the record, so that systemd-homed
+         * can use it if it needs to, given that it likely needs to decrypt the key again to pass to LUKS or
+         * fscrypt. */
+        r = identity_add_token_pin(v, pin);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
+#if HAVE_P11KIT
+static int list_callback(
+                CK_FUNCTION_LIST *m,
+                CK_SESSION_HANDLE session,
+                CK_SLOT_ID slot_id,
+                const CK_SLOT_INFO *slot_info,
+                const CK_TOKEN_INFO *token_info,
+                P11KitUri *uri,
+                void *userdata) {
+
+        _cleanup_free_ char *token_uri_string = NULL, *token_label = NULL, *token_manufacturer_id = NULL, *token_model = NULL;
+        _cleanup_(p11_kit_uri_freep) P11KitUri *token_uri = NULL;
+        Table *t = userdata;
+        int uri_result, r;
+
+        assert(slot_info);
+        assert(token_info);
+
+        /* We only care about hardware devices here with a token inserted. Let's filter everything else
+         * out. (Note that the user can explicitly specify non-hardware tokens if they like, but during
+         * enumeration we'll filter those, since software tokens are typically the system certificate store
+         * and such, and it's typically not what people want to bind their home directories to.) */
+        if (!FLAGS_SET(token_info->flags, CKF_HW_SLOT|CKF_TOKEN_PRESENT))
+                return -EAGAIN;
+
+        token_label = pkcs11_token_label(token_info);
+        if (!token_label)
+                return log_oom();
+
+        token_manufacturer_id = pkcs11_token_manufacturer_id(token_info);
+        if (!token_manufacturer_id)
+                return log_oom();
+
+        token_model = pkcs11_token_model(token_info);
+        if (!token_model)
+                return log_oom();
+
+        token_uri = uri_from_token_info(token_info);
+        if (!token_uri)
+                return log_oom();
+
+        uri_result = p11_kit_uri_format(token_uri, P11_KIT_URI_FOR_ANY, &token_uri_string);
+        if (uri_result != P11_KIT_URI_OK)
+                return log_warning_errno(SYNTHETIC_ERRNO(EAGAIN), "Failed to format slot URI: %s", p11_kit_uri_message(uri_result));
+
+        r = table_add_many(
+                        t,
+                        TABLE_STRING, token_uri_string,
+                        TABLE_STRING, token_label,
+                        TABLE_STRING, token_manufacturer_id,
+                        TABLE_STRING, token_model);
+        if (r < 0)
+                return table_log_add_error(r);
+
+        return -EAGAIN; /* keep scanning */
+}
+#endif
+
+int list_pkcs11_tokens(void) {
+#if HAVE_P11KIT
+        _cleanup_(table_unrefp) Table *t = NULL;
+        int r;
+
+        t = table_new("uri", "label", "manufacturer", "model");
+        if (!t)
+                return log_oom();
+
+        r = pkcs11_find_token(NULL, list_callback, t);
+        if (r < 0 && r != -EAGAIN)
+                return r;
+
+        if (table_get_rows(t) <= 1) {
+                log_info("No suitable PKCS#11 tokens found.");
+                return 0;
+        }
+
+        r = table_print(t, stdout);
+        if (r < 0)
+                return log_error_errno(r, "Failed to show device table: %m");
+
+        return 0;
+#else
+        return log_error_errno(EOPNOTSUPP, "PKCS#11 tokens not supported on this build.");
+#endif
+}
+
+#if HAVE_P11KIT
+static int auto_callback(
+                CK_FUNCTION_LIST *m,
+                CK_SESSION_HANDLE session,
+                CK_SLOT_ID slot_id,
+                const CK_SLOT_INFO *slot_info,
+                const CK_TOKEN_INFO *token_info,
+                P11KitUri *uri,
+                void *userdata) {
+
+        _cleanup_(p11_kit_uri_freep) P11KitUri *token_uri = NULL;
+        char **t = userdata;
+        int uri_result;
+
+        assert(slot_info);
+        assert(token_info);
+
+        if (!FLAGS_SET(token_info->flags, CKF_HW_SLOT|CKF_TOKEN_PRESENT))
+                return -EAGAIN;
+
+        if (*t)
+                return log_error_errno(SYNTHETIC_ERRNO(ENOTUNIQ),
+                                       "More than one suitable PKCS#11 token found.");
+
+        token_uri = uri_from_token_info(token_info);
+        if (!token_uri)
+                return log_oom();
+
+        uri_result = p11_kit_uri_format(token_uri, P11_KIT_URI_FOR_ANY, t);
+        if (uri_result != P11_KIT_URI_OK)
+                return log_warning_errno(SYNTHETIC_ERRNO(EAGAIN), "Failed to format slot URI: %s", p11_kit_uri_message(uri_result));
+
+        return 0;
+}
+#endif
+
+int find_pkcs11_token_auto(char **ret) {
+#if HAVE_P11KIT
+        int r;
+
+        r = pkcs11_find_token(NULL, auto_callback, ret);
+        if (r == -EAGAIN)
+                return log_error_errno(SYNTHETIC_ERRNO(ENODEV), "No suitable PKCS#11 tokens found.");
+        if (r < 0)
+                return r;
+
+        return 0;
+#else
+        return log_error_errno(EOPNOTSUPP, "PKCS#11 tokens not supported on this build.");
+#endif
+}
diff --git a/src/home/homectl-pkcs11.h b/src/home/homectl-pkcs11.h
new file mode 100644 (file)
index 0000000..0403c73
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include "json.h"
+
+int identity_add_token_pin(JsonVariant **v, const char *pin);
+
+int identity_add_pkcs11_key_data(JsonVariant **v, const char *token_uri);
+
+int list_pkcs11_tokens(void);
+int find_pkcs11_token_auto(char **ret);
index f7237d22d83bce46a5a6448f0b48c58670dbb4b2..33e262706d29350f6bd63cbaf732595108e3fe04 100644 (file)
@@ -4,26 +4,22 @@
 
 #include "sd-bus.h"
 
-#include "alloc-util.h"
 #include "ask-password-api.h"
 #include "bus-common-errors.h"
 #include "bus-error.h"
-#include "bus-util.h"
+#include "bus-locator.h"
 #include "cgroup-util.h"
 #include "dns-domain.h"
 #include "env-util.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "format-table.h"
-#include "format-util.h"
-#include "fs-util.h"
-#include "hexdecoct.h"
 #include "home-util.h"
-#include "libcrypt-util.h"
+#include "homectl-fido2.h"
+#include "homectl-pkcs11.h"
 #include "locale-util.h"
 #include "main-func.h"
 #include "memory-util.h"
-#include "openssl-util.h"
 #include "pager.h"
 #include "parse-util.h"
 #include "path-util.h"
@@ -31,7 +27,6 @@
 #include "pretty-print.h"
 #include "process-util.h"
 #include "pwquality-util.h"
-#include "random-util.h"
 #include "rlimit-util.h"
 #include "spawn-polkit-agent.h"
 #include "terminal-util.h"
@@ -56,6 +51,7 @@ static char **arg_identity_filter_rlimits = NULL;
 static uint64_t arg_disk_size = UINT64_MAX;
 static uint64_t arg_disk_size_relative = UINT64_MAX;
 static char **arg_pkcs11_token_uri = NULL;
+static char **arg_fido2_device = NULL;
 static bool arg_json = false;
 static JsonFormatFlags arg_json_format_flags = 0;
 static bool arg_and_resize = false;
@@ -73,6 +69,7 @@ STATIC_DESTRUCTOR_REGISTER(arg_identity_extra_rlimits, json_variant_unrefp);
 STATIC_DESTRUCTOR_REGISTER(arg_identity_filter, strv_freep);
 STATIC_DESTRUCTOR_REGISTER(arg_identity_filter_rlimits, strv_freep);
 STATIC_DESTRUCTOR_REGISTER(arg_pkcs11_token_uri, strv_freep);
+STATIC_DESTRUCTOR_REGISTER(arg_fido2_device, strv_freep);
 
 static bool identity_properties_specified(void) {
         return
@@ -83,7 +80,8 @@ static bool identity_properties_specified(void) {
                 !json_variant_is_blank_object(arg_identity_extra_rlimits) ||
                 !strv_isempty(arg_identity_filter) ||
                 !strv_isempty(arg_identity_filter_rlimits) ||
-                !strv_isempty(arg_pkcs11_token_uri);
+                !strv_isempty(arg_pkcs11_token_uri) ||
+                !strv_isempty(arg_fido2_device);
 }
 
 static int acquire_bus(sd_bus **bus) {
@@ -144,12 +142,12 @@ static int list_homes(int argc, char *argv[], void *userdata) {
                                    TABLE_UID, uid,
                                    TABLE_GID, gid);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add row to table: %m");
+                        return table_log_add_error(r);
 
 
                 r = table_add_cell(table, &cell, TABLE_STRING, state);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add field to table: %m");
+                        return table_log_add_error(r);
 
                 color = user_record_state_color(state);
                 if (color)
@@ -160,7 +158,7 @@ static int list_homes(int argc, char *argv[], void *userdata) {
                                    TABLE_STRING, home,
                                    TABLE_STRING, strna(empty_to_null(shell)));
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add row to table: %m");
+                        return table_log_add_error(r);
         }
 
         r = sd_bus_message_exit_container(reply);
@@ -170,7 +168,7 @@ static int list_homes(int argc, char *argv[], void *userdata) {
         if (table_get_rows(table) > 1 || arg_json) {
                 r = table_set_sort(table, (size_t) 0, (size_t) -1);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to sort table: %m");
+                        return table_log_sort_error(r);
 
                 table_set_header(table, arg_legend);
 
@@ -179,7 +177,7 @@ static int list_homes(int argc, char *argv[], void *userdata) {
                 else
                         r = table_print(table, NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to show table: %m");
+                        return table_log_print_error(r);
         }
 
         if (arg_legend && !arg_json) {
@@ -236,7 +234,7 @@ static int acquire_existing_password(const char *user_name, UserRecord *hr, bool
         return 0;
 }
 
-static int acquire_pkcs11_pin(const char *user_name, UserRecord *hr) {
+static int acquire_token_pin(const char *user_name, UserRecord *hr) {
         _cleanup_(strv_free_erasep) char **pin = NULL;
         _cleanup_free_ char *question = NULL;
         char *e;
@@ -247,9 +245,9 @@ static int acquire_pkcs11_pin(const char *user_name, UserRecord *hr) {
 
         e = getenv("PIN");
         if (e) {
-                r = user_record_set_pkcs11_pin(hr, STRV_MAKE(e), false);
+                r = user_record_set_token_pin(hr, STRV_MAKE(e), false);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to store PKCS#11 PIN: %m");
+                        return log_error_errno(r, "Failed to store token PIN: %m");
 
                 string_erase(e);
 
@@ -263,11 +261,11 @@ static int acquire_pkcs11_pin(const char *user_name, UserRecord *hr) {
                 return log_oom();
 
         /* We never cache or use cached PINs, since usually there are only very few attempts allowed before the PIN is blocked */
-        r = ask_password_auto(question, "user-home", NULL, "pkcs11-pin", USEC_INFINITY, 0, &pin);
+        r = ask_password_auto(question, "user-home", NULL, "token-pin", USEC_INFINITY, 0, &pin);
         if (r < 0)
                 return log_error_errno(r, "Failed to acquire security token PIN: %m");
 
-        r = user_record_set_pkcs11_pin(hr, pin, false);
+        r = user_record_set_token_pin(hr, pin, false);
         if (r < 0)
                 return log_error_errno(r, "Failed to store security token PIN: %m");
 
@@ -315,26 +313,38 @@ static int handle_generic_user_record_error(
 
         } else if (sd_bus_error_has_name(error, BUS_ERROR_TOKEN_PIN_NEEDED)) {
 
-                r = acquire_pkcs11_pin(user_name, hr);
+                r = acquire_token_pin(user_name, hr);
                 if (r < 0)
                         return r;
 
         } else if (sd_bus_error_has_name(error, BUS_ERROR_TOKEN_PROTECTED_AUTHENTICATION_PATH_NEEDED)) {
 
-                log_notice("Please authenticate physically on security token.");
+                log_notice("%s%sPlease authenticate physically on security token.",
+                           emoji_enabled() ? special_glyph(SPECIAL_GLYPH_TOUCH) : "",
+                           emoji_enabled() ? " " : "");
 
                 r = user_record_set_pkcs11_protected_authentication_path_permitted(hr, true);
                 if (r < 0)
                         return log_error_errno(r, "Failed to set PKCS#11 protected authentication path permitted flag: %m");
 
+        } else if (sd_bus_error_has_name(error, BUS_ERROR_TOKEN_USER_PRESENCE_NEEDED)) {
+
+                log_notice("%s%sAuthentication requires presence verification on security token.",
+                           emoji_enabled() ? special_glyph(SPECIAL_GLYPH_TOUCH) : "",
+                           emoji_enabled() ? " " : "");
+
+                r = user_record_set_fido2_user_presence_permitted(hr, true);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to set FIDO2 user presence permitted flag: %m");
+
         } else if (sd_bus_error_has_name(error, BUS_ERROR_TOKEN_PIN_LOCKED))
-                return log_error_errno(SYNTHETIC_ERRNO(EPERM), "Security token PIN is locked, please unlock security token PIN first.");
+                return log_error_errno(SYNTHETIC_ERRNO(EPERM), "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)");
 
         else if (sd_bus_error_has_name(error, BUS_ERROR_TOKEN_BAD_PIN)) {
 
                 log_notice("Security token PIN incorrect, please try again.");
 
-                r = acquire_pkcs11_pin(user_name, hr);
+                r = acquire_token_pin(user_name, hr);
                 if (r < 0)
                         return r;
 
@@ -342,7 +352,7 @@ static int handle_generic_user_record_error(
 
                 log_notice("Security token PIN incorrect, please try again (only a few tries left!).");
 
-                r = acquire_pkcs11_pin(user_name, hr);
+                r = acquire_token_pin(user_name, hr);
                 if (r < 0)
                         return r;
 
@@ -350,7 +360,7 @@ static int handle_generic_user_record_error(
 
                 log_notice("Security token PIN incorrect, please try again (only one try left!).");
 
-                r = acquire_pkcs11_pin(user_name, hr);
+                r = acquire_token_pin(user_name, hr);
                 if (r < 0)
                         return r;
         } else
@@ -889,336 +899,6 @@ static int add_disposition(JsonVariant **v) {
         return 1;
 }
 
-struct pkcs11_callback_data {
-        char *pin_used;
-        X509 *cert;
-};
-
-static void pkcs11_callback_data_release(struct pkcs11_callback_data *data) {
-        erase_and_free(data->pin_used);
-        X509_free(data->cert);
-}
-
-#if HAVE_P11KIT
-static int pkcs11_callback(
-                CK_FUNCTION_LIST *m,
-                CK_SESSION_HANDLE session,
-                CK_SLOT_ID slot_id,
-                const CK_SLOT_INFO *slot_info,
-                const CK_TOKEN_INFO *token_info,
-                P11KitUri *uri,
-                void *userdata) {
-
-        _cleanup_(erase_and_freep) char *pin_used = NULL;
-        struct pkcs11_callback_data *data = userdata;
-        CK_OBJECT_HANDLE object;
-        int r;
-
-        assert(m);
-        assert(slot_info);
-        assert(token_info);
-        assert(uri);
-        assert(data);
-
-        /* Called for every token matching our URI */
-
-        r = pkcs11_token_login(m, session, slot_id, token_info, "home directory operation", "user-home", "pkcs11-pin", UINT64_MAX, &pin_used);
-        if (r < 0)
-                return r;
-
-        r = pkcs11_token_find_x509_certificate(m, session, uri, &object);
-        if (r < 0)
-                return r;
-
-        r = pkcs11_token_read_x509_certificate(m, session, object, &data->cert);
-        if (r < 0)
-                return r;
-
-        /* Let's read some random data off the token and write it to the kernel pool before we generate our
-         * random key from it. This way we can claim the quality of the RNG is at least as good as the
-         * kernel's and the token's pool */
-        (void) pkcs11_token_acquire_rng(m, session);
-
-        data->pin_used = TAKE_PTR(pin_used);
-        return 1;
-}
-#endif
-
-static int acquire_pkcs11_certificate(
-                const char *uri,
-                X509 **ret_cert,
-                char **ret_pin_used) {
-
-#if HAVE_P11KIT
-        _cleanup_(pkcs11_callback_data_release) struct pkcs11_callback_data data = {};
-        int r;
-
-        r = pkcs11_find_token(uri, pkcs11_callback, &data);
-        if (r == -EAGAIN) /* pkcs11_find_token() doesn't log about this error, but all others */
-                return log_error_errno(ENXIO, "Specified PKCS#11 token with URI '%s' not found.", uri);
-        if (r < 0)
-                return r;
-
-        *ret_cert = TAKE_PTR(data.cert);
-        *ret_pin_used = TAKE_PTR(data.pin_used);
-
-        return 0;
-#else
-        return log_error_errno(EOPNOTSUPP, "PKCS#11 tokens not supported on this build.");
-#endif
-}
-
-static int encrypt_bytes(
-                EVP_PKEY *pkey,
-                const void *decrypted_key,
-                size_t decrypted_key_size,
-                void **ret_encrypt_key,
-                size_t *ret_encrypt_key_size) {
-
-        _cleanup_(EVP_PKEY_CTX_freep) EVP_PKEY_CTX *ctx = NULL;
-        _cleanup_free_ void *b = NULL;
-        size_t l;
-
-        ctx = EVP_PKEY_CTX_new(pkey, NULL);
-        if (!ctx)
-                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to allocate public key context");
-
-        if (EVP_PKEY_encrypt_init(ctx) <= 0)
-                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to initialize public key context");
-
-        if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0)
-                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to configure PKCS#1 padding");
-
-        if (EVP_PKEY_encrypt(ctx, NULL, &l, decrypted_key, decrypted_key_size) <= 0)
-                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to determine encrypted key size");
-
-        b = malloc(l);
-        if (!b)
-                return log_oom();
-
-        if (EVP_PKEY_encrypt(ctx, b, &l, decrypted_key, decrypted_key_size) <= 0)
-                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to determine encrypted key size");
-
-        *ret_encrypt_key = TAKE_PTR(b);
-        *ret_encrypt_key_size = l;
-
-        return 0;
-}
-
-static int add_pkcs11_pin(JsonVariant **v, const char *pin) {
-        _cleanup_(json_variant_unrefp) JsonVariant *w = NULL, *l = NULL;
-        _cleanup_(strv_free_erasep) char **pins = NULL;
-        int r;
-
-        assert(v);
-
-        if (isempty(pin))
-                return 0;
-
-        w = json_variant_ref(json_variant_by_key(*v, "secret"));
-        l = json_variant_ref(json_variant_by_key(w, "pkcs11Pin"));
-
-        r = json_variant_strv(l, &pins);
-        if (r < 0)
-                return log_error_errno(r, "Failed to convert PIN array: %m");
-
-        if (strv_find(pins, pin))
-                return 0;
-
-        r = strv_extend(&pins, pin);
-        if (r < 0)
-                return log_oom();
-
-        strv_uniq(pins);
-
-        l = json_variant_unref(l);
-
-        r = json_variant_new_array_strv(&l, pins);
-        if (r < 0)
-                return log_error_errno(r, "Failed to allocate new PIN array JSON: %m");
-
-        json_variant_sensitive(l);
-
-        r = json_variant_set_field(&w, "pkcs11Pin", l);
-        if (r < 0)
-                return log_error_errno(r, "Failed to update PIN field: %m");
-
-        r = json_variant_set_field(v, "secret", w);
-        if (r < 0)
-                return log_error_errno(r, "Failed to update secret object: %m");
-
-        return 1;
-}
-
-static int add_pkcs11_encrypted_key(
-                JsonVariant **v,
-                const char *uri,
-                const void *encrypted_key, size_t encrypted_key_size,
-                const void *decrypted_key, size_t decrypted_key_size) {
-
-        _cleanup_(json_variant_unrefp) JsonVariant *l = NULL, *w = NULL, *e = NULL;
-        _cleanup_(erase_and_freep) char *base64_encoded = NULL;
-        _cleanup_free_ char *salt = NULL;
-        struct crypt_data cd = {};
-        char *k;
-        int r;
-
-        assert(v);
-        assert(uri);
-        assert(encrypted_key);
-        assert(encrypted_key_size > 0);
-        assert(decrypted_key);
-        assert(decrypted_key_size > 0);
-
-        r = make_salt(&salt);
-        if (r < 0)
-                return log_error_errno(r, "Failed to generate salt: %m");
-
-        /* Before using UNIX hashing on the supplied key we base64 encode it, since crypt_r() and friends
-         * expect a NUL terminated string, and we use a binary key */
-        r = base64mem(decrypted_key, decrypted_key_size, &base64_encoded);
-        if (r < 0)
-                return log_error_errno(r, "Failed to base64 encode secret key: %m");
-
-        errno = 0;
-        k = crypt_r(base64_encoded, salt, &cd);
-        if (!k)
-                return log_error_errno(errno_or_else(EINVAL), "Failed to UNIX hash secret key: %m");
-
-        r = json_build(&e, JSON_BUILD_OBJECT(
-                                       JSON_BUILD_PAIR("uri", JSON_BUILD_STRING(uri)),
-                                       JSON_BUILD_PAIR("data", JSON_BUILD_BASE64(encrypted_key, encrypted_key_size)),
-                                       JSON_BUILD_PAIR("hashedPassword", JSON_BUILD_STRING(k))));
-        if (r < 0)
-                return log_error_errno(r, "Failed to build encrypted JSON key object: %m");
-
-        w = json_variant_ref(json_variant_by_key(*v, "privileged"));
-        l = json_variant_ref(json_variant_by_key(w, "pkcs11EncryptedKey"));
-
-        r = json_variant_append_array(&l, e);
-        if (r < 0)
-                return log_error_errno(r, "Failed append PKCS#11 encrypted key: %m");
-
-        r = json_variant_set_field(&w, "pkcs11EncryptedKey", l);
-        if (r < 0)
-                return log_error_errno(r, "Failed to set PKCS#11 encrypted key: %m");
-
-        r = json_variant_set_field(v, "privileged", w);
-        if (r < 0)
-                return log_error_errno(r, "Failed to update privileged field: %m");
-
-        return 0;
-}
-
-static int add_pkcs11_token_uri(JsonVariant **v, const char *uri) {
-        _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
-        _cleanup_strv_free_ char **l = NULL;
-        int r;
-
-        assert(v);
-        assert(uri);
-
-        w = json_variant_ref(json_variant_by_key(*v, "pkcs11TokenUri"));
-        if (w) {
-                r = json_variant_strv(w, &l);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to parse PKCS#11 token list: %m");
-
-                if (strv_contains(l, uri))
-                        return 0;
-        }
-
-        r = strv_extend(&l, uri);
-        if (r < 0)
-                return log_oom();
-
-        w = json_variant_unref(w);
-        r = json_variant_new_array_strv(&w, l);
-        if (r < 0)
-                return log_error_errno(r, "Failed to create PKCS#11 token URI JSON: %m");
-
-        r = json_variant_set_field(v, "pkcs11TokenUri", w);
-        if (r < 0)
-                return log_error_errno(r, "Failed to update PKCS#11 token URI list: %m");
-
-        return 0;
-}
-
-static int add_pkcs11_key_data(JsonVariant **v, const char *uri) {
-        _cleanup_(erase_and_freep) void *decrypted_key = NULL, *encrypted_key = NULL;
-        _cleanup_(erase_and_freep) char *pin = NULL;
-        size_t decrypted_key_size, encrypted_key_size;
-        _cleanup_(X509_freep) X509 *cert = NULL;
-        EVP_PKEY *pkey;
-        RSA *rsa;
-        int bits;
-        int r;
-
-        assert(v);
-
-        r = acquire_pkcs11_certificate(uri, &cert, &pin);
-        if (r < 0)
-                return r;
-
-        pkey = X509_get0_pubkey(cert);
-        if (!pkey)
-                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to extract public key from X.509 certificate.");
-
-        if (EVP_PKEY_base_id(pkey) != EVP_PKEY_RSA)
-                return log_error_errno(SYNTHETIC_ERRNO(EBADMSG), "X.509 certificate does not refer to RSA key.");
-
-        rsa = EVP_PKEY_get0_RSA(pkey);
-        if (!rsa)
-                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to acquire RSA public key from X.509 certificate.");
-
-        bits = RSA_bits(rsa);
-        log_debug("Bits in RSA key: %i", bits);
-
-        /* We use PKCS#1 padding for the RSA cleartext, hence let's leave some extra space for it, hence only
-         * generate a random key half the size of the RSA length */
-        decrypted_key_size = bits / 8 / 2;
-
-        if (decrypted_key_size < 1)
-                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Uh, RSA key size too short?");
-
-        log_debug("Generating %zu bytes random key.", decrypted_key_size);
-
-        decrypted_key = malloc(decrypted_key_size);
-        if (!decrypted_key)
-                return log_oom();
-
-        r = genuine_random_bytes(decrypted_key, decrypted_key_size, RANDOM_BLOCK);
-        if (r < 0)
-                return log_error_errno(r, "Failed to generate random key: %m");
-
-        r = encrypt_bytes(pkey, decrypted_key, decrypted_key_size, &encrypted_key, &encrypted_key_size);
-        if (r < 0)
-                return log_error_errno(r, "Failed to encrypt key: %m");
-
-        /* Add the token URI to the public part of the record. */
-        r = add_pkcs11_token_uri(v, uri);
-        if (r < 0)
-                return r;
-
-        /* Include the encrypted version of the random key we just generated in the privileged part of the record */
-        r = add_pkcs11_encrypted_key(
-                        v,
-                        uri,
-                        encrypted_key, encrypted_key_size,
-                        decrypted_key, decrypted_key_size);
-        if (r < 0)
-                return r;
-
-        /* If we acquired the PIN also include it in the secret section of the record, so that systemd-homed
-         * can use it if it needs to, given that it likely needs to decrypt the key again to pass to LUKS or
-         * fscrypt. */
-        r = add_pkcs11_pin(v, pin);
-        if (r < 0)
-                return r;
-
-        return 0;
-}
-
 static int acquire_new_home_record(UserRecord **ret) {
         _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
         _cleanup_(user_record_unrefp) UserRecord *hr = NULL;
@@ -1246,7 +926,13 @@ static int acquire_new_home_record(UserRecord **ret) {
                 return r;
 
         STRV_FOREACH(i, arg_pkcs11_token_uri) {
-                r = add_pkcs11_key_data(&v, *i);
+                r = identity_add_pkcs11_key_data(&v, *i);
+                if (r < 0)
+                        return r;
+        }
+
+        STRV_FOREACH(i, arg_fido2_device) {
+                r = identity_add_fido2_parameters(&v, *i);
                 if (r < 0)
                         return r;
         }
@@ -1380,7 +1066,7 @@ static int create_home(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return r;
 
-        /* Remember the original hashed paswords before we add our own, so that we can return to them later,
+        /* Remember the original hashed passwords before we add our own, so that we can return to them later,
          * should the entered password turn out not to be acceptable. */
         original_hashed_passwords = strv_copy(hr->hashed_password);
         if (!original_hashed_passwords)
@@ -1423,7 +1109,7 @@ static int create_home(int argc, char *argv[], void *userdata) {
 
                 r = json_variant_format(hr->json, 0, &formatted);
                 if (r < 0)
-                        return r;
+                        return log_error_errno(r, "Failed to format user record: %m");
 
                 r = bus_message_new_method_call(bus, &m, bus_home_mgr, "CreateHome");
                 if (r < 0)
@@ -1437,25 +1123,28 @@ static int create_home(int argc, char *argv[], void *userdata) {
 
                 r = sd_bus_call(bus, m, HOME_SLOW_BUS_CALL_TIMEOUT_USEC, &error, NULL);
                 if (r < 0) {
-                        if (!sd_bus_error_has_name(&error, BUS_ERROR_LOW_PASSWORD_QUALITY))
-                                return log_error_errno(r, "Failed to create user home: %s", bus_error_message(&error, r));
-
-                        log_error_errno(r, "%s", bus_error_message(&error, r));
-                        log_info("(Use --enforce-password-policy=no to turn off password quality checks for this account.)");
-                } else
-                        break; /* done */
+                        if (sd_bus_error_has_name(&error, BUS_ERROR_LOW_PASSWORD_QUALITY)) {
+                                log_error_errno(r, "%s", bus_error_message(&error, r));
+                                log_info("(Use --enforce-password-policy=no to turn off password quality checks for this account.)");
 
-                r = user_record_set_hashed_password(hr, original_hashed_passwords);
-                if (r < 0)
-                        return r;
+                                r = user_record_set_hashed_password(hr, original_hashed_passwords);
+                                if (r < 0)
+                                        return r;
 
-                r = acquire_new_password(hr->user_name, hr, /* suggest = */ false);
-                if (r < 0)
-                        return r;
+                                r = acquire_new_password(hr->user_name, hr, /* suggest = */ false);
+                                if (r < 0)
+                                        return r;
 
-                r = user_record_make_hashed_password(hr, hr->password, /* extend = */ true);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to hash passwords: %m");
+                                r = user_record_make_hashed_password(hr, hr->password, /* extend = */ true);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to hash passwords: %m");
+                        } else {
+                                r = handle_generic_user_record_error(hr->user_name, hr, &error, r, false);
+                                if (r < 0)
+                                        return r;
+                        }
+                } else
+                        break; /* done */
         }
 
         return 0;
@@ -1566,14 +1255,20 @@ static int acquire_updated_home_record(
                 return r;
 
         STRV_FOREACH(i, arg_pkcs11_token_uri) {
-                r = add_pkcs11_key_data(&json, *i);
+                r = identity_add_pkcs11_key_data(&json, *i);
+                if (r < 0)
+                        return r;
+        }
+
+        STRV_FOREACH(i, arg_fido2_device) {
+                r = identity_add_fido2_parameters(&json, *i);
                 if (r < 0)
                         return r;
         }
 
         /* If the user supplied a full record, then add in lastChange, but do not override. Otherwise always
          * override. */
-        r = update_last_change(&json, !!arg_pkcs11_token_uri, !arg_identity);
+        r = update_last_change(&json, arg_pkcs11_token_uri || arg_fido2_device, !arg_identity);
         if (r < 0)
                 return r;
 
@@ -1592,6 +1287,26 @@ static int acquire_updated_home_record(
         return 0;
 }
 
+static int home_record_reset_human_interaction_permission(UserRecord *hr) {
+        int r;
+
+        assert(hr);
+
+        /* When we execute multiple operations one after the other, let's reset the permission to ask the
+         * user each time, so that if interaction is necessary we will be told so again and thus can print a
+         * nice message to the user, telling the user so. */
+
+        r = user_record_set_pkcs11_protected_authentication_path_permitted(hr, -1);
+        if (r < 0)
+                return log_error_errno(r, "Failed to reset PKCS#11 protected authentication path permission flag: %m");
+
+        r = user_record_set_fido2_user_presence_permitted(hr, -1);
+        if (r < 0)
+                return log_error_errno(r, "Failed to reset FIDO2 user presence permission flag: %m");
+
+        return 0;
+}
+
 static int update_home(int argc, char *argv[], void *userdata) {
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
         _cleanup_(user_record_unrefp) UserRecord *hr = NULL;
@@ -1620,6 +1335,12 @@ static int update_home(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return r;
 
+        /* If we do multiple operations, let's output things more verbosely, since otherwise the repeated
+         * authentication might be confusing. */
+
+        if (arg_and_resize || arg_and_change_password)
+                log_info("Updating home directory.");
+
         for (;;) {
                 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
                 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
@@ -1631,7 +1352,7 @@ static int update_home(int argc, char *argv[], void *userdata) {
 
                 r = json_variant_format(hr->json, 0, &formatted);
                 if (r < 0)
-                        return r;
+                        return log_error_errno(r, "Failed to format user record: %m");
 
                 (void) sd_bus_message_sensitive(m);
 
@@ -1655,13 +1376,16 @@ static int update_home(int argc, char *argv[], void *userdata) {
                         break;
         }
 
+        if (arg_and_resize)
+                log_info("Resizing home.");
+
+        (void) home_record_reset_human_interaction_permission(hr);
+
         /* Also sync down disk size to underlying LUKS/fscrypt/quota */
         while (arg_and_resize) {
                 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
                 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
 
-                log_debug("Resizing");
-
                 r = bus_message_new_method_call(bus, &m, bus_home_mgr, "ResizeHome");
                 if (r < 0)
                         return bus_log_create_error(r);
@@ -1688,13 +1412,16 @@ static int update_home(int argc, char *argv[], void *userdata) {
                         break;
         }
 
+        if (arg_and_change_password)
+                log_info("Synchronizing passwords and encryption keys.");
+
+        (void) home_record_reset_human_interaction_permission(hr);
+
         /* Also sync down passwords to underlying LUKS/fscrypt */
         while (arg_and_change_password) {
                 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
                 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
 
-                log_debug("Propagating password");
-
                 r = bus_message_new_method_call(bus, &m, bus_home_mgr, "ChangePasswordHome");
                 if (r < 0)
                         return bus_log_create_error(r);
@@ -1732,6 +1459,8 @@ static int passwd_home(int argc, char *argv[], void *userdata) {
 
         if (arg_pkcs11_token_uri)
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "To change the PKCS#11 security token use 'homectl update --pkcs11-token-uri=…'.");
+        if (arg_fido2_device)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "To change the FIDO2 security token use 'homectl update --fido2-device=…'.");
         if (identity_properties_specified())
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "The 'passwd' verb does not permit changing other record properties at the same time.");
 
@@ -2182,6 +1911,8 @@ static int help(int argc, char *argv[], void *userdata) {
                "                              Specify SSH public keys\n"
                "     --pkcs11-token-uri=URI   URI to PKCS#11 security token containing\n"
                "                              private key and matching X.509 certificate\n"
+               "     --fido2-device=PATH      Path to FIDO2 hidraw device with hmac-secret\n"
+               "                              extension\n"
                "\n%4$sAccount Management User Record Properties:%5$s\n"
                "     --locked=BOOL            Set locked account state\n"
                "     --not-before=TIMESTAMP   Do not allow logins before\n"
@@ -2328,6 +2059,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_EXPORT_FORMAT,
                 ARG_AUTO_LOGIN,
                 ARG_PKCS11_TOKEN_URI,
+                ARG_FIDO2_DEVICE,
                 ARG_AND_RESIZE,
                 ARG_AND_CHANGE_PASSWORD,
         };
@@ -2405,6 +2137,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "json",                        required_argument, NULL, ARG_JSON                        },
                 { "export-format",               required_argument, NULL, ARG_EXPORT_FORMAT               },
                 { "pkcs11-token-uri",            required_argument, NULL, ARG_PKCS11_TOKEN_URI            },
+                { "fido2-device",                required_argument, NULL, ARG_FIDO2_DEVICE                },
                 { "and-resize",                  required_argument, NULL, ARG_AND_RESIZE                  },
                 { "and-change-password",         required_argument, NULL, ARG_AND_CHANGE_PASSWORD         },
                 {}
@@ -3365,6 +3098,9 @@ static int parse_argv(int argc, char *argv[]) {
                 case ARG_PKCS11_TOKEN_URI: {
                         const char *p;
 
+                        if (streq(optarg, "list"))
+                                return list_pkcs11_tokens();
+
                         /* If --pkcs11-token-uri= is specified we always drop everything old */
                         FOREACH_STRING(p, "pkcs11TokenUri", "pkcs11EncryptedKey") {
                                 r = drop_from_identity(p);
@@ -3377,10 +3113,19 @@ static int parse_argv(int argc, char *argv[]) {
                                 break;
                         }
 
-                        if (!pkcs11_uri_valid(optarg))
-                                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Not a valid PKCS#11 URI: %s", optarg);
+                        if (streq(optarg, "auto")) {
+                                _cleanup_free_ char *found = NULL;
+
+                                r = find_pkcs11_token_auto(&found);
+                                if (r < 0)
+                                        return r;
+                                r = strv_consume(&arg_pkcs11_token_uri, TAKE_PTR(found));
+                        } else {
+                                if (!pkcs11_uri_valid(optarg))
+                                        return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Not a valid PKCS#11 URI: %s", optarg);
 
-                        r = strv_extend(&arg_pkcs11_token_uri, optarg);
+                                r = strv_extend(&arg_pkcs11_token_uri, optarg);
+                        }
                         if (r < 0)
                                 return r;
 
@@ -3388,6 +3133,41 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
                 }
 
+                case ARG_FIDO2_DEVICE: {
+                        const char *p;
+
+                        if (streq(optarg, "list"))
+                                return list_fido2_devices();
+
+                        FOREACH_STRING(p, "fido2HmacCredential", "fido2HmacSalt") {
+                                r = drop_from_identity(p);
+                                if (r < 0)
+                                        return r;
+                        }
+
+                        if (isempty(optarg)) {
+                                arg_fido2_device = strv_free(arg_fido2_device);
+                                break;
+                        }
+
+                        if (streq(optarg, "auto")) {
+                                _cleanup_free_ char *found = NULL;
+
+                                r = find_fido2_auto(&found);
+                                if (r < 0)
+                                        return r;
+
+                                r = strv_consume(&arg_fido2_device, TAKE_PTR(found));
+                        } else
+                                r = strv_extend(&arg_fido2_device, optarg);
+
+                        if (r < 0)
+                                return r;
+
+                        strv_uniq(arg_fido2_device);
+                        break;
+                }
+
                 case 'j':
                         arg_json = true;
                         arg_json_format_flags = JSON_FORMAT_PRETTY_AUTO|JSON_FORMAT_COLOR_AUTO;
@@ -3458,7 +3238,7 @@ static int parse_argv(int argc, char *argv[]) {
                 }
         }
 
-        if (!strv_isempty(arg_pkcs11_token_uri))
+        if (!strv_isempty(arg_pkcs11_token_uri) || !strv_isempty(arg_fido2_device))
                 arg_and_change_password = true;
 
         if (arg_disk_size != UINT64_MAX || arg_disk_size_relative != UINT64_MAX)
@@ -3489,9 +3269,7 @@ static int run(int argc, char *argv[]) {
 
         int r;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 59b2a970b849d57259d952588bb99ac1157aad3e..8ac7ff9995478d3f825e266d4fadcdf58e26d750 100644 (file)
@@ -3,7 +3,7 @@
 
 #include "sd-bus.h"
 
-#include "bus-util.h"
+#include "bus-object.h"
 #include "homed-home.h"
 
 int bus_home_client_is_trusted(Home *h, sd_bus_message *message);
index 47ee7d23281c5e80936b6ee0fa85dc4c71c3c808..f0c157cb7d882a117e8d1923aaaea6b41aa0c7ac 100644 (file)
@@ -457,6 +457,10 @@ static int convert_worker_errno(Home *h, int e, sd_bus_error *error) {
                 return sd_bus_error_setf(error, BUS_ERROR_TOKEN_PIN_NEEDED, "PIN for security token required.");
         case -ERFKILL:
                 return sd_bus_error_setf(error, BUS_ERROR_TOKEN_PROTECTED_AUTHENTICATION_PATH_NEEDED, "Security token requires protected authentication path.");
+        case -EMEDIUMTYPE:
+                return sd_bus_error_setf(error, BUS_ERROR_TOKEN_USER_PRESENCE_NEEDED, "Security token requires user presence.");
+        case -ENOSTR:
+                return sd_bus_error_setf(error, BUS_ERROR_TOKEN_ACTION_TIMEOUT, "Token action timeout. (User was supposed to verify presence or similar, by interacting with the token, and didn't do that in time.)");
         case -EOWNERDEAD:
                 return sd_bus_error_setf(error, BUS_ERROR_TOKEN_PIN_LOCKED, "PIN of security token locked.");
         case -ENOLCK:
@@ -1357,7 +1361,13 @@ static int user_record_extend_with_binding(UserRecord *hr, UserRecord *with_bind
         return 0;
 }
 
-static int home_update_internal(Home *h, const char *verb, UserRecord *hr, UserRecord *secret, sd_bus_error *error) {
+static int home_update_internal(
+                Home *h,
+                const char *verb,
+                UserRecord *hr,
+                UserRecord *secret,
+                sd_bus_error *error) {
+
         _cleanup_(user_record_unrefp) UserRecord *new_hr = NULL, *saved_secret = NULL, *signed_hr = NULL;
         int r, c;
 
index 2fd3b65d8983d255c26c98b21fbcb9805f3d0a8b..ed8404d7e3da2585921877df3bea812185a99b16 100644 (file)
@@ -13,8 +13,8 @@
 #include "signal-util.h"
 
 static int run(int argc, char *argv[]) {
-        _cleanup_(notify_on_cleanup) const char *notify_stop = NULL;
         _cleanup_(manager_freep) Manager *m = NULL;
+        _cleanup_(notify_on_cleanup) const char *notify_stop = NULL;
         int r;
 
         log_setup_service();
index 27c92e16e7281895b29b1c99a17a6e0f9bdfb0d5..cfceaed74274fdd2dd98ccc41d5d5103a5b03371 100644 (file)
@@ -98,7 +98,7 @@ int home_prepare_cifs(
 
 int home_activate_cifs(
                 UserRecord *h,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 UserRecord **ret_home) {
 
         _cleanup_(home_setup_undo) HomeSetup setup = HOME_SETUP_INIT;
@@ -120,7 +120,7 @@ int home_activate_cifs(
         if (r < 0)
                 return r;
 
-        r = home_refresh(h, &setup, NULL, pkcs11_decrypted_passwords, NULL, &new_home);
+        r = home_refresh(h, &setup, NULL, cache, NULL, &new_home);
         if (r < 0)
                 return r;
 
index 346be8826ea0e2f0d118605e8327626ef7adef4d..ee799e2a4b8ed9ed2dc7bb3c62c5f5011b3e14df 100644 (file)
@@ -6,6 +6,6 @@
 
 int home_prepare_cifs(UserRecord *h, bool already_activated, HomeSetup *setup);
 
-int home_activate_cifs(UserRecord *h, char ***pkcs11_decrypted_passwords, UserRecord **ret_home);
+int home_activate_cifs(UserRecord *h, PasswordCache *cache, UserRecord **ret_home);
 
 int home_create_cifs(UserRecord *h, UserRecord **ret_home);
index 8a4cb1732ac771749b53dd474724d6836e8503fe..7d00da214aa1a563ac0b8282a2775897b0a87582 100644 (file)
@@ -26,7 +26,7 @@ int home_prepare_directory(UserRecord *h, bool already_activated, HomeSetup *set
 
 int home_activate_directory(
                 UserRecord *h,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 UserRecord **ret_home) {
 
         _cleanup_(user_record_unrefp) UserRecord *new_home = NULL, *header_home = NULL;
@@ -44,11 +44,11 @@ int home_activate_directory(
         assert_se(hdo = user_record_home_directory(h));
         hd = strdupa(hdo);
 
-        r = home_prepare(h, false, pkcs11_decrypted_passwords, &setup, &header_home);
+        r = home_prepare(h, false, cache, &setup, &header_home);
         if (r < 0)
                 return r;
 
-        r = home_refresh(h, &setup, header_home, pkcs11_decrypted_passwords, NULL, &new_home);
+        r = home_refresh(h, &setup, header_home, cache, NULL, &new_home);
         if (r < 0)
                 return r;
 
@@ -193,7 +193,7 @@ int home_create_directory_or_subvolume(UserRecord *h, UserRecord **ret_home) {
 int home_resize_directory(
                 UserRecord *h,
                 bool already_activated,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 HomeSetup *setup,
                 UserRecord **ret_home) {
 
@@ -205,11 +205,11 @@ int home_resize_directory(
         assert(ret_home);
         assert(IN_SET(user_record_storage(h), USER_DIRECTORY, USER_SUBVOLUME, USER_FSCRYPT));
 
-        r = home_prepare(h, already_activated, pkcs11_decrypted_passwords, setup, NULL);
+        r = home_prepare(h, already_activated, cache, setup, NULL);
         if (r < 0)
                 return r;
 
-        r = home_load_embedded_identity(h, setup->root_fd, NULL, USER_RECONCILE_REQUIRE_NEWER_OR_EQUAL, pkcs11_decrypted_passwords, &embedded_home, &new_home);
+        r = home_load_embedded_identity(h, setup->root_fd, NULL, USER_RECONCILE_REQUIRE_NEWER_OR_EQUAL, cache, &embedded_home, &new_home);
         if (r < 0)
                 return r;
 
index 047c3a70a03260f10da837a20a4829db6e7fb676..717837f348f6078ff54901d5aeff03191321db49 100644 (file)
@@ -5,6 +5,6 @@
 #include "user-record.h"
 
 int home_prepare_directory(UserRecord *h, bool already_activated, HomeSetup *setup);
-int home_activate_directory(UserRecord *h, char ***pkcs11_decrypted_passwords, UserRecord **ret_home);
+int home_activate_directory(UserRecord *h, PasswordCache *cache, UserRecord **ret_home);
 int home_create_directory_or_subvolume(UserRecord *h, UserRecord **ret_home);
-int home_resize_directory(UserRecord *h, bool already_activated, char ***pkcs11_decrypted_passwords, HomeSetup *setup, UserRecord **ret_home);
+int home_resize_directory(UserRecord *h, bool already_activated, PasswordCache *cache, HomeSetup *setup, UserRecord **ret_home);
diff --git a/src/home/homework-fido2.c b/src/home/homework-fido2.c
new file mode 100644 (file)
index 0000000..36fe059
--- /dev/null
@@ -0,0 +1,197 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#include <fido.h>
+
+#include "hexdecoct.h"
+#include "homework-fido2.h"
+#include "strv.h"
+
+static int fido2_use_specific_token(
+                const char *path,
+                UserRecord *h,
+                UserRecord *secret,
+                const Fido2HmacSalt *salt,
+                char **ret) {
+
+        _cleanup_(fido_cbor_info_free) fido_cbor_info_t *di = NULL;
+        _cleanup_(fido_assert_free) fido_assert_t *a = NULL;
+        _cleanup_(fido_dev_free) fido_dev_t *d = NULL;
+        bool found_extension = false;
+        size_t n, hmac_size;
+        const void *hmac;
+        char **e;
+        int r;
+
+        d = fido_dev_new();
+        if (!d)
+                return log_oom();
+
+        r = fido_dev_open(d, path);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to open FIDO2 device %s: %s", path, fido_strerr(r));
+
+        if (!fido_dev_is_fido2(d))
+                return log_error_errno(SYNTHETIC_ERRNO(ENODEV),
+                                       "Specified device %s is not a FIDO2 device.", path);
+
+        di = fido_cbor_info_new();
+        if (!di)
+                return log_oom();
+
+        r = fido_dev_get_cbor_info(d, di);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to get CBOR device info for %s: %s", path, fido_strerr(r));
+
+        e = fido_cbor_info_extensions_ptr(di);
+        n = fido_cbor_info_extensions_len(di);
+
+        for (size_t i = 0; i < n; i++)
+                if (streq(e[i], "hmac-secret")) {
+                        found_extension = true;
+                        break;
+                }
+
+        if (!found_extension)
+                return log_error_errno(SYNTHETIC_ERRNO(ENODEV),
+                                       "Specified device %s is a FIDO2 device, but does not support the required HMAC-SECRET extension.", path);
+
+        a = fido_assert_new();
+        if (!a)
+                return log_oom();
+
+        r = fido_assert_set_extensions(a, FIDO_EXT_HMAC_SECRET);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to enable HMAC-SECRET extension on FIDO2 assertion: %s", fido_strerr(r));
+
+        r = fido_assert_set_hmac_salt(a, salt->salt, salt->salt_size);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to set salt on FIDO2 assertion: %s", fido_strerr(r));
+
+        r = fido_assert_set_rp(a, "io.systemd.home");
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to set FIDO2 assertion ID: %s", fido_strerr(r));
+
+        r = fido_assert_set_clientdata_hash(a, (const unsigned char[32]) {}, 32);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to set FIDO2 assertion client data hash: %s", fido_strerr(r));
+
+        r = fido_assert_allow_cred(a, salt->credential.id, salt->credential.size);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to add FIDO2 assertion credential ID: %s", fido_strerr(r));
+
+        r = fido_assert_set_up(a, h->fido2_user_presence_permitted <= 0 ? FIDO_OPT_FALSE : FIDO_OPT_TRUE);
+        if (r != FIDO_OK)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to set FIDO2 assertion user presence: %s", fido_strerr(r));
+
+        log_info("Asking FIDO2 token for authentication.");
+
+        r = fido_dev_get_assert(d, a, NULL); /* try without pin first */
+        if (r == FIDO_ERR_PIN_REQUIRED) {
+                char **i;
+
+                /* OK, we needed a pin, try with all pins in turn */
+                STRV_FOREACH(i, secret->token_pin) {
+                        r = fido_dev_get_assert(d, a, *i);
+                        if (r != FIDO_ERR_PIN_INVALID)
+                                break;
+                }
+        }
+
+        switch (r) {
+        case FIDO_OK:
+                break;
+        case FIDO_ERR_NO_CREDENTIALS:
+                return log_error_errno(SYNTHETIC_ERRNO(EBADSLT),
+                                       "Wrong security token; needed credentials not present on token.");
+        case FIDO_ERR_PIN_REQUIRED:
+                return log_error_errno(SYNTHETIC_ERRNO(ENOANO),
+                                       "Security token requires PIN.");
+        case FIDO_ERR_PIN_AUTH_BLOCKED:
+                return log_error_errno(SYNTHETIC_ERRNO(EOWNERDEAD),
+                                       "PIN of security token is blocked, please remove/reinsert token.");
+        case FIDO_ERR_PIN_INVALID:
+                return log_error_errno(SYNTHETIC_ERRNO(ENOLCK),
+                                       "PIN of security token incorrect.");
+        case FIDO_ERR_UP_REQUIRED:
+                return log_error_errno(SYNTHETIC_ERRNO(EMEDIUMTYPE),
+                                       "User presence required.");
+        case FIDO_ERR_ACTION_TIMEOUT:
+                return log_error_errno(SYNTHETIC_ERRNO(ENOSTR),
+                                       "Token action timeout. (User didn't interact with token quickly enough.)");
+        default:
+                return log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                       "Failed to ask token for assertion: %s", fido_strerr(r));
+        }
+
+        hmac = fido_assert_hmac_secret_ptr(a, 0);
+        if (!hmac)
+                return log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to retrieve HMAC secret.");
+
+        hmac_size = fido_assert_hmac_secret_len(a, 0);
+
+        r = base64mem(hmac, hmac_size, ret);
+        if (r < 0)
+                return log_error_errno(r, "Failed to base64 encode HMAC secret: %m");
+
+        return 0;
+}
+
+int fido2_use_token(UserRecord *h, UserRecord *secret, const Fido2HmacSalt *salt, char **ret) {
+        size_t allocated = 64, found = 0;
+        fido_dev_info_t *di = NULL;
+        int r;
+
+        di = fido_dev_info_new(allocated);
+        if (!di)
+                return log_oom();
+
+        r = fido_dev_info_manifest(di, allocated, &found);
+        if (r == FIDO_ERR_INTERNAL) {
+                /* The library returns FIDO_ERR_INTERNAL when no devices are found. I wish it wouldn't. */
+                r = log_debug_errno(SYNTHETIC_ERRNO(EAGAIN), "Got FIDO_ERR_INTERNAL, assuming no devices.");
+                goto finish;
+        }
+        if (r != FIDO_OK) {
+                r = log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to enumerate FIDO2 devices: %s", fido_strerr(r));
+                goto finish;
+        }
+
+        for (size_t i = 0; i < found; i++) {
+                const fido_dev_info_t *entry;
+                const char *path;
+
+                entry = fido_dev_info_ptr(di, i);
+                if (!entry) {
+                        r = log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                            "Failed to get device information for FIDO device %zu.", i);
+                        goto finish;
+                }
+
+                path = fido_dev_info_path(entry);
+                if (!path) {
+                        r = log_error_errno(SYNTHETIC_ERRNO(EIO),
+                                            "Failed to query FIDO device path.");
+                        goto finish;
+                }
+
+                r = fido2_use_specific_token(path, h, secret, salt, ret);
+                if (!IN_SET(r,
+                            -EBADSLT, /* device doesn't understand our credential hash */
+                            -ENODEV   /* device is not a FIDO2 device with HMAC-SECRET */))
+                        goto finish;
+        }
+
+        r = -EAGAIN;
+
+finish:
+        fido_dev_info_free(&di, allocated);
+        return r;
+}
diff --git a/src/home/homework-fido2.h b/src/home/homework-fido2.h
new file mode 100644 (file)
index 0000000..d3b142a
--- /dev/null
@@ -0,0 +1,6 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include "user-record.h"
+
+int fido2_use_token(UserRecord *h, UserRecord *secret, const Fido2HmacSalt *salt, char **ret);
index 696e265397e2b941d775ae8f4ecfa4a96d56817e..da9bb64b712cb7b5e5a35e4094cfecdb83a69b07 100644 (file)
@@ -208,7 +208,7 @@ static int fscrypt_slot_try_many(
 }
 
 static int fscrypt_setup(
-                char **pkcs11_decrypted_passwords,
+                const PasswordCache *cache,
                 char **password,
                 HomeSetup *setup,
                 void **ret_volume_key,
@@ -230,6 +230,7 @@ static int fscrypt_setup(
                 _cleanup_free_ char *value = NULL;
                 size_t salt_size, encrypted_size;
                 const char *nr, *e;
+                char **list;
                 int n;
 
                 /* Check if this xattr has the format 'trusted.fscrypt_slot<nr>' where '<nr>' is a 32bit unsigned integer */
@@ -256,19 +257,17 @@ static int fscrypt_setup(
                 if (r < 0)
                         return log_error_errno(r, "Failed to decode encrypted key of %s: %m", xa);
 
-                r = fscrypt_slot_try_many(
-                                pkcs11_decrypted_passwords,
-                                salt, salt_size,
-                                encrypted, encrypted_size,
-                                setup->fscrypt_key_descriptor,
-                                ret_volume_key, ret_volume_key_size);
-                if (r == -ENOANO)
+                r = -ENOANO;
+                FOREACH_POINTER(list, cache->pkcs11_passwords, cache->fido2_passwords, password) {
                         r = fscrypt_slot_try_many(
-                                        password,
+                                        list,
                                         salt, salt_size,
                                         encrypted, encrypted_size,
                                         setup->fscrypt_key_descriptor,
                                         ret_volume_key, ret_volume_key_size);
+                        if (r != -ENOANO)
+                                break;
+                }
                 if (r < 0) {
                         if (r != -ENOANO)
                                 return r;
@@ -282,7 +281,7 @@ static int fscrypt_setup(
 int home_prepare_fscrypt(
                 UserRecord *h,
                 bool already_activated,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 HomeSetup *setup) {
 
         _cleanup_(erase_and_freep) void *volume_key = NULL;
@@ -314,7 +313,7 @@ int home_prepare_fscrypt(
         memcpy(setup->fscrypt_key_descriptor, policy.master_key_descriptor, FS_KEY_DESCRIPTOR_SIZE);
 
         r = fscrypt_setup(
-                        pkcs11_decrypted_passwords ? *pkcs11_decrypted_passwords : NULL,
+                        cache,
                         h->password,
                         setup,
                         &volume_key,
@@ -584,7 +583,7 @@ int home_create_fscrypt(
 int home_passwd_fscrypt(
                 UserRecord *h,
                 HomeSetup *setup,
-                char **pkcs11_decrypted_passwords, /* the passwords acquired via PKCS#11 security tokens */
+                PasswordCache *cache,               /* the passwords acquired via PKCS#11/FIDO2 security tokens */
                 char **effective_passwords          /* new passwords */) {
 
         _cleanup_(erase_and_freep) void *volume_key = NULL;
@@ -600,7 +599,7 @@ int home_passwd_fscrypt(
         assert(setup);
 
         r = fscrypt_setup(
-                        pkcs11_decrypted_passwords,
+                        cache,
                         h->password,
                         setup,
                         &volume_key,
index aa3bcd3a69faa358222012d0563e35a5a7e08660..e5cf7baaaa456585ea50b0268fa1e8d3021a3734 100644 (file)
@@ -4,7 +4,7 @@
 #include "homework.h"
 #include "user-record.h"
 
-int home_prepare_fscrypt(UserRecord *h, bool already_activated, char ***pkcs11_decrypted_passwords, HomeSetup *setup);
+int home_prepare_fscrypt(UserRecord *h, bool already_activated, PasswordCache *cache, HomeSetup *setup);
 int home_create_fscrypt(UserRecord *h, char **effective_passwords, UserRecord **ret_home);
 
-int home_passwd_fscrypt(UserRecord *h, HomeSetup *setup, char **pkcs11_decrypted_passwords, char **effective_passwords);
+int home_passwd_fscrypt(UserRecord *h, HomeSetup *setup, PasswordCache *cache, char **effective_passwords);
index 2a782e34bc20b8c567300e4f897cf7392f861eb1..99cab0929e55e2dcace842a58504a7e986362743 100644 (file)
@@ -216,7 +216,7 @@ static int luks_setup(
                 const char *cipher_mode,
                 uint64_t volume_key_size,
                 char **passwords,
-                char **pkcs11_decrypted_passwords,
+                const PasswordCache *cache,
                 bool discard,
                 struct crypt_device **ret,
                 sd_id128_t *ret_found_uuid,
@@ -227,6 +227,7 @@ static int luks_setup(
         _cleanup_(erase_and_freep) void *vk = NULL;
         sd_id128_t p;
         size_t vks;
+        char **list;
         int r;
 
         assert(node);
@@ -278,12 +279,14 @@ static int luks_setup(
         if (!vk)
                 return log_oom();
 
-        r = luks_try_passwords(cd, pkcs11_decrypted_passwords, vk, &vks);
-        if (r == -ENOKEY) {
-                r = luks_try_passwords(cd, passwords, vk, &vks);
-                if (r == -ENOKEY)
-                        return log_error_errno(r, "No valid password for LUKS superblock.");
+        r = -ENOKEY;
+        FOREACH_POINTER(list, cache->pkcs11_passwords, cache->fido2_passwords, passwords) {
+                r = luks_try_passwords(cd, list, vk, &vks);
+                if (r != -ENOKEY)
+                        break;
         }
+        if (r == -ENOKEY)
+                return log_error_errno(r, "No valid password for LUKS superblock.");
         if (r < 0)
                 return log_error_errno(r, "Failed to unlocks LUKS superblock: %m");
 
@@ -312,7 +315,7 @@ static int luks_setup(
 static int luks_open(
                 const char *dm_name,
                 char **passwords,
-                char **pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 struct crypt_device **ret,
                 sd_id128_t *ret_found_uuid,
                 void **ret_volume_key,
@@ -321,6 +324,7 @@ static int luks_open(
         _cleanup_(crypt_freep) struct crypt_device *cd = NULL;
         _cleanup_(erase_and_freep) void *vk = NULL;
         sd_id128_t p;
+        char **list;
         size_t vks;
         int r;
 
@@ -361,12 +365,14 @@ static int luks_open(
         if (!vk)
                 return log_oom();
 
-        r = luks_try_passwords(cd, pkcs11_decrypted_passwords, vk, &vks);
-        if (r == -ENOKEY) {
-                r = luks_try_passwords(cd, passwords, vk, &vks);
-                if (r == -ENOKEY)
-                        return log_error_errno(r, "No valid password for LUKS superblock.");
+        r = -ENOKEY;
+        FOREACH_POINTER(list, cache->pkcs11_passwords, cache->fido2_passwords, passwords) {
+                r = luks_try_passwords(cd, list, vk, &vks);
+                if (r != -ENOKEY)
+                        break;
         }
+        if (r == -ENOKEY)
+                return log_error_errno(r, "No valid password for LUKS superblock.");
         if (r < 0)
                 return log_error_errno(r, "Failed to unlocks LUKS superblock: %m");
 
@@ -622,7 +628,7 @@ static int luks_validate_home_record(
                 struct crypt_device *cd,
                 UserRecord *h,
                 const void *volume_key,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 UserRecord **ret_luks_home_record) {
 
         int r, token;
@@ -727,7 +733,7 @@ static int luks_validate_home_record(
                 if (!user_record_compatible(h, lhr))
                         return log_error_errno(SYNTHETIC_ERRNO(EREMCHG), "LUKS home record not compatible with host record, refusing.");
 
-                r = user_record_authenticate(lhr, h, pkcs11_decrypted_passwords, /* strict_verify= */ true);
+                r = user_record_authenticate(lhr, h, cache, /* strict_verify= */ true);
                 if (r < 0)
                         return r;
                 assert(r > 0); /* Insist that a password was verified */
@@ -982,7 +988,7 @@ int home_prepare_luks(
                 UserRecord *h,
                 bool already_activated,
                 const char *force_image_path,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 HomeSetup *setup,
                 UserRecord **ret_luks_home) {
 
@@ -1010,7 +1016,7 @@ int home_prepare_luks(
 
                 r = luks_open(setup->dm_name,
                               h->password,
-                              pkcs11_decrypted_passwords ? *pkcs11_decrypted_passwords : NULL,
+                              cache,
                               &cd,
                               &found_luks_uuid,
                               &volume_key,
@@ -1018,7 +1024,7 @@ int home_prepare_luks(
                 if (r < 0)
                         return r;
 
-                r = luks_validate_home_record(cd, h, volume_key, pkcs11_decrypted_passwords, &luks_home);
+                r = luks_validate_home_record(cd, h, volume_key, cache, &luks_home);
                 if (r < 0)
                         return r;
 
@@ -1133,7 +1139,7 @@ int home_prepare_luks(
                                h->luks_cipher_mode,
                                h->luks_volume_key_size,
                                h->password,
-                               pkcs11_decrypted_passwords ? *pkcs11_decrypted_passwords : NULL,
+                               cache,
                                user_record_luks_discard(h) || user_record_luks_offline_discard(h),
                                &cd,
                                &found_luks_uuid,
@@ -1144,7 +1150,7 @@ int home_prepare_luks(
 
                 dm_activated = true;
 
-                r = luks_validate_home_record(cd, h, volume_key, pkcs11_decrypted_passwords, &luks_home);
+                r = luks_validate_home_record(cd, h, volume_key, cache, &luks_home);
                 if (r < 0)
                         goto fail;
 
@@ -1218,7 +1224,7 @@ static void print_size_summary(uint64_t host_size, uint64_t encrypted_size, stru
 
 int home_activate_luks(
                 UserRecord *h,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 UserRecord **ret_home) {
 
         _cleanup_(user_record_unrefp) UserRecord *new_home = NULL, *luks_home_record = NULL;
@@ -1250,7 +1256,7 @@ int home_activate_luks(
                         h,
                         false,
                         NULL,
-                        pkcs11_decrypted_passwords,
+                        cache,
                         &setup,
                         &luks_home_record);
         if (r < 0)
@@ -1268,7 +1274,7 @@ int home_activate_luks(
                         h,
                         &setup,
                         luks_home_record,
-                        pkcs11_decrypted_passwords,
+                        cache,
                         &sfs,
                         &new_home);
         if (r < 0)
@@ -1464,7 +1470,7 @@ static int luks_format(
                 const char *dm_name,
                 sd_id128_t uuid,
                 const char *label,
-                char **pkcs11_decrypted_passwords,
+                const PasswordCache *cache,
                 char **effective_passwords,
                 bool discard,
                 UserRecord *hr,
@@ -1533,7 +1539,8 @@ static int luks_format(
 
         STRV_FOREACH(pp, effective_passwords) {
 
-                if (strv_contains(pkcs11_decrypted_passwords, *pp)) {
+                if (strv_contains(cache->pkcs11_passwords, *pp) ||
+                    strv_contains(cache->fido2_passwords, *pp)) {
                         log_debug("Using minimal PBKDF for slot %i", slot);
                         r = crypt_set_pbkdf_type(cd, &minimal_pbkdf);
                 } else {
@@ -1858,7 +1865,7 @@ static int home_truncate(
 
 int home_create_luks(
                 UserRecord *h,
-                char **pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 char **effective_passwords,
                 UserRecord **ret_home) {
 
@@ -2055,7 +2062,7 @@ int home_create_luks(
                         dm_name,
                         luks_uuid,
                         user_record_user_name_and_realm(h),
-                        pkcs11_decrypted_passwords,
+                        cache,
                         effective_passwords,
                         user_record_luks_discard(h) || user_record_luks_offline_discard(h),
                         h,
@@ -2561,7 +2568,7 @@ static int apply_resize_partition(int fd, sd_id128_t disk_uuids, struct fdisk_ta
 int home_resize_luks(
                 UserRecord *h,
                 bool already_activated,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 HomeSetup *setup,
                 UserRecord **ret_home) {
 
@@ -2647,11 +2654,11 @@ int home_resize_luks(
                 }
         }
 
-        r = home_prepare_luks(h, already_activated, whole_disk, pkcs11_decrypted_passwords, setup, &header_home);
+        r = home_prepare_luks(h, already_activated, whole_disk, cache, setup, &header_home);
         if (r < 0)
                 return r;
 
-        r = home_load_embedded_identity(h, setup->root_fd, header_home, USER_RECONCILE_REQUIRE_NEWER_OR_EQUAL, pkcs11_decrypted_passwords, &embedded_home, &new_home);
+        r = home_load_embedded_identity(h, setup->root_fd, header_home, USER_RECONCILE_REQUIRE_NEWER_OR_EQUAL, cache, &embedded_home, &new_home);
         if (r < 0)
                 return r;
 
@@ -2855,13 +2862,14 @@ int home_resize_luks(
 int home_passwd_luks(
                 UserRecord *h,
                 HomeSetup *setup,
-                char **pkcs11_decrypted_passwords, /* the passwords acquired via PKCS#11 security tokens */
-                char **effective_passwords         /* new passwords */) {
+                PasswordCache *cache,      /* the passwords acquired via PKCS#11/FIDO2 security tokens */
+                char **effective_passwords /* new passwords */) {
 
         size_t volume_key_size, i, max_key_slots, n_effective;
         _cleanup_(erase_and_freep) void *volume_key = NULL;
         struct crypt_pbkdf_type good_pbkdf, minimal_pbkdf;
         const char *type;
+        char **list;
         int r;
 
         assert(h);
@@ -2886,12 +2894,14 @@ int home_passwd_luks(
         if (!volume_key)
                 return log_oom();
 
-        r = luks_try_passwords(setup->crypt_device, pkcs11_decrypted_passwords, volume_key, &volume_key_size);
-        if (r == -ENOKEY) {
-                r = luks_try_passwords(setup->crypt_device, h->password, volume_key, &volume_key_size);
-                if (r == -ENOKEY)
-                        return log_error_errno(SYNTHETIC_ERRNO(ENOKEY), "Failed to unlock LUKS superblock with supplied passwords.");
+        r = -ENOKEY;
+        FOREACH_POINTER(list, cache->pkcs11_passwords, cache->fido2_passwords, h->password) {
+                r = luks_try_passwords(setup->crypt_device, list, volume_key, &volume_key_size);
+                if (r != -ENOKEY)
+                        break;
         }
+        if (r == -ENOKEY)
+                return log_error_errno(SYNTHETIC_ERRNO(ENOKEY), "Failed to unlock LUKS superblock with supplied passwords.");
         if (r < 0)
                 return log_error_errno(r, "Failed to unlocks LUKS superblock: %m");
 
@@ -2911,7 +2921,8 @@ int home_passwd_luks(
                         continue;
                 }
 
-                if (strv_find(pkcs11_decrypted_passwords, effective_passwords[i])) {
+                if (strv_contains(cache->pkcs11_passwords, effective_passwords[i]) ||
+                    strv_contains(cache->fido2_passwords, effective_passwords[i])) {
                         log_debug("Using minimal PBKDF for slot %zu", i);
                         r = crypt_set_pbkdf_type(setup->crypt_device, &minimal_pbkdf);
                 } else {
@@ -3008,9 +3019,10 @@ static int luks_try_resume(
         return -ENOKEY;
 }
 
-int home_unlock_luks(UserRecord *h, char ***pkcs11_decrypted_passwords) {
+int home_unlock_luks(UserRecord *h, PasswordCache *cache) {
         _cleanup_free_ char *dm_name = NULL, *dm_node = NULL;
         _cleanup_(crypt_freep) struct crypt_device *cd = NULL;
+        char **list;
         int r;
 
         assert(h);
@@ -3026,12 +3038,14 @@ int home_unlock_luks(UserRecord *h, char ***pkcs11_decrypted_passwords) {
         log_info("Discovered used LUKS device %s.", dm_node);
         crypt_set_log_callback(cd, cryptsetup_log_glue, NULL);
 
-        r = luks_try_resume(cd, dm_name, pkcs11_decrypted_passwords ? *pkcs11_decrypted_passwords : NULL);
-        if (r == -ENOKEY) {
-                r = luks_try_resume(cd, dm_name, h->password);
-                if (r == -ENOKEY)
-                        return log_error_errno(r, "No valid password for LUKS superblock.");
+        r = -ENOKEY;
+        FOREACH_POINTER(list, cache->pkcs11_passwords, cache->fido2_passwords, h->password) {
+                r = luks_try_resume(cd, dm_name, list);
+                if (r != -ENOKEY)
+                        break;
         }
+        if (r == -ENOKEY)
+                return log_error_errno(r, "No valid password for LUKS superblock.");
         if (r < 0)
                 return log_error_errno(r, "Failed to resume LUKS superblock: %m");
 
index bd51f5da50ae753065ca216fbd98350892e749ab..b51f1ad7a01d07f747ed67b9f6d1ad86c8c359f7 100644 (file)
@@ -5,24 +5,24 @@
 #include "homework.h"
 #include "user-record.h"
 
-int home_prepare_luks(UserRecord *h, bool already_activated, const char *force_image_path, char ***pkcs11_decrypted_passwords, HomeSetup *setup, UserRecord **ret_luks_home);
+int home_prepare_luks(UserRecord *h, bool already_activated, const char *force_image_path, PasswordCache *cache, HomeSetup *setup, UserRecord **ret_luks_home);
 
-int home_activate_luks(UserRecord *h, char ***pkcs11_decrypted_passwords, UserRecord **ret_home);
+int home_activate_luks(UserRecord *h, PasswordCache *cache, UserRecord **ret_home);
 int home_deactivate_luks(UserRecord *h);
 int home_trim_luks(UserRecord *h);
 
 int home_store_header_identity_luks(UserRecord *h, HomeSetup *setup, UserRecord *old_home);
 
-int home_create_luks(UserRecord *h, char **pkcs11_decrypted_passwords, char **effective_passwords, UserRecord **ret_home);
+int home_create_luks(UserRecord *h, PasswordCache *cache, char **effective_passwords, UserRecord **ret_home);
 
 int home_validate_update_luks(UserRecord *h, HomeSetup *setup);
 
-int home_resize_luks(UserRecord *h, bool already_activated, char ***pkcs11_decrypted_passwords, HomeSetup *setup, UserRecord **ret_home);
+int home_resize_luks(UserRecord *h, bool already_activated, PasswordCache *cache, HomeSetup *setup, UserRecord **ret_home);
 
-int home_passwd_luks(UserRecord *h, HomeSetup *setup, char **pkcs11_decrypted_passwords, char **effective_passwords);
+int home_passwd_luks(UserRecord *h, HomeSetup *setup, PasswordCache *cache, char **effective_passwords);
 
 int home_lock_luks(UserRecord *h);
-int home_unlock_luks(UserRecord *h, char ***pkcs11_decrypted_passwords);
+int home_unlock_luks(UserRecord *h, PasswordCache *cache);
 
 static inline uint64_t luks_volume_key_size_convert(struct crypt_device *cd) {
         int k;
index 915bc0e57ec8880af77e029bfe9d866fffa12b41..3a03fb7200d1b6cc2bcc266d049181f546469837 100644 (file)
@@ -62,10 +62,10 @@ int pkcs11_callback(
                 goto decrypt;
         }
 
-        if (strv_isempty(data->secret->pkcs11_pin))
-                return log_error_errno(SYNTHETIC_ERRNO(ENOANO), "Security Token requires PIN.");
+        if (strv_isempty(data->secret->token_pin))
+                return log_error_errno(SYNTHETIC_ERRNO(ENOANO), "Security token requires PIN.");
 
-        STRV_FOREACH(i, data->secret->pkcs11_pin) {
+        STRV_FOREACH(i, data->secret->token_pin) {
                 rv = m->C_Login(session, CKU_USER, (CK_UTF8CHAR*) *i, strlen(*i));
                 if (rv == CKR_OK) {
                         log_info("Successfully logged into security token '%s' with PIN.", token_label);
index 316933cf4ebf69b3be051d050a874e6e97e250ed..83bd875d2d6f39529b942465005896298ca516a0 100644 (file)
@@ -11,6 +11,7 @@
 #include "home-util.h"
 #include "homework-cifs.h"
 #include "homework-directory.h"
+#include "homework-fido2.h"
 #include "homework-fscrypt.h"
 #include "homework-luks.h"
 #include "homework-mount.h"
@@ -21,7 +22,6 @@
 #include "missing_magic.h"
 #include "mount-util.h"
 #include "path-util.h"
-#include "pkcs11-util.h"
 #include "rm-rf.h"
 #include "stat-util.h"
 #include "strv.h"
 /* Make sure a bad password always results in a 3s delay, no matter what */
 #define BAD_PASSWORD_DELAY_USEC (3 * USEC_PER_SEC)
 
+void password_cache_free(PasswordCache *cache) {
+        if (!cache)
+                return;
+
+        cache->pkcs11_passwords = strv_free_erase(cache->pkcs11_passwords);
+        cache->fido2_passwords = strv_free_erase(cache->fido2_passwords);
+}
+
 int user_record_authenticate(
                 UserRecord *h,
                 UserRecord *secret,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 bool strict_verify) {
 
-        bool need_password = false, need_token = false, need_pin = false, need_protected_authentication_path_permitted = false,
-                pin_locked = false, pin_incorrect = false, pin_incorrect_few_tries_left = false, pin_incorrect_one_try_left = false;
+        bool need_password = false, need_token = false, need_pin = false, need_protected_authentication_path_permitted = false, need_user_presence_permitted = false,
+                pin_locked = false, pin_incorrect = false, pin_incorrect_few_tries_left = false, pin_incorrect_one_try_left = false, token_action_timeout = false;
         int r;
 
         assert(h);
@@ -47,14 +55,14 @@ int user_record_authenticate(
 
         /* Tries to authenticate a user record with the supplied secrets. i.e. checks whether at least one
          * supplied plaintext passwords matches a hashed password field of the user record. Or if a
-         * configured PKCS#11 token is around and can unlock the record.
+         * configured PKCS#11 or FIDO2 token is around and can unlock the record.
          *
-         * Note that the pkcs11_decrypted_passwords parameter is both an input and and output parameter: it
-         * is a list of configured, decrypted PKCS#11 passwords. We typically have to call this function
-         * multiple times over the course of an operation (think: on login we authenticate the host user
-         * record, the record embedded in the LUKS record and the one embedded in $HOME). Hence we keep a
-         * list of passwords we already decrypted, so that we don't have to do the (slow an potentially
-         * interactive) PKCS#11 dance for the relevant token again and again. */
+         * Note that the 'cache' parameter is both an input and output parameter: it contains lists of
+         * configured, decrypted PKCS#11/FIDO2 passwords. We typically have to call this function multiple
+         * times over the course of an operation (think: on login we authenticate the host user record, the
+         * record embedded in the LUKS record and the one embedded in $HOME). Hence we keep a list of
+         * passwords we already decrypted, so that we don't have to do the (slow and potentially interactive)
+         * PKCS#11/FIDO2 dance for the relevant token again and again. */
 
         /* First, let's see if the supplied plain-text passwords work? */
         r = user_record_test_secret(h, secret);
@@ -70,19 +78,12 @@ int user_record_authenticate(
                 return 1;
         }
 
-        /* Second, let's see if any of the PKCS#11 security tokens are plugged in and help us */
+        /* Second, test cached PKCS#11 passwords */
         for (size_t n = 0; n < h->n_pkcs11_encrypted_key; n++) {
-#if HAVE_P11KIT
-                _cleanup_(pkcs11_callback_data_release) struct pkcs11_callback_data data = {
-                        .user_record = h,
-                        .secret = secret,
-                        .encrypted_key = h->pkcs11_encrypted_key + n,
-                };
                 char **pp;
 
-                /* See if any of the previously calculated passwords work */
-                STRV_FOREACH(pp, *pkcs11_decrypted_passwords) {
-                        r = test_password_one(data.encrypted_key->hashed_password, *pp);
+                STRV_FOREACH(pp, cache->pkcs11_passwords) {
+                        r = test_password_one(h->pkcs11_encrypted_key[n].hashed_password, *pp);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to check supplied PKCS#11 password: %m");
                         if (r > 0) {
@@ -90,6 +91,32 @@ int user_record_authenticate(
                                 return 1;
                         }
                 }
+        }
+
+        /* Third, test cached FIDO2 passwords */
+        for (size_t n = 0; n < h->n_fido2_hmac_salt; n++) {
+                char **pp;
+
+                /* See if any of the previously calculated passwords work */
+                STRV_FOREACH(pp, cache->fido2_passwords) {
+                        r = test_password_one(h->fido2_hmac_salt[n].hashed_password, *pp);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to check supplied FIDO2 password: %m");
+                        if (r > 0) {
+                                log_info("Previously acquired FIDO2 password unlocks user record.");
+                                return 0;
+                        }
+                }
+        }
+
+        /* Fourth, let's see if any of the PKCS#11 security tokens are plugged in and help us */
+        for (size_t n = 0; n < h->n_pkcs11_encrypted_key; n++) {
+#if HAVE_P11KIT
+                _cleanup_(pkcs11_callback_data_release) struct pkcs11_callback_data data = {
+                        .user_record = h,
+                        .secret = secret,
+                        .encrypted_key = h->pkcs11_encrypted_key + n,
+                };
 
                 r = pkcs11_find_token(data.encrypted_key->uri, pkcs11_callback, &data);
                 switch (r) {
@@ -126,7 +153,56 @@ int user_record_authenticate(
 
                         log_info("Decrypted password from PKCS#11 security token %s unlocks user record.", data.encrypted_key->uri);
 
-                        r = strv_extend(pkcs11_decrypted_passwords, data.decrypted_password);
+                        r = strv_extend(&cache->pkcs11_passwords, data.decrypted_password);
+                        if (r < 0)
+                                return log_oom();
+
+                        return 0;
+                }
+#else
+                need_token = true;
+                break;
+#endif
+        }
+
+        /* Fifth, let's see if any of the FIDO2 security tokens are plugged in and help us */
+        for (size_t n = 0; n < h->n_fido2_hmac_salt; n++) {
+#if HAVE_LIBFIDO2
+                _cleanup_(erase_and_freep) char *decrypted_password = NULL;
+
+                r = fido2_use_token(h, secret, h->fido2_hmac_salt + n, &decrypted_password);
+                switch (r) {
+                case -EAGAIN:
+                        need_token = true;
+                        break;
+                case -ENOANO:
+                        need_pin = true;
+                        break;
+                case -EOWNERDEAD:
+                        pin_locked = true;
+                        break;
+                case -ENOLCK:
+                        pin_incorrect = true;
+                        break;
+                case -EMEDIUMTYPE:
+                        need_user_presence_permitted = true;
+                        break;
+                case -ENOSTR:
+                        token_action_timeout = true;
+                        break;
+                default:
+                        if (r < 0)
+                                return r;
+
+                        r = test_password_one(h->fido2_hmac_salt[n].hashed_password, decrypted_password);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to test FIDO2 password: %m");
+                        if (r == 0)
+                                return log_error_errno(SYNTHETIC_ERRNO(EPERM), "Configured FIDO2 security token does not decrypt encrypted key correctly.");
+
+                        log_info("Decrypted password from FIDO2 security token unlocks user record.");
+
+                        r = strv_extend(&cache->fido2_passwords, decrypted_password);
                         if (r < 0)
                                 return log_oom();
 
@@ -147,8 +223,12 @@ int user_record_authenticate(
                 return -ENOLCK;
         if (pin_locked)
                 return -EOWNERDEAD;
+        if (token_action_timeout)
+                return -ENOSTR;
         if (need_protected_authentication_path_permitted)
                 return -ERFKILL;
+        if (need_user_presence_permitted)
+                return -EMEDIUMTYPE;
         if (need_pin)
                 return -ENOANO;
         if (need_token)
@@ -156,10 +236,11 @@ int user_record_authenticate(
         if (need_password)
                 return -ENOKEY;
 
-        /* Hmm, this means neither PCKS#11 nor classic hashed passwords were supplied, we cannot authenticate this reasonably */
+        /* Hmm, this means neither PCKS#11/FIDO2 nor classic hashed passwords were supplied, we cannot
+         * authenticate this reasonably */
         if (strict_verify)
                 return log_debug_errno(SYNTHETIC_ERRNO(EKEYREVOKED),
-                                       "No hashed passwords and no PKCS#11 tokens defined, cannot authenticate user record, refusing.");
+                                       "No hashed passwords and no PKCS#11/FIDO2 tokens defined, cannot authenticate user record, refusing.");
 
         /* If strict verification is off this means we are possibly in the case where we encountered an
          * unfixated record, i.e. a synthetic one that accordingly lacks any authentication data. In this
@@ -230,7 +311,7 @@ int home_setup_undo(HomeSetup *setup) {
 int home_prepare(
                 UserRecord *h,
                 bool already_activated,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 HomeSetup *setup,
                 UserRecord **ret_header_home) {
 
@@ -249,7 +330,7 @@ int home_prepare(
         switch (user_record_storage(h)) {
 
         case USER_LUKS:
-                return home_prepare_luks(h, already_activated, NULL, pkcs11_decrypted_passwords, setup, ret_header_home);
+                return home_prepare_luks(h, already_activated, NULL, cache, setup, ret_header_home);
 
         case USER_SUBVOLUME:
         case USER_DIRECTORY:
@@ -257,7 +338,7 @@ int home_prepare(
                 break;
 
         case USER_FSCRYPT:
-                r = home_prepare_fscrypt(h, already_activated, pkcs11_decrypted_passwords, setup);
+                r = home_prepare_fscrypt(h, already_activated, cache, setup);
                 break;
 
         case USER_CIFS:
@@ -387,7 +468,7 @@ int home_load_embedded_identity(
                 int root_fd,
                 UserRecord *header_home,
                 UserReconcileMode mode,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 UserRecord **ret_embedded_home,
                 UserRecord **ret_new_home) {
 
@@ -414,7 +495,7 @@ int home_load_embedded_identity(
                 return log_error_errno(SYNTHETIC_ERRNO(EREMCHG), "Embedded home record not compatible with host record, refusing.");
 
         /* Insist that credentials the user supplies also unlocks any embedded records. */
-        r = user_record_authenticate(embedded_home, h, pkcs11_decrypted_passwords, /* strict_verify= */ true);
+        r = user_record_authenticate(embedded_home, h, cache, /* strict_verify= */ true);
         if (r < 0)
                 return r;
         assert(r > 0); /* Insist that a password was verified */
@@ -576,7 +657,7 @@ int home_refresh(
                 UserRecord *h,
                 HomeSetup *setup,
                 UserRecord *header_home,
-                char ***pkcs11_decrypted_passwords,
+                PasswordCache *cache,
                 struct statfs *ret_statfs,
                 UserRecord **ret_new_home) {
 
@@ -590,7 +671,7 @@ int home_refresh(
         /* When activating a home directory, does the identity work: loads the identity from the $HOME
          * directory, reconciles it with our idea, chown()s everything. */
 
-        r = home_load_embedded_identity(h, setup->root_fd, header_home, USER_RECONCILE_ANY, pkcs11_decrypted_passwords, &embedded_home, &new_home);
+        r = home_load_embedded_identity(h, setup->root_fd, header_home, USER_RECONCILE_ANY, cache, &embedded_home, &new_home);
         if (r < 0)
                 return r;
 
@@ -615,7 +696,7 @@ int home_refresh(
 }
 
 static int home_activate(UserRecord *h, UserRecord **ret_home) {
-        _cleanup_(strv_free_erasep) char **pkcs11_decrypted_passwords = NULL;
+        _cleanup_(password_cache_free) PasswordCache cache = {};
         _cleanup_(user_record_unrefp) UserRecord *new_home = NULL;
         int r;
 
@@ -628,7 +709,7 @@ static int home_activate(UserRecord *h, UserRecord **ret_home) {
         if (!IN_SET(user_record_storage(h), USER_LUKS, USER_DIRECTORY, USER_SUBVOLUME, USER_FSCRYPT, USER_CIFS))
                 return log_error_errno(SYNTHETIC_ERRNO(ENOTTY), "Activating home directories of type '%s' currently not supported.", user_storage_to_string(user_record_storage(h)));
 
-        r = user_record_authenticate(h, h, &pkcs11_decrypted_passwords, /* strict_verify= */ false);
+        r = user_record_authenticate(h, h, &cache, /* strict_verify= */ false);
         if (r < 0)
                 return r;
 
@@ -647,7 +728,7 @@ static int home_activate(UserRecord *h, UserRecord **ret_home) {
         switch (user_record_storage(h)) {
 
         case USER_LUKS:
-                r = home_activate_luks(h, &pkcs11_decrypted_passwords, &new_home);
+                r = home_activate_luks(h, &cache, &new_home);
                 if (r < 0)
                         return r;
 
@@ -656,14 +737,14 @@ static int home_activate(UserRecord *h, UserRecord **ret_home) {
         case USER_SUBVOLUME:
         case USER_DIRECTORY:
         case USER_FSCRYPT:
-                r = home_activate_directory(h, &pkcs11_decrypted_passwords, &new_home);
+                r = home_activate_directory(h, &cache, &new_home);
                 if (r < 0)
                         return r;
 
                 break;
 
         case USER_CIFS:
-                r = home_activate_cifs(h, &pkcs11_decrypted_passwords, &new_home);
+                r = home_activate_cifs(h, &cache, &new_home);
                 if (r < 0)
                         return r;
 
@@ -783,15 +864,16 @@ int home_populate(UserRecord *h, int dir_fd) {
 
 static int user_record_compile_effective_passwords(
                 UserRecord *h,
-                char ***ret_effective_passwords,
-                char ***ret_pkcs11_decrypted_passwords) {
+                PasswordCache *cache,
+                char ***ret_effective_passwords) {
 
-        _cleanup_(strv_free_erasep) char **effective = NULL, **pkcs11_passwords = NULL;
+        _cleanup_(strv_free_erasep) char **effective = NULL;
         size_t n;
         char **i;
         int r;
 
         assert(h);
+        assert(cache);
 
         /* We insist on at least one classic hashed password to be defined in addition to any PKCS#11 one, as
          * a safe fallback, but also to simplify the password changing algorithm: there we require providing
@@ -858,11 +940,37 @@ static int user_record_compile_effective_passwords(
                                 return log_oom();
                 }
 
-                if (ret_pkcs11_decrypted_passwords) {
-                        r = strv_extend(&pkcs11_passwords, data.decrypted_password);
+                r = strv_extend(&cache->pkcs11_passwords, data.decrypted_password);
+                if (r < 0)
+                        return log_oom();
+#else
+                return -EBADSLT;
+#endif
+        }
+
+        for (n = 0; n < h->n_fido2_hmac_salt; n++) {
+#if HAVE_LIBFIDO2
+                _cleanup_(erase_and_freep) char *decrypted_password = NULL;
+
+                r = fido2_use_token(h, h, h->fido2_hmac_salt + n, &decrypted_password);
+                if (r < 0)
+                        return r;
+
+                r = test_password_one(h->fido2_hmac_salt[n].hashed_password, decrypted_password);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to test FIDO2 password: %m");
+                if (r == 0)
+                        return log_error_errno(SYNTHETIC_ERRNO(EPERM), "Decrypted password from token is not correct, refusing.");
+
+                if (ret_effective_passwords) {
+                        r = strv_extend(&effective, decrypted_password);
                         if (r < 0)
                                 return log_oom();
                 }
+
+                r = strv_extend(&cache->fido2_passwords, decrypted_password);
+                if (r < 0)
+                        return log_oom();
 #else
                 return -EBADSLT;
 #endif
@@ -870,8 +978,6 @@ static int user_record_compile_effective_passwords(
 
         if (ret_effective_passwords)
                 *ret_effective_passwords = TAKE_PTR(effective);
-        if (ret_pkcs11_decrypted_passwords)
-                *ret_pkcs11_decrypted_passwords = TAKE_PTR(pkcs11_passwords);
 
         return 0;
 }
@@ -934,8 +1040,9 @@ static int determine_default_storage(UserStorage *ret) {
 }
 
 static int home_create(UserRecord *h, UserRecord **ret_home) {
-        _cleanup_(strv_free_erasep) char **effective_passwords = NULL, **pkcs11_decrypted_passwords = NULL;
+        _cleanup_(strv_free_erasep) char **effective_passwords = NULL;
         _cleanup_(user_record_unrefp) UserRecord *new_home = NULL;
+        _cleanup_(password_cache_free) PasswordCache cache = {};
         UserStorage new_storage = _USER_STORAGE_INVALID;
         const char *new_fs = NULL;
         int r;
@@ -947,7 +1054,7 @@ static int home_create(UserRecord *h, UserRecord **ret_home) {
         if (!uid_is_valid(h->uid))
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "User record lacks UID, refusing.");
 
-        r = user_record_compile_effective_passwords(h, &effective_passwords, &pkcs11_decrypted_passwords);
+        r = user_record_compile_effective_passwords(h, &cache, &effective_passwords);
         if (r < 0)
                 return r;
 
@@ -996,7 +1103,7 @@ static int home_create(UserRecord *h, UserRecord **ret_home) {
         switch (user_record_storage(h)) {
 
         case USER_LUKS:
-                r = home_create_luks(h, pkcs11_decrypted_passwords, effective_passwords, &new_home);
+                r = home_create_luks(h, &cache, effective_passwords, &new_home);
                 break;
 
         case USER_DIRECTORY:
@@ -1182,15 +1289,15 @@ static int home_validate_update(UserRecord *h, HomeSetup *setup) {
 
 static int home_update(UserRecord *h, UserRecord **ret) {
         _cleanup_(user_record_unrefp) UserRecord *new_home = NULL, *header_home = NULL, *embedded_home = NULL;
-        _cleanup_(strv_free_erasep) char **pkcs11_decrypted_passwords = NULL;
         _cleanup_(home_setup_undo) HomeSetup setup = HOME_SETUP_INIT;
+        _cleanup_(password_cache_free) PasswordCache cache = {};
         bool already_activated = false;
         int r;
 
         assert(h);
         assert(ret);
 
-        r = user_record_authenticate(h, h, &pkcs11_decrypted_passwords, /* strict_verify= */ true);
+        r = user_record_authenticate(h, h, &cache, /* strict_verify= */ true);
         if (r < 0)
                 return r;
         assert(r > 0); /* Insist that a password was verified */
@@ -1201,11 +1308,11 @@ static int home_update(UserRecord *h, UserRecord **ret) {
 
         already_activated = r > 0;
 
-        r = home_prepare(h, already_activated, &pkcs11_decrypted_passwords, &setup, &header_home);
+        r = home_prepare(h, already_activated, &cache, &setup, &header_home);
         if (r < 0)
                 return r;
 
-        r = home_load_embedded_identity(h, setup.root_fd, header_home, USER_RECONCILE_REQUIRE_NEWER, &pkcs11_decrypted_passwords, &embedded_home, &new_home);
+        r = home_load_embedded_identity(h, setup.root_fd, header_home, USER_RECONCILE_REQUIRE_NEWER, &cache, &embedded_home, &new_home);
         if (r < 0)
                 return r;
 
@@ -1237,7 +1344,7 @@ static int home_update(UserRecord *h, UserRecord **ret) {
 
 static int home_resize(UserRecord *h, UserRecord **ret) {
         _cleanup_(home_setup_undo) HomeSetup setup = HOME_SETUP_INIT;
-        _cleanup_(strv_free_erasep) char **pkcs11_decrypted_passwords = NULL;
+        _cleanup_(password_cache_free) PasswordCache cache = {};
         bool already_activated = false;
         int r;
 
@@ -1247,7 +1354,7 @@ static int home_resize(UserRecord *h, UserRecord **ret) {
         if (h->disk_size == UINT64_MAX)
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "No target size specified, refusing.");
 
-        r = user_record_authenticate(h, h, &pkcs11_decrypted_passwords, /* strict_verify= */ true);
+        r = user_record_authenticate(h, h, &cache, /* strict_verify= */ true);
         if (r < 0)
                 return r;
         assert(r > 0); /* Insist that a password was verified */
@@ -1261,12 +1368,12 @@ static int home_resize(UserRecord *h, UserRecord **ret) {
         switch (user_record_storage(h)) {
 
         case USER_LUKS:
-                return home_resize_luks(h, already_activated, &pkcs11_decrypted_passwords, &setup, ret);
+                return home_resize_luks(h, already_activated, &cache, &setup, ret);
 
         case USER_DIRECTORY:
         case USER_SUBVOLUME:
         case USER_FSCRYPT:
-                return home_resize_directory(h, already_activated, &pkcs11_decrypted_passwords, &setup, ret);
+                return home_resize_directory(h, already_activated, &cache, &setup, ret);
 
         default:
                 return log_error_errno(SYNTHETIC_ERRNO(ENOTTY), "Resizing home directories of type '%s' currently not supported.", user_storage_to_string(user_record_storage(h)));
@@ -1275,8 +1382,9 @@ static int home_resize(UserRecord *h, UserRecord **ret) {
 
 static int home_passwd(UserRecord *h, UserRecord **ret_home) {
         _cleanup_(user_record_unrefp) UserRecord *header_home = NULL, *embedded_home = NULL, *new_home = NULL;
-        _cleanup_(strv_free_erasep) char **effective_passwords = NULL, **pkcs11_decrypted_passwords = NULL;
+        _cleanup_(strv_free_erasep) char **effective_passwords = NULL;
         _cleanup_(home_setup_undo) HomeSetup setup = HOME_SETUP_INIT;
+        _cleanup_(password_cache_free) PasswordCache cache = {};
         bool already_activated = false;
         int r;
 
@@ -1286,7 +1394,7 @@ static int home_passwd(UserRecord *h, UserRecord **ret_home) {
         if (!IN_SET(user_record_storage(h), USER_LUKS, USER_DIRECTORY, USER_SUBVOLUME, USER_FSCRYPT))
                 return log_error_errno(SYNTHETIC_ERRNO(ENOTTY), "Changing password of home directories of type '%s' currently not supported.", user_storage_to_string(user_record_storage(h)));
 
-        r = user_record_compile_effective_passwords(h, &effective_passwords, &pkcs11_decrypted_passwords);
+        r = user_record_compile_effective_passwords(h, &cache, &effective_passwords);
         if (r < 0)
                 return r;
 
@@ -1296,24 +1404,24 @@ static int home_passwd(UserRecord *h, UserRecord **ret_home) {
 
         already_activated = r > 0;
 
-        r = home_prepare(h, already_activated, &pkcs11_decrypted_passwords, &setup, &header_home);
+        r = home_prepare(h, already_activated, &cache, &setup, &header_home);
         if (r < 0)
                 return r;
 
-        r = home_load_embedded_identity(h, setup.root_fd, header_home, USER_RECONCILE_REQUIRE_NEWER_OR_EQUAL, &pkcs11_decrypted_passwords, &embedded_home, &new_home);
+        r = home_load_embedded_identity(h, setup.root_fd, header_home, USER_RECONCILE_REQUIRE_NEWER_OR_EQUAL, &cache, &embedded_home, &new_home);
         if (r < 0)
                 return r;
 
         switch (user_record_storage(h)) {
 
         case USER_LUKS:
-                r = home_passwd_luks(h, &setup, pkcs11_decrypted_passwords, effective_passwords);
+                r = home_passwd_luks(h, &setup, &cache, effective_passwords);
                 if (r < 0)
                         return r;
                 break;
 
         case USER_FSCRYPT:
-                r = home_passwd_fscrypt(h, &setup, pkcs11_decrypted_passwords, effective_passwords);
+                r = home_passwd_fscrypt(h, &setup, &cache, effective_passwords);
                 if (r < 0)
                         return r;
                 break;
@@ -1351,14 +1459,14 @@ static int home_passwd(UserRecord *h, UserRecord **ret_home) {
 static int home_inspect(UserRecord *h, UserRecord **ret_home) {
         _cleanup_(user_record_unrefp) UserRecord *header_home = NULL, *new_home = NULL;
         _cleanup_(home_setup_undo) HomeSetup setup = HOME_SETUP_INIT;
-        _cleanup_(strv_free_erasep) char **pkcs11_decrypted_passwords = NULL;
+        _cleanup_(password_cache_free) PasswordCache cache = {};
         bool already_activated = false;
         int r;
 
         assert(h);
         assert(ret_home);
 
-        r = user_record_authenticate(h, h, &pkcs11_decrypted_passwords, /* strict_verify= */ false);
+        r = user_record_authenticate(h, h, &cache, /* strict_verify= */ false);
         if (r < 0)
                 return r;
 
@@ -1368,11 +1476,11 @@ static int home_inspect(UserRecord *h, UserRecord **ret_home) {
 
         already_activated = r > 0;
 
-        r = home_prepare(h, already_activated, &pkcs11_decrypted_passwords, &setup, &header_home);
+        r = home_prepare(h, already_activated, &cache, &setup, &header_home);
         if (r < 0)
                 return r;
 
-        r = home_load_embedded_identity(h, setup.root_fd, header_home, USER_RECONCILE_ANY, &pkcs11_decrypted_passwords, NULL, &new_home);
+        r = home_load_embedded_identity(h, setup.root_fd, header_home, USER_RECONCILE_ANY, &cache, NULL, &new_home);
         if (r < 0)
                 return r;
 
@@ -1415,7 +1523,7 @@ static int home_lock(UserRecord *h) {
 }
 
 static int home_unlock(UserRecord *h) {
-        _cleanup_(strv_free_erasep) char **pkcs11_decrypted_passwords = NULL;
+        _cleanup_(password_cache_free) PasswordCache cache = {};
         int r;
 
         assert(h);
@@ -1428,11 +1536,11 @@ static int home_unlock(UserRecord *h) {
         /* Note that we don't check if $HOME is actually mounted, since we want to avoid disk accesses on
          * that mount until we have resumed the device. */
 
-        r = user_record_authenticate(h, h, &pkcs11_decrypted_passwords, /* strict_verify= */ false);
+        r = user_record_authenticate(h, h, &cache, /* strict_verify= */ false);
         if (r < 0)
                 return r;
 
-        r = home_unlock_luks(h, &pkcs11_decrypted_passwords);
+        r = home_unlock_luks(h, &cache);
         if (r < 0)
                 return r;
 
@@ -1495,10 +1603,12 @@ static int run(int argc, char *argv[]) {
          * ESOCKTNOSUPPORT → operation not support on this file system
          * ENOKEY          → password incorrect (or not sufficient, or not supplied)
          * EBADSLT         → similar, but PKCS#11 device is defined and might be able to provide password, if it was plugged in which it is not
-         * ENOANO          → suitable PKCS#11 device found, but PIN is missing to unlock it
+         * ENOANO          → suitable PKCS#11/FIDO2 device found, but PIN is missing to unlock it
          * ERFKILL         → suitable PKCS#11 device found, but OK to ask for on-device interactive authentication not given
-         * EOWNERDEAD      → suitable PKCS#11 device found, but its PIN is locked
-         * ENOLCK          → suitable PKCS#11 device found, but PIN incorrect
+         * EMEDIUMTYPE     → suitable FIDO2 device found, but OK to ask for user presence not given
+         * ENOSTR          → suitable FIDO2 device found, but user didn't react to action request on token quickly enough
+         * EOWNERDEAD      → suitable PKCS#11/FIDO2 device found, but its PIN is locked
+         * ENOLCK          → suitable PKCS#11/FIDO2 device found, but PIN incorrect
          * ETOOMANYREFS    → suitable PKCS#11 device found, but PIN incorrect, and only few tries left
          * EUCLEAN         → suitable PKCS#11 device found, but PIN incorrect, and only one try left
          * EBUSY           → file system is currently active
index 46641172a421e2e5fab5243b3455f94adc95cb4d..ce8f2a461fe827e81f2669886de97f206171b4da 100644 (file)
@@ -36,6 +36,14 @@ typedef struct HomeSetup {
         uint64_t partition_size;
 } HomeSetup;
 
+typedef struct PasswordCache {
+        /* Decoding passwords from security tokens is expensive and typically requires user interaction, hence cache any we already figured out. */
+        char **pkcs11_passwords;
+        char **fido2_passwords;
+} PasswordCache;
+
+void password_cache_free(PasswordCache *cache);
+
 #define HOME_SETUP_INIT                                 \
         {                                               \
                 .root_fd = -1,                          \
@@ -46,16 +54,16 @@ typedef struct HomeSetup {
 
 int home_setup_undo(HomeSetup *setup);
 
-int home_prepare(UserRecord *h, bool already_activated, char ***pkcs11_decrypted_passwords, HomeSetup *setup, UserRecord **ret_header_home);
+int home_prepare(UserRecord *h, bool already_activated, PasswordCache *cache, HomeSetup *setup, UserRecord **ret_header_home);
 
-int home_refresh(UserRecord *h, HomeSetup *setup, UserRecord *header_home, char ***pkcs11_decrypted_passwords, struct statfs *ret_statfs, UserRecord **ret_new_home);
+int home_refresh(UserRecord *h, HomeSetup *setup, UserRecord *header_home, PasswordCache *cache, struct statfs *ret_statfs, UserRecord **ret_new_home);
 
 int home_populate(UserRecord *h, int dir_fd);
 
-int home_load_embedded_identity(UserRecord *h, int root_fd, UserRecord *header_home, UserReconcileMode mode, char ***pkcs11_decrypted_passwords, UserRecord **ret_embedded_home, UserRecord **ret_new_home);
+int home_load_embedded_identity(UserRecord *h, int root_fd, UserRecord *header_home, UserReconcileMode mode, PasswordCache *cache, UserRecord **ret_embedded_home, UserRecord **ret_new_home);
 int home_store_embedded_identity(UserRecord *h, int root_fd, uid_t uid, UserRecord *old_home);
 int home_extend_embedded_identity(UserRecord *h, UserRecord *used, HomeSetup *setup);
 
-int user_record_authenticate(UserRecord *h, UserRecord *secret, char ***pkcs11_decrypted_passwords, bool strict_verify);
+int user_record_authenticate(UserRecord *h, UserRecord *secret, PasswordCache *cache, bool strict_verify);
 
 int home_sync_and_statfs(int root_fd, struct statfs *ret);
index 2c5664aae1d9702b1b3d808921c06e6afc1503b3..797f3a3c6d0a3a9b772c493e85b65fa25a3acc02 100644 (file)
@@ -14,6 +14,7 @@ systemd_homework_sources = files('''
         homework-mount.c
         homework-mount.h
         homework-pkcs11.h
+        homework-fido2.h
         homework-quota.c
         homework-quota.h
         homework.c
@@ -25,6 +26,9 @@ systemd_homework_sources = files('''
 if conf.get('HAVE_P11KIT') == 1
         systemd_homework_sources += files('homework-pkcs11.c')
 endif
+if conf.get('HAVE_LIBFIDO2') == 1
+        systemd_homework_sources += files('homework-fido2.c')
+endif
 
 systemd_homed_sources = files('''
         home-util.c
@@ -65,6 +69,10 @@ systemd_homed_sources += [homed_gperf_c]
 homectl_sources = files('''
         home-util.c
         home-util.h
+        homectl-fido2.c
+        homectl-fido2.h
+        homectl-pkcs11.c
+        homectl-pkcs11.h
         homectl.c
         pwquality-util.c
         pwquality-util.h
index baa3586bf7a2eee79d6cf9ced4fc93e43514bcf5..2c2c7a0819c34be2f91f483cc4b82795a384f0fb 100644 (file)
@@ -6,7 +6,7 @@
 #include "sd-bus.h"
 
 #include "bus-common-errors.h"
-#include "bus-util.h"
+#include "bus-locator.h"
 #include "errno-util.h"
 #include "fd-util.h"
 #include "home-util.h"
@@ -359,7 +359,7 @@ static int handle_generic_user_record_error(
                         return PAM_AUTHTOK_ERR;
                 }
 
-                r = user_record_set_pkcs11_pin(secret, STRV_MAKE(newp), false);
+                r = user_record_set_token_pin(secret, STRV_MAKE(newp), false);
                 if (r < 0) {
                         pam_syslog(handle, LOG_ERR, "Failed to store PIN: %s", strerror_safe(r));
                         return PAM_SERVICE_ERR;
@@ -375,6 +375,21 @@ static int handle_generic_user_record_error(
                         return PAM_SERVICE_ERR;
                 }
 
+        } else if (sd_bus_error_has_name(error, BUS_ERROR_TOKEN_USER_PRESENCE_NEEDED)) {
+
+                (void) pam_prompt(handle, PAM_ERROR_MSG, NULL, "Please verify presence on security token of user %s.", user_name);
+
+                r = user_record_set_fido2_user_presence_permitted(secret, true);
+                if (r < 0) {
+                        pam_syslog(handle, LOG_ERR, "Failed to set FIDO2 user presence permitted flag: %s", strerror_safe(r));
+                        return PAM_SERVICE_ERR;
+                }
+
+        } else if (sd_bus_error_has_name(error, BUS_ERROR_TOKEN_PIN_LOCKED)) {
+
+                (void) pam_prompt(handle, PAM_ERROR_MSG, NULL, "Security token PIN is locked, please unlock it first. (Hint: Removal and re-insertion might suffice.)");
+                return PAM_SERVICE_ERR;
+
         } else if (sd_bus_error_has_name(error, BUS_ERROR_TOKEN_BAD_PIN)) {
                 _cleanup_(erase_and_freep) char *newp = NULL;
 
@@ -388,7 +403,7 @@ static int handle_generic_user_record_error(
                         return PAM_AUTHTOK_ERR;
                 }
 
-                r = user_record_set_pkcs11_pin(secret, STRV_MAKE(newp), false);
+                r = user_record_set_token_pin(secret, STRV_MAKE(newp), false);
                 if (r < 0) {
                         pam_syslog(handle, LOG_ERR, "Failed to store PIN: %s", strerror_safe(r));
                         return PAM_SERVICE_ERR;
@@ -407,7 +422,7 @@ static int handle_generic_user_record_error(
                         return PAM_AUTHTOK_ERR;
                 }
 
-                r = user_record_set_pkcs11_pin(secret, STRV_MAKE(newp), false);
+                r = user_record_set_token_pin(secret, STRV_MAKE(newp), false);
                 if (r < 0) {
                         pam_syslog(handle, LOG_ERR, "Failed to store PIN: %s", strerror_safe(r));
                         return PAM_SERVICE_ERR;
@@ -426,7 +441,7 @@ static int handle_generic_user_record_error(
                         return PAM_AUTHTOK_ERR;
                 }
 
-                r = user_record_set_pkcs11_pin(secret, STRV_MAKE(newp), false);
+                r = user_record_set_token_pin(secret, STRV_MAKE(newp), false);
                 if (r < 0) {
                         pam_syslog(handle, LOG_ERR, "Failed to store PIN: %s", strerror_safe(r));
                         return PAM_SERVICE_ERR;
@@ -499,7 +514,7 @@ static int acquire_home(
                 return r;
 
         /* Implement our own retry loop here instead of relying on the PAM client's one. That's because it
-         * might happen that the the record we stored on the host does not match the encryption password of
+         * might happen that the record we stored on the host does not match the encryption password of
          * the LUKS image in case the image was used in a different system where the password was
          * changed. In that case it will happen that the LUKS password and the host password are
          * different, and we handle that by collecting and passing multiple passwords in that case. Hence we
index 8f51f8d6e82ea40442abf1cee632814d0566bdba..5d0ac8653387de240f98b727e84efe86eff73f2c 100644 (file)
@@ -172,7 +172,7 @@ int user_record_reconcile(
          *     -REMCHG: identity records are not about the same user
          *     -ESTALE: embedded identity record is equally new or newer than supplied record
          *
-         * Return the new record to use, which is either the the embedded record updated with the host
+         * Return the new record to use, which is either the embedded record updated with the host
          * binding or the host record. In both cases the secret data is stripped. */
 
         assert(host);
@@ -887,7 +887,7 @@ int user_record_set_password(UserRecord *h, char **password, bool prepend) {
         return 0;
 }
 
-int user_record_set_pkcs11_pin(UserRecord *h, char **pin, bool prepend) {
+int user_record_set_token_pin(UserRecord *h, char **pin, bool prepend) {
         _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
         _cleanup_(strv_free_erasep) char **e = NULL;
         int r;
@@ -899,17 +899,17 @@ int user_record_set_pkcs11_pin(UserRecord *h, char **pin, bool prepend) {
                 if (!e)
                         return -ENOMEM;
 
-                r = strv_extend_strv(&e, h->pkcs11_pin, true);
+                r = strv_extend_strv(&e, h->token_pin, true);
                 if (r < 0)
                         return r;
 
                 strv_uniq(e);
 
-                if (strv_equal(h->pkcs11_pin, e))
+                if (strv_equal(h->token_pin, e))
                         return 0;
 
         } else {
-                if (strv_equal(h->pkcs11_pin, pin))
+                if (strv_equal(h->token_pin, pin))
                         return 0;
 
                 e = strv_copy(pin);
@@ -922,7 +922,7 @@ int user_record_set_pkcs11_pin(UserRecord *h, char **pin, bool prepend) {
         w = json_variant_ref(json_variant_by_key(h->json, "secret"));
 
         if (strv_isempty(e))
-                r = json_variant_filter(&w, STRV_MAKE("pkcs11Pin"));
+                r = json_variant_filter(&w, STRV_MAKE("tokenPin"));
         else {
                 _cleanup_(json_variant_unrefp) JsonVariant *l = NULL;
 
@@ -932,7 +932,7 @@ int user_record_set_pkcs11_pin(UserRecord *h, char **pin, bool prepend) {
 
                 json_variant_sensitive(l);
 
-                r = json_variant_set_field(&w, "pkcs11Pin", l);
+                r = json_variant_set_field(&w, "tokenPin", l);
         }
         if (r < 0)
                 return r;
@@ -943,7 +943,7 @@ int user_record_set_pkcs11_pin(UserRecord *h, char **pin, bool prepend) {
         if (r < 0)
                 return r;
 
-        strv_free_and_replace(h->pkcs11_pin, e);
+        strv_free_and_replace(h->token_pin, e);
 
         SET_FLAG(h->mask, USER_RECORD_SECRET, !json_variant_is_blank_object(w));
         return 0;
@@ -980,6 +980,34 @@ int user_record_set_pkcs11_protected_authentication_path_permitted(UserRecord *h
         return 0;
 }
 
+int user_record_set_fido2_user_presence_permitted(UserRecord *h, int b) {
+        _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
+        int r;
+
+        assert(h);
+
+        w = json_variant_ref(json_variant_by_key(h->json, "secret"));
+
+        if (b < 0)
+                r = json_variant_filter(&w, STRV_MAKE("fido2UserPresencePermitted"));
+        else
+                r = json_variant_set_field_boolean(&w, "fido2UserPresencePermitted", b);
+        if (r < 0)
+                return r;
+
+        if (json_variant_is_blank_object(w))
+                r = json_variant_filter(&h->json, STRV_MAKE("secret"));
+        else
+                r = json_variant_set_field(&h->json, "secret", w);
+        if (r < 0)
+                return r;
+
+        h->fido2_user_presence_permitted = b;
+
+        SET_FLAG(h->mask, USER_RECORD_SECRET, !json_variant_is_blank_object(w));
+        return 0;
+}
+
 static bool per_machine_entry_empty(JsonVariant *v) {
         const char *k;
         _unused_ JsonVariant *e;
@@ -1062,12 +1090,22 @@ int user_record_merge_secret(UserRecord *h, UserRecord *secret) {
         if (r < 0)
                 return r;
 
-        r = user_record_set_pkcs11_pin(h, secret->pkcs11_pin, true);
+        r = user_record_set_token_pin(h, secret->token_pin, true);
         if (r < 0)
                 return r;
 
         if (secret->pkcs11_protected_authentication_path_permitted >= 0) {
-                r = user_record_set_pkcs11_protected_authentication_path_permitted(h, secret->pkcs11_protected_authentication_path_permitted);
+                r = user_record_set_pkcs11_protected_authentication_path_permitted(
+                                h,
+                                secret->pkcs11_protected_authentication_path_permitted);
+                if (r < 0)
+                        return r;
+        }
+
+        if (secret->fido2_user_presence_permitted >= 0) {
+                r = user_record_set_fido2_user_presence_permitted(
+                                h,
+                                secret->fido2_user_presence_permitted);
                 if (r < 0)
                         return r;
         }
index 6afc8df19a7097c6ee036d4ead14f707788bc5f0..24582988257723b2220d59fe2a32a83bcad678a6 100644 (file)
@@ -47,8 +47,9 @@ int user_record_set_disk_size(UserRecord *h, uint64_t disk_size);
 int user_record_set_password(UserRecord *h, char **password, bool prepend);
 int user_record_make_hashed_password(UserRecord *h, char **password, bool extend);
 int user_record_set_hashed_password(UserRecord *h, char **hashed_password);
-int user_record_set_pkcs11_pin(UserRecord *h, char **pin, bool prepend);
+int user_record_set_token_pin(UserRecord *h, char **pin, bool prepend);
 int user_record_set_pkcs11_protected_authentication_path_permitted(UserRecord *h, int b);
+int user_record_set_fido2_user_presence_permitted(UserRecord *h, int b);
 int user_record_set_password_change_now(UserRecord *h, int b);
 int user_record_merge_secret(UserRecord *h, UserRecord *secret);
 int user_record_good_authentication(UserRecord *h);
index 5596846ed26cd415036fb0657916d2d67d5f9586..348d2b0429ed0d9f7410c488050712cc7eb34c07 100644 (file)
@@ -12,7 +12,7 @@
 #include "alloc-util.h"
 #include "architecture.h"
 #include "bus-error.h"
-#include "bus-util.h"
+#include "bus-map-properties.h"
 #include "hostname-util.h"
 #include "main-func.h"
 #include "pretty-print.h"
@@ -436,9 +436,7 @@ static int run(int argc, char *argv[]) {
         int r;
 
         setlocale(LC_ALL, "");
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index e694a95a0411327e422b3001904f2f59c0904356..7f6607a5270370d14bb52ad0d06606374a333e59 100644 (file)
@@ -28,6 +28,7 @@
 #include "selinux-util.h"
 #include "service-util.h"
 #include "signal-util.h"
+#include "stat-util.h"
 #include "strv.h"
 #include "user-util.h"
 #include "util.h"
 #define VALID_DEPLOYMENT_CHARS (DIGITS LETTERS "-.:")
 
 enum {
-        PROP_HOSTNAME,
+        /* Read from /etc/hostname */
         PROP_STATIC_HOSTNAME,
+
+        /* Read from /etc/machine-info */
         PROP_PRETTY_HOSTNAME,
         PROP_ICON_NAME,
         PROP_CHASSIS,
         PROP_DEPLOYMENT,
         PROP_LOCATION,
+
+        /* Read from /etc/os-release (or /usr/lib/os-release) */
         PROP_OS_PRETTY_NAME,
         PROP_OS_CPE_NAME,
-        PROP_HOME_URL,
-        _PROP_MAX
+        PROP_OS_HOME_URL,
+        _PROP_MAX,
+        _PROP_INVALID = -1,
 };
 
 typedef struct Context {
         char *data[_PROP_MAX];
+
+        struct stat etc_hostname_stat;
+        struct stat etc_os_release_stat;
+        struct stat etc_machine_info_stat;
+
         Hashmap *polkit_registry;
 } Context;
 
-static void context_reset(Context *c) {
+static void context_reset(Context *c, uint64_t mask) {
         int p;
 
         assert(c);
 
-        for (p = 0; p < _PROP_MAX; p++)
+        for (p = 0; p < _PROP_MAX; p++) {
+                if (!FLAGS_SET(mask, UINT64_C(1) << p))
+                        continue;
+
                 c->data[p] = mfree(c->data[p]);
+        }
 }
 
 static void context_destroy(Context *c) {
         assert(c);
 
-        context_reset(c);
+        context_reset(c, UINT64_MAX);
         bus_verify_polkit_async_registry_free(c->polkit_registry);
 }
 
-static int context_read_data(Context *c) {
+static void context_read_etc_hostname(Context *c) {
+        struct stat current_stat = {};
         int r;
 
         assert(c);
 
-        context_reset(c);
+        if (stat("/etc/hostname", &current_stat) >= 0 &&
+            stat_inode_unmodified(&c->etc_hostname_stat, &current_stat))
+                return;
 
-        c->data[PROP_HOSTNAME] = gethostname_malloc();
-        if (!c->data[PROP_HOSTNAME])
-                return -ENOMEM;
+        context_reset(c, UINT64_C(1) << PROP_STATIC_HOSTNAME);
 
         r = read_etc_hostname(NULL, &c->data[PROP_STATIC_HOSTNAME]);
         if (r < 0 && r != -ENOENT)
-                return r;
+                log_warning_errno(r, "Failed to read /etc/hostname, ignoring: %m");
+
+        c->etc_hostname_stat = current_stat;
+}
+
+static void context_read_machine_info(Context *c) {
+        struct stat current_stat = {};
+        int r;
+
+        assert(c);
+
+        if (stat("/etc/machine-info", &current_stat) >= 0 &&
+            stat_inode_unmodified(&c->etc_machine_info_stat, &current_stat))
+                return;
+
+        context_reset(c,
+                      (UINT64_C(1) << PROP_PRETTY_HOSTNAME) |
+                      (UINT64_C(1) << PROP_ICON_NAME) |
+                      (UINT64_C(1) << PROP_CHASSIS) |
+                      (UINT64_C(1) << PROP_DEPLOYMENT) |
+                      (UINT64_C(1) << PROP_LOCATION));
 
         r = parse_env_file(NULL, "/etc/machine-info",
                            "PRETTY_HOSTNAME", &c->data[PROP_PRETTY_HOSTNAME],
@@ -92,17 +128,36 @@ static int context_read_data(Context *c) {
                            "DEPLOYMENT", &c->data[PROP_DEPLOYMENT],
                            "LOCATION", &c->data[PROP_LOCATION]);
         if (r < 0 && r != -ENOENT)
-                return r;
+                log_warning_errno(r, "Failed to read /etc/machine-info, ignoring: %m");
+
+        c->etc_machine_info_stat = current_stat;
+}
+
+static void context_read_os_release(Context *c) {
+        struct stat current_stat = {};
+        int r;
+
+        assert(c);
+
+        if ((stat("/etc/os-release", &current_stat) >= 0 ||
+             stat("/usr/lib/os-release", &current_stat) >= 0) &&
+            stat_inode_unmodified(&c->etc_os_release_stat, &current_stat))
+                return;
+
+        context_reset(c,
+                      (UINT64_C(1) << PROP_OS_PRETTY_NAME) |
+                      (UINT64_C(1) << PROP_OS_CPE_NAME) |
+                      (UINT64_C(1) << PROP_OS_HOME_URL));
 
         r = parse_os_release(NULL,
                              "PRETTY_NAME", &c->data[PROP_OS_PRETTY_NAME],
                              "CPE_NAME", &c->data[PROP_OS_CPE_NAME],
-                             "HOME_URL", &c->data[PROP_HOME_URL],
+                             "HOME_URL", &c->data[PROP_OS_HOME_URL],
                              NULL);
         if (r < 0 && r != -ENOENT)
-                return r;
+                log_warning_errno(r, "Failed to read os-release file, ignoring: %m");
 
-        return 0;
+        c->etc_os_release_stat = current_stat;
 }
 
 static bool valid_chassis(const char *chassis) {
@@ -244,12 +299,22 @@ static bool hostname_is_useful(const char *hn) {
         return !isempty(hn) && !is_localhost(hn);
 }
 
-static int context_update_kernel_hostname(Context *c) {
-        const char *static_hn;
-        const char *hn;
+static int context_update_kernel_hostname(
+                Context *c,
+                const char *transient_hn) {
+
+        const char *static_hn, *hn;
+        struct utsname u;
 
         assert(c);
 
+        if (!transient_hn) {
+                /* If no transient hostname is passed in, then let's check what is currently set. */
+                assert_se(uname(&u) >= 0);
+                transient_hn =
+                        isempty(u.nodename) || streq(u.nodename, "(none)") ? NULL : u.nodename;
+        }
+
         static_hn = c->data[PROP_STATIC_HOSTNAME];
 
         /* /etc/hostname with something other than "localhost"
@@ -258,8 +323,8 @@ static int context_update_kernel_hostname(Context *c) {
                 hn = static_hn;
 
         /* ... the transient hostname, (ie: DHCP) comes next ... */
-        else if (!isempty(c->data[PROP_HOSTNAME]))
-                hn = c->data[PROP_HOSTNAME];
+        else if (!isempty(transient_hn))
+                hn = transient_hn;
 
         /* ... fallback to static "localhost.*" ignored above ... */
         else if (!isempty(static_hn))
@@ -278,7 +343,6 @@ static int context_update_kernel_hostname(Context *c) {
 }
 
 static int context_write_data_static_hostname(Context *c) {
-
         assert(c);
 
         if (isempty(c->data[PROP_STATIC_HOSTNAME])) {
@@ -342,6 +406,94 @@ static int context_write_data_machine_info(Context *c) {
         return write_env_file_label("/etc/machine-info", l);
 }
 
+static int property_get_hostname(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        _cleanup_free_ char *current = NULL;
+        int r;
+
+        r = gethostname_strict(&current);
+        if (r == -ENXIO)
+                return sd_bus_message_append(reply, "s", FALLBACK_HOSTNAME);
+        if (r < 0)
+                return r;
+
+        return sd_bus_message_append(reply, "s", current);
+}
+
+static int property_get_static_hostname(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        Context *c = userdata;
+        assert(c);
+
+        context_read_etc_hostname(c);
+
+        return sd_bus_message_append(reply, "s", c->data[PROP_STATIC_HOSTNAME]);
+}
+
+static int property_get_machine_info_field(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        sd_bus_slot *slot;
+        Context *c;
+
+        /* Acquire the context object without this property's userdata offset added. Explanation: we want
+         * access to two pointers here: a) the main context object we cache all properties in, and b) the
+         * pointer to the property field inside the context object that we are supposed to update and
+         * use. The latter (b) we get in the 'userdata' function parameter, and sd-bus calculates that for us
+         * from the 'userdata' pointer we supplied when the vtable was registered, with the offset we
+         * specified in the vtable added on top. To get the former (a) we need the 'userdata' pointer from
+         * the vtable registration directly, without the offset added. Hence we ask sd-bus what the slot
+         * object is (which encapsulates the vtable registration), and then query the 'userdata' field
+         * directly off it. */
+        assert_se(slot = sd_bus_get_current_slot(bus));
+        assert_se(c = sd_bus_slot_get_userdata(slot));
+
+        context_read_machine_info(c);
+
+        return sd_bus_message_append(reply, "s", *(char**) userdata);
+}
+
+static int property_get_os_release_field(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        sd_bus_slot *slot;
+        Context *c;
+
+        /* As above, acquire the current context without this property's userdata offset added. */
+        assert_se(slot = sd_bus_get_current_slot(bus));
+        assert_se(c = sd_bus_slot_get_userdata(slot));
+
+        context_read_os_release(c);
+
+        return sd_bus_message_append(reply, "s", *(char**) userdata);
+}
+
 static int property_get_icon_name(
                 sd_bus *bus,
                 const char *path,
@@ -355,6 +507,8 @@ static int property_get_icon_name(
         Context *c = userdata;
         const char *name;
 
+        context_read_machine_info(c);
+
         if (isempty(c->data[PROP_ICON_NAME]))
                 name = n = context_fallback_icon_name(c);
         else
@@ -378,6 +532,8 @@ static int property_get_chassis(
         Context *c = userdata;
         const char *name;
 
+        context_read_machine_info(c);
+
         if (isempty(c->data[PROP_CHASSIS]))
                 name = fallback_chassis();
         else
@@ -405,8 +561,8 @@ static int property_get_uname_field(
 static int method_set_hostname(sd_bus_message *m, void *userdata, sd_bus_error *error) {
         Context *c = userdata;
         const char *name;
-        int interactive;
-        int r;
+        int interactive, r;
+        struct utsname u;
 
         assert(m);
         assert(c);
@@ -415,6 +571,8 @@ static int method_set_hostname(sd_bus_message *m, void *userdata, sd_bus_error *
         if (r < 0)
                 return r;
 
+        context_read_etc_hostname(c);
+
         if (isempty(name))
                 name = c->data[PROP_STATIC_HOSTNAME];
 
@@ -424,7 +582,8 @@ static int method_set_hostname(sd_bus_message *m, void *userdata, sd_bus_error *
         if (!hostname_is_valid(name, false))
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid hostname '%s'", name);
 
-        if (streq_ptr(name, c->data[PROP_HOSTNAME]))
+        assert_se(uname(&u) >= 0);
+        if (streq_ptr(name, u.nodename))
                 return sd_bus_reply_method_return(m, NULL);
 
         r = bus_verify_polkit_async(
@@ -441,17 +600,13 @@ static int method_set_hostname(sd_bus_message *m, void *userdata, sd_bus_error *
         if (r == 0)
                 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
 
-        r = free_and_strdup(&c->data[PROP_HOSTNAME], name);
-        if (r < 0)
-                return r;
-
-        r = context_update_kernel_hostname(c);
+        r = context_update_kernel_hostname(c, name);
         if (r < 0) {
                 log_error_errno(r, "Failed to set hostname: %m");
                 return sd_bus_error_set_errnof(error, r, "Failed to set hostname: %m");
         }
 
-        log_info("Changed hostname to '%s'", strna(c->data[PROP_HOSTNAME]));
+        log_info("Changed hostname to '%s'", name);
 
         (void) sd_bus_emit_properties_changed(sd_bus_message_get_bus(m), "/org/freedesktop/hostname1", "org.freedesktop.hostname1", "Hostname", NULL);
 
@@ -473,6 +628,8 @@ static int method_set_static_hostname(sd_bus_message *m, void *userdata, sd_bus_
 
         name = empty_to_null(name);
 
+        context_read_etc_hostname(c);
+
         if (streq_ptr(name, c->data[PROP_STATIC_HOSTNAME]))
                 return sd_bus_reply_method_return(m, NULL);
 
@@ -497,7 +654,7 @@ static int method_set_static_hostname(sd_bus_message *m, void *userdata, sd_bus_
         if (r < 0)
                 return r;
 
-        r = context_update_kernel_hostname(c);
+        r = context_update_kernel_hostname(c, NULL);
         if (r < 0) {
                 log_error_errno(r, "Failed to set hostname: %m");
                 return sd_bus_error_set_errnof(error, r, "Failed to set hostname: %m");
@@ -530,6 +687,8 @@ static int set_machine_info(Context *c, sd_bus_message *m, int prop, sd_bus_mess
 
         name = empty_to_null(name);
 
+        context_read_machine_info(c);
+
         if (streq_ptr(name, c->data[prop]))
                 return sd_bus_reply_method_return(m, NULL);
 
@@ -671,19 +830,19 @@ static int method_get_product_uuid(sd_bus_message *m, void *userdata, sd_bus_err
 
 static const sd_bus_vtable hostname_vtable[] = {
         SD_BUS_VTABLE_START(0),
-        SD_BUS_PROPERTY("Hostname", "s", NULL, offsetof(Context, data) + sizeof(char*) * PROP_HOSTNAME, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
-        SD_BUS_PROPERTY("StaticHostname", "s", NULL, offsetof(Context, data) + sizeof(char*) * PROP_STATIC_HOSTNAME, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
-        SD_BUS_PROPERTY("PrettyHostname", "s", NULL, offsetof(Context, data) + sizeof(char*) * PROP_PRETTY_HOSTNAME, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("Hostname", "s", property_get_hostname, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("StaticHostname", "s", property_get_static_hostname, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("PrettyHostname", "s", property_get_machine_info_field, offsetof(Context, data) + sizeof(char*) * PROP_PRETTY_HOSTNAME, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("IconName", "s", property_get_icon_name, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("Chassis", "s", property_get_chassis, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
-        SD_BUS_PROPERTY("Deployment", "s", NULL, offsetof(Context, data) + sizeof(char*) * PROP_DEPLOYMENT, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
-        SD_BUS_PROPERTY("Location", "s", NULL, offsetof(Context, data) + sizeof(char*) * PROP_LOCATION, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("Deployment", "s", property_get_machine_info_field, offsetof(Context, data) + sizeof(char*) * PROP_DEPLOYMENT, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("Location", "s", property_get_machine_info_field, offsetof(Context, data) + sizeof(char*) * PROP_LOCATION, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("KernelName", "s", property_get_uname_field, offsetof(struct utsname, sysname), SD_BUS_VTABLE_ABSOLUTE_OFFSET|SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("KernelRelease", "s", property_get_uname_field, offsetof(struct utsname, release), SD_BUS_VTABLE_ABSOLUTE_OFFSET|SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("KernelVersion", "s", property_get_uname_field, offsetof(struct utsname, version), SD_BUS_VTABLE_ABSOLUTE_OFFSET|SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("OperatingSystemPrettyName", "s", NULL, offsetof(Context, data) + sizeof(char*) * PROP_OS_PRETTY_NAME, SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("OperatingSystemCPEName", "s", NULL, offsetof(Context, data) + sizeof(char*) * PROP_OS_CPE_NAME, SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("HomeURL", "s", NULL, offsetof(Context, data) + sizeof(char*) * PROP_HOME_URL, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("OperatingSystemPrettyName", "s", property_get_os_release_field, offsetof(Context, data) + sizeof(char*) * PROP_OS_PRETTY_NAME, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("OperatingSystemCPEName", "s", property_get_os_release_field, offsetof(Context, data) + sizeof(char*) * PROP_OS_CPE_NAME, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("HomeURL", "s", property_get_os_release_field, offsetof(Context, data) + sizeof(char*) * PROP_OS_HOME_URL, SD_BUS_VTABLE_PROPERTY_CONST),
 
         SD_BUS_METHOD_WITH_NAMES("SetHostname",
                                  "sb",
@@ -801,7 +960,10 @@ static int run(int argc, char *argv[]) {
                 return r;
 
         umask(0022);
-        mac_selinux_init();
+
+        r = mac_selinux_init();
+        if (r < 0)
+                return r;
 
         assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
 
@@ -823,10 +985,6 @@ static int run(int argc, char *argv[]) {
         if (r < 0)
                 return r;
 
-        r = context_read_data(&context);
-        if (r < 0)
-                return log_error_errno(r, "Failed to read hostname and machine information: %m");
-
         r = bus_event_loop_with_idle(event, bus, "org.freedesktop.hostname1", DEFAULT_EXIT_USEC, NULL, NULL);
         if (r < 0)
                 return log_error_errno(r, "Failed to run event loop: %m");
index 651647b3f0dd95972187c549710258f6da2317bb..eb038a8b55ea8d833b4b5b6dd6cbee78d927f9fd 100644 (file)
@@ -125,7 +125,9 @@ static int run(int argc, char *argv[]) {
         if (r <= 0)
                 return r;
 
-        mac_selinux_init();
+        r = mac_selinux_init();
+        if (r < 0)
+                return r;
 
         return hwdb_main(argc, argv);
 }
index 19435f80fea40726960b69848872e6dff57741fa..236043bf8a4c06c7aec0f2bc1405cc0977fb8f47 100644 (file)
@@ -139,7 +139,7 @@ static int verb_show(int argc, char **argv, void *userdata) {
         if (table) {
                 r = table_print(table, NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to print table: %m");
+                        return table_log_print_error(r);
         }
 
         return 0;
@@ -249,9 +249,7 @@ static int id128_main(int argc, char *argv[]) {
 static int run(int argc, char *argv[]) {
         int r;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index d799a10f94b24d3f931ab7ae19ed9e1b0fe7332e..038dd3a6c6187b15c2d5f3337e8ac8bbc9009c2e 100644 (file)
@@ -7,8 +7,8 @@
 
 #include "alloc-util.h"
 #include "bus-common-errors.h"
+#include "bus-get-properties.h"
 #include "bus-log-control-api.h"
-#include "bus-util.h"
 #include "bus-polkit.h"
 #include "def.h"
 #include "fd-util.h"
@@ -22,8 +22,8 @@
 #include "parse-util.h"
 #include "path-util.h"
 #include "process-util.h"
-#include "signal-util.h"
 #include "service-util.h"
+#include "signal-util.h"
 #include "socket-util.h"
 #include "stat-util.h"
 #include "string-table.h"
index 7505512fe7e4f5a5f1185545d2f7005ebab2b88f..7eee197665f2eef51b657b269404b3b911611ae5 100644 (file)
 #include "alloc-util.h"
 #include "bus-error.h"
 #include "bus-util.h"
+#include "daemon-util.h"
 #include "def.h"
 #include "fd-util.h"
 #include "format-util.h"
 #include "initreq.h"
 #include "list.h"
 #include "log.h"
+#include "main-func.h"
 #include "memory-util.h"
 #include "process-util.h"
 #include "special.h"
@@ -68,11 +70,9 @@ static const char *translate_runlevel(int runlevel, bool *isolate) {
                 { '6', SPECIAL_REBOOT_TARGET,     false },
         };
 
-        unsigned i;
-
         assert(isolate);
 
-        for (i = 0; i < ELEMENTSOF(table); i++)
+        for (size_t i = 0; i < ELEMENTSOF(table); i++)
                 if (table[i].runlevel == runlevel) {
                         *isolate = table[i].isolate;
                         if (runlevel == '6' && kexec_loaded())
@@ -228,6 +228,7 @@ static void fifo_free(Fifo *f) {
 
         free(f);
 }
+DEFINE_TRIVIAL_CLEANUP_FUNC(Fifo*, fifo_free);
 
 static void server_done(Server *s) {
         assert(s);
@@ -241,79 +242,49 @@ static void server_done(Server *s) {
 
 static int server_init(Server *s, unsigned n_sockets) {
         int r;
-        unsigned i;
+
+        /* This function will leave s partially initialized on failure. Caller needs to clean up. */
 
         assert(s);
         assert(n_sockets > 0);
 
-        *s = (struct Server) {
-                .epoll_fd = epoll_create1(EPOLL_CLOEXEC),
-        };
-
-        if (s->epoll_fd < 0) {
-                r = log_error_errno(errno,
-                                    "Failed to create epoll object: %m");
-                goto fail;
-        }
-
-        for (i = 0; i < n_sockets; i++) {
-                Fifo *f;
-                int fd;
+        s->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
+        if (s->epoll_fd < 0)
+                return log_error_errno(errno, "Failed to create epoll object: %m");
 
-                fd = SD_LISTEN_FDS_START+i;
+        for (unsigned i = 0; i < n_sockets; i++) {
+                _cleanup_(fifo_freep) Fifo *f = NULL;
+                int fd = SD_LISTEN_FDS_START + i;
 
                 r = sd_is_fifo(fd, NULL);
-                if (r < 0) {
-                        log_error_errno(r, "Failed to determine file descriptor type: %m");
-                        goto fail;
-                }
-
-                if (!r) {
-                        log_error("Wrong file descriptor type.");
-                        r = -EINVAL;
-                        goto fail;
-                }
+                if (r < 0)
+                        return log_error_errno(r, "Failed to determine file descriptor type: %m");
+                if (!r)
+                        return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Wrong file descriptor type.");
 
                 f = new0(Fifo, 1);
-                if (!f) {
-                        r = -ENOMEM;
-                        log_error_errno(errno, "Failed to create fifo object: %m");
-                        goto fail;
-                }
-
-                f->fd = -1;
+                if (!f)
+                        return log_oom();
 
                 struct epoll_event ev = {
                         .events = EPOLLIN,
                         .data.ptr = f,
                 };
 
-                if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0) {
-                        r = -errno;
-                        fifo_free(f);
-                        log_error_errno(errno, "Failed to add fifo fd to epoll object: %m");
-                        goto fail;
-                }
+                if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0)
+                        return log_error_errno(errno, "Failed to add fifo fd to epoll object: %m");
 
                 f->fd = fd;
-                LIST_PREPEND(fifo, s->fifos, f);
                 f->server = s;
+                LIST_PREPEND(fifo, s->fifos, TAKE_PTR(f));
                 s->n_fifos++;
         }
 
         r = bus_connect_system_systemd(&s->bus);
-        if (r < 0) {
-                log_error_errno(r, "Failed to get D-Bus connection: %m");
-                r = -EIO;
-                goto fail;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Failed to get D-Bus connection: %m");
 
         return 0;
-
-fail:
-        server_done(s);
-
-        return r;
 }
 
 static int process_event(Server *s, struct epoll_event *ev) {
@@ -337,43 +308,33 @@ static int process_event(Server *s, struct epoll_event *ev) {
         return 0;
 }
 
-int main(int argc, char *argv[]) {
-        Server server;
-        int r = EXIT_FAILURE, n;
-
-        if (getppid() != 1) {
-                log_error("This program should be invoked by init only.");
-                return EXIT_FAILURE;
-        }
+static int run(int argc, char *argv[]) {
+        _cleanup_(server_done) Server server = { .epoll_fd = -1 };
+        _cleanup_(notify_on_cleanup) const char *notify_stop = NULL;
+        int r, n;
 
-        if (argc > 1) {
-                log_error("This program does not take arguments.");
-                return EXIT_FAILURE;
-        }
+        if (argc > 1)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+                                       "This program does not take arguments.");
 
         log_setup_service();
 
         umask(0022);
 
         n = sd_listen_fds(true);
-        if (n < 0) {
-                log_error_errno(r, "Failed to read listening file descriptors from environment: %m");
-                return EXIT_FAILURE;
-        }
-
-        if (n <= 0 || n > SERVER_FD_MAX) {
-                log_error("No or too many file descriptors passed.");
-                return EXIT_FAILURE;
-        }
+        if (n < 0)
+                return log_error_errno(errno,
+                                       "Failed to read listening file descriptors from environment: %m");
 
-        if (server_init(&server, (unsigned) n) < 0)
-                return EXIT_FAILURE;
+        if (n <= 0 || n > SERVER_FD_MAX)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+                                       "No or too many file descriptors passed.");
 
-        log_debug("systemd-initctl running as pid "PID_FMT, getpid_cached());
+        r = server_init(&server, (unsigned) n);
+        if (r < 0)
+                return r;
 
-        sd_notify(false,
-                  "READY=1\n"
-                  "STATUS=Processing requests...");
+        notify_stop = notify_start(NOTIFY_READY, NOTIFY_STOPPING);
 
         while (!server.quit) {
                 struct epoll_event event;
@@ -383,27 +344,17 @@ int main(int argc, char *argv[]) {
                 if (k < 0) {
                         if (errno == EINTR)
                                 continue;
-                        log_error_errno(errno, "epoll_wait() failed: %m");
-                        goto fail;
+                        return log_error_errno(errno, "epoll_wait() failed: %m");
                 }
-
-                if (k <= 0)
+                if (k == 0)
                         break;
 
-                if (process_event(&server, &event) < 0)
-                        goto fail;
+                r = process_event(&server, &event);
+                if (r < 0)
+                        return r;
         }
 
-        r = EXIT_SUCCESS;
-
-        log_debug("systemd-initctl stopped as pid "PID_FMT, getpid_cached());
-
-fail:
-        sd_notify(false,
-                  "STOPPING=1\n"
-                  "STATUS=Shutting down...");
-
-        server_done(&server);
-
-        return r;
+        return 0;
 }
+
+DEFINE_MAIN_FUNCTION(run);
index 5177e0d15779af82151c9135f44699275686d928..3ab7c98b0b55ed95a0ae95056fb54a13375e59d6 100644 (file)
@@ -349,7 +349,7 @@ static int request_parse_range(
         return 0;
 }
 
-static int request_parse_arguments_iterator(
+static mhd_result request_parse_arguments_iterator(
                 void *cls,
                 enum MHD_ValueKind kind,
                 const char *key,
@@ -796,7 +796,7 @@ static int request_handler_machine(
         return MHD_queue_response(connection, MHD_HTTP_OK, response);
 }
 
-static int request_handler(
+static mhd_result request_handler(
                 void *cls,
                 struct MHD_Connection *connection,
                 const char *url,
index 948b2d2fce60583117021410966d2859aec6a782..273fdf9196ec0417e77e4ed7c0fed3ec9c3636cd 100644 (file)
@@ -253,7 +253,7 @@ static int process_http_upload(
         return mhd_respond(connection, MHD_HTTP_ACCEPTED, "OK.");
 };
 
-static int request_handler(
+static mhd_result request_handler(
                 void *cls,
                 struct MHD_Connection *connection,
                 const char *url,
@@ -1104,13 +1104,13 @@ static int load_certificates(char **key, char **cert, char **trust) {
 }
 
 static int run(int argc, char **argv) {
-        _cleanup_(notify_on_cleanup) const char *notify_message = NULL;
         _cleanup_(journal_remote_server_destroy) RemoteServer s = {};
+        _cleanup_(notify_on_cleanup) const char *notify_message = NULL;
         _cleanup_free_ char *key = NULL, *cert = NULL, *trust = NULL;
         int r;
 
         log_show_color(true);
-        log_parse_environment();
+        log_parse_environment_cli();
 
         /* The journal merging logic potentially needs a lot of fds. */
         (void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
index bd58fdbcdfb7f0ee3263998513776b93a3c1b290..13ca90f957f6c4eb3812a423aaf1866a6a5a27e9 100644 (file)
@@ -815,13 +815,13 @@ static int open_journal(sd_journal **j) {
 }
 
 static int run(int argc, char **argv) {
-        _cleanup_(notify_on_cleanup) const char *notify_message = NULL;
         _cleanup_(destroy_uploader) Uploader u = {};
+        _cleanup_(notify_on_cleanup) const char *notify_message = NULL;
         bool use_journal;
         int r;
 
         log_show_color(true);
-        log_parse_environment();
+        log_parse_environment_cli();
 
         /* The journal merging logic potentially needs a lot of fds. */
         (void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
index d90c6bbd4f1b19538c4d1cde03f935c6d48e3528..4ca9a5c4f16976775cdc0dccc804c8fd7b5d91a3 100644 (file)
 #  define MHD_create_response_from_fd_at_offset64 MHD_create_response_from_fd_at_offset
 #endif
 
+#if MHD_VERSION >= 0x00097002
+#  define mhd_result enum MHD_Result
+#else
+#  define mhd_result int
+#endif
+
 void microhttpd_logger(void *arg, const char *fmt, va_list ap) _printf_(2, 0);
 
 /* respond_oom() must be usable with return, hence this form. */
index 500b6745050f25b7b5524200bd0737d667c61c16..2faaa2e28488d77149b78942125ee0f8a6f3a4ad 100644 (file)
@@ -129,9 +129,7 @@ static int run(int argc, char *argv[]) {
         _cleanup_close_ int outfd = -1, errfd = -1, saved_stderr = -1;
         int r;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 2bbfc7644aed53c58d8d57bda085de47f5b03c33..e6ce64fc6529efafa2c9717c92b94f83d879be37 100644 (file)
@@ -57,8 +57,11 @@ static int zstd_ret_to_errno(size_t ret) {
 #define ALIGN_8(l) ALIGN_TO(l, sizeof(size_t))
 
 static const char* const object_compressed_table[_OBJECT_COMPRESSED_MAX] = {
-        [OBJECT_COMPRESSED_XZ] = "XZ",
-        [OBJECT_COMPRESSED_LZ4] = "LZ4",
+        [OBJECT_COMPRESSED_XZ]   = "XZ",
+        [OBJECT_COMPRESSED_LZ4]  = "LZ4",
+        [OBJECT_COMPRESSED_ZSTD] = "ZSTD",
+        /* If we add too many more entries here, it's going to grow quite large (and be mostly sparse), since
+         * the array key is actually a bitmask, not a plain enum */
 };
 
 DEFINE_STRING_TABLE_LOOKUP(object_compressed, int);
@@ -131,6 +134,29 @@ int compress_blob_lz4(const void *src, uint64_t src_size,
 #endif
 }
 
+int compress_blob_zstd(
+                const void *src, uint64_t src_size,
+                void *dst, size_t dst_alloc_size, size_t *dst_size) {
+#if HAVE_ZSTD
+        size_t k;
+
+        assert(src);
+        assert(src_size > 0);
+        assert(dst);
+        assert(dst_alloc_size > 0);
+        assert(dst_size);
+
+        k = ZSTD_compress(dst, dst_alloc_size, src, src_size, 0);
+        if (ZSTD_isError(k))
+                return zstd_ret_to_errno(k);
+
+        *dst_size = k;
+        return 0;
+#else
+        return -EPROTONOSUPPORT;
+#endif
+}
+
 int decompress_blob_xz(const void *src, uint64_t src_size,
                        void **dst, size_t *dst_alloc_size, size_t* dst_size, size_t dst_max) {
 
@@ -231,15 +257,74 @@ int decompress_blob_lz4(const void *src, uint64_t src_size,
 #endif
 }
 
-int decompress_blob(int compression,
-                    const void *src, uint64_t src_size,
-                    void **dst, size_t *dst_alloc_size, size_t* dst_size, size_t dst_max) {
+int decompress_blob_zstd(
+                const void *src, uint64_t src_size,
+                void **dst, size_t *dst_alloc_size, size_t* dst_size, size_t dst_max) {
+
+#if HAVE_ZSTD
+        size_t space;
+
+        assert(src);
+        assert(src_size > 0);
+        assert(dst);
+        assert(dst_alloc_size);
+        assert(dst_size);
+        assert(*dst_alloc_size == 0 || *dst);
+
+        if (src_size > SIZE_MAX/2) /* Overflow? */
+                return -ENOBUFS;
+        space = src_size * 2;
+        if (dst_max > 0 && space > dst_max)
+                space = dst_max;
+
+        if (!greedy_realloc(dst, dst_alloc_size, space, 1))
+                return -ENOMEM;
+
+        for (;;) {
+                size_t k;
+
+                k = ZSTD_decompress(*dst, *dst_alloc_size, src, src_size);
+                if (!ZSTD_isError(k)) {
+                        *dst_size = k;
+                        return 0;
+                }
+                if (ZSTD_getErrorCode(k) != ZSTD_error_dstSize_tooSmall)
+                        return zstd_ret_to_errno(k);
+
+                if (dst_max > 0 && space >= dst_max) /* Already at max? */
+                        return -ENOBUFS;
+                if (space > SIZE_MAX / 2) /* Overflow? */
+                        return -ENOBUFS;
+
+                space *= 2;
+                if (dst_max > 0 && space > dst_max)
+                        space = dst_max;
+
+                if (!greedy_realloc(dst, dst_alloc_size, space, 1))
+                        return -ENOMEM;
+        }
+#else
+        return -EPROTONOSUPPORT;
+#endif
+}
+
+int decompress_blob(
+                int compression,
+                const void *src, uint64_t src_size,
+                void **dst, size_t *dst_alloc_size, size_t* dst_size, size_t dst_max) {
+
         if (compression == OBJECT_COMPRESSED_XZ)
-                return decompress_blob_xz(src, src_size,
-                                          dst, dst_alloc_size, dst_size, dst_max);
+                return decompress_blob_xz(
+                                src, src_size,
+                                dst, dst_alloc_size, dst_size, dst_max);
         else if (compression == OBJECT_COMPRESSED_LZ4)
-                return decompress_blob_lz4(src, src_size,
-                                           dst, dst_alloc_size, dst_size, dst_max);
+                return decompress_blob_lz4(
+                                src, src_size,
+                                dst, dst_alloc_size, dst_size, dst_max);
+        else if (compression == OBJECT_COMPRESSED_ZSTD)
+                return decompress_blob_zstd(
+                                src, src_size,
+                                dst, dst_alloc_size, dst_size, dst_max);
         else
                 return -EBADMSG;
 }
@@ -365,21 +450,92 @@ int decompress_startswith_lz4(const void *src, uint64_t src_size,
 #endif
 }
 
-int decompress_startswith(int compression,
-                          const void *src, uint64_t src_size,
-                          void **buffer, size_t *buffer_size,
-                          const void *prefix, size_t prefix_len,
-                          uint8_t extra) {
+int decompress_startswith_zstd(
+                const void *src, uint64_t src_size,
+                void **buffer, size_t *buffer_size,
+                const void *prefix, size_t prefix_len,
+                uint8_t extra) {
+#if HAVE_ZSTD
+        _cleanup_(ZSTD_freeDCtxp) ZSTD_DCtx *dctx = NULL;
+        size_t k;
+
+        assert(src);
+        assert(src_size > 0);
+        assert(buffer);
+        assert(buffer_size);
+        assert(prefix);
+        assert(*buffer_size == 0 || *buffer);
+
+        dctx = ZSTD_createDCtx();
+        if (!dctx)
+                return -ENOMEM;
+
+        if (!(greedy_realloc(buffer, buffer_size, MAX(ZSTD_DStreamOutSize(), prefix_len + 1), 1)))
+                return -ENOMEM;
+
+        ZSTD_inBuffer input = {
+                .src = src,
+                .size = src_size,
+        };
+        ZSTD_outBuffer output = {
+                .dst = *buffer,
+                .size = *buffer_size,
+        };
+
+        for (;;) {
+                k = ZSTD_decompressStream(dctx, &output, &input);
+                if (ZSTD_isError(k)) {
+                        log_debug("ZSTD decoder failed: %s", ZSTD_getErrorName(k));
+                        return zstd_ret_to_errno(k);
+                }
+
+                if (output.pos >= prefix_len + 1)
+                        return memcmp(*buffer, prefix, prefix_len) == 0 &&
+                                      ((const uint8_t*) *buffer)[prefix_len] == extra;
+
+                if (input.pos >= input.size)
+                        return 0;
+
+                if (*buffer_size > SIZE_MAX/2)
+                        return -ENOBUFS;
+
+                if (!(greedy_realloc(buffer, buffer_size, *buffer_size * 2, 1)))
+                        return -ENOMEM;
+
+                output.dst = *buffer;
+                output.size = *buffer_size;
+        }
+#else
+        return -EPROTONOSUPPORT;
+#endif
+}
+
+int decompress_startswith(
+                int compression,
+                const void *src, uint64_t src_size,
+                void **buffer, size_t *buffer_size,
+                const void *prefix, size_t prefix_len,
+                uint8_t extra) {
+
         if (compression == OBJECT_COMPRESSED_XZ)
-                return decompress_startswith_xz(src, src_size,
-                                                buffer, buffer_size,
-                                                prefix, prefix_len,
-                                                extra);
+                return decompress_startswith_xz(
+                                src, src_size,
+                                buffer, buffer_size,
+                                prefix, prefix_len,
+                                extra);
+
         else if (compression == OBJECT_COMPRESSED_LZ4)
-                return decompress_startswith_lz4(src, src_size,
-                                                 buffer, buffer_size,
-                                                 prefix, prefix_len,
-                                                 extra);
+                return decompress_startswith_lz4(
+                                src, src_size,
+                                buffer, buffer_size,
+                                prefix, prefix_len,
+                                extra);
+        else if (compression == OBJECT_COMPRESSED_ZSTD)
+                return decompress_startswith_zstd(
+                                src, src_size,
+                                buffer, buffer_size,
+                                prefix, prefix_len,
+                                extra);
         else
                 return -EBADMSG;
 }
@@ -696,8 +852,6 @@ int compress_stream_zstd(int fdf, int fdt, uint64_t max_bytes) {
         size_t in_allocsize, out_allocsize;
         size_t z;
         uint64_t left = max_bytes, in_bytes = 0;
-        /* This can be used in the future to add uncompressed size to the header */
-        uint64_t in_totalsize = 0;
 
         assert(fdf >= 0);
         assert(fdt >= 0);
@@ -711,11 +865,6 @@ int compress_stream_zstd(int fdf, int fdt, uint64_t max_bytes) {
         if (!cctx || !out_buff || !in_buff)
                 return -ENOMEM;
 
-        if (in_totalsize) {
-                z = ZSTD_CCtx_setPledgedSrcSize(cctx, in_totalsize);
-                if (z)
-                        log_debug("Failed to enable ZSTD input size, ignoring: %s", ZSTD_getErrorName(z));
-        }
         z = ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1);
         if (ZSTD_isError(z))
                 log_debug("Failed to enable ZSTD checksum, ignoring: %s", ZSTD_getErrorName(z));
index 74ef592f4374d8e74385af34d119f3fa657e0eba..ab44ff06ede87fee8a568d27610813e17d94d44f 100644 (file)
@@ -12,18 +12,26 @@ int compress_blob_xz(const void *src, uint64_t src_size,
                      void *dst, size_t dst_alloc_size, size_t *dst_size);
 int compress_blob_lz4(const void *src, uint64_t src_size,
                       void *dst, size_t dst_alloc_size, size_t *dst_size);
+int compress_blob_zstd(const void *src, uint64_t src_size,
+                       void *dst, size_t dst_alloc_size, size_t *dst_size);
 
 static inline int compress_blob(const void *src, uint64_t src_size,
                                 void *dst, size_t dst_alloc_size, size_t *dst_size) {
         int r;
-#if HAVE_LZ4
+#if HAVE_ZSTD
+        r = compress_blob_zstd(src, src_size, dst, dst_alloc_size, dst_size);
+        if (r == 0)
+                return OBJECT_COMPRESSED_ZSTD;
+#elif HAVE_LZ4
         r = compress_blob_lz4(src, src_size, dst, dst_alloc_size, dst_size);
         if (r == 0)
                 return OBJECT_COMPRESSED_LZ4;
-#else
+#elif HAVE_XZ
         r = compress_blob_xz(src, src_size, dst, dst_alloc_size, dst_size);
         if (r == 0)
                 return OBJECT_COMPRESSED_XZ;
+#else
+        r = -EOPNOTSUPP;
 #endif
         return r;
 }
@@ -32,6 +40,8 @@ int decompress_blob_xz(const void *src, uint64_t src_size,
                        void **dst, size_t *dst_alloc_size, size_t* dst_size, size_t dst_max);
 int decompress_blob_lz4(const void *src, uint64_t src_size,
                         void **dst, size_t *dst_alloc_size, size_t* dst_size, size_t dst_max);
+int decompress_blob_zstd(const void *src, uint64_t src_size,
+                        void **dst, size_t *dst_alloc_size, size_t* dst_size, size_t dst_max);
 int decompress_blob(int compression,
                     const void *src, uint64_t src_size,
                     void **dst, size_t *dst_alloc_size, size_t* dst_size, size_t dst_max);
@@ -44,6 +54,10 @@ int decompress_startswith_lz4(const void *src, uint64_t src_size,
                               void **buffer, size_t *buffer_size,
                               const void *prefix, size_t prefix_len,
                               uint8_t extra);
+int decompress_startswith_zstd(const void *src, uint64_t src_size,
+                               void **buffer, size_t *buffer_size,
+                               const void *prefix, size_t prefix_len,
+                               uint8_t extra);
 int decompress_startswith(int compression,
                           const void *src, uint64_t src_size,
                           void **buffer, size_t *buffer_size,
@@ -64,9 +78,14 @@ int decompress_stream_zstd(int fdf, int fdt, uint64_t max_size);
 #elif HAVE_LZ4
 #  define compress_stream compress_stream_lz4
 #  define COMPRESSED_EXT ".lz4"
-#else
+#elif HAVE_XZ
 #  define compress_stream compress_stream_xz
 #  define COMPRESSED_EXT ".xz"
+#else
+static inline int compress_stream(int fdf, int fdt, uint64_t max_size) {
+        return -EOPNOTSUPP;
+}
+#  define COMPRESSED_EXT ""
 #endif
 
 int decompress_stream(const char *filename, int fdf, int fdt, uint64_t max_bytes);
index ff4e71a31ba44fef6891a2a304cdf7db8101867d..e9ddbb9dabbe8f364c14b31d8ce21076f393ce14 100644 (file)
@@ -9,7 +9,7 @@
 /*
  * If you change this file you probably should also change its documentation:
  *
- * http://www.freedesktop.org/wiki/Software/systemd/journal-files
+ * https://systemd.io/JOURNAL_FILE_FORMAT
  */
 
 typedef struct Header Header;
@@ -44,13 +44,13 @@ typedef enum ObjectType {
 
 /* Object flags */
 enum {
-        OBJECT_COMPRESSED_XZ = 1 << 0,
-        OBJECT_COMPRESSED_LZ4 = 1 << 1,
-        _OBJECT_COMPRESSED_MAX
+        OBJECT_COMPRESSED_XZ   = 1 << 0,
+        OBJECT_COMPRESSED_LZ4  = 1 << 1,
+        OBJECT_COMPRESSED_ZSTD = 1 << 2,
+        OBJECT_COMPRESSION_MASK = (OBJECT_COMPRESSED_XZ | OBJECT_COMPRESSED_LZ4 | OBJECT_COMPRESSED_ZSTD),
+        _OBJECT_COMPRESSED_MAX = OBJECT_COMPRESSION_MASK,
 };
 
-#define OBJECT_COMPRESSION_MASK (OBJECT_COMPRESSED_XZ | OBJECT_COMPRESSED_LZ4)
-
 struct ObjectHeader {
         uint8_t type;
         uint8_t flags;
@@ -74,13 +74,17 @@ struct DataObject DataObject__contents;
 struct DataObject__packed DataObject__contents _packed_;
 assert_cc(sizeof(struct DataObject) == sizeof(struct DataObject__packed));
 
-struct FieldObject {
-        ObjectHeader object;
-        le64_t hash;
-        le64_t next_hash_offset;
-        le64_t head_data_offset;
-        uint8_t payload[];
-} _packed_;
+#define FieldObject__contents {                 \
+        ObjectHeader object;                    \
+        le64_t hash;                            \
+        le64_t next_hash_offset;                \
+        le64_t head_data_offset;                \
+        uint8_t payload[];                      \
+}
+
+struct FieldObject FieldObject__contents;
+struct FieldObject__packed FieldObject__contents _packed_;
+assert_cc(sizeof(struct FieldObject) == sizeof(struct FieldObject__packed));
 
 struct EntryItem {
         le64_t object_offset;
@@ -145,24 +149,38 @@ enum {
 
 /* Header flags */
 enum {
-        HEADER_INCOMPATIBLE_COMPRESSED_XZ = 1 << 0,
-        HEADER_INCOMPATIBLE_COMPRESSED_LZ4 = 1 << 1,
+        HEADER_INCOMPATIBLE_COMPRESSED_XZ   = 1 << 0,
+        HEADER_INCOMPATIBLE_COMPRESSED_LZ4  = 1 << 1,
+        HEADER_INCOMPATIBLE_KEYED_HASH      = 1 << 2,
+        HEADER_INCOMPATIBLE_COMPRESSED_ZSTD = 1 << 3,
 };
 
-#define HEADER_INCOMPATIBLE_ANY (HEADER_INCOMPATIBLE_COMPRESSED_XZ|HEADER_INCOMPATIBLE_COMPRESSED_LZ4)
+#define HEADER_INCOMPATIBLE_ANY               \
+        (HEADER_INCOMPATIBLE_COMPRESSED_XZ |  \
+         HEADER_INCOMPATIBLE_COMPRESSED_LZ4 | \
+         HEADER_INCOMPATIBLE_KEYED_HASH |     \
+         HEADER_INCOMPATIBLE_COMPRESSED_ZSTD)
 
-#if HAVE_XZ && HAVE_LZ4
+#if HAVE_XZ && HAVE_LZ4 && HAVE_ZSTD
 #  define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_ANY
+#elif HAVE_XZ && HAVE_LZ4
+#  define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_XZ|HEADER_INCOMPATIBLE_COMPRESSED_LZ4|HEADER_INCOMPATIBLE_KEYED_HASH)
+#elif HAVE_XZ && HAVE_ZSTD
+#  define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_XZ|HEADER_INCOMPATIBLE_COMPRESSED_ZSTD|HEADER_INCOMPATIBLE_KEYED_HASH)
+#elif HAVE_LZ4 && HAVE_ZSTD
+#  define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_LZ4|HEADER_INCOMPATIBLE_COMPRESSED_ZSTD|HEADER_INCOMPATIBLE_KEYED_HASH)
 #elif HAVE_XZ
-#  define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_COMPRESSED_XZ
+#  define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_XZ|HEADER_INCOMPATIBLE_KEYED_HASH)
 #elif HAVE_LZ4
-#  define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_COMPRESSED_LZ4
+#  define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_LZ4|HEADER_INCOMPATIBLE_KEYED_HASH)
+#elif HAVE_ZSTD
+#  define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_ZSTD|HEADER_INCOMPATIBLE_KEYED_HASH)
 #else
-#  define HEADER_INCOMPATIBLE_SUPPORTED 0
+#  define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_KEYED_HASH
 #endif
 
 enum {
-        HEADER_COMPATIBLE_SEALED = 1
+        HEADER_COMPATIBLE_SEALED = 1 << 0,
 };
 
 #define HEADER_COMPATIBLE_ANY HEADER_COMPATIBLE_SEALED
@@ -172,7 +190,8 @@ enum {
 #  define HEADER_COMPATIBLE_SUPPORTED 0
 #endif
 
-#define HEADER_SIGNATURE ((char[]) { 'L', 'P', 'K', 'S', 'H', 'H', 'R', 'H' })
+#define HEADER_SIGNATURE                                                \
+        ((const char[]) { 'L', 'P', 'K', 'S', 'H', 'H', 'R', 'H' })
 
 #define struct_Header__contents {                       \
         uint8_t signature[8]; /* "LPKSHHRH" */          \
@@ -205,14 +224,18 @@ enum {
         /* Added in 189 */                              \
         le64_t n_tags;                                  \
         le64_t n_entry_arrays;                          \
+        /* Added in 246 */                              \
+        le64_t data_hash_chain_depth;                   \
+        le64_t field_hash_chain_depth;                  \
         }
 
 struct Header struct_Header__contents;
 struct Header__packed struct_Header__contents _packed_;
 assert_cc(sizeof(struct Header) == sizeof(struct Header__packed));
-assert_cc(sizeof(struct Header) == 240);
+assert_cc(sizeof(struct Header) == 256);
 
-#define FSS_HEADER_SIGNATURE ((char[]) { 'K', 'S', 'H', 'H', 'R', 'H', 'L', 'P' })
+#define FSS_HEADER_SIGNATURE                                            \
+        ((const char[]) { 'K', 'S', 'H', 'H', 'R', 'H', 'L', 'P' })
 
 struct FSSHeader {
         uint8_t signature[8]; /* "KSHHRHLP" */
index b1e092224f789cfa227c7fdc1d3f1f10a44ebaf3..cdcded2e24b4805a247f24b9ae7cc117381804d5 100644 (file)
@@ -16,6 +16,7 @@
 #include "btrfs-util.h"
 #include "chattr-util.h"
 #include "compress.h"
+#include "env-util.h"
 #include "fd-util.h"
 #include "format-util.h"
 #include "fs-util.h"
@@ -81,6 +82,9 @@
 /* The mmap context to use for the header we pick as one above the last defined typed */
 #define CONTEXT_HEADER _OBJECT_TYPE_MAX
 
+/* Longest hash chain to rotate after */
+#define HASH_CHAIN_DEPTH_MAX 100
+
 #ifdef __clang__
 #  pragma GCC diagnostic ignored "-Waddress-of-packed-member"
 #endif
@@ -388,7 +392,7 @@ JournalFile* journal_file_close(JournalFile *f) {
 
         ordered_hashmap_free_free(f->chain_cache);
 
-#if HAVE_XZ || HAVE_LZ4
+#if HAVE_COMPRESSION
         free(f->compress_buffer);
 #endif
 
@@ -419,7 +423,9 @@ static int journal_file_init_header(JournalFile *f, JournalFile *template) {
 
         h.incompatible_flags |= htole32(
                 f->compress_xz * HEADER_INCOMPATIBLE_COMPRESSED_XZ |
-                f->compress_lz4 * HEADER_INCOMPATIBLE_COMPRESSED_LZ4);
+                f->compress_lz4 * HEADER_INCOMPATIBLE_COMPRESSED_LZ4 |
+                f->compress_zstd * HEADER_INCOMPATIBLE_COMPRESSED_ZSTD |
+                f->keyed_hash * HEADER_INCOMPATIBLE_KEYED_HASH);
 
         h.compatible_flags = htole32(
                 f->seal * HEADER_COMPATIBLE_SEALED);
@@ -445,7 +451,6 @@ static int journal_file_init_header(JournalFile *f, JournalFile *template) {
 }
 
 static int journal_file_refresh_header(JournalFile *f) {
-        sd_id128_t boot_id;
         int r;
 
         assert(f);
@@ -458,12 +463,10 @@ static int journal_file_refresh_header(JournalFile *f) {
         else if (r < 0)
                 return r;
 
-        r = sd_id128_get_boot(&boot_id);
+        r = sd_id128_get_boot(&f->header->boot_id);
         if (r < 0)
                 return r;
 
-        f->header->boot_id = boot_id;
-
         r = journal_file_set_online(f);
 
         /* Sync the online state to disk */
@@ -489,16 +492,23 @@ static bool warn_wrong_flags(const JournalFile *f, bool compatible) {
                                   f->path, type, flags & ~any);
                 flags = (flags & any) & ~supported;
                 if (flags) {
-                        const char* strv[3];
+                        const char* strv[5];
                         unsigned n = 0;
                         _cleanup_free_ char *t = NULL;
 
-                        if (compatible && (flags & HEADER_COMPATIBLE_SEALED))
-                                strv[n++] = "sealed";
-                        if (!compatible && (flags & HEADER_INCOMPATIBLE_COMPRESSED_XZ))
-                                strv[n++] = "xz-compressed";
-                        if (!compatible && (flags & HEADER_INCOMPATIBLE_COMPRESSED_LZ4))
-                                strv[n++] = "lz4-compressed";
+                        if (compatible) {
+                                if (flags & HEADER_COMPATIBLE_SEALED)
+                                        strv[n++] = "sealed";
+                        } else {
+                                if (flags & HEADER_INCOMPATIBLE_COMPRESSED_XZ)
+                                        strv[n++] = "xz-compressed";
+                                if (flags & HEADER_INCOMPATIBLE_COMPRESSED_LZ4)
+                                        strv[n++] = "lz4-compressed";
+                                if (flags & HEADER_INCOMPATIBLE_COMPRESSED_ZSTD)
+                                        strv[n++] = "zstd-compressed";
+                                if (flags & HEADER_INCOMPATIBLE_KEYED_HASH)
+                                        strv[n++] = "keyed-hash";
+                        }
                         strv[n] = NULL;
                         assert(n < ELEMENTSOF(strv));
 
@@ -595,9 +605,12 @@ static int journal_file_verify_header(JournalFile *f) {
 
         f->compress_xz = JOURNAL_HEADER_COMPRESSED_XZ(f->header);
         f->compress_lz4 = JOURNAL_HEADER_COMPRESSED_LZ4(f->header);
+        f->compress_zstd = JOURNAL_HEADER_COMPRESSED_ZSTD(f->header);
 
         f->seal = JOURNAL_HEADER_SEALED(f->header);
 
+        f->keyed_hash = JOURNAL_HEADER_KEYED_HASH(f->header);
+
         return 0;
 }
 
@@ -612,7 +625,7 @@ int journal_file_fstat(JournalFile *f) {
 
         f->last_stat_usec = now(CLOCK_MONOTONIC);
 
-        /* Refuse dealing with with files that aren't regular */
+        /* Refuse dealing with files that aren't regular */
         r = stat_verify_regular(&f->last_stat);
         if (r < 0)
                 return r;
@@ -1003,7 +1016,13 @@ static uint64_t journal_file_entry_seqnum(JournalFile *f, uint64_t *seqnum) {
         return r;
 }
 
-int journal_file_append_object(JournalFile *f, ObjectType type, uint64_t size, Object **ret, uint64_t *offset) {
+int journal_file_append_object(
+                JournalFile *f,
+                ObjectType type,
+                uint64_t size,
+                Object **ret,
+                uint64_t *ret_offset) {
+
         int r;
         uint64_t p;
         Object *tail, *o;
@@ -1013,8 +1032,6 @@ int journal_file_append_object(JournalFile *f, ObjectType type, uint64_t size, O
         assert(f->header);
         assert(type > OBJECT_UNUSED && type < _OBJECT_TYPE_MAX);
         assert(size >= sizeof(ObjectHeader));
-        assert(offset);
-        assert(ret);
 
         r = journal_file_set_online(f);
         if (r < 0)
@@ -1058,8 +1075,11 @@ int journal_file_append_object(JournalFile *f, ObjectType type, uint64_t size, O
         f->header->tail_object_offset = htole64(p);
         f->header->n_objects = htole64(le64toh(f->header->n_objects) + 1);
 
-        *ret = o;
-        *offset = p;
+        if (ret)
+                *ret = o;
+
+        if (ret_offset)
+                *ret_offset = p;
 
         return 0;
 }
@@ -1081,7 +1101,7 @@ static int journal_file_setup_data_hash_table(JournalFile *f) {
         if (s < DEFAULT_DATA_HASH_TABLE_SIZE)
                 s = DEFAULT_DATA_HASH_TABLE_SIZE;
 
-        log_debug("Reserving %"PRIu64" entries in hash table.", s / sizeof(HashItem));
+        log_debug("Reserving %"PRIu64" entries in data hash table.", s / sizeof(HashItem));
 
         r = journal_file_append_object(f,
                                        OBJECT_DATA_HASH_TABLE,
@@ -1110,6 +1130,8 @@ static int journal_file_setup_field_hash_table(JournalFile *f) {
          * number should grow very slowly only */
 
         s = DEFAULT_FIELD_HASH_TABLE_SIZE;
+        log_debug("Reserving %"PRIu64" entries in field hash table.", s / sizeof(HashItem));
+
         r = journal_file_append_object(f,
                                        OBJECT_FIELD_HASH_TABLE,
                                        offsetof(Object, hash_table.items) + s,
@@ -1273,12 +1295,38 @@ static int journal_file_link_data(
         return 0;
 }
 
+static int next_hash_offset(
+                JournalFile *f,
+                uint64_t *p,
+                le64_t *next_hash_offset,
+                uint64_t *depth,
+                le64_t *header_max_depth) {
+
+        uint64_t nextp;
+
+        nextp = le64toh(READ_NOW(*next_hash_offset));
+        if (nextp > 0) {
+                if (nextp <= *p) /* Refuse going in loops */
+                        return log_debug_errno(SYNTHETIC_ERRNO(EBADMSG),
+                                               "Detected hash item loop in %s, refusing.", f->path);
+
+                (*depth)++;
+
+                /* If the depth of this hash chain is larger than all others we have seen so far, record it */
+                if (header_max_depth && f->writable)
+                        *header_max_depth = htole64(MAX(*depth, le64toh(*header_max_depth)));
+        }
+
+        *p = nextp;
+        return 0;
+}
+
 int journal_file_find_field_object_with_hash(
                 JournalFile *f,
                 const void *field, uint64_t size, uint64_t hash,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
-        uint64_t p, osize, h, m;
+        uint64_t p, osize, h, m, depth = 0;
         int r;
 
         assert(f);
@@ -1302,7 +1350,6 @@ int journal_file_find_field_object_with_hash(
 
         h = hash % m;
         p = le64toh(f->field_hash_table[h].head_hash_offset);
-
         while (p > 0) {
                 Object *o;
 
@@ -1316,41 +1363,63 @@ int journal_file_find_field_object_with_hash(
 
                         if (ret)
                                 *ret = o;
-                        if (offset)
-                                *offset = p;
+                        if (ret_offset)
+                                *ret_offset = p;
 
                         return 1;
                 }
 
-                p = le64toh(o->field.next_hash_offset);
+                r = next_hash_offset(
+                                f,
+                                &p,
+                                &o->field.next_hash_offset,
+                                &depth,
+                                JOURNAL_HEADER_CONTAINS(f->header, field_hash_chain_depth) ? &f->header->field_hash_chain_depth : NULL);
+                if (r < 0)
+                        return r;
         }
 
         return 0;
 }
 
+uint64_t journal_file_hash_data(
+                JournalFile *f,
+                const void *data,
+                size_t sz) {
+
+        assert(f);
+        assert(data || sz == 0);
+
+        /* We try to unify our codebase on siphash, hence new-styled journal files utilizing the keyed hash
+         * function use siphash. Old journal files use the Jenkins hash. */
+
+        if (JOURNAL_HEADER_KEYED_HASH(f->header))
+                return siphash24(data, sz, f->header->file_id.bytes);
+
+        return jenkins_hash64(data, sz);
+}
+
 int journal_file_find_field_object(
                 JournalFile *f,
                 const void *field, uint64_t size,
-                Object **ret, uint64_t *offset) {
-
-        uint64_t hash;
+                Object **ret, uint64_t *ret_offset) {
 
         assert(f);
         assert(field && size > 0);
 
-        hash = hash64(field, size);
-
-        return journal_file_find_field_object_with_hash(f,
-                                                        field, size, hash,
-                                                        ret, offset);
+        return journal_file_find_field_object_with_hash(
+                        f,
+                        field, size,
+                        journal_file_hash_data(f, field, size),
+                        ret, ret_offset);
 }
 
 int journal_file_find_data_object_with_hash(
                 JournalFile *f,
                 const void *data, uint64_t size, uint64_t hash,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
-        uint64_t p, osize, h, m;
+        uint64_t p, osize, h, m, depth = 0;
         int r;
 
         assert(f);
@@ -1386,7 +1455,7 @@ int journal_file_find_data_object_with_hash(
                         goto next;
 
                 if (o->object.flags & OBJECT_COMPRESSION_MASK) {
-#if HAVE_XZ || HAVE_LZ4
+#if HAVE_COMPRESSION
                         uint64_t l;
                         size_t rsize = 0;
 
@@ -1407,8 +1476,8 @@ int journal_file_find_data_object_with_hash(
                                 if (ret)
                                         *ret = o;
 
-                                if (offset)
-                                        *offset = p;
+                                if (ret_offset)
+                                        *ret_offset = p;
 
                                 return 1;
                         }
@@ -1421,14 +1490,21 @@ int journal_file_find_data_object_with_hash(
                         if (ret)
                                 *ret = o;
 
-                        if (offset)
-                                *offset = p;
+                        if (ret_offset)
+                                *ret_offset = p;
 
                         return 1;
                 }
 
         next:
-                p = le64toh(o->data.next_hash_offset);
+                r = next_hash_offset(
+                                f,
+                                &p,
+                                &o->data.next_hash_offset,
+                                &depth,
+                                JOURNAL_HEADER_CONTAINS(f->header, data_hash_chain_depth) ? &f->header->data_hash_chain_depth : NULL);
+                if (r < 0)
+                        return r;
         }
 
         return 0;
@@ -1437,24 +1513,22 @@ int journal_file_find_data_object_with_hash(
 int journal_file_find_data_object(
                 JournalFile *f,
                 const void *data, uint64_t size,
-                Object **ret, uint64_t *offset) {
-
-        uint64_t hash;
+                Object **ret, uint64_t *ret_offset) {
 
         assert(f);
         assert(data || size == 0);
 
-        hash = hash64(data, size);
-
-        return journal_file_find_data_object_with_hash(f,
-                                                       data, size, hash,
-                                                       ret, offset);
+        return journal_file_find_data_object_with_hash(
+                        f,
+                        data, size,
+                        journal_file_hash_data(f, data, size),
+                        ret, ret_offset);
 }
 
 static int journal_file_append_field(
                 JournalFile *f,
                 const void *field, uint64_t size,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
         uint64_t hash, p;
         uint64_t osize;
@@ -1464,7 +1538,7 @@ static int journal_file_append_field(
         assert(f);
         assert(field && size > 0);
 
-        hash = hash64(field, size);
+        hash = journal_file_hash_data(f, field, size);
 
         r = journal_file_find_field_object_with_hash(f, field, size, hash, &o, &p);
         if (r < 0)
@@ -1474,8 +1548,8 @@ static int journal_file_append_field(
                 if (ret)
                         *ret = o;
 
-                if (offset)
-                        *offset = p;
+                if (ret_offset)
+                        *ret_offset = p;
 
                 return 0;
         }
@@ -1507,8 +1581,8 @@ static int journal_file_append_field(
         if (ret)
                 *ret = o;
 
-        if (offset)
-                *offset = p;
+        if (ret_offset)
+                *ret_offset = p;
 
         return 0;
 }
@@ -1516,7 +1590,7 @@ static int journal_file_append_field(
 static int journal_file_append_data(
                 JournalFile *f,
                 const void *data, uint64_t size,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
         uint64_t hash, p;
         uint64_t osize;
@@ -1527,7 +1601,7 @@ static int journal_file_append_data(
         assert(f);
         assert(data || size == 0);
 
-        hash = hash64(data, size);
+        hash = journal_file_hash_data(f, data, size);
 
         r = journal_file_find_data_object_with_hash(f, data, size, hash, &o, &p);
         if (r < 0)
@@ -1537,8 +1611,8 @@ static int journal_file_append_data(
                 if (ret)
                         *ret = o;
 
-                if (offset)
-                        *offset = p;
+                if (ret_offset)
+                        *ret_offset = p;
 
                 return 0;
         }
@@ -1550,7 +1624,7 @@ static int journal_file_append_data(
 
         o->data.hash = htole64(hash);
 
-#if HAVE_XZ || HAVE_LZ4
+#if HAVE_COMPRESSION
         if (JOURNAL_FILE_COMPRESS(f) && size >= f->compress_threshold_bytes) {
                 size_t rsize = 0;
 
@@ -1608,8 +1682,8 @@ static int journal_file_append_data(
         if (ret)
                 *ret = o;
 
-        if (offset)
-                *offset = p;
+        if (ret_offset)
+                *ret_offset = p;
 
         return 0;
 }
@@ -1833,7 +1907,7 @@ static int journal_file_append_entry_internal(
                 uint64_t xor_hash,
                 const EntryItem items[], unsigned n_items,
                 uint64_t *seqnum,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
         uint64_t np;
         uint64_t osize;
         Object *o;
@@ -1872,8 +1946,8 @@ static int journal_file_append_entry_internal(
         if (ret)
                 *ret = o;
 
-        if (offset)
-                *offset = np;
+        if (ret_offset)
+                *ret_offset = np;
 
         return 0;
 }
@@ -1977,7 +2051,7 @@ int journal_file_append_entry(
                 const sd_id128_t *boot_id,
                 const struct iovec iovec[], unsigned n_iovec,
                 uint64_t *seqnum,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
         unsigned i;
         EntryItem *items;
@@ -2020,7 +2094,20 @@ int journal_file_append_entry(
                 if (r < 0)
                         return r;
 
-                xor_hash ^= le64toh(o->data.hash);
+                /* When calculating the XOR hash field, we need to take special care if the "keyed-hash"
+                 * journal file flag is on. We use the XOR hash field to quickly determine the identity of a
+                 * specific record, and give records with otherwise identical position (i.e. match in seqno,
+                 * timestamp, …) a stable ordering. But for that we can't have it that the hash of the
+                 * objects in each file is different since they are keyed. Hence let's calculate the Jenkins
+                 * hash here for that. This also has the benefit that cursors for old and new journal files
+                 * are completely identical (they include the XOR hash after all). For classic Jenkins-hash
+                 * files things are easier, we can just take the value from the stored record directly. */
+
+                if (JOURNAL_HEADER_KEYED_HASH(f->header))
+                        xor_hash ^= jenkins_hash64(iovec[i].iov_base, iovec[i].iov_len);
+                else
+                        xor_hash ^= le64toh(o->data.hash);
+
                 items[i].object_offset = htole64(p);
                 items[i].hash = o->data.hash;
         }
@@ -2029,7 +2116,7 @@ int journal_file_append_entry(
          * times for rotating media. */
         typesafe_qsort(items, n_iovec, entry_item_cmp);
 
-        r = journal_file_append_entry_internal(f, ts, boot_id, xor_hash, items, n_iovec, seqnum, ret, offset);
+        r = journal_file_append_entry_internal(f, ts, boot_id, xor_hash, items, n_iovec, seqnum, ret, ret_offset);
 
         /* If the memory mapping triggered a SIGBUS then we return an
          * IO error and ignore the error code passed down to us, since
@@ -2098,7 +2185,7 @@ static int generic_array_get(
                 JournalFile *f,
                 uint64_t first,
                 uint64_t i,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
         Object *o;
         uint64_t p = 0, a, t = 0;
@@ -2148,8 +2235,8 @@ found:
         if (ret)
                 *ret = o;
 
-        if (offset)
-                *offset = p;
+        if (ret_offset)
+                *ret_offset = p;
 
         return 1;
 }
@@ -2159,7 +2246,7 @@ static int generic_array_get_plus_one(
                 uint64_t extra,
                 uint64_t first,
                 uint64_t i,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
         Object *o;
 
@@ -2175,13 +2262,13 @@ static int generic_array_get_plus_one(
                 if (ret)
                         *ret = o;
 
-                if (offset)
-                        *offset = extra;
+                if (ret_offset)
+                        *ret_offset = extra;
 
                 return 1;
         }
 
-        return generic_array_get(f, first, i-1, ret, offset);
+        return generic_array_get(f, first, i-1, ret, ret_offset);
 }
 
 enum {
@@ -2198,8 +2285,8 @@ static int generic_array_bisect(
                 int (*test_object)(JournalFile *f, uint64_t p, uint64_t needle),
                 direction_t direction,
                 Object **ret,
-                uint64_t *offset,
-                uint64_t *idx) {
+                uint64_t *ret_offset,
+                uint64_t *ret_idx) {
 
         uint64_t a, p, t = 0, i = 0, last_p = 0, last_index = (uint64_t) -1;
         bool subtract_one = false;
@@ -2398,11 +2485,11 @@ found:
         if (ret)
                 *ret = o;
 
-        if (offset)
-                *offset = p;
+        if (ret_offset)
+                *ret_offset = p;
 
-        if (idx)
-                *idx = t + i + (subtract_one ? -1 : 0);
+        if (ret_idx)
+                *ret_idx = t + i + (subtract_one ? -1 : 0);
 
         return 1;
 }
@@ -2416,8 +2503,8 @@ static int generic_array_bisect_plus_one(
                 int (*test_object)(JournalFile *f, uint64_t p, uint64_t needle),
                 direction_t direction,
                 Object **ret,
-                uint64_t *offset,
-                uint64_t *idx) {
+                uint64_t *ret_offset,
+                uint64_t *ret_idx) {
 
         int r;
         bool step_back = false;
@@ -2453,13 +2540,13 @@ static int generic_array_bisect_plus_one(
                         return 0;
         }
 
-        r = generic_array_bisect(f, first, n-1, needle, test_object, direction, ret, offset, idx);
+        r = generic_array_bisect(f, first, n-1, needle, test_object, direction, ret, ret_offset, ret_idx);
 
         if (r == 0 && step_back)
                 goto found;
 
-        if (r > 0 && idx)
-                (*idx)++;
+        if (r > 0 && ret_idx)
+                (*ret_idx)++;
 
         return r;
 
@@ -2471,11 +2558,11 @@ found:
         if (ret)
                 *ret = o;
 
-        if (offset)
-                *offset = extra;
+        if (ret_offset)
+                *ret_offset = extra;
 
-        if (idx)
-                *idx = 0;
+        if (ret_idx)
+                *ret_idx = 0;
 
         return 1;
 }
@@ -2518,17 +2605,18 @@ int journal_file_move_to_entry_by_seqnum(
                 uint64_t seqnum,
                 direction_t direction,
                 Object **ret,
-                uint64_t *offset) {
+                uint64_t *ret_offset) {
         assert(f);
         assert(f->header);
 
-        return generic_array_bisect(f,
-                                    le64toh(f->header->entry_array_offset),
-                                    le64toh(f->header->n_entries),
-                                    seqnum,
-                                    test_object_seqnum,
-                                    direction,
-                                    ret, offset, NULL);
+        return generic_array_bisect(
+                        f,
+                        le64toh(f->header->entry_array_offset),
+                        le64toh(f->header->n_entries),
+                        seqnum,
+                        test_object_seqnum,
+                        direction,
+                        ret, ret_offset, NULL);
 }
 
 static int test_object_realtime(JournalFile *f, uint64_t p, uint64_t needle) {
@@ -2557,17 +2645,18 @@ int journal_file_move_to_entry_by_realtime(
                 uint64_t realtime,
                 direction_t direction,
                 Object **ret,
-                uint64_t *offset) {
+                uint64_t *ret_offset) {
         assert(f);
         assert(f->header);
 
-        return generic_array_bisect(f,
-                                    le64toh(f->header->entry_array_offset),
-                                    le64toh(f->header->n_entries),
-                                    realtime,
-                                    test_object_realtime,
-                                    direction,
-                                    ret, offset, NULL);
+        return generic_array_bisect(
+                        f,
+                        le64toh(f->header->entry_array_offset),
+                        le64toh(f->header->n_entries),
+                        realtime,
+                        test_object_realtime,
+                        direction,
+                        ret, ret_offset, NULL);
 }
 
 static int test_object_monotonic(JournalFile *f, uint64_t p, uint64_t needle) {
@@ -2609,7 +2698,7 @@ int journal_file_move_to_entry_by_monotonic(
                 uint64_t monotonic,
                 direction_t direction,
                 Object **ret,
-                uint64_t *offset) {
+                uint64_t *ret_offset) {
 
         Object *o;
         int r;
@@ -2622,14 +2711,15 @@ int journal_file_move_to_entry_by_monotonic(
         if (r == 0)
                 return -ENOENT;
 
-        return generic_array_bisect_plus_one(f,
-                                             le64toh(o->data.entry_offset),
-                                             le64toh(o->data.entry_array_offset),
-                                             le64toh(o->data.n_entries),
-                                             monotonic,
-                                             test_object_monotonic,
-                                             direction,
-                                             ret, offset, NULL);
+        return generic_array_bisect_plus_one(
+                        f,
+                        le64toh(o->data.entry_offset),
+                        le64toh(o->data.entry_array_offset),
+                        le64toh(o->data.n_entries),
+                        monotonic,
+                        test_object_monotonic,
+                        direction,
+                        ret, ret_offset, NULL);
 }
 
 void journal_file_reset_location(JournalFile *f) {
@@ -2735,7 +2825,7 @@ int journal_file_next_entry(
                 JournalFile *f,
                 uint64_t p,
                 direction_t direction,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
         uint64_t i, n, ofs;
         int r;
@@ -2792,8 +2882,8 @@ int journal_file_next_entry(
                                        "%s: entry array not properly ordered at entry %" PRIu64,
                                        f->path, i);
 
-        if (offset)
-                *offset = ofs;
+        if (ret_offset)
+                *ret_offset = ofs;
 
         return 1;
 }
@@ -2803,7 +2893,7 @@ int journal_file_next_entry_for_data(
                 Object *o, uint64_t p,
                 uint64_t data_offset,
                 direction_t direction,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
         uint64_t i, n, ofs;
         Object *d;
@@ -2868,8 +2958,8 @@ int journal_file_next_entry_for_data(
                                        "%s data entry array not properly ordered at entry %" PRIu64,
                                        f->path, i);
 
-        if (offset)
-                *offset = ofs;
+        if (ret_offset)
+                *ret_offset = ofs;
 
         return 1;
 }
@@ -2879,7 +2969,7 @@ int journal_file_move_to_entry_by_offset_for_data(
                 uint64_t data_offset,
                 uint64_t p,
                 direction_t direction,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
         int r;
         Object *d;
@@ -2890,14 +2980,15 @@ int journal_file_move_to_entry_by_offset_for_data(
         if (r < 0)
                 return r;
 
-        return generic_array_bisect_plus_one(f,
-                                             le64toh(d->data.entry_offset),
-                                             le64toh(d->data.entry_array_offset),
-                                             le64toh(d->data.n_entries),
-                                             p,
-                                             test_object_offset,
-                                             direction,
-                                             ret, offset, NULL);
+        return generic_array_bisect_plus_one(
+                        f,
+                        le64toh(d->data.entry_offset),
+                        le64toh(d->data.entry_array_offset),
+                        le64toh(d->data.n_entries),
+                        p,
+                        test_object_offset,
+                        direction,
+                        ret, ret_offset, NULL);
 }
 
 int journal_file_move_to_entry_by_monotonic_for_data(
@@ -2906,7 +2997,7 @@ int journal_file_move_to_entry_by_monotonic_for_data(
                 sd_id128_t boot_id,
                 uint64_t monotonic,
                 direction_t direction,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
         Object *o, *d;
         int r;
@@ -2973,8 +3064,8 @@ int journal_file_move_to_entry_by_monotonic_for_data(
                 if (p == q) {
                         if (ret)
                                 *ret = qo;
-                        if (offset)
-                                *offset = q;
+                        if (ret_offset)
+                                *ret_offset = q;
 
                         return 1;
                 }
@@ -2988,7 +3079,7 @@ int journal_file_move_to_entry_by_seqnum_for_data(
                 uint64_t data_offset,
                 uint64_t seqnum,
                 direction_t direction,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
         Object *d;
         int r;
@@ -2999,14 +3090,15 @@ int journal_file_move_to_entry_by_seqnum_for_data(
         if (r < 0)
                 return r;
 
-        return generic_array_bisect_plus_one(f,
-                                             le64toh(d->data.entry_offset),
-                                             le64toh(d->data.entry_array_offset),
-                                             le64toh(d->data.n_entries),
-                                             seqnum,
-                                             test_object_seqnum,
-                                             direction,
-                                             ret, offset, NULL);
+        return generic_array_bisect_plus_one(
+                        f,
+                        le64toh(d->data.entry_offset),
+                        le64toh(d->data.entry_array_offset),
+                        le64toh(d->data.n_entries),
+                        seqnum,
+                        test_object_seqnum,
+                        direction,
+                        ret, ret_offset, NULL);
 }
 
 int journal_file_move_to_entry_by_realtime_for_data(
@@ -3014,7 +3106,7 @@ int journal_file_move_to_entry_by_realtime_for_data(
                 uint64_t data_offset,
                 uint64_t realtime,
                 direction_t direction,
-                Object **ret, uint64_t *offset) {
+                Object **ret, uint64_t *ret_offset) {
 
         Object *d;
         int r;
@@ -3025,14 +3117,15 @@ int journal_file_move_to_entry_by_realtime_for_data(
         if (r < 0)
                 return r;
 
-        return generic_array_bisect_plus_one(f,
-                                             le64toh(d->data.entry_offset),
-                                             le64toh(d->data.entry_array_offset),
-                                             le64toh(d->data.n_entries),
-                                             realtime,
-                                             test_object_realtime,
-                                             direction,
-                                             ret, offset, NULL);
+        return generic_array_bisect_plus_one(
+                        f,
+                        le64toh(d->data.entry_offset),
+                        le64toh(d->data.entry_array_offset),
+                        le64toh(d->data.n_entries),
+                        realtime,
+                        test_object_realtime,
+                        direction,
+                        ret, ret_offset, NULL);
 }
 
 void journal_file_dump(JournalFile *f) {
@@ -3135,7 +3228,7 @@ void journal_file_print_header(JournalFile *f) {
                "Sequential number ID: %s\n"
                "State: %s\n"
                "Compatible flags:%s%s\n"
-               "Incompatible flags:%s%s%s\n"
+               "Incompatible flags:%s%s%s%s%s\n"
                "Header size: %"PRIu64"\n"
                "Arena size: %"PRIu64"\n"
                "Data hash table size: %"PRIu64"\n"
@@ -3160,6 +3253,8 @@ void journal_file_print_header(JournalFile *f) {
                (le32toh(f->header->compatible_flags) & ~HEADER_COMPATIBLE_ANY) ? " ???" : "",
                JOURNAL_HEADER_COMPRESSED_XZ(f->header) ? " COMPRESSED-XZ" : "",
                JOURNAL_HEADER_COMPRESSED_LZ4(f->header) ? " COMPRESSED-LZ4" : "",
+               JOURNAL_HEADER_COMPRESSED_ZSTD(f->header) ? " COMPRESSED-ZSTD" : "",
+               JOURNAL_HEADER_KEYED_HASH(f->header) ? " KEYED-HASH" : "",
                (le32toh(f->header->incompatible_flags) & ~HEADER_INCOMPATIBLE_ANY) ? " ???" : "",
                le64toh(f->header->header_size),
                le64toh(f->header->arena_size),
@@ -3193,6 +3288,14 @@ void journal_file_print_header(JournalFile *f) {
                 printf("Entry array objects: %"PRIu64"\n",
                        le64toh(f->header->n_entry_arrays));
 
+        if (JOURNAL_HEADER_CONTAINS(f->header, field_hash_chain_depth))
+                printf("Deepest field hash chain: %" PRIu64"\n",
+                       f->header->field_hash_chain_depth);
+
+        if (JOURNAL_HEADER_CONTAINS(f->header, data_hash_chain_depth))
+                printf("Deepest data hash chain: %" PRIu64"\n",
+                       f->header->data_hash_chain_depth);
+
         if (fstat(f->fd, &st) >= 0)
                 printf("Disk usage: %s\n", format_bytes(bytes, sizeof(bytes), (uint64_t) st.st_blocks * 512ULL));
 }
@@ -3272,7 +3375,9 @@ int journal_file_open(
                 .prot = prot_from_flags(flags),
                 .writable = (flags & O_ACCMODE) != O_RDONLY,
 
-#if HAVE_LZ4
+#if HAVE_ZSTD
+                .compress_zstd = compress,
+#elif HAVE_LZ4
                 .compress_lz4 = compress,
 #elif HAVE_XZ
                 .compress_xz = compress,
@@ -3285,19 +3390,31 @@ int journal_file_open(
 #endif
         };
 
+        /* We turn on keyed hashes by default, but provide an environment variable to turn them off, if
+         * people really want that */
+        r = getenv_bool("SYSTEMD_JOURNAL_KEYED_HASH");
+        if (r < 0) {
+                if (r != -ENXIO)
+                        log_debug_errno(r, "Failed to parse $SYSTEMD_JOURNAL_KEYED_HASH environment variable, ignoring.");
+                f->keyed_hash = true;
+        } else
+                f->keyed_hash = r;
+
         if (DEBUG_LOGGING) {
-                static int last_seal = -1, last_compress = -1;
+                static int last_seal = -1, last_compress = -1, last_keyed_hash = -1;
                 static uint64_t last_bytes = UINT64_MAX;
                 char bytes[FORMAT_BYTES_MAX];
 
                 if (last_seal != f->seal ||
+                    last_keyed_hash != f->keyed_hash ||
                     last_compress != JOURNAL_FILE_COMPRESS(f) ||
                     last_bytes != f->compress_threshold_bytes) {
 
-                        log_debug("Journal effective settings seal=%s compress=%s compress_threshold_bytes=%s",
-                                  yes_no(f->seal), yes_no(JOURNAL_FILE_COMPRESS(f)),
+                        log_debug("Journal effective settings seal=%s keyed_hash=%s compress=%s compress_threshold_bytes=%s",
+                                  yes_no(f->seal), yes_no(f->keyed_hash), yes_no(JOURNAL_FILE_COMPRESS(f)),
                                   format_bytes(bytes, sizeof bytes, f->compress_threshold_bytes));
                         last_seal = f->seal;
+                        last_keyed_hash = f->keyed_hash;
                         last_compress = JOURNAL_FILE_COMPRESS(f);
                         last_bytes = f->compress_threshold_bytes;
                 }
@@ -3735,7 +3852,7 @@ int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint6
                         return -E2BIG;
 
                 if (o->object.flags & OBJECT_COMPRESSION_MASK) {
-#if HAVE_XZ || HAVE_LZ4
+#if HAVE_COMPRESSION
                         size_t rsize = 0;
 
                         r = decompress_blob(o->object.flags & OBJECT_COMPRESSION_MASK,
@@ -3755,7 +3872,11 @@ int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint6
                 if (r < 0)
                         return r;
 
-                xor_hash ^= le64toh(u->data.hash);
+                if (JOURNAL_HEADER_KEYED_HASH(to->header))
+                        xor_hash ^= jenkins_hash64(data, l);
+                else
+                        xor_hash ^= le64toh(u->data.hash);
+
                 items[i].object_offset = htole64(h);
                 items[i].hash = u->data.hash;
 
@@ -3942,11 +4063,9 @@ bool journal_file_rotate_suggested(JournalFile *f, usec_t max_file_usec) {
                 return true;
         }
 
-        /* Let's check if the hash tables grew over a certain fill
-         * level (75%, borrowing this value from Java's hash table
-         * implementation), and if so suggest a rotation. To calculate
-         * the fill level we need the n_data field, which only exists
-         * in newer versions. */
+        /* Let's check if the hash tables grew over a certain fill level (75%, borrowing this value from
+         * Java's hash table implementation), and if so suggest a rotation. To calculate the fill level we
+         * need the n_data field, which only exists in newer versions. */
 
         if (JOURNAL_HEADER_CONTAINS(f->header, n_data))
                 if (le64toh(f->header->n_data) * 4ULL > (le64toh(f->header->data_hash_table_size) / sizeof(HashItem)) * 3ULL) {
@@ -3970,6 +4089,22 @@ bool journal_file_rotate_suggested(JournalFile *f, usec_t max_file_usec) {
                         return true;
                 }
 
+        /* If there are too many hash collisions somebody is most likely playing games with us. Hence, if our
+         * longest chain is longer than some threshold, let's suggest rotation. */
+        if (JOURNAL_HEADER_CONTAINS(f->header, data_hash_chain_depth) &&
+            le64toh(f->header->data_hash_chain_depth) > HASH_CHAIN_DEPTH_MAX) {
+                log_debug("Data hash table of %s has deepest hash chain of length %" PRIu64 ", suggesting rotation.",
+                          f->path, le64toh(f->header->data_hash_chain_depth));
+                return true;
+        }
+
+        if (JOURNAL_HEADER_CONTAINS(f->header, field_hash_chain_depth) &&
+            le64toh(f->header->field_hash_chain_depth) > HASH_CHAIN_DEPTH_MAX) {
+                log_debug("Field hash table of %s has deepest hash chain of length at %" PRIu64 ", suggesting rotation.",
+                          f->path, le64toh(f->header->field_hash_chain_depth));
+                return true;
+        }
+
         /* Are the data objects properly indexed by field objects? */
         if (JOURNAL_HEADER_CONTAINS(f->header, n_data) &&
             JOURNAL_HEADER_CONTAINS(f->header, n_fields) &&
index cf0f7691fb187f933d8b39467ea56dafd88b2fc5..f80bf5d26b1371c5fbf989f70cfa9769ed0a3914 100644 (file)
@@ -67,10 +67,12 @@ typedef struct JournalFile {
         bool writable:1;
         bool compress_xz:1;
         bool compress_lz4:1;
+        bool compress_zstd:1;
         bool seal:1;
         bool defrag_on_close:1;
         bool close_fd:1;
         bool archive:1;
+        bool keyed_hash:1;
 
         direction_t last_direction;
         LocationType location_type;
@@ -105,7 +107,7 @@ typedef struct JournalFile {
         unsigned last_seen_generation;
 
         uint64_t compress_threshold_bytes;
-#if HAVE_XZ || HAVE_LZ4
+#if HAVE_COMPRESSION
         void *compress_buffer;
         size_t compress_buffer_size;
 #endif
@@ -187,13 +189,19 @@ static inline bool VALID_EPOCH(uint64_t u) {
         (le64toh((h)->header_size) >= offsetof(Header, field) + sizeof((h)->field))
 
 #define JOURNAL_HEADER_SEALED(h) \
-        (!!(le32toh((h)->compatible_flags) & HEADER_COMPATIBLE_SEALED))
+        FLAGS_SET(le32toh((h)->compatible_flags), HEADER_COMPATIBLE_SEALED)
 
 #define JOURNAL_HEADER_COMPRESSED_XZ(h) \
-        (!!(le32toh((h)->incompatible_flags) & HEADER_INCOMPATIBLE_COMPRESSED_XZ))
+        FLAGS_SET(le32toh((h)->incompatible_flags), HEADER_INCOMPATIBLE_COMPRESSED_XZ)
 
 #define JOURNAL_HEADER_COMPRESSED_LZ4(h) \
-        (!!(le32toh((h)->incompatible_flags) & HEADER_INCOMPATIBLE_COMPRESSED_LZ4))
+        FLAGS_SET(le32toh((h)->incompatible_flags), HEADER_INCOMPATIBLE_COMPRESSED_LZ4)
+
+#define JOURNAL_HEADER_COMPRESSED_ZSTD(h) \
+        FLAGS_SET(le32toh((h)->incompatible_flags), HEADER_INCOMPATIBLE_COMPRESSED_ZSTD)
+
+#define JOURNAL_HEADER_KEYED_HASH(h) \
+        FLAGS_SET(le32toh((h)->incompatible_flags), HEADER_INCOMPATIBLE_KEYED_HASH)
 
 int journal_file_move_to_object(JournalFile *f, ObjectType type, uint64_t offset, Object **ret);
 
@@ -260,5 +268,7 @@ int journal_file_map_field_hash_table(JournalFile *f);
 
 static inline bool JOURNAL_FILE_COMPRESS(JournalFile *f) {
         assert(f);
-        return f->compress_xz || f->compress_lz4;
+        return f->compress_xz || f->compress_lz4 || f->compress_zstd;
 }
+
+uint64_t journal_file_hash_data(JournalFile *f, const void *data, size_t sz);
index e1fb01a6e38ab823c77b740292566e3264c17272..a649acf634e74d4409da33af209cce716f5a7eaa 100644 (file)
@@ -32,7 +32,7 @@ struct Match {
         /* For concrete matches */
         char *data;
         size_t size;
-        le64_t le_hash;
+        uint64_t hash; /* old-style jenkins hash. New-style siphash is different per file, hence won't be cached here */
 
         /* For terms */
         LIST_HEAD(Match, matches);
index 344b7b019a57c3148bccf6c5e1cfa3305ebcb8a6..eddb8054bf7dbc84d6b679c22b1cb13bd80b2422 100644 (file)
@@ -163,9 +163,9 @@ static int journal_file_object_verify(JournalFile *f, uint64_t offset, Object *o
                                 return r;
                         }
 
-                        h2 = hash64(b, b_size);
+                        h2 = journal_file_hash_data(f, b, b_size);
                 } else
-                        h2 = hash64(o->data.payload, le64toh(o->object.size) - offsetof(Object, data.payload));
+                        h2 = journal_file_hash_data(f, o->data.payload, le64toh(o->object.size) - offsetof(Object, data.payload));
 
                 if (h1 != h2) {
                         error(offset, "Invalid hash (%08"PRIx64" vs. %08"PRIx64, h1, h2);
@@ -925,9 +925,10 @@ int journal_file_verify(
                         goto fail;
                 }
 
-                if ((o->object.flags & OBJECT_COMPRESSED_XZ) &&
-                    (o->object.flags & OBJECT_COMPRESSED_LZ4)) {
-                        error(p, "Objected with double compression");
+                if (!!(o->object.flags & OBJECT_COMPRESSED_XZ) +
+                    !!(o->object.flags & OBJECT_COMPRESSED_LZ4) +
+                    !!(o->object.flags & OBJECT_COMPRESSED_ZSTD) > 1) {
+                        error(p, "Object has multiple compression flags set");
                         r = -EINVAL;
                         goto fail;
                 }
@@ -944,6 +945,12 @@ int journal_file_verify(
                         goto fail;
                 }
 
+                if ((o->object.flags & OBJECT_COMPRESSED_ZSTD) && !JOURNAL_HEADER_COMPRESSED_ZSTD(f->header)) {
+                        error(p, "ZSTD compressed object in file without ZSTD compression");
+                        r = -EBADMSG;
+                        goto fail;
+                }
+
                 switch (o->object.type) {
 
                 case OBJECT_DATA:
index 859f4bbd44a9b9a26c722b3242b4c9f8f13ffc3f..8d4897b942f778807e168415deecec262bec92cf 100644 (file)
@@ -875,12 +875,7 @@ static int parse_argv(int argc, char *argv[]) {
                                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                                "Bad --facility= argument \"%s\".", fac);
 
-                                r = set_ensure_allocated(&arg_facilities, NULL);
-                                if (r < 0)
-                                        return log_oom();
-
-                                r = set_put(arg_facilities, INT_TO_PTR(num));
-                                if (r < 0)
+                                if (set_ensure_put(&arg_facilities, NULL, INT_TO_PTR(num)) < 0)
                                         return log_oom();
                         }
 
@@ -2115,9 +2110,7 @@ int main(int argc, char *argv[]) {
         int n_shown = 0, r, poll_fd = -1;
 
         setlocale(LC_ALL, "");
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         /* Increase max number of open files if we can, we might needs this when browsing journal files, which might be
          * split up into many files. */
index 95aaf8787693c4b1537684367da4d11fae5579b5..6e7c806fd8218bde2f51a36f395dd607579504c4 100644 (file)
@@ -315,7 +315,7 @@ static int server_read_dev_kmsg(Server *s) {
                 if (IN_SET(errno, EAGAIN, EINTR, EPIPE))
                         return 0;
 
-                return log_error_errno(errno, "Failed to read from kernel: %m");
+                return log_error_errno(errno, "Failed to read from /dev/kmsg: %m");
         }
 
         dev_kmsg_record(s, buffer, l);
index 787921ffbf767c56053c373f8723bd8488823f7e..0a01269e433980b1c89f933e5f06521d70e2728f 100644 (file)
@@ -13,7 +13,7 @@ void jenkins_hashlittle2(const void *key, size_t length, uint32_t *pc, uint32_t
 
 uint32_t jenkins_hashbig(const void *key, size_t length, uint32_t initval) _pure_;
 
-static inline uint64_t hash64(const void *data, size_t length) {
+static inline uint64_t jenkins_hash64(const void *data, size_t length) {
         uint32_t a = 0, b = 0;
 
         jenkins_hashlittle2(data, length, &a, &b);
index 80cd80f3568969fbc16042274b1202cccce63df3..853dd0c28b7c92ef2808d5889f59200a3b67aca9 100644 (file)
@@ -240,7 +240,7 @@ static void match_free_if_empty(Match *m) {
 
 _public_ int sd_journal_add_match(sd_journal *j, const void *data, size_t size) {
         Match *l3, *l4, *add_here = NULL, *m;
-        le64_t le_hash;
+        uint64_t hash;
 
         assert_return(j, -EINVAL);
         assert_return(!journal_pid_changed(j), -ECHILD);
@@ -279,7 +279,9 @@ _public_ int sd_journal_add_match(sd_journal *j, const void *data, size_t size)
         assert(j->level1->type == MATCH_OR_TERM);
         assert(j->level2->type == MATCH_AND_TERM);
 
-        le_hash = htole64(hash64(data, size));
+        /* Old-style Jenkins (unkeyed) hashing only here. We do not cover new-style siphash (keyed) hashing
+         * here, since it's different for each file, and thus can't be pre-calculated in the Match object. */
+        hash = jenkins_hash64(data, size);
 
         LIST_FOREACH(matches, l3, j->level2->matches) {
                 assert(l3->type == MATCH_OR_TERM);
@@ -289,7 +291,7 @@ _public_ int sd_journal_add_match(sd_journal *j, const void *data, size_t size)
 
                         /* Exactly the same match already? Then ignore
                          * this addition */
-                        if (l4->le_hash == le_hash &&
+                        if (l4->hash == hash &&
                             l4->size == size &&
                             memcmp(l4->data, data, size) == 0)
                                 return 0;
@@ -315,7 +317,7 @@ _public_ int sd_journal_add_match(sd_journal *j, const void *data, size_t size)
         if (!m)
                 goto fail;
 
-        m->le_hash = le_hash;
+        m->hash = hash;
         m->size = size;
         m->data = memdup(data, size);
         if (!m->data)
@@ -501,9 +503,16 @@ static int next_for_match(
         assert(f);
 
         if (m->type == MATCH_DISCRETE) {
-                uint64_t dp;
+                uint64_t dp, hash;
+
+                /* If the keyed hash logic is used, we need to calculate the hash fresh per file. Otherwise
+                 * we can use what we pre-calculated. */
+                if (JOURNAL_HEADER_KEYED_HASH(f->header))
+                        hash = journal_file_hash_data(f, m->data, m->size);
+                else
+                        hash = m->hash;
 
-                r = journal_file_find_data_object_with_hash(f, m->data, m->size, le64toh(m->le_hash), NULL, &dp);
+                r = journal_file_find_data_object_with_hash(f, m->data, m->size, hash, NULL, &dp);
                 if (r <= 0)
                         return r;
 
@@ -590,9 +599,14 @@ static int find_location_for_match(
         assert(f);
 
         if (m->type == MATCH_DISCRETE) {
-                uint64_t dp;
+                uint64_t dp, hash;
+
+                if (JOURNAL_HEADER_KEYED_HASH(f->header))
+                        hash = journal_file_hash_data(f, m->data, m->size);
+                else
+                        hash = m->hash;
 
-                r = journal_file_find_data_object_with_hash(f, m->data, m->size, le64toh(m->le_hash), NULL, &dp);
+                r = journal_file_find_data_object_with_hash(f, m->data, m->size, hash, NULL, &dp);
                 if (r <= 0)
                         return r;
 
@@ -2313,7 +2327,7 @@ _public_ int sd_journal_get_data(sd_journal *j, const char *field, const void **
 
                 compression = o->object.flags & OBJECT_COMPRESSION_MASK;
                 if (compression) {
-#if HAVE_XZ || HAVE_LZ4
+#if HAVE_COMPRESSION
                         r = decompress_startswith(compression,
                                                   o->data.payload, l,
                                                   &f->compress_buffer, &f->compress_buffer_size,
@@ -2380,7 +2394,7 @@ static int return_data(sd_journal *j, JournalFile *f, Object *o, const void **da
 
         compression = o->object.flags & OBJECT_COMPRESSION_MASK;
         if (compression) {
-#if HAVE_XZ || HAVE_LZ4
+#if HAVE_COMPRESSION
                 size_t rsize;
                 int r;
 
index 100599705859a3560b54f831b4dce2a1a38a2fff..35823a8da5e43e715e9956cba9dc5a3a82a271d0 100644 (file)
@@ -17,7 +17,7 @@ typedef int (compress_t)(const void *src, uint64_t src_size, void *dst,
 typedef int (decompress_t)(const void *src, uint64_t src_size,
                            void **dst, size_t *dst_alloc_size, size_t* dst_size, size_t dst_max);
 
-#if HAVE_XZ || HAVE_LZ4
+#if HAVE_COMPRESSION
 
 static usec_t arg_duration;
 static size_t arg_start;
@@ -143,7 +143,7 @@ static void test_compress_decompress(const char* label, const char* type,
 #endif
 
 int main(int argc, char *argv[]) {
-#if HAVE_XZ || HAVE_LZ4
+#if HAVE_COMPRESSION
         test_setup_logging(LOG_INFO);
 
         if (argc >= 2) {
@@ -167,6 +167,9 @@ int main(int argc, char *argv[]) {
 #endif
 #if HAVE_LZ4
                 test_compress_decompress("LZ4", i, compress_blob_lz4, decompress_blob_lz4);
+#endif
+#if HAVE_ZSTD
+                test_compress_decompress("ZSTD", i, compress_blob_zstd, decompress_blob_zstd);
 #endif
         }
         return 0;
index c9d295b3c1cfa5e08ac0d768488fe9dd0a36b36b..0990f7604d549d5bc2660b353c4810dc272f0c52 100644 (file)
@@ -44,7 +44,7 @@ typedef int (decompress_sw_t)(const void *src, uint64_t src_size,
 typedef int (compress_stream_t)(int fdf, int fdt, uint64_t max_bytes);
 typedef int (decompress_stream_t)(int fdf, int fdt, uint64_t max_size);
 
-#if HAVE_XZ || HAVE_LZ4 || HAVE_ZSTD
+#if HAVE_COMPRESSION
 _unused_ static void test_compress_decompress(const char *compression,
                                               compress_blob_t compress,
                                               decompress_blob_t decompress,
@@ -265,7 +265,7 @@ static void test_lz4_decompress_partial(void) {
 #endif
 
 int main(int argc, char *argv[]) {
-#if HAVE_XZ || HAVE_LZ4 || HAVE_ZSTD
+#if HAVE_COMPRESSION
         _unused_ const char text[] =
                 "text\0foofoofoofoo AAAA aaaaaaaaa ghost busters barbarbar FFF"
                 "foofoofoofoo AAAA aaaaaaaaa ghost busters barbarbar FFF";
@@ -339,8 +339,25 @@ int main(int argc, char *argv[]) {
 #endif
 
 #if HAVE_ZSTD
+        test_compress_decompress("ZSTD", compress_blob_zstd, decompress_blob_zstd,
+                                 text, sizeof(text), false);
+        test_compress_decompress("ZSTD", compress_blob_zstd, decompress_blob_zstd,
+                                 data, sizeof(data), true);
+
+        test_decompress_startswith("ZSTD",
+                                   compress_blob_zstd, decompress_startswith_zstd,
+                                   text, sizeof(text), false);
+        test_decompress_startswith("ZSTD",
+                                   compress_blob_zstd, decompress_startswith_zstd,
+                                   data, sizeof(data), true);
+        test_decompress_startswith("ZSTD",
+                                   compress_blob_zstd, decompress_startswith_zstd,
+                                   huge, HUGE_SIZE, true);
+
         test_compress_stream("ZSTD", "zstdcat",
                              compress_stream_zstd, decompress_stream_zstd, srcfile);
+
+        test_decompress_startswith_short("ZSTD", compress_blob_zstd, decompress_startswith_zstd);
 #else
         log_info("/* ZSTD test skipped */");
 #endif
index 6d97bc5ce8aa6f656c434efdc903d8a4f7bf14ff..50aab11c6a8b61182f4a3914477e7b7909aa79bb 100644 (file)
@@ -58,7 +58,7 @@ static void verify_contents(sd_journal *j, unsigned skip) {
                 assert_se(i == N_ENTRIES);
 }
 
-int main(int argc, char *argv[]) {
+static void run_test(void) {
         JournalFile *one, *two, *three;
         char t[] = "/var/tmp/journal-stream-XXXXXX";
         unsigned i;
@@ -68,12 +68,6 @@ int main(int argc, char *argv[]) {
         size_t l;
         dual_timestamp previous_ts = DUAL_TIMESTAMP_NULL;
 
-        /* journal_file_open requires a valid machine id */
-        if (access("/etc/machine-id", F_OK) != 0)
-                return log_tests_skipped("/etc/machine-id not found");
-
-        test_setup_logging(LOG_DEBUG);
-
         assert_se(mkdtemp(t));
         assert_se(chdir(t) >= 0);
         (void) chattr_path(t, FS_NOCOW_FL, FS_NOCOW_FL, NULL);
@@ -177,6 +171,22 @@ int main(int argc, char *argv[]) {
                 printf("%.*s\n", (int) l, (const char*) data);
 
         assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
+}
+
+int main(int argc, char *argv[]) {
+
+        /* journal_file_open requires a valid machine id */
+        if (access("/etc/machine-id", F_OK) != 0)
+                return log_tests_skipped("/etc/machine-id not found");
+
+        test_setup_logging(LOG_DEBUG);
+
+        /* Run this test twice. Once with old hashing and once with new hashing */
+        assert_se(setenv("SYSTEMD_JOURNAL_KEYED_HASH", "1", 1) >= 0);
+        run_test();
+
+        assert_se(setenv("SYSTEMD_JOURNAL_KEYED_HASH", "0", 1) >= 0);
+        run_test();
 
         return 0;
 }
index 7f56668af9541a5badf8bc937efaaf14631e9480..5850bb8eaa347b4a459df798f6214c5b4fe9294b 100644 (file)
@@ -157,7 +157,7 @@ static void test_empty(void) {
         (void) journal_file_close(f4);
 }
 
-#if HAVE_XZ || HAVE_LZ4
+#if HAVE_COMPRESSION
 static bool check_compressed(uint64_t compress_threshold, uint64_t data_size) {
         dual_timestamp ts;
         JournalFile *f;
@@ -251,7 +251,7 @@ int main(int argc, char *argv[]) {
 
         test_non_empty();
         test_empty();
-#if HAVE_XZ || HAVE_LZ4
+#if HAVE_COMPRESSION
         test_min_compress_size();
 #endif
 
index aed30d6118b0e034a865f69f2538f31f77acb1fd..66222eaddbbe1c0564029a6ac36194b5644df788 100644 (file)
@@ -82,6 +82,3 @@ int dhcp_lease_insert_private_option(sd_dhcp_lease *lease, uint8_t tag, const vo
 int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease);
 
 int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const void *client_id, size_t client_id_len);
-
-int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file);
-int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file);
index b0d1216eed847fbd80424f2fc66dc99c96376d43..baf7bb2ef4ad79714fd01f624fdf486b1dc40f1b 100644 (file)
@@ -112,7 +112,7 @@ int dhcp6_option_parse_ip6addrs(uint8_t *optval, uint16_t optlen,
 int dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen,
                                   char ***str_arr);
 
-int dhcp6_network_bind_udp_socket(int index, struct in6_addr *address);
+int dhcp6_network_bind_udp_socket(int ifindex, struct in6_addr *address);
 int dhcp6_network_send_udp_socket(int s, struct in6_addr *address,
                                   const void *packet, size_t len);
 
index f82afe6a0915258fb7fec47dc720694ee541c43d..e2efa8bbe347b12da0400688f1ec64ed284e3244 100644 (file)
 #include "fd-util.h"
 #include "socket-util.h"
 
-int dhcp6_network_bind_udp_socket(int index, struct in6_addr *local_address) {
+int dhcp6_network_bind_udp_socket(int ifindex, struct in6_addr *local_address) {
         union sockaddr_union src = {
                 .in6.sin6_family = AF_INET6,
                 .in6.sin6_port = htobe16(DHCP6_PORT_CLIENT),
-                .in6.sin6_scope_id = index,
+                .in6.sin6_scope_id = ifindex,
         };
         _cleanup_close_ int s = -1;
         int r;
 
-        assert(index > 0);
+        assert(ifindex > 0);
         assert(local_address);
 
         src.in6.sin6_addr = *local_address;
index bdd94867ac33b88c79e0622eaefa151605e26021..d9690293f13e16786ea0331d9e0309d15799a154 100644 (file)
@@ -81,11 +81,11 @@ static int icmp6_bind_router_message(const struct icmp6_filter *filter,
         return TAKE_FD(s);
 }
 
-int icmp6_bind_router_solicitation(int index) {
+int icmp6_bind_router_solicitation(int ifindex) {
         struct icmp6_filter filter = {};
         struct ipv6_mreq mreq = {
                 .ipv6mr_multiaddr = IN6ADDR_ALL_NODES_MULTICAST_INIT,
-                .ipv6mr_interface = index,
+                .ipv6mr_interface = ifindex,
         };
 
         ICMP6_FILTER_SETBLOCKALL(&filter);
@@ -94,11 +94,11 @@ int icmp6_bind_router_solicitation(int index) {
         return icmp6_bind_router_message(&filter, &mreq);
 }
 
-int icmp6_bind_router_advertisement(int index) {
+int icmp6_bind_router_advertisement(int ifindex) {
         struct icmp6_filter filter = {};
         struct ipv6_mreq mreq = {
                 .ipv6mr_multiaddr = IN6ADDR_ALL_ROUTERS_MULTICAST_INIT,
-                .ipv6mr_interface = index,
+                .ipv6mr_interface = ifindex,
         };
 
         ICMP6_FILTER_SETBLOCKALL(&filter);
index 725a68086bc462bf8878f7447eacf3b08bb874c8..ac68ded1fe9653d6b8485a4b990c612a3d86bb95 100644 (file)
@@ -17,8 +17,8 @@
         { { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } }
 
-int icmp6_bind_router_solicitation(int index);
-int icmp6_bind_router_advertisement(int index);
+int icmp6_bind_router_solicitation(int ifindex);
+int icmp6_bind_router_advertisement(int ifindex);
 int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr);
 int icmp6_receive(int fd, void *buffer, size_t size, struct in6_addr *dst,
                   triple_timestamp *timestamp);
index aa61bc2614dbf3b4471b5353c3b28d0bffbf5830..e4c11235b62f2f4f85ae189cb20f52f988fc80bb 100644 (file)
@@ -61,9 +61,13 @@ int deserialize_in6_addrs(struct in6_addr **addresses, const char *string);
 
 /* don't include "dhcp-lease-internal.h" as it causes conflicts between netinet/ip.h and linux/ip.h */
 struct sd_dhcp_route;
+struct sd_dhcp_lease;
 
 void serialize_dhcp_routes(FILE *f, const char *key, sd_dhcp_route **routes, size_t size);
 int deserialize_dhcp_routes(struct sd_dhcp_route **ret, size_t *ret_size, size_t *ret_allocated, const char *string);
 
 /* It is not necessary to add deserialize_dhcp_option(). Use unhexmem() instead. */
 int serialize_dhcp_option(FILE *f, const char *key, const void *data, size_t size);
+
+int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file);
+int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file);
index d5f25d5a194e5cf51e3cdd34fe2e2f8c88d0dcde..8f10b2d9bfc7e961adec4480377bf0f8f8f3c77b 100644 (file)
@@ -376,7 +376,7 @@ int sd_dhcp_client_set_client_id(
         /* For hardware types, log debug message about unexpected data length.
          *
          * Note that infiniband's INFINIBAND_ALEN is 20 bytes long, but only
-         * last last 8 bytes of the address are stable and suitable to put into
+         * the last 8 bytes of the address are stable and suitable to put into
          * the client-id. The caller is advised to account for that. */
         if ((type == ARPHRD_ETHER && data_len != ETH_ALEN) ||
             (type == ARPHRD_INFINIBAND && data_len != 8))
@@ -1441,7 +1441,10 @@ static int client_timeout_t1(sd_event_source *s, uint64_t usec, void *userdata)
         sd_dhcp_client *client = userdata;
         DHCP_CLIENT_DONT_DESTROY(client);
 
-        client->state = DHCP_STATE_RENEWING;
+        if (client->lease)
+                client->state = DHCP_STATE_RENEWING;
+        else if (client->state != DHCP_STATE_INIT)
+                client->state = DHCP_STATE_INIT_REBOOT;
         client->attempt = 0;
 
         return client_initialize_time_events(client);
@@ -2012,6 +2015,9 @@ int sd_dhcp_client_send_renew(sd_dhcp_client *client) {
         assert_return(client, -EINVAL);
         assert_return(client->fd >= 0, -EINVAL);
 
+        if (IN_SET(client->state, DHCP_STATE_INIT, DHCP_STATE_INIT_REBOOT, DHCP_STATE_STOPPED))
+                return 0;
+
         client->start_delay = 0;
         client->attempt = 1;
         client->state = DHCP_STATE_RENEWING;
index 8582302cb48c5997405dbf449e39665c2d34e6e9..0bc5fa321018da09e37dbdee413d9b6471506c77 100644 (file)
@@ -1076,7 +1076,7 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
                            "ADDRESS", &address,
                            "ROUTER", &router,
                            "NETMASK", &netmask,
-                           "SERVER_IDENTIFIER", &server_address,
+                           "SERVER_ADDRESS", &server_address,
                            "NEXT_SERVER", &next_server,
                            "BROADCAST", &broadcast,
                            "DNS", &dns,
index e1572703e2becc713bcb9a715c775508cd334116..5cdb82bc6f30298ec3b3fba0df6f70a04407ee09 100644 (file)
@@ -159,7 +159,7 @@ int sd_dhcp6_client_set_callback(
 int sd_dhcp6_client_set_ifindex(sd_dhcp6_client *client, int ifindex) {
 
         assert_return(client, -EINVAL);
-        assert_return(ifindex >= -1, -EINVAL);
+        assert_return(ifindex > 0, -EINVAL);
         assert_return(IN_SET(client->state, DHCP6_STATE_STOPPED), -EBUSY);
 
         client->ifindex = ifindex;
@@ -1489,7 +1489,7 @@ static int client_receive_message(
                         break;
                 }
 
-                _fallthrough_; /* for Soliciation Rapid Commit option check */
+                _fallthrough_; /* for Solicitation Rapid Commit option check */
         case DHCP6_STATE_REQUEST:
         case DHCP6_STATE_RENEW:
         case DHCP6_STATE_REBIND:
index 7ea6f0d5612d7c3070f5e804e485a296e5506d2b..cc5c0223b5cee459785ec68f94e1176e3747a3b0 100644 (file)
@@ -415,7 +415,7 @@ _public_ int sd_radv_start(sd_radv *ra) {
 
 _public_ int sd_radv_set_ifindex(sd_radv *ra, int ifindex) {
         assert_return(ra, -EINVAL);
-        assert_return(ifindex >= -1, -EINVAL);
+        assert_return(ifindex > 0, -EINVAL);
 
         if (ra->state != SD_RADV_STATE_IDLE)
                 return -EBUSY;
index 80a85661942ea9ea1c55c94de29abef6dd43505c..8f2f4462be3513f9a0ad34c7f3c9cf2010c293b6 100644 (file)
@@ -258,7 +258,7 @@ int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link, const
 }
 
 int dhcp_network_bind_raw_socket(
-                int index,
+                int ifindex,
                 union sockaddr_union *link,
                 uint32_t id,
                 const uint8_t *addr, size_t addr_len,
index 56c8c978e5817f2ca207de2906ea138a66237b82..7af7d670b5917ca2879d52c17855839f733391ae 100644 (file)
@@ -30,7 +30,7 @@ static struct ether_addr mac_addr = {
 
 static sd_event_source *hangcheck;
 static int test_dhcp_fd[2];
-static int test_index = 42;
+static int test_ifindex = 42;
 static int test_client_message_num;
 static be32_t test_iaid = 0;
 static uint8_t test_duid[14] = { };
@@ -48,7 +48,7 @@ static int test_client_basic(sd_event *e) {
 
         assert_se(sd_dhcp6_client_set_ifindex(client, 15) == 0);
         assert_se(sd_dhcp6_client_set_ifindex(client, -42) == -EINVAL);
-        assert_se(sd_dhcp6_client_set_ifindex(client, -1) == 0);
+        assert_se(sd_dhcp6_client_set_ifindex(client, -1) == -EINVAL);
         assert_se(sd_dhcp6_client_set_ifindex(client, 42) >= 0);
 
         assert_se(sd_dhcp6_client_set_mac(client, (const uint8_t *) &mac_addr,
@@ -877,8 +877,8 @@ int dhcp6_network_send_udp_socket(int s, struct in6_addr *server_address,
         return len;
 }
 
-int dhcp6_network_bind_udp_socket(int index, struct in6_addr *local_address) {
-        assert_se(index == test_index);
+int dhcp6_network_bind_udp_socket(int ifindex, struct in6_addr *local_address) {
+        assert_se(ifindex == test_ifindex);
 
         if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, test_dhcp_fd) < 0)
                 return -errno;
@@ -899,7 +899,7 @@ static int test_client_solicit(sd_event *e) {
 
         assert_se(sd_dhcp6_client_attach_event(client, e, 0) >= 0);
 
-        assert_se(sd_dhcp6_client_set_ifindex(client, test_index) == 0);
+        assert_se(sd_dhcp6_client_set_ifindex(client, test_ifindex) == 0);
         assert_se(sd_dhcp6_client_set_mac(client, (const uint8_t *) &mac_addr,
                                           sizeof (mac_addr),
                                           ARPHRD_ETHER) >= 0);
index 6051e65820455a759ca9e41fb5f1484028238dc9..310b658e188a0eb203041ac7f8c6d97e017feed5 100644 (file)
@@ -78,7 +78,7 @@ int arp_send_announcement(int fd, int ifindex,
         return arp_network_send_raw_socket(fd, ifindex, &ea);
 }
 
-int arp_network_bind_raw_socket(int index, be32_t address, const struct ether_addr *eth_mac) {
+int arp_network_bind_raw_socket(int ifindex, be32_t address, const struct ether_addr *eth_mac) {
         if (socketpair(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, test_fd) < 0)
                 return -errno;
 
index 7c6c4663f3b7836d519b0ab24dc859b67b428836..d759ec03a8ad9efbda2a28cfb66855bfc4a7372a 100644 (file)
@@ -159,8 +159,8 @@ static void test_radv(void) {
         assert_se(ra);
 
         assert_se(sd_radv_set_ifindex(NULL, 0) < 0);
-        assert_se(sd_radv_set_ifindex(ra, 0) >= 0);
-        assert_se(sd_radv_set_ifindex(ra, -1) >= 0);
+        assert_se(sd_radv_set_ifindex(ra, 0) < 0);
+        assert_se(sd_radv_set_ifindex(ra, -1) < 0);
         assert_se(sd_radv_set_ifindex(ra, -2) < 0);
         assert_se(sd_radv_set_ifindex(ra, 42) >= 0);
 
@@ -219,12 +219,12 @@ static void test_radv(void) {
         assert_se(!ra);
 }
 
-int icmp6_bind_router_solicitation(int index) {
+int icmp6_bind_router_solicitation(int ifindex) {
         return -ENOSYS;
 }
 
-int icmp6_bind_router_advertisement(int index) {
-        assert_se(index == 42);
+int icmp6_bind_router_advertisement(int ifindex) {
+        assert_se(ifindex == 42);
 
         return test_fd[1];
 }
index 9fc902645c8a9aedb77208de61e874f7beb36940..5d1e66fcdc96900772d66866f71edc8461c9d64e 100644 (file)
@@ -174,8 +174,8 @@ static int test_rs_hangcheck(sd_event_source *s, uint64_t usec,
         return 0;
 }
 
-int icmp6_bind_router_solicitation(int index) {
-        assert_se(index == 42);
+int icmp6_bind_router_solicitation(int ifindex) {
+        assert_se(ifindex == 42);
 
         if (socketpair(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, test_fd) < 0)
                 return -errno;
@@ -183,8 +183,7 @@ int icmp6_bind_router_solicitation(int index) {
         return test_fd[0];
 }
 
-int icmp6_bind_router_advertisement(int index) {
-
+int icmp6_bind_router_advertisement(int ifindex) {
         return -ENOSYS;
 }
 
index 28f98cebce97472e9455d1844a317414a68bdfb8..dc9a2fdc3a56f3f6c37682a31f47f817d24bc98c 100644 (file)
@@ -120,6 +120,8 @@ BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_common_errors[] = {
         SD_BUS_ERROR_MAP(BUS_ERROR_BAD_PASSWORD_AND_NO_TOKEN,    EBADSLT),
         SD_BUS_ERROR_MAP(BUS_ERROR_TOKEN_PIN_NEEDED,             ENOANO),
         SD_BUS_ERROR_MAP(BUS_ERROR_TOKEN_PROTECTED_AUTHENTICATION_PATH_NEEDED, ERFKILL),
+        SD_BUS_ERROR_MAP(BUS_ERROR_TOKEN_USER_PRESENCE_NEEDED,   EMEDIUMTYPE),
+        SD_BUS_ERROR_MAP(BUS_ERROR_TOKEN_ACTION_TIMEOUT,         ENOSTR),
         SD_BUS_ERROR_MAP(BUS_ERROR_TOKEN_PIN_LOCKED,             EOWNERDEAD),
         SD_BUS_ERROR_MAP(BUS_ERROR_TOKEN_BAD_PIN,                ENOLCK),
         SD_BUS_ERROR_MAP(BUS_ERROR_TOKEN_BAD_PIN_FEW_TRIES_LEFT, ETOOMANYREFS),
index 68ecbd65ddddb5425a1e05b7ccda27d741ac6363..ae805438804e5257430bac99fe523716df17d5d1 100644 (file)
 #define BUS_ERROR_BAD_PASSWORD_AND_NO_TOKEN "org.freedesktop.home1.BadPasswordAndNoToken"
 #define BUS_ERROR_TOKEN_PIN_NEEDED "org.freedesktop.home1.TokenPinNeeded"
 #define BUS_ERROR_TOKEN_PROTECTED_AUTHENTICATION_PATH_NEEDED "org.freedesktop.home1.TokenProtectedAuthenticationPathNeeded"
+#define BUS_ERROR_TOKEN_USER_PRESENCE_NEEDED "org.freedesktop.home1.TokenUserPresenceNeeded"
+#define BUS_ERROR_TOKEN_ACTION_TIMEOUT "org.freedesktop.home1.TokenActionTimeout"
 #define BUS_ERROR_TOKEN_PIN_LOCKED "org.freedesktop.home1.TokenPinLocked"
 #define BUS_ERROR_TOKEN_BAD_PIN "org.freedesktop.home1.BadPin"
 #define BUS_ERROR_TOKEN_BAD_PIN_FEW_TRIES_LEFT "org.freedesktop.home1.BadPinFewTriesLeft"
index 7e13f4f73ba965066089852a04fcad405d0a0bff..ef2c3dbc4fde6f034fc841bb0f308fb4843df5ee 100644 (file)
@@ -43,7 +43,7 @@ struct match_callback {
 
         unsigned last_iteration;
 
-        /* Don't dispatch this slot with with messages that arrived in any iteration before or at the this
+        /* Don't dispatch this slot with messages that arrived in any iteration before or at the this
          * one. We use this to ensure that matches don't apply "retroactively" and thus can confuse the
          * caller: matches will only match incoming messages from the moment on the match was installed. */
         uint64_t after;
index f6098549254e1a45868b6e62021c21e8135aa68d..13fd52ffd5ed0ad714126166cce5985307ede492 100644 (file)
@@ -6,6 +6,7 @@
 #include "bus-internal.h"
 #include "bus-track.h"
 #include "bus-util.h"
+#include "string-util.h"
 
 struct track_item {
         unsigned n_ref;
index ee8005833dee58354bd79541c68cd1b100b6a16c..ffec11bbd35c981b1109ed391b772609f52297e0 100644 (file)
@@ -759,30 +759,13 @@ _public_ int sd_device_monitor_filter_add_match_subsystem_devtype(sd_device_moni
 }
 
 _public_ int sd_device_monitor_filter_add_match_tag(sd_device_monitor *m, const char *tag) {
-        _cleanup_free_ char *t = NULL;
-        int r;
-
         assert_return(m, -EINVAL);
         assert_return(tag, -EINVAL);
 
-        t = strdup(tag);
-        if (!t)
-                return -ENOMEM;
-
-        r = set_ensure_allocated(&m->tag_filter, &string_hash_ops);
-        if (r < 0)
-                return r;
-
-        r = set_put(m->tag_filter, t);
-        if (r == -EEXIST)
-                return 0;
-        if (r < 0)
-                return r;
-
-        TAKE_PTR(t);
-        m->filter_uptodate = false;
-
-        return 0;
+        int r = set_put_strdup(&m->tag_filter, tag);
+        if (r > 0)
+                m->filter_uptodate = false;
+        return r;
 }
 
 _public_ int sd_device_monitor_filter_remove(sd_device_monitor *m) {
index 24f34dc18236783069f4c976297acefee6ab68de..bd3b67c55c46ed1dc39cef0c2f0a6019eeb55c8e 100644 (file)
@@ -1564,34 +1564,68 @@ _public_ const char *sd_device_get_property_next(sd_device *device, const char *
         return key;
 }
 
-static int device_sysattrs_read_all(sd_device *device) {
+static int device_sysattrs_read_all_internal(sd_device *device, const char *subdir) {
+        _cleanup_free_ char *path_dir = NULL;
         _cleanup_closedir_ DIR *dir = NULL;
-        const char *syspath;
         struct dirent *dent;
+        const char *syspath;
         int r;
 
-        assert(device);
-
-        if (device->sysattrs_read)
-                return 0;
-
         r = sd_device_get_syspath(device, &syspath);
         if (r < 0)
                 return r;
 
-        dir = opendir(syspath);
+        if (subdir) {
+                _cleanup_free_ char *p = NULL;
+
+                p = path_join(syspath, subdir, "uevent");
+                if (!p)
+                        return -ENOMEM;
+
+                if (access(p, F_OK) >= 0)
+                        /* this is a child device, skipping */
+                        return 0;
+                if (errno != ENOENT) {
+                        log_device_debug_errno(device, errno, "sd-device: Failed to stat %s, ignoring subdir: %m", p);
+                        return 0;
+                }
+
+                path_dir = path_join(syspath, subdir);
+                if (!path_dir)
+                        return -ENOMEM;
+        }
+
+        dir = opendir(path_dir ?: syspath);
         if (!dir)
                 return -errno;
 
         FOREACH_DIRENT_ALL(dent, dir, return -errno) {
-                _cleanup_free_ char *path = NULL;
+                _cleanup_free_ char *path = NULL, *p = NULL;
                 struct stat statbuf;
 
-                /* only handle symlinks and regular files */
-                if (!IN_SET(dent->d_type, DT_LNK, DT_REG))
+                if (dot_or_dot_dot(dent->d_name))
+                        continue;
+
+                /* only handle symlinks, regular files, and directories */
+                if (!IN_SET(dent->d_type, DT_LNK, DT_REG, DT_DIR))
+                        continue;
+
+                if (subdir) {
+                        p = path_join(subdir, dent->d_name);
+                        if (!p)
+                                return -ENOMEM;
+                }
+
+                if (dent->d_type == DT_DIR) {
+                        /* read subdirectory */
+                        r = device_sysattrs_read_all_internal(device, p ?: dent->d_name);
+                        if (r < 0)
+                                return r;
+
                         continue;
+                }
 
-                path = path_join(syspath, dent->d_name);
+                path = path_join(syspath, p ?: dent->d_name);
                 if (!path)
                         return -ENOMEM;
 
@@ -1601,11 +1635,26 @@ static int device_sysattrs_read_all(sd_device *device) {
                 if (!(statbuf.st_mode & S_IRUSR))
                         continue;
 
-                r = set_put_strdup(&device->sysattrs, dent->d_name);
+                r = set_put_strdup(&device->sysattrs, p ?: dent->d_name);
                 if (r < 0)
                         return r;
         }
 
+        return 0;
+}
+
+static int device_sysattrs_read_all(sd_device *device) {
+        int r;
+
+        assert(device);
+
+        if (device->sysattrs_read)
+                return 0;
+
+        r = device_sysattrs_read_all_internal(device, NULL);
+        if (r < 0)
+                return r;
+
         device->sysattrs_read = true;
 
         return 0;
index fb9db47105c06c01b5c5b396a9e064d6bfc2bca8..860eb048ff5be1975a3fdfb140fbaa25587dacb7 100644 (file)
@@ -1450,10 +1450,6 @@ _public_ int sd_event_add_post(
         assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
         assert_return(!event_pid_changed(e), -ECHILD);
 
-        r = set_ensure_allocated(&e->post_sources, NULL);
-        if (r < 0)
-                return r;
-
         s = source_new(e, !ret, SOURCE_POST);
         if (!s)
                 return -ENOMEM;
@@ -1462,9 +1458,10 @@ _public_ int sd_event_add_post(
         s->userdata = userdata;
         s->enabled = SD_EVENT_ON;
 
-        r = set_put(e->post_sources, s);
+        r = set_ensure_put(&e->post_sources, NULL, s);
         if (r < 0)
                 return r;
+        assert(r > 0);
 
         if (ret)
                 *ret = s;
index d9810b2298c4715ac3d9086d0c64bb048e2908dc..060458a534c0a161a053c58256105e1886e3f88e 100644 (file)
@@ -93,9 +93,20 @@ static const NLType rtnl_link_info_data_ipvlan_types[] = {
         [IFLA_IPVLAN_FLAGS]  = { .type = NETLINK_TYPE_U16 },
 };
 
+static const NLType rtnl_macvlan_macaddr_types[] = {
+        [IFLA_MACVLAN_MACADDR] = { .type = NETLINK_TYPE_ETHER_ADDR },
+};
+
+static const NLTypeSystem rtnl_macvlan_macaddr_type_system = {
+        .count = ELEMENTSOF(rtnl_macvlan_macaddr_types),
+        .types = rtnl_macvlan_macaddr_types,
+};
+
 static const NLType rtnl_link_info_data_macvlan_types[] = {
         [IFLA_MACVLAN_MODE]  = { .type = NETLINK_TYPE_U32 },
         [IFLA_MACVLAN_FLAGS] = { .type = NETLINK_TYPE_U16 },
+        [IFLA_MACVLAN_MACADDR_MODE] = { .type = NETLINK_TYPE_U32 },
+        [IFLA_MACVLAN_MACADDR_DATA] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_macvlan_macaddr_type_system },
 };
 
 static const NLType rtnl_link_info_data_bridge_types[] = {
@@ -537,6 +548,43 @@ static const NLTypeSystem rtnl_prop_list_type_system = {
         .types = rtnl_prop_list_types,
 };
 
+static const NLType rtnl_vf_vlan_list_types[] = {
+        [IFLA_VF_VLAN_INFO]  = { .size = sizeof(struct ifla_vf_vlan_info) },
+};
+
+static const NLTypeSystem rtnl_vf_vlan_type_system = {
+        .count = ELEMENTSOF(rtnl_vf_vlan_list_types),
+        .types = rtnl_vf_vlan_list_types,
+};
+
+static const NLType rtnl_vf_vlan_info_types[] = {
+        [IFLA_VF_MAC]           = { .size = sizeof(struct ifla_vf_mac) },
+        [IFLA_VF_VLAN]          = { .size = sizeof(struct ifla_vf_vlan) },
+        [IFLA_VF_VLAN_LIST]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_vf_vlan_type_system},
+        [IFLA_VF_TX_RATE]       = { .size = sizeof(struct ifla_vf_tx_rate) },
+        [IFLA_VF_SPOOFCHK]      = { .size = sizeof(struct ifla_vf_spoofchk) },
+        [IFLA_VF_RATE]          = { .size = sizeof(struct ifla_vf_rate) },
+        [IFLA_VF_LINK_STATE]    = { .size = sizeof(struct ifla_vf_link_state) },
+        [IFLA_VF_RSS_QUERY_EN]  = { .size = sizeof(struct ifla_vf_rss_query_en) },
+        [IFLA_VF_TRUST]         = { .size = sizeof(struct ifla_vf_trust) },
+        [IFLA_VF_IB_NODE_GUID]  = { .size = sizeof(struct ifla_vf_guid) },
+        [IFLA_VF_IB_PORT_GUID]  = { .size = sizeof(struct ifla_vf_guid) },
+};
+
+static const NLTypeSystem rtnl_vf_vlan_info_type_system = {
+        .count = ELEMENTSOF(rtnl_vf_vlan_info_types),
+        .types = rtnl_vf_vlan_info_types,
+};
+
+static const NLType rtnl_link_io_srv_types[] = {
+        [IFLA_VF_INFO] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_vf_vlan_info_type_system },
+};
+
+static const NLTypeSystem rtnl_io_srv_type_system = {
+        .count = ELEMENTSOF(rtnl_link_io_srv_types),
+        .types = rtnl_link_io_srv_types,
+};
+
 static const NLType rtnl_link_types[] = {
         [IFLA_ADDRESS]          = { .type = NETLINK_TYPE_ETHER_ADDR },
         [IFLA_BROADCAST]        = { .type = NETLINK_TYPE_ETHER_ADDR },
@@ -564,10 +612,8 @@ static const NLType rtnl_link_types[] = {
         [IFLA_LINKINFO]         = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_info_type_system },
         [IFLA_NET_NS_PID]       = { .type = NETLINK_TYPE_U32 },
         [IFLA_IFALIAS]          = { .type = NETLINK_TYPE_STRING, .size = IFALIASZ - 1 },
-/*
-        [IFLA_NUM_VF],
-        [IFLA_VFINFO_LIST]      = {. type = NETLINK_TYPE_NESTED, },
-*/
+        [IFLA_NUM_VF]           = { .type = NETLINK_TYPE_U32 },
+        [IFLA_VFINFO_LIST]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_io_srv_type_system },
         [IFLA_STATS64]          = { .size = sizeof(struct rtnl_link_stats64) },
 /*
         [IFLA_VF_PORTS]         = { .type = NETLINK_TYPE_NESTED },
@@ -762,6 +808,32 @@ static const NLType rtnl_tca_option_data_drr_types[] = {
         [TCA_DRR_QUANTUM] = { .type = NETLINK_TYPE_U32 },
 };
 
+static const NLType rtnl_tca_option_data_ets_quanta_types[] = {
+        [TCA_ETS_QUANTA_BAND] = { .type = NETLINK_TYPE_U32, },
+};
+
+static const NLTypeSystem rtnl_tca_option_data_ets_quanta_type_system = {
+        .count = ELEMENTSOF(rtnl_tca_option_data_ets_quanta_types),
+        .types = rtnl_tca_option_data_ets_quanta_types,
+};
+
+static const NLType rtnl_tca_option_data_ets_prio_types[] = {
+        [TCA_ETS_PRIOMAP_BAND] = { .type = NETLINK_TYPE_U8, },
+};
+
+static const NLTypeSystem rtnl_tca_option_data_ets_prio_type_system = {
+        .count = ELEMENTSOF(rtnl_tca_option_data_ets_prio_types),
+        .types = rtnl_tca_option_data_ets_prio_types,
+};
+
+static const NLType rtnl_tca_option_data_ets_types[] = {
+        [TCA_ETS_NBANDS]      = { .type = NETLINK_TYPE_U8 },
+        [TCA_ETS_NSTRICT]     = { .type = NETLINK_TYPE_U8 },
+        [TCA_ETS_QUANTA]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_tca_option_data_ets_quanta_type_system },
+        [TCA_ETS_PRIOMAP]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_tca_option_data_ets_prio_type_system },
+        [TCA_ETS_QUANTA_BAND] = { .type = NETLINK_TYPE_U32 },
+};
+
 static const NLType rtnl_tca_option_data_fq_types[] = {
         [TCA_FQ_PLIMIT]             = { .type = NETLINK_TYPE_U32 },
         [TCA_FQ_FLOW_PLIMIT]        = { .type = NETLINK_TYPE_U32 },
@@ -833,6 +905,7 @@ static const char* const nl_union_tca_option_data_table[] = {
         [NL_UNION_TCA_OPTION_DATA_CAKE] = "cake",
         [NL_UNION_TCA_OPTION_DATA_CODEL] = "codel",
         [NL_UNION_TCA_OPTION_DATA_DRR] = "drr",
+        [NL_UNION_TCA_OPTION_DATA_ETS] = "ets",
         [NL_UNION_TCA_OPTION_DATA_FQ] = "fq",
         [NL_UNION_TCA_OPTION_DATA_FQ_CODEL] = "fq_codel",
         [NL_UNION_TCA_OPTION_DATA_GRED] = "gred",
@@ -853,6 +926,8 @@ static const NLTypeSystem rtnl_tca_option_data_type_systems[] = {
                                                    .types = rtnl_tca_option_data_codel_types },
         [NL_UNION_TCA_OPTION_DATA_DRR] =         { .count = ELEMENTSOF(rtnl_tca_option_data_drr_types),
                                                    .types = rtnl_tca_option_data_drr_types },
+        [NL_UNION_TCA_OPTION_DATA_ETS] =         { .count = ELEMENTSOF(rtnl_tca_option_data_ets_types),
+                                                   .types = rtnl_tca_option_data_ets_types },
         [NL_UNION_TCA_OPTION_DATA_FQ] =          { .count = ELEMENTSOF(rtnl_tca_option_data_fq_types),
                                                    .types = rtnl_tca_option_data_fq_types },
         [NL_UNION_TCA_OPTION_DATA_FQ_CODEL] =    { .count = ELEMENTSOF(rtnl_tca_option_data_fq_codel_types),
index 1a0e1997cc170243d3ae3cb75024518b6311377a..058747a2e9f6cef089a7f6c75ab88e0faf65f09b 100644 (file)
@@ -99,6 +99,7 @@ typedef enum NLUnionTCAOptionData {
         NL_UNION_TCA_OPTION_DATA_CAKE,
         NL_UNION_TCA_OPTION_DATA_CODEL,
         NL_UNION_TCA_OPTION_DATA_DRR,
+        NL_UNION_TCA_OPTION_DATA_ETS,
         NL_UNION_TCA_OPTION_DATA_FQ,
         NL_UNION_TCA_OPTION_DATA_FQ_CODEL,
         NL_UNION_TCA_OPTION_DATA_GRED,
index 30f47244ada090405e823bc64cddeebf3ecf0dbf..ce6ae846c5041e828cd2ef0a4cb85af53e755a65 100644 (file)
@@ -168,10 +168,6 @@ _public_ int sd_network_link_get_address_state(int ifindex, char **state) {
         return network_link_get_string(ifindex, "ADDRESS_STATE", state);
 }
 
-_public_ int sd_network_link_get_dhcp4_client_id_string(int ifindex, char **client_id) {
-        return network_link_get_string(ifindex, "DHCP4_CLIENT_ID", client_id);
-}
-
 _public_ int sd_network_link_get_dhcp6_client_iaid_string(int ifindex, char **iaid) {
         return network_link_get_string(ifindex, "DHCP6_CLIENT_IAID", iaid);
 }
@@ -236,14 +232,6 @@ _public_ int sd_network_link_get_dnssec_negative_trust_anchors(int ifindex, char
         return network_link_get_strv(ifindex, "DNSSEC_NTA", nta);
 }
 
-_public_ int sd_network_link_get_timezone(int ifindex, char **ret) {
-        return network_link_get_string(ifindex, "TIMEZONE", ret);
-}
-
-_public_ int sd_network_link_get_dhcp4_address(int ifindex, char **ret) {
-        return network_link_get_string(ifindex, "DHCP4_ADDRESS", ret);
-}
-
 _public_ int sd_network_link_get_dns(int ifindex, char ***ret) {
         return network_link_get_strv(ifindex, "DNS", ret);
 }
index 37660d0313f0bbbdacb6d1096e62a5bca88f7f2d..4a471fb90d139bedb02f382e7196c980ee542ec7 100644 (file)
@@ -154,8 +154,8 @@ size_t util_replace_whitespace(const char *str, char *to, size_t len) {
         return j;
 }
 
-/* allow chars in whitelist, plain ascii, hex-escaping and valid utf8 */
-size_t util_replace_chars(char *str, const char *white) {
+/* allow chars in allow list, plain ascii, hex-escaping and valid utf8 */
+size_t util_replace_chars(char *str, const char *allow) {
         size_t i = 0, replaced = 0;
 
         assert(str);
@@ -163,7 +163,7 @@ size_t util_replace_chars(char *str, const char *white) {
         while (str[i] != '\0') {
                 int len;
 
-                if (whitelisted_char_for_devnode(str[i], white)) {
+                if (allow_listed_char_for_devnode(str[i], allow)) {
                         i++;
                         continue;
                 }
@@ -182,7 +182,7 @@ size_t util_replace_chars(char *str, const char *white) {
                 }
 
                 /* if space is allowed, replace whitespace with ordinary space */
-                if (isspace(str[i]) && white && strchr(white, ' ')) {
+                if (isspace(str[i]) && allow && strchr(allow, ' ')) {
                         str[i] = ' ';
                         i++;
                         replaced++;
index b7548a0f7f561c69382f90858a98d30a349400a8..251901c3919f2221fcf4e69ac4e18ca9883365b3 100644 (file)
@@ -8,7 +8,8 @@
 #include "sd-bus.h"
 
 #include "bus-error.h"
-#include "bus-util.h"
+#include "bus-locator.h"
+#include "bus-map-properties.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "kbd-util.h"
@@ -502,9 +503,7 @@ static int run(int argc, char *argv[]) {
         int r;
 
         setlocale(LC_ALL, "");
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 8ffcf306b5b74aec4de5593f0ea8e86d2e403e5b..715ce5cac7e07c5bbcedc5552ab1eee3269561b7 100644 (file)
@@ -18,6 +18,7 @@
 #include "bus-message.h"
 #include "bus-polkit.h"
 #include "def.h"
+#include "dlfcn-util.h"
 #include "keymap-util.h"
 #include "locale-util.h"
 #include "macro.h"
@@ -530,7 +531,7 @@ static int verify_xkb_rmlvo(const char *model, const char *layout, const char *v
         };
         struct xkb_context *ctx = NULL;
         struct xkb_keymap *km = NULL;
-        void *dl;
+        _cleanup_(dlclosep) void *dl = NULL;
         int r;
 
         /* Compile keymap from RMLVO information to check out its validity */
@@ -582,7 +583,6 @@ finish:
         if (symbol_xkb_context_unref && ctx)
                 symbol_xkb_context_unref(ctx);
 
-        (void) dlclose(dl);
         return r;
 }
 
@@ -788,7 +788,10 @@ static int run(int argc, char *argv[]) {
                 return r;
 
         umask(0022);
-        mac_selinux_init();
+
+        r = mac_selinux_init();
+        if (r < 0)
+                return r;
 
         assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
 
index e87a10ebeb51fbfc08628b4bf2ef7b61c8a61b59..314b0a3d3799de5c2bdf97790962a0999f5e9f5b 100644 (file)
@@ -34,5 +34,5 @@ tests += [
           'src/locale/keymap-util.c',
           'src/locale/keymap-util.h'],
          [libshared],
-         [libdl]],
+         []],
 ]
index a1602031b4b6af0ad359b87d63531aa0a34146d8..e3866eee55a711010362c229c8ed80b50e669aac 100644 (file)
@@ -132,13 +132,13 @@ static int print_inhibitors(sd_bus *bus) {
         if (table_get_rows(table) > 1) {
                 r = table_set_sort(table, (size_t) 1, (size_t) 0, (size_t) 5, (size_t) 6, (size_t) -1);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to sort table: %m");
+                        return table_log_sort_error(r);
 
                 table_set_header(table, arg_legend);
 
                 r = table_print(table, NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to show table: %m");
+                        return table_log_print_error(r);
         }
 
         if (arg_legend) {
index 7805863d8ddfb8f63a074af800516ce9580cedf5..2b48a9acb792c52e079e1d83ddd1b9ea5c7434d8 100644 (file)
@@ -9,8 +9,10 @@
 
 #include "alloc-util.h"
 #include "bus-error.h"
+#include "bus-locator.h"
+#include "bus-map-properties.h"
+#include "bus-print-properties.h"
 #include "bus-unit-procs.h"
-#include "bus-util.h"
 #include "cgroup-show.h"
 #include "cgroup-util.h"
 #include "format-table.h"
@@ -89,7 +91,7 @@ static int show_table(Table *table, const char *word) {
         if (table_get_rows(table) > 1 || OUTPUT_MODE_IS_JSON(arg_output)) {
                 r = table_set_sort(table, (size_t) 0, (size_t) -1);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to sort table: %m");
+                        return table_log_sort_error(r);
 
                 table_set_header(table, arg_legend);
 
@@ -98,7 +100,7 @@ static int show_table(Table *table, const char *word) {
                 else
                         r = table_print(table, NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to show table: %m");
+                        return table_log_print_error(r);
         }
 
         if (arg_legend) {
@@ -1460,9 +1462,7 @@ static int run(int argc, char *argv[]) {
         int r;
 
         setlocale(LC_ALL, "");
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         /* The journal merging logic potentially needs a lot of fds. */
         (void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
index 3f4b65e1fdf16ab9333c1454d27b056e0a96cd92..450ec320443a4cf63bc3b28a01e6b7ec3713a4df 100644 (file)
@@ -174,15 +174,11 @@ static int set_add_message(Set **set, sd_bus_message *message) {
         if (r <= 0)
                 return r;
 
-        r = set_ensure_allocated(set, &bus_message_hash_ops);
-        if (r < 0)
-                return r;
-
-        r = set_put(*set, message);
-        if (r < 0)
+        r = set_ensure_put(set, &bus_message_hash_ops, message);
+        if (r <= 0)
                 return r;
-
         sd_bus_message_ref(message);
+
         return 1;
 }
 
index 4289461df6872fa602e3a691c8cc705f7a5df744..480ec1927b03cc5b513815b26686fb9306823ad9 100644 (file)
@@ -4,9 +4,6 @@
 #include <sys/ioctl.h>
 #include <sys/types.h>
 #include <linux/vt.h>
-#if ENABLE_UTMP
-#include <utmpx.h>
-#endif
 
 #include "sd-device.h"
 
@@ -29,6 +26,7 @@
 #include "udev-util.h"
 #include "user-util.h"
 #include "userdb.h"
+#include "utmp-wtmp.h"
 
 void manager_reset_config(Manager *m) {
         assert(m);
@@ -601,10 +599,10 @@ static int manager_count_external_displays(Manager *m) {
                 if (sd_device_get_sysname(d, &nn) < 0)
                         continue;
 
-                /* Ignore internal displays: the type is encoded in the sysfs name, as the second dash separated item
-                 * (the first is the card name, the last the connector number). We implement a blacklist of external
-                 * displays here, rather than a whitelist of internal ones, to ensure we don't block suspends too
-                 * eagerly. */
+                /* Ignore internal displays: the type is encoded in the sysfs name, as the second dash
+                 * separated item (the first is the card name, the last the connector number). We implement a
+                 * deny list of external displays here, rather than an allow list of internal ones, to ensure
+                 * we don't block suspends too eagerly. */
                 dash = strchr(nn, '-');
                 if (!dash)
                         continue;
@@ -685,13 +683,14 @@ bool manager_all_buttons_ignored(Manager *m) {
 int manager_read_utmp(Manager *m) {
 #if ENABLE_UTMP
         int r;
+        _cleanup_(utxent_cleanup) bool utmpx = false;
 
         assert(m);
 
         if (utmpxname(_PATH_UTMPX) < 0)
                 return log_error_errno(errno, "Failed to set utmp path to " _PATH_UTMPX ": %m");
 
-        setutxent();
+        utmpx = utxent_start();
 
         for (;;) {
                 _cleanup_free_ char *t = NULL;
@@ -704,8 +703,7 @@ int manager_read_utmp(Manager *m) {
                 if (!u) {
                         if (errno != 0)
                                 log_warning_errno(errno, "Failed to read " _PATH_UTMPX ", ignoring: %m");
-                        r = 0;
-                        break;
+                        return 0;
                 }
 
                 if (u->ut_type != USER_PROCESS)
@@ -715,18 +713,14 @@ int manager_read_utmp(Manager *m) {
                         continue;
 
                 t = strndup(u->ut_line, sizeof(u->ut_line));
-                if (!t) {
-                        r = log_oom();
-                        break;
-                }
+                if (!t)
+                        return log_oom();
 
                 c = path_startswith(t, "/dev/");
                 if (c) {
                         r = free_and_strdup(&t, c);
-                        if (r < 0) {
-                                log_oom();
-                                break;
-                        }
+                        if (r < 0)
+                                return log_oom();
                 }
 
                 if (isempty(t))
@@ -756,8 +750,6 @@ int manager_read_utmp(Manager *m) {
                 log_debug("Acquired TTY information '%s' from utmp for session '%s'.", s->tty, s->id);
         }
 
-        endutxent();
-        return r;
 #else
         return 0;
 #endif
index 7fed32c3b416bf6f60ce13c12c7ab4c4378a704c..1b6304b57f54ef93bb48d7b59327ec34dde65415 100644 (file)
@@ -12,6 +12,8 @@
 #include "bootspec.h"
 #include "bus-common-errors.h"
 #include "bus-error.h"
+#include "bus-get-properties.h"
+#include "bus-locator.h"
 #include "bus-polkit.h"
 #include "bus-unit-util.h"
 #include "bus-util.h"
@@ -2751,8 +2753,6 @@ static int property_get_reboot_to_boot_loader_menu(
 
         r = getenv_bool("SYSTEMD_REBOOT_TO_BOOT_LOADER_MENU");
         if (r == -ENXIO) {
-                _cleanup_free_ char *v = NULL;
-
                 /* EFI case: returns the current value of LoaderConfigTimeoutOneShot. Three cases are distuingished:
                  *
                  *     1. Variable not set, boot into boot loader menu is not enabled (we return UINT64_MAX to the user)
@@ -2760,20 +2760,10 @@ static int property_get_reboot_to_boot_loader_menu(
                  *     3. Variable set to numeric value formatted in ASCII, boot into boot loader menu with the specified timeout in seconds
                  */
 
-                r = efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderConfigTimeoutOneShot", &v);
+                r = efi_loader_get_config_timeout_one_shot(&x);
                 if (r < 0) {
                         if (r != -ENOENT)
-                                log_warning_errno(r, "Failed to read LoaderConfigTimeoutOneShot variable: %m");
-                } else {
-                        uint64_t sec;
-
-                        r = safe_atou64(v, &sec);
-                        if (r < 0)
-                                log_warning_errno(r, "Failed to parse LoaderConfigTimeoutOneShot value '%s': %m", v);
-                        else if (sec > (USEC_INFINITY / USEC_PER_SEC))
-                                log_warning("LoaderConfigTimeoutOneShot too large, ignoring: %m");
-                        else
-                                x = sec * USEC_PER_SEC; /* return in µs */
+                                log_warning_errno(r, "Failed to read LoaderConfigTimeoutOneShot variable, ignoring: %m");
                 }
 
         } else if (r < 0)
@@ -2932,24 +2922,25 @@ static int property_get_reboot_to_boot_loader_entry(
                 sd_bus_error *error) {
 
         _cleanup_free_ char *v = NULL;
+        Manager *m = userdata;
+        const char *x = NULL;
         int r;
 
         assert(bus);
         assert(reply);
-        assert(userdata);
+        assert(m);
 
         r = getenv_bool("SYSTEMD_REBOOT_TO_BOOT_LOADER_ENTRY");
         if (r == -ENXIO) {
                 /* EFI case: let's read the LoaderEntryOneShot variable */
 
-                r = efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderEntryOneShot", &v);
+                r = efi_loader_update_entry_one_shot_cache(&m->efi_loader_entry_one_shot, &m->efi_loader_entry_one_shot_stat);
                 if (r < 0) {
                         if (r != -ENOENT)
-                                log_warning_errno(r, "Failed to read LoaderEntryOneShot variable: %m");
-                } else if (!efi_loader_entry_name_valid(v)) {
-                        log_warning("LoaderEntryOneShot contains invalid entry name '%s', ignoring.", v);
-                        v = mfree(v);
-                }
+                                log_warning_errno(r, "Failed to read LoaderEntryOneShot variable, ignoring: %m");
+                } else
+                        x = m->efi_loader_entry_one_shot;
+
         } else if (r < 0)
                 log_warning_errno(r, "Failed to parse $SYSTEMD_REBOOT_TO_BOOT_LOADER_ENTRY: %m");
         else if (r > 0) {
@@ -2959,14 +2950,14 @@ static int property_get_reboot_to_boot_loader_entry(
                 r = read_one_line_file("/run/systemd/reboot-to-boot-loader-entry", &v);
                 if (r < 0) {
                         if (r != -ENOENT)
-                                log_warning_errno(r, "Failed to read /run/systemd/reboot-to-boot-loader-entry: %m");
-                } else if (!efi_loader_entry_name_valid(v)) {
+                                log_warning_errno(r, "Failed to read /run/systemd/reboot-to-boot-loader-entry, ignoring: %m");
+                } else if (!efi_loader_entry_name_valid(v))
                         log_warning("/run/systemd/reboot-to-boot-loader-entry is not valid, ignoring.");
-                        v = mfree(v);
-                }
+                else
+                        x = v;
         }
 
-        return sd_bus_message_append(reply, "s", v);
+        return sd_bus_message_append(reply, "s", x);
 }
 
 static int boot_loader_entry_exists(Manager *m, const char *id) {
index 6a3ee82f1c9ec198dc1c3e76025b5cac842f1dfb..77075875452997d19fc25d2c7b7b37fbb887573f 100644 (file)
@@ -3,10 +3,10 @@
 
 #include "sd-bus.h"
 
-#include "bus-util.h"
-#include "logind.h"
+#include "bus-object.h"
 #include "logind-session.h"
 #include "logind-user.h"
+#include "logind.h"
 
 int manager_get_session_from_creds(Manager *m, sd_bus_message *message, const char *name, sd_bus_error *error, Session **ret);
 int manager_get_user_from_creds(Manager *m, sd_bus_message *message, uid_t uid, sd_bus_error *error, User **ret);
index e72f265185b03d60f47a07040bf9d05d1a02b953..a91765205c83ab47a6ba41e2f9db10939df18205 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "alloc-util.h"
 #include "bus-common-errors.h"
+#include "bus-get-properties.h"
 #include "bus-label.h"
 #include "bus-polkit.h"
 #include "bus-util.h"
index 5fc857584ef04571a414bc7e8fdb105939ae388b..6169cfe1edf734bf3e73f96902677741f4dabcda 100644 (file)
@@ -3,8 +3,8 @@
 
 #include "sd-bus.h"
 
+#include "bus-object.h"
 #include "logind-seat.h"
-#include "bus-util.h"
 
 extern const BusObjectImplementation seat_object;
 
index 3857f4ab7d45120c0815235c32803f199be9680b..5ed20ebd26cd14f675fd371ed585f5fa22496215 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "alloc-util.h"
 #include "bus-common-errors.h"
+#include "bus-get-properties.h"
 #include "bus-label.h"
 #include "bus-polkit.h"
 #include "bus-util.h"
index 6df96e06b2d8d4b200e8440f770dea7aee878c39..97f7c413cbff8c2c00e4ab5928768e268762d71c 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "sd-bus.h"
 
+#include "bus-object.h"
 #include "logind-session.h"
 
 extern const BusObjectImplementation session_object;
index 63c77cab396f426fe1a5d5b01c34afa77e902246..237723729e38c17bd0c240ec1027f6765f537c2d 100644 (file)
@@ -3,6 +3,7 @@
 #include <errno.h>
 
 #include "alloc-util.h"
+#include "bus-get-properties.h"
 #include "bus-polkit.h"
 #include "bus-util.h"
 #include "format-util.h"
index dc746a2c9edef1ff39227809a6fcd9f09fa69bff..c50a083b0325624809cb03e84741aba920f9d5a4 100644 (file)
@@ -10,9 +10,9 @@
 
 #include "alloc-util.h"
 #include "bus-error.h"
+#include "bus-locator.h"
 #include "bus-log-control-api.h"
 #include "bus-polkit.h"
-#include "bus-util.h"
 #include "cgroup-util.h"
 #include "def.h"
 #include "device-util.h"
@@ -169,6 +169,7 @@ static Manager* manager_unref(Manager *m) {
         free(m->action_job);
 
         strv_free(m->efi_boot_loader_entries);
+        free(m->efi_loader_entry_one_shot);
 
         return mfree(m);
 }
@@ -1173,7 +1174,7 @@ static int run(int argc, char *argv[]) {
 
         r = mac_selinux_init();
         if (r < 0)
-                return log_error_errno(r, "Could not initialize labelling: %m");
+                return r;
 
         /* Always create the directories people can create inotify watches in. Note that some applications might check
          * for the existence of /run/systemd/seats/ to determine whether logind is available, so please always make
index 7dbf0c28e18ad18c1734b99d15006a4a2dc656ea..e64ecce8e2810b8380465d7b2b2cb96000c0a89c 100644 (file)
@@ -126,6 +126,9 @@ struct Manager {
 
         char **efi_boot_loader_entries;
         bool efi_boot_loader_entries_set;
+
+        char *efi_loader_entry_one_shot;
+        struct stat efi_loader_entry_one_shot_stat;
 };
 
 void manager_reset_config(Manager *m);
index 7d48e896de47f14fb91da6461e441f1530425e55..16f42895854df7fa5ec58c3bf5eb4728e1e680e0 100644 (file)
@@ -20,7 +20,7 @@
 #include "bus-common-errors.h"
 #include "bus-error.h"
 #include "bus-internal.h"
-#include "bus-util.h"
+#include "bus-locator.h"
 #include "cgroup-setup.h"
 #include "errno-util.h"
 #include "fd-util.h"
@@ -468,7 +468,7 @@ static bool validate_runtime_directory(pam_handle_t *handle, const char *path, u
         /* Some extra paranoia: let's not set $XDG_RUNTIME_DIR if the directory we'd set it to isn't actually
          * set up properly for us. This is supposed to provide a careful safety net for supporting su/sudo
          * type transitions: in that case the UID changes, but the session and thus the user owning it
-         * doesn't change. Since the $XDG_RUNTIME_DIR life-cycle is bound to the session's user being logged
+         * doesn't change. Since the $XDG_RUNTIME_DIR lifecycle is bound to the session's user being logged
          * in at least once we should be particularly careful when setting the environment variable, since
          * otherwise we might end up setting $XDG_RUNTIME_DIR to some directory owned by the wrong user. */
 
index fdf0124c4168f06331db6d0049b01a54c9edaa94..38058d7b2a3f918ff60c0cd039e3216cd44625d5 100644 (file)
@@ -192,11 +192,11 @@ static int run(int argc, char *argv[]) {
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                        "First argument must be either \"start\" or \"stop\".");
 
+        umask(0022);
+
         r = mac_selinux_init();
         if (r < 0)
-                return log_error_errno(r, "Could not initialize labelling: %m\n");
-
-        umask(0022);
+                return r;
 
         if (streq(argv[1], "start"))
                 return do_mount(argv[2]);
index 4305f4915224ac4f4910bcf6bbad4dfc1c571f83..7a15bcc49a44942fa38e73eda43ddba887376f52 100644 (file)
@@ -4,9 +4,9 @@
 #include <sys/mount.h>
 
 #include "alloc-util.h"
+#include "bus-get-properties.h"
 #include "bus-label.h"
 #include "bus-polkit.h"
-#include "bus-util.h"
 #include "copy.h"
 #include "dissect-image.h"
 #include "fd-util.h"
index 43f5f34d209ee16af8623b74298de9d2de6be2e4..d785c10817dfaf590fd0fd444625062655b8fe8b 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 #pragma once
 
-#include "bus-util.h"
+#include "bus-object.h"
 #include "machined.h"
 
 extern const BusObjectImplementation image_object;
index 903dd8f161770bee2e8c318ed6165567bf2d4ba8..73ef5949bf366f6e5ad4ed10120ac4afb251f809 100644 (file)
 
 #include "alloc-util.h"
 #include "bus-common-errors.h"
+#include "bus-get-properties.h"
 #include "bus-internal.h"
 #include "bus-label.h"
+#include "bus-locator.h"
 #include "bus-polkit.h"
-#include "bus-util.h"
 #include "copy.h"
 #include "env-file.h"
 #include "env-util.h"
index d88b2651d2c5118bf57ee7648aa85dac8dad82f3..26fa48d870c1dacb73ba915ccf988d2ee74831f0 100644 (file)
 #include "alloc-util.h"
 #include "bus-common-errors.h"
 #include "bus-error.h"
+#include "bus-locator.h"
+#include "bus-map-properties.h"
+#include "bus-print-properties.h"
 #include "bus-unit-procs.h"
 #include "bus-unit-util.h"
-#include "bus-util.h"
 #include "bus-wait-for-jobs.h"
 #include "cgroup-show.h"
 #include "cgroup-util.h"
@@ -235,7 +237,7 @@ static int show_table(Table *table, const char *word) {
         if (table_get_rows(table) > 1 || OUTPUT_MODE_IS_JSON(arg_output)) {
                 r = table_set_sort(table, (size_t) 0, (size_t) -1);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to sort table: %m");
+                        return table_log_sort_error(r);
 
                 table_set_header(table, arg_legend);
 
@@ -244,7 +246,7 @@ static int show_table(Table *table, const char *word) {
                 else
                         r = table_print(table, NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to show table: %m");
+                        return table_log_print_error(r);
         }
 
         if (arg_legend) {
@@ -2882,9 +2884,7 @@ static int run(int argc, char *argv[]) {
         int r;
 
         setlocale(LC_ALL, "");
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         /* The journal merging logic potentially needs a lot of fds. */
         (void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
index cbc549cb768cbb79bfcbff259ae3db487e5891df..2d9c180aa433c353b8a85f55459bf95d5f1517aa 100644 (file)
@@ -8,8 +8,9 @@
 #include "alloc-util.h"
 #include "btrfs-util.h"
 #include "bus-common-errors.h"
+#include "bus-get-properties.h"
+#include "bus-locator.h"
 #include "bus-polkit.h"
-#include "bus-util.h"
 #include "cgroup-util.h"
 #include "errno-util.h"
 #include "fd-util.h"
index 015622761cbdea4824f9dc3f66c9c76052518d82..4645e4ce418e768d498310a2a69fc410432be1a3 100644 (file)
@@ -10,9 +10,9 @@
 
 #include "alloc-util.h"
 #include "bus-error.h"
+#include "bus-locator.h"
 #include "bus-log-control-api.h"
 #include "bus-polkit.h"
-#include "bus-util.h"
 #include "cgroup-util.h"
 #include "dirent-util.h"
 #include "fd-util.h"
index ea86a6e06a9e5100b8e57a6ed7b1b277b312da65..84d5288c75e14c33a94adc2532fe5f5cdcf5760a 100644 (file)
@@ -6,8 +6,8 @@
 #include "sd-device.h"
 
 #include "bus-error.h"
+#include "bus-locator.h"
 #include "bus-unit-util.h"
-#include "bus-util.h"
 #include "bus-wait-for-jobs.h"
 #include "device-util.h"
 #include "dirent-util.h"
@@ -1436,7 +1436,7 @@ static int list_devices(void) {
 
         r = table_print(table, NULL);
         if (r < 0)
-                return log_error_errno(r, "Failed to print table: %m");
+                return table_log_print_error(r);
 
         return 0;
 }
index 9d5cdfa5160005e45445db9fbe8bd4715b281cb0..b3a88d991035677fbfc9d364b566f10e2edf908d 100644 (file)
@@ -105,6 +105,8 @@ sources = files('''
         networkd-routing-policy-rule.h
         networkd-speed-meter.c
         networkd-speed-meter.h
+        networkd-sriov.c
+        networkd-sriov.h
         networkd-util.c
         networkd-util.h
         networkd-wifi.c
@@ -115,6 +117,8 @@ sources = files('''
         tc/codel.h
         tc/drr.c
         tc/drr.h
+        tc/ets.c
+        tc/ets.h
         tc/fifo.c
         tc/fifo.h
         tc/fq.c
index 23bd3e1e46476451e8110dd17f70a797ebebedde..8c1ba11e5fd4ef258c5661204ffdd73c135ef8ae 100644 (file)
@@ -327,7 +327,7 @@ int config_parse_arp_ip_target_address(
                 r = extract_first_word(&rvalue, &n, NULL, 0);
                 if (r < 0) {
                         log_syntax(unit, LOG_ERR, filename, line, r,
-                                   "Failed to parse Bond ARP ip target address, ignoring assignment: %s",
+                                   "Failed to parse Bond ARP IP target address, ignoring assignment: %s",
                                    rvalue);
                         return 0;
                 }
@@ -337,7 +337,7 @@ int config_parse_arp_ip_target_address(
                 r = in_addr_from_string(AF_INET, n, &ip);
                 if (r < 0) {
                         log_syntax(unit, LOG_ERR, filename, line, r,
-                                   "Bond ARP ip target address is invalid, ignoring assignment: %s", n);
+                                   "Bond ARP IP target address is invalid, ignoring assignment: %s", n);
                         continue;
                 }
 
@@ -347,7 +347,7 @@ int config_parse_arp_ip_target_address(
 
                 if (ordered_set_size(b->arp_ip_targets) >= NETDEV_BOND_ARP_TARGETS_MAX) {
                         log_syntax(unit, LOG_WARNING, filename, line, 0,
-                                   "Too many ARP ip targets are specified. The maximum number is %d. Ignoring assignment: %s",
+                                   "Too many ARP IP targets are specified. The maximum number is %d. Ignoring assignment: %s",
                                    NETDEV_BOND_ARP_TARGETS_MAX, n);
                         continue;
                 }
@@ -355,10 +355,10 @@ int config_parse_arp_ip_target_address(
                 r = ordered_set_put(b->arp_ip_targets, UINT32_TO_PTR(ip.in.s_addr));
                 if (r == -EEXIST)
                         log_syntax(unit, LOG_WARNING, filename, line, r,
-                                   "Bond ARP ip target address is duplicated, ignoring assignment: %s", n);
+                                   "Bond ARP IP target address is duplicated, ignoring assignment: %s", n);
                 if (r < 0)
                         log_syntax(unit, LOG_ERR, filename, line, r,
-                                   "Failed to store bond ARP ip target address '%s', ignoring assignment: %m", n);
+                                   "Failed to store bond ARP IP target address '%s', ignoring assignment: %m", n);
         }
 }
 
index e41ed9e6ed7a062d0303dc8878f9ad8477c82e39..41391788b083f53bc3a81a168017d739e9fa9b17 100644 (file)
@@ -23,6 +23,29 @@ static int netdev_macvlan_fill_message_create(NetDev *netdev, Link *link, sd_net
 
         assert(m);
 
+        if (m->mode == NETDEV_MACVLAN_MODE_SOURCE && !set_isempty(m->match_source_mac)) {
+                Iterator i;
+                const struct ether_addr *mac_addr;
+
+                r = sd_netlink_message_append_u32(req, IFLA_MACVLAN_MACADDR_MODE, MACVLAN_MACADDR_SET);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_MACVLAN_MACADDR_MODE attribute: %m");
+
+                r = sd_netlink_message_open_container(req, IFLA_MACVLAN_MACADDR_DATA);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not open IFLA_MACVLAN_MACADDR_DATA container: %m");
+
+                SET_FOREACH(mac_addr, m->match_source_mac, i) {
+                        r = sd_netlink_message_append_ether_addr(req, IFLA_MACVLAN_MACADDR, mac_addr);
+                        if (r < 0)
+                                return log_netdev_error_errno(netdev, r, "Could not append IFLA_MACVLAN_MACADDR attribute: %m");
+                }
+
+                r = sd_netlink_message_close_container(req);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not close IFLA_MACVLAN_MACADDR_DATA container: %m");
+        }
+
         if (m->mode != _NETDEV_MACVLAN_MODE_INVALID) {
                 r = sd_netlink_message_append_u32(req, IFLA_MACVLAN_MODE, m->mode);
                 if (r < 0)
@@ -32,6 +55,21 @@ static int netdev_macvlan_fill_message_create(NetDev *netdev, Link *link, sd_net
         return 0;
 }
 
+static void macvlan_done(NetDev *n) {
+        MacVlan *m;
+
+        assert(n);
+
+        if (n->kind == NETDEV_KIND_MACVLAN)
+                m = MACVLAN(n);
+        else
+                m = MACVTAP(n);
+
+        assert(m);
+
+        set_free_free(m->match_source_mac);
+}
+
 static void macvlan_init(NetDev *n) {
         MacVlan *m;
 
@@ -50,6 +88,7 @@ static void macvlan_init(NetDev *n) {
 const NetDevVTable macvtap_vtable = {
         .object_size = sizeof(MacVlan),
         .init = macvlan_init,
+        .done = macvlan_done,
         .sections = NETDEV_COMMON_SECTIONS "MACVTAP\0",
         .fill_message_create = netdev_macvlan_fill_message_create,
         .create_type = NETDEV_CREATE_STACKED,
@@ -59,6 +98,7 @@ const NetDevVTable macvtap_vtable = {
 const NetDevVTable macvlan_vtable = {
         .object_size = sizeof(MacVlan),
         .init = macvlan_init,
+        .done = macvlan_done,
         .sections = NETDEV_COMMON_SECTIONS "MACVLAN\0",
         .fill_message_create = netdev_macvlan_fill_message_create,
         .create_type = NETDEV_CREATE_STACKED,
index 7e4d685bdbafaec5534329d8b806bcbf9a77436b..7bc6eef12df2b3a4e14bdf0a15eb1bf5ab33b61e 100644 (file)
@@ -5,11 +5,13 @@ typedef struct MacVlan MacVlan;
 
 #include "macvlan-util.h"
 #include "netdev.h"
+#include "set.h"
 
 struct MacVlan {
         NetDev meta;
 
         MacVlanMode mode;
+        Set *match_source_mac;
 };
 
 DEFINE_NETDEV_CAST(MACVLAN, MacVlan);
index b14835c313eb74f05a1a5a0b6a66f035a4c28084..0e2a9ce045e3dd7db947c31c8b54b0890d3ae452 100644 (file)
@@ -52,7 +52,9 @@ VLAN.MVRP,                                config_parse_tristate,
 VLAN.LooseBinding,                        config_parse_tristate,                     0,                             offsetof(VLan, loose_binding)
 VLAN.ReorderHeader,                       config_parse_tristate,                     0,                             offsetof(VLan, reorder_hdr)
 MACVLAN.Mode,                             config_parse_macvlan_mode,                 0,                             offsetof(MacVlan, mode)
+MACVLAN.SourceMACAddress,                 config_parse_hwaddrs,                      0,                             offsetof(MacVlan, match_source_mac)
 MACVTAP.Mode,                             config_parse_macvlan_mode,                 0,                             offsetof(MacVlan, mode)
+MACVTAP.SourceMACAddress,                 config_parse_hwaddrs,                      0,                             offsetof(MacVlan, match_source_mac)
 IPVLAN.Mode,                              config_parse_ipvlan_mode,                  0,                             offsetof(IPVlan, mode)
 IPVLAN.Flags,                             config_parse_ipvlan_flags,                 0,                             offsetof(IPVlan, flags)
 IPVTAP.Mode,                              config_parse_ipvlan_mode,                  0,                             offsetof(IPVlan, mode)
index 1889f6f13c9073f1767fd9c9aa1c5103a4fe524f..350485d561b2981711ef0593e1c249c1b20afce3 100644 (file)
@@ -364,7 +364,7 @@ static int netdev_enslave(NetDev *netdev, Link *link, link_netlink_message_handl
                 if (r >= 0)
                         callback(netdev->manager->rtnl, m, link);
         } else {
-                /* the netdev is not yet read, save this request for when it is */
+                /* the netdev is not yet ready, save this request for when it is */
                 netdev_join_callback *cb;
 
                 cb = new(netdev_join_callback, 1);
index 713cdaa8847ad8eec72e40db81479c572fed311b..bff778179c42e3895ef51429f11e8b2719c316e0 100644 (file)
@@ -348,14 +348,7 @@ static int wireguard_resolve_handler(sd_resolve_query *q,
         if (ret != 0) {
                 log_netdev_error(netdev, "Failed to resolve host '%s:%s': %s", peer->endpoint_host, peer->endpoint_port, gai_strerror(ret));
 
-                r = set_ensure_allocated(&w->peers_with_failed_endpoint, NULL);
-                if (r < 0) {
-                        log_oom();
-                        peer->section->invalid = true;
-                        goto resolve_next;
-                }
-
-                r = set_put(w->peers_with_failed_endpoint, peer);
+                r = set_ensure_put(&w->peers_with_failed_endpoint, NULL, peer);
                 if (r < 0) {
                         log_netdev_error(netdev, "Failed to save a peer, dropping the peer: %m");
                         peer->section->invalid = true;
@@ -580,7 +573,7 @@ int config_parse_wireguard_preshared_key(
                 void *data,
                 void *userdata) {
 
-        _cleanup_(wireguard_peer_free_or_set_invalidp) WireguardPeer *peer = NULL;
+        WireguardPeer *peer;
         Wireguard *w;
         int r;
 
@@ -592,12 +585,7 @@ int config_parse_wireguard_preshared_key(
         if (r < 0)
                 return r;
 
-        r = wireguard_decode_key_and_warn(rvalue, peer->preshared_key, unit, filename, line, lvalue);
-        if (r < 0)
-                return r;
-
-        TAKE_PTR(peer);
-        return 0;
+        return wireguard_decode_key_and_warn(rvalue, peer->preshared_key, unit, filename, line, lvalue);
 }
 
 int config_parse_wireguard_preshared_key_file(
@@ -766,10 +754,6 @@ int config_parse_wireguard_endpoint(
         w = WIREGUARD(data);
         assert(w);
 
-        r = wireguard_peer_new_static(w, filename, section_line, &peer);
-        if (r < 0)
-                return r;
-
         if (rvalue[0] == '[') {
                 begin = &rvalue[1];
                 end = strchr(rvalue, ']');
@@ -801,6 +785,10 @@ int config_parse_wireguard_endpoint(
                 ++end;
         }
 
+        r = wireguard_peer_new_static(w, filename, section_line, &peer);
+        if (r < 0)
+                return r;
+
         r = free_and_strndup(&peer->endpoint_host, begin, len);
         if (r < 0)
                 return log_oom();
@@ -809,15 +797,11 @@ int config_parse_wireguard_endpoint(
         if (r < 0)
                 return log_oom();
 
-        r = set_ensure_allocated(&w->peers_with_unresolved_endpoint, NULL);
+        r = set_ensure_put(&w->peers_with_unresolved_endpoint, NULL, peer);
         if (r < 0)
                 return log_oom();
+        TAKE_PTR(peer); /* The peer may already have been in the hash map, that is fine too. */
 
-        r = set_put(w->peers_with_unresolved_endpoint, peer);
-        if (r < 0)
-                return r;
-
-        TAKE_PTR(peer);
         return 0;
 }
 
@@ -833,7 +817,7 @@ int config_parse_wireguard_keepalive(
                 void *data,
                 void *userdata) {
 
-        _cleanup_(wireguard_peer_free_or_set_invalidp) WireguardPeer *peer = NULL;
+        WireguardPeer *peer;
         uint16_t keepalive = 0;
         Wireguard *w;
         int r;
@@ -854,15 +838,13 @@ int config_parse_wireguard_keepalive(
                 r = safe_atou16(rvalue, &keepalive);
                 if (r < 0) {
                         log_syntax(unit, LOG_ERR, filename, line, r,
-                                   "The persistent keepalive interval must be 0-65535. Ignore assignment: %s",
+                                   "Failed to parse \"%s\" as keepalive interval (range 0–65535), ignoring assignment: %m",
                                    rvalue);
                         return 0;
                 }
         }
 
         peer->persistent_keepalive_interval = keepalive;
-
-        TAKE_PTR(peer);
         return 0;
 }
 
index bf663146d6d585970525712bdfd050e333e0a782..cc4639aeaf73c177e8b97e57c4725bb4df1aa069 100644 (file)
@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
+#include <arpa/inet.h>
 #include <getopt.h>
 #include <linux/if_addrlabel.h>
 #include <net/if.h>
 
 #include "alloc-util.h"
 #include "bond-util.h"
+#include "bridge-util.h"
 #include "bus-common-errors.h"
 #include "bus-error.h"
-#include "bus-util.h"
-#include "bridge-util.h"
+#include "bus-locator.h"
 #include "device-util.h"
 #include "escape.h"
 #include "ether-addr-util.h"
@@ -718,7 +719,7 @@ static int list_links(int argc, char *argv[], void *userdata) {
 
         r = table_print(table, NULL);
         if (r < 0)
-                return log_error_errno(r, "Failed to print table: %m");
+                return table_log_print_error(r);
 
         if (arg_legend)
                 printf("\n%i links listed.\n", c);
@@ -930,12 +931,13 @@ static int dump_gateways(
 
 static int dump_addresses(
                 sd_netlink *rtnl,
+                sd_dhcp_lease *lease,
                 Table *table,
                 int ifindex) {
 
         _cleanup_free_ struct local_address *local = NULL;
-        _cleanup_free_ char *dhcp4_address = NULL;
         _cleanup_strv_free_ char **buf = NULL;
+        struct in_addr dhcp4_address = {};
         int r, n, i;
 
         assert(rtnl);
@@ -945,7 +947,8 @@ static int dump_addresses(
         if (n <= 0)
                 return n;
 
-        (void) sd_network_link_get_dhcp4_address(ifindex, &dhcp4_address);
+        if (lease)
+                (void) sd_dhcp_lease_get_address(lease, &dhcp4_address);
 
         for (i = 0; i < n; i++) {
                 _cleanup_free_ char *pretty = NULL;
@@ -955,13 +958,19 @@ static int dump_addresses(
                 if (r < 0)
                         return r;
 
-                if (dhcp4_address && streq(pretty, dhcp4_address)) {
-                        _cleanup_free_ char *p = NULL;
+                if (local[i].family == AF_INET && in4_addr_equal(&local[i].address.in, &dhcp4_address)) {
+                        struct in_addr server_address;
+                        char *p, s[INET_ADDRSTRLEN];
 
-                        p = pretty;
-                        pretty = strjoin(pretty , " (DHCP4)");
-                        if (!pretty)
+                        r = sd_dhcp_lease_get_server_identifier(lease, &server_address);
+                        if (r >= 0 && inet_ntop(AF_INET, &server_address, s, sizeof(s)))
+                                p = strjoin(pretty, " (DHCP4 via ", s, ")");
+                        else
+                                p = strjoin(pretty, " (DHCP4)");
+                        if (!p)
                                 return log_oom();
+
+                        free_and_replace(pretty, p);
                 }
 
                 r = strv_extendf(&buf, "%s%s%s",
@@ -1055,7 +1064,7 @@ static int dump_address_labels(sd_netlink *rtnl) {
 
         r = table_print(table, NULL);
         if (r < 0)
-                return log_error_errno(r, "Failed to print table: %m");
+                return table_log_print_error(r);
 
         return 0;
 }
@@ -1379,12 +1388,12 @@ static int link_status_one(
                 const LinkInfo *info) {
 
         _cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **sip = NULL, **search_domains = NULL, **route_domains = NULL;
-        _cleanup_free_ char *t = NULL, *network = NULL, *client_id = NULL, *iaid = NULL, *duid = NULL;
-        const char *driver = NULL, *path = NULL, *vendor = NULL, *model = NULL, *link = NULL;
-        _cleanup_free_ char *setup_state = NULL, *operational_state = NULL, *tz = NULL;
-        const char *on_color_operational, *off_color_operational,
-                *on_color_setup, *off_color_setup;
+        _cleanup_free_ char *t = NULL, *network = NULL, *iaid = NULL, *duid = NULL,
+                *setup_state = NULL, *operational_state = NULL, *lease_file = NULL;
+        const char *driver = NULL, *path = NULL, *vendor = NULL, *model = NULL, *link = NULL,
+                *on_color_operational, *off_color_operational, *on_color_setup, *off_color_setup;
         _cleanup_free_ int *carrier_bound_to = NULL, *carrier_bound_by = NULL;
+        _cleanup_(sd_dhcp_lease_unrefp) sd_dhcp_lease *lease = NULL;
         _cleanup_(table_unrefp) Table *table = NULL;
         TableCell *cell;
         int r;
@@ -1425,6 +1434,11 @@ static int link_status_one(
         (void) sd_network_link_get_carrier_bound_to(info->ifindex, &carrier_bound_to);
         (void) sd_network_link_get_carrier_bound_by(info->ifindex, &carrier_bound_by);
 
+        if (asprintf(&lease_file, "/run/systemd/netif/leases/%d", info->ifindex) < 0)
+                return log_oom();
+
+        (void) dhcp_lease_load(&lease, lease_file);
+
         table = table_new("dot", "key", "value");
         if (!table)
                 return log_oom();
@@ -2022,7 +2036,7 @@ static int link_status_one(
                 }
         }
 
-        r = dump_addresses(rtnl, table, info->ifindex);
+        r = dump_addresses(rtnl, lease, table, info->ifindex);
         if (r < 0)
                 return r;
         r = dump_gateways(rtnl, hwdb, table, info->ifindex);
@@ -2050,24 +2064,35 @@ static int link_status_one(
         if (r < 0)
                 return r;
 
-        (void) sd_network_link_get_timezone(info->ifindex, &tz);
-        if (tz) {
-                r = table_add_many(table,
-                                   TABLE_EMPTY,
-                                   TABLE_STRING, "Time Zone:",
-                                   TABLE_STRING, tz);
-                if (r < 0)
-                        return table_log_add_error(r);
-        }
+        if (lease) {
+                const void *client_id;
+                size_t client_id_len;
+                const char *tz;
 
-        r = sd_network_link_get_dhcp4_client_id_string(info->ifindex, &client_id);
-        if (r >= 0) {
-                r = table_add_many(table,
-                                   TABLE_EMPTY,
-                                   TABLE_STRING, "DHCP4 Client ID:",
-                                   TABLE_STRING, client_id);
-                if (r < 0)
-                        return table_log_add_error(r);
+                r = sd_dhcp_lease_get_timezone(lease, &tz);
+                if (r >= 0) {
+                        r = table_add_many(table,
+                                           TABLE_EMPTY,
+                                           TABLE_STRING, "Time Zone:",
+                                           TABLE_STRING, tz);
+                        if (r < 0)
+                                return table_log_add_error(r);
+                }
+
+                r = sd_dhcp_lease_get_client_id(lease, &client_id, &client_id_len);
+                if (r >= 0) {
+                        _cleanup_free_ char *id = NULL;
+
+                        r = sd_dhcp_client_id_to_string(client_id, client_id_len, &id);
+                        if (r >= 0) {
+                                r = table_add_many(table,
+                                                   TABLE_EMPTY,
+                                                   TABLE_STRING, "DHCP4 Client ID:",
+                                                   TABLE_STRING, id);
+                                if (r < 0)
+                                        return table_log_add_error(r);
+                        }
+                }
         }
 
         r = sd_network_link_get_dhcp6_client_iaid_string(info->ifindex, &iaid);
@@ -2104,7 +2129,7 @@ static int link_status_one(
 
         r = table_print(table, NULL);
         if (r < 0)
-                return log_error_errno(r, "Failed to print table: %m");
+                return table_log_print_error(r);
 
         return show_logs(info);
 }
@@ -2147,7 +2172,7 @@ static int system_status(sd_netlink *rtnl, sd_hwdb *hwdb) {
         if (r < 0)
                 return table_log_add_error(r);
 
-        r = dump_addresses(rtnl, table, 0);
+        r = dump_addresses(rtnl, NULL, table, 0);
         if (r < 0)
                 return r;
         r = dump_gateways(rtnl, hwdb, table, 0);
@@ -2176,7 +2201,7 @@ static int system_status(sd_netlink *rtnl, sd_hwdb *hwdb) {
 
         r = table_print(table, NULL);
         if (r < 0)
-                return log_error_errno(r, "Failed to print table: %m");
+                return table_log_print_error(r);
 
         return show_logs(NULL);
 }
@@ -2396,7 +2421,7 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) {
 
         r = table_print(table, NULL);
         if (r < 0)
-                return log_error_errno(r, "Failed to print table: %m");
+                return table_log_print_error(r);
 
         if (arg_legend) {
                 lldp_capabilities_legend(all);
@@ -2793,9 +2818,7 @@ static void warn_networkd_missing(void) {
 static int run(int argc, char* argv[]) {
         int r;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 9b78530334a08f0cb2adececb5d98f962badd5fe..44e317e9909ff2911945a48a010229fa6745351a 100644 (file)
@@ -266,11 +266,7 @@ static int address_add_internal(Link *link, Set **addresses,
         /* Consider address tentative until we get the real flags from the kernel */
         address->flags = IFA_F_TENTATIVE;
 
-        r = set_ensure_allocated(addresses, &address_hash_ops);
-        if (r < 0)
-                return r;
-
-        r = set_put(*addresses, address);
+        r = set_ensure_put(addresses, &address_hash_ops, address);
         if (r < 0)
                 return r;
         if (r == 0)
@@ -280,9 +276,7 @@ static int address_add_internal(Link *link, Set **addresses,
 
         if (ret)
                 *ret = address;
-
-        address = NULL;
-
+        TAKE_PTR(address);
         return 0;
 }
 
@@ -302,11 +296,7 @@ int address_add(Link *link, int family, const union in_addr_union *in_addr, unsi
                         return r;
         } else if (r == 0) {
                 /* Take over a foreign address */
-                r = set_ensure_allocated(&link->addresses, &address_hash_ops);
-                if (r < 0)
-                        return r;
-
-                r = set_put(link->addresses, address);
+                r = set_ensure_put(&link->addresses, &address_hash_ops, address);
                 if (r < 0)
                         return r;
 
index 606ae9f3c2f9f7a5865cf73ea4506689ee735f94..5b1acde297c6b1c0df445f0458b5ee0227b3bbd5 100644 (file)
@@ -664,17 +664,8 @@ int config_parse_dhcp_request_options(
                         continue;
                 }
 
-                if (ltype == AF_INET)
-                        r = set_ensure_allocated(&network->dhcp_request_options, NULL);
-                else
-                        r = set_ensure_allocated(&network->dhcp6_request_options, NULL);
-                if (r < 0)
-                        return log_oom();
-
-                if (ltype == AF_INET)
-                        r = set_put(network->dhcp_request_options, UINT32_TO_PTR(i));
-                else
-                        r = set_put(network->dhcp6_request_options, UINT32_TO_PTR(i));
+                r = set_ensure_put(ltype == AF_INET ? &network->dhcp_request_options : &network->dhcp6_request_options,
+                                   NULL, UINT32_TO_PTR(i));
                 if (r < 0)
                         log_syntax(unit, LOG_ERR, filename, line, r,
                                    "Failed to store DHCP request option '%s', ignoring assignment: %m", n);
index 8e2c775fcf420418faa0d9c383c7f49fda091d66..37b16315e52931bd4ced1b0eda91a9506dae1010 100644 (file)
@@ -1025,7 +1025,7 @@ static int dhcp_lease_ip_change(sd_dhcp_client *client, Link *link) {
 
         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
+        /* 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.
@@ -1051,7 +1051,7 @@ static int dhcp_lease_ip_change(sd_dhcp_client *client, Link *link) {
         return 0;
 }
 
-static int dhcp_server_is_black_listed(Link *link, sd_dhcp_client *client) {
+static int dhcp_server_is_deny_listed(Link *link, sd_dhcp_client *client) {
         sd_dhcp_lease *lease;
         struct in_addr addr;
         int r;
@@ -1066,12 +1066,40 @@ static int dhcp_server_is_black_listed(Link *link, sd_dhcp_client *client) {
 
         r = sd_dhcp_lease_get_server_identifier(lease, &addr);
         if (r < 0)
-                return log_link_debug_errno(link, r, "Failed to get DHCP server ip address: %m");
+                return log_link_debug_errno(link, r, "Failed to get DHCP server IP address: %m");
 
-        if (set_contains(link->network->dhcp_black_listed_ip, UINT32_TO_PTR(addr.s_addr))) {
+        if (set_contains(link->network->dhcp_deny_listed_ip, UINT32_TO_PTR(addr.s_addr))) {
                 log_struct(LOG_DEBUG,
                            LOG_LINK_INTERFACE(link),
-                           LOG_LINK_MESSAGE(link, "DHCPv4 ip '%u.%u.%u.%u' found in black listed ip addresses, ignoring offer",
+                           LOG_LINK_MESSAGE(link, "DHCPv4 IP '%u.%u.%u.%u' found in deny-listed IP addresses, ignoring offer",
+                                            ADDRESS_FMT_VAL(addr)));
+                return true;
+        }
+
+        return false;
+}
+
+static int dhcp_server_is_allow_listed(Link *link, sd_dhcp_client *client) {
+        sd_dhcp_lease *lease;
+        struct in_addr addr;
+        int r;
+
+        assert(link);
+        assert(link->network);
+        assert(client);
+
+        r = sd_dhcp_client_get_lease(client, &lease);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Failed to get DHCP lease: %m");
+
+        r = sd_dhcp_lease_get_server_identifier(lease, &addr);
+        if (r < 0)
+                return log_link_debug_errno(link, r, "Failed to get DHCP server IP address: %m");
+
+        if (set_contains(link->network->dhcp_allow_listed_ip, UINT32_TO_PTR(addr.s_addr))) {
+                log_struct(LOG_DEBUG,
+                           LOG_LINK_INTERFACE(link),
+                           LOG_LINK_MESSAGE(link, "DHCPv4 IP '%u.%u.%u.%u' found in allow-listed IP addresses, accepting offer",
                                             ADDRESS_FMT_VAL(addr)));
                 return true;
         }
@@ -1163,12 +1191,19 @@ static int dhcp4_handler(sd_dhcp_client *client, int event, void *userdata) {
                         }
                         break;
                 case SD_DHCP_CLIENT_EVENT_SELECTING:
-                        r = dhcp_server_is_black_listed(link, client);
-                        if (r < 0)
-                                return r;
-                        if (r != 0)
-                                return -ENOMSG;
-
+                        if (!set_isempty(link->network->dhcp_allow_listed_ip)) {
+                                r = dhcp_server_is_allow_listed(link, client);
+                                if (r < 0)
+                                        return r;
+                                if (r == 0)
+                                        return -ENOMSG;
+                        } else {
+                                r = dhcp_server_is_deny_listed(link, client);
+                                if (r < 0)
+                                        return r;
+                                if (r != 0)
+                                        return -ENOMSG;
+                        }
                         break;
                 default:
                         if (event < 0)
@@ -1485,7 +1520,7 @@ int dhcp4_configure(Link *link) {
         if (link->network->ip_service_type > 0) {
                 r = sd_dhcp_client_set_service_type(link->dhcp_client, link->network->ip_service_type);
                 if (r < 0)
-                        return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to set ip service type: %m");
+                        return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to set IP service type: %m");
         }
 
         if (link->network->dhcp_fallback_lease_lifetime > 0) {
@@ -1551,7 +1586,7 @@ int config_parse_dhcp_max_attempts(
         return 0;
 }
 
-int config_parse_dhcp_black_listed_ip_address(
+int config_parse_dhcp_acl_ip_address(
                 const char *unit,
                 const char *filename,
                 unsigned line,
@@ -1564,7 +1599,7 @@ int config_parse_dhcp_black_listed_ip_address(
                 void *userdata) {
 
         Network *network = data;
-        const char *p;
+        Set **acl;
         int r;
 
         assert(filename);
@@ -1572,20 +1607,22 @@ int config_parse_dhcp_black_listed_ip_address(
         assert(rvalue);
         assert(data);
 
+        acl = STR_IN_SET(lvalue, "DenyList", "BlackList") ? &network->dhcp_deny_listed_ip : &network->dhcp_allow_listed_ip;
+
         if (isempty(rvalue)) {
-                network->dhcp_black_listed_ip = set_free(network->dhcp_black_listed_ip);
+                *acl = set_free(*acl);
                 return 0;
         }
 
-        for (p = rvalue;;) {
+        for (const char *p = rvalue;;) {
                 _cleanup_free_ char *n = NULL;
                 union in_addr_union ip;
 
                 r = extract_first_word(&p, &n, NULL, 0);
                 if (r < 0) {
                         log_syntax(unit, LOG_ERR, filename, line, r,
-                                   "Failed to parse DHCP black listed ip address, ignoring assignment: %s",
-                                   rvalue);
+                                   "Failed to parse DHCP '%s=' IP address, ignoring assignment: %s",
+                                   lvalue, rvalue);
                         return 0;
                 }
                 if (r == 0)
@@ -1594,18 +1631,14 @@ int config_parse_dhcp_black_listed_ip_address(
                 r = in_addr_from_string(AF_INET, n, &ip);
                 if (r < 0) {
                         log_syntax(unit, LOG_ERR, filename, line, r,
-                                   "DHCP black listed ip address is invalid, ignoring assignment: %s", n);
+                                   "DHCP '%s=' IP address is invalid, ignoring assignment: %s", lvalue, n);
                         continue;
                 }
 
-                r = set_ensure_allocated(&network->dhcp_black_listed_ip, NULL);
-                if (r < 0)
-                        return log_oom();
-
-                r = set_put(network->dhcp_black_listed_ip, UINT32_TO_PTR(ip.in.s_addr));
+                r = set_ensure_put(acl, NULL, UINT32_TO_PTR(ip.in.s_addr));
                 if (r < 0)
                         log_syntax(unit, LOG_ERR, filename, line, r,
-                                   "Failed to store DHCP black listed ip address '%s', ignoring assignment: %m", n);
+                                   "Failed to store DHCP '%s=' IP address '%s', ignoring assignment: %m", lvalue, n);
         }
 
         return 0;
index a6e24be78d73744dbccaa84b71ac5e10d1450b99..96ac696ce6ec53a027d03a79b2031acdf3d09c54 100644 (file)
@@ -23,7 +23,7 @@ int dhcp4_set_client_identifier(Link *link);
 int dhcp4_set_promote_secondaries(Link *link);
 
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_client_identifier);
-CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_black_listed_ip_address);
+CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_acl_ip_address);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_max_attempts);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_ip_service_type);
 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_mud_url);
index 27b74407af60cc0184b2c730b14782a675fe6468..73b49a5ec044ecd11bfbad9cc2f1d0157b413c66 100644 (file)
@@ -6,7 +6,6 @@
 #include <netinet/in.h>
 #include <linux/if.h>
 #include <linux/if_arp.h>
-#include "sd-radv.h"
 
 #include "sd-dhcp6-client.h"
 
@@ -18,7 +17,9 @@
 #include "networkd-dhcp6.h"
 #include "networkd-link.h"
 #include "networkd-manager.h"
+#include "networkd-radv.h"
 #include "siphash24.h"
+#include "string-table.h"
 #include "string-util.h"
 #include "radv-internal.h"
 #include "web-util.h"
@@ -27,7 +28,6 @@ static int dhcp6_lease_address_acquired(sd_dhcp6_client *client, Link *link);
 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 bool dhcp6_link_has_dhcpv6_prefix(Link *link);
 static int dhcp6_assign_delegated_prefix(Link *link, const struct in6_addr *prefix,
                                          uint8_t prefix_len,
                                          uint32_t lifetime_preferred,
@@ -77,7 +77,7 @@ static int dhcp6_get_preferred_delegated_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)
+                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.",
@@ -111,28 +111,24 @@ static int dhcp6_get_preferred_delegated_prefix(
                 log_link_debug(link, "The requested prefix %s is available. Using it.",
                                strnull(assigned_buf));
                 return 0;
-        } else {
-                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 (!assigned_link || assigned_link == link) {
-                                *ret_addr = prefix.in6;
-                                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?");
+        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 (!assigned_link || assigned_link == link) {
+                        *ret_addr = prefix.in6;
+                        return 0;
                 }
 
-                log_link_warning(link, "Couldn't find a suitable prefix. Ran out of address space.");
+                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?");
         }
 
-        return -ERANGE;
+        return log_link_warning_errno(link, SYNTHETIC_ERRNO(ERANGE), "Couldn't find a suitable prefix. Ran out of address space.");
 }
 
 static bool dhcp6_enable_prefix_delegation(Link *dhcp6_link) {
@@ -158,8 +154,7 @@ static bool dhcp6_enable_prefix_delegation(Link *dhcp6_link) {
         return false;
 }
 
-static int dhcp6_lease_information_acquired(sd_dhcp6_client *client,
-                                        Link *link) {
+static int dhcp6_lease_information_acquired(sd_dhcp6_client *client, Link *link) {
         return 0;
 }
 
@@ -167,34 +162,12 @@ static int dhcp6_pd_prefix_assign(Link *link, struct in6_addr *prefix,
                                   uint8_t prefix_len,
                                   uint32_t lifetime_preferred,
                                   uint32_t lifetime_valid) {
-        sd_radv *radv = link->radv;
         int r;
-        _cleanup_(sd_radv_prefix_unrefp) sd_radv_prefix *p = NULL;
-
-        r = sd_radv_prefix_new(&p);
-        if (r < 0)
-                return r;
 
-        r = sd_radv_prefix_set_prefix(p, prefix, prefix_len);
+        r = radv_add_prefix(link, prefix, prefix_len, lifetime_preferred, lifetime_valid);
         if (r < 0)
                 return r;
 
-        r = sd_radv_prefix_set_preferred_lifetime(p, lifetime_preferred);
-        if (r < 0)
-                return r;
-
-        r = sd_radv_prefix_set_valid_lifetime(p, lifetime_valid);
-        if (r < 0)
-                return r;
-
-        r = sd_radv_stop(radv);
-        if (r < 0)
-                return r;
-
-        r = sd_radv_add_prefix(radv, p, true);
-        if (r < 0 && r != -EEXIST)
-                return r;
-
         r = dhcp6_prefix_add(link->manager, prefix, link);
         if (r < 0)
                 return r;
@@ -205,7 +178,7 @@ static int dhcp6_pd_prefix_assign(Link *link, struct in6_addr *prefix,
                         return r;
         }
 
-        return sd_radv_start(radv);
+        return 0;
 }
 
 static int dhcp6_route_remove_handler(sd_netlink *nl, sd_netlink_message *m, Link *link) {
@@ -311,14 +284,11 @@ static int dhcp6_pd_prefix_distribute(Link *dhcp6_link,
                 if (!dhcp6_get_prefix_delegation(link))
                         continue;
 
-                if (dhcp6_link_has_dhcpv6_prefix(link))
-                        continue;
-
                 if (assign_preferred_subnet_id != dhcp6_has_preferred_subnet_id(link))
                         continue;
 
                 r = dhcp6_get_preferred_delegated_prefix(manager, link, &prefix.in6, pd_prefix_len,
-                                                        &assigned_prefix.in6);
+                                                         &assigned_prefix.in6);
 
                 if (assign_preferred_subnet_id && r == -EAGAIN) {
                         /* A link has a preferred subnet_id but that one is
@@ -1028,18 +998,29 @@ static int dhcp6_prefix_remove_all(Manager *m, Link *link) {
         return 0;
 }
 
-static bool dhcp6_link_has_dhcpv6_prefix(Link *link) {
-        Iterator i;
-        Link *l;
+static int dhcp6_assign_delegeted_prefix_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
+        int r;
 
         assert(link);
-        assert(link->manager);
 
-        HASHMAP_FOREACH(l, link->manager->dhcp6_prefixes, i)
-                if (link == l)
-                        return true;
+        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
+                return 1;
 
-        return false;
+        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);
+
+        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,
@@ -1079,11 +1060,9 @@ static int dhcp6_assign_delegated_prefix(Link *link,
 
         link_set_state(link, LINK_STATE_CONFIGURING);
 
-        r = address_configure(address, link, address_handler, true);
+        r = address_configure(address, link, dhcp6_assign_delegeted_prefix_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->address_messages++;
 
         return 0;
 }
@@ -1205,3 +1184,14 @@ int config_parse_dhcp6_delegated_prefix_token(
 
         return 0;
 }
+
+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);
index 913410fe77b16f7f78724b43518248c87c4a83a6..858559a1e0977e90000c8d3719935350714a323e 100644 (file)
@@ -4,6 +4,15 @@
 #include "sd-dhcp6-client.h"
 
 #include "conf-parser.h"
+#include "macro.h"
+
+typedef enum DHCP6ClientStartMode {
+        DHCP6_CLIENT_START_MODE_NO,
+        DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST,
+        DHCP6_CLIENT_START_MODE_SOLICIT,
+        _DHCP6_CLIENT_START_MODE_MAX,
+        _DHCP6_CLIENT_START_MODE_INVALID = -1,
+} DHCP6ClientStartMode;
 
 typedef struct Link Link;
 typedef struct Manager Manager;
@@ -17,3 +26,7 @@ int dhcp6_prefix_remove(Manager *m, struct in6_addr *addr);
 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);
+
+const char* dhcp6_client_start_mode_to_string(DHCP6ClientStartMode i) _const_;
+DHCP6ClientStartMode dhcp6_client_start_mode_from_string(const char *s) _pure_;
index 76daee69e84c98f7da511d3c713a88cea6948334..38b005fb63c9a9f80ba912bd75fa0f8fd3b02aec 100644 (file)
@@ -6,8 +6,8 @@
 
 #include "alloc-util.h"
 #include "bus-common-errors.h"
+#include "bus-get-properties.h"
 #include "bus-polkit.h"
-#include "bus-util.h"
 #include "dns-domain.h"
 #include "networkd-link-bus.h"
 #include "networkd-link.h"
index afeb36d315bbff0fb449417e454ba51fd8b3911f..71e6976a30af2aa70b0de526380416175c1f587b 100644 (file)
@@ -3,6 +3,7 @@
 #include <netinet/in.h>
 #include <linux/if.h>
 #include <linux/if_arp.h>
+#include <linux/if_link.h>
 #include <unistd.h>
 
 #include "alloc-util.h"
@@ -31,6 +32,7 @@
 #include "networkd-manager.h"
 #include "networkd-ndisc.h"
 #include "networkd-neighbor.h"
+#include "networkd-sriov.h"
 #include "networkd-radv.h"
 #include "networkd-routing-policy-rule.h"
 #include "networkd-wifi.h"
@@ -346,6 +348,9 @@ static void link_update_master_operstate(Link *link, NetDev *netdev) {
         if (!netdev)
                 return;
 
+        if (netdev->ifindex <= 0)
+                return;
+
         if (link_get(link->manager, netdev->ifindex, &master) < 0)
                 return;
 
@@ -752,7 +757,7 @@ int link_get(Manager *m, int ifindex, Link **ret) {
         Link *link;
 
         assert(m);
-        assert(ifindex);
+        assert(ifindex > 0);
         assert(ret);
 
         link = hashmap_get(m->links, INT_TO_PTR(ifindex));
@@ -1124,6 +1129,9 @@ void link_check_ready(Link *link) {
         if (!link->tc_configured)
                 return;
 
+        if (!link->sr_iov_configured)
+                return;
+
         if (link_has_carrier(link) || !link->network->configure_without_carrier) {
 
                 if (link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4) && !link->ipv4ll_address)
@@ -1176,7 +1184,7 @@ static int link_request_set_neighbors(Link *link) {
         return 0;
 }
 
-int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
+static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
         int r;
 
         assert(rtnl);
@@ -1556,11 +1564,13 @@ static int link_acquire_ipv6_conf(Link *link) {
                         return log_link_warning_errno(link, r, "Could not start IPv6 Router Advertisement: %m");
         }
 
-        if (link_dhcp6_enabled(link) && link->network->dhcp6_without_ra) {
+        if (link_dhcp6_enabled(link) && IN_SET(link->network->dhcp6_without_ra,
+                                               DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST,
+                                               DHCP6_CLIENT_START_MODE_SOLICIT)) {
                 assert(link->dhcp6_client);
                 assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*)&link->ipv6ll_address) > 0);
 
-                r = dhcp6_request_address(link, true);
+                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");
                 else
@@ -1695,7 +1705,7 @@ static int link_configure_addrgen_mode(Link *link) {
 
         if (!link_ipv6ll_enabled(link))
                 ipv6ll_mode = IN6_ADDR_GEN_MODE_NONE;
-        else if (link->network->ipv6_address_gen_mode < 0) {
+        else if (link->network->ipv6ll_address_gen_mode < 0) {
                 r = sysctl_read_ip_property(AF_INET6, link->ifname, "stable_secret", NULL);
                 if (r < 0) {
                         /* The file may not exist. And even if it exists, when stable_secret is unset,
@@ -1706,7 +1716,7 @@ static int link_configure_addrgen_mode(Link *link) {
                 } else
                         ipv6ll_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY;
         } else
-                ipv6ll_mode = link->network->ipv6_address_gen_mode;
+                ipv6ll_mode = link->network->ipv6ll_address_gen_mode;
 
         r = sd_netlink_message_append_u8(req, IFLA_INET6_ADDR_GEN_MODE, ipv6ll_mode);
         if (r < 0)
@@ -2125,11 +2135,7 @@ static int link_append_to_master(Link *link, NetDev *netdev) {
         if (r < 0)
                 return r;
 
-        r = set_ensure_allocated(&master->slaves, NULL);
-        if (r < 0)
-                return r;
-
-        r = set_put(master->slaves, link);
+        r = set_ensure_put(&master->slaves, NULL, link);
         if (r <= 0)
                 return r;
 
@@ -2837,6 +2843,28 @@ static int link_configure_traffic_control(Link *link) {
         return 0;
 }
 
+static int link_configure_sr_iov(Link *link) {
+        SRIOV *sr_iov;
+        Iterator i;
+        int r;
+
+        link->sr_iov_configured = false;
+        link->sr_iov_messages = 0;
+
+        ORDERED_HASHMAP_FOREACH(sr_iov, link->network->sr_iov_by_section, i) {
+                r = sr_iov_configure(link, sr_iov);
+                if (r < 0)
+                        return r;
+        }
+
+        if (link->sr_iov_messages == 0)
+                link->sr_iov_configured = true;
+        else
+                log_link_debug(link, "Configuring SR-IOV");
+
+        return 0;
+}
+
 static int link_configure(Link *link) {
         int r;
 
@@ -2848,6 +2876,10 @@ static int link_configure(Link *link) {
         if (r < 0)
                 return r;
 
+        r = link_configure_sr_iov(link);
+        if (r < 0)
+                return r;
+
         if (link->iftype == ARPHRD_CAN)
                 return link_configure_can(link);
 
@@ -3133,12 +3165,12 @@ static int link_configure_duid(Link *link) {
                 r = set_put(m->links_requesting_uuid, link);
                 if (r < 0)
                         return log_oom();
+                if (r > 0)
+                        link_ref(link);
 
                 r = set_put(m->duids_requesting_uuid, duid);
                 if (r < 0)
                         return log_oom();
-
-                link_ref(link);
         }
 
         return 0;
@@ -3418,7 +3450,6 @@ static int link_load(Link *link) {
                             *dhcp4_address = NULL,
                             *ipv4ll_address = NULL;
         union in_addr_union address;
-        const char *p;
         int r;
 
         assert(link);
@@ -3457,107 +3488,100 @@ static int link_load(Link *link) {
 
 network_file_fail:
 
-        if (addresses) {
-                p = addresses;
+        for (const char *p = addresses; p; ) {
+                _cleanup_free_ char *address_str = NULL;
+                char *prefixlen_str;
+                int family;
+                unsigned char prefixlen;
 
-                for (;;) {
-                        _cleanup_free_ char *address_str = NULL;
-                        char *prefixlen_str;
-                        int family;
-                        unsigned char prefixlen;
-
-                        r = extract_first_word(&p, &address_str, NULL, 0);
-                        if (r < 0) {
-                                log_link_debug_errno(link, r, "Failed to extract next address string: %m");
-                                continue;
-                        }
-                        if (r == 0)
-                                break;
-
-                        prefixlen_str = strchr(address_str, '/');
-                        if (!prefixlen_str) {
-                                log_link_debug(link, "Failed to parse address and prefix length %s", address_str);
-                                continue;
-                        }
-
-                        *prefixlen_str++ = '\0';
+                r = extract_first_word(&p, &address_str, NULL, 0);
+                if (r < 0)
+                        log_link_warning_errno(link, r, "failed to parse ADDRESSES: %m");
+                if (r <= 0)
+                        break;
 
-                        r = sscanf(prefixlen_str, "%hhu", &prefixlen);
-                        if (r != 1) {
-                                log_link_error(link, "Failed to parse prefixlen %s", prefixlen_str);
-                                continue;
-                        }
+                prefixlen_str = strchr(address_str, '/');
+                if (!prefixlen_str) {
+                        log_link_debug(link, "Failed to parse address and prefix length %s", address_str);
+                        continue;
+                }
+                *prefixlen_str++ = '\0';
 
-                        r = in_addr_from_string_auto(address_str, &family, &address);
-                        if (r < 0) {
-                                log_link_debug_errno(link, r, "Failed to parse address %s: %m", address_str);
-                                continue;
-                        }
+                r = sscanf(prefixlen_str, "%hhu", &prefixlen);
+                if (r != 1) {
+                        log_link_error(link, "Failed to parse prefixlen %s", prefixlen_str);
+                        continue;
+                }
 
-                        r = address_add(link, family, &address, prefixlen, NULL);
-                        if (r < 0)
-                                return log_link_error_errno(link, r, "Failed to add address: %m");
+                r = in_addr_from_string_auto(address_str, &family, &address);
+                if (r < 0) {
+                        log_link_debug_errno(link, r, "Failed to parse address %s: %m", address_str);
+                        continue;
                 }
-        }
 
-        if (routes) {
-                p = routes;
+                r = address_add(link, family, &address, prefixlen, NULL);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Failed to add address: %m");
+        }
 
-                for (;;) {
-                        _cleanup_(sd_event_source_unrefp) sd_event_source *expire = NULL;
-                        _cleanup_(route_freep) Route *tmp = NULL;
-                        _cleanup_free_ char *route_str = NULL;
-                        char *prefixlen_str;
-                        Route *route;
+        for (const char *p = routes; p; ) {
+                _cleanup_(sd_event_source_unrefp) sd_event_source *expire = NULL;
+                _cleanup_(route_freep) Route *tmp = NULL;
+                _cleanup_free_ char *route_str = NULL;
+                char *prefixlen_str;
+                Route *route;
 
-                        r = extract_first_word(&p, &route_str, NULL, 0);
-                        if (r < 0) {
-                                log_link_debug_errno(link, r, "Failed to extract next route string: %m");
-                                continue;
-                        }
-                        if (r == 0)
-                                break;
+                r = extract_first_word(&p, &route_str, NULL, 0);
+                if (r < 0)
+                        log_link_debug_errno(link, r, "failed to parse ROUTES: %m");
+                if (r <= 0)
+                        break;
 
-                        prefixlen_str = strchr(route_str, '/');
-                        if (!prefixlen_str) {
-                                log_link_debug(link, "Failed to parse route %s", route_str);
-                                continue;
-                        }
+                prefixlen_str = strchr(route_str, '/');
+                if (!prefixlen_str) {
+                        log_link_debug(link, "Failed to parse route %s", route_str);
+                        continue;
+                }
+                *prefixlen_str++ = '\0';
 
-                        *prefixlen_str++ = '\0';
+                r = route_new(&tmp);
+                if (r < 0)
+                        return log_oom();
 
-                        r = route_new(&tmp);
-                        if (r < 0)
-                                return log_oom();
+                r = sscanf(prefixlen_str,
+                           "%hhu/%hhu/%"SCNu32"/%"PRIu32"/"USEC_FMT,
+                           &tmp->dst_prefixlen,
+                           &tmp->tos,
+                           &tmp->priority,
+                           &tmp->table,
+                           &tmp->lifetime);
+                if (r != 5) {
+                        log_link_debug(link,
+                                       "Failed to parse destination prefix length, tos, priority, table or expiration %s",
+                                       prefixlen_str);
+                        continue;
+                }
 
-                        r = sscanf(prefixlen_str, "%hhu/%hhu/%"SCNu32"/%"PRIu32"/"USEC_FMT, &tmp->dst_prefixlen, &tmp->tos, &tmp->priority, &tmp->table, &tmp->lifetime);
-                        if (r != 5) {
-                                log_link_debug(link,
-                                               "Failed to parse destination prefix length, tos, priority, table or expiration %s",
-                                               prefixlen_str);
-                                continue;
-                        }
+                r = in_addr_from_string_auto(route_str, &tmp->family, &tmp->dst);
+                if (r < 0) {
+                        log_link_debug_errno(link, r, "Failed to parse route destination %s: %m", route_str);
+                        continue;
+                }
 
-                        r = in_addr_from_string_auto(route_str, &tmp->family, &tmp->dst);
-                        if (r < 0) {
-                                log_link_debug_errno(link, r, "Failed to parse route destination %s: %m", route_str);
-                                continue;
-                        }
+                r = route_add(link, tmp, &route);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Failed to add route: %m");
 
-                        r = route_add(link, tmp, &route);
+                if (route->lifetime != USEC_INFINITY && !kernel_route_expiration_supported()) {
+                        r = sd_event_add_time(link->manager->event, &expire,
+                                              clock_boottime_or_monotonic(),
+                                              route->lifetime, 0, route_expire_handler, route);
                         if (r < 0)
-                                return log_link_error_errno(link, r, "Failed to add route: %m");
-
-                        if (route->lifetime != USEC_INFINITY && !kernel_route_expiration_supported()) {
-                                r = sd_event_add_time(link->manager->event, &expire, clock_boottime_or_monotonic(), route->lifetime,
-                                                      0, route_expire_handler, route);
-                                if (r < 0)
-                                        log_link_warning_errno(link, r, "Could not arm route expiration handler: %m");
-                        }
-
-                        sd_event_source_unref(route->expire);
-                        route->expire = TAKE_PTR(expire);
+                                log_link_warning_errno(link, r, "Could not arm route expiration handler: %m");
                 }
+
+                sd_event_source_unref(route->expire);
+                route->expire = TAKE_PTR(expire);
         }
 
         if (dhcp4_address) {
@@ -4351,33 +4375,6 @@ int link_save(Link *link) {
         print_link_hashmap(f, "CARRIER_BOUND_BY=", link->bound_by_links);
 
         if (link->dhcp_lease) {
-                struct in_addr address;
-                const char *tz = NULL;
-                size_t client_id_len;
-                const void *client_id;
-
-                assert(link->network);
-
-                r = sd_dhcp_lease_get_timezone(link->dhcp_lease, &tz);
-                if (r >= 0)
-                        fprintf(f, "TIMEZONE=%s\n", tz);
-
-                r = sd_dhcp_lease_get_address(link->dhcp_lease, &address);
-                if (r >= 0) {
-                        fputs("DHCP4_ADDRESS=", f);
-                        serialize_in_addrs(f, &address, 1, NULL, NULL);
-                        fputc('\n', f);
-                }
-
-                r = sd_dhcp_lease_get_client_id(link->dhcp_lease, &client_id, &client_id_len);
-                if (r >= 0) {
-                        _cleanup_free_ char *id = NULL;
-
-                        r = sd_dhcp_client_id_to_string(client_id, client_id_len, &id);
-                        if (r >= 0)
-                                fprintf(f, "DHCP4_CLIENT_ID=%s\n", id);
-                }
-
                 r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
                 if (r < 0)
                         goto fail;
@@ -4440,16 +4437,10 @@ void link_dirty(Link *link) {
         /* mark manager dirty as link is dirty */
         manager_dirty(link->manager);
 
-        r = set_ensure_allocated(&link->manager->dirty_links, NULL);
-        if (r < 0)
-                /* allocation errors are ignored */
-                return;
-
-        r = set_put(link->manager->dirty_links, link);
+        r = set_ensure_put(&link->manager->dirty_links, NULL, link);
         if (r <= 0)
-                /* don't take another ref if the link was already dirty */
+                /* Ignore allocation errors and don't take another ref if the link was already dirty */
                 return;
-
         link_ref(link);
 }
 
@@ -4461,16 +4452,6 @@ void link_clean(Link *link) {
         link_unref(set_remove(link->manager->dirty_links, link));
 }
 
-static const char* const link_ipv6_address_gen_mode_table[_LINK_IPV6_ADDRESS_GEN_MODE_MAX] = {
-        [LINK_IPV6_ADDRESSS_GEN_MODE_EUI64] = "eui64",
-        [LINK_IPV6_ADDRESSS_GEN_MODE_NONE] = "none",
-        [LINK_IPV6_ADDRESSS_GEN_MODE_STABLE_PRIVACY] = "stable-privacy",
-        [LINK_IPV6_ADDRESSS_GEN_MODE_RANDOM] = "random",
-};
-
-DEFINE_STRING_TABLE_LOOKUP(link_ipv6_address_gen_mode, LinkIPv6AddressGenMode);
-DEFINE_CONFIG_PARSE_ENUM(config_parse_link_ipv6_address_gen_mode, link_ipv6_address_gen_mode, LinkIPv6AddressGenMode, "Failed to parse link IPv6 address generation mode");
-
 static const char* const link_state_table[_LINK_STATE_MAX] = {
         [LINK_STATE_PENDING] = "pending",
         [LINK_STATE_INITIALIZED] = "initialized",
index 2d36ed24630cb3a19c7beeaabfe3168a5e40457f..f615e7e62dcf38e709bc71943f20c7d795b28bd7 100644 (file)
@@ -35,15 +35,6 @@ typedef enum LinkState {
         _LINK_STATE_INVALID = -1
 } LinkState;
 
-typedef enum LinkIPv6AddressGenMode {
-       LINK_IPV6_ADDRESSS_GEN_MODE_EUI64          = IN6_ADDR_GEN_MODE_EUI64,
-       LINK_IPV6_ADDRESSS_GEN_MODE_NONE           = IN6_ADDR_GEN_MODE_NONE,
-       LINK_IPV6_ADDRESSS_GEN_MODE_STABLE_PRIVACY = IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
-       LINK_IPV6_ADDRESSS_GEN_MODE_RANDOM         = IN6_ADDR_GEN_MODE_RANDOM,
-       _LINK_IPV6_ADDRESS_GEN_MODE_MAX,
-       _LINK_IPV6_ADDRESS_GEN_MODE_INVALID        = -1
-} LinkIPv6AddressGenMode;
-
 typedef struct Manager Manager;
 typedef struct Network Network;
 typedef struct Address Address;
@@ -91,6 +82,7 @@ typedef struct Link {
         unsigned routing_policy_rule_messages;
         unsigned routing_policy_rule_remove_messages;
         unsigned tc_messages;
+        unsigned sr_iov_messages;
         unsigned enslaving;
 
         Set *addresses;
@@ -127,6 +119,7 @@ typedef struct Link {
         bool static_nexthops_configured:1;
         bool routing_policy_rules_configured:1;
         bool tc_configured:1;
+        bool sr_iov_configured:1;
         bool setting_mtu:1;
         bool setting_genmode:1;
         bool ipv6_mtu_set:1;
@@ -220,9 +213,6 @@ int link_stop_clients(Link *link, bool may_keep_dhcp);
 const char* link_state_to_string(LinkState s) _const_;
 LinkState link_state_from_string(const char *s) _pure_;
 
-const char* link_ipv6_address_gen_mode_to_string(LinkIPv6AddressGenMode s) _const_;
-LinkIPv6AddressGenMode link_ipv6_address_gen_mode_from_string(const char *s) _pure_;
-
 uint32_t link_get_vrf_table(Link *link);
 uint32_t link_get_dhcp_route_table(Link *link);
 uint32_t link_get_ipv6_accept_ra_route_table(Link *link);
@@ -230,9 +220,6 @@ int link_request_set_routes(Link *link);
 int link_request_set_nexthop(Link *link);
 
 int link_reconfigure(Link *link, bool force);
-int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link);
-
-CONFIG_PARSER_PROTOTYPE(config_parse_link_ipv6_address_gen_mode);
 
 int log_link_message_full_errno(Link *link, sd_netlink_message *m, int level, int err, const char *msg);
 #define log_link_message_error_errno(link, m, err, msg)   log_link_message_full_errno(link, m, LOG_ERR, err, msg)
index 8692b9411e2a1bbdb2c890acdd61bf329a37ba8d..63e2f61d299e302308034f04c8603d1a8d4150db 100644 (file)
@@ -1272,6 +1272,9 @@ int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message,
         if (r < 0 && r != -ENODATA) {
                 log_warning_errno(r, "rtnl: could not get NHA_OIF attribute, ignoring: %m");
                 return 0;
+        } else if (tmp->oif <= 0) {
+                log_warning("rtnl: received nexthop message with invalid ifindex %d, ignoring.", tmp->oif);
+                return 0;
         }
 
         r = link_get(m, tmp->oif, &link);
@@ -2309,23 +2312,15 @@ int manager_request_product_uuid(Manager *m, Link *link) {
 
                 assert_se(duid = link_get_duid(link));
 
-                r = set_ensure_allocated(&m->links_requesting_uuid, NULL);
-                if (r < 0)
-                        return log_oom();
-
-                r = set_ensure_allocated(&m->duids_requesting_uuid, NULL);
+                r = set_ensure_put(&m->links_requesting_uuid, NULL, link);
                 if (r < 0)
                         return log_oom();
+                if (r > 0)
+                        link_ref(link);
 
-                r = set_put(m->links_requesting_uuid, link);
+                r = set_ensure_put(&m->duids_requesting_uuid, NULL, duid);
                 if (r < 0)
                         return log_oom();
-
-                r = set_put(m->duids_requesting_uuid, duid);
-                if (r < 0)
-                        return log_oom();
-
-                link_ref(link);
         }
 
         if (!m->bus || sd_bus_is_ready(m->bus) <= 0) {
index 19a655b2d7af1398792ce5827f00136878e75587..563901e33bd80a98dd12a10b2daf7499a645d14f 100644 (file)
@@ -591,10 +591,6 @@ static int ndisc_router_process_rdnss(Link *link, sd_ndisc_router *rt) {
                         continue;
                 }
 
-                r = set_ensure_allocated(&link->ndisc_rdnss, &ndisc_rdnss_hash_ops);
-                if (r < 0)
-                        return log_oom();
-
                 x = new(NDiscRDNSS, 1);
                 if (!x)
                         return log_oom();
@@ -604,13 +600,11 @@ static int ndisc_router_process_rdnss(Link *link, sd_ndisc_router *rt) {
                         .valid_until = time_now + lifetime * USEC_PER_SEC,
                 };
 
-                r = set_put(link->ndisc_rdnss, x);
+                r = set_ensure_consume(&link->ndisc_rdnss, &ndisc_rdnss_hash_ops, TAKE_PTR(x));
                 if (r < 0)
                         return log_oom();
-
-                TAKE_PTR(x);
-
                 assert(r > 0);
+
                 link_dirty(link);
         }
 
@@ -686,22 +680,15 @@ static void ndisc_router_process_dnssl(Link *link, sd_ndisc_router *rt) {
                         continue;
                 }
 
-                r = set_ensure_allocated(&link->ndisc_dnssl, &ndisc_dnssl_hash_ops);
-                if (r < 0) {
-                        log_oom();
-                        return;
-                }
-
                 s->valid_until = time_now + lifetime * USEC_PER_SEC;
 
-                r = set_put(link->ndisc_dnssl, s);
+                r = set_ensure_consume(&link->ndisc_dnssl, &ndisc_dnssl_hash_ops, TAKE_PTR(s));
                 if (r < 0) {
                         log_oom();
                         return;
                 }
-
-                s = NULL;
                 assert(r > 0);
+
                 link_dirty(link);
         }
 }
@@ -736,12 +723,12 @@ static int ndisc_router_process_options(Link *link, sd_ndisc_router *rt) {
                         if (r < 0)
                                 return log_link_error_errno(link, r, "Failed to get prefix address: %m");
 
-                        if (set_contains(link->network->ndisc_black_listed_prefix, &a.in6)) {
+                        if (set_contains(link->network->ndisc_deny_listed_prefix, &a.in6)) {
                                 if (DEBUG_LOGGING) {
                                         _cleanup_free_ char *b = NULL;
 
                                         (void) in_addr_to_string(AF_INET6, &a, &b);
-                                        log_link_debug(link, "Prefix '%s' is black listed, ignoring", strna(b));
+                                        log_link_debug(link, "Prefix '%s' is deny-listed, ignoring", strna(b));
                                 }
 
                                 break;
@@ -928,7 +915,7 @@ DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(
                 IPv6Token,
                 free);
 
-int config_parse_ndisc_black_listed_prefix(
+int config_parse_ndisc_deny_listed_prefix(
                 const char *unit,
                 const char *filename,
                 unsigned line,
@@ -950,7 +937,7 @@ int config_parse_ndisc_black_listed_prefix(
         assert(data);
 
         if (isempty(rvalue)) {
-                network->ndisc_black_listed_prefix = set_free_free(network->ndisc_black_listed_prefix);
+                network->ndisc_deny_listed_prefix = set_free_free(network->ndisc_deny_listed_prefix);
                 return 0;
         }
 
@@ -962,7 +949,7 @@ int config_parse_ndisc_black_listed_prefix(
                 r = extract_first_word(&p, &n, NULL, 0);
                 if (r < 0) {
                         log_syntax(unit, LOG_ERR, filename, line, r,
-                                   "Failed to parse NDISC black listed prefix, ignoring assignment: %s",
+                                   "Failed to parse NDISC deny-listed prefix, ignoring assignment: %s",
                                    rvalue);
                         return 0;
                 }
@@ -972,29 +959,20 @@ int config_parse_ndisc_black_listed_prefix(
                 r = in_addr_from_string(AF_INET6, n, &ip);
                 if (r < 0) {
                         log_syntax(unit, LOG_ERR, filename, line, r,
-                                   "NDISC black listed prefix is invalid, ignoring assignment: %s", n);
+                                   "NDISC deny-listed prefix is invalid, ignoring assignment: %s", n);
                         continue;
                 }
 
-                if (set_contains(network->ndisc_black_listed_prefix, &ip.in6))
+                if (set_contains(network->ndisc_deny_listed_prefix, &ip.in6))
                         continue;
 
-                r = set_ensure_allocated(&network->ndisc_black_listed_prefix, &in6_addr_hash_ops);
-                if (r < 0)
-                        return log_oom();
-
                 a = newdup(struct in6_addr, &ip.in6, 1);
                 if (!a)
                         return log_oom();
 
-                r = set_put(network->ndisc_black_listed_prefix, a);
-                if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r,
-                                   "Failed to store NDISC black listed prefix '%s', ignoring assignment: %m", n);
-                        continue;
-                }
-
-                TAKE_PTR(a);
+                r = set_ensure_consume(&network->ndisc_deny_listed_prefix, &in6_addr_hash_ops, TAKE_PTR(a));
+                if (r < 0)
+                        return log_oom();
         }
 
         return 0;
index 68cd1c2bd7bb4b9f5d997c19c57906983af64877..0bc2882a6c2e973444cc972d68d12d4f35156171 100644 (file)
@@ -51,7 +51,7 @@ int ndisc_configure(Link *link);
 void ndisc_vacuum(Link *link);
 void ndisc_flush(Link *link);
 
-CONFIG_PARSER_PROTOTYPE(config_parse_ndisc_black_listed_prefix);
+CONFIG_PARSER_PROTOTYPE(config_parse_ndisc_deny_listed_prefix);
 CONFIG_PARSER_PROTOTYPE(config_parse_address_generation_type);
 CONFIG_PARSER_PROTOTYPE(config_parse_ipv6_accept_ra_start_dhcp6_client);
 
index fd6219fccea59c5dcefdfd5408a03786e2d486d4..6d91f7051125aef5a2cbcb50b88e6e48dfa416fc 100644 (file)
@@ -300,11 +300,7 @@ static int neighbor_add_internal(Link *link, Set **neighbors, int family, const
                 .lladdr_size = lladdr_size,
         };
 
-        r = set_ensure_allocated(neighbors, &neighbor_hash_ops);
-        if (r < 0)
-                return r;
-
-        r = set_put(*neighbors, neighbor);
+        r = set_ensure_put(neighbors, &neighbor_hash_ops, neighbor);
         if (r < 0)
                 return r;
         if (r == 0)
@@ -314,8 +310,7 @@ static int neighbor_add_internal(Link *link, Set **neighbors, int family, const
 
         if (ret)
                 *ret = neighbor;
-
-        neighbor = NULL;
+        TAKE_PTR(neighbor);
 
         return 0;
 }
@@ -332,11 +327,7 @@ int neighbor_add(Link *link, int family, const union in_addr_union *addr, const
                         return r;
         } else if (r == 0) {
                 /* Neighbor is foreign, claim it as recognized */
-                r = set_ensure_allocated(&link->neighbors, &neighbor_hash_ops);
-                if (r < 0)
-                        return r;
-
-                r = set_put(link->neighbors, neighbor);
+                r = set_ensure_put(&link->neighbors, &neighbor_hash_ops, neighbor);
                 if (r < 0)
                         return r;
 
index fc756ef0fc761ba6a2afe86fce633a31ecb1624a..6b471c51e9e0f3d0728d5184e88b31a63a99ac59 100644 (file)
@@ -15,6 +15,7 @@ _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"")
 #include "networkd-ipv4ll.h"
 #include "networkd-ndisc.h"
 #include "networkd-network.h"
+#include "networkd-sriov.h"
 #include "qdisc.h"
 #include "tclass.h"
 #include "vlan-util.h"
@@ -52,8 +53,16 @@ Link.ARP,                                    config_parse_tristate,
 Link.Multicast,                              config_parse_tristate,                                    0,                             offsetof(Network, multicast)
 Link.AllMulticast,                           config_parse_tristate,                                    0,                             offsetof(Network, allmulticast)
 Link.Unmanaged,                              config_parse_bool,                                        0,                             offsetof(Network, unmanaged)
-Link.IPv6LinkLocalAddressGenerationMode,     config_parse_link_ipv6_address_gen_mode,                  0,                             offsetof(Network, ipv6_address_gen_mode)
 Link.RequiredForOnline,                      config_parse_required_for_online,                         0,                             0
+SR-IOV.VirtualFunction,                      config_parse_sr_iov_uint32,                               0,                             0
+SR-IOV.VLANId,                               config_parse_sr_iov_uint32,                               0,                             0
+SR-IOV.QualityOfService,                     config_parse_sr_iov_uint32,                               0,                             0
+SR-IOV.VLANProtocol,                         config_parse_sr_iov_vlan_proto,                           0,                             0
+SR-IOV.MACSpoofCheck,                        config_parse_sr_iov_boolean,                              0,                             0
+SR-IOV.QueryReceiveSideScaling,              config_parse_sr_iov_boolean,                              0,                             0
+SR-IOV.Trust,                                config_parse_sr_iov_boolean,                              0,                             0
+SR-IOV.LinkState,                            config_parse_sr_iov_link_state,                           0,                             0
+SR-IOV.MACAddress,                           config_parse_sr_iov_mac,                                  0,                             0
 Network.Description,                         config_parse_string,                                      0,                             offsetof(Network, description)
 Network.Bridge,                              config_parse_ifname,                                      0,                             offsetof(Network, bridge_name)
 Network.Bond,                                config_parse_ifname,                                      0,                             offsetof(Network, bond_name)
@@ -71,6 +80,7 @@ Network.VRF,                                 config_parse_ifname,
 Network.DHCP,                                config_parse_dhcp,                                        0,                             offsetof(Network, dhcp)
 Network.DHCPServer,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_server)
 Network.LinkLocalAddressing,                 config_parse_link_local_address_family,                   0,                             offsetof(Network, link_local)
+Network.IPv6LinkLocalAddressGenerationMode,  config_parse_ipv6_link_local_address_gen_mode,            0,                             offsetof(Network, ipv6ll_address_gen_mode)
 Network.IPv4LLRoute,                         config_parse_bool,                                        0,                             offsetof(Network, ipv4ll_route)
 Network.DefaultRouteOnDevice,                config_parse_bool,                                        0,                             offsetof(Network, default_route_on_device)
 Network.IPv6Token,                           config_parse_address_generation_type,                     0,                             0
@@ -187,7 +197,8 @@ DHCPv4.IAID,                                 config_parse_iaid,
 DHCPv4.ListenPort,                           config_parse_uint16,                                      0,                             offsetof(Network, dhcp_client_port)
 DHCPv4.SendRelease,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_send_release)
 DHCPv4.SendDecline,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_send_decline)
-DHCPv4.BlackList,                            config_parse_dhcp_black_listed_ip_address,                0,                             0
+DHCPv4.DenyList,                             config_parse_dhcp_acl_ip_address,                         0,                             0
+DHCPv4.AllowList,                            config_parse_dhcp_acl_ip_address,                         0,                             0
 DHCPv4.IPServiceType,                        config_parse_dhcp_ip_service_type,                        0,                             offsetof(Network, ip_service_type)
 DHCPv4.SendOption,                           config_parse_dhcp_send_option,                            AF_INET,                       offsetof(Network, dhcp_client_send_options)
 DHCPv4.SendVendorOption,                     config_parse_dhcp_send_option,                            0,                             offsetof(Network, dhcp_client_send_vendor_options)
@@ -205,7 +216,7 @@ DHCPv6.ForceDHCPv6PDOtherInformation,        config_parse_bool,
 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_bool,                                        0,                             offsetof(Network, dhcp6_without_ra)
+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)
 DHCPv6.RouteMetric,                          config_parse_dhcp_route_metric,                           0,                             0
 IPv6AcceptRA.UseAutonomousPrefix,            config_parse_bool,                                        0,                             offsetof(Network, ipv6_accept_ra_use_autonomous_prefix)
@@ -214,7 +225,8 @@ IPv6AcceptRA.UseDNS,                         config_parse_bool,
 IPv6AcceptRA.UseDomains,                     config_parse_dhcp_use_domains,                            0,                             offsetof(Network, ipv6_accept_ra_use_domains)
 IPv6AcceptRA.DHCPv6Client,                   config_parse_ipv6_accept_ra_start_dhcp6_client,           0,                             offsetof(Network, ipv6_accept_ra_start_dhcp6_client)
 IPv6AcceptRA.RouteTable,                     config_parse_section_route_table,                         0,                             0
-IPv6AcceptRA.BlackList,                      config_parse_ndisc_black_listed_prefix,                   0,                             0
+IPv6AcceptRA.DenyList,                       config_parse_ndisc_deny_listed_prefix,                    0,                             0
+IPv6AcceptRA.BlackList,                      config_parse_ndisc_deny_listed_prefix,                    0,                             0
 DHCPServer.MaxLeaseTimeSec,                  config_parse_sec,                                         0,                             offsetof(Network, dhcp_server_max_lease_time_usec)
 DHCPServer.DefaultLeaseTimeSec,              config_parse_sec,                                         0,                             offsetof(Network, dhcp_server_default_lease_time_usec)
 DHCPServer.EmitDNS,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_server_emit[SD_DHCP_LEASE_DNS].emit)
@@ -292,11 +304,11 @@ QDisc.Parent,                                config_parse_qdisc_parent,
 QDisc.Handle,                                config_parse_qdisc_handle,                                _QDISC_KIND_INVALID,           0
 BFIFO.Parent,                                config_parse_qdisc_parent,                                QDISC_KIND_BFIFO,              0
 BFIFO.Handle,                                config_parse_qdisc_handle,                                QDISC_KIND_BFIFO,              0
-BFIFO.LimitSize,                             config_parse_bfifo_size,                                  QDISC_KIND_BFIFO,              0
+BFIFO.LimitBytes,                            config_parse_bfifo_size,                                  QDISC_KIND_BFIFO,              0
 CAKE.Parent,                                 config_parse_qdisc_parent,                                QDISC_KIND_CAKE,               0
 CAKE.Handle,                                 config_parse_qdisc_handle,                                QDISC_KIND_CAKE,               0
 CAKE.Bandwidth,                              config_parse_cake_bandwidth,                              QDISC_KIND_CAKE,               0
-CAKE.Overhead,                               config_parse_cake_overhead,                               QDISC_KIND_CAKE,               0
+CAKE.OverheadBytes,                          config_parse_cake_overhead,                               QDISC_KIND_CAKE,               0
 ControlledDelay.Parent,                      config_parse_qdisc_parent,                                QDISC_KIND_CODEL,              0
 ControlledDelay.Handle,                      config_parse_qdisc_handle,                                QDISC_KIND_CODEL,              0
 ControlledDelay.PacketLimit,                 config_parse_controlled_delay_u32,                        QDISC_KIND_CODEL,              0
@@ -308,7 +320,13 @@ DeficitRoundRobinScheduler.Parent,           config_parse_qdisc_parent,
 DeficitRoundRobinScheduler.Handle,           config_parse_qdisc_handle,                                QDISC_KIND_DRR,                0
 DeficitRoundRobinSchedulerClass.Parent,      config_parse_tclass_parent,                               TCLASS_KIND_DRR,               0
 DeficitRoundRobinSchedulerClass.ClassId,     config_parse_tclass_classid,                              TCLASS_KIND_DRR,               0
-DeficitRoundRobinSchedulerClass.Quantum,     config_parse_drr_size,                                    TCLASS_KIND_DRR,               0
+DeficitRoundRobinSchedulerClass.QuantumBytes, config_parse_drr_size,                                   TCLASS_KIND_DRR,               0
+EnhancedTransmissionSelection.Parent,        config_parse_qdisc_parent,                                QDISC_KIND_ETS,                0
+EnhancedTransmissionSelection.Handle,        config_parse_qdisc_handle,                                QDISC_KIND_ETS,                0
+EnhancedTransmissionSelection.Bands,         config_parse_ets_u8,                                      QDISC_KIND_ETS,                0
+EnhancedTransmissionSelection.StrictBands,   config_parse_ets_u8,                                      QDISC_KIND_ETS,                0
+EnhancedTransmissionSelection.QuantumBytes,  config_parse_ets_quanta,                                  QDISC_KIND_ETS,                0
+EnhancedTransmissionSelection.PriorityMap,   config_parse_ets_prio,                                    QDISC_KIND_ETS,                0
 PFIFO.Parent,                                config_parse_qdisc_parent,                                QDISC_KIND_PFIFO,              0
 PFIFO.Handle,                                config_parse_qdisc_handle,                                QDISC_KIND_PFIFO,              0
 PFIFO.PacketLimit,                           config_parse_pfifo_size,                                  QDISC_KIND_PFIFO,              0
@@ -322,13 +340,13 @@ QuickFairQueueing.Handle,                    config_parse_qdisc_handle,
 QuickFairQueueingClass.Parent,               config_parse_tclass_parent,                               TCLASS_KIND_QFQ,               0
 QuickFairQueueingClass.ClassId,              config_parse_tclass_classid,                              TCLASS_KIND_QFQ,               0
 QuickFairQueueingClass.Weight,               config_parse_quick_fair_queueing_weight,                  TCLASS_KIND_QFQ,               0
-QuickFairQueueingClass.MaxPacketSize,        config_parse_quick_fair_queueing_max_packet,              TCLASS_KIND_QFQ,               0
+QuickFairQueueingClass.MaxPacketBytes,       config_parse_quick_fair_queueing_max_packet,              TCLASS_KIND_QFQ,               0
 FairQueueing.Parent,                         config_parse_qdisc_parent,                                QDISC_KIND_FQ,                 0
 FairQueueing.Handle,                         config_parse_qdisc_handle,                                QDISC_KIND_FQ,                 0
 FairQueueing.PacketLimit,                    config_parse_fair_queueing_u32,                           QDISC_KIND_FQ,                 0
 FairQueueing.FlowLimit,                      config_parse_fair_queueing_u32,                           QDISC_KIND_FQ,                 0
-FairQueueing.Quantum,                        config_parse_fair_queueing_size,                          QDISC_KIND_FQ,                 0
-FairQueueing.InitialQuantum,                 config_parse_fair_queueing_size,                          QDISC_KIND_FQ,                 0
+FairQueueing.QuantumBytes,                   config_parse_fair_queueing_size,                          QDISC_KIND_FQ,                 0
+FairQueueing.InitialQuantumBytes,            config_parse_fair_queueing_size,                          QDISC_KIND_FQ,                 0
 FairQueueing.MaximumRate,                    config_parse_fair_queueing_max_rate,                      QDISC_KIND_FQ,                 0
 FairQueueing.Buckets,                        config_parse_fair_queueing_u32,                           QDISC_KIND_FQ,                 0
 FairQueueing.OrphanMask,                     config_parse_fair_queueing_u32,                           QDISC_KIND_FQ,                 0
@@ -337,9 +355,9 @@ FairQueueing.CEThresholdSec,                 config_parse_fair_queueing_usec,
 FairQueueingControlledDelay.Parent,          config_parse_qdisc_parent,                                QDISC_KIND_FQ_CODEL,           0
 FairQueueingControlledDelay.Handle,          config_parse_qdisc_handle,                                QDISC_KIND_FQ_CODEL,           0
 FairQueueingControlledDelay.PacketLimit,     config_parse_fair_queueing_controlled_delay_u32,          QDISC_KIND_FQ_CODEL,           0
-FairQueueingControlledDelay.MemoryLimit,     config_parse_fair_queueing_controlled_delay_size,         QDISC_KIND_FQ_CODEL,           0
+FairQueueingControlledDelay.MemoryLimitBytes, config_parse_fair_queueing_controlled_delay_size,        QDISC_KIND_FQ_CODEL,           0
 FairQueueingControlledDelay.Flows,           config_parse_fair_queueing_controlled_delay_u32,          QDISC_KIND_FQ_CODEL,           0
-FairQueueingControlledDelay.Quantum,         config_parse_fair_queueing_controlled_delay_size,         QDISC_KIND_FQ_CODEL,           0
+FairQueueingControlledDelay.QuantumBytes,    config_parse_fair_queueing_controlled_delay_size,         QDISC_KIND_FQ_CODEL,           0
 FairQueueingControlledDelay.TargetSec,       config_parse_fair_queueing_controlled_delay_usec,         QDISC_KIND_FQ_CODEL,           0
 FairQueueingControlledDelay.IntervalSec,     config_parse_fair_queueing_controlled_delay_usec,         QDISC_KIND_FQ_CODEL,           0
 FairQueueingControlledDelay.CEThresholdSec,  config_parse_fair_queueing_controlled_delay_usec,         QDISC_KIND_FQ_CODEL,           0
@@ -355,11 +373,17 @@ HeavyHitterFilter.PacketLimit,               config_parse_heavy_hitter_filter_pa
 HierarchyTokenBucket.Parent,                 config_parse_qdisc_parent,                                QDISC_KIND_HTB,                0
 HierarchyTokenBucket.Handle,                 config_parse_qdisc_handle,                                QDISC_KIND_HTB,                0
 HierarchyTokenBucket.DefaultClass,           config_parse_hierarchy_token_bucket_default_class,        QDISC_KIND_HTB,                0
+HierarchyTokenBucket.RateToQuantum,          config_parse_hierarchy_token_bucket_u32,                  QDISC_KIND_HTB,                0
 HierarchyTokenBucketClass.Parent,            config_parse_tclass_parent,                               TCLASS_KIND_HTB,               0
 HierarchyTokenBucketClass.ClassId,           config_parse_tclass_classid,                              TCLASS_KIND_HTB,               0
-HierarchyTokenBucketClass.Priority,          config_parse_hierarchy_token_bucket_u32,                  TCLASS_KIND_HTB,               0
-HierarchyTokenBucketClass.Rate,              config_parse_hierarchy_token_bucket_rate,                 TCLASS_KIND_HTB,               0
-HierarchyTokenBucketClass.CeilRate,          config_parse_hierarchy_token_bucket_rate,                 TCLASS_KIND_HTB,               0
+HierarchyTokenBucketClass.Priority,          config_parse_hierarchy_token_bucket_class_u32,            TCLASS_KIND_HTB,               0
+HierarchyTokenBucketClass.QuantumBytes,      config_parse_hierarchy_token_bucket_class_size,           TCLASS_KIND_HTB,               0
+HierarchyTokenBucketClass.MTUBytes,          config_parse_hierarchy_token_bucket_class_size,           TCLASS_KIND_HTB,               0
+HierarchyTokenBucketClass.OverheadBytes,     config_parse_hierarchy_token_bucket_class_size,           TCLASS_KIND_HTB,               0
+HierarchyTokenBucketClass.Rate,              config_parse_hierarchy_token_bucket_class_rate,           TCLASS_KIND_HTB,               0
+HierarchyTokenBucketClass.CeilRate,          config_parse_hierarchy_token_bucket_class_rate,           TCLASS_KIND_HTB,               0
+HierarchyTokenBucketClass.BufferBytes,       config_parse_hierarchy_token_bucket_class_size,           TCLASS_KIND_HTB,               0
+HierarchyTokenBucketClass.CeilBufferBytes,   config_parse_hierarchy_token_bucket_class_size,           TCLASS_KIND_HTB,               0
 NetworkEmulator.Parent,                      config_parse_qdisc_parent,                                QDISC_KIND_NETEM,              0
 NetworkEmulator.Handle,                      config_parse_qdisc_handle,                                QDISC_KIND_NETEM,              0
 NetworkEmulator.DelaySec,                    config_parse_network_emulator_delay,                      QDISC_KIND_NETEM,              0
@@ -378,18 +402,19 @@ StochasticFairnessQueueing.Handle,           config_parse_qdisc_handle,
 StochasticFairnessQueueing.PerturbPeriodSec, config_parse_stochastic_fairness_queueing_perturb_period, QDISC_KIND_SFQ,                0
 TokenBucketFilter.Parent,                    config_parse_qdisc_parent,                                QDISC_KIND_TBF,                0
 TokenBucketFilter.Handle,                    config_parse_qdisc_handle,                                QDISC_KIND_TBF,                0
-TokenBucketFilter.Rate,                      config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
-TokenBucketFilter.Burst,                     config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
-TokenBucketFilter.LimitSize,                 config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
+TokenBucketFilter.Rate,                      config_parse_token_bucket_filter_rate,                    QDISC_KIND_TBF,                0
+TokenBucketFilter.BurstBytes,                config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
+TokenBucketFilter.LimitBytes,                config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
 TokenBucketFilter.MTUBytes,                  config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
 TokenBucketFilter.MPUBytes,                  config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
-TokenBucketFilter.PeakRate,                  config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
+TokenBucketFilter.PeakRate,                  config_parse_token_bucket_filter_rate,                    QDISC_KIND_TBF,                0
 TokenBucketFilter.LatencySec,                config_parse_token_bucket_filter_latency,                 QDISC_KIND_TBF,                0
 TrivialLinkEqualizer.Parent,                 config_parse_qdisc_parent,                                QDISC_KIND_TEQL,               0
 TrivialLinkEqualizer.Handle,                 config_parse_qdisc_handle,                                QDISC_KIND_TEQL,               0
 TrivialLinkEqualizer.Id,                     config_parse_trivial_link_equalizer_id,                   QDISC_KIND_TEQL,               0
 /* backwards compatibility: do not add new entries to this section */
 Network.IPv4LL,                              config_parse_ipv4ll,                                      0,                             offsetof(Network, link_local)
+DHCPv4.BlackList,                            config_parse_dhcp_acl_ip_address,                         0,                             0
 DHCP.ClientIdentifier,                       config_parse_dhcp_client_identifier,                      0,                             offsetof(Network, dhcp_client_identifier)
 DHCP.UseDNS,                                 config_parse_dhcp_use_dns,                                0,                             0
 DHCP.UseNTP,                                 config_parse_dhcp_use_ntp,                                0,                             0
@@ -422,3 +447,9 @@ TrafficControlQueueingDiscipline.NetworkEmulatorDelayJitterSec, config_parse_net
 TrafficControlQueueingDiscipline.NetworkEmulatorLossRate,       config_parse_network_emulator_rate,    0,                             0
 TrafficControlQueueingDiscipline.NetworkEmulatorDuplicateRate,  config_parse_network_emulator_rate,    0,                             0
 TrafficControlQueueingDiscipline.NetworkEmulatorPacketLimit,    config_parse_network_emulator_packet_limit, 0,                        0
+FairQueueing.Quantum,                        config_parse_fair_queueing_size,                          QDISC_KIND_FQ,                 0
+FairQueueing.InitialQuantum,                 config_parse_fair_queueing_size,                          QDISC_KIND_FQ,                 0
+FairQueueingControlledDelay.MemoryLimit,     config_parse_fair_queueing_controlled_delay_size,         QDISC_KIND_FQ_CODEL,           0
+FairQueueingControlledDelay.Quantum,         config_parse_fair_queueing_controlled_delay_size,         QDISC_KIND_FQ_CODEL,           0
+TokenBucketFilter.Burst,                     config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
+TokenBucketFilter.LimitSize,                 config_parse_token_bucket_filter_size,                    QDISC_KIND_TBF,                0
index f0fa5d04272ce1a826ce29cd79ae93601192e456..22bd06a891179bf7370e833666ec13b7b8c0d04e 100644 (file)
@@ -16,6 +16,7 @@
 #include "network-internal.h"
 #include "networkd-manager.h"
 #include "networkd-network.h"
+#include "networkd-sriov.h"
 #include "parse-util.h"
 #include "path-lookup.h"
 #include "set.h"
@@ -158,6 +159,7 @@ int network_verify(Network *network) {
         Route *route, *route_next;
         FdbEntry *fdb, *fdb_next;
         TrafficControl *tc;
+        SRIOV *sr_iov;
         Iterator i;
 
         assert(network);
@@ -330,6 +332,10 @@ int network_verify(Network *network) {
                 if (traffic_control_section_verify(tc, &has_root, &has_clsact) < 0)
                         traffic_control_free(tc);
 
+        ORDERED_HASHMAP_FOREACH(sr_iov, network->sr_iov_by_section, i)
+                if (sr_iov_section_verify(sr_iov) < 0)
+                        sr_iov_free(sr_iov);
+
         return 0;
 }
 
@@ -451,6 +457,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
 
                 /* If LinkLocalAddressing= is not set, then set to ADDRESS_FAMILY_IPV6 later. */
                 .link_local = _ADDRESS_FAMILY_INVALID,
+                .ipv6ll_address_gen_mode = _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_INVALID,
 
                 .ipv4_accept_local = -1,
 
@@ -474,7 +481,6 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                 .configure_without_carrier = false,
                 .ignore_carrier_loss = -1,
                 .keep_configuration = _KEEP_CONFIGURATION_INVALID,
-                .ipv6_address_gen_mode = _LINK_IPV6_ADDRESS_GEN_MODE_INVALID,
                 .can_triple_sampling = -1,
                 .can_termination = -1,
                 .ip_service_type = -1,
@@ -484,6 +490,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                         filename, NETWORK_DIRS, dropin_dirname,
                         "Match\0"
                         "Link\0"
+                        "SR-IOV\0"
                         "Network\0"
                         "Address\0"
                         "Neighbor\0"
@@ -512,6 +519,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                         "ControlledDelay\0"
                         "DeficitRoundRobinScheduler\0"
                         "DeficitRoundRobinSchedulerClass\0"
+                        "EnhancedTransmissionSelection\0"
                         "FairQueueing\0"
                         "FairQueueingControlledDelay\0"
                         "GenericRandomEarlyDetection\0"
@@ -661,7 +669,8 @@ static Network *network_free(Network *network) {
         free(network->dhcp_mudurl);
         strv_free(network->dhcp_user_class);
         free(network->dhcp_hostname);
-        set_free(network->dhcp_black_listed_ip);
+        set_free(network->dhcp_deny_listed_ip);
+        set_free(network->dhcp_allow_listed_ip);
         set_free(network->dhcp_request_options);
         set_free(network->dhcp6_request_options);
         free(network->mac);
@@ -680,7 +689,7 @@ static Network *network_free(Network *network) {
 
         ordered_set_free_free(network->router_search_domains);
         free(network->router_dns);
-        set_free_free(network->ndisc_black_listed_prefix);
+        set_free_free(network->ndisc_deny_listed_prefix);
 
         free(network->bridge_name);
         free(network->bond_name);
@@ -730,6 +739,7 @@ static Network *network_free(Network *network) {
         hashmap_free(network->prefixes_by_section);
         hashmap_free(network->route_prefixes_by_section);
         hashmap_free(network->rules_by_section);
+        ordered_hashmap_free_with_destructor(network->sr_iov_by_section, sr_iov_free);
         ordered_hashmap_free_with_destructor(network->tc_by_section, traffic_control_free);
 
         if (network->manager &&
@@ -1268,15 +1278,9 @@ int config_parse_dnssec_negative_trust_anchors(
                         continue;
                 }
 
-                r = set_ensure_allocated(&n->dnssec_negative_trust_anchors, &dns_name_hash_ops);
-                if (r < 0)
-                        return log_oom();
-
-                r = set_put(n->dnssec_negative_trust_anchors, w);
+                r = set_ensure_consume(&n->dnssec_negative_trust_anchors, &dns_name_hash_ops, TAKE_PTR(w));
                 if (r < 0)
                         return log_oom();
-                if (r > 0)
-                        w = NULL;
         }
 
         return 0;
@@ -1397,3 +1401,13 @@ static const char* const keep_configuration_table[_KEEP_CONFIGURATION_MAX] = {
 };
 
 DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(keep_configuration, KeepConfiguration, KEEP_CONFIGURATION_YES);
+
+static const char* const ipv6_link_local_address_gen_mode_table[_IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_MAX] = {
+        [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_EUI64] = "eui64",
+        [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_NONE] = "none",
+        [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_STABLE_PRIVACY] = "stable-privacy",
+        [IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_RANDOM] = "random",
+};
+
+DEFINE_STRING_TABLE_LOOKUP(ipv6_link_local_address_gen_mode, IPv6LinkLocalAddressGenMode);
+DEFINE_CONFIG_PARSE_ENUM(config_parse_ipv6_link_local_address_gen_mode, ipv6_link_local_address_gen_mode, IPv6LinkLocalAddressGenMode, "Failed to parse IPv6 link local address generation mode");
index a2fcc5209b5703c6e6444fa7b7a5b11f3713ad46..424298248f963b877b52b1f94635d8bd6674f171 100644 (file)
@@ -17,6 +17,7 @@
 #include "networkd-brvlan.h"
 #include "networkd-dhcp-common.h"
 #include "networkd-dhcp4.h"
+#include "networkd-dhcp6.h"
 #include "networkd-dhcp-server.h"
 #include "networkd-fdb.h"
 #include "networkd-ipv6-proxy-ndp.h"
@@ -52,6 +53,15 @@ typedef enum KeepConfiguration {
         _KEEP_CONFIGURATION_INVALID = -1,
 } KeepConfiguration;
 
+typedef enum IPv6LinkLocalAddressGenMode {
+       IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_EUI64          = IN6_ADDR_GEN_MODE_EUI64,
+       IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_NONE           = IN6_ADDR_GEN_MODE_NONE,
+       IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_STABLE_PRIVACY = IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
+       IPV6_LINK_LOCAL_ADDRESSS_GEN_MODE_RANDOM         = IN6_ADDR_GEN_MODE_RANDOM,
+       _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_MAX,
+       _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_INVALID        = -1
+} IPv6LinkLocalAddressGenMode;
+
 typedef struct Manager Manager;
 
 typedef struct NetworkDHCPServerEmitAddress {
@@ -129,7 +139,8 @@ struct Network {
         bool dhcp_send_decline;
         DHCPUseDomains dhcp_use_domains;
         sd_ipv4acd *dhcp_acd;
-        Set *dhcp_black_listed_ip;
+        Set *dhcp_deny_listed_ip;
+        Set *dhcp_allow_listed_ip;
         Set *dhcp_request_options;
         OrderedHashmap *dhcp_client_send_options;
         OrderedHashmap *dhcp_client_send_vendor_options;
@@ -141,7 +152,6 @@ struct Network {
         bool dhcp6_use_dns_set;
         bool dhcp6_use_ntp;
         bool dhcp6_use_ntp_set;
-        bool dhcp6_without_ra;
         uint8_t dhcp6_pd_length;
         uint32_t dhcp6_route_metric;
         bool dhcp6_route_metric_set;
@@ -149,6 +159,7 @@ struct Network {
         char **dhcp6_user_class;
         char **dhcp6_vendor_class;
         struct in6_addr dhcp6_pd_address;
+        DHCP6ClientStartMode dhcp6_without_ra;
         OrderedHashmap *dhcp6_client_send_options;
         OrderedHashmap *dhcp6_client_send_vendor_options;
         Set *dhcp6_request_options;
@@ -163,8 +174,9 @@ struct Network {
         uint32_t dhcp_server_pool_offset;
         uint32_t dhcp_server_pool_size;
 
-        /* IPV4LL Support */
+        /* link local addressing support */
         AddressFamily link_local;
+        IPv6LinkLocalAddressGenMode ipv6ll_address_gen_mode;
         bool ipv4ll_route;
 
         bool default_route_on_device;
@@ -241,7 +253,7 @@ struct Network {
         DHCPUseDomains ipv6_accept_ra_use_domains;
         IPv6AcceptRAStartDHCP6Client ipv6_accept_ra_start_dhcp6_client;
         uint32_t ipv6_accept_ra_route_table;
-        Set *ndisc_black_listed_prefix;
+        Set *ndisc_deny_listed_prefix;
         OrderedHashmap *ipv6_tokens;
 
         IPv6PrivacyExtensions ipv6_privacy_extensions;
@@ -256,7 +268,6 @@ struct Network {
         bool configure_without_carrier;
         int ignore_carrier_loss;
         KeepConfiguration keep_configuration;
-        LinkIPv6AddressGenMode ipv6_address_gen_mode;
         uint32_t iaid;
         DUID duid;
 
@@ -302,6 +313,7 @@ struct Network {
         Hashmap *route_prefixes_by_section;
         Hashmap *rules_by_section;
         OrderedHashmap *tc_by_section;
+        OrderedHashmap *sr_iov_by_section;
 
         /* All kinds of DNS configuration */
         struct in_addr_data *dns;
@@ -351,6 +363,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_dnssec_negative_trust_anchors);
 CONFIG_PARSER_PROTOTYPE(config_parse_ntp);
 CONFIG_PARSER_PROTOTYPE(config_parse_required_for_online);
 CONFIG_PARSER_PROTOTYPE(config_parse_keep_configuration);
+CONFIG_PARSER_PROTOTYPE(config_parse_ipv6_link_local_address_gen_mode);
 
 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
 
@@ -359,3 +372,6 @@ IPv6PrivacyExtensions ipv6_privacy_extensions_from_string(const char *s) _pure_;
 
 const char* keep_configuration_to_string(KeepConfiguration i) _const_;
 KeepConfiguration keep_configuration_from_string(const char *s) _pure_;
+
+const char* ipv6_link_local_address_gen_mode_to_string(IPv6LinkLocalAddressGenMode s) _const_;
+IPv6LinkLocalAddressGenMode ipv6_link_local_address_gen_mode_from_string(const char *s) _pure_;
index 45c13ca88f3245e4caeef569c84f9e8ae5ac3515..5d91d791d17f21b4b60cbe48157347499b21c0c1 100644 (file)
@@ -209,11 +209,7 @@ static int nexthop_add_internal(Link *link, Set **nexthops, NextHop *in, NextHop
         nexthop->family = in->family;
         nexthop->gw = in->gw;
 
-        r = set_ensure_allocated(nexthops, &nexthop_hash_ops);
-        if (r < 0)
-                return r;
-
-        r = set_put(*nexthops, nexthop);
+        r = set_ensure_put(nexthops, &nexthop_hash_ops, nexthop);
         if (r < 0)
                 return r;
         if (r == 0)
@@ -245,11 +241,7 @@ int nexthop_add(Link *link, NextHop *in, NextHop **ret) {
                         return r;
         } else if (r == 0) {
                 /* Take over a foreign nexthop */
-                r = set_ensure_allocated(&link->nexthops, &nexthop_hash_ops);
-                if (r < 0)
-                        return r;
-
-                r = set_put(link->nexthops, nexthop);
+                r = set_ensure_put(&link->nexthops, &nexthop_hash_ops, nexthop);
                 if (r < 0)
                         return r;
 
index f5f8ec65ed7d4980820dadd8c7a9e93b728d7557..d52aadecfa2a65912ca8fd64093189324badb68b 100644 (file)
@@ -672,6 +672,37 @@ int radv_configure(Link *link) {
         return 0;
 }
 
+int radv_add_prefix(Link *link, 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;
+
+        assert(link);
+        assert(link->radv);
+
+        r = sd_radv_prefix_new(&p);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_prefix_set_prefix(p, prefix, prefix_len);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_prefix_set_preferred_lifetime(p, lifetime_preferred);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_prefix_set_valid_lifetime(p, lifetime_valid);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_add_prefix(link->radv, p, true);
+        if (r < 0 && r != -EEXIST)
+                return r;
+
+        return 0;
+}
+
 int config_parse_radv_dns(
                 const char *unit,
                 const char *filename,
index b115243ef5c0c4ac0849e927980f8fd32b4c9816..741aa8692f040540ed91bd8866e9e57faf78ba59 100644 (file)
@@ -52,6 +52,8 @@ DEFINE_NETWORK_SECTION_FUNCTIONS(RoutePrefix, route_prefix_free);
 
 int radv_emit_dns(Link *link);
 int radv_configure(Link *link);
+int radv_add_prefix(Link *link, struct in6_addr *prefix, uint8_t prefix_len,
+                    uint32_t lifetime_preferred, uint32_t lifetime_valid);
 
 const char* radv_prefix_delegation_to_string(RADVPrefixDelegation i) _const_;
 RADVPrefixDelegation radv_prefix_delegation_from_string(const char *s) _pure_;
index de532eee7aa128bf7ff840512914694cc3e222f6..c93bf9feacd035e7339d2deb09a0453df725a001 100644 (file)
@@ -331,11 +331,7 @@ static int route_add_internal(Link *link, Set **routes, Route *in, Route **ret)
         route->initrwnd = in->initrwnd;
         route->lifetime = in->lifetime;
 
-        r = set_ensure_allocated(routes, &route_hash_ops);
-        if (r < 0)
-                return r;
-
-        r = set_put(*routes, route);
+        r = set_ensure_put(routes, &route_hash_ops, route);
         if (r < 0)
                 return r;
         if (r == 0)
@@ -368,11 +364,7 @@ int route_add(Link *link, Route *in, Route **ret) {
                         return r;
         } else if (r == 0) {
                 /* Take over a foreign route */
-                r = set_ensure_allocated(&link->routes, &route_hash_ops);
-                if (r < 0)
-                        return r;
-
-                r = set_put(link->routes, route);
+                r = set_ensure_put(&link->routes, &route_hash_ops, route);
                 if (r < 0)
                         return r;
 
index 641f8840845c66d76c8468df0d810f9d25f1808e..035f006d35bdd39681d0776c785729b28e928a56 100644 (file)
@@ -263,11 +263,7 @@ int routing_policy_rule_make_local(Manager *m, RoutingPolicyRule *rule) {
         if (set_contains(m->rules_foreign, rule)) {
                 set_remove(m->rules_foreign, rule);
 
-                r = set_ensure_allocated(&m->rules, &routing_policy_rule_hash_ops);
-                if (r < 0)
-                        return r;
-
-                r = set_put(m->rules, rule);
+                r = set_ensure_put(&m->rules, &routing_policy_rule_hash_ops, rule);
                 if (r < 0)
                         return r;
                 if (r == 0)
@@ -295,11 +291,7 @@ static int routing_policy_rule_add_internal(Manager *m, Set **rules, RoutingPoli
         if (r < 0)
                 return r;
 
-        r = set_ensure_allocated(rules, &routing_policy_rule_hash_ops);
-        if (r < 0)
-                return r;
-
-        r = set_put(*rules, rule);
+        r = set_ensure_put(rules, &routing_policy_rule_hash_ops, rule);
         if (r < 0)
                 return r;
         if (r == 0)
@@ -514,17 +506,17 @@ int routing_policy_rule_configure(RoutingPolicyRule *rule, Link *link, link_netl
         if (rule->tos > 0) {
                 r = sd_rtnl_message_routing_policy_rule_set_tos(m, rule->tos);
                 if (r < 0)
-                        return log_link_error_errno(link, r, "Could not set ip rule tos: %m");
+                        return log_link_error_errno(link, r, "Could not set IP rule TOS: %m");
         }
 
         if (rule->table < 256) {
                 r = sd_rtnl_message_routing_policy_rule_set_table(m, rule->table);
                 if (r < 0)
-                        return log_link_error_errno(link, r, "Could not set ip rule table: %m");
+                        return log_link_error_errno(link, r, "Could not set IP rule table: %m");
         } else {
                 r = sd_rtnl_message_routing_policy_rule_set_table(m, RT_TABLE_UNSPEC);
                 if (r < 0)
-                        return log_link_error_errno(link, r, "Could not set ip rule table: %m");
+                        return log_link_error_errno(link, r, "Could not set IP rule table: %m");
 
                 r = sd_netlink_message_append_u32(m, FRA_TABLE, rule->table);
                 if (r < 0)
@@ -706,7 +698,7 @@ int config_parse_routing_policy_rule_tos(
 
         r = safe_atou8(rvalue, &n->tos);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse RPDB rule tos, ignoring: %s", rvalue);
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse RPDB rule TOS, ignoring: %s", rvalue);
                 return 0;
         }
 
@@ -1328,10 +1320,6 @@ int routing_policy_load_rules(const char *state_file, Set **rules) {
         if (!l)
                 return -ENOMEM;
 
-        r = set_ensure_allocated(rules, &routing_policy_rule_hash_ops);
-        if (r < 0)
-                return r;
-
         STRV_FOREACH(i, l) {
                 _cleanup_(routing_policy_rule_freep) RoutingPolicyRule *rule = NULL;
 
@@ -1384,7 +1372,7 @@ int routing_policy_load_rules(const char *state_file, Set **rules) {
                         } else if (streq(a, "tos")) {
                                 r = safe_atou8(b, &rule->tos);
                                 if (r < 0) {
-                                        log_error_errno(r, "Failed to parse RPDB rule tos, ignoring: %s", b);
+                                        log_error_errno(r, "Failed to parse RPDB rule TOS, ignoring: %s", b);
                                         continue;
                                 }
                         } else if (streq(a, "table")) {
@@ -1461,7 +1449,7 @@ int routing_policy_load_rules(const char *state_file, Set **rules) {
                         }
                 }
 
-                r = set_put(*rules, rule);
+                r = set_ensure_put(rules, &routing_policy_rule_hash_ops, rule);
                 if (r < 0) {
                         log_warning_errno(r, "Failed to add RPDB rule to saved DB, ignoring: %s", p);
                         continue;
diff --git a/src/network/networkd-sriov.c b/src/network/networkd-sriov.c
new file mode 100644 (file)
index 0000000..5ae751e
--- /dev/null
@@ -0,0 +1,501 @@
+/* SPDX-License-Identifier: LGPL-2.1+
+ * Copyright © 2020 VMware, Inc. */
+
+#include "alloc-util.h"
+#include "netlink-util.h"
+#include "networkd-manager.h"
+#include "networkd-sriov.h"
+#include "parse-util.h"
+#include "set.h"
+#include "string-util.h"
+
+static int sr_iov_new(SRIOV **ret) {
+        SRIOV *sr_iov;
+
+        sr_iov = new(SRIOV, 1);
+        if (!sr_iov)
+                return -ENOMEM;
+
+        *sr_iov = (SRIOV) {
+                  .vf = (uint32_t) -1,
+                  .vlan_proto = ETH_P_8021Q,
+                  .vf_spoof_check_setting = -1,
+                  .trust = -1,
+                  .query_rss = -1,
+                  .link_state = _SR_IOV_LINK_STATE_INVALID,
+        };
+
+        *ret = TAKE_PTR(sr_iov);
+
+        return 0;
+}
+
+static int sr_iov_new_static(Network *network, const char *filename, unsigned section_line, SRIOV **ret) {
+        _cleanup_(network_config_section_freep) NetworkConfigSection *n = NULL;
+        _cleanup_(sr_iov_freep) SRIOV *sr_iov = NULL;
+        SRIOV *existing = NULL;
+        int r;
+
+        assert(network);
+        assert(ret);
+        assert(filename);
+        assert(section_line > 0);
+
+        r = network_config_section_new(filename, section_line, &n);
+        if (r < 0)
+                return r;
+
+        existing = ordered_hashmap_get(network->sr_iov_by_section, n);
+        if (existing) {
+                *ret = existing;
+                return 0;
+        }
+
+        r = sr_iov_new(&sr_iov);
+        if (r < 0)
+                return r;
+
+        sr_iov->network = network;
+        sr_iov->section = TAKE_PTR(n);
+
+        r = ordered_hashmap_ensure_allocated(&network->sr_iov_by_section, &network_config_hash_ops);
+        if (r < 0)
+                return r;
+
+        r = ordered_hashmap_put(network->sr_iov_by_section, sr_iov->section, sr_iov);
+        if (r < 0)
+                return r;
+
+        *ret = TAKE_PTR(sr_iov);
+        return 0;
+}
+
+SRIOV *sr_iov_free(SRIOV *sr_iov) {
+        if (!sr_iov)
+                return NULL;
+
+        if (sr_iov->network && sr_iov->section)
+                ordered_hashmap_remove(sr_iov->network->sr_iov_by_section, sr_iov->section);
+
+        network_config_section_free(sr_iov->section);
+
+        return mfree(sr_iov);
+}
+
+static int sr_iov_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
+        int r;
+
+        assert(link);
+        assert(link->sr_iov_messages > 0);
+        link->sr_iov_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_error_errno(link, m, r, "Could not set up SR-IOV");
+                link_enter_failed(link);
+                return 1;
+        }
+
+        if (link->sr_iov_messages == 0) {
+                log_link_debug(link, "SR-IOV configured");
+                link->sr_iov_configured = true;
+                link_check_ready(link);
+        }
+
+        return 1;
+}
+
+int sr_iov_configure(Link *link, SRIOV *sr_iov) {
+        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+        int r;
+
+        assert(link);
+        assert(link->manager);
+        assert(link->manager->rtnl);
+        assert(link->ifindex > 0);
+
+        log_link_debug(link, "Setting SR-IOV virtual function %"PRIu32, sr_iov->vf);
+
+        r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
+
+        r = sd_netlink_message_open_container(req, IFLA_VFINFO_LIST);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not open IFLA_VFINFO_LIST container: %m");
+
+        r = sd_netlink_message_open_container(req, IFLA_VF_INFO);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not open IFLA_VF_INFO container: %m");
+
+        if (!ether_addr_is_null(&sr_iov->mac)) {
+                struct ifla_vf_mac ivm = {
+                        .vf = sr_iov->vf,
+                };
+
+                memcpy(ivm.mac, &sr_iov->mac, ETH_ALEN);
+                r = sd_netlink_message_append_data(req, IFLA_VF_MAC, &ivm, sizeof(struct ifla_vf_mac));
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append IFLA_VF_MAC: %m");
+        }
+
+        if (sr_iov->vf_spoof_check_setting >= 0) {
+                struct ifla_vf_spoofchk ivs = {
+                        .vf = sr_iov->vf,
+                        .setting = sr_iov->vf_spoof_check_setting,
+                };
+
+                r = sd_netlink_message_append_data(req, IFLA_VF_SPOOFCHK, &ivs, sizeof(struct ifla_vf_spoofchk));
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append IFLA_VF_SPOOFCHK: %m");
+        }
+
+        if (sr_iov->query_rss >= 0) {
+                struct ifla_vf_rss_query_en ivs = {
+                        .vf = sr_iov->vf,
+                        .setting = sr_iov->query_rss,
+                };
+
+                r = sd_netlink_message_append_data(req, IFLA_VF_RSS_QUERY_EN, &ivs, sizeof(struct ifla_vf_rss_query_en));
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append IFLA_VF_RSS_QUERY_EN: %m");
+        }
+
+        if (sr_iov->trust >= 0) {
+                struct ifla_vf_trust ivt = {
+                        .vf = sr_iov->vf,
+                        .setting = sr_iov->trust,
+                };
+
+                r = sd_netlink_message_append_data(req, IFLA_VF_TRUST, &ivt, sizeof(struct ifla_vf_trust));
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append IFLA_VF_TRUST: %m");
+        }
+
+        if (sr_iov->link_state >= 0) {
+                struct ifla_vf_link_state ivl = {
+                        .vf = sr_iov->vf,
+                        .link_state = sr_iov->link_state,
+                };
+
+                r = sd_netlink_message_append_data(req, IFLA_VF_LINK_STATE, &ivl, sizeof(struct ifla_vf_link_state));
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append IFLA_VF_LINK_STATE: %m");
+        }
+
+        if (sr_iov->vlan > 0) {
+                /* Because of padding, first the buffer must be initialized with 0. */
+                struct ifla_vf_vlan_info ivvi = {};
+                ivvi.vf = sr_iov->vf;
+                ivvi.vlan = sr_iov->vlan;
+                ivvi.qos = sr_iov->qos;
+                ivvi.vlan_proto = htobe16(sr_iov->vlan_proto);
+
+                r = sd_netlink_message_open_container(req, IFLA_VF_VLAN_LIST);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not open IFLA_VF_VLAN_LIST container: %m");
+
+                r = sd_netlink_message_append_data(req, IFLA_VF_VLAN_INFO, &ivvi, sizeof(struct ifla_vf_vlan_info));
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append IFLA_VF_VLAN_INFO: %m");
+
+                r = sd_netlink_message_close_container(req);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not close IFLA_VF_VLAN_LIST container: %m");
+        }
+
+        r = sd_netlink_message_close_container(req);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not close IFLA_VF_INFO container: %m");
+
+        r = sd_netlink_message_close_container(req);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not close IFLA_VFINFO_LIST container: %m");
+
+        r = netlink_call_async(link->manager->rtnl, NULL, req, sr_iov_handler,
+                               link_netlink_destroy_callback, link);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
+
+        link_ref(link);
+        link->sr_iov_messages++;
+
+        return 0;
+}
+
+int sr_iov_section_verify(SRIOV *sr_iov) {
+        assert(sr_iov);
+
+        if (section_is_invalid(sr_iov->section))
+                return -EINVAL;
+
+        if (sr_iov->vf == (uint32_t) -1)
+                return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
+                                         "%s: [SRIOV] section without VirtualFunction= field configured. "
+                                         "Ignoring [SRIOV] section from line %u.",
+                                         sr_iov->section->filename, sr_iov->section->line);
+
+        return 0;
+}
+
+int config_parse_sr_iov_uint32(
+                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_(sr_iov_free_or_set_invalidp) SRIOV *sr_iov = NULL;
+        Network *network = data;
+        uint32_t k;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = sr_iov_new_static(network, filename, section_line, &sr_iov);
+        if (r < 0)
+                return r;
+
+        if (isempty(rvalue)) {
+                if (streq(lvalue, "VirtualFunction"))
+                        sr_iov->vf = (uint32_t) -1;
+                else if (streq(lvalue, "VLANId"))
+                        sr_iov->vlan = 0;
+                else if (streq(lvalue, "QualityOfService"))
+                        sr_iov->qos = 0;
+                else
+                        assert_not_reached("Invalid lvalue");
+
+                TAKE_PTR(sr_iov);
+                return 0;
+        }
+
+        r = safe_atou32(rvalue, &k);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to parse SR-IOV '%s=', ignoring assignment: %s", lvalue, rvalue);
+                return 0;
+        }
+
+        if (streq(lvalue, "VLANId")) {
+                if (k == 0 || k > 4095) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid SR-IOV VLANId: %d", k);
+                        return 0;
+                }
+                sr_iov->vlan = k;
+        } else if (streq(lvalue, "VirtualFunction")) {
+                if (k >= INT_MAX) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid SR-IOV virtual function: %d", k);
+                        return 0;
+                }
+                sr_iov->vf = k;
+        } else if (streq(lvalue, "QualityOfService"))
+                sr_iov->qos = k;
+        else
+                assert_not_reached("Invalid lvalue");
+
+        TAKE_PTR(sr_iov);
+        return 0;
+}
+
+int config_parse_sr_iov_vlan_proto(
+                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_(sr_iov_free_or_set_invalidp) SRIOV *sr_iov = NULL;
+        Network *network = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = sr_iov_new_static(network, filename, section_line, &sr_iov);
+        if (r < 0)
+                return r;
+
+        if (isempty(rvalue) || streq(rvalue, "802.1Q"))
+                sr_iov->vlan_proto = ETH_P_8021Q;
+        else if (streq(rvalue, "802.1ad"))
+                sr_iov->vlan_proto = ETH_P_8021AD;
+        else {
+                log_syntax(unit, LOG_ERR, filename, line, 0,
+                           "Invalid SR-IOV '%s=', ignoring assignment: %s", lvalue, rvalue);
+                return 0;
+        }
+
+        TAKE_PTR(sr_iov);
+        return 0;
+}
+
+int config_parse_sr_iov_link_state(
+                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_(sr_iov_free_or_set_invalidp) SRIOV *sr_iov = NULL;
+        Network *network = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = sr_iov_new_static(network, filename, section_line, &sr_iov);
+        if (r < 0)
+                return r;
+
+        /* Unfortunately, SR_IOV_LINK_STATE_DISABLE is 2, not 0. So, we cannot use
+         * DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN() macro. */
+
+        if (isempty(rvalue)) {
+                sr_iov->link_state = _SR_IOV_LINK_STATE_INVALID;
+                TAKE_PTR(sr_iov);
+                return 0;
+        }
+
+        if (streq(rvalue, "auto")) {
+                sr_iov->link_state = SR_IOV_LINK_STATE_AUTO;
+                TAKE_PTR(sr_iov);
+                return 0;
+        }
+
+        r = parse_boolean(rvalue);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to parse SR-IOV '%s=', ignoring assignment: %s", lvalue, rvalue);
+                return 0;
+        }
+
+        sr_iov->link_state = r ? SR_IOV_LINK_STATE_ENABLE : SR_IOV_LINK_STATE_DISABLE;
+        TAKE_PTR(sr_iov);
+        return 0;
+}
+
+int config_parse_sr_iov_boolean(
+                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_(sr_iov_free_or_set_invalidp) SRIOV *sr_iov = NULL;
+        Network *network = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = sr_iov_new_static(network, filename, section_line, &sr_iov);
+        if (r < 0)
+                return r;
+
+        if (isempty(rvalue)) {
+                if (streq(lvalue, "MACSpoofCheck"))
+                        sr_iov->vf_spoof_check_setting = -1;
+                else if (streq(lvalue, "QueryReceiveSideScaling"))
+                        sr_iov->query_rss = -1;
+                else if (streq(lvalue, "Trust"))
+                        sr_iov->trust = -1;
+                else
+                        assert_not_reached("Invalid lvalue");
+
+                TAKE_PTR(sr_iov);
+                return 0;
+        }
+
+        r = parse_boolean(rvalue);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse '%s=', ignoring: %s", lvalue, rvalue);
+                return 0;
+        }
+
+        if (streq(lvalue, "MACSpoofCheck"))
+                sr_iov->vf_spoof_check_setting = r;
+        else if (streq(lvalue, "QueryReceiveSideScaling"))
+                sr_iov->query_rss = r;
+        else if (streq(lvalue, "Trust"))
+                sr_iov->trust = r;
+        else
+                assert_not_reached("Invalid lvalue");
+
+        TAKE_PTR(sr_iov);
+        return 0;
+}
+
+int config_parse_sr_iov_mac(
+                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_(sr_iov_free_or_set_invalidp) SRIOV *sr_iov = NULL;
+        Network *network = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = sr_iov_new_static(network, filename, section_line, &sr_iov);
+        if (r < 0)
+                return r;
+
+        if (isempty(rvalue)) {
+                sr_iov->mac = ETHER_ADDR_NULL;
+                TAKE_PTR(sr_iov);
+                return 0;
+        }
+
+        r = ether_addr_from_string(rvalue, &sr_iov->mac);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, 0,
+                           "Failed to parse SR-IOV '%s=', ignoring assignment: %s", lvalue, rvalue);
+                return 0;
+        }
+
+        TAKE_PTR(sr_iov);
+        return 0;
+}
diff --git a/src/network/networkd-sriov.h b/src/network/networkd-sriov.h
new file mode 100644 (file)
index 0000000..a545d12
--- /dev/null
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: LGPL-2.1+
+ * Copyright © 2020 VMware, Inc. */
+#pragma once
+
+#include <linux/if_link.h>
+
+#include "conf-parser.h"
+#include "networkd-link.h"
+#include "networkd-network.h"
+#include "networkd-util.h"
+
+typedef enum SRIOVLinkState {
+        SR_IOV_LINK_STATE_AUTO = IFLA_VF_LINK_STATE_AUTO,
+        SR_IOV_LINK_STATE_ENABLE = IFLA_VF_LINK_STATE_ENABLE,
+        SR_IOV_LINK_STATE_DISABLE = IFLA_VF_LINK_STATE_DISABLE,
+        _SR_IOV_LINK_STATE_MAX,
+        _SR_IOV_LINK_STATE_INVALID = -1,
+} SRIOVLinkState;
+
+typedef struct SRIOV {
+        NetworkConfigSection *section;
+        Network *network;
+
+        uint32_t vf;   /* 0 - 2147483646 */
+        uint32_t vlan; /* 0 - 4095, 0 disables VLAN filter */
+        uint32_t qos;
+        uint16_t vlan_proto; /* ETH_P_8021Q or ETH_P_8021AD */
+        int vf_spoof_check_setting;
+        int query_rss;
+        int trust;
+        SRIOVLinkState link_state;
+        struct ether_addr mac;
+} SRIOV;
+
+SRIOV *sr_iov_free(SRIOV *sr_iov);
+
+int sr_iov_configure(Link *link, SRIOV *sr_iov);
+int sr_iov_section_verify(SRIOV *sr_iov);
+
+DEFINE_NETWORK_SECTION_FUNCTIONS(SRIOV, sr_iov_free);
+
+CONFIG_PARSER_PROTOTYPE(config_parse_sr_iov_uint32);
+CONFIG_PARSER_PROTOTYPE(config_parse_sr_iov_boolean);
+CONFIG_PARSER_PROTOTYPE(config_parse_sr_iov_link_state);
+CONFIG_PARSER_PROTOTYPE(config_parse_sr_iov_vlan_proto);
+CONFIG_PARSER_PROTOTYPE(config_parse_sr_iov_mac);
index 35f22fea8014338d6a860a21277427330244b378..445aee16ad0435b4f7361cb6098dac5d859837dc 100644 (file)
@@ -17,8 +17,8 @@
 #include "user-util.h"
 
 static int run(int argc, char *argv[]) {
-        _cleanup_(notify_on_cleanup) const char *notify_message = NULL;
         _cleanup_(manager_freep) Manager *m = NULL;
+        _cleanup_(notify_on_cleanup) const char *notify_message = NULL;
         int r;
 
         log_setup_service();
index b499661bd3fda85bab3c3236bdafb9a7d280adc6..286c7e172ff17be5c4e31a9e3bfe37690390a856 100644 (file)
@@ -136,14 +136,14 @@ int config_parse_cake_overhead(
         r = safe_atoi32(rvalue, &v);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r,
-                           "Failed to parse 'Overhead=', ignoring assignment: %s",
-                           rvalue);
+                           "Failed to parse '%s=', ignoring assignment: %s",
+                           lvalue, rvalue);
                 return 0;
         }
         if (v < -64 || v > 256) {
                 log_syntax(unit, LOG_ERR, filename, line, 0,
-                           "Invalid 'Overhead=', ignoring assignment: %s",
-                           rvalue);
+                           "Invalid '%s=', ignoring assignment: %s",
+                           lvalue, rvalue);
                 return 0;
         }
 
index ac64eb8b03e2d3e91d74f158463feb17c56c0606..a671f32d99d2bc6fbd85349fc4f51e434e95c51d 100644 (file)
@@ -79,7 +79,7 @@ int config_parse_drr_size(
                 return 0;
         }
 
-        r = parse_size(rvalue, 1000, &u);
+        r = parse_size(rvalue, 1024, &u);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r,
                            "Failed to parse '%s=', ignoring assignment: %s",
diff --git a/src/network/tc/ets.c b/src/network/tc/ets.c
new file mode 100644 (file)
index 0000000..83e9d8b
--- /dev/null
@@ -0,0 +1,338 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#include <linux/pkt_sched.h>
+
+#include "alloc-util.h"
+#include "conf-parser.h"
+#include "ets.h"
+#include "memory-util.h"
+#include "netlink-util.h"
+#include "parse-util.h"
+#include "qdisc.h"
+#include "string-util.h"
+#include "tc-util.h"
+
+static int enhanced_transmission_selection_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) {
+        EnhancedTransmissionSelection *ets;
+        int r;
+
+        assert(link);
+        assert(qdisc);
+        assert(req);
+
+        ets = ETS(qdisc);
+
+        r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "ets");
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m");
+
+        r = sd_netlink_message_append_u8(req, TCA_ETS_NBANDS, ets->n_bands);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not append TCA_ETS_NBANDS attribute: %m");
+
+        if (ets->n_strict > 0) {
+                r = sd_netlink_message_append_u8(req, TCA_ETS_NSTRICT, ets->n_strict);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append TCA_ETS_NSTRICT attribute: %m");
+        }
+
+        if (ets->n_quanta > 0) {
+                r = sd_netlink_message_open_container(req, TCA_ETS_QUANTA);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not open container TCA_ETS_QUANTA: %m");
+
+                for (unsigned i = 0; i < ets->n_quanta; i++) {
+                        r = sd_netlink_message_append_u32(req, TCA_ETS_QUANTA_BAND, ets->quanta[i]);
+                        if (r < 0)
+                                return log_link_error_errno(link, r, "Could not append TCA_ETS_QUANTA_BAND attribute: %m");
+                }
+
+                r = sd_netlink_message_close_container(req);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not close container TCA_ETS_QUANTA: %m");
+        }
+
+        if (ets->n_prio > 0) {
+                r = sd_netlink_message_open_container(req, TCA_ETS_PRIOMAP);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not open container TCA_ETS_PRIOMAP: %m");
+
+                for (unsigned i = 0; i < ets->n_prio; i++) {
+                        r = sd_netlink_message_append_u8(req, TCA_ETS_PRIOMAP_BAND, ets->prio[i]);
+                        if (r < 0)
+                                return log_link_error_errno(link, r, "Could not append TCA_ETS_PRIOMAP_BAND attribute: %m");
+                }
+
+                r = sd_netlink_message_close_container(req);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not close container TCA_ETS_PRIOMAP: %m");
+        }
+
+        r = sd_netlink_message_close_container(req);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not close container TCA_OPTIONS: %m");
+
+        return 0;
+}
+
+int config_parse_ets_u8(
+                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_(qdisc_free_or_set_invalidp) QDisc *qdisc = NULL;
+        EnhancedTransmissionSelection *ets;
+        Network *network = data;
+        uint8_t v, *p;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = qdisc_new_static(QDISC_KIND_ETS, network, filename, section_line, &qdisc);
+        if (r == -ENOMEM)
+                return log_oom();
+        if (r < 0)
+                return log_syntax(unit, LOG_ERR, filename, line, r,
+                                  "More than one kind of queueing discipline, ignoring assignment: %m");
+
+        ets = ETS(qdisc);
+        if (streq(lvalue, "Bands"))
+                p = &ets->n_bands;
+        else if (streq(lvalue, "StrictBands"))
+                p = &ets->n_strict;
+        else
+                assert_not_reached("Invalid lvalue.");
+
+        if (isempty(rvalue)) {
+                *p = 0;
+
+                qdisc = NULL;
+                return 0;
+        }
+
+        r = safe_atou8(rvalue, &v);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to parse '%s=', ignoring assignment: %s",
+                           lvalue, rvalue);
+                return 0;
+        }
+        if (v > TCQ_ETS_MAX_BANDS) {
+                log_syntax(unit, LOG_ERR, filename, line, 0,
+                           "Invalid '%s='. The value must be <= %d, ignoring assignment: %s",
+                           lvalue, TCQ_ETS_MAX_BANDS, rvalue);
+                return 0;
+        }
+
+        *p = v;
+        qdisc = NULL;
+
+        return 0;
+}
+
+int config_parse_ets_quanta(
+                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_(qdisc_free_or_set_invalidp) QDisc *qdisc = NULL;
+        EnhancedTransmissionSelection *ets;
+        Network *network = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = qdisc_new_static(QDISC_KIND_ETS, network, filename, section_line, &qdisc);
+        if (r == -ENOMEM)
+                return log_oom();
+        if (r < 0)
+                return log_syntax(unit, LOG_ERR, filename, line, r,
+                                  "More than one kind of queueing discipline, ignoring assignment: %m");
+
+        ets = ETS(qdisc);
+
+        if (isempty(rvalue)) {
+                memzero(ets->quanta, sizeof(uint32_t) * TCQ_ETS_MAX_BANDS);
+                ets->n_quanta = 0;
+
+                qdisc = NULL;
+                return 0;
+        }
+
+        for (const char *p = rvalue;;) {
+                _cleanup_free_ char *word = NULL;
+                uint64_t v;
+
+                r = extract_first_word(&p, &word, NULL, 0);
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Failed to extract next value, ignoring: %m");
+                        continue;
+                }
+                if (r == 0)
+                        break;
+
+                r = parse_size(word, 1024, &v);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Failed to parse '%s=', ignoring assignment: %s",
+                                   lvalue, word);
+                        continue;
+                }
+                if (v == 0 || v > UINT32_MAX) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Invalid '%s=', ignoring assignment: %s",
+                                   lvalue, word);
+                        continue;
+                }
+                if (ets->n_quanta >= TCQ_ETS_MAX_BANDS) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Too many quanta in '%s=', ignoring assignment: %s",
+                                   lvalue, word);
+                        continue;
+                }
+
+                ets->quanta[ets->n_quanta++] = v;
+        }
+
+        qdisc = NULL;
+
+        return 0;
+}
+
+int config_parse_ets_prio(
+                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_(qdisc_free_or_set_invalidp) QDisc *qdisc = NULL;
+        EnhancedTransmissionSelection *ets;
+        Network *network = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = qdisc_new_static(QDISC_KIND_ETS, network, filename, section_line, &qdisc);
+        if (r == -ENOMEM)
+                return log_oom();
+        if (r < 0)
+                return log_syntax(unit, LOG_ERR, filename, line, r,
+                                  "More than one kind of queueing discipline, ignoring assignment: %m");
+
+        ets = ETS(qdisc);
+
+        if (isempty(rvalue)) {
+                memzero(ets->prio, sizeof(uint8_t) * (TC_PRIO_MAX + 1));
+                ets->n_prio = 0;
+
+                qdisc = NULL;
+                return 0;
+        }
+
+        for (const char *p = rvalue;;) {
+                _cleanup_free_ char *word = NULL;
+                uint8_t v;
+
+                r = extract_first_word(&p, &word, NULL, 0);
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Failed to extract next value, ignoring: %m");
+                        continue;
+                }
+                if (r == 0)
+                        break;
+
+                r = safe_atou8(word, &v);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Failed to parse '%s=', ignoring assignment: %s",
+                                   lvalue, word);
+                        continue;
+                }
+                if (ets->n_prio > TC_PRIO_MAX) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Too many priomap in '%s=', ignoring assignment: %s",
+                                   lvalue, word);
+                        continue;
+                }
+
+                ets->prio[ets->n_prio++] = v;
+        }
+
+        qdisc = NULL;
+
+        return 0;
+}
+
+static int enhanced_transmission_selection_verify(QDisc *qdisc) {
+        EnhancedTransmissionSelection *ets;
+
+        assert(qdisc);
+
+        ets = ETS(qdisc);
+
+        if (ets->n_bands == 0)
+                ets->n_bands = ets->n_strict + ets->n_quanta;
+
+        if (ets->n_bands == 0)
+                return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
+                                         "%s: At least one of Band=, Strict=, or Quanta= must be specified. "
+                                         "Ignoring [EnhancedTransmissionSelection] section from line %u.",
+                                         qdisc->section->filename, qdisc->section->line);
+
+        if (ets->n_bands < ets->n_strict + ets->n_quanta)
+                return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
+                                         "%s: Not enough total bands to cover all the strict bands and quanta. "
+                                         "Ignoring [EnhancedTransmissionSelection] section from line %u.",
+                                         qdisc->section->filename, qdisc->section->line);
+
+        for (unsigned i = 0; i < ets->n_prio; i++)
+                if (ets->prio[i] >= ets->n_bands)
+                        return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
+                                                 "%s: PriorityMap= element is out of bands. "
+                                                 "Ignoring [EnhancedTransmissionSelection] section from line %u.",
+                                                 qdisc->section->filename, qdisc->section->line);
+
+        return 0;
+}
+
+const QDiscVTable ets_vtable = {
+        .object_size = sizeof(EnhancedTransmissionSelection),
+        .tca_kind = "ets",
+        .fill_message = enhanced_transmission_selection_fill_message,
+        .verify = enhanced_transmission_selection_verify,
+};
diff --git a/src/network/tc/ets.h b/src/network/tc/ets.h
new file mode 100644 (file)
index 0000000..c35d597
--- /dev/null
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include <linux/pkt_sched.h>
+
+#include "conf-parser.h"
+#include "qdisc.h"
+
+typedef struct EnhancedTransmissionSelection {
+        QDisc meta;
+
+        uint8_t n_bands;
+        uint8_t n_strict;
+        unsigned n_quanta;
+        uint32_t quanta[TCQ_ETS_MAX_BANDS];
+        unsigned n_prio;
+        uint8_t prio[TC_PRIO_MAX + 1];
+} EnhancedTransmissionSelection;
+
+DEFINE_QDISC_CAST(ETS, EnhancedTransmissionSelection);
+extern const QDiscVTable ets_vtable;
+
+CONFIG_PARSER_PROTOTYPE(config_parse_ets_u8);
+CONFIG_PARSER_PROTOTYPE(config_parse_ets_quanta);
+CONFIG_PARSER_PROTOTYPE(config_parse_ets_prio);
index 8ef6e513bb1c840e4476c41ce7987ef131411cd7..1a608dd7c0004734c4c8ef1a1a031a4f81e8df6e 100644 (file)
@@ -140,7 +140,7 @@ int config_parse_bfifo_size(
                 return 0;
         }
 
-        r = parse_size(rvalue, 1000, &u);
+        r = parse_size(rvalue, 1024, &u);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r,
                            "Failed to parse '%s=', ignoring assignment: %s",
index 6c7932c70f738e5a441456545157a47e210a38ab..721112d3173bbdcc7a26b4c5180d488727bc2b18 100644 (file)
@@ -9,6 +9,7 @@
 #include "parse-util.h"
 #include "qdisc.h"
 #include "string-util.h"
+#include "strv.h"
 
 static int fair_queueing_controlled_delay_init(QDisc *qdisc) {
         FairQueueingControlledDelay *fqcd;
@@ -301,15 +302,15 @@ int config_parse_fair_queueing_controlled_delay_size(
 
         fqcd = FQ_CODEL(qdisc);
 
-        if (streq(lvalue, "MemoryLimit"))
+        if (STR_IN_SET(lvalue, "MemoryLimitBytes", "MemoryLimit"))
                 p = &fqcd->memory_limit;
-        else if (streq(lvalue, "Quantum"))
+        else if (STR_IN_SET(lvalue, "QuantumBytes", "Quantum"))
                 p = &fqcd->quantum;
         else
                 assert_not_reached("Invalid lvalue.");
 
         if (isempty(rvalue)) {
-                if (streq(lvalue, "MemoryLimit"))
+                if (STR_IN_SET(lvalue, "MemoryLimitBytes", "MemoryLimit"))
                         *p = UINT32_MAX;
                 else
                         *p = 0;
index c7eeec230737c9721e8e386b3014b86ea6a0ab87..f717dc790c7c0bf57ce7cc72d7f2cd1d910ee927 100644 (file)
@@ -9,7 +9,7 @@
 #include "netlink-util.h"
 #include "parse-util.h"
 #include "string-util.h"
-#include "util.h"
+#include "strv.h"
 
 static int fair_queueing_init(QDisc *qdisc) {
         FairQueueing *fq;
@@ -198,9 +198,9 @@ int config_parse_fair_queueing_size(
 
         fq = FQ(qdisc);
 
-        if (streq(lvalue, "Quantum"))
+        if (STR_IN_SET(lvalue, "QuantumBytes", "Quantum"))
                 p = &fq->quantum;
-        else if (streq(lvalue, "InitialQuantum"))
+        else if (STR_IN_SET(lvalue, "InitialQuantumBytes", "InitialQuantum"))
                 p = &fq->initial_quantum;
         else
                 assert_not_reached("Invalid lvalue");
index f2b9c4507ea72c1d6d1660e455b5b94b85892f0c..227d6233e78f02722a9d1e3c6b6950f763f2b516 100644 (file)
 #include "string-util.h"
 #include "tc-util.h"
 
+#define HTB_DEFAULT_RATE_TO_QUANTUM  10
+#define HTB_DEFAULT_MTU              1600  /* Ethernet packet length */
+
 static int hierarchy_token_bucket_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) {
         HierarchyTokenBucket *htb;
         struct tc_htb_glob opt = {
-                .rate2quantum = 10,
                 .version = 3,
         };
         int r;
@@ -25,6 +27,7 @@ static int hierarchy_token_bucket_fill_message(Link *link, QDisc *qdisc, sd_netl
 
         htb = HTB(qdisc);
 
+        opt.rate2quantum = htb->rate_to_quantum;
         opt.defcls = htb->default_class;
 
         r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "htb");
@@ -92,16 +95,80 @@ int config_parse_hierarchy_token_bucket_default_class(
         return 0;
 }
 
+int config_parse_hierarchy_token_bucket_u32(
+                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_(qdisc_free_or_set_invalidp) QDisc *qdisc = NULL;
+        HierarchyTokenBucket *htb;
+        Network *network = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = qdisc_new_static(QDISC_KIND_HTB, network, filename, section_line, &qdisc);
+        if (r == -ENOMEM)
+                return log_oom();
+        if (r < 0)
+                return log_syntax(unit, LOG_ERR, filename, line, r,
+                                  "More than one kind of queueing discipline, ignoring assignment: %m");
+
+        htb = HTB(qdisc);
+
+        if (isempty(rvalue)) {
+                htb->rate_to_quantum = HTB_DEFAULT_RATE_TO_QUANTUM;
+
+                qdisc = NULL;
+                return 0;
+        }
+
+        r = safe_atou32(rvalue, &htb->rate_to_quantum);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to parse '%s=', ignoring assignment: %s",
+                           lvalue, rvalue);
+                return 0;
+        }
+
+        qdisc = NULL;
+
+        return 0;
+}
+
+static int hierarchy_token_bucket_init(QDisc *qdisc) {
+        HierarchyTokenBucket *htb;
+
+        assert(qdisc);
+
+        htb = HTB(qdisc);
+
+        htb->rate_to_quantum = HTB_DEFAULT_RATE_TO_QUANTUM;
+
+        return 0;
+}
+
 const QDiscVTable htb_vtable = {
         .object_size = sizeof(HierarchyTokenBucket),
         .tca_kind = "htb",
         .fill_message = hierarchy_token_bucket_fill_message,
+        .init = hierarchy_token_bucket_init,
 };
 
 static int hierarchy_token_bucket_class_fill_message(Link *link, TClass *tclass, sd_netlink_message *req) {
         HierarchyTokenBucketClass *htb;
         struct tc_htb_opt opt = {};
-        uint32_t rtab[256], ctab[256], mtu = 1600; /* Ethernet packet length */
+        uint32_t rtab[256], ctab[256];
         int r;
 
         assert(link);
@@ -110,25 +177,26 @@ static int hierarchy_token_bucket_class_fill_message(Link *link, TClass *tclass,
 
         htb = TCLASS_TO_HTB(tclass);
 
-        if (htb->ceil_rate == 0)
-                htb->ceil_rate = htb->rate;
-
         opt.prio = htb->priority;
+        opt.quantum = htb->quantum;
         opt.rate.rate = (htb->rate >= (1ULL << 32)) ? ~0U : htb->rate;
         opt.ceil.rate = (htb->ceil_rate >= (1ULL << 32)) ? ~0U : htb->ceil_rate;
-        r = tc_transmit_time(htb->rate, mtu, &opt.buffer);
+        opt.rate.overhead = htb->overhead;
+        opt.ceil.overhead = htb->overhead;
+
+        r = tc_transmit_time(htb->rate, htb->buffer, &opt.buffer);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to calculate buffer size: %m");
 
-        r = tc_transmit_time(htb->ceil_rate, mtu, &opt.cbuffer);
+        r = tc_transmit_time(htb->ceil_rate, htb->ceil_buffer, &opt.cbuffer);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to calculate ceil buffer size: %m");
 
-        r = tc_fill_ratespec_and_table(&opt.rate, rtab, mtu);
+        r = tc_fill_ratespec_and_table(&opt.rate, rtab, htb->mtu);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to calculate rate table: %m");
 
-        r = tc_fill_ratespec_and_table(&opt.ceil, ctab, mtu);
+        r = tc_fill_ratespec_and_table(&opt.ceil, ctab, htb->mtu);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to calculate ceil rate table: %m");
 
@@ -166,7 +234,7 @@ static int hierarchy_token_bucket_class_fill_message(Link *link, TClass *tclass,
         return 0;
 }
 
-int config_parse_hierarchy_token_bucket_u32(
+int config_parse_hierarchy_token_bucket_class_u32(
                 const char *unit,
                 const char *filename,
                 unsigned line,
@@ -181,6 +249,7 @@ int config_parse_hierarchy_token_bucket_u32(
         _cleanup_(tclass_free_or_set_invalidp) TClass *tclass = NULL;
         HierarchyTokenBucketClass *htb;
         Network *network = data;
+        uint32_t v;
         int r;
 
         assert(filename);
@@ -197,25 +266,105 @@ int config_parse_hierarchy_token_bucket_u32(
 
         if (isempty(rvalue)) {
                 htb->priority = 0;
+                tclass = NULL;
+                return 0;
+        }
+
+        r = safe_atou32(rvalue, &v);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to parse '%s=', ignoring assignment: %s",
+                           lvalue, rvalue);
+                return 0;
+        }
+
+        htb->priority = v;
+        tclass = NULL;
+
+        return 0;
+}
+
+int config_parse_hierarchy_token_bucket_class_size(
+                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_(tclass_free_or_set_invalidp) TClass *tclass = NULL;
+        HierarchyTokenBucketClass *htb;
+        Network *network = data;
+        uint64_t v;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = tclass_new_static(TCLASS_KIND_HTB, network, filename, section_line, &tclass);
+        if (r < 0)
+                return log_syntax(unit, LOG_ERR, filename, line, r,
+                                  "Failed to create traffic control class, ignoring assignment: %m");
+
+        htb = TCLASS_TO_HTB(tclass);
+
+        if (isempty(rvalue)) {
+                if (streq(lvalue, "QuantumBytes"))
+                        htb->quantum = 0;
+                else if (streq(lvalue, "MTUBytes"))
+                        htb->mtu = HTB_DEFAULT_MTU;
+                else if (streq(lvalue, "OverheadBytes"))
+                        htb->overhead = 0;
+                else if (streq(lvalue, "BufferBytes"))
+                        htb->buffer = 0;
+                else if (streq(lvalue, "CeilBufferBytes"))
+                        htb->ceil_buffer = 0;
+                else
+                        assert_not_reached("Invalid lvalue");
 
                 tclass = NULL;
                 return 0;
         }
 
-        r = safe_atou32(rvalue, &htb->priority);
+        r = parse_size(rvalue, 1024, &v);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r,
                            "Failed to parse '%s=', ignoring assignment: %s",
                            lvalue, rvalue);
                 return 0;
         }
+        if ((streq(lvalue, "OverheadBytes") && v > UINT16_MAX) || v > UINT32_MAX) {
+                log_syntax(unit, LOG_ERR, filename, line, 0,
+                           "Invalid '%s=', ignoring assignment: %s",
+                           lvalue, rvalue);
+                return 0;
+        }
+
+        if (streq(lvalue, "QuantumBytes"))
+                htb->quantum = v;
+        else if (streq(lvalue, "OverheadBytes"))
+                htb->overhead = v;
+        else if (streq(lvalue, "MTUBytes"))
+                htb->mtu = v;
+        else if (streq(lvalue, "BufferBytes"))
+                htb->buffer = v;
+        else if (streq(lvalue, "CeilBufferBytes"))
+                htb->ceil_buffer = v;
+        else
+                assert_not_reached("Invalid lvalue");
 
         tclass = NULL;
 
         return 0;
 }
 
-int config_parse_hierarchy_token_bucket_rate(
+int config_parse_hierarchy_token_bucket_class_rate(
                 const char *unit,
                 const char *filename,
                 unsigned line,
@@ -272,8 +421,53 @@ int config_parse_hierarchy_token_bucket_rate(
         return 0;
 }
 
+static int hierarchy_token_bucket_class_init(TClass *tclass) {
+        HierarchyTokenBucketClass *htb;
+
+        assert(tclass);
+
+        htb = TCLASS_TO_HTB(tclass);
+
+        htb->mtu = HTB_DEFAULT_MTU;
+
+        return 0;
+}
+
+static int hierarchy_token_bucket_class_verify(TClass *tclass) {
+        HierarchyTokenBucketClass *htb;
+        uint32_t hz;
+        int r;
+
+        assert(tclass);
+
+        htb = TCLASS_TO_HTB(tclass);
+
+        if (htb->rate == 0)
+                return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
+                                         "%s: Rate= is mandatory. "
+                                         "Ignoring [HierarchyTokenBucketClass] section from line %u.",
+                                         tclass->section->filename, tclass->section->line);
+
+        /* if CeilRate= setting is missing, use the same as Rate= */
+        if (htb->ceil_rate == 0)
+                htb->ceil_rate = htb->rate;
+
+        r = tc_init(NULL, &hz);
+        if (r < 0)
+                return log_error_errno(r, "Failed to read /proc/net/psched: %m");
+
+        if (htb->buffer == 0)
+                htb->buffer = htb->rate / hz + htb->mtu;
+        if (htb->ceil_buffer == 0)
+                htb->ceil_buffer = htb->ceil_rate / hz + htb->mtu;
+
+        return 0;
+}
+
 const TClassVTable htb_tclass_vtable = {
         .object_size = sizeof(HierarchyTokenBucketClass),
         .tca_kind = "htb",
         .fill_message = hierarchy_token_bucket_class_fill_message,
+        .init = hierarchy_token_bucket_class_init,
+        .verify = hierarchy_token_bucket_class_verify,
 };
index c8dce2c1e3d2852a952647453669f947bed408bf..b385872e0a696fe29eea215893c3e60e24d4e66d 100644 (file)
@@ -9,23 +9,31 @@ typedef struct HierarchyTokenBucket {
         QDisc meta;
 
         uint32_t default_class;
+        uint32_t rate_to_quantum;
 } HierarchyTokenBucket;
 
 DEFINE_QDISC_CAST(HTB, HierarchyTokenBucket);
 extern const QDiscVTable htb_vtable;
 
 CONFIG_PARSER_PROTOTYPE(config_parse_hierarchy_token_bucket_default_class);
+CONFIG_PARSER_PROTOTYPE(config_parse_hierarchy_token_bucket_u32);
 
 typedef struct HierarchyTokenBucketClass {
         TClass meta;
 
         uint32_t priority;
+        uint32_t quantum;
+        uint32_t mtu;
+        uint16_t overhead;
         uint64_t rate;
+        uint32_t buffer;
         uint64_t ceil_rate;
+        uint32_t ceil_buffer;
 } HierarchyTokenBucketClass;
 
 DEFINE_TCLASS_CAST(HTB, HierarchyTokenBucketClass);
 extern const TClassVTable htb_tclass_vtable;
 
-CONFIG_PARSER_PROTOTYPE(config_parse_hierarchy_token_bucket_u32);
-CONFIG_PARSER_PROTOTYPE(config_parse_hierarchy_token_bucket_rate);
+CONFIG_PARSER_PROTOTYPE(config_parse_hierarchy_token_bucket_class_u32);
+CONFIG_PARSER_PROTOTYPE(config_parse_hierarchy_token_bucket_class_size);
+CONFIG_PARSER_PROTOTYPE(config_parse_hierarchy_token_bucket_class_rate);
index 6ba4325c9c50125318388cd276741c6d55d70ece..c2b6c1de2fb4860dc5681e63b6fef70c74212fe6 100644 (file)
@@ -20,6 +20,7 @@ const QDiscVTable * const qdisc_vtable[_QDISC_KIND_MAX] = {
         [QDISC_KIND_CAKE] = &cake_vtable,
         [QDISC_KIND_CODEL] = &codel_vtable,
         [QDISC_KIND_DRR] = &drr_vtable,
+        [QDISC_KIND_ETS] = &ets_vtable,
         [QDISC_KIND_FQ] = &fq_vtable,
         [QDISC_KIND_FQ_CODEL] = &fq_codel_vtable,
         [QDISC_KIND_GRED] = &gred_vtable,
@@ -38,7 +39,7 @@ const QDiscVTable * const qdisc_vtable[_QDISC_KIND_MAX] = {
 };
 
 static int qdisc_new(QDiscKind kind, QDisc **ret) {
-        QDisc *qdisc;
+        _cleanup_(qdisc_freep) QDisc *qdisc = NULL;
         int r;
 
         if (kind == _QDISC_KIND_INVALID) {
index 802653efb0158a9e4b194541004fbd87bb11f9ad..0c9c0544b6c9b95e0d9e8fdbb978f76924eecd26 100644 (file)
@@ -13,6 +13,7 @@ typedef enum QDiscKind {
         QDISC_KIND_CAKE,
         QDISC_KIND_CODEL,
         QDISC_KIND_DRR,
+        QDISC_KIND_ETS,
         QDISC_KIND_FQ,
         QDISC_KIND_FQ_CODEL,
         QDISC_KIND_GRED,
@@ -87,6 +88,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_qdisc_handle);
 
 #include "cake.h"
 #include "codel.h"
+#include "ets.h"
 #include "fifo.h"
 #include "fq-codel.h"
 #include "fq.h"
index 71d5b15e81c75089d1182cbf28f796b84b54ada0..52c17625bf018bf91971c9e300e4ec74bdd62a3d 100644 (file)
@@ -142,7 +142,7 @@ int config_parse_quick_fair_queueing_max_packet(
                 return 0;
         }
 
-        r = parse_size(rvalue, 1000, &v);
+        r = parse_size(rvalue, 1024, &v);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r,
                            "Failed to parse '%s=', ignoring assignment: %s",
index 0682ab4cc6575463aa0ad0dc1654149b0d1bfd87..2c730352d2ccd3241318b810840df6828e4c9bf2 100644 (file)
@@ -12,8 +12,8 @@
 #include "parse-util.h"
 #include "qdisc.h"
 #include "string-util.h"
+#include "strv.h"
 #include "tc-util.h"
-#include "util.h"
 
 static int token_bucket_filter_fill_message(Link *link, QDisc *qdisc, sd_netlink_message *req) {
         uint32_t rtab[256], ptab[256];
@@ -143,24 +143,22 @@ int config_parse_token_bucket_filter_size(
         tbf = TBF(qdisc);
 
         if (isempty(rvalue)) {
-                if (streq(lvalue, "Rate"))
-                        tbf->rate = 0;
-                else if (streq(lvalue, "Burst"))
+                if (STR_IN_SET(lvalue, "BurstBytes", "Burst"))
                         tbf->burst = 0;
-                else if (streq(lvalue, "LimitSize"))
+                else if (STR_IN_SET(lvalue, "LimitBytes", "LimitSize"))
                         tbf->limit = 0;
                 else if (streq(lvalue, "MTUBytes"))
                         tbf->mtu = 0;
                 else if (streq(lvalue, "MPUBytes"))
                         tbf->mpu = 0;
-                else if (streq(lvalue, "PeakRate"))
-                        tbf->peak_rate = 0;
+                else
+                        assert_not_reached("unknown lvalue");
 
                 qdisc = NULL;
                 return 0;
         }
 
-        r = parse_size(rvalue, 1000, &k);
+        r = parse_size(rvalue, 1024, &k);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r,
                            "Failed to parse '%s=', ignoring assignment: %s",
@@ -168,18 +166,76 @@ int config_parse_token_bucket_filter_size(
                 return 0;
         }
 
-        if (streq(lvalue, "Rate"))
-                tbf->rate = k / 8;
-        else if (streq(lvalue, "Burst"))
+        if (STR_IN_SET(lvalue, "BurstBytes", "Burst"))
                 tbf->burst = k;
-        else if (streq(lvalue, "LimitSize"))
+        else if (STR_IN_SET(lvalue, "LimitBytes", "LimitSize"))
                 tbf->limit = k;
         else if (streq(lvalue, "MPUBytes"))
                 tbf->mpu = k;
         else if (streq(lvalue, "MTUBytes"))
                 tbf->mtu = k;
+        else
+                assert_not_reached("unknown lvalue");
+
+        qdisc = NULL;
+
+        return 0;
+}
+
+int config_parse_token_bucket_filter_rate(
+                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_(qdisc_free_or_set_invalidp) QDisc *qdisc = NULL;
+        Network *network = data;
+        TokenBucketFilter *tbf;
+        uint64_t k, *p;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = qdisc_new_static(QDISC_KIND_TBF, network, filename, section_line, &qdisc);
+        if (r == -ENOMEM)
+                return log_oom();
+        if (r < 0)
+                return log_syntax(unit, LOG_ERR, filename, line, r,
+                                  "More than one kind of queueing discipline, ignoring assignment: %m");
+
+        tbf = TBF(qdisc);
+        if (streq(lvalue, "Rate"))
+                p = &tbf->rate;
         else if (streq(lvalue, "PeakRate"))
-                tbf->peak_rate = k / 8;
+                p = &tbf->peak_rate;
+        else
+                assert_not_reached("unknown lvalue");
+
+        if (isempty(rvalue)) {
+                *p = 0;
+
+                qdisc = NULL;
+                return 0;
+        }
+
+        r = parse_size(rvalue, 1000, &k);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to parse '%s=', ignoring assignment: %s",
+                           lvalue, rvalue);
+                return 0;
+        }
+
+        *p = k / 8;
 
         qdisc = NULL;
 
index b66aef206c49b7455703262ead378d81b12c0964..a785be25e0e60b287ef11458c8da9407cc6f5eca 100644 (file)
@@ -23,3 +23,4 @@ extern const QDiscVTable tbf_vtable;
 
 CONFIG_PARSER_PROTOTYPE(config_parse_token_bucket_filter_latency);
 CONFIG_PARSER_PROTOTYPE(config_parse_token_bucket_filter_size);
+CONFIG_PARSER_PROTOTYPE(config_parse_token_bucket_filter_rate);
index 47371a841b974432005af046e4c47cf4524de214..5f25acbdd63d439360e5b8056f62025b2be06da1 100644 (file)
@@ -8,38 +8,46 @@
 #include "tc-util.h"
 #include "time-util.h"
 
-static int tc_init(double *ticks_in_usec) {
-        uint32_t clock_resolution, ticks_to_usec, usec_to_ticks;
-        _cleanup_free_ char *line = NULL;
-        double clock_factor;
-        int r;
+int tc_init(double *ret_ticks_in_usec, uint32_t *ret_hz) {
+        static double ticks_in_usec = -1;
+        static uint32_t hz;
 
-        r = read_one_line_file("/proc/net/psched", &line);
-        if (r < 0)
-                return r;
+        if (ticks_in_usec < 0) {
+                uint32_t clock_resolution, ticks_to_usec, usec_to_ticks;
+                _cleanup_free_ char *line = NULL;
+                double clock_factor;
+                int r;
 
-        r = sscanf(line, "%08x%08x%08x", &ticks_to_usec, &usec_to_ticks, &clock_resolution);
-        if (r < 3)
-                return -EIO;
+                r = read_one_line_file("/proc/net/psched", &line);
+                if (r < 0)
+                        return r;
 
-        clock_factor =  (double) clock_resolution / USEC_PER_SEC;
-        *ticks_in_usec = (double) ticks_to_usec / usec_to_ticks * clock_factor;
+                r = sscanf(line, "%08x%08x%08x%08x", &ticks_to_usec, &usec_to_ticks, &clock_resolution, &hz);
+                if (r < 4)
+                        return -EIO;
+
+                clock_factor =  (double) clock_resolution / USEC_PER_SEC;
+                ticks_in_usec = (double) ticks_to_usec / usec_to_ticks * clock_factor;
+        }
+
+        if (ret_ticks_in_usec)
+                *ret_ticks_in_usec = ticks_in_usec;
+        if (ret_hz)
+                *ret_hz = hz;
 
         return 0;
 }
 
 int tc_time_to_tick(usec_t t, uint32_t *ret) {
-        static double ticks_in_usec = -1;
+        double ticks_in_usec;
         usec_t a;
         int r;
 
         assert(ret);
 
-        if (ticks_in_usec < 0) {
-                r = tc_init(&ticks_in_usec);
-                if (r < 0)
-                        return r;
-        }
+        r = tc_init(&ticks_in_usec, NULL);
+        if (r < 0)
+                return r;
 
         a = t * ticks_in_usec;
         if (a > UINT32_MAX)
index 38b9d0786d58aa9fdd814ad9c3c6a6b6e63c0bd9..6287b35a76571e1311172bfb2601afbcca225fd2 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "time-util.h"
 
+int tc_init(double *ret_ticks_in_usec, uint32_t *ret_hz);
 int tc_time_to_tick(usec_t t, uint32_t *ret);
 int parse_tc_percent(const char *s, uint32_t *percent);
 int tc_transmit_time(uint64_t rate, uint32_t size, uint32_t *ret);
index 4f75e1b42dcdb740d15eaaf13f91934369a78b76..a89e7757ad08f414fdfdfa31dbb899e2ab3139fa 100644 (file)
@@ -22,7 +22,7 @@ const TClassVTable * const tclass_vtable[_TCLASS_KIND_MAX] = {
 };
 
 static int tclass_new(TClassKind kind, TClass **ret) {
-        TClass *tclass;
+        _cleanup_(tclass_freep) TClass *tclass = NULL;
         int r;
 
         tclass = malloc0(tclass_vtable[kind]->object_size);
index 17ed5d38cfe3de6bd53344cc7f391f90e9f61c13..cfd9093f1a3e954b609736ab85adf9994855214f 100644 (file)
@@ -183,8 +183,8 @@ static int parse_argv(int argc, char *argv[]) {
 }
 
 static int run(int argc, char *argv[]) {
-        _cleanup_(notify_on_cleanup) const char *notify_message = NULL;
         _cleanup_(manager_freep) Manager *m = NULL;
+        _cleanup_(notify_on_cleanup) const char *notify_message = NULL;
         int r;
 
         log_setup_service();
index 9a82443c664244115bc48e3f8dceffc944e890ca..e3ade92371f95e945fce82b27dc6b310055e6661 100644 (file)
@@ -57,7 +57,7 @@
  * spec should say what to do with unknown props
  * /bin/mount regarding NFS and FUSE required?
  * what does terminal=false mean?
- * sysctl inside or outside? whitelisting?
+ * sysctl inside or outside? allow-listing?
  * swapiness typo -> swappiness
  *
  * Unsupported:
@@ -1029,39 +1029,40 @@ static int oci_cgroup_devices(const char *name, JsonVariant *v, JsonDispatchFlag
                         return r;
 
                 if (!data.allow) {
-                        /* The fact that OCI allows 'deny' entries makes really no sense, as 'allow' vs. 'deny' for the
-                         * devices cgroup controller is really not about whitelisting and blacklisting but about adding
-                         * and removing entries from the whitelist. Since we always start out with an empty whitelist
-                         * we hence ignore the whole thing, as removing entries which don't exist make no sense. We'll
-                         * log about this, since this is really borked in the spec, with one exception: the entry
-                         * that's supposed to drop the kernel's default we ignore silently */
+                        /* The fact that OCI allows 'deny' entries makes really no sense, as 'allow'
+                         * vs. 'deny' for the devices cgroup controller is really not about allow-listing and
+                         * deny-listing but about adding and removing entries from the allow list. Since we
+                         * always start out with an empty allow list we hence ignore the whole thing, as
+                         * removing entries which don't exist make no sense. We'll log about this, since this
+                         * is really borked in the spec, with one exception: the entry that's supposed to
+                         * drop the kernel's default we ignore silently */
 
                         if (!data.r || !data.w || !data.m || data.type != 0 || data.major != (unsigned) -1 || data.minor != (unsigned) -1)
-                                json_log(v, flags|JSON_WARNING, 0, "Devices cgroup whitelist with arbitrary 'allow' entries not supported, ignoring.");
+                                json_log(v, flags|JSON_WARNING, 0, "Devices cgroup allow list with arbitrary 'allow' entries not supported, ignoring.");
 
                         /* We ignore the 'deny' entry as for us that's implied */
                         continue;
                 }
 
                 if (!data.r && !data.w && !data.m) {
-                        json_log(v, flags|LOG_WARNING, 0, "Device cgroup whitelist entry with no effect found, ignoring.");
+                        json_log(v, flags|LOG_WARNING, 0, "Device cgroup allow list entry with no effect found, ignoring.");
                         continue;
                 }
 
                 if (data.minor != (unsigned) -1 && data.major == (unsigned) -1)
                         return json_log(v, flags, SYNTHETIC_ERRNO(EOPNOTSUPP),
-                                        "Device cgroup whitelist entries with minors but no majors not supported.");
+                                        "Device cgroup allow list entries with minors but no majors not supported.");
 
                 if (data.major != (unsigned) -1 && data.type == 0)
                         return json_log(v, flags, SYNTHETIC_ERRNO(EOPNOTSUPP),
-                                        "Device cgroup whitelist entries with majors but no device node type not supported.");
+                                        "Device cgroup allow list entries with majors but no device node type not supported.");
 
                 if (data.type == 0) {
-                        if (data.r && data.w && data.m) /* a catchall whitelist entry means we are looking at a noop */
+                        if (data.r && data.w && data.m) /* a catchall allow list entry means we are looking at a noop */
                                 noop = true;
                         else
                                 return json_log(v, flags, SYNTHETIC_ERRNO(EOPNOTSUPP),
-                                                "Device cgroup whitelist entries with no type not supported.");
+                                                "Device cgroup allow list entries with no type not supported.");
                 }
 
                 a = reallocarray(list, n_list + 1, sizeof(struct device_data));
index 64773a3d9cf803a48863de17c094d2219eca3bee..50867f38435dbbfd3eb6556d6f95cad81ae926ba 100644 (file)
@@ -3,6 +3,7 @@
 #include "sd-bus.h"
 
 #include "bus-error.h"
+#include "bus-locator.h"
 #include "bus-unit-util.h"
 #include "bus-util.h"
 #include "bus-wait-for-jobs.h"
index f94f131f22e29663a903346bebc4cf636d651765..79110d90d5e0560508269f87c13489febda5fd32 100644 (file)
@@ -25,13 +25,13 @@ static int seccomp_add_default_syscall_filter(
                 scmp_filter_ctx ctx,
                 uint32_t arch,
                 uint64_t cap_list_retain,
-                char **syscall_whitelist,
-                char **syscall_blacklist) {
+                char **syscall_allow_list,
+                char **syscall_deny_list) {
 
         static const struct {
                 uint64_t capability;
                 const char* name;
-        } whitelist[] = {
+        } allow_list[] = {
                 /* Let's use set names where we can */
                 { 0,                  "@aio"                   },
                 { 0,                  "@basic-io"              },
@@ -142,17 +142,17 @@ static int seccomp_add_default_syscall_filter(
         char **p;
         int r;
 
-        for (size_t i = 0; i < ELEMENTSOF(whitelist); i++) {
-                if (whitelist[i].capability != 0 && (cap_list_retain & (1ULL << whitelist[i].capability)) == 0)
+        for (size_t i = 0; i < ELEMENTSOF(allow_list); i++) {
+                if (allow_list[i].capability != 0 && (cap_list_retain & (1ULL << allow_list[i].capability)) == 0)
                         continue;
 
-                r = seccomp_add_syscall_filter_item(ctx, whitelist[i].name, SCMP_ACT_ALLOW, syscall_blacklist, false);
+                r = seccomp_add_syscall_filter_item(ctx, allow_list[i].name, SCMP_ACT_ALLOW, syscall_deny_list, false);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add syscall filter item %s: %m", whitelist[i].name);
+                        return log_error_errno(r, "Failed to add syscall filter item %s: %m", allow_list[i].name);
         }
 
-        STRV_FOREACH(p, syscall_whitelist) {
-                r = seccomp_add_syscall_filter_item(ctx, *p, SCMP_ACT_ALLOW, syscall_blacklist, true);
+        STRV_FOREACH(p, syscall_allow_list) {
+                r = seccomp_add_syscall_filter_item(ctx, *p, SCMP_ACT_ALLOW, syscall_deny_list, true);
                 if (r < 0)
                         log_warning_errno(r, "Failed to add rule for system call %s on %s, ignoring: %m",
                                           *p, seccomp_arch_to_string(arch));
@@ -161,7 +161,7 @@ static int seccomp_add_default_syscall_filter(
         return 0;
 }
 
-int setup_seccomp(uint64_t cap_list_retain, char **syscall_whitelist, char **syscall_blacklist) {
+int setup_seccomp(uint64_t cap_list_retain, char **syscall_allow_list, char **syscall_deny_list) {
         uint32_t arch;
         int r;
 
@@ -173,13 +173,13 @@ int setup_seccomp(uint64_t cap_list_retain, char **syscall_whitelist, char **sys
         SECCOMP_FOREACH_LOCAL_ARCH(arch) {
                 _cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL;
 
-                log_debug("Applying whitelist on architecture: %s", seccomp_arch_to_string(arch));
+                log_debug("Applying allow list on architecture: %s", seccomp_arch_to_string(arch));
 
                 r = seccomp_init_for_arch(&seccomp, arch, SCMP_ACT_ERRNO(EPERM));
                 if (r < 0)
                         return log_error_errno(r, "Failed to allocate seccomp object: %m");
 
-                r = seccomp_add_default_syscall_filter(seccomp, arch, cap_list_retain, syscall_whitelist, syscall_blacklist);
+                r = seccomp_add_default_syscall_filter(seccomp, arch, cap_list_retain, syscall_allow_list, syscall_deny_list);
                 if (r < 0)
                         return r;
 
@@ -231,7 +231,7 @@ int setup_seccomp(uint64_t cap_list_retain, char **syscall_whitelist, char **sys
 
 #else
 
-int setup_seccomp(uint64_t cap_list_retain, char **syscall_whitelist, char **syscall_blacklist) {
+int setup_seccomp(uint64_t cap_list_retain, char **syscall_allow_list, char **syscall_deny_list) {
         return 0;
 }
 
index d852eef638b8682cceaede0bc58a4e8f87b055e5..4174323520998faf5529712c6d06c1c0461d4235 100644 (file)
@@ -3,4 +3,4 @@
 
 #include <sys/types.h>
 
-int setup_seccomp(uint64_t cap_list_retain, char **syscall_whitelist, char **syscall_blacklist);
+int setup_seccomp(uint64_t cap_list_retain, char **syscall_allow_ist, char **syscall_deny_list);
index 996c0027c386210eea2c7580c30b4d95319d1464..d341fa25aac423d1a13e6a8346a790fe8861efbb 100644 (file)
@@ -129,8 +129,8 @@ Settings* settings_free(Settings *s) {
         free(s->pivot_root_new);
         free(s->pivot_root_old);
         free(s->working_directory);
-        strv_free(s->syscall_whitelist);
-        strv_free(s->syscall_blacklist);
+        strv_free(s->syscall_allow_list);
+        strv_free(s->syscall_deny_list);
         rlimit_free_all(s->rlimit);
         free(s->hostname);
         cpu_set_reset(&s->cpu_set);
@@ -689,9 +689,9 @@ int config_parse_syscall_filter(
                 }
 
                 if (negative)
-                        r = strv_extend(&settings->syscall_blacklist, word);
+                        r = strv_extend(&settings->syscall_deny_list, word);
                 else
-                        r = strv_extend(&settings->syscall_whitelist, word);
+                        r = strv_extend(&settings->syscall_allow_list, word);
                 if (r < 0)
                         return log_oom();
         }
index 24f98fd7ef7b084870c84b4b1b87b07fe8453756..ab31c05a9e0e6b92bf512786f206717b3780c248 100644 (file)
@@ -165,8 +165,8 @@ typedef struct Settings {
         UserNamespaceMode userns_mode;
         uid_t uid_shift, uid_range;
         bool notify_ready;
-        char **syscall_whitelist;
-        char **syscall_blacklist;
+        char **syscall_allow_list;
+        char **syscall_deny_list;
         struct rlimit *rlimit[_RLIMIT_MAX];
         char *hostname;
         int no_new_privileges;
index 926b76dc11734ad12f735b3682196d4573d0193f..1f321f9ea3f29ef7740b53670d2326862aed936d 100644 (file)
@@ -200,9 +200,12 @@ static unsigned long arg_clone_ns_flags = CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWUTS
 static MountSettingsMask arg_mount_settings = MOUNT_APPLY_APIVFS_RO|MOUNT_APPLY_TMPFS_TMP;
 static void *arg_root_hash = NULL;
 static char *arg_verity_data = NULL;
+static char *arg_root_hash_sig_path = NULL;
+static void *arg_root_hash_sig = NULL;
+static size_t arg_root_hash_sig_size = 0;
 static size_t arg_root_hash_size = 0;
-static char **arg_syscall_whitelist = NULL;
-static char **arg_syscall_blacklist = NULL;
+static char **arg_syscall_allow_list = NULL;
+static char **arg_syscall_deny_list = NULL;
 #if HAVE_SECCOMP
 static scmp_filter_ctx arg_seccomp = NULL;
 #endif
@@ -244,8 +247,10 @@ STATIC_DESTRUCTOR_REGISTER(arg_property_message, sd_bus_message_unrefp);
 STATIC_DESTRUCTOR_REGISTER(arg_parameters, strv_freep);
 STATIC_DESTRUCTOR_REGISTER(arg_root_hash, freep);
 STATIC_DESTRUCTOR_REGISTER(arg_verity_data, freep);
-STATIC_DESTRUCTOR_REGISTER(arg_syscall_whitelist, strv_freep);
-STATIC_DESTRUCTOR_REGISTER(arg_syscall_blacklist, strv_freep);
+STATIC_DESTRUCTOR_REGISTER(arg_root_hash_sig_path, freep);
+STATIC_DESTRUCTOR_REGISTER(arg_root_hash_sig, freep);
+STATIC_DESTRUCTOR_REGISTER(arg_syscall_allow_list, strv_freep);
+STATIC_DESTRUCTOR_REGISTER(arg_syscall_deny_list, strv_freep);
 #if HAVE_SECCOMP
 STATIC_DESTRUCTOR_REGISTER(arg_seccomp, seccomp_releasep);
 #endif
@@ -305,6 +310,10 @@ static int help(void) {
                "     --read-only            Mount the root directory read-only\n"
                "     --volatile[=MODE]      Run the system in volatile mode\n"
                "     --root-hash=HASH       Specify verity root hash for root disk image\n"
+               "     --root-hash-sig=SIG    Specify pkcs7 signature of root hash for verity\n"
+               "                            as a DER encoded PKCS7, either as a path to a file\n"
+               "                            or as an ASCII base64 encoded string prefixed by\n"
+               "                            'base64:'\n"
                "     --verity-data=PATH     Specify hash device for verity\n"
                "     --pivot-root=PATH[:PATH]\n"
                "                            Pivot root to given directory in the container\n\n"
@@ -667,6 +676,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_OCI_BUNDLE,
                 ARG_NO_PAGER,
                 ARG_VERITY_DATA,
+                ARG_ROOT_HASH_SIG,
         };
 
         static const struct option options[] = {
@@ -733,6 +743,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "oci-bundle",             required_argument, NULL, ARG_OCI_BUNDLE             },
                 { "no-pager",               no_argument,       NULL, ARG_NO_PAGER               },
                 { "verity-data",            required_argument, NULL, ARG_VERITY_DATA            },
+                { "root-hash-sig",          required_argument, NULL, ARG_ROOT_HASH_SIG          },
                 {}
         };
 
@@ -1327,6 +1338,31 @@ static int parse_argv(int argc, char *argv[]) {
                                 return r;
                         break;
 
+                case ARG_ROOT_HASH_SIG: {
+                        char *value;
+
+                        if ((value = startswith(optarg, "base64:"))) {
+                                void *p;
+                                size_t l;
+
+                                r = unbase64mem(value, strlen(value), &p, &l);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to parse root hash signature '%s': %m", optarg);
+
+                                free_and_replace(arg_root_hash_sig, p);
+                                arg_root_hash_sig_size = l;
+                                arg_root_hash_sig_path = mfree(arg_root_hash_sig_path);
+                        } else {
+                                r = parse_path_argument_and_warn(optarg, false, &arg_root_hash_sig_path);
+                                if (r < 0)
+                                        return r;
+                                arg_root_hash_sig = mfree(arg_root_hash_sig);
+                                arg_root_hash_sig_size = 0;
+                        }
+
+                        break;
+                }
+
                 case ARG_SYSTEM_CALL_FILTER: {
                         bool negative;
                         const char *items;
@@ -1346,9 +1382,9 @@ static int parse_argv(int argc, char *argv[]) {
                                         return log_error_errno(r, "Failed to parse system call filter: %m");
 
                                 if (negative)
-                                        r = strv_extend(&arg_syscall_blacklist, word);
+                                        r = strv_extend(&arg_syscall_deny_list, word);
                                 else
-                                        r = strv_extend(&arg_syscall_whitelist, word);
+                                        r = strv_extend(&arg_syscall_allow_list, word);
                                 if (r < 0)
                                         return log_oom();
                         }
@@ -2175,10 +2211,11 @@ static int setup_dev_console(const char *console) {
 static int setup_keyring(void) {
         key_serial_t keyring;
 
-        /* Allocate a new session keyring for the container. This makes sure the keyring of the session systemd-nspawn
-         * was invoked from doesn't leak into the container. Note that by default we block keyctl() and request_key()
-         * anyway via seccomp so doing this operation isn't strictly necessary, but in case people explicitly whitelist
-         * these system calls let's make sure we don't leak anything into the container. */
+        /* Allocate a new session keyring for the container. This makes sure the keyring of the session
+         * systemd-nspawn was invoked from doesn't leak into the container. Note that by default we block
+         * keyctl() and request_key() anyway via seccomp so doing this operation isn't strictly necessary,
+         * but in case people explicitly allow-list these system calls let's make sure we don't leak anything
+         * into the container. */
 
         keyring = keyctl(KEYCTL_JOIN_SESSION_KEYRING, 0, 0, 0, 0);
         if (keyring == -1) {
@@ -3090,7 +3127,7 @@ static int inner_child(
         } else
 #endif
         {
-                r = setup_seccomp(arg_caps_retain, arg_syscall_whitelist, arg_syscall_blacklist);
+                r = setup_seccomp(arg_caps_retain, arg_syscall_allow_list, arg_syscall_deny_list);
                 if (r < 0)
                         return r;
         }
@@ -3960,11 +3997,11 @@ static int merge_settings(Settings *settings, const char *path) {
 
         if ((arg_settings_mask & SETTING_SYSCALL_FILTER) == 0) {
 
-                if (!arg_settings_trusted && !strv_isempty(settings->syscall_whitelist))
+                if (!arg_settings_trusted && !strv_isempty(settings->syscall_allow_list))
                         log_warning("Ignoring SystemCallFilter= settings, file %s is not trusted.", path);
                 else {
-                        strv_free_and_replace(arg_syscall_whitelist, settings->syscall_whitelist);
-                        strv_free_and_replace(arg_syscall_blacklist, settings->syscall_blacklist);
+                        strv_free_and_replace(arg_syscall_allow_list, settings->syscall_allow_list);
+                        strv_free_and_replace(arg_syscall_deny_list, settings->syscall_deny_list);
                 }
 
 #if HAVE_SECCOMP
@@ -5148,7 +5185,8 @@ static int run(int argc, char *argv[]) {
                         }
 
                         r = verity_metadata_load(arg_image, NULL, arg_root_hash ? NULL : &arg_root_hash, &arg_root_hash_size,
-                                        arg_verity_data ? NULL : &arg_verity_data);
+                                        arg_verity_data ? NULL : &arg_verity_data,
+                                        arg_root_hash_sig_path || arg_root_hash_sig ? NULL : &arg_root_hash_sig_path);
                         if (r < 0) {
                                 log_error_errno(r, "Failed to read verity artefacts for %s: %m", arg_image);
                                 goto finish;
@@ -5198,7 +5236,7 @@ static int run(int argc, char *argv[]) {
                 if (!arg_root_hash && dissected_image->can_verity)
                         log_notice("Note: image %s contains verity information, but no root hash specified! Proceeding without integrity checking.", arg_image);
 
-                r = dissected_image_decrypt_interactively(dissected_image, NULL, arg_root_hash, arg_root_hash_size, arg_verity_data, 0, &decrypted_image);
+                r = dissected_image_decrypt_interactively(dissected_image, NULL, arg_root_hash, arg_root_hash_size, arg_verity_data, arg_root_hash_sig_path, arg_root_hash_sig, arg_root_hash_sig_size, 0, &decrypted_image);
                 if (r < 0)
                         goto finish;
 
index ce51fa89380e7d07e0210bb173a95b5792f0d23b..9269e7fd7bfee09b5c392addd6462851f8eb1aa3 100644 (file)
@@ -8,7 +8,7 @@
 
 #include "alloc-util.h"
 #include "bus-common-errors.h"
-#include "bus-util.h"
+#include "bus-locator.h"
 #include "env-util.h"
 #include "errno-util.h"
 #include "format-util.h"
index 0ee3ddd843fdb5742deb9e4fe165ff3c058334ed..43ab5216353d3bd421a9a70e71091957cd089506 100644 (file)
@@ -10,7 +10,7 @@
 #include "sd-bus.h"
 
 #include "bus-common-errors.h"
-#include "bus-util.h"
+#include "bus-locator.h"
 #include "errno-util.h"
 #include "in-addr-util.h"
 #include "macro.h"
index 6a2d9c885ed7b211f329a59790402c6a920dd6fa..5dc5aacdff200a37fdb2829e4c0814c2472323b4 100644 (file)
@@ -8,6 +8,7 @@
 #include "fd-util.h"
 #include "group-record-nss.h"
 #include "macro.h"
+#include "nss-systemd.h"
 #include "nss-util.h"
 #include "pthread-util.h"
 #include "signal-util.h"
@@ -299,7 +300,7 @@ enum nss_status _nss_systemd_setpwent(int stayopen) {
         PROTECT_ERRNO;
         BLOCK_SIGNALS(NSS_SIGNALS_BLOCK);
 
-        if (userdb_nss_compat_is_enabled() <= 0)
+        if (_nss_systemd_is_blocked())
                 return NSS_STATUS_NOTFOUND;
 
         _cleanup_(pthread_mutex_unlock_assertp) pthread_mutex_t *_l = NULL;
@@ -323,7 +324,7 @@ enum nss_status _nss_systemd_setgrent(int stayopen) {
         PROTECT_ERRNO;
         BLOCK_SIGNALS(NSS_SIGNALS_BLOCK);
 
-        if (userdb_nss_compat_is_enabled() <= 0)
+        if (_nss_systemd_is_blocked())
                 return NSS_STATUS_NOTFOUND;
 
         _cleanup_(pthread_mutex_unlock_assertp) pthread_mutex_t *_l = NULL;
@@ -353,13 +354,7 @@ enum nss_status _nss_systemd_getpwent_r(
         assert(result);
         assert(errnop);
 
-        r = userdb_nss_compat_is_enabled();
-        if (r < 0) {
-                UNPROTECT_ERRNO;
-                *errnop = -r;
-                return NSS_STATUS_UNAVAIL;
-        }
-        if (!r)
+        if (_nss_systemd_is_blocked())
                 return NSS_STATUS_NOTFOUND;
 
         _cleanup_(pthread_mutex_unlock_assertp) pthread_mutex_t *_l = NULL;
@@ -406,14 +401,8 @@ enum nss_status _nss_systemd_getgrent_r(
         assert(result);
         assert(errnop);
 
-        r = userdb_nss_compat_is_enabled();
-        if (r < 0) {
-                UNPROTECT_ERRNO;
-                *errnop = -r;
-                return NSS_STATUS_UNAVAIL;
-        }
-        if (!r)
-                return NSS_STATUS_UNAVAIL;
+        if (_nss_systemd_is_blocked())
+                return NSS_STATUS_NOTFOUND;
 
         _cleanup_(pthread_mutex_unlock_assertp) pthread_mutex_t *_l = NULL;
 
@@ -459,7 +448,7 @@ enum nss_status _nss_systemd_getgrent_r(
         }
 
         if (getgrent_data.by_membership) {
-                _cleanup_close_ int lock_fd = -1;
+                _cleanup_(_nss_systemd_unblockp) bool blocked = false;
 
                 for (;;) {
                         _cleanup_free_ char *user_name = NULL, *group_name = NULL;
@@ -479,13 +468,15 @@ enum nss_status _nss_systemd_getgrent_r(
                                 continue;
 
                         /* We are about to recursively call into NSS, let's make sure we disable recursion into our own code. */
-                        if (lock_fd < 0) {
-                                lock_fd = userdb_nss_compat_disable();
-                                if (lock_fd < 0 && lock_fd != -EBUSY) {
+                        if (!blocked) {
+                                r = _nss_systemd_block(true);
+                                if (r < 0) {
                                         UNPROTECT_ERRNO;
-                                        *errnop = -lock_fd;
+                                        *errnop = -r;
                                         return NSS_STATUS_UNAVAIL;
                                 }
+
+                                blocked = true;
                         }
 
                         r = nss_group_record_by_name(group_name, false, &gr);
@@ -549,13 +540,7 @@ enum nss_status _nss_systemd_initgroups_dyn(
         if (STR_IN_SET(user_name, root_passwd.pw_name, nobody_passwd.pw_name))
                 return NSS_STATUS_NOTFOUND;
 
-        r = userdb_nss_compat_is_enabled();
-        if (r < 0) {
-                UNPROTECT_ERRNO;
-                *errnop = -r;
-                return NSS_STATUS_UNAVAIL;
-        }
-        if (!r)
+        if (_nss_systemd_is_blocked())
                 return NSS_STATUS_NOTFOUND;
 
         r = membershipdb_by_user(user_name, nss_glue_userdb_flags(), &iterator);
@@ -581,7 +566,7 @@ enum nss_status _nss_systemd_initgroups_dyn(
                 /* The group might be defined via traditional NSS only, hence let's do a full look-up without
                  * disabling NSS. This means we are operating recursively here. */
 
-                r = groupdb_by_name(group_name, nss_glue_userdb_flags() & ~USERDB_AVOID_NSS, &g);
+                r = groupdb_by_name(group_name, (nss_glue_userdb_flags() & ~USERDB_AVOID_NSS) | USERDB_AVOID_SHADOW, &g);
                 if (r == -ESRCH)
                         continue;
                 if (r < 0) {
@@ -627,3 +612,29 @@ enum nss_status _nss_systemd_initgroups_dyn(
 
         return any ? NSS_STATUS_SUCCESS : NSS_STATUS_NOTFOUND;
 }
+
+static thread_local unsigned _blocked = 0;
+
+_public_ int _nss_systemd_block(bool b) {
+
+        /* This blocks recursively: it's blocked for as many times this function is called with `true` until
+         * it is called an equal time with `false`. */
+
+        if (b) {
+                if (_blocked >= UINT_MAX)
+                        return -EOVERFLOW;
+
+                _blocked++;
+        } else {
+                if (_blocked <= 0)
+                        return -EOVERFLOW;
+
+                _blocked--;
+        }
+
+        return b; /* Return what is passed in, i.e. the new state from the PoV of the caller */
+}
+
+_public_ bool _nss_systemd_is_blocked(void) {
+        return _blocked > 0;
+}
diff --git a/src/nss-systemd/nss-systemd.h b/src/nss-systemd/nss-systemd.h
new file mode 100644 (file)
index 0000000..ffa75c1
--- /dev/null
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include <stdbool.h>
+
+int _nss_systemd_block(bool b);
+bool _nss_systemd_is_blocked(void);
+
+/* For use with the _cleanup_() macro */
+static inline void _nss_systemd_unblockp(bool *b) {
+        if (*b)
+                assert_se(_nss_systemd_block(false) >= 0);
+}
index 77e1fbe93f227e6e878c7847bb9f773b9dfa7769..f86d7643d1a412dc316c1f5633187c4b8c55a760 100644 (file)
@@ -20,5 +20,9 @@ global:
         _nss_systemd_setgrent;
         _nss_systemd_getgrent_r;
         _nss_systemd_initgroups_dyn;
+
+        /* These two are not used by glibc, but can be used by apps to explicitly disable nss-systemd for the calling thread. */
+        _nss_systemd_block;
+        _nss_systemd_is_blocked;
 local: *;
 };
index da1248a132a8c19ce4a89c218276513dd94e7bd4..8e5b3eba6c08076eb533aff60bb25fdb9efad976 100644 (file)
@@ -3,6 +3,7 @@
 #include "env-util.h"
 #include "fd-util.h"
 #include "group-record-nss.h"
+#include "nss-systemd.h"
 #include "strv.h"
 #include "user-record.h"
 #include "userdb-glue.h"
@@ -74,12 +75,7 @@ enum nss_status userdb_getpwnam(
         assert(pwd);
         assert(errnop);
 
-        r = userdb_nss_compat_is_enabled();
-        if (r < 0) {
-                *errnop = -r;
-                return NSS_STATUS_UNAVAIL;
-        }
-        if (!r)
+        if (_nss_systemd_is_blocked())
                 return NSS_STATUS_NOTFOUND;
 
         r = userdb_by_name(name, nss_glue_userdb_flags(), &hr);
@@ -112,12 +108,7 @@ enum nss_status userdb_getpwuid(
         assert(pwd);
         assert(errnop);
 
-        r = userdb_nss_compat_is_enabled();
-        if (r < 0) {
-                *errnop = -r;
-                return NSS_STATUS_UNAVAIL;
-        }
-        if (!r)
+        if (_nss_systemd_is_blocked())
                 return NSS_STATUS_NOTFOUND;
 
         r = userdb_by_uid(uid, nss_glue_userdb_flags(), &hr);
@@ -214,12 +205,7 @@ enum nss_status userdb_getgrnam(
         assert(gr);
         assert(errnop);
 
-        r = userdb_nss_compat_is_enabled();
-        if (r < 0) {
-                *errnop = -r;
-                return NSS_STATUS_UNAVAIL;
-        }
-        if (!r)
+        if (_nss_systemd_is_blocked())
                 return NSS_STATUS_NOTFOUND;
 
         r = groupdb_by_name(name, nss_glue_userdb_flags(), &g);
@@ -235,7 +221,7 @@ enum nss_status userdb_getgrnam(
         }
 
         if (!g) {
-                _cleanup_close_ int lock_fd = -1;
+                _cleanup_(_nss_systemd_unblockp) bool blocked = false;
 
                 if (strv_isempty(members))
                         return NSS_STATUS_NOTFOUND;
@@ -245,11 +231,13 @@ enum nss_status userdb_getgrnam(
                  * acquire it, so that we can extend it (that's because glibc's group merging feature will
                  * merge groups only if both GID and name match and thus we need to have both first). It
                  * sucks behaving recursively likely this, but it's apparently what everybody does. We break
-                 * the recursion for ourselves via the userdb_nss_compat_disable() lock. */
+                 * the recursion for ourselves via the _nss_systemd_block_nss() lock. */
+
+                r = _nss_systemd_block(true);
+                if (r < 0)
+                        return r;
 
-                lock_fd = userdb_nss_compat_disable();
-                if (lock_fd < 0 && lock_fd != -EBUSY)
-                        return lock_fd;
+                blocked = true;
 
                 r = nss_group_record_by_name(name, false, &g);
                 if (r == -ESRCH)
@@ -285,12 +273,7 @@ enum nss_status userdb_getgrgid(
         assert(gr);
         assert(errnop);
 
-        r = userdb_nss_compat_is_enabled();
-        if (r < 0) {
-                *errnop = -r;
-                return NSS_STATUS_UNAVAIL;
-        }
-        if (!r)
+        if (_nss_systemd_is_blocked())
                 return NSS_STATUS_NOTFOUND;
 
         r = groupdb_by_gid(gid, nss_glue_userdb_flags(), &g);
@@ -300,20 +283,21 @@ enum nss_status userdb_getgrgid(
         }
 
         if (!g) {
-                _cleanup_close_ int lock_fd = -1;
+                _cleanup_(_nss_systemd_unblockp) bool blocked = false;
 
                 /* So, quite possibly we have to extend an existing group record with additional members. But
                  * to do this we need to know the group name first. The group didn't exist via non-NSS
                  * queries though, hence let's try to acquire it here recursively via NSS. */
 
-                lock_fd = userdb_nss_compat_disable();
-                if (lock_fd < 0 && lock_fd != -EBUSY)
-                        return lock_fd;
+                r = _nss_systemd_block(true);
+                if (r < 0)
+                        return r;
+
+                blocked = true;
 
                 r = nss_group_record_by_gid(gid, false, &g);
                 if (r == -ESRCH)
                         return NSS_STATUS_NOTFOUND;
-
                 if (r < 0) {
                         *errnop = -r;
                         return NSS_STATUS_UNAVAIL;
index 7e2452a5d15d17bc2e0f5e9958b6246cd3041cb4..98a7e4d31de1037ef541d5e592b574a1de45831f 100644 (file)
@@ -79,7 +79,7 @@ static int resize_crypt_luks_device(dev_t devno, const char *fstype, dev_t main_
 }
 #endif
 
-static int maybe_resize_slave_device(const char *mountpath, dev_t main_devno) {
+static int maybe_resize_underlying_device(const char *mountpath, dev_t main_devno) {
         _cleanup_free_ char *fstype = NULL, *devpath = NULL;
         dev_t devno;
         int r;
@@ -213,7 +213,7 @@ static int run(int argc, char *argv[]) {
         if (r < 0)
                 return log_error_errno(r, "Failed to determine block device of \"%s\": %m", arg_target);
 
-        r = maybe_resize_slave_device(arg_target, devno);
+        r = maybe_resize_underlying_device(arg_target, devno);
         if (r < 0)
                 return r;
 
index d3706fe1806513b16b7a607f8ed789edb9e4d375..30805212798993a203ab19e16870ca2e59334387 100644 (file)
@@ -114,6 +114,10 @@ struct Partition {
         FreeArea *padding_area;
         FreeArea *allocated_to_area;
 
+        char *copy_blocks_path;
+        int copy_blocks_fd;
+        uint64_t copy_blocks_size;
+
         LIST_FIELDS(Partition, partitions);
 };
 
@@ -174,6 +178,8 @@ static Partition *partition_new(void) {
                 .padding_max = UINT64_MAX,
                 .partno = UINT64_MAX,
                 .offset = UINT64_MAX,
+                .copy_blocks_fd = -1,
+                .copy_blocks_size = UINT64_MAX,
         };
 
         return p;
@@ -192,6 +198,9 @@ static Partition* partition_free(Partition *p) {
         if (p->new_partition)
                 fdisk_unref_partition(p->new_partition);
 
+        free(p->copy_blocks_path);
+        safe_close(p->copy_blocks_fd);
+
         return mfree(p);
 }
 
@@ -339,7 +348,11 @@ static uint64_t partition_min_size(const Partition *p) {
         }
 
         sz = p->current_size != UINT64_MAX ? p->current_size : HARD_MIN_SIZE;
-        return MAX(p->size_min == UINT64_MAX ? DEFAULT_MIN_SIZE : p->size_min, sz);
+
+        if (p->copy_blocks_size != UINT64_MAX)
+                sz = MAX(p->copy_blocks_size, sz);
+
+        return MAX(p->size_min != UINT64_MAX ? p->size_min : DEFAULT_MIN_SIZE, sz);
 }
 
 static uint64_t partition_max_size(const Partition *p) {
@@ -986,17 +999,18 @@ static int config_parse_size4096(
 static int partition_read_definition(Partition *p, const char *path) {
 
         ConfigTableItem table[] = {
-                { "Partition", "Type",            config_parse_type,     0,  &p->type_uuid      },
-                { "Partition", "Label",           config_parse_label,    0,  &p->new_label      },
-                { "Partition", "UUID",            config_parse_id128,    0,  &p->new_uuid       },
-                { "Partition", "Priority",        config_parse_int32,    0,  &p->priority       },
-                { "Partition", "Weight",          config_parse_weight,   0,  &p->weight         },
-                { "Partition", "PaddingWeight",   config_parse_weight,   0,  &p->padding_weight },
-                { "Partition", "SizeMinBytes",    config_parse_size4096, 1,  &p->size_min       },
-                { "Partition", "SizeMaxBytes",    config_parse_size4096, -1, &p->size_max       },
-                { "Partition", "PaddingMinBytes", config_parse_size4096, 1,  &p->padding_min    },
-                { "Partition", "PaddingMaxBytes", config_parse_size4096, -1, &p->padding_max    },
-                { "Partition", "FactoryReset",    config_parse_bool,     0,  &p->factory_reset  },
+                { "Partition", "Type",            config_parse_type,     0,  &p->type_uuid        },
+                { "Partition", "Label",           config_parse_label,    0,  &p->new_label        },
+                { "Partition", "UUID",            config_parse_id128,    0,  &p->new_uuid         },
+                { "Partition", "Priority",        config_parse_int32,    0,  &p->priority         },
+                { "Partition", "Weight",          config_parse_weight,   0,  &p->weight           },
+                { "Partition", "PaddingWeight",   config_parse_weight,   0,  &p->padding_weight   },
+                { "Partition", "SizeMinBytes",    config_parse_size4096, 1,  &p->size_min         },
+                { "Partition", "SizeMaxBytes",    config_parse_size4096, -1, &p->size_max         },
+                { "Partition", "PaddingMinBytes", config_parse_size4096, 1,  &p->padding_min      },
+                { "Partition", "PaddingMaxBytes", config_parse_size4096, -1, &p->padding_max      },
+                { "Partition", "FactoryReset",    config_parse_bool,     0,  &p->factory_reset    },
+                { "Partition", "CopyBlocks",      config_parse_path,     0,  &p->copy_blocks_path },
                 {}
         };
         int r;
@@ -1652,7 +1666,7 @@ static int context_dump_partitions(Context *context, const char *node) {
                                 TABLE_UINT64, p->new_padding,
                                 TABLE_STRING, padding_change, TABLE_SET_COLOR, !p->partitions_next && sum_padding > 0 ? ansi_underline() : NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add row to table: %m");
+                        return table_log_add_error(r);
         }
 
         if (sum_padding > 0 || sum_size > 0) {
@@ -1675,7 +1689,7 @@ static int context_dump_partitions(Context *context, const char *node) {
                                 TABLE_EMPTY,
                                 TABLE_STRING, b);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add row to table: %m");
+                        return table_log_add_error(r);
         }
 
         r = table_print(t, stdout);
@@ -2126,6 +2140,48 @@ static int context_wipe_and_discard(Context *context, bool from_scratch) {
         return 0;
 }
 
+static int context_copy_blocks(Context *context) {
+        Partition *p;
+        int fd = -1, r;
+
+        assert(context);
+
+        /* Copy in file systems on the block level */
+
+        LIST_FOREACH(partitions, p, context->partitions) {
+                char buf[FORMAT_BYTES_MAX];
+
+                if (p->copy_blocks_fd < 0)
+                        continue;
+
+                if (p->dropped)
+                        continue;
+
+                if (PARTITION_EXISTS(p)) /* Never copy over existing partitions */
+                        continue;
+
+                assert(p->new_size != UINT64_MAX);
+                assert(p->copy_blocks_size != UINT64_MAX);
+                assert(p->new_size >= p->copy_blocks_size);
+
+                if (fd < 0)
+                        assert_se((fd = fdisk_get_devfd(context->fdisk_context)) >= 0);
+
+                if (lseek(fd, p->offset, SEEK_SET) == (off_t) -1)
+                        return log_error_errno(errno, "Failed to seek to partition offset: %m");
+
+                log_info("Copying in '%s' (%s) on block level into partition %" PRIu64 ".", p->copy_blocks_path, format_bytes(buf, sizeof(buf), p->copy_blocks_size), p->partno);
+
+                r = copy_bytes_full(p->copy_blocks_fd, fd, p->copy_blocks_size, 0, NULL, NULL, NULL, NULL);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to copy in data from '%s': %m", p->copy_blocks_path);
+
+                log_info("Copying in of '%s' on block level completed.", p->copy_blocks_path);
+        }
+
+        return 0;
+}
+
 static int partition_acquire_uuid(Context *context, Partition *p, sd_id128_t *ret) {
         struct {
                 sd_id128_t type_uuid;
@@ -2388,6 +2444,10 @@ static int context_write_partition_table(
         if (r < 0)
                 return r;
 
+        r = context_copy_blocks(context);
+        if (r < 0)
+                return r;
+
         LIST_FOREACH(partitions, p, context->partitions) {
                 if (p->dropped)
                         continue;
@@ -2633,6 +2693,87 @@ static int context_can_factory_reset(Context *context) {
         return false;
 }
 
+static int context_open_copy_block_paths(Context *context) {
+        Partition *p;
+        int r;
+
+        assert(context);
+
+        LIST_FOREACH(partitions, p, context->partitions) {
+                _cleanup_close_ int source_fd = -1;
+                uint64_t size;
+                struct stat st;
+
+                assert(p->copy_blocks_fd < 0);
+                assert(p->copy_blocks_size == UINT64_MAX);
+
+                if (PARTITION_EXISTS(p)) /* Never copy over partitions that already exist! */
+                        continue;
+
+                if (!p->copy_blocks_path)
+                        continue;
+
+                source_fd = open(p->copy_blocks_path, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+                if (source_fd < 0)
+                        return log_error_errno(errno, "Failed to open block copy file '%s': %m", p->copy_blocks_path);
+
+                if (fstat(source_fd, &st) < 0)
+                        return log_error_errno(errno, "Failed to stat block copy file '%s': %m", p->copy_blocks_path);
+
+                if (S_ISDIR(st.st_mode)) {
+                        _cleanup_free_ char *bdev = NULL;
+
+                        /* If the file is a directory, automatically find the backing block device */
+
+                        if (major(st.st_dev) != 0)
+                                r = device_path_make_major_minor(S_IFBLK, st.st_dev, &bdev);
+                        else {
+                                dev_t devt;
+
+                                /* Special support for btrfs */
+
+                                r = btrfs_get_block_device_fd(source_fd, &devt);
+                                if (r < 0)
+                                        return log_error_errno(r, "Unable to determine backing block device of '%s': %m", p->copy_blocks_path);
+
+                                r = device_path_make_major_minor(S_IFBLK, devt, &bdev);
+                        }
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to determine block device path for block device backing '%s': %m", p->copy_blocks_path);
+
+                        safe_close(source_fd);
+
+                        source_fd = open(bdev, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+                        if (source_fd < 0)
+                                return log_error_errno(errno, "Failed to open block device '%s': %m", bdev);
+
+                        if (fstat(source_fd, &st) < 0)
+                                return log_error_errno(errno, "Failed to stat block device '%s': %m", bdev);
+
+                        if (!S_ISBLK(st.st_mode))
+                                return log_error_errno(SYNTHETIC_ERRNO(ENOTBLK), "Block device '%s' is not actually a block device, refusing.", bdev);
+                }
+
+                if (S_ISREG(st.st_mode))
+                        size = st.st_size;
+                else if (S_ISBLK(st.st_mode)) {
+                        if (ioctl(source_fd, BLKGETSIZE64, &size) != 0)
+                                return log_error_errno(errno, "Failed to determine size of block device to copy from: %m");
+                } else
+                        return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Specified path to copy blocks from '%s' is not a regular file, block device or directory, refusing: %m", p->copy_blocks_path);
+
+                if (size <= 0)
+                        return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "File to copy bytes from '%s' has zero size, refusing.", p->copy_blocks_path);
+                if (size % 512 != 0)
+                        return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "File to copy bytes from '%s' has size that is not multiple of 512, refusing.", p->copy_blocks_path);
+
+                p->copy_blocks_fd = TAKE_FD(source_fd);
+                p->copy_blocks_size = size;
+        }
+
+        return 0;
+}
+
 static int help(void) {
         _cleanup_free_ char *link = NULL;
         int r;
@@ -3213,6 +3354,11 @@ static int run(int argc, char *argv[]) {
         if (r < 0)
                 return r;
 
+        /* Open all files to copy blocks from now, since we want to take their size into consideration */
+        r = context_open_copy_block_paths(context);
+        if (r < 0)
+                return r;
+
         /* First try to fit new partitions in, dropping by priority until it fits */
         for (;;) {
                 if (context_allocate_partitions(context))
index 897f11411a9bc1ca8fb419061b98aec8671b067b..7d63eb466418ed23be9c3d8eefd4483cc74c835e 100755 (executable)
@@ -25,7 +25,7 @@ EOF
 
 cat >$D/definitions/root.conf <<EOF
 [Partition]
-Type=root
+Type=root-x86-64
 EOF
 
 ln -s root.conf $D/definitions/root2.conf
@@ -113,3 +113,34 @@ $D/zzz3 : start=     1185760, size=      591864, type=4F68BCE3-E8CD-4DB1-96E7-FB
 $D/zzz4 : start=     1777624, size=      131072, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F, uuid=2AA78CDB-59C7-4173-AF11-C7453737A5D1, name="swap"
 $D/zzz5 : start=     1908696, size=     2285568, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=A0A1A2A3-A4A5-A6A7-A8A9-AAABACADAEAF, name="custom_label"
 EOF
+
+dd if=/dev/urandom of=$D/block-copy bs=4096 count=10240
+
+cat >$D/definitions/extra2.conf <<EOF
+[Partition]
+Type=linux-generic
+Label=block-copy
+UUID=2a1d97e1d0a346cca26eadc643926617
+CopyBlocks=$D/block-copy
+EOF
+
+$repart $D/zzz --size=3G --dry-run=no --seed=$SEED --definitions=$D/definitions
+
+sfdisk -d $D/zzz | grep -v -e 'sector-size' -e '^$' >$D/populated4
+
+cmp $D/populated4 - <<EOF
+label: gpt
+label-id: EF7F7EE2-47B3-4251-B1A1-09EA8BF12D5D
+device: $D/zzz
+unit: sectors
+first-lba: 2048
+last-lba: 6291422
+$D/zzz1 : start=        2048, size=      591856, type=933AC7E1-2EB4-4F13-B844-0E14E2AEF915, uuid=A6005774-F558-4330-A8E5-D6D2C01C01D6, name="home-$UNAME"
+$D/zzz2 : start=      593904, size=      591856, type=4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709, uuid=CE9C76EB-A8F1-40FF-813C-11DCA6C0A55B, name="root-x86-64"
+$D/zzz3 : start=     1185760, size=      591864, type=4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709, uuid=AC60A837-550C-43BD-B5C4-9CB73B884E79, name="root-x86-64-2"
+$D/zzz4 : start=     1777624, size=      131072, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F, uuid=2AA78CDB-59C7-4173-AF11-C7453737A5D1, name="swap"
+$D/zzz5 : start=     1908696, size=     2285568, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=A0A1A2A3-A4A5-A6A7-A8A9-AAABACADAEAF, name="custom_label"
+$D/zzz6 : start=     4194264, size=     2097152, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=2A1D97E1-D0A3-46CC-A26E-ADC643926617, name="block-copy"
+EOF
+
+cmp --bytes=41943040 --ignore-initial=0:$((512*4194264)) $D/block-copy $D/zzz
index 61c1d475b8f4e9982d58eb2516c3499c5343066f..48294d4c492abf9701df8432face2a111469de28 100644 (file)
@@ -878,7 +878,7 @@ static int attach_unit_file(
                 _cleanup_(unlink_and_freep) char *tmp = NULL;
                 _cleanup_close_ int fd = -1;
 
-                fd = open_tmpfile_linkable(where, O_WRONLY|O_CLOEXEC, &tmp);
+                fd = open_tmpfile_linkable(path, O_WRONLY|O_CLOEXEC, &tmp);
                 if (fd < 0)
                         return log_debug_errno(fd, "Failed to create unit file '%s': %m", path);
 
@@ -1126,7 +1126,7 @@ int portable_detach(
                 sd_bus_error *error) {
 
         _cleanup_(lookup_paths_free) LookupPaths paths = {};
-        _cleanup_set_free_free_ Set *unit_files = NULL, *markers = NULL;
+        _cleanup_set_free_ Set *unit_files = NULL, *markers = NULL;
         _cleanup_closedir_ DIR *d = NULL;
         const char *where, *item;
         Iterator iterator;
@@ -1150,10 +1150,6 @@ int portable_detach(
                 return log_debug_errno(errno, "Failed to open '%s' directory: %m", where);
         }
 
-        markers = set_new(&path_hash_ops);
-        if (!markers)
-                return -ENOMEM;
-
         FOREACH_DIRENT(de, d, return log_debug_errno(errno, "Failed to enumerate '%s' directory: %m", where)) {
                 _cleanup_free_ char *marker = NULL;
                 UnitFileState state;
@@ -1194,15 +1190,9 @@ int portable_detach(
                 if (path_is_absolute(marker) &&
                     !image_in_search_path(IMAGE_PORTABLE, marker)) {
 
-                        r = set_ensure_allocated(&markers, &path_hash_ops);
+                        r = set_ensure_consume(&markers, &path_hash_ops_free, TAKE_PTR(marker));
                         if (r < 0)
                                 return r;
-
-                        r = set_put(markers, marker);
-                        if (r >= 0)
-                                marker = NULL;
-                        else if (r != -EEXIST)
-                                return r;
                 }
         }
 
index 1bde30e90f1ab7b2a1c7bbbe8cf2731b89085f71..aa6369864a4e4240cdbded6083d3cb5111ee8f36 100644 (file)
@@ -7,8 +7,8 @@
 
 #include "alloc-util.h"
 #include "bus-error.h"
+#include "bus-locator.h"
 #include "bus-unit-util.h"
-#include "bus-util.h"
 #include "bus-wait-for-jobs.h"
 #include "def.h"
 #include "dirent-util.h"
@@ -744,13 +744,13 @@ static int list_images(int argc, char *argv[], void *userdata) {
         if (table_get_rows(table) > 1) {
                 r = table_set_sort(table, (size_t) 0, (size_t) -1);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to sort table: %m");
+                        return table_log_sort_error(r);
 
                 table_set_header(table, arg_legend);
 
                 r = table_print(table, NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to show table: %m");
+                        return table_log_print_error(r);
         }
 
         if (arg_legend) {
@@ -1119,9 +1119,7 @@ static int run(int argc, char *argv[]) {
 
         int r;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 5988a21037468c4e106e7fc1a977f7cabdc883a8..9646601491ed43026d4968b5361babb30d6c9564 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "alloc-util.h"
 #include "bus-common-errors.h"
+#include "bus-get-properties.h"
 #include "bus-label.h"
 #include "bus-polkit.h"
 #include "bus-util.h"
index 596bff98f1478bd65e303db5db79ba47aafc6a55..63ad977514d8eabdeb1dcaa4bcb41766506c439d 100644 (file)
@@ -236,24 +236,10 @@ static int run(int argc, char *argv[]) {
                                 }
                         }
 
-                        if (IN_SET(lets_credit, CREDIT_ENTROPY_YES_PLEASE, CREDIT_ENTROPY_YES_FORCED)) {
-                                _cleanup_free_ struct rand_pool_info *info = NULL;
-
-                                info = malloc(offsetof(struct rand_pool_info, buf) + k);
-                                if (!info)
-                                        return log_oom();
-
-                                info->entropy_count = k * 8;
-                                info->buf_size = k;
-                                memcpy(info->buf, buf, k);
-
-                                if (ioctl(random_fd, RNDADDENTROPY, info) < 0)
-                                        return log_warning_errno(errno, "Failed to credit entropy, ignoring: %m");
-                        } else {
-                                r = loop_write(random_fd, buf, (size_t) k, false);
-                                if (r < 0)
-                                        log_error_errno(r, "Failed to write seed to /dev/urandom: %m");
-                        }
+                        r = random_write_entropy(random_fd, buf, k,
+                                                 IN_SET(lets_credit, CREDIT_ENTROPY_YES_PLEASE, CREDIT_ENTROPY_YES_FORCED));
+                        if (r < 0)
+                                log_error_errno(r, "Failed to write seed to /dev/urandom: %m");
                 }
         }
 
@@ -305,7 +291,7 @@ static int run(int argc, char *argv[]) {
                  * entropy later on. Let's keep that in mind by setting an extended attribute. on the file */
                 if (getrandom_worked)
                         if (fsetxattr(seed_fd, "user.random-seed-creditable", "1", 1, 0) < 0)
-                                log_full_errno(IN_SET(errno, ENOSYS, EOPNOTSUPP) ? LOG_DEBUG : LOG_WARNING, errno,
+                                log_full_errno(ERRNO_IS_NOT_SUPPORTED(errno) ? LOG_DEBUG : LOG_WARNING, errno,
                                                "Failed to mark seed file as creditable, ignoring: %m");
         }
 
index 3cadac76395c8b587fa173e64cc5bf71d8e9783c..c01524b9cc5a3a6c3fa6efbc756402c5a8d0adb4 100644 (file)
@@ -11,7 +11,8 @@
 #include "alloc-util.h"
 #include "bus-common-errors.h"
 #include "bus-error.h"
-#include "bus-util.h"
+#include "bus-locator.h"
+#include "bus-map-properties.h"
 #include "dns-domain.h"
 #include "escape.h"
 #include "format-table.h"
@@ -1078,7 +1079,7 @@ static int show_statistics(int argc, char **argv, void *userdata) {
 
         r = table_print(table, NULL);
         if (r < 0)
-                return log_error_errno(r, "Failed to print table: %m");
+                return table_log_print_error(r);
 
         return 0;
 }
@@ -1518,7 +1519,7 @@ static int status_ifindex(sd_bus *bus, int ifindex, const char *name, StatusMode
 
         r = table_print(table, NULL);
         if (r < 0)
-                return log_error_errno(r, "Failed to print table: %m");
+                return table_log_print_error(r);
 
         if (empty_line)
                 *empty_line = true;
@@ -1759,7 +1760,7 @@ static int status_global(sd_bus *bus, StatusMode mode, bool *empty_line) {
 
         r = table_print(table, NULL);
         if (r < 0)
-                return log_error_errno(r, "Failed to print table: %m");
+                return table_log_print_error(r);
 
         *empty_line = true;
 
@@ -3174,9 +3175,7 @@ static int run(int argc, char **argv) {
         int r;
 
         setlocale(LC_ALL, "");
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         if (streq(program_invocation_short_name, "resolvconf"))
                 r = resolvconf_parse_argv(argc, argv);
index 38d2483c24f54ea3726d97296c6a6ff0abca6e5c..2ecfcf498b07ac3e6ca7c8295e99928d597e3ec3 100644 (file)
@@ -2,9 +2,9 @@
 
 #include "alloc-util.h"
 #include "bus-common-errors.h"
+#include "bus-get-properties.h"
 #include "bus-log-control-api.h"
 #include "bus-polkit.h"
-#include "bus-util.h"
 #include "dns-domain.h"
 #include "memory-util.h"
 #include "missing_capability.h"
index e69171ca709baec5e4032c366403e92d7c475b4c..6d6b095323ed23edd725ae9c3b2f199890d6ac3d 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 #pragma once
 
-#include "bus-util.h"
+#include "bus-object.h"
 #include "resolved-manager.h"
 
 extern const BusObjectImplementation manager_object;
index 7a80240b970fe48ddd31906747a6dcadbe04be39..63ede724734433921d49fe4f7cd1ccce52cce10d 100644 (file)
@@ -839,7 +839,7 @@ int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, const DnsAns
 
         rds = p->size - saved_size;
 
-        switch (rr->unparseable ? _DNS_TYPE_INVALID : rr->key->type) {
+        switch (rr->unparsable ? _DNS_TYPE_INVALID : rr->key->type) {
 
         case DNS_TYPE_SRV:
                 r = dns_packet_append_uint16(p, rr->srv.priority, NULL);
@@ -1125,7 +1125,7 @@ int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, const DnsAns
 
         case DNS_TYPE_OPT:
         case DNS_TYPE_OPENPGPKEY:
-        case _DNS_TYPE_INVALID: /* unparseable */
+        case _DNS_TYPE_INVALID: /* unparsable */
         default:
 
                 r = dns_packet_append_blob(p, rr->generic.data, rr->generic.data_size, NULL);
@@ -1815,8 +1815,8 @@ int dns_packet_read_rr(DnsPacket *p, DnsResourceRecord **ret, bool *ret_cache_fl
                         break;
                 } else {
                         dns_packet_rewind(p, pos);
-                        rr->unparseable = true;
-                        goto unparseable;
+                        rr->unparsable = true;
+                        goto unparsable;
                 }
         }
 
@@ -2059,7 +2059,7 @@ int dns_packet_read_rr(DnsPacket *p, DnsResourceRecord **ret, bool *ret_cache_fl
         case DNS_TYPE_OPT: /* we only care about the header of OPT for now. */
         case DNS_TYPE_OPENPGPKEY:
         default:
-        unparseable:
+        unparsable:
                 r = dns_packet_read_memdup(p, rdlength, &rr->generic.data, &rr->generic.data_size, NULL);
 
                 break;
index 914f464dd746096b82bf900a76bfe28f507b62f9..906158c5cedba892e6503d7c92ac0662da4e3669 100644 (file)
@@ -94,7 +94,7 @@ static int dns_query_candidate_next_search_domain(DnsQueryCandidate *c) {
 }
 
 static int dns_query_candidate_add_transaction(DnsQueryCandidate *c, DnsResourceKey *key) {
-        DnsTransaction *t;
+        _cleanup_(dns_transaction_gcp) DnsTransaction *t = NULL;
         int r;
 
         assert(c);
@@ -105,39 +105,26 @@ static int dns_query_candidate_add_transaction(DnsQueryCandidate *c, DnsResource
                 r = dns_transaction_new(&t, c->scope, key);
                 if (r < 0)
                         return r;
-        } else {
-                if (set_contains(c->transactions, t))
-                        return 0;
-        }
-
-        r = set_ensure_allocated(&c->transactions, NULL);
-        if (r < 0)
-                goto gc;
-
-        r = set_ensure_allocated(&t->notify_query_candidates, NULL);
-        if (r < 0)
-                goto gc;
+        } else if (set_contains(c->transactions, t))
+                return 0;
 
         r = set_ensure_allocated(&t->notify_query_candidates_done, NULL);
         if (r < 0)
-                goto gc;
+                return r;
 
-        r = set_put(t->notify_query_candidates, c);
+        r = set_ensure_put(&t->notify_query_candidates, NULL, c);
         if (r < 0)
-                goto gc;
+                return r;
 
-        r = set_put(c->transactions, t);
+        r = set_ensure_put(&c->transactions, NULL, t);
         if (r < 0) {
                 (void) set_remove(t->notify_query_candidates, c);
-                goto gc;
+                return r;
         }
 
         t->clamp_ttl = c->query->clamp_ttl;
+        TAKE_PTR(t);
         return 1;
-
-gc:
-        dns_transaction_gc(t);
-        return r;
 }
 
 static int dns_query_candidate_go(DnsQueryCandidate *c) {
index 6ba26a24b2c3f2cc02d6f66851831e0a7844f831..fa43dd089d4019611a5b18287a3ae21c77348991 100644 (file)
@@ -474,11 +474,11 @@ static DnsResourceRecord* dns_resource_record_free(DnsResourceRecord *rr) {
 
                 case DNS_TYPE_OPENPGPKEY:
                 default:
-                        if (!rr->unparseable)
+                        if (!rr->unparsable)
                                 free(rr->generic.data);
                 }
 
-                if (rr->unparseable)
+                if (rr->unparsable)
                         free(rr->generic.data);
 
                 free(rr->wire_format);
@@ -563,10 +563,10 @@ int dns_resource_record_payload_equal(const DnsResourceRecord *a, const DnsResou
 
         /* Check if a and b are the same, but don't look at their keys */
 
-        if (a->unparseable != b->unparseable)
+        if (a->unparsable != b->unparsable)
                 return 0;
 
-        switch (a->unparseable ? _DNS_TYPE_INVALID : a->key->type) {
+        switch (a->unparsable ? _DNS_TYPE_INVALID : a->key->type) {
 
         case DNS_TYPE_SRV:
                 r = dns_name_equal(a->srv.name, b->srv.name);
@@ -828,7 +828,7 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
 
         dns_resource_key_to_string(rr->key, k, sizeof(k));
 
-        switch (rr->unparseable ? _DNS_TYPE_INVALID : rr->key->type) {
+        switch (rr->unparsable ? _DNS_TYPE_INVALID : rr->key->type) {
 
         case DNS_TYPE_SRV:
                 r = asprintf(&s, "%s %u %u %u %s",
@@ -1175,7 +1175,7 @@ ssize_t dns_resource_record_payload(DnsResourceRecord *rr, void **out) {
         assert(rr);
         assert(out);
 
-        switch(rr->unparseable ? _DNS_TYPE_INVALID : rr->key->type) {
+        switch(rr->unparsable ? _DNS_TYPE_INVALID : rr->key->type) {
         case DNS_TYPE_SRV:
         case DNS_TYPE_PTR:
         case DNS_TYPE_NS:
@@ -1343,7 +1343,7 @@ void dns_resource_record_hash_func(const DnsResourceRecord *rr, struct siphash *
 
         dns_resource_key_hash_func(rr->key, state);
 
-        switch (rr->unparseable ? _DNS_TYPE_INVALID : rr->key->type) {
+        switch (rr->unparsable ? _DNS_TYPE_INVALID : rr->key->type) {
 
         case DNS_TYPE_SRV:
                 siphash24_compress(&rr->srv.priority, sizeof(rr->srv.priority), state);
@@ -1510,9 +1510,9 @@ DnsResourceRecord *dns_resource_record_copy(DnsResourceRecord *rr) {
         copy->expiry = rr->expiry;
         copy->n_skip_labels_signer = rr->n_skip_labels_signer;
         copy->n_skip_labels_source = rr->n_skip_labels_source;
-        copy->unparseable = rr->unparseable;
+        copy->unparsable = rr->unparsable;
 
-        switch (rr->unparseable ? _DNS_TYPE_INVALID : rr->key->type) {
+        switch (rr->unparsable ? _DNS_TYPE_INVALID : rr->key->type) {
 
         case DNS_TYPE_SRV:
                 copy->srv.priority = rr->srv.priority;
index 291447f00e7ba20f075cc4305eb7f367c7054490..6c824f7962e1e71b43650e85557f285405b14bdd 100644 (file)
@@ -102,7 +102,7 @@ struct DnsResourceRecord {
         /* How many labels to strip to determine "synthesizing source" of this RR, i.e. the wildcard's immediate parent. -1 if not signed. */
         unsigned n_skip_labels_source;
 
-        bool unparseable:1;
+        bool unparsable:1;
 
         bool wire_format_canonical:1;
         void *wire_format;
index 1a5fef13dcc207038926592c65465b87c6ad90a9..764ccee0e0ef523137135eb3f135845aac717e9c 100644 (file)
@@ -1254,11 +1254,7 @@ int dns_scope_announce(DnsScope *scope, bool goodbye) {
                 if (!scope->announced &&
                     dns_resource_key_is_dnssd_ptr(z->rr->key)) {
                         if (!set_contains(types, dns_resource_key_name(z->rr->key))) {
-                                r = set_ensure_allocated(&types, &dns_name_hash_ops);
-                                if (r < 0)
-                                        return log_debug_errno(r, "Failed to allocate set: %m");
-
-                                r = set_put(types, dns_resource_key_name(z->rr->key));
+                                r = set_ensure_put(&types, &dns_name_hash_ops, dns_resource_key_name(z->rr->key));
                                 if (r < 0)
                                         return log_debug_errno(r, "Failed to add item to set: %m");
                         }
index 1e2ff05c3e527285b21542d1876230974cc95fb5..d4c49e673ef8a65dbca4df91e3968b7870a24fec 100644 (file)
@@ -190,7 +190,7 @@ static int dns_stream_identify(DnsStream *s) {
                 s->ifindex = manager_find_ifindex(s->manager, s->local.sa.sa_family, s->local.sa.sa_family == AF_INET ? (union in_addr_union*) &s->local.in.sin_addr : (union in_addr_union*)  &s->local.in6.sin6_addr);
 
         if (s->protocol == DNS_PROTOCOL_LLMNR && s->ifindex > 0) {
-                uint32_t ifindex = htobe32(s->ifindex);
+                be32_t ifindex = htobe32(s->ifindex);
 
                 /* Make sure all packets for this connection are sent on the same interface */
                 if (s->local.sa.sa_family == AF_INET) {
index ce994a7ee0b213c0fa525d1547cc141c85e7e69a..03edbe26dc0d245ae7011288be8126c7a946c5b9 100644 (file)
@@ -278,7 +278,7 @@ static int dns_stub_stream_complete(DnsStream *s, int error) {
 }
 
 static void dns_stub_process_query(Manager *m, DnsStream *s, DnsPacket *p) {
-        DnsQuery *q = NULL;
+        _cleanup_(dns_query_freep) DnsQuery *q = NULL;
         int r;
 
         assert(m);
@@ -289,52 +289,52 @@ static void dns_stub_process_query(Manager *m, DnsStream *s, DnsPacket *p) {
             in_addr_is_localhost(p->family, &p->destination) <= 0) {
                 log_error("Got packet on unexpected IP range, refusing.");
                 dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL, false);
-                goto fail;
+                return;
         }
 
         r = dns_packet_extract(p);
         if (r < 0) {
                 log_debug_errno(r, "Failed to extract resources from incoming packet, ignoring packet: %m");
                 dns_stub_send_failure(m, s, p, DNS_RCODE_FORMERR, false);
-                goto fail;
+                return;
         }
 
         if (!DNS_PACKET_VERSION_SUPPORTED(p)) {
                 log_debug("Got EDNS OPT field with unsupported version number.");
                 dns_stub_send_failure(m, s, p, DNS_RCODE_BADVERS, false);
-                goto fail;
+                return;
         }
 
         if (dns_type_is_obsolete(p->question->keys[0]->type)) {
                 log_debug("Got message with obsolete key type, refusing.");
                 dns_stub_send_failure(m, s, p, DNS_RCODE_NOTIMP, false);
-                goto fail;
+                return;
         }
 
         if (dns_type_is_zone_transer(p->question->keys[0]->type)) {
                 log_debug("Got request for zone transfer, refusing.");
                 dns_stub_send_failure(m, s, p, DNS_RCODE_NOTIMP, false);
-                goto fail;
+                return;
         }
 
         if (!DNS_PACKET_RD(p))  {
                 /* If the "rd" bit is off (i.e. recursion was not requested), then refuse operation */
                 log_debug("Got request with recursion disabled, refusing.");
                 dns_stub_send_failure(m, s, p, DNS_RCODE_REFUSED, false);
-                goto fail;
+                return;
         }
 
         if (DNS_PACKET_DO(p) && DNS_PACKET_CD(p)) {
                 log_debug("Got request with DNSSEC CD bit set, refusing.");
                 dns_stub_send_failure(m, s, p, DNS_RCODE_NOTIMP, false);
-                goto fail;
+                return;
         }
 
         r = dns_query_new(m, &q, p->question, p->question, 0, SD_RESOLVED_PROTOCOLS_ALL|SD_RESOLVED_NO_SEARCH);
         if (r < 0) {
                 log_error_errno(r, "Failed to generate query object: %m");
                 dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL, false);
-                goto fail;
+                return;
         }
 
         /* Request that the TTL is corrected by the cached time for this lookup, so that we return vaguely useful TTLs */
@@ -348,30 +348,23 @@ static void dns_stub_process_query(Manager *m, DnsStream *s, DnsPacket *p) {
                 /* Remember which queries belong to this stream, so that we can cancel them when the stream
                  * is disconnected early */
 
-                r = set_ensure_allocated(&s->queries, &trivial_hash_ops);
+                r = set_ensure_put(&s->queries, NULL, q);
                 if (r < 0) {
                         log_oom();
-                        goto fail;
-                }
-
-                if (set_put(s->queries, q) < 0) {
-                        log_oom();
-                        goto fail;
+                        return;
                 }
+                assert(r > 0);
         }
 
         r = dns_query_go(q);
         if (r < 0) {
                 log_error_errno(r, "Failed to start query: %m");
                 dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL, false);
-                goto fail;
+                return;
         }
 
         log_debug("Processing query...");
-        return;
-
-fail:
-        dns_query_free(q);
+        TAKE_PTR(q);
 }
 
 static int on_dns_stub_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
index 5898308d5fa46f6060d0c83c4743028ce49dee86..cd5a0e3dd91b769c5a51d77360ff80ac03de2d03 100644 (file)
@@ -1501,11 +1501,7 @@ static int dns_transaction_make_packet_mdns(DnsTransaction *t) {
                 add_known_answers = true;
 
         if (t->key->type == DNS_TYPE_ANY) {
-                r = set_ensure_allocated(&keys, &dns_resource_key_hash_ops);
-                if (r < 0)
-                        return r;
-
-                r = set_put(keys, t->key);
+                r = set_ensure_put(&keys, &dns_resource_key_hash_ops, t->key);
                 if (r < 0)
                         return r;
         }
@@ -1571,11 +1567,7 @@ static int dns_transaction_make_packet_mdns(DnsTransaction *t) {
                         add_known_answers = true;
 
                 if (other->key->type == DNS_TYPE_ANY) {
-                        r = set_ensure_allocated(&keys, &dns_resource_key_hash_ops);
-                        if (r < 0)
-                                return r;
-
-                        r = set_put(keys, other->key);
+                        r = set_ensure_put(&keys, &dns_resource_key_hash_ops, other->key);
                         if (r < 0)
                                 return r;
                 }
@@ -1800,7 +1792,7 @@ static int dns_transaction_find_cyclic(DnsTransaction *t, DnsTransaction *aux) {
 }
 
 static int dns_transaction_add_dnssec_transaction(DnsTransaction *t, DnsResourceKey *key, DnsTransaction **ret) {
-        DnsTransaction *aux;
+        _cleanup_(dns_transaction_gcp) DnsTransaction *aux = NULL;
         int r;
 
         assert(t);
@@ -1833,34 +1825,22 @@ static int dns_transaction_add_dnssec_transaction(DnsTransaction *t, DnsResource
                 }
         }
 
-        r = set_ensure_allocated(&t->dnssec_transactions, NULL);
-        if (r < 0)
-                goto gc;
-
-        r = set_ensure_allocated(&aux->notify_transactions, NULL);
-        if (r < 0)
-                goto gc;
-
         r = set_ensure_allocated(&aux->notify_transactions_done, NULL);
         if (r < 0)
-                goto gc;
+                return r;
 
-        r = set_put(t->dnssec_transactions, aux);
+        r = set_ensure_put(&t->dnssec_transactions, NULL, aux);
         if (r < 0)
-                goto gc;
+                return r;;
 
-        r = set_put(aux->notify_transactions, t);
+        r = set_ensure_put(&aux->notify_transactions, NULL, t);
         if (r < 0) {
                 (void) set_remove(t->dnssec_transactions, aux);
-                goto gc;
+                return r;
         }
 
-        *ret = aux;
+        *ret = TAKE_PTR(aux);
         return 1;
-
-gc:
-        dns_transaction_gc(aux);
-        return r;
 }
 
 static int dns_transaction_request_dnssec_rr(DnsTransaction *t, DnsResourceKey *key) {
index b1d4348409fc41aab1fa41e4b756acbf195078fb..167541806a28eaa5f0deac78cc7664bf271ba1e8 100644 (file)
@@ -138,6 +138,8 @@ int dns_transaction_new(DnsTransaction **ret, DnsScope *s, DnsResourceKey *key);
 DnsTransaction* dns_transaction_free(DnsTransaction *t);
 
 bool dns_transaction_gc(DnsTransaction *t);
+DEFINE_TRIVIAL_CLEANUP_FUNC(DnsTransaction*, dns_transaction_gc);
+
 int dns_transaction_go(DnsTransaction *t);
 
 void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p);
index 843f4c0f45fb6b6d6f8f5aa44137dbbe1c1eb4e3..d68d0c3ba16cb47609ae5be7cfe92249ca2ad40e 100644 (file)
@@ -393,15 +393,9 @@ static int dns_trust_anchor_load_negative(DnsTrustAnchor *d, const char *path, u
                 return -EINVAL;
         }
 
-        r = set_ensure_allocated(&d->negative_by_name, &dns_name_hash_ops);
-        if (r < 0)
-                return log_oom();
-
-        r = set_put(d->negative_by_name, domain);
+        r = set_ensure_consume(&d->negative_by_name, &dns_name_hash_ops, TAKE_PTR(domain));
         if (r < 0)
                 return log_oom();
-        if (r > 0)
-                domain = NULL;
 
         return 0;
 }
@@ -592,11 +586,7 @@ static int dns_trust_anchor_revoked_put(DnsTrustAnchor *d, DnsResourceRecord *rr
 
         assert(d);
 
-        r = set_ensure_allocated(&d->revoked_by_rr, &dns_resource_record_hash_ops);
-        if (r < 0)
-                return r;
-
-        r = set_put(d->revoked_by_rr, rr);
+        r = set_ensure_put(&d->revoked_by_rr, &dns_resource_record_hash_ops, rr);
         if (r < 0)
                 return r;
         if (r > 0)
index 0ef4c892f7066f9d9d64771935074866dc20299a..33879d6142ef2dbea9c7aeb5e00f70d0eb1a5f93 100644 (file)
@@ -162,7 +162,7 @@ static int dns_zone_link_item(DnsZone *z, DnsZoneItem *i) {
 }
 
 static int dns_zone_item_probe_start(DnsZoneItem *i)  {
-        DnsTransaction *t;
+        _cleanup_(dns_transaction_gcp) DnsTransaction *t = NULL;
         int r;
 
         assert(i);
@@ -183,25 +183,20 @@ static int dns_zone_item_probe_start(DnsZoneItem *i)  {
                         return r;
         }
 
-        r = set_ensure_allocated(&t->notify_zone_items, NULL);
-        if (r < 0)
-                goto gc;
-
         r = set_ensure_allocated(&t->notify_zone_items_done, NULL);
         if (r < 0)
-                goto gc;
+                return r;
 
-        r = set_put(t->notify_zone_items, i);
+        r = set_ensure_put(&t->notify_zone_items, NULL, i);
         if (r < 0)
-                goto gc;
+                return r;
 
-        i->probe_transaction = t;
         t->probing = true;
+        i->probe_transaction = TAKE_PTR(t);
 
-        if (t->state == DNS_TRANSACTION_NULL) {
-
+        if (i->probe_transaction->state == DNS_TRANSACTION_NULL) {
                 i->block_ready++;
-                r = dns_transaction_go(t);
+                r = dns_transaction_go(i->probe_transaction);
                 i->block_ready--;
 
                 if (r < 0) {
@@ -212,10 +207,6 @@ static int dns_zone_item_probe_start(DnsZoneItem *i)  {
 
         dns_zone_item_notify(i);
         return 0;
-
-gc:
-        dns_transaction_gc(t);
-        return r;
 }
 
 int dns_zone_put(DnsZone *z, DnsScope *s, DnsResourceRecord *rr, bool probe) {
index 8cd75642a7bda91163f953268a41130319758011..403455e89f4439d81cbe999eea2215ee7c9c9ecd 100644 (file)
@@ -2,7 +2,7 @@
 
 #include "sd-bus.h"
 
-#include "bus-util.h"
+#include "bus-object.h"
 
 extern const BusObjectImplementation dnssd_object;
 
index 2cb06c098da929f1b3ad4c63395226d22fd39fee..6a7f7499572cfc9592e64ab7233468960e9654ee 100644 (file)
@@ -120,15 +120,10 @@ static int parse_line(EtcHosts *hosts, unsigned nr, const char *line) {
                         /* Optimize the case where we don't need to store any addresses, by storing
                          * only the name in a dedicated Set instead of the hashmap */
 
-                        r = set_ensure_allocated(&hosts->no_address, &dns_name_hash_ops);
-                        if (r < 0)
-                                return log_oom();
-
-                        r = set_put(hosts->no_address, name);
+                        r = set_ensure_consume(&hosts->no_address, &dns_name_hash_ops, TAKE_PTR(name));
                         if (r < 0)
                                 return r;
 
-                        TAKE_PTR(name);
                         continue;
                 }
 
index a2ca5cb8f608dd881a0db5f5ece40e7f3b1fab18..0fa62208c30a2e2c71f556e6244ff337ece21b2e 100644 (file)
@@ -6,8 +6,8 @@
 
 #include "alloc-util.h"
 #include "bus-common-errors.h"
+#include "bus-get-properties.h"
 #include "bus-polkit.h"
-#include "bus-util.h"
 #include "parse-util.h"
 #include "resolve-util.h"
 #include "resolved-bus.h"
index 50989a6b0a33ff63f76ea36e0b0925606a010187..16477f28d69e73d30638689a81a76f254ab6c639 100644 (file)
@@ -22,8 +22,8 @@
 #include "user-util.h"
 
 static int run(int argc, char *argv[]) {
-        _cleanup_(notify_on_cleanup) const char *notify_stop = NULL;
         _cleanup_(manager_freep) Manager *m = NULL;
+        _cleanup_(notify_on_cleanup) const char *notify_stop = NULL;
         int r;
 
         log_setup_service();
@@ -40,7 +40,7 @@ static int run(int argc, char *argv[]) {
 
         r = mac_selinux_init();
         if (r < 0)
-                return log_error_errno(r, "SELinux setup failed: %m");
+                return r;
 
         /* Drop privileges, but only if we have been started as root. If we are not running as root we assume most
          * privileges are already dropped and we can't create our directory. */
index ca3590066c83e7260de5849a27d67440e7452207..721bf8732ef620461eb94a9525752af2df2027c2 100644 (file)
@@ -65,7 +65,7 @@ static void test_parse_etc_hosts(void) {
               "1::2::3 multi.colon\n"
 
               "::0 some.where some.other\n"
-              "0.0.0.0 black.listed\n"
+              "0.0.0.0 deny.listed\n"
               "::5\t\t\t \tsome.where\tsome.other foobar.foo.foo\t\t\t\n"
               "        \n", f);
         assert_se(fflush_and_check(f) >= 0);
@@ -123,7 +123,7 @@ static void test_parse_etc_hosts(void) {
 
         assert_se( set_contains(hosts.no_address, "some.where"));
         assert_se( set_contains(hosts.no_address, "some.other"));
-        assert_se( set_contains(hosts.no_address, "black.listed"));
+        assert_se( set_contains(hosts.no_address, "deny.listed"));
         assert_se(!set_contains(hosts.no_address, "foobar.foo.foo"));
 }
 
index 70a27924b5a89b3ed458bdbd15be380556ca2479..6b996015e38939140e190fa0ad2833b137ad4fef 100644 (file)
@@ -11,8 +11,9 @@
 
 #include "alloc-util.h"
 #include "bus-error.h"
+#include "bus-locator.h"
+#include "bus-map-properties.h"
 #include "bus-unit-util.h"
-#include "bus-util.h"
 #include "bus-wait-for-jobs.h"
 #include "calendarspec.h"
 #include "env-util.h"
diff --git a/src/shared/bus-get-properties.c b/src/shared/bus-get-properties.c
new file mode 100644 (file)
index 0000000..8ad4694
--- /dev/null
@@ -0,0 +1,149 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#include "bus-get-properties.h"
+#include "rlimit-util.h"
+#include "string-util.h"
+
+int bus_property_get_bool(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        int b = *(bool*) userdata;
+
+        return sd_bus_message_append_basic(reply, 'b', &b);
+}
+
+int bus_property_set_bool(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *value,
+                void *userdata,
+                sd_bus_error *error) {
+
+        int b, r;
+
+        r = sd_bus_message_read(value, "b", &b);
+        if (r < 0)
+                return r;
+
+        *(bool*) userdata = b;
+        return 0;
+}
+
+int bus_property_get_id128(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        sd_id128_t *id = userdata;
+
+        if (sd_id128_is_null(*id)) /* Add an empty array if the ID is zero */
+                return sd_bus_message_append(reply, "ay", 0);
+        else
+                return sd_bus_message_append_array(reply, 'y', id->bytes, 16);
+}
+
+#if __SIZEOF_SIZE_T__ != 8
+int bus_property_get_size(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        uint64_t sz = *(size_t*) userdata;
+
+        return sd_bus_message_append_basic(reply, 't', &sz);
+}
+#endif
+
+#if __SIZEOF_LONG__ != 8
+int bus_property_get_long(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        int64_t l = *(long*) userdata;
+
+        return sd_bus_message_append_basic(reply, 'x', &l);
+}
+
+int bus_property_get_ulong(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        uint64_t ul = *(unsigned long*) userdata;
+
+        return sd_bus_message_append_basic(reply, 't', &ul);
+}
+#endif
+
+int bus_property_get_rlimit(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        const char *is_soft;
+        struct rlimit *rl;
+        uint64_t u;
+        rlim_t x;
+
+        assert(bus);
+        assert(reply);
+        assert(userdata);
+
+        is_soft = endswith(property, "Soft");
+
+        rl = *(struct rlimit**) userdata;
+        if (rl)
+                x = is_soft ? rl->rlim_cur : rl->rlim_max;
+        else {
+                struct rlimit buf = {};
+                const char *s, *p;
+                int z;
+
+                /* Chop off "Soft" suffix */
+                s = is_soft ? strndupa(property, is_soft - property) : property;
+
+                /* Skip over any prefix, such as "Default" */
+                assert_se(p = strstr(s, "Limit"));
+
+                z = rlimit_from_string(p + 5);
+                assert(z >= 0);
+
+                (void) getrlimit(z, &buf);
+                x = is_soft ? buf.rlim_cur : buf.rlim_max;
+        }
+
+        /* rlim_t might have different sizes, let's map RLIMIT_INFINITY to (uint64_t) -1, so that it is the same on all
+         * archs */
+        u = x == RLIM_INFINITY ? (uint64_t) -1 : (uint64_t) x;
+
+        return sd_bus_message_append(reply, "t", u);
+}
diff --git a/src/shared/bus-get-properties.h b/src/shared/bus-get-properties.h
new file mode 100644 (file)
index 0000000..d853b79
--- /dev/null
@@ -0,0 +1,103 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include "sd-bus.h"
+
+#include "sd-bus.h"
+
+#include "macro.h"
+
+int bus_property_get_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
+int bus_property_set_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *value, void *userdata, sd_bus_error *error);
+int bus_property_get_id128(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
+
+#define bus_property_get_usec ((sd_bus_property_get_t) NULL)
+#define bus_property_set_usec ((sd_bus_property_set_t) NULL)
+
+assert_cc(sizeof(int) == sizeof(int32_t));
+#define bus_property_get_int ((sd_bus_property_get_t) NULL)
+
+assert_cc(sizeof(unsigned) == sizeof(uint32_t));
+#define bus_property_get_unsigned ((sd_bus_property_get_t) NULL)
+
+/* On 64bit machines we can use the default serializer for size_t and
+ * friends, otherwise we need to cast this manually */
+#if __SIZEOF_SIZE_T__ == 8
+#define bus_property_get_size ((sd_bus_property_get_t) NULL)
+#else
+int bus_property_get_size(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
+#endif
+
+#if __SIZEOF_LONG__ == 8
+#define bus_property_get_long ((sd_bus_property_get_t) NULL)
+#define bus_property_get_ulong ((sd_bus_property_get_t) NULL)
+#else
+int bus_property_get_long(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
+int bus_property_get_ulong(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
+#endif
+
+/* uid_t and friends on Linux 32 bit. This means we can just use the
+ * default serializer for 32bit unsigned, for serializing it, and map
+ * it to NULL here */
+assert_cc(sizeof(uid_t) == sizeof(uint32_t));
+#define bus_property_get_uid ((sd_bus_property_get_t) NULL)
+
+assert_cc(sizeof(gid_t) == sizeof(uint32_t));
+#define bus_property_get_gid ((sd_bus_property_get_t) NULL)
+
+assert_cc(sizeof(pid_t) == sizeof(uint32_t));
+#define bus_property_get_pid ((sd_bus_property_get_t) NULL)
+
+assert_cc(sizeof(mode_t) == sizeof(uint32_t));
+#define bus_property_get_mode ((sd_bus_property_get_t) NULL)
+
+int bus_property_get_rlimit(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
+
+#define BUS_DEFINE_PROPERTY_GET_GLOBAL(function, bus_type, val)         \
+        int function(sd_bus *bus,                                       \
+                     const char *path,                                  \
+                     const char *interface,                             \
+                     const char *property,                              \
+                     sd_bus_message *reply,                             \
+                     void *userdata,                                    \
+                     sd_bus_error *error) {                             \
+                                                                        \
+                assert(bus);                                            \
+                assert(reply);                                          \
+                                                                        \
+                return sd_bus_message_append(reply, bus_type, val);     \
+        }
+
+#define BUS_DEFINE_PROPERTY_GET2(function, bus_type, data_type, get1, get2) \
+        int function(sd_bus *bus,                                       \
+                     const char *path,                                  \
+                     const char *interface,                             \
+                     const char *property,                              \
+                     sd_bus_message *reply,                             \
+                     void *userdata,                                    \
+                     sd_bus_error *error) {                             \
+                                                                        \
+                data_type *data = userdata;                             \
+                                                                        \
+                assert(bus);                                            \
+                assert(reply);                                          \
+                assert(data);                                           \
+                                                                        \
+                return sd_bus_message_append(reply, bus_type,           \
+                                             get2(get1(data)));         \
+        }
+
+#define ident(x) (x)
+#define BUS_DEFINE_PROPERTY_GET(function, bus_type, data_type, get1) \
+        BUS_DEFINE_PROPERTY_GET2(function, bus_type, data_type, get1, ident)
+
+#define ref(x) (*(x))
+#define BUS_DEFINE_PROPERTY_GET_REF(function, bus_type, data_type, get) \
+        BUS_DEFINE_PROPERTY_GET2(function, bus_type, data_type, ref, get)
+
+#define BUS_DEFINE_PROPERTY_GET_ENUM(function, name, type)              \
+        BUS_DEFINE_PROPERTY_GET_REF(function, "s", type, name##_to_string)
+
+#define BUS_PROPERTY_DUAL_TIMESTAMP(name, offset, flags) \
+        SD_BUS_PROPERTY(name, "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, realtime), (flags)), \
+        SD_BUS_PROPERTY(name "Monotonic", "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, monotonic), (flags))
index a79699d62d2ecd907b52150cb8a7eb7316044582..2a5aa7467717039b246ea684eb877db01b6bfffc 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
 #include "bus-locator.h"
+#include "macro.h"
 
 const BusLocator* const bus_home_mgr = &(BusLocator){
         .destination = "org.freedesktop.home1",
@@ -61,3 +62,152 @@ const BusLocator* const bus_timedate = &(BusLocator){
         .path = "/org/freedesktop/timedate1",
         .interface = "org.freedesktop.timedate1"
 };
+
+/* Shorthand flavors of the sd-bus convenience helpers with destination,path,interface strings encapsulated
+ * within a single struct. */
+int bus_call_method_async(
+                sd_bus *bus,
+                sd_bus_slot **slot,
+                const BusLocator *locator,
+                const char *member,
+                sd_bus_message_handler_t callback,
+                void *userdata,
+                const char *types, ...) {
+
+        va_list ap;
+        int r;
+
+        assert(locator);
+
+        va_start(ap, types);
+        r = sd_bus_call_method_asyncv(bus, slot, locator->destination, locator->path, locator->interface, member, callback, userdata, types, ap);
+        va_end(ap);
+
+        return r;
+}
+
+int bus_call_method(
+                sd_bus *bus,
+                const BusLocator *locator,
+                const char *member,
+                sd_bus_error *error,
+                sd_bus_message **reply,
+                const char *types, ...) {
+
+        va_list ap;
+        int r;
+
+        assert(locator);
+
+        va_start(ap, types);
+        r = sd_bus_call_methodv(bus, locator->destination, locator->path, locator->interface, member, error, reply, types, ap);
+        va_end(ap);
+
+        return r;
+}
+
+int bus_get_property(
+                sd_bus *bus,
+                const BusLocator *locator,
+                const char *member,
+                sd_bus_error *error,
+                sd_bus_message **reply,
+                const char *type) {
+
+        assert(locator);
+
+        return sd_bus_get_property(bus, locator->destination, locator->path, locator->interface, member, error, reply, type);
+}
+
+int bus_get_property_trivial(
+                sd_bus *bus,
+                const BusLocator *locator,
+                const char *member,
+                sd_bus_error *error,
+                char type, void *ptr) {
+
+        assert(locator);
+
+        return sd_bus_get_property_trivial(bus, locator->destination, locator->path, locator->interface, member, error, type, ptr);
+}
+
+int bus_get_property_string(
+                sd_bus *bus,
+                const BusLocator *locator,
+                const char *member,
+                sd_bus_error *error,
+                char **ret) {
+
+        assert(locator);
+
+        return sd_bus_get_property_string(bus, locator->destination, locator->path, locator->interface, member, error, ret);
+}
+
+int bus_get_property_strv(
+                sd_bus *bus,
+                const BusLocator *locator,
+                const char *member,
+                sd_bus_error *error,
+                char ***ret) {
+
+        assert(locator);
+
+        return sd_bus_get_property_strv(bus, locator->destination, locator->path, locator->interface, member, error, ret);
+}
+
+int bus_set_property(
+                sd_bus *bus,
+                const BusLocator *locator,
+                const char *member,
+                sd_bus_error *error,
+                const char *type, ...) {
+
+        va_list ap;
+        int r;
+
+        assert(locator);
+
+        va_start(ap, type);
+        r = sd_bus_set_propertyv(bus, locator->destination, locator->path, locator->interface, member, error, type, ap);
+        va_end(ap);
+
+        return r;
+}
+
+int bus_match_signal(
+                sd_bus *bus,
+                sd_bus_slot **ret,
+                const BusLocator *locator,
+                const char *member,
+                sd_bus_message_handler_t callback,
+                void *userdata) {
+
+        assert(locator);
+
+        return sd_bus_match_signal(bus, ret, locator->destination, locator->path, locator->interface, member, callback, userdata);
+}
+
+int bus_match_signal_async(
+                sd_bus *bus,
+                sd_bus_slot **ret,
+                const BusLocator *locator,
+                const char *member,
+                sd_bus_message_handler_t callback,
+                sd_bus_message_handler_t install_callback,
+                void *userdata) {
+
+        assert(locator);
+
+        return sd_bus_match_signal_async(bus, ret, locator->destination, locator->path, locator->interface, member, callback, install_callback, userdata);
+}
+
+int bus_message_new_method_call(
+                sd_bus *bus,
+                sd_bus_message **m,
+                const BusLocator *locator,
+                const char *member) {
+
+        assert(locator);
+
+        return sd_bus_message_new_method_call(bus, m, locator->destination, locator->path, locator->interface, member);
+}
index 91a9aaf63a366cfd5404917f70d591fc7f4f17aa..2b892360b8c73960012287c593200111dc1109dd 100644 (file)
@@ -1,10 +1,12 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 #pragma once
 
+#include "sd-bus.h"
+
 typedef struct BusLocator {
-        const char    *destination;
-        const char    *path;
-        const char    *interface;
+        const char *destination;
+        const char *path;
+        const char *interface;
 } BusLocator;
 
 extern const BusLocator* const bus_home_mgr;
@@ -17,3 +19,16 @@ extern const BusLocator* const bus_portable_mgr;
 extern const BusLocator* const bus_resolve_mgr;
 extern const BusLocator* const bus_systemd_mgr;
 extern const BusLocator* const bus_timedate;
+
+/* Shorthand flavors of the sd-bus convenience helpers with destination,path,interface strings encapsulated
+ * within a single struct. */
+int bus_call_method_async(sd_bus *bus, sd_bus_slot **slot, const BusLocator *locator, const char *member, sd_bus_message_handler_t callback, void *userdata, const char *types, ...);
+int bus_call_method(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, sd_bus_message **reply, const char *types, ...);
+int bus_get_property(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, sd_bus_message **reply, const char *type);
+int bus_get_property_trivial(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, char type, void *ptr);
+int bus_get_property_string(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, char **ret);
+int bus_get_property_strv(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, char ***ret);
+int bus_set_property(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, const char *type, ...);
+int bus_match_signal(sd_bus *bus, sd_bus_slot **ret, const BusLocator *locator, const char *member, sd_bus_message_handler_t callback, void *userdata);
+int bus_match_signal_async(sd_bus *bus, sd_bus_slot **ret, const BusLocator *locator, const char *member, sd_bus_message_handler_t callback, sd_bus_message_handler_t install_callback, void *userdata);
+int bus_message_new_method_call(sd_bus *bus, sd_bus_message **m, const BusLocator *locator, const char *member);
index a1d0d1729151d8a9ef72330dc8d049014f0c93c4..7c487ada9fadb1d5f7513f87de9a379e54444d74 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
 #include "alloc-util.h"
+#include "bus-get-properties.h"
 #include "bus-log-control-api.h"
 #include "bus-util.h"
 #include "log.h"
index b1d00b38bcfcdd1d08e7b1cde7cd83200bca2f67..64eaa540f478f3e2ba84a8b6fb24f1a9705d76a8 100644 (file)
@@ -1,8 +1,9 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
 
 #include "sd-bus.h"
 
-#include "bus-util.h"
+#include "bus-object.h"
 
 extern const BusObjectImplementation log_control_object;
 static inline int bus_log_control_api_register(sd_bus *bus) {
diff --git a/src/shared/bus-map-properties.c b/src/shared/bus-map-properties.c
new file mode 100644 (file)
index 0000000..ab393c3
--- /dev/null
@@ -0,0 +1,229 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#include "bus-map-properties.h"
+#include "alloc-util.h"
+#include "strv.h"
+#include "bus-message.h"
+
+int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
+        sd_id128_t *p = userdata;
+        const void *v;
+        size_t n;
+        int r;
+
+        r = sd_bus_message_read_array(m, SD_BUS_TYPE_BYTE, &v, &n);
+        if (r < 0)
+                return r;
+
+        if (n == 0)
+                *p = SD_ID128_NULL;
+        else if (n == 16)
+                memcpy((*p).bytes, v, n);
+        else
+                return -EINVAL;
+
+        return 0;
+}
+
+static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, unsigned flags, sd_bus_error *error, void *userdata) {
+        char type;
+        int r;
+
+        r = sd_bus_message_peek_type(m, &type, NULL);
+        if (r < 0)
+                return r;
+
+        switch (type) {
+
+        case SD_BUS_TYPE_STRING:
+        case SD_BUS_TYPE_OBJECT_PATH: {
+                const char **p = userdata;
+                const char *s;
+
+                r = sd_bus_message_read_basic(m, type, &s);
+                if (r < 0)
+                        return r;
+
+                if (isempty(s))
+                        s = NULL;
+
+                if (flags & BUS_MAP_STRDUP)
+                        return free_and_strdup((char **) userdata, s);
+
+                *p = s;
+                return 0;
+        }
+
+        case SD_BUS_TYPE_ARRAY: {
+                _cleanup_strv_free_ char **l = NULL;
+                char ***p = userdata;
+
+                r = bus_message_read_strv_extend(m, &l);
+                if (r < 0)
+                        return r;
+
+                return strv_extend_strv(p, l, false);
+        }
+
+        case SD_BUS_TYPE_BOOLEAN: {
+                int b;
+
+                r = sd_bus_message_read_basic(m, type, &b);
+                if (r < 0)
+                        return r;
+
+                if (flags & BUS_MAP_BOOLEAN_AS_BOOL)
+                        *(bool*) userdata = b;
+                else
+                        *(int*) userdata = b;
+
+                return 0;
+        }
+
+        case SD_BUS_TYPE_INT32:
+        case SD_BUS_TYPE_UINT32: {
+                uint32_t u, *p = userdata;
+
+                r = sd_bus_message_read_basic(m, type, &u);
+                if (r < 0)
+                        return r;
+
+                *p = u;
+                return 0;
+        }
+
+        case SD_BUS_TYPE_INT64:
+        case SD_BUS_TYPE_UINT64: {
+                uint64_t t, *p = userdata;
+
+                r = sd_bus_message_read_basic(m, type, &t);
+                if (r < 0)
+                        return r;
+
+                *p = t;
+                return 0;
+        }
+
+        case SD_BUS_TYPE_DOUBLE: {
+                double d, *p = userdata;
+
+                r = sd_bus_message_read_basic(m, type, &d);
+                if (r < 0)
+                        return r;
+
+                *p = d;
+                return 0;
+        }}
+
+        return -EOPNOTSUPP;
+}
+
+int bus_message_map_all_properties(
+                sd_bus_message *m,
+                const struct bus_properties_map *map,
+                unsigned flags,
+                sd_bus_error *error,
+                void *userdata) {
+
+        int r;
+
+        assert(m);
+        assert(map);
+
+        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "{sv}");
+        if (r < 0)
+                return r;
+
+        while ((r = sd_bus_message_enter_container(m, SD_BUS_TYPE_DICT_ENTRY, "sv")) > 0) {
+                const struct bus_properties_map *prop;
+                const char *member;
+                const char *contents;
+                void *v;
+                unsigned i;
+
+                r = sd_bus_message_read_basic(m, SD_BUS_TYPE_STRING, &member);
+                if (r < 0)
+                        return r;
+
+                for (i = 0, prop = NULL; map[i].member; i++)
+                        if (streq(map[i].member, member)) {
+                                prop = &map[i];
+                                break;
+                        }
+
+                if (prop) {
+                        r = sd_bus_message_peek_type(m, NULL, &contents);
+                        if (r < 0)
+                                return r;
+
+                        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_VARIANT, contents);
+                        if (r < 0)
+                                return r;
+
+                        v = (uint8_t *)userdata + prop->offset;
+                        if (map[i].set)
+                                r = prop->set(sd_bus_message_get_bus(m), member, m, error, v);
+                        else
+                                r = map_basic(sd_bus_message_get_bus(m), member, m, flags, error, v);
+                        if (r < 0)
+                                return r;
+
+                        r = sd_bus_message_exit_container(m);
+                        if (r < 0)
+                                return r;
+                } else {
+                        r = sd_bus_message_skip(m, "v");
+                        if (r < 0)
+                                return r;
+                }
+
+                r = sd_bus_message_exit_container(m);
+                if (r < 0)
+                        return r;
+        }
+        if (r < 0)
+                return r;
+
+        return sd_bus_message_exit_container(m);
+}
+
+int bus_map_all_properties(
+                sd_bus *bus,
+                const char *destination,
+                const char *path,
+                const struct bus_properties_map *map,
+                unsigned flags,
+                sd_bus_error *error,
+                sd_bus_message **reply,
+                void *userdata) {
+
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+        int r;
+
+        assert(bus);
+        assert(destination);
+        assert(path);
+        assert(map);
+        assert(reply || (flags & BUS_MAP_STRDUP));
+
+        r = sd_bus_call_method(
+                        bus,
+                        destination,
+                        path,
+                        "org.freedesktop.DBus.Properties",
+                        "GetAll",
+                        error,
+                        &m,
+                        "s", "");
+        if (r < 0)
+                return r;
+
+        r = bus_message_map_all_properties(m, map, flags, error, userdata);
+        if (r < 0)
+                return r;
+
+        if (reply)
+                *reply = sd_bus_message_ref(m);
+
+        return r;
+}
diff --git a/src/shared/bus-map-properties.h b/src/shared/bus-map-properties.h
new file mode 100644 (file)
index 0000000..11b8992
--- /dev/null
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include "sd-bus.h"
+
+typedef int (*bus_property_set_t) (sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
+
+struct bus_properties_map {
+        const char *member;
+        const char *signature;
+        bus_property_set_t set;
+        size_t offset;
+};
+
+enum {
+        BUS_MAP_STRDUP          = 1 << 0, /* If set, each "s" message is duplicated. Thus, each pointer needs to be freed. */
+        BUS_MAP_BOOLEAN_AS_BOOL = 1 << 1, /* If set, each "b" message is written to a bool pointer. If not set, "b" is written to a int pointer. */
+};
+
+int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
+
+int bus_message_map_all_properties(sd_bus_message *m, const struct bus_properties_map *map, unsigned flags, sd_bus_error *error, void *userdata);
+int bus_map_all_properties(sd_bus *bus, const char *destination, const char *path, const struct bus_properties_map *map,
+                           unsigned flags, sd_bus_error *error, sd_bus_message **reply, void *userdata);
diff --git a/src/shared/bus-object.c b/src/shared/bus-object.c
new file mode 100644 (file)
index 0000000..217d43d
--- /dev/null
@@ -0,0 +1,177 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#include "bus-introspect.h"
+#include "bus-object.h"
+#include "macro.h"
+#include "string-util.h"
+#include "strv.h"
+
+int bus_add_implementation(sd_bus *bus, const BusObjectImplementation *impl, void *userdata) {
+        int r;
+
+        log_debug("Registering bus object implementation for path=%s iface=%s", impl->path, impl->interface);
+
+        for (const sd_bus_vtable **p = impl->vtables; p && *p; p++) {
+                r = sd_bus_add_object_vtable(bus, NULL,
+                                             impl->path,
+                                             impl->interface,
+                                             *p,
+                                             userdata);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to register bus path %s with interface %s: %m",
+                                               impl->path,
+                                               impl->interface);
+        }
+
+        for (const BusObjectVtablePair *p = impl->fallback_vtables; p && p->vtable; p++) {
+                r = sd_bus_add_fallback_vtable(bus, NULL,
+                                               impl->path,
+                                               impl->interface,
+                                               p->vtable,
+                                               p->object_find,
+                                               userdata);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to register bus path %s with interface %s: %m",
+                                               impl->path,
+                                               impl->interface);
+        }
+
+        if (impl->node_enumerator) {
+                r = sd_bus_add_node_enumerator(bus, NULL,
+                                               impl->path,
+                                               impl->node_enumerator,
+                                               userdata);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to add node enumerator for %s: %m",
+                                               impl->path);
+        }
+
+        if (impl->manager) {
+                r = sd_bus_add_object_manager(bus, NULL, impl->path);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to add object manager for %s: %m", impl->path);
+        }
+
+        for (size_t i = 0; impl->children && impl->children[i]; i++) {
+                r = bus_add_implementation(bus, impl->children[i], userdata);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
+
+static const BusObjectImplementation* find_implementation(
+                const char *pattern,
+                const BusObjectImplementation* const* bus_objects) {
+
+        for (size_t i = 0; bus_objects && bus_objects[i]; i++) {
+                const BusObjectImplementation *impl = bus_objects[i];
+
+                if (STR_IN_SET(pattern, impl->path, impl->interface))
+                        return impl;
+
+                impl = find_implementation(pattern, impl->children);
+                if (impl)
+                        return impl;
+        }
+
+        return NULL;
+}
+
+static int bus_introspect_implementation(
+                struct introspect *intro,
+                const BusObjectImplementation *impl) {
+        int r;
+
+        for (const sd_bus_vtable **p = impl->vtables; p && *p; p++) {
+                r = introspect_write_interface(intro, impl->interface, *p);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to write introspection data: %m");
+        }
+
+        for (const BusObjectVtablePair *p = impl->fallback_vtables; p && p->vtable; p++) {
+                r = introspect_write_interface(intro, impl->interface, p->vtable);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to write introspection data: %m");
+        }
+
+        return 0;
+}
+
+static void list_paths(
+                FILE *out,
+                const BusObjectImplementation* const* bus_objects) {
+
+        for (size_t i = 0; bus_objects[i]; i++) {
+                fprintf(out, "%s\t%s\n", bus_objects[i]->path, bus_objects[i]->interface);
+                if (bus_objects[i]->children)
+                        list_paths(out, bus_objects[i]->children);
+        }
+}
+
+int bus_introspect_implementations(
+                FILE *out,
+                const char *pattern,
+                const BusObjectImplementation* const* bus_objects) {
+
+        const BusObjectImplementation *impl, *main_impl = NULL;
+        _cleanup_free_ char *s = NULL;
+        int r;
+
+        if (streq(pattern, "list")) {
+                list_paths(out, bus_objects);
+                return 0;
+        }
+
+        struct introspect intro = {};
+        bool is_interface = sd_bus_interface_name_is_valid(pattern);
+
+        impl = find_implementation(pattern, bus_objects);
+        if (!impl)
+                return log_error_errno(SYNTHETIC_ERRNO(ENOENT),
+                                       "%s %s not found",
+                                       is_interface ? "Interface" : "Object path",
+                                       pattern);
+
+        /* We use trusted=false here to get all the @org.freedesktop.systemd1.Privileged annotations. */
+        r = introspect_begin(&intro, false);
+        if (r < 0)
+                return log_error_errno(r, "Failed to write introspection data: %m");
+
+        r = introspect_write_default_interfaces(&intro, impl->manager);
+        if (r < 0)
+                return log_error_errno(r, "Failed to write introspection data: %m");
+
+        /* Check if there is a non-fallback path that applies to the given interface, also
+         * print it. This is useful in the case of units: o.fd.systemd1.Service is declared
+         * as a fallback vtable for o/fd/systemd1/unit, and we also want to print
+         * o.fd.systemd1.Unit, which is the non-fallback implementation. */
+        if (impl->fallback_vtables && is_interface)
+                main_impl = find_implementation(impl->path, bus_objects);
+
+        if (main_impl)
+                bus_introspect_implementation(&intro, main_impl);
+
+        if (impl != main_impl)
+                bus_introspect_implementation(&intro, impl);
+
+        _cleanup_set_free_ Set *nodes = NULL;
+
+        for (size_t i = 0; impl->children && impl->children[i]; i++) {
+                r = set_put_strdup(&nodes, impl->children[i]->path);
+                if (r < 0)
+                        return log_oom();
+        }
+
+        r = introspect_write_child_nodes(&intro, nodes, impl->path);
+        if (r < 0)
+                return r;
+
+        r = introspect_finish(&intro, &s);
+        if (r < 0)
+                return log_error_errno(r, "Failed to write introspection data: %m");
+
+        fputs(s, out);
+        return 0;
+}
diff --git a/src/shared/bus-object.h b/src/shared/bus-object.h
new file mode 100644 (file)
index 0000000..8add854
--- /dev/null
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include <stdbool.h>
+#include <stdio.h>
+
+#include "sd-bus.h"
+
+typedef struct BusObjectImplementation BusObjectImplementation;
+
+typedef struct BusObjectVtablePair {
+        const sd_bus_vtable *vtable;
+        sd_bus_object_find_t object_find;
+} BusObjectVtablePair;
+
+struct BusObjectImplementation {
+        const char *path;
+        const char *interface;
+        const sd_bus_vtable **vtables;
+        const BusObjectVtablePair *fallback_vtables;
+        sd_bus_node_enumerator_t node_enumerator;
+        bool manager;
+        const BusObjectImplementation **children;
+};
+
+#define BUS_VTABLES(...) ((const sd_bus_vtable* []){ __VA_ARGS__, NULL })
+#define BUS_FALLBACK_VTABLES(...) ((const BusObjectVtablePair[]) { __VA_ARGS__, {} })
+#define BUS_IMPLEMENTATIONS(...) ((const BusObjectImplementation* []) { __VA_ARGS__, NULL })
+
+int bus_add_implementation(sd_bus *bus, const BusObjectImplementation *impl, void *userdata);
+int bus_introspect_implementations(
+                FILE *out,
+                const char *pattern,
+                const BusObjectImplementation* const* bus_objects);
diff --git a/src/shared/bus-print-properties.c b/src/shared/bus-print-properties.c
new file mode 100644 (file)
index 0000000..bf7d050
--- /dev/null
@@ -0,0 +1,462 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#include "bus-print-properties.h"
+#include "cap-list.h"
+#include "cgroup-util.h"
+#include "escape.h"
+#include "mountpoint-util.h"
+#include "nsflags.h"
+#include "parse-util.h"
+#include "stdio-util.h"
+#include "string-util.h"
+#include "strv.h"
+#include "time-util.h"
+#include "user-util.h"
+
+int bus_print_property_value(const char *name, const char *expected_value, bool only_value, const char *value) {
+        assert(name);
+
+        if (expected_value && !streq_ptr(expected_value, value))
+                return 0;
+
+        if (only_value)
+                puts(value);
+        else
+                printf("%s=%s\n", name, value);
+
+        return 0;
+}
+
+int bus_print_property_valuef(const char *name, const char *expected_value, bool only_value, const char *fmt, ...) {
+        va_list ap;
+        int r;
+
+        assert(name);
+        assert(fmt);
+
+        if (expected_value) {
+                _cleanup_free_ char *s = NULL;
+
+                va_start(ap, fmt);
+                r = vasprintf(&s, fmt, ap);
+                va_end(ap);
+                if (r < 0)
+                        return -ENOMEM;
+
+                if (streq_ptr(expected_value, s)) {
+                        if (only_value)
+                                puts(s);
+                        else
+                                printf("%s=%s\n", name, s);
+                }
+
+                return 0;
+        }
+
+        if (!only_value)
+                printf("%s=", name);
+        va_start(ap, fmt);
+        vprintf(fmt, ap);
+        va_end(ap);
+        puts("");
+
+        return 0;
+}
+
+static int bus_print_property(const char *name, const char *expected_value, sd_bus_message *m, bool value, bool all) {
+        char type;
+        const char *contents;
+        int r;
+
+        assert(name);
+        assert(m);
+
+        r = sd_bus_message_peek_type(m, &type, &contents);
+        if (r < 0)
+                return r;
+
+        switch (type) {
+
+        case SD_BUS_TYPE_STRING: {
+                const char *s;
+
+                r = sd_bus_message_read_basic(m, type, &s);
+                if (r < 0)
+                        return r;
+
+                if (all || !isempty(s)) {
+                        bool good;
+
+                        /* This property has a single value, so we need to take
+                         * care not to print a new line, everything else is OK. */
+                        good = !strchr(s, '\n');
+                        bus_print_property_value(name, expected_value, value, good ? s : "[unprintable]");
+                }
+
+                return 1;
+        }
+
+        case SD_BUS_TYPE_BOOLEAN: {
+                int b;
+
+                r = sd_bus_message_read_basic(m, type, &b);
+                if (r < 0)
+                        return r;
+
+                if (expected_value && parse_boolean(expected_value) != b)
+                        return 1;
+
+                bus_print_property_value(name, NULL, value, yes_no(b));
+                return 1;
+        }
+
+        case SD_BUS_TYPE_UINT64: {
+                uint64_t u;
+
+                r = sd_bus_message_read_basic(m, type, &u);
+                if (r < 0)
+                        return r;
+
+                /* Yes, heuristics! But we can change this check
+                 * should it turn out to not be sufficient */
+
+                if (endswith(name, "Timestamp") ||
+                    STR_IN_SET(name, "NextElapseUSecRealtime", "LastTriggerUSec", "TimeUSec", "RTCTimeUSec")) {
+                        char timestamp[FORMAT_TIMESTAMP_MAX];
+                        const char *t;
+
+                        t = format_timestamp(timestamp, sizeof(timestamp), u);
+                        if (t || all)
+                                bus_print_property_value(name, expected_value, value, strempty(t));
+
+                } else if (strstr(name, "USec")) {
+                        char timespan[FORMAT_TIMESPAN_MAX];
+
+                        (void) format_timespan(timespan, sizeof(timespan), u, 0);
+                        bus_print_property_value(name, expected_value, value, timespan);
+
+                } else if (streq(name, "CoredumpFilter")) {
+                        char buf[STRLEN("0xFFFFFFFF")];
+
+                        xsprintf(buf, "0x%"PRIx64, u);
+                        bus_print_property_value(name, expected_value, value, buf);
+
+                } else if (streq(name, "RestrictNamespaces")) {
+                        _cleanup_free_ char *s = NULL;
+                        const char *result;
+
+                        if ((u & NAMESPACE_FLAGS_ALL) == 0)
+                                result = "yes";
+                        else if (FLAGS_SET(u, NAMESPACE_FLAGS_ALL))
+                                result = "no";
+                        else {
+                                r = namespace_flags_to_string(u, &s);
+                                if (r < 0)
+                                        return r;
+
+                                result = strempty(s);
+                        }
+
+                        bus_print_property_value(name, expected_value, value, result);
+
+                } else if (streq(name, "MountFlags")) {
+                        const char *result;
+
+                        result = mount_propagation_flags_to_string(u);
+                        if (!result)
+                                return -EINVAL;
+
+                        bus_print_property_value(name, expected_value, value, result);
+
+                } else if (STR_IN_SET(name, "CapabilityBoundingSet", "AmbientCapabilities")) {
+                        _cleanup_free_ char *s = NULL;
+
+                        r = capability_set_to_string_alloc(u, &s);
+                        if (r < 0)
+                                return r;
+
+                        bus_print_property_value(name, expected_value, value, s);
+
+                } else if ((STR_IN_SET(name, "CPUWeight", "StartupCPUWeight", "IOWeight", "StartupIOWeight") && u == CGROUP_WEIGHT_INVALID) ||
+                           (STR_IN_SET(name, "CPUShares", "StartupCPUShares") && u == CGROUP_CPU_SHARES_INVALID) ||
+                           (STR_IN_SET(name, "BlockIOWeight", "StartupBlockIOWeight") && u == CGROUP_BLKIO_WEIGHT_INVALID) ||
+                           (STR_IN_SET(name, "MemoryCurrent", "TasksCurrent") && u == (uint64_t) -1) ||
+                           (endswith(name, "NSec") && u == (uint64_t) -1))
+
+                        bus_print_property_value(name, expected_value, value, "[not set]");
+
+                else if ((STR_IN_SET(name, "DefaultMemoryLow", "DefaultMemoryMin", "MemoryLow", "MemoryHigh", "MemoryMax", "MemorySwapMax", "MemoryLimit") && u == CGROUP_LIMIT_MAX) ||
+                         (STR_IN_SET(name, "TasksMax", "DefaultTasksMax") && u == (uint64_t) -1) ||
+                         (startswith(name, "Limit") && u == (uint64_t) -1) ||
+                         (startswith(name, "DefaultLimit") && u == (uint64_t) -1))
+
+                        bus_print_property_value(name, expected_value, value, "infinity");
+                else if (STR_IN_SET(name, "IPIngressBytes", "IPIngressPackets", "IPEgressBytes", "IPEgressPackets") && u == (uint64_t) -1)
+                        bus_print_property_value(name, expected_value, value, "[no data]");
+                else
+                        bus_print_property_valuef(name, expected_value, value, "%"PRIu64, u);
+
+                return 1;
+        }
+
+        case SD_BUS_TYPE_INT64: {
+                int64_t i;
+
+                r = sd_bus_message_read_basic(m, type, &i);
+                if (r < 0)
+                        return r;
+
+                bus_print_property_valuef(name, expected_value, value, "%"PRIi64, i);
+                return 1;
+        }
+
+        case SD_BUS_TYPE_UINT32: {
+                uint32_t u;
+
+                r = sd_bus_message_read_basic(m, type, &u);
+                if (r < 0)
+                        return r;
+
+                if (strstr(name, "UMask") || strstr(name, "Mode"))
+                        bus_print_property_valuef(name, expected_value, value, "%04o", u);
+
+                else if (streq(name, "UID")) {
+                        if (u == UID_INVALID)
+                                bus_print_property_value(name, expected_value, value, "[not set]");
+                        else
+                                bus_print_property_valuef(name, expected_value, value, "%"PRIu32, u);
+                } else if (streq(name, "GID")) {
+                        if (u == GID_INVALID)
+                                bus_print_property_value(name, expected_value, value, "[not set]");
+                        else
+                                bus_print_property_valuef(name, expected_value, value, "%"PRIu32, u);
+                } else
+                        bus_print_property_valuef(name, expected_value, value, "%"PRIu32, u);
+
+                return 1;
+        }
+
+        case SD_BUS_TYPE_INT32: {
+                int32_t i;
+
+                r = sd_bus_message_read_basic(m, type, &i);
+                if (r < 0)
+                        return r;
+
+                bus_print_property_valuef(name, expected_value, value, "%"PRIi32, i);
+                return 1;
+        }
+
+        case SD_BUS_TYPE_DOUBLE: {
+                double d;
+
+                r = sd_bus_message_read_basic(m, type, &d);
+                if (r < 0)
+                        return r;
+
+                bus_print_property_valuef(name, expected_value, value, "%g", d);
+                return 1;
+        }
+
+        case SD_BUS_TYPE_ARRAY:
+                if (streq(contents, "s")) {
+                        bool first = true;
+                        const char *str;
+
+                        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, contents);
+                        if (r < 0)
+                                return r;
+
+                        while ((r = sd_bus_message_read_basic(m, SD_BUS_TYPE_STRING, &str)) > 0) {
+                                _cleanup_free_ char *e = NULL;
+
+                                e = shell_maybe_quote(str, ESCAPE_BACKSLASH_ONELINE);
+                                if (!e)
+                                        return -ENOMEM;
+
+                                if (first) {
+                                        if (!value)
+                                                printf("%s=", name);
+                                        first = false;
+                                } else
+                                        fputs(" ", stdout);
+
+                                fputs(e, stdout);
+                        }
+                        if (r < 0)
+                                return r;
+
+                        if (first && all && !value)
+                                printf("%s=", name);
+                        if (!first || all)
+                                puts("");
+
+                        r = sd_bus_message_exit_container(m);
+                        if (r < 0)
+                                return r;
+
+                        return 1;
+
+                } else if (streq(contents, "y")) {
+                        const uint8_t *u;
+                        size_t n;
+
+                        r = sd_bus_message_read_array(m, SD_BUS_TYPE_BYTE, (const void**) &u, &n);
+                        if (r < 0)
+                                return r;
+
+                        if (all || n > 0) {
+                                unsigned i;
+
+                                if (!value)
+                                        printf("%s=", name);
+
+                                for (i = 0; i < n; i++)
+                                        printf("%02x", u[i]);
+
+                                puts("");
+                        }
+
+                        return 1;
+
+                } else if (streq(contents, "u")) {
+                        uint32_t *u;
+                        size_t n;
+
+                        r = sd_bus_message_read_array(m, SD_BUS_TYPE_UINT32, (const void**) &u, &n);
+                        if (r < 0)
+                                return r;
+
+                        if (all || n > 0) {
+                                unsigned i;
+
+                                if (!value)
+                                        printf("%s=", name);
+
+                                for (i = 0; i < n; i++)
+                                        printf("%08x", u[i]);
+
+                                puts("");
+                        }
+
+                        return 1;
+                }
+
+                break;
+        }
+
+        return 0;
+}
+
+int bus_message_print_all_properties(
+                sd_bus_message *m,
+                bus_message_print_t func,
+                char **filter,
+                bool value,
+                bool all,
+                Set **found_properties) {
+
+        int r;
+
+        assert(m);
+
+        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "{sv}");
+        if (r < 0)
+                return r;
+
+        while ((r = sd_bus_message_enter_container(m, SD_BUS_TYPE_DICT_ENTRY, "sv")) > 0) {
+                _cleanup_free_ char *name_with_equal = NULL;
+                const char *name, *contents, *expected_value = NULL;
+
+                r = sd_bus_message_read_basic(m, SD_BUS_TYPE_STRING, &name);
+                if (r < 0)
+                        return r;
+
+                if (found_properties) {
+                        r = set_ensure_put(found_properties, &string_hash_ops, name);
+                        if (r < 0)
+                                return log_oom();
+                }
+
+                name_with_equal = strjoin(name, "=");
+                if (!name_with_equal)
+                        return log_oom();
+
+                if (!filter || strv_find(filter, name) ||
+                    (expected_value = strv_find_startswith(filter, name_with_equal))) {
+                        r = sd_bus_message_peek_type(m, NULL, &contents);
+                        if (r < 0)
+                                return r;
+
+                        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_VARIANT, contents);
+                        if (r < 0)
+                                return r;
+
+                        if (func)
+                                r = func(name, expected_value, m, value, all);
+                        if (!func || r == 0)
+                                r = bus_print_property(name, expected_value, m, value, all);
+                        if (r < 0)
+                                return r;
+                        if (r == 0) {
+                                if (all && !expected_value)
+                                        printf("%s=[unprintable]\n", name);
+                                /* skip what we didn't read */
+                                r = sd_bus_message_skip(m, contents);
+                                if (r < 0)
+                                        return r;
+                        }
+
+                        r = sd_bus_message_exit_container(m);
+                        if (r < 0)
+                                return r;
+                } else {
+                        r = sd_bus_message_skip(m, "v");
+                        if (r < 0)
+                                return r;
+                }
+
+                r = sd_bus_message_exit_container(m);
+                if (r < 0)
+                        return r;
+        }
+        if (r < 0)
+                return r;
+
+        r = sd_bus_message_exit_container(m);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
+int bus_print_all_properties(
+                sd_bus *bus,
+                const char *dest,
+                const char *path,
+                bus_message_print_t func,
+                char **filter,
+                bool value,
+                bool all,
+                Set **found_properties) {
+
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        int r;
+
+        assert(bus);
+        assert(path);
+
+        r = sd_bus_call_method(bus,
+                        dest,
+                        path,
+                        "org.freedesktop.DBus.Properties",
+                        "GetAll",
+                        &error,
+                        &reply,
+                        "s", "");
+        if (r < 0)
+                return r;
+
+        return bus_message_print_all_properties(reply, func, filter, value, all, found_properties);
+}
diff --git a/src/shared/bus-print-properties.h b/src/shared/bus-print-properties.h
new file mode 100644 (file)
index 0000000..1c21dff
--- /dev/null
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include <stdbool.h>
+
+#include "sd-bus.h"
+
+#include "macro.h"
+#include "set.h"
+
+typedef int (*bus_message_print_t) (const char *name, const char *expected_value, sd_bus_message *m, bool value, bool all);
+
+int bus_print_property_value(const char *name, const char *expected_value, bool only_value, const char *value);
+int bus_print_property_valuef(const char *name, const char *expected_value, bool only_value, const char *fmt, ...) _printf_(4,5);
+int bus_message_print_all_properties(sd_bus_message *m, bus_message_print_t func, char **filter, bool value, bool all, Set **found_properties);
+int bus_print_all_properties(sd_bus *bus, const char *dest, const char *path, bus_message_print_t func, char **filter, bool value, bool all, Set **found_properties);
index e539d031495741b8998016a26de7727cfc19c78f..f2652ed9a59dafeef5a03940b338a96d066056f0 100644 (file)
@@ -496,18 +496,16 @@ static int bus_append_cgroup_property(sd_bus_message *m, const char *field, cons
                         if (r < 0)
                                 return bus_log_create_error(r);
                         return 1;
-                } else if (isempty(eq) && STR_IN_SET(field, "DefaultMemoryLow",
-                                                            "DefaultMemoryMin",
-                                                            "MemoryLow",
-                                                            "MemoryMin")) {
-                        /* We can't use CGROUP_LIMIT_MIN nor CGROUP_LIMIT_MAX to convey the empty assignment
-                         * so marshall specially as a boolean. */
-                        r = sd_bus_message_append(m, "(sv)", field, "b", 0);
-                        if (r < 0)
-                                return bus_log_create_error(r);
-                        return 1;
                 } else if (isempty(eq)) {
-                        r = sd_bus_message_append(m, "(sv)", field, "t", CGROUP_LIMIT_MAX);
+                        uint64_t empty_value = STR_IN_SET(field,
+                                                          "DefaultMemoryLow",
+                                                          "DefaultMemoryMin",
+                                                          "MemoryLow",
+                                                          "MemoryMin") ?
+                                               CGROUP_LIMIT_MIN :
+                                               CGROUP_LIMIT_MAX;
+
+                        r = sd_bus_message_append(m, "(sv)", field, "t", empty_value);
                         if (r < 0)
                                 return bus_log_create_error(r);
                         return 1;
@@ -1175,11 +1173,11 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
 
         if (STR_IN_SET(field, "RestrictAddressFamilies",
                               "SystemCallFilter")) {
-                int whitelist = 1;
+                int allow_list = 1;
                 const char *p = eq;
 
                 if (*p == '~') {
-                        whitelist = 0;
+                        allow_list = 0;
                         p++;
                 }
 
@@ -1199,7 +1197,7 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
                 if (r < 0)
                         return bus_log_create_error(r);
 
-                r = sd_bus_message_append_basic(m, 'b', &whitelist);
+                r = sd_bus_message_append_basic(m, 'b', &allow_list);
                 if (r < 0)
                         return bus_log_create_error(r);
 
@@ -1436,6 +1434,26 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
                 return bus_append_byte_array(m, field, roothash_decoded, roothash_decoded_size);
         }
 
+        if (streq(field, "RootHashSignature")) {
+                _cleanup_free_ void *roothash_sig_decoded = NULL;
+                char *value;
+                size_t roothash_sig_decoded_size = 0;
+
+                /* We have the path to a roothash signature to load and decode, eg: RootHash=/foo/bar.roothash.p7s */
+                if (path_is_absolute(eq))
+                        return bus_append_string(m, "RootHashSignaturePath", eq);
+
+                if (!(value = startswith(eq, "base64:")))
+                        return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to decode RootHashSignature= '%s', not a path but doesn't start with 'base64:': %m", eq);
+
+                /* We have a roothash signature to decode, eg: RootHashSignature=base64:012345789abcdef */
+                r = unbase64mem(value, strlen(value), &roothash_sig_decoded, &roothash_sig_decoded_size);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to decode RootHashSignature= '%s': %m", eq);
+
+                return bus_append_byte_array(m, field, roothash_sig_decoded, roothash_sig_decoded_size);
+        }
+
         return 0;
 }
 
index a61f8e70da0b18dfdc4eabce7ad6644766bd0424..77c1c6218272bbfb89b45364822d1bb90fff83b5 100644 (file)
 #include "sd-event.h"
 #include "sd-id128.h"
 
-#include "alloc-util.h"
+/* #include "alloc-util.h" */
 #include "bus-internal.h"
-#include "bus-introspect.h"
 #include "bus-label.h"
-#include "bus-message.h"
 #include "bus-util.h"
-#include "cap-list.h"
-#include "cgroup-util.h"
-#include "escape.h"
-#include "mountpoint-util.h"
-#include "nsflags.h"
-#include "parse-util.h"
 #include "path-util.h"
-#include "rlimit-util.h"
 #include "socket-util.h"
 #include "stdio-util.h"
-#include "strv.h"
-#include "user-util.h"
+/* #include "string-util.h" */
 
 static int name_owner_change_callback(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
         sd_event *e = userdata;
@@ -253,681 +243,6 @@ int bus_connect_user_systemd(sd_bus **_bus) {
         return 0;
 }
 
-int bus_print_property_value(const char *name, const char *expected_value, bool only_value, const char *value) {
-        assert(name);
-
-        if (expected_value && !streq_ptr(expected_value, value))
-                return 0;
-
-        if (only_value)
-                puts(value);
-        else
-                printf("%s=%s\n", name, value);
-
-        return 0;
-}
-
-int bus_print_property_valuef(const char *name, const char *expected_value, bool only_value, const char *fmt, ...) {
-        va_list ap;
-        int r;
-
-        assert(name);
-        assert(fmt);
-
-        if (expected_value) {
-                _cleanup_free_ char *s = NULL;
-
-                va_start(ap, fmt);
-                r = vasprintf(&s, fmt, ap);
-                va_end(ap);
-                if (r < 0)
-                        return -ENOMEM;
-
-                if (streq_ptr(expected_value, s)) {
-                        if (only_value)
-                                puts(s);
-                        else
-                                printf("%s=%s\n", name, s);
-                }
-
-                return 0;
-        }
-
-        if (!only_value)
-                printf("%s=", name);
-        va_start(ap, fmt);
-        vprintf(fmt, ap);
-        va_end(ap);
-        puts("");
-
-        return 0;
-}
-
-static int bus_print_property(const char *name, const char *expected_value, sd_bus_message *m, bool value, bool all) {
-        char type;
-        const char *contents;
-        int r;
-
-        assert(name);
-        assert(m);
-
-        r = sd_bus_message_peek_type(m, &type, &contents);
-        if (r < 0)
-                return r;
-
-        switch (type) {
-
-        case SD_BUS_TYPE_STRING: {
-                const char *s;
-
-                r = sd_bus_message_read_basic(m, type, &s);
-                if (r < 0)
-                        return r;
-
-                if (all || !isempty(s)) {
-                        bool good;
-
-                        /* This property has a single value, so we need to take
-                         * care not to print a new line, everything else is OK. */
-                        good = !strchr(s, '\n');
-                        bus_print_property_value(name, expected_value, value, good ? s : "[unprintable]");
-                }
-
-                return 1;
-        }
-
-        case SD_BUS_TYPE_BOOLEAN: {
-                int b;
-
-                r = sd_bus_message_read_basic(m, type, &b);
-                if (r < 0)
-                        return r;
-
-                if (expected_value && parse_boolean(expected_value) != b)
-                        return 1;
-
-                bus_print_property_value(name, NULL, value, yes_no(b));
-                return 1;
-        }
-
-        case SD_BUS_TYPE_UINT64: {
-                uint64_t u;
-
-                r = sd_bus_message_read_basic(m, type, &u);
-                if (r < 0)
-                        return r;
-
-                /* Yes, heuristics! But we can change this check
-                 * should it turn out to not be sufficient */
-
-                if (endswith(name, "Timestamp") ||
-                    STR_IN_SET(name, "NextElapseUSecRealtime", "LastTriggerUSec", "TimeUSec", "RTCTimeUSec")) {
-                        char timestamp[FORMAT_TIMESTAMP_MAX];
-                        const char *t;
-
-                        t = format_timestamp(timestamp, sizeof(timestamp), u);
-                        if (t || all)
-                                bus_print_property_value(name, expected_value, value, strempty(t));
-
-                } else if (strstr(name, "USec")) {
-                        char timespan[FORMAT_TIMESPAN_MAX];
-
-                        (void) format_timespan(timespan, sizeof(timespan), u, 0);
-                        bus_print_property_value(name, expected_value, value, timespan);
-
-                } else if (streq(name, "CoredumpFilter")) {
-                        char buf[STRLEN("0xFFFFFFFF")];
-
-                        xsprintf(buf, "0x%"PRIx64, u);
-                        bus_print_property_value(name, expected_value, value, buf);
-
-                } else if (streq(name, "RestrictNamespaces")) {
-                        _cleanup_free_ char *s = NULL;
-                        const char *result;
-
-                        if ((u & NAMESPACE_FLAGS_ALL) == 0)
-                                result = "yes";
-                        else if (FLAGS_SET(u, NAMESPACE_FLAGS_ALL))
-                                result = "no";
-                        else {
-                                r = namespace_flags_to_string(u, &s);
-                                if (r < 0)
-                                        return r;
-
-                                result = strempty(s);
-                        }
-
-                        bus_print_property_value(name, expected_value, value, result);
-
-                } else if (streq(name, "MountFlags")) {
-                        const char *result;
-
-                        result = mount_propagation_flags_to_string(u);
-                        if (!result)
-                                return -EINVAL;
-
-                        bus_print_property_value(name, expected_value, value, result);
-
-                } else if (STR_IN_SET(name, "CapabilityBoundingSet", "AmbientCapabilities")) {
-                        _cleanup_free_ char *s = NULL;
-
-                        r = capability_set_to_string_alloc(u, &s);
-                        if (r < 0)
-                                return r;
-
-                        bus_print_property_value(name, expected_value, value, s);
-
-                } else if ((STR_IN_SET(name, "CPUWeight", "StartupCPUWeight", "IOWeight", "StartupIOWeight") && u == CGROUP_WEIGHT_INVALID) ||
-                           (STR_IN_SET(name, "CPUShares", "StartupCPUShares") && u == CGROUP_CPU_SHARES_INVALID) ||
-                           (STR_IN_SET(name, "BlockIOWeight", "StartupBlockIOWeight") && u == CGROUP_BLKIO_WEIGHT_INVALID) ||
-                           (STR_IN_SET(name, "MemoryCurrent", "TasksCurrent") && u == (uint64_t) -1) ||
-                           (endswith(name, "NSec") && u == (uint64_t) -1))
-
-                        bus_print_property_value(name, expected_value, value, "[not set]");
-
-                else if ((STR_IN_SET(name, "DefaultMemoryLow", "DefaultMemoryMin", "MemoryLow", "MemoryHigh", "MemoryMax", "MemorySwapMax", "MemoryLimit") && u == CGROUP_LIMIT_MAX) ||
-                         (STR_IN_SET(name, "TasksMax", "DefaultTasksMax") && u == (uint64_t) -1) ||
-                         (startswith(name, "Limit") && u == (uint64_t) -1) ||
-                         (startswith(name, "DefaultLimit") && u == (uint64_t) -1))
-
-                        bus_print_property_value(name, expected_value, value, "infinity");
-                else if (STR_IN_SET(name, "IPIngressBytes", "IPIngressPackets", "IPEgressBytes", "IPEgressPackets") && u == (uint64_t) -1)
-                        bus_print_property_value(name, expected_value, value, "[no data]");
-                else
-                        bus_print_property_valuef(name, expected_value, value, "%"PRIu64, u);
-
-                return 1;
-        }
-
-        case SD_BUS_TYPE_INT64: {
-                int64_t i;
-
-                r = sd_bus_message_read_basic(m, type, &i);
-                if (r < 0)
-                        return r;
-
-                bus_print_property_valuef(name, expected_value, value, "%"PRIi64, i);
-                return 1;
-        }
-
-        case SD_BUS_TYPE_UINT32: {
-                uint32_t u;
-
-                r = sd_bus_message_read_basic(m, type, &u);
-                if (r < 0)
-                        return r;
-
-                if (strstr(name, "UMask") || strstr(name, "Mode"))
-                        bus_print_property_valuef(name, expected_value, value, "%04o", u);
-
-                else if (streq(name, "UID")) {
-                        if (u == UID_INVALID)
-                                bus_print_property_value(name, expected_value, value, "[not set]");
-                        else
-                                bus_print_property_valuef(name, expected_value, value, "%"PRIu32, u);
-                } else if (streq(name, "GID")) {
-                        if (u == GID_INVALID)
-                                bus_print_property_value(name, expected_value, value, "[not set]");
-                        else
-                                bus_print_property_valuef(name, expected_value, value, "%"PRIu32, u);
-                } else
-                        bus_print_property_valuef(name, expected_value, value, "%"PRIu32, u);
-
-                return 1;
-        }
-
-        case SD_BUS_TYPE_INT32: {
-                int32_t i;
-
-                r = sd_bus_message_read_basic(m, type, &i);
-                if (r < 0)
-                        return r;
-
-                bus_print_property_valuef(name, expected_value, value, "%"PRIi32, i);
-                return 1;
-        }
-
-        case SD_BUS_TYPE_DOUBLE: {
-                double d;
-
-                r = sd_bus_message_read_basic(m, type, &d);
-                if (r < 0)
-                        return r;
-
-                bus_print_property_valuef(name, expected_value, value, "%g", d);
-                return 1;
-        }
-
-        case SD_BUS_TYPE_ARRAY:
-                if (streq(contents, "s")) {
-                        bool first = true;
-                        const char *str;
-
-                        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, contents);
-                        if (r < 0)
-                                return r;
-
-                        while ((r = sd_bus_message_read_basic(m, SD_BUS_TYPE_STRING, &str)) > 0) {
-                                _cleanup_free_ char *e = NULL;
-
-                                e = shell_maybe_quote(str, ESCAPE_BACKSLASH_ONELINE);
-                                if (!e)
-                                        return -ENOMEM;
-
-                                if (first) {
-                                        if (!value)
-                                                printf("%s=", name);
-                                        first = false;
-                                } else
-                                        fputs(" ", stdout);
-
-                                fputs(e, stdout);
-                        }
-                        if (r < 0)
-                                return r;
-
-                        if (first && all && !value)
-                                printf("%s=", name);
-                        if (!first || all)
-                                puts("");
-
-                        r = sd_bus_message_exit_container(m);
-                        if (r < 0)
-                                return r;
-
-                        return 1;
-
-                } else if (streq(contents, "y")) {
-                        const uint8_t *u;
-                        size_t n;
-
-                        r = sd_bus_message_read_array(m, SD_BUS_TYPE_BYTE, (const void**) &u, &n);
-                        if (r < 0)
-                                return r;
-
-                        if (all || n > 0) {
-                                unsigned i;
-
-                                if (!value)
-                                        printf("%s=", name);
-
-                                for (i = 0; i < n; i++)
-                                        printf("%02x", u[i]);
-
-                                puts("");
-                        }
-
-                        return 1;
-
-                } else if (streq(contents, "u")) {
-                        uint32_t *u;
-                        size_t n;
-
-                        r = sd_bus_message_read_array(m, SD_BUS_TYPE_UINT32, (const void**) &u, &n);
-                        if (r < 0)
-                                return r;
-
-                        if (all || n > 0) {
-                                unsigned i;
-
-                                if (!value)
-                                        printf("%s=", name);
-
-                                for (i = 0; i < n; i++)
-                                        printf("%08x", u[i]);
-
-                                puts("");
-                        }
-
-                        return 1;
-                }
-
-                break;
-        }
-
-        return 0;
-}
-
-int bus_message_print_all_properties(
-                sd_bus_message *m,
-                bus_message_print_t func,
-                char **filter,
-                bool value,
-                bool all,
-                Set **found_properties) {
-
-        int r;
-
-        assert(m);
-
-        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "{sv}");
-        if (r < 0)
-                return r;
-
-        while ((r = sd_bus_message_enter_container(m, SD_BUS_TYPE_DICT_ENTRY, "sv")) > 0) {
-                _cleanup_free_ char *name_with_equal = NULL;
-                const char *name, *contents, *expected_value = NULL;
-
-                r = sd_bus_message_read_basic(m, SD_BUS_TYPE_STRING, &name);
-                if (r < 0)
-                        return r;
-
-                if (found_properties) {
-                        r = set_ensure_allocated(found_properties, &string_hash_ops);
-                        if (r < 0)
-                                return log_oom();
-
-                        r = set_put(*found_properties, name);
-                        if (r < 0 && r != -EEXIST)
-                                return log_oom();
-                }
-
-                name_with_equal = strjoin(name, "=");
-                if (!name_with_equal)
-                        return log_oom();
-
-                if (!filter || strv_find(filter, name) ||
-                    (expected_value = strv_find_startswith(filter, name_with_equal))) {
-                        r = sd_bus_message_peek_type(m, NULL, &contents);
-                        if (r < 0)
-                                return r;
-
-                        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_VARIANT, contents);
-                        if (r < 0)
-                                return r;
-
-                        if (func)
-                                r = func(name, expected_value, m, value, all);
-                        if (!func || r == 0)
-                                r = bus_print_property(name, expected_value, m, value, all);
-                        if (r < 0)
-                                return r;
-                        if (r == 0) {
-                                if (all && !expected_value)
-                                        printf("%s=[unprintable]\n", name);
-                                /* skip what we didn't read */
-                                r = sd_bus_message_skip(m, contents);
-                                if (r < 0)
-                                        return r;
-                        }
-
-                        r = sd_bus_message_exit_container(m);
-                        if (r < 0)
-                                return r;
-                } else {
-                        r = sd_bus_message_skip(m, "v");
-                        if (r < 0)
-                                return r;
-                }
-
-                r = sd_bus_message_exit_container(m);
-                if (r < 0)
-                        return r;
-        }
-        if (r < 0)
-                return r;
-
-        r = sd_bus_message_exit_container(m);
-        if (r < 0)
-                return r;
-
-        return 0;
-}
-
-int bus_print_all_properties(
-                sd_bus *bus,
-                const char *dest,
-                const char *path,
-                bus_message_print_t func,
-                char **filter,
-                bool value,
-                bool all,
-                Set **found_properties) {
-
-        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
-        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-        int r;
-
-        assert(bus);
-        assert(path);
-
-        r = sd_bus_call_method(bus,
-                        dest,
-                        path,
-                        "org.freedesktop.DBus.Properties",
-                        "GetAll",
-                        &error,
-                        &reply,
-                        "s", "");
-        if (r < 0)
-                return r;
-
-        return bus_message_print_all_properties(reply, func, filter, value, all, found_properties);
-}
-
-int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
-        sd_id128_t *p = userdata;
-        const void *v;
-        size_t n;
-        int r;
-
-        r = sd_bus_message_read_array(m, SD_BUS_TYPE_BYTE, &v, &n);
-        if (r < 0)
-                return r;
-
-        if (n == 0)
-                *p = SD_ID128_NULL;
-        else if (n == 16)
-                memcpy((*p).bytes, v, n);
-        else
-                return -EINVAL;
-
-        return 0;
-}
-
-static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, unsigned flags, sd_bus_error *error, void *userdata) {
-        char type;
-        int r;
-
-        r = sd_bus_message_peek_type(m, &type, NULL);
-        if (r < 0)
-                return r;
-
-        switch (type) {
-
-        case SD_BUS_TYPE_STRING:
-        case SD_BUS_TYPE_OBJECT_PATH: {
-                const char **p = userdata;
-                const char *s;
-
-                r = sd_bus_message_read_basic(m, type, &s);
-                if (r < 0)
-                        return r;
-
-                if (isempty(s))
-                        s = NULL;
-
-                if (flags & BUS_MAP_STRDUP)
-                        return free_and_strdup((char **) userdata, s);
-
-                *p = s;
-                return 0;
-        }
-
-        case SD_BUS_TYPE_ARRAY: {
-                _cleanup_strv_free_ char **l = NULL;
-                char ***p = userdata;
-
-                r = bus_message_read_strv_extend(m, &l);
-                if (r < 0)
-                        return r;
-
-                return strv_extend_strv(p, l, false);
-        }
-
-        case SD_BUS_TYPE_BOOLEAN: {
-                int b;
-
-                r = sd_bus_message_read_basic(m, type, &b);
-                if (r < 0)
-                        return r;
-
-                if (flags & BUS_MAP_BOOLEAN_AS_BOOL)
-                        *(bool*) userdata = b;
-                else
-                        *(int*) userdata = b;
-
-                return 0;
-        }
-
-        case SD_BUS_TYPE_INT32:
-        case SD_BUS_TYPE_UINT32: {
-                uint32_t u, *p = userdata;
-
-                r = sd_bus_message_read_basic(m, type, &u);
-                if (r < 0)
-                        return r;
-
-                *p = u;
-                return 0;
-        }
-
-        case SD_BUS_TYPE_INT64:
-        case SD_BUS_TYPE_UINT64: {
-                uint64_t t, *p = userdata;
-
-                r = sd_bus_message_read_basic(m, type, &t);
-                if (r < 0)
-                        return r;
-
-                *p = t;
-                return 0;
-        }
-
-        case SD_BUS_TYPE_DOUBLE: {
-                double d, *p = userdata;
-
-                r = sd_bus_message_read_basic(m, type, &d);
-                if (r < 0)
-                        return r;
-
-                *p = d;
-                return 0;
-        }}
-
-        return -EOPNOTSUPP;
-}
-
-int bus_message_map_all_properties(
-                sd_bus_message *m,
-                const struct bus_properties_map *map,
-                unsigned flags,
-                sd_bus_error *error,
-                void *userdata) {
-
-        int r;
-
-        assert(m);
-        assert(map);
-
-        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "{sv}");
-        if (r < 0)
-                return r;
-
-        while ((r = sd_bus_message_enter_container(m, SD_BUS_TYPE_DICT_ENTRY, "sv")) > 0) {
-                const struct bus_properties_map *prop;
-                const char *member;
-                const char *contents;
-                void *v;
-                unsigned i;
-
-                r = sd_bus_message_read_basic(m, SD_BUS_TYPE_STRING, &member);
-                if (r < 0)
-                        return r;
-
-                for (i = 0, prop = NULL; map[i].member; i++)
-                        if (streq(map[i].member, member)) {
-                                prop = &map[i];
-                                break;
-                        }
-
-                if (prop) {
-                        r = sd_bus_message_peek_type(m, NULL, &contents);
-                        if (r < 0)
-                                return r;
-
-                        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_VARIANT, contents);
-                        if (r < 0)
-                                return r;
-
-                        v = (uint8_t *)userdata + prop->offset;
-                        if (map[i].set)
-                                r = prop->set(sd_bus_message_get_bus(m), member, m, error, v);
-                        else
-                                r = map_basic(sd_bus_message_get_bus(m), member, m, flags, error, v);
-                        if (r < 0)
-                                return r;
-
-                        r = sd_bus_message_exit_container(m);
-                        if (r < 0)
-                                return r;
-                } else {
-                        r = sd_bus_message_skip(m, "v");
-                        if (r < 0)
-                                return r;
-                }
-
-                r = sd_bus_message_exit_container(m);
-                if (r < 0)
-                        return r;
-        }
-        if (r < 0)
-                return r;
-
-        return sd_bus_message_exit_container(m);
-}
-
-int bus_map_all_properties(
-                sd_bus *bus,
-                const char *destination,
-                const char *path,
-                const struct bus_properties_map *map,
-                unsigned flags,
-                sd_bus_error *error,
-                sd_bus_message **reply,
-                void *userdata) {
-
-        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
-        int r;
-
-        assert(bus);
-        assert(destination);
-        assert(path);
-        assert(map);
-        assert(reply || (flags & BUS_MAP_STRDUP));
-
-        r = sd_bus_call_method(
-                        bus,
-                        destination,
-                        path,
-                        "org.freedesktop.DBus.Properties",
-                        "GetAll",
-                        error,
-                        &m,
-                        "s", "");
-        if (r < 0)
-                return r;
-
-        r = bus_message_map_all_properties(m, map, flags, error, userdata);
-        if (r < 0)
-                return r;
-
-        if (reply)
-                *reply = sd_bus_message_ref(m);
-
-        return r;
-}
-
 int bus_connect_transport(BusTransport transport, const char *host, bool user, sd_bus **ret) {
         _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
         int r;
@@ -1017,102 +332,6 @@ int bus_connect_transport_systemd(BusTransport transport, const char *host, bool
         return r;
 }
 
-int bus_property_get_bool(
-                sd_bus *bus,
-                const char *path,
-                const char *interface,
-                const char *property,
-                sd_bus_message *reply,
-                void *userdata,
-                sd_bus_error *error) {
-
-        int b = *(bool*) userdata;
-
-        return sd_bus_message_append_basic(reply, 'b', &b);
-}
-
-int bus_property_set_bool(
-                sd_bus *bus,
-                const char *path,
-                const char *interface,
-                const char *property,
-                sd_bus_message *value,
-                void *userdata,
-                sd_bus_error *error) {
-
-        int b, r;
-
-        r = sd_bus_message_read(value, "b", &b);
-        if (r < 0)
-                return r;
-
-        *(bool*) userdata = b;
-        return 0;
-}
-
-int bus_property_get_id128(
-                sd_bus *bus,
-                const char *path,
-                const char *interface,
-                const char *property,
-                sd_bus_message *reply,
-                void *userdata,
-                sd_bus_error *error) {
-
-        sd_id128_t *id = userdata;
-
-        if (sd_id128_is_null(*id)) /* Add an empty array if the ID is zero */
-                return sd_bus_message_append(reply, "ay", 0);
-        else
-                return sd_bus_message_append_array(reply, 'y', id->bytes, 16);
-}
-
-#if __SIZEOF_SIZE_T__ != 8
-int bus_property_get_size(
-                sd_bus *bus,
-                const char *path,
-                const char *interface,
-                const char *property,
-                sd_bus_message *reply,
-                void *userdata,
-                sd_bus_error *error) {
-
-        uint64_t sz = *(size_t*) userdata;
-
-        return sd_bus_message_append_basic(reply, 't', &sz);
-}
-#endif
-
-#if __SIZEOF_LONG__ != 8
-int bus_property_get_long(
-                sd_bus *bus,
-                const char *path,
-                const char *interface,
-                const char *property,
-                sd_bus_message *reply,
-                void *userdata,
-                sd_bus_error *error) {
-
-        int64_t l = *(long*) userdata;
-
-        return sd_bus_message_append_basic(reply, 'x', &l);
-}
-
-int bus_property_get_ulong(
-                sd_bus *bus,
-                const char *path,
-                const char *interface,
-                const char *property,
-                sd_bus_message *reply,
-                void *userdata,
-                sd_bus_error *error) {
-
-        uint64_t ul = *(unsigned long*) userdata;
-
-        return sd_bus_message_append_basic(reply, 't', &ul);
-}
-#endif
-
 /**
  * bus_path_encode_unique() - encode unique object path
  * @b: bus connection or NULL
@@ -1240,54 +459,6 @@ int bus_path_decode_unique(const char *path, const char *prefix, char **ret_send
         return 1;
 }
 
-int bus_property_get_rlimit(
-                sd_bus *bus,
-                const char *path,
-                const char *interface,
-                const char *property,
-                sd_bus_message *reply,
-                void *userdata,
-                sd_bus_error *error) {
-
-        const char *is_soft;
-        struct rlimit *rl;
-        uint64_t u;
-        rlim_t x;
-
-        assert(bus);
-        assert(reply);
-        assert(userdata);
-
-        is_soft = endswith(property, "Soft");
-
-        rl = *(struct rlimit**) userdata;
-        if (rl)
-                x = is_soft ? rl->rlim_cur : rl->rlim_max;
-        else {
-                struct rlimit buf = {};
-                const char *s, *p;
-                int z;
-
-                /* Chop off "Soft" suffix */
-                s = is_soft ? strndupa(property, is_soft - property) : property;
-
-                /* Skip over any prefix, such as "Default" */
-                assert_se(p = strstr(s, "Limit"));
-
-                z = rlimit_from_string(p + 5);
-                assert(z >= 0);
-
-                (void) getrlimit(z, &buf);
-                x = is_soft ? buf.rlim_cur : buf.rlim_max;
-        }
-
-        /* rlim_t might have different sizes, let's map RLIMIT_INFINITY to (uint64_t) -1, so that it is the same on all
-         * archs */
-        u = x == RLIM_INFINITY ? (uint64_t) -1 : (uint64_t) x;
-
-        return sd_bus_message_append(reply, "t", u);
-}
-
 int bus_track_add_name_many(sd_bus_track *t, char **l) {
         int r = 0;
         char **i;
@@ -1400,323 +571,3 @@ const struct hash_ops bus_message_hash_ops = {
         .compare = trivial_compare_func,
         .free_value = bus_message_unref_wrapper,
 };
-
-/* Shorthand flavors of the sd-bus convenience helpers with destination,path,interface
- * strings encapsulated within a single struct.
- */
-int bus_call_method_async(
-                sd_bus *bus,
-                sd_bus_slot **slot,
-                const BusLocator *locator,
-                const char *member,
-                sd_bus_message_handler_t callback,
-                void *userdata,
-                const char *types, ...) {
-
-        va_list ap;
-        int r;
-
-        assert(locator);
-
-        va_start(ap, types);
-        r = sd_bus_call_method_asyncv(bus, slot, locator->destination, locator->path, locator->interface, member, callback, userdata, types, ap);
-        va_end(ap);
-
-        return r;
-}
-
-int bus_call_method(
-                sd_bus *bus,
-                const BusLocator *locator,
-                const char *member,
-                sd_bus_error *error,
-                sd_bus_message **reply,
-                const char *types, ...) {
-
-        va_list ap;
-        int r;
-
-        assert(locator);
-
-        va_start(ap, types);
-        r = sd_bus_call_methodv(bus, locator->destination, locator->path, locator->interface, member, error, reply, types, ap);
-        va_end(ap);
-
-        return r;
-}
-
-int bus_get_property(
-                sd_bus *bus,
-                const BusLocator *locator,
-                const char *member,
-                sd_bus_error *error,
-                sd_bus_message **reply,
-                const char *type) {
-
-        assert(locator);
-
-        return sd_bus_get_property(bus, locator->destination, locator->path, locator->interface, member, error, reply, type);
-}
-
-int bus_get_property_trivial(
-                sd_bus *bus,
-                const BusLocator *locator,
-                const char *member,
-                sd_bus_error *error,
-                char type, void *ptr) {
-
-        assert(locator);
-
-        return sd_bus_get_property_trivial(bus, locator->destination, locator->path, locator->interface, member, error, type, ptr);
-}
-
-int bus_get_property_string(
-                sd_bus *bus,
-                const BusLocator *locator,
-                const char *member,
-                sd_bus_error *error,
-                char **ret) {
-
-        assert(locator);
-
-        return sd_bus_get_property_string(bus, locator->destination, locator->path, locator->interface, member, error, ret);
-}
-
-int bus_get_property_strv(
-                sd_bus *bus,
-                const BusLocator *locator,
-                const char *member,
-                sd_bus_error *error,
-                char ***ret) {
-
-        assert(locator);
-
-        return sd_bus_get_property_strv(bus, locator->destination, locator->path, locator->interface, member, error, ret);
-}
-
-int bus_set_property(
-                sd_bus *bus,
-                const BusLocator *locator,
-                const char *member,
-                sd_bus_error *error,
-                const char *type, ...) {
-
-        va_list ap;
-        int r;
-
-        assert(locator);
-
-        va_start(ap, type);
-        r = sd_bus_set_propertyv(bus, locator->destination, locator->path, locator->interface, member, error, type, ap);
-        va_end(ap);
-
-        return r;
-}
-
-int bus_match_signal(
-                sd_bus *bus,
-                sd_bus_slot **ret,
-                const BusLocator *locator,
-                const char *member,
-                sd_bus_message_handler_t callback,
-                void *userdata) {
-
-        assert(locator);
-
-        return sd_bus_match_signal(bus, ret, locator->destination, locator->path, locator->interface, member, callback, userdata);
-}
-
-int bus_match_signal_async(
-                sd_bus *bus,
-                sd_bus_slot **ret,
-                const BusLocator *locator,
-                const char *member,
-                sd_bus_message_handler_t callback,
-                sd_bus_message_handler_t install_callback,
-                void *userdata) {
-
-        assert(locator);
-
-        return sd_bus_match_signal_async(bus, ret, locator->destination, locator->path, locator->interface, member, callback, install_callback, userdata);
-}
-
-int bus_message_new_method_call(
-                sd_bus *bus,
-                sd_bus_message **m,
-                const BusLocator *locator,
-                const char *member) {
-
-        assert(locator);
-
-        return sd_bus_message_new_method_call(bus, m, locator->destination, locator->path, locator->interface, member);
-}
-
-int bus_add_implementation(sd_bus *bus, const BusObjectImplementation *impl, void *userdata) {
-        int r;
-
-        log_debug("Registering bus object implementation for path=%s iface=%s", impl->path, impl->interface);
-
-        for (const sd_bus_vtable **p = impl->vtables; p && *p; p++) {
-                r = sd_bus_add_object_vtable(bus, NULL,
-                                             impl->path,
-                                             impl->interface,
-                                             *p,
-                                             userdata);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to register bus path %s with interface %s: %m",
-                                               impl->path,
-                                               impl->interface);
-        }
-
-        for (const BusObjectVtablePair *p = impl->fallback_vtables; p && p->vtable; p++) {
-                r = sd_bus_add_fallback_vtable(bus, NULL,
-                                               impl->path,
-                                               impl->interface,
-                                               p->vtable,
-                                               p->object_find,
-                                               userdata);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to register bus path %s with interface %s: %m",
-                                               impl->path,
-                                               impl->interface);
-        }
-
-        if (impl->node_enumerator) {
-                r = sd_bus_add_node_enumerator(bus, NULL,
-                                               impl->path,
-                                               impl->node_enumerator,
-                                               userdata);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to add node enumerator for %s: %m",
-                                               impl->path);
-        }
-
-        if (impl->manager) {
-                r = sd_bus_add_object_manager(bus, NULL, impl->path);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to add object manager for %s: %m", impl->path);
-        }
-
-        for (size_t i = 0; impl->children && impl->children[i]; i++) {
-                r = bus_add_implementation(bus, impl->children[i], userdata);
-                if (r < 0)
-                        return r;
-        }
-
-        return 0;
-}
-
-static const BusObjectImplementation* find_implementation(
-                const char *pattern,
-                const BusObjectImplementation* const* bus_objects) {
-
-        for (size_t i = 0; bus_objects && bus_objects[i]; i++) {
-                const BusObjectImplementation *impl = bus_objects[i];
-
-                if (STR_IN_SET(pattern, impl->path, impl->interface))
-                        return impl;
-
-                impl = find_implementation(pattern, impl->children);
-                if (impl)
-                        return impl;
-        }
-
-        return NULL;
-}
-
-static int bus_introspect_implementation(
-                struct introspect *intro,
-                const BusObjectImplementation *impl) {
-        int r;
-
-        for (const sd_bus_vtable **p = impl->vtables; p && *p; p++) {
-                r = introspect_write_interface(intro, impl->interface, *p);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to write introspection data: %m");
-        }
-
-        for (const BusObjectVtablePair *p = impl->fallback_vtables; p && p->vtable; p++) {
-                r = introspect_write_interface(intro, impl->interface, p->vtable);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to write introspection data: %m");
-        }
-
-        return 0;
-}
-
-static void list_paths(
-                FILE *out,
-                const BusObjectImplementation* const* bus_objects) {
-
-        for (size_t i = 0; bus_objects[i]; i++) {
-                fprintf(out, "%s\t%s\n", bus_objects[i]->path, bus_objects[i]->interface);
-                if (bus_objects[i]->children)
-                        list_paths(out, bus_objects[i]->children);
-        }
-}
-
-int bus_introspect_implementations(
-                FILE *out,
-                const char *pattern,
-                const BusObjectImplementation* const* bus_objects) {
-
-        const BusObjectImplementation *impl, *main_impl = NULL;
-        _cleanup_free_ char *s = NULL;
-        int r;
-
-        if (streq(pattern, "list")) {
-                list_paths(out, bus_objects);
-                return 0;
-        }
-
-        struct introspect intro = {};
-        bool is_interface = sd_bus_interface_name_is_valid(pattern);
-
-        impl = find_implementation(pattern, bus_objects);
-        if (!impl)
-                return log_error_errno(SYNTHETIC_ERRNO(ENOENT),
-                                       "%s %s not found",
-                                       is_interface ? "Interface" : "Object path",
-                                       pattern);
-
-        /* We use trusted=false here to get all the @org.freedesktop.systemd1.Privileged annotations. */
-        r = introspect_begin(&intro, false);
-        if (r < 0)
-                return log_error_errno(r, "Failed to write introspection data: %m");
-
-        r = introspect_write_default_interfaces(&intro, impl->manager);
-        if (r < 0)
-                return log_error_errno(r, "Failed to write introspection data: %m");
-
-        /* Check if there is a non-fallback path that applies to the given interface, also
-         * print it. This is useful in the case of units: o.fd.systemd1.Service is declared
-         * as a fallback vtable for o/fd/systemd1/unit, and we also want to print
-         * o.fd.systemd1.Unit, which is the non-fallback implementation. */
-        if (impl->fallback_vtables && is_interface)
-                main_impl = find_implementation(impl->path, bus_objects);
-
-        if (main_impl)
-                bus_introspect_implementation(&intro, main_impl);
-
-        if (impl != main_impl)
-                bus_introspect_implementation(&intro, impl);
-
-        _cleanup_set_free_ Set *nodes = NULL;
-
-        for (size_t i = 0; impl->children && impl->children[i]; i++) {
-                r = set_put_strdup(&nodes, impl->children[i]->path);
-                if (r < 0)
-                        return log_oom();
-        }
-
-        r = introspect_write_child_nodes(&intro, nodes, impl->path);
-        if (r < 0)
-                return r;
-
-        r = introspect_finish(&intro, &s);
-        if (r < 0)
-                return log_error_errno(r, "Failed to write introspection data: %m");
-
-        fputs(s, out);
-        return 0;
-}
index ef14217e9374278ca9a74b026b5766af1c8d688e..fd88314c1f44634b4398d51866e4710cb87b4684 100644 (file)
@@ -9,9 +9,7 @@
 #include "sd-bus.h"
 #include "sd-event.h"
 
-#include "bus-locator.h"
 #include "macro.h"
-#include "set.h"
 #include "string-util.h"
 #include "time-util.h"
 
@@ -23,47 +21,6 @@ typedef enum BusTransport {
         _BUS_TRANSPORT_INVALID = -1
 } BusTransport;
 
-typedef struct BusObjectImplementation BusObjectImplementation;
-
-typedef struct BusObjectVtablePair {
-        const sd_bus_vtable *vtable;
-        sd_bus_object_find_t object_find;
-} BusObjectVtablePair;
-
-struct BusObjectImplementation {
-        const char *path;
-        const char *interface;
-        const sd_bus_vtable **vtables;
-        const BusObjectVtablePair *fallback_vtables;
-        sd_bus_node_enumerator_t node_enumerator;
-        bool manager;
-        const BusObjectImplementation **children;
-};
-
-#define BUS_VTABLES(...) ((const sd_bus_vtable* []){ __VA_ARGS__, NULL })
-#define BUS_FALLBACK_VTABLES(...) ((const BusObjectVtablePair[]) { __VA_ARGS__, {} })
-#define BUS_IMPLEMENTATIONS(...) ((const BusObjectImplementation* []) { __VA_ARGS__, NULL })
-
-typedef int (*bus_property_set_t) (sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
-
-struct bus_properties_map {
-        const char *member;
-        const char *signature;
-        bus_property_set_t set;
-        size_t offset;
-};
-
-enum {
-        BUS_MAP_STRDUP          = 1 << 0, /* If set, each "s" message is duplicated. Thus, each pointer needs to be freed. */
-        BUS_MAP_BOOLEAN_AS_BOOL = 1 << 1, /* If set, each "b" message is written to a bool pointer. If not set, "b" is written to a int pointer. */
-};
-
-int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
-
-int bus_message_map_all_properties(sd_bus_message *m, const struct bus_properties_map *map, unsigned flags, sd_bus_error *error, void *userdata);
-int bus_map_all_properties(sd_bus *bus, const char *destination, const char *path, const struct bus_properties_map *map,
-                           unsigned flags, sd_bus_error *error, sd_bus_message **reply, void *userdata);
-
 int bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name);
 
 typedef bool (*check_idle_t)(void *userdata);
@@ -80,117 +37,15 @@ int bus_connect_user_systemd(sd_bus **_bus);
 int bus_connect_transport(BusTransport transport, const char *host, bool user, sd_bus **bus);
 int bus_connect_transport_systemd(BusTransport transport, const char *host, bool user, sd_bus **bus);
 
-typedef int (*bus_message_print_t) (const char *name, const char *expected_value, sd_bus_message *m, bool value, bool all);
-
-int bus_print_property_value(const char *name, const char *expected_value, bool only_value, const char *value);
-int bus_print_property_valuef(const char *name, const char *expected_value, bool only_value, const char *fmt, ...) _printf_(4,5);
-int bus_message_print_all_properties(sd_bus_message *m, bus_message_print_t func, char **filter, bool value, bool all, Set **found_properties);
-int bus_print_all_properties(sd_bus *bus, const char *dest, const char *path, bus_message_print_t func, char **filter, bool value, bool all, Set **found_properties);
-
-int bus_property_get_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
-int bus_property_set_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *value, void *userdata, sd_bus_error *error);
-int bus_property_get_id128(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
-
-#define bus_property_get_usec ((sd_bus_property_get_t) NULL)
-#define bus_property_set_usec ((sd_bus_property_set_t) NULL)
-
-assert_cc(sizeof(int) == sizeof(int32_t));
-#define bus_property_get_int ((sd_bus_property_get_t) NULL)
-
-assert_cc(sizeof(unsigned) == sizeof(uint32_t));
-#define bus_property_get_unsigned ((sd_bus_property_get_t) NULL)
-
-/* On 64bit machines we can use the default serializer for size_t and
- * friends, otherwise we need to cast this manually */
-#if __SIZEOF_SIZE_T__ == 8
-#define bus_property_get_size ((sd_bus_property_get_t) NULL)
-#else
-int bus_property_get_size(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
-#endif
-
-#if __SIZEOF_LONG__ == 8
-#define bus_property_get_long ((sd_bus_property_get_t) NULL)
-#define bus_property_get_ulong ((sd_bus_property_get_t) NULL)
-#else
-int bus_property_get_long(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
-int bus_property_get_ulong(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
-#endif
-
-/* uid_t and friends on Linux 32 bit. This means we can just use the
- * default serializer for 32bit unsigned, for serializing it, and map
- * it to NULL here */
-assert_cc(sizeof(uid_t) == sizeof(uint32_t));
-#define bus_property_get_uid ((sd_bus_property_get_t) NULL)
-
-assert_cc(sizeof(gid_t) == sizeof(uint32_t));
-#define bus_property_get_gid ((sd_bus_property_get_t) NULL)
-
-assert_cc(sizeof(pid_t) == sizeof(uint32_t));
-#define bus_property_get_pid ((sd_bus_property_get_t) NULL)
-
-assert_cc(sizeof(mode_t) == sizeof(uint32_t));
-#define bus_property_get_mode ((sd_bus_property_get_t) NULL)
-
 #define bus_log_parse_error(r) \
         log_error_errno(r, "Failed to parse bus message: %m")
 
 #define bus_log_create_error(r) \
         log_error_errno(r, "Failed to create bus message: %m")
 
-#define BUS_DEFINE_PROPERTY_GET_GLOBAL(function, bus_type, val)         \
-        int function(sd_bus *bus,                                       \
-                     const char *path,                                  \
-                     const char *interface,                             \
-                     const char *property,                              \
-                     sd_bus_message *reply,                             \
-                     void *userdata,                                    \
-                     sd_bus_error *error) {                             \
-                                                                        \
-                assert(bus);                                            \
-                assert(reply);                                          \
-                                                                        \
-                return sd_bus_message_append(reply, bus_type, val);     \
-        }
-
-#define BUS_DEFINE_PROPERTY_GET2(function, bus_type, data_type, get1, get2) \
-        int function(sd_bus *bus,                                       \
-                     const char *path,                                  \
-                     const char *interface,                             \
-                     const char *property,                              \
-                     sd_bus_message *reply,                             \
-                     void *userdata,                                    \
-                     sd_bus_error *error) {                             \
-                                                                        \
-                data_type *data = userdata;                             \
-                                                                        \
-                assert(bus);                                            \
-                assert(reply);                                          \
-                assert(data);                                           \
-                                                                        \
-                return sd_bus_message_append(reply, bus_type,           \
-                                             get2(get1(data)));         \
-        }
-
-#define ident(x) (x)
-#define BUS_DEFINE_PROPERTY_GET(function, bus_type, data_type, get1) \
-        BUS_DEFINE_PROPERTY_GET2(function, bus_type, data_type, get1, ident)
-
-#define ref(x) (*(x))
-#define BUS_DEFINE_PROPERTY_GET_REF(function, bus_type, data_type, get) \
-        BUS_DEFINE_PROPERTY_GET2(function, bus_type, data_type, ref, get)
-
-#define BUS_DEFINE_PROPERTY_GET_ENUM(function, name, type)              \
-        BUS_DEFINE_PROPERTY_GET_REF(function, "s", type, name##_to_string)
-
-#define BUS_PROPERTY_DUAL_TIMESTAMP(name, offset, flags) \
-        SD_BUS_PROPERTY(name, "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, realtime), (flags)), \
-        SD_BUS_PROPERTY(name "Monotonic", "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, monotonic), (flags))
-
 int bus_path_encode_unique(sd_bus *b, const char *prefix, const char *sender_id, const char *external_id, char **ret_path);
 int bus_path_decode_unique(const char *path, const char *prefix, char **ret_sender, char **ret_external);
 
-int bus_property_get_rlimit(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
-
 int bus_track_add_name_many(sd_bus_track *t, char **l);
 
 int bus_open_system_watch_bind_with_description(sd_bus **ret, const char *description);
@@ -201,23 +56,3 @@ static inline int bus_open_system_watch_bind(sd_bus **ret) {
 int bus_reply_pair_array(sd_bus_message *m, char **l);
 
 extern const struct hash_ops bus_message_hash_ops;
-
-/* Shorthand flavors of the sd-bus convenience helpers with destination,path,interface
- * strings encapsulated within a single struct.
- */
-int bus_call_method_async(sd_bus *bus, sd_bus_slot **slot, const BusLocator *locator, const char *member, sd_bus_message_handler_t callback, void *userdata, const char *types, ...);
-int bus_call_method(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, sd_bus_message **reply, const char *types, ...);
-int bus_get_property(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, sd_bus_message **reply, const char *type);
-int bus_get_property_trivial(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, char type, void *ptr);
-int bus_get_property_string(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, char **ret);
-int bus_get_property_strv(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, char ***ret);
-int bus_set_property(sd_bus *bus, const BusLocator *locator, const char *member, sd_bus_error *error, const char *type, ...);
-int bus_match_signal(sd_bus *bus, sd_bus_slot **ret, const BusLocator *locator, const char *member, sd_bus_message_handler_t callback, void *userdata);
-int bus_match_signal_async(sd_bus *bus, sd_bus_slot **ret, const BusLocator *locator, const char *member, sd_bus_message_handler_t callback, sd_bus_message_handler_t install_callback, void *userdata);
-int bus_message_new_method_call(sd_bus *bus, sd_bus_message **m, const BusLocator *locator, const char *member);
-
-int bus_add_implementation(sd_bus *bus, const BusObjectImplementation *impl, void *userdata);
-int bus_introspect_implementations(
-                FILE *out,
-                const char *pattern,
-                const BusObjectImplementation* const* bus_objects);
index 3ee3c0ccba659586b746f02f24a8dc6b98573688..7592dcf18d2d29f0463990502820e45f095e9b66 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
-#include "bus-util.h"
+#include "bus-map-properties.h"
 #include "bus-wait-for-units.h"
 #include "hashmap.h"
 #include "string-util.h"
index e576518c6b8e4aa5c566aad3df5d5e187b3fa679..fdf4d481f6545805d93560244c110c507fc69fa3 100644 (file)
@@ -1223,6 +1223,9 @@ static int verity_partition(
                 const void *root_hash,
                 size_t root_hash_size,
                 const char *verity_data,
+                const char *root_hash_sig_path,
+                const void *root_hash_sig,
+                size_t root_hash_sig_size,
                 DissectImageFlags flags,
                 DecryptedImage *d) {
 
@@ -1267,7 +1270,25 @@ static int verity_partition(
         if (r < 0)
                 return r;
 
-        r = crypt_activate_by_volume_key(cd, name, root_hash, root_hash_size, CRYPT_ACTIVATE_READONLY);
+        if (root_hash_sig || root_hash_sig_path) {
+#if HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY
+                if (root_hash_sig)
+                        r = crypt_activate_by_signed_key(cd, name, root_hash, root_hash_size, root_hash_sig, root_hash_sig_size, CRYPT_ACTIVATE_READONLY);
+                else {
+                        _cleanup_free_ char *hash_sig = NULL;
+                        size_t hash_sig_size;
+
+                        r = read_full_file_full(AT_FDCWD, root_hash_sig_path, 0, &hash_sig, &hash_sig_size);
+                        if (r < 0)
+                                return r;
+
+                        r = crypt_activate_by_signed_key(cd, name, root_hash, root_hash_size, hash_sig, hash_sig_size, CRYPT_ACTIVATE_READONLY);
+                }
+#else
+                r = log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "activation of verity device with signature requested, but not supported by cryptsetup due to missing crypt_activate_by_signed_key()");
+#endif
+        } else
+                r = crypt_activate_by_volume_key(cd, name, root_hash, root_hash_size, CRYPT_ACTIVATE_READONLY);
         if (r < 0)
                 return r;
 
@@ -1287,6 +1308,9 @@ int dissected_image_decrypt(
                 const void *root_hash,
                 size_t root_hash_size,
                 const char *verity_data,
+                const char *root_hash_sig_path,
+                const void *root_hash_sig,
+                size_t root_hash_sig_size,
                 DissectImageFlags flags,
                 DecryptedImage **ret) {
 
@@ -1333,7 +1357,7 @@ int dissected_image_decrypt(
 
                 k = PARTITION_VERITY_OF(i);
                 if (k >= 0) {
-                        r = verity_partition(p, m->partitions + k, root_hash, root_hash_size, verity_data, flags, d);
+                        r = verity_partition(p, m->partitions + k, root_hash, root_hash_size, verity_data, root_hash_sig_path, root_hash_sig, root_hash_sig_size, flags, d);
                         if (r < 0)
                                 return r;
                 }
@@ -1359,6 +1383,9 @@ int dissected_image_decrypt_interactively(
                 const void *root_hash,
                 size_t root_hash_size,
                 const char *verity_data,
+                const char *root_hash_sig_path,
+                const void *root_hash_sig,
+                size_t root_hash_sig_size,
                 DissectImageFlags flags,
                 DecryptedImage **ret) {
 
@@ -1369,7 +1396,7 @@ int dissected_image_decrypt_interactively(
                 n--;
 
         for (;;) {
-                r = dissected_image_decrypt(m, passphrase, root_hash, root_hash_size, verity_data, flags, ret);
+                r = dissected_image_decrypt(m, passphrase, root_hash, root_hash_size, verity_data, root_hash_sig_path, root_hash_sig, root_hash_sig_size, flags, ret);
                 if (r >= 0)
                         return r;
                 if (r == -EKEYREJECTED)
@@ -1421,8 +1448,8 @@ int decrypted_image_relinquish(DecryptedImage *d) {
         return 0;
 }
 
-int verity_metadata_load(const char *image, const char *root_hash_path, void **ret_roothash, size_t *ret_roothash_size, char **ret_verity_data) {
-        _cleanup_free_ char *verity_filename = NULL;
+int verity_metadata_load(const char *image, const char *root_hash_path, void **ret_roothash, size_t *ret_roothash_size, char **ret_verity_data, char **ret_roothashsig) {
+        _cleanup_free_ char *verity_filename = NULL, *roothashsig_filename = NULL;
         _cleanup_free_ void *roothash_decoded = NULL;
         size_t roothash_decoded_size = 0;
         int r;
@@ -1437,6 +1464,8 @@ int verity_metadata_load(const char *image, const char *root_hash_path, void **r
                         *ret_roothash_size = 0;
                 if (ret_verity_data)
                         *ret_verity_data = NULL;
+                if (ret_roothashsig)
+                        *ret_roothashsig = NULL;
                 return 0;
         }
 
@@ -1461,6 +1490,29 @@ int verity_metadata_load(const char *image, const char *root_hash_path, void **r
                 }
         }
 
+        if (ret_roothashsig) {
+                char *e;
+
+                /* Follow naming convention recommended by the relevant RFC:
+                 * https://tools.ietf.org/html/rfc5751#section-3.2.1 */
+                roothashsig_filename = new(char, strlen(image) + STRLEN(".roothash.p7s") + 1);
+                if (!roothashsig_filename)
+                        return -ENOMEM;
+                strcpy(roothashsig_filename, image);
+                e = endswith(roothashsig_filename, ".raw");
+                if (e)
+                        strcpy(e, ".roothash.p7s");
+                else
+                        strcat(roothashsig_filename, ".roothash.p7s");
+
+                r = access(roothashsig_filename, R_OK);
+                if (r < 0) {
+                        if (errno != ENOENT)
+                                return -errno;
+                        roothashsig_filename = mfree(roothashsig_filename);
+                }
+        }
+
         if (ret_roothash) {
                 _cleanup_free_ char *text = NULL;
                 assert(ret_roothash_size);
@@ -1507,6 +1559,8 @@ int verity_metadata_load(const char *image, const char *root_hash_path, void **r
         }
         if (ret_verity_data)
                 *ret_verity_data = TAKE_PTR(verity_filename);
+        if (roothashsig_filename)
+                *ret_roothashsig = TAKE_PTR(roothashsig_filename);
 
         return 1;
 }
index 6a53b949486fb52ee55f3004d969745da97bc592..c7d078f4b7b5d9028823bda626ef1b96d40be2fe 100644 (file)
@@ -87,8 +87,8 @@ int dissect_image_and_warn(int fd, const char *name, const void *root_hash, size
 DissectedImage* dissected_image_unref(DissectedImage *m);
 DEFINE_TRIVIAL_CLEANUP_FUNC(DissectedImage*, dissected_image_unref);
 
-int dissected_image_decrypt(DissectedImage *m, const char *passphrase, const void *root_hash, size_t root_hash_size, const char *verity_data, DissectImageFlags flags, DecryptedImage **ret);
-int dissected_image_decrypt_interactively(DissectedImage *m, const char *passphrase, const void *root_hash, size_t root_hash_size, const char *verity_data, DissectImageFlags flags, DecryptedImage **ret);
+int dissected_image_decrypt(DissectedImage *m, const char *passphrase, const void *root_hash, size_t root_hash_size, const char *verity_data, const char *root_hash_sig_path, const void *root_hash_sig, size_t root_hash_sig_size, DissectImageFlags flags, DecryptedImage **ret);
+int dissected_image_decrypt_interactively(DissectedImage *m, const char *passphrase, const void *root_hash, size_t root_hash_size, const char *verity_data, const char *root_hash_sig_path, const void *root_hash_sig, size_t root_hash_sig_size, DissectImageFlags flags, DecryptedImage **ret);
 int dissected_image_mount(DissectedImage *m, const char *dest, uid_t uid_shift, DissectImageFlags flags);
 
 int dissected_image_acquire_metadata(DissectedImage *m);
@@ -100,6 +100,6 @@ int decrypted_image_relinquish(DecryptedImage *d);
 const char* partition_designator_to_string(int i) _const_;
 int partition_designator_from_string(const char *name) _pure_;
 
-int verity_metadata_load(const char *image, const char *root_hash_path, void **ret_roothash, size_t *ret_roothash_size, char **ret_verity_data);
+int verity_metadata_load(const char *image, const char *root_hash_path, void **ret_roothash, size_t *ret_roothash_size, char **ret_verity_data, char **ret_roothashsig);
 bool dissected_image_can_do_verity(const DissectedImage *image, unsigned partition_designator);
 bool dissected_image_has_verity(const DissectedImage *image, unsigned partition_designator);
index 2693b63233ed3abe9bd8db51661ae9a85726ae1f..932da0c8531eb5fb0e949b361ad6f4977da4ebb5 100644 (file)
@@ -204,7 +204,7 @@ static int unit_file_find_dirs(
         type = unit_name_to_type(name);
         if (type < 0)
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
-                                       "Failed to to derive unit type from unit name: %s",
+                                       "Failed to derive unit type from unit name: %s",
                                        name);
 
         if (is_instance) {
@@ -254,7 +254,7 @@ int unit_file_find_dropin_paths(
                 type = unit_name_to_type(n);
                 if (type < 0)
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
-                                               "Failed to to derive unit type from unit name: %s", n);
+                                               "Failed to derive unit type from unit name: %s", n);
 
                 /* Special top level drop in for "<unit type>.<suffix>". Add this last as it's the most generic
                  * and should be able to be overridden by more specific drop-ins. */
index b6ad43b856ec2b1f3b61b48991728241ec922dc6..9411fc8cef8647b2ab243734bc6f1109a11960e5 100644 (file)
@@ -713,6 +713,76 @@ int efi_loader_get_features(uint64_t *ret) {
         return 0;
 }
 
+int efi_loader_get_config_timeout_one_shot(usec_t *ret) {
+        _cleanup_free_ char *v = NULL, *fn = NULL;
+        static struct stat cache_stat = {};
+        struct stat new_stat;
+        static usec_t cache;
+        uint64_t sec;
+        int r;
+
+        assert(ret);
+
+        fn = efi_variable_path(EFI_VENDOR_LOADER, "LoaderConfigTimeoutOneShot");
+        if (!fn)
+                return -ENOMEM;
+
+        /* stat() the EFI variable, to see if the mtime changed. If it did we need to cache again. */
+        if (stat(fn, &new_stat) < 0)
+                return -errno;
+
+        if (stat_inode_unmodified(&new_stat, &cache_stat)) {
+                *ret = cache;
+                return 0;
+        }
+
+        r = efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderConfigTimeoutOneShot", &v);
+        if (r < 0)
+                return r;
+
+        r = safe_atou64(v, &sec);
+        if (r < 0)
+                return r;
+        if (sec > USEC_INFINITY / USEC_PER_SEC)
+                return -ERANGE;
+
+        cache_stat = new_stat;
+        *ret = cache = sec * USEC_PER_SEC; /* return in µs */
+        return 0;
+}
+
+int efi_loader_update_entry_one_shot_cache(char **cache, struct stat *cache_stat) {
+        _cleanup_free_ char *fn = NULL, *v = NULL;
+        struct stat new_stat;
+        int r;
+
+        assert(cache);
+        assert(cache_stat);
+
+        fn = efi_variable_path(EFI_VENDOR_LOADER, "LoaderEntryOneShot");
+        if (!fn)
+                return -ENOMEM;
+
+        /* stat() the EFI variable, to see if the mtime changed. If it did we need to cache again. */
+        if (stat(fn, &new_stat) < 0)
+                return -errno;
+
+        if (stat_inode_unmodified(&new_stat, cache_stat))
+                return 0;
+
+        r = efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderEntryOneShot", &v);
+        if (r < 0)
+                return r;
+
+        if (!efi_loader_entry_name_valid(v))
+                return -EINVAL;
+
+        *cache_stat = new_stat;
+        free_and_replace(*cache, v);
+
+        return 0;
+}
+
 #endif
 
 bool efi_loader_entry_name_valid(const char *s) {
index 96208d25bf5ea053687d156e579063cf72164d64..171274a0e342edafdc7cf798c45584deab8f035d 100644 (file)
@@ -3,6 +3,8 @@
 
 #include "efivars.h"
 
+#include <sys/stat.h>
+
 #if ENABLE_EFI
 
 int efi_reboot_to_firmware_supported(void);
@@ -23,6 +25,9 @@ int efi_loader_get_entries(char ***ret);
 
 int efi_loader_get_features(uint64_t *ret);
 
+int efi_loader_get_config_timeout_one_shot(usec_t *ret);
+int efi_loader_update_entry_one_shot_cache(char **cache, struct stat *cache_stat);
+
 #else
 
 static inline int efi_reboot_to_firmware_supported(void) {
@@ -77,6 +82,14 @@ static inline int efi_loader_get_features(uint64_t *ret) {
         return -EOPNOTSUPP;
 }
 
+static inline int efi_loader_get_config_timeout_one_shot(usec_t *ret) {
+        return -EOPNOTSUPP;
+}
+
+static inline int efi_loader_update_entry_one_shot_cache(char **cache, struct stat *cache_stat) {
+        return -EOPNOTSUPP;
+}
+
 #endif
 
 bool efi_loader_entry_name_valid(const char *s);
index 20b4ebd39b584400e129799722e095e0524a3c07..1851f1d14a22a56e01427763c3926255ead3072c 100644 (file)
@@ -130,3 +130,9 @@ int table_print_json(Table *t, FILE *f, JsonFormatFlags json_flags);
 
 #define table_log_add_error(r) \
         log_error_errno(r, "Failed to add cell(s) to table: %m")
+
+#define table_log_print_error(r) \
+        log_error_errno(r, "Failed to print table: %m")
+
+#define table_log_sort_error(r) \
+        log_error_errno(r, "Failed to sort table: %m")
index bb2eff7387945628764c94aa9e45115e352eafdf..fb5e166ff016ea673b469d173a686a27f53fd102 100644 (file)
@@ -1236,8 +1236,7 @@ static int unit_file_load(
                                                "%s: unit type %s cannot be templated, ignoring.", path, unit_type_to_string(type));
 
                 if (!(flags & SEARCH_LOAD)) {
-                        r = lstat(path, &st);
-                        if (r < 0)
+                        if (lstat(path, &st) < 0)
                                 return -errno;
 
                         if (null_or_empty(&st))
@@ -1324,26 +1323,40 @@ static int unit_file_load_or_readlink(
                 const char *path,
                 const char *root_dir,
                 SearchFlags flags) {
-
-        _cleanup_free_ char *target = NULL;
+        _cleanup_free_ char *resolved = NULL;
+        struct stat st;
         int r;
 
         r = unit_file_load(c, info, path, root_dir, flags);
         if (r != -ELOOP || (flags & SEARCH_DROPIN))
                 return r;
 
-        /* This is a symlink, let's read it. */
+        r = chase_symlinks(path, root_dir, CHASE_WARN | CHASE_NONEXISTENT, &resolved, NULL);
+        if (r >= 0 &&
+            root_dir &&
+            path_equal_ptr(path_startswith(resolved, root_dir), "dev/null"))
+                /* When looking under root_dir, we can't expect /dev/ to be mounted,
+                 * so let's see if the path is a (possibly dangling) symlink to /dev/null. */
+                info->type = UNIT_FILE_TYPE_MASKED;
 
-        r = readlink_malloc(path, &target);
-        if (r < 0)
-                return r;
+        else if (r > 0 &&
+                 stat(resolved, &st) >= 0 &&
+                 null_or_empty(&st))
 
-        if (path_equal(target, "/dev/null"))
                 info->type = UNIT_FILE_TYPE_MASKED;
+
         else {
+                _cleanup_free_ char *target = NULL;
                 const char *bn;
                 UnitType a, b;
 
+                /* This is a symlink, let's read it. We read the link again, because last time
+                 * we followed the link until resolution, and here we need to do one step. */
+
+                r = readlink_malloc(path, &target);
+                if (r < 0)
+                        return r;
+
                 bn = basename(target);
 
                 if (unit_name_is_valid(info->name, UNIT_NAME_PLAIN)) {
index beee59c831a735042a94521b40eb41840363e35b..b065c1fe4df5d5d71da9c204e97c0c5bc142c57b 100644 (file)
@@ -1435,7 +1435,7 @@ enum nl80211_commands {
  *     rates as defined by IEEE 802.11 7.3.2.2 but without the length
  *     restriction (at most %NL80211_MAX_SUPP_RATES).
  * @NL80211_ATTR_STA_VLAN: interface index of VLAN interface to move station
- *     to, or the AP interface the station was originally added to to.
+ *     to, or the AP interface the station was originally added to.
  * @NL80211_ATTR_STA_INFO: information about a station, part of station info
  *     given for %NL80211_CMD_GET_STATION, nested attribute containing
  *     info as possible, see &enum nl80211_sta_info.
index 570377dc7692b2d21cefef17c154fef66b5c3bbc..fee6ccdf2a1e3f7040b4dd7dbe4ca8ae9f8a7718 100644 (file)
@@ -573,19 +573,22 @@ static int output_short(
                 if (config_file &&
                     message_len >= config_file_len &&
                     memcmp(message, config_file, config_file_len) == 0 &&
-                    IN_SET(message[config_file_len], ':', ' ', '\0') &&
+                    (message_len == config_file_len || IN_SET(message[config_file_len], ':', ' ')) &&
                     (!highlight || highlight_shifted[0] == 0 || highlight_shifted[0] > config_file_len)) {
 
                         _cleanup_free_ char *t = NULL, *urlified = NULL;
 
                         t = strndup(config_file, config_file_len);
                         if (t && terminal_urlify_path(t, NULL, &urlified) >= 0) {
-                                size_t shift = strlen(urlified) - config_file_len;
+                                size_t urlified_len = strlen(urlified);
+                                size_t shift = urlified_len - config_file_len;
                                 char *joined;
 
-                                joined = strjoin(urlified, message + config_file_len);
+                                joined = realloc(urlified, message_len + shift);
                                 if (joined) {
+                                        memcpy(joined + urlified_len, message + config_file_len, message_len - config_file_len);
                                         free_and_replace(message, joined);
+                                        TAKE_PTR(urlified);
                                         message_len += shift;
                                         if (highlight) {
                                                 highlight_shifted[0] += shift;
index 90382acbd97f4b9454835cb89fd388a1dd870bb9..926b4d42a02996ef93a207a6610904a04fa4adf2 100644 (file)
@@ -9,6 +9,7 @@ static const char* const macvlan_mode_table[_NETDEV_MACVLAN_MODE_MAX] = {
         [NETDEV_MACVLAN_MODE_VEPA] = "vepa",
         [NETDEV_MACVLAN_MODE_BRIDGE] = "bridge",
         [NETDEV_MACVLAN_MODE_PASSTHRU] = "passthru",
+        [NETDEV_MACVLAN_MODE_SOURCE] = "source",
 };
 
 DEFINE_STRING_TABLE_LOOKUP(macvlan_mode, MacVlanMode);
index 24f864ac51c72bf3dbf15f3705b5f8b8aa8bc339..7670bbf4020e775ea0ff325573a78621728a1026 100644 (file)
@@ -8,6 +8,7 @@ typedef enum MacVlanMode {
         NETDEV_MACVLAN_MODE_VEPA = MACVLAN_MODE_VEPA,
         NETDEV_MACVLAN_MODE_BRIDGE = MACVLAN_MODE_BRIDGE,
         NETDEV_MACVLAN_MODE_PASSTHRU = MACVLAN_MODE_PASSTHRU,
+        NETDEV_MACVLAN_MODE_SOURCE = MACVLAN_MODE_SOURCE,
         _NETDEV_MACVLAN_MODE_MAX,
         _NETDEV_MACVLAN_MODE_INVALID = -1
 } MacVlanMode;
index e3aee57ac816e7ae9e96c1ec1d4fcb32e52606d6..1868e8aede9bd6656d02c1fc50db7844f02ecfe3 100644 (file)
@@ -27,12 +27,20 @@ shared_sources = files('''
         bpf-program.h
         bridge-util.c
         bridge-util.h
+        bus-get-properties.c
+        bus-get-properties.h
         bus-locator.c
         bus-locator.h
         bus-log-control-api.c
         bus-log-control-api.h
+        bus-map-properties.c
+        bus-map-properties.h
+        bus-object.c
+        bus-object.h
         bus-polkit.c
         bus-polkit.h
+        bus-print-properties.c
+        bus-print-properties.h
         bus-unit-procs.c
         bus-unit-procs.h
         bus-unit-util.c
index 9173cf2ffde0a65c8481b4891809773deaeaab08..3e64d423c837df89b1d528318d39bb772525982a 100644 (file)
@@ -51,7 +51,7 @@ int module_load_and_warn(struct kmod_ctx *ctx, const char *module, bool verbose)
                                          "Inserted module '%s'", kmod_module_get_name(mod));
                         else if (err == KMOD_PROBE_APPLY_BLACKLIST)
                                 log_full(verbose ? LOG_INFO : LOG_DEBUG,
-                                         "Module '%s' is blacklisted", kmod_module_get_name(mod));
+                                         "Module '%s' is deny-listed", kmod_module_get_name(mod));
                         else {
                                 assert(err < 0);
 
index d188e6bd7f63dea62fec2f2bc476b587bb4cd4cd..b3fac13f7ee9cd487c1edd518c8435c0f1de9ca3 100644 (file)
@@ -58,8 +58,8 @@ int umount_recursive(const char *prefix, int flags) {
                         if (!path_startswith(path, prefix))
                                 continue;
 
-                        if (umount2(path, flags) < 0) {
-                                r = log_debug_errno(errno, "Failed to umount %s: %m", path);
+                        if (umount2(path, flags | UMOUNT_NOFOLLOW) < 0) {
+                                log_debug_errno(errno, "Failed to umount %s, ignoring: %m", path);
                                 continue;
                         }
 
@@ -70,7 +70,6 @@ int umount_recursive(const char *prefix, int flags) {
 
                         break;
                 }
-
         } while (again);
 
         return n;
@@ -136,7 +135,7 @@ int bind_remount_recursive_with_mountinfo(
                 const char *prefix,
                 unsigned long new_flags,
                 unsigned long flags_mask,
-                char **blacklist,
+                char **deny_list,
                 FILE *proc_self_mountinfo) {
 
         _cleanup_set_free_free_ Set *done = NULL;
@@ -154,8 +153,8 @@ int bind_remount_recursive_with_mountinfo(
          * do not have any effect on future submounts that might get propagated, they might be writable. This includes
          * future submounts that have been triggered via autofs.
          *
-         * If the "blacklist" parameter is specified it may contain a list of subtrees to exclude from the
-         * remount operation. Note that we'll ignore the blacklist for the top-level path. */
+         * If the "deny_list" parameter is specified it may contain a list of subtrees to exclude from the
+         * remount operation. Note that we'll ignore the deny list for the top-level path. */
 
         simplified = strdup(prefix);
         if (!simplified)
@@ -203,13 +202,13 @@ int bind_remount_recursive_with_mountinfo(
                         if (!path_startswith(path, simplified))
                                 continue;
 
-                        /* Ignore this mount if it is blacklisted, but only if it isn't the top-level mount
+                        /* Ignore this mount if it is deny-listed, but only if it isn't the top-level mount
                          * we shall operate on. */
                         if (!path_equal(path, simplified)) {
-                                bool blacklisted = false;
+                                bool deny_listed = false;
                                 char **i;
 
-                                STRV_FOREACH(i, blacklist) {
+                                STRV_FOREACH(i, deny_list) {
                                         if (path_equal(*i, simplified))
                                                 continue;
 
@@ -217,13 +216,13 @@ int bind_remount_recursive_with_mountinfo(
                                                 continue;
 
                                         if (path_startswith(path, *i)) {
-                                                blacklisted = true;
-                                                log_debug("Not remounting %s blacklisted by %s, called for %s",
+                                                deny_listed = true;
+                                                log_debug("Not remounting %s deny-listed by %s, called for %s",
                                                           path, *i, simplified);
                                                 break;
                                         }
                                 }
-                                if (blacklisted)
+                                if (deny_listed)
                                         continue;
                         }
 
@@ -314,7 +313,7 @@ int bind_remount_recursive(
                 const char *prefix,
                 unsigned long new_flags,
                 unsigned long flags_mask,
-                char **blacklist) {
+                char **deny_list) {
 
         _cleanup_fclose_ FILE *proc_self_mountinfo = NULL;
         int r;
@@ -323,7 +322,7 @@ int bind_remount_recursive(
         if (r < 0)
                 return r;
 
-        return bind_remount_recursive_with_mountinfo(prefix, new_flags, flags_mask, blacklist, proc_self_mountinfo);
+        return bind_remount_recursive_with_mountinfo(prefix, new_flags, flags_mask, deny_list, proc_self_mountinfo);
 }
 
 int bind_remount_one_with_mountinfo(
index c7c89b3345cb3b74f80ac92234ea798cede5d2fc..5934d716786e5ec8e745236d10723f35db3cfe23 100644 (file)
@@ -3,7 +3,9 @@
 
 #include <mntent.h>
 #include <stdio.h>
+#include <unistd.h>
 
+#include "errno-util.h"
 #include "macro.h"
 
 /* 4MB for contents of regular files, 64k inodes for directories, symbolic links and device specials,
@@ -28,8 +30,8 @@
 
 int repeat_unmount(const char *path, int flags);
 int umount_recursive(const char *target, int flags);
-int bind_remount_recursive(const char *prefix, unsigned long new_flags, unsigned long flags_mask, char **blacklist);
-int bind_remount_recursive_with_mountinfo(const char *prefix, unsigned long new_flags, unsigned long flags_mask, char **blacklist, FILE *proc_self_mountinfo);
+int bind_remount_recursive(const char *prefix, unsigned long new_flags, unsigned long flags_mask, char **deny_list);
+int bind_remount_recursive_with_mountinfo(const char *prefix, unsigned long new_flags, unsigned long flags_mask, char **deny_list, FILE *proc_self_mountinfo);
 int bind_remount_one_with_mountinfo(const char *path, unsigned long new_flags, unsigned long flags_mask, FILE *proc_self_mountinfo);
 
 int mount_move_root(const char *path);
@@ -53,3 +55,12 @@ int mount_option_mangle(
                 char **ret_remaining_options);
 
 int mode_to_inaccessible_node(const char *runtime_dir, mode_t mode, char **dest);
+
+/* Useful for usage with _cleanup_(), unmounts, removes a directory and frees the pointer */
+static inline void umount_and_rmdir_and_free(char *p) {
+        PROTECT_ERRNO;
+        (void) umount_recursive(p, 0);
+        (void) rmdir(p);
+        free(p);
+}
+DEFINE_TRIVIAL_CLEANUP_FUNC(char*, umount_and_rmdir_and_free);
index b4a7d86afedeb9485632b51c7cd69b18774e0311..632964df4491c81de264cb1112eae0c3676b02f2 100644 (file)
@@ -151,6 +151,28 @@ char *pkcs11_token_label(const CK_TOKEN_INFO *token_info) {
         return t;
 }
 
+char *pkcs11_token_manufacturer_id(const CK_TOKEN_INFO *token_info) {
+        char *t;
+
+        t = strndup((char*) token_info->manufacturerID, sizeof(token_info->manufacturerID));
+        if (!t)
+                return NULL;
+
+        strstrip(t);
+        return t;
+}
+
+char *pkcs11_token_model(const CK_TOKEN_INFO *token_info) {
+        char *t;
+
+        t = strndup((char*) token_info->model, sizeof(token_info->model));
+        if (!t)
+                return NULL;
+
+        strstrip(t);
+        return t;
+}
+
 int pkcs11_token_login(
                 CK_FUNCTION_LIST *m,
                 CK_SESSION_HANDLE session,
@@ -165,9 +187,8 @@ int pkcs11_token_login(
         _cleanup_free_ char *token_uri_string = NULL, *token_uri_escaped = NULL, *id = NULL, *token_label = NULL;
         _cleanup_(p11_kit_uri_freep) P11KitUri *token_uri = NULL;
         CK_TOKEN_INFO updated_token_info;
-        int uri_result;
+        int uri_result, r;
         CK_RV rv;
-        int r;
 
         assert(m);
         assert(token_info);
@@ -211,28 +232,8 @@ int pkcs11_token_login(
 
         for (unsigned tries = 0; tries < 3; tries++) {
                 _cleanup_strv_free_erase_ char **passwords = NULL;
-                _cleanup_free_ char *text = NULL;
                 char **i, *e;
 
-                if (FLAGS_SET(token_info->flags, CKF_USER_PIN_FINAL_TRY))
-                        r = asprintf(&text,
-                                     "Please enter correct PIN for security token '%s' in order to unlock %s (final try):",
-                                     token_label, friendly_name);
-                else if (FLAGS_SET(token_info->flags, CKF_USER_PIN_COUNT_LOW))
-                        r = asprintf(&text,
-                                     "PIN has been entered incorrectly previously, please enter correct PIN for security token '%s' in order to unlock %s:",
-                                     token_label, friendly_name);
-                else if (tries == 0)
-                        r = asprintf(&text,
-                                     "Please enter PIN for security token '%s' in order to unlock %s:",
-                                     token_label, friendly_name);
-                else
-                        r = asprintf(&text,
-                                     "Please enter PIN for security token '%s' in order to unlock %s (try #%u):",
-                                     token_label, friendly_name, tries+1);
-                if (r < 0)
-                        return log_oom();
-
                 e = getenv("PIN");
                 if (e) {
                         passwords = strv_new(e);
@@ -243,6 +244,27 @@ int pkcs11_token_login(
                         if (unsetenv("PIN") < 0)
                                 return log_error_errno(errno, "Failed to unset $PIN: %m");
                 } else {
+                        _cleanup_free_ char *text = NULL;
+
+                        if (FLAGS_SET(token_info->flags, CKF_USER_PIN_FINAL_TRY))
+                                r = asprintf(&text,
+                                             "Please enter correct PIN for security token '%s' in order to unlock %s (final try):",
+                                             token_label, friendly_name);
+                        else if (FLAGS_SET(token_info->flags, CKF_USER_PIN_COUNT_LOW))
+                                r = asprintf(&text,
+                                             "PIN has been entered incorrectly previously, please enter correct PIN for security token '%s' in order to unlock %s:",
+                                             token_label, friendly_name);
+                        else if (tries == 0)
+                                r = asprintf(&text,
+                                             "Please enter PIN for security token '%s' in order to unlock %s:",
+                                             token_label, friendly_name);
+                        else
+                                r = asprintf(&text,
+                                             "Please enter PIN for security token '%s' in order to unlock %s (try #%u):",
+                                             token_label, friendly_name, tries+1);
+                        if (r < 0)
+                                return log_oom();
+
                         /* We never cache PINs, simply because it's fatal if we use wrong PINs, since usually there are only 3 tries */
                         r = ask_password_auto(text, icon_name, id, keyname, until, 0, &passwords);
                         if (r < 0)
@@ -702,7 +724,6 @@ static int token_process(
         assert(m);
         assert(slot_info);
         assert(token_info);
-        assert(search_uri);
 
         token_label = pkcs11_token_label(token_info);
         if (!token_label)
@@ -740,7 +761,6 @@ static int slot_process(
         CK_RV rv;
 
         assert(m);
-        assert(search_uri);
 
         /* We return -EAGAIN for all failures we can attribute to a specific slot in some way, so that the
          * caller might try other slots before giving up. */
@@ -786,7 +806,7 @@ static int slot_process(
                 return -EAGAIN;
         }
 
-        if (!p11_kit_uri_match_token_info(search_uri, &token_info)) {
+        if (search_uri && !p11_kit_uri_match_token_info(search_uri, &token_info)) {
                 log_debug("Found non-matching token with URI %s.", token_uri_string);
                 return -EAGAIN;
         }
@@ -820,7 +840,6 @@ static int module_process(
         int r;
 
         assert(m);
-        assert(search_uri);
 
         /* We ignore most errors from modules here, in order to skip over faulty modules: one faulty module
          * should not have the effect that we don't try the others anymore. We indicate such per-module
@@ -883,14 +902,14 @@ int pkcs11_find_token(
         _cleanup_(p11_kit_uri_freep) P11KitUri *search_uri = NULL;
         int r;
 
-        assert(pkcs11_uri);
-
         /* Execute the specified callback for each matching token found. If nothing is found returns
          * -EAGAIN. Logs about all errors, except for EAGAIN, which the caller has to log about. */
 
-        r = uri_from_string(pkcs11_uri, &search_uri);
-        if (r < 0)
-                return log_error_errno(r, "Failed to parse PKCS#11 URI '%s': %m", pkcs11_uri);
+        if (pkcs11_uri) {
+                r = uri_from_string(pkcs11_uri, &search_uri);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to parse PKCS#11 URI '%s': %m", pkcs11_uri);
+        }
 
         modules = p11_kit_modules_load_and_initialize(0);
         if (!modules)
index 46791eb23b74c1a627282e9da3c63ad179d343ca..959e7c3e0d9c90f63760ab1898aae978beb81dcc 100644 (file)
@@ -27,6 +27,8 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(CK_FUNCTION_LIST**, p11_kit_modules_finalize_and_rel
 CK_RV pkcs11_get_slot_list_malloc(CK_FUNCTION_LIST *m, CK_SLOT_ID **ret_slotids, CK_ULONG *ret_n_slotids);
 
 char *pkcs11_token_label(const CK_TOKEN_INFO *token_info);
+char *pkcs11_token_manufacturer_id(const CK_TOKEN_INFO *token_info);
+char *pkcs11_token_model(const CK_TOKEN_INFO *token_info);
 
 int pkcs11_token_login(CK_FUNCTION_LIST *m, CK_SESSION_HANDLE session, CK_SLOT_ID slotid, const CK_TOKEN_INFO *token_info, const char *friendly_name, const char *icon_name, const char *keyname, usec_t until, char **ret_used_pin);
 
index 6a3cfe770ca416fc175efc470c535d1b4a48e542..a8dd069a758dbb82edd9266bddb63e1cbadcee49 100644 (file)
@@ -24,7 +24,7 @@
 
 const uint32_t seccomp_local_archs[] = {
 
-        /* Note: always list the native arch we are compiled as last, so that users can blacklist seccomp(), but our own calls to it still succeed */
+        /* Note: always list the native arch we are compiled as last, so that users can deny-list seccomp(), but our own calls to it still succeed */
 
 #if defined(__x86_64__) && defined(__ILP32__)
                 SCMP_ARCH_X86,
@@ -1112,7 +1112,7 @@ int seccomp_parse_syscall_filter(
 
                 /* If we previously wanted to forbid a syscall and now
                  * we want to allow it, then remove it from the list. */
-                if (!(flags & SECCOMP_PARSE_INVERT) == !!(flags & SECCOMP_PARSE_WHITELIST)) {
+                if (!(flags & SECCOMP_PARSE_INVERT) == !!(flags & SECCOMP_PARSE_ALLOW_LIST)) {
                         r = hashmap_put(filter, INT_TO_PTR(id + 1), INT_TO_PTR(errno_num));
                         if (r < 0)
                                 switch (r) {
@@ -1315,7 +1315,7 @@ int seccomp_protect_syslog(void) {
         return 0;
 }
 
-int seccomp_restrict_address_families(Set *address_families, bool whitelist) {
+int seccomp_restrict_address_families(Set *address_families, bool allow_list) {
         uint32_t arch;
         int r;
 
@@ -1362,13 +1362,13 @@ int seccomp_restrict_address_families(Set *address_families, bool whitelist) {
                 if (r < 0)
                         return r;
 
-                if (whitelist) {
+                if (allow_list) {
                         int af, first = 0, last = 0;
                         void *afp;
 
-                        /* If this is a whitelist, we first block the address families that are out of range and then
-                         * everything that is not in the set. First, we find the lowest and highest address family in
-                         * the set. */
+                        /* If this is an allow list, we first block the address families that are out of
+                         * range and then everything that is not in the set. First, we find the lowest and
+                         * highest address family in the set. */
 
                         SET_FOREACH(afp, address_families, i) {
                                 af = PTR_TO_INT(afp);
@@ -1448,9 +1448,8 @@ int seccomp_restrict_address_families(Set *address_families, bool whitelist) {
                 } else {
                         void *af;
 
-                        /* If this is a blacklist, then generate one rule for
-                         * each address family that are then combined in OR
-                         * checks. */
+                        /* If this is a deny list, then generate one rule for each address family that are
+                         * then combined in OR checks. */
 
                         SET_FOREACH(af, address_families, i) {
 
@@ -1506,11 +1505,11 @@ int seccomp_restrict_realtime(void) {
                         return r;
 
                 /* Go through all policies with lower values than that, and block them -- unless they appear in the
-                 * whitelist. */
+                 * allow list. */
                 for (p = 0; p < max_policy; p++) {
                         bool good = false;
 
-                        /* Check if this is in the whitelist. */
+                        /* Check if this is in the allow list. */
                         for (i = 0; i < ELEMENTSOF(permitted_policies); i++)
                                 if (permitted_policies[i] == p) {
                                         good = true;
@@ -1533,8 +1532,8 @@ int seccomp_restrict_realtime(void) {
                         }
                 }
 
-                /* Blacklist all other policies, i.e. the ones with higher values. Note that all comparisons are
-                 * unsigned here, hence no need no check for < 0 values. */
+                /* Deny-list all other policies, i.e. the ones with higher values. Note that all comparisons
+                 * are unsigned here, hence no need no check for < 0 values. */
                 r = seccomp_rule_add_exact(
                                 seccomp,
                                 SCMP_ACT_ERRNO(EPERM),
@@ -1742,17 +1741,13 @@ int seccomp_restrict_archs(Set *archs) {
         return 0;
 }
 
-int parse_syscall_archs(char **l, Set **archs) {
-        _cleanup_set_free_ Set *_archs = NULL;
+int parse_syscall_archs(char **l, Set **ret_archs) {
+        _cleanup_set_free_ Set *archs = NULL;
         char **s;
         int r;
 
         assert(l);
-        assert(archs);
-
-        r = set_ensure_allocated(&_archs, NULL);
-        if (r < 0)
-                return r;
+        assert(ret_archs);
 
         STRV_FOREACH(s, l) {
                 uint32_t a;
@@ -1761,13 +1756,12 @@ int parse_syscall_archs(char **l, Set **archs) {
                 if (r < 0)
                         return -EINVAL;
 
-                r = set_put(_archs, UINT32_TO_PTR(a + 1));
+                r = set_ensure_put(&archs, NULL, UINT32_TO_PTR(a + 1));
                 if (r < 0)
                         return -ENOMEM;
         }
 
-        *archs = TAKE_PTR(_archs);
-
+        *ret_archs = TAKE_PTR(archs);
         return 0;
 }
 
index 0b48e74a87fe15e5abca7adb8a30d6ce26b0f4d4..ef970434c6b0ab9fc100f585bf6255a77eb33f52 100644 (file)
@@ -66,7 +66,7 @@ int seccomp_load_syscall_filter_set_raw(uint32_t default_action, Hashmap* set, u
 
 typedef enum SeccompParseFlags {
         SECCOMP_PARSE_INVERT     = 1 << 0,
-        SECCOMP_PARSE_WHITELIST  = 1 << 1,
+        SECCOMP_PARSE_ALLOW_LIST = 1 << 1,
         SECCOMP_PARSE_LOG        = 1 << 2,
         SECCOMP_PARSE_PERMISSIVE = 1 << 3,
 } SeccompParseFlags;
@@ -83,7 +83,7 @@ int seccomp_restrict_archs(Set *archs);
 int seccomp_restrict_namespaces(unsigned long retain);
 int seccomp_protect_sysctl(void);
 int seccomp_protect_syslog(void);
-int seccomp_restrict_address_families(Set *address_families, bool whitelist);
+int seccomp_restrict_address_families(Set *address_families, bool allow_list);
 int seccomp_restrict_realtime(void);
 int seccomp_memory_deny_write_execute(void);
 int seccomp_lock_personality(unsigned long personality);
@@ -105,6 +105,6 @@ extern const uint32_t seccomp_local_archs[];
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(scmp_filter_ctx, seccomp_release);
 
-int parse_syscall_archs(char **l, Set **archs);
+int parse_syscall_archs(char **l, Set **ret_archs);
 
 uint32_t scmp_act_kill_process(void);
index 76bff61d58b4a707d6e8daed688f38f981e3bf28..928c5961e7a9ec432a826f2eeaf12d3ac5ddb874 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 #pragma once
 
-#include "bus-util.h"
+#include "bus-object.h"
 
 int service_parse_argv(
                 const char *service,
index ecf8e8f623720f14231d69f0de378d90f848ba31..ff662ecfe0cdc27393234470e82da99ae8b2cf4c 100644 (file)
@@ -21,6 +21,7 @@
 #include "env-util.h"
 #include "fs-util.h"
 #include "log.h"
+#include "namespace-util.h"
 #include "path-util.h"
 #include "random-util.h"
 #include "strv.h"
@@ -137,10 +138,7 @@ bool have_namespaces(void) {
 
         if (pid == 0) {
                 /* child */
-                if (unshare(CLONE_NEWNS) < 0)
-                        _exit(EXIT_FAILURE);
-
-                if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) < 0)
+                if (detach_mount_namespace() < 0)
                         _exit(EXIT_FAILURE);
 
                 _exit(EXIT_SUCCESS);
index de04859a2f10db9829236e9e5f12660603ecf2fb..84ededd86e95b719dd211b8a1908af23399fe8a1 100644 (file)
@@ -472,10 +472,13 @@ void user_record_show(UserRecord *hr, bool show_full_group_info) {
 
                 STRV_FOREACH(i, hr->pkcs11_token_uri)
                         printf(i == hr->pkcs11_token_uri ?
-                               "  Sec. Token: %s\n" :
+                               "PKCS11 Token: %s\n" :
                                "              %s\n", *i);
         }
 
+        if (hr->n_fido2_hmac_credential > 0)
+                printf(" FIDO2 Token: %zu\n", hr->n_fido2_hmac_credential);
+
         k = strv_length(hr->hashed_password);
         if (k == 0)
                 printf("   Passwords: %snone%s\n",
index 83d86f69e761ab0a22a2366a0b20476a3a489072..16edaa45face3bb66a17f196efa47d54ba3873c3 100644 (file)
@@ -81,6 +81,7 @@ UserRecord* user_record_new(void) {
                 .password_change_inactive_usec = UINT64_MAX,
                 .password_change_now = -1,
                 .pkcs11_protected_authentication_path_permitted = -1,
+                .fido2_user_presence_permitted = -1,
         };
 
         return h;
@@ -95,6 +96,22 @@ static void pkcs11_encrypted_key_done(Pkcs11EncryptedKey *k) {
         erase_and_free(k->hashed_password);
 }
 
+static void fido2_hmac_credential_done(Fido2HmacCredential *c) {
+        if (!c)
+                return;
+
+        free(c->id);
+}
+
+static void fido2_hmac_salt_done(Fido2HmacSalt *s) {
+        if (!s)
+                return;
+
+        fido2_hmac_credential_done(&s->credential);
+        erase_and_free(s->salt);
+        erase_and_free(s->hashed_password);
+}
+
 static UserRecord* user_record_free(UserRecord *h) {
         if (!h)
                 return NULL;
@@ -120,7 +137,7 @@ static UserRecord* user_record_free(UserRecord *h) {
         strv_free_erase(h->hashed_password);
         strv_free_erase(h->ssh_authorized_keys);
         strv_free_erase(h->password);
-        strv_free_erase(h->pkcs11_pin);
+        strv_free_erase(h->token_pin);
 
         free(h->cifs_service);
         free(h->cifs_user_name);
@@ -147,6 +164,11 @@ static UserRecord* user_record_free(UserRecord *h) {
                 pkcs11_encrypted_key_done(h->pkcs11_encrypted_key + i);
         free(h->pkcs11_encrypted_key);
 
+        for (size_t i = 0; i < h->n_fido2_hmac_credential; i++)
+                fido2_hmac_credential_done(h->fido2_hmac_credential + i);
+        for (size_t i = 0; i < h->n_fido2_hmac_salt; i++)
+                fido2_hmac_salt_done(h->fido2_hmac_salt + i);
+
         json_variant_unref(h->json);
 
         return mfree(h);
@@ -620,8 +642,10 @@ static int dispatch_secret(const char *name, JsonVariant *variant, JsonDispatchF
 
         static const JsonDispatch secret_dispatch_table[] = {
                 { "password",                                   _JSON_VARIANT_TYPE_INVALID, json_dispatch_strv,     offsetof(UserRecord, password),                                       0 },
-                { "pkcs11Pin",                                  _JSON_VARIANT_TYPE_INVALID, json_dispatch_strv,     offsetof(UserRecord, pkcs11_pin),                                     0 },
+                { "tokenPin",                                   _JSON_VARIANT_TYPE_INVALID, json_dispatch_strv,     offsetof(UserRecord, token_pin),                                      0 },
+                { "pkcs11Pin",   /* legacy alias */             _JSON_VARIANT_TYPE_INVALID, json_dispatch_strv,     offsetof(UserRecord, token_pin),                                      0 },
                 { "pkcs11ProtectedAuthenticationPathPermitted", JSON_VARIANT_BOOLEAN,       json_dispatch_tristate, offsetof(UserRecord, pkcs11_protected_authentication_path_permitted), 0 },
+                { "fido2UserPresencePermitted",                 JSON_VARIANT_BOOLEAN,       json_dispatch_tristate, offsetof(UserRecord, fido2_user_presence_permitted),                  0 },
                 {},
         };
 
@@ -706,7 +730,7 @@ static int dispatch_pkcs11_key_data(const char *name, JsonVariant *variant, Json
         int r;
 
         if (json_variant_is_null(variant)) {
-                k->data = mfree(k->data);
+                k->data = erase_and_free(k->data);
                 k->size = 0;
                 return 0;
         }
@@ -766,13 +790,141 @@ static int dispatch_pkcs11_key(const char *name, JsonVariant *variant, JsonDispa
         return 0;
 }
 
+static int dispatch_fido2_hmac_credential(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
+        Fido2HmacCredential *k = userdata;
+        size_t l;
+        void *b;
+        int r;
+
+        if (json_variant_is_null(variant)) {
+                k->id = mfree(k->id);
+                k->size = 0;
+                return 0;
+        }
+
+        if (!json_variant_is_string(variant))
+                return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
+
+        r = unbase64mem(json_variant_string(variant), (size_t) -1, &b, &l);
+        if (r < 0)
+                return json_log(variant, flags, r, "Failed to decode FIDO2 credential ID: %m");
+
+        free_and_replace(k->id, b);
+        k->size = l;
+
+        return 0;
+}
+
+static int dispatch_fido2_hmac_credential_array(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
+        UserRecord *h = userdata;
+        JsonVariant *e;
+        int r;
+
+        if (!json_variant_is_array(variant))
+                return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an array of strings.", strna(name));
+
+        JSON_VARIANT_ARRAY_FOREACH(e, variant) {
+                Fido2HmacCredential *array;
+                size_t l;
+                void *b;
+
+                if (!json_variant_is_string(e))
+                        return json_log(e, flags, SYNTHETIC_ERRNO(EINVAL), "JSON array element is not a string.");
+
+                array = reallocarray(h->fido2_hmac_credential, h->n_fido2_hmac_credential + 1, sizeof(Fido2HmacCredential));
+                if (!array)
+                        return log_oom();
+
+                r = unbase64mem(json_variant_string(e), (size_t) -1, &b, &l);
+                if (r < 0)
+                        return json_log(variant, flags, r, "Failed to decode FIDO2 credential ID: %m");
+
+                h->fido2_hmac_credential = array;
+
+                h->fido2_hmac_credential[h->n_fido2_hmac_credential++] = (Fido2HmacCredential) {
+                        .id = b,
+                        .size = l,
+                };
+        }
+
+        return 0;
+}
+
+static int dispatch_fido2_hmac_salt_value(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
+        Fido2HmacSalt *k = userdata;
+        size_t l;
+        void *b;
+        int r;
+
+        if (json_variant_is_null(variant)) {
+                k->salt = erase_and_free(k->salt);
+                k->salt_size = 0;
+                return 0;
+        }
+
+        if (!json_variant_is_string(variant))
+                return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
+
+        r = unbase64mem(json_variant_string(variant), (size_t) -1, &b, &l);
+        if (r < 0)
+                return json_log(variant, flags, r, "Failed to decode FIDO2 salt: %m");
+
+        erase_and_free(k->salt);
+        k->salt = b;
+        k->salt_size = l;
+
+        return 0;
+}
+
+static int dispatch_fido2_hmac_salt(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
+        UserRecord *h = userdata;
+        JsonVariant *e;
+        int r;
+
+        if (!json_variant_is_array(variant))
+                return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an array of objects.", strna(name));
+
+        JSON_VARIANT_ARRAY_FOREACH(e, variant) {
+                Fido2HmacSalt *array, *k;
+
+                static const JsonDispatch fido2_hmac_salt_dispatch_table[] = {
+                        { "credential",     JSON_VARIANT_STRING, dispatch_fido2_hmac_credential, offsetof(Fido2HmacSalt, credential),      JSON_MANDATORY },
+                        { "salt",           JSON_VARIANT_STRING, dispatch_fido2_hmac_salt_value, 0,                                        JSON_MANDATORY },
+                        { "hashedPassword", JSON_VARIANT_STRING, json_dispatch_string,           offsetof(Fido2HmacSalt, hashed_password), JSON_MANDATORY },
+                        {},
+                };
+
+                if (!json_variant_is_object(e))
+                        return json_log(e, flags, SYNTHETIC_ERRNO(EINVAL), "JSON array element is not an object.");
+
+                array = reallocarray(h->fido2_hmac_salt, h->n_fido2_hmac_salt + 1, sizeof(Fido2HmacSalt));
+                if (!array)
+                        return log_oom();
+
+                h->fido2_hmac_salt = array;
+                k = h->fido2_hmac_salt + h->n_fido2_hmac_salt;
+                *k = (Fido2HmacSalt) {};
+
+                r = json_dispatch(e, fido2_hmac_salt_dispatch_table, NULL, flags, k);
+                if (r < 0) {
+                        fido2_hmac_salt_done(k);
+                        return r;
+                }
+
+                h->n_fido2_hmac_salt++;
+        }
+
+        return 0;
+}
+
 static int dispatch_privileged(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
 
         static const JsonDispatch privileged_dispatch_table[] = {
-                { "passwordHint",       JSON_VARIANT_STRING,        json_dispatch_string, offsetof(UserRecord, password_hint),        0         },
-                { "hashedPassword",     _JSON_VARIANT_TYPE_INVALID, json_dispatch_strv,   offsetof(UserRecord, hashed_password),      JSON_SAFE },
-                { "sshAuthorizedKeys",  _JSON_VARIANT_TYPE_INVALID, json_dispatch_strv,   offsetof(UserRecord, ssh_authorized_keys),  0         },
-                { "pkcs11EncryptedKey", JSON_VARIANT_ARRAY,         dispatch_pkcs11_key,  0,                                          0         },
+                { "passwordHint",       JSON_VARIANT_STRING,        json_dispatch_string,     offsetof(UserRecord, password_hint),        0         },
+                { "hashedPassword",     _JSON_VARIANT_TYPE_INVALID, json_dispatch_strv,       offsetof(UserRecord, hashed_password),      JSON_SAFE },
+                { "sshAuthorizedKeys",  _JSON_VARIANT_TYPE_INVALID, json_dispatch_strv,       offsetof(UserRecord, ssh_authorized_keys),  0         },
+                { "pkcs11EncryptedKey", JSON_VARIANT_ARRAY,         dispatch_pkcs11_key,      0,                                          0         },
+                { "fido2HmacSalt",      JSON_VARIANT_ARRAY,         dispatch_fido2_hmac_salt, 0,                                          0         },
                 {},
         };
 
@@ -906,66 +1058,67 @@ int per_machine_hostname_match(JsonVariant *hns, JsonDispatchFlags flags) {
 static int dispatch_per_machine(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
 
         static const JsonDispatch per_machine_dispatch_table[] = {
-                { "matchMachineId",             _JSON_VARIANT_TYPE_INVALID, NULL,                              0,                                                   0         },
-                { "matchHostname",              _JSON_VARIANT_TYPE_INVALID, NULL,                              0,                                                   0         },
-                { "iconName",                   JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, icon_name),                     JSON_SAFE },
-                { "location",                   JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, location),                      0         },
-                { "shell",                      JSON_VARIANT_STRING,        json_dispatch_filename_or_path,    offsetof(UserRecord, shell),                         0         },
-                { "umask",                      JSON_VARIANT_UNSIGNED,      json_dispatch_umask,               offsetof(UserRecord, umask),                         0         },
-                { "environment",                JSON_VARIANT_ARRAY,         json_dispatch_environment,         offsetof(UserRecord, environment),                   0         },
-                { "timeZone",                   JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, time_zone),                     JSON_SAFE },
-                { "preferredLanguage",          JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, preferred_language),            JSON_SAFE },
-                { "niceLevel",                  _JSON_VARIANT_TYPE_INVALID, json_dispatch_nice,                offsetof(UserRecord, nice_level),                    0         },
-                { "resourceLimits",             _JSON_VARIANT_TYPE_INVALID, json_dispatch_rlimits,             offsetof(UserRecord, rlimits),                       0         },
-                { "locked",                     JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,            offsetof(UserRecord, locked),                        0         },
-                { "notBeforeUSec",              JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, not_before_usec),               0         },
-                { "notAfterUSec",               JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, not_after_usec),                0         },
-                { "storage",                    JSON_VARIANT_STRING,        json_dispatch_storage,             offsetof(UserRecord, storage),                       0         },
-                { "diskSize",                   JSON_VARIANT_UNSIGNED,      json_dispatch_disk_size,           offsetof(UserRecord, disk_size),                     0         },
-                { "diskSizeRelative",           JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, disk_size_relative),            0         },
-                { "skeletonDirectory",          JSON_VARIANT_STRING,        json_dispatch_path,                offsetof(UserRecord, skeleton_directory),            0         },
-                { "accessMode",                 JSON_VARIANT_UNSIGNED,      json_dispatch_access_mode,         offsetof(UserRecord, access_mode),                   0         },
-                { "tasksMax",                   JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max, offsetof(UserRecord, tasks_max),                     0         },
-                { "memoryHigh",                 JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max, offsetof(UserRecord, memory_high),                   0         },
-                { "memoryMax",                  JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max, offsetof(UserRecord, memory_max),                    0         },
-                { "cpuWeight",                  JSON_VARIANT_UNSIGNED,      json_dispatch_weight,              offsetof(UserRecord, cpu_weight),                    0         },
-                { "ioWeight",                   JSON_VARIANT_UNSIGNED,      json_dispatch_weight,              offsetof(UserRecord, io_weight),                     0         },
-                { "mountNoDevices",             JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,             offsetof(UserRecord, nodev),                         0         },
-                { "mountNoSuid",                JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,             offsetof(UserRecord, nosuid),                        0         },
-                { "mountNoExecute",             JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,             offsetof(UserRecord, noexec),                        0         },
-                { "cifsDomain",                 JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, cifs_domain),                   JSON_SAFE },
-                { "cifsUserName",               JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, cifs_user_name),                JSON_SAFE },
-                { "cifsService",                JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, cifs_service),                  JSON_SAFE },
-                { "imagePath",                  JSON_VARIANT_STRING,        json_dispatch_path,                offsetof(UserRecord, image_path),                    0         },
-                { "uid",                        JSON_VARIANT_UNSIGNED,      json_dispatch_uid_gid,             offsetof(UserRecord, uid),                           0         },
-                { "gid",                        JSON_VARIANT_UNSIGNED,      json_dispatch_uid_gid,             offsetof(UserRecord, gid),                           0         },
-                { "memberOf",                   JSON_VARIANT_ARRAY,         json_dispatch_user_group_list,     offsetof(UserRecord, member_of),                     JSON_RELAX},
-                { "fileSystemType",             JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, file_system_type),              JSON_SAFE },
-                { "partitionUuid",              JSON_VARIANT_STRING,        json_dispatch_id128,               offsetof(UserRecord, partition_uuid),                0         },
-                { "luksUuid",                   JSON_VARIANT_STRING,        json_dispatch_id128,               offsetof(UserRecord, luks_uuid),                     0         },
-                { "fileSystemUuid",             JSON_VARIANT_STRING,        json_dispatch_id128,               offsetof(UserRecord, file_system_uuid),              0         },
-                { "luksDiscard",                _JSON_VARIANT_TYPE_INVALID, json_dispatch_tristate,            offsetof(UserRecord, luks_discard),                  0,        },
-                { "luksOfflineDiscard",         _JSON_VARIANT_TYPE_INVALID, json_dispatch_tristate,            offsetof(UserRecord, luks_offline_discard),          0,        },
-                { "luksCipher",                 JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, luks_cipher),                   JSON_SAFE },
-                { "luksCipherMode",             JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, luks_cipher_mode),              JSON_SAFE },
-                { "luksVolumeKeySize",          JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, luks_volume_key_size),          0         },
-                { "luksPbkdfHashAlgorithm",     JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, luks_pbkdf_hash_algorithm),     JSON_SAFE },
-                { "luksPbkdfType",              JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, luks_pbkdf_type),               JSON_SAFE },
-                { "luksPbkdfTimeCostUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, luks_pbkdf_time_cost_usec),     0         },
-                { "luksPbkdfMemoryCost",        JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, luks_pbkdf_memory_cost),        0         },
-                { "luksPbkdfParallelThreads",   JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, luks_pbkdf_parallel_threads),   0         },
-                { "rateLimitIntervalUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, ratelimit_interval_usec),       0         },
-                { "rateLimitBurst",             JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, ratelimit_burst),               0         },
-                { "enforcePasswordPolicy",      JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,            offsetof(UserRecord, enforce_password_policy),       0         },
-                { "autoLogin",                  JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,            offsetof(UserRecord, auto_login),                    0         },
-                { "stopDelayUSec",              JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, stop_delay_usec),               0         },
-                { "killProcesses",              JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,            offsetof(UserRecord, kill_processes),                0         },
-                { "passwordChangeMinUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, password_change_min_usec),      0         },
-                { "passwordChangeMaxUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, password_change_max_usec),      0         },
-                { "passwordChangeWarnUSec",     JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, password_change_warn_usec),     0         },
-                { "passwordChangeInactiveUSec", JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, password_change_inactive_usec), 0         },
-                { "passwordChangeNow",          JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,            offsetof(UserRecord, password_change_now),           0         },
-                { "pkcs11TokenUri",             JSON_VARIANT_ARRAY,         dispatch_pkcs11_uri_array,         offsetof(UserRecord, pkcs11_token_uri),              0         },
+                { "matchMachineId",             _JSON_VARIANT_TYPE_INVALID, NULL,                                 0,                                                   0         },
+                { "matchHostname",              _JSON_VARIANT_TYPE_INVALID, NULL,                                 0,                                                   0         },
+                { "iconName",                   JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, icon_name),                     JSON_SAFE },
+                { "location",                   JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, location),                      0         },
+                { "shell",                      JSON_VARIANT_STRING,        json_dispatch_filename_or_path,       offsetof(UserRecord, shell),                         0         },
+                { "umask",                      JSON_VARIANT_UNSIGNED,      json_dispatch_umask,                  offsetof(UserRecord, umask),                         0         },
+                { "environment",                JSON_VARIANT_ARRAY,         json_dispatch_environment,            offsetof(UserRecord, environment),                   0         },
+                { "timeZone",                   JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, time_zone),                     JSON_SAFE },
+                { "preferredLanguage",          JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, preferred_language),            JSON_SAFE },
+                { "niceLevel",                  _JSON_VARIANT_TYPE_INVALID, json_dispatch_nice,                   offsetof(UserRecord, nice_level),                    0         },
+                { "resourceLimits",             _JSON_VARIANT_TYPE_INVALID, json_dispatch_rlimits,                offsetof(UserRecord, rlimits),                       0         },
+                { "locked",                     JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,               offsetof(UserRecord, locked),                        0         },
+                { "notBeforeUSec",              JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, not_before_usec),               0         },
+                { "notAfterUSec",               JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, not_after_usec),                0         },
+                { "storage",                    JSON_VARIANT_STRING,        json_dispatch_storage,                offsetof(UserRecord, storage),                       0         },
+                { "diskSize",                   JSON_VARIANT_UNSIGNED,      json_dispatch_disk_size,              offsetof(UserRecord, disk_size),                     0         },
+                { "diskSizeRelative",           JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, disk_size_relative),            0         },
+                { "skeletonDirectory",          JSON_VARIANT_STRING,        json_dispatch_path,                   offsetof(UserRecord, skeleton_directory),            0         },
+                { "accessMode",                 JSON_VARIANT_UNSIGNED,      json_dispatch_access_mode,            offsetof(UserRecord, access_mode),                   0         },
+                { "tasksMax",                   JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max,    offsetof(UserRecord, tasks_max),                     0         },
+                { "memoryHigh",                 JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max,    offsetof(UserRecord, memory_high),                   0         },
+                { "memoryMax",                  JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max,    offsetof(UserRecord, memory_max),                    0         },
+                { "cpuWeight",                  JSON_VARIANT_UNSIGNED,      json_dispatch_weight,                 offsetof(UserRecord, cpu_weight),                    0         },
+                { "ioWeight",                   JSON_VARIANT_UNSIGNED,      json_dispatch_weight,                 offsetof(UserRecord, io_weight),                     0         },
+                { "mountNoDevices",             JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,                offsetof(UserRecord, nodev),                         0         },
+                { "mountNoSuid",                JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,                offsetof(UserRecord, nosuid),                        0         },
+                { "mountNoExecute",             JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,                offsetof(UserRecord, noexec),                        0         },
+                { "cifsDomain",                 JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, cifs_domain),                   JSON_SAFE },
+                { "cifsUserName",               JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, cifs_user_name),                JSON_SAFE },
+                { "cifsService",                JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, cifs_service),                  JSON_SAFE },
+                { "imagePath",                  JSON_VARIANT_STRING,        json_dispatch_path,                   offsetof(UserRecord, image_path),                    0         },
+                { "uid",                        JSON_VARIANT_UNSIGNED,      json_dispatch_uid_gid,                offsetof(UserRecord, uid),                           0         },
+                { "gid",                        JSON_VARIANT_UNSIGNED,      json_dispatch_uid_gid,                offsetof(UserRecord, gid),                           0         },
+                { "memberOf",                   JSON_VARIANT_ARRAY,         json_dispatch_user_group_list,        offsetof(UserRecord, member_of),                     JSON_RELAX},
+                { "fileSystemType",             JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, file_system_type),              JSON_SAFE },
+                { "partitionUuid",              JSON_VARIANT_STRING,        json_dispatch_id128,                  offsetof(UserRecord, partition_uuid),                0         },
+                { "luksUuid",                   JSON_VARIANT_STRING,        json_dispatch_id128,                  offsetof(UserRecord, luks_uuid),                     0         },
+                { "fileSystemUuid",             JSON_VARIANT_STRING,        json_dispatch_id128,                  offsetof(UserRecord, file_system_uuid),              0         },
+                { "luksDiscard",                _JSON_VARIANT_TYPE_INVALID, json_dispatch_tristate,               offsetof(UserRecord, luks_discard),                  0,        },
+                { "luksOfflineDiscard",         _JSON_VARIANT_TYPE_INVALID, json_dispatch_tristate,               offsetof(UserRecord, luks_offline_discard),          0,        },
+                { "luksCipher",                 JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, luks_cipher),                   JSON_SAFE },
+                { "luksCipherMode",             JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, luks_cipher_mode),              JSON_SAFE },
+                { "luksVolumeKeySize",          JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, luks_volume_key_size),          0         },
+                { "luksPbkdfHashAlgorithm",     JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, luks_pbkdf_hash_algorithm),     JSON_SAFE },
+                { "luksPbkdfType",              JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, luks_pbkdf_type),               JSON_SAFE },
+                { "luksPbkdfTimeCostUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, luks_pbkdf_time_cost_usec),     0         },
+                { "luksPbkdfMemoryCost",        JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, luks_pbkdf_memory_cost),        0         },
+                { "luksPbkdfParallelThreads",   JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, luks_pbkdf_parallel_threads),   0         },
+                { "rateLimitIntervalUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, ratelimit_interval_usec),       0         },
+                { "rateLimitBurst",             JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, ratelimit_burst),               0         },
+                { "enforcePasswordPolicy",      JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,               offsetof(UserRecord, enforce_password_policy),       0         },
+                { "autoLogin",                  JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,               offsetof(UserRecord, auto_login),                    0         },
+                { "stopDelayUSec",              JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, stop_delay_usec),               0         },
+                { "killProcesses",              JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,               offsetof(UserRecord, kill_processes),                0         },
+                { "passwordChangeMinUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, password_change_min_usec),      0         },
+                { "passwordChangeMaxUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, password_change_max_usec),      0         },
+                { "passwordChangeWarnUSec",     JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, password_change_warn_usec),     0         },
+                { "passwordChangeInactiveUSec", JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, password_change_inactive_usec), 0         },
+                { "passwordChangeNow",          JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,               offsetof(UserRecord, password_change_now),           0         },
+                { "pkcs11TokenUri",             JSON_VARIANT_ARRAY,         dispatch_pkcs11_uri_array,            offsetof(UserRecord, pkcs11_token_uri),              0         },
+                { "fido2HmacCredential",        JSON_VARIANT_ARRAY,         dispatch_fido2_hmac_credential_array, 0,                                                   0         },
                 {},
         };
 
@@ -1247,84 +1400,85 @@ int user_group_record_mangle(
 int user_record_load(UserRecord *h, JsonVariant *v, UserRecordLoadFlags load_flags) {
 
         static const JsonDispatch user_dispatch_table[] = {
-                { "userName",                   JSON_VARIANT_STRING,        json_dispatch_user_group_name,     offsetof(UserRecord, user_name),                     JSON_RELAX},
-                { "realm",                      JSON_VARIANT_STRING,        json_dispatch_realm,               offsetof(UserRecord, realm),                         0         },
-                { "realName",                   JSON_VARIANT_STRING,        json_dispatch_gecos,               offsetof(UserRecord, real_name),                     0         },
-                { "emailAddress",               JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, email_address),                 JSON_SAFE },
-                { "iconName",                   JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, icon_name),                     JSON_SAFE },
-                { "location",                   JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, location),                      0         },
-                { "disposition",                JSON_VARIANT_STRING,        json_dispatch_user_disposition,    offsetof(UserRecord, disposition),                   0         },
-                { "lastChangeUSec",             JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, last_change_usec),              0         },
-                { "lastPasswordChangeUSec",     JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, last_password_change_usec),     0         },
-                { "shell",                      JSON_VARIANT_STRING,        json_dispatch_filename_or_path,    offsetof(UserRecord, shell),                         0         },
-                { "umask",                      JSON_VARIANT_UNSIGNED,      json_dispatch_umask,               offsetof(UserRecord, umask),                         0         },
-                { "environment",                JSON_VARIANT_ARRAY,         json_dispatch_environment,         offsetof(UserRecord, environment),                   0         },
-                { "timeZone",                   JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, time_zone),                     JSON_SAFE },
-                { "preferredLanguage",          JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, preferred_language),            JSON_SAFE },
-                { "niceLevel",                  _JSON_VARIANT_TYPE_INVALID, json_dispatch_nice,                offsetof(UserRecord, nice_level),                    0         },
-                { "resourceLimits",             _JSON_VARIANT_TYPE_INVALID, json_dispatch_rlimits,             offsetof(UserRecord, rlimits),                       0         },
-                { "locked",                     JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,            offsetof(UserRecord, locked),                        0         },
-                { "notBeforeUSec",              JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, not_before_usec),               0         },
-                { "notAfterUSec",               JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, not_after_usec),                0         },
-                { "storage",                    JSON_VARIANT_STRING,        json_dispatch_storage,             offsetof(UserRecord, storage),                       0         },
-                { "diskSize",                   JSON_VARIANT_UNSIGNED,      json_dispatch_disk_size,           offsetof(UserRecord, disk_size),                     0         },
-                { "diskSizeRelative",           JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, disk_size_relative),            0         },
-                { "skeletonDirectory",          JSON_VARIANT_STRING,        json_dispatch_path,                offsetof(UserRecord, skeleton_directory),            0         },
-                { "accessMode",                 JSON_VARIANT_UNSIGNED,      json_dispatch_access_mode,         offsetof(UserRecord, access_mode),                   0         },
-                { "tasksMax",                   JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max, offsetof(UserRecord, tasks_max),                     0         },
-                { "memoryHigh",                 JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max, offsetof(UserRecord, memory_high),                   0         },
-                { "memoryMax",                  JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max, offsetof(UserRecord, memory_max),                    0         },
-                { "cpuWeight",                  JSON_VARIANT_UNSIGNED,      json_dispatch_weight,              offsetof(UserRecord, cpu_weight),                    0         },
-                { "ioWeight",                   JSON_VARIANT_UNSIGNED,      json_dispatch_weight,              offsetof(UserRecord, io_weight),                     0         },
-                { "mountNoDevices",             JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,             offsetof(UserRecord, nodev),                         0         },
-                { "mountNoSuid",                JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,             offsetof(UserRecord, nosuid),                        0         },
-                { "mountNoExecute",             JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,             offsetof(UserRecord, noexec),                        0         },
-                { "cifsDomain",                 JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, cifs_domain),                   JSON_SAFE },
-                { "cifsUserName",               JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, cifs_user_name),                JSON_SAFE },
-                { "cifsService",                JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, cifs_service),                  JSON_SAFE },
-                { "imagePath",                  JSON_VARIANT_STRING,        json_dispatch_path,                offsetof(UserRecord, image_path),                    0         },
-                { "homeDirectory",              JSON_VARIANT_STRING,        json_dispatch_home_directory,      offsetof(UserRecord, home_directory),                0         },
-                { "uid",                        JSON_VARIANT_UNSIGNED,      json_dispatch_uid_gid,             offsetof(UserRecord, uid),                           0         },
-                { "gid",                        JSON_VARIANT_UNSIGNED,      json_dispatch_uid_gid,             offsetof(UserRecord, gid),                           0         },
-                { "memberOf",                   JSON_VARIANT_ARRAY,         json_dispatch_user_group_list,     offsetof(UserRecord, member_of),                     JSON_RELAX},
-                { "fileSystemType",             JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, file_system_type),              JSON_SAFE },
-                { "partitionUuid",              JSON_VARIANT_STRING,        json_dispatch_id128,               offsetof(UserRecord, partition_uuid),                0         },
-                { "luksUuid",                   JSON_VARIANT_STRING,        json_dispatch_id128,               offsetof(UserRecord, luks_uuid),                     0         },
-                { "fileSystemUuid",             JSON_VARIANT_STRING,        json_dispatch_id128,               offsetof(UserRecord, file_system_uuid),              0         },
-                { "luksDiscard",                _JSON_VARIANT_TYPE_INVALID, json_dispatch_tristate,            offsetof(UserRecord, luks_discard),                  0         },
+                { "userName",                   JSON_VARIANT_STRING,        json_dispatch_user_group_name,        offsetof(UserRecord, user_name),                     JSON_RELAX},
+                { "realm",                      JSON_VARIANT_STRING,        json_dispatch_realm,                  offsetof(UserRecord, realm),                         0         },
+                { "realName",                   JSON_VARIANT_STRING,        json_dispatch_gecos,                  offsetof(UserRecord, real_name),                     0         },
+                { "emailAddress",               JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, email_address),                 JSON_SAFE },
+                { "iconName",                   JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, icon_name),                     JSON_SAFE },
+                { "location",                   JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, location),                      0         },
+                { "disposition",                JSON_VARIANT_STRING,        json_dispatch_user_disposition,       offsetof(UserRecord, disposition),                   0         },
+                { "lastChangeUSec",             JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, last_change_usec),              0         },
+                { "lastPasswordChangeUSec",     JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, last_password_change_usec),     0         },
+                { "shell",                      JSON_VARIANT_STRING,        json_dispatch_filename_or_path,       offsetof(UserRecord, shell),                         0         },
+                { "umask",                      JSON_VARIANT_UNSIGNED,      json_dispatch_umask,                  offsetof(UserRecord, umask),                         0         },
+                { "environment",                JSON_VARIANT_ARRAY,         json_dispatch_environment,            offsetof(UserRecord, environment),                   0         },
+                { "timeZone",                   JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, time_zone),                     JSON_SAFE },
+                { "preferredLanguage",          JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, preferred_language),            JSON_SAFE },
+                { "niceLevel",                  _JSON_VARIANT_TYPE_INVALID, json_dispatch_nice,                   offsetof(UserRecord, nice_level),                    0         },
+                { "resourceLimits",             _JSON_VARIANT_TYPE_INVALID, json_dispatch_rlimits,                offsetof(UserRecord, rlimits),                       0         },
+                { "locked",                     JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,               offsetof(UserRecord, locked),                        0         },
+                { "notBeforeUSec",              JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, not_before_usec),               0         },
+                { "notAfterUSec",               JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, not_after_usec),                0         },
+                { "storage",                    JSON_VARIANT_STRING,        json_dispatch_storage,                offsetof(UserRecord, storage),                       0         },
+                { "diskSize",                   JSON_VARIANT_UNSIGNED,      json_dispatch_disk_size,              offsetof(UserRecord, disk_size),                     0         },
+                { "diskSizeRelative",           JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, disk_size_relative),            0         },
+                { "skeletonDirectory",          JSON_VARIANT_STRING,        json_dispatch_path,                   offsetof(UserRecord, skeleton_directory),            0         },
+                { "accessMode",                 JSON_VARIANT_UNSIGNED,      json_dispatch_access_mode,            offsetof(UserRecord, access_mode),                   0         },
+                { "tasksMax",                   JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max,    offsetof(UserRecord, tasks_max),                     0         },
+                { "memoryHigh",                 JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max,    offsetof(UserRecord, memory_high),                   0         },
+                { "memoryMax",                  JSON_VARIANT_UNSIGNED,      json_dispatch_tasks_or_memory_max,    offsetof(UserRecord, memory_max),                    0         },
+                { "cpuWeight",                  JSON_VARIANT_UNSIGNED,      json_dispatch_weight,                 offsetof(UserRecord, cpu_weight),                    0         },
+                { "ioWeight",                   JSON_VARIANT_UNSIGNED,      json_dispatch_weight,                 offsetof(UserRecord, io_weight),                     0         },
+                { "mountNoDevices",             JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,                offsetof(UserRecord, nodev),                         0         },
+                { "mountNoSuid",                JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,                offsetof(UserRecord, nosuid),                        0         },
+                { "mountNoExecute",             JSON_VARIANT_BOOLEAN,       json_dispatch_boolean,                offsetof(UserRecord, noexec),                        0         },
+                { "cifsDomain",                 JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, cifs_domain),                   JSON_SAFE },
+                { "cifsUserName",               JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, cifs_user_name),                JSON_SAFE },
+                { "cifsService",                JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, cifs_service),                  JSON_SAFE },
+                { "imagePath",                  JSON_VARIANT_STRING,        json_dispatch_path,                   offsetof(UserRecord, image_path),                    0         },
+                { "homeDirectory",              JSON_VARIANT_STRING,        json_dispatch_home_directory,         offsetof(UserRecord, home_directory),                0         },
+                { "uid",                        JSON_VARIANT_UNSIGNED,      json_dispatch_uid_gid,                offsetof(UserRecord, uid),                           0         },
+                { "gid",                        JSON_VARIANT_UNSIGNED,      json_dispatch_uid_gid,                offsetof(UserRecord, gid),                           0         },
+                { "memberOf",                   JSON_VARIANT_ARRAY,         json_dispatch_user_group_list,        offsetof(UserRecord, member_of),                     JSON_RELAX},
+                { "fileSystemType",             JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, file_system_type),              JSON_SAFE },
+                { "partitionUuid",              JSON_VARIANT_STRING,        json_dispatch_id128,                  offsetof(UserRecord, partition_uuid),                0         },
+                { "luksUuid",                   JSON_VARIANT_STRING,        json_dispatch_id128,                  offsetof(UserRecord, luks_uuid),                     0         },
+                { "fileSystemUuid",             JSON_VARIANT_STRING,        json_dispatch_id128,                  offsetof(UserRecord, file_system_uuid),              0         },
+                { "luksDiscard",                _JSON_VARIANT_TYPE_INVALID, json_dispatch_tristate,               offsetof(UserRecord, luks_discard),                  0         },
                 { "luksOfflineDiscard",         _JSON_VARIANT_TYPE_INVALID, json_dispatch_tristate,            offsetof(UserRecord, luks_offline_discard),          0         },
-                { "luksCipher",                 JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, luks_cipher),                   JSON_SAFE },
-                { "luksCipherMode",             JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, luks_cipher_mode),              JSON_SAFE },
-                { "luksVolumeKeySize",          JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, luks_volume_key_size),          0         },
-                { "luksPbkdfHashAlgorithm",     JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, luks_pbkdf_hash_algorithm),     JSON_SAFE },
-                { "luksPbkdfType",              JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, luks_pbkdf_type),               JSON_SAFE },
-                { "luksPbkdfTimeCostUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, luks_pbkdf_time_cost_usec),     0         },
-                { "luksPbkdfMemoryCost",        JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, luks_pbkdf_memory_cost),        0         },
-                { "luksPbkdfParallelThreads",   JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, luks_pbkdf_parallel_threads),   0         },
-                { "service",                    JSON_VARIANT_STRING,        json_dispatch_string,              offsetof(UserRecord, service),                       JSON_SAFE },
-                { "rateLimitIntervalUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, ratelimit_interval_usec),       0         },
-                { "rateLimitBurst",             JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, ratelimit_burst),               0         },
-                { "enforcePasswordPolicy",      JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,            offsetof(UserRecord, enforce_password_policy),       0         },
-                { "autoLogin",                  JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,            offsetof(UserRecord, auto_login),                    0         },
-                { "stopDelayUSec",              JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, stop_delay_usec),               0         },
-                { "killProcesses",              JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,            offsetof(UserRecord, kill_processes),                0         },
-                { "passwordChangeMinUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, password_change_min_usec),      0         },
-                { "passwordChangeMaxUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, password_change_max_usec),      0         },
-                { "passwordChangeWarnUSec",     JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, password_change_warn_usec),     0         },
-                { "passwordChangeInactiveUSec", JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,              offsetof(UserRecord, password_change_inactive_usec), 0         },
-                { "passwordChangeNow",          JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,            offsetof(UserRecord, password_change_now),           0         },
-                { "pkcs11TokenUri",             JSON_VARIANT_ARRAY,         dispatch_pkcs11_uri_array,         offsetof(UserRecord, pkcs11_token_uri),              0         },
-
-                { "secret",                     JSON_VARIANT_OBJECT,        dispatch_secret,                   0,                                                   0         },
-                { "privileged",                 JSON_VARIANT_OBJECT,        dispatch_privileged,               0,                                                   0         },
+                { "luksCipher",                 JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, luks_cipher),                   JSON_SAFE },
+                { "luksCipherMode",             JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, luks_cipher_mode),              JSON_SAFE },
+                { "luksVolumeKeySize",          JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, luks_volume_key_size),          0         },
+                { "luksPbkdfHashAlgorithm",     JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, luks_pbkdf_hash_algorithm),     JSON_SAFE },
+                { "luksPbkdfType",              JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, luks_pbkdf_type),               JSON_SAFE },
+                { "luksPbkdfTimeCostUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, luks_pbkdf_time_cost_usec),     0         },
+                { "luksPbkdfMemoryCost",        JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, luks_pbkdf_memory_cost),        0         },
+                { "luksPbkdfParallelThreads",   JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, luks_pbkdf_parallel_threads),   0         },
+                { "service",                    JSON_VARIANT_STRING,        json_dispatch_string,                 offsetof(UserRecord, service),                       JSON_SAFE },
+                { "rateLimitIntervalUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, ratelimit_interval_usec),       0         },
+                { "rateLimitBurst",             JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, ratelimit_burst),               0         },
+                { "enforcePasswordPolicy",      JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,               offsetof(UserRecord, enforce_password_policy),       0         },
+                { "autoLogin",                  JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,               offsetof(UserRecord, auto_login),                    0         },
+                { "stopDelayUSec",              JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, stop_delay_usec),               0         },
+                { "killProcesses",              JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,               offsetof(UserRecord, kill_processes),                0         },
+                { "passwordChangeMinUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, password_change_min_usec),      0         },
+                { "passwordChangeMaxUSec",      JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, password_change_max_usec),      0         },
+                { "passwordChangeWarnUSec",     JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, password_change_warn_usec),     0         },
+                { "passwordChangeInactiveUSec", JSON_VARIANT_UNSIGNED,      json_dispatch_uint64,                 offsetof(UserRecord, password_change_inactive_usec), 0         },
+                { "passwordChangeNow",          JSON_VARIANT_BOOLEAN,       json_dispatch_tristate,               offsetof(UserRecord, password_change_now),           0         },
+                { "pkcs11TokenUri",             JSON_VARIANT_ARRAY,         dispatch_pkcs11_uri_array,            offsetof(UserRecord, pkcs11_token_uri),              0         },
+                { "fido2HmacCredential",        JSON_VARIANT_ARRAY,         dispatch_fido2_hmac_credential_array, 0,                                                   0         },
+
+                { "secret",                     JSON_VARIANT_OBJECT,        dispatch_secret,                      0,                                                   0         },
+                { "privileged",                 JSON_VARIANT_OBJECT,        dispatch_privileged,                  0,                                                   0         },
 
                 /* Ignore the perMachine, binding, status stuff here, and process it later, so that it overrides whatever is set above */
-                { "perMachine",                 JSON_VARIANT_ARRAY,         NULL,                              0,                                                   0         },
-                { "binding",                    JSON_VARIANT_OBJECT,        NULL,                              0,                                                   0         },
-                { "status",                     JSON_VARIANT_OBJECT,        NULL,                              0,                                                   0         },
+                { "perMachine",                 JSON_VARIANT_ARRAY,         NULL,                                 0,                                                   0         },
+                { "binding",                    JSON_VARIANT_OBJECT,        NULL,                                 0,                                                   0         },
+                { "status",                     JSON_VARIANT_OBJECT,        NULL,                                 0,                                                   0         },
 
                 /* Ignore 'signature', we check it with explicit accessors instead */
-                { "signature",                  JSON_VARIANT_ARRAY,         NULL,                              0,                                                   0         },
+                { "signature",                  JSON_VARIANT_ARRAY,         NULL,                                 0,                                                   0         },
                 {},
         };
 
@@ -1684,6 +1838,9 @@ bool user_record_can_authenticate(UserRecord *h) {
         if (h->n_pkcs11_encrypted_key > 0)
                 return true;
 
+        if (h->n_fido2_hmac_salt > 0)
+                return true;
+
         return !strv_isempty(h->hashed_password);
 }
 
index 9fd10610d926acce14ab26edb184fcdd0c2a68ab..1bfd095d27e18c1aed317428bebc78d7818de481 100644 (file)
@@ -189,6 +189,23 @@ typedef struct Pkcs11EncryptedKey {
         char *hashed_password;
 } Pkcs11EncryptedKey;
 
+typedef struct Fido2HmacCredential {
+        void *id;
+        size_t size;
+} Fido2HmacCredential;
+
+typedef struct Fido2HmacSalt {
+        /* The FIDO2 Cridential ID to use */
+        Fido2HmacCredential credential;
+
+        /* The FIDO2 salt value */
+        void *salt;
+        size_t salt_size;
+
+        /* What to test the hashed salt value against, usually UNIX password hash here. */
+        char *hashed_password;
+} Fido2HmacSalt;
+
 typedef struct UserRecord {
         /* The following three fields are not part of the JSON record */
         unsigned n_ref;
@@ -239,7 +256,7 @@ typedef struct UserRecord {
         char **hashed_password;
         char **ssh_authorized_keys;
         char **password;
-        char **pkcs11_pin;
+        char **token_pin;
 
         char *cifs_domain;
         char *cifs_user_name;
@@ -309,6 +326,12 @@ typedef struct UserRecord {
         size_t n_pkcs11_encrypted_key;
         int pkcs11_protected_authentication_path_permitted;
 
+        Fido2HmacCredential *fido2_hmac_credential;
+        size_t n_fido2_hmac_credential;
+        Fido2HmacSalt *fido2_hmac_salt;
+        size_t n_fido2_hmac_salt;
+        int fido2_user_presence_permitted;
+
         JsonVariant *json;
 } UserRecord;
 
index c3a6e02e5a1e1b5e31d24b7edda95cdf0e5cf7fa..6fedbd6ebe62904de61a3385eee0a20f3210d876 100644 (file)
@@ -3,6 +3,7 @@
 #include <sys/auxv.h>
 
 #include "dirent-util.h"
+#include "dlfcn-util.h"
 #include "errno-util.h"
 #include "fd-util.h"
 #include "group-record-nss.h"
@@ -32,8 +33,8 @@ struct UserDBIterator {
         bool nss_iterating:1;
         bool synthesize_root:1;
         bool synthesize_nobody:1;
+        bool nss_systemd_blocked:1;
         int error;
-        int nss_lock;
         unsigned n_found;
         sd_event *event;
         UserRecord *found_user;                   /* when .what == LOOKUP_USER */
@@ -85,7 +86,9 @@ UserDBIterator* userdb_iterator_free(UserDBIterator *iterator) {
         }
 
         sd_event_unref(iterator->event);
-        safe_close(iterator->nss_lock);
+
+        if (iterator->nss_systemd_blocked)
+                assert_se(userdb_block_nss_systemd(false) >= 0);
 
         return mfree(iterator);
 }
@@ -102,12 +105,27 @@ static UserDBIterator* userdb_iterator_new(LookupWhat what) {
 
         *i = (UserDBIterator) {
                 .what = what,
-                .nss_lock = -1,
         };
 
         return i;
 }
 
+static int userdb_iterator_block_nss_systemd(UserDBIterator *iterator) {
+        int r;
+
+        assert(iterator);
+
+        if (iterator->nss_systemd_blocked)
+                return 0;
+
+        r = userdb_block_nss_systemd(true);
+        if (r < 0)
+                return r;
+
+        iterator->nss_systemd_blocked = true;
+        return 1;
+}
+
 struct user_group_data {
         JsonVariant *record;
         bool incomplete;
@@ -359,15 +377,9 @@ static int userdb_connect(
         if (r < 0)
                 return log_debug_errno(r, "Failed to invoke varlink method: %m");
 
-        r = set_ensure_allocated(&iterator->links, &link_hash_ops);
-        if (r < 0)
-                return log_debug_errno(r, "Failed to allocate set: %m");
-
-        r = set_put(iterator->links, vl);
+        r = set_ensure_consume(&iterator->links, &link_hash_ops, TAKE_PTR(vl));
         if (r < 0)
                 return log_debug_errno(r, "Failed to add varlink connection to set: %m");
-
-        TAKE_PTR(vl);
         return r;
 }
 
@@ -606,13 +618,11 @@ int userdb_by_name(const char *name, UserDBFlags flags, UserRecord **ret) {
                         return r;
         }
 
-        if (!FLAGS_SET(flags, USERDB_AVOID_NSS) && !(iterator && iterator->nss_covered)) {
-                /* Make sure the NSS lookup doesn't recurse back to us. (EBUSY is fine here, it just means we
-                 * already took the lock from our thread, which is totally OK.) */
-                r = userdb_nss_compat_disable();
-                if (r >= 0 || r == -EBUSY) {
-                        iterator->nss_lock = r;
+        if (!FLAGS_SET(flags, USERDB_AVOID_NSS) && !iterator->nss_covered) {
+                /* Make sure the NSS lookup doesn't recurse back to us. */
 
+                r = userdb_iterator_block_nss_systemd(iterator);
+                if (r >= 0) {
                         /* Client-side NSS fallback */
                         r = nss_user_record_by_name(name, !FLAGS_SET(flags, USERDB_AVOID_SHADOW), ret);
                         if (r >= 0)
@@ -655,11 +665,9 @@ int userdb_by_uid(uid_t uid, UserDBFlags flags, UserRecord **ret) {
                         return r;
         }
 
-        if (!FLAGS_SET(flags, USERDB_AVOID_NSS) && !(iterator && iterator->nss_covered)) {
-                r = userdb_nss_compat_disable();
-                if (r >= 0 || r == -EBUSY) {
-                        iterator->nss_lock = r;
-
+        if (!FLAGS_SET(flags, USERDB_AVOID_NSS) && !iterator->nss_covered) {
+                r = userdb_iterator_block_nss_systemd(iterator);
+                if (r >= 0) {
                         /* Client-side NSS fallback */
                         r = nss_user_record_by_uid(uid, !FLAGS_SET(flags, USERDB_AVOID_SHADOW), ret);
                         if (r >= 0)
@@ -693,9 +701,9 @@ int userdb_all(UserDBFlags flags, UserDBIterator **ret) {
         r = userdb_start_query(iterator, "io.systemd.UserDatabase.GetUserRecord", true, NULL, flags);
 
         if (!FLAGS_SET(flags, USERDB_AVOID_NSS) && (r < 0 || !iterator->nss_covered)) {
-                iterator->nss_lock = userdb_nss_compat_disable();
-                if (iterator->nss_lock < 0 && iterator->nss_lock != -EBUSY)
-                        return iterator->nss_lock;
+                r = userdb_iterator_block_nss_systemd(iterator);
+                if (r < 0)
+                        return r;
 
                 setpwent();
                 iterator->nss_iterating = true;
@@ -815,10 +823,8 @@ int groupdb_by_name(const char *name, UserDBFlags flags, GroupRecord **ret) {
         }
 
         if (!FLAGS_SET(flags, USERDB_AVOID_NSS) && !(iterator && iterator->nss_covered)) {
-                r = userdb_nss_compat_disable();
-                if (r >= 0 || r == -EBUSY) {
-                        iterator->nss_lock = r;
-
+                r = userdb_iterator_block_nss_systemd(iterator);
+                if (r >= 0) {
                         r = nss_group_record_by_name(name, !FLAGS_SET(flags, USERDB_AVOID_SHADOW), ret);
                         if (r >= 0)
                                 return r;
@@ -861,10 +867,8 @@ int groupdb_by_gid(gid_t gid, UserDBFlags flags, GroupRecord **ret) {
         }
 
         if (!FLAGS_SET(flags, USERDB_AVOID_NSS) && !(iterator && iterator->nss_covered)) {
-                r = userdb_nss_compat_disable();
-                if (r >= 0 || r == -EBUSY) {
-                        iterator->nss_lock = r;
-
+                r = userdb_iterator_block_nss_systemd(iterator);
+                if (r >= 0) {
                         r = nss_group_record_by_gid(gid, !FLAGS_SET(flags, USERDB_AVOID_SHADOW), ret);
                         if (r >= 0)
                                 return r;
@@ -897,9 +901,9 @@ int groupdb_all(UserDBFlags flags, UserDBIterator **ret) {
         r = userdb_start_query(iterator, "io.systemd.UserDatabase.GetGroupRecord", true, NULL, flags);
 
         if (!FLAGS_SET(flags, USERDB_AVOID_NSS) && (r < 0 || !iterator->nss_covered)) {
-                iterator->nss_lock = userdb_nss_compat_disable();
-                if (iterator->nss_lock < 0 && iterator->nss_lock != -EBUSY)
-                        return iterator->nss_lock;
+                r = userdb_iterator_block_nss_systemd(iterator);
+                if (r < 0)
+                        return r;
 
                 setgrent();
                 iterator->nss_iterating = true;
@@ -998,9 +1002,9 @@ int membershipdb_by_user(const char *name, UserDBFlags flags, UserDBIterator **r
         if ((r >= 0 && iterator->nss_covered) || FLAGS_SET(flags, USERDB_AVOID_NSS))
                 goto finish;
 
-        iterator->nss_lock = userdb_nss_compat_disable();
-        if (iterator->nss_lock < 0 && iterator->nss_lock != -EBUSY)
-                return iterator->nss_lock;
+        r = userdb_iterator_block_nss_systemd(iterator);
+        if (r < 0)
+                return r;
 
         iterator->filter_user_name = strdup(name);
         if (!iterator->filter_user_name)
@@ -1041,9 +1045,9 @@ int membershipdb_by_group(const char *name, UserDBFlags flags, UserDBIterator **
         if ((r >= 0 && iterator->nss_covered) || FLAGS_SET(flags, USERDB_AVOID_NSS))
                 goto finish;
 
-        iterator->nss_lock = userdb_nss_compat_disable();
-        if (iterator->nss_lock < 0 && iterator->nss_lock != -EBUSY)
-                return iterator->nss_lock;
+        r = userdb_iterator_block_nss_systemd(iterator);
+        if (r < 0)
+                return r;
 
         /* We ignore all errors here, since the group might be defined by a userdb native service, and we queried them already above. */
         (void) nss_group_record_by_name(name, false, &gr);
@@ -1082,9 +1086,9 @@ int membershipdb_all(UserDBFlags flags, UserDBIterator **ret) {
         if ((r >= 0 && iterator->nss_covered) || FLAGS_SET(flags, USERDB_AVOID_NSS))
                 goto finish;
 
-        iterator->nss_lock = userdb_nss_compat_disable();
-        if (iterator->nss_lock < 0 && iterator->nss_lock != -EBUSY)
-                return iterator->nss_lock;
+        r = userdb_iterator_block_nss_systemd(iterator);
+        if (r < 0)
+                return r;
 
         setgrent();
         iterator->nss_iterating = true;
@@ -1221,115 +1225,24 @@ int membershipdb_by_group_strv(const char *name, UserDBFlags flags, char ***ret)
         return 0;
 }
 
-static int userdb_thread_sockaddr(struct sockaddr_un *ret_sa, socklen_t *ret_salen) {
-        static const uint8_t
-                k1[16] = { 0x35, 0xc1, 0x1f, 0x41, 0x59, 0xc6, 0xa0, 0xf9, 0x33, 0x4b, 0x17, 0x3d, 0xb9, 0xf6, 0x14, 0xd9 },
-                k2[16] = { 0x6a, 0x11, 0x4c, 0x37, 0xe5, 0xa3, 0x8c, 0xa6, 0x93, 0x55, 0x64, 0x8c, 0x93, 0xee, 0xa1, 0x7b };
-
-        struct siphash sh;
-        uint64_t x, y;
-        pid_t tid;
-        void *p;
-
-        assert(ret_sa);
-        assert(ret_salen);
-
-        /* This calculates an AF_UNIX socket address in the abstract namespace whose existence works as an
-         * indicator whether to emulate NSS records for complex user records that are also available via the
-         * varlink protocol. The name of the socket is picked in a way so that:
-         *
-         *     → it is per-thread (by hashing from the TID)
-         *
-         *     → is not guessable for foreign processes (by hashing from the — hopefully secret — AT_RANDOM
-         *       value every process gets passed from the kernel
-         *
-         * By using a socket the NSS emulation can be nicely turned off for limited amounts of time only,
-         * simply controlled by the lifetime of the fd itself. By using an AF_UNIX socket in the abstract
-         * namespace the lock is automatically cleaned up when the process dies abnormally.
-         *
-         */
-
-        p = ULONG_TO_PTR(getauxval(AT_RANDOM));
-        if (!p)
-                return -EIO;
-
-        tid = gettid();
-
-        siphash24_init(&sh, k1);
-        siphash24_compress(p, 16, &sh);
-        siphash24_compress(&tid, sizeof(tid), &sh);
-        x = siphash24_finalize(&sh);
-
-        siphash24_init(&sh, k2);
-        siphash24_compress(p, 16, &sh);
-        siphash24_compress(&tid, sizeof(tid), &sh);
-        y = siphash24_finalize(&sh);
-
-        *ret_sa = (struct sockaddr_un) {
-                .sun_family = AF_UNIX,
-        };
-
-        sprintf(ret_sa->sun_path + 1, "userdb-%016" PRIx64 "%016" PRIx64, x, y);
-        *ret_salen = offsetof(struct sockaddr_un, sun_path) + 1 + 7 + 32;
-
-        return 0;
-}
-
-int userdb_nss_compat_is_enabled(void) {
-        _cleanup_close_ int fd = -1;
-        union sockaddr_union sa;
-        socklen_t salen;
-        int r;
-
-        /* Tests whether the NSS compatibility logic is currently turned on for the invoking thread. Returns
-         * true if NSS compatibility is turned on, i.e. whether NSS records shall be synthesized from complex
-         * user records. */
-
-        r = userdb_thread_sockaddr(&sa.un, &salen);
-        if (r < 0)
-                return r;
-
-        fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
-        if (fd < 0)
-                return -errno;
+int userdb_block_nss_systemd(int b) {
+        _cleanup_(dlclosep) void *dl = NULL;
+        int (*call)(bool b);
 
-        /* Try to connect(). This doesn't do anything really, except that it checks whether the socket
-         * address is bound at all. */
-        if (connect(fd, &sa.sa, salen) < 0) {
-                if (errno == ECONNREFUSED) /* the socket is not bound, hence NSS emulation shall be done */
-                        return true;
+        /* Note that we might be called from libnss_systemd.so.2 itself, but that should be fine, really. */
 
-                return -errno;
+        dl = dlopen(ROOTLIBDIR "libnss_systemd.so.2", RTLD_LAZY|RTLD_NODELETE);
+        if (!dl) {
+                /* If the file isn't installed, don't complain loudly */
+                log_debug("Failed to dlopen(libnss_systemd.so.2), ignoring: %s", dlerror());
+                return 0;
         }
 
-        return false;
-}
-
-int userdb_nss_compat_disable(void) {
-        _cleanup_close_ int fd = -1;
-        union sockaddr_union sa;
-        socklen_t salen;
-        int r;
-
-        /* Turn off the NSS compatibility logic for the invoking thread. By default NSS records are
-         * synthesized for all complex user records looked up via NSS. If this call is invoked this is
-         * disabled for the invoking thread, but only for it. A caller that natively supports the varlink
-         * user record protocol may use that to turn off the compatibility for NSS lookups. */
-
-        r = userdb_thread_sockaddr(&sa.un, &salen);
-        if (r < 0)
-                return r;
-
-        fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
-        if (fd < 0)
-                return -errno;
-
-        if (bind(fd, &sa.sa, salen) < 0) {
-                if (errno == EADDRINUSE) /* lock already taken, convert this into a recognizable error */
-                        return -EBUSY;
-
-                return -errno;
-        }
+        call = (int (*)(bool b)) dlsym(dl, "_nss_systemd_block");
+        if (!call)
+                /* If the file is is installed but lacks the symbol we expect, things are weird, let's complain */
+                return log_debug_errno(SYNTHETIC_ERRNO(ELIBBAD),
+                                       "Unable to find symbol _nss_systemd_block in libnss_systemd.so.2: %s", dlerror());
 
-        return TAKE_FD(fd);
+        return call(b);
 }
index 8af31aa86c62a810b05ee7ee772baa2690de6ec9..2464f54c3e22e1dd2d79639d9d28c58e35d89293 100644 (file)
@@ -38,5 +38,4 @@ int membershipdb_all(UserDBFlags flags, UserDBIterator **ret);
 int membershipdb_iterator_get(UserDBIterator *iterator, char **user, char **group);
 int membershipdb_by_group_strv(const char *name, UserDBFlags flags, char ***ret);
 
-int userdb_nss_compat_is_enabled(void);
-int userdb_nss_compat_disable(void);
+int userdb_block_nss_systemd(int b);
index 9debb54390e6d80b5d09ab2da12b689726f4b4e4..9edcd8302ac79d204693a7600130d16af7491760 100644 (file)
@@ -25,8 +25,8 @@
 #include "utmp-wtmp.h"
 
 int utmp_get_runlevel(int *runlevel, int *previous) {
+        _cleanup_(utxent_cleanup) bool utmpx = false;
         struct utmpx *found, lookup = { .ut_type = RUN_LVL };
-        int r;
         const char *e;
 
         assert(runlevel);
@@ -35,8 +35,7 @@ int utmp_get_runlevel(int *runlevel, int *previous) {
          * precedence. Presumably, sysvinit does this to work around a
          * race condition that would otherwise exist where we'd always
          * go to disk and hence might read runlevel data that might be
-         * very new and does not apply to the current script being
-         * executed. */
+         * very new and not apply to the current script being executed. */
 
         e = getenv("RUNLEVEL");
         if (e && e[0] > 0) {
@@ -58,27 +57,17 @@ int utmp_get_runlevel(int *runlevel, int *previous) {
         if (utmpxname(_PATH_UTMPX) < 0)
                 return -errno;
 
-        setutxent();
+        utmpx = utxent_start();
 
         found = getutxid(&lookup);
         if (!found)
-                r = -errno;
-        else {
-                int a, b;
-
-                a = found->ut_pid & 0xFF;
-                b = (found->ut_pid >> 8) & 0xFF;
-
-                *runlevel = a;
-                if (previous)
-                        *previous = b;
-
-                r = 0;
-        }
+                return -errno;
 
-        endutxent();
+        *runlevel = found->ut_pid & 0xFF;
+        if (previous)
+                *previous = (found->ut_pid >> 8) & 0xFF;
 
-        return r;
+        return 0;
 }
 
 static void init_timestamp(struct utmpx *store, usec_t t) {
@@ -106,7 +95,7 @@ static void init_entry(struct utmpx *store, usec_t t) {
 }
 
 static int write_entry_utmp(const struct utmpx *store) {
-        int r;
+        _cleanup_(utxent_cleanup) bool utmpx = false;
 
         assert(store);
 
@@ -117,26 +106,35 @@ static int write_entry_utmp(const struct utmpx *store) {
         if (utmpxname(_PATH_UTMPX) < 0)
                 return -errno;
 
-        setutxent();
-
-        if (!pututxline(store))
-                r = -errno;
-        else
-                r = 0;
-
-        endutxent();
+        utmpx = utxent_start();
 
-        return r;
+        if (pututxline(store))
+                return 0;
+        if (errno == ENOENT) {
+                /* If utmp/wtmp have been disabled, that's a good thing, hence ignore the error. */
+                log_debug_errno(errno, "Not writing utmp: %m");
+                return 0;
+        }
+        return -errno;
 }
 
 static int write_entry_wtmp(const struct utmpx *store) {
         assert(store);
 
         /* wtmp is a simple append-only file where each entry is
-        simply appended to the end; i.e. basically a log. */
+         * simply appended to the end; i.e. basically a log. */
 
         errno = 0;
         updwtmpx(_PATH_WTMPX, store);
+        if (errno == ENOENT) {
+                /* If utmp/wtmp have been disabled, that's a good thing, hence ignore the error. */
+                log_debug_errno(errno, "Not writing wtmp: %m");
+                return 0;
+        }
+        if (errno == EROFS) {
+                log_warning_errno(errno, "Failed to write wtmp record, ignoring: %m");
+                return 0;
+        }
         return -errno;
 }
 
@@ -145,16 +143,7 @@ static int write_utmp_wtmp(const struct utmpx *store_utmp, const struct utmpx *s
 
         r = write_entry_utmp(store_utmp);
         s = write_entry_wtmp(store_wtmp);
-
-        if (r >= 0)
-                r = s;
-
-        /* If utmp/wtmp have been disabled, that's a good thing, hence
-         * ignore the errors */
-        if (r == -ENOENT)
-                r = 0;
-
-        return r;
+        return r < 0 ? r : s;
 }
 
 static int write_entry_both(const struct utmpx *store) {
index 9e433cf73ec5a968ad5149b3768b3b1369c1f4c4..fe55bad12d632bd85b11938eca87a0fba780bbf2 100644 (file)
@@ -8,6 +8,8 @@
 #include "util.h"
 
 #if ENABLE_UTMP
+#include <utmpx.h>
+
 int utmp_get_runlevel(int *runlevel, int *previous);
 
 int utmp_put_shutdown(void);
@@ -24,6 +26,15 @@ int utmp_wall(
         bool (*match_tty)(const char *tty, void *userdata),
         void *userdata);
 
+static inline bool utxent_start(void) {
+        setutxent();
+        return true;
+}
+static inline void utxent_cleanup(bool *initialized) {
+        if (initialized)
+                endutxent();
+}
+
 #else /* ENABLE_UTMP */
 
 static inline int utmp_get_runlevel(int *runlevel, int *previous) {
index 1f4d5a614c9e87256491589241c30d0809118ef3..be3559dc1037efec091ba4a1843daad3e0f0f919 100644 (file)
@@ -387,7 +387,7 @@ DEFINE_TRIVIAL_REF_UNREF_FUNC(Varlink, varlink, varlink_destroy);
 static int varlink_test_disconnect(Varlink *v) {
         assert(v);
 
-        /* Tests whether we the the connection has been terminated. We are careful to not stop processing it
+        /* Tests whether we the connection has been terminated. We are careful to not stop processing it
          * prematurely, since we want to handle half-open connections as well as possible and want to flush
          * out and read data before we close down if we can. */
 
index f494ca6ffb8ccb02d03a81de4540d38cd2818a13..7029352ca5b010661d18a5939be8219f6aa77d97 100644 (file)
@@ -71,7 +71,7 @@ static int write_hibernate_location_info(const HibernateLocation *hibernate_loca
                         return 0;
                 }
 
-                return log_debug_errno(errno, "/sys/power/resume_offset not writeable: %m");
+                return log_debug_errno(errno, "/sys/power/resume_offset not writable: %m");
         }
 
         xsprintf(offset_str, "%" PRIu64, hibernate_location->offset);
index 7b548c50768d5a4e50b12477d3ccf30ffb4ebd9c..b461aead60cd9bc459e4604af001d25c24562d3d 100644 (file)
@@ -480,25 +480,21 @@ static int add_connection_socket(Context *context, int fd) {
                         log_warning_errno(r, "Unable to disable idle timer, continuing: %m");
         }
 
-        r = set_ensure_allocated(&context->connections, NULL);
-        if (r < 0) {
-                log_oom();
-                return 0;
-        }
-
-        c = new0(Connection, 1);
+        c = new(Connection, 1);
         if (!c) {
                 log_oom();
                 return 0;
         }
 
-        c->context = context;
-        c->server_fd = fd;
-        c->client_fd = -1;
-        c->server_to_client_buffer[0] = c->server_to_client_buffer[1] = -1;
-        c->client_to_server_buffer[0] = c->client_to_server_buffer[1] = -1;
+        *c = (Connection) {
+               .context = context,
+               .server_fd = fd,
+               .client_fd = -1,
+               .server_to_client_buffer = {-1, -1},
+               .client_to_server_buffer = {-1, -1},
+        };
 
-        r = set_put(context->connections, c);
+        r = set_ensure_put(&context->connections, NULL, c);
         if (r < 0) {
                 free(c);
                 log_oom();
@@ -550,12 +546,6 @@ static int add_listen_socket(Context *context, int fd) {
         assert(context);
         assert(fd >= 0);
 
-        r = set_ensure_allocated(&context->listen, NULL);
-        if (r < 0) {
-                log_oom();
-                return r;
-        }
-
         r = sd_is_socket(fd, 0, SOCK_STREAM, 1);
         if (r < 0)
                 return log_error_errno(r, "Failed to determine socket type: %m");
@@ -571,7 +561,7 @@ static int add_listen_socket(Context *context, int fd) {
         if (r < 0)
                 return log_error_errno(r, "Failed to add event source: %m");
 
-        r = set_put(context->listen, source);
+        r = set_ensure_put(&context->listen, NULL, source);
         if (r < 0) {
                 log_error_errno(r, "Failed to add source to set: %m");
                 sd_event_source_unref(source);
index ad7400bacc233fc49d4e84821685812a409e558e..c58a19a099d0780a099c93cf044854842cc75753 100644 (file)
 #include "bootspec.h"
 #include "bus-common-errors.h"
 #include "bus-error.h"
+#include "bus-locator.h"
+#include "bus-map-properties.h"
 #include "bus-message.h"
+#include "bus-print-properties.h"
 #include "bus-unit-procs.h"
 #include "bus-unit-util.h"
-#include "bus-util.h"
 #include "bus-wait-for-jobs.h"
 #include "bus-wait-for-units.h"
 #include "cgroup-show.h"
@@ -390,7 +392,7 @@ static int output_table(Table *table) {
         else
                 r = table_print(table, NULL);
         if (r < 0)
-                return log_error_errno(r, "Failed to show table: %m");
+                return table_log_print_error(r);
 
         return 0;
 }
@@ -4819,13 +4821,13 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m
 
                 } else if (STR_IN_SET(name, "SystemCallFilter", "RestrictAddressFamilies")) {
                         _cleanup_strv_free_ char **l = NULL;
-                        int whitelist;
+                        int allow_list;
 
                         r = sd_bus_message_enter_container(m, 'r', "bas");
                         if (r < 0)
                                 return bus_log_parse_error(r);
 
-                        r = sd_bus_message_read(m, "b", &whitelist);
+                        r = sd_bus_message_read(m, "b", &allow_list);
                         if (r < 0)
                                 return bus_log_parse_error(r);
 
@@ -4837,7 +4839,7 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m
                         if (r < 0)
                                 return bus_log_parse_error(r);
 
-                        if (all || whitelist || !strv_isempty(l)) {
+                        if (all || allow_list || !strv_isempty(l)) {
                                 bool first = true;
                                 char **i;
 
@@ -4846,7 +4848,7 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m
                                         fputc('=', stdout);
                                 }
 
-                                if (!whitelist)
+                                if (!allow_list)
                                         fputc('~', stdout);
 
                                 STRV_FOREACH(i, l) {
@@ -5188,7 +5190,7 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m
 
                         return 1;
 
-                } else if (contents[0] == SD_BUS_TYPE_BYTE && streq(name, "StandardInputData")) {
+                } else if (contents[0] == SD_BUS_TYPE_BYTE && STR_IN_SET(name, "StandardInputData", "RootHashSignature")) {
                         _cleanup_free_ char *h = NULL;
                         const void *p;
                         size_t sz;
@@ -9207,7 +9209,7 @@ static int run(int argc, char *argv[]) {
         int r;
 
         setlocale(LC_ALL, "");
-        log_parse_environment();
+        log_parse_environment_cli();
         log_open();
 
         /* The journal merging logic potentially needs a lot of fds. */
index 2dc9f6324623d1d51ebf29c315e967aa751105b3..c2abc201216e2980b89940c937bcff3730c138bb 100644 (file)
@@ -176,7 +176,7 @@ int sd_lldp_neighbor_get_mud_url(sd_lldp_neighbor *n, const char **ret);
 int sd_lldp_neighbor_get_system_capabilities(sd_lldp_neighbor *n, uint16_t *ret);
 int sd_lldp_neighbor_get_enabled_capabilities(sd_lldp_neighbor *n, uint16_t *ret);
 
-/* Low-level, iterative TLV access. This is for evertyhing else, it iteratively goes through all available TLVs
+/* Low-level, iterative TLV access. This is for everything else, it iteratively goes through all available TLVs
  * (including the ones covered with the calls above), and allows multiple TLVs for the same fields. */
 int sd_lldp_neighbor_tlv_rewind(sd_lldp_neighbor *n);
 int sd_lldp_neighbor_tlv_next(sd_lldp_neighbor *n);
index f5dd0a04c76dea7a53a5bc097acc9291bc33c230..00846ea00bb8f59876d24fa579c3b3f9040b9053 100644 (file)
@@ -166,6 +166,10 @@ _SD_BEGIN_DECLARATIONS;
 #define SD_MESSAGE_MOUNT_POINT_PATH_NOT_SUITABLE_STR \
                                           SD_ID128_MAKE_STR(1b,3b,b9,40,37,f0,4b,bf,81,02,8e,13,5a,12,d2,93)
 
+#define SD_MESSAGE_NOBODY_USER_UNSUITABLE SD_ID128_MAKE(b4,80,32,5f,9c,39,4a,7b,80,2c,23,1e,51,a2,75,2c)
+#define SD_MESSAGE_NOBODY_USER_UNSUITABLE_STR \
+                                          SD_ID128_MAKE_STR(b4,80,32,5f,9c,39,4a,7b,80,2c,23,1e,51,a2,75,2c)
+
 _SD_END_DECLARATIONS;
 
 #endif
index edb40850b160e8bd7e7a21a3404df6de00551893..42bcd74b745885b2f0875d35a65e5cf208e545d1 100644 (file)
@@ -110,10 +110,6 @@ int sd_network_link_get_network_file(int ifindex, char **filename);
  * IP addresses */
 int sd_network_link_get_dns(int ifindex, char ***ret);
 
-/* Get DHCP4 address for a given link. This is string representations of
- * IPv4 address */
-int sd_network_link_get_dhcp4_address(int ifindex, char **ret);
-
 /* Get NTP entries for a given link. These are domain names or string
  * representations of IP addresses */
 int sd_network_link_get_ntp(int ifindex, char ***ret);
@@ -173,12 +169,6 @@ int sd_network_link_get_carrier_bound_to(int ifindex, int **ifindexes);
 /* Get the CARRIERS that are bound to current link. */
 int sd_network_link_get_carrier_bound_by(int ifindex, int **ifindexes);
 
-/* Get the timezone that was learnt on a specific link. */
-int sd_network_link_get_timezone(int ifindex, char **timezone);
-
-/* Get DHCPv4 client id for a given link. */
-int sd_network_link_get_dhcp4_client_id_string(int ifindex, char **client_id);
-
 /* Get DHCPv6 client IAID for a given link. */
 int sd_network_link_get_dhcp6_client_iaid_string(int ifindex, char **iaid);
 
index 6fbd5985d365b3bb00b56502084d9c9f7ed966f9..b5e7e08eee969c34c4617b6599ff12e0ac921da2 100644 (file)
@@ -1898,7 +1898,7 @@ static int run(int argc, char *argv[]) {
 
         r = mac_selinux_init();
         if (r < 0)
-                return log_error_errno(r, "SELinux setup failed: %m");
+                return r;
 
         /* If command line arguments are specified along with --replace, read all
          * configuration files and insert the positional arguments at the specified
index eb6b2d084ef486f5097141d28d75d79ceefb383a..a2c72d1009d720b5cf6f66d3a94e5c0f0688490c 100644 (file)
@@ -817,7 +817,6 @@ static int set_dependencies_from_rcnd(const LookupPaths *lp, Hashmap *all_servic
         Set *runlevel_services[ELEMENTSOF(rcnd_table)] = {};
         _cleanup_strv_free_ char **sysvrcnd_path = NULL;
         SysvStub *service;
-        unsigned i;
         Iterator j;
         char **p;
         int r;
@@ -828,9 +827,8 @@ static int set_dependencies_from_rcnd(const LookupPaths *lp, Hashmap *all_servic
         if (r < 0)
                 return r;
 
-        STRV_FOREACH(p, sysvrcnd_path) {
-                for (i = 0; i < ELEMENTSOF(rcnd_table); i ++) {
-
+        STRV_FOREACH(p, sysvrcnd_path)
+                for (unsigned i = 0; i < ELEMENTSOF(rcnd_table); i ++) {
                         _cleanup_closedir_ DIR *d = NULL;
                         _cleanup_free_ char *path = NULL;
                         struct dirent *de;
@@ -885,22 +883,15 @@ static int set_dependencies_from_rcnd(const LookupPaths *lp, Hashmap *all_servic
 
                                 service->sysv_start_priority = MAX(a*10 + b, service->sysv_start_priority);
 
-                                r = set_ensure_allocated(&runlevel_services[i], NULL);
-                                if (r < 0) {
-                                        log_oom();
-                                        goto finish;
-                                }
-
-                                r = set_put(runlevel_services[i], service);
+                                r = set_ensure_put(&runlevel_services[i], NULL, service);
                                 if (r < 0) {
                                         log_oom();
                                         goto finish;
                                 }
                         }
                 }
-        }
 
-        for (i = 0; i < ELEMENTSOF(rcnd_table); i ++)
+        for (unsigned i = 0; i < ELEMENTSOF(rcnd_table); i++)
                 SET_FOREACH(service, runlevel_services[i], j) {
                         r = strv_extend(&service->before, rcnd_table[i].target);
                         if (r < 0) {
@@ -917,7 +908,7 @@ static int set_dependencies_from_rcnd(const LookupPaths *lp, Hashmap *all_servic
         r = 0;
 
 finish:
-        for (i = 0; i < ELEMENTSOF(rcnd_table); i++)
+        for (unsigned i = 0; i < ELEMENTSOF(rcnd_table); i++)
                 set_free(runlevel_services[i]);
 
         return r;
index 1322af48122397ad5486c0d8ed9496624dc70f74..d2740bca73012938dd750fa929c6efe721e2c02d 100644 (file)
@@ -24,7 +24,7 @@ static void test_policy_closed(const char *cgroup_path, BPFProgram **installed_p
         r = bpf_devices_cgroup_init(&prog, CGROUP_DEVICE_POLICY_CLOSED, true);
         assert_se(r >= 0);
 
-        r = bpf_devices_whitelist_static(prog, cgroup_path);
+        r = bpf_devices_allow_list_static(prog, cgroup_path);
         assert_se(r >= 0);
 
         r = bpf_devices_apply_policy(prog, CGROUP_DEVICE_POLICY_CLOSED, true, cgroup_path, installed_prog);
@@ -62,13 +62,13 @@ static void test_policy_strict(const char *cgroup_path, BPFProgram **installed_p
         r = bpf_devices_cgroup_init(&prog, CGROUP_DEVICE_POLICY_STRICT, true);
         assert_se(r >= 0);
 
-        r = bpf_devices_whitelist_device(prog, cgroup_path, "/dev/null", "rw");
+        r = bpf_devices_allow_list_device(prog, cgroup_path, "/dev/null", "rw");
         assert_se(r >= 0);
 
-        r = bpf_devices_whitelist_device(prog, cgroup_path, "/dev/random", "r");
+        r = bpf_devices_allow_list_device(prog, cgroup_path, "/dev/random", "r");
         assert_se(r >= 0);
 
-        r = bpf_devices_whitelist_device(prog, cgroup_path, "/dev/zero", "w");
+        r = bpf_devices_allow_list_device(prog, cgroup_path, "/dev/zero", "w");
         assert_se(r >= 0);
 
         r = bpf_devices_apply_policy(prog, CGROUP_DEVICE_POLICY_STRICT, true, cgroup_path, installed_prog);
@@ -129,7 +129,7 @@ static void test_policy_strict(const char *cgroup_path, BPFProgram **installed_p
         assert_se(wrong == 0);
 }
 
-static void test_policy_whitelist_major(const char *pattern, const char *cgroup_path, BPFProgram **installed_prog) {
+static void test_policy_allow_list_major(const char *pattern, const char *cgroup_path, BPFProgram **installed_prog) {
         _cleanup_(bpf_program_unrefp) BPFProgram *prog = NULL;
         unsigned wrong = 0;
         int r;
@@ -139,7 +139,7 @@ static void test_policy_whitelist_major(const char *pattern, const char *cgroup_
         r = bpf_devices_cgroup_init(&prog, CGROUP_DEVICE_POLICY_STRICT, true);
         assert_se(r >= 0);
 
-        r = bpf_devices_whitelist_major(prog, cgroup_path, pattern, 'c', "rw");
+        r = bpf_devices_allow_list_major(prog, cgroup_path, pattern, 'c', "rw");
         assert_se(r >= 0);
 
         r = bpf_devices_apply_policy(prog, CGROUP_DEVICE_POLICY_STRICT, true, cgroup_path, installed_prog);
@@ -188,7 +188,7 @@ static void test_policy_whitelist_major(const char *pattern, const char *cgroup_
         assert_se(wrong == 0);
 }
 
-static void test_policy_whitelist_major_star(char type, const char *cgroup_path, BPFProgram **installed_prog) {
+static void test_policy_allow_list_major_star(char type, const char *cgroup_path, BPFProgram **installed_prog) {
         _cleanup_(bpf_program_unrefp) BPFProgram *prog = NULL;
         unsigned wrong = 0;
         int r;
@@ -198,7 +198,7 @@ static void test_policy_whitelist_major_star(char type, const char *cgroup_path,
         r = bpf_devices_cgroup_init(&prog, CGROUP_DEVICE_POLICY_STRICT, true);
         assert_se(r >= 0);
 
-        r = bpf_devices_whitelist_major(prog, cgroup_path, "*", type, "rw");
+        r = bpf_devices_allow_list_major(prog, cgroup_path, "*", type, "rw");
         assert_se(r >= 0);
 
         r = bpf_devices_apply_policy(prog, CGROUP_DEVICE_POLICY_STRICT, true, cgroup_path, installed_prog);
@@ -230,7 +230,7 @@ static void test_policy_empty(bool add_mismatched, const char *cgroup_path, BPFP
         assert_se(r >= 0);
 
         if (add_mismatched) {
-                r = bpf_devices_whitelist_major(prog, cgroup_path, "foobarxxx", 'c', "rw");
+                r = bpf_devices_allow_list_major(prog, cgroup_path, "foobarxxx", 'c', "rw");
                 assert_se(r < 0);
         }
 
@@ -287,11 +287,11 @@ int main(int argc, char *argv[]) {
         test_policy_closed(cgroup, &prog);
         test_policy_strict(cgroup, &prog);
 
-        test_policy_whitelist_major("mem", cgroup, &prog);
-        test_policy_whitelist_major("1", cgroup, &prog);
+        test_policy_allow_list_major("mem", cgroup, &prog);
+        test_policy_allow_list_major("1", cgroup, &prog);
 
-        test_policy_whitelist_major_star('c', cgroup, &prog);
-        test_policy_whitelist_major_star('b', cgroup, &prog);
+        test_policy_allow_list_major_star('c', cgroup, &prog);
+        test_policy_allow_list_major_star('b', cgroup, &prog);
 
         test_policy_empty(false, cgroup, &prog);
         test_policy_empty(true, cgroup, &prog);
index 0b7dd8764f0d941e40df4c4bcc0b6d636d146932..f7b3dd5e00509b873bd0d397e43eab7211747b41 100644 (file)
@@ -84,9 +84,7 @@ static int parse_argv(int argc, char *argv[]) {
 static int run(int argc, char **argv) {
         int r;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 43f66efa6c92117049e94edae9d4bca2e882a1b9..9ca062021657219847b67fc5aa4685fb2c3cb539 100644 (file)
@@ -467,7 +467,7 @@ static void test_exec_restrictnamespaces(Manager *m) {
         test(__func__, m, "exec-restrictnamespaces-no.service", can_unshare ? 0 : EXIT_FAILURE, CLD_EXITED);
         test(__func__, m, "exec-restrictnamespaces-yes.service", 1, CLD_EXITED);
         test(__func__, m, "exec-restrictnamespaces-mnt.service", can_unshare ? 0 : EXIT_FAILURE, CLD_EXITED);
-        test(__func__, m, "exec-restrictnamespaces-mnt-blacklist.service", 1, CLD_EXITED);
+        test(__func__, m, "exec-restrictnamespaces-mnt-deny-list.service", 1, CLD_EXITED);
         test(__func__, m, "exec-restrictnamespaces-merge-and.service", can_unshare ? 0 : EXIT_FAILURE, CLD_EXITED);
         test(__func__, m, "exec-restrictnamespaces-merge-or.service", can_unshare ? 0 : EXIT_FAILURE, CLD_EXITED);
         test(__func__, m, "exec-restrictnamespaces-merge-all.service", can_unshare ? 0 : EXIT_FAILURE, CLD_EXITED);
index 515f14b8ca9209ea46a65d0edd457e84b8a0e35f..f309160889798e410250776f70e29112360bda2f 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "alloc-util.h"
 #include "fileio.h"
+#include "fs-util.h"
 #include "install.h"
 #include "mkdir.h"
 #include "rm-rf.h"
@@ -23,6 +24,7 @@ static void test_basic_mask_and_enable(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "b.service", NULL) == -ENOENT);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "c.service", NULL) == -ENOENT);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "d.service", NULL) == -ENOENT);
+        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "e.service", NULL) == -ENOENT);
 
         p = strjoina(root, "/usr/lib/systemd/system/a.service");
         assert_se(write_string_file(p,
@@ -150,6 +152,22 @@ static void test_basic_mask_and_enable(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "b.service", &state) >= 0 && state == UNIT_FILE_ALIAS);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "c.service", &state) >= 0 && state == UNIT_FILE_ALIAS);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "d.service", &state) >= 0 && state == UNIT_FILE_ALIAS);
+
+        /* Test masking with relative symlinks */
+
+        p = strjoina(root, "/usr/lib/systemd/system/e.service");
+        assert_se(symlink("../../../../../../dev/null", p) >= 0);
+
+        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "e.service", NULL) >= 0);
+        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "e.service", &state) >= 0 && state == UNIT_FILE_MASKED);
+
+        assert_se(unlink(p) == 0);
+        assert_se(symlink("/usr/../dev/null", p) >= 0);
+
+        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "e.service", NULL) >= 0);
+        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "e.service", &state) >= 0 && state == UNIT_FILE_MASKED);
+
+        assert_se(unlink(p) == 0);
 }
 
 static void test_linked_units(const char *root) {
index 7de286436d3d871c57ea51d8ddb11281978b5d5a..0293d1cd0f06280a6b396bac3f9981e07642b404 100644 (file)
@@ -27,6 +27,9 @@
 #include "tmpfile-util.h"
 #include "user-util.h"
 
+/* Nontrivial value serves as a placeholder to check that parsing function (didn't) change it */
+#define CGROUP_LIMIT_DUMMY      3
+
 static int test_unit_file_get_set(void) {
         int r;
         Hashmap *h;
@@ -773,6 +776,62 @@ static void test_unit_dump_config_items(void) {
         unit_dump_config_items(stdout);
 }
 
+static void test_config_parse_memory_limit(void) {
+        /* int config_parse_memory_limit(
+                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) */
+        CGroupContext c;
+        struct limit_test {
+                const char *limit;
+                const char *value;
+                uint64_t *result;
+                uint64_t expected;
+        } limit_tests[]= {
+                { "MemoryMin",  "",             &c.memory_min,  CGROUP_LIMIT_MIN },
+                { "MemoryMin",  "0",            &c.memory_min,  CGROUP_LIMIT_MIN },
+                { "MemoryMin",  "10",           &c.memory_min,  10 },
+                { "MemoryMin",  "infinity",     &c.memory_min,  CGROUP_LIMIT_MAX },
+                { "MemoryLow",  "",             &c.memory_low,  CGROUP_LIMIT_MIN },
+                { "MemoryLow",  "0",            &c.memory_low,  CGROUP_LIMIT_MIN },
+                { "MemoryLow",  "10",           &c.memory_low,  10 },
+                { "MemoryLow",  "infinity",     &c.memory_low,  CGROUP_LIMIT_MAX },
+                { "MemoryHigh", "",             &c.memory_high, CGROUP_LIMIT_MAX },
+                { "MemoryHigh", "0",            &c.memory_high, CGROUP_LIMIT_DUMMY },
+                { "MemoryHigh", "10",           &c.memory_high, 10 },
+                { "MemoryHigh", "infinity",     &c.memory_high, CGROUP_LIMIT_MAX },
+                { "MemoryMax",  "",             &c.memory_max,  CGROUP_LIMIT_MAX },
+                { "MemoryMax",  "0",            &c.memory_max,  CGROUP_LIMIT_DUMMY },
+                { "MemoryMax",  "10",           &c.memory_max,  10 },
+                { "MemoryMax",  "infinity",     &c.memory_max,  CGROUP_LIMIT_MAX },
+        };
+        size_t i;
+        int r;
+
+        for (i = 0; i < ELEMENTSOF(limit_tests); i++) {
+                c.memory_min = CGROUP_LIMIT_DUMMY;
+                c.memory_low = CGROUP_LIMIT_DUMMY;
+                c.memory_high = CGROUP_LIMIT_DUMMY;
+                c.memory_max = CGROUP_LIMIT_DUMMY;
+                r = config_parse_memory_limit(NULL, "fake", 1, "section", 1,
+                                              limit_tests[i].limit, 1,
+                                              limit_tests[i].value, &c, NULL);
+                log_info("%s=%s\t%"PRIu64"==%"PRIu64"\n",
+                         limit_tests[i].limit, limit_tests[i].value,
+                         *limit_tests[i].result, limit_tests[i].expected);
+                assert_se(r >= 0);
+                assert_se(*limit_tests[i].result == limit_tests[i].expected);
+        }
+
+}
+
 int main(int argc, char *argv[]) {
         _cleanup_(rm_rf_physical_and_freep) char *runtime_dir = NULL;
         int r;
@@ -793,6 +852,7 @@ int main(int argc, char *argv[]) {
         test_config_parse_pass_environ();
         TEST_REQ_RUNNING_SYSTEMD(test_install_printf());
         test_unit_dump_config_items();
+        test_config_parse_memory_limit();
 
         return r;
 }
index 45b67821456d71797c0e99a42a628cb02c52ca72..347982dd5240f7c9e310d9a4f6ed0c2259fa91ac 100644 (file)
@@ -89,7 +89,7 @@ static void test_keymaps(void) {
 
 #define dump_glyph(x) log_info(STRINGIFY(x) ": %s", special_glyph(x))
 static void dump_special_glyphs(void) {
-        assert_cc(SPECIAL_GLYPH_LOCK_AND_KEY + 1 == _SPECIAL_GLYPH_MAX);
+        assert_cc(SPECIAL_GLYPH_TOUCH + 1 == _SPECIAL_GLYPH_MAX);
 
         log_info("/* %s */", __func__);
 
@@ -116,6 +116,7 @@ static void dump_special_glyphs(void) {
         dump_glyph(SPECIAL_GLYPH_UNHAPPY_SMILEY);
         dump_glyph(SPECIAL_GLYPH_DEPRESSED_SMILEY);
         dump_glyph(SPECIAL_GLYPH_LOCK_AND_KEY);
+        dump_glyph(SPECIAL_GLYPH_TOUCH);
 }
 
 int main(int argc, char *argv[]) {
index d0b4ec27644710d161cacc2d85e4742944c878f2..ad135e146feae336bb4d10adca87869e7ea8d0e7 100644 (file)
@@ -157,6 +157,9 @@ static void test_protect_kernel_logs(void) {
                                     NULL,
                                     NULL,
                                     0,
+                                    NULL,
+                                    NULL,
+                                    0,
                                     NULL);
                 assert_se(r == 0);
 
index ba2c2ed53b77b40c4431707b7136344af6d23b99..cbc41b7a385ef57a115f46207effc0dbb17d60f7 100644 (file)
@@ -81,6 +81,9 @@ int main(int argc, char *argv[]) {
                             NULL,
                             NULL,
                             0,
+                            NULL,
+                            NULL,
+                            0,
                             NULL);
         if (r < 0) {
                 log_error_errno(r, "Failed to set up namespace: %m");
index 830d5f261bc32647026174f89b5e049281f7d2fa..0b2b4ab554d354bbdefc56747d17aa807cee4ead 100644 (file)
@@ -61,28 +61,34 @@ static void shutdown_test(Manager *m) {
         manager_free(m);
 }
 
-static void check_stop_unlink(Manager *m, Unit *unit, const char *test_path, const char *service_name) {
+static Service *service_for_path(Manager *m, Path *path, const char *service_name) {
         _cleanup_free_ char *tmp = NULL;
         Unit *service_unit = NULL;
-        Service *service = NULL;
-        usec_t ts;
-        usec_t timeout = 2 * USEC_PER_SEC;
 
         assert_se(m);
-        assert_se(unit);
-        assert_se(test_path);
+        assert_se(path);
 
         if (!service_name) {
-                assert_se(tmp = strreplace(unit->id, ".path", ".service"));
+                assert_se(tmp = strreplace(UNIT(path)->id, ".path", ".service"));
                 service_unit = manager_get_unit(m, tmp);
         } else
                 service_unit = manager_get_unit(m, service_name);
         assert_se(service_unit);
-        service = SERVICE(service_unit);
+
+        return SERVICE(service_unit);
+}
+
+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);
-        /* We process events until the service related to the path has been successfully started */
-        while (service->result != SERVICE_SUCCESS || service->state != SERVICE_START) {
+
+        while (path->result != PATH_SUCCESS || service->result != SERVICE_SUCCESS ||
+               path->state != path_state || service->state != service_state) {
                 usec_t n;
                 int r;
 
@@ -90,119 +96,216 @@ static void check_stop_unlink(Manager *m, Unit *unit, const char *test_path, con
                 assert_se(r >= 0);
 
                 printf("%s: state = %s; result = %s \n",
-                                service_unit->id,
+                                UNIT(path)->id,
+                                path_state_to_string(path->state),
+                                path_result_to_string(path->result));
+                printf("%s: state = %s; result = %s \n",
+                                UNIT(service)->id,
                                 service_state_to_string(service->state),
                                 service_result_to_string(service->result));
 
-                /* But we timeout if the service has not been started in the allocated time */
                 n = now(CLOCK_MONOTONIC);
                 if (ts + timeout < n) {
-                        log_error("Test timeout when testing %s", unit->id);
+                        log_error("Test timeout when testing %s", UNIT(path)->id);
                         exit(EXIT_FAILURE);
                 }
         }
-
-        assert_se(unit_stop(unit) >= 0);
-        (void) rm_rf(test_path, REMOVE_ROOT|REMOVE_PHYSICAL);
 }
 
 static void test_path_exists(Manager *m) {
         const char *test_path = "/tmp/test-path_exists";
         Unit *unit = NULL;
+        Path *path = NULL;
+        Service *service = NULL;
 
         assert_se(m);
 
         assert_se(manager_load_startable_unit_or_warn(m, "path-exists.path", NULL, &unit) >= 0);
+
+        path = PATH(unit);
+        service = service_for_path(m, path, NULL);
+
         assert_se(unit_start(unit) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
 
         assert_se(touch(test_path) >= 0);
+        check_states(m, path, service, PATH_RUNNING, SERVICE_RUNNING);
+
+        /* Service restarts if file still exists */
+        assert_se(unit_stop(UNIT(service)) >= 0);
+        check_states(m, path, service, PATH_RUNNING, SERVICE_RUNNING);
+
+        assert_se(rm_rf(test_path, REMOVE_ROOT|REMOVE_PHYSICAL) == 0);
+        assert_se(unit_stop(UNIT(service)) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
 
-        check_stop_unlink(m, unit, test_path, NULL);
+        assert_se(unit_stop(unit) >= 0);
 }
 
 static void test_path_existsglob(Manager *m) {
         const char *test_path = "/tmp/test-path_existsglobFOOBAR";
         Unit *unit = NULL;
+        Path *path = NULL;
+        Service *service = NULL;
 
         assert_se(m);
+
         assert_se(manager_load_startable_unit_or_warn(m, "path-existsglob.path", NULL, &unit) >= 0);
+
+        path = PATH(unit);
+        service = service_for_path(m, path, NULL);
+
         assert_se(unit_start(unit) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
 
         assert_se(touch(test_path) >= 0);
+        check_states(m, path, service, PATH_RUNNING, SERVICE_RUNNING);
+
+        /* Service restarts if file still exists */
+        assert_se(unit_stop(UNIT(service)) >= 0);
+        check_states(m, path, service, PATH_RUNNING, SERVICE_RUNNING);
 
-        check_stop_unlink(m, unit, test_path, NULL);
+        assert_se(rm_rf(test_path, REMOVE_ROOT|REMOVE_PHYSICAL) == 0);
+        assert_se(unit_stop(UNIT(service)) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
+
+        assert_se(unit_stop(unit) >= 0);
 }
 
 static void test_path_changed(Manager *m) {
         const char *test_path = "/tmp/test-path_changed";
         FILE *f;
         Unit *unit = NULL;
+        Path *path = NULL;
+        Service *service = NULL;
 
         assert_se(m);
 
-        assert_se(touch(test_path) >= 0);
-
         assert_se(manager_load_startable_unit_or_warn(m, "path-changed.path", NULL, &unit) >= 0);
+
+        path = PATH(unit);
+        service = service_for_path(m, path, NULL);
+
         assert_se(unit_start(unit) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
+
+        assert_se(touch(test_path) >= 0);
+        check_states(m, path, service, PATH_RUNNING, SERVICE_RUNNING);
+
+        /* Service does not restart if file still exists */
+        assert_se(unit_stop(UNIT(service)) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
 
         f = fopen(test_path, "w");
         assert_se(f);
         fclose(f);
 
-        check_stop_unlink(m, unit, test_path, NULL);
+        check_states(m, path, service, PATH_RUNNING, SERVICE_RUNNING);
+
+        assert_se(unit_stop(UNIT(service)) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
+
+        (void) rm_rf(test_path, REMOVE_ROOT|REMOVE_PHYSICAL);
+        assert_se(unit_stop(unit) >= 0);
 }
 
 static void test_path_modified(Manager *m) {
         _cleanup_fclose_ FILE *f = NULL;
         const char *test_path = "/tmp/test-path_modified";
         Unit *unit = NULL;
+        Path *path = NULL;
+        Service *service = NULL;
 
         assert_se(m);
 
-        assert_se(touch(test_path) >= 0);
-
         assert_se(manager_load_startable_unit_or_warn(m, "path-modified.path", NULL, &unit) >= 0);
+
+        path = PATH(unit);
+        service = service_for_path(m, path, NULL);
+
         assert_se(unit_start(unit) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
+
+        assert_se(touch(test_path) >= 0);
+        check_states(m, path, service, PATH_RUNNING, SERVICE_RUNNING);
+
+        /* Service does not restart if file still exists */
+        assert_se(unit_stop(UNIT(service)) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
 
         f = fopen(test_path, "w");
         assert_se(f);
         fputs("test", f);
 
-        check_stop_unlink(m, unit, test_path, NULL);
+        check_states(m, path, service, PATH_RUNNING, SERVICE_RUNNING);
+
+        assert_se(unit_stop(UNIT(service)) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
+
+        (void) rm_rf(test_path, REMOVE_ROOT|REMOVE_PHYSICAL);
+        assert_se(unit_stop(unit) >= 0);
 }
 
 static void test_path_unit(Manager *m) {
         const char *test_path = "/tmp/test-path_unit";
         Unit *unit = NULL;
+        Path *path = NULL;
+        Service *service = NULL;
 
         assert_se(m);
 
         assert_se(manager_load_startable_unit_or_warn(m, "path-unit.path", NULL, &unit) >= 0);
+
+        path = PATH(unit);
+        service = service_for_path(m, path, "path-mycustomunit.service");
+
         assert_se(unit_start(unit) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
 
         assert_se(touch(test_path) >= 0);
+        check_states(m, path, service, PATH_RUNNING, SERVICE_RUNNING);
+
+        assert_se(rm_rf(test_path, REMOVE_ROOT|REMOVE_PHYSICAL) == 0);
+        assert_se(unit_stop(UNIT(service)) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
 
-        check_stop_unlink(m, unit, test_path, "path-mycustomunit.service");
+        assert_se(unit_stop(unit) >= 0);
 }
 
 static void test_path_directorynotempty(Manager *m) {
         const char *test_path = "/tmp/test-path_directorynotempty/";
         Unit *unit = NULL;
+        Path *path = NULL;
+        Service *service = NULL;
 
         assert_se(m);
 
+        assert_se(manager_load_startable_unit_or_warn(m, "path-directorynotempty.path", NULL, &unit) >= 0);
+
+        path = PATH(unit);
+        service = service_for_path(m, path, NULL);
+
         assert_se(access(test_path, F_OK) < 0);
 
-        assert_se(manager_load_startable_unit_or_warn(m, "path-directorynotempty.path", NULL, &unit) >= 0);
         assert_se(unit_start(unit) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
 
         /* MakeDirectory default to no */
         assert_se(access(test_path, F_OK) < 0);
 
         assert_se(mkdir_p(test_path, 0755) >= 0);
         assert_se(touch(strjoina(test_path, "test_file")) >= 0);
+        check_states(m, path, service, PATH_RUNNING, SERVICE_RUNNING);
+
+        /* Service restarts if directory is still not empty */
+        assert_se(unit_stop(UNIT(service)) >= 0);
+        check_states(m, path, service, PATH_RUNNING, SERVICE_RUNNING);
+
+        assert_se(rm_rf(test_path, REMOVE_ROOT|REMOVE_PHYSICAL) == 0);
+        assert_se(unit_stop(UNIT(service)) >= 0);
+        check_states(m, path, service, PATH_WAITING, SERVICE_DEAD);
 
-        check_stop_unlink(m, unit, test_path, NULL);
+        assert_se(unit_stop(unit) >= 0);
 }
 
 static void test_path_makedirectory_directorymode(Manager *m) {
@@ -212,9 +315,10 @@ static void test_path_makedirectory_directorymode(Manager *m) {
 
         assert_se(m);
 
+        assert_se(manager_load_startable_unit_or_warn(m, "path-makedirectory.path", NULL, &unit) >= 0);
+
         assert_se(access(test_path, F_OK) < 0);
 
-        assert_se(manager_load_startable_unit_or_warn(m, "path-makedirectory.path", NULL, &unit) >= 0);
         assert_se(unit_start(unit) >= 0);
 
         /* Check if the directory has been created */
index d78e0544a7a6236c0f9fcf233e8a4805f4625b4b..b00dd4a980df747ccdeecb13044cd760cf06b817 100644 (file)
@@ -636,7 +636,7 @@ static void test_setpriority_closest(void) {
                 q = getpriority(PRIO_PROCESS, 0);
                 assert_se(errno == 0 && p == q);
 
-                /* It should also be possible to to set the nice level to one higher */
+                /* It should also be possible to set the nice level to one higher */
                 if (p < PRIO_MAX-1) {
                         assert_se(setpriority_closest(++p) > 0);
 
@@ -645,7 +645,7 @@ static void test_setpriority_closest(void) {
                         assert_se(errno == 0 && p == q);
                 }
 
-                /* It should also be possible to to set the nice level to two higher */
+                /* It should also be possible to set the nice level to two higher */
                 if (p < PRIO_MAX-1) {
                         assert_se(setpriority_closest(++p) > 0);
 
index b09d031f5d6eebd996aebf3142bcedb9c7a0359e..eec2779a9e2a69cec60f08365b0ab4a26213bdf1 100644 (file)
@@ -123,7 +123,7 @@ static void test_filter_sets(void) {
                 if (pid == 0) { /* Child? */
                         int fd;
 
-                        /* If we look at the default set (or one that includes it), whitelist instead of blacklist */
+                        /* If we look at the default set (or one that includes it), allow-list instead of deny-list */
                         if (IN_SET(i, SYSCALL_FILTER_SET_DEFAULT, SYSCALL_FILTER_SET_SYSTEM_SERVICE))
                                 r = seccomp_load_syscall_filter_set(SCMP_ACT_ERRNO(EUCLEAN), syscall_filter_sets + i, SCMP_ACT_ALLOW, true);
                         else
index 9c93685dbce975ac1c52069a1ccfd3c6f4b5824d..d3e6de79789c685b3a4ef06914ecab3f96792dce 100644 (file)
@@ -107,6 +107,49 @@ static void test_set_put_strdupv(void) {
         assert_se(set_size(m) == 3);
 }
 
+static void test_set_ensure_allocated(void) {
+        _cleanup_set_free_ Set *m = NULL;
+
+        assert_se(set_ensure_allocated(&m, &string_hash_ops) == 1);
+        assert_se(set_ensure_allocated(&m, &string_hash_ops) == 0);
+        assert_se(set_ensure_allocated(&m, NULL) == 0);
+        assert_se(set_size(m) == 0);
+}
+
+static void test_set_ensure_put(void) {
+        _cleanup_set_free_ Set *m = NULL;
+
+        assert_se(set_ensure_put(&m, &string_hash_ops, "a") == 1);
+        assert_se(set_ensure_put(&m, &string_hash_ops, "a") == 0);
+        assert_se(set_ensure_put(&m, NULL, "a") == 0);
+        assert_se(set_ensure_put(&m, &string_hash_ops, "b") == 1);
+        assert_se(set_ensure_put(&m, &string_hash_ops, "b") == 0);
+        assert_se(set_ensure_put(&m, &string_hash_ops, "a") == 0);
+        assert_se(set_size(m) == 2);
+}
+
+static void test_set_ensure_consume(void) {
+        _cleanup_set_free_ Set *m = NULL;
+        char *s, *t;
+
+        assert_se(s = strdup("a"));
+        assert_se(set_ensure_consume(&m, &string_hash_ops_free, s) == 1);
+
+        assert_se(t = strdup("a"));
+        assert_se(set_ensure_consume(&m, &string_hash_ops_free, t) == 0);
+
+        assert_se(t = strdup("a"));
+        assert_se(set_ensure_consume(&m, &string_hash_ops_free, t) == 0);
+
+        assert_se(t = strdup("b"));
+        assert_se(set_ensure_consume(&m, &string_hash_ops_free, t) == 1);
+
+        assert_se(t = strdup("b"));
+        assert_se(set_ensure_consume(&m, &string_hash_ops_free, t) == 0);
+
+        assert_se(set_size(m) == 2);
+}
+
 int main(int argc, const char *argv[]) {
         test_set_steal_first();
         test_set_free_with_destructor();
@@ -114,6 +157,9 @@ int main(int argc, const char *argv[]) {
         test_set_put();
         test_set_put_strdup();
         test_set_put_strdupv();
+        test_set_ensure_allocated();
+        test_set_ensure_put();
+        test_set_ensure_consume();
 
         return 0;
 }
index 2c32f898c6573e7d36db76539d4b98dbba72bd26..c0b215dadc4020dc262cee426b56286e73651ca3 100644 (file)
@@ -17,6 +17,7 @@
 #include "log.h"
 #include "main-func.h"
 #include "mkdir.h"
+#include "namespace-util.h"
 #include "selinux-util.h"
 #include "signal-util.h"
 #include "string-util.h"
@@ -36,15 +37,13 @@ static int fake_filesystems(void) {
                 { "test/run",       "/etc/udev/rules.d",       "Failed to mount empty /etc/udev/rules.d",          true },
                 { "test/run",       UDEVLIBEXECDIR "/rules.d", "Failed to mount empty " UDEVLIBEXECDIR "/rules.d", true },
         };
-        unsigned i;
-
-        if (unshare(CLONE_NEWNS) < 0)
-                return log_error_errno(errno, "Failed to call unshare(): %m");
+        int r;
 
-        if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) < 0)
-                return log_error_errno(errno, "Failed to mount / as private: %m");
+        r = detach_mount_namespace();
+        if (r < 0)
+                return log_error_errno(r, "Failed to detach mount namespace: %m");
 
-        for (i = 0; i < ELEMENTSOF(fakefss); i++)
+        for (size_t i = 0; i < ELEMENTSOF(fakefss); i++)
                 if (mount(fakefss[i].src, fakefss[i].target, NULL, MS_BIND, NULL) < 0) {
                         log_full_errno(fakefss[i].ignore_mount_error ? LOG_DEBUG : LOG_ERR, errno, "%s: %m", fakefss[i].error);
                         if (!fakefss[i].ignore_mount_error)
@@ -82,12 +81,15 @@ static int run(int argc, char *argv[]) {
         }
 
         log_debug("version %s", GIT_VERSION);
-        mac_selinux_init();
+
+        r = mac_selinux_init();
+        if (r < 0)
+                return r;
 
         action = argv[1];
         devpath = argv[2];
 
-        assert_se(udev_rules_new(&rules, RESOLVE_NAME_EARLY) == 0);
+        assert_se(udev_rules_load(&rules, RESOLVE_NAME_EARLY) == 0);
 
         const char *syspath = strjoina("/sys", devpath);
         r = device_new_from_synthetic_event(&dev, syspath, action);
index 6e294c72d627bff0ff17657522d829de2b4e0ab8..0d524f9a5626dd13511f028159f361eddd5d5f67 100644 (file)
@@ -130,6 +130,7 @@ static void test_unit_name_from_path(void) {
         test_unit_name_from_path_one("///", ".mount", "-.mount", 0);
         test_unit_name_from_path_one("/foo/../bar", ".mount", NULL, -EINVAL);
         test_unit_name_from_path_one("/foo/./bar", ".mount", NULL, -EINVAL);
+        test_unit_name_from_path_one("/waldoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", ".mount", NULL, -EINVAL);
 }
 
 static void test_unit_name_from_path_instance_one(const char *pattern, const char *path, const char *suffix, const char *expected, int ret) {
@@ -159,6 +160,7 @@ static void test_unit_name_from_path_instance(void) {
         test_unit_name_from_path_instance_one("waldo", "..", ".mount", NULL, -EINVAL);
         test_unit_name_from_path_instance_one("waldo", "/foo", ".waldi", NULL, -EINVAL);
         test_unit_name_from_path_instance_one("wa--ldo", "/--", ".mount", "wa--ldo@\\x2d\\x2d.mount", 0);
+        test_unit_name_from_path_instance_one("waldoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "/waldo", ".mount", NULL, -EINVAL);
 }
 
 static void test_unit_name_to_path_one(const char *unit, const char *path, int ret) {
index 76dd72a59807a81abb2ec309a234b3991cadbcf5..d4a6c8f5c339029c3349c3dce31213307668dd9c 100644 (file)
@@ -410,6 +410,85 @@ static void test_system_tasks_max_scale(void) {
         assert_se(system_tasks_max_scale(UINT64_MAX/4, UINT64_MAX) == UINT64_MAX);
 }
 
+static void test_foreach_pointer(void) {
+        int a, b, c, *i;
+        size_t k = 0;
+
+        FOREACH_POINTER(i, &a, &b, &c) {
+                switch (k) {
+
+                case 0:
+                        assert_se(i == &a);
+                        break;
+
+                case 1:
+                        assert_se(i == &b);
+                        break;
+
+                case 2:
+                        assert_se(i == &c);
+                        break;
+
+                default:
+                        assert_not_reached("unexpected index");
+                        break;
+                }
+
+                k++;
+        }
+
+        assert(k == 3);
+
+        FOREACH_POINTER(i, &b) {
+                assert(k == 3);
+                assert(i == &b);
+                k = 4;
+        }
+
+        assert(k == 4);
+
+        FOREACH_POINTER(i, NULL, &c, NULL, &b, NULL, &a, NULL) {
+                switch (k) {
+
+                case 4:
+                        assert_se(i == NULL);
+                        break;
+
+                case 5:
+                        assert_se(i == &c);
+                        break;
+
+                case 6:
+                        assert_se(i == NULL);
+                        break;
+
+                case 7:
+                        assert_se(i == &b);
+                        break;
+
+                case 8:
+                        assert_se(i == NULL);
+                        break;
+
+                case 9:
+                        assert_se(i == &a);
+                        break;
+
+                case 10:
+                        assert_se(i == NULL);
+                        break;
+
+                default:
+                        assert_not_reached("unexpected index");
+                        break;
+                }
+
+                k++;
+        }
+
+        assert(k == 11);
+}
+
 int main(int argc, char *argv[]) {
         test_setup_logging(LOG_INFO);
 
@@ -428,6 +507,7 @@ int main(int argc, char *argv[]) {
         test_physical_memory_scale();
         test_system_tasks_max();
         test_system_tasks_max_scale();
+        test_foreach_pointer();
 
         return 0;
 }
index cc75bc602426545032cbfc98bb7b5f447cb3d0ec..70287b3c554f7901ea44fcb65e239d74439b5e59 100644 (file)
@@ -67,7 +67,7 @@ static void test_xdg_desktop_parse(unsigned i, const char *s) {
         case 0:
                 assert_se(streq(service->exec_string, "/bin/sleep 100"));
                 assert_se(strv_equal(service->only_show_in, STRV_MAKE("A", "B")));
-                assert_se(strv_equal(service->not_show_in, STRV_MAKE("C", "", "D\\;", "E")));
+                assert_se(strv_equal(service->not_show_in, STRV_MAKE("C", "D\\;", "E")));
                 assert_se(!service->hidden);
                 break;
         case 1:
@@ -81,14 +81,12 @@ static void test_xdg_desktop_parse(unsigned i, const char *s) {
 }
 
 int main(int argc, char *argv[]) {
-        size_t i;
-
         test_setup_logging(LOG_DEBUG);
 
         test_translate_name();
         test_xdg_format_exec_start();
 
-        for (i = 0; i < ELEMENTSOF(xdg_desktop_file); i++)
+        for (size_t i = 0; i < ELEMENTSOF(xdg_desktop_file); i++)
                 test_xdg_desktop_parse(i, xdg_desktop_file[i]);
 
         return 0;
index 3f34a91a7e1943872721d0aeaa8c9ecae2fff3b2..eaac3b3e35554449698ab4876bd608e44afe407e 100644 (file)
@@ -9,15 +9,17 @@
 #include "sd-bus.h"
 
 #include "bus-error.h"
-#include "bus-util.h"
+#include "bus-locator.h"
+#include "bus-map-properties.h"
+#include "bus-print-properties.h"
 #include "format-table.h"
 #include "in-addr-util.h"
 #include "main-func.h"
 #include "pager.h"
 #include "parse-util.h"
 #include "pretty-print.h"
-#include "spawn-polkit-agent.h"
 #include "sparse-endian.h"
+#include "spawn-polkit-agent.h"
 #include "string-table.h"
 #include "strv.h"
 #include "terminal-util.h"
@@ -158,7 +160,7 @@ static int print_status_info(const StatusInfo *i) {
 
         r = table_print(table, NULL);
         if (r < 0)
-                return log_error_errno(r, "Failed to show table: %m");
+                return table_log_print_error(r);
 
         if (i->rtc_local)
                 printf("\n%s"
@@ -431,7 +433,7 @@ static int print_ntp_status_info(NTPStatusInfo *i) {
 
                 r = table_print(table, NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to show table: %m");
+                        return table_log_print_error(r);
 
                 return 0;
         }
@@ -440,7 +442,7 @@ static int print_ntp_status_info(NTPStatusInfo *i) {
                 log_error("Invalid NTP response");
                 r = table_print(table, NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to show table: %m");
+                        return table_log_print_error(r);
 
                 return 0;
         }
@@ -524,7 +526,7 @@ static int print_ntp_status_info(NTPStatusInfo *i) {
 
         r = table_print(table, NULL);
         if (r < 0)
-                log_error_errno(r, "Failed to show table: %m");
+                return table_log_print_error(r);
 
         return 0;
 }
@@ -1052,9 +1054,7 @@ static int run(int argc, char *argv[]) {
         int r;
 
         setlocale(LC_ALL, "");
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index da59dd33148601b412c4cf49e7673bcdbf340909..c467b854775aa9be022c00aeb0ef13ffc456aac5 100644 (file)
 #include "alloc-util.h"
 #include "bus-common-errors.h"
 #include "bus-error.h"
+#include "bus-get-properties.h"
+#include "bus-locator.h"
 #include "bus-log-control-api.h"
+#include "bus-map-properties.h"
 #include "bus-polkit.h"
-#include "bus-util.h"
 #include "clock-util.h"
 #include "conf-files.h"
 #include "def.h"
@@ -377,7 +379,10 @@ static int context_write_data_local_rtc(Context *c) {
                 }
         }
 
-        mac_selinux_init();
+        r = mac_selinux_init();
+        if (r < 0)
+                return r;
+
         return write_string_file_atomic_label("/etc/adjtime", w);
 }
 
index 006800709db9ba10ea8c229c0f91b7f8bf9613ce..6effdfc3250fb76aaeae50b525b370643970e236 100644 (file)
@@ -3,6 +3,7 @@
 #include "sd-bus.h"
 
 #include "alloc-util.h"
+#include "bus-get-properties.h"
 #include "bus-internal.h"
 #include "bus-log-control-api.h"
 #include "bus-protocol.h"
index e56e09ca8cec5255a83a9531530b53a8654ab4e6..4f514d536d0b73a00e6eecbd359711f394d46ff5 100644 (file)
@@ -89,8 +89,8 @@ settime:
 }
 
 static int run(int argc, char *argv[]) {
-        _cleanup_(notify_on_cleanup) const char *notify_message = NULL;
         _cleanup_(manager_freep) Manager *m = NULL;
+        _cleanup_(notify_on_cleanup) const char *notify_message = NULL;
         const char *user = "systemd-timesync";
         uid_t uid, uid_current;
         gid_t gid;
index e827de1b06159c20f717bf8d8a5c355c86cea9e2..2404e36bf2984873eeb709721115d7ad91a560bc 100644 (file)
@@ -2405,8 +2405,7 @@ static bool should_include_path(const char *path) {
                         return true;
                 }
 
-        /* no matches, so we should include this path only if we
-         * have no whitelist at all */
+        /* no matches, so we should include this path only if we have no allow list at all */
         if (strv_isempty(arg_include_prefixes))
                 return true;
 
@@ -3196,11 +3195,7 @@ static int link_parent(ItemArray *a) {
                 if (!j)
                         j = ordered_hashmap_get(globs, prefix);
                 if (j) {
-                        r = set_ensure_allocated(&j->children, NULL);
-                        if (r < 0)
-                                return log_oom();
-
-                        r = set_put(j->children, a);
+                        r = set_ensure_put(&j->children, NULL, a);
                         if (r < 0)
                                 return log_oom();
 
@@ -3262,7 +3257,9 @@ static int run(int argc, char *argv[]) {
 
         umask(0022);
 
-        mac_selinux_init();
+        r = mac_selinux_init();
+        if (r < 0)
+                return r;
 
         items = ordered_hashmap_new(&item_array_hash_ops);
         globs = ordered_hashmap_new(&item_array_hash_ops);
index 48e95005483b853290b24e2cedda03c250d9fbec..6c020ac0ed0037db2ebdb928f0994f7833a6947b 100644 (file)
@@ -643,6 +643,13 @@ static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
                                 supported_parent = true;
                                 supported_transport = true;
                         }
+                } else if (streq(subsys, "spi")) {
+                        const char *sysnum;
+
+                        if (sd_device_get_sysnum(parent, &sysnum) >= 0 && sysnum) {
+                                path_prepend(&path, "cs-%s", sysnum);
+                                parent = skip_subsystem(parent, "spi");
+                        }
                 }
 
                 if (!parent)
index 1b501da39f14abd3f0ce29de7fd6a095e90082f8..4efafffd4081f01c614d4200cee58e1f80e88c6f 100644 (file)
@@ -1175,7 +1175,7 @@ static void rule_resolve_goto(UdevRuleFile *rule_file) {
         }
 }
 
-static int parse_file(UdevRules *rules, const char *filename) {
+int udev_rules_parse_file(UdevRules *rules, const char *filename) {
         _cleanup_free_ char *continuation = NULL, *name = NULL;
         _cleanup_fclose_ FILE *f = NULL;
         UdevRuleFile *rule_file;
@@ -1278,30 +1278,41 @@ static int parse_file(UdevRules *rules, const char *filename) {
         return 0;
 }
 
-int udev_rules_new(UdevRules **ret_rules, ResolveNameTiming resolve_name_timing) {
-        _cleanup_(udev_rules_freep) UdevRules *rules = NULL;
-        _cleanup_strv_free_ char **files = NULL;
-        char **f;
-        int r;
-
+UdevRules* udev_rules_new(ResolveNameTiming resolve_name_timing) {
         assert(resolve_name_timing >= 0 && resolve_name_timing < _RESOLVE_NAME_TIMING_MAX);
 
-        rules = new(UdevRules, 1);
+        UdevRules *rules = new(UdevRules, 1);
         if (!rules)
-                return -ENOMEM;
+                return NULL;
 
         *rules = (UdevRules) {
                 .resolve_name_timing = resolve_name_timing,
         };
 
+        return rules;
+}
+
+int udev_rules_load(UdevRules **ret_rules, ResolveNameTiming resolve_name_timing) {
+        _cleanup_(udev_rules_freep) UdevRules *rules = NULL;
+        _cleanup_strv_free_ char **files = NULL;
+        char **f;
+        int r;
+
+        rules = udev_rules_new(resolve_name_timing);
+        if (!rules)
+                return -ENOMEM;
+
         (void) udev_rules_check_timestamp(rules);
 
         r = conf_files_list_strv(&files, ".rules", NULL, 0, RULES_DIRS);
         if (r < 0)
-                return log_error_errno(r, "Failed to enumerate rules files: %m");
+                return log_debug_errno(r, "Failed to enumerate rules files: %m");
 
-        STRV_FOREACH(f, files)
-                (void) parse_file(rules, *f);
+        STRV_FOREACH(f, files) {
+                r = udev_rules_parse_file(rules, *f);
+                if (r < 0)
+                        log_debug_errno(r, "Failed to read rules file %s, ignoring: %m", *f);
+        }
 
         *ret_rules = TAKE_PTR(rules);
         return 0;
index 6d94a468c33cfe264c2ab5d7a0773dc5c1696eb7..cdb98e8ceccf4bc3be58f9791b0dafde73e73401 100644 (file)
@@ -16,7 +16,9 @@ typedef enum {
         _ESCAPE_TYPE_INVALID = -1
 } UdevRuleEscapeType;
 
-int udev_rules_new(UdevRules **ret_rules, ResolveNameTiming resolve_name_timing);
+int udev_rules_parse_file(UdevRules *rules, const char *filename);
+UdevRules* udev_rules_new(ResolveNameTiming resolve_name_timing);
+int udev_rules_load(UdevRules **ret_rules, ResolveNameTiming resolve_name_timing);
 UdevRules *udev_rules_free(UdevRules *rules);
 DEFINE_TRIVIAL_CLEANUP_FUNC(UdevRules*, udev_rules_free);
 
index 1debdf2b314cd4ecd213002191defc7db1368088..b1209e6baf81985e7beecd8245d73a5780ecce26 100644 (file)
@@ -17,6 +17,7 @@
 #include "device-util.h"
 #include "dirent-util.h"
 #include "fd-util.h"
+#include "sort-util.h"
 #include "string-table.h"
 #include "string-util.h"
 #include "udev-util.h"
@@ -56,9 +57,36 @@ static bool skip_attribute(const char *name) {
         return string_table_lookup(skip, ELEMENTSOF(skip), name) >= 0;
 }
 
-static void print_all_attributes(sd_device *device, const char *key) {
+typedef struct SysAttr {
+        const char *name;
+        const char *value;
+} SysAttr;
+
+static int sysattr_compare(const SysAttr *a, const SysAttr *b) {
+        return strcmp(a->name, b->name);
+}
+
+static int print_all_attributes(sd_device *device, bool is_parent) {
+        _cleanup_free_ SysAttr *sysattrs = NULL;
+        size_t n_items = 0, n_allocated = 0;
         const char *name, *value;
 
+        value = NULL;
+        (void) sd_device_get_devpath(device, &value);
+        printf("  looking at %sdevice '%s':\n", is_parent ? "parent " : "", strempty(value));
+
+        value = NULL;
+        (void) sd_device_get_sysname(device, &value);
+        printf("    %s==\"%s\"\n", is_parent ? "KERNELS" : "KERNEL", strempty(value));
+
+        value = NULL;
+        (void) sd_device_get_subsystem(device, &value);
+        printf("    %s==\"%s\"\n", is_parent ? "SUBSYSTEMS" : "SUBSYSTEM", strempty(value));
+
+        value = NULL;
+        (void) sd_device_get_driver(device, &value);
+        printf("    %s==\"%s\"\n", is_parent ? "DRIVERS" : "DRIVER", strempty(value));
+
         FOREACH_DEVICE_SYSATTR(device, name) {
                 size_t len;
 
@@ -79,14 +107,29 @@ static void print_all_attributes(sd_device *device, const char *key) {
                 if (len > 0)
                         continue;
 
-                printf("    %s{%s}==\"%s\"\n", key, name, value);
+                if (!GREEDY_REALLOC(sysattrs, n_allocated, n_items + 1))
+                        return log_oom();
+
+                sysattrs[n_items] = (SysAttr) {
+                        .name = name,
+                        .value = value,
+                };
+                n_items++;
         }
+
+        typesafe_qsort(sysattrs, n_items, sysattr_compare);
+
+        for (size_t i = 0; i < n_items; i++)
+                printf("    %s{%s}==\"%s\"\n", is_parent ? "ATTRS" : "ATTR", sysattrs[i].name, sysattrs[i].value);
+
         puts("");
+
+        return 0;
 }
 
 static int print_device_chain(sd_device *device) {
         sd_device *child, *parent;
-        const char *str;
+        int r;
 
         printf("\n"
                "Udevadm info starts with the device specified by the devpath and then\n"
@@ -96,30 +139,14 @@ static int print_device_chain(sd_device *device) {
                "and the attributes from one single parent device.\n"
                "\n");
 
-        (void) sd_device_get_devpath(device, &str);
-        printf("  looking at device '%s':\n", str);
-        (void) sd_device_get_sysname(device, &str);
-        printf("    KERNEL==\"%s\"\n", str);
-        if (sd_device_get_subsystem(device, &str) < 0)
-                str = "";
-        printf("    SUBSYSTEM==\"%s\"\n", str);
-        if (sd_device_get_driver(device, &str) < 0)
-                str = "";
-        printf("    DRIVER==\"%s\"\n", str);
-        print_all_attributes(device, "ATTR");
+        r = print_all_attributes(device, false);
+        if (r < 0)
+                return r;
 
         for (child = device; sd_device_get_parent(child, &parent) >= 0; child = parent) {
-                (void) sd_device_get_devpath(parent, &str);
-                printf("  looking at parent device '%s':\n", str);
-                (void) sd_device_get_sysname(parent, &str);
-                printf("    KERNELS==\"%s\"\n", str);
-                if (sd_device_get_subsystem(parent, &str) < 0)
-                        str = "";
-                printf("    SUBSYSTEMS==\"%s\"\n", str);
-                if (sd_device_get_driver(parent, &str) < 0)
-                        str = "";
-                printf("    DRIVERS==\"%s\"\n", str);
-                print_all_attributes(parent, "ATTRS");
+                r = print_all_attributes(parent, true);
+                if (r < 0)
+                        return r;
         }
 
         return 0;
index 2ca98a729f01541486e43cc3304cce3e897734d4..8cd8ed1a1ee6c2e052eb29530eda25446552d7aa 100644 (file)
@@ -169,24 +169,13 @@ static int parse_argv(int argc, char *argv[]) {
                         subsystem = devtype = NULL;
                         break;
                 }
-                case 't': {
-                        _cleanup_free_ char *tag = NULL;
-
-                        r = set_ensure_allocated(&arg_tag_filter, &string_hash_ops);
+                case 't':
+                        /* optarg is stored in argv[], so we don't need to copy it */
+                        r = set_ensure_put(&arg_tag_filter, &string_hash_ops, optarg);
                         if (r < 0)
                                 return r;
-
-                        tag = strdup(optarg);
-                        if (!tag)
-                                return -ENOMEM;
-
-                        r = set_put(arg_tag_filter, tag);
-                        if (r < 0)
-                                return r;
-
-                        tag = NULL;
                         break;
-                }
+
                 case 'V':
                         return print_version();
                 case 'h':
@@ -260,7 +249,7 @@ int monitor_main(int argc, char *argv[], void *userdata) {
 
 finalize:
         hashmap_free_free_free(arg_subsystem_filter);
-        set_free_free(arg_tag_filter);
+        set_free(arg_tag_filter);
 
         return r;
 }
index 3f8bdc281206a790f487fe9ab451bc40c8e12bca..5b9b65439ad30f5c4ce8fed9259f1f243b7e557f 100644 (file)
@@ -123,7 +123,7 @@ int test_main(int argc, char *argv[], void *userdata) {
 
         udev_builtin_init();
 
-        r = udev_rules_new(&rules, arg_resolve_name_timing);
+        r = udev_rules_load(&rules, arg_resolve_name_timing);
         if (r < 0) {
                 log_error_errno(r, "Failed to read udev rules: %m");
                 goto out;
index f1115bff7a3ebe3c09ad6e677a27e0bad444972c..e476f88f00812db5a3abc907493291683c737a0a 100644 (file)
@@ -124,7 +124,10 @@ static int run(int argc, char *argv[]) {
 
         log_set_max_level_realm(LOG_REALM_SYSTEMD, log_get_max_level());
 
-        mac_selinux_init();
+        r = mac_selinux_init();
+        if (r < 0)
+                return r;
+
         return udevadm_main(argc, argv);
 }
 
index d86c1484c3e925f1b80c4c45c2cf5c092b1fbc99..f3236dedfab75c3b865d121fc923130967e11150 100644 (file)
@@ -413,7 +413,7 @@ static int worker_mark_block_device_read_only(sd_device *dev) {
 
         /* Exclude synthetic devices for now, this is supposed to be a safety feature to avoid modification
          * of physical devices, and what sits on top of those doesn't really matter if we don't allow the
-         * underlying block devices to recieve changes. */
+         * underlying block devices to receive changes. */
         if (STARTSWITH_SET(val, "dm-", "md", "drbd", "loop", "nbd", "zram"))
                 return 0;
 
@@ -925,7 +925,7 @@ static void event_queue_start(Manager *manager) {
         udev_builtin_init();
 
         if (!manager->rules) {
-                r = udev_rules_new(&manager->rules, arg_resolve_name_timing);
+                r = udev_rules_load(&manager->rules, arg_resolve_name_timing);
                 if (r < 0) {
                         log_warning_errno(r, "Failed to read udev rules: %m");
                         return;
@@ -1787,7 +1787,7 @@ static int main_loop(Manager *manager) {
 
         udev_builtin_init();
 
-        r = udev_rules_new(&manager->rules, arg_resolve_name_timing);
+        r = udev_rules_load(&manager->rules, arg_resolve_name_timing);
         if (!manager->rules)
                 return log_error_errno(r, "Failed to read udev rules: %m");
 
@@ -1863,7 +1863,7 @@ int run_udevd(int argc, char *argv[]) {
 
         r = mac_selinux_init();
         if (r < 0)
-                return log_error_errno(r, "Could not initialize labelling: %m");
+                return r;
 
         r = mkdir_errno_wrapper("/run/udev", 0755);
         if (r < 0 && r != -EEXIST)
index bbd14165d5ad4b4199c5a554911bffdb81b58e9f..c001802dc910b93eb347ef51f39b7917ecf6559d 100644 (file)
@@ -49,10 +49,8 @@ int main(int argc, char *argv[]) {
         }
 
         r = mac_selinux_init();
-        if (r < 0) {
-                log_error_errno(r, "SELinux setup failed: %m");
+        if (r < 0)
                 return EXIT_FAILURE;
-        }
 
         r = apply_timestamp("/etc/.updated", &st.st_mtim);
         q = apply_timestamp("/var/.updated", &st.st_mtim);
index fd24cdc789a9cb4aa97237b5bdf21008b3a0d143..47354d50129090875b799341f0a361dd25df1806 100644 (file)
@@ -84,11 +84,10 @@ static int get_current_runlevel(Context *c) {
 
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         int r;
-        unsigned i;
 
         assert(c);
 
-        for (i = 0; i < ELEMENTSOF(table); i++) {
+        for (size_t i = 0; i < ELEMENTSOF(table); i++) {
                 _cleanup_free_ char *state = NULL, *path = NULL;
 
                 path = unit_dbus_path_from_name(table[i].special);
@@ -223,9 +222,6 @@ static int run(int argc, char *argv[]) {
         };
         int r;
 
-        if (getppid() != 1)
-                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
-                                       "This program should be invoked by init only.");
         if (argc != 2)
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                        "This program requires one argument.");
index c24142951709eadd0e59606c03655f1f663a8f02..cd92b696c0c20733599deea4c37ecce3fa587f52 100644 (file)
@@ -25,7 +25,9 @@ static int run(int argc, char *argv[]) {
 
         umask(0022);
 
-        mac_selinux_init();
+        r = mac_selinux_init();
+        if (r < 0)
+                return r;
 
         if (streq(argv[1], "start")) {
                 r = unlink_or_warn("/run/nologin");
index 4b5eb34ca6225d7a2473bae1029ce217f745e59b..c973ee9c0114e27a0390f5a2904ac51a45d3ae72 100644 (file)
@@ -85,7 +85,7 @@ static int show_user(UserRecord *ur, Table *table) {
                                 TABLE_STRING, user_record_shell(ur),
                                 TABLE_INT, (int) user_record_disposition(ur));
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add row to table: %m");
+                        return table_log_add_error(r);
 
                 break;
 
@@ -180,7 +180,7 @@ static int display_user(int argc, char *argv[], void *userdata) {
         if (table) {
                 r = table_print(table, NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to show table: %m");
+                        return table_log_print_error(r);
         }
 
         return ret;
@@ -234,7 +234,7 @@ static int show_group(GroupRecord *gr, Table *table) {
                                 TABLE_GID, gr->gid,
                                 TABLE_INT, (int) group_record_disposition(gr));
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add row to table: %m");
+                        return table_log_add_error(r);
 
                 break;
 
@@ -330,7 +330,7 @@ static int display_group(int argc, char *argv[], void *userdata) {
         if (table) {
                 r = table_print(table, NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to show table: %m");
+                        return table_log_print_error(r);
         }
 
         return ret;
@@ -377,7 +377,7 @@ static int show_membership(const char *user, const char *group, Table *table) {
                                 TABLE_STRING, user,
                                 TABLE_STRING, group);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add row to table: %m");
+                        return table_log_add_error(r);
 
                 break;
 
@@ -463,7 +463,7 @@ static int display_memberships(int argc, char *argv[], void *userdata) {
         if (table) {
                 r = table_print(table, NULL);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to show table: %m");
+                        return table_log_print_error(r);
         }
 
         return ret;
@@ -521,7 +521,7 @@ static int display_services(int argc, char *argv[], void *userdata) {
                                    TABLE_STRING, no ?: "yes",
                                    TABLE_SET_COLOR, no ? ansi_highlight_red() : ansi_highlight_green());
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add table row: %m");
+                        return table_log_add_error(r);
         }
 
         if (table_get_rows(t) <= 0) {
@@ -761,9 +761,7 @@ static int run(int argc, char *argv[]) {
 
         int r;
 
-        log_show_color(true);
-        log_parse_environment();
-        log_open();
+        log_setup_cli();
 
         r = parse_argv(argc, argv);
         if (r <= 0)
index 978fd1d7886223763e1aba953aae128633b08b53..dbc285e61aac1b0224968c208836e39e2d769069 100644 (file)
@@ -20,8 +20,8 @@
  */
 
 static int run(int argc, char *argv[]) {
-        _cleanup_(notify_on_cleanup) const char *notify_stop = NULL;
         _cleanup_(manager_freep) Manager *m = NULL;
+        _cleanup_(notify_on_cleanup) const char *notify_stop = NULL;
         int r;
 
         log_setup_service();
index 732063f6c72e4230555790af3fd6f78312725bfc..d7202099be29071fca360e3a9ff5dc04475350a1 100644 (file)
@@ -660,7 +660,6 @@ static int process_connection(VarlinkServer *server, int fd) {
 static int run(int argc, char *argv[]) {
         usec_t start_time, listen_idle_usec, last_busy_usec = USEC_INFINITY;
         _cleanup_(varlink_server_unrefp) VarlinkServer *server = NULL;
-        _cleanup_close_ int lock = -1;
         unsigned n_iterations = 0;
         int m, listen_fd, r;
 
@@ -697,8 +696,8 @@ static int run(int argc, char *argv[]) {
                 return log_error_errno(r, "Failed to parse USERDB_FIXED_WORKER: %m");
         listen_idle_usec = r ? USEC_INFINITY : LISTEN_IDLE_USEC;
 
-        lock = userdb_nss_compat_disable();
-        if (lock < 0)
+        r = userdb_block_nss_systemd(true);
+        if (r < 0)
                 return log_error_errno(r, "Failed to disable userdb NSS compatibility: %m");
 
         start_time = now(CLOCK_MONOTONIC);
index 9c2fe9a1b409dce707f96adb7068e1333e754029..465d194b4083492e08d1c379a8de0f5a62e34862 100644 (file)
@@ -6,9 +6,11 @@
 
 #include "alloc-util.h"
 #include "crypt-util.h"
+#include "fileio.h"
 #include "hexdecoct.h"
 #include "log.h"
 #include "main-func.h"
+#include "path-util.h"
 #include "pretty-print.h"
 #include "string-util.h"
 #include "terminal-util.h"
@@ -29,7 +31,7 @@ static int help(void) {
         if (r < 0)
                 return log_oom();
 
-        printf("%s attach VOLUME DATADEVICE HASHDEVICE ROOTHASH\n"
+        printf("%s attach VOLUME DATADEVICE HASHDEVICE ROOTHASH [ROOTHASHSIG]\n"
                "%s detach VOLUME\n\n"
                "Attaches or detaches an integrity protected block device.\n"
                "\nSee the %s for details.\n"
@@ -87,7 +89,28 @@ static int run(int argc, char *argv[]) {
                 if (r < 0)
                         return log_error_errno(r, "Failed to configure data device: %m");
 
-                r = crypt_activate_by_volume_key(cd, argv[2], m, l, CRYPT_ACTIVATE_READONLY);
+                if (argc > 6) {
+#if HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY
+                        _cleanup_free_ char *hash_sig = NULL;
+                        size_t hash_sig_size;
+                        char *value;
+
+                        if ((value = startswith(argv[6], "base64:"))) {
+                                r = unbase64mem(value, strlen(value), (void *)&hash_sig, &hash_sig_size);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to parse root hash signature '%s': %m", argv[6]);
+                        } else {
+                                r = read_full_file_full(AT_FDCWD, argv[6], 0, &hash_sig, &hash_sig_size);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to read root hash signature: %m");
+                        }
+
+                        r = crypt_activate_by_signed_key(cd, argv[2], m, l, hash_sig, hash_sig_size, CRYPT_ACTIVATE_READONLY);
+#else
+                        return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "activation of verity device with signature %s requested, but not supported by cryptsetup due to missing crypt_activate_by_signed_key()", argv[6]);
+#endif
+                } else
+                        r = crypt_activate_by_volume_key(cd, argv[2], m, l, CRYPT_ACTIVATE_READONLY);
                 if (r < 0)
                         return log_error_errno(r, "Failed to set up verity device: %m");
 
index 6d10d7052b5b7c88477450b0be4167138ac86bcd..4a30f9e43354fe5e8016f0edd15534c26bf11beb 100644 (file)
@@ -182,6 +182,40 @@ static int xdg_config_parse_string(
         return 0;
 }
 
+static int strv_strndup_unescape_and_push(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                char ***sv,
+                size_t *n_allocated,
+                size_t *n,
+                const char *start,
+                const char *end) {
+
+        if (end == start)
+                return 0;
+
+        _cleanup_free_ char *copy = NULL;
+        int r;
+
+        copy = strndup(start, end - start);
+        if (!copy)
+                return log_oom();
+
+        r = xdg_unescape_string(unit, filename, line, copy);
+        if (r < 0)
+                return r;
+
+        if (!greedy_realloc((void**) sv, n_allocated, *n + 2, sizeof(char*))) /* One extra for NULL */
+                return log_oom();
+
+        (*sv)[*n] = TAKE_PTR(copy);
+        (*sv)[*n + 1] = NULL;
+        (*n)++;
+
+        return 0;
+}
+
 static int xdg_config_parse_strv(
                 const char *unit,
                 const char *filename,
@@ -194,9 +228,7 @@ static int xdg_config_parse_strv(
                 void *data,
                 void *userdata) {
 
-        char ***sv = data;
-        const char *start;
-        const char *end;
+        char ***ret_sv = data;
         int r;
 
         assert(filename);
@@ -205,23 +237,25 @@ static int xdg_config_parse_strv(
         assert(data);
 
         /* XDG does not allow duplicate definitions. */
-        if (*sv) {
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Key %s was defined multiple times, ignoring.", lvalue);
+        if (*ret_sv) {
+                log_syntax(unit, LOG_ERR, filename, line, 0, "Key %s was already defined, ignoring.", lvalue);
                 return 0;
         }
 
-        *sv = strv_new(NULL);
-        if (!*sv)
+        size_t n = 0, n_allocated = 0;
+        _cleanup_strv_free_ char **sv = NULL;
+
+        if (!GREEDY_REALLOC0(sv, n_allocated, 1))
                 return log_oom();
 
         /* We cannot use strv_split because it does not handle escaping correctly. */
-        start = rvalue;
+        const char *start = rvalue, *end;
 
         for (end = start; *end; end++) {
                 if (*end == '\\') {
                         /* Move forward, and ensure it is a valid escape. */
                         end++;
-                        if (strchr("sntr\\;", *end) == NULL) {
+                        if (!strchr("sntr\\;", *end)) {
                                 log_syntax(unit, LOG_ERR, filename, line, 0, "Undefined escape sequence \\%c.", *end);
                                 return 0;
                         }
@@ -229,29 +263,24 @@ static int xdg_config_parse_strv(
                 }
 
                 if (*end == ';') {
-                        _cleanup_free_ char *copy = NULL;
-
-                        copy = strndup(start, end - start);
-                        if (!copy)
-                                return log_oom();
-                        r = xdg_unescape_string(unit, filename, line, copy);
+                        r = strv_strndup_unescape_and_push(unit, filename, line,
+                                                           &sv, &n_allocated, &n,
+                                                           start, end);
                         if (r < 0)
                                 return r;
-                        r = strv_consume(sv, TAKE_PTR(copy));
-                        if (r < 0)
-                                return log_oom();
 
                         start = end + 1;
                 }
         }
 
-        /* Any trailing entry should be ignored if it is empty. */
-        if (end > start) {
-                r = strv_extend(sv, start);
-                if (r < 0)
-                        return log_oom();
-        }
+        /* Handle the trailing entry after the last separator */
+        r = strv_strndup_unescape_and_push(unit, filename, line,
+                                           &sv, &n_allocated, &n,
+                                           start, end);
+        if (r < 0)
+                return r;
 
+        *ret_sv = TAKE_PTR(sv);
         return 0;
 }
 
@@ -496,7 +525,7 @@ int xdg_autostart_service_generate_unit(
 
         /* Nothing to do if type is not Application. */
         if (!streq_ptr(service->type, "Application")) {
-                log_info("Not generating service for XDG autostart %s, it is hidden.", service->name);
+                log_info("Not generating service for XDG autostart %s, only Type=Application is supported.", service->name);
                 return 0;
         }
 
@@ -527,8 +556,9 @@ int xdg_autostart_service_generate_unit(
                 return 0;
         }
 
-        if (streq_ptr(service->gnome_autostart_phase, "EarlyInitialization")) {
-                log_info("Not generating service for XDG autostart %s, EarlyInitialization needs to be handled separately.",
+        if (service->gnome_autostart_phase) {
+                /* There is no explicit value for the "Application" phase. */
+                log_info("Not generating service for XDG autostart %s, startup phases are not supported.",
                          service->name);
                 return 0;
         }
@@ -563,10 +593,7 @@ int xdg_autostart_service_generate_unit(
                 fprintf(f, "Description=%s\n", t);
         }
 
-        /* Only start after the session is ready.
-         * XXX: GNOME has an autostart order which we may want to support.
-         *      It is not clear how this can be implemented reliably, which
-         *      is why it is skipped for now. */
+        /* Only start after the session is ready. */
         fprintf(f,
                 "After=graphical-session.target\n");
 
diff --git a/test/TEST-48-START-STOP-NO-RELOAD/blacklist-ubuntu-ci b/test/TEST-48-START-STOP-NO-RELOAD/blacklist-ubuntu-ci
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/test/TEST-52-HONORFIRSTSHUTDOWN/Makefile b/test/TEST-52-HONORFIRSTSHUTDOWN/Makefile
new file mode 100644 (file)
index 0000000..a48af97
--- /dev/null
@@ -0,0 +1,16 @@
+BUILD_DIR=$(shell ../../tools/find-build-dir.sh)
+
+all setup run clean clean-again:
+       @basedir=../.. TEST_BASE_DIR=../ BUILD_DIR=$(BUILD_DIR) ./test.sh --$@
+
+# finish option is used to run checks that can only be run outside of
+# the test execution. Example case, honor first shutdown, proof is obtained
+# from the console output as the image shuts down. This does not show up in
+# the journal so the output from the do_test is captured in a file in /tmp.
+# Without the use of finish the test will still pass because if it fails
+# the test will loop and will be terminated via a command timeout.
+# This just provides concrete confirmation.
+finish:
+       @basedir=../.. TEST_BASE_DIR=../ BUILD_DIR=$(BUILD_DIR) ./fini.sh --$@
+
+.PHONY: all setup run clean clean-again
diff --git a/test/TEST-52-HONORFIRSTSHUTDOWN/fini.sh b/test/TEST-52-HONORFIRSTSHUTDOWN/fini.sh
new file mode 100755 (executable)
index 0000000..993ada0
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/bash
+TEST_DESCRIPTION="test honor first shutdown"
+
+if grep -q "Shutdown is already active. Skipping emergency action request" /tmp/honorfirstshutdown.log; then
+    echo "$TEST_DESCRIPTION [pass]"
+    exit 0
+else
+    echo "$TEST_DESCRIPTION [fail]"
+    exit 1
+fi
diff --git a/test/TEST-52-HONORFIRSTSHUTDOWN/test.sh b/test/TEST-52-HONORFIRSTSHUTDOWN/test.sh
new file mode 100755 (executable)
index 0000000..a0848ef
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/bash
+set -e
+. $TEST_BASE_DIR/test-functions
+TEST_REQUIRE_INSTALL_TESTS=0
+TEST_DESCRIPTION="testing honor first shutdown"
+#INTERACTIVE_DEBUG=1
+TEST_NO_QEMU=1
+
+#Using timeout because if the test fails it can loop.
+# The reason is because the poweroff executed by end.service
+# could turn into a reboot if the test fails.
+NSPAWN_TIMEOUT=20
+
+#Remove this file if it exists. this is used along with
+# the make target "finish". Since concrete confirmaion is
+# only found from the console during the poweroff.
+rm -f /tmp/honorfirstshutdown.log >/dev/null
+
+do_test "$@" 52 > /tmp/honorfirstshutdown.log
diff --git a/test/fuzz/fuzz-journal-remote/oss-fuzz-21122 b/test/fuzz/fuzz-journal-remote/oss-fuzz-21122
new file mode 100644 (file)
index 0000000..e0e05e1
Binary files /dev/null and b/test/fuzz/fuzz-journal-remote/oss-fuzz-21122 differ
index d69ac09f1fb81900e01c5fef97452a318370a43e..ef1f18fa402430c384c4bd14891ebe19f6d5ceaf 100644 (file)
@@ -6,6 +6,7 @@ Id=
 GVRP=
 [MACVLAN]
 Mode=
+SourceMACAddress=
 [WireGuard]
 ListenPort=
 PrivateKey=
@@ -14,6 +15,7 @@ FwMark=
 FirewallMark=
 [MACVTAP]
 Mode=
+SourceMACAddress=
 [Match]
 Architecture=
 Host=
diff --git a/test/fuzz/fuzz-netdev-parser/wireguard-duplicated-endpoint b/test/fuzz/fuzz-netdev-parser/wireguard-duplicated-endpoint
new file mode 100644 (file)
index 0000000..adff4c1
--- /dev/null
@@ -0,0 +1,6 @@
+[NetDev]
+Name=w
+Kind=wireguard
+[WireGuardPeer]
+Endpoint=:0
+Endpoint=:8
\ No newline at end of file
index f97b1ba1b8f3e2d940bbbe65e62ac57daa298a7e..aa04c1192a3015f0834b3ea5c984b827811489a3 100644 (file)
@@ -38,7 +38,16 @@ MTUBytes=
 Multicast=
 MACAddress=
 Group=
-IPv6LinkLocalAddressGenerationMode=
+[SR-IOV]
+VirtualFunction=
+MACSpoofCheck=
+VLANId=
+VLANProtocol=
+QualityOfService=
+QueryReceiveSideScaling=
+Trust=
+LinkState=
+MACAddress=
 [BridgeFDB]
 VLANId=
 MACAddress=
@@ -96,7 +105,9 @@ ClientIdentifier=
 ListenPort=
 UseTimezone=
 RouteTable=
+DenyList=
 BlackList=
+AllowList=
 RequestOptions=
 SendRelease=
 MaxAttempts=
@@ -186,6 +197,7 @@ VXLAN=
 L2TP=
 MACsec=
 LinkLocalAddressing=
+IPv6LinkLocalAddressGenerationMode=
 ConfigureWithoutCarrier=
 NTP=
 DHCP=
@@ -279,6 +291,7 @@ UseDNS=
 DHCPv6Client=
 UseAutonomousPrefix=
 UseOnLinkPrefix=
+DenyList=
 BlackList=
 [DHCPServer]
 EmitNTP=
@@ -320,7 +333,9 @@ PacketLimit=
 Parent=
 Handle=
 Rate=
+BurstBytes=
 Burst=
+LimitBytes=
 LimitSize=
 MTUBytes=
 MPUBytes=
@@ -334,8 +349,10 @@ PerturbPeriodSec=
 Parent=
 Handle=
 PacketLimit=
+MemoryLimitBytes=
 MemoryLimit=
 Flows=
+QuantumBytes=
 Quantum=
 TargetSec=
 IntervalSec=
@@ -346,7 +363,9 @@ Parent=
 Handle=
 PacketLimit=
 FlowLimit=
+QuantumBytes=
 Quantum=
+InitialQuantumBytes=
 InitialQuantum=
 MaximumRate=
 Buckets=
@@ -365,7 +384,7 @@ ECN=
 Parent=
 Handle=
 Bandwidth=
-Overhead=
+OverheadBytes=
 [TrafficControlQueueingDiscipline]
 Parent=
 NetworkEmulatorDelaySec=
@@ -381,16 +400,22 @@ Id=
 Parent=
 Handle=
 DefaultClass=
+RateToQuantum=
 [HierarchyTokenBucketClass]
 Parent=
 ClassId=
 Priority=
+QuantumBytes=
+MTUBytes=
+OverheadBytes=
 Rate=
 CeilRate=
+BufferBytes=
+CeilBufferBytes=
 [BFIFO]
 Parent=
 Handle=
-LimitSize=
+LimitBytes=
 [PFIFO]
 Parent=
 Handle=
@@ -423,14 +448,21 @@ Handle=
 Parent=
 ClassId=
 Weight=
-MaxPacketSize=
+MaxPacketBytes=
 [DeficitRoundRobinScheduler]
 Parent=
 Handle=
 [DeficitRoundRobinSchedulerClass]
 Parent=
 ClassId=
-Quantum=
+QuantumBytes=
+[EnhancedTransmissionSelection]
+Parent=
+Handle=
+Bands=
+StrictBands=
+QuantumBytes=
+PriorityMap=
 [HeavyHitterFilter]
 Parent=
 Handle=
diff --git a/test/fuzz/fuzz-network-parser/dns-trust-anchor-duplicate.network b/test/fuzz/fuzz-network-parser/dns-trust-anchor-duplicate.network
new file mode 100644 (file)
index 0000000..ed7bdab
--- /dev/null
@@ -0,0 +1,2 @@
+[Network]
+DNSSECNegativeTrustAnchors=i i
\ No newline at end of file
index 2a37d5f45597a1a3a7a164d6ad1ddc267ef5a17f..fb7cfcfb3c33f231779d46237fe9d909261b678f 100644 (file)
@@ -1,2 +1,2 @@
 [IPv6AcceptRA]
-BlackList=70:: 70::
\ No newline at end of file
+DenyList=70:: 70::
\ No newline at end of file
diff --git a/test/fuzz/fuzz-network-parser/oss-fuzz-23895 b/test/fuzz/fuzz-network-parser/oss-fuzz-23895
new file mode 100644 (file)
index 0000000..a86361d
Binary files /dev/null and b/test/fuzz/fuzz-network-parser/oss-fuzz-23895 differ
diff --git a/test/fuzz/fuzz-network-parser/oss-fuzz-23950 b/test/fuzz/fuzz-network-parser/oss-fuzz-23950
new file mode 100644 (file)
index 0000000..5bfb17b
Binary files /dev/null and b/test/fuzz/fuzz-network-parser/oss-fuzz-23950 differ
diff --git a/test/fuzz/fuzz-udev-rules/line-too-long b/test/fuzz/fuzz-udev-rules/line-too-long
new file mode 100644 (file)
index 0000000..c0b908d
--- /dev/null
@@ -0,0 +1 @@
+O\x4294967296d%d;ycalc\x0a]r\n%s$(xcalc)$1'xcalc!xcalc%s"strjng_escaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSYMLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\85aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
\ No newline at end of file
index 492d2a033bb3d078cddb92ea065649b0969372a4..dbff9ab2cc7d6740ad625b99aaa709c77bdfe901 100644 (file)
@@ -197,6 +197,7 @@ RootDirectory=
 RootDirectoryStartOnly=
 RootImage=
 RootHash=
+RootHashSignature=
 RootVerity=
 RuntimeMaxSec=
 SELinuxContextFromNet=
diff --git a/test/fuzz/fuzz-xdg-desktop/oss-fuzz-22812 b/test/fuzz/fuzz-xdg-desktop/oss-fuzz-22812
new file mode 100644 (file)
index 0000000..4b4cadf
Binary files /dev/null and b/test/fuzz/fuzz-xdg-desktop/oss-fuzz-22812 differ
index 404b923467058569d2b9e1e946d1a5fadac9f04f..8bda38a2e27d1b169dfa9397ed443c34d1d9afcb 100644 (file)
@@ -28,6 +28,8 @@ install_subdir('testsuite-28.units',
                install_dir : testdata_dir)
 install_subdir('testsuite-30.units',
                install_dir : testdata_dir)
+install_subdir('testsuite-52.units',
+               install_dir : testdata_dir)
 
 testsuite08_dir = testdata_dir + '/testsuite-08.units'
 install_data('testsuite-08.units/-.mount',
index f7f604aec3abe87386146626097e76d56e57cf3a..456bfe666919a69ce8cac789b9daa0056cd836cf 100644 (file)
@@ -573,7 +573,7 @@ printf "[Service]\nStandardOutput=file:/systemd-journald.out\n" >"\$JOURNALD_CON
 # under ASan+UBSan in containers, which, in turn, are run in VMs.
 # Let's limit which environments such services should be executed in.
 mkdir -p /etc/systemd/system/systemd-hwdb-update.service.d
-printf "[Unit]\nConditionVirtualization=container\n\n[Service]\nTimeoutSec=180s\n" >/etc/systemd/system/systemd-hwdb-update.service.d/env-override.conf
+printf "[Unit]\nConditionVirtualization=container\n\n[Service]\nTimeoutSec=240s\n" >/etc/systemd/system/systemd-hwdb-update.service.d/env-override.conf
 
 # Let's override another hard-coded timeout that kicks in too early
 mkdir -p /etc/systemd/system/systemd-journal-flush.service.d
diff --git a/test/test-network/conf/25-netdevsim.netdev b/test/test-network/conf/25-netdevsim.netdev
deleted file mode 100644 (file)
index 899f2d9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-[NetDev]
-Kind=netdevsim
-Name=netdevsim99
index b713245dbcc05a474a49cdfa60f3b6029b3229f3..a1b00f258ffee24aabff1191027fd50e233e84e1 100644 (file)
@@ -8,5 +8,5 @@ Address=10.1.2.3/16
 [CAKE]
 Parent=root
 Handle=3a
-Overhead=128
+OverheadBytes=128
 Bandwidth=500M
index 0d6815710ccf6adf0c3b0b93e3877cffb64f223d..fd2520db505b08b8d3ec8ce8b25fced4ed344d77 100644 (file)
@@ -12,13 +12,19 @@ Parent=clsact
 Parent=root
 Handle=0002
 DefaultClass=30
+RateToQuantum=20
 
 [HierarchyTokenBucketClass]
 Parent=root
 ClassId=0002:0030
 Priority=1
+QuantumBytes=4000
+MTUBytes=1700
+OverheadBytes=100
 Rate=1M
+BufferBytes=123456
 CeilRate=0.5M
+CeilBufferBytes=123457
 
 [NetworkEmulator]
 Parent=2:30
@@ -52,8 +58,8 @@ Parent=2:32
 Handle=0032
 PacketLimit=1000
 FlowLimit=200
-Quantum=1500
-InitialQuantum=13000
+QuantumBytes=1500
+InitialQuantumBytes=13000
 MaximumRate=1M
 Buckets=512
 OrphanMask=511
@@ -87,11 +93,11 @@ CeilRate=0.5M
 Parent=2:34
 Handle=0034
 PacketLimit=20480
-MemoryLimit=64M
+MemoryLimitBytes=64M
 Flows=2048
 TargetSec=10ms
 IntervalSec=200ms
-Quantum=1400
+QuantumBytes=1400
 ECN=yes
 CEThresholdSec=100ms
 
@@ -106,10 +112,10 @@ CeilRate=0.5M
 Parent=2:35
 Handle=0035
 Rate=1G
-Burst=5K
+BurstBytes=5000
 LatencySec=70msec
 PeakRate=100G
-MTUBytes=1M
+MTUBytes=1000000
 
 [HierarchyTokenBucketClass]
 Parent=root
@@ -171,7 +177,7 @@ CeilRate=0.5M
 [BFIFO]
 Parent=2:3a
 Handle=003a
-LimitSize=1M
+LimitBytes=1000000
 
 [HierarchyTokenBucketClass]
 Parent=root
index 4632740061d60474d5bf8ebe6b12cd14eeed91be..dff8b0978d73324945ca98720258554c0450a9fe 100644 (file)
@@ -12,4 +12,4 @@ Handle=0002
 [DeficitRoundRobinSchedulerClass]
 Parent=root
 ClassId=0002:0030
-Quantum=2000
+QuantumBytes=2000
diff --git a/test/test-network/conf/25-qdisc-ets.network b/test/test-network/conf/25-qdisc-ets.network
new file mode 100644 (file)
index 0000000..a8c6b68
--- /dev/null
@@ -0,0 +1,20 @@
+[Match]
+Name=dummy98
+
+[Network]
+IPv6AcceptRA=no
+Address=10.1.2.3/16
+
+[EnhancedTransmissionSelection]
+Parent=root
+Handle=3a
+Bands=10
+StrictBands=3
+QuantumBytes=2 4 6
+QuantumBytes=
+QuantumBytes=1 2 3
+QuantumBytes=4 5
+PriorityMap=8 7 6 5
+PriorityMap=
+PriorityMap=3 4 5
+PriorityMap=6 7
index c94fc9e4cbaea5bf7718334a957b56d4b0a8deab..3a24415c1295dbd7421771970de11bc3fe5992e1 100644 (file)
@@ -13,10 +13,10 @@ Handle=0002
 Parent=root
 ClassId=0002:0030
 Weight=2
-MaxPacketSize=16000
+MaxPacketBytes=16000
 
 [QuickFairQueueingClass]
 Parent=root
 ClassId=0002:0031
 Weight=10
-MaxPacketSize=8000
+MaxPacketBytes=8000
diff --git a/test/test-network/conf/25-sriov.network b/test/test-network/conf/25-sriov.network
new file mode 100644 (file)
index 0000000..c962c3d
--- /dev/null
@@ -0,0 +1,37 @@
+[Match]
+Name=eni99np1
+
+[Network]
+Address=192.168.100.100/24
+
+[SR-IOV]
+VirtualFunction=0
+VLANId=5
+VLANProtocol=802.1ad
+QualityOfService=1
+MACSpoofCheck=yes
+QueryReceiveSideScaling=yes
+Trust=yes
+LinkState=yes
+MACAddress=00:11:22:33:44:55
+
+[SR-IOV]
+VirtualFunction=1
+VLANId=6
+VLANProtocol=802.1Q
+QualityOfService=2
+MACSpoofCheck=no
+QueryReceiveSideScaling=no
+Trust=no
+LinkState=no
+MACAddress=00:11:22:33:44:56
+
+[SR-IOV]
+VirtualFunction=2
+VLANId=7
+QualityOfService=3
+MACSpoofCheck=no
+QueryReceiveSideScaling=no
+Trust=no
+LinkState=auto
+MACAddress=00:11:22:33:44:57
index b6d1de52235cb52571b917613c96244efd230f26..caf077c8365958ed3cccc9ea09eb89a223bde107 100755 (executable)
@@ -158,6 +158,33 @@ def expectedFailureIfAlternativeNameIsNotAvailable():
 
     return f
 
+def expectedFailureIfNetdevsimWithSRIOVIsNotAvailable():
+    def f(func):
+        call('rmmod netdevsim', stderr=subprocess.DEVNULL)
+        rc = call('modprobe netdevsim', stderr=subprocess.DEVNULL)
+        if rc != 0:
+            return unittest.expectedFailure(func)
+
+        try:
+            with open('/sys/bus/netdevsim/new_device', mode='w') as f:
+                f.write('99 1')
+        except Exception as error:
+            return unittest.expectedFailure(func)
+
+        call('udevadm settle')
+        call('udevadm info -w10s /sys/devices/netdevsim99/net/eni99np1', stderr=subprocess.DEVNULL)
+        try:
+            with open('/sys/class/net/eni99np1/device/sriov_numvfs', mode='w') as f:
+                f.write('3')
+        except Exception as error:
+            call('rmmod netdevsim', stderr=subprocess.DEVNULL)
+            return unittest.expectedFailure(func)
+
+        call('rmmod netdevsim', stderr=subprocess.DEVNULL)
+        return func
+
+    return f
+
 def expectedFailureIfCAKEIsNotAvailable():
     def f(func):
         call('ip link add dummy98 type dummy', stderr=subprocess.DEVNULL)
@@ -194,6 +221,18 @@ def expectedFailureIfHHFIsNotAvailable():
 
     return f
 
+def expectedFailureIfETSIsNotAvailable():
+    def f(func):
+        call('ip link add dummy98 type dummy', stderr=subprocess.DEVNULL)
+        rc = call('tc qdisc add dev dummy98 parent root ets bands 10', stderr=subprocess.DEVNULL)
+        call('ip link del dummy98', stderr=subprocess.DEVNULL)
+        if rc == 0:
+            return func
+        else:
+            return unittest.expectedFailure(func)
+
+    return f
+
 def setUpModule():
     global running_units
 
@@ -1673,6 +1712,7 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
         '25-qdisc-cake.network',
         '25-qdisc-clsact-and-htb.network',
         '25-qdisc-drr.network',
+        '25-qdisc-ets.network',
         '25-qdisc-hhf.network',
         '25-qdisc-ingress-netem-compat.network',
         '25-qdisc-pie.network',
@@ -1682,6 +1722,7 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
         '25-route-vrf.network',
         '25-gateway-static.network',
         '25-gateway-next-static.network',
+        '25-sriov.network',
         '25-sysctl-disable-ipv6.network',
         '25-sysctl.network',
         '25-test1.network',
@@ -2224,7 +2265,7 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
         self.assertRegex(output, 'inet6 .* scope link')
         output = check_output('ip -4 route show dev dummy98')
         print(output)
-        self.assertEqual(output, '10.2.0.0/16 proto kernel scope link src 10.2.3.4')
+        self.assertRegex(output, '10.2.0.0/16 proto kernel scope link src 10.2.3.4')
         output = check_output('ip -6 route show dev dummy98')
         print(output)
         self.assertRegex(output, 'default via 2607:5300:203:39ff:ff:ff:ff:ff proto static')
@@ -2247,7 +2288,7 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
         self.assertRegex(output, 'inet6 .* scope link')
         output = check_output('ip -4 route show dev dummy98')
         print(output)
-        self.assertEqual(output, '10.2.0.0/16 proto kernel scope link src 10.2.3.4')
+        self.assertRegex(output, '10.2.0.0/16 proto kernel scope link src 10.2.3.4')
         output = check_output('ip -6 route show dev dummy98')
         print(output)
         self.assertRegex(output, 'default via 2607:5300:203:39ff:ff:ff:ff:ff proto static')
@@ -2407,7 +2448,7 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
 
         self.assertRegex(output, 'qdisc pfifo_fast 3c: parent 2:3c')
 
-        output = check_output('tc class show dev dummy98')
+        output = check_output('tc -d class show dev dummy98')
         print(output)
         self.assertRegex(output, 'class htb 2:30 root leaf 30:')
         self.assertRegex(output, 'class htb 2:31 root leaf 31:')
@@ -2422,7 +2463,9 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
         self.assertRegex(output, 'class htb 2:3a root leaf 3a:')
         self.assertRegex(output, 'class htb 2:3b root leaf 3b:')
         self.assertRegex(output, 'class htb 2:3c root leaf 3c:')
-        self.assertRegex(output, 'prio 1 rate 1Mbit ceil 500Kbit')
+        self.assertRegex(output, 'prio 1 quantum 4000 rate 1Mbit overhead 100 ceil 500Kbit')
+        self.assertRegex(output, 'burst 123456')
+        self.assertRegex(output, 'cburst 123457')
 
     def test_qdisc2(self):
         copy_unit_to_networkd_unit_path('25-qdisc-drr.network', '12-dummy.netdev',
@@ -2480,6 +2523,45 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
         self.assertRegex(output, 'qdisc hhf 3a: root')
         self.assertRegex(output, 'limit 1022p')
 
+    @expectedFailureIfETSIsNotAvailable()
+    def test_qdisc_ets(self):
+        copy_unit_to_networkd_unit_path('25-qdisc-ets.network', '12-dummy.netdev')
+        start_networkd()
+        self.wait_online(['dummy98:routable'])
+
+        output = check_output('tc qdisc show dev dummy98')
+        print(output)
+        self.assertRegex(output, 'qdisc ets 3a: root')
+        self.assertRegex(output, 'bands 10 strict 3')
+        self.assertRegex(output, 'quanta 1 2 3 4 5')
+        self.assertRegex(output, 'priomap 3 4 5 6 7')
+
+    @expectedFailureIfNetdevsimWithSRIOVIsNotAvailable()
+    def test_sriov(self):
+        call('rmmod netdevsim', stderr=subprocess.DEVNULL)
+        call('modprobe netdevsim', stderr=subprocess.DEVNULL)
+        with open('/sys/bus/netdevsim/new_device', mode='w') as f:
+            f.write('99 1')
+
+        call('udevadm settle')
+        call('udevadm info -w10s /sys/devices/netdevsim99/net/eni99np1', stderr=subprocess.DEVNULL)
+        with open('/sys/class/net/eni99np1/device/sriov_numvfs', mode='w') as f:
+            f.write('3')
+
+        copy_unit_to_networkd_unit_path('25-sriov.network')
+        start_networkd()
+        self.wait_online(['eni99np1:routable'])
+
+        output = check_output('ip link show dev eni99np1')
+        print(output)
+        self.assertRegex(output,
+                         'vf 0 .*00:11:22:33:44:55.*vlan 5, qos 1, vlan protocol 802.1ad, spoof checking on, link-state enable, trust on, query_rss on\n *'
+                         'vf 1 .*00:11:22:33:44:56.*vlan 6, qos 2, spoof checking off, link-state disable, trust off, query_rss off\n *'
+                         'vf 2 .*00:11:22:33:44:57.*vlan 7, qos 3, spoof checking off, link-state auto, trust off, query_rss off'
+        )
+
+        call('rmmod netdevsim', stderr=subprocess.DEVNULL)
+
 class NetworkdStateFileTests(unittest.TestCase, Utilities):
     links = [
         'dummy98',
index f8499ec6195d49645e9547f26ddbe11f8de7311d..fb465d76bbca5eed338988ecc969f57addbb1884 100644 (file)
@@ -3,4 +3,5 @@ Description=Service Test for Path units
 
 [Service]
 ExecStart=/bin/true
-Type=oneshot
+Type=simple
+RemainAfterExit=true
index f8499ec6195d49645e9547f26ddbe11f8de7311d..fb465d76bbca5eed338988ecc969f57addbb1884 100644 (file)
@@ -3,4 +3,5 @@ Description=Service Test for Path units
 
 [Service]
 ExecStart=/bin/true
-Type=oneshot
+Type=simple
+RemainAfterExit=true
index f8499ec6195d49645e9547f26ddbe11f8de7311d..fb465d76bbca5eed338988ecc969f57addbb1884 100644 (file)
@@ -3,4 +3,5 @@ Description=Service Test for Path units
 
 [Service]
 ExecStart=/bin/true
-Type=oneshot
+Type=simple
+RemainAfterExit=true
index f8499ec6195d49645e9547f26ddbe11f8de7311d..fb465d76bbca5eed338988ecc969f57addbb1884 100644 (file)
@@ -3,4 +3,5 @@ Description=Service Test for Path units
 
 [Service]
 ExecStart=/bin/true
-Type=oneshot
+Type=simple
+RemainAfterExit=true
index f8499ec6195d49645e9547f26ddbe11f8de7311d..fb465d76bbca5eed338988ecc969f57addbb1884 100644 (file)
@@ -3,4 +3,5 @@ Description=Service Test for Path units
 
 [Service]
 ExecStart=/bin/true
-Type=oneshot
+Type=simple
+RemainAfterExit=true
index f8499ec6195d49645e9547f26ddbe11f8de7311d..fb465d76bbca5eed338988ecc969f57addbb1884 100644 (file)
@@ -3,4 +3,5 @@ Description=Service Test for Path units
 
 [Service]
 ExecStart=/bin/true
-Type=oneshot
+Type=simple
+RemainAfterExit=true
index 172ac0d0d5fdf12997581be564ee2c4868b58ddd..bcdafe4f3072967bb0c6d0eee853aef9e3fc3952 100644 (file)
@@ -1,6 +1,7 @@
 [Unit]
-Description=Service Test Path Unit=
+Description=Service Test Path Unit
 
 [Service]
 ExecStart=/bin/true
-Type=oneshot
+Type=simple
+RemainAfterExit=true
diff --git a/test/testsuite-52.units/testsuite-52.service b/test/testsuite-52.units/testsuite-52.service
new file mode 100755 (executable)
index 0000000..93f847f
--- /dev/null
@@ -0,0 +1,6 @@
+[Unit]
+Description=Testsuite service
+
+[Service]
+ExecStart=/usr/lib/systemd/tests/testdata/%N.units/%N.sh
+Type=oneshot
diff --git a/test/testsuite-52.units/testsuite-52.sh b/test/testsuite-52.units/testsuite-52.sh
new file mode 100755 (executable)
index 0000000..9cccf1b
--- /dev/null
@@ -0,0 +1,18 @@
+#!/bin/bash
+set -ex
+set -o pipefail
+
+if ! test -x /usr/lib/systemd/tests/testdata/units/test-honor-first-shutdown.sh ; then
+        echo "honor-first-shutdown script not found - FAIL" > /testok
+        exit 0
+fi
+
+systemd-analyze log-level debug
+systemd-analyze log-target console
+
+systemctl enable test-honor-first-shutdown.service
+systemctl start test-honor-first-shutdown.service
+
+echo OK > /testok
+
+exit 0
diff --git a/test/units/test-honor-first-shutdown.service b/test/units/test-honor-first-shutdown.service
new file mode 100644 (file)
index 0000000..3170f97
--- /dev/null
@@ -0,0 +1,11 @@
+[Unit]
+Description=Honor First Shutdown feature
+After=multi-user.target
+
+[Service]
+ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
+ExecStop=sh -c 'kill -KILL $MAINPID'
+FailureAction=reboot
+
+[Install]
+WantedBy=multi-user.target
diff --git a/test/units/test-honor-first-shutdown.sh b/test/units/test-honor-first-shutdown.sh
new file mode 100755 (executable)
index 0000000..17c1ec9
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/bash
+echo "Honor first shutdown test script"
+sleep infinity;
index d04751b3f0780464f455d199093c7408950417f2..aed938437be2356240a1f50b435898b6e18e2cb4 100755 (executable)
@@ -120,7 +120,7 @@ systemctlCheckNUMAProperties() {
 
     > "$LOGFILE"
 
-    if [ -n $3 ]; then
+    if [ -n "$3" ]; then
         systemctl show -p NUMAMask $1 > "$LOGFILE"
         grep "NUMAMask=$3" "$LOGFILE"
     fi
index 97f86140f11832b28d89ca9051c21d15732b9490..50034cf3d9a5e9af2c6ccfd1cfbcf60a79d21ebc 100755 (executable)
@@ -6,13 +6,13 @@ systemd-analyze log-level debug
 systemd-analyze log-target console
 
 systemctl start testsuite-47-repro
-sleep 1
+sleep 4
 systemctl status testsuite-47-repro
 
 leaked_pid=$(cat /leakedtestpid)
 
 systemctl stop testsuite-47-repro
-sleep 1
+sleep 4
 
 # Leaked PID will still be around if we're buggy.
 # I personally prefer to see 42.
index a811134d7746ad145b40ad2dd4cc493ed99bebd4..03231e71b183b3f1f76fac1d1bd641ad9b98404e 100755 (executable)
@@ -21,18 +21,65 @@ systemctl start testservice-48.target
 # May 07 23:12:20 systemd-testsuite testsuite-48.sh[52]: -rw-r--r-- 1 root root 50 2020-05-07 23:12:20.000000000 +0100 /
 # May 07 23:12:20 systemd-testsuite testsuite-48.sh[30]: + stat -f --format=%t /etc/systemd/system/testservice-48.servic
 # May 07 23:12:20 systemd-testsuite testsuite-48.sh[53]: ef53
-sleep 1.1
+sleep 3.1
 
 cat > /run/systemd/system/testservice-48.service <<EOF
 [Service]
 ExecStart=/bin/sleep infinity
-Type=exec
 EOF
 
 systemctl start testservice-48.service
 
 systemctl is-active testservice-48.service
 
+# Stop and remove, and try again to exercise https://github.com/systemd/systemd/issues/15992
+systemctl stop testservice-48.service
+rm -f /run/systemd/system/testservice-48.service
+systemctl daemon-reload
+
+sleep 3.1
+
+cat > /run/systemd/system/testservice-48.service <<EOF
+[Service]
+ExecStart=/bin/sleep infinity
+EOF
+
+# Start a non-existing unit first, so that the cache is reloaded for an unrelated
+# reason. Starting the existing unit later should still work thanks to the check
+# for the last load attempt vs cache timestamp.
+systemctl start testservice-48-nonexistent.service || true
+
+systemctl start testservice-48.service
+
+systemctl is-active testservice-48.service
+
+# Stop and remove, and try again to exercise the transaction setup code path by
+# having the target pull in the unloaded but available unit
+systemctl stop testservice-48.service testservice-48.target
+rm -f /run/systemd/system/testservice-48.service /run/systemd/system/testservice-48.target
+systemctl daemon-reload
+
+sleep 3.1
+
+cat > /run/systemd/system/testservice-48.target <<EOF
+[Unit]
+Conflicts=shutdown.target
+Wants=testservice-48.service
+EOF
+
+systemctl daemon-reload
+
+systemctl start testservice-48.target
+
+cat > /run/systemd/system/testservice-48.service <<EOF
+[Service]
+ExecStart=/bin/sleep infinity
+EOF
+
+systemctl restart testservice-48.target
+
+systemctl is-active testservice-48.service
+
 echo OK > /testok
 
 exit 0
index b40e97ba624088b0535bd38e5af28a44b6f8f28e..cc0f99169c9c136c320148cb88fec68367e2c28a 100755 (executable)
@@ -2,8 +2,5 @@
 set -eu
 
 git shortlog -s `git describe --abbrev=0`.. | \
-    cut -c8- | \
-    sed 's/ / /g' | \
-    awk '{ print $$0 "," }' | \
-    sed -e 's/ / /g' | \
+    awk '{ $1=""; print $0 "," }' | \
     sort -u
index 065752ced4720c76147bc2b9699a962c3f280b82..e13ca33f6fc5fcb2cff17aa6d872085717b8c387 100755 (executable)
@@ -12,13 +12,13 @@ for entry in chromiumos.gen_autosuspend_rules.PCI_IDS:
     vendor, device = entry.split(':')
     vendor = int(vendor, 16)
     device = int(device, 16)
-    print(f'pci:v{vendor:08X}d{device:08X}*')
+    print('pci:v{:08X}d{:08X}*'.format(vendor, device))
 
 print('# usb:v<VEND>p<PROD> (4 uppercase hexadecimal digits twice')
 for entry in chromiumos.gen_autosuspend_rules.USB_IDS:
     vendor, product = entry.split(':')
     vendor = int(vendor, 16)
     product = int(product, 16)
-    print(f'usb:v{vendor:04X}p{product:04X}*')
+    print('usb:v{:04X}p{:04X}*'.format(vendor, product))
 
 print(' ID_AUTOSUSPEND=1')
index cc665021d4b6bd79d1a7f8836c6021cdf6d64db9..8fe43c077109fa499e33139d4fe2b6ec32338cd7 100755 (executable)
@@ -18,11 +18,15 @@ REPO_ROOT="${REPO_ROOT:-$PWD}"
 ADDITIONAL_DEPS=(
     clang
     dnf-plugins-core
-    hostname libasan
-    jq iputils
+    hostname
+    iputils
+    jq
+    libasan
     libfdisk-devel
+    libfido2-devel
     libpwquality-devel
     libubsan
+    libzstd-devel
     llvm
     openssl-devel
     p11-kit-devel
index 295fc036137d09121bb0bfb8673a7aad0c397193..b69197f0b53796584a3f5f11d321a20778cc7fd1 100755 (executable)
@@ -6,7 +6,7 @@ set -u
 
 REPO_ROOT=${REPO_ROOT:-$(pwd)}
 
-sudo bash -c "echo 'deb-src http://archive.ubuntu.com/ubuntu/ xenial main restricted universe multiverse' >>/etc/apt/sources.list"
+sudo bash -c "echo 'deb-src http://archive.ubuntu.com/ubuntu/ $(lsb_release -cs) main restricted universe multiverse' >>/etc/apt/sources.list"
 sudo apt-get update -y
 sudo apt-get build-dep systemd -y
 sudo apt-get install -y ninja-build python3-pip python3-setuptools quota
@@ -19,18 +19,3 @@ export PATH="$HOME/.local/bin/:$PATH"
 tools/oss-fuzz.sh
 ./out/fuzz-unit-file -max_total_time=5
 git clean -dxff
-
-git clone https://github.com/google/oss-fuzz /tmp/oss-fuzz
-cd /tmp/oss-fuzz
-sudo ./infra/helper.py pull_images
-
-# docker doesn't like colons in filenames so let's create a directory
-# whose name can be consumed by the -v option.
-# https://github.com/google/oss-fuzz/issues/2428
-t=$(mktemp -d)
-sudo mount --bind "$REPO_ROOT" "$t"
-
-# helper.py is wrapped in script to trick it into thinking it's "interactive"
-# See https://github.com/systemd/systemd/pull/12542#issuecomment-491563572
-sudo script -e -c "./infra/helper.py build_fuzzers --clean --sanitizer=memory systemd $t"
-sudo script -e -c "./infra/helper.py check_build --sanitizer=memory -e ALLOWED_BROKEN_TARGETS_PERCENTAGE=0 systemd"