From 51a182581feb8f64bf7e9d0e89c159b3e91c65e1 Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Fri, 4 Feb 2022 18:24:18 +0100 Subject: [PATCH 001/118] release: bump version to 1.37.0 (development) --- configure.ac | 4 ++-- meson.build | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index a3a7b94e75..eefaf5f8e5 100644 --- a/configure.ac +++ b/configure.ac @@ -7,8 +7,8 @@ dnl - add corresponding NM_VERSION_x_y_z macros in dnl "shared/nm-version-macros.h.in" dnl - update number in meson.build m4_define([nm_major_version], [1]) -m4_define([nm_minor_version], [35]) -m4_define([nm_micro_version], [90]) +m4_define([nm_minor_version], [37]) +m4_define([nm_micro_version], [0]) m4_define([nm_version], [nm_major_version.nm_minor_version.nm_micro_version]) diff --git a/meson.build b/meson.build index 5db26fdcc6..2020a5a990 100644 --- a/meson.build +++ b/meson.build @@ -6,7 +6,7 @@ project( # - add corresponding NM_VERSION_x_y_z macros in # "src/libnm-core-public/nm-version-macros.h.in" # - update number in configure.ac - version: '1.35.90', + version: '1.37.0', license: 'GPL2+', default_options: [ 'buildtype=debugoptimized', From e23ebe91834e0f18e7afd713ffe2950df3299b8e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 5 Feb 2022 01:09:41 +0100 Subject: [PATCH 002/118] l3cfg: fix setting default route table during nm_l3_config_data_merge() We made the choice, that NMPlatformIPRoute does not contain the actual route table, instead it contains a "remapped" number: table_coerced. That remapping done, so that the default (which we want semantically to be 254, RT_TABLE_MAIN) is numerical zero so that struct initialization doesn't you require to explicitly set the default. Hence, we must always distinguish whether we have the real table number or the "table_coerced", and you must convert back and forth between the two. Now, the parameter of nm_l3_config_data_merge() are real table numbers (as also indicated by their name not having the term "coerced"). So usually they are set to actually 254. When we set the field of NMPlatformIPRoute, we must coerce it. This was wrong, and we would see wrong table numbers in the log: l3cfg[17b98e59a477b0f4,ifindex=2]: obj-state: track: [2a32eca99405767e, ip4-route, type unicast table 0 0.0.0.0/0 via ... Fixes: b4aa35e72d57 ('l3cfg: extend nm_l3cfg_add_config() to accept default route table and metric') --- src/core/nm-l3-config-data.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c index 226ccd0025..4b099884f8 100644 --- a/src/core/nm-l3-config-data.c +++ b/src/core/nm-l3-config-data.c @@ -2995,12 +2995,12 @@ nm_l3_config_data_merge(NML3ConfigData *self, NML3ConfigMergeHookAddObj hook_add_obj, gpointer hook_user_data) { - static const guint32 x_default_route_table_x[2] = {RT_TABLE_MAIN, RT_TABLE_MAIN}; static const guint32 x_default_route_metric_x[2] = {NM_PLATFORM_ROUTE_METRIC_DEFAULT_IP6, NM_PLATFORM_ROUTE_METRIC_DEFAULT_IP4}; static const guint32 x_default_route_penalty_x[2] = {0, 0}; static const int x_default_dns_priority_x[2] = {NM_DNS_PRIORITY_DEFAULT_NORMAL, NM_DNS_PRIORITY_DEFAULT_NORMAL}; + guint32 default_route_table_coerced_x[2]; NMDedupMultiIter iter; const NMPObject *obj; int IS_IPv4; @@ -3008,8 +3008,16 @@ nm_l3_config_data_merge(NML3ConfigData *self, nm_assert(_NM_IS_L3_CONFIG_DATA(self, FALSE)); nm_assert(_NM_IS_L3_CONFIG_DATA(src, TRUE)); - if (!default_route_table_x) - default_route_table_x = x_default_route_table_x; + if (default_route_table_x) { + default_route_table_coerced_x[0] = nm_platform_route_table_coerce(default_route_table_x[0]); + default_route_table_coerced_x[1] = nm_platform_route_table_coerce(default_route_table_x[1]); + } else { + default_route_table_coerced_x[0] = nm_platform_route_table_coerce(RT_TABLE_MAIN); + default_route_table_coerced_x[1] = nm_platform_route_table_coerce(RT_TABLE_MAIN); + } + nm_assert(nm_platform_route_table_uncoerce(default_route_table_coerced_x[0], FALSE) != 0); + nm_assert(nm_platform_route_table_uncoerce(default_route_table_coerced_x[1], FALSE) != 0); + if (!default_route_metric_x) default_route_metric_x = x_default_route_metric_x; if (!default_route_penalty_x) @@ -3017,8 +3025,6 @@ nm_l3_config_data_merge(NML3ConfigData *self, if (!default_dns_priority_x) default_dns_priority_x = x_default_dns_priority_x; - nm_assert(default_route_table_x[0] != 0); - nm_assert(default_route_table_x[1] != 0); nm_assert(default_route_metric_x[0] != 0); /* IPv6 route metric cannot be zero. */ nm_assert(!NM_FLAGS_HAS(merge_flags, NM_L3_CONFIG_MERGE_FLAGS_CLONE) @@ -3145,7 +3151,7 @@ nm_l3_config_data_merge(NML3ConfigData *self, if (r_src->table_any) { _ensure_r(); r.rx.table_any = FALSE; - r.rx.table_coerced = default_route_table_x[IS_IPv4]; + r.rx.table_coerced = default_route_table_coerced_x[IS_IPv4]; } if (r_src->metric_any) { From a2c4f071e48e05f808595aff74ab5c83c95a70cd Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 12:12:12 +0100 Subject: [PATCH 003/118] all: drop /**/ annotations for enums We don't run glib-mkenums for certain sources like "core" and "libnm-glib-aux". These annotations have no effect. Drop them. They also mess with the automated formatting. --- src/core/devices/nm-device.h | 47 ++++++------ src/core/nm-rfkill-manager.h | 20 ++--- src/libnm-glib-aux/nm-logging-fwd.h | 113 ++++++++++++++-------------- src/libnm-platform/nm-platform.h | 22 +++--- src/libnm-platform/nmp-object.h | 18 ++--- src/nmtui/nmt-mac-entry.h | 6 +- 6 files changed, 113 insertions(+), 113 deletions(-) diff --git a/src/core/devices/nm-device.h b/src/core/devices/nm-device.h index cfcd4ade6d..4c3abc05f7 100644 --- a/src/core/devices/nm-device.h +++ b/src/core/devices/nm-device.h @@ -105,38 +105,38 @@ typedef enum NMActStageReturn NMActStageReturn; * a condition, so that adding a flag might make a connection available that would * not be available otherwise. Adding a flag should never make a connection * not available if it would be available otherwise. */ -typedef enum { /*< skip >*/ - NM_DEVICE_CHECK_CON_AVAILABLE_NONE = 0, +typedef enum { + NM_DEVICE_CHECK_CON_AVAILABLE_NONE = 0, - /* since NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST is a collection of flags with more fine grained + /* since NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST is a collection of flags with more fine grained * parts, this flag in general indicates that this is a user-request. */ - _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST = (1L << 0), + _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST = (1L << 0), - /* we also consider devices which have no carrier but are still waiting for the driver + /* we also consider devices which have no carrier but are still waiting for the driver * to detect carrier. Usually, such devices are not yet available, however for a user-request * they are. They might fail later if carrier doesn't come. */ - _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_WAITING_CARRIER = (1L << 1), + _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_WAITING_CARRIER = (1L << 1), - /* usually, a profile is only available if the Wi-Fi AP is in range. For an + /* usually, a profile is only available if the Wi-Fi AP is in range. For an * explicit user request, we also consider profiles for APs that are not (yet) * visible. */ - _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_IGNORE_AP = (1L << 2), + _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_IGNORE_AP = (1L << 2), - /* a device can be marked as unmanaged for various reasons. Some of these reasons + /* a device can be marked as unmanaged for various reasons. Some of these reasons * are authoritative, others not. Non-authoritative reasons can be overruled by * `nmcli device set $DEVICE managed yes`. Also, for an explicit user activation * request we may want to consider the device as managed. This flag makes devices * that are unmanaged appear available. */ - _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_OVERRULE_UNMANAGED = (1L << 3), + _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_OVERRULE_UNMANAGED = (1L << 3), - /* a collection of flags, that are commonly set for an explicit user-request. */ - NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST = - _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST - | _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_WAITING_CARRIER - | _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_IGNORE_AP - | _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_OVERRULE_UNMANAGED, + /* a collection of flags, that are commonly set for an explicit user-request. */ + NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST = + _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST + | _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_WAITING_CARRIER + | _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_IGNORE_AP + | _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_OVERRULE_UNMANAGED, - NM_DEVICE_CHECK_CON_AVAILABLE_ALL = (1L << 4) - 1, + NM_DEVICE_CHECK_CON_AVAILABLE_ALL = (1L << 4) - 1, } NMDeviceCheckConAvailableFlags; struct _NMDevicePrivate; @@ -149,19 +149,18 @@ struct _NMDevice { /* The flags have an relaxing meaning, that means, specifying more flags, can make * a device appear more available. It can never make a device less available. */ -typedef enum { /*< skip >*/ - NM_DEVICE_CHECK_DEV_AVAILABLE_NONE = 0, +typedef enum { + NM_DEVICE_CHECK_DEV_AVAILABLE_NONE = 0, - /* the device is considered available, even if it has no carrier. + /* the device is considered available, even if it has no carrier. * * For various device types (software devices) we ignore carrier based * on the type. So, for them, this flag has no effect anyway. */ - _NM_DEVICE_CHECK_DEV_AVAILABLE_IGNORE_CARRIER = (1L << 0), + _NM_DEVICE_CHECK_DEV_AVAILABLE_IGNORE_CARRIER = (1L << 0), - NM_DEVICE_CHECK_DEV_AVAILABLE_FOR_USER_REQUEST = - _NM_DEVICE_CHECK_DEV_AVAILABLE_IGNORE_CARRIER, + NM_DEVICE_CHECK_DEV_AVAILABLE_FOR_USER_REQUEST = _NM_DEVICE_CHECK_DEV_AVAILABLE_IGNORE_CARRIER, - NM_DEVICE_CHECK_DEV_AVAILABLE_ALL = (1L << 1) - 1, + NM_DEVICE_CHECK_DEV_AVAILABLE_ALL = (1L << 1) - 1, } NMDeviceCheckDevAvailableFlags; typedef void (*NMDeviceDeactivateCallback)(NMDevice *self, GError *error, gpointer user_data); diff --git a/src/core/nm-rfkill-manager.h b/src/core/nm-rfkill-manager.h index d3f6634935..bae6a7e4d0 100644 --- a/src/core/nm-rfkill-manager.h +++ b/src/core/nm-rfkill-manager.h @@ -7,22 +7,22 @@ #ifndef __NM_RFKILL_MANAGER_H__ #define __NM_RFKILL_MANAGER_H__ -typedef enum { /*< skip >*/ - RFKILL_UNBLOCKED = 0, - RFKILL_SOFT_BLOCKED = 1, - RFKILL_HARD_BLOCKED = 2 +typedef enum { + RFKILL_UNBLOCKED = 0, + RFKILL_SOFT_BLOCKED = 1, + RFKILL_HARD_BLOCKED = 2, } RfKillState; -typedef enum { /*< skip >*/ - RFKILL_TYPE_WLAN = 0, - RFKILL_TYPE_WWAN = 1, +typedef enum { + RFKILL_TYPE_WLAN = 0, + RFKILL_TYPE_WWAN = 1, - /* UNKNOWN and MAX should always be 1 more than + /* UNKNOWN and MAX should always be 1 more than * the last rfkill type since RFKILL_TYPE_MAX is * used as an array size. */ - RFKILL_TYPE_UNKNOWN, /* KEEP LAST */ - RFKILL_TYPE_MAX = RFKILL_TYPE_UNKNOWN + RFKILL_TYPE_UNKNOWN, /* KEEP LAST */ + RFKILL_TYPE_MAX = RFKILL_TYPE_UNKNOWN, } RfKillType; #define NM_TYPE_RFKILL_MANAGER (nm_rfkill_manager_get_type()) diff --git a/src/libnm-glib-aux/nm-logging-fwd.h b/src/libnm-glib-aux/nm-logging-fwd.h index 3e999c4a9c..0e715c5047 100644 --- a/src/libnm-glib-aux/nm-logging-fwd.h +++ b/src/libnm-glib-aux/nm-logging-fwd.h @@ -9,54 +9,54 @@ /* Log domains */ -typedef enum { /*< skip >*/ - LOGD_NONE = 0LL, - LOGD_PLATFORM = (1LL << 0), /* Platform services */ - LOGD_RFKILL = (1LL << 1), - LOGD_ETHER = (1LL << 2), - LOGD_WIFI = (1LL << 3), - LOGD_BT = (1LL << 4), - LOGD_MB = (1LL << 5), /* mobile broadband */ - LOGD_DHCP4 = (1LL << 6), - LOGD_DHCP6 = (1LL << 7), - LOGD_PPP = (1LL << 8), - LOGD_WIFI_SCAN = (1LL << 9), - LOGD_IP4 = (1LL << 10), - LOGD_IP6 = (1LL << 11), - LOGD_AUTOIP4 = (1LL << 12), - LOGD_DNS = (1LL << 13), - LOGD_VPN = (1LL << 14), - LOGD_SHARING = (1LL << 15), /* Connection sharing/dnsmasq */ - LOGD_SUPPLICANT = (1LL << 16), /* Wi-Fi and 802.1x */ - LOGD_AGENTS = (1LL << 17), /* Secret agents */ - LOGD_SETTINGS = (1LL << 18), /* Settings */ - LOGD_SUSPEND = (1LL << 19), /* Suspend/Resume */ - LOGD_CORE = (1LL << 20), /* Core daemon and policy stuff */ - LOGD_DEVICE = (1LL << 21), /* Device state and activation */ - LOGD_OLPC = (1LL << 22), - LOGD_INFINIBAND = (1LL << 23), - LOGD_FIREWALL = (1LL << 24), - LOGD_ADSL = (1LL << 25), - LOGD_BOND = (1LL << 26), - LOGD_VLAN = (1LL << 27), - LOGD_BRIDGE = (1LL << 28), - LOGD_DBUS_PROPS = (1LL << 29), - LOGD_TEAM = (1LL << 30), - LOGD_CONCHECK = (1LL << 31), - LOGD_DCB = (1LL << 32), /* Data Center Bridging */ - LOGD_DISPATCH = (1LL << 33), - LOGD_AUDIT = (1LL << 34), - LOGD_SYSTEMD = (1LL << 35), - LOGD_VPN_PLUGIN = (1LL << 36), - LOGD_PROXY = (1LL << 37), +typedef enum { + LOGD_NONE = 0LL, + LOGD_PLATFORM = (1LL << 0), /* Platform services */ + LOGD_RFKILL = (1LL << 1), + LOGD_ETHER = (1LL << 2), + LOGD_WIFI = (1LL << 3), + LOGD_BT = (1LL << 4), + LOGD_MB = (1LL << 5), /* mobile broadband */ + LOGD_DHCP4 = (1LL << 6), + LOGD_DHCP6 = (1LL << 7), + LOGD_PPP = (1LL << 8), + LOGD_WIFI_SCAN = (1LL << 9), + LOGD_IP4 = (1LL << 10), + LOGD_IP6 = (1LL << 11), + LOGD_AUTOIP4 = (1LL << 12), + LOGD_DNS = (1LL << 13), + LOGD_VPN = (1LL << 14), + LOGD_SHARING = (1LL << 15), /* Connection sharing/dnsmasq */ + LOGD_SUPPLICANT = (1LL << 16), /* Wi-Fi and 802.1x */ + LOGD_AGENTS = (1LL << 17), /* Secret agents */ + LOGD_SETTINGS = (1LL << 18), /* Settings */ + LOGD_SUSPEND = (1LL << 19), /* Suspend/Resume */ + LOGD_CORE = (1LL << 20), /* Core daemon and policy stuff */ + LOGD_DEVICE = (1LL << 21), /* Device state and activation */ + LOGD_OLPC = (1LL << 22), + LOGD_INFINIBAND = (1LL << 23), + LOGD_FIREWALL = (1LL << 24), + LOGD_ADSL = (1LL << 25), + LOGD_BOND = (1LL << 26), + LOGD_VLAN = (1LL << 27), + LOGD_BRIDGE = (1LL << 28), + LOGD_DBUS_PROPS = (1LL << 29), + LOGD_TEAM = (1LL << 30), + LOGD_CONCHECK = (1LL << 31), + LOGD_DCB = (1LL << 32), /* Data Center Bridging */ + LOGD_DISPATCH = (1LL << 33), + LOGD_AUDIT = (1LL << 34), + LOGD_SYSTEMD = (1LL << 35), + LOGD_VPN_PLUGIN = (1LL << 36), + LOGD_PROXY = (1LL << 37), - __LOGD_MAX, - LOGD_ALL = (((__LOGD_MAX - 1LL) << 1) - 1LL), - LOGD_DEFAULT = LOGD_ALL & ~(LOGD_DBUS_PROPS | LOGD_WIFI_SCAN | LOGD_VPN_PLUGIN | 0), + __LOGD_MAX, + LOGD_ALL = (((__LOGD_MAX - 1LL) << 1) - 1LL), + LOGD_DEFAULT = LOGD_ALL & ~(LOGD_DBUS_PROPS | LOGD_WIFI_SCAN | LOGD_VPN_PLUGIN | 0), - /* aliases: */ - LOGD_DHCP = LOGD_DHCP4 | LOGD_DHCP6, - LOGD_IP = LOGD_IP4 | LOGD_IP6, + /* aliases: */ + LOGD_DHCP = LOGD_DHCP4 | LOGD_DHCP6, + LOGD_IP = LOGD_IP4 | LOGD_IP6, #define LOGD_DHCPX(is_ipv4) ((is_ipv4) ? LOGD_DHCP4 : LOGD_DHCP6) #define LOGD_IPX(is_ipv4) ((is_ipv4) ? LOGD_IP4 : LOGD_IP6) @@ -64,19 +64,20 @@ typedef enum { /*< skip >*/ } NMLogDomain; /* Log levels */ -typedef enum { /*< skip >*/ - LOGL_TRACE, - LOGL_DEBUG, - LOGL_INFO, - LOGL_WARN, - LOGL_ERR, +typedef enum { - _LOGL_N_REAL, /* the number of actual logging levels */ + LOGL_TRACE, + LOGL_DEBUG, + LOGL_INFO, + LOGL_WARN, + LOGL_ERR, - _LOGL_OFF = _LOGL_N_REAL, /* special logging level that is always disabled. */ - _LOGL_KEEP, /* special logging level to indicate that the logging level should not be changed. */ + _LOGL_N_REAL, /* the number of actual logging levels */ - _LOGL_N, /* the number of logging levels including "OFF" */ + _LOGL_OFF = _LOGL_N_REAL, /* special logging level that is always disabled. */ + _LOGL_KEEP, /* special logging level to indicate that the logging level should not be changed. */ + + _LOGL_N, /* the number of logging levels including "OFF" */ } NMLogLevel; gboolean _nm_log_enabled_impl(gboolean mt_require_locking, NMLogLevel level, NMLogDomain domain); diff --git a/src/libnm-platform/nm-platform.h b/src/libnm-platform/nm-platform.h index c305a1db28..e55610260d 100644 --- a/src/libnm-platform/nm-platform.h +++ b/src/libnm-platform/nm-platform.h @@ -259,17 +259,17 @@ struct _NMPlatformLink { bool initialized : 1; }; -typedef enum { /*< skip >*/ - NM_PLATFORM_SIGNAL_ID_NONE, - NM_PLATFORM_SIGNAL_ID_LINK, - NM_PLATFORM_SIGNAL_ID_IP4_ADDRESS, - NM_PLATFORM_SIGNAL_ID_IP6_ADDRESS, - NM_PLATFORM_SIGNAL_ID_IP4_ROUTE, - NM_PLATFORM_SIGNAL_ID_IP6_ROUTE, - NM_PLATFORM_SIGNAL_ID_ROUTING_RULE, - NM_PLATFORM_SIGNAL_ID_QDISC, - NM_PLATFORM_SIGNAL_ID_TFILTER, - _NM_PLATFORM_SIGNAL_ID_LAST, +typedef enum { + NM_PLATFORM_SIGNAL_ID_NONE, + NM_PLATFORM_SIGNAL_ID_LINK, + NM_PLATFORM_SIGNAL_ID_IP4_ADDRESS, + NM_PLATFORM_SIGNAL_ID_IP6_ADDRESS, + NM_PLATFORM_SIGNAL_ID_IP4_ROUTE, + NM_PLATFORM_SIGNAL_ID_IP6_ROUTE, + NM_PLATFORM_SIGNAL_ID_ROUTING_RULE, + NM_PLATFORM_SIGNAL_ID_QDISC, + NM_PLATFORM_SIGNAL_ID_TFILTER, + _NM_PLATFORM_SIGNAL_ID_LAST, } NMPlatformSignalIdType; guint _nm_platform_signal_id_get(NMPlatformSignalIdType signal_type); diff --git a/src/libnm-platform/nmp-object.h b/src/libnm-platform/nmp-object.h index 784dcc2dec..508def45f2 100644 --- a/src/libnm-platform/nmp-object.h +++ b/src/libnm-platform/nmp-object.h @@ -91,17 +91,17 @@ typedef struct _NMPWireGuardPeer { /*****************************************************************************/ -typedef enum { /*< skip >*/ - NMP_OBJECT_TO_STRING_ID, - NMP_OBJECT_TO_STRING_PUBLIC, - NMP_OBJECT_TO_STRING_ALL, +typedef enum { + NMP_OBJECT_TO_STRING_ID, + NMP_OBJECT_TO_STRING_PUBLIC, + NMP_OBJECT_TO_STRING_ALL, } NMPObjectToStringMode; -typedef enum { /*< skip >*/ - NMP_CACHE_OPS_UNCHANGED = NM_PLATFORM_SIGNAL_NONE, - NMP_CACHE_OPS_ADDED = NM_PLATFORM_SIGNAL_ADDED, - NMP_CACHE_OPS_UPDATED = NM_PLATFORM_SIGNAL_CHANGED, - NMP_CACHE_OPS_REMOVED = NM_PLATFORM_SIGNAL_REMOVED, +typedef enum { + NMP_CACHE_OPS_UNCHANGED = NM_PLATFORM_SIGNAL_NONE, + NMP_CACHE_OPS_ADDED = NM_PLATFORM_SIGNAL_ADDED, + NMP_CACHE_OPS_UPDATED = NM_PLATFORM_SIGNAL_CHANGED, + NMP_CACHE_OPS_REMOVED = NM_PLATFORM_SIGNAL_REMOVED, } NMPCacheOpsType; /* The NMPCacheIdType are the different index types. diff --git a/src/nmtui/nmt-mac-entry.h b/src/nmtui/nmt-mac-entry.h index 0ed5a28cbd..de44fb9d0e 100644 --- a/src/nmtui/nmt-mac-entry.h +++ b/src/nmtui/nmt-mac-entry.h @@ -9,9 +9,9 @@ #include "nm-utils.h" #include "libnmt-newt/nmt-newt.h" -typedef enum { /*< skip >*/ - NMT_MAC_ENTRY_TYPE_MAC, - NMT_MAC_ENTRY_TYPE_CLONED, +typedef enum { + NMT_MAC_ENTRY_TYPE_MAC, + NMT_MAC_ENTRY_TYPE_CLONED, } NmtMacEntryType; #define NMT_TYPE_MAC_ENTRY (nmt_mac_entry_get_type()) From e62792ff38e2c1aac53d2edd60283c8875535e49 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 12:36:28 +0100 Subject: [PATCH 004/118] all: adjust glib-mkenums annotations for automated formatting The annotation results in bad formatting. Work around. --- src/contrib/nm-vpn-editor-plugin-call.h | 6 +- src/libnm-client-public/nm-client.h | 6 +- .../tests/test-general-enums.h | 10 +- src/libnm-core-intern/nm-core-internal.h | 14 +- .../nm-meta-setting-base-impl.h | 18 +- src/libnm-core-public/nm-connection.h | 18 +- src/libnm-core-public/nm-dbus-interface.h | 238 +++++++++--------- src/libnm-core-public/nm-keyfile.h | 4 +- src/libnm-core-public/nm-setting-8021x.h | 12 +- src/libnm-core-public/nm-setting-dcb.h | 10 +- src/libnm-core-public/nm-setting-ip-config.h | 34 +-- src/libnm-core-public/nm-setting-ip-tunnel.h | 16 +- src/libnm-core-public/nm-setting-team.h | 10 +- src/libnm-core-public/nm-setting-vlan.h | 16 +- src/libnm-core-public/nm-setting-wired.h | 24 +- .../nm-setting-wireless-security.h | 12 +- src/libnm-core-public/nm-setting-wireless.h | 2 +- src/libnm-core-public/nm-setting.h | 12 +- .../nm-meta-setting-base-impl.h | 18 +- 19 files changed, 240 insertions(+), 240 deletions(-) diff --git a/src/contrib/nm-vpn-editor-plugin-call.h b/src/contrib/nm-vpn-editor-plugin-call.h index 713ddf082e..bf6036ee17 100644 --- a/src/contrib/nm-vpn-editor-plugin-call.h +++ b/src/contrib/nm-vpn-editor-plugin-call.h @@ -27,9 +27,9 @@ * @NM_VPN_EDITOR_PLUGIN_SERVICE_FLAGS_CAN_ADD: whether the plugin can * add a new connection for the given service-type. **/ -typedef enum { /*< skip >*/ - NM_VPN_EDITOR_PLUGIN_SERVICE_FLAGS_NONE = 0x00, - NM_VPN_EDITOR_PLUGIN_SERVICE_FLAGS_CAN_ADD = 0x01, +typedef enum /*< skip >*/ { + NM_VPN_EDITOR_PLUGIN_SERVICE_FLAGS_NONE = 0x00, + NM_VPN_EDITOR_PLUGIN_SERVICE_FLAGS_CAN_ADD = 0x01, } NMVpnEditorPluginServiceFlags; struct _NMVpnEditorPluginVT { diff --git a/src/libnm-client-public/nm-client.h b/src/libnm-client-public/nm-client.h index ac615b5716..eb97e4d4fb 100644 --- a/src/libnm-client-public/nm-client.h +++ b/src/libnm-client-public/nm-client.h @@ -27,9 +27,9 @@ G_BEGIN_DECLS * * Since: 1.24 */ -typedef enum { /*< flags >*/ - NM_CLIENT_INSTANCE_FLAGS_NONE = 0, - NM_CLIENT_INSTANCE_FLAGS_NO_AUTO_FETCH_PERMISSIONS = 1, +typedef enum /*< flags >*/ { + NM_CLIENT_INSTANCE_FLAGS_NONE = 0, + NM_CLIENT_INSTANCE_FLAGS_NO_AUTO_FETCH_PERMISSIONS = 1, } NMClientInstanceFlags; #define NM_TYPE_CLIENT (nm_client_get_type()) diff --git a/src/libnm-core-impl/tests/test-general-enums.h b/src/libnm-core-impl/tests/test-general-enums.h index b3163e2330..2ac8cf2bd7 100644 --- a/src/libnm-core-impl/tests/test-general-enums.h +++ b/src/libnm-core-impl/tests/test-general-enums.h @@ -25,11 +25,11 @@ typedef enum { NM_TEST_GENERAL_META_FLAGS_0x4 = (1 << 4), } NMTestGeneralMetaFlags; -typedef enum { /*< flags >*/ - NM_TEST_GENERAL_COLOR_FLAGS_WHITE = 1, /*< skip >*/ - NM_TEST_GENERAL_COLOR_FLAGS_BLUE = 2, - NM_TEST_GENERAL_COLOR_FLAGS_RED = 4, - NM_TEST_GENERAL_COLOR_FLAGS_GREEN = 8, +typedef enum /*< flags >*/ { + NM_TEST_GENERAL_COLOR_FLAGS_WHITE = 1, /*< skip >*/ + NM_TEST_GENERAL_COLOR_FLAGS_BLUE = 2, + NM_TEST_GENERAL_COLOR_FLAGS_RED = 4, + NM_TEST_GENERAL_COLOR_FLAGS_GREEN = 8, } NMTestGeneralColorFlags; #endif /* _NM_TEST_GENERAL_ENUMS_H_ */ diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index d9634b04ea..032f6a9a4c 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -189,14 +189,14 @@ NM_TERNARY_TO_OPTION_BOOL(NMTernary v) NMSetting **_nm_connection_get_settings_arr(NMConnection *connection); -typedef enum { /*< skip >*/ - NM_SETTING_PARSE_FLAGS_NONE = 0, - NM_SETTING_PARSE_FLAGS_STRICT = 1LL << 0, - NM_SETTING_PARSE_FLAGS_BEST_EFFORT = 1LL << 1, - NM_SETTING_PARSE_FLAGS_NORMALIZE = 1LL << 2, +typedef enum /*< skip >*/ { + NM_SETTING_PARSE_FLAGS_NONE = 0, + NM_SETTING_PARSE_FLAGS_STRICT = 1LL << 0, + NM_SETTING_PARSE_FLAGS_BEST_EFFORT = 1LL << 1, + NM_SETTING_PARSE_FLAGS_NORMALIZE = 1LL << 2, - _NM_SETTING_PARSE_FLAGS_LAST, - NM_SETTING_PARSE_FLAGS_ALL = ((_NM_SETTING_PARSE_FLAGS_LAST - 1) << 1) - 1, + _NM_SETTING_PARSE_FLAGS_LAST, + NM_SETTING_PARSE_FLAGS_ALL = ((_NM_SETTING_PARSE_FLAGS_LAST - 1) << 1) - 1, } NMSettingParseFlags; gboolean _nm_connection_replace_settings(NMConnection *connection, diff --git a/src/libnm-core-intern/nm-meta-setting-base-impl.h b/src/libnm-core-intern/nm-meta-setting-base-impl.h index ea4f85ff1b..b1f1263693 100644 --- a/src/libnm-core-intern/nm-meta-setting-base-impl.h +++ b/src/libnm-core-intern/nm-meta-setting-base-impl.h @@ -38,15 +38,15 @@ * * 10: NMSettingUser */ -typedef enum { /*< skip >*/ - NM_SETTING_PRIORITY_INVALID = 0, - NM_SETTING_PRIORITY_CONNECTION = 1, - NM_SETTING_PRIORITY_HW_BASE = 2, - NM_SETTING_PRIORITY_HW_NON_BASE = 3, - NM_SETTING_PRIORITY_HW_AUX = 4, - NM_SETTING_PRIORITY_AUX = 5, - NM_SETTING_PRIORITY_IP = 6, - NM_SETTING_PRIORITY_USER = 10, +typedef enum /*< skip >*/ { + NM_SETTING_PRIORITY_INVALID = 0, + NM_SETTING_PRIORITY_CONNECTION = 1, + NM_SETTING_PRIORITY_HW_BASE = 2, + NM_SETTING_PRIORITY_HW_NON_BASE = 3, + NM_SETTING_PRIORITY_HW_AUX = 4, + NM_SETTING_PRIORITY_AUX = 5, + NM_SETTING_PRIORITY_IP = 6, + NM_SETTING_PRIORITY_USER = 10, } NMSettingPriority; /*****************************************************************************/ diff --git a/src/libnm-core-public/nm-connection.h b/src/libnm-core-public/nm-connection.h index 081f115e80..93061f2539 100644 --- a/src/libnm-core-public/nm-connection.h +++ b/src/libnm-core-public/nm-connection.h @@ -122,15 +122,15 @@ NMSetting *nm_connection_get_setting_by_name(NMConnection *connection, const cha * These flags determine which properties are serialized when calling * nm_connection_to_dbus(). **/ -typedef enum { /*< flags >*/ - NM_CONNECTION_SERIALIZE_ALL = 0x00000000, - NM_CONNECTION_SERIALIZE_WITH_NON_SECRET = 0x00000001, - NM_CONNECTION_SERIALIZE_NO_SECRETS = 0x00000001, - NM_CONNECTION_SERIALIZE_WITH_SECRETS = 0x00000002, - NM_CONNECTION_SERIALIZE_ONLY_SECRETS = 0x00000002, - NM_CONNECTION_SERIALIZE_WITH_SECRETS_AGENT_OWNED = 0x00000004, - NM_CONNECTION_SERIALIZE_WITH_SECRETS_SYSTEM_OWNED = 0x00000008, - NM_CONNECTION_SERIALIZE_WITH_SECRETS_NOT_SAVED = 0x00000010, +typedef enum /*< flags >*/ { + NM_CONNECTION_SERIALIZE_ALL = 0x00000000, + NM_CONNECTION_SERIALIZE_WITH_NON_SECRET = 0x00000001, + NM_CONNECTION_SERIALIZE_NO_SECRETS = 0x00000001, + NM_CONNECTION_SERIALIZE_WITH_SECRETS = 0x00000002, + NM_CONNECTION_SERIALIZE_ONLY_SECRETS = 0x00000002, + NM_CONNECTION_SERIALIZE_WITH_SECRETS_AGENT_OWNED = 0x00000004, + NM_CONNECTION_SERIALIZE_WITH_SECRETS_SYSTEM_OWNED = 0x00000008, + NM_CONNECTION_SERIALIZE_WITH_SECRETS_NOT_SAVED = 0x00000010, } NMConnectionSerializationFlags; GVariant *nm_connection_to_dbus(NMConnection *connection, NMConnectionSerializationFlags flags); diff --git a/src/libnm-core-public/nm-dbus-interface.h b/src/libnm-core-public/nm-dbus-interface.h index fe2a6c09db..310dbbb0a3 100644 --- a/src/libnm-core-public/nm-dbus-interface.h +++ b/src/libnm-core-public/nm-dbus-interface.h @@ -265,12 +265,12 @@ typedef enum { * * General device capability flags. **/ -typedef enum { /*< flags >*/ - NM_DEVICE_CAP_NONE = 0x00000000, - NM_DEVICE_CAP_NM_SUPPORTED = 0x00000001, - NM_DEVICE_CAP_CARRIER_DETECT = 0x00000002, - NM_DEVICE_CAP_IS_SOFTWARE = 0x00000004, - NM_DEVICE_CAP_SRIOV = 0x00000008, +typedef enum /*< flags >*/ { + NM_DEVICE_CAP_NONE = 0x00000000, + NM_DEVICE_CAP_NM_SUPPORTED = 0x00000001, + NM_DEVICE_CAP_CARRIER_DETECT = 0x00000002, + NM_DEVICE_CAP_IS_SOFTWARE = 0x00000004, + NM_DEVICE_CAP_SRIOV = 0x00000008, } NMDeviceCapabilities; /** @@ -292,21 +292,21 @@ typedef enum { /*< flags >*/ * * 802.11 specific device encryption and authentication capabilities. **/ -typedef enum { /*< flags >*/ - NM_WIFI_DEVICE_CAP_NONE = 0x00000000, - NM_WIFI_DEVICE_CAP_CIPHER_WEP40 = 0x00000001, - NM_WIFI_DEVICE_CAP_CIPHER_WEP104 = 0x00000002, - NM_WIFI_DEVICE_CAP_CIPHER_TKIP = 0x00000004, - NM_WIFI_DEVICE_CAP_CIPHER_CCMP = 0x00000008, - NM_WIFI_DEVICE_CAP_WPA = 0x00000010, - NM_WIFI_DEVICE_CAP_RSN = 0x00000020, - NM_WIFI_DEVICE_CAP_AP = 0x00000040, - NM_WIFI_DEVICE_CAP_ADHOC = 0x00000080, - NM_WIFI_DEVICE_CAP_FREQ_VALID = 0x00000100, - NM_WIFI_DEVICE_CAP_FREQ_2GHZ = 0x00000200, - NM_WIFI_DEVICE_CAP_FREQ_5GHZ = 0x00000400, - NM_WIFI_DEVICE_CAP_MESH = 0x00001000, - NM_WIFI_DEVICE_CAP_IBSS_RSN = 0x00002000, +typedef enum /*< flags >*/ { + NM_WIFI_DEVICE_CAP_NONE = 0x00000000, + NM_WIFI_DEVICE_CAP_CIPHER_WEP40 = 0x00000001, + NM_WIFI_DEVICE_CAP_CIPHER_WEP104 = 0x00000002, + NM_WIFI_DEVICE_CAP_CIPHER_TKIP = 0x00000004, + NM_WIFI_DEVICE_CAP_CIPHER_CCMP = 0x00000008, + NM_WIFI_DEVICE_CAP_WPA = 0x00000010, + NM_WIFI_DEVICE_CAP_RSN = 0x00000020, + NM_WIFI_DEVICE_CAP_AP = 0x00000040, + NM_WIFI_DEVICE_CAP_ADHOC = 0x00000080, + NM_WIFI_DEVICE_CAP_FREQ_VALID = 0x00000100, + NM_WIFI_DEVICE_CAP_FREQ_2GHZ = 0x00000200, + NM_WIFI_DEVICE_CAP_FREQ_5GHZ = 0x00000400, + NM_WIFI_DEVICE_CAP_MESH = 0x00001000, + NM_WIFI_DEVICE_CAP_IBSS_RSN = 0x00002000, } NMDeviceWifiCapabilities; /** @@ -320,12 +320,12 @@ typedef enum { /*< flags >*/ * * 802.11 access point flags. **/ -typedef enum { /*< underscore_name=nm_802_11_ap_flags, flags >*/ - NM_802_11_AP_FLAGS_NONE = 0x00000000, - NM_802_11_AP_FLAGS_PRIVACY = 0x00000001, - NM_802_11_AP_FLAGS_WPS = 0x00000002, - NM_802_11_AP_FLAGS_WPS_PBC = 0x00000004, - NM_802_11_AP_FLAGS_WPS_PIN = 0x00000008, +typedef enum /*< underscore_name=nm_802_11_ap_flags, flags >*/ { + NM_802_11_AP_FLAGS_NONE = 0x00000000, + NM_802_11_AP_FLAGS_PRIVACY = 0x00000001, + NM_802_11_AP_FLAGS_WPS = 0x00000002, + NM_802_11_AP_FLAGS_WPS_PBC = 0x00000004, + NM_802_11_AP_FLAGS_WPS_PIN = 0x00000008, } NM80211ApFlags; /** @@ -361,22 +361,22 @@ typedef enum { /*< underscore_name=nm_802_11_ap_flags, flags >*/ * the current security requirements of an access point as determined from the * access point's beacon. **/ -typedef enum { /*< underscore_name=nm_802_11_ap_security_flags, flags >*/ - NM_802_11_AP_SEC_NONE = 0x00000000, - NM_802_11_AP_SEC_PAIR_WEP40 = 0x00000001, - NM_802_11_AP_SEC_PAIR_WEP104 = 0x00000002, - NM_802_11_AP_SEC_PAIR_TKIP = 0x00000004, - NM_802_11_AP_SEC_PAIR_CCMP = 0x00000008, - NM_802_11_AP_SEC_GROUP_WEP40 = 0x00000010, - NM_802_11_AP_SEC_GROUP_WEP104 = 0x00000020, - NM_802_11_AP_SEC_GROUP_TKIP = 0x00000040, - NM_802_11_AP_SEC_GROUP_CCMP = 0x00000080, - NM_802_11_AP_SEC_KEY_MGMT_PSK = 0x00000100, - NM_802_11_AP_SEC_KEY_MGMT_802_1X = 0x00000200, - NM_802_11_AP_SEC_KEY_MGMT_SAE = 0x00000400, - NM_802_11_AP_SEC_KEY_MGMT_OWE = 0x00000800, - NM_802_11_AP_SEC_KEY_MGMT_OWE_TM = 0x00001000, - NM_802_11_AP_SEC_KEY_MGMT_EAP_SUITE_B_192 = 0x00002000, +typedef enum /*< underscore_name=nm_802_11_ap_security_flags, flags >*/ { + NM_802_11_AP_SEC_NONE = 0x00000000, + NM_802_11_AP_SEC_PAIR_WEP40 = 0x00000001, + NM_802_11_AP_SEC_PAIR_WEP104 = 0x00000002, + NM_802_11_AP_SEC_PAIR_TKIP = 0x00000004, + NM_802_11_AP_SEC_PAIR_CCMP = 0x00000008, + NM_802_11_AP_SEC_GROUP_WEP40 = 0x00000010, + NM_802_11_AP_SEC_GROUP_WEP104 = 0x00000020, + NM_802_11_AP_SEC_GROUP_TKIP = 0x00000040, + NM_802_11_AP_SEC_GROUP_CCMP = 0x00000080, + NM_802_11_AP_SEC_KEY_MGMT_PSK = 0x00000100, + NM_802_11_AP_SEC_KEY_MGMT_802_1X = 0x00000200, + NM_802_11_AP_SEC_KEY_MGMT_SAE = 0x00000400, + NM_802_11_AP_SEC_KEY_MGMT_OWE = 0x00000800, + NM_802_11_AP_SEC_KEY_MGMT_OWE_TM = 0x00001000, + NM_802_11_AP_SEC_KEY_MGMT_EAP_SUITE_B_192 = 0x00002000, } NM80211ApSecurityFlags; /** @@ -412,10 +412,10 @@ typedef enum { /*< underscore_name=nm_802_11_mode >*/ * #NMBluetoothCapabilities values indicate the usable capabilities of a * Bluetooth device. **/ -typedef enum { /*< flags >*/ - NM_BT_CAPABILITY_NONE = 0x00000000, - NM_BT_CAPABILITY_DUN = 0x00000001, - NM_BT_CAPABILITY_NAP = 0x00000002, +typedef enum /*< flags >*/ { + NM_BT_CAPABILITY_NONE = 0x00000000, + NM_BT_CAPABILITY_DUN = 0x00000001, + NM_BT_CAPABILITY_NAP = 0x00000002, } NMBluetoothCapabilities; /** @@ -435,13 +435,13 @@ typedef enum { /*< flags >*/ * specific access technologies the device supports use the ModemManager D-Bus * API. **/ -typedef enum { /*< flags >*/ - NM_DEVICE_MODEM_CAPABILITY_NONE = 0x00000000, - NM_DEVICE_MODEM_CAPABILITY_POTS = 0x00000001, - NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO = 0x00000002, - NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS = 0x00000004, - NM_DEVICE_MODEM_CAPABILITY_LTE = 0x00000008, - NM_DEVICE_MODEM_CAPABILITY_5GNR = 0x00000040, +typedef enum /*< flags >*/ { + NM_DEVICE_MODEM_CAPABILITY_NONE = 0x00000000, + NM_DEVICE_MODEM_CAPABILITY_POTS = 0x00000001, + NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO = 0x00000002, + NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS = 0x00000004, + NM_DEVICE_MODEM_CAPABILITY_LTE = 0x00000008, + NM_DEVICE_MODEM_CAPABILITY_5GNR = 0x00000040, } NMDeviceModemCapabilities; /* Note: the numeric values of NMDeviceModemCapabilities must be identical to the values * in MMModemCapability. See the G_STATIC_ASSERT() in nm-modem-broadband.c's get_capabilities(). */ @@ -834,16 +834,16 @@ typedef enum { * * #NMSecretAgentGetSecretsFlags values modify the behavior of a GetSecrets request. */ -typedef enum { /*< flags >*/ - NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE = 0x0, - NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION = 0x1, - NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW = 0x2, - NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED = 0x4, - NM_SECRET_AGENT_GET_SECRETS_FLAG_WPS_PBC_ACTIVE = 0x8, +typedef enum /*< flags >*/ { + NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE = 0x0, + NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION = 0x1, + NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW = 0x2, + NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED = 0x4, + NM_SECRET_AGENT_GET_SECRETS_FLAG_WPS_PBC_ACTIVE = 0x8, - /* Internal to NM; not part of the D-Bus API */ - NM_SECRET_AGENT_GET_SECRETS_FLAG_ONLY_SYSTEM = 0x80000000, - NM_SECRET_AGENT_GET_SECRETS_FLAG_NO_ERRORS = 0x40000000, + /* Internal to NM; not part of the D-Bus API */ + NM_SECRET_AGENT_GET_SECRETS_FLAG_ONLY_SYSTEM = 0x80000000, + NM_SECRET_AGENT_GET_SECRETS_FLAG_NO_ERRORS = 0x40000000, } NMSecretAgentGetSecretsFlags; /** @@ -964,12 +964,12 @@ typedef enum { * * Since: 1.4 (gi flags generated since 1.12) */ -typedef enum { /*< flags >*/ - NM_CHECKPOINT_CREATE_FLAG_NONE = 0, - NM_CHECKPOINT_CREATE_FLAG_DESTROY_ALL = 0x01, - NM_CHECKPOINT_CREATE_FLAG_DELETE_NEW_CONNECTIONS = 0x02, - NM_CHECKPOINT_CREATE_FLAG_DISCONNECT_NEW_DEVICES = 0x04, - NM_CHECKPOINT_CREATE_FLAG_ALLOW_OVERLAPPING = 0x08, +typedef enum /*< flags >*/ { + NM_CHECKPOINT_CREATE_FLAG_NONE = 0, + NM_CHECKPOINT_CREATE_FLAG_DESTROY_ALL = 0x01, + NM_CHECKPOINT_CREATE_FLAG_DELETE_NEW_CONNECTIONS = 0x02, + NM_CHECKPOINT_CREATE_FLAG_DISCONNECT_NEW_DEVICES = 0x04, + NM_CHECKPOINT_CREATE_FLAG_ALLOW_OVERLAPPING = 0x08, } NMCheckpointCreateFlags; /** @@ -983,11 +983,11 @@ typedef enum { /*< flags >*/ * * Since: 1.4 **/ -typedef enum { /*< skip >*/ - NM_ROLLBACK_RESULT_OK = 0, - NM_ROLLBACK_RESULT_ERR_NO_DEVICE = 1, - NM_ROLLBACK_RESULT_ERR_DEVICE_UNMANAGED = 2, - NM_ROLLBACK_RESULT_ERR_FAILED = 3, +typedef enum /*< skip >*/ { + NM_ROLLBACK_RESULT_OK = 0, + NM_ROLLBACK_RESULT_ERR_NO_DEVICE = 1, + NM_ROLLBACK_RESULT_ERR_DEVICE_UNMANAGED = 2, + NM_ROLLBACK_RESULT_ERR_FAILED = 3, } NMRollbackResult; /** @@ -1013,12 +1013,12 @@ typedef enum { /*< skip >*/ * * Since: 1.12 **/ -typedef enum { /*< flags >*/ - NM_SETTINGS_CONNECTION_FLAG_NONE = 0, - NM_SETTINGS_CONNECTION_FLAG_UNSAVED = 0x01, - NM_SETTINGS_CONNECTION_FLAG_NM_GENERATED = 0x02, - NM_SETTINGS_CONNECTION_FLAG_VOLATILE = 0x04, - NM_SETTINGS_CONNECTION_FLAG_EXTERNAL = 0x08, +typedef enum /*< flags >*/ { + NM_SETTINGS_CONNECTION_FLAG_NONE = 0, + NM_SETTINGS_CONNECTION_FLAG_UNSAVED = 0x01, + NM_SETTINGS_CONNECTION_FLAG_NM_GENERATED = 0x02, + NM_SETTINGS_CONNECTION_FLAG_VOLATILE = 0x04, + NM_SETTINGS_CONNECTION_FLAG_EXTERNAL = 0x08, } NMSettingsConnectionFlags; /** @@ -1042,17 +1042,17 @@ typedef enum { /*< flags >*/ * * Since: 1.10 **/ -typedef enum { /*< flags >*/ - NM_ACTIVATION_STATE_FLAG_NONE = 0, +typedef enum /*< flags >*/ { + NM_ACTIVATION_STATE_FLAG_NONE = 0, - NM_ACTIVATION_STATE_FLAG_IS_MASTER = 0x1, - NM_ACTIVATION_STATE_FLAG_IS_SLAVE = 0x2, - NM_ACTIVATION_STATE_FLAG_LAYER2_READY = 0x4, - NM_ACTIVATION_STATE_FLAG_IP4_READY = 0x8, - NM_ACTIVATION_STATE_FLAG_IP6_READY = 0x10, - NM_ACTIVATION_STATE_FLAG_MASTER_HAS_SLAVES = 0x20, - NM_ACTIVATION_STATE_FLAG_LIFETIME_BOUND_TO_PROFILE_VISIBILITY = 0x40, - NM_ACTIVATION_STATE_FLAG_EXTERNAL = 0x80, + NM_ACTIVATION_STATE_FLAG_IS_MASTER = 0x1, + NM_ACTIVATION_STATE_FLAG_IS_SLAVE = 0x2, + NM_ACTIVATION_STATE_FLAG_LAYER2_READY = 0x4, + NM_ACTIVATION_STATE_FLAG_IP4_READY = 0x8, + NM_ACTIVATION_STATE_FLAG_IP6_READY = 0x10, + NM_ACTIVATION_STATE_FLAG_MASTER_HAS_SLAVES = 0x20, + NM_ACTIVATION_STATE_FLAG_LIFETIME_BOUND_TO_PROFILE_VISIBILITY = 0x40, + NM_ACTIVATION_STATE_FLAG_EXTERNAL = 0x80, } NMActivationStateFlags; /** @@ -1069,11 +1069,11 @@ typedef enum { /*< flags >*/ * * Since: 1.20 */ -typedef enum { /*< flags >*/ - NM_SETTINGS_ADD_CONNECTION2_FLAG_NONE = 0, - NM_SETTINGS_ADD_CONNECTION2_FLAG_TO_DISK = 0x1, - NM_SETTINGS_ADD_CONNECTION2_FLAG_IN_MEMORY = 0x2, - NM_SETTINGS_ADD_CONNECTION2_FLAG_BLOCK_AUTOCONNECT = 0x20, +typedef enum /*< flags >*/ { + NM_SETTINGS_ADD_CONNECTION2_FLAG_NONE = 0, + NM_SETTINGS_ADD_CONNECTION2_FLAG_TO_DISK = 0x1, + NM_SETTINGS_ADD_CONNECTION2_FLAG_IN_MEMORY = 0x2, + NM_SETTINGS_ADD_CONNECTION2_FLAG_BLOCK_AUTOCONNECT = 0x20, } NMSettingsAddConnection2Flags; /** @@ -1125,15 +1125,15 @@ typedef enum { /*< flags >*/ * * Since: 1.12 */ -typedef enum { /*< flags >*/ - NM_SETTINGS_UPDATE2_FLAG_NONE = 0, - NM_SETTINGS_UPDATE2_FLAG_TO_DISK = 0x1, - NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY = 0x2, - NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY_DETACHED = 0x4, - NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY_ONLY = 0x8, - NM_SETTINGS_UPDATE2_FLAG_VOLATILE = 0x10, - NM_SETTINGS_UPDATE2_FLAG_BLOCK_AUTOCONNECT = 0x20, - NM_SETTINGS_UPDATE2_FLAG_NO_REAPPLY = 0x40, +typedef enum /*< flags >*/ { + NM_SETTINGS_UPDATE2_FLAG_NONE = 0, + NM_SETTINGS_UPDATE2_FLAG_TO_DISK = 0x1, + NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY = 0x2, + NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY_DETACHED = 0x4, + NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY_ONLY = 0x8, + NM_SETTINGS_UPDATE2_FLAG_VOLATILE = 0x10, + NM_SETTINGS_UPDATE2_FLAG_BLOCK_AUTOCONNECT = 0x20, + NM_SETTINGS_UPDATE2_FLAG_NO_REAPPLY = 0x40, } NMSettingsUpdate2Flags; /** @@ -1172,12 +1172,12 @@ typedef enum { * * Since: 1.22 */ -typedef enum { /*< flags >*/ - NM_MANAGER_RELOAD_FLAG_NONE = 0, /*< skip >*/ - NM_MANAGER_RELOAD_FLAG_CONF = 0x1, - NM_MANAGER_RELOAD_FLAG_DNS_RC = 0x2, - NM_MANAGER_RELOAD_FLAG_DNS_FULL = 0x4, - NM_MANAGER_RELOAD_FLAG_ALL = 0x7, /*< skip >*/ +typedef enum /*< flags >*/ { + NM_MANAGER_RELOAD_FLAG_NONE = 0, /*< skip >*/ + NM_MANAGER_RELOAD_FLAG_CONF = 0x1, + NM_MANAGER_RELOAD_FLAG_DNS_RC = 0x2, + NM_MANAGER_RELOAD_FLAG_DNS_FULL = 0x4, + NM_MANAGER_RELOAD_FLAG_ALL = 0x7, /*< skip >*/ } NMManagerReloadFlags; /** @@ -1199,15 +1199,15 @@ typedef enum { /*< flags >*/ * * Since: 1.22 */ -typedef enum { /*< flags >*/ - /* kernel flags */ - NM_DEVICE_INTERFACE_FLAG_NONE = 0, /*< skip >*/ - NM_DEVICE_INTERFACE_FLAG_UP = 0x1, - NM_DEVICE_INTERFACE_FLAG_LOWER_UP = 0x2, - NM_DEVICE_INTERFACE_FLAG_PROMISC = 0x4, - /* NM-specific flags */ - NM_DEVICE_INTERFACE_FLAG_CARRIER = 0x10000, - NM_DEVICE_INTERFACE_FLAG_LLDP_CLIENT_ENABLED = 0x20000, +typedef enum /*< flags >*/ { + /* kernel flags */ + NM_DEVICE_INTERFACE_FLAG_NONE = 0, /*< skip >*/ + NM_DEVICE_INTERFACE_FLAG_UP = 0x1, + NM_DEVICE_INTERFACE_FLAG_LOWER_UP = 0x2, + NM_DEVICE_INTERFACE_FLAG_PROMISC = 0x4, + /* NM-specific flags */ + NM_DEVICE_INTERFACE_FLAG_CARRIER = 0x10000, + NM_DEVICE_INTERFACE_FLAG_LLDP_CLIENT_ENABLED = 0x20000, } NMDeviceInterfaceFlags; /** diff --git a/src/libnm-core-public/nm-keyfile.h b/src/libnm-core-public/nm-keyfile.h index 8f8b1f1b5f..80fd0043b4 100644 --- a/src/libnm-core-public/nm-keyfile.h +++ b/src/libnm-core-public/nm-keyfile.h @@ -21,8 +21,8 @@ G_BEGIN_DECLS * * Since: 1.30 */ -typedef enum { /*< flags >*/ - NM_KEYFILE_HANDLER_FLAGS_NONE = 0, +typedef enum /*< flags >*/ { + NM_KEYFILE_HANDLER_FLAGS_NONE = 0, } NMKeyfileHandlerFlags; /** diff --git a/src/libnm-core-public/nm-setting-8021x.h b/src/libnm-core-public/nm-setting-8021x.h index 2bd089dacf..93c78fa374 100644 --- a/src/libnm-core-public/nm-setting-8021x.h +++ b/src/libnm-core-public/nm-setting-8021x.h @@ -75,13 +75,13 @@ typedef enum { /*< underscore_name=nm_setting_802_1x_ck_scheme >*/ * * Since: 1.8 */ -typedef enum { /*< flags, underscore_name=nm_setting_802_1x_auth_flags >*/ - NM_SETTING_802_1X_AUTH_FLAGS_NONE = 0, - NM_SETTING_802_1X_AUTH_FLAGS_TLS_1_0_DISABLE = 0x1, - NM_SETTING_802_1X_AUTH_FLAGS_TLS_1_1_DISABLE = 0x2, - NM_SETTING_802_1X_AUTH_FLAGS_TLS_1_2_DISABLE = 0x4, +typedef enum /*< underscore_name=nm_setting_802_1x_auth_flags, flags >*/ { + NM_SETTING_802_1X_AUTH_FLAGS_NONE = 0, + NM_SETTING_802_1X_AUTH_FLAGS_TLS_1_0_DISABLE = 0x1, + NM_SETTING_802_1X_AUTH_FLAGS_TLS_1_1_DISABLE = 0x2, + NM_SETTING_802_1X_AUTH_FLAGS_TLS_1_2_DISABLE = 0x4, - NM_SETTING_802_1X_AUTH_FLAGS_ALL = 0x7, + NM_SETTING_802_1X_AUTH_FLAGS_ALL = 0x7, } NMSetting8021xAuthFlags; #define NM_TYPE_SETTING_802_1X (nm_setting_802_1x_get_type()) diff --git a/src/libnm-core-public/nm-setting-dcb.h b/src/libnm-core-public/nm-setting-dcb.h index ba702bd708..2567609033 100644 --- a/src/libnm-core-public/nm-setting-dcb.h +++ b/src/libnm-core-public/nm-setting-dcb.h @@ -35,11 +35,11 @@ G_BEGIN_DECLS * * DCB feature flags. **/ -typedef enum { /*< flags >*/ - NM_SETTING_DCB_FLAG_NONE = 0x00000000, - NM_SETTING_DCB_FLAG_ENABLE = 0x00000001, - NM_SETTING_DCB_FLAG_ADVERTISE = 0x00000002, - NM_SETTING_DCB_FLAG_WILLING = 0x00000004 +typedef enum /*< flags >*/ { + NM_SETTING_DCB_FLAG_NONE = 0x00000000, + NM_SETTING_DCB_FLAG_ENABLE = 0x00000001, + NM_SETTING_DCB_FLAG_ADVERTISE = 0x00000002, + NM_SETTING_DCB_FLAG_WILLING = 0x00000004 } NMSettingDcbFlags; /** diff --git a/src/libnm-core-public/nm-setting-ip-config.h b/src/libnm-core-public/nm-setting-ip-config.h index 6a19bdb39f..257a687a1c 100644 --- a/src/libnm-core-public/nm-setting-ip-config.h +++ b/src/libnm-core-public/nm-setting-ip-config.h @@ -31,9 +31,9 @@ G_BEGIN_DECLS * * Since: 1.22 */ -typedef enum { /*< flags >*/ - NM_IP_ADDRESS_CMP_FLAGS_NONE = 0, - NM_IP_ADDRESS_CMP_FLAGS_WITH_ATTRS = 0x1, +typedef enum /*< flags >*/ { + NM_IP_ADDRESS_CMP_FLAGS_NONE = 0, + NM_IP_ADDRESS_CMP_FLAGS_WITH_ATTRS = 0x1, } NMIPAddressCmpFlags; typedef struct NMIPAddress NMIPAddress; @@ -86,9 +86,9 @@ void nm_ip_route_ref(NMIPRoute *route); void nm_ip_route_unref(NMIPRoute *route); gboolean nm_ip_route_equal(NMIPRoute *route, NMIPRoute *other); -enum { /*< flags >*/ - NM_IP_ROUTE_EQUAL_CMP_FLAGS_NONE = 0, - NM_IP_ROUTE_EQUAL_CMP_FLAGS_WITH_ATTRS = 0x1, +enum /*< flags >*/ { + NM_IP_ROUTE_EQUAL_CMP_FLAGS_NONE = 0, + NM_IP_ROUTE_EQUAL_CMP_FLAGS_WITH_ATTRS = 0x1, }; NM_AVAILABLE_IN_1_10 @@ -277,12 +277,12 @@ gboolean nm_ip_routing_rule_validate(const NMIPRoutingRule *self, GError **error * * Since: 1.18 */ -typedef enum { /*< flags >*/ - NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE = 0, +typedef enum /*< flags >*/ { + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE = 0, - NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET = 0x1, - NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6 = 0x2, - NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE = 0x4, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET = 0x1, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6 = 0x2, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE = 0x4, } NMIPRoutingRuleAsStringFlags; NM_AVAILABLE_IN_1_18 @@ -386,14 +386,14 @@ typedef struct _NMSettingIPConfigClass NMSettingIPConfigClass; * * Since: 1.22 */ -typedef enum { /*< flags >*/ - NM_DHCP_HOSTNAME_FLAG_NONE = 0x0, +typedef enum /*< flags >*/ { + NM_DHCP_HOSTNAME_FLAG_NONE = 0x0, - NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE = 0x1, - NM_DHCP_HOSTNAME_FLAG_FQDN_ENCODED = 0x2, - NM_DHCP_HOSTNAME_FLAG_FQDN_NO_UPDATE = 0x4, + NM_DHCP_HOSTNAME_FLAG_FQDN_SERV_UPDATE = 0x1, + NM_DHCP_HOSTNAME_FLAG_FQDN_ENCODED = 0x2, + NM_DHCP_HOSTNAME_FLAG_FQDN_NO_UPDATE = 0x4, - NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS = 0x8, + NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS = 0x8, } NMDhcpHostnameFlags; diff --git a/src/libnm-core-public/nm-setting-ip-tunnel.h b/src/libnm-core-public/nm-setting-ip-tunnel.h index 4710411cc4..3492009974 100644 --- a/src/libnm-core-public/nm-setting-ip-tunnel.h +++ b/src/libnm-core-public/nm-setting-ip-tunnel.h @@ -60,14 +60,14 @@ typedef struct _NMSettingIPTunnelClass NMSettingIPTunnelClass; * * Since: 1.12 */ -typedef enum { /*< flags, prefix=NM_IP_TUNNEL_FLAG >*/ - NM_IP_TUNNEL_FLAG_NONE = 0x0, - 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, +typedef enum /*< prefix=NM_IP_TUNNEL_FLAG, flags >*/ { + NM_IP_TUNNEL_FLAG_NONE = 0x0, + 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, } NMIPTunnelFlags; NM_AVAILABLE_IN_1_2 diff --git a/src/libnm-core-public/nm-setting-team.h b/src/libnm-core-public/nm-setting-team.h index 339830d3e3..63df408011 100644 --- a/src/libnm-core-public/nm-setting-team.h +++ b/src/libnm-core-public/nm-setting-team.h @@ -26,11 +26,11 @@ G_BEGIN_DECLS * @NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_SEND_ALWAYS: the arp_ping link watcher option * 'send_always' is enabled (set to true). */ -typedef enum { /*< flags >*/ - NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_NONE = 0, /*< skip >*/ - NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_VALIDATE_ACTIVE = 0x2, - NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_VALIDATE_INACTIVE = 0x4, - NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_SEND_ALWAYS = 0x8, +typedef enum /*< flags >*/ { + NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_NONE = 0, /*< skip >*/ + NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_VALIDATE_ACTIVE = 0x2, + NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_VALIDATE_INACTIVE = 0x4, + NM_TEAM_LINK_WATCHER_ARP_PING_FLAG_SEND_ALWAYS = 0x8, } NMTeamLinkWatcherArpPingFlags; #define NM_TEAM_LINK_WATCHER_ETHTOOL "ethtool" diff --git a/src/libnm-core-public/nm-setting-vlan.h b/src/libnm-core-public/nm-setting-vlan.h index 10a95da056..b68a290aad 100644 --- a/src/libnm-core-public/nm-setting-vlan.h +++ b/src/libnm-core-public/nm-setting-vlan.h @@ -63,17 +63,17 @@ typedef enum { * * #NMVlanFlags values control the behavior of the VLAN interface. **/ -typedef enum { /*< flags >*/ +typedef enum /*< flags >*/ { - NM_VLAN_FLAG_REORDER_HEADERS = 0x1, - NM_VLAN_FLAG_GVRP = 0x2, - NM_VLAN_FLAG_LOOSE_BINDING = 0x4, - NM_VLAN_FLAG_MVRP = 0x8, + NM_VLAN_FLAG_REORDER_HEADERS = 0x1, + NM_VLAN_FLAG_GVRP = 0x2, + NM_VLAN_FLAG_LOOSE_BINDING = 0x4, + NM_VLAN_FLAG_MVRP = 0x8, - /* NOTE: if adding flags update nm-setting-vlan.c::verify() */ + /* NOTE: if adding flags update nm-setting-vlan.c::verify() */ - /* NOTE: these flags must correspond to the value from the kernel - * header files. */ + /* NOTE: these flags must correspond to the value from the kernel + * header files. */ } NMVlanFlags; #define NM_VLAN_FLAGS_ALL \ diff --git a/src/libnm-core-public/nm-setting-wired.h b/src/libnm-core-public/nm-setting-wired.h index ebe0d00a05..5ad3b7f2c9 100644 --- a/src/libnm-core-public/nm-setting-wired.h +++ b/src/libnm-core-public/nm-setting-wired.h @@ -49,20 +49,20 @@ G_BEGIN_DECLS * * Since: 1.2 */ -typedef enum { /*< flags >*/ - NM_SETTING_WIRED_WAKE_ON_LAN_NONE = 0, /*< skip >*/ - 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, +typedef enum /*< flags >*/ { + NM_SETTING_WIRED_WAKE_ON_LAN_NONE = 0, /*< skip >*/ + 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, /*< skip >*/ + NM_SETTING_WIRED_WAKE_ON_LAN_ALL = 0x7E, /*< skip >*/ - 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, /*< skip >*/ + 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, /*< skip >*/ } NMSettingWiredWakeOnLan; #define NM_SETTING_WIRED_PORT "port" diff --git a/src/libnm-core-public/nm-setting-wireless-security.h b/src/libnm-core-public/nm-setting-wireless-security.h index c9aec27da9..e564204bb4 100644 --- a/src/libnm-core-public/nm-setting-wireless-security.h +++ b/src/libnm-core-public/nm-setting-wireless-security.h @@ -99,12 +99,12 @@ typedef enum { * * Since: 1.10 **/ -typedef enum { /*< flags >*/ - NM_SETTING_WIRELESS_SECURITY_WPS_METHOD_DEFAULT = 0x00000000, - NM_SETTING_WIRELESS_SECURITY_WPS_METHOD_DISABLED = 0x00000001, - NM_SETTING_WIRELESS_SECURITY_WPS_METHOD_AUTO = 0x00000002, - NM_SETTING_WIRELESS_SECURITY_WPS_METHOD_PBC = 0x00000004, - NM_SETTING_WIRELESS_SECURITY_WPS_METHOD_PIN = 0x00000008, +typedef enum /*< flags >*/ { + NM_SETTING_WIRELESS_SECURITY_WPS_METHOD_DEFAULT = 0x00000000, + NM_SETTING_WIRELESS_SECURITY_WPS_METHOD_DISABLED = 0x00000001, + NM_SETTING_WIRELESS_SECURITY_WPS_METHOD_AUTO = 0x00000002, + NM_SETTING_WIRELESS_SECURITY_WPS_METHOD_PBC = 0x00000004, + NM_SETTING_WIRELESS_SECURITY_WPS_METHOD_PIN = 0x00000008, } NMSettingWirelessSecurityWpsMethod; /** diff --git a/src/libnm-core-public/nm-setting-wireless.h b/src/libnm-core-public/nm-setting-wireless.h index 0d4872fb61..1f94060cde 100644 --- a/src/libnm-core-public/nm-setting-wireless.h +++ b/src/libnm-core-public/nm-setting-wireless.h @@ -53,7 +53,7 @@ G_BEGIN_DECLS * Since: 1.12 */ /* clang-format off */ -typedef enum { /*< flags >*/ +typedef enum /*< flags >*/ { NM_SETTING_WIRELESS_WAKE_ON_WLAN_NONE = 0, /*< skip >*/ NM_SETTING_WIRELESS_WAKE_ON_WLAN_ANY = 0x2, NM_SETTING_WIRELESS_WAKE_ON_WLAN_DISCONNECT = 0x4, diff --git a/src/libnm-core-public/nm-setting.h b/src/libnm-core-public/nm-setting.h index ddf648bca2..ee2076c362 100644 --- a/src/libnm-core-public/nm-setting.h +++ b/src/libnm-core-public/nm-setting.h @@ -57,13 +57,13 @@ G_BEGIN_DECLS * is to be stored and/or requested when it is needed. * **/ -typedef enum { /*< flags >*/ - NM_SETTING_SECRET_FLAG_NONE = 0x00000000, - NM_SETTING_SECRET_FLAG_AGENT_OWNED = 0x00000001, - NM_SETTING_SECRET_FLAG_NOT_SAVED = 0x00000002, - NM_SETTING_SECRET_FLAG_NOT_REQUIRED = 0x00000004 +typedef enum /*< flags >*/ { + NM_SETTING_SECRET_FLAG_NONE = 0x00000000, + NM_SETTING_SECRET_FLAG_AGENT_OWNED = 0x00000001, + NM_SETTING_SECRET_FLAG_NOT_SAVED = 0x00000002, + NM_SETTING_SECRET_FLAG_NOT_REQUIRED = 0x00000004 - /* NOTE: if adding flags, update nm-core-internal.h as well */ + /* NOTE: if adding flags, update nm-core-internal.h as well */ } NMSettingSecretFlags; /** diff --git a/src/libnmc-setting/nm-meta-setting-base-impl.h b/src/libnmc-setting/nm-meta-setting-base-impl.h index ea4f85ff1b..b1f1263693 100644 --- a/src/libnmc-setting/nm-meta-setting-base-impl.h +++ b/src/libnmc-setting/nm-meta-setting-base-impl.h @@ -38,15 +38,15 @@ * * 10: NMSettingUser */ -typedef enum { /*< skip >*/ - NM_SETTING_PRIORITY_INVALID = 0, - NM_SETTING_PRIORITY_CONNECTION = 1, - NM_SETTING_PRIORITY_HW_BASE = 2, - NM_SETTING_PRIORITY_HW_NON_BASE = 3, - NM_SETTING_PRIORITY_HW_AUX = 4, - NM_SETTING_PRIORITY_AUX = 5, - NM_SETTING_PRIORITY_IP = 6, - NM_SETTING_PRIORITY_USER = 10, +typedef enum /*< skip >*/ { + NM_SETTING_PRIORITY_INVALID = 0, + NM_SETTING_PRIORITY_CONNECTION = 1, + NM_SETTING_PRIORITY_HW_BASE = 2, + NM_SETTING_PRIORITY_HW_NON_BASE = 3, + NM_SETTING_PRIORITY_HW_AUX = 4, + NM_SETTING_PRIORITY_AUX = 5, + NM_SETTING_PRIORITY_IP = 6, + NM_SETTING_PRIORITY_USER = 10, } NMSettingPriority; /*****************************************************************************/ From a56b7ab75184467fff08996a2c9219fd75a23afd Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 12:39:30 +0100 Subject: [PATCH 005/118] libnm: drop unnecessary /*clang-format off*/ The problem was that glib-mkenums requires all enum values on a separate line. And clang-format would put all on the same line, unless the last value has a trailing comma. Which is the better solution here. --- src/libnm-core-public/nm-setting-vlan.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libnm-core-public/nm-setting-vlan.h b/src/libnm-core-public/nm-setting-vlan.h index b68a290aad..a99d725613 100644 --- a/src/libnm-core-public/nm-setting-vlan.h +++ b/src/libnm-core-public/nm-setting-vlan.h @@ -42,12 +42,10 @@ typedef struct _NMSettingVlanClass NMSettingVlanClass; * A selector for traffic priority maps; these map Linux SKB priorities * to 802.1p priorities used in VLANs. **/ -/* clang-format off */ typedef enum { NM_VLAN_INGRESS_MAP, - NM_VLAN_EGRESS_MAP + NM_VLAN_EGRESS_MAP, } NMVlanPriorityMap; -/* clang-format on */ /** * NMVlanFlags: From 02106df3be75ff0f94ac1cc4222259b99e008fc5 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 8 Feb 2022 13:58:32 +0100 Subject: [PATCH 006/118] device: fix required-timeout evaluation Once the required-timeout expires, we should evaluate whether the *other* address family is ready. Fixes: 58287cbcc0c8 ('core: rework IP configuration in NetworkManager using layer 3 configuration') Fixes-test: @dracut_NM_NFS_root_nfs_ip_dhcp_dhcp6_slow_ip6 https://bugzilla.redhat.com/show_bug.cgi?id=2051904 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1090 --- src/core/devices/nm-device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index 6dda543193..bdfb70a5ae 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -2943,7 +2943,7 @@ _dev_ip_state_req_timeout_cb_x(NMDevice *self, int addr_family) _LOGD_ip(addr_family, "required-timeout: expired"); nm_clear_g_source_inst(&priv->ip_data_x[NM_IS_IPv4(addr_family)].req_timeout_source); - _dev_ip_state_check(self, addr_family); + _dev_ip_state_check(self, nm_utils_addr_family_other(addr_family)); return G_SOURCE_CONTINUE; } From 165224b485cfc5df07ea7b1a9a6be78e24b530f8 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 19:42:26 +0100 Subject: [PATCH 007/118] core/rfkill: move rfkill_type property to NMDeviceClass GObject Properties are flexible and powerful. In practice, NMDevicePrivate.rfkill_type was only set once via the construct-only property NM_DEVICE_RFKILL_TYPE. Which in turn was always set to a well-known value, only depending on the device type. We don't need this flexibility. The rfkill-type only depends on the device type and doesn't change. Replace the property by a field in NMDeviceClass. For one, construct properties have an overhead, that the property setter is called whenever we construct a NMDevice. But the real reason for this change, is that a property give a notion as this could change during the lifetime of a NMDevice (which it in fact did not, being construct-only). Or that the type depends on something more complex, when instead it only depends on the device type. A non-mutated class property is simpler, because it's clear that it does not depend on the device instance, only on the type/class. Also, `git grep -w rfkill_type` now nicely shows the (few) references to this variable and its easier to understand. --- src/core/devices/nm-device.c | 27 +++++++--------------- src/core/devices/nm-device.h | 4 ++-- src/core/devices/wifi/nm-device-iwd-p2p.c | 4 ++-- src/core/devices/wifi/nm-device-iwd.c | 4 ++-- src/core/devices/wifi/nm-device-wifi-p2p.c | 4 ++-- src/core/devices/wifi/nm-device-wifi.c | 4 ++-- src/core/devices/wwan/nm-device-modem.c | 4 ++-- 7 files changed, 20 insertions(+), 31 deletions(-) diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index bdfb70a5ae..b23788a3ea 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -361,7 +361,6 @@ NM_GOBJECT_PROPERTIES_DEFINE(NMDevice, PROP_FIRMWARE_MISSING, PROP_NM_PLUGIN_MISSING, PROP_TYPE_DESC, - PROP_RFKILL_TYPE, PROP_IFINDEX, PROP_AVAILABLE_CONNECTIONS, PROP_PHYSICAL_PORT_ID, @@ -473,7 +472,6 @@ typedef struct _NMDevicePrivate { char *driver; char *driver_version; char *firmware_version; - RfKillType rfkill_type; bool firmware_missing : 1; bool nm_plugin_missing : 1; bool @@ -5152,9 +5150,14 @@ nm_device_get_applied_setting(NMDevice *self, GType setting_type) RfKillType nm_device_get_rfkill_type(NMDevice *self) { + RfKillType t; + g_return_val_if_fail(NM_IS_DEVICE(self), FALSE); - return NM_DEVICE_GET_PRIVATE(self)->rfkill_type; + t = NM_DEVICE_GET_CLASS(self)->rfkill_type; + + nm_assert(NM_IN_SET(t, RFKILL_TYPE_UNKNOWN, RFKILL_TYPE_WLAN, RFKILL_TYPE_WWAN)); + return t; } static const char * @@ -16987,9 +16990,6 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) case PROP_TYPE_DESC: g_value_set_string(value, priv->type_desc); break; - case PROP_RFKILL_TYPE: - g_value_set_uint(value, priv->rfkill_type); - break; case PROP_AVAILABLE_CONNECTIONS: nm_dbus_utils_g_value_set_object_path_from_hash(value, priv->available_connections, TRUE); break; @@ -17125,10 +17125,6 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps /* construct-only */ priv->type_desc = g_value_dup_string(value); break; - case PROP_RFKILL_TYPE: - /* construct-only */ - priv->rfkill_type = g_value_get_uint(value); - break; case PROP_PERM_HW_ADDRESS: /* construct-only */ priv->hw_addr_perm = g_value_dup_string(value); @@ -17178,7 +17174,6 @@ nm_device_init(NMDevice *self) priv->capabilities = NM_DEVICE_CAP_NM_SUPPORTED; priv->state = NM_DEVICE_STATE_UNMANAGED; priv->state_reason = NM_DEVICE_STATE_REASON_NONE; - priv->rfkill_type = RFKILL_TYPE_UNKNOWN; priv->unmanaged_flags = NM_UNMANAGED_PLATFORM_INIT; priv->unmanaged_mask = priv->unmanaged_flags; priv->available_connections = g_hash_table_new_full(nm_direct_hash, NULL, g_object_unref, NULL); @@ -17581,6 +17576,8 @@ nm_device_class_init(NMDeviceClass *klass) klass->reapply_connection = reapply_connection; klass->set_platform_mtu = set_platform_mtu; + klass->rfkill_type = RFKILL_TYPE_UNKNOWN; + obj_properties[PROP_UDI] = g_param_spec_string(NM_DEVICE_UDI, "", @@ -17738,14 +17735,6 @@ nm_device_class_init(NMDeviceClass *klass) "", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); - obj_properties[PROP_RFKILL_TYPE] = - g_param_spec_uint(NM_DEVICE_RFKILL_TYPE, - "", - "", - RFKILL_TYPE_WLAN, - RFKILL_TYPE_MAX, - RFKILL_TYPE_UNKNOWN, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); obj_properties[PROP_IFINDEX] = g_param_spec_int(NM_DEVICE_IFINDEX, "", "", diff --git a/src/core/devices/nm-device.h b/src/core/devices/nm-device.h index 4c3abc05f7..7780860d6f 100644 --- a/src/core/devices/nm-device.h +++ b/src/core/devices/nm-device.h @@ -65,7 +65,6 @@ #define NM_DEVICE_SLAVES "slaves" /* partially internal */ #define NM_DEVICE_TYPE_DESC "type-desc" /* Internal only */ -#define NM_DEVICE_RFKILL_TYPE "rfkill-type" /* Internal only */ #define NM_DEVICE_IFINDEX "ifindex" /* Internal only */ #define NM_DEVICE_MASTER "master" /* Internal only */ #define NM_DEVICE_HAS_PENDING_ACTION "has-pending-action" /* Internal only */ @@ -208,6 +207,8 @@ typedef struct _NMDeviceClass { bool can_reapply_change_ovs_external_ids : 1; + RfKillType rfkill_type : 4; + void (*state_changed)(NMDevice *device, NMDeviceState new_state, NMDeviceState old_state, @@ -409,7 +410,6 @@ typedef struct _NMDeviceClass { gboolean (*set_platform_mtu)(NMDevice *self, guint32 mtu); const char *(*get_dhcp_anycast_address)(NMDevice *self); - } NMDeviceClass; GType nm_device_get_type(void); diff --git a/src/core/devices/wifi/nm-device-iwd-p2p.c b/src/core/devices/wifi/nm-device-iwd-p2p.c index 01774b12f7..b0f7e39280 100644 --- a/src/core/devices/wifi/nm-device-iwd-p2p.c +++ b/src/core/devices/wifi/nm-device-iwd-p2p.c @@ -1196,8 +1196,6 @@ nm_device_iwd_p2p_new(GDBusObject *dbus_obj) NM_DEVICE_TYPE_WIFI_P2P, NM_DEVICE_LINK_TYPE, NM_LINK_TYPE_WIFI, - NM_DEVICE_RFKILL_TYPE, - RFKILL_TYPE_WLAN, NULL); if (!self || !nm_device_iwd_p2p_set_dbus_obj(self, dbus_obj)) @@ -1252,6 +1250,8 @@ nm_device_iwd_p2p_class_init(NMDeviceIwdP2PClass *klass) device_class->state_changed = device_state_changed; + device_class->rfkill_type = RFKILL_TYPE_WLAN; + obj_properties[PROP_PEERS] = g_param_spec_boxed(NM_DEVICE_IWD_P2P_PEERS, "", "", diff --git a/src/core/devices/wifi/nm-device-iwd.c b/src/core/devices/wifi/nm-device-iwd.c index 7543d9daf8..a92f92642b 100644 --- a/src/core/devices/wifi/nm-device-iwd.c +++ b/src/core/devices/wifi/nm-device-iwd.c @@ -3426,8 +3426,6 @@ nm_device_iwd_new(const char *iface) NM_DEVICE_TYPE_WIFI, NM_DEVICE_LINK_TYPE, NM_LINK_TYPE_WIFI, - NM_DEVICE_RFKILL_TYPE, - RFKILL_TYPE_WLAN, NULL); } @@ -3490,6 +3488,8 @@ nm_device_iwd_class_init(NMDeviceIwdClass *klass) device_class->state_changed = device_state_changed; + device_class->rfkill_type = RFKILL_TYPE_WLAN; + obj_properties[PROP_MODE] = g_param_spec_uint(NM_DEVICE_IWD_MODE, "", "", diff --git a/src/core/devices/wifi/nm-device-wifi-p2p.c b/src/core/devices/wifi/nm-device-wifi-p2p.c index dfbf89785c..326729fadf 100644 --- a/src/core/devices/wifi/nm-device-wifi-p2p.c +++ b/src/core/devices/wifi/nm-device-wifi-p2p.c @@ -1229,8 +1229,6 @@ nm_device_wifi_p2p_new(const char *iface) NM_DEVICE_TYPE_WIFI_P2P, NM_DEVICE_LINK_TYPE, NM_LINK_TYPE_WIFI, - NM_DEVICE_RFKILL_TYPE, - RFKILL_TYPE_WLAN, NULL); } @@ -1293,6 +1291,8 @@ nm_device_wifi_p2p_class_init(NMDeviceWifiP2PClass *klass) device_class->state_changed = device_state_changed; + device_class->rfkill_type = RFKILL_TYPE_WLAN; + obj_properties[PROP_PEERS] = g_param_spec_boxed(NM_DEVICE_WIFI_P2P_PEERS, "", "", diff --git a/src/core/devices/wifi/nm-device-wifi.c b/src/core/devices/wifi/nm-device-wifi.c index 010cee0834..5d1099ada7 100644 --- a/src/core/devices/wifi/nm-device-wifi.c +++ b/src/core/devices/wifi/nm-device-wifi.c @@ -3663,8 +3663,6 @@ nm_device_wifi_new(const char *iface, _NMDeviceWifiCapabilities capabilities) NM_DEVICE_TYPE_WIFI, NM_DEVICE_LINK_TYPE, NM_LINK_TYPE_WIFI, - NM_DEVICE_RFKILL_TYPE, - RFKILL_TYPE_WLAN, NM_DEVICE_WIFI_CAPABILITIES, (guint) capabilities, NULL); @@ -3756,6 +3754,8 @@ nm_device_wifi_class_init(NMDeviceWifiClass *klass) device_class->state_changed = device_state_changed; + device_class->rfkill_type = RFKILL_TYPE_WLAN; + obj_properties[PROP_MODE] = g_param_spec_uint(NM_DEVICE_WIFI_MODE, "", "", diff --git a/src/core/devices/wwan/nm-device-modem.c b/src/core/devices/wwan/nm-device-modem.c index ef802a44f2..6ac4e6e359 100644 --- a/src/core/devices/wwan/nm-device-modem.c +++ b/src/core/devices/wwan/nm-device-modem.c @@ -757,8 +757,6 @@ nm_device_modem_new(NMModem *modem) "Broadband", NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_MODEM, - NM_DEVICE_RFKILL_TYPE, - RFKILL_TYPE_WWAN, NM_DEVICE_MODEM_MODEM, modem, NM_DEVICE_MODEM_CAPABILITIES, @@ -840,6 +838,8 @@ nm_device_modem_class_init(NMDeviceModemClass *klass) device_class->state_changed = device_state_changed; + device_class->rfkill_type = RFKILL_TYPE_WWAN; + obj_properties[PROP_MODEM] = g_param_spec_object(NM_DEVICE_MODEM_MODEM, "", From 99ceb205e97a5574d29c70ff322725c71926fc72 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 20:07:18 +0100 Subject: [PATCH 008/118] core/rfkill: cleanup rfkill handling in NMManager - use "const RadioState" where possible - use "bool" bitfields in RadioState (boolean flags in structs should be `bool` types for consistency) and order fields by alignment. - break lines for variable declaration in manager_rfkill_update_one_type(). - return (and nm_assert()) from update_rstate_from_rfkill(). By not adding a default case, compiler would warn if we forget to handle an enum value. We can easily do that, by just returning, and let the "default" case be handled by nm_assert_not_reached() -- which unlike g_warn_if_reached() compiles to nothing in release build. - add nm_assert() that `priv->radio_states[rtype]` is not out of range. - use designated initializers for priv->radio_states[]. --- src/core/nm-manager.c | 77 ++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c index b440b22457..42fb0e3633 100644 --- a/src/core/nm-manager.c +++ b/src/core/nm-manager.c @@ -54,14 +54,14 @@ /*****************************************************************************/ typedef struct { - gboolean user_enabled; - gboolean sw_enabled; - gboolean hw_enabled; - RfKillType rtype; - NMConfigRunStatePropertyType key; const char *desc; const char *prop; const char *hw_prop; + RfKillType rtype; + NMConfigRunStatePropertyType key; + bool user_enabled : 1; + bool sw_enabled : 1; + bool hw_enabled : 1; } RadioState; typedef enum { @@ -169,7 +169,8 @@ typedef struct { NMSettings *settings; - RadioState radio_states[RFKILL_TYPE_MAX]; + RadioState radio_states[RFKILL_TYPE_MAX]; + NMVpnManager *vpn_manager; NMSleepMonitor *sleep_monitor; @@ -2280,7 +2281,7 @@ _static_hostname_changed_cb(NMHostnameManager *hostname_manager, GParamSpec *psp /*****************************************************************************/ static gboolean -radio_enabled_for_rstate(RadioState *rstate, gboolean check_changeable) +radio_enabled_for_rstate(const RadioState *rstate, gboolean check_changeable) { gboolean enabled; @@ -2295,11 +2296,13 @@ radio_enabled_for_type(NMManager *self, RfKillType rtype, gboolean check_changea { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); + nm_assert(_NM_INT_NOT_NEGATIVE(rtype) && rtype < G_N_ELEMENTS(priv->radio_states)); + return radio_enabled_for_rstate(&priv->radio_states[rtype], check_changeable); } static void -manager_update_radio_enabled(NMManager *self, RadioState *rstate, gboolean enabled) +manager_update_radio_enabled(NMManager *self, const RadioState *rstate, gboolean enabled) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); NMDevice *device; @@ -2333,26 +2336,28 @@ update_rstate_from_rfkill(NMRfkillManager *rfkill_mgr, RadioState *rstate) case RFKILL_UNBLOCKED: rstate->sw_enabled = TRUE; rstate->hw_enabled = TRUE; - break; + return; case RFKILL_SOFT_BLOCKED: rstate->sw_enabled = FALSE; rstate->hw_enabled = TRUE; - break; + return; case RFKILL_HARD_BLOCKED: rstate->sw_enabled = FALSE; rstate->hw_enabled = FALSE; - break; - default: - g_warn_if_reached(); - break; + return; } + nm_assert_not_reached(); } static void manager_rfkill_update_one_type(NMManager *self, RadioState *rstate, RfKillType rtype) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); - gboolean old_enabled, new_enabled, old_rfkilled, new_rfkilled, old_hwe; + gboolean old_enabled; + gboolean new_enabled; + gboolean old_rfkilled; + gboolean new_rfkilled; + gboolean old_hwe; old_enabled = radio_enabled_for_rstate(rstate, TRUE); old_rfkilled = rstate->hw_enabled && rstate->sw_enabled; @@ -6331,8 +6336,8 @@ do_sleep_wake(NMManager *self, gboolean sleeping_changed) * to killswitch changes during sleep. */ for (i = 0; i < RFKILL_TYPE_MAX; i++) { - RadioState *rstate = &priv->radio_states[i]; - gboolean enabled = radio_enabled_for_rstate(rstate, TRUE); + const RadioState *rstate = &priv->radio_states[i]; + gboolean enabled = radio_enabled_for_rstate(rstate, TRUE); if (rstate->desc) { _LOGD(LOGD_RFKILL, @@ -7904,7 +7909,6 @@ static void nm_manager_init(NMManager *self) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); - guint i; GFile *file; c_list_init(&priv->auth_lst_head); @@ -7918,25 +7922,24 @@ nm_manager_init(NMManager *self) priv->capabilities = g_array_new(FALSE, FALSE, sizeof(guint32)); - /* Initialize rfkill structures and states */ - memset(priv->radio_states, 0, sizeof(priv->radio_states)); - - priv->radio_states[RFKILL_TYPE_WLAN].user_enabled = TRUE; - priv->radio_states[RFKILL_TYPE_WLAN].key = NM_CONFIG_STATE_PROPERTY_WIFI_ENABLED; - priv->radio_states[RFKILL_TYPE_WLAN].prop = NM_MANAGER_WIRELESS_ENABLED; - priv->radio_states[RFKILL_TYPE_WLAN].hw_prop = NM_MANAGER_WIRELESS_HARDWARE_ENABLED; - priv->radio_states[RFKILL_TYPE_WLAN].desc = "Wi-Fi"; - priv->radio_states[RFKILL_TYPE_WLAN].rtype = RFKILL_TYPE_WLAN; - - priv->radio_states[RFKILL_TYPE_WWAN].user_enabled = TRUE; - priv->radio_states[RFKILL_TYPE_WWAN].key = NM_CONFIG_STATE_PROPERTY_WWAN_ENABLED; - priv->radio_states[RFKILL_TYPE_WWAN].prop = NM_MANAGER_WWAN_ENABLED; - priv->radio_states[RFKILL_TYPE_WWAN].hw_prop = NM_MANAGER_WWAN_HARDWARE_ENABLED; - priv->radio_states[RFKILL_TYPE_WWAN].desc = "WWAN"; - priv->radio_states[RFKILL_TYPE_WWAN].rtype = RFKILL_TYPE_WWAN; - - for (i = 0; i < RFKILL_TYPE_MAX; i++) - priv->radio_states[i].hw_enabled = TRUE; + priv->radio_states[RFKILL_TYPE_WLAN] = (RadioState){ + .user_enabled = TRUE, + .key = NM_CONFIG_STATE_PROPERTY_WIFI_ENABLED, + .prop = NM_MANAGER_WIRELESS_ENABLED, + .hw_prop = NM_MANAGER_WIRELESS_HARDWARE_ENABLED, + .desc = "Wi-Fi", + .rtype = RFKILL_TYPE_WLAN, + .hw_enabled = TRUE, + }; + priv->radio_states[RFKILL_TYPE_WWAN] = (RadioState){ + .user_enabled = TRUE, + .key = NM_CONFIG_STATE_PROPERTY_WWAN_ENABLED, + .prop = NM_MANAGER_WWAN_ENABLED, + .hw_prop = NM_MANAGER_WWAN_HARDWARE_ENABLED, + .desc = "WWAN", + .rtype = RFKILL_TYPE_WWAN, + .hw_enabled = TRUE, + }; priv->sleeping = FALSE; priv->state = NM_STATE_DISCONNECTED; From 454992ed85842f5c6ff2e15813a3319b89588976 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 20:21:34 +0100 Subject: [PATCH 009/118] core/rfkill: add "nm" prefix to RfKillState and RfKillType enums Names in header files should have an "nm" prefix. We do that pretty consistently. Fix the offenders RfKillState and RfKillType. Also, rename the RfKillState enums to follow the type name. For example, NM_RFKILL_STATE_SOFT_BLOCKED instead of RFKILL_SOFT_BLOCKED. Also, when we camel-case a typedef (NMRfKillState) we would want that the lower-case names use underscore between the words. So it should be `nm_rf_kill_state_to_string()`. But that looks awkward. So the right solution here is to also rename "RfKill" to "Rfkill". That make is consistent with the spelling of the existing `NMRfkillManager` type and the `nm-rfkill-manager.h` file. --- src/core/devices/nm-device.c | 8 +-- src/core/devices/nm-device.h | 4 +- src/core/devices/wifi/nm-device-iwd-p2p.c | 2 +- src/core/devices/wifi/nm-device-iwd.c | 2 +- src/core/devices/wifi/nm-device-wifi-p2p.c | 2 +- src/core/devices/wifi/nm-device-wifi.c | 2 +- src/core/devices/wwan/nm-device-modem.c | 2 +- src/core/nm-manager.c | 80 +++++++++++----------- src/core/nm-rfkill-manager.c | 78 ++++++++++----------- src/core/nm-rfkill-manager.h | 22 +++--- 10 files changed, 101 insertions(+), 101 deletions(-) diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index b23788a3ea..a22bd82483 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -5147,16 +5147,16 @@ nm_device_get_applied_setting(NMDevice *self, GType setting_type) return connection ? nm_connection_get_setting(connection, setting_type) : NULL; } -RfKillType +NMRfkillType nm_device_get_rfkill_type(NMDevice *self) { - RfKillType t; + NMRfkillType t; g_return_val_if_fail(NM_IS_DEVICE(self), FALSE); t = NM_DEVICE_GET_CLASS(self)->rfkill_type; - nm_assert(NM_IN_SET(t, RFKILL_TYPE_UNKNOWN, RFKILL_TYPE_WLAN, RFKILL_TYPE_WWAN)); + nm_assert(NM_IN_SET(t, NM_RFKILL_TYPE_UNKNOWN, NM_RFKILL_TYPE_WLAN, NM_RFKILL_TYPE_WWAN)); return t; } @@ -17576,7 +17576,7 @@ nm_device_class_init(NMDeviceClass *klass) klass->reapply_connection = reapply_connection; klass->set_platform_mtu = set_platform_mtu; - klass->rfkill_type = RFKILL_TYPE_UNKNOWN; + klass->rfkill_type = NM_RFKILL_TYPE_UNKNOWN; obj_properties[PROP_UDI] = g_param_spec_string(NM_DEVICE_UDI, diff --git a/src/core/devices/nm-device.h b/src/core/devices/nm-device.h index 7780860d6f..d9cfc7e621 100644 --- a/src/core/devices/nm-device.h +++ b/src/core/devices/nm-device.h @@ -207,7 +207,7 @@ typedef struct _NMDeviceClass { bool can_reapply_change_ovs_external_ids : 1; - RfKillType rfkill_type : 4; + NMRfkillType rfkill_type : 4; void (*state_changed)(NMDevice *device, NMDeviceState new_state, @@ -535,7 +535,7 @@ gboolean nm_device_get_enabled(NMDevice *device); void nm_device_set_enabled(NMDevice *device, gboolean enabled); -RfKillType nm_device_get_rfkill_type(NMDevice *device); +NMRfkillType nm_device_get_rfkill_type(NMDevice *device); /* IPv6 prefix delegation */ diff --git a/src/core/devices/wifi/nm-device-iwd-p2p.c b/src/core/devices/wifi/nm-device-iwd-p2p.c index b0f7e39280..40e38321bf 100644 --- a/src/core/devices/wifi/nm-device-iwd-p2p.c +++ b/src/core/devices/wifi/nm-device-iwd-p2p.c @@ -1250,7 +1250,7 @@ nm_device_iwd_p2p_class_init(NMDeviceIwdP2PClass *klass) device_class->state_changed = device_state_changed; - device_class->rfkill_type = RFKILL_TYPE_WLAN; + device_class->rfkill_type = NM_RFKILL_TYPE_WLAN; obj_properties[PROP_PEERS] = g_param_spec_boxed(NM_DEVICE_IWD_P2P_PEERS, "", diff --git a/src/core/devices/wifi/nm-device-iwd.c b/src/core/devices/wifi/nm-device-iwd.c index a92f92642b..ab37cbec91 100644 --- a/src/core/devices/wifi/nm-device-iwd.c +++ b/src/core/devices/wifi/nm-device-iwd.c @@ -3488,7 +3488,7 @@ nm_device_iwd_class_init(NMDeviceIwdClass *klass) device_class->state_changed = device_state_changed; - device_class->rfkill_type = RFKILL_TYPE_WLAN; + device_class->rfkill_type = NM_RFKILL_TYPE_WLAN; obj_properties[PROP_MODE] = g_param_spec_uint(NM_DEVICE_IWD_MODE, "", diff --git a/src/core/devices/wifi/nm-device-wifi-p2p.c b/src/core/devices/wifi/nm-device-wifi-p2p.c index 326729fadf..4576af95cb 100644 --- a/src/core/devices/wifi/nm-device-wifi-p2p.c +++ b/src/core/devices/wifi/nm-device-wifi-p2p.c @@ -1291,7 +1291,7 @@ nm_device_wifi_p2p_class_init(NMDeviceWifiP2PClass *klass) device_class->state_changed = device_state_changed; - device_class->rfkill_type = RFKILL_TYPE_WLAN; + device_class->rfkill_type = NM_RFKILL_TYPE_WLAN; obj_properties[PROP_PEERS] = g_param_spec_boxed(NM_DEVICE_WIFI_P2P_PEERS, "", diff --git a/src/core/devices/wifi/nm-device-wifi.c b/src/core/devices/wifi/nm-device-wifi.c index 5d1099ada7..cfb73848fb 100644 --- a/src/core/devices/wifi/nm-device-wifi.c +++ b/src/core/devices/wifi/nm-device-wifi.c @@ -3754,7 +3754,7 @@ nm_device_wifi_class_init(NMDeviceWifiClass *klass) device_class->state_changed = device_state_changed; - device_class->rfkill_type = RFKILL_TYPE_WLAN; + device_class->rfkill_type = NM_RFKILL_TYPE_WLAN; obj_properties[PROP_MODE] = g_param_spec_uint(NM_DEVICE_WIFI_MODE, "", diff --git a/src/core/devices/wwan/nm-device-modem.c b/src/core/devices/wwan/nm-device-modem.c index 6ac4e6e359..31c03f7350 100644 --- a/src/core/devices/wwan/nm-device-modem.c +++ b/src/core/devices/wwan/nm-device-modem.c @@ -838,7 +838,7 @@ nm_device_modem_class_init(NMDeviceModemClass *klass) device_class->state_changed = device_state_changed; - device_class->rfkill_type = RFKILL_TYPE_WWAN; + device_class->rfkill_type = NM_RFKILL_TYPE_WWAN; obj_properties[PROP_MODEM] = g_param_spec_object(NM_DEVICE_MODEM_MODEM, diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c index 42fb0e3633..02a1761e40 100644 --- a/src/core/nm-manager.c +++ b/src/core/nm-manager.c @@ -57,7 +57,7 @@ typedef struct { const char *desc; const char *prop; const char *hw_prop; - RfKillType rtype; + NMRfkillType rtype; NMConfigRunStatePropertyType key; bool user_enabled : 1; bool sw_enabled : 1; @@ -169,7 +169,7 @@ typedef struct { NMSettings *settings; - RadioState radio_states[RFKILL_TYPE_MAX]; + RadioState radio_states[NM_RFKILL_TYPE_MAX]; NMVpnManager *vpn_manager; @@ -2292,7 +2292,7 @@ radio_enabled_for_rstate(const RadioState *rstate, gboolean check_changeable) } static gboolean -radio_enabled_for_type(NMManager *self, RfKillType rtype, gboolean check_changeable) +radio_enabled_for_type(NMManager *self, NMRfkillType rtype, gboolean check_changeable) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); @@ -2333,15 +2333,15 @@ static void update_rstate_from_rfkill(NMRfkillManager *rfkill_mgr, RadioState *rstate) { switch (nm_rfkill_manager_get_rfkill_state(rfkill_mgr, rstate->rtype)) { - case RFKILL_UNBLOCKED: + case NM_RFKILL_STATE_UNBLOCKED: rstate->sw_enabled = TRUE; rstate->hw_enabled = TRUE; return; - case RFKILL_SOFT_BLOCKED: + case NM_RFKILL_STATE_SOFT_BLOCKED: rstate->sw_enabled = FALSE; rstate->hw_enabled = TRUE; return; - case RFKILL_HARD_BLOCKED: + case NM_RFKILL_STATE_HARD_BLOCKED: rstate->sw_enabled = FALSE; rstate->hw_enabled = FALSE; return; @@ -2350,7 +2350,7 @@ update_rstate_from_rfkill(NMRfkillManager *rfkill_mgr, RadioState *rstate) } static void -manager_rfkill_update_one_type(NMManager *self, RadioState *rstate, RfKillType rtype) +manager_rfkill_update_one_type(NMManager *self, RadioState *rstate, NMRfkillType rtype) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); gboolean old_enabled; @@ -2401,16 +2401,16 @@ manager_rfkill_update_one_type(NMManager *self, RadioState *rstate, RfKillType r } static void -nm_manager_rfkill_update(NMManager *self, RfKillType rtype) +nm_manager_rfkill_update(NMManager *self, NMRfkillType rtype) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); guint i; - if (rtype != RFKILL_TYPE_UNKNOWN) + if (rtype != NM_RFKILL_TYPE_UNKNOWN) manager_rfkill_update_one_type(self, &priv->radio_states[rtype], rtype); else { /* Otherwise, sync all radio types */ - for (i = 0; i < RFKILL_TYPE_MAX; i++) + for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) manager_rfkill_update_one_type(self, &priv->radio_states[i], i); } } @@ -3212,7 +3212,7 @@ add_device(NMManager *self, NMDevice *device, GError **error) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); const char *iface, *type_desc; - RfKillType rtype; + NMRfkillType rtype; GSList *iter, *remove = NULL; int ifindex; const char *dbus_path; @@ -3299,7 +3299,7 @@ add_device(NMManager *self, NMDevice *device, GError **error) * global state. */ rtype = nm_device_get_rfkill_type(device); - if (rtype != RFKILL_TYPE_UNKNOWN) { + if (rtype != NM_RFKILL_TYPE_UNKNOWN) { nm_manager_rfkill_update(self, rtype); nm_device_set_enabled(device, radio_enabled_for_type(self, rtype, TRUE)); } @@ -3677,8 +3677,8 @@ platform_query_devices(NMManager *self) static void rfkill_manager_rfkill_changed_cb(NMRfkillManager *rfkill_mgr, - RfKillType rtype, - RfKillState udev_state, + NMRfkillType rtype, + NMRfkillState udev_state, gpointer user_data) { nm_manager_rfkill_update(NM_MANAGER(user_data), rtype); @@ -6318,7 +6318,7 @@ do_sleep_wake(NMManager *self, gboolean sleeping_changed) /* Ensure rfkill state is up-to-date since we don't respond to state * changes during sleep. */ - nm_manager_rfkill_update(self, RFKILL_TYPE_UNKNOWN); + nm_manager_rfkill_update(self, NM_RFKILL_TYPE_UNKNOWN); /* Re-manage managed devices */ c_list_for_each_entry (device, &priv->devices_lst_head, devices_lst) { @@ -6335,7 +6335,7 @@ do_sleep_wake(NMManager *self, gboolean sleeping_changed) /* enable/disable wireless devices since that we don't respond * to killswitch changes during sleep. */ - for (i = 0; i < RFKILL_TYPE_MAX; i++) { + for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) { const RadioState *rstate = &priv->radio_states[i]; gboolean enabled = radio_enabled_for_rstate(rstate, TRUE); @@ -6934,7 +6934,7 @@ nm_manager_start(NMManager *self, GError **error) nm_device_factory_manager_for_each_factory(start_factory, NULL); /* Set initial radio enabled/disabled state */ - for (i = 0; i < RFKILL_TYPE_MAX; i++) { + for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) { RadioState *rstate = &priv->radio_states[i]; gboolean enabled; @@ -7605,14 +7605,14 @@ struct rfkill_event { } _nm_packed; static void -rfkill_change(NMManager *self, const char *desc, RfKillType rtype, gboolean enabled) +rfkill_change(NMManager *self, const char *desc, NMRfkillType rtype, gboolean enabled) { int fd; struct rfkill_event event; ssize_t len; int errsv; - g_return_if_fail(rtype == RFKILL_TYPE_WLAN || rtype == RFKILL_TYPE_WWAN); + g_return_if_fail(rtype == NM_RFKILL_TYPE_WLAN || rtype == NM_RFKILL_TYPE_WWAN); fd = open("/dev/rfkill", O_RDWR | O_CLOEXEC); if (fd < 0) { @@ -7633,10 +7633,10 @@ rfkill_change(NMManager *self, const char *desc, RfKillType rtype, gboolean enab memset(&event, 0, sizeof(event)); event.op = KERN_RFKILL_OP_CHANGE_ALL; switch (rtype) { - case RFKILL_TYPE_WLAN: + case NM_RFKILL_TYPE_WLAN: event.type = KERN_RFKILL_TYPE_WLAN; break; - case RFKILL_TYPE_WWAN: + case NM_RFKILL_TYPE_WWAN: event.type = KERN_RFKILL_TYPE_WWAN; break; default: @@ -7699,7 +7699,7 @@ manager_radio_user_toggled(NMManager *self, RadioState *rstate, gboolean enabled new_enabled = radio_enabled_for_rstate(rstate, FALSE); if (new_enabled != old_enabled) { /* Try to change the kernel rfkill state */ - if (rstate->rtype == RFKILL_TYPE_WLAN || rstate->rtype == RFKILL_TYPE_WWAN) + if (rstate->rtype == NM_RFKILL_TYPE_WLAN || rstate->rtype == NM_RFKILL_TYPE_WWAN) rfkill_change(self, rstate->desc, rstate->rtype, new_enabled); manager_update_radio_enabled(self, rstate, new_enabled); @@ -7881,8 +7881,8 @@ constructed(GObject *object) priv->net_enabled = state->net_enabled; - priv->radio_states[RFKILL_TYPE_WLAN].user_enabled = state->wifi_enabled; - priv->radio_states[RFKILL_TYPE_WWAN].user_enabled = state->wwan_enabled; + priv->radio_states[NM_RFKILL_TYPE_WLAN].user_enabled = state->wifi_enabled; + priv->radio_states[NM_RFKILL_TYPE_WWAN].user_enabled = state->wwan_enabled; priv->rfkill_mgr = nm_rfkill_manager_new(); g_signal_connect(priv->rfkill_mgr, @@ -7896,13 +7896,13 @@ constructed(GObject *object) * rfkill. */ rfkill_change(self, - priv->radio_states[RFKILL_TYPE_WLAN].desc, - RFKILL_TYPE_WLAN, - priv->radio_states[RFKILL_TYPE_WLAN].user_enabled); + priv->radio_states[NM_RFKILL_TYPE_WLAN].desc, + NM_RFKILL_TYPE_WLAN, + priv->radio_states[NM_RFKILL_TYPE_WLAN].user_enabled); rfkill_change(self, - priv->radio_states[RFKILL_TYPE_WWAN].desc, - RFKILL_TYPE_WWAN, - priv->radio_states[RFKILL_TYPE_WWAN].user_enabled); + priv->radio_states[NM_RFKILL_TYPE_WWAN].desc, + NM_RFKILL_TYPE_WWAN, + priv->radio_states[NM_RFKILL_TYPE_WWAN].user_enabled); } static void @@ -7922,22 +7922,22 @@ nm_manager_init(NMManager *self) priv->capabilities = g_array_new(FALSE, FALSE, sizeof(guint32)); - priv->radio_states[RFKILL_TYPE_WLAN] = (RadioState){ + priv->radio_states[NM_RFKILL_TYPE_WLAN] = (RadioState){ .user_enabled = TRUE, .key = NM_CONFIG_STATE_PROPERTY_WIFI_ENABLED, .prop = NM_MANAGER_WIRELESS_ENABLED, .hw_prop = NM_MANAGER_WIRELESS_HARDWARE_ENABLED, .desc = "Wi-Fi", - .rtype = RFKILL_TYPE_WLAN, + .rtype = NM_RFKILL_TYPE_WLAN, .hw_enabled = TRUE, }; - priv->radio_states[RFKILL_TYPE_WWAN] = (RadioState){ + priv->radio_states[NM_RFKILL_TYPE_WWAN] = (RadioState){ .user_enabled = TRUE, .key = NM_CONFIG_STATE_PROPERTY_WWAN_ENABLED, .prop = NM_MANAGER_WWAN_ENABLED, .hw_prop = NM_MANAGER_WWAN_HARDWARE_ENABLED, .desc = "WWAN", - .rtype = RFKILL_TYPE_WWAN, + .rtype = NM_RFKILL_TYPE_WWAN, .hw_enabled = TRUE, }; @@ -8011,16 +8011,16 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) g_value_set_boolean(value, priv->net_enabled); break; case PROP_WIRELESS_ENABLED: - g_value_set_boolean(value, radio_enabled_for_type(self, RFKILL_TYPE_WLAN, TRUE)); + g_value_set_boolean(value, radio_enabled_for_type(self, NM_RFKILL_TYPE_WLAN, TRUE)); break; case PROP_WIRELESS_HARDWARE_ENABLED: - g_value_set_boolean(value, priv->radio_states[RFKILL_TYPE_WLAN].hw_enabled); + g_value_set_boolean(value, priv->radio_states[NM_RFKILL_TYPE_WLAN].hw_enabled); break; case PROP_WWAN_ENABLED: - g_value_set_boolean(value, radio_enabled_for_type(self, RFKILL_TYPE_WWAN, TRUE)); + g_value_set_boolean(value, radio_enabled_for_type(self, NM_RFKILL_TYPE_WWAN, TRUE)); break; case PROP_WWAN_HARDWARE_ENABLED: - g_value_set_boolean(value, priv->radio_states[RFKILL_TYPE_WWAN].hw_enabled); + g_value_set_boolean(value, priv->radio_states[NM_RFKILL_TYPE_WWAN].hw_enabled); break; case PROP_WIMAX_ENABLED: g_value_set_boolean(value, FALSE); @@ -8112,12 +8112,12 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps switch (prop_id) { case PROP_WIRELESS_ENABLED: manager_radio_user_toggled(NM_MANAGER(object), - &priv->radio_states[RFKILL_TYPE_WLAN], + &priv->radio_states[NM_RFKILL_TYPE_WLAN], g_value_get_boolean(value)); break; case PROP_WWAN_ENABLED: manager_radio_user_toggled(NM_MANAGER(object), - &priv->radio_states[RFKILL_TYPE_WWAN], + &priv->radio_states[NM_RFKILL_TYPE_WWAN], g_value_get_boolean(value)); break; case PROP_WIMAX_ENABLED: diff --git a/src/core/nm-rfkill-manager.c b/src/core/nm-rfkill-manager.c index f3851e5ca6..9bffdd3c3a 100644 --- a/src/core/nm-rfkill-manager.c +++ b/src/core/nm-rfkill-manager.c @@ -24,8 +24,8 @@ typedef struct { NMUdevClient *udev_client; /* Authoritative rfkill state (RFKILL_* enum) */ - RfKillState rfkill_states[RFKILL_TYPE_MAX]; - GSList *killswitches; + NMRfkillState rfkill_states[NM_RFKILL_TYPE_MAX]; + GSList *killswitches; } NMRfkillManagerPrivate; struct _NMRfkillManager { @@ -45,26 +45,26 @@ G_DEFINE_TYPE(NMRfkillManager, nm_rfkill_manager, G_TYPE_OBJECT) /*****************************************************************************/ typedef struct { - char *name; - guint64 seqnum; - char *path; - char *driver; - RfKillType rtype; - int state; - gboolean platform; + char *name; + guint64 seqnum; + char *path; + char *driver; + NMRfkillType rtype; + int state; + gboolean platform; } Killswitch; -RfKillState -nm_rfkill_manager_get_rfkill_state(NMRfkillManager *self, RfKillType rtype) +NMRfkillState +nm_rfkill_manager_get_rfkill_state(NMRfkillManager *self, NMRfkillType rtype) { - g_return_val_if_fail(self != NULL, RFKILL_UNBLOCKED); - g_return_val_if_fail(rtype < RFKILL_TYPE_MAX, RFKILL_UNBLOCKED); + g_return_val_if_fail(self != NULL, NM_RFKILL_STATE_UNBLOCKED); + g_return_val_if_fail(rtype < NM_RFKILL_TYPE_MAX, NM_RFKILL_STATE_UNBLOCKED); return NM_RFKILL_MANAGER_GET_PRIVATE(self)->rfkill_states[rtype]; } static const char * -rfkill_type_to_desc(RfKillType rtype) +rfkill_type_to_desc(NMRfkillType rtype) { if (rtype == 0) return "Wi-Fi"; @@ -76,7 +76,7 @@ rfkill_type_to_desc(RfKillType rtype) } static const char * -rfkill_state_to_desc(RfKillState rstate) +rfkill_state_to_desc(NMRfkillState rstate) { if (rstate == 0) return "unblocked"; @@ -88,7 +88,7 @@ rfkill_state_to_desc(RfKillState rstate) } static Killswitch * -killswitch_new(struct udev_device *device, RfKillType rtype) +killswitch_new(struct udev_device *device, NMRfkillType rtype) { Killswitch *ks; struct udev_device *parent = NULL, *grandparent = NULL; @@ -140,21 +140,21 @@ killswitch_destroy(Killswitch *ks) g_free(ks); } -static RfKillState +static NMRfkillState sysfs_state_to_nm_state(int sysfs_state) { switch (sysfs_state) { case 0: - return RFKILL_SOFT_BLOCKED; + return NM_RFKILL_STATE_SOFT_BLOCKED; case 1: - return RFKILL_UNBLOCKED; + return NM_RFKILL_STATE_UNBLOCKED; case 2: - return RFKILL_HARD_BLOCKED; + return NM_RFKILL_STATE_HARD_BLOCKED; default: nm_log_warn(LOGD_RFKILL, "unhandled rfkill state %d", sysfs_state); break; } - return RFKILL_UNBLOCKED; + return NM_RFKILL_STATE_UNBLOCKED; } static void @@ -162,15 +162,15 @@ recheck_killswitches(NMRfkillManager *self) { NMRfkillManagerPrivate *priv = NM_RFKILL_MANAGER_GET_PRIVATE(self); GSList *iter; - RfKillState poll_states[RFKILL_TYPE_MAX]; - RfKillState platform_states[RFKILL_TYPE_MAX]; - gboolean platform_checked[RFKILL_TYPE_MAX]; + NMRfkillState poll_states[NM_RFKILL_TYPE_MAX]; + NMRfkillState platform_states[NM_RFKILL_TYPE_MAX]; + gboolean platform_checked[NM_RFKILL_TYPE_MAX]; int i; /* Default state is unblocked */ - for (i = 0; i < RFKILL_TYPE_MAX; i++) { - poll_states[i] = RFKILL_UNBLOCKED; - platform_states[i] = RFKILL_UNBLOCKED; + for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) { + poll_states[i] = NM_RFKILL_STATE_UNBLOCKED; + platform_states[i] = NM_RFKILL_STATE_UNBLOCKED; platform_checked[i] = FALSE; } @@ -178,7 +178,7 @@ recheck_killswitches(NMRfkillManager *self) for (iter = priv->killswitches; iter; iter = g_slist_next(iter)) { Killswitch *ks = iter->data; struct udev_device *device; - RfKillState dev_state; + NMRfkillState dev_state; int sysfs_state; device = udev_device_new_from_subsystem_sysname(nm_udev_client_get_udev(priv->udev_client), @@ -214,12 +214,12 @@ recheck_killswitches(NMRfkillManager *self) } /* Log and emit change signal for final rfkill states */ - for (i = 0; i < RFKILL_TYPE_MAX; i++) { + for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) { if (platform_checked[i] == TRUE) { /* blocked platform switch state overrides device state, otherwise * let the device state stand. (bgo #655773) */ - if (platform_states[i] != RFKILL_UNBLOCKED) + if (platform_states[i] != NM_RFKILL_STATE_UNBLOCKED) poll_states[i] = platform_states[i]; } @@ -252,17 +252,17 @@ killswitch_find_by_name(NMRfkillManager *self, const char *name) return NULL; } -static RfKillType +static NMRfkillType rfkill_type_to_enum(const char *str) { - g_return_val_if_fail(str != NULL, RFKILL_TYPE_UNKNOWN); + g_return_val_if_fail(str != NULL, NM_RFKILL_TYPE_UNKNOWN); if (!strcmp(str, "wlan")) - return RFKILL_TYPE_WLAN; + return NM_RFKILL_TYPE_WLAN; else if (!strcmp(str, "wwan")) - return RFKILL_TYPE_WWAN; + return NM_RFKILL_TYPE_WWAN; - return RFKILL_TYPE_UNKNOWN; + return NM_RFKILL_TYPE_UNKNOWN; } static void @@ -270,12 +270,12 @@ add_one_killswitch(NMRfkillManager *self, struct udev_device *device) { NMRfkillManagerPrivate *priv = NM_RFKILL_MANAGER_GET_PRIVATE(self); const char *str_type; - RfKillType rtype; + NMRfkillType rtype; Killswitch *ks; str_type = udev_device_get_property_value(device, "RFKILL_TYPE"); rtype = rfkill_type_to_enum(str_type); - if (rtype == RFKILL_TYPE_UNKNOWN) + if (rtype == NM_RFKILL_TYPE_UNKNOWN) return; ks = killswitch_new(device, rtype); @@ -364,8 +364,8 @@ nm_rfkill_manager_init(NMRfkillManager *self) struct udev_list_entry *iter; guint i; - for (i = 0; i < RFKILL_TYPE_MAX; i++) - priv->rfkill_states[i] = RFKILL_UNBLOCKED; + for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) + priv->rfkill_states[i] = NM_RFKILL_STATE_UNBLOCKED; priv->udev_client = nm_udev_client_new(NM_MAKE_STRV("rfkill"), handle_uevent, self); diff --git a/src/core/nm-rfkill-manager.h b/src/core/nm-rfkill-manager.h index bae6a7e4d0..b1de831c0e 100644 --- a/src/core/nm-rfkill-manager.h +++ b/src/core/nm-rfkill-manager.h @@ -8,22 +8,22 @@ #define __NM_RFKILL_MANAGER_H__ typedef enum { - RFKILL_UNBLOCKED = 0, - RFKILL_SOFT_BLOCKED = 1, - RFKILL_HARD_BLOCKED = 2, -} RfKillState; + NM_RFKILL_STATE_UNBLOCKED = 0, + NM_RFKILL_STATE_SOFT_BLOCKED = 1, + NM_RFKILL_STATE_HARD_BLOCKED = 2, +} NMRfkillState; typedef enum { - RFKILL_TYPE_WLAN = 0, - RFKILL_TYPE_WWAN = 1, + NM_RFKILL_TYPE_WLAN = 0, + NM_RFKILL_TYPE_WWAN = 1, /* UNKNOWN and MAX should always be 1 more than - * the last rfkill type since RFKILL_TYPE_MAX is + * the last rfkill type since NM_RFKILL_TYPE_MAX is * used as an array size. */ - RFKILL_TYPE_UNKNOWN, /* KEEP LAST */ - RFKILL_TYPE_MAX = RFKILL_TYPE_UNKNOWN, -} RfKillType; + NM_RFKILL_TYPE_UNKNOWN, /* KEEP LAST */ + NM_RFKILL_TYPE_MAX = NM_RFKILL_TYPE_UNKNOWN, +} NMRfkillType; #define NM_TYPE_RFKILL_MANAGER (nm_rfkill_manager_get_type()) #define NM_RFKILL_MANAGER(obj) \ @@ -43,6 +43,6 @@ GType nm_rfkill_manager_get_type(void); NMRfkillManager *nm_rfkill_manager_new(void); -RfKillState nm_rfkill_manager_get_rfkill_state(NMRfkillManager *manager, RfKillType rtype); +NMRfkillState nm_rfkill_manager_get_rfkill_state(NMRfkillManager *manager, NMRfkillType rtype); #endif /* __NM_RFKILL_MANAGER_H__ */ From 858a0ee47f129b518390f02c061b5f5d1eb2a8e4 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 22:08:52 +0100 Subject: [PATCH 010/118] core/rfkill: move immutable type description of Rfkill to global field RadioState contained both the mutable user-data and meta-data about the radio state. The latter is immutable. The parts that cannot change, should be separate from those that can change. Move them to a separate array. Of course, we only have on NMManager instance, so having these fields embedded in NMManagerPrivate did not waste memory. This change is done, because immutable fields should be const. In this case, they are now const global data, which is even protected by the linker from accidental mutation. --- src/core/nm-manager.c | 193 ++++++++++++++++++++---------------------- 1 file changed, 94 insertions(+), 99 deletions(-) diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c index 02a1761e40..a5bf8d2f52 100644 --- a/src/core/nm-manager.c +++ b/src/core/nm-manager.c @@ -55,13 +55,15 @@ typedef struct { const char *desc; - const char *prop; - const char *hw_prop; - NMRfkillType rtype; + guint prop_id; + guint hw_prop_id; NMConfigRunStatePropertyType key; - bool user_enabled : 1; - bool sw_enabled : 1; - bool hw_enabled : 1; +} RfkillTypeDesc; + +typedef struct { + bool user_enabled : 1; + bool sw_enabled : 1; + bool hw_enabled : 1; } RadioState; typedef enum { @@ -2277,9 +2279,26 @@ _static_hostname_changed_cb(NMHostnameManager *hostname_manager, GParamSpec *psp } /*****************************************************************************/ -/* General NMManager stuff */ +/* General NMManager stuff */ /*****************************************************************************/ +static const RfkillTypeDesc _rfkill_type_desc[NM_RFKILL_TYPE_MAX] = { + [NM_RFKILL_TYPE_WLAN] = + { + .desc = "Wi-Fi", + .prop_id = PROP_WIRELESS_ENABLED, + .hw_prop_id = PROP_WIRELESS_HARDWARE_ENABLED, + .key = NM_CONFIG_STATE_PROPERTY_WIFI_ENABLED, + }, + [NM_RFKILL_TYPE_WWAN] = + { + .desc = "WWAN", + .prop_id = PROP_WWAN_ENABLED, + .hw_prop_id = PROP_WWAN_HARDWARE_ENABLED, + .key = NM_CONFIG_STATE_PROPERTY_WWAN_ENABLED, + }, +}; + static gboolean radio_enabled_for_rstate(const RadioState *rstate, gboolean check_changeable) { @@ -2302,16 +2321,12 @@ radio_enabled_for_type(NMManager *self, NMRfkillType rtype, gboolean check_chang } static void -manager_update_radio_enabled(NMManager *self, const RadioState *rstate, gboolean enabled) +manager_update_radio_enabled(NMManager *self, NMRfkillType rtype, gboolean enabled) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); NMDevice *device; - /* Do nothing for radio types not yet implemented */ - if (!rstate->prop) - return; - - g_object_notify(G_OBJECT(self), rstate->prop); + _notify(self, _rfkill_type_desc[rtype].prop_id); /* Don't touch devices if asleep/networking disabled */ if (manager_sleeping(self)) @@ -2319,7 +2334,7 @@ manager_update_radio_enabled(NMManager *self, const RadioState *rstate, gboolean /* enable/disable wireless devices as required */ c_list_for_each_entry (device, &priv->devices_lst_head, devices_lst) { - if (nm_device_get_rfkill_type(device) == rstate->rtype) { + if (nm_device_get_rfkill_type(device) == rtype) { _LOG2D(LOGD_RFKILL, device, "rfkill: setting radio %s", @@ -2330,9 +2345,9 @@ manager_update_radio_enabled(NMManager *self, const RadioState *rstate, gboolean } static void -update_rstate_from_rfkill(NMRfkillManager *rfkill_mgr, RadioState *rstate) +update_rstate_from_rfkill(NMRfkillManager *rfkill_mgr, NMRfkillType rtype, RadioState *rstate) { - switch (nm_rfkill_manager_get_rfkill_state(rfkill_mgr, rstate->rtype)) { + switch (nm_rfkill_manager_get_rfkill_state(rfkill_mgr, rtype)) { case NM_RFKILL_STATE_UNBLOCKED: rstate->sw_enabled = TRUE; rstate->hw_enabled = TRUE; @@ -2350,45 +2365,44 @@ update_rstate_from_rfkill(NMRfkillManager *rfkill_mgr, RadioState *rstate) } static void -manager_rfkill_update_one_type(NMManager *self, RadioState *rstate, NMRfkillType rtype) +manager_rfkill_update_one_type(NMManager *self, NMRfkillType rtype) { - NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); + NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); + RadioState *rstate = &priv->radio_states[rtype]; gboolean old_enabled; gboolean new_enabled; gboolean old_rfkilled; gboolean new_rfkilled; gboolean old_hwe; + nm_assert(_NM_INT_NOT_NEGATIVE(rtype) && rtype < G_N_ELEMENTS(priv->radio_states)); + old_enabled = radio_enabled_for_rstate(rstate, TRUE); old_rfkilled = rstate->hw_enabled && rstate->sw_enabled; old_hwe = rstate->hw_enabled; /* recheck kernel rfkill state */ - update_rstate_from_rfkill(priv->rfkill_mgr, rstate); + update_rstate_from_rfkill(priv->rfkill_mgr, rtype, rstate); /* Print out all states affecting device enablement */ - if (rstate->desc) { - _LOGD(LOGD_RFKILL, - "rfkill: %s hw-enabled %d sw-enabled %d", - rstate->desc, - rstate->hw_enabled, - rstate->sw_enabled); - } + _LOGD(LOGD_RFKILL, + "rfkill: %s hw-enabled %d sw-enabled %d", + _rfkill_type_desc[rtype].desc, + rstate->hw_enabled, + rstate->sw_enabled); /* Log new killswitch state */ new_rfkilled = rstate->hw_enabled && rstate->sw_enabled; if (old_rfkilled != new_rfkilled) { _LOGI(LOGD_RFKILL, "rfkill: %s now %s by radio killswitch", - rstate->desc, + _rfkill_type_desc[rtype].desc, new_rfkilled ? "enabled" : "disabled"); } /* Send out property changed signal for HW enabled */ - if (rstate->hw_enabled != old_hwe) { - if (rstate->hw_prop) - g_object_notify(G_OBJECT(self), rstate->hw_prop); - } + if (rstate->hw_enabled != old_hwe) + _notify(self, _rfkill_type_desc[rtype].hw_prop_id); /* And finally update the actual device radio state itself; respect the * daemon state here because this is never called from user-triggered @@ -2397,21 +2411,20 @@ manager_rfkill_update_one_type(NMManager *self, RadioState *rstate, NMRfkillType */ new_enabled = radio_enabled_for_rstate(rstate, TRUE); if (new_enabled != old_enabled) - manager_update_radio_enabled(self, rstate, new_enabled); + manager_update_radio_enabled(self, rtype, new_enabled); } static void nm_manager_rfkill_update(NMManager *self, NMRfkillType rtype) { - NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); - guint i; + guint i; if (rtype != NM_RFKILL_TYPE_UNKNOWN) - manager_rfkill_update_one_type(self, &priv->radio_states[rtype], rtype); + manager_rfkill_update_one_type(self, rtype); else { /* Otherwise, sync all radio types */ for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) - manager_rfkill_update_one_type(self, &priv->radio_states[i], i); + manager_rfkill_update_one_type(self, i); } } @@ -6336,19 +6349,18 @@ do_sleep_wake(NMManager *self, gboolean sleeping_changed) * to killswitch changes during sleep. */ for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) { - const RadioState *rstate = &priv->radio_states[i]; + NMRfkillType rtype = i; + const RadioState *rstate = &priv->radio_states[rtype]; gboolean enabled = radio_enabled_for_rstate(rstate, TRUE); - if (rstate->desc) { - _LOGD(LOGD_RFKILL, - "rfkill: %s %s devices (hw_enabled %d, sw_enabled %d, user_enabled %d)", - enabled ? "enabling" : "disabling", - rstate->desc, - rstate->hw_enabled, - rstate->sw_enabled, - rstate->user_enabled); - } - if (nm_device_get_rfkill_type(device) == rstate->rtype) + _LOGD(LOGD_RFKILL, + "rfkill: %s %s devices (hw_enabled %d, sw_enabled %d, user_enabled %d)", + enabled ? "enabling" : "disabling", + _rfkill_type_desc[rtype].desc, + rstate->hw_enabled, + rstate->sw_enabled, + rstate->user_enabled); + if (nm_device_get_rfkill_type(device) == rtype) nm_device_set_enabled(device, enabled); } @@ -6935,24 +6947,20 @@ nm_manager_start(NMManager *self, GError **error) /* Set initial radio enabled/disabled state */ for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) { - RadioState *rstate = &priv->radio_states[i]; - gboolean enabled; - - if (!rstate->desc) - continue; + NMRfkillType rtype = i; + RadioState *rstate = &priv->radio_states[rtype]; + gboolean enabled; /* recheck kernel rfkill state */ - update_rstate_from_rfkill(priv->rfkill_mgr, rstate); + update_rstate_from_rfkill(priv->rfkill_mgr, rtype, rstate); - if (rstate->desc) { - _LOGI(LOGD_RFKILL, - "rfkill: %s %s by radio killswitch; %s by state file", - rstate->desc, - (rstate->hw_enabled && rstate->sw_enabled) ? "enabled" : "disabled", - rstate->user_enabled ? "enabled" : "disabled"); - } + _LOGI(LOGD_RFKILL, + "rfkill: %s %s by radio killswitch; %s by state file", + _rfkill_type_desc[rtype].desc, + (rstate->hw_enabled && rstate->sw_enabled) ? "enabled" : "disabled", + rstate->user_enabled ? "enabled" : "disabled"); enabled = radio_enabled_for_rstate(rstate, TRUE); - manager_update_radio_enabled(self, rstate, enabled); + manager_update_radio_enabled(self, rtype, enabled); } _LOGI(LOGD_CORE, "Networking is %s by state file", priv->net_enabled ? "enabled" : "disabled"); @@ -7605,7 +7613,7 @@ struct rfkill_event { } _nm_packed; static void -rfkill_change(NMManager *self, const char *desc, NMRfkillType rtype, gboolean enabled) +rfkill_change(NMManager *self, NMRfkillType rtype, gboolean enabled) { int fd; struct rfkill_event event; @@ -7617,7 +7625,9 @@ rfkill_change(NMManager *self, const char *desc, NMRfkillType rtype, gboolean en fd = open("/dev/rfkill", O_RDWR | O_CLOEXEC); if (fd < 0) { if (errno == EACCES) - _LOGW(LOGD_RFKILL, "rfkill: (%s): failed to open killswitch device", desc); + _LOGW(LOGD_RFKILL, + "rfkill: (%s): failed to open killswitch device", + _rfkill_type_desc[rtype].desc); return; } @@ -7625,7 +7635,7 @@ rfkill_change(NMManager *self, const char *desc, NMRfkillType rtype, gboolean en _LOGW(LOGD_RFKILL, "rfkill: (%s): failed to set killswitch device for " "non-blocking operation", - desc); + _rfkill_type_desc[rtype].desc); nm_close(fd); return; } @@ -7649,41 +7659,42 @@ rfkill_change(NMManager *self, const char *desc, NMRfkillType rtype, gboolean en errsv = errno; _LOGW(LOGD_RFKILL, "rfkill: (%s): failed to change Wi-Fi killswitch state: (%d) %s", - desc, + _rfkill_type_desc[rtype].desc, errsv, nm_strerror_native(errsv)); } else if (len == sizeof(event)) { _LOGI(LOGD_RFKILL, "rfkill: %s hardware radio set %s", - desc, + _rfkill_type_desc[rtype].desc, enabled ? "enabled" : "disabled"); } else { /* Failed to write full structure */ - _LOGW(LOGD_RFKILL, "rfkill: (%s): failed to change Wi-Fi killswitch state", desc); + _LOGW(LOGD_RFKILL, + "rfkill: (%s): failed to change Wi-Fi killswitch state", + _rfkill_type_desc[rtype].desc); } nm_close(fd); } static void -manager_radio_user_toggled(NMManager *self, RadioState *rstate, gboolean enabled) +manager_radio_user_toggled(NMManager *self, NMRfkillType rtype, gboolean enabled) { - NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); + NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); + RadioState *rstate = &priv->radio_states[rtype]; gboolean old_enabled, new_enabled; /* Don't touch devices if asleep/networking disabled */ if (manager_sleeping(self)) return; - if (rstate->desc) { - _LOGD(LOGD_RFKILL, - "rfkill: (%s): setting radio %s by user", - rstate->desc, - enabled ? "enabled" : "disabled"); - } + _LOGD(LOGD_RFKILL, + "rfkill: (%s): setting radio %s by user", + _rfkill_type_desc[rtype].desc, + enabled ? "enabled" : "disabled"); /* Update enabled key in state file */ - nm_config_state_set(priv->config, TRUE, FALSE, rstate->key, enabled); + nm_config_state_set(priv->config, TRUE, FALSE, _rfkill_type_desc[rtype].key, enabled); /* When the user toggles the radio, their request should override any * daemon (like ModemManager) enabled state that can be changed. For WWAN @@ -7699,10 +7710,10 @@ manager_radio_user_toggled(NMManager *self, RadioState *rstate, gboolean enabled new_enabled = radio_enabled_for_rstate(rstate, FALSE); if (new_enabled != old_enabled) { /* Try to change the kernel rfkill state */ - if (rstate->rtype == NM_RFKILL_TYPE_WLAN || rstate->rtype == NM_RFKILL_TYPE_WWAN) - rfkill_change(self, rstate->desc, rstate->rtype, new_enabled); + nm_assert(NM_IN_SET(rtype, NM_RFKILL_TYPE_WLAN, NM_RFKILL_TYPE_WWAN)); + rfkill_change(self, rtype, new_enabled); - manager_update_radio_enabled(self, rstate, new_enabled); + manager_update_radio_enabled(self, rtype, new_enabled); } } @@ -7895,14 +7906,8 @@ constructed(GObject *object) * changes to the WirelessEnabled/WWANEnabled properties which toggle kernel * rfkill. */ - rfkill_change(self, - priv->radio_states[NM_RFKILL_TYPE_WLAN].desc, - NM_RFKILL_TYPE_WLAN, - priv->radio_states[NM_RFKILL_TYPE_WLAN].user_enabled); - rfkill_change(self, - priv->radio_states[NM_RFKILL_TYPE_WWAN].desc, - NM_RFKILL_TYPE_WWAN, - priv->radio_states[NM_RFKILL_TYPE_WWAN].user_enabled); + rfkill_change(self, NM_RFKILL_TYPE_WLAN, priv->radio_states[NM_RFKILL_TYPE_WLAN].user_enabled); + rfkill_change(self, NM_RFKILL_TYPE_WWAN, priv->radio_states[NM_RFKILL_TYPE_WWAN].user_enabled); } static void @@ -7924,20 +7929,10 @@ nm_manager_init(NMManager *self) priv->radio_states[NM_RFKILL_TYPE_WLAN] = (RadioState){ .user_enabled = TRUE, - .key = NM_CONFIG_STATE_PROPERTY_WIFI_ENABLED, - .prop = NM_MANAGER_WIRELESS_ENABLED, - .hw_prop = NM_MANAGER_WIRELESS_HARDWARE_ENABLED, - .desc = "Wi-Fi", - .rtype = NM_RFKILL_TYPE_WLAN, .hw_enabled = TRUE, }; priv->radio_states[NM_RFKILL_TYPE_WWAN] = (RadioState){ .user_enabled = TRUE, - .key = NM_CONFIG_STATE_PROPERTY_WWAN_ENABLED, - .prop = NM_MANAGER_WWAN_ENABLED, - .hw_prop = NM_MANAGER_WWAN_HARDWARE_ENABLED, - .desc = "WWAN", - .rtype = NM_RFKILL_TYPE_WWAN, .hw_enabled = TRUE, }; @@ -8112,12 +8107,12 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps switch (prop_id) { case PROP_WIRELESS_ENABLED: manager_radio_user_toggled(NM_MANAGER(object), - &priv->radio_states[NM_RFKILL_TYPE_WLAN], + NM_RFKILL_TYPE_WLAN, g_value_get_boolean(value)); break; case PROP_WWAN_ENABLED: manager_radio_user_toggled(NM_MANAGER(object), - &priv->radio_states[NM_RFKILL_TYPE_WWAN], + NM_RFKILL_TYPE_WWAN, g_value_get_boolean(value)); break; case PROP_WIMAX_ENABLED: From 467b21afa78c700a706903826c1ecc7047420469 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 22:19:36 +0100 Subject: [PATCH 011/118] core/rfkill: rename Rfkill related functions in "nm-manager.c" Naming is important. Especially when we have a 8k LOC monster, that manages everything. Rename things related to Rfkill to give them a common prefix. Also, move code around so it's beside each other. --- src/core/nm-manager.c | 365 ++++++++++++++++++++++-------------------- 1 file changed, 188 insertions(+), 177 deletions(-) diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c index a5bf8d2f52..fe1ad5d7b2 100644 --- a/src/core/nm-manager.c +++ b/src/core/nm-manager.c @@ -64,7 +64,7 @@ typedef struct { bool user_enabled : 1; bool sw_enabled : 1; bool hw_enabled : 1; -} RadioState; +} RfkillRadioState; typedef enum { ASYNC_OP_TYPE_AC_AUTH_ACTIVATE_INTERNAL, @@ -171,7 +171,7 @@ typedef struct { NMSettings *settings; - RadioState radio_states[NM_RFKILL_TYPE_MAX]; + RfkillRadioState radio_states[NM_RFKILL_TYPE_MAX]; NMVpnManager *vpn_manager; @@ -2278,8 +2278,6 @@ _static_hostname_changed_cb(NMHostnameManager *hostname_manager, GParamSpec *psp nm_dispatcher_call_hostname(NULL, NULL, NULL); } -/*****************************************************************************/ -/* General NMManager stuff */ /*****************************************************************************/ static const RfkillTypeDesc _rfkill_type_desc[NM_RFKILL_TYPE_MAX] = { @@ -2300,7 +2298,7 @@ static const RfkillTypeDesc _rfkill_type_desc[NM_RFKILL_TYPE_MAX] = { }; static gboolean -radio_enabled_for_rstate(const RadioState *rstate, gboolean check_changeable) +_rfkill_radio_state_get_enabled(const RfkillRadioState *rstate, gboolean check_changeable) { gboolean enabled; @@ -2310,18 +2308,40 @@ radio_enabled_for_rstate(const RadioState *rstate, gboolean check_changeable) return enabled; } +static void +_rfkill_radio_state_set_from_manager(NMRfkillManager *rfkill_mgr, + NMRfkillType rtype, + RfkillRadioState *rstate) +{ + switch (nm_rfkill_manager_get_rfkill_state(rfkill_mgr, rtype)) { + case NM_RFKILL_STATE_UNBLOCKED: + rstate->sw_enabled = TRUE; + rstate->hw_enabled = TRUE; + return; + case NM_RFKILL_STATE_SOFT_BLOCKED: + rstate->sw_enabled = FALSE; + rstate->hw_enabled = TRUE; + return; + case NM_RFKILL_STATE_HARD_BLOCKED: + rstate->sw_enabled = FALSE; + rstate->hw_enabled = FALSE; + return; + } + nm_assert_not_reached(); +} + static gboolean -radio_enabled_for_type(NMManager *self, NMRfkillType rtype, gboolean check_changeable) +_rfkill_radio_state_get(NMManager *self, NMRfkillType rtype) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); nm_assert(_NM_INT_NOT_NEGATIVE(rtype) && rtype < G_N_ELEMENTS(priv->radio_states)); - return radio_enabled_for_rstate(&priv->radio_states[rtype], check_changeable); + return _rfkill_radio_state_get_enabled(&priv->radio_states[rtype], TRUE); } static void -manager_update_radio_enabled(NMManager *self, NMRfkillType rtype, gboolean enabled) +_rfkill_update_devices(NMManager *self, NMRfkillType rtype, gboolean enabled) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); NMDevice *device; @@ -2345,30 +2365,10 @@ manager_update_radio_enabled(NMManager *self, NMRfkillType rtype, gboolean enabl } static void -update_rstate_from_rfkill(NMRfkillManager *rfkill_mgr, NMRfkillType rtype, RadioState *rstate) -{ - switch (nm_rfkill_manager_get_rfkill_state(rfkill_mgr, rtype)) { - case NM_RFKILL_STATE_UNBLOCKED: - rstate->sw_enabled = TRUE; - rstate->hw_enabled = TRUE; - return; - case NM_RFKILL_STATE_SOFT_BLOCKED: - rstate->sw_enabled = FALSE; - rstate->hw_enabled = TRUE; - return; - case NM_RFKILL_STATE_HARD_BLOCKED: - rstate->sw_enabled = FALSE; - rstate->hw_enabled = FALSE; - return; - } - nm_assert_not_reached(); -} - -static void -manager_rfkill_update_one_type(NMManager *self, NMRfkillType rtype) +_rfkill_update_one_type(NMManager *self, NMRfkillType rtype) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); - RadioState *rstate = &priv->radio_states[rtype]; + RfkillRadioState *rstate = &priv->radio_states[rtype]; gboolean old_enabled; gboolean new_enabled; gboolean old_rfkilled; @@ -2377,12 +2377,12 @@ manager_rfkill_update_one_type(NMManager *self, NMRfkillType rtype) nm_assert(_NM_INT_NOT_NEGATIVE(rtype) && rtype < G_N_ELEMENTS(priv->radio_states)); - old_enabled = radio_enabled_for_rstate(rstate, TRUE); + old_enabled = _rfkill_radio_state_get_enabled(rstate, TRUE); old_rfkilled = rstate->hw_enabled && rstate->sw_enabled; old_hwe = rstate->hw_enabled; /* recheck kernel rfkill state */ - update_rstate_from_rfkill(priv->rfkill_mgr, rtype, rstate); + _rfkill_radio_state_set_from_manager(priv->rfkill_mgr, rtype, rstate); /* Print out all states affecting device enablement */ _LOGD(LOGD_RFKILL, @@ -2409,25 +2409,144 @@ manager_rfkill_update_one_type(NMManager *self, NMRfkillType rtype) * radio changes and we only want to ignore the daemon enabled state when * handling user radio change requests. */ - new_enabled = radio_enabled_for_rstate(rstate, TRUE); + new_enabled = _rfkill_radio_state_get_enabled(rstate, TRUE); if (new_enabled != old_enabled) - manager_update_radio_enabled(self, rtype, new_enabled); + _rfkill_update_devices(self, rtype, new_enabled); } static void -nm_manager_rfkill_update(NMManager *self, NMRfkillType rtype) +_rfkill_update(NMManager *self, NMRfkillType rtype) { guint i; if (rtype != NM_RFKILL_TYPE_UNKNOWN) - manager_rfkill_update_one_type(self, rtype); + _rfkill_update_one_type(self, rtype); else { /* Otherwise, sync all radio types */ for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) - manager_rfkill_update_one_type(self, i); + _rfkill_update_one_type(self, i); } } +/*****************************************************************************/ + +#define KERN_RFKILL_OP_CHANGE_ALL 3 +#define KERN_RFKILL_TYPE_WLAN 1 +#define KERN_RFKILL_TYPE_WWAN 5 + +struct rfkill_event { + uint32_t idx; + uint8_t type; + uint8_t op; + uint8_t soft; + uint8_t hard; +} _nm_packed; + +static void +_rfkill_update_system(NMManager *self, NMRfkillType rtype, gboolean enabled) +{ + int fd; + struct rfkill_event event; + ssize_t len; + int errsv; + + nm_assert(NM_IN_SET(rtype, NM_RFKILL_TYPE_WLAN, NM_RFKILL_TYPE_WWAN)); + + fd = open("/dev/rfkill", O_RDWR | O_CLOEXEC); + if (fd < 0) { + if (errno == EACCES) + _LOGW(LOGD_RFKILL, + "rfkill: (%s): failed to open killswitch device", + _rfkill_type_desc[rtype].desc); + return; + } + + if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { + _LOGW(LOGD_RFKILL, + "rfkill: (%s): failed to set killswitch device for " + "non-blocking operation", + _rfkill_type_desc[rtype].desc); + nm_close(fd); + return; + } + + memset(&event, 0, sizeof(event)); + event.op = KERN_RFKILL_OP_CHANGE_ALL; + switch (rtype) { + case NM_RFKILL_TYPE_WLAN: + event.type = KERN_RFKILL_TYPE_WLAN; + break; + case NM_RFKILL_TYPE_WWAN: + event.type = KERN_RFKILL_TYPE_WWAN; + break; + default: + nm_assert_not_reached(); + } + event.soft = enabled ? 0 : 1; + + len = write(fd, &event, sizeof(event)); + if (len < 0) { + errsv = errno; + _LOGW(LOGD_RFKILL, + "rfkill: (%s): failed to change Wi-Fi killswitch state: (%d) %s", + _rfkill_type_desc[rtype].desc, + errsv, + nm_strerror_native(errsv)); + } else if (len == sizeof(event)) { + _LOGI(LOGD_RFKILL, + "rfkill: %s hardware radio set %s", + _rfkill_type_desc[rtype].desc, + enabled ? "enabled" : "disabled"); + } else { + /* Failed to write full structure */ + _LOGW(LOGD_RFKILL, + "rfkill: (%s): failed to change Wi-Fi killswitch state", + _rfkill_type_desc[rtype].desc); + } + + nm_close(fd); +} + +static void +_rfkill_update_from_user(NMManager *self, NMRfkillType rtype, gboolean enabled) +{ + NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); + RfkillRadioState *rstate = &priv->radio_states[rtype]; + gboolean old_enabled, new_enabled; + + /* Don't touch devices if asleep/networking disabled */ + if (manager_sleeping(self)) + return; + + _LOGD(LOGD_RFKILL, + "rfkill: (%s): setting radio %s by user", + _rfkill_type_desc[rtype].desc, + enabled ? "enabled" : "disabled"); + + /* Update enabled key in state file */ + nm_config_state_set(priv->config, TRUE, FALSE, _rfkill_type_desc[rtype].key, enabled); + + /* When the user toggles the radio, their request should override any + * daemon (like ModemManager) enabled state that can be changed. For WWAN + * for example, we want the WwanEnabled property to reflect the daemon state + * too so that users can toggle the modem powered, but we don't want that + * daemon state to affect whether or not the user *can* turn it on, which is + * what the kernel rfkill state does. So we ignore daemon enabled state + * when determining what the new state should be since it shouldn't block + * the user's request. + */ + old_enabled = _rfkill_radio_state_get_enabled(rstate, TRUE); + rstate->user_enabled = enabled; + new_enabled = _rfkill_radio_state_get_enabled(rstate, FALSE); + if (new_enabled != old_enabled) { + /* Try to change the kernel rfkill state */ + _rfkill_update_system(self, rtype, new_enabled); + _rfkill_update_devices(self, rtype, new_enabled); + } +} + +/*****************************************************************************/ + static void device_auth_done_cb(NMAuthChain *chain, GDBusMethodInvocation *context, gpointer user_data) { @@ -3313,8 +3432,8 @@ add_device(NMManager *self, NMDevice *device, GError **error) */ rtype = nm_device_get_rfkill_type(device); if (rtype != NM_RFKILL_TYPE_UNKNOWN) { - nm_manager_rfkill_update(self, rtype); - nm_device_set_enabled(device, radio_enabled_for_type(self, rtype, TRUE)); + _rfkill_update(self, rtype); + nm_device_set_enabled(device, _rfkill_radio_state_get(self, rtype)); } iface = nm_device_get_iface(device); @@ -3694,7 +3813,7 @@ rfkill_manager_rfkill_changed_cb(NMRfkillManager *rfkill_mgr, NMRfkillState udev_state, gpointer user_data) { - nm_manager_rfkill_update(NM_MANAGER(user_data), rtype); + _rfkill_update(NM_MANAGER(user_data), rtype); } const CList * @@ -6331,7 +6450,7 @@ do_sleep_wake(NMManager *self, gboolean sleeping_changed) /* Ensure rfkill state is up-to-date since we don't respond to state * changes during sleep. */ - nm_manager_rfkill_update(self, NM_RFKILL_TYPE_UNKNOWN); + _rfkill_update(self, NM_RFKILL_TYPE_UNKNOWN); /* Re-manage managed devices */ c_list_for_each_entry (device, &priv->devices_lst_head, devices_lst) { @@ -6349,9 +6468,9 @@ do_sleep_wake(NMManager *self, gboolean sleeping_changed) * to killswitch changes during sleep. */ for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) { - NMRfkillType rtype = i; - const RadioState *rstate = &priv->radio_states[rtype]; - gboolean enabled = radio_enabled_for_rstate(rstate, TRUE); + const NMRfkillType rtype = i; + const RfkillRadioState *rstate = &priv->radio_states[rtype]; + gboolean enabled = _rfkill_radio_state_get_enabled(rstate, TRUE); _LOGD(LOGD_RFKILL, "rfkill: %s %s devices (hw_enabled %d, sw_enabled %d, user_enabled %d)", @@ -6947,20 +7066,20 @@ nm_manager_start(NMManager *self, GError **error) /* Set initial radio enabled/disabled state */ for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) { - NMRfkillType rtype = i; - RadioState *rstate = &priv->radio_states[rtype]; - gboolean enabled; + const NMRfkillType rtype = i; + RfkillRadioState *rstate = &priv->radio_states[rtype]; + gboolean enabled; /* recheck kernel rfkill state */ - update_rstate_from_rfkill(priv->rfkill_mgr, rtype, rstate); + _rfkill_radio_state_set_from_manager(priv->rfkill_mgr, rtype, rstate); _LOGI(LOGD_RFKILL, "rfkill: %s %s by radio killswitch; %s by state file", _rfkill_type_desc[rtype].desc, (rstate->hw_enabled && rstate->sw_enabled) ? "enabled" : "disabled", rstate->user_enabled ? "enabled" : "disabled"); - enabled = radio_enabled_for_rstate(rstate, TRUE); - manager_update_radio_enabled(self, rtype, enabled); + enabled = _rfkill_radio_state_get_enabled(rstate, TRUE); + _rfkill_update_devices(self, rtype, enabled); } _LOGI(LOGD_CORE, "Networking is %s by state file", priv->net_enabled ? "enabled" : "disabled"); @@ -7601,121 +7720,7 @@ auth_mgr_changed(NMAuthManager *auth_manager, gpointer user_data) "()"); } -#define KERN_RFKILL_OP_CHANGE_ALL 3 -#define KERN_RFKILL_TYPE_WLAN 1 -#define KERN_RFKILL_TYPE_WWAN 5 -struct rfkill_event { - uint32_t idx; - uint8_t type; - uint8_t op; - uint8_t soft; - uint8_t hard; -} _nm_packed; - -static void -rfkill_change(NMManager *self, NMRfkillType rtype, gboolean enabled) -{ - int fd; - struct rfkill_event event; - ssize_t len; - int errsv; - - g_return_if_fail(rtype == NM_RFKILL_TYPE_WLAN || rtype == NM_RFKILL_TYPE_WWAN); - - fd = open("/dev/rfkill", O_RDWR | O_CLOEXEC); - if (fd < 0) { - if (errno == EACCES) - _LOGW(LOGD_RFKILL, - "rfkill: (%s): failed to open killswitch device", - _rfkill_type_desc[rtype].desc); - return; - } - - if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { - _LOGW(LOGD_RFKILL, - "rfkill: (%s): failed to set killswitch device for " - "non-blocking operation", - _rfkill_type_desc[rtype].desc); - nm_close(fd); - return; - } - - memset(&event, 0, sizeof(event)); - event.op = KERN_RFKILL_OP_CHANGE_ALL; - switch (rtype) { - case NM_RFKILL_TYPE_WLAN: - event.type = KERN_RFKILL_TYPE_WLAN; - break; - case NM_RFKILL_TYPE_WWAN: - event.type = KERN_RFKILL_TYPE_WWAN; - break; - default: - g_assert_not_reached(); - } - event.soft = enabled ? 0 : 1; - - len = write(fd, &event, sizeof(event)); - if (len < 0) { - errsv = errno; - _LOGW(LOGD_RFKILL, - "rfkill: (%s): failed to change Wi-Fi killswitch state: (%d) %s", - _rfkill_type_desc[rtype].desc, - errsv, - nm_strerror_native(errsv)); - } else if (len == sizeof(event)) { - _LOGI(LOGD_RFKILL, - "rfkill: %s hardware radio set %s", - _rfkill_type_desc[rtype].desc, - enabled ? "enabled" : "disabled"); - } else { - /* Failed to write full structure */ - _LOGW(LOGD_RFKILL, - "rfkill: (%s): failed to change Wi-Fi killswitch state", - _rfkill_type_desc[rtype].desc); - } - - nm_close(fd); -} - -static void -manager_radio_user_toggled(NMManager *self, NMRfkillType rtype, gboolean enabled) -{ - NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE(self); - RadioState *rstate = &priv->radio_states[rtype]; - gboolean old_enabled, new_enabled; - - /* Don't touch devices if asleep/networking disabled */ - if (manager_sleeping(self)) - return; - - _LOGD(LOGD_RFKILL, - "rfkill: (%s): setting radio %s by user", - _rfkill_type_desc[rtype].desc, - enabled ? "enabled" : "disabled"); - - /* Update enabled key in state file */ - nm_config_state_set(priv->config, TRUE, FALSE, _rfkill_type_desc[rtype].key, enabled); - - /* When the user toggles the radio, their request should override any - * daemon (like ModemManager) enabled state that can be changed. For WWAN - * for example, we want the WwanEnabled property to reflect the daemon state - * too so that users can toggle the modem powered, but we don't want that - * daemon state to affect whether or not the user *can* turn it on, which is - * what the kernel rfkill state does. So we ignore daemon enabled state - * when determining what the new state should be since it shouldn't block - * the user's request. - */ - old_enabled = radio_enabled_for_rstate(rstate, TRUE); - rstate->user_enabled = enabled; - new_enabled = radio_enabled_for_rstate(rstate, FALSE); - if (new_enabled != old_enabled) { - /* Try to change the kernel rfkill state */ - nm_assert(NM_IN_SET(rtype, NM_RFKILL_TYPE_WLAN, NM_RFKILL_TYPE_WWAN)); - rfkill_change(self, rtype, new_enabled); - - manager_update_radio_enabled(self, rtype, new_enabled); - } -} +/*****************************************************************************/ static gboolean periodic_update_active_connection_timestamps(gpointer user_data) @@ -7906,8 +7911,12 @@ constructed(GObject *object) * changes to the WirelessEnabled/WWANEnabled properties which toggle kernel * rfkill. */ - rfkill_change(self, NM_RFKILL_TYPE_WLAN, priv->radio_states[NM_RFKILL_TYPE_WLAN].user_enabled); - rfkill_change(self, NM_RFKILL_TYPE_WWAN, priv->radio_states[NM_RFKILL_TYPE_WWAN].user_enabled); + _rfkill_update_system(self, + NM_RFKILL_TYPE_WLAN, + priv->radio_states[NM_RFKILL_TYPE_WLAN].user_enabled); + _rfkill_update_system(self, + NM_RFKILL_TYPE_WWAN, + priv->radio_states[NM_RFKILL_TYPE_WWAN].user_enabled); } static void @@ -7927,12 +7936,14 @@ nm_manager_init(NMManager *self) priv->capabilities = g_array_new(FALSE, FALSE, sizeof(guint32)); - priv->radio_states[NM_RFKILL_TYPE_WLAN] = (RadioState){ + priv->radio_states[NM_RFKILL_TYPE_WLAN] = (RfkillRadioState){ .user_enabled = TRUE, + .sw_enabled = FALSE, .hw_enabled = TRUE, }; - priv->radio_states[NM_RFKILL_TYPE_WWAN] = (RadioState){ + priv->radio_states[NM_RFKILL_TYPE_WWAN] = (RfkillRadioState){ .user_enabled = TRUE, + .sw_enabled = FALSE, .hw_enabled = TRUE, }; @@ -8006,13 +8017,13 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) g_value_set_boolean(value, priv->net_enabled); break; case PROP_WIRELESS_ENABLED: - g_value_set_boolean(value, radio_enabled_for_type(self, NM_RFKILL_TYPE_WLAN, TRUE)); + g_value_set_boolean(value, _rfkill_radio_state_get(self, NM_RFKILL_TYPE_WLAN)); break; case PROP_WIRELESS_HARDWARE_ENABLED: g_value_set_boolean(value, priv->radio_states[NM_RFKILL_TYPE_WLAN].hw_enabled); break; case PROP_WWAN_ENABLED: - g_value_set_boolean(value, radio_enabled_for_type(self, NM_RFKILL_TYPE_WWAN, TRUE)); + g_value_set_boolean(value, _rfkill_radio_state_get(self, NM_RFKILL_TYPE_WWAN)); break; case PROP_WWAN_HARDWARE_ENABLED: g_value_set_boolean(value, priv->radio_states[NM_RFKILL_TYPE_WWAN].hw_enabled); @@ -8106,14 +8117,14 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps switch (prop_id) { case PROP_WIRELESS_ENABLED: - manager_radio_user_toggled(NM_MANAGER(object), - NM_RFKILL_TYPE_WLAN, - g_value_get_boolean(value)); + _rfkill_update_from_user(NM_MANAGER(object), + NM_RFKILL_TYPE_WLAN, + g_value_get_boolean(value)); break; case PROP_WWAN_ENABLED: - manager_radio_user_toggled(NM_MANAGER(object), - NM_RFKILL_TYPE_WWAN, - g_value_get_boolean(value)); + _rfkill_update_from_user(NM_MANAGER(object), + NM_RFKILL_TYPE_WWAN, + g_value_get_boolean(value)); break; case PROP_WIMAX_ENABLED: /* WIMAX is deprecated. This does nothing. */ From 3b7d861eef74061719434a381c713db082a96b76 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 22:24:45 +0100 Subject: [PATCH 012/118] core/rfkill: use "nm_auto_close" in _rfkill_update_system() to close FD --- src/core/nm-manager.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c index fe1ad5d7b2..60d2badc73 100644 --- a/src/core/nm-manager.c +++ b/src/core/nm-manager.c @@ -2445,7 +2445,7 @@ struct rfkill_event { static void _rfkill_update_system(NMManager *self, NMRfkillType rtype, gboolean enabled) { - int fd; + nm_auto_close int fd = -1; struct rfkill_event event; ssize_t len; int errsv; @@ -2466,7 +2466,6 @@ _rfkill_update_system(NMManager *self, NMRfkillType rtype, gboolean enabled) "rfkill: (%s): failed to set killswitch device for " "non-blocking operation", _rfkill_type_desc[rtype].desc); - nm_close(fd); return; } @@ -2503,8 +2502,6 @@ _rfkill_update_system(NMManager *self, NMRfkillType rtype, gboolean enabled) "rfkill: (%s): failed to change Wi-Fi killswitch state", _rfkill_type_desc[rtype].desc); } - - nm_close(fd); } static void From 6b001b0685a482e7355416e7a5e72124558a5c16 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 22:32:46 +0100 Subject: [PATCH 013/118] core/rfkill: add nm_rfkill_type_to_string() helper --- src/core/nm-manager.c | 23 ++++++++++------------- src/core/nm-rfkill-manager.c | 22 ++++++++++++---------- src/core/nm-rfkill-manager.h | 2 ++ 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c index 60d2badc73..a9cf0c86c5 100644 --- a/src/core/nm-manager.c +++ b/src/core/nm-manager.c @@ -54,7 +54,6 @@ /*****************************************************************************/ typedef struct { - const char *desc; guint prop_id; guint hw_prop_id; NMConfigRunStatePropertyType key; @@ -2283,14 +2282,12 @@ _static_hostname_changed_cb(NMHostnameManager *hostname_manager, GParamSpec *psp static const RfkillTypeDesc _rfkill_type_desc[NM_RFKILL_TYPE_MAX] = { [NM_RFKILL_TYPE_WLAN] = { - .desc = "Wi-Fi", .prop_id = PROP_WIRELESS_ENABLED, .hw_prop_id = PROP_WIRELESS_HARDWARE_ENABLED, .key = NM_CONFIG_STATE_PROPERTY_WIFI_ENABLED, }, [NM_RFKILL_TYPE_WWAN] = { - .desc = "WWAN", .prop_id = PROP_WWAN_ENABLED, .hw_prop_id = PROP_WWAN_HARDWARE_ENABLED, .key = NM_CONFIG_STATE_PROPERTY_WWAN_ENABLED, @@ -2387,7 +2384,7 @@ _rfkill_update_one_type(NMManager *self, NMRfkillType rtype) /* Print out all states affecting device enablement */ _LOGD(LOGD_RFKILL, "rfkill: %s hw-enabled %d sw-enabled %d", - _rfkill_type_desc[rtype].desc, + nm_rfkill_type_to_string(rtype), rstate->hw_enabled, rstate->sw_enabled); @@ -2396,7 +2393,7 @@ _rfkill_update_one_type(NMManager *self, NMRfkillType rtype) if (old_rfkilled != new_rfkilled) { _LOGI(LOGD_RFKILL, "rfkill: %s now %s by radio killswitch", - _rfkill_type_desc[rtype].desc, + nm_rfkill_type_to_string(rtype), new_rfkilled ? "enabled" : "disabled"); } @@ -2457,7 +2454,7 @@ _rfkill_update_system(NMManager *self, NMRfkillType rtype, gboolean enabled) if (errno == EACCES) _LOGW(LOGD_RFKILL, "rfkill: (%s): failed to open killswitch device", - _rfkill_type_desc[rtype].desc); + nm_rfkill_type_to_string(rtype)); return; } @@ -2465,7 +2462,7 @@ _rfkill_update_system(NMManager *self, NMRfkillType rtype, gboolean enabled) _LOGW(LOGD_RFKILL, "rfkill: (%s): failed to set killswitch device for " "non-blocking operation", - _rfkill_type_desc[rtype].desc); + nm_rfkill_type_to_string(rtype)); return; } @@ -2488,19 +2485,19 @@ _rfkill_update_system(NMManager *self, NMRfkillType rtype, gboolean enabled) errsv = errno; _LOGW(LOGD_RFKILL, "rfkill: (%s): failed to change Wi-Fi killswitch state: (%d) %s", - _rfkill_type_desc[rtype].desc, + nm_rfkill_type_to_string(rtype), errsv, nm_strerror_native(errsv)); } else if (len == sizeof(event)) { _LOGI(LOGD_RFKILL, "rfkill: %s hardware radio set %s", - _rfkill_type_desc[rtype].desc, + nm_rfkill_type_to_string(rtype), enabled ? "enabled" : "disabled"); } else { /* Failed to write full structure */ _LOGW(LOGD_RFKILL, "rfkill: (%s): failed to change Wi-Fi killswitch state", - _rfkill_type_desc[rtype].desc); + nm_rfkill_type_to_string(rtype)); } } @@ -2517,7 +2514,7 @@ _rfkill_update_from_user(NMManager *self, NMRfkillType rtype, gboolean enabled) _LOGD(LOGD_RFKILL, "rfkill: (%s): setting radio %s by user", - _rfkill_type_desc[rtype].desc, + nm_rfkill_type_to_string(rtype), enabled ? "enabled" : "disabled"); /* Update enabled key in state file */ @@ -6472,7 +6469,7 @@ do_sleep_wake(NMManager *self, gboolean sleeping_changed) _LOGD(LOGD_RFKILL, "rfkill: %s %s devices (hw_enabled %d, sw_enabled %d, user_enabled %d)", enabled ? "enabling" : "disabling", - _rfkill_type_desc[rtype].desc, + nm_rfkill_type_to_string(rtype), rstate->hw_enabled, rstate->sw_enabled, rstate->user_enabled); @@ -7072,7 +7069,7 @@ nm_manager_start(NMManager *self, GError **error) _LOGI(LOGD_RFKILL, "rfkill: %s %s by radio killswitch; %s by state file", - _rfkill_type_desc[rtype].desc, + nm_rfkill_type_to_string(rtype), (rstate->hw_enabled && rstate->sw_enabled) ? "enabled" : "disabled", rstate->user_enabled ? "enabled" : "disabled"); enabled = _rfkill_radio_state_get_enabled(rstate, TRUE); diff --git a/src/core/nm-rfkill-manager.c b/src/core/nm-rfkill-manager.c index 9bffdd3c3a..9dcc9fb866 100644 --- a/src/core/nm-rfkill-manager.c +++ b/src/core/nm-rfkill-manager.c @@ -63,16 +63,18 @@ nm_rfkill_manager_get_rfkill_state(NMRfkillManager *self, NMRfkillType rtype) return NM_RFKILL_MANAGER_GET_PRIVATE(self)->rfkill_states[rtype]; } -static const char * -rfkill_type_to_desc(NMRfkillType rtype) +const char * +nm_rfkill_type_to_string(NMRfkillType type) { - if (rtype == 0) + switch (type) { + case NM_RFKILL_TYPE_WLAN: return "Wi-Fi"; - else if (rtype == 1) + case NM_RFKILL_TYPE_WWAN: return "WWAN"; - else if (rtype == 2) - return "WiMAX"; - return "unknown"; + case NM_RFKILL_TYPE_UNKNOWN: + break; + } + return nm_assert_unreachable_val("unknown"); } static const char * @@ -196,7 +198,7 @@ recheck_killswitches(NMRfkillManager *self) nm_log_dbg(LOGD_RFKILL, "%s rfkill%s switch %s state now %d/%u", - rfkill_type_to_desc(ks->rtype), + nm_rfkill_type_to_string(ks->rtype), ks->platform ? " platform" : "", ks->name, sysfs_state, @@ -226,7 +228,7 @@ recheck_killswitches(NMRfkillManager *self) if (poll_states[i] != priv->rfkill_states[i]) { nm_log_dbg(LOGD_RFKILL, "%s rfkill state now '%s'", - rfkill_type_to_desc(i), + nm_rfkill_type_to_string(i), rfkill_state_to_desc(poll_states[i])); priv->rfkill_states[i] = poll_states[i]; @@ -284,7 +286,7 @@ add_one_killswitch(NMRfkillManager *self, struct udev_device *device) nm_log_info(LOGD_RFKILL, "%s: found %s radio killswitch (at %s) (%sdriver %s)", ks->name, - rfkill_type_to_desc(rtype), + nm_rfkill_type_to_string(rtype), ks->path, ks->platform ? "platform " : "", ks->driver ?: ""); diff --git a/src/core/nm-rfkill-manager.h b/src/core/nm-rfkill-manager.h index b1de831c0e..db1385ea6a 100644 --- a/src/core/nm-rfkill-manager.h +++ b/src/core/nm-rfkill-manager.h @@ -25,6 +25,8 @@ typedef enum { NM_RFKILL_TYPE_MAX = NM_RFKILL_TYPE_UNKNOWN, } NMRfkillType; +const char *nm_rfkill_type_to_string(NMRfkillType rtype); + #define NM_TYPE_RFKILL_MANAGER (nm_rfkill_manager_get_type()) #define NM_RFKILL_MANAGER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_RFKILL_MANAGER, NMRfkillManager)) From a19ca08bcf26425ba5e064deb03ac56562518b1b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 22:38:26 +0100 Subject: [PATCH 014/118] core/rfkill: rename rfkill_state_to_desc() to nm_rfkill_state_to_string() --- src/core/nm-rfkill-manager.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/core/nm-rfkill-manager.c b/src/core/nm-rfkill-manager.c index 9dcc9fb866..287c0e6b11 100644 --- a/src/core/nm-rfkill-manager.c +++ b/src/core/nm-rfkill-manager.c @@ -78,15 +78,17 @@ nm_rfkill_type_to_string(NMRfkillType type) } static const char * -rfkill_state_to_desc(NMRfkillState rstate) +nm_rfkill_state_to_string(NMRfkillState state) { - if (rstate == 0) + switch (state) { + case NM_RFKILL_STATE_UNBLOCKED: return "unblocked"; - else if (rstate == 1) + case NM_RFKILL_STATE_SOFT_BLOCKED: return "soft-blocked"; - else if (rstate == 2) + case NM_RFKILL_STATE_HARD_BLOCKED: return "hard-blocked"; - return "unknown"; + } + return nm_assert_unreachable_val("unknown"); } static Killswitch * @@ -229,7 +231,7 @@ recheck_killswitches(NMRfkillManager *self) nm_log_dbg(LOGD_RFKILL, "%s rfkill state now '%s'", nm_rfkill_type_to_string(i), - rfkill_state_to_desc(poll_states[i])); + nm_rfkill_state_to_string(poll_states[i])); priv->rfkill_states[i] = poll_states[i]; g_signal_emit(self, signals[RFKILL_CHANGED], 0, i, priv->rfkill_states[i]); From 96abd25c72b6a089a34f2c2d2bf7c6f2ae7a125a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 22:41:27 +0100 Subject: [PATCH 015/118] core/rfkill: don't assert for valid string in rfkill_type_to_enum() "str" comes from udev. This is not a trusted component, and we must not assert for valid input. --- src/core/nm-rfkill-manager.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/core/nm-rfkill-manager.c b/src/core/nm-rfkill-manager.c index 287c0e6b11..4f89bd40b3 100644 --- a/src/core/nm-rfkill-manager.c +++ b/src/core/nm-rfkill-manager.c @@ -259,12 +259,12 @@ killswitch_find_by_name(NMRfkillManager *self, const char *name) static NMRfkillType rfkill_type_to_enum(const char *str) { - g_return_val_if_fail(str != NULL, NM_RFKILL_TYPE_UNKNOWN); - - if (!strcmp(str, "wlan")) - return NM_RFKILL_TYPE_WLAN; - else if (!strcmp(str, "wwan")) - return NM_RFKILL_TYPE_WWAN; + if (str) { + if (nm_streq(str, "wlan")) + return NM_RFKILL_TYPE_WLAN; + if (nm_streq(str, "wwan")) + return NM_RFKILL_TYPE_WWAN; + } return NM_RFKILL_TYPE_UNKNOWN; } @@ -273,12 +273,10 @@ static void add_one_killswitch(NMRfkillManager *self, struct udev_device *device) { NMRfkillManagerPrivate *priv = NM_RFKILL_MANAGER_GET_PRIVATE(self); - const char *str_type; NMRfkillType rtype; Killswitch *ks; - str_type = udev_device_get_property_value(device, "RFKILL_TYPE"); - rtype = rfkill_type_to_enum(str_type); + rtype = rfkill_type_to_enum(udev_device_get_property_value(device, "RFKILL_TYPE")); if (rtype == NM_RFKILL_TYPE_UNKNOWN) return; From bc7a3870720db072119c3e011e66c6efbace767f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 22:46:27 +0100 Subject: [PATCH 016/118] core/rfkill: cleanup initializing Killswitch struct - use slice allocator - use designated initializers - first determine all parameters in killswitch_new() before setting ks. - drop unnecessary memset(). --- src/core/nm-rfkill-manager.c | 42 ++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/core/nm-rfkill-manager.c b/src/core/nm-rfkill-manager.c index 4f89bd40b3..adf67f066c 100644 --- a/src/core/nm-rfkill-manager.c +++ b/src/core/nm-rfkill-manager.c @@ -46,12 +46,12 @@ G_DEFINE_TYPE(NMRfkillManager, nm_rfkill_manager, G_TYPE_OBJECT) typedef struct { char *name; - guint64 seqnum; char *path; char *driver; + guint64 seqnum; NMRfkillType rtype; int state; - gboolean platform; + bool platform : 1; } Killswitch; NMRfkillState @@ -95,14 +95,12 @@ static Killswitch * killswitch_new(struct udev_device *device, NMRfkillType rtype) { Killswitch *ks; - struct udev_device *parent = NULL, *grandparent = NULL; - const char *driver, *subsys, *parent_subsys = NULL; - - ks = g_malloc0(sizeof(Killswitch)); - ks->name = g_strdup(udev_device_get_sysname(device)); - ks->seqnum = udev_device_get_seqnum(device); - ks->path = g_strdup(udev_device_get_syspath(device)); - ks->rtype = rtype; + struct udev_device *parent = NULL; + struct udev_device *grandparent = NULL; + const char *driver; + const char *subsys; + const char *parent_subsys = NULL; + gboolean platform; driver = udev_device_get_property_value(device, "DRIVER"); subsys = udev_device_get_subsystem(device); @@ -120,14 +118,23 @@ killswitch_new(struct udev_device *device, NMRfkillType rtype) driver = udev_device_get_property_value(grandparent, "DRIVER"); } } - if (!driver) driver = "(unknown)"; - ks->driver = g_strdup(driver); - if (g_strcmp0(subsys, "platform") == 0 || g_strcmp0(parent_subsys, "platform") == 0 - || g_strcmp0(subsys, "acpi") == 0 || g_strcmp0(parent_subsys, "acpi") == 0) - ks->platform = TRUE; + platform = FALSE; + if (nm_streq0(subsys, "platform") || nm_streq0(parent_subsys, "platform") + || nm_streq0(subsys, "acpi") || nm_streq0(parent_subsys, "acpi")) + platform = TRUE; + + ks = g_slice_new(Killswitch); + *ks = (Killswitch){ + .name = g_strdup(udev_device_get_sysname(device)), + .seqnum = udev_device_get_seqnum(device), + .path = g_strdup(udev_device_get_syspath(device)), + .rtype = rtype, + .driver = g_strdup(driver), + .platform = platform, + }; return ks; } @@ -135,13 +142,10 @@ killswitch_new(struct udev_device *device, NMRfkillType rtype) static void killswitch_destroy(Killswitch *ks) { - g_return_if_fail(ks != NULL); - g_free(ks->name); g_free(ks->path); g_free(ks->driver); - memset(ks, 0, sizeof(Killswitch)); - g_free(ks); + nm_g_slice_free(ks); } static NMRfkillState From e3e17f0b4b8691c5a9aa3c63eb23e9e6531827c0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 22:55:15 +0100 Subject: [PATCH 017/118] core/rfkill: use CList to track Rfkill killswitches GSList is almost always the wrong choice. We can just embed the next pointers in the structure using the intrusive CList. --- src/core/nm-rfkill-manager.c | 50 +++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/core/nm-rfkill-manager.c b/src/core/nm-rfkill-manager.c index adf67f066c..2106128c6c 100644 --- a/src/core/nm-rfkill-manager.c +++ b/src/core/nm-rfkill-manager.c @@ -9,6 +9,7 @@ #include +#include "c-list/src/c-list.h" #include "libnm-udev-aux/nm-udev-utils.h" /*****************************************************************************/ @@ -25,7 +26,8 @@ typedef struct { /* Authoritative rfkill state (RFKILL_* enum) */ NMRfkillState rfkill_states[NM_RFKILL_TYPE_MAX]; - GSList *killswitches; + + CList killswitch_lst_head; } NMRfkillManagerPrivate; struct _NMRfkillManager { @@ -45,6 +47,7 @@ G_DEFINE_TYPE(NMRfkillManager, nm_rfkill_manager, G_TYPE_OBJECT) /*****************************************************************************/ typedef struct { + CList killswitch_lst; char *name; char *path; char *driver; @@ -142,6 +145,7 @@ killswitch_new(struct udev_device *device, NMRfkillType rtype) static void killswitch_destroy(Killswitch *ks) { + c_list_unlink_stale(&ks->killswitch_lst); g_free(ks->name); g_free(ks->path); g_free(ks->driver); @@ -169,7 +173,7 @@ static void recheck_killswitches(NMRfkillManager *self) { NMRfkillManagerPrivate *priv = NM_RFKILL_MANAGER_GET_PRIVATE(self); - GSList *iter; + Killswitch *ks; NMRfkillState poll_states[NM_RFKILL_TYPE_MAX]; NMRfkillState platform_states[NM_RFKILL_TYPE_MAX]; gboolean platform_checked[NM_RFKILL_TYPE_MAX]; @@ -183,8 +187,7 @@ recheck_killswitches(NMRfkillManager *self) } /* Poll the states of all killswitches */ - for (iter = priv->killswitches; iter; iter = g_slist_next(iter)) { - Killswitch *ks = iter->data; + c_list_for_each_entry (ks, &priv->killswitch_lst_head, killswitch_lst) { struct udev_device *device; NMRfkillState dev_state; int sysfs_state; @@ -218,6 +221,7 @@ recheck_killswitches(NMRfkillManager *self) if (dev_state > platform_states[ks->rtype]) platform_states[ks->rtype] = dev_state; } + udev_device_unref(device); } @@ -247,15 +251,13 @@ static Killswitch * killswitch_find_by_name(NMRfkillManager *self, const char *name) { NMRfkillManagerPrivate *priv = NM_RFKILL_MANAGER_GET_PRIVATE(self); - GSList *iter; + Killswitch *ks; - g_return_val_if_fail(name != NULL, NULL); + nm_assert(name); - for (iter = priv->killswitches; iter; iter = g_slist_next(iter)) { - Killswitch *candidate = iter->data; - - if (!strcmp(name, candidate->name)) - return candidate; + c_list_for_each_entry (ks, &priv->killswitch_lst_head, killswitch_lst) { + if (nm_streq(name, ks->name)) + return ks; } return NULL; } @@ -284,8 +286,8 @@ add_one_killswitch(NMRfkillManager *self, struct udev_device *device) if (rtype == NM_RFKILL_TYPE_UNKNOWN) return; - ks = killswitch_new(device, rtype); - priv->killswitches = g_slist_prepend(priv->killswitches, ks); + ks = killswitch_new(device, rtype); + c_list_link_front(&priv->killswitch_lst_head, &ks->killswitch_lst); nm_log_info(LOGD_RFKILL, "%s: found %s radio killswitch (at %s) (%sdriver %s)", @@ -313,21 +315,20 @@ static void rfkill_remove(NMRfkillManager *self, struct udev_device *device) { NMRfkillManagerPrivate *priv = NM_RFKILL_MANAGER_GET_PRIVATE(self); - GSList *iter; + Killswitch *ks; const char *name; g_return_if_fail(device != NULL); + name = udev_device_get_sysname(device); + g_return_if_fail(name != NULL); - for (iter = priv->killswitches; iter; iter = g_slist_next(iter)) { - Killswitch *ks = iter->data; - - if (!strcmp(ks->name, name)) { + c_list_for_each_entry (ks, &priv->killswitch_lst_head, killswitch_lst) { + if (nm_streq(ks->name, name)) { nm_log_info(LOGD_RFKILL, "radio killswitch %s disappeared", ks->path); - priv->killswitches = g_slist_remove(priv->killswitches, ks); killswitch_destroy(ks); - break; + return; } } } @@ -370,6 +371,8 @@ nm_rfkill_manager_init(NMRfkillManager *self) struct udev_list_entry *iter; guint i; + c_list_init(&priv->killswitch_lst_head); + for (i = 0; i < NM_RFKILL_TYPE_MAX; i++) priv->rfkill_states[i] = NM_RFKILL_STATE_UNBLOCKED; @@ -405,11 +408,10 @@ dispose(GObject *object) { NMRfkillManager *self = NM_RFKILL_MANAGER(object); NMRfkillManagerPrivate *priv = NM_RFKILL_MANAGER_GET_PRIVATE(self); + Killswitch *ks; - if (priv->killswitches) { - g_slist_free_full(priv->killswitches, (GDestroyNotify) killswitch_destroy); - priv->killswitches = NULL; - } + while ((ks = c_list_first_entry(&priv->killswitch_lst_head, Killswitch, killswitch_lst))) + killswitch_destroy(ks); priv->udev_client = nm_udev_client_destroy(priv->udev_client); From aa15ec6090706cfe9a3de905131f56a6cbc5f443 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 23:00:58 +0100 Subject: [PATCH 018/118] core/rfkill: use nm_streq() in "nm-rfkill-manager.c" --- src/core/nm-rfkill-manager.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/core/nm-rfkill-manager.c b/src/core/nm-rfkill-manager.c index 2106128c6c..87646227f2 100644 --- a/src/core/nm-rfkill-manager.c +++ b/src/core/nm-rfkill-manager.c @@ -305,6 +305,7 @@ rfkill_add(NMRfkillManager *self, struct udev_device *device) g_return_if_fail(device != NULL); name = udev_device_get_sysname(device); + g_return_if_fail(name != NULL); if (!killswitch_find_by_name(self, name)) @@ -346,16 +347,16 @@ handle_uevent(NMUdevClient *client, struct udev_device *device, gpointer user_da /* A bit paranoid */ subsys = udev_device_get_subsystem(device); - g_return_if_fail(!g_strcmp0(subsys, "rfkill")); + g_return_if_fail(nm_streq0(subsys, "rfkill")); nm_log_dbg(LOGD_PLATFORM, "udev rfkill event: action '%s' device '%s'", action, udev_device_get_sysname(device)); - if (!strcmp(action, "add")) + if (nm_streq(action, "add")) rfkill_add(self, device); - else if (!strcmp(action, "remove")) + else if (nm_streq(action, "remove")) rfkill_remove(self, device); recheck_killswitches(self); From 26e9deb831b352c0ffd7d6542fe1ad59f667797c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 12:04:27 +0100 Subject: [PATCH 019/118] core/rfkill: cleanup arguments for "rfkill-changed" signal The signal parameters are G_TYPE_UINT. We should not assume that our enums are a compatible integer type. In practice of course they always were. Let's just be clear about when we have an integer and when we have an enum. --- src/core/nm-manager.c | 10 ++++++---- src/core/nm-rfkill-manager.c | 10 +++++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c index a9cf0c86c5..003552bc47 100644 --- a/src/core/nm-manager.c +++ b/src/core/nm-manager.c @@ -3802,11 +3802,13 @@ platform_query_devices(NMManager *self) } static void -rfkill_manager_rfkill_changed_cb(NMRfkillManager *rfkill_mgr, - NMRfkillType rtype, - NMRfkillState udev_state, - gpointer user_data) +rfkill_manager_rfkill_changed_cb(NMRfkillManager *rfkill_mgr, + /* NMRfkillType */ guint rtype, + /* NMRfkillState */ guint udev_state, + gpointer user_data) { + nm_assert(rtype < NM_RFKILL_TYPE_MAX); + _rfkill_update(NM_MANAGER(user_data), rtype); } diff --git a/src/core/nm-rfkill-manager.c b/src/core/nm-rfkill-manager.c index 87646227f2..bb6dcfd72c 100644 --- a/src/core/nm-rfkill-manager.c +++ b/src/core/nm-rfkill-manager.c @@ -242,7 +242,11 @@ recheck_killswitches(NMRfkillManager *self) nm_rfkill_state_to_string(poll_states[i])); priv->rfkill_states[i] = poll_states[i]; - g_signal_emit(self, signals[RFKILL_CHANGED], 0, i, priv->rfkill_states[i]); + g_signal_emit(self, + signals[RFKILL_CHANGED], + 0, + (guint) i, + (guint) priv->rfkill_states[i]); } } } @@ -435,6 +439,6 @@ nm_rfkill_manager_class_init(NMRfkillManagerClass *klass) NULL, G_TYPE_NONE, 2, - G_TYPE_UINT, - G_TYPE_UINT); + G_TYPE_UINT /* NMRfkillType */, + G_TYPE_UINT /* NMRfkillState */); } From 3b67b7768df3ab8ad57401f5626310a1e26f4917 Mon Sep 17 00:00:00 2001 From: Val Och Date: Wed, 9 Feb 2022 13:32:54 +0000 Subject: [PATCH 020/118] libnm: fix nm_client_add_and_activate_connection2_finish annotation Mark out_result as out argument. Fixes an issue when using libnm bindings. Fixes: fbb038af5e5d ('all: return output dictionary from "AddAndActivate2"') https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1092 --- src/libnm-client-impl/nm-client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libnm-client-impl/nm-client.c b/src/libnm-client-impl/nm-client.c index d27e4d5bc2..2cf12db593 100644 --- a/src/libnm-client-impl/nm-client.c +++ b/src/libnm-client-impl/nm-client.c @@ -5365,7 +5365,7 @@ nm_client_add_and_activate_connection2(NMClient *client, * @client: an #NMClient * @result: the result passed to the #GAsyncReadyCallback * @error: location for a #GError, or %NULL - * @out_result: (allow-none) (transfer full): the output result + * @out_result: (allow-none) (transfer full) (out): the output result * of type "a{sv}" returned by D-Bus' AddAndActivate2 call. Currently, no * output is implemented yet. * From 16a45d07ed1d42af2792bd80efd39bf412bd7d26 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 8 Feb 2022 16:43:22 +0100 Subject: [PATCH 021/118] priv-helper: fix D-Bus patch to not contain forbidden character '-' "-" is not allowed as D-Bus path and interface name, and discouraged as bus name. This cause nm-priv-helper to crash, because GDBus asserts the the object path is valid. Replace the '-' with '_'. This way, it's consistent with "nm_dispatcher". Fixes: d68ab6b8f02a ('nm-sudo: rename to nm-priv-helper') --- .gitignore | 3 ++- Makefile.am | 8 ++++---- contrib/fedora/rpm/NetworkManager.spec | 2 +- data/nm-priv-helper.service.in | 4 ++-- src/libnm-base/nm-priv-helper-utils.h | 6 +++--- src/nm-priv-helper/meson.build | 2 +- src/nm-priv-helper/nm-priv-helper.conf | 8 ++++---- .../org.freedesktop.nm-priv-helper.service.in | 5 ----- .../org.freedesktop.nm_priv_helper.service.in | 5 +++++ 9 files changed, 22 insertions(+), 21 deletions(-) delete mode 100644 src/nm-priv-helper/org.freedesktop.nm-priv-helper.service.in create mode 100644 src/nm-priv-helper/org.freedesktop.nm_priv_helper.service.in diff --git a/.gitignore b/.gitignore index d4e172c0c6..34d5af178f 100644 --- a/.gitignore +++ b/.gitignore @@ -72,7 +72,7 @@ test-*.trs /src/nm-dispatcher/tests/test-dispatcher-envp /src/nm-priv-helper/nm-priv-helper -/src/nm-priv-helper/org.freedesktop.nm-priv-helper.service +/src/nm-priv-helper/org.freedesktop.nm_priv_helper.service /data/NetworkManager.service /data/NetworkManager-wait-online.service @@ -437,6 +437,7 @@ test-*.trs /src/ndisc/tests/test-ndisc-linux /src/nm-daemon-helper/nm-daemon-helper /src/nm-iface-helper +/src/nm-priv-helper/org.freedesktop.nm-priv-helper.service /src/nm-sudo/nm-sudo /src/nm-sudo/org.freedesktop.nm.sudo.service /src/platform/tests/dump diff --git a/Makefile.am b/Makefile.am index ed4ffb0455..bc8dc4cf27 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4595,19 +4595,19 @@ src_nm_priv_helper_nm_priv_helper_LDADD = \ $(GLIB_LIBS) \ $(NULL) -src/nm-priv-helper/org.freedesktop.nm-priv-helper.service: $(srcdir)/src/nm-priv-helper/org.freedesktop.nm-priv-helper.service.in +src/nm-priv-helper/org.freedesktop.nm_priv_helper.service: $(srcdir)/src/nm-priv-helper/org.freedesktop.nm_priv_helper.service.in @sed \ -e 's|@libexecdir[@]|$(libexecdir)|g' \ $< >$@ -dbusactivation_DATA += src/nm-priv-helper/org.freedesktop.nm-priv-helper.service -CLEANFILES += src/nm-priv-helper/org.freedesktop.nm-priv-helper.service +dbusactivation_DATA += src/nm-priv-helper/org.freedesktop.nm_priv_helper.service +CLEANFILES += src/nm-priv-helper/org.freedesktop.nm_priv_helper.service dbusservice_DATA += src/nm-priv-helper/nm-priv-helper.conf EXTRA_DIST += \ src/nm-priv-helper/nm-priv-helper.conf \ - src/nm-priv-helper/org.freedesktop.nm-priv-helper.service.in \ + src/nm-priv-helper/org.freedesktop.nm_priv_helper.service.in \ src/nm-priv-helper/meson.build \ $(NULL) diff --git a/contrib/fedora/rpm/NetworkManager.spec b/contrib/fedora/rpm/NetworkManager.spec index 602b2213ae..83d1f6deb0 100644 --- a/contrib/fedora/rpm/NetworkManager.spec +++ b/contrib/fedora/rpm/NetworkManager.spec @@ -1047,7 +1047,7 @@ fi %dir %{_localstatedir}/lib/NetworkManager %dir %{_sysconfdir}/sysconfig/network-scripts %{_datadir}/dbus-1/system-services/org.freedesktop.nm_dispatcher.service -%{_datadir}/dbus-1/system-services/org.freedesktop.nm-priv-helper.service +%{_datadir}/dbus-1/system-services/org.freedesktop.nm_priv_helper.service %{_datadir}/polkit-1/actions/*.policy %{_prefix}/lib/udev/rules.d/*.rules %if %{with firewalld_zone} diff --git a/data/nm-priv-helper.service.in b/data/nm-priv-helper.service.in index aa028e6c1d..df2868f527 100644 --- a/data/nm-priv-helper.service.in +++ b/data/nm-priv-helper.service.in @@ -18,7 +18,7 @@ Description=NetworkManager Privileged Helper [Service] Type=dbus -BusName=org.freedesktop.nm-priv-helper +BusName=org.freedesktop.nm_priv_helper ExecStart=@libexecdir@/nm-priv-helper NotifyAccess=main @@ -76,4 +76,4 @@ SystemCallFilter=@resources [Install] -Alias=dbus-org.freedesktop.nm-priv-helper.service +Alias=dbus-org.freedesktop.nm_priv_helper.service diff --git a/src/libnm-base/nm-priv-helper-utils.h b/src/libnm-base/nm-priv-helper-utils.h index 22387cff46..f866dd7066 100644 --- a/src/libnm-base/nm-priv-helper-utils.h +++ b/src/libnm-base/nm-priv-helper-utils.h @@ -5,9 +5,9 @@ /*****************************************************************************/ -#define NM_PRIV_HELPER_DBUS_BUS_NAME "org.freedesktop.nm-priv-helper" -#define NM_PRIV_HELPER_DBUS_OBJECT_PATH "/org/freedesktop/nm-priv-helper" -#define NM_PRIV_HELPER_DBUS_IFACE_NAME "org.freedesktop.nm-priv-helper" +#define NM_PRIV_HELPER_DBUS_BUS_NAME "org.freedesktop.nm_priv_helper" +#define NM_PRIV_HELPER_DBUS_OBJECT_PATH "/org/freedesktop/nm_priv_helper" +#define NM_PRIV_HELPER_DBUS_IFACE_NAME "org.freedesktop.nm_priv_helper" /*****************************************************************************/ diff --git a/src/nm-priv-helper/meson.build b/src/nm-priv-helper/meson.build index e9f8a7c3e1..6141e0e207 100644 --- a/src/nm-priv-helper/meson.build +++ b/src/nm-priv-helper/meson.build @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later configure_file( - input: 'org.freedesktop.nm-priv-helper.service.in', + input: 'org.freedesktop.nm_priv_helper.service.in', output: '@BASENAME@', install_dir: dbus_system_bus_services_dir, configuration: data_conf, diff --git a/src/nm-priv-helper/nm-priv-helper.conf b/src/nm-priv-helper/nm-priv-helper.conf index c56b20077e..c0d046178b 100644 --- a/src/nm-priv-helper/nm-priv-helper.conf +++ b/src/nm-priv-helper/nm-priv-helper.conf @@ -3,11 +3,11 @@ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> - - + + - - + + diff --git a/src/nm-priv-helper/org.freedesktop.nm-priv-helper.service.in b/src/nm-priv-helper/org.freedesktop.nm-priv-helper.service.in deleted file mode 100644 index 0ca3066922..0000000000 --- a/src/nm-priv-helper/org.freedesktop.nm-priv-helper.service.in +++ /dev/null @@ -1,5 +0,0 @@ -[D-BUS Service] -Name=org.freedesktop.nm-priv-helper -Exec=@libexecdir@/nm-priv-helper -User=root -SystemdService=dbus-org.freedesktop.nm-priv-helper.service diff --git a/src/nm-priv-helper/org.freedesktop.nm_priv_helper.service.in b/src/nm-priv-helper/org.freedesktop.nm_priv_helper.service.in new file mode 100644 index 0000000000..5e2c5e1dc4 --- /dev/null +++ b/src/nm-priv-helper/org.freedesktop.nm_priv_helper.service.in @@ -0,0 +1,5 @@ +[D-BUS Service] +Name=org.freedesktop.nm_priv_helper +Exec=@libexecdir@/nm-priv-helper +User=root +SystemdService=dbus-org.freedesktop.nm_priv_helper.service From d849807521cab8118d2d088b1619e9858f1f30d2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 8 Feb 2022 21:21:42 +0100 Subject: [PATCH 022/118] priv-helper: remove D-Bus Alias for "nm-priv-helper.service" In systemd, it's common that a D-Bus activatable service references `SystemdService=dbus-$BUSNAME.service` instead the real service name. Together with an `[Install].Alias=dbus-$BUSNAME.service` directive, this allowed to enable/disable D-Bus activation without uninstalling the service altogether ([1]). Currently, when we install the RPM then `nm-priv-helper.service` is not enabled, consequently the alias is not created, and D-Bus activation does not work. I guess, we should fix that by enabling the service in the %post section or via a systemd preset? Dunno. Anyway. It seems that nm-priv-helper.service is more of an implementation detail of NetworkManager. It makes not sense for the user to interact directly, or to enable/disable D-Bus activation (because that is how it works). So, drop the alias. See-also: [1] https://docs.fedoraproject.org/en-US/packaging-guidelines/Systemd/#activation_dbus --- data/nm-priv-helper.service.in | 4 ---- src/nm-priv-helper/org.freedesktop.nm_priv_helper.service.in | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/data/nm-priv-helper.service.in b/data/nm-priv-helper.service.in index df2868f527..7b083bbb21 100644 --- a/data/nm-priv-helper.service.in +++ b/data/nm-priv-helper.service.in @@ -73,7 +73,3 @@ CapabilityBoundingSet=CAP_DAC_OVERRIDE PrivateUsers=no RestrictAddressFamilies=AF_UNIX SystemCallFilter=@resources - - -[Install] -Alias=dbus-org.freedesktop.nm_priv_helper.service diff --git a/src/nm-priv-helper/org.freedesktop.nm_priv_helper.service.in b/src/nm-priv-helper/org.freedesktop.nm_priv_helper.service.in index 5e2c5e1dc4..9e86a635b2 100644 --- a/src/nm-priv-helper/org.freedesktop.nm_priv_helper.service.in +++ b/src/nm-priv-helper/org.freedesktop.nm_priv_helper.service.in @@ -2,4 +2,4 @@ Name=org.freedesktop.nm_priv_helper Exec=@libexecdir@/nm-priv-helper User=root -SystemdService=dbus-org.freedesktop.nm_priv_helper.service +SystemdService=nm-priv-helper.service From f65747f6e9edc4a6d01d8825e6c6bc3da284c6b9 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 3 Feb 2022 22:23:44 +0100 Subject: [PATCH 023/118] tests: let "run-nm-test.sh" fail with exit code 1 on failure `git bisect run` is peculiar about the exit code: error: bisect run failed: exit code 134 from '...' is < 0 or >= 128 If we just "exec" the test, it usually will fail on an assert. That results in SIGABRT or exit code 134. So out of the box that is annoying with git-bisect. Work around that and let the test wrapper always coerce any test failure to exit code 1. --- tools/run-nm-test.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/run-nm-test.sh b/tools/run-nm-test.sh index b1d3dd939a..59a489332a 100755 --- a/tools/run-nm-test.sh +++ b/tools/run-nm-test.sh @@ -300,9 +300,10 @@ fi if ! _is_true "$NMTST_USE_VALGRIND" 0; then export NM_TEST_UNDER_VALGRIND=0 - exec "${NMTST_DBUS_RUN_SESSION[@]}" \ - "$TEST" "${TEST_ARGV[@]}" - die "exec \"$TEST\" failed" + "${NMTST_DBUS_RUN_SESSION[@]}" "$TEST" "${TEST_ARGV[@]}" + r=$? + [ $r == 0 ] || die "exec \"$TEST\" failed with exit code $r" + exit 0 fi if [[ -z "${NMTST_VALGRIND}" ]]; then From 6208a1bb8456f5649bf7ffb8d8d20cbe62bfd4aa Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 3 Feb 2022 22:49:37 +0100 Subject: [PATCH 024/118] libnm: reorder fields in NMIPAddress/NMIPRoute struct Order the fields by their size, to minimize the alignment gaps. I guess, that doesn't matter because the alignment of the heap allocation is larger than what we can safe here. Still, there is on reason to do it any other way. Also, it's not possible via API to set family/prefix to values outside their range, so an 8bit integer is always sufficient. And we don't want that invariant to change. We don't ever want to allow the caller to set values that are clearly invalid, and will assert against that early (g_return()). Point is, we can do this and there is no danger of future problems. And even if we will support larger values, it's all an implementation detail anyway. --- src/libnm-core-impl/nm-setting-ip-config.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/libnm-core-impl/nm-setting-ip-config.c b/src/libnm-core-impl/nm-setting-ip-config.c index 0dc0a58610..1dbf92537e 100644 --- a/src/libnm-core-impl/nm-setting-ip-config.c +++ b/src/libnm-core-impl/nm-setting-ip-config.c @@ -169,9 +169,10 @@ G_DEFINE_BOXED_TYPE(NMIPAddress, nm_ip_address, nm_ip_address_dup, nm_ip_address struct NMIPAddress { guint refcount; - char *address; - int prefix, family; + gint8 family; + guint8 prefix; + char *address; GHashTable *attributes; }; @@ -608,13 +609,14 @@ G_DEFINE_BOXED_TYPE(NMIPRoute, nm_ip_route, nm_ip_route_dup, nm_ip_route_unref) struct NMIPRoute { guint refcount; - int family; - char *dest; - guint prefix; - char *next_hop; - gint64 metric; + gint8 family; + guint8 prefix; + char *dest; + char *next_hop; GHashTable *attributes; + + gint64 metric; }; /** From 00e4f216299cf1f3e840f46b94b3575b434f97fb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 3 Feb 2022 23:10:48 +0100 Subject: [PATCH 025/118] libnm: avoid parsing IP addresses twice in NMIPAddress/NMIPRoute API Usually the normalization (canonicalize) and validation of the IP address string both requires to parse the string. As we always do validation first, we can use the parsed address and don't need to parse it a second time. --- src/libnm-core-impl/nm-setting-ip-config.c | 221 ++++++++++----------- 1 file changed, 110 insertions(+), 111 deletions(-) diff --git a/src/libnm-core-impl/nm-setting-ip-config.c b/src/libnm-core-impl/nm-setting-ip-config.c index 1dbf92537e..9e42bc7d81 100644 --- a/src/libnm-core-impl/nm-setting-ip-config.c +++ b/src/libnm-core-impl/nm-setting-ip-config.c @@ -54,56 +54,24 @@ const NMUtilsDNSOptionDesc _nm_utils_dns_option_descs[] = { {NULL, FALSE, FALSE}}; static char * -canonicalize_ip(int family, const char *ip, gboolean null_any) +canonicalize_ip_binary(int family, const NMIPAddr *ip, gboolean null_any) { - guint8 addr_bytes[sizeof(struct in6_addr)]; - char addr_str[NM_UTILS_INET_ADDRSTRLEN]; - int ret; - if (!ip) { if (null_any) return NULL; - if (family == AF_INET) + if (NM_IS_IPv4(family)) return g_strdup("0.0.0.0"); - if (family == AF_INET6) - return g_strdup("::"); - g_return_val_if_reached(NULL); + return g_strdup("::"); } - ret = inet_pton(family, ip, addr_bytes); - g_return_val_if_fail(ret == 1, NULL); + if (null_any && nm_ip_addr_is_null(family, ip)) + return NULL; - if (null_any) { - if (!memcmp(addr_bytes, &in6addr_any, nm_utils_addr_family_to_size(family))) - return NULL; - } - - return g_strdup(inet_ntop(family, addr_bytes, addr_str, sizeof(addr_str))); -} - -static char * -canonicalize_ip_binary(int family, gconstpointer ip, gboolean null_any) -{ - char string[NM_UTILS_INET_ADDRSTRLEN]; - - if (!ip) { - if (null_any) - return NULL; - if (family == AF_INET) - return g_strdup("0.0.0.0"); - if (family == AF_INET6) - return g_strdup("::"); - g_return_val_if_reached(NULL); - } - if (null_any) { - if (!memcmp(ip, &in6addr_any, nm_utils_addr_family_to_size(family))) - return NULL; - } - return g_strdup(inet_ntop(family, ip, string, sizeof(string))); + return nm_utils_inet_ntop_dup(family, ip); } static gboolean -valid_ip(int family, const char *ip, GError **error) +valid_ip(int family, const char *ip, NMIPAddr *addr, GError **error) { if (!ip) { g_set_error(error, @@ -112,7 +80,7 @@ valid_ip(int family, const char *ip, GError **error) family == AF_INET ? _("Missing IPv4 address") : _("Missing IPv6 address")); return FALSE; } - if (!nm_utils_ipaddr_is_valid(family, ip)) { + if (!nm_utils_parse_inaddr_bin(family, ip, NULL, addr)) { g_set_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, @@ -120,8 +88,9 @@ valid_ip(int family, const char *ip, GError **error) : _("Invalid IPv6 address '%s'"), ip); return FALSE; - } else - return TRUE; + } + + return TRUE; } static gboolean @@ -192,21 +161,23 @@ NMIPAddress * nm_ip_address_new(int family, const char *addr, guint prefix, GError **error) { NMIPAddress *address; + NMIPAddr addr_bin; g_return_val_if_fail(family == AF_INET || family == AF_INET6, NULL); g_return_val_if_fail(addr != NULL, NULL); - if (!valid_ip(family, addr, error)) + if (!valid_ip(family, addr, &addr_bin, error)) return NULL; if (!valid_prefix(family, prefix, error)) return NULL; - address = g_slice_new0(NMIPAddress); - address->refcount = 1; - - address->family = family; - address->address = canonicalize_ip(family, addr, FALSE); - address->prefix = prefix; + address = g_slice_new(NMIPAddress); + *address = (NMIPAddress){ + .refcount = 1, + .family = family, + .address = canonicalize_ip_binary(family, &addr_bin, FALSE), + .prefix = prefix, + }; return address; } @@ -228,7 +199,6 @@ NMIPAddress * nm_ip_address_new_binary(int family, gconstpointer addr, guint prefix, GError **error) { NMIPAddress *address; - char string[NM_UTILS_INET_ADDRSTRLEN]; g_return_val_if_fail(family == AF_INET || family == AF_INET6, NULL); g_return_val_if_fail(addr != NULL, NULL); @@ -236,12 +206,13 @@ nm_ip_address_new_binary(int family, gconstpointer addr, guint prefix, GError ** if (!valid_prefix(family, prefix, error)) return NULL; - address = g_slice_new0(NMIPAddress); - address->refcount = 1; - - address->family = family; - address->address = g_strdup(inet_ntop(family, addr, string, sizeof(string))); - address->prefix = prefix; + address = g_slice_new(NMIPAddress); + *address = (NMIPAddress){ + .refcount = 1, + .family = family, + .address = nm_utils_inet_ntop_dup(family, addr), + .prefix = prefix, + }; return address; } @@ -277,9 +248,8 @@ nm_ip_address_unref(NMIPAddress *address) address->refcount--; if (address->refcount == 0) { g_free(address->address); - if (address->attributes) - g_hash_table_unref(address->attributes); - g_slice_free(NMIPAddress, address); + nm_g_hash_table_unref(address->attributes); + nm_g_slice_free(address); } } @@ -442,12 +412,18 @@ nm_ip_address_get_address(NMIPAddress *address) void nm_ip_address_set_address(NMIPAddress *address, const char *addr) { + NMIPAddr addr_bin; + g_return_if_fail(address != NULL); - g_return_if_fail(addr != NULL); - g_return_if_fail(nm_utils_ipaddr_is_valid(address->family, addr)); + + if (!valid_ip(address->family, addr, &addr_bin, NULL)) { + g_return_if_fail(addr != NULL); + g_return_if_fail(nm_utils_ipaddr_is_valid(address->family, addr)); + nm_assert_not_reached(); + } g_free(address->address); - address->address = canonicalize_ip(address->family, addr, FALSE); + address->address = canonicalize_ip_binary(address->family, &addr_bin, FALSE); } /** @@ -480,13 +456,11 @@ nm_ip_address_get_address_binary(NMIPAddress *address, gpointer addr) void nm_ip_address_set_address_binary(NMIPAddress *address, gconstpointer addr) { - char string[NM_UTILS_INET_ADDRSTRLEN]; - g_return_if_fail(address != NULL); g_return_if_fail(addr != NULL); g_free(address->address); - address->address = g_strdup(inet_ntop(address->family, addr, string, sizeof(string))); + address->address = nm_utils_inet_ntop_dup(address->family, addr); } /** @@ -642,27 +616,30 @@ nm_ip_route_new(int family, GError **error) { NMIPRoute *route; + NMIPAddr dest_bin; + NMIPAddr next_hop_bin; g_return_val_if_fail(family == AF_INET || family == AF_INET6, NULL); g_return_val_if_fail(dest, NULL); - if (!valid_ip(family, dest, error)) + if (!valid_ip(family, dest, &dest_bin, error)) return NULL; if (!valid_prefix(family, prefix, error)) return NULL; - if (next_hop && !valid_ip(family, next_hop, error)) + if (next_hop && !valid_ip(family, next_hop, &next_hop_bin, error)) return NULL; if (!valid_metric(metric, error)) return NULL; - route = g_slice_new0(NMIPRoute); - route->refcount = 1; - - route->family = family; - route->dest = canonicalize_ip(family, dest, FALSE); - route->prefix = prefix; - route->next_hop = canonicalize_ip(family, next_hop, TRUE); - route->metric = metric; + route = g_slice_new(NMIPRoute); + *route = (NMIPRoute){ + .refcount = 1, + .family = family, + .dest = canonicalize_ip_binary(family, &dest_bin, FALSE), + .prefix = prefix, + .next_hop = canonicalize_ip_binary(family, next_hop ? &next_hop_bin : NULL, TRUE), + .metric = metric, + }; return route; } @@ -700,14 +677,15 @@ nm_ip_route_new_binary(int family, if (!valid_metric(metric, error)) return NULL; - route = g_slice_new0(NMIPRoute); - route->refcount = 1; - - route->family = family; - route->dest = canonicalize_ip_binary(family, dest, FALSE); - route->prefix = prefix; - route->next_hop = canonicalize_ip_binary(family, next_hop, TRUE); - route->metric = metric; + route = g_slice_new0(NMIPRoute); + *route = (NMIPRoute){ + .refcount = 1, + .family = family, + .dest = canonicalize_ip_binary(family, dest, FALSE), + .prefix = prefix, + .next_hop = canonicalize_ip_binary(family, next_hop, TRUE), + .metric = metric, + }; return route; } @@ -744,9 +722,8 @@ nm_ip_route_unref(NMIPRoute *route) if (route->refcount == 0) { g_free(route->dest); g_free(route->next_hop); - if (route->attributes) - g_hash_table_unref(route->attributes); - g_slice_free(NMIPRoute, route); + nm_g_hash_table_unref(route->attributes); + nm_g_slice_free(route); } } @@ -911,11 +888,17 @@ nm_ip_route_get_dest(NMIPRoute *route) void nm_ip_route_set_dest(NMIPRoute *route, const char *dest) { + NMIPAddr dest_bin; + g_return_if_fail(route != NULL); - g_return_if_fail(nm_utils_ipaddr_is_valid(route->family, dest)); + + if (!valid_ip(route->family, dest, &dest_bin, NULL)) { + g_return_if_fail(nm_utils_ipaddr_is_valid(route->family, dest)); + nm_assert_not_reached(); + } g_free(route->dest); - route->dest = canonicalize_ip(route->family, dest, FALSE); + route->dest = canonicalize_ip_binary(route->family, &dest_bin, FALSE); } /** @@ -948,13 +931,11 @@ nm_ip_route_get_dest_binary(NMIPRoute *route, gpointer dest) void nm_ip_route_set_dest_binary(NMIPRoute *route, gconstpointer dest) { - char string[NM_UTILS_INET_ADDRSTRLEN]; - g_return_if_fail(route != NULL); g_return_if_fail(dest != NULL); g_free(route->dest); - route->dest = g_strdup(inet_ntop(route->family, dest, string, sizeof(string))); + route->dest = nm_utils_inet_ntop_dup(route->family, dest); } /** @@ -1022,11 +1003,17 @@ nm_ip_route_get_next_hop(NMIPRoute *route) void nm_ip_route_set_next_hop(NMIPRoute *route, const char *next_hop) { + NMIPAddr next_hop_bin; + g_return_if_fail(route != NULL); - g_return_if_fail(!next_hop || nm_utils_ipaddr_is_valid(route->family, next_hop)); + + if (next_hop && !valid_ip(route->family, next_hop, &next_hop_bin, NULL)) { + g_return_if_fail(!next_hop || nm_utils_ipaddr_is_valid(route->family, next_hop)); + nm_assert_not_reached(); + } g_free(route->next_hop); - route->next_hop = canonicalize_ip(route->family, next_hop, TRUE); + route->next_hop = canonicalize_ip_binary(route->family, next_hop ? &next_hop_bin : NULL, TRUE); } /** @@ -1694,7 +1681,7 @@ nm_ip_routing_rule_unref(NMIPRoutingRule *self) g_free(self->iifname); g_free(self->oifname); - g_slice_free(NMIPRoutingRule, self); + nm_g_slice_free(self); } /** @@ -4002,25 +3989,31 @@ gboolean nm_setting_ip_config_add_dns(NMSettingIPConfig *setting, const char *dns) { NMSettingIPConfigPrivate *priv; - char *dns_canonical; + int addr_family; + NMIPAddr dns_bin; + char dns_canonical[NM_UTILS_INET_ADDRSTRLEN]; guint i; g_return_val_if_fail(NM_IS_SETTING_IP_CONFIG(setting), FALSE); - g_return_val_if_fail(dns != NULL, FALSE); - g_return_val_if_fail(nm_utils_ipaddr_is_valid(NM_SETTING_IP_CONFIG_GET_FAMILY(setting), dns), - FALSE); + + addr_family = NM_SETTING_IP_CONFIG_GET_FAMILY(setting); + + if (!valid_ip(addr_family, dns, &dns_bin, NULL)) { + g_return_val_if_fail(dns != NULL, FALSE); + g_return_val_if_fail(nm_utils_ipaddr_is_valid(addr_family, dns), FALSE); + nm_assert_not_reached(); + } priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(setting); - dns_canonical = canonicalize_ip(NM_SETTING_IP_CONFIG_GET_FAMILY(setting), dns, FALSE); + nm_utils_inet_ntop(addr_family, &dns_bin, dns_canonical); + for (i = 0; i < priv->dns->len; i++) { - if (!strcmp(dns_canonical, priv->dns->pdata[i])) { - g_free(dns_canonical); + if (nm_streq(dns_canonical, priv->dns->pdata[i])) return FALSE; - } } - g_ptr_array_add(priv->dns, dns_canonical); + g_ptr_array_add(priv->dns, g_strdup(dns_canonical)); _notify(setting, PROP_DNS); return TRUE; } @@ -4059,26 +4052,32 @@ gboolean nm_setting_ip_config_remove_dns_by_value(NMSettingIPConfig *setting, const char *dns) { NMSettingIPConfigPrivate *priv; - char *dns_canonical; + int addr_family; + NMIPAddr dns_bin; + char dns_canonical[NM_UTILS_INET_ADDRSTRLEN]; guint i; g_return_val_if_fail(NM_IS_SETTING_IP_CONFIG(setting), FALSE); - g_return_val_if_fail(dns != NULL, FALSE); - g_return_val_if_fail(nm_utils_ipaddr_is_valid(NM_SETTING_IP_CONFIG_GET_FAMILY(setting), dns), - FALSE); + + addr_family = NM_SETTING_IP_CONFIG_GET_FAMILY(setting); + + if (!valid_ip(addr_family, dns, &dns_bin, NULL)) { + g_return_val_if_fail(dns != NULL, FALSE); + g_return_val_if_fail(nm_utils_ipaddr_is_valid(addr_family, dns), FALSE); + nm_assert_not_reached(); + } priv = NM_SETTING_IP_CONFIG_GET_PRIVATE(setting); - dns_canonical = canonicalize_ip(NM_SETTING_IP_CONFIG_GET_FAMILY(setting), dns, FALSE); + nm_utils_inet_ntop(addr_family, &dns_bin, dns_canonical); + for (i = 0; i < priv->dns->len; i++) { - if (!strcmp(dns_canonical, priv->dns->pdata[i])) { + if (nm_streq(dns_canonical, priv->dns->pdata[i])) { g_ptr_array_remove_index(priv->dns, i); _notify(setting, PROP_DNS); - g_free(dns_canonical); return TRUE; } } - g_free(dns_canonical); return FALSE; } From 6f277d8fa6375253774c1bee0d6eef962036734b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 3 Feb 2022 17:09:53 +0100 Subject: [PATCH 026/118] libnm: change NMVariantAttributeSpec.str_type to work for attributes of any type First of all, all of NMVariantAttributeSpec is internal API. We only expose the typedef itself as public API, but not its fields nor their meaning. So we can change things. Change "str_type" to "type_detail", so that it can work for any kind of attribute, not only for strings. Usually, we want to avoid special cases and treat all attributes the same, based on their GVariant type. But sometimes, it is necessary to do something special with an attribute. This is what the "type_detail" encodes, but it's not only relevant for strings. --- src/libnm-core-impl/nm-setting-ip-config.c | 122 +++++++++++---------- src/libnm-core-impl/nm-setting-sriov.c | 40 +++---- src/libnm-glib-aux/nm-shared-utils.h | 8 +- 3 files changed, 90 insertions(+), 80 deletions(-) diff --git a/src/libnm-core-impl/nm-setting-ip-config.c b/src/libnm-core-impl/nm-setting-ip-config.c index 9e42bc7d81..88fbe925e9 100644 --- a/src/libnm-core-impl/nm-setting-ip-config.c +++ b/src/libnm-core-impl/nm-setting-ip-config.c @@ -1203,8 +1203,8 @@ static const NMVariantAttributeSpec *const ip_route_attribute_spec[] = { .v6 = TRUE, ), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_FROM, G_VARIANT_TYPE_STRING, - .v6 = TRUE, - .str_type = 'p', ), + .v6 = TRUE, + .type_detail = 'p', ), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_INITCWND, G_VARIANT_TYPE_UINT32, .v4 = TRUE, @@ -1246,9 +1246,9 @@ static const NMVariantAttributeSpec *const ip_route_attribute_spec[] = { .v4 = TRUE, ), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_SRC, G_VARIANT_TYPE_STRING, - .v4 = TRUE, - .v6 = TRUE, - .str_type = 'a', ), + .v4 = TRUE, + .v6 = TRUE, + .type_detail = 'a', ), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_TABLE, G_VARIANT_TYPE_UINT32, .v4 = TRUE, @@ -1256,9 +1256,9 @@ static const NMVariantAttributeSpec *const ip_route_attribute_spec[] = { NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_TOS, G_VARIANT_TYPE_BYTE, .v4 = TRUE, ), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_TYPE, G_VARIANT_TYPE_STRING, - .v4 = TRUE, - .v6 = TRUE, - .str_type = 'T', ), + .v4 = TRUE, + .v6 = TRUE, + .type_detail = 'T', ), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_WINDOW, G_VARIANT_TYPE_UINT32, .v4 = TRUE, @@ -1302,6 +1302,7 @@ nm_ip_route_attribute_validate(const char *name, GError **error) { const NMVariantAttributeSpec *spec; + const char *string; g_return_val_if_fail(name, FALSE); g_return_val_if_fail(value, FALSE); @@ -1340,65 +1341,68 @@ nm_ip_route_attribute_validate(const char *name, return FALSE; } - if (g_variant_type_equal(spec->type, G_VARIANT_TYPE_STRING)) { - const char *string = g_variant_get_string(value, NULL); + switch (spec->type_detail) { + case 'a': /* IP address */ + string = g_variant_get_string(value, NULL); + if (!nm_utils_ipaddr_is_valid(family, string)) { + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_FAILED, + family == AF_INET ? _("'%s' is not a valid IPv4 address") + : _("'%s' is not a valid IPv6 address"), + string); + return FALSE; + } + break; + case 'p': /* IP address + optional prefix */ + { + gs_free char *addr_free = NULL; + const char *addr; + const char *str; - switch (spec->str_type) { - case 'a': /* IP address */ - if (!nm_utils_ipaddr_is_valid(family, string)) { + string = g_variant_get_string(value, NULL); + addr = string; + + str = strchr(addr, '/'); + if (str) { + addr = nm_strndup_a(200, addr, str - addr, &addr_free); + str++; + if (_nm_utils_ascii_str_to_int64(str, 10, 0, family == AF_INET ? 32 : 128, -1) < 0) { g_set_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, - family == AF_INET ? _("'%s' is not a valid IPv4 address") - : _("'%s' is not a valid IPv6 address"), - string); + _("invalid prefix %s"), + str); return FALSE; } - break; - case 'p': /* IP address + optional prefix */ - { - gs_free char *addr_free = NULL; - const char *addr = string; - const char *str; - - str = strchr(addr, '/'); - if (str) { - addr = nm_strndup_a(200, addr, str - addr, &addr_free); - str++; - if (_nm_utils_ascii_str_to_int64(str, 10, 0, family == AF_INET ? 32 : 128, -1) - < 0) { - g_set_error(error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_FAILED, - _("invalid prefix %s"), - str); - return FALSE; - } - } - if (!nm_utils_ipaddr_is_valid(family, addr)) { - g_set_error(error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_FAILED, - family == AF_INET ? _("'%s' is not a valid IPv4 address") - : _("'%s' is not a valid IPv6 address"), - string); - return FALSE; - } - break; } - case 'T': /* route type. */ - if (!NM_IN_SET(nm_net_aux_rtnl_rtntype_a2n(string), RTN_UNICAST, RTN_LOCAL)) { - g_set_error(error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_INVALID_PROPERTY, - _("%s is not a valid route type"), - string); - return FALSE; - } - break; - default: - break; + if (!nm_utils_ipaddr_is_valid(family, addr)) { + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_FAILED, + family == AF_INET ? _("'%s' is not a valid IPv4 address") + : _("'%s' is not a valid IPv6 address"), + string); + return FALSE; } + break; + } + case 'T': /* route type. */ + string = g_variant_get_string(value, NULL); + if (!NM_IN_SET(nm_net_aux_rtnl_rtntype_a2n(string), RTN_UNICAST, RTN_LOCAL)) { + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("%s is not a valid route type"), + string); + return FALSE; + } + break; + case '\0': + break; + default: + nm_assert_not_reached(); + break; } return TRUE; diff --git a/src/libnm-core-impl/nm-setting-sriov.c b/src/libnm-core-impl/nm-setting-sriov.c index 3875992d08..30dd8f541b 100644 --- a/src/libnm-core-impl/nm-setting-sriov.c +++ b/src/libnm-core-impl/nm-setting-sriov.c @@ -350,13 +350,13 @@ nm_sriov_vf_get_attribute(const NMSriovVF *vf, const char *name) const NMVariantAttributeSpec *const _nm_sriov_vf_attribute_spec[] = { NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_SRIOV_VF_ATTRIBUTE_MAC, G_VARIANT_TYPE_STRING, - .str_type = 'm', ), + .type_detail = 'm', ), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_SRIOV_VF_ATTRIBUTE_SPOOF_CHECK, G_VARIANT_TYPE_BOOLEAN, ), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_SRIOV_VF_ATTRIBUTE_TRUST, G_VARIANT_TYPE_BOOLEAN, ), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_SRIOV_VF_ATTRIBUTE_MIN_TX_RATE, G_VARIANT_TYPE_UINT32, ), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_SRIOV_VF_ATTRIBUTE_MAX_TX_RATE, G_VARIANT_TYPE_UINT32, ), /* D-Bus only, synthetic attributes */ - NM_VARIANT_ATTRIBUTE_SPEC_DEFINE("vlans", G_VARIANT_TYPE_STRING, .str_type = 'd', ), + NM_VARIANT_ATTRIBUTE_SPEC_DEFINE("vlans", G_VARIANT_TYPE_STRING, .type_detail = 'd', ), NULL, }; @@ -379,6 +379,7 @@ nm_sriov_vf_attribute_validate(const char *name, GVariant *value, gboolean *know { const NMVariantAttributeSpec *const *iter; const NMVariantAttributeSpec *spec = NULL; + const char *string; g_return_val_if_fail(name, FALSE); g_return_val_if_fail(value, FALSE); @@ -391,7 +392,7 @@ nm_sriov_vf_attribute_validate(const char *name, GVariant *value, gboolean *know } } - if (!spec || spec->str_type == 'd') { + if (!spec || spec->type_detail == 'd') { NM_SET_OUT(known, FALSE); g_set_error_literal(error, NM_CONNECTION_ERROR, @@ -411,24 +412,23 @@ nm_sriov_vf_attribute_validate(const char *name, GVariant *value, gboolean *know return FALSE; } - if (g_variant_type_equal(spec->type, G_VARIANT_TYPE_STRING)) { - const char *string; - - switch (spec->str_type) { - case 'm': /* MAC address */ - string = g_variant_get_string(value, NULL); - if (!nm_utils_hwaddr_valid(string, -1)) { - g_set_error(error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_FAILED, - _("'%s' is not a valid MAC address"), - string); - return FALSE; - } - break; - default: - break; + switch (spec->type_detail) { + case 'm': /* MAC address */ + string = g_variant_get_string(value, NULL); + if (!nm_utils_hwaddr_valid(string, -1)) { + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_FAILED, + _("'%s' is not a valid MAC address"), + string); + return FALSE; } + break; + case '\0': + break; + default: + nm_assert_not_reached(); + break; } return TRUE; diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h index 5a0518f83e..54550f2737 100644 --- a/src/libnm-glib-aux/nm-shared-utils.h +++ b/src/libnm-glib-aux/nm-shared-utils.h @@ -3148,7 +3148,13 @@ struct _NMVariantAttributeSpec { bool v6 : 1; bool no_value : 1; bool consumes_rest : 1; - char str_type; + + /* This indicates a non-standard parsing behavior. What this is, + * depends on the actual validation and how to handle it. + * + * Note that the entire NMVariantAttributeSpec is internal API, + * so we can change behavior and adjust it as it fits. */ + char type_detail; }; typedef struct _NMVariantAttributeSpec NMVariantAttributeSpec; From 0413b1bf8ae6749af10ac64c34f77c37b7d76050 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 3 Feb 2022 16:56:05 +0100 Subject: [PATCH 027/118] libnm: rework validating route attributes to avoid duplicate check _nm_ip_route_attribute_validate_all() validates all attributes together. As such, it calls to nm_ip_route_attribute_validate(), which in turn validates one attribute at a time. Such full validation needs to check that (potentially conflicting) attributes are valid together. Hence, _nm_ip_route_attribute_validate_all() needs again peek into the attributes. Refactor the code, so that we can extract the pieces that we need and not need to parse them twice. --- src/libnm-core-impl/nm-setting-ip-config.c | 134 +++++++++++++-------- 1 file changed, 81 insertions(+), 53 deletions(-) diff --git a/src/libnm-core-impl/nm-setting-ip-config.c b/src/libnm-core-impl/nm-setting-ip-config.c index 88fbe925e9..3cc0486e2a 100644 --- a/src/libnm-core-impl/nm-setting-ip-config.c +++ b/src/libnm-core-impl/nm-setting-ip-config.c @@ -1243,7 +1243,8 @@ static const NMVariantAttributeSpec *const ip_route_attribute_spec[] = { .v6 = TRUE, ), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_SCOPE, G_VARIANT_TYPE_BYTE, - .v4 = TRUE, ), + .v4 = TRUE, + .type_detail = 's'), NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_SRC, G_VARIANT_TYPE_STRING, .v4 = TRUE, @@ -1279,35 +1280,26 @@ nm_ip_route_get_variant_attribute_spec(void) return ip_route_attribute_spec; } -/** - * nm_ip_route_attribute_validate: - * @name: the attribute name - * @value: the attribute value - * @family: IP address family of the route - * @known: (out): on return, whether the attribute name is a known one - * @error: (allow-none): return location for a #GError, or %NULL - * - * Validates a route attribute, i.e. checks that the attribute is a known one - * and the value is of the correct type and well-formed. - * - * Returns: %TRUE if the attribute is valid, %FALSE otherwise - * - * Since: 1.8 - */ -gboolean -nm_ip_route_attribute_validate(const char *name, - GVariant *value, - int family, - gboolean *known, - GError **error) +typedef struct { + int type; + int scope; +} IPRouteAttrParseData; + +static gboolean +_ip_route_attribute_validate(const char *name, + GVariant *value, + int family, + IPRouteAttrParseData *parse_data, + gboolean *known, + GError **error) { const NMVariantAttributeSpec *spec; const char *string; - g_return_val_if_fail(name, FALSE); - g_return_val_if_fail(value, FALSE); - g_return_val_if_fail(family == AF_INET || family == AF_INET6, FALSE); - g_return_val_if_fail(!error || !*error, FALSE); + nm_assert(name); + nm_assert(value); + nm_assert(family == AF_INET || family == AF_INET6); + nm_assert(!error || !*error); spec = _nm_variant_attribute_spec_find_binary_search(ip_route_attribute_spec, G_N_ELEMENTS(ip_route_attribute_spec) - 1, @@ -1388,8 +1380,12 @@ nm_ip_route_attribute_validate(const char *name, break; } case 'T': /* route type. */ + { + int type; + string = g_variant_get_string(value, NULL); - if (!NM_IN_SET(nm_net_aux_rtnl_rtntype_a2n(string), RTN_UNICAST, RTN_LOCAL)) { + type = nm_net_aux_rtnl_rtntype_a2n(string); + if (!NM_IN_SET(type, RTN_UNICAST, RTN_LOCAL)) { g_set_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, @@ -1397,6 +1393,14 @@ nm_ip_route_attribute_validate(const char *name, string); return FALSE; } + + if (parse_data) + parse_data->type = type; + break; + } + case 's': /* scope */ + if (parse_data) + parse_data->scope = g_variant_get_byte(value); break; case '\0': break; @@ -1408,6 +1412,36 @@ nm_ip_route_attribute_validate(const char *name, return TRUE; } +/** + * nm_ip_route_attribute_validate: + * @name: the attribute name + * @value: the attribute value + * @family: IP address family of the route + * @known: (out): on return, whether the attribute name is a known one + * @error: (allow-none): return location for a #GError, or %NULL + * + * Validates a route attribute, i.e. checks that the attribute is a known one + * and the value is of the correct type and well-formed. + * + * Returns: %TRUE if the attribute is valid, %FALSE otherwise + * + * Since: 1.8 + */ +gboolean +nm_ip_route_attribute_validate(const char *name, + GVariant *value, + int family, + gboolean *known, + GError **error) +{ + g_return_val_if_fail(name, FALSE); + g_return_val_if_fail(value, FALSE); + g_return_val_if_fail(family == AF_INET || family == AF_INET6, FALSE); + g_return_val_if_fail(!error || !*error, FALSE); + + return _ip_route_attribute_validate(name, value, family, NULL, known, error); +} + gboolean _nm_ip_route_attribute_validate_all(const NMIPRoute *route, GError **error) { @@ -1415,9 +1449,11 @@ _nm_ip_route_attribute_validate_all(const NMIPRoute *route, GError **error) gs_free NMUtilsNamedValue *attrs_free = NULL; const NMUtilsNamedValue *attrs; guint attrs_len; - GVariant *val; guint i; - guint8 u8; + IPRouteAttrParseData parse_data = { + .type = RTN_UNICAST, + .scope = -1, + }; g_return_val_if_fail(route, FALSE); g_return_val_if_fail(!error || !*error, FALSE); @@ -1430,34 +1466,26 @@ _nm_ip_route_attribute_validate_all(const NMIPRoute *route, GError **error) attrs_static, &attrs_free); for (i = 0; i < attrs_len; i++) { - const char *key = attrs[i].name; - GVariant *val2 = attrs[i].value_ptr; - - if (!nm_ip_route_attribute_validate(key, val2, route->family, NULL, error)) + if (!_ip_route_attribute_validate(attrs[i].name, + attrs[i].value_ptr, + route->family, + &parse_data, + NULL, + error)) return FALSE; } - if ((val = g_hash_table_lookup(route->attributes, NM_IP_ROUTE_ATTRIBUTE_TYPE))) { - int v_i; - - nm_assert(g_variant_is_of_type(val, G_VARIANT_TYPE_STRING)); - - v_i = nm_net_aux_rtnl_rtntype_a2n(g_variant_get_string(val, NULL)); - nm_assert(v_i >= 0); - - if (v_i == RTN_LOCAL && route->family == AF_INET - && (val = g_hash_table_lookup(route->attributes, NM_IP_ROUTE_ATTRIBUTE_SCOPE))) { - nm_assert(g_variant_is_of_type(val, G_VARIANT_TYPE_BYTE)); - u8 = g_variant_get_byte(val); - - if (!NM_IN_SET(u8, RT_SCOPE_HOST, RT_SCOPE_NOWHERE)) { - g_set_error(error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_INVALID_PROPERTY, - _("route scope is invalid")); - return FALSE; - } + switch (parse_data.type) { + case RTN_LOCAL: + if (route->family == AF_INET && parse_data.scope >= 0 + && !NM_IN_SET(parse_data.scope, RT_SCOPE_HOST, RT_SCOPE_NOWHERE)) { + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("route scope is invalid for local route")); + return FALSE; } + break; } return TRUE; From 8085c0121f9a80eec55c575b703bf322a56da973 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 3 Feb 2022 17:57:14 +0100 Subject: [PATCH 028/118] platform: rename variable "IS_IPv4" in platform code The variable with this purpose is usually called "IS_IPv4". It's upper case, because usually this is a const variable, and because it reminds of the NM_IS_IPv4(addr_family) macro. That letter case is unusual, but it makes sense to me for the special purpose that this variable has. Anyway. The naming of this variable is a different point. Let's use the variable name that is consistent and widely used. --- src/libnm-platform/nm-linux-platform.c | 83 ++++++++++++++------------ 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/src/libnm-platform/nm-linux-platform.c b/src/libnm-platform/nm-linux-platform.c index 83f2207d37..411a49d599 100644 --- a/src/libnm-platform/nm-linux-platform.c +++ b/src/libnm-platform/nm-linux-platform.c @@ -3268,7 +3268,7 @@ _new_from_nl_addr(struct nlmsghdr *nlh, gboolean id_only) }; struct nlattr *tb[G_N_ELEMENTS(policy)]; const struct ifaddrmsg *ifa; - gboolean is_v4; + gboolean IS_IPv4; nm_auto_nmpobj NMPObject *obj = NULL; int addr_len; guint32 lifetime, preferred, timestamp; @@ -3278,29 +3278,31 @@ _new_from_nl_addr(struct nlmsghdr *nlh, gboolean id_only) ifa = nlmsg_data(nlh); - if (!NM_IN_SET(ifa->ifa_family, AF_INET, AF_INET6)) + if (ifa->ifa_family == AF_INET) + IS_IPv4 = TRUE; + else if (ifa->ifa_family == AF_INET6) + IS_IPv4 = FALSE; + else return NULL; - is_v4 = ifa->ifa_family == AF_INET; - if (nlmsg_parse_arr(nlh, sizeof(*ifa), tb, policy) < 0) return NULL; - addr_len = is_v4 ? sizeof(in_addr_t) : sizeof(struct in6_addr); + addr_len = IS_IPv4 ? sizeof(in_addr_t) : sizeof(struct in6_addr); - if (ifa->ifa_prefixlen > (is_v4 ? 32 : 128)) + if (ifa->ifa_prefixlen > (IS_IPv4 ? 32 : 128)) return NULL; /*****************************************************************/ - obj = nmp_object_new(is_v4 ? NMP_OBJECT_TYPE_IP4_ADDRESS : NMP_OBJECT_TYPE_IP6_ADDRESS, NULL); + obj = nmp_object_new(IS_IPv4 ? NMP_OBJECT_TYPE_IP4_ADDRESS : NMP_OBJECT_TYPE_IP6_ADDRESS, NULL); obj->ip_address.ifindex = ifa->ifa_index; obj->ip_address.plen = ifa->ifa_prefixlen; _check_addr_or_return_null(tb, IFA_ADDRESS, addr_len); _check_addr_or_return_null(tb, IFA_LOCAL, addr_len); - if (is_v4) { + if (IS_IPv4) { /* For IPv4, kernel omits IFA_LOCAL/IFA_ADDRESS if (and only if) they * are effectively 0.0.0.0 (all-zero). */ if (tb[IFA_LOCAL]) @@ -3336,7 +3338,7 @@ _new_from_nl_addr(struct nlmsghdr *nlh, gboolean id_only) obj->ip_address.n_ifa_flags = tb[IFA_FLAGS] ? nla_get_u32(tb[IFA_FLAGS]) : ifa->ifa_flags; - if (is_v4) { + if (IS_IPv4) { if (tb[IFA_LABEL]) { char label[IFNAMSIZ]; @@ -3387,7 +3389,7 @@ _new_from_nl_route(struct nlmsghdr *nlh, gboolean id_only) }; const struct rtmsg *rtm; struct nlattr *tb[G_N_ELEMENTS(policy)]; - gboolean is_v4; + gboolean IS_IPv4; nm_auto_nmpobj NMPObject *obj = NULL; int addr_len; struct { @@ -3414,7 +3416,11 @@ _new_from_nl_route(struct nlmsghdr *nlh, gboolean id_only) * only handle ~supported~ routes. *****************************************************************/ - if (!NM_IN_SET(rtm->rtm_family, AF_INET, AF_INET6)) + if (rtm->rtm_family == AF_INET) + IS_IPv4 = TRUE; + else if (rtm->rtm_family == AF_INET6) + IS_IPv4 = FALSE; + else return NULL; if (!NM_IN_SET(rtm->rtm_type, RTN_UNICAST, RTN_LOCAL)) @@ -3425,10 +3431,9 @@ _new_from_nl_route(struct nlmsghdr *nlh, gboolean id_only) /*****************************************************************/ - is_v4 = rtm->rtm_family == AF_INET; - addr_len = is_v4 ? sizeof(in_addr_t) : sizeof(struct in6_addr); + addr_len = IS_IPv4 ? sizeof(in_addr_t) : sizeof(struct in6_addr); - if (rtm->rtm_dst_len > (is_v4 ? 32 : 128)) + if (rtm->rtm_dst_len > (IS_IPv4 ? 32 : 128)) return NULL; /***************************************************************** @@ -3539,7 +3544,7 @@ rta_multipath_done:; /*****************************************************************/ - obj = nmp_object_new(is_v4 ? NMP_OBJECT_TYPE_IP4_ROUTE : NMP_OBJECT_TYPE_IP6_ROUTE, NULL); + obj = nmp_object_new(IS_IPv4 ? NMP_OBJECT_TYPE_IP4_ROUTE : NMP_OBJECT_TYPE_IP6_ROUTE, NULL); obj->ip_route.type_coerced = nm_platform_route_type_coerce(rtm->rtm_type); obj->ip_route.table_coerced = nm_platform_route_table_coerce( @@ -3555,22 +3560,22 @@ rta_multipath_done:; if (tb[RTA_PRIORITY]) obj->ip_route.metric = nla_get_u32(tb[RTA_PRIORITY]); - if (is_v4) + if (IS_IPv4) obj->ip4_route.gateway = nh.gateway.addr4; else obj->ip6_route.gateway = nh.gateway.addr6; - if (is_v4) + if (IS_IPv4) obj->ip4_route.scope_inv = nm_platform_route_scope_inv(rtm->rtm_scope); if (_check_addr_or_return_null(tb, RTA_PREFSRC, addr_len)) { - if (is_v4) + if (IS_IPv4) memcpy(&obj->ip4_route.pref_src, nla_data(tb[RTA_PREFSRC]), addr_len); else memcpy(&obj->ip6_route.pref_src, nla_data(tb[RTA_PREFSRC]), addr_len); } - if (is_v4) + if (IS_IPv4) obj->ip4_route.tos = rtm->rtm_tos; else { if (tb[RTA_SRC]) { @@ -3592,7 +3597,7 @@ rta_multipath_done:; obj->ip_route.lock_initrwnd = NM_FLAGS_HAS(lock, 1 << RTAX_INITRWND); obj->ip_route.lock_mtu = NM_FLAGS_HAS(lock, 1 << RTAX_MTU); - if (!is_v4) { + if (!IS_IPv4) { if (tb[RTA_PREF]) obj->ip6_route.rt_pref = nla_get_u8(tb[RTA_PREF]); } @@ -4715,23 +4720,23 @@ ip_route_ignored_protocol(const NMPlatformIPRoute *route) static struct nl_msg * _nl_msg_new_route(int nlmsg_type, guint16 nlmsgflags, const NMPObject *obj) { - nm_auto_nlmsg struct nl_msg *msg = NULL; - const NMPClass *klass = NMP_OBJECT_GET_CLASS(obj); - gboolean is_v4 = klass->addr_family == AF_INET; - const guint32 lock = ip_route_get_lock_flag(NMP_OBJECT_CAST_IP_ROUTE(obj)); + nm_auto_nlmsg struct nl_msg *msg = NULL; + const NMPClass *klass = NMP_OBJECT_GET_CLASS(obj); + const gboolean IS_IPv4 = NM_IS_IPv4(klass->addr_family); + const guint32 lock = ip_route_get_lock_flag(NMP_OBJECT_CAST_IP_ROUTE(obj)); const guint32 table = nm_platform_route_table_uncoerce(NMP_OBJECT_CAST_IP_ROUTE(obj)->table_coerced, TRUE); const struct rtmsg rtmsg = { .rtm_family = klass->addr_family, - .rtm_tos = is_v4 ? obj->ip4_route.tos : 0, + .rtm_tos = IS_IPv4 ? obj->ip4_route.tos : 0, .rtm_table = table <= 0xFF ? table : RT_TABLE_UNSPEC, .rtm_protocol = nmp_utils_ip_config_source_coerce_to_rtprot(obj->ip_route.rt_source), .rtm_scope = - is_v4 ? nm_platform_route_scope_inv(obj->ip4_route.scope_inv) : RT_SCOPE_NOWHERE, + IS_IPv4 ? nm_platform_route_scope_inv(obj->ip4_route.scope_inv) : RT_SCOPE_NOWHERE, .rtm_type = nm_platform_route_type_uncoerce(NMP_OBJECT_CAST_IP_ROUTE(obj)->type_coerced), .rtm_flags = obj->ip_route.r_rtm_flags & ((unsigned) (RTNH_F_ONLINK)), .rtm_dst_len = obj->ip_route.plen, - .rtm_src_len = is_v4 ? 0 : NMP_OBJECT_CAST_IP6_ROUTE(obj)->src_plen, + .rtm_src_len = IS_IPv4 ? 0 : NMP_OBJECT_CAST_IP6_ROUTE(obj)->src_plen, }; gsize addr_len; @@ -4745,28 +4750,28 @@ _nl_msg_new_route(int nlmsg_type, guint16 nlmsgflags, const NMPObject *obj) if (nlmsg_append_struct(msg, &rtmsg) < 0) goto nla_put_failure; - addr_len = is_v4 ? sizeof(in_addr_t) : sizeof(struct in6_addr); + addr_len = IS_IPv4 ? sizeof(in_addr_t) : sizeof(struct in6_addr); NLA_PUT(msg, RTA_DST, addr_len, - is_v4 ? (gconstpointer) &obj->ip4_route.network - : (gconstpointer) &obj->ip6_route.network); + IS_IPv4 ? (gconstpointer) &obj->ip4_route.network + : (gconstpointer) &obj->ip6_route.network); - if (!is_v4) { + if (!IS_IPv4) { if (!IN6_IS_ADDR_UNSPECIFIED(&NMP_OBJECT_CAST_IP6_ROUTE(obj)->src)) NLA_PUT(msg, RTA_SRC, addr_len, &obj->ip6_route.src); } NLA_PUT_U32(msg, RTA_PRIORITY, - is_v4 ? nm_platform_ip4_route_get_effective_metric(&obj->ip4_route) - : nm_platform_ip6_route_get_effective_metric(&obj->ip6_route)); + IS_IPv4 ? nm_platform_ip4_route_get_effective_metric(&obj->ip4_route) + : nm_platform_ip6_route_get_effective_metric(&obj->ip6_route)); if (table > 0xFF) NLA_PUT_U32(msg, RTA_TABLE, table); - if (is_v4) { + if (IS_IPv4) { if (NMP_OBJECT_CAST_IP4_ROUTE(obj)->pref_src) NLA_PUT(msg, RTA_PREFSRC, addr_len, &obj->ip4_route.pref_src); } else { @@ -4801,7 +4806,7 @@ _nl_msg_new_route(int nlmsg_type, guint16 nlmsgflags, const NMPObject *obj) } /* We currently don't have need for multi-hop routes... */ - if (is_v4) { + if (IS_IPv4) { NLA_PUT(msg, RTA_GATEWAY, addr_len, &obj->ip4_route.gateway); } else { if (!IN6_IS_ADDR_UNSPECIFIED(&obj->ip6_route.gateway)) @@ -4809,7 +4814,7 @@ _nl_msg_new_route(int nlmsg_type, guint16 nlmsgflags, const NMPObject *obj) } NLA_PUT_U32(msg, RTA_OIF, obj->ip_route.ifindex); - if (!is_v4 && obj->ip6_route.rt_pref != NM_ICMPV6_ROUTER_PREF_MEDIUM) + if (!IS_IPv4 && obj->ip6_route.rt_pref != NM_ICMPV6_ROUTER_PREF_MEDIUM) NLA_PUT_U8(msg, RTA_PREF, obj->ip6_route.rt_pref); return g_steal_pointer(&msg); @@ -8736,8 +8741,8 @@ ip_route_get(NMPlatform *platform, int oif_ifindex, NMPObject **out_route) { - const gboolean is_v4 = (addr_family == AF_INET); - const int addr_len = is_v4 ? 4 : 16; + const gboolean IS_IPv4 = NM_IS_IPv4(addr_family); + const int addr_len = IS_IPv4 ? 4 : 16; int try_count = 0; WaitForNlResponseResult seq_result; int nle; @@ -8758,7 +8763,7 @@ ip_route_get(NMPlatform *platform, .n.nlmsg_type = RTM_GETROUTE, .r.rtm_family = addr_family, .r.rtm_tos = 0, - .r.rtm_dst_len = is_v4 ? 32 : 128, + .r.rtm_dst_len = IS_IPv4 ? 32 : 128, .r.rtm_flags = 0x1000 /* RTM_F_LOOKUP_TABLE */, }; From 596d1645e839e5b6df05cea759d9022669917a89 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 3 Feb 2022 22:52:55 +0100 Subject: [PATCH 029/118] core: use IS_IPv4 variable in nm_utils_ip_route_attribute_to_platform() It's what we do at many other places. Consistency. --- src/core/NetworkManagerUtils.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/NetworkManagerUtils.c b/src/core/NetworkManagerUtils.c index 0d08efbb9c..14f9b453c8 100644 --- a/src/core/NetworkManagerUtils.c +++ b/src/core/NetworkManagerUtils.c @@ -1316,6 +1316,7 @@ nm_utils_ip_route_attribute_to_platform(int addr_family, NMPlatformIPRoute *r, gint64 route_table) { + const int IS_IPv4 = NM_IS_IPv4(addr_family); GVariant *variant; guint32 table; NMIPAddr addr; @@ -1324,7 +1325,7 @@ nm_utils_ip_route_attribute_to_platform(int addr_family, gboolean onlink; nm_assert(s_route); - nm_assert_addr_family(addr_family); + nm_assert(addr_family == nm_ip_route_get_family(s_route)); nm_assert(r); nm_assert(route_table >= -1); nm_assert(route_table <= (gint64) G_MAXUINT32); @@ -1365,7 +1366,7 @@ nm_utils_ip_route_attribute_to_platform(int addr_family, else r->table_any = TRUE; - if (NM_IS_IPv4(addr_family)) { + if (IS_IPv4) { guint8 scope; GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_TOS, r4->tos, BYTE, byte, 0); @@ -1391,15 +1392,14 @@ nm_utils_ip_route_attribute_to_platform(int addr_family, if ((variant = nm_ip_route_get_attribute(s_route, NM_IP_ROUTE_ATTRIBUTE_SRC)) && g_variant_is_of_type(variant, G_VARIANT_TYPE_STRING)) { if (inet_pton(addr_family, g_variant_get_string(variant, NULL), &addr) == 1) { - if (NM_IS_IPv4(addr_family)) + if (IS_IPv4) r4->pref_src = addr.addr4; else r6->pref_src = addr.addr6; } } - if (!NM_IS_IPv4(addr_family) - && (variant = nm_ip_route_get_attribute(s_route, NM_IP_ROUTE_ATTRIBUTE_FROM)) + if (!IS_IPv4 && (variant = nm_ip_route_get_attribute(s_route, NM_IP_ROUTE_ATTRIBUTE_FROM)) && g_variant_is_of_type(variant, G_VARIANT_TYPE_STRING)) { int prefix; From b58711f20d91393ae80eef8f9716ba69b24cf2c2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 08:15:45 +0100 Subject: [PATCH 030/118] platform: don't print NUL gateway in nm_platform_ip[46]_route_to_string() Currently, for NMPlatformIP[46]Route always has a gateway, even if it's possibly set to 0.0.0.0/::. Not sure whether kernel has a further distinction between no-gateway and all-zero gateway. Anyway. For us, a gateway of 0.0.0.0/:: means the same as having no gateway. We cannot differentiate the two (nor do we need to). Don't print that in nm_platform_ip[46]_route_to_string(). Also, because we are going to add blackhole route types, which cannot have a next-hop. But we do this change for all routes types, because it makes sense in general (and also what `ip route show` prints). --- src/libnm-platform/nm-platform.c | 84 ++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 32 deletions(-) diff --git a/src/libnm-platform/nm-platform.c b/src/libnm-platform/nm-platform.c index a4863c0d2d..b95cd95ec9 100644 --- a/src/libnm-platform/nm-platform.c +++ b/src/libnm-platform/nm-platform.c @@ -3143,7 +3143,8 @@ nm_platform_wpan_set_channel(NMPlatform *self, int ifindex, guint8 page, guint8 static const char * _to_string_dev(NMPlatform *self, int ifindex, char *buf, size_t size) { - g_assert(buf && size >= TO_STRING_DEV_BUF_SIZE); + nm_assert(buf); + nm_assert(size >= TO_STRING_DEV_BUF_SIZE); if (ifindex) { const char *name = ifindex > 0 && self ? nm_platform_link_get_name(self, ifindex) : NULL; @@ -6458,12 +6459,19 @@ _rtm_flags_to_string_full(char *buf, gsize buf_size, unsigned rtm_flags) const char * nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsize len) { - char s_network[INET_ADDRSTRLEN], s_gateway[INET_ADDRSTRLEN]; + char s_network[INET_ADDRSTRLEN]; + char s_gateway[INET_ADDRSTRLEN]; char s_pref_src[INET_ADDRSTRLEN]; char str_dev[TO_STRING_DEV_BUF_SIZE]; char str_table[30]; - char str_scope[30], s_source[50]; - char str_tos[32], str_window[32], str_cwnd[32], str_initcwnd[32], str_initrwnd[32], str_mtu[32]; + char str_scope[30]; + char s_source[50]; + char str_tos[32]; + char str_window[32]; + char str_cwnd[32]; + char str_initcwnd[32]; + char str_initrwnd[32]; + char str_mtu[32]; char str_rtm_flags[_RTM_FLAGS_TO_STRING_MAXLEN]; char str_type[30]; char str_metric[30]; @@ -6472,7 +6480,11 @@ nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsiz return buf; inet_ntop(AF_INET, &route->network, s_network, sizeof(s_network)); - inet_ntop(AF_INET, &route->gateway, s_gateway, sizeof(s_gateway)); + + if (route->gateway == 0) + s_gateway[0] = '\0'; + else + inet_ntop(AF_INET, &route->gateway, s_gateway, sizeof(s_gateway)); _to_string_dev(NULL, route->ifindex, str_dev, sizeof(str_dev)); @@ -6482,21 +6494,22 @@ nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsiz "type %s " /* type */ "%s" /* table */ "%s/%d" - " via %s" + "%s%s" /* gateway */ "%s" " metric %s" - " mss %" G_GUINT32_FORMAT " rt-src %s" /* protocol */ - "%s" /* rtm_flags */ - "%s%s" /* scope */ - "%s%s" /* pref-src */ - "%s" /* tos */ - "%s" /* window */ - "%s" /* cwnd */ - "%s" /* initcwnd */ - "%s" /* initrwnd */ - "%s" /* mtu */ - "%s" /* r_assume_config_once */ - "%s" /* r_force_commit */ + " mss %" G_GUINT32_FORMAT /* mss */ + " rt-src %s" /* protocol */ + "%s" /* rtm_flags */ + "%s%s" /* scope */ + "%s%s" /* pref-src */ + "%s" /* tos */ + "%s" /* window */ + "%s" /* cwnd */ + "%s" /* initcwnd */ + "%s" /* initrwnd */ + "%s" /* mtu */ + "%s" /* r_assume_config_once */ + "%s" /* r_force_commit */ "", nm_net_aux_rtnl_rtntype_n2a_maybe_buf(nm_platform_route_type_uncoerce(route->type_coerced), str_type), @@ -6509,6 +6522,7 @@ nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsiz : ""), s_network, route->plen, + s_gateway[0] ? " via " : "", s_gateway, str_dev, route->metric_any @@ -6596,7 +6610,11 @@ nm_platform_ip6_route_to_string(const NMPlatformIP6Route *route, char *buf, gsiz return buf; inet_ntop(AF_INET6, &route->network, s_network, sizeof(s_network)); - inet_ntop(AF_INET6, &route->gateway, s_gateway, sizeof(s_gateway)); + + if (IN6_IS_ADDR_UNSPECIFIED(&route->gateway)) + s_gateway[0] = '\0'; + else + inet_ntop(AF_INET6, &route->gateway, s_gateway, sizeof(s_gateway)); if (IN6_IS_ADDR_UNSPECIFIED(&route->pref_src)) s_pref_src[0] = 0; @@ -6611,21 +6629,22 @@ nm_platform_ip6_route_to_string(const NMPlatformIP6Route *route, char *buf, gsiz "type %s " /* type */ "%s" /* table */ "%s/%d" - " via %s" + "%s%s" /* gateway */ "%s" " metric %s" - " mss %" G_GUINT32_FORMAT " rt-src %s" /* protocol */ - "%s" /* source */ - "%s" /* rtm_flags */ - "%s%s" /* pref-src */ - "%s" /* window */ - "%s" /* cwnd */ - "%s" /* initcwnd */ - "%s" /* initrwnd */ - "%s" /* mtu */ - "%s" /* pref */ - "%s" /* r_assume_config_once */ - "%s" /* r_force_commit */ + " mss %" G_GUINT32_FORMAT /* mss */ + " rt-src %s" /* protocol */ + "%s" /* source */ + "%s" /* rtm_flags */ + "%s%s" /* pref-src */ + "%s" /* window */ + "%s" /* cwnd */ + "%s" /* initcwnd */ + "%s" /* initrwnd */ + "%s" /* mtu */ + "%s" /* pref */ + "%s" /* r_assume_config_once */ + "%s" /* r_force_commit */ "", nm_net_aux_rtnl_rtntype_n2a_maybe_buf(nm_platform_route_type_uncoerce(route->type_coerced), str_type), @@ -6638,6 +6657,7 @@ nm_platform_ip6_route_to_string(const NMPlatformIP6Route *route, char *buf, gsiz : ""), s_network, route->plen, + s_gateway[0] ? " via " : "", s_gateway, str_dev, route->metric_any From 1123d3a5fb3b1f1a36809d1ea55e1c21c99c35c4 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 15:31:12 +0100 Subject: [PATCH 031/118] platform: don't check for valid ifindex in _vt_cmd_obj_is_alive_ipx_route() _vt_cmd_obj_is_alive_ipx_route() is called by nmp_object_is_alive(). Non-alive objects are not put into the cache. That certainly makes sense for RTM_F_CLONED routes, because they are generated ad-hoc during the `ip route get` request. Checking for the ifindex is not necessary. For one, some route types (blackhole, unreachable, prohibit) don't have an ifindex. Also, the purpose of _vt_cmd_obj_is_alive_ipx_route() is not to validate the object. Just don't create objects without an ifindex, if you think the route needs an ifindex. Checking here is not useful. We also don't check that other fields like rt_source are valid, so there is no need to do it for the ifindex either. --- src/libnm-platform/nmp-object.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libnm-platform/nmp-object.c b/src/libnm-platform/nmp-object.c index ef94942e22..3154a23e80 100644 --- a/src/libnm-platform/nmp-object.c +++ b/src/libnm-platform/nmp-object.c @@ -1740,8 +1740,7 @@ _vt_cmd_obj_is_alive_ipx_route(const NMPObject *obj) * Instead we create a dead object, and nmp_cache_update_netlink() * will remove the old version of the update. **/ - return NMP_OBJECT_CAST_IP_ROUTE(obj)->ifindex > 0 - && !NM_FLAGS_HAS(obj->ip_route.r_rtm_flags, RTM_F_CLONED); + return !NM_FLAGS_HAS(NMP_OBJECT_CAST_IP_ROUTE(obj)->r_rtm_flags, RTM_F_CLONED); } static gboolean From d4ad9666bd4b94c1186bb2dc3f81e4efa5d0e94c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 21:17:48 +0100 Subject: [PATCH 032/118] platform: don't treat ifindex zero special in nmp_lookup_init_object() So far, certain NMObject types could not have an ifindex of zero. Hence, nmp_lookup_init_object() took such an ifindex to mean lookup all objects of that type. Soon, we will support blackhole/unreachable/prohibit route types, which have their ifindex set to zero. It is still useful to lookup those routes types via nmp_lookup_init_object(). Change behaviour how to interpret the ifindex. Note that this also affects various callers of nmp_lookup_init_object(). If somebody was relying on the previous behavior, it would need fixing. --- src/core/platform/nm-fake-platform.c | 11 +++++------ src/core/platform/tests/test-common.c | 6 +++++- src/libnm-platform/nmp-object.c | 10 +++++++++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/core/platform/nm-fake-platform.c b/src/core/platform/nm-fake-platform.c index ebb6a795b9..7d8986d764 100644 --- a/src/core/platform/nm-fake-platform.c +++ b/src/core/platform/nm-fake-platform.c @@ -957,11 +957,10 @@ ipx_address_delete(NMPlatform *platform, peer_addr_i = peer_addr ? *((guint32 *) peer_addr) : 0; nmp_cache_iter_for_each (&iter, - nm_platform_lookup_object(platform, - addr_family == AF_INET - ? NMP_OBJECT_TYPE_IP4_ADDRESS - : NMP_OBJECT_TYPE_IP6_ADDRESS, - 0), + nm_platform_lookup_obj_type(platform, + addr_family == AF_INET + ? NMP_OBJECT_TYPE_IP4_ADDRESS + : NMP_OBJECT_TYPE_IP6_ADDRESS), &o) { const NMPObject *obj_old = NULL; @@ -1139,7 +1138,7 @@ ip_route_add(NMPlatform *platform, gboolean has_route_to_gw = FALSE; nmp_cache_iter_for_each (&iter, - nm_platform_lookup_object(platform, NMP_OBJECT_GET_TYPE(obj), 0), + nm_platform_lookup_obj_type(platform, NMP_OBJECT_GET_TYPE(obj)), &o) { if (addr_family == AF_INET) { const NMPlatformIP4Route *item = NMP_OBJECT_CAST_IP4_ROUTE(o); diff --git a/src/core/platform/tests/test-common.c b/src/core/platform/tests/test-common.c index 24426a5414..9053d35173 100644 --- a/src/core/platform/tests/test-common.c +++ b/src/core/platform/tests/test-common.c @@ -102,7 +102,11 @@ nmtstp_platform_ip_address_find(NMPlatform *self, int ifindex, int addr_family, nm_assert_addr_family(addr_family); nm_assert(addr); - nmp_lookup_init_object(&lookup, NMP_OBJECT_TYPE_IP_ADDRESS(IS_IPv4), ifindex); + if (ifindex > 0) + nmp_lookup_init_object(&lookup, NMP_OBJECT_TYPE_IP_ADDRESS(IS_IPv4), ifindex); + else + nmp_lookup_init_obj_type(&lookup, NMP_OBJECT_TYPE_IP_ADDRESS(IS_IPv4)); + nm_platform_iter_obj_for_each (&iter, self, &lookup, &obj) { const NMPlatformIPAddress *a = NMP_OBJECT_CAST_IP_ADDRESS(obj); diff --git a/src/libnm-platform/nmp-object.c b/src/libnm-platform/nmp-object.c index 3154a23e80..8bd43ef0e5 100644 --- a/src/libnm-platform/nmp-object.c +++ b/src/libnm-platform/nmp-object.c @@ -2142,7 +2142,15 @@ nmp_lookup_init_object(NMPLookup *lookup, NMPObjectType obj_type, int ifindex) NMP_OBJECT_TYPE_QDISC, NMP_OBJECT_TYPE_TFILTER)); - if (ifindex <= 0) { + if (G_UNLIKELY( + (ifindex < 0) + || (ifindex == 0 + && !NM_IN_SET(obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE)))) { + /* This function used to have a fallback that meant to lookup all objects, if + * ifindex is non-positive. As routes can have a zero ifindex, that fallback is + * confusing and no longer supported. Only have this code, to catch accidental bugs + * after the API change. */ + nm_assert_not_reached(); return nmp_lookup_init_obj_type(lookup, obj_type); } From 7ad14b86f80f0dc106e1c5756fb90ce1c96a3758 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 7 Feb 2022 18:50:54 +0100 Subject: [PATCH 033/118] platform: add nm_platform_route_type_is_nodev() helper --- .../platform/tests/test-platform-general.c | 26 +++++++++++++++++++ src/libnm-platform/nm-platform.h | 6 +++++ 2 files changed, 32 insertions(+) diff --git a/src/core/platform/tests/test-platform-general.c b/src/core/platform/tests/test-platform-general.c index 7597f4f13e..9629326aa3 100644 --- a/src/core/platform/tests/test-platform-general.c +++ b/src/core/platform/tests/test-platform-general.c @@ -748,6 +748,31 @@ test_platform_ip_address_pretty_sort_cmp(gconstpointer test_data) /*****************************************************************************/ +static void +test_route_type_is_nodev(void) +{ + int i; + + for (i = -1; i <= 257; i++) { + gboolean is_nodev; + + switch ((guint8) i) { + case RTN_BLACKHOLE: + case RTN_UNREACHABLE: + case RTN_PROHIBIT: + is_nodev = TRUE; + break; + default: + is_nodev = FALSE; + break; + } + + g_assert_cmpint(is_nodev, ==, nm_platform_route_type_is_nodev(i)); + } +} + +/*****************************************************************************/ + NMTST_DEFINE(); int @@ -767,6 +792,7 @@ main(int argc, char **argv) g_test_add_data_func("/general/platform_ip_address_pretty_sort_cmp/6/2", GINT_TO_POINTER(2), test_platform_ip_address_pretty_sort_cmp); + g_test_add_func("/general/test_route_type_is_nodev", test_route_type_is_nodev); return g_test_run(); } diff --git a/src/libnm-platform/nm-platform.h b/src/libnm-platform/nm-platform.h index e55610260d..0882f240e3 100644 --- a/src/libnm-platform/nm-platform.h +++ b/src/libnm-platform/nm-platform.h @@ -1408,6 +1408,12 @@ _nm_platform_link_get_inet6_addr_gen_mode(const NMPlatformLink *pllink) return _nm_platform_uint8_inv(pllink->inet6_addr_gen_mode_inv); } +static inline gboolean +nm_platform_route_type_is_nodev(guint8 type) +{ + return NM_IN_SET(type, 6 /* RTN_BLACKHOLE */, 7 /* RTN_UNREACHABLE */, 8 /* RTN_PROHIBIT */); +} + /** * nm_platform_route_type_coerce: * @table: the route type, in its original value. From 92f51c6b43ad334faca83107c025ce746eea4c0f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Feb 2022 23:49:37 +0100 Subject: [PATCH 034/118] platform: add support for blackhole,unreachable,prohibit route type --- src/core/platform/tests/test-route.c | 62 ++++++++++++++++++++++++++ src/libnm-platform/nm-linux-platform.c | 44 +++++++++++++++--- src/libnm-platform/nmp-object.c | 10 +++-- 3 files changed, 108 insertions(+), 8 deletions(-) diff --git a/src/core/platform/tests/test-route.c b/src/core/platform/tests/test-route.c index 37909d55ef..4974a409cb 100644 --- a/src/core/platform/tests/test-route.c +++ b/src/core/platform/tests/test-route.c @@ -1886,6 +1886,64 @@ again: /*****************************************************************************/ +static void +test_blackhole(gconstpointer test_data) +{ + int TEST_IDX = GPOINTER_TO_INT(test_data); + const int addr_family = (TEST_IDX == 1) ? AF_INET : AF_INET6; + const int IS_IPv4 = NM_IS_IPv4(addr_family); + const NMDedupMultiHeadEntry *head_entry; + NMDedupMultiIter iter; + const NMPObject *obj; + NMPObject obj_stack; + NMPlatformIPXRoute rr = {}; + int r = -1; + int i; + + if (IS_IPv4) { + rr.r4 = (const NMPlatformIP4Route){ + .type_coerced = nmtst_rand_select(RTN_BLACKHOLE, RTN_UNREACHABLE, RTN_PROHIBIT), + }; + } else { + rr.r6 = (const NMPlatformIP6Route){ + .type_coerced = nmtst_rand_select(RTN_BLACKHOLE, RTN_UNREACHABLE, RTN_PROHIBIT), + .metric = 1000, + }; + } + + nm_platform_ip_route_normalize(addr_family, &rr.rx); + + if (IS_IPv4) + r = nm_platform_ip4_route_add(NM_PLATFORM_GET, NMP_NLM_FLAG_APPEND, &rr.r4); + else + r = nm_platform_ip6_route_add(NM_PLATFORM_GET, NMP_NLM_FLAG_APPEND, &rr.r6); + + g_assert_cmpint(r, ==, 0); + + nmp_object_stackinit(&obj_stack, NMP_OBJECT_TYPE_IP_ROUTE(IS_IPv4), &rr); + + obj = nm_platform_lookup_obj(NM_PLATFORM_GET, NMP_CACHE_ID_TYPE_OBJECT_TYPE, &obj_stack); + + _LOGT(">>> adding %s", + nmp_object_to_string(&obj_stack, NMP_OBJECT_TO_STRING_ALL, g_alloca(1000), 1000)); + _LOGT(">>> found %s", + nmp_object_to_string(obj, NMP_OBJECT_TO_STRING_ALL, g_alloca(1000), 1000)); + + g_assert(obj); + + head_entry = nm_platform_lookup_object(NM_PLATFORM_GET, NMP_OBJECT_TYPE_IP_ROUTE(IS_IPv4), 0); + g_assert(head_entry); + g_assert_cmpint(head_entry->len, ==, 1); + i = 0; + nm_dedup_multi_iter_for_each (&iter, head_entry) { + i++; + g_assert(iter.current->obj == obj); + } + g_assert_cmpint(i, ==, 1); +} + +/*****************************************************************************/ + NMTstpSetupFunc const _nmtstp_setup_platform_func = SETUP; void @@ -1923,4 +1981,8 @@ _nmtstp_setup_tests(void) add_test_func_data("/route/rule/3", test_rule, GINT_TO_POINTER(3)); add_test_func_data("/route/rule/4", test_rule, GINT_TO_POINTER(4)); } + if (nmtstp_is_root_test()) { + add_test_func_data("/route/blackhole/1", test_blackhole, GINT_TO_POINTER(1)); + add_test_func_data("/route/blackhole/2", test_blackhole, GINT_TO_POINTER(2)); + } } diff --git a/src/libnm-platform/nm-linux-platform.c b/src/libnm-platform/nm-linux-platform.c index 411a49d599..93935b98d4 100644 --- a/src/libnm-platform/nm-linux-platform.c +++ b/src/libnm-platform/nm-linux-platform.c @@ -3423,7 +3423,12 @@ _new_from_nl_route(struct nlmsghdr *nlh, gboolean id_only) else return NULL; - if (!NM_IN_SET(rtm->rtm_type, RTN_UNICAST, RTN_LOCAL)) + if (!NM_IN_SET(rtm->rtm_type, + RTN_UNICAST, + RTN_LOCAL, + RTN_BLACKHOLE, + RTN_UNREACHABLE, + RTN_PROHIBIT)) return NULL; if (nlmsg_parse_arr(nlh, sizeof(struct rtmsg), tb, policy) < 0) @@ -3497,16 +3502,45 @@ rta_multipath_done:; /* If no nexthops have been provided via RTA_MULTIPATH * we add it as regular nexthop to maintain backwards * compatibility */ - nh.ifindex = ifindex; - nh.gateway = gateway; + nh.ifindex = ifindex; + nh.gateway = gateway; + nh.is_present = TRUE; } else { /* Kernel supports new style nexthop configuration, * verify that it is a duplicate and ignore old-style nexthop. */ if (nh.ifindex != ifindex || memcmp(&nh.gateway, &gateway, addr_len) != 0) return NULL; } - } else if (!nh.is_present) - return NULL; + } + + if (nm_platform_route_type_is_nodev(rtm->rtm_type)) { + /* These routes are special. They don't have an device/ifindex. + * + * Well, actually, for IPv6 kernel will always say that the device is + * 1 (lo). Of course it does!! */ + if (nh.is_present) { + if (IS_IPv4) { + if (nh.ifindex != 0 || nh.gateway.addr4 != 0) { + /* we only accept kernel to notify about the ifindex/gateway, if it + * is zero. This is only to be a bit forgiving, but we really don't + * know how to handle such routes that have an ifindex. */ + return NULL; + } + } else { + if (!NM_IN_SET(nh.ifindex, 0, 1) || !IN6_IS_ADDR_UNSPECIFIED(&nh.gateway.addr6)) { + /* We allow an ifindex of 1 (will be normalized to zero). Otherwise, + * we don't expect a device/next hop. */ + return NULL; + } + nh.ifindex = 0; + } + } + } else { + if (!nh.is_present) { + /* a "normal" route needs a device. This is not the route we are looking for. */ + return NULL; + } + } /*****************************************************************/ diff --git a/src/libnm-platform/nmp-object.c b/src/libnm-platform/nmp-object.c index 8bd43ef0e5..d518e6e589 100644 --- a/src/libnm-platform/nmp-object.c +++ b/src/libnm-platform/nmp-object.c @@ -386,7 +386,11 @@ _idx_obj_part(const DedupMultiIdxType *idx_type, nm_hash_update_val(h, obj_a); return 0; } - nm_assert(NMP_OBJECT_CAST_OBJ_WITH_IFINDEX(obj_a)->ifindex > 0); + nm_assert(NMP_OBJECT_CAST_OBJ_WITH_IFINDEX(obj_a)->ifindex > 0 + || (NMP_OBJECT_CAST_OBJ_WITH_IFINDEX(obj_a)->ifindex == 0 + && NM_IN_SET(NMP_OBJECT_GET_TYPE(obj_a), + NMP_OBJECT_TYPE_IP4_ROUTE, + NMP_OBJECT_TYPE_IP6_ROUTE))); if (obj_b) { return NMP_OBJECT_GET_TYPE(obj_a) == NMP_OBJECT_GET_TYPE(obj_b) && NMP_OBJECT_CAST_OBJ_WITH_IFINDEX(obj_a)->ifindex @@ -401,14 +405,14 @@ _idx_obj_part(const DedupMultiIdxType *idx_type, case NMP_CACHE_ID_TYPE_ROUTES_BY_WEAK_ID: obj_type = NMP_OBJECT_GET_TYPE(obj_a); if (!NM_IN_SET(obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE) - || NMP_OBJECT_CAST_IP_ROUTE(obj_a)->ifindex <= 0) { + || NMP_OBJECT_CAST_IP_ROUTE(obj_a)->ifindex < 0) { if (h) nm_hash_update_val(h, obj_a); return 0; } if (obj_b) { return obj_type == NMP_OBJECT_GET_TYPE(obj_b) - && NMP_OBJECT_CAST_IP_ROUTE(obj_b)->ifindex > 0 + && NMP_OBJECT_CAST_IP_ROUTE(obj_b)->ifindex >= 0 && (obj_type == NMP_OBJECT_TYPE_IP4_ROUTE ? (nm_platform_ip4_route_cmp(&obj_a->ip4_route, &obj_b->ip4_route, From ea4f6d7994af3820eb4646ea2bbe915fa27b09a2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 15:43:04 +0100 Subject: [PATCH 035/118] platform: rename NMPRulesManager API to NMPRouteManager Routes of type blackhole, unreachable, prohibit don't have an ifindex/device. They are thus in many ways similar to routing rules, as they are global. We need a mediator to keep track which routes to configure. This will be very similar to what NMPRulesManager already does for routing rules. Rename the API, so that it also can be used for routes. Renaming the file will be done next, so that git's rename detection doesn't get too confused. --- src/core/devices/nm-device.c | 37 +++-- src/core/nm-netns.c | 32 ++-- src/core/nm-netns.h | 2 +- src/core/platform/tests/test-route.c | 64 +++---- src/libnm-platform/nmp-rules-manager.c | 220 ++++++++++++------------- src/libnm-platform/nmp-rules-manager.h | 60 +++---- 6 files changed, 208 insertions(+), 207 deletions(-) diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index a22bd82483..a0e69687bf 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -9283,7 +9283,7 @@ static void _routing_rules_sync(NMDevice *self, NMTernary set_mode) { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self); - NMPRulesManager *rules_manager = nm_netns_get_rules_manager(nm_device_get_netns(self)); + NMPRouteManager *route_manager = nm_netns_get_route_manager(nm_device_get_netns(self)); NMDeviceClass *klass = NM_DEVICE_GET_CLASS(self); gboolean untrack_only_dirty = FALSE; gboolean keep_deleted_rules; @@ -9301,9 +9301,9 @@ _routing_rules_sync(NMDevice *self, NMTernary set_mode) int is_ipv4; untrack_only_dirty = TRUE; - nmp_rules_manager_set_dirty(rules_manager, user_tag_1); + nmp_route_manager_set_dirty(route_manager, user_tag_1); if (klass->get_extra_rules) - nmp_rules_manager_set_dirty(rules_manager, user_tag_2); + nmp_route_manager_set_dirty(route_manager, user_tag_2); applied_connection = nm_device_get_applied_connection(self); @@ -9323,13 +9323,13 @@ _routing_rules_sync(NMDevice *self, NMTernary set_mode) nm_ip_routing_rule_to_platform(rule, &plrule); /* We track this rule, but we also make it explicitly not weakly-tracked - * (meaning to untrack NMP_RULES_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG at + * (meaning to untrack NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG at * the same time). */ - nmp_rules_manager_track(rules_manager, - &plrule, - 10, - user_tag_1, - NMP_RULES_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG); + nmp_route_manager_track_rule(route_manager, + &plrule, + 10, + user_tag_1, + NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG); } } @@ -9339,24 +9339,25 @@ _routing_rules_sync(NMDevice *self, NMTernary set_mode) extra_rules = klass->get_extra_rules(self); if (extra_rules) { for (i = 0; i < extra_rules->len; i++) { - nmp_rules_manager_track(rules_manager, - NMP_OBJECT_CAST_ROUTING_RULE(extra_rules->pdata[i]), - 10, - user_tag_2, - NMP_RULES_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG); + nmp_route_manager_track_rule( + route_manager, + NMP_OBJECT_CAST_ROUTING_RULE(extra_rules->pdata[i]), + 10, + user_tag_2, + NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG); } } } } - nmp_rules_manager_untrack_all(rules_manager, user_tag_1, !untrack_only_dirty); + nmp_route_manager_untrack_all(route_manager, user_tag_1, !untrack_only_dirty); if (klass->get_extra_rules) - nmp_rules_manager_untrack_all(rules_manager, user_tag_2, !untrack_only_dirty); + nmp_route_manager_untrack_all(route_manager, user_tag_2, !untrack_only_dirty); keep_deleted_rules = FALSE; if (set_mode == NM_TERNARY_DEFAULT) { /* when exiting NM, we leave the device up and the rules configured. - * We just all nmp_rules_manager_sync() to forget about the synced rules, + * We just all nmp_route_manager_sync_rules() to forget about the synced rules, * but we don't actually delete them. * * FIXME: that is a problem after restart of NetworkManager, because these @@ -9370,7 +9371,7 @@ _routing_rules_sync(NMDevice *self, NMTernary set_mode) * file and track them after restart again. */ keep_deleted_rules = TRUE; } - nmp_rules_manager_sync(rules_manager, keep_deleted_rules); + nmp_route_manager_sync_rules(route_manager, keep_deleted_rules); } static gboolean diff --git a/src/core/nm-netns.c b/src/core/nm-netns.c index 4d3c3172ae..1253c8b4a2 100644 --- a/src/core/nm-netns.c +++ b/src/core/nm-netns.c @@ -25,7 +25,7 @@ typedef struct { NMNetns *_self_signal_user_data; NMPlatform *platform; NMPNetns *platform_netns; - NMPRulesManager *rules_manager; + NMPRouteManager *route_manager; GHashTable *l3cfgs; GHashTable *shared_ips; CList l3cfg_signal_pending_lst_head; @@ -79,10 +79,10 @@ nm_netns_get_platform(NMNetns *self) return NM_NETNS_GET_PRIVATE(self)->platform; } -NMPRulesManager * -nm_netns_get_rules_manager(NMNetns *self) +NMPRouteManager * +nm_netns_get_route_manager(NMNetns *self) { - return NM_NETNS_GET_PRIVATE(self)->rules_manager; + return NM_NETNS_GET_PRIVATE(self)->route_manager; } NMDedupMultiIndex * @@ -397,14 +397,14 @@ constructed(GObject *object) priv->platform_netns = nm_platform_netns_get(priv->platform); - priv->rules_manager = nmp_rules_manager_new(priv->platform); + priv->route_manager = nmp_route_manager_new(priv->platform); /* Weakly track the default rules with a dummy user-tag. These * rules are always weekly tracked... */ - nmp_rules_manager_track_default(priv->rules_manager, - AF_UNSPEC, - 0, - nm_netns_parent_class /* static dummy user-tag */); + nmp_route_manager_track_rule_default(priv->route_manager, + AF_UNSPEC, + 0, + nm_netns_parent_class /* static dummy user-tag */); /* Also weakly track all existing rules. These were added before NetworkManager * starts, so they are probably none of NetworkManager's business. @@ -414,12 +414,12 @@ constructed(GObject *object) * of NetworkManager, we just don't know. * * For that reason, whenever we will touch such rules later one, we make them - * fully owned and no longer weekly tracked. See %NMP_RULES_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG. */ - nmp_rules_manager_track_from_platform(priv->rules_manager, - NULL, - AF_UNSPEC, - 0, - NMP_RULES_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG); + * fully owned and no longer weekly tracked. See %NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG. */ + nmp_route_manager_track_rule_from_platform(priv->route_manager, + NULL, + AF_UNSPEC, + 0, + NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG); G_OBJECT_CLASS(nm_netns_parent_class)->constructed(object); @@ -469,7 +469,7 @@ dispose(GObject *object) g_clear_object(&priv->platform); nm_clear_pointer(&priv->l3cfgs, g_hash_table_unref); - nm_clear_pointer(&priv->rules_manager, nmp_rules_manager_unref); + nm_clear_pointer(&priv->route_manager, nmp_route_manager_unref); G_OBJECT_CLASS(nm_netns_parent_class)->dispose(object); } diff --git a/src/core/nm-netns.h b/src/core/nm-netns.h index 0cb5637544..deb1d1f006 100644 --- a/src/core/nm-netns.h +++ b/src/core/nm-netns.h @@ -29,7 +29,7 @@ NMNetns *nm_netns_new(struct _NMPlatform *platform); struct _NMPlatform *nm_netns_get_platform(NMNetns *self); NMPNetns *nm_netns_get_platform_netns(NMNetns *self); -struct _NMPRulesManager *nm_netns_get_rules_manager(NMNetns *self); +struct _NMPRouteManager *nm_netns_get_route_manager(NMNetns *self); struct _NMDedupMultiIndex *nm_netns_get_multi_idx(NMNetns *self); diff --git a/src/core/platform/tests/test-route.c b/src/core/platform/tests/test-route.c index 4974a409cb..969ed7f2f5 100644 --- a/src/core/platform/tests/test-route.c +++ b/src/core/platform/tests/test-route.c @@ -1637,8 +1637,8 @@ again: if (TEST_SYNC) { gs_unref_hashtable GHashTable *unique_priorities = g_hash_table_new(NULL, NULL); - nm_auto_unref_rules_manager NMPRulesManager *rules_manager = - nmp_rules_manager_new(platform); + nm_auto_unref_route_manager NMPRouteManager *route_manager = + nmp_route_manager_new(platform); gs_unref_ptrarray GPtrArray *objs_sync = NULL; gconstpointer USER_TAG_1 = &platform; gconstpointer USER_TAG_2 = &unique_priorities; @@ -1660,29 +1660,29 @@ again: } for (i = 0; i < objs_sync->len; i++) { - nmp_rules_manager_track(rules_manager, - NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), - 1, - USER_TAG_1, - NULL); + nmp_route_manager_track_rule(route_manager, + NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), + 1, + USER_TAG_1, + NULL); if (nmtst_get_rand_bool()) { /* this has no effect, because a negative priority (of same absolute value) * has lower priority than the positive priority above. */ - nmp_rules_manager_track(rules_manager, - NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), - -1, - USER_TAG_2, - NULL); + nmp_route_manager_track_rule(route_manager, + NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), + -1, + USER_TAG_2, + NULL); } if (nmtst_get_rand_uint32() % objs_sync->len == 0) { - nmp_rules_manager_sync(rules_manager, FALSE); + nmp_route_manager_sync_rules(route_manager, FALSE); g_assert_cmpint(nmtstp_platform_routing_rules_get_count(platform, AF_UNSPEC), ==, i + 1); } } - nmp_rules_manager_sync(rules_manager, FALSE); + nmp_route_manager_sync_rules(route_manager, FALSE); g_assert_cmpint(nmtstp_platform_routing_rules_get_count(platform, AF_UNSPEC), ==, objs_sync->len); @@ -1690,37 +1690,37 @@ again: for (i = 0; i < objs_sync->len; i++) { switch (nmtst_get_rand_uint32() % 3) { case 0: - nmp_rules_manager_untrack(rules_manager, - NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), - USER_TAG_1); - nmp_rules_manager_untrack(rules_manager, - NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), - USER_TAG_1); + nmp_route_manager_untrack_rule(route_manager, + NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), + USER_TAG_1); + nmp_route_manager_untrack_rule(route_manager, + NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), + USER_TAG_1); break; case 1: - nmp_rules_manager_track(rules_manager, - NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), - -1, - USER_TAG_1, - NULL); + nmp_route_manager_track_rule(route_manager, + NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), + -1, + USER_TAG_1, + NULL); break; case 2: - nmp_rules_manager_track(rules_manager, - NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), - -2, - USER_TAG_2, - NULL); + nmp_route_manager_track_rule(route_manager, + NMP_OBJECT_CAST_ROUTING_RULE(objs_sync->pdata[i]), + -2, + USER_TAG_2, + NULL); break; } if (nmtst_get_rand_uint32() % objs_sync->len == 0) { - nmp_rules_manager_sync(rules_manager, FALSE); + nmp_route_manager_sync_rules(route_manager, FALSE); g_assert_cmpint(nmtstp_platform_routing_rules_get_count(platform, AF_UNSPEC), ==, objs_sync->len - i - 1); } } - nmp_rules_manager_sync(rules_manager, FALSE); + nmp_route_manager_sync_rules(route_manager, FALSE); } else { for (i = 0; i < objs->len;) { diff --git a/src/libnm-platform/nmp-rules-manager.c b/src/libnm-platform/nmp-rules-manager.c index 746d1eaa74..bd63d462d8 100644 --- a/src/libnm-platform/nmp-rules-manager.c +++ b/src/libnm-platform/nmp-rules-manager.c @@ -13,7 +13,7 @@ /*****************************************************************************/ -struct _NMPRulesManager { +struct _NMPRouteManager { NMPlatform *platform; GHashTable *by_obj; GHashTable *by_user_tag; @@ -23,12 +23,12 @@ struct _NMPRulesManager { /*****************************************************************************/ -static void _rules_init(NMPRulesManager *self); +static void _rules_init(NMPRouteManager *self); /*****************************************************************************/ #define _NMLOG_DOMAIN LOGD_PLATFORM -#define _NMLOG_PREFIX_NAME "rules-manager" +#define _NMLOG_PREFIX_NAME "route-manager" #define _NMLOG(level, ...) \ G_STMT_START \ @@ -50,10 +50,10 @@ static void _rules_init(NMPRulesManager *self); /*****************************************************************************/ static gboolean -NMP_IS_RULES_MANAGER(gpointer self) +NMP_IS_ROUTE_MANAGER(gpointer self) { - return self && ((NMPRulesManager *) self)->ref_count > 0 - && NM_IS_PLATFORM(((NMPRulesManager *) self)->platform); + return self && ((NMPRouteManager *) self)->ref_count > 0 + && NM_IS_PLATFORM(((NMPRouteManager *) self)->platform); } #define _USER_TAG_LOG(user_tag) nm_hash_obfuscate_ptr(1240261787u, (user_tag)) @@ -109,13 +109,13 @@ typedef struct { /* indicates whether we configured/removed the rule (during sync()). We need that, so * if the rule gets untracked, that we know to remove/restore it. * - * This makes NMPRulesManager stateful (beyond the configuration that indicates + * This makes NMPRouteManager stateful (beyond the configuration that indicates * which rules are tracked). * After a restart, NetworkManager would no longer remember which rules were added * by us. * * That is partially fixed by NetworkManager taking over the rules that it - * actively configures (see %NMP_RULES_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG). */ + * actively configures (see %NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG). */ ConfigState config_state; } RulesObjData; @@ -126,7 +126,7 @@ typedef struct { /*****************************************************************************/ -static void _rules_data_untrack(NMPRulesManager *self, +static void _rules_data_untrack(NMPRouteManager *self, RulesData *rules_data, gboolean remove_user_tag_data, gboolean make_owned_by_us); @@ -289,8 +289,8 @@ _rules_data_lookup(GHashTable *by_data, const NMPObject *obj, gconstpointer user } /** - * nmp_rules_manager_track: - * @self: the #NMPRulesManager instance + * nmp_route_manager_track_rule: + * @self: the #NMPRouteManager instance * @routing_rule: the #NMPlatformRoutingRule to track or untrack * @track_priority: the priority for tracking the rule. Note that * negative values indicate a forced absence of the rule. Priorities @@ -302,17 +302,17 @@ _rules_data_lookup(GHashTable *by_data, const NMPObject *obj, gconstpointer user * @user_tag: the tag associated with tracking this rule. The same tag * must be used to untrack the rule later. * @user_tag_untrack: if not %NULL, at the same time untrack this user-tag - * for the same rule. Note that this is different from a plain nmp_rules_manager_untrack(), + * for the same rule. Note that this is different from a plain nmp_route_manager_untrack_rule(), * because it enforces ownership of the now tracked rule. On the other hand, - * a plain nmp_rules_manager_untrack() merely forgets about the tracking. - * The purpose here is to set this to %NMP_RULES_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG. + * a plain nmp_route_manager_untrack_rule() merely forgets about the tracking. + * The purpose here is to set this to %NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG. */ void -nmp_rules_manager_track(NMPRulesManager *self, - const NMPlatformRoutingRule *routing_rule, - gint32 track_priority, - gconstpointer user_tag, - gconstpointer user_tag_untrack) +nmp_route_manager_track_rule(NMPRouteManager *self, + const NMPlatformRoutingRule *routing_rule, + gint32 track_priority, + gconstpointer user_tag, + gconstpointer user_tag_untrack) { NMPObject obj_stack; const NMPObject *p_obj_stack; @@ -323,7 +323,7 @@ nmp_rules_manager_track(NMPRulesManager *self, guint32 track_priority_val; gboolean track_priority_present; - g_return_if_fail(NMP_IS_RULES_MANAGER(self)); + g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); g_return_if_fail(routing_rule); g_return_if_fail(user_tag); nm_assert(track_priority != G_MININT32); @@ -414,14 +414,14 @@ nmp_rules_manager_track(NMPRulesManager *self, } static void -_rules_data_untrack(NMPRulesManager *self, +_rules_data_untrack(NMPRouteManager *self, RulesData *rules_data, gboolean remove_user_tag_data, gboolean make_owned_by_us) { RulesObjData *obj_data; - nm_assert(NMP_IS_RULES_MANAGER(self)); + nm_assert(NMP_IS_ROUTE_MANAGER(self)); _rules_data_assert(rules_data, TRUE); nm_assert(self->by_data); nm_assert(g_hash_table_lookup(self->by_data, rules_data) == rules_data); @@ -465,15 +465,15 @@ _rules_data_untrack(NMPRulesManager *self, } void -nmp_rules_manager_untrack(NMPRulesManager *self, - const NMPlatformRoutingRule *routing_rule, - gconstpointer user_tag) +nmp_route_manager_untrack_rule(NMPRouteManager *self, + const NMPlatformRoutingRule *routing_rule, + gconstpointer user_tag) { NMPObject obj_stack; const NMPObject *p_obj_stack; RulesData *rules_data; - g_return_if_fail(NMP_IS_RULES_MANAGER(self)); + g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); g_return_if_fail(routing_rule); g_return_if_fail(user_tag); @@ -489,12 +489,12 @@ nmp_rules_manager_untrack(NMPRulesManager *self, } void -nmp_rules_manager_set_dirty(NMPRulesManager *self, gconstpointer user_tag) +nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag) { RulesData *rules_data; RulesUserTagData *user_tag_data; - g_return_if_fail(NMP_IS_RULES_MANAGER(self)); + g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); g_return_if_fail(user_tag); if (!self->by_data) @@ -509,7 +509,7 @@ nmp_rules_manager_set_dirty(NMPRulesManager *self, gconstpointer user_tag) } void -nmp_rules_manager_untrack_all(NMPRulesManager *self, +nmp_route_manager_untrack_all(NMPRouteManager *self, gconstpointer user_tag, gboolean all /* or only dirty */) { @@ -517,7 +517,7 @@ nmp_rules_manager_untrack_all(NMPRulesManager *self, RulesData *rules_data_safe; RulesUserTagData *user_tag_data; - g_return_if_fail(NMP_IS_RULES_MANAGER(self)); + g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); g_return_if_fail(user_tag); if (!self->by_data) @@ -539,7 +539,7 @@ nmp_rules_manager_untrack_all(NMPRulesManager *self, } void -nmp_rules_manager_sync(NMPRulesManager *self, gboolean keep_deleted_rules) +nmp_route_manager_sync_rules(NMPRouteManager *self, gboolean keep_deleted_rules) { const NMDedupMultiHeadEntry *pl_head_entry; NMDedupMultiIter pl_iter; @@ -550,7 +550,7 @@ nmp_rules_manager_sync(NMPRulesManager *self, gboolean keep_deleted_rules) guint i; const RulesData *rd_best; - g_return_if_fail(NMP_IS_RULES_MANAGER(self)); + g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); if (!self->by_data) return; @@ -643,18 +643,18 @@ nmp_rules_manager_sync(NMPRulesManager *self, gboolean keep_deleted_rules) } void -nmp_rules_manager_track_from_platform(NMPRulesManager *self, - NMPlatform *platform, - int addr_family, - gint32 tracking_priority, - gconstpointer user_tag) +nmp_route_manager_track_rule_from_platform(NMPRouteManager *self, + NMPlatform *platform, + int addr_family, + gint32 tracking_priority, + gconstpointer user_tag) { NMPLookup lookup; const NMDedupMultiHeadEntry *head_entry; NMDedupMultiIter iter; const NMPObject *o; - g_return_if_fail(NMP_IS_RULES_MANAGER(self)); + g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); if (!platform) platform = self->platform; @@ -671,87 +671,87 @@ nmp_rules_manager_track_from_platform(NMPRulesManager *self, if (addr_family != AF_UNSPEC && rr->addr_family != addr_family) continue; - nmp_rules_manager_track(self, rr, tracking_priority, user_tag, NULL); + nmp_route_manager_track_rule(self, rr, tracking_priority, user_tag, NULL); } } /*****************************************************************************/ void -nmp_rules_manager_track_default(NMPRulesManager *self, - int addr_family, - gint32 track_priority, - gconstpointer user_tag) +nmp_route_manager_track_rule_default(NMPRouteManager *self, + int addr_family, + gint32 track_priority, + gconstpointer user_tag) { - g_return_if_fail(NMP_IS_RULES_MANAGER(self)); + g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); nm_assert(NM_IN_SET(addr_family, AF_UNSPEC, AF_INET, AF_INET6)); /* track the default rules. See also `man ip-rule`. */ if (NM_IN_SET(addr_family, AF_UNSPEC, AF_INET)) { - nmp_rules_manager_track(self, - &((NMPlatformRoutingRule){ - .addr_family = AF_INET, - .priority = 0, - .table = RT_TABLE_LOCAL, - .action = FR_ACT_TO_TBL, - .protocol = RTPROT_KERNEL, - }), - track_priority, - user_tag, - NULL); - nmp_rules_manager_track(self, - &((NMPlatformRoutingRule){ - .addr_family = AF_INET, - .priority = 32766, - .table = RT_TABLE_MAIN, - .action = FR_ACT_TO_TBL, - .protocol = RTPROT_KERNEL, - }), - track_priority, - user_tag, - NULL); - nmp_rules_manager_track(self, - &((NMPlatformRoutingRule){ - .addr_family = AF_INET, - .priority = 32767, - .table = RT_TABLE_DEFAULT, - .action = FR_ACT_TO_TBL, - .protocol = RTPROT_KERNEL, - }), - track_priority, - user_tag, - NULL); + nmp_route_manager_track_rule(self, + &((NMPlatformRoutingRule){ + .addr_family = AF_INET, + .priority = 0, + .table = RT_TABLE_LOCAL, + .action = FR_ACT_TO_TBL, + .protocol = RTPROT_KERNEL, + }), + track_priority, + user_tag, + NULL); + nmp_route_manager_track_rule(self, + &((NMPlatformRoutingRule){ + .addr_family = AF_INET, + .priority = 32766, + .table = RT_TABLE_MAIN, + .action = FR_ACT_TO_TBL, + .protocol = RTPROT_KERNEL, + }), + track_priority, + user_tag, + NULL); + nmp_route_manager_track_rule(self, + &((NMPlatformRoutingRule){ + .addr_family = AF_INET, + .priority = 32767, + .table = RT_TABLE_DEFAULT, + .action = FR_ACT_TO_TBL, + .protocol = RTPROT_KERNEL, + }), + track_priority, + user_tag, + NULL); } if (NM_IN_SET(addr_family, AF_UNSPEC, AF_INET6)) { - nmp_rules_manager_track(self, - &((NMPlatformRoutingRule){ - .addr_family = AF_INET6, - .priority = 0, - .table = RT_TABLE_LOCAL, - .action = FR_ACT_TO_TBL, - .protocol = RTPROT_KERNEL, - }), - track_priority, - user_tag, - NULL); - nmp_rules_manager_track(self, - &((NMPlatformRoutingRule){ - .addr_family = AF_INET6, - .priority = 32766, - .table = RT_TABLE_MAIN, - .action = FR_ACT_TO_TBL, - .protocol = RTPROT_KERNEL, - }), - track_priority, - user_tag, - NULL); + nmp_route_manager_track_rule(self, + &((NMPlatformRoutingRule){ + .addr_family = AF_INET6, + .priority = 0, + .table = RT_TABLE_LOCAL, + .action = FR_ACT_TO_TBL, + .protocol = RTPROT_KERNEL, + }), + track_priority, + user_tag, + NULL); + nmp_route_manager_track_rule(self, + &((NMPlatformRoutingRule){ + .addr_family = AF_INET6, + .priority = 32766, + .table = RT_TABLE_MAIN, + .action = FR_ACT_TO_TBL, + .protocol = RTPROT_KERNEL, + }), + track_priority, + user_tag, + NULL); } } static void -_rules_init(NMPRulesManager *self) +_rules_init(NMPRouteManager *self) { if (self->by_data) return; @@ -768,15 +768,15 @@ _rules_init(NMPRulesManager *self) /*****************************************************************************/ -NMPRulesManager * -nmp_rules_manager_new(NMPlatform *platform) +NMPRouteManager * +nmp_route_manager_new(NMPlatform *platform) { - NMPRulesManager *self; + NMPRouteManager *self; g_return_val_if_fail(NM_IS_PLATFORM(platform), NULL); - self = g_slice_new(NMPRulesManager); - *self = (NMPRulesManager){ + self = g_slice_new(NMPRouteManager); + *self = (NMPRouteManager){ .ref_count = 1, .platform = g_object_ref(platform), }; @@ -784,17 +784,17 @@ nmp_rules_manager_new(NMPlatform *platform) } void -nmp_rules_manager_ref(NMPRulesManager *self) +nmp_route_manager_ref(NMPRouteManager *self) { - g_return_if_fail(NMP_IS_RULES_MANAGER(self)); + g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); self->ref_count++; } void -nmp_rules_manager_unref(NMPRulesManager *self) +nmp_route_manager_unref(NMPRouteManager *self) { - g_return_if_fail(NMP_IS_RULES_MANAGER(self)); + g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); if (--self->ref_count > 0) return; @@ -805,5 +805,5 @@ nmp_rules_manager_unref(NMPRulesManager *self) g_hash_table_destroy(self->by_data); } g_object_unref(self->platform); - g_slice_free(NMPRulesManager, self); + g_slice_free(NMPRouteManager, self); } diff --git a/src/libnm-platform/nmp-rules-manager.h b/src/libnm-platform/nmp-rules-manager.h index 65e8ddb236..3bc4a49301 100644 --- a/src/libnm-platform/nmp-rules-manager.h +++ b/src/libnm-platform/nmp-rules-manager.h @@ -1,53 +1,53 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ -#ifndef __NMP_RULES_MANAGER_H__ -#define __NMP_RULES_MANAGER_H__ +#ifndef __NMP_ROUTE_MANAGER_H__ +#define __NMP_ROUTE_MANAGER_H__ #include "nm-platform.h" /*****************************************************************************/ -#define NMP_RULES_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG ((const void *) nmp_rules_manager_new) +#define NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG ((const void *) nmp_route_manager_new) -typedef struct _NMPRulesManager NMPRulesManager; +typedef struct _NMPRouteManager NMPRouteManager; -NMPRulesManager *nmp_rules_manager_new(NMPlatform *platform); +NMPRouteManager *nmp_route_manager_new(NMPlatform *platform); -void nmp_rules_manager_ref(NMPRulesManager *self); -void nmp_rules_manager_unref(NMPRulesManager *self); +void nmp_route_manager_ref(NMPRouteManager *self); +void nmp_route_manager_unref(NMPRouteManager *self); -#define nm_auto_unref_rules_manager nm_auto(_nmp_rules_manager_unref) -NM_AUTO_DEFINE_FCN0(NMPRulesManager *, _nmp_rules_manager_unref, nmp_rules_manager_unref); +#define nm_auto_unref_route_manager nm_auto(_nmp_route_manager_unref) +NM_AUTO_DEFINE_FCN0(NMPRouteManager *, _nmp_route_manager_unref, nmp_route_manager_unref); -void nmp_rules_manager_track(NMPRulesManager *self, - const NMPlatformRoutingRule *routing_rule, - gint32 track_priority, - gconstpointer user_tag, - gconstpointer user_tag_untrack); +void nmp_route_manager_track_rule(NMPRouteManager *self, + const NMPlatformRoutingRule *routing_rule, + gint32 track_priority, + gconstpointer user_tag, + gconstpointer user_tag_untrack); -void nmp_rules_manager_track_default(NMPRulesManager *self, - int addr_family, - gint32 track_priority, - gconstpointer user_tag); +void nmp_route_manager_track_rule_default(NMPRouteManager *self, + int addr_family, + gint32 track_priority, + gconstpointer user_tag); -void nmp_rules_manager_track_from_platform(NMPRulesManager *self, - NMPlatform *platform, - int addr_family, - gint32 tracking_priority, - gconstpointer user_tag); +void nmp_route_manager_track_rule_from_platform(NMPRouteManager *self, + NMPlatform *platform, + int addr_family, + gint32 tracking_priority, + gconstpointer user_tag); -void nmp_rules_manager_untrack(NMPRulesManager *self, - const NMPlatformRoutingRule *routing_rule, - gconstpointer user_tag); +void nmp_route_manager_untrack_rule(NMPRouteManager *self, + const NMPlatformRoutingRule *routing_rule, + gconstpointer user_tag); -void nmp_rules_manager_set_dirty(NMPRulesManager *self, gconstpointer user_tag); +void nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag); -void nmp_rules_manager_untrack_all(NMPRulesManager *self, +void nmp_route_manager_untrack_all(NMPRouteManager *self, gconstpointer user_tag, gboolean all /* or only dirty */); -void nmp_rules_manager_sync(NMPRulesManager *self, gboolean keep_deleted_rules); +void nmp_route_manager_sync_rules(NMPRouteManager *self, gboolean keep_deleted_rules); /*****************************************************************************/ -#endif /* __NMP_RULES_MANAGER_H__ */ +#endif /* __NMP_ROUTE_MANAGER_H__ */ From 3996933c579a1eef59bcfc442644372ab19dd90c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 17:01:27 +0100 Subject: [PATCH 036/118] platform: rename "nmp-route-manager.h" to "nmp-rules-manager.h" --- Makefile.am | 4 ++-- src/core/devices/nm-device-wireguard.c | 2 +- src/core/devices/nm-device.c | 2 +- src/core/nm-netns.c | 2 +- src/core/platform/tests/test-route.c | 2 +- src/libnm-platform/meson.build | 2 +- .../{nmp-rules-manager.c => nmp-route-manager.c} | 2 +- .../{nmp-rules-manager.h => nmp-route-manager.h} | 0 8 files changed, 8 insertions(+), 8 deletions(-) rename src/libnm-platform/{nmp-rules-manager.c => nmp-route-manager.c} (99%) rename src/libnm-platform/{nmp-rules-manager.h => nmp-route-manager.h} (100%) diff --git a/Makefile.am b/Makefile.am index bc8dc4cf27..ab06c6db6e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -603,8 +603,8 @@ src_libnm_platform_libnm_platform_la_SOURCES = \ src/libnm-platform/nmp-netns.h \ src/libnm-platform/nmp-object.c \ src/libnm-platform/nmp-object.h \ - src/libnm-platform/nmp-rules-manager.c \ - src/libnm-platform/nmp-rules-manager.h \ + src/libnm-platform/nmp-route-manager.c \ + src/libnm-platform/nmp-route-manager.h \ src/libnm-platform/wifi/nm-wifi-utils-nl80211.c \ src/libnm-platform/wifi/nm-wifi-utils-nl80211.h \ src/libnm-platform/wifi/nm-wifi-utils-private.h \ diff --git a/src/core/devices/nm-device-wireguard.c b/src/core/devices/nm-device-wireguard.c index 4399e83478..bdb96cb298 100644 --- a/src/core/devices/nm-device-wireguard.c +++ b/src/core/devices/nm-device-wireguard.c @@ -18,7 +18,7 @@ #include "nm-device-private.h" #include "libnm-platform/nm-platform.h" #include "libnm-platform/nmp-object.h" -#include "libnm-platform/nmp-rules-manager.h" +#include "libnm-platform/nmp-route-manager.h" #include "nm-device-factory.h" #include "nm-active-connection.h" #include "nm-act-request.h" diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index a0e69687bf..f7836567a0 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -41,7 +41,7 @@ #include "libnm-platform/nm-platform.h" #include "libnm-platform/nm-platform-utils.h" #include "libnm-platform/nmp-object.h" -#include "libnm-platform/nmp-rules-manager.h" +#include "libnm-platform/nmp-route-manager.h" #include "ndisc/nm-ndisc.h" #include "ndisc/nm-lndp-ndisc.h" diff --git a/src/core/nm-netns.c b/src/core/nm-netns.c index 1253c8b4a2..f120e43d06 100644 --- a/src/core/nm-netns.c +++ b/src/core/nm-netns.c @@ -15,7 +15,7 @@ #include "nm-l3cfg.h" #include "libnm-platform/nm-platform.h" #include "libnm-platform/nmp-netns.h" -#include "libnm-platform/nmp-rules-manager.h" +#include "libnm-platform/nmp-route-manager.h" /*****************************************************************************/ diff --git a/src/core/platform/tests/test-route.c b/src/core/platform/tests/test-route.c index 969ed7f2f5..fb6ca72d32 100644 --- a/src/core/platform/tests/test-route.c +++ b/src/core/platform/tests/test-route.c @@ -10,7 +10,7 @@ #include "nm-core-utils.h" #include "libnm-platform/nm-platform-utils.h" -#include "libnm-platform/nmp-rules-manager.h" +#include "libnm-platform/nmp-route-manager.h" #include "test-common.h" diff --git a/src/libnm-platform/meson.build b/src/libnm-platform/meson.build index 3e4f41a929..d0a7c6c20e 100644 --- a/src/libnm-platform/meson.build +++ b/src/libnm-platform/meson.build @@ -9,7 +9,7 @@ libnm_platform = static_library( 'nm-platform.c', 'nmp-netns.c', 'nmp-object.c', - 'nmp-rules-manager.c', + 'nmp-route-manager.c', 'wifi/nm-wifi-utils-nl80211.c', 'wifi/nm-wifi-utils.c', 'wpan/nm-wpan-utils.c', diff --git a/src/libnm-platform/nmp-rules-manager.c b/src/libnm-platform/nmp-route-manager.c similarity index 99% rename from src/libnm-platform/nmp-rules-manager.c rename to src/libnm-platform/nmp-route-manager.c index bd63d462d8..3e83186ff7 100644 --- a/src/libnm-platform/nmp-rules-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -2,7 +2,7 @@ #include "libnm-glib-aux/nm-default-glib-i18n-lib.h" -#include "nmp-rules-manager.h" +#include "nmp-route-manager.h" #include #include diff --git a/src/libnm-platform/nmp-rules-manager.h b/src/libnm-platform/nmp-route-manager.h similarity index 100% rename from src/libnm-platform/nmp-rules-manager.h rename to src/libnm-platform/nmp-route-manager.h From 5b3e96451b68e8ff38c4ecfb3c2cd6d74a2faf49 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 17:05:46 +0100 Subject: [PATCH 037/118] platform: drop lazy initialization _rules_init() of NMPRouteManager Let's just always allocate the hash tables. We will likely need them, and three hash tables are relatively cheap. --- src/libnm-platform/nmp-route-manager.c | 49 ++++++-------------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c index 3e83186ff7..3174eeef86 100644 --- a/src/libnm-platform/nmp-route-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -23,10 +23,6 @@ struct _NMPRouteManager { /*****************************************************************************/ -static void _rules_init(NMPRouteManager *self); - -/*****************************************************************************/ - #define _NMLOG_DOMAIN LOGD_PLATFORM #define _NMLOG_PREFIX_NAME "route-manager" @@ -328,8 +324,6 @@ nmp_route_manager_track_rule(NMPRouteManager *self, g_return_if_fail(user_tag); nm_assert(track_priority != G_MININT32); - _rules_init(self); - p_obj_stack = nmp_object_stackinit(&obj_stack, NMP_OBJECT_TYPE_ROUTING_RULE, routing_rule); nm_assert(nmp_object_is_visible(p_obj_stack)); @@ -477,8 +471,6 @@ nmp_route_manager_untrack_rule(NMPRouteManager *self, g_return_if_fail(routing_rule); g_return_if_fail(user_tag); - _rules_init(self); - p_obj_stack = nmp_object_stackinit(&obj_stack, NMP_OBJECT_TYPE_ROUTING_RULE, routing_rule); nm_assert(nmp_object_is_visible(p_obj_stack)); @@ -497,9 +489,6 @@ nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag) g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); g_return_if_fail(user_tag); - if (!self->by_data) - return; - user_tag_data = g_hash_table_lookup(self->by_user_tag, &user_tag); if (!user_tag_data) return; @@ -520,9 +509,6 @@ nmp_route_manager_untrack_all(NMPRouteManager *self, g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); g_return_if_fail(user_tag); - if (!self->by_data) - return; - user_tag_data = g_hash_table_lookup(self->by_user_tag, &user_tag); if (!user_tag_data) return; @@ -552,9 +538,6 @@ nmp_route_manager_sync_rules(NMPRouteManager *self, gboolean keep_deleted_rules) g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); - if (!self->by_data) - return; - _LOGD("sync%s", keep_deleted_rules ? " (don't remove any rules)" : ""); pl_head_entry = nm_platform_lookup_obj_type(self->platform, NMP_OBJECT_TYPE_ROUTING_RULE); @@ -750,22 +733,6 @@ nmp_route_manager_track_rule_default(NMPRouteManager *self, } } -static void -_rules_init(NMPRouteManager *self) -{ - if (self->by_data) - return; - - self->by_data = - g_hash_table_new_full(_rules_data_hash, _rules_data_equal, NULL, _rules_data_destroy); - self->by_obj = - g_hash_table_new_full(_rules_obj_hash, _rules_obj_equal, NULL, _rules_obj_destroy); - self->by_user_tag = g_hash_table_new_full(_rules_user_tag_hash, - _rules_user_tag_equal, - NULL, - _rules_user_tag_destroy); -} - /*****************************************************************************/ NMPRouteManager * @@ -779,6 +746,14 @@ nmp_route_manager_new(NMPlatform *platform) *self = (NMPRouteManager){ .ref_count = 1, .platform = g_object_ref(platform), + .by_data = + g_hash_table_new_full(_rules_data_hash, _rules_data_equal, NULL, _rules_data_destroy), + .by_obj = + g_hash_table_new_full(_rules_obj_hash, _rules_obj_equal, NULL, _rules_obj_destroy), + .by_user_tag = g_hash_table_new_full(_rules_user_tag_hash, + _rules_user_tag_equal, + NULL, + _rules_user_tag_destroy), }; return self; } @@ -799,11 +774,9 @@ nmp_route_manager_unref(NMPRouteManager *self) if (--self->ref_count > 0) return; - if (self->by_data) { - g_hash_table_destroy(self->by_user_tag); - g_hash_table_destroy(self->by_obj); - g_hash_table_destroy(self->by_data); - } + g_hash_table_destroy(self->by_user_tag); + g_hash_table_destroy(self->by_obj); + g_hash_table_destroy(self->by_data); g_object_unref(self->platform); g_slice_free(NMPRouteManager, self); } From 75959e2f1acbebfb8a0b6b570e079fe60aa8f2a6 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 17:29:11 +0100 Subject: [PATCH 038/118] platform: rename internals in "nmp-route-manager.c" We will not only track (routing) rules, but also routes. Rename. --- src/libnm-platform/nmp-route-manager.c | 296 +++++++++++++------------ 1 file changed, 149 insertions(+), 147 deletions(-) diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c index 3174eeef86..e7a9c005cd 100644 --- a/src/libnm-platform/nmp-route-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -68,7 +68,7 @@ typedef struct { * * Otherwise, the track_priority_val goes together with track_priority_present. * In case of one rule being tracked multiple times (with different priorities), - * the one with higher priority wins. See _rules_obj_get_best_data(). + * the one with higher priority wins. See _track_obj_data_get_best_data(). * Then, the winning present state either enforces that the rule is present * or absent. * @@ -79,7 +79,7 @@ typedef struct { bool track_priority_present : 1; bool dirty : 1; -} RulesData; +} TrackData; typedef enum { CONFIG_STATE_NONE = 0, @@ -113,92 +113,92 @@ typedef struct { * That is partially fixed by NetworkManager taking over the rules that it * actively configures (see %NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG). */ ConfigState config_state; -} RulesObjData; +} TrackObjData; typedef struct { gconstpointer user_tag; CList user_tag_lst_head; -} RulesUserTagData; +} TrackUserTagData; /*****************************************************************************/ -static void _rules_data_untrack(NMPRouteManager *self, - RulesData *rules_data, +static void _track_data_untrack(NMPRouteManager *self, + TrackData *track_data, gboolean remove_user_tag_data, gboolean make_owned_by_us); /*****************************************************************************/ static void -_rules_data_assert(const RulesData *rules_data, gboolean linked) +_track_data_assert(const TrackData *track_data, gboolean linked) { - nm_assert(rules_data); - nm_assert(NMP_OBJECT_GET_TYPE(rules_data->obj) == NMP_OBJECT_TYPE_ROUTING_RULE); - nm_assert(nmp_object_is_visible(rules_data->obj)); - nm_assert(rules_data->user_tag); - nm_assert(!linked || !c_list_is_empty(&rules_data->obj_lst)); - nm_assert(!linked || !c_list_is_empty(&rules_data->user_tag_lst)); + nm_assert(track_data); + nm_assert(NMP_OBJECT_GET_TYPE(track_data->obj) == NMP_OBJECT_TYPE_ROUTING_RULE); + nm_assert(nmp_object_is_visible(track_data->obj)); + nm_assert(track_data->user_tag); + nm_assert(!linked || !c_list_is_empty(&track_data->obj_lst)); + nm_assert(!linked || !c_list_is_empty(&track_data->user_tag_lst)); } static guint -_rules_data_hash(gconstpointer data) +_track_data_hash(gconstpointer data) { - const RulesData *rules_data = data; + const TrackData *track_data = data; NMHashState h; - _rules_data_assert(rules_data, FALSE); + _track_data_assert(track_data, FALSE); nm_hash_init(&h, 269297543u); - nm_platform_routing_rule_hash_update(NMP_OBJECT_CAST_ROUTING_RULE(rules_data->obj), + nm_platform_routing_rule_hash_update(NMP_OBJECT_CAST_ROUTING_RULE(track_data->obj), NM_PLATFORM_ROUTING_RULE_CMP_TYPE_ID, &h); - nm_hash_update_val(&h, rules_data->user_tag); + nm_hash_update_val(&h, track_data->user_tag); return nm_hash_complete(&h); } static gboolean -_rules_data_equal(gconstpointer data_a, gconstpointer data_b) +_track_data_equal(gconstpointer data_a, gconstpointer data_b) { - const RulesData *rules_data_a = data_a; - const RulesData *rules_data_b = data_b; + const TrackData *track_data_a = data_a; + const TrackData *track_data_b = data_b; - _rules_data_assert(rules_data_a, FALSE); - _rules_data_assert(rules_data_b, FALSE); + _track_data_assert(track_data_a, FALSE); + _track_data_assert(track_data_b, FALSE); - return rules_data_a->user_tag == rules_data_b->user_tag - && (nm_platform_routing_rule_cmp(NMP_OBJECT_CAST_ROUTING_RULE(rules_data_a->obj), - NMP_OBJECT_CAST_ROUTING_RULE(rules_data_b->obj), + return track_data_a->user_tag == track_data_b->user_tag + && (nm_platform_routing_rule_cmp(NMP_OBJECT_CAST_ROUTING_RULE(track_data_a->obj), + NMP_OBJECT_CAST_ROUTING_RULE(track_data_b->obj), NM_PLATFORM_ROUTING_RULE_CMP_TYPE_ID) == 0); } static void -_rules_data_destroy(gpointer data) +_track_data_destroy(gpointer data) { - RulesData *rules_data = data; + TrackData *track_data = data; - _rules_data_assert(rules_data, FALSE); + _track_data_assert(track_data, FALSE); - c_list_unlink_stale(&rules_data->obj_lst); - c_list_unlink_stale(&rules_data->user_tag_lst); - nmp_object_unref(rules_data->obj); - g_slice_free(RulesData, rules_data); + c_list_unlink_stale(&track_data->obj_lst); + c_list_unlink_stale(&track_data->user_tag_lst); + nmp_object_unref(track_data->obj); + g_slice_free(TrackData, track_data); } -static const RulesData * -_rules_obj_get_best_data(RulesObjData *obj_data) +static const TrackData * +_track_obj_data_get_best_data(TrackObjData *obj_data) { - RulesData *rules_data; - const RulesData *rd_best = NULL; + TrackData *track_data; + const TrackData *td_best = NULL; - c_list_for_each_entry (rules_data, &obj_data->obj_lst_head, obj_lst) { - _rules_data_assert(rules_data, TRUE); + c_list_for_each_entry (track_data, &obj_data->obj_lst_head, obj_lst) { + _track_data_assert(track_data, TRUE); - if (rd_best) { - if (rd_best->track_priority_val > rules_data->track_priority_val) + if (td_best) { + if (td_best->track_priority_val > track_data->track_priority_val) continue; - if (rd_best->track_priority_val == rules_data->track_priority_val) { - if (rd_best->track_priority_present || !rules_data->track_priority_present) { + if (td_best->track_priority_val == track_data->track_priority_val) { + if (td_best->track_priority_present || !track_data->track_priority_present) { /* if the priorities are identical, then "present" wins over * "!present" (absent). */ continue; @@ -206,16 +206,16 @@ _rules_obj_get_best_data(RulesObjData *obj_data) } } - rd_best = rules_data; + td_best = track_data; } - return rd_best; + return td_best; } static guint -_rules_obj_hash(gconstpointer data) +_track_obj_data_hash(gconstpointer data) { - const RulesObjData *obj_data = data; + const TrackObjData *obj_data = data; NMHashState h; nm_hash_init(&h, 432817559u); @@ -226,10 +226,10 @@ _rules_obj_hash(gconstpointer data) } static gboolean -_rules_obj_equal(gconstpointer data_a, gconstpointer data_b) +_track_obj_data_equal(gconstpointer data_a, gconstpointer data_b) { - const RulesObjData *obj_data_a = data_a; - const RulesObjData *obj_data_b = data_b; + const TrackObjData *obj_data_a = data_a; + const TrackObjData *obj_data_b = data_b; return (nm_platform_routing_rule_cmp(NMP_OBJECT_CAST_ROUTING_RULE(obj_data_a->obj), NMP_OBJECT_CAST_ROUTING_RULE(obj_data_b->obj), @@ -238,50 +238,50 @@ _rules_obj_equal(gconstpointer data_a, gconstpointer data_b) } static void -_rules_obj_destroy(gpointer data) +_track_obj_data_destroy(gpointer data) { - RulesObjData *obj_data = data; + TrackObjData *obj_data = data; c_list_unlink_stale(&obj_data->obj_lst_head); nmp_object_unref(obj_data->obj); - g_slice_free(RulesObjData, obj_data); + g_slice_free(TrackObjData, obj_data); } static guint -_rules_user_tag_hash(gconstpointer data) +_track_user_tag_data_hash(gconstpointer data) { - const RulesUserTagData *user_tag_data = data; + const TrackUserTagData *user_tag_data = data; return nm_hash_val(644693447u, user_tag_data->user_tag); } static gboolean -_rules_user_tag_equal(gconstpointer data_a, gconstpointer data_b) +_track_user_tag_data_equal(gconstpointer data_a, gconstpointer data_b) { - const RulesUserTagData *user_tag_data_a = data_a; - const RulesUserTagData *user_tag_data_b = data_b; + const TrackUserTagData *user_tag_data_a = data_a; + const TrackUserTagData *user_tag_data_b = data_b; return user_tag_data_a->user_tag == user_tag_data_b->user_tag; } static void -_rules_user_tag_destroy(gpointer data) +_track_user_tag_data_destroy(gpointer data) { - RulesUserTagData *user_tag_data = data; + TrackUserTagData *user_tag_data = data; c_list_unlink_stale(&user_tag_data->user_tag_lst_head); - g_slice_free(RulesUserTagData, user_tag_data); + g_slice_free(TrackUserTagData, user_tag_data); } -static RulesData * -_rules_data_lookup(GHashTable *by_data, const NMPObject *obj, gconstpointer user_tag) +static TrackData * +_track_data_lookup(GHashTable *by_data, const NMPObject *obj, gconstpointer user_tag) { - RulesData rules_data_needle = { + TrackData track_data_needle = { .obj = obj, .user_tag = user_tag, }; - return g_hash_table_lookup(by_data, &rules_data_needle); + return g_hash_table_lookup(by_data, &track_data_needle); } /** @@ -312,9 +312,9 @@ nmp_route_manager_track_rule(NMPRouteManager *self, { NMPObject obj_stack; const NMPObject *p_obj_stack; - RulesData *rules_data; - RulesObjData *obj_data; - RulesUserTagData *user_tag_data; + TrackData *track_data; + TrackObjData *obj_data; + TrackUserTagData *user_tag_data; gboolean changed = FALSE; guint32 track_priority_val; gboolean track_priority_present; @@ -336,11 +336,11 @@ nmp_route_manager_track_rule(NMPRouteManager *self, track_priority_present = FALSE; } - rules_data = _rules_data_lookup(self->by_data, p_obj_stack, user_tag); + track_data = _track_data_lookup(self->by_data, p_obj_stack, user_tag); - if (!rules_data) { - rules_data = g_slice_new(RulesData); - *rules_data = (RulesData){ + if (!track_data) { + track_data = g_slice_new(TrackData); + *track_data = (TrackData){ .obj = nm_dedup_multi_index_obj_intern(nm_platform_get_multi_idx(self->platform), p_obj_stack), .user_tag = user_tag, @@ -348,98 +348,98 @@ nmp_route_manager_track_rule(NMPRouteManager *self, .track_priority_present = track_priority_present, .dirty = FALSE, }; - g_hash_table_add(self->by_data, rules_data); + g_hash_table_add(self->by_data, track_data); - obj_data = g_hash_table_lookup(self->by_obj, &rules_data->obj); + obj_data = g_hash_table_lookup(self->by_obj, &track_data->obj); if (!obj_data) { - obj_data = g_slice_new(RulesObjData); - *obj_data = (RulesObjData){ - .obj = nmp_object_ref(rules_data->obj), + obj_data = g_slice_new(TrackObjData); + *obj_data = (TrackObjData){ + .obj = nmp_object_ref(track_data->obj), .obj_lst_head = C_LIST_INIT(obj_data->obj_lst_head), .config_state = CONFIG_STATE_NONE, }; g_hash_table_add(self->by_obj, obj_data); } - c_list_link_tail(&obj_data->obj_lst_head, &rules_data->obj_lst); + c_list_link_tail(&obj_data->obj_lst_head, &track_data->obj_lst); - user_tag_data = g_hash_table_lookup(self->by_user_tag, &rules_data->user_tag); + user_tag_data = g_hash_table_lookup(self->by_user_tag, &track_data->user_tag); if (!user_tag_data) { - user_tag_data = g_slice_new(RulesUserTagData); - *user_tag_data = (RulesUserTagData){ + user_tag_data = g_slice_new(TrackUserTagData); + *user_tag_data = (TrackUserTagData){ .user_tag = user_tag, .user_tag_lst_head = C_LIST_INIT(user_tag_data->user_tag_lst_head), }; g_hash_table_add(self->by_user_tag, user_tag_data); } - c_list_link_tail(&user_tag_data->user_tag_lst_head, &rules_data->user_tag_lst); + c_list_link_tail(&user_tag_data->user_tag_lst_head, &track_data->user_tag_lst); changed = TRUE; } else { - rules_data->dirty = FALSE; - if (rules_data->track_priority_val != track_priority_val - || rules_data->track_priority_present != track_priority_present) { - rules_data->track_priority_val = track_priority_val; - rules_data->track_priority_present = track_priority_present; + track_data->dirty = FALSE; + if (track_data->track_priority_val != track_priority_val + || track_data->track_priority_present != track_priority_present) { + track_data->track_priority_val = track_priority_val; + track_data->track_priority_present = track_priority_present; changed = TRUE; } } if (user_tag_untrack) { if (user_tag != user_tag_untrack) { - RulesData *rules_data_untrack; + TrackData *track_data_untrack; - rules_data_untrack = _rules_data_lookup(self->by_data, p_obj_stack, user_tag_untrack); - if (rules_data_untrack) - _rules_data_untrack(self, rules_data_untrack, FALSE, TRUE); + track_data_untrack = _track_data_lookup(self->by_data, p_obj_stack, user_tag_untrack); + if (track_data_untrack) + _track_data_untrack(self, track_data_untrack, FALSE, TRUE); } else nm_assert_not_reached(); } - _rules_data_assert(rules_data, TRUE); + _track_data_assert(track_data, TRUE); if (changed) { _LOGD("routing-rule: track [" NM_HASH_OBFUSCATE_PTR_FMT ",%s%u] \"%s\")", - _USER_TAG_LOG(rules_data->user_tag), - (rules_data->track_priority_val == 0 + _USER_TAG_LOG(track_data->user_tag), + (track_data->track_priority_val == 0 ? "" - : (rules_data->track_priority_present ? "+" : "-")), - (guint) rules_data->track_priority_val, - nmp_object_to_string(rules_data->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0)); + : (track_data->track_priority_present ? "+" : "-")), + (guint) track_data->track_priority_val, + nmp_object_to_string(track_data->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0)); } } static void -_rules_data_untrack(NMPRouteManager *self, - RulesData *rules_data, +_track_data_untrack(NMPRouteManager *self, + TrackData *track_data, gboolean remove_user_tag_data, gboolean make_owned_by_us) { - RulesObjData *obj_data; + TrackObjData *obj_data; nm_assert(NMP_IS_ROUTE_MANAGER(self)); - _rules_data_assert(rules_data, TRUE); + _track_data_assert(track_data, TRUE); nm_assert(self->by_data); - nm_assert(g_hash_table_lookup(self->by_data, rules_data) == rules_data); + nm_assert(g_hash_table_lookup(self->by_data, track_data) == track_data); _LOGD("routing-rule: untrack [" NM_HASH_OBFUSCATE_PTR_FMT "] \"%s\"", - _USER_TAG_LOG(rules_data->user_tag), - nmp_object_to_string(rules_data->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0)); + _USER_TAG_LOG(track_data->user_tag), + nmp_object_to_string(track_data->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0)); #if NM_MORE_ASSERTS { - RulesUserTagData *user_tag_data; + TrackUserTagData *user_tag_data; - user_tag_data = g_hash_table_lookup(self->by_user_tag, &rules_data->user_tag); + user_tag_data = g_hash_table_lookup(self->by_user_tag, &track_data->user_tag); nm_assert(user_tag_data); - nm_assert(c_list_contains(&user_tag_data->user_tag_lst_head, &rules_data->user_tag_lst)); + nm_assert(c_list_contains(&user_tag_data->user_tag_lst_head, &track_data->user_tag_lst)); } #endif - nm_assert(!c_list_is_empty(&rules_data->user_tag_lst)); + nm_assert(!c_list_is_empty(&track_data->user_tag_lst)); - obj_data = g_hash_table_lookup(self->by_obj, &rules_data->obj); + obj_data = g_hash_table_lookup(self->by_obj, &track_data->obj); nm_assert(obj_data); - nm_assert(c_list_contains(&obj_data->obj_lst_head, &rules_data->obj_lst)); - nm_assert(obj_data == g_hash_table_lookup(self->by_obj, &rules_data->obj)); + nm_assert(c_list_contains(&obj_data->obj_lst_head, &track_data->obj_lst)); + nm_assert(obj_data == g_hash_table_lookup(self->by_obj, &track_data->obj)); if (make_owned_by_us) { if (obj_data->config_state == CONFIG_STATE_NONE) { @@ -447,15 +447,15 @@ _rules_data_untrack(NMPRouteManager *self, * sync. */ obj_data->config_state = CONFIG_STATE_OWNED_BY_US; } - } else if (remove_user_tag_data && c_list_length_is(&rules_data->user_tag_lst, 1)) - g_hash_table_remove(self->by_user_tag, &rules_data->user_tag); + } else if (remove_user_tag_data && c_list_length_is(&track_data->user_tag_lst, 1)) + g_hash_table_remove(self->by_user_tag, &track_data->user_tag); /* if obj_data is marked to be "added_by_us" or "removed_by_us", we need to keep this entry * around for the next sync -- so that we can undo what we did earlier. */ - if (obj_data->config_state == CONFIG_STATE_NONE && c_list_length_is(&rules_data->obj_lst, 1)) - g_hash_table_remove(self->by_obj, &rules_data->obj); + if (obj_data->config_state == CONFIG_STATE_NONE && c_list_length_is(&track_data->obj_lst, 1)) + g_hash_table_remove(self->by_obj, &track_data->obj); - g_hash_table_remove(self->by_data, rules_data); + g_hash_table_remove(self->by_data, track_data); } void @@ -465,7 +465,7 @@ nmp_route_manager_untrack_rule(NMPRouteManager *self, { NMPObject obj_stack; const NMPObject *p_obj_stack; - RulesData *rules_data; + TrackData *track_data; g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); g_return_if_fail(routing_rule); @@ -475,16 +475,16 @@ nmp_route_manager_untrack_rule(NMPRouteManager *self, nm_assert(nmp_object_is_visible(p_obj_stack)); - rules_data = _rules_data_lookup(self->by_data, p_obj_stack, user_tag); - if (rules_data) - _rules_data_untrack(self, rules_data, TRUE, FALSE); + track_data = _track_data_lookup(self->by_data, p_obj_stack, user_tag); + if (track_data) + _track_data_untrack(self, track_data, TRUE, FALSE); } void nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag) { - RulesData *rules_data; - RulesUserTagData *user_tag_data; + TrackData *track_data; + TrackUserTagData *user_tag_data; g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); g_return_if_fail(user_tag); @@ -493,8 +493,8 @@ nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag) if (!user_tag_data) return; - c_list_for_each_entry (rules_data, &user_tag_data->user_tag_lst_head, user_tag_lst) - rules_data->dirty = TRUE; + c_list_for_each_entry (track_data, &user_tag_data->user_tag_lst_head, user_tag_lst) + track_data->dirty = TRUE; } void @@ -502,9 +502,9 @@ nmp_route_manager_untrack_all(NMPRouteManager *self, gconstpointer user_tag, gboolean all /* or only dirty */) { - RulesData *rules_data; - RulesData *rules_data_safe; - RulesUserTagData *user_tag_data; + TrackData *track_data; + TrackData *track_data_safe; + TrackUserTagData *user_tag_data; g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); g_return_if_fail(user_tag); @@ -513,12 +513,12 @@ nmp_route_manager_untrack_all(NMPRouteManager *self, if (!user_tag_data) return; - c_list_for_each_entry_safe (rules_data, - rules_data_safe, + c_list_for_each_entry_safe (track_data, + track_data_safe, &user_tag_data->user_tag_lst_head, user_tag_lst) { - if (all || rules_data->dirty) - _rules_data_untrack(self, rules_data, FALSE, FALSE); + if (all || track_data->dirty) + _track_data_untrack(self, track_data, FALSE, FALSE); } if (c_list_is_empty(&user_tag_data->user_tag_lst_head)) g_hash_table_remove(self->by_user_tag, user_tag_data); @@ -531,10 +531,10 @@ nmp_route_manager_sync_rules(NMPRouteManager *self, gboolean keep_deleted_rules) NMDedupMultiIter pl_iter; const NMPObject *plobj; gs_unref_ptrarray GPtrArray *rules_to_delete = NULL; - RulesObjData *obj_data; + TrackObjData *obj_data; GHashTableIter h_iter; guint i; - const RulesData *rd_best; + const TrackData *td_best; g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); @@ -551,14 +551,14 @@ nmp_route_manager_sync_rules(NMPRouteManager *self, gboolean keep_deleted_rules) continue; } - rd_best = _rules_obj_get_best_data(obj_data); - if (rd_best) { - if (rd_best->track_priority_present) { + td_best = _track_obj_data_get_best_data(obj_data); + if (td_best) { + if (td_best->track_priority_present) { if (obj_data->config_state == CONFIG_STATE_OWNED_BY_US) obj_data->config_state = CONFIG_STATE_ADDED_BY_US; continue; } - if (rd_best->track_priority_val == 0) { + if (td_best->track_priority_val == 0) { if (!NM_IN_SET(obj_data->config_state, CONFIG_STATE_ADDED_BY_US, CONFIG_STATE_OWNED_BY_US)) { @@ -591,19 +591,19 @@ nmp_route_manager_sync_rules(NMPRouteManager *self, gboolean keep_deleted_rules) g_hash_table_iter_init(&h_iter, self->by_obj); while (g_hash_table_iter_next(&h_iter, (gpointer *) &obj_data, NULL)) { - rd_best = _rules_obj_get_best_data(obj_data); + td_best = _track_obj_data_get_best_data(obj_data); - if (!rd_best) { + if (!td_best) { g_hash_table_iter_remove(&h_iter); continue; } - if (!rd_best->track_priority_present) { + if (!td_best->track_priority_present) { if (obj_data->config_state == CONFIG_STATE_OWNED_BY_US) obj_data->config_state = CONFIG_STATE_REMOVED_BY_US; continue; } - if (rd_best->track_priority_val == 0) { + if (td_best->track_priority_val == 0) { if (!NM_IN_SET(obj_data->config_state, CONFIG_STATE_REMOVED_BY_US, CONFIG_STATE_OWNED_BY_US)) { @@ -747,13 +747,15 @@ nmp_route_manager_new(NMPlatform *platform) .ref_count = 1, .platform = g_object_ref(platform), .by_data = - g_hash_table_new_full(_rules_data_hash, _rules_data_equal, NULL, _rules_data_destroy), - .by_obj = - g_hash_table_new_full(_rules_obj_hash, _rules_obj_equal, NULL, _rules_obj_destroy), - .by_user_tag = g_hash_table_new_full(_rules_user_tag_hash, - _rules_user_tag_equal, + g_hash_table_new_full(_track_data_hash, _track_data_equal, NULL, _track_data_destroy), + .by_obj = g_hash_table_new_full(_track_obj_data_hash, + _track_obj_data_equal, + NULL, + _track_obj_data_destroy), + .by_user_tag = g_hash_table_new_full(_track_user_tag_data_hash, + _track_user_tag_data_equal, NULL, - _rules_user_tag_destroy), + _track_user_tag_data_destroy), }; return self; } From 1baa301047f55c16a844e5b9c4a1d1cf415e88f2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 17:43:22 +0100 Subject: [PATCH 039/118] platform: use __NMLOG_DEFAULT() in "nmp-route-manager.c" --- src/libnm-platform/nmp-route-manager.c | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c index e7a9c005cd..7d5366878f 100644 --- a/src/libnm-platform/nmp-route-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -26,22 +26,7 @@ struct _NMPRouteManager { #define _NMLOG_DOMAIN LOGD_PLATFORM #define _NMLOG_PREFIX_NAME "route-manager" -#define _NMLOG(level, ...) \ - G_STMT_START \ - { \ - const NMLogLevel __level = (level); \ - \ - if (nm_logging_enabled(__level, _NMLOG_DOMAIN)) { \ - _nm_log(__level, \ - _NMLOG_DOMAIN, \ - 0, \ - NULL, \ - NULL, \ - "%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \ - _NMLOG_PREFIX_NAME _NM_UTILS_MACRO_REST(__VA_ARGS__)); \ - } \ - } \ - G_STMT_END +#define _NMLOG(level, ...) __NMLOG_DEFAULT(level, LOGD_PLATFORM, _NMLOG_PREFIX_NAME, __VA_ARGS__) /*****************************************************************************/ From 3e6c8d220a8dc0e10c427bb22d5aedb779448737 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 17:44:47 +0100 Subject: [PATCH 040/118] platform: use NM_HASH_OBFUSCATE_PTR() in "nmp-route-manager.c" NM_HASH_OBFUSCATE_PTR() is some snake-oil to not log raw pointer values. It obviously makes debugging harder. But we don't need to generate differently obfuscated pointer values. At least, let most users use the same obfuscation, so that the values are comparable. --- src/libnm-platform/nmp-route-manager.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c index 7d5366878f..f13ee59aba 100644 --- a/src/libnm-platform/nmp-route-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -37,8 +37,6 @@ NMP_IS_ROUTE_MANAGER(gpointer self) && NM_IS_PLATFORM(((NMPRouteManager *) self)->platform); } -#define _USER_TAG_LOG(user_tag) nm_hash_obfuscate_ptr(1240261787u, (user_tag)) - /*****************************************************************************/ typedef struct { @@ -383,7 +381,7 @@ nmp_route_manager_track_rule(NMPRouteManager *self, if (changed) { _LOGD("routing-rule: track [" NM_HASH_OBFUSCATE_PTR_FMT ",%s%u] \"%s\")", - _USER_TAG_LOG(track_data->user_tag), + NM_HASH_OBFUSCATE_PTR(track_data->user_tag), (track_data->track_priority_val == 0 ? "" : (track_data->track_priority_present ? "+" : "-")), @@ -406,7 +404,7 @@ _track_data_untrack(NMPRouteManager *self, nm_assert(g_hash_table_lookup(self->by_data, track_data) == track_data); _LOGD("routing-rule: untrack [" NM_HASH_OBFUSCATE_PTR_FMT "] \"%s\"", - _USER_TAG_LOG(track_data->user_tag), + NM_HASH_OBFUSCATE_PTR(track_data->user_tag), nmp_object_to_string(track_data->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0)); #if NM_MORE_ASSERTS From cfdecf5e96215d3a2956ac9169476deb862668ea Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 17:59:20 +0100 Subject: [PATCH 041/118] platform: use nm_g_slice_free() in "nmp-route-manager.c" --- src/libnm-platform/nmp-route-manager.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c index f13ee59aba..b17b47d3ad 100644 --- a/src/libnm-platform/nmp-route-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -165,7 +165,7 @@ _track_data_destroy(gpointer data) c_list_unlink_stale(&track_data->obj_lst); c_list_unlink_stale(&track_data->user_tag_lst); nmp_object_unref(track_data->obj); - g_slice_free(TrackData, track_data); + nm_g_slice_free(track_data); } static const TrackData * @@ -227,7 +227,7 @@ _track_obj_data_destroy(gpointer data) c_list_unlink_stale(&obj_data->obj_lst_head); nmp_object_unref(obj_data->obj); - g_slice_free(TrackObjData, obj_data); + nm_g_slice_free(obj_data); } static guint @@ -253,7 +253,7 @@ _track_user_tag_data_destroy(gpointer data) TrackUserTagData *user_tag_data = data; c_list_unlink_stale(&user_tag_data->user_tag_lst_head); - g_slice_free(TrackUserTagData, user_tag_data); + nm_g_slice_free(user_tag_data); } static TrackData * @@ -763,5 +763,5 @@ nmp_route_manager_unref(NMPRouteManager *self) g_hash_table_destroy(self->by_obj); g_hash_table_destroy(self->by_data); g_object_unref(self->platform); - g_slice_free(NMPRouteManager, self); + nm_g_slice_free(self); } From 2e04d64232a589e0c7934d970dc8e079122b5951 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 18:05:35 +0100 Subject: [PATCH 042/118] platform: use nm_pdirect_{hash,equal}() in "nmp-route-manager.c" No need for a dedicated implementation just to compare two indirect pointers. --- src/libnm-platform/nmp-route-manager.c | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c index b17b47d3ad..583e9bdf9d 100644 --- a/src/libnm-platform/nmp-route-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -230,23 +230,6 @@ _track_obj_data_destroy(gpointer data) nm_g_slice_free(obj_data); } -static guint -_track_user_tag_data_hash(gconstpointer data) -{ - const TrackUserTagData *user_tag_data = data; - - return nm_hash_val(644693447u, user_tag_data->user_tag); -} - -static gboolean -_track_user_tag_data_equal(gconstpointer data_a, gconstpointer data_b) -{ - const TrackUserTagData *user_tag_data_a = data_a; - const TrackUserTagData *user_tag_data_b = data_b; - - return user_tag_data_a->user_tag == user_tag_data_b->user_tag; -} - static void _track_user_tag_data_destroy(gpointer data) { @@ -725,6 +708,8 @@ nmp_route_manager_new(NMPlatform *platform) g_return_val_if_fail(NM_IS_PLATFORM(platform), NULL); + G_STATIC_ASSERT_EXPR(G_STRUCT_OFFSET(TrackUserTagData, user_tag) == 0); + self = g_slice_new(NMPRouteManager); *self = (NMPRouteManager){ .ref_count = 1, @@ -735,8 +720,8 @@ nmp_route_manager_new(NMPlatform *platform) _track_obj_data_equal, NULL, _track_obj_data_destroy), - .by_user_tag = g_hash_table_new_full(_track_user_tag_data_hash, - _track_user_tag_data_equal, + .by_user_tag = g_hash_table_new_full(nm_pdirect_hash, + nm_pdirect_equal, NULL, _track_user_tag_data_destroy), }; From 7c27c63bece5488a71950ce32178432d523c7ac3 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 17:39:14 +0100 Subject: [PATCH 043/118] platform: extend NMPRouteManager to work for routes --- src/core/devices/nm-device.c | 4 +- src/core/platform/tests/test-route.c | 8 +- src/libnm-platform/nmp-route-manager.c | 136 ++++++++++++++++--------- src/libnm-platform/nmp-route-manager.h | 43 ++++++-- 4 files changed, 126 insertions(+), 65 deletions(-) diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index f7836567a0..30e0fe8fef 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -9357,7 +9357,7 @@ _routing_rules_sync(NMDevice *self, NMTernary set_mode) keep_deleted_rules = FALSE; if (set_mode == NM_TERNARY_DEFAULT) { /* when exiting NM, we leave the device up and the rules configured. - * We just all nmp_route_manager_sync_rules() to forget about the synced rules, + * We just call nmp_route_manager_sync() to forget about the synced rules, * but we don't actually delete them. * * FIXME: that is a problem after restart of NetworkManager, because these @@ -9371,7 +9371,7 @@ _routing_rules_sync(NMDevice *self, NMTernary set_mode) * file and track them after restart again. */ keep_deleted_rules = TRUE; } - nmp_route_manager_sync_rules(route_manager, keep_deleted_rules); + nmp_route_manager_sync(route_manager, NMP_OBJECT_TYPE_ROUTING_RULE, keep_deleted_rules); } static gboolean diff --git a/src/core/platform/tests/test-route.c b/src/core/platform/tests/test-route.c index fb6ca72d32..cf0236e0e6 100644 --- a/src/core/platform/tests/test-route.c +++ b/src/core/platform/tests/test-route.c @@ -1675,14 +1675,14 @@ again: NULL); } if (nmtst_get_rand_uint32() % objs_sync->len == 0) { - nmp_route_manager_sync_rules(route_manager, FALSE); + nmp_route_manager_sync(route_manager, NMP_OBJECT_TYPE_ROUTING_RULE, FALSE); g_assert_cmpint(nmtstp_platform_routing_rules_get_count(platform, AF_UNSPEC), ==, i + 1); } } - nmp_route_manager_sync_rules(route_manager, FALSE); + nmp_route_manager_sync(route_manager, NMP_OBJECT_TYPE_ROUTING_RULE, FALSE); g_assert_cmpint(nmtstp_platform_routing_rules_get_count(platform, AF_UNSPEC), ==, objs_sync->len); @@ -1713,14 +1713,14 @@ again: break; } if (nmtst_get_rand_uint32() % objs_sync->len == 0) { - nmp_route_manager_sync_rules(route_manager, FALSE); + nmp_route_manager_sync(route_manager, NMP_OBJECT_TYPE_ROUTING_RULE, FALSE); g_assert_cmpint(nmtstp_platform_routing_rules_get_count(platform, AF_UNSPEC), ==, objs_sync->len - i - 1); } } - nmp_route_manager_sync_rules(route_manager, FALSE); + nmp_route_manager_sync(route_manager, NMP_OBJECT_TYPE_ROUTING_RULE, FALSE); } else { for (i = 0; i < objs->len;) { diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c index 583e9bdf9d..c2a83de70a 100644 --- a/src/libnm-platform/nmp-route-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -116,7 +116,10 @@ static void _track_data_assert(const TrackData *track_data, gboolean linked) { nm_assert(track_data); - nm_assert(NMP_OBJECT_GET_TYPE(track_data->obj) == NMP_OBJECT_TYPE_ROUTING_RULE); + nm_assert(NM_IN_SET(NMP_OBJECT_GET_TYPE(track_data->obj), + NMP_OBJECT_TYPE_IP4_ROUTE, + NMP_OBJECT_TYPE_IP6_ROUTE, + NMP_OBJECT_TYPE_ROUTING_RULE)); nm_assert(nmp_object_is_visible(track_data->obj)); nm_assert(track_data->user_tag); nm_assert(!linked || !c_list_is_empty(&track_data->obj_lst)); @@ -132,9 +135,7 @@ _track_data_hash(gconstpointer data) _track_data_assert(track_data, FALSE); nm_hash_init(&h, 269297543u); - nm_platform_routing_rule_hash_update(NMP_OBJECT_CAST_ROUTING_RULE(track_data->obj), - NM_PLATFORM_ROUTING_RULE_CMP_TYPE_ID, - &h); + nmp_object_id_hash_update(track_data->obj, &h); nm_hash_update_val(&h, track_data->user_tag); return nm_hash_complete(&h); } @@ -149,10 +150,7 @@ _track_data_equal(gconstpointer data_a, gconstpointer data_b) _track_data_assert(track_data_b, FALSE); return track_data_a->user_tag == track_data_b->user_tag - && (nm_platform_routing_rule_cmp(NMP_OBJECT_CAST_ROUTING_RULE(track_data_a->obj), - NMP_OBJECT_CAST_ROUTING_RULE(track_data_b->obj), - NM_PLATFORM_ROUTING_RULE_CMP_TYPE_ID) - == 0); + && nmp_object_id_equal(track_data_a->obj, track_data_b->obj); } static void @@ -199,13 +197,8 @@ static guint _track_obj_data_hash(gconstpointer data) { const TrackObjData *obj_data = data; - NMHashState h; - nm_hash_init(&h, 432817559u); - nm_platform_routing_rule_hash_update(NMP_OBJECT_CAST_ROUTING_RULE(obj_data->obj), - NM_PLATFORM_ROUTING_RULE_CMP_TYPE_ID, - &h); - return nm_hash_complete(&h); + return nmp_object_id_hash(obj_data->obj); } static gboolean @@ -214,10 +207,7 @@ _track_obj_data_equal(gconstpointer data_a, gconstpointer data_b) const TrackObjData *obj_data_a = data_a; const TrackObjData *obj_data_b = data_b; - return (nm_platform_routing_rule_cmp(NMP_OBJECT_CAST_ROUTING_RULE(obj_data_a->obj), - NMP_OBJECT_CAST_ROUTING_RULE(obj_data_b->obj), - NM_PLATFORM_ROUTING_RULE_CMP_TYPE_ID) - == 0); + return nmp_object_id_equal(obj_data_a->obj, obj_data_b->obj); } static void @@ -250,10 +240,15 @@ _track_data_lookup(GHashTable *by_data, const NMPObject *obj, gconstpointer user return g_hash_table_lookup(by_data, &track_data_needle); } +/*****************************************************************************/ + /** - * nmp_route_manager_track_rule: + * nmp_route_manager_track: * @self: the #NMPRouteManager instance - * @routing_rule: the #NMPlatformRoutingRule to track or untrack + * @obj_type: the NMPObjectType of @obj that we are tracking. + * @obj: the NMPlatformObject (of type NMPObjectType) to track. Usually + * a #NMPlatformRoutingRule, #NMPlatformIP4Route or #NMPlatformIP6Route + * pointer. * @track_priority: the priority for tracking the rule. Note that * negative values indicate a forced absence of the rule. Priorities * are compared with their absolute values (with higher absolute @@ -270,11 +265,12 @@ _track_data_lookup(GHashTable *by_data, const NMPObject *obj, gconstpointer user * The purpose here is to set this to %NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG. */ void -nmp_route_manager_track_rule(NMPRouteManager *self, - const NMPlatformRoutingRule *routing_rule, - gint32 track_priority, - gconstpointer user_tag, - gconstpointer user_tag_untrack) +nmp_route_manager_track(NMPRouteManager *self, + NMPObjectType obj_type, + gconstpointer obj, + gint32 track_priority, + gconstpointer user_tag, + gconstpointer user_tag_untrack) { NMPObject obj_stack; const NMPObject *p_obj_stack; @@ -286,11 +282,18 @@ nmp_route_manager_track_rule(NMPRouteManager *self, gboolean track_priority_present; g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); - g_return_if_fail(routing_rule); + g_return_if_fail(obj); g_return_if_fail(user_tag); + + /* The route must not be tied to an interface. We can only handle here + * blackhole/unreachable/prohibit route types. */ + g_return_if_fail(obj_type == NMP_OBJECT_TYPE_ROUTING_RULE + || (NM_IN_SET(obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE) + && ((const NMPlatformIPRoute *) obj)->ifindex == 0)); + nm_assert(track_priority != G_MININT32); - p_obj_stack = nmp_object_stackinit(&obj_stack, NMP_OBJECT_TYPE_ROUTING_RULE, routing_rule); + p_obj_stack = nmp_object_stackinit(&obj_stack, obj_type, obj); nm_assert(nmp_object_is_visible(p_obj_stack)); @@ -363,12 +366,13 @@ nmp_route_manager_track_rule(NMPRouteManager *self, _track_data_assert(track_data, TRUE); if (changed) { - _LOGD("routing-rule: track [" NM_HASH_OBFUSCATE_PTR_FMT ",%s%u] \"%s\")", + _LOGD("track [" NM_HASH_OBFUSCATE_PTR_FMT ",%s%u] %s \"%s\"", NM_HASH_OBFUSCATE_PTR(track_data->user_tag), (track_data->track_priority_val == 0 ? "" : (track_data->track_priority_present ? "+" : "-")), (guint) track_data->track_priority_val, + NMP_OBJECT_GET_CLASS(track_data->obj)->obj_type_name, nmp_object_to_string(track_data->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0)); } } @@ -386,8 +390,9 @@ _track_data_untrack(NMPRouteManager *self, nm_assert(self->by_data); nm_assert(g_hash_table_lookup(self->by_data, track_data) == track_data); - _LOGD("routing-rule: untrack [" NM_HASH_OBFUSCATE_PTR_FMT "] \"%s\"", + _LOGD("untrack [" NM_HASH_OBFUSCATE_PTR_FMT "] %s \"%s\"", NM_HASH_OBFUSCATE_PTR(track_data->user_tag), + NMP_OBJECT_GET_CLASS(track_data->obj)->obj_type_name, nmp_object_to_string(track_data->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0)); #if NM_MORE_ASSERTS @@ -425,19 +430,24 @@ _track_data_untrack(NMPRouteManager *self, } void -nmp_route_manager_untrack_rule(NMPRouteManager *self, - const NMPlatformRoutingRule *routing_rule, - gconstpointer user_tag) +nmp_route_manager_untrack(NMPRouteManager *self, + NMPObjectType obj_type, + gconstpointer obj, + gconstpointer user_tag) { NMPObject obj_stack; const NMPObject *p_obj_stack; TrackData *track_data; g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); - g_return_if_fail(routing_rule); + nm_assert(NM_IN_SET(obj_type, + NMP_OBJECT_TYPE_IP4_ROUTE, + NMP_OBJECT_TYPE_IP6_ROUTE, + NMP_OBJECT_TYPE_ROUTING_RULE)); + g_return_if_fail(obj); g_return_if_fail(user_tag); - p_obj_stack = nmp_object_stackinit(&obj_stack, NMP_OBJECT_TYPE_ROUTING_RULE, routing_rule); + p_obj_stack = nmp_object_stackinit(&obj_stack, obj_type, obj); nm_assert(nmp_object_is_visible(p_obj_stack)); @@ -490,29 +500,41 @@ nmp_route_manager_untrack_all(NMPRouteManager *self, g_hash_table_remove(self->by_user_tag, user_tag_data); } +/*****************************************************************************/ + void -nmp_route_manager_sync_rules(NMPRouteManager *self, gboolean keep_deleted_rules) +nmp_route_manager_sync(NMPRouteManager *self, NMPObjectType obj_type, gboolean keep_deleted) { const NMDedupMultiHeadEntry *pl_head_entry; NMDedupMultiIter pl_iter; const NMPObject *plobj; - gs_unref_ptrarray GPtrArray *rules_to_delete = NULL; + gs_unref_ptrarray GPtrArray *objs_to_delete = NULL; TrackObjData *obj_data; GHashTableIter h_iter; guint i; const TrackData *td_best; g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); + g_return_if_fail(NM_IN_SET(obj_type, + NMP_OBJECT_TYPE_IP4_ROUTE, + NMP_OBJECT_TYPE_IP6_ROUTE, + NMP_OBJECT_TYPE_ROUTING_RULE)); - _LOGD("sync%s", keep_deleted_rules ? " (don't remove any rules)" : ""); + _LOGD("sync %s%s", + nmp_class_from_type(obj_type)->obj_type_name, + keep_deleted ? " (don't remove any)" : ""); + + if (obj_type == NMP_OBJECT_TYPE_ROUTING_RULE) + pl_head_entry = nm_platform_lookup_obj_type(self->platform, obj_type); + else + pl_head_entry = nm_platform_lookup_object(self->platform, obj_type, 0); - pl_head_entry = nm_platform_lookup_obj_type(self->platform, NMP_OBJECT_TYPE_ROUTING_RULE); if (pl_head_entry) { nmp_cache_iter_for_each (&pl_iter, pl_head_entry, &plobj) { obj_data = g_hash_table_lookup(self->by_obj, &plobj); if (!obj_data) { - /* this rule is not tracked. It was externally added, hence we + /* this obj is not tracked. It was externally added, hence we * ignore it. */ continue; } @@ -535,28 +557,36 @@ nmp_route_manager_sync_rules(NMPRouteManager *self, gboolean keep_deleted_rules) } } - if (keep_deleted_rules) { - _LOGD("forget/leak rule added by us: %s", + if (keep_deleted) { + _LOGD("forget/leak object added by us: %s \"%s\"", + NMP_OBJECT_GET_CLASS(plobj)->obj_type_name, nmp_object_to_string(plobj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0)); continue; } - if (!rules_to_delete) - rules_to_delete = g_ptr_array_new_with_free_func((GDestroyNotify) nmp_object_unref); + if (!objs_to_delete) + objs_to_delete = g_ptr_array_new_with_free_func((GDestroyNotify) nmp_object_unref); - g_ptr_array_add(rules_to_delete, (gpointer) nmp_object_ref(plobj)); + g_ptr_array_add(objs_to_delete, (gpointer) nmp_object_ref(plobj)); obj_data->config_state = CONFIG_STATE_REMOVED_BY_US; } } - if (rules_to_delete) { - for (i = 0; i < rules_to_delete->len; i++) - nm_platform_object_delete(self->platform, rules_to_delete->pdata[i]); + if (objs_to_delete) { + for (i = 0; i < objs_to_delete->len; i++) + nm_platform_object_delete(self->platform, objs_to_delete->pdata[i]); } g_hash_table_iter_init(&h_iter, self->by_obj); while (g_hash_table_iter_next(&h_iter, (gpointer *) &obj_data, NULL)) { + if (NMP_OBJECT_GET_TYPE(obj_data->obj) != obj_type) { + /* Here we need to iterate over all objects (rules and ip4/ip6 routes) + * and skip over the non-interesting ones. It might be better to + * track 3 separate CList by object type. */ + continue; + } + td_best = _track_obj_data_get_best_data(obj_data); if (!td_best) { @@ -585,12 +615,18 @@ nmp_route_manager_sync_rules(NMPRouteManager *self, gboolean keep_deleted_rules) continue; obj_data->config_state = CONFIG_STATE_ADDED_BY_US; - nm_platform_routing_rule_add(self->platform, - NMP_NLM_FLAG_ADD, - NMP_OBJECT_CAST_ROUTING_RULE(obj_data->obj)); + + if (obj_type == NMP_OBJECT_TYPE_ROUTING_RULE) { + nm_platform_routing_rule_add(self->platform, + NMP_NLM_FLAG_ADD, + NMP_OBJECT_CAST_ROUTING_RULE(obj_data->obj)); + } else + nm_platform_ip_route_add(self->platform, NMP_NLM_FLAG_APPEND, obj_data->obj); } } +/*****************************************************************************/ + void nmp_route_manager_track_rule_from_platform(NMPRouteManager *self, NMPlatform *platform, diff --git a/src/libnm-platform/nmp-route-manager.h b/src/libnm-platform/nmp-route-manager.h index 3bc4a49301..17af8ee0c5 100644 --- a/src/libnm-platform/nmp-route-manager.h +++ b/src/libnm-platform/nmp-route-manager.h @@ -19,11 +19,27 @@ void nmp_route_manager_unref(NMPRouteManager *self); #define nm_auto_unref_route_manager nm_auto(_nmp_route_manager_unref) NM_AUTO_DEFINE_FCN0(NMPRouteManager *, _nmp_route_manager_unref, nmp_route_manager_unref); -void nmp_route_manager_track_rule(NMPRouteManager *self, - const NMPlatformRoutingRule *routing_rule, - gint32 track_priority, - gconstpointer user_tag, - gconstpointer user_tag_untrack); +void nmp_route_manager_track(NMPRouteManager *self, + NMPObjectType obj_type, + gconstpointer obj, + gint32 track_priority, + gconstpointer user_tag, + gconstpointer user_tag_untrack); + +static inline void +nmp_route_manager_track_rule(NMPRouteManager *self, + const NMPlatformRoutingRule *routing_rule, + gint32 track_priority, + gconstpointer user_tag, + gconstpointer user_tag_untrack) +{ + nmp_route_manager_track(self, + NMP_OBJECT_TYPE_ROUTING_RULE, + routing_rule, + track_priority, + user_tag, + user_tag_untrack); +} void nmp_route_manager_track_rule_default(NMPRouteManager *self, int addr_family, @@ -36,9 +52,18 @@ void nmp_route_manager_track_rule_from_platform(NMPRouteManager *self, gint32 tracking_priority, gconstpointer user_tag); -void nmp_route_manager_untrack_rule(NMPRouteManager *self, - const NMPlatformRoutingRule *routing_rule, - gconstpointer user_tag); +void nmp_route_manager_untrack(NMPRouteManager *self, + NMPObjectType obj_type, + gconstpointer obj, + gconstpointer user_tag); + +static inline void +nmp_route_manager_untrack_rule(NMPRouteManager *self, + const NMPlatformRoutingRule *routing_rule, + gconstpointer user_tag) +{ + nmp_route_manager_untrack(self, NMP_OBJECT_TYPE_ROUTING_RULE, routing_rule, user_tag); +} void nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag); @@ -46,7 +71,7 @@ void nmp_route_manager_untrack_all(NMPRouteManager *self, gconstpointer user_tag, gboolean all /* or only dirty */); -void nmp_route_manager_sync_rules(NMPRouteManager *self, gboolean keep_deleted_rules); +void nmp_route_manager_sync(NMPRouteManager *self, NMPObjectType obj_type, gboolean keep_deleted); /*****************************************************************************/ From f315ca9e8436c9a16cfaa31d041a762ef506c96a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 2 Feb 2022 18:55:34 +0100 Subject: [PATCH 044/118] platform: track linked list of objects in NMPRouteManager by type We now track up to three kinds of object types in NMPRouteManager. There is only one place, where we need to iterate over all objects of the same type (e.g. all ipv4-routes), and that is nmp_route_manager_sync(). Previously, we only had one GHashTable with all the object, and when iterating we had to skip over them after checking the type. That has some overhead, but OK. The ugliness with iterating over a GHashTable is that the order is non deterministic. We should have a defined order in which things happen. To achieve that, track three different CList, one for each object type. Also, I expect that to be slightly faster, as you only have to iterate over the list you care about. --- src/libnm-platform/nmp-route-manager.c | 51 ++++++++++++++++++++------ 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c index c2a83de70a..a4cbf2e8bb 100644 --- a/src/libnm-platform/nmp-route-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -18,6 +18,7 @@ struct _NMPRouteManager { GHashTable *by_obj; GHashTable *by_user_tag; GHashTable *by_data; + CList by_obj_lst_heads[3]; guint ref_count; }; @@ -85,6 +86,8 @@ typedef struct { const NMPObject *obj; CList obj_lst_head; + CList by_obj_lst; + /* indicates whether we configured/removed the rule (during sync()). We need that, so * if the rule gets untracked, that we know to remove/restore it. * @@ -112,6 +115,25 @@ static void _track_data_untrack(NMPRouteManager *self, /*****************************************************************************/ +static CList * +_by_obj_lst_head(NMPRouteManager *self, NMPObjectType obj_type) +{ + G_STATIC_ASSERT(G_N_ELEMENTS(self->by_obj_lst_heads) == 3); + + switch (obj_type) { + case NMP_OBJECT_TYPE_IP4_ROUTE: + return &self->by_obj_lst_heads[0]; + case NMP_OBJECT_TYPE_IP6_ROUTE: + return &self->by_obj_lst_heads[1]; + case NMP_OBJECT_TYPE_ROUTING_RULE: + return &self->by_obj_lst_heads[2]; + default: + return nm_assert_unreachable_val(NULL); + } +} + +/*****************************************************************************/ + static void _track_data_assert(const TrackData *track_data, gboolean linked) { @@ -216,6 +238,7 @@ _track_obj_data_destroy(gpointer data) TrackObjData *obj_data = data; c_list_unlink_stale(&obj_data->obj_lst_head); + c_list_unlink_stale(&obj_data->by_obj_lst); nmp_object_unref(obj_data->obj); nm_g_slice_free(obj_data); } @@ -328,6 +351,7 @@ nmp_route_manager_track(NMPRouteManager *self, .config_state = CONFIG_STATE_NONE, }; g_hash_table_add(self->by_obj, obj_data); + c_list_link_tail(_by_obj_lst_head(self, obj_type), &obj_data->by_obj_lst); } c_list_link_tail(&obj_data->obj_lst_head, &track_data->obj_lst); @@ -510,7 +534,8 @@ nmp_route_manager_sync(NMPRouteManager *self, NMPObjectType obj_type, gboolean k const NMPObject *plobj; gs_unref_ptrarray GPtrArray *objs_to_delete = NULL; TrackObjData *obj_data; - GHashTableIter h_iter; + TrackObjData *obj_data_safe; + CList *by_obj_lst_head; guint i; const TrackData *td_best; @@ -578,19 +603,15 @@ nmp_route_manager_sync(NMPRouteManager *self, NMPObjectType obj_type, gboolean k nm_platform_object_delete(self->platform, objs_to_delete->pdata[i]); } - g_hash_table_iter_init(&h_iter, self->by_obj); - while (g_hash_table_iter_next(&h_iter, (gpointer *) &obj_data, NULL)) { - if (NMP_OBJECT_GET_TYPE(obj_data->obj) != obj_type) { - /* Here we need to iterate over all objects (rules and ip4/ip6 routes) - * and skip over the non-interesting ones. It might be better to - * track 3 separate CList by object type. */ - continue; - } + by_obj_lst_head = _by_obj_lst_head(self, obj_type); + + c_list_for_each_entry_safe (obj_data, obj_data_safe, by_obj_lst_head, by_obj_lst) { + nm_assert(NMP_OBJECT_GET_TYPE(obj_data->obj) == obj_type); td_best = _track_obj_data_get_best_data(obj_data); if (!td_best) { - g_hash_table_iter_remove(&h_iter); + g_hash_table_remove(self->by_obj, obj_data); continue; } @@ -752,14 +773,17 @@ nmp_route_manager_new(NMPlatform *platform) .platform = g_object_ref(platform), .by_data = g_hash_table_new_full(_track_data_hash, _track_data_equal, NULL, _track_data_destroy), - .by_obj = g_hash_table_new_full(_track_obj_data_hash, + .by_obj = g_hash_table_new_full(_track_obj_data_hash, _track_obj_data_equal, NULL, _track_obj_data_destroy), - .by_user_tag = g_hash_table_new_full(nm_pdirect_hash, + .by_user_tag = g_hash_table_new_full(nm_pdirect_hash, nm_pdirect_equal, NULL, _track_user_tag_data_destroy), + .by_obj_lst_heads[0] = C_LIST_INIT(self->by_obj_lst_heads[0]), + .by_obj_lst_heads[1] = C_LIST_INIT(self->by_obj_lst_heads[1]), + .by_obj_lst_heads[2] = C_LIST_INIT(self->by_obj_lst_heads[2]), }; return self; } @@ -783,6 +807,9 @@ nmp_route_manager_unref(NMPRouteManager *self) g_hash_table_destroy(self->by_user_tag); g_hash_table_destroy(self->by_obj); g_hash_table_destroy(self->by_data); + nm_assert(c_list_is_empty(&self->by_obj_lst_heads[0])); + nm_assert(c_list_is_empty(&self->by_obj_lst_heads[1])); + nm_assert(c_list_is_empty(&self->by_obj_lst_heads[2])); g_object_unref(self->platform); nm_g_slice_free(self); } From 81f6ba83776a89036983ec226932f5730fa52032 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 7 Feb 2022 19:16:31 +0100 Subject: [PATCH 045/118] platform: return self from nmp_route_manager_ref() It's just more convenient. --- src/libnm-platform/nmp-route-manager.c | 5 +++-- src/libnm-platform/nmp-route-manager.h | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c index a4cbf2e8bb..6828bb57f9 100644 --- a/src/libnm-platform/nmp-route-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -788,12 +788,13 @@ nmp_route_manager_new(NMPlatform *platform) return self; } -void +NMPRouteManager * nmp_route_manager_ref(NMPRouteManager *self) { - g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); + g_return_val_if_fail(NMP_IS_ROUTE_MANAGER(self), NULL); self->ref_count++; + return self; } void diff --git a/src/libnm-platform/nmp-route-manager.h b/src/libnm-platform/nmp-route-manager.h index 17af8ee0c5..23e4c2d341 100644 --- a/src/libnm-platform/nmp-route-manager.h +++ b/src/libnm-platform/nmp-route-manager.h @@ -13,8 +13,8 @@ typedef struct _NMPRouteManager NMPRouteManager; NMPRouteManager *nmp_route_manager_new(NMPlatform *platform); -void nmp_route_manager_ref(NMPRouteManager *self); -void nmp_route_manager_unref(NMPRouteManager *self); +NMPRouteManager *nmp_route_manager_ref(NMPRouteManager *self); +void nmp_route_manager_unref(NMPRouteManager *self); #define nm_auto_unref_route_manager nm_auto(_nmp_route_manager_unref) NM_AUTO_DEFINE_FCN0(NMPRouteManager *, _nmp_route_manager_unref, nmp_route_manager_unref); From 5489aa596b23890480bc64657c96e2997a762f06 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 7 Feb 2022 19:23:27 +0100 Subject: [PATCH 046/118] platform: return boolean changed value from nmp_route_manager_track() --- src/libnm-platform/nmp-route-manager.c | 57 +++++++++++++++++--------- src/libnm-platform/nmp-route-manager.h | 44 ++++++++++---------- 2 files changed, 60 insertions(+), 41 deletions(-) diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c index 6828bb57f9..c5ca02600c 100644 --- a/src/libnm-platform/nmp-route-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -286,8 +286,10 @@ _track_data_lookup(GHashTable *by_data, const NMPObject *obj, gconstpointer user * because it enforces ownership of the now tracked rule. On the other hand, * a plain nmp_route_manager_untrack_rule() merely forgets about the tracking. * The purpose here is to set this to %NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG. + * + * Returns: %TRUE, if something changed. */ -void +gboolean nmp_route_manager_track(NMPRouteManager *self, NMPObjectType obj_type, gconstpointer obj, @@ -300,19 +302,22 @@ nmp_route_manager_track(NMPRouteManager *self, TrackData *track_data; TrackObjData *obj_data; TrackUserTagData *user_tag_data; - gboolean changed = FALSE; + gboolean changed = FALSE; + gboolean changed_untrack = FALSE; guint32 track_priority_val; gboolean track_priority_present; - g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); - g_return_if_fail(obj); - g_return_if_fail(user_tag); + g_return_val_if_fail(NMP_IS_ROUTE_MANAGER(self), FALSE); + g_return_val_if_fail(obj, FALSE); + g_return_val_if_fail(user_tag, FALSE); /* The route must not be tied to an interface. We can only handle here * blackhole/unreachable/prohibit route types. */ - g_return_if_fail(obj_type == NMP_OBJECT_TYPE_ROUTING_RULE - || (NM_IN_SET(obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE) - && ((const NMPlatformIPRoute *) obj)->ifindex == 0)); + g_return_val_if_fail( + obj_type == NMP_OBJECT_TYPE_ROUTING_RULE + || (NM_IN_SET(obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE) + && ((const NMPlatformIPRoute *) obj)->ifindex == 0), + FALSE); nm_assert(track_priority != G_MININT32); @@ -381,8 +386,10 @@ nmp_route_manager_track(NMPRouteManager *self, TrackData *track_data_untrack; track_data_untrack = _track_data_lookup(self->by_data, p_obj_stack, user_tag_untrack); - if (track_data_untrack) + if (track_data_untrack) { _track_data_untrack(self, track_data_untrack, FALSE, TRUE); + changed_untrack = TRUE; + } } else nm_assert_not_reached(); } @@ -399,6 +406,8 @@ nmp_route_manager_track(NMPRouteManager *self, NMP_OBJECT_GET_CLASS(track_data->obj)->obj_type_name, nmp_object_to_string(track_data->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0)); } + + return changed || changed_untrack; } static void @@ -453,7 +462,7 @@ _track_data_untrack(NMPRouteManager *self, g_hash_table_remove(self->by_data, track_data); } -void +gboolean nmp_route_manager_untrack(NMPRouteManager *self, NMPObjectType obj_type, gconstpointer obj, @@ -462,22 +471,27 @@ nmp_route_manager_untrack(NMPRouteManager *self, NMPObject obj_stack; const NMPObject *p_obj_stack; TrackData *track_data; + gboolean changed = FALSE; - g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); + g_return_val_if_fail(NMP_IS_ROUTE_MANAGER(self), FALSE); nm_assert(NM_IN_SET(obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE, NMP_OBJECT_TYPE_ROUTING_RULE)); - g_return_if_fail(obj); - g_return_if_fail(user_tag); + g_return_val_if_fail(obj, FALSE); + g_return_val_if_fail(user_tag, FALSE); p_obj_stack = nmp_object_stackinit(&obj_stack, obj_type, obj); nm_assert(nmp_object_is_visible(p_obj_stack)); track_data = _track_data_lookup(self->by_data, p_obj_stack, user_tag); - if (track_data) + if (track_data) { _track_data_untrack(self, track_data, TRUE, FALSE); + changed = TRUE; + } + + return changed; } void @@ -497,7 +511,7 @@ nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag) track_data->dirty = TRUE; } -void +gboolean nmp_route_manager_untrack_all(NMPRouteManager *self, gconstpointer user_tag, gboolean all /* or only dirty */) @@ -505,23 +519,28 @@ nmp_route_manager_untrack_all(NMPRouteManager *self, TrackData *track_data; TrackData *track_data_safe; TrackUserTagData *user_tag_data; + gboolean changed = FALSE; - g_return_if_fail(NMP_IS_ROUTE_MANAGER(self)); - g_return_if_fail(user_tag); + g_return_val_if_fail(NMP_IS_ROUTE_MANAGER(self), FALSE); + g_return_val_if_fail(user_tag, FALSE); user_tag_data = g_hash_table_lookup(self->by_user_tag, &user_tag); if (!user_tag_data) - return; + return FALSE; c_list_for_each_entry_safe (track_data, track_data_safe, &user_tag_data->user_tag_lst_head, user_tag_lst) { - if (all || track_data->dirty) + if (all || track_data->dirty) { _track_data_untrack(self, track_data, FALSE, FALSE); + changed = TRUE; + } } if (c_list_is_empty(&user_tag_data->user_tag_lst_head)) g_hash_table_remove(self->by_user_tag, user_tag_data); + + return changed; } /*****************************************************************************/ diff --git a/src/libnm-platform/nmp-route-manager.h b/src/libnm-platform/nmp-route-manager.h index 23e4c2d341..a61a68ca98 100644 --- a/src/libnm-platform/nmp-route-manager.h +++ b/src/libnm-platform/nmp-route-manager.h @@ -19,26 +19,26 @@ void nmp_route_manager_unref(NMPRouteManager *self); #define nm_auto_unref_route_manager nm_auto(_nmp_route_manager_unref) NM_AUTO_DEFINE_FCN0(NMPRouteManager *, _nmp_route_manager_unref, nmp_route_manager_unref); -void nmp_route_manager_track(NMPRouteManager *self, - NMPObjectType obj_type, - gconstpointer obj, - gint32 track_priority, - gconstpointer user_tag, - gconstpointer user_tag_untrack); +gboolean nmp_route_manager_track(NMPRouteManager *self, + NMPObjectType obj_type, + gconstpointer obj, + gint32 track_priority, + gconstpointer user_tag, + gconstpointer user_tag_untrack); -static inline void +static inline gboolean nmp_route_manager_track_rule(NMPRouteManager *self, const NMPlatformRoutingRule *routing_rule, gint32 track_priority, gconstpointer user_tag, gconstpointer user_tag_untrack) { - nmp_route_manager_track(self, - NMP_OBJECT_TYPE_ROUTING_RULE, - routing_rule, - track_priority, - user_tag, - user_tag_untrack); + return nmp_route_manager_track(self, + NMP_OBJECT_TYPE_ROUTING_RULE, + routing_rule, + track_priority, + user_tag, + user_tag_untrack); } void nmp_route_manager_track_rule_default(NMPRouteManager *self, @@ -52,24 +52,24 @@ void nmp_route_manager_track_rule_from_platform(NMPRouteManager *self, gint32 tracking_priority, gconstpointer user_tag); -void nmp_route_manager_untrack(NMPRouteManager *self, - NMPObjectType obj_type, - gconstpointer obj, - gconstpointer user_tag); +gboolean nmp_route_manager_untrack(NMPRouteManager *self, + NMPObjectType obj_type, + gconstpointer obj, + gconstpointer user_tag); -static inline void +static inline gboolean nmp_route_manager_untrack_rule(NMPRouteManager *self, const NMPlatformRoutingRule *routing_rule, gconstpointer user_tag) { - nmp_route_manager_untrack(self, NMP_OBJECT_TYPE_ROUTING_RULE, routing_rule, user_tag); + return nmp_route_manager_untrack(self, NMP_OBJECT_TYPE_ROUTING_RULE, routing_rule, user_tag); } void nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag); -void nmp_route_manager_untrack_all(NMPRouteManager *self, - gconstpointer user_tag, - gboolean all /* or only dirty */); +gboolean nmp_route_manager_untrack_all(NMPRouteManager *self, + gconstpointer user_tag, + gboolean all /* or only dirty */); void nmp_route_manager_sync(NMPRouteManager *self, NMPObjectType obj_type, gboolean keep_deleted); From 9e90bb081786c4e525b2cc25bdef63f634778b31 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 8 Feb 2022 11:56:17 +0100 Subject: [PATCH 047/118] platform: improve way to prune dirty route-manager entries The general idea is that when we have entries tracked by the route-manager, that we can mark them all as dirty. Then, calling the "track" function will reset the dirty flag. Finally, there is a method to delete all dirty entries. As we can lookup an entry with O(1) (using dictionaries), we can sync the list of tracked objects with O(n). We just need to track all the ones we care about, and then delete those that were not touched (that is, are still dirty). Previously, we had to explicitly mark all entries as dirty. We can do better. Just let nmp_route_manager_untrack_all() mark the survivors as dirty right away. This way, we can save iterating the list once. It also makes sense because the only purpose of the dirty flag is to aid this prune mechanism with track/untrack-all. So, untrack-all can just help out, and leave the remaining entries dirty, so that the next track does the right thing. --- src/core/devices/nm-device.c | 7 ++----- src/libnm-platform/nmp-route-manager.c | 6 +++++- src/libnm-platform/nmp-route-manager.h | 3 ++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index 30e0fe8fef..5cb3d27065 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -9301,9 +9301,6 @@ _routing_rules_sync(NMDevice *self, NMTernary set_mode) int is_ipv4; untrack_only_dirty = TRUE; - nmp_route_manager_set_dirty(route_manager, user_tag_1); - if (klass->get_extra_rules) - nmp_route_manager_set_dirty(route_manager, user_tag_2); applied_connection = nm_device_get_applied_connection(self); @@ -9350,9 +9347,9 @@ _routing_rules_sync(NMDevice *self, NMTernary set_mode) } } - nmp_route_manager_untrack_all(route_manager, user_tag_1, !untrack_only_dirty); + nmp_route_manager_untrack_all(route_manager, user_tag_1, !untrack_only_dirty, TRUE); if (klass->get_extra_rules) - nmp_route_manager_untrack_all(route_manager, user_tag_2, !untrack_only_dirty); + nmp_route_manager_untrack_all(route_manager, user_tag_2, !untrack_only_dirty, TRUE); keep_deleted_rules = FALSE; if (set_mode == NM_TERNARY_DEFAULT) { diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c index c5ca02600c..c31c9806a5 100644 --- a/src/libnm-platform/nmp-route-manager.c +++ b/src/libnm-platform/nmp-route-manager.c @@ -514,7 +514,8 @@ nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag) gboolean nmp_route_manager_untrack_all(NMPRouteManager *self, gconstpointer user_tag, - gboolean all /* or only dirty */) + gboolean all /* or only dirty */, + gboolean make_survivors_dirty) { TrackData *track_data; TrackData *track_data_safe; @@ -535,7 +536,10 @@ nmp_route_manager_untrack_all(NMPRouteManager *self, if (all || track_data->dirty) { _track_data_untrack(self, track_data, FALSE, FALSE); changed = TRUE; + continue; } + if (make_survivors_dirty) + track_data->dirty = TRUE; } if (c_list_is_empty(&user_tag_data->user_tag_lst_head)) g_hash_table_remove(self->by_user_tag, user_tag_data); diff --git a/src/libnm-platform/nmp-route-manager.h b/src/libnm-platform/nmp-route-manager.h index a61a68ca98..97ec3840df 100644 --- a/src/libnm-platform/nmp-route-manager.h +++ b/src/libnm-platform/nmp-route-manager.h @@ -69,7 +69,8 @@ void nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag); gboolean nmp_route_manager_untrack_all(NMPRouteManager *self, gconstpointer user_tag, - gboolean all /* or only dirty */); + gboolean all /* or only dirty */, + gboolean make_survivors_dirty); void nmp_route_manager_sync(NMPRouteManager *self, NMPObjectType obj_type, gboolean keep_deleted); From e32bc6d248fa09d1652465577af4fd03eb39e0f1 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 7 Feb 2022 19:33:06 +0100 Subject: [PATCH 048/118] core/l3cfg: rework generating list of routes in _l3_commit_one() This will be required next, when we will have also routes without a device. Split the generation of the route list out. --- src/core/nm-l3cfg.c | 101 ++++++++++++++++++++++++++++++-------------- 1 file changed, 70 insertions(+), 31 deletions(-) diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index aed4cf05c9..dfb80c7cb9 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -1008,18 +1008,11 @@ typedef struct { } ObjStatesSyncFilterData; static gboolean -_obj_states_sync_filter(/* const NMDedupMultiObj * */ gconstpointer o, gpointer user_data) +_obj_states_sync_filter(NML3Cfg *self, const NMPObject *obj, NML3CfgCommitType commit_type) { - char sbuf[sizeof(_nm_utils_to_string_buffer)]; - const NMPObject *obj = o; - const ObjStatesSyncFilterData *sync_filter_data = user_data; - NMPObjectType obj_type; - ObjStateData *obj_state; - NML3Cfg *self; - - nm_assert(sync_filter_data); - nm_assert(NM_IS_L3CFG(sync_filter_data->self)); - self = sync_filter_data->self; + char sbuf[sizeof(_nm_utils_to_string_buffer)]; + NMPObjectType obj_type; + ObjStateData *obj_state; obj_type = NMP_OBJECT_GET_TYPE(obj); @@ -1027,14 +1020,14 @@ _obj_states_sync_filter(/* const NMDedupMultiObj * */ gconstpointer o, gpointer && NMP_OBJECT_CAST_IP4_ADDRESS(obj)->a_acd_not_ready) return FALSE; - obj_state = g_hash_table_lookup(sync_filter_data->self->priv.p->obj_state_hash, &obj); + obj_state = g_hash_table_lookup(self->priv.p->obj_state_hash, &obj); - nm_assert_obj_state(sync_filter_data->self, obj_state); + nm_assert_obj_state(self, obj_state); nm_assert(obj_state->obj == obj); nm_assert(c_list_is_empty(&obj_state->os_zombie_lst)); if (!obj_state->os_nm_configured) { - if (sync_filter_data->commit_type == NM_L3_CFG_COMMIT_TYPE_ASSUME + if (commit_type == NM_L3_CFG_COMMIT_TYPE_ASSUME && !_obj_state_data_get_assume_config_once(obj_state)) return FALSE; @@ -1051,13 +1044,72 @@ _obj_states_sync_filter(/* const NMDedupMultiObj * */ gconstpointer o, gpointer return TRUE; } - if (!obj_state->os_plobj && sync_filter_data->commit_type != NM_L3_CFG_COMMIT_TYPE_REAPPLY + if (!obj_state->os_plobj && commit_type != NM_L3_CFG_COMMIT_TYPE_REAPPLY && !nmp_object_get_force_commit(obj)) return FALSE; return TRUE; } +static gboolean +_obj_states_sync_filter_predicate(gconstpointer o, gpointer user_data) +{ + const NMPObject *obj = o; + const ObjStatesSyncFilterData *sync_filter_data = user_data; + + return _obj_states_sync_filter(sync_filter_data->self, obj, sync_filter_data->commit_type); +} + +static GPtrArray * +_commit_collect_addresses(NML3Cfg *self, int addr_family, NML3CfgCommitType commit_type) +{ + const int IS_IPv4 = NM_IS_IPv4(addr_family); + const NMDedupMultiHeadEntry *head_entry; + const ObjStatesSyncFilterData sync_filter_data = { + .self = self, + .commit_type = commit_type, + }; + + head_entry = nm_l3_config_data_lookup_objs(self->priv.p->combined_l3cd_commited, + NMP_OBJECT_TYPE_IP_ADDRESS(IS_IPv4)); + return nm_dedup_multi_objs_to_ptr_array_head(head_entry, + _obj_states_sync_filter_predicate, + (gpointer) &sync_filter_data); +} + +static void +_commit_collect_routes(NML3Cfg *self, + int addr_family, + NML3CfgCommitType commit_type, + GPtrArray **routes) +{ + const int IS_IPv4 = NM_IS_IPv4(addr_family); + const NMDedupMultiHeadEntry *head_entry; + const NMDedupMultiEntry *entry; + + nm_assert(routes && !*routes); + + head_entry = nm_l3_config_data_lookup_objs(self->priv.p->combined_l3cd_commited, + NMP_OBJECT_TYPE_IP_ROUTE(IS_IPv4)); + + if (!head_entry) + return; + + c_list_for_each_entry (entry, &head_entry->lst_entries_head, lst_entries) { + const NMPObject *obj = entry->obj; + + if (!_obj_states_sync_filter(self, obj, commit_type)) + continue; + + if (!*routes) { + *routes = + g_ptr_array_new_full(head_entry->len, (GDestroyNotify) nm_dedup_multi_obj_unref); + } + + g_ptr_array_add(*routes, (gpointer) nmp_object_ref(obj)); + } +} + static void _obj_state_zombie_lst_get_prune_lists(NML3Cfg *self, int addr_family, @@ -3789,6 +3841,7 @@ out_prune: } /*****************************************************************************/ + static const char * ip6_privacy_to_str(NMSettingIP6ConfigPrivacy ip6_privacy) { @@ -4070,23 +4123,9 @@ _l3_commit_one(NML3Cfg *self, _l3_cfg_commit_type_to_string(commit_type, sbuf_commit_type, sizeof(sbuf_commit_type))); if (self->priv.p->combined_l3cd_commited) { - const NMDedupMultiHeadEntry *head_entry; - const ObjStatesSyncFilterData sync_filter_data = { - .self = self, - .commit_type = commit_type, - }; + addresses = _commit_collect_addresses(self, addr_family, commit_type); - head_entry = nm_l3_config_data_lookup_objs(self->priv.p->combined_l3cd_commited, - NMP_OBJECT_TYPE_IP_ADDRESS(IS_IPv4)); - addresses = nm_dedup_multi_objs_to_ptr_array_head(head_entry, - _obj_states_sync_filter, - (gpointer) &sync_filter_data); - - head_entry = nm_l3_config_data_lookup_objs(self->priv.p->combined_l3cd_commited, - NMP_OBJECT_TYPE_IP_ROUTE(IS_IPv4)); - routes = nm_dedup_multi_objs_to_ptr_array_head(head_entry, - _obj_states_sync_filter, - (gpointer) &sync_filter_data); + _commit_collect_routes(self, addr_family, commit_type, &routes); route_table_sync = nm_l3_config_data_get_route_table_sync(self->priv.p->combined_l3cd_commited, From 6255e0dcac06111a121541f982d11eefbae20cb1 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 3 Feb 2022 23:53:30 +0100 Subject: [PATCH 049/118] core: handle blackhole/unreachable/prohibit route types in core Specifically, in nm_utils_ip_route_attribute_to_platform() and in _l3_config_data_add_obj() handle such new route type. For the moment, they cannot be stored in a valid NMSettingIPConfig, but later this will be necessary. --- src/core/NetworkManagerUtils.c | 3 ++- src/core/nm-l3-config-data.c | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/core/NetworkManagerUtils.c b/src/core/NetworkManagerUtils.c index 14f9b453c8..c50dbadad2 100644 --- a/src/core/NetworkManagerUtils.c +++ b/src/core/NetworkManagerUtils.c @@ -1347,7 +1347,8 @@ nm_utils_ip_route_attribute_to_platform(int addr_family, int type; type = nm_net_aux_rtnl_rtntype_a2n(g_variant_get_string(variant, NULL)); - nm_assert(NM_IN_SET(type, RTN_UNICAST, RTN_LOCAL)); + nm_assert( + NM_IN_SET(type, RTN_UNICAST, RTN_LOCAL, RTN_BLACKHOLE, RTN_UNREACHABLE, RTN_PROHIBIT)); r->type_coerced = nm_platform_route_type_coerce(type); } else diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c index 4b099884f8..03593ea28c 100644 --- a/src/core/nm-l3-config-data.c +++ b/src/core/nm-l3-config-data.c @@ -1094,8 +1094,22 @@ _l3_config_data_add_obj(NMDedupMultiIndex *multi_idx, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ADDRESS, NMP_OBJECT_TYPE_IP6_ROUTE)); + nm_assert((!!obj_new) != (!!pl_new)); + + if (NM_IN_SET(idx_type->obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE)) { + const NMPlatformIPRoute *r; + + r = obj_new ? NMP_OBJECT_CAST_IP_ROUTE(obj_new) : (NMPlatformIPRoute *) pl_new; + + if (nm_platform_route_type_is_nodev(nm_platform_route_type_uncoerce(r->type_coerced))) { + /* such routes don't have a device/next-hop. We track them without ifindex. */ + ifindex = 0; + } + } + /* we go through extra lengths to accept a full obj_new object. That one, - * can be reused by increasing the ref-count. */ + * can be reused by increasing the ref-count. We thus accept any ifindex, and + * set it here. */ if (!obj_new) { nm_assert(pl_new); obj_new = nmp_object_stackinit(&obj_new_stackinit, idx_type->obj_type, pl_new); From 9ab53e561a636a48e772d48c96d6bd2e0be13329 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 7 Feb 2022 20:52:49 +0100 Subject: [PATCH 050/118] core/l3cfg: let NML3Cfg handle nodev (blackhole) routes Certain route types (blackhole, unreachable, prohibit) are not tied to an interface. They are thus global and we need to track them system wide (or better: per network namespace). That is done by NMPRouteManager. For the routing rules, it's NMDevice itself to track/untrack the rules. That is done for historical reasons, at the time, NML3Cfg did not exit. Now with NML3Cfg, it seems that also NML3Cfg should be the part that handles nodev routes. One reason is that we want to move IP functionality out of NMDevice. So callers (NMDevice) would just add blackhole routes to the NML3ConfigData and let NML3Cfg handle them. Still, to handle these routes is rather different from regular routes. Normally, NML3Cfg tracks an object state (ObjStateData) for each address/route, and it hooks into platform signals to update the os_plobj field. Those signals are dispatched by NMNetns and are only per-ifindex. Hence, NML3Cfg wouldn't be notified about those nodev routes. Consequently, there os_plobj could not be (efficiently) maintained and there is no ObjStateData for such routes. Instead, all that NML3Cfg does is have the routes in the NML3ConfigData and tell NMPRouteManager about them. Seems simple enough. The only question is when should NMPRouteManager sync? For now, we sync when the track/untracking brings any changes and during reapply. Which is probably fine. --- src/core/nm-l3cfg.c | 107 ++++++++++++++++++++++++++++++++++++++++---- src/core/nm-l3cfg.h | 14 +++--- 2 files changed, 106 insertions(+), 15 deletions(-) diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index dfb80c7cb9..e7aee79a04 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -12,6 +12,7 @@ #include "libnm-glib-aux/nm-time-utils.h" #include "libnm-platform/nm-platform.h" #include "libnm-platform/nmp-object.h" +#include "libnm-platform/nmp-route-manager.h" #include "nm-netns.h" #include "n-acd/src/n-acd.h" #include "nm-l3-ipv4ll.h" @@ -410,6 +411,25 @@ static NM_UTILS_LOOKUP_DEFINE(_l3_acd_addr_state_to_string, "external-removed"), NM_UTILS_LOOKUP_ITEM(NM_L3_ACD_ADDR_STATE_USED, "used"), ); +static gboolean +_obj_is_route_nodev(const NMPObject *obj) +{ + gboolean has_ifindex; + + nm_assert(obj); + + has_ifindex = (NMP_OBJECT_CAST_OBJ_WITH_IFINDEX(obj)->ifindex > 0); + + nm_assert(has_ifindex + == !(NM_IN_SET(NMP_OBJECT_GET_TYPE(obj), + NMP_OBJECT_TYPE_IP4_ROUTE, + NMP_OBJECT_TYPE_IP6_ROUTE) + && nm_platform_route_type_is_nodev(nm_platform_route_type_uncoerce( + NMP_OBJECT_CAST_IP_ROUTE(obj)->type_coerced)))); + + return !has_ifindex; +} + /*****************************************************************************/ NMIPConfig * @@ -952,6 +972,11 @@ _obj_states_update_all(NML3Cfg *self) self->priv.p->combined_l3cd_commited, &obj, obj_type) { + if (_obj_is_route_nodev(obj)) { + /* this is a nodev route. We don't track an obj-state for this. */ + continue; + } + obj_state = g_hash_table_lookup(self->priv.p->obj_state_hash, &obj); if (!obj_state) { obj_state = @@ -1081,13 +1106,15 @@ static void _commit_collect_routes(NML3Cfg *self, int addr_family, NML3CfgCommitType commit_type, - GPtrArray **routes) + GPtrArray **routes, + GPtrArray **routes_nodev) { const int IS_IPv4 = NM_IS_IPv4(addr_family); const NMDedupMultiHeadEntry *head_entry; const NMDedupMultiEntry *entry; nm_assert(routes && !*routes); + nm_assert(routes_nodev && !*routes_nodev); head_entry = nm_l3_config_data_lookup_objs(self->priv.p->combined_l3cd_commited, NMP_OBJECT_TYPE_IP_ROUTE(IS_IPv4)); @@ -1097,16 +1124,20 @@ _commit_collect_routes(NML3Cfg *self, c_list_for_each_entry (entry, &head_entry->lst_entries_head, lst_entries) { const NMPObject *obj = entry->obj; + GPtrArray **r; - if (!_obj_states_sync_filter(self, obj, commit_type)) - continue; - - if (!*routes) { - *routes = - g_ptr_array_new_full(head_entry->len, (GDestroyNotify) nm_dedup_multi_obj_unref); + if (_obj_is_route_nodev(obj)) + r = routes_nodev; + else { + if (!_obj_states_sync_filter(self, obj, commit_type)) + continue; + r = routes; } - g_ptr_array_add(*routes, (gpointer) nmp_object_ref(obj)); + if (!*r) + *r = g_ptr_array_new_full(head_entry->len, (GDestroyNotify) nm_dedup_multi_obj_unref); + + g_ptr_array_add(*r, (gpointer) nmp_object_ref(obj)); } } @@ -3403,6 +3434,53 @@ nm_l3cfg_remove_config_all_dirty(NML3Cfg *self, gconstpointer tag) /*****************************************************************************/ +#define _NODEV_ROUTES_TAG(self, IS_IPv4) ((gconstpointer) (&(&(self)->priv.route_manager)[IS_IPv4])) + +static gboolean +_nodev_routes_untrack(NML3Cfg *self, int addr_family) +{ + return nmp_route_manager_untrack_all(self->priv.route_manager, + _NODEV_ROUTES_TAG(self, NM_IS_IPv4(addr_family)), + FALSE, + TRUE); +} + +static void +_nodev_routes_sync(NML3Cfg *self, + int addr_family, + NML3CfgCommitType commit_type, + GPtrArray *routes_nodev) +{ + const int IS_IPv4 = NM_IS_IPv4(addr_family); + const NMPObjectType obj_type = NMP_OBJECT_TYPE_IP_ROUTE(IS_IPv4); + guint i; + gboolean changed = FALSE; + + if (!routes_nodev) + goto out_clear; + + for (i = 0; i < routes_nodev->len; i++) { + const NMPObject *obj = routes_nodev->pdata[i]; + + if (nmp_route_manager_track(self->priv.route_manager, + obj_type, + NMP_OBJECT_CAST_IP_ROUTE(obj), + 1, + _NODEV_ROUTES_TAG(self, IS_IPv4), + NULL)) + changed = TRUE; + } + +out_clear: + if (_nodev_routes_untrack(self, addr_family)) + changed = TRUE; + + if (changed || commit_type >= NM_L3_CFG_COMMIT_TYPE_REAPPLY) + nmp_route_manager_sync(self->priv.route_manager, NMP_OBJECT_TYPE_IP_ROUTE(IS_IPv4), FALSE); +} + +/*****************************************************************************/ + typedef struct { NML3Cfg *self; gconstpointer tag; @@ -4102,6 +4180,7 @@ _l3_commit_one(NML3Cfg *self, const int IS_IPv4 = NM_IS_IPv4(addr_family); gs_unref_ptrarray GPtrArray *addresses = NULL; gs_unref_ptrarray GPtrArray *routes = NULL; + gs_unref_ptrarray GPtrArray *routes_nodev = NULL; gs_unref_ptrarray GPtrArray *addresses_prune = NULL; gs_unref_ptrarray GPtrArray *routes_prune = NULL; gs_unref_ptrarray GPtrArray *routes_temporary_not_available_arr = NULL; @@ -4125,7 +4204,7 @@ _l3_commit_one(NML3Cfg *self, if (self->priv.p->combined_l3cd_commited) { addresses = _commit_collect_addresses(self, addr_family, commit_type); - _commit_collect_routes(self, addr_family, commit_type, &routes); + _commit_collect_routes(self, addr_family, commit_type, &routes, &routes_nodev); route_table_sync = nm_l3_config_data_get_route_table_sync(self->priv.p->combined_l3cd_commited, @@ -4163,6 +4242,8 @@ _l3_commit_one(NML3Cfg *self, addresses, addresses_prune); + _nodev_routes_sync(self, addr_family, commit_type, routes_nodev); + if (!nm_platform_ip_route_sync(self->priv.platform, addr_family, self->priv.ifindex, @@ -4597,6 +4678,8 @@ constructed(GObject *object) self->priv.platform = g_object_ref(nm_netns_get_platform(self->priv.netns)); nm_assert(NM_IS_PLATFORM(self->priv.platform)); + self->priv.route_manager = nmp_route_manager_ref(nm_netns_get_route_manager(self->priv.netns)); + _LOGT("created (netns=" NM_HASH_OBFUSCATE_PTR_FMT ")", NM_HASH_OBFUSCATE_PTR(self->priv.netns)); G_OBJECT_CLASS(nm_l3cfg_parent_class)->constructed(object); @@ -4647,8 +4730,14 @@ finalize(GObject *object) nm_assert(c_list_is_empty(&self->priv.p->obj_state_temporary_not_available_lst_head)); nm_assert(c_list_is_empty(&self->priv.p->obj_state_zombie_lst_head)); + if (_nodev_routes_untrack(self, AF_INET)) + nmp_route_manager_sync(self->priv.route_manager, NMP_OBJECT_TYPE_IP4_ROUTE, FALSE); + if (_nodev_routes_untrack(self, AF_INET6)) + nmp_route_manager_sync(self->priv.route_manager, NMP_OBJECT_TYPE_IP6_ROUTE, FALSE); + g_clear_object(&self->priv.netns); g_clear_object(&self->priv.platform); + nm_clear_pointer(&self->priv.route_manager, nmp_route_manager_unref); nm_clear_l3cd(&self->priv.p->combined_l3cd_merged); nm_clear_l3cd(&self->priv.p->combined_l3cd_commited); diff --git a/src/core/nm-l3cfg.h b/src/core/nm-l3cfg.h index 6fd8f9de80..7dc9faccfe 100644 --- a/src/core/nm-l3cfg.h +++ b/src/core/nm-l3cfg.h @@ -195,16 +195,18 @@ typedef struct { } NML3ConfigNotifyData; struct _NML3CfgPrivate; +struct _NMPRouteManager; struct _NML3Cfg { GObject parent; struct { - struct _NML3CfgPrivate *p; - NMNetns *netns; - NMPlatform *platform; - const NMPObject *plobj; - const NMPObject *plobj_next; - int ifindex; + struct _NML3CfgPrivate *p; + NMNetns *netns; + NMPlatform *platform; + struct _NMPRouteManager *route_manager; + const NMPObject *plobj; + const NMPObject *plobj_next; + int ifindex; } priv; }; From 84598adddffc5e135cc6c7ee632e028dc9d8201a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 7 Feb 2022 19:35:05 +0100 Subject: [PATCH 051/118] libnm: allow configuring blackhole/unreachable/prohibit routes --- src/libnm-core-impl/nm-setting-ip-config.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/libnm-core-impl/nm-setting-ip-config.c b/src/libnm-core-impl/nm-setting-ip-config.c index 3cc0486e2a..52aa651570 100644 --- a/src/libnm-core-impl/nm-setting-ip-config.c +++ b/src/libnm-core-impl/nm-setting-ip-config.c @@ -1385,7 +1385,12 @@ _ip_route_attribute_validate(const char *name, string = g_variant_get_string(value, NULL); type = nm_net_aux_rtnl_rtntype_a2n(string); - if (!NM_IN_SET(type, RTN_UNICAST, RTN_LOCAL)) { + if (!NM_IN_SET(type, + RTN_UNICAST, + RTN_LOCAL, + RTN_BLACKHOLE, + RTN_UNREACHABLE, + RTN_PROHIBIT)) { g_set_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, @@ -1486,6 +1491,18 @@ _nm_ip_route_attribute_validate_all(const NMIPRoute *route, GError **error) return FALSE; } break; + case RTN_BLACKHOLE: + case RTN_UNREACHABLE: + case RTN_PROHIBIT: + if (route->next_hop) { + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("a %s route cannot have a next-hop"), + nm_net_aux_rtnl_rtntype_n2a(parse_data.type)); + return FALSE; + } + break; } return TRUE; From 41a177486b4c84fd6d7ce5b488c22c991b9c4a84 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 9 Feb 2022 20:00:25 +0100 Subject: [PATCH 052/118] tools: re-use regular expression in process_data() Yes, they get cached by the library already. Still, no need for doing this repeatedly. --- tools/generate-docs-nm-property-infos.py | 45 +++++++++++++----------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/tools/generate-docs-nm-property-infos.py b/tools/generate-docs-nm-property-infos.py index 41349e6d33..1790fd78ca 100755 --- a/tools/generate-docs-nm-property-infos.py +++ b/tools/generate-docs-nm-property-infos.py @@ -54,27 +54,29 @@ def scan_doc_comments(plugin, setting_node, file, start_tag, end_tag): return +keywords = [ + "property", + "variable", + "format", + "values", + "default", + "example", + "description", + "description-docbook", +] +kwd_first_line_re = re.compile( + r"^\s*\**\s+({}):\s+(.*?)\s*$".format("|".join(keywords)) +) +kwd_more_line_re = re.compile(r"^\s*\**\s+(.*?)\s*$") + + def process_data(data): parsed_data = {} if not data: return parsed_data - keywords = [ - "property", - "variable", - "format", - "values", - "default", - "example", - "description", - "description-docbook", - ] - kwd_pat = "|".join(keywords) keyword = "" for line in data: - kwd_first_line_found = re.search( - r"^\s*\**\s+({}):\s+(.*?)\s*$".format(kwd_pat), line - ) - kwd_more_line_found = re.search(r"^\s*\**\s+(.*?)\s*$", line) + kwd_first_line_found = kwd_first_line_re.search(line) if kwd_first_line_found: keyword = kwd_first_line_found.group(1) if keyword == "description-docbook": @@ -82,16 +84,17 @@ def process_data(data): else: value = kwd_first_line_found.group(2) + " " parsed_data[keyword] = value - elif kwd_more_line_found: + continue + kwd_more_line_found = kwd_more_line_re.search(line) + if kwd_more_line_found: if not keyword: print("Extra mess in a comment: %s" % (line)) exit(1) + if keyword == "description-docbook": + value = kwd_more_line_found.group(1) + "\n" else: - if keyword == "description-docbook": - value = kwd_more_line_found.group(1) + "\n" - else: - value = kwd_more_line_found.group(1) + " " - parsed_data[keyword] += value + value = kwd_more_line_found.group(1) + " " + parsed_data[keyword] += value for keyword in keywords: if keyword == "variable" and keyword not in parsed_data: parsed_data[keyword] = parsed_data["property"] From 35599b4349c18b771d86ea6a7f577909cfcb7a2f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 9 Feb 2022 20:02:17 +0100 Subject: [PATCH 053/118] tools: fix constructing XML by dropping broken pretty_xml() I don't understand the code, but it mangles the XML. There is no difference in the markup we have so far. But if you have nested XML (like for description-docbook tag) there are cases where this is wrong. There is also no need to prettify anything. If you want pretty-formatted XML, do it yourself, for example with $ tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes src/libnm-client-impl/nm-property-infos-nmcli.xml I think this was initially done, because we had the tool in perl, and when migrating, we wanted to generate the exactly same output. And it was the same output, and it was fine for the input we have. But with different input, it's wrong. Drop it now. --- tools/generate-docs-nm-property-infos.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/tools/generate-docs-nm-property-infos.py b/tools/generate-docs-nm-property-infos.py index 1790fd78ca..25aa272a69 100755 --- a/tools/generate-docs-nm-property-infos.py +++ b/tools/generate-docs-nm-property-infos.py @@ -123,18 +123,6 @@ def write_data(setting_node, parsed_data): property_node.append(des) -def pretty_xml(element, newline, level=0): - if element: - if (element.text is None) or element.text.isspace(): - element.text = newline - else: - element.text = newline + element.text.strip() + newline - temp = list(element) - for subelement in temp: - subelement.tail = newline - pretty_xml(subelement, newline, level=level + 1) - - if len(sys.argv) < 4: print("Usage: %s [plugin] [output-xml-file] [srcfiles]" % (sys.argv[0])) exit(1) @@ -152,6 +140,4 @@ for one_file in source_files: setting_node.text = "\n" scan_doc_comments(plugin, setting_node, one_file, start_tag, end_tag) -pretty_xml(root_node, "\n") - ET.ElementTree(root_node).write(output) From 7b1e9a5c3d146c7ddd83f552c290fc841388cfda Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 9 Feb 2022 19:04:05 +0100 Subject: [PATCH 054/118] libnm/doc: list route attributes in `man nm-settings-nmcli` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit IPv4: routes A list of IPv4 destination addresses, prefix length, optional IPv4 next hop addresses, optional route metric, optional attribute. The valid syntax is: "ip[/prefix] [next-hop] [metric] [attribute=val]...[,ip[/prefix]...]". For example "192.0.2.0/24 10.1.1.1 77, 198.51.100.0/24". Various attributes are supported: • "cwnd" - an unsigned 32 bit integer. • "initcwnd" - an unsigned 32 bit integer. • "initrwnd" - an unsigned 32 bit integer. • "lock-cwnd" - a boolean value. • "lock-initcwnd" - a boolean value. • "lock-initrwnd" - a boolean value. • "lock-mtu" - a boolean value. • "lock-window" - a boolean value. • "mtu" - an unsigned 32 bit integer. • "onlink" - a boolean value. • "scope" - an unsigned 8 bit integer. IPv4 only. • "src" - an IPv4 address. • "table" - an unsigned 32 bit integer. The default depends on ipv4.route-table. • "tos" - an unsigned 8 bit integer. IPv4 only. • "type" - one of unicast, local, blackhole, unavailable, prohibit. The default is unicast. • "window" - an unsigned 32 bit integer. For details see also `man ip-route`. Format: a comma separated list of routes IPv6: routes A list of IPv6 destination addresses, prefix length, optional IPv6 next hop addresses, optional route metric, optional attribute. The valid syntax is: "ip[/prefix] [next-hop] [metric] [attribute=val]...[,ip[/prefix]...]". Various attributes are supported: • "cwnd" - an unsigned 32 bit integer. • "from" - an IPv6 address with optional prefix. IPv6 only. • "initcwnd" - an unsigned 32 bit integer. • "initrwnd" - an unsigned 32 bit integer. • "lock-cwnd" - a boolean value. • "lock-initcwnd" - a boolean value. • "lock-initrwnd" - a boolean value. • "lock-mtu" - a boolean value. • "lock-window" - a boolean value. • "mtu" - an unsigned 32 bit integer. • "onlink" - a boolean value. • "src" - an IPv6 address. • "table" - an unsigned 32 bit integer. The default depends on ipv6.route-table. • "type" - one of unicast, local, blackhole, unavailable, prohibit. The default is unicast. • "window" - an unsigned 32 bit integer. For details see also `man ip-route`. Format: a comma separated list of routes --- src/libnm-core-impl/nm-setting-ip4-config.c | 70 ++++++++++++++++++++- src/libnm-core-impl/nm-setting-ip6-config.c | 65 +++++++++++++++++++ 2 files changed, 132 insertions(+), 3 deletions(-) diff --git a/src/libnm-core-impl/nm-setting-ip4-config.c b/src/libnm-core-impl/nm-setting-ip4-config.c index 6c2ba10d6c..76043cd50a 100644 --- a/src/libnm-core-impl/nm-setting-ip4-config.c +++ b/src/libnm-core-impl/nm-setting-ip4-config.c @@ -949,9 +949,73 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) * property: routes * format: a comma separated list of routes * description: A list of IPv4 destination addresses, prefix length, optional IPv4 - * next hop addresses, optional route metric, optional attribute. The valid syntax is: - * "ip[/prefix] [next-hop] [metric] [attribute=val]...[,ip[/prefix]...]". For example - * "192.0.2.0/24 10.1.1.1 77, 198.51.100.0/24". + * next hop addresses, optional route metric, optional attribute. The valid syntax is: + * "ip[/prefix] [next-hop] [metric] [attribute=val]...[,ip[/prefix]...]". For example + * "192.0.2.0/24 10.1.1.1 77, 198.51.100.0/24". + * description-docbook: + * + * A list of IPv4 destination addresses, prefix length, optional IPv4 + * next hop addresses, optional route metric, optional attribute. The valid syntax is: + * "ip[/prefix] [next-hop] [metric] [attribute=val]...[,ip[/prefix]...]". + * For example "192.0.2.0/24 10.1.1.1 77, 198.51.100.0/24". + * + * + * Various attributes are supported: + * + * + * "cwnd" - an unsigned 32 bit integer. + * + * + * "initcwnd" - an unsigned 32 bit integer. + * + * + * "initrwnd" - an unsigned 32 bit integer. + * + * + * "lock-cwnd" - a boolean value. + * + * + * "lock-initcwnd" - a boolean value. + * + * + * "lock-initrwnd" - a boolean value. + * + * + * "lock-mtu" - a boolean value. + * + * + * "lock-window" - a boolean value. + * + * + * "mtu" - an unsigned 32 bit integer. + * + * + * "onlink" - a boolean value. + * + * + * "scope" - an unsigned 8 bit integer. IPv4 only. + * + * + * "src" - an IPv4 address. + * + * + * "table" - an unsigned 32 bit integer. The default depends on ipv4.route-table. + * + * + * "tos" - an unsigned 8 bit integer. IPv4 only. + * + * + * "type" - one of unicast, local, blackhole, + * unavailable, prohibit. The default is unicast. + * + * + * "window" - an unsigned 32 bit integer. + * + * + * + * + * For details see also `man ip-route`. + * * ---end--- */ _nm_properties_override_gobj( diff --git a/src/libnm-core-impl/nm-setting-ip6-config.c b/src/libnm-core-impl/nm-setting-ip6-config.c index 99032e97f2..54f3f96b87 100644 --- a/src/libnm-core-impl/nm-setting-ip6-config.c +++ b/src/libnm-core-impl/nm-setting-ip6-config.c @@ -989,6 +989,71 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass) * default metric for the device. * ---end--- */ + /* ---nmcli--- + * property: routes + * format: a comma separated list of routes + * description-docbook: + * + * A list of IPv6 destination addresses, prefix length, optional IPv6 + * next hop addresses, optional route metric, optional attribute. The valid syntax is: + * "ip[/prefix] [next-hop] [metric] [attribute=val]...[,ip[/prefix]...]". + * + * + * Various attributes are supported: + * + * + * "cwnd" - an unsigned 32 bit integer. + * + * + * "from" - an IPv6 address with optional prefix. IPv6 only. + * + * + * "initcwnd" - an unsigned 32 bit integer. + * + * + * "initrwnd" - an unsigned 32 bit integer. + * + * + * "lock-cwnd" - a boolean value. + * + * + * "lock-initcwnd" - a boolean value. + * + * + * "lock-initrwnd" - a boolean value. + * + * + * "lock-mtu" - a boolean value. + * + * + * "lock-window" - a boolean value. + * + * + * "mtu" - an unsigned 32 bit integer. + * + * + * "onlink" - a boolean value. + * + * + * "src" - an IPv6 address. + * + * + * "table" - an unsigned 32 bit integer. The default depends on ipv6.route-table. + * + * + * "type" - one of unicast, local, blackhole, + * unavailable, prohibit. The default is unicast. + * + * + * "window" - an unsigned 32 bit integer. + * + * + * + * + * For details see also `man ip-route`. + * + * ---end--- + */ _nm_properties_override_gobj( properties_override, g_object_class_find_property(G_OBJECT_CLASS(setting_class), NM_SETTING_IP_CONFIG_ROUTES), From 948c2b0fb1c6a51b03ac6cfeb79febf19a234f20 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 9 Feb 2022 20:31:47 +0100 Subject: [PATCH 055/118] libnm/doc: describe routing-rules in `man nm-settings-nmcli` --- src/libnm-core-impl/nm-setting-ip4-config.c | 17 +++++++++++++++++ src/libnm-core-impl/nm-setting-ip6-config.c | 17 +++++++++++++++++ src/libnmc-setting/settings-docs.h.in | 2 ++ 3 files changed, 36 insertions(+) diff --git a/src/libnm-core-impl/nm-setting-ip4-config.c b/src/libnm-core-impl/nm-setting-ip4-config.c index 76043cd50a..5b06739c11 100644 --- a/src/libnm-core-impl/nm-setting-ip4-config.c +++ b/src/libnm-core-impl/nm-setting-ip4-config.c @@ -1047,6 +1047,23 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) .compare_fcn = _nm_setting_property_compare_fcn_ignore, .from_dbus_fcn = ip4_route_data_set, )); + /* ---nmcli--- + * property: routing-rules + * format: a comma separated list of routing rules + * description: A comma separated list of routing rules for policy routing. + * description-docbook: + * + * A comma separated list of routing rules for policy routing. The format + * is based on ip rule add syntax and mostly compatible. + * One difference is that routing rules in NetworkManager always need a + * fixed priority. + * + * + * Example: priority 5 from 192.167.4.0/24 table 45 + * + * ---end--- + */ + g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); _nm_setting_class_commit(setting_class, diff --git a/src/libnm-core-impl/nm-setting-ip6-config.c b/src/libnm-core-impl/nm-setting-ip6-config.c index 54f3f96b87..f4623b2819 100644 --- a/src/libnm-core-impl/nm-setting-ip6-config.c +++ b/src/libnm-core-impl/nm-setting-ip6-config.c @@ -1083,6 +1083,23 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass) .compare_fcn = _nm_setting_property_compare_fcn_ignore, .from_dbus_fcn = ip6_route_data_set, )); + /* ---nmcli--- + * property: routing-rules + * format: a comma separated list of routing rules + * description: A comma separated list of routing rules for policy routing. + * description-docbook: + * + * A comma separated list of routing rules for policy routing. The format + * is based on ip rule add syntax and mostly compatible. + * One difference is that routing rules in NetworkManager always need a + * fixed priority. + * + * + * Example: priority 5 from 1:2:3::5/128 table 45 + * + * ---end--- + */ + g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); _nm_setting_class_commit(setting_class, diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in index 0bc7d06932..5ba6302d64 100644 --- a/src/libnmc-setting/settings-docs.h.in +++ b/src/libnmc-setting/settings-docs.h.in @@ -253,6 +253,7 @@ #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_ROUTE_METRIC N_("The 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.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_ROUTE_TABLE N_("Enable 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.") #define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_ROUTES N_("A list of IPv4 destination addresses, prefix length, optional IPv4 next hop addresses, optional route metric, optional attribute. The valid syntax is: \"ip[/prefix] [next-hop] [metric] [attribute=val]...[,ip[/prefix]...]\". For example \"192.0.2.0/24 10.1.1.1 77, 198.51.100.0/24\".") +#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_ROUTING_RULES N_("A comma separated list of routing rules for policy routing.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE N_("Configure 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.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_ADDRESSES N_("A list of IPv6 addresses and their prefix length. Multiple addresses can be separated by comma. For example \"2001:db8:85a3::8a2e:370:7334/64, 2001:db8:85a3::5/64\". The addresses are listed in increasing priority, meaning the last address will be the primary address.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DAD_TIMEOUT N_("Timeout 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.") @@ -279,6 +280,7 @@ #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_ROUTE_METRIC N_("The 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.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_ROUTE_TABLE N_("Enable 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.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_ROUTES N_("Array of IP routes.") +#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_ROUTING_RULES N_("A comma separated list of routing rules for policy routing.") #define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_TOKEN N_("Configure the token for draft-chown-6man-tokenised-ipv6-identifiers-02 IPv6 tokenized interface identifiers. Useful with eui64 addr-gen-mode.") #define DESCRIBE_DOC_NM_SETTING_MACSEC_ENCRYPT N_("Whether the transmitted traffic must be encrypted.") #define DESCRIBE_DOC_NM_SETTING_MACSEC_MKA_CAK N_("The pre-shared CAK (Connectivity Association Key) for MACsec Key Agreement.") From d904f3702280dfc3041652a9734afb013a0b89bc Mon Sep 17 00:00:00 2001 From: Fernando Fernandez Mancera Date: Thu, 10 Feb 2022 09:53:20 +0100 Subject: [PATCH 056/118] nm-l3cfg: fix check on timestamp for assuming probing is good MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://bugzilla.redhat.com/show_bug.cgi?id=2028751 Fixes: db0d84f13a (“l3cfg: fix handling "instance-reset" ACD event”) --- src/core/nm-l3cfg.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index e7aee79a04..9258decf07 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -2469,9 +2469,9 @@ handle_init: nm_utils_get_monotonic_timestamp_msec_cached(p_now_msec); if (acd_data->info.state == NM_L3_ACD_ADDR_STATE_PROBING) { - if (acd_data->probing_timestamp_msec + ACD_WAIT_PROBING_EXTRA_TIME_MSEC - + ACD_WAIT_PROBING_EXTRA_TIME2_MSEC - >= (*p_now_msec)) { + if ((*p_now_msec) > acd_data->probing_timestamp_msec + + ACD_WAIT_PROBING_EXTRA_TIME_MSEC + + ACD_WAIT_PROBING_EXTRA_TIME2_MSEC) { /* hm. We failed to create a new probe too long. Something is really wrong * internally, but let's ignore the issue and assume the address is good. What * else would we do? Assume the address is USED? */ From 122070142d822d884b13d1ee12b192de559a3b63 Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Thu, 10 Feb 2022 12:29:48 +0100 Subject: [PATCH 057/118] NEWS: update for 1.36-rc2 --- NEWS | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index c103411668..517e3a5ae6 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,5 @@ ============================================= -NetworkManager-1.36-rc1 +NetworkManager-1.36-rc2 Overview of changes since NetworkManager-1.34 ============================================= @@ -21,10 +21,15 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! * 5G NR (New Radio) modems are now supported. * The "rd.znet_ifnames" kernel command line option is now honored on network bootups on an IBM s390 platform. -* Wi-Fi P2P support dows now work with the IWD backend, in addition to +* Wi-Fi P2P support does now work with the IWD backend, in addition to wpa_supplicant backend. +* Support for special route types have been added: "prohibit", "blackhole" + and "unreachable". * Routes managed by routing daemons are now ignored. This is done to address a performance bottleneck on specialized routers. +* Handling of IP addressing and routing information is now slightly + more efficient and uses less memory. This is apparent on systems with + large amount of IP configuration information. * It is now possible to start NetworkManager without root user privileges. This is experimental doesn't necessarily result in a working daemon. NetworkManager service already drops many of capabilities available @@ -37,6 +42,8 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! options are now handled gracefully. * Bridge support has gained the possibility of turning off MAC ageing. * "configure-and-quit" mode and nm-iface-helper have been removed. +* A number of bugs that could cause NetworkManager to crash in rare + conditions have been fixed. It is likely that some of these changes have been or will be included in 1.34.x stable releases. This section will be updated to reflect that in From eaa0b533da49bb6a77e3664252b7fc0b3c4b6e63 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 10 Feb 2022 18:23:59 +0100 Subject: [PATCH 058/118] core/trivial: add code comment to _set_hostname() --- src/core/nm-policy.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/nm-policy.c b/src/core/nm-policy.c index cb5b543e9d..7e9c4bdce3 100644 --- a/src/core/nm-policy.c +++ b/src/core/nm-policy.c @@ -609,7 +609,10 @@ _set_hostname(NMPolicy *self, const char *new_hostname, const char *msg) _LOGI(LOGD_DNS, "set-hostname: set hostname to '%s' (%s)", name, msg); /* Ask NMSettings to update the transient hostname using its - * systemd-hostnamed proxy */ + * systemd-hostnamed proxy. + * + * FIXME(shutdown): an async request must be cancellable, so we are guaranteed + * to tear down in a reasonable time.*/ nm_hostname_manager_set_transient_hostname(priv->hostname_manager, name, settings_set_hostname_cb, From dc64cff166791135dd9194ddb73ee3af20c08b5d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 10 Feb 2022 18:56:47 +0100 Subject: [PATCH 059/118] core/tests: make test_machine_id_read() more robust against the test system test_machine_id_read() is a flawed unit test, as it reads the machine-id of the machine where it's running. That means the test depends on the test machine, which is obviously a problem. If you had no /etc/machine-id but a /var/lib/dbus/machine-id, then previously the test would fail. If the file exists, assume we are able to read a valid machine-id. On test systems that have a bogus /etc/machine-id or /var/lib/dbus/machine-id, the test would still fail. Just don't do that. --- src/core/tests/test-core.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/core/tests/test-core.c b/src/core/tests/test-core.c index f61d66d911..b4e1c4d5f3 100644 --- a/src/core/tests/test-core.c +++ b/src/core/tests/test-core.c @@ -2319,10 +2319,25 @@ test_machine_id_read(void) char machine_id_str[33]; gpointer logstate; + /* This unit test checks our functions to read /etc/machine-id. As + * the path name is not configurable (and the test does not setup + * a chroot/mountns), we read the actual file from the system. That + * is ugly, as the test depends on the system where it's running. + * + * Still, better a bad test, than no test. Patch welcome to fix this + * shortcoming. + * + * Also, if you have a sufficiently broken system, the unit test fails. + * In particular, if the machine-id file exists but does not contain + * a valid ID. Just don't have that. Fix your system. */ + logstate = nmtst_logging_disable(FALSE); /* If you run this test as root, without a valid /etc/machine-id, * the code will try to get the secret-key. That is a bit ugly, - * but no real problem. */ + * but no real problem. + * + * The real answer is: don't run our unit tests as root. That's + * not the way to do it. */ machine_id = nm_utils_machine_id_bin(); nmtst_logging_reenable(logstate); @@ -2338,9 +2353,15 @@ test_machine_id_read(void) * is invalid. Our machine-id is fake, and we have nothing to * compare against. */ - /* NOTE: this test will fail, if you don't have /etc/machine-id, - * but a valid "LOCALSTATEDIR/lib/dbus/machine-id" file. - * Just don't do that. */ + if (g_file_test(LOCALSTATEDIR "/lib/dbus/machine-id", G_FILE_TEST_EXISTS)) { + /* Hm. So systemd failed to read /etc/machine-id, but we may have the one from D-Bus. + * With LOCALSTATEDIR"/lib/dbus/machine-id", we don't really know whether we + * parsed that file. Assume we don't know and skip the test on this system. */ + g_assert(!nm_utils_machine_id_is_fake()); + return; + } + + /* OK, in this case, our function should have generated a random machine ID. */ g_assert(nm_utils_machine_id_is_fake()); } else { g_assert(!nm_utils_machine_id_is_fake()); From f0c565a79fb67e4590f860f83f9abed155e33a4d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 24 Jan 2022 17:10:08 +0100 Subject: [PATCH 060/118] glib-aux: add nm_strvarray_*() helpers for cmp/equal functions --- src/libnm-glib-aux/nm-shared-utils.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h index 54550f2737..390b4ccb4a 100644 --- a/src/libnm-glib-aux/nm-shared-utils.h +++ b/src/libnm-glib-aux/nm-shared-utils.h @@ -3139,6 +3139,33 @@ nm_strvarray_remove_first(GArray *strv, const char *needle) return TRUE; } +static inline int +nm_strvarray_cmp(const GArray *a, const GArray *b) +{ + NM_CMP_SELF(a, b); + + return nm_strv_cmp_n((const char *const *) a->data, + a->len, + (const char *const *) b->data, + b->len); +} + +#define nm_strvarray_equal(a, b) (nm_strvarray_cmp((a), (b)) == 0) + +static inline int +_nm_strvarray_cmp_strv(const GArray *strv, const char *const *ss, gsize ss_len) +{ + return nm_strv_cmp_n(strv ? (const char *const *) strv->data : NULL, + strv ? ((gssize) strv->len) : -1, + ss, + ss_len); +} +#define nm_strvarray_cmp_strv(strv, ss, ss_len) \ + _nm_strvarray_cmp_strv((strv), NM_CAST_STRV_CC(ss), (ss_len)) + +#define nm_strvarray_equal_strv(strv, ss, ss_len) \ + (nm_strvarray_cmp_strv((strv), (ss), (ss_len)) == 0) + /*****************************************************************************/ struct _NMVariantAttributeSpec { From 61ff2b03df1be3917057d99e63558a6121a22267 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 24 Jan 2022 17:10:34 +0100 Subject: [PATCH 061/118] libnm: add direct strv type for NMSetting and use it for "match.interface-name" G_TYPE_STRV is the last property type in NMSetting that is implemented by directly accessing the GObect property. Note that we have lots of override, non-default implementations that still use GObject properties, but I am talking here about properties that don't have a special implementation and use a G_TYPE_STRV GObject property. Add a "direct" implementation also for strv arrays. The advantage is that we no longer call g_value_get() for various operations, which requires a deep-copy of the strv array. The other advantage is that we will get a unified approach for implementing strv properties. In particular strv arrays need a lot of code to implement, and most settings do it differently. By adding a general mechanism, this code (and behavior) can be unified. Showcase it on "match.interface-name". --- src/libnm-core-impl/nm-setting-match.c | 74 +++++++++++---------- src/libnm-core-impl/nm-setting-private.h | 45 +++++++++++++ src/libnm-core-impl/nm-setting.c | 83 +++++++++++++++++++++++- src/libnm-core-impl/tests/test-setting.c | 13 +++- src/libnm-glib-aux/nm-json-aux.h | 5 +- src/libnm-glib-aux/nm-value-type.h | 68 ++++++++++--------- 6 files changed, 217 insertions(+), 71 deletions(-) diff --git a/src/libnm-core-impl/nm-setting-match.c b/src/libnm-core-impl/nm-setting-match.c index 0ddffee582..6457c3da61 100644 --- a/src/libnm-core-impl/nm-setting-match.c +++ b/src/libnm-core-impl/nm-setting-match.c @@ -32,11 +32,11 @@ NM_GOBJECT_PROPERTIES_DEFINE(NMSettingMatch, * Since: 1.14 */ struct _NMSettingMatch { - NMSetting parent; - GArray *interface_name; - GArray *kernel_command_line; - GArray *driver; - GArray *path; + NMSetting parent; + NMValueStrv interface_name; + GArray *kernel_command_line; + GArray *driver; + GArray *path; }; struct _NMSettingMatchClass { @@ -60,7 +60,7 @@ nm_setting_match_get_num_interface_names(NMSettingMatch *setting) { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), 0); - return nm_g_array_len(setting->interface_name); + return nm_g_array_len(setting->interface_name.arr); } /** @@ -77,10 +77,11 @@ nm_setting_match_get_interface_name(NMSettingMatch *setting, int idx) { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL); - g_return_val_if_fail(setting->interface_name && idx >= 0 && idx < setting->interface_name->len, + g_return_val_if_fail(setting->interface_name.arr && idx >= 0 + && idx < setting->interface_name.arr->len, NULL); - return nm_strvarray_get_idx(setting->interface_name, idx); + return nm_strvarray_get_idx(setting->interface_name.arr, idx); } /** @@ -98,7 +99,7 @@ nm_setting_match_add_interface_name(NMSettingMatch *setting, const char *interfa g_return_if_fail(NM_IS_SETTING_MATCH(setting)); g_return_if_fail(interface_name); - nm_strvarray_add(nm_strvarray_ensure(&setting->interface_name), interface_name); + nm_strvarray_add(nm_strvarray_ensure(&setting->interface_name.arr), interface_name); _notify(setting, PROP_INTERFACE_NAME); } @@ -116,9 +117,10 @@ nm_setting_match_remove_interface_name(NMSettingMatch *setting, int idx) { g_return_if_fail(NM_IS_SETTING_MATCH(setting)); - g_return_if_fail(setting->interface_name && idx >= 0 && idx < setting->interface_name->len); + g_return_if_fail(setting->interface_name.arr && idx >= 0 + && idx < setting->interface_name.arr->len); - g_array_remove_index(setting->interface_name, idx); + g_array_remove_index(setting->interface_name.arr, idx); _notify(setting, PROP_INTERFACE_NAME); } @@ -139,7 +141,7 @@ nm_setting_match_remove_interface_name_by_value(NMSettingMatch *setting, const c g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), FALSE); g_return_val_if_fail(interface_name, FALSE); - if (nm_strvarray_remove_first(setting->interface_name, interface_name)) { + if (nm_strvarray_remove_first(setting->interface_name.arr, interface_name)) { _notify(setting, PROP_INTERFACE_NAME); return TRUE; } @@ -160,8 +162,8 @@ nm_setting_match_clear_interface_names(NMSettingMatch *setting) { g_return_if_fail(NM_IS_SETTING_MATCH(setting)); - if (nm_g_array_len(setting->interface_name) != 0) { - nm_clear_pointer(&setting->interface_name, g_array_unref); + if (nm_g_array_len(setting->interface_name.arr) != 0) { + nm_clear_pointer(&setting->interface_name.arr, g_array_unref); _notify(setting, PROP_INTERFACE_NAME); } } @@ -185,7 +187,7 @@ nm_setting_match_get_interface_names(NMSettingMatch *setting, guint *length) { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL); - return nm_strvarray_get_strv(&setting->interface_name, length); + return nm_strvarray_get_strv(&setting->interface_name.arr, length); } /*****************************************************************************/ @@ -615,9 +617,6 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) NMSettingMatch *self = NM_SETTING_MATCH(object); switch (prop_id) { - case PROP_INTERFACE_NAME: - g_value_take_boxed(value, nm_strvarray_get_strv_non_empty_dup(self->interface_name, NULL)); - break; case PROP_KERNEL_COMMAND_LINE: g_value_take_boxed(value, nm_strvarray_get_strv_non_empty_dup(self->kernel_command_line, NULL)); @@ -629,7 +628,7 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) g_value_take_boxed(value, nm_strvarray_get_strv_non_empty_dup(self->path, NULL)); break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + _nm_setting_property_get_property_direct(object, prop_id, value, pspec); break; } } @@ -640,9 +639,6 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps NMSettingMatch *self = NM_SETTING_MATCH(object); switch (prop_id) { - case PROP_INTERFACE_NAME: - nm_strvarray_set_strv(&self->interface_name, g_value_get_boxed(value)); - break; case PROP_KERNEL_COMMAND_LINE: nm_strvarray_set_strv(&self->kernel_command_line, g_value_get_boxed(value)); break; @@ -653,7 +649,7 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps nm_strvarray_set_strv(&self->path, g_value_get_boxed(value)); break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + _nm_setting_property_set_property_direct(object, prop_id, value, pspec); break; } } @@ -698,9 +694,9 @@ verify(NMSetting *setting, NMConnection *connection, GError **error) NMSettingMatch *self = NM_SETTING_MATCH(setting); guint i; - if (self->interface_name) { - for (i = 0; i < self->interface_name->len; i++) { - if (nm_str_is_empty(nm_strvarray_get_idx(self->interface_name, i))) { + if (self->interface_name.arr) { + for (i = 0; i < self->interface_name.arr->len; i++) { + if (nm_str_is_empty(nm_strvarray_get_idx(self->interface_name.arr, i))) { g_set_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, @@ -770,7 +766,7 @@ finalize(GObject *object) { NMSettingMatch *self = NM_SETTING_MATCH(object); - nm_clear_pointer(&self->interface_name, g_array_unref); + nm_clear_pointer(&self->interface_name.arr, g_array_unref); nm_clear_pointer(&self->kernel_command_line, g_array_unref); nm_clear_pointer(&self->driver, g_array_unref); nm_clear_pointer(&self->path, g_array_unref); @@ -781,8 +777,9 @@ finalize(GObject *object) static void nm_setting_match_class_init(NMSettingMatchClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS(klass); - NMSettingClass *setting_class = NM_SETTING_CLASS(klass); + GObjectClass *object_class = G_OBJECT_CLASS(klass); + NMSettingClass *setting_class = NM_SETTING_CLASS(klass); + GArray *properties_override = _nm_sett_info_property_override_create_array(); object_class->get_property = get_property; object_class->set_property = set_property; @@ -810,12 +807,13 @@ nm_setting_match_class_init(NMSettingMatchClass *klass) * * Since: 1.14 **/ - obj_properties[PROP_INTERFACE_NAME] = g_param_spec_boxed( - NM_SETTING_MATCH_INTERFACE_NAME, - "", - "", - G_TYPE_STRV, - NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + _nm_setting_property_define_direct_strv(properties_override, + obj_properties, + NM_SETTING_MATCH_INTERFACE_NAME, + PROP_INTERFACE_NAME, + NM_SETTING_PARAM_FUZZY_IGNORE, + NMSettingMatch, + interface_name); /** * NMSettingMatch:kernel-command-line @@ -901,5 +899,9 @@ nm_setting_match_class_init(NMSettingMatchClass *klass) g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); - _nm_setting_class_commit(setting_class, NM_META_SETTING_TYPE_MATCH, NULL, NULL, 0); + _nm_setting_class_commit(setting_class, + NM_META_SETTING_TYPE_MATCH, + NULL, + properties_override, + 0); } diff --git a/src/libnm-core-impl/nm-setting-private.h b/src/libnm-core-impl/nm-setting-private.h index 7483eaedda..38b233e92a 100644 --- a/src/libnm-core-impl/nm-setting-private.h +++ b/src/libnm-core-impl/nm-setting-private.h @@ -232,6 +232,14 @@ gboolean _nm_setting_clear_secrets(NMSetting *setting, /*****************************************************************************/ +/* This holds a property of type NM_VALUE_TYPE_STRV. You probably want + * to use nm_strvarray_*() API with this. */ +typedef struct { + GArray *arr; +} NMValueStrv; + +/*****************************************************************************/ + #define NM_SETTING_PARAM_NONE 0 /* The property of the #NMSetting should be considered during comparisons that @@ -277,6 +285,7 @@ extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_int64; extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_uint64; extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_string; extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_bytes; +extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_strv; extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_enum; extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_flags; extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_mac_address; @@ -774,6 +783,42 @@ _nm_properties_override(GArray *properties_override, const NMSettInfoProperty *p /*****************************************************************************/ +#define _nm_setting_property_define_direct_strv(properties_override, \ + obj_properties, \ + prop_name, \ + prop_id, \ + param_flags, \ + private_struct_type, \ + private_struct_field, \ + ... /* extra NMSettInfoProperty fields */) \ + G_STMT_START \ + { \ + GParamSpec *_param_spec; \ + \ + G_STATIC_ASSERT(!NM_FLAGS_ANY((param_flags), ~(NM_SETTING_PARAM_FUZZY_IGNORE))); \ + \ + _param_spec = \ + g_param_spec_boxed("" prop_name "", \ + "", \ + "", \ + G_TYPE_STRV, \ + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags)); \ + \ + (obj_properties)[(prop_id)] = _param_spec; \ + \ + _nm_properties_override_gobj((properties_override), \ + _param_spec, \ + &nm_sett_info_propert_type_direct_strv, \ + .direct_offset = \ + NM_STRUCT_OFFSET_ENSURE_TYPE(NMValueStrv, \ + private_struct_type, \ + private_struct_field), \ + __VA_ARGS__); \ + } \ + G_STMT_END + +/*****************************************************************************/ + #define _nm_setting_property_define_direct_enum(properties_override, \ obj_properties, \ prop_name, \ diff --git a/src/libnm-core-impl/nm-setting.c b/src/libnm-core-impl/nm-setting.c index be88effb88..e65e75e736 100644 --- a/src/libnm-core-impl/nm-setting.c +++ b/src/libnm-core-impl/nm-setting.c @@ -774,6 +774,13 @@ _nm_setting_property_get_property_direct(GObject *object, g_value_set_boxed(value, *p_val); return; } + case NM_VALUE_TYPE_STRV: + { + const NMValueStrv *p_val = _nm_setting_get_private_field(setting, sett_info, property_info); + + g_value_take_boxed(value, nm_strvarray_get_strv_non_empty_dup(p_val->arr, NULL)); + return; + } default: goto out_fail; } @@ -909,6 +916,18 @@ _nm_setting_property_set_property_direct(GObject *object, *p_val = v ? g_bytes_ref(v) : NULL; goto out_notify; } + case NM_VALUE_TYPE_STRV: + { + NMValueStrv *p_val = _nm_setting_get_private_field(setting, sett_info, property_info); + const char *const *v; + + v = g_value_get_boxed(value); + if (nm_strvarray_equal_strv(p_val->arr, v, -1)) + return; + + nm_strvarray_set_strv(&p_val->arr, v); + goto out_notify; + } default: goto out_fail; } @@ -1026,6 +1045,11 @@ _init_direct(NMSetting *setting) nm_assert(!(*((const GBytes *const *) _nm_setting_get_private_field(setting, sett_info, property_info)))); break; + case NM_VALUE_TYPE_STRV: + nm_assert(!((const NMValueStrv *) + _nm_setting_get_private_field(setting, sett_info, property_info)) + ->arr); + break; default: nm_assert_not_reached(); break; @@ -1081,6 +1105,13 @@ _finalize_direct(NMSetting *setting) nm_clear_pointer(p_val, g_bytes_unref); break; } + case NM_VALUE_TYPE_STRV: + { + NMValueStrv *p_val = _nm_setting_get_private_field(setting, sett_info, property_info); + + nm_clear_pointer(&p_val->arr, g_array_unref); + break; + } default: nm_assert_not_reached(); break; @@ -1199,6 +1230,20 @@ _nm_setting_property_to_dbus_fcn_direct(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS _nm_ return NULL; return nm_g_bytes_to_variant_ay(val); } + case NM_VALUE_TYPE_STRV: + { + const NMValueStrv *val; + + /* Strv properties have always NULL as default. Setting "including_default" has no defined meaning + * (but it could have). */ + nm_assert(!property_info->to_dbus_including_default); + + val = + (const NMValueStrv *) _nm_setting_get_private_field(setting, sett_info, property_info); + if (!val->arr) + return NULL; + return g_variant_new_strv((const char *const *) val->arr->data, val->arr->len); + } default: return nm_assert_unreachable_val(NULL); } @@ -1545,6 +1590,8 @@ _nm_setting_property_from_dbus_fcn_direct(_NM_SETT_INFO_PROP_FROM_DBUS_FCN_ARGS gs_unref_bytes GBytes *v = NULL; GBytes **p_val; + nm_assert(!property_info->property_type->from_dbus_direct_allow_transform); + if (!g_variant_is_of_type(value, G_VARIANT_TYPE_BYTESTRING)) goto out_error_wrong_dbus_type; @@ -1557,6 +1604,28 @@ _nm_setting_property_from_dbus_fcn_direct(_NM_SETT_INFO_PROP_FROM_DBUS_FCN_ARGS NM_SWAP(p_val, &v); goto out_notify; } + case NM_VALUE_TYPE_STRV: + { + NMValueStrv *p_val; + gs_free const char **ss = NULL; + gsize ss_len; + + nm_assert(!property_info->property_type->from_dbus_direct_allow_transform); + + if (!g_variant_is_of_type(value, G_VARIANT_TYPE_STRING_ARRAY)) + goto out_error_wrong_dbus_type; + + ss = g_variant_get_strv(value, &ss_len); + nm_assert(ss_len <= G_MAXUINT); + + p_val = _nm_setting_get_private_field(setting, sett_info, property_info); + + if (nm_strvarray_equal_strv(p_val->arr, ss, ss_len)) + goto out_unchanged; + + nm_strvarray_set_strv(&p_val->arr, ss); + goto out_notify; + } default: break; } @@ -2465,6 +2534,9 @@ _nm_setting_property_compare_fcn_direct(_NM_SETT_INFO_PROP_COMPARE_FCN_ARGS _nm_ return nm_streq0(*((const char *const *) p_a), *((const char *const *) p_b)); case NM_VALUE_TYPE_BYTES: return nm_g_bytes_equal0(*((const GBytes *const *) p_a), *((const GBytes *const *) p_b)); + case NM_VALUE_TYPE_STRV: + return nm_strvarray_equal(((const NMValueStrv *) p_a)->arr, + ((const NMValueStrv *) p_b)->arr); default: return nm_assert_unreachable_val(TRUE); } @@ -3529,8 +3601,15 @@ const NMSettInfoPropertType nm_sett_info_propert_type_direct_bytes = .compare_fcn = _nm_setting_property_compare_fcn_direct, .to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct, .from_dbus_fcn = _nm_setting_property_from_dbus_fcn_direct, - .from_dbus_is_full = TRUE, - .from_dbus_direct_allow_transform = TRUE); + .from_dbus_is_full = TRUE); + +const NMSettInfoPropertType nm_sett_info_propert_type_direct_strv = + NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_STRING_ARRAY, + .direct_type = NM_VALUE_TYPE_STRV, + .compare_fcn = _nm_setting_property_compare_fcn_direct, + .to_dbus_fcn = _nm_setting_property_to_dbus_fcn_direct, + .from_dbus_fcn = _nm_setting_property_from_dbus_fcn_direct, + .from_dbus_is_full = TRUE); const NMSettInfoPropertType nm_sett_info_propert_type_direct_enum = NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(G_VARIANT_TYPE_INT32, diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c index d6ac37b495..8e8d1a89e1 100644 --- a/src/libnm-core-impl/tests/test-setting.c +++ b/src/libnm-core-impl/tests/test-setting.c @@ -4583,6 +4583,12 @@ test_setting_metadata(void) == _nm_setting_property_to_dbus_fcn_direct); g_assert(sip->param_spec); g_assert(sip->param_spec->value_type == G_TYPE_BYTES); + } else if (sip->property_type->direct_type == NM_VALUE_TYPE_STRV) { + g_assert(g_variant_type_equal(sip->property_type->dbus_type, "as")); + g_assert(sip->property_type->to_dbus_fcn + == _nm_setting_property_to_dbus_fcn_direct); + g_assert(sip->param_spec); + g_assert(sip->param_spec->value_type == G_TYPE_STRV); } else g_assert_not_reached(); @@ -4671,7 +4677,12 @@ check_done:; } if (sip->property_type->from_dbus_fcn == _nm_setting_property_from_dbus_fcn_direct) { /* for the moment, all direct properties allow transformation. */ - g_assert(sip->property_type->from_dbus_direct_allow_transform); + if (NM_IN_SET(sip->property_type->direct_type, + NM_VALUE_TYPE_BYTES, + NM_VALUE_TYPE_STRV)) + g_assert(!sip->property_type->from_dbus_direct_allow_transform); + else + g_assert(sip->property_type->from_dbus_direct_allow_transform); } if (sip->property_type->from_dbus_fcn == _nm_setting_property_from_dbus_fcn_gprop) diff --git a/src/libnm-glib-aux/nm-json-aux.h b/src/libnm-glib-aux/nm-json-aux.h index 275ed7709a..3054b1f944 100644 --- a/src/libnm-glib-aux/nm-json-aux.h +++ b/src/libnm-glib-aux/nm-json-aux.h @@ -391,6 +391,7 @@ nm_value_type_to_json(NMValueType value_type, GString *gstr, gconstpointer p_fie nm_json_gstr_append_string(gstr, *((const char *const *) p_field)); return; case NM_VALUE_TYPE_BYTES: + case NM_VALUE_TYPE_STRV: case NM_VALUE_TYPE_NONE: case NM_VALUE_TYPE_UNSPEC: break; @@ -428,12 +429,12 @@ nm_value_type_from_json(const NMJsonVt *vt, return (nm_jansson_json_as_string(vt, elem, out_val) > 0); case NM_VALUE_TYPE_BYTES: + case NM_VALUE_TYPE_STRV: case NM_VALUE_TYPE_NONE: case NM_VALUE_TYPE_UNSPEC: break; } - nm_assert_not_reached(); - return FALSE; + return nm_assert_unreachable_val(FALSE); } #endif /* NM_VALUE_TYPE_DEFINE_FUNCTIONS */ diff --git a/src/libnm-glib-aux/nm-value-type.h b/src/libnm-glib-aux/nm-value-type.h index d774e12072..771021da4c 100644 --- a/src/libnm-glib-aux/nm-value-type.h +++ b/src/libnm-glib-aux/nm-value-type.h @@ -9,25 +9,26 @@ typedef enum _nm_packed { NM_VALUE_TYPE_NONE = 0, NM_VALUE_TYPE_UNSPEC = 1, - NM_VALUE_TYPE_BOOL = 2, - NM_VALUE_TYPE_INT32 = 3, - NM_VALUE_TYPE_INT = 4, - NM_VALUE_TYPE_INT64 = 5, - NM_VALUE_TYPE_UINT32 = 6, - NM_VALUE_TYPE_UINT = 7, - NM_VALUE_TYPE_UINT64 = 8, + + NM_VALUE_TYPE_BOOL, + NM_VALUE_TYPE_INT32, + NM_VALUE_TYPE_INT, + NM_VALUE_TYPE_INT64, + NM_VALUE_TYPE_UINT32, + NM_VALUE_TYPE_UINT, + NM_VALUE_TYPE_UINT64, /* Flags are for G_TYPE_FLAGS. That is, internally they are tracked * as a guint, they have a g_param_spec_flags() property and they are * serialized on D-Bus as "u". */ - NM_VALUE_TYPE_FLAGS = 9, + NM_VALUE_TYPE_FLAGS, /* G_TYPE_ENUM */ - NM_VALUE_TYPE_ENUM = 10, + NM_VALUE_TYPE_ENUM, - NM_VALUE_TYPE_STRING = 11, - - NM_VALUE_TYPE_BYTES = 12, + NM_VALUE_TYPE_STRING, + NM_VALUE_TYPE_BYTES, + NM_VALUE_TYPE_STRV, } NMValueType; /*****************************************************************************/ @@ -112,14 +113,17 @@ nm_value_type_cmp(NMValueType value_type, gconstpointer p_a, gconstpointer p_b) return 0; case NM_VALUE_TYPE_STRING: return nm_strcmp0(*((const char *const *) p_a), *((const char *const *) p_b)); + case NM_VALUE_TYPE_BYTES: - return nm_g_bytes_equal0(*((const GBytes *const *) p_a), *((const GBytes *const *) p_b)); + case NM_VALUE_TYPE_STRV: + /* These types have implementation define memory representations. */ + break; + case NM_VALUE_TYPE_NONE: case NM_VALUE_TYPE_UNSPEC: break; } - nm_assert_not_reached(); - return 0; + return nm_assert_unreachable_val(0); } static inline gboolean @@ -163,14 +167,12 @@ nm_value_type_copy(NMValueType value_type, gpointer dst, gconstpointer src) *((char **) dst) = g_strdup(*((const char *const *) src)); } return; - case NM_VALUE_TYPE_BYTES: - /* self assignment safe! */ - if (*((GBytes **) dst) != *((const GBytes *const *) src)) { - _nm_unused gs_unref_bytes GBytes *old = *((GBytes **) dst); - *((GBytes **) dst) = g_bytes_ref(*((GBytes *const *) src)); - } - return; + case NM_VALUE_TYPE_BYTES: + case NM_VALUE_TYPE_STRV: + /* These types have implementation define memory representations. */ + break; + case NM_VALUE_TYPE_NONE: case NM_VALUE_TYPE_UNSPEC: break; @@ -212,14 +214,18 @@ nm_value_type_get_from_variant(NMValueType value_type, return; case NM_VALUE_TYPE_BYTES: + case NM_VALUE_TYPE_STRV: + /* These types have implementation define memory representations. */ + break; + case NM_VALUE_TYPE_INT: case NM_VALUE_TYPE_UINT: case NM_VALUE_TYPE_ENUM: case NM_VALUE_TYPE_FLAGS: /* These types don't have a defined variant type, because it's not * clear how many bits we would need or how to handle the type. */ + break; - /* fall-through */ case NM_VALUE_TYPE_NONE: case NM_VALUE_TYPE_UNSPEC: break; @@ -230,8 +236,7 @@ nm_value_type_get_from_variant(NMValueType value_type, static inline GVariant * nm_value_type_to_variant(NMValueType value_type, gconstpointer src) { - const char *v_string; - const GBytes *v_bytes; + const char *v_string; switch (value_type) { case NM_VALUE_TYPE_BOOL: @@ -247,9 +252,11 @@ nm_value_type_to_variant(NMValueType value_type, gconstpointer src) case NM_VALUE_TYPE_STRING: v_string = *((const char *const *) src); return v_string ? g_variant_new_string(v_string) : NULL; + case NM_VALUE_TYPE_BYTES: - v_bytes = *((const GBytes *const *) src); - return v_bytes ? nm_g_bytes_to_variant_ay(v_bytes) : NULL; + case NM_VALUE_TYPE_STRV: + /* These types have implementation define memory representations. */ + break; case NM_VALUE_TYPE_INT: case NM_VALUE_TYPE_UINT: @@ -257,14 +264,13 @@ nm_value_type_to_variant(NMValueType value_type, gconstpointer src) case NM_VALUE_TYPE_FLAGS: /* These types don't have a defined variant type, because it's not * clear how many bits we would need or how to handle the type. */ + break; - /* fall-through */ case NM_VALUE_TYPE_NONE: case NM_VALUE_TYPE_UNSPEC: break; } - nm_assert_not_reached(); - return NULL; + return nm_assert_unreachable_val(NULL); } static inline const GVariantType * @@ -285,6 +291,8 @@ nm_value_type_get_variant_type(NMValueType value_type) return G_VARIANT_TYPE_STRING; case NM_VALUE_TYPE_BYTES: return G_VARIANT_TYPE_BYTESTRING; + case NM_VALUE_TYPE_STRV: + return G_VARIANT_TYPE_STRING_ARRAY; case NM_VALUE_TYPE_INT: case NM_VALUE_TYPE_UINT: From 98da5e0491f62eabae894c27992c6d4317886842 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 24 Jan 2022 17:24:25 +0100 Subject: [PATCH 062/118] libnm: rework strv properties of NMSetting as "direct" properties Make use of direct strv property in some cases. It doesn't work for other cases yet, because they are implemented differently, and porting them is more effort and needs to be done one by one. The goal is to have a unified, standard implementation for our properties. One that requires a minimal amount of property-specific code. For strv properties, that is a bit more cumbersome, because usually there are multiple C accessor functions. Still, make an effort to have a "direct" strv property. What this also gives, is that we no longer need to clone the strv array for various operations. We know how to access the data, and can do it directly without g_object_get()/g_object_set(). --- src/libnm-core-impl/nm-setting-connection.c | 93 +++++----- src/libnm-core-impl/nm-setting-match.c | 180 ++++++++------------ src/libnm-core-impl/tests/test-general.c | 2 +- 3 files changed, 115 insertions(+), 160 deletions(-) diff --git a/src/libnm-core-impl/nm-setting-connection.c b/src/libnm-core-impl/nm-setting-connection.c index 736110049b..86ebefd734 100644 --- a/src/libnm-core-impl/nm-setting-connection.c +++ b/src/libnm-core-impl/nm-setting-connection.c @@ -71,32 +71,32 @@ NM_GOBJECT_PROPERTIES_DEFINE(NMSettingConnection, PROP_MUD_URL, ); typedef struct { - GArray *permissions; - GArray *secondaries; - char *id; - char *uuid; - char *stable_id; - char *interface_name; - char *type; - char *master; - char *slave_type; - char *zone; - char *mud_url; - guint64 timestamp; - int autoconnect_slaves; - int metered; - gint32 autoconnect_priority; - gint32 autoconnect_retries; - gint32 multi_connect; - gint32 auth_retries; - gint32 mdns; - gint32 llmnr; - gint32 dns_over_tls; - gint32 wait_device_timeout; - gint32 lldp; - guint32 gateway_ping_timeout; - bool autoconnect; - bool read_only; + GArray *permissions; + NMValueStrv secondaries; + char *id; + char *uuid; + char *stable_id; + char *interface_name; + char *type; + char *master; + char *slave_type; + char *zone; + char *mud_url; + guint64 timestamp; + int autoconnect_slaves; + int metered; + gint32 autoconnect_priority; + gint32 autoconnect_retries; + gint32 multi_connect; + gint32 auth_retries; + gint32 mdns; + gint32 llmnr; + gint32 dns_over_tls; + gint32 wait_device_timeout; + gint32 lldp; + guint32 gateway_ping_timeout; + bool autoconnect; + bool read_only; } NMSettingConnectionPrivate; /** @@ -757,7 +757,7 @@ nm_setting_connection_get_autoconnect_slaves(NMSettingConnection *setting) GArray * _nm_setting_connection_get_secondaries(NMSettingConnection *setting) { - return NM_SETTING_CONNECTION_GET_PRIVATE(setting)->secondaries; + return NM_SETTING_CONNECTION_GET_PRIVATE(setting)->secondaries.arr; } /** @@ -771,7 +771,7 @@ nm_setting_connection_get_num_secondaries(NMSettingConnection *setting) { g_return_val_if_fail(NM_IS_SETTING_CONNECTION(setting), 0); - return nm_g_array_len(NM_SETTING_CONNECTION_GET_PRIVATE(setting)->secondaries); + return nm_g_array_len(NM_SETTING_CONNECTION_GET_PRIVATE(setting)->secondaries.arr); } /** @@ -794,14 +794,14 @@ nm_setting_connection_get_secondary(NMSettingConnection *setting, guint32 idx) priv = NM_SETTING_CONNECTION_GET_PRIVATE(setting); - secondaries_len = nm_g_array_len(priv->secondaries); + secondaries_len = nm_g_array_len(priv->secondaries.arr); if (idx >= secondaries_len) { /* access one past the length is OK. */ g_return_val_if_fail(idx == secondaries_len, NULL); return NULL; } - return nm_strvarray_get_idx(priv->secondaries, idx); + return nm_strvarray_get_idx(priv->secondaries.arr, idx); } /** @@ -841,10 +841,10 @@ nm_setting_connection_add_secondary(NMSettingConnection *setting, const char *se priv = NM_SETTING_CONNECTION_GET_PRIVATE(setting); - if (nm_strvarray_find_first(priv->secondaries, sec_uuid) >= 0) + if (nm_strvarray_find_first(priv->secondaries.arr, sec_uuid) >= 0) return FALSE; - nm_strvarray_add(nm_strvarray_ensure(&priv->secondaries), sec_uuid); + nm_strvarray_add(nm_strvarray_ensure(&priv->secondaries.arr), sec_uuid); _notify(setting, PROP_SECONDARIES); return TRUE; } @@ -865,9 +865,9 @@ nm_setting_connection_remove_secondary(NMSettingConnection *setting, guint32 idx priv = NM_SETTING_CONNECTION_GET_PRIVATE(setting); - g_return_if_fail(idx < nm_g_array_len(priv->secondaries)); + g_return_if_fail(idx < nm_g_array_len(priv->secondaries.arr)); - g_array_remove_index(priv->secondaries, idx); + g_array_remove_index(priv->secondaries.arr, idx); _notify(setting, PROP_SECONDARIES); } @@ -890,7 +890,7 @@ nm_setting_connection_remove_secondary_by_value(NMSettingConnection *setting, co priv = NM_SETTING_CONNECTION_GET_PRIVATE(setting); - if (nm_strvarray_remove_first(priv->secondaries, sec_uuid)) { + if (nm_strvarray_remove_first(priv->secondaries.arr, sec_uuid)) { _notify(setting, PROP_SECONDARIES); return TRUE; } @@ -1524,7 +1524,7 @@ after_interface_name: return NM_SETTING_VERIFY_NORMALIZABLE; } - if (!_nm_setting_connection_verify_secondaries(priv->secondaries, error)) + if (!_nm_setting_connection_verify_secondaries(priv->secondaries.arr, error)) return NM_SETTING_VERIFY_NORMALIZABLE; return TRUE; @@ -1637,9 +1637,6 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) case PROP_TIMESTAMP: g_value_set_uint64(value, nm_setting_connection_get_timestamp(setting)); break; - case PROP_SECONDARIES: - g_value_take_boxed(value, nm_strvarray_get_strv_non_empty_dup(priv->secondaries, NULL)); - break; default: _nm_setting_property_get_property_direct(object, prop_id, value, pspec); break; @@ -1675,9 +1672,6 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps case PROP_TIMESTAMP: priv->timestamp = g_value_get_uint64(value); break; - case PROP_SECONDARIES: - nm_strvarray_set_strv(&priv->secondaries, g_value_get_boxed(value)); - break; default: _nm_setting_property_set_property_direct(object, prop_id, value, pspec); break; @@ -1709,7 +1703,7 @@ finalize(GObject *object) NMSettingConnectionPrivate *priv = NM_SETTING_CONNECTION_GET_PRIVATE(object); nm_clear_pointer(&priv->permissions, g_array_unref); - nm_clear_pointer(&priv->secondaries, g_array_unref); + nm_clear_pointer(&priv->secondaries.arr, g_array_unref); G_OBJECT_CLASS(nm_setting_connection_parent_class)->finalize(object); } @@ -2230,12 +2224,13 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) * together with this connection. * ---end--- */ - obj_properties[PROP_SECONDARIES] = g_param_spec_boxed( - NM_SETTING_CONNECTION_SECONDARIES, - "", - "", - G_TYPE_STRV, - G_PARAM_READWRITE | NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_STATIC_STRINGS); + _nm_setting_property_define_direct_strv(properties_override, + obj_properties, + NM_SETTING_CONNECTION_SECONDARIES, + PROP_SECONDARIES, + NM_SETTING_PARAM_FUZZY_IGNORE, + NMSettingConnectionPrivate, + secondaries); /** * NMSettingConnection:gateway-ping-timeout: diff --git a/src/libnm-core-impl/nm-setting-match.c b/src/libnm-core-impl/nm-setting-match.c index 6457c3da61..f0e9fdf8d3 100644 --- a/src/libnm-core-impl/nm-setting-match.c +++ b/src/libnm-core-impl/nm-setting-match.c @@ -34,9 +34,9 @@ NM_GOBJECT_PROPERTIES_DEFINE(NMSettingMatch, struct _NMSettingMatch { NMSetting parent; NMValueStrv interface_name; - GArray *kernel_command_line; - GArray *driver; - GArray *path; + NMValueStrv kernel_command_line; + NMValueStrv driver; + NMValueStrv path; }; struct _NMSettingMatchClass { @@ -205,7 +205,7 @@ nm_setting_match_get_num_kernel_command_lines(NMSettingMatch *setting) { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), 0); - return nm_g_array_len(setting->kernel_command_line); + return nm_g_array_len(setting->kernel_command_line.arr); } /** @@ -222,10 +222,11 @@ nm_setting_match_get_kernel_command_line(NMSettingMatch *setting, guint idx) { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL); - g_return_val_if_fail(setting->kernel_command_line && idx < setting->kernel_command_line->len, + g_return_val_if_fail(setting->kernel_command_line.arr + && idx < setting->kernel_command_line.arr->len, NULL); - return nm_strvarray_get_idx(setting->kernel_command_line, idx); + return nm_strvarray_get_idx(setting->kernel_command_line.arr, idx); } /** @@ -243,7 +244,7 @@ nm_setting_match_add_kernel_command_line(NMSettingMatch *setting, const char *ke g_return_if_fail(NM_IS_SETTING_MATCH(setting)); g_return_if_fail(kernel_command_line); - nm_strvarray_add(nm_strvarray_ensure(&setting->kernel_command_line), kernel_command_line); + nm_strvarray_add(nm_strvarray_ensure(&setting->kernel_command_line.arr), kernel_command_line); _notify(setting, PROP_KERNEL_COMMAND_LINE); } @@ -261,9 +262,10 @@ nm_setting_match_remove_kernel_command_line(NMSettingMatch *setting, guint idx) { g_return_if_fail(NM_IS_SETTING_MATCH(setting)); - g_return_if_fail(setting->kernel_command_line && idx < setting->kernel_command_line->len); + g_return_if_fail(setting->kernel_command_line.arr + && idx < setting->kernel_command_line.arr->len); - g_array_remove_index(setting->kernel_command_line, idx); + g_array_remove_index(setting->kernel_command_line.arr, idx); _notify(setting, PROP_KERNEL_COMMAND_LINE); } @@ -285,7 +287,7 @@ nm_setting_match_remove_kernel_command_line_by_value(NMSettingMatch *setting, g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), FALSE); g_return_val_if_fail(kernel_command_line, FALSE); - if (nm_strvarray_remove_first(setting->kernel_command_line, kernel_command_line)) { + if (nm_strvarray_remove_first(setting->kernel_command_line.arr, kernel_command_line)) { _notify(setting, PROP_KERNEL_COMMAND_LINE); return TRUE; } @@ -306,8 +308,8 @@ nm_setting_match_clear_kernel_command_lines(NMSettingMatch *setting) { g_return_if_fail(NM_IS_SETTING_MATCH(setting)); - if (nm_g_array_len(setting->kernel_command_line) != 0) { - nm_clear_pointer(&setting->kernel_command_line, g_array_unref); + if (nm_g_array_len(setting->kernel_command_line.arr) != 0) { + nm_clear_pointer(&setting->kernel_command_line.arr, g_array_unref); _notify(setting, PROP_KERNEL_COMMAND_LINE); } } @@ -328,7 +330,7 @@ nm_setting_match_get_kernel_command_lines(NMSettingMatch *setting, guint *length { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL); - return nm_strvarray_get_strv(&setting->kernel_command_line, length); + return nm_strvarray_get_strv(&setting->kernel_command_line.arr, length); } /*****************************************************************************/ @@ -346,7 +348,7 @@ nm_setting_match_get_num_drivers(NMSettingMatch *setting) { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), 0); - return nm_g_array_len(setting->driver); + return nm_g_array_len(setting->driver.arr); } /** @@ -363,9 +365,9 @@ nm_setting_match_get_driver(NMSettingMatch *setting, guint idx) { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL); - g_return_val_if_fail(setting->driver && idx < setting->driver->len, NULL); + g_return_val_if_fail(setting->driver.arr && idx < setting->driver.arr->len, NULL); - return nm_strvarray_get_idx(setting->driver, idx); + return nm_strvarray_get_idx(setting->driver.arr, idx); } /** @@ -383,7 +385,7 @@ nm_setting_match_add_driver(NMSettingMatch *setting, const char *driver) g_return_if_fail(NM_IS_SETTING_MATCH(setting)); g_return_if_fail(driver); - nm_strvarray_add(nm_strvarray_ensure(&setting->driver), driver); + nm_strvarray_add(nm_strvarray_ensure(&setting->driver.arr), driver); _notify(setting, PROP_DRIVER); } @@ -401,9 +403,9 @@ nm_setting_match_remove_driver(NMSettingMatch *setting, guint idx) { g_return_if_fail(NM_IS_SETTING_MATCH(setting)); - g_return_if_fail(setting->driver && idx < setting->driver->len); + g_return_if_fail(setting->driver.arr && idx < setting->driver.arr->len); - g_array_remove_index(setting->driver, idx); + g_array_remove_index(setting->driver.arr, idx); _notify(setting, PROP_DRIVER); } @@ -424,7 +426,7 @@ nm_setting_match_remove_driver_by_value(NMSettingMatch *setting, const char *dri g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), FALSE); g_return_val_if_fail(driver, FALSE); - if (nm_strvarray_remove_first(setting->driver, driver)) { + if (nm_strvarray_remove_first(setting->driver.arr, driver)) { _notify(setting, PROP_DRIVER); return TRUE; } @@ -445,8 +447,8 @@ nm_setting_match_clear_drivers(NMSettingMatch *setting) { g_return_if_fail(NM_IS_SETTING_MATCH(setting)); - if (nm_g_array_len(setting->driver) != 0) { - nm_clear_pointer(&setting->driver, g_array_unref); + if (nm_g_array_len(setting->driver.arr) != 0) { + nm_clear_pointer(&setting->driver.arr, g_array_unref); _notify(setting, PROP_DRIVER); } } @@ -467,7 +469,7 @@ nm_setting_match_get_drivers(NMSettingMatch *setting, guint *length) { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL); - return nm_strvarray_get_strv(&setting->driver, length); + return nm_strvarray_get_strv(&setting->driver.arr, length); } /*****************************************************************************/ @@ -485,7 +487,7 @@ nm_setting_match_get_num_paths(NMSettingMatch *setting) { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), 0); - return nm_g_array_len(setting->path); + return nm_g_array_len(setting->path.arr); } /** @@ -502,9 +504,9 @@ nm_setting_match_get_path(NMSettingMatch *setting, guint idx) { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL); - g_return_val_if_fail(setting->path && idx < setting->path->len, NULL); + g_return_val_if_fail(setting->path.arr && idx < setting->path.arr->len, NULL); - return nm_strvarray_get_idx(setting->path, idx); + return nm_strvarray_get_idx(setting->path.arr, idx); } /** @@ -522,7 +524,7 @@ nm_setting_match_add_path(NMSettingMatch *setting, const char *path) g_return_if_fail(NM_IS_SETTING_MATCH(setting)); g_return_if_fail(path); - nm_strvarray_add(nm_strvarray_ensure(&setting->path), path); + nm_strvarray_add(nm_strvarray_ensure(&setting->path.arr), path); _notify(setting, PROP_PATH); } @@ -540,9 +542,9 @@ nm_setting_match_remove_path(NMSettingMatch *setting, guint idx) { g_return_if_fail(NM_IS_SETTING_MATCH(setting)); - g_return_if_fail(setting->path && idx < setting->path->len); + g_return_if_fail(setting->path.arr && idx < setting->path.arr->len); - g_array_remove_index(setting->path, idx); + g_array_remove_index(setting->path.arr, idx); _notify(setting, PROP_PATH); } @@ -563,7 +565,7 @@ nm_setting_match_remove_path_by_value(NMSettingMatch *setting, const char *path) g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), FALSE); g_return_val_if_fail(path, FALSE); - if (nm_strvarray_remove_first(setting->path, path)) { + if (nm_strvarray_remove_first(setting->path.arr, path)) { _notify(setting, PROP_PATH); return TRUE; } @@ -584,8 +586,8 @@ nm_setting_match_clear_paths(NMSettingMatch *setting) { g_return_if_fail(NM_IS_SETTING_MATCH(setting)); - if (nm_g_array_len(setting->path) != 0) { - nm_clear_pointer(&setting->path, g_array_unref); + if (nm_g_array_len(setting->path.arr) != 0) { + nm_clear_pointer(&setting->path.arr, g_array_unref); _notify(setting, PROP_PATH); } } @@ -606,52 +608,7 @@ nm_setting_match_get_paths(NMSettingMatch *setting, guint *length) { g_return_val_if_fail(NM_IS_SETTING_MATCH(setting), NULL); - return nm_strvarray_get_strv(&setting->path, length); -} - -/*****************************************************************************/ - -static void -get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) -{ - NMSettingMatch *self = NM_SETTING_MATCH(object); - - switch (prop_id) { - case PROP_KERNEL_COMMAND_LINE: - g_value_take_boxed(value, - nm_strvarray_get_strv_non_empty_dup(self->kernel_command_line, NULL)); - break; - case PROP_DRIVER: - g_value_take_boxed(value, nm_strvarray_get_strv_non_empty_dup(self->driver, NULL)); - break; - case PROP_PATH: - g_value_take_boxed(value, nm_strvarray_get_strv_non_empty_dup(self->path, NULL)); - break; - default: - _nm_setting_property_get_property_direct(object, prop_id, value, pspec); - break; - } -} - -static void -set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - NMSettingMatch *self = NM_SETTING_MATCH(object); - - switch (prop_id) { - case PROP_KERNEL_COMMAND_LINE: - nm_strvarray_set_strv(&self->kernel_command_line, g_value_get_boxed(value)); - break; - case PROP_DRIVER: - nm_strvarray_set_strv(&self->driver, g_value_get_boxed(value)); - break; - case PROP_PATH: - nm_strvarray_set_strv(&self->path, g_value_get_boxed(value)); - break; - default: - _nm_setting_property_set_property_direct(object, prop_id, value, pspec); - break; - } + return nm_strvarray_get_strv(&setting->path.arr, length); } /*****************************************************************************/ @@ -710,9 +667,9 @@ verify(NMSetting *setting, NMConnection *connection, GError **error) } } - if (self->kernel_command_line) { - for (i = 0; i < self->kernel_command_line->len; i++) { - if (nm_str_is_empty(nm_strvarray_get_idx(self->kernel_command_line, i))) { + if (self->kernel_command_line.arr) { + for (i = 0; i < self->kernel_command_line.arr->len; i++) { + if (nm_str_is_empty(nm_strvarray_get_idx(self->kernel_command_line.arr, i))) { g_set_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, @@ -726,9 +683,9 @@ verify(NMSetting *setting, NMConnection *connection, GError **error) } } - if (self->driver) { - for (i = 0; i < self->driver->len; i++) { - if (nm_str_is_empty(nm_strvarray_get_idx(self->driver, i))) { + if (self->driver.arr) { + for (i = 0; i < self->driver.arr->len; i++) { + if (nm_str_is_empty(nm_strvarray_get_idx(self->driver.arr, i))) { g_set_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, @@ -742,9 +699,9 @@ verify(NMSetting *setting, NMConnection *connection, GError **error) } } - if (self->path) { - for (i = 0; i < self->path->len; i++) { - if (nm_str_is_empty(nm_strvarray_get_idx(self->path, i))) { + if (self->path.arr) { + for (i = 0; i < self->path.arr->len; i++) { + if (nm_str_is_empty(nm_strvarray_get_idx(self->path.arr, i))) { g_set_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, @@ -767,9 +724,9 @@ finalize(GObject *object) NMSettingMatch *self = NM_SETTING_MATCH(object); nm_clear_pointer(&self->interface_name.arr, g_array_unref); - nm_clear_pointer(&self->kernel_command_line, g_array_unref); - nm_clear_pointer(&self->driver, g_array_unref); - nm_clear_pointer(&self->path, g_array_unref); + nm_clear_pointer(&self->kernel_command_line.arr, g_array_unref); + nm_clear_pointer(&self->driver.arr, g_array_unref); + nm_clear_pointer(&self->path.arr, g_array_unref); G_OBJECT_CLASS(nm_setting_match_parent_class)->finalize(object); } @@ -781,8 +738,8 @@ nm_setting_match_class_init(NMSettingMatchClass *klass) NMSettingClass *setting_class = NM_SETTING_CLASS(klass); GArray *properties_override = _nm_sett_info_property_override_create_array(); - object_class->get_property = get_property; - object_class->set_property = set_property; + object_class->get_property = _nm_setting_property_get_property_direct; + object_class->set_property = _nm_setting_property_set_property_direct; object_class->finalize = finalize; setting_class->verify = verify; @@ -832,12 +789,13 @@ nm_setting_match_class_init(NMSettingMatchClass *klass) * * Since: 1.26 **/ - obj_properties[PROP_KERNEL_COMMAND_LINE] = g_param_spec_boxed( - NM_SETTING_MATCH_KERNEL_COMMAND_LINE, - "", - "", - G_TYPE_STRV, - NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + _nm_setting_property_define_direct_strv(properties_override, + obj_properties, + NM_SETTING_MATCH_KERNEL_COMMAND_LINE, + PROP_KERNEL_COMMAND_LINE, + NM_SETTING_PARAM_FUZZY_IGNORE, + NMSettingMatch, + kernel_command_line); /** * NMSettingMatch:driver @@ -850,12 +808,13 @@ nm_setting_match_class_init(NMSettingMatchClass *klass) * * Since: 1.26 **/ - obj_properties[PROP_DRIVER] = g_param_spec_boxed( - NM_SETTING_MATCH_DRIVER, - "", - "", - G_TYPE_STRV, - NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + _nm_setting_property_define_direct_strv(properties_override, + obj_properties, + NM_SETTING_MATCH_DRIVER, + PROP_DRIVER, + NM_SETTING_PARAM_FUZZY_IGNORE, + NMSettingMatch, + driver); /** * NMSettingMatch:path @@ -890,12 +849,13 @@ nm_setting_match_class_init(NMSettingMatchClass *klass) * example: MATCH_PATH="pci-0000:01:00.0 pci-0000:0c:00.0" * ---end--- */ - obj_properties[PROP_PATH] = g_param_spec_boxed(NM_SETTING_MATCH_PATH, - "", - "", - G_TYPE_STRV, - NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE - | G_PARAM_STATIC_STRINGS); + _nm_setting_property_define_direct_strv(properties_override, + obj_properties, + NM_SETTING_MATCH_PATH, + PROP_PATH, + NM_SETTING_PARAM_FUZZY_IGNORE, + NMSettingMatch, + path); g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c index d0f85a9f97..1856f6ad50 100644 --- a/src/libnm-core-impl/tests/test-general.c +++ b/src/libnm-core-impl/tests/test-general.c @@ -5060,7 +5060,7 @@ test_setting_connection_changed_signal(void) ASSERT_CHANGED(nm_setting_connection_add_secondary(s_con, uuid)); ASSERT_CHANGED(nm_setting_connection_remove_secondary(s_con, 0)); - NMTST_EXPECT_LIBNM_CRITICAL(NMTST_G_RETURN_MSG(idx < nm_g_array_len(priv->secondaries))); + NMTST_EXPECT_LIBNM_CRITICAL(NMTST_G_RETURN_MSG(idx < nm_g_array_len(priv->secondaries.arr))); ASSERT_UNCHANGED(nm_setting_connection_remove_secondary(s_con, 1)); g_test_assert_expected_messages(); From 20aa8d049ca1ac5074e491ab167e440115ddaaa7 Mon Sep 17 00:00:00 2001 From: Ana Cabral Date: Thu, 10 Feb 2022 09:08:45 +0100 Subject: [PATCH 063/118] keyfile: write ethernet group always on the top of the file --- src/libnm-core-impl/nm-keyfile-utils.c | 19 +++++++++++++++++++ src/libnm-core-impl/nm-keyfile.c | 18 ++++++++++++++---- src/libnm-core-intern/nm-keyfile-utils.h | 2 ++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/libnm-core-impl/nm-keyfile-utils.c b/src/libnm-core-impl/nm-keyfile-utils.c index 0e2e2d45b7..c599aefa7b 100644 --- a/src/libnm-core-impl/nm-keyfile-utils.c +++ b/src/libnm-core-impl/nm-keyfile-utils.c @@ -682,3 +682,22 @@ nm_keyfile_key_decode(const char *key, char **out_to_free) #endif return name; } + +void +nm_keyfile_add_group(GKeyFile *keyfile, const char *group) +{ + nm_assert(keyfile); + nm_assert(group); + + /* You can only call this function if the group doesn't exist yet. + * Because, we are about to add a dummy key, so we would have to + * be sure that the key doesn't exist. */ + nm_assert(!g_key_file_has_group(keyfile, group)); + + /* Ensure the group is present. + * There is no API for that, so add and remove a dummy key. + * For a profile it matters whether a setting is present or not, + * and we need to ensure that we persist the presence of the setting to keyfile*/ + g_key_file_set_value(keyfile, group, ".X", "1"); + g_key_file_remove_key(keyfile, group, ".X", NULL); +} diff --git a/src/libnm-core-impl/nm-keyfile.c b/src/libnm-core-impl/nm-keyfile.c index 4ff9b5827a..55d853a063 100644 --- a/src/libnm-core-impl/nm-keyfile.c +++ b/src/libnm-core-impl/nm-keyfile.c @@ -2305,8 +2305,21 @@ wired_s390_options_writer_full(KeyfileWriterInfo *info, { NMSettingWired *s_wired = NM_SETTING_WIRED(setting); guint i, n; + const char *setting_alias; n = nm_setting_wired_get_num_s390_options(s_wired); + if (n == 0) + return; + + setting_alias = nm_keyfile_plugin_get_alias_for_setting_name(NM_SETTING_WIRED_SETTING_NAME); + if (!g_key_file_has_group(info->keyfile, NM_SETTING_WIRED_SETTING_NAME) + && !g_key_file_has_group(info->keyfile, setting_alias)) { + /* groups in the keyfile are ordered. When we are about to add [ethernet-s390-options], + * we want to also have an [ethernet] group, first. */ + + nm_keyfile_add_group(info->keyfile, setting_alias ?: NM_SETTING_WIRED_SETTING_NAME); + } + for (i = 0; i < n; i++) { gs_free char *key_to_free = NULL; const char *opt_key; @@ -4190,10 +4203,7 @@ nm_keyfile_write(NMConnection *connection, || g_key_file_has_group(info.keyfile, setting_name)) { /* we have a section for the setting. Nothing to do. */ } else { - /* ensure the group is present. There is no API for that, so add and remove - * a dummy key. */ - g_key_file_set_value(info.keyfile, setting_alias ?: setting_name, ".X", "1"); - g_key_file_remove_key(info.keyfile, setting_alias ?: setting_name, ".X", NULL); + nm_keyfile_add_group(info.keyfile, setting_alias ?: setting_name); } if (NM_IS_SETTING_WIREGUARD(setting)) { diff --git a/src/libnm-core-intern/nm-keyfile-utils.h b/src/libnm-core-intern/nm-keyfile-utils.h index 45741646b7..f79f020f67 100644 --- a/src/libnm-core-intern/nm-keyfile-utils.h +++ b/src/libnm-core-intern/nm-keyfile-utils.h @@ -92,4 +92,6 @@ const char *nm_keyfile_key_encode(const char *name, char **out_to_free); const char *nm_keyfile_key_decode(const char *key, char **out_to_free); +void nm_keyfile_add_group(GKeyFile *keyfile, const char *group); + #endif /* __NM_KEYFILE_UTILS_H__ */ From 27c33d15efdf974a085590aa4077ab76862c1854 Mon Sep 17 00:00:00 2001 From: Ana Cabral Date: Wed, 9 Feb 2022 17:55:59 +0100 Subject: [PATCH 064/118] keyfile: do not write empty string list properties https://bugzilla.redhat.com/show_bug.cgi?id=2022623 --- src/libnm-core-impl/nm-keyfile.c | 115 +++++++++++++---------- src/libnm-core-impl/tests/test-setting.c | 18 ---- 2 files changed, 63 insertions(+), 70 deletions(-) diff --git a/src/libnm-core-impl/nm-keyfile.c b/src/libnm-core-impl/nm-keyfile.c index 55d853a063..dce53ae27e 100644 --- a/src/libnm-core-impl/nm-keyfile.c +++ b/src/libnm-core-impl/nm-keyfile.c @@ -2768,6 +2768,11 @@ struct _ParseInfoProperty { * default value. By setting this flag to TRUE, also * default values are written. */ bool writer_persist_default : 1; + + /* This flag indicates that the property should always + * be written to keyfile, even if it's the default. + * This is currently only implemented for STRV properties. */ + bool always_write : 1; }; #define PARSE_INFO_PROPERTY(_property_name, ...) \ @@ -2869,53 +2874,57 @@ static const ParseInfoSetting *const parse_infos[_NM_META_SETTING_TYPE_NUM] = { NM_META_SETTING_TYPE_INFINIBAND, PARSE_INFO_PROPERTIES(PARSE_INFO_PROPERTY(NM_SETTING_INFINIBAND_MAC_ADDRESS, .parser = mac_address_parser_INFINIBAND, ), ), ), - PARSE_INFO_SETTING(NM_META_SETTING_TYPE_IP4_CONFIG, - PARSE_INFO_PROPERTIES( - PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ADDRESSES, - .parser_no_check_key = TRUE, - .parser = ip_address_or_route_parser, - .writer = addr_writer, ), - PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS, - .parser_no_check_key = TRUE, - .parser = ip_dns_parser, - .writer = dns_writer, ), - PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_GATEWAY, .writer_skip = TRUE, ), - PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTES, - .parser_no_check_key = TRUE, - .parser = ip_address_or_route_parser, - .writer = route_writer, ), - PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTING_RULES, - .parser_no_check_key = TRUE, - .parser_full = ip_routing_rule_parser_full, - .writer_full = ip_routing_rule_writer_full, - .has_parser_full = TRUE, - .has_writer_full = TRUE, ), ), ), - PARSE_INFO_SETTING(NM_META_SETTING_TYPE_IP6_CONFIG, - PARSE_INFO_PROPERTIES( - PARSE_INFO_PROPERTY(NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE, - .parser_no_check_key = TRUE, - .parser = ip6_addr_gen_mode_parser, - .writer = ip6_addr_gen_mode_writer, - .writer_persist_default = TRUE, ), - PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ADDRESSES, - .parser_no_check_key = TRUE, - .parser = ip_address_or_route_parser, - .writer = addr_writer, ), - PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS, - .parser_no_check_key = TRUE, - .parser = ip_dns_parser, - .writer = dns_writer, ), - PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_GATEWAY, .writer_skip = TRUE, ), - PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTES, - .parser_no_check_key = TRUE, - .parser = ip_address_or_route_parser, - .writer = route_writer, ), - PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTING_RULES, - .parser_no_check_key = TRUE, - .parser_full = ip_routing_rule_parser_full, - .writer_full = ip_routing_rule_writer_full, - .has_parser_full = TRUE, - .has_writer_full = TRUE, ), ), ), + PARSE_INFO_SETTING( + NM_META_SETTING_TYPE_IP4_CONFIG, + PARSE_INFO_PROPERTIES( + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ADDRESSES, + .parser_no_check_key = TRUE, + .parser = ip_address_or_route_parser, + .writer = addr_writer, ), + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS, + .parser_no_check_key = TRUE, + .parser = ip_dns_parser, + .writer = dns_writer, ), + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS_OPTIONS, .always_write = TRUE, ), + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_GATEWAY, .writer_skip = TRUE, ), + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTES, + .parser_no_check_key = TRUE, + .parser = ip_address_or_route_parser, + .writer = route_writer, ), + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTING_RULES, + .parser_no_check_key = TRUE, + .parser_full = ip_routing_rule_parser_full, + .writer_full = ip_routing_rule_writer_full, + .has_parser_full = TRUE, + .has_writer_full = TRUE, ), ), ), + PARSE_INFO_SETTING( + NM_META_SETTING_TYPE_IP6_CONFIG, + PARSE_INFO_PROPERTIES( + PARSE_INFO_PROPERTY(NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE, + .parser_no_check_key = TRUE, + .parser = ip6_addr_gen_mode_parser, + .writer = ip6_addr_gen_mode_writer, + .writer_persist_default = TRUE, ), + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ADDRESSES, + .parser_no_check_key = TRUE, + .parser = ip_address_or_route_parser, + .writer = addr_writer, ), + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS, + .parser_no_check_key = TRUE, + .parser = ip_dns_parser, + .writer = dns_writer, ), + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_DNS_OPTIONS, .always_write = TRUE, ), + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_GATEWAY, .writer_skip = TRUE, ), + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTES, + .parser_no_check_key = TRUE, + .parser = ip_address_or_route_parser, + .writer = route_writer, ), + PARSE_INFO_PROPERTY(NM_SETTING_IP_CONFIG_ROUTING_RULES, + .parser_no_check_key = TRUE, + .parser_full = ip_routing_rule_parser_full, + .writer_full = ip_routing_rule_writer_full, + .has_parser_full = TRUE, + .has_writer_full = TRUE, ), ), ), PARSE_INFO_SETTING( NM_META_SETTING_TYPE_OVS_EXTERNAL_IDS, PARSE_INFO_PROPERTIES(PARSE_INFO_PROPERTY(NM_SETTING_OVS_EXTERNAL_IDS_DATA, @@ -3949,11 +3958,13 @@ write_setting_value(KeyfileWriterInfo *info, char **array; array = (char **) g_value_get_boxed(&value); - nm_keyfile_plugin_kf_set_string_list(info->keyfile, - setting_info->setting_name, - key, - (const char **const) array, - g_strv_length(array)); + if ((g_strv_length(array) != 0) || (pip && pip->always_write)) { + nm_keyfile_plugin_kf_set_string_list(info->keyfile, + setting_info->setting_name, + key, + (const char **const) array, + g_strv_length(array)); + } } else if (type == G_TYPE_HASH_TABLE) { write_hash_of_string(info->keyfile, setting, key, &value); } else if (type == G_TYPE_ARRAY) { diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c index 8e8d1a89e1..490196a69b 100644 --- a/src/libnm-core-impl/tests/test-setting.c +++ b/src/libnm-core-impl/tests/test-setting.c @@ -3587,20 +3587,16 @@ test_roundtrip_conversion(gconstpointer test_data) "uuid=%s\n" "type=ethernet\n" "interface-name=%s\n" - "permissions=\n" "\n" "[ethernet]\n" - "mac-address-blacklist=\n" "%s" /* mtu */ "\n" "%s" /* [ethernet-s390-options] */ "[ipv4]\n" - "dns-search=\n" "method=auto\n" "\n" "[ipv6]\n" "addr-gen-mode=stable-privacy\n" - "dns-search=\n" "method=auto\n" "\n" "[proxy]\n" @@ -3618,20 +3614,16 @@ test_roundtrip_conversion(gconstpointer test_data) "uuid=%s\n" "type=ethernet\n" "interface-name=%s\n" - "permissions=\n" "\n" "[ethernet]\n" - "mac-address-blacklist=\n" "%s" /* mtu */ "\n" "%s" /* [ethernet-s390-options] */ "[ipv4]\n" - "dns-search=\n" "method=auto\n" "\n" "[ipv6]\n" "addr-gen-mode=stable-privacy\n" - "dns-search=\n" "method=auto\n" "", ID, @@ -3661,17 +3653,14 @@ test_roundtrip_conversion(gconstpointer test_data) "uuid=%s\n" "type=wireguard\n" "interface-name=%s\n" - "permissions=\n" "\n" "[wireguard]\n" "\n" "[ipv4]\n" - "dns-search=\n" "method=disabled\n" "\n" "[ipv6]\n" "addr-gen-mode=stable-privacy\n" - "dns-search=\n" "method=disabled\n" "\n" "[proxy]\n" @@ -3713,7 +3702,6 @@ test_roundtrip_conversion(gconstpointer test_data) "uuid=%s\n" "type=wireguard\n" "interface-name=%s\n" - "permissions=\n" "\n" "[wireguard]\n" "%s" /* fwmark */ @@ -3723,12 +3711,10 @@ test_roundtrip_conversion(gconstpointer test_data) "%s" /* [wireguard-peers*] */ "\n" "[ipv4]\n" - "dns-search=\n" "method=disabled\n" "\n" "[ipv6]\n" "addr-gen-mode=stable-privacy\n" - "dns-search=\n" "method=disabled\n" "\n" "[proxy]\n" @@ -3798,14 +3784,11 @@ test_roundtrip_conversion(gconstpointer test_data) "uuid=%s\n" "type=ethernet\n" "interface-name=%s\n" - "permissions=\n" "\n" "[ethernet]\n" - "mac-address-blacklist=\n" "%s" /* mtu */ "\n" "[ipv4]\n" - "dns-search=\n" "method=auto\n" "routing-rule1=priority 1 from 0.0.0.0/0 table 1000\n" "routing-rule2=priority 2 from 192.168.1.0/25 table 1001\n" @@ -3813,7 +3796,6 @@ test_roundtrip_conversion(gconstpointer test_data) "\n" "[ipv6]\n" "addr-gen-mode=stable-privacy\n" - "dns-search=\n" "method=auto\n" "routing-rule1=priority 1 from ::/0 table 1000\n" "routing-rule2=priority 2 from 1:2:3:b::/65 table 1001\n" From 164840a33c486f320946bdd229599f96c148ae1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigurd=20R=C3=B8nningen=20Jenssen?= Date: Mon, 14 Feb 2022 08:18:25 +0000 Subject: [PATCH 065/118] libnmc: fix typo in passwd-file example https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1096 --- src/libnmc-base/nm-client-utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libnmc-base/nm-client-utils.c b/src/libnmc-base/nm-client-utils.c index 01b3df327d..e2ed7fc287 100644 --- a/src/libnmc-base/nm-client-utils.c +++ b/src/libnmc-base/nm-client-utils.c @@ -732,7 +732,7 @@ nmc_print_qrcode(const char *str) * Example of @passwd_file contents: * wifi.psk:tajne heslo * 802-1x.password:krakonos - * 802-11-wireless-security:leap-password:my leap password + * 802-11-wireless-security.leap-password:my leap password * * Returns: (transfer full): hash table with parsed passwords, or %NULL on an error */ From 95e6a0a6e253dfdcd77ebc65d629fb3789f5f0e3 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 14 Feb 2022 16:57:53 +0100 Subject: [PATCH 066/118] examples/python: avoid Python2 "print" statement Recent python-black (22.0) dropped support for Python 2 and thus fail for those files. Make the examples Python3 compatible. --- examples/python/gi/dns.py | 14 +++++------ examples/python/gi/get-devices.py | 30 ++++++++++++++---------- examples/python/gi/get-lldp-neighbors.py | 6 ++--- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/examples/python/gi/dns.py b/examples/python/gi/dns.py index 6b42a339e0..483fe25f7d 100755 --- a/examples/python/gi/dns.py +++ b/examples/python/gi/dns.py @@ -15,23 +15,23 @@ main_loop = None def handle_config(config): - print " ---- new configuration ----" + print(" ---- new configuration ----") for entry in config: - print " * servers: %s" % ", ".join(map(str, entry.get_nameservers())) + print(" * servers: %s" % ", ".join(map(str, entry.get_nameservers()))) domains = entry.get_domains() if domains and domains[0]: - print " domains: %s" % ", ".join(map(str, domains)) + print(" domains: %s" % ", ".join(map(str, domains))) if entry.get_interface(): - print " interface: %s" % entry.get_interface() + print(" interface: %s" % entry.get_interface()) - print " priority: %d" % entry.get_priority() + print(" priority: %d" % entry.get_priority()) if entry.get_vpn(): - print " vpn: yes" + print(" vpn: yes") - print "" + print("") def dns_config_changed(self, property): diff --git a/examples/python/gi/get-devices.py b/examples/python/gi/get-devices.py index 5d753d80bb..43fd934372 100755 --- a/examples/python/gi/get-devices.py +++ b/examples/python/gi/get-devices.py @@ -15,22 +15,28 @@ if __name__ == "__main__": client = NM.Client.new(None) devices = client.get_all_devices() - print "Real devices" - print "------------" + print("Real devices") + print("------------") for d in devices: if d.is_real(): - print "%s (%s): %s" % ( - d.get_iface(), - d.get_type_description(), - d.get_state(), + print( + "%s (%s): %s" + % ( + d.get_iface(), + d.get_type_description(), + d.get_state(), + ) ) - print "\nUnrealized/placeholder devices" - print "------------------------------" + print("\nUnrealized/placeholder devices") + print("------------------------------") for d in devices: if not d.is_real(): - print "%s (%s): %s" % ( - d.get_iface(), - d.get_type_description(), - d.get_state(), + print( + "%s (%s): %s" + % ( + d.get_iface(), + d.get_type_description(), + d.get_state(), + ) ) diff --git a/examples/python/gi/get-lldp-neighbors.py b/examples/python/gi/get-lldp-neighbors.py index f5ae83006e..2907dfa475 100755 --- a/examples/python/gi/get-lldp-neighbors.py +++ b/examples/python/gi/get-lldp-neighbors.py @@ -28,12 +28,12 @@ if __name__ == "__main__": for neighbor in neighbors: ret, chassis = neighbor.get_attr_string_value("chassis-id") ret, port = neighbor.get_attr_string_value("port-id") - print "Neighbor: %s - %s" % (chassis, port) + print("Neighbor: %s - %s" % (chassis, port)) for attr in neighbor.get_attr_names(): attr_type = neighbor.get_attr_type(attr) if attr_type.equal(GLib.VariantType.new("s")): ret, value = neighbor.get_attr_string_value(attr) - print " %-32s: %s" % (attr, value) + print(" %-32s: %s" % (attr, value)) elif attr_type.equal(GLib.VariantType.new("u")): ret, value = neighbor.get_attr_uint_value(attr) - print " %-32s: %u" % (attr, value) + print(" %-32s: %u" % (attr, value)) From a4bc4f63db377c55218a8661b747b0d534c274f2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 14 Feb 2022 10:00:36 +0100 Subject: [PATCH 067/118] gitlab-ci: regenerate ci-templates's containers --- .gitlab-ci.yml | 10 +++++----- .gitlab-ci/config.yml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e00df3d1e3..add0845015 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -47,11 +47,11 @@ variables: # # This is done by running `ci-fairy generate-template` and possibly bump # ".default_tag". - FEDORA_TAG: '2021-11-09.0-9dd1e1db773a' - UBUNTU_TAG: '2021-11-09.0-577176f5eb6c' - DEBIAN_TAG: '2021-11-09.0-577176f5eb6c' - CENTOS_TAG: '2021-11-09.0-9dd1e1db773a' - ALPINE_TAG: '2021-11-09.0-a28badea28eb' + FEDORA_TAG: '2022-02-14.0-3804e9403f0c' + UBUNTU_TAG: '2022-02-14.0-747f2537c589' + DEBIAN_TAG: '2022-02-14.0-747f2537c589' + CENTOS_TAG: '2022-02-14.0-3804e9403f0c' + ALPINE_TAG: '2022-02-14.0-8d613ac1d9fd' FEDORA_EXEC: 'bash .gitlab-ci/fedora-install.sh' UBUNTU_EXEC: 'bash .gitlab-ci/debian-install.sh' diff --git a/.gitlab-ci/config.yml b/.gitlab-ci/config.yml index eb96ce18e8..6acf09b855 100644 --- a/.gitlab-ci/config.yml +++ b/.gitlab-ci/config.yml @@ -8,7 +8,7 @@ # # We're happy to rebuild all containers when one changes. -.default_tag: &default_tag '2021-11-09.0' +.default_tag: &default_tag '2022-02-14.0' # The list of all distributions we want to create job for. From b2d2b8d6fa05e6911c3a7599b35e38e149ddf873 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 14 Feb 2022 17:13:21 +0100 Subject: [PATCH 068/118] gitlab-ci: disable CentOS 8 Linux containers CentOS 8 Linux is end of life. That wouldn't bother us, but when you start such a container $ podman run -ti --privileged quay.io/centos/centos:8.3.2011 then `dnf upgrade` will fail, because the mirror list returns nothing. To work around that, we need to adjust ci-templates ([1]). The work around might be to patch /etc/yum.repos.d when creating the container image ([2]). For now (or maybe indefinitely) disable these build targets. [1] https://gitlab.freedesktop.org/freedesktop/ci-templates/-/merge_requests/131 [2] https://stackoverflow.com/questions/70926799/centos-through-vm-no-urls-in-mirrorlist --- .gitlab-ci.yml | 100 +++--------------------------------------- .gitlab-ci/config.yml | 3 -- 2 files changed, 5 insertions(+), 98 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index add0845015..51ce0dc604 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -47,11 +47,11 @@ variables: # # This is done by running `ci-fairy generate-template` and possibly bump # ".default_tag". - FEDORA_TAG: '2022-02-14.0-3804e9403f0c' - UBUNTU_TAG: '2022-02-14.0-747f2537c589' - DEBIAN_TAG: '2022-02-14.0-747f2537c589' - CENTOS_TAG: '2022-02-14.0-3804e9403f0c' - ALPINE_TAG: '2022-02-14.0-8d613ac1d9fd' + FEDORA_TAG: '2022-02-14.0-8384452eb54e' + UBUNTU_TAG: '2022-02-14.0-bd3c060f94c2' + DEBIAN_TAG: '2022-02-14.0-bd3c060f94c2' + CENTOS_TAG: '2022-02-14.0-8384452eb54e' + ALPINE_TAG: '2022-02-14.0-0990abecb69f' FEDORA_EXEC: 'bash .gitlab-ci/fedora-install.sh' UBUNTU_EXEC: 'bash .gitlab-ci/debian-install.sh' @@ -304,36 +304,6 @@ centos:7.9.2009@container-prep: FDO_DISTRIBUTION_TAG: $CENTOS_TAG FDO_DISTRIBUTION_EXEC: $CENTOS_EXEC -centos:8.1.1911@container-prep: - extends: - - .fdo.container-build@centos - stage: prep - variables: - GIT_STRATEGY: none - FDO_DISTRIBUTION_VERSION: '8.1.1911' - FDO_DISTRIBUTION_TAG: $CENTOS_TAG - FDO_DISTRIBUTION_EXEC: $CENTOS_EXEC - -centos:8.2.2004@container-prep: - extends: - - .fdo.container-build@centos - stage: prep - variables: - GIT_STRATEGY: none - FDO_DISTRIBUTION_VERSION: '8.2.2004' - FDO_DISTRIBUTION_TAG: $CENTOS_TAG - FDO_DISTRIBUTION_EXEC: $CENTOS_EXEC - -centos:8.3.2011@container-prep: - extends: - - .fdo.container-build@centos - stage: prep - variables: - GIT_STRATEGY: none - FDO_DISTRIBUTION_VERSION: '8.3.2011' - FDO_DISTRIBUTION_TAG: $CENTOS_TAG - FDO_DISTRIBUTION_EXEC: $CENTOS_EXEC - alpine:latest@container-prep: extends: - .fdo.container-build@alpine @@ -576,33 +546,6 @@ centos:7.9.2009@container-clean: FDO_DISTRIBUTION_VERSION: '7.9.2009' FDO_DISTRIBUTION_TAG: $CENTOS_TAG -centos:8.1.1911@container-clean: - extends: - - .container-clean - variables: - GIT_STRATEGY: none - CURRENT_CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/centos/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG - FDO_DISTRIBUTION_VERSION: '8.1.1911' - FDO_DISTRIBUTION_TAG: $CENTOS_TAG - -centos:8.2.2004@container-clean: - extends: - - .container-clean - variables: - GIT_STRATEGY: none - CURRENT_CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/centos/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG - FDO_DISTRIBUTION_VERSION: '8.2.2004' - FDO_DISTRIBUTION_TAG: $CENTOS_TAG - -centos:8.3.2011@container-clean: - extends: - - .container-clean - variables: - GIT_STRATEGY: none - CURRENT_CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/centos/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG - FDO_DISTRIBUTION_VERSION: '8.3.2011' - FDO_DISTRIBUTION_TAG: $CENTOS_TAG - alpine:latest@container-clean: extends: - .container-clean @@ -874,39 +817,6 @@ t_centos:7.9.2009: - "centos:7.9.2009@container-prep" when: manual -t_centos:8.1.1911: - extends: - - .build@template - - .fdo.distribution-image@centos - variables: - FDO_DISTRIBUTION_VERSION: '8.1.1911' - FDO_DISTRIBUTION_TAG: $CENTOS_TAG - needs: - - "centos:8.1.1911@container-prep" - when: manual - -t_centos:8.2.2004: - extends: - - .build@template - - .fdo.distribution-image@centos - variables: - FDO_DISTRIBUTION_VERSION: '8.2.2004' - FDO_DISTRIBUTION_TAG: $CENTOS_TAG - needs: - - "centos:8.2.2004@container-prep" - when: manual - -t_centos:8.3.2011: - extends: - - .build@template - - .fdo.distribution-image@centos - variables: - FDO_DISTRIBUTION_VERSION: '8.3.2011' - FDO_DISTRIBUTION_TAG: $CENTOS_TAG - needs: - - "centos:8.3.2011@container-prep" - when: manual - t_alpine:latest: extends: - .build@template diff --git a/.gitlab-ci/config.yml b/.gitlab-ci/config.yml index 6acf09b855..c1a442ad6b 100644 --- a/.gitlab-ci/config.yml +++ b/.gitlab-ci/config.yml @@ -52,9 +52,6 @@ distributions: - '7.7.1908' - '7.8.2003' - '7.9.2009' - - '8.1.1911' - - '8.2.2004' - - '8.3.2011' - name: alpine tag: *default_tag base_type: alpine From 67ad9a62b1333158951588ddc46b5953ed631b92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jard=C3=B3n?= Date: Mon, 12 Jul 2021 22:39:56 +0100 Subject: [PATCH 069/118] po: remove ar.po translations There is actually not translation output from this at the moment This, while is not generally a problem is triggering an issue with gettext, see https://lists.gnu.org/archive/html/bug-gettext/2019-05/msg00125.html While the fix is already in gettext upstream, I think is ok to remove this translation file for now as it doesn't produce any valid translation at the moment anyway https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1094#note_1258564 --- po/LINGUAS | 1 - po/ar.po | 12838 --------------------------------------------------- 2 files changed, 12839 deletions(-) delete mode 100644 po/ar.po diff --git a/po/LINGUAS b/po/LINGUAS index 3195e69539..2648c19fc0 100644 --- a/po/LINGUAS +++ b/po/LINGUAS @@ -1,6 +1,5 @@ # please keep this list sorted alphabetically # -ar as be@latin bg diff --git a/po/ar.po b/po/ar.po deleted file mode 100644 index 29b8db55a0..0000000000 --- a/po/ar.po +++ /dev/null @@ -1,12838 +0,0 @@ -# translation of NetworkManager.HEAD.ar.po to Arabic -# Arabic translations for PACKAGE package. -# Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Automatically generated, 2006. -# Khaled Hosny , 2007. -# Lubomir Rintel , 2016. #zanata -# Lubomir Rintel , 2017. #zanata -# Thomas Haller , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-01 17:17+0200\n" -"PO-Revision-Date: 2017-04-21 05:04-0400\n" -"Last-Translator: Copied by Zanata \n" -"Language-Team: Arabic \n" -"Language: ar\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : n>=3 && " -"n<=10 ? 2 : 3\n" -"X-Poedit-Language: Arabic\n" -"X-Generator: Zanata 3.9.6\n" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:1 -msgid "Enable or disable system networking" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:2 -msgid "System policy prevents enabling or disabling system networking" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:3 -msgid "Reload NetworkManager configuration" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:4 -msgid "System policy prevents reloading NetworkManager" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:5 -msgid "" -"Put NetworkManager to sleep or wake it up (should only be used by system " -"power management)" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:6 -msgid "System policy prevents putting NetworkManager to sleep or waking it up" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:7 -msgid "Enable or disable Wi-Fi devices" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:8 -msgid "System policy prevents enabling or disabling Wi-Fi devices" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:9 -msgid "Enable or disable mobile broadband devices" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:10 -msgid "System policy prevents enabling or disabling mobile broadband devices" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:11 -msgid "Enable or disable WiMAX mobile broadband devices" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:12 -msgid "" -"System policy prevents enabling or disabling WiMAX mobile broadband devices" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:13 -msgid "Allow control of network connections" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:14 -msgid "System policy prevents control of network connections" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:15 -msgid "Allow control of Wi-Fi scans" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:16 -msgid "System policy prevents Wi-Fi scans" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:17 -msgid "Connection sharing via a protected Wi-Fi network" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:18 -msgid "" -"System policy prevents sharing connections via a protected Wi-Fi network" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:19 -msgid "Connection sharing via an open Wi-Fi network" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:20 -msgid "System policy prevents sharing connections via an open Wi-Fi network" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:21 -#, fuzzy -msgid "Modify personal network connections" -msgstr "أضف اتصال VPN جديد" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:22 -msgid "System policy prevents modification of personal network settings" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:23 -msgid "Modify network connections for all users" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:24 -msgid "System policy prevents modification of network settings for all users" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:25 -msgid "Modify persistent system hostname" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:26 -msgid "System policy prevents modification of the persistent system hostname" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:27 -msgid "Modify persistent global DNS configuration" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:28 -msgid "" -"System policy prevents modification of the persistent global DNS " -"configuration" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:29 -msgid "Perform a checkpoint or rollback of interfaces configuration" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:30 -msgid "System policy prevents the creation of a checkpoint or its rollback" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:31 -msgid "Enable or disable device statistics" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:32 -msgid "System policy prevents enabling or disabling device statistics" -msgstr "" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:33 -#, fuzzy -msgid "Enable or disable connectivity checking" -msgstr "حذف اتصال VPN \"%s\"؟" - -#: ../data/org.freedesktop.NetworkManager.policy.in.in.h:34 -msgid "System policy prevents enabling or disabling connectivity checking" -msgstr "" - -#. TRANSLATORS: the first %s is a prefix for the connection id, such -#. * as "Wired Connection" or "VPN Connection". The %d is a number -#. * that is combined with the first argument to create a unique -#. * connection id. -#: ../src/core/NetworkManagerUtils.c:113 -#, c-format -msgctxt "connection id fallback" -msgid "%s %u" -msgstr "" - -#: ../src/core/devices/adsl/nm-device-adsl.c:117 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:8080 -#, fuzzy -msgid "ADSL connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/bluetooth/nm-bluez-manager.c:1327 -#, c-format -msgid "%s Network" -msgstr "" - -#: ../src/core/devices/bluetooth/nm-device-bt.c:301 -msgid "PAN requested, but Bluetooth device does not support NAP" -msgstr "" - -#: ../src/core/devices/bluetooth/nm-device-bt.c:314 -msgid "PAN connections cannot specify GSM, CDMA, or serial settings" -msgstr "" - -#: ../src/core/devices/bluetooth/nm-device-bt.c:329 -#, fuzzy -msgid "PAN connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/bluetooth/nm-device-bt.c:336 -msgid "DUN requested, but Bluetooth device does not support DUN" -msgstr "" - -#: ../src/core/devices/bluetooth/nm-device-bt.c:349 -msgid "DUN connection must include a GSM or CDMA setting" -msgstr "" - -#: ../src/core/devices/bluetooth/nm-device-bt.c:360 -#: ../src/core/devices/wwan/nm-modem-broadband.c:821 -#, fuzzy -msgid "GSM connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/bluetooth/nm-device-bt.c:362 -#: ../src/core/devices/wwan/nm-modem-broadband.c:846 -#, fuzzy -msgid "CDMA connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/bluetooth/nm-device-bt.c:370 -msgid "Unknown/unhandled Bluetooth connection type" -msgstr "" - -#: ../src/core/devices/bluetooth/nm-device-bt.c:395 -msgid "connection does not match device" -msgstr "" - -#: ../src/core/devices/nm-device-6lowpan.c:190 -#, fuzzy -msgid "6LOWPAN connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/nm-device-bond.c:89 -#, fuzzy -msgid "Bond connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/nm-device-bridge.c:155 -#, fuzzy -msgid "Bridge connection" -msgstr "أضف اتصال VPN جديد" - -#: ../src/core/devices/nm-device-dummy.c:58 -#, fuzzy -msgid "Dummy connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/nm-device-ethernet-utils.c:20 -#, fuzzy, c-format -msgid "Wired connection %d" -msgstr "حذف اتصال VPN \"%s\"؟" - -#: ../src/core/devices/nm-device-ethernet.c:1614 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:8117 -#, fuzzy -msgid "Veth connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/nm-device-ethernet.c:1680 -#, fuzzy -msgid "PPPoE connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/nm-device-ethernet.c:1680 -#, fuzzy -msgid "Wired connection" -msgstr "انشيء اتصال VPN" - -#: ../src/core/devices/nm-device-infiniband.c:161 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:8093 -#, fuzzy -msgid "InfiniBand connection" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/core/devices/nm-device-ip-tunnel.c:399 -#, fuzzy -msgid "IP tunnel connection" -msgstr "أضف اتصال VPN جديد" - -#: ../src/core/devices/nm-device-macvlan.c:389 -#, fuzzy -msgid "MACVLAN connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/nm-device-tun.c:144 -#, fuzzy -msgid "TUN connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/nm-device-vlan.c:401 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:8118 -#, fuzzy -msgid "VLAN connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/nm-device-vrf.c:181 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:8120 -#, fuzzy -msgid "VRF connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/nm-device-vxlan.c:382 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:8121 -#, fuzzy -msgid "VXLAN connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/nm-device-wpan.c:54 -#, fuzzy -msgid "WPAN connection" -msgstr "إتّصالات VPN" - -#: ../src/core/devices/team/nm-device-team.c:88 -#, fuzzy -msgid "Team connection" -msgstr "انشيء اتصال VPN" - -#: ../src/core/devices/wifi/nm-device-olpc-mesh.c:115 -#: ../src/nmcli/devices.c:1352 -msgid "Mesh" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:32 -#, c-format -msgid "%s is incompatible with static WEP keys" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:67 -msgid "LEAP authentication requires a LEAP username" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:79 -msgid "LEAP username requires 'leap' authentication" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:94 -msgid "LEAP authentication requires IEEE 802.1x key management" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:116 -msgid "LEAP authentication is incompatible with Ad-Hoc mode" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:128 -msgid "LEAP authentication is incompatible with 802.1x setting" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:148 -#, c-format -msgid "a connection using '%s' authentication cannot use WPA key management" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:161 -#, c-format -msgid "a connection using '%s' authentication cannot specify WPA protocols" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:179 -#: ../src/core/devices/wifi/nm-wifi-utils.c:198 -#, c-format -msgid "a connection using '%s' authentication cannot specify WPA ciphers" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:212 -#, c-format -msgid "a connection using '%s' authentication cannot specify a WPA password" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:245 -msgid "Dynamic WEP requires an 802.1x setting" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:255 -#: ../src/core/devices/wifi/nm-wifi-utils.c:287 -msgid "Dynamic WEP requires 'open' authentication" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:272 -msgid "Dynamic WEP requires 'ieee8021x' key management" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:323 -msgid "WPA-PSK authentication is incompatible with 802.1x" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:333 -msgid "WPA-PSK requires 'open' authentication" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:347 -msgid "Access point does not support PSK but setting requires it" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:362 -msgid "WPA Ad-Hoc authentication requires 'rsn' protocol" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:375 -msgid "WPA Ad-Hoc authentication requires 'ccmp' pairwise cipher" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:388 -msgid "WPA Ad-Hoc requires 'ccmp' group cipher" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:419 -msgid "WPA-EAP authentication requires an 802.1x setting" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:429 -msgid "WPA-EAP requires 'open' authentication" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:442 -msgid "802.1x setting requires 'wpa-eap' key management" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:456 -msgid "Access point does not support 802.1x but setting requires it" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:486 -msgid "Ad-Hoc mode requires 'none' or 'wpa-psk' key management" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:498 -msgid "Ad-Hoc mode is incompatible with 802.1x security" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:507 -msgid "Ad-Hoc mode is incompatible with LEAP security" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:519 -msgid "Ad-Hoc mode requires 'open' authentication" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:563 -#: ../src/core/devices/wifi/nm-wifi-utils.c:598 -#, c-format -msgid "connection does not match access point" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:652 -#, fuzzy, c-format -msgid "connection does not match mesh point" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:671 -msgid "Access point is unencrypted but setting specifies security" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:762 -msgid "" -"WPA authentication is incompatible with non-EAP (original) LEAP or Dynamic " -"WEP" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:775 -msgid "WPA authentication is incompatible with Shared Key authentication" -msgstr "" - -#: ../src/core/devices/wifi/nm-wifi-utils.c:866 -msgid "Failed to determine AP security information" -msgstr "" - -#: ../src/core/dhcp/nm-dhcp-dhclient-utils.c:317 -msgid "# Created by NetworkManager\n" -msgstr "" - -#: ../src/core/dhcp/nm-dhcp-dhclient-utils.c:330 -#, c-format -msgid "" -"# Merged from %s\n" -"\n" -msgstr "" - -#: ../src/core/main-utils.c:87 -#, c-format -msgid "Opening %s failed: %s\n" -msgstr "" - -#: ../src/core/main-utils.c:94 -#, c-format -msgid "Writing to %s failed: %s\n" -msgstr "" - -#: ../src/core/main-utils.c:100 -#, c-format -msgid "Closing %s failed: %s\n" -msgstr "" - -#: ../src/core/main-utils.c:140 ../src/core/main-utils.c:152 -#, c-format -msgid "Cannot create '%s': %s" -msgstr "" - -#: ../src/core/main-utils.c:207 -#, c-format -msgid "%s is already running (pid %ld)\n" -msgstr "" - -#: ../src/core/main-utils.c:217 -#, c-format -msgid "You must be root to run %s!\n" -msgstr "" - -#: ../src/core/main-utils.c:284 ../src/core/main.c:375 -#: ../src/core/nm-iface-helper.c:585 -#, fuzzy, c-format -msgid "%s. Please use --help to see a list of valid options.\n" -msgstr "خيار غير صحيح. استعمل --help لعرض قائمة الخيارات الممكنة.\n" - -#: ../src/core/main.c:164 ../src/core/main.c:385 -#, c-format -msgid "Failed to read configuration: %s\n" -msgstr "" - -#: ../src/core/main.c:191 ../src/core/nm-iface-helper.c:406 -msgid "Print NetworkManager version and exit" -msgstr "" - -#: ../src/core/main.c:198 ../src/core/nm-iface-helper.c:413 -msgid "Don't become a daemon" -msgstr "" - -#: ../src/core/main.c:205 ../src/core/nm-iface-helper.c:427 -#, c-format -msgid "Log level: one of [%s]" -msgstr "" - -#: ../src/core/main.c:212 ../src/core/nm-iface-helper.c:434 -#, c-format -msgid "Log domains separated by ',': any combination of [%s]" -msgstr "" - -#: ../src/core/main.c:219 ../src/core/nm-iface-helper.c:441 -msgid "Make all warnings fatal" -msgstr "" - -#: ../src/core/main.c:226 -msgid "Specify the location of a PID file" -msgstr "" - -#: ../src/core/main.c:240 -msgid "Print NetworkManager configuration and exit" -msgstr "" - -#: ../src/core/main.c:251 -msgid "" -"NetworkManager monitors all network connections and automatically\n" -"chooses the best connection to use. It also allows the user to\n" -"specify wireless access points which wireless cards in the computer\n" -"should associate with." -msgstr "" - -#: ../src/core/main.c:408 ../src/core/nm-iface-helper.c:599 -#, c-format -msgid "Could not daemonize: %s [error %u]\n" -msgstr "" - -#: ../src/core/nm-config.c:542 -#: ../src/libnm-core-impl/nm-setting-ovs-bridge.c:187 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:2157 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:4175 -#, c-format -msgid "'%s' is not valid" -msgstr "" - -#: ../src/core/nm-config.c:561 -#, c-format -msgid "Bad '%s' option: " -msgstr "" - -#: ../src/core/nm-config.c:578 -msgid "Config file location" -msgstr "" - -#: ../src/core/nm-config.c:585 -msgid "Config directory location" -msgstr "" - -#: ../src/core/nm-config.c:592 -msgid "System config directory location" -msgstr "" - -#: ../src/core/nm-config.c:599 -msgid "Internal config file location" -msgstr "" - -#: ../src/core/nm-config.c:606 -msgid "State file location" -msgstr "" - -#: ../src/core/nm-config.c:613 -msgid "State file for no-auto-default devices" -msgstr "" - -#: ../src/core/nm-config.c:620 -msgid "List of plugins separated by ','" -msgstr "" - -#: ../src/core/nm-config.c:627 -msgid "Quit after initial configuration" -msgstr "" - -#: ../src/core/nm-config.c:634 ../src/core/nm-iface-helper.c:420 -msgid "Don't become a daemon, and log to stderr" -msgstr "" - -#: ../src/core/nm-config.c:643 -msgid "An http(s) address for checking internet connectivity" -msgstr "" - -#: ../src/core/nm-config.c:650 -msgid "The interval between connectivity checks (in seconds)" -msgstr "" - -#: ../src/core/nm-config.c:657 -msgid "The expected start of the response" -msgstr "" - -#: ../src/core/nm-config.c:666 -msgid "NetworkManager options" -msgstr "" - -#: ../src/core/nm-config.c:667 -msgid "Show NetworkManager options" -msgstr "" - -#: ../src/core/nm-iface-helper.c:292 -msgid "The interface to manage" -msgstr "" - -#: ../src/core/nm-iface-helper.c:299 -#, fuzzy -msgid "Connection UUID" -msgstr "إتّصالات VPN" - -#: ../src/core/nm-iface-helper.c:306 -msgid "Connection Token for Stable IDs" -msgstr "" - -#: ../src/core/nm-iface-helper.c:313 -msgid "Whether to manage IPv6 SLAAC" -msgstr "" - -#: ../src/core/nm-iface-helper.c:320 -msgid "Whether SLAAC must be successful" -msgstr "" - -#: ../src/core/nm-iface-helper.c:327 -msgid "Use an IPv6 temporary privacy address" -msgstr "" - -#: ../src/core/nm-iface-helper.c:334 -msgid "Current DHCPv4 address" -msgstr "" - -#: ../src/core/nm-iface-helper.c:341 -msgid "Whether DHCPv4 must be successful" -msgstr "" - -#: ../src/core/nm-iface-helper.c:348 -msgid "Hex-encoded DHCPv4 client ID" -msgstr "" - -#: ../src/core/nm-iface-helper.c:355 -msgid "Hostname to send to DHCP server" -msgstr "" - -#: ../src/core/nm-iface-helper.c:356 -msgid "barbar" -msgstr "" - -#: ../src/core/nm-iface-helper.c:362 -msgid "FQDN to send to DHCP server" -msgstr "" - -#: ../src/core/nm-iface-helper.c:363 -msgid "host.domain.org" -msgstr "" - -#: ../src/core/nm-iface-helper.c:369 -msgid "Route priority for IPv4" -msgstr "" - -#: ../src/core/nm-iface-helper.c:370 -msgid "0" -msgstr "" - -#: ../src/core/nm-iface-helper.c:376 -msgid "Route priority for IPv6" -msgstr "" - -#: ../src/core/nm-iface-helper.c:377 -msgid "1024" -msgstr "" - -#: ../src/core/nm-iface-helper.c:383 -msgid "Hex-encoded Interface Identifier" -msgstr "" - -#: ../src/core/nm-iface-helper.c:390 -msgid "IPv6 SLAAC address generation mode" -msgstr "" - -#: ../src/core/nm-iface-helper.c:397 -msgid "" -"The logging backend configuration value. See logging.backend in " -"NetworkManager.conf" -msgstr "" - -#: ../src/core/nm-iface-helper.c:451 -msgid "" -"nm-iface-helper is a small, standalone process that manages a single network " -"interface." -msgstr "" - -#: ../src/core/nm-iface-helper.c:562 -#, c-format -msgid "An interface name and UUID are required\n" -msgstr "" - -#: ../src/core/nm-iface-helper.c:570 -#, c-format -msgid "Failed to find interface index for %s (%s)\n" -msgstr "" - -#: ../src/core/nm-iface-helper.c:590 -#, c-format -msgid "Ignoring unrecognized log domain(s) '%s' passed on command line.\n" -msgstr "" - -#: ../src/core/nm-iface-helper.c:636 -#, c-format -msgid "(%s): Invalid IID %s\n" -msgstr "" - -#: ../src/core/nm-iface-helper.c:648 -#, c-format -msgid "(%s): Invalid DHCP client-id %s\n" -msgstr "" - -#: ../src/core/nm-manager.c:5926 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:8119 -#, fuzzy -msgid "VPN connection" -msgstr "إتّصالات VPN" - -#: ../src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c:5478 -#: ../src/libnm-client-impl/nm-device.c:1683 -#: ../src/libnm-core-impl/nm-connection.c:2707 -#: ../src/nmtui/nm-editor-utils.c:180 -msgid "Bond" -msgstr "" - -#: ../src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c:5549 -#: ../src/libnm-client-impl/nm-device.c:1685 -#: ../src/libnm-core-impl/nm-connection.c:2709 -#: ../src/nmtui/nm-editor-utils.c:198 -msgid "Team" -msgstr "" - -#: ../src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c:5886 -#: ../src/libnm-client-impl/nm-device.c:1687 -#: ../src/libnm-core-impl/nm-connection.c:2711 -#: ../src/nmtui/nm-editor-utils.c:189 -msgid "Bridge" -msgstr "" - -#: ../src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c:9974 -#: ../src/libnm-core-impl/nm-team-utils.c:2396 -#, fuzzy, c-format -msgid "invalid json" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-client-impl/nm-client.c:3782 -#, c-format -msgid "request succeeded with %s but object is in an unsuitable state" -msgstr "" - -#: ../src/libnm-client-impl/nm-client.c:3874 -#, c-format -msgid "operation succeeded but object %s does not exist" -msgstr "" - -#: ../src/libnm-client-impl/nm-device-adsl.c:66 -msgid "The connection was not an ADSL connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-bond.c:106 -msgid "The connection was not a bond connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-bridge.c:109 -msgid "The connection was not a bridge connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-bt.c:133 -#, c-format -msgid "The connection was not a Bluetooth connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-bt.c:141 -#, fuzzy, c-format -msgid "The connection is of Bluetooth NAP type." -msgstr "حذف اتصال VPN \"%s\"؟" - -#: ../src/libnm-client-impl/nm-device-bt.c:152 -msgid "Invalid device Bluetooth address." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-bt.c:161 -msgid "The Bluetooth addresses of the device and the connection didn't match." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-bt.c:173 -msgid "" -"The device is lacking Bluetooth capabilities required by the connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-dummy.c:65 -#, fuzzy -msgid "The connection was not a dummy connection." -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-client-impl/nm-device-dummy.c:74 -#: ../src/libnm-client-impl/nm-device-generic.c:89 -#: ../src/libnm-client-impl/nm-device-ovs-bridge.c:89 -#: ../src/libnm-client-impl/nm-device-ovs-interface.c:57 -#: ../src/libnm-client-impl/nm-device-ovs-port.c:89 -msgid "The connection did not specify an interface name." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-ethernet.c:189 -msgid "The connection was not an Ethernet or PPPoE connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-ethernet.c:206 -msgid "The connection and device differ in S390 subchannels." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-ethernet.c:223 -#, c-format -msgid "Invalid device MAC address %s." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-ethernet.c:231 -msgid "The MACs of the device and the connection do not match." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-ethernet.c:243 -#, c-format -msgid "Invalid MAC in the blacklist: %s." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-ethernet.c:252 -#, c-format -msgid "Device MAC (%s) is blacklisted by the connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-generic.c:80 -msgid "The connection was not a generic connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-infiniband.c:90 -msgid "The connection was not an InfiniBand connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-infiniband.c:100 -#: ../src/libnm-client-impl/nm-device-wifi.c:481 -msgid "Invalid device MAC address." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-infiniband.c:110 -#: ../src/libnm-client-impl/nm-device-wifi.c:490 -msgid "The MACs of the device and the connection didn't match." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-ip-tunnel.c:266 -msgid "The connection was not an IP tunnel connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-macvlan.c:151 -msgid "The connection was not a MAC-VLAN connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-modem.c:177 -msgid "The connection was not a modem connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-modem.c:187 -msgid "The connection was not a valid modem connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-modem.c:196 -msgid "The device is lacking capabilities required by the connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-olpc-mesh.c:102 -msgid "The connection was not an OLPC Mesh connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-ovs-bridge.c:80 -#, fuzzy -msgid "The connection was not a ovs_bridge connection." -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-client-impl/nm-device-ovs-interface.c:48 -#, fuzzy -msgid "The connection was not a ovs_interface connection." -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-client-impl/nm-device-ovs-port.c:80 -#, fuzzy -msgid "The connection was not a ovs_port connection." -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-client-impl/nm-device-team.c:125 -msgid "The connection was not a team connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-tun.c:204 -msgid "The connection was not a tun connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-tun.c:215 -msgid "The mode of the device and the connection didn't match" -msgstr "" - -#: ../src/libnm-client-impl/nm-device-vlan.c:121 -#, fuzzy -msgid "The connection was not a VLAN connection." -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-client-impl/nm-device-vlan.c:131 -msgid "The VLAN identifiers of the device and the connection didn't match." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-vlan.c:148 -msgid "The hardware address of the device and the connection didn't match." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-vrf.c:65 -#, fuzzy -msgid "The connection was not a VRF connection." -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-client-impl/nm-device-vrf.c:74 -msgid "The VRF table of the device and the connection didn't match." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-vxlan.c:383 -msgid "The connection was not a VXLAN connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-vxlan.c:393 -msgid "The VXLAN identifiers of the device and the connection didn't match." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-wifi-p2p.c:266 -#, fuzzy -msgid "The connection was not a Wi-Fi P2P connection." -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-client-impl/nm-device-wifi.c:470 -msgid "The connection was not a Wi-Fi connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-wifi.c:511 -msgid "The device is lacking WPA capabilities required by the connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-wifi.c:521 -msgid "The device is lacking WPA2/RSN capabilities required by the connection." -msgstr "" - -#: ../src/libnm-client-impl/nm-device-wpan.c:57 -#, fuzzy -msgid "The connection was not a wpan connection." -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-client-impl/nm-device.c:1663 ../src/nmtui/nm-editor-utils.c:128 -msgid "Ethernet" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1665 ../src/nmtui/nm-editor-utils.c:144 -msgid "Wi-Fi" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1667 -msgid "Bluetooth" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1669 -msgid "OLPC Mesh" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1671 -msgid "Open vSwitch Interface" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1673 -msgid "Open vSwitch Port" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1675 -msgid "Open vSwitch Bridge" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1677 -msgid "WiMAX" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1679 ../src/nmtui/nm-editor-utils.c:162 -msgid "Mobile Broadband" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1681 -#: ../src/libnm-core-impl/nm-connection.c:2715 -#: ../src/nmtui/nm-editor-utils.c:153 -msgid "InfiniBand" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1689 -#: ../src/libnm-core-impl/nm-connection.c:2713 -#: ../src/nmtui/nm-editor-utils.c:207 ../src/nmtui/nmt-page-vlan.c:64 -msgid "VLAN" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1691 -msgid "ADSL" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1693 -msgid "MACVLAN" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1695 -msgid "VXLAN" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1697 -msgid "IPTunnel" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1699 -msgid "Tun" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1701 ../src/nmtui/nm-editor-utils.c:136 -msgid "Veth" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1703 -msgid "MACsec" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1705 -msgid "Dummy" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1707 -msgid "PPP" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1709 -msgid "IEEE 802.15.4" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1711 -msgid "6LoWPAN" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1713 -msgid "WireGuard" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1715 -msgid "Wi-Fi P2P" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1717 -msgid "VRF" -msgstr "" - -#. TRANSLATORS: Unknown reason for a device state change (NMDeviceStateReason) -#. TRANSLATORS: Unknown reason for a connection state change (NMActiveConnectionStateReason) -#: ../src/libnm-client-impl/nm-device.c:1724 -#: ../src/libnmc-base/nm-client-utils.c:352 -#: ../src/libnmc-base/nm-client-utils.c:473 -msgid "Unknown" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1749 -msgid "Wired" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1781 -msgid "PCI" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:1783 -msgid "USB" -msgstr "" - -#. TRANSLATORS: the first %s is a bus name (eg, "USB") or -#. * product name, the second is a device type (eg, -#. * "Ethernet"). You can change this to something like -#. * "%2$s (%1$s)" if there's no grammatical way to combine -#. * the strings otherwise. -#. -#: ../src/libnm-client-impl/nm-device.c:2082 -#: ../src/libnm-client-impl/nm-device.c:2101 -#, c-format -msgctxt "long device name" -msgid "%s %s" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:2761 -#, c-format -msgid "The connection was not valid: %s" -msgstr "" - -#: ../src/libnm-client-impl/nm-device.c:2773 -#, c-format -msgid "The interface names of the device and the connection didn't match" -msgstr "" - -#: ../src/libnm-client-impl/nm-secret-agent-old.c:1384 -#, fuzzy -msgid "registration failed" -msgstr "إتّصالات VPN" - -#: ../src/libnm-client-impl/nm-vpn-plugin-old.c:817 -#: ../src/libnm-client-impl/nm-vpn-service-plugin.c:1063 -msgid "No service name specified" -msgstr "" - -#: ../src/libnm-core-aux-extern/nm-libnm-core-aux.c:286 -#, c-format -msgid "'%s' is not valid: properties should be specified as 'key=value'" -msgstr "" - -#: ../src/libnm-core-aux-extern/nm-libnm-core-aux.c:300 -#, fuzzy, c-format -msgid "'%s' is not a valid key" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-aux-extern/nm-libnm-core-aux.c:305 -#, c-format -msgid "duplicate key '%s'" -msgstr "" - -#: ../src/libnm-core-aux-extern/nm-libnm-core-aux.c:319 -#, c-format -msgid "number for '%s' is out of range" -msgstr "" - -#: ../src/libnm-core-aux-extern/nm-libnm-core-aux.c:324 -#, c-format -msgid "value for '%s' must be a number" -msgstr "" - -#: ../src/libnm-core-aux-extern/nm-libnm-core-aux.c:337 -#, c-format -msgid "value for '%s' must be a boolean" -msgstr "" - -#: ../src/libnm-core-aux-extern/nm-libnm-core-aux.c:346 -msgid "missing 'name' attribute" -msgstr "" - -#: ../src/libnm-core-aux-extern/nm-libnm-core-aux.c:355 -#, fuzzy, c-format -msgid "invalid 'name' \"%s\"" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-aux-extern/nm-libnm-core-aux.c:368 -#, c-format -msgid "attribute '%s' is invalid for \"%s\"" -msgstr "" - -#: ../src/libnm-core-aux-intern/nm-libnm-core-utils.c:293 -msgid "property cannot be an empty string" -msgstr "" - -#: ../src/libnm-core-aux-intern/nm-libnm-core-utils.c:310 -msgid "property cannot be longer than 255 bytes" -msgstr "" - -#: ../src/libnm-core-aux-intern/nm-libnm-core-utils.c:321 -msgid "property cannot contain any nul bytes" -msgstr "" - -#: ../src/libnm-core-impl/nm-connection.c:300 -msgid "wrong type; should be a list of strings." -msgstr "" - -#: ../src/libnm-core-impl/nm-connection.c:374 -msgid "unknown setting name" -msgstr "" - -#: ../src/libnm-core-impl/nm-connection.c:386 -msgid "duplicate setting name" -msgstr "" - -#: ../src/libnm-core-impl/nm-connection.c:1433 -msgid "setting not found" -msgstr "" - -#: ../src/libnm-core-impl/nm-connection.c:1486 -#: ../src/libnm-core-impl/nm-connection.c:1511 -#: ../src/libnm-core-impl/nm-connection.c:1536 -msgid "setting is required for non-slave connections" -msgstr "" - -#: ../src/libnm-core-impl/nm-connection.c:1499 -#: ../src/libnm-core-impl/nm-connection.c:1524 -#: ../src/libnm-core-impl/nm-connection.c:1549 -msgid "setting not allowed in slave connection" -msgstr "" - -#: ../src/libnm-core-impl/nm-connection.c:1654 -msgid "Unexpected failure to normalize the connection" -msgstr "" - -#: ../src/libnm-core-impl/nm-connection.c:1715 -msgid "Unexpected failure to verify the connection" -msgstr "" - -#: ../src/libnm-core-impl/nm-connection.c:1752 -#, c-format -msgid "unexpected uuid %s instead of %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-connection.c:2566 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2618 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2641 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2681 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2704 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2754 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2795 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2895 -#: ../src/libnm-core-impl/nm-setting-adsl.c:157 -#: ../src/libnm-core-impl/nm-setting-bluetooth.c:110 -#: ../src/libnm-core-impl/nm-setting-bluetooth.c:174 -#: ../src/libnm-core-impl/nm-setting-bluetooth.c:191 -#: ../src/libnm-core-impl/nm-setting-cdma.c:127 -#: ../src/libnm-core-impl/nm-setting-connection.c:1075 -#: ../src/libnm-core-impl/nm-setting-connection.c:1113 -#: ../src/libnm-core-impl/nm-setting-connection.c:1385 -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5333 -#: ../src/libnm-core-impl/nm-setting-ip-tunnel.c:371 -#: ../src/libnm-core-impl/nm-setting-olpc-mesh.c:83 -#: ../src/libnm-core-impl/nm-setting-ovs-patch.c:75 -#: ../src/libnm-core-impl/nm-setting-pppoe.c:129 -#: ../src/libnm-core-impl/nm-setting-vpn.c:532 -#: ../src/libnm-core-impl/nm-setting-wifi-p2p.c:120 -#: ../src/libnm-core-impl/nm-setting-wimax.c:92 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:899 -#: ../src/libnm-core-impl/nm-setting-wireless.c:788 -msgid "property is missing" -msgstr "" - -#: ../src/libnm-core-impl/nm-connection.c:2719 -#, fuzzy -msgid "IP Tunnel" -msgstr "أضف اتصال VPN جديد" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:59 -msgid "Failed to initialize the crypto engine." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:92 -#: ../src/libnm-core-impl/nm-crypto-nss.c:118 -#, c-format -msgid "Unsupported key cipher for decryption" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:103 -#: ../src/libnm-core-impl/nm-crypto-nss.c:126 -#, c-format -msgid "Invalid IV length (must be at least %u)." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:121 -#, c-format -msgid "Failed to initialize the decryption cipher context: %s (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:135 -#, c-format -msgid "Failed to decrypt the private key: %s (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:148 -#: ../src/libnm-core-impl/nm-crypto-nss.c:221 -#, c-format -msgid "Failed to decrypt the private key: unexpected padding length." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:160 -#: ../src/libnm-core-impl/nm-crypto-nss.c:233 -#, c-format -msgid "Failed to decrypt the private key." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:194 -#: ../src/libnm-core-impl/nm-crypto-nss.c:288 -#, c-format -msgid "Unsupported key cipher for encryption" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:211 -#, c-format -msgid "Failed to initialize the encryption cipher context: %s (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:239 -#, c-format -msgid "Failed to encrypt the data: %s (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:264 -#, c-format -msgid "Error initializing certificate data: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:287 -#, c-format -msgid "Couldn't decode certificate: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:312 -#, c-format -msgid "Couldn't initialize PKCS#12 decoder: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:326 -#, c-format -msgid "Couldn't decode PKCS#12 file: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:341 -#, c-format -msgid "Couldn't verify PKCS#12 file: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:370 -#, c-format -msgid "Couldn't initialize PKCS#8 decoder: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-gnutls.c:398 -#, c-format -msgid "Couldn't decode PKCS#8 file: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:70 -#, c-format -msgid "Failed to initialize the crypto engine: %d." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:139 -#, c-format -msgid "Failed to initialize the decryption cipher slot." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:150 -#, c-format -msgid "Failed to set symmetric key for decryption." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:161 -#, c-format -msgid "Failed to set IV for decryption." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:170 -#, c-format -msgid "Failed to initialize the decryption context." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:187 -#, c-format -msgid "Failed to decrypt the private key: %d." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:196 -#, c-format -msgid "Failed to decrypt the private key: decrypted data too large." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:208 -#, c-format -msgid "Failed to finalize decryption of the private key: %d." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:300 -#, c-format -msgid "Failed to initialize the encryption cipher slot." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:309 -#, c-format -msgid "Failed to set symmetric key for encryption." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:318 -#, c-format -msgid "Failed to set IV for encryption." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:327 -#, c-format -msgid "Failed to initialize the encryption context." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:352 -#, c-format -msgid "Failed to encrypt: %d." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:361 -#, c-format -msgid "Unexpected amount of data after encrypting." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:398 -#, c-format -msgid "Couldn't decode certificate: %d" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:443 -#, c-format -msgid "Password must be UTF-8" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:464 -#, c-format -msgid "Couldn't initialize slot" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:473 -#, c-format -msgid "Couldn't initialize PKCS#12 decoder: %d" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:483 -#, c-format -msgid "Couldn't decode PKCS#12 file: %d" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:493 -#, c-format -msgid "Couldn't verify PKCS#12 file: %d" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto-nss.c:544 -msgid "Could not generate random data." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:208 -#, c-format -msgid "PEM key file had no start tag" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:217 -#, c-format -msgid "PEM key file had no end tag '%s'." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:245 -#, c-format -msgid "Malformed PEM file: Proc-Type was not first tag." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:254 -#, c-format -msgid "Malformed PEM file: unknown Proc-Type tag '%s'." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:267 -#, c-format -msgid "Malformed PEM file: DEK-Info was not the second tag." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:279 -#, c-format -msgid "Malformed PEM file: no IV found in DEK-Info tag." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:288 -#, c-format -msgid "Malformed PEM file: invalid format of IV in DEK-Info tag." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:300 -#, c-format -msgid "Malformed PEM file: unknown private key cipher '%s'." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:323 -#, c-format -msgid "Could not decode private key." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:365 -msgid "Failed to find expected PKCS#8 start tag." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:374 -#, c-format -msgid "Failed to find expected PKCS#8 end tag '%s'." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:387 -msgid "Failed to decode PKCS#8 private key." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:417 -msgid "Failed to find expected TSS start tag." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:426 -#, c-format -msgid "Failed to find expected TSS end tag '%s'." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:481 -#, c-format -msgid "IV must be an even number of bytes in length." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:498 -#, c-format -msgid "IV contains non-hexadecimal digits." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:574 -#, c-format -msgid "IV must contain at least 8 characters" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:624 -#, c-format -msgid "Unable to determine private key type." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:637 -#, c-format -msgid "Password provided, but key was not encrypted." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:693 -#, c-format -msgid "PEM certificate had no start tag '%s'." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:703 -#, c-format -msgid "PEM certificate had no end tag '%s'." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:716 -#, c-format -msgid "Failed to decode certificate." -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:745 -#: ../src/libnm-core-impl/nm-crypto.c:796 -#, c-format -msgid "Certificate file is empty" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:778 -#, c-format -msgid "Failed to recognize certificate" -msgstr "" - -#: ../src/libnm-core-impl/nm-crypto.c:886 -#, c-format -msgid "not a valid private key" -msgstr "" - -#: ../src/libnm-core-impl/nm-dbus-utils.c:181 -#, c-format -msgid "Method returned type '%s', but expected '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile-utils.c:174 -#, c-format -msgid "Value cannot be interpreted as a list of numbers." -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile-utils.c:303 -#, c-format -msgid "value is not an integer in range [%lld, %lld]" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:270 -msgid "ignoring missing number" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:282 -#, c-format -msgid "ignoring invalid number '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:311 -#, c-format -msgid "ignoring invalid %s address: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:357 -#, c-format -msgid "ignoring invalid gateway '%s' for %s route" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:379 -#, c-format -msgid "ignoring invalid %s route: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:557 -#, c-format -msgid "unexpected character '%c' for address %s: '%s' (position %td)" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:573 -#, c-format -msgid "unexpected character '%c' for %s: '%s' (position %td)" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:588 -#, c-format -msgid "unexpected character '%c' in prefix length for %s: '%s' (position %td)" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:605 -#, c-format -msgid "garbage at the end of value %s: '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:615 -#, c-format -msgid "deprecated semicolon at the end of value %s: '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:634 -#, c-format -msgid "invalid prefix length for %s '%s', defaulting to %d" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:646 -#, c-format -msgid "missing prefix length for %s '%s', defaulting to %d" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:989 -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:320 -#: ../src/libnm-core-impl/nm-setting-user.c:372 -#, c-format -msgid "invalid value for \"%s\": %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1067 -#, c-format -msgid "ignoring invalid DNS server IPv%c address '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1104 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1651 -#, c-format -msgid "invalid option '%s', use one of [%s]" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1162 -msgid "ignoring invalid MAC address" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1238 -#, c-format -msgid "ignoring invalid bond option %s%s%s = %s%s%s: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1428 -msgid "ignoring invalid SSID" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1446 -msgid "ignoring invalid raw password" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1587 -msgid "invalid key/cert value" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1602 -#, c-format -msgid "invalid key/cert value path \"%s\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1627 -#: ../src/libnm-core-impl/nm-keyfile.c:1724 -#, c-format -msgid "certificate or key file '%s' does not exist" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1640 -#, c-format -msgid "invalid PKCS#11 URI \"%s\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1686 -msgid "invalid key/cert value data:;base64, is not base64" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1699 -msgid "invalid key/cert value data:;base64,file://" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1740 -msgid "invalid key/cert value is not a valid blob" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1842 -#, c-format -msgid "invalid parity value '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1864 -#: ../src/libnm-core-impl/nm-keyfile.c:3337 -#, fuzzy, c-format -msgid "invalid setting: %s" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-keyfile.c:1884 -#, c-format -msgid "ignoring invalid team configuration: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:1967 -#, c-format -msgid "invalid qdisc: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:2017 -#, fuzzy, c-format -msgid "invalid tfilter: %s" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-keyfile.c:3162 -#, fuzzy, c-format -msgid "error loading setting value: %s" -msgstr "خطأ في قراءة رسالة نتلينك: %s" - -#: ../src/libnm-core-impl/nm-keyfile.c:3193 -#: ../src/libnm-core-impl/nm-keyfile.c:3205 -#: ../src/libnm-core-impl/nm-keyfile.c:3224 -#: ../src/libnm-core-impl/nm-keyfile.c:3236 -#: ../src/libnm-core-impl/nm-keyfile.c:3248 -#: ../src/libnm-core-impl/nm-keyfile.c:3310 -#: ../src/libnm-core-impl/nm-keyfile.c:3322 -msgid "value cannot be interpreted as integer" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:3278 -#, c-format -msgid "ignoring invalid byte element '%u' (not between 0 and 255 inclusive)" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:3362 -#, c-format -msgid "invalid setting name '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:3409 -#, fuzzy, c-format -msgid "invalid key '%s.%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-keyfile.c:3425 -#, c-format -msgid "key '%s.%s' is not boolean" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:3442 -#, fuzzy, c-format -msgid "key '%s.%s' is not a uint32" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-keyfile.c:3499 -#, c-format -msgid "invalid peer public key in section '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:3514 -#, c-format -msgid "key '%s.%s' is not a valid 256 bit key in base64 encoding" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:3537 -#, fuzzy, c-format -msgid "key '%s.%s' is not a valid secret flag" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-keyfile.c:3560 -#, c-format -msgid "key '%s.%s' is not a integer in range 0 to 2^32" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:3576 -#, fuzzy, c-format -msgid "key '%s.%s' is not a valid endpoint" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-keyfile.c:3602 -#, c-format -msgid "key '%s.%s' has invalid allowed-ips" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:3617 -#, c-format -msgid "peer '%s' is invalid: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-keyfile.c:4108 -#, c-format -msgid "the profile is not valid: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-6lowpan.c:78 -#: ../src/libnm-core-impl/nm-setting-veth.c:80 -#, fuzzy, c-format -msgid "property is not specified" -msgstr "إتّصالات VPN" - -#: ../src/libnm-core-impl/nm-setting-6lowpan.c:101 -#: ../src/libnm-core-impl/nm-setting-macsec.c:284 -#: ../src/libnm-core-impl/nm-setting-vlan.c:591 -#, c-format -msgid "'%s' value doesn't match '%s=%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-6lowpan.c:117 -#: ../src/libnm-core-impl/nm-setting-ip-tunnel.c:344 -#: ../src/libnm-core-impl/nm-setting-macsec.c:300 -#: ../src/libnm-core-impl/nm-setting-macvlan.c:122 -#: ../src/libnm-core-impl/nm-setting-vlan.c:607 -#: ../src/libnm-core-impl/nm-setting-vxlan.c:352 -#, c-format -msgid "'%s' is neither an UUID nor an interface name" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:218 -msgid "binary data missing" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:250 -msgid "URI not NUL terminated" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:259 -msgid "URI is empty" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:267 -msgid "URI is not valid UTF-8" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:285 -msgid "data missing" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:306 -#: ../src/libnm-core-impl/nm-setting-8021x.c:674 -#, c-format -msgid "certificate is invalid: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:315 -#, c-format -msgid "certificate detected as invalid scheme" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:541 -msgid "CA certificate must be in X.509 format" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:553 -msgid "invalid certificate format" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:685 -#, c-format -msgid "password is not supported when certificate is not on a PKCS#11 token" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:2628 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2651 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2691 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2714 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2759 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2805 -#: ../src/libnm-core-impl/nm-setting-adsl.c:165 -#: ../src/libnm-core-impl/nm-setting-cdma.c:134 -#: ../src/libnm-core-impl/nm-setting-cdma.c:143 -#: ../src/libnm-core-impl/nm-setting-connection.c:1085 -#: ../src/libnm-core-impl/nm-setting-connection.c:1128 -#: ../src/libnm-core-impl/nm-setting-connection.c:1323 -#: ../src/libnm-core-impl/nm-setting-gsm.c:282 -#: ../src/libnm-core-impl/nm-setting-gsm.c:337 -#: ../src/libnm-core-impl/nm-setting-gsm.c:380 -#: ../src/libnm-core-impl/nm-setting-gsm.c:389 -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5342 -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:206 -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:218 -#: ../src/libnm-core-impl/nm-setting-pppoe.c:136 -#: ../src/libnm-core-impl/nm-setting-pppoe.c:145 -#: ../src/libnm-core-impl/nm-setting-vpn.c:540 -#: ../src/libnm-core-impl/nm-setting-vpn.c:550 -#: ../src/libnm-core-impl/nm-setting-wimax.c:104 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:955 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:983 -#: ../src/libnm-core-impl/nm-setting.c:1240 -msgid "property is empty" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:2667 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2730 -#, c-format -msgid "has to match '%s' property for PKCS#12" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:2773 -msgid "exactly one property must be set" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:2883 -#, fuzzy -msgid "can be enabled only on Ethernet connections" -msgstr "حذف اتصال VPN \"%s\"؟" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:2904 -#: ../src/libnm-core-impl/nm-setting-bluetooth.c:92 -#: ../src/libnm-core-impl/nm-setting-infiniband.c:163 -#: ../src/libnm-core-impl/nm-setting-infiniband.c:175 -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:194 -#: ../src/libnm-core-impl/nm-setting-ip6-config.c:243 -#: ../src/libnm-core-impl/nm-setting-ip6-config.c:257 -#: ../src/libnm-core-impl/nm-setting-olpc-mesh.c:121 -#: ../src/libnm-core-impl/nm-setting-wifi-p2p.c:132 -#: ../src/libnm-core-impl/nm-setting-wimax.c:116 -#: ../src/libnm-core-impl/nm-setting-wired.c:820 -#: ../src/libnm-core-impl/nm-setting-wired.c:833 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:1008 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:1020 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:1032 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:1045 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:1058 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:1089 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:1156 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:1205 -#: ../src/libnm-core-impl/nm-setting-wireless.c:884 -#: ../src/libnm-core-impl/nm-setting-wireless.c:896 -#: ../src/libnm-core-impl/nm-setting-wireless.c:909 -#: ../src/libnm-core-impl/nm-setting-wpan.c:161 -#: ../src/libnm-core-impl/nm-utils.c:4232 -msgid "property is invalid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:2929 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2942 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2955 -#: ../src/libnm-core-impl/nm-setting-8021x.c:2989 -#: ../src/libnm-core-impl/nm-setting-8021x.c:3002 -#: ../src/libnm-core-impl/nm-setting-adsl.c:177 -#: ../src/libnm-core-impl/nm-setting-adsl.c:190 -#: ../src/libnm-core-impl/nm-setting-bluetooth.c:127 -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:911 -#, c-format -msgid "'%s' is not a valid value for the property" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-8021x.c:2968 -msgid "invalid auth flags" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bluetooth.c:151 -#, c-format -msgid "'%s' connection requires '%s' or '%s' setting" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bluetooth.c:203 -#, c-format -msgid "'%s' connection requires '%s' setting" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:495 -#, c-format -msgid "'%s' option is empty" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:504 -#, c-format -msgid "'%s' is not a valid IPv4 address for '%s' option" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:531 -#, c-format -msgid "missing option name" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:536 -#, fuzzy, c-format -msgid "invalid option '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-bond.c:572 -#, fuzzy, c-format -msgid "invalid value '%s' for option '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-bond.c:814 -#, c-format -msgid "mandatory option '%s' is missing" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:824 -#, c-format -msgid "'%s' is not a valid value for '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:837 -#, c-format -msgid "'%s=%s' is incompatible with '%s > 0'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:854 -#, c-format -msgid "'%s' is not valid for the '%s' option: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:866 -#, c-format -msgid "'%s' option is only valid for '%s=%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:879 -#, c-format -msgid "'%s=%s' is not a valid configuration for '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:894 -#: ../src/libnm-core-impl/nm-setting-bond.c:905 -#, c-format -msgid "'%s' option requires '%s' option to be enabled" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:922 -#: ../src/libnm-core-impl/nm-setting-bond.c:933 -#, c-format -msgid "'%s' option requires '%s' option to be set" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:946 -#, c-format -msgid "'%s' option is only valid with mode '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:959 -#, c-format -msgid "'%s' and '%s' cannot have different values" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:982 -#, c-format -msgid "'%s' option should be string" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bond.c:995 -#, c-format -msgid "'%s' option is not valid with mode '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bridge-port.c:310 -#: ../src/libnm-core-impl/nm-setting-ovs-bridge.c:151 -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:289 -#: ../src/libnm-core-impl/nm-setting-ovs-port.c:170 -#: ../src/libnm-core-impl/nm-setting-team-port.c:307 -#, c-format -msgid "missing setting" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bridge-port.c:320 -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:312 -#: ../src/libnm-core-impl/nm-setting-ovs-port.c:193 -#: ../src/libnm-core-impl/nm-setting-team-port.c:317 -#, c-format -msgid "" -"A connection with a '%s' setting must have the slave-type set to '%s'. " -"Instead it is '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bridge.c:1175 -#, c-format -msgid "value '%d' is out of range <%d-%d>" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bridge.c:1194 -msgid "is not a valid MAC address" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bridge.c:1238 -msgid "the mask can't contain bits 0 (STP), 1 (MAC) or 2 (LACP)" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bridge.c:1260 -msgid "is not a valid link local MAC address" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bridge.c:1272 -msgid "is not a valid VLAN filtering protocol" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-bridge.c:1284 -#, fuzzy -msgid "is not a valid option" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-bridge.c:1296 -#, c-format -msgid "'%s' option must be a power of 2" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:968 -#, c-format -msgid "setting required for connection of type '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:999 -#, c-format -msgid "Unknown slave type '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1014 -#, c-format -msgid "Slave connections need a valid '%s' property" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1038 -#, c-format -msgid "Cannot set '%s' without '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1097 -#, c-format -msgid "'%s' is not a valid UUID" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1142 -#, c-format -msgid "connection type '%s' is not valid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1248 -#, c-format -msgid "'%s' connections must be enslaved to '%s', not '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1264 -#, c-format -msgid "metered value %d is not valid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1278 -#: ../src/libnm-core-impl/nm-setting-connection.c:1292 -#: ../src/libnm-core-impl/nm-setting-connection.c:1309 -#, c-format -msgid "value %d is not valid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1337 -msgid "DHCP option cannot be longer than 255 characters" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1348 -#, fuzzy -msgid "MUD URL is not a valid URL" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1368 -#, fuzzy -msgid "invalid permissions not in format \"user:$UNAME[:]\"" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1397 -#, c-format -msgid "property type should be set to '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1415 -#, c-format -msgid "slave-type '%s' requires a '%s' setting in the connection" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1426 -#, c-format -msgid "" -"Detect a slave connection with '%s' set and a port type '%s'. '%s' should be " -"set to '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1452 -#, c-format -msgid "A slave connection with '%s' set to '%s' cannot have a '%s' setting" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-connection.c:1469 -msgid "UUID needs normalization" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-dcb.c:483 -msgid "flags invalid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-dcb.c:492 -msgid "flags invalid - disabled" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-dcb.c:518 -#: ../src/libnm-core-impl/nm-setting-dcb.c:564 -msgid "property invalid (not enabled)" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-dcb.c:527 -msgid "element invalid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-dcb.c:542 -msgid "sum not 100%" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-dcb.c:573 -#: ../src/libnm-core-impl/nm-setting-dcb.c:608 -msgid "property invalid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-dcb.c:598 -msgid "property missing" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ethtool.c:311 -msgid "unsupported ethtool setting" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ethtool.c:320 -#, fuzzy -msgid "setting has invalid variant type" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-ethtool.c:332 -msgid "coalesce option must be either 0 or 1" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ethtool.c:349 -msgid "pause-autoneg cannot be enabled when setting rx/tx options" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ethtool.c:374 -#, fuzzy, c-format -msgid "unknown ethtool option '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-gsm.c:295 -#, c-format -msgid "property value '%s' is empty or too long (>64)" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-gsm.c:325 -#, c-format -msgid "'%s' contains invalid char(s) (use [A-Za-z._-])" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-gsm.c:351 -#, c-format -msgid "'%s' length is invalid (should be 5 or 6 digits)" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-gsm.c:365 -#, c-format -msgid "'%s' is not a number" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-gsm.c:402 -msgid "property is empty or wrong size" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-gsm.c:415 -msgid "property must contain only digits" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-gsm.c:429 -msgid "can't be enabled when manual configuration is present" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-infiniband.c:201 -msgid "Must specify a P_Key if specifying parent" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-infiniband.c:212 -msgid "InfiniBand P_Key connection did not specify parent interface name" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-infiniband.c:234 -#, c-format -msgid "" -"interface name of software infiniband device must be '%s' or unset (instead " -"it is '%s')" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-infiniband.c:262 -#, c-format -msgid "mtu can be at most %u but it is %u" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:112 -#, c-format -msgid "Missing IPv4 address" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:112 -#, c-format -msgid "Missing IPv6 address" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:119 -#, c-format -msgid "Invalid IPv4 address '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:120 -#, c-format -msgid "Invalid IPv6 address '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:136 -#, c-format -msgid "Invalid IPv4 address prefix '%u'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:137 -#, c-format -msgid "Invalid IPv6 address prefix '%u'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:154 -#, c-format -msgid "Invalid routing metric '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:1318 -#: ../src/libnm-core-impl/nm-setting-sriov.c:399 -msgid "unknown attribute" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:1328 -#: ../src/libnm-core-impl/nm-setting-sriov.c:409 -#, fuzzy, c-format -msgid "invalid attribute type '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:1337 -#, c-format -msgid "attribute is not valid for a IPv4 route" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:1338 -#, c-format -msgid "attribute is not valid for a IPv6 route" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:1351 -#: ../src/libnm-core-impl/nm-setting-ip-config.c:1381 -#, c-format -msgid "'%s' is not a valid IPv4 address" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:1352 -#: ../src/libnm-core-impl/nm-setting-ip-config.c:1382 -#, c-format -msgid "'%s' is not a valid IPv6 address" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:1372 -#, c-format -msgid "invalid prefix %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:1393 -#, fuzzy, c-format -msgid "%s is not a valid route type" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:1452 -#, c-format -msgid "route scope is invalid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2631 -msgid "invalid priority" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2644 -msgid "missing table" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2654 -#, fuzzy -msgid "invalid action type" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2663 -msgid "has from/src but the prefix-length is zero" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2671 -msgid "missing from/src for a non zero prefix-length" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2678 -#, fuzzy -msgid "invalid from/src" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2685 -msgid "invalid prefix length for from/src" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2694 -msgid "has to/dst but the prefix-length is zero" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2702 -msgid "missing to/dst for a non zero prefix-length" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2709 -#, fuzzy -msgid "invalid to/dst" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2716 -msgid "invalid prefix length for to/dst" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2726 -msgid "invalid iifname" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2736 -msgid "invalid oifname" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2744 -msgid "invalid source port range" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2752 -msgid "invalid destination port range" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2762 -msgid "suppress_prefixlength out of range" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2770 -msgid "suppress_prefixlength is only allowed with the to-table action" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2913 -#, fuzzy, c-format -msgid "invalid key \"%s\"" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2925 -#, c-format -msgid "duplicate key %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2941 -#, fuzzy, c-format -msgid "invalid variant type '%s' for \"%s\"" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2952 -msgid "missing \"family\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:2960 -#, fuzzy -msgid "invalid \"family\"" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3017 -msgid "\"uid-range-start\" is greater than \"uid-range-end\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3211 -msgid "Unsupported to-string-flags argument" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3219 -msgid "Unsupported extra-argument" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3524 -#, c-format -msgid "unsupported key \"%s\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3531 -#, c-format -msgid "duplicate key \"%s\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3538 -#, fuzzy, c-format -msgid "invalid value for \"%s\"" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3550 -msgid "empty text does not describe a rule" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3558 -#, c-format -msgid "missing argument for \"%s\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3572 -msgid "invalid \"from\" part" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3588 -msgid "invalid \"to\" part" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3599 -#, c-format -msgid "cannot detect address family for rule" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3666 -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3756 -#, c-format -msgid "rule is invalid: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:3737 -msgid "invalid address family" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5010 -#, c-format -msgid "rule #%u is invalid: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5358 -#, c-format -msgid "%d. DNS server address is invalid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5377 -#, c-format -msgid "%d. IP address is invalid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5392 -#, c-format -msgid "%d. IP address has 'label' property with invalid type" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5404 -#, c-format -msgid "%d. IP address has invalid label '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5422 -msgid "gateway cannot be set if there are no addresses configured" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5434 -msgid "gateway is invalid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5452 -#, c-format -msgid "%d. route is invalid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5465 -#, fuzzy, c-format -msgid "invalid attribute: %s" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5485 -#, c-format -msgid "%u. rule has wrong address-family" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5497 -#, c-format -msgid "%u. rule is invalid: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5513 -#, fuzzy, c-format -msgid "'%s' is not a valid IAID" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5527 -#, c-format -msgid "the property cannot be set when '%s' is disabled" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5552 -msgid "the property is currently supported only for DHCPv4" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5569 -#, fuzzy, c-format -msgid "'%s' is not a valid IP or subnet" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-setting-ip-config.c:5585 -#, c-format -msgid "a gateway is incompatible with '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-tunnel.c:330 -#, c-format -msgid "'%d' is not a valid tunnel mode" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-tunnel.c:357 -#: ../src/libnm-core-impl/nm-setting-ip-tunnel.c:383 -#, c-format -msgid "'%s' is not a valid IPv%c address" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-tunnel.c:402 -msgid "tunnel keys can only be specified for GRE tunnels" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-tunnel.c:415 -#: ../src/libnm-core-impl/nm-setting-ip-tunnel.c:433 -#, c-format -msgid "'%s' is not a valid tunnel key" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-tunnel.c:447 -msgid "a fixed TTL is allowed only when path MTU discovery is enabled" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-tunnel.c:462 -#, c-format -msgid "some flags are invalid for the select mode: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip-tunnel.c:475 -#, c-format -msgid "wired setting not allowed for mode %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:132 -#: ../src/libnm-core-impl/nm-setting-ip6-config.c:177 -#, c-format -msgid "this property cannot be empty for '%s=%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:148 -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:162 -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:178 -#: ../src/libnm-core-impl/nm-setting-ip6-config.c:197 -#: ../src/libnm-core-impl/nm-setting-ip6-config.c:211 -#: ../src/libnm-core-impl/nm-setting-ip6-config.c:225 -#, c-format -msgid "this property is not allowed for '%s=%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:230 -#, c-format -msgid "'%s' is not a valid FQDN" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:243 -msgid "property cannot be set when dhcp-hostname is also set" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:258 -msgid "FQDN flags requires a FQDN set" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:277 -#, c-format -msgid "multiple addresses are not allowed for '%s=%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip4-config.c:294 -msgid "property should be TRUE when method is set to disabled" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip6-config.c:275 -msgid "value is not a valid token" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip6-config.c:289 -msgid "only makes sense with EUI64 address generation mode" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip6-config.c:303 -msgid "invalid DUID" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip6-config.c:318 -msgid "token is not in canonical form" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ip6-config.c:335 -msgid "property should be TRUE when method is set to ignore or disabled" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-macsec.c:229 -msgid "the key is empty" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-macsec.c:238 -#, c-format -msgid "the key must be %d characters" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-macsec.c:247 -msgid "the key contains non-hexadecimal characters" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-macsec.c:316 -#: ../src/libnm-core-impl/nm-setting-macvlan.c:138 -#: ../src/libnm-core-impl/nm-setting-vlan.c:620 -#, c-format -msgid "property is not specified and neither is '%s:%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-macsec.c:347 -#, c-format -msgid "EAP key management requires '%s' setting presence" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-macsec.c:356 -msgid "must be either psk (0) or eap (1)" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-macsec.c:365 -#, c-format -msgid "invalid port %d" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-macsec.c:375 -msgid "only valid for psk mode" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-macvlan.c:153 -msgid "non promiscuous operation is allowed only in passthru mode" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-match.c:714 -#: ../src/libnm-core-impl/nm-setting-match.c:730 -#: ../src/libnm-core-impl/nm-setting-match.c:746 -#: ../src/libnm-core-impl/nm-setting-match.c:762 -#, c-format -msgid "is empty" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-olpc-mesh.c:96 -#: ../src/libnm-core-impl/nm-setting-wireless.c:801 -msgid "SSID length is out of range <1-32> bytes" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-olpc-mesh.c:108 -#: ../src/libnm-core-impl/nm-setting-wireless.c:854 -#, c-format -msgid "'%d' is not a valid channel" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-bridge.c:160 -#, c-format -msgid "A connection with a '%s' setting must not have a master." -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-bridge.c:174 -#, fuzzy, c-format -msgid "'%s' is not allowed in fail_mode" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:90 -#: ../src/libnm-core-impl/nm-setting-user.c:91 -msgid "missing key" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:98 -#: ../src/libnm-core-impl/nm-setting-user.c:99 -msgid "key is too long" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:105 -#: ../src/libnm-core-impl/nm-setting-user.c:106 -msgid "key must be UTF8" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:114 -#: ../src/libnm-core-impl/nm-setting-user.c:153 -msgid "key contains invalid characters" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:123 -msgid "key cannot start with \"NM.\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:153 -#: ../src/libnm-core-impl/nm-setting-user.c:180 -msgid "value is missing" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:162 -#: ../src/libnm-core-impl/nm-setting-user.c:189 -msgid "value is too large" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:170 -#: ../src/libnm-core-impl/nm-setting-user.c:197 -msgid "value is not valid UTF8" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:313 -#: ../src/libnm-core-impl/nm-setting-user.c:365 -#, c-format -msgid "invalid key \"%s\": %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:337 -#: ../src/libnm-core-impl/nm-setting-user.c:389 -#, c-format -msgid "maximum number of user data entries reached (%u instead of %u)" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-external-ids.c:380 -msgid "" -"OVS external IDs can only be added to a profile of type OVS bridge/port/" -"interface or to OVS system interface" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:93 -#, fuzzy, c-format -msgid "'%s' is not a valid interface type" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:120 -#, c-format -msgid "A connection with a '%s' setting needs connection.type explicitly set" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:134 -#, c-format -msgid "A connection of type '%s' cannot have ovs-interface.type \"system\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:148 -#, c-format -msgid "A connection of type '%s' cannot have an ovs-interface.type \"%s\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:170 -#, c-format -msgid "A connection can not have both '%s' and '%s' settings at the same time" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:184 -#, c-format -msgid "" -"A connection with '%s' setting must be of connection.type \"ovs-interface\" " -"but is \"%s\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:200 -#, c-format -msgid "" -"A connection with '%s' setting needs to be of '%s' interface type, not '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:222 -#, c-format -msgid "A connection with ovs-interface.type '%s' setting a 'ovs-patch' setting" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:250 -#, c-format -msgid "Missing ovs interface setting" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:256 -#, c-format -msgid "Missing ovs interface type" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-interface.c:298 -#: ../src/libnm-core-impl/nm-setting-ovs-port.c:179 -#, c-format -msgid "A connection with a '%s' setting must have a master." -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-port.c:215 -#, c-format -msgid "'%s' is not allowed in vlan_mode" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-port.c:228 -#, c-format -msgid "the tag id must be in range 0-4094 but is %u" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ovs-port.c:238 -#, fuzzy, c-format -msgid "'%s' is not allowed in lacp" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-setting-ovs-port.c:251 -#, c-format -msgid "'%s' is not allowed in bond_mode" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ppp.c:335 -#, c-format -msgid "'%d' is out of valid range <128-16384>" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-ppp.c:348 -#, c-format -msgid "setting this property requires non-zero '%s' property" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-proxy.c:123 -#, c-format -msgid "invalid proxy method" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-proxy.c:133 -#: ../src/libnm-core-impl/nm-setting-proxy.c:145 -#, c-format -msgid "this property is not allowed for method none" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-proxy.c:159 -#, c-format -msgid "the script is too large" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-proxy.c:170 -#, c-format -msgid "the script is not valid utf8" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-proxy.c:181 -#, c-format -msgid "the script lacks FindProxyForURL function" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-sriov.c:424 -#: ../src/libnm-core-impl/nm-setting-wired.c:787 -#: ../src/libnm-core-impl/nm-setting-wired.c:803 -#: ../src/libnm-core-impl/nm-setting-wired.c:877 -#: ../src/libnm-core-impl/nm-setting-wired.c:935 -#: ../src/libnm-core-impl/nm-setting-wireless.c:944 -#: ../src/libnm-core-impl/nm-setting-wireless.c:963 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:4125 -#, c-format -msgid "'%s' is not a valid MAC address" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-sriov.c:1054 -#, c-format -msgid "VF with index %u, but the total number of VFs is %u" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-sriov.c:1068 -#, c-format -msgid "invalid VF %u: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-sriov.c:1082 -#, c-format -msgid "duplicate VF index %u" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-sriov.c:1106 -#, c-format -msgid "VFs %d and %d are not sorted by ascending index" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-tc-config.c:54 -#: ../src/libnm-core-impl/nm-setting-tc-config.c:420 -#: ../src/libnm-core-impl/nm-setting-tc-config.c:697 -#, c-format -msgid "kind is missing" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-tc-config.c:62 -#: ../src/libnm-core-impl/nm-setting-tc-config.c:428 -#: ../src/libnm-core-impl/nm-setting-tc-config.c:705 -#, c-format -msgid "'%s' is not a valid kind" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-tc-config.c:71 -#: ../src/libnm-core-impl/nm-setting-tc-config.c:714 -msgid "parent handle missing" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-tc-config.c:1284 -msgid "there are duplicate TC qdiscs" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-tc-config.c:1303 -msgid "there are duplicate TC filters" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-team.c:119 -#: ../src/libnm-core-impl/nm-setting-team.c:193 -#: ../src/libnm-core-impl/nm-setting-team.c:325 -#, c-format -msgid "%s is out of range [0, %d]" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-team.c:170 -#, c-format -msgid "Missing target-host in nsna_ping link watcher" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-team.c:178 -#: ../src/libnm-core-impl/nm-setting-team.c:301 -#, c-format -msgid "target-host '%s' contains invalid characters" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-team.c:292 -#, c-format -msgid "Missing %s in arp_ping link watcher" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-team.c:310 -#, c-format -msgid "source-host '%s' contains invalid characters" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-team.c:335 -msgid "vlanid is out of range [-1, 4094]" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-tun.c:149 -#, c-format -msgid "'%u': invalid mode" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-tun.c:160 -#, c-format -msgid "'%s': invalid user ID" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-tun.c:172 -#, c-format -msgid "'%s': invalid group ID" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-user.c:131 -msgid "key requires a '.' for a namespace" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-user.c:146 -msgid "key cannot contain \"..\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-user.c:322 -msgid "maximum number of user data entries reached" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-veth.c:89 -#, fuzzy, c-format -msgid "'%s' is not a valid interface name" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-setting-vlan.c:632 -#, c-format -msgid "the vlan id must be in range 0-4094 but is %u" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-vlan.c:642 -msgid "flags are invalid" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-vlan.c:654 -msgid "vlan setting should have a ethernet setting as well" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-vpn.c:560 -msgid "cannot set connection.multi-connect for VPN setting" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-vpn.c:599 -msgid "setting contained a secret with an empty name" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-vpn.c:638 -#: ../src/libnm-core-impl/nm-setting.c:2126 -msgid "not a secret property" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-vpn.c:646 -msgid "secret is not of correct type" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-vpn.c:728 -#: ../src/libnm-core-impl/nm-setting-vpn.c:778 -#, c-format -msgid "secret name cannot be empty" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-vpn.c:744 -msgid "secret flags property not found" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-vrf.c:73 -msgid "table cannot be zero" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-vxlan.c:329 -#: ../src/libnm-core-impl/nm-setting-vxlan.c:340 -#, fuzzy, c-format -msgid "'%s' is not a valid IP%s address" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-setting-vxlan.c:363 -#, c-format -msgid "%d is greater than local port max %d" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wired.c:767 -#, c-format -msgid "'%s' is not a valid Ethernet port value" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wired.c:777 -#, c-format -msgid "'%s' is not a valid duplex value" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wired.c:850 -#, fuzzy, c-format -msgid "invalid key '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-wired.c:862 -#, fuzzy, c-format -msgid "invalid value for key '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-wired.c:911 -msgid "Wake-on-LAN mode 'default' and 'ignore' are exclusive flags" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wired.c:923 -msgid "Wake-on-LAN password can only be used with magic packet mode" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wired.c:954 -msgid "both speed and duplex should have a valid value or both should be unset" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wired.c:955 -msgid "both speed and duplex are required for static link configuration" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:748 -msgid "missing public-key for peer" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:754 -msgid "invalid public-key for peer" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:764 -msgid "invalid preshared-key for peer" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:783 -msgid "invalid endpoint for peer" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:795 -#, c-format -msgid "invalid IP address \"%s\" for allowed-ip of peer" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:806 -msgid "invalid preshared-key-flags for peer" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:1598 -#, c-format -msgid "peer #%u has no public-key" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:1611 -#, c-format -msgid "peer #%u has invalid public-key" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:1627 -#, c-format -msgid "peer #%u has invalid endpoint" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:1659 -#, c-format -msgid "peer #%u has invalid allowed-ips setting" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:1673 -#, c-format -msgid "peer #%u is invalid: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:1744 -#: ../src/libnm-core-impl/nm-setting-wireguard.c:1763 -#, c-format -msgid "method \"%s\" is not supported for WireGuard" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:1787 -msgid "key must be 32 bytes base64 encoded" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:1918 -#, fuzzy -msgid "invalid peer secrets" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:1944 -#, c-format -msgid "peer #%u lacks public-key" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireguard.c:1961 -#, c-format -msgid "non-existing peer '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:925 -#, fuzzy, c-format -msgid "'%s' is not a valid value for '%s' mode connections" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:941 -#, c-format -msgid "'%s' security requires '%s=%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:970 -#, c-format -msgid "'%s' security requires '%s' setting presence" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:995 -#, c-format -msgid "'%d' value is out of range <0-3>" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:1072 -#, c-format -msgid "'%s' can only be used with '%s=%s' (WEP)" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:1109 -#, c-format -msgid "" -"'%s' can only be used with 'owe', 'wpa-psk', 'sae', 'wpa-eap' or 'wpa-eap-" -"suite-b-192' key management" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless-security.c:1127 -#, c-format -msgid "" -"pmf can only be 'default' or 'required' when using 'owe', 'sae' or 'wpa-eap-" -"suite-b-192' key management" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless.c:813 -#, c-format -msgid "'%s' is not a valid Wi-Fi mode" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless.c:826 -#, c-format -msgid "'%s' is not a valid band" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless.c:839 -#, c-format -msgid "'%s' requires setting '%s' property" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless.c:869 -#, c-format -msgid "'%s' requires '%s' and '%s' property" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless.c:981 -#: ../src/libnm-core-impl/nm-team-utils.c:2253 -#, c-format -msgid "invalid value" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless.c:994 -msgid "Wake-on-WLAN mode 'default' and 'ignore' are exclusive flags" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless.c:1005 -msgid "Wake-on-WLAN trying to set unknown flag" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless.c:1018 -msgid "AP isolation can be set only in AP mode" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wireless.c:1042 -#, c-format -msgid "conflicting value of mac-address-randomization and cloned-mac-address" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wpan.c:171 -msgid "page must be defined along with a channel" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wpan.c:180 -#, c-format -msgid "page must be between %d and %d" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting-wpan.c:191 -#, c-format -msgid "channel must not be between %d and %d" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting.c:795 -#, c-format -msgid "duplicate property" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting.c:815 -#, c-format -msgid "unknown property" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting.c:896 -#: ../src/libnm-core-impl/nm-setting.c:950 -#, c-format -msgid "can't set property of type '%s' from value of type '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting.c:917 -#: ../src/libnm-core-impl/nm-setting.c:933 -#, fuzzy, c-format -msgid "failed to set property: %s" -msgstr "تعذّر التحميل" - -#: ../src/libnm-core-impl/nm-setting.c:970 -#, c-format -msgid "can not set property: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-setting.c:2016 -msgid "secret not found" -msgstr "" - -#: ../src/libnm-core-impl/nm-team-utils.c:1531 -#: ../src/libnm-core-impl/nm-team-utils.c:1548 -#, fuzzy, c-format -msgid "invalid D-Bus property \"%s\"" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-team-utils.c:1560 -#, c-format -msgid "duplicate D-Bus property \"%s\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-team-utils.c:1580 -#, c-format -msgid "invalid D-Bus property \"%s\" for \"%s\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-team-utils.c:1652 -#, c-format -msgid "unknown link-watcher name \"%s\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-team-utils.c:2239 -#, c-format -msgid "value out or range" -msgstr "" - -#: ../src/libnm-core-impl/nm-team-utils.c:2274 -#, fuzzy, c-format -msgid "invalid runner-tx-hash" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-team-utils.c:2303 -#, fuzzy, c-format -msgid "%s is only allowed for runner %s" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-team-utils.c:2313 -#, fuzzy, c-format -msgid "%s is only allowed for runners %s" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-core-impl/nm-team-utils.c:2334 -#, c-format -msgid "cannot set parameters for lacp and activebackup runners together" -msgstr "" - -#: ../src/libnm-core-impl/nm-team-utils.c:2348 -#, fuzzy, c-format -msgid "missing link watcher" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-team-utils.c:2374 -#, c-format -msgid "team config exceeds size limit" -msgstr "" - -#: ../src/libnm-core-impl/nm-team-utils.c:2385 -#, c-format -msgid "team config is not valid UTF-8" -msgstr "" - -#: ../src/libnm-core-impl/nm-team-utils.c:2560 -#, fuzzy, c-format -msgid "invalid D-Bus type \"%s\"" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-team-utils.c:2599 -#, fuzzy, c-format -msgid "invalid link-watchers: %s" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-utils.c:2227 -#, c-format -msgid "'%s' is not a valid handle." -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:2375 -#, c-format -msgid "'%s' unexpected: parent already specified." -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:2393 -#, fuzzy, c-format -msgid "invalid handle: '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-utils.c:2415 -msgid "parent not specified." -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:2479 -#, c-format -msgid "unsupported qdisc option: '%s'." -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:2609 -msgid "action name missing." -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:2634 -#, c-format -msgid "unsupported action option: '%s'." -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:2771 -msgid "invalid action: " -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:2775 -#, c-format -msgid "unsupported tfilter option: '%s'." -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:3163 -#, c-format -msgid "failed stat file %s: %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:3174 -#, c-format -msgid "not a file (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:3185 -#, c-format -msgid "invalid file owner %d for %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:3197 -#, c-format -msgid "file permissions for %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:3207 -#, c-format -msgid "reject %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:3227 -#, c-format -msgid "path is not absolute (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:3242 -#, c-format -msgid "Plugin file does not exist (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:3251 -#, c-format -msgid "Plugin is not a valid file (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:3262 -#, c-format -msgid "libtool archives are not supported (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:3339 -#, c-format -msgid "Could not find \"%s\" binary" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:4183 -#, fuzzy -msgid "unknown secret flags" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-utils.c:4193 -msgid "conflicting secret flags" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:4204 -msgid "secret flags must not be \"not-required\"" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:4212 -msgid "unsupported secret flags" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:4242 -msgid "can't be simultaneously disabled and enabled" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:4250 -msgid "WPS is required" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:4318 -#, c-format -msgid "not a valid ethernet MAC address for mask at position %lld" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:4337 -#, c-format -msgid "not a valid ethernet MAC address #%u at position %lld" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:4952 -msgid "not valid utf-8" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:4973 -#: ../src/libnm-core-impl/nm-utils.c:5026 -msgid "is not a JSON object" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5002 -msgid "value is NULL" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5002 -msgid "value is empty" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5014 -#, c-format -msgid "invalid JSON at position %d (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5142 -#: ../src/libnm-core-impl/nm-utils.c:5162 -msgid "unterminated escape sequence" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5188 -#, fuzzy, c-format -msgid "unknown attribute '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-utils.c:5206 -#, c-format -msgid "missing key-value separator '%c' after '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5226 -#, c-format -msgid "invalid uint32 value '%s' for attribute '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5240 -#, fuzzy, c-format -msgid "invalid int32 value '%s' for attribute '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-utils.c:5253 -#, fuzzy, c-format -msgid "invalid uint64 value '%s' for attribute '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-utils.c:5266 -#, c-format -msgid "invalid uint8 value '%s' for attribute '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5280 -#, c-format -msgid "invalid boolean value '%s' for attribute '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5294 -#, c-format -msgid "unsupported attribute '%s' of type '%s'" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5596 -#, c-format -msgid "Bridge VLANs %d and %d are not sorted by ascending vid" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5620 -#, c-format -msgid "duplicate bridge VLAN vid %u" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5632 -msgid "only one VLAN can be the PVID" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5677 -#, fuzzy, c-format -msgid "unknown flags 0x%x" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnm-core-impl/nm-utils.c:5689 -msgid "" -"'fqdn-no-update' and 'fqdn-serv-update' flags cannot be set at the same time" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5700 -msgid "'fqdn-clear-flags' flag is incompatible with other FQDN flags" -msgstr "" - -#: ../src/libnm-core-impl/nm-utils.c:5708 -msgid "DHCPv6 does not support the E (encoded) FQDN flag" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-editor-plugin.c:284 -#, c-format -msgid "cannot load plugin \"%s\": %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-editor-plugin.c:295 -#, c-format -msgid "failed to load nm_vpn_editor_plugin_factory() from %s (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-editor-plugin.c:321 -#, c-format -msgid "unknown error initializing plugin %s" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-editor-plugin.c:341 -#, c-format -msgid "cannot load VPN plugin in '%s': missing plugin name" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-editor-plugin.c:349 -#, c-format -msgid "cannot load VPN plugin in '%s': invalid service name" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-editor-plugin.c:481 -#, c-format -msgid "the plugin does not support import capability" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-editor-plugin.c:505 -#, c-format -msgid "the plugin does not support export capability" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-plugin-info.c:109 -#, c-format -msgid "missing filename" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-plugin-info.c:117 -#, c-format -msgid "filename must be an absolute path (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-plugin-info.c:126 -#, c-format -msgid "filename has invalid format (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-plugin-info.c:419 -#, c-format -msgid "there exists a conflicting plugin (%s) that has the same %s.%s value" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-plugin-info.c:458 -#, c-format -msgid "there exists a conflicting plugin with the same name (%s)" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-plugin-info.c:1050 -#, c-format -msgid "missing \"plugin\" setting" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-plugin-info.c:1060 -#, c-format -msgid "%s: don't retry loading plugin which already failed previously" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-plugin-info.c:1134 -msgid "missing filename to load VPN plugin info" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-plugin-info.c:1149 -msgid "missing name for VPN plugin info" -msgstr "" - -#: ../src/libnm-core-impl/nm-vpn-plugin-info.c:1163 -msgid "missing service for VPN plugin info" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:2453 -#, c-format -msgid "object class '%s' has no property named '%s'" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:2462 -#, c-format -msgid "property '%s' of object class '%s' is not writable" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:2471 -#, c-format -msgid "" -"construct property \"%s\" for object '%s' can't be set after construction" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:2482 -#, c-format -msgid "'%s::%s' is not a valid property name; '%s' is not a GObject subtype" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:2495 -#, c-format -msgid "unable to set property '%s' of type '%s' from value of type '%s'" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:2507 -#, c-format -msgid "" -"value \"%s\" of type '%s' is invalid or out of range for property '%s' of " -"type '%s'" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:5405 -msgid "interface name is missing" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:5413 -msgid "interface name is too short" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:5421 -msgid "interface name is reserved" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:5434 -msgid "interface name contains an invalid character" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:5442 -msgid "interface name is longer than 15 characters" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:5467 -#, fuzzy, c-format -msgid "'%%' is not allowed in interface names" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:5479 -#, fuzzy, c-format -msgid "'%s' is not allowed as interface name" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:5501 -msgid "" -"interface name must be alphanumerical with no forward or backward slashes" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:5518 -msgid "interface name must not be empty" -msgstr "" - -#: ../src/libnm-glib-aux/nm-shared-utils.c:5526 -msgid "interface name must be UTF-8 encoded" -msgstr "" - -#: ../src/libnm-log-core/nm-logging.c:252 -#, c-format -msgid "Unknown log level '%s'" -msgstr "" - -#: ../src/libnm-log-core/nm-logging.c:360 -#, c-format -msgid "Unknown log domain '%s'" -msgstr "" - -#. TRANSLATORS: the first %s is the partial value entered by -#. * the user, the second %s a list of compatible values. -#. -#: ../src/libnmc-base/nm-client-utils.c:108 -#: ../src/libnmc-base/nm-client-utils.c:152 -#, c-format -msgid "'%s' is ambiguous (%s)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:123 -#, c-format -msgid "'%s' is not valid; use [%s] or [%s]" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:176 -#, c-format -msgid "'%s' is not valid; use [%s], [%s] or [%s]" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:230 -#, c-format -msgid "'%s' is ambiguous: %s" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:243 -#, c-format -msgid "missing name, try one of [%s]" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:248 ../src/nmcli/connections.c:3543 -#: ../src/nmcli/connections.c:3601 -#, c-format -msgid "'%s' not among [%s]" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:291 -#: ../src/libnmc-base/nm-client-utils.c:305 -#: ../src/libnmc-base/nm-client-utils.c:341 -#: ../src/libnmc-base/nm-client-utils.c:346 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1818 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1849 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:2793 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:2850 ../src/nmcli/common.c:1453 -#: ../src/nmcli/connections.c:73 ../src/nmcli/connections.c:83 -#: ../src/nmcli/devices.c:476 ../src/nmcli/devices.c:583 -#: ../src/nmcli/devices.c:589 ../src/nmcli/general.c:30 -#: ../src/nmcli/general.c:85 ../src/nmcli/general.c:91 -msgid "unknown" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:292 -msgid "unmanaged" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:293 -msgid "unavailable" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:294 ../src/nmcli/general.c:39 -msgid "disconnected" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:295 -msgid "connecting (prepare)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:296 -msgid "connecting (configuring)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:297 -msgid "connecting (need authentication)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:298 -msgid "connecting (getting IP configuration)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:299 -msgid "connecting (checking IP connectivity)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:301 -msgid "connecting (starting secondary connections)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:302 ../src/nmcli/general.c:37 -msgid "connected" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:303 ../src/nmcli/connections.c:76 -msgid "deactivating" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:304 -msgid "connection failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:311 -#: ../src/libnmc-base/nm-client-utils.c:312 -#: ../src/libnmc-base/nm-client-utils.c:313 -#: ../src/libnmc-base/nm-client-utils.c:314 -#: ../src/libnmc-base/nm-client-utils.c:315 -#: ../src/libnmc-base/nm-client-utils.c:316 -#, fuzzy -msgid "connecting (externally)" -msgstr "إتّصالات VPN" - -#: ../src/libnmc-base/nm-client-utils.c:317 -msgid "connected (externally)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:318 -#: ../src/libnmc-base/nm-client-utils.c:319 -msgid "deactivating (externally)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:342 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:880 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:2785 -#: ../src/nmcli/connections.c:5295 ../src/nmcli/connections.c:7221 -#: ../src/nmcli/connections.c:7222 ../src/nmcli/devices.c:582 -#: ../src/nmcli/devices.c:588 ../src/nmcli/devices.c:1363 -#: ../src/nmcli/general.c:92 ../src/nmcli/utils.h:311 -msgid "yes" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:343 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:880 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:2788 -#: ../src/nmcli/connections.c:5294 ../src/nmcli/connections.c:7221 -#: ../src/nmcli/connections.c:7222 ../src/nmcli/devices.c:582 -#: ../src/nmcli/devices.c:588 ../src/nmcli/devices.c:1363 -#: ../src/nmcli/general.c:93 ../src/nmcli/utils.h:311 -#, fuzzy -msgid "no" -msgstr "بلا" - -#: ../src/libnmc-base/nm-client-utils.c:344 -msgid "yes (guessed)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:345 -msgid "no (guessed)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:353 -msgid "No reason given" -msgstr "" - -#. We should not really come here -#: ../src/libnmc-base/nm-client-utils.c:354 ../src/nmcli/connections.c:3563 -#: ../src/nmcli/connections.c:3622 -#, c-format -msgid "Unknown error" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:355 -msgid "Device is now managed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:356 -msgid "Device is now unmanaged" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:358 -msgid "The device could not be readied for configuration" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:361 -msgid "" -"IP configuration could not be reserved (no available address, timeout, etc.)" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:363 -msgid "The IP configuration is no longer valid" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:365 -msgid "Secrets were required, but not provided" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:367 -msgid "802.1X supplicant disconnected" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:369 -msgid "802.1X supplicant configuration failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:370 -msgid "802.1X supplicant failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:372 -msgid "802.1X supplicant took too long to authenticate" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:374 -msgid "PPP service failed to start" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:375 -msgid "PPP service disconnected" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:376 -msgid "PPP failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:378 -msgid "DHCP client failed to start" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:379 -msgid "DHCP client error" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:380 -msgid "DHCP client failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:382 -msgid "Shared connection service failed to start" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:384 -msgid "Shared connection service failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:386 -msgid "AutoIP service failed to start" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:387 -msgid "AutoIP service error" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:388 -msgid "AutoIP service failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:389 -msgid "The line is busy" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:390 -msgid "No dial tone" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:392 -msgid "No carrier could be established" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:394 -msgid "The dialing request timed out" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:396 -msgid "The dialing attempt failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:398 -msgid "Modem initialization failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:400 -msgid "Failed to select the specified APN" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:402 -msgid "Not searching for networks" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:404 -msgid "Network registration denied" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:406 -msgid "Network registration timed out" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:408 -msgid "Failed to register with the requested network" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:409 -msgid "PIN check failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:411 -msgid "Necessary firmware for the device may be missing" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:412 -msgid "The device was removed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:413 -msgid "NetworkManager went to sleep" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:415 -msgid "The device's active connection disappeared" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:417 -msgid "Device disconnected by user or client" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:418 -msgid "Carrier/link changed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:420 -msgid "The device's existing connection was assumed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:422 -msgid "The supplicant is now available" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:424 -msgid "The modem could not be found" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:426 -msgid "The Bluetooth connection failed or timed out" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:428 -msgid "GSM Modem's SIM card not inserted" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:430 -msgid "GSM Modem's SIM PIN required" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:432 -msgid "GSM Modem's SIM PUK required" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:433 -msgid "GSM Modem's SIM wrong" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:435 -msgid "InfiniBand device does not support connected mode" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:437 -msgid "A dependency of the connection failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:439 -msgid "A problem with the RFC 2684 Ethernet over ADSL bridge" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:441 -msgid "ModemManager is unavailable" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:443 -msgid "The Wi-Fi network could not be found" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:445 -msgid "A secondary connection of the base connection failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:446 -msgid "DCB or FCoE setup failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:447 -msgid "teamd control failed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:449 -msgid "Modem failed or no longer available" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:451 -msgid "Modem now ready and available" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:452 -msgid "SIM PIN was incorrect" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:454 -msgid "New connection activation was enqueued" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:455 -msgid "The device's parent changed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:457 -msgid "The device parent's management changed" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:459 -#, fuzzy -msgid "Open vSwitch database connection failed" -msgstr "إتّصالات VPN" - -#: ../src/libnmc-base/nm-client-utils.c:461 -msgid "A duplicate IP address was detected" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:463 -msgid "The selected IP method is not supported" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:465 -msgid "Failed to configure SR-IOV parameters" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:467 -msgid "The Wi-Fi P2P peer could not be found" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:474 -msgid "Unknown reason" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:476 -#, fuzzy -msgid "The connection was disconnected" -msgstr "لا يمكن إضافة اتصال VPN" - -#: ../src/libnmc-base/nm-client-utils.c:478 -#, fuzzy -msgid "Disconnected by user" -msgstr "إتّصالات VPN" - -#: ../src/libnmc-base/nm-client-utils.c:480 -msgid "The base network connection was interrupted" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:482 -msgid "The VPN service stopped unexpectedly" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:484 -msgid "The VPN service returned invalid configuration" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:486 -#, fuzzy -msgid "The connection attempt timed out" -msgstr "إتّصالات VPN" - -#: ../src/libnmc-base/nm-client-utils.c:488 -msgid "The VPN service did not start in time" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:490 -msgid "The VPN service failed to start" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:491 -msgid "No valid secrets" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:492 -msgid "Invalid secrets" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:494 -#, fuzzy -msgid "The connection was removed" -msgstr "حذف اتصال VPN \"%s\"؟" - -#: ../src/libnmc-base/nm-client-utils.c:496 -#, fuzzy -msgid "Master connection failed" -msgstr "إتّصالات VPN" - -#: ../src/libnmc-base/nm-client-utils.c:498 -msgid "Could not create a software link" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:500 -msgid "The device disappeared" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:823 -msgid "missing colon for \".:\" format" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:840 -msgid "missing dot for \".:\" format" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:846 -msgid "missing setting for \".:\" format" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:857 -msgid "missing property for \".:\" format" -msgstr "" - -#: ../src/libnmc-base/nm-client-utils.c:867 -#, fuzzy -msgid "invalid setting name" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnmc-base/nm-client-utils.c:881 -#, fuzzy -msgid "property name is not UTF-8" -msgstr "إتّصالات VPN" - -#: ../src/libnmc-base/nm-client-utils.c:898 -#: ../src/libnmc-base/nm-client-utils.c:904 -msgid "secret is not UTF-8" -msgstr "" - -#: ../src/libnmc-base/nm-polkit-listener.c:327 -#, c-format -msgid "Could not find any session id for uid %d" -msgstr "" - -#: ../src/libnmc-base/nm-polkit-listener.c:329 -#, fuzzy, c-format -msgid "Could not retrieve session id: %s" -msgstr "حذف اتصال VPN \"%s\"؟" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:222 -#, c-format -msgid "Preshared-key for %s" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:270 -#: ../src/libnmc-base/nm-secret-agent-simple.c:357 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:4954 -#: ../src/nmtui/nmt-page-dsl.c:49 ../src/nmtui/nmt-page-wifi.c:334 -msgid "Username" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:275 -#: ../src/libnmc-base/nm-secret-agent-simple.c:312 -#: ../src/libnmc-base/nm-secret-agent-simple.c:335 -#: ../src/libnmc-base/nm-secret-agent-simple.c:367 -#: ../src/libnmc-base/nm-secret-agent-simple.c:918 -#: ../src/libnmc-base/nm-secret-agent-simple.c:953 -#: ../src/libnmc-base/nm-secret-agent-simple.c:980 -#: ../src/libnmc-base/nm-vpn-helpers.c:143 -#: ../src/libnmc-base/nm-vpn-helpers.c:147 -#: ../src/libnmc-base/nm-vpn-helpers.c:153 -#: ../src/libnmc-base/nm-vpn-helpers.c:158 ../src/nmcli/devices.c:4641 -#: ../src/nmtui/nmt-page-dsl.c:62 ../src/nmtui/nmt-page-wifi.c:274 -#: ../src/nmtui/nmt-page-wifi.c:308 ../src/nmtui/nmt-page-wifi.c:347 -msgid "Password" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:284 -msgid "Identity" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:289 -msgid "Private key password" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:325 -#: ../src/nmtui/nmt-page-wifi.c:287 -msgid "Key" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:362 -#: ../src/nmtui/nmt-page-dsl.c:65 -msgid "Service" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:473 -msgid "WireGuard private-key" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:512 -#, fuzzy, c-format -msgid "Secrets are required to connect WireGuard VPN '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:620 -#: ../src/libnmc-base/nm-secret-agent-simple.c:914 -#: ../src/libnmc-base/nm-secret-agent-simple.c:949 -#: ../src/libnmc-base/nm-secret-agent-simple.c:976 -#: ../src/libnmc-base/nm-secret-agent-simple.c:995 -#, c-format -msgid "A password is required to connect to '%s'." -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:879 -msgid "Authentication required by wireless network" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:881 -#, c-format -msgid "" -"Passwords or encryption keys are required to access the wireless network " -"'%s'." -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:887 -msgid "Wired 802.1X authentication" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:888 -#, c-format -msgid "Secrets are required to access the wired network '%s'" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:894 -msgid "DSL authentication" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:895 -#, fuzzy, c-format -msgid "Secrets are required for the DSL connection '%s'" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:904 -msgid "PIN code required" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:905 -msgid "PIN code is needed for the mobile broadband device" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:908 -msgid "PIN" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:913 -#: ../src/libnmc-base/nm-secret-agent-simple.c:948 -#: ../src/libnmc-base/nm-secret-agent-simple.c:975 -msgid "Mobile broadband network password" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:926 -#, c-format -msgid "Secrets are required to access the MACsec network '%s'" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:930 -msgid "MACsec PSK authentication" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:932 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:6382 -msgid "MKA CAK" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:937 -msgid "MACsec EAP authentication" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:942 -msgid "WireGuard VPN secret" -msgstr "" - -#: ../src/libnmc-base/nm-secret-agent-simple.c:985 -msgid "VPN password required" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:41 -#, c-format -msgid "unknown VPN plugin \"%s\"" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:57 -#, c-format -msgid "cannot load legacy-only VPN plugin \"%s\" for \"%s\"" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:65 -#, c-format -msgid "" -"cannot load VPN plugin \"%s\" due to missing \"%s\". Missing client plugin?" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:72 -#, c-format -msgid "failed to load VPN plugin \"%s\": %s" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:148 -msgid "Certificate password" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:149 -msgid "HTTP proxy password" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:154 -#: ../src/libnmc-base/nm-vpn-helpers.c:159 -msgid "Group password" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:163 ../src/nmtui/nmt-page-ip4.c:131 -#: ../src/nmtui/nmt-page-ip6.c:132 -msgid "Gateway" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:164 -msgid "Cookie" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:165 -msgid "Gateway certificate hash" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:267 -#, fuzzy, c-format -msgid "Invalid peer starting at %s:%zu: %s" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnmc-base/nm-vpn-helpers.c:388 -msgid "" -"The name of the WireGuard config must be a valid interface name followed by " -"\".conf\"" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:671 -#, c-format -msgid "unrecognized line at %s:%zu" -msgstr "" - -#: ../src/libnmc-base/nm-vpn-helpers.c:678 -#, fuzzy, c-format -msgid "invalid value for '%s' at %s:%zu" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnmc-base/nm-vpn-helpers.c:686 -#, fuzzy, c-format -msgid "invalid secret '%s' at %s:%zu" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnmc-base/nm-vpn-helpers.c:815 -#, fuzzy, c-format -msgid "Failed to create WireGuard connection: %s" -msgstr "خطأ أثناء فتح اتصال VPN '%s'" - -#: ../src/libnmc-setting/nm-meta-setting-access.c:501 -#, c-format -msgid "field '%s' has to be alone" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-access.c:523 -#, c-format -msgid "invalid field '%s%s%s%s%s'; %s%s%s" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:263 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:329 -#, c-format -msgid "invalid prefix '%s'; <1-%d> allowed" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:275 -#, c-format -msgid "invalid IP address: %s" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:300 -msgid "" -"The valid syntax is: 'ip[/prefix] [next-hop] [metric] [attribute=val]... [," -"ip[/prefix] ...]'" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:341 -#, c-format -msgid "the next hop ('%s') must be first" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:351 -#, c-format -msgid "the metric ('%s') must be before attributes" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:402 -#, c-format -msgid "invalid route: %s. %s" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:470 -#, c-format -msgid "cannot read pac-script from file '%s'" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:479 -#, c-format -msgid "file '%s' contains non-valid utf-8" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:493 -#, c-format -msgid "'%s' does not contain a valid PAC Script" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:499 -#, c-format -msgid "Not a valid PAC Script" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:552 -#, c-format -msgid "cannot read team config from file '%s'" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:561 -#, c-format -msgid "team config file '%s' contains non-valid utf-8" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1052 -msgid "auto" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1214 -#, c-format -msgid "%s (%s)" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1403 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1411 -#: ../src/libnmc-setting/nm-meta-setting-desc.c:4301 -msgid "'%s' is out of range [%" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1420 -#, c-format -msgid "'%s' is not a valid number" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1476 -#, c-format -msgid "'%s' is out of range [0, %u]" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1520 -#, c-format -msgid "'%s' is not a valid Ethernet MAC" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1644 -#, c-format -msgid "invalid option '%s', use a combination of [%s]" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1785 -#, c-format -msgid "%d (key)" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1787 -#, c-format -msgid "%d (passphrase)" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1790 -#, c-format -msgid "%d (unknown)" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1803 -msgid "0 (NONE)" -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1809 -msgid "REORDER_HEADERS, " -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1811 -msgid "GVRP, " -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1813 -msgid "LOOSE_BINDING, " -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1815 -msgid "MVRP, " -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1836 -#, fuzzy -msgid "0 (none)" -msgstr "بلا" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1842 -msgid "agent-owned, " -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1844 -msgid "not saved, " -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:1846 -msgid "not required, " -msgstr "" - -#: ../src/libnmc-setting/nm-meta-setting-desc.c:2048 -#, c-format -msgid "'%s' is not valid; use