diff --git a/Makefile.am b/Makefile.am index e8bd7bd..99d8b21 100644 --- a/Makefile.am +++ b/Makefile.am @@ -113,7 +113,11 @@ DISTCLEANFILES += config-extra.h $(libnm_core_lib_h_pub_mkenums): config-extra.h libnm-core/.dirstamp: config-extra.h shared/.dirstamp: config-extra.h +shared/nm-base/.dirstamp: config-extra.h shared/nm-glib-aux/.dirstamp: config-extra.h +shared/nm-glib-aux/tests/.dirstamp: config-extra.h +shared/nm-platform/.dirstamp: config-extra.h +shared/nm-platform/tests/.dirstamp: config-extra.h shared/nm-std-aux/.dirstamp: config-extra.h shared/nm-udev-aux/.dirstamp: config-extra.h shared/systemd/.dirstamp: config-extra.h @@ -461,6 +465,121 @@ shared_nm_udev_aux_libnm_udev_aux_la_LIBADD = \ ############################################################################### +noinst_LTLIBRARIES += shared/nm-base/libnm-base.la + +shared_nm_base_libnm_base_la_CPPFLAGS = \ + $(shared_nm_glib_aux_cppflags) \ + $(NULL) + +shared_nm_base_libnm_base_la_SOURCES = \ + shared/nm-base/nm-base.h \ + shared/nm-base/nm-ethtool-base.c \ + shared/nm-base/nm-ethtool-base.h \ + shared/nm-base/nm-ethtool-utils-base.h \ + $(NULL) + +shared_nm_base_libnm_base_la_LDFLAGS = \ + $(CODE_COVERAGE_LDFLAGS) \ + $(SANITIZER_LIB_LDFLAGS) \ + $(NULL) + +shared_nm_base_libnm_base_la_LIBADD = \ + $(GLIB_LIBS) \ + $(NULL) + +############################################################################### + +noinst_LTLIBRARIES += shared/nm-log-core/libnm-log-core.la + +shared_nm_log_core_libnm_log_core_la_CPPFLAGS = \ + $(dflt_cppflags) \ + -I$(srcdir)/shared \ + $(CODE_COVERAGE_CFLAGS) \ + $(SANITIZER_LIB_CFLAGS) \ + $(GLIB_CFLAGS) \ + $(SYSTEMD_JOURNAL_CFLAGS) \ + -DG_LOG_DOMAIN=\""NetworkManager"\" \ + -DNETWORKMANAGER_COMPILATION='(NM_NETWORKMANAGER_COMPILATION_GLIB|NM_NETWORKMANAGER_COMPILATION_WITH_GLIB_I18N_LIB)' \ + $(NULL) + +shared_nm_log_core_libnm_log_core_la_SOURCES = \ + shared/nm-log-core/nm-logging.c \ + shared/nm-log-core/nm-logging.h \ + $(NULL) + +shared_nm_log_core_libnm_log_core_la_LDFLAGS = \ + $(CODE_COVERAGE_LDFLAGS) \ + $(SANITIZER_LIB_LDFLAGS) \ + $(NULL) + +shared_nm_log_core_libnm_log_core_la_LIBADD = \ + $(GLIB_LIBS) \ + $(SYSTEMD_JOURNAL_LIBS) \ + $(NULL) + +############################################################################### + +noinst_LTLIBRARIES += shared/nm-platform/libnm-platform.la + +shared_nm_platform_libnm_platform_la_CPPFLAGS = \ + $(shared_nm_glib_aux_cppflags) \ + $(NULL) + +shared_nm_platform_libnm_platform_la_SOURCES = \ + shared/nm-platform/nm-netlink.c \ + shared/nm-platform/nm-netlink.h \ + shared/nm-platform/nm-platform-utils.c \ + shared/nm-platform/nm-platform-utils.h \ + shared/nm-platform/nmp-base.h \ + shared/nm-platform/nmp-netns.c \ + shared/nm-platform/nmp-netns.h \ + $(NULL) + +shared_nm_platform_libnm_platform_la_LDFLAGS = \ + $(CODE_COVERAGE_LDFLAGS) \ + $(SANITIZER_LIB_LDFLAGS) \ + $(NULL) + +shared_nm_platform_libnm_platform_la_LIBADD = \ + $(GLIB_LIBS) \ + $(NULL) + +############################################################################### + +check_programs += shared/nm-platform/tests/test-nm-platform + +shared_nm_platform_tests_test_nm_platform_CPPFLAGS = \ + $(dflt_cppflags) \ + -I$(srcdir)/shared \ + -DNETWORKMANAGER_COMPILATION_TEST \ + -DNETWORKMANAGER_COMPILATION='(NM_NETWORKMANAGER_COMPILATION_GLIB|NM_NETWORKMANAGER_COMPILATION_WITH_GLIB_I18N_PROG)' \ + $(CODE_COVERAGE_CFLAGS) \ + $(SYSTEMD_JOURNAL_CFLAGS) \ + $(GLIB_CFLAGS) \ + $(SANITIZER_LIB_CFLAGS) \ + $(NULL) + +shared_nm_platform_tests_test_nm_platform_LDFLAGS = \ + $(CODE_COVERAGE_LDFLAGS) \ + $(SANITIZER_EXEC_LDFLAGS) \ + $(NULL) + +shared_nm_platform_tests_test_nm_platform_LDADD = \ + shared/nm-platform/libnm-platform.la \ + shared/nm-log-core/libnm-log-core.la \ + shared/nm-glib-aux/libnm-glib-aux.la \ + shared/nm-std-aux/libnm-std-aux.la \ + shared/libcsiphash.la \ + $(SYSTEMD_JOURNAL_LIBS) \ + $(GLIB_LIBS) \ + $(NULL) + +EXTRA_DIST += \ + shared/nm-platform/tests/meson.build \ + $(NULL) + +############################################################################### + noinst_LTLIBRARIES += libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_CPPFLAGS = \ @@ -480,8 +599,6 @@ libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_SOURCES = \ libnm-core/nm-libnm-core-intern/nm-auth-subject.c \ libnm-core/nm-libnm-core-intern/nm-auth-subject.h \ libnm-core/nm-libnm-core-intern/nm-common-macros.h \ - libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c \ - libnm-core/nm-libnm-core-intern/nm-ethtool-utils.h \ libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c \ libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.h \ $(NULL) @@ -613,6 +730,7 @@ EXTRA_DIST += libnm/nm-libnm-aux/README.md EXTRA_DIST += \ shared/nm-glib-aux/tests/meson.build \ + shared/README.md \ $(NULL) ############################################################################### @@ -1266,6 +1384,7 @@ libnm_core_tests_ldadd = \ libnm-core/libnm-core.la \ $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ shared/systemd/libnm-systemd-shared.la \ shared/systemd/libnm-systemd-logging-stub.la \ shared/nm-glib-aux/libnm-glib-aux.la \ @@ -1376,6 +1495,7 @@ libnm_lib_h_pub_real = \ libnm/nm-device-wpan.h \ libnm/nm-device.h \ libnm/nm-dhcp-config.h \ + libnm/nm-ethtool-utils.h \ libnm/nm-ip-config.h \ libnm/nm-object.h \ libnm/nm-remote-connection.h \ @@ -1497,6 +1617,7 @@ libnm_liblibnm_la_LIBADD = \ libnm-core/libnm-core.la \ $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ introspection/libnmdbus.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/systemd/libnm-systemd-shared.la \ @@ -2112,21 +2233,12 @@ src_libNetworkManagerBase_la_SOURCES = \ \ src/nm-core-utils.c \ src/nm-core-utils.h \ - src/nm-logging.c \ - src/nm-logging.h \ \ src/NetworkManagerUtils.c \ src/NetworkManagerUtils.h \ \ - src/platform/nm-netlink.c \ - src/platform/nm-netlink.h \ - \ - src/platform/nmp-netns.c \ - src/platform/nmp-netns.h \ src/platform/nmp-object.c \ src/platform/nmp-object.h \ - src/platform/nm-platform-utils.c \ - src/platform/nm-platform-utils.h \ src/platform/nm-platform.c \ src/platform/nm-platform.h \ src/platform/nm-platform-private.h \ @@ -2192,7 +2304,6 @@ endif src_libNetworkManagerBase_la_LIBADD = \ $(GLIB_LIBS) \ - $(SYSTEMD_JOURNAL_LIBS) \ $(LIBUDEV_LIBS) \ $(NULL) @@ -2389,6 +2500,9 @@ src_libNetworkManager_la_LIBADD = \ libnm-core/libnm-core.la \ $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-platform/libnm-platform.la \ + shared/nm-base/libnm-base.la \ + shared/nm-log-core/libnm-log-core.la \ shared/nm-udev-aux/libnm-udev-aux.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ @@ -2401,6 +2515,7 @@ src_libNetworkManager_la_LIBADD = \ $(GLIB_LIBS) \ $(LIBUDEV_LIBS) \ $(SYSTEMD_LOGIN_LIBS) \ + $(SYSTEMD_JOURNAL_LIBS) \ $(LIBNDP_LIBS) \ $(DL_LIBS) \ $(SELINUX_LIBS) \ @@ -2499,6 +2614,9 @@ src_nm_iface_helper_LDADD = \ libnm-core/libnm-core.la \ $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-platform/libnm-platform.la \ + shared/nm-base/libnm-base.la \ + shared/nm-log-core/libnm-log-core.la \ shared/nm-udev-aux/libnm-udev-aux.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ @@ -2508,6 +2626,7 @@ src_nm_iface_helper_LDADD = \ shared/libndhcp4.la \ shared/libcrbtree.la \ shared/libcsiphash.la \ + $(SYSTEMD_JOURNAL_LIBS) \ $(GLIB_LIBS) \ $(LIBUDEV_LIBS) \ $(LIBNDP_LIBS) \ @@ -2550,6 +2669,9 @@ src_initrd_nm_initrd_generator_LDADD = \ libnm-core/libnm-core.la \ $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-platform/libnm-platform.la \ + shared/nm-base/libnm-base.la \ + shared/nm-log-core/libnm-log-core.la \ shared/nm-udev-aux/libnm-udev-aux.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ @@ -2558,6 +2680,7 @@ src_initrd_nm_initrd_generator_LDADD = \ shared/nm-std-aux/libnm-std-aux.la \ shared/libndhcp4.la \ shared/libcsiphash.la \ + $(SYSTEMD_JOURNAL_LIBS) \ $(GLIB_LIBS) \ $(NULL) @@ -4548,6 +4671,7 @@ clients_common_tests_test_clients_common_LDADD = \ clients/common/libnmc-base.la \ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ shared/libcsiphash.la \ @@ -4639,6 +4763,7 @@ clients_cli_nmcli_LDADD = \ clients/common/libnmc-base.la \ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ shared/libcsiphash.la \ @@ -4687,6 +4812,7 @@ clients_cli_generate_docs_nm_settings_nmcli_LDADD = \ libnm/nm-libnm-aux/libnm-libnm-aux.la \ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ libnm/libnm.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ @@ -4877,6 +5003,7 @@ clients_tui_nmtui_LDADD = \ libnm/nm-libnm-aux/libnm-libnm-aux.la \ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ shared/libcsiphash.la \ @@ -4948,6 +5075,7 @@ clients_cloud_setup_nm_cloud_setup_LDADD = \ libnm/nm-libnm-aux/libnm-libnm-aux.la \ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ shared/libcsiphash.la \ diff --git a/Makefile.in b/Makefile.in index 89af04b..54bd941 100644 --- a/Makefile.in +++ b/Makefile.in @@ -417,7 +417,8 @@ am__EXEEXT_4 = libnm/tests/test-nm-client$(EXEEXT) \ @WITH_WIFI_TRUE@am__EXEEXT_9 = src/devices/wifi/tests/test-devices-wifi$(EXEEXT) @HAVE_INTROSPECTION_TRUE@am__EXEEXT_10 = clients/common/tests/test-clients-common$(EXEEXT) @BUILD_NMCLI_TRUE@@HAVE_INTROSPECTION_FALSE@am__EXEEXT_11 = clients/common/tests/test-clients-common$(EXEEXT) -am__EXEEXT_12 = shared/nm-glib-aux/tests/test-shared-general$(EXEEXT) \ +am__EXEEXT_12 = shared/nm-platform/tests/test-nm-platform$(EXEEXT) \ + shared/nm-glib-aux/tests/test-shared-general$(EXEEXT) \ $(am__EXEEXT_3) libnm-core/tests/test-compare$(EXEEXT) \ libnm-core/tests/test-crypto$(EXEEXT) \ libnm-core/tests/test-general$(EXEEXT) \ @@ -806,7 +807,6 @@ libnm_core_nm_libnm_core_aux_libnm_libnm_core_aux_la_LINK = \ libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_DEPENDENCIES = \ $(am__DEPENDENCIES_1) am_libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_OBJECTS = libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-auth-subject.lo \ - libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-ethtool-utils.lo \ libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-libnm-core-utils.lo libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_OBJECTS = $(am_libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_OBJECTS) libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_LINK = \ @@ -819,7 +819,7 @@ libnm_liblibnm_la_DEPENDENCIES = \ libnm-core/nm-keyfile/libnm-keyfile.la \ libnm-core/libnm-core.la $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ - introspection/libnmdbus.la \ + shared/nm-base/libnm-base.la introspection/libnmdbus.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/systemd/libnm-systemd-shared.la \ shared/systemd/libnm-systemd-logging-stub.la \ @@ -963,6 +963,15 @@ shared_libndhcp4_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(shared_libndhcp4_la_CFLAGS) $(CFLAGS) \ $(shared_libndhcp4_la_LDFLAGS) $(LDFLAGS) -o $@ +shared_nm_base_libnm_base_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_shared_nm_base_libnm_base_la_OBJECTS = \ + shared/nm-base/libnm_base_la-nm-ethtool-base.lo +shared_nm_base_libnm_base_la_OBJECTS = \ + $(am_shared_nm_base_libnm_base_la_OBJECTS) +shared_nm_base_libnm_base_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(shared_nm_base_libnm_base_la_LDFLAGS) \ + $(LDFLAGS) -o $@ shared_nm_glib_aux_libnm_glib_aux_la_DEPENDENCIES = \ $(am__DEPENDENCIES_1) am_shared_nm_glib_aux_libnm_glib_aux_la_OBJECTS = \ @@ -987,6 +996,30 @@ shared_nm_glib_aux_libnm_glib_aux_la_LINK = $(LIBTOOL) $(AM_V_lt) \ $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(shared_nm_glib_aux_libnm_glib_aux_la_LDFLAGS) $(LDFLAGS) -o \ $@ +shared_nm_log_core_libnm_log_core_la_DEPENDENCIES = \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_shared_nm_log_core_libnm_log_core_la_OBJECTS = \ + shared/nm-log-core/libnm_log_core_la-nm-logging.lo +shared_nm_log_core_libnm_log_core_la_OBJECTS = \ + $(am_shared_nm_log_core_libnm_log_core_la_OBJECTS) +shared_nm_log_core_libnm_log_core_la_LINK = $(LIBTOOL) $(AM_V_lt) \ + --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(shared_nm_log_core_libnm_log_core_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +shared_nm_platform_libnm_platform_la_DEPENDENCIES = \ + $(am__DEPENDENCIES_1) +am_shared_nm_platform_libnm_platform_la_OBJECTS = \ + shared/nm-platform/libnm_platform_la-nm-netlink.lo \ + shared/nm-platform/libnm_platform_la-nm-platform-utils.lo \ + shared/nm-platform/libnm_platform_la-nmp-netns.lo +shared_nm_platform_libnm_platform_la_OBJECTS = \ + $(am_shared_nm_platform_libnm_platform_la_OBJECTS) +shared_nm_platform_libnm_platform_la_LINK = $(LIBTOOL) $(AM_V_lt) \ + --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(shared_nm_platform_libnm_platform_la_LDFLAGS) $(LDFLAGS) -o \ + $@ shared_nm_std_aux_libnm_std_aux_la_LIBADD = am_shared_nm_std_aux_libnm_std_aux_la_OBJECTS = \ shared/nm-std-aux/libnm_std_aux_la-c-list-util.lo \ @@ -1252,6 +1285,9 @@ src_libNetworkManager_la_DEPENDENCIES = src/libNetworkManagerBase.la \ libnm-core/nm-keyfile/libnm-keyfile.la \ libnm-core/libnm-core.la $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-platform/libnm-platform.la \ + shared/nm-base/libnm-base.la \ + shared/nm-log-core/libnm-log-core.la \ shared/nm-udev-aux/libnm-udev-aux.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la src/libnm-systemd-core.la \ @@ -1261,7 +1297,7 @@ src_libNetworkManager_la_DEPENDENCIES = src/libNetworkManagerBase.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_src_libNetworkManager_la_OBJECTS = \ src/libNetworkManager_la-nm-checkpoint.lo \ src/libNetworkManager_la-nm-checkpoint-manager.lo \ @@ -1344,15 +1380,11 @@ am_src_libNetworkManager_la_OBJECTS = \ src_libNetworkManager_la_OBJECTS = \ $(am_src_libNetworkManager_la_OBJECTS) src_libNetworkManagerBase_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) am__src_libNetworkManagerBase_la_SOURCES_DIST = src/nm-core-utils.c \ - src/nm-core-utils.h src/nm-logging.c src/nm-logging.h \ - src/NetworkManagerUtils.c src/NetworkManagerUtils.h \ - src/platform/nm-netlink.c src/platform/nm-netlink.h \ - src/platform/nmp-netns.c src/platform/nmp-netns.h \ - src/platform/nmp-object.c src/platform/nmp-object.h \ - src/platform/nm-platform-utils.c \ - src/platform/nm-platform-utils.h src/platform/nm-platform.c \ + src/nm-core-utils.h src/NetworkManagerUtils.c \ + src/NetworkManagerUtils.h src/platform/nmp-object.c \ + src/platform/nmp-object.h src/platform/nm-platform.c \ src/platform/nm-platform.h src/platform/nm-platform-private.h \ src/platform/nm-linux-platform.c \ src/platform/nm-linux-platform.h \ @@ -1385,12 +1417,8 @@ am__src_libNetworkManagerBase_la_SOURCES_DIST = src/nm-core-utils.c \ @WITH_WEXT_TRUE@am__objects_13 = src/platform/wifi/libNetworkManagerBase_la-nm-wifi-utils-wext.lo am_src_libNetworkManagerBase_la_OBJECTS = \ src/libNetworkManagerBase_la-nm-core-utils.lo \ - src/libNetworkManagerBase_la-nm-logging.lo \ src/libNetworkManagerBase_la-NetworkManagerUtils.lo \ - src/platform/libNetworkManagerBase_la-nm-netlink.lo \ - src/platform/libNetworkManagerBase_la-nmp-netns.lo \ src/platform/libNetworkManagerBase_la-nmp-object.lo \ - src/platform/libNetworkManagerBase_la-nm-platform-utils.lo \ src/platform/libNetworkManagerBase_la-nm-platform.lo \ src/platform/libNetworkManagerBase_la-nm-linux-platform.lo \ src/platform/libNetworkManagerBase_la-nmp-rules-manager.lo \ @@ -1558,7 +1586,8 @@ clients_cli_generate_docs_nm_settings_nmcli_DEPENDENCIES = \ libnm/nm-libnm-aux/libnm-libnm-aux.la \ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ - libnm/libnm.la shared/nm-glib-aux/libnm-glib-aux.la \ + shared/nm-base/libnm-base.la libnm/libnm.la \ + shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la shared/libcsiphash.la \ $(am__DEPENDENCIES_1) clients_cli_generate_docs_nm_settings_nmcli_LINK = $(LIBTOOL) \ @@ -1590,6 +1619,7 @@ clients_cli_nmcli_OBJECTS = $(am_clients_cli_nmcli_OBJECTS) @BUILD_NMCLI_TRUE@ clients/common/libnmc-base.la \ @BUILD_NMCLI_TRUE@ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ @BUILD_NMCLI_TRUE@ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ +@BUILD_NMCLI_TRUE@ shared/nm-base/libnm-base.la \ @BUILD_NMCLI_TRUE@ shared/nm-glib-aux/libnm-glib-aux.la \ @BUILD_NMCLI_TRUE@ shared/nm-std-aux/libnm-std-aux.la \ @BUILD_NMCLI_TRUE@ shared/libcsiphash.la \ @@ -1626,6 +1656,7 @@ clients_cloud_setup_nm_cloud_setup_OBJECTS = \ @BUILD_NM_CLOUD_SETUP_TRUE@clients_cloud_setup_nm_cloud_setup_DEPENDENCIES = libnm/nm-libnm-aux/libnm-libnm-aux.la \ @BUILD_NM_CLOUD_SETUP_TRUE@ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ @BUILD_NM_CLOUD_SETUP_TRUE@ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ +@BUILD_NM_CLOUD_SETUP_TRUE@ shared/nm-base/libnm-base.la \ @BUILD_NM_CLOUD_SETUP_TRUE@ shared/nm-glib-aux/libnm-glib-aux.la \ @BUILD_NM_CLOUD_SETUP_TRUE@ shared/nm-std-aux/libnm-std-aux.la \ @BUILD_NM_CLOUD_SETUP_TRUE@ shared/libcsiphash.la \ @@ -1643,6 +1674,7 @@ clients_common_tests_test_clients_common_DEPENDENCIES = \ clients/common/libnmc.la clients/common/libnmc-base.la \ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la shared/libcsiphash.la \ libnm/libnm.la $(am__DEPENDENCIES_1) @@ -1773,6 +1805,7 @@ clients_tui_nmtui_OBJECTS = $(am_clients_tui_nmtui_OBJECTS) @BUILD_NMTUI_TRUE@ libnm/nm-libnm-aux/libnm-libnm-aux.la \ @BUILD_NMTUI_TRUE@ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ @BUILD_NMTUI_TRUE@ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ +@BUILD_NMTUI_TRUE@ shared/nm-base/libnm-base.la \ @BUILD_NMTUI_TRUE@ shared/nm-glib-aux/libnm-glib-aux.la \ @BUILD_NMTUI_TRUE@ shared/nm-std-aux/libnm-std-aux.la \ @BUILD_NMTUI_TRUE@ shared/libcsiphash.la libnm/libnm.la \ @@ -1889,6 +1922,7 @@ am__DEPENDENCIES_3 = \ libnm-core/nm-keyfile/libnm-keyfile.la \ libnm-core/libnm-core.la $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ shared/systemd/libnm-systemd-shared.la \ shared/systemd/libnm-systemd-logging-stub.la \ shared/nm-glib-aux/libnm-glib-aux.la \ @@ -2021,6 +2055,20 @@ shared_nm_glib_aux_tests_test_shared_general_LINK = $(LIBTOOL) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(shared_nm_glib_aux_tests_test_shared_general_LDFLAGS) \ $(LDFLAGS) -o $@ +shared_nm_platform_tests_test_nm_platform_SOURCES = \ + shared/nm-platform/tests/test-nm-platform.c +shared_nm_platform_tests_test_nm_platform_OBJECTS = shared/nm-platform/tests/test_nm_platform-test-nm-platform.$(OBJEXT) +shared_nm_platform_tests_test_nm_platform_DEPENDENCIES = \ + shared/nm-platform/libnm-platform.la \ + shared/nm-log-core/libnm-log-core.la \ + shared/nm-glib-aux/libnm-glib-aux.la \ + shared/nm-std-aux/libnm-std-aux.la shared/libcsiphash.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +shared_nm_platform_tests_test_nm_platform_LINK = $(LIBTOOL) $(AM_V_lt) \ + --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(shared_nm_platform_tests_test_nm_platform_LDFLAGS) \ + $(LDFLAGS) -o $@ am_src_NetworkManager_OBJECTS = src/NetworkManager-main.$(OBJEXT) src_NetworkManager_OBJECTS = $(am_src_NetworkManager_OBJECTS) src_NetworkManager_DEPENDENCIES = src/libNetworkManager.la \ @@ -2146,13 +2194,17 @@ src_initrd_nm_initrd_generator_DEPENDENCIES = \ libnm-core/nm-keyfile/libnm-keyfile.la \ libnm-core/libnm-core.la $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-platform/libnm-platform.la \ + shared/nm-base/libnm-base.la \ + shared/nm-log-core/libnm-log-core.la \ shared/nm-udev-aux/libnm-udev-aux.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ shared/systemd/libnm-systemd-shared.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la shared/libndhcp4.la \ - shared/libcsiphash.la $(am__DEPENDENCIES_1) + shared/libcsiphash.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) src_initrd_nm_initrd_generator_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) \ @@ -2224,13 +2276,17 @@ src_nm_iface_helper_DEPENDENCIES = src/libNetworkManagerBase.la \ libnm-core/nm-keyfile/libnm-keyfile.la \ libnm-core/libnm-core.la $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-platform/libnm-platform.la \ + shared/nm-base/libnm-base.la \ + shared/nm-log-core/libnm-log-core.la \ shared/nm-udev-aux/libnm-udev-aux.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la src/libnm-systemd-core.la \ shared/systemd/libnm-systemd-shared.la shared/libnacd.la \ shared/libndhcp4.la shared/libcrbtree.la shared/libcsiphash.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) src_nm_iface_helper_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(src_nm_iface_helper_LDFLAGS) \ @@ -2731,7 +2787,6 @@ am__depfiles_remade = clients/$(DEPDIR)/nm_online-nm-online.Po \ libnm-core/nm-keyfile/$(DEPDIR)/libnm_keyfile_la-nm-keyfile.Plo \ libnm-core/nm-libnm-core-aux/$(DEPDIR)/libnm_libnm_core_aux_la-nm-libnm-core-aux.Plo \ libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-auth-subject.Plo \ - libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-ethtool-utils.Plo \ libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-libnm-core-utils.Plo \ libnm-core/tests/$(DEPDIR)/test_compare-test-compare.Po \ libnm-core/tests/$(DEPDIR)/test_crypto-test-crypto.Po \ @@ -2820,6 +2875,7 @@ am__depfiles_remade = clients/$(DEPDIR)/nm_online-nm-online.Po \ shared/n-dhcp4/src/$(DEPDIR)/libndhcp4_la-n-dhcp4-socket.Plo \ shared/n-dhcp4/src/util/$(DEPDIR)/libndhcp4_la-packet.Plo \ shared/n-dhcp4/src/util/$(DEPDIR)/libndhcp4_la-socket.Plo \ + shared/nm-base/$(DEPDIR)/libnm_base_la-nm-ethtool-base.Plo \ shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-dbus-aux.Plo \ shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-dedup-multi.Plo \ shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-enum-utils.Plo \ @@ -2836,6 +2892,11 @@ am__depfiles_remade = clients/$(DEPDIR)/nm_online-nm-online.Po \ shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-time-utils.Plo \ shared/nm-glib-aux/tests/$(DEPDIR)/test_json_aux-test-json-aux.Po \ shared/nm-glib-aux/tests/$(DEPDIR)/test_shared_general-test-shared-general.Po \ + shared/nm-log-core/$(DEPDIR)/libnm_log_core_la-nm-logging.Plo \ + shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-netlink.Plo \ + shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-platform-utils.Plo \ + shared/nm-platform/$(DEPDIR)/libnm_platform_la-nmp-netns.Plo \ + shared/nm-platform/tests/$(DEPDIR)/test_nm_platform-test-nm-platform.Po \ shared/nm-std-aux/$(DEPDIR)/libnm_std_aux_la-c-list-util.Plo \ shared/nm-std-aux/$(DEPDIR)/libnm_std_aux_la-nm-std-utils.Plo \ shared/nm-udev-aux/$(DEPDIR)/libnm_udev_aux_la-nm-udev-utils.Plo \ @@ -2893,7 +2954,6 @@ am__depfiles_remade = clients/$(DEPDIR)/nm_online-nm-online.Po \ src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3-config-data.Plo \ src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3-ipv4ll.Plo \ src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3cfg.Plo \ - src/$(DEPDIR)/libNetworkManagerBase_la-nm-logging.Plo \ src/$(DEPDIR)/libNetworkManagerBase_la-nm-netns.Plo \ src/$(DEPDIR)/libNetworkManager_la-nm-act-request.Plo \ src/$(DEPDIR)/libNetworkManager_la-nm-active-connection.Plo \ @@ -3014,10 +3074,7 @@ am__depfiles_remade = clients/$(DEPDIR)/nm_online-nm-online.Po \ src/ndisc/tests/$(DEPDIR)/test_ndisc_fake-test-ndisc-fake.Po \ src/ndisc/tests/$(DEPDIR)/test_ndisc_linux-test-ndisc-linux.Po \ src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-linux-platform.Plo \ - src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-netlink.Plo \ - src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform-utils.Plo \ src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform.Plo \ - src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-netns.Plo \ src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-object.Plo \ src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-rules-manager.Plo \ src/platform/$(DEPDIR)/libNetworkManagerTest_la-nm-fake-platform.Plo \ @@ -3166,7 +3223,10 @@ SOURCES = $(clients_tui_newt_libnmt_newt_a_SOURCES) \ $(shared_libcrbtree_la_SOURCES) \ $(shared_libcsiphash_la_SOURCES) $(shared_libnacd_la_SOURCES) \ $(shared_libndhcp4_la_SOURCES) \ + $(shared_nm_base_libnm_base_la_SOURCES) \ $(shared_nm_glib_aux_libnm_glib_aux_la_SOURCES) \ + $(shared_nm_log_core_libnm_log_core_la_SOURCES) \ + $(shared_nm_platform_libnm_platform_la_SOURCES) \ $(shared_nm_std_aux_libnm_std_aux_la_SOURCES) \ $(shared_nm_udev_aux_libnm_udev_aux_la_SOURCES) \ $(shared_systemd_libnm_systemd_logging_stub_la_SOURCES) \ @@ -3226,6 +3286,7 @@ SOURCES = $(clients_tui_newt_libnmt_newt_a_SOURCES) \ $(libnm_tests_test_secret_agent_SOURCES) \ shared/nm-glib-aux/tests/test-json-aux.c \ shared/nm-glib-aux/tests/test-shared-general.c \ + shared/nm-platform/tests/test-nm-platform.c \ $(src_NetworkManager_SOURCES) \ $(src_NetworkManager_all_sym_SOURCES) \ src/devices/bluetooth/tests/nm-bt-test.c \ @@ -3281,7 +3342,10 @@ DIST_SOURCES = $(am__clients_tui_newt_libnmt_newt_a_SOURCES_DIST) \ $(shared_libcsiphash_la_SOURCES) \ $(am__shared_libnacd_la_SOURCES_DIST) \ $(shared_libndhcp4_la_SOURCES) \ + $(shared_nm_base_libnm_base_la_SOURCES) \ $(shared_nm_glib_aux_libnm_glib_aux_la_SOURCES) \ + $(shared_nm_log_core_libnm_log_core_la_SOURCES) \ + $(shared_nm_platform_libnm_platform_la_SOURCES) \ $(shared_nm_std_aux_libnm_std_aux_la_SOURCES) \ $(shared_nm_udev_aux_libnm_udev_aux_la_SOURCES) \ $(shared_systemd_libnm_systemd_logging_stub_la_SOURCES) \ @@ -3338,6 +3402,7 @@ DIST_SOURCES = $(am__clients_tui_newt_libnmt_newt_a_SOURCES_DIST) \ $(libnm_tests_test_secret_agent_SOURCES) \ shared/nm-glib-aux/tests/test-json-aux.c \ shared/nm-glib-aux/tests/test-shared-general.c \ + shared/nm-platform/tests/test-nm-platform.c \ $(src_NetworkManager_SOURCES) \ $(src_NetworkManager_all_sym_SOURCES) \ src/devices/bluetooth/tests/nm-bt-test.c \ @@ -3996,11 +4061,20 @@ AUTOMAKE_OPTIONS = subdir-objects ############################################################################### ############################################################################### + +############################################################################### + +############################################################################### + +############################################################################### noinst_LTLIBRARIES = shared/libcsiphash.la shared/libcrbtree.la \ shared/libnacd.la shared/libndhcp4.la \ shared/nm-std-aux/libnm-std-aux.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-udev-aux/libnm-udev-aux.la \ + shared/nm-base/libnm-base.la \ + shared/nm-log-core/libnm-log-core.la \ + shared/nm-platform/libnm-platform.la \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ libnm-core/nm-keyfile/libnm-keyfile.la \ @@ -4077,10 +4151,11 @@ DISTCLEANFILES = config-extra.h intltool-extract intltool-merge \ # examples ############################################################################### EXTRA_DIST = shared/c-stdaux/src/c-stdaux.h $(NULL) \ + shared/nm-platform/tests/meson.build $(NULL) \ libnm-core/nm-libnm-core-intern/README.md \ libnm-core/nm-libnm-core-aux/README.md \ libnm/nm-libnm-aux/README.md \ - shared/nm-glib-aux/tests/meson.build $(NULL) \ + shared/nm-glib-aux/tests/meson.build shared/README.md $(NULL) \ $(dbusinterfaces_DATA) introspection/meson.build \ libnm-core/nm-crypto-gnutls.c libnm-core/nm-crypto-nss.c \ libnm-core/nm-core-enum-types.c.template \ @@ -4776,6 +4851,8 @@ man_pages_autogen = man/nm-settings-dbus.5 man/nm-settings-keyfile.5 \ ############################################################################### ############################################################################### + +############################################################################### # src/settings/plugins/keyfile/tests ############################################################################### @@ -4796,11 +4873,11 @@ man_pages_autogen = man/nm-settings-dbus.5 man/nm-settings-keyfile.5 \ ############################################################################### ############################################################################### -check_programs = shared/nm-glib-aux/tests/test-shared-general \ - $(am__append_5) libnm-core/tests/test-compare \ - libnm-core/tests/test-crypto libnm-core/tests/test-general \ - libnm-core/tests/test-keyfile libnm-core/tests/test-secrets \ - libnm-core/tests/test-setting \ +check_programs = shared/nm-platform/tests/test-nm-platform \ + shared/nm-glib-aux/tests/test-shared-general $(am__append_5) \ + libnm-core/tests/test-compare libnm-core/tests/test-crypto \ + libnm-core/tests/test-general libnm-core/tests/test-keyfile \ + libnm-core/tests/test-secrets libnm-core/tests/test-setting \ libnm-core/tests/test-settings-defaults libnm/tests/test-libnm \ $(am__append_15) src/initrd/tests/test-dt-reader \ src/initrd/tests/test-ibft-reader \ @@ -5158,6 +5235,101 @@ shared_nm_udev_aux_libnm_udev_aux_la_LIBADD = \ $(LIBUDEV_LIBS) \ $(NULL) +shared_nm_base_libnm_base_la_CPPFLAGS = \ + $(shared_nm_glib_aux_cppflags) \ + $(NULL) + +shared_nm_base_libnm_base_la_SOURCES = \ + shared/nm-base/nm-base.h \ + shared/nm-base/nm-ethtool-base.c \ + shared/nm-base/nm-ethtool-base.h \ + shared/nm-base/nm-ethtool-utils-base.h \ + $(NULL) + +shared_nm_base_libnm_base_la_LDFLAGS = \ + $(CODE_COVERAGE_LDFLAGS) \ + $(SANITIZER_LIB_LDFLAGS) \ + $(NULL) + +shared_nm_base_libnm_base_la_LIBADD = \ + $(GLIB_LIBS) \ + $(NULL) + +shared_nm_log_core_libnm_log_core_la_CPPFLAGS = \ + $(dflt_cppflags) \ + -I$(srcdir)/shared \ + $(CODE_COVERAGE_CFLAGS) \ + $(SANITIZER_LIB_CFLAGS) \ + $(GLIB_CFLAGS) \ + $(SYSTEMD_JOURNAL_CFLAGS) \ + -DG_LOG_DOMAIN=\""NetworkManager"\" \ + -DNETWORKMANAGER_COMPILATION='(NM_NETWORKMANAGER_COMPILATION_GLIB|NM_NETWORKMANAGER_COMPILATION_WITH_GLIB_I18N_LIB)' \ + $(NULL) + +shared_nm_log_core_libnm_log_core_la_SOURCES = \ + shared/nm-log-core/nm-logging.c \ + shared/nm-log-core/nm-logging.h \ + $(NULL) + +shared_nm_log_core_libnm_log_core_la_LDFLAGS = \ + $(CODE_COVERAGE_LDFLAGS) \ + $(SANITIZER_LIB_LDFLAGS) \ + $(NULL) + +shared_nm_log_core_libnm_log_core_la_LIBADD = \ + $(GLIB_LIBS) \ + $(SYSTEMD_JOURNAL_LIBS) \ + $(NULL) + +shared_nm_platform_libnm_platform_la_CPPFLAGS = \ + $(shared_nm_glib_aux_cppflags) \ + $(NULL) + +shared_nm_platform_libnm_platform_la_SOURCES = \ + shared/nm-platform/nm-netlink.c \ + shared/nm-platform/nm-netlink.h \ + shared/nm-platform/nm-platform-utils.c \ + shared/nm-platform/nm-platform-utils.h \ + shared/nm-platform/nmp-base.h \ + shared/nm-platform/nmp-netns.c \ + shared/nm-platform/nmp-netns.h \ + $(NULL) + +shared_nm_platform_libnm_platform_la_LDFLAGS = \ + $(CODE_COVERAGE_LDFLAGS) \ + $(SANITIZER_LIB_LDFLAGS) \ + $(NULL) + +shared_nm_platform_libnm_platform_la_LIBADD = \ + $(GLIB_LIBS) \ + $(NULL) + +shared_nm_platform_tests_test_nm_platform_CPPFLAGS = \ + $(dflt_cppflags) \ + -I$(srcdir)/shared \ + -DNETWORKMANAGER_COMPILATION_TEST \ + -DNETWORKMANAGER_COMPILATION='(NM_NETWORKMANAGER_COMPILATION_GLIB|NM_NETWORKMANAGER_COMPILATION_WITH_GLIB_I18N_PROG)' \ + $(CODE_COVERAGE_CFLAGS) \ + $(SYSTEMD_JOURNAL_CFLAGS) \ + $(GLIB_CFLAGS) \ + $(SANITIZER_LIB_CFLAGS) \ + $(NULL) + +shared_nm_platform_tests_test_nm_platform_LDFLAGS = \ + $(CODE_COVERAGE_LDFLAGS) \ + $(SANITIZER_EXEC_LDFLAGS) \ + $(NULL) + +shared_nm_platform_tests_test_nm_platform_LDADD = \ + shared/nm-platform/libnm-platform.la \ + shared/nm-log-core/libnm-log-core.la \ + shared/nm-glib-aux/libnm-glib-aux.la \ + shared/nm-std-aux/libnm-std-aux.la \ + shared/libcsiphash.la \ + $(SYSTEMD_JOURNAL_LIBS) \ + $(GLIB_LIBS) \ + $(NULL) + libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_CPPFLAGS = \ $(dflt_cppflags) \ -I$(srcdir)/shared \ @@ -5175,8 +5347,6 @@ libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_SOURCES = \ libnm-core/nm-libnm-core-intern/nm-auth-subject.c \ libnm-core/nm-libnm-core-intern/nm-auth-subject.h \ libnm-core/nm-libnm-core-intern/nm-common-macros.h \ - libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c \ - libnm-core/nm-libnm-core-intern/nm-ethtool-utils.h \ libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c \ libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.h \ $(NULL) @@ -5798,6 +5968,7 @@ libnm_core_tests_ldadd = \ libnm-core/libnm-core.la \ $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ shared/systemd/libnm-systemd-shared.la \ shared/systemd/libnm-systemd-logging-stub.la \ shared/nm-glib-aux/libnm-glib-aux.la \ @@ -5865,6 +6036,7 @@ libnm_lib_h_pub_real = \ libnm/nm-device-wpan.h \ libnm/nm-device.h \ libnm/nm-dhcp-config.h \ + libnm/nm-ethtool-utils.h \ libnm/nm-ip-config.h \ libnm/nm-object.h \ libnm/nm-remote-connection.h \ @@ -5980,6 +6152,7 @@ libnm_liblibnm_la_LIBADD = \ libnm-core/libnm-core.la \ $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ introspection/libnmdbus.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/systemd/libnm-systemd-shared.la \ @@ -6436,13 +6609,9 @@ src_libNetworkManagerBase_la_CPPFLAGS = \ $(src_cppflags) src_libNetworkManagerBase_la_SOURCES = src/nm-core-utils.c \ - src/nm-core-utils.h src/nm-logging.c src/nm-logging.h \ - src/NetworkManagerUtils.c src/NetworkManagerUtils.h \ - src/platform/nm-netlink.c src/platform/nm-netlink.h \ - src/platform/nmp-netns.c src/platform/nmp-netns.h \ - src/platform/nmp-object.c src/platform/nmp-object.h \ - src/platform/nm-platform-utils.c \ - src/platform/nm-platform-utils.h src/platform/nm-platform.c \ + src/nm-core-utils.h src/NetworkManagerUtils.c \ + src/NetworkManagerUtils.h src/platform/nmp-object.c \ + src/platform/nmp-object.h src/platform/nm-platform.c \ src/platform/nm-platform.h src/platform/nm-platform-private.h \ src/platform/nm-linux-platform.c \ src/platform/nm-linux-platform.h \ @@ -6472,7 +6641,6 @@ src_libNetworkManagerBase_la_SOURCES = src/nm-core-utils.c \ src/main-utils.c src/main-utils.h $(NULL) $(am__append_18) src_libNetworkManagerBase_la_LIBADD = \ $(GLIB_LIBS) \ - $(SYSTEMD_JOURNAL_LIBS) \ $(LIBUDEV_LIBS) \ $(NULL) @@ -6663,6 +6831,9 @@ src_libNetworkManager_la_LIBADD = \ libnm-core/libnm-core.la \ $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-platform/libnm-platform.la \ + shared/nm-base/libnm-base.la \ + shared/nm-log-core/libnm-log-core.la \ shared/nm-udev-aux/libnm-udev-aux.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ @@ -6675,6 +6846,7 @@ src_libNetworkManager_la_LIBADD = \ $(GLIB_LIBS) \ $(LIBUDEV_LIBS) \ $(SYSTEMD_LOGIN_LIBS) \ + $(SYSTEMD_JOURNAL_LIBS) \ $(LIBNDP_LIBS) \ $(DL_LIBS) \ $(SELINUX_LIBS) \ @@ -6747,6 +6919,9 @@ src_nm_iface_helper_LDADD = \ libnm-core/libnm-core.la \ $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-platform/libnm-platform.la \ + shared/nm-base/libnm-base.la \ + shared/nm-log-core/libnm-log-core.la \ shared/nm-udev-aux/libnm-udev-aux.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ @@ -6756,6 +6931,7 @@ src_nm_iface_helper_LDADD = \ shared/libndhcp4.la \ shared/libcrbtree.la \ shared/libcsiphash.la \ + $(SYSTEMD_JOURNAL_LIBS) \ $(GLIB_LIBS) \ $(LIBUDEV_LIBS) \ $(LIBNDP_LIBS) \ @@ -6790,6 +6966,9 @@ src_initrd_nm_initrd_generator_LDADD = \ libnm-core/libnm-core.la \ $(libnm_crypto_lib) \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-platform/libnm-platform.la \ + shared/nm-base/libnm-base.la \ + shared/nm-log-core/libnm-log-core.la \ shared/nm-udev-aux/libnm-udev-aux.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ @@ -6798,6 +6977,7 @@ src_initrd_nm_initrd_generator_LDADD = \ shared/nm-std-aux/libnm-std-aux.la \ shared/libndhcp4.la \ shared/libcsiphash.la \ + $(SYSTEMD_JOURNAL_LIBS) \ $(GLIB_LIBS) \ $(NULL) @@ -7644,6 +7824,7 @@ clients_common_tests_test_clients_common_LDADD = \ clients/common/libnmc-base.la \ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ shared/libcsiphash.la \ @@ -7709,6 +7890,7 @@ clients_common_tests_test_libnm_core_aux_LDADD = \ @BUILD_NMCLI_TRUE@ clients/common/libnmc-base.la \ @BUILD_NMCLI_TRUE@ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ @BUILD_NMCLI_TRUE@ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ +@BUILD_NMCLI_TRUE@ shared/nm-base/libnm-base.la \ @BUILD_NMCLI_TRUE@ shared/nm-glib-aux/libnm-glib-aux.la \ @BUILD_NMCLI_TRUE@ shared/nm-std-aux/libnm-std-aux.la \ @BUILD_NMCLI_TRUE@ shared/libcsiphash.la \ @@ -7737,6 +7919,7 @@ clients_cli_generate_docs_nm_settings_nmcli_LDADD = \ libnm/nm-libnm-aux/libnm-libnm-aux.la \ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ libnm/libnm.la \ shared/nm-glib-aux/libnm-glib-aux.la \ shared/nm-std-aux/libnm-std-aux.la \ @@ -7903,6 +8086,7 @@ clients_cli_generate_docs_nm_settings_nmcli_LDFLAGS = \ @BUILD_NMTUI_TRUE@ libnm/nm-libnm-aux/libnm-libnm-aux.la \ @BUILD_NMTUI_TRUE@ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ @BUILD_NMTUI_TRUE@ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ +@BUILD_NMTUI_TRUE@ shared/nm-base/libnm-base.la \ @BUILD_NMTUI_TRUE@ shared/nm-glib-aux/libnm-glib-aux.la \ @BUILD_NMTUI_TRUE@ shared/nm-std-aux/libnm-std-aux.la \ @BUILD_NMTUI_TRUE@ shared/libcsiphash.la \ @@ -7943,6 +8127,7 @@ clients_cli_generate_docs_nm_settings_nmcli_LDFLAGS = \ @BUILD_NM_CLOUD_SETUP_TRUE@ libnm/nm-libnm-aux/libnm-libnm-aux.la \ @BUILD_NM_CLOUD_SETUP_TRUE@ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ @BUILD_NM_CLOUD_SETUP_TRUE@ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ +@BUILD_NM_CLOUD_SETUP_TRUE@ shared/nm-base/libnm-base.la \ @BUILD_NM_CLOUD_SETUP_TRUE@ shared/nm-glib-aux/libnm-glib-aux.la \ @BUILD_NM_CLOUD_SETUP_TRUE@ shared/nm-std-aux/libnm-std-aux.la \ @BUILD_NM_CLOUD_SETUP_TRUE@ shared/libcsiphash.la \ @@ -8944,9 +9129,6 @@ libnm-core/nm-libnm-core-intern/$(DEPDIR)/$(am__dirstamp): libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-auth-subject.lo: \ libnm-core/nm-libnm-core-intern/$(am__dirstamp) \ libnm-core/nm-libnm-core-intern/$(DEPDIR)/$(am__dirstamp) -libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-ethtool-utils.lo: \ - libnm-core/nm-libnm-core-intern/$(am__dirstamp) \ - libnm-core/nm-libnm-core-intern/$(DEPDIR)/$(am__dirstamp) libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-libnm-core-utils.lo: \ libnm-core/nm-libnm-core-intern/$(am__dirstamp) \ libnm-core/nm-libnm-core-intern/$(DEPDIR)/$(am__dirstamp) @@ -9194,6 +9376,18 @@ shared/n-dhcp4/src/util/libndhcp4_la-socket.lo: \ shared/libndhcp4.la: $(shared_libndhcp4_la_OBJECTS) $(shared_libndhcp4_la_DEPENDENCIES) $(EXTRA_shared_libndhcp4_la_DEPENDENCIES) shared/$(am__dirstamp) $(AM_V_CCLD)$(shared_libndhcp4_la_LINK) $(shared_libndhcp4_la_OBJECTS) $(shared_libndhcp4_la_LIBADD) $(LIBS) +shared/nm-base/$(am__dirstamp): + @$(MKDIR_P) shared/nm-base + @: > shared/nm-base/$(am__dirstamp) +shared/nm-base/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) shared/nm-base/$(DEPDIR) + @: > shared/nm-base/$(DEPDIR)/$(am__dirstamp) +shared/nm-base/libnm_base_la-nm-ethtool-base.lo: \ + shared/nm-base/$(am__dirstamp) \ + shared/nm-base/$(DEPDIR)/$(am__dirstamp) + +shared/nm-base/libnm-base.la: $(shared_nm_base_libnm_base_la_OBJECTS) $(shared_nm_base_libnm_base_la_DEPENDENCIES) $(EXTRA_shared_nm_base_libnm_base_la_DEPENDENCIES) shared/nm-base/$(am__dirstamp) + $(AM_V_CCLD)$(shared_nm_base_libnm_base_la_LINK) $(shared_nm_base_libnm_base_la_OBJECTS) $(shared_nm_base_libnm_base_la_LIBADD) $(LIBS) shared/nm-glib-aux/$(am__dirstamp): @$(MKDIR_P) shared/nm-glib-aux @: > shared/nm-glib-aux/$(am__dirstamp) @@ -9245,6 +9439,36 @@ shared/nm-glib-aux/libnm_glib_aux_la-nm-time-utils.lo: \ shared/nm-glib-aux/libnm-glib-aux.la: $(shared_nm_glib_aux_libnm_glib_aux_la_OBJECTS) $(shared_nm_glib_aux_libnm_glib_aux_la_DEPENDENCIES) $(EXTRA_shared_nm_glib_aux_libnm_glib_aux_la_DEPENDENCIES) shared/nm-glib-aux/$(am__dirstamp) $(AM_V_CCLD)$(shared_nm_glib_aux_libnm_glib_aux_la_LINK) $(shared_nm_glib_aux_libnm_glib_aux_la_OBJECTS) $(shared_nm_glib_aux_libnm_glib_aux_la_LIBADD) $(LIBS) +shared/nm-log-core/$(am__dirstamp): + @$(MKDIR_P) shared/nm-log-core + @: > shared/nm-log-core/$(am__dirstamp) +shared/nm-log-core/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) shared/nm-log-core/$(DEPDIR) + @: > shared/nm-log-core/$(DEPDIR)/$(am__dirstamp) +shared/nm-log-core/libnm_log_core_la-nm-logging.lo: \ + shared/nm-log-core/$(am__dirstamp) \ + shared/nm-log-core/$(DEPDIR)/$(am__dirstamp) + +shared/nm-log-core/libnm-log-core.la: $(shared_nm_log_core_libnm_log_core_la_OBJECTS) $(shared_nm_log_core_libnm_log_core_la_DEPENDENCIES) $(EXTRA_shared_nm_log_core_libnm_log_core_la_DEPENDENCIES) shared/nm-log-core/$(am__dirstamp) + $(AM_V_CCLD)$(shared_nm_log_core_libnm_log_core_la_LINK) $(shared_nm_log_core_libnm_log_core_la_OBJECTS) $(shared_nm_log_core_libnm_log_core_la_LIBADD) $(LIBS) +shared/nm-platform/$(am__dirstamp): + @$(MKDIR_P) shared/nm-platform + @: > shared/nm-platform/$(am__dirstamp) +shared/nm-platform/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) shared/nm-platform/$(DEPDIR) + @: > shared/nm-platform/$(DEPDIR)/$(am__dirstamp) +shared/nm-platform/libnm_platform_la-nm-netlink.lo: \ + shared/nm-platform/$(am__dirstamp) \ + shared/nm-platform/$(DEPDIR)/$(am__dirstamp) +shared/nm-platform/libnm_platform_la-nm-platform-utils.lo: \ + shared/nm-platform/$(am__dirstamp) \ + shared/nm-platform/$(DEPDIR)/$(am__dirstamp) +shared/nm-platform/libnm_platform_la-nmp-netns.lo: \ + shared/nm-platform/$(am__dirstamp) \ + shared/nm-platform/$(DEPDIR)/$(am__dirstamp) + +shared/nm-platform/libnm-platform.la: $(shared_nm_platform_libnm_platform_la_OBJECTS) $(shared_nm_platform_libnm_platform_la_DEPENDENCIES) $(EXTRA_shared_nm_platform_libnm_platform_la_DEPENDENCIES) shared/nm-platform/$(am__dirstamp) + $(AM_V_CCLD)$(shared_nm_platform_libnm_platform_la_LINK) $(shared_nm_platform_libnm_platform_la_OBJECTS) $(shared_nm_platform_libnm_platform_la_LIBADD) $(LIBS) shared/nm-std-aux/$(am__dirstamp): @$(MKDIR_P) shared/nm-std-aux @: > shared/nm-std-aux/$(am__dirstamp) @@ -9846,8 +10070,6 @@ src/libNetworkManager.la: $(src_libNetworkManager_la_OBJECTS) $(src_libNetworkMa $(AM_V_CCLD)$(LINK) $(src_libNetworkManager_la_OBJECTS) $(src_libNetworkManager_la_LIBADD) $(LIBS) src/libNetworkManagerBase_la-nm-core-utils.lo: src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) -src/libNetworkManagerBase_la-nm-logging.lo: src/$(am__dirstamp) \ - src/$(DEPDIR)/$(am__dirstamp) src/libNetworkManagerBase_la-NetworkManagerUtils.lo: \ src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/platform/$(am__dirstamp): @@ -9856,18 +10078,9 @@ src/platform/$(am__dirstamp): src/platform/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/platform/$(DEPDIR) @: > src/platform/$(DEPDIR)/$(am__dirstamp) -src/platform/libNetworkManagerBase_la-nm-netlink.lo: \ - src/platform/$(am__dirstamp) \ - src/platform/$(DEPDIR)/$(am__dirstamp) -src/platform/libNetworkManagerBase_la-nmp-netns.lo: \ - src/platform/$(am__dirstamp) \ - src/platform/$(DEPDIR)/$(am__dirstamp) src/platform/libNetworkManagerBase_la-nmp-object.lo: \ src/platform/$(am__dirstamp) \ src/platform/$(DEPDIR)/$(am__dirstamp) -src/platform/libNetworkManagerBase_la-nm-platform-utils.lo: \ - src/platform/$(am__dirstamp) \ - src/platform/$(DEPDIR)/$(am__dirstamp) src/platform/libNetworkManagerBase_la-nm-platform.lo: \ src/platform/$(am__dirstamp) \ src/platform/$(DEPDIR)/$(am__dirstamp) @@ -10594,6 +10807,19 @@ shared/nm-glib-aux/tests/test_shared_general-test-shared-general.$(OBJEXT): \ shared/nm-glib-aux/tests/test-shared-general$(EXEEXT): $(shared_nm_glib_aux_tests_test_shared_general_OBJECTS) $(shared_nm_glib_aux_tests_test_shared_general_DEPENDENCIES) $(EXTRA_shared_nm_glib_aux_tests_test_shared_general_DEPENDENCIES) shared/nm-glib-aux/tests/$(am__dirstamp) @rm -f shared/nm-glib-aux/tests/test-shared-general$(EXEEXT) $(AM_V_CCLD)$(shared_nm_glib_aux_tests_test_shared_general_LINK) $(shared_nm_glib_aux_tests_test_shared_general_OBJECTS) $(shared_nm_glib_aux_tests_test_shared_general_LDADD) $(LIBS) +shared/nm-platform/tests/$(am__dirstamp): + @$(MKDIR_P) shared/nm-platform/tests + @: > shared/nm-platform/tests/$(am__dirstamp) +shared/nm-platform/tests/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) shared/nm-platform/tests/$(DEPDIR) + @: > shared/nm-platform/tests/$(DEPDIR)/$(am__dirstamp) +shared/nm-platform/tests/test_nm_platform-test-nm-platform.$(OBJEXT): \ + shared/nm-platform/tests/$(am__dirstamp) \ + shared/nm-platform/tests/$(DEPDIR)/$(am__dirstamp) + +shared/nm-platform/tests/test-nm-platform$(EXEEXT): $(shared_nm_platform_tests_test_nm_platform_OBJECTS) $(shared_nm_platform_tests_test_nm_platform_DEPENDENCIES) $(EXTRA_shared_nm_platform_tests_test_nm_platform_DEPENDENCIES) shared/nm-platform/tests/$(am__dirstamp) + @rm -f shared/nm-platform/tests/test-nm-platform$(EXEEXT) + $(AM_V_CCLD)$(shared_nm_platform_tests_test_nm_platform_LINK) $(shared_nm_platform_tests_test_nm_platform_OBJECTS) $(shared_nm_platform_tests_test_nm_platform_LDADD) $(LIBS) src/NetworkManager-main.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) @@ -11067,9 +11293,16 @@ mostlyclean-compile: -rm -f shared/n-dhcp4/src/*.lo -rm -f shared/n-dhcp4/src/util/*.$(OBJEXT) -rm -f shared/n-dhcp4/src/util/*.lo + -rm -f shared/nm-base/*.$(OBJEXT) + -rm -f shared/nm-base/*.lo -rm -f shared/nm-glib-aux/*.$(OBJEXT) -rm -f shared/nm-glib-aux/*.lo -rm -f shared/nm-glib-aux/tests/*.$(OBJEXT) + -rm -f shared/nm-log-core/*.$(OBJEXT) + -rm -f shared/nm-log-core/*.lo + -rm -f shared/nm-platform/*.$(OBJEXT) + -rm -f shared/nm-platform/*.lo + -rm -f shared/nm-platform/tests/*.$(OBJEXT) -rm -f shared/nm-std-aux/*.$(OBJEXT) -rm -f shared/nm-std-aux/*.lo -rm -f shared/nm-udev-aux/*.$(OBJEXT) @@ -11378,7 +11611,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@libnm-core/nm-keyfile/$(DEPDIR)/libnm_keyfile_la-nm-keyfile.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libnm-core/nm-libnm-core-aux/$(DEPDIR)/libnm_libnm_core_aux_la-nm-libnm-core-aux.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-auth-subject.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-ethtool-utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-libnm-core-utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libnm-core/tests/$(DEPDIR)/test_compare-test-compare.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libnm-core/tests/$(DEPDIR)/test_crypto-test-crypto.Po@am__quote@ # am--include-marker @@ -11467,6 +11699,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@shared/n-dhcp4/src/$(DEPDIR)/libndhcp4_la-n-dhcp4-socket.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@shared/n-dhcp4/src/util/$(DEPDIR)/libndhcp4_la-packet.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@shared/n-dhcp4/src/util/$(DEPDIR)/libndhcp4_la-socket.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@shared/nm-base/$(DEPDIR)/libnm_base_la-nm-ethtool-base.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-dbus-aux.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-dedup-multi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-enum-utils.Plo@am__quote@ # am--include-marker @@ -11483,6 +11716,11 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-time-utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@shared/nm-glib-aux/tests/$(DEPDIR)/test_json_aux-test-json-aux.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@shared/nm-glib-aux/tests/$(DEPDIR)/test_shared_general-test-shared-general.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@shared/nm-log-core/$(DEPDIR)/libnm_log_core_la-nm-logging.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-netlink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-platform-utils.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@shared/nm-platform/$(DEPDIR)/libnm_platform_la-nmp-netns.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@shared/nm-platform/tests/$(DEPDIR)/test_nm_platform-test-nm-platform.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@shared/nm-std-aux/$(DEPDIR)/libnm_std_aux_la-c-list-util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@shared/nm-std-aux/$(DEPDIR)/libnm_std_aux_la-nm-std-utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@shared/nm-udev-aux/$(DEPDIR)/libnm_udev_aux_la-nm-udev-utils.Plo@am__quote@ # am--include-marker @@ -11540,7 +11778,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3-config-data.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3-ipv4ll.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3cfg.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libNetworkManagerBase_la-nm-logging.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libNetworkManagerBase_la-nm-netns.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libNetworkManager_la-nm-act-request.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libNetworkManager_la-nm-active-connection.Plo@am__quote@ # am--include-marker @@ -11661,10 +11898,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@src/ndisc/tests/$(DEPDIR)/test_ndisc_fake-test-ndisc-fake.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/ndisc/tests/$(DEPDIR)/test_ndisc_linux-test-ndisc-linux.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-linux-platform.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-netlink.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform-utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-netns.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-object.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-rules-manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/platform/$(DEPDIR)/libNetworkManagerTest_la-nm-fake-platform.Plo@am__quote@ # am--include-marker @@ -12957,13 +13191,6 @@ libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-auth-subject.lo: l @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-auth-subject.lo `test -f 'libnm-core/nm-libnm-core-intern/nm-auth-subject.c' || echo '$(srcdir)/'`libnm-core/nm-libnm-core-intern/nm-auth-subject.c -libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-ethtool-utils.lo: libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-ethtool-utils.lo -MD -MP -MF libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-ethtool-utils.Tpo -c -o libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-ethtool-utils.lo `test -f 'libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c' || echo '$(srcdir)/'`libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-ethtool-utils.Tpo libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-ethtool-utils.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c' object='libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-ethtool-utils.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-ethtool-utils.lo `test -f 'libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c' || echo '$(srcdir)/'`libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c - libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-libnm-core-utils.lo: libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libnm_core_nm_libnm_core_intern_libnm_libnm_core_intern_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-libnm-core-utils.lo -MD -MP -MF libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-libnm-core-utils.Tpo -c -o libnm-core/nm-libnm-core-intern/libnm_libnm_core_intern_la-nm-libnm-core-utils.lo `test -f 'libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c' || echo '$(srcdir)/'`libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-libnm-core-utils.Tpo libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-libnm-core-utils.Plo @@ -13468,6 +13695,13 @@ shared/n-dhcp4/src/util/libndhcp4_la-socket.lo: shared/n-dhcp4/src/util/socket.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_libndhcp4_la_CPPFLAGS) $(CPPFLAGS) $(shared_libndhcp4_la_CFLAGS) $(CFLAGS) -c -o shared/n-dhcp4/src/util/libndhcp4_la-socket.lo `test -f 'shared/n-dhcp4/src/util/socket.c' || echo '$(srcdir)/'`shared/n-dhcp4/src/util/socket.c +shared/nm-base/libnm_base_la-nm-ethtool-base.lo: shared/nm-base/nm-ethtool-base.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_base_libnm_base_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shared/nm-base/libnm_base_la-nm-ethtool-base.lo -MD -MP -MF shared/nm-base/$(DEPDIR)/libnm_base_la-nm-ethtool-base.Tpo -c -o shared/nm-base/libnm_base_la-nm-ethtool-base.lo `test -f 'shared/nm-base/nm-ethtool-base.c' || echo '$(srcdir)/'`shared/nm-base/nm-ethtool-base.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) shared/nm-base/$(DEPDIR)/libnm_base_la-nm-ethtool-base.Tpo shared/nm-base/$(DEPDIR)/libnm_base_la-nm-ethtool-base.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shared/nm-base/nm-ethtool-base.c' object='shared/nm-base/libnm_base_la-nm-ethtool-base.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_base_libnm_base_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shared/nm-base/libnm_base_la-nm-ethtool-base.lo `test -f 'shared/nm-base/nm-ethtool-base.c' || echo '$(srcdir)/'`shared/nm-base/nm-ethtool-base.c + shared/nm-glib-aux/libnm_glib_aux_la-nm-dbus-aux.lo: shared/nm-glib-aux/nm-dbus-aux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_glib_aux_libnm_glib_aux_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shared/nm-glib-aux/libnm_glib_aux_la-nm-dbus-aux.lo -MD -MP -MF shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-dbus-aux.Tpo -c -o shared/nm-glib-aux/libnm_glib_aux_la-nm-dbus-aux.lo `test -f 'shared/nm-glib-aux/nm-dbus-aux.c' || echo '$(srcdir)/'`shared/nm-glib-aux/nm-dbus-aux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-dbus-aux.Tpo shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-dbus-aux.Plo @@ -13566,6 +13800,34 @@ shared/nm-glib-aux/libnm_glib_aux_la-nm-time-utils.lo: shared/nm-glib-aux/nm-tim @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_glib_aux_libnm_glib_aux_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shared/nm-glib-aux/libnm_glib_aux_la-nm-time-utils.lo `test -f 'shared/nm-glib-aux/nm-time-utils.c' || echo '$(srcdir)/'`shared/nm-glib-aux/nm-time-utils.c +shared/nm-log-core/libnm_log_core_la-nm-logging.lo: shared/nm-log-core/nm-logging.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_log_core_libnm_log_core_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shared/nm-log-core/libnm_log_core_la-nm-logging.lo -MD -MP -MF shared/nm-log-core/$(DEPDIR)/libnm_log_core_la-nm-logging.Tpo -c -o shared/nm-log-core/libnm_log_core_la-nm-logging.lo `test -f 'shared/nm-log-core/nm-logging.c' || echo '$(srcdir)/'`shared/nm-log-core/nm-logging.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) shared/nm-log-core/$(DEPDIR)/libnm_log_core_la-nm-logging.Tpo shared/nm-log-core/$(DEPDIR)/libnm_log_core_la-nm-logging.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shared/nm-log-core/nm-logging.c' object='shared/nm-log-core/libnm_log_core_la-nm-logging.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_log_core_libnm_log_core_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shared/nm-log-core/libnm_log_core_la-nm-logging.lo `test -f 'shared/nm-log-core/nm-logging.c' || echo '$(srcdir)/'`shared/nm-log-core/nm-logging.c + +shared/nm-platform/libnm_platform_la-nm-netlink.lo: shared/nm-platform/nm-netlink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_platform_libnm_platform_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shared/nm-platform/libnm_platform_la-nm-netlink.lo -MD -MP -MF shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-netlink.Tpo -c -o shared/nm-platform/libnm_platform_la-nm-netlink.lo `test -f 'shared/nm-platform/nm-netlink.c' || echo '$(srcdir)/'`shared/nm-platform/nm-netlink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-netlink.Tpo shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-netlink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shared/nm-platform/nm-netlink.c' object='shared/nm-platform/libnm_platform_la-nm-netlink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_platform_libnm_platform_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shared/nm-platform/libnm_platform_la-nm-netlink.lo `test -f 'shared/nm-platform/nm-netlink.c' || echo '$(srcdir)/'`shared/nm-platform/nm-netlink.c + +shared/nm-platform/libnm_platform_la-nm-platform-utils.lo: shared/nm-platform/nm-platform-utils.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_platform_libnm_platform_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shared/nm-platform/libnm_platform_la-nm-platform-utils.lo -MD -MP -MF shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-platform-utils.Tpo -c -o shared/nm-platform/libnm_platform_la-nm-platform-utils.lo `test -f 'shared/nm-platform/nm-platform-utils.c' || echo '$(srcdir)/'`shared/nm-platform/nm-platform-utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-platform-utils.Tpo shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-platform-utils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shared/nm-platform/nm-platform-utils.c' object='shared/nm-platform/libnm_platform_la-nm-platform-utils.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_platform_libnm_platform_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shared/nm-platform/libnm_platform_la-nm-platform-utils.lo `test -f 'shared/nm-platform/nm-platform-utils.c' || echo '$(srcdir)/'`shared/nm-platform/nm-platform-utils.c + +shared/nm-platform/libnm_platform_la-nmp-netns.lo: shared/nm-platform/nmp-netns.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_platform_libnm_platform_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shared/nm-platform/libnm_platform_la-nmp-netns.lo -MD -MP -MF shared/nm-platform/$(DEPDIR)/libnm_platform_la-nmp-netns.Tpo -c -o shared/nm-platform/libnm_platform_la-nmp-netns.lo `test -f 'shared/nm-platform/nmp-netns.c' || echo '$(srcdir)/'`shared/nm-platform/nmp-netns.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) shared/nm-platform/$(DEPDIR)/libnm_platform_la-nmp-netns.Tpo shared/nm-platform/$(DEPDIR)/libnm_platform_la-nmp-netns.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shared/nm-platform/nmp-netns.c' object='shared/nm-platform/libnm_platform_la-nmp-netns.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_platform_libnm_platform_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shared/nm-platform/libnm_platform_la-nmp-netns.lo `test -f 'shared/nm-platform/nmp-netns.c' || echo '$(srcdir)/'`shared/nm-platform/nmp-netns.c + shared/nm-std-aux/libnm_std_aux_la-c-list-util.lo: shared/nm-std-aux/c-list-util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_std_aux_libnm_std_aux_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shared/nm-std-aux/libnm_std_aux_la-c-list-util.lo -MD -MP -MF shared/nm-std-aux/$(DEPDIR)/libnm_std_aux_la-c-list-util.Tpo -c -o shared/nm-std-aux/libnm_std_aux_la-c-list-util.lo `test -f 'shared/nm-std-aux/c-list-util.c' || echo '$(srcdir)/'`shared/nm-std-aux/c-list-util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) shared/nm-std-aux/$(DEPDIR)/libnm_std_aux_la-c-list-util.Tpo shared/nm-std-aux/$(DEPDIR)/libnm_std_aux_la-c-list-util.Plo @@ -14644,13 +14906,6 @@ src/libNetworkManagerBase_la-nm-core-utils.lo: src/nm-core-utils.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libNetworkManagerBase_la-nm-core-utils.lo `test -f 'src/nm-core-utils.c' || echo '$(srcdir)/'`src/nm-core-utils.c -src/libNetworkManagerBase_la-nm-logging.lo: src/nm-logging.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libNetworkManagerBase_la-nm-logging.lo -MD -MP -MF src/$(DEPDIR)/libNetworkManagerBase_la-nm-logging.Tpo -c -o src/libNetworkManagerBase_la-nm-logging.lo `test -f 'src/nm-logging.c' || echo '$(srcdir)/'`src/nm-logging.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libNetworkManagerBase_la-nm-logging.Tpo src/$(DEPDIR)/libNetworkManagerBase_la-nm-logging.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/nm-logging.c' object='src/libNetworkManagerBase_la-nm-logging.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libNetworkManagerBase_la-nm-logging.lo `test -f 'src/nm-logging.c' || echo '$(srcdir)/'`src/nm-logging.c - src/libNetworkManagerBase_la-NetworkManagerUtils.lo: src/NetworkManagerUtils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libNetworkManagerBase_la-NetworkManagerUtils.lo -MD -MP -MF src/$(DEPDIR)/libNetworkManagerBase_la-NetworkManagerUtils.Tpo -c -o src/libNetworkManagerBase_la-NetworkManagerUtils.lo `test -f 'src/NetworkManagerUtils.c' || echo '$(srcdir)/'`src/NetworkManagerUtils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libNetworkManagerBase_la-NetworkManagerUtils.Tpo src/$(DEPDIR)/libNetworkManagerBase_la-NetworkManagerUtils.Plo @@ -14658,20 +14913,6 @@ src/libNetworkManagerBase_la-NetworkManagerUtils.lo: src/NetworkManagerUtils.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libNetworkManagerBase_la-NetworkManagerUtils.lo `test -f 'src/NetworkManagerUtils.c' || echo '$(srcdir)/'`src/NetworkManagerUtils.c -src/platform/libNetworkManagerBase_la-nm-netlink.lo: src/platform/nm-netlink.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/platform/libNetworkManagerBase_la-nm-netlink.lo -MD -MP -MF src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-netlink.Tpo -c -o src/platform/libNetworkManagerBase_la-nm-netlink.lo `test -f 'src/platform/nm-netlink.c' || echo '$(srcdir)/'`src/platform/nm-netlink.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-netlink.Tpo src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-netlink.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/platform/nm-netlink.c' object='src/platform/libNetworkManagerBase_la-nm-netlink.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/platform/libNetworkManagerBase_la-nm-netlink.lo `test -f 'src/platform/nm-netlink.c' || echo '$(srcdir)/'`src/platform/nm-netlink.c - -src/platform/libNetworkManagerBase_la-nmp-netns.lo: src/platform/nmp-netns.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/platform/libNetworkManagerBase_la-nmp-netns.lo -MD -MP -MF src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-netns.Tpo -c -o src/platform/libNetworkManagerBase_la-nmp-netns.lo `test -f 'src/platform/nmp-netns.c' || echo '$(srcdir)/'`src/platform/nmp-netns.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-netns.Tpo src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-netns.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/platform/nmp-netns.c' object='src/platform/libNetworkManagerBase_la-nmp-netns.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/platform/libNetworkManagerBase_la-nmp-netns.lo `test -f 'src/platform/nmp-netns.c' || echo '$(srcdir)/'`src/platform/nmp-netns.c - src/platform/libNetworkManagerBase_la-nmp-object.lo: src/platform/nmp-object.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/platform/libNetworkManagerBase_la-nmp-object.lo -MD -MP -MF src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-object.Tpo -c -o src/platform/libNetworkManagerBase_la-nmp-object.lo `test -f 'src/platform/nmp-object.c' || echo '$(srcdir)/'`src/platform/nmp-object.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-object.Tpo src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-object.Plo @@ -14679,13 +14920,6 @@ src/platform/libNetworkManagerBase_la-nmp-object.lo: src/platform/nmp-object.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/platform/libNetworkManagerBase_la-nmp-object.lo `test -f 'src/platform/nmp-object.c' || echo '$(srcdir)/'`src/platform/nmp-object.c -src/platform/libNetworkManagerBase_la-nm-platform-utils.lo: src/platform/nm-platform-utils.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/platform/libNetworkManagerBase_la-nm-platform-utils.lo -MD -MP -MF src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform-utils.Tpo -c -o src/platform/libNetworkManagerBase_la-nm-platform-utils.lo `test -f 'src/platform/nm-platform-utils.c' || echo '$(srcdir)/'`src/platform/nm-platform-utils.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform-utils.Tpo src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform-utils.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/platform/nm-platform-utils.c' object='src/platform/libNetworkManagerBase_la-nm-platform-utils.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/platform/libNetworkManagerBase_la-nm-platform-utils.lo `test -f 'src/platform/nm-platform-utils.c' || echo '$(srcdir)/'`src/platform/nm-platform-utils.c - src/platform/libNetworkManagerBase_la-nm-platform.lo: src/platform/nm-platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libNetworkManagerBase_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/platform/libNetworkManagerBase_la-nm-platform.lo -MD -MP -MF src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform.Tpo -c -o src/platform/libNetworkManagerBase_la-nm-platform.lo `test -f 'src/platform/nm-platform.c' || echo '$(srcdir)/'`src/platform/nm-platform.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform.Tpo src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform.Plo @@ -16387,6 +16621,20 @@ shared/nm-glib-aux/tests/test_shared_general-test-shared-general.obj: shared/nm- @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_glib_aux_tests_test_shared_general_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shared/nm-glib-aux/tests/test_shared_general-test-shared-general.obj `if test -f 'shared/nm-glib-aux/tests/test-shared-general.c'; then $(CYGPATH_W) 'shared/nm-glib-aux/tests/test-shared-general.c'; else $(CYGPATH_W) '$(srcdir)/shared/nm-glib-aux/tests/test-shared-general.c'; fi` +shared/nm-platform/tests/test_nm_platform-test-nm-platform.o: shared/nm-platform/tests/test-nm-platform.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_platform_tests_test_nm_platform_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shared/nm-platform/tests/test_nm_platform-test-nm-platform.o -MD -MP -MF shared/nm-platform/tests/$(DEPDIR)/test_nm_platform-test-nm-platform.Tpo -c -o shared/nm-platform/tests/test_nm_platform-test-nm-platform.o `test -f 'shared/nm-platform/tests/test-nm-platform.c' || echo '$(srcdir)/'`shared/nm-platform/tests/test-nm-platform.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) shared/nm-platform/tests/$(DEPDIR)/test_nm_platform-test-nm-platform.Tpo shared/nm-platform/tests/$(DEPDIR)/test_nm_platform-test-nm-platform.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shared/nm-platform/tests/test-nm-platform.c' object='shared/nm-platform/tests/test_nm_platform-test-nm-platform.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_platform_tests_test_nm_platform_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shared/nm-platform/tests/test_nm_platform-test-nm-platform.o `test -f 'shared/nm-platform/tests/test-nm-platform.c' || echo '$(srcdir)/'`shared/nm-platform/tests/test-nm-platform.c + +shared/nm-platform/tests/test_nm_platform-test-nm-platform.obj: shared/nm-platform/tests/test-nm-platform.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_platform_tests_test_nm_platform_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shared/nm-platform/tests/test_nm_platform-test-nm-platform.obj -MD -MP -MF shared/nm-platform/tests/$(DEPDIR)/test_nm_platform-test-nm-platform.Tpo -c -o shared/nm-platform/tests/test_nm_platform-test-nm-platform.obj `if test -f 'shared/nm-platform/tests/test-nm-platform.c'; then $(CYGPATH_W) 'shared/nm-platform/tests/test-nm-platform.c'; else $(CYGPATH_W) '$(srcdir)/shared/nm-platform/tests/test-nm-platform.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) shared/nm-platform/tests/$(DEPDIR)/test_nm_platform-test-nm-platform.Tpo shared/nm-platform/tests/$(DEPDIR)/test_nm_platform-test-nm-platform.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shared/nm-platform/tests/test-nm-platform.c' object='shared/nm-platform/tests/test_nm_platform-test-nm-platform.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shared_nm_platform_tests_test_nm_platform_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shared/nm-platform/tests/test_nm_platform-test-nm-platform.obj `if test -f 'shared/nm-platform/tests/test-nm-platform.c'; then $(CYGPATH_W) 'shared/nm-platform/tests/test-nm-platform.c'; else $(CYGPATH_W) '$(srcdir)/shared/nm-platform/tests/test-nm-platform.c'; fi` + src/NetworkManager-main.o: src/main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_NetworkManager_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/NetworkManager-main.o -MD -MP -MF src/$(DEPDIR)/NetworkManager-main.Tpo -c -o src/NetworkManager-main.o `test -f 'src/main.c' || echo '$(srcdir)/'`src/main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/NetworkManager-main.Tpo src/$(DEPDIR)/NetworkManager-main.Po @@ -17156,8 +17404,12 @@ clean-libtool: -rm -rf shared/n-acd/src/util/.libs shared/n-acd/src/util/_libs -rm -rf shared/n-dhcp4/src/.libs shared/n-dhcp4/src/_libs -rm -rf shared/n-dhcp4/src/util/.libs shared/n-dhcp4/src/util/_libs + -rm -rf shared/nm-base/.libs shared/nm-base/_libs -rm -rf shared/nm-glib-aux/.libs shared/nm-glib-aux/_libs -rm -rf shared/nm-glib-aux/tests/.libs shared/nm-glib-aux/tests/_libs + -rm -rf shared/nm-log-core/.libs shared/nm-log-core/_libs + -rm -rf shared/nm-platform/.libs shared/nm-platform/_libs + -rm -rf shared/nm-platform/tests/.libs shared/nm-platform/tests/_libs -rm -rf shared/nm-std-aux/.libs shared/nm-std-aux/_libs -rm -rf shared/nm-udev-aux/.libs shared/nm-udev-aux/_libs -rm -rf shared/nm-utils/.libs shared/nm-utils/_libs @@ -17963,6 +18215,13 @@ recheck: all $(check_PROGRAMS) $(check_LTLIBRARIES) am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? +shared/nm-platform/tests/test-nm-platform.log: shared/nm-platform/tests/test-nm-platform$(EXEEXT) + @p='shared/nm-platform/tests/test-nm-platform$(EXEEXT)'; \ + b='shared/nm-platform/tests/test-nm-platform'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) shared/nm-glib-aux/tests/test-shared-general.log: shared/nm-glib-aux/tests/test-shared-general$(EXEEXT) @p='shared/nm-glib-aux/tests/test-shared-general$(EXEEXT)'; \ b='shared/nm-glib-aux/tests/test-shared-general'; \ @@ -18647,10 +18906,18 @@ distclean-generic: -rm -f shared/n-dhcp4/src/$(am__dirstamp) -rm -f shared/n-dhcp4/src/util/$(DEPDIR)/$(am__dirstamp) -rm -f shared/n-dhcp4/src/util/$(am__dirstamp) + -rm -f shared/nm-base/$(DEPDIR)/$(am__dirstamp) + -rm -f shared/nm-base/$(am__dirstamp) -rm -f shared/nm-glib-aux/$(DEPDIR)/$(am__dirstamp) -rm -f shared/nm-glib-aux/$(am__dirstamp) -rm -f shared/nm-glib-aux/tests/$(DEPDIR)/$(am__dirstamp) -rm -f shared/nm-glib-aux/tests/$(am__dirstamp) + -rm -f shared/nm-log-core/$(DEPDIR)/$(am__dirstamp) + -rm -f shared/nm-log-core/$(am__dirstamp) + -rm -f shared/nm-platform/$(DEPDIR)/$(am__dirstamp) + -rm -f shared/nm-platform/$(am__dirstamp) + -rm -f shared/nm-platform/tests/$(DEPDIR)/$(am__dirstamp) + -rm -f shared/nm-platform/tests/$(am__dirstamp) -rm -f shared/nm-std-aux/$(DEPDIR)/$(am__dirstamp) -rm -f shared/nm-std-aux/$(am__dirstamp) -rm -f shared/nm-udev-aux/$(DEPDIR)/$(am__dirstamp) @@ -18985,7 +19252,6 @@ distclean: distclean-recursive -rm -f libnm-core/nm-keyfile/$(DEPDIR)/libnm_keyfile_la-nm-keyfile.Plo -rm -f libnm-core/nm-libnm-core-aux/$(DEPDIR)/libnm_libnm_core_aux_la-nm-libnm-core-aux.Plo -rm -f libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-auth-subject.Plo - -rm -f libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-ethtool-utils.Plo -rm -f libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-libnm-core-utils.Plo -rm -f libnm-core/tests/$(DEPDIR)/test_compare-test-compare.Po -rm -f libnm-core/tests/$(DEPDIR)/test_crypto-test-crypto.Po @@ -19074,6 +19340,7 @@ distclean: distclean-recursive -rm -f shared/n-dhcp4/src/$(DEPDIR)/libndhcp4_la-n-dhcp4-socket.Plo -rm -f shared/n-dhcp4/src/util/$(DEPDIR)/libndhcp4_la-packet.Plo -rm -f shared/n-dhcp4/src/util/$(DEPDIR)/libndhcp4_la-socket.Plo + -rm -f shared/nm-base/$(DEPDIR)/libnm_base_la-nm-ethtool-base.Plo -rm -f shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-dbus-aux.Plo -rm -f shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-dedup-multi.Plo -rm -f shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-enum-utils.Plo @@ -19090,6 +19357,11 @@ distclean: distclean-recursive -rm -f shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-time-utils.Plo -rm -f shared/nm-glib-aux/tests/$(DEPDIR)/test_json_aux-test-json-aux.Po -rm -f shared/nm-glib-aux/tests/$(DEPDIR)/test_shared_general-test-shared-general.Po + -rm -f shared/nm-log-core/$(DEPDIR)/libnm_log_core_la-nm-logging.Plo + -rm -f shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-netlink.Plo + -rm -f shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-platform-utils.Plo + -rm -f shared/nm-platform/$(DEPDIR)/libnm_platform_la-nmp-netns.Plo + -rm -f shared/nm-platform/tests/$(DEPDIR)/test_nm_platform-test-nm-platform.Po -rm -f shared/nm-std-aux/$(DEPDIR)/libnm_std_aux_la-c-list-util.Plo -rm -f shared/nm-std-aux/$(DEPDIR)/libnm_std_aux_la-nm-std-utils.Plo -rm -f shared/nm-udev-aux/$(DEPDIR)/libnm_udev_aux_la-nm-udev-utils.Plo @@ -19147,7 +19419,6 @@ distclean: distclean-recursive -rm -f src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3-config-data.Plo -rm -f src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3-ipv4ll.Plo -rm -f src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3cfg.Plo - -rm -f src/$(DEPDIR)/libNetworkManagerBase_la-nm-logging.Plo -rm -f src/$(DEPDIR)/libNetworkManagerBase_la-nm-netns.Plo -rm -f src/$(DEPDIR)/libNetworkManager_la-nm-act-request.Plo -rm -f src/$(DEPDIR)/libNetworkManager_la-nm-active-connection.Plo @@ -19268,10 +19539,7 @@ distclean: distclean-recursive -rm -f src/ndisc/tests/$(DEPDIR)/test_ndisc_fake-test-ndisc-fake.Po -rm -f src/ndisc/tests/$(DEPDIR)/test_ndisc_linux-test-ndisc-linux.Po -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-linux-platform.Plo - -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-netlink.Plo - -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform-utils.Plo -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform.Plo - -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-netns.Plo -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-object.Plo -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-rules-manager.Plo -rm -f src/platform/$(DEPDIR)/libNetworkManagerTest_la-nm-fake-platform.Plo @@ -19643,7 +19911,6 @@ maintainer-clean: maintainer-clean-recursive -rm -f libnm-core/nm-keyfile/$(DEPDIR)/libnm_keyfile_la-nm-keyfile.Plo -rm -f libnm-core/nm-libnm-core-aux/$(DEPDIR)/libnm_libnm_core_aux_la-nm-libnm-core-aux.Plo -rm -f libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-auth-subject.Plo - -rm -f libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-ethtool-utils.Plo -rm -f libnm-core/nm-libnm-core-intern/$(DEPDIR)/libnm_libnm_core_intern_la-nm-libnm-core-utils.Plo -rm -f libnm-core/tests/$(DEPDIR)/test_compare-test-compare.Po -rm -f libnm-core/tests/$(DEPDIR)/test_crypto-test-crypto.Po @@ -19732,6 +19999,7 @@ maintainer-clean: maintainer-clean-recursive -rm -f shared/n-dhcp4/src/$(DEPDIR)/libndhcp4_la-n-dhcp4-socket.Plo -rm -f shared/n-dhcp4/src/util/$(DEPDIR)/libndhcp4_la-packet.Plo -rm -f shared/n-dhcp4/src/util/$(DEPDIR)/libndhcp4_la-socket.Plo + -rm -f shared/nm-base/$(DEPDIR)/libnm_base_la-nm-ethtool-base.Plo -rm -f shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-dbus-aux.Plo -rm -f shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-dedup-multi.Plo -rm -f shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-enum-utils.Plo @@ -19748,6 +20016,11 @@ maintainer-clean: maintainer-clean-recursive -rm -f shared/nm-glib-aux/$(DEPDIR)/libnm_glib_aux_la-nm-time-utils.Plo -rm -f shared/nm-glib-aux/tests/$(DEPDIR)/test_json_aux-test-json-aux.Po -rm -f shared/nm-glib-aux/tests/$(DEPDIR)/test_shared_general-test-shared-general.Po + -rm -f shared/nm-log-core/$(DEPDIR)/libnm_log_core_la-nm-logging.Plo + -rm -f shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-netlink.Plo + -rm -f shared/nm-platform/$(DEPDIR)/libnm_platform_la-nm-platform-utils.Plo + -rm -f shared/nm-platform/$(DEPDIR)/libnm_platform_la-nmp-netns.Plo + -rm -f shared/nm-platform/tests/$(DEPDIR)/test_nm_platform-test-nm-platform.Po -rm -f shared/nm-std-aux/$(DEPDIR)/libnm_std_aux_la-c-list-util.Plo -rm -f shared/nm-std-aux/$(DEPDIR)/libnm_std_aux_la-nm-std-utils.Plo -rm -f shared/nm-udev-aux/$(DEPDIR)/libnm_udev_aux_la-nm-udev-utils.Plo @@ -19805,7 +20078,6 @@ maintainer-clean: maintainer-clean-recursive -rm -f src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3-config-data.Plo -rm -f src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3-ipv4ll.Plo -rm -f src/$(DEPDIR)/libNetworkManagerBase_la-nm-l3cfg.Plo - -rm -f src/$(DEPDIR)/libNetworkManagerBase_la-nm-logging.Plo -rm -f src/$(DEPDIR)/libNetworkManagerBase_la-nm-netns.Plo -rm -f src/$(DEPDIR)/libNetworkManager_la-nm-act-request.Plo -rm -f src/$(DEPDIR)/libNetworkManager_la-nm-active-connection.Plo @@ -19926,10 +20198,7 @@ maintainer-clean: maintainer-clean-recursive -rm -f src/ndisc/tests/$(DEPDIR)/test_ndisc_fake-test-ndisc-fake.Po -rm -f src/ndisc/tests/$(DEPDIR)/test_ndisc_linux-test-ndisc-linux.Po -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-linux-platform.Plo - -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-netlink.Plo - -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform-utils.Plo -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nm-platform.Plo - -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-netns.Plo -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-object.Plo -rm -f src/platform/$(DEPDIR)/libNetworkManagerBase_la-nmp-rules-manager.Plo -rm -f src/platform/$(DEPDIR)/libNetworkManagerTest_la-nm-fake-platform.Plo @@ -20163,7 +20432,11 @@ config-extra.h: config-extra.h.mk config.h config.status $(libnm_core_lib_h_pub_mkenums): config-extra.h libnm-core/.dirstamp: config-extra.h shared/.dirstamp: config-extra.h +shared/nm-base/.dirstamp: config-extra.h shared/nm-glib-aux/.dirstamp: config-extra.h +shared/nm-glib-aux/tests/.dirstamp: config-extra.h +shared/nm-platform/.dirstamp: config-extra.h +shared/nm-platform/tests/.dirstamp: config-extra.h shared/nm-std-aux/.dirstamp: config-extra.h shared/nm-udev-aux/.dirstamp: config-extra.h shared/systemd/.dirstamp: config-extra.h diff --git a/clients/cli/generate-docs-nm-settings-nmcli.xml b/clients/cli/generate-docs-nm-settings-nmcli.xml index f269af0..cc47e6a 100644 --- a/clients/cli/generate-docs-nm-settings-nmcli.xml +++ b/clients/cli/generate-docs-nm-settings-nmcli.xml @@ -572,7 +572,7 @@ + description="If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_FALSE (0)." /> + description="If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_FALSE (0)." /> . # @@ -591,8 +591,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='NetworkManager' PACKAGE_TARNAME='NetworkManager' -PACKAGE_VERSION='1.29.8' -PACKAGE_STRING='NetworkManager 1.29.8' +PACKAGE_VERSION='1.29.9' +PACKAGE_STRING='NetworkManager 1.29.9' PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=NetworkManager' PACKAGE_URL='' @@ -1726,7 +1726,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures NetworkManager 1.29.8 to adapt to many kinds of systems. +\`configure' configures NetworkManager 1.29.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1796,7 +1796,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of NetworkManager 1.29.8:";; + short | recursive ) echo "Configuration of NetworkManager 1.29.9:";; esac cat <<\_ACEOF @@ -2142,7 +2142,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -NetworkManager configure 1.29.8 +NetworkManager configure 1.29.9 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2915,7 +2915,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by NetworkManager $as_me 1.29.8, which was +It was created by NetworkManager $as_me 1.29.9, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3785,7 +3785,7 @@ fi # Define the identity of the package. PACKAGE='NetworkManager' - VERSION='1.29.8' + VERSION='1.29.9' cat >>confdefs.h <<_ACEOF @@ -17969,8 +17969,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu NM_MAJOR_VERSION=1 NM_MINOR_VERSION=29 -NM_MICRO_VERSION=8 -NM_VERSION=1.29.8 +NM_MICRO_VERSION=9 +NM_VERSION=1.29.9 @@ -17978,7 +17978,7 @@ NM_VERSION=1.29.8 -NM_GIT_SHA=584e8f92f593a633f969131e93899219ff6b20ae +NM_GIT_SHA=bcb63affdd18cb5a246f332da35275adba443065 if test """" != "no-config-h" ; then @@ -29448,7 +29448,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by NetworkManager $as_me 1.29.8, which was +This file was extended by NetworkManager $as_me 1.29.9, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -29514,7 +29514,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -NetworkManager config.status 1.29.8 +NetworkManager config.status 1.29.9 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 6e42a99..f4e00d9 100644 --- a/configure.ac +++ b/configure.ac @@ -8,7 +8,7 @@ dnl "shared/nm-version-macros.h.in" dnl - update number in meson.build m4_define([nm_major_version], [1]) m4_define([nm_minor_version], [29]) -m4_define([nm_micro_version], [8]) +m4_define([nm_micro_version], [9]) m4_define([nm_version], [nm_major_version.nm_minor_version.nm_micro_version]) diff --git a/docs/api/html/index.html b/docs/api/html/index.html index e8f6855..e75bdb3 100644 --- a/docs/api/html/index.html +++ b/docs/api/html/index.html @@ -16,7 +16,7 @@

- for NetworkManager 1.29.8 + for NetworkManager 1.29.9 The latest version of this documentation can be found on-line at https://developer.gnome.org/NetworkManager/stable/. diff --git a/docs/api/html/ix01.html b/docs/api/html/ix01.html index 84890fc..abd980d 100644 --- a/docs/api/html/ix01.html +++ b/docs/api/html/ix01.html @@ -26,1689 +26,1689 @@

Symbols

-
org.freedesktop.NetworkManager.AccessPoint, org.freedesktop.NetworkManager.AccessPoint +
org.freedesktop.NetworkManager.AccessPoint, org.freedesktop.NetworkManager.AccessPoint
-
org.freedesktop.NetworkManager.AccessPoint::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.AccessPoint::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.AccessPoint:Flags, The "Flags" property +
org.freedesktop.NetworkManager.AccessPoint:Flags, The "Flags" property
-
org.freedesktop.NetworkManager.AccessPoint:Frequency, The "Frequency" property +
org.freedesktop.NetworkManager.AccessPoint:Frequency, The "Frequency" property
-
org.freedesktop.NetworkManager.AccessPoint:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.AccessPoint:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.AccessPoint:LastSeen, The "LastSeen" property +
org.freedesktop.NetworkManager.AccessPoint:LastSeen, The "LastSeen" property
-
org.freedesktop.NetworkManager.AccessPoint:MaxBitrate, The "MaxBitrate" property +
org.freedesktop.NetworkManager.AccessPoint:MaxBitrate, The "MaxBitrate" property
-
org.freedesktop.NetworkManager.AccessPoint:Mode, The "Mode" property +
org.freedesktop.NetworkManager.AccessPoint:Mode, The "Mode" property
-
org.freedesktop.NetworkManager.AccessPoint:RsnFlags, The "RsnFlags" property +
org.freedesktop.NetworkManager.AccessPoint:RsnFlags, The "RsnFlags" property
-
org.freedesktop.NetworkManager.AccessPoint:Ssid, The "Ssid" property +
org.freedesktop.NetworkManager.AccessPoint:Ssid, The "Ssid" property
-
org.freedesktop.NetworkManager.AccessPoint:Strength, The "Strength" property +
org.freedesktop.NetworkManager.AccessPoint:Strength, The "Strength" property
-
org.freedesktop.NetworkManager.AccessPoint:WpaFlags, The "WpaFlags" property +
org.freedesktop.NetworkManager.AccessPoint:WpaFlags, The "WpaFlags" property
-
org.freedesktop.NetworkManager.AgentManager, org.freedesktop.NetworkManager.AgentManager +
org.freedesktop.NetworkManager.AgentManager, org.freedesktop.NetworkManager.AgentManager
-
org.freedesktop.NetworkManager.AgentManager.Register(), The Register() method +
org.freedesktop.NetworkManager.AgentManager.Register(), The Register() method
-
org.freedesktop.NetworkManager.AgentManager.RegisterWithCapabilities(), The RegisterWithCapabilities() method +
org.freedesktop.NetworkManager.AgentManager.RegisterWithCapabilities(), The RegisterWithCapabilities() method
-
org.freedesktop.NetworkManager.AgentManager.Unregister(), The Unregister() method +
org.freedesktop.NetworkManager.AgentManager.Unregister(), The Unregister() method
-
org.freedesktop.NetworkManager.Device, org.freedesktop.NetworkManager.Device +
org.freedesktop.NetworkManager.Device, org.freedesktop.NetworkManager.Device
-
org.freedesktop.NetworkManager.Device.Adsl, org.freedesktop.NetworkManager.Device.Adsl +
org.freedesktop.NetworkManager.Device.Adsl, org.freedesktop.NetworkManager.Device.Adsl
-
org.freedesktop.NetworkManager.Device.Adsl::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Adsl::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Adsl:Carrier, The "Carrier" property +
org.freedesktop.NetworkManager.Device.Adsl:Carrier, The "Carrier" property
-
org.freedesktop.NetworkManager.Device.Bluetooth, org.freedesktop.NetworkManager.Device.Bluetooth +
org.freedesktop.NetworkManager.Device.Bluetooth, org.freedesktop.NetworkManager.Device.Bluetooth
-
org.freedesktop.NetworkManager.Device.Bluetooth::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Bluetooth::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Bluetooth:BtCapabilities, The "BtCapabilities" property +
org.freedesktop.NetworkManager.Device.Bluetooth:BtCapabilities, The "BtCapabilities" property
-
org.freedesktop.NetworkManager.Device.Bluetooth:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Bluetooth:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Bluetooth:Name, The "Name" property +
org.freedesktop.NetworkManager.Device.Bluetooth:Name, The "Name" property
-
org.freedesktop.NetworkManager.Device.Bond, org.freedesktop.NetworkManager.Device.Bond +
org.freedesktop.NetworkManager.Device.Bond, org.freedesktop.NetworkManager.Device.Bond
-
org.freedesktop.NetworkManager.Device.Bond::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Bond::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Bond:Carrier, The "Carrier" property +
org.freedesktop.NetworkManager.Device.Bond:Carrier, The "Carrier" property
-
org.freedesktop.NetworkManager.Device.Bond:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Bond:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Bond:Slaves, The "Slaves" property +
org.freedesktop.NetworkManager.Device.Bond:Slaves, The "Slaves" property
-
org.freedesktop.NetworkManager.Device.Bridge, org.freedesktop.NetworkManager.Device.Bridge +
org.freedesktop.NetworkManager.Device.Bridge, org.freedesktop.NetworkManager.Device.Bridge
-
org.freedesktop.NetworkManager.Device.Bridge::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Bridge::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Bridge:Carrier, The "Carrier" property +
org.freedesktop.NetworkManager.Device.Bridge:Carrier, The "Carrier" property
-
org.freedesktop.NetworkManager.Device.Bridge:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Bridge:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Bridge:Slaves, The "Slaves" property +
org.freedesktop.NetworkManager.Device.Bridge:Slaves, The "Slaves" property
-
org.freedesktop.NetworkManager.Device.Delete(), The Delete() method +
org.freedesktop.NetworkManager.Device.Delete(), The Delete() method
-
org.freedesktop.NetworkManager.Device.Disconnect(), The Disconnect() method +
org.freedesktop.NetworkManager.Device.Disconnect(), The Disconnect() method
-
org.freedesktop.NetworkManager.Device.Dummy, org.freedesktop.NetworkManager.Device.Dummy +
org.freedesktop.NetworkManager.Device.Dummy, org.freedesktop.NetworkManager.Device.Dummy
-
org.freedesktop.NetworkManager.Device.Dummy::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Dummy::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Dummy:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Dummy:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Generic, org.freedesktop.NetworkManager.Device.Generic +
org.freedesktop.NetworkManager.Device.Generic, org.freedesktop.NetworkManager.Device.Generic
-
org.freedesktop.NetworkManager.Device.Generic::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Generic::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Generic:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Generic:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Generic:TypeDescription, The "TypeDescription" property +
org.freedesktop.NetworkManager.Device.Generic:TypeDescription, The "TypeDescription" property
-
org.freedesktop.NetworkManager.Device.GetAppliedConnection(), The GetAppliedConnection() method +
org.freedesktop.NetworkManager.Device.GetAppliedConnection(), The GetAppliedConnection() method
-
org.freedesktop.NetworkManager.Device.Infiniband, org.freedesktop.NetworkManager.Device.Infiniband +
org.freedesktop.NetworkManager.Device.Infiniband, org.freedesktop.NetworkManager.Device.Infiniband
-
org.freedesktop.NetworkManager.Device.Infiniband::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Infiniband::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Infiniband:Carrier, The "Carrier" property +
org.freedesktop.NetworkManager.Device.Infiniband:Carrier, The "Carrier" property
-
org.freedesktop.NetworkManager.Device.Infiniband:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Infiniband:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.IPTunnel, org.freedesktop.NetworkManager.Device.IPTunnel +
org.freedesktop.NetworkManager.Device.IPTunnel, org.freedesktop.NetworkManager.Device.IPTunnel
-
org.freedesktop.NetworkManager.Device.IPTunnel::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.IPTunnel::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.IPTunnel:EncapsulationLimit, The "EncapsulationLimit" property +
org.freedesktop.NetworkManager.Device.IPTunnel:EncapsulationLimit, The "EncapsulationLimit" property
-
org.freedesktop.NetworkManager.Device.IPTunnel:Flags, The "Flags" property +
org.freedesktop.NetworkManager.Device.IPTunnel:Flags, The "Flags" property
-
org.freedesktop.NetworkManager.Device.IPTunnel:FlowLabel, The "FlowLabel" property +
org.freedesktop.NetworkManager.Device.IPTunnel:FlowLabel, The "FlowLabel" property
-
org.freedesktop.NetworkManager.Device.IPTunnel:InputKey, The "InputKey" property +
org.freedesktop.NetworkManager.Device.IPTunnel:InputKey, The "InputKey" property
-
org.freedesktop.NetworkManager.Device.IPTunnel:Local, The "Local" property +
org.freedesktop.NetworkManager.Device.IPTunnel:Local, The "Local" property
-
org.freedesktop.NetworkManager.Device.IPTunnel:Mode, The "Mode" property +
org.freedesktop.NetworkManager.Device.IPTunnel:Mode, The "Mode" property
-
org.freedesktop.NetworkManager.Device.IPTunnel:OutputKey, The "OutputKey" property +
org.freedesktop.NetworkManager.Device.IPTunnel:OutputKey, The "OutputKey" property
-
org.freedesktop.NetworkManager.Device.IPTunnel:Parent, The "Parent" property +
org.freedesktop.NetworkManager.Device.IPTunnel:Parent, The "Parent" property
-
org.freedesktop.NetworkManager.Device.IPTunnel:PathMtuDiscovery, The "PathMtuDiscovery" property +
org.freedesktop.NetworkManager.Device.IPTunnel:PathMtuDiscovery, The "PathMtuDiscovery" property
-
org.freedesktop.NetworkManager.Device.IPTunnel:Remote, The "Remote" property +
org.freedesktop.NetworkManager.Device.IPTunnel:Remote, The "Remote" property
-
org.freedesktop.NetworkManager.Device.IPTunnel:Tos, The "Tos" property +
org.freedesktop.NetworkManager.Device.IPTunnel:Tos, The "Tos" property
-
org.freedesktop.NetworkManager.Device.IPTunnel:Ttl, The "Ttl" property +
org.freedesktop.NetworkManager.Device.IPTunnel:Ttl, The "Ttl" property
-
org.freedesktop.NetworkManager.Device.Lowpan, org.freedesktop.NetworkManager.Device.Lowpan +
org.freedesktop.NetworkManager.Device.Lowpan, org.freedesktop.NetworkManager.Device.Lowpan
-
org.freedesktop.NetworkManager.Device.Lowpan:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Lowpan:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Lowpan:Parent, The "Parent" property +
org.freedesktop.NetworkManager.Device.Lowpan:Parent, The "Parent" property
-
org.freedesktop.NetworkManager.Device.Macsec, org.freedesktop.NetworkManager.Device.Macsec +
org.freedesktop.NetworkManager.Device.Macsec, org.freedesktop.NetworkManager.Device.Macsec
-
org.freedesktop.NetworkManager.Device.Macsec::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Macsec::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Macsec:CipherSuite, The "CipherSuite" property +
org.freedesktop.NetworkManager.Device.Macsec:CipherSuite, The "CipherSuite" property
-
org.freedesktop.NetworkManager.Device.Macsec:EncodingSa, The "EncodingSa" property +
org.freedesktop.NetworkManager.Device.Macsec:EncodingSa, The "EncodingSa" property
-
org.freedesktop.NetworkManager.Device.Macsec:Encrypt, The "Encrypt" property +
org.freedesktop.NetworkManager.Device.Macsec:Encrypt, The "Encrypt" property
-
org.freedesktop.NetworkManager.Device.Macsec:Es, The "Es" property +
org.freedesktop.NetworkManager.Device.Macsec:Es, The "Es" property
-
org.freedesktop.NetworkManager.Device.Macsec:IcvLength, The "IcvLength" property +
org.freedesktop.NetworkManager.Device.Macsec:IcvLength, The "IcvLength" property
-
org.freedesktop.NetworkManager.Device.Macsec:IncludeSci, The "IncludeSci" property +
org.freedesktop.NetworkManager.Device.Macsec:IncludeSci, The "IncludeSci" property
-
org.freedesktop.NetworkManager.Device.Macsec:Parent, The "Parent" property +
org.freedesktop.NetworkManager.Device.Macsec:Parent, The "Parent" property
-
org.freedesktop.NetworkManager.Device.Macsec:Protect, The "Protect" property +
org.freedesktop.NetworkManager.Device.Macsec:Protect, The "Protect" property
-
org.freedesktop.NetworkManager.Device.Macsec:ReplayProtect, The "ReplayProtect" property +
org.freedesktop.NetworkManager.Device.Macsec:ReplayProtect, The "ReplayProtect" property
-
org.freedesktop.NetworkManager.Device.Macsec:Scb, The "Scb" property +
org.freedesktop.NetworkManager.Device.Macsec:Scb, The "Scb" property
-
org.freedesktop.NetworkManager.Device.Macsec:Sci, The "Sci" property +
org.freedesktop.NetworkManager.Device.Macsec:Sci, The "Sci" property
-
org.freedesktop.NetworkManager.Device.Macsec:Validation, The "Validation" property +
org.freedesktop.NetworkManager.Device.Macsec:Validation, The "Validation" property
-
org.freedesktop.NetworkManager.Device.Macsec:Window, The "Window" property +
org.freedesktop.NetworkManager.Device.Macsec:Window, The "Window" property
-
org.freedesktop.NetworkManager.Device.Macvlan, org.freedesktop.NetworkManager.Device.Macvlan +
org.freedesktop.NetworkManager.Device.Macvlan, org.freedesktop.NetworkManager.Device.Macvlan
-
org.freedesktop.NetworkManager.Device.Macvlan::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Macvlan::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Macvlan:Mode, The "Mode" property +
org.freedesktop.NetworkManager.Device.Macvlan:Mode, The "Mode" property
-
org.freedesktop.NetworkManager.Device.Macvlan:NoPromisc, The "NoPromisc" property +
org.freedesktop.NetworkManager.Device.Macvlan:NoPromisc, The "NoPromisc" property
-
org.freedesktop.NetworkManager.Device.Macvlan:Parent, The "Parent" property +
org.freedesktop.NetworkManager.Device.Macvlan:Parent, The "Parent" property
-
org.freedesktop.NetworkManager.Device.Macvlan:Tap, The "Tap" property +
org.freedesktop.NetworkManager.Device.Macvlan:Tap, The "Tap" property
-
org.freedesktop.NetworkManager.Device.Modem, org.freedesktop.NetworkManager.Device.Modem +
org.freedesktop.NetworkManager.Device.Modem, org.freedesktop.NetworkManager.Device.Modem
-
org.freedesktop.NetworkManager.Device.Modem::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Modem::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Modem:Apn, The "Apn" property +
org.freedesktop.NetworkManager.Device.Modem:Apn, The "Apn" property
-
org.freedesktop.NetworkManager.Device.Modem:CurrentCapabilities, The "CurrentCapabilities" property +
org.freedesktop.NetworkManager.Device.Modem:CurrentCapabilities, The "CurrentCapabilities" property
-
org.freedesktop.NetworkManager.Device.Modem:DeviceId, The "DeviceId" property +
org.freedesktop.NetworkManager.Device.Modem:DeviceId, The "DeviceId" property
-
org.freedesktop.NetworkManager.Device.Modem:ModemCapabilities, The "ModemCapabilities" property +
org.freedesktop.NetworkManager.Device.Modem:ModemCapabilities, The "ModemCapabilities" property
-
org.freedesktop.NetworkManager.Device.Modem:OperatorCode, The "OperatorCode" property +
org.freedesktop.NetworkManager.Device.Modem:OperatorCode, The "OperatorCode" property
-
org.freedesktop.NetworkManager.Device.OlpcMesh, org.freedesktop.NetworkManager.Device.OlpcMesh +
org.freedesktop.NetworkManager.Device.OlpcMesh, org.freedesktop.NetworkManager.Device.OlpcMesh
-
org.freedesktop.NetworkManager.Device.OlpcMesh::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.OlpcMesh::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.OlpcMesh:ActiveChannel, The "ActiveChannel" property +
org.freedesktop.NetworkManager.Device.OlpcMesh:ActiveChannel, The "ActiveChannel" property
-
org.freedesktop.NetworkManager.Device.OlpcMesh:Companion, The "Companion" property +
org.freedesktop.NetworkManager.Device.OlpcMesh:Companion, The "Companion" property
-
org.freedesktop.NetworkManager.Device.OlpcMesh:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.OlpcMesh:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.OvsBridge, org.freedesktop.NetworkManager.Device.OvsBridge +
org.freedesktop.NetworkManager.Device.OvsBridge, org.freedesktop.NetworkManager.Device.OvsBridge
-
org.freedesktop.NetworkManager.Device.OvsBridge::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.OvsBridge::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.OvsBridge:Slaves, The "Slaves" property +
org.freedesktop.NetworkManager.Device.OvsBridge:Slaves, The "Slaves" property
-
org.freedesktop.NetworkManager.Device.OvsInterface, org.freedesktop.NetworkManager.Device.OvsInterface +
org.freedesktop.NetworkManager.Device.OvsInterface, org.freedesktop.NetworkManager.Device.OvsInterface
-
org.freedesktop.NetworkManager.Device.OvsInterface::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.OvsInterface::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.OvsPort, org.freedesktop.NetworkManager.Device.OvsPort +
org.freedesktop.NetworkManager.Device.OvsPort, org.freedesktop.NetworkManager.Device.OvsPort
-
org.freedesktop.NetworkManager.Device.OvsPort::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.OvsPort::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.OvsPort:Slaves, The "Slaves" property +
org.freedesktop.NetworkManager.Device.OvsPort:Slaves, The "Slaves" property
-
org.freedesktop.NetworkManager.Device.Ppp, org.freedesktop.NetworkManager.Device.Ppp +
org.freedesktop.NetworkManager.Device.Ppp, org.freedesktop.NetworkManager.Device.Ppp
-
org.freedesktop.NetworkManager.Device.Ppp::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Ppp::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Reapply(), The Reapply() method +
org.freedesktop.NetworkManager.Device.Reapply(), The Reapply() method
-
org.freedesktop.NetworkManager.Device.Statistics, org.freedesktop.NetworkManager.Device.Statistics +
org.freedesktop.NetworkManager.Device.Statistics, org.freedesktop.NetworkManager.Device.Statistics
-
org.freedesktop.NetworkManager.Device.Statistics::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Statistics::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Statistics:RefreshRateMs, The "RefreshRateMs" property +
org.freedesktop.NetworkManager.Device.Statistics:RefreshRateMs, The "RefreshRateMs" property
-
org.freedesktop.NetworkManager.Device.Statistics:RxBytes, The "RxBytes" property +
org.freedesktop.NetworkManager.Device.Statistics:RxBytes, The "RxBytes" property
-
org.freedesktop.NetworkManager.Device.Statistics:TxBytes, The "TxBytes" property +
org.freedesktop.NetworkManager.Device.Statistics:TxBytes, The "TxBytes" property
-
org.freedesktop.NetworkManager.Device.Team, org.freedesktop.NetworkManager.Device.Team +
org.freedesktop.NetworkManager.Device.Team, org.freedesktop.NetworkManager.Device.Team
-
org.freedesktop.NetworkManager.Device.Team::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Team::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Team:Carrier, The "Carrier" property +
org.freedesktop.NetworkManager.Device.Team:Carrier, The "Carrier" property
-
org.freedesktop.NetworkManager.Device.Team:Config, The "Config" property +
org.freedesktop.NetworkManager.Device.Team:Config, The "Config" property
-
org.freedesktop.NetworkManager.Device.Team:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Team:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Team:Slaves, The "Slaves" property +
org.freedesktop.NetworkManager.Device.Team:Slaves, The "Slaves" property
-
org.freedesktop.NetworkManager.Device.Tun, org.freedesktop.NetworkManager.Device.Tun +
org.freedesktop.NetworkManager.Device.Tun, org.freedesktop.NetworkManager.Device.Tun
-
org.freedesktop.NetworkManager.Device.Tun::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Tun::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Tun:Group, The "Group" property +
org.freedesktop.NetworkManager.Device.Tun:Group, The "Group" property
-
org.freedesktop.NetworkManager.Device.Tun:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Tun:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Tun:Mode, The "Mode" property +
org.freedesktop.NetworkManager.Device.Tun:Mode, The "Mode" property
-
org.freedesktop.NetworkManager.Device.Tun:MultiQueue, The "MultiQueue" property +
org.freedesktop.NetworkManager.Device.Tun:MultiQueue, The "MultiQueue" property
-
org.freedesktop.NetworkManager.Device.Tun:NoPi, The "NoPi" property +
org.freedesktop.NetworkManager.Device.Tun:NoPi, The "NoPi" property
-
org.freedesktop.NetworkManager.Device.Tun:Owner, The "Owner" property +
org.freedesktop.NetworkManager.Device.Tun:Owner, The "Owner" property
-
org.freedesktop.NetworkManager.Device.Tun:VnetHdr, The "VnetHdr" property +
org.freedesktop.NetworkManager.Device.Tun:VnetHdr, The "VnetHdr" property
-
org.freedesktop.NetworkManager.Device.Veth, org.freedesktop.NetworkManager.Device.Veth +
org.freedesktop.NetworkManager.Device.Veth, org.freedesktop.NetworkManager.Device.Veth
-
org.freedesktop.NetworkManager.Device.Veth::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Veth::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Veth:Peer, The "Peer" property +
org.freedesktop.NetworkManager.Device.Veth:Peer, The "Peer" property
-
org.freedesktop.NetworkManager.Device.Vlan, org.freedesktop.NetworkManager.Device.Vlan +
org.freedesktop.NetworkManager.Device.Vlan, org.freedesktop.NetworkManager.Device.Vlan
-
org.freedesktop.NetworkManager.Device.Vlan::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Vlan::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Vlan:Carrier, The "Carrier" property +
org.freedesktop.NetworkManager.Device.Vlan:Carrier, The "Carrier" property
-
org.freedesktop.NetworkManager.Device.Vlan:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Vlan:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Vlan:Parent, The "Parent" property +
org.freedesktop.NetworkManager.Device.Vlan:Parent, The "Parent" property
-
org.freedesktop.NetworkManager.Device.Vlan:VlanId, The "VlanId" property +
org.freedesktop.NetworkManager.Device.Vlan:VlanId, The "VlanId" property
-
org.freedesktop.NetworkManager.Device.Vrf, org.freedesktop.NetworkManager.Device.Vrf +
org.freedesktop.NetworkManager.Device.Vrf, org.freedesktop.NetworkManager.Device.Vrf
-
org.freedesktop.NetworkManager.Device.Vrf:Table, The "Table" property +
org.freedesktop.NetworkManager.Device.Vrf:Table, The "Table" property
-
org.freedesktop.NetworkManager.Device.Vxlan, org.freedesktop.NetworkManager.Device.Vxlan +
org.freedesktop.NetworkManager.Device.Vxlan, org.freedesktop.NetworkManager.Device.Vxlan
-
org.freedesktop.NetworkManager.Device.Vxlan::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Vxlan::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Vxlan:Ageing, The "Ageing" property +
org.freedesktop.NetworkManager.Device.Vxlan:Ageing, The "Ageing" property
-
org.freedesktop.NetworkManager.Device.Vxlan:DstPort, The "DstPort" property +
org.freedesktop.NetworkManager.Device.Vxlan:DstPort, The "DstPort" property
-
org.freedesktop.NetworkManager.Device.Vxlan:Group, The "Group" property +
org.freedesktop.NetworkManager.Device.Vxlan:Group, The "Group" property
-
org.freedesktop.NetworkManager.Device.Vxlan:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Vxlan:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Vxlan:Id, The "Id" property +
org.freedesktop.NetworkManager.Device.Vxlan:Id, The "Id" property
-
org.freedesktop.NetworkManager.Device.Vxlan:L2miss, The "L2miss" property +
org.freedesktop.NetworkManager.Device.Vxlan:L2miss, The "L2miss" property
-
org.freedesktop.NetworkManager.Device.Vxlan:L3miss, The "L3miss" property +
org.freedesktop.NetworkManager.Device.Vxlan:L3miss, The "L3miss" property
-
org.freedesktop.NetworkManager.Device.Vxlan:Learning, The "Learning" property +
org.freedesktop.NetworkManager.Device.Vxlan:Learning, The "Learning" property
-
org.freedesktop.NetworkManager.Device.Vxlan:Limit, The "Limit" property +
org.freedesktop.NetworkManager.Device.Vxlan:Limit, The "Limit" property
-
org.freedesktop.NetworkManager.Device.Vxlan:Local, The "Local" property +
org.freedesktop.NetworkManager.Device.Vxlan:Local, The "Local" property
-
org.freedesktop.NetworkManager.Device.Vxlan:Parent, The "Parent" property +
org.freedesktop.NetworkManager.Device.Vxlan:Parent, The "Parent" property
-
org.freedesktop.NetworkManager.Device.Vxlan:Proxy, The "Proxy" property +
org.freedesktop.NetworkManager.Device.Vxlan:Proxy, The "Proxy" property
-
org.freedesktop.NetworkManager.Device.Vxlan:Rsc, The "Rsc" property +
org.freedesktop.NetworkManager.Device.Vxlan:Rsc, The "Rsc" property
-
org.freedesktop.NetworkManager.Device.Vxlan:SrcPortMax, The "SrcPortMax" property +
org.freedesktop.NetworkManager.Device.Vxlan:SrcPortMax, The "SrcPortMax" property
-
org.freedesktop.NetworkManager.Device.Vxlan:SrcPortMin, The "SrcPortMin" property +
org.freedesktop.NetworkManager.Device.Vxlan:SrcPortMin, The "SrcPortMin" property
-
org.freedesktop.NetworkManager.Device.Vxlan:Tos, The "Tos" property +
org.freedesktop.NetworkManager.Device.Vxlan:Tos, The "Tos" property
-
org.freedesktop.NetworkManager.Device.Vxlan:Ttl, The "Ttl" property +
org.freedesktop.NetworkManager.Device.Vxlan:Ttl, The "Ttl" property
-
org.freedesktop.NetworkManager.Device.WireGuard, org.freedesktop.NetworkManager.Device.WireGuard +
org.freedesktop.NetworkManager.Device.WireGuard, org.freedesktop.NetworkManager.Device.WireGuard
-
org.freedesktop.NetworkManager.Device.WireGuard:FwMark, The "FwMark" property +
org.freedesktop.NetworkManager.Device.WireGuard:FwMark, The "FwMark" property
-
org.freedesktop.NetworkManager.Device.WireGuard:ListenPort, The "ListenPort" property +
org.freedesktop.NetworkManager.Device.WireGuard:ListenPort, The "ListenPort" property
-
org.freedesktop.NetworkManager.Device.WireGuard:PublicKey, The "PublicKey" property +
org.freedesktop.NetworkManager.Device.WireGuard:PublicKey, The "PublicKey" property
-
org.freedesktop.NetworkManager.Device.Wpan, org.freedesktop.NetworkManager.Device.Wpan +
org.freedesktop.NetworkManager.Device.Wpan, org.freedesktop.NetworkManager.Device.Wpan
-
org.freedesktop.NetworkManager.Device.Wpan:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Wpan:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device::StateChanged, The "StateChanged" signal +
org.freedesktop.NetworkManager.Device::StateChanged, The "StateChanged" signal
-
org.freedesktop.NetworkManager.Device:ActiveConnection, The "ActiveConnection" property +
org.freedesktop.NetworkManager.Device:ActiveConnection, The "ActiveConnection" property
-
org.freedesktop.NetworkManager.Device:Autoconnect, The "Autoconnect" property +
org.freedesktop.NetworkManager.Device:Autoconnect, The "Autoconnect" property
-
org.freedesktop.NetworkManager.Device:AvailableConnections, The "AvailableConnections" property +
org.freedesktop.NetworkManager.Device:AvailableConnections, The "AvailableConnections" property
-
org.freedesktop.NetworkManager.Device:Capabilities, The "Capabilities" property +
org.freedesktop.NetworkManager.Device:Capabilities, The "Capabilities" property
-
org.freedesktop.NetworkManager.Device:DeviceType, The "DeviceType" property +
org.freedesktop.NetworkManager.Device:DeviceType, The "DeviceType" property
-
org.freedesktop.NetworkManager.Device:Dhcp4Config, The "Dhcp4Config" property +
org.freedesktop.NetworkManager.Device:Dhcp4Config, The "Dhcp4Config" property
-
org.freedesktop.NetworkManager.Device:Dhcp6Config, The "Dhcp6Config" property +
org.freedesktop.NetworkManager.Device:Dhcp6Config, The "Dhcp6Config" property
-
org.freedesktop.NetworkManager.Device:Driver, The "Driver" property +
org.freedesktop.NetworkManager.Device:Driver, The "Driver" property
-
org.freedesktop.NetworkManager.Device:DriverVersion, The "DriverVersion" property +
org.freedesktop.NetworkManager.Device:DriverVersion, The "DriverVersion" property
-
org.freedesktop.NetworkManager.Device:FirmwareMissing, The "FirmwareMissing" property +
org.freedesktop.NetworkManager.Device:FirmwareMissing, The "FirmwareMissing" property
-
org.freedesktop.NetworkManager.Device:FirmwareVersion, The "FirmwareVersion" property +
org.freedesktop.NetworkManager.Device:FirmwareVersion, The "FirmwareVersion" property
-
org.freedesktop.NetworkManager.Device:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device:Interface, The "Interface" property +
org.freedesktop.NetworkManager.Device:Interface, The "Interface" property
-
org.freedesktop.NetworkManager.Device:InterfaceFlags, The "InterfaceFlags" property +
org.freedesktop.NetworkManager.Device:InterfaceFlags, The "InterfaceFlags" property
-
org.freedesktop.NetworkManager.Device:Ip4Address, The "Ip4Address" property +
org.freedesktop.NetworkManager.Device:Ip4Address, The "Ip4Address" property
-
org.freedesktop.NetworkManager.Device:Ip4Config, The "Ip4Config" property +
org.freedesktop.NetworkManager.Device:Ip4Config, The "Ip4Config" property
-
org.freedesktop.NetworkManager.Device:Ip4Connectivity, The "Ip4Connectivity" property +
org.freedesktop.NetworkManager.Device:Ip4Connectivity, The "Ip4Connectivity" property
-
org.freedesktop.NetworkManager.Device:Ip6Config, The "Ip6Config" property +
org.freedesktop.NetworkManager.Device:Ip6Config, The "Ip6Config" property
-
org.freedesktop.NetworkManager.Device:Ip6Connectivity, The "Ip6Connectivity" property +
org.freedesktop.NetworkManager.Device:Ip6Connectivity, The "Ip6Connectivity" property
-
org.freedesktop.NetworkManager.Device:IpInterface, The "IpInterface" property +
org.freedesktop.NetworkManager.Device:IpInterface, The "IpInterface" property
-
org.freedesktop.NetworkManager.Device:LldpNeighbors, The "LldpNeighbors" property +
org.freedesktop.NetworkManager.Device:LldpNeighbors, The "LldpNeighbors" property
-
org.freedesktop.NetworkManager.Device:Managed, The "Managed" property +
org.freedesktop.NetworkManager.Device:Managed, The "Managed" property
-
org.freedesktop.NetworkManager.Device:Metered, The "Metered" property +
org.freedesktop.NetworkManager.Device:Metered, The "Metered" property
-
org.freedesktop.NetworkManager.Device:Mtu, The "Mtu" property +
org.freedesktop.NetworkManager.Device:Mtu, The "Mtu" property
-
org.freedesktop.NetworkManager.Device:NmPluginMissing, The "NmPluginMissing" property +
org.freedesktop.NetworkManager.Device:NmPluginMissing, The "NmPluginMissing" property
-
org.freedesktop.NetworkManager.Device:Path, The "Path" property +
org.freedesktop.NetworkManager.Device:Path, The "Path" property
-
org.freedesktop.NetworkManager.Device:PhysicalPortId, The "PhysicalPortId" property +
org.freedesktop.NetworkManager.Device:PhysicalPortId, The "PhysicalPortId" property
-
org.freedesktop.NetworkManager.Device:Real, The "Real" property +
org.freedesktop.NetworkManager.Device:Real, The "Real" property
-
org.freedesktop.NetworkManager.Device:State, The "State" property +
org.freedesktop.NetworkManager.Device:State, The "State" property
-
org.freedesktop.NetworkManager.Device:StateReason, The "StateReason" property +
org.freedesktop.NetworkManager.Device:StateReason, The "StateReason" property
-
org.freedesktop.NetworkManager.Device:Udi, The "Udi" property +
org.freedesktop.NetworkManager.Device:Udi, The "Udi" property
-
org.freedesktop.NetworkManager.DnsManager, org.freedesktop.NetworkManager.DnsManager +
org.freedesktop.NetworkManager.DnsManager, org.freedesktop.NetworkManager.DnsManager
-
org.freedesktop.NetworkManager.DnsManager:Configuration, The "Configuration" property +
org.freedesktop.NetworkManager.DnsManager:Configuration, The "Configuration" property
-
org.freedesktop.NetworkManager.DnsManager:Mode, The "Mode" property +
org.freedesktop.NetworkManager.DnsManager:Mode, The "Mode" property
-
org.freedesktop.NetworkManager.DnsManager:RcManager, The "RcManager" property +
org.freedesktop.NetworkManager.DnsManager:RcManager, The "RcManager" property
-
org.freedesktop.NetworkManager.IP4Config, org.freedesktop.NetworkManager.IP4Config +
org.freedesktop.NetworkManager.IP4Config, org.freedesktop.NetworkManager.IP4Config
-
org.freedesktop.NetworkManager.IP4Config::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.IP4Config::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.IP4Config:AddressData, The "AddressData" property +
org.freedesktop.NetworkManager.IP4Config:AddressData, The "AddressData" property
-
org.freedesktop.NetworkManager.IP4Config:Addresses, The "Addresses" property +
org.freedesktop.NetworkManager.IP4Config:Addresses, The "Addresses" property
-
org.freedesktop.NetworkManager.IP4Config:DnsOptions, The "DnsOptions" property +
org.freedesktop.NetworkManager.IP4Config:DnsOptions, The "DnsOptions" property
-
org.freedesktop.NetworkManager.IP4Config:DnsPriority, The "DnsPriority" property +
org.freedesktop.NetworkManager.IP4Config:DnsPriority, The "DnsPriority" property
-
org.freedesktop.NetworkManager.IP4Config:Domains, The "Domains" property +
org.freedesktop.NetworkManager.IP4Config:Domains, The "Domains" property
-
org.freedesktop.NetworkManager.IP4Config:Gateway, The "Gateway" property +
org.freedesktop.NetworkManager.IP4Config:Gateway, The "Gateway" property
-
org.freedesktop.NetworkManager.IP4Config:NameserverData, The "NameserverData" property +
org.freedesktop.NetworkManager.IP4Config:NameserverData, The "NameserverData" property
-
org.freedesktop.NetworkManager.IP4Config:Nameservers, The "Nameservers" property +
org.freedesktop.NetworkManager.IP4Config:Nameservers, The "Nameservers" property
-
org.freedesktop.NetworkManager.IP4Config:RouteData, The "RouteData" property +
org.freedesktop.NetworkManager.IP4Config:RouteData, The "RouteData" property
-
org.freedesktop.NetworkManager.IP4Config:Routes, The "Routes" property +
org.freedesktop.NetworkManager.IP4Config:Routes, The "Routes" property
-
org.freedesktop.NetworkManager.IP4Config:Searches, The "Searches" property +
org.freedesktop.NetworkManager.IP4Config:Searches, The "Searches" property
-
org.freedesktop.NetworkManager.IP4Config:WinsServerData, The "WinsServerData" property +
org.freedesktop.NetworkManager.IP4Config:WinsServerData, The "WinsServerData" property
-
org.freedesktop.NetworkManager.IP4Config:WinsServers, The "WinsServers" property +
org.freedesktop.NetworkManager.IP4Config:WinsServers, The "WinsServers" property
-
org.freedesktop.NetworkManager.IP6Config, org.freedesktop.NetworkManager.IP6Config +
org.freedesktop.NetworkManager.IP6Config, org.freedesktop.NetworkManager.IP6Config
-
org.freedesktop.NetworkManager.IP6Config::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.IP6Config::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.IP6Config:AddressData, The "AddressData" property +
org.freedesktop.NetworkManager.IP6Config:AddressData, The "AddressData" property
-
org.freedesktop.NetworkManager.IP6Config:Addresses, The "Addresses" property +
org.freedesktop.NetworkManager.IP6Config:Addresses, The "Addresses" property
-
org.freedesktop.NetworkManager.IP6Config:DnsOptions, The "DnsOptions" property +
org.freedesktop.NetworkManager.IP6Config:DnsOptions, The "DnsOptions" property
-
org.freedesktop.NetworkManager.IP6Config:DnsPriority, The "DnsPriority" property +
org.freedesktop.NetworkManager.IP6Config:DnsPriority, The "DnsPriority" property
-
org.freedesktop.NetworkManager.IP6Config:Domains, The "Domains" property +
org.freedesktop.NetworkManager.IP6Config:Domains, The "Domains" property
-
org.freedesktop.NetworkManager.IP6Config:Gateway, The "Gateway" property +
org.freedesktop.NetworkManager.IP6Config:Gateway, The "Gateway" property
-
org.freedesktop.NetworkManager.IP6Config:Nameservers, The "Nameservers" property +
org.freedesktop.NetworkManager.IP6Config:Nameservers, The "Nameservers" property
-
org.freedesktop.NetworkManager.IP6Config:RouteData, The "RouteData" property +
org.freedesktop.NetworkManager.IP6Config:RouteData, The "RouteData" property
-
org.freedesktop.NetworkManager.IP6Config:Routes, The "Routes" property +
org.freedesktop.NetworkManager.IP6Config:Routes, The "Routes" property
-
org.freedesktop.NetworkManager.IP6Config:Searches, The "Searches" property +
org.freedesktop.NetworkManager.IP6Config:Searches, The "Searches" property
-
org.freedesktop.NetworkManager.SecretAgent, org.freedesktop.NetworkManager.SecretAgent +
org.freedesktop.NetworkManager.SecretAgent, org.freedesktop.NetworkManager.SecretAgent
-
org.freedesktop.NetworkManager.SecretAgent.CancelGetSecrets(), The CancelGetSecrets() method +
org.freedesktop.NetworkManager.SecretAgent.CancelGetSecrets(), The CancelGetSecrets() method
-
org.freedesktop.NetworkManager.SecretAgent.DeleteSecrets(), The DeleteSecrets() method +
org.freedesktop.NetworkManager.SecretAgent.DeleteSecrets(), The DeleteSecrets() method
-
org.freedesktop.NetworkManager.SecretAgent.GetSecrets(), The GetSecrets() method +
org.freedesktop.NetworkManager.SecretAgent.GetSecrets(), The GetSecrets() method
-
org.freedesktop.NetworkManager.SecretAgent.SaveSecrets(), The SaveSecrets() method +
org.freedesktop.NetworkManager.SecretAgent.SaveSecrets(), The SaveSecrets() method
-
org.freedesktop.NetworkManager.Settings, org.freedesktop.NetworkManager.Settings +
org.freedesktop.NetworkManager.Settings, org.freedesktop.NetworkManager.Settings
-
org.freedesktop.NetworkManager.Settings.AddConnection(), The AddConnection() method +
org.freedesktop.NetworkManager.Settings.AddConnection(), The AddConnection() method
-
org.freedesktop.NetworkManager.Settings.AddConnection2(), The AddConnection2() method +
org.freedesktop.NetworkManager.Settings.AddConnection2(), The AddConnection2() method
-
org.freedesktop.NetworkManager.Settings.AddConnectionUnsaved(), The AddConnectionUnsaved() method +
org.freedesktop.NetworkManager.Settings.AddConnectionUnsaved(), The AddConnectionUnsaved() method
-
org.freedesktop.NetworkManager.Settings.Connection, org.freedesktop.NetworkManager.Settings.Connection +
org.freedesktop.NetworkManager.Settings.Connection, org.freedesktop.NetworkManager.Settings.Connection
-
org.freedesktop.NetworkManager.Settings.Connection.ClearSecrets(), The ClearSecrets() method +
org.freedesktop.NetworkManager.Settings.Connection.ClearSecrets(), The ClearSecrets() method
-
org.freedesktop.NetworkManager.Settings.Connection.Delete(), The Delete() method +
org.freedesktop.NetworkManager.Settings.Connection.Delete(), The Delete() method
-
org.freedesktop.NetworkManager.Settings.Connection.GetSecrets(), The GetSecrets() method +
org.freedesktop.NetworkManager.Settings.Connection.GetSecrets(), The GetSecrets() method
-
org.freedesktop.NetworkManager.Settings.Connection.GetSettings(), The GetSettings() method +
org.freedesktop.NetworkManager.Settings.Connection.GetSettings(), The GetSettings() method
-
org.freedesktop.NetworkManager.Settings.Connection.Save(), The Save() method +
org.freedesktop.NetworkManager.Settings.Connection.Save(), The Save() method
-
org.freedesktop.NetworkManager.Settings.Connection.Update(), The Update() method +
org.freedesktop.NetworkManager.Settings.Connection.Update(), The Update() method
-
org.freedesktop.NetworkManager.Settings.Connection.Update2(), The Update2() method +
org.freedesktop.NetworkManager.Settings.Connection.Update2(), The Update2() method
-
org.freedesktop.NetworkManager.Settings.Connection.UpdateUnsaved(), The UpdateUnsaved() method +
org.freedesktop.NetworkManager.Settings.Connection.UpdateUnsaved(), The UpdateUnsaved() method
-
org.freedesktop.NetworkManager.Settings.Connection::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Settings.Connection::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Settings.Connection::Removed, The "Removed" signal +
org.freedesktop.NetworkManager.Settings.Connection::Removed, The "Removed" signal
-
org.freedesktop.NetworkManager.Settings.Connection::Updated, The "Updated" signal +
org.freedesktop.NetworkManager.Settings.Connection::Updated, The "Updated" signal
-
org.freedesktop.NetworkManager.Settings.Connection:Filename, The "Filename" property +
org.freedesktop.NetworkManager.Settings.Connection:Filename, The "Filename" property
-
org.freedesktop.NetworkManager.Settings.Connection:Flags, The "Flags" property +
org.freedesktop.NetworkManager.Settings.Connection:Flags, The "Flags" property
-
org.freedesktop.NetworkManager.Settings.Connection:Unsaved, The "Unsaved" property +
org.freedesktop.NetworkManager.Settings.Connection:Unsaved, The "Unsaved" property
-
org.freedesktop.NetworkManager.Settings.GetConnectionByUuid(), The GetConnectionByUuid() method +
org.freedesktop.NetworkManager.Settings.GetConnectionByUuid(), The GetConnectionByUuid() method
-
org.freedesktop.NetworkManager.Settings.ListConnections(), The ListConnections() method +
org.freedesktop.NetworkManager.Settings.ListConnections(), The ListConnections() method
-
org.freedesktop.NetworkManager.Settings.LoadConnections(), The LoadConnections() method +
org.freedesktop.NetworkManager.Settings.LoadConnections(), The LoadConnections() method
-
org.freedesktop.NetworkManager.Settings.ReloadConnections(), The ReloadConnections() method +
org.freedesktop.NetworkManager.Settings.ReloadConnections(), The ReloadConnections() method
-
org.freedesktop.NetworkManager.Settings.SaveHostname(), The SaveHostname() method +
org.freedesktop.NetworkManager.Settings.SaveHostname(), The SaveHostname() method
-
org.freedesktop.NetworkManager.Settings::ConnectionRemoved, The "ConnectionRemoved" signal +
org.freedesktop.NetworkManager.Settings::ConnectionRemoved, The "ConnectionRemoved" signal
-
org.freedesktop.NetworkManager.Settings::NewConnection, The "NewConnection" signal +
org.freedesktop.NetworkManager.Settings::NewConnection, The "NewConnection" signal
-
org.freedesktop.NetworkManager.Settings::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Settings::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Settings:CanModify, The "CanModify" property +
org.freedesktop.NetworkManager.Settings:CanModify, The "CanModify" property
-
org.freedesktop.NetworkManager.Settings:Connections, The "Connections" property +
org.freedesktop.NetworkManager.Settings:Connections, The "Connections" property
-
org.freedesktop.NetworkManager.Settings:Hostname, The "Hostname" property +
org.freedesktop.NetworkManager.Settings:Hostname, The "Hostname" property

A

-
org.freedesktop.NetworkManager.Connection.Active, org.freedesktop.NetworkManager.Connection.Active +
org.freedesktop.NetworkManager.Connection.Active, org.freedesktop.NetworkManager.Connection.Active
-
org.freedesktop.NetworkManager.Connection.Active::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Connection.Active::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Connection.Active::StateChanged, The "StateChanged" signal +
org.freedesktop.NetworkManager.Connection.Active::StateChanged, The "StateChanged" signal
-
org.freedesktop.NetworkManager.Connection.Active:Connection, The "Connection" property +
org.freedesktop.NetworkManager.Connection.Active:Connection, The "Connection" property
-
org.freedesktop.NetworkManager.Connection.Active:Default, The "Default" property +
org.freedesktop.NetworkManager.Connection.Active:Default, The "Default" property
-
org.freedesktop.NetworkManager.Connection.Active:Default6, The "Default6" property +
org.freedesktop.NetworkManager.Connection.Active:Default6, The "Default6" property
-
org.freedesktop.NetworkManager.Connection.Active:Devices, The "Devices" property +
org.freedesktop.NetworkManager.Connection.Active:Devices, The "Devices" property
-
org.freedesktop.NetworkManager.Connection.Active:Dhcp4Config, The "Dhcp4Config" property +
org.freedesktop.NetworkManager.Connection.Active:Dhcp4Config, The "Dhcp4Config" property
-
org.freedesktop.NetworkManager.Connection.Active:Dhcp6Config, The "Dhcp6Config" property +
org.freedesktop.NetworkManager.Connection.Active:Dhcp6Config, The "Dhcp6Config" property
-
org.freedesktop.NetworkManager.Connection.Active:Id, The "Id" property +
org.freedesktop.NetworkManager.Connection.Active:Id, The "Id" property
-
org.freedesktop.NetworkManager.Connection.Active:Ip4Config, The "Ip4Config" property +
org.freedesktop.NetworkManager.Connection.Active:Ip4Config, The "Ip4Config" property
-
org.freedesktop.NetworkManager.Connection.Active:Ip6Config, The "Ip6Config" property +
org.freedesktop.NetworkManager.Connection.Active:Ip6Config, The "Ip6Config" property
-
org.freedesktop.NetworkManager.Connection.Active:Master, The "Master" property +
org.freedesktop.NetworkManager.Connection.Active:Master, The "Master" property
-
org.freedesktop.NetworkManager.Connection.Active:SpecificObject, The "SpecificObject" property +
org.freedesktop.NetworkManager.Connection.Active:SpecificObject, The "SpecificObject" property
-
org.freedesktop.NetworkManager.Connection.Active:State, The "State" property +
org.freedesktop.NetworkManager.Connection.Active:State, The "State" property
-
org.freedesktop.NetworkManager.Connection.Active:StateFlags, The "StateFlags" property +
org.freedesktop.NetworkManager.Connection.Active:StateFlags, The "StateFlags" property
-
org.freedesktop.NetworkManager.Connection.Active:Type, The "Type" property +
org.freedesktop.NetworkManager.Connection.Active:Type, The "Type" property
-
org.freedesktop.NetworkManager.Connection.Active:Uuid, The "Uuid" property +
org.freedesktop.NetworkManager.Connection.Active:Uuid, The "Uuid" property
-
org.freedesktop.NetworkManager.Connection.Active:Vpn, The "Vpn" property +
org.freedesktop.NetworkManager.Connection.Active:Vpn, The "Vpn" property
-
addr-gen-mode, ipv6 +
addr-gen-mode, ipv6
-
address-data, ipv4, ipv6 +
address-data, ipv4, ipv6
-
addresses, ipv4, ipv6 +
addresses, ipv4, ipv6
-
ageing, vxlan +
ageing, vxlan
-
ageing-time, bridge +
ageing-time, bridge
-
altsubject-matches, 802-1x +
altsubject-matches, 802-1x
-
anonymous-identity, 802-1x +
anonymous-identity, 802-1x
-
ap-isolation, 802-11-wireless +
ap-isolation, 802-11-wireless
-
apn, gsm +
apn, gsm
-
app-fcoe-flags, dcb +
app-fcoe-flags, dcb
-
app-fcoe-mode, dcb +
app-fcoe-mode, dcb
-
app-fcoe-priority, dcb +
app-fcoe-priority, dcb
-
app-fip-flags, dcb +
app-fip-flags, dcb
-
app-fip-priority, dcb +
app-fip-priority, dcb
-
app-iscsi-flags, dcb +
app-iscsi-flags, dcb
-
app-iscsi-priority, dcb +
app-iscsi-priority, dcb
-
assigned-mac-address, 802-3-ethernet, 802-11-wireless +
assigned-mac-address, 802-3-ethernet, 802-11-wireless
-
auth-alg, 802-11-wireless-security +
auth-alg, 802-11-wireless-security
-
auth-retries, connection +
auth-retries, connection
-
auth-timeout, 802-1x +
auth-timeout, 802-1x
-
auto-config, gsm +
auto-config, gsm
-
auto-negotiate, 802-3-ethernet +
auto-negotiate, 802-3-ethernet
-
autoconnect, connection +
autoconnect, connection
-
autoconnect-priority, connection +
autoconnect-priority, connection
-
autoconnect-retries, connection +
autoconnect-retries, connection
-
autoconnect-slaves, connection +
autoconnect-slaves, connection
-
autoprobe-drivers, sriov +
autoprobe-drivers, sriov

B

-
band, 802-11-wireless +
band, 802-11-wireless
-
baud, ppp, serial +
baud, ppp, serial
-
bdaddr, bluetooth +
bdaddr, bluetooth
-
bits, serial +
bits, serial
-
bond-downdelay, ovs-port +
bond-downdelay, ovs-port
-
bond-mode, ovs-port +
bond-mode, ovs-port
-
bond-updelay, ovs-port +
bond-updelay, ovs-port
-
browser-only, proxy +
browser-only, proxy
-
bssid, 802-11-wireless +
bssid, 802-11-wireless

C

-
ca-cert, 802-1x +
ca-cert, 802-1x
-
ca-cert-password, 802-1x +
ca-cert-password, 802-1x
-
ca-cert-password-flags, 802-1x +
ca-cert-password-flags, 802-1x
-
ca-path, 802-1x +
ca-path, 802-1x
-
channel, 802-11-olpc-mesh, 802-11-wireless, wpan +
channel, 802-11-olpc-mesh, 802-11-wireless, wpan
-
org.freedesktop.NetworkManager.Checkpoint, org.freedesktop.NetworkManager.Checkpoint +
org.freedesktop.NetworkManager.Checkpoint, org.freedesktop.NetworkManager.Checkpoint
-
org.freedesktop.NetworkManager.Checkpoint::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Checkpoint::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Checkpoint:Created, The "Created" property +
org.freedesktop.NetworkManager.Checkpoint:Created, The "Created" property
-
org.freedesktop.NetworkManager.Checkpoint:Devices, The "Devices" property +
org.freedesktop.NetworkManager.Checkpoint:Devices, The "Devices" property
-
org.freedesktop.NetworkManager.Checkpoint:RollbackTimeout, The "RollbackTimeout" property +
org.freedesktop.NetworkManager.Checkpoint:RollbackTimeout, The "RollbackTimeout" property
-
client-cert, 802-1x +
client-cert, 802-1x
-
client-cert-password, 802-1x +
client-cert-password, 802-1x
-
client-cert-password-flags, 802-1x +
client-cert-password-flags, 802-1x
-
cloned-mac-address, 802-3-ethernet, 802-11-wireless +
cloned-mac-address, 802-3-ethernet, 802-11-wireless
-
config, team, team-port +
config, team, team-port
-
crtscts, ppp +
crtscts, ppp

D

-
dad-timeout, ipv4, ipv6 +
dad-timeout, ipv4, ipv6
-
data, user, vpn, ovs-external-ids +
data, user, vpn, ovs-external-ids
-
datapath-type, ovs-bridge +
datapath-type, ovs-bridge
-
destination-port, vxlan +
destination-port, vxlan
-
devargs, ovs-dpdk +
devargs, ovs-dpdk
-
device-id, gsm +
device-id, gsm
-
org.freedesktop.NetworkManager.Device.Wired, org.freedesktop.NetworkManager.Device.Wired +
org.freedesktop.NetworkManager.Device.Wired, org.freedesktop.NetworkManager.Device.Wired
-
org.freedesktop.NetworkManager.Device.Wired::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Wired::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Wired:Carrier, The "Carrier" property +
org.freedesktop.NetworkManager.Device.Wired:Carrier, The "Carrier" property
-
org.freedesktop.NetworkManager.Device.Wired:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Wired:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Wired:PermHwAddress, The "PermHwAddress" property +
org.freedesktop.NetworkManager.Device.Wired:PermHwAddress, The "PermHwAddress" property
-
org.freedesktop.NetworkManager.Device.Wired:S390Subchannels, The "S390Subchannels" property +
org.freedesktop.NetworkManager.Device.Wired:S390Subchannels, The "S390Subchannels" property
-
org.freedesktop.NetworkManager.Device.Wired:Speed, The "Speed" property +
org.freedesktop.NetworkManager.Device.Wired:Speed, The "Speed" property
-
org.freedesktop.NetworkManager.Device.Wireless, org.freedesktop.NetworkManager.Device.Wireless +
org.freedesktop.NetworkManager.Device.Wireless, org.freedesktop.NetworkManager.Device.Wireless
-
org.freedesktop.NetworkManager.Device.Wireless.GetAccessPoints(), The GetAccessPoints() method +
org.freedesktop.NetworkManager.Device.Wireless.GetAccessPoints(), The GetAccessPoints() method
-
org.freedesktop.NetworkManager.Device.Wireless.GetAllAccessPoints(), The GetAllAccessPoints() method +
org.freedesktop.NetworkManager.Device.Wireless.GetAllAccessPoints(), The GetAllAccessPoints() method
-
org.freedesktop.NetworkManager.Device.Wireless.RequestScan(), The RequestScan() method +
org.freedesktop.NetworkManager.Device.Wireless.RequestScan(), The RequestScan() method
-
org.freedesktop.NetworkManager.Device.Wireless::AccessPointAdded, The "AccessPointAdded" signal +
org.freedesktop.NetworkManager.Device.Wireless::AccessPointAdded, The "AccessPointAdded" signal
-
org.freedesktop.NetworkManager.Device.Wireless::AccessPointRemoved, The "AccessPointRemoved" signal +
org.freedesktop.NetworkManager.Device.Wireless::AccessPointRemoved, The "AccessPointRemoved" signal
-
org.freedesktop.NetworkManager.Device.Wireless::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.Device.Wireless::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.Device.Wireless:AccessPoints, The "AccessPoints" property +
org.freedesktop.NetworkManager.Device.Wireless:AccessPoints, The "AccessPoints" property
-
org.freedesktop.NetworkManager.Device.Wireless:ActiveAccessPoint, The "ActiveAccessPoint" property +
org.freedesktop.NetworkManager.Device.Wireless:ActiveAccessPoint, The "ActiveAccessPoint" property
-
org.freedesktop.NetworkManager.Device.Wireless:Bitrate, The "Bitrate" property +
org.freedesktop.NetworkManager.Device.Wireless:Bitrate, The "Bitrate" property
-
org.freedesktop.NetworkManager.Device.Wireless:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.Wireless:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.Wireless:LastScan, The "LastScan" property +
org.freedesktop.NetworkManager.Device.Wireless:LastScan, The "LastScan" property
-
org.freedesktop.NetworkManager.Device.Wireless:Mode, The "Mode" property +
org.freedesktop.NetworkManager.Device.Wireless:Mode, The "Mode" property
-
org.freedesktop.NetworkManager.Device.Wireless:PermHwAddress, The "PermHwAddress" property +
org.freedesktop.NetworkManager.Device.Wireless:PermHwAddress, The "PermHwAddress" property
-
org.freedesktop.NetworkManager.Device.Wireless:WirelessCapabilities, The "WirelessCapabilities" property +
org.freedesktop.NetworkManager.Device.Wireless:WirelessCapabilities, The "WirelessCapabilities" property
-
org.freedesktop.NetworkManager.Device.WifiP2P, org.freedesktop.NetworkManager.Device.WifiP2P +
org.freedesktop.NetworkManager.Device.WifiP2P, org.freedesktop.NetworkManager.Device.WifiP2P
-
org.freedesktop.NetworkManager.Device.WifiP2P.StartFind(), The StartFind() method +
org.freedesktop.NetworkManager.Device.WifiP2P.StartFind(), The StartFind() method
-
org.freedesktop.NetworkManager.Device.WifiP2P.StopFind(), The StopFind() method +
org.freedesktop.NetworkManager.Device.WifiP2P.StopFind(), The StopFind() method
-
org.freedesktop.NetworkManager.Device.WifiP2P::PeerAdded, The "PeerAdded" signal +
org.freedesktop.NetworkManager.Device.WifiP2P::PeerAdded, The "PeerAdded" signal
-
org.freedesktop.NetworkManager.Device.WifiP2P::PeerRemoved, The "PeerRemoved" signal +
org.freedesktop.NetworkManager.Device.WifiP2P::PeerRemoved, The "PeerRemoved" signal
-
org.freedesktop.NetworkManager.Device.WifiP2P:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.Device.WifiP2P:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.Device.WifiP2P:Peers, The "Peers" property +
org.freedesktop.NetworkManager.Device.WifiP2P:Peers, The "Peers" property
-
dhcp-anycast-address, 802-11-olpc-mesh +
dhcp-anycast-address, 802-11-olpc-mesh
-
dhcp-client-id, ipv4 +
dhcp-client-id, ipv4
-
dhcp-duid, ipv6 +
dhcp-duid, ipv6
-
dhcp-fqdn, ipv4 +
dhcp-fqdn, ipv4
-
dhcp-hostname, ipv4, ipv6 +
dhcp-hostname, ipv4, ipv6
-
dhcp-hostname-flags, ipv4, ipv6 +
dhcp-hostname-flags, ipv4, ipv6
-
dhcp-iaid, ipv4, ipv6 +
dhcp-iaid, ipv4, ipv6
-
dhcp-reject-servers, ipv4, ipv6 +
dhcp-reject-servers, ipv4, ipv6
-
dhcp-send-hostname, ipv4, ipv6 +
dhcp-send-hostname, ipv4, ipv6
-
dhcp-timeout, ipv4, ipv6 +
dhcp-timeout, ipv4, ipv6
-
dhcp-vendor-class-identifier, ipv4 +
dhcp-vendor-class-identifier, ipv4
-
org.freedesktop.NetworkManager.DHCP4Config, org.freedesktop.NetworkManager.DHCP4Config +
org.freedesktop.NetworkManager.DHCP4Config, org.freedesktop.NetworkManager.DHCP4Config
-
org.freedesktop.NetworkManager.DHCP4Config::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.DHCP4Config::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.DHCP4Config:Options, The "Options" property +
org.freedesktop.NetworkManager.DHCP4Config:Options, The "Options" property
-
org.freedesktop.NetworkManager.DHCP6Config, org.freedesktop.NetworkManager.DHCP6Config +
org.freedesktop.NetworkManager.DHCP6Config, org.freedesktop.NetworkManager.DHCP6Config
-
org.freedesktop.NetworkManager.DHCP6Config::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.DHCP6Config::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.DHCP6Config:Options, The "Options" property +
org.freedesktop.NetworkManager.DHCP6Config:Options, The "Options" property
-
dns, ipv4, ipv6 +
dns, ipv4, ipv6
-
dns-options, ipv4, ipv6 +
dns-options, ipv4, ipv6
-
dns-priority, ipv4, ipv6 +
dns-priority, ipv4, ipv6
-
dns-search, ipv4, ipv6 +
dns-search, ipv4, ipv6
-
domain-match, 802-1x +
domain-match, 802-1x
-
domain-suffix-match, 802-1x +
domain-suffix-match, 802-1x
-
driver, match +
driver, match
-
duplex, 802-3-ethernet +
duplex, 802-3-ethernet

E

-
eap, 802-1x +
eap, 802-1x
-
egress-priority-map, vlan +
egress-priority-map, vlan
-
encapsulation, adsl +
encapsulation, adsl
-
encapsulation-limit, ip-tunnel +
encapsulation-limit, ip-tunnel
-
encrypt, macsec +
encrypt, macsec

F

-
fail-mode, ovs-bridge +
fail-mode, ovs-bridge
-
fils, 802-11-wireless-security +
fils, 802-11-wireless-security
-
flags, ip-tunnel, vlan +
flags, ip-tunnel, vlan
-
flow-label, ip-tunnel +
flow-label, ip-tunnel
-
forward-delay, bridge +
forward-delay, bridge
-
from-dhcp, hostname +
from-dhcp, hostname
-
from-dns-lookup, hostname +
from-dns-lookup, hostname
-
fwmark, wireguard +
fwmark, wireguard

G

-
gateway, ipv4, ipv6 +
gateway, ipv4, ipv6
-
gateway-ping-timeout, connection +
gateway-ping-timeout, connection
-
generate-mac-address-mask, 802-3-ethernet, 802-11-wireless +
generate-mac-address-mask, 802-3-ethernet, 802-11-wireless
-
group, tun, 802-11-wireless-security +
group, tun, 802-11-wireless-security
-
group-address, bridge +
group-address, bridge
-
group-forward-mask, bridge +
group-forward-mask, bridge

H

-
hairpin-mode, bridge-port +
hairpin-mode, bridge-port
-
hello-time, bridge +
hello-time, bridge
-
hidden, 802-11-wireless +
hidden, 802-11-wireless
-
home-only, gsm +
home-only, gsm

I

-
id, connection, vlan, vxlan +
id, connection, vlan, vxlan
-
identity, 802-1x +
identity, 802-1x
-
ignore-auto-dns, ipv4, ipv6 +
ignore-auto-dns, ipv4, ipv6
-
ignore-auto-routes, ipv4, ipv6 +
ignore-auto-routes, ipv4, ipv6
-
ingress-priority-map, vlan +
ingress-priority-map, vlan
-
input-key, ip-tunnel +
input-key, ip-tunnel
-
interface-name, connection, bond, bridge, match, team, vlan +
interface-name, connection, bond, bridge, match, team, vlan
-
ip4-auto-default-route, wireguard +
ip4-auto-default-route, wireguard
-
ip6-auto-default-route, wireguard +
ip6-auto-default-route, wireguard
-
ip6-privacy, ipv6 +
ip6-privacy, ipv6

K

-
kernel-command-line, match +
kernel-command-line, match
-
key-mgmt, 802-11-wireless-security +
key-mgmt, 802-11-wireless-security

L

-
l2-miss, vxlan +
l2-miss, vxlan
-
l3-miss, vxlan +
l3-miss, vxlan
-
lacp, ovs-port +
lacp, ovs-port
-
lacp-key, team-port +
lacp-key, team-port
-
lacp-prio, team-port +
lacp-prio, team-port
-
lcp-echo-failure, ppp +
lcp-echo-failure, ppp
-
lcp-echo-interval, ppp +
lcp-echo-interval, ppp
-
leap-password, 802-11-wireless-security +
leap-password, 802-11-wireless-security
-
leap-password-flags, 802-11-wireless-security +
leap-password-flags, 802-11-wireless-security
-
leap-username, 802-11-wireless-security +
leap-username, 802-11-wireless-security
-
learning, vxlan +
learning, vxlan
-
limit, vxlan +
limit, vxlan
-
link-watchers, team, team-port +
link-watchers, team, team-port
-
listen-port, wireguard +
listen-port, wireguard
-
lldp, connection +
lldp, connection
-
llmnr, connection +
llmnr, connection
-
local, ip-tunnel, vxlan +
local, ip-tunnel, vxlan

M

-
mac-address, bridge, infiniband, wimax, 802-3-ethernet, 802-11-wireless, wpan +
mac-address, bridge, infiniband, wimax, 802-3-ethernet, 802-11-wireless, wpan
-
mac-address-blacklist, 802-3-ethernet, 802-11-wireless +
mac-address-blacklist, 802-3-ethernet, 802-11-wireless
-
mac-address-randomization, 802-11-wireless +
mac-address-randomization, 802-11-wireless
-
org.freedesktop.NetworkManager, org.freedesktop.NetworkManager +
org.freedesktop.NetworkManager, org.freedesktop.NetworkManager
-
org.freedesktop.NetworkManager.ActivateConnection(), The ActivateConnection() method +
org.freedesktop.NetworkManager.ActivateConnection(), The ActivateConnection() method
-
org.freedesktop.NetworkManager.AddAndActivateConnection(), The AddAndActivateConnection() method +
org.freedesktop.NetworkManager.AddAndActivateConnection(), The AddAndActivateConnection() method
-
org.freedesktop.NetworkManager.AddAndActivateConnection2(), The AddAndActivateConnection2() method +
org.freedesktop.NetworkManager.AddAndActivateConnection2(), The AddAndActivateConnection2() method
-
org.freedesktop.NetworkManager.CheckConnectivity(), The CheckConnectivity() method +
org.freedesktop.NetworkManager.CheckConnectivity(), The CheckConnectivity() method
-
org.freedesktop.NetworkManager.CheckpointAdjustRollbackTimeout(), The CheckpointAdjustRollbackTimeout() method +
org.freedesktop.NetworkManager.CheckpointAdjustRollbackTimeout(), The CheckpointAdjustRollbackTimeout() method
-
org.freedesktop.NetworkManager.CheckpointCreate(), The CheckpointCreate() method +
org.freedesktop.NetworkManager.CheckpointCreate(), The CheckpointCreate() method
-
org.freedesktop.NetworkManager.CheckpointDestroy(), The CheckpointDestroy() method +
org.freedesktop.NetworkManager.CheckpointDestroy(), The CheckpointDestroy() method
-
org.freedesktop.NetworkManager.CheckpointRollback(), The CheckpointRollback() method +
org.freedesktop.NetworkManager.CheckpointRollback(), The CheckpointRollback() method
-
org.freedesktop.NetworkManager.DeactivateConnection(), The DeactivateConnection() method +
org.freedesktop.NetworkManager.DeactivateConnection(), The DeactivateConnection() method
-
org.freedesktop.NetworkManager.Enable(), The Enable() method +
org.freedesktop.NetworkManager.Enable(), The Enable() method
-
org.freedesktop.NetworkManager.GetAllDevices(), The GetAllDevices() method +
org.freedesktop.NetworkManager.GetAllDevices(), The GetAllDevices() method
-
org.freedesktop.NetworkManager.GetDeviceByIpIface(), The GetDeviceByIpIface() method +
org.freedesktop.NetworkManager.GetDeviceByIpIface(), The GetDeviceByIpIface() method
-
org.freedesktop.NetworkManager.GetDevices(), The GetDevices() method +
org.freedesktop.NetworkManager.GetDevices(), The GetDevices() method
-
org.freedesktop.NetworkManager.GetLogging(), The GetLogging() method +
org.freedesktop.NetworkManager.GetLogging(), The GetLogging() method
-
org.freedesktop.NetworkManager.GetPermissions(), The GetPermissions() method +
org.freedesktop.NetworkManager.GetPermissions(), The GetPermissions() method
-
org.freedesktop.NetworkManager.Reload(), The Reload() method +
org.freedesktop.NetworkManager.Reload(), The Reload() method
-
org.freedesktop.NetworkManager.SetLogging(), The SetLogging() method +
org.freedesktop.NetworkManager.SetLogging(), The SetLogging() method
-
org.freedesktop.NetworkManager.Sleep(), The Sleep() method +
org.freedesktop.NetworkManager.Sleep(), The Sleep() method
-
org.freedesktop.NetworkManager.state(), The state() method +
org.freedesktop.NetworkManager.state(), The state() method
-
org.freedesktop.NetworkManager::CheckPermissions, The "CheckPermissions" signal +
org.freedesktop.NetworkManager::CheckPermissions, The "CheckPermissions" signal
-
org.freedesktop.NetworkManager::DeviceAdded, The "DeviceAdded" signal +
org.freedesktop.NetworkManager::DeviceAdded, The "DeviceAdded" signal
-
org.freedesktop.NetworkManager::DeviceRemoved, The "DeviceRemoved" signal +
org.freedesktop.NetworkManager::DeviceRemoved, The "DeviceRemoved" signal
-
org.freedesktop.NetworkManager::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager::StateChanged, The "StateChanged" signal +
org.freedesktop.NetworkManager::StateChanged, The "StateChanged" signal
-
org.freedesktop.NetworkManager:ActivatingConnection, The "ActivatingConnection" property +
org.freedesktop.NetworkManager:ActivatingConnection, The "ActivatingConnection" property
-
org.freedesktop.NetworkManager:ActiveConnections, The "ActiveConnections" property +
org.freedesktop.NetworkManager:ActiveConnections, The "ActiveConnections" property
-
org.freedesktop.NetworkManager:AllDevices, The "AllDevices" property +
org.freedesktop.NetworkManager:AllDevices, The "AllDevices" property
-
org.freedesktop.NetworkManager:Capabilities, The "Capabilities" property +
org.freedesktop.NetworkManager:Capabilities, The "Capabilities" property
-
org.freedesktop.NetworkManager:Checkpoints, The "Checkpoints" property +
org.freedesktop.NetworkManager:Checkpoints, The "Checkpoints" property
-
org.freedesktop.NetworkManager:Connectivity, The "Connectivity" property +
org.freedesktop.NetworkManager:Connectivity, The "Connectivity" property
-
org.freedesktop.NetworkManager:ConnectivityCheckAvailable, The "ConnectivityCheckAvailable" property +
org.freedesktop.NetworkManager:ConnectivityCheckAvailable, The "ConnectivityCheckAvailable" property
-
org.freedesktop.NetworkManager:ConnectivityCheckEnabled, The "ConnectivityCheckEnabled" property +
org.freedesktop.NetworkManager:ConnectivityCheckEnabled, The "ConnectivityCheckEnabled" property
-
org.freedesktop.NetworkManager:ConnectivityCheckUri, The "ConnectivityCheckUri" property +
org.freedesktop.NetworkManager:ConnectivityCheckUri, The "ConnectivityCheckUri" property
-
org.freedesktop.NetworkManager:Devices, The "Devices" property +
org.freedesktop.NetworkManager:Devices, The "Devices" property
-
org.freedesktop.NetworkManager:GlobalDnsConfiguration, The "GlobalDnsConfiguration" property +
org.freedesktop.NetworkManager:GlobalDnsConfiguration, The "GlobalDnsConfiguration" property
-
org.freedesktop.NetworkManager:Metered, The "Metered" property +
org.freedesktop.NetworkManager:Metered, The "Metered" property
-
org.freedesktop.NetworkManager:NetworkingEnabled, The "NetworkingEnabled" property +
org.freedesktop.NetworkManager:NetworkingEnabled, The "NetworkingEnabled" property
-
org.freedesktop.NetworkManager:PrimaryConnection, The "PrimaryConnection" property +
org.freedesktop.NetworkManager:PrimaryConnection, The "PrimaryConnection" property
-
org.freedesktop.NetworkManager:PrimaryConnectionType, The "PrimaryConnectionType" property +
org.freedesktop.NetworkManager:PrimaryConnectionType, The "PrimaryConnectionType" property
-
org.freedesktop.NetworkManager:Startup, The "Startup" property +
org.freedesktop.NetworkManager:Startup, The "Startup" property
-
org.freedesktop.NetworkManager:State, The "State" property +
org.freedesktop.NetworkManager:State, The "State" property
-
org.freedesktop.NetworkManager:Version, The "Version" property +
org.freedesktop.NetworkManager:Version, The "Version" property
-
org.freedesktop.NetworkManager:WimaxEnabled, The "WimaxEnabled" property +
org.freedesktop.NetworkManager:WimaxEnabled, The "WimaxEnabled" property
-
org.freedesktop.NetworkManager:WimaxHardwareEnabled, The "WimaxHardwareEnabled" property +
org.freedesktop.NetworkManager:WimaxHardwareEnabled, The "WimaxHardwareEnabled" property
-
org.freedesktop.NetworkManager:WirelessEnabled, The "WirelessEnabled" property +
org.freedesktop.NetworkManager:WirelessEnabled, The "WirelessEnabled" property
-
org.freedesktop.NetworkManager:WirelessHardwareEnabled, The "WirelessHardwareEnabled" property +
org.freedesktop.NetworkManager:WirelessHardwareEnabled, The "WirelessHardwareEnabled" property
-
org.freedesktop.NetworkManager:WwanEnabled, The "WwanEnabled" property +
org.freedesktop.NetworkManager:WwanEnabled, The "WwanEnabled" property
-
org.freedesktop.NetworkManager:WwanHardwareEnabled, The "WwanHardwareEnabled" property +
org.freedesktop.NetworkManager:WwanHardwareEnabled, The "WwanHardwareEnabled" property
-
master, connection +
master, connection
-
max-age, bridge +
max-age, bridge
-
may-fail, ipv4, ipv6 +
may-fail, ipv4, ipv6
-
mcast-rejoin-count, team +
mcast-rejoin-count, team
-
mcast-rejoin-interval, team +
mcast-rejoin-interval, team
-
mcast-snooping-enable, ovs-bridge +
mcast-snooping-enable, ovs-bridge
-
mdns, connection +
mdns, connection
-
metered, connection +
metered, connection
-
method, ipv4, ipv6, proxy +
method, ipv4, ipv6, proxy
-
mka-cak, macsec +
mka-cak, macsec
-
mka-cak-flags, macsec +
mka-cak-flags, macsec
-
mka-ckn, macsec +
mka-ckn, macsec
-
mode, ip-tunnel, macsec, macvlan, tun, 802-11-wireless +
mode, ip-tunnel, macsec, macvlan, tun, 802-11-wireless
-
mppe-stateful, ppp +
mppe-stateful, ppp
-
mru, ppp +
mru, ppp
-
mtu, cdma, gsm, infiniband, ip-tunnel, ppp, 802-3-ethernet, wireguard, 802-11-wireless +
mtu, cdma, gsm, infiniband, ip-tunnel, ppp, 802-3-ethernet, wireguard, 802-11-wireless
-
mud-url, connection +
mud-url, connection
-
multi-connect, connection +
multi-connect, connection
-
multi-queue, tun +
multi-queue, tun
-
multicast-hash-max, bridge +
multicast-hash-max, bridge
-
multicast-last-member-count, bridge +
multicast-last-member-count, bridge
-
multicast-last-member-interval, bridge +
multicast-last-member-interval, bridge
-
multicast-membership-interval, bridge +
multicast-membership-interval, bridge
-
multicast-querier, bridge +
multicast-querier, bridge
-
multicast-querier-interval, bridge +
multicast-querier-interval, bridge
-
multicast-query-interval, bridge +
multicast-query-interval, bridge
-
multicast-query-response-interval, bridge +
multicast-query-response-interval, bridge
-
multicast-query-use-ifaddr, bridge +
multicast-query-use-ifaddr, bridge
-
multicast-router, bridge +
multicast-router, bridge
-
multicast-snooping, bridge +
multicast-snooping, bridge
-
multicast-startup-query-count, bridge +
multicast-startup-query-count, bridge
-
multicast-startup-query-interval, bridge +
multicast-startup-query-interval, bridge

N

-
network-id, gsm +
network-id, gsm
-
network-name, wimax +
network-name, wimax
-
never-default, ipv4, ipv6 +
never-default, ipv4, ipv6
-
NM80211ApFlags, enum NM80211ApFlags +
NM80211ApFlags, enum NM80211ApFlags
-
NM80211ApSecurityFlags, enum NM80211ApSecurityFlags +
NM80211ApSecurityFlags, enum NM80211ApSecurityFlags
-
NM80211Mode, enum NM80211Mode +
NM80211Mode, enum NM80211Mode
-
NMActivationStateFlags, enum NMActivationStateFlags +
NMActivationStateFlags, enum NMActivationStateFlags
-
NMActiveConnectionState, enum NMActiveConnectionState +
NMActiveConnectionState, enum NMActiveConnectionState
-
NMActiveConnectionStateReason, enum NMActiveConnectionStateReason +
NMActiveConnectionStateReason, enum NMActiveConnectionStateReason
-
NMBluetoothCapabilities, enum NMBluetoothCapabilities +
NMBluetoothCapabilities, enum NMBluetoothCapabilities
-
NMCapability, enum NMCapability +
NMCapability, enum NMCapability
-
NMCheckpointCreateFlags, enum NMCheckpointCreateFlags +
NMCheckpointCreateFlags, enum NMCheckpointCreateFlags
-
NMClientPermission, enum NMClientPermission +
NMClientPermission, enum NMClientPermission
-
NMClientPermissionResult, enum NMClientPermissionResult +
NMClientPermissionResult, enum NMClientPermissionResult
-
NMConnectionMultiConnect, enum NMConnectionMultiConnect +
NMConnectionMultiConnect, enum NMConnectionMultiConnect
-
NMConnectivityState, enum NMConnectivityState +
NMConnectivityState, enum NMConnectivityState
-
NMDeviceCapabilities, enum NMDeviceCapabilities +
NMDeviceCapabilities, enum NMDeviceCapabilities
-
NMDeviceInterfaceFlags, enum NMDeviceInterfaceFlags +
NMDeviceInterfaceFlags, enum NMDeviceInterfaceFlags
-
NMDeviceModemCapabilities, enum NMDeviceModemCapabilities +
NMDeviceModemCapabilities, enum NMDeviceModemCapabilities
-
NMDeviceState, enum NMDeviceState +
NMDeviceState, enum NMDeviceState
-
NMDeviceStateReason, enum NMDeviceStateReason +
NMDeviceStateReason, enum NMDeviceStateReason
-
NMDeviceType, enum NMDeviceType +
NMDeviceType, enum NMDeviceType
-
NMDeviceWifiCapabilities, enum NMDeviceWifiCapabilities +
NMDeviceWifiCapabilities, enum NMDeviceWifiCapabilities
-
NMIPTunnelMode, enum NMIPTunnelMode +
NMIPTunnelMode, enum NMIPTunnelMode
-
NMManagerReloadFlags, enum NMManagerReloadFlags +
NMManagerReloadFlags, enum NMManagerReloadFlags
-
NMMetered, enum NMMetered +
NMMetered, enum NMMetered
-
NMRollbackResult, enum NMRollbackResult +
NMRollbackResult, enum NMRollbackResult
-
NMSecretAgentCapabilities, enum NMSecretAgentCapabilities +
NMSecretAgentCapabilities, enum NMSecretAgentCapabilities
-
NMSecretAgentGetSecretsFlags, enum NMSecretAgentGetSecretsFlags +
NMSecretAgentGetSecretsFlags, enum NMSecretAgentGetSecretsFlags
-
NMSettingsAddConnection2Flags, enum NMSettingsAddConnection2Flags +
NMSettingsAddConnection2Flags, enum NMSettingsAddConnection2Flags
-
NMSettingsConnectionFlags, enum NMSettingsConnectionFlags +
NMSettingsConnectionFlags, enum NMSettingsConnectionFlags
-
NMSettingsUpdate2Flags, enum NMSettingsUpdate2Flags +
NMSettingsUpdate2Flags, enum NMSettingsUpdate2Flags
-
NMState, enum NMState +
NMState, enum NMState
-
NMTernary, enum NMTernary +
NMTernary, enum NMTernary
-
NMVpnConnectionState, enum NMVpnConnectionState +
NMVpnConnectionState, enum NMVpnConnectionState
-
NMVpnConnectionStateReason, enum NMVpnConnectionStateReason +
NMVpnConnectionStateReason, enum NMVpnConnectionStateReason
-
NMVpnPluginFailure, enum NMVpnPluginFailure +
NMVpnPluginFailure, enum NMVpnPluginFailure
-
NMVpnServiceState, enum NMVpnServiceState +
NMVpnServiceState, enum NMVpnServiceState
-
NMWimaxNspNetworkType, enum NMWimaxNspNetworkType +
NMWimaxNspNetworkType, enum NMWimaxNspNetworkType
-
no-vj-comp, ppp +
no-vj-comp, ppp
-
noauth, ppp +
noauth, ppp
-
nobsdcomp, ppp +
nobsdcomp, ppp
-
nodeflate, ppp +
nodeflate, ppp
-
notify-peers-count, team +
notify-peers-count, team
-
notify-peers-interval, team +
notify-peers-interval, team
-
number, cdma, gsm +
number, cdma, gsm

O

-
only-from-default, hostname +
only-from-default, hostname
-
optional, 802-1x +
optional, 802-1x
-
options, bond +
options, bond
-
output-key, ip-tunnel +
output-key, ip-tunnel
-
owner, tun +
owner, tun

P

-
p-key, infiniband +
p-key, infiniband
-
pac-file, 802-1x +
pac-file, 802-1x
-
pac-script, proxy +
pac-script, proxy
-
pac-url, proxy +
pac-url, proxy
-
page, wpan +
page, wpan
-
pairwise, 802-11-wireless-security +
pairwise, 802-11-wireless-security
-
pan-id, wpan +
pan-id, wpan
-
parent, 6lowpan, infiniband, ip-tunnel, macsec, macvlan, pppoe, vlan, vxlan +
parent, 6lowpan, infiniband, ip-tunnel, macsec, macvlan, pppoe, vlan, vxlan
-
parity, serial +
parity, serial
-
password, 802-1x, adsl, cdma, gsm, pppoe +
password, 802-1x, adsl, cdma, gsm, pppoe
-
password-flags, 802-1x, adsl, cdma, gsm, pppoe +
password-flags, 802-1x, adsl, cdma, gsm, pppoe
-
password-raw, 802-1x +
password-raw, 802-1x
-
password-raw-flags, 802-1x +
password-raw-flags, 802-1x
-
path, match +
path, match
-
path-cost, bridge-port +
path-cost, bridge-port
-
path-mtu-discovery, ip-tunnel +
path-mtu-discovery, ip-tunnel
-
peer, ovs-patch, wifi-p2p, veth +
peer, ovs-patch, wifi-p2p, veth
-
peer-routes, wireguard +
peer-routes, wireguard
-
peers, wireguard +
peers, wireguard
-
permissions, connection +
permissions, connection
-
persistent, vpn +
persistent, vpn
-
phase1-auth-flags, 802-1x +
phase1-auth-flags, 802-1x
-
phase1-fast-provisioning, 802-1x +
phase1-fast-provisioning, 802-1x
-
phase1-peaplabel, 802-1x +
phase1-peaplabel, 802-1x
-
phase1-peapver, 802-1x +
phase1-peapver, 802-1x
-
phase2-altsubject-matches, 802-1x +
phase2-altsubject-matches, 802-1x
-
phase2-auth, 802-1x +
phase2-auth, 802-1x
-
phase2-autheap, 802-1x +
phase2-autheap, 802-1x
-
phase2-ca-cert, 802-1x +
phase2-ca-cert, 802-1x
-
phase2-ca-cert-password, 802-1x +
phase2-ca-cert-password, 802-1x
-
phase2-ca-cert-password-flags, 802-1x +
phase2-ca-cert-password-flags, 802-1x
-
phase2-ca-path, 802-1x +
phase2-ca-path, 802-1x
-
phase2-client-cert, 802-1x +
phase2-client-cert, 802-1x
-
phase2-client-cert-password, 802-1x +
phase2-client-cert-password, 802-1x
-
phase2-client-cert-password-flags, 802-1x +
phase2-client-cert-password-flags, 802-1x
-
phase2-domain-match, 802-1x +
phase2-domain-match, 802-1x
-
phase2-domain-suffix-match, 802-1x +
phase2-domain-suffix-match, 802-1x
-
phase2-private-key, 802-1x +
phase2-private-key, 802-1x
-
phase2-private-key-password, 802-1x +
phase2-private-key-password, 802-1x
-
phase2-private-key-password-flags, 802-1x +
phase2-private-key-password-flags, 802-1x
-
phase2-subject-match, 802-1x +
phase2-subject-match, 802-1x
-
pi, tun +
pi, tun
-
pin, 802-1x, gsm +
pin, 802-1x, gsm
-
pin-flags, 802-1x, gsm +
pin-flags, 802-1x, gsm
-
pmf, 802-11-wireless-security +
pmf, 802-11-wireless-security
-
port, macsec, 802-3-ethernet +
port, macsec, 802-3-ethernet
-
powersave, 802-11-wireless +
powersave, 802-11-wireless
-
org.freedesktop.NetworkManager.PPP, org.freedesktop.NetworkManager.PPP +
org.freedesktop.NetworkManager.PPP, org.freedesktop.NetworkManager.PPP
-
org.freedesktop.NetworkManager.PPP.NeedSecrets(), The NeedSecrets() method +
org.freedesktop.NetworkManager.PPP.NeedSecrets(), The NeedSecrets() method
-
org.freedesktop.NetworkManager.PPP.SetIfindex(), The SetIfindex() method +
org.freedesktop.NetworkManager.PPP.SetIfindex(), The SetIfindex() method
-
org.freedesktop.NetworkManager.PPP.SetIp4Config(), The SetIp4Config() method +
org.freedesktop.NetworkManager.PPP.SetIp4Config(), The SetIp4Config() method
-
org.freedesktop.NetworkManager.PPP.SetIp6Config(), The SetIp6Config() method +
org.freedesktop.NetworkManager.PPP.SetIp6Config(), The SetIp6Config() method
-
org.freedesktop.NetworkManager.PPP.SetState(), The SetState() method +
org.freedesktop.NetworkManager.PPP.SetState(), The SetState() method
-
prio, team-port +
prio, team-port
-
priority, bridge, bridge-port, hostname +
priority, bridge, bridge-port, hostname
-
priority-bandwidth, dcb +
priority-bandwidth, dcb
-
priority-flow-control, dcb +
priority-flow-control, dcb
-
priority-flow-control-flags, dcb +
priority-flow-control-flags, dcb
-
priority-group-bandwidth, dcb +
priority-group-bandwidth, dcb
-
priority-group-flags, dcb +
priority-group-flags, dcb
-
priority-group-id, dcb +
priority-group-id, dcb
-
priority-strict-bandwidth, dcb +
priority-strict-bandwidth, dcb
-
priority-traffic-class, dcb +
priority-traffic-class, dcb
-
private-key, 802-1x, wireguard +
private-key, 802-1x, wireguard
-
private-key-flags, wireguard +
private-key-flags, wireguard
-
private-key-password, 802-1x +
private-key-password, 802-1x
-
private-key-password-flags, 802-1x +
private-key-password-flags, 802-1x
-
promiscuous, macvlan +
promiscuous, macvlan
-
proto, 802-11-wireless-security +
proto, 802-11-wireless-security
-
protocol, adsl +
protocol, adsl
-
proxy, vxlan +
proxy, vxlan
-
psk, 802-11-wireless-security +
psk, 802-11-wireless-security
-
psk-flags, 802-11-wireless-security +
psk-flags, 802-11-wireless-security

Q

-
qdiscs, tc +
qdiscs, tc
-
queue-id, team-port +
queue-id, team-port

R

-
ra-timeout, ipv6 +
ra-timeout, ipv6
-
rate, 802-11-wireless +
rate, 802-11-wireless
-
read-only, connection +
read-only, connection
-
refuse-chap, ppp +
refuse-chap, ppp
-
refuse-eap, ppp +
refuse-eap, ppp
-
refuse-mschap, ppp +
refuse-mschap, ppp
-
refuse-mschapv2, ppp +
refuse-mschapv2, ppp
-
refuse-pap, ppp +
refuse-pap, ppp
-
remote, ip-tunnel, vxlan +
remote, ip-tunnel, vxlan
-
require-mppe, ppp +
require-mppe, ppp
-
require-mppe-128, ppp +
require-mppe-128, ppp
-
route-data, ipv4, ipv6 +
route-data, ipv4, ipv6
-
route-metric, ipv4, ipv6 +
route-metric, ipv4, ipv6
-
route-table, ipv4, ipv6 +
route-table, ipv4, ipv6
-
routes, ipv4, ipv6 +
routes, ipv4, ipv6
-
rsc, vxlan +
rsc, vxlan
-
rstp-enable, ovs-bridge +
rstp-enable, ovs-bridge
-
runner, team +
runner, team
-
runner-active, team +
runner-active, team
-
runner-agg-select-policy, team +
runner-agg-select-policy, team
-
runner-fast-rate, team +
runner-fast-rate, team
-
runner-hwaddr-policy, team +
runner-hwaddr-policy, team
-
runner-min-ports, team +
runner-min-ports, team
-
runner-sys-prio, team +
runner-sys-prio, team
-
runner-tx-balancer, team +
runner-tx-balancer, team
-
runner-tx-balancer-interval, team +
runner-tx-balancer-interval, team
-
runner-tx-hash, team +
runner-tx-hash, team

S

-
s390-nettype, 802-3-ethernet +
s390-nettype, 802-3-ethernet
-
s390-options, 802-3-ethernet +
s390-options, 802-3-ethernet
-
s390-subchannels, 802-3-ethernet +
s390-subchannels, 802-3-ethernet
-
secondaries, connection +
secondaries, connection
-
secrets, vpn +
secrets, vpn
-
security, 802-11-wireless +
security, 802-11-wireless
-
seen-bssids, 802-11-wireless +
seen-bssids, 802-11-wireless
-
send-delay, serial +
send-delay, serial
-
send-sci, macsec +
send-sci, macsec
-
service, pppoe +
service, pppoe
-
service-type, vpn +
service-type, vpn
-
short-address, wpan +
short-address, wpan
-
sim-id, gsm +
sim-id, gsm
-
sim-operator-id, gsm +
sim-operator-id, gsm
-
slave-type, connection +
slave-type, connection
-
source-port-max, vxlan +
source-port-max, vxlan
-
source-port-min, vxlan +
source-port-min, vxlan
-
speed, 802-3-ethernet +
speed, 802-3-ethernet
-
ssid, 802-11-olpc-mesh, 802-11-wireless +
ssid, 802-11-olpc-mesh, 802-11-wireless
-
stable-id, connection +
stable-id, connection
-
sticky, team-port +
sticky, team-port
-
stopbits, serial +
stopbits, serial
-
stp, bridge +
stp, bridge
-
stp-enable, ovs-bridge +
stp-enable, ovs-bridge
-
subject-match, 802-1x +
subject-match, 802-1x
-
system-ca-certs, 802-1x +
system-ca-certs, 802-1x

T

-
table, vrf +
table, vrf
-
tag, ovs-port +
tag, ovs-port
-
tap, macvlan +
tap, macvlan
-
tfilters, tc +
tfilters, tc
-
timeout, vpn +
timeout, vpn
-
timestamp, connection +
timestamp, connection
-
token, ipv6 +
token, ipv6
-
tos, ip-tunnel, vxlan +
tos, ip-tunnel, vxlan
-
total-vfs, sriov +
total-vfs, sriov
-
transport-mode, infiniband +
transport-mode, infiniband
-
ttl, ip-tunnel, vxlan +
ttl, ip-tunnel, vxlan
-
tx-power, 802-11-wireless +
tx-power, 802-11-wireless
-
type, connection, bluetooth, ovs-interface +
type, connection, bluetooth, ovs-interface

U

-
user-name, vpn +
user-name, vpn
-
username, adsl, cdma, gsm, pppoe +
username, adsl, cdma, gsm, pppoe
-
uuid, connection +
uuid, connection

V

-
validation, macsec +
validation, macsec
-
vci, adsl +
vci, adsl
-
vfs, sriov +
vfs, sriov
-
vlan-default-pvid, bridge +
vlan-default-pvid, bridge
-
vlan-filtering, bridge +
vlan-filtering, bridge
-
vlan-mode, ovs-port +
vlan-mode, ovs-port
-
vlan-protocol, bridge +
vlan-protocol, bridge
-
vlan-stats-enabled, bridge +
vlan-stats-enabled, bridge
-
vlans, bridge, bridge-port +
vlans, bridge, bridge-port
-
vnet-hdr, tun +
vnet-hdr, tun
-
vpi, adsl +
vpi, adsl
-
org.freedesktop.NetworkManager.VPN.Connection, org.freedesktop.NetworkManager.VPN.Connection +
org.freedesktop.NetworkManager.VPN.Connection, org.freedesktop.NetworkManager.VPN.Connection
-
org.freedesktop.NetworkManager.VPN.Connection::PropertiesChanged, The "PropertiesChanged" signal +
org.freedesktop.NetworkManager.VPN.Connection::PropertiesChanged, The "PropertiesChanged" signal
-
org.freedesktop.NetworkManager.VPN.Connection::VpnStateChanged, The "VpnStateChanged" signal +
org.freedesktop.NetworkManager.VPN.Connection::VpnStateChanged, The "VpnStateChanged" signal
-
org.freedesktop.NetworkManager.VPN.Connection:Banner, The "Banner" property +
org.freedesktop.NetworkManager.VPN.Connection:Banner, The "Banner" property
-
org.freedesktop.NetworkManager.VPN.Connection:VpnState, The "VpnState" property +
org.freedesktop.NetworkManager.VPN.Connection:VpnState, The "VpnState" property
-
org.freedesktop.NetworkManager.VPN.Plugin, org.freedesktop.NetworkManager.VPN.Plugin +
org.freedesktop.NetworkManager.VPN.Plugin, org.freedesktop.NetworkManager.VPN.Plugin
-
org.freedesktop.NetworkManager.VPN.Plugin.Connect(), The Connect() method +
org.freedesktop.NetworkManager.VPN.Plugin.Connect(), The Connect() method
-
org.freedesktop.NetworkManager.VPN.Plugin.ConnectInteractive(), The ConnectInteractive() method +
org.freedesktop.NetworkManager.VPN.Plugin.ConnectInteractive(), The ConnectInteractive() method
-
org.freedesktop.NetworkManager.VPN.Plugin.Disconnect(), The Disconnect() method +
org.freedesktop.NetworkManager.VPN.Plugin.Disconnect(), The Disconnect() method
-
org.freedesktop.NetworkManager.VPN.Plugin.NeedSecrets(), The NeedSecrets() method +
org.freedesktop.NetworkManager.VPN.Plugin.NeedSecrets(), The NeedSecrets() method
-
org.freedesktop.NetworkManager.VPN.Plugin.NewSecrets(), The NewSecrets() method +
org.freedesktop.NetworkManager.VPN.Plugin.NewSecrets(), The NewSecrets() method
-
org.freedesktop.NetworkManager.VPN.Plugin.SetConfig(), The SetConfig() method +
org.freedesktop.NetworkManager.VPN.Plugin.SetConfig(), The SetConfig() method
-
org.freedesktop.NetworkManager.VPN.Plugin.SetFailure(), The SetFailure() method +
org.freedesktop.NetworkManager.VPN.Plugin.SetFailure(), The SetFailure() method
-
org.freedesktop.NetworkManager.VPN.Plugin.SetIp4Config(), The SetIp4Config() method +
org.freedesktop.NetworkManager.VPN.Plugin.SetIp4Config(), The SetIp4Config() method
-
org.freedesktop.NetworkManager.VPN.Plugin.SetIp6Config(), The SetIp6Config() method +
org.freedesktop.NetworkManager.VPN.Plugin.SetIp6Config(), The SetIp6Config() method
-
org.freedesktop.NetworkManager.VPN.Plugin::Config, The "Config" signal +
org.freedesktop.NetworkManager.VPN.Plugin::Config, The "Config" signal
-
org.freedesktop.NetworkManager.VPN.Plugin::Failure, The "Failure" signal +
org.freedesktop.NetworkManager.VPN.Plugin::Failure, The "Failure" signal
-
org.freedesktop.NetworkManager.VPN.Plugin::Ip4Config, The "Ip4Config" signal +
org.freedesktop.NetworkManager.VPN.Plugin::Ip4Config, The "Ip4Config" signal
-
org.freedesktop.NetworkManager.VPN.Plugin::Ip6Config, The "Ip6Config" signal +
org.freedesktop.NetworkManager.VPN.Plugin::Ip6Config, The "Ip6Config" signal
-
org.freedesktop.NetworkManager.VPN.Plugin::LoginBanner, The "LoginBanner" signal +
org.freedesktop.NetworkManager.VPN.Plugin::LoginBanner, The "LoginBanner" signal
-
org.freedesktop.NetworkManager.VPN.Plugin::SecretsRequired, The "SecretsRequired" signal +
org.freedesktop.NetworkManager.VPN.Plugin::SecretsRequired, The "SecretsRequired" signal
-
org.freedesktop.NetworkManager.VPN.Plugin::StateChanged, The "StateChanged" signal +
org.freedesktop.NetworkManager.VPN.Plugin::StateChanged, The "StateChanged" signal
-
org.freedesktop.NetworkManager.VPN.Plugin:State, The "State" property +
org.freedesktop.NetworkManager.VPN.Plugin:State, The "State" property

W

-
wait-device-timeout, connection +
wait-device-timeout, connection
-
wake-on-lan, 802-3-ethernet +
wake-on-lan, 802-3-ethernet
-
wake-on-lan-password, 802-3-ethernet +
wake-on-lan-password, 802-3-ethernet
-
wake-on-wlan, 802-11-wireless +
wake-on-wlan, 802-11-wireless
-
wep-key-flags, 802-11-wireless-security +
wep-key-flags, 802-11-wireless-security
-
wep-key-type, 802-11-wireless-security +
wep-key-type, 802-11-wireless-security
-
wep-key0, 802-11-wireless-security +
wep-key0, 802-11-wireless-security
-
wep-key1, 802-11-wireless-security +
wep-key1, 802-11-wireless-security
-
wep-key2, 802-11-wireless-security +
wep-key2, 802-11-wireless-security
-
wep-key3, 802-11-wireless-security +
wep-key3, 802-11-wireless-security
-
wep-tx-keyidx, 802-11-wireless-security +
wep-tx-keyidx, 802-11-wireless-security
-
wfd-ies, wifi-p2p +
wfd-ies, wifi-p2p
-
org.freedesktop.NetworkManager.WifiP2PPeer, org.freedesktop.NetworkManager.WifiP2PPeer +
org.freedesktop.NetworkManager.WifiP2PPeer, org.freedesktop.NetworkManager.WifiP2PPeer
-
org.freedesktop.NetworkManager.WifiP2PPeer:Flags, The "Flags" property +
org.freedesktop.NetworkManager.WifiP2PPeer:Flags, The "Flags" property
-
org.freedesktop.NetworkManager.WifiP2PPeer:HwAddress, The "HwAddress" property +
org.freedesktop.NetworkManager.WifiP2PPeer:HwAddress, The "HwAddress" property
-
org.freedesktop.NetworkManager.WifiP2PPeer:LastSeen, The "LastSeen" property +
org.freedesktop.NetworkManager.WifiP2PPeer:LastSeen, The "LastSeen" property
-
org.freedesktop.NetworkManager.WifiP2PPeer:Manufacturer, The "Manufacturer" property +
org.freedesktop.NetworkManager.WifiP2PPeer:Manufacturer, The "Manufacturer" property
-
org.freedesktop.NetworkManager.WifiP2PPeer:Model, The "Model" property +
org.freedesktop.NetworkManager.WifiP2PPeer:Model, The "Model" property
-
org.freedesktop.NetworkManager.WifiP2PPeer:ModelNumber, The "ModelNumber" property +
org.freedesktop.NetworkManager.WifiP2PPeer:ModelNumber, The "ModelNumber" property
-
org.freedesktop.NetworkManager.WifiP2PPeer:Name, The "Name" property +
org.freedesktop.NetworkManager.WifiP2PPeer:Name, The "Name" property
-
org.freedesktop.NetworkManager.WifiP2PPeer:Serial, The "Serial" property +
org.freedesktop.NetworkManager.WifiP2PPeer:Serial, The "Serial" property
-
org.freedesktop.NetworkManager.WifiP2PPeer:Strength, The "Strength" property +
org.freedesktop.NetworkManager.WifiP2PPeer:Strength, The "Strength" property
-
org.freedesktop.NetworkManager.WifiP2PPeer:WfdIEs, The "WfdIEs" property +
org.freedesktop.NetworkManager.WifiP2PPeer:WfdIEs, The "WfdIEs" property
-
wps-method, wifi-p2p, 802-11-wireless-security +
wps-method, wifi-p2p, 802-11-wireless-security

Z

-
zone, connection +
zone, connection
diff --git a/docs/api/html/nm-settings-dbus.html b/docs/api/html/nm-settings-dbus.html index eece0f6..7b2275d 100644 --- a/docs/api/html/nm-settings-dbus.html +++ b/docs/api/html/nm-settings-dbus.html @@ -4111,7 +4111,7 @@ only-from-default NMTernary (int32)   -If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1). +If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_FALSE (0). diff --git a/docs/api/html/nm-settings-nmcli.html b/docs/api/html/nm-settings-nmcli.html index 145ebe6..0b4e9e9 100644 --- a/docs/api/html/nm-settings-nmcli.html +++ b/docs/api/html/nm-settings-nmcli.html @@ -4671,7 +4671,7 @@

only-from-default

-

If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).

+

If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_FALSE (0).

Format: NMTernary (int32)

diff --git a/docs/api/html/settings-hostname.html b/docs/api/html/settings-hostname.html index 45999ee..0a4eddc 100644 --- a/docs/api/html/settings-hostname.html +++ b/docs/api/html/settings-hostname.html @@ -69,7 +69,7 @@
only-from-default
NMTernary (int32)

-If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).
+If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_FALSE (0).
 
 
 
priority
diff --git a/docs/api/settings-spec.xml b/docs/api/settings-spec.xml index 461cd73..5e939da 100644 --- a/docs/api/settings-spec.xml +++ b/docs/api/settings-spec.xml @@ -98,7 +98,7 @@ Properties Key NameValue TypeDefault ValueValue Descriptionchannelchannelint32-1IEEE 802.15.4 channel. A positive integer or -1, meaning "do not set, use whatever the device is already set to".mac-addressmac-addressstringIf specified, this connection will only apply to the IEEE 802.15.4 (WPAN) MAC layer device whose permanent MAC address matches.pagepageint32-1IEEE 802.15.4 channel page. A positive integer or -1, meaning "do not set, use whatever the device is already set to".pan-idpan-iduint3265535IEEE 802.15.4 Personal Area Network (PAN) identifier.short-addressshort-addressuint3265535Short IEEE 802.15.4 address to be used within a restricted environment.
hostnameHostname settings Properties - Key NameValue TypeDefault ValueValue Descriptionfrom-dhcpfrom-dhcpNMTernary (int32)Whether the system hostname can be determined from DHCP on this connection. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).from-dns-lookupfrom-dns-lookupNMTernary (int32)Whether the system hostname can be determined from reverse DNS lookup of addresses on this device. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).only-from-defaultonly-from-defaultNMTernary (int32)If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).prioritypriorityint320The relative priority of this connection to determine the system hostname. A lower numerical value is better (higher priority). A connection with higher priority is considered before connections with lower priority. If the value is zero, it can be overridden by a global value from NetworkManager configuration. If the property doesn't have a value in the global configuration, the value is assumed to be 100. Negative values have the special effect of excluding other connections with a greater numerical priority value; so in presence of at least one negative priority, only connections with the lowest priority value will be used to determine the hostname.
ovs-external-idsOVS External IDs Settings + Key NameValue TypeDefault ValueValue Descriptionfrom-dhcpfrom-dhcpNMTernary (int32)Whether the system hostname can be determined from DHCP on this connection. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).from-dns-lookupfrom-dns-lookupNMTernary (int32)Whether the system hostname can be determined from reverse DNS lookup of addresses on this device. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).only-from-defaultonly-from-defaultNMTernary (int32)If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_FALSE (0).prioritypriorityint320The relative priority of this connection to determine the system hostname. A lower numerical value is better (higher priority). A connection with higher priority is considered before connections with lower priority. If the value is zero, it can be overridden by a global value from NetworkManager configuration. If the property doesn't have a value in the global configuration, the value is assumed to be 100. Negative values have the special effect of excluding other connections with a greater numerical priority value; so in presence of at least one negative priority, only connections with the lowest priority value will be used to determine the hostname.
ovs-external-idsOVS External IDs Settings Properties Key NameValue TypeDefault ValueValue Descriptiondatadatadict of string to string{}A dictionary of key/value pairs with exernal-ids for OVS.
vethVeth Settings Properties diff --git a/docs/api/version.xml b/docs/api/version.xml index ce2c330..8edc27b 100644 --- a/docs/api/version.xml +++ b/docs/api/version.xml @@ -1 +1 @@ -1.29.8 +1.29.9 diff --git a/docs/libnm/Makefile.am b/docs/libnm/Makefile.am index 5328bd6..c8f095f 100644 --- a/docs/libnm/Makefile.am +++ b/docs/libnm/Makefile.am @@ -60,7 +60,7 @@ IGNORE_HFILES= \ \ nm-auth-subject.h \ nm-common-macros.h \ - nm-ethtool-utils.h \ + nm-ethtool-base.h \ nm-libnm-core-utils.h \ \ nm-dispatcher-api.h \ diff --git a/docs/libnm/Makefile.in b/docs/libnm/Makefile.in index 84d5a69..ff0504a 100644 --- a/docs/libnm/Makefile.in +++ b/docs/libnm/Makefile.in @@ -509,7 +509,7 @@ IGNORE_HFILES = \ \ nm-auth-subject.h \ nm-common-macros.h \ - nm-ethtool-utils.h \ + nm-ethtool-base.h \ nm-libnm-core-utils.h \ \ nm-dispatcher-api.h \ diff --git a/docs/libnm/html/NMSettingEthtool.html b/docs/libnm/html/NMSettingEthtool.html index 3402642..0651e06 100644 --- a/docs/libnm/html/NMSettingEthtool.html +++ b/docs/libnm/html/NMSettingEthtool.html @@ -112,324 +112,10 @@ <col width="150px" class="other_proto_type"> <col class="other_proto_name"> </colgroup> -<tbody> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-ESP-HW-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-ESP-TX-CSUM-HW-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-FCOE-MTU:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU">NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-GRO:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_GRO">NM_ETHTOOL_OPTNAME_FEATURE_GRO</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-GSO:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_GSO">NM_ETHTOOL_OPTNAME_FEATURE_GSO</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-HIGHDMA:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA">NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-HW-TC-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-L2-FWD-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-LOOPBACK:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK">NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-LRO:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_LRO">NM_ETHTOOL_OPTNAME_FEATURE_LRO</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-NTUPLE:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE">NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX">NM_ETHTOOL_OPTNAME_FEATURE_RX</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RXHASH:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RXHASH">NM_ETHTOOL_OPTNAME_FEATURE_RXHASH</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RXVLAN:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN">NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-ALL:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL">NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-FCS:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS">NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-GRO-HW:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW">NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-UDP-TUNNEL-PORT-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-FILTER:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER">NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-STAG-FILTER:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER">NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-STAG-HW-PARSE:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE">NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-SG:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_SG">NM_ETHTOOL_OPTNAME_FEATURE_SG</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TLS-HW-RECORD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD">NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TLS-HW-TX-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TSO:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TSO">NM_ETHTOOL_OPTNAME_FEATURE_TSO</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX">NM_ETHTOOL_OPTNAME_FEATURE_TX</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TXVLAN:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN">NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-FCOE-CRC:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC">NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IPV4:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4">NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IPV6:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6">NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IP-GENERIC:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC">NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-SCTP:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP">NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-ESP-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-FCOE-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GRE-CSUM-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GRE-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GSO-PARTIAL:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL">NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GSO-ROBUST:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST">NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-IPXIP4-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-IPXIP6-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-NOCACHE-COPY:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY">NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-SCATTER-GATHER:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER">NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-SCATTER-GATHER-FRAGLIST:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST">NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-SCTP-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP6-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-ECN-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-MANGLEID-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-TNL-CSUM-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-TNL-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-VLAN-STAG-HW-INSERT:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT">NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-ADAPTIVE-RX:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX">NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-ADAPTIVE-TX:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX">NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-PKT-RATE-HIGH:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH">NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-PKT-RATE-LOW:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW">NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES">NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-HIGH:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH">NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-IRQ:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ">NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-LOW:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW">NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS">NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-HIGH:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH">NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-IRQ:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ">NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-LOW:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW">NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-SAMPLE-INTERVAL:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL">NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-STATS-BLOCK-USECS:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS">NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES">NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-HIGH:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH">NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-IRQ:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ">NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-LOW:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW">NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS">NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-HIGH:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH">NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-IRQ:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ">NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-LOW:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW">NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-RX:CAPS" title="NM_ETHTOOL_OPTNAME_RING_RX">NM_ETHTOOL_OPTNAME_RING_RX</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-RX-JUMBO:CAPS" title="NM_ETHTOOL_OPTNAME_RING_RX_JUMBO">NM_ETHTOOL_OPTNAME_RING_RX_JUMBO</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-RX-MINI:CAPS" title="NM_ETHTOOL_OPTNAME_RING_RX_MINI">NM_ETHTOOL_OPTNAME_RING_RX_MINI</a></td> -</tr> -<tr> -<td class="define_keyword">#define</td> -<td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-TX:CAPS" title="NM_ETHTOOL_OPTNAME_RING_TX">NM_ETHTOOL_OPTNAME_RING_TX</a></td> -</tr> -<tr> +<tbody><tr> <td class="define_keyword">#define</td> <td class="function_name"><a class="link" href="NMSettingEthtool.html#NM-SETTING-ETHTOOL-SETTING-NAME:CAPS" title="NM_SETTING_ETHTOOL_SETTING_NAME">NM_SETTING_ETHTOOL_SETTING_NAME</a></td> -</tr> -</tbody> +</tr></tbody> </table></div> </div> <div class="refsect1"> @@ -540,7 +226,7 @@ nm_setting_ethtool_get_optnames (<em class="parameter"><code><a class="link" hre <p>use <a class="link" href="NMSetting.html#nm-setting-option-get-all-names" title="nm_setting_option_get_all_names ()"><code class="function">nm_setting_option_get_all_names()</code></a> instead.</p> </div> <p>This returns all options names that are set. This includes the feature names -like <a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-GRO:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_GRO"><code class="literal">NM_ETHTOOL_OPTNAME_FEATURE_GRO</code></a>. See <a class="link" href="NMSettingEthtool.html#nm-ethtool-optname-is-feature" title="nm_ethtool_optname_is_feature ()"><code class="function">nm_ethtool_optname_is_feature()</code></a> to +like <code class="literal">NM_ETHTOOL_OPTNAME_FEATURE_GRO</code>. See <a class="link" href="NMSettingEthtool.html#nm-ethtool-optname-is-feature" title="nm_ethtool_optname_is_feature ()"><code class="function">nm_ethtool_optname_is_feature()</code></a> to check whether the option name is valid for offload features.</p> <div class="refsect3"> <a name="nm-setting-ethtool-get-optnames.parameters"></a><h4>Parameters</h4> @@ -695,472 +381,6 @@ nm_setting_ethtool_clear_features (<em class="parameter"><code><a class="link" h <div class="refsect1"> <a name="NMSettingEthtool.other_details"></a><h2>Types and Values</h2> <div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-ESP-HW-OFFLOAD:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD "feature-esp-hw-offload" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-ESP-TX-CSUM-HW-OFFLOAD:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD "feature-esp-tx-csum-hw-offload" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-FCOE-MTU:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU "feature-fcoe-mtu" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-GRO:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_GRO</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_GRO "feature-gro" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-GSO:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_GSO</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_GSO "feature-gso" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-HIGHDMA:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA "feature-highdma" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-HW-TC-OFFLOAD:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD "feature-hw-tc-offload" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-L2-FWD-OFFLOAD:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD "feature-l2-fwd-offload" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-LOOPBACK:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK "feature-loopback" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-LRO:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_LRO</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_LRO "feature-lro" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-NTUPLE:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE "feature-ntuple" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-RX:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_RX</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_RX "feature-rx" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-RXHASH:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_RXHASH</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_RXHASH "feature-rxhash" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-RXVLAN:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN "feature-rxvlan" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-RX-ALL:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL "feature-rx-all" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-RX-FCS:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS "feature-rx-fcs" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-RX-GRO-HW:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW "feature-rx-gro-hw" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-RX-UDP-TUNNEL-PORT-OFFLOAD:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD "feature-rx-udp_tunnel-port-offload" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-FILTER:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER "feature-rx-vlan-filter" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-STAG-FILTER:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER "feature-rx-vlan-stag-filter" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-STAG-HW-PARSE:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE "feature-rx-vlan-stag-hw-parse" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-SG:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_SG</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_SG "feature-sg" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TLS-HW-RECORD:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD "feature-tls-hw-record" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TLS-HW-TX-OFFLOAD:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD "feature-tls-hw-tx-offload" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TSO:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TSO</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TSO "feature-tso" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX "feature-tx" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TXVLAN:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN "feature-txvlan" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-FCOE-CRC:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC "feature-tx-checksum-fcoe-crc" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IPV4:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4 "feature-tx-checksum-ipv4" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IPV6:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6 "feature-tx-checksum-ipv6" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IP-GENERIC:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC "feature-tx-checksum-ip-generic" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-SCTP:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP "feature-tx-checksum-sctp" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-ESP-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION "feature-tx-esp-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-FCOE-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION "feature-tx-fcoe-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-GRE-CSUM-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION "feature-tx-gre-csum-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-GRE-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION "feature-tx-gre-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-GSO-PARTIAL:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL "feature-tx-gso-partial" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-GSO-ROBUST:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST "feature-tx-gso-robust" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-IPXIP4-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION "feature-tx-ipxip4-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-IPXIP6-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION "feature-tx-ipxip6-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-NOCACHE-COPY:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY "feature-tx-nocache-copy" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-SCATTER-GATHER:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER "feature-tx-scatter-gather" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-SCATTER-GATHER-FRAGLIST:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST "feature-tx-scatter-gather-fraglist" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-SCTP-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION "feature-tx-sctp-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP6-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION "feature-tx-tcp6-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-ECN-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION "feature-tx-tcp-ecn-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-MANGLEID-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION "feature-tx-tcp-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION "feature-tx-udp-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-TNL-CSUM-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-TNL-SEGMENTATION:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION "feature-tx-udp_tnl-segmentation" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-FEATURE-TX-VLAN-STAG-HW-INSERT:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT "feature-tx-vlan-stag-hw-insert" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-ADAPTIVE-RX:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX "coalesce-adaptive-rx" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-ADAPTIVE-TX:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX "coalesce-adaptive-tx" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-PKT-RATE-HIGH:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH "coalesce-pkt-rate-high" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-PKT-RATE-LOW:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW "coalesce-pkt-rate-low" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES "coalesce-rx-frames" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-HIGH:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH "coalesce-rx-frames-high" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-IRQ:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ "coalesce-rx-frames-irq" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-LOW:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW "coalesce-rx-frames-low" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS "coalesce-rx-usecs" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-HIGH:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH "coalesce-rx-usecs-high" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-IRQ:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ "coalesce-rx-usecs-irq" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-LOW:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW "coalesce-rx-usecs-low" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-SAMPLE-INTERVAL:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL "coalesce-sample-interval" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-STATS-BLOCK-USECS:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS "coalesce-stats-block-usecs" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES "coalesce-tx-frames" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-HIGH:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH "coalesce-tx-frames-high" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-IRQ:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ "coalesce-tx-frames-irq" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-LOW:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW "coalesce-tx-frames-low" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS "coalesce-tx-usecs" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-HIGH:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH "coalesce-tx-usecs-high" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-IRQ:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ "coalesce-tx-usecs-irq" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-LOW:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW "coalesce-tx-usecs-low" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-RING-RX:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_RING_RX</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_RING_RX "ring-rx" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-RING-RX-JUMBO:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_RING_RX_JUMBO</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_RING_RX_JUMBO "ring-rx-jumbo" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-RING-RX-MINI:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_RING_RX_MINI</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_RING_RX_MINI "ring-rx-mini" -</pre> -</div> -<hr> -<div class="refsect2"> -<a name="NM-ETHTOOL-OPTNAME-RING-TX:CAPS"></a><h3>NM_ETHTOOL_OPTNAME_RING_TX</h3> -<pre class="programlisting">#define NM_ETHTOOL_OPTNAME_RING_TX "ring-tx" -</pre> -</div> -<hr> -<div class="refsect2"> <a name="NM-SETTING-ETHTOOL-SETTING-NAME:CAPS"></a><h3>NM_SETTING_ETHTOOL_SETTING_NAME</h3> <pre class="programlisting">#define NM_SETTING_ETHTOOL_SETTING_NAME "ethtool" </pre> diff --git a/docs/libnm/html/api-index-full.html b/docs/libnm/html/api-index-full.html index 539c0c0..c6381ea 100644 --- a/docs/libnm/html/api-index-full.html +++ b/docs/libnm/html/api-index-full.html @@ -7005,299 +7005,299 @@ nm_dbus_path_not_empty, function in <a class="link" href="NMIPConfig.html" title </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-ADAPTIVE-RX:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX">NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-ADAPTIVE-TX:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX">NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-PKT-RATE-HIGH:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH">NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-PKT-RATE-LOW:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW">NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES">NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-HIGH:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH">NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-IRQ:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ">NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-LOW:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW">NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS">NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-HIGH:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH">NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-IRQ:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ">NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-LOW:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW">NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-SAMPLE-INTERVAL:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL">NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-STATS-BLOCK-USECS:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS">NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES">NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-HIGH:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH">NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-IRQ:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ">NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-LOW:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW">NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS">NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-HIGH:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH">NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-IRQ:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ">NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-LOW:CAPS" title="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW">NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-ESP-HW-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-ESP-TX-CSUM-HW-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-FCOE-MTU:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU">NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-GRO:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_GRO">NM_ETHTOOL_OPTNAME_FEATURE_GRO</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_GRO, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-GSO:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_GSO">NM_ETHTOOL_OPTNAME_FEATURE_GSO</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_GSO, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-HIGHDMA:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA">NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-HW-TC-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-L2-FWD-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-LOOPBACK:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK">NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-LRO:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_LRO">NM_ETHTOOL_OPTNAME_FEATURE_LRO</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_LRO, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-NTUPLE:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE">NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX">NM_ETHTOOL_OPTNAME_FEATURE_RX</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_RX, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RXHASH:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RXHASH">NM_ETHTOOL_OPTNAME_FEATURE_RXHASH</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_RXHASH, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RXVLAN:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN">NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-ALL:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL">NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-FCS:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS">NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-GRO-HW:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW">NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-UDP-TUNNEL-PORT-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-FILTER:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER">NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-STAG-FILTER:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER">NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-STAG-HW-PARSE:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE">NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-SG:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_SG">NM_ETHTOOL_OPTNAME_FEATURE_SG</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_SG, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TLS-HW-RECORD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD">NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TLS-HW-TX-OFFLOAD:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD">NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TSO:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TSO">NM_ETHTOOL_OPTNAME_FEATURE_TSO</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TSO, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX">NM_ETHTOOL_OPTNAME_FEATURE_TX</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TXVLAN:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN">NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-FCOE-CRC:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC">NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IPV4:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4">NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IPV6:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6">NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IP-GENERIC:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC">NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-SCTP:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP">NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-ESP-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-FCOE-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GRE-CSUM-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GRE-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GSO-PARTIAL:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL">NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GSO-ROBUST:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST">NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-IPXIP4-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-IPXIP6-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-NOCACHE-COPY:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY">NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-SCATTER-GATHER:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER">NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-SCATTER-GATHER-FRAGLIST:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST">NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-SCTP-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP6-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-ECN-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-MANGLEID-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-TNL-CSUM-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-TNL-SEGMENTATION:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION">NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-VLAN-STAG-HW-INSERT:CAPS" title="NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT">NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT, macro in nm-ethtool-utils </dt> <dd></dd> <dt> @@ -7313,19 +7313,19 @@ nm_dbus_path_not_empty, function in <a class="link" href="NMIPConfig.html" title </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-RX:CAPS" title="NM_ETHTOOL_OPTNAME_RING_RX">NM_ETHTOOL_OPTNAME_RING_RX</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_RING_RX, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-RX-JUMBO:CAPS" title="NM_ETHTOOL_OPTNAME_RING_RX_JUMBO">NM_ETHTOOL_OPTNAME_RING_RX_JUMBO</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-RX-MINI:CAPS" title="NM_ETHTOOL_OPTNAME_RING_RX_MINI">NM_ETHTOOL_OPTNAME_RING_RX_MINI</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_RING_RX_MINI, macro in nm-ethtool-utils </dt> <dd></dd> <dt> -<a class="link" href="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-TX:CAPS" title="NM_ETHTOOL_OPTNAME_RING_TX">NM_ETHTOOL_OPTNAME_RING_TX</a>, macro in <a class="link" href="NMSettingEthtool.html" title="NMSettingEthtool">NMSettingEthtool</a> +NM_ETHTOOL_OPTNAME_RING_TX, macro in nm-ethtool-utils </dt> <dd></dd> <dt> diff --git a/docs/libnm/html/index.html b/docs/libnm/html/index.html index f19bfed..75b2c70 100644 --- a/docs/libnm/html/index.html +++ b/docs/libnm/html/index.html @@ -15,7 +15,7 @@ <div> <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">libnm Reference Manual</p></th></tr></table></div> <div><p class="releaseinfo"> - for libnm 1.29.8 + for libnm 1.29.9 The latest version of this documentation can be found on-line at <a class="ulink" href="https://developer.gnome.org/libnm/stable/" target="_top">https://developer.gnome.org/libnm/stable/</a>. diff --git a/docs/libnm/html/libnm.devhelp2 b/docs/libnm/html/libnm.devhelp2 index 6cc7bea..a29974d 100644 --- a/docs/libnm/html/libnm.devhelp2 +++ b/docs/libnm/html/libnm.devhelp2 @@ -1133,84 +1133,6 @@ <keyword type="function" name="nm_setting_ethtool_get_feature ()" link="NMSettingEthtool.html#nm-setting-ethtool-get-feature" deprecated="1.26: use nm_setting_option_get_boolean() instead." since="1.14"/> <keyword type="function" name="nm_setting_ethtool_set_feature ()" link="NMSettingEthtool.html#nm-setting-ethtool-set-feature" deprecated="1.26: use nm_setting_option_set() or nm_setting_option_set_boolean() instead." since="1.14"/> <keyword type="function" name="nm_setting_ethtool_clear_features ()" link="NMSettingEthtool.html#nm-setting-ethtool-clear-features" deprecated="1.26: use nm_setting_option_clear_by_name() with nm_ethtool_optname_is_feature() predicate instead." since="1.14"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-ESP-HW-OFFLOAD:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-ESP-TX-CSUM-HW-OFFLOAD:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-FCOE-MTU:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_GRO" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-GRO:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_GSO" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-GSO:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-HIGHDMA:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-HW-TC-OFFLOAD:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-L2-FWD-OFFLOAD:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-LOOPBACK:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_LRO" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-LRO:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-NTUPLE:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_RX" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_RXHASH" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RXHASH:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RXVLAN:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-ALL:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-FCS:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-GRO-HW:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-UDP-TUNNEL-PORT-OFFLOAD:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-FILTER:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-STAG-FILTER:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-RX-VLAN-STAG-HW-PARSE:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_SG" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-SG:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TLS-HW-RECORD:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TLS-HW-TX-OFFLOAD:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TSO" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TSO:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TXVLAN:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-FCOE-CRC:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IPV4:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IPV6:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-IP-GENERIC:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-CHECKSUM-SCTP:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-ESP-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-FCOE-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GRE-CSUM-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GRE-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GSO-PARTIAL:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-GSO-ROBUST:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-IPXIP4-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-IPXIP6-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-NOCACHE-COPY:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-SCATTER-GATHER:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-SCATTER-GATHER-FRAGLIST:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-SCTP-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP6-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-ECN-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-MANGLEID-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-TCP-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-TNL-CSUM-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-UDP-TNL-SEGMENTATION:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-FEATURE-TX-VLAN-STAG-HW-INSERT:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-ADAPTIVE-RX:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-ADAPTIVE-TX:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-PKT-RATE-HIGH:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-PKT-RATE-LOW:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-HIGH:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-IRQ:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-FRAMES-LOW:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-HIGH:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-IRQ:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-RX-USECS-LOW:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-SAMPLE-INTERVAL:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-STATS-BLOCK-USECS:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-HIGH:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-IRQ:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-FRAMES-LOW:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-HIGH:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-IRQ:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-COALESCE-TX-USECS-LOW:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_RING_RX" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-RX:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_RING_RX_JUMBO" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-RX-JUMBO:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_RING_RX_MINI" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-RX-MINI:CAPS"/> - <keyword type="macro" name="NM_ETHTOOL_OPTNAME_RING_TX" link="NMSettingEthtool.html#NM-ETHTOOL-OPTNAME-RING-TX:CAPS"/> <keyword type="macro" name="NM_SETTING_ETHTOOL_SETTING_NAME" link="NMSettingEthtool.html#NM-SETTING-ETHTOOL-SETTING-NAME:CAPS"/> <keyword type="function" name="nm_setting_generic_new ()" link="NMSettingGeneric.html#nm-setting-generic-new"/> <keyword type="macro" name="NM_SETTING_GENERIC_SETTING_NAME" link="NMSettingGeneric.html#NM-SETTING-GENERIC-SETTING-NAME:CAPS"/> diff --git a/docs/libnm/html/usage.html b/docs/libnm/html/usage.html index 0569861..1522642 100644 --- a/docs/libnm/html/usage.html +++ b/docs/libnm/html/usage.html @@ -96,7 +96,7 @@ </p> <pre class="screen"><code class="prompt">$ </code><strong class="userinput"><code>cc $(pkg-config --libs --cflags libnm) -o hello-nm hello-nm.c</code></strong> <code class="prompt">$ </code><strong class="userinput"><code>./hello-nm</code></strong> - NetworkManager version: 1.29.8 + NetworkManager version: 1.29.9 <code class="prompt">$ </code></pre> <p> diff --git a/docs/libnm/libnm-sections.txt b/docs/libnm/libnm-sections.txt index ca7ccda..a2ecc9e 100644 --- a/docs/libnm/libnm-sections.txt +++ b/docs/libnm/libnm-sections.txt @@ -1528,6 +1528,88 @@ nm_vpn_plugin_error_quark </SECTION> <SECTION> +<FILE>nm-ethtool-utils</FILE> +NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD +NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD +NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU +NM_ETHTOOL_OPTNAME_FEATURE_GRO +NM_ETHTOOL_OPTNAME_FEATURE_GSO +NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA +NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD +NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD +NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK +NM_ETHTOOL_OPTNAME_FEATURE_LRO +NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE +NM_ETHTOOL_OPTNAME_FEATURE_RX +NM_ETHTOOL_OPTNAME_FEATURE_RXHASH +NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN +NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL +NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS +NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW +NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD +NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER +NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER +NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE +NM_ETHTOOL_OPTNAME_FEATURE_SG +NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD +NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD +NM_ETHTOOL_OPTNAME_FEATURE_TSO +NM_ETHTOOL_OPTNAME_FEATURE_TX +NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN +NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC +NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4 +NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6 +NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC +NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP +NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL +NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST +NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY +NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER +NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST +NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION +NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT +NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX +NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX +NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH +NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW +NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES +NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH +NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ +NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW +NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS +NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH +NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ +NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW +NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL +NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS +NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES +NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH +NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ +NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW +NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS +NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH +NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ +NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW +NM_ETHTOOL_OPTNAME_RING_RX +NM_ETHTOOL_OPTNAME_RING_RX_JUMBO +NM_ETHTOOL_OPTNAME_RING_RX_MINI +NM_ETHTOOL_OPTNAME_RING_TX +</SECTION> + +<SECTION> <FILE>nm-ip-config</FILE> <TITLE>NMIPConfig NM_IP_CONFIG_FAMILY @@ -2417,84 +2499,6 @@ nm_setting_dummy_get_type
nm-setting-ethtool NMSettingEthtool -NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD -NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD -NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU -NM_ETHTOOL_OPTNAME_FEATURE_GRO -NM_ETHTOOL_OPTNAME_FEATURE_GSO -NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA -NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD -NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD -NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK -NM_ETHTOOL_OPTNAME_FEATURE_LRO -NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE -NM_ETHTOOL_OPTNAME_FEATURE_RX -NM_ETHTOOL_OPTNAME_FEATURE_RXHASH -NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN -NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL -NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS -NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW -NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD -NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER -NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER -NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE -NM_ETHTOOL_OPTNAME_FEATURE_SG -NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD -NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD -NM_ETHTOOL_OPTNAME_FEATURE_TSO -NM_ETHTOOL_OPTNAME_FEATURE_TX -NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN -NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC -NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4 -NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6 -NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC -NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP -NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL -NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST -NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY -NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER -NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST -NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION -NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT -NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX -NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX -NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH -NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW -NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES -NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH -NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ -NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW -NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS -NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH -NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ -NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW -NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL -NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS -NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES -NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH -NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ -NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW -NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS -NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH -NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ -NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW -NM_ETHTOOL_OPTNAME_RING_RX -NM_ETHTOOL_OPTNAME_RING_RX_JUMBO -NM_ETHTOOL_OPTNAME_RING_RX_MINI -NM_ETHTOOL_OPTNAME_RING_TX nm_ethtool_optname_is_feature nm_ethtool_optname_is_coalesce nm_ethtool_optname_is_ring diff --git a/docs/libnm/meson.build b/docs/libnm/meson.build index d3a0dd1..2f70eb5 100644 --- a/docs/libnm/meson.build +++ b/docs/libnm/meson.build @@ -33,7 +33,7 @@ private_headers = [ 'nm-auth-subject.h', 'nm-common-macros.h', - 'nm-ethtool-utils.h', + 'nm-ethtool-base.h', 'nm-libnm-core-utils.h', 'nm-dispatcher-api.h', diff --git a/docs/libnm/version.xml b/docs/libnm/version.xml index ce2c330..8edc27b 100644 --- a/docs/libnm/version.xml +++ b/docs/libnm/version.xml @@ -1 +1 @@ -1.29.8 +1.29.9 diff --git a/examples/python/dbus/show-bssids.py b/examples/python/dbus/show-bssids.py index 7a53a53..7db0fd3 100755 --- a/examples/python/dbus/show-bssids.py +++ b/examples/python/dbus/show-bssids.py @@ -7,6 +7,11 @@ # This example prints out all the AP BSSIDs that all Wi-Fi devices on the # machine can see. Useful for location-based services like Skyhook that # can geolocate you based on the APs you can see. +# +# Note that with NetworkManager clients are required to request scanning. +# If you don't do that, the scan list may be outdated. That means, you would +# check the LastScan property, and if necessary call RequestScan() first. +# After RequestScan(), you wait until the LastScan property gets bumped again. import dbus diff --git a/libnm-core/meson.build b/libnm-core/meson.build index d121bc0..843ff67 100644 --- a/libnm-core/meson.build +++ b/libnm-core/meson.build @@ -95,17 +95,22 @@ libnm_libnm_core_intern = static_library( 'nm-libnm-core-intern', sources: files( 'nm-libnm-core-intern/nm-auth-subject.c', - 'nm-libnm-core-intern/nm-ethtool-utils.c', 'nm-libnm-core-intern/nm-libnm-core-utils.c', ) + [libnm_core_enum_sources[1]], - dependencies: libnm_core_nm_default_dep, + dependencies: [ + libnm_core_nm_default_dep, + libnm_base_dep, + ], c_args: common_c_flags, ) libnm_libnm_core_intern_dep = declare_dependency( sources: [libnm_core_enum_sources[1], nm_version_macro_header], include_directories: [libnm_core_inc, shared_inc], - dependencies: libnm_utils_base_dep, + dependencies: [ + libnm_utils_base_dep, + libnm_base_dep, + ], link_with: libnm_libnm_core_intern, ) @@ -232,7 +237,10 @@ libnm_libnm_core_aux = static_library( ) + [libnm_core_enum_sources[1]], dependencies: libnm_utils_base_dep, c_args: c_flags, - link_with: libnm_libnm_core_intern, + link_with: [ + libnm_libnm_core_intern, + libnm_base, + ], ) libnm_libnm_core_aux_dep = declare_dependency( diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h index 2ed8552..bda7f89 100644 --- a/libnm-core/nm-core-internal.h +++ b/libnm-core/nm-core-internal.h @@ -20,6 +20,7 @@ #error Cannot use this header. #endif +#include "nm-base/nm-base.h" #include "nm-connection.h" #include "nm-core-enum-types.h" #include "nm-core-types-internal.h" @@ -215,6 +216,38 @@ nm_bluetooth_capability_to_string(NMBluetoothCapabilities capabilities, char *bu /*****************************************************************************/ +static inline _NMSettingWiredWakeOnLan +_NM_SETTING_WIRED_WAKE_ON_LAN_CAST(NMSettingWiredWakeOnLan v) +{ + /* _NMSettingWiredWakeOnLan and NMSettingWiredWakeOnLan enums are really + * the same. + * + * The former is used by nm-platform (which should have no libnm-core dependency), + * the latter is used by libnm-core. A unit test ensures they are exactly the same, + * so we can just cast them. */ + return (_NMSettingWiredWakeOnLan) v; +} + +/*****************************************************************************/ + +static inline NMTernary +NM_TERNARY_FROM_OPTION_BOOL(NMOptionBool v) +{ + nm_assert(NM_IN_SET(v, NM_OPTION_BOOL_DEFAULT, NM_OPTION_BOOL_TRUE, NM_OPTION_BOOL_FALSE)); + + return (NMTernary) v; +} + +static inline NMOptionBool +NM_TERNARY_TO_OPTION_BOOL(NMTernary v) +{ + nm_assert(NM_IN_SET(v, NM_TERNARY_DEFAULT, NM_TERNARY_TRUE, NM_TERNARY_FALSE)); + + return (NMOptionBool) v; +} + +/*****************************************************************************/ + typedef enum { /*< skip >*/ NM_SETTING_PARSE_FLAGS_NONE = 0, NM_SETTING_PARSE_FLAGS_STRICT = 1LL << 0, @@ -327,7 +360,7 @@ gboolean _nm_setting_option_clear(NMSetting *setting, const char *optname); guint nm_setting_ethtool_init_features( NMSettingEthtool *setting, - NMTernary * requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */); + NMOptionBool * requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */); /*****************************************************************************/ diff --git a/libnm-core/nm-errors.c b/libnm-core/nm-errors.c index 106d205..95a12c0 100644 --- a/libnm-core/nm-errors.c +++ b/libnm-core/nm-errors.c @@ -14,7 +14,6 @@ NM_CACHED_QUARK_FCN("nm-agent-manager-error-quark", nm_agent_manager_error_quark NM_CACHED_QUARK_FCN("nm-connection-error-quark", nm_connection_error_quark); NM_CACHED_QUARK_FCN("nm-crypto-error-quark", nm_crypto_error_quark); NM_CACHED_QUARK_FCN("nm-device-error-quark", nm_device_error_quark); -NM_CACHED_QUARK_FCN("nm-manager-error-quark", nm_manager_error_quark); NM_CACHED_QUARK_FCN("nm-secret-agent-error-quark", nm_secret_agent_error_quark); NM_CACHED_QUARK_FCN("nm-settings-error-quark", nm_settings_error_quark); NM_CACHED_QUARK_FCN("nm-vpn-plugin-error-quark", nm_vpn_plugin_error_quark); diff --git a/libnm-core/nm-setting-ethtool.c b/libnm-core/nm-setting-ethtool.c index f1d6a87..7d3f4d9 100644 --- a/libnm-core/nm-setting-ethtool.c +++ b/libnm-core/nm-setting-ethtool.c @@ -8,7 +8,7 @@ #include "nm-setting-ethtool.h" #include "nm-setting-private.h" -#include "nm-libnm-core-intern/nm-ethtool-utils.h" +#include "nm-base/nm-ethtool-base.h" /*****************************************************************************/ @@ -195,7 +195,7 @@ nm_setting_ethtool_clear_features(NMSettingEthtool *setting) guint nm_setting_ethtool_init_features( NMSettingEthtool *setting, - NMTernary * requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */) + NMOptionBool * requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */) { GHashTable * hash; GHashTableIter iter; @@ -208,7 +208,7 @@ nm_setting_ethtool_init_features( nm_assert(requested); for (i = 0; i < _NM_ETHTOOL_ID_FEATURE_NUM; i++) - requested[i] = NM_TERNARY_DEFAULT; + requested[i] = NM_OPTION_BOOL_DEFAULT; hash = _nm_setting_option_hash(NM_SETTING(setting), FALSE); if (!hash) @@ -224,7 +224,7 @@ nm_setting_ethtool_init_features( continue; requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX(ethtool_id)] = - g_variant_get_boolean(variant) ? NM_TERNARY_TRUE : NM_TERNARY_FALSE; + g_variant_get_boolean(variant) ? NM_OPTION_BOOL_TRUE : NM_OPTION_BOOL_FALSE; n_req++; } diff --git a/libnm-core/nm-setting-ethtool.h b/libnm-core/nm-setting-ethtool.h index 29b1256..d2310b4 100644 --- a/libnm-core/nm-setting-ethtool.h +++ b/libnm-core/nm-setting-ethtool.h @@ -14,91 +14,6 @@ G_BEGIN_DECLS -/*****************************************************************************/ - -#define NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD "feature-esp-hw-offload" -#define NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD "feature-esp-tx-csum-hw-offload" -#define NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU "feature-fcoe-mtu" -#define NM_ETHTOOL_OPTNAME_FEATURE_GRO "feature-gro" -#define NM_ETHTOOL_OPTNAME_FEATURE_GSO "feature-gso" -#define NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA "feature-highdma" -#define NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD "feature-hw-tc-offload" -#define NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD "feature-l2-fwd-offload" -#define NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK "feature-loopback" -#define NM_ETHTOOL_OPTNAME_FEATURE_LRO "feature-lro" -#define NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE "feature-ntuple" -#define NM_ETHTOOL_OPTNAME_FEATURE_RX "feature-rx" -#define NM_ETHTOOL_OPTNAME_FEATURE_RXHASH "feature-rxhash" -#define NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN "feature-rxvlan" -#define NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL "feature-rx-all" -#define NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS "feature-rx-fcs" -#define NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW "feature-rx-gro-hw" -#define NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD "feature-rx-udp_tunnel-port-offload" -#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER "feature-rx-vlan-filter" -#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER "feature-rx-vlan-stag-filter" -#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE "feature-rx-vlan-stag-hw-parse" -#define NM_ETHTOOL_OPTNAME_FEATURE_SG "feature-sg" -#define NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD "feature-tls-hw-record" -#define NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD "feature-tls-hw-tx-offload" -#define NM_ETHTOOL_OPTNAME_FEATURE_TSO "feature-tso" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX "feature-tx" -#define NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN "feature-txvlan" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC "feature-tx-checksum-fcoe-crc" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4 "feature-tx-checksum-ipv4" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6 "feature-tx-checksum-ipv6" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC "feature-tx-checksum-ip-generic" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP "feature-tx-checksum-sctp" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION "feature-tx-esp-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION "feature-tx-fcoe-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION "feature-tx-gre-csum-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION "feature-tx-gre-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL "feature-tx-gso-partial" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST "feature-tx-gso-robust" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION "feature-tx-ipxip4-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION "feature-tx-ipxip6-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY "feature-tx-nocache-copy" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER "feature-tx-scatter-gather" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST "feature-tx-scatter-gather-fraglist" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION "feature-tx-sctp-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION "feature-tx-tcp6-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION "feature-tx-tcp-ecn-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION \ - "feature-tx-tcp-mangleid-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION "feature-tx-tcp-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION "feature-tx-udp-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION \ - "feature-tx-udp_tnl-csum-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION "feature-tx-udp_tnl-segmentation" -#define NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT "feature-tx-vlan-stag-hw-insert" - -#define NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX "coalesce-adaptive-rx" -#define NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX "coalesce-adaptive-tx" -#define NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH "coalesce-pkt-rate-high" -#define NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW "coalesce-pkt-rate-low" -#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES "coalesce-rx-frames" -#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH "coalesce-rx-frames-high" -#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ "coalesce-rx-frames-irq" -#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW "coalesce-rx-frames-low" -#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS "coalesce-rx-usecs" -#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH "coalesce-rx-usecs-high" -#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ "coalesce-rx-usecs-irq" -#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW "coalesce-rx-usecs-low" -#define NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL "coalesce-sample-interval" -#define NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS "coalesce-stats-block-usecs" -#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES "coalesce-tx-frames" -#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH "coalesce-tx-frames-high" -#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ "coalesce-tx-frames-irq" -#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW "coalesce-tx-frames-low" -#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS "coalesce-tx-usecs" -#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH "coalesce-tx-usecs-high" -#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ "coalesce-tx-usecs-irq" -#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW "coalesce-tx-usecs-low" - -#define NM_ETHTOOL_OPTNAME_RING_RX "ring-rx" -#define NM_ETHTOOL_OPTNAME_RING_RX_JUMBO "ring-rx-jumbo" -#define NM_ETHTOOL_OPTNAME_RING_RX_MINI "ring-rx-mini" -#define NM_ETHTOOL_OPTNAME_RING_TX "ring-tx" - NM_AVAILABLE_IN_1_20 gboolean nm_ethtool_optname_is_feature(const char *optname); diff --git a/libnm-core/nm-setting-hostname.c b/libnm-core/nm-setting-hostname.c index f3ed1ca..fa781b1 100644 --- a/libnm-core/nm-setting-hostname.c +++ b/libnm-core/nm-setting-hostname.c @@ -312,7 +312,7 @@ nm_setting_hostname_class_init(NMSettingHostnameClass *klass) * * When set to %NM_TERNARY_DEFAULT, the value from global configuration * is used. If the property doesn't have a value in the global - * configuration, NetworkManager assumes the value to be %NM_TERNARY_TRUE. + * configuration, NetworkManager assumes the value to be %NM_TERNARY_FALSE. * * Since: 1.30 **/ diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index 6384e2e..ab5de92 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -3995,16 +3995,13 @@ GByteArray * nm_utils_hwaddr_atoba(const char *asc, gsize length) { GByteArray *ba; - gsize l; g_return_val_if_fail(asc, NULL); g_return_val_if_fail(length > 0 && length <= NM_UTILS_HWADDR_LEN_MAX, NULL); ba = g_byte_array_sized_new(length); g_byte_array_set_size(ba, length); - if (!_nm_utils_hwaddr_aton(asc, ba->data, length, &l)) - goto fail; - if (length != l) + if (!_nm_utils_hwaddr_aton_exact(asc, ba->data, length)) goto fail; return ba; @@ -4029,17 +4026,11 @@ fail: guint8 * nm_utils_hwaddr_aton(const char *asc, gpointer buffer, gsize length) { - gsize l; - g_return_val_if_fail(asc, NULL); g_return_val_if_fail(buffer, NULL); g_return_val_if_fail(length > 0 && length <= NM_UTILS_HWADDR_LEN_MAX, NULL); - if (!_nm_utils_hwaddr_aton(asc, buffer, length, &l)) - return NULL; - if (length != l) - return NULL; - return buffer; + return _nm_utils_hwaddr_aton_exact(asc, buffer, length); } /** diff --git a/libnm-core/tests/meson.build b/libnm-core/tests/meson.build index 8773baf..0f6a4f5 100644 --- a/libnm-core/tests/meson.build +++ b/libnm-core/tests/meson.build @@ -18,12 +18,6 @@ enum_sources = gnome.mkenums_simple( body_prefix: '#include "nm-default.h"', ) -deps = [ - libnm_keyfile_dep, - libnm_core_dep, - libnm_core_nm_default_dep, -] - c_flags = [ '-DNETWORKMANAGER_COMPILATION_TEST', '-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_LIBNM_CORE', @@ -45,7 +39,12 @@ foreach test_unit: test_units exe = executable( 'libnm-core-' + test_unit, [test_unit + '.c'] + enum_sources, - dependencies: deps, + dependencies: [ + libnm_keyfile_dep, + libnm_core_dep, + libnm_core_nm_default_dep, + libnm_base_dep, + ], c_args: c_flags, link_with: libnm_systemd_logging_stub, ) diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c index f89aea9..00f6feb 100644 --- a/libnm-core/tests/test-general.c +++ b/libnm-core/tests/test-general.c @@ -17,6 +17,7 @@ #include "nm-glib-aux/nm-enum-utils.h" #include "nm-glib-aux/nm-str-buf.h" #include "nm-glib-aux/nm-json-aux.h" +#include "nm-base/nm-base.h" #include "systemd/nm-sd-utils-shared.h" #include "nm-utils.h" @@ -58,7 +59,8 @@ #include "nm-simple-connection.h" #include "nm-keyfile/nm-keyfile-internal.h" #include "nm-glib-aux/nm-dedup-multi.h" -#include "nm-libnm-core-intern/nm-ethtool-utils.h" +#include "nm-base/nm-ethtool-base.h" +#include "nm-base/nm-ethtool-utils-base.h" #include "test-general-enums.h" @@ -74,6 +76,12 @@ G_STATIC_ASSERT(sizeof(bool) <= sizeof(int)); /*****************************************************************************/ +/* NM_UTILS_HWADDR_LEN_MAX is public API of libnm(-core) and _NM_UTILS_HWADDR_LEN_MAX + * is internal API. They are the same, but the latter can be used without including libnm-core. */ +G_STATIC_ASSERT(NM_UTILS_HWADDR_LEN_MAX == _NM_UTILS_HWADDR_LEN_MAX); + +/*****************************************************************************/ + static void test_nm_ascii_spaces(void) { @@ -97,6 +105,57 @@ test_nm_ascii_spaces(void) /*****************************************************************************/ +static void +test_wired_wake_on_lan_enum(void) +{ + nm_auto_unref_gtypeclass GFlagsClass *flags_class = NULL; + gs_unref_hashtable GHashTable *vals = g_hash_table_new(nm_direct_hash, NULL); + guint i; + + G_STATIC_ASSERT_EXPR(sizeof(NMSettingWiredWakeOnLan) == sizeof(_NMSettingWiredWakeOnLan)); + G_STATIC_ASSERT_EXPR(sizeof(NMSettingWiredWakeOnLan) < sizeof(gint64)); + + G_STATIC_ASSERT_EXPR(sizeof(NMSettingWiredWakeOnLan) < sizeof(gint64)); + g_assert((((gint64)((NMSettingWiredWakeOnLan) -1)) < 0) + == (((gint64)((_NMSettingWiredWakeOnLan) -1)) < 0)); + +#define _E(n) \ + G_STMT_START \ + { \ + G_STATIC_ASSERT_EXPR(n == (gint64) _##n); \ + G_STATIC_ASSERT_EXPR(_##n == (gint64) n); \ + g_assert(_##n == _NM_SETTING_WIRED_WAKE_ON_LAN_CAST(n)); \ + if (!g_hash_table_add(vals, GUINT_TO_POINTER(n))) \ + g_assert_not_reached(); \ + } \ + G_STMT_END + _E(NM_SETTING_WIRED_WAKE_ON_LAN_NONE); + _E(NM_SETTING_WIRED_WAKE_ON_LAN_PHY); + _E(NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST); + _E(NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST); + _E(NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST); + _E(NM_SETTING_WIRED_WAKE_ON_LAN_ARP); + _E(NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC); + _E(NM_SETTING_WIRED_WAKE_ON_LAN_ALL); + _E(NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT); + _E(NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE); + _E(NM_SETTING_WIRED_WAKE_ON_LAN_EXCLUSIVE_FLAGS); +#undef _E + + flags_class = G_FLAGS_CLASS(g_type_class_ref(NM_TYPE_SETTING_WIRED_WAKE_ON_LAN)); + for (i = 0; i < flags_class->n_values; i++) { + const GFlagsValue *value = &flags_class->values[i]; + + if (!g_hash_table_contains(vals, GUINT_TO_POINTER(value->value))) { + g_error("The enum value %s from NMSettingWiredWakeOnLan is not checked for " + "_NMSettingWiredWakeOnLan", + value->value_name); + } + } +} + +/*****************************************************************************/ + typedef struct _nm_packed { int v0; char v1; @@ -1227,7 +1286,7 @@ _dedup_obj_destroy(NMDedupMultiObj *obj) { DedupObj *o = (DedupObj *) obj; - nm_assert(o->parent._ref_count == 0); + g_assert(o->parent._ref_count == 0); o->parent._ref_count = 1; o = _dedup_obj_assert(obj); g_slice_free(DedupObj, o); @@ -8805,6 +8864,20 @@ test_nm_utils_enum(void) NULL, color_value_infos); + _test_nm_utils_enum_from_str_do_full(NM_TYPE_SETTING_CONNECTION_LLMNR, + "-1", + TRUE, + -1, + NULL, + NULL); + + _test_nm_utils_enum_from_str_do_full(NM_TYPE_SETTING_CONNECTION_LLMNR, + "-0x1", + TRUE, + -1, + NULL, + NULL); + _test_nm_utils_enum_get_values_do(bool_enum, 0, G_MAXINT, "no,yes,maybe,unknown,67,64"); _test_nm_utils_enum_get_values_do(bool_enum, NM_TEST_GENERAL_BOOL_ENUM_YES, @@ -10208,6 +10281,7 @@ main(int argc, char **argv) nmtst_init(&argc, &argv, TRUE); g_test_add_func("/core/general/test_nm_ascii_spaces", test_nm_ascii_spaces); + g_test_add_func("/core/general/test_wired_wake_on_lan_enum", test_wired_wake_on_lan_enum); g_test_add_func("/core/general/test_nm_hash", test_nm_hash); g_test_add_func("/core/general/test_nm_g_slice_free_fcn", test_nm_g_slice_free_fcn); g_test_add_func("/core/general/test_c_list_sort", test_c_list_sort); diff --git a/libnm-core/tests/test-setting.c b/libnm-core/tests/test-setting.c index 1ab2b79..b17ba15 100644 --- a/libnm-core/tests/test-setting.c +++ b/libnm-core/tests/test-setting.c @@ -9,6 +9,7 @@ #include #include "nm-glib-aux/nm-json-aux.h" +#include "nm-base/nm-ethtool-utils-base.h" #include "nm-core-internal.h" #include "nm-utils.h" #include "nm-utils-private.h" diff --git a/libnm/NetworkManager.h b/libnm/NetworkManager.h index b0b4cf3..f9cc856 100644 --- a/libnm/NetworkManager.h +++ b/libnm/NetworkManager.h @@ -45,6 +45,7 @@ #include "nm-device.h" #include "nm-dhcp-config.h" #include "nm-enum-types.h" +#include "nm-ethtool-utils.h" #include "nm-ip-config.h" #include "nm-keyfile.h" #include "nm-object.h" diff --git a/libnm/meson.build b/libnm/meson.build index e4179c3..27f51df 100644 --- a/libnm/meson.build +++ b/libnm/meson.build @@ -51,6 +51,7 @@ libnm_headers = files( 'nm-device-wpan.h', 'nm-device.h', 'nm-dhcp-config.h', + 'nm-ethtool-utils.h', 'nm-ip-config.h', 'nm-object.h', 'nm-remote-connection.h', diff --git a/libnm/nm-ethtool-utils.h b/libnm/nm-ethtool-utils.h new file mode 100644 index 0000000..e8df3da --- /dev/null +++ b/libnm/nm-ethtool-utils.h @@ -0,0 +1,100 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2018 Red Hat, Inc. + */ + +#ifndef __NM_ETHTOOL_UTILS_H__ +#define __NM_ETHTOOL_UTILS_H__ + +G_BEGIN_DECLS + +/*****************************************************************************/ + +#define NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD "feature-esp-hw-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD "feature-esp-tx-csum-hw-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU "feature-fcoe-mtu" +#define NM_ETHTOOL_OPTNAME_FEATURE_GRO "feature-gro" +#define NM_ETHTOOL_OPTNAME_FEATURE_GSO "feature-gso" +#define NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA "feature-highdma" +#define NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD "feature-hw-tc-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD "feature-l2-fwd-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK "feature-loopback" +#define NM_ETHTOOL_OPTNAME_FEATURE_LRO "feature-lro" +#define NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE "feature-ntuple" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX "feature-rx" +#define NM_ETHTOOL_OPTNAME_FEATURE_RXHASH "feature-rxhash" +#define NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN "feature-rxvlan" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL "feature-rx-all" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS "feature-rx-fcs" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW "feature-rx-gro-hw" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD "feature-rx-udp_tunnel-port-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER "feature-rx-vlan-filter" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER "feature-rx-vlan-stag-filter" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE "feature-rx-vlan-stag-hw-parse" +#define NM_ETHTOOL_OPTNAME_FEATURE_SG "feature-sg" +#define NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD "feature-tls-hw-record" +#define NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD "feature-tls-hw-tx-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_TSO "feature-tso" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX "feature-tx" +#define NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN "feature-txvlan" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC "feature-tx-checksum-fcoe-crc" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4 "feature-tx-checksum-ipv4" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6 "feature-tx-checksum-ipv6" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC "feature-tx-checksum-ip-generic" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP "feature-tx-checksum-sctp" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION "feature-tx-esp-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION "feature-tx-fcoe-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION "feature-tx-gre-csum-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION "feature-tx-gre-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL "feature-tx-gso-partial" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST "feature-tx-gso-robust" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION "feature-tx-ipxip4-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION "feature-tx-ipxip6-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY "feature-tx-nocache-copy" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER "feature-tx-scatter-gather" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST "feature-tx-scatter-gather-fraglist" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION "feature-tx-sctp-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION "feature-tx-tcp6-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION "feature-tx-tcp-ecn-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION \ + "feature-tx-tcp-mangleid-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION "feature-tx-tcp-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION "feature-tx-udp-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION \ + "feature-tx-udp_tnl-csum-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION "feature-tx-udp_tnl-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT "feature-tx-vlan-stag-hw-insert" + +#define NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX "coalesce-adaptive-rx" +#define NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX "coalesce-adaptive-tx" +#define NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH "coalesce-pkt-rate-high" +#define NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW "coalesce-pkt-rate-low" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES "coalesce-rx-frames" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH "coalesce-rx-frames-high" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ "coalesce-rx-frames-irq" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW "coalesce-rx-frames-low" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS "coalesce-rx-usecs" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH "coalesce-rx-usecs-high" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ "coalesce-rx-usecs-irq" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW "coalesce-rx-usecs-low" +#define NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL "coalesce-sample-interval" +#define NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS "coalesce-stats-block-usecs" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES "coalesce-tx-frames" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH "coalesce-tx-frames-high" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ "coalesce-tx-frames-irq" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW "coalesce-tx-frames-low" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS "coalesce-tx-usecs" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH "coalesce-tx-usecs-high" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ "coalesce-tx-usecs-irq" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW "coalesce-tx-usecs-low" + +#define NM_ETHTOOL_OPTNAME_RING_RX "ring-rx" +#define NM_ETHTOOL_OPTNAME_RING_RX_JUMBO "ring-rx-jumbo" +#define NM_ETHTOOL_OPTNAME_RING_RX_MINI "ring-rx-mini" +#define NM_ETHTOOL_OPTNAME_RING_TX "ring-tx" + +/*****************************************************************************/ + +G_END_DECLS + +#endif /* __NM_ETHTOOL_UTILS_H__ */ diff --git a/libnm/nm-settings-docs-gir.xml b/libnm/nm-settings-docs-gir.xml index f39a84b..b06f948 100644 --- a/libnm/nm-settings-docs-gir.xml +++ b/libnm/nm-settings-docs-gir.xml @@ -182,7 +182,7 @@ - + diff --git a/man/NetworkManager.8 b/man/NetworkManager.8 index 5c01789..723fd45 100644 --- a/man/NetworkManager.8 +++ b/man/NetworkManager.8 @@ -2,12 +2,12 @@ .\" Title: NetworkManager .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: Network management daemons -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NETWORKMANAGER" "8" "" "NetworkManager 1\&.29\&.8" "Network management daemons" +.TH "NETWORKMANAGER" "8" "" "NetworkManager 1\&.29\&.9" "Network management daemons" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/man/NetworkManager.conf.5 b/man/NetworkManager.conf.5 index b17ac36..69f8f0d 100644 --- a/man/NetworkManager.conf.5 +++ b/man/NetworkManager.conf.5 @@ -2,12 +2,12 @@ .\" Title: NetworkManager.conf .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: Configuration -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NETWORKMANAGER\&.CONF" "5" "" "NetworkManager 1\&.29\&.8" "Configuration" +.TH "NETWORKMANAGER\&.CONF" "5" "" "NetworkManager 1\&.29\&.9" "Configuration" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/man/nm-cloud-setup.8 b/man/nm-cloud-setup.8 index bc03e47..e506e71 100644 --- a/man/nm-cloud-setup.8 +++ b/man/nm-cloud-setup.8 @@ -2,12 +2,12 @@ .\" Title: nm-cloud-setup .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: Automatic Network Configuration in Cloud with NetworkManager -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NM\-CLOUD\-SETUP" "8" "" "NetworkManager 1\&.29\&.8" "Automatic Network Configuratio" +.TH "NM\-CLOUD\-SETUP" "8" "" "NetworkManager 1\&.29\&.9" "Automatic Network Configuratio" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/man/nm-initrd-generator.8 b/man/nm-initrd-generator.8 index bf32aba..486b333 100644 --- a/man/nm-initrd-generator.8 +++ b/man/nm-initrd-generator.8 @@ -2,12 +2,12 @@ .\" Title: nm-initrd-generator .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: System Administration -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NM\-INITRD\-GENERATOR" "8" "" "NetworkManager 1\&.29\&.8" "System Administration" +.TH "NM\-INITRD\-GENERATOR" "8" "" "NetworkManager 1\&.29\&.9" "System Administration" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/man/nm-online.1 b/man/nm-online.1 index 546cd60..46c8221 100644 --- a/man/nm-online.1 +++ b/man/nm-online.1 @@ -2,12 +2,12 @@ .\" Title: nm-online .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: General Commands Manual -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NM\-ONLINE" "1" "" "NetworkManager 1\&.29\&.8" "General Commands Manual" +.TH "NM\-ONLINE" "1" "" "NetworkManager 1\&.29\&.9" "General Commands Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/man/nm-openvswitch.7 b/man/nm-openvswitch.7 index 572f71c..d2cd58b 100644 --- a/man/nm-openvswitch.7 +++ b/man/nm-openvswitch.7 @@ -2,12 +2,12 @@ .\" Title: nm-openvswitch .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: Open vSwitch support overview -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NM\-OPENVSWITCH" "7" "" "NetworkManager 1\&.29\&.8" "Open vSwitch support overview" +.TH "NM\-OPENVSWITCH" "7" "" "NetworkManager 1\&.29\&.9" "Open vSwitch support overview" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/man/nm-settings-dbus.5 b/man/nm-settings-dbus.5 index 1f99a76..efccdb2 100644 --- a/man/nm-settings-dbus.5 +++ b/man/nm-settings-dbus.5 @@ -2,12 +2,12 @@ .\" Title: nm-settings-dbus .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: Configuration -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NM\-SETTINGS\-DBUS" "5" "" "NetworkManager 1\&.29\&.8" "Configuration" +.TH "NM\-SETTINGS\-DBUS" "5" "" "NetworkManager 1\&.29\&.9" "Configuration" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -5240,7 +5240,7 @@ NMTernary (int32) T}:T{ \ \& T}:T{ -If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6)\&. If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn\*(Aqt have the default route\&. When set to NM_TERNARY_DEFAULT (\-1), the value from global configuration is used\&. If the property doesn\*(Aqt have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1)\&. +If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6)\&. If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn\*(Aqt have the default route\&. When set to NM_TERNARY_DEFAULT (\-1), the value from global configuration is used\&. If the property doesn\*(Aqt have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_FALSE (0)\&. T} T{ priority diff --git a/man/nm-settings-dbus.xml b/man/nm-settings-dbus.xml index be55abf..1c8163e 100644 --- a/man/nm-settings-dbus.xml +++ b/man/nm-settings-dbus.xml @@ -1,6 +1,6 @@ -nm-settings-dbusNetworkManager developersnm-settings-dbus5NetworkManagerConfiguration1.29.8nm-settings-dbusDescription of settings and properties of NetworkManager connection profiles on the D-Bus APIDescription +nm-settings-dbusNetworkManager developersnm-settings-dbus5NetworkManagerConfiguration1.29.9nm-settings-dbusDescription of settings and properties of NetworkManager connection profiles on the D-Bus APIDescription NetworkManager is based on a concept of connection profiles, sometimes referred to as connections only. These connection profiles contain a network configuration. When NetworkManager activates a connection profile on a network device the configuration will @@ -32,7 +32,7 @@ profile type. nmcli connection editor has also a built-in describe command that can display description of particular settings and properties of this page. - connection settingGeneral Connection Profile Settings.Key NameValue TypeDefault ValueValue Descriptionauth-retriesint32-1The number of retries for the authentication. Zero means to try indefinitely; -1 means to use a global default. If the global default is not set, the authentication retries for 3 times before failing the connection. Currently, this only applies to 802-1x authentication.autoconnectbooleanTRUEWhether or not the connection should be automatically connected by NetworkManager when the resources for the connection are available. TRUE to automatically activate the connection, FALSE to require manual intervention to activate the connection. Note that autoconnect is not implemented for VPN profiles. See "secondaries" as an alternative to automatically connect VPN profiles.autoconnect-priorityint320The autoconnect priority. If the connection is set to autoconnect, connections with higher priority will be preferred. Defaults to 0. The higher number means higher priority.autoconnect-retriesint32-1The number of times a connection should be tried when autoactivating before giving up. Zero means forever, -1 means the global default (4 times if not overridden). Setting this to 1 means to try activation only once before blocking autoconnect. Note that after a timeout, NetworkManager will try to autoconnect again.autoconnect-slavesNMSettingConnectionAutoconnectSlaves (int32)Whether or not slaves of this connection should be automatically brought up when NetworkManager activates this connection. This only has a real effect for master connections. The properties "autoconnect", "autoconnect-priority" and "autoconnect-retries" are unrelated to this setting. The permitted values are: 0: leave slave connections untouched, 1: activate all the slave connections with this connection, -1: default. If -1 (default) is set, global connection.autoconnect-slaves is read to determine the real value. If it is default as well, this fallbacks to 0.gateway-ping-timeoutuint320If greater than zero, delay success of IP addressing until either the timeout is reached, or an IP gateway replies to a ping.idstringA human readable unique identifier for the connection, like "Work Wi-Fi" or "T-Mobile 3G".interface-namestringThe name of the network interface this connection is bound to. If not set, then the connection can be attached to any interface of the appropriate type (subject to restrictions imposed by other settings). For software devices this specifies the name of the created device. For connection types where interface names cannot easily be made persistent (e.g. mobile broadband or USB Ethernet), this property should not be used. Setting this property restricts the interfaces a connection can be used with, and if interface names change or are reordered the connection may be applied to the wrong interface.lldpint32-1Whether LLDP is enabled for the connection.llmnrint32-1Whether Link-Local Multicast Name Resolution (LLMNR) is enabled for the connection. LLMNR is a protocol based on the Domain Name System (DNS) packet format that allows both IPv4 and IPv6 hosts to perform name resolution for hosts on the same local link. The permitted values are: "yes" (2) register hostname and resolving for the connection, "no" (0) disable LLMNR for the interface, "resolve" (1) do not register hostname but allow resolving of LLMNR host names If unspecified, "default" ultimately depends on the DNS plugin (which for systemd-resolved currently means "yes"). This feature requires a plugin which supports LLMNR. Otherwise, the setting has no effect. One such plugin is dns-systemd-resolved.masterstringInterface name of the master device or UUID of the master connection.mdnsint32-1Whether mDNS is enabled for the connection. The permitted values are: "yes" (2) register hostname and resolving for the connection, "no" (0) disable mDNS for the interface, "resolve" (1) do not register hostname but allow resolving of mDNS host names and "default" (-1) to allow lookup of a global default in NetworkManager.conf. If unspecified, "default" ultimately depends on the DNS plugin (which for systemd-resolved currently means "no"). This feature requires a plugin which supports mDNS. Otherwise, the setting has no effect. One such plugin is dns-systemd-resolved.meteredNMMetered (int32)Whether the connection is metered. When updating this property on a currently activated connection, the change takes effect immediately.mud-urlstringIf configured, set to a Manufacturer Usage Description (MUD) URL that points to manufacturer-recommended network policies for IoT devices. It is transmitted as a DHCPv4 or DHCPv6 option. The value must be a valid URL starting with "https://". The special value "none" is allowed to indicate that no MUD URL is used. If the per-profile value is unspecified (the default), a global connection default gets consulted. If still unspecified, the ultimate default is "none".multi-connectint320Specifies whether the profile can be active multiple times at a particular moment. The value is of type NMConnectionMultiConnect.permissionsarray of stringAn array of strings defining what access a given user has to this connection. If this is NULL or empty, all users are allowed to access this connection; otherwise users are allowed if and only if they are in this list. When this is not empty, the connection can be active only when one of the specified users is logged into an active session. Each entry is of the form "[type]:[id]:[reserved]"; for example, "user:dcbw:blah". At this time only the "user" [type] is allowed. Any other values are ignored and reserved for future use. [id] is the username that this permission refers to, which may not contain the ":" character. Any [reserved] information present must be ignored and is reserved for future use. All of [type], [id], and [reserved] must be valid UTF-8.read-onlybooleanFALSEFALSE if the connection can be modified using the provided settings service's D-Bus interface with the right privileges, or TRUE if the connection is read-only and cannot be modified.secondariesarray of stringList of connection UUIDs that should be activated when the base connection itself is activated. Currently, only VPN connections are supported.slave-typestringSetting name of the device type of this slave's master connection (eg, "bond"), or NULL if this connection is not a slave.stable-idstringThis represents the identity of the connection used for various purposes. It allows to configure multiple profiles to share the identity. Also, the stable-id can contain placeholders that are substituted dynamically and deterministically depending on the context. The stable-id is used for generating IPv6 stable private addresses with ipv6.addr-gen-mode=stable-privacy. It is also used to seed the generated cloned MAC address for ethernet.cloned-mac-address=stable and wifi.cloned-mac-address=stable. It is also used as DHCP client identifier with ipv4.dhcp-client-id=stable and to derive the DHCP DUID with ipv6.dhcp-duid=stable-[llt,ll,uuid]. Note that depending on the context where it is used, other parameters are also seeded into the generation algorithm. For example, a per-host key is commonly also included, so that different systems end up generating different IDs. Or with ipv6.addr-gen-mode=stable-privacy, also the device's name is included, so that different interfaces yield different addresses. The per-host key is the identity of your machine and stored in /var/lib/NetworkManager/secret-key. The '$' character is treated special to perform dynamic substitutions at runtime. Currently, supported are "${CONNECTION}", "${DEVICE}", "${MAC}", "${BOOT}", "${RANDOM}". These effectively create unique IDs per-connection, per-device, per-boot, or every time. Note that "${DEVICE}" corresponds to the interface name of the device and "${MAC}" is the permanent MAC address of the device. Any unrecognized patterns following '$' are treated verbatim, however are reserved for future use. You are thus advised to avoid '$' or escape it as "$$". For example, set it to "${CONNECTION}-${BOOT}-${DEVICE}" to create a unique id for this connection that changes with every reboot and differs depending on the interface where the profile activates. If the value is unset, a global connection default is consulted. If the value is still unset, the default is similar to "${CONNECTION}" and uses a unique, fixed ID for the connection.timestampuint640The time, in seconds since the Unix Epoch, that the connection was last _successfully_ fully activated. NetworkManager updates the connection timestamp periodically when the connection is active to ensure that an active connection has the latest timestamp. The property is only meant for reading (changes to this property will not be preserved).typestringBase type of the connection. For hardware-dependent connections, should contain the setting name of the hardware-type specific setting (ie, "802-3-ethernet" or "802-11-wireless" or "bluetooth", etc), and for non-hardware dependent connections like VPN or otherwise, should contain the setting name of that setting type (ie, "vpn" or "bridge", etc).uuidstringA universally unique identifier for the connection, for example generated with libuuid. It should be assigned when the connection is created, and never changed as long as the connection still applies to the same network. For example, it should not be changed when the "id" property or NMSettingIP4Config changes, but might need to be re-created when the Wi-Fi SSID, mobile broadband network provider, or "type" property changes. The UUID must be in the format "2815492f-7e56-435e-b2e9-246bd7cdc664" (ie, contains only hexadecimal characters and "-").wait-device-timeoutint32-1Timeout in milliseconds to wait for device at startup. During boot, devices may take a while to be detected by the driver. This property will cause to delay NetworkManager-wait-online.service and nm-online to give the device a chance to appear. This works by waiting for the given timeout until a compatible device for the profile is available and managed. The value 0 means no wait time. The default value is -1, which currently has the same meaning as no wait time.zonestringThe trust level of a the connection. Free form case-insensitive string (for example "Home", "Work", "Public"). NULL or unspecified zone means the connection will be placed in the default zone as defined by the firewall. When updating this property on a currently activated connection, the change takes effect immediately.6lowpan setting6LoWPAN Settings.Key NameValue TypeDefault ValueValue DescriptionparentstringIf given, specifies the parent interface name or parent connection UUID from which this 6LowPAN interface should be created.802-1x settingIEEE 802.1x Authentication Settings.Key NameValue TypeDefault ValueValue Descriptionaltsubject-matchesarray of stringList of strings to be matched against the altSubjectName of the certificate presented by the authentication server. If the list is empty, no verification of the server certificate's altSubjectName is performed.anonymous-identitystringAnonymous identity string for EAP authentication methods. Used as the unencrypted identity with EAP types that support different tunneled identity like EAP-TTLS.auth-timeoutint320A timeout for the authentication. Zero means the global default; if the global default is not set, the authentication timeout is 25 seconds.ca-certbyte arrayContains the CA certificate if used by the EAP method specified in the "eap" property. Certificate data is specified using a "scheme"; three are currently supported: blob, path and pkcs#11 URL. When using the blob scheme this property should be set to the certificate's DER encoded data. When using the path scheme, this property should be set to the full UTF-8 encoded path of the certificate, prefixed with the string "file://" and ending with a terminating NUL byte. This property can be unset even if the EAP method supports CA certificates, but this allows man-in-the-middle attacks and is NOT recommended. Note that enabling NMSetting8021x:system-ca-certs will override this setting to use the built-in path, if the built-in path is not a directory.ca-cert-passwordstringThe password used to access the CA certificate stored in "ca-cert" property. Only makes sense if the certificate is stored on a PKCS#11 token that requires a login.ca-cert-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "ca-cert-password" property. (see for flag values)ca-pathstringUTF-8 encoded path to a directory containing PEM or DER formatted certificates to be added to the verification chain in addition to the certificate specified in the "ca-cert" property. If NMSetting8021x:system-ca-certs is enabled and the built-in CA path is an existing directory, then this setting is ignored.client-certbyte arrayContains the client certificate if used by the EAP method specified in the "eap" property. Certificate data is specified using a "scheme"; two are currently supported: blob and path. When using the blob scheme (which is backwards compatible with NM 0.7.x) this property should be set to the certificate's DER encoded data. When using the path scheme, this property should be set to the full UTF-8 encoded path of the certificate, prefixed with the string "file://" and ending with a terminating NUL byte.client-cert-passwordstringThe password used to access the client certificate stored in "client-cert" property. Only makes sense if the certificate is stored on a PKCS#11 token that requires a login.client-cert-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "client-cert-password" property. (see for flag values)domain-matchstringConstraint for server domain name. If set, this list of FQDNs is used as a match requirement for dNSName element(s) of the certificate presented by the authentication server. If a matching dNSName is found, this constraint is met. If no dNSName values are present, this constraint is matched against SubjectName CN using the same comparison. Multiple valid FQDNs can be passed as a ";" delimited list.domain-suffix-matchstringConstraint for server domain name. If set, this FQDN is used as a suffix match requirement for dNSName element(s) of the certificate presented by the authentication server. If a matching dNSName is found, this constraint is met. If no dNSName values are present, this constraint is matched against SubjectName CN using same suffix match comparison. Since version 1.24, multiple valid FQDNs can be passed as a ";" delimited list.eaparray of stringThe allowed EAP method to be used when authenticating to the network with 802.1x. Valid methods are: "leap", "md5", "tls", "peap", "ttls", "pwd", and "fast". Each method requires different configuration using the properties of this setting; refer to wpa_supplicant documentation for the allowed combinations.identitystringIdentity string for EAP authentication methods. Often the user's user or login name.optionalbooleanFALSEWhether the 802.1X authentication is optional. If TRUE, the activation will continue even after a timeout or an authentication failure. Setting the property to TRUE is currently allowed only for Ethernet connections. If set to FALSE, the activation can continue only after a successful authentication.pac-filestringUTF-8 encoded file path containing PAC for EAP-FAST.passwordstringUTF-8 encoded password used for EAP authentication methods. If both the "password" property and the "password-raw" property are specified, "password" is preferred.password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password" property. (see for flag values)password-rawbyte arrayPassword used for EAP authentication methods, given as a byte array to allow passwords in other encodings than UTF-8 to be used. If both the "password" property and the "password-raw" property are specified, "password" is preferred.password-raw-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password-raw" property. (see for flag values)phase1-auth-flagsuint320Specifies authentication flags to use in "phase 1" outer authentication using NMSetting8021xAuthFlags options. The individual TLS versions can be explicitly disabled. If a certain TLS disable flag is not set, it is up to the supplicant to allow or forbid it. The TLS options map to tls_disable_tlsv1_x settings. See the wpa_supplicant documentation for more details.phase1-fast-provisioningstringEnables or disables in-line provisioning of EAP-FAST credentials when FAST is specified as the EAP method in the "eap" property. Recognized values are "0" (disabled), "1" (allow unauthenticated provisioning), "2" (allow authenticated provisioning), and "3" (allow both authenticated and unauthenticated provisioning). See the wpa_supplicant documentation for more details.phase1-peaplabelstringForces use of the new PEAP label during key derivation. Some RADIUS servers may require forcing the new PEAP label to interoperate with PEAPv1. Set to "1" to force use of the new PEAP label. See the wpa_supplicant documentation for more details.phase1-peapverstringForces which PEAP version is used when PEAP is set as the EAP method in the "eap" property. When unset, the version reported by the server will be used. Sometimes when using older RADIUS servers, it is necessary to force the client to use a particular PEAP version. To do so, this property may be set to "0" or "1" to force that specific PEAP version.phase2-altsubject-matchesarray of stringList of strings to be matched against the altSubjectName of the certificate presented by the authentication server during the inner "phase 2" authentication. If the list is empty, no verification of the server certificate's altSubjectName is performed.phase2-authstringSpecifies the allowed "phase 2" inner non-EAP authentication method when an EAP method that uses an inner TLS tunnel is specified in the "eap" property. Recognized non-EAP "phase 2" methods are "pap", "chap", "mschap", "mschapv2", "gtc", "otp", "md5", and "tls". Each "phase 2" inner method requires specific parameters for successful authentication; see the wpa_supplicant documentation for more details.phase2-autheapstringSpecifies the allowed "phase 2" inner EAP-based authentication method when an EAP method that uses an inner TLS tunnel is specified in the "eap" property. Recognized EAP-based "phase 2" methods are "md5", "mschapv2", "otp", "gtc", and "tls". Each "phase 2" inner method requires specific parameters for successful authentication; see the wpa_supplicant documentation for more details.phase2-ca-certbyte arrayContains the "phase 2" CA certificate if used by the EAP method specified in the "phase2-auth" or "phase2-autheap" properties. Certificate data is specified using a "scheme"; three are currently supported: blob, path and pkcs#11 URL. When using the blob scheme this property should be set to the certificate's DER encoded data. When using the path scheme, this property should be set to the full UTF-8 encoded path of the certificate, prefixed with the string "file://" and ending with a terminating NUL byte. This property can be unset even if the EAP method supports CA certificates, but this allows man-in-the-middle attacks and is NOT recommended. Note that enabling NMSetting8021x:system-ca-certs will override this setting to use the built-in path, if the built-in path is not a directory.phase2-ca-cert-passwordstringThe password used to access the "phase2" CA certificate stored in "phase2-ca-cert" property. Only makes sense if the certificate is stored on a PKCS#11 token that requires a login.phase2-ca-cert-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "phase2-ca-cert-password" property. (see for flag values)phase2-ca-pathstringUTF-8 encoded path to a directory containing PEM or DER formatted certificates to be added to the verification chain in addition to the certificate specified in the "phase2-ca-cert" property. If NMSetting8021x:system-ca-certs is enabled and the built-in CA path is an existing directory, then this setting is ignored.phase2-client-certbyte arrayContains the "phase 2" client certificate if used by the EAP method specified in the "phase2-auth" or "phase2-autheap" properties. Certificate data is specified using a "scheme"; two are currently supported: blob and path. When using the blob scheme (which is backwards compatible with NM 0.7.x) this property should be set to the certificate's DER encoded data. When using the path scheme, this property should be set to the full UTF-8 encoded path of the certificate, prefixed with the string "file://" and ending with a terminating NUL byte. This property can be unset even if the EAP method supports CA certificates, but this allows man-in-the-middle attacks and is NOT recommended.phase2-client-cert-passwordstringThe password used to access the "phase2" client certificate stored in "phase2-client-cert" property. Only makes sense if the certificate is stored on a PKCS#11 token that requires a login.phase2-client-cert-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "phase2-client-cert-password" property. (see for flag values)phase2-domain-matchstringConstraint for server domain name. If set, this list of FQDNs is used as a match requirement for dNSName element(s) of the certificate presented by the authentication server during the inner "phase 2" authentication. If a matching dNSName is found, this constraint is met. If no dNSName values are present, this constraint is matched against SubjectName CN using the same comparison. Multiple valid FQDNs can be passed as a ";" delimited list.phase2-domain-suffix-matchstringConstraint for server domain name. If set, this FQDN is used as a suffix match requirement for dNSName element(s) of the certificate presented by the authentication server during the inner "phase 2" authentication. If a matching dNSName is found, this constraint is met. If no dNSName values are present, this constraint is matched against SubjectName CN using same suffix match comparison. Since version 1.24, multiple valid FQDNs can be passed as a ";" delimited list.phase2-private-keybyte arrayContains the "phase 2" inner private key when the "phase2-auth" or "phase2-autheap" property is set to "tls". Key data is specified using a "scheme"; two are currently supported: blob and path. When using the blob scheme and private keys, this property should be set to the key's encrypted PEM encoded data. When using private keys with the path scheme, this property should be set to the full UTF-8 encoded path of the key, prefixed with the string "file://" and ending with a terminating NUL byte. When using PKCS#12 format private keys and the blob scheme, this property should be set to the PKCS#12 data and the "phase2-private-key-password" property must be set to password used to decrypt the PKCS#12 certificate and key. When using PKCS#12 files and the path scheme, this property should be set to the full UTF-8 encoded path of the key, prefixed with the string "file://" and ending with a terminating NUL byte, and as with the blob scheme the "phase2-private-key-password" property must be set to the password used to decode the PKCS#12 private key and certificate.phase2-private-key-passwordstringThe password used to decrypt the "phase 2" private key specified in the "phase2-private-key" property when the private key either uses the path scheme, or is a PKCS#12 format key.phase2-private-key-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "phase2-private-key-password" property. (see for flag values)phase2-subject-matchstringSubstring to be matched against the subject of the certificate presented by the authentication server during the inner "phase 2" authentication. When unset, no verification of the authentication server certificate's subject is performed. This property provides little security, if any, and its use is deprecated in favor of NMSetting8021x:phase2-domain-suffix-match.pinstringPIN used for EAP authentication methods.pin-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "pin" property. (see for flag values)private-keybyte arrayContains the private key when the "eap" property is set to "tls". Key data is specified using a "scheme"; two are currently supported: blob and path. When using the blob scheme and private keys, this property should be set to the key's encrypted PEM encoded data. When using private keys with the path scheme, this property should be set to the full UTF-8 encoded path of the key, prefixed with the string "file://" and ending with a terminating NUL byte. When using PKCS#12 format private keys and the blob scheme, this property should be set to the PKCS#12 data and the "private-key-password" property must be set to password used to decrypt the PKCS#12 certificate and key. When using PKCS#12 files and the path scheme, this property should be set to the full UTF-8 encoded path of the key, prefixed with the string "file://" and ending with a terminating NUL byte, and as with the blob scheme the "private-key-password" property must be set to the password used to decode the PKCS#12 private key and certificate. WARNING: "private-key" is not a "secret" property, and thus unencrypted private key data using the BLOB scheme may be readable by unprivileged users. Private keys should always be encrypted with a private key password to prevent unauthorized access to unencrypted private key data.private-key-passwordstringThe password used to decrypt the private key specified in the "private-key" property when the private key either uses the path scheme, or if the private key is a PKCS#12 format key.private-key-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "private-key-password" property. (see for flag values)subject-matchstringSubstring to be matched against the subject of the certificate presented by the authentication server. When unset, no verification of the authentication server certificate's subject is performed. This property provides little security, if any, and its use is deprecated in favor of NMSetting8021x:domain-suffix-match.system-ca-certsbooleanFALSEWhen TRUE, overrides the "ca-path" and "phase2-ca-path" properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the "ca-cert" and "phase2-ca-cert" properties. If the path provided with --system-ca-path is rather a file name (bundle of trusted CA certificates), it overrides "ca-cert" and "phase2-ca-cert" properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant).adsl settingADSL Settings.Key NameValue TypeDefault ValueValue DescriptionencapsulationstringEncapsulation of ADSL connection. Can be "vcmux" or "llc".passwordstringPassword used to authenticate with the ADSL service.password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password" property. (see for flag values)protocolstringADSL connection protocol. Can be "pppoa", "pppoe" or "ipoatm".usernamestringUsername used to authenticate with the ADSL service.vciuint320VCI of ADSL connectionvpiuint320VPI of ADSL connectionbluetooth settingBluetooth Settings.Key NameValue TypeDefault ValueValue Descriptionbdaddrbyte arrayThe Bluetooth address of the device.typestringEither "dun" for Dial-Up Networking connections or "panu" for Personal Area Networking connections to devices supporting the NAP profile.bond settingBonding Settings.Key NameValue TypeDefault ValueValue Descriptioninterface-namestringDeprecated in favor of connection.interface-name, but can be used for backward-compatibility with older daemons, to set the bond's interface name.optionsdict of string to string{'mode': 'balance-rr'}Dictionary of key/value pairs of bonding options. Both keys and values must be strings. Option names must contain only alphanumeric characters (ie, [a-zA-Z0-9]).bridge settingBridging Settings.Key NameValue TypeDefault ValueValue Descriptionageing-timeuint32300The Ethernet MAC address aging time, in seconds.forward-delayuint3215The Spanning Tree Protocol (STP) forwarding delay, in seconds.group-addressbyte arrayIf specified, The MAC address of the multicast group this bridge uses for STP. The address must be a link-local address in standard Ethernet MAC address format, ie an address of the form 01:80:C2:00:00:0X, with X in [0, 4..F]. If not specified the default value is 01:80:C2:00:00:00.group-forward-maskuint320A mask of group addresses to forward. Usually, group addresses in the range from 01:80:C2:00:00:00 to 01:80:C2:00:00:0F are not forwarded according to standards. This property is a mask of 16 bits, each corresponding to a group address in that range that must be forwarded. The mask can't have bits 0, 1 or 2 set because they are used for STP, MAC pause frames and LACP.hello-timeuint322The Spanning Tree Protocol (STP) hello time, in seconds.interface-namestringDeprecated in favor of connection.interface-name, but can be used for backward-compatibility with older daemons, to set the bridge's interface name.mac-addressbyte arrayIf specified, the MAC address of bridge. When creating a new bridge, this MAC address will be set. If this field is left unspecified, the "ethernet.cloned-mac-address" is referred instead to generate the initial MAC address. Note that setting "ethernet.cloned-mac-address" anyway overwrites the MAC address of the bridge later while activating the bridge. Hence, this property is deprecated. Deprecated: 1max-ageuint3220The Spanning Tree Protocol (STP) maximum message age, in seconds.multicast-hash-maxuint324096Set maximum size of multicast hash table (value must be a power of 2).multicast-last-member-countuint322Set the number of queries the bridge will send before stopping forwarding a multicast group after a "leave" message has been received.multicast-last-member-intervaluint64100Set interval (in deciseconds) between queries to find remaining members of a group, after a "leave" message is received.multicast-membership-intervaluint6426000Set delay (in deciseconds) after which the bridge will leave a group, if no membership reports for this group are received.multicast-querierbooleanFALSEEnable or disable sending of multicast queries by the bridge. If not specified the option is disabled.multicast-querier-intervaluint6425500If no queries are seen after this delay (in deciseconds) has passed, the bridge will start to send its own queries.multicast-query-intervaluint6412500Interval (in deciseconds) between queries sent by the bridge after the end of the startup phase.multicast-query-response-intervaluint641000Set the Max Response Time/Max Response Delay (in deciseconds) for IGMP/MLD queries sent by the bridge.multicast-query-use-ifaddrbooleanFALSEIf enabled the bridge's own IP address is used as the source address for IGMP queries otherwise the default of 0.0.0.0 is used.multicast-routerstringSets bridge's multicast router. Multicast-snooping must be enabled for this option to work. Supported values are: 'auto', 'disabled', 'enabled' to which kernel assigns the numbers 1, 0, and 2, respectively. If not specified the default value is 'auto' (1).multicast-snoopingbooleanTRUEControls whether IGMP snooping is enabled for this bridge. Note that if snooping was automatically disabled due to hash collisions, the system may refuse to enable the feature until the collisions are resolved.multicast-startup-query-countuint322Set the number of IGMP queries to send during startup phase.multicast-startup-query-intervaluint643125Sets the time (in deciseconds) between queries sent out at startup to determine membership information.priorityuint3232768Sets the Spanning Tree Protocol (STP) priority for this bridge. Lower values are "better"; the lowest priority bridge will be elected the root bridge.stpbooleanTRUEControls whether Spanning Tree Protocol (STP) is enabled for this bridge.vlan-default-pviduint321The default PVID for the ports of the bridge, that is the VLAN id assigned to incoming untagged frames.vlan-filteringbooleanFALSEControl whether VLAN filtering is enabled on the bridge.vlan-protocolstringIf specified, the protocol used for VLAN filtering. Supported values are: '802.1Q', '802.1ad'. If not specified the default value is '802.1Q'.vlan-stats-enabledbooleanFALSEControls whether per-VLAN stats accounting is enabled.vlansarray of vardictArray of bridge VLAN objects. In addition to the VLANs specified here, the bridge will also have the default-pvid VLAN configured by the bridge.vlan-default-pvid property. In nmcli the VLAN list can be specified with the following syntax: $vid [pvid] [untagged] [, $vid [pvid] [untagged]]... where $vid is either a single id between 1 and 4094 or a range, represented as a couple of ids separated by a dash.bridge-port settingBridge Port Settings.Key NameValue TypeDefault ValueValue Descriptionhairpin-modebooleanFALSEEnables or disables "hairpin mode" for the port, which allows frames to be sent back out through the port the frame was received on.path-costuint32100The Spanning Tree Protocol (STP) port cost for destinations via this port.priorityuint3232The Spanning Tree Protocol (STP) priority of this bridge port.vlansarray of vardictArray of bridge VLAN objects. In addition to the VLANs specified here, the port will also have the default-pvid VLAN configured on the bridge by the bridge.vlan-default-pvid property. In nmcli the VLAN list can be specified with the following syntax: $vid [pvid] [untagged] [, $vid [pvid] [untagged]]... where $vid is either a single id between 1 and 4094 or a range, represented as a couple of ids separated by a dash.cdma settingCDMA-based Mobile Broadband Settings.Key NameValue TypeDefault ValueValue Descriptionmtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple frames.numberstringThe number to dial to establish the connection to the CDMA-based mobile broadband network, if any. If not specified, the default number (#777) is used when required.passwordstringThe password used to authenticate with the network, if required. Many providers do not require a password, or accept any password. But if a password is required, it is specified here.password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password" property. (see for flag values)usernamestringThe username used to authenticate with the network, if required. Many providers do not require a username, or accept any username. But if a username is required, it is specified here.dcb settingData Center Bridging Settings.Key NameValue TypeDefault ValueValue Descriptionapp-fcoe-flagsNMSettingDcbFlags (uint32)Specifies the NMSettingDcbFlags for the DCB FCoE application. Flags may be any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), NM_SETTING_DCB_FLAG_ADVERTISE (0x2), and NM_SETTING_DCB_FLAG_WILLING (0x4).app-fcoe-modestring"fabric"The FCoE controller mode; either "fabric" (default) or "vn2vn".app-fcoe-priorityint32-1The highest User Priority (0 - 7) which FCoE frames should use, or -1 for default priority. Only used when the "app-fcoe-flags" property includes the NM_SETTING_DCB_FLAG_ENABLE (0x1) flag.app-fip-flagsNMSettingDcbFlags (uint32)Specifies the NMSettingDcbFlags for the DCB FIP application. Flags may be any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), NM_SETTING_DCB_FLAG_ADVERTISE (0x2), and NM_SETTING_DCB_FLAG_WILLING (0x4).app-fip-priorityint32-1The highest User Priority (0 - 7) which FIP frames should use, or -1 for default priority. Only used when the "app-fip-flags" property includes the NM_SETTING_DCB_FLAG_ENABLE (0x1) flag.app-iscsi-flagsNMSettingDcbFlags (uint32)Specifies the NMSettingDcbFlags for the DCB iSCSI application. Flags may be any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), NM_SETTING_DCB_FLAG_ADVERTISE (0x2), and NM_SETTING_DCB_FLAG_WILLING (0x4).app-iscsi-priorityint32-1The highest User Priority (0 - 7) which iSCSI frames should use, or -1 for default priority. Only used when the "app-iscsi-flags" property includes the NM_SETTING_DCB_FLAG_ENABLE (0x1) flag.priority-bandwidtharray of uint32An array of 8 uint values, where the array index corresponds to the User Priority (0 - 7) and the value indicates the percentage of bandwidth of the priority's assigned group that the priority may use. The sum of all percentages for priorities which belong to the same group must total 100 percents.priority-flow-controlarray of uint32An array of 8 boolean values, where the array index corresponds to the User Priority (0 - 7) and the value indicates whether or not the corresponding priority should transmit priority pause.priority-flow-control-flagsNMSettingDcbFlags (uint32)Specifies the NMSettingDcbFlags for DCB Priority Flow Control (PFC). Flags may be any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), NM_SETTING_DCB_FLAG_ADVERTISE (0x2), and NM_SETTING_DCB_FLAG_WILLING (0x4).priority-group-bandwidtharray of uint32An array of 8 uint values, where the array index corresponds to the Priority Group ID (0 - 7) and the value indicates the percentage of link bandwidth allocated to that group. Allowed values are 0 - 100, and the sum of all values must total 100 percents.priority-group-flagsNMSettingDcbFlags (uint32)Specifies the NMSettingDcbFlags for DCB Priority Groups. Flags may be any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), NM_SETTING_DCB_FLAG_ADVERTISE (0x2), and NM_SETTING_DCB_FLAG_WILLING (0x4).priority-group-idarray of uint32An array of 8 uint values, where the array index corresponds to the User Priority (0 - 7) and the value indicates the Priority Group ID. Allowed Priority Group ID values are 0 - 7 or 15 for the unrestricted group.priority-strict-bandwidtharray of uint32An array of 8 boolean values, where the array index corresponds to the User Priority (0 - 7) and the value indicates whether or not the priority may use all of the bandwidth allocated to its assigned group.priority-traffic-classarray of uint32An array of 8 uint values, where the array index corresponds to the User Priority (0 - 7) and the value indicates the traffic class (0 - 7) to which the priority is mapped.dummy settingDummy Link Settings.Key NameValue TypeDefault ValueValue Descriptionethtool settingEthtool Ethernet Settings.Key NameValue TypeDefault ValueValue Descriptiongeneric settingGeneric Link Settings.Key NameValue TypeDefault ValueValue Descriptiongsm settingGSM-based Mobile Broadband Settings.Key NameValue TypeDefault ValueValue DescriptionapnstringThe GPRS Access Point Name specifying the APN used when establishing a data session with the GSM-based network. The APN often determines how the user will be billed for their network usage and whether the user has access to the Internet or just a provider-specific walled-garden, so it is important to use the correct APN for the user's mobile broadband plan. The APN may only be composed of the characters a-z, 0-9, ., and - per GSM 03.60 Section 14.9.auto-configbooleanFALSEWhen TRUE, the settings such as APN, username, or password will default to values that match the network the modem will register to in the Mobile Broadband Provider database.device-idstringThe device unique identifier (as given by the WWAN management service) which this connection applies to. If given, the connection will only apply to the specified device.home-onlybooleanFALSEWhen TRUE, only connections to the home network will be allowed. Connections to roaming networks will not be made.mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple frames.network-idstringThe Network ID (GSM LAI format, ie MCC-MNC) to force specific network registration. If the Network ID is specified, NetworkManager will attempt to force the device to register only on the specified network. This can be used to ensure that the device does not roam when direct roaming control of the device is not otherwise possible.numberstringLegacy setting that used to help establishing PPP data sessions for GSM-based modems. Deprecated: 1passwordstringThe password used to authenticate with the network, if required. Many providers do not require a password, or accept any password. But if a password is required, it is specified here.password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password" property. (see for flag values)pinstringIf the SIM is locked with a PIN it must be unlocked before any other operations are requested. Specify the PIN here to allow operation of the device.pin-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "pin" property. (see for flag values)sim-idstringThe SIM card unique identifier (as given by the WWAN management service) which this connection applies to. If given, the connection will apply to any device also allowed by "device-id" which contains a SIM card matching the given identifier.sim-operator-idstringA MCC/MNC string like "310260" or "21601" identifying the specific mobile network operator which this connection applies to. If given, the connection will apply to any device also allowed by "device-id" and "sim-id" which contains a SIM card provisioned by the given operator.usernamestringThe username used to authenticate with the network, if required. Many providers do not require a username, or accept any username. But if a username is required, it is specified here.infiniband settingInfiniband Settings.Key NameValue TypeDefault ValueValue Descriptionmac-addressbyte arrayIf specified, this connection will only apply to the IPoIB device whose permanent MAC address matches. This property does not change the MAC address of the device (i.e. MAC spoofing).mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple frames.p-keyint32-1The InfiniBand P_Key to use for this device. A value of -1 means to use the default P_Key (aka "the P_Key at index 0"). Otherwise, it is a 16-bit unsigned integer, whose high bit is set if it is a "full membership" P_Key.parentstringThe interface name of the parent device of this device. Normally NULL, but if the "p_key" property is set, then you must specify the base device by setting either this property or "mac-address".transport-modestringThe IP-over-InfiniBand transport mode. Either "datagram" or "connected".ipv4 settingIPv4 Settings.Key NameValue TypeDefault ValueValue Descriptionaddress-dataarray of vardictArray of IPv4 addresses. Each address dictionary contains at least 'address' and 'prefix' entries, containing the IP address as a string, and the prefix length as a uint32. Additional attributes may also exist on some addresses.addressesarray of array of uint32Deprecated in favor of the 'address-data' and 'gateway' properties, but this can be used for backward-compatibility with older daemons. Note that if you send this property the daemon will ignore 'address-data' and 'gateway'. Array of IPv4 address structures. Each IPv4 address structure is composed of 3 32-bit values; the first being the IPv4 address (network byte order), the second the prefix (1 - 32), and last the IPv4 gateway (network byte order). The gateway may be left as 0 if no gateway exists for that subnet.dad-timeoutint32-1Timeout in milliseconds used to check for the presence of duplicate IP addresses on the network. If an address conflict is detected, the activation will fail. A zero value means that no duplicate address detection is performed, -1 means the default value (either configuration ipvx.dad-timeout override or zero). A value greater than zero is a timeout in milliseconds. The property is currently implemented only for IPv4.dhcp-client-idstringA string sent to the DHCP server to identify the local machine which the DHCP server may use to customize the DHCP lease and options. When the property is a hex string ('aa:bb:cc') it is interpreted as a binary client ID, in which case the first byte is assumed to be the 'type' field as per RFC 2132 section 9.14 and the remaining bytes may be an hardware address (e.g. '01:xx:xx:xx:xx:xx:xx' where 1 is the Ethernet ARP type and the rest is a MAC address). If the property is not a hex string it is considered as a non-hardware-address client ID and the 'type' field is set to 0. The special values "mac" and "perm-mac" are supported, which use the current or permanent MAC address of the device to generate a client identifier with type ethernet (01). Currently, these options only work for ethernet type of links. The special value "ipv6-duid" uses the DUID from "ipv6.dhcp-duid" property as an RFC4361-compliant client identifier. As IAID it uses "ipv4.dhcp-iaid" and falls back to "ipv6.dhcp-iaid" if unset. The special value "duid" generates a RFC4361-compliant client identifier based on "ipv4.dhcp-iaid" and uses a DUID generated by hashing /etc/machine-id. The special value "stable" is supported to generate a type 0 client identifier based on the stable-id (see connection.stable-id) and a per-host key. If you set the stable-id, you may want to include the "${DEVICE}" or "${MAC}" specifier to get a per-device key. If unset, a globally configured default is used. If still unset, the default depends on the DHCP plugin.dhcp-fqdnstringIf the "dhcp-send-hostname" property is TRUE, then the specified FQDN will be sent to the DHCP server when acquiring a lease. This property and "dhcp-hostname" are mutually exclusive and cannot be set at the same time.dhcp-hostnamestringIf the "dhcp-send-hostname" property is TRUE, then the specified name will be sent to the DHCP server when acquiring a lease. This property and "dhcp-fqdn" are mutually exclusive and cannot be set at the same time.dhcp-hostname-flagsuint320Flags for the DHCP hostname and FQDN. Currently, this property only includes flags to control the FQDN flags set in the DHCP FQDN option. Supported FQDN flags are NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1), NM_DHCP_HOSTNAME_FLAG_FQDN_ENCODED (0x2) and NM_DHCP_HOSTNAME_FLAG_FQDN_NO_UPDATE (0x4). When no FQDN flag is set and NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS (0x8) is set, the DHCP FQDN option will contain no flag. Otherwise, if no FQDN flag is set and NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS (0x8) is not set, the standard FQDN flags are set in the request: NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1), NM_DHCP_HOSTNAME_FLAG_FQDN_ENCODED (0x2) for IPv4 and NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1) for IPv6. When this property is set to the default value NM_DHCP_HOSTNAME_FLAG_NONE (0x0), a global default is looked up in NetworkManager configuration. If that value is unset or also NM_DHCP_HOSTNAME_FLAG_NONE (0x0), then the standard FQDN flags described above are sent in the DHCP requests.dhcp-iaidstringA string containing the "Identity Association Identifier" (IAID) used by the DHCP client. The property is a 32-bit decimal value or a special value among "mac", "perm-mac", "ifname" and "stable". When set to "mac" (or "perm-mac"), the last 4 bytes of the current (or permanent) MAC address are used as IAID. When set to "ifname", the IAID is computed by hashing the interface name. The special value "stable" can be used to generate an IAID based on the stable-id (see connection.stable-id), a per-host key and the interface name. When the property is unset, the value from global configuration is used; if no global default is set then the IAID is assumed to be "ifname". Note that at the moment this property is ignored for IPv6 by dhclient, which always derives the IAID from the MAC address.dhcp-reject-serversarray of stringArray of servers from which DHCP offers must be rejected. This property is useful to avoid getting a lease from misconfigured or rogue servers. For DHCPv4, each element must be an IPv4 address, optionally followed by a slash and a prefix length (e.g. "192.168.122.0/24"). This property is currently not implemented for DHCPv6.dhcp-send-hostnamebooleanTRUEIf TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some DHCP servers use this hostname to update DNS databases, essentially providing a static hostname for the computer. If the "dhcp-hostname" property is NULL and this property is TRUE, the current persistent hostname of the computer is sent.dhcp-timeoutint320A timeout for a DHCP transaction in seconds. If zero (the default), a globally configured default is used. If still unspecified, a device specific timeout is used (usually 45 seconds). Set to 2147483647 (MAXINT32) for infinity.dhcp-vendor-class-identifierstringThe Vendor Class Identifier DHCP option (60). Special characters in the data string may be escaped using C-style escapes, nevertheless this property cannot contain nul bytes. If the per-profile value is unspecified (the default), a global connection default gets consulted. If still unspecified, the DHCP option is not sent to the server. Since 1.28dnsarray of uint32Array of IP addresses of DNS servers (as network-byte-order integers)dns-optionsarray of stringArray of DNS options as described in man 5 resolv.conf. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties. The currently supported options are "attempts", "debug", "edns0", "inet6", "ip6-bytestring", "ip6-dotint", "ndots", "no-check-names", "no-ip6-dotint", "no-reload", "no-tld-query", "rotate", "single-request", "single-request-reopen", "timeout", "trust-ad", "use-vc". The "trust-ad" setting is only honored if the profile contributes name servers to resolv.conf, and if all contributing profiles have "trust-ad" enabled.dns-priorityint320DNS servers priority. The relative priority for DNS servers specified by this setting. A lower numerical value is better (higher priority). Negative values have the special effect of excluding other configurations with a greater numerical priority value; so in presence of at least one negative priority, only DNS servers from connections with the lowest priority value will be used. To avoid all DNS leaks, set the priority of the profile that should be used to the most negative value of all active connections profiles. Zero selects a globally configured default value. If the latter is missing or zero too, it defaults to 50 for VPNs (including WireGuard) and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. When multiple devices have configurations with the same priority, VPNs will be considered first, then devices with the best (lowest metric) default route and then all other devices. When using dns=default, servers with higher priority will be on top of resolv.conf. To prioritize a given server over another one within the same connection, just specify them in the desired order. Note that commonly the resolver tries name servers in /etc/resolv.conf in the order listed, proceeding with the next server in the list on failure. See for example the "rotate" option of the dns-options setting. If there are any negative DNS priorities, then only name servers from the devices with that lowest priority will be considered. When using a DNS resolver that supports Conditional Forwarding or Split DNS (with dns=dnsmasq or dns=systemd-resolved settings), each connection is used to query domains in its search list. The search domains determine which name servers to ask, and the DNS priority is used to prioritize name servers based on the domain. Queries for domains not present in any search list are routed through connections having the '~.' special wildcard domain, which is added automatically to connections with the default route (or can be added manually). When multiple connections specify the same domain, the one with the best priority (lowest numerical value) wins. If a sub domain is configured on another interface it will be accepted regardless the priority, unless parent domain on the other interface has a negative priority, which causes the sub domain to be shadowed. With Split DNS one can avoid undesired DNS leaks by properly configuring DNS priorities and the search domains, so that only name servers of the desired interface are configured.dns-searcharray of stringArray of DNS search domains. Domains starting with a tilde ('~') are considered 'routing' domains and are used only to decide the interface over which a query must be forwarded; they are not used to complete unqualified host names. When using a DNS plugin that supports Conditional Forwarding or Split DNS, then the search domains specify which name servers to query. This makes the behavior different from running with plain /etc/resolv.conf. For more information see also the dns-priority setting.gatewaystringThe gateway associated with this configuration. This is only meaningful if "addresses" is also set. The gateway's main purpose is to control the next hop of the standard default route on the device. Hence, the gateway property conflicts with "never-default" and will be automatically dropped if the IP configuration is set to never-default. As an alternative to set the gateway, configure a static default route with /0 as prefix length.ignore-auto-dnsbooleanFALSEWhen "method" is set to "auto" and this property to TRUE, automatically configured name servers and search domains are ignored and only name servers and search domains specified in the "dns" and "dns-search" properties, if any, are used.ignore-auto-routesbooleanFALSEWhen "method" is set to "auto" and this property to TRUE, automatically configured routes are ignored and only routes specified in the "routes" property, if any, are used.may-failbooleanTRUEIf TRUE, allow overall network configuration to proceed even if the configuration specified by this property times out. Note that at least one IP configuration must succeed or overall network configuration will still fail. For example, in IPv6-only networks, setting this property to TRUE on the NMSettingIP4Config allows the overall network configuration to succeed if IPv4 configuration fails but IPv6 configuration completes successfully.methodstringIP configuration method. NMSettingIP4Config and NMSettingIP6Config both support "disabled", "auto", "manual", and "link-local". See the subclass-specific documentation for other values. In general, for the "auto" method, properties such as "dns" and "routes" specify information that is added on to the information returned from automatic configuration. The "ignore-auto-routes" and "ignore-auto-dns" properties modify this behavior. For methods that imply no upstream network, such as "shared" or "link-local", these properties must be empty. For IPv4 method "shared", the IP subnet can be configured by adding one manual IPv4 address or otherwise 10.42.x.0/24 is chosen. Note that the shared method must be configured on the interface which shares the internet to a subnet, not on the uplink which is shared.never-defaultbooleanFALSEIf TRUE, this connection will never be the default connection for this IP type, meaning it will never be assigned the default route by NetworkManager.route-dataarray of vardictArray of IPv4 routes. Each route dictionary contains at least 'dest' and 'prefix' entries, containing the destination IP address as a string, and the prefix length as a uint32. Most routes will also have a 'next-hop' entry, containing the next hop IP address as a string. If the route has a 'metric' entry (containing a uint32), that will be used as the metric for the route (otherwise NM will pick a default value appropriate to the device). Additional attributes may also exist on some routes.route-metricint64-1The default metric for routes that don't explicitly specify a metric. The default value -1 means that the metric is chosen automatically based on the device type. The metric applies to dynamic routes, manual (static) routes that don't have an explicit metric setting, address prefix routes, and the default route. Note that for IPv6, the kernel accepts zero (0) but coerces it to 1024 (user default). Hence, setting this property to zero effectively mean setting it to 1024. For IPv4, zero is a regular value for the metric.route-tableuint320Enable policy routing (source routing) and set the routing table used when adding routes. This affects all routes, including device-routes, IPv4LL, DHCP, SLAAC, default-routes and static routes. But note that static routes can individually overwrite the setting by explicitly specifying a non-zero routing table. If the table setting is left at zero, it is eligible to be overwritten via global configuration. If the property is zero even after applying the global configuration value, policy routing is disabled for the address family of this connection. Policy routing disabled means that NetworkManager will add all routes to the main table (except static routes that explicitly configure a different table). Additionally, NetworkManager will not delete any extraneous routes from tables except the main table. This is to preserve backward compatibility for users who manage routing tables outside of NetworkManager.routesarray of array of uint32Deprecated in favor of the 'route-data' property, but this can be used for backward-compatibility with older daemons. Note that if you send this property the daemon will ignore 'route-data'. Array of IPv4 route structures. Each IPv4 route structure is composed of 4 32-bit values; the first being the destination IPv4 network or address (network byte order), the second the destination network or address prefix (1 - 32), the third being the next-hop (network byte order) if any, and the fourth being the route metric. If the metric is 0, NM will choose an appropriate default metric for the device. (There is no way to explicitly specify an actual metric of 0 with this property.)ipv6 settingIPv6 Settings.Key NameValue TypeDefault ValueValue Descriptionaddr-gen-modeint321Configure method for creating the address for use with RFC4862 IPv6 Stateless Address Autoconfiguration. The permitted values are: NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64 (0) or NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY (1). If the property is set to EUI64, the addresses will be generated using the interface tokens derived from hardware address. This makes the host part of the address to stay constant, making it possible to track host's presence when it changes networks. The address changes when the interface hardware is replaced. The value of stable-privacy enables use of cryptographically secure hash of a secret host-specific key along with the connection's stable-id and the network address as specified by RFC7217. This makes it impossible to use the address track host's presence, and makes the address stable when the network interface hardware is replaced. On D-Bus, the absence of an addr-gen-mode setting equals enabling stable-privacy. For keyfile plugin, the absence of the setting on disk means EUI64 so that the property doesn't change on upgrade from older versions. Note that this setting is distinct from the Privacy Extensions as configured by "ip6-privacy" property and it does not affect the temporary addresses configured with this option.address-dataarray of vardictArray of IPv6 addresses. Each address dictionary contains at least 'address' and 'prefix' entries, containing the IP address as a string, and the prefix length as a uint32. Additional attributes may also exist on some addresses.addressesarray of legacy IPv6 address struct (a(ayuay))Deprecated in favor of the 'address-data' and 'gateway' properties, but this can be used for backward-compatibility with older daemons. Note that if you send this property the daemon will ignore 'address-data' and 'gateway'. Array of IPv6 address structures. Each IPv6 address structure is composed of an IPv6 address, a prefix length (1 - 128), and an IPv6 gateway address. The gateway may be zeroed out if no gateway exists for that subnet.dad-timeoutint32-1Timeout in milliseconds used to check for the presence of duplicate IP addresses on the network. If an address conflict is detected, the activation will fail. A zero value means that no duplicate address detection is performed, -1 means the default value (either configuration ipvx.dad-timeout override or zero). A value greater than zero is a timeout in milliseconds. The property is currently implemented only for IPv4.dhcp-duidstringA string containing the DHCPv6 Unique Identifier (DUID) used by the dhcp client to identify itself to DHCPv6 servers (RFC 3315). The DUID is carried in the Client Identifier option. If the property is a hex string ('aa:bb:cc') it is interpreted as a binary DUID and filled as an opaque value in the Client Identifier option. The special value "lease" will retrieve the DUID previously used from the lease file belonging to the connection. If no DUID is found and "dhclient" is the configured dhcp client, the DUID is searched in the system-wide dhclient lease file. If still no DUID is found, or another dhcp client is used, a global and permanent DUID-UUID (RFC 6355) will be generated based on the machine-id. The special values "llt" and "ll" will generate a DUID of type LLT or LL (see RFC 3315) based on the current MAC address of the device. In order to try providing a stable DUID-LLT, the time field will contain a constant timestamp that is used globally (for all profiles) and persisted to disk. The special values "stable-llt", "stable-ll" and "stable-uuid" will generate a DUID of the corresponding type, derived from the connection's stable-id and a per-host unique key. You may want to include the "${DEVICE}" or "${MAC}" specifier in the stable-id, in case this profile gets activated on multiple devices. So, the link-layer address of "stable-ll" and "stable-llt" will be a generated address derived from the stable id. The DUID-LLT time value in the "stable-llt" option will be picked among a static timespan of three years (the upper bound of the interval is the same constant timestamp used in "llt"). When the property is unset, the global value provided for "ipv6.dhcp-duid" is used. If no global value is provided, the default "lease" value is assumed.dhcp-hostnamestringIf the "dhcp-send-hostname" property is TRUE, then the specified name will be sent to the DHCP server when acquiring a lease. This property and "dhcp-fqdn" are mutually exclusive and cannot be set at the same time.dhcp-hostname-flagsuint320Flags for the DHCP hostname and FQDN. Currently, this property only includes flags to control the FQDN flags set in the DHCP FQDN option. Supported FQDN flags are NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1), NM_DHCP_HOSTNAME_FLAG_FQDN_ENCODED (0x2) and NM_DHCP_HOSTNAME_FLAG_FQDN_NO_UPDATE (0x4). When no FQDN flag is set and NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS (0x8) is set, the DHCP FQDN option will contain no flag. Otherwise, if no FQDN flag is set and NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS (0x8) is not set, the standard FQDN flags are set in the request: NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1), NM_DHCP_HOSTNAME_FLAG_FQDN_ENCODED (0x2) for IPv4 and NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1) for IPv6. When this property is set to the default value NM_DHCP_HOSTNAME_FLAG_NONE (0x0), a global default is looked up in NetworkManager configuration. If that value is unset or also NM_DHCP_HOSTNAME_FLAG_NONE (0x0), then the standard FQDN flags described above are sent in the DHCP requests.dhcp-iaidstringA string containing the "Identity Association Identifier" (IAID) used by the DHCP client. The property is a 32-bit decimal value or a special value among "mac", "perm-mac", "ifname" and "stable". When set to "mac" (or "perm-mac"), the last 4 bytes of the current (or permanent) MAC address are used as IAID. When set to "ifname", the IAID is computed by hashing the interface name. The special value "stable" can be used to generate an IAID based on the stable-id (see connection.stable-id), a per-host key and the interface name. When the property is unset, the value from global configuration is used; if no global default is set then the IAID is assumed to be "ifname". Note that at the moment this property is ignored for IPv6 by dhclient, which always derives the IAID from the MAC address.dhcp-reject-serversarray of stringArray of servers from which DHCP offers must be rejected. This property is useful to avoid getting a lease from misconfigured or rogue servers. For DHCPv4, each element must be an IPv4 address, optionally followed by a slash and a prefix length (e.g. "192.168.122.0/24"). This property is currently not implemented for DHCPv6.dhcp-send-hostnamebooleanTRUEIf TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some DHCP servers use this hostname to update DNS databases, essentially providing a static hostname for the computer. If the "dhcp-hostname" property is NULL and this property is TRUE, the current persistent hostname of the computer is sent.dhcp-timeoutint320A timeout for a DHCP transaction in seconds. If zero (the default), a globally configured default is used. If still unspecified, a device specific timeout is used (usually 45 seconds). Set to 2147483647 (MAXINT32) for infinity.dnsarray of byte arrayArray of IP addresses of DNS servers (in network byte order)dns-optionsarray of stringArray of DNS options as described in man 5 resolv.conf. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties. The currently supported options are "attempts", "debug", "edns0", "inet6", "ip6-bytestring", "ip6-dotint", "ndots", "no-check-names", "no-ip6-dotint", "no-reload", "no-tld-query", "rotate", "single-request", "single-request-reopen", "timeout", "trust-ad", "use-vc". The "trust-ad" setting is only honored if the profile contributes name servers to resolv.conf, and if all contributing profiles have "trust-ad" enabled.dns-priorityint320DNS servers priority. The relative priority for DNS servers specified by this setting. A lower numerical value is better (higher priority). Negative values have the special effect of excluding other configurations with a greater numerical priority value; so in presence of at least one negative priority, only DNS servers from connections with the lowest priority value will be used. To avoid all DNS leaks, set the priority of the profile that should be used to the most negative value of all active connections profiles. Zero selects a globally configured default value. If the latter is missing or zero too, it defaults to 50 for VPNs (including WireGuard) and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. When multiple devices have configurations with the same priority, VPNs will be considered first, then devices with the best (lowest metric) default route and then all other devices. When using dns=default, servers with higher priority will be on top of resolv.conf. To prioritize a given server over another one within the same connection, just specify them in the desired order. Note that commonly the resolver tries name servers in /etc/resolv.conf in the order listed, proceeding with the next server in the list on failure. See for example the "rotate" option of the dns-options setting. If there are any negative DNS priorities, then only name servers from the devices with that lowest priority will be considered. When using a DNS resolver that supports Conditional Forwarding or Split DNS (with dns=dnsmasq or dns=systemd-resolved settings), each connection is used to query domains in its search list. The search domains determine which name servers to ask, and the DNS priority is used to prioritize name servers based on the domain. Queries for domains not present in any search list are routed through connections having the '~.' special wildcard domain, which is added automatically to connections with the default route (or can be added manually). When multiple connections specify the same domain, the one with the best priority (lowest numerical value) wins. If a sub domain is configured on another interface it will be accepted regardless the priority, unless parent domain on the other interface has a negative priority, which causes the sub domain to be shadowed. With Split DNS one can avoid undesired DNS leaks by properly configuring DNS priorities and the search domains, so that only name servers of the desired interface are configured.dns-searcharray of stringArray of DNS search domains. Domains starting with a tilde ('~') are considered 'routing' domains and are used only to decide the interface over which a query must be forwarded; they are not used to complete unqualified host names. When using a DNS plugin that supports Conditional Forwarding or Split DNS, then the search domains specify which name servers to query. This makes the behavior different from running with plain /etc/resolv.conf. For more information see also the dns-priority setting.gatewaystringThe gateway associated with this configuration. This is only meaningful if "addresses" is also set. The gateway's main purpose is to control the next hop of the standard default route on the device. Hence, the gateway property conflicts with "never-default" and will be automatically dropped if the IP configuration is set to never-default. As an alternative to set the gateway, configure a static default route with /0 as prefix length.ignore-auto-dnsbooleanFALSEWhen "method" is set to "auto" and this property to TRUE, automatically configured name servers and search domains are ignored and only name servers and search domains specified in the "dns" and "dns-search" properties, if any, are used.ignore-auto-routesbooleanFALSEWhen "method" is set to "auto" and this property to TRUE, automatically configured routes are ignored and only routes specified in the "routes" property, if any, are used.ip6-privacyNMSettingIP6ConfigPrivacy (int32)Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: -1: unknown, 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses). Having a per-connection setting set to "-1" (unknown) means fallback to global configuration "ipv6.ip6-privacy". If also global configuration is unspecified or set to "-1", fallback to read "/proc/sys/net/ipv6/conf/default/use_tempaddr". Note that this setting is distinct from the Stable Privacy addresses that can be enabled with the "addr-gen-mode" property's "stable-privacy" setting as another way of avoiding host tracking with IPv6 addresses.may-failbooleanTRUEIf TRUE, allow overall network configuration to proceed even if the configuration specified by this property times out. Note that at least one IP configuration must succeed or overall network configuration will still fail. For example, in IPv6-only networks, setting this property to TRUE on the NMSettingIP4Config allows the overall network configuration to succeed if IPv4 configuration fails but IPv6 configuration completes successfully.methodstringIP configuration method. NMSettingIP4Config and NMSettingIP6Config both support "disabled", "auto", "manual", and "link-local". See the subclass-specific documentation for other values. In general, for the "auto" method, properties such as "dns" and "routes" specify information that is added on to the information returned from automatic configuration. The "ignore-auto-routes" and "ignore-auto-dns" properties modify this behavior. For methods that imply no upstream network, such as "shared" or "link-local", these properties must be empty. For IPv4 method "shared", the IP subnet can be configured by adding one manual IPv4 address or otherwise 10.42.x.0/24 is chosen. Note that the shared method must be configured on the interface which shares the internet to a subnet, not on the uplink which is shared.never-defaultbooleanFALSEIf TRUE, this connection will never be the default connection for this IP type, meaning it will never be assigned the default route by NetworkManager.ra-timeoutint320A timeout for waiting Router Advertisements in seconds. If zero (the default), a globally configured default is used. If still unspecified, the timeout depends on the sysctl settings of the device. Set to 2147483647 (MAXINT32) for infinity.route-dataarray of vardictArray of IPv6 routes. Each route dictionary contains at least 'dest' and 'prefix' entries, containing the destination IP address as a string, and the prefix length as a uint32. Most routes will also have a 'next-hop' entry, containing the next hop IP address as a string. If the route has a 'metric' entry (containing a uint32), that will be used as the metric for the route (otherwise NM will pick a default value appropriate to the device). Additional attributes may also exist on some routes.route-metricint64-1The default metric for routes that don't explicitly specify a metric. The default value -1 means that the metric is chosen automatically based on the device type. The metric applies to dynamic routes, manual (static) routes that don't have an explicit metric setting, address prefix routes, and the default route. Note that for IPv6, the kernel accepts zero (0) but coerces it to 1024 (user default). Hence, setting this property to zero effectively mean setting it to 1024. For IPv4, zero is a regular value for the metric.route-tableuint320Enable policy routing (source routing) and set the routing table used when adding routes. This affects all routes, including device-routes, IPv4LL, DHCP, SLAAC, default-routes and static routes. But note that static routes can individually overwrite the setting by explicitly specifying a non-zero routing table. If the table setting is left at zero, it is eligible to be overwritten via global configuration. If the property is zero even after applying the global configuration value, policy routing is disabled for the address family of this connection. Policy routing disabled means that NetworkManager will add all routes to the main table (except static routes that explicitly configure a different table). Additionally, NetworkManager will not delete any extraneous routes from tables except the main table. This is to preserve backward compatibility for users who manage routing tables outside of NetworkManager.routesarray of legacy IPv6 route struct (a(ayuayu))Deprecated in favor of the 'route-data' property, but this can be used for backward-compatibility with older daemons. Note that if you send this property the daemon will ignore 'route-data'. Array of IPv6 route structures. Each IPv6 route structure is composed of an IPv6 address, a prefix length (1 - 128), an IPv6 next hop address (which may be zeroed out if there is no next hop), and a metric. If the metric is 0, NM will choose an appropriate default metric for the device.tokenstringConfigure the token for draft-chown-6man-tokenised-ipv6-identifiers-02 IPv6 tokenized interface identifiers. Useful with eui64 addr-gen-mode.ip-tunnel settingIP Tunneling Settings.Key NameValue TypeDefault ValueValue Descriptionencapsulation-limituint320How many additional levels of encapsulation are permitted to be prepended to packets. This property applies only to IPv6 tunnels.flagsuint320Tunnel flags. Currently, the following values are supported: NM_IP_TUNNEL_FLAG_IP6_IGN_ENCAP_LIMIT (0x1), NM_IP_TUNNEL_FLAG_IP6_USE_ORIG_TCLASS (0x2), NM_IP_TUNNEL_FLAG_IP6_USE_ORIG_FLOWLABEL (0x4), NM_IP_TUNNEL_FLAG_IP6_MIP6_DEV (0x8), NM_IP_TUNNEL_FLAG_IP6_RCV_DSCP_COPY (0x10), NM_IP_TUNNEL_FLAG_IP6_USE_ORIG_FWMARK (0x20). They are valid only for IPv6 tunnels.flow-labeluint320The flow label to assign to tunnel packets. This property applies only to IPv6 tunnels.input-keystringThe key used for tunnel input packets; the property is valid only for certain tunnel modes (GRE, IP6GRE). If empty, no key is used.localstringThe local endpoint of the tunnel; the value can be empty, otherwise it must contain an IPv4 or IPv6 address.modeuint320The tunneling mode, for example NM_IP_TUNNEL_MODE_IPIP (1) or NM_IP_TUNNEL_MODE_GRE (2).mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple fragments.output-keystringThe key used for tunnel output packets; the property is valid only for certain tunnel modes (GRE, IP6GRE). If empty, no key is used.parentstringIf given, specifies the parent interface name or parent connection UUID the new device will be bound to so that tunneled packets will only be routed via that interface.path-mtu-discoverybooleanTRUEWhether to enable Path MTU Discovery on this tunnel.remotestringThe remote endpoint of the tunnel; the value must contain an IPv4 or IPv6 address.tosuint320The type of service (IPv4) or traffic class (IPv6) field to be set on tunneled packets.ttluint320The TTL to assign to tunneled packets. 0 is a special value meaning that packets inherit the TTL value.macsec settingMACSec Settings.Key NameValue TypeDefault ValueValue DescriptionencryptbooleanTRUEWhether the transmitted traffic must be encrypted.mka-cakstringThe pre-shared CAK (Connectivity Association Key) for MACsec Key Agreement.mka-cak-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "mka-cak" property. (see for flag values)mka-cknstringThe pre-shared CKN (Connectivity-association Key Name) for MACsec Key Agreement.modeint320Specifies how the CAK (Connectivity Association Key) for MKA (MACsec Key Agreement) is obtained.parentstringIf given, specifies the parent interface name or parent connection UUID from which this MACSEC interface should be created. If this property is not specified, the connection must contain an "802-3-ethernet" setting with a "mac-address" property.portint321The port component of the SCI (Secure Channel Identifier), between 1 and 65534.send-scibooleanTRUESpecifies whether the SCI (Secure Channel Identifier) is included in every packet.validationint322Specifies the validation mode for incoming frames.macvlan settingMAC VLAN Settings.Key NameValue TypeDefault ValueValue Descriptionmodeuint320The macvlan mode, which specifies the communication mechanism between multiple macvlans on the same lower device.parentstringIf given, specifies the parent interface name or parent connection UUID from which this MAC-VLAN interface should be created. If this property is not specified, the connection must contain an "802-3-ethernet" setting with a "mac-address" property.promiscuousbooleanTRUEWhether the interface should be put in promiscuous mode.tapbooleanFALSEWhether the interface should be a MACVTAP.match settingMatch settings.Key NameValue TypeDefault ValueValue Descriptiondriverarray of stringA list of driver names to match. Each element is a shell wildcard pattern. See NMSettingMatch:interface-name for how special characters '|', '&', '!' and '\\' are used for optional and mandatory matches and inverting the pattern.interface-namearray of stringA list of interface names to match. Each element is a shell wildcard pattern. An element can be prefixed with a pipe symbol (|) or an ampersand (&). The former means that the element is optional and the latter means that it is mandatory. If there are any optional elements, than the match evaluates to true if at least one of the optional element matches (logical OR). If there are any mandatory elements, then they all must match (logical AND). By default, an element is optional. This means that an element "foo" behaves the same as "|foo". An element can also be inverted with exclamation mark (!) between the pipe symbol (or the ampersand) and before the pattern. Note that "!foo" is a shortcut for the mandatory match "&!foo". Finally, a backslash can be used at the beginning of the element (after the optional special characters) to escape the start of the pattern. For example, "&\\!a" is an mandatory match for literally "!a".kernel-command-linearray of stringA list of kernel command line arguments to match. This may be used to check whether a specific kernel command line option is set (or if prefixed with the exclamation mark unset). The argument must either be a single word, or an assignment (i.e. two words, separated "="). In the former case the kernel command line is searched for the word appearing as is, or as left hand side of an assignment. In the latter case, the exact assignment is looked for with right and left hand side matching. See NMSettingMatch:interface-name for how special characters '|', '&', '!' and '\\' are used for optional and mandatory matches and inverting the pattern.patharray of stringA list of paths to match against the ID_PATH udev property of devices. ID_PATH represents the topological persistent path of a device. It typically contains a subsystem string (pci, usb, platform, etc.) and a subsystem-specific identifier. For PCI devices the path has the form "pci-$domain:$bus:$device.$function", where each variable is an hexadecimal value; for example "pci-0000:0a:00.0". The path of a device can be obtained with "udevadm info /sys/class/net/$dev | grep ID_PATH=" or by looking at the "path" property exported by NetworkManager ("nmcli -f general.path device show $dev"). Each element of the list is a shell wildcard pattern. See NMSettingMatch:interface-name for how special characters '|', '&', '!' and '\\' are used for optional and mandatory matches and inverting the pattern.802-11-olpc-mesh settingOLPC Wireless Mesh Settings.Key NameValue TypeDefault ValueValue Descriptionchanneluint320Channel on which the mesh network to join is located.dhcp-anycast-addressbyte arrayAnycast DHCP MAC address used when requesting an IP address via DHCP. The specific anycast address used determines which DHCP server class answers the request.ssidbyte arraySSID of the mesh network to join.ovs-bridge settingOvsBridge Link Settings.Key NameValue TypeDefault ValueValue Descriptiondatapath-typestringThe data path type. One of "system", "netdev" or empty.fail-modestringThe bridge failure mode. One of "secure", "standalone" or empty.mcast-snooping-enablebooleanFALSEEnable or disable multicast snooping.rstp-enablebooleanFALSEEnable or disable RSTP.stp-enablebooleanFALSEEnable or disable STP.ovs-dpdk settingOvsDpdk Link Settings.Key NameValue TypeDefault ValueValue DescriptiondevargsstringOpen vSwitch DPDK device arguments.ovs-interface settingOpen vSwitch Interface Settings.Key NameValue TypeDefault ValueValue DescriptiontypestringThe interface type. Either "internal", "system", "patch", "dpdk", or empty.ovs-patch settingOvsPatch Link Settings.Key NameValue TypeDefault ValueValue DescriptionpeerstringSpecifies the name of the interface for the other side of the patch. The patch on the other side must also set this interface as peer.ovs-port settingOvsPort Link Settings.Key NameValue TypeDefault ValueValue Descriptionbond-downdelayuint320The time port must be inactive in order to be considered down.bond-modestringBonding mode. One of "active-backup", "balance-slb", or "balance-tcp".bond-updelayuint320The time port must be active before it starts forwarding traffic.lacpstringLACP mode. One of "active", "off", or "passive".taguint320The VLAN tag in the range 0-4095.vlan-modestringThe VLAN mode. One of "access", "native-tagged", "native-untagged", "trunk" or unset.ppp settingPoint-to-Point Protocol Settings.Key NameValue TypeDefault ValueValue Descriptionbauduint320If non-zero, instruct pppd to set the serial port to the specified baudrate. This value should normally be left as 0 to automatically choose the speed.crtsctsbooleanFALSEIf TRUE, specify that pppd should set the serial port to use hardware flow control with RTS and CTS signals. This value should normally be set to FALSE.lcp-echo-failureuint320If non-zero, instruct pppd to presume the connection to the peer has failed if the specified number of LCP echo-requests go unanswered by the peer. The "lcp-echo-interval" property must also be set to a non-zero value if this property is used.lcp-echo-intervaluint320If non-zero, instruct pppd to send an LCP echo-request frame to the peer every n seconds (where n is the specified value). Note that some PPP peers will respond to echo requests and some will not, and it is not possible to autodetect this.mppe-statefulbooleanFALSEIf TRUE, stateful MPPE is used. See pppd documentation for more information on stateful MPPE.mruuint320If non-zero, instruct pppd to request that the peer send packets no larger than the specified size. If non-zero, the MRU should be between 128 and 16384.mtuuint320If non-zero, instruct pppd to send packets no larger than the specified size.no-vj-compbooleanFALSEIf TRUE, Van Jacobsen TCP header compression will not be requested.noauthbooleanTRUEIf TRUE, do not require the other side (usually the PPP server) to authenticate itself to the client. If FALSE, require authentication from the remote side. In almost all cases, this should be TRUE.nobsdcompbooleanFALSEIf TRUE, BSD compression will not be requested.nodeflatebooleanFALSEIf TRUE, "deflate" compression will not be requested.refuse-chapbooleanFALSEIf TRUE, the CHAP authentication method will not be used.refuse-eapbooleanFALSEIf TRUE, the EAP authentication method will not be used.refuse-mschapbooleanFALSEIf TRUE, the MSCHAP authentication method will not be used.refuse-mschapv2booleanFALSEIf TRUE, the MSCHAPv2 authentication method will not be used.refuse-papbooleanFALSEIf TRUE, the PAP authentication method will not be used.require-mppebooleanFALSEIf TRUE, MPPE (Microsoft Point-to-Point Encryption) will be required for the PPP session. If either 64-bit or 128-bit MPPE is not available the session will fail. Note that MPPE is not used on mobile broadband connections.require-mppe-128booleanFALSEIf TRUE, 128-bit MPPE (Microsoft Point-to-Point Encryption) will be required for the PPP session, and the "require-mppe" property must also be set to TRUE. If 128-bit MPPE is not available the session will fail.pppoe settingPPP-over-Ethernet Settings.Key NameValue TypeDefault ValueValue DescriptionparentstringIf given, specifies the parent interface name on which this PPPoE connection should be created. If this property is not specified, the connection is activated on the interface specified in "interface-name" of NMSettingConnection.passwordstringPassword used to authenticate with the PPPoE service.password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password" property. (see for flag values)servicestringIf specified, instruct PPPoE to only initiate sessions with access concentrators that provide the specified service. For most providers, this should be left blank. It is only required if there are multiple access concentrators or a specific service is known to be required.usernamestringUsername used to authenticate with the PPPoE service.proxy settingWWW Proxy Settings.Key NameValue TypeDefault ValueValue Descriptionbrowser-onlybooleanFALSEWhether the proxy configuration is for browser only.methodint320Method for proxy configuration, Default is NM_SETTING_PROXY_METHOD_NONE (0)pac-scriptstringPAC script for the connection.pac-urlstringPAC URL for obtaining PAC file.serial settingSerial Link Settings.Key NameValue TypeDefault ValueValue Descriptionbauduint3257600Speed to use for communication over the serial port. Note that this value usually has no effect for mobile broadband modems as they generally ignore speed settings and use the highest available speed.bitsuint328Byte-width of the serial communication. The 8 in "8n1" for example.paritybyteThe connection parity: 69 (ASCII 'E') for even parity, 111 (ASCII 'o') for odd, 110 (ASCII 'n') for none.send-delayuint640Time to delay between each byte sent to the modem, in microseconds.stopbitsuint321Number of stop bits for communication on the serial port. Either 1 or 2. The 1 in "8n1" for example.sriov settingSR-IOV settings.Key NameValue TypeDefault ValueValue Descriptionautoprobe-driversNMTernary (int32)Whether to autoprobe virtual functions by a compatible driver. If set to NM_TERNARY_TRUE (1), the kernel will try to bind VFs to a compatible driver and if this succeeds a new network interface will be instantiated for each VF. If set to NM_TERNARY_FALSE (0), VFs will not be claimed and no network interfaces will be created for them. When set to NM_TERNARY_DEFAULT (-1), the global default is used; in case the global default is unspecified it is assumed to be NM_TERNARY_TRUE (1).total-vfsuint320The total number of virtual functions to create. Note that when the sriov setting is present NetworkManager enforces the number of virtual functions on the interface (also when it is zero) during activation and resets it upon deactivation. To prevent any changes to SR-IOV parameters don't add a sriov setting to the connection.vfsarray of vardictArray of virtual function descriptors. Each VF descriptor is a dictionary mapping attribute names to GVariant values. The 'index' entry is mandatory for each VF. When represented as string a VF is in the form: "INDEX [ATTR=VALUE[ ATTR=VALUE]...]". for example: "2 mac=00:11:22:33:44:55 spoof-check=true". Multiple VFs can be specified using a comma as separator. Currently, the following attributes are supported: mac, spoof-check, trust, min-tx-rate, max-tx-rate, vlans. The "vlans" attribute is represented as a semicolon-separated list of VLAN descriptors, where each descriptor has the form "ID[.PRIORITY[.PROTO]]". PROTO can be either 'q' for 802.1Q (the default) or 'ad' for 802.1ad.tc settingLinux Traffic Control Settings.Key NameValue TypeDefault ValueValue Descriptionqdiscsarray of vardictArray of TC queueing disciplines.tfiltersarray of vardictArray of TC traffic filters.team settingTeaming Settings.Key NameValue TypeDefault ValueValue DescriptionconfigstringThe JSON configuration for the team network interface. The property should contain raw JSON configuration data suitable for teamd, because the value is passed directly to teamd. If not specified, the default configuration is used. See man teamd.conf for the format details.interface-namestringDeprecated in favor of connection.interface-name, but can be used for backward-compatibility with older daemons, to set the team's interface name.link-watchersarray of vardictLink watchers configuration for the connection: each link watcher is defined by a dictionary, whose keys depend upon the selected link watcher. Available link watchers are 'ethtool', 'nsna_ping' and 'arp_ping' and it is specified in the dictionary with the key 'name'. Available keys are: ethtool: 'delay-up', 'delay-down', 'init-wait'; nsna_ping: 'init-wait', 'interval', 'missed-max', 'target-host'; arp_ping: all the ones in nsna_ping and 'source-host', 'validate-active', 'validate-inactive', 'send-always'. See teamd.conf man for more details.mcast-rejoin-countint32-1Corresponds to the teamd mcast_rejoin.count.mcast-rejoin-intervalint32-1Corresponds to the teamd mcast_rejoin.interval.notify-peers-countint32-1Corresponds to the teamd notify_peers.count.notify-peers-intervalint32-1Corresponds to the teamd notify_peers.interval.runnerstringCorresponds to the teamd runner.name. Permitted values are: "roundrobin", "broadcast", "activebackup", "loadbalance", "lacp", "random".runner-activebooleanTRUECorresponds to the teamd runner.active.runner-agg-select-policystringCorresponds to the teamd runner.agg_select_policy.runner-fast-ratebooleanFALSECorresponds to the teamd runner.fast_rate.runner-hwaddr-policystringCorresponds to the teamd runner.hwaddr_policy.runner-min-portsint32-1Corresponds to the teamd runner.min_ports.runner-sys-prioint32-1Corresponds to the teamd runner.sys_prio.runner-tx-balancerstringCorresponds to the teamd runner.tx_balancer.name.runner-tx-balancer-intervalint32-1Corresponds to the teamd runner.tx_balancer.interval.runner-tx-hasharray of stringCorresponds to the teamd runner.tx_hash.team-port settingTeam Port Settings.Key NameValue TypeDefault ValueValue DescriptionconfigstringThe JSON configuration for the team port. The property should contain raw JSON configuration data suitable for teamd, because the value is passed directly to teamd. If not specified, the default configuration is used. See man teamd.conf for the format details.lacp-keyint32-1Corresponds to the teamd ports.PORTIFNAME.lacp_key.lacp-prioint32-1Corresponds to the teamd ports.PORTIFNAME.lacp_prio.link-watchersarray of vardictLink watchers configuration for the connection: each link watcher is defined by a dictionary, whose keys depend upon the selected link watcher. Available link watchers are 'ethtool', 'nsna_ping' and 'arp_ping' and it is specified in the dictionary with the key 'name'. Available keys are: ethtool: 'delay-up', 'delay-down', 'init-wait'; nsna_ping: 'init-wait', 'interval', 'missed-max', 'target-host'; arp_ping: all the ones in nsna_ping and 'source-host', 'validate-active', 'validate-inactive', 'send-always'. See teamd.conf man for more details.prioint320Corresponds to the teamd ports.PORTIFNAME.prio.queue-idint32-1Corresponds to the teamd ports.PORTIFNAME.queue_id. When set to -1 means the parameter is skipped from the json config.stickybooleanFALSECorresponds to the teamd ports.PORTIFNAME.sticky.tun settingTunnel Settings.Key NameValue TypeDefault ValueValue DescriptiongroupstringThe group ID which will own the device. If set to NULL everyone will be able to use the device.modeuint321The operating mode of the virtual device. Allowed values are NM_SETTING_TUN_MODE_TUN (1) to create a layer 3 device and NM_SETTING_TUN_MODE_TAP (2) to create an Ethernet-like layer 2 one.multi-queuebooleanFALSEIf the property is set to TRUE, the interface will support multiple file descriptors (queues) to parallelize packet sending or receiving. Otherwise, the interface will only support a single queue.ownerstringThe user ID which will own the device. If set to NULL everyone will be able to use the device.pibooleanFALSEIf TRUE the interface will prepend a 4 byte header describing the physical interface to the packets.vnet-hdrbooleanFALSEIf TRUE the IFF_VNET_HDR the tunnel packets will include a virtio network header.user settingGeneral User Profile Settings.Key NameValue TypeDefault ValueValue Descriptiondatadict of string to string{}A dictionary of key/value pairs with user data. This data is ignored by NetworkManager and can be used at the users discretion. The keys only support a strict ascii format, but the values can be arbitrary UTF8 strings up to a certain length.vlan settingVLAN Settings.Key NameValue TypeDefault ValueValue Descriptionegress-priority-maparray of stringFor outgoing packets, a list of mappings from Linux SKB priorities to 802.1p priorities. The mapping is given in the format "from:to" where both "from" and "to" are unsigned integers, ie "7:3".flagsNMVlanFlags (uint32)One or more flags which control the behavior and features of the VLAN interface. Flags include NM_VLAN_FLAG_REORDER_HEADERS (0x1) (reordering of output packet headers), NM_VLAN_FLAG_GVRP (0x2) (use of the GVRP protocol), and NM_VLAN_FLAG_LOOSE_BINDING (0x4) (loose binding of the interface to its master device's operating state). NM_VLAN_FLAG_MVRP (0x8) (use of the MVRP protocol). The default value of this property is NM_VLAN_FLAG_REORDER_HEADERS, but it used to be 0. To preserve backward compatibility, the default-value in the D-Bus API continues to be 0 and a missing property on D-Bus is still considered as 0.iduint320The VLAN identifier that the interface created by this connection should be assigned. The valid range is from 0 to 4094, without the reserved id 4095.ingress-priority-maparray of stringFor incoming packets, a list of mappings from 802.1p priorities to Linux SKB priorities. The mapping is given in the format "from:to" where both "from" and "to" are unsigned integers, ie "7:3".interface-namestringDeprecated in favor of connection.interface-name, but can be used for backward-compatibility with older daemons, to set the vlan's interface name.parentstringIf given, specifies the parent interface name or parent connection UUID from which this VLAN interface should be created. If this property is not specified, the connection must contain an "802-3-ethernet" setting with a "mac-address" property.vpn settingVPN Settings.Key NameValue TypeDefault ValueValue Descriptiondatadict of string to string{}Dictionary of key/value pairs of VPN plugin specific data. Both keys and values must be strings.persistentbooleanFALSEIf the VPN service supports persistence, and this property is TRUE, the VPN will attempt to stay connected across link changes and outages, until explicitly disconnected.secretsdict of string to string{}Dictionary of key/value pairs of VPN plugin specific secrets like passwords or private keys. Both keys and values must be strings.service-typestringD-Bus service name of the VPN plugin that this setting uses to connect to its network. i.e. org.freedesktop.NetworkManager.vpnc for the vpnc plugin.timeoutuint320Timeout for the VPN service to establish the connection. Some services may take quite a long time to connect. Value of 0 means a default timeout, which is 60 seconds (unless overridden by vpn.timeout in configuration file). Values greater than zero mean timeout in seconds.user-namestringIf the VPN connection requires a user name for authentication, that name should be provided here. If the connection is available to more than one user, and the VPN requires each user to supply a different name, then leave this property empty. If this property is empty, NetworkManager will automatically supply the username of the user which requested the VPN connection.vrf settingVRF settings.Key NameValue TypeDefault ValueValue Descriptiontableuint320The routing table for this VRF.vxlan settingVXLAN Settings.Key NameValue TypeDefault ValueValue Descriptionageinguint32300Specifies the lifetime in seconds of FDB entries learnt by the kernel.destination-portuint328472Specifies the UDP destination port to communicate to the remote VXLAN tunnel endpoint.iduint320Specifies the VXLAN Network Identifier (or VXLAN Segment Identifier) to use.l2-missbooleanFALSESpecifies whether netlink LL ADDR miss notifications are generated.l3-missbooleanFALSESpecifies whether netlink IP ADDR miss notifications are generated.learningbooleanTRUESpecifies whether unknown source link layer addresses and IP addresses are entered into the VXLAN device forwarding database.limituint320Specifies the maximum number of FDB entries. A value of zero means that the kernel will store unlimited entries.localstringIf given, specifies the source IP address to use in outgoing packets.parentstringIf given, specifies the parent interface name or parent connection UUID.proxybooleanFALSESpecifies whether ARP proxy is turned on.remotestringSpecifies the unicast destination IP address to use in outgoing packets when the destination link layer address is not known in the VXLAN device forwarding database, or the multicast IP address to join.rscbooleanFALSESpecifies whether route short circuit is turned on.source-port-maxuint320Specifies the maximum UDP source port to communicate to the remote VXLAN tunnel endpoint.source-port-minuint320Specifies the minimum UDP source port to communicate to the remote VXLAN tunnel endpoint.tosuint320Specifies the TOS value to use in outgoing packets.ttluint320Specifies the time-to-live value to use in outgoing packets.wifi-p2p settingWi-Fi P2P Settings.Key NameValue TypeDefault ValueValue DescriptionpeerstringThe P2P device that should be connected to. Currently, this is the only way to create or join a group.wfd-iesbyte arrayThe Wi-Fi Display (WFD) Information Elements (IEs) to set. Wi-Fi Display requires a protocol specific information element to be set in certain Wi-Fi frames. These can be specified here for the purpose of establishing a connection. This setting is only useful when implementing a Wi-Fi Display client.wps-methoduint320Flags indicating which mode of WPS is to be used. There's little point in changing the default setting as NetworkManager will automatically determine the best method to use.wimax settingWiMax Settings.Key NameValue TypeDefault ValueValue Descriptionmac-addressbyte arrayIf specified, this connection will only apply to the WiMAX device whose MAC address matches. This property does not change the MAC address of the device (known as MAC spoofing). Deprecated: 1network-namestringNetwork Service Provider (NSP) name of the WiMAX network this connection should use. Deprecated: 1802-3-ethernet settingWired Ethernet Settings.Key NameValue TypeDefault ValueValue Descriptionassigned-mac-addressstringThe new field for the cloned MAC address. It can be either a hardware address in ASCII representation, or one of the special values "preserve", "permanent", "random" or "stable". This field replaces the deprecated "cloned-mac-address" on D-Bus, which can only contain explicit hardware addresses. Note that this property only exists in D-Bus API. libnm and nmcli continue to call this property "cloned-mac-address".auto-negotiatebooleanFALSEWhen TRUE, enforce auto-negotiation of speed and duplex mode. If "speed" and "duplex" properties are both specified, only that single mode will be advertised and accepted during the link auto-negotiation process: this works only for BASE-T 802.3 specifications and is useful for enforcing gigabits modes, as in these cases link negotiation is mandatory. When FALSE, "speed" and "duplex" properties should be both set or link configuration will be skipped.cloned-mac-addressbyte arrayThis D-Bus field is deprecated in favor of "assigned-mac-address" which is more flexible and allows specifying special variants like "random". For libnm and nmcli, this field is called "cloned-mac-address".duplexstringWhen a value is set, either "half" or "full", configures the device to use the specified duplex mode. If "auto-negotiate" is "yes" the specified duplex mode will be the only one advertised during link negotiation: this works only for BASE-T 802.3 specifications and is useful for enforcing gigabits modes, as in these cases link negotiation is mandatory. If the value is unset (the default), the link configuration will be either skipped (if "auto-negotiate" is "no", the default) or will be auto-negotiated (if "auto-negotiate" is "yes") and the local device will advertise all the supported duplex modes. Must be set together with the "speed" property if specified. Before specifying a duplex mode be sure your device supports it.generate-mac-address-maskstringWith "cloned-mac-address" setting "random" or "stable", by default all bits of the MAC address are scrambled and a locally-administered, unicast MAC address is created. This property allows to specify that certain bits are fixed. Note that the least significant bit of the first MAC address will always be unset to create a unicast MAC address. If the property is NULL, it is eligible to be overwritten by a default connection setting. If the value is still NULL or an empty string, the default is to create a locally-administered, unicast MAC address. If the value contains one MAC address, this address is used as mask. The set bits of the mask are to be filled with the current MAC address of the device, while the unset bits are subject to randomization. Setting "FE:FF:FF:00:00:00" means to preserve the OUI of the current MAC address and only randomize the lower 3 bytes using the "random" or "stable" algorithm. If the value contains one additional MAC address after the mask, this address is used instead of the current MAC address to fill the bits that shall not be randomized. For example, a value of "FE:FF:FF:00:00:00 68:F7:28:00:00:00" will set the OUI of the MAC address to 68:F7:28, while the lower bits are randomized. A value of "02:00:00:00:00:00 00:00:00:00:00:00" will create a fully scrambled globally-administered, burned-in MAC address. If the value contains more than one additional MAC addresses, one of them is chosen randomly. For example, "02:00:00:00:00:00 00:00:00:00:00:00 02:00:00:00:00:00" will create a fully scrambled MAC address, randomly locally or globally administered.mac-addressbyte arrayIf specified, this connection will only apply to the Ethernet device whose permanent MAC address matches. This property does not change the MAC address of the device (i.e. MAC spoofing).mac-address-blacklistarray of stringIf specified, this connection will never apply to the Ethernet device whose permanent MAC address matches an address in the list. Each MAC address is in the standard hex-digits-and-colons notation (00:11:22:33:44:55).mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple Ethernet frames.portstringSpecific port type to use if the device supports multiple attachment methods. One of "tp" (Twisted Pair), "aui" (Attachment Unit Interface), "bnc" (Thin Ethernet) or "mii" (Media Independent Interface). If the device supports only one port type, this setting is ignored.s390-nettypestrings390 network device type; one of "qeth", "lcs", or "ctc", representing the different types of virtual network devices available on s390 systems.s390-optionsdict of string to string{}Dictionary of key/value pairs of s390-specific device options. Both keys and values must be strings. Allowed keys include "portno", "layer2", "portname", "protocol", among others. Key names must contain only alphanumeric characters (ie, [a-zA-Z0-9]).s390-subchannelsarray of stringIdentifies specific subchannels that this network device uses for communication with z/VM or s390 host. Like the "mac-address" property for non-z/VM devices, this property can be used to ensure this connection only applies to the network device that uses these subchannels. The list should contain exactly 3 strings, and each string may only be composed of hexadecimal characters and the period (.) character.speeduint320When a value greater than 0 is set, configures the device to use the specified speed. If "auto-negotiate" is "yes" the specified speed will be the only one advertised during link negotiation: this works only for BASE-T 802.3 specifications and is useful for enforcing gigabit speeds, as in this case link negotiation is mandatory. If the value is unset (0, the default), the link configuration will be either skipped (if "auto-negotiate" is "no", the default) or will be auto-negotiated (if "auto-negotiate" is "yes") and the local device will advertise all the supported speeds. In Mbit/s, ie 100 == 100Mbit/s. Must be set together with the "duplex" property when non-zero. Before specifying a speed value be sure your device supports it.wake-on-lanuint321The NMSettingWiredWakeOnLan options to enable. Not all devices support all options. May be any combination of NM_SETTING_WIRED_WAKE_ON_LAN_PHY (0x2), NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST (0x4), NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST (0x8), NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST (0x10), NM_SETTING_WIRED_WAKE_ON_LAN_ARP (0x20), NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC (0x40) or the special values NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT (0x1) (to use global settings) and NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE (0x8000) (to disable management of Wake-on-LAN in NetworkManager).wake-on-lan-passwordstringIf specified, the password used with magic-packet-based Wake-on-LAN, represented as an Ethernet MAC address. If NULL, no password will be required.wireguard settingWireGuard Settings.Key NameValue TypeDefault ValueValue Descriptionfwmarkuint320The use of fwmark is optional and is by default off. Setting it to 0 disables it. Otherwise, it is a 32-bit fwmark for outgoing packets. Note that "ip4-auto-default-route" or "ip6-auto-default-route" enabled, implies to automatically choose a fwmark.ip4-auto-default-routeNMTernary (int32)Whether to enable special handling of the IPv4 default route. If enabled, the IPv4 default route from wireguard.peer-routes will be placed to a dedicated routing-table and two policy routing rules will be added. The fwmark number is also used as routing-table for the default-route, and if fwmark is zero, an unused fwmark/table is chosen automatically. This corresponds to what wg-quick does with Table=auto and what WireGuard calls "Improved Rule-based Routing". Note that for this automatism to work, you usually don't want to set ipv4.gateway, because that will result in a conflicting default route. Leaving this at the default will enable this option automatically if ipv4.never-default is not set and there are any peers that use a default-route as allowed-ips.ip6-auto-default-routeNMTernary (int32)Like ip4-auto-default-route, but for the IPv6 default route.listen-portuint320The listen-port. If listen-port is not specified, the port will be chosen randomly when the interface comes up.mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple fragments. If zero a default MTU is used. Note that contrary to wg-quick's MTU setting, this does not take into account the current routes at the time of activation.peer-routesbooleanTRUEWhether to automatically add routes for the AllowedIPs ranges of the peers. If TRUE (the default), NetworkManager will automatically add routes in the routing tables according to ipv4.route-table and ipv6.route-table. Usually you want this automatism enabled. If FALSE, no such routes are added automatically. In this case, the user may want to configure static routes in ipv4.routes and ipv6.routes, respectively. Note that if the peer's AllowedIPs is "0.0.0.0/0" or "::/0" and the profile's ipv4.never-default or ipv6.never-default setting is enabled, the peer route for this peer won't be added automatically.peersarray of 'a{sv}'Array of dictionaries for the WireGuard peers.private-keystringThe 256 bit private-key in base64 encoding.private-key-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "private-key" property. (see for flag values)802-11-wireless settingWi-Fi Settings.Key NameValue TypeDefault ValueValue Descriptionap-isolationNMTernary (int32)Configures AP isolation, which prevents communication between wireless devices connected to this AP. This property can be set to a value different from NM_TERNARY_DEFAULT (-1) only when the interface is configured in AP mode. If set to NM_TERNARY_TRUE (1), devices are not able to communicate with each other. This increases security because it protects devices against attacks from other clients in the network. At the same time, it prevents devices to access resources on the same wireless networks as file shares, printers, etc. If set to NM_TERNARY_FALSE (0), devices can talk to each other. When set to NM_TERNARY_DEFAULT (-1), the global default is used; in case the global default is unspecified it is assumed to be NM_TERNARY_FALSE (0).assigned-mac-addressstringThe new field for the cloned MAC address. It can be either a hardware address in ASCII representation, or one of the special values "preserve", "permanent", "random" or "stable". This field replaces the deprecated "cloned-mac-address" on D-Bus, which can only contain explicit hardware addresses. Note that this property only exists in D-Bus API. libnm and nmcli continue to call this property "cloned-mac-address".bandstring802.11 frequency band of the network. One of "a" for 5GHz 802.11a or "bg" for 2.4GHz 802.11. This will lock associations to the Wi-Fi network to the specific band, i.e. if "a" is specified, the device will not associate with the same network in the 2.4GHz band even if the network's settings are compatible. This setting depends on specific driver capability and may not work with all drivers.bssidbyte arrayIf specified, directs the device to only associate with the given access point. This capability is highly driver dependent and not supported by all devices. Note: this property does not control the BSSID used when creating an Ad-Hoc network and is unlikely to in the future.channeluint320Wireless channel to use for the Wi-Fi connection. The device will only join (or create for Ad-Hoc networks) a Wi-Fi network on the specified channel. Because channel numbers overlap between bands, this property also requires the "band" property to be set.cloned-mac-addressbyte arrayThis D-Bus field is deprecated in favor of "assigned-mac-address" which is more flexible and allows specifying special variants like "random". For libnm and nmcli, this field is called "cloned-mac-address".generate-mac-address-maskstringWith "cloned-mac-address" setting "random" or "stable", by default all bits of the MAC address are scrambled and a locally-administered, unicast MAC address is created. This property allows to specify that certain bits are fixed. Note that the least significant bit of the first MAC address will always be unset to create a unicast MAC address. If the property is NULL, it is eligible to be overwritten by a default connection setting. If the value is still NULL or an empty string, the default is to create a locally-administered, unicast MAC address. If the value contains one MAC address, this address is used as mask. The set bits of the mask are to be filled with the current MAC address of the device, while the unset bits are subject to randomization. Setting "FE:FF:FF:00:00:00" means to preserve the OUI of the current MAC address and only randomize the lower 3 bytes using the "random" or "stable" algorithm. If the value contains one additional MAC address after the mask, this address is used instead of the current MAC address to fill the bits that shall not be randomized. For example, a value of "FE:FF:FF:00:00:00 68:F7:28:00:00:00" will set the OUI of the MAC address to 68:F7:28, while the lower bits are randomized. A value of "02:00:00:00:00:00 00:00:00:00:00:00" will create a fully scrambled globally-administered, burned-in MAC address. If the value contains more than one additional MAC addresses, one of them is chosen randomly. For example, "02:00:00:00:00:00 00:00:00:00:00:00 02:00:00:00:00:00" will create a fully scrambled MAC address, randomly locally or globally administered.hiddenbooleanFALSEIf TRUE, indicates that the network is a non-broadcasting network that hides its SSID. This works both in infrastructure and AP mode. In infrastructure mode, various workarounds are used for a more reliable discovery of hidden networks, such as probe-scanning the SSID. However, these workarounds expose inherent insecurities with hidden SSID networks, and thus hidden SSID networks should be used with caution. In AP mode, the created network does not broadcast its SSID. Note that marking the network as hidden may be a privacy issue for you (in infrastructure mode) or client stations (in AP mode), as the explicit probe-scans are distinctly recognizable on the air.mac-addressbyte arrayIf specified, this connection will only apply to the Wi-Fi device whose permanent MAC address matches. This property does not change the MAC address of the device (i.e. MAC spoofing).mac-address-blacklistarray of stringA list of permanent MAC addresses of Wi-Fi devices to which this connection should never apply. Each MAC address should be given in the standard hex-digits-and-colons notation (eg "00:11:22:33:44:55").mac-address-randomizationuint320One of NM_SETTING_MAC_RANDOMIZATION_DEFAULT (0) (never randomize unless the user has set a global default to randomize and the supplicant supports randomization), NM_SETTING_MAC_RANDOMIZATION_NEVER (1) (never randomize the MAC address), or NM_SETTING_MAC_RANDOMIZATION_ALWAYS (2) (always randomize the MAC address). This property is deprecated for 'cloned-mac-address'. Deprecated: 1modestringWi-Fi network mode; one of "infrastructure", "mesh", "adhoc" or "ap". If blank, infrastructure is assumed.mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple Ethernet frames.powersaveuint320One of NM_SETTING_WIRELESS_POWERSAVE_DISABLE (2) (disable Wi-Fi power saving), NM_SETTING_WIRELESS_POWERSAVE_ENABLE (3) (enable Wi-Fi power saving), NM_SETTING_WIRELESS_POWERSAVE_IGNORE (1) (don't touch currently configure setting) or NM_SETTING_WIRELESS_POWERSAVE_DEFAULT (0) (use the globally configured value). All other values are reserved.rateuint320If non-zero, directs the device to only use the specified bitrate for communication with the access point. Units are in Kb/s, ie 5500 = 5.5 Mbit/s. This property is highly driver dependent and not all devices support setting a static bitrate.securityThis property is deprecated, but can be set to the value '802-11-wireless-security' when a wireless security setting is also present in the connection dictionary, for compatibility with very old NetworkManager daemons.seen-bssidsarray of stringA list of BSSIDs (each BSSID formatted as a MAC address like "00:11:22:33:44:55") that have been detected as part of the Wi-Fi network. NetworkManager internally tracks previously seen BSSIDs. The property is only meant for reading and reflects the BSSID list of NetworkManager. The changes you make to this property will not be preserved.ssidbyte arraySSID of the Wi-Fi network. Must be specified.tx-poweruint320If non-zero, directs the device to use the specified transmit power. Units are dBm. This property is highly driver dependent and not all devices support setting a static transmit power.wake-on-wlanuint321The NMSettingWirelessWakeOnWLan options to enable. Not all devices support all options. May be any combination of NM_SETTING_WIRELESS_WAKE_ON_WLAN_ANY (0x2), NM_SETTING_WIRELESS_WAKE_ON_WLAN_DISCONNECT (0x4), NM_SETTING_WIRELESS_WAKE_ON_WLAN_MAGIC (0x8), NM_SETTING_WIRELESS_WAKE_ON_WLAN_GTK_REKEY_FAILURE (0x10), NM_SETTING_WIRELESS_WAKE_ON_WLAN_EAP_IDENTITY_REQUEST (0x20), NM_SETTING_WIRELESS_WAKE_ON_WLAN_4WAY_HANDSHAKE (0x40), NM_SETTING_WIRELESS_WAKE_ON_WLAN_RFKILL_RELEASE (0x80), NM_SETTING_WIRELESS_WAKE_ON_WLAN_TCP (0x100) or the special values NM_SETTING_WIRELESS_WAKE_ON_WLAN_DEFAULT (0x1) (to use global settings) and NM_SETTING_WIRELESS_WAKE_ON_WLAN_IGNORE (0x8000) (to disable management of Wake-on-LAN in NetworkManager).802-11-wireless-security settingWi-Fi Security Settings.Key NameValue TypeDefault ValueValue Descriptionauth-algstringWhen WEP is used (ie, key-mgmt = "none" or "ieee8021x") indicate the 802.11 authentication algorithm required by the AP here. One of "open" for Open System, "shared" for Shared Key, or "leap" for Cisco LEAP. When using Cisco LEAP (ie, key-mgmt = "ieee8021x" and auth-alg = "leap") the "leap-username" and "leap-password" properties must be specified.filsint320Indicates whether Fast Initial Link Setup (802.11ai) must be enabled for the connection. One of NM_SETTING_WIRELESS_SECURITY_FILS_DEFAULT (0) (use global default value), NM_SETTING_WIRELESS_SECURITY_FILS_DISABLE (1) (disable FILS), NM_SETTING_WIRELESS_SECURITY_FILS_OPTIONAL (2) (enable FILS if the supplicant and the access point support it) or NM_SETTING_WIRELESS_SECURITY_FILS_REQUIRED (3) (enable FILS and fail if not supported). When set to NM_SETTING_WIRELESS_SECURITY_FILS_DEFAULT (0) and no global default is set, FILS will be optionally enabled.grouparray of stringA list of group/broadcast encryption algorithms which prevents connections to Wi-Fi networks that do not utilize one of the algorithms in the list. For maximum compatibility leave this property empty. Each list element may be one of "wep40", "wep104", "tkip", or "ccmp".key-mgmtstringKey management used for the connection. One of "none" (WEP), "ieee8021x" (Dynamic WEP), "wpa-psk" (infrastructure WPA-PSK), "sae" (SAE), "owe" (Opportunistic Wireless Encryption), "wpa-eap" (WPA-Enterprise) or "wpa-eap-suite-b-192" (WPA3-Enterprise Suite B). This property must be set for any Wi-Fi connection that uses security.leap-passwordstringThe login password for legacy LEAP connections (ie, key-mgmt = "ieee8021x" and auth-alg = "leap").leap-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "leap-password" property. (see for flag values)leap-usernamestringThe login username for legacy LEAP connections (ie, key-mgmt = "ieee8021x" and auth-alg = "leap").pairwisearray of stringA list of pairwise encryption algorithms which prevents connections to Wi-Fi networks that do not utilize one of the algorithms in the list. For maximum compatibility leave this property empty. Each list element may be one of "tkip" or "ccmp".pmfint320Indicates whether Protected Management Frames (802.11w) must be enabled for the connection. One of NM_SETTING_WIRELESS_SECURITY_PMF_DEFAULT (0) (use global default value), NM_SETTING_WIRELESS_SECURITY_PMF_DISABLE (1) (disable PMF), NM_SETTING_WIRELESS_SECURITY_PMF_OPTIONAL (2) (enable PMF if the supplicant and the access point support it) or NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED (3) (enable PMF and fail if not supported). When set to NM_SETTING_WIRELESS_SECURITY_PMF_DEFAULT (0) and no global default is set, PMF will be optionally enabled.protoarray of stringList of strings specifying the allowed WPA protocol versions to use. Each element may be one "wpa" (allow WPA) or "rsn" (allow WPA2/RSN). If not specified, both WPA and RSN connections are allowed.pskstringPre-Shared-Key for WPA networks. For WPA-PSK, it's either an ASCII passphrase of 8 to 63 characters that is (as specified in the 802.11i standard) hashed to derive the actual key, or the key in form of 64 hexadecimal character. The WPA3-Personal networks use a passphrase of any length for SAE authentication.psk-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "psk" property. (see for flag values)wep-key-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "wep-key0", "wep-key1", "wep-key2", and "wep-key3" properties. (see for flag values)wep-key-typeNMWepKeyType (uint32)Controls the interpretation of WEP keys. Allowed values are NM_WEP_KEY_TYPE_KEY (1), in which case the key is either a 10- or 26-character hexadecimal string, or a 5- or 13-character ASCII password; or NM_WEP_KEY_TYPE_PASSPHRASE (2), in which case the passphrase is provided as a string and will be hashed using the de-facto MD5 method to derive the actual WEP key.wep-key0stringIndex 0 WEP key. This is the WEP key used in most networks. See the "wep-key-type" property for a description of how this key is interpreted.wep-key1stringIndex 1 WEP key. This WEP index is not used by most networks. See the "wep-key-type" property for a description of how this key is interpreted.wep-key2stringIndex 2 WEP key. This WEP index is not used by most networks. See the "wep-key-type" property for a description of how this key is interpreted.wep-key3stringIndex 3 WEP key. This WEP index is not used by most networks. See the "wep-key-type" property for a description of how this key is interpreted.wep-tx-keyidxuint320When static WEP is used (ie, key-mgmt = "none") and a non-default WEP key index is used by the AP, put that WEP key index here. Valid values are 0 (default key) through 3. Note that some consumer access points (like the Linksys WRT54G) number the keys 1 - 4.wps-methoduint320Flags indicating which mode of WPS is to be used if any. There's little point in changing the default setting as NetworkManager will automatically determine whether it's feasible to start WPS enrollment from the Access Point capabilities. WPS can be disabled by setting this property to a value of 1.wpan settingIEEE 802.15.4 (WPAN) MAC Settings.Key NameValue TypeDefault ValueValue Descriptionchannelint32-1IEEE 802.15.4 channel. A positive integer or -1, meaning "do not set, use whatever the device is already set to".mac-addressstringIf specified, this connection will only apply to the IEEE 802.15.4 (WPAN) MAC layer device whose permanent MAC address matches.pageint32-1IEEE 802.15.4 channel page. A positive integer or -1, meaning "do not set, use whatever the device is already set to".pan-iduint3265535IEEE 802.15.4 Personal Area Network (PAN) identifier.short-addressuint3265535Short IEEE 802.15.4 address to be used within a restricted environment.hostname settingHostname settings.Key NameValue TypeDefault ValueValue Descriptionfrom-dhcpNMTernary (int32)Whether the system hostname can be determined from DHCP on this connection. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).from-dns-lookupNMTernary (int32)Whether the system hostname can be determined from reverse DNS lookup of addresses on this device. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).only-from-defaultNMTernary (int32)If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).priorityint320The relative priority of this connection to determine the system hostname. A lower numerical value is better (higher priority). A connection with higher priority is considered before connections with lower priority. If the value is zero, it can be overridden by a global value from NetworkManager configuration. If the property doesn't have a value in the global configuration, the value is assumed to be 100. Negative values have the special effect of excluding other connections with a greater numerical priority value; so in presence of at least one negative priority, only connections with the lowest priority value will be used to determine the hostname.ovs-external-ids settingOVS External IDs Settings.Key NameValue TypeDefault ValueValue Descriptiondatadict of string to string{}A dictionary of key/value pairs with exernal-ids for OVS.veth settingVeth Settings.Key NameValue TypeDefault ValueValue DescriptionpeerstringThis property specifies the peer interface name of the veth. This property is mandatory.Secret flag types: + connection settingGeneral Connection Profile Settings.Key NameValue TypeDefault ValueValue Descriptionauth-retriesint32-1The number of retries for the authentication. Zero means to try indefinitely; -1 means to use a global default. If the global default is not set, the authentication retries for 3 times before failing the connection. Currently, this only applies to 802-1x authentication.autoconnectbooleanTRUEWhether or not the connection should be automatically connected by NetworkManager when the resources for the connection are available. TRUE to automatically activate the connection, FALSE to require manual intervention to activate the connection. Note that autoconnect is not implemented for VPN profiles. See "secondaries" as an alternative to automatically connect VPN profiles.autoconnect-priorityint320The autoconnect priority. If the connection is set to autoconnect, connections with higher priority will be preferred. Defaults to 0. The higher number means higher priority.autoconnect-retriesint32-1The number of times a connection should be tried when autoactivating before giving up. Zero means forever, -1 means the global default (4 times if not overridden). Setting this to 1 means to try activation only once before blocking autoconnect. Note that after a timeout, NetworkManager will try to autoconnect again.autoconnect-slavesNMSettingConnectionAutoconnectSlaves (int32)Whether or not slaves of this connection should be automatically brought up when NetworkManager activates this connection. This only has a real effect for master connections. The properties "autoconnect", "autoconnect-priority" and "autoconnect-retries" are unrelated to this setting. The permitted values are: 0: leave slave connections untouched, 1: activate all the slave connections with this connection, -1: default. If -1 (default) is set, global connection.autoconnect-slaves is read to determine the real value. If it is default as well, this fallbacks to 0.gateway-ping-timeoutuint320If greater than zero, delay success of IP addressing until either the timeout is reached, or an IP gateway replies to a ping.idstringA human readable unique identifier for the connection, like "Work Wi-Fi" or "T-Mobile 3G".interface-namestringThe name of the network interface this connection is bound to. If not set, then the connection can be attached to any interface of the appropriate type (subject to restrictions imposed by other settings). For software devices this specifies the name of the created device. For connection types where interface names cannot easily be made persistent (e.g. mobile broadband or USB Ethernet), this property should not be used. Setting this property restricts the interfaces a connection can be used with, and if interface names change or are reordered the connection may be applied to the wrong interface.lldpint32-1Whether LLDP is enabled for the connection.llmnrint32-1Whether Link-Local Multicast Name Resolution (LLMNR) is enabled for the connection. LLMNR is a protocol based on the Domain Name System (DNS) packet format that allows both IPv4 and IPv6 hosts to perform name resolution for hosts on the same local link. The permitted values are: "yes" (2) register hostname and resolving for the connection, "no" (0) disable LLMNR for the interface, "resolve" (1) do not register hostname but allow resolving of LLMNR host names If unspecified, "default" ultimately depends on the DNS plugin (which for systemd-resolved currently means "yes"). This feature requires a plugin which supports LLMNR. Otherwise, the setting has no effect. One such plugin is dns-systemd-resolved.masterstringInterface name of the master device or UUID of the master connection.mdnsint32-1Whether mDNS is enabled for the connection. The permitted values are: "yes" (2) register hostname and resolving for the connection, "no" (0) disable mDNS for the interface, "resolve" (1) do not register hostname but allow resolving of mDNS host names and "default" (-1) to allow lookup of a global default in NetworkManager.conf. If unspecified, "default" ultimately depends on the DNS plugin (which for systemd-resolved currently means "no"). This feature requires a plugin which supports mDNS. Otherwise, the setting has no effect. One such plugin is dns-systemd-resolved.meteredNMMetered (int32)Whether the connection is metered. When updating this property on a currently activated connection, the change takes effect immediately.mud-urlstringIf configured, set to a Manufacturer Usage Description (MUD) URL that points to manufacturer-recommended network policies for IoT devices. It is transmitted as a DHCPv4 or DHCPv6 option. The value must be a valid URL starting with "https://". The special value "none" is allowed to indicate that no MUD URL is used. If the per-profile value is unspecified (the default), a global connection default gets consulted. If still unspecified, the ultimate default is "none".multi-connectint320Specifies whether the profile can be active multiple times at a particular moment. The value is of type NMConnectionMultiConnect.permissionsarray of stringAn array of strings defining what access a given user has to this connection. If this is NULL or empty, all users are allowed to access this connection; otherwise users are allowed if and only if they are in this list. When this is not empty, the connection can be active only when one of the specified users is logged into an active session. Each entry is of the form "[type]:[id]:[reserved]"; for example, "user:dcbw:blah". At this time only the "user" [type] is allowed. Any other values are ignored and reserved for future use. [id] is the username that this permission refers to, which may not contain the ":" character. Any [reserved] information present must be ignored and is reserved for future use. All of [type], [id], and [reserved] must be valid UTF-8.read-onlybooleanFALSEFALSE if the connection can be modified using the provided settings service's D-Bus interface with the right privileges, or TRUE if the connection is read-only and cannot be modified.secondariesarray of stringList of connection UUIDs that should be activated when the base connection itself is activated. Currently, only VPN connections are supported.slave-typestringSetting name of the device type of this slave's master connection (eg, "bond"), or NULL if this connection is not a slave.stable-idstringThis represents the identity of the connection used for various purposes. It allows to configure multiple profiles to share the identity. Also, the stable-id can contain placeholders that are substituted dynamically and deterministically depending on the context. The stable-id is used for generating IPv6 stable private addresses with ipv6.addr-gen-mode=stable-privacy. It is also used to seed the generated cloned MAC address for ethernet.cloned-mac-address=stable and wifi.cloned-mac-address=stable. It is also used as DHCP client identifier with ipv4.dhcp-client-id=stable and to derive the DHCP DUID with ipv6.dhcp-duid=stable-[llt,ll,uuid]. Note that depending on the context where it is used, other parameters are also seeded into the generation algorithm. For example, a per-host key is commonly also included, so that different systems end up generating different IDs. Or with ipv6.addr-gen-mode=stable-privacy, also the device's name is included, so that different interfaces yield different addresses. The per-host key is the identity of your machine and stored in /var/lib/NetworkManager/secret-key. The '$' character is treated special to perform dynamic substitutions at runtime. Currently, supported are "${CONNECTION}", "${DEVICE}", "${MAC}", "${BOOT}", "${RANDOM}". These effectively create unique IDs per-connection, per-device, per-boot, or every time. Note that "${DEVICE}" corresponds to the interface name of the device and "${MAC}" is the permanent MAC address of the device. Any unrecognized patterns following '$' are treated verbatim, however are reserved for future use. You are thus advised to avoid '$' or escape it as "$$". For example, set it to "${CONNECTION}-${BOOT}-${DEVICE}" to create a unique id for this connection that changes with every reboot and differs depending on the interface where the profile activates. If the value is unset, a global connection default is consulted. If the value is still unset, the default is similar to "${CONNECTION}" and uses a unique, fixed ID for the connection.timestampuint640The time, in seconds since the Unix Epoch, that the connection was last _successfully_ fully activated. NetworkManager updates the connection timestamp periodically when the connection is active to ensure that an active connection has the latest timestamp. The property is only meant for reading (changes to this property will not be preserved).typestringBase type of the connection. For hardware-dependent connections, should contain the setting name of the hardware-type specific setting (ie, "802-3-ethernet" or "802-11-wireless" or "bluetooth", etc), and for non-hardware dependent connections like VPN or otherwise, should contain the setting name of that setting type (ie, "vpn" or "bridge", etc).uuidstringA universally unique identifier for the connection, for example generated with libuuid. It should be assigned when the connection is created, and never changed as long as the connection still applies to the same network. For example, it should not be changed when the "id" property or NMSettingIP4Config changes, but might need to be re-created when the Wi-Fi SSID, mobile broadband network provider, or "type" property changes. The UUID must be in the format "2815492f-7e56-435e-b2e9-246bd7cdc664" (ie, contains only hexadecimal characters and "-").wait-device-timeoutint32-1Timeout in milliseconds to wait for device at startup. During boot, devices may take a while to be detected by the driver. This property will cause to delay NetworkManager-wait-online.service and nm-online to give the device a chance to appear. This works by waiting for the given timeout until a compatible device for the profile is available and managed. The value 0 means no wait time. The default value is -1, which currently has the same meaning as no wait time.zonestringThe trust level of a the connection. Free form case-insensitive string (for example "Home", "Work", "Public"). NULL or unspecified zone means the connection will be placed in the default zone as defined by the firewall. When updating this property on a currently activated connection, the change takes effect immediately.6lowpan setting6LoWPAN Settings.Key NameValue TypeDefault ValueValue DescriptionparentstringIf given, specifies the parent interface name or parent connection UUID from which this 6LowPAN interface should be created.802-1x settingIEEE 802.1x Authentication Settings.Key NameValue TypeDefault ValueValue Descriptionaltsubject-matchesarray of stringList of strings to be matched against the altSubjectName of the certificate presented by the authentication server. If the list is empty, no verification of the server certificate's altSubjectName is performed.anonymous-identitystringAnonymous identity string for EAP authentication methods. Used as the unencrypted identity with EAP types that support different tunneled identity like EAP-TTLS.auth-timeoutint320A timeout for the authentication. Zero means the global default; if the global default is not set, the authentication timeout is 25 seconds.ca-certbyte arrayContains the CA certificate if used by the EAP method specified in the "eap" property. Certificate data is specified using a "scheme"; three are currently supported: blob, path and pkcs#11 URL. When using the blob scheme this property should be set to the certificate's DER encoded data. When using the path scheme, this property should be set to the full UTF-8 encoded path of the certificate, prefixed with the string "file://" and ending with a terminating NUL byte. This property can be unset even if the EAP method supports CA certificates, but this allows man-in-the-middle attacks and is NOT recommended. Note that enabling NMSetting8021x:system-ca-certs will override this setting to use the built-in path, if the built-in path is not a directory.ca-cert-passwordstringThe password used to access the CA certificate stored in "ca-cert" property. Only makes sense if the certificate is stored on a PKCS#11 token that requires a login.ca-cert-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "ca-cert-password" property. (see for flag values)ca-pathstringUTF-8 encoded path to a directory containing PEM or DER formatted certificates to be added to the verification chain in addition to the certificate specified in the "ca-cert" property. If NMSetting8021x:system-ca-certs is enabled and the built-in CA path is an existing directory, then this setting is ignored.client-certbyte arrayContains the client certificate if used by the EAP method specified in the "eap" property. Certificate data is specified using a "scheme"; two are currently supported: blob and path. When using the blob scheme (which is backwards compatible with NM 0.7.x) this property should be set to the certificate's DER encoded data. When using the path scheme, this property should be set to the full UTF-8 encoded path of the certificate, prefixed with the string "file://" and ending with a terminating NUL byte.client-cert-passwordstringThe password used to access the client certificate stored in "client-cert" property. Only makes sense if the certificate is stored on a PKCS#11 token that requires a login.client-cert-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "client-cert-password" property. (see for flag values)domain-matchstringConstraint for server domain name. If set, this list of FQDNs is used as a match requirement for dNSName element(s) of the certificate presented by the authentication server. If a matching dNSName is found, this constraint is met. If no dNSName values are present, this constraint is matched against SubjectName CN using the same comparison. Multiple valid FQDNs can be passed as a ";" delimited list.domain-suffix-matchstringConstraint for server domain name. If set, this FQDN is used as a suffix match requirement for dNSName element(s) of the certificate presented by the authentication server. If a matching dNSName is found, this constraint is met. If no dNSName values are present, this constraint is matched against SubjectName CN using same suffix match comparison. Since version 1.24, multiple valid FQDNs can be passed as a ";" delimited list.eaparray of stringThe allowed EAP method to be used when authenticating to the network with 802.1x. Valid methods are: "leap", "md5", "tls", "peap", "ttls", "pwd", and "fast". Each method requires different configuration using the properties of this setting; refer to wpa_supplicant documentation for the allowed combinations.identitystringIdentity string for EAP authentication methods. Often the user's user or login name.optionalbooleanFALSEWhether the 802.1X authentication is optional. If TRUE, the activation will continue even after a timeout or an authentication failure. Setting the property to TRUE is currently allowed only for Ethernet connections. If set to FALSE, the activation can continue only after a successful authentication.pac-filestringUTF-8 encoded file path containing PAC for EAP-FAST.passwordstringUTF-8 encoded password used for EAP authentication methods. If both the "password" property and the "password-raw" property are specified, "password" is preferred.password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password" property. (see for flag values)password-rawbyte arrayPassword used for EAP authentication methods, given as a byte array to allow passwords in other encodings than UTF-8 to be used. If both the "password" property and the "password-raw" property are specified, "password" is preferred.password-raw-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password-raw" property. (see for flag values)phase1-auth-flagsuint320Specifies authentication flags to use in "phase 1" outer authentication using NMSetting8021xAuthFlags options. The individual TLS versions can be explicitly disabled. If a certain TLS disable flag is not set, it is up to the supplicant to allow or forbid it. The TLS options map to tls_disable_tlsv1_x settings. See the wpa_supplicant documentation for more details.phase1-fast-provisioningstringEnables or disables in-line provisioning of EAP-FAST credentials when FAST is specified as the EAP method in the "eap" property. Recognized values are "0" (disabled), "1" (allow unauthenticated provisioning), "2" (allow authenticated provisioning), and "3" (allow both authenticated and unauthenticated provisioning). See the wpa_supplicant documentation for more details.phase1-peaplabelstringForces use of the new PEAP label during key derivation. Some RADIUS servers may require forcing the new PEAP label to interoperate with PEAPv1. Set to "1" to force use of the new PEAP label. See the wpa_supplicant documentation for more details.phase1-peapverstringForces which PEAP version is used when PEAP is set as the EAP method in the "eap" property. When unset, the version reported by the server will be used. Sometimes when using older RADIUS servers, it is necessary to force the client to use a particular PEAP version. To do so, this property may be set to "0" or "1" to force that specific PEAP version.phase2-altsubject-matchesarray of stringList of strings to be matched against the altSubjectName of the certificate presented by the authentication server during the inner "phase 2" authentication. If the list is empty, no verification of the server certificate's altSubjectName is performed.phase2-authstringSpecifies the allowed "phase 2" inner non-EAP authentication method when an EAP method that uses an inner TLS tunnel is specified in the "eap" property. Recognized non-EAP "phase 2" methods are "pap", "chap", "mschap", "mschapv2", "gtc", "otp", "md5", and "tls". Each "phase 2" inner method requires specific parameters for successful authentication; see the wpa_supplicant documentation for more details.phase2-autheapstringSpecifies the allowed "phase 2" inner EAP-based authentication method when an EAP method that uses an inner TLS tunnel is specified in the "eap" property. Recognized EAP-based "phase 2" methods are "md5", "mschapv2", "otp", "gtc", and "tls". Each "phase 2" inner method requires specific parameters for successful authentication; see the wpa_supplicant documentation for more details.phase2-ca-certbyte arrayContains the "phase 2" CA certificate if used by the EAP method specified in the "phase2-auth" or "phase2-autheap" properties. Certificate data is specified using a "scheme"; three are currently supported: blob, path and pkcs#11 URL. When using the blob scheme this property should be set to the certificate's DER encoded data. When using the path scheme, this property should be set to the full UTF-8 encoded path of the certificate, prefixed with the string "file://" and ending with a terminating NUL byte. This property can be unset even if the EAP method supports CA certificates, but this allows man-in-the-middle attacks and is NOT recommended. Note that enabling NMSetting8021x:system-ca-certs will override this setting to use the built-in path, if the built-in path is not a directory.phase2-ca-cert-passwordstringThe password used to access the "phase2" CA certificate stored in "phase2-ca-cert" property. Only makes sense if the certificate is stored on a PKCS#11 token that requires a login.phase2-ca-cert-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "phase2-ca-cert-password" property. (see for flag values)phase2-ca-pathstringUTF-8 encoded path to a directory containing PEM or DER formatted certificates to be added to the verification chain in addition to the certificate specified in the "phase2-ca-cert" property. If NMSetting8021x:system-ca-certs is enabled and the built-in CA path is an existing directory, then this setting is ignored.phase2-client-certbyte arrayContains the "phase 2" client certificate if used by the EAP method specified in the "phase2-auth" or "phase2-autheap" properties. Certificate data is specified using a "scheme"; two are currently supported: blob and path. When using the blob scheme (which is backwards compatible with NM 0.7.x) this property should be set to the certificate's DER encoded data. When using the path scheme, this property should be set to the full UTF-8 encoded path of the certificate, prefixed with the string "file://" and ending with a terminating NUL byte. This property can be unset even if the EAP method supports CA certificates, but this allows man-in-the-middle attacks and is NOT recommended.phase2-client-cert-passwordstringThe password used to access the "phase2" client certificate stored in "phase2-client-cert" property. Only makes sense if the certificate is stored on a PKCS#11 token that requires a login.phase2-client-cert-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "phase2-client-cert-password" property. (see for flag values)phase2-domain-matchstringConstraint for server domain name. If set, this list of FQDNs is used as a match requirement for dNSName element(s) of the certificate presented by the authentication server during the inner "phase 2" authentication. If a matching dNSName is found, this constraint is met. If no dNSName values are present, this constraint is matched against SubjectName CN using the same comparison. Multiple valid FQDNs can be passed as a ";" delimited list.phase2-domain-suffix-matchstringConstraint for server domain name. If set, this FQDN is used as a suffix match requirement for dNSName element(s) of the certificate presented by the authentication server during the inner "phase 2" authentication. If a matching dNSName is found, this constraint is met. If no dNSName values are present, this constraint is matched against SubjectName CN using same suffix match comparison. Since version 1.24, multiple valid FQDNs can be passed as a ";" delimited list.phase2-private-keybyte arrayContains the "phase 2" inner private key when the "phase2-auth" or "phase2-autheap" property is set to "tls". Key data is specified using a "scheme"; two are currently supported: blob and path. When using the blob scheme and private keys, this property should be set to the key's encrypted PEM encoded data. When using private keys with the path scheme, this property should be set to the full UTF-8 encoded path of the key, prefixed with the string "file://" and ending with a terminating NUL byte. When using PKCS#12 format private keys and the blob scheme, this property should be set to the PKCS#12 data and the "phase2-private-key-password" property must be set to password used to decrypt the PKCS#12 certificate and key. When using PKCS#12 files and the path scheme, this property should be set to the full UTF-8 encoded path of the key, prefixed with the string "file://" and ending with a terminating NUL byte, and as with the blob scheme the "phase2-private-key-password" property must be set to the password used to decode the PKCS#12 private key and certificate.phase2-private-key-passwordstringThe password used to decrypt the "phase 2" private key specified in the "phase2-private-key" property when the private key either uses the path scheme, or is a PKCS#12 format key.phase2-private-key-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "phase2-private-key-password" property. (see for flag values)phase2-subject-matchstringSubstring to be matched against the subject of the certificate presented by the authentication server during the inner "phase 2" authentication. When unset, no verification of the authentication server certificate's subject is performed. This property provides little security, if any, and its use is deprecated in favor of NMSetting8021x:phase2-domain-suffix-match.pinstringPIN used for EAP authentication methods.pin-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "pin" property. (see for flag values)private-keybyte arrayContains the private key when the "eap" property is set to "tls". Key data is specified using a "scheme"; two are currently supported: blob and path. When using the blob scheme and private keys, this property should be set to the key's encrypted PEM encoded data. When using private keys with the path scheme, this property should be set to the full UTF-8 encoded path of the key, prefixed with the string "file://" and ending with a terminating NUL byte. When using PKCS#12 format private keys and the blob scheme, this property should be set to the PKCS#12 data and the "private-key-password" property must be set to password used to decrypt the PKCS#12 certificate and key. When using PKCS#12 files and the path scheme, this property should be set to the full UTF-8 encoded path of the key, prefixed with the string "file://" and ending with a terminating NUL byte, and as with the blob scheme the "private-key-password" property must be set to the password used to decode the PKCS#12 private key and certificate. WARNING: "private-key" is not a "secret" property, and thus unencrypted private key data using the BLOB scheme may be readable by unprivileged users. Private keys should always be encrypted with a private key password to prevent unauthorized access to unencrypted private key data.private-key-passwordstringThe password used to decrypt the private key specified in the "private-key" property when the private key either uses the path scheme, or if the private key is a PKCS#12 format key.private-key-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "private-key-password" property. (see for flag values)subject-matchstringSubstring to be matched against the subject of the certificate presented by the authentication server. When unset, no verification of the authentication server certificate's subject is performed. This property provides little security, if any, and its use is deprecated in favor of NMSetting8021x:domain-suffix-match.system-ca-certsbooleanFALSEWhen TRUE, overrides the "ca-path" and "phase2-ca-path" properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the "ca-cert" and "phase2-ca-cert" properties. If the path provided with --system-ca-path is rather a file name (bundle of trusted CA certificates), it overrides "ca-cert" and "phase2-ca-cert" properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant).adsl settingADSL Settings.Key NameValue TypeDefault ValueValue DescriptionencapsulationstringEncapsulation of ADSL connection. Can be "vcmux" or "llc".passwordstringPassword used to authenticate with the ADSL service.password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password" property. (see for flag values)protocolstringADSL connection protocol. Can be "pppoa", "pppoe" or "ipoatm".usernamestringUsername used to authenticate with the ADSL service.vciuint320VCI of ADSL connectionvpiuint320VPI of ADSL connectionbluetooth settingBluetooth Settings.Key NameValue TypeDefault ValueValue Descriptionbdaddrbyte arrayThe Bluetooth address of the device.typestringEither "dun" for Dial-Up Networking connections or "panu" for Personal Area Networking connections to devices supporting the NAP profile.bond settingBonding Settings.Key NameValue TypeDefault ValueValue Descriptioninterface-namestringDeprecated in favor of connection.interface-name, but can be used for backward-compatibility with older daemons, to set the bond's interface name.optionsdict of string to string{'mode': 'balance-rr'}Dictionary of key/value pairs of bonding options. Both keys and values must be strings. Option names must contain only alphanumeric characters (ie, [a-zA-Z0-9]).bridge settingBridging Settings.Key NameValue TypeDefault ValueValue Descriptionageing-timeuint32300The Ethernet MAC address aging time, in seconds.forward-delayuint3215The Spanning Tree Protocol (STP) forwarding delay, in seconds.group-addressbyte arrayIf specified, The MAC address of the multicast group this bridge uses for STP. The address must be a link-local address in standard Ethernet MAC address format, ie an address of the form 01:80:C2:00:00:0X, with X in [0, 4..F]. If not specified the default value is 01:80:C2:00:00:00.group-forward-maskuint320A mask of group addresses to forward. Usually, group addresses in the range from 01:80:C2:00:00:00 to 01:80:C2:00:00:0F are not forwarded according to standards. This property is a mask of 16 bits, each corresponding to a group address in that range that must be forwarded. The mask can't have bits 0, 1 or 2 set because they are used for STP, MAC pause frames and LACP.hello-timeuint322The Spanning Tree Protocol (STP) hello time, in seconds.interface-namestringDeprecated in favor of connection.interface-name, but can be used for backward-compatibility with older daemons, to set the bridge's interface name.mac-addressbyte arrayIf specified, the MAC address of bridge. When creating a new bridge, this MAC address will be set. If this field is left unspecified, the "ethernet.cloned-mac-address" is referred instead to generate the initial MAC address. Note that setting "ethernet.cloned-mac-address" anyway overwrites the MAC address of the bridge later while activating the bridge. Hence, this property is deprecated. Deprecated: 1max-ageuint3220The Spanning Tree Protocol (STP) maximum message age, in seconds.multicast-hash-maxuint324096Set maximum size of multicast hash table (value must be a power of 2).multicast-last-member-countuint322Set the number of queries the bridge will send before stopping forwarding a multicast group after a "leave" message has been received.multicast-last-member-intervaluint64100Set interval (in deciseconds) between queries to find remaining members of a group, after a "leave" message is received.multicast-membership-intervaluint6426000Set delay (in deciseconds) after which the bridge will leave a group, if no membership reports for this group are received.multicast-querierbooleanFALSEEnable or disable sending of multicast queries by the bridge. If not specified the option is disabled.multicast-querier-intervaluint6425500If no queries are seen after this delay (in deciseconds) has passed, the bridge will start to send its own queries.multicast-query-intervaluint6412500Interval (in deciseconds) between queries sent by the bridge after the end of the startup phase.multicast-query-response-intervaluint641000Set the Max Response Time/Max Response Delay (in deciseconds) for IGMP/MLD queries sent by the bridge.multicast-query-use-ifaddrbooleanFALSEIf enabled the bridge's own IP address is used as the source address for IGMP queries otherwise the default of 0.0.0.0 is used.multicast-routerstringSets bridge's multicast router. Multicast-snooping must be enabled for this option to work. Supported values are: 'auto', 'disabled', 'enabled' to which kernel assigns the numbers 1, 0, and 2, respectively. If not specified the default value is 'auto' (1).multicast-snoopingbooleanTRUEControls whether IGMP snooping is enabled for this bridge. Note that if snooping was automatically disabled due to hash collisions, the system may refuse to enable the feature until the collisions are resolved.multicast-startup-query-countuint322Set the number of IGMP queries to send during startup phase.multicast-startup-query-intervaluint643125Sets the time (in deciseconds) between queries sent out at startup to determine membership information.priorityuint3232768Sets the Spanning Tree Protocol (STP) priority for this bridge. Lower values are "better"; the lowest priority bridge will be elected the root bridge.stpbooleanTRUEControls whether Spanning Tree Protocol (STP) is enabled for this bridge.vlan-default-pviduint321The default PVID for the ports of the bridge, that is the VLAN id assigned to incoming untagged frames.vlan-filteringbooleanFALSEControl whether VLAN filtering is enabled on the bridge.vlan-protocolstringIf specified, the protocol used for VLAN filtering. Supported values are: '802.1Q', '802.1ad'. If not specified the default value is '802.1Q'.vlan-stats-enabledbooleanFALSEControls whether per-VLAN stats accounting is enabled.vlansarray of vardictArray of bridge VLAN objects. In addition to the VLANs specified here, the bridge will also have the default-pvid VLAN configured by the bridge.vlan-default-pvid property. In nmcli the VLAN list can be specified with the following syntax: $vid [pvid] [untagged] [, $vid [pvid] [untagged]]... where $vid is either a single id between 1 and 4094 or a range, represented as a couple of ids separated by a dash.bridge-port settingBridge Port Settings.Key NameValue TypeDefault ValueValue Descriptionhairpin-modebooleanFALSEEnables or disables "hairpin mode" for the port, which allows frames to be sent back out through the port the frame was received on.path-costuint32100The Spanning Tree Protocol (STP) port cost for destinations via this port.priorityuint3232The Spanning Tree Protocol (STP) priority of this bridge port.vlansarray of vardictArray of bridge VLAN objects. In addition to the VLANs specified here, the port will also have the default-pvid VLAN configured on the bridge by the bridge.vlan-default-pvid property. In nmcli the VLAN list can be specified with the following syntax: $vid [pvid] [untagged] [, $vid [pvid] [untagged]]... where $vid is either a single id between 1 and 4094 or a range, represented as a couple of ids separated by a dash.cdma settingCDMA-based Mobile Broadband Settings.Key NameValue TypeDefault ValueValue Descriptionmtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple frames.numberstringThe number to dial to establish the connection to the CDMA-based mobile broadband network, if any. If not specified, the default number (#777) is used when required.passwordstringThe password used to authenticate with the network, if required. Many providers do not require a password, or accept any password. But if a password is required, it is specified here.password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password" property. (see for flag values)usernamestringThe username used to authenticate with the network, if required. Many providers do not require a username, or accept any username. But if a username is required, it is specified here.dcb settingData Center Bridging Settings.Key NameValue TypeDefault ValueValue Descriptionapp-fcoe-flagsNMSettingDcbFlags (uint32)Specifies the NMSettingDcbFlags for the DCB FCoE application. Flags may be any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), NM_SETTING_DCB_FLAG_ADVERTISE (0x2), and NM_SETTING_DCB_FLAG_WILLING (0x4).app-fcoe-modestring"fabric"The FCoE controller mode; either "fabric" (default) or "vn2vn".app-fcoe-priorityint32-1The highest User Priority (0 - 7) which FCoE frames should use, or -1 for default priority. Only used when the "app-fcoe-flags" property includes the NM_SETTING_DCB_FLAG_ENABLE (0x1) flag.app-fip-flagsNMSettingDcbFlags (uint32)Specifies the NMSettingDcbFlags for the DCB FIP application. Flags may be any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), NM_SETTING_DCB_FLAG_ADVERTISE (0x2), and NM_SETTING_DCB_FLAG_WILLING (0x4).app-fip-priorityint32-1The highest User Priority (0 - 7) which FIP frames should use, or -1 for default priority. Only used when the "app-fip-flags" property includes the NM_SETTING_DCB_FLAG_ENABLE (0x1) flag.app-iscsi-flagsNMSettingDcbFlags (uint32)Specifies the NMSettingDcbFlags for the DCB iSCSI application. Flags may be any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), NM_SETTING_DCB_FLAG_ADVERTISE (0x2), and NM_SETTING_DCB_FLAG_WILLING (0x4).app-iscsi-priorityint32-1The highest User Priority (0 - 7) which iSCSI frames should use, or -1 for default priority. Only used when the "app-iscsi-flags" property includes the NM_SETTING_DCB_FLAG_ENABLE (0x1) flag.priority-bandwidtharray of uint32An array of 8 uint values, where the array index corresponds to the User Priority (0 - 7) and the value indicates the percentage of bandwidth of the priority's assigned group that the priority may use. The sum of all percentages for priorities which belong to the same group must total 100 percents.priority-flow-controlarray of uint32An array of 8 boolean values, where the array index corresponds to the User Priority (0 - 7) and the value indicates whether or not the corresponding priority should transmit priority pause.priority-flow-control-flagsNMSettingDcbFlags (uint32)Specifies the NMSettingDcbFlags for DCB Priority Flow Control (PFC). Flags may be any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), NM_SETTING_DCB_FLAG_ADVERTISE (0x2), and NM_SETTING_DCB_FLAG_WILLING (0x4).priority-group-bandwidtharray of uint32An array of 8 uint values, where the array index corresponds to the Priority Group ID (0 - 7) and the value indicates the percentage of link bandwidth allocated to that group. Allowed values are 0 - 100, and the sum of all values must total 100 percents.priority-group-flagsNMSettingDcbFlags (uint32)Specifies the NMSettingDcbFlags for DCB Priority Groups. Flags may be any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), NM_SETTING_DCB_FLAG_ADVERTISE (0x2), and NM_SETTING_DCB_FLAG_WILLING (0x4).priority-group-idarray of uint32An array of 8 uint values, where the array index corresponds to the User Priority (0 - 7) and the value indicates the Priority Group ID. Allowed Priority Group ID values are 0 - 7 or 15 for the unrestricted group.priority-strict-bandwidtharray of uint32An array of 8 boolean values, where the array index corresponds to the User Priority (0 - 7) and the value indicates whether or not the priority may use all of the bandwidth allocated to its assigned group.priority-traffic-classarray of uint32An array of 8 uint values, where the array index corresponds to the User Priority (0 - 7) and the value indicates the traffic class (0 - 7) to which the priority is mapped.dummy settingDummy Link Settings.Key NameValue TypeDefault ValueValue Descriptionethtool settingEthtool Ethernet Settings.Key NameValue TypeDefault ValueValue Descriptiongeneric settingGeneric Link Settings.Key NameValue TypeDefault ValueValue Descriptiongsm settingGSM-based Mobile Broadband Settings.Key NameValue TypeDefault ValueValue DescriptionapnstringThe GPRS Access Point Name specifying the APN used when establishing a data session with the GSM-based network. The APN often determines how the user will be billed for their network usage and whether the user has access to the Internet or just a provider-specific walled-garden, so it is important to use the correct APN for the user's mobile broadband plan. The APN may only be composed of the characters a-z, 0-9, ., and - per GSM 03.60 Section 14.9.auto-configbooleanFALSEWhen TRUE, the settings such as APN, username, or password will default to values that match the network the modem will register to in the Mobile Broadband Provider database.device-idstringThe device unique identifier (as given by the WWAN management service) which this connection applies to. If given, the connection will only apply to the specified device.home-onlybooleanFALSEWhen TRUE, only connections to the home network will be allowed. Connections to roaming networks will not be made.mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple frames.network-idstringThe Network ID (GSM LAI format, ie MCC-MNC) to force specific network registration. If the Network ID is specified, NetworkManager will attempt to force the device to register only on the specified network. This can be used to ensure that the device does not roam when direct roaming control of the device is not otherwise possible.numberstringLegacy setting that used to help establishing PPP data sessions for GSM-based modems. Deprecated: 1passwordstringThe password used to authenticate with the network, if required. Many providers do not require a password, or accept any password. But if a password is required, it is specified here.password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password" property. (see for flag values)pinstringIf the SIM is locked with a PIN it must be unlocked before any other operations are requested. Specify the PIN here to allow operation of the device.pin-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "pin" property. (see for flag values)sim-idstringThe SIM card unique identifier (as given by the WWAN management service) which this connection applies to. If given, the connection will apply to any device also allowed by "device-id" which contains a SIM card matching the given identifier.sim-operator-idstringA MCC/MNC string like "310260" or "21601" identifying the specific mobile network operator which this connection applies to. If given, the connection will apply to any device also allowed by "device-id" and "sim-id" which contains a SIM card provisioned by the given operator.usernamestringThe username used to authenticate with the network, if required. Many providers do not require a username, or accept any username. But if a username is required, it is specified here.infiniband settingInfiniband Settings.Key NameValue TypeDefault ValueValue Descriptionmac-addressbyte arrayIf specified, this connection will only apply to the IPoIB device whose permanent MAC address matches. This property does not change the MAC address of the device (i.e. MAC spoofing).mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple frames.p-keyint32-1The InfiniBand P_Key to use for this device. A value of -1 means to use the default P_Key (aka "the P_Key at index 0"). Otherwise, it is a 16-bit unsigned integer, whose high bit is set if it is a "full membership" P_Key.parentstringThe interface name of the parent device of this device. Normally NULL, but if the "p_key" property is set, then you must specify the base device by setting either this property or "mac-address".transport-modestringThe IP-over-InfiniBand transport mode. Either "datagram" or "connected".ipv4 settingIPv4 Settings.Key NameValue TypeDefault ValueValue Descriptionaddress-dataarray of vardictArray of IPv4 addresses. Each address dictionary contains at least 'address' and 'prefix' entries, containing the IP address as a string, and the prefix length as a uint32. Additional attributes may also exist on some addresses.addressesarray of array of uint32Deprecated in favor of the 'address-data' and 'gateway' properties, but this can be used for backward-compatibility with older daemons. Note that if you send this property the daemon will ignore 'address-data' and 'gateway'. Array of IPv4 address structures. Each IPv4 address structure is composed of 3 32-bit values; the first being the IPv4 address (network byte order), the second the prefix (1 - 32), and last the IPv4 gateway (network byte order). The gateway may be left as 0 if no gateway exists for that subnet.dad-timeoutint32-1Timeout in milliseconds used to check for the presence of duplicate IP addresses on the network. If an address conflict is detected, the activation will fail. A zero value means that no duplicate address detection is performed, -1 means the default value (either configuration ipvx.dad-timeout override or zero). A value greater than zero is a timeout in milliseconds. The property is currently implemented only for IPv4.dhcp-client-idstringA string sent to the DHCP server to identify the local machine which the DHCP server may use to customize the DHCP lease and options. When the property is a hex string ('aa:bb:cc') it is interpreted as a binary client ID, in which case the first byte is assumed to be the 'type' field as per RFC 2132 section 9.14 and the remaining bytes may be an hardware address (e.g. '01:xx:xx:xx:xx:xx:xx' where 1 is the Ethernet ARP type and the rest is a MAC address). If the property is not a hex string it is considered as a non-hardware-address client ID and the 'type' field is set to 0. The special values "mac" and "perm-mac" are supported, which use the current or permanent MAC address of the device to generate a client identifier with type ethernet (01). Currently, these options only work for ethernet type of links. The special value "ipv6-duid" uses the DUID from "ipv6.dhcp-duid" property as an RFC4361-compliant client identifier. As IAID it uses "ipv4.dhcp-iaid" and falls back to "ipv6.dhcp-iaid" if unset. The special value "duid" generates a RFC4361-compliant client identifier based on "ipv4.dhcp-iaid" and uses a DUID generated by hashing /etc/machine-id. The special value "stable" is supported to generate a type 0 client identifier based on the stable-id (see connection.stable-id) and a per-host key. If you set the stable-id, you may want to include the "${DEVICE}" or "${MAC}" specifier to get a per-device key. If unset, a globally configured default is used. If still unset, the default depends on the DHCP plugin.dhcp-fqdnstringIf the "dhcp-send-hostname" property is TRUE, then the specified FQDN will be sent to the DHCP server when acquiring a lease. This property and "dhcp-hostname" are mutually exclusive and cannot be set at the same time.dhcp-hostnamestringIf the "dhcp-send-hostname" property is TRUE, then the specified name will be sent to the DHCP server when acquiring a lease. This property and "dhcp-fqdn" are mutually exclusive and cannot be set at the same time.dhcp-hostname-flagsuint320Flags for the DHCP hostname and FQDN. Currently, this property only includes flags to control the FQDN flags set in the DHCP FQDN option. Supported FQDN flags are NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1), NM_DHCP_HOSTNAME_FLAG_FQDN_ENCODED (0x2) and NM_DHCP_HOSTNAME_FLAG_FQDN_NO_UPDATE (0x4). When no FQDN flag is set and NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS (0x8) is set, the DHCP FQDN option will contain no flag. Otherwise, if no FQDN flag is set and NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS (0x8) is not set, the standard FQDN flags are set in the request: NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1), NM_DHCP_HOSTNAME_FLAG_FQDN_ENCODED (0x2) for IPv4 and NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1) for IPv6. When this property is set to the default value NM_DHCP_HOSTNAME_FLAG_NONE (0x0), a global default is looked up in NetworkManager configuration. If that value is unset or also NM_DHCP_HOSTNAME_FLAG_NONE (0x0), then the standard FQDN flags described above are sent in the DHCP requests.dhcp-iaidstringA string containing the "Identity Association Identifier" (IAID) used by the DHCP client. The property is a 32-bit decimal value or a special value among "mac", "perm-mac", "ifname" and "stable". When set to "mac" (or "perm-mac"), the last 4 bytes of the current (or permanent) MAC address are used as IAID. When set to "ifname", the IAID is computed by hashing the interface name. The special value "stable" can be used to generate an IAID based on the stable-id (see connection.stable-id), a per-host key and the interface name. When the property is unset, the value from global configuration is used; if no global default is set then the IAID is assumed to be "ifname". Note that at the moment this property is ignored for IPv6 by dhclient, which always derives the IAID from the MAC address.dhcp-reject-serversarray of stringArray of servers from which DHCP offers must be rejected. This property is useful to avoid getting a lease from misconfigured or rogue servers. For DHCPv4, each element must be an IPv4 address, optionally followed by a slash and a prefix length (e.g. "192.168.122.0/24"). This property is currently not implemented for DHCPv6.dhcp-send-hostnamebooleanTRUEIf TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some DHCP servers use this hostname to update DNS databases, essentially providing a static hostname for the computer. If the "dhcp-hostname" property is NULL and this property is TRUE, the current persistent hostname of the computer is sent.dhcp-timeoutint320A timeout for a DHCP transaction in seconds. If zero (the default), a globally configured default is used. If still unspecified, a device specific timeout is used (usually 45 seconds). Set to 2147483647 (MAXINT32) for infinity.dhcp-vendor-class-identifierstringThe Vendor Class Identifier DHCP option (60). Special characters in the data string may be escaped using C-style escapes, nevertheless this property cannot contain nul bytes. If the per-profile value is unspecified (the default), a global connection default gets consulted. If still unspecified, the DHCP option is not sent to the server. Since 1.28dnsarray of uint32Array of IP addresses of DNS servers (as network-byte-order integers)dns-optionsarray of stringArray of DNS options as described in man 5 resolv.conf. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties. The currently supported options are "attempts", "debug", "edns0", "inet6", "ip6-bytestring", "ip6-dotint", "ndots", "no-check-names", "no-ip6-dotint", "no-reload", "no-tld-query", "rotate", "single-request", "single-request-reopen", "timeout", "trust-ad", "use-vc". The "trust-ad" setting is only honored if the profile contributes name servers to resolv.conf, and if all contributing profiles have "trust-ad" enabled.dns-priorityint320DNS servers priority. The relative priority for DNS servers specified by this setting. A lower numerical value is better (higher priority). Negative values have the special effect of excluding other configurations with a greater numerical priority value; so in presence of at least one negative priority, only DNS servers from connections with the lowest priority value will be used. To avoid all DNS leaks, set the priority of the profile that should be used to the most negative value of all active connections profiles. Zero selects a globally configured default value. If the latter is missing or zero too, it defaults to 50 for VPNs (including WireGuard) and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. When multiple devices have configurations with the same priority, VPNs will be considered first, then devices with the best (lowest metric) default route and then all other devices. When using dns=default, servers with higher priority will be on top of resolv.conf. To prioritize a given server over another one within the same connection, just specify them in the desired order. Note that commonly the resolver tries name servers in /etc/resolv.conf in the order listed, proceeding with the next server in the list on failure. See for example the "rotate" option of the dns-options setting. If there are any negative DNS priorities, then only name servers from the devices with that lowest priority will be considered. When using a DNS resolver that supports Conditional Forwarding or Split DNS (with dns=dnsmasq or dns=systemd-resolved settings), each connection is used to query domains in its search list. The search domains determine which name servers to ask, and the DNS priority is used to prioritize name servers based on the domain. Queries for domains not present in any search list are routed through connections having the '~.' special wildcard domain, which is added automatically to connections with the default route (or can be added manually). When multiple connections specify the same domain, the one with the best priority (lowest numerical value) wins. If a sub domain is configured on another interface it will be accepted regardless the priority, unless parent domain on the other interface has a negative priority, which causes the sub domain to be shadowed. With Split DNS one can avoid undesired DNS leaks by properly configuring DNS priorities and the search domains, so that only name servers of the desired interface are configured.dns-searcharray of stringArray of DNS search domains. Domains starting with a tilde ('~') are considered 'routing' domains and are used only to decide the interface over which a query must be forwarded; they are not used to complete unqualified host names. When using a DNS plugin that supports Conditional Forwarding or Split DNS, then the search domains specify which name servers to query. This makes the behavior different from running with plain /etc/resolv.conf. For more information see also the dns-priority setting.gatewaystringThe gateway associated with this configuration. This is only meaningful if "addresses" is also set. The gateway's main purpose is to control the next hop of the standard default route on the device. Hence, the gateway property conflicts with "never-default" and will be automatically dropped if the IP configuration is set to never-default. As an alternative to set the gateway, configure a static default route with /0 as prefix length.ignore-auto-dnsbooleanFALSEWhen "method" is set to "auto" and this property to TRUE, automatically configured name servers and search domains are ignored and only name servers and search domains specified in the "dns" and "dns-search" properties, if any, are used.ignore-auto-routesbooleanFALSEWhen "method" is set to "auto" and this property to TRUE, automatically configured routes are ignored and only routes specified in the "routes" property, if any, are used.may-failbooleanTRUEIf TRUE, allow overall network configuration to proceed even if the configuration specified by this property times out. Note that at least one IP configuration must succeed or overall network configuration will still fail. For example, in IPv6-only networks, setting this property to TRUE on the NMSettingIP4Config allows the overall network configuration to succeed if IPv4 configuration fails but IPv6 configuration completes successfully.methodstringIP configuration method. NMSettingIP4Config and NMSettingIP6Config both support "disabled", "auto", "manual", and "link-local". See the subclass-specific documentation for other values. In general, for the "auto" method, properties such as "dns" and "routes" specify information that is added on to the information returned from automatic configuration. The "ignore-auto-routes" and "ignore-auto-dns" properties modify this behavior. For methods that imply no upstream network, such as "shared" or "link-local", these properties must be empty. For IPv4 method "shared", the IP subnet can be configured by adding one manual IPv4 address or otherwise 10.42.x.0/24 is chosen. Note that the shared method must be configured on the interface which shares the internet to a subnet, not on the uplink which is shared.never-defaultbooleanFALSEIf TRUE, this connection will never be the default connection for this IP type, meaning it will never be assigned the default route by NetworkManager.route-dataarray of vardictArray of IPv4 routes. Each route dictionary contains at least 'dest' and 'prefix' entries, containing the destination IP address as a string, and the prefix length as a uint32. Most routes will also have a 'next-hop' entry, containing the next hop IP address as a string. If the route has a 'metric' entry (containing a uint32), that will be used as the metric for the route (otherwise NM will pick a default value appropriate to the device). Additional attributes may also exist on some routes.route-metricint64-1The default metric for routes that don't explicitly specify a metric. The default value -1 means that the metric is chosen automatically based on the device type. The metric applies to dynamic routes, manual (static) routes that don't have an explicit metric setting, address prefix routes, and the default route. Note that for IPv6, the kernel accepts zero (0) but coerces it to 1024 (user default). Hence, setting this property to zero effectively mean setting it to 1024. For IPv4, zero is a regular value for the metric.route-tableuint320Enable policy routing (source routing) and set the routing table used when adding routes. This affects all routes, including device-routes, IPv4LL, DHCP, SLAAC, default-routes and static routes. But note that static routes can individually overwrite the setting by explicitly specifying a non-zero routing table. If the table setting is left at zero, it is eligible to be overwritten via global configuration. If the property is zero even after applying the global configuration value, policy routing is disabled for the address family of this connection. Policy routing disabled means that NetworkManager will add all routes to the main table (except static routes that explicitly configure a different table). Additionally, NetworkManager will not delete any extraneous routes from tables except the main table. This is to preserve backward compatibility for users who manage routing tables outside of NetworkManager.routesarray of array of uint32Deprecated in favor of the 'route-data' property, but this can be used for backward-compatibility with older daemons. Note that if you send this property the daemon will ignore 'route-data'. Array of IPv4 route structures. Each IPv4 route structure is composed of 4 32-bit values; the first being the destination IPv4 network or address (network byte order), the second the destination network or address prefix (1 - 32), the third being the next-hop (network byte order) if any, and the fourth being the route metric. If the metric is 0, NM will choose an appropriate default metric for the device. (There is no way to explicitly specify an actual metric of 0 with this property.)ipv6 settingIPv6 Settings.Key NameValue TypeDefault ValueValue Descriptionaddr-gen-modeint321Configure method for creating the address for use with RFC4862 IPv6 Stateless Address Autoconfiguration. The permitted values are: NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64 (0) or NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY (1). If the property is set to EUI64, the addresses will be generated using the interface tokens derived from hardware address. This makes the host part of the address to stay constant, making it possible to track host's presence when it changes networks. The address changes when the interface hardware is replaced. The value of stable-privacy enables use of cryptographically secure hash of a secret host-specific key along with the connection's stable-id and the network address as specified by RFC7217. This makes it impossible to use the address track host's presence, and makes the address stable when the network interface hardware is replaced. On D-Bus, the absence of an addr-gen-mode setting equals enabling stable-privacy. For keyfile plugin, the absence of the setting on disk means EUI64 so that the property doesn't change on upgrade from older versions. Note that this setting is distinct from the Privacy Extensions as configured by "ip6-privacy" property and it does not affect the temporary addresses configured with this option.address-dataarray of vardictArray of IPv6 addresses. Each address dictionary contains at least 'address' and 'prefix' entries, containing the IP address as a string, and the prefix length as a uint32. Additional attributes may also exist on some addresses.addressesarray of legacy IPv6 address struct (a(ayuay))Deprecated in favor of the 'address-data' and 'gateway' properties, but this can be used for backward-compatibility with older daemons. Note that if you send this property the daemon will ignore 'address-data' and 'gateway'. Array of IPv6 address structures. Each IPv6 address structure is composed of an IPv6 address, a prefix length (1 - 128), and an IPv6 gateway address. The gateway may be zeroed out if no gateway exists for that subnet.dad-timeoutint32-1Timeout in milliseconds used to check for the presence of duplicate IP addresses on the network. If an address conflict is detected, the activation will fail. A zero value means that no duplicate address detection is performed, -1 means the default value (either configuration ipvx.dad-timeout override or zero). A value greater than zero is a timeout in milliseconds. The property is currently implemented only for IPv4.dhcp-duidstringA string containing the DHCPv6 Unique Identifier (DUID) used by the dhcp client to identify itself to DHCPv6 servers (RFC 3315). The DUID is carried in the Client Identifier option. If the property is a hex string ('aa:bb:cc') it is interpreted as a binary DUID and filled as an opaque value in the Client Identifier option. The special value "lease" will retrieve the DUID previously used from the lease file belonging to the connection. If no DUID is found and "dhclient" is the configured dhcp client, the DUID is searched in the system-wide dhclient lease file. If still no DUID is found, or another dhcp client is used, a global and permanent DUID-UUID (RFC 6355) will be generated based on the machine-id. The special values "llt" and "ll" will generate a DUID of type LLT or LL (see RFC 3315) based on the current MAC address of the device. In order to try providing a stable DUID-LLT, the time field will contain a constant timestamp that is used globally (for all profiles) and persisted to disk. The special values "stable-llt", "stable-ll" and "stable-uuid" will generate a DUID of the corresponding type, derived from the connection's stable-id and a per-host unique key. You may want to include the "${DEVICE}" or "${MAC}" specifier in the stable-id, in case this profile gets activated on multiple devices. So, the link-layer address of "stable-ll" and "stable-llt" will be a generated address derived from the stable id. The DUID-LLT time value in the "stable-llt" option will be picked among a static timespan of three years (the upper bound of the interval is the same constant timestamp used in "llt"). When the property is unset, the global value provided for "ipv6.dhcp-duid" is used. If no global value is provided, the default "lease" value is assumed.dhcp-hostnamestringIf the "dhcp-send-hostname" property is TRUE, then the specified name will be sent to the DHCP server when acquiring a lease. This property and "dhcp-fqdn" are mutually exclusive and cannot be set at the same time.dhcp-hostname-flagsuint320Flags for the DHCP hostname and FQDN. Currently, this property only includes flags to control the FQDN flags set in the DHCP FQDN option. Supported FQDN flags are NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1), NM_DHCP_HOSTNAME_FLAG_FQDN_ENCODED (0x2) and NM_DHCP_HOSTNAME_FLAG_FQDN_NO_UPDATE (0x4). When no FQDN flag is set and NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS (0x8) is set, the DHCP FQDN option will contain no flag. Otherwise, if no FQDN flag is set and NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS (0x8) is not set, the standard FQDN flags are set in the request: NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1), NM_DHCP_HOSTNAME_FLAG_FQDN_ENCODED (0x2) for IPv4 and NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE (0x1) for IPv6. When this property is set to the default value NM_DHCP_HOSTNAME_FLAG_NONE (0x0), a global default is looked up in NetworkManager configuration. If that value is unset or also NM_DHCP_HOSTNAME_FLAG_NONE (0x0), then the standard FQDN flags described above are sent in the DHCP requests.dhcp-iaidstringA string containing the "Identity Association Identifier" (IAID) used by the DHCP client. The property is a 32-bit decimal value or a special value among "mac", "perm-mac", "ifname" and "stable". When set to "mac" (or "perm-mac"), the last 4 bytes of the current (or permanent) MAC address are used as IAID. When set to "ifname", the IAID is computed by hashing the interface name. The special value "stable" can be used to generate an IAID based on the stable-id (see connection.stable-id), a per-host key and the interface name. When the property is unset, the value from global configuration is used; if no global default is set then the IAID is assumed to be "ifname". Note that at the moment this property is ignored for IPv6 by dhclient, which always derives the IAID from the MAC address.dhcp-reject-serversarray of stringArray of servers from which DHCP offers must be rejected. This property is useful to avoid getting a lease from misconfigured or rogue servers. For DHCPv4, each element must be an IPv4 address, optionally followed by a slash and a prefix length (e.g. "192.168.122.0/24"). This property is currently not implemented for DHCPv6.dhcp-send-hostnamebooleanTRUEIf TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some DHCP servers use this hostname to update DNS databases, essentially providing a static hostname for the computer. If the "dhcp-hostname" property is NULL and this property is TRUE, the current persistent hostname of the computer is sent.dhcp-timeoutint320A timeout for a DHCP transaction in seconds. If zero (the default), a globally configured default is used. If still unspecified, a device specific timeout is used (usually 45 seconds). Set to 2147483647 (MAXINT32) for infinity.dnsarray of byte arrayArray of IP addresses of DNS servers (in network byte order)dns-optionsarray of stringArray of DNS options as described in man 5 resolv.conf. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties. The currently supported options are "attempts", "debug", "edns0", "inet6", "ip6-bytestring", "ip6-dotint", "ndots", "no-check-names", "no-ip6-dotint", "no-reload", "no-tld-query", "rotate", "single-request", "single-request-reopen", "timeout", "trust-ad", "use-vc". The "trust-ad" setting is only honored if the profile contributes name servers to resolv.conf, and if all contributing profiles have "trust-ad" enabled.dns-priorityint320DNS servers priority. The relative priority for DNS servers specified by this setting. A lower numerical value is better (higher priority). Negative values have the special effect of excluding other configurations with a greater numerical priority value; so in presence of at least one negative priority, only DNS servers from connections with the lowest priority value will be used. To avoid all DNS leaks, set the priority of the profile that should be used to the most negative value of all active connections profiles. Zero selects a globally configured default value. If the latter is missing or zero too, it defaults to 50 for VPNs (including WireGuard) and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. When multiple devices have configurations with the same priority, VPNs will be considered first, then devices with the best (lowest metric) default route and then all other devices. When using dns=default, servers with higher priority will be on top of resolv.conf. To prioritize a given server over another one within the same connection, just specify them in the desired order. Note that commonly the resolver tries name servers in /etc/resolv.conf in the order listed, proceeding with the next server in the list on failure. See for example the "rotate" option of the dns-options setting. If there are any negative DNS priorities, then only name servers from the devices with that lowest priority will be considered. When using a DNS resolver that supports Conditional Forwarding or Split DNS (with dns=dnsmasq or dns=systemd-resolved settings), each connection is used to query domains in its search list. The search domains determine which name servers to ask, and the DNS priority is used to prioritize name servers based on the domain. Queries for domains not present in any search list are routed through connections having the '~.' special wildcard domain, which is added automatically to connections with the default route (or can be added manually). When multiple connections specify the same domain, the one with the best priority (lowest numerical value) wins. If a sub domain is configured on another interface it will be accepted regardless the priority, unless parent domain on the other interface has a negative priority, which causes the sub domain to be shadowed. With Split DNS one can avoid undesired DNS leaks by properly configuring DNS priorities and the search domains, so that only name servers of the desired interface are configured.dns-searcharray of stringArray of DNS search domains. Domains starting with a tilde ('~') are considered 'routing' domains and are used only to decide the interface over which a query must be forwarded; they are not used to complete unqualified host names. When using a DNS plugin that supports Conditional Forwarding or Split DNS, then the search domains specify which name servers to query. This makes the behavior different from running with plain /etc/resolv.conf. For more information see also the dns-priority setting.gatewaystringThe gateway associated with this configuration. This is only meaningful if "addresses" is also set. The gateway's main purpose is to control the next hop of the standard default route on the device. Hence, the gateway property conflicts with "never-default" and will be automatically dropped if the IP configuration is set to never-default. As an alternative to set the gateway, configure a static default route with /0 as prefix length.ignore-auto-dnsbooleanFALSEWhen "method" is set to "auto" and this property to TRUE, automatically configured name servers and search domains are ignored and only name servers and search domains specified in the "dns" and "dns-search" properties, if any, are used.ignore-auto-routesbooleanFALSEWhen "method" is set to "auto" and this property to TRUE, automatically configured routes are ignored and only routes specified in the "routes" property, if any, are used.ip6-privacyNMSettingIP6ConfigPrivacy (int32)Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: -1: unknown, 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses). Having a per-connection setting set to "-1" (unknown) means fallback to global configuration "ipv6.ip6-privacy". If also global configuration is unspecified or set to "-1", fallback to read "/proc/sys/net/ipv6/conf/default/use_tempaddr". Note that this setting is distinct from the Stable Privacy addresses that can be enabled with the "addr-gen-mode" property's "stable-privacy" setting as another way of avoiding host tracking with IPv6 addresses.may-failbooleanTRUEIf TRUE, allow overall network configuration to proceed even if the configuration specified by this property times out. Note that at least one IP configuration must succeed or overall network configuration will still fail. For example, in IPv6-only networks, setting this property to TRUE on the NMSettingIP4Config allows the overall network configuration to succeed if IPv4 configuration fails but IPv6 configuration completes successfully.methodstringIP configuration method. NMSettingIP4Config and NMSettingIP6Config both support "disabled", "auto", "manual", and "link-local". See the subclass-specific documentation for other values. In general, for the "auto" method, properties such as "dns" and "routes" specify information that is added on to the information returned from automatic configuration. The "ignore-auto-routes" and "ignore-auto-dns" properties modify this behavior. For methods that imply no upstream network, such as "shared" or "link-local", these properties must be empty. For IPv4 method "shared", the IP subnet can be configured by adding one manual IPv4 address or otherwise 10.42.x.0/24 is chosen. Note that the shared method must be configured on the interface which shares the internet to a subnet, not on the uplink which is shared.never-defaultbooleanFALSEIf TRUE, this connection will never be the default connection for this IP type, meaning it will never be assigned the default route by NetworkManager.ra-timeoutint320A timeout for waiting Router Advertisements in seconds. If zero (the default), a globally configured default is used. If still unspecified, the timeout depends on the sysctl settings of the device. Set to 2147483647 (MAXINT32) for infinity.route-dataarray of vardictArray of IPv6 routes. Each route dictionary contains at least 'dest' and 'prefix' entries, containing the destination IP address as a string, and the prefix length as a uint32. Most routes will also have a 'next-hop' entry, containing the next hop IP address as a string. If the route has a 'metric' entry (containing a uint32), that will be used as the metric for the route (otherwise NM will pick a default value appropriate to the device). Additional attributes may also exist on some routes.route-metricint64-1The default metric for routes that don't explicitly specify a metric. The default value -1 means that the metric is chosen automatically based on the device type. The metric applies to dynamic routes, manual (static) routes that don't have an explicit metric setting, address prefix routes, and the default route. Note that for IPv6, the kernel accepts zero (0) but coerces it to 1024 (user default). Hence, setting this property to zero effectively mean setting it to 1024. For IPv4, zero is a regular value for the metric.route-tableuint320Enable policy routing (source routing) and set the routing table used when adding routes. This affects all routes, including device-routes, IPv4LL, DHCP, SLAAC, default-routes and static routes. But note that static routes can individually overwrite the setting by explicitly specifying a non-zero routing table. If the table setting is left at zero, it is eligible to be overwritten via global configuration. If the property is zero even after applying the global configuration value, policy routing is disabled for the address family of this connection. Policy routing disabled means that NetworkManager will add all routes to the main table (except static routes that explicitly configure a different table). Additionally, NetworkManager will not delete any extraneous routes from tables except the main table. This is to preserve backward compatibility for users who manage routing tables outside of NetworkManager.routesarray of legacy IPv6 route struct (a(ayuayu))Deprecated in favor of the 'route-data' property, but this can be used for backward-compatibility with older daemons. Note that if you send this property the daemon will ignore 'route-data'. Array of IPv6 route structures. Each IPv6 route structure is composed of an IPv6 address, a prefix length (1 - 128), an IPv6 next hop address (which may be zeroed out if there is no next hop), and a metric. If the metric is 0, NM will choose an appropriate default metric for the device.tokenstringConfigure the token for draft-chown-6man-tokenised-ipv6-identifiers-02 IPv6 tokenized interface identifiers. Useful with eui64 addr-gen-mode.ip-tunnel settingIP Tunneling Settings.Key NameValue TypeDefault ValueValue Descriptionencapsulation-limituint320How many additional levels of encapsulation are permitted to be prepended to packets. This property applies only to IPv6 tunnels.flagsuint320Tunnel flags. Currently, the following values are supported: NM_IP_TUNNEL_FLAG_IP6_IGN_ENCAP_LIMIT (0x1), NM_IP_TUNNEL_FLAG_IP6_USE_ORIG_TCLASS (0x2), NM_IP_TUNNEL_FLAG_IP6_USE_ORIG_FLOWLABEL (0x4), NM_IP_TUNNEL_FLAG_IP6_MIP6_DEV (0x8), NM_IP_TUNNEL_FLAG_IP6_RCV_DSCP_COPY (0x10), NM_IP_TUNNEL_FLAG_IP6_USE_ORIG_FWMARK (0x20). They are valid only for IPv6 tunnels.flow-labeluint320The flow label to assign to tunnel packets. This property applies only to IPv6 tunnels.input-keystringThe key used for tunnel input packets; the property is valid only for certain tunnel modes (GRE, IP6GRE). If empty, no key is used.localstringThe local endpoint of the tunnel; the value can be empty, otherwise it must contain an IPv4 or IPv6 address.modeuint320The tunneling mode, for example NM_IP_TUNNEL_MODE_IPIP (1) or NM_IP_TUNNEL_MODE_GRE (2).mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple fragments.output-keystringThe key used for tunnel output packets; the property is valid only for certain tunnel modes (GRE, IP6GRE). If empty, no key is used.parentstringIf given, specifies the parent interface name or parent connection UUID the new device will be bound to so that tunneled packets will only be routed via that interface.path-mtu-discoverybooleanTRUEWhether to enable Path MTU Discovery on this tunnel.remotestringThe remote endpoint of the tunnel; the value must contain an IPv4 or IPv6 address.tosuint320The type of service (IPv4) or traffic class (IPv6) field to be set on tunneled packets.ttluint320The TTL to assign to tunneled packets. 0 is a special value meaning that packets inherit the TTL value.macsec settingMACSec Settings.Key NameValue TypeDefault ValueValue DescriptionencryptbooleanTRUEWhether the transmitted traffic must be encrypted.mka-cakstringThe pre-shared CAK (Connectivity Association Key) for MACsec Key Agreement.mka-cak-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "mka-cak" property. (see for flag values)mka-cknstringThe pre-shared CKN (Connectivity-association Key Name) for MACsec Key Agreement.modeint320Specifies how the CAK (Connectivity Association Key) for MKA (MACsec Key Agreement) is obtained.parentstringIf given, specifies the parent interface name or parent connection UUID from which this MACSEC interface should be created. If this property is not specified, the connection must contain an "802-3-ethernet" setting with a "mac-address" property.portint321The port component of the SCI (Secure Channel Identifier), between 1 and 65534.send-scibooleanTRUESpecifies whether the SCI (Secure Channel Identifier) is included in every packet.validationint322Specifies the validation mode for incoming frames.macvlan settingMAC VLAN Settings.Key NameValue TypeDefault ValueValue Descriptionmodeuint320The macvlan mode, which specifies the communication mechanism between multiple macvlans on the same lower device.parentstringIf given, specifies the parent interface name or parent connection UUID from which this MAC-VLAN interface should be created. If this property is not specified, the connection must contain an "802-3-ethernet" setting with a "mac-address" property.promiscuousbooleanTRUEWhether the interface should be put in promiscuous mode.tapbooleanFALSEWhether the interface should be a MACVTAP.match settingMatch settings.Key NameValue TypeDefault ValueValue Descriptiondriverarray of stringA list of driver names to match. Each element is a shell wildcard pattern. See NMSettingMatch:interface-name for how special characters '|', '&', '!' and '\\' are used for optional and mandatory matches and inverting the pattern.interface-namearray of stringA list of interface names to match. Each element is a shell wildcard pattern. An element can be prefixed with a pipe symbol (|) or an ampersand (&). The former means that the element is optional and the latter means that it is mandatory. If there are any optional elements, than the match evaluates to true if at least one of the optional element matches (logical OR). If there are any mandatory elements, then they all must match (logical AND). By default, an element is optional. This means that an element "foo" behaves the same as "|foo". An element can also be inverted with exclamation mark (!) between the pipe symbol (or the ampersand) and before the pattern. Note that "!foo" is a shortcut for the mandatory match "&!foo". Finally, a backslash can be used at the beginning of the element (after the optional special characters) to escape the start of the pattern. For example, "&\\!a" is an mandatory match for literally "!a".kernel-command-linearray of stringA list of kernel command line arguments to match. This may be used to check whether a specific kernel command line option is set (or if prefixed with the exclamation mark unset). The argument must either be a single word, or an assignment (i.e. two words, separated "="). In the former case the kernel command line is searched for the word appearing as is, or as left hand side of an assignment. In the latter case, the exact assignment is looked for with right and left hand side matching. See NMSettingMatch:interface-name for how special characters '|', '&', '!' and '\\' are used for optional and mandatory matches and inverting the pattern.patharray of stringA list of paths to match against the ID_PATH udev property of devices. ID_PATH represents the topological persistent path of a device. It typically contains a subsystem string (pci, usb, platform, etc.) and a subsystem-specific identifier. For PCI devices the path has the form "pci-$domain:$bus:$device.$function", where each variable is an hexadecimal value; for example "pci-0000:0a:00.0". The path of a device can be obtained with "udevadm info /sys/class/net/$dev | grep ID_PATH=" or by looking at the "path" property exported by NetworkManager ("nmcli -f general.path device show $dev"). Each element of the list is a shell wildcard pattern. See NMSettingMatch:interface-name for how special characters '|', '&', '!' and '\\' are used for optional and mandatory matches and inverting the pattern.802-11-olpc-mesh settingOLPC Wireless Mesh Settings.Key NameValue TypeDefault ValueValue Descriptionchanneluint320Channel on which the mesh network to join is located.dhcp-anycast-addressbyte arrayAnycast DHCP MAC address used when requesting an IP address via DHCP. The specific anycast address used determines which DHCP server class answers the request.ssidbyte arraySSID of the mesh network to join.ovs-bridge settingOvsBridge Link Settings.Key NameValue TypeDefault ValueValue Descriptiondatapath-typestringThe data path type. One of "system", "netdev" or empty.fail-modestringThe bridge failure mode. One of "secure", "standalone" or empty.mcast-snooping-enablebooleanFALSEEnable or disable multicast snooping.rstp-enablebooleanFALSEEnable or disable RSTP.stp-enablebooleanFALSEEnable or disable STP.ovs-dpdk settingOvsDpdk Link Settings.Key NameValue TypeDefault ValueValue DescriptiondevargsstringOpen vSwitch DPDK device arguments.ovs-interface settingOpen vSwitch Interface Settings.Key NameValue TypeDefault ValueValue DescriptiontypestringThe interface type. Either "internal", "system", "patch", "dpdk", or empty.ovs-patch settingOvsPatch Link Settings.Key NameValue TypeDefault ValueValue DescriptionpeerstringSpecifies the name of the interface for the other side of the patch. The patch on the other side must also set this interface as peer.ovs-port settingOvsPort Link Settings.Key NameValue TypeDefault ValueValue Descriptionbond-downdelayuint320The time port must be inactive in order to be considered down.bond-modestringBonding mode. One of "active-backup", "balance-slb", or "balance-tcp".bond-updelayuint320The time port must be active before it starts forwarding traffic.lacpstringLACP mode. One of "active", "off", or "passive".taguint320The VLAN tag in the range 0-4095.vlan-modestringThe VLAN mode. One of "access", "native-tagged", "native-untagged", "trunk" or unset.ppp settingPoint-to-Point Protocol Settings.Key NameValue TypeDefault ValueValue Descriptionbauduint320If non-zero, instruct pppd to set the serial port to the specified baudrate. This value should normally be left as 0 to automatically choose the speed.crtsctsbooleanFALSEIf TRUE, specify that pppd should set the serial port to use hardware flow control with RTS and CTS signals. This value should normally be set to FALSE.lcp-echo-failureuint320If non-zero, instruct pppd to presume the connection to the peer has failed if the specified number of LCP echo-requests go unanswered by the peer. The "lcp-echo-interval" property must also be set to a non-zero value if this property is used.lcp-echo-intervaluint320If non-zero, instruct pppd to send an LCP echo-request frame to the peer every n seconds (where n is the specified value). Note that some PPP peers will respond to echo requests and some will not, and it is not possible to autodetect this.mppe-statefulbooleanFALSEIf TRUE, stateful MPPE is used. See pppd documentation for more information on stateful MPPE.mruuint320If non-zero, instruct pppd to request that the peer send packets no larger than the specified size. If non-zero, the MRU should be between 128 and 16384.mtuuint320If non-zero, instruct pppd to send packets no larger than the specified size.no-vj-compbooleanFALSEIf TRUE, Van Jacobsen TCP header compression will not be requested.noauthbooleanTRUEIf TRUE, do not require the other side (usually the PPP server) to authenticate itself to the client. If FALSE, require authentication from the remote side. In almost all cases, this should be TRUE.nobsdcompbooleanFALSEIf TRUE, BSD compression will not be requested.nodeflatebooleanFALSEIf TRUE, "deflate" compression will not be requested.refuse-chapbooleanFALSEIf TRUE, the CHAP authentication method will not be used.refuse-eapbooleanFALSEIf TRUE, the EAP authentication method will not be used.refuse-mschapbooleanFALSEIf TRUE, the MSCHAP authentication method will not be used.refuse-mschapv2booleanFALSEIf TRUE, the MSCHAPv2 authentication method will not be used.refuse-papbooleanFALSEIf TRUE, the PAP authentication method will not be used.require-mppebooleanFALSEIf TRUE, MPPE (Microsoft Point-to-Point Encryption) will be required for the PPP session. If either 64-bit or 128-bit MPPE is not available the session will fail. Note that MPPE is not used on mobile broadband connections.require-mppe-128booleanFALSEIf TRUE, 128-bit MPPE (Microsoft Point-to-Point Encryption) will be required for the PPP session, and the "require-mppe" property must also be set to TRUE. If 128-bit MPPE is not available the session will fail.pppoe settingPPP-over-Ethernet Settings.Key NameValue TypeDefault ValueValue DescriptionparentstringIf given, specifies the parent interface name on which this PPPoE connection should be created. If this property is not specified, the connection is activated on the interface specified in "interface-name" of NMSettingConnection.passwordstringPassword used to authenticate with the PPPoE service.password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "password" property. (see for flag values)servicestringIf specified, instruct PPPoE to only initiate sessions with access concentrators that provide the specified service. For most providers, this should be left blank. It is only required if there are multiple access concentrators or a specific service is known to be required.usernamestringUsername used to authenticate with the PPPoE service.proxy settingWWW Proxy Settings.Key NameValue TypeDefault ValueValue Descriptionbrowser-onlybooleanFALSEWhether the proxy configuration is for browser only.methodint320Method for proxy configuration, Default is NM_SETTING_PROXY_METHOD_NONE (0)pac-scriptstringPAC script for the connection.pac-urlstringPAC URL for obtaining PAC file.serial settingSerial Link Settings.Key NameValue TypeDefault ValueValue Descriptionbauduint3257600Speed to use for communication over the serial port. Note that this value usually has no effect for mobile broadband modems as they generally ignore speed settings and use the highest available speed.bitsuint328Byte-width of the serial communication. The 8 in "8n1" for example.paritybyteThe connection parity: 69 (ASCII 'E') for even parity, 111 (ASCII 'o') for odd, 110 (ASCII 'n') for none.send-delayuint640Time to delay between each byte sent to the modem, in microseconds.stopbitsuint321Number of stop bits for communication on the serial port. Either 1 or 2. The 1 in "8n1" for example.sriov settingSR-IOV settings.Key NameValue TypeDefault ValueValue Descriptionautoprobe-driversNMTernary (int32)Whether to autoprobe virtual functions by a compatible driver. If set to NM_TERNARY_TRUE (1), the kernel will try to bind VFs to a compatible driver and if this succeeds a new network interface will be instantiated for each VF. If set to NM_TERNARY_FALSE (0), VFs will not be claimed and no network interfaces will be created for them. When set to NM_TERNARY_DEFAULT (-1), the global default is used; in case the global default is unspecified it is assumed to be NM_TERNARY_TRUE (1).total-vfsuint320The total number of virtual functions to create. Note that when the sriov setting is present NetworkManager enforces the number of virtual functions on the interface (also when it is zero) during activation and resets it upon deactivation. To prevent any changes to SR-IOV parameters don't add a sriov setting to the connection.vfsarray of vardictArray of virtual function descriptors. Each VF descriptor is a dictionary mapping attribute names to GVariant values. The 'index' entry is mandatory for each VF. When represented as string a VF is in the form: "INDEX [ATTR=VALUE[ ATTR=VALUE]...]". for example: "2 mac=00:11:22:33:44:55 spoof-check=true". Multiple VFs can be specified using a comma as separator. Currently, the following attributes are supported: mac, spoof-check, trust, min-tx-rate, max-tx-rate, vlans. The "vlans" attribute is represented as a semicolon-separated list of VLAN descriptors, where each descriptor has the form "ID[.PRIORITY[.PROTO]]". PROTO can be either 'q' for 802.1Q (the default) or 'ad' for 802.1ad.tc settingLinux Traffic Control Settings.Key NameValue TypeDefault ValueValue Descriptionqdiscsarray of vardictArray of TC queueing disciplines.tfiltersarray of vardictArray of TC traffic filters.team settingTeaming Settings.Key NameValue TypeDefault ValueValue DescriptionconfigstringThe JSON configuration for the team network interface. The property should contain raw JSON configuration data suitable for teamd, because the value is passed directly to teamd. If not specified, the default configuration is used. See man teamd.conf for the format details.interface-namestringDeprecated in favor of connection.interface-name, but can be used for backward-compatibility with older daemons, to set the team's interface name.link-watchersarray of vardictLink watchers configuration for the connection: each link watcher is defined by a dictionary, whose keys depend upon the selected link watcher. Available link watchers are 'ethtool', 'nsna_ping' and 'arp_ping' and it is specified in the dictionary with the key 'name'. Available keys are: ethtool: 'delay-up', 'delay-down', 'init-wait'; nsna_ping: 'init-wait', 'interval', 'missed-max', 'target-host'; arp_ping: all the ones in nsna_ping and 'source-host', 'validate-active', 'validate-inactive', 'send-always'. See teamd.conf man for more details.mcast-rejoin-countint32-1Corresponds to the teamd mcast_rejoin.count.mcast-rejoin-intervalint32-1Corresponds to the teamd mcast_rejoin.interval.notify-peers-countint32-1Corresponds to the teamd notify_peers.count.notify-peers-intervalint32-1Corresponds to the teamd notify_peers.interval.runnerstringCorresponds to the teamd runner.name. Permitted values are: "roundrobin", "broadcast", "activebackup", "loadbalance", "lacp", "random".runner-activebooleanTRUECorresponds to the teamd runner.active.runner-agg-select-policystringCorresponds to the teamd runner.agg_select_policy.runner-fast-ratebooleanFALSECorresponds to the teamd runner.fast_rate.runner-hwaddr-policystringCorresponds to the teamd runner.hwaddr_policy.runner-min-portsint32-1Corresponds to the teamd runner.min_ports.runner-sys-prioint32-1Corresponds to the teamd runner.sys_prio.runner-tx-balancerstringCorresponds to the teamd runner.tx_balancer.name.runner-tx-balancer-intervalint32-1Corresponds to the teamd runner.tx_balancer.interval.runner-tx-hasharray of stringCorresponds to the teamd runner.tx_hash.team-port settingTeam Port Settings.Key NameValue TypeDefault ValueValue DescriptionconfigstringThe JSON configuration for the team port. The property should contain raw JSON configuration data suitable for teamd, because the value is passed directly to teamd. If not specified, the default configuration is used. See man teamd.conf for the format details.lacp-keyint32-1Corresponds to the teamd ports.PORTIFNAME.lacp_key.lacp-prioint32-1Corresponds to the teamd ports.PORTIFNAME.lacp_prio.link-watchersarray of vardictLink watchers configuration for the connection: each link watcher is defined by a dictionary, whose keys depend upon the selected link watcher. Available link watchers are 'ethtool', 'nsna_ping' and 'arp_ping' and it is specified in the dictionary with the key 'name'. Available keys are: ethtool: 'delay-up', 'delay-down', 'init-wait'; nsna_ping: 'init-wait', 'interval', 'missed-max', 'target-host'; arp_ping: all the ones in nsna_ping and 'source-host', 'validate-active', 'validate-inactive', 'send-always'. See teamd.conf man for more details.prioint320Corresponds to the teamd ports.PORTIFNAME.prio.queue-idint32-1Corresponds to the teamd ports.PORTIFNAME.queue_id. When set to -1 means the parameter is skipped from the json config.stickybooleanFALSECorresponds to the teamd ports.PORTIFNAME.sticky.tun settingTunnel Settings.Key NameValue TypeDefault ValueValue DescriptiongroupstringThe group ID which will own the device. If set to NULL everyone will be able to use the device.modeuint321The operating mode of the virtual device. Allowed values are NM_SETTING_TUN_MODE_TUN (1) to create a layer 3 device and NM_SETTING_TUN_MODE_TAP (2) to create an Ethernet-like layer 2 one.multi-queuebooleanFALSEIf the property is set to TRUE, the interface will support multiple file descriptors (queues) to parallelize packet sending or receiving. Otherwise, the interface will only support a single queue.ownerstringThe user ID which will own the device. If set to NULL everyone will be able to use the device.pibooleanFALSEIf TRUE the interface will prepend a 4 byte header describing the physical interface to the packets.vnet-hdrbooleanFALSEIf TRUE the IFF_VNET_HDR the tunnel packets will include a virtio network header.user settingGeneral User Profile Settings.Key NameValue TypeDefault ValueValue Descriptiondatadict of string to string{}A dictionary of key/value pairs with user data. This data is ignored by NetworkManager and can be used at the users discretion. The keys only support a strict ascii format, but the values can be arbitrary UTF8 strings up to a certain length.vlan settingVLAN Settings.Key NameValue TypeDefault ValueValue Descriptionegress-priority-maparray of stringFor outgoing packets, a list of mappings from Linux SKB priorities to 802.1p priorities. The mapping is given in the format "from:to" where both "from" and "to" are unsigned integers, ie "7:3".flagsNMVlanFlags (uint32)One or more flags which control the behavior and features of the VLAN interface. Flags include NM_VLAN_FLAG_REORDER_HEADERS (0x1) (reordering of output packet headers), NM_VLAN_FLAG_GVRP (0x2) (use of the GVRP protocol), and NM_VLAN_FLAG_LOOSE_BINDING (0x4) (loose binding of the interface to its master device's operating state). NM_VLAN_FLAG_MVRP (0x8) (use of the MVRP protocol). The default value of this property is NM_VLAN_FLAG_REORDER_HEADERS, but it used to be 0. To preserve backward compatibility, the default-value in the D-Bus API continues to be 0 and a missing property on D-Bus is still considered as 0.iduint320The VLAN identifier that the interface created by this connection should be assigned. The valid range is from 0 to 4094, without the reserved id 4095.ingress-priority-maparray of stringFor incoming packets, a list of mappings from 802.1p priorities to Linux SKB priorities. The mapping is given in the format "from:to" where both "from" and "to" are unsigned integers, ie "7:3".interface-namestringDeprecated in favor of connection.interface-name, but can be used for backward-compatibility with older daemons, to set the vlan's interface name.parentstringIf given, specifies the parent interface name or parent connection UUID from which this VLAN interface should be created. If this property is not specified, the connection must contain an "802-3-ethernet" setting with a "mac-address" property.vpn settingVPN Settings.Key NameValue TypeDefault ValueValue Descriptiondatadict of string to string{}Dictionary of key/value pairs of VPN plugin specific data. Both keys and values must be strings.persistentbooleanFALSEIf the VPN service supports persistence, and this property is TRUE, the VPN will attempt to stay connected across link changes and outages, until explicitly disconnected.secretsdict of string to string{}Dictionary of key/value pairs of VPN plugin specific secrets like passwords or private keys. Both keys and values must be strings.service-typestringD-Bus service name of the VPN plugin that this setting uses to connect to its network. i.e. org.freedesktop.NetworkManager.vpnc for the vpnc plugin.timeoutuint320Timeout for the VPN service to establish the connection. Some services may take quite a long time to connect. Value of 0 means a default timeout, which is 60 seconds (unless overridden by vpn.timeout in configuration file). Values greater than zero mean timeout in seconds.user-namestringIf the VPN connection requires a user name for authentication, that name should be provided here. If the connection is available to more than one user, and the VPN requires each user to supply a different name, then leave this property empty. If this property is empty, NetworkManager will automatically supply the username of the user which requested the VPN connection.vrf settingVRF settings.Key NameValue TypeDefault ValueValue Descriptiontableuint320The routing table for this VRF.vxlan settingVXLAN Settings.Key NameValue TypeDefault ValueValue Descriptionageinguint32300Specifies the lifetime in seconds of FDB entries learnt by the kernel.destination-portuint328472Specifies the UDP destination port to communicate to the remote VXLAN tunnel endpoint.iduint320Specifies the VXLAN Network Identifier (or VXLAN Segment Identifier) to use.l2-missbooleanFALSESpecifies whether netlink LL ADDR miss notifications are generated.l3-missbooleanFALSESpecifies whether netlink IP ADDR miss notifications are generated.learningbooleanTRUESpecifies whether unknown source link layer addresses and IP addresses are entered into the VXLAN device forwarding database.limituint320Specifies the maximum number of FDB entries. A value of zero means that the kernel will store unlimited entries.localstringIf given, specifies the source IP address to use in outgoing packets.parentstringIf given, specifies the parent interface name or parent connection UUID.proxybooleanFALSESpecifies whether ARP proxy is turned on.remotestringSpecifies the unicast destination IP address to use in outgoing packets when the destination link layer address is not known in the VXLAN device forwarding database, or the multicast IP address to join.rscbooleanFALSESpecifies whether route short circuit is turned on.source-port-maxuint320Specifies the maximum UDP source port to communicate to the remote VXLAN tunnel endpoint.source-port-minuint320Specifies the minimum UDP source port to communicate to the remote VXLAN tunnel endpoint.tosuint320Specifies the TOS value to use in outgoing packets.ttluint320Specifies the time-to-live value to use in outgoing packets.wifi-p2p settingWi-Fi P2P Settings.Key NameValue TypeDefault ValueValue DescriptionpeerstringThe P2P device that should be connected to. Currently, this is the only way to create or join a group.wfd-iesbyte arrayThe Wi-Fi Display (WFD) Information Elements (IEs) to set. Wi-Fi Display requires a protocol specific information element to be set in certain Wi-Fi frames. These can be specified here for the purpose of establishing a connection. This setting is only useful when implementing a Wi-Fi Display client.wps-methoduint320Flags indicating which mode of WPS is to be used. There's little point in changing the default setting as NetworkManager will automatically determine the best method to use.wimax settingWiMax Settings.Key NameValue TypeDefault ValueValue Descriptionmac-addressbyte arrayIf specified, this connection will only apply to the WiMAX device whose MAC address matches. This property does not change the MAC address of the device (known as MAC spoofing). Deprecated: 1network-namestringNetwork Service Provider (NSP) name of the WiMAX network this connection should use. Deprecated: 1802-3-ethernet settingWired Ethernet Settings.Key NameValue TypeDefault ValueValue Descriptionassigned-mac-addressstringThe new field for the cloned MAC address. It can be either a hardware address in ASCII representation, or one of the special values "preserve", "permanent", "random" or "stable". This field replaces the deprecated "cloned-mac-address" on D-Bus, which can only contain explicit hardware addresses. Note that this property only exists in D-Bus API. libnm and nmcli continue to call this property "cloned-mac-address".auto-negotiatebooleanFALSEWhen TRUE, enforce auto-negotiation of speed and duplex mode. If "speed" and "duplex" properties are both specified, only that single mode will be advertised and accepted during the link auto-negotiation process: this works only for BASE-T 802.3 specifications and is useful for enforcing gigabits modes, as in these cases link negotiation is mandatory. When FALSE, "speed" and "duplex" properties should be both set or link configuration will be skipped.cloned-mac-addressbyte arrayThis D-Bus field is deprecated in favor of "assigned-mac-address" which is more flexible and allows specifying special variants like "random". For libnm and nmcli, this field is called "cloned-mac-address".duplexstringWhen a value is set, either "half" or "full", configures the device to use the specified duplex mode. If "auto-negotiate" is "yes" the specified duplex mode will be the only one advertised during link negotiation: this works only for BASE-T 802.3 specifications and is useful for enforcing gigabits modes, as in these cases link negotiation is mandatory. If the value is unset (the default), the link configuration will be either skipped (if "auto-negotiate" is "no", the default) or will be auto-negotiated (if "auto-negotiate" is "yes") and the local device will advertise all the supported duplex modes. Must be set together with the "speed" property if specified. Before specifying a duplex mode be sure your device supports it.generate-mac-address-maskstringWith "cloned-mac-address" setting "random" or "stable", by default all bits of the MAC address are scrambled and a locally-administered, unicast MAC address is created. This property allows to specify that certain bits are fixed. Note that the least significant bit of the first MAC address will always be unset to create a unicast MAC address. If the property is NULL, it is eligible to be overwritten by a default connection setting. If the value is still NULL or an empty string, the default is to create a locally-administered, unicast MAC address. If the value contains one MAC address, this address is used as mask. The set bits of the mask are to be filled with the current MAC address of the device, while the unset bits are subject to randomization. Setting "FE:FF:FF:00:00:00" means to preserve the OUI of the current MAC address and only randomize the lower 3 bytes using the "random" or "stable" algorithm. If the value contains one additional MAC address after the mask, this address is used instead of the current MAC address to fill the bits that shall not be randomized. For example, a value of "FE:FF:FF:00:00:00 68:F7:28:00:00:00" will set the OUI of the MAC address to 68:F7:28, while the lower bits are randomized. A value of "02:00:00:00:00:00 00:00:00:00:00:00" will create a fully scrambled globally-administered, burned-in MAC address. If the value contains more than one additional MAC addresses, one of them is chosen randomly. For example, "02:00:00:00:00:00 00:00:00:00:00:00 02:00:00:00:00:00" will create a fully scrambled MAC address, randomly locally or globally administered.mac-addressbyte arrayIf specified, this connection will only apply to the Ethernet device whose permanent MAC address matches. This property does not change the MAC address of the device (i.e. MAC spoofing).mac-address-blacklistarray of stringIf specified, this connection will never apply to the Ethernet device whose permanent MAC address matches an address in the list. Each MAC address is in the standard hex-digits-and-colons notation (00:11:22:33:44:55).mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple Ethernet frames.portstringSpecific port type to use if the device supports multiple attachment methods. One of "tp" (Twisted Pair), "aui" (Attachment Unit Interface), "bnc" (Thin Ethernet) or "mii" (Media Independent Interface). If the device supports only one port type, this setting is ignored.s390-nettypestrings390 network device type; one of "qeth", "lcs", or "ctc", representing the different types of virtual network devices available on s390 systems.s390-optionsdict of string to string{}Dictionary of key/value pairs of s390-specific device options. Both keys and values must be strings. Allowed keys include "portno", "layer2", "portname", "protocol", among others. Key names must contain only alphanumeric characters (ie, [a-zA-Z0-9]).s390-subchannelsarray of stringIdentifies specific subchannels that this network device uses for communication with z/VM or s390 host. Like the "mac-address" property for non-z/VM devices, this property can be used to ensure this connection only applies to the network device that uses these subchannels. The list should contain exactly 3 strings, and each string may only be composed of hexadecimal characters and the period (.) character.speeduint320When a value greater than 0 is set, configures the device to use the specified speed. If "auto-negotiate" is "yes" the specified speed will be the only one advertised during link negotiation: this works only for BASE-T 802.3 specifications and is useful for enforcing gigabit speeds, as in this case link negotiation is mandatory. If the value is unset (0, the default), the link configuration will be either skipped (if "auto-negotiate" is "no", the default) or will be auto-negotiated (if "auto-negotiate" is "yes") and the local device will advertise all the supported speeds. In Mbit/s, ie 100 == 100Mbit/s. Must be set together with the "duplex" property when non-zero. Before specifying a speed value be sure your device supports it.wake-on-lanuint321The NMSettingWiredWakeOnLan options to enable. Not all devices support all options. May be any combination of NM_SETTING_WIRED_WAKE_ON_LAN_PHY (0x2), NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST (0x4), NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST (0x8), NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST (0x10), NM_SETTING_WIRED_WAKE_ON_LAN_ARP (0x20), NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC (0x40) or the special values NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT (0x1) (to use global settings) and NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE (0x8000) (to disable management of Wake-on-LAN in NetworkManager).wake-on-lan-passwordstringIf specified, the password used with magic-packet-based Wake-on-LAN, represented as an Ethernet MAC address. If NULL, no password will be required.wireguard settingWireGuard Settings.Key NameValue TypeDefault ValueValue Descriptionfwmarkuint320The use of fwmark is optional and is by default off. Setting it to 0 disables it. Otherwise, it is a 32-bit fwmark for outgoing packets. Note that "ip4-auto-default-route" or "ip6-auto-default-route" enabled, implies to automatically choose a fwmark.ip4-auto-default-routeNMTernary (int32)Whether to enable special handling of the IPv4 default route. If enabled, the IPv4 default route from wireguard.peer-routes will be placed to a dedicated routing-table and two policy routing rules will be added. The fwmark number is also used as routing-table for the default-route, and if fwmark is zero, an unused fwmark/table is chosen automatically. This corresponds to what wg-quick does with Table=auto and what WireGuard calls "Improved Rule-based Routing". Note that for this automatism to work, you usually don't want to set ipv4.gateway, because that will result in a conflicting default route. Leaving this at the default will enable this option automatically if ipv4.never-default is not set and there are any peers that use a default-route as allowed-ips.ip6-auto-default-routeNMTernary (int32)Like ip4-auto-default-route, but for the IPv6 default route.listen-portuint320The listen-port. If listen-port is not specified, the port will be chosen randomly when the interface comes up.mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple fragments. If zero a default MTU is used. Note that contrary to wg-quick's MTU setting, this does not take into account the current routes at the time of activation.peer-routesbooleanTRUEWhether to automatically add routes for the AllowedIPs ranges of the peers. If TRUE (the default), NetworkManager will automatically add routes in the routing tables according to ipv4.route-table and ipv6.route-table. Usually you want this automatism enabled. If FALSE, no such routes are added automatically. In this case, the user may want to configure static routes in ipv4.routes and ipv6.routes, respectively. Note that if the peer's AllowedIPs is "0.0.0.0/0" or "::/0" and the profile's ipv4.never-default or ipv6.never-default setting is enabled, the peer route for this peer won't be added automatically.peersarray of 'a{sv}'Array of dictionaries for the WireGuard peers.private-keystringThe 256 bit private-key in base64 encoding.private-key-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "private-key" property. (see for flag values)802-11-wireless settingWi-Fi Settings.Key NameValue TypeDefault ValueValue Descriptionap-isolationNMTernary (int32)Configures AP isolation, which prevents communication between wireless devices connected to this AP. This property can be set to a value different from NM_TERNARY_DEFAULT (-1) only when the interface is configured in AP mode. If set to NM_TERNARY_TRUE (1), devices are not able to communicate with each other. This increases security because it protects devices against attacks from other clients in the network. At the same time, it prevents devices to access resources on the same wireless networks as file shares, printers, etc. If set to NM_TERNARY_FALSE (0), devices can talk to each other. When set to NM_TERNARY_DEFAULT (-1), the global default is used; in case the global default is unspecified it is assumed to be NM_TERNARY_FALSE (0).assigned-mac-addressstringThe new field for the cloned MAC address. It can be either a hardware address in ASCII representation, or one of the special values "preserve", "permanent", "random" or "stable". This field replaces the deprecated "cloned-mac-address" on D-Bus, which can only contain explicit hardware addresses. Note that this property only exists in D-Bus API. libnm and nmcli continue to call this property "cloned-mac-address".bandstring802.11 frequency band of the network. One of "a" for 5GHz 802.11a or "bg" for 2.4GHz 802.11. This will lock associations to the Wi-Fi network to the specific band, i.e. if "a" is specified, the device will not associate with the same network in the 2.4GHz band even if the network's settings are compatible. This setting depends on specific driver capability and may not work with all drivers.bssidbyte arrayIf specified, directs the device to only associate with the given access point. This capability is highly driver dependent and not supported by all devices. Note: this property does not control the BSSID used when creating an Ad-Hoc network and is unlikely to in the future.channeluint320Wireless channel to use for the Wi-Fi connection. The device will only join (or create for Ad-Hoc networks) a Wi-Fi network on the specified channel. Because channel numbers overlap between bands, this property also requires the "band" property to be set.cloned-mac-addressbyte arrayThis D-Bus field is deprecated in favor of "assigned-mac-address" which is more flexible and allows specifying special variants like "random". For libnm and nmcli, this field is called "cloned-mac-address".generate-mac-address-maskstringWith "cloned-mac-address" setting "random" or "stable", by default all bits of the MAC address are scrambled and a locally-administered, unicast MAC address is created. This property allows to specify that certain bits are fixed. Note that the least significant bit of the first MAC address will always be unset to create a unicast MAC address. If the property is NULL, it is eligible to be overwritten by a default connection setting. If the value is still NULL or an empty string, the default is to create a locally-administered, unicast MAC address. If the value contains one MAC address, this address is used as mask. The set bits of the mask are to be filled with the current MAC address of the device, while the unset bits are subject to randomization. Setting "FE:FF:FF:00:00:00" means to preserve the OUI of the current MAC address and only randomize the lower 3 bytes using the "random" or "stable" algorithm. If the value contains one additional MAC address after the mask, this address is used instead of the current MAC address to fill the bits that shall not be randomized. For example, a value of "FE:FF:FF:00:00:00 68:F7:28:00:00:00" will set the OUI of the MAC address to 68:F7:28, while the lower bits are randomized. A value of "02:00:00:00:00:00 00:00:00:00:00:00" will create a fully scrambled globally-administered, burned-in MAC address. If the value contains more than one additional MAC addresses, one of them is chosen randomly. For example, "02:00:00:00:00:00 00:00:00:00:00:00 02:00:00:00:00:00" will create a fully scrambled MAC address, randomly locally or globally administered.hiddenbooleanFALSEIf TRUE, indicates that the network is a non-broadcasting network that hides its SSID. This works both in infrastructure and AP mode. In infrastructure mode, various workarounds are used for a more reliable discovery of hidden networks, such as probe-scanning the SSID. However, these workarounds expose inherent insecurities with hidden SSID networks, and thus hidden SSID networks should be used with caution. In AP mode, the created network does not broadcast its SSID. Note that marking the network as hidden may be a privacy issue for you (in infrastructure mode) or client stations (in AP mode), as the explicit probe-scans are distinctly recognizable on the air.mac-addressbyte arrayIf specified, this connection will only apply to the Wi-Fi device whose permanent MAC address matches. This property does not change the MAC address of the device (i.e. MAC spoofing).mac-address-blacklistarray of stringA list of permanent MAC addresses of Wi-Fi devices to which this connection should never apply. Each MAC address should be given in the standard hex-digits-and-colons notation (eg "00:11:22:33:44:55").mac-address-randomizationuint320One of NM_SETTING_MAC_RANDOMIZATION_DEFAULT (0) (never randomize unless the user has set a global default to randomize and the supplicant supports randomization), NM_SETTING_MAC_RANDOMIZATION_NEVER (1) (never randomize the MAC address), or NM_SETTING_MAC_RANDOMIZATION_ALWAYS (2) (always randomize the MAC address). This property is deprecated for 'cloned-mac-address'. Deprecated: 1modestringWi-Fi network mode; one of "infrastructure", "mesh", "adhoc" or "ap". If blank, infrastructure is assumed.mtuuint320If non-zero, only transmit packets of the specified size or smaller, breaking larger packets up into multiple Ethernet frames.powersaveuint320One of NM_SETTING_WIRELESS_POWERSAVE_DISABLE (2) (disable Wi-Fi power saving), NM_SETTING_WIRELESS_POWERSAVE_ENABLE (3) (enable Wi-Fi power saving), NM_SETTING_WIRELESS_POWERSAVE_IGNORE (1) (don't touch currently configure setting) or NM_SETTING_WIRELESS_POWERSAVE_DEFAULT (0) (use the globally configured value). All other values are reserved.rateuint320If non-zero, directs the device to only use the specified bitrate for communication with the access point. Units are in Kb/s, ie 5500 = 5.5 Mbit/s. This property is highly driver dependent and not all devices support setting a static bitrate.securityThis property is deprecated, but can be set to the value '802-11-wireless-security' when a wireless security setting is also present in the connection dictionary, for compatibility with very old NetworkManager daemons.seen-bssidsarray of stringA list of BSSIDs (each BSSID formatted as a MAC address like "00:11:22:33:44:55") that have been detected as part of the Wi-Fi network. NetworkManager internally tracks previously seen BSSIDs. The property is only meant for reading and reflects the BSSID list of NetworkManager. The changes you make to this property will not be preserved.ssidbyte arraySSID of the Wi-Fi network. Must be specified.tx-poweruint320If non-zero, directs the device to use the specified transmit power. Units are dBm. This property is highly driver dependent and not all devices support setting a static transmit power.wake-on-wlanuint321The NMSettingWirelessWakeOnWLan options to enable. Not all devices support all options. May be any combination of NM_SETTING_WIRELESS_WAKE_ON_WLAN_ANY (0x2), NM_SETTING_WIRELESS_WAKE_ON_WLAN_DISCONNECT (0x4), NM_SETTING_WIRELESS_WAKE_ON_WLAN_MAGIC (0x8), NM_SETTING_WIRELESS_WAKE_ON_WLAN_GTK_REKEY_FAILURE (0x10), NM_SETTING_WIRELESS_WAKE_ON_WLAN_EAP_IDENTITY_REQUEST (0x20), NM_SETTING_WIRELESS_WAKE_ON_WLAN_4WAY_HANDSHAKE (0x40), NM_SETTING_WIRELESS_WAKE_ON_WLAN_RFKILL_RELEASE (0x80), NM_SETTING_WIRELESS_WAKE_ON_WLAN_TCP (0x100) or the special values NM_SETTING_WIRELESS_WAKE_ON_WLAN_DEFAULT (0x1) (to use global settings) and NM_SETTING_WIRELESS_WAKE_ON_WLAN_IGNORE (0x8000) (to disable management of Wake-on-LAN in NetworkManager).802-11-wireless-security settingWi-Fi Security Settings.Key NameValue TypeDefault ValueValue Descriptionauth-algstringWhen WEP is used (ie, key-mgmt = "none" or "ieee8021x") indicate the 802.11 authentication algorithm required by the AP here. One of "open" for Open System, "shared" for Shared Key, or "leap" for Cisco LEAP. When using Cisco LEAP (ie, key-mgmt = "ieee8021x" and auth-alg = "leap") the "leap-username" and "leap-password" properties must be specified.filsint320Indicates whether Fast Initial Link Setup (802.11ai) must be enabled for the connection. One of NM_SETTING_WIRELESS_SECURITY_FILS_DEFAULT (0) (use global default value), NM_SETTING_WIRELESS_SECURITY_FILS_DISABLE (1) (disable FILS), NM_SETTING_WIRELESS_SECURITY_FILS_OPTIONAL (2) (enable FILS if the supplicant and the access point support it) or NM_SETTING_WIRELESS_SECURITY_FILS_REQUIRED (3) (enable FILS and fail if not supported). When set to NM_SETTING_WIRELESS_SECURITY_FILS_DEFAULT (0) and no global default is set, FILS will be optionally enabled.grouparray of stringA list of group/broadcast encryption algorithms which prevents connections to Wi-Fi networks that do not utilize one of the algorithms in the list. For maximum compatibility leave this property empty. Each list element may be one of "wep40", "wep104", "tkip", or "ccmp".key-mgmtstringKey management used for the connection. One of "none" (WEP), "ieee8021x" (Dynamic WEP), "wpa-psk" (infrastructure WPA-PSK), "sae" (SAE), "owe" (Opportunistic Wireless Encryption), "wpa-eap" (WPA-Enterprise) or "wpa-eap-suite-b-192" (WPA3-Enterprise Suite B). This property must be set for any Wi-Fi connection that uses security.leap-passwordstringThe login password for legacy LEAP connections (ie, key-mgmt = "ieee8021x" and auth-alg = "leap").leap-password-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "leap-password" property. (see for flag values)leap-usernamestringThe login username for legacy LEAP connections (ie, key-mgmt = "ieee8021x" and auth-alg = "leap").pairwisearray of stringA list of pairwise encryption algorithms which prevents connections to Wi-Fi networks that do not utilize one of the algorithms in the list. For maximum compatibility leave this property empty. Each list element may be one of "tkip" or "ccmp".pmfint320Indicates whether Protected Management Frames (802.11w) must be enabled for the connection. One of NM_SETTING_WIRELESS_SECURITY_PMF_DEFAULT (0) (use global default value), NM_SETTING_WIRELESS_SECURITY_PMF_DISABLE (1) (disable PMF), NM_SETTING_WIRELESS_SECURITY_PMF_OPTIONAL (2) (enable PMF if the supplicant and the access point support it) or NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED (3) (enable PMF and fail if not supported). When set to NM_SETTING_WIRELESS_SECURITY_PMF_DEFAULT (0) and no global default is set, PMF will be optionally enabled.protoarray of stringList of strings specifying the allowed WPA protocol versions to use. Each element may be one "wpa" (allow WPA) or "rsn" (allow WPA2/RSN). If not specified, both WPA and RSN connections are allowed.pskstringPre-Shared-Key for WPA networks. For WPA-PSK, it's either an ASCII passphrase of 8 to 63 characters that is (as specified in the 802.11i standard) hashed to derive the actual key, or the key in form of 64 hexadecimal character. The WPA3-Personal networks use a passphrase of any length for SAE authentication.psk-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "psk" property. (see for flag values)wep-key-flagsNMSettingSecretFlags (uint32)Flags indicating how to handle the "wep-key0", "wep-key1", "wep-key2", and "wep-key3" properties. (see for flag values)wep-key-typeNMWepKeyType (uint32)Controls the interpretation of WEP keys. Allowed values are NM_WEP_KEY_TYPE_KEY (1), in which case the key is either a 10- or 26-character hexadecimal string, or a 5- or 13-character ASCII password; or NM_WEP_KEY_TYPE_PASSPHRASE (2), in which case the passphrase is provided as a string and will be hashed using the de-facto MD5 method to derive the actual WEP key.wep-key0stringIndex 0 WEP key. This is the WEP key used in most networks. See the "wep-key-type" property for a description of how this key is interpreted.wep-key1stringIndex 1 WEP key. This WEP index is not used by most networks. See the "wep-key-type" property for a description of how this key is interpreted.wep-key2stringIndex 2 WEP key. This WEP index is not used by most networks. See the "wep-key-type" property for a description of how this key is interpreted.wep-key3stringIndex 3 WEP key. This WEP index is not used by most networks. See the "wep-key-type" property for a description of how this key is interpreted.wep-tx-keyidxuint320When static WEP is used (ie, key-mgmt = "none") and a non-default WEP key index is used by the AP, put that WEP key index here. Valid values are 0 (default key) through 3. Note that some consumer access points (like the Linksys WRT54G) number the keys 1 - 4.wps-methoduint320Flags indicating which mode of WPS is to be used if any. There's little point in changing the default setting as NetworkManager will automatically determine whether it's feasible to start WPS enrollment from the Access Point capabilities. WPS can be disabled by setting this property to a value of 1.wpan settingIEEE 802.15.4 (WPAN) MAC Settings.Key NameValue TypeDefault ValueValue Descriptionchannelint32-1IEEE 802.15.4 channel. A positive integer or -1, meaning "do not set, use whatever the device is already set to".mac-addressstringIf specified, this connection will only apply to the IEEE 802.15.4 (WPAN) MAC layer device whose permanent MAC address matches.pageint32-1IEEE 802.15.4 channel page. A positive integer or -1, meaning "do not set, use whatever the device is already set to".pan-iduint3265535IEEE 802.15.4 Personal Area Network (PAN) identifier.short-addressuint3265535Short IEEE 802.15.4 address to be used within a restricted environment.hostname settingHostname settings.Key NameValue TypeDefault ValueValue Descriptionfrom-dhcpNMTernary (int32)Whether the system hostname can be determined from DHCP on this connection. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).from-dns-lookupNMTernary (int32)Whether the system hostname can be determined from reverse DNS lookup of addresses on this device. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1).only-from-defaultNMTernary (int32)If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_FALSE (0).priorityint320The relative priority of this connection to determine the system hostname. A lower numerical value is better (higher priority). A connection with higher priority is considered before connections with lower priority. If the value is zero, it can be overridden by a global value from NetworkManager configuration. If the property doesn't have a value in the global configuration, the value is assumed to be 100. Negative values have the special effect of excluding other connections with a greater numerical priority value; so in presence of at least one negative priority, only connections with the lowest priority value will be used to determine the hostname.ovs-external-ids settingOVS External IDs Settings.Key NameValue TypeDefault ValueValue Descriptiondatadict of string to string{}A dictionary of key/value pairs with exernal-ids for OVS.veth settingVeth Settings.Key NameValue TypeDefault ValueValue DescriptionpeerstringThis property specifies the peer interface name of the veth. This property is mandatory.Secret flag types: Each password or secret property in a setting has an associated flags property that describes how to handle that secret. The flags property is a bitfield that contains zero or more of the following values logically OR-ed together. diff --git a/man/nm-settings-docs-dbus.xml b/man/nm-settings-docs-dbus.xml index b67ba2c..91a0fda 100644 --- a/man/nm-settings-docs-dbus.xml +++ b/man/nm-settings-docs-dbus.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/man/nm-settings-docs-nmcli.xml b/man/nm-settings-docs-nmcli.xml index 026bc2d..424d705 100644 --- a/man/nm-settings-docs-nmcli.xml +++ b/man/nm-settings-docs-nmcli.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/man/nm-settings-ifcfg-rh.5 b/man/nm-settings-ifcfg-rh.5 index 1e09e64..e456e6d 100644 --- a/man/nm-settings-ifcfg-rh.5 +++ b/man/nm-settings-ifcfg-rh.5 @@ -2,12 +2,12 @@ .\" Title: nm-settings-ifcfg-rh .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: Configuration -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NM\-SETTINGS\-IFCFG\-RH" "5" "" "NetworkManager 1\&.29\&.8" "Configuration" +.TH "NM\-SETTINGS\-IFCFG\-RH" "5" "" "NetworkManager 1\&.29\&.9" "Configuration" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/man/nm-settings-ifcfg-rh.xml b/man/nm-settings-ifcfg-rh.xml index 448f4d0..d2e54d3 100644 --- a/man/nm-settings-ifcfg-rh.xml +++ b/man/nm-settings-ifcfg-rh.xml @@ -1,6 +1,6 @@ -nm-settings-ifcfg-rhNetworkManager developersnm-settings-ifcfg-rh5NetworkManagerConfiguration1.29.8nm-settings-ifcfg-rhDescription of ifcfg-rh settings pluginDescription +nm-settings-ifcfg-rhNetworkManager developersnm-settings-ifcfg-rh5NetworkManagerConfiguration1.29.9nm-settings-ifcfg-rhDescription of ifcfg-rh settings pluginDescription NetworkManager is based on the concept of connection profiles that contain network configuration (see nm-settings5 for details). The profiles can be stored in various formats. NetworkManager uses plugins for reading and writing diff --git a/man/nm-settings-keyfile.5 b/man/nm-settings-keyfile.5 index 6eb6249..23c13e8 100644 --- a/man/nm-settings-keyfile.5 +++ b/man/nm-settings-keyfile.5 @@ -2,12 +2,12 @@ .\" Title: nm-settings-keyfile .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: Configuration -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NM\-SETTINGS\-KEYFILE" "5" "" "NetworkManager 1\&.29\&.8" "Configuration" +.TH "NM\-SETTINGS\-KEYFILE" "5" "" "NetworkManager 1\&.29\&.9" "Configuration" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/man/nm-settings-keyfile.xml b/man/nm-settings-keyfile.xml index e3f8d92..2834c8e 100644 --- a/man/nm-settings-keyfile.xml +++ b/man/nm-settings-keyfile.xml @@ -1,6 +1,6 @@ -nm-settings-keyfileNetworkManager developersnm-settings-keyfile5NetworkManagerConfiguration1.29.8nm-settings-keyfileDescription of keyfile settings pluginDescription +nm-settings-keyfileNetworkManager developersnm-settings-keyfile5NetworkManagerConfiguration1.29.9nm-settings-keyfileDescription of keyfile settings pluginDescription NetworkManager is based on the concept of connection profiles that contain network configuration (see nm-settings5 for details). The profiles can be stored in various formats. NetworkManager uses plugins for reading and writing diff --git a/man/nm-settings-nmcli.5 b/man/nm-settings-nmcli.5 index ce51a0e..954a79d 100644 --- a/man/nm-settings-nmcli.5 +++ b/man/nm-settings-nmcli.5 @@ -2,12 +2,12 @@ .\" Title: nm-settings-nmcli .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: Configuration -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NM\-SETTINGS\-NMCLI" "5" "" "NetworkManager 1\&.29\&.8" "Configuration" +.TH "NM\-SETTINGS\-NMCLI" "5" "" "NetworkManager 1\&.29\&.9" "Configuration" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -3763,7 +3763,7 @@ Format: NMTernary (int32) .PP \fBonly\-from\-default\fR .RS 4 -If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6)\&. If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn\*(Aqt have the default route\&. When set to NM_TERNARY_DEFAULT (\-1), the value from global configuration is used\&. If the property doesn\*(Aqt have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1)\&. +If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6)\&. If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn\*(Aqt have the default route\&. When set to NM_TERNARY_DEFAULT (\-1), the value from global configuration is used\&. If the property doesn\*(Aqt have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_FALSE (0)\&. .sp Format: NMTernary (int32) .RE diff --git a/man/nm-settings-nmcli.xml b/man/nm-settings-nmcli.xml index 3030254..3f13f4e 100644 --- a/man/nm-settings-nmcli.xml +++ b/man/nm-settings-nmcli.xml @@ -1,6 +1,6 @@ -nm-settings-nmcliNetworkManager developersnm-settings-nmcli5NetworkManagerConfiguration1.29.8nm-settings-nmcliDescription of settings and properties of NetworkManager connection profiles for nmcliDescription +nm-settings-nmcliNetworkManager developersnm-settings-nmcli5NetworkManagerConfiguration1.29.9nm-settings-nmcliDescription of settings and properties of NetworkManager connection profiles for nmcliDescription NetworkManager is based on a concept of connection profiles, sometimes referred to as connections only. These connection profiles contain a network configuration. When NetworkManager activates a connection profile on a network device the configuration will @@ -681,7 +681,7 @@ Properties: Whether the system hostname can be determined from DHCP on this connection. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1). Format: NMTernary (int32)Whether the system hostname can be determined from reverse DNS lookup of addresses on this device. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1). - Format: NMTernary (int32)If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_TRUE (1). + Format: NMTernary (int32)If set to NM_TERNARY_TRUE (1), NetworkManager attempts to get the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this device only when the device has the default route for the given address family (IPv4/IPv6). If set to NM_TERNARY_FALSE (0), the hostname can be set from this device even if it doesn't have the default route. When set to NM_TERNARY_DEFAULT (-1), the value from global configuration is used. If the property doesn't have a value in the global configuration, NetworkManager assumes the value to be NM_TERNARY_FALSE (0). Format: NMTernary (int32)The relative priority of this connection to determine the system hostname. A lower numerical value is better (higher priority). A connection with higher priority is considered before connections with lower priority. If the value is zero, it can be overridden by a global value from NetworkManager configuration. If the property doesn't have a value in the global configuration, the value is assumed to be 100. Negative values have the special effect of excluding other connections with a greater numerical priority value; so in presence of at least one negative priority, only connections with the lowest priority value will be used to determine the hostname. Format: int32veth settingVeth Settings. Properties: diff --git a/man/nmcli-examples.7 b/man/nmcli-examples.7 index 6f3cabb..b7150da 100644 --- a/man/nmcli-examples.7 +++ b/man/nmcli-examples.7 @@ -2,12 +2,12 @@ .\" Title: nmcli-examples .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: Examples -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NMCLI\-EXAMPLES" "7" "" "NetworkManager 1\&.29\&.8" "Examples" +.TH "NMCLI\-EXAMPLES" "7" "" "NetworkManager 1\&.29\&.9" "Examples" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/man/nmcli.1 b/man/nmcli.1 index 8d37b47..ff7162e 100644 --- a/man/nmcli.1 +++ b/man/nmcli.1 @@ -2,12 +2,12 @@ .\" Title: nmcli .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: General Commands Manual -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NMCLI" "1" "" "NetworkManager 1\&.29\&.8" "General Commands Manual" +.TH "NMCLI" "1" "" "NetworkManager 1\&.29\&.9" "General Commands Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/man/nmtui.1 b/man/nmtui.1 index 0ade7ef..46ecc9e 100644 --- a/man/nmtui.1 +++ b/man/nmtui.1 @@ -2,12 +2,12 @@ .\" Title: nmtui .\" Author: .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 01/14/2021 +.\" Date: 01/19/2021 .\" Manual: General Commands Manual -.\" Source: NetworkManager 1.29.8 +.\" Source: NetworkManager 1.29.9 .\" Language: English .\" -.TH "NMTUI" "1" "" "NetworkManager 1\&.29\&.8" "General Commands Manual" +.TH "NMTUI" "1" "" "NetworkManager 1\&.29\&.9" "General Commands Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/meson.build b/meson.build index 181b814..4ac9523 100644 --- a/meson.build +++ b/meson.build @@ -6,7 +6,7 @@ project( # - add corresponding NM_VERSION_x_y_z macros in # "shared/nm-version-macros.h.in" # - update number in configure.ac - version: '1.29.8', + version: '1.29.9', license: 'GPL2+', default_options: [ 'buildtype=debugoptimized', diff --git a/po/POTFILES.in b/po/POTFILES.in index cee590c..b3d3348 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -147,6 +147,7 @@ libnm/nm-vpn-plugin-old.c libnm/nm-vpn-service-plugin.c data/org.freedesktop.NetworkManager.policy.in.in shared/nm-glib-aux/nm-shared-utils.c +shared/nm-log-core/nm-logging.c src/NetworkManagerUtils.c src/main.c src/main-utils.c @@ -179,7 +180,6 @@ src/devices/wifi/nm-wifi-utils.c src/devices/wwan/nm-modem-broadband.c src/nm-config.c src/nm-iface-helper.c -src/nm-logging.c src/nm-manager.c src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c diff --git a/shared/README.md b/shared/README.md new file mode 100644 index 0000000..ed950fc --- /dev/null +++ b/shared/README.md @@ -0,0 +1,108 @@ +The "shared/" Directory +======================= + +For NetworkManager we place helper/utility code under "shared/" +in static libraries. The idea is to avoid code duplication but also +provide high quality helper functions that simplify the higher layers. +In NetworkManager there are complicated parts, for example "src/nm-manager.c" +is huge. On the other hand, this helper code should be simple and easy +to understand, so that we can build more complex code on top of it. + +As we statically link them into our binaries, they are all inherently +internal API, that means they cannot be part of libnm's (libnm-core's) public API. +It also means that their API/ABI is not stable. + +We don't care these libraries to be minimal and contain only symbols that are +used by all users. Instead, we expect the linker to throw away unused symbols. +We achieve this by having a symbol versioning file to hide internal symbols +(which gives the linker a possibility to remove them if they are unused) and +compiling with LTO or `"-Wl,--gc-sections"`. Let the tool solve this and not +manual organization. + +Hence these libraries (and their content) are structured this way to satisfy +the following questions: + +1) which dependencies (libraries) do they have? That determines which + other libraries can use it. For example: + + - "shared/nm-std-aux" and "shared/nm-glib-aux" both provide general + purpose helpers, the difference is that the former has no dependency + on glib2 library. Both these libraries are a basic dependency for + many other parts of the code. + + - "shared/nm-udev-aux" has a dependency on libudev, it thus cannot + be in "shared/nm-glib-aux". + + - client code also has a glib2 dependency. That means it can link with + "shared/nm-std-aux" and "shared/nm-glib-aux", but must not link + with "shared/nm-udev-aux" (as it has no direct udev dependenct -- + although clients get it indirectly because libnm already requires + it). + +2) what is their overall purpose? As said, we rely on the linker to + prune unused symbols. But in a few cases we avoid to merge different + code in the same library. For example: + + - "shared/nm-glib-aux" and "shared/nm-base" both only have a + glib2 dependency. Hence, they could be merged. However we + don't do that because "shared/nm-base" is more about NetworkManager + specific code, while "shared/nm-glib-aux" is about general + purpose helpers. + +3) some of these libraries are forked from an upstream. They are kept + separate so that we can re-import future upstream versions. + +Detail +====== + +- `shared/c-list` +- `shared/c-rbtree` +- `shared/c-siphash` +- `shared/c-stdoux` +- `shared/n-acd` +- `shared/n-dhcp4` + + These are forked from upstream and imported with git-subtree. They + in general only have a libc dependency (or dependencies between each + other). + +- `shared/nm-std-aux` + + This contains helper code with only a libc dependency. + Almost all C code depends on this library. + +- `shared/nm-glib-aux` + + Like "shared/nm-std-aux" but also has a glib2 dependency. + Almost all glib2 code depends on this library. + +- `shared/nm-udev/aux` + + Like "shared/nm-glib-aux" but also has a libudev dependency. It + has code related to libudev. + +- `shared/systemd` + + These are forked from upstream systemd and imported with a script. + Under "shared/systemd/src" we try to keep the sources as close to + the original as possible. There is also some adapter code to make + it useable for us. It has a dependency on "shared/nm-glib-aux" + and will need a logging implementation for "shared/nm-glib-aux/nm-logging-fwd.h". + +- `shared/nm-base` + + Depends on "shared/nm-glib-aux" and glib2 but it provides helper code + that more about NetworkManager specifc things. + +- `shared/nm-log-core` + + This is the logging implementation as used by NetworkManager core ("src/"). + It is also a dependency for "shared/nm-platform". + +- `shared/nm-platform` + + Platform implementation. It depends on "shared/nm-log-core", "shared/nm-base" + and "shared/nm-glib-aux". + +- Other than that, there are still a few unorganized files/directories here. + These should be cleaned up. diff --git a/shared/c-stdaux/src/c-stdaux.h b/shared/c-stdaux/src/c-stdaux.h index 08d155c..1cdbbbc 100644 --- a/shared/c-stdaux/src/c-stdaux.h +++ b/shared/c-stdaux/src/c-stdaux.h @@ -84,7 +84,10 @@ extern "C" { * * Return: Evaluates to @_expr. */ -#define C_EXPR_ASSERT(_expr, _assertion, _message) \ +#if defined(__COVERITY__) // Coverity cannot const-fold __builtin_choose_expr() +# define C_EXPR_ASSERT(_expr, _assertion, _message) (_expr) +#else +# define C_EXPR_ASSERT(_expr, _assertion, _message) \ /* indentation and line-split to get better diagnostics */ \ (__builtin_choose_expr( \ !!(1 + 0 * sizeof( \ @@ -95,6 +98,7 @@ _Static_assert(_assertion, _message); \ (_expr), \ ((void)0) \ )) +#endif /** * C_STRINGIFY() - stringify a token, but evaluate it first diff --git a/shared/meson.build b/shared/meson.build index 42fccae..58c29b7 100644 --- a/shared/meson.build +++ b/shared/meson.build @@ -182,6 +182,66 @@ libnm_udev_aux_dep = declare_dependency( link_with: libnm_udev_aux, ) +libnm_base = static_library( + 'nm-base', + sources: files( + 'nm-base/nm-ethtool-base.c', + ), + dependencies: libnm_utils_base_dep, + c_args: c_flags, +) + +libnm_base_dep = declare_dependency( + include_directories: shared_inc, + dependencies: libnm_utils_base_dep, + link_with: libnm_base, +) + +libnm_log_core = static_library( + 'nm-log-core', + sources: 'nm-log-core/nm-logging.c', + dependencies: [ + glib_nm_default_dep, + libsystemd_dep, + ], + c_args: [ + '-DG_LOG_DOMAIN="NetworkManager"', + '-DNETWORKMANAGER_COMPILATION=(NM_NETWORKMANAGER_COMPILATION_GLIB|NM_NETWORKMANAGER_COMPILATION_WITH_GLIB_I18N_LIB)', + ], +) + +libnm_log_core_dep = declare_dependency( + include_directories: shared_inc, + dependencies: [ + libnm_utils_base_dep, + ], + link_with: libnm_log_core, +) + +libnm_platform = static_library( + 'nm-platform', + sources: [ + 'nm-platform/nm-netlink.c', + 'nm-platform/nm-platform-utils.c', + 'nm-platform/nmp-netns.c', + ], + dependencies: [ + glib_nm_default_dep, + ], + c_args: [ + '-DG_LOG_DOMAIN="NetworkManager"', + '-DNETWORKMANAGER_COMPILATION=(NM_NETWORKMANAGER_COMPILATION_GLIB|NM_NETWORKMANAGER_COMPILATION_WITH_GLIB_I18N_LIB)', + ], +) + +libnm_platform_dep = declare_dependency( + include_directories: shared_inc, + dependencies: [ + libnm_utils_base_dep, + ], + link_with: libnm_platform, +) + sources = files( 'systemd/nm-sd-utils-shared.c', 'systemd/src/basic/alloc-util.c', @@ -257,4 +317,5 @@ libnm_systemd_logging_stub = static_library( if enable_tests subdir('nm-glib-aux/tests') + subdir('nm-platform/tests') endif diff --git a/shared/nm-base/nm-base.h b/shared/nm-base/nm-base.h new file mode 100644 index 0000000..1db21ae --- /dev/null +++ b/shared/nm-base/nm-base.h @@ -0,0 +1,204 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2018 Red Hat, Inc. + */ + +#ifndef __NM_LIBNM_BASE_H__ +#define __NM_LIBNM_BASE_H__ + +/*****************************************************************************/ + +/* this must be the same as NM_UTILS_HWADDR_LEN_MAX from libnm. */ +#define _NM_UTILS_HWADDR_LEN_MAX 20 + +/*****************************************************************************/ + +typedef enum { + NM_ETHTOOL_ID_UNKNOWN = -1, + + _NM_ETHTOOL_ID_FIRST = 0, + + _NM_ETHTOOL_ID_COALESCE_FIRST = _NM_ETHTOOL_ID_FIRST, + NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX = _NM_ETHTOOL_ID_COALESCE_FIRST, + NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX, + NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH, + NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW, + NM_ETHTOOL_ID_COALESCE_RX_USECS, + NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH, + NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ, + NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW, + NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL, + NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW, + NM_ETHTOOL_ID_COALESCE_TX_USECS, + NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH, + NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ, + NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW, + _NM_ETHTOOL_ID_COALESCE_LAST = NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW, + + _NM_ETHTOOL_ID_FEATURE_FIRST = _NM_ETHTOOL_ID_COALESCE_LAST + 1, + NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD = _NM_ETHTOOL_ID_FEATURE_FIRST, + NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_FCOE_MTU, + NM_ETHTOOL_ID_FEATURE_GRO, + NM_ETHTOOL_ID_FEATURE_GSO, + NM_ETHTOOL_ID_FEATURE_HIGHDMA, + NM_ETHTOOL_ID_FEATURE_HW_TC_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_L2_FWD_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_LOOPBACK, + NM_ETHTOOL_ID_FEATURE_LRO, + NM_ETHTOOL_ID_FEATURE_NTUPLE, + NM_ETHTOOL_ID_FEATURE_RX, + NM_ETHTOOL_ID_FEATURE_RXHASH, + NM_ETHTOOL_ID_FEATURE_RXVLAN, + NM_ETHTOOL_ID_FEATURE_RX_ALL, + NM_ETHTOOL_ID_FEATURE_RX_FCS, + NM_ETHTOOL_ID_FEATURE_RX_GRO_HW, + NM_ETHTOOL_ID_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_FILTER, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_FILTER, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_HW_PARSE, + NM_ETHTOOL_ID_FEATURE_SG, + NM_ETHTOOL_ID_FEATURE_TLS_HW_RECORD, + NM_ETHTOOL_ID_FEATURE_TLS_HW_TX_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_TSO, + NM_ETHTOOL_ID_FEATURE_TX, + NM_ETHTOOL_ID_FEATURE_TXVLAN, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_FCOE_CRC, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV4, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV6, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IP_GENERIC, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_SCTP, + NM_ETHTOOL_ID_FEATURE_TX_ESP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_FCOE_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GRE_CSUM_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GRE_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GSO_PARTIAL, + NM_ETHTOOL_ID_FEATURE_TX_GSO_ROBUST, + NM_ETHTOOL_ID_FEATURE_TX_IPXIP4_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_IPXIP6_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_NOCACHE_COPY, + NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER, + NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER_FRAGLIST, + NM_ETHTOOL_ID_FEATURE_TX_SCTP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_ECN_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_MANGLEID_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, + _NM_ETHTOOL_ID_FEATURE_LAST = NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, + + _NM_ETHTOOL_ID_RING_FIRST = _NM_ETHTOOL_ID_FEATURE_LAST + 1, + NM_ETHTOOL_ID_RING_RX = _NM_ETHTOOL_ID_RING_FIRST, + NM_ETHTOOL_ID_RING_RX_JUMBO, + NM_ETHTOOL_ID_RING_RX_MINI, + NM_ETHTOOL_ID_RING_TX, + _NM_ETHTOOL_ID_RING_LAST = NM_ETHTOOL_ID_RING_TX, + + _NM_ETHTOOL_ID_LAST = _NM_ETHTOOL_ID_RING_LAST, + + _NM_ETHTOOL_ID_COALESCE_NUM = + (_NM_ETHTOOL_ID_COALESCE_LAST - _NM_ETHTOOL_ID_COALESCE_FIRST + 1), + _NM_ETHTOOL_ID_FEATURE_NUM = (_NM_ETHTOOL_ID_FEATURE_LAST - _NM_ETHTOOL_ID_FEATURE_FIRST + 1), + _NM_ETHTOOL_ID_RING_NUM = (_NM_ETHTOOL_ID_RING_LAST - _NM_ETHTOOL_ID_RING_FIRST + 1), + _NM_ETHTOOL_ID_NUM = (_NM_ETHTOOL_ID_LAST - _NM_ETHTOOL_ID_FIRST + 1), +} NMEthtoolID; + +#define _NM_ETHTOOL_ID_FEATURE_AS_IDX(ethtool_id) ((ethtool_id) -_NM_ETHTOOL_ID_FEATURE_FIRST) +#define _NM_ETHTOOL_ID_COALESCE_AS_IDX(ethtool_id) ((ethtool_id) -_NM_ETHTOOL_ID_COALESCE_FIRST) + +typedef enum { + NM_ETHTOOL_TYPE_UNKNOWN, + NM_ETHTOOL_TYPE_COALESCE, + NM_ETHTOOL_TYPE_FEATURE, + NM_ETHTOOL_TYPE_RING, +} NMEthtoolType; + +/****************************************************************************/ + +static inline gboolean +nm_ethtool_id_is_feature(NMEthtoolID id) +{ + return id >= _NM_ETHTOOL_ID_FEATURE_FIRST && id <= _NM_ETHTOOL_ID_FEATURE_LAST; +} + +static inline gboolean +nm_ethtool_id_is_coalesce(NMEthtoolID id) +{ + return id >= _NM_ETHTOOL_ID_COALESCE_FIRST && id <= _NM_ETHTOOL_ID_COALESCE_LAST; +} + +static inline gboolean +nm_ethtool_id_is_ring(NMEthtoolID id) +{ + return id >= _NM_ETHTOOL_ID_RING_FIRST && id <= _NM_ETHTOOL_ID_RING_LAST; +} + +/*****************************************************************************/ + +typedef enum { + _NM_SETTING_WIRED_WAKE_ON_LAN_NONE = 0, + _NM_SETTING_WIRED_WAKE_ON_LAN_PHY = 0x2, + _NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST = 0x4, + _NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST = 0x8, + _NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST = 0x10, + _NM_SETTING_WIRED_WAKE_ON_LAN_ARP = 0x20, + _NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC = 0x40, + + _NM_SETTING_WIRED_WAKE_ON_LAN_ALL = 0x7E, + + _NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT = 0x1, + _NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE = 0x8000, + _NM_SETTING_WIRED_WAKE_ON_LAN_EXCLUSIVE_FLAGS = 0x8001, +} _NMSettingWiredWakeOnLan; + +/*****************************************************************************/ + +typedef enum { + /* In priority order; higher number == higher priority */ + + NM_IP_CONFIG_SOURCE_UNKNOWN = 0, + + /* for routes, the source is mapped to the uint8 field rtm_protocol. + * Reserve the range [1,0x100] for native RTPROT values. */ + + NM_IP_CONFIG_SOURCE_RTPROT_UNSPEC = 1 + 0, + NM_IP_CONFIG_SOURCE_RTPROT_REDIRECT = 1 + 1, + NM_IP_CONFIG_SOURCE_RTPROT_KERNEL = 1 + 2, + NM_IP_CONFIG_SOURCE_RTPROT_BOOT = 1 + 3, + NM_IP_CONFIG_SOURCE_RTPROT_STATIC = 1 + 4, + NM_IP_CONFIG_SOURCE_RTPROT_RA = 1 + 9, + NM_IP_CONFIG_SOURCE_RTPROT_DHCP = 1 + 16, + _NM_IP_CONFIG_SOURCE_RTPROT_LAST = 1 + 0xFF, + + NM_IP_CONFIG_SOURCE_KERNEL, + NM_IP_CONFIG_SOURCE_SHARED, + NM_IP_CONFIG_SOURCE_IP4LL, + NM_IP_CONFIG_SOURCE_IP6LL, + NM_IP_CONFIG_SOURCE_PPP, + NM_IP_CONFIG_SOURCE_WWAN, + NM_IP_CONFIG_SOURCE_VPN, + NM_IP_CONFIG_SOURCE_DHCP, + NM_IP_CONFIG_SOURCE_NDISC, + NM_IP_CONFIG_SOURCE_USER, +} NMIPConfigSource; + +static inline gboolean +NM_IS_IP_CONFIG_SOURCE_RTPROT(NMIPConfigSource source) +{ + return source > NM_IP_CONFIG_SOURCE_UNKNOWN && source <= _NM_IP_CONFIG_SOURCE_RTPROT_LAST; +} + +/****************************************************************************/ + +#endif /* __NM_LIBNM_BASE_H__ */ diff --git a/shared/nm-base/nm-ethtool-base.c b/shared/nm-base/nm-ethtool-base.c new file mode 100644 index 0000000..9934aa0 --- /dev/null +++ b/shared/nm-base/nm-ethtool-base.c @@ -0,0 +1,276 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2018 Red Hat, Inc. + */ + +#include "nm-default.h" + +#include "nm-ethtool-base.h" + +#include "nm-ethtool-utils-base.h" + +/*****************************************************************************/ + +#define ETHT_DATA(xname) \ + [NM_ETHTOOL_ID_##xname] = (&((const NMEthtoolData){ \ + .optname = NM_ETHTOOL_OPTNAME_##xname, \ + .id = NM_ETHTOOL_ID_##xname, \ + })) + +const NMEthtoolData *const nm_ethtool_data[_NM_ETHTOOL_ID_NUM + 1] = { + /* indexed by NMEthtoolID */ + ETHT_DATA(COALESCE_ADAPTIVE_RX), + ETHT_DATA(COALESCE_ADAPTIVE_TX), + ETHT_DATA(COALESCE_PKT_RATE_HIGH), + ETHT_DATA(COALESCE_PKT_RATE_LOW), + ETHT_DATA(COALESCE_RX_FRAMES), + ETHT_DATA(COALESCE_RX_FRAMES_HIGH), + ETHT_DATA(COALESCE_RX_FRAMES_IRQ), + ETHT_DATA(COALESCE_RX_FRAMES_LOW), + ETHT_DATA(COALESCE_RX_USECS), + ETHT_DATA(COALESCE_RX_USECS_HIGH), + ETHT_DATA(COALESCE_RX_USECS_IRQ), + ETHT_DATA(COALESCE_RX_USECS_LOW), + ETHT_DATA(COALESCE_SAMPLE_INTERVAL), + ETHT_DATA(COALESCE_STATS_BLOCK_USECS), + ETHT_DATA(COALESCE_TX_FRAMES), + ETHT_DATA(COALESCE_TX_FRAMES_HIGH), + ETHT_DATA(COALESCE_TX_FRAMES_IRQ), + ETHT_DATA(COALESCE_TX_FRAMES_LOW), + ETHT_DATA(COALESCE_TX_USECS), + ETHT_DATA(COALESCE_TX_USECS_HIGH), + ETHT_DATA(COALESCE_TX_USECS_IRQ), + ETHT_DATA(COALESCE_TX_USECS_LOW), + ETHT_DATA(FEATURE_ESP_HW_OFFLOAD), + ETHT_DATA(FEATURE_ESP_TX_CSUM_HW_OFFLOAD), + ETHT_DATA(FEATURE_FCOE_MTU), + ETHT_DATA(FEATURE_GRO), + ETHT_DATA(FEATURE_GSO), + ETHT_DATA(FEATURE_HIGHDMA), + ETHT_DATA(FEATURE_HW_TC_OFFLOAD), + ETHT_DATA(FEATURE_L2_FWD_OFFLOAD), + ETHT_DATA(FEATURE_LOOPBACK), + ETHT_DATA(FEATURE_LRO), + ETHT_DATA(FEATURE_NTUPLE), + ETHT_DATA(FEATURE_RX), + ETHT_DATA(FEATURE_RXHASH), + ETHT_DATA(FEATURE_RXVLAN), + ETHT_DATA(FEATURE_RX_ALL), + ETHT_DATA(FEATURE_RX_FCS), + ETHT_DATA(FEATURE_RX_GRO_HW), + ETHT_DATA(FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD), + ETHT_DATA(FEATURE_RX_VLAN_FILTER), + ETHT_DATA(FEATURE_RX_VLAN_STAG_FILTER), + ETHT_DATA(FEATURE_RX_VLAN_STAG_HW_PARSE), + ETHT_DATA(FEATURE_SG), + ETHT_DATA(FEATURE_TLS_HW_RECORD), + ETHT_DATA(FEATURE_TLS_HW_TX_OFFLOAD), + ETHT_DATA(FEATURE_TSO), + ETHT_DATA(FEATURE_TX), + ETHT_DATA(FEATURE_TXVLAN), + ETHT_DATA(FEATURE_TX_CHECKSUM_FCOE_CRC), + ETHT_DATA(FEATURE_TX_CHECKSUM_IPV4), + ETHT_DATA(FEATURE_TX_CHECKSUM_IPV6), + ETHT_DATA(FEATURE_TX_CHECKSUM_IP_GENERIC), + ETHT_DATA(FEATURE_TX_CHECKSUM_SCTP), + ETHT_DATA(FEATURE_TX_ESP_SEGMENTATION), + ETHT_DATA(FEATURE_TX_FCOE_SEGMENTATION), + ETHT_DATA(FEATURE_TX_GRE_CSUM_SEGMENTATION), + ETHT_DATA(FEATURE_TX_GRE_SEGMENTATION), + ETHT_DATA(FEATURE_TX_GSO_PARTIAL), + ETHT_DATA(FEATURE_TX_GSO_ROBUST), + ETHT_DATA(FEATURE_TX_IPXIP4_SEGMENTATION), + ETHT_DATA(FEATURE_TX_IPXIP6_SEGMENTATION), + ETHT_DATA(FEATURE_TX_NOCACHE_COPY), + ETHT_DATA(FEATURE_TX_SCATTER_GATHER), + ETHT_DATA(FEATURE_TX_SCATTER_GATHER_FRAGLIST), + ETHT_DATA(FEATURE_TX_SCTP_SEGMENTATION), + ETHT_DATA(FEATURE_TX_TCP6_SEGMENTATION), + ETHT_DATA(FEATURE_TX_TCP_ECN_SEGMENTATION), + ETHT_DATA(FEATURE_TX_TCP_MANGLEID_SEGMENTATION), + ETHT_DATA(FEATURE_TX_TCP_SEGMENTATION), + ETHT_DATA(FEATURE_TX_UDP_SEGMENTATION), + ETHT_DATA(FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION), + ETHT_DATA(FEATURE_TX_UDP_TNL_SEGMENTATION), + ETHT_DATA(FEATURE_TX_VLAN_STAG_HW_INSERT), + ETHT_DATA(RING_RX), + ETHT_DATA(RING_RX_JUMBO), + ETHT_DATA(RING_RX_MINI), + ETHT_DATA(RING_TX), + [_NM_ETHTOOL_ID_NUM] = NULL, +}; + +static const guint8 _by_name[_NM_ETHTOOL_ID_NUM] = { + /* sorted by optname. */ + NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX, + NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX, + NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH, + NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW, + NM_ETHTOOL_ID_COALESCE_RX_USECS, + NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH, + NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ, + NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW, + NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL, + NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW, + NM_ETHTOOL_ID_COALESCE_TX_USECS, + NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH, + NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ, + NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW, + NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_FCOE_MTU, + NM_ETHTOOL_ID_FEATURE_GRO, + NM_ETHTOOL_ID_FEATURE_GSO, + NM_ETHTOOL_ID_FEATURE_HIGHDMA, + NM_ETHTOOL_ID_FEATURE_HW_TC_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_L2_FWD_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_LOOPBACK, + NM_ETHTOOL_ID_FEATURE_LRO, + NM_ETHTOOL_ID_FEATURE_NTUPLE, + NM_ETHTOOL_ID_FEATURE_RX, + NM_ETHTOOL_ID_FEATURE_RX_ALL, + NM_ETHTOOL_ID_FEATURE_RX_FCS, + NM_ETHTOOL_ID_FEATURE_RX_GRO_HW, + NM_ETHTOOL_ID_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_FILTER, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_FILTER, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_HW_PARSE, + NM_ETHTOOL_ID_FEATURE_RXHASH, + NM_ETHTOOL_ID_FEATURE_RXVLAN, + NM_ETHTOOL_ID_FEATURE_SG, + NM_ETHTOOL_ID_FEATURE_TLS_HW_RECORD, + NM_ETHTOOL_ID_FEATURE_TLS_HW_TX_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_TSO, + NM_ETHTOOL_ID_FEATURE_TX, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_FCOE_CRC, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IP_GENERIC, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV4, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV6, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_SCTP, + NM_ETHTOOL_ID_FEATURE_TX_ESP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_FCOE_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GRE_CSUM_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GRE_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GSO_PARTIAL, + NM_ETHTOOL_ID_FEATURE_TX_GSO_ROBUST, + NM_ETHTOOL_ID_FEATURE_TX_IPXIP4_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_IPXIP6_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_NOCACHE_COPY, + NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER, + NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER_FRAGLIST, + NM_ETHTOOL_ID_FEATURE_TX_SCTP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_ECN_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_MANGLEID_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, + NM_ETHTOOL_ID_FEATURE_TXVLAN, + NM_ETHTOOL_ID_RING_RX, + NM_ETHTOOL_ID_RING_RX_JUMBO, + NM_ETHTOOL_ID_RING_RX_MINI, + NM_ETHTOOL_ID_RING_TX, +}; + +/*****************************************************************************/ + +static void +_ASSERT_data(void) +{ + int i; + + if (!NM_MORE_ASSERT_ONCE(10)) + return; + + G_STATIC_ASSERT_EXPR(_NM_ETHTOOL_ID_FIRST == 0); + G_STATIC_ASSERT_EXPR(_NM_ETHTOOL_ID_LAST == _NM_ETHTOOL_ID_NUM - 1); + G_STATIC_ASSERT_EXPR(_NM_ETHTOOL_ID_NUM > 0); + + nm_assert(NM_PTRARRAY_LEN(nm_ethtool_data) == _NM_ETHTOOL_ID_NUM); + nm_assert(G_N_ELEMENTS(_by_name) == _NM_ETHTOOL_ID_NUM); + nm_assert(G_N_ELEMENTS(nm_ethtool_data) == _NM_ETHTOOL_ID_NUM + 1); + + for (i = 0; i < _NM_ETHTOOL_ID_NUM; i++) { + const NMEthtoolData *d = nm_ethtool_data[i]; + + nm_assert(d); + nm_assert(d->id == (NMEthtoolID) i); + nm_assert(d->optname && d->optname[0]); + } + + for (i = 0; i < _NM_ETHTOOL_ID_NUM; i++) { + NMEthtoolID id = _by_name[i]; + const NMEthtoolData *d; + + nm_assert(id >= 0); + nm_assert(id < _NM_ETHTOOL_ID_NUM); + + d = nm_ethtool_data[id]; + if (i > 0) { + /* since we assert that all optnames are sorted strictly monotonically increasing, + * it also follows that there are no duplicates in the _by_name. + * It also follows, that all names in nm_ethtool_data are unique. */ + if (strcmp(nm_ethtool_data[_by_name[i - 1]]->optname, d->optname) >= 0) { + g_error("nm_ethtool_data is not sorted asciibetically: %u/%s should be after %u/%s", + i - 1, + nm_ethtool_data[_by_name[i - 1]]->optname, + i, + d->optname); + } + } + } +} + +static int +_by_name_cmp(gconstpointer a, gconstpointer b, gpointer user_data) +{ + const guint8 *p_id = a; + const char * optname = b; + + nm_assert(p_id && p_id >= _by_name && p_id <= &_by_name[_NM_ETHTOOL_ID_NUM]); + nm_assert(*p_id < _NM_ETHTOOL_ID_NUM); + + return strcmp(nm_ethtool_data[*p_id]->optname, optname); +} + +const NMEthtoolData * +nm_ethtool_data_get_by_optname(const char *optname) +{ + gssize idx; + + if (!optname) + return NULL; + + _ASSERT_data(); + + idx = nm_utils_array_find_binary_search((gconstpointer *) _by_name, + sizeof(_by_name[0]), + _NM_ETHTOOL_ID_NUM, + optname, + _by_name_cmp, + NULL); + return (idx < 0) ? NULL : nm_ethtool_data[_by_name[idx]]; +} + +NMEthtoolType +nm_ethtool_id_to_type(NMEthtoolID id) +{ + if (nm_ethtool_id_is_coalesce(id)) + return NM_ETHTOOL_TYPE_COALESCE; + if (nm_ethtool_id_is_feature(id)) + return NM_ETHTOOL_TYPE_FEATURE; + if (nm_ethtool_id_is_ring(id)) + return NM_ETHTOOL_TYPE_RING; + + return NM_ETHTOOL_TYPE_UNKNOWN; +} diff --git a/shared/nm-base/nm-ethtool-base.h b/shared/nm-base/nm-ethtool-base.h new file mode 100644 index 0000000..be90ce7 --- /dev/null +++ b/shared/nm-base/nm-ethtool-base.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2018 Red Hat, Inc. + */ + +#ifndef __NM_ETHTOOL_BASE_H__ +#define __NM_ETHTOOL_BASE_H__ + +#include "nm-base/nm-base.h" + +/*****************************************************************************/ + +typedef struct { + const char *optname; + NMEthtoolID id; +} NMEthtoolData; + +extern const NMEthtoolData *const nm_ethtool_data[_NM_ETHTOOL_ID_NUM + 1]; + +const NMEthtoolData *nm_ethtool_data_get_by_optname(const char *optname); + +NMEthtoolType nm_ethtool_id_to_type(NMEthtoolID id); + +/****************************************************************************/ + +static inline NMEthtoolID +nm_ethtool_id_get_by_name(const char *optname) +{ + const NMEthtoolData *d; + + d = nm_ethtool_data_get_by_optname(optname); + return d ? d->id : NM_ETHTOOL_ID_UNKNOWN; +} + +/****************************************************************************/ + +#endif /* __NM_ETHTOOL_BASE_H__ */ diff --git a/shared/nm-base/nm-ethtool-utils-base.h b/shared/nm-base/nm-ethtool-utils-base.h new file mode 100644 index 0000000..e8df3da --- /dev/null +++ b/shared/nm-base/nm-ethtool-utils-base.h @@ -0,0 +1,100 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2018 Red Hat, Inc. + */ + +#ifndef __NM_ETHTOOL_UTILS_H__ +#define __NM_ETHTOOL_UTILS_H__ + +G_BEGIN_DECLS + +/*****************************************************************************/ + +#define NM_ETHTOOL_OPTNAME_FEATURE_ESP_HW_OFFLOAD "feature-esp-hw-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_ESP_TX_CSUM_HW_OFFLOAD "feature-esp-tx-csum-hw-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_FCOE_MTU "feature-fcoe-mtu" +#define NM_ETHTOOL_OPTNAME_FEATURE_GRO "feature-gro" +#define NM_ETHTOOL_OPTNAME_FEATURE_GSO "feature-gso" +#define NM_ETHTOOL_OPTNAME_FEATURE_HIGHDMA "feature-highdma" +#define NM_ETHTOOL_OPTNAME_FEATURE_HW_TC_OFFLOAD "feature-hw-tc-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_L2_FWD_OFFLOAD "feature-l2-fwd-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_LOOPBACK "feature-loopback" +#define NM_ETHTOOL_OPTNAME_FEATURE_LRO "feature-lro" +#define NM_ETHTOOL_OPTNAME_FEATURE_NTUPLE "feature-ntuple" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX "feature-rx" +#define NM_ETHTOOL_OPTNAME_FEATURE_RXHASH "feature-rxhash" +#define NM_ETHTOOL_OPTNAME_FEATURE_RXVLAN "feature-rxvlan" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_ALL "feature-rx-all" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_FCS "feature-rx-fcs" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_GRO_HW "feature-rx-gro-hw" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD "feature-rx-udp_tunnel-port-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_FILTER "feature-rx-vlan-filter" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_FILTER "feature-rx-vlan-stag-filter" +#define NM_ETHTOOL_OPTNAME_FEATURE_RX_VLAN_STAG_HW_PARSE "feature-rx-vlan-stag-hw-parse" +#define NM_ETHTOOL_OPTNAME_FEATURE_SG "feature-sg" +#define NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_RECORD "feature-tls-hw-record" +#define NM_ETHTOOL_OPTNAME_FEATURE_TLS_HW_TX_OFFLOAD "feature-tls-hw-tx-offload" +#define NM_ETHTOOL_OPTNAME_FEATURE_TSO "feature-tso" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX "feature-tx" +#define NM_ETHTOOL_OPTNAME_FEATURE_TXVLAN "feature-txvlan" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_FCOE_CRC "feature-tx-checksum-fcoe-crc" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV4 "feature-tx-checksum-ipv4" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IPV6 "feature-tx-checksum-ipv6" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_IP_GENERIC "feature-tx-checksum-ip-generic" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_CHECKSUM_SCTP "feature-tx-checksum-sctp" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_ESP_SEGMENTATION "feature-tx-esp-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_FCOE_SEGMENTATION "feature-tx-fcoe-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_CSUM_SEGMENTATION "feature-tx-gre-csum-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GRE_SEGMENTATION "feature-tx-gre-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_PARTIAL "feature-tx-gso-partial" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_GSO_ROBUST "feature-tx-gso-robust" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP4_SEGMENTATION "feature-tx-ipxip4-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_IPXIP6_SEGMENTATION "feature-tx-ipxip6-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_NOCACHE_COPY "feature-tx-nocache-copy" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER "feature-tx-scatter-gather" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCATTER_GATHER_FRAGLIST "feature-tx-scatter-gather-fraglist" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_SCTP_SEGMENTATION "feature-tx-sctp-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP6_SEGMENTATION "feature-tx-tcp6-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_ECN_SEGMENTATION "feature-tx-tcp-ecn-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_MANGLEID_SEGMENTATION \ + "feature-tx-tcp-mangleid-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_TCP_SEGMENTATION "feature-tx-tcp-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_SEGMENTATION "feature-tx-udp-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION \ + "feature-tx-udp_tnl-csum-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION "feature-tx-udp_tnl-segmentation" +#define NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT "feature-tx-vlan-stag-hw-insert" + +#define NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX "coalesce-adaptive-rx" +#define NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX "coalesce-adaptive-tx" +#define NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH "coalesce-pkt-rate-high" +#define NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW "coalesce-pkt-rate-low" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES "coalesce-rx-frames" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH "coalesce-rx-frames-high" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ "coalesce-rx-frames-irq" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW "coalesce-rx-frames-low" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS "coalesce-rx-usecs" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH "coalesce-rx-usecs-high" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ "coalesce-rx-usecs-irq" +#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW "coalesce-rx-usecs-low" +#define NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL "coalesce-sample-interval" +#define NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS "coalesce-stats-block-usecs" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES "coalesce-tx-frames" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH "coalesce-tx-frames-high" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ "coalesce-tx-frames-irq" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW "coalesce-tx-frames-low" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS "coalesce-tx-usecs" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH "coalesce-tx-usecs-high" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ "coalesce-tx-usecs-irq" +#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW "coalesce-tx-usecs-low" + +#define NM_ETHTOOL_OPTNAME_RING_RX "ring-rx" +#define NM_ETHTOOL_OPTNAME_RING_RX_JUMBO "ring-rx-jumbo" +#define NM_ETHTOOL_OPTNAME_RING_RX_MINI "ring-rx-mini" +#define NM_ETHTOOL_OPTNAME_RING_TX "ring-tx" + +/*****************************************************************************/ + +G_END_DECLS + +#endif /* __NM_ETHTOOL_UTILS_H__ */ diff --git a/shared/nm-default.h b/shared/nm-default.h index 91ab085..f2cb024 100644 --- a/shared/nm-default.h +++ b/shared/nm-default.h @@ -281,7 +281,7 @@ _nm_g_return_if_fail_warning(const char *log_domain, const char *file, int line) #if (NETWORKMANAGER_COMPILATION) & NM_NETWORKMANAGER_COMPILATION_WITH_DAEMON #include "nm-core-types.h" #include "nm-types.h" - #include "nm-logging.h" + #include "nm-log-core/nm-logging.h" #endif #if (NETWORKMANAGER_COMPILATION) & NM_NETWORKMANAGER_COMPILATION_WITH_LIBNM_PRIVATE diff --git a/shared/nm-glib-aux/nm-enum-utils.c b/shared/nm-glib-aux/nm-enum-utils.c index c0f64b0..9b778d6 100644 --- a/shared/nm-glib-aux/nm-enum-utils.c +++ b/shared/nm-glib-aux/nm-enum-utils.c @@ -76,30 +76,34 @@ _ASSERT_enum_values_info(GType type, const NMUtilsEnumValueInfo *value_infos) } static gboolean -_is_hex_string(const char *str) +_is_hex_string(const char *str, gboolean allow_sign) { + if (allow_sign && str[0] == '-') + str++; return str[0] == '0' && str[1] == 'x' && str[2] && NM_STRCHAR_ALL(&str[2], ch, g_ascii_isxdigit(ch)); } static gboolean -_is_dec_string(const char *str) +_is_dec_string(const char *str, gboolean allow_sign) { + if (allow_sign && str[0] == '-') + str++; return str[0] && NM_STRCHAR_ALL(&str[0], ch, g_ascii_isdigit(ch)); } static gboolean _enum_is_valid_enum_nick(const char *str) { - return str[0] && !NM_STRCHAR_ANY(str, ch, g_ascii_isspace(ch)) && !_is_dec_string(str) - && !_is_hex_string(str); + return str[0] && !NM_STRCHAR_ANY(str, ch, g_ascii_isspace(ch)) && !_is_dec_string(str, TRUE) + && !_is_hex_string(str, TRUE); } static gboolean _enum_is_valid_flags_nick(const char *str) { - return str[0] && !NM_STRCHAR_ANY(str, ch, IS_FLAGS_SEPARATOR(ch)) && !_is_dec_string(str) - && !_is_hex_string(str); + return str[0] && !NM_STRCHAR_ANY(str, ch, IS_FLAGS_SEPARATOR(ch)) && !_is_dec_string(str, FALSE) + && !_is_hex_string(str, FALSE); } char * @@ -212,8 +216,7 @@ _nm_utils_enum_from_str_full(GType type, _ASSERT_enum_values_info(type, value_infos); - str_clone = strdup(str); - s = nm_str_skip_leading_spaces(str_clone); + s = nm_strdup_maybe_a(300, nm_str_skip_leading_spaces(str), &str_clone); g_strchomp(s); klass = g_type_class_ref(type); @@ -221,16 +224,31 @@ _nm_utils_enum_from_str_full(GType type, if (G_IS_ENUM_CLASS(klass)) { GEnumValue *enum_value; + G_STATIC_ASSERT(G_MAXINT < G_MAXINT64); + G_STATIC_ASSERT(G_MININT > G_MININT64); + if (s[0]) { - if (_is_hex_string(s)) { - v64 = _nm_utils_ascii_str_to_int64(s, 16, 0, G_MAXUINT, -1); - if (v64 != -1) { - value = (int) v64; - ret = TRUE; + if (_is_hex_string(s, TRUE)) { + if (s[0] == '-') { + v64 = _nm_utils_ascii_str_to_int64(&s[3], + 16, + -((gint64) G_MAXINT), + -((gint64) G_MININT), + G_MAXINT64); + if (v64 != G_MAXINT64) { + value = (int) (-v64); + ret = TRUE; + } + } else { + v64 = _nm_utils_ascii_str_to_int64(&s[2], 16, G_MININT, G_MAXINT, G_MAXINT64); + if (v64 != G_MAXINT64) { + value = (int) v64; + ret = TRUE; + } } - } else if (_is_dec_string(s)) { - v64 = _nm_utils_ascii_str_to_int64(s, 10, 0, G_MAXUINT, -1); - if (v64 != -1) { + } else if (_is_dec_string(s, TRUE)) { + v64 = _nm_utils_ascii_str_to_int64(s, 10, G_MININT, G_MAXINT, G_MAXINT64); + if (v64 != G_MAXINT64) { value = (int) v64; ret = TRUE; } @@ -259,14 +277,14 @@ _nm_utils_enum_from_str_full(GType type, } if (s[0]) { - if (_is_hex_string(s)) { + if (_is_hex_string(s, FALSE)) { v64 = _nm_utils_ascii_str_to_int64(&s[2], 16, 0, G_MAXUINT, -1); if (v64 == -1) { ret = FALSE; break; } uvalue |= (unsigned) v64; - } else if (_is_dec_string(s)) { + } else if (_is_dec_string(s, FALSE)) { v64 = _nm_utils_ascii_str_to_int64(s, 10, 0, G_MAXUINT, -1); if (v64 == -1) { ret = FALSE; diff --git a/shared/nm-glib-aux/nm-macros-internal.h b/shared/nm-glib-aux/nm-macros-internal.h index 4ce787a..113a67a 100644 --- a/shared/nm-glib-aux/nm-macros-internal.h +++ b/shared/nm-glib-aux/nm-macros-internal.h @@ -1612,6 +1612,16 @@ _nm_strndup_a_step(char *s, const char *str, gsize len) _nm_strndup_a_step(_s_snd, _str_snd, _len_snd); \ }) +#define nm_strdup_maybe_a(alloca_maxlen, str, out_str_free) \ + ({ \ + const char *const _str_snd = (str); \ + \ + (char *) nm_memdup_maybe_a(alloca_maxlen, \ + _str_snd, \ + _str_snd ? strlen(_str_snd) + 1u : 0u, \ + out_str_free); \ + }) + /*****************************************************************************/ /* generic macro to convert an int to a (heap allocated) string. diff --git a/shared/nm-glib-aux/nm-shared-utils.c b/shared/nm-glib-aux/nm-shared-utils.c index 5bab4bd..f42b53c 100644 --- a/shared/nm-glib-aux/nm-shared-utils.c +++ b/shared/nm-glib-aux/nm-shared-utils.c @@ -2267,6 +2267,8 @@ _nm_utils_ascii_str_to_bool(const char *str, int default_value) /*****************************************************************************/ +NM_CACHED_QUARK_FCN("nm-manager-error-quark", nm_manager_error_quark); + NM_CACHED_QUARK_FCN("nm-utils-error-quark", nm_utils_error_quark); void @@ -5136,6 +5138,31 @@ nm_utils_g_main_context_create_integrate_source(GMainContext *inner_context) return &ctx_src->source; } +/*****************************************************************************/ + +void +nm_utils_ifname_cpy(char *dst, const char *name) +{ + int i; + + g_return_if_fail(dst); + g_return_if_fail(name && name[0]); + + nm_assert(nm_utils_ifname_valid_kernel(name, NULL)); + + /* ensures NUL padding of the entire IFNAMSIZ buffer. */ + + for (i = 0; i < (int) IFNAMSIZ && name[i] != '\0'; i++) + dst[i] = name[i]; + + nm_assert(name[i] == '\0'); + + for (; i < (int) IFNAMSIZ; i++) + dst[i] = '\0'; +} + +/*****************************************************************************/ + gboolean nm_utils_ifname_valid_kernel(const char *name, GError **error) { diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h index fe61459..8f0d50c 100644 --- a/shared/nm-glib-aux/nm-shared-utils.h +++ b/shared/nm-glib-aux/nm-shared-utils.h @@ -8,6 +8,18 @@ #include +/*****************************************************************************/ + +/* An optional boolean (like NMTernary, with identical numerical + * enum values). Note that this enum type is _nm_packed! */ +typedef enum _nm_packed { + NM_OPTION_BOOL_DEFAULT = -1, + NM_OPTION_BOOL_FALSE = 0, + NM_OPTION_BOOL_TRUE = 1, +} NMOptionBool; + +/*****************************************************************************/ + static inline gboolean nm_is_ascii(char ch) { @@ -982,6 +994,12 @@ typedef enum { #define NM_UTILS_ERROR (nm_utils_error_quark()) GQuark nm_utils_error_quark(void); +GQuark nm_manager_error_quark(void); +#define _NM_MANAGER_ERROR (nm_manager_error_quark()) + +#define _NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL 10 +#define _NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN 11 + void nm_utils_error_set_cancelled(GError **error, gboolean is_disposing, const char *instance_name); static inline GError * @@ -2092,6 +2110,24 @@ _nm_utils_hwaddr_aton(const char *asc, gpointer buffer, gsize buffer_length, gsi out_length); } +static inline guint8 * +_nm_utils_hwaddr_aton_exact(const char *asc, gpointer buffer, gsize buffer_length) +{ + g_return_val_if_fail(asc, NULL); + g_return_val_if_fail(buffer, NULL); + g_return_val_if_fail(buffer_length > 0, NULL); + + return nm_utils_hexstr2bin_full(asc, + FALSE, + TRUE, + FALSE, + ":-", + buffer_length, + buffer, + buffer_length, + NULL); +} + static inline const char * _nm_utils_hwaddr_ntoa(gconstpointer addr, gsize addr_len, @@ -2261,6 +2297,8 @@ void nm_indirect_g_free(gpointer arg); /*****************************************************************************/ +void nm_utils_ifname_cpy(char *dst, const char *name); + typedef enum { NMU_IFACE_ANY, NMU_IFACE_KERNEL, diff --git a/shared/nm-log-core/nm-logging.c b/shared/nm-log-core/nm-logging.c new file mode 100644 index 0000000..495d5ac --- /dev/null +++ b/shared/nm-log-core/nm-logging.c @@ -0,0 +1,1035 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2006 - 2012 Red Hat, Inc. + * Copyright (C) 2006 - 2008 Novell, Inc. + */ + +#include "nm-default.h" + +#include "nm-logging.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#if SYSTEMD_JOURNAL + #define SD_JOURNAL_SUPPRESS_LOCATION + #include +#endif + +#include "nm-glib-aux/nm-logging-base.h" +#include "nm-glib-aux/nm-time-utils.h" + +/*****************************************************************************/ + +/* Notes about thread-safety: + * + * NetworkManager generally is single-threaded and uses a (GLib) mainloop. + * However, nm-logging is in parts thread-safe. That means: + * + * - functions that configure logging (nm_logging_init(), nm_logging_setup()) and + * most other functions MUST be called only from the main-thread. These functions + * are expected to be called infrequently, so they may or may not use a mutex + * (but the overhead is negligible here). + * + * - functions that do the actual logging logging (nm_log(), nm_logging_enabled()) are + * thread-safe and may be used from multiple threads. + * - When called from the not-main-thread, @mt_require_locking must be set to %TRUE. + * In this case, a Mutex will be used for accessing the global state. + * - When called from the main-thread, they may optionally pass @mt_require_locking %FALSE. + * This avoids extra locking and is in particular interesting for nm_logging_enabled(), + * which is expected to be called frequently and from the main-thread. + * + * Note that the logging macros honor %NM_THREAD_SAFE_ON_MAIN_THREAD define, to automatically + * set @mt_require_locking. That means, by default %NM_THREAD_SAFE_ON_MAIN_THREAD is "1", + * and code that only runs on the main-thread (which is the majority), can get away + * without locking. + */ + +/*****************************************************************************/ + +G_STATIC_ASSERT(LOG_EMERG == 0); +G_STATIC_ASSERT(LOG_ALERT == 1); +G_STATIC_ASSERT(LOG_CRIT == 2); +G_STATIC_ASSERT(LOG_ERR == 3); +G_STATIC_ASSERT(LOG_WARNING == 4); +G_STATIC_ASSERT(LOG_NOTICE == 5); +G_STATIC_ASSERT(LOG_INFO == 6); +G_STATIC_ASSERT(LOG_DEBUG == 7); + +/* We have more then 32 logging domains. Assert that it compiles to a 64 bit sized enum */ +G_STATIC_ASSERT(sizeof(NMLogDomain) >= sizeof(guint64)); + +/* Combined domains */ +#define LOGD_ALL_STRING "ALL" +#define LOGD_DEFAULT_STRING "DEFAULT" +#define LOGD_DHCP_STRING "DHCP" +#define LOGD_IP_STRING "IP" + +/*****************************************************************************/ + +typedef enum { + LOG_BACKEND_GLIB, + LOG_BACKEND_SYSLOG, + LOG_BACKEND_JOURNAL, +} LogBackend; + +typedef struct { + NMLogDomain num; + const char *name; +} LogDesc; + +typedef struct { + char *logging_domains_to_string; +} GlobalMain; + +typedef struct { + NMLogLevel log_level; + bool uses_syslog : 1; + bool init_pre_done : 1; + bool init_done : 1; + bool debug_stderr : 1; + const char *prefix; + const char *syslog_identifier; + + /* before we setup syslog (during start), the backend defaults to GLIB, meaning: + * we use g_log() for all logging. At that point, the application is not yet supposed + * to do any logging and doing so indicates a bug. + * + * Afterwards, the backend is either SYSLOG or JOURNAL. From that point, also + * g_log() is redirected to this backend via a logging handler. */ + LogBackend log_backend; +} Global; + +/*****************************************************************************/ + +G_LOCK_DEFINE_STATIC(log); + +/* This data must only be accessed from the main-thread (and as + * such does not need any lock). */ +static GlobalMain gl_main = {}; + +static union { + /* a union with an immutable and a mutable alias for the Global. + * Since nm-logging must be thread-safe, we must take care at which + * places we only read value ("imm") and where we modify them ("mut"). */ + Global mut; + const Global imm; +} gl = { + .imm = + { + /* nm_logging_setup ("INFO", LOGD_DEFAULT_STRING, NULL, NULL); */ + .log_level = LOGL_INFO, + .log_backend = LOG_BACKEND_GLIB, + .syslog_identifier = "SYSLOG_IDENTIFIER=" G_LOG_DOMAIN, + .prefix = "", + }, +}; + +NMLogDomain _nm_logging_enabled_state[_LOGL_N_REAL] = { + /* nm_logging_setup ("INFO", LOGD_DEFAULT_STRING, NULL, NULL); + * + * Note: LOGD_VPN_PLUGIN is special and must be disabled for + * DEBUG and TRACE levels. */ + [LOGL_INFO] = LOGD_DEFAULT, + [LOGL_WARN] = LOGD_DEFAULT, + [LOGL_ERR] = LOGD_DEFAULT, +}; + +/*****************************************************************************/ + +static const LogDesc domain_desc[] = { + {LOGD_PLATFORM, "PLATFORM"}, + {LOGD_RFKILL, "RFKILL"}, + {LOGD_ETHER, "ETHER"}, + {LOGD_WIFI, "WIFI"}, + {LOGD_BT, "BT"}, + {LOGD_MB, "MB"}, + {LOGD_DHCP4, "DHCP4"}, + {LOGD_DHCP6, "DHCP6"}, + {LOGD_PPP, "PPP"}, + {LOGD_WIFI_SCAN, "WIFI_SCAN"}, + {LOGD_IP4, "IP4"}, + {LOGD_IP6, "IP6"}, + {LOGD_AUTOIP4, "AUTOIP4"}, + {LOGD_DNS, "DNS"}, + {LOGD_VPN, "VPN"}, + {LOGD_SHARING, "SHARING"}, + {LOGD_SUPPLICANT, "SUPPLICANT"}, + {LOGD_AGENTS, "AGENTS"}, + {LOGD_SETTINGS, "SETTINGS"}, + {LOGD_SUSPEND, "SUSPEND"}, + {LOGD_CORE, "CORE"}, + {LOGD_DEVICE, "DEVICE"}, + {LOGD_OLPC, "OLPC"}, + {LOGD_INFINIBAND, "INFINIBAND"}, + {LOGD_FIREWALL, "FIREWALL"}, + {LOGD_ADSL, "ADSL"}, + {LOGD_BOND, "BOND"}, + {LOGD_VLAN, "VLAN"}, + {LOGD_BRIDGE, "BRIDGE"}, + {LOGD_DBUS_PROPS, "DBUS_PROPS"}, + {LOGD_TEAM, "TEAM"}, + {LOGD_CONCHECK, "CONCHECK"}, + {LOGD_DCB, "DCB"}, + {LOGD_DISPATCH, "DISPATCH"}, + {LOGD_AUDIT, "AUDIT"}, + {LOGD_SYSTEMD, "SYSTEMD"}, + {LOGD_VPN_PLUGIN, "VPN_PLUGIN"}, + {LOGD_PROXY, "PROXY"}, + {0}, +}; + +/*****************************************************************************/ + +static char *_domains_to_string(gboolean include_level_override, + NMLogLevel log_level, + const NMLogDomain log_state[static _LOGL_N_REAL]); + +/*****************************************************************************/ + +static gboolean +_syslog_identifier_valid_domain(const char *domain) +{ + char c; + + if (!domain || !domain[0]) + return FALSE; + + /* we pass the syslog identifier as format string. No funny stuff. */ + + for (; (c = domain[0]); domain++) { + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') + || NM_IN_SET(c, '-', '_')) + continue; + return FALSE; + } + return TRUE; +} + +static gboolean +_syslog_identifier_assert(const char *syslog_identifier) +{ + g_assert(syslog_identifier); + g_assert(g_str_has_prefix(syslog_identifier, "SYSLOG_IDENTIFIER=")); + g_assert(_syslog_identifier_valid_domain(&syslog_identifier[NM_STRLEN("SYSLOG_IDENTIFIER=")])); + return TRUE; +} + +static const char * +syslog_identifier_domain(const char *syslog_identifier) +{ + nm_assert(_syslog_identifier_assert(syslog_identifier)); + return &syslog_identifier[NM_STRLEN("SYSLOG_IDENTIFIER=")]; +} + +#if SYSTEMD_JOURNAL +static const char * +syslog_identifier_full(const char *syslog_identifier) +{ + nm_assert(_syslog_identifier_assert(syslog_identifier)); + return &syslog_identifier[0]; +} +#endif + +/*****************************************************************************/ + +static gboolean +match_log_level(const char *level, NMLogLevel *out_level, GError **error) +{ + if (_nm_log_parse_level(level, out_level)) + return TRUE; + + g_set_error(error, + _NM_MANAGER_ERROR, + _NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL, + _("Unknown log level '%s'"), + level); + return FALSE; +} + +gboolean +nm_logging_setup(const char *level, const char *domains, char **bad_domains, GError **error) +{ + GString * unrecognized = NULL; + NMLogDomain cur_log_state[_LOGL_N_REAL]; + NMLogDomain new_log_state[_LOGL_N_REAL]; + NMLogLevel cur_log_level; + NMLogLevel new_log_level; + gs_free const char **domains_v = NULL; + gsize i_d; + int i; + gboolean had_platform_debug; + gs_free char * domains_free = NULL; + + NM_ASSERT_ON_MAIN_THREAD(); + + g_return_val_if_fail(!bad_domains || !*bad_domains, FALSE); + g_return_val_if_fail(!error || !*error, FALSE); + + cur_log_level = gl.imm.log_level; + memcpy(cur_log_state, _nm_logging_enabled_state, sizeof(cur_log_state)); + + new_log_level = cur_log_level; + + if (!domains || !*domains) { + domains_free = _domains_to_string(FALSE, cur_log_level, cur_log_state); + domains = domains_free; + } + + for (i = 0; i < G_N_ELEMENTS(new_log_state); i++) + new_log_state[i] = 0; + + if (level && *level) { + if (!match_log_level(level, &new_log_level, error)) + return FALSE; + if (new_log_level == _LOGL_KEEP) { + new_log_level = cur_log_level; + for (i = 0; i < G_N_ELEMENTS(new_log_state); i++) + new_log_state[i] = cur_log_state[i]; + } + } + + domains_v = nm_utils_strsplit_set(domains, ", "); + for (i_d = 0; domains_v && domains_v[i_d]; i_d++) { + const char * s = domains_v[i_d]; + const char * p; + const LogDesc *diter; + NMLogLevel domain_log_level; + NMLogDomain bits; + + /* LOGD_VPN_PLUGIN is protected, that is, when setting ALL or DEFAULT, + * it does not enable the verbose levels DEBUG and TRACE, because that + * may expose sensitive data. */ + NMLogDomain protect = LOGD_NONE; + + p = strchr(s, ':'); + if (p) { + *((char *) p) = '\0'; + if (!match_log_level(p + 1, &domain_log_level, error)) + return FALSE; + } else + domain_log_level = new_log_level; + + bits = 0; + + if (domains_free) { + /* The caller didn't provide any domains to set (`nmcli general logging level DEBUG`). + * We reset all domains that were previously set, but we still want to protect + * VPN_PLUGIN domain. */ + protect = LOGD_VPN_PLUGIN; + } + + /* Check for combined domains */ + if (!g_ascii_strcasecmp(s, LOGD_ALL_STRING)) { + bits = LOGD_ALL; + protect = LOGD_VPN_PLUGIN; + } else if (!g_ascii_strcasecmp(s, LOGD_DEFAULT_STRING)) { + bits = LOGD_DEFAULT; + protect = LOGD_VPN_PLUGIN; + } else if (!g_ascii_strcasecmp(s, LOGD_DHCP_STRING)) + bits = LOGD_DHCP; + else if (!g_ascii_strcasecmp(s, LOGD_IP_STRING)) + bits = LOGD_IP; + + /* Check for compatibility domains */ + else if (!g_ascii_strcasecmp(s, "HW")) + bits = LOGD_PLATFORM; + else if (!g_ascii_strcasecmp(s, "WIMAX")) + continue; + + else { + for (diter = &domain_desc[0]; diter->name; diter++) { + if (!g_ascii_strcasecmp(diter->name, s)) { + bits = diter->num; + break; + } + } + + if (!bits) { + if (!bad_domains) { + g_set_error(error, + _NM_MANAGER_ERROR, + _NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN, + _("Unknown log domain '%s'"), + s); + return FALSE; + } + + if (unrecognized) + g_string_append(unrecognized, ", "); + else + unrecognized = g_string_new(NULL); + g_string_append(unrecognized, s); + continue; + } + } + + if (domain_log_level == _LOGL_KEEP) { + for (i = 0; i < G_N_ELEMENTS(new_log_state); i++) + new_log_state[i] = (new_log_state[i] & ~bits) | (cur_log_state[i] & bits); + } else { + for (i = 0; i < G_N_ELEMENTS(new_log_state); i++) { + if (i < domain_log_level) + new_log_state[i] &= ~bits; + else { + new_log_state[i] |= bits; + if ((protect & bits) && i < LOGL_INFO) + new_log_state[i] &= ~protect; + } + } + } + } + + nm_clear_g_free(&gl_main.logging_domains_to_string); + + had_platform_debug = _nm_logging_enabled_lockfree(LOGL_DEBUG, LOGD_PLATFORM); + + G_LOCK(log); + + gl.mut.log_level = new_log_level; + for (i = 0; i < G_N_ELEMENTS(new_log_state); i++) + _nm_logging_enabled_state[i] = new_log_state[i]; + + G_UNLOCK(log); + + if (had_platform_debug && !_nm_logging_enabled_lockfree(LOGL_DEBUG, LOGD_PLATFORM)) { + /* when debug logging is enabled, platform will cache all access to + * sysctl. When the user disables debug-logging, we want to clear that + * cache right away. */ + _nm_logging_clear_platform_logging_cache(); + } + + if (unrecognized) + *bad_domains = g_string_free(unrecognized, FALSE); + + return TRUE; +} + +const char * +nm_logging_level_to_string(void) +{ + NM_ASSERT_ON_MAIN_THREAD(); + + return level_desc[gl.imm.log_level].name; +} + +const char * +nm_logging_all_levels_to_string(void) +{ + static GString *str; + + if (G_UNLIKELY(!str)) { + int i; + + str = g_string_new(NULL); + for (i = 0; i < G_N_ELEMENTS(level_desc); i++) { + if (str->len) + g_string_append_c(str, ','); + g_string_append(str, level_desc[i].name); + } + } + + return str->str; +} + +const char * +nm_logging_domains_to_string(void) +{ + NM_ASSERT_ON_MAIN_THREAD(); + + if (G_UNLIKELY(!gl_main.logging_domains_to_string)) { + gl_main.logging_domains_to_string = + _domains_to_string(TRUE, gl.imm.log_level, _nm_logging_enabled_state); + } + + return gl_main.logging_domains_to_string; +} + +static char * +_domains_to_string(gboolean include_level_override, + NMLogLevel log_level, + const NMLogDomain log_state[static _LOGL_N_REAL]) +{ + const LogDesc *diter; + GString * str; + int i; + + /* We don't just return g_strdup() the logging domains that were set during + * nm_logging_setup(), because we want to expand "DEFAULT" and "ALL". + */ + + str = g_string_sized_new(75); + for (diter = &domain_desc[0]; diter->name; diter++) { + /* If it's set for any lower level, it will also be set for LOGL_ERR */ + if (!(diter->num & log_state[LOGL_ERR])) + continue; + + if (str->len) + g_string_append_c(str, ','); + g_string_append(str, diter->name); + + if (!include_level_override) + continue; + + /* Check if it's logging at a lower level than the default. */ + for (i = 0; i < log_level; i++) { + if (diter->num & log_state[i]) { + g_string_append_printf(str, ":%s", level_desc[i].name); + break; + } + } + /* Check if it's logging at a higher level than the default. */ + if (!(diter->num & log_state[log_level])) { + for (i = log_level + 1; i < _LOGL_N_REAL; i++) { + if (diter->num & log_state[i]) { + g_string_append_printf(str, ":%s", level_desc[i].name); + break; + } + } + } + } + return g_string_free(str, FALSE); +} + +static char _all_logging_domains_to_str[273]; + +const char * +nm_logging_all_domains_to_string(void) +{ + static const char *volatile str = NULL; + const char *s; + +again: + s = g_atomic_pointer_get(&str); + if (G_UNLIKELY(!s)) { + static gsize once = 0; + const LogDesc *diter; + gsize buf_l; + char * buf_p; + + if (!g_once_init_enter(&once)) + goto again; + + buf_p = _all_logging_domains_to_str; + buf_l = sizeof(_all_logging_domains_to_str); + + nm_utils_strbuf_append_str(&buf_p, &buf_l, LOGD_DEFAULT_STRING); + for (diter = &domain_desc[0]; diter->name; diter++) { + nm_utils_strbuf_append_c(&buf_p, &buf_l, ','); + nm_utils_strbuf_append_str(&buf_p, &buf_l, diter->name); + if (diter->num == LOGD_DHCP6) + nm_utils_strbuf_append_str(&buf_p, &buf_l, "," LOGD_DHCP_STRING); + else if (diter->num == LOGD_IP6) + nm_utils_strbuf_append_str(&buf_p, &buf_l, "," LOGD_IP_STRING); + } + nm_utils_strbuf_append_str(&buf_p, &buf_l, LOGD_ALL_STRING); + + /* Did you modify the logging domains (or their names)? Adjust the size of + * _all_logging_domains_to_str buffer above to have the exact size. */ + nm_assert(strlen(_all_logging_domains_to_str) == sizeof(_all_logging_domains_to_str) - 1); + nm_assert(buf_l == 1); + + s = _all_logging_domains_to_str; + g_atomic_pointer_set(&str, s); + g_once_init_leave(&once, 1); + } + + return s; +} + +/** + * nm_logging_get_level: + * @domain: find the lowest enabled logging level for the + * given domain. If this is a set of multiple + * domains, the most verbose level will be returned. + * + * Returns: the lowest (most verbose) logging level for the + * give @domain, or %_LOGL_OFF if it is disabled. + **/ +NMLogLevel +nm_logging_get_level(NMLogDomain domain) +{ + NMLogLevel sl = _LOGL_OFF; + + G_STATIC_ASSERT(LOGL_TRACE == 0); + while (sl > LOGL_TRACE && _nm_logging_enabled_lockfree(sl - 1, domain)) + sl--; + return sl; +} + +gboolean +_nm_logging_enabled_locking(NMLogLevel level, NMLogDomain domain) +{ + gboolean v; + + G_LOCK(log); + v = _nm_logging_enabled_lockfree(level, domain); + G_UNLOCK(log); + return v; +} + +gboolean +_nm_log_enabled_impl(gboolean mt_require_locking, NMLogLevel level, NMLogDomain domain) +{ + return nm_logging_enabled_mt(mt_require_locking, level, domain); +} + +#if SYSTEMD_JOURNAL +static void +_iovec_set(struct iovec *iov, const void *str, gsize len) +{ + iov->iov_base = (void *) str; + iov->iov_len = len; +} + +static void +_iovec_set_string(struct iovec *iov, const char *str) +{ + _iovec_set(iov, str, strlen(str)); +} + + #define _iovec_set_string_literal(iov, str) _iovec_set((iov), "" str "", NM_STRLEN(str)) + +_nm_printf(3, 4) static void _iovec_set_format(struct iovec *iov, + char ** iov_free, + const char * format, + ...) +{ + va_list ap; + char * str; + + va_start(ap, format); + str = g_strdup_vprintf(format, ap); + va_end(ap); + + _iovec_set_string(iov, str); + *iov_free = str; +} + + #define _iovec_set_format_a(iov, reserve_extra, format, ...) \ + G_STMT_START \ + { \ + const gsize _size = (reserve_extra) + (NM_STRLEN(format) + 3); \ + char *const _buf = g_alloca(_size); \ + int _len; \ + \ + G_STATIC_ASSERT_EXPR((reserve_extra) + (NM_STRLEN(format) + 3) <= 96); \ + \ + _len = g_snprintf(_buf, _size, "" format "", ##__VA_ARGS__); \ + \ + nm_assert(_len >= 0); \ + nm_assert(_len < _size); \ + nm_assert(_len == strlen(_buf)); \ + \ + _iovec_set((iov), _buf, _len); \ + } \ + G_STMT_END + + #define _iovec_set_format_str_a(iov, max_str_len, format, str_arg) \ + G_STMT_START \ + { \ + const char *_str_arg = (str_arg); \ + \ + nm_assert(_str_arg &&strlen(_str_arg) < (max_str_len)); \ + _iovec_set_format_a((iov), (max_str_len), format, str_arg); \ + } \ + G_STMT_END + +#endif + +void +_nm_log_impl(const char *file, + guint line, + const char *func, + gboolean mt_require_locking, + NMLogLevel level, + NMLogDomain domain, + int error, + const char *ifname, + const char *conn_uuid, + const char *fmt, + ...) +{ + va_list args; + char * msg; + GTimeVal tv; + int errsv; + const NMLogDomain *cur_log_state; + NMLogDomain cur_log_state_copy[_LOGL_N_REAL]; + Global g_copy; + const Global * g; + + if (G_UNLIKELY(mt_require_locking)) { + G_LOCK(log); + /* we evaluate logging-enabled under lock. There is still a race that + * we might log the message below *after* logging was disabled. That means, + * when disabling logging, we might still log messages. */ + if (!_nm_logging_enabled_lockfree(level, domain)) { + G_UNLOCK(log); + return; + } + g_copy = gl.imm; + memcpy(cur_log_state_copy, _nm_logging_enabled_state, sizeof(cur_log_state_copy)); + G_UNLOCK(log); + g = &g_copy; + cur_log_state = cur_log_state_copy; + } else { + NM_ASSERT_ON_MAIN_THREAD(); + if (!_nm_logging_enabled_lockfree(level, domain)) + return; + g = &gl.imm; + cur_log_state = _nm_logging_enabled_state; + } + + (void) cur_log_state; + + errsv = errno; + + /* Make sure that %m maps to the specified error */ + if (error != 0) { + if (error < 0) + error = -error; + errno = error; + } + + va_start(args, fmt); + msg = g_strdup_vprintf(fmt, args); + va_end(args); + +#define MESSAGE_FMT "%s%-7s [%ld.%04ld] %s" +#define MESSAGE_ARG(prefix, tv, msg) \ + prefix, level_desc[level].level_str, (tv).tv_sec, ((tv).tv_usec / 100), (msg) + + g_get_current_time(&tv); + + if (g->debug_stderr) + g_printerr(MESSAGE_FMT "\n", MESSAGE_ARG(g->prefix, tv, msg)); + + switch (g->log_backend) { +#if SYSTEMD_JOURNAL + case LOG_BACKEND_JOURNAL: + { + gint64 now, boottime; + struct iovec iov_data[15]; + struct iovec * iov = iov_data; + char * iov_free_data[5]; + char ** iov_free = iov_free_data; + const LogDesc *diter; + NMLogDomain dom_all; + char s_log_domains_buf[NM_STRLEN("NM_LOG_DOMAINS=") + sizeof(_all_logging_domains_to_str)]; + char *s_log_domains; + gsize l_log_domains; + + now = nm_utils_get_monotonic_timestamp_nsec(); + boottime = nm_utils_monotonic_timestamp_as_boottime(now, 1); + + _iovec_set_format_a(iov++, 30, "PRIORITY=%d", level_desc[level].syslog_level); + _iovec_set_format(iov++, + iov_free++, + "MESSAGE=" MESSAGE_FMT, + MESSAGE_ARG(g->prefix, tv, msg)); + _iovec_set_string(iov++, syslog_identifier_full(g->syslog_identifier)); + _iovec_set_format_a(iov++, 30, "SYSLOG_PID=%ld", (long) getpid()); + + dom_all = domain; + s_log_domains = s_log_domains_buf; + l_log_domains = sizeof(s_log_domains_buf); + + nm_utils_strbuf_append_str(&s_log_domains, &l_log_domains, "NM_LOG_DOMAINS="); + for (diter = &domain_desc[0]; dom_all != 0 && diter->name; diter++) { + if (!NM_FLAGS_ANY(dom_all, diter->num)) + continue; + if (dom_all != domain) + nm_utils_strbuf_append_c(&s_log_domains, &l_log_domains, ','); + nm_utils_strbuf_append_str(&s_log_domains, &l_log_domains, diter->name); + dom_all &= ~diter->num; + } + nm_assert(l_log_domains > 0); + _iovec_set(iov++, s_log_domains_buf, s_log_domains - s_log_domains_buf); + + G_STATIC_ASSERT_EXPR(LOG_FAC(LOG_DAEMON) == 3); + _iovec_set_string_literal(iov++, "SYSLOG_FACILITY=3"); + _iovec_set_format_str_a(iov++, 15, "NM_LOG_LEVEL=%s", level_desc[level].name); + if (func) + _iovec_set_format(iov++, iov_free++, "CODE_FUNC=%s", func); + _iovec_set_format(iov++, iov_free++, "CODE_FILE=%s", file ?: ""); + _iovec_set_format_a(iov++, 20, "CODE_LINE=%u", line); + _iovec_set_format_a(iov++, + 60, + "TIMESTAMP_MONOTONIC=%lld.%06lld", + (long long) (now / NM_UTILS_NSEC_PER_SEC), + (long long) ((now % NM_UTILS_NSEC_PER_SEC) / 1000)); + _iovec_set_format_a(iov++, + 60, + "TIMESTAMP_BOOTTIME=%lld.%06lld", + (long long) (boottime / NM_UTILS_NSEC_PER_SEC), + (long long) ((boottime % NM_UTILS_NSEC_PER_SEC) / 1000)); + if (error != 0) + _iovec_set_format_a(iov++, 30, "ERRNO=%d", error); + if (ifname) + _iovec_set_format(iov++, iov_free++, "NM_DEVICE=%s", ifname); + if (conn_uuid) + _iovec_set_format(iov++, iov_free++, "NM_CONNECTION=%s", conn_uuid); + + nm_assert(iov <= &iov_data[G_N_ELEMENTS(iov_data)]); + nm_assert(iov_free <= &iov_free_data[G_N_ELEMENTS(iov_free_data)]); + + sd_journal_sendv(iov_data, iov - iov_data); + + for (; --iov_free >= iov_free_data;) + g_free(*iov_free); + } break; +#endif + case LOG_BACKEND_SYSLOG: + syslog(level_desc[level].syslog_level, MESSAGE_FMT, MESSAGE_ARG(g->prefix, tv, msg)); + break; + default: + g_log(syslog_identifier_domain(g->syslog_identifier), + level_desc[level].g_log_level, + MESSAGE_FMT, + MESSAGE_ARG(g->prefix, tv, msg)); + break; + } + + g_free(msg); + + errno = errsv; +} + +/*****************************************************************************/ + +void +_nm_utils_monotonic_timestamp_initialized(const struct timespec *tp, + gint64 offset_sec, + gboolean is_boottime) +{ + NM_ASSERT_ON_MAIN_THREAD(); + + if (_nm_logging_enabled_lockfree(LOGL_DEBUG, LOGD_CORE)) { + time_t now = time(NULL); + struct tm tm; + char s[255]; + + strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime_r(&now, &tm)); + nm_log_dbg(LOGD_CORE, + "monotonic timestamp started counting 1.%09ld seconds ago with " + "an offset of %lld.0 seconds to %s (local time is %s)", + tp->tv_nsec, + (long long) -offset_sec, + is_boottime ? "CLOCK_BOOTTIME" : "CLOCK_MONOTONIC", + s); + } +} + +/*****************************************************************************/ + +static void +nm_log_handler(const char *log_domain, GLogLevelFlags level, const char *message, gpointer ignored) +{ + int syslog_priority; + + switch (level & G_LOG_LEVEL_MASK) { + case G_LOG_LEVEL_ERROR: + syslog_priority = LOG_CRIT; + break; + case G_LOG_LEVEL_CRITICAL: + syslog_priority = LOG_ERR; + break; + case G_LOG_LEVEL_WARNING: + syslog_priority = LOG_WARNING; + break; + case G_LOG_LEVEL_MESSAGE: + syslog_priority = LOG_NOTICE; + break; + case G_LOG_LEVEL_DEBUG: + syslog_priority = LOG_DEBUG; + break; + case G_LOG_LEVEL_INFO: + default: + syslog_priority = LOG_INFO; + break; + } + + /* we don't need any locking here. The glib log handler gets only registered + * once during nm_logging_init() and the global data is not modified afterwards. */ + nm_assert(gl.imm.init_done); + + if (gl.imm.debug_stderr) + g_printerr("%s%s\n", gl.imm.prefix, message ?: ""); + + switch (gl.imm.log_backend) { +#if SYSTEMD_JOURNAL + case LOG_BACKEND_JOURNAL: + { + gint64 now, boottime; + + now = nm_utils_get_monotonic_timestamp_nsec(); + boottime = nm_utils_monotonic_timestamp_as_boottime(now, 1); + + sd_journal_send("PRIORITY=%d", + syslog_priority, + "MESSAGE=%s%s", + gl.imm.prefix, + message ?: "", + syslog_identifier_full(gl.imm.syslog_identifier), + "SYSLOG_PID=%ld", + (long) getpid(), + "SYSLOG_FACILITY=3", + "GLIB_DOMAIN=%s", + log_domain ?: "", + "GLIB_LEVEL=%d", + (int) (level & G_LOG_LEVEL_MASK), + "TIMESTAMP_MONOTONIC=%lld.%06lld", + (long long) (now / NM_UTILS_NSEC_PER_SEC), + (long long) ((now % NM_UTILS_NSEC_PER_SEC) / 1000), + "TIMESTAMP_BOOTTIME=%lld.%06lld", + (long long) (boottime / NM_UTILS_NSEC_PER_SEC), + (long long) ((boottime % NM_UTILS_NSEC_PER_SEC) / 1000), + NULL); + } break; +#endif + default: + syslog(syslog_priority, "%s%s", gl.imm.prefix, message ?: ""); + break; + } +} + +gboolean +nm_logging_syslog_enabled(void) +{ + NM_ASSERT_ON_MAIN_THREAD(); + + return gl.imm.uses_syslog; +} + +void +nm_logging_init_pre(const char *syslog_identifier, char *prefix_take) +{ + /* this function may be called zero or one times, and only + * - on the main thread + * - not after nm_logging_init(). */ + + NM_ASSERT_ON_MAIN_THREAD(); + + if (gl.imm.init_pre_done) + g_return_if_reached(); + + if (gl.imm.init_done) + g_return_if_reached(); + + if (!_syslog_identifier_valid_domain(syslog_identifier)) + g_return_if_reached(); + + if (!prefix_take || !prefix_take[0]) + g_return_if_reached(); + + G_LOCK(log); + + gl.mut.init_pre_done = TRUE; + + gl.mut.syslog_identifier = g_strdup_printf("SYSLOG_IDENTIFIER=%s", syslog_identifier); + nm_assert(_syslog_identifier_assert(gl.imm.syslog_identifier)); + + /* we pass the allocated string on and never free it. */ + gl.mut.prefix = prefix_take; + + G_UNLOCK(log); +} + +void +nm_logging_init(const char *logging_backend, gboolean debug) +{ + gboolean fetch_monotonic_timestamp = FALSE; + gboolean obsolete_debug_backend = FALSE; + LogBackend x_log_backend; + + /* this function may be called zero or one times, and only on the + * main thread. */ + + NM_ASSERT_ON_MAIN_THREAD(); + + nm_assert(NM_IN_STRSET("" NM_CONFIG_DEFAULT_LOGGING_BACKEND, + NM_LOG_CONFIG_BACKEND_JOURNAL, + NM_LOG_CONFIG_BACKEND_SYSLOG)); + + if (gl.imm.init_done) + g_return_if_reached(); + + if (!logging_backend) + logging_backend = "" NM_CONFIG_DEFAULT_LOGGING_BACKEND; + + if (nm_streq(logging_backend, NM_LOG_CONFIG_BACKEND_DEBUG)) { + /* "debug" was wrongly documented as a valid logging backend. It makes no sense however, + * because printing to stderr only makes sense when not demonizing. Whether to daemonize + * is only controlled via command line arguments (--no-daemon, --debug) and not via the + * logging backend from configuration. + * + * Fall back to the default. */ + logging_backend = "" NM_CONFIG_DEFAULT_LOGGING_BACKEND; + obsolete_debug_backend = TRUE; + } + + G_LOCK(log); + +#if SYSTEMD_JOURNAL + if (!nm_streq(logging_backend, NM_LOG_CONFIG_BACKEND_SYSLOG)) { + x_log_backend = LOG_BACKEND_JOURNAL; + + /* We only log the monotonic-timestamp with structured logging (journal). + * Only in this case, fetch the timestamp. */ + fetch_monotonic_timestamp = TRUE; + } else +#endif + { + x_log_backend = LOG_BACKEND_SYSLOG; + openlog(syslog_identifier_domain(gl.imm.syslog_identifier), LOG_PID, LOG_DAEMON); + } + + gl.mut.init_done = TRUE; + gl.mut.log_backend = x_log_backend; + gl.mut.uses_syslog = TRUE; + gl.mut.debug_stderr = debug; + + g_log_set_handler(syslog_identifier_domain(gl.imm.syslog_identifier), + G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, + nm_log_handler, + NULL); + + G_UNLOCK(log); + + if (fetch_monotonic_timestamp) { + /* ensure we read a monotonic timestamp. Reading the timestamp the first + * time causes a logging message. We don't want to do that during _nm_log_impl. */ + nm_utils_get_monotonic_timestamp_nsec(); + } + + if (obsolete_debug_backend) + nm_log_dbg(LOGD_CORE, + "config: ignore deprecated logging backend 'debug', fallback to '%s'", + logging_backend); + + if (nm_streq(logging_backend, NM_LOG_CONFIG_BACKEND_SYSLOG)) { + /* good */ + } else if (nm_streq(logging_backend, NM_LOG_CONFIG_BACKEND_JOURNAL)) { +#if !SYSTEMD_JOURNAL + nm_log_warn(LOGD_CORE, + "config: logging backend 'journal' is not available, fallback to 'syslog'"); +#endif + } else { + nm_log_warn(LOGD_CORE, + "config: invalid logging backend '%s', fallback to '%s'", + logging_backend, +#if SYSTEMD_JOURNAL + NM_LOG_CONFIG_BACKEND_JOURNAL +#else + NM_LOG_CONFIG_BACKEND_SYSLOG +#endif + ); + } +} diff --git a/shared/nm-log-core/nm-logging.h b/shared/nm-log-core/nm-logging.h new file mode 100644 index 0000000..d3143d3 --- /dev/null +++ b/shared/nm-log-core/nm-logging.h @@ -0,0 +1,189 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2006 - 2012 Red Hat, Inc. + * Copyright (C) 2006 - 2008 Novell, Inc. + */ + +#ifndef __NETWORKMANAGER_LOGGING_H__ +#define __NETWORKMANAGER_LOGGING_H__ + +#ifdef __NM_TEST_UTILS_H__ + #error nm-test-utils.h must be included as last header +#endif + +#include "nm-glib-aux/nm-logging-fwd.h" + +#define NM_LOG_CONFIG_BACKEND_DEBUG "debug" +#define NM_LOG_CONFIG_BACKEND_SYSLOG "syslog" +#define NM_LOG_CONFIG_BACKEND_JOURNAL "journal" + +#define nm_log_err(domain, ...) nm_log(LOGL_ERR, (domain), NULL, NULL, __VA_ARGS__) +#define nm_log_warn(domain, ...) nm_log(LOGL_WARN, (domain), NULL, NULL, __VA_ARGS__) +#define nm_log_info(domain, ...) nm_log(LOGL_INFO, (domain), NULL, NULL, __VA_ARGS__) +#define nm_log_dbg(domain, ...) nm_log(LOGL_DEBUG, (domain), NULL, NULL, __VA_ARGS__) +#define nm_log_trace(domain, ...) nm_log(LOGL_TRACE, (domain), NULL, NULL, __VA_ARGS__) + +//#define _NM_LOG_FUNC G_STRFUNC +#define _NM_LOG_FUNC NULL + +/* A wrapper for the _nm_log_impl() function that adds call site information. + * Contrary to nm_log(), it unconditionally calls the function without + * checking whether logging for the given level and domain is enabled. */ +#define _nm_log_mt(mt_require_locking, level, domain, error, ifname, con_uuid, ...) \ + G_STMT_START \ + { \ + _nm_log_impl(__FILE__, \ + __LINE__, \ + _NM_LOG_FUNC, \ + (mt_require_locking), \ + (level), \ + (domain), \ + (error), \ + (ifname), \ + (con_uuid), \ + ""__VA_ARGS__); \ + } \ + G_STMT_END + +#define _nm_log(level, domain, error, ifname, con_uuid, ...) \ + _nm_log_mt(!(NM_THREAD_SAFE_ON_MAIN_THREAD), \ + level, \ + domain, \ + error, \ + ifname, \ + con_uuid, \ + __VA_ARGS__) + +/* nm_log() only evaluates its argument list after checking + * whether logging for the given level/domain is enabled. */ +#define nm_log(level, domain, ifname, con_uuid, ...) \ + G_STMT_START \ + { \ + if (nm_logging_enabled((level), (domain))) { \ + _nm_log(level, domain, 0, ifname, con_uuid, __VA_ARGS__); \ + } \ + } \ + G_STMT_END + +#define _nm_log_ptr(level, domain, ifname, con_uuid, self, prefix, ...) \ + nm_log((level), \ + (domain), \ + (ifname), \ + (con_uuid), \ + "%s[" NM_HASH_OBFUSCATE_PTR_FMT "] " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \ + (prefix) ?: "", \ + NM_HASH_OBFUSCATE_PTR(self) _NM_UTILS_MACRO_REST(__VA_ARGS__)) + +static inline gboolean +_nm_log_ptr_is_debug(NMLogLevel level) +{ + return level <= LOGL_DEBUG; +} + +/* log a message for an object (with providing a generic @self pointer) */ +#define nm_log_ptr(level, domain, ifname, con_uuid, self, prefix, ...) \ + G_STMT_START \ + { \ + if (_nm_log_ptr_is_debug(level)) { \ + _nm_log_ptr((level), (domain), (ifname), (con_uuid), (self), (prefix), __VA_ARGS__); \ + } else { \ + const char *__prefix = (prefix); \ + \ + nm_log((level), \ + (domain), \ + (ifname), \ + (con_uuid), \ + "%s%s" _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \ + __prefix ?: "", \ + __prefix ? " " : "" _NM_UTILS_MACRO_REST(__VA_ARGS__)); \ + } \ + } \ + G_STMT_END + +#define _nm_log_obj(level, domain, ifname, con_uuid, self, prefix, ...) \ + _nm_log_ptr((level), (domain), (ifname), (con_uuid), (self), prefix, __VA_ARGS__) + +/* log a message for an object (with providing a @self pointer to a GObject). + * Contrary to nm_log_ptr(), @self must be a GObject type (or %NULL). + * As of now, nm_log_obj() is identical to nm_log_ptr(), but we might change that */ +#define nm_log_obj(level, domain, ifname, con_uuid, self, prefix, ...) \ + nm_log_ptr((level), (domain), (ifname), (con_uuid), (self), prefix, __VA_ARGS__) + +const char *nm_logging_level_to_string(void); +const char *nm_logging_domains_to_string(void); + +/*****************************************************************************/ + +extern NMLogDomain _nm_logging_enabled_state[_LOGL_N_REAL]; + +static inline gboolean +_nm_logging_enabled_lockfree(NMLogLevel level, NMLogDomain domain) +{ + nm_assert(((guint) level) < G_N_ELEMENTS(_nm_logging_enabled_state)); + return (((guint) level) < G_N_ELEMENTS(_nm_logging_enabled_state)) + && !!(_nm_logging_enabled_state[level] & domain); +} + +gboolean _nm_logging_enabled_locking(NMLogLevel level, NMLogDomain domain); + +static inline gboolean +nm_logging_enabled_mt(gboolean mt_require_locking, NMLogLevel level, NMLogDomain domain) +{ + if (mt_require_locking) + return _nm_logging_enabled_locking(level, domain); + + NM_ASSERT_ON_MAIN_THREAD(); + return _nm_logging_enabled_lockfree(level, domain); +} + +#define nm_logging_enabled(level, domain) \ + nm_logging_enabled_mt(!(NM_THREAD_SAFE_ON_MAIN_THREAD), level, domain) + +/*****************************************************************************/ + +NMLogLevel nm_logging_get_level(NMLogDomain domain); + +const char *nm_logging_all_levels_to_string(void); +const char *nm_logging_all_domains_to_string(void); + +gboolean +nm_logging_setup(const char *level, const char *domains, char **bad_domains, GError **error); + +void nm_logging_init_pre(const char *syslog_identifier, char *prefix_take); + +void nm_logging_init(const char *logging_backend, gboolean debug); + +gboolean nm_logging_syslog_enabled(void); + +/*****************************************************************************/ + +#define __NMLOG_DEFAULT(level, domain, prefix, ...) \ + G_STMT_START \ + { \ + nm_log((level), \ + (domain), \ + NULL, \ + NULL, \ + "%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \ + (prefix) _NM_UTILS_MACRO_REST(__VA_ARGS__)); \ + } \ + G_STMT_END + +#define __NMLOG_DEFAULT_WITH_ADDR(level, domain, prefix, ...) \ + G_STMT_START \ + { \ + nm_log((level), \ + (domain), \ + NULL, \ + NULL, \ + "%s[" NM_HASH_OBFUSCATE_PTR_FMT "]: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \ + (prefix), \ + NM_HASH_OBFUSCATE_PTR(self) _NM_UTILS_MACRO_REST(__VA_ARGS__)); \ + } \ + G_STMT_END + +/*****************************************************************************/ + +extern void _nm_logging_clear_platform_logging_cache(void); + +#endif /* __NETWORKMANAGER_LOGGING_H__ */ diff --git a/shared/nm-platform/nm-netlink.c b/shared/nm-platform/nm-netlink.c new file mode 100644 index 0000000..f9ebd1b --- /dev/null +++ b/shared/nm-platform/nm-netlink.c @@ -0,0 +1,1518 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2018 Red Hat, Inc. + */ + +#include "nm-default.h" + +#include "nm-netlink.h" + +#include +#include + +/*****************************************************************************/ + +#ifndef SOL_NETLINK + #define SOL_NETLINK 270 +#endif + +/*****************************************************************************/ + +#define NL_SOCK_PASSCRED (1 << 1) +#define NL_MSG_PEEK (1 << 3) +#define NL_MSG_PEEK_EXPLICIT (1 << 4) +#define NL_NO_AUTO_ACK (1 << 5) + +#ifndef NETLINK_EXT_ACK + #define NETLINK_EXT_ACK 11 +#endif + +struct nl_msg { + int nm_protocol; + struct sockaddr_nl nm_src; + struct sockaddr_nl nm_dst; + struct ucred nm_creds; + struct nlmsghdr * nm_nlh; + size_t nm_size; + bool nm_creds_has : 1; +}; + +struct nl_sock { + struct sockaddr_nl s_local; + struct sockaddr_nl s_peer; + int s_fd; + int s_proto; + unsigned int s_seq_next; + unsigned int s_seq_expect; + int s_flags; + size_t s_bufsize; +}; + +/*****************************************************************************/ + +NM_UTILS_ENUM2STR_DEFINE(nl_nlmsgtype2str, + int, + NM_UTILS_ENUM2STR(NLMSG_NOOP, "NOOP"), + NM_UTILS_ENUM2STR(NLMSG_ERROR, "ERROR"), + NM_UTILS_ENUM2STR(NLMSG_DONE, "DONE"), + NM_UTILS_ENUM2STR(NLMSG_OVERRUN, "OVERRUN"), ); + +NM_UTILS_FLAGS2STR_DEFINE(nl_nlmsg_flags2str, + int, + NM_UTILS_FLAGS2STR(NLM_F_REQUEST, "REQUEST"), + NM_UTILS_FLAGS2STR(NLM_F_MULTI, "MULTI"), + NM_UTILS_FLAGS2STR(NLM_F_ACK, "ACK"), + NM_UTILS_FLAGS2STR(NLM_F_ECHO, "ECHO"), + NM_UTILS_FLAGS2STR(NLM_F_ROOT, "ROOT"), + NM_UTILS_FLAGS2STR(NLM_F_MATCH, "MATCH"), + NM_UTILS_FLAGS2STR(NLM_F_ATOMIC, "ATOMIC"), + NM_UTILS_FLAGS2STR(NLM_F_REPLACE, "REPLACE"), + NM_UTILS_FLAGS2STR(NLM_F_EXCL, "EXCL"), + NM_UTILS_FLAGS2STR(NLM_F_CREATE, "CREATE"), + NM_UTILS_FLAGS2STR(NLM_F_APPEND, "APPEND"), ); + +/*****************************************************************************/ + +const char * +nl_nlmsghdr_to_str(const struct nlmsghdr *hdr, char *buf, gsize len) +{ + const char *b; + const char *s; + guint flags, flags_before; + const char *prefix; + + if (!nm_utils_to_string_buffer_init_null(hdr, &buf, &len)) + return buf; + + b = buf; + + switch (hdr->nlmsg_type) { + case RTM_GETLINK: + s = "RTM_GETLINK"; + break; + case RTM_NEWLINK: + s = "RTM_NEWLINK"; + break; + case RTM_DELLINK: + s = "RTM_DELLINK"; + break; + case RTM_SETLINK: + s = "RTM_SETLINK"; + break; + case RTM_GETADDR: + s = "RTM_GETADDR"; + break; + case RTM_NEWADDR: + s = "RTM_NEWADDR"; + break; + case RTM_DELADDR: + s = "RTM_DELADDR"; + break; + case RTM_GETROUTE: + s = "RTM_GETROUTE"; + break; + case RTM_NEWROUTE: + s = "RTM_NEWROUTE"; + break; + case RTM_DELROUTE: + s = "RTM_DELROUTE"; + break; + case RTM_GETRULE: + s = "RTM_GETRULE"; + break; + case RTM_NEWRULE: + s = "RTM_NEWRULE"; + break; + case RTM_DELRULE: + s = "RTM_DELRULE"; + break; + case RTM_GETQDISC: + s = "RTM_GETQDISC"; + break; + case RTM_NEWQDISC: + s = "RTM_NEWQDISC"; + break; + case RTM_DELQDISC: + s = "RTM_DELQDISC"; + break; + case RTM_GETTFILTER: + s = "RTM_GETTFILTER"; + break; + case RTM_NEWTFILTER: + s = "RTM_NEWTFILTER"; + break; + case RTM_DELTFILTER: + s = "RTM_DELTFILTER"; + break; + case NLMSG_NOOP: + s = "NLMSG_NOOP"; + break; + case NLMSG_ERROR: + s = "NLMSG_ERROR"; + break; + case NLMSG_DONE: + s = "NLMSG_DONE"; + break; + case NLMSG_OVERRUN: + s = "NLMSG_OVERRUN"; + break; + default: + s = NULL; + break; + } + + if (s) + nm_utils_strbuf_append_str(&buf, &len, s); + else + nm_utils_strbuf_append(&buf, &len, "(%u)", (unsigned) hdr->nlmsg_type); + + flags = hdr->nlmsg_flags; + + if (!flags) { + nm_utils_strbuf_append_str(&buf, &len, ", flags 0"); + goto flags_done; + } + +#define _F(f, n) \ + G_STMT_START \ + { \ + if (NM_FLAGS_ALL(flags, f)) { \ + flags &= ~(f); \ + nm_utils_strbuf_append(&buf, &len, "%s%s", prefix, n); \ + if (!flags) \ + goto flags_done; \ + prefix = ","; \ + } \ + } \ + G_STMT_END + + prefix = ", flags "; + flags_before = flags; + _F(NLM_F_REQUEST, "request"); + _F(NLM_F_MULTI, "multi"); + _F(NLM_F_ACK, "ack"); + _F(NLM_F_ECHO, "echo"); + _F(NLM_F_DUMP_INTR, "dump_intr"); + _F(0x20 /*NLM_F_DUMP_FILTERED*/, "dump_filtered"); + + if (flags_before != flags) + prefix = ";"; + + switch (hdr->nlmsg_type) { + case RTM_NEWLINK: + case RTM_NEWADDR: + case RTM_NEWROUTE: + case RTM_NEWQDISC: + case RTM_NEWTFILTER: + _F(NLM_F_REPLACE, "replace"); + _F(NLM_F_EXCL, "excl"); + _F(NLM_F_CREATE, "create"); + _F(NLM_F_APPEND, "append"); + break; + case RTM_GETLINK: + case RTM_GETADDR: + case RTM_GETROUTE: + case RTM_DELQDISC: + case RTM_DELTFILTER: + _F(NLM_F_DUMP, "dump"); + _F(NLM_F_ROOT, "root"); + _F(NLM_F_MATCH, "match"); + _F(NLM_F_ATOMIC, "atomic"); + break; + } + +#undef _F + + if (flags_before != flags) + prefix = ";"; + nm_utils_strbuf_append(&buf, &len, "%s0x%04x", prefix, flags); + +flags_done: + + nm_utils_strbuf_append(&buf, &len, ", seq %u", (unsigned) hdr->nlmsg_seq); + + return b; +} + +/*****************************************************************************/ + +struct nlmsghdr * +nlmsg_hdr(struct nl_msg *n) +{ + return n->nm_nlh; +} + +void * +nlmsg_reserve(struct nl_msg *n, size_t len, int pad) +{ + char * buf = (char *) n->nm_nlh; + size_t nlmsg_len = n->nm_nlh->nlmsg_len; + size_t tlen; + + nm_assert(pad >= 0); + + if (len > n->nm_size) + return NULL; + + tlen = pad ? ((len + (pad - 1)) & ~(pad - 1)) : len; + + if ((tlen + nlmsg_len) > n->nm_size) + return NULL; + + buf += nlmsg_len; + n->nm_nlh->nlmsg_len += tlen; + + if (tlen > len) + memset(buf + len, 0, tlen - len); + + return buf; +} + +/*****************************************************************************/ + +struct nlattr * +nla_reserve(struct nl_msg *msg, int attrtype, int attrlen) +{ + struct nlattr *nla; + int tlen; + + if (attrlen < 0) + return NULL; + + tlen = NLMSG_ALIGN(msg->nm_nlh->nlmsg_len) + nla_total_size(attrlen); + + if (tlen > msg->nm_size) + return NULL; + + nla = (struct nlattr *) nlmsg_tail(msg->nm_nlh); + nla->nla_type = attrtype; + nla->nla_len = nla_attr_size(attrlen); + + if (attrlen) + memset((unsigned char *) nla + nla->nla_len, 0, nla_padlen(attrlen)); + msg->nm_nlh->nlmsg_len = tlen; + + return nla; +} + +/*****************************************************************************/ + +struct nl_msg * +nlmsg_alloc_size(size_t len) +{ + struct nl_msg *nm; + + if (len < sizeof(struct nlmsghdr)) + len = sizeof(struct nlmsghdr); + + nm = g_slice_new(struct nl_msg); + *nm = (struct nl_msg){ + .nm_protocol = -1, + .nm_size = len, + .nm_nlh = g_malloc0(len), + }; + nm->nm_nlh->nlmsg_len = nlmsg_total_size(0); + return nm; +} + +/** + * Allocate a new netlink message with the default maximum payload size. + * + * Allocates a new netlink message without any further payload. The + * maximum payload size defaults to PAGESIZE or as otherwise specified + * with nlmsg_set_default_size(). + * + * @return Newly allocated netlink message or NULL. + */ +struct nl_msg * +nlmsg_alloc(void) +{ + return nlmsg_alloc_size(nm_utils_getpagesize()); +} + +struct nl_msg * +nlmsg_alloc_convert(struct nlmsghdr *hdr) +{ + struct nl_msg *nm; + + nm = nlmsg_alloc_size(NLMSG_ALIGN(hdr->nlmsg_len)); + memcpy(nm->nm_nlh, hdr, hdr->nlmsg_len); + return nm; +} + +struct nl_msg * +nlmsg_alloc_simple(int nlmsgtype, int flags) +{ + struct nl_msg *nm; + struct nlmsghdr *new; + + nm = nlmsg_alloc(); + new = nm->nm_nlh; + new->nlmsg_type = nlmsgtype; + new->nlmsg_flags = flags; + return nm; +} + +void +nlmsg_free(struct nl_msg *msg) +{ + if (!msg) + return; + + g_free(msg->nm_nlh); + g_slice_free(struct nl_msg, msg); +} + +/*****************************************************************************/ + +int +nlmsg_append(struct nl_msg *n, const void *data, size_t len, int pad) +{ + void *tmp; + + nm_assert(n); + nm_assert(data); + nm_assert(len > 0); + nm_assert(pad >= 0); + + tmp = nlmsg_reserve(n, len, pad); + if (tmp == NULL) + return -ENOMEM; + + memcpy(tmp, data, len); + return 0; +} + +/*****************************************************************************/ + +int +nlmsg_parse(struct nlmsghdr * nlh, + int hdrlen, + struct nlattr * tb[], + int maxtype, + const struct nla_policy *policy) +{ + if (!nlmsg_valid_hdr(nlh, hdrlen)) + return -NME_NL_MSG_TOOSHORT; + + return nla_parse(tb, maxtype, nlmsg_attrdata(nlh, hdrlen), nlmsg_attrlen(nlh, hdrlen), policy); +} + +struct nlmsghdr * +nlmsg_put(struct nl_msg *n, uint32_t pid, uint32_t seq, int type, int payload, int flags) +{ + struct nlmsghdr *nlh; + + if (n->nm_nlh->nlmsg_len < NLMSG_HDRLEN) + g_return_val_if_reached(NULL); + + nlh = (struct nlmsghdr *) n->nm_nlh; + nlh->nlmsg_type = type; + nlh->nlmsg_flags = flags; + nlh->nlmsg_pid = pid; + nlh->nlmsg_seq = seq; + + if (payload > 0 && nlmsg_reserve(n, payload, NLMSG_ALIGNTO) == NULL) + return NULL; + + return nlh; +} + +size_t +nla_strlcpy(char *dst, const struct nlattr *nla, size_t dstsize) +{ + const char *src; + size_t srclen; + size_t len; + + /* - Always writes @dstsize bytes to @dst + * - Copies the first non-NUL characters to @dst. + * Any characters after the first NUL bytes in @nla are ignored. + * - If the string @nla is longer than @dstsize, the string + * gets truncated. @dst will always be NUL terminated. */ + + if (G_UNLIKELY(dstsize <= 1)) { + if (dstsize == 1) + dst[0] = '\0'; + if (nla && (srclen = nla_len(nla)) > 0) + return strnlen(nla_data(nla), srclen); + return 0; + } + + nm_assert(dst); + + if (nla) { + srclen = nla_len(nla); + if (srclen > 0) { + src = nla_data(nla); + srclen = strnlen(src, srclen); + if (srclen > 0) { + len = NM_MIN(dstsize - 1, srclen); + memcpy(dst, src, len); + memset(&dst[len], 0, dstsize - len); + return srclen; + } + } + } + + memset(dst, 0, dstsize); + return 0; +} + +size_t +nla_memcpy(void *dst, const struct nlattr *nla, size_t dstsize) +{ + size_t len; + int srclen; + + if (!nla) + return 0; + + srclen = nla_len(nla); + + if (srclen <= 0) { + nm_assert(srclen == 0); + return 0; + } + + len = NM_MIN((size_t) srclen, dstsize); + if (len > 0) { + /* there is a crucial difference between nla_strlcpy() and nla_memcpy(). + * The former always write @dstsize bytes (akin to strncpy()), here, we only + * write the bytes that we actually have (leaving the remainder undefined). */ + memcpy(dst, nla_data(nla), len); + } + + return srclen; +} + +int +nla_put(struct nl_msg *msg, int attrtype, int datalen, const void *data) +{ + struct nlattr *nla; + + nla = nla_reserve(msg, attrtype, datalen); + if (!nla) { + if (datalen < 0) + g_return_val_if_reached(-NME_BUG); + + return -ENOMEM; + } + + if (datalen > 0) + memcpy(nla_data(nla), data, datalen); + + return 0; +} + +struct nlattr * +nla_find(const struct nlattr *head, int len, int attrtype) +{ + const struct nlattr *nla; + int rem; + + nla_for_each_attr (nla, head, len, rem) { + if (nla_type(nla) == attrtype) + return (struct nlattr *) nla; + } + + return NULL; +} + +void +nla_nest_cancel(struct nl_msg *msg, const struct nlattr *attr) +{ + ssize_t len; + + len = (char *) nlmsg_tail(msg->nm_nlh) - (char *) attr; + if (len < 0) + g_return_if_reached(); + else if (len > 0) { + msg->nm_nlh->nlmsg_len -= len; + memset(nlmsg_tail(msg->nm_nlh), 0, len); + } +} + +struct nlattr * +nla_nest_start(struct nl_msg *msg, int attrtype) +{ + struct nlattr *start = (struct nlattr *) nlmsg_tail(msg->nm_nlh); + + if (nla_put(msg, NLA_F_NESTED | attrtype, 0, NULL) < 0) + return NULL; + + return start; +} + +static int +_nest_end(struct nl_msg *msg, struct nlattr *start, int keep_empty) +{ + size_t pad, len; + + len = (char *) nlmsg_tail(msg->nm_nlh) - (char *) start; + + if (len > USHRT_MAX || (!keep_empty && len == NLA_HDRLEN)) { + /* + * Max nlattr size exceeded or empty nested attribute, trim the + * attribute header again + */ + nla_nest_cancel(msg, start); + + /* Return error only if nlattr size was exceeded */ + return (len == NLA_HDRLEN) ? 0 : -NME_NL_ATTRSIZE; + } + + start->nla_len = len; + + pad = NLMSG_ALIGN(msg->nm_nlh->nlmsg_len) - msg->nm_nlh->nlmsg_len; + if (pad > 0) { + /* + * Data inside attribute does not end at a alignment boundary. + * Pad accordingly and account for the additional space in + * the message. nlmsg_reserve() may never fail in this situation, + * the allocate message buffer must be a multiple of NLMSG_ALIGNTO. + */ + if (!nlmsg_reserve(msg, pad, 0)) + g_return_val_if_reached(-NME_BUG); + } + + return 0; +} + +int +nla_nest_end(struct nl_msg *msg, struct nlattr *start) +{ + return _nest_end(msg, start, 0); +} + +static const uint16_t nla_attr_minlen[NLA_TYPE_MAX + 1] = { + [NLA_U8] = sizeof(uint8_t), + [NLA_U16] = sizeof(uint16_t), + [NLA_U32] = sizeof(uint32_t), + [NLA_U64] = sizeof(uint64_t), + [NLA_STRING] = 1, + [NLA_FLAG] = 0, +}; + +static int +validate_nla(const struct nlattr *nla, int maxtype, const struct nla_policy *policy) +{ + const struct nla_policy *pt; + unsigned int minlen = 0; + int type = nla_type(nla); + + if (type < 0 || type > maxtype) + return 0; + + pt = &policy[type]; + + if (pt->type > NLA_TYPE_MAX) + g_return_val_if_reached(-NME_BUG); + + if (pt->minlen) + minlen = pt->minlen; + else if (pt->type != NLA_UNSPEC) + minlen = nla_attr_minlen[pt->type]; + + if (nla_len(nla) < minlen) + return -NME_UNSPEC; + + if (pt->maxlen && nla_len(nla) > pt->maxlen) + return -NME_UNSPEC; + + if (pt->type == NLA_STRING) { + const char *data; + + nm_assert(minlen > 0); + + data = nla_data(nla); + if (data[nla_len(nla) - 1] != '\0') + return -NME_UNSPEC; + } + + return 0; +} + +int +nla_parse(struct nlattr * tb[], + int maxtype, + struct nlattr * head, + int len, + const struct nla_policy *policy) +{ + struct nlattr *nla; + int rem, nmerr; + + memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1)); + + nla_for_each_attr (nla, head, len, rem) { + int type = nla_type(nla); + + if (type > maxtype) + continue; + + if (policy) { + nmerr = validate_nla(nla, maxtype, policy); + if (nmerr < 0) + return nmerr; + } + + tb[type] = nla; + } + + return 0; +} + +/*****************************************************************************/ + +int +nlmsg_get_proto(struct nl_msg *msg) +{ + return msg->nm_protocol; +} + +void +nlmsg_set_proto(struct nl_msg *msg, int protocol) +{ + msg->nm_protocol = protocol; +} + +void +nlmsg_set_src(struct nl_msg *msg, struct sockaddr_nl *addr) +{ + memcpy(&msg->nm_src, addr, sizeof(*addr)); +} + +struct ucred * +nlmsg_get_creds(struct nl_msg *msg) +{ + if (msg->nm_creds_has) + return &msg->nm_creds; + return NULL; +} + +void +nlmsg_set_creds(struct nl_msg *msg, struct ucred *creds) +{ + if (creds) { + memcpy(&msg->nm_creds, creds, sizeof(*creds)); + msg->nm_creds_has = TRUE; + } else + msg->nm_creds_has = FALSE; +} + +/*****************************************************************************/ + +void * +genlmsg_put(struct nl_msg *msg, + uint32_t port, + uint32_t seq, + int family, + int hdrlen, + int flags, + uint8_t cmd, + uint8_t version) +{ + struct nlmsghdr * nlh; + struct genlmsghdr hdr = { + .cmd = cmd, + .version = version, + }; + + nlh = nlmsg_put(msg, port, seq, family, GENL_HDRLEN + hdrlen, flags); + if (nlh == NULL) + return NULL; + + memcpy(nlmsg_data(nlh), &hdr, sizeof(hdr)); + + return (char *) nlmsg_data(nlh) + GENL_HDRLEN; +} + +void * +genlmsg_data(const struct genlmsghdr *gnlh) +{ + return ((unsigned char *) gnlh + GENL_HDRLEN); +} + +void * +genlmsg_user_hdr(const struct genlmsghdr *gnlh) +{ + return genlmsg_data(gnlh); +} + +struct genlmsghdr * +genlmsg_hdr(struct nlmsghdr *nlh) +{ + return nlmsg_data(nlh); +} + +void * +genlmsg_user_data(const struct genlmsghdr *gnlh, const int hdrlen) +{ + return (char *) genlmsg_user_hdr(gnlh) + NLMSG_ALIGN(hdrlen); +} + +struct nlattr * +genlmsg_attrdata(const struct genlmsghdr *gnlh, int hdrlen) +{ + return genlmsg_user_data(gnlh, hdrlen); +} + +int +genlmsg_len(const struct genlmsghdr *gnlh) +{ + const struct nlmsghdr *nlh; + + nlh = (const struct nlmsghdr *) ((const unsigned char *) gnlh - NLMSG_HDRLEN); + return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN); +} + +int +genlmsg_attrlen(const struct genlmsghdr *gnlh, int hdrlen) +{ + return genlmsg_len(gnlh) - NLMSG_ALIGN(hdrlen); +} + +int +genlmsg_valid_hdr(struct nlmsghdr *nlh, int hdrlen) +{ + struct genlmsghdr *ghdr; + + if (!nlmsg_valid_hdr(nlh, GENL_HDRLEN)) + return 0; + + ghdr = nlmsg_data(nlh); + if (genlmsg_len(ghdr) < NLMSG_ALIGN(hdrlen)) + return 0; + + return 1; +} + +int +genlmsg_parse(struct nlmsghdr * nlh, + int hdrlen, + struct nlattr * tb[], + int maxtype, + const struct nla_policy *policy) +{ + struct genlmsghdr *ghdr; + + if (!genlmsg_valid_hdr(nlh, hdrlen)) + return -NME_NL_MSG_TOOSHORT; + + ghdr = nlmsg_data(nlh); + return nla_parse(tb, + maxtype, + genlmsg_attrdata(ghdr, hdrlen), + genlmsg_attrlen(ghdr, hdrlen), + policy); +} + +static int +_genl_parse_getfamily(struct nl_msg *msg, void *arg) +{ + static const struct nla_policy ctrl_policy[] = { + [CTRL_ATTR_FAMILY_ID] = {.type = NLA_U16}, + [CTRL_ATTR_FAMILY_NAME] = {.type = NLA_STRING, .maxlen = GENL_NAMSIZ}, + [CTRL_ATTR_VERSION] = {.type = NLA_U32}, + [CTRL_ATTR_HDRSIZE] = {.type = NLA_U32}, + [CTRL_ATTR_MAXATTR] = {.type = NLA_U32}, + [CTRL_ATTR_OPS] = {.type = NLA_NESTED}, + [CTRL_ATTR_MCAST_GROUPS] = {.type = NLA_NESTED}, + }; + struct nlattr * tb[G_N_ELEMENTS(ctrl_policy)]; + struct nlmsghdr *nlh = nlmsg_hdr(msg); + gint32 * response_data = arg; + + if (genlmsg_parse_arr(nlh, 0, tb, ctrl_policy) < 0) + return NL_SKIP; + + if (tb[CTRL_ATTR_FAMILY_ID]) + *response_data = nla_get_u16(tb[CTRL_ATTR_FAMILY_ID]); + + return NL_STOP; +} + +int +genl_ctrl_resolve(struct nl_sock *sk, const char *name) +{ + nm_auto_nlmsg struct nl_msg *msg = NULL; + int nmerr; + gint32 response_data = -1; + const struct nl_cb cb = { + .valid_cb = _genl_parse_getfamily, + .valid_arg = &response_data, + }; + + msg = nlmsg_alloc(); + + if (!genlmsg_put(msg, NL_AUTO_PORT, NL_AUTO_SEQ, GENL_ID_CTRL, 0, 0, CTRL_CMD_GETFAMILY, 1)) + return -ENOMEM; + + nmerr = nla_put_string(msg, CTRL_ATTR_FAMILY_NAME, name); + if (nmerr < 0) + return nmerr; + + nmerr = nl_send_auto(sk, msg); + if (nmerr < 0) + return nmerr; + + nmerr = nl_recvmsgs(sk, &cb); + if (nmerr < 0) + return nmerr; + + /* If search was successful, request may be ACKed after data */ + nmerr = nl_wait_for_ack(sk, NULL); + if (nmerr < 0) + return nmerr; + + if (response_data < 0) + return -NME_UNSPEC; + + return response_data; +} + +/*****************************************************************************/ + +struct nl_sock * +nl_socket_alloc(void) +{ + struct nl_sock *sk; + + sk = g_slice_new0(struct nl_sock); + + sk->s_fd = -1; + sk->s_local.nl_family = AF_NETLINK; + sk->s_peer.nl_family = AF_NETLINK; + sk->s_seq_expect = sk->s_seq_next = time(NULL); + + return sk; +} + +void +nl_socket_free(struct nl_sock *sk) +{ + if (!sk) + return; + + if (sk->s_fd >= 0) + nm_close(sk->s_fd); + g_slice_free(struct nl_sock, sk); +} + +int +nl_socket_get_fd(const struct nl_sock *sk) +{ + return sk->s_fd; +} + +uint32_t +nl_socket_get_local_port(const struct nl_sock *sk) +{ + return sk->s_local.nl_pid; +} + +size_t +nl_socket_get_msg_buf_size(struct nl_sock *sk) +{ + return sk->s_bufsize; +} + +int +nl_socket_set_passcred(struct nl_sock *sk, int state) +{ + int err; + + if (sk->s_fd == -1) + return -NME_NL_BAD_SOCK; + + err = setsockopt(sk->s_fd, SOL_SOCKET, SO_PASSCRED, &state, sizeof(state)); + if (err < 0) + return -nm_errno_from_native(errno); + + if (state) + sk->s_flags |= NL_SOCK_PASSCRED; + else + sk->s_flags &= ~NL_SOCK_PASSCRED; + + return 0; +} + +int +nl_socket_set_msg_buf_size(struct nl_sock *sk, size_t bufsize) +{ + sk->s_bufsize = bufsize; + + return 0; +} + +struct sockaddr_nl * +nlmsg_get_dst(struct nl_msg *msg) +{ + return &msg->nm_dst; +} + +int +nl_socket_set_nonblocking(const struct nl_sock *sk) +{ + if (sk->s_fd == -1) + return -NME_NL_BAD_SOCK; + + if (fcntl(sk->s_fd, F_SETFL, O_NONBLOCK) < 0) + return -nm_errno_from_native(errno); + + return 0; +} + +int +nl_socket_set_buffer_size(struct nl_sock *sk, int rxbuf, int txbuf) +{ + int err; + + if (rxbuf <= 0) + rxbuf = 32768; + + if (txbuf <= 0) + txbuf = 32768; + + if (sk->s_fd == -1) + return -NME_NL_BAD_SOCK; + + err = setsockopt(sk->s_fd, SOL_SOCKET, SO_SNDBUF, &txbuf, sizeof(txbuf)); + if (err < 0) { + return -nm_errno_from_native(errno); + } + + err = setsockopt(sk->s_fd, SOL_SOCKET, SO_RCVBUF, &rxbuf, sizeof(rxbuf)); + if (err < 0) { + return -nm_errno_from_native(errno); + } + + return 0; +} + +int +nl_socket_add_memberships(struct nl_sock *sk, int group, ...) +{ + int err; + va_list ap; + + if (sk->s_fd == -1) + return -NME_NL_BAD_SOCK; + + va_start(ap, group); + + while (group != 0) { + if (group < 0) { + va_end(ap); + g_return_val_if_reached(-NME_BUG); + } + + err = setsockopt(sk->s_fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, &group, sizeof(group)); + if (err < 0) { + int errsv = errno; + + va_end(ap); + return -nm_errno_from_native(errsv); + } + + group = va_arg(ap, int); + } + + va_end(ap); + + return 0; +} + +int +nl_socket_set_ext_ack(struct nl_sock *sk, gboolean enable) +{ + int err, val; + + if (sk->s_fd == -1) + return -NME_NL_BAD_SOCK; + + val = !!enable; + err = setsockopt(sk->s_fd, SOL_NETLINK, NETLINK_EXT_ACK, &val, sizeof(val)); + if (err < 0) + return -nm_errno_from_native(errno); + + return 0; +} + +void +nl_socket_disable_msg_peek(struct nl_sock *sk) +{ + sk->s_flags |= NL_MSG_PEEK_EXPLICIT; + sk->s_flags &= ~NL_MSG_PEEK; +} + +int +nl_connect(struct nl_sock *sk, int protocol) +{ + int err, nmerr; + socklen_t addrlen; + struct sockaddr_nl local = {0}; + + if (sk->s_fd != -1) + return -NME_NL_BAD_SOCK; + + sk->s_fd = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, protocol); + if (sk->s_fd < 0) { + nmerr = -nm_errno_from_native(errno); + goto errout; + } + + nmerr = nl_socket_set_buffer_size(sk, 0, 0); + if (nmerr < 0) + goto errout; + + nm_assert(sk->s_local.nl_pid == 0); + + err = bind(sk->s_fd, (struct sockaddr *) &sk->s_local, sizeof(sk->s_local)); + if (err != 0) { + nmerr = -nm_errno_from_native(errno); + goto errout; + } + + addrlen = sizeof(local); + err = getsockname(sk->s_fd, (struct sockaddr *) &local, &addrlen); + if (err < 0) { + nmerr = -nm_errno_from_native(errno); + goto errout; + } + + if (addrlen != sizeof(local)) { + nmerr = -NME_UNSPEC; + goto errout; + } + + if (local.nl_family != AF_NETLINK) { + nmerr = -NME_UNSPEC; + goto errout; + } + + sk->s_local = local; + sk->s_proto = protocol; + + return 0; + +errout: + if (sk->s_fd != -1) { + close(sk->s_fd); + sk->s_fd = -1; + } + return nmerr; +} + +/*****************************************************************************/ + +static void +_cb_init(struct nl_cb *dst, const struct nl_cb *src) +{ + nm_assert(dst); + + if (src) + *dst = *src; + else + memset(dst, 0, sizeof(*dst)); +} + +static int +ack_wait_handler(struct nl_msg *msg, void *arg) +{ + return NL_STOP; +} + +int +nl_wait_for_ack(struct nl_sock *sk, const struct nl_cb *cb) +{ + struct nl_cb cb2; + + _cb_init(&cb2, cb); + cb2.ack_cb = ack_wait_handler; + return nl_recvmsgs(sk, &cb2); +} + +#define NL_CB_CALL(cb, type, msg) \ + do { \ + const struct nl_cb *_cb = (cb); \ + \ + if (_cb && _cb->type##_cb) { \ + /* the returned value here must be either a negative + * netlink error number, or one of NL_SKIP, NL_STOP, NL_OK. */ \ + nmerr = _cb->type##_cb((msg), _cb->type##_arg); \ + switch (nmerr) { \ + case NL_OK: \ + nm_assert(nmerr == 0); \ + break; \ + case NL_SKIP: \ + goto skip; \ + case NL_STOP: \ + goto stop; \ + default: \ + if (nmerr >= 0) { \ + nm_assert_not_reached(); \ + nmerr = -NME_BUG; \ + } \ + goto out; \ + } \ + } \ + } while (0) + +int +nl_recvmsgs(struct nl_sock *sk, const struct nl_cb *cb) +{ + int n, nmerr = 0, multipart = 0, interrupted = 0, nrecv = 0; + gs_free unsigned char *buf = NULL; + struct nlmsghdr * hdr; + struct sockaddr_nl nla = {0}; + struct ucred creds; + gboolean creds_has; + +continue_reading: + n = nl_recv(sk, &nla, &buf, &creds, &creds_has); + if (n <= 0) + return n; + + hdr = (struct nlmsghdr *) buf; + while (nlmsg_ok(hdr, n)) { + nm_auto_nlmsg struct nl_msg *msg = NULL; + + msg = nlmsg_alloc_convert(hdr); + + nlmsg_set_proto(msg, sk->s_proto); + nlmsg_set_src(msg, &nla); + nlmsg_set_creds(msg, creds_has ? &creds : NULL); + + nrecv++; + + /* Only do sequence checking if auto-ack mode is enabled */ + if (!(sk->s_flags & NL_NO_AUTO_ACK)) { + if (hdr->nlmsg_seq != sk->s_seq_expect) { + nmerr = -NME_NL_SEQ_MISMATCH; + goto out; + } + } + + if (hdr->nlmsg_type == NLMSG_DONE || hdr->nlmsg_type == NLMSG_ERROR + || hdr->nlmsg_type == NLMSG_NOOP || hdr->nlmsg_type == NLMSG_OVERRUN) { + /* We can't check for !NLM_F_MULTI since some netlink + * users in the kernel are broken. */ + sk->s_seq_expect++; + } + + if (hdr->nlmsg_flags & NLM_F_MULTI) + multipart = 1; + + if (hdr->nlmsg_flags & NLM_F_DUMP_INTR) { + /* + * We have to continue reading to clear + * all messages until a NLMSG_DONE is + * received and report the inconsistency. + */ + interrupted = 1; + } + + /* messages terminates a multipart message, this is + * usually the end of a message and therefore we slip + * out of the loop by default. the user may overrule + * this action by skipping this packet. */ + if (hdr->nlmsg_type == NLMSG_DONE) { + multipart = 0; + NL_CB_CALL(cb, finish, msg); + } + + /* Message to be ignored, the default action is to + * skip this message if no callback is specified. The + * user may overrule this action by returning + * NL_PROCEED. */ + else if (hdr->nlmsg_type == NLMSG_NOOP) + goto skip; + + /* Data got lost, report back to user. The default action is to + * quit parsing. The user may overrule this action by returning + * NL_SKIP or NL_PROCEED (dangerous) */ + else if (hdr->nlmsg_type == NLMSG_OVERRUN) { + nmerr = -NME_NL_MSG_OVERFLOW; + goto out; + } + + /* Message carries a nlmsgerr */ + else if (hdr->nlmsg_type == NLMSG_ERROR) { + struct nlmsgerr *e = nlmsg_data(hdr); + + if (hdr->nlmsg_len < nlmsg_size(sizeof(*e))) { + /* Truncated error message, the default action + * is to stop parsing. The user may overrule + * this action by returning NL_SKIP or + * NL_PROCEED (dangerous) */ + nmerr = -NME_NL_MSG_TRUNC; + goto out; + } + if (e->error) { + /* Error message reported back from kernel. */ + if (cb && cb->err_cb) { + /* the returned value here must be either a negative + * netlink error number, or one of NL_SKIP, NL_STOP, NL_OK. */ + nmerr = cb->err_cb(&nla, e, cb->err_arg); + if (nmerr < 0) + goto out; + else if (nmerr == NL_SKIP) + goto skip; + else if (nmerr == NL_STOP) { + nmerr = -nm_errno_from_native(e->error); + goto out; + } + nm_assert(nmerr == NL_OK); + } else { + nmerr = -nm_errno_from_native(e->error); + goto out; + } + } else + NL_CB_CALL(cb, ack, msg); + } else { + /* Valid message (not checking for MULTIPART bit to + * get along with broken kernels. NL_SKIP has no + * effect on this. */ + NL_CB_CALL(cb, valid, msg); + } +skip: + nmerr = 0; + hdr = nlmsg_next(hdr, &n); + } + + if (multipart) { + /* Multipart message not yet complete, continue reading */ + nm_clear_g_free(&buf); + + nmerr = 0; + goto continue_reading; + } + +stop: + nmerr = 0; + +out: + if (interrupted) + nmerr = -NME_NL_DUMP_INTR; + + nm_assert(nmerr <= 0); + return nmerr ?: nrecv; +} + +int +nl_sendmsg(struct nl_sock *sk, struct nl_msg *msg, struct msghdr *hdr) +{ + int ret; + + if (sk->s_fd < 0) + return -NME_NL_BAD_SOCK; + + nlmsg_set_src(msg, &sk->s_local); + + ret = sendmsg(sk->s_fd, hdr, 0); + if (ret < 0) + return -nm_errno_from_native(errno); + + return ret; +} + +int +nl_send_iovec(struct nl_sock *sk, struct nl_msg *msg, struct iovec *iov, unsigned iovlen) +{ + struct sockaddr_nl *dst; + struct ucred * creds; + struct msghdr hdr = { + .msg_name = (void *) &sk->s_peer, + .msg_namelen = sizeof(struct sockaddr_nl), + .msg_iov = iov, + .msg_iovlen = iovlen, + }; + char buf[CMSG_SPACE(sizeof(struct ucred))]; + + /* Overwrite destination if specified in the message itself, defaults + * to the peer address of the socket. + */ + dst = nlmsg_get_dst(msg); + if (dst->nl_family == AF_NETLINK) + hdr.msg_name = dst; + + /* Add credentials if present. */ + creds = nlmsg_get_creds(msg); + if (creds != NULL) { + struct cmsghdr *cmsg; + + hdr.msg_control = buf; + hdr.msg_controllen = sizeof(buf); + + cmsg = CMSG_FIRSTHDR(&hdr); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_CREDENTIALS; + cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred)); + memcpy(CMSG_DATA(cmsg), creds, sizeof(struct ucred)); + } + + return nl_sendmsg(sk, msg, &hdr); +} + +void +nl_complete_msg(struct nl_sock *sk, struct nl_msg *msg) +{ + struct nlmsghdr *nlh; + + nlh = nlmsg_hdr(msg); + if (nlh->nlmsg_pid == NL_AUTO_PORT) + nlh->nlmsg_pid = nl_socket_get_local_port(sk); + + if (nlh->nlmsg_seq == NL_AUTO_SEQ) + nlh->nlmsg_seq = sk->s_seq_next++; + + if (msg->nm_protocol == -1) + msg->nm_protocol = sk->s_proto; + + nlh->nlmsg_flags |= NLM_F_REQUEST; + + if (!(sk->s_flags & NL_NO_AUTO_ACK)) + nlh->nlmsg_flags |= NLM_F_ACK; +} + +int +nl_send(struct nl_sock *sk, struct nl_msg *msg) +{ + struct iovec iov = { + .iov_base = (void *) nlmsg_hdr(msg), + .iov_len = nlmsg_hdr(msg)->nlmsg_len, + }; + + return nl_send_iovec(sk, msg, &iov, 1); +} + +int +nl_send_auto(struct nl_sock *sk, struct nl_msg *msg) +{ + nl_complete_msg(sk, msg); + + return nl_send(sk, msg); +} + +int +nl_recv(struct nl_sock * sk, + struct sockaddr_nl *nla, + unsigned char ** buf, + struct ucred * out_creds, + gboolean * out_creds_has) +{ + ssize_t n; + int flags = 0; + struct iovec iov; + struct msghdr msg = { + .msg_name = (void *) nla, + .msg_namelen = sizeof(struct sockaddr_nl), + .msg_iov = &iov, + .msg_iovlen = 1, + }; + struct ucred tmpcreds; + gboolean tmpcreds_has = FALSE; + int retval; + int errsv; + + nm_assert(nla); + nm_assert(buf && !*buf); + nm_assert(!out_creds_has == !out_creds); + + if ((sk->s_flags & NL_MSG_PEEK) + || (!(sk->s_flags & NL_MSG_PEEK_EXPLICIT) && sk->s_bufsize == 0)) + flags |= MSG_PEEK | MSG_TRUNC; + + iov.iov_len = sk->s_bufsize ?: (((size_t) nm_utils_getpagesize()) * 4u); + iov.iov_base = g_malloc(iov.iov_len); + + if (out_creds && (sk->s_flags & NL_SOCK_PASSCRED)) { + msg.msg_controllen = CMSG_SPACE(sizeof(struct ucred)); + msg.msg_control = g_malloc(msg.msg_controllen); + } + +retry: + n = recvmsg(sk->s_fd, &msg, flags); + if (!n) { + retval = 0; + goto abort; + } + + if (n < 0) { + errsv = errno; + if (errsv == EINTR) + goto retry; + retval = -nm_errno_from_native(errsv); + goto abort; + } + + if (msg.msg_flags & MSG_CTRUNC) { + if (msg.msg_controllen == 0) { + retval = -NME_NL_MSG_TRUNC; + goto abort; + } + + msg.msg_controllen *= 2; + msg.msg_control = g_realloc(msg.msg_control, msg.msg_controllen); + goto retry; + } + + if (iov.iov_len < n || (msg.msg_flags & MSG_TRUNC)) { + /* respond with error to an incomplete message */ + if (flags == 0) { + retval = -NME_NL_MSG_TRUNC; + goto abort; + } + + /* Provided buffer is not long enough, enlarge it + * to size of n (which should be total length of the message) + * and try again. */ + iov.iov_base = g_realloc(iov.iov_base, n); + iov.iov_len = n; + flags = 0; + goto retry; + } + + if (flags != 0) { + /* Buffer is big enough, do the actual reading */ + flags = 0; + goto retry; + } + + if (msg.msg_namelen != sizeof(struct sockaddr_nl)) { + retval = -NME_UNSPEC; + goto abort; + } + + if (out_creds && (sk->s_flags & NL_SOCK_PASSCRED)) { + struct cmsghdr *cmsg; + + for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { + if (cmsg->cmsg_level != SOL_SOCKET) + continue; + if (cmsg->cmsg_type != SCM_CREDENTIALS) + continue; + memcpy(&tmpcreds, CMSG_DATA(cmsg), sizeof(tmpcreds)); + tmpcreds_has = TRUE; + break; + } + } + + retval = n; + +abort: + g_free(msg.msg_control); + + if (retval <= 0) { + g_free(iov.iov_base); + return retval; + } + + *buf = iov.iov_base; + if (out_creds && tmpcreds_has) + *out_creds = tmpcreds; + NM_SET_OUT(out_creds_has, tmpcreds_has); + return retval; +} diff --git a/shared/nm-platform/nm-netlink.h b/shared/nm-platform/nm-netlink.h new file mode 100644 index 0000000..8de4253 --- /dev/null +++ b/shared/nm-platform/nm-netlink.h @@ -0,0 +1,616 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2018 Red Hat, Inc. + */ + +#ifndef __NM_NETLINK_H__ +#define __NM_NETLINK_H__ + +#include +#include +#include + +#include "nm-std-aux/unaligned.h" + +/*****************************************************************************/ + +#define NLMSGERR_ATTR_UNUSED 0 +#define NLMSGERR_ATTR_MSG 1 +#define NLMSGERR_ATTR_OFFS 2 +#define NLMSGERR_ATTR_COOKIE 3 +#define NLMSGERR_ATTR_MAX 3 + +#ifndef NLM_F_ACK_TLVS + #define NLM_F_ACK_TLVS 0x200 +#endif + +/*****************************************************************************/ + +/* Basic attribute data types */ +enum { + NLA_UNSPEC, /* Unspecified type, binary data chunk */ + NLA_U8, /* 8 bit integer */ + NLA_U16, /* 16 bit integer */ + NLA_U32, /* 32 bit integer */ + NLA_U64, /* 64 bit integer */ + NLA_STRING, /* NUL terminated character string */ + NLA_FLAG, /* Flag */ + NLA_MSECS, /* Micro seconds (64bit) */ + NLA_NESTED, /* Nested attributes */ + NLA_NESTED_COMPAT, + NLA_NUL_STRING, + NLA_BINARY, + NLA_S8, + NLA_S16, + NLA_S32, + NLA_S64, + __NLA_TYPE_MAX, +}; + +#define NLA_TYPE_MAX (__NLA_TYPE_MAX - 1) + +struct nl_msg; + +/*****************************************************************************/ + +const char *nl_nlmsgtype2str(int type, char *buf, size_t size); + +const char *nl_nlmsg_flags2str(int flags, char *buf, size_t len); + +const char *nl_nlmsghdr_to_str(const struct nlmsghdr *hdr, char *buf, gsize len); + +/*****************************************************************************/ + +struct nla_policy { + /* Type of attribute or NLA_UNSPEC */ + uint16_t type; + + /* Minimal length of payload required */ + uint16_t minlen; + + /* Maximal length of payload allowed */ + uint16_t maxlen; +}; + +/*****************************************************************************/ + +/* static asserts that @tb and @policy are suitable arguments to nla_parse(). */ +#define _nl_static_assert_tb(tb, policy) \ + G_STMT_START \ + { \ + G_STATIC_ASSERT_EXPR(G_N_ELEMENTS(tb) > 0); \ + \ + /* We allow @policy to be either a C array or NULL. The sizeof() + * must either match the expected array size or the sizeof(NULL), + * but not both. */ \ + G_STATIC_ASSERT_EXPR((sizeof(policy) == G_N_ELEMENTS(tb) * sizeof(struct nla_policy)) \ + ^ (sizeof(policy) == sizeof(NULL))); \ + } \ + G_STMT_END + +/*****************************************************************************/ + +static inline int +nla_attr_size(int payload) +{ + nm_assert(payload >= 0); + + return NLA_HDRLEN + payload; +} + +static inline int +nla_total_size(int payload) +{ + return NLA_ALIGN(nla_attr_size(payload)); +} + +static inline int +nla_padlen(int payload) +{ + return nla_total_size(payload) - nla_attr_size(payload); +} + +struct nlattr *nla_reserve(struct nl_msg *msg, int attrtype, int attrlen); + +static inline int +nla_len(const struct nlattr *nla) +{ + nm_assert(nla); + nm_assert(nla->nla_len >= NLA_HDRLEN); + + return ((int) nla->nla_len) - NLA_HDRLEN; +} + +static inline int +nla_type(const struct nlattr *nla) +{ + nm_assert(nla_len(nla) >= 0); + + return nla->nla_type & NLA_TYPE_MASK; +} + +static inline void * +nla_data(const struct nlattr *nla) +{ + nm_assert(nla_len(nla) >= 0); + + return &(((char *) nla)[NLA_HDRLEN]); +} + +#define nla_data_as(type, nla) \ + ({ \ + const struct nlattr *_nla = (nla); \ + \ + nm_assert(nla_len(_nla) >= sizeof(type)); \ + \ + /* note that casting the pointer is undefined behavior in C, if + * the data has wrong alignment. Netlink data is aligned to 4 bytes, + * that means, if the alignment is larger than 4, this is invalid. */ \ + G_STATIC_ASSERT_EXPR(_nm_alignof(type) <= NLA_ALIGNTO); \ + \ + (type *) nla_data(_nla); \ + }) + +static inline uint8_t +nla_get_u8(const struct nlattr *nla) +{ + nm_assert(nla_len(nla) >= sizeof(uint8_t)); + + return *((const uint8_t *) nla_data(nla)); +} + +static inline int8_t +nla_get_s8(const struct nlattr *nla) +{ + nm_assert(nla_len(nla) >= sizeof(int8_t)); + + return *((const int8_t *) nla_data(nla)); +} + +static inline uint8_t +nla_get_u8_cond(/*const*/ struct nlattr *const *tb, int attr, uint8_t default_val) +{ + nm_assert(tb); + nm_assert(attr >= 0); + + return tb[attr] ? nla_get_u8(tb[attr]) : default_val; +} + +static inline uint16_t +nla_get_u16(const struct nlattr *nla) +{ + nm_assert(nla_len(nla) >= sizeof(uint16_t)); + + return *((const uint16_t *) nla_data(nla)); +} + +static inline uint32_t +nla_get_u32(const struct nlattr *nla) +{ + nm_assert(nla_len(nla) >= sizeof(uint32_t)); + + return *((const uint32_t *) nla_data(nla)); +} + +static inline int32_t +nla_get_s32(const struct nlattr *nla) +{ + nm_assert(nla_len(nla) >= sizeof(int32_t)); + + return *((const int32_t *) nla_data(nla)); +} + +static inline uint64_t +nla_get_u64(const struct nlattr *nla) +{ + nm_assert(nla_len(nla) >= sizeof(uint64_t)); + + return unaligned_read_ne64(nla_data(nla)); +} + +static inline uint64_t +nla_get_be64(const struct nlattr *nla) +{ + nm_assert(nla_len(nla) >= sizeof(uint64_t)); + + return unaligned_read_be64(nla_data(nla)); +} + +static inline char * +nla_get_string(const struct nlattr *nla) +{ + nm_assert(nla_len(nla) >= 0); + + return (char *) nla_data(nla); +} + +size_t nla_strlcpy(char *dst, const struct nlattr *nla, size_t dstsize); + +size_t nla_memcpy(void *dst, const struct nlattr *nla, size_t dstsize); + +#define nla_memcpy_checked_size(dst, nla, dstsize) \ + G_STMT_START \ + { \ + void *const _dst = (dst); \ + const struct nlattr *const _nla = (nla); \ + const size_t _dstsize = (dstsize); \ + size_t _srcsize; \ + \ + /* assert that, if @nla is given, that it has the exact expected + * size. This implies that the caller previously verified the length + * of the attribute (via minlen/maxlen at nla_parse()). */ \ + \ + if (_nla) { \ + _srcsize = nla_memcpy(_dst, _nla, _dstsize); \ + nm_assert(_srcsize == _dstsize); \ + } \ + } \ + G_STMT_END + +int nla_put(struct nl_msg *msg, int attrtype, int datalen, const void *data); + +static inline int +nla_put_string(struct nl_msg *msg, int attrtype, const char *str) +{ + nm_assert(str); + + return nla_put(msg, attrtype, strlen(str) + 1, str); +} + +static inline int +nla_put_uint8(struct nl_msg *msg, int attrtype, uint8_t val) +{ + return nla_put(msg, attrtype, sizeof(val), &val); +} + +static inline int +nla_put_uint16(struct nl_msg *msg, int attrtype, uint16_t val) +{ + return nla_put(msg, attrtype, sizeof(val), &val); +} + +static inline int +nla_put_uint32(struct nl_msg *msg, int attrtype, uint32_t val) +{ + return nla_put(msg, attrtype, sizeof(val), &val); +} + +#define NLA_PUT(msg, attrtype, attrlen, data) \ + G_STMT_START \ + { \ + if (nla_put(msg, attrtype, attrlen, data) < 0) \ + goto nla_put_failure; \ + } \ + G_STMT_END + +#define NLA_PUT_TYPE(msg, type, attrtype, value) \ + G_STMT_START \ + { \ + type __nla_tmp = value; \ + NLA_PUT(msg, attrtype, sizeof(type), &__nla_tmp); \ + } \ + G_STMT_END + +#define NLA_PUT_U8(msg, attrtype, value) NLA_PUT_TYPE(msg, uint8_t, attrtype, value) + +#define NLA_PUT_S8(msg, attrtype, value) NLA_PUT_TYPE(msg, int8_t, attrtype, value) + +#define NLA_PUT_U16(msg, attrtype, value) NLA_PUT_TYPE(msg, uint16_t, attrtype, value) + +#define NLA_PUT_U32(msg, attrtype, value) NLA_PUT_TYPE(msg, uint32_t, attrtype, value) + +#define NLA_PUT_S32(msg, attrtype, value) NLA_PUT_TYPE(msg, int32_t, attrtype, value) + +#define NLA_PUT_U64(msg, attrtype, value) NLA_PUT_TYPE(msg, uint64_t, attrtype, value) + +#define NLA_PUT_STRING(msg, attrtype, value) NLA_PUT(msg, attrtype, (int) strlen(value) + 1, value) + +#define NLA_PUT_FLAG(msg, attrtype) NLA_PUT(msg, attrtype, 0, NULL) + +struct nlattr *nla_find(const struct nlattr *head, int len, int attrtype); + +static inline int +nla_ok(const struct nlattr *nla, int remaining) +{ + return remaining >= (int) sizeof(*nla) && nla->nla_len >= sizeof(*nla) + && nla->nla_len <= remaining; +} + +static inline struct nlattr * +nla_next(const struct nlattr *nla, int *remaining) +{ + int totlen = NLA_ALIGN(nla->nla_len); + + *remaining -= totlen; + return (struct nlattr *) ((char *) nla + totlen); +} + +#define nla_for_each_attr(pos, head, len, rem) \ + for (pos = head, rem = len; nla_ok(pos, rem); pos = nla_next(pos, &(rem))) + +#define nla_for_each_nested(pos, nla, rem) \ + for (pos = (struct nlattr *) nla_data(nla), rem = nla_len(nla); nla_ok(pos, rem); \ + pos = nla_next(pos, &(rem))) + +void nla_nest_cancel(struct nl_msg *msg, const struct nlattr *attr); +struct nlattr *nla_nest_start(struct nl_msg *msg, int attrtype); +int nla_nest_end(struct nl_msg *msg, struct nlattr *start); + +int nla_parse(struct nlattr * tb[], + int maxtype, + struct nlattr * head, + int len, + const struct nla_policy *policy); + +#define nla_parse_arr(tb, head, len, policy) \ + ({ \ + _nl_static_assert_tb((tb), (policy)); \ + \ + nla_parse((tb), G_N_ELEMENTS(tb) - 1, (head), (len), (policy)); \ + }) + +static inline int +nla_parse_nested(struct nlattr * tb[], + int maxtype, + struct nlattr * nla, + const struct nla_policy *policy) +{ + return nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy); +} + +#define nla_parse_nested_arr(tb, nla, policy) \ + ({ \ + _nl_static_assert_tb((tb), (policy)); \ + \ + nla_parse_nested((tb), G_N_ELEMENTS(tb) - 1, (nla), (policy)); \ + }) + +/*****************************************************************************/ + +struct nl_msg *nlmsg_alloc(void); + +struct nl_msg *nlmsg_alloc_size(size_t max); + +struct nl_msg *nlmsg_alloc_convert(struct nlmsghdr *hdr); + +struct nl_msg *nlmsg_alloc_simple(int nlmsgtype, int flags); + +void *nlmsg_reserve(struct nl_msg *n, size_t len, int pad); + +int nlmsg_append(struct nl_msg *n, const void *data, size_t len, int pad); + +#define nlmsg_append_struct(n, data) nlmsg_append(n, (data), sizeof(*(data)), NLMSG_ALIGNTO) + +void nlmsg_free(struct nl_msg *msg); + +static inline int +nlmsg_size(int payload) +{ + nm_assert(payload >= 0 && payload < G_MAXINT - NLMSG_HDRLEN - 4); + return NLMSG_HDRLEN + payload; +} + +static inline int +nlmsg_total_size(int payload) +{ + return NLMSG_ALIGN(nlmsg_size(payload)); +} + +static inline int +nlmsg_ok(const struct nlmsghdr *nlh, int remaining) +{ + return (remaining >= (int) sizeof(struct nlmsghdr) && nlh->nlmsg_len >= sizeof(struct nlmsghdr) + && nlh->nlmsg_len <= remaining); +} + +static inline struct nlmsghdr * +nlmsg_next(struct nlmsghdr *nlh, int *remaining) +{ + int totlen = NLMSG_ALIGN(nlh->nlmsg_len); + + *remaining -= totlen; + + return (struct nlmsghdr *) ((unsigned char *) nlh + totlen); +} + +int nlmsg_get_proto(struct nl_msg *msg); +void nlmsg_set_proto(struct nl_msg *msg, int protocol); + +void nlmsg_set_src(struct nl_msg *msg, struct sockaddr_nl *addr); + +struct ucred *nlmsg_get_creds(struct nl_msg *msg); +void nlmsg_set_creds(struct nl_msg *msg, struct ucred *creds); + +static inline void +_nm_auto_nl_msg_cleanup(struct nl_msg **ptr) +{ + nlmsg_free(*ptr); +} +#define nm_auto_nlmsg nm_auto(_nm_auto_nl_msg_cleanup) + +static inline void * +nlmsg_data(const struct nlmsghdr *nlh) +{ + return (unsigned char *) nlh + NLMSG_HDRLEN; +} + +static inline void * +nlmsg_tail(const struct nlmsghdr *nlh) +{ + return (unsigned char *) nlh + NLMSG_ALIGN(nlh->nlmsg_len); +} + +struct nlmsghdr *nlmsg_hdr(struct nl_msg *n); + +static inline int +nlmsg_valid_hdr(const struct nlmsghdr *nlh, int hdrlen) +{ + if (nlh->nlmsg_len < nlmsg_size(hdrlen)) + return 0; + + return 1; +} + +static inline int +nlmsg_datalen(const struct nlmsghdr *nlh) +{ + return nlh->nlmsg_len - NLMSG_HDRLEN; +} + +static inline int +nlmsg_attrlen(const struct nlmsghdr *nlh, int hdrlen) +{ + return NM_MAX((int) (nlmsg_datalen(nlh) - NLMSG_ALIGN(hdrlen)), 0); +} + +static inline struct nlattr * +nlmsg_attrdata(const struct nlmsghdr *nlh, int hdrlen) +{ + unsigned char *data = nlmsg_data(nlh); + return (struct nlattr *) (data + NLMSG_ALIGN(hdrlen)); +} + +static inline struct nlattr * +nlmsg_find_attr(struct nlmsghdr *nlh, int hdrlen, int attrtype) +{ + return nla_find(nlmsg_attrdata(nlh, hdrlen), nlmsg_attrlen(nlh, hdrlen), attrtype); +} + +int nlmsg_parse(struct nlmsghdr * nlh, + int hdrlen, + struct nlattr * tb[], + int maxtype, + const struct nla_policy *policy); + +#define nlmsg_parse_arr(nlh, hdrlen, tb, policy) \ + ({ \ + _nl_static_assert_tb((tb), (policy)); \ + G_STATIC_ASSERT_EXPR((hdrlen) >= 0); \ + \ + nlmsg_parse((nlh), (hdrlen), (tb), G_N_ELEMENTS(tb) - 1, (policy)); \ + }) + +struct nlmsghdr * +nlmsg_put(struct nl_msg *n, uint32_t pid, uint32_t seq, int type, int payload, int flags); + +/*****************************************************************************/ + +#define NL_AUTO_PORT 0 +#define NL_AUTO_SEQ 0 + +struct nl_sock; + +struct nl_sock *nl_socket_alloc(void); + +void nl_socket_free(struct nl_sock *sk); + +int nl_socket_get_fd(const struct nl_sock *sk); + +struct sockaddr_nl *nlmsg_get_dst(struct nl_msg *msg); + +size_t nl_socket_get_msg_buf_size(struct nl_sock *sk); +int nl_socket_set_msg_buf_size(struct nl_sock *sk, size_t bufsize); + +int nl_socket_set_buffer_size(struct nl_sock *sk, int rxbuf, int txbuf); + +int nl_socket_set_passcred(struct nl_sock *sk, int state); + +int nl_socket_set_nonblocking(const struct nl_sock *sk); + +void nl_socket_disable_msg_peek(struct nl_sock *sk); + +uint32_t nl_socket_get_local_port(const struct nl_sock *sk); + +int nl_socket_add_memberships(struct nl_sock *sk, int group, ...); + +int nl_connect(struct nl_sock *sk, int protocol); + +int nl_recv(struct nl_sock * sk, + struct sockaddr_nl *nla, + unsigned char ** buf, + struct ucred * out_creds, + gboolean * out_creds_has); + +int nl_send(struct nl_sock *sk, struct nl_msg *msg); + +int nl_send_auto(struct nl_sock *sk, struct nl_msg *msg); + +/*****************************************************************************/ + +enum nl_cb_action { + /* Proceed with wathever would come next */ + NL_OK, + /* Skip this message */ + NL_SKIP, + /* Stop parsing altogether and discard remaining messages */ + NL_STOP, +}; + +typedef int (*nl_recvmsg_msg_cb_t)(struct nl_msg *msg, void *arg); + +typedef int (*nl_recvmsg_err_cb_t)(struct sockaddr_nl *nla, struct nlmsgerr *nlerr, void *arg); + +struct nl_cb { + nl_recvmsg_msg_cb_t valid_cb; + void * valid_arg; + + nl_recvmsg_msg_cb_t finish_cb; + void * finish_arg; + + nl_recvmsg_msg_cb_t ack_cb; + void * ack_arg; + + nl_recvmsg_err_cb_t err_cb; + void * err_arg; +}; + +int nl_sendmsg(struct nl_sock *sk, struct nl_msg *msg, struct msghdr *hdr); + +int nl_send_iovec(struct nl_sock *sk, struct nl_msg *msg, struct iovec *iov, unsigned iovlen); + +void nl_complete_msg(struct nl_sock *sk, struct nl_msg *msg); + +int nl_recvmsgs(struct nl_sock *sk, const struct nl_cb *cb); + +int nl_wait_for_ack(struct nl_sock *sk, const struct nl_cb *cb); + +int nl_socket_set_ext_ack(struct nl_sock *sk, gboolean enable); + +/*****************************************************************************/ + +void * genlmsg_put(struct nl_msg *msg, + uint32_t port, + uint32_t seq, + int family, + int hdrlen, + int flags, + uint8_t cmd, + uint8_t version); +void * genlmsg_data(const struct genlmsghdr *gnlh); +void * genlmsg_user_hdr(const struct genlmsghdr *gnlh); +struct genlmsghdr *genlmsg_hdr(struct nlmsghdr *nlh); +void * genlmsg_user_data(const struct genlmsghdr *gnlh, const int hdrlen); +struct nlattr * genlmsg_attrdata(const struct genlmsghdr *gnlh, int hdrlen); +int genlmsg_len(const struct genlmsghdr *gnlh); +int genlmsg_attrlen(const struct genlmsghdr *gnlh, int hdrlen); +int genlmsg_valid_hdr(struct nlmsghdr *nlh, int hdrlen); + +int genlmsg_parse(struct nlmsghdr * nlh, + int hdrlen, + struct nlattr * tb[], + int maxtype, + const struct nla_policy *policy); + +#define genlmsg_parse_arr(nlh, hdrlen, tb, policy) \ + ({ \ + _nl_static_assert_tb((tb), (policy)); \ + G_STATIC_ASSERT_EXPR((hdrlen) >= 0); \ + \ + genlmsg_parse((nlh), (hdrlen), (tb), G_N_ELEMENTS(tb) - 1, (policy)); \ + }) + +int genl_ctrl_resolve(struct nl_sock *sk, const char *name); + +/*****************************************************************************/ + +#endif /* __NM_NETLINK_H__ */ diff --git a/shared/nm-platform/nm-platform-utils.c b/shared/nm-platform/nm-platform-utils.c new file mode 100644 index 0000000..59e4a24 --- /dev/null +++ b/shared/nm-platform/nm-platform-utils.c @@ -0,0 +1,1793 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2015 Red Hat, Inc. + */ + +#include "nm-default.h" + +#include "nm-platform-utils.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "nm-base/nm-ethtool-base.h" +#include "nm-log-core/nm-logging.h" + +/*****************************************************************************/ + +#define ONOFF(bool_val) ((bool_val) ? "on" : "off") + +/****************************************************************************** + * utils + *****************************************************************************/ + +extern char *if_indextoname(unsigned __ifindex, char *__ifname); +unsigned if_nametoindex(const char *__ifname); + +const char * +nmp_utils_if_indextoname(int ifindex, char *out_ifname /*IFNAMSIZ*/) +{ + g_return_val_if_fail(ifindex > 0, NULL); + g_return_val_if_fail(out_ifname, NULL); + + return if_indextoname(ifindex, out_ifname); +} + +int +nmp_utils_if_nametoindex(const char *ifname) +{ + g_return_val_if_fail(ifname, 0); + + return if_nametoindex(ifname); +} + +/*****************************************************************************/ + +NM_UTILS_LOOKUP_STR_DEFINE(nm_platform_link_duplex_type_to_string, + NMPlatformLinkDuplexType, + NM_UTILS_LOOKUP_DEFAULT_WARN(NULL), + NM_UTILS_LOOKUP_STR_ITEM(NM_PLATFORM_LINK_DUPLEX_UNKNOWN, "unknown"), + NM_UTILS_LOOKUP_STR_ITEM(NM_PLATFORM_LINK_DUPLEX_FULL, "full"), + NM_UTILS_LOOKUP_STR_ITEM(NM_PLATFORM_LINK_DUPLEX_HALF, "half"), ); + +/*****************************************************************************/ + +typedef struct { + int fd; + const int ifindex; + char ifname[IFNAMSIZ]; +} SocketHandle; + +#define SOCKET_HANDLE_INIT(_ifindex) \ + { \ + .fd = -1, .ifindex = (_ifindex), \ + } + +static void +_nm_auto_socket_handle(SocketHandle *shandle) +{ + if (shandle->fd >= 0) + nm_close(shandle->fd); +} + +#define nm_auto_socket_handle nm_auto(_nm_auto_socket_handle) + +/*****************************************************************************/ + +typedef enum { + IOCTL_CALL_DATA_TYPE_NONE, + IOCTL_CALL_DATA_TYPE_IFRDATA, + IOCTL_CALL_DATA_TYPE_IFRU, +} IoctlCallDataType; + +static int +_ioctl_call(const char * log_ioctl_type, + const char * log_subtype, + unsigned long int ioctl_request, + int ifindex, + int * inout_fd, + char * inout_ifname, + IoctlCallDataType edata_type, + gpointer edata, + gsize edata_size, + struct ifreq * out_ifreq) +{ + nm_auto_close int fd_close = -1; + int fd; + int r; + gpointer edata_backup = NULL; + gs_free gpointer edata_backup_free = NULL; + guint try_count; + char known_ifnames[2][IFNAMSIZ]; + const char * failure_reason = NULL; + struct ifreq ifr; + + nm_assert(ifindex > 0); + nm_assert(NM_IN_SET(edata_type, + IOCTL_CALL_DATA_TYPE_NONE, + IOCTL_CALL_DATA_TYPE_IFRDATA, + IOCTL_CALL_DATA_TYPE_IFRU)); + nm_assert(edata_type != IOCTL_CALL_DATA_TYPE_NONE || edata_size == 0); + nm_assert(edata_type != IOCTL_CALL_DATA_TYPE_IFRDATA || edata_size > 0); + nm_assert(edata_type != IOCTL_CALL_DATA_TYPE_IFRU + || (edata_size > 0 && edata_size <= sizeof(ifr.ifr_ifru))); + nm_assert(edata_size == 0 || edata); + + /* open a file descriptor (or use the one provided). */ + if (inout_fd && *inout_fd >= 0) + fd = *inout_fd; + else { + fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0); + if (fd < 0) { + r = -NM_ERRNO_NATIVE(errno); + failure_reason = "failed creating socket or ioctl"; + goto out; + } + if (inout_fd) + *inout_fd = fd; + else + fd_close = fd; + } + + /* resolve the ifindex to name (or use the one provided). */ + if (inout_ifname && inout_ifname[0]) + nm_utils_ifname_cpy(known_ifnames[0], inout_ifname); + else { + if (!nmp_utils_if_indextoname(ifindex, known_ifnames[0])) { + failure_reason = "cannot resolve ifindex"; + r = -ENODEV; + goto out; + } + if (inout_ifname) + nm_utils_ifname_cpy(inout_ifname, known_ifnames[0]); + } + + /* we might need to retry the request. Backup edata so that we can + * restore it on retry. */ + if (edata_size > 0) + edata_backup = nm_memdup_maybe_a(500, edata, edata_size, &edata_backup_free); + + try_count = 0; + +again: +{ + const char *ifname = known_ifnames[try_count % 2]; + + nm_assert(ifindex > 0); + nm_assert(ifname && nm_utils_ifname_valid_kernel(ifname, NULL)); + nm_assert(fd >= 0); + + memset(&ifr, 0, sizeof(ifr)); + nm_utils_ifname_cpy(ifr.ifr_name, ifname); + if (edata_type == IOCTL_CALL_DATA_TYPE_IFRDATA) + ifr.ifr_data = edata; + else if (edata_type == IOCTL_CALL_DATA_TYPE_IFRU) + memcpy(&ifr.ifr_ifru, edata, NM_MIN(edata_size, sizeof(ifr.ifr_ifru))); + + if (ioctl(fd, ioctl_request, &ifr) < 0) { + r = -NM_ERRNO_NATIVE(errno); + nm_log_trace(LOGD_PLATFORM, + "%s[%d]: %s, %s: failed: %s", + log_ioctl_type, + ifindex, + log_subtype, + ifname, + nm_strerror_native(-r)); + } else { + r = 0; + nm_log_trace(LOGD_PLATFORM, + "%s[%d]: %s, %s: success", + log_ioctl_type, + ifindex, + log_subtype, + ifname); + } +} + + try_count++; + + /* resolve the name again to see whether the ifindex still has the same name. */ + if (!nmp_utils_if_indextoname(ifindex, known_ifnames[try_count % 2])) { + /* we could not find the ifindex again. Probably the device just got + * removed. + * + * In both cases we return the error code we got from ioctl above. + * Either it failed because the device was gone already or it still + * managed to complete the call. In both cases, the error code is good. */ + failure_reason = + "cannot resolve ifindex after ioctl call. Probably the device was just removed"; + goto out; + } + + /* check whether the ifname changed in the meantime. If yes, would render the result + * invalid. Note that this cannot detect every race regarding renames, for example: + * + * - if_indextoname(#10) gives eth0 + * - rename(#10) => eth0_tmp + * - rename(#11) => eth0 + * - ioctl(eth0) (wrongly fetching #11, formerly eth1) + * - rename(#11) => eth_something + * - rename(#10) => eth0 + * - if_indextoname(#10) gives eth0 + */ + if (!nm_streq(known_ifnames[0], known_ifnames[1])) { + gboolean retry; + + /* we detected a possible(!) rename. + * + * For getters it's straight forward to just retry the call. + * + * For setters we also always retry. If our previous call operated on the right device, + * calling it again should have no bad effect (just setting the same thing more than once). + * + * The only potential bad thing is if there was a race involving swapping names, and we just + * set the ioctl option on the wrong device. But then the bad thing already happenned and + * we cannot detect it (nor do anything about it). At least, we can retry and set the + * option on the right interface. */ + retry = (try_count < 5); + + nm_log_trace(LOGD_PLATFORM, + "%s[%d]: %s: rename detected from \"%s\" to \"%s\". %s", + log_ioctl_type, + ifindex, + log_subtype, + known_ifnames[(try_count - 1) % 2], + known_ifnames[try_count % 2], + retry ? "Retry" : "No retry"); + if (inout_ifname) + nm_utils_ifname_cpy(inout_ifname, known_ifnames[try_count % 2]); + if (retry) { + if (edata_size > 0) + memcpy(edata, edata_backup, edata_size); + goto again; + } + } + +out: + if (failure_reason) { + nm_log_trace(LOGD_PLATFORM, + "%s[%d]: %s: %s: %s", + log_ioctl_type, + ifindex, + log_subtype, + failure_reason, + r < 0 ? nm_strerror_native(-r) : "assume success"); + } + if (r >= 0) + NM_SET_OUT(out_ifreq, ifr); + return r; +} + +/****************************************************************************** + * ethtool + *****************************************************************************/ + +static NM_UTILS_ENUM2STR_DEFINE(_ethtool_cmd_to_string, + guint32, + NM_UTILS_ENUM2STR(ETHTOOL_GCOALESCE, "ETHTOOL_GCOALESCE"), + NM_UTILS_ENUM2STR(ETHTOOL_GDRVINFO, "ETHTOOL_GDRVINFO"), + NM_UTILS_ENUM2STR(ETHTOOL_GFEATURES, "ETHTOOL_GFEATURES"), + NM_UTILS_ENUM2STR(ETHTOOL_GLINK, "ETHTOOL_GLINK"), + NM_UTILS_ENUM2STR(ETHTOOL_GPERMADDR, "ETHTOOL_GPERMADDR"), + NM_UTILS_ENUM2STR(ETHTOOL_GRINGPARAM, "ETHTOOL_GRINGPARAM"), + NM_UTILS_ENUM2STR(ETHTOOL_GSET, "ETHTOOL_GSET"), + NM_UTILS_ENUM2STR(ETHTOOL_GSSET_INFO, "ETHTOOL_GSSET_INFO"), + NM_UTILS_ENUM2STR(ETHTOOL_GSTATS, "ETHTOOL_GSTATS"), + NM_UTILS_ENUM2STR(ETHTOOL_GSTRINGS, "ETHTOOL_GSTRINGS"), + NM_UTILS_ENUM2STR(ETHTOOL_GWOL, "ETHTOOL_GWOL"), + NM_UTILS_ENUM2STR(ETHTOOL_SCOALESCE, "ETHTOOL_SCOALESCE"), + NM_UTILS_ENUM2STR(ETHTOOL_SFEATURES, "ETHTOOL_SFEATURES"), + NM_UTILS_ENUM2STR(ETHTOOL_SRINGPARAM, "ETHTOOL_SRINGPARAM"), + NM_UTILS_ENUM2STR(ETHTOOL_SSET, "ETHTOOL_SSET"), + NM_UTILS_ENUM2STR(ETHTOOL_SWOL, "ETHTOOL_SWOL"), ); + +static const char * +_ethtool_edata_to_string(gpointer edata, gsize edata_size, char *sbuf, gsize sbuf_len) +{ + nm_assert(edata); + nm_assert(edata_size >= sizeof(guint32)); + nm_assert((((intptr_t) edata) % _nm_alignof(guint32)) == 0); + + return _ethtool_cmd_to_string(*((guint32 *) edata), sbuf, sbuf_len); +} + +/*****************************************************************************/ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 27) + #define ethtool_cmd_speed(pedata) ((pedata)->speed) + + #define ethtool_cmd_speed_set(pedata, speed) \ + G_STMT_START \ + { \ + (pedata)->speed = (guint16)(speed); \ + } \ + G_STMT_END +#endif + +static int +_ethtool_call_handle(SocketHandle *shandle, gpointer edata, gsize edata_size) +{ + char sbuf[50]; + + return _ioctl_call("ethtool", + _ethtool_edata_to_string(edata, edata_size, sbuf, sizeof(sbuf)), + SIOCETHTOOL, + shandle->ifindex, + &shandle->fd, + shandle->ifname, + IOCTL_CALL_DATA_TYPE_IFRDATA, + edata, + edata_size, + NULL); +} + +static int +_ethtool_call_once(int ifindex, gpointer edata, gsize edata_size) +{ + char sbuf[50]; + + return _ioctl_call("ethtool", + _ethtool_edata_to_string(edata, edata_size, sbuf, sizeof(sbuf)), + SIOCETHTOOL, + ifindex, + NULL, + NULL, + IOCTL_CALL_DATA_TYPE_IFRDATA, + edata, + edata_size, + NULL); +} + +/*****************************************************************************/ + +static struct ethtool_gstrings * +ethtool_get_stringset(SocketHandle *shandle, int stringset_id) +{ + struct { + struct ethtool_sset_info info; + guint32 sentinel; + } sset_info = { + .info.cmd = ETHTOOL_GSSET_INFO, + .info.reserved = 0, + .info.sset_mask = (1ULL << stringset_id), + }; + const guint32 * pdata; + gs_free struct ethtool_gstrings *gstrings = NULL; + gsize gstrings_len; + guint32 i, len; + + if (_ethtool_call_handle(shandle, &sset_info, sizeof(sset_info)) < 0) + return NULL; + if (!sset_info.info.sset_mask) + return NULL; + + pdata = (guint32 *) sset_info.info.data; + + len = *pdata; + + gstrings_len = sizeof(*gstrings) + (len * ETH_GSTRING_LEN); + gstrings = g_malloc0(gstrings_len); + gstrings->cmd = ETHTOOL_GSTRINGS; + gstrings->string_set = stringset_id; + gstrings->len = len; + if (gstrings->len > 0) { + if (_ethtool_call_handle(shandle, gstrings, gstrings_len) < 0) + return NULL; + for (i = 0; i < gstrings->len; i++) { + /* ensure NUL terminated */ + gstrings->data[i * ETH_GSTRING_LEN + (ETH_GSTRING_LEN - 1)] = '\0'; + } + } + + return g_steal_pointer(&gstrings); +} + +static int +ethtool_gstrings_find(const struct ethtool_gstrings *gstrings, const char *needle) +{ + guint32 i; + + /* ethtool_get_stringset() always ensures NUL terminated strings at ETH_GSTRING_LEN. + * that means, we cannot possibly request longer names. */ + nm_assert(needle && strlen(needle) < ETH_GSTRING_LEN); + + for (i = 0; i < gstrings->len; i++) { + if (nm_streq((char *) &gstrings->data[i * ETH_GSTRING_LEN], needle)) + return i; + } + return -1; +} + +static int +ethtool_get_stringset_index(SocketHandle *shandle, int stringset_id, const char *needle) +{ + gs_free struct ethtool_gstrings *gstrings = NULL; + + /* ethtool_get_stringset() always ensures NUL terminated strings at ETH_GSTRING_LEN. + * that means, we cannot possibly request longer names. */ + nm_assert(needle && strlen(needle) < ETH_GSTRING_LEN); + + gstrings = ethtool_get_stringset(shandle, stringset_id); + if (gstrings) + return ethtool_gstrings_find(gstrings, needle); + return -1; +} + +/*****************************************************************************/ + +static const NMEthtoolFeatureInfo _ethtool_feature_infos[_NM_ETHTOOL_ID_FEATURE_NUM] = { +#define ETHT_FEAT(eid, ...) \ + { \ + .ethtool_id = eid, .n_kernel_names = NM_NARG(__VA_ARGS__), \ + .kernel_names = ((const char *const[]){__VA_ARGS__}), \ + } + + /* the order does only matter for one thing: if it happens that more than one NMEthtoolID + * reference the same kernel-name, then the one that is mentioned *later* will win in + * case these NMEthtoolIDs are set. That mostly only makes sense for ethtool-ids which + * refer to multiple features ("feature-tso"), while also having more specific ids + * ("feature-tx-tcp-segmentation"). */ + + /* names from ethtool utility, which are aliases for multiple features. */ + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_SG, "tx-scatter-gather", "tx-scatter-gather-fraglist"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TSO, + "tx-tcp-segmentation", + "tx-tcp-ecn-segmentation", + "tx-tcp-mangleid-segmentation", + "tx-tcp6-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX, + "tx-checksum-ipv4", + "tx-checksum-ip-generic", + "tx-checksum-ipv6", + "tx-checksum-fcoe-crc", + "tx-checksum-sctp"), + + /* names from ethtool utility, which are aliases for one feature. */ + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_GRO, "rx-gro"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_GSO, "tx-generic-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_LRO, "rx-lro"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_NTUPLE, "rx-ntuple-filter"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_RX, "rx-checksum"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_RXHASH, "rx-hashing"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_RXVLAN, "rx-vlan-hw-parse"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TXVLAN, "tx-vlan-hw-insert"), + + /* names of features, as known by kernel. */ + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD, "esp-hw-offload"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD, "esp-tx-csum-hw-offload"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_FCOE_MTU, "fcoe-mtu"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_HIGHDMA, "highdma"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_HW_TC_OFFLOAD, "hw-tc-offload"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_L2_FWD_OFFLOAD, "l2-fwd-offload"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_LOOPBACK, "loopback"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_RX_ALL, "rx-all"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_RX_FCS, "rx-fcs"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_RX_GRO_HW, "rx-gro-hw"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD, "rx-udp_tunnel-port-offload"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_RX_VLAN_FILTER, "rx-vlan-filter"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_FILTER, "rx-vlan-stag-filter"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_HW_PARSE, "rx-vlan-stag-hw-parse"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TLS_HW_RECORD, "tls-hw-record"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TLS_HW_TX_OFFLOAD, "tls-hw-tx-offload"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_FCOE_CRC, "tx-checksum-fcoe-crc"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV4, "tx-checksum-ipv4"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV6, "tx-checksum-ipv6"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IP_GENERIC, "tx-checksum-ip-generic"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_SCTP, "tx-checksum-sctp"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_ESP_SEGMENTATION, "tx-esp-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_FCOE_SEGMENTATION, "tx-fcoe-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_GRE_CSUM_SEGMENTATION, "tx-gre-csum-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_GRE_SEGMENTATION, "tx-gre-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_GSO_PARTIAL, "tx-gso-partial"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_GSO_ROBUST, "tx-gso-robust"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_IPXIP4_SEGMENTATION, "tx-ipxip4-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_IPXIP6_SEGMENTATION, "tx-ipxip6-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_NOCACHE_COPY, "tx-nocache-copy"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER, "tx-scatter-gather"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER_FRAGLIST, "tx-scatter-gather-fraglist"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_SCTP_SEGMENTATION, "tx-sctp-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION, "tx-tcp6-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_TCP_ECN_SEGMENTATION, "tx-tcp-ecn-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_TCP_MANGLEID_SEGMENTATION, "tx-tcp-mangleid-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_TCP_SEGMENTATION, "tx-tcp-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_UDP_SEGMENTATION, "tx-udp-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION, "tx-udp_tnl-csum-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_SEGMENTATION, "tx-udp_tnl-segmentation"), + ETHT_FEAT(NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, "tx-vlan-stag-hw-insert"), +}; + +/* the number of kernel features that we handle. It essentially is the sum of all + * kernel_names. So, all ethtool-ids that reference exactly one kernel-name + * (_NM_ETHTOOL_ID_FEATURE_NUM) + some extra, for ethtool-ids that are aliases + * for multiple kernel-names. */ +#define N_ETHTOOL_KERNEL_FEATURES (((guint) _NM_ETHTOOL_ID_FEATURE_NUM) + 8u) + +static void +_ASSERT_ethtool_feature_infos(void) +{ +#if NM_MORE_ASSERTS > 10 + guint i, k, n; + bool found[_NM_ETHTOOL_ID_FEATURE_NUM] = {}; + + G_STATIC_ASSERT_EXPR(G_N_ELEMENTS(_ethtool_feature_infos) == _NM_ETHTOOL_ID_FEATURE_NUM); + + n = 0; + for (i = 0; i < G_N_ELEMENTS(_ethtool_feature_infos); i++) { + NMEthtoolFeatureState kstate; + const NMEthtoolFeatureInfo *inf = &_ethtool_feature_infos[i]; + + g_assert(inf->ethtool_id >= _NM_ETHTOOL_ID_FEATURE_FIRST); + g_assert(inf->ethtool_id <= _NM_ETHTOOL_ID_FEATURE_LAST); + g_assert(inf->n_kernel_names > 0); + + for (k = 0; k < i; k++) + g_assert(inf->ethtool_id != _ethtool_feature_infos[k].ethtool_id); + + g_assert(!found[_NM_ETHTOOL_ID_FEATURE_AS_IDX(inf->ethtool_id)]); + found[_NM_ETHTOOL_ID_FEATURE_AS_IDX(inf->ethtool_id)] = TRUE; + + kstate.idx_kernel_name = inf->n_kernel_names - 1; + g_assert((guint) kstate.idx_kernel_name == (guint)(inf->n_kernel_names - 1)); + + n += inf->n_kernel_names; + for (k = 0; k < inf->n_kernel_names; k++) { + g_assert(nm_utils_strv_find_first((char **) inf->kernel_names, k, inf->kernel_names[k]) + < 0); + } + } + + for (i = 0; i < _NM_ETHTOOL_ID_FEATURE_NUM; i++) + g_assert(found[i]); + + g_assert(n == N_ETHTOOL_KERNEL_FEATURES); +#endif +} + +static NMEthtoolFeatureStates * +ethtool_get_features(SocketHandle *shandle) +{ + gs_free NMEthtoolFeatureStates * states = NULL; + gs_free struct ethtool_gstrings *ss_features = NULL; + + _ASSERT_ethtool_feature_infos(); + + ss_features = ethtool_get_stringset(shandle, ETH_SS_FEATURES); + if (!ss_features) + return NULL; + + if (ss_features->len > 0) { + gs_free struct ethtool_gfeatures * gfeatures_free = NULL; + struct ethtool_gfeatures * gfeatures; + gsize gfeatures_len; + guint idx; + const NMEthtoolFeatureState * states_list0 = NULL; + const NMEthtoolFeatureState *const *states_plist0 = NULL; + guint states_plist_n = 0; + + gfeatures_len = sizeof(struct ethtool_gfeatures) + + (NM_DIV_ROUND_UP(ss_features->len, 32u) * sizeof(gfeatures->features[0])); + gfeatures = nm_malloc0_maybe_a(300, gfeatures_len, &gfeatures_free); + gfeatures->cmd = ETHTOOL_GFEATURES; + gfeatures->size = NM_DIV_ROUND_UP(ss_features->len, 32u); + if (_ethtool_call_handle(shandle, gfeatures, gfeatures_len) < 0) + return NULL; + + for (idx = 0; idx < G_N_ELEMENTS(_ethtool_feature_infos); idx++) { + const NMEthtoolFeatureInfo *info = &_ethtool_feature_infos[idx]; + guint idx_kernel_name; + + for (idx_kernel_name = 0; idx_kernel_name < info->n_kernel_names; idx_kernel_name++) { + NMEthtoolFeatureState *kstate; + const char * kernel_name = info->kernel_names[idx_kernel_name]; + int i_feature; + guint i_block; + guint32 i_flag; + + i_feature = ethtool_gstrings_find(ss_features, kernel_name); + if (i_feature < 0) + continue; + + i_block = ((guint) i_feature) / 32u; + i_flag = (guint32)(1u << (((guint) i_feature) % 32u)); + + if (!states) { + states = g_malloc0( + sizeof(NMEthtoolFeatureStates) + + (N_ETHTOOL_KERNEL_FEATURES * sizeof(NMEthtoolFeatureState)) + + ((N_ETHTOOL_KERNEL_FEATURES + G_N_ELEMENTS(_ethtool_feature_infos)) + * sizeof(NMEthtoolFeatureState *))); + states_list0 = &states->states_list[0]; + states_plist0 = (gpointer) &states_list0[N_ETHTOOL_KERNEL_FEATURES]; + states->n_ss_features = ss_features->len; + } + + nm_assert(states->n_states < N_ETHTOOL_KERNEL_FEATURES); + kstate = (NMEthtoolFeatureState *) &states_list0[states->n_states]; + states->n_states++; + + kstate->info = info; + kstate->idx_ss_features = i_feature; + kstate->idx_kernel_name = idx_kernel_name; + kstate->available = !!(gfeatures->features[i_block].available & i_flag); + kstate->requested = !!(gfeatures->features[i_block].requested & i_flag); + kstate->active = !!(gfeatures->features[i_block].active & i_flag); + kstate->never_changed = !!(gfeatures->features[i_block].never_changed & i_flag); + + nm_assert(states_plist_n + < N_ETHTOOL_KERNEL_FEATURES + G_N_ELEMENTS(_ethtool_feature_infos)); + + if (!states->states_indexed[_NM_ETHTOOL_ID_FEATURE_AS_IDX(info->ethtool_id)]) + states->states_indexed[_NM_ETHTOOL_ID_FEATURE_AS_IDX(info->ethtool_id)] = + &states_plist0[states_plist_n]; + ((const NMEthtoolFeatureState **) states_plist0)[states_plist_n] = kstate; + states_plist_n++; + } + + if (states && states->states_indexed[_NM_ETHTOOL_ID_FEATURE_AS_IDX(info->ethtool_id)]) { + nm_assert(states_plist_n + < N_ETHTOOL_KERNEL_FEATURES + G_N_ELEMENTS(_ethtool_feature_infos)); + nm_assert(!states_plist0[states_plist_n]); + states_plist_n++; + } + } + } + + return g_steal_pointer(&states); +} + +NMEthtoolFeatureStates * +nmp_utils_ethtool_get_features(int ifindex) +{ + nm_auto_socket_handle SocketHandle shandle = SOCKET_HANDLE_INIT(ifindex); + NMEthtoolFeatureStates * features; + + g_return_val_if_fail(ifindex > 0, 0); + + features = ethtool_get_features(&shandle); + + if (!features) { + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: failure getting features", + ifindex, + "get-features"); + return NULL; + } + + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: retrieved kernel features", + ifindex, + "get-features"); + return features; +} + +static const char * +_ethtool_feature_state_to_string(char * buf, + gsize buf_size, + const NMEthtoolFeatureState *s, + const char * prefix) +{ + int l; + + l = g_snprintf(buf, + buf_size, + "%s %s%s", + prefix ?: "", + ONOFF(s->active), + (!s->available || s->never_changed) + ? ", [fixed]" + : ((s->requested != s->active) + ? (s->requested ? ", [requested on]" : ", [requested off]") + : "")); + nm_assert(l < buf_size); + return buf; +} + +gboolean +nmp_utils_ethtool_set_features( + int ifindex, + const NMEthtoolFeatureStates *features, + const NMOptionBool *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */, + gboolean do_set /* or reset */) +{ + nm_auto_socket_handle SocketHandle shandle = SOCKET_HANDLE_INIT(ifindex); + gs_free struct ethtool_sfeatures * sfeatures_free = NULL; + struct ethtool_sfeatures * sfeatures; + gsize sfeatures_len; + int r; + guint i, j; + struct { + const NMEthtoolFeatureState *f_state; + NMOptionBool requested; + } set_states[N_ETHTOOL_KERNEL_FEATURES]; + guint set_states_n = 0; + gboolean success = TRUE; + + g_return_val_if_fail(ifindex > 0, 0); + g_return_val_if_fail(features, 0); + g_return_val_if_fail(requested, 0); + + nm_assert(features->n_states <= N_ETHTOOL_KERNEL_FEATURES); + + for (i = 0; i < _NM_ETHTOOL_ID_FEATURE_NUM; i++) { + const NMEthtoolFeatureState *const *states_indexed; + + if (requested[i] == NM_OPTION_BOOL_DEFAULT) + continue; + + if (!(states_indexed = features->states_indexed[i])) { + if (do_set) { + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: set feature %s: skip (not found)", + ifindex, + "set-features", + nm_ethtool_data[i + _NM_ETHTOOL_ID_FEATURE_FIRST]->optname); + success = FALSE; + } + continue; + } + + for (j = 0; states_indexed[j]; j++) { + const NMEthtoolFeatureState *s = states_indexed[j]; + char sbuf[255]; + + if (set_states_n >= G_N_ELEMENTS(set_states)) + g_return_val_if_reached(FALSE); + + if (s->never_changed) { + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: %s feature %s (%s): %s, %s (skip feature marked as " + "never changed)", + ifindex, + "set-features", + do_set ? "set" : "reset", + nm_ethtool_data[i + _NM_ETHTOOL_ID_FEATURE_FIRST]->optname, + s->info->kernel_names[s->idx_kernel_name], + ONOFF(do_set ? requested[i] == NM_OPTION_BOOL_TRUE : s->active), + _ethtool_feature_state_to_string(sbuf, + sizeof(sbuf), + s, + do_set ? " currently:" : " before:")); + continue; + } + + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: %s feature %s (%s): %s, %s", + ifindex, + "set-features", + do_set ? "set" : "reset", + nm_ethtool_data[i + _NM_ETHTOOL_ID_FEATURE_FIRST]->optname, + s->info->kernel_names[s->idx_kernel_name], + ONOFF(do_set ? requested[i] == NM_OPTION_BOOL_TRUE : s->active), + _ethtool_feature_state_to_string(sbuf, + sizeof(sbuf), + s, + do_set ? " currently:" : " before:")); + + if (do_set && (!s->available || s->never_changed) + && (s->active != (requested[i] == NM_OPTION_BOOL_TRUE))) { + /* we request to change a flag which kernel reported as fixed. + * While the ethtool operation will silently succeed, mark the request + * as failure. */ + success = FALSE; + } + + set_states[set_states_n].f_state = s; + set_states[set_states_n].requested = requested[i]; + set_states_n++; + } + } + + if (set_states_n == 0) { + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: no feature requested", + ifindex, + "set-features"); + return TRUE; + } + + sfeatures_len = + sizeof(struct ethtool_sfeatures) + + (NM_DIV_ROUND_UP(features->n_ss_features, 32U) * sizeof(sfeatures->features[0])); + sfeatures = nm_malloc0_maybe_a(300, sfeatures_len, &sfeatures_free); + sfeatures->cmd = ETHTOOL_SFEATURES; + sfeatures->size = NM_DIV_ROUND_UP(features->n_ss_features, 32U); + + for (i = 0; i < set_states_n; i++) { + const NMEthtoolFeatureState *s = set_states[i].f_state; + guint i_block; + guint32 i_flag; + gboolean is_requested; + + i_block = s->idx_ss_features / 32u; + i_flag = (guint32)(1u << (s->idx_ss_features % 32u)); + + sfeatures->features[i_block].valid |= i_flag; + + if (do_set) + is_requested = (set_states[i].requested == NM_OPTION_BOOL_TRUE); + else + is_requested = s->active; + + if (is_requested) + sfeatures->features[i_block].requested |= i_flag; + else + sfeatures->features[i_block].requested &= ~i_flag; + } + + r = _ethtool_call_handle(&shandle, sfeatures, sfeatures_len); + if (r < 0) { + success = FALSE; + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: failure setting features (%s)", + ifindex, + "set-features", + nm_strerror_native(-r)); + return FALSE; + } + + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: %s", + ifindex, + "set-features", + success ? "successfully setting features" + : "at least some of the features were not successfully set"); + return success; +} + +static gboolean +ethtool_get_coalesce(SocketHandle *shandle, NMEthtoolCoalesceState *coalesce) +{ + struct ethtool_coalesce eth_data; + + eth_data.cmd = ETHTOOL_GCOALESCE; + + if (_ethtool_call_handle(shandle, ð_data, sizeof(struct ethtool_coalesce)) != 0) + return FALSE; + + *coalesce = (NMEthtoolCoalesceState){ + .s = { + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_USECS)] = + eth_data.rx_coalesce_usecs, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_FRAMES)] = + eth_data.rx_max_coalesced_frames, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ)] = + eth_data.rx_coalesce_usecs_irq, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ)] = + eth_data.rx_max_coalesced_frames_irq, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_USECS)] = + eth_data.tx_coalesce_usecs, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_FRAMES)] = + eth_data.tx_max_coalesced_frames, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ)] = + eth_data.tx_coalesce_usecs_irq, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ)] = + eth_data.tx_max_coalesced_frames_irq, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS)] = + eth_data.stats_block_coalesce_usecs, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX)] = + eth_data.use_adaptive_rx_coalesce, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX)] = + eth_data.use_adaptive_tx_coalesce, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW)] = + eth_data.pkt_rate_low, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW)] = + eth_data.rx_coalesce_usecs_low, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW)] = + eth_data.rx_max_coalesced_frames_low, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW)] = + eth_data.tx_coalesce_usecs_low, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW)] = + eth_data.tx_max_coalesced_frames_low, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH)] = + eth_data.pkt_rate_high, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH)] = + eth_data.rx_coalesce_usecs_high, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH)] = + eth_data.rx_max_coalesced_frames_high, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH)] = + eth_data.tx_coalesce_usecs_high, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH)] = + eth_data.tx_max_coalesced_frames_high, + [_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL)] = + eth_data.rate_sample_interval, + }}; + return TRUE; +} + +gboolean +nmp_utils_ethtool_get_coalesce(int ifindex, NMEthtoolCoalesceState *coalesce) +{ + nm_auto_socket_handle SocketHandle shandle = SOCKET_HANDLE_INIT(ifindex); + + g_return_val_if_fail(ifindex > 0, FALSE); + g_return_val_if_fail(coalesce, FALSE); + + if (!ethtool_get_coalesce(&shandle, coalesce)) { + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: failure getting coalesce settings", + ifindex, + "get-coalesce"); + return FALSE; + } + + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: retrieved kernel coalesce settings", + ifindex, + "get-coalesce"); + return TRUE; +} + +static gboolean +ethtool_set_coalesce(SocketHandle *shandle, const NMEthtoolCoalesceState *coalesce) +{ + struct ethtool_coalesce eth_data; + gboolean success; + + nm_assert(shandle); + nm_assert(coalesce); + + eth_data = (struct ethtool_coalesce){ + .cmd = ETHTOOL_SCOALESCE, + .rx_coalesce_usecs = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_USECS)], + .rx_max_coalesced_frames = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_FRAMES)], + .rx_coalesce_usecs_irq = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ)], + .rx_max_coalesced_frames_irq = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ)], + .tx_coalesce_usecs = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_USECS)], + .tx_max_coalesced_frames = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_FRAMES)], + .tx_coalesce_usecs_irq = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ)], + .tx_max_coalesced_frames_irq = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ)], + .stats_block_coalesce_usecs = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS)], + .use_adaptive_rx_coalesce = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX)], + .use_adaptive_tx_coalesce = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX)], + .pkt_rate_low = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW)], + .rx_coalesce_usecs_low = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW)], + .rx_max_coalesced_frames_low = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW)], + .tx_coalesce_usecs_low = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW)], + .tx_max_coalesced_frames_low = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW)], + .pkt_rate_high = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH)], + .rx_coalesce_usecs_high = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH)], + .rx_max_coalesced_frames_high = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH)], + .tx_coalesce_usecs_high = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH)], + .tx_max_coalesced_frames_high = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH)], + .rate_sample_interval = + coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX(NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL)], + }; + + success = (_ethtool_call_handle(shandle, ð_data, sizeof(struct ethtool_coalesce)) == 0); + return success; +} + +gboolean +nmp_utils_ethtool_set_coalesce(int ifindex, const NMEthtoolCoalesceState *coalesce) +{ + nm_auto_socket_handle SocketHandle shandle = SOCKET_HANDLE_INIT(ifindex); + + g_return_val_if_fail(ifindex > 0, FALSE); + g_return_val_if_fail(coalesce, FALSE); + + if (!ethtool_set_coalesce(&shandle, coalesce)) { + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: failure setting coalesce settings", + ifindex, + "set-coalesce"); + return FALSE; + } + + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: set kernel coalesce settings", + ifindex, + "set-coalesce"); + return TRUE; +} + +static gboolean +ethtool_get_ring(SocketHandle *shandle, NMEthtoolRingState *ring) +{ + struct ethtool_ringparam eth_data; + + eth_data.cmd = ETHTOOL_GRINGPARAM; + + if (_ethtool_call_handle(shandle, ð_data, sizeof(struct ethtool_ringparam)) != 0) + return FALSE; + + ring->rx_pending = eth_data.rx_pending; + ring->rx_jumbo_pending = eth_data.rx_jumbo_pending; + ring->rx_mini_pending = eth_data.rx_mini_pending; + ring->tx_pending = eth_data.tx_pending; + + return TRUE; +} + +gboolean +nmp_utils_ethtool_get_ring(int ifindex, NMEthtoolRingState *ring) +{ + nm_auto_socket_handle SocketHandle shandle = SOCKET_HANDLE_INIT(ifindex); + + g_return_val_if_fail(ifindex > 0, FALSE); + g_return_val_if_fail(ring, FALSE); + + if (!ethtool_get_ring(&shandle, ring)) { + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: failure getting ring settings", + ifindex, + "get-ring"); + return FALSE; + } + + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: retrieved kernel ring settings", + ifindex, + "get-ring"); + return TRUE; +} + +static gboolean +ethtool_set_ring(SocketHandle *shandle, const NMEthtoolRingState *ring) +{ + gboolean success; + struct ethtool_ringparam eth_data; + + g_return_val_if_fail(shandle, FALSE); + g_return_val_if_fail(ring, FALSE); + + eth_data = (struct ethtool_ringparam){ + .cmd = ETHTOOL_SRINGPARAM, + .rx_pending = ring->rx_pending, + .rx_jumbo_pending = ring->rx_jumbo_pending, + .rx_mini_pending = ring->rx_mini_pending, + .tx_pending = ring->tx_pending, + }; + + success = (_ethtool_call_handle(shandle, ð_data, sizeof(struct ethtool_ringparam)) == 0); + return success; +} + +gboolean +nmp_utils_ethtool_set_ring(int ifindex, const NMEthtoolRingState *ring) +{ + nm_auto_socket_handle SocketHandle shandle = SOCKET_HANDLE_INIT(ifindex); + + g_return_val_if_fail(ifindex > 0, FALSE); + g_return_val_if_fail(ring, FALSE); + + if (!ethtool_set_ring(&shandle, ring)) { + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %s: failure setting ring settings", + ifindex, + "set-ring"); + return FALSE; + } + + nm_log_trace(LOGD_PLATFORM, "ethtool[%d]: %s: set kernel ring settings", ifindex, "set-ring"); + return TRUE; +} + +/*****************************************************************************/ + +gboolean +nmp_utils_ethtool_get_driver_info(int ifindex, NMPUtilsEthtoolDriverInfo *data) +{ + struct ethtool_drvinfo *drvinfo; + + G_STATIC_ASSERT_EXPR(sizeof(*data) == sizeof(*drvinfo)); + G_STATIC_ASSERT_EXPR(offsetof(NMPUtilsEthtoolDriverInfo, driver) + == offsetof(struct ethtool_drvinfo, driver)); + G_STATIC_ASSERT_EXPR(offsetof(NMPUtilsEthtoolDriverInfo, version) + == offsetof(struct ethtool_drvinfo, version)); + G_STATIC_ASSERT_EXPR(offsetof(NMPUtilsEthtoolDriverInfo, fw_version) + == offsetof(struct ethtool_drvinfo, fw_version)); + G_STATIC_ASSERT_EXPR(sizeof(data->driver) == sizeof(drvinfo->driver)); + G_STATIC_ASSERT_EXPR(sizeof(data->version) == sizeof(drvinfo->version)); + G_STATIC_ASSERT_EXPR(sizeof(data->fw_version) == sizeof(drvinfo->fw_version)); + + g_return_val_if_fail(ifindex > 0, FALSE); + g_return_val_if_fail(data, FALSE); + + drvinfo = (struct ethtool_drvinfo *) data; + *drvinfo = (struct ethtool_drvinfo){ + .cmd = ETHTOOL_GDRVINFO, + }; + return _ethtool_call_once(ifindex, drvinfo, sizeof(*drvinfo)) >= 0; +} + +gboolean +nmp_utils_ethtool_get_permanent_address(int ifindex, guint8 *buf, size_t *length) +{ + struct { + struct ethtool_perm_addr e; + guint8 _extra_data[_NM_UTILS_HWADDR_LEN_MAX + 1]; + } edata = { + .e.cmd = ETHTOOL_GPERMADDR, + .e.size = _NM_UTILS_HWADDR_LEN_MAX, + }; + const guint8 *pdata; + + guint i; + + g_return_val_if_fail(ifindex > 0, FALSE); + + if (_ethtool_call_once(ifindex, &edata, sizeof(edata)) < 0) + return FALSE; + + if (edata.e.size > _NM_UTILS_HWADDR_LEN_MAX) + return FALSE; + if (edata.e.size < 1) + return FALSE; + + pdata = (const guint8 *) edata.e.data; + + if (NM_IN_SET(pdata[0], 0, 0xFF)) { + /* Some drivers might return a permanent address of all zeros. + * Reject that (rh#1264024) + * + * Some drivers return a permanent address of all ones. Reject that too */ + for (i = 1; i < edata.e.size; i++) { + if (pdata[0] != pdata[i]) + goto not_all_0or1; + } + return FALSE; + } + +not_all_0or1: + memcpy(buf, pdata, edata.e.size); + *length = edata.e.size; + return TRUE; +} + +gboolean +nmp_utils_ethtool_supports_carrier_detect(int ifindex) +{ + struct ethtool_cmd edata = {.cmd = ETHTOOL_GLINK}; + + g_return_val_if_fail(ifindex > 0, FALSE); + + /* We ignore the result. If the ETHTOOL_GLINK call succeeded, then we + * assume the device supports carrier-detect, otherwise we assume it + * doesn't. + */ + return _ethtool_call_once(ifindex, &edata, sizeof(edata)) >= 0; +} + +gboolean +nmp_utils_ethtool_supports_vlans(int ifindex) +{ + nm_auto_socket_handle SocketHandle shandle = SOCKET_HANDLE_INIT(ifindex); + gs_free struct ethtool_gfeatures * features_free = NULL; + struct ethtool_gfeatures * features; + gsize features_len; + int idx, block, bit, size; + + g_return_val_if_fail(ifindex > 0, FALSE); + + idx = ethtool_get_stringset_index(&shandle, ETH_SS_FEATURES, "vlan-challenged"); + if (idx < 0) { + nm_log_dbg(LOGD_PLATFORM, + "ethtool[%d]: vlan-challenged ethtool feature does not exist?", + ifindex); + return FALSE; + } + + block = idx / 32; + bit = idx % 32; + size = block + 1; + + features_len = sizeof(*features) + (size * sizeof(struct ethtool_get_features_block)); + features = nm_malloc0_maybe_a(300, features_len, &features_free); + features->cmd = ETHTOOL_GFEATURES; + features->size = size; + + if (_ethtool_call_handle(&shandle, features, features_len) < 0) + return FALSE; + + return !(features->features[block].active & (1 << bit)); +} + +int +nmp_utils_ethtool_get_peer_ifindex(int ifindex) +{ + nm_auto_socket_handle SocketHandle shandle = SOCKET_HANDLE_INIT(ifindex); + gsize stats_len; + gs_free struct ethtool_stats * stats_free = NULL; + struct ethtool_stats * stats; + int peer_ifindex_stat; + + g_return_val_if_fail(ifindex > 0, 0); + + peer_ifindex_stat = ethtool_get_stringset_index(&shandle, ETH_SS_STATS, "peer_ifindex"); + if (peer_ifindex_stat < 0) { + nm_log_dbg(LOGD_PLATFORM, "ethtool[%d]: peer_ifindex stat does not exist?", ifindex); + return FALSE; + } + + stats_len = sizeof(*stats) + (peer_ifindex_stat + 1) * sizeof(guint64); + stats = nm_malloc0_maybe_a(300, stats_len, &stats_free); + stats->cmd = ETHTOOL_GSTATS; + stats->n_stats = peer_ifindex_stat + 1; + if (_ethtool_call_handle(&shandle, stats, stats_len) < 0) + return 0; + + return stats->data[peer_ifindex_stat]; +} + +gboolean +nmp_utils_ethtool_get_wake_on_lan(int ifindex) +{ + struct ethtool_wolinfo wol = { + .cmd = ETHTOOL_GWOL, + }; + + g_return_val_if_fail(ifindex > 0, FALSE); + + if (_ethtool_call_once(ifindex, &wol, sizeof(wol)) < 0) + return FALSE; + + return wol.wolopts != 0; +} + +gboolean +nmp_utils_ethtool_get_link_settings(int ifindex, + gboolean * out_autoneg, + guint32 * out_speed, + NMPlatformLinkDuplexType *out_duplex) +{ + struct ethtool_cmd edata = { + .cmd = ETHTOOL_GSET, + }; + + g_return_val_if_fail(ifindex > 0, FALSE); + + if (_ethtool_call_once(ifindex, &edata, sizeof(edata)) < 0) + return FALSE; + + NM_SET_OUT(out_autoneg, (edata.autoneg == AUTONEG_ENABLE)); + + if (out_speed) { + guint32 speed; + + speed = ethtool_cmd_speed(&edata); + if (speed == G_MAXUINT16 || speed == G_MAXUINT32) + speed = 0; + + *out_speed = speed; + } + + if (out_duplex) { + switch (edata.duplex) { + case DUPLEX_HALF: + *out_duplex = NM_PLATFORM_LINK_DUPLEX_HALF; + break; + case DUPLEX_FULL: + *out_duplex = NM_PLATFORM_LINK_DUPLEX_FULL; + break; + default: /* DUPLEX_UNKNOWN */ + *out_duplex = NM_PLATFORM_LINK_DUPLEX_UNKNOWN; + break; + } + } + + return TRUE; +} + +#define ADVERTISED_INVALID 0 +#define BASET_ALL_MODES \ + (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | ADVERTISED_100baseT_Half \ + | ADVERTISED_100baseT_Full | ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full \ + | ADVERTISED_10000baseT_Full) + +static guint32 +get_baset_mode(guint32 speed, NMPlatformLinkDuplexType duplex) +{ + if (duplex == NM_PLATFORM_LINK_DUPLEX_UNKNOWN) + return ADVERTISED_INVALID; + + if (duplex == NM_PLATFORM_LINK_DUPLEX_HALF) { + switch (speed) { + case 10: + return ADVERTISED_10baseT_Half; + case 100: + return ADVERTISED_100baseT_Half; + case 1000: + return ADVERTISED_1000baseT_Half; + default: + return ADVERTISED_INVALID; + } + } else { + switch (speed) { + case 10: + return ADVERTISED_10baseT_Full; + case 100: + return ADVERTISED_100baseT_Full; + case 1000: + return ADVERTISED_1000baseT_Full; + case 10000: + return ADVERTISED_10000baseT_Full; + default: + return ADVERTISED_INVALID; + } + } +} + +gboolean +nmp_utils_ethtool_set_link_settings(int ifindex, + gboolean autoneg, + guint32 speed, + NMPlatformLinkDuplexType duplex) +{ + nm_auto_socket_handle SocketHandle shandle = SOCKET_HANDLE_INIT(ifindex); + struct ethtool_cmd edata = { + .cmd = ETHTOOL_GSET, + }; + + g_return_val_if_fail(ifindex > 0, FALSE); + g_return_val_if_fail((speed && duplex != NM_PLATFORM_LINK_DUPLEX_UNKNOWN) + || (!speed && duplex == NM_PLATFORM_LINK_DUPLEX_UNKNOWN), + FALSE); + + /* retrieve first current settings */ + if (_ethtool_call_handle(&shandle, &edata, sizeof(edata)) < 0) + return FALSE; + + /* FIXME: try first new ETHTOOL_GLINKSETTINGS/SLINKSETTINGS API + * https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3f1ac7a700d039c61d8d8b99f28d605d489a60cf + */ + + /* then change the needed ones */ + edata.cmd = ETHTOOL_SSET; + if (autoneg) { + edata.autoneg = AUTONEG_ENABLE; + if (!speed) + edata.advertising = edata.supported; + else { + guint32 mode; + + mode = get_baset_mode(speed, duplex); + + if (!mode) { + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: %uBASE-T %s duplex mode cannot be advertised", + ifindex, + speed, + nm_platform_link_duplex_type_to_string(duplex)); + return FALSE; + } + if (!(edata.supported & mode)) { + nm_log_trace(LOGD_PLATFORM, + "ethtool[%d]: device does not support %uBASE-T %s duplex mode", + ifindex, + speed, + nm_platform_link_duplex_type_to_string(duplex)); + return FALSE; + } + edata.advertising = (edata.supported & ~BASET_ALL_MODES) | mode; + } + } else { + edata.autoneg = AUTONEG_DISABLE; + + if (speed) + ethtool_cmd_speed_set(&edata, speed); + + switch (duplex) { + case NM_PLATFORM_LINK_DUPLEX_HALF: + edata.duplex = DUPLEX_HALF; + break; + case NM_PLATFORM_LINK_DUPLEX_FULL: + edata.duplex = DUPLEX_FULL; + break; + case NM_PLATFORM_LINK_DUPLEX_UNKNOWN: + break; + default: + g_return_val_if_reached(FALSE); + } + } + + return _ethtool_call_handle(&shandle, &edata, sizeof(edata)) >= 0; +} + +gboolean +nmp_utils_ethtool_set_wake_on_lan(int ifindex, + _NMSettingWiredWakeOnLan wol, + const char * wol_password) +{ + struct ethtool_wolinfo wol_info = { + .cmd = ETHTOOL_SWOL, + .wolopts = 0, + }; + + g_return_val_if_fail(ifindex > 0, FALSE); + + if (wol == _NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE) + return TRUE; + + nm_log_dbg(LOGD_PLATFORM, + "ethtool[%d]: setting Wake-on-LAN options 0x%x, password '%s'", + ifindex, + (unsigned) wol, + wol_password); + + if (NM_FLAGS_HAS(wol, _NM_SETTING_WIRED_WAKE_ON_LAN_PHY)) + wol_info.wolopts |= WAKE_PHY; + if (NM_FLAGS_HAS(wol, _NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST)) + wol_info.wolopts |= WAKE_UCAST; + if (NM_FLAGS_HAS(wol, _NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST)) + wol_info.wolopts |= WAKE_MCAST; + if (NM_FLAGS_HAS(wol, _NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST)) + wol_info.wolopts |= WAKE_BCAST; + if (NM_FLAGS_HAS(wol, _NM_SETTING_WIRED_WAKE_ON_LAN_ARP)) + wol_info.wolopts |= WAKE_ARP; + if (NM_FLAGS_HAS(wol, _NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC)) + wol_info.wolopts |= WAKE_MAGIC; + + if (wol_password) { + if (!_nm_utils_hwaddr_aton_exact(wol_password, wol_info.sopass, ETH_ALEN)) { + nm_log_dbg(LOGD_PLATFORM, + "ethtool[%d]: couldn't parse Wake-on-LAN password '%s'", + ifindex, + wol_password); + return FALSE; + } + wol_info.wolopts |= WAKE_MAGICSECURE; + } + + return _ethtool_call_once(ifindex, &wol_info, sizeof(wol_info)) >= 0; +} + +/****************************************************************************** + * mii + *****************************************************************************/ + +gboolean +nmp_utils_mii_supports_carrier_detect(int ifindex) +{ + nm_auto_socket_handle SocketHandle shandle = SOCKET_HANDLE_INIT(ifindex); + int r; + struct ifreq ifr; + struct mii_ioctl_data * mii; + + g_return_val_if_fail(ifindex > 0, FALSE); + + r = _ioctl_call("mii", + "SIOCGMIIPHY", + SIOCGMIIPHY, + shandle.ifindex, + &shandle.fd, + shandle.ifname, + IOCTL_CALL_DATA_TYPE_NONE, + NULL, + 0, + &ifr); + if (r < 0) + return FALSE; + + /* If we can read the BMSR register, we assume that the card supports MII link detection */ + mii = (struct mii_ioctl_data *) &ifr.ifr_ifru; + mii->reg_num = MII_BMSR; + + r = _ioctl_call("mii", + "SIOCGMIIREG", + SIOCGMIIREG, + shandle.ifindex, + &shandle.fd, + shandle.ifname, + IOCTL_CALL_DATA_TYPE_IFRU, + mii, + sizeof(*mii), + &ifr); + if (r < 0) + return FALSE; + + mii = (struct mii_ioctl_data *) &ifr.ifr_ifru; + nm_log_trace(LOGD_PLATFORM, + "mii[%d,%s]: carrier-detect yes: SIOCGMIIREG result 0x%X", + ifindex, + shandle.ifname, + mii->val_out); + return TRUE; +} + +/****************************************************************************** + * udev + *****************************************************************************/ + +const char * +nmp_utils_udev_get_driver(struct udev_device *udevice) +{ + struct udev_device *parent = NULL, *grandparent = NULL; + const char * driver, *subsys; + + driver = udev_device_get_driver(udevice); + if (driver) + goto out; + + /* Try the parent */ + parent = udev_device_get_parent(udevice); + if (parent) { + driver = udev_device_get_driver(parent); + if (!driver) { + /* Try the grandparent if it's an ibmebus device or if the + * subsys is NULL which usually indicates some sort of + * platform device like a 'gadget' net interface. + */ + subsys = udev_device_get_subsystem(parent); + if ((g_strcmp0(subsys, "ibmebus") == 0) || (subsys == NULL)) { + grandparent = udev_device_get_parent(parent); + if (grandparent) + driver = udev_device_get_driver(grandparent); + } + } + } + +out: + /* Intern the string so we don't have to worry about memory + * management in NMPlatformLink. */ + return g_intern_string(driver); +} + +/****************************************************************************** + * utils + *****************************************************************************/ + +NMIPConfigSource +nmp_utils_ip_config_source_from_rtprot(guint8 rtprot) +{ + return ((int) rtprot) + 1; +} + +NMIPConfigSource +nmp_utils_ip_config_source_round_trip_rtprot(NMIPConfigSource source) +{ + /* when adding a route to kernel for a give @source, the resulting route + * will be put into the cache with a source of NM_IP_CONFIG_SOURCE_RTPROT_*. + * This function returns that. */ + return nmp_utils_ip_config_source_from_rtprot( + nmp_utils_ip_config_source_coerce_to_rtprot(source)); +} + +guint8 +nmp_utils_ip_config_source_coerce_to_rtprot(NMIPConfigSource source) +{ + /* when adding a route to kernel, we coerce the @source field + * to rtm_protocol. This is not lossless as we map different + * source values to the same RTPROT uint8 value. */ + if (source <= NM_IP_CONFIG_SOURCE_UNKNOWN) + return RTPROT_UNSPEC; + + if (source <= _NM_IP_CONFIG_SOURCE_RTPROT_LAST) + return source - 1; + + switch (source) { + case NM_IP_CONFIG_SOURCE_KERNEL: + return RTPROT_KERNEL; + case NM_IP_CONFIG_SOURCE_IP6LL: + return RTPROT_KERNEL; + case NM_IP_CONFIG_SOURCE_DHCP: + return RTPROT_DHCP; + case NM_IP_CONFIG_SOURCE_NDISC: + return RTPROT_RA; + + default: + return RTPROT_STATIC; + } +} + +NMIPConfigSource +nmp_utils_ip_config_source_coerce_from_rtprot(NMIPConfigSource source) +{ + /* When we receive a route from kernel and put it into the platform cache, + * we preserve the protocol field by converting it to a NMIPConfigSource + * via nmp_utils_ip_config_source_from_rtprot(). + * + * However, that is not the inverse of nmp_utils_ip_config_source_coerce_to_rtprot(). + * Instead, to go back to the original value, you need another step: + * nmp_utils_ip_config_source_coerce_from_rtprot (nmp_utils_ip_config_source_from_rtprot (rtprot)). + * + * This might partly restore the original source value, but of course that + * is not really possible because nmp_utils_ip_config_source_coerce_to_rtprot() + * is not injective. + * */ + switch (source) { + case NM_IP_CONFIG_SOURCE_RTPROT_UNSPEC: + return NM_IP_CONFIG_SOURCE_UNKNOWN; + + case NM_IP_CONFIG_SOURCE_RTPROT_KERNEL: + case NM_IP_CONFIG_SOURCE_RTPROT_REDIRECT: + return NM_IP_CONFIG_SOURCE_KERNEL; + + case NM_IP_CONFIG_SOURCE_RTPROT_RA: + return NM_IP_CONFIG_SOURCE_NDISC; + + case NM_IP_CONFIG_SOURCE_RTPROT_DHCP: + return NM_IP_CONFIG_SOURCE_DHCP; + + default: + return NM_IP_CONFIG_SOURCE_USER; + } +} + +const char * +nmp_utils_ip_config_source_to_string(NMIPConfigSource source, char *buf, gsize len) +{ + const char *s = NULL; + nm_utils_to_string_buffer_init(&buf, &len); + + if (!len) + return buf; + + switch (source) { + case NM_IP_CONFIG_SOURCE_UNKNOWN: + s = "unknown"; + break; + + case NM_IP_CONFIG_SOURCE_RTPROT_UNSPEC: + s = "rt-unspec"; + break; + case NM_IP_CONFIG_SOURCE_RTPROT_REDIRECT: + s = "rt-redirect"; + break; + case NM_IP_CONFIG_SOURCE_RTPROT_KERNEL: + s = "rt-kernel"; + break; + case NM_IP_CONFIG_SOURCE_RTPROT_BOOT: + s = "rt-boot"; + break; + case NM_IP_CONFIG_SOURCE_RTPROT_STATIC: + s = "rt-static"; + break; + case NM_IP_CONFIG_SOURCE_RTPROT_DHCP: + s = "rt-dhcp"; + break; + case NM_IP_CONFIG_SOURCE_RTPROT_RA: + s = "rt-ra"; + break; + + case NM_IP_CONFIG_SOURCE_KERNEL: + s = "kernel"; + break; + case NM_IP_CONFIG_SOURCE_SHARED: + s = "shared"; + break; + case NM_IP_CONFIG_SOURCE_IP4LL: + s = "ipv4ll"; + break; + case NM_IP_CONFIG_SOURCE_IP6LL: + s = "ipv6ll"; + break; + case NM_IP_CONFIG_SOURCE_PPP: + s = "ppp"; + break; + case NM_IP_CONFIG_SOURCE_WWAN: + s = "wwan"; + break; + case NM_IP_CONFIG_SOURCE_VPN: + s = "vpn"; + break; + case NM_IP_CONFIG_SOURCE_DHCP: + s = "dhcp"; + break; + case NM_IP_CONFIG_SOURCE_NDISC: + s = "ndisc"; + break; + case NM_IP_CONFIG_SOURCE_USER: + s = "user"; + break; + default: + break; + } + + if (source >= 1 && source <= 0x100) { + if (s) + g_snprintf(buf, len, "%s", s); + else + g_snprintf(buf, len, "rt-%d", ((int) source) - 1); + } else { + if (s) + g_strlcpy(buf, s, len); + else + g_snprintf(buf, len, "(%d)", source); + } + return buf; +} + +/** + * nmp_utils_sysctl_open_netdir: + * @ifindex: the ifindex for which to open "/sys/class/net/%s" + * @ifname_guess: (allow-none): optional argument, if present used as initial + * guess as the current name for @ifindex. If guessed right, + * it saves an additional if_indextoname() call. + * @out_ifname: (allow-none): if present, must be at least IFNAMSIZ + * characters. On success, this will contain the actual ifname + * found while opening the directory. + * + * Returns: a negative value on failure, on success returns the open fd + * to the "/sys/class/net/%s" directory for @ifindex. + */ +int +nmp_utils_sysctl_open_netdir(int ifindex, const char *ifname_guess, char *out_ifname) +{ +#define SYS_CLASS_NET "/sys/class/net/" + const char *ifname = ifname_guess; + char ifname_buf_last_try[IFNAMSIZ]; + char ifname_buf[IFNAMSIZ]; + guint try_count = 0; + char sysdir[NM_STRLEN(SYS_CLASS_NET) + IFNAMSIZ] = SYS_CLASS_NET; + char fd_buf[256]; + ssize_t nn; + + g_return_val_if_fail(ifindex >= 0, -1); + + ifname_buf_last_try[0] = '\0'; + + for (try_count = 0; try_count < 10; try_count++, ifname = NULL) { + nm_auto_close int fd_dir = -1; + nm_auto_close int fd_ifindex = -1; + + if (!ifname) { + ifname = nmp_utils_if_indextoname(ifindex, ifname_buf); + if (!ifname) + return -1; + } + + nm_assert(nm_utils_ifname_valid_kernel(ifname, NULL)); + + if (g_strlcpy(&sysdir[NM_STRLEN(SYS_CLASS_NET)], ifname, IFNAMSIZ) >= IFNAMSIZ) + g_return_val_if_reached(-1); + + /* we only retry, if the name changed since previous attempt. + * Hence, it is extremely unlikely that this loop runes until the + * end of the @try_count. */ + if (nm_streq(ifname, ifname_buf_last_try)) + return -1; + strcpy(ifname_buf_last_try, ifname); + + fd_dir = open(sysdir, O_DIRECTORY | O_CLOEXEC); + if (fd_dir < 0) + continue; + + fd_ifindex = openat(fd_dir, "ifindex", O_CLOEXEC); + if (fd_ifindex < 0) + continue; + + nn = nm_utils_fd_read_loop(fd_ifindex, fd_buf, sizeof(fd_buf) - 2, FALSE); + if (nn <= 0) + continue; + fd_buf[nn] = '\0'; + + if (ifindex != (int) _nm_utils_ascii_str_to_int64(fd_buf, 10, 1, G_MAXINT, -1)) + continue; + + if (out_ifname) + strcpy(out_ifname, ifname); + + return nm_steal_fd(&fd_dir); + } + + return -1; +} diff --git a/shared/nm-platform/nm-platform-utils.h b/shared/nm-platform/nm-platform-utils.h new file mode 100644 index 0000000..d74723e --- /dev/null +++ b/shared/nm-platform/nm-platform-utils.h @@ -0,0 +1,73 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2015 Red Hat, Inc. + */ + +#ifndef __NM_PLATFORM_UTILS_H__ +#define __NM_PLATFORM_UTILS_H__ + +#include "nm-base/nm-base.h" +#include "nm-platform/nmp-base.h" + +/*****************************************************************************/ + +const char *nmp_utils_ethtool_get_driver(int ifindex); +gboolean nmp_utils_ethtool_supports_carrier_detect(int ifindex); +gboolean nmp_utils_ethtool_supports_vlans(int ifindex); +int nmp_utils_ethtool_get_peer_ifindex(int ifindex); +gboolean nmp_utils_ethtool_get_wake_on_lan(int ifindex); +gboolean nmp_utils_ethtool_set_wake_on_lan(int ifindex, + _NMSettingWiredWakeOnLan wol, + const char * wol_password); + +const char *nm_platform_link_duplex_type_to_string(NMPlatformLinkDuplexType duplex); + +gboolean nmp_utils_ethtool_get_link_settings(int ifindex, + gboolean * out_autoneg, + guint32 * out_speed, + NMPlatformLinkDuplexType *out_duplex); +gboolean nmp_utils_ethtool_set_link_settings(int ifindex, + gboolean autoneg, + guint32 speed, + NMPlatformLinkDuplexType duplex); + +gboolean nmp_utils_ethtool_get_permanent_address(int ifindex, guint8 *buf, size_t *length); + +gboolean nmp_utils_ethtool_get_driver_info(int ifindex, NMPUtilsEthtoolDriverInfo *data); + +NMEthtoolFeatureStates *nmp_utils_ethtool_get_features(int ifindex); + +gboolean nmp_utils_ethtool_set_features( + int ifindex, + const NMEthtoolFeatureStates *features, + const NMOptionBool *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */, + gboolean do_set /* or reset */); + +gboolean nmp_utils_ethtool_get_coalesce(int ifindex, NMEthtoolCoalesceState *coalesce); + +gboolean nmp_utils_ethtool_set_coalesce(int ifindex, const NMEthtoolCoalesceState *coalesce); + +gboolean nmp_utils_ethtool_get_ring(int ifindex, NMEthtoolRingState *ring); + +gboolean nmp_utils_ethtool_set_ring(int ifindex, const NMEthtoolRingState *ring); + +/*****************************************************************************/ + +gboolean nmp_utils_mii_supports_carrier_detect(int ifindex); + +struct udev_device; + +const char *nmp_utils_udev_get_driver(struct udev_device *udevice); + +NMIPConfigSource nmp_utils_ip_config_source_from_rtprot(guint8 rtprot) _nm_const; +guint8 nmp_utils_ip_config_source_coerce_to_rtprot(NMIPConfigSource source) _nm_const; +NMIPConfigSource nmp_utils_ip_config_source_coerce_from_rtprot(NMIPConfigSource source) _nm_const; +NMIPConfigSource nmp_utils_ip_config_source_round_trip_rtprot(NMIPConfigSource source) _nm_const; +const char *nmp_utils_ip_config_source_to_string(NMIPConfigSource source, char *buf, gsize len); + +const char *nmp_utils_if_indextoname(int ifindex, char *out_ifname /*IFNAMSIZ*/); +int nmp_utils_if_nametoindex(const char *ifname); + +int nmp_utils_sysctl_open_netdir(int ifindex, const char *ifname_guess, char *out_ifname); + +#endif /* __NM_PLATFORM_UTILS_H__ */ diff --git a/shared/nm-platform/nmp-base.h b/shared/nm-platform/nmp-base.h new file mode 100644 index 0000000..210c26d --- /dev/null +++ b/shared/nm-platform/nmp-base.h @@ -0,0 +1,94 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#ifndef __NMP_FWD_H__ +#define __NMP_FWD_H__ + +#include "nm-base/nm-base.h" + +/*****************************************************************************/ + +typedef enum { + NM_PLATFORM_LINK_DUPLEX_UNKNOWN, + NM_PLATFORM_LINK_DUPLEX_HALF, + NM_PLATFORM_LINK_DUPLEX_FULL, +} NMPlatformLinkDuplexType; + +/*****************************************************************************/ + +typedef struct { + /* We don't want to include in header files, + * thus create a ABI compatible version of struct ethtool_drvinfo.*/ + guint32 _private_cmd; + char driver[32]; + char version[32]; + char fw_version[32]; + char _private_bus_info[32]; + char _private_erom_version[32]; + char _private_reserved2[12]; + guint32 _private_n_priv_flags; + guint32 _private_n_stats; + guint32 _private_testinfo_len; + guint32 _private_eedump_len; + guint32 _private_regdump_len; +} NMPUtilsEthtoolDriverInfo; + +typedef struct { + NMEthtoolID ethtool_id; + + guint8 n_kernel_names; + + /* one NMEthtoolID refers to one or more kernel_names. The reason for supporting this complexity + * (where one NMSettingEthtool option refers to multiple kernel features) is to follow what + * ethtool does, where "tx" is an alias for multiple features. */ + const char *const *kernel_names; +} NMEthtoolFeatureInfo; + +typedef struct { + const NMEthtoolFeatureInfo *info; + + guint idx_ss_features; + + /* one NMEthtoolFeatureInfo references one or more kernel_names. This is the index + * of the matching info->kernel_names */ + guint8 idx_kernel_name; + + bool available : 1; + bool requested : 1; + bool active : 1; + bool never_changed : 1; +} NMEthtoolFeatureState; + +typedef struct { + guint n_states; + + guint n_ss_features; + + /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */ + const NMEthtoolFeatureState *const *states_indexed[_NM_ETHTOOL_ID_FEATURE_NUM]; + + /* the same content, here as a list of n_states entries. */ + const NMEthtoolFeatureState states_list[]; +} NMEthtoolFeatureStates; + +/*****************************************************************************/ + +typedef struct { + guint32 + s[_NM_ETHTOOL_ID_COALESCE_NUM /* indexed by (NMEthtoolID - _NM_ETHTOOL_ID_COALESCE_FIRST) */ + ]; +} NMEthtoolCoalesceState; + +/*****************************************************************************/ + +typedef struct { + guint32 rx_pending; + guint32 rx_mini_pending; + guint32 rx_jumbo_pending; + guint32 tx_pending; +} NMEthtoolRingState; + +/*****************************************************************************/ + +typedef struct _NMPNetns NMPNetns; + +#endif /* __NMP_FWD_H__ */ diff --git a/shared/nm-platform/nmp-netns.c b/shared/nm-platform/nmp-netns.c new file mode 100644 index 0000000..01aefde --- /dev/null +++ b/shared/nm-platform/nmp-netns.c @@ -0,0 +1,766 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2016 Red Hat, Inc. + */ + +#include "nm-default.h" + +#include "nmp-netns.h" + +#include +#include +#include +#include +#include + +#include "nm-log-core/nm-logging.h" + +/*****************************************************************************/ + +/* NOTE: NMPNetns and all code used here must be thread-safe! */ + +/* we may not call logging functions from the main-thread alone. Hence, we + * require locking from nm-logging. Indicate that by setting NM_THREAD_SAFE_ON_MAIN_THREAD + * to zero. */ +#undef NM_THREAD_SAFE_ON_MAIN_THREAD +#define NM_THREAD_SAFE_ON_MAIN_THREAD 0 + +/*****************************************************************************/ + +#define PROC_SELF_NS_MNT "/proc/self/ns/mnt" +#define PROC_SELF_NS_NET "/proc/self/ns/net" + +#define _CLONE_NS_ALL ((int) (CLONE_NEWNS | CLONE_NEWNET)) +#define _CLONE_NS_ALL_V CLONE_NEWNS, CLONE_NEWNET + +static NM_UTILS_FLAGS2STR_DEFINE(_clone_ns_to_str, + int, + NM_UTILS_FLAGS2STR(CLONE_NEWNS, "mnt"), + NM_UTILS_FLAGS2STR(CLONE_NEWNET, "net"), ); + +static const char * +__ns_types_to_str(int ns_types, int ns_types_already_set, char *buf, gsize len) +{ + const char *b = buf; + char bb[200]; + + nm_utils_strbuf_append_c(&buf, &len, '['); + if (ns_types & ~ns_types_already_set) { + nm_utils_strbuf_append_str( + &buf, + &len, + _clone_ns_to_str(ns_types & ~ns_types_already_set, bb, sizeof(bb))); + } + if (ns_types & ns_types_already_set) { + if (ns_types & ~ns_types_already_set) + nm_utils_strbuf_append_c(&buf, &len, '/'); + nm_utils_strbuf_append_str( + &buf, + &len, + _clone_ns_to_str(ns_types & ns_types_already_set, bb, sizeof(bb))); + } + nm_utils_strbuf_append_c(&buf, &len, ']'); + return b; +} +#define _ns_types_to_str(ns_types, ns_types_already_set, buf) \ + __ns_types_to_str(ns_types, ns_types_already_set, buf, sizeof(buf)) + +/*****************************************************************************/ + +#define _NMLOG_DOMAIN LOGD_PLATFORM +#define _NMLOG_PREFIX_NAME "netns" +#define _NMLOG(level, netns, ...) \ + G_STMT_START \ + { \ + NMLogLevel _level = (level); \ + \ + if (nm_logging_enabled(_level, _NMLOG_DOMAIN)) { \ + NMPNetns *_netns = (netns); \ + char _sbuf[20]; \ + \ + _nm_log(_level, \ + _NMLOG_DOMAIN, \ + 0, \ + NULL, \ + NULL, \ + "%s%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \ + _NMLOG_PREFIX_NAME, \ + (_netns ? nm_sprintf_buf(_sbuf, "[%p]", _netns) \ + : "") _NM_UTILS_MACRO_REST(__VA_ARGS__)); \ + } \ + } \ + G_STMT_END + +/*****************************************************************************/ + +NM_GOBJECT_PROPERTIES_DEFINE_BASE(PROP_FD_NET, PROP_FD_MNT, ); + +typedef struct { + int fd_net; + int fd_mnt; +} NMPNetnsPrivate; + +struct _NMPNetns { + GObject parent; + NMPNetnsPrivate _priv; +}; + +struct _NMPNetnsClass { + GObjectClass parent; +}; + +G_DEFINE_TYPE(NMPNetns, nmp_netns, G_TYPE_OBJECT); + +#define NMP_NETNS_GET_PRIVATE(self) _NM_GET_PRIVATE(self, NMPNetns, NMP_IS_NETNS) + +/*****************************************************************************/ + +typedef struct { + NMPNetns *netns; + int count; + int ns_types; +} NetnsInfo; + +static void _stack_push(GArray *netns_stack, NMPNetns *netns, int ns_types); +static NMPNetns *_netns_new(GError **error); + +/*****************************************************************************/ + +static NMPNetns * +_netns_get(NetnsInfo *info) +{ + nm_assert(!info || NMP_IS_NETNS(info->netns)); + return info ? info->netns : NULL; +} + +/*****************************************************************************/ + +static _nm_thread_local GArray *_netns_stack = NULL; + +static void +_netns_stack_clear_cb(gpointer data) +{ + NetnsInfo *info = data; + + nm_assert(NMP_IS_NETNS(info->netns)); + g_object_unref(info->netns); +} + +static GArray * +_netns_stack_get_impl(void) +{ + gs_unref_object NMPNetns *netns = NULL; + gs_free_error GError *error = NULL; + pthread_key_t key; + GArray * s; + + s = g_array_new(FALSE, FALSE, sizeof(NetnsInfo)); + g_array_set_clear_func(s, _netns_stack_clear_cb); + _netns_stack = s; + + /* at the bottom of the stack we must try to create a netns instance + * that we never pop. It's the base to which we need to return. */ + netns = _netns_new(&error); + if (!netns) { + _LOGE(NULL, "failed to create initial netns: %s", error->message); + return s; + } + + /* we leak this instance inside the stack. */ + _stack_push(s, netns, _CLONE_NS_ALL); + + /* finally, register a destructor function to cleanup the array. If we fail + * to do so, we will leak NMPNetns instances (and their file descriptor) when the + * thread exits. */ + if (pthread_key_create(&key, (void (*)(void *)) g_array_unref) != 0) + _LOGE(NULL, "failure to initialize thread-local storage"); + else if (pthread_setspecific(key, s) != 0) + _LOGE(NULL, "failure to set thread-local storage"); + + return s; +} + +#define _netns_stack_get() \ + ({ \ + GArray *_s = _netns_stack; \ + \ + if (G_UNLIKELY(!_s)) \ + _s = _netns_stack_get_impl(); \ + _s; \ + }) + +/*****************************************************************************/ + +static NMPNetns * +_stack_current_netns(GArray *netns_stack, int ns_types) +{ + guint j; + + nm_assert(netns_stack && netns_stack->len > 0); + + /* we search the stack top-down to find the netns that has + * all @ns_types set. */ + for (j = netns_stack->len; ns_types && j >= 1;) { + NetnsInfo *info; + + info = &g_array_index(netns_stack, NetnsInfo, --j); + + if (NM_FLAGS_ALL(info->ns_types, ns_types)) + return info->netns; + } + + g_return_val_if_reached(NULL); +} + +static int +_stack_current_ns_types(GArray *netns_stack, NMPNetns *netns, int ns_types) +{ + const int ns_types_check[] = {_CLONE_NS_ALL_V}; + guint i, j; + int res = 0; + + nm_assert(netns); + nm_assert(netns_stack && netns_stack->len > 0); + + /* we search the stack top-down to check which of @ns_types + * are already set to @netns. */ + for (j = netns_stack->len; ns_types && j >= 1;) { + NetnsInfo *info; + + info = &g_array_index(netns_stack, NetnsInfo, --j); + if (info->netns != netns) { + ns_types = NM_FLAGS_UNSET(ns_types, info->ns_types); + continue; + } + + for (i = 0; i < G_N_ELEMENTS(ns_types_check); i++) { + if (NM_FLAGS_ANY(ns_types, ns_types_check[i]) + && NM_FLAGS_ANY(info->ns_types, ns_types_check[i])) { + res = NM_FLAGS_SET(res, ns_types_check[i]); + ns_types = NM_FLAGS_UNSET(ns_types, ns_types_check[i]); + } + } + } + + return res; +} + +static NetnsInfo * +_stack_peek(GArray *netns_stack) +{ + if (netns_stack->len > 0) + return &g_array_index(netns_stack, NetnsInfo, (netns_stack->len - 1)); + return NULL; +} + +static NetnsInfo * +_stack_bottom(GArray *netns_stack) +{ + if (netns_stack->len > 0) + return &g_array_index(netns_stack, NetnsInfo, 0); + return NULL; +} + +static void +_stack_push(GArray *netns_stack, NMPNetns *netns, int ns_types) +{ + NetnsInfo *info; + + nm_assert(netns_stack); + nm_assert(NMP_IS_NETNS(netns)); + nm_assert(NM_FLAGS_ANY(ns_types, _CLONE_NS_ALL)); + nm_assert(!NM_FLAGS_ANY(ns_types, ~_CLONE_NS_ALL)); + + g_array_set_size(netns_stack, netns_stack->len + 1); + + info = &g_array_index(netns_stack, NetnsInfo, (netns_stack->len - 1)); + *info = (NetnsInfo){ + .netns = g_object_ref(netns), + .ns_types = ns_types, + .count = 1, + }; +} + +static void +_stack_pop(GArray *netns_stack) +{ + NetnsInfo *info; + + nm_assert(netns_stack); + nm_assert(netns_stack->len > 1); + + info = &g_array_index(netns_stack, NetnsInfo, (netns_stack->len - 1)); + + nm_assert(NMP_IS_NETNS(info->netns)); + nm_assert(info->count == 1); + + g_array_set_size(netns_stack, netns_stack->len - 1); +} + +static guint +_stack_size(GArray *netns_stack) +{ + nm_assert(netns_stack); + + return netns_stack->len; +} + +/*****************************************************************************/ + +static NMPNetns * +_netns_new(GError **error) +{ + NMPNetns *self; + int fd_net, fd_mnt; + int errsv; + + fd_net = open(PROC_SELF_NS_NET, O_RDONLY | O_CLOEXEC); + if (fd_net == -1) { + errsv = errno; + g_set_error(error, + NM_UTILS_ERROR, + NM_UTILS_ERROR_UNKNOWN, + "Failed opening netns: %s", + nm_strerror_native(errsv)); + errno = errsv; + return NULL; + } + + fd_mnt = open(PROC_SELF_NS_MNT, O_RDONLY | O_CLOEXEC); + if (fd_mnt == -1) { + errsv = errno; + g_set_error(error, + NM_UTILS_ERROR, + NM_UTILS_ERROR_UNKNOWN, + "Failed opening mntns: %s", + nm_strerror_native(errsv)); + nm_close(fd_net); + errno = errsv; + return NULL; + } + + self = g_object_new(NMP_TYPE_NETNS, NMP_NETNS_FD_NET, fd_net, NMP_NETNS_FD_MNT, fd_mnt, NULL); + + _LOGD(self, "new netns (net:%d, mnt:%d)", fd_net, fd_mnt); + + return self; +} + +static int +_setns(NMPNetns *self, int type) +{ + char buf[100]; + int fd; + NMPNetnsPrivate *priv = NMP_NETNS_GET_PRIVATE(self); + + nm_assert(NM_IN_SET(type, _CLONE_NS_ALL_V)); + + fd = (type == CLONE_NEWNET) ? priv->fd_net : priv->fd_mnt; + + _LOGt(self, "set netns(%s, %d)", _ns_types_to_str(type, 0, buf), fd); + + return setns(fd, type); +} + +static gboolean +_netns_switch_push(GArray *netns_stack, NMPNetns *self, int ns_types) +{ + int errsv; + + if (NM_FLAGS_HAS(ns_types, CLONE_NEWNET) + && !_stack_current_ns_types(netns_stack, self, CLONE_NEWNET) + && _setns(self, CLONE_NEWNET) != 0) { + errsv = errno; + _LOGE(self, "failed to switch netns: %s", nm_strerror_native(errsv)); + return FALSE; + } + if (NM_FLAGS_HAS(ns_types, CLONE_NEWNS) + && !_stack_current_ns_types(netns_stack, self, CLONE_NEWNS) + && _setns(self, CLONE_NEWNS) != 0) { + errsv = errno; + _LOGE(self, "failed to switch mntns: %s", nm_strerror_native(errsv)); + + /* try to fix the mess by returning to the previous netns. */ + if (NM_FLAGS_HAS(ns_types, CLONE_NEWNET) + && !_stack_current_ns_types(netns_stack, self, CLONE_NEWNET)) { + self = _stack_current_netns(netns_stack, CLONE_NEWNET); + if (self && _setns(self, CLONE_NEWNET) != 0) { + errsv = errno; + _LOGE(self, "failed to restore netns: %s", nm_strerror_native(errsv)); + } + } + return FALSE; + } + + return TRUE; +} + +static gboolean +_netns_switch_pop(GArray *netns_stack, NMPNetns *self, int ns_types) +{ + int errsv; + NMPNetns *current; + int success = TRUE; + + if (NM_FLAGS_HAS(ns_types, CLONE_NEWNET) + && (!self || !_stack_current_ns_types(netns_stack, self, CLONE_NEWNET))) { + current = _stack_current_netns(netns_stack, CLONE_NEWNET); + if (!current) { + g_warn_if_reached(); + success = FALSE; + } else if (_setns(current, CLONE_NEWNET) != 0) { + errsv = errno; + _LOGE(self, "failed to switch netns: %s", nm_strerror_native(errsv)); + success = FALSE; + } + } + if (NM_FLAGS_HAS(ns_types, CLONE_NEWNS) + && (!self || !_stack_current_ns_types(netns_stack, self, CLONE_NEWNS))) { + current = _stack_current_netns(netns_stack, CLONE_NEWNS); + if (!current) { + g_warn_if_reached(); + success = FALSE; + } else if (_setns(current, CLONE_NEWNS) != 0) { + errsv = errno; + _LOGE(self, "failed to switch mntns: %s", nm_strerror_native(errsv)); + success = FALSE; + } + } + + return success; +} + +/*****************************************************************************/ + +int +nmp_netns_get_fd_net(NMPNetns *self) +{ + g_return_val_if_fail(NMP_IS_NETNS(self), 0); + + return NMP_NETNS_GET_PRIVATE(self)->fd_net; +} + +int +nmp_netns_get_fd_mnt(NMPNetns *self) +{ + g_return_val_if_fail(NMP_IS_NETNS(self), 0); + + return NMP_NETNS_GET_PRIVATE(self)->fd_mnt; +} + +/*****************************************************************************/ + +static gboolean +_nmp_netns_push_type(NMPNetns *self, int ns_types) +{ + GArray * netns_stack = _netns_stack_get(); + NetnsInfo *info; + char sbuf[100]; + + info = _stack_peek(netns_stack); + g_return_val_if_fail(info, FALSE); + + if (info->netns == self && info->ns_types == ns_types) { + info->count++; + _LOGt(self, + "push#%u* %s (increase count to %d)", + _stack_size(netns_stack) - 1, + _ns_types_to_str(ns_types, ns_types, sbuf), + info->count); + return TRUE; + } + + _LOGD(self, + "push#%u %s", + _stack_size(netns_stack), + _ns_types_to_str(ns_types, _stack_current_ns_types(netns_stack, self, ns_types), sbuf)); + + if (!_netns_switch_push(netns_stack, self, ns_types)) + return FALSE; + + _stack_push(netns_stack, self, ns_types); + return TRUE; +} + +gboolean +nmp_netns_push(NMPNetns *self) +{ + g_return_val_if_fail(NMP_IS_NETNS(self), FALSE); + + return _nmp_netns_push_type(self, _CLONE_NS_ALL); +} + +gboolean +nmp_netns_push_type(NMPNetns *self, int ns_types) +{ + g_return_val_if_fail(NMP_IS_NETNS(self), FALSE); + g_return_val_if_fail(!NM_FLAGS_ANY(ns_types, ~_CLONE_NS_ALL), FALSE); + + return _nmp_netns_push_type(self, ns_types == 0 ? _CLONE_NS_ALL : ns_types); +} + +NMPNetns * +nmp_netns_new(void) +{ + GArray * netns_stack = _netns_stack_get(); + NMPNetns * self; + int errsv; + GError * error = NULL; + unsigned long mountflags = 0; + + if (!_stack_peek(netns_stack)) { + /* there are no netns instances. We cannot create a new one + * (because after unshare we couldn't return to the original one). */ + errno = ENOTSUP; + return NULL; + } + + if (unshare(_CLONE_NS_ALL) != 0) { + errsv = errno; + _LOGE(NULL, "failed to create new net and mnt namespace: %s", nm_strerror_native(errsv)); + return NULL; + } + + if (mount("", "/", "none", MS_SLAVE | MS_REC, NULL) != 0) { + errsv = errno; + _LOGE(NULL, "failed mount --make-rslave: %s", nm_strerror_native(errsv)); + goto err_out; + } + + if (umount2("/sys", MNT_DETACH) != 0) { + errsv = errno; + _LOGE(NULL, "failed umount /sys: %s", nm_strerror_native(errsv)); + goto err_out; + } + + if (access("/sys", W_OK) == -1) + mountflags = MS_RDONLY; + + if (mount("sysfs", "/sys", "sysfs", mountflags, NULL) != 0) { + errsv = errno; + _LOGE(NULL, "failed mount /sys: %s", nm_strerror_native(errsv)); + goto err_out; + } + + self = _netns_new(&error); + if (!self) { + errsv = errno; + _LOGE(NULL, "failed to create netns after unshare: %s", error->message); + g_clear_error(&error); + goto err_out; + } + + _stack_push(netns_stack, self, _CLONE_NS_ALL); + + return self; +err_out: + _netns_switch_pop(netns_stack, NULL, _CLONE_NS_ALL); + errno = errsv; + return NULL; +} + +gboolean +nmp_netns_pop(NMPNetns *self) +{ + GArray * netns_stack = _netns_stack_get(); + NetnsInfo *info; + int ns_types; + + g_return_val_if_fail(NMP_IS_NETNS(self), FALSE); + + info = _stack_peek(netns_stack); + + g_return_val_if_fail(info, FALSE); + g_return_val_if_fail(info->netns == self, FALSE); + + if (info->count > 1) { + info->count--; + _LOGt(self, "pop#%u* (decrease count to %d)", _stack_size(netns_stack) - 1, info->count); + return TRUE; + } + g_return_val_if_fail(info->count == 1, FALSE); + + /* cannot pop the original netns. */ + g_return_val_if_fail(_stack_size(netns_stack) > 1, FALSE); + + _LOGD(self, "pop#%u", _stack_size(netns_stack) - 1); + + ns_types = info->ns_types; + + _stack_pop(netns_stack); + + return _netns_switch_pop(netns_stack, self, ns_types); +} + +NMPNetns * +nmp_netns_get_current(void) +{ + return _netns_get(_stack_peek(_netns_stack_get())); +} + +NMPNetns * +nmp_netns_get_initial(void) +{ + return _netns_get(_stack_bottom(_netns_stack_get())); +} + +gboolean +nmp_netns_is_initial(void) +{ + GArray *netns_stack = _netns_stack_get(); + + return (_netns_get(_stack_peek(netns_stack)) == _netns_get(_stack_bottom(netns_stack))); +} + +/*****************************************************************************/ + +gboolean +nmp_netns_bind_to_path(NMPNetns *self, const char *filename, int *out_fd) +{ + gs_free char * dirname = NULL; + int errsv; + int fd; + nm_auto_pop_netns NMPNetns *netns_pop = NULL; + + g_return_val_if_fail(NMP_IS_NETNS(self), FALSE); + g_return_val_if_fail(filename && filename[0] == '/', FALSE); + + if (!nmp_netns_push_type(self, CLONE_NEWNET)) + return FALSE; + netns_pop = self; + + dirname = g_path_get_dirname(filename); + if (mkdir(dirname, 0) != 0) { + errsv = errno; + if (errsv != EEXIST) { + _LOGE(self, + "bind: failed to create directory %s: %s", + dirname, + nm_strerror_native(errsv)); + return FALSE; + } + } + + if ((fd = creat(filename, S_IRUSR | S_IRGRP | S_IROTH)) == -1) { + errsv = errno; + _LOGE(self, "bind: failed to create %s: %s", filename, nm_strerror_native(errsv)); + return FALSE; + } + nm_close(fd); + + if (mount(PROC_SELF_NS_NET, filename, "none", MS_BIND, NULL) != 0) { + errsv = errno; + _LOGE(self, + "bind: failed to mount %s to %s: %s", + PROC_SELF_NS_NET, + filename, + nm_strerror_native(errsv)); + unlink(filename); + return FALSE; + } + + if (out_fd) { + if ((fd = open(filename, O_RDONLY | O_CLOEXEC)) == -1) { + errsv = errno; + _LOGE(self, "bind: failed to open %s: %s", filename, nm_strerror_native(errsv)); + umount2(filename, MNT_DETACH); + unlink(filename); + return FALSE; + } + *out_fd = fd; + } + + return TRUE; +} + +gboolean +nmp_netns_bind_to_path_destroy(NMPNetns *self, const char *filename) +{ + int errsv; + + g_return_val_if_fail(NMP_IS_NETNS(self), FALSE); + g_return_val_if_fail(filename && filename[0] == '/', FALSE); + + if (umount2(filename, MNT_DETACH) != 0) { + errsv = errno; + _LOGE(self, "bind: failed to unmount2 %s: %s", filename, nm_strerror_native(errsv)); + return FALSE; + } + if (unlink(filename) != 0) { + errsv = errno; + _LOGE(self, "bind: failed to unlink %s: %s", filename, nm_strerror_native(errsv)); + return FALSE; + } + return TRUE; +} + +/*****************************************************************************/ + +static void +set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + NMPNetns * self = NMP_NETNS(object); + NMPNetnsPrivate *priv = NMP_NETNS_GET_PRIVATE(self); + + switch (prop_id) { + case PROP_FD_NET: + /* construct-only */ + priv->fd_net = g_value_get_int(value); + g_return_if_fail(priv->fd_net > 0); + break; + case PROP_FD_MNT: + /* construct-only */ + priv->fd_mnt = g_value_get_int(value); + g_return_if_fail(priv->fd_mnt > 0); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void +nmp_netns_init(NMPNetns *self) +{} + +static void +dispose(GObject *object) +{ + NMPNetns * self = NMP_NETNS(object); + NMPNetnsPrivate *priv = NMP_NETNS_GET_PRIVATE(self); + + nm_close(priv->fd_net); + priv->fd_net = -1; + + nm_close(priv->fd_mnt); + priv->fd_mnt = -1; + + G_OBJECT_CLASS(nmp_netns_parent_class)->dispose(object); +} + +static void +nmp_netns_class_init(NMPNetnsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS(klass); + + object_class->set_property = set_property; + object_class->dispose = dispose; + + obj_properties[PROP_FD_NET] = + g_param_spec_int(NMP_NETNS_FD_NET, + "", + "", + 0, + G_MAXINT, + 0, + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + obj_properties[PROP_FD_MNT] = + g_param_spec_int(NMP_NETNS_FD_MNT, + "", + "", + 0, + G_MAXINT, + 0, + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); +} diff --git a/shared/nm-platform/nmp-netns.h b/shared/nm-platform/nmp-netns.h new file mode 100644 index 0000000..b18bd03 --- /dev/null +++ b/shared/nm-platform/nmp-netns.h @@ -0,0 +1,56 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2016 Red Hat, Inc. + */ + +#ifndef __NMP_NETNS_UTILS_H__ +#define __NMP_NETNS_UTILS_H__ + +#include "nmp-base.h" + +/*****************************************************************************/ + +#define NMP_TYPE_NETNS (nmp_netns_get_type()) +#define NMP_NETNS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NMP_TYPE_NETNS, NMPNetns)) +#define NMP_NETNS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), NMP_TYPE_NETNS, NMPNetnsClass)) +#define NMP_IS_NETNS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NMP_TYPE_NETNS)) +#define NMP_IS_NETNS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NMP_TYPE_NETNS)) +#define NMP_NETNS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), NMP_TYPE_NETNS, NMPNetnsClass)) + +#define NMP_NETNS_FD_NET "fd-net" +#define NMP_NETNS_FD_MNT "fd-mnt" + +typedef struct _NMPNetns NMPNetns; +typedef struct _NMPNetnsClass NMPNetnsClass; + +GType nmp_netns_get_type(void); + +NMPNetns *nmp_netns_new(void); + +gboolean nmp_netns_push(NMPNetns *self); +gboolean nmp_netns_push_type(NMPNetns *self, int ns_types); +gboolean nmp_netns_pop(NMPNetns *self); + +NMPNetns *nmp_netns_get_current(void); +NMPNetns *nmp_netns_get_initial(void); +gboolean nmp_netns_is_initial(void); + +int nmp_netns_get_fd_net(NMPNetns *self); +int nmp_netns_get_fd_mnt(NMPNetns *self); + +static inline void +_nm_auto_pop_netns(NMPNetns **p) +{ + if (*p) { + int errsv = errno; + + nmp_netns_pop(*p); + errno = errsv; + } +} +#define nm_auto_pop_netns nm_auto(_nm_auto_pop_netns) + +gboolean nmp_netns_bind_to_path(NMPNetns *self, const char *filename, int *out_fd); +gboolean nmp_netns_bind_to_path_destroy(NMPNetns *self, const char *filename); + +#endif /* __NMP_NETNS_UTILS_H__ */ diff --git a/shared/nm-platform/tests/meson.build b/shared/nm-platform/tests/meson.build new file mode 100644 index 0000000..8d2b9c0 --- /dev/null +++ b/shared/nm-platform/tests/meson.build @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +exe = executable( + 'test-nm-platform', + 'test-nm-platform.c', + c_args: [ + '-DNETWORKMANAGER_COMPILATION_TEST', + '-DNETWORKMANAGER_COMPILATION=(NM_NETWORKMANAGER_COMPILATION_GLIB|NM_NETWORKMANAGER_COMPILATION_WITH_GLIB_I18N_PROG)', + ], + dependencies: [ + libnm_log_core_dep, + libnm_platform_dep, + ], +) + +test( + 'shared/nm-glib-aux/test-nm-platform', + test_script, + args: test_args + [exe.full_path()], + timeout: default_test_timeout, +) diff --git a/shared/nm-platform/tests/test-nm-platform.c b/shared/nm-platform/tests/test-nm-platform.c new file mode 100644 index 0000000..0386a3a --- /dev/null +++ b/shared/nm-platform/tests/test-nm-platform.c @@ -0,0 +1,118 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#define NM_TEST_UTILS_NO_LIBNM 1 + +#include "nm-default.h" + +#include "nm-log-core/nm-logging.h" +#include "nm-platform/nm-netlink.h" +#include "nm-platform/nmp-netns.h" + +#include "nm-utils/nm-test-utils.h" + +/*****************************************************************************/ + +void +_nm_logging_clear_platform_logging_cache(void) +{ + /* this symbols is required by nm-log-core library. */ +} + +/*****************************************************************************/ + +static void +test_use_symbols(void) +{ + static void (*const SYMBOLS[])(void) = { + (void (*)(void)) nl_nlmsghdr_to_str, + (void (*)(void)) nlmsg_hdr, + (void (*)(void)) nlmsg_reserve, + (void (*)(void)) nla_reserve, + (void (*)(void)) nlmsg_alloc_size, + (void (*)(void)) nlmsg_alloc, + (void (*)(void)) nlmsg_alloc_convert, + (void (*)(void)) nlmsg_alloc_simple, + (void (*)(void)) nlmsg_free, + (void (*)(void)) nlmsg_append, + (void (*)(void)) nlmsg_parse, + (void (*)(void)) nlmsg_put, + (void (*)(void)) nla_strlcpy, + (void (*)(void)) nla_memcpy, + (void (*)(void)) nla_put, + (void (*)(void)) nla_find, + (void (*)(void)) nla_nest_cancel, + (void (*)(void)) nla_nest_start, + (void (*)(void)) nla_nest_end, + (void (*)(void)) nla_parse, + (void (*)(void)) nlmsg_get_proto, + (void (*)(void)) nlmsg_set_proto, + (void (*)(void)) nlmsg_set_src, + (void (*)(void)) nlmsg_get_creds, + (void (*)(void)) nlmsg_set_creds, + (void (*)(void)) genlmsg_put, + (void (*)(void)) genlmsg_data, + (void (*)(void)) genlmsg_user_hdr, + (void (*)(void)) genlmsg_hdr, + (void (*)(void)) genlmsg_user_data, + (void (*)(void)) genlmsg_attrdata, + (void (*)(void)) genlmsg_len, + (void (*)(void)) genlmsg_attrlen, + (void (*)(void)) genlmsg_valid_hdr, + (void (*)(void)) genlmsg_parse, + (void (*)(void)) genl_ctrl_resolve, + (void (*)(void)) nl_socket_alloc, + (void (*)(void)) nl_socket_free, + (void (*)(void)) nl_socket_get_fd, + (void (*)(void)) nl_socket_get_local_port, + (void (*)(void)) nl_socket_get_msg_buf_size, + (void (*)(void)) nl_socket_set_passcred, + (void (*)(void)) nl_socket_set_msg_buf_size, + (void (*)(void)) nlmsg_get_dst, + (void (*)(void)) nl_socket_set_nonblocking, + (void (*)(void)) nl_socket_set_buffer_size, + (void (*)(void)) nl_socket_add_memberships, + (void (*)(void)) nl_socket_set_ext_ack, + (void (*)(void)) nl_socket_disable_msg_peek, + (void (*)(void)) nl_connect, + (void (*)(void)) nl_wait_for_ack, + (void (*)(void)) nl_recvmsgs, + (void (*)(void)) nl_sendmsg, + (void (*)(void)) nl_send_iovec, + (void (*)(void)) nl_complete_msg, + (void (*)(void)) nl_send, + (void (*)(void)) nl_send_auto, + (void (*)(void)) nl_recv, + + (void (*)(void)) nmp_netns_bind_to_path, + (void (*)(void)) nmp_netns_bind_to_path_destroy, + (void (*)(void)) nmp_netns_get_current, + (void (*)(void)) nmp_netns_get_fd_mnt, + (void (*)(void)) nmp_netns_get_fd_net, + (void (*)(void)) nmp_netns_get_initial, + (void (*)(void)) nmp_netns_is_initial, + (void (*)(void)) nmp_netns_new, + (void (*)(void)) nmp_netns_pop, + (void (*)(void)) nmp_netns_push, + (void (*)(void)) nmp_netns_push_type, + + NULL, + }; + + /* The only (not very exciting) purpose of this test is to see that + * we can use various symbols and don't get a linker error. */ + assert(G_N_ELEMENTS(SYMBOLS) == NM_PTRARRAY_LEN(SYMBOLS) + 1); +} + +/*****************************************************************************/ + +NMTST_DEFINE(); + +int +main(int argc, char **argv) +{ + nmtst_init(&argc, &argv, TRUE); + + g_test_add_func("/nm-platform/test_use_symbols", test_use_symbols); + + return g_test_run(); +} diff --git a/shared/nm-version-macros.h b/shared/nm-version-macros.h index 9833dfa..7a6bef3 100644 --- a/shared/nm-version-macros.h +++ b/shared/nm-version-macros.h @@ -30,7 +30,7 @@ * Evaluates to the micro version number of NetworkManager which this source * compiled against. */ -#define NM_MICRO_VERSION (8) +#define NM_MICRO_VERSION (9) /** * NM_CHECK_VERSION: diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c index 37245b1..f67baea 100644 --- a/src/devices/nm-device-ethernet.c +++ b/src/devices/nm-device-ethernet.c @@ -25,7 +25,7 @@ #include "ppp/nm-ppp-manager-call.h" #include "ppp/nm-ppp-status.h" #include "platform/nm-platform.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "nm-dcb.h" #include "settings/nm-settings-connection.h" #include "nm-config.h" @@ -1392,7 +1392,7 @@ wake_on_lan_enable(NMDevice *device) found: return nm_platform_ethtool_set_wake_on_lan(nm_device_get_platform(device), nm_device_get_ifindex(device), - wol, + _NM_SETTING_WIRED_WAKE_ON_LAN_CAST(wol), password); } diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 355f104..59812ef 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -28,7 +28,7 @@ #include "nm-glib-aux/nm-random-utils.h" #include "systemd/nm-sd-utils-shared.h" -#include "nm-libnm-core-intern/nm-ethtool-utils.h" +#include "nm-base/nm-ethtool-base.h" #include "nm-libnm-core-intern/nm-common-macros.h" #include "nm-device-private.h" #include "nm-l3cfg.h" @@ -36,7 +36,7 @@ #include "NetworkManagerUtils.h" #include "nm-manager.h" #include "platform/nm-platform.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "platform/nmp-object.h" #include "platform/nmp-rules-manager.h" #include "ndisc/nm-ndisc.h" @@ -134,7 +134,7 @@ typedef struct { NMPlatformAsyncCallback callback; gpointer callback_data; guint num_vfs; - NMTernary autoprobe; + NMOptionBool autoprobe; } SriovOp; typedef void (*AcdCallback)(NMDevice *, NMIP4Config **, gboolean); @@ -205,7 +205,7 @@ struct _NMDeviceConnectivityHandle { typedef struct { int ifindex; NMEthtoolFeatureStates *features; - NMTernary requested[_NM_ETHTOOL_ID_FEATURE_NUM]; + NMOptionBool requested[_NM_ETHTOOL_ID_FEATURE_NUM]; NMEthtoolCoalesceState *coalesce; NMEthtoolRingState * ring; } EthtoolState; @@ -5829,7 +5829,7 @@ sriov_op_queue_op(NMDevice *self, SriovOp *op) static void sriov_op_queue(NMDevice * self, guint num_vfs, - NMTernary autoprobe, + NMOptionBool autoprobe, NMPlatformAsyncCallback callback, gpointer callback_data) { @@ -5878,7 +5878,7 @@ device_init_static_sriov_num_vfs(NMDevice *self) NULL); num_vfs = _nm_utils_ascii_str_to_int64(value, 10, 0, G_MAXINT32, -1); if (num_vfs >= 0) - sriov_op_queue(self, num_vfs, NM_TERNARY_DEFAULT, NULL, NULL); + sriov_op_queue(self, num_vfs, NM_OPTION_BOOL_DEFAULT, NULL, NULL); } } @@ -8055,7 +8055,8 @@ activate_stage1_device_prepare(NMDevice *self) gs_free_error GError *error = NULL; NMSriovVF * vf; NMTernary autoprobe; - guint i, num; + guint num; + guint i; autoprobe = nm_setting_sriov_get_autoprobe_drivers(s_sriov); if (autoprobe == NM_TERNARY_DEFAULT) { @@ -8063,9 +8064,9 @@ activate_stage1_device_prepare(NMDevice *self) NM_CONFIG_GET_DATA, NM_CON_DEFAULT("sriov.autoprobe-drivers"), self, - NM_TERNARY_FALSE, - NM_TERNARY_TRUE, - NM_TERNARY_TRUE); + NM_OPTION_BOOL_FALSE, + NM_OPTION_BOOL_TRUE, + NM_OPTION_BOOL_TRUE); } num = nm_setting_sriov_get_num_vfs(s_sriov); @@ -8092,7 +8093,7 @@ activate_stage1_device_prepare(NMDevice *self) */ sriov_op_queue(self, nm_setting_sriov_get_total_vfs(s_sriov), - autoprobe, + NM_TERNARY_TO_OPTION_BOOL(autoprobe), sriov_params_cb, nm_utils_user_data_pack(self, g_steal_pointer(&plat_vfs))); priv->stage1_sriov_state = NM_DEVICE_STAGE_STATE_PENDING; @@ -16521,7 +16522,7 @@ _set_state_full(NMDevice *self, NMDeviceState state, NMDeviceStateReason reason, priv->sriov_reset_pending++; sriov_op_queue(self, 0, - NM_TERNARY_TRUE, + NM_OPTION_BOOL_TRUE, sriov_reset_on_deactivate_cb, nm_utils_user_data_pack(self, GINT_TO_POINTER(reason))); } @@ -16573,7 +16574,7 @@ _set_state_full(NMDevice *self, NMDeviceState state, NMDeviceStateReason reason, if (priv->ifindex > 0 && (s_sriov = nm_device_get_applied_setting(self, NM_TYPE_SETTING_SRIOV))) { priv->sriov_reset_pending++; - sriov_op_queue(self, 0, NM_TERNARY_TRUE, sriov_reset_on_failure_cb, self); + sriov_op_queue(self, 0, NM_OPTION_BOOL_TRUE, sriov_reset_on_failure_cb, self); break; } /* Schedule the transition to DISCONNECTED. The device can't transition @@ -17713,7 +17714,7 @@ nm_device_get_hostname_from_dns_lookup(NMDevice *self, int addr_family, gboolean * the resolution with the new address */ if (address_changed) { nm_clear_g_cancellable(&resolver->cancellable); - nm_g_object_unref(resolver->address); + g_clear_object(&resolver->address); resolver->state = RESOLVER_WAIT_ADDRESS; } diff --git a/src/devices/wifi/nm-iwd-manager.c b/src/devices/wifi/nm-iwd-manager.c index 0725e5b..5ded8e1 100644 --- a/src/devices/wifi/nm-iwd-manager.c +++ b/src/devices/wifi/nm-iwd-manager.c @@ -9,7 +9,6 @@ #include -#include "nm-logging.h" #include "nm-core-internal.h" #include "nm-manager.h" #include "nm-device-iwd.h" diff --git a/src/devices/wifi/nm-wifi-ap.c b/src/devices/wifi/nm-wifi-ap.c index db81fc0..4df2f35 100644 --- a/src/devices/wifi/nm-wifi-ap.c +++ b/src/devices/wifi/nm-wifi-ap.c @@ -515,7 +515,7 @@ nm_wifi_ap_to_string(const NMWifiAP *self, char *str_buf, gulong buf_len, gint64 g_snprintf(str_buf, buf_len, - "%17s %-35s [ %c %3u %3u%% %c%c W:%04X R:%04X ] %s sup:%s [nm:%s]", + "%17s %-35s [ %c %3u %3u%% %c%c %c%c W:%04X R:%04X ] %s sup:%s [nm:%s]", priv->address ?: "(none)", (ssid_to_free = _nm_utils_ssid_to_string(priv->ssid)), (priv->mode == NM_802_11_MODE_ADHOC @@ -527,6 +527,10 @@ nm_wifi_ap_to_string(const NMWifiAP *self, char *str_buf, gulong buf_len, gint64 priv->strength, priv->flags & NM_802_11_AP_FLAGS_PRIVACY ? 'P' : '_', priv->metered ? 'M' : '_', + priv->flags & NM_802_11_AP_FLAGS_WPS ? 'W' : '_', + priv->flags & NM_802_11_AP_FLAGS_WPS_PIN + ? 'p' + : (priv->flags & NM_802_11_AP_FLAGS_WPS_PBC ? '#' : '_'), priv->wpa_flags & 0xFFFF, priv->rsn_flags & 0xFFFF, priv->last_seen_msec != G_MININT64 diff --git a/src/initrd/nmi-cmdline-reader.c b/src/initrd/nmi-cmdline-reader.c index 7c9982b..62891fa 100644 --- a/src/initrd/nmi-cmdline-reader.c +++ b/src/initrd/nmi-cmdline-reader.c @@ -1154,14 +1154,21 @@ nmi_cmdline_reader_parse(const char *sysfs_dir, const char *const *argv, char ** NMConnection * connection; NMSettingWired *s_wired; const char * bootif = bootif_val; - - if (!nm_utils_hwaddr_valid(bootif, ETH_ALEN) && g_str_has_prefix(bootif, "01-") - && nm_utils_hwaddr_valid(&bootif[3], ETH_ALEN)) { - /* - * BOOTIF MAC address can be prefixed with a hardware type identifier. - * "01" stays for "wired", no other are known. - */ - bootif += 3; + char prefix[4]; + + if (!nm_utils_hwaddr_valid(bootif, ETH_ALEN)) { + strncpy(prefix, bootif, 3); + prefix[3] = '\0'; + + if (NM_IN_STRSET(prefix, "01-", "01:", "00-", "00:") + && nm_utils_hwaddr_valid(&bootif[3], ETH_ALEN)) { + /* + * BOOTIF MAC address can be prefixed with a hardware type identifier. + * "01" stays for "wired", "00" is also accepted as it means "undefined". + * No others are known. + */ + bootif += 3; + } } connection = reader_get_connection(reader, NULL, NM_SETTING_WIRED_SETTING_NAME, FALSE); diff --git a/src/initrd/tests/test-cmdline-reader.c b/src/initrd/tests/test-cmdline-reader.c index 07faf96..0c30146 100644 --- a/src/initrd/tests/test-cmdline-reader.c +++ b/src/initrd/tests/test-cmdline-reader.c @@ -1951,59 +1951,73 @@ test_bootif_no_ip(void) static void test_bootif_hwtype(void) { - gs_unref_hashtable GHashTable *connections = NULL; - const char *const *ARGV = NM_MAKE_STRV("ip=eth0:dhcp", "BOOTIF=01-00-53-AB-cd-02-03"); - NMConnection * connection; - NMSettingWired * s_wired; - NMSettingIPConfig *s_ip4; - NMSettingIPConfig *s_ip6; - gs_free char * hostname = NULL; + const char *const *ARGV0 = NM_MAKE_STRV("ip=eth0:dhcp", "BOOTIF=01-00-53-AB-cd-02-03"); + const char *const *ARGV1 = NM_MAKE_STRV("ip=eth0:dhcp", "BOOTIF=00-00-53-Ab-cD-02-03"); + const char *const *ARGV[] = {ARGV0, ARGV1}; + guint i; - connections = nmi_cmdline_reader_parse(TEST_INITRD_DIR "/sysfs", ARGV, &hostname); - g_assert(connections); - g_assert_cmpint(g_hash_table_size(connections), ==, 2); - g_assert_cmpstr(hostname, ==, NULL); + for (i = 0; i < G_N_ELEMENTS(ARGV); i++) { + gs_unref_hashtable GHashTable *connections = NULL; + NMConnection * connection; + NMSettingWired * s_wired; + NMSettingIPConfig * s_ip4; + NMSettingIPConfig * s_ip6; + gs_free char * hostname = NULL; - connection = g_hash_table_lookup(connections, "eth0"); - g_assert(connection); - nmtst_assert_connection_verifies_without_normalization(connection); - g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0"); + connections = nmi_cmdline_reader_parse(TEST_INITRD_DIR "/sysfs", ARGV[i], &hostname); + g_assert(connections); + g_assert_cmpint(g_hash_table_size(connections), ==, 2); + g_assert_cmpstr(hostname, ==, NULL); - s_wired = nm_connection_get_setting_wired(connection); - g_assert(!nm_setting_wired_get_mac_address(s_wired)); - g_assert(s_wired); + connection = g_hash_table_lookup(connections, "eth0"); + g_assert(connection); + nmtst_assert_connection_verifies_without_normalization(connection); + g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0"); - s_ip4 = nm_connection_get_setting_ip4_config(connection); - g_assert(s_ip4); - g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO); - g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4)); - g_assert(!nm_setting_ip_config_get_may_fail(s_ip4)); + s_wired = nm_connection_get_setting_wired(connection); + g_assert(!nm_setting_wired_get_mac_address(s_wired)); + g_assert(s_wired); - s_ip6 = nm_connection_get_setting_ip6_config(connection); - g_assert(s_ip6); - g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO); - g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6)); + s_ip4 = nm_connection_get_setting_ip4_config(connection); + g_assert(s_ip4); + g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), + ==, + NM_SETTING_IP4_CONFIG_METHOD_AUTO); + g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4)); + g_assert(!nm_setting_ip_config_get_may_fail(s_ip4)); - connection = g_hash_table_lookup(connections, "bootif_connection"); - g_assert(connection); - nmtst_assert_connection_verifies_without_normalization(connection); - g_assert_cmpstr(nm_connection_get_id(connection), ==, "BOOTIF Connection"); + s_ip6 = nm_connection_get_setting_ip6_config(connection); + g_assert(s_ip6); + g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), + ==, + NM_SETTING_IP6_CONFIG_METHOD_AUTO); + g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6)); - s_wired = nm_connection_get_setting_wired(connection); - g_assert_cmpstr(nm_setting_wired_get_mac_address(s_wired), ==, "00:53:AB:CD:02:03"); - g_assert(s_wired); + connection = g_hash_table_lookup(connections, "bootif_connection"); + g_assert(connection); + nmtst_assert_connection_verifies_without_normalization(connection); + g_assert_cmpstr(nm_connection_get_id(connection), ==, "BOOTIF Connection"); - s_ip4 = nm_connection_get_setting_ip4_config(connection); - g_assert(s_ip4); - g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO); - g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4)); - g_assert(nm_setting_ip_config_get_may_fail(s_ip4)); + s_wired = nm_connection_get_setting_wired(connection); + g_assert_cmpstr(nm_setting_wired_get_mac_address(s_wired), ==, "00:53:AB:CD:02:03"); + g_assert(s_wired); - s_ip6 = nm_connection_get_setting_ip6_config(connection); - g_assert(s_ip6); - g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO); - g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6)); - g_assert(nm_setting_ip_config_get_may_fail(s_ip6)); + s_ip4 = nm_connection_get_setting_ip4_config(connection); + g_assert(s_ip4); + g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), + ==, + NM_SETTING_IP4_CONFIG_METHOD_AUTO); + g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4)); + g_assert(nm_setting_ip_config_get_may_fail(s_ip4)); + + s_ip6 = nm_connection_get_setting_ip6_config(connection); + g_assert(s_ip6); + g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), + ==, + NM_SETTING_IP6_CONFIG_METHOD_AUTO); + g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6)); + g_assert(nm_setting_ip_config_get_may_fail(s_ip6)); + } } /* Check that nameservers are assigned to all existing diff --git a/src/meson.build b/src/meson.build index 1d5f7b4..8c0c141 100644 --- a/src/meson.build +++ b/src/meson.build @@ -5,7 +5,11 @@ src_inc = include_directories('.') daemon_nm_default_dep = declare_dependency( sources: libnm_core_enum_sources[1], include_directories: src_inc, - dependencies: libnm_core_nm_default_dep, + dependencies: [ + libnm_core_nm_default_dep, + libnm_log_core_dep, + libnm_platform_dep, + ], ) install_data( @@ -28,14 +32,11 @@ sources = files( 'dhcp/nm-dhcp-options.c', 'ndisc/nm-lndp-ndisc.c', 'ndisc/nm-ndisc.c', - 'platform/nm-netlink.c', 'platform/wifi/nm-wifi-utils-nl80211.c', 'platform/wifi/nm-wifi-utils.c', 'platform/wpan/nm-wpan-utils.c', 'platform/nm-linux-platform.c', 'platform/nm-platform.c', - 'platform/nm-platform-utils.c', - 'platform/nmp-netns.c', 'platform/nmp-object.c', 'platform/nmp-rules-manager.c', 'main-utils.c', @@ -50,7 +51,6 @@ sources = files( 'nm-ip-config.c', 'nm-ip4-config.c', 'nm-ip6-config.c', - 'nm-logging.c', ) deps = [ diff --git a/src/ndisc/nm-lndp-ndisc.c b/src/ndisc/nm-lndp-ndisc.c index 2117190..1d8becb 100644 --- a/src/ndisc/nm-lndp-ndisc.c +++ b/src/ndisc/nm-lndp-ndisc.c @@ -18,7 +18,7 @@ #include "nm-ndisc-private.h" #include "NetworkManagerUtils.h" #include "platform/nm-platform.h" -#include "platform/nmp-netns.h" +#include "nm-platform/nmp-netns.h" #define _NMLOG_PREFIX_NAME "ndisc-lndp" diff --git a/src/ndisc/nm-ndisc.c b/src/ndisc/nm-ndisc.c index c9e2211..44035ff 100644 --- a/src/ndisc/nm-ndisc.c +++ b/src/ndisc/nm-ndisc.c @@ -15,7 +15,7 @@ #include "nm-ndisc-private.h" #include "nm-utils.h" #include "platform/nm-platform.h" -#include "platform/nmp-netns.h" +#include "nm-platform/nmp-netns.h" #include "nm-l3-config-data.h" #define _NMLOG_PREFIX_NAME "ndisc" diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index 7b62968..660f6f4 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -4269,29 +4269,6 @@ nm_utils_g_value_set_strv(GValue *value, GPtrArray *strings) /*****************************************************************************/ -void -nm_utils_ifname_cpy(char *dst, const char *name) -{ - int i; - - g_return_if_fail(dst); - g_return_if_fail(name && name[0]); - - nm_assert(nm_utils_ifname_valid_kernel(name, NULL)); - - /* ensures NUL padding of the entire IFNAMSIZ buffer. */ - - for (i = 0; i < (int) IFNAMSIZ && name[i] != '\0'; i++) - dst[i] = name[i]; - - nm_assert(name[i] == '\0'); - - for (; i < (int) IFNAMSIZ; i++) - dst[i] = '\0'; -} - -/*****************************************************************************/ - /** * Takes a pair @timestamp and @duration, and returns the remaining duration based * on the new timestamp @now. diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h index c90daaa..f4fe5f6 100644 --- a/src/nm-core-utils.h +++ b/src/nm-core-utils.h @@ -501,8 +501,6 @@ void _nm_utils_set_testing(NMUtilsTestFlags flags); void nm_utils_g_value_set_strv(GValue *value, GPtrArray *strings); -void nm_utils_ifname_cpy(char *dst, const char *name); - guint32 nm_utils_lifetime_rebase_relative_time_on_now(guint32 timestamp, guint32 duration, gint32 now); diff --git a/src/nm-iface-helper.c b/src/nm-iface-helper.c index 8fc30ad..42483cf 100644 --- a/src/nm-iface-helper.c +++ b/src/nm-iface-helper.c @@ -21,7 +21,7 @@ #include "main-utils.h" #include "NetworkManagerUtils.h" #include "platform/nm-linux-platform.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "dhcp/nm-dhcp-manager.h" #include "ndisc/nm-ndisc.h" #include "ndisc/nm-lndp-ndisc.h" diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index b881871..8014549 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -17,7 +17,7 @@ #include "nm-utils.h" #include "platform/nmp-object.h" #include "platform/nm-platform.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "NetworkManagerUtils.h" #include "nm-core-internal.h" #include "nm-dbus-object.h" diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 0be98e5..eeb6994 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -18,7 +18,7 @@ #include "nm-utils.h" #include "platform/nmp-object.h" #include "platform/nm-platform.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "nm-core-internal.h" #include "NetworkManagerUtils.h" #include "nm-ip4-config.h" diff --git a/src/nm-l3-config-data.c b/src/nm-l3-config-data.c index daff731..0f689d4 100644 --- a/src/nm-l3-config-data.c +++ b/src/nm-l3-config-data.c @@ -11,7 +11,7 @@ #include "nm-glib-aux/nm-enum-utils.h" #include "nm-core-internal.h" #include "platform/nm-platform.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "platform/nmp-object.h" #include "NetworkManagerUtils.h" diff --git a/src/nm-netns.c b/src/nm-netns.c index bc4e9f6..9f62643 100644 --- a/src/nm-netns.c +++ b/src/nm-netns.c @@ -14,7 +14,7 @@ #include "nm-core-internal.h" #include "nm-l3cfg.h" #include "platform/nm-platform.h" -#include "platform/nmp-netns.h" +#include "nm-platform/nmp-netns.h" #include "platform/nmp-rules-manager.h" /*****************************************************************************/ diff --git a/src/nm-netns.h b/src/nm-netns.h index 36a34e2..aab3b52 100644 --- a/src/nm-netns.h +++ b/src/nm-netns.h @@ -6,6 +6,8 @@ #ifndef __NM_NETNS_H__ #define __NM_NETNS_H__ +#include "nm-platform/nmp-base.h" + #define NM_TYPE_NETNS (nm_netns_get_type()) #define NM_NETNS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_NETNS, NMNetns)) #define NM_NETNS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_NETNS, NMNetnsClass)) diff --git a/src/nm-policy.c b/src/nm-policy.c index cda22b1..e74531e 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -640,14 +640,8 @@ typedef struct { int priority; bool from_dhcp : 1; bool from_dns : 1; - - union { - struct { - bool ip_6; - bool ip_4; - }; - bool ip_x[2]; - }; + bool IS_IPv4 : 1; + bool is_default : 1; } DeviceHostnameInfo; static int @@ -657,6 +651,7 @@ device_hostname_info_compare(gconstpointer a, gconstpointer b) const DeviceHostnameInfo *info2 = b; NM_CMP_FIELD(info1, info2, priority); + NM_CMP_FIELD_UNSAFE(info2, info1, is_default); return 0; } @@ -671,6 +666,7 @@ device_get_hostname_property_boolean(NMDevice *device, const char *name) NMSettingHostname *s_hostname; char buf[128]; int value; + NMTernary default_value; nm_assert(NM_IN_STRSET(name, NM_SETTING_HOSTNAME_FROM_DHCP, @@ -685,12 +681,17 @@ device_get_hostname_property_boolean(NMDevice *device, const char *name) return value; } + if (nm_streq(name, NM_SETTING_HOSTNAME_ONLY_FROM_DEFAULT)) + default_value = NM_TERNARY_FALSE; + else + default_value = NM_TERNARY_TRUE; + return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA, nm_sprintf_buf(buf, "hostname.%s", name), device, NM_TERNARY_FALSE, NM_TERNARY_TRUE, - NM_TERNARY_TRUE); + default_value); } static int @@ -726,6 +727,8 @@ build_device_hostname_infos(NMPolicy *self) DeviceHostnameInfo *info; NMDevice * device; gboolean only_from_default; + gboolean is_default; + int IS_IPv4; device = nm_active_connection_get_device(ac); if (!device) @@ -733,23 +736,28 @@ build_device_hostname_infos(NMPolicy *self) only_from_default = device_get_hostname_property_boolean(device, NM_SETTING_HOSTNAME_ONLY_FROM_DEFAULT); - if (only_from_default && ac != priv->default_ac4 && ac != priv->default_ac6) - continue; - if (!array) - array = g_array_sized_new(FALSE, FALSE, sizeof(DeviceHostnameInfo), 4); + for (IS_IPv4 = 1; IS_IPv4 >= 0; IS_IPv4--) { + is_default = (ac == (IS_IPv4 ? priv->default_ac4 : priv->default_ac6)); + if (only_from_default && !is_default) + continue; - info = nm_g_array_append_new(array, DeviceHostnameInfo); - *info = (DeviceHostnameInfo){ - .device = device, - .priority = device_get_hostname_priority(device), - .from_dhcp = - device_get_hostname_property_boolean(device, NM_SETTING_HOSTNAME_FROM_DHCP), - .from_dns = - device_get_hostname_property_boolean(device, NM_SETTING_HOSTNAME_FROM_DNS_LOOKUP), - .ip_4 = priv->default_ac4 || !only_from_default, - .ip_6 = priv->default_ac6 || !only_from_default, - }; + if (!array) + array = g_array_sized_new(FALSE, FALSE, sizeof(DeviceHostnameInfo), 4); + + info = nm_g_array_append_new(array, DeviceHostnameInfo); + *info = (DeviceHostnameInfo){ + .device = device, + .priority = device_get_hostname_priority(device), + .from_dhcp = + device_get_hostname_property_boolean(device, NM_SETTING_HOSTNAME_FROM_DHCP), + .from_dns = + device_get_hostname_property_boolean(device, + NM_SETTING_HOSTNAME_FROM_DNS_LOOKUP), + .IS_IPv4 = IS_IPv4, + .is_default = is_default, + }; + } } if (array && array->len > 1) { @@ -796,7 +804,7 @@ update_system_hostname(NMPolicy *self, const char *msg) gs_unref_array GArray *infos = NULL; DeviceHostnameInfo * info; guint i; - int IS_IPv4; + int addr_family; g_return_if_fail(self != NULL); @@ -854,65 +862,59 @@ update_system_hostname(NMPolicy *self, const char *msg) for (i = 0; i < infos->len; i++) { info = &g_array_index(infos, DeviceHostnameInfo, i); _LOGT(LOGD_DNS, - " - prio:%4d ipv:%c%c dhcp:%d dns:%d dev:%s", + " - prio:%5d ipv%c%s %s %s dev:%s", info->priority, - info->ip_4 ? '4' : '-', - info->ip_6 ? '6' : '-', - info->from_dhcp, - info->from_dns, + info->IS_IPv4 ? '4' : '6', + info->is_default ? " (def)" : " ", + info->from_dhcp ? "dhcp " : " ", + info->from_dns ? "dns " : " ", nm_device_get_iface(info->device)); } } for (i = 0; infos && i < infos->len; i++) { - info = &g_array_index(infos, DeviceHostnameInfo, i); + info = &g_array_index(infos, DeviceHostnameInfo, i); + addr_family = info->IS_IPv4 ? AF_INET : AF_INET6; g_signal_handlers_disconnect_by_func(info->device, device_dns_lookup_done, self); - for (IS_IPv4 = 1; IS_IPv4 >= 0; IS_IPv4--) { - const int addr_family = IS_IPv4 ? AF_INET : AF_INET6; - - if (info->from_dhcp && info->ip_x[IS_IPv4]) { - dhcp_config = nm_device_get_dhcp_config(info->device, addr_family); - if (dhcp_config) { - dhcp_hostname = - nm_dhcp_config_get_option(dhcp_config, IS_IPv4 ? "host_name" : "fqdn_fqdn"); - if (dhcp_hostname && dhcp_hostname[0]) { - p = nm_str_skip_leading_spaces(dhcp_hostname); - if (p[0]) { - _set_hostname(self, p, IS_IPv4 ? "from DHCPv4" : "from DHCPv6"); - priv->dhcp_hostname = TRUE; - return; - } - _LOGW(LOGD_DNS, - "set-hostname: DHCPv%c-provided hostname '%s' looks invalid; " - "ignoring it", - nm_utils_addr_family_to_char(addr_family), - dhcp_hostname); + + if (info->from_dhcp) { + dhcp_config = nm_device_get_dhcp_config(info->device, addr_family); + if (dhcp_config) { + dhcp_hostname = + nm_dhcp_config_get_option(dhcp_config, + info->IS_IPv4 ? "host_name" : "fqdn_fqdn"); + if (dhcp_hostname && dhcp_hostname[0]) { + p = nm_str_skip_leading_spaces(dhcp_hostname); + if (p[0]) { + _set_hostname(self, p, info->IS_IPv4 ? "from DHCPv4" : "from DHCPv6"); + priv->dhcp_hostname = TRUE; + return; } + _LOGW(LOGD_DNS, + "set-hostname: DHCPv%c-provided hostname '%s' looks invalid; " + "ignoring it", + nm_utils_addr_family_to_char(addr_family), + dhcp_hostname); } } } if (priv->hostname_mode != NM_POLICY_HOSTNAME_MODE_DHCP) { - for (IS_IPv4 = 1; IS_IPv4 >= 0; IS_IPv4--) { - const int addr_family = IS_IPv4 ? AF_INET : AF_INET6; - - if (info->from_dns && info->ip_x[IS_IPv4]) { - const char *result; - gboolean wait = FALSE; - - result = - nm_device_get_hostname_from_dns_lookup(info->device, addr_family, &wait); - if (result) { - _set_hostname(self, result, "from address lookup"); - return; - } - if (wait) { - g_signal_connect(info->device, - NM_DEVICE_DNS_LOOKUP_DONE, - (GCallback) device_dns_lookup_done, - self); - return; - } + if (info->from_dns) { + const char *result; + gboolean wait = FALSE; + + result = nm_device_get_hostname_from_dns_lookup(info->device, addr_family, &wait); + if (result) { + _set_hostname(self, result, "from address lookup"); + return; + } + if (wait) { + g_signal_connect(info->device, + NM_DEVICE_DNS_LOOKUP_DONE, + (GCallback) device_dns_lookup_done, + self); + return; } } } diff --git a/src/nm-types.h b/src/nm-types.h index 533099b..ab23145 100644 --- a/src/nm-types.h +++ b/src/nm-types.h @@ -77,41 +77,6 @@ typedef enum { NM_ACTIVATION_REASON_USER_REQUEST, } NMActivationReason; -typedef enum { - /* In priority order; higher number == higher priority */ - - NM_IP_CONFIG_SOURCE_UNKNOWN = 0, - - /* for routes, the source is mapped to the uint8 field rtm_protocol. - * Reserve the range [1,0x100] for native RTPROT values. */ - - NM_IP_CONFIG_SOURCE_RTPROT_UNSPEC = 1 + 0, - NM_IP_CONFIG_SOURCE_RTPROT_REDIRECT = 1 + 1, - NM_IP_CONFIG_SOURCE_RTPROT_KERNEL = 1 + 2, - NM_IP_CONFIG_SOURCE_RTPROT_BOOT = 1 + 3, - NM_IP_CONFIG_SOURCE_RTPROT_STATIC = 1 + 4, - NM_IP_CONFIG_SOURCE_RTPROT_RA = 1 + 9, - NM_IP_CONFIG_SOURCE_RTPROT_DHCP = 1 + 16, - _NM_IP_CONFIG_SOURCE_RTPROT_LAST = 1 + 0xFF, - - NM_IP_CONFIG_SOURCE_KERNEL, - NM_IP_CONFIG_SOURCE_SHARED, - NM_IP_CONFIG_SOURCE_IP4LL, - NM_IP_CONFIG_SOURCE_IP6LL, - NM_IP_CONFIG_SOURCE_PPP, - NM_IP_CONFIG_SOURCE_WWAN, - NM_IP_CONFIG_SOURCE_VPN, - NM_IP_CONFIG_SOURCE_DHCP, - NM_IP_CONFIG_SOURCE_NDISC, - NM_IP_CONFIG_SOURCE_USER, -} NMIPConfigSource; - -static inline gboolean -NM_IS_IP_CONFIG_SOURCE_RTPROT(NMIPConfigSource source) -{ - return source > NM_IP_CONFIG_SOURCE_UNKNOWN && source <= _NM_IP_CONFIG_SOURCE_RTPROT_LAST; -} - /* platform */ typedef struct _NMPlatform NMPlatform; typedef struct _NMPlatformObject NMPlatformObject; @@ -121,7 +86,6 @@ typedef struct _NMPlatformIP4Route NMPlatformIP4Route; typedef struct _NMPlatformIP6Address NMPlatformIP6Address; typedef struct _NMPlatformIP6Route NMPlatformIP6Route; typedef struct _NMPlatformLink NMPlatformLink; -typedef struct _NMPNetns NMPNetns; typedef struct _NMPObject NMPObject; typedef enum { diff --git a/src/platform/nm-fake-platform.c b/src/platform/nm-fake-platform.c index 21f1e92..fbd3e3f 100644 --- a/src/platform/nm-fake-platform.c +++ b/src/platform/nm-fake-platform.c @@ -16,7 +16,7 @@ #include "nm-utils.h" #include "nm-core-utils.h" -#include "nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "nm-platform-private.h" #include "nmp-object.h" diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 74b2d5a..3d99270 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -40,11 +40,11 @@ #include "nm-glib-aux/nm-secret-utils.h" #include "nm-glib-aux/nm-c-list.h" -#include "nm-netlink.h" +#include "nm-platform/nm-netlink.h" #include "nm-core-utils.h" #include "nmp-object.h" -#include "nmp-netns.h" -#include "nm-platform-utils.h" +#include "nm-platform/nmp-netns.h" +#include "nm-platform/nm-platform-utils.h" #include "nm-platform-private.h" #include "wifi/nm-wifi-utils.h" #include "wifi/nm-wifi-utils-wext.h" @@ -7653,7 +7653,7 @@ static void link_set_sriov_params_async(NMPlatform * platform, int ifindex, guint num_vfs, - NMTernary autoprobe, + NMOptionBool autoprobe, NMPlatformAsyncCallback callback, gpointer data, GCancellable * cancellable) @@ -7726,10 +7726,11 @@ link_set_sriov_params_async(NMPlatform * platform, } if (current_num == num_vfs - && (autoprobe == NM_TERNARY_DEFAULT || current_autoprobe == autoprobe)) + && (autoprobe == NM_OPTION_BOOL_DEFAULT || current_autoprobe == autoprobe)) goto out_idle; - if (NM_IN_SET(autoprobe, NM_TERNARY_TRUE, NM_TERNARY_FALSE) && current_autoprobe != autoprobe + if (NM_IN_SET(autoprobe, NM_OPTION_BOOL_TRUE, NM_OPTION_BOOL_FALSE) + && current_autoprobe != autoprobe && !nm_platform_sysctl_set( NM_PLATFORM_GET, NMP_SYSCTL_PATHID_NETDIR(dirfd, ifname, "device/sriov_drivers_autoprobe"), diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index 1feb1cd..6411abb 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -29,10 +29,10 @@ #include "nm-glib-aux/nm-secret-utils.h" #include "nm-core-utils.h" -#include "nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "nm-platform-private.h" #include "nmp-object.h" -#include "nmp-netns.h" +#include "nm-platform/nmp-netns.h" /*****************************************************************************/ @@ -1842,7 +1842,7 @@ nm_platform_link_supports_sriov(NMPlatform *self, int ifindex) * @ifindex: the index of the interface to change * @num_vfs: the number of VFs to create * @autoprobe: the new autoprobe-drivers value (pass - * %NM_TERNARY_DEFAULT to keep current value) + * %NM_OPTION_BOOL_DEFAULT to keep current value) * @callback: called when the operation finishes * @callback_data: data passed to @callback * @cancellable: cancellable to abort the operation @@ -1855,7 +1855,7 @@ void nm_platform_link_set_sriov_params_async(NMPlatform * self, int ifindex, guint num_vfs, - NMTernary autoprobe, + NMOptionBool autoprobe, NMPlatformAsyncCallback callback, gpointer callback_data, GCancellable * cancellable) @@ -3282,10 +3282,10 @@ _to_string_ifa_flags(guint32 ifa_flags, char *buf, gsize size) /*****************************************************************************/ gboolean -nm_platform_ethtool_set_wake_on_lan(NMPlatform * self, - int ifindex, - NMSettingWiredWakeOnLan wol, - const char * wol_password) +nm_platform_ethtool_set_wake_on_lan(NMPlatform * self, + int ifindex, + _NMSettingWiredWakeOnLan wol, + const char * wol_password) { _CHECK_SELF_NETNS(self, klass, netns, FALSE); @@ -3322,13 +3322,6 @@ nm_platform_ethtool_get_link_settings(NMPlatform * self, return nmp_utils_ethtool_get_link_settings(ifindex, out_autoneg, out_speed, out_duplex); } -NM_UTILS_LOOKUP_STR_DEFINE(nm_platform_link_duplex_type_to_string, - NMPlatformLinkDuplexType, - NM_UTILS_LOOKUP_DEFAULT_WARN(NULL), - NM_UTILS_LOOKUP_STR_ITEM(NM_PLATFORM_LINK_DUPLEX_UNKNOWN, "unknown"), - NM_UTILS_LOOKUP_STR_ITEM(NM_PLATFORM_LINK_DUPLEX_FULL, "full"), - NM_UTILS_LOOKUP_STR_ITEM(NM_PLATFORM_LINK_DUPLEX_HALF, "half"), ); - /*****************************************************************************/ NMEthtoolFeatureStates * @@ -3346,8 +3339,8 @@ nm_platform_ethtool_set_features( NMPlatform * self, int ifindex, const NMEthtoolFeatureStates *features, - const NMTernary *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */, - gboolean do_set /* or reset */) + const NMOptionBool *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */, + gboolean do_set /* or reset */) { _CHECK_SELF_NETNS(self, klass, netns, FALSE); diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h index c61ee16..d400c56 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -9,6 +9,9 @@ #include "nm-dbus-interface.h" #include "nm-core-types-internal.h" +#include "nm-platform/nmp-base.h" +#include "nm-base/nm-base.h" + #include "nm-core-utils.h" #include "nm-setting-vlan.h" #include "nm-setting-wired.h" @@ -976,12 +979,6 @@ typedef struct { } NMPlatformLnkWireGuard; typedef enum { - NM_PLATFORM_LINK_DUPLEX_UNKNOWN, - NM_PLATFORM_LINK_DUPLEX_HALF, - NM_PLATFORM_LINK_DUPLEX_FULL, -} NMPlatformLinkDuplexType; - -typedef enum { NM_PLATFORM_WIREGUARD_CHANGE_FLAG_NONE = 0, NM_PLATFORM_WIREGUARD_CHANGE_FLAG_REPLACE_PEERS = (1LL << 0), NM_PLATFORM_WIREGUARD_CHANGE_FLAG_HAS_PRIVATE_KEY = (1LL << 1), @@ -1038,7 +1035,7 @@ _nm_platform_kernel_support_detected(NMPlatformKernelSupportType type) return G_LIKELY(g_atomic_int_get(&_nm_platform_kernel_support_state[type]) != 0); } -static inline NMTernary +static inline NMOptionBool nm_platform_kernel_support_get_full(NMPlatformKernelSupportType type, gboolean init_if_not_set) { int v; @@ -1048,7 +1045,7 @@ nm_platform_kernel_support_get_full(NMPlatformKernelSupportType type, gboolean i v = g_atomic_int_get(&_nm_platform_kernel_support_state[type]); if (G_UNLIKELY(v == 0)) { if (!init_if_not_set) - return NM_TERNARY_DEFAULT; + return NM_OPTION_BOOL_DEFAULT; v = _nm_platform_kernel_support_init(type, 0); } return (v >= 0); @@ -1057,7 +1054,7 @@ nm_platform_kernel_support_get_full(NMPlatformKernelSupportType type, gboolean i static inline gboolean nm_platform_kernel_support_get(NMPlatformKernelSupportType type) { - return nm_platform_kernel_support_get_full(type, TRUE) != NM_TERNARY_FALSE; + return nm_platform_kernel_support_get_full(type, TRUE) != NM_OPTION_BOOL_FALSE; } /*****************************************************************************/ @@ -1121,7 +1118,7 @@ typedef struct { void (*link_set_sriov_params_async)(NMPlatform * self, int ifindex, guint num_vfs, - int autoprobe, + NMOptionBool autoprobe, NMPlatformAsyncCallback callback, gpointer callback_data, GCancellable * cancellable); @@ -1856,7 +1853,7 @@ gboolean nm_platform_link_set_name(NMPlatform *self, int ifindex, const char *na void nm_platform_link_set_sriov_params_async(NMPlatform * self, int ifindex, guint num_vfs, - int autoprobe, + NMOptionBool autoprobe, NMPlatformAsyncCallback callback, gpointer callback_data, GCancellable * cancellable); @@ -2325,10 +2322,10 @@ const char *nm_platform_route_scope2str(int scope, char *buf, gsize len); int nm_platform_ip_address_cmp_expiry(const NMPlatformIPAddress *a, const NMPlatformIPAddress *b); -gboolean nm_platform_ethtool_set_wake_on_lan(NMPlatform * self, - int ifindex, - NMSettingWiredWakeOnLan wol, - const char * wol_password); +gboolean nm_platform_ethtool_set_wake_on_lan(NMPlatform * self, + int ifindex, + _NMSettingWiredWakeOnLan wol, + const char * wol_password); gboolean nm_platform_ethtool_set_link_settings(NMPlatform * self, int ifindex, gboolean autoneg, @@ -2340,17 +2337,13 @@ gboolean nm_platform_ethtool_get_link_settings(NMPlatform * self, guint32 * out_speed, NMPlatformLinkDuplexType *out_duplex); -typedef struct _NMEthtoolFeatureStates NMEthtoolFeatureStates; - NMEthtoolFeatureStates *nm_platform_ethtool_get_link_features(NMPlatform *self, int ifindex); gboolean nm_platform_ethtool_set_features( NMPlatform * self, int ifindex, const NMEthtoolFeatureStates *features, - const NMTernary *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */, - gboolean do_set /* or reset */); - -typedef struct _NMEthtoolCoalesceState NMEthtoolCoalesceState; + const NMOptionBool *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */, + gboolean do_set /* or reset */); gboolean nm_platform_ethtool_get_link_coalesce(NMPlatform * self, int ifindex, @@ -2360,15 +2353,11 @@ gboolean nm_platform_ethtool_set_coalesce(NMPlatform * self, int ifindex, const NMEthtoolCoalesceState *coalesce); -typedef struct _NMEthtoolRingState NMEthtoolRingState; - gboolean nm_platform_ethtool_get_link_ring(NMPlatform *self, int ifindex, NMEthtoolRingState *ring); gboolean nm_platform_ethtool_set_ring(NMPlatform *self, int ifindex, const NMEthtoolRingState *ring); -const char *nm_platform_link_duplex_type_to_string(NMPlatformLinkDuplexType duplex); - void nm_platform_ip4_dev_route_blacklist_set(NMPlatform *self, int ifindex, GPtrArray * ip4_dev_route_blacklist); diff --git a/src/platform/nmp-object.c b/src/platform/nmp-object.c index 16edbd1..9520013 100644 --- a/src/platform/nmp-object.c +++ b/src/platform/nmp-object.c @@ -16,7 +16,7 @@ #include "nm-glib-aux/nm-secret-utils.h" #include "nm-core-utils.h" -#include "nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "wifi/nm-wifi-utils.h" #include "wpan/nm-wpan-utils.h" diff --git a/src/platform/tests/test-common.c b/src/platform/tests/test-common.c index 4e08b28..529100b 100644 --- a/src/platform/tests/test-common.c +++ b/src/platform/tests/test-common.c @@ -2274,18 +2274,18 @@ gboolean nmtstp_kernel_support_get(NMPlatformKernelSupportType type) { const NMPlatformLink *pllink; - NMTernary v; + NMOptionBool v; v = nm_platform_kernel_support_get_full(type, FALSE); - if (v != NM_TERNARY_DEFAULT) - return v != NM_TERNARY_FALSE; + if (v != NM_OPTION_BOOL_DEFAULT) + return v != NM_OPTION_BOOL_FALSE; switch (type) { case NM_PLATFORM_KERNEL_SUPPORT_TYPE_IFLA_BR_VLAN_STATS_ENABLED: pllink = nmtstp_link_bridge_add(NULL, -1, "br-test-11", &nm_platform_lnk_bridge_default); nmtstp_link_delete(NULL, -1, pllink->ifindex, NULL, TRUE); v = nm_platform_kernel_support_get_full(type, FALSE); - g_assert(v != NM_TERNARY_DEFAULT); + g_assert(v != NM_OPTION_BOOL_DEFAULT); return v; default: g_assert_not_reached(); diff --git a/src/platform/tests/test-link.c b/src/platform/tests/test-link.c index 66cb20e..895b89a 100644 --- a/src/platform/tests/test-link.c +++ b/src/platform/tests/test-link.c @@ -12,9 +12,10 @@ #include #include "nm-glib-aux/nm-io-utils.h" +#include "nm-base/nm-ethtool-base.h" #include "platform/nmp-object.h" -#include "platform/nmp-netns.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nmp-netns.h" +#include "nm-platform/nm-platform-utils.h" #include "test-common.h" #include "nm-test-utils-core.h" @@ -3676,25 +3677,28 @@ test_ethtool_features_get(void) for (i_run = 0; i_run < 5; i_run++) { NMEthtoolFeatureStates *features; - NMTernary * requested; + NMOptionBool * requested; gboolean do_set = TRUE; - requested = g_new(NMTernary, _NM_ETHTOOL_ID_FEATURE_NUM); + requested = g_new(NMOptionBool, _NM_ETHTOOL_ID_FEATURE_NUM); for (i = 0; i < _NM_ETHTOOL_ID_FEATURE_NUM; i++) - requested[i] = NM_TERNARY_DEFAULT; + requested[i] = NM_OPTION_BOOL_DEFAULT; g_ptr_array_add(gfree_keeper, requested); if (i_run == 0) { - requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX(NM_ETHTOOL_ID_FEATURE_RX)] = NM_TERNARY_FALSE; - requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX(NM_ETHTOOL_ID_FEATURE_TSO)] = NM_TERNARY_FALSE; + requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX(NM_ETHTOOL_ID_FEATURE_RX)] = + NM_OPTION_BOOL_FALSE; + requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX(NM_ETHTOOL_ID_FEATURE_TSO)] = + NM_OPTION_BOOL_FALSE; requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX(NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION)] = - NM_TERNARY_FALSE; + NM_OPTION_BOOL_FALSE; } else if (i_run == 1) do_set = FALSE; else if (i_run == 2) { - requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX(NM_ETHTOOL_ID_FEATURE_TSO)] = NM_TERNARY_FALSE; + requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX(NM_ETHTOOL_ID_FEATURE_TSO)] = + NM_OPTION_BOOL_FALSE; requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX(NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION)] = - NM_TERNARY_TRUE; + NM_OPTION_BOOL_TRUE; } else if (i_run == 3) do_set = FALSE; diff --git a/src/platform/tests/test-platform-general.c b/src/platform/tests/test-platform-general.c index ee99348..00671cf 100644 --- a/src/platform/tests/test-platform-general.c +++ b/src/platform/tests/test-platform-general.c @@ -7,7 +7,7 @@ #include -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "platform/nm-linux-platform.h" #include "nm-test-utils-core.h" diff --git a/src/platform/tests/test-route.c b/src/platform/tests/test-route.c index f814d8c..0aa94ec 100644 --- a/src/platform/tests/test-route.c +++ b/src/platform/tests/test-route.c @@ -9,7 +9,7 @@ #include #include "nm-core-utils.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "platform/nmp-rules-manager.h" #include "test-common.h" diff --git a/src/platform/tests/test-tc.c b/src/platform/tests/test-tc.c index 1920dfa..c005b06 100644 --- a/src/platform/tests/test-tc.c +++ b/src/platform/tests/test-tc.c @@ -6,8 +6,8 @@ #include "nm-test-utils-core.h" #include "platform/nmp-object.h" -#include "platform/nmp-netns.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nmp-netns.h" +#include "nm-platform/nm-platform-utils.h" #include "test-common.h" static NMPObject * diff --git a/src/platform/wifi/nm-wifi-utils-nl80211.c b/src/platform/wifi/nm-wifi-utils-nl80211.c index a1c8ba6..aae6af1 100644 --- a/src/platform/wifi/nm-wifi-utils-nl80211.c +++ b/src/platform/wifi/nm-wifi-utils-nl80211.c @@ -15,10 +15,10 @@ #include #include -#include "platform/nm-netlink.h" +#include "nm-platform/nm-netlink.h" #include "nm-wifi-utils-private.h" #include "platform/nm-platform.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "nm-utils.h" #define _NMLOG_PREFIX_NAME "wifi-nl80211" diff --git a/src/platform/wifi/nm-wifi-utils-nl80211.h b/src/platform/wifi/nm-wifi-utils-nl80211.h index 1633a9c..37c32ed 100644 --- a/src/platform/wifi/nm-wifi-utils-nl80211.h +++ b/src/platform/wifi/nm-wifi-utils-nl80211.h @@ -8,7 +8,7 @@ #define __WIFI_UTILS_NL80211_H__ #include "nm-wifi-utils.h" -#include "platform/nm-netlink.h" +#include "nm-platform/nm-netlink.h" #define NM_TYPE_WIFI_UTILS_NL80211 (nm_wifi_utils_nl80211_get_type()) #define NM_WIFI_UTILS_NL80211(obj) \ diff --git a/src/platform/wifi/nm-wifi-utils-wext.c b/src/platform/wifi/nm-wifi-utils-wext.c index 070b210..2b070b5 100644 --- a/src/platform/wifi/nm-wifi-utils-wext.c +++ b/src/platform/wifi/nm-wifi-utils-wext.c @@ -23,8 +23,9 @@ #include "nm-wifi-utils-private.h" #include "nm-utils.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #include "nm-core-internal.h" +#include "nm-core-utils.h" typedef struct { NMWifiUtils parent; diff --git a/src/platform/wifi/nm-wifi-utils.c b/src/platform/wifi/nm-wifi-utils.c index a9d5f24..66d6a05 100644 --- a/src/platform/wifi/nm-wifi-utils.c +++ b/src/platform/wifi/nm-wifi-utils.c @@ -19,7 +19,7 @@ #endif #include "nm-core-utils.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" G_DEFINE_ABSTRACT_TYPE(NMWifiUtils, nm_wifi_utils, G_TYPE_OBJECT) diff --git a/src/platform/wifi/nm-wifi-utils.h b/src/platform/wifi/nm-wifi-utils.h index 09e07a2..a252e43 100644 --- a/src/platform/wifi/nm-wifi-utils.h +++ b/src/platform/wifi/nm-wifi-utils.h @@ -11,7 +11,7 @@ #include "nm-dbus-interface.h" #include "nm-setting-wireless.h" -#include "platform/nm-netlink.h" +#include "nm-platform/nm-netlink.h" typedef struct NMWifiUtils NMWifiUtils; diff --git a/src/platform/wpan/nm-wpan-utils.c b/src/platform/wpan/nm-wpan-utils.c index 79c72b9..96897ae 100644 --- a/src/platform/wpan/nm-wpan-utils.c +++ b/src/platform/wpan/nm-wpan-utils.c @@ -9,9 +9,9 @@ #include +#include "nm-platform/nm-netlink.h" #include "platform/linux/nl802154.h" -#include "platform/nm-netlink.h" -#include "platform/nm-platform-utils.h" +#include "nm-platform/nm-platform-utils.h" #define _NMLOG_PREFIX_NAME "wpan-nl802154" #define _NMLOG(level, domain, ...) \ diff --git a/src/platform/wpan/nm-wpan-utils.h b/src/platform/wpan/nm-wpan-utils.h index 6d170dd..940c2c9 100644 --- a/src/platform/wpan/nm-wpan-utils.h +++ b/src/platform/wpan/nm-wpan-utils.h @@ -9,7 +9,7 @@ #include #include "nm-dbus-interface.h" -#include "platform/nm-netlink.h" +#include "nm-platform/nm-netlink.h" typedef struct NMWpanUtils NMWpanUtils; diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c index 8e0bf1d..bce47ef 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c @@ -40,7 +40,7 @@ #include "nm-setting-generic.h" #include "nm-core-internal.h" #include "nm-utils.h" -#include "nm-libnm-core-intern/nm-ethtool-utils.h" +#include "nm-base/nm-ethtool-base.h" #include "platform/nm-platform.h" #include "NetworkManagerUtils.h" diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h index 0f05681..36ec922 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h @@ -7,7 +7,7 @@ #define _UTILS_H_ #include "nm-connection.h" -#include "nm-libnm-core-intern/nm-ethtool-utils.h" +#include "nm-base/nm-ethtool-base.h" #include "shvar.h" diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c index a5f844e..a268c58 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c @@ -35,7 +35,7 @@ #include "nm-core-internal.h" #include "NetworkManagerUtils.h" #include "nm-meta-setting.h" -#include "nm-libnm-core-intern/nm-ethtool-utils.h" +#include "nm-base/nm-ethtool-base.h" #include "nms-ifcfg-rh-common.h" #include "nms-ifcfg-rh-reader.h" diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c index 5b6923e..71f2d3e 100644 --- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -37,7 +37,8 @@ #include "nm-setting-vlan.h" #include "nm-setting-dcb.h" #include "nm-core-internal.h" -#include "nm-libnm-core-intern/nm-ethtool-utils.h" +#include "nm-base/nm-ethtool-base.h" +#include "nm-base/nm-ethtool-utils-base.h" #include "NetworkManagerUtils.h" diff --git a/src/supplicant/nm-supplicant-interface.c b/src/supplicant/nm-supplicant-interface.c index 18d571f..ec278c3 100644 --- a/src/supplicant/nm-supplicant-interface.c +++ b/src/supplicant/nm-supplicant-interface.c @@ -585,7 +585,7 @@ _bss_info_properties_changed(NMSupplicantInterface *self, if (v_v) { if (g_variant_lookup(v_v, "Type", "&s", &v_s)) { - p_ap_flags = NM_802_11_AP_FLAGS_WPS; + f = NM_802_11_AP_FLAGS_WPS; if (nm_streq(v_s, "pcb")) f |= NM_802_11_AP_FLAGS_WPS_PBC; else if (nm_streq(v_s, "pin")) diff --git a/src/systemd/meson.build b/src/systemd/meson.build index 4dbbe13..4f3a63e 100644 --- a/src/systemd/meson.build +++ b/src/systemd/meson.build @@ -1,33 +1,5 @@ # SPDX-License-Identifier: LGPL-2.1-or-later -sources = files( - 'src/libsystemd-network/arp-util.c', - 'src/libsystemd-network/dhcp-identifier.c', - 'src/libsystemd-network/dhcp-network.c', - 'src/libsystemd-network/dhcp-option.c', - 'src/libsystemd-network/dhcp-packet.c', - 'src/libsystemd-network/dhcp6-network.c', - 'src/libsystemd-network/dhcp6-option.c', - 'src/libsystemd-network/lldp-neighbor.c', - 'src/libsystemd-network/lldp-network.c', - 'src/libsystemd-network/network-internal.c', - '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-dhcp6-lease.c', - 'src/libsystemd-network/sd-ipv4acd.c', - 'src/libsystemd-network/sd-ipv4ll.c', - 'src/libsystemd-network/sd-lldp.c', - 'src/libsystemd/sd-event/event-util.c', - 'src/libsystemd/sd-event/sd-event.c', - 'src/libsystemd/sd-id128/id128-util.c', - 'src/libsystemd/sd-id128/sd-id128.c', - 'nm-sd.c', - 'nm-sd-utils-core.c', - 'nm-sd-utils-dhcp.c', - 'sd-adapt-core/nm-sd-adapt-core.c', -) - incs = include_directories( 'sd-adapt-core', 'src/libsystemd-network', @@ -35,16 +7,54 @@ incs = include_directories( 'src/systemd', ) -deps = [ - daemon_nm_default_dep, - libnm_systemd_shared_dep, -] - libnm_systemd_core = static_library( 'nm-systemd-core', - sources: sources, - include_directories: incs, - dependencies: deps, + sources: files( + 'src/libsystemd-network/arp-util.c', + 'src/libsystemd-network/dhcp-identifier.c', + 'src/libsystemd-network/dhcp-network.c', + 'src/libsystemd-network/dhcp-option.c', + 'src/libsystemd-network/dhcp-packet.c', + 'src/libsystemd-network/dhcp6-network.c', + 'src/libsystemd-network/dhcp6-option.c', + 'src/libsystemd-network/lldp-neighbor.c', + 'src/libsystemd-network/lldp-network.c', + 'src/libsystemd-network/network-internal.c', + '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-dhcp6-lease.c', + 'src/libsystemd-network/sd-ipv4acd.c', + 'src/libsystemd-network/sd-ipv4ll.c', + 'src/libsystemd-network/sd-lldp.c', + 'src/libsystemd/sd-event/event-util.c', + 'src/libsystemd/sd-event/sd-event.c', + 'src/libsystemd/sd-id128/id128-util.c', + 'src/libsystemd/sd-id128/sd-id128.c', + 'nm-sd.c', + 'nm-sd-utils-core.c', + 'nm-sd-utils-dhcp.c', + 'sd-adapt-core/nm-sd-adapt-core.c', + ), + include_directories: [ + incs, + src_inc, + ], + dependencies: [ + glib_nm_default_dep, + libnm_core_dep, + libnm_systemd_shared_dep, + ], c_args: '-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_SYSTEMD', link_with: libc_siphash, ) + +libnm_systemd_core_dep = declare_dependency( + include_directories: incs, + dependencies: [ + glib_dep, + libnm_core_dep, + libnm_systemd_shared_dep, + ], + link_with: libnm_systemd_core, +) diff --git a/src/tests/meson.build b/src/tests/meson.build index 7d6d0b0..1d3f596 100644 --- a/src/tests/meson.build +++ b/src/tests/meson.build @@ -29,28 +29,25 @@ foreach test_unit: test_units ) endforeach -test_unit = 'test-systemd' - -c_flags = [ - '-DNETWORKMANAGER_COMPILATION_TEST', - '-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_SYSTEMD', -] - -links = [ - libnm_systemd_core, - libnm_systemd_shared, -] - exe = executable( - test_unit, - test_unit + '.c', - dependencies: daemon_nm_default_dep, - c_args: c_flags, - link_with: links, + 'test-systemd', + 'test-systemd.c', + include_directories: [ + top_inc, + src_inc, + ], + dependencies: [ + libnm_systemd_core_dep, + libnm_systemd_shared_dep, + ], + c_args: [ + '-DNETWORKMANAGER_COMPILATION_TEST', + '-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_SYSTEMD', + ], ) test( - test_unit, + 'test-systemd', test_script, args: test_args + [exe.full_path()], ) diff --git a/src/tests/test-core.c b/src/tests/test-core.c index 0027234..87136dc 100644 --- a/src/tests/test-core.c +++ b/src/tests/test-core.c @@ -105,6 +105,32 @@ test_logging_domains(void) /*****************************************************************************/ static void +test_logging_error(void) +{ + gs_free_error GError *error = NULL; + gboolean success; + + g_assert_cmpint(NM_MANAGER_ERROR, ==, _NM_MANAGER_ERROR); + G_STATIC_ASSERT_EXPR(NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL == _NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL); + G_STATIC_ASSERT_EXPR(NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN + == _NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN); + + success = nm_logging_setup("bogus", "ALL", NULL, &error); + nmtst_assert_no_success(success, error); + g_assert_cmpint(error->domain, ==, NM_MANAGER_ERROR); + g_assert_cmpint(error->code, ==, NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL); + nm_clear_pointer(&error, g_error_free); + + success = nm_logging_setup("debug", "bogus", NULL, &error); + nmtst_assert_no_success(success, error); + g_assert_cmpint(error->domain, ==, NM_MANAGER_ERROR); + g_assert_cmpint(error->code, ==, NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN); + nm_clear_pointer(&error, g_error_free); +} + +/*****************************************************************************/ + +static void _test_same_prefix(const char *a1, const char *a2, guint8 plen) { struct in6_addr a = *nmtst_inet6_from_string(a1); @@ -2544,6 +2570,7 @@ main(int argc, char **argv) nmtst_init_with_logging(&argc, &argv, NULL, "ALL"); g_test_add_func("/general/test_logging_domains", test_logging_domains); + g_test_add_func("/general/test_logging_error", test_logging_error); g_test_add_func("/general/nm_utils_strbuf_append", test_nm_utils_strbuf_append);