summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-12-17 09:58:12 +0100
committerThomas Haller <thaller@redhat.com>2020-05-08 15:00:46 +0200
commitc6e51f61ddc03c562eb9ba9b73e714833f5e74c9 (patch)
treec17232d13e2be48451f30abbf0275c8a552c39cb
parentea141ba8f8d1cf72e3bd752199c1076821fffdf9 (diff)
parent3f6f7b06c622145486d15fce177d9de1da2ae5a6 (diff)
release: bump version to 1.25.1-dev after 1.25.0 release1.25.1-dev
-rw-r--r--NEWS17
-rw-r--r--clients/cli/connections.c9
-rw-r--r--clients/cli/devices.c4
-rw-r--r--clients/cli/general.c4
-rw-r--r--clients/common/nm-meta-setting-desc.c149
-rw-r--r--clients/common/nm-meta-setting-desc.h1
-rw-r--r--clients/common/nm-secret-agent-simple.c4
-rw-r--r--clients/common/nm-vpn-helpers.c98
-rw-r--r--clients/common/nm-vpn-helpers.h4
-rw-r--r--clients/common/settings-docs.h.in12
-rw-r--r--configure.ac4
-rwxr-xr-xcontrib/fedora/rpm/build.sh7
-rwxr-xr-xcontrib/fedora/rpm/build_clean.sh3
-rw-r--r--dispatcher/nm-dispatcher.conf11
-rw-r--r--examples/C/glib/list-connections-libnm.c7
-rwxr-xr-xexamples/python/dbus/checkpoint.py2
-rwxr-xr-xexamples/python/dbus/get-active-connection-uuids.py2
-rwxr-xr-xexamples/python/dbus/list-devices.py2
-rwxr-xr-xexamples/python/dbus/vpn.py1
-rwxr-xr-xexamples/python/dbus/wifi-active-ap.py4
-rwxr-xr-xexamples/python/gi/checkpoint.py4
-rwxr-xr-xexamples/python/gi/deactivate-all.py2
-rwxr-xr-xexamples/python/gi/dns.py1
-rwxr-xr-xexamples/python/gi/get-active-connections.py2
-rwxr-xr-xexamples/python/gi/get-devices.py2
-rwxr-xr-xexamples/python/gi/get-interface-flags.py2
-rwxr-xr-xexamples/python/gi/get_ips.py2
-rwxr-xr-xexamples/python/gi/nm-add-connection2.py1
-rwxr-xr-xexamples/python/gi/nm-update2.py1
-rwxr-xr-xexamples/python/gi/nm-wg-set3
-rwxr-xr-xexamples/python/gi/wifi-p2p.py109
-rw-r--r--libnm-core/nm-core-internal.h82
-rw-r--r--libnm-core/nm-setting-bridge-port.c16
-rw-r--r--libnm-core/nm-setting-bridge.c506
-rw-r--r--libnm-core/nm-setting-bridge.h72
-rw-r--r--libnm-core/nm-setting-connection.c83
-rw-r--r--libnm-core/nm-setting-connection.h4
-rw-r--r--libnm-core/nm-setting-match.c454
-rw-r--r--libnm-core/nm-setting-match.h39
-rw-r--r--libnm-core/nm-utils.c2
-rw-r--r--libnm-core/nm-version.h14
-rw-r--r--libnm-core/tests/test-general.c1
-rw-r--r--libnm-core/tests/test-setting.c7
-rwxr-xr-xlibnm/generate-setting-docs.py3
-rw-r--r--libnm/libnm.ver28
-rw-r--r--man/NetworkManager.conf.xml4
-rw-r--r--man/nm-initrd-generator.xml43
-rw-r--r--meson.build2
-rw-r--r--po/POTFILES.in1
-rw-r--r--po/uk.po2626
-rw-r--r--shared/nm-glib-aux/nm-macros-internal.h46
-rw-r--r--shared/nm-glib-aux/nm-shared-utils.c20
-rw-r--r--shared/nm-glib-aux/nm-shared-utils.h100
-rw-r--r--shared/nm-keyfile/nm-keyfile-utils.c212
-rw-r--r--shared/nm-keyfile/nm-keyfile-utils.h80
-rw-r--r--shared/nm-keyfile/nm-keyfile.c65
-rw-r--r--shared/nm-libnm-core-intern/nm-common-macros.h2
-rw-r--r--shared/nm-test-libnm-utils.h5
-rw-r--r--shared/nm-version-macros.h.in1
-rw-r--r--shared/systemd/nm-sd-utils-shared.c43
-rw-r--r--shared/systemd/nm-sd-utils-shared.h4
-rw-r--r--shared/systemd/src/shared/web-util.c34
-rw-r--r--src/devices/nm-device-bridge.c256
-rw-r--r--src/devices/nm-device-macsec.c5
-rw-r--r--src/devices/nm-device-macvlan.c10
-rw-r--r--src/devices/nm-device.c118
-rw-r--r--src/devices/ovs/nm-ovsdb.c21
-rw-r--r--src/dhcp/nm-dhcp-client.c21
-rw-r--r--src/dhcp/nm-dhcp-client.h2
-rw-r--r--src/dhcp/nm-dhcp-dhclient-utils.c22
-rw-r--r--src/dhcp/nm-dhcp-dhclient-utils.h1
-rw-r--r--src/dhcp/nm-dhcp-dhclient.c6
-rw-r--r--src/dhcp/nm-dhcp-helper.c47
-rw-r--r--src/dhcp/nm-dhcp-manager.c6
-rw-r--r--src/dhcp/nm-dhcp-manager.h2
-rw-r--r--src/dhcp/nm-dhcp-nettools.c59
-rw-r--r--src/dhcp/nm-dhcp-options.c2
-rw-r--r--src/dhcp/nm-dhcp-options.h2
-rw-r--r--src/dhcp/nm-dhcp-systemd.c20
-rw-r--r--src/dhcp/tests/test-dhcp-dhclient.c59
-rw-r--r--src/initrd/nm-initrd-generator.c40
-rw-r--r--src/initrd/nm-initrd-generator.h2
-rw-r--r--src/initrd/nmi-cmdline-reader.c73
-rw-r--r--src/initrd/tests/test-cmdline-reader.c104
-rw-r--r--src/ndisc/nm-lndp-ndisc.c27
-rw-r--r--src/ndisc/nm-ndisc.c39
-rw-r--r--src/ndisc/tests/test-ndisc-fake.c5
-rw-r--r--src/nm-auth-manager.c171
-rw-r--r--src/nm-config-data.c19
-rw-r--r--src/nm-config.c151
-rw-r--r--src/nm-config.h4
-rw-r--r--src/nm-core-utils.c14
-rw-r--r--src/nm-dbus-manager.c8
-rw-r--r--src/nm-iface-helper.c2
-rw-r--r--src/nm-manager.c6
-rw-r--r--src/org.freedesktop.NetworkManager.conf252
-rw-r--r--src/platform/nm-netlink.h14
-rw-r--r--src/settings/plugins/ifcfg-rh/nm-ifcfg-rh.conf13
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c99
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c3
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h2
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c227
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected2
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c3
-rw-r--r--src/systemd/src/libsystemd-network/sd-dhcp6-client.c2
-rw-r--r--src/systemd/src/systemd/sd-dhcp6-client.h2
106 files changed, 4724 insertions, 2292 deletions
diff --git a/NEWS b/NEWS
index dca8d9bbae..2b87553835 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,21 @@
=============================================
+NetworkManager-1.26
+Overview of changes since NetworkManager-1.24
+=============================================
+
+This is a snapshot of NetworkManager 1.26 development series.
+The API is subject to change and not guaranteed to be compatible
+with the later release.
+USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE!
+
+* Add MUD URL property for connection profiles (RFC 8520) and set it
+ for DHCP and DHCPv6 requests.
+* IPv6 SLAAC: improved the reaction of IPv6 SLAAC to renumbering events:
+ - honor PIO Valid Lifetimes < 2 hours.
+ - cap the Preferred Lifetime of PIOs to the "Router Lifetime" value
+ and the Valid Lifetime of PIOs to 48 * Router Lifetime.
+
+=============================================
NetworkManager-1.24
Overview of changes since NetworkManager-1.22
=============================================
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index 0e4a95e68a..e6d6c69905 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -541,6 +541,8 @@ _metagen_con_show_get_fcn (NMC_META_GENERIC_INFO_GET_FCN_ARGS)
if (info->info_type == NMC_GENERIC_INFO_TYPE_CON_SHOW_TIMESTAMP)
return (*out_to_free = g_strdup_printf ("%" G_GUINT64_FORMAT, timestamp));
else {
+ struct tm localtime_result;
+
if (!timestamp) {
if (get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY)
return _("never");
@@ -548,7 +550,7 @@ _metagen_con_show_get_fcn (NMC_META_GENERIC_INFO_GET_FCN_ARGS)
}
timestamp_real = timestamp;
s_mut = g_malloc0 (128);
- strftime (s_mut, 64, "%c", localtime (&timestamp_real));
+ strftime (s_mut, 127, "%c", localtime_r (&timestamp_real, &localtime_result));
return (*out_to_free = s_mut);
}
}
@@ -1449,7 +1451,9 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc)
gboolean was_output = FALSE;
if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "common") == 0) {
+ /* pass */
} else if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "all") == 0) {
+ /* pass */
} else
fields_str = nmc->required_fields;
@@ -2074,6 +2078,7 @@ do_connections_show (const NMCCommand *cmd, NmCli *nmc, int argc, const char *co
if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "common") == 0)
fields_str = NMC_FIELDS_CON_SHOW_COMMON;
else if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "all") == 0) {
+ /* pass */
} else
fields_str = nmc->required_fields;
@@ -6280,7 +6285,7 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
rl_completion_append_character = '.';
} else
generator_func = gen_property_names;
- } else if (num >= 3) {
+ } else {
if (num == 3 && should_complete_files (NULL, line))
rl_attempted_completion_over = 0;
else if (should_complete_vpn_uuids (NULL, line)) {
diff --git a/clients/cli/devices.c b/clients/cli/devices.c
index 7031b43756..2d79d2ae9a 100644
--- a/clients/cli/devices.c
+++ b/clients/cli/devices.c
@@ -1436,6 +1436,7 @@ show_device_info (NMDevice *device, NmCli *nmc)
if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "common") == 0)
fields_str = NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON;
else if (g_ascii_strcasecmp (nmc->required_fields, "all") == 0) {
+ /* pass */
} else
fields_str = nmc->required_fields;
@@ -1749,6 +1750,7 @@ do_devices_status (const NMCCommand *cmd, NmCli *nmc, int argc, const char *cons
if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "common") == 0)
fields_str = "DEVICE,TYPE,STATE,CONNECTION";
else if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "all") == 0) {
+ /* pass */
} else
fields_str = nmc->required_fields;
@@ -3149,6 +3151,7 @@ do_device_wifi_list (const NMCCommand *cmd, NmCli *nmc, int argc, const char *co
if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "common") == 0)
fields_str = NMC_FIELDS_DEV_WIFI_LIST_COMMON;
else if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "all") == 0) {
+ /* pass */
} else
fields_str = nmc->required_fields;
@@ -4651,6 +4654,7 @@ do_device_lldp_list (const NMCCommand *cmd, NmCli *nmc, int argc, const char *co
if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "common") == 0)
fields_str = NMC_FIELDS_DEV_LLDP_LIST_COMMON;
else if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "all") == 0) {
+ /* pass */
} else
fields_str = nmc->required_fields;
diff --git a/clients/cli/general.c b/clients/cli/general.c
index 747203bb06..05ff4dee37 100644
--- a/clients/cli/general.c
+++ b/clients/cli/general.c
@@ -545,7 +545,9 @@ print_permissions (void *user_data)
}
if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "common") == 0) {
+ /* pass */
} else if (g_ascii_strcasecmp (nmc->required_fields, "all") == 0) {
+ /* pass */
} else
fields_str = nmc->required_fields;
@@ -694,7 +696,9 @@ show_general_logging (NmCli *nmc)
};
if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "common") == 0) {
+ /* pass */
} else if (g_ascii_strcasecmp (nmc->required_fields, "all") == 0) {
+ /* pass */
} else
fields_str = nmc->required_fields;
diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c
index 920a5af949..2df48493de 100644
--- a/clients/common/nm-meta-setting-desc.c
+++ b/clients/common/nm-meta-setting-desc.c
@@ -783,6 +783,17 @@ _coerce_str_emptyunset (NMMetaAccessorGetType get_type,
return cstr;
}
+#define RETURN_STR_EMPTYUNSET(get_type, is_default, cstr) \
+ G_STMT_START { \
+ char *_str = NULL; \
+ const char *_cstr; \
+ \
+ _cstr = _coerce_str_emptyunset ((get_type), (is_default), (cstr), &_str); \
+ if (_str) \
+ RETURN_STR_TO_FREE (_str); \
+ RETURN_STR_TEMPORARY (_cstr); \
+ } G_STMT_END
+
static gboolean
_is_default (const NMMetaPropertyInfo *property_info,
NMSetting *setting)
@@ -836,6 +847,19 @@ _get_fcn_gobject_impl (const NMMetaPropertyInfo *property_info,
|| ( gtype_prop == G_TYPE_STRV
&& !glib_handles_str_transform));
+ if (gtype_prop == G_TYPE_STRING) {
+ nm_assert (glib_handles_str_transform);
+ nm_assert (!handle_emptyunset);
+ if ( property_info->property_typ_data
+ && property_info->property_typ_data->subtype.gobject_string.handle_emptyunset) {
+ /* This string property can both be empty and NULL. We need to
+ * signal them differently. */
+ cstr = g_value_get_string (&val);
+ nm_assert ((!!is_default) == (cstr == NULL));
+ RETURN_STR_EMPTYUNSET (get_type, is_default, NULL);
+ }
+ }
+
if (glib_handles_str_transform)
RETURN_STR_TEMPORARY (g_value_get_string (&val));
@@ -857,15 +881,9 @@ _get_fcn_gobject_impl (const NMMetaPropertyInfo *property_info,
if (strv && strv[0])
RETURN_STR_TO_FREE (g_strjoinv (",", (char **) strv));
- /* special hack for handling properties that can be empty and unset
- * (see multilist.clear_emptyunset_fcn). */
if (handle_emptyunset) {
- char *str = NULL;
-
- cstr = _coerce_str_emptyunset (get_type, is_default, NULL, &str);
- if (str)
- RETURN_STR_TO_FREE (str);
- RETURN_STR_TEMPORARY (cstr);
+ /* we need to express empty lists from unset lists differently. */
+ RETURN_STR_EMPTYUNSET (get_type, is_default, NULL);
}
return "";
@@ -1183,6 +1201,22 @@ _set_fcn_gobject_string (ARGS_SET_FCN)
return _gobject_property_reset_default (setting, property_info->property_name);
if (property_info->property_typ_data) {
+ if (property_info->property_typ_data->subtype.gobject_string.handle_emptyunset) {
+ if ( value
+ && value[0]
+ && NM_STRCHAR_ALL (value, ch, ch == ' ')) {
+ /* this string property can both be %NULL and empty. To express that, we coerce
+ * a value of all whitespaces to dropping the first whitespace. That means,
+ * " " gives "", " " gives " ", and so on.
+ *
+ * This way the user can set the string value to "" (meaning NULL) and to
+ * " " (meaning ""), and any other string.
+ *
+ * This is and non-obvious escaping mechanism. But out of all the possible
+ * solutions, it seems the most sensible one. */
+ value++;
+ }
+ }
if (property_info->property_typ_data->subtype.gobject_string.validate_fcn) {
value = property_info->property_typ_data->subtype.gobject_string.validate_fcn (value, &to_free, error);
if (!value)
@@ -3397,35 +3431,6 @@ _objlist_set_fcn_ip_config_routing_rules (NMSetting *setting,
}
static gconstpointer
-_get_fcn_match_interface_name (ARGS_GET_FCN)
-{
- NMSettingMatch *s_match = NM_SETTING_MATCH (setting);
- GString *str = NULL;
- guint i, num;
-
- RETURN_UNSUPPORTED_GET_TYPE ();
-
- num = nm_setting_match_get_num_interface_names (s_match);
- for (i = 0; i < num; i++) {
- const char *name;
-
- name = nm_setting_match_get_interface_name (s_match, i);
- if (!name || !name[0])
- continue;
- if (!str)
- str = g_string_new ("");
- else
- g_string_append_c (str, ESCAPED_TOKENS_WITH_SPACES_DELIMTER);
- nm_utils_escaped_tokens_escape_gstr (name, ESCAPED_TOKENS_WITH_SPACES_DELIMTERS, str);
- }
-
- NM_SET_OUT (out_is_default, num == 0);
- if (!str)
- return NULL;
- RETURN_STR_TO_FREE (g_string_free (str, FALSE));
-}
-
-static gconstpointer
_get_fcn_olpc_mesh_ssid (ARGS_GET_FCN)
{
NMSettingOlpcMesh *s_olpc_mesh = NM_SETTING_OLPC_MESH (setting);
@@ -4905,10 +4910,38 @@ static const NMMetaPropertyInfo *const property_infos_BRIDGE[] = {
.prompt = N_("Group forward mask [0]"),
.property_type = &_pt_gobject_int,
),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_HASH_MAX,
+ .property_type = &_pt_gobject_int,
+ .hide_if_default = TRUE,
+ ),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT,
+ .property_type = &_pt_gobject_int,
+ .hide_if_default = TRUE,
+ ),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL,
+ .property_type = &_pt_gobject_int,
+ .hide_if_default = TRUE,
+ ),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL,
+ .property_type = &_pt_gobject_int,
+ .hide_if_default = TRUE,
+ ),
PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_QUERIER,
.property_type = &_pt_gobject_bool,
.hide_if_default = TRUE,
),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_QUERIER_INTERVAL,
+ .property_type = &_pt_gobject_int,
+ .hide_if_default = TRUE,
+ ),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_QUERY_INTERVAL,
+ .property_type = &_pt_gobject_int,
+ .hide_if_default = TRUE,
+ ),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL,
+ .property_type = &_pt_gobject_int,
+ .hide_if_default = TRUE,
+ ),
PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR,
.property_type = &_pt_gobject_bool,
.hide_if_default = TRUE,
@@ -4919,6 +4952,14 @@ static const NMMetaPropertyInfo *const property_infos_BRIDGE[] = {
.prompt = N_("Enable IGMP snooping [no]"),
.property_type = &_pt_gobject_bool,
),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT,
+ .property_type = &_pt_gobject_int,
+ .hide_if_default = TRUE,
+ ),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL,
+ .property_type = &_pt_gobject_int,
+ .hide_if_default = TRUE,
+ ),
PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_ROUTER,
.property_type = &_pt_gobject_string,
.hide_if_default = TRUE,
@@ -5227,6 +5268,10 @@ static const NMMetaPropertyInfo *const property_infos_CONNECTION[] = {
),
),
),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_CONNECTION_MUD_URL,
+ .property_type = &_pt_gobject_string,
+ .hide_if_default = TRUE,
+ ),
PROPERTY_INFO_WITH_DESC (NM_SETTING_CONNECTION_WAIT_DEVICE_TIMEOUT,
.property_type = &_pt_gobject_int,
),
@@ -6120,11 +6165,7 @@ static const NMMetaPropertyInfo *const property_infos_MACVLAN[] = {
#define _CURRENT_NM_META_SETTING_TYPE NM_META_SETTING_TYPE_MATCH
static const NMMetaPropertyInfo *const property_infos_MATCH[] = {
PROPERTY_INFO_WITH_DESC (NM_SETTING_MATCH_INTERFACE_NAME,
- .property_type = DEFINE_PROPERTY_TYPE (
- .get_fcn = _get_fcn_match_interface_name,
- .set_fcn = _set_fcn_multilist,
- .set_supports_remove = TRUE,
- ),
+ .property_type = &_pt_multilist,
.property_typ_data = DEFINE_PROPERTY_TYP_DATA (
PROPERTY_TYP_DATA_SUBTYPE (multilist,
.get_num_fcn_u = MULTILIST_GET_NUM_FCN_U (NMSettingMatch, nm_setting_match_get_num_interface_names),
@@ -6135,6 +6176,30 @@ static const NMMetaPropertyInfo *const property_infos_MATCH[] = {
),
),
),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_MATCH_KERNEL_COMMAND_LINE,
+ .property_type = &_pt_multilist,
+ .property_typ_data = DEFINE_PROPERTY_TYP_DATA (
+ PROPERTY_TYP_DATA_SUBTYPE (multilist,
+ .get_num_fcn_u = MULTILIST_GET_NUM_FCN_U (NMSettingMatch, nm_setting_match_get_num_kernel_command_lines),
+ .add2_fcn = MULTILIST_ADD2_FCN (NMSettingMatch, nm_setting_match_add_kernel_command_line),
+ .remove_by_idx_fcn_u = MULTILIST_REMOVE_BY_IDX_FCN_U (NMSettingMatch, nm_setting_match_remove_kernel_command_line),
+ .remove_by_value_fcn = MULTILIST_REMOVE_BY_VALUE_FCN (NMSettingMatch, nm_setting_match_remove_kernel_command_line_by_value),
+ .strsplit_with_spaces = TRUE,
+ ),
+ ),
+ ),
+ PROPERTY_INFO_WITH_DESC (NM_SETTING_MATCH_DRIVER,
+ .property_type = &_pt_multilist,
+ .property_typ_data = DEFINE_PROPERTY_TYP_DATA (
+ PROPERTY_TYP_DATA_SUBTYPE (multilist,
+ .get_num_fcn_u = MULTILIST_GET_NUM_FCN_U (NMSettingMatch, nm_setting_match_get_num_drivers),
+ .add2_fcn = MULTILIST_ADD2_FCN (NMSettingMatch, nm_setting_match_add_driver),
+ .remove_by_idx_fcn_u = MULTILIST_REMOVE_BY_IDX_FCN_U (NMSettingMatch, nm_setting_match_remove_driver),
+ .remove_by_value_fcn = MULTILIST_REMOVE_BY_VALUE_FCN (NMSettingMatch, nm_setting_match_remove_driver_by_value),
+ .strsplit_with_spaces = TRUE,
+ ),
+ ),
+ ),
NULL
};
diff --git a/clients/common/nm-meta-setting-desc.h b/clients/common/nm-meta-setting-desc.h
index 2ba48f5de2..639f4200e3 100644
--- a/clients/common/nm-meta-setting-desc.h
+++ b/clients/common/nm-meta-setting-desc.h
@@ -257,6 +257,7 @@ struct _NMMetaPropertyTypData {
} gobject_int;
struct {
const char *(*validate_fcn) (const char *value, char **out_to_free, GError **error);
+ bool handle_emptyunset:1;
} gobject_string;
struct {
bool legacy_format:1;
diff --git a/clients/common/nm-secret-agent-simple.c b/clients/common/nm-secret-agent-simple.c
index ca9250ca6f..53217e6f33 100644
--- a/clients/common/nm-secret-agent-simple.c
+++ b/clients/common/nm-secret-agent-simple.c
@@ -422,7 +422,7 @@ add_vpn_secrets (RequestData *request,
char **msg)
{
NMSettingVpn *s_vpn = nm_connection_get_setting_vpn (request->connection);
- const VpnPasswordName *secret_names, *p;
+ const NmcVpnPasswordName *p;
const char *vpn_msg = NULL;
char **iter;
@@ -439,7 +439,7 @@ add_vpn_secrets (RequestData *request,
NM_SET_OUT (msg, g_strdup (vpn_msg));
/* Now add what client thinks might be required, because hints may be empty or incomplete */
- p = secret_names = nm_vpn_get_secret_names (nm_setting_vpn_get_service_type (s_vpn));
+ p = nm_vpn_get_secret_names (nm_setting_vpn_get_service_type (s_vpn));
while (p && p->name) {
add_vpn_secret_helper (secrets, s_vpn, p->name, _(p->ui_name));
p++;
diff --git a/clients/common/nm-vpn-helpers.c b/clients/common/nm-vpn-helpers.c
index 35ed445187..fbcb06479d 100644
--- a/clients/common/nm-vpn-helpers.c
+++ b/clients/common/nm-vpn-helpers.c
@@ -103,63 +103,73 @@ nm_vpn_supports_ipv6 (NMConnection *connection)
return NM_FLAGS_HAS (capabilities, NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6);
}
-const VpnPasswordName *
+const NmcVpnPasswordName *
nm_vpn_get_secret_names (const char *service_type)
{
- static const VpnPasswordName generic_vpn_secrets[] = {
- { "password", N_("Password") },
- { 0 }
- };
- static const VpnPasswordName openvpn_secrets[] = {
- { "password", N_("Password") },
- { "cert-pass", N_("Certificate password") },
- { "http-proxy-password", N_("HTTP proxy password") },
- { 0 }
- };
- static const VpnPasswordName vpnc_secrets[] = {
- { "Xauth password", N_("Password") },
- { "IPSec secret", N_("Group password") },
- { 0 }
- };
- static const VpnPasswordName swan_secrets[] = {
- { "xauthpassword", N_("Password") },
- { "pskvalue", N_("Group password") },
- { 0 }
- };
- static const VpnPasswordName openconnect_secrets[] = {
- { "gateway", N_("Gateway") },
- { "cookie", N_("Cookie") },
- { "gwcert", N_("Gateway certificate hash") },
- { 0 }
- };
const char *type;
if (!service_type)
return NULL;
- if ( !g_str_has_prefix (service_type, NM_DBUS_INTERFACE)
+ if ( !NM_STR_HAS_PREFIX (service_type, NM_DBUS_INTERFACE)
|| service_type[NM_STRLEN (NM_DBUS_INTERFACE)] != '.') {
/* all our well-known, hard-coded vpn-types start with NM_DBUS_INTERFACE. */
return NULL;
}
type = service_type + (NM_STRLEN (NM_DBUS_INTERFACE) + 1);
- if ( !g_strcmp0 (type, "pptp")
- || !g_strcmp0 (type, "iodine")
- || !g_strcmp0 (type, "ssh")
- || !g_strcmp0 (type, "l2tp")
- || !g_strcmp0 (type, "fortisslvpn"))
- return generic_vpn_secrets;
- else if (!g_strcmp0 (type, "openvpn"))
- return openvpn_secrets;
- else if (!g_strcmp0 (type, "vpnc"))
- return vpnc_secrets;
- else if ( !g_strcmp0 (type, "openswan")
- || !g_strcmp0 (type, "libreswan")
- || !g_strcmp0 (type, "strongswan"))
- return swan_secrets;
- else if (!g_strcmp0 (type, "openconnect"))
- return openconnect_secrets;
+
+#define _VPN_PASSWORD_LIST(...) \
+ ({ \
+ static const NmcVpnPasswordName _arr[] = { \
+ __VA_ARGS__ \
+ { 0 }, \
+ }; \
+ _arr; \
+ })
+
+ if (NM_IN_STRSET (type, "pptp",
+ "iodine",
+ "ssh",
+ "l2tp",
+ "fortisslvpn")) {
+ return _VPN_PASSWORD_LIST (
+ { "password", N_("Password") },
+ );
+ }
+
+ if (NM_IN_STRSET (type, "openvpn")) {
+ return _VPN_PASSWORD_LIST (
+ { "password", N_("Password") },
+ { "cert-pass", N_("Certificate password") },
+ { "http-proxy-password", N_("HTTP proxy password") },
+ );
+ }
+
+ if (NM_IN_STRSET (type, "vpnc")) {
+ return _VPN_PASSWORD_LIST (
+ { "Xauth password", N_("Password") },
+ { "IPSec secret", N_("Group password") },
+ );
+ };
+
+ if (NM_IN_STRSET (type, "openswan",
+ "libreswan",
+ "strongswan")) {
+ return _VPN_PASSWORD_LIST (
+ { "xauthpassword", N_("Password") },
+ { "pskvalue", N_("Group password") },
+ );
+ };
+
+ if (NM_IN_STRSET (type, "openconnect")) {
+ return _VPN_PASSWORD_LIST (
+ { "gateway", N_("Gateway") },
+ { "cookie", N_("Cookie") },
+ { "gwcert", N_("Gateway certificate hash") },
+ );
+ };
+
return NULL;
}
diff --git a/clients/common/nm-vpn-helpers.h b/clients/common/nm-vpn-helpers.h
index 611f09dd41..f401c6341d 100644
--- a/clients/common/nm-vpn-helpers.h
+++ b/clients/common/nm-vpn-helpers.h
@@ -9,7 +9,7 @@
typedef struct {
const char *name;
const char *ui_name;
-} VpnPasswordName;
+} NmcVpnPasswordName;
GSList *nm_vpn_get_plugin_infos (void);
@@ -17,7 +17,7 @@ NMVpnEditorPlugin *nm_vpn_get_editor_plugin (const char *service_type, GError **
gboolean nm_vpn_supports_ipv6 (NMConnection *connection);
-const VpnPasswordName * nm_vpn_get_secret_names (const char *service_type);
+const NmcVpnPasswordName *nm_vpn_get_secret_names (const char *service_type);
gboolean nm_vpn_openconnect_authenticate_helper (const char *host,
char **cookie,
diff --git a/clients/common/settings-docs.h.in b/clients/common/settings-docs.h.in
index 7e8fdd7b66..b51d0a1ecf 100644
--- a/clients/common/settings-docs.h.in
+++ b/clients/common/settings-docs.h.in
@@ -119,10 +119,19 @@
#define DESCRIBE_DOC_NM_SETTING_BRIDGE_HELLO_TIME N_("The Spanning Tree Protocol (STP) hello time, in seconds.")
#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MAC_ADDRESS N_("If specified, the MAC address of bridge. When creating a new bridge, this MAC address will be set. If this field is left unspecified, the \"ethernet.cloned-mac-address\" is referred instead to generate the initial MAC address. Note that setting \"ethernet.cloned-mac-address\" anyway overwrites the MAC address of the bridge later while activating the bridge. Hence, this property is deprecated. Deprecated: 1")
#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MAX_AGE N_("The Spanning Tree Protocol (STP) maximum message age, in seconds.")
+#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_HASH_MAX N_("Set maximum size of multicast hash table (value must be a power of 2).")
+#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT N_("Set the number of queries the bridge will send before stopping forwarding a multicast group after a \"leave\" message has been received.")
+#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL N_("Set interval (in deciseconds) between queries to find remaining members of a group, after a \"leave\" message is received.")
+#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL N_("Set delay (in deciseconds) after which the bridge will leave a group, if no membership reports for this group are received.")
#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_QUERIER N_("Enable or disable sending of multicast queries by the bridge. If not specified the option is disabled.")
+#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_QUERIER_INTERVAL N_("If no queries are seen after this delay (in deciseconds) has passed, the bridge will start to send its own queries.")
+#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_QUERY_INTERVAL N_("Interval (in deciseconds) between queries sent by the bridge after the end of the startup phase.")
+#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL N_("Set the Max Response Time/Max Response Delay (in deciseconds) for IGMP/MLD queries sent by the bridge.")
#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR N_("If enabled the bridge's own IP address is used as the source address for IGMP queries otherwise the default of 0.0.0.0 is used.")
#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_ROUTER N_("Sets bridge's multicast router. multicast-snooping must be enabled for this option to work. Supported values are: 'auto', 'disabled', 'enabled'. If not specified the default value is 'auto'.")
#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_SNOOPING N_("Controls whether IGMP snooping is enabled for this bridge. Note that if snooping was automatically disabled due to hash collisions, the system may refuse to enable the feature until the collisions are resolved.")
+#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT N_("Set the number of IGMP queries to send during startup phase.")
+#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL N_("Sets the time (in deciseconds) between queries sent out at startup to determine membership information.")
#define DESCRIBE_DOC_NM_SETTING_BRIDGE_PRIORITY N_("Sets the Spanning Tree Protocol (STP) priority for this bridge. Lower values are \"better\"; the lowest priority bridge will be elected the root bridge.")
#define DESCRIBE_DOC_NM_SETTING_BRIDGE_STP N_("Controls whether Spanning Tree Protocol (STP) is enabled for this bridge.")
#define DESCRIBE_DOC_NM_SETTING_BRIDGE_VLAN_DEFAULT_PVID N_("The default PVID for the ports of the bridge, that is the VLAN id assigned to incoming untagged frames.")
@@ -152,6 +161,7 @@
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_MASTER N_("Interface name of the master device or UUID of the master connection.")
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_MDNS N_("Whether mDNS is enabled for the connection. The permitted values are: \"yes\" (2) register hostname and resolving for the connection, \"no\" (0) disable mDNS for the interface, \"resolve\" (1) do not register hostname but allow resolving of mDNS host names and \"default\" (-1) to allow lookup of a global default in NetworkManager.conf. If unspecified, \"default\" ultimately depends on the DNS plugin (which for systemd-resolved currently means \"no\"). This feature requires a plugin which supports mDNS. Otherwise the setting has no effect. One such plugin is dns-systemd-resolved.")
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_METERED N_("Whether the connection is metered. When updating this property on a currently activated connection, the change takes effect immediately.")
+#define DESCRIBE_DOC_NM_SETTING_CONNECTION_MUD_URL N_("If configured, set to a Manufacturer Usage Description (MUD) URL that points to manufacturer-recommended network policies for IoT devices. It is transmitted as a DHCPv4 or DHCPv6 option. The value must be a valid URL starting with \"https://\". The special value \"none\" is allowed to indicate that no MUD URL is used. If the per-profile value is unspecified (the default), a global connection default gets consulted. If still unspecified, the ultimate default is \"none\".")
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_MULTI_CONNECT N_("Specifies whether the profile can be active multiple times at a particular moment. The value is of type NMConnectionMultiConnect.")
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_PERMISSIONS N_("An array of strings defining what access a given user has to this connection. If this is NULL or empty, all users are allowed to access this connection; otherwise users are allowed if and only if they are in this list. When this is not empty, the connection can be active only when one of the specified users is logged into an active session. Each entry is of the form \"[type]:[id]:[reserved]\"; for example, \"user:dcbw:blah\". At this time only the \"user\" [type] is allowed. Any other values are ignored and reserved for future use. [id] is the username that this permission refers to, which may not contain the \":\" character. Any [reserved] information present must be ignored and is reserved for future use. All of [type], [id], and [reserved] must be valid UTF-8.")
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_READ_ONLY N_("FALSE if the connection can be modified using the provided settings service's D-Bus interface with the right privileges, or TRUE if the connection is read-only and cannot be modified.")
@@ -270,7 +280,9 @@
#define DESCRIBE_DOC_NM_SETTING_MACVLAN_PARENT N_("If given, specifies the parent interface name or parent connection UUID from which this MAC-VLAN interface should be created. If this property is not specified, the connection must contain an \"802-3-ethernet\" setting with a \"mac-address\" property.")
#define DESCRIBE_DOC_NM_SETTING_MACVLAN_PROMISCUOUS N_("Whether the interface should be put in promiscuous mode.")
#define DESCRIBE_DOC_NM_SETTING_MACVLAN_TAP N_("Whether the interface should be a MACVTAP.")
+#define DESCRIBE_DOC_NM_SETTING_MATCH_DRIVER N_("A list of driver names to match. Each element is a shell wildcard pattern. When an element is prefixed with exclamation mark (!) the condition is inverted. A candidate driver name is considered matching when both these conditions are satisfied: (a) any of the elements not prefixed with '!' matches or there aren't such elements; (b) none of the elements prefixed with '!' match.")
#define DESCRIBE_DOC_NM_SETTING_MATCH_INTERFACE_NAME N_("A list of interface names to match. Each element is a shell wildcard pattern. When an element is prefixed with exclamation mark (!) the condition is inverted. A candidate interface name is considered matching when both these conditions are satisfied: (a) any of the elements not prefixed with '!' matches or there aren't such elements; (b) none of the elements prefixed with '!' match.")
+#define DESCRIBE_DOC_NM_SETTING_MATCH_KERNEL_COMMAND_LINE N_("A list of kernel command line arguments to match. This may be used to check whether a specific kernel command line option is set (or if prefixed with the exclamation mark unset). The argument must either be a single word, or an assignment (i.e. two words, separated \"=\"). In the former case the kernel command line is searched for the word appearing as is, or as left hand side of an assignment. In the latter case, the exact assignment is looked for with right and left hand side matching.")
#define DESCRIBE_DOC_NM_SETTING_OVS_BRIDGE_DATAPATH_TYPE N_("The data path type. One of \"system\", \"netdev\" or empty.")
#define DESCRIBE_DOC_NM_SETTING_OVS_BRIDGE_FAIL_MODE N_("The bridge failure mode. One of \"secure\", \"standalone\" or empty.")
#define DESCRIBE_DOC_NM_SETTING_OVS_BRIDGE_MCAST_SNOOPING_ENABLE N_("Enable or disable multicast snooping.")
diff --git a/configure.ac b/configure.ac
index 2453818850..2d5e7241c8 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], [24])
-m4_define([nm_micro_version], [0])
+m4_define([nm_minor_version], [25])
+m4_define([nm_micro_version], [1])
m4_define([nm_version],
[nm_major_version.nm_minor_version.nm_micro_version])
diff --git a/contrib/fedora/rpm/build.sh b/contrib/fedora/rpm/build.sh
index f2c4cda18d..fa3aec7901 100755
--- a/contrib/fedora/rpm/build.sh
+++ b/contrib/fedora/rpm/build.sh
@@ -226,3 +226,10 @@ else
LOG
fi
+if [[ "$DO_RELEASE" == 1 ]]; then
+ LOG "RELEASE \"$SOURCE\" :"
+ for c in md5 sha1 sha256 sha512; do
+ LOG "$(printf '%8s: %s' "$c" $("${c}sum" "$SOURCE" | sed 's/ .*//'))"
+ done
+ LOG
+fi
diff --git a/contrib/fedora/rpm/build_clean.sh b/contrib/fedora/rpm/build_clean.sh
index e5eb3ea15e..776e4c4df6 100755
--- a/contrib/fedora/rpm/build_clean.sh
+++ b/contrib/fedora/rpm/build_clean.sh
@@ -44,6 +44,7 @@ NO_DIST=0
WITH_LIST=()
SOURCE_FROM_GIT=0
SNAPSHOT="$NM_BUILD_SNAPSHOT"
+DO_RELEASE=0
ADD_WITH_TEST=1
@@ -64,6 +65,7 @@ while [[ $# -gt 0 ]]; do
[[ $NARGS -eq 1 ]] || die "--release option must be alone"
export NMTST_CHECK_GTK_DOC=1
BUILDTYPE=SRPM
+ DO_RELEASE=1
;;
-c|--clean)
GIT_CLEAN=1
@@ -173,6 +175,7 @@ export SOURCE_FROM_GIT
export BUILDTYPE
export NM_RPMBUILD_ARGS="${WITH_LIST[@]}"
export SNAPSHOT
+export DO_RELEASE
"$SCRIPTDIR"/build.sh
diff --git a/dispatcher/nm-dispatcher.conf b/dispatcher/nm-dispatcher.conf
index fd2f0e5a42..d6f31135e8 100644
--- a/dispatcher/nm-dispatcher.conf
+++ b/dispatcher/nm-dispatcher.conf
@@ -2,13 +2,12 @@
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
- <policy user="root">
- <allow own="org.freedesktop.nm_dispatcher"/>
- <allow send_destination="org.freedesktop.nm_dispatcher"/>
+ <policy user="root">
+ <allow own="org.freedesktop.nm_dispatcher"/>
+ <allow send_destination="org.freedesktop.nm_dispatcher"/>
</policy>
<policy context="default">
- <deny own="org.freedesktop.nm_dispatcher"/>
- <deny send_destination="org.freedesktop.nm_dispatcher"/>
+ <deny own="org.freedesktop.nm_dispatcher"/>
+ <deny send_destination="org.freedesktop.nm_dispatcher"/>
</policy>
</busconfig>
-
diff --git a/examples/C/glib/list-connections-libnm.c b/examples/C/glib/list-connections-libnm.c
index 77d5dfb729..7bed0c014e 100644
--- a/examples/C/glib/list-connections-libnm.c
+++ b/examples/C/glib/list-connections-libnm.c
@@ -30,10 +30,15 @@ show_connection (NMConnection *connection)
s_con = nm_connection_get_setting_connection (connection);
if (s_con) {
+ struct tm localtime_data;
+
/* Get various info from NMSettingConnection and show it */
timestamp = nm_setting_connection_get_timestamp (s_con);
timestamp_str = g_strdup_printf ("%" G_GUINT64_FORMAT, timestamp);
- strftime (timestamp_real_str, sizeof (timestamp_real_str), "%c", localtime ((time_t *) &timestamp));
+ strftime (timestamp_real_str,
+ sizeof (timestamp_real_str),
+ "%c",
+ localtime_r ((time_t *) &timestamp, &localtime_data));
val1 = nm_setting_connection_get_id (s_con);
val2 = nm_setting_connection_get_uuid (s_con);
diff --git a/examples/python/dbus/checkpoint.py b/examples/python/dbus/checkpoint.py
index 62c7573b8c..1ea1b1a7fc 100755
--- a/examples/python/dbus/checkpoint.py
+++ b/examples/python/dbus/checkpoint.py
@@ -41,7 +41,7 @@ devList = []
for arg in sys.argv[2:]:
path = GetDevicePath(arg)
- if path == None:
+ if path is None:
raise Exception("NetworkManager knows nothing about %s" % arg)
else:
devList.append(path)
diff --git a/examples/python/dbus/get-active-connection-uuids.py b/examples/python/dbus/get-active-connection-uuids.py
index 8d0e5c15e7..dd168c0aab 100755
--- a/examples/python/dbus/get-active-connection-uuids.py
+++ b/examples/python/dbus/get-active-connection-uuids.py
@@ -4,7 +4,7 @@
# Copyright (C) 2010 Red Hat, Inc.
#
-import dbus, sys
+import dbus
# This example takes a device interface name as a parameter and tells
# NetworkManager to disconnect that device, closing down any network
diff --git a/examples/python/dbus/list-devices.py b/examples/python/dbus/list-devices.py
index 4a9ebe4e53..aebc902bbe 100755
--- a/examples/python/dbus/list-devices.py
+++ b/examples/python/dbus/list-devices.py
@@ -4,7 +4,7 @@
# Copyright (C) 2011 - 2012 Red Hat, Inc.
#
-import dbus, sys
+import dbus
# This example lists basic information about network interfaces known to NM
diff --git a/examples/python/dbus/vpn.py b/examples/python/dbus/vpn.py
index 8939d26206..14fa2f1d2e 100755
--- a/examples/python/dbus/vpn.py
+++ b/examples/python/dbus/vpn.py
@@ -56,7 +56,6 @@ def get_active_connection_path(uuid):
proxy = bus.get_object('org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager')
iface = dbus.Interface(proxy, dbus_interface='org.freedesktop.DBus.Properties')
active_connections = iface.Get('org.freedesktop.NetworkManager', 'ActiveConnections')
- all_connections = get_connections()
for a in active_connections:
proxy = bus.get_object('org.freedesktop.NetworkManager', a)
diff --git a/examples/python/dbus/wifi-active-ap.py b/examples/python/dbus/wifi-active-ap.py
index 78673e76a2..b81c06a933 100755
--- a/examples/python/dbus/wifi-active-ap.py
+++ b/examples/python/dbus/wifi-active-ap.py
@@ -5,13 +5,13 @@
#
#
-# This example starts or stops a wifi hotspot
+# This example prints the current wifi access point
#
# Configuration settings are described at
# https://developer.gnome.org/NetworkManager/1.0/ref-settings.html
#
-import dbus, sys, time
+import dbus, sys
bus = dbus.SystemBus()
service_name = "org.freedesktop.NetworkManager"
diff --git a/examples/python/gi/checkpoint.py b/examples/python/gi/checkpoint.py
index b3b4e0f8a5..a695a64613 100755
--- a/examples/python/gi/checkpoint.py
+++ b/examples/python/gi/checkpoint.py
@@ -10,8 +10,6 @@ import gi
gi.require_version('NM', '1.0')
from gi.repository import GLib, NM
-import os
-
###############################################################################
def usage():
@@ -136,7 +134,7 @@ def do_adjust_rollback_timeout(client):
sys.exit("Missing timeout")
try:
add_timeout = int(sys.argv[3])
- except:
+ except Exception:
sys.exit("Invalid timeout")
path = validate_path(sys.argv[2], client)
diff --git a/examples/python/gi/deactivate-all.py b/examples/python/gi/deactivate-all.py
index 3af350e4c3..7e528d0b3e 100755
--- a/examples/python/gi/deactivate-all.py
+++ b/examples/python/gi/deactivate-all.py
@@ -57,7 +57,7 @@ if __name__ == "__main__":
# deactivate the connections
for ac in connections:
- if ctype == None or ctype == ac.get_connection_type():
+ if ctype is None or ctype == ac.get_connection_type():
sys.stdout.write("Deactivating %s (%s)" % (ac.get_id(), ac.get_uuid()))
try:
client.deactivate_connection(ac, None)
diff --git a/examples/python/gi/dns.py b/examples/python/gi/dns.py
index f93f97e514..da2a6a6c43 100755
--- a/examples/python/gi/dns.py
+++ b/examples/python/gi/dns.py
@@ -4,7 +4,6 @@
# Copyright (C) 2016 Red Hat, Inc.
#
-import sys
import gi
gi.require_version('NM', '1.0')
from gi.repository import GLib, NM
diff --git a/examples/python/gi/get-active-connections.py b/examples/python/gi/get-active-connections.py
index 072f245ab0..6da8b61890 100755
--- a/examples/python/gi/get-active-connections.py
+++ b/examples/python/gi/get-active-connections.py
@@ -8,7 +8,7 @@
import gi
gi.require_version('NM', '1.0')
-from gi.repository import GLib, NM
+from gi.repository import NM
if __name__ == "__main__":
client = NM.Client.new(None)
diff --git a/examples/python/gi/get-devices.py b/examples/python/gi/get-devices.py
index 113d384b30..88bcc8945b 100755
--- a/examples/python/gi/get-devices.py
+++ b/examples/python/gi/get-devices.py
@@ -8,7 +8,7 @@
import gi
gi.require_version('NM', '1.0')
-from gi.repository import GLib, NM
+from gi.repository import NM
if __name__ == "__main__":
client = NM.Client.new(None)
diff --git a/examples/python/gi/get-interface-flags.py b/examples/python/gi/get-interface-flags.py
index 756999169b..e1d1721a4f 100755
--- a/examples/python/gi/get-interface-flags.py
+++ b/examples/python/gi/get-interface-flags.py
@@ -6,7 +6,7 @@
import gi
gi.require_version('NM', '1.0')
-from gi.repository import GLib, NM
+from gi.repository import NM
if __name__ == "__main__":
client = NM.Client.new(None)
diff --git a/examples/python/gi/get_ips.py b/examples/python/gi/get_ips.py
index 13b0a8b6db..75be2f8c5d 100755
--- a/examples/python/gi/get_ips.py
+++ b/examples/python/gi/get_ips.py
@@ -7,7 +7,7 @@
import sys, socket
import gi
gi.require_version('NM', '1.0')
-from gi.repository import GLib, NM
+from gi.repository import NM
#
# This example shows how to get addresses, routes and DNS information
diff --git a/examples/python/gi/nm-add-connection2.py b/examples/python/gi/nm-add-connection2.py
index 01c1ae7bd9..c5ec3f3bbe 100755
--- a/examples/python/gi/nm-add-connection2.py
+++ b/examples/python/gi/nm-add-connection2.py
@@ -5,7 +5,6 @@
#
import sys
-import re
import gi
gi.require_version('NM', '1.0')
diff --git a/examples/python/gi/nm-update2.py b/examples/python/gi/nm-update2.py
index 5a65879371..23e277c78d 100755
--- a/examples/python/gi/nm-update2.py
+++ b/examples/python/gi/nm-update2.py
@@ -5,7 +5,6 @@
#
import sys
-import re
import gi
gi.require_version('NM', '1.0')
diff --git a/examples/python/gi/nm-wg-set b/examples/python/gi/nm-wg-set
index ca31ac7207..1f5279ee69 100755
--- a/examples/python/gi/nm-wg-set
+++ b/examples/python/gi/nm-wg-set
@@ -58,7 +58,6 @@
# nm-wg-set id "$PROFILE" $WG_ARGS
import sys
-import re
import os
import gi
@@ -443,7 +442,7 @@ if __name__ == '__main__':
secrets = conn.get_secrets(NM.SETTING_WIREGUARD_SETTING_NAME)
if secrets:
conn.update_secrets(NM.SETTING_WIREGUARD_SETTING_NAME, secrets)
- except:
+ except Exception:
pass
if not argv:
diff --git a/examples/python/gi/wifi-p2p.py b/examples/python/gi/wifi-p2p.py
new file mode 100755
index 0000000000..804df34c89
--- /dev/null
+++ b/examples/python/gi/wifi-p2p.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2020 Red Hat, Inc.
+
+# This example performs a scan of Wi-Fi P2P peers and connects to one
+# of them.
+
+import sys
+import uuid
+import gi
+gi.require_version('NM', '1.0')
+from gi.repository import GLib, NM
+
+main_loop = None
+client = None
+
+def create_profile(name, peer_mac):
+ profile = NM.SimpleConnection.new()
+
+ s_con = NM.SettingConnection.new()
+ s_con.set_property(NM.SETTING_CONNECTION_ID, name)
+ s_con.set_property(NM.SETTING_CONNECTION_UUID, str(uuid.uuid4()))
+ s_con.set_property(NM.SETTING_CONNECTION_TYPE, "wifi-p2p")
+ s_con.set_property(NM.SETTING_CONNECTION_AUTOCONNECT, False)
+
+ s_ip4 = NM.SettingIP4Config.new()
+ s_ip4.set_property(NM.SETTING_IP_CONFIG_METHOD, "auto")
+
+ s_ip6 = NM.SettingIP6Config.new()
+ s_ip6.set_property(NM.SETTING_IP_CONFIG_METHOD, "auto")
+
+ s_wifi_p2p = NM.SettingWifiP2P.new()
+ s_wifi_p2p.set_property(NM.SETTING_WIFI_P2P_PEER, peer_mac)
+ s_wifi_p2p.set_property(NM.SETTING_WIFI_P2P_WFD_IES,
+ GLib.Bytes.new(b'\x00\x00\x06\x00\x90\x1c\x44\x00\xc8'))
+
+ profile.add_setting(s_con)
+ profile.add_setting(s_ip4)
+ profile.add_setting(s_ip6)
+ profile.add_setting(s_wifi_p2p)
+
+ return profile
+
+def activated_cb(client, result, data):
+ try:
+ client.add_and_activate_connection2_finish(result)
+ print(" * Connection profile activated successfully")
+ except Exception as e:
+ sys.stderr.write("Error: %s\n" % e)
+ main_loop.quit()
+
+def scan_timeout_cb(device):
+ peers = device.get_peers()
+ if len(peers) == 0:
+ main_loop.quit()
+ sys.exit("No peer found")
+
+ print("\n {:20} {:30} {:3} {:30}".format("MAC", "Name", "Sig", "Wfd-IEs"));
+ for p in peers:
+ if p.get_wfd_ies() is not None:
+ ies = p.get_wfd_ies().get_data().hex()
+ else:
+ ies = ""
+ print(" {:20} {:30} {:3} {:30}".format(p.get_hw_address(),
+ p.get_name(),
+ p.get_strength(),
+ ies))
+ print("")
+
+ # Connect to first peer
+ profile = create_profile('P2P-connection', peers[0].get_hw_address())
+ client.add_and_activate_connection2(profile,
+ device,
+ "/",
+ GLib.Variant('a{sv}', {}),
+ None,
+ activated_cb,
+ None)
+ print(" * Connecting to peer {} using profile '{}'".format(peers[0].get_hw_address(),
+ profile.get_id()))
+
+def start_find_cb(device, async_result, user_data):
+ try:
+ device.start_find_finish(async_result)
+ except Exception as e:
+ sys.stderr.write("Error: %s\n" % e)
+ main_loop.quit()
+
+ print(" * Scanning on device {}...".format(device.get_iface()));
+ GLib.timeout_add(10000, scan_timeout_cb, device)
+
+if __name__ == "__main__":
+ client = NM.Client.new(None)
+ device = None
+
+ devices = client.get_devices()
+ for d in devices:
+ if d.get_device_type() == NM.DeviceType.WIFI_P2P:
+ device = d
+ break
+
+ if device is None:
+ sys.exit("No Wi-Fi P2P device found")
+
+ device.start_find(GLib.Variant('a{sv}', {}), None, start_find_cb, None)
+
+ main_loop = GLib.MainLoop()
+ main_loop.run()
diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h
index ef9e982bf6..57f46f94be 100644
--- a/libnm-core/nm-core-internal.h
+++ b/libnm-core/nm-core-internal.h
@@ -78,24 +78,82 @@
#include "nm-libnm-core-intern/nm-libnm-core-utils.h"
/* IEEE 802.1D-1998 timer values */
-#define NM_BR_MIN_HELLO_TIME 1
-#define NM_BR_MAX_HELLO_TIME 10
+#define NM_BRIDGE_HELLO_TIME_MIN 1u
+#define NM_BRIDGE_HELLO_TIME_DEF 2u
+#define NM_BRIDGE_HELLO_TIME_MAX 10u
-#define NM_BR_MIN_FORWARD_DELAY 2
-#define NM_BR_MAX_FORWARD_DELAY 30
+#define NM_BRIDGE_FORWARD_DELAY_MIN 2u
+#define NM_BRIDGE_FORWARD_DELAY_DEF 15u
+#define NM_BRIDGE_FORWARD_DELAY_MAX 30u
-#define NM_BR_MIN_MAX_AGE 6
-#define NM_BR_MAX_MAX_AGE 40
+#define NM_BRIDGE_MAX_AGE_MIN 6u
+#define NM_BRIDGE_MAX_AGE_DEF 20u
+#define NM_BRIDGE_MAX_AGE_MAX 40u
/* IEEE 802.1D-1998 Table 7.4 */
-#define NM_BR_MIN_AGEING_TIME 0
-#define NM_BR_MAX_AGEING_TIME 1000000
+#define NM_BRIDGE_AGEING_TIME_MIN 0u
+#define NM_BRIDGE_AGEING_TIME_DEF 300u
+#define NM_BRIDGE_AGEING_TIME_MAX 1000000u
-#define NM_BR_PORT_MAX_PRIORITY 63
-#define NM_BR_PORT_DEF_PRIORITY 32
+#define NM_BRIDGE_PORT_PRIORITY_MIN 0u
+#define NM_BRIDGE_PORT_PRIORITY_DEF 32u
+#define NM_BRIDGE_PORT_PRIORITY_MAX 63u
-#define NM_BR_PORT_MAX_PATH_COST 65535
-#define NM_BR_PORT_DEF_PATH_COST 100
+#define NM_BRIDGE_PORT_PATH_COST_MIN 0u
+#define NM_BRIDGE_PORT_PATH_COST_DEF 100u
+#define NM_BRIDGE_PORT_PATH_COST_MAX 65535u
+
+#define NM_BRIDGE_MULTICAST_HASH_MAX_MIN 1u
+#define NM_BRIDGE_MULTICAST_HASH_MAX_DEF 4096u
+#define NM_BRIDGE_MULTICAST_HASH_MAX_MAX ((guint) G_MAXUINT32)
+
+#define NM_BRIDGE_STP_DEF TRUE
+
+#define NM_BRIDGE_PRIORITY_MIN 0u
+#define NM_BRIDGE_PRIORITY_DEF 0x8000u
+#define NM_BRIDGE_PRIORITY_MAX ((guint) G_MAXUINT16)
+
+#define NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_MIN 0u
+#define NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_DEF 2u
+#define NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_MAX ((guint) G_MAXUINT32)
+
+#define NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_MIN ((guint64) 0)
+#define NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_DEF ((guint64) 100)
+#define NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_MAX G_MAXUINT64
+
+#define NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_MIN ((guint64) 0)
+#define NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_DEF ((guint64) 26000)
+#define NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_MAX G_MAXUINT64
+
+#define NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_MIN ((guint64) 0)
+#define NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_DEF ((guint64) 25500)
+#define NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_MAX G_MAXUINT64
+
+#define NM_BRIDGE_MULTICAST_QUERIER_DEF FALSE
+
+#define NM_BRIDGE_MULTICAST_QUERY_INTERVAL_MIN ((guint64) 0)
+#define NM_BRIDGE_MULTICAST_QUERY_INTERVAL_DEF ((guint64) 12500)
+#define NM_BRIDGE_MULTICAST_QUERY_INTERVAL_MAX G_MAXUINT64
+
+#define NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_MIN ((guint64) 0)
+#define NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_DEF ((guint64) 1000)
+#define NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_MAX G_MAXUINT64
+
+#define NM_BRIDGE_MULTICAST_QUERY_USE_IFADDR_DEF FALSE
+
+#define NM_BRIDGE_MULTICAST_SNOOPING_DEF TRUE
+
+#define NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_MIN 0u
+#define NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_DEF 2u
+#define NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_MAX ((guint) G_MAXUINT32)
+
+#define NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_MIN ((guint64) 0)
+#define NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_DEF ((guint64) 3125)
+#define NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_MAX G_MAXUINT64
+
+#define NM_BRIDGE_VLAN_STATS_ENABLED_DEF FALSE
+
+#define NM_BRIDGE_VLAN_DEFAULT_PVID_DEF 1u
/* NM_SETTING_COMPARE_FLAG_INFERRABLE: check whether a device-generated
* connection can be replaced by a already-defined connection. This flag only
diff --git a/libnm-core/nm-setting-bridge-port.c b/libnm-core/nm-setting-bridge-port.c
index 5fcf1e6027..92ac28ecd2 100644
--- a/libnm-core/nm-setting-bridge-port.c
+++ b/libnm-core/nm-setting-bridge-port.c
@@ -236,18 +236,20 @@ nm_setting_bridge_port_remove_vlan_by_vid (NMSettingBridgePort *setting,
guint16 vid_end)
{
NMSettingBridgePortPrivate *priv;
- guint16 v_start, v_end;
- NMBridgeVlan *vlan;
guint i;
if (vid_end == 0)
vid_end = vid_start;
g_return_val_if_fail (NM_IS_SETTING_BRIDGE_PORT (setting), FALSE);
+
priv = NM_SETTING_BRIDGE_PORT_GET_PRIVATE (setting);
for (i = 0; i < priv->vlans->len; i++) {
- vlan = (NMBridgeVlan *) priv->vlans->pdata[i];
+ NMBridgeVlan *vlan = priv->vlans->pdata[i];
+ guint16 v_start = 0;
+ guint16 v_end = 0;
+
nm_bridge_vlan_get_vid_range (vlan, &v_start, &v_end);
if (v_start == vid_start && v_end == vid_end) {
g_ptr_array_remove_index (priv->vlans, i);
@@ -440,8 +442,8 @@ nm_setting_bridge_port_init (NMSettingBridgePort *setting)
priv->vlans = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_bridge_vlan_unref);
- priv->priority = NM_BR_PORT_DEF_PRIORITY;
- priv->path_cost = NM_BR_PORT_DEF_PATH_COST;
+ priv->priority = NM_BRIDGE_PORT_PRIORITY_DEF;
+ priv->path_cost = NM_BRIDGE_PORT_PATH_COST_DEF;
}
/**
@@ -498,7 +500,7 @@ nm_setting_bridge_port_class_init (NMSettingBridgePortClass *klass)
*/
obj_properties[PROP_PRIORITY] =
g_param_spec_uint (NM_SETTING_BRIDGE_PORT_PRIORITY, "", "",
- 0, NM_BR_PORT_MAX_PRIORITY, NM_BR_PORT_DEF_PRIORITY,
+ NM_BRIDGE_PORT_PRIORITY_MIN, NM_BRIDGE_PORT_PRIORITY_MAX, NM_BRIDGE_PORT_PRIORITY_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
@@ -519,7 +521,7 @@ nm_setting_bridge_port_class_init (NMSettingBridgePortClass *klass)
*/
obj_properties[PROP_PATH_COST] =
g_param_spec_uint (NM_SETTING_BRIDGE_PORT_PATH_COST, "", "",
- 0, NM_BR_PORT_MAX_PATH_COST, NM_BR_PORT_DEF_PATH_COST,
+ NM_BRIDGE_PORT_PATH_COST_MIN, NM_BRIDGE_PORT_PATH_COST_MAX, NM_BRIDGE_PORT_PATH_COST_DEF,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS);
diff --git a/libnm-core/nm-setting-bridge.c b/libnm-core/nm-setting-bridge.c
index 957520f4a6..18aaff2a5e 100644
--- a/libnm-core/nm-setting-bridge.c
+++ b/libnm-core/nm-setting-bridge.c
@@ -22,18 +22,6 @@
* necessary for bridging connections.
**/
-#define BRIDGE_AGEING_TIME_DEFAULT 300
-#define BRIDGE_FORWARD_DELAY_DEFAULT 15
-#define BRIDGE_HELLO_TIME_DEFAULT 2
-#define BRIDGE_MAX_AGE_DEFAULT 20
-#define BRIDGE_MULTICAST_QUERIER_DEFAULT FALSE
-#define BRIDGE_MULTICAST_QUERY_USE_IFADDR_DEFAULT FALSE
-#define BRIDGE_MULTICAST_SNOOPING_DEFAULT TRUE
-#define BRIDGE_PRIORITY_DEFAULT 0x8000
-#define BRIDGE_STP_DEFAULT TRUE
-#define BRIDGE_VLAN_DEFAULT_PVID_DEFAULT 1
-#define BRIDGE_VLAN_STATS_ENABLED_DEFAULT FALSE
-
/*****************************************************************************/
NM_GOBJECT_PROPERTIES_DEFINE (NMSettingBridge,
@@ -46,10 +34,19 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMSettingBridge,
PROP_AGEING_TIME,
PROP_GROUP_ADDRESS,
PROP_GROUP_FORWARD_MASK,
+ PROP_MULTICAST_HASH_MAX,
+ PROP_MULTICAST_LAST_MEMBER_COUNT,
+ PROP_MULTICAST_LAST_MEMBER_INTERVAL,
+ PROP_MULTICAST_MEMBERSHIP_INTERVAL,
PROP_MULTICAST_ROUTER,
PROP_MULTICAST_QUERIER,
+ PROP_MULTICAST_QUERIER_INTERVAL,
+ PROP_MULTICAST_QUERY_INTERVAL,
+ PROP_MULTICAST_QUERY_RESPONSE_INTERVAL,
PROP_MULTICAST_QUERY_USE_IFADDR,
PROP_MULTICAST_SNOOPING,
+ PROP_MULTICAST_STARTUP_QUERY_COUNT,
+ PROP_MULTICAST_STARTUP_QUERY_INTERVAL,
PROP_VLAN_FILTERING,
PROP_VLAN_DEFAULT_PVID,
PROP_VLAN_PROTOCOL,
@@ -63,7 +60,16 @@ typedef struct {
char * multicast_router;
char * group_address;
char * vlan_protocol;
+ guint64 multicast_last_member_interval;
+ guint64 multicast_membership_interval;
+ guint64 multicast_querier_interval;
+ guint64 multicast_query_interval;
+ guint64 multicast_query_response_interval;
+ guint64 multicast_startup_query_interval;
guint32 ageing_time;
+ guint32 multicast_hash_max;
+ guint32 multicast_last_member_count;
+ guint32 multicast_startup_query_count;
guint16 priority;
guint16 forward_delay;
guint16 hello_time;
@@ -1010,6 +1016,150 @@ nm_setting_bridge_get_multicast_querier (const NMSettingBridge *setting)
return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_querier;
}
+/**
+ * nm_setting_bridge_get_multicast_hash_max:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:multicast-hash-max property of the setting
+ *
+ * Since 1.26
+ **/
+guint32
+nm_setting_bridge_get_multicast_hash_max (const NMSettingBridge *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+ return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_hash_max;
+}
+
+/**
+ * nm_setting_bridge_get_multicast_last_member_count:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:multicast-last-member-count property of the setting
+ *
+ * Since 1.26
+ **/
+guint32
+nm_setting_bridge_get_multicast_last_member_count (const NMSettingBridge *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+ return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_last_member_count;
+}
+
+/**
+ * nm_setting_bridge_get_multicast_last_member_interval:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:multicast-last-member-interval property of the setting
+ *
+ * Since 1.26
+ **/
+guint64
+nm_setting_bridge_get_multicast_last_member_interval (const NMSettingBridge *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+ return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_last_member_interval;
+}
+
+/**
+ * nm_setting_bridge_get_multicast_membership_interval:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:multicast-membership-interval property of the setting
+ *
+ * Since 1.26
+ **/
+guint64
+nm_setting_bridge_get_multicast_membership_interval (const NMSettingBridge *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+ return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_membership_interval;
+}
+
+/**
+ * nm_setting_bridge_get_multicast_querier_interval:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:multicast-querier-interval property of the setting
+ *
+ * Since 1.26
+ **/
+guint64
+nm_setting_bridge_get_multicast_querier_interval (const NMSettingBridge *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+ return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_querier_interval;
+}
+
+/**
+ * nm_setting_bridge_get_multicast_query_interval:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:multicast-query-interval property of the setting
+ *
+ * Since 1.26
+ **/
+guint64
+nm_setting_bridge_get_multicast_query_interval (const NMSettingBridge *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+ return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_query_interval;
+}
+
+/**
+ * nm_setting_bridge_get_multicast_query_response_interval:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:multicast-query-response-interval property of the setting
+ *
+ * Since 1.26
+ **/
+guint64
+nm_setting_bridge_get_multicast_query_response_interval (const NMSettingBridge *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+ return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_query_response_interval;
+}
+
+/**
+ * nm_setting_bridge_get_multicast_startup_query_count:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:multicast-query-response-interval property of the setting
+ *
+ * Since 1.26
+ **/
+guint32
+nm_setting_bridge_get_multicast_startup_query_count (const NMSettingBridge *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+ return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_startup_query_count;
+}
+
+/**
+ * nm_setting_bridge_get_multicast_startup_query_interval:
+ * @setting: the #NMSettingBridge
+ *
+ * Returns: the #NMSettingBridge:multicast-startup-query-interval property of the setting
+ *
+ * Since 1.26
+ **/
+guint64
+nm_setting_bridge_get_multicast_startup_query_interval (const NMSettingBridge *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0);
+
+ return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_startup_query_interval;
+}
+
/*****************************************************************************/
static gboolean
@@ -1050,32 +1200,32 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
}
if (!check_range (priv->forward_delay,
- NM_BR_MIN_FORWARD_DELAY,
- NM_BR_MAX_FORWARD_DELAY,
+ NM_BRIDGE_FORWARD_DELAY_MIN,
+ NM_BRIDGE_FORWARD_DELAY_MAX,
!priv->stp,
NM_SETTING_BRIDGE_FORWARD_DELAY,
error))
return FALSE;
if (!check_range (priv->hello_time,
- NM_BR_MIN_HELLO_TIME,
- NM_BR_MAX_HELLO_TIME,
+ NM_BRIDGE_HELLO_TIME_MIN,
+ NM_BRIDGE_HELLO_TIME_MAX,
!priv->stp,
NM_SETTING_BRIDGE_HELLO_TIME,
error))
return FALSE;
if (!check_range (priv->max_age,
- NM_BR_MIN_MAX_AGE,
- NM_BR_MAX_MAX_AGE,
+ NM_BRIDGE_MAX_AGE_MIN,
+ NM_BRIDGE_MAX_AGE_MAX,
!priv->stp,
NM_SETTING_BRIDGE_MAX_AGE,
error))
return FALSE;
if (!check_range (priv->ageing_time,
- NM_BR_MIN_AGEING_TIME,
- NM_BR_MAX_AGEING_TIME,
+ NM_BRIDGE_AGEING_TIME_MIN,
+ NM_BRIDGE_AGEING_TIME_MAX,
!priv->stp,
NM_SETTING_BRIDGE_AGEING_TIME,
error))
@@ -1149,6 +1299,16 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
}
}
+ if (!nm_utils_is_power_of_two (priv->multicast_hash_max)) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("'%s' option must be a power of 2"),
+ NM_SETTING_BRIDGE_MULTICAST_HASH_MAX);
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_BRIDGE_SETTING_NAME, NM_SETTING_BRIDGE_MULTICAST_HASH_MAX);
+ return FALSE;
+ }
+
/* Failures from here on are NORMALIZABLE... */
if (!_nm_utils_bridge_vlan_verify_list (priv->vlans,
@@ -1235,6 +1395,18 @@ get_property (GObject *object, guint prop_id,
case PROP_GROUP_FORWARD_MASK:
g_value_set_uint (value, priv->group_forward_mask);
break;
+ case PROP_MULTICAST_HASH_MAX:
+ g_value_set_uint (value, priv->multicast_hash_max);
+ break;
+ case PROP_MULTICAST_LAST_MEMBER_COUNT:
+ g_value_set_uint (value, priv->multicast_last_member_count);
+ break;
+ case PROP_MULTICAST_LAST_MEMBER_INTERVAL:
+ g_value_set_uint64 (value, priv->multicast_last_member_interval);
+ break;
+ case PROP_MULTICAST_MEMBERSHIP_INTERVAL:
+ g_value_set_uint64 (value, priv->multicast_membership_interval);
+ break;
case PROP_MULTICAST_SNOOPING:
g_value_set_boolean (value, priv->multicast_snooping);
break;
@@ -1244,9 +1416,24 @@ get_property (GObject *object, guint prop_id,
case PROP_MULTICAST_QUERIER:
g_value_set_boolean (value, priv->multicast_querier);
break;
+ case PROP_MULTICAST_QUERIER_INTERVAL:
+ g_value_set_uint64 (value, priv->multicast_querier_interval);
+ break;
+ case PROP_MULTICAST_QUERY_INTERVAL:
+ g_value_set_uint64 (value, priv->multicast_query_interval);
+ break;
+ case PROP_MULTICAST_QUERY_RESPONSE_INTERVAL:
+ g_value_set_uint64 (value, priv->multicast_query_response_interval);
+ break;
case PROP_MULTICAST_QUERY_USE_IFADDR:
g_value_set_boolean (value, priv->multicast_query_use_ifaddr);
break;
+ case PROP_MULTICAST_STARTUP_QUERY_COUNT:
+ g_value_set_uint (value, priv->multicast_startup_query_count);
+ break;
+ case PROP_MULTICAST_STARTUP_QUERY_INTERVAL:
+ g_value_set_uint64 (value, priv->multicast_startup_query_interval);
+ break;
case PROP_VLAN_FILTERING:
g_value_set_boolean (value, priv->vlan_filtering);
break;
@@ -1308,6 +1495,18 @@ set_property (GObject *object, guint prop_id,
case PROP_GROUP_FORWARD_MASK:
priv->group_forward_mask = (guint16) g_value_get_uint (value);
break;
+ case PROP_MULTICAST_HASH_MAX:
+ priv->multicast_hash_max = g_value_get_uint (value);
+ break;
+ case PROP_MULTICAST_LAST_MEMBER_COUNT:
+ priv->multicast_last_member_count = g_value_get_uint (value);
+ break;
+ case PROP_MULTICAST_LAST_MEMBER_INTERVAL:
+ priv->multicast_last_member_interval = g_value_get_uint64 (value);
+ break;
+ case PROP_MULTICAST_MEMBERSHIP_INTERVAL:
+ priv->multicast_membership_interval = g_value_get_uint64 (value);
+ break;
case PROP_MULTICAST_SNOOPING:
priv->multicast_snooping = g_value_get_boolean (value);
break;
@@ -1318,9 +1517,24 @@ set_property (GObject *object, guint prop_id,
case PROP_MULTICAST_QUERIER:
priv->multicast_querier = g_value_get_boolean (value);
break;
+ case PROP_MULTICAST_QUERIER_INTERVAL:
+ priv->multicast_querier_interval = g_value_get_uint64 (value);
+ break;
+ case PROP_MULTICAST_QUERY_INTERVAL:
+ priv->multicast_query_interval = g_value_get_uint64 (value);
+ break;
+ case PROP_MULTICAST_QUERY_RESPONSE_INTERVAL:
+ priv->multicast_query_response_interval = g_value_get_uint64 (value);
+ break;
case PROP_MULTICAST_QUERY_USE_IFADDR:
priv->multicast_query_use_ifaddr = g_value_get_boolean (value);
break;
+ case PROP_MULTICAST_STARTUP_QUERY_COUNT:
+ priv->multicast_startup_query_count = g_value_get_uint (value);
+ break;
+ case PROP_MULTICAST_STARTUP_QUERY_INTERVAL:
+ priv->multicast_startup_query_interval = g_value_get_uint64 (value);
+ break;
case PROP_VLAN_FILTERING:
priv->vlan_filtering = g_value_get_boolean (value);
break;
@@ -1355,17 +1569,27 @@ nm_setting_bridge_init (NMSettingBridge *setting)
priv->vlans = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_bridge_vlan_unref);
- priv->ageing_time = BRIDGE_AGEING_TIME_DEFAULT;
- priv->forward_delay = BRIDGE_FORWARD_DELAY_DEFAULT;
- priv->hello_time = BRIDGE_HELLO_TIME_DEFAULT;
- priv->max_age = BRIDGE_MAX_AGE_DEFAULT;
- priv->multicast_snooping = BRIDGE_MULTICAST_SNOOPING_DEFAULT;
- priv->priority = BRIDGE_PRIORITY_DEFAULT;
- priv->stp = BRIDGE_STP_DEFAULT;
- priv->vlan_default_pvid = BRIDGE_VLAN_DEFAULT_PVID_DEFAULT;
- priv->vlan_stats_enabled = BRIDGE_VLAN_STATS_ENABLED_DEFAULT;
- priv->multicast_query_use_ifaddr = BRIDGE_MULTICAST_QUERY_USE_IFADDR_DEFAULT;
- priv->multicast_querier = BRIDGE_MULTICAST_QUERIER_DEFAULT;
+ priv->ageing_time = NM_BRIDGE_AGEING_TIME_DEF;
+ priv->forward_delay = NM_BRIDGE_FORWARD_DELAY_DEF;
+ priv->hello_time = NM_BRIDGE_HELLO_TIME_DEF;
+ priv->max_age = NM_BRIDGE_MAX_AGE_DEF;
+ priv->multicast_last_member_count = NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_DEF;
+ priv->multicast_last_member_interval = NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_DEF;
+ priv->multicast_membership_interval = NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_DEF;
+ priv->multicast_hash_max = NM_BRIDGE_MULTICAST_HASH_MAX_DEF;
+ priv->multicast_snooping = NM_BRIDGE_MULTICAST_SNOOPING_DEF;
+ priv->priority = NM_BRIDGE_PRIORITY_DEF;
+ priv->stp = NM_BRIDGE_STP_DEF;
+ priv->vlan_default_pvid = NM_BRIDGE_VLAN_DEFAULT_PVID_DEF;
+ priv->multicast_query_interval = NM_BRIDGE_MULTICAST_QUERY_INTERVAL_DEF;
+ priv->multicast_query_response_interval = NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_DEF;
+ priv->multicast_querier_interval = NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_DEF;
+ priv->multicast_startup_query_count = NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_DEF;
+ priv->multicast_startup_query_interval = NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_DEF;
+
+ nm_assert (priv->multicast_querier == NM_BRIDGE_MULTICAST_QUERIER_DEF);
+ nm_assert (priv->multicast_query_use_ifaddr == NM_BRIDGE_MULTICAST_QUERY_USE_IFADDR_DEF);
+ nm_assert (priv->vlan_stats_enabled == NM_BRIDGE_VLAN_STATS_ENABLED_DEF);
}
/**
@@ -1461,7 +1685,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
*/
obj_properties[PROP_STP] =
g_param_spec_boolean (NM_SETTING_BRIDGE_STP, "", "",
- BRIDGE_STP_DEFAULT,
+ NM_BRIDGE_STP_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
@@ -1483,7 +1707,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
*/
obj_properties[PROP_PRIORITY] =
g_param_spec_uint (NM_SETTING_BRIDGE_PRIORITY, "", "",
- 0, G_MAXUINT16, BRIDGE_PRIORITY_DEFAULT,
+ NM_BRIDGE_PRIORITY_MIN, NM_BRIDGE_PRIORITY_MAX, NM_BRIDGE_PRIORITY_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
@@ -1503,7 +1727,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
*/
obj_properties[PROP_FORWARD_DELAY] =
g_param_spec_uint (NM_SETTING_BRIDGE_FORWARD_DELAY, "", "",
- 0, NM_BR_MAX_FORWARD_DELAY, BRIDGE_FORWARD_DELAY_DEFAULT,
+ 0, NM_BRIDGE_FORWARD_DELAY_MAX, NM_BRIDGE_FORWARD_DELAY_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
@@ -1523,7 +1747,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
*/
obj_properties[PROP_HELLO_TIME] =
g_param_spec_uint (NM_SETTING_BRIDGE_HELLO_TIME, "", "",
- 0, NM_BR_MAX_HELLO_TIME, BRIDGE_HELLO_TIME_DEFAULT,
+ 0, NM_BRIDGE_HELLO_TIME_MAX, NM_BRIDGE_HELLO_TIME_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
@@ -1543,7 +1767,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
*/
obj_properties[PROP_MAX_AGE] =
g_param_spec_uint (NM_SETTING_BRIDGE_MAX_AGE, "", "",
- 0, NM_BR_MAX_MAX_AGE, BRIDGE_MAX_AGE_DEFAULT,
+ 0, NM_BRIDGE_MAX_AGE_MAX, NM_BRIDGE_MAX_AGE_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
@@ -1563,7 +1787,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
*/
obj_properties[PROP_AGEING_TIME] =
g_param_spec_uint (NM_SETTING_BRIDGE_AGEING_TIME, "", "",
- NM_BR_MIN_AGEING_TIME, NM_BR_MAX_AGEING_TIME, BRIDGE_AGEING_TIME_DEFAULT,
+ NM_BRIDGE_AGEING_TIME_MIN, NM_BRIDGE_AGEING_TIME_MAX, NM_BRIDGE_AGEING_TIME_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
@@ -1607,7 +1831,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
*/
obj_properties[PROP_MULTICAST_SNOOPING] =
g_param_spec_boolean (NM_SETTING_BRIDGE_MULTICAST_SNOOPING, "", "",
- BRIDGE_MULTICAST_SNOOPING_DEFAULT,
+ NM_BRIDGE_MULTICAST_SNOOPING_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
@@ -1652,7 +1876,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
*/
obj_properties[PROP_VLAN_DEFAULT_PVID] =
g_param_spec_uint (NM_SETTING_BRIDGE_VLAN_DEFAULT_PVID, "", "",
- 0, NM_BRIDGE_VLAN_VID_MAX, BRIDGE_VLAN_DEFAULT_PVID_DEFAULT,
+ 0, NM_BRIDGE_VLAN_VID_MAX, NM_BRIDGE_VLAN_DEFAULT_PVID_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
@@ -1767,7 +1991,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
*/
obj_properties[PROP_VLAN_STATS_ENABLED] =
g_param_spec_boolean (NM_SETTING_BRIDGE_VLAN_STATS_ENABLED, "", "",
- BRIDGE_VLAN_STATS_ENABLED_DEFAULT,
+ NM_BRIDGE_VLAN_STATS_ENABLED_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
@@ -1816,7 +2040,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
*/
obj_properties[PROP_MULTICAST_QUERY_USE_IFADDR] =
g_param_spec_boolean (NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR, "", "",
- BRIDGE_MULTICAST_QUERY_USE_IFADDR_DEFAULT,
+ NM_BRIDGE_MULTICAST_QUERY_USE_IFADDR_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
@@ -1838,11 +2062,209 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass)
*/
obj_properties[PROP_MULTICAST_QUERIER] =
g_param_spec_boolean (NM_SETTING_BRIDGE_MULTICAST_QUERIER, "", "",
- BRIDGE_MULTICAST_QUERIER_DEFAULT,
+ NM_BRIDGE_MULTICAST_QUERIER_DEF,
G_PARAM_READWRITE |
NM_SETTING_PARAM_INFERRABLE |
G_PARAM_STATIC_STRINGS);
+ /**
+ * NMSettingBridge:multicast-hash-max:
+ *
+ * Set maximum size of multicast hash table (value must be a power of 2).
+ **/
+ /* ---ifcfg-rh---
+ * property: multicast-hash-max
+ * variable: BRIDGING_OPTS: multicast_hash_max=
+ * default: 4096
+ * example: BRIDGING_OPTS="multicast_hash_max=8192"
+ * ---end---
+ *
+ * Since: 1.26
+ */
+ obj_properties[PROP_MULTICAST_HASH_MAX] =
+ g_param_spec_uint (NM_SETTING_BRIDGE_MULTICAST_HASH_MAX, "", "",
+ NM_BRIDGE_MULTICAST_HASH_MAX_MIN, NM_BRIDGE_MULTICAST_HASH_MAX_MAX, NM_BRIDGE_MULTICAST_HASH_MAX_DEF,
+ G_PARAM_READWRITE |
+ NM_SETTING_PARAM_INFERRABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * NMSettingBridge:multicast-last-member-count:
+ *
+ * Set the number of queries the bridge will send before
+ * stopping forwarding a multicast group after a "leave"
+ * message has been received.
+ **/
+ /* ---ifcfg-rh---
+ * property: multicast-last-member-count
+ * variable: BRIDGING_OPTS: multicast_last_member_count=
+ * default: 2
+ * example: BRIDGING_OPTS="multicast_last_member_count=4"
+ * ---end---
+ *
+ * Since: 1.26
+ */
+ obj_properties[PROP_MULTICAST_LAST_MEMBER_COUNT] =
+ g_param_spec_uint (NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT, "", "",
+ NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_MIN, NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_MAX, NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_DEF,
+ G_PARAM_READWRITE |
+ NM_SETTING_PARAM_INFERRABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * NMSettingBridge:multicast-last-member-interval:
+ *
+ * Set interval (in deciseconds) between queries to find remaining
+ * members of a group, after a "leave" message is received.
+ **/
+ /* ---ifcfg-rh---
+ * property: multicast-last-member-interval
+ * variable: BRIDGING_OPTS: multicast_last_member_interval=
+ * default: 100
+ * example: BRIDGING_OPTS="multicast_last_member_interval=200"
+ * ---end---
+ *
+ * Since: 1.26
+ */
+ obj_properties[PROP_MULTICAST_LAST_MEMBER_INTERVAL] =
+ g_param_spec_uint64 (NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL, "", "",
+ NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_MIN, NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_MAX, NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_DEF,
+ G_PARAM_READWRITE |
+ NM_SETTING_PARAM_INFERRABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * NMSettingBridge:multicast-membership-interval:
+ *
+ * Set delay (in deciseconds) after which the bridge will
+ * leave a group, if no membership reports for this
+ * group are received.
+ **/
+ /* ---ifcfg-rh---
+ * property: multicast-membership-interval
+ * variable: BRIDGING_OPTS: multicast_membership_interval=
+ * default: 26000
+ * example: BRIDGING_OPTS="multicast_membership_interval=16000"
+ * ---end---
+ *
+ * Since: 1.26
+ */
+ obj_properties[PROP_MULTICAST_MEMBERSHIP_INTERVAL] =
+ g_param_spec_uint64 (NM_SETTING_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL, "", "",
+ NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_MIN, NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_MAX, NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_DEF,
+ G_PARAM_READWRITE |
+ NM_SETTING_PARAM_INFERRABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * NMSettingBridge:multicast-querier-interval:
+ *
+ * If no queries are seen after this delay (in deciseconds) has passed,
+ * the bridge will start to send its own queries.
+ **/
+ /* ---ifcfg-rh---
+ * property: multicast-querier-interval
+ * variable: BRIDGING_OPTS: multicast_querier_interval=
+ * default: 25500
+ * example: BRIDGING_OPTS="multicast_querier_interval=20000"
+ * ---end---
+ *
+ * Since: 1.26
+ */
+ obj_properties[PROP_MULTICAST_QUERIER_INTERVAL] =
+ g_param_spec_uint64 (NM_SETTING_BRIDGE_MULTICAST_QUERIER_INTERVAL, "", "",
+ NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_MIN, NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_MAX, NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_DEF,
+ G_PARAM_READWRITE |
+ NM_SETTING_PARAM_INFERRABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * NMSettingBridge:multicast-query-interval:
+ *
+ * Interval (in deciseconds) between queries sent
+ * by the bridge after the end of the startup phase.
+ **/
+ /* ---ifcfg-rh---
+ * property: multicast-query-interval
+ * variable: BRIDGING_OPTS: multicast_query_interval=
+ * default: 12500
+ * example: BRIDGING_OPTS="multicast_query_interval=22500"
+ * ---end---
+ *
+ * Since: 1.26
+ */
+ obj_properties[PROP_MULTICAST_QUERY_INTERVAL] =
+ g_param_spec_uint64 (NM_SETTING_BRIDGE_MULTICAST_QUERY_INTERVAL, "", "",
+ NM_BRIDGE_MULTICAST_QUERY_INTERVAL_MIN, NM_BRIDGE_MULTICAST_QUERY_INTERVAL_MAX, NM_BRIDGE_MULTICAST_QUERY_INTERVAL_DEF,
+ G_PARAM_READWRITE |
+ NM_SETTING_PARAM_INFERRABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * NMSettingBridge:multicast-query-response-interval:
+ *
+ * Set the Max Response Time/Max Response Delay
+ * (in deciseconds) for IGMP/MLD queries sent by the bridge.
+ **/
+ /* ---ifcfg-rh---
+ * property: multicast-query-response-interval
+ * variable: BRIDGING_OPTS: multicast_query_response_interval=
+ * default: 1000
+ * example: BRIDGING_OPTS="multicast_query_response_interval=2000"
+ * ---end---
+ *
+ * Since: 1.26
+ */
+ obj_properties[PROP_MULTICAST_QUERY_RESPONSE_INTERVAL] =
+ g_param_spec_uint64 (NM_SETTING_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL, "", "",
+ NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_MIN, NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_MAX, NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_DEF,
+ G_PARAM_READWRITE |
+ NM_SETTING_PARAM_INFERRABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * NMSettingBridge:multicast-startup-query-count:
+ *
+ * Set the number of IGMP queries to send during startup phase.
+ **/
+ /* ---ifcfg-rh---
+ * property: multicast-startup-query-count
+ * variable: BRIDGING_OPTS: multicast_startup_query_count=
+ * default: 2
+ * example: BRIDGING_OPTS="multicast_startup_query_count=4"
+ * ---end---
+ *
+ * Since: 1.26
+ */
+ obj_properties[PROP_MULTICAST_STARTUP_QUERY_COUNT] =
+ g_param_spec_uint (NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT, "", "",
+ NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_MIN, NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_MAX, NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_DEF,
+ G_PARAM_READWRITE |
+ NM_SETTING_PARAM_INFERRABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * NMSettingBridge:multicast-startup-query-interval:
+ *
+ * Sets the time (in deciseconds) between queries sent out
+ * at startup to determine membership information.
+ **/
+ /* ---ifcfg-rh---
+ * property: multicast-startup-query-interval
+ * variable: BRIDGING_OPTS: multicast_startup_query_interval=
+ * default: 3125
+ * example: BRIDGING_OPTS="multicast_startup_query_interval=4000"
+ * ---end---
+ *
+ * Since: 1.26
+ */
+ obj_properties[PROP_MULTICAST_STARTUP_QUERY_INTERVAL] =
+ g_param_spec_uint64 (NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL, "", "",
+ NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_MIN, NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_MAX, NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_DEF,
+ G_PARAM_READWRITE |
+ NM_SETTING_PARAM_INFERRABLE |
+ G_PARAM_STATIC_STRINGS);
+
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_BRIDGE,
diff --git a/libnm-core/nm-setting-bridge.h b/libnm-core/nm-setting-bridge.h
index 6bd5100f26..5f0ef0b321 100644
--- a/libnm-core/nm-setting-bridge.h
+++ b/libnm-core/nm-setting-bridge.h
@@ -23,24 +23,33 @@ G_BEGIN_DECLS
#define NM_SETTING_BRIDGE_SETTING_NAME "bridge"
-#define NM_SETTING_BRIDGE_MAC_ADDRESS "mac-address"
-#define NM_SETTING_BRIDGE_STP "stp"
-#define NM_SETTING_BRIDGE_PRIORITY "priority"
-#define NM_SETTING_BRIDGE_FORWARD_DELAY "forward-delay"
-#define NM_SETTING_BRIDGE_HELLO_TIME "hello-time"
-#define NM_SETTING_BRIDGE_MAX_AGE "max-age"
-#define NM_SETTING_BRIDGE_AGEING_TIME "ageing-time"
-#define NM_SETTING_BRIDGE_GROUP_FORWARD_MASK "group-forward-mask"
-#define NM_SETTING_BRIDGE_MULTICAST_SNOOPING "multicast-snooping"
-#define NM_SETTING_BRIDGE_MULTICAST_ROUTER "multicast-router"
-#define NM_SETTING_BRIDGE_MULTICAST_QUERIER "multicast-querier"
-#define NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR "multicast-query-use-ifaddr"
-#define NM_SETTING_BRIDGE_VLAN_FILTERING "vlan-filtering"
-#define NM_SETTING_BRIDGE_VLAN_DEFAULT_PVID "vlan-default-pvid"
-#define NM_SETTING_BRIDGE_VLANS "vlans"
-#define NM_SETTING_BRIDGE_GROUP_ADDRESS "group-address"
-#define NM_SETTING_BRIDGE_VLAN_PROTOCOL "vlan-protocol"
-#define NM_SETTING_BRIDGE_VLAN_STATS_ENABLED "vlan-stats-enabled"
+#define NM_SETTING_BRIDGE_MAC_ADDRESS "mac-address"
+#define NM_SETTING_BRIDGE_STP "stp"
+#define NM_SETTING_BRIDGE_PRIORITY "priority"
+#define NM_SETTING_BRIDGE_FORWARD_DELAY "forward-delay"
+#define NM_SETTING_BRIDGE_HELLO_TIME "hello-time"
+#define NM_SETTING_BRIDGE_MAX_AGE "max-age"
+#define NM_SETTING_BRIDGE_AGEING_TIME "ageing-time"
+#define NM_SETTING_BRIDGE_GROUP_FORWARD_MASK "group-forward-mask"
+#define NM_SETTING_BRIDGE_MULTICAST_HASH_MAX "multicast-hash-max"
+#define NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT "multicast-last-member-count"
+#define NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL "multicast-last-member-interval"
+#define NM_SETTING_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL "multicast-membership-interval"
+#define NM_SETTING_BRIDGE_MULTICAST_SNOOPING "multicast-snooping"
+#define NM_SETTING_BRIDGE_MULTICAST_ROUTER "multicast-router"
+#define NM_SETTING_BRIDGE_MULTICAST_QUERIER "multicast-querier"
+#define NM_SETTING_BRIDGE_MULTICAST_QUERIER_INTERVAL "multicast-querier-interval"
+#define NM_SETTING_BRIDGE_MULTICAST_QUERY_INTERVAL "multicast-query-interval"
+#define NM_SETTING_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL "multicast-query-response-interval"
+#define NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR "multicast-query-use-ifaddr"
+#define NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT "multicast-startup-query-count"
+#define NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL "multicast-startup-query-interval"
+#define NM_SETTING_BRIDGE_VLAN_FILTERING "vlan-filtering"
+#define NM_SETTING_BRIDGE_VLAN_DEFAULT_PVID "vlan-default-pvid"
+#define NM_SETTING_BRIDGE_VLANS "vlans"
+#define NM_SETTING_BRIDGE_GROUP_ADDRESS "group-address"
+#define NM_SETTING_BRIDGE_VLAN_PROTOCOL "vlan-protocol"
+#define NM_SETTING_BRIDGE_VLAN_STATS_ENABLED "vlan-stats-enabled"
#define NM_BRIDGE_VLAN_VID_MIN 1
#define NM_BRIDGE_VLAN_VID_MAX 4094
@@ -140,6 +149,33 @@ gboolean nm_setting_bridge_get_multicast_query_use_ifaddr (const NMSettingBridge
NM_AVAILABLE_IN_1_24
gboolean nm_setting_bridge_get_multicast_querier (const NMSettingBridge *setting);
+NM_AVAILABLE_IN_1_26
+guint32 nm_setting_bridge_get_multicast_hash_max (const NMSettingBridge *setting);
+
+NM_AVAILABLE_IN_1_26
+guint32 nm_setting_bridge_get_multicast_last_member_count (const NMSettingBridge *setting);
+
+NM_AVAILABLE_IN_1_26
+guint64 nm_setting_bridge_get_multicast_last_member_interval (const NMSettingBridge *setting);
+
+NM_AVAILABLE_IN_1_26
+guint64 nm_setting_bridge_get_multicast_membership_interval (const NMSettingBridge *setting);
+
+NM_AVAILABLE_IN_1_26
+guint64 nm_setting_bridge_get_multicast_querier_interval (const NMSettingBridge *setting);
+
+NM_AVAILABLE_IN_1_26
+guint64 nm_setting_bridge_get_multicast_query_interval (const NMSettingBridge *setting);
+
+NM_AVAILABLE_IN_1_26
+guint64 nm_setting_bridge_get_multicast_query_response_interval (const NMSettingBridge *setting);
+
+NM_AVAILABLE_IN_1_26
+guint32 nm_setting_bridge_get_multicast_startup_query_count (const NMSettingBridge *setting);
+
+NM_AVAILABLE_IN_1_26
+guint64 nm_setting_bridge_get_multicast_startup_query_interval (const NMSettingBridge *setting);
+
G_END_DECLS
#endif /* __NM_SETTING_BRIDGE_H__ */
diff --git a/libnm-core/nm-setting-connection.c b/libnm-core/nm-setting-connection.c
index 2e8fa37a2c..018129bef2 100644
--- a/libnm-core/nm-setting-connection.c
+++ b/libnm-core/nm-setting-connection.c
@@ -8,6 +8,7 @@
#include "nm-setting-connection.h"
+#include "nm-libnm-core-intern/nm-common-macros.h"
#include "nm-utils.h"
#include "nm-utils-private.h"
#include "nm-core-enum-types.h"
@@ -16,6 +17,7 @@
#include "nm-setting-bridge.h"
#include "nm-setting-team.h"
#include "nm-setting-vlan.h"
+#include "systemd/nm-sd-utils-shared.h"
/**
* SECTION:nm-setting-connection
@@ -63,6 +65,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMSettingConnection,
PROP_STABLE_ID,
PROP_AUTH_RETRIES,
PROP_WAIT_DEVICE_TIMEOUT,
+ PROP_MUD_URL,
);
typedef struct {
@@ -76,6 +79,7 @@ typedef struct {
char *master;
char *slave_type;
char *zone;
+ char *mud_url;
guint64 timestamp;
int autoconnect_priority;
int autoconnect_retries;
@@ -751,6 +755,23 @@ nm_setting_connection_get_secondary (NMSettingConnection *setting, guint32 idx)
}
/**
+ * nm_setting_connection_get_mud_url:
+ * @setting: the #NMSettingConnection
+ *
+ * Returns the value contained in the #NMSettingConnection:mud-url
+ * property.
+ *
+ * Since: 1.26
+ **/
+const char *
+nm_setting_connection_get_mud_url (NMSettingConnection *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), NULL);
+
+ return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->mud_url;
+}
+
+/**
* nm_setting_connection_add_secondary:
* @setting: the #NMSettingConnection
* @sec_uuid: the secondary connection UUID to add
@@ -1211,6 +1232,31 @@ after_interface_name:
return FALSE;
}
+ if (priv->mud_url) {
+ if (!priv->mud_url[0]) {
+ g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("property is empty"));
+ g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), NM_SETTING_CONNECTION_MUD_URL);
+ return FALSE;
+ }
+ if (nm_streq (priv->mud_url, NM_CONNECTION_MUD_URL_NONE)) {
+ /* pass */
+ } else {
+ if (strlen (priv->mud_url) > 255) {
+ g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("DHCP option cannot be longer than 255 characters"));
+ g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), NM_SETTING_CONNECTION_MUD_URL);
+ return FALSE;
+ }
+ if (!nm_sd_http_url_is_valid_https (priv->mud_url)) {
+ g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("MUD URL is not a valid URL"));
+ g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), NM_SETTING_CONNECTION_MUD_URL);
+ return FALSE;
+ }
+ }
+ }
+
/* *** errors above here should be always fatal, below NORMALIZABLE_ERROR *** */
if (!priv->uuid) {
@@ -1467,6 +1513,9 @@ get_property (GObject *object, guint prop_id,
case PROP_WAIT_DEVICE_TIMEOUT:
g_value_set_int (value, priv->wait_device_timeout);
break;
+ case PROP_MUD_URL:
+ g_value_set_string (value, priv->mud_url);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1562,6 +1611,10 @@ set_property (GObject *object, guint prop_id,
case PROP_WAIT_DEVICE_TIMEOUT:
priv->wait_device_timeout = g_value_get_int (value);
break;
+ case PROP_MUD_URL:
+ g_free (priv->mud_url);
+ priv->mud_url = g_value_dup_string (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1611,6 +1664,7 @@ finalize (GObject *object)
g_free (priv->zone);
g_free (priv->master);
g_free (priv->slave_type);
+ g_free (priv->mud_url);
g_slist_free_full (priv->permissions, (GDestroyNotify) permission_free);
g_slist_free_full (priv->secondaries, g_free);
@@ -2286,6 +2340,35 @@ nm_setting_connection_class_init (NMSettingConnectionClass *klass)
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS);
+
+ /**
+ * NMSettingConnection:mud-url:
+ *
+ * If configured, set to a Manufacturer Usage Description (MUD) URL that points
+ * to manufacturer-recommended network policies for IoT devices. It is transmitted
+ * as a DHCPv4 or DHCPv6 option. The value must be a valid URL starting with "https://".
+ *
+ * The special value "none" is allowed to indicate that no MUD URL is used.
+ *
+ * If the per-profile value is unspecified (the default), a global connection default gets
+ * consulted. If still unspecified, the ultimate default is "none".
+ *
+ * Since: 1.26
+ **/
+ /* ---ifcfg-rh---
+ * property: mud-url
+ * variable: MUD_URL
+ * values: a valid URL that points to recommended policy for this device
+ * description: MUD_URL to be sent by device (See RFC 8520).
+ * example: https://yourdevice.example.com/model.json
+ * ---end---
+ */
+ obj_properties[PROP_MUD_URL] =
+ g_param_spec_string (NM_SETTING_CONNECTION_MUD_URL, "", "",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS);
+
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_CONNECTION,
diff --git a/libnm-core/nm-setting-connection.h b/libnm-core/nm-setting-connection.h
index b93e9b4d7a..9a6f09a852 100644
--- a/libnm-core/nm-setting-connection.h
+++ b/libnm-core/nm-setting-connection.h
@@ -52,6 +52,7 @@ G_BEGIN_DECLS
#define NM_SETTING_CONNECTION_MDNS "mdns"
#define NM_SETTING_CONNECTION_LLMNR "llmnr"
#define NM_SETTING_CONNECTION_WAIT_DEVICE_TIMEOUT "wait-device-timeout"
+#define NM_SETTING_CONNECTION_MUD_URL "mud-url"
/* Types for property values */
/**
@@ -204,6 +205,9 @@ NMSettingConnectionLlmnr nm_setting_connection_get_llmnr (NMSettingConnection *
NM_AVAILABLE_IN_1_20
gint32 nm_setting_connection_get_wait_device_timeout (NMSettingConnection *setting);
+NM_AVAILABLE_IN_1_26
+const char *nm_setting_connection_get_mud_url (NMSettingConnection *setting);
+
G_END_DECLS
#endif /* __NM_SETTING_CONNECTION_H__ */
diff --git a/libnm-core/nm-setting-match.c b/libnm-core/nm-setting-match.c
index 3ad58dafa9..a784df39bd 100644
--- a/libnm-core/nm-setting-match.c
+++ b/libnm-core/nm-setting-match.c
@@ -20,6 +20,8 @@
NM_GOBJECT_PROPERTIES_DEFINE (NMSettingMatch,
PROP_INTERFACE_NAME,
+ PROP_KERNEL_COMMAND_LINE,
+ PROP_DRIVER,
);
/**
@@ -31,7 +33,9 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMSettingMatch,
*/
struct _NMSettingMatch {
NMSetting parent;
- GPtrArray *interface_name;
+ GArray *interface_name;
+ GArray *kernel_command_line;
+ GArray *driver;
};
struct _NMSettingMatchClass {
@@ -55,7 +59,7 @@ nm_setting_match_get_num_interface_names (NMSettingMatch *setting)
{
g_return_val_if_fail (NM_IS_SETTING_MATCH (setting), 0);
- return setting->interface_name->len;
+ return nm_g_array_len (setting->interface_name);
}
/**
@@ -72,9 +76,9 @@ 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 (idx >= 0 && idx < setting->interface_name->len, NULL);
+ g_return_val_if_fail (setting->interface_name && idx >= 0 && idx < setting->interface_name->len, NULL);
- return setting->interface_name->pdata[idx];
+ return g_array_index (setting->interface_name, const char *, idx);
}
/**
@@ -94,7 +98,7 @@ nm_setting_match_add_interface_name (NMSettingMatch *setting,
g_return_if_fail (interface_name != NULL);
g_return_if_fail (interface_name[0] != '\0');
- g_ptr_array_add (setting->interface_name, g_strdup (interface_name));
+ nm_strvarray_add (nm_strvarray_ensure (&setting->interface_name), interface_name);
_notify (setting, PROP_INTERFACE_NAME);
}
@@ -112,9 +116,9 @@ nm_setting_match_remove_interface_name (NMSettingMatch *setting, int idx)
{
g_return_if_fail (NM_IS_SETTING_MATCH (setting));
- g_return_if_fail (idx >= 0 && idx < setting->interface_name->len);
+ g_return_if_fail (setting->interface_name && idx >= 0 && idx < setting->interface_name->len);
- g_ptr_array_remove_index (setting->interface_name, idx);
+ g_array_remove_index (setting->interface_name, idx);
_notify (setting, PROP_INTERFACE_NAME);
}
@@ -139,9 +143,12 @@ nm_setting_match_remove_interface_name_by_value (NMSettingMatch *setting,
g_return_val_if_fail (interface_name != NULL, FALSE);
g_return_val_if_fail (interface_name[0] != '\0', FALSE);
+ if (!setting->interface_name)
+ return FALSE;
+
for (i = 0; i < setting->interface_name->len; i++) {
- if (nm_streq (interface_name, setting->interface_name->pdata[i])) {
- g_ptr_array_remove_index (setting->interface_name, i);
+ if (nm_streq (interface_name, g_array_index (setting->interface_name, const char *, i))) {
+ g_array_remove_index (setting->interface_name, i);
_notify (setting, PROP_INTERFACE_NAME);
return TRUE;
}
@@ -162,8 +169,8 @@ nm_setting_match_clear_interface_names (NMSettingMatch *setting)
{
g_return_if_fail (NM_IS_SETTING_MATCH (setting));
- if (setting->interface_name->len != 0) {
- g_ptr_array_set_size (setting->interface_name, 0);
+ if (nm_g_array_len (setting->interface_name) != 0) {
+ nm_clear_pointer (&setting->interface_name, g_array_unref);
_notify (setting, PROP_INTERFACE_NAME);
}
}
@@ -171,11 +178,14 @@ nm_setting_match_clear_interface_names (NMSettingMatch *setting)
/**
* nm_setting_match_get_interface_names:
* @setting: the #NMSettingMatch
- * @length: (out): the length of the returned interface names array.
+ * @length: (out) (allow-none): the length of the returned interface names array.
*
* Returns all the interface names.
*
- * Returns: (transfer none) (array length=length): the configured interface names.
+ * Returns: (transfer none) (array length=length): the NULL terminated list of
+ * configured interface names.
+ *
+ * Before 1.26, the returned array was not %NULL terminated and you MUST provide a length.
*
* Since: 1.14
**/
@@ -183,10 +193,308 @@ const char *const *
nm_setting_match_get_interface_names (NMSettingMatch *setting, guint *length)
{
g_return_val_if_fail (NM_IS_SETTING_MATCH (setting), NULL);
- g_return_val_if_fail (length, NULL);
- NM_SET_OUT (length, setting->interface_name->len);
- return (const char *const *) setting->interface_name->pdata;
+ return nm_strvarray_get_strv (&setting->interface_name, length);
+}
+
+/*****************************************************************************/
+
+/**
+ * nm_setting_match_get_num_kernel_command_lines:
+ * @setting: the #NMSettingMatch
+ *
+ * Returns: the number of configured kernel command line arguments
+ *
+ * Since: 1.26
+ **/
+guint
+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);
+}
+
+/**
+ * nm_setting_match_get_kernel_command_line:
+ * @setting: the #NMSettingMatch
+ * @idx: index number of the kernel command line argument to return
+ *
+ * Returns: the kernel command line argument at index @idx
+ *
+ * Since: 1.26
+ **/
+const char *
+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, NULL);
+
+ return g_array_index (setting->kernel_command_line, const char *, idx);
+}
+
+/**
+ * nm_setting_match_add_kernel_command_line:
+ * @setting: the #NMSettingMatch
+ * @kernel_command_line: the kernel command line argument to add
+ *
+ * Adds a new kernel command line argument to the setting.
+ *
+ * Since: 1.26
+ **/
+void
+nm_setting_match_add_kernel_command_line (NMSettingMatch *setting,
+ const char *kernel_command_line)
+{
+ g_return_if_fail (NM_IS_SETTING_MATCH (setting));
+ g_return_if_fail (kernel_command_line != NULL);
+ g_return_if_fail (kernel_command_line[0] != '\0');
+
+ nm_strvarray_add (nm_strvarray_ensure (&setting->kernel_command_line), kernel_command_line);
+ _notify (setting, PROP_KERNEL_COMMAND_LINE);
+}
+
+/**
+ * nm_setting_match_remove_kernel_command_line:
+ * @setting: the #NMSettingMatch
+ * @idx: index number of the kernel command line argument
+ *
+ * Removes the kernel command line argument at index @idx.
+ *
+ * Since: 1.26
+ **/
+void
+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_array_remove_index (setting->kernel_command_line, idx);
+ _notify (setting, PROP_KERNEL_COMMAND_LINE);
+}
+
+/**
+ * nm_setting_match_remove_kernel_command_line_by_value:
+ * @setting: the #NMSettingMatch
+ * @kernel_command_line: the kernel command line argument name to remove
+ *
+ * Removes @kernel_command_line.
+ *
+ * Returns: %TRUE if the kernel command line argument was found and removed; %FALSE if it was not.
+ *
+ * Since: 1.26
+ **/
+gboolean
+nm_setting_match_remove_kernel_command_line_by_value (NMSettingMatch *setting,
+ const char *kernel_command_line)
+{
+ guint i;
+
+ g_return_val_if_fail (NM_IS_SETTING_MATCH (setting), FALSE);
+ g_return_val_if_fail (kernel_command_line != NULL, FALSE);
+ g_return_val_if_fail (kernel_command_line[0] != '\0', FALSE);
+
+ if (!setting->kernel_command_line)
+ return FALSE;
+
+ for (i = 0; i < setting->kernel_command_line->len; i++) {
+ if (nm_streq (kernel_command_line, g_array_index (setting->kernel_command_line, const char *, i))) {
+ g_array_remove_index (setting->kernel_command_line, i);
+ _notify (setting, PROP_KERNEL_COMMAND_LINE);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/**
+ * nm_setting_match_clear_kernel_command_lines:
+ * @setting: the #NMSettingMatch
+ *
+ * Removes all configured kernel command line arguments.
+ *
+ * Since: 1.26
+ **/
+void
+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);
+ _notify (setting, PROP_KERNEL_COMMAND_LINE);
+ }
+}
+
+/**
+ * nm_setting_match_get_kernel_command_lines:
+ * @setting: the #NMSettingMatch
+ * @length: (out) (allow-none): the length of the returned interface names array.
+ *
+ * Returns all the interface names.
+ *
+ * Returns: (transfer none) (array length=length): the configured interface names.
+ *
+ * Since: 1.26
+ **/
+const char *const *
+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);
+}
+
+/*****************************************************************************/
+
+/**
+ * nm_setting_match_get_num_drivers:
+ * @setting: the #NMSettingMatch
+ *
+ * Returns: the number of configured drivers
+ *
+ * Since: 1.26
+ **/
+guint
+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);
+}
+
+/**
+ * nm_setting_match_get_driver:
+ * @setting: the #NMSettingMatch
+ * @idx: index number of the DNS search domain to return
+ *
+ * Returns: the driver at index @idx
+ *
+ * Since: 1.26
+ **/
+const char *
+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);
+
+ return g_array_index (setting->driver, const char *, idx);
+}
+
+/**
+ * nm_setting_match_add_driver:
+ * @setting: the #NMSettingMatch
+ * @driver: the driver to add
+ *
+ * Adds a new driver to the setting.
+ *
+ * Since: 1.26
+ **/
+void
+nm_setting_match_add_driver (NMSettingMatch *setting,
+ const char *driver)
+{
+ g_return_if_fail (NM_IS_SETTING_MATCH (setting));
+ g_return_if_fail (driver != NULL);
+ g_return_if_fail (driver[0] != '\0');
+
+ nm_strvarray_add (nm_strvarray_ensure (&setting->driver), driver);
+ _notify (setting, PROP_DRIVER);
+}
+
+/**
+ * nm_setting_match_remove_driver:
+ * @setting: the #NMSettingMatch
+ * @idx: index number of the driver
+ *
+ * Removes the driver at index @idx.
+ *
+ * Since: 1.26
+ **/
+void
+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_array_remove_index (setting->driver, idx);
+ _notify (setting, PROP_DRIVER);
+}
+
+/**
+ * nm_setting_match_remove_driver_by_value:
+ * @setting: the #NMSettingMatch
+ * @driver: the driver to remove
+ *
+ * Removes @driver.
+ *
+ * Returns: %TRUE if the driver was found and removed; %FALSE if it was not.
+ *
+ * Since: 1.26
+ **/
+gboolean
+nm_setting_match_remove_driver_by_value (NMSettingMatch *setting,
+ const char *driver)
+{
+ guint i;
+
+ g_return_val_if_fail (NM_IS_SETTING_MATCH (setting), FALSE);
+ g_return_val_if_fail (driver != NULL, FALSE);
+ g_return_val_if_fail (driver[0] != '\0', FALSE);
+
+ if (!setting->driver)
+ return FALSE;
+
+ for (i = 0; i < setting->driver->len; i++) {
+ if (nm_streq (driver, g_array_index (setting->driver, const char *, i))) {
+ g_array_remove_index (setting->driver, i);
+ _notify (setting, PROP_DRIVER);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/**
+ * nm_setting_match_clear_drivers:
+ * @setting: the #NMSettingMatch
+ *
+ * Removes all configured drivers.
+ *
+ * Since: 1.26
+ **/
+void
+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);
+ _notify (setting, PROP_DRIVER);
+ }
+}
+
+/**
+ * nm_setting_match_get_drivers:
+ * @setting: the #NMSettingMatch
+ * @length: (out) (allow-none): the length of the returned interface names array.
+ *
+ * Returns all the drivers.
+ *
+ * Returns: (transfer none) (array length=length): the configured drivers.
+ *
+ * Since: 1.26
+ **/
+const char *const *
+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);
}
/*****************************************************************************/
@@ -199,7 +507,13 @@ get_property (GObject *object, guint prop_id,
switch (prop_id) {
case PROP_INTERFACE_NAME:
- g_value_take_boxed (value, _nm_utils_ptrarray_to_strv (self->interface_name));
+ g_value_set_boxed (value, nm_strvarray_get_strv (&self->interface_name, NULL));
+ break;
+ case PROP_KERNEL_COMMAND_LINE:
+ g_value_set_boxed (value, nm_strvarray_get_strv (&self->kernel_command_line, NULL));
+ break;
+ case PROP_DRIVER:
+ g_value_set_boxed (value, nm_strvarray_get_strv (&self->driver, NULL));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -215,8 +529,13 @@ set_property (GObject *object, guint prop_id,
switch (prop_id) {
case PROP_INTERFACE_NAME:
- g_ptr_array_unref (self->interface_name);
- self->interface_name = _nm_utils_strv_to_ptrarray (g_value_get_boxed (value));
+ 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;
+ case PROP_DRIVER:
+ nm_strvarray_set_strv (&self->driver, g_value_get_boxed (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -229,7 +548,6 @@ set_property (GObject *object, guint prop_id,
static void
nm_setting_match_init (NMSettingMatch *setting)
{
- setting->interface_name = g_ptr_array_new_with_free_func (g_free);
}
/**
@@ -247,12 +565,65 @@ nm_setting_match_new (void)
return (NMSetting *) g_object_new (NM_TYPE_SETTING_MATCH, NULL);
}
+static gboolean
+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 (g_array_index (self->interface_name, const char *, i))) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("is empty"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_MATCH_SETTING_NAME,
+ NM_SETTING_MATCH_INTERFACE_NAME);
+ return FALSE;
+ }
+ }
+ }
+
+ if (self->kernel_command_line) {
+ for (i = 0; i < self->kernel_command_line->len; i++) {
+ if (nm_str_is_empty (g_array_index (self->kernel_command_line, const char *, i))) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("is empty"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_MATCH_SETTING_NAME,
+ NM_SETTING_MATCH_KERNEL_COMMAND_LINE);
+ return FALSE;
+ }
+ }
+ }
+
+ if (self->driver) {
+ for (i = 0; i < self->driver->len; i++) {
+ if (nm_str_is_empty (g_array_index (self->driver, const char *, i))) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("is empty"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_MATCH_SETTING_NAME,
+ NM_SETTING_MATCH_DRIVER);
+ return FALSE;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
static void
finalize (GObject *object)
{
NMSettingMatch *self = NM_SETTING_MATCH (object);
- g_ptr_array_unref (self->interface_name);
+ nm_clear_pointer (&self->interface_name, g_array_unref);
+ nm_clear_pointer (&self->kernel_command_line, g_array_unref);
+ nm_clear_pointer (&self->driver, g_array_unref);
G_OBJECT_CLASS (nm_setting_match_parent_class)->finalize (object);
}
@@ -267,6 +638,8 @@ nm_setting_match_class_init (NMSettingMatchClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
+ setting_class->verify = verify;
+
/**
* NMSettingMatch:interface-name
*
@@ -288,6 +661,45 @@ nm_setting_match_class_init (NMSettingMatchClass *klass)
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS);
+ /**
+ * NMSettingMatch:kernel-command-line
+ *
+ * A list of kernel command line arguments to match. This may be used to check
+ * whether a specific kernel command line option is set (or if prefixed with
+ * the exclamation mark unset). The argument must either be a single word, or
+ * an assignment (i.e. two words, separated "="). In the former case the kernel
+ * command line is searched for the word appearing as is, or as left hand side
+ * of an assignment. In the latter case, the exact assignment is looked for
+ * with right and left hand side matching.
+ *
+ * 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);
+
+ /**
+ * NMSettingMatch:driver
+ *
+ * A list of driver names to match. Each element is a shell wildcard pattern.
+ * When an element is prefixed with exclamation mark (!) the condition is
+ * inverted. A candidate driver name is considered matching when both these
+ * conditions are satisfied: (a) any of the elements not prefixed with '!'
+ * matches or there aren't such elements; (b) none of the elements prefixed
+ * with '!' match.
+ *
+ * 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);
+
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_MATCH);
diff --git a/libnm-core/nm-setting-match.h b/libnm-core/nm-setting-match.h
index e15911adb3..fa656037e0 100644
--- a/libnm-core/nm-setting-match.h
+++ b/libnm-core/nm-setting-match.h
@@ -24,6 +24,8 @@ G_BEGIN_DECLS
#define NM_SETTING_MATCH_SETTING_NAME "match"
#define NM_SETTING_MATCH_INTERFACE_NAME "interface-name"
+#define NM_SETTING_MATCH_KERNEL_COMMAND_LINE "kernel-command-line"
+#define NM_SETTING_MATCH_DRIVER "driver"
typedef struct _NMSettingMatchClass NMSettingMatchClass;
@@ -49,6 +51,43 @@ NM_AVAILABLE_IN_1_14
void nm_setting_match_clear_interface_names (NMSettingMatch *setting);
NM_AVAILABLE_IN_1_14
const char *const *nm_setting_match_get_interface_names (NMSettingMatch *setting, guint *length);
+
+
+NM_AVAILABLE_IN_1_26
+guint nm_setting_match_get_num_kernel_command_lines (NMSettingMatch *setting);
+NM_AVAILABLE_IN_1_26
+const char *nm_setting_match_get_kernel_command_line (NMSettingMatch *setting, guint idx);
+NM_AVAILABLE_IN_1_26
+void nm_setting_match_remove_kernel_command_line (NMSettingMatch *setting, guint idx);
+NM_AVAILABLE_IN_1_26
+gboolean nm_setting_match_remove_kernel_command_line_by_value (NMSettingMatch *setting,
+ const char *kernel_command_line);
+NM_AVAILABLE_IN_1_26
+void nm_setting_match_add_kernel_command_line (NMSettingMatch *setting,
+ const char *kernel_command_line);
+NM_AVAILABLE_IN_1_26
+void nm_setting_match_clear_kernel_command_lines (NMSettingMatch *setting);
+NM_AVAILABLE_IN_1_26
+const char *const *nm_setting_match_get_kernel_command_lines (NMSettingMatch *setting, guint *length);
+
+
+NM_AVAILABLE_IN_1_26
+guint nm_setting_match_get_num_drivers (NMSettingMatch *setting);
+NM_AVAILABLE_IN_1_26
+const char *nm_setting_match_get_driver (NMSettingMatch *setting, guint idx);
+NM_AVAILABLE_IN_1_26
+void nm_setting_match_remove_driver (NMSettingMatch *setting, guint idx);
+NM_AVAILABLE_IN_1_26
+gboolean nm_setting_match_remove_driver_by_value (NMSettingMatch *setting,
+ const char *driver);
+NM_AVAILABLE_IN_1_26
+void nm_setting_match_add_driver (NMSettingMatch *setting,
+ const char *driver);
+NM_AVAILABLE_IN_1_26
+void nm_setting_match_clear_drivers (NMSettingMatch *setting);
+NM_AVAILABLE_IN_1_26
+const char *const *nm_setting_match_get_drivers (NMSettingMatch *setting, guint *length);
+
G_END_DECLS
#endif /* NM_SETTING_MATCH_H */
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c
index 7391b0f00a..7b69b4ef7a 100644
--- a/libnm-core/nm-utils.c
+++ b/libnm-core/nm-utils.c
@@ -2500,7 +2500,7 @@ nm_utils_tc_qdisc_from_str (const char *str, GError **error)
break;
}
}
- nm_clear_pointer (&rest, g_free);
+ nm_clear_g_free (&rest);
if (options) {
value = g_hash_table_lookup (options, "");
diff --git a/libnm-core/nm-version.h b/libnm-core/nm-version.h
index 195fc19684..203840376e 100644
--- a/libnm-core/nm-version.h
+++ b/libnm-core/nm-version.h
@@ -229,6 +229,20 @@
# define NM_AVAILABLE_IN_1_24
#endif
+#if NM_VERSION_MIN_REQUIRED >= NM_VERSION_1_26
+# define NM_DEPRECATED_IN_1_26 G_DEPRECATED
+# define NM_DEPRECATED_IN_1_26_FOR(f) G_DEPRECATED_FOR(f)
+#else
+# define NM_DEPRECATED_IN_1_26
+# define NM_DEPRECATED_IN_1_26_FOR(f)
+#endif
+
+#if NM_VERSION_MAX_ALLOWED < NM_VERSION_1_26
+# define NM_AVAILABLE_IN_1_26 G_UNAVAILABLE(1,26)
+#else
+# define NM_AVAILABLE_IN_1_26
+#endif
+
/*
* Synchronous API for calling D-Bus in libnm is deprecated. See
* https://developer.gnome.org/libnm/stable/usage.html#sync-api
diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c
index 138702e4ca..7da2479647 100644
--- a/libnm-core/tests/test-general.c
+++ b/libnm-core/tests/test-general.c
@@ -3334,6 +3334,7 @@ test_connection_diff_a_only (void)
{ NM_SETTING_CONNECTION_AUTH_RETRIES, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_CONNECTION_MDNS, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_CONNECTION_LLMNR, NM_SETTING_DIFF_RESULT_IN_A },
+ { NM_SETTING_CONNECTION_MUD_URL, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_CONNECTION_WAIT_DEVICE_TIMEOUT, NM_SETTING_DIFF_RESULT_IN_A },
{ NULL, NM_SETTING_DIFF_RESULT_UNKNOWN }
} },
diff --git a/libnm-core/tests/test-setting.c b/libnm-core/tests/test-setting.c
index cb8f41fb03..f77ba9fd17 100644
--- a/libnm-core/tests/test-setting.c
+++ b/libnm-core/tests/test-setting.c
@@ -1998,6 +1998,13 @@ test_bridge_verify (void)
test_verify_options_bridge (TRUE,
"multicast-snooping", "yes",
"multicast-router", "disabled");
+ /* multicast-hash-max */
+ test_verify_options_bridge (TRUE,
+ "multicast-hash-max", "1024");
+ test_verify_options_bridge (TRUE,
+ "multicast-hash-max", "8192");
+ test_verify_options_bridge (FALSE,
+ "multicast-hash-max", "3");
}
/*****************************************************************************/
diff --git a/libnm/generate-setting-docs.py b/libnm/generate-setting-docs.py
index 025689ea3c..38b914b3c9 100755
--- a/libnm/generate-setting-docs.py
+++ b/libnm/generate-setting-docs.py
@@ -10,7 +10,7 @@ import os
import gi
gi.require_version('GIRepository', '2.0')
from gi.repository import GIRepository
-import argparse, datetime, re, sys
+import argparse, re, sys
import xml.etree.ElementTree as ET
try:
@@ -47,7 +47,6 @@ dbus_type_name_map = {
'aay': 'array of byte array',
'a(ayuay)': 'array of legacy IPv6 address struct',
'a(ayuayu)': 'array of legacy IPv6 route struct',
- 'aa{sv}': 'array of vardict',
}
ns_map = {
diff --git a/libnm/libnm.ver b/libnm/libnm.ver
index b5ce8c34a3..59e7db4ff1 100644
--- a/libnm/libnm.ver
+++ b/libnm/libnm.ver
@@ -1695,3 +1695,31 @@ global:
nm_setting_vrf_get_type;
nm_setting_vrf_new;
} libnm_1_22_8;
+
+libnm_1_26_0 {
+global:
+ nm_setting_bridge_get_multicast_hash_max;
+ nm_setting_bridge_get_multicast_last_member_count;
+ nm_setting_bridge_get_multicast_last_member_interval;
+ nm_setting_bridge_get_multicast_membership_interval;
+ nm_setting_bridge_get_multicast_querier_interval;
+ nm_setting_bridge_get_multicast_query_interval;
+ nm_setting_bridge_get_multicast_query_response_interval;
+ nm_setting_bridge_get_multicast_startup_query_count;
+ nm_setting_bridge_get_multicast_startup_query_interval;
+ nm_setting_connection_get_mud_url;
+ nm_setting_match_add_driver;
+ nm_setting_match_add_kernel_command_line;
+ nm_setting_match_clear_drivers;
+ nm_setting_match_clear_kernel_command_lines;
+ nm_setting_match_get_driver;
+ nm_setting_match_get_drivers;
+ nm_setting_match_get_kernel_command_line;
+ nm_setting_match_get_kernel_command_lines;
+ nm_setting_match_get_num_drivers;
+ nm_setting_match_get_num_kernel_command_lines;
+ nm_setting_match_remove_driver;
+ nm_setting_match_remove_driver_by_value;
+ nm_setting_match_remove_kernel_command_line;
+ nm_setting_match_remove_kernel_command_line_by_value;
+} libnm_1_24_0;
diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml
index 6aa0398e64..76a535fb5d 100644
--- a/man/NetworkManager.conf.xml
+++ b/man/NetworkManager.conf.xml
@@ -679,6 +679,10 @@ ipv6.ip6-privacy=0
<term><varname>connection.autoconnect-slaves</varname></term>
</varlistentry>
<varlistentry>
+ <term><varname>connection.mud-url</varname></term>
+ <listitem><para>If unspecified, MUD URL defaults to <literal>"none"</literal>.</para></listitem>
+ </varlistentry>
+ <varlistentry>
<term><varname>connection.lldp</varname></term>
</varlistentry>
<varlistentry>
diff --git a/man/nm-initrd-generator.xml b/man/nm-initrd-generator.xml
index df2cf12a4b..37f5ffdf4b 100644
--- a/man/nm-initrd-generator.xml
+++ b/man/nm-initrd-generator.xml
@@ -77,6 +77,20 @@
<varlistentry>
<term>
<group choice='plain'>
+ <arg choice='plain'><option>-i</option></arg>
+ <arg choice='plain'><option>--initrd-data-dir</option></arg>
+ </group>
+ <arg choice='plain'><replaceable>path</replaceable></arg>
+ </term>
+
+ <listitem>
+ <para>Output directory for initrd data (e.g. hostname).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <group choice='plain'>
<arg choice='plain'><option>-d</option></arg>
<arg choice='plain'><option>--sysfs-dir</option></arg>
</group>
@@ -118,6 +132,7 @@
<member><option>nameserver</option></member>
<member><option>rd.peerdns</option></member>
<member><option>rd.bootif</option></member>
+ <member><option>rd.net.timeout.dhcp</option></member>
<member><option>BOOTIF</option></member>
</simplelist>
@@ -128,6 +143,34 @@
</variablelist>
</refsect1>
+ <refsect1 id='differences_from_network_legacy'><title>Differences from the network-legacy dracut module</title>
+
+ <para><command>nm-initrd-generator</command> generates a set of
+ connections that are then configured by the NetworkManager
+ instance running in the initrd. There are some differences in
+ behavior compared to the network-legacy dracut module:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>When an interface is configured with a static address
+ and a gateway, the network-legacy module waits that the
+ gateway responds to arping requests before proceeding, while
+ NetworkManager doesn't.</para>
+ </listitem>
+
+ <listitem>
+ <para>network-legacy configures interfaces one by one in the
+ order in which they are announced by udev. If multiple
+ interfaces specify a hostname (from command line or from
+ DHCP), the one from the last interface activated wins. With
+ NetworkManager, hostnames from command line have higher
+ precedence over ones from DHCP, and the last that appears in
+ the command line wins.</para>
+ </listitem>
+
+ </itemizedlist>
+ </refsect1>
+
<refsect1 id='exit_status'><title>Exit Status</title>
<para><command>nm-initrd-generator</command> exits with status 0. It ignores unrecognized
options and prints an error message if it encounters a malformed option.</para>
diff --git a/meson.build b/meson.build
index bb0bcd98f0..a2d925a7e5 100644
--- a/meson.build
+++ b/meson.build
@@ -6,7 +6,7 @@ project(
# - add corresponding NM_VERSION_x_y_z macros in
# "shared/nm-version-macros.h.in"
# - update number in configure.ac
- version: '1.24.0',
+ version: '1.25.1',
license: 'GPL2+',
default_options: [
'buildtype=debugoptimized',
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 852901d8ab..93df2fa2a5 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -75,6 +75,7 @@ libnm-core/nm-setting-ip4-config.c
libnm-core/nm-setting-ip6-config.c
libnm-core/nm-setting-macsec.c
libnm-core/nm-setting-macvlan.c
+libnm-core/nm-setting-match.c
libnm-core/nm-setting-olpc-mesh.c
libnm-core/nm-setting-ovs-bridge.c
libnm-core/nm-setting-ovs-interface.c
diff --git a/po/uk.po b/po/uk.po
index 961f3c4941..396ba69ceb 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/NetworkManager/NetworkMan"
"ager/issues\n"
-"POT-Creation-Date: 2020-04-07 03:31+0000\n"
-"PO-Revision-Date: 2020-04-07 09:33+0300\n"
+"POT-Creation-Date: 2020-05-05 15:43+0000\n"
+"PO-Revision-Date: 2020-05-05 21:38+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
"Language: uk\n"
@@ -22,7 +22,7 @@ msgstr ""
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-#: ../clients/cli/agent.c:24
+#: ../clients/cli/agent.c:22
#, c-format
msgid ""
"Usage: nmcli agent { COMMAND | help }\n"
@@ -35,7 +35,7 @@ msgstr ""
"КОМÐÐДР:= { secret | polkit | all }\n"
"\n"
-#: ../clients/cli/agent.c:32
+#: ../clients/cli/agent.c:30
#, c-format
msgid ""
"Usage: nmcli agent secret { help }\n"
@@ -54,7 +54,7 @@ msgstr ""
"знадобитьÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ, запитуватиме про нього у кориÑтувача.\n"
"\n"
-#: ../clients/cli/agent.c:42
+#: ../clients/cli/agent.c:40
#, c-format
msgid ""
"Usage: nmcli agent polkit { help }\n"
@@ -73,7 +73,7 @@ msgstr ""
"запит Ñ– передаÑÑ‚ÑŒ відповідь на нього polkit.\n"
"\n"
-#: ../clients/cli/agent.c:52
+#: ../clients/cli/agent.c:50
#, c-format
msgid ""
"Usage: nmcli agent all { help }\n"
@@ -86,22 +86,22 @@ msgstr ""
"ЗапуÑтити nmcli Ñк агент паролів NetworkManager та polkit.\n"
"\n"
-#: ../clients/cli/agent.c:144
+#: ../clients/cli/agent.c:142
#, c-format
msgid "nmcli successfully registered as a NetworkManager's secret agent.\n"
msgstr "nmcli уÑпішно зареєÑтровано Ñк агент паролів NetworkManager.\n"
-#: ../clients/cli/agent.c:146
+#: ../clients/cli/agent.c:144
#, c-format
msgid "Error: secret agent initialization failed"
msgstr "Помилка: не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ агент обробки паролів"
-#: ../clients/cli/agent.c:157
+#: ../clients/cli/agent.c:153
#, c-format
msgid "nmcli successfully registered as a polkit agent.\n"
msgstr "nmcli уÑпішно зареєÑтровано Ñк агент polkit.\n"
-#: ../clients/cli/agent.c:180
+#: ../clients/cli/agent.c:176
#, c-format
msgid "Error: polkit agent initialization failed: %s"
msgstr "Помилка: не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ агент polkit: %s"
@@ -141,61 +141,61 @@ msgstr ""
msgid "Error: Could not create NMClient object: %s."
msgstr "Помилка: не вдалоÑÑ Ñтворити об'єкт NMClient: %s."
-#: ../clients/cli/common.c:1264
+#: ../clients/cli/common.c:1265
msgid "Error: NetworkManager is not running."
msgstr "Помилка: NetworkManager не працює."
-#: ../clients/cli/common.c:1361
+#: ../clients/cli/common.c:1364
#, c-format
msgid "Error: argument '%s' not understood. Try passing --help instead."
msgstr ""
"Помилка: параметр «%s» Ñ” невідомим. Спробуйте ÑкориÑтатиÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ --help."
-#: ../clients/cli/common.c:1369
+#: ../clients/cli/common.c:1372
msgid "Error: missing argument. Try passing --help."
msgstr "Помилка: пропущено параметр. Спробуйте ÑкориÑтатиÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ --help."
-#: ../clients/cli/common.c:1436
+#: ../clients/cli/common.c:1439
msgid "access denied"
msgstr "доÑтуп заборонено"
-#: ../clients/cli/common.c:1438
+#: ../clients/cli/common.c:1441
msgid "NetworkManager is not running"
msgstr "NetworkManager не запущено"
-#: ../clients/cli/common.c:1464
+#: ../clients/cli/common.c:1467
#, c-format
msgid "Error: error connecting to system bus: %s"
msgstr "Помилка: помилка під Ñ‡Ð°Ñ Ñпроби з'єднатиÑÑ Ñ–Ð· каналом ÑиÑтеми: %s"
-#: ../clients/cli/common.c:1490 ../clients/cli/connections.c:67
+#: ../clients/cli/common.c:1493 ../clients/cli/connections.c:67
#: ../clients/cli/connections.c:77 ../clients/cli/devices.c:433
#: ../clients/cli/devices.c:525 ../clients/cli/devices.c:532
-#: ../clients/cli/general.c:33 ../clients/cli/general.c:88
-#: ../clients/cli/general.c:93 ../clients/common/nm-client-utils.c:250
+#: ../clients/cli/general.c:31 ../clients/cli/general.c:86
+#: ../clients/cli/general.c:91 ../clients/common/nm-client-utils.c:250
#: ../clients/common/nm-client-utils.c:263
#: ../clients/common/nm-client-utils.c:267
#: ../clients/common/nm-client-utils.c:272
-#: ../clients/common/nm-meta-setting-desc.c:1713
-#: ../clients/common/nm-meta-setting-desc.c:1744
-#: ../clients/common/nm-meta-setting-desc.c:2646
-#: ../clients/common/nm-meta-setting-desc.c:2704
+#: ../clients/common/nm-meta-setting-desc.c:1747
+#: ../clients/common/nm-meta-setting-desc.c:1778
+#: ../clients/common/nm-meta-setting-desc.c:2680
+#: ../clients/common/nm-meta-setting-desc.c:2738
msgid "unknown"
msgstr "невідомо"
-#: ../clients/cli/common.c:1491
+#: ../clients/cli/common.c:1494
msgid "none"
msgstr "немає"
-#: ../clients/cli/common.c:1492
+#: ../clients/cli/common.c:1495
msgid "portal"
msgstr "портал"
-#: ../clients/cli/common.c:1493
+#: ../clients/cli/common.c:1496
msgid "limited"
msgstr "обмежена"
-#: ../clients/cli/common.c:1494
+#: ../clients/cli/common.c:1497
msgid "full"
msgstr "повна"
@@ -1095,19 +1095,19 @@ msgid "NetworkManager connection profiles"
msgstr "Профілі з'єднань NetworkManager"
#: ../clients/cli/connections.c:2165 ../clients/cli/connections.c:2911
-#: ../clients/cli/connections.c:2923 ../clients/cli/connections.c:2935
-#: ../clients/cli/connections.c:3165 ../clients/cli/connections.c:9056
-#: ../clients/cli/connections.c:9077 ../clients/cli/devices.c:3057
-#: ../clients/cli/devices.c:3069 ../clients/cli/devices.c:3080
-#: ../clients/cli/devices.c:3368 ../clients/cli/devices.c:3379
-#: ../clients/cli/devices.c:3397 ../clients/cli/devices.c:3406
-#: ../clients/cli/devices.c:3427 ../clients/cli/devices.c:3438
-#: ../clients/cli/devices.c:3456 ../clients/cli/devices.c:3974
-#: ../clients/cli/devices.c:3984 ../clients/cli/devices.c:3992
-#: ../clients/cli/devices.c:4004 ../clients/cli/devices.c:4019
-#: ../clients/cli/devices.c:4027 ../clients/cli/devices.c:4170
-#: ../clients/cli/devices.c:4181 ../clients/cli/devices.c:4398
-#: ../clients/cli/devices.c:4567
+#: ../clients/cli/connections.c:2924 ../clients/cli/connections.c:2937
+#: ../clients/cli/connections.c:3169 ../clients/cli/connections.c:9056
+#: ../clients/cli/connections.c:9078 ../clients/cli/devices.c:3107
+#: ../clients/cli/devices.c:3120 ../clients/cli/devices.c:3132
+#: ../clients/cli/devices.c:3424 ../clients/cli/devices.c:3435
+#: ../clients/cli/devices.c:3453 ../clients/cli/devices.c:3462
+#: ../clients/cli/devices.c:3483 ../clients/cli/devices.c:3494
+#: ../clients/cli/devices.c:3512 ../clients/cli/devices.c:4028
+#: ../clients/cli/devices.c:4039 ../clients/cli/devices.c:4048
+#: ../clients/cli/devices.c:4062 ../clients/cli/devices.c:4079
+#: ../clients/cli/devices.c:4088 ../clients/cli/devices.c:4235
+#: ../clients/cli/devices.c:4246 ../clients/cli/devices.c:4462
+#: ../clients/cli/devices.c:4631
#, c-format
msgid "Error: %s argument is missing."
msgstr "Помилка: пропущено аргумент %s."
@@ -1117,268 +1117,268 @@ msgstr "Помилка: пропущено аргумент %s."
msgid "Error: %s - no such connection profile."
msgstr "Помилка: профілю з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ %s не Ñ–Ñнує."
-#: ../clients/cli/connections.c:2284 ../clients/cli/connections.c:2898
-#: ../clients/cli/connections.c:2963 ../clients/cli/connections.c:8593
-#: ../clients/cli/connections.c:8684 ../clients/cli/connections.c:9177
+#: ../clients/cli/connections.c:2284 ../clients/cli/connections.c:2897
+#: ../clients/cli/connections.c:2967 ../clients/cli/connections.c:8597
+#: ../clients/cli/connections.c:8689 ../clients/cli/connections.c:9183
#: ../clients/cli/devices.c:1785 ../clients/cli/devices.c:2053
-#: ../clients/cli/devices.c:2223 ../clients/cli/devices.c:2331
-#: ../clients/cli/devices.c:2523 ../clients/cli/devices.c:3247
-#: ../clients/cli/devices.c:4133 ../clients/cli/devices.c:4573
-#: ../clients/cli/general.c:1017
+#: ../clients/cli/devices.c:2223 ../clients/cli/devices.c:2336
+#: ../clients/cli/devices.c:2525 ../clients/cli/devices.c:3303
+#: ../clients/cli/devices.c:4199 ../clients/cli/devices.c:4638
+#: ../clients/cli/general.c:993
#, c-format
msgid "Error: %s."
msgstr "Помилка: %s."
-#: ../clients/cli/connections.c:2377 ../clients/cli/devices.c:4350
+#: ../clients/cli/connections.c:2376 ../clients/cli/devices.c:4413
#, c-format
msgid "no active connection on device '%s'"
msgstr "на приÑтрої «%s» немає активних з'єднань"
-#: ../clients/cli/connections.c:2385
+#: ../clients/cli/connections.c:2384
msgid "no active connection or device"
msgstr "немає активних з'єднань або приÑтроїв"
-#: ../clients/cli/connections.c:2405
+#: ../clients/cli/connections.c:2404
#, c-format
msgid "device '%s' not compatible with connection '%s': "
msgstr "приÑтрій «%s» неÑуміÑний зі з'єднаннÑм «%s»: "
-#: ../clients/cli/connections.c:2438
+#: ../clients/cli/connections.c:2437
#, c-format
msgid "device '%s' not compatible with connection '%s'"
msgstr "приÑтрій «%s» неÑуміÑний зі з'єднаннÑм «%s»"
-#: ../clients/cli/connections.c:2441
+#: ../clients/cli/connections.c:2440
#, c-format
msgid "no device found for connection '%s'"
msgstr "не виÑвлено приÑтрою Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s»"
-#: ../clients/cli/connections.c:2492
+#: ../clients/cli/connections.c:2491
#, c-format
msgid "Hint: use '%s' to get more details."
msgstr "Підказка: ÑкориÑтайтеÑÑ Â«%s», щоб ознайомитиÑÑ Ñ–Ð· подробицÑми."
-#: ../clients/cli/connections.c:2510
+#: ../clients/cli/connections.c:2509
#, c-format
msgid "Connection successfully activated (%s) (D-Bus active path: %s)\n"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ÑƒÑпішно задіÑно (%s) (активний шлÑÑ… D-Bus: %s)\n"
-#: ../clients/cli/connections.c:2514 ../clients/cli/connections.c:2664
-#: ../clients/cli/connections.c:6895
+#: ../clients/cli/connections.c:2513 ../clients/cli/connections.c:2663
+#: ../clients/cli/connections.c:6898
#, c-format
msgid "Connection successfully activated (D-Bus active path: %s)\n"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ÑƒÑпішно задіÑно (активний шлÑÑ… D-Bus: %s)\n"
-#: ../clients/cli/connections.c:2521 ../clients/cli/connections.c:2643
+#: ../clients/cli/connections.c:2520 ../clients/cli/connections.c:2642
#, c-format
msgid "Error: Connection activation failed: %s"
msgstr "Помилка: не вдалоÑÑ Ð°ÐºÑ‚Ð¸Ð²ÑƒÐ²Ð°Ñ‚Ð¸ з'єднаннÑ: %s"
-#: ../clients/cli/connections.c:2558
+#: ../clients/cli/connections.c:2557
#, c-format
msgid "Error: Timeout expired (%d seconds)"
msgstr "Помилка: перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ (%d Ñекунд)."
-#: ../clients/cli/connections.c:2725
+#: ../clients/cli/connections.c:2724
#, c-format
msgid "failed to read passwd-file '%s': %s"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл passwd «%s»: %s"
-#: ../clients/cli/connections.c:2738
+#: ../clients/cli/connections.c:2737
#, c-format
msgid "missing colon in 'password' entry '%s'"
msgstr "пропущено двокрапку у запиÑÑ– «password» «%s»"
-#: ../clients/cli/connections.c:2746
+#: ../clients/cli/connections.c:2745
#, c-format
msgid "missing dot in 'password' entry '%s'"
msgstr "пропущено крапку у запиÑÑ– «password» «%s»"
-#: ../clients/cli/connections.c:2759
+#: ../clients/cli/connections.c:2758
#, c-format
msgid "invalid setting name in 'password' entry '%s'"
msgstr "некоректна назва параметра у запиÑÑ– «password» «%s»"
-#: ../clients/cli/connections.c:2816
+#: ../clients/cli/connections.c:2815
#, c-format
msgid "unknown device '%s'."
msgstr "невідомий приÑтрій, «%s»."
-#: ../clients/cli/connections.c:2821
+#: ../clients/cli/connections.c:2820
msgid "neither a valid connection nor device given"
msgstr "не вказано ні коректного з'єднаннÑ, ні приÑтрою"
-#: ../clients/cli/connections.c:2945 ../clients/cli/connections.c:9087
-#: ../clients/cli/devices.c:1744 ../clients/cli/devices.c:1790
-#: ../clients/cli/devices.c:2228 ../clients/cli/devices.c:3112
-#: ../clients/cli/devices.c:3469 ../clients/cli/devices.c:4036
-#: ../clients/cli/devices.c:4187 ../clients/cli/devices.c:4407
-#: ../clients/cli/devices.c:4577
+#: ../clients/cli/connections.c:2948 ../clients/cli/connections.c:9089
+#: ../clients/cli/devices.c:1744 ../clients/cli/devices.c:1791
+#: ../clients/cli/devices.c:2229 ../clients/cli/devices.c:3166
+#: ../clients/cli/devices.c:3525 ../clients/cli/devices.c:4098
+#: ../clients/cli/devices.c:4252 ../clients/cli/devices.c:4472
+#: ../clients/cli/devices.c:4643
#, c-format
msgid "Error: invalid extra argument '%s'."
msgstr "Помилка: некоректний додатковий аргумент, «%s»."
-#: ../clients/cli/connections.c:2971
+#: ../clients/cli/connections.c:2976
msgid "preparing"
msgstr "приготуваннÑ"
-#: ../clients/cli/connections.c:3080
+#: ../clients/cli/connections.c:3083
#, c-format
msgid "Connection '%s' (%s) successfully deleted.\n"
msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» (%s) уÑпішно вилучено.\n"
-#: ../clients/cli/connections.c:3096
+#: ../clients/cli/connections.c:3099
#, c-format
msgid "Connection '%s' successfully deactivated (D-Bus active path: %s)\n"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» уÑпішно вимкнено (активний шлÑÑ… D-Bus: %s)\n"
-#: ../clients/cli/connections.c:3147 ../clients/cli/connections.c:8780
-#: ../clients/cli/connections.c:8811 ../clients/cli/connections.c:8977
+#: ../clients/cli/connections.c:3150 ../clients/cli/connections.c:8786
+#: ../clients/cli/connections.c:8817 ../clients/cli/connections.c:8980
#, c-format
msgid "Error: No connection specified."
msgstr "Помилка: не вказано з'єднаннÑ."
-#: ../clients/cli/connections.c:3177
+#: ../clients/cli/connections.c:3182
#, c-format
msgid "Error: '%s' is not an active connection.\n"
msgstr "Помилка: «%s» не Ñ” активним з'єднаннÑм.\n"
-#: ../clients/cli/connections.c:3178
+#: ../clients/cli/connections.c:3183
#, c-format
msgid "Error: not all active connections found."
msgstr "Помилка: не уÑÑ– активні з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾."
-#: ../clients/cli/connections.c:3186
+#: ../clients/cli/connections.c:3191
#, c-format
msgid "Error: no active connection provided."
msgstr "Помилка: не надано активного з'єднаннÑ."
-#: ../clients/cli/connections.c:3217
+#: ../clients/cli/connections.c:3223
#, c-format
msgid "Connection '%s' deactivation failed: %s\n"
msgstr "Ðевдала Ñпроба вимкнути з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s»: %s\n"
-#: ../clients/cli/connections.c:3477 ../clients/cli/connections.c:3534
+#: ../clients/cli/connections.c:3481 ../clients/cli/connections.c:3538
#: ../clients/common/nm-client-utils.c:211
#, c-format
msgid "'%s' not among [%s]"
msgstr "«%s» немає Ñеред [%s]"
#. We should not really come here
-#: ../clients/cli/connections.c:3497 ../clients/cli/connections.c:3557
+#: ../clients/cli/connections.c:3501 ../clients/cli/connections.c:3561
#: ../clients/common/nm-client-utils.c:279
#, c-format
msgid "Unknown error"
msgstr "Ðевідома помилка"
-#: ../clients/cli/connections.c:3691
+#: ../clients/cli/connections.c:3695
#, c-format
msgid "Warning: master='%s' doesn't refer to any existing profile.\n"
msgstr ""
"ПопередженнÑ: master='%s' не поÑилаєтьÑÑ Ð½Ñ– на один з наÑвних профілів.\n"
-#: ../clients/cli/connections.c:4054
+#: ../clients/cli/connections.c:4058
#, c-format
msgid "Error: invalid property '%s': %s."
msgstr "Помилка: некоректна влаÑтивіÑÑ‚ÑŒ, «%s»: %s."
-#: ../clients/cli/connections.c:4069
+#: ../clients/cli/connections.c:4073
#, c-format
msgid "Error: failed to %s %s.%s: %s."
msgstr "Помилка: не вдалоÑÑ %s %s.%s: %s."
-#: ../clients/cli/connections.c:4111
+#: ../clients/cli/connections.c:4115
#, c-format
msgid "Error: '%s' is mandatory."
msgstr "Помилка: «%s» Ñ” обов'Ñзковим."
-#: ../clients/cli/connections.c:4138
+#: ../clients/cli/connections.c:4142
#, c-format
msgid "Error: invalid slave type; %s."
msgstr "Помилка: некоректний тип підлеглого; %s."
-#: ../clients/cli/connections.c:4146
+#: ../clients/cli/connections.c:4150
#, c-format
msgid "Error: invalid connection type; %s."
msgstr "Помилка: некоректний тип з'єднаннÑ; %s."
-#: ../clients/cli/connections.c:4223
+#: ../clients/cli/connections.c:4227
#, c-format
msgid "Error: bad connection type: %s"
msgstr "Помилка: помилковий тип з'єднаннÑ: %s"
-#: ../clients/cli/connections.c:4298
+#: ../clients/cli/connections.c:4302
msgid "Error: master is required"
msgstr "Помилка: Ñлід вказати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «master»"
-#: ../clients/cli/connections.c:4367
+#: ../clients/cli/connections.c:4371
#, c-format
msgid "Error: error adding bond option '%s=%s'."
msgstr "Помилка: помилка під Ñ‡Ð°Ñ Ñпроби Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° прив'Ñзки «%s=%s»."
-#: ../clients/cli/connections.c:4398
+#: ../clients/cli/connections.c:4402
#, c-format
msgid "Error: '%s' is not a valid monitoring mode; use '%s' or '%s'.\n"
msgstr ""
"Помилка: «%s» не Ñ” коректним режимом ÑпоÑтереженнÑ; ÑкориÑтайтеÑÑ Â«%s» або "
"«%s».\n"
-#: ../clients/cli/connections.c:4429
+#: ../clients/cli/connections.c:4433
#, c-format
msgid "Error: 'bt-type': '%s' not valid; use [%s, %s, %s (%s), %s]."
msgstr ""
"Помилка: «bt-type»: «%s» Ñ” некоректним; ÑкориÑтайтеÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñм з переліку "
"[%s, %s, %s (%s), %s]."
-#: ../clients/cli/connections.c:4723
+#: ../clients/cli/connections.c:4727
#, c-format
msgid "Error: setting '%s' is mandatory and cannot be removed."
msgstr "Помилка: параметр «%s» Ñ” обов'Ñзковим, його не можна вилучати."
-#: ../clients/cli/connections.c:4733
+#: ../clients/cli/connections.c:4737
#, c-format
msgid "Error: value for '%s' is missing."
msgstr "Помилка: не вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s»."
-#: ../clients/cli/connections.c:4778
+#: ../clients/cli/connections.c:4782
msgid "Error: <setting>.<property> argument is missing."
msgstr "Помилка: пропущено аргумент <параметр>.<влаÑтивіÑÑ‚ÑŒ>."
-#: ../clients/cli/connections.c:4804
+#: ../clients/cli/connections.c:4808
msgid "Error: missing setting."
msgstr "Помилка: пропущено параметр."
-#: ../clients/cli/connections.c:4822
+#: ../clients/cli/connections.c:4826
#, c-format
msgid "Setting '%s' is not present in the connection."
msgstr "У з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð°Ñ” параметра «%s»."
-#: ../clients/cli/connections.c:4826
+#: ../clients/cli/connections.c:4830
#, c-format
msgid "Error: invalid setting argument '%s'."
msgstr "Помилка: некоректний аргумент параметра, «%s»."
-#: ../clients/cli/connections.c:4850
+#: ../clients/cli/connections.c:4854
#, c-format
msgid "Error: invalid or not allowed setting '%s': %s."
msgstr "Помилка: некоректний або заборонений параметр, «%s»: %s."
-#: ../clients/cli/connections.c:4899 ../clients/cli/connections.c:4915
+#: ../clients/cli/connections.c:4903 ../clients/cli/connections.c:4919
#, c-format
msgid "Error: '%s' is ambiguous (%s.%s or %s.%s)."
msgstr "Помилка: «%s» є неоднозначним (%s.%s або %s.%s)."
-#: ../clients/cli/connections.c:4935
+#: ../clients/cli/connections.c:4939
#, c-format
msgid "Error: invalid <setting>.<property> '%s'."
msgstr "Помилка: некоректний аргумент <параметр>.<влаÑтивіÑÑ‚ÑŒ>, «%s»."
-#: ../clients/cli/connections.c:4973 ../clients/cli/connections.c:8632
+#: ../clients/cli/connections.c:4977 ../clients/cli/connections.c:8637
#, c-format
msgid "Error: Failed to add '%s' connection: %s"
msgstr "Помилка: не вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s»: %s"
-#: ../clients/cli/connections.c:4991
+#: ../clients/cli/connections.c:4995
#, c-format
msgid ""
"Warning: There is another connection with the name '%1$s'. Reference the "
@@ -1399,32 +1399,32 @@ msgstr[3] ""
"ПопередженнÑ: Ñ–Ñнує інше з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· назвою «%1$s». ПоÑилайтеÑÑ Ð½Ð° з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ "
"за його UUID, «%2$s»\n"
-#: ../clients/cli/connections.c:5000
+#: ../clients/cli/connections.c:5004
#, c-format
msgid "Connection '%s' (%s) successfully added.\n"
msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» (%s) уÑпішно додано.\n"
-#: ../clients/cli/connections.c:5062 ../clients/cli/connections.c:7001
-#: ../clients/cli/connections.c:7002 ../clients/cli/devices.c:524
+#: ../clients/cli/connections.c:5066 ../clients/cli/connections.c:7004
+#: ../clients/cli/connections.c:7005 ../clients/cli/devices.c:524
#: ../clients/cli/devices.c:531 ../clients/cli/devices.c:1248
-#: ../clients/cli/general.c:95 ../clients/cli/utils.h:293
+#: ../clients/cli/general.c:93 ../clients/cli/utils.h:293
#: ../clients/common/nm-client-utils.c:269
-#: ../clients/common/nm-meta-setting-desc.c:847
-#: ../clients/common/nm-meta-setting-desc.c:2641
+#: ../clients/common/nm-meta-setting-desc.c:871
+#: ../clients/common/nm-meta-setting-desc.c:2675
msgid "no"
msgstr "ні"
-#: ../clients/cli/connections.c:5063 ../clients/cli/connections.c:7001
-#: ../clients/cli/connections.c:7002 ../clients/cli/devices.c:523
+#: ../clients/cli/connections.c:5067 ../clients/cli/connections.c:7004
+#: ../clients/cli/connections.c:7005 ../clients/cli/devices.c:523
#: ../clients/cli/devices.c:530 ../clients/cli/devices.c:1248
-#: ../clients/cli/general.c:94 ../clients/cli/utils.h:293
+#: ../clients/cli/general.c:92 ../clients/cli/utils.h:293
#: ../clients/common/nm-client-utils.c:268
-#: ../clients/common/nm-meta-setting-desc.c:847
-#: ../clients/common/nm-meta-setting-desc.c:2638
+#: ../clients/common/nm-meta-setting-desc.c:871
+#: ../clients/common/nm-meta-setting-desc.c:2672
msgid "yes"
msgstr "так"
-#: ../clients/cli/connections.c:5149
+#: ../clients/cli/connections.c:5153
#, c-format
msgid ""
"You can specify this option more than once. Press <Enter> when you're done.\n"
@@ -1433,7 +1433,7 @@ msgstr ""
"завершите.\n"
#. Ask for optional arguments.
-#: ../clients/cli/connections.c:5251
+#: ../clients/cli/connections.c:5255
#, c-format
msgid "There is %d optional setting for %s.\n"
msgid_plural "There are %d optional settings for %s.\n"
@@ -1442,7 +1442,7 @@ msgstr[1] "Ð”Ð»Ñ Â«%2$s» передбачено %1$d додатковий па
msgstr[2] "Ð”Ð»Ñ Ð·'єднань типу «%2$s» передбачено %1$d додаткових аргументів.\n"
msgstr[3] "Ð”Ð»Ñ Ð·'єднань типу «%2$s» передбачено %1$d додатковий аргумент.\n"
-#: ../clients/cli/connections.c:5257
+#: ../clients/cli/connections.c:5261
#, c-format
msgid "Do you want to provide it? %s"
msgid_plural "Do you want to provide them? %s"
@@ -1451,22 +1451,22 @@ msgstr[1] "Хочете вказати їх? %s"
msgstr[2] "Хочете вказати їх? %s"
msgstr[3] "Хочете вказати його? %s"
-#: ../clients/cli/connections.c:5389 ../clients/cli/utils.c:279
+#: ../clients/cli/connections.c:5393 ../clients/cli/utils.c:279
#, c-format
msgid "Error: value for '%s' argument is required."
msgstr "Помилка: Ñлід вказати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s» аргументу."
-#: ../clients/cli/connections.c:5396
+#: ../clients/cli/connections.c:5400
#, c-format
msgid "Error: 'save': %s."
msgstr "Помилка: «save»: %s."
-#: ../clients/cli/connections.c:5481 ../clients/cli/connections.c:5492
+#: ../clients/cli/connections.c:5485 ../clients/cli/connections.c:5496
#, c-format
msgid "Error: '%s' argument is required."
msgstr "Помилка: Ñлід вказати параметр «%s»."
-#: ../clients/cli/connections.c:6451
+#: ../clients/cli/connections.c:6454
#, c-format
msgid "['%s' setting values]\n"
msgstr "['%s' Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°]\n"
@@ -1474,7 +1474,7 @@ msgstr "['%s' Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°]\n"
#. TRANSLATORS: do not translate command names and keywords before ::
#. * However, you should translate terms enclosed in <>.
#.
-#: ../clients/cli/connections.c:6560
+#: ../clients/cli/connections.c:6563
#, c-format
msgid ""
"---[ Main menu ]---\n"
@@ -1508,7 +1508,7 @@ msgstr ""
"nmcli <параметр-налашт.> <знач.> :: Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ nmcli\n"
"quit :: завершити роботу nmcli\n"
-#: ../clients/cli/connections.c:6587
+#: ../clients/cli/connections.c:6590
#, c-format
msgid ""
"goto <setting>[.<prop>] | <prop> :: enter setting/property for editing\n"
@@ -1529,7 +1529,7 @@ msgstr ""
" nmcli connection> goto secondaries\n"
" nmcli> goto ipv4.addresses\n"
-#: ../clients/cli/connections.c:6594
+#: ../clients/cli/connections.c:6597
#, c-format
msgid ""
"remove <setting>[.<prop>] :: remove setting or reset property value\n"
@@ -1551,7 +1551,7 @@ msgstr ""
"Приклади: nmcli> remove wifi-sec\n"
" nmcli> remove eth.mtu\n"
-#: ../clients/cli/connections.c:6601
+#: ../clients/cli/connections.c:6604
#, c-format
msgid ""
"set [<setting>.<prop> <value>] :: set property value\n"
@@ -1567,7 +1567,7 @@ msgstr ""
"\n"
"Приклад: nmcli> s con.id My connection\n"
-#: ../clients/cli/connections.c:6606
+#: ../clients/cli/connections.c:6609
#, c-format
msgid ""
"describe [<setting>.<prop>] :: describe property\n"
@@ -1580,7 +1580,7 @@ msgstr ""
"Показує Ð¾Ð¿Ð¸Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ–. СпиÑок уÑÑ–Ñ… параметрів Ñ– влаÑтивоÑтей NM можна "
"знайти на Ñторінці довідника (man) nm-settings(5).\n"
-#: ../clients/cli/connections.c:6611
+#: ../clients/cli/connections.c:6614
#, c-format
msgid ""
"print [all] :: print setting or connection values\n"
@@ -1595,7 +1595,7 @@ msgstr ""
"\n"
"Приклад: nmcli ipv4> print all\n"
-#: ../clients/cli/connections.c:6616
+#: ../clients/cli/connections.c:6619
#, c-format
msgid ""
"verify [all | fix] :: verify setting or connection validity\n"
@@ -1620,7 +1620,7 @@ msgstr ""
" nmcli> verify fix\n"
" nmcli bond> verify\n"
-#: ../clients/cli/connections.c:6625
+#: ../clients/cli/connections.c:6628
#, c-format
msgid ""
"save [persistent|temporary] :: save the connection\n"
@@ -1647,7 +1647,7 @@ msgstr ""
"потрібно\n"
"повніÑÑ‚ÑŽ вилучити поÑтійне з'єднаннÑ, вам доведетьÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ його профіль.\n"
-#: ../clients/cli/connections.c:6636
+#: ../clients/cli/connections.c:6639
#, c-format
msgid ""
"activate [<ifname>] [/<ap>|<nsp>] :: activate the connection\n"
@@ -1668,7 +1668,7 @@ msgstr ""
"/<ap>|<nsp> - AP (Wi-Fi) або NSP (WiMAX) (додайте на початку «/», Ñкщо не "
"вказано <інтерфейÑ>)\n"
-#: ../clients/cli/connections.c:6643 ../clients/cli/connections.c:6801
+#: ../clients/cli/connections.c:6646 ../clients/cli/connections.c:6804
#, c-format
msgid ""
"back :: go to upper menu level\n"
@@ -1677,7 +1677,7 @@ msgstr ""
"back :: піднÑтиÑÑ Ñƒ меню на один рівень\n"
"\n"
-#: ../clients/cli/connections.c:6646
+#: ../clients/cli/connections.c:6649
#, c-format
msgid ""
"help/? [<command>] :: help for the nmcli commands\n"
@@ -1686,7 +1686,7 @@ msgstr ""
"help/? [<команда>] :: довідка з команди nmcli\n"
"\n"
-#: ../clients/cli/connections.c:6649
+#: ../clients/cli/connections.c:6652
#, c-format
msgid ""
"nmcli [<conf-option> <value>] :: nmcli configuration\n"
@@ -1713,7 +1713,7 @@ msgstr ""
" nmcli> nmcli save-confirmation no\n"
" nmcli> nmcli prompt-color 3\n"
-#: ../clients/cli/connections.c:6671 ../clients/cli/connections.c:6807
+#: ../clients/cli/connections.c:6674 ../clients/cli/connections.c:6810
#, c-format
msgid ""
"quit :: exit nmcli\n"
@@ -1727,8 +1727,8 @@ msgstr ""
"Ð·Ð°Ð¿Ð¸Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ було збережено, кориÑтувачеві буде запропоновано "
"підтвердити дію з виходу з програми.\n"
-#: ../clients/cli/connections.c:6676 ../clients/cli/connections.c:6812
-#: ../clients/cli/connections.c:7206 ../clients/cli/connections.c:8216
+#: ../clients/cli/connections.c:6679 ../clients/cli/connections.c:6815
+#: ../clients/cli/connections.c:7209 ../clients/cli/connections.c:8219
#, c-format
msgid "Unknown command: '%s'\n"
msgstr "Ðевідома команда «%s».\n"
@@ -1736,7 +1736,7 @@ msgstr "Ðевідома команда «%s».\n"
#. TRANSLATORS: do not translate command names and keywords before ::
#. * However, you should translate terms enclosed in <>.
#.
-#: ../clients/cli/connections.c:6741
+#: ../clients/cli/connections.c:6744
#, c-format
msgid ""
"---[ Property menu ]---\n"
@@ -1763,7 +1763,7 @@ msgstr ""
"help/? [<команда>] :: вивеÑти цю довідку або Ð¾Ð¿Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸\n"
"quit :: вийти з nmcli\n"
-#: ../clients/cli/connections.c:6766
+#: ../clients/cli/connections.c:6769
#, c-format
msgid ""
"set [<value>] :: set new value\n"
@@ -1775,7 +1775,7 @@ msgstr ""
"За допомогою цієї команди можна змінити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ– на вказане "
"<значеннÑ>\n"
-#: ../clients/cli/connections.c:6770
+#: ../clients/cli/connections.c:6773
#, c-format
msgid ""
"add [<value>] :: append new value to the property\n"
@@ -1790,7 +1790,7 @@ msgstr ""
"Ñкщо влаÑтивіÑÑ‚ÑŒ належить до типу контейнерів. Якщо влаÑтивіÑÑ‚ÑŒ ÑкладаєтьÑÑ "
"лише з одного значеннÑ, це Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ замінено (те Ñаме, що Ñ– «set»).\n"
-#: ../clients/cli/connections.c:6776
+#: ../clients/cli/connections.c:6779
#, c-format
msgid ""
"change :: change current value\n"
@@ -1801,7 +1801,7 @@ msgstr ""
"\n"
"Показує поточне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ– надає змогу його редагувати.\n"
-#: ../clients/cli/connections.c:6780
+#: ../clients/cli/connections.c:6783
#, c-format
msgid ""
"remove [<value>|<index>|<option name>] :: delete the value\n"
@@ -1834,7 +1834,7 @@ msgstr ""
" nmcli bond.options> remove downdelay\n"
"\n"
-#: ../clients/cli/connections.c:6791
+#: ../clients/cli/connections.c:6794
#, c-format
msgid ""
"describe :: describe property\n"
@@ -1847,7 +1847,7 @@ msgstr ""
"Показує Ð¾Ð¿Ð¸Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ–. СпиÑок уÑÑ–Ñ… параметрів Ñ– влаÑтивоÑтей NM можна "
"знайти на Ñторінці довідника (man) nm-settings(5).\n"
-#: ../clients/cli/connections.c:6796
+#: ../clients/cli/connections.c:6799
#, c-format
msgid ""
"print [property|setting|connection] :: print property (setting, connection) "
@@ -1862,7 +1862,7 @@ msgstr ""
"Виводить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ–. За допомогою аргументу команди ви можете "
"виводити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑƒÑього параметра або уÑього запиÑу з'єднаннÑ.\n"
-#: ../clients/cli/connections.c:6804
+#: ../clients/cli/connections.c:6807
#, c-format
msgid ""
"help/? [<command>] :: help for nmcli commands\n"
@@ -1871,24 +1871,24 @@ msgstr ""
"help/? [<команда>] :: довідка з команди nmcli\n"
"\n"
-#: ../clients/cli/connections.c:6901
+#: ../clients/cli/connections.c:6904
#, c-format
msgid "Error: Connection activation failed.\n"
msgstr "Помилка: невдала Ñпроба активації з'єднаннÑ.\n"
#. TRANSLATORS: status line in nmcli connection editor
-#: ../clients/cli/connections.c:6999
+#: ../clients/cli/connections.c:7002
#, c-format
msgid "[ Type: %s | Name: %s | UUID: %s | Dirty: %s | Temp: %s ]\n"
msgstr "[ Тип: %s | Ðазва: %s | UUID: %s | Ðе збережено: %s | Тимч.: %s ]\n"
-#: ../clients/cli/connections.c:7035
+#: ../clients/cli/connections.c:7038
#, c-format
msgid "The connection is not saved. Do you really want to quit? %s"
msgstr ""
"З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ збережено. Ви Ñправді хочете завершити роботу програми? %s"
-#: ../clients/cli/connections.c:7076
+#: ../clients/cli/connections.c:7079
#, c-format
msgid ""
"The connection profile has been removed from another client. You may type "
@@ -1897,60 +1897,60 @@ msgstr ""
"Профіль з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ вилучено з іншого клієнта. Ви можете ввеÑти «save» у "
"головному меню, щоб відновити його.\n"
-#: ../clients/cli/connections.c:7110 ../clients/cli/connections.c:7504
-#: ../clients/cli/connections.c:7568
+#: ../clients/cli/connections.c:7113 ../clients/cli/connections.c:7507
+#: ../clients/cli/connections.c:7571
#, c-format
msgid "Allowed values for '%s' property: %s\n"
msgstr "Можливі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ– «%s»: %s\n"
-#: ../clients/cli/connections.c:7114 ../clients/cli/connections.c:7508
-#: ../clients/cli/connections.c:7572
+#: ../clients/cli/connections.c:7117 ../clients/cli/connections.c:7511
+#: ../clients/cli/connections.c:7575
#, c-format
msgid "Enter '%s' value: "
msgstr "Введіть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s»: "
-#: ../clients/cli/connections.c:7128 ../clients/cli/connections.c:7146
-#: ../clients/cli/connections.c:7517 ../clients/cli/connections.c:7585
+#: ../clients/cli/connections.c:7131 ../clients/cli/connections.c:7149
+#: ../clients/cli/connections.c:7520 ../clients/cli/connections.c:7588
#, c-format
msgid "Error: failed to set '%s' property: %s\n"
msgstr "Помилка: не вдалоÑÑ Ð²Ñтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ– «%s»: %s\n"
-#: ../clients/cli/connections.c:7137
+#: ../clients/cli/connections.c:7140
#, c-format
msgid "Edit '%s' value: "
msgstr "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s»: "
-#: ../clients/cli/connections.c:7160 ../clients/cli/settings.c:400
+#: ../clients/cli/connections.c:7163 ../clients/cli/settings.c:400
#, c-format
msgid "Error: %s\n"
msgstr "Помилка: %s\n"
-#: ../clients/cli/connections.c:7179
+#: ../clients/cli/connections.c:7182
#, c-format
msgid "Unknown command argument: '%s'\n"
msgstr "Ðевідомий аргумент команди: «%s»\n"
-#: ../clients/cli/connections.c:7270
+#: ../clients/cli/connections.c:7273
#, c-format
msgid "Available settings: %s\n"
msgstr "ДоÑтупні параметри: %s\n"
-#: ../clients/cli/connections.c:7282
+#: ../clients/cli/connections.c:7285
#, c-format
msgid "Error: invalid setting name; %s\n"
msgstr "Помилка: некоректна назва параметра; %s\n"
-#: ../clients/cli/connections.c:7300
+#: ../clients/cli/connections.c:7303
#, c-format
msgid "Available properties: %s\n"
msgstr "ДоÑтупні влаÑтивоÑÑ‚Ñ–: %s\n"
-#: ../clients/cli/connections.c:7308
+#: ../clients/cli/connections.c:7311
#, c-format
msgid "Error: property %s\n"
msgstr "Помилка: влаÑтивіÑÑ‚ÑŒ %s\n"
-#: ../clients/cli/connections.c:7353
+#: ../clients/cli/connections.c:7356
#, c-format
msgid ""
"Saving the connection with 'autoconnect=yes'. That might result in an "
@@ -1961,12 +1961,12 @@ msgstr ""
"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° може призвеÑти до негайного задіÑÐ½Ð½Ñ Ð·'єднаннÑ.\n"
"Хочете зберегти запиÑ? %s"
-#: ../clients/cli/connections.c:7438
+#: ../clients/cli/connections.c:7441
#, c-format
msgid "You may edit the following settings: %s\n"
msgstr "Можна редагувати такі параметри: %s\n"
-#: ../clients/cli/connections.c:7469
+#: ../clients/cli/connections.c:7472
#, c-format
msgid ""
"The connection profile has been removed from another client. You may type "
@@ -1975,234 +1975,234 @@ msgstr ""
"Профіль з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ вилучено з іншого клієнта. Ви можете ввеÑти «save», "
"щоб відновити його.\n"
-#: ../clients/cli/connections.c:7521 ../clients/cli/connections.c:7796
-#: ../clients/cli/connections.c:7828
+#: ../clients/cli/connections.c:7524 ../clients/cli/connections.c:7799
+#: ../clients/cli/connections.c:7831
#, c-format
msgid "Error: no setting selected; valid are [%s]\n"
msgstr ""
"Помилка: не вибрано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°; коректними значеннÑми Ñ” такі: [%s]\n"
-#: ../clients/cli/connections.c:7522
+#: ../clients/cli/connections.c:7525
#, c-format
msgid "use 'goto <setting>' first, or 'set <setting>.<property>'\n"
msgstr ""
"Ñпочатку ÑкориÑтайтеÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾ÑŽ «goto <параметр>» або командою «set "
"<параметр>.<влаÑтивіÑÑ‚ÑŒ>»\n"
-#: ../clients/cli/connections.c:7537 ../clients/cli/connections.c:7714
-#: ../clients/cli/connections.c:7818
+#: ../clients/cli/connections.c:7540 ../clients/cli/connections.c:7717
+#: ../clients/cli/connections.c:7821
#, c-format
msgid "Error: invalid setting argument '%s'; valid are [%s]\n"
msgstr ""
"Помилка: некоректний аргумент параметра, «%s»; коректними Ñ” такі ПÐРÐМЕТРИ: "
"[%s]\n"
-#: ../clients/cli/connections.c:7546
+#: ../clients/cli/connections.c:7549
#, c-format
msgid "Error: missing setting for '%s' property\n"
msgstr "Помилка: не вказано параметра Ð´Ð»Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ– «%s»\n"
-#: ../clients/cli/connections.c:7553
+#: ../clients/cli/connections.c:7556
#, c-format
msgid "Error: invalid property: %s\n"
msgstr "Помилка: некоректна влаÑтивіÑÑ‚ÑŒ: %s\n"
-#: ../clients/cli/connections.c:7617
+#: ../clients/cli/connections.c:7620
#, c-format
msgid "Error: unknown setting '%s'\n"
msgstr "Помилка: невідоме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s»\n"
-#: ../clients/cli/connections.c:7642
+#: ../clients/cli/connections.c:7645
#, c-format
msgid "You may edit the following properties: %s\n"
msgstr "Можна редагувати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°ÐºÐ¸Ñ… влаÑтивоÑтей: %s\n"
-#: ../clients/cli/connections.c:7687 ../clients/cli/connections.c:7746
+#: ../clients/cli/connections.c:7690 ../clients/cli/connections.c:7749
#, c-format
msgid "Error: failed to remove value of '%s': %s\n"
msgstr "Помилка: не вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s»: %s\n"
-#: ../clients/cli/connections.c:7692
+#: ../clients/cli/connections.c:7695
#, c-format
msgid "Error: no argument given; valid are [%s]\n"
msgstr "Помилка: не вказано аргументу; коректними аргументами є такі: [%s]\n"
-#: ../clients/cli/connections.c:7711
+#: ../clients/cli/connections.c:7714
#, c-format
msgid "Setting '%s' is not present in the connection.\n"
msgstr "У з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð°Ñ” параметра «%s».\n"
-#: ../clients/cli/connections.c:7772
+#: ../clients/cli/connections.c:7775
#, c-format
msgid "Error: %s properties, nor it is a setting name.\n"
msgstr "Помилка: влаÑтивоÑÑ‚Ñ– %s Ñ– не Ñ” назвою параметра.\n"
-#: ../clients/cli/connections.c:7797 ../clients/cli/connections.c:7829
+#: ../clients/cli/connections.c:7800 ../clients/cli/connections.c:7832
#, c-format
msgid "use 'goto <setting>' first, or 'describe <setting>.<property>'\n"
msgstr ""
"ÑкориÑтайтеÑÑ Ñпочатку командою «goto <параметр> або командою «describe "
"<параметр>.<влаÑтивіÑÑ‚ÑŒ>»\n"
-#: ../clients/cli/connections.c:7852
+#: ../clients/cli/connections.c:7855
#, c-format
msgid "Error: invalid property: %s, neither a valid setting name.\n"
msgstr ""
"Помилка: некоректна влаÑтивіÑÑ‚ÑŒ: %s Ñ– не Ñ” коректною назвою параметра.\n"
-#: ../clients/cli/connections.c:7882
+#: ../clients/cli/connections.c:7885
#, c-format
msgid "Error: unknown setting: '%s'\n"
msgstr "Помилка: невідомий параметр: «%s»\n"
-#: ../clients/cli/connections.c:7887
+#: ../clients/cli/connections.c:7890
#, c-format
msgid "Error: '%s' setting not present in the connection\n"
msgstr "Помилка: у з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð°Ñ” параметра «%s».\n"
-#: ../clients/cli/connections.c:7918
+#: ../clients/cli/connections.c:7921
#, c-format
msgid "Error: invalid property: %s%s\n"
msgstr "Помилка: некоректна влаÑтивіÑÑ‚ÑŒ: %s%s\n"
-#: ../clients/cli/connections.c:7920
+#: ../clients/cli/connections.c:7923
msgid ", neither a valid setting name"
msgstr ", і не є коректною назвою параметра"
-#: ../clients/cli/connections.c:7936
+#: ../clients/cli/connections.c:7939
#, c-format
msgid "Invalid verify option: %s\n"
msgstr "Ðекоректний параметр verify: %s\n"
-#: ../clients/cli/connections.c:7945
+#: ../clients/cli/connections.c:7948
#, c-format
msgid "Verify setting '%s': %s\n"
msgstr "Перевірка параметра «%s»: %s\n"
-#: ../clients/cli/connections.c:7961
+#: ../clients/cli/connections.c:7964
#, c-format
msgid "Verify connection: %s\n"
msgstr "Перевірка з'єднаннÑ: %s\n"
-#: ../clients/cli/connections.c:7964
+#: ../clients/cli/connections.c:7967
#, c-format
msgid "The error cannot be fixed automatically.\n"
msgstr "Помилку не можна виправити у автоматичному режимі.\n"
-#: ../clients/cli/connections.c:7984
+#: ../clients/cli/connections.c:7987
#, c-format
msgid "Error: invalid argument '%s'\n"
msgstr "Помилка: некоректний аргумент «%s»\n"
-#: ../clients/cli/connections.c:8034
+#: ../clients/cli/connections.c:8037
#, c-format
msgid "Error: Failed to save '%s' (%s) connection: %s\n"
msgstr "Помилка: не вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» (%s): %s\n"
-#: ../clients/cli/connections.c:8040
+#: ../clients/cli/connections.c:8043
#, c-format
msgid "Error: Timeout saving '%s' (%s) connection\n"
msgstr ""
"Помилка: Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» (%s)\n"
-#: ../clients/cli/connections.c:8045
+#: ../clients/cli/connections.c:8048
#, c-format
msgid "Connection '%s' (%s) successfully saved.\n"
msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» (%s) уÑпішно збережено.\n"
-#: ../clients/cli/connections.c:8046
+#: ../clients/cli/connections.c:8049
#, c-format
msgid "Connection '%s' (%s) successfully updated.\n"
msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» (%s) уÑпішно оновлено.\n"
-#: ../clients/cli/connections.c:8079
+#: ../clients/cli/connections.c:8082
#, c-format
msgid "Error: connection verification failed: %s\n"
msgstr "Помилка: з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ пройшло перевірки: %s\n"
-#: ../clients/cli/connections.c:8080
+#: ../clients/cli/connections.c:8083
msgid "(unknown error)"
msgstr "(невідома помилка)"
-#: ../clients/cli/connections.c:8081
+#: ../clients/cli/connections.c:8084
#, c-format
msgid "You may try running 'verify fix' to fix errors.\n"
msgstr "Ви можете Ñпробувати запуÑтити «verify fix» Ð´Ð»Ñ Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº.\n"
#. TRANSLATORS: do not translate 'save', leave it as it is
-#: ../clients/cli/connections.c:8104
+#: ../clients/cli/connections.c:8107
#, c-format
msgid "Error: connection is not saved. Type 'save' first.\n"
msgstr "Помилка: з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ збережено. Спочатку введіть «save».\n"
-#: ../clients/cli/connections.c:8108
+#: ../clients/cli/connections.c:8111
#, c-format
msgid "Error: connection is not valid: %s\n"
msgstr "Помилка: некоректне з'єднаннÑ: %s\n"
-#: ../clients/cli/connections.c:8118
+#: ../clients/cli/connections.c:8121
#, c-format
msgid "Error: Cannot activate connection: %s.\n"
msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð´Ñ–Ñти з'єднаннÑ: %s.\n"
-#: ../clients/cli/connections.c:8127
+#: ../clients/cli/connections.c:8130
#, c-format
msgid "Error: Failed to activate '%s' (%s) connection: %s\n"
msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð´Ñ–Ñти з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» (%s): %s\n"
-#: ../clients/cli/connections.c:8134
+#: ../clients/cli/connections.c:8137
msgid "Monitoring connection activation (press any key to continue)\n"
msgstr ""
"СпоÑтерігаємо за активацією з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ (натиÑніть будь-Ñку клавішу, щоб "
"продовжити)\n"
-#: ../clients/cli/connections.c:8170
+#: ../clients/cli/connections.c:8173
#, c-format
msgid "Error: status-line: %s\n"
msgstr "Помилка: Ñ€Ñдок Ñтану: %s\n"
-#: ../clients/cli/connections.c:8178
+#: ../clients/cli/connections.c:8181
#, c-format
msgid "Error: save-confirmation: %s\n"
msgstr "Помилка: save-confirmation: %s\n"
-#: ../clients/cli/connections.c:8186
+#: ../clients/cli/connections.c:8189
#, c-format
msgid "Error: show-secrets: %s\n"
msgstr "Помилка: show-secrets: %s\n"
-#: ../clients/cli/connections.c:8193
+#: ../clients/cli/connections.c:8196
#, c-format
msgid "Current nmcli configuration:\n"
msgstr "Поточне Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ nmcli:\n"
-#: ../clients/cli/connections.c:8201
+#: ../clients/cli/connections.c:8204
#, c-format
msgid "Invalid configuration option '%s'; allowed [%s]\n"
msgstr ""
"Ðекоректний параметр налаштуваннÑ, «%s»; можна викориÑтовувати лише такі: "
"[%s]\n"
-#: ../clients/cli/connections.c:8422
+#: ../clients/cli/connections.c:8426
#, c-format
msgid "Error: only one of 'id', 'filename', uuid, or 'path' can be provided."
msgstr ""
"Помилка: можна вказувати лише один з параметрів «id», «filename», uuid або "
"«path»."
-#: ../clients/cli/connections.c:8436 ../clients/cli/connections.c:8600
+#: ../clients/cli/connections.c:8441 ../clients/cli/connections.c:8605
#, c-format
msgid "Error: Unknown connection '%s'."
msgstr "Помилка: невідоме з'єднаннÑ, «%s»."
-#: ../clients/cli/connections.c:8452
+#: ../clients/cli/connections.c:8458
#, c-format
msgid "Warning: editing existing connection '%s'; 'type' argument is ignored\n"
msgstr ""
"ПопередженнÑ: Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¶Ðµ Ñтвореного запиÑу з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s»; аргумент "
"«type» проігноровано\n"
-#: ../clients/cli/connections.c:8455
+#: ../clients/cli/connections.c:8461
#, c-format
msgid ""
"Warning: editing existing connection '%s'; 'con-name' argument is ignored\n"
@@ -2210,202 +2210,202 @@ msgstr ""
"ПопередженнÑ: Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¶Ðµ Ñтвореного запиÑу з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s»; аргумент "
"«con-name» проігноровано\n"
-#: ../clients/cli/connections.c:8482
+#: ../clients/cli/connections.c:8488
#, c-format
msgid "Valid connection types: %s\n"
msgstr "Коректні типи з'єднань: %s\n"
-#: ../clients/cli/connections.c:8484
+#: ../clients/cli/connections.c:8490
#, c-format
msgid "Error: invalid connection type; %s\n"
msgstr "Помилка: некоректний тип з'єднаннÑ; %s\n"
-#: ../clients/cli/connections.c:8520
+#: ../clients/cli/connections.c:8526
#, c-format
msgid "===| nmcli interactive connection editor |==="
msgstr "===| Інтерактивний редактор з'єднань nmcli |==="
-#: ../clients/cli/connections.c:8523
+#: ../clients/cli/connections.c:8529
#, c-format
msgid "Editing existing '%s' connection: '%s'"
msgstr "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ñвного з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s»: «%s»"
-#: ../clients/cli/connections.c:8525
+#: ../clients/cli/connections.c:8531
#, c-format
msgid "Adding a new '%s' connection"
msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s»"
#. TRANSLATORS: do not translate 'help', leave it as it is
-#: ../clients/cli/connections.c:8528
+#: ../clients/cli/connections.c:8534
#, c-format
msgid "Type 'help' or '?' for available commands."
msgstr "Введіть «help» або «?», щоб ознайомитиÑÑ Ð·Ñ– ÑпиÑком доÑтупних команд."
#. TRANSLATORS: do not translate 'print', leave it as it is
-#: ../clients/cli/connections.c:8531
+#: ../clients/cli/connections.c:8537
#, c-format
msgid "Type 'print' to show all the connection properties."
msgstr "Введіть «print», щоб побачити уÑÑ– влаÑтивоÑÑ‚Ñ– з'єднаннÑ."
#. TRANSLATORS: do not translate 'describe', leave it as it is
-#: ../clients/cli/connections.c:8534
+#: ../clients/cli/connections.c:8540
#, c-format
msgid "Type 'describe [<setting>.<prop>]' for detailed property description."
msgstr ""
"Щоб ознайомитиÑÑ Ð· докладним опиÑом влаÑтивоÑÑ‚Ñ–, ÑкориÑтайтеÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾ÑŽ "
"«describe [<параметр>.<влаÑтивіÑÑ‚ÑŒ>]."
-#: ../clients/cli/connections.c:8562
+#: ../clients/cli/connections.c:8568
#, c-format
msgid "Error: Failed to modify connection '%s': %s"
msgstr "Помилка: не вдалоÑÑ Ð²Ð½ÐµÑти зміни до запиÑу з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s»: %s"
-#: ../clients/cli/connections.c:8568
+#: ../clients/cli/connections.c:8574
#, c-format
msgid "Connection '%s' (%s) successfully modified.\n"
msgstr "Зміни до з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» (%s) уÑпішно внеÑено.\n"
-#: ../clients/cli/connections.c:8636
+#: ../clients/cli/connections.c:8641
#, c-format
msgid "%s (%s) cloned as %s (%s).\n"
msgstr "%s (%s) клоновано Ñк %s (%s).\n"
-#: ../clients/cli/connections.c:8695
+#: ../clients/cli/connections.c:8701
msgid "New connection name: "
msgstr "Ðова назва з'єднаннÑ: "
-#: ../clients/cli/connections.c:8697
+#: ../clients/cli/connections.c:8703
#, c-format
msgid "Error: <new name> argument is missing."
msgstr "Помилка: не вказано параметр <нова назва>."
-#: ../clients/cli/connections.c:8702 ../clients/cli/connections.c:9188
+#: ../clients/cli/connections.c:8709 ../clients/cli/connections.c:9194
#, c-format
msgid "Error: unknown extra argument: '%s'."
msgstr "Помилка: невідомий зайвий параметр: «%s»."
-#: ../clients/cli/connections.c:8735
+#: ../clients/cli/connections.c:8741
#, c-format
msgid "Error: not all connections deleted."
msgstr "Помилка: вилучено не уÑÑ– з'єднаннÑ."
-#: ../clients/cli/connections.c:8736
+#: ../clients/cli/connections.c:8742
#, c-format
msgid "Error: Connection deletion failed: %s\n"
msgstr "Помилка: не вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ з'єднаннÑ: %s\n"
-#: ../clients/cli/connections.c:8792 ../clients/cli/connections.c:8913
+#: ../clients/cli/connections.c:8798 ../clients/cli/connections.c:8918
#, c-format
msgid "Error: %s.\n"
msgstr "Помилка: %s.\n"
-#: ../clients/cli/connections.c:8793 ../clients/cli/connections.c:8914
+#: ../clients/cli/connections.c:8799 ../clients/cli/connections.c:8919
#, c-format
msgid "Error: not all connections found."
msgstr "Помилка: знайдено не уÑÑ– з'єднаннÑ."
#. truncate trailing ", "
-#: ../clients/cli/connections.c:8844
+#: ../clients/cli/connections.c:8850
#, c-format
msgid "Error: cannot delete unknown connection(s): %s."
msgstr "Помилка: не можна вилучати невідомі з'єднаннÑ: %s."
-#: ../clients/cli/connections.c:8854
+#: ../clients/cli/connections.c:8859
#, c-format
msgid "%s: connection profile changed\n"
msgstr "%s: змінено профіль з'єднаннÑ\n"
-#: ../clients/cli/connections.c:8880
+#: ../clients/cli/connections.c:8885
#, c-format
msgid "%s: connection profile created\n"
msgstr "%s: Ñтворено профіль з'єднаннÑ\n"
-#: ../clients/cli/connections.c:8889
+#: ../clients/cli/connections.c:8894
#, c-format
msgid "%s: connection profile removed\n"
msgstr "%s: вилучено профіль з'єднаннÑ\n"
-#: ../clients/cli/connections.c:8960
+#: ../clients/cli/connections.c:8964
#, c-format
msgid "Error: failed to reload connections: %s."
msgstr "Помилка: не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ з'єднаннÑ: %s."
-#: ../clients/cli/connections.c:8992
+#: ../clients/cli/connections.c:8994
#, c-format
msgid "Error: failed to load connection: %s."
msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ з'єднаннÑ: %s."
-#: ../clients/cli/connections.c:9000
+#: ../clients/cli/connections.c:9002
#, c-format
msgid "Could not load file '%s'\n"
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл «%s»\n"
-#: ../clients/cli/connections.c:9007
+#: ../clients/cli/connections.c:9006
msgid "File to import: "
msgstr "Файл Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ: "
-#: ../clients/cli/connections.c:9040
+#: ../clients/cli/connections.c:9039
#, c-format
msgid "Error: No arguments provided."
msgstr "Помилка: не надано аргументів."
-#: ../clients/cli/connections.c:9071
+#: ../clients/cli/connections.c:9072
#, c-format
msgid "Warning: 'type' already specified, ignoring extra one.\n"
msgstr ""
"ПопередженнÑ: Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«type» вже задано, зайве Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ–Ð³Ð½Ð¾Ñ€Ð¾Ð²Ð°Ð½Ð¾.\n"
-#: ../clients/cli/connections.c:9085
+#: ../clients/cli/connections.c:9087
#, c-format
msgid "Warning: 'file' already specified, ignoring extra one.\n"
msgstr ""
"ПопередженнÑ: Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«file» вже задано, зайве Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ–Ð³Ð½Ð¾Ñ€Ð¾Ð²Ð°Ð½Ð¾.\n"
-#: ../clients/cli/connections.c:9098
+#: ../clients/cli/connections.c:9101
#, c-format
msgid "Error: 'type' argument is required."
msgstr "Помилка: Ñлід вказати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«type»."
-#: ../clients/cli/connections.c:9102
+#: ../clients/cli/connections.c:9106
#, c-format
msgid "Error: 'file' argument is required."
msgstr "Помилка: Ñлід вказати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«file»."
-#: ../clients/cli/connections.c:9111
+#: ../clients/cli/connections.c:9116
#, c-format
msgid "Error: failed to find VPN plugin for %s."
msgstr "Помилка: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ додаток VPN Ð´Ð»Ñ %s."
-#: ../clients/cli/connections.c:9118 ../clients/cli/connections.c:9209
+#: ../clients/cli/connections.c:9124 ../clients/cli/connections.c:9215
#, c-format
msgid "Error: failed to load VPN plugin: %s."
msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ додаток VPN: %s."
-#: ../clients/cli/connections.c:9127
+#: ../clients/cli/connections.c:9134
#, c-format
msgid "Error: failed to import '%s': %s."
msgstr "Помилка: не вдалоÑÑ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ «%s»: %s."
-#: ../clients/cli/connections.c:9195
+#: ../clients/cli/connections.c:9201
msgid "Output file name: "
msgstr "Ðазва файла результатів: "
-#: ../clients/cli/connections.c:9200
+#: ../clients/cli/connections.c:9206
#, c-format
msgid "Error: the connection is not VPN."
msgstr "Помилка: з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ належить до типу VPN."
-#: ../clients/cli/connections.c:9222
+#: ../clients/cli/connections.c:9228
#, c-format
msgid "Error: failed to create temporary file %s."
msgstr "Помилка: не вдалоÑÑ Ñтворити тимчаÑовий файл %s."
-#: ../clients/cli/connections.c:9230
+#: ../clients/cli/connections.c:9236
#, c-format
msgid "Error: failed to export '%s': %s."
msgstr "Помилка: не вдалоÑÑ ÐµÐºÑпортувати «%s»: %s."
-#: ../clients/cli/connections.c:9242
+#: ../clients/cli/connections.c:9248
#, c-format
msgid "Error: failed to read temporary file '%s': %s."
msgstr "Помилка: не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ тимчаÑовий файл «%s»: %s."
@@ -2935,16 +2935,16 @@ msgstr "Дані щодо приÑтрою"
msgid "Error: 'device show': %s"
msgstr "Помилка: «device show»: %s"
-#: ../clients/cli/devices.c:1759
+#: ../clients/cli/devices.c:1760
msgid "Status of devices"
msgstr "Стан приÑтрою"
-#: ../clients/cli/devices.c:1763
+#: ../clients/cli/devices.c:1764
#, c-format
msgid "Error: 'device status': %s"
msgstr "Помилка: «device status»: %s"
-#: ../clients/cli/devices.c:1826 ../clients/cli/general.c:514
+#: ../clients/cli/devices.c:1826 ../clients/cli/general.c:511
#, c-format
msgid "Error: Timeout %d sec expired."
msgstr "Помилка: перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ %d Ñ."
@@ -2987,18 +2987,18 @@ msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð´Ñ–Ñти з'єднаннÑ: %s
msgid "Error: Device activation failed: %s"
msgstr "Помилка: не вдалоÑÑ Ð°ÐºÑ‚Ð¸Ð²ÑƒÐ²Ð°Ñ‚Ð¸ приÑтрій: %s"
-#: ../clients/cli/devices.c:2058
+#: ../clients/cli/devices.c:2059
#, c-format
msgid "Error: extra argument not allowed: '%s'."
msgstr "Помилка: некоректний додатковий аргумент, «%s»."
#: ../clients/cli/devices.c:2128 ../clients/cli/devices.c:2143
-#: ../clients/cli/devices.c:2380
+#: ../clients/cli/devices.c:2384
#, c-format
msgid "Device '%s' successfully disconnected.\n"
msgstr "ПриÑтрій «%s» уÑпішно від'єднано.\n"
-#: ../clients/cli/devices.c:2131 ../clients/cli/devices.c:2454
+#: ../clients/cli/devices.c:2131 ../clients/cli/devices.c:2457
#, c-format
msgid "Device '%s' successfully removed.\n"
msgstr "ПриÑтрій «%s» уÑпішно вилучено.\n"
@@ -3014,101 +3014,101 @@ msgstr ""
msgid "Connection successfully reapplied to device '%s'.\n"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ÑƒÑпішно повторно заÑтоÑовано до приÑтрою «%s».\n"
-#: ../clients/cli/devices.c:2297
+#: ../clients/cli/devices.c:2299
#, c-format
msgid "Error: Reading applied connection from device '%s' (%s) failed: %s"
msgstr ""
"Помилка: Ñпроба Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð°ÑтоÑованого з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· приÑтрою «%s» (%s) зазнала "
"невдачі: %s"
-#: ../clients/cli/devices.c:2364
+#: ../clients/cli/devices.c:2368
#, c-format
msgid "Error: not all devices disconnected."
msgstr "Помилка: не уÑÑ– приÑтрої від'єднано."
-#: ../clients/cli/devices.c:2365
+#: ../clients/cli/devices.c:2369
#, c-format
msgid "Error: Device '%s' (%s) disconnecting failed: %s\n"
msgstr "Помилка: невдала Ñпроба від'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» (%s): %s\n"
-#: ../clients/cli/devices.c:2445
+#: ../clients/cli/devices.c:2448
#, c-format
msgid "Error: not all devices deleted."
msgstr "Помилка: вилучено не уÑÑ– приÑтрої."
-#: ../clients/cli/devices.c:2446
+#: ../clients/cli/devices.c:2449
#, c-format
msgid "Error: Device '%s' (%s) deletion failed: %s\n"
msgstr "Помилка: помилка під Ñ‡Ð°Ñ Ñпроби Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ñтрою «%s» (%s): %s\n"
-#: ../clients/cli/devices.c:2528
+#: ../clients/cli/devices.c:2531
#, c-format
msgid "Error: No property specified."
msgstr "Помилка: не вказано влаÑтивоÑÑ‚Ñ–."
-#: ../clients/cli/devices.c:2543 ../clients/cli/devices.c:2560
-#: ../clients/cli/general.c:773 ../clients/cli/general.c:785
+#: ../clients/cli/devices.c:2547 ../clients/cli/devices.c:2566
+#: ../clients/cli/general.c:769 ../clients/cli/general.c:782
#, c-format
msgid "Error: '%s' argument is missing."
msgstr "Помилка: пропущено параметр %s."
-#: ../clients/cli/devices.c:2549
+#: ../clients/cli/devices.c:2554
#, c-format
msgid "Error: 'managed': %s."
msgstr "Помилка: «managed»: %s."
-#: ../clients/cli/devices.c:2566
+#: ../clients/cli/devices.c:2573
#, c-format
msgid "Error: 'autoconnect': %s."
msgstr "Помилка: «autoconnect»: %s."
-#: ../clients/cli/devices.c:2574 ../clients/cli/general.c:799
+#: ../clients/cli/devices.c:2582 ../clients/cli/general.c:797
#, c-format
msgid "Error: property '%s' is not known."
msgstr "Помилка: влаÑтивіÑÑ‚ÑŒ «%s» Ñ” невідомою."
-#: ../clients/cli/devices.c:2623
+#: ../clients/cli/devices.c:2630
#, c-format
msgid "%s: using connection '%s'\n"
msgstr "%s: викориÑтовуємо з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s»\n"
-#: ../clients/cli/devices.c:2649
+#: ../clients/cli/devices.c:2656
#, c-format
msgid "%s: device created\n"
msgstr "%s: Ñтворено Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ€Ð¸Ñтрою\n"
-#: ../clients/cli/devices.c:2656
+#: ../clients/cli/devices.c:2663
#, c-format
msgid "%s: device removed\n"
msgstr "%s: приÑтрій вилучено\n"
-#: ../clients/cli/devices.c:2836
+#: ../clients/cli/devices.c:2842
msgid "Wi-Fi scan list"
msgstr "СпиÑок ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Wi-Fi"
-#: ../clients/cli/devices.c:2954 ../clients/cli/devices.c:3179
+#: ../clients/cli/devices.c:2960 ../clients/cli/devices.c:3236
#, c-format
msgid "Error: Access point with bssid '%s' not found."
msgstr "Помилка: не знайдено точки доÑтупу з bssid «%s»."
-#: ../clients/cli/devices.c:3106
+#: ../clients/cli/devices.c:3159
#, c-format
msgid "Error: 'device wifi': %s"
msgstr "Помилка: «device wifi»: %s"
-#: ../clients/cli/devices.c:3123
+#: ../clients/cli/devices.c:3178
#, c-format
msgid "Error: invalid rescan argument: '%s' not among [auto, no, yes]"
msgstr ""
"Помилка: некоректний аргумент rescan: «%s» не належить до набору [auto, no, "
"yes]"
-#: ../clients/cli/devices.c:3161
+#: ../clients/cli/devices.c:3217
#, c-format
msgid "Error: Device '%s' not found."
msgstr "Помилка: не знайдено приÑтрій «%s»."
-#: ../clients/cli/devices.c:3166
+#: ../clients/cli/devices.c:3222
#, c-format
msgid ""
"Error: Device '%s' was not recognized as a Wi-Fi device, check "
@@ -3117,28 +3117,28 @@ msgstr ""
"Помилка: приÑтрій «%s» не розпізнано Ñк приÑтрій Wi-Fi, перевірте, чи працює "
"додаток Wi-Fi NetworkManager."
-#: ../clients/cli/devices.c:3170 ../clients/cli/devices.c:3499
-#: ../clients/cli/devices.c:4075 ../clients/cli/devices.c:4203
-#: ../clients/cli/devices.c:4338
+#: ../clients/cli/devices.c:3226 ../clients/cli/devices.c:3555
+#: ../clients/cli/devices.c:4140 ../clients/cli/devices.c:4268
+#: ../clients/cli/devices.c:4401
#, c-format
msgid "Error: Device '%s' is not a Wi-Fi device."
msgstr "Помилка: приÑтрій «%s» не Ñ” приÑтроєм Wi-Fi."
-#: ../clients/cli/devices.c:3346
+#: ../clients/cli/devices.c:3402
msgid "SSID or BSSID: "
msgstr "SSID або BSSID: "
-#: ../clients/cli/devices.c:3351
+#: ../clients/cli/devices.c:3407
#, c-format
msgid "Error: SSID or BSSID are missing."
msgstr "Помилка: не виÑтачає SSID або BSSID."
-#: ../clients/cli/devices.c:3388
+#: ../clients/cli/devices.c:3444
#, c-format
msgid "Error: bssid argument value '%s' is not a valid BSSID."
msgstr "Помилка: Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° bssid, «%s», не Ñ” коректним BSSID."
-#: ../clients/cli/devices.c:3418
+#: ../clients/cli/devices.c:3474
#, c-format
msgid ""
"Error: wep-key-type argument value '%s' is invalid, use 'key' or 'phrase'."
@@ -3146,49 +3146,49 @@ msgstr ""
"Помилка: Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° wep-key-type, «%s», Ñ” некоректним, Ñлід "
"викориÑтовувати «key» або «phrase»."
-#: ../clients/cli/devices.c:3445 ../clients/cli/devices.c:3463
+#: ../clients/cli/devices.c:3501 ../clients/cli/devices.c:3519
#, c-format
msgid "Error: %s: %s."
msgstr "Помилка: %s: %s."
-#: ../clients/cli/devices.c:3482
+#: ../clients/cli/devices.c:3538
#, c-format
msgid "Error: BSSID to connect to (%s) differs from bssid argument (%s)."
msgstr ""
"Помилка: BSSID Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· (%s) відрізнÑєтьÑÑ Ð²Ñ–Ð´ параметра bssid (%s)."
-#: ../clients/cli/devices.c:3488
+#: ../clients/cli/devices.c:3544
#, c-format
msgid "Error: Parameter '%s' is neither SSID nor BSSID."
msgstr "Помилка: параметр «%s» не дорівнює ні SSID, ні BSSID."
-#: ../clients/cli/devices.c:3501 ../clients/cli/devices.c:4077
-#: ../clients/cli/devices.c:4205 ../clients/cli/devices.c:4439
+#: ../clients/cli/devices.c:3557 ../clients/cli/devices.c:4142
+#: ../clients/cli/devices.c:4270 ../clients/cli/devices.c:4506
#, c-format
msgid "Error: No Wi-Fi device found."
msgstr "Помилка: не знайдено жодного приÑтрою Wi-Fi."
-#: ../clients/cli/devices.c:3521
+#: ../clients/cli/devices.c:3577
#, c-format
msgid "Error: Failed to scan hidden SSID: %s."
msgstr "Помилка: неможливо виконати ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ SSID: %s."
-#: ../clients/cli/devices.c:3548
+#: ../clients/cli/devices.c:3604
#, c-format
msgid "Error: No network with SSID '%s' found."
msgstr "Помилка: не знайдено мережі з SSID «%s»."
-#: ../clients/cli/devices.c:3550
+#: ../clients/cli/devices.c:3606
#, c-format
msgid "Error: No access point with BSSID '%s' found."
msgstr "Помилка: не знайдено точки доÑтупу з BSSID «%s»."
-#: ../clients/cli/devices.c:3577
+#: ../clients/cli/devices.c:3633
#, c-format
msgid "Error: Connection '%s' exists but properties don't match."
msgstr "Помилка: Ñ–Ñнує з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s», але його влаÑтивоÑÑ‚Ñ– Ñ” невідповідними."
-#: ../clients/cli/devices.c:3620
+#: ../clients/cli/devices.c:3676
#, c-format
msgid ""
"Warning: '%s' should be SSID for hidden APs; but it looks like a BSSID.\n"
@@ -3196,159 +3196,159 @@ msgstr ""
"ПопередженнÑ: «%s» має бути SSID Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð¸Ñ… точок доÑтупу; втім, "
"здаєтьÑÑ, маємо BSSID.\n"
-#: ../clients/cli/devices.c:3657
+#: ../clients/cli/devices.c:3713
msgid "Password: "
msgstr "Пароль: "
-#: ../clients/cli/devices.c:3798
+#: ../clients/cli/devices.c:3852
#, c-format
msgid "'%s' is not valid WPA PSK"
msgstr "«%s» не є коректним PSK WPA"
-#: ../clients/cli/devices.c:3815
+#: ../clients/cli/devices.c:3869
#, c-format
msgid "'%s' is not valid WEP key (it should be 5 or 13 ASCII chars)"
msgstr ""
"«%s» не Ñ” коректним ключем WEP (коректний ключ має ÑкладатиÑÑ Ð· 5 або 13 "
"Ñимволів ASCII)"
-#: ../clients/cli/devices.c:3831
+#: ../clients/cli/devices.c:3885
#, c-format
msgid "Hotspot password: %s\n"
msgstr "Пароль до точки доÑтупу: %s\n"
-#: ../clients/cli/devices.c:3996
+#: ../clients/cli/devices.c:4053
#, c-format
msgid "Error: ssid is too long."
msgstr "Помилка: SSID є надто довгим."
-#: ../clients/cli/devices.c:4011
+#: ../clients/cli/devices.c:4070
#, c-format
msgid "Error: band argument value '%s' is invalid; use 'a' or 'bg'."
msgstr ""
"Помилка: Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñƒ «band» «%s» Ñ” некоректним; має бути «a» або «bg»."
-#: ../clients/cli/devices.c:4058
+#: ../clients/cli/devices.c:4121
#, c-format
msgid "Error: channel requires band too."
msgstr "Помилка: разом із каналом Ñлід вказати Ñмугу."
-#: ../clients/cli/devices.c:4063
+#: ../clients/cli/devices.c:4127
#, c-format
msgid "Error: channel '%s' not valid for band '%s'."
msgstr "Помилка: не можна викориÑтовувати канал «%s» Ð´Ð»Ñ Ñмуги «%s»."
-#: ../clients/cli/devices.c:4088
+#: ../clients/cli/devices.c:4154
#, c-format
msgid "Error: Device '%s' supports neither AP nor Ad-Hoc mode."
msgstr ""
"Помилка: Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñтрою «%s» не передбачено ні режиму точки доÑтупу, ні режиму "
"Ad-Hoc."
-#: ../clients/cli/devices.c:4110
+#: ../clients/cli/devices.c:4177
#, c-format
msgid "Error: Invalid 'password': %s."
msgstr "Помилка: некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«password»: %s."
-#: ../clients/cli/devices.c:4163 ../clients/cli/devices.c:4390
+#: ../clients/cli/devices.c:4228 ../clients/cli/devices.c:4453
#, c-format
msgid "Error: '%s' cannot repeat."
msgstr "Помилка: не можна повторювати «%s»."
-#: ../clients/cli/devices.c:4296 ../clients/cli/devices.c:4300
-#: ../clients/cli/devices.c:4305 ../clients/cli/devices.c:4308
+#: ../clients/cli/devices.c:4359 ../clients/cli/devices.c:4363
+#: ../clients/cli/devices.c:4368 ../clients/cli/devices.c:4371
#: ../clients/tui/nmt-page-wifi.c:250
msgid "Security"
msgstr "ЗахиÑÑ‚"
-#: ../clients/cli/devices.c:4296
+#: ../clients/cli/devices.c:4359
msgid "None"
msgstr "Ðемає"
-#: ../clients/cli/devices.c:4312 ../clients/common/nm-secret-agent-simple.c:273
+#: ../clients/cli/devices.c:4375 ../clients/common/nm-secret-agent-simple.c:273
#: ../clients/common/nm-secret-agent-simple.c:310
#: ../clients/common/nm-secret-agent-simple.c:333
#: ../clients/common/nm-secret-agent-simple.c:366
#: ../clients/common/nm-secret-agent-simple.c:903
#: ../clients/common/nm-secret-agent-simple.c:938
#: ../clients/common/nm-secret-agent-simple.c:961
-#: ../clients/common/nm-vpn-helpers.c:110
-#: ../clients/common/nm-vpn-helpers.c:114
-#: ../clients/common/nm-vpn-helpers.c:120
-#: ../clients/common/nm-vpn-helpers.c:125 ../clients/tui/nmt-page-dsl.c:62
+#: ../clients/common/nm-vpn-helpers.c:137
+#: ../clients/common/nm-vpn-helpers.c:143
+#: ../clients/common/nm-vpn-helpers.c:151
+#: ../clients/common/nm-vpn-helpers.c:160 ../clients/tui/nmt-page-dsl.c:62
#: ../clients/tui/nmt-page-wifi.c:266 ../clients/tui/nmt-page-wifi.c:298
#: ../clients/tui/nmt-page-wifi.c:331
msgid "Password"
msgstr "Пароль"
-#: ../clients/cli/devices.c:4427
+#: ../clients/cli/devices.c:4493
#, c-format
msgid "%s"
msgstr "%s"
#. Main header name
-#: ../clients/cli/devices.c:4483
+#: ../clients/cli/devices.c:4547
msgid "Device LLDP neighbors"
msgstr "LLDP-ÑуÑіди приÑтрою"
-#: ../clients/cli/devices.c:4593
+#: ../clients/cli/devices.c:4660
#, c-format
msgid "Error: 'device lldp list': %s"
msgstr "Помилка: «device lldp list»: %s"
-#: ../clients/cli/general.c:34
+#: ../clients/cli/general.c:32
msgid "asleep"
msgstr "приÑпаний"
-#: ../clients/cli/general.c:35
+#: ../clients/cli/general.c:33
msgid "connecting"
msgstr "з'єднуєтьÑÑ"
-#: ../clients/cli/general.c:36
+#: ../clients/cli/general.c:34
msgid "connected (local only)"
msgstr "з'єднуєтьÑÑ (локально)"
-#: ../clients/cli/general.c:37
+#: ../clients/cli/general.c:35
msgid "connected (site only)"
msgstr "з'єднано (на вузлі)"
-#: ../clients/cli/general.c:38 ../clients/common/nm-client-utils.c:260
+#: ../clients/cli/general.c:36 ../clients/common/nm-client-utils.c:260
msgid "connected"
msgstr "з'єднано"
-#: ../clients/cli/general.c:39
+#: ../clients/cli/general.c:37
msgid "disconnecting"
msgstr "роз'єднуєтьÑÑ"
-#: ../clients/cli/general.c:40 ../clients/common/nm-client-utils.c:253
+#: ../clients/cli/general.c:38 ../clients/common/nm-client-utils.c:253
msgid "disconnected"
msgstr "роз'єднано"
-#: ../clients/cli/general.c:96
+#: ../clients/cli/general.c:94
msgid "auth"
msgstr "розпізн"
-#: ../clients/cli/general.c:125
+#: ../clients/cli/general.c:123
msgid "running"
msgstr "виконуєтьÑÑ"
-#: ../clients/cli/general.c:139
+#: ../clients/cli/general.c:137
msgid "starting"
msgstr "запуÑк"
-#: ../clients/cli/general.c:139
+#: ../clients/cli/general.c:137
msgid "started"
msgstr "запущено"
-#: ../clients/cli/general.c:173
+#: ../clients/cli/general.c:171
msgid "enabled"
msgstr "увімкнено"
-#: ../clients/cli/general.c:173
+#: ../clients/cli/general.c:171
msgid "disabled"
msgstr "вимкнено"
-#: ../clients/cli/general.c:291
+#: ../clients/cli/general.c:289
#, c-format
msgid ""
"Usage: nmcli general { COMMAND | help }\n"
@@ -3378,7 +3378,7 @@ msgstr ""
"журналу>]\n"
"\n"
-#: ../clients/cli/general.c:302
+#: ../clients/cli/general.c:300
#, c-format
msgid ""
"Usage: nmcli general status { help }\n"
@@ -3395,7 +3395,7 @@ msgstr ""
"status»\n"
"\n"
-#: ../clients/cli/general.c:311
+#: ../clients/cli/general.c:309
#, c-format
msgid ""
"Usage: nmcli general hostname { ARGUMENTS | help }\n"
@@ -3420,7 +3420,7 @@ msgstr ""
"назвою вузла ÑиÑтеми.\n"
"\n"
-#: ../clients/cli/general.c:323
+#: ../clients/cli/general.c:321
#, c-format
msgid ""
"Usage: nmcli general permissions { help }\n"
@@ -3434,7 +3434,7 @@ msgstr ""
"пройти розпізнаваннÑ.\n"
"\n"
-#: ../clients/cli/general.c:331
+#: ../clients/cli/general.c:329
#, c-format
msgid ""
"Usage: nmcli general reload { ARGUMENTS | help }\n"
@@ -3495,7 +3495,7 @@ msgstr ""
"Якщо прапорців не вказано, буде перезавантажено уÑÑ– підтримувані дані,\n"
"тобто виконано уÑÑ– дії, Ñкі буде виконано, Ñкщо надіÑлано Ñигнал SIGHUP.\n"
-#: ../clients/cli/general.c:363
+#: ../clients/cli/general.c:361
#, c-format
msgid ""
"Usage: nmcli general logging { ARGUMENTS | help }\n"
@@ -3522,7 +3522,7 @@ msgstr ""
"Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾ на Ñторінці підручника (man).\n"
"\n"
-#: ../clients/cli/general.c:376
+#: ../clients/cli/general.c:374
#, c-format
msgid ""
"Usage: nmcli networking { COMMAND | help }\n"
@@ -3547,7 +3547,7 @@ msgstr ""
" connectivity [перевірити]\n"
"\n"
-#: ../clients/cli/general.c:386
+#: ../clients/cli/general.c:384
#, c-format
msgid ""
"Usage: nmcli networking on { help }\n"
@@ -3560,7 +3560,7 @@ msgstr ""
"Увімкнути роботу у мережі\n"
"\n"
-#: ../clients/cli/general.c:394
+#: ../clients/cli/general.c:392
#, c-format
msgid ""
"Usage: nmcli networking off { help }\n"
@@ -3573,7 +3573,7 @@ msgstr ""
"Вимкнути роботу у мережі.\n"
"\n"
-#: ../clients/cli/general.c:402
+#: ../clients/cli/general.c:400
#, c-format
msgid ""
"Usage: nmcli networking connectivity { ARGUMENTS | help }\n"
@@ -3594,7 +3594,7 @@ msgstr ""
"виконати повторну перевірку можливоÑÑ‚Ñ– з'єднаннÑ.\n"
"\n"
-#: ../clients/cli/general.c:414
+#: ../clients/cli/general.c:412
#, c-format
msgid ""
"Usage: nmcli radio { COMMAND | help }\n"
@@ -3611,7 +3611,7 @@ msgstr ""
" all | wifi | wwan [ on | off ]\n"
"\n"
-#: ../clients/cli/general.c:423
+#: ../clients/cli/general.c:421
#, c-format
msgid ""
"Usage: nmcli radio all { ARGUMENTS | help }\n"
@@ -3628,7 +3628,7 @@ msgstr ""
"Отримати Ñтан уÑÑ–Ñ… перемикачів або перемкнути Ñ—Ñ… (увімкнути чи вимкнути).\n"
"\n"
-#: ../clients/cli/general.c:433
+#: ../clients/cli/general.c:431
#, c-format
msgid ""
"Usage: nmcli radio wifi { ARGUMENTS | help }\n"
@@ -3645,7 +3645,7 @@ msgstr ""
"Отримати Ñтан перемикача Wi-Fi або перемкнути його (увімкнути чи вимкнути).\n"
"\n"
-#: ../clients/cli/general.c:443
+#: ../clients/cli/general.c:441
#, c-format
msgid ""
"Usage: nmcli radio wwan { ARGUMENTS | help }\n"
@@ -3663,7 +3663,7 @@ msgstr ""
"(увімкнути чи вимкнути).\n"
"\n"
-#: ../clients/cli/general.c:453
+#: ../clients/cli/general.c:451
#, c-format
msgid ""
"Usage: nmcli monitor\n"
@@ -3679,223 +3679,223 @@ msgstr ""
"зміни\n"
"\n"
-#: ../clients/cli/general.c:483
+#: ../clients/cli/general.c:481
msgid "NetworkManager status"
msgstr "Стан NetworkManager"
-#: ../clients/cli/general.c:487
+#: ../clients/cli/general.c:485
#, c-format
msgid "Error: only these fields are allowed: %s"
msgstr "Помилка: можна викориÑтовувати лише такі полÑ: %s"
#. NetworkManager quit while we were waiting.
-#: ../clients/cli/general.c:544 ../clients/tui/nmtui.c:246
+#: ../clients/cli/general.c:541 ../clients/tui/nmtui.c:246
#, c-format
msgid "NetworkManager is not running."
msgstr "NetworkManager не запущено."
-#: ../clients/cli/general.c:564
+#: ../clients/cli/general.c:561
msgid "NetworkManager permissions"
msgstr "Права доÑтупу NetworkManager"
-#: ../clients/cli/general.c:568
+#: ../clients/cli/general.c:565
#, c-format
msgid "Error: 'general permissions': %s"
msgstr "Помилка: «general permissions»: %s"
-#: ../clients/cli/general.c:645
+#: ../clients/cli/general.c:642
#, c-format
msgid "Error: invalid reload flag '%s'. Allowed flags are: %s"
msgstr ""
"Помилка: некоректний прапорець Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Â«%s». Дозволеними прапорцÑми "
"Ñ” %s"
-#: ../clients/cli/general.c:655
+#: ../clients/cli/general.c:653
#, c-format
msgid "Error: extra argument '%s'"
msgstr "Помилка: зайвий аргумент «%s»"
-#: ../clients/cli/general.c:669
+#: ../clients/cli/general.c:668
#, c-format
msgid "Error: failed to reload: %s"
msgstr "Помилка: не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸: %s"
-#: ../clients/cli/general.c:708
+#: ../clients/cli/general.c:704
msgid "NetworkManager logging"
msgstr "Ð’ÐµÐ´ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ NetworkManager"
-#: ../clients/cli/general.c:712
+#: ../clients/cli/general.c:708
#, c-format
msgid "Error: 'general logging': %s"
msgstr "Помилка: «general logging»: %s"
-#: ../clients/cli/general.c:744
+#: ../clients/cli/general.c:740
#, c-format
msgid "Error: failed to set logging: %s"
msgstr "Помилка: не вдалоÑÑ Ð²Ñтановити параметри Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ: %s"
-#: ../clients/cli/general.c:833
+#: ../clients/cli/general.c:830
#, c-format
msgid "Error: failed to set hostname: %s"
msgstr "Помилка: не вдалоÑÑ Ð²Ñтановити назву вузла: %s"
-#: ../clients/cli/general.c:903
+#: ../clients/cli/general.c:891
#, c-format
msgid "Error: '--fields' value '%s' is not valid here (allowed field: %s)"
msgstr ""
"Помилка: Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«--fields» «%s» не можна викориÑтовувати тут (дозволене "
"поле: %s)"
-#: ../clients/cli/general.c:928
+#: ../clients/cli/general.c:916
#, c-format
msgid "Error: invalid '%s' argument: '%s' (use on/off)."
msgstr "Помилка: некоректний аргумент «%s»: «%s» (мало бути on/off)."
-#: ../clients/cli/general.c:951
+#: ../clients/cli/general.c:939
#, c-format
msgid "Error: failed to set networking: %s"
msgstr "Помилка: не вдалоÑÑ Ð²Ñтановити параметри роботи у мережі: %s"
#. no arguments -> get current state
-#: ../clients/cli/general.c:1008 ../clients/cli/general.c:1020
+#: ../clients/cli/general.c:984 ../clients/cli/general.c:996
msgid "Connectivity"
msgstr "МожливіÑÑ‚ÑŒ з'єднаннÑ"
-#: ../clients/cli/general.c:1023
+#: ../clients/cli/general.c:999
#, c-format
msgid "Error: 'networking' command '%s' is not valid."
msgstr "Помилка: команда «networking» «%s» є некоректною."
-#: ../clients/cli/general.c:1037
+#: ../clients/cli/general.c:1011
msgid "Networking"
msgstr "Робота у мережі"
#. no argument, show all radio switches
-#: ../clients/cli/general.c:1072
+#: ../clients/cli/general.c:1039
msgid "Radio switches"
msgstr "Радіоперемикачі"
-#: ../clients/cli/general.c:1099
+#: ../clients/cli/general.c:1064
#, c-format
msgid "Error: failed to set Wi-Fi radio: %s"
msgstr "Помилка: не вдалоÑÑ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ñ‚Ð¸ радіозв'Ñзок Wi-Fi: %s"
#. no argument, show current Wi-Fi state
-#: ../clients/cli/general.c:1117
+#: ../clients/cli/general.c:1082
msgid "Wi-Fi radio switch"
msgstr "Перемикач Wi-Fi"
#. no argument, show current WWAN (mobile broadband) state
-#: ../clients/cli/general.c:1155
+#: ../clients/cli/general.c:1118
msgid "WWAN radio switch"
msgstr "Перемикач WWAN"
-#: ../clients/cli/general.c:1203
+#: ../clients/cli/general.c:1158
msgid "NetworkManager has started"
msgstr "Запущено NetworkManager"
-#: ../clients/cli/general.c:1203
+#: ../clients/cli/general.c:1158
msgid "NetworkManager has stopped"
msgstr "Зупинено NetworkManager"
-#: ../clients/cli/general.c:1214
+#: ../clients/cli/general.c:1169
#, c-format
msgid "Hostname set to '%s'\n"
msgstr "Ð’Ñтановлено назву вузла «%s»\n"
-#: ../clients/cli/general.c:1229
+#: ../clients/cli/general.c:1184
#, c-format
msgid "'%s' is now the primary connection\n"
msgstr "«%s» Ñ” тепер оÑновним з'єднаннÑм\n"
-#: ../clients/cli/general.c:1231
+#: ../clients/cli/general.c:1186
#, c-format
msgid "There's no primary connection\n"
msgstr "Ðемає оÑновного з'єднаннÑ\n"
-#: ../clients/cli/general.c:1243
+#: ../clients/cli/general.c:1198
#, c-format
msgid "Connectivity is now '%s'\n"
msgstr "ЗначеннÑм можливоÑÑ‚Ñ– з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‚ÐµÐ¿ÐµÑ€ Ñ” «%s»\n"
-#: ../clients/cli/general.c:1257
+#: ../clients/cli/general.c:1212
#, c-format
msgid "Networkmanager is now in the '%s' state\n"
msgstr "Networkmanager тепер перебуває у Ñтані «%s»\n"
-#: ../clients/cli/general.c:1277
+#: ../clients/cli/general.c:1232
msgid "connection available"
msgstr "доÑтупне з'єднаннÑ"
-#: ../clients/cli/general.c:1279
+#: ../clients/cli/general.c:1234
msgid "connections available"
msgstr "доÑтупні з'єднаннÑ"
-#: ../clients/cli/general.c:1297
+#: ../clients/cli/general.c:1252
msgid "autoconnect"
msgstr "автоз'єднаннÑ"
-#: ../clients/cli/general.c:1299
+#: ../clients/cli/general.c:1254
msgid "fw missing"
msgstr "пропущено fw"
-#: ../clients/cli/general.c:1304
+#: ../clients/cli/general.c:1259
msgid "plugin missing"
msgstr "не вказано додатка"
-#: ../clients/cli/general.c:1314 ../clients/cli/general.c:1328
+#: ../clients/cli/general.c:1269 ../clients/cli/general.c:1283
msgid "sw disabled"
msgstr "sw вимкнено"
-#: ../clients/cli/general.c:1319 ../clients/cli/general.c:1333
+#: ../clients/cli/general.c:1274 ../clients/cli/general.c:1288
msgid "hw disabled"
msgstr "hw вимкнено"
-#: ../clients/cli/general.c:1344
+#: ../clients/cli/general.c:1299
msgid "sw"
msgstr "sw"
-#: ../clients/cli/general.c:1346
+#: ../clients/cli/general.c:1301
msgid "hw"
msgstr "hw"
-#: ../clients/cli/general.c:1351
+#: ../clients/cli/general.c:1306
msgid "iface"
msgstr "інтерфейÑ"
-#: ../clients/cli/general.c:1354
+#: ../clients/cli/general.c:1309
msgid "port"
msgstr "порт"
-#: ../clients/cli/general.c:1357
+#: ../clients/cli/general.c:1312
msgid "mtu"
msgstr "mtu"
-#: ../clients/cli/general.c:1374
+#: ../clients/cli/general.c:1329
msgid "master"
msgstr "оÑновний"
-#: ../clients/cli/general.c:1378 ../clients/tui/nm-editor-utils.c:230
+#: ../clients/cli/general.c:1333 ../clients/tui/nm-editor-utils.c:230
#: ../clients/tui/nmt-connect-connection-list.c:394
msgid "VPN"
msgstr "VPN"
-#: ../clients/cli/general.c:1380
+#: ../clients/cli/general.c:1335
msgid "ip4 default"
msgstr "типова ip4"
-#: ../clients/cli/general.c:1382
+#: ../clients/cli/general.c:1337
msgid "ip6 default"
msgstr "типова ip6"
-#: ../clients/cli/general.c:1464
+#: ../clients/cli/general.c:1416
#, c-format
msgid "%s VPN connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ VPN %s"
#. TRANSLATORS: prints header line for activated device in plain `nmcli` overview output as
#. * "<interface-name>: <device-state> to <connection-id>"
-#: ../clients/cli/general.c:1484
+#: ../clients/cli/general.c:1436
#, c-format
msgctxt "nmcli-overview"
msgid "%s: %s to %s"
@@ -3903,13 +3903,13 @@ msgstr "%s: %s до %s"
#. TRANSLATORS: prints header line for not active device in plain `nmcli` overview output as
#. * "<interface-name>: <device-state>"
-#: ../clients/cli/general.c:1491
+#: ../clients/cli/general.c:1443
#, c-format
msgctxt "nmcli-overview"
msgid "%s: %s"
msgstr "%s: %s"
-#: ../clients/cli/general.c:1541
+#: ../clients/cli/general.c:1493
#, c-format
msgid ""
"Use \"nmcli device show\" to get complete information about known devices "
@@ -3926,16 +3926,16 @@ msgstr ""
"Докладний Ð¾Ð¿Ð¸Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼ можна знайти на Ñторінках підручника "
"(man) nmcli(1) та nmcli-examples(7).\n"
-#: ../clients/cli/general.c:1562
+#: ../clients/cli/general.c:1509
#, c-format
msgid "Error: 'monitor' command '%s' is not valid."
msgstr "Помилка: команда «monitor» «%s» є некоректною."
-#: ../clients/cli/general.c:1574
+#: ../clients/cli/general.c:1521
msgid "Networkmanager is not running (waiting for it)\n"
msgstr "Networkmanager не запущено (очікуємо на запуÑк)\n"
-#: ../clients/cli/nmcli.c:233
+#: ../clients/cli/nmcli.c:231
#, c-format
msgid ""
"Usage: nmcli [OPTIONS] OBJECT { COMMAND | help }\n"
@@ -3998,84 +3998,84 @@ msgstr ""
" m[onitor] Ñтежити за змінами у NetworkManager\n"
"\n"
-#: ../clients/cli/nmcli.c:313
+#: ../clients/cli/nmcli.c:306
#, c-format
msgid "Error: missing argument for '%s' option."
msgstr "Помилка: не вказано аргумент параметра «%s»."
-#: ../clients/cli/nmcli.c:621
+#: ../clients/cli/nmcli.c:617
#, c-format
msgid "Unexpected end of file following '%s'\n"
msgstr "Ðеочікуваний кінець файла із наÑтупним «%s»\n"
-#: ../clients/cli/nmcli.c:629
+#: ../clients/cli/nmcli.c:625
#, c-format
msgid "Expected whitespace following '%s'\n"
msgstr "Мав бути пробіл із наÑтупним «%s»\n"
-#: ../clients/cli/nmcli.c:641
+#: ../clients/cli/nmcli.c:637
#, c-format
msgid "Expected a value for '%s'\n"
msgstr "Мало бути Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Â«%s»\n"
-#: ../clients/cli/nmcli.c:655
+#: ../clients/cli/nmcli.c:651
#, c-format
msgid "Expected a line break following '%s'\n"
msgstr "Мав бути Ñимвол розриву Ñ€Ñдка із наÑтупним «%s»\n"
-#: ../clients/cli/nmcli.c:744
+#: ../clients/cli/nmcli.c:757
#, c-format
msgid "Error: Option '--terse' is specified the second time."
msgstr "Помилка: параметр «--terse» вказано двічі."
-#: ../clients/cli/nmcli.c:749
+#: ../clients/cli/nmcli.c:762
#, c-format
msgid "Error: Option '--terse' is mutually exclusive with '--pretty'."
msgstr ""
"Помилка: параметр «--terse» Ñ– «--pretty» не можна викориÑтовувати одночаÑно."
-#: ../clients/cli/nmcli.c:757
+#: ../clients/cli/nmcli.c:770
#, c-format
msgid "Error: Option '--pretty' is specified the second time."
msgstr "Помилка: параметр «--pretty» вказано двічі."
-#: ../clients/cli/nmcli.c:762
+#: ../clients/cli/nmcli.c:775
#, c-format
msgid "Error: Option '--pretty' is mutually exclusive with '--terse'."
msgstr ""
"Помилка: параметр «--pretty» Ñ– «--terse» не можна викориÑтовувати одночаÑно"
-#: ../clients/cli/nmcli.c:777
+#: ../clients/cli/nmcli.c:790
#, c-format
msgid "Error: '%s' is not a valid argument for '%s' option."
msgstr "Помилка: «%s» не є коректним аргументом «%s»."
-#: ../clients/cli/nmcli.c:791 ../clients/cli/nmcli.c:803
+#: ../clients/cli/nmcli.c:804 ../clients/cli/nmcli.c:816
#, c-format
msgid "Error: '%s' is not valid argument for '%s' option."
msgstr "Помилка: «%s» не є коректним аргументом «%s»."
-#: ../clients/cli/nmcli.c:827
+#: ../clients/cli/nmcli.c:840
#, c-format
msgid "Error: '%s' is not a valid timeout."
msgstr "Помилка: «%s» не Ñ” коректним чаÑом очікуваннÑ."
-#: ../clients/cli/nmcli.c:834
+#: ../clients/cli/nmcli.c:847
#, c-format
msgid "nmcli tool, version %s\n"
msgstr "інÑтрумент nmcli, верÑÑ–Ñ %s\n"
-#: ../clients/cli/nmcli.c:842
+#: ../clients/cli/nmcli.c:855
#, c-format
msgid "Error: Option '%s' is unknown, try 'nmcli -help'."
msgstr "Помилка: невідомий параметр «%s», Ñпробуйте «nmcli -help»."
-#: ../clients/cli/nmcli.c:898 ../clients/cli/nmcli.c:905
+#: ../clients/cli/nmcli.c:911 ../clients/cli/nmcli.c:918
#, c-format
msgid "Error: nmcli terminated by signal %s (%d)"
msgstr "Помилка: роботу nmcli перервано Ñигналом %s (%d)"
-#: ../clients/cli/nmcli.c:973
+#: ../clients/cli/nmcli.c:986
msgid "Success"
msgstr "Виконано"
@@ -4208,11 +4208,11 @@ msgstr "Ðе вдалоÑÑ Ñтворити Ð²Ñ–Ð´Ð³Ð°Ð»ÑƒÐ¶ÐµÐ½Ð½Ñ Ð¿ÐµÐ¹Ð´Ð¶
msgid "Failed to duplicate pager pipe: %s\n"
msgstr "Ðе вдалоÑÑ Ð·Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ñ‚Ð¸ конвеєр пейджера: %s\n"
-#: ../clients/cli/utils.h:299 ../clients/common/nm-meta-setting-desc.c:4099
+#: ../clients/cli/utils.h:299 ../clients/common/nm-meta-setting-desc.c:4139
msgid "on"
msgstr "увімкн."
-#: ../clients/cli/utils.h:299 ../clients/common/nm-meta-setting-desc.c:4101
+#: ../clients/cli/utils.h:299 ../clients/common/nm-meta-setting-desc.c:4141
msgid "off"
msgstr "вимкн."
@@ -4717,138 +4717,138 @@ msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°
msgid "team config file '%s' contains non-valid utf-8"
msgstr "файл налаштувань команди «%s» міÑтить некоректний код utf-8"
-#: ../clients/common/nm-meta-setting-desc.c:1018
+#: ../clients/common/nm-meta-setting-desc.c:1036
msgid "auto"
msgstr "авто"
-#: ../clients/common/nm-meta-setting-desc.c:1170
+#: ../clients/common/nm-meta-setting-desc.c:1188
#, c-format
msgid "%s (%s)"
msgstr "%s (%s)"
-#: ../clients/common/nm-meta-setting-desc.c:1318
-#: ../clients/common/nm-meta-setting-desc.c:1322
+#: ../clients/common/nm-meta-setting-desc.c:1352
+#: ../clients/common/nm-meta-setting-desc.c:1356
msgid "'%s' is out of range [%"
msgstr "«%s» поза діапазоном [%"
-#: ../clients/common/nm-meta-setting-desc.c:1327
+#: ../clients/common/nm-meta-setting-desc.c:1361
#, c-format
msgid "'%s' is not a valid number"
msgstr "«%s» не Ñ” коректним чиÑлом"
-#: ../clients/common/nm-meta-setting-desc.c:1384
+#: ../clients/common/nm-meta-setting-desc.c:1418
#, c-format
msgid "'%s' is out of range [0, %u]"
msgstr "«%s» поза діапазоном [0, %u]"
-#: ../clients/common/nm-meta-setting-desc.c:1430
+#: ../clients/common/nm-meta-setting-desc.c:1464
#, c-format
msgid "'%s' is not a valid Ethernet MAC"
msgstr "«%s» не Ñ” коректним значеннÑм MAC-адреÑи Ethernet"
-#: ../clients/common/nm-meta-setting-desc.c:1556
+#: ../clients/common/nm-meta-setting-desc.c:1590
#, c-format
msgid "invalid option '%s', use a combination of [%s]"
msgstr "некоректний параметр «%s», ÑкориÑтайтеÑÑ ÐºÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ”ÑŽ [%s]"
-#: ../clients/common/nm-meta-setting-desc.c:1561
-#: ../shared/nm-keyfile/nm-keyfile.c:926
+#: ../clients/common/nm-meta-setting-desc.c:1595
+#: ../shared/nm-keyfile/nm-keyfile.c:920
#, c-format
msgid "invalid option '%s', use one of [%s]"
msgstr ""
"некоректний параметр «%s», ÑкориÑтайтеÑÑ Ð¾Ð´Ð½Ð¸Ð¼ із таких параметрів [%s]"
-#: ../clients/common/nm-meta-setting-desc.c:1680
+#: ../clients/common/nm-meta-setting-desc.c:1714
#, c-format
msgid "%d (key)"
msgstr "%d (ключ)"
-#: ../clients/common/nm-meta-setting-desc.c:1682
+#: ../clients/common/nm-meta-setting-desc.c:1716
#, c-format
msgid "%d (passphrase)"
msgstr "%d (пароль)"
-#: ../clients/common/nm-meta-setting-desc.c:1685
+#: ../clients/common/nm-meta-setting-desc.c:1719
#, c-format
msgid "%d (unknown)"
msgstr "%d (невідомо)"
-#: ../clients/common/nm-meta-setting-desc.c:1698
+#: ../clients/common/nm-meta-setting-desc.c:1732
msgid "0 (NONE)"
msgstr "0 (ÐЕМÐЄ)"
-#: ../clients/common/nm-meta-setting-desc.c:1704
+#: ../clients/common/nm-meta-setting-desc.c:1738
msgid "REORDER_HEADERS, "
msgstr "ПЕРЕВПОРЯДКОВУВÐÐÐЯ_ЗÐГОЛОВКІВ, "
-#: ../clients/common/nm-meta-setting-desc.c:1706
+#: ../clients/common/nm-meta-setting-desc.c:1740
msgid "GVRP, "
msgstr "GVRP, "
-#: ../clients/common/nm-meta-setting-desc.c:1708
+#: ../clients/common/nm-meta-setting-desc.c:1742
msgid "LOOSE_BINDING, "
msgstr "ШИРОКЕ_ПРИВ'ЯЗУВÐÐÐЯ, "
-#: ../clients/common/nm-meta-setting-desc.c:1710
+#: ../clients/common/nm-meta-setting-desc.c:1744
msgid "MVRP, "
msgstr "MVRP, "
-#: ../clients/common/nm-meta-setting-desc.c:1731
+#: ../clients/common/nm-meta-setting-desc.c:1765
msgid "0 (none)"
msgstr "0 (немає)"
-#: ../clients/common/nm-meta-setting-desc.c:1737
+#: ../clients/common/nm-meta-setting-desc.c:1771
msgid "agent-owned, "
msgstr ", влаÑником Ñ” агент, "
-#: ../clients/common/nm-meta-setting-desc.c:1739
+#: ../clients/common/nm-meta-setting-desc.c:1773
msgid "not saved, "
msgstr "не збережено, "
-#: ../clients/common/nm-meta-setting-desc.c:1741
+#: ../clients/common/nm-meta-setting-desc.c:1775
msgid "not required, "
msgstr "не Ñ” обов'Ñзковим, "
-#: ../clients/common/nm-meta-setting-desc.c:1941
+#: ../clients/common/nm-meta-setting-desc.c:1975
#, c-format
msgid "'%s' is not valid; use <option>=<value>"
msgstr ""
"Ð—Ð°Ð¿Ð¸Ñ Â«%s» Ñ” некоректним; Ñлід викориÑтовувати формат <параметр>=<значеннÑ>"
-#: ../clients/common/nm-meta-setting-desc.c:1951
+#: ../clients/common/nm-meta-setting-desc.c:1985
#, c-format
msgid "cannot set empty \"%s\" option"
msgstr "не можна вÑтановлювати порожнє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s»"
-#: ../clients/common/nm-meta-setting-desc.c:2010
+#: ../clients/common/nm-meta-setting-desc.c:2044
#, c-format
msgid "'%u' flags are not valid; use combination of %s"
msgstr "прапорці «%u» не Ñ” коректними; ÑкориÑтайтеÑÑ ÐºÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ”ÑŽ з %s"
-#: ../clients/common/nm-meta-setting-desc.c:2027
+#: ../clients/common/nm-meta-setting-desc.c:2061
#, c-format
msgid "'%s' is not a valid number (or out of range)"
msgstr ""
"«%s» не Ñ” коректним значеннÑм номер (або лежить поза діапазоном припуÑтимих "
"номерів)"
-#: ../clients/common/nm-meta-setting-desc.c:2048
-#: ../clients/common/nm-meta-setting-desc.c:4015
+#: ../clients/common/nm-meta-setting-desc.c:2082
+#: ../clients/common/nm-meta-setting-desc.c:4055
#: ../libnm-core/nm-setting-ovs-bridge.c:183 ../src/nm-config.c:556
#, c-format
msgid "'%s' is not valid"
msgstr "«%s» не є коректним"
-#: ../clients/common/nm-meta-setting-desc.c:2143
+#: ../clients/common/nm-meta-setting-desc.c:2177
msgid "not a valid hex-string"
msgstr "не Ñ” коректним шіÑтнадцÑтковим Ñ€Ñдком"
-#: ../clients/common/nm-meta-setting-desc.c:2159
+#: ../clients/common/nm-meta-setting-desc.c:2193
#, c-format
msgid "'%s' is not a valid hex character"
msgstr "«%s» не Ñ” коректним шіÑтнадцÑтковим Ñимволом"
-#: ../clients/common/nm-meta-setting-desc.c:2238
+#: ../clients/common/nm-meta-setting-desc.c:2272
msgid ""
"too many arguments. Please only specify a private key file and optionally a "
"password"
@@ -4856,12 +4856,12 @@ msgstr ""
"забагато аргументів. Будь лаÑка, вкажіть файл закритого ключа Ñ–, "
"необов'Ñзково, пароль"
-#: ../clients/common/nm-meta-setting-desc.c:2353
+#: ../clients/common/nm-meta-setting-desc.c:2387
#, c-format
msgid "failed to set bond option \"%s\""
msgstr "не вдалоÑÑ Ð²Ñтановити параметр bond «%s»"
-#: ../clients/common/nm-meta-setting-desc.c:2370
+#: ../clients/common/nm-meta-setting-desc.c:2404
#, c-format
msgid ""
"Enter a list of bonding options formatted as:\n"
@@ -4899,125 +4899,125 @@ msgstr ""
#. * hacky: we can not see if the type is already set, because
#. * nmc_setting_set_property() is called only after the property
#. * we're setting (type) has been removed.
-#: ../clients/common/nm-meta-setting-desc.c:2435
+#: ../clients/common/nm-meta-setting-desc.c:2469
#, c-format
msgid "Can not change the connection type"
msgstr "Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ тип з'єднаннÑ"
-#: ../clients/common/nm-meta-setting-desc.c:2520
+#: ../clients/common/nm-meta-setting-desc.c:2554
#, c-format
msgid "invalid permission \"%s\""
msgstr "некоректні права доÑтупу «%s»"
-#: ../clients/common/nm-meta-setting-desc.c:2620
+#: ../clients/common/nm-meta-setting-desc.c:2654
#, c-format
msgid "the value '%s' is not a valid UUID"
msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s» не Ñ” коректним UUID"
-#: ../clients/common/nm-meta-setting-desc.c:2691
+#: ../clients/common/nm-meta-setting-desc.c:2725
msgid "0 (disabled)"
msgstr "0 (вимкнено)"
-#: ../clients/common/nm-meta-setting-desc.c:2697
+#: ../clients/common/nm-meta-setting-desc.c:2731
msgid "enabled, "
msgstr "увімкнено, "
-#: ../clients/common/nm-meta-setting-desc.c:2699
+#: ../clients/common/nm-meta-setting-desc.c:2733
msgid "advertise, "
msgstr "оголошеннÑ, "
-#: ../clients/common/nm-meta-setting-desc.c:2701
+#: ../clients/common/nm-meta-setting-desc.c:2735
msgid "willing, "
msgstr "наданнÑ, "
-#: ../clients/common/nm-meta-setting-desc.c:2790
+#: ../clients/common/nm-meta-setting-desc.c:2824
#, c-format
msgid "'%s' is not a valid DCB flag"
msgstr "«%s» не є коректним прапорцем DCB"
-#: ../clients/common/nm-meta-setting-desc.c:2817
+#: ../clients/common/nm-meta-setting-desc.c:2851
msgid "must contain 8 comma-separated numbers"
msgstr "має міÑтити 8 чиÑел, відокремлених комами"
-#: ../clients/common/nm-meta-setting-desc.c:2831
+#: ../clients/common/nm-meta-setting-desc.c:2865
#, c-format
msgid "'%s' not a number between 0 and %u (inclusive) or %u"
msgstr "«%s» не Ñ” чиÑлом у діапазоні від 0 до %u (включно) або %u"
-#: ../clients/common/nm-meta-setting-desc.c:2834
+#: ../clients/common/nm-meta-setting-desc.c:2868
#, c-format
msgid "'%s' not a number between 0 and %u (inclusive)"
msgstr "«%s» не Ñ” чиÑлом у діапазоні від 0 до %u (включно)"
-#: ../clients/common/nm-meta-setting-desc.c:2855
+#: ../clients/common/nm-meta-setting-desc.c:2889
#, c-format
msgid "changes will have no effect until '%s' includes 1 (enabled)"
msgstr "зміни не буде задіÑно, доки «%s» не включатиме 1 (увімкнено)"
-#: ../clients/common/nm-meta-setting-desc.c:2885
+#: ../clients/common/nm-meta-setting-desc.c:2919
#, c-format
msgid "bandwidth percentages must total 100%%"
msgstr "Ñума чаÑтин каналу у відÑотках має Ñкладати 100%%"
-#: ../clients/common/nm-meta-setting-desc.c:2956
-#: ../clients/common/nm-meta-setting-desc.c:2962
+#: ../clients/common/nm-meta-setting-desc.c:2990
+#: ../clients/common/nm-meta-setting-desc.c:2996
msgid "SIM operator ID must be a 5 or 6 number MCCMNC code"
msgstr ""
"Ідентифікатор оператора SIM має бути п'Ñти- або шеÑтицифровим кодом MCCMNC"
-#: ../clients/common/nm-meta-setting-desc.c:2986
+#: ../clients/common/nm-meta-setting-desc.c:3020
#, c-format
msgid "'%s' is not a valid IBoIP P_Key"
msgstr "«%s» не є коректним закритим ключем IBoIP"
-#: ../clients/common/nm-meta-setting-desc.c:3009
+#: ../clients/common/nm-meta-setting-desc.c:3043
msgid "default"
msgstr "типовий"
-#: ../clients/common/nm-meta-setting-desc.c:3173
+#: ../clients/common/nm-meta-setting-desc.c:3207
#, c-format
msgid "invalid IPv%c address '%s'"
msgstr "некоректна адреÑа IPv%c, «%s»"
-#: ../clients/common/nm-meta-setting-desc.c:3300
+#: ../clients/common/nm-meta-setting-desc.c:3334
#, c-format
msgid "invalid gateway address '%s'"
msgstr "некоректна адреÑа шлюзу, «%s»"
-#: ../clients/common/nm-meta-setting-desc.c:3450
+#: ../clients/common/nm-meta-setting-desc.c:3490
#, c-format
msgid "'%s' is not a valid channel; use <1-13>"
msgstr "«%s» не є коректним каналом; канал має належати діапазону <1-13>"
-#: ../clients/common/nm-meta-setting-desc.c:3530
+#: ../clients/common/nm-meta-setting-desc.c:3570
msgid "The valid syntax is: vf [attribute=value]... [,vf [attribute=value]...]"
msgstr ""
"Коректна ÑинтакÑична конÑтрукціÑ: vf [атрибут=значеннÑ]... [,vf "
"[атрибут=значеннÑ]...]"
-#: ../clients/common/nm-meta-setting-desc.c:3554
-#: ../clients/common/nm-meta-setting-desc.c:3634
+#: ../clients/common/nm-meta-setting-desc.c:3594
+#: ../clients/common/nm-meta-setting-desc.c:3674
msgid ""
"The valid syntax is: '[root | parent <handle>] [handle <handle>] <kind>'"
msgstr ""
"Коректний ÑинтакÑиÑ: '[root | parent <деÑкриптор>] [handle <деÑкриптор>] "
"<тип>'"
-#: ../clients/common/nm-meta-setting-desc.c:3579
+#: ../clients/common/nm-meta-setting-desc.c:3619
msgid "The valid syntax is: '<vid>[-<vid>] [pvid] [untagged]'"
msgstr "Коректний ÑинтакÑиÑ: '<vid>[-<vid>] [pvid] [untagged]'"
-#: ../clients/common/nm-meta-setting-desc.c:3775
+#: ../clients/common/nm-meta-setting-desc.c:3815
#, c-format
msgid "invalid priority map '%s'"
msgstr "некоректне Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ñ–Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ð½Ð¾ÑÑ‚Ñ–, «%s»"
-#: ../clients/common/nm-meta-setting-desc.c:3867
+#: ../clients/common/nm-meta-setting-desc.c:3907
#, c-format
msgid "'%s' is not valid; 2 or 3 strings should be provided"
msgstr "«%s» не Ñ” коректним значеннÑм; Ñлід вказати 2 або 3 Ñ€Ñдки"
-#: ../clients/common/nm-meta-setting-desc.c:3906
+#: ../clients/common/nm-meta-setting-desc.c:3946
#, c-format
msgid ""
"Enter a list of S/390 options formatted as:\n"
@@ -5028,17 +5028,17 @@ msgstr ""
" параметр = <значеннÑ>, параметр = <значеннÑ>,...\n"
"Коректні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²: %s\n"
-#: ../clients/common/nm-meta-setting-desc.c:3941
+#: ../clients/common/nm-meta-setting-desc.c:3981
#, c-format
msgid "'%s' is not a valid channel"
msgstr "«%s» не є коректним каналом"
-#: ../clients/common/nm-meta-setting-desc.c:3947
+#: ../clients/common/nm-meta-setting-desc.c:3987
#, c-format
msgid "'%ld' is not a valid channel"
msgstr "«%ld» не є коректним каналом"
-#: ../clients/common/nm-meta-setting-desc.c:3964
+#: ../clients/common/nm-meta-setting-desc.c:4004
#: ../libnm-core/nm-setting-sriov.c:438 ../libnm-core/nm-setting-wired.c:758
#: ../libnm-core/nm-setting-wired.c:771 ../libnm-core/nm-setting-wired.c:824
#: ../libnm-core/nm-setting-wired.c:867 ../libnm-core/nm-setting-wireless.c:881
@@ -5047,7 +5047,7 @@ msgstr "«%ld» не є коректним каналом"
msgid "'%s' is not a valid MAC address"
msgstr "%s не Ñ” припуÑтимою MAC-адреÑою"
-#: ../clients/common/nm-meta-setting-desc.c:4024
+#: ../clients/common/nm-meta-setting-desc.c:4064
#, c-format
msgid ""
"'%s' not compatible with %s '%s', please change the key or set the right %s "
@@ -5056,64 +5056,64 @@ msgstr ""
"«%s» Ñ” неÑуміÑним з %s «%s», будь лаÑка, Ñпочатку змініть ключ або "
"вÑтановіть правильне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s."
-#: ../clients/common/nm-meta-setting-desc.c:4034
+#: ../clients/common/nm-meta-setting-desc.c:4074
#, c-format
msgid "WEP key is guessed to be of '%s'"
msgstr "ПрипуÑкаємо, що ключем WEP Ñ” «%s»"
-#: ../clients/common/nm-meta-setting-desc.c:4039
+#: ../clients/common/nm-meta-setting-desc.c:4079
#, c-format
msgid "WEP key index set to '%d'"
msgstr "Ñ–Ð½Ð´ÐµÐºÑ ÐºÐ»ÑŽÑ‡Ð° WEP вÑтановлено у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%d»"
-#: ../clients/common/nm-meta-setting-desc.c:4078
+#: ../clients/common/nm-meta-setting-desc.c:4118
#, c-format
msgid "'%s' is not compatible with '%s' type, please change or delete the key."
msgstr "«%s» неÑуміÑний з типом «%s». Будь лаÑка, змініть або вилучіть ключ."
-#: ../clients/common/nm-meta-setting-desc.c:4135
+#: ../clients/common/nm-meta-setting-desc.c:4174
#, c-format
msgid "'%s' is not valid; use 'on', 'off', or 'ignore'"
msgstr ""
"«%s» не Ñ” коректним значеннÑм; можна викориÑтовувати лише Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«on», "
"«off» або «ignore»"
-#: ../clients/common/nm-meta-setting-desc.c:4195
+#: ../clients/common/nm-meta-setting-desc.c:4234
msgid "Bonding primary interface [none]"
msgstr "ОÑновний Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ñ€Ð¸Ð²'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ [типово немає]"
#. this is a virtual property, only needed during "ask" mode.
-#: ../clients/common/nm-meta-setting-desc.c:4202
+#: ../clients/common/nm-meta-setting-desc.c:4241
msgid "Bonding monitoring mode"
msgstr "Режим ÑпоÑÑ‚ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð° зв'Ñзком"
-#: ../clients/common/nm-meta-setting-desc.c:4211
+#: ../clients/common/nm-meta-setting-desc.c:4250
msgid "Bonding miimon [100]"
msgstr "ЧаÑтота ÑпоÑÑ‚ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ MII прив'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ [типово 100]"
-#: ../clients/common/nm-meta-setting-desc.c:4219
+#: ../clients/common/nm-meta-setting-desc.c:4258
msgid "Bonding downdelay [0]"
msgstr "downdelay прив'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ [типово 0]"
-#: ../clients/common/nm-meta-setting-desc.c:4227
+#: ../clients/common/nm-meta-setting-desc.c:4266
msgid "Bonding updelay [0]"
msgstr "updelay прив'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ [типово 0]"
-#: ../clients/common/nm-meta-setting-desc.c:4235
+#: ../clients/common/nm-meta-setting-desc.c:4274
msgid "Bonding arp-interval [0]"
msgstr "arp-interval прив'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ [типово 0]"
-#: ../clients/common/nm-meta-setting-desc.c:4243
+#: ../clients/common/nm-meta-setting-desc.c:4282
msgid "Bonding arp-ip-target [none]"
msgstr "arp-ip-target прив'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:4251
+#: ../clients/common/nm-meta-setting-desc.c:4290
msgid "LACP rate ('slow' or 'fast') [slow]"
msgstr "ШвидкіÑÑ‚ÑŒ LACP (slow або fast) [slow]"
#. macro that returns @func as const (guint32(*)(NMSetting*)) type, but checks
#. * that the actual type is (guint32(*)(type *)).
-#: ../clients/common/nm-meta-setting-desc.c:4418
+#: ../clients/common/nm-meta-setting-desc.c:4457
msgid ""
"nmcli can accepts both direct JSON configuration data and a file name "
"containing the configuration. In the latter case the file is read and the "
@@ -5132,7 +5132,7 @@ msgstr ""
"\"roundrobin\"}, \"ports\": {\"eth1\": {}, \"eth2\": {}} }\n"
" set team.config /etc/my-team.conf\n"
-#: ../clients/common/nm-meta-setting-desc.c:4426
+#: ../clients/common/nm-meta-setting-desc.c:4465
msgid ""
"Enter a list of link watchers formatted as dictionaries where the keys are "
"teamd properties. Dictionary pairs are in the form: key=value and pairs are "
@@ -5181,11 +5181,11 @@ msgstr ""
" name=arp_ping source-host=172.16.1.1 target-host=172.16.1.254, "
"name=ethtool delay-up=3\n"
-#: ../clients/common/nm-meta-setting-desc.c:4475
+#: ../clients/common/nm-meta-setting-desc.c:4514
msgid "IEEE 802.15.4 (WPAN) parent device or connection UUID"
msgstr "БатьківÑький приÑтрій або UUID з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ IEEE 802.15.4 (WPAN)"
-#: ../clients/common/nm-meta-setting-desc.c:4511
+#: ../clients/common/nm-meta-setting-desc.c:4550
msgid ""
"Enter file path to CA certificate (optionally prefixed with file://).\n"
" [file://]<file path>\n"
@@ -5198,7 +5198,7 @@ msgstr ""
"форматі проÑтого маÑиву даних.\n"
"Приклад: /home/cimrman/cacert.crt\n"
-#: ../clients/common/nm-meta-setting-desc.c:4553
+#: ../clients/common/nm-meta-setting-desc.c:4592
msgid ""
"Enter file path to client certificate (optionally prefixed with file://).\n"
" [file://]<file path>\n"
@@ -5212,7 +5212,7 @@ msgstr ""
"форматі проÑтого маÑиву даних.\n"
"Приклад: /home/cimrman/jara.crt\n"
-#: ../clients/common/nm-meta-setting-desc.c:4610
+#: ../clients/common/nm-meta-setting-desc.c:4649
msgid ""
"Enter file path to CA certificate for inner authentication (optionally "
"prefixed\n"
@@ -5228,7 +5228,7 @@ msgstr ""
"форматі проÑтого маÑиву даних.\n"
"Приклад: /home/cimrman/ca-zweite-phase.crt\n"
-#: ../clients/common/nm-meta-setting-desc.c:4653
+#: ../clients/common/nm-meta-setting-desc.c:4692
msgid ""
"Enter file path to client certificate for inner authentication (optionally "
"prefixed\n"
@@ -5244,7 +5244,7 @@ msgstr ""
"форматі проÑтого маÑиву даних.\n"
"Приклад: /home/cimrman/jara-zweite-phase.crt\n"
-#: ../clients/common/nm-meta-setting-desc.c:4680
+#: ../clients/common/nm-meta-setting-desc.c:4719
msgid ""
"Enter bytes as a list of hexadecimal values.\n"
"Two formats are accepted:\n"
@@ -5266,8 +5266,8 @@ msgstr ""
"Приклади: ab0455a6ea3a74C2\n"
" ab 4 55 0xa6 ea 3a 74 C2\n"
-#: ../clients/common/nm-meta-setting-desc.c:4697
-#: ../clients/common/nm-meta-setting-desc.c:4715
+#: ../clients/common/nm-meta-setting-desc.c:4736
+#: ../clients/common/nm-meta-setting-desc.c:4754
msgid ""
"Enter path to a private key and the key password (if not set yet):\n"
" [file://]<file path> [<password>]\n"
@@ -5281,84 +5281,84 @@ msgstr ""
"форматі проÑтого маÑиву даних.\n"
"Приклад: /home/cimrman/jara-priv-key Dardanely\n"
-#: ../clients/common/nm-meta-setting-desc.c:4754
+#: ../clients/common/nm-meta-setting-desc.c:4793
#: ../clients/common/nm-secret-agent-simple.c:268
#: ../clients/common/nm-secret-agent-simple.c:356
#: ../clients/tui/nmt-page-dsl.c:53 ../clients/tui/nmt-page-wifi.c:322
msgid "Username"
msgstr "КориÑтувач"
-#: ../clients/common/nm-meta-setting-desc.c:4760
-#: ../clients/common/nm-meta-setting-desc.c:5002
-#: ../clients/common/nm-meta-setting-desc.c:5398
-#: ../clients/common/nm-meta-setting-desc.c:6338
+#: ../clients/common/nm-meta-setting-desc.c:4799
+#: ../clients/common/nm-meta-setting-desc.c:5083
+#: ../clients/common/nm-meta-setting-desc.c:5484
+#: ../clients/common/nm-meta-setting-desc.c:6424
msgid "Password [none]"
msgstr "Пароль [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:4806
+#: ../clients/common/nm-meta-setting-desc.c:4845
msgid "Bluetooth device address"
msgstr "ÐдреÑа приÑтрою Bluetooth"
-#: ../clients/common/nm-meta-setting-desc.c:4854
-#: ../clients/common/nm-meta-setting-desc.c:5451
-#: ../clients/common/nm-meta-setting-desc.c:7046
-#: ../clients/common/nm-meta-setting-desc.c:7084
-#: ../clients/common/nm-meta-setting-desc.c:7266
-#: ../clients/common/nm-meta-setting-desc.c:7496
+#: ../clients/common/nm-meta-setting-desc.c:4893
+#: ../clients/common/nm-meta-setting-desc.c:5537
+#: ../clients/common/nm-meta-setting-desc.c:7132
+#: ../clients/common/nm-meta-setting-desc.c:7170
+#: ../clients/common/nm-meta-setting-desc.c:7352
+#: ../clients/common/nm-meta-setting-desc.c:7582
msgid "MAC [none]"
msgstr "MAC [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:4860
+#: ../clients/common/nm-meta-setting-desc.c:4899
msgid "Enable STP [no]"
msgstr "Увімкнути STP [типово ні]"
-#: ../clients/common/nm-meta-setting-desc.c:4866
+#: ../clients/common/nm-meta-setting-desc.c:4905
msgid "STP priority [32768]"
msgstr "Пріоритет STP [типово 32768]"
-#: ../clients/common/nm-meta-setting-desc.c:4872
+#: ../clients/common/nm-meta-setting-desc.c:4911
msgid "Forward delay [15]"
msgstr "Затримка переÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ [типово 15]"
-#: ../clients/common/nm-meta-setting-desc.c:4878
+#: ../clients/common/nm-meta-setting-desc.c:4917
msgid "Hello time [2]"
msgstr "Ð§Ð°Ñ Ð½Ð° Ð²Ñ–Ñ‚Ð°Ð½Ð½Ñ [типово 2]"
-#: ../clients/common/nm-meta-setting-desc.c:4884
+#: ../clients/common/nm-meta-setting-desc.c:4923
msgid "Max age [20]"
msgstr "МакÑ. вік [типово 20]"
-#: ../clients/common/nm-meta-setting-desc.c:4890
+#: ../clients/common/nm-meta-setting-desc.c:4929
msgid "MAC address ageing time [300]"
msgstr "Ð§Ð°Ñ Ð·Ð°ÑÑ‚Ð°Ñ€Ñ–Ð²Ð°Ð½Ð½Ñ MAC-адреÑи [типово 300]"
-#: ../clients/common/nm-meta-setting-desc.c:4899
+#: ../clients/common/nm-meta-setting-desc.c:4939
msgid "Group forward mask [0]"
msgstr "МаÑка групового переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ [0]"
-#: ../clients/common/nm-meta-setting-desc.c:4911
+#: ../clients/common/nm-meta-setting-desc.c:4981
msgid "Enable IGMP snooping [no]"
msgstr "Увімкнути підглÑÐ´Ð°Ð½Ð½Ñ IGMP [типово ні]"
-#: ../clients/common/nm-meta-setting-desc.c:4958
+#: ../clients/common/nm-meta-setting-desc.c:5039
msgid "Bridge port priority [32]"
msgstr "Пріоритетний порт міÑтка [типово 32]"
-#: ../clients/common/nm-meta-setting-desc.c:4964
+#: ../clients/common/nm-meta-setting-desc.c:5045
msgid "Bridge port STP path cost [100]"
msgstr "ВартіÑÑ‚ÑŒ маршруту STP порту міÑтка [типово 100]"
-#: ../clients/common/nm-meta-setting-desc.c:4970
+#: ../clients/common/nm-meta-setting-desc.c:5051
msgid "Hairpin [no]"
msgstr "Початкова зона [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:4996
-#: ../clients/common/nm-meta-setting-desc.c:5392
-#: ../clients/common/nm-meta-setting-desc.c:6892
+#: ../clients/common/nm-meta-setting-desc.c:5077
+#: ../clients/common/nm-meta-setting-desc.c:5478
+#: ../clients/common/nm-meta-setting-desc.c:6978
msgid "Username [none]"
msgstr "КориÑтувач [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:5098
+#: ../clients/common/nm-meta-setting-desc.c:5179
msgid ""
"Enter a list of user permissions. This is a list of user names formatted "
"as:\n"
@@ -5373,7 +5373,7 @@ msgstr ""
"\n"
"Приклад: alice bob charlie\n"
-#: ../clients/common/nm-meta-setting-desc.c:5151
+#: ../clients/common/nm-meta-setting-desc.c:5232
msgid ""
"Enter secondary connections that should be activated when this connection "
"is\n"
@@ -5394,7 +5394,7 @@ msgstr ""
"\n"
"Приклад: private-openvpn, fe6ba5d8-c2fc-4aae-b2e3-97efddd8d9a7\n"
-#: ../clients/common/nm-meta-setting-desc.c:5174
+#: ../clients/common/nm-meta-setting-desc.c:5255
msgid ""
"Enter a value which indicates whether the connection is subject to a data\n"
"quota, usage costs or other limitations. Accepted options are:\n"
@@ -5410,25 +5410,25 @@ msgstr ""
"«unknown» — дозволити NetworkManager вибирати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° допомогою "
"евриÑтики\n"
-#: ../clients/common/nm-meta-setting-desc.c:5408
+#: ../clients/common/nm-meta-setting-desc.c:5494
msgid "APN"
msgstr "APN"
-#: ../clients/common/nm-meta-setting-desc.c:5460
-#: ../clients/common/nm-meta-setting-desc.c:7115
-#: ../clients/common/nm-meta-setting-desc.c:7306
+#: ../clients/common/nm-meta-setting-desc.c:5546
+#: ../clients/common/nm-meta-setting-desc.c:7201
+#: ../clients/common/nm-meta-setting-desc.c:7392
msgid "MTU [auto]"
msgstr "MTU [типово авто]"
-#: ../clients/common/nm-meta-setting-desc.c:5479
+#: ../clients/common/nm-meta-setting-desc.c:5565
msgid "P_KEY [none]"
msgstr "P_KEY [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:5488
+#: ../clients/common/nm-meta-setting-desc.c:5574
msgid "Parent interface [none]"
msgstr "БатьківÑький Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:5515
+#: ../clients/common/nm-meta-setting-desc.c:5601
msgid ""
"Enter a list of IPv4 addresses of DNS servers.\n"
"\n"
@@ -5438,11 +5438,11 @@ msgstr ""
"\n"
"Приклад: 8.8.8.8, 8.8.4.4\n"
-#: ../clients/common/nm-meta-setting-desc.c:5563
+#: ../clients/common/nm-meta-setting-desc.c:5649
msgid "IPv4 address (IP[/plen]) [none]"
msgstr "ÐдреÑа IPv4 (IP[/plen]) [немає]"
-#: ../clients/common/nm-meta-setting-desc.c:5565
+#: ../clients/common/nm-meta-setting-desc.c:5651
msgid ""
"Enter a list of IPv4 addresses formatted as:\n"
" ip[/prefix], ip[/prefix],...\n"
@@ -5456,11 +5456,11 @@ msgstr ""
"\n"
"Приклад: 192.168.1.5/24, 10.0.0.11/24\n"
-#: ../clients/common/nm-meta-setting-desc.c:5584
+#: ../clients/common/nm-meta-setting-desc.c:5670
msgid "IPv4 gateway [none]"
msgstr "Шлюз IPv4 [немає]"
-#: ../clients/common/nm-meta-setting-desc.c:5592
+#: ../clients/common/nm-meta-setting-desc.c:5678
msgid ""
"Enter a list of IPv4 routes formatted as:\n"
" ip[/prefix] [next-hop] [metric],...\n"
@@ -5483,7 +5483,7 @@ msgstr ""
"Приклади: 192.168.2.0/24 192.168.2.1 3, 10.1.0.0/16 10.0.0.254\n"
" 10.1.2.0/24\n"
-#: ../clients/common/nm-meta-setting-desc.c:5632
+#: ../clients/common/nm-meta-setting-desc.c:5718
msgid ""
"Enter a list of IPv4 routing rules formatted as:\n"
" priority [prio] [from [src]] [to [dst]], ,...\n"
@@ -5493,7 +5493,7 @@ msgstr ""
" priority [пріоритетніÑÑ‚ÑŒ] [from [джерело]] [to [призначеннÑ]], ,...\n"
"\n"
-#: ../clients/common/nm-meta-setting-desc.c:5723
+#: ../clients/common/nm-meta-setting-desc.c:5809
msgid ""
"Enter a list of IPv6 addresses of DNS servers. If the IPv6 configuration "
"method is 'auto' these DNS servers are appended to those (if any) returned "
@@ -5514,11 +5514,11 @@ msgstr ""
"\n"
"Приклад: 2607:f0d0:1002:51::4, 2607:f0d0:1002:51::1\n"
-#: ../clients/common/nm-meta-setting-desc.c:5777
+#: ../clients/common/nm-meta-setting-desc.c:5863
msgid "IPv6 address (IP[/plen]) [none]"
msgstr "ÐдреÑа IPv6 (IP[/plen]) [немає]"
-#: ../clients/common/nm-meta-setting-desc.c:5779
+#: ../clients/common/nm-meta-setting-desc.c:5865
msgid ""
"Enter a list of IPv6 addresses formatted as:\n"
" ip[/prefix], ip[/prefix],...\n"
@@ -5532,11 +5532,11 @@ msgstr ""
"\n"
"Приклад: 2607:f0d0:1002:51::4/64, 1050:0:0:0:5:600:300c:326b\n"
-#: ../clients/common/nm-meta-setting-desc.c:5798
+#: ../clients/common/nm-meta-setting-desc.c:5884
msgid "IPv6 gateway [none]"
msgstr "Шлюз IPv6 [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:5806
+#: ../clients/common/nm-meta-setting-desc.c:5892
msgid ""
"Enter a list of IPv6 routes formatted as:\n"
" ip[/prefix] [next-hop] [metric],...\n"
@@ -5561,7 +5561,7 @@ msgstr ""
"db8:beef::3 2\n"
" abbe::/64 55\n"
-#: ../clients/common/nm-meta-setting-desc.c:5846
+#: ../clients/common/nm-meta-setting-desc.c:5932
msgid ""
"Enter a list of IPv6 routing rules formatted as:\n"
" priority [prio] [from [src]] [to [dst]], ,...\n"
@@ -5571,170 +5571,170 @@ msgstr ""
" priority [пріоритетніÑÑ‚ÑŒ] [from [джерело]] [to [призначеннÑ]], ,...\n"
"\n"
-#: ../clients/common/nm-meta-setting-desc.c:5953
-#: ../clients/common/nm-meta-setting-desc.c:6945
+#: ../clients/common/nm-meta-setting-desc.c:6039
+#: ../clients/common/nm-meta-setting-desc.c:7031
msgid "Parent device [none]"
msgstr "БатьківÑький приÑтрій [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:5959
+#: ../clients/common/nm-meta-setting-desc.c:6045
msgid "Local endpoint [none]"
msgstr "Локальна кінцева точка [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:5966
-#: ../clients/common/nm-meta-setting-desc.c:6965
+#: ../clients/common/nm-meta-setting-desc.c:6052
+#: ../clients/common/nm-meta-setting-desc.c:7051
msgid "Remote"
msgstr "Віддалений"
-#: ../clients/common/nm-meta-setting-desc.c:6011
+#: ../clients/common/nm-meta-setting-desc.c:6097
msgid "MACsec parent device or connection UUID"
msgstr "БатьківÑький приÑтрій MACsec або UUID з'єднаннÑ"
-#: ../clients/common/nm-meta-setting-desc.c:6032
+#: ../clients/common/nm-meta-setting-desc.c:6118
msgid "Enable encryption [yes]"
msgstr "Увімкнути ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ [типово «так»]"
-#: ../clients/common/nm-meta-setting-desc.c:6038
+#: ../clients/common/nm-meta-setting-desc.c:6124
#: ../clients/common/nm-secret-agent-simple.c:917
msgid "MKA CAK"
msgstr "MKA CAK"
-#: ../clients/common/nm-meta-setting-desc.c:6048
+#: ../clients/common/nm-meta-setting-desc.c:6134
msgid "MKA_CKN"
msgstr "MKA_CKN"
-#: ../clients/common/nm-meta-setting-desc.c:6054
+#: ../clients/common/nm-meta-setting-desc.c:6140
msgid "SCI port [1]"
msgstr "Порт SCI [1]"
-#: ../clients/common/nm-meta-setting-desc.c:6080
+#: ../clients/common/nm-meta-setting-desc.c:6166
msgid "MACVLAN parent device or connection UUID"
msgstr "БатьківÑький приÑтрій MACVLAN або UUID з'єднаннÑ"
-#: ../clients/common/nm-meta-setting-desc.c:6101
+#: ../clients/common/nm-meta-setting-desc.c:6187
msgid "Tap [no]"
msgstr "Tap [типово ні]"
-#: ../clients/common/nm-meta-setting-desc.c:6136
-#: ../clients/common/nm-meta-setting-desc.c:7220
+#: ../clients/common/nm-meta-setting-desc.c:6222
+#: ../clients/common/nm-meta-setting-desc.c:7306
#: ../clients/tui/nmt-page-wifi.c:213
msgid "SSID"
msgstr "SSID"
-#: ../clients/common/nm-meta-setting-desc.c:6145
+#: ../clients/common/nm-meta-setting-desc.c:6231
msgid "OLPC Mesh channel [1]"
msgstr "Канал OLPC Mesh [типово 1]"
-#: ../clients/common/nm-meta-setting-desc.c:6154
+#: ../clients/common/nm-meta-setting-desc.c:6240
msgid "DHCP anycast MAC address [none]"
msgstr "MAC-адреÑа довільного надÑÐ¸Ð»Ð°Ð½Ð½Ñ (anycast) DHCP [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:6319
+#: ../clients/common/nm-meta-setting-desc.c:6405
msgid "PPPoE parent device"
msgstr "БатьківÑький приÑтрій PPPoE"
-#: ../clients/common/nm-meta-setting-desc.c:6325
+#: ../clients/common/nm-meta-setting-desc.c:6411
msgid "Service [none]"
msgstr "Служба [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:6332
+#: ../clients/common/nm-meta-setting-desc.c:6418
msgid "PPPoE username"
msgstr "КориÑтувач PPPoE"
-#: ../clients/common/nm-meta-setting-desc.c:6368
+#: ../clients/common/nm-meta-setting-desc.c:6454
msgid "Browser only [no]"
msgstr "Лише навігатор [типово «ні»]"
-#: ../clients/common/nm-meta-setting-desc.c:6374
+#: ../clients/common/nm-meta-setting-desc.c:6460
msgid "PAC URL"
msgstr "ÐдреÑа PAC"
-#: ../clients/common/nm-meta-setting-desc.c:6380
+#: ../clients/common/nm-meta-setting-desc.c:6466
msgid "PAC script"
msgstr "Скрипт PAC"
-#: ../clients/common/nm-meta-setting-desc.c:6504
-#: ../clients/common/nm-meta-setting-desc.c:6692
+#: ../clients/common/nm-meta-setting-desc.c:6590
+#: ../clients/common/nm-meta-setting-desc.c:6778
msgid "Team JSON configuration [none]"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ JSON команди [немає]"
-#: ../clients/common/nm-meta-setting-desc.c:6795
+#: ../clients/common/nm-meta-setting-desc.c:6881
msgid "User ID [none]"
msgstr "Ідентифікатор кориÑтувача [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:6801
+#: ../clients/common/nm-meta-setting-desc.c:6887
msgid "Group ID [none]"
msgstr "Ідентифікатор групи [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:6807
+#: ../clients/common/nm-meta-setting-desc.c:6893
msgid "Enable PI [no]"
msgstr "Увімкнути PI [типово ні]"
-#: ../clients/common/nm-meta-setting-desc.c:6813
+#: ../clients/common/nm-meta-setting-desc.c:6899
msgid "Enable VNET header [no]"
msgstr "Увімкнути заголовок VNET [типово ні]"
-#: ../clients/common/nm-meta-setting-desc.c:6819
+#: ../clients/common/nm-meta-setting-desc.c:6905
msgid "Enable multi queue [no]"
msgstr "Увімкнути декілька черг [типово ні]"
-#: ../clients/common/nm-meta-setting-desc.c:6832
+#: ../clients/common/nm-meta-setting-desc.c:6918
msgid "VLAN parent device or connection UUID"
msgstr "БатьківÑький приÑтрій VLAN або UUID з'єднаннÑ"
-#: ../clients/common/nm-meta-setting-desc.c:6839
+#: ../clients/common/nm-meta-setting-desc.c:6925
msgid "VLAN ID (<0-4094>)"
msgstr "Ід. VLAN (<0-4094>)"
-#: ../clients/common/nm-meta-setting-desc.c:6845
+#: ../clients/common/nm-meta-setting-desc.c:6931
msgid "VLAN flags (<0-7>) [none]"
msgstr "Прапорці VLAN (<0-7>) [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:6854
+#: ../clients/common/nm-meta-setting-desc.c:6940
msgid "Ingress priority maps [none]"
msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ñ–Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ð½Ð¾ÑÑ‚Ñ– вхідного доÑтупу [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:6864
+#: ../clients/common/nm-meta-setting-desc.c:6950
msgid "Egress priority maps [none]"
msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ñ–Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ð½Ð¾ÑÑ‚Ñ– вихідного доÑтупу [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:6932
+#: ../clients/common/nm-meta-setting-desc.c:7018
msgid "Table [0]"
msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ [0]"
-#: ../clients/common/nm-meta-setting-desc.c:6952
+#: ../clients/common/nm-meta-setting-desc.c:7038
msgid "VXLAN ID"
msgstr "Ід. VXLAN"
-#: ../clients/common/nm-meta-setting-desc.c:6958
+#: ../clients/common/nm-meta-setting-desc.c:7044
msgid "Local address [none]"
msgstr "Локальна адреÑа [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:6971
+#: ../clients/common/nm-meta-setting-desc.c:7057
msgid "Minimum source port [0]"
msgstr "Мінімальний порт джерела [0]"
-#: ../clients/common/nm-meta-setting-desc.c:6977
+#: ../clients/common/nm-meta-setting-desc.c:7063
msgid "Maximum source port [0]"
msgstr "МакÑимальний порт джерела [0]"
-#: ../clients/common/nm-meta-setting-desc.c:6983
+#: ../clients/common/nm-meta-setting-desc.c:7069
msgid "Destination port [8472]"
msgstr "Порт Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ [типово 8472]"
-#: ../clients/common/nm-meta-setting-desc.c:7023
+#: ../clients/common/nm-meta-setting-desc.c:7109
msgid "Peer"
msgstr "Вузол"
-#: ../clients/common/nm-meta-setting-desc.c:7053
+#: ../clients/common/nm-meta-setting-desc.c:7139
msgid "WiMAX NSP name"
msgstr "Ðазва NSP WiMAX"
-#: ../clients/common/nm-meta-setting-desc.c:7090
-#: ../clients/common/nm-meta-setting-desc.c:7271
+#: ../clients/common/nm-meta-setting-desc.c:7176
+#: ../clients/common/nm-meta-setting-desc.c:7357
msgid "Cloned MAC [none]"
msgstr "Клонований MAC [типово немає]"
-#: ../clients/common/nm-meta-setting-desc.c:7123
+#: ../clients/common/nm-meta-setting-desc.c:7209
msgid ""
"Enter a list of subchannels (comma or space separated).\n"
"\n"
@@ -5744,7 +5744,7 @@ msgstr ""
"\n"
"Приклад: 0.0.0e20 0.0.0e21 0.0.0e22\n"
-#: ../clients/common/nm-meta-setting-desc.c:7445
+#: ../clients/common/nm-meta-setting-desc.c:7531
msgid ""
"Enter the type of WEP keys. The accepted values are: 0 or unknown, 1 or key, "
"and 2 or passphrase.\n"
@@ -5752,230 +5752,230 @@ msgstr ""
"Вкажіть тип ключів WEP. Можливі значеннÑ: 0 або unknown (невідомо), 1 або "
"key (ключ) та 2 або passphrase (пароль).\n"
-#: ../clients/common/nm-meta-setting-desc.c:7504
+#: ../clients/common/nm-meta-setting-desc.c:7590
msgid "Short address (<0x0000-0xffff>)"
msgstr "Коротка адреÑа (<0x0000-0xffff>)"
-#: ../clients/common/nm-meta-setting-desc.c:7520
+#: ../clients/common/nm-meta-setting-desc.c:7606
msgid "PAN Identifier (<0x0000-0xffff>)"
msgstr "Ідентифікатор PAN (<0x0000-0xffff>)"
-#: ../clients/common/nm-meta-setting-desc.c:7535
+#: ../clients/common/nm-meta-setting-desc.c:7621
msgid "Page (<default|0-31>)"
msgstr "Сторінка (<default|0-31>)"
-#: ../clients/common/nm-meta-setting-desc.c:7549
+#: ../clients/common/nm-meta-setting-desc.c:7635
msgid "Channel (<default|0-26>)"
msgstr "Канал (<default|0-26>)"
#. ***************************************************************************
-#: ../clients/common/nm-meta-setting-desc.c:7684
+#: ../clients/common/nm-meta-setting-desc.c:7770
msgid "6LOWPAN settings"
msgstr "Параметри 6LOWPAN"
-#: ../clients/common/nm-meta-setting-desc.c:7685
+#: ../clients/common/nm-meta-setting-desc.c:7771
msgid "802-1x settings"
msgstr "Параметри 802-1x"
-#: ../clients/common/nm-meta-setting-desc.c:7686
+#: ../clients/common/nm-meta-setting-desc.c:7772
#: ../src/devices/adsl/nm-device-adsl.c:117
msgid "ADSL connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ADSL"
-#: ../clients/common/nm-meta-setting-desc.c:7687
+#: ../clients/common/nm-meta-setting-desc.c:7773
msgid "bluetooth connection"
msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ bluetooth"
-#: ../clients/common/nm-meta-setting-desc.c:7688
+#: ../clients/common/nm-meta-setting-desc.c:7774
msgid "Bond device"
msgstr "ПриÑтрій Bond"
-#: ../clients/common/nm-meta-setting-desc.c:7689
+#: ../clients/common/nm-meta-setting-desc.c:7775
msgid "Bridge device"
msgstr "ПриÑтрій міÑтка"
-#: ../clients/common/nm-meta-setting-desc.c:7690
+#: ../clients/common/nm-meta-setting-desc.c:7776
msgid "Bridge port"
msgstr "Порт міÑтка"
-#: ../clients/common/nm-meta-setting-desc.c:7691
+#: ../clients/common/nm-meta-setting-desc.c:7777
msgid "CDMA mobile broadband connection"
msgstr "мобільне широкоÑмугове з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ CDMA"
-#: ../clients/common/nm-meta-setting-desc.c:7692
+#: ../clients/common/nm-meta-setting-desc.c:7778
msgid "General settings"
msgstr "Загальні параметри"
-#: ../clients/common/nm-meta-setting-desc.c:7693
+#: ../clients/common/nm-meta-setting-desc.c:7779
msgid "DCB settings"
msgstr "Параметри DCB"
-#: ../clients/common/nm-meta-setting-desc.c:7694
+#: ../clients/common/nm-meta-setting-desc.c:7780
msgid "Dummy settings"
msgstr "Фіктивні параметри"
-#: ../clients/common/nm-meta-setting-desc.c:7695
+#: ../clients/common/nm-meta-setting-desc.c:7781
msgid "Ethtool settings"
msgstr "Параметри Ethtool"
-#: ../clients/common/nm-meta-setting-desc.c:7696
+#: ../clients/common/nm-meta-setting-desc.c:7782
msgid "Generic settings"
msgstr "Загальні параметри"
-#: ../clients/common/nm-meta-setting-desc.c:7697
+#: ../clients/common/nm-meta-setting-desc.c:7783
msgid "GSM mobile broadband connection"
msgstr "мобільне широкоÑмугове з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ GSM"
-#: ../clients/common/nm-meta-setting-desc.c:7698
+#: ../clients/common/nm-meta-setting-desc.c:7784
#: ../src/devices/nm-device-infiniband.c:158
msgid "InfiniBand connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ InfiniBand"
-#: ../clients/common/nm-meta-setting-desc.c:7699
+#: ../clients/common/nm-meta-setting-desc.c:7785
msgid "IPv4 protocol"
msgstr "Протокол IPv4"
-#: ../clients/common/nm-meta-setting-desc.c:7700
+#: ../clients/common/nm-meta-setting-desc.c:7786
msgid "IPv6 protocol"
msgstr "Протокол IPv6"
-#: ../clients/common/nm-meta-setting-desc.c:7701
+#: ../clients/common/nm-meta-setting-desc.c:7787
msgid "IP-tunnel settings"
msgstr "Параметри IP-тунелюваннÑ"
-#: ../clients/common/nm-meta-setting-desc.c:7702
+#: ../clients/common/nm-meta-setting-desc.c:7788
msgid "MACsec connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ MACsec"
-#: ../clients/common/nm-meta-setting-desc.c:7703
+#: ../clients/common/nm-meta-setting-desc.c:7789
msgid "macvlan connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ MACVLAN"
-#: ../clients/common/nm-meta-setting-desc.c:7704
+#: ../clients/common/nm-meta-setting-desc.c:7790
msgid "Match"
msgstr "ВідповідніÑÑ‚ÑŒ"
-#: ../clients/common/nm-meta-setting-desc.c:7705
+#: ../clients/common/nm-meta-setting-desc.c:7791
msgid "OLPC Mesh connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ OLPC Mesh"
-#: ../clients/common/nm-meta-setting-desc.c:7706
+#: ../clients/common/nm-meta-setting-desc.c:7792
msgid "Open vSwitch bridge settings"
msgstr "Параметри міÑтка Open vSwitch"
-#: ../clients/common/nm-meta-setting-desc.c:7707
+#: ../clients/common/nm-meta-setting-desc.c:7793
msgid "Open vSwitch DPDK interface settings"
msgstr "Параметри інтерфейÑу Open vSwitch DPDK"
-#: ../clients/common/nm-meta-setting-desc.c:7708
+#: ../clients/common/nm-meta-setting-desc.c:7794
msgid "Open vSwitch interface settings"
msgstr "Параметри інтерфейÑу Open vSwitch"
-#: ../clients/common/nm-meta-setting-desc.c:7709
+#: ../clients/common/nm-meta-setting-desc.c:7795
msgid "Open vSwitch patch interface settings"
msgstr "Параметри інтерфейÑу латок Open vSwitch"
-#: ../clients/common/nm-meta-setting-desc.c:7710
+#: ../clients/common/nm-meta-setting-desc.c:7796
msgid "Open vSwitch port settings"
msgstr "Параметри портів Open vSwitch"
-#: ../clients/common/nm-meta-setting-desc.c:7711
+#: ../clients/common/nm-meta-setting-desc.c:7797
msgid "PPP settings"
msgstr "Параметри PPP"
-#: ../clients/common/nm-meta-setting-desc.c:7712
+#: ../clients/common/nm-meta-setting-desc.c:7798
msgid "PPPoE"
msgstr "PPPoE"
-#: ../clients/common/nm-meta-setting-desc.c:7713
+#: ../clients/common/nm-meta-setting-desc.c:7799
msgid "Proxy"
msgstr "ПрокÑÑ–"
-#: ../clients/common/nm-meta-setting-desc.c:7714
+#: ../clients/common/nm-meta-setting-desc.c:7800
msgid "Serial settings"
msgstr "Параметри поÑлідовного з'єднаннÑ"
-#: ../clients/common/nm-meta-setting-desc.c:7715
+#: ../clients/common/nm-meta-setting-desc.c:7801
msgid "SR-IOV settings"
msgstr "Параметри SR-IOV"
-#: ../clients/common/nm-meta-setting-desc.c:7716
+#: ../clients/common/nm-meta-setting-desc.c:7802
msgid "Traffic controls"
msgstr "ЗаÑоби ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±Ð¼Ñ–Ð½Ð¾Ð¼ даними"
-#: ../clients/common/nm-meta-setting-desc.c:7717
+#: ../clients/common/nm-meta-setting-desc.c:7803
msgid "Team device"
msgstr "ПриÑтрій Team"
-#: ../clients/common/nm-meta-setting-desc.c:7718
+#: ../clients/common/nm-meta-setting-desc.c:7804
msgid "Team port"
msgstr "Порт Team"
-#: ../clients/common/nm-meta-setting-desc.c:7719
+#: ../clients/common/nm-meta-setting-desc.c:7805
msgid "Tun device"
msgstr "ПриÑтрій TUN"
-#: ../clients/common/nm-meta-setting-desc.c:7720
+#: ../clients/common/nm-meta-setting-desc.c:7806
msgid "User settings"
msgstr "Параметри кориÑтувача"
-#: ../clients/common/nm-meta-setting-desc.c:7721
+#: ../clients/common/nm-meta-setting-desc.c:7807
#: ../src/devices/nm-device-vlan.c:385
msgid "VLAN connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ VLAN"
-#: ../clients/common/nm-meta-setting-desc.c:7722 ../src/nm-manager.c:5644
+#: ../clients/common/nm-meta-setting-desc.c:7808 ../src/nm-manager.c:5683
msgid "VPN connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ VPN"
-#: ../clients/common/nm-meta-setting-desc.c:7723
+#: ../clients/common/nm-meta-setting-desc.c:7809
#: ../src/devices/nm-device-vrf.c:175
msgid "VRF connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ VRF"
-#: ../clients/common/nm-meta-setting-desc.c:7724
+#: ../clients/common/nm-meta-setting-desc.c:7810
#: ../src/devices/nm-device-vxlan.c:354
msgid "VXLAN connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ VXLAN"
-#: ../clients/common/nm-meta-setting-desc.c:7725
+#: ../clients/common/nm-meta-setting-desc.c:7811
msgid "Wi-Fi P2P connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ P2P Wi-Fi"
-#: ../clients/common/nm-meta-setting-desc.c:7726
+#: ../clients/common/nm-meta-setting-desc.c:7812
msgid "WiMAX connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ WiMAX"
-#: ../clients/common/nm-meta-setting-desc.c:7727
+#: ../clients/common/nm-meta-setting-desc.c:7813
msgid "Wired Ethernet"
msgstr "Дротовий Ethernet"
-#: ../clients/common/nm-meta-setting-desc.c:7728
+#: ../clients/common/nm-meta-setting-desc.c:7814
msgid "WireGuard VPN settings"
msgstr "Параметри VPN WireGuard"
-#: ../clients/common/nm-meta-setting-desc.c:7729
+#: ../clients/common/nm-meta-setting-desc.c:7815
msgid "Wi-Fi connection"
msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Wi-Fi"
-#: ../clients/common/nm-meta-setting-desc.c:7730
+#: ../clients/common/nm-meta-setting-desc.c:7816
msgid "Wi-Fi security settings"
msgstr "Параметри захиÑту Wi-Fi"
-#: ../clients/common/nm-meta-setting-desc.c:7731
+#: ../clients/common/nm-meta-setting-desc.c:7817
msgid "WPAN settings"
msgstr "Параметри WPAN"
-#: ../clients/common/nm-meta-setting-desc.c:8108
+#: ../clients/common/nm-meta-setting-desc.c:8194
msgid "name"
msgstr "назва"
-#: ../clients/common/nm-polkit-listener.c:347
+#: ../clients/common/nm-polkit-listener.c:368
#, c-format
msgid "Could not find any session id for uid %d"
msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ жодного ідентифікатора ÑеанÑу Ð´Ð»Ñ uid %d"
-#: ../clients/common/nm-polkit-listener.c:349
+#: ../clients/common/nm-polkit-listener.c:370
#, c-format
msgid "Could not retrieve session id: %s"
msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ідентифікатор ÑеанÑу: %s"
@@ -6116,38 +6116,38 @@ msgstr ""
msgid "failed to load VPN plugin \"%s\": %s"
msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ додаток VPN «%s»: %s"
-#: ../clients/common/nm-vpn-helpers.c:115
+#: ../clients/common/nm-vpn-helpers.c:144
msgid "Certificate password"
msgstr "Пароль Ñертифіката"
-#: ../clients/common/nm-vpn-helpers.c:116
+#: ../clients/common/nm-vpn-helpers.c:145
msgid "HTTP proxy password"
msgstr "Пароль Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð·Ð° HTTP"
-#: ../clients/common/nm-vpn-helpers.c:121
-#: ../clients/common/nm-vpn-helpers.c:126
+#: ../clients/common/nm-vpn-helpers.c:152
+#: ../clients/common/nm-vpn-helpers.c:161
msgid "Group password"
msgstr "Пароль групи"
-#: ../clients/common/nm-vpn-helpers.c:130 ../clients/tui/nmt-page-ip4.c:130
+#: ../clients/common/nm-vpn-helpers.c:167 ../clients/tui/nmt-page-ip4.c:130
#: ../clients/tui/nmt-page-ip6.c:131
msgid "Gateway"
msgstr "Шлюз"
-#: ../clients/common/nm-vpn-helpers.c:131
+#: ../clients/common/nm-vpn-helpers.c:168
msgid "Cookie"
msgstr "Кука"
-#: ../clients/common/nm-vpn-helpers.c:132
+#: ../clients/common/nm-vpn-helpers.c:169
msgid "Gateway certificate hash"
msgstr "Хеш Ñертифіката шлюзу"
-#: ../clients/common/nm-vpn-helpers.c:257
+#: ../clients/common/nm-vpn-helpers.c:267
#, c-format
msgid "Invalid peer starting at %s:%zu: %s"
msgstr "Ðекоректний вузол, що починаєтьÑÑ Ð· %s:%zu: %s"
-#: ../clients/common/nm-vpn-helpers.c:377
+#: ../clients/common/nm-vpn-helpers.c:387
msgid ""
"The name of the WireGuard config must be a valid interface name followed by "
"\".conf\""
@@ -6155,22 +6155,22 @@ msgstr ""
"Ðазва файла налаштувань WireGuard повинна бути коректною назвою: назва файла "
"має збігатиÑÑ Ñ–Ð· назвою інтерфейÑу, до неї має бути додано «.conf»"
-#: ../clients/common/nm-vpn-helpers.c:666
+#: ../clients/common/nm-vpn-helpers.c:675
#, c-format
msgid "unrecognized line at %s:%zu"
msgstr "нерозпізнаний Ñ€Ñдок у %s:%zu"
-#: ../clients/common/nm-vpn-helpers.c:671
+#: ../clients/common/nm-vpn-helpers.c:680
#, c-format
msgid "invalid value for '%s' at %s:%zu"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Â«%s» у %s:%zu"
-#: ../clients/common/nm-vpn-helpers.c:676
+#: ../clients/common/nm-vpn-helpers.c:685
#, c-format
msgid "invalid secret '%s' at %s:%zu"
msgstr "некоректні реєÑтраційні дані «%s» у %s:%zu"
-#: ../clients/common/nm-vpn-helpers.c:789
+#: ../clients/common/nm-vpn-helpers.c:811
#, c-format
msgid "Failed to create WireGuard connection: %s"
msgstr "Ðе вдалоÑÑ Ñтворити з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ WireGuard: %s"
@@ -6928,9 +6928,9 @@ msgstr ""
#: ../clients/common/settings-docs.h.in:61
#: ../clients/common/settings-docs.h.in:107
-#: ../clients/common/settings-docs.h.in:140
-#: ../clients/common/settings-docs.h.in:189
-#: ../clients/common/settings-docs.h.in:308
+#: ../clients/common/settings-docs.h.in:149
+#: ../clients/common/settings-docs.h.in:199
+#: ../clients/common/settings-docs.h.in:318
msgid "Flags indicating how to handle the \"password\" property."
msgstr "Прапорці, Ñкі позначають, Ñк оброблÑти влаÑтивіÑÑ‚ÑŒ «password»."
@@ -7264,7 +7264,7 @@ msgid "PIN used for EAP authentication methods."
msgstr "PIN, Ñкий викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñ–Ð² Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ EAP."
#: ../clients/common/settings-docs.h.in:85
-#: ../clients/common/settings-docs.h.in:191
+#: ../clients/common/settings-docs.h.in:201
msgid "Flags indicating how to handle the \"pin\" property."
msgstr "Прапорці, Ñкі позначають, Ñк оброблÑти влаÑтивіÑÑ‚ÑŒ «pin»."
@@ -7638,11 +7638,11 @@ msgid ""
"address format, ie an address of the form 01:80:C2:00:00:0X, with X in [0, "
"4..F]. If not specified the default value is 01:80:C2:00:00:00."
msgstr ""
-"Якщо вказано, MAC-адреÑа універÑальної транÑлÑції, Ñку цей міÑток"
-" викориÑтовує Ð´Ð»Ñ STP. ÐдреÑа має бути адреÑою локального зв'Ñзку"
-" (link-local) у Ñтандартному форматі Ð°Ð´Ñ€ÐµÑ MAC Ethernet, тобто адреÑою у"
-" форматі 01:80:C2:00:00:0X, де X має належати множині [0, 4..F]. Якщо не"
-" вказано, типовим значеннÑм Ñ” 01:80:C2:00:00:00."
+"Якщо вказано, MAC-адреÑа універÑальної транÑлÑції, Ñку цей міÑток "
+"викориÑтовує Ð´Ð»Ñ STP. ÐдреÑа має бути адреÑою локального зв'Ñзку (link-"
+"local) у Ñтандартному форматі Ð°Ð´Ñ€ÐµÑ MAC Ethernet, тобто адреÑою у форматі "
+"01:80:C2:00:00:0X, де X має належати множині [0, 4..F]. Якщо не вказано, "
+"типовим значеннÑм Ñ” 01:80:C2:00:00:00."
#: ../clients/common/settings-docs.h.in:118
msgid ""
@@ -7684,32 +7684,87 @@ msgid "The Spanning Tree Protocol (STP) maximum message age, in seconds."
msgstr "МакÑимальний вік Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·Ð° протоколом STP, у Ñекундах."
#: ../clients/common/settings-docs.h.in:122
+msgid "Set maximum size of multicast hash table (value must be a power of 2)."
+msgstr ""
+"Ð’Ñтановити макÑимальний розмір таблиці хешів універÑальної транÑлÑції"
+" (Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ” бути Ñтепенем 2)."
+
+#: ../clients/common/settings-docs.h.in:123
+msgid ""
+"Set the number of queries the bridge will send before stopping forwarding a "
+"multicast group after a \"leave\" message has been received."
+msgstr ""
+"Ð’Ñтановити кількіÑÑ‚ÑŒ запитів, Ñкі міÑток надÑилатиме, перш ніж припинити"
+" переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸ універÑальної транÑлÑції піÑÐ»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ"
+" Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Â«leave»."
+
+#: ../clients/common/settings-docs.h.in:124
+msgid ""
+"Set interval (in deciseconds) between queries to find remaining members of a "
+"group, after a \"leave\" message is received."
+msgstr ""
+"Ð’Ñтановити інтервал (у дециÑекундах) між запитами Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ решти учаÑників"
+" групи піÑÐ»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Â«leave»."
+
+#: ../clients/common/settings-docs.h.in:125
+msgid ""
+"Set delay (in deciseconds) after which the bridge will leave a group, if no "
+"membership reports for this group are received."
+msgstr ""
+"Ð’Ñтановити затримку (у дециÑекундах), піÑÐ»Ñ Ñкої міÑток полишить групу, Ñкщо"
+" не буде отримано звітів щодо членÑтва Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— групи."
+
+#: ../clients/common/settings-docs.h.in:126
msgid ""
"Enable or disable sending of multicast queries by the bridge. If not "
"specified the option is disabled."
msgstr ""
-"Увімкнути або вимкнути надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² універÑальної транÑлÑції міÑтком."
-" Якщо не вказано, вважаєтьÑÑ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¸Ð¼."
+"Увімкнути або вимкнути надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² універÑальної транÑлÑції міÑтком. "
+"Якщо не вказано, вважаєтьÑÑ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¸Ð¼."
-#: ../clients/common/settings-docs.h.in:123
+#: ../clients/common/settings-docs.h.in:127
+msgid ""
+"If no queries are seen after this delay (in deciseconds) has passed, the "
+"bridge will start to send its own queries."
+msgstr ""
+"Якщо протÑгом цього чаÑу затримки (у дециÑекундах) не буде передано жодного"
+" запиту, міÑток почне надÑилати влаÑні запити."
+
+#: ../clients/common/settings-docs.h.in:128
+msgid ""
+"Interval (in deciseconds) between queries sent by the bridge after the end "
+"of the startup phase."
+msgstr ""
+"Інтервал (у дециÑекундах) між запитами, Ñкі буде надіÑлано міÑтком піÑлÑ"
+" Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— фази."
+
+#: ../clients/common/settings-docs.h.in:129
+msgid ""
+"Set the Max Response Time/Max Response Delay (in deciseconds) for IGMP/MLD "
+"queries sent by the bridge."
+msgstr ""
+"Ð’Ñтановити макÑимальний Ñ‡Ð°Ñ Ð½Ð° відповідь та макÑимальну затримку відповіді (у"
+" дециÑекундах) Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² IGMP/MLD, Ñкі буде надіÑлано міÑтком."
+
+#: ../clients/common/settings-docs.h.in:130
msgid ""
"If enabled the bridge's own IP address is used as the source address for "
"IGMP queries otherwise the default of 0.0.0.0 is used."
msgstr ""
-"Якщо увімкнено, Ñк адреÑу джерела Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² IGMP буде викориÑтано влаÑну"
-" IP-адреÑу міÑтка. Якщо вимкнено, буде викориÑтано типову адреÑу 0.0.0.0."
+"Якщо увімкнено, Ñк адреÑу джерела Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² IGMP буде викориÑтано влаÑну "
+"IP-адреÑу міÑтка. Якщо вимкнено, буде викориÑтано типову адреÑу 0.0.0.0."
-#: ../clients/common/settings-docs.h.in:124
+#: ../clients/common/settings-docs.h.in:131
msgid ""
"Sets bridge's multicast router. multicast-snooping must be enabled for this "
"option to work. Supported values are: 'auto', 'disabled', 'enabled'. If not "
"specified the default value is 'auto'."
msgstr ""
-"Ð’Ñтановлює маршрутизатор універÑальної транÑлÑції міÑтка. Щоб цей параметр"
-" Ñпрацював, має бути увімкнено multicast-snooping. Підтримувані значеннÑ:"
-" «auto», «disabled», «enabled». Якщо не вказано, типовим значеннÑм Ñ” «auto»."
+"Ð’Ñтановлює маршрутизатор універÑальної транÑлÑції міÑтка. Щоб цей параметр "
+"Ñпрацював, має бути увімкнено multicast-snooping. Підтримувані значеннÑ: "
+"«auto», «disabled», «enabled». Якщо не вказано, типовим значеннÑм Ñ” «auto»."
-#: ../clients/common/settings-docs.h.in:125
+#: ../clients/common/settings-docs.h.in:132
msgid ""
"Controls whether IGMP snooping is enabled for this bridge. Note that if "
"snooping was automatically disabled due to hash collisions, the system may "
@@ -7719,7 +7774,20 @@ msgstr ""
"ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ автоматично вимкнено через конфлікти хешуваннÑ, ÑиÑтема може "
"відмовити у вмиканні цієї можливоÑÑ‚Ñ–, аж доки конфлікти не буде уÑунено."
-#: ../clients/common/settings-docs.h.in:126
+#: ../clients/common/settings-docs.h.in:133
+msgid "Set the number of IGMP queries to send during startup phase."
+msgstr ""
+"Ð’Ñтановити кількіÑÑ‚ÑŒ запитів IGMP, Ñкі Ñлід надіÑлати під Ñ‡Ð°Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— фази."
+
+#: ../clients/common/settings-docs.h.in:134
+msgid ""
+"Sets the time (in deciseconds) between queries sent out at startup to "
+"determine membership information."
+msgstr ""
+"Ð’Ñтановити Ñ‡Ð°Ñ (у дециÑекундах) між надÑиланнÑми запитів під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку длÑ"
+" Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— щодо членÑтва."
+
+#: ../clients/common/settings-docs.h.in:135
msgid ""
"Sets the Spanning Tree Protocol (STP) priority for this bridge. Lower "
"values are \"better\"; the lowest priority bridge will be elected the root "
@@ -7729,14 +7797,14 @@ msgstr ""
"пріоритетнішими; міÑток із найменшим значеннÑм пріоритетноÑÑ‚Ñ– буде вибрано "
"Ñк кореневий міÑток."
-#: ../clients/common/settings-docs.h.in:127
+#: ../clients/common/settings-docs.h.in:136
msgid ""
"Controls whether Spanning Tree Protocol (STP) is enabled for this bridge."
msgstr ""
"Керує тим, чи увімкнено протокол переÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ñ”Ñ€Ð°Ñ€Ñ…Ñ–Ñ”ÑŽ (STP) Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ "
"міÑтка."
-#: ../clients/common/settings-docs.h.in:128
+#: ../clients/common/settings-docs.h.in:137
msgid ""
"The default PVID for the ports of the bridge, that is the VLAN id assigned "
"to incoming untagged frames."
@@ -7744,25 +7812,24 @@ msgstr ""
"Типовий PVID Ð´Ð»Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð² міÑтка. Це ідентифікатор VLAN, Ñкий пов'Ñзано із "
"вхідними кадрами без міток."
-#: ../clients/common/settings-docs.h.in:129
+#: ../clients/common/settings-docs.h.in:138
msgid "Control whether VLAN filtering is enabled on the bridge."
msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¼, чи увімкнено Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ VLAN на міÑтку."
-#: ../clients/common/settings-docs.h.in:130
+#: ../clients/common/settings-docs.h.in:139
msgid ""
"If specified, the protocol used for VLAN filtering. Supported values are: "
"'802.1Q', '802.1ad'. If not specified the default value is '802.1Q'."
msgstr ""
-"Якщо вказано, протокол, Ñкий буде викориÑтано Ð´Ð»Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ VLAN."
-" Підтримувані значеннÑ: «802.1Q», «802.1ad». Якщо не вказано, типовим"
-" значеннÑм буде «802.1Q»."
+"Якщо вказано, протокол, Ñкий буде викориÑтано Ð´Ð»Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ VLAN. "
+"Підтримувані значеннÑ: «802.1Q», «802.1ad». Якщо не вказано, типовим "
+"значеннÑм буде «802.1Q»."
-#: ../clients/common/settings-docs.h.in:131
-#| msgid "Control whether VLAN filtering is enabled on the bridge."
+#: ../clients/common/settings-docs.h.in:140
msgid "Controls whether per-VLAN stats accounting is enabled."
msgstr "Керує тим, чи увімкнено облік ÑтатиÑтичних даних Ð´Ð»Ñ Ð¾ÐºÑ€ÐµÐ¼Ð¸Ñ… VLAN."
-#: ../clients/common/settings-docs.h.in:132
+#: ../clients/common/settings-docs.h.in:141
msgid ""
"Array of bridge VLAN objects. In addition to the VLANs specified here, the "
"bridge will also have the default-pvid VLAN configured by the bridge.vlan-"
@@ -7779,7 +7846,7 @@ msgstr ""
"від 1 до 4094, або діапазон, Ñкий визначаєтьÑÑ Ð¿Ð°Ñ€Ð¾ÑŽ ідентифікаторів, Ñкі "
"відокремлено дефіÑом."
-#: ../clients/common/settings-docs.h.in:133
+#: ../clients/common/settings-docs.h.in:142
msgid ""
"Enables or disables \"hairpin mode\" for the port, which allows frames to be "
"sent back out through the port the frame was received on."
@@ -7787,19 +7854,19 @@ msgstr ""
"Вмикає або вимикає «режим початкової зони» Ð´Ð»Ñ Ð¿Ð¾Ñ€Ñ‚Ñƒ, що уможливлює зворотне "
"надÑÐ¸Ð»Ð°Ð½Ð½Ñ ÐºÐ°Ð´Ñ€Ñ–Ð² крізь порт, з Ñкого було отримано кадр."
-#: ../clients/common/settings-docs.h.in:134
+#: ../clients/common/settings-docs.h.in:143
msgid ""
"The Spanning Tree Protocol (STP) port cost for destinations via this port."
msgstr ""
"ВартіÑÑ‚ÑŒ порту у протоколі переÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ñ”Ñ€Ð°Ñ€Ñ…Ñ–Ñ”ÑŽ (STP) Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ, що "
"маршрутизуютьÑÑ Ñ‡ÐµÑ€ÐµÐ· цей порт."
-#: ../clients/common/settings-docs.h.in:135
+#: ../clients/common/settings-docs.h.in:144
msgid "The Spanning Tree Protocol (STP) priority of this bridge port."
msgstr ""
"ПріоритетніÑÑ‚ÑŒ протоколу переÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ñ”Ñ€Ð°Ñ€Ñ…Ñ–Ñ”ÑŽ (STP) цього порту міÑтка."
-#: ../clients/common/settings-docs.h.in:136
+#: ../clients/common/settings-docs.h.in:145
msgid ""
"Array of bridge VLAN objects. In addition to the VLANs specified here, the "
"port will also have the default-pvid VLAN configured on the bridge by the "
@@ -7816,9 +7883,9 @@ msgstr ""
"від 1 до 4094, або діапазон, Ñкий визначаєтьÑÑ Ð¿Ð°Ñ€Ð¾ÑŽ ідентифікаторів, Ñкі "
"відокремлено дефіÑом."
-#: ../clients/common/settings-docs.h.in:137
-#: ../clients/common/settings-docs.h.in:185
-#: ../clients/common/settings-docs.h.in:196
+#: ../clients/common/settings-docs.h.in:146
+#: ../clients/common/settings-docs.h.in:195
+#: ../clients/common/settings-docs.h.in:206
msgid ""
"If non-zero, only transmit packets of the specified size or smaller, "
"breaking larger packets up into multiple frames."
@@ -7826,7 +7893,7 @@ msgstr ""
"Якщо має ненульове значеннÑ, передавати пакети лише вказаного або меншого "
"розміру, розбиваючи великі пакети на декілька кадрів."
-#: ../clients/common/settings-docs.h.in:138
+#: ../clients/common/settings-docs.h.in:147
msgid ""
"The number to dial to establish the connection to the CDMA-based mobile "
"broadband network, if any. If not specified, the default number (#777) is "
@@ -7836,8 +7903,8 @@ msgstr ""
"широкоÑмуговою мережею на оÑнові CDMA, Ñкщо такий передбачено. Якщо не "
"вказано, буде викориÑтано типовий номер (#777)."
-#: ../clients/common/settings-docs.h.in:139
-#: ../clients/common/settings-docs.h.in:188
+#: ../clients/common/settings-docs.h.in:148
+#: ../clients/common/settings-docs.h.in:198
msgid ""
"The password used to authenticate with the network, if required. Many "
"providers do not require a password, or accept any password. But if a "
@@ -7847,8 +7914,8 @@ msgstr ""
"Багато надавачів поÑлуг не вимагають Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð°Ð±Ð¾ приймають будь-Ñкий "
"пароль. Втім, Ñкщо пароль потрібен, його Ñлід вказати тут."
-#: ../clients/common/settings-docs.h.in:141
-#: ../clients/common/settings-docs.h.in:194
+#: ../clients/common/settings-docs.h.in:150
+#: ../clients/common/settings-docs.h.in:204
msgid ""
"The username used to authenticate with the network, if required. Many "
"providers do not require a username, or accept any username. But if a "
@@ -7859,7 +7926,7 @@ msgstr ""
"приймають будь-Ñке ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача. Втім, Ñкщо ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача потрібне, "
"його Ñлід вказати тут."
-#: ../clients/common/settings-docs.h.in:142
+#: ../clients/common/settings-docs.h.in:151
msgid ""
"The number of retries for the authentication. Zero means to try "
"indefinitely; -1 means to use a global default. If the global default is not "
@@ -7873,7 +7940,7 @@ msgstr ""
"неможливіÑÑ‚ÑŒ вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·'єднаннÑ. У поточній верÑÑ–Ñ— ÑтоÑуєтьÑÑ Ð»Ð¸ÑˆÐµ до "
"Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð·Ð° протоколом 802-1x."
-#: ../clients/common/settings-docs.h.in:143
+#: ../clients/common/settings-docs.h.in:152
msgid ""
"Whether or not the connection should be automatically connected by "
"NetworkManager when the resources for the connection are available. TRUE to "
@@ -7890,7 +7957,7 @@ msgstr ""
"Ñкщо потрібна альтернатива Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·'єднань Ð´Ð»Ñ "
"профілів VPN."
-#: ../clients/common/settings-docs.h.in:144
+#: ../clients/common/settings-docs.h.in:153
msgid ""
"The autoconnect priority. If the connection is set to autoconnect, "
"connections with higher priority will be preferred. Defaults to 0. The "
@@ -7901,7 +7968,7 @@ msgstr ""
"пріоритетніÑÑ‚ÑŽ Типовим значеннÑм пріоритетноÑÑ‚Ñ– Ñ” 0. Більші Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "
"означають вищу пріоритетніÑÑ‚ÑŒ."
-#: ../clients/common/settings-docs.h.in:145
+#: ../clients/common/settings-docs.h.in:154
msgid ""
"The number of times a connection should be tried when autoactivating before "
"giving up. Zero means forever, -1 means the global default (4 times if not "
@@ -7916,7 +7983,7 @@ msgstr ""
"виконуватиметьÑÑ Ð»Ð¸ÑˆÐµ один раз. Зауважте, що по завершенню чаÑу Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ "
"NetworkManager знову Ñпробує вÑтановити з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñƒ автоматичному режимі."
-#: ../clients/common/settings-docs.h.in:146
+#: ../clients/common/settings-docs.h.in:155
msgid ""
"Whether or not slaves of this connection should be automatically brought up "
"when NetworkManager activates this connection. This only has a real effect "
@@ -7938,7 +8005,7 @@ msgstr ""
"slaves. Якщо Ñ– Ð´Ð»Ñ Ð½ÑŒÐ¾Ð³Ð¾ вÑтановлено типове значеннÑ, викориÑтовуєтьÑÑ "
"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0."
-#: ../clients/common/settings-docs.h.in:147
+#: ../clients/common/settings-docs.h.in:156
msgid ""
"If greater than zero, delay success of IP addressing until either the "
"timeout is reached, or an IP gateway replies to a ping."
@@ -7947,7 +8014,7 @@ msgstr ""
"вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи IP, доки або не буде вичерпано Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ шлюз "
"IP відповіÑÑ‚ÑŒ на надіÑланий йому Ñигнал."
-#: ../clients/common/settings-docs.h.in:148
+#: ../clients/common/settings-docs.h.in:157
msgid ""
"A human readable unique identifier for the connection, like \"Work Wi-Fi\" "
"or \"T-Mobile 3G\"."
@@ -7955,7 +8022,7 @@ msgstr ""
"Зручний Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ з'єднаннÑ, наприклад «Робочий Wi-"
"Fi» або «T-Mobile 3G»."
-#: ../clients/common/settings-docs.h.in:149
+#: ../clients/common/settings-docs.h.in:158
msgid ""
"The name of the network interface this connection is bound to. If not set, "
"then the connection can be attached to any interface of the appropriate type "
@@ -7978,11 +8045,11 @@ msgstr ""
"з'єднаннÑ. Якщо змінюєтьÑÑ Ð½Ð°Ð·Ð²Ð° інтерфейÑу або перевпорÑдковуєтьÑÑ ÑпиÑок "
"з'єднань, з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути заÑтоÑовано до помилкового інтерфейÑу."
-#: ../clients/common/settings-docs.h.in:150
+#: ../clients/common/settings-docs.h.in:159
msgid "Whether LLDP is enabled for the connection."
msgstr "Визначає, чи увімкнено LLDP Ð´Ð»Ñ Ð·'єднаннÑ."
-#: ../clients/common/settings-docs.h.in:151
+#: ../clients/common/settings-docs.h.in:160
msgid ""
"Whether Link-Local Multicast Name Resolution (LLMNR) is enabled for the "
"connection. LLMNR is a protocol based on the Domain Name System (DNS) packet "
@@ -8008,11 +8075,11 @@ msgstr ""
"буде, параметр ні на що не впливатиме. Одним з таких додатків є dns-systemd-"
"resolved."
-#: ../clients/common/settings-docs.h.in:152
+#: ../clients/common/settings-docs.h.in:161
msgid "Interface name of the master device or UUID of the master connection."
msgstr "Ðазва інтерфейÑу оÑновного приÑтрою або UUID оÑновного з'єднаннÑ."
-#: ../clients/common/settings-docs.h.in:153
+#: ../clients/common/settings-docs.h.in:162
msgid ""
"Whether mDNS is enabled for the connection. The permitted values are: \"yes"
"\" (2) register hostname and resolving for the connection, \"no\" (0) "
@@ -8034,7 +8101,7 @@ msgstr ""
"буде, параметр ні на що не впливатиме. Одним з таких додатків є dns-systemd-"
"resolved."
-#: ../clients/common/settings-docs.h.in:154
+#: ../clients/common/settings-docs.h.in:163
msgid ""
"Whether the connection is metered. When updating this property on a "
"currently activated connection, the change takes effect immediately."
@@ -8043,7 +8110,27 @@ msgstr ""
"влаÑтивіÑÑ‚ÑŒ Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ активованого з'єднаннÑ, зміни набудуть чинноÑÑ‚Ñ– "
"негайно."
-#: ../clients/common/settings-docs.h.in:155
+#: ../clients/common/settings-docs.h.in:164
+msgid ""
+"If configured, set to a Manufacturer Usage Description (MUD) URL that points "
+"to manufacturer-recommended network policies for IoT devices. It is "
+"transmitted as a DHCPv4 or DHCPv6 option. The value must be a valid URL "
+"starting with \"https://\". The special value \"none\" is allowed to "
+"indicate that no MUD URL is used. If the per-profile value is unspecified "
+"(the default), a global connection default gets consulted. If still "
+"unspecified, the ultimate default is \"none\"."
+msgstr ""
+"Якщо налаштовано, вÑтановлює Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи опиÑу викориÑÑ‚Ð°Ð½Ð½Ñ Ð²Ð¸Ñ€Ð¾Ð±Ð½Ð¸ÐºÐ° "
+"(MUD), Ñка вказує на рекомендовані виробником правила роботи у мережі Ð´Ð»Ñ "
+"приÑтрої інтернету речей. ПередаєтьÑÑ Ñк параметр DHCPv4 або DHCPv6. "
+"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ” бути коректною адреÑою, що починаєтьÑÑ Ð· «https://». Можна "
+"викориÑтовувати оÑобливе Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«none» Ð´Ð»Ñ Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¾Ð³Ð¾, що адреÑа MUD "
+"не викориÑтовуєтьÑÑ. Якщо Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¾ÐºÑ€ÐµÐ¼Ð¸Ñ… профілів не вказано (типовий "
+"варіант), Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ взÑто із типових параметрів загального з'єднаннÑ. "
+"Якщо вÑтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° типовими параметрами не вдаÑÑ‚ÑŒÑÑ, оÑтаточним "
+"типовим варіантом буде вибрано «none»."
+
+#: ../clients/common/settings-docs.h.in:165
msgid ""
"Specifies whether the profile can be active multiple times at a particular "
"moment. The value is of type NMConnectionMultiConnect."
@@ -8051,7 +8138,7 @@ msgstr ""
"Визначає, чи може бути профіль активним Ð´Ð»Ñ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ¾Ñ… з'єднань одночаÑно. "
"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ð°Ð»ÐµÐ¶Ð¸Ñ‚ÑŒ до типу NMConnectionMultiConnect."
-#: ../clients/common/settings-docs.h.in:156
+#: ../clients/common/settings-docs.h.in:166
msgid ""
"An array of strings defining what access a given user has to this "
"connection. If this is NULL or empty, all users are allowed to access this "
@@ -8081,7 +8168,7 @@ msgstr ""
"викориÑтано у майбутньому. УÑÑ– значеннÑ, [тип], [ідентифікатор] Ñ– "
"[зарезервоване значеннÑ], мають бути коректними Ñ€Ñдками UTF-8."
-#: ../clients/common/settings-docs.h.in:157
+#: ../clients/common/settings-docs.h.in:167
msgid ""
"FALSE if the connection can be modified using the provided settings "
"service's D-Bus interface with the right privileges, or TRUE if the "
@@ -8092,7 +8179,7 @@ msgstr ""
"Ñкщо параметри з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ” придатними лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ, Ñ– Ñ—Ñ… не можна "
"змінювати."
-#: ../clients/common/settings-docs.h.in:158
+#: ../clients/common/settings-docs.h.in:168
msgid ""
"List of connection UUIDs that should be activated when the base connection "
"itself is activated. Currently only VPN connections are supported."
@@ -8100,7 +8187,7 @@ msgstr ""
"СпиÑок UUID з'єднань, Ñкі має бути активовано, Ñкщо активовано базове "
"з'єднаннÑ. У поточній верÑÑ–Ñ— передбачено підтримку лише з'єднань VPN."
-#: ../clients/common/settings-docs.h.in:159
+#: ../clients/common/settings-docs.h.in:169
msgid ""
"Setting name of the device type of this slave's master connection (eg, \"bond"
"\"), or NULL if this connection is not a slave."
@@ -8108,7 +8195,7 @@ msgstr ""
"Ð’Ñтановлює назву типу приÑтрою Ð´Ð»Ñ Ð¾Ñновного з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ підлеглого "
"з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ (наприклад «bond») або NULL, Ñкщо це з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ Ñ” підлеглим."
-#: ../clients/common/settings-docs.h.in:160
+#: ../clients/common/settings-docs.h.in:170
msgid ""
"This represents the identity of the connection used for various purposes. It "
"allows to configure multiple profiles to share the identity. Also, the "
@@ -8174,7 +8261,7 @@ msgstr ""
"алгоритму Ð´Ð»Ñ Â«${CONNECTION}», Ñ– викориÑтано унікальний фікÑований "
"ідентифікатор Ð´Ð»Ñ Ð·'єднаннÑ."
-#: ../clients/common/settings-docs.h.in:161
+#: ../clients/common/settings-docs.h.in:171
msgid ""
"The time, in seconds since the Unix Epoch, that the connection was last "
"_successfully_ fully activated. NetworkManager updates the connection "
@@ -8188,7 +8275,7 @@ msgstr ""
"активного з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ð°Ð¹Ñвіжішої чаÑової позначки. ВлаÑтивіÑÑ‚ÑŒ можна лише "
"читати (зміни до цієї влаÑтивоÑÑ‚Ñ– не зберігатимутьÑÑ)."
-#: ../clients/common/settings-docs.h.in:162
+#: ../clients/common/settings-docs.h.in:172
msgid ""
"Base type of the connection. For hardware-dependent connections, should "
"contain the setting name of the hardware-type specific setting (ie, \"802-3-"
@@ -8202,7 +8289,7 @@ msgstr ""
"з'єднань VPN та інших має міÑтити назву параметра відповідного типу "
"параметрів (тобто «vpn» або «bridge» тощо)."
-#: ../clients/common/settings-docs.h.in:163
+#: ../clients/common/settings-docs.h.in:173
msgid ""
"A universally unique identifier for the connection, for example generated "
"with libuuid. It should be assigned when the connection is created, and "
@@ -8224,7 +8311,7 @@ msgstr ""
"«2815492f-7e56-435e-b2e9-246bd7cdc664» (тобто у форматі запиÑу, Ñкий міÑтить "
"лише шіÑтнадцÑткові цифри Ñ– Ñимволи «-»)."
-#: ../clients/common/settings-docs.h.in:164
+#: ../clients/common/settings-docs.h.in:174
msgid ""
"Timeout in milliseconds to wait for device at startup. During boot, devices "
"may take a while to be detected by the driver. This property will cause to "
@@ -8244,7 +8331,7 @@ msgstr ""
"значеннÑм Ñ” -1, що у поточній верÑÑ–Ñ— означає, що Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° запуÑк "
"приÑтрою не буде."
-#: ../clients/common/settings-docs.h.in:165
+#: ../clients/common/settings-docs.h.in:175
msgid ""
"The trust level of a the connection. Free form case-insensitive string (for "
"example \"Home\", \"Work\", \"Public\"). NULL or unspecified zone means the "
@@ -8258,7 +8345,7 @@ msgstr ""
"брандмауером. Якщо Ñ†Ñ Ð²Ð»Ð°ÑтивіÑÑ‚ÑŒ оновлюєтьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ активованого "
"з'єднаннÑ, зміни набудуть чинноÑÑ‚Ñ– негайно."
-#: ../clients/common/settings-docs.h.in:166
+#: ../clients/common/settings-docs.h.in:176
msgid ""
"Specifies the NMSettingDcbFlags for the DCB FCoE application. Flags may be "
"any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), "
@@ -8268,11 +8355,11 @@ msgstr ""
"будь-Ñка ÐºÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ NM_SETTING_DCB_FLAG_ENABLE (0x1), "
"NM_SETTING_DCB_FLAG_ADVERTISE (0x2) Ñ– NM_SETTING_DCB_FLAG_WILLING (0x4)."
-#: ../clients/common/settings-docs.h.in:167
+#: ../clients/common/settings-docs.h.in:177
msgid "The FCoE controller mode; either \"fabric\" (default) or \"vn2vn\"."
msgstr "Режим контролера FCoE; або «fabric» (типовий), або «vn2vn»."
-#: ../clients/common/settings-docs.h.in:168
+#: ../clients/common/settings-docs.h.in:178
msgid ""
"The highest User Priority (0 - 7) which FCoE frames should use, or -1 for "
"default priority. Only used when the \"app-fcoe-flags\" property includes "
@@ -8283,7 +8370,7 @@ msgstr ""
"лише Ñкщо до влаÑтивоÑÑ‚Ñ– «app-fcoe-flags» включає прапорець "
"NM_SETTING_DCB_FLAG_ENABLE (0x1)."
-#: ../clients/common/settings-docs.h.in:169
+#: ../clients/common/settings-docs.h.in:179
msgid ""
"Specifies the NMSettingDcbFlags for the DCB FIP application. Flags may be "
"any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), "
@@ -8293,7 +8380,7 @@ msgstr ""
"будь-Ñкою комбінацією NM_SETTING_DCB_FLAG_ENABLE (0x1), "
"NM_SETTING_DCB_FLAG_ADVERTISE (0x2) Ñ– NM_SETTING_DCB_FLAG_WILLING (0x4)."
-#: ../clients/common/settings-docs.h.in:170
+#: ../clients/common/settings-docs.h.in:180
msgid ""
"The highest User Priority (0 - 7) which FIP frames should use, or -1 for "
"default priority. Only used when the \"app-fip-flags\" property includes "
@@ -8304,7 +8391,7 @@ msgstr ""
"лише Ñкщо до влаÑтивоÑÑ‚Ñ– «app-fip-flags» включає прапорець "
"NM_SETTING_DCB_FLAG_ENABLE (0x1)."
-#: ../clients/common/settings-docs.h.in:171
+#: ../clients/common/settings-docs.h.in:181
msgid ""
"Specifies the NMSettingDcbFlags for the DCB iSCSI application. Flags may be "
"any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), "
@@ -8314,7 +8401,7 @@ msgstr ""
"будь-Ñкою комбінацією NM_SETTING_DCB_FLAG_ENABLE (0x1), "
"NM_SETTING_DCB_FLAG_ADVERTISE (0x2) Ñ– NM_SETTING_DCB_FLAG_WILLING (0x4)."
-#: ../clients/common/settings-docs.h.in:172
+#: ../clients/common/settings-docs.h.in:182
msgid ""
"The highest User Priority (0 - 7) which iSCSI frames should use, or -1 for "
"default priority. Only used when the \"app-iscsi-flags\" property includes "
@@ -8325,7 +8412,7 @@ msgstr ""
"лише Ñкщо до влаÑтивоÑÑ‚Ñ– «app-iscsi-flags» включає прапорець "
"NM_SETTING_DCB_FLAG_ENABLE (0x1)."
-#: ../clients/common/settings-docs.h.in:173
+#: ../clients/common/settings-docs.h.in:183
msgid ""
"An array of 8 uint values, where the array index corresponds to the User "
"Priority (0 - 7) and the value indicates the percentage of bandwidth of the "
@@ -8339,7 +8426,7 @@ msgstr ""
"може викориÑтовувати. Сума уÑÑ–Ñ… значень у межах однієї групи має Ñкладати "
"100 відÑотків."
-#: ../clients/common/settings-docs.h.in:174
+#: ../clients/common/settings-docs.h.in:184
msgid ""
"An array of 8 boolean values, where the array index corresponds to the User "
"Priority (0 - 7) and the value indicates whether or not the corresponding "
@@ -8349,7 +8436,7 @@ msgstr ""
"кориÑтувача (від 0 до 7), а Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð°Ñ” за те, чи має відповідна "
"пріоритетніÑÑ‚ÑŒ передавати паузу пріоритетноÑÑ‚Ñ–."
-#: ../clients/common/settings-docs.h.in:175
+#: ../clients/common/settings-docs.h.in:185
msgid ""
"Specifies the NMSettingDcbFlags for DCB Priority Flow Control (PFC). Flags "
"may be any combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), "
@@ -8359,7 +8446,7 @@ msgstr ""
"Прапорці можуть бути будь-Ñкою комбінацією NM_SETTING_DCB_FLAG_ENABLE (0x1), "
"NM_SETTING_DCB_FLAG_ADVERTISE (0x2) Ñ– NM_SETTING_DCB_FLAG_WILLING (0x4)."
-#: ../clients/common/settings-docs.h.in:176
+#: ../clients/common/settings-docs.h.in:186
msgid ""
"An array of 8 uint values, where the array index corresponds to the Priority "
"Group ID (0 - 7) and the value indicates the percentage of link bandwidth "
@@ -8371,7 +8458,7 @@ msgstr ""
"каналу з'єднаннÑ, Ñку пов'Ñзано із відповідною групою. ДопуÑтимими Ñ” "
"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ 0 до 100. Сума уÑÑ–Ñ… значень має Ñкладати 100 відÑотків."
-#: ../clients/common/settings-docs.h.in:177
+#: ../clients/common/settings-docs.h.in:187
msgid ""
"Specifies the NMSettingDcbFlags for DCB Priority Groups. Flags may be any "
"combination of NM_SETTING_DCB_FLAG_ENABLE (0x1), "
@@ -8381,7 +8468,7 @@ msgstr ""
"будь-Ñкою комбінацією NM_SETTING_DCB_FLAG_ENABLE (0x1), "
"NM_SETTING_DCB_FLAG_ADVERTISE (0x2) Ñ– NM_SETTING_DCB_FLAG_WILLING (0x4)"
-#: ../clients/common/settings-docs.h.in:178
+#: ../clients/common/settings-docs.h.in:188
msgid ""
"An array of 8 uint values, where the array index corresponds to the User "
"Priority (0 - 7) and the value indicates the Priority Group ID. Allowed "
@@ -8392,7 +8479,7 @@ msgstr ""
"пріоритетноÑÑ‚Ñ–. Дозволеними значеннÑм ідентифікатора групи пріоритетноÑÑ‚Ñ– Ñ” "
"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ 0 до 7 або 15 Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸ без обмежень."
-#: ../clients/common/settings-docs.h.in:179
+#: ../clients/common/settings-docs.h.in:189
msgid ""
"An array of 8 boolean values, where the array index corresponds to the User "
"Priority (0 - 7) and the value indicates whether or not the priority may use "
@@ -8403,7 +8490,7 @@ msgstr ""
"пріоритетніÑÑ‚ÑŒ викориÑтовувати уÑÑŽ ширину каналу, пов'Ñзаного із відповідною "
"групою."
-#: ../clients/common/settings-docs.h.in:180
+#: ../clients/common/settings-docs.h.in:190
msgid ""
"An array of 8 uint values, where the array index corresponds to the User "
"Priority (0 - 7) and the value indicates the traffic class (0 - 7) to which "
@@ -8413,7 +8500,7 @@ msgstr ""
"кориÑтувача (0 - 7), а Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð°Ñ” за ÐºÐ»Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… (від 0 "
"до 7), із Ñким пов'Ñзано пріоритетніÑÑ‚ÑŒ."
-#: ../clients/common/settings-docs.h.in:181
+#: ../clients/common/settings-docs.h.in:191
msgid ""
"The GPRS Access Point Name specifying the APN used when establishing a data "
"session with the GSM-based network. The APN often determines how the user "
@@ -8431,7 +8518,7 @@ msgstr ""
"кориÑтувача важливо викориÑтовувати належну APN. Ðазва APN може ÑкладатиÑÑ "
"лише із Ñимволів a-z, 0-9, . та - за Ñтандартом GSM 03.60, розділ 14.9."
-#: ../clients/common/settings-docs.h.in:182
+#: ../clients/common/settings-docs.h.in:192
msgid ""
"When TRUE, the settings such as APN, username, or password will default to "
"values that match the network the modem will register to in the Mobile "
@@ -8442,7 +8529,7 @@ msgstr ""
"зареєÑтровано модем у бази даних надавачів поÑлуг мобільного широкоÑмугового "
"доÑтупу до інтернету."
-#: ../clients/common/settings-docs.h.in:183
+#: ../clients/common/settings-docs.h.in:193
msgid ""
"The device unique identifier (as given by the WWAN management service) which "
"this connection applies to. If given, the connection will only apply to the "
@@ -8452,7 +8539,7 @@ msgstr ""
"WWAN), до Ñкого заÑтоÑовуєтьÑÑ Ñ†Ðµ з'єднаннÑ. Якщо вказано, з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ "
"заÑтоÑовуватиметьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ приÑтрою."
-#: ../clients/common/settings-docs.h.in:184
+#: ../clients/common/settings-docs.h.in:194
msgid ""
"When TRUE, only connections to the home network will be allowed. Connections "
"to roaming networks will not be made."
@@ -8460,7 +8547,7 @@ msgstr ""
"Якщо має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ TRUE, буде дозволено лише з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· домашньою мережею. "
"З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· мережами роумінґу не виконуватимутьÑÑ."
-#: ../clients/common/settings-docs.h.in:186
+#: ../clients/common/settings-docs.h.in:196
msgid ""
"The Network ID (GSM LAI format, ie MCC-MNC) to force specific network "
"registration. If the Network ID is specified, NetworkManager will attempt "
@@ -8475,7 +8562,7 @@ msgstr ""
"роумінґовою мережею, Ñкщо ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾ÑƒÐ¼Ñ–Ð½Ò‘Ð¾Ð¼ приÑтрою у інший ÑпоÑіб "
"неможливе."
-#: ../clients/common/settings-docs.h.in:187
+#: ../clients/common/settings-docs.h.in:197
msgid ""
"Legacy setting that used to help establishing PPP data sessions for GSM-"
"based modems. Deprecated: 1"
@@ -8483,7 +8570,7 @@ msgstr ""
"ЗаÑтарілий параметр, Ñкий викориÑтовувавÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÐµÐ³ÑˆÐµÐ½Ð½Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ "
"ÑеанÑів обміну даними PPP Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ¼Ñ–Ð² на оÑнові технології GSM. ЗаÑтарілий: 1"
-#: ../clients/common/settings-docs.h.in:190
+#: ../clients/common/settings-docs.h.in:200
msgid ""
"If the SIM is locked with a PIN it must be unlocked before any other "
"operations are requested. Specify the PIN here to allow operation of the "
@@ -8493,7 +8580,7 @@ msgstr ""
"виконувати будь-Ñкі інші дії. Тут Ñлід вказати PIN-код, Ñкий відкриває "
"доÑтуп до дій із приÑтроєм."
-#: ../clients/common/settings-docs.h.in:192
+#: ../clients/common/settings-docs.h.in:202
msgid ""
"The SIM card unique identifier (as given by the WWAN management service) "
"which this connection applies to. If given, the connection will apply to "
@@ -8505,7 +8592,7 @@ msgstr ""
"заÑтоÑовуватиметьÑÑ Ð´Ð¾ будь-Ñкого приÑтрою, Ñкий також дозволено «device-"
"id», де міÑтитьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾ÑÑ‚Ñ– SIM-картки вказаному ідентифікатору."
-#: ../clients/common/settings-docs.h.in:193
+#: ../clients/common/settings-docs.h.in:203
msgid ""
"A MCC/MNC string like \"310260\" or \"21601\" identifying the specific "
"mobile network operator which this connection applies to. If given, the "
@@ -8518,7 +8605,7 @@ msgstr ""
"влаÑтивоÑÑ‚Ñми «device-id» Ñ– «sim-id» Ñ– Ñкий міÑтить SIM-картку, Ñку випущено "
"вказаним оператором."
-#: ../clients/common/settings-docs.h.in:195
+#: ../clients/common/settings-docs.h.in:205
msgid ""
"If specified, this connection will only apply to the IPoIB device whose "
"permanent MAC address matches. This property does not change the MAC address "
@@ -8528,7 +8615,7 @@ msgstr ""
"відповідною Ñталою адреÑою MAC. Ð¦Ñ Ð²Ð»Ð°ÑтивіÑÑ‚ÑŒ не змінює MAC-адреÑи приÑтрою "
"(таку зміну називають підміною MAC)."
-#: ../clients/common/settings-docs.h.in:197
+#: ../clients/common/settings-docs.h.in:207
msgid ""
"The InfiniBand P_Key to use for this device. A value of -1 means to use the "
"default P_Key (aka \"the P_Key at index 0\"). Otherwise it is a 16-bit "
@@ -8539,7 +8626,7 @@ msgstr ""
"Інші Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ” бути вказано у форматі 16-бітового цілого чиÑла без знаку, "
"Ñтарший біт Ñкого дорівнює одиниці, Ñкщо P_Key Ñ” ключем «повного членÑтва»."
-#: ../clients/common/settings-docs.h.in:198
+#: ../clients/common/settings-docs.h.in:208
msgid ""
"The interface name of the parent device of this device. Normally NULL, but "
"if the \"p_key\" property is set, then you must specify the base device by "
@@ -8550,14 +8637,14 @@ msgstr ""
"вказати базовий приÑтрій або вÑтановленнÑм Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— влаÑтивоÑÑ‚Ñ–, "
"або вÑтановленнÑм Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ– «mac-address»."
-#: ../clients/common/settings-docs.h.in:199
+#: ../clients/common/settings-docs.h.in:209
msgid ""
"The IP-over-InfiniBand transport mode. Either \"datagram\" or \"connected\"."
msgstr ""
"Режим Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ IP-over-InfiniBand. Можливі значеннÑ: «datagram» або "
"«connected»."
-#: ../clients/common/settings-docs.h.in:200
+#: ../clients/common/settings-docs.h.in:210
msgid ""
"How many additional levels of encapsulation are permitted to be prepended to "
"packets. This property applies only to IPv6 tunnels."
@@ -8565,7 +8652,7 @@ msgstr ""
"КількіÑÑ‚ÑŒ додаткових рівнів вкладеноÑÑ‚Ñ–, Ñкі дозволено допиÑувати до "
"пакетів. Цю влаÑтивіÑÑ‚ÑŒ ÑтоÑуєтьÑÑ Ð»Ð¸ÑˆÐµ тунелів IPv6."
-#: ../clients/common/settings-docs.h.in:201
+#: ../clients/common/settings-docs.h.in:211
msgid ""
"Tunnel flags. Currently the following values are supported: "
"NM_IP_TUNNEL_FLAG_IP6_IGN_ENCAP_LIMIT (0x1), "
@@ -8583,14 +8670,14 @@ msgstr ""
"(0x10), NM_IP_TUNNEL_FLAG_IP6_USE_ORIG_FWMARK (0x20). Ці Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ” "
"коректними лише Ð´Ð»Ñ Ñ‚ÑƒÐ½ÐµÐ»Ñ–Ð² IPv6."
-#: ../clients/common/settings-docs.h.in:202
+#: ../clients/common/settings-docs.h.in:212
msgid ""
"The flow label to assign to tunnel packets. This property applies only to "
"IPv6 tunnels."
msgstr ""
"Мітка потоку Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑ‚Ñ–Ð² тунелю. Ð¦Ñ Ð²Ð»Ð°ÑтивіÑÑ‚ÑŒ ÑтоÑуєтьÑÑ Ð»Ð¸ÑˆÐµ тунелів IPv6."
-#: ../clients/common/settings-docs.h.in:203
+#: ../clients/common/settings-docs.h.in:213
msgid ""
"The key used for tunnel input packets; the property is valid only for "
"certain tunnel modes (GRE, IP6GRE). If empty, no key is used."
@@ -8599,7 +8686,7 @@ msgstr ""
"лише Ð´Ð»Ñ Ð¿ÐµÐ²Ð½Ð¸Ñ… режимів роботи тунелю (GRE, IP6GRE). Якщо порожній, ключ не "
"викориÑтовуєтьÑÑ."
-#: ../clients/common/settings-docs.h.in:204
+#: ../clients/common/settings-docs.h.in:214
msgid ""
"The local endpoint of the tunnel; the value can be empty, otherwise it must "
"contain an IPv4 or IPv6 address."
@@ -8607,7 +8694,7 @@ msgstr ""
"Локальна кінцева точка тунелю; Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути порожнім або має міÑтити "
"адреÑу IPv4 або IPv6."
-#: ../clients/common/settings-docs.h.in:205
+#: ../clients/common/settings-docs.h.in:215
msgid ""
"The tunneling mode, for example NM_IP_TUNNEL_MODE_IPIP (1) or "
"NM_IP_TUNNEL_MODE_GRE (2)."
@@ -8615,7 +8702,7 @@ msgstr ""
"Режим тунелюваннÑ, наприклад NM_IP_TUNNEL_MODE_IPIP (1) або "
"NM_IP_TUNNEL_MODE_GRE (2)."
-#: ../clients/common/settings-docs.h.in:206
+#: ../clients/common/settings-docs.h.in:216
msgid ""
"If non-zero, only transmit packets of the specified size or smaller, "
"breaking larger packets up into multiple fragments."
@@ -8623,7 +8710,7 @@ msgstr ""
"Якщо має ненульове значеннÑ, передавати пакети лише вказаного або меншого "
"розміру, розбиваючи великі пакети на декілька фрагментів."
-#: ../clients/common/settings-docs.h.in:207
+#: ../clients/common/settings-docs.h.in:217
msgid ""
"The key used for tunnel output packets; the property is valid only for "
"certain tunnel modes (GRE, IP6GRE). If empty, no key is used."
@@ -8632,7 +8719,7 @@ msgstr ""
"чинною лише Ð´Ð»Ñ Ð¿ÐµÐ²Ð½Ð¸Ñ… режимів роботи тунелю (GRE, IP6GRE). Якщо порожній, "
"ключ не викориÑтовуєтьÑÑ."
-#: ../clients/common/settings-docs.h.in:208
+#: ../clients/common/settings-docs.h.in:218
msgid ""
"If given, specifies the parent interface name or parent connection UUID the "
"new device will be bound to so that tunneled packets will only be routed via "
@@ -8642,18 +8729,18 @@ msgstr ""
"з'єднаннÑ, до Ñкого буде прив'Ñзано новий приÑтрій так, що тунельовані "
"пакети маршрутизуватимутьÑÑ Ð»Ð¸ÑˆÐµ крізь цей інтерфейÑ."
-#: ../clients/common/settings-docs.h.in:209
+#: ../clients/common/settings-docs.h.in:219
msgid "Whether to enable Path MTU Discovery on this tunnel."
msgstr "Визначає, чи Ñлід вмикати Path MTU Discovery Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ тунелю."
-#: ../clients/common/settings-docs.h.in:210
+#: ../clients/common/settings-docs.h.in:220
msgid ""
"The remote endpoint of the tunnel; the value must contain an IPv4 or IPv6 "
"address."
msgstr ""
"Віддалена кінцева точка тунелю; Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ” міÑтити адреÑу IPv4 або IPv6."
-#: ../clients/common/settings-docs.h.in:211
+#: ../clients/common/settings-docs.h.in:221
msgid ""
"The type of service (IPv4) or traffic class (IPv6) field to be set on "
"tunneled packets."
@@ -8661,7 +8748,7 @@ msgstr ""
"Поле типу Ñлужби (IPv4) або клаÑу Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… (IPv6), Ñке Ñлід "
"вÑтановити Ð´Ð»Ñ Ñ‚ÑƒÐ½ÐµÐ»ÑŒÐ¾Ð²Ð°Ð½Ð¸Ñ… пакетів."
-#: ../clients/common/settings-docs.h.in:212
+#: ../clients/common/settings-docs.h.in:222
msgid ""
"The TTL to assign to tunneled packets. 0 is a special value meaning that "
"packets inherit the TTL value."
@@ -8669,13 +8756,13 @@ msgstr ""
"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ TTL, Ñке Ñлід призначити Ð´Ð»Ñ Ñ‚ÑƒÐ½ÐµÐ»ÑŒÐ¾Ð²Ð°Ð½Ð¸Ñ… пакетів. 0 — Ñпеціальне "
"значеннÑ, Ñке означає, що пакети уÑпадковують Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ TTL."
-#: ../clients/common/settings-docs.h.in:213
-#: ../clients/common/settings-docs.h.in:236
+#: ../clients/common/settings-docs.h.in:223
+#: ../clients/common/settings-docs.h.in:246
msgid "Array of IP addresses."
msgstr "МаÑив IP-адреÑ."
-#: ../clients/common/settings-docs.h.in:214
-#: ../clients/common/settings-docs.h.in:237
+#: ../clients/common/settings-docs.h.in:224
+#: ../clients/common/settings-docs.h.in:247
msgid ""
"Timeout in milliseconds used to check for the presence of duplicate IP "
"addresses on the network. If an address conflict is detected, the "
@@ -8692,7 +8779,7 @@ msgstr ""
"перевищує нуль, вважатиметьÑÑ Ñ‡Ð°Ñом Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ міліÑекундах. Цю "
"влаÑтивіÑÑ‚ÑŒ у поточній верÑÑ–Ñ— реалізовано лише Ð´Ð»Ñ IPv4."
-#: ../clients/common/settings-docs.h.in:215
+#: ../clients/common/settings-docs.h.in:225
msgid ""
"A string sent to the DHCP server to identify the local machine which the "
"DHCP server may use to customize the DHCP lease and options. When the "
@@ -8736,7 +8823,7 @@ msgstr ""
"налаштоване значеннÑ. Якщо Ñ– це Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ налаштовано, типове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "
"залежатиме від додатка DHCP."
-#: ../clients/common/settings-docs.h.in:216
+#: ../clients/common/settings-docs.h.in:226
msgid ""
"If the \"dhcp-send-hostname\" property is TRUE, then the specified FQDN will "
"be sent to the DHCP server when acquiring a lease. This property and \"dhcp-"
@@ -8746,8 +8833,8 @@ msgstr ""
"адреÑи до Ñервера DHCP буде надіÑлано вказану FDQN. Цю влаÑтивіÑÑ‚ÑŒ не можна "
"викориÑтовувати разом із влаÑтивіÑÑ‚ÑŽ «dhcp-hostname»."
-#: ../clients/common/settings-docs.h.in:217
-#: ../clients/common/settings-docs.h.in:239
+#: ../clients/common/settings-docs.h.in:227
+#: ../clients/common/settings-docs.h.in:249
msgid ""
"If the \"dhcp-send-hostname\" property is TRUE, then the specified name will "
"be sent to the DHCP server when acquiring a lease. This property and \"dhcp-"
@@ -8757,8 +8844,8 @@ msgstr ""
"адреÑи до Ñервера DHCP буде надіÑлано вказану назву. Цю влаÑтивіÑÑ‚ÑŒ не можна "
"викориÑтовувати разом із влаÑтивіÑÑ‚ÑŽ «dhcp-fqdn»."
-#: ../clients/common/settings-docs.h.in:218
-#: ../clients/common/settings-docs.h.in:240
+#: ../clients/common/settings-docs.h.in:228
+#: ../clients/common/settings-docs.h.in:250
msgid ""
"Flags for the DHCP hostname and FQDN. Currently this property only includes "
"flags to control the FQDN flags set in the DHCP FQDN option. Supported FQDN "
@@ -8795,8 +8882,8 @@ msgstr ""
"NM_DHCP_HOSTNAME_FLAG_NONE (0x0), у запитах DHCP надÑилатимутьÑÑ Ñтандартні "
"прапорці FQDN, опиÑані вище."
-#: ../clients/common/settings-docs.h.in:219
-#: ../clients/common/settings-docs.h.in:241
+#: ../clients/common/settings-docs.h.in:229
+#: ../clients/common/settings-docs.h.in:251
msgid ""
"A string containing the \"Identity Association Identifier\" (IAID) used by "
"the DHCP client. The property is a 32-bit decimal value or a special value "
@@ -8825,8 +8912,8 @@ msgstr ""
"буде проігноровано у dhclient, Ñкий завжди визначає IAID на оÑнові MAC-"
"адреÑи."
-#: ../clients/common/settings-docs.h.in:220
-#: ../clients/common/settings-docs.h.in:242
+#: ../clients/common/settings-docs.h.in:230
+#: ../clients/common/settings-docs.h.in:252
msgid ""
"If TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some "
"DHCP servers use this hostname to update DNS databases, essentially "
@@ -8841,8 +8928,8 @@ msgstr ""
"влаÑтивоÑÑ‚Ñ– вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ TRUE, буде надіÑлано поточну Ñтану назву вузла "
"комп'ютера."
-#: ../clients/common/settings-docs.h.in:221
-#: ../clients/common/settings-docs.h.in:243
+#: ../clients/common/settings-docs.h.in:231
+#: ../clients/common/settings-docs.h.in:253
msgid ""
"A timeout for a DHCP transaction in seconds. If zero (the default), a "
"globally configured default is used. If still unspecified, a device specific "
@@ -8856,25 +8943,38 @@ msgstr ""
"Ñекунд). Ð’Ñтановіть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 2147483647 (MAXINT32), Ñкщо Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” "
"бути необмеженим."
-#: ../clients/common/settings-docs.h.in:222
-#: ../clients/common/settings-docs.h.in:244
+#: ../clients/common/settings-docs.h.in:232
+#: ../clients/common/settings-docs.h.in:254
msgid "Array of IP addresses of DNS servers."
msgstr "МаÑив IP-Ð°Ð´Ñ€ÐµÑ Ñерверів DNS."
-#: ../clients/common/settings-docs.h.in:223
-#: ../clients/common/settings-docs.h.in:245
+#: ../clients/common/settings-docs.h.in:233
+#: ../clients/common/settings-docs.h.in:255
msgid ""
"Array of DNS options as described in man 5 resolv.conf. NULL means that the "
"options are unset and left at the default. In this case NetworkManager will "
-"use default options. This is distinct from an empty list of properties."
-msgstr ""
-"МаÑив параметрів DNS, опиÑаний на Ñторінці підручника (man) resolv.conf. "
-"NULL означає, що параметри не вÑтановлено, визначено типові значеннÑ. У "
-"такому випадку NetworkManager викориÑтовуватиме типові параметри. Якщо ж "
-"буде вказано порожній ÑпиÑок влаÑтивоÑтей, поведінка програми буде інакшою."
+"use default options. This is distinct from an empty list of properties. The "
+"currently supported options are \"attempts\", \"debug\", \"edns0\", "
+"\"inet6\", \"ip6-bytestring\", \"ip6-dotint\", \"ndots\", \"no-check-names"
+"\", \"no-ip6-dotint\", \"no-reload\", \"no-tld-query\", \"rotate\", \"single-"
+"request\", \"single-request-reopen\", \"timeout\", \"trust-ad\", \"use-vc\". "
+"The \"trust-ad\" setting is only honored if the profile contributes name "
+"servers to resolv.conf, and if all contributing profiles have \"trust-ad\" "
+"enabled."
+msgstr ""
+"МаÑив параметрів DNS, Ñкий опиÑано на Ñторінці підручника (man 5) resolv."
+"conf. NULL означає, що параметри не вÑтановлено Ñ– NetworkManager Ñлід "
+"викориÑтовувати типове значеннÑ. Варіант з NULL не Ñ” тим Ñамим, що "
+"Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ€Ð¾Ð¶Ð½ÑŒÐ¾Ð³Ð¾ ÑпиÑку влаÑтивоÑтей. У поточній верÑÑ–Ñ— передбачено "
+"підтримку варіантів значень «attempts», «debug», «edns0», «inet6», «ip6-"
+"bytestring», «ip6-dotint», «ndots», «no-check-names», «no-ip6-dotint», «no-"
+"reload», «no-tld-query», «rotate», «single-request», «single-request-"
+"reopen», «timeout», «trust-ad», «use-vc». Варіант «trust-ad» буде взÑто до "
+"уваги, лише Ñкщо профіль вказує Ñервери назв у resolv.conf Ñ– Ð´Ð»Ñ Ð²ÑÑ–Ñ… "
+"відповідних профілів увімкнено «trust-ad»."
-#: ../clients/common/settings-docs.h.in:224
-#: ../clients/common/settings-docs.h.in:246
+#: ../clients/common/settings-docs.h.in:234
+#: ../clients/common/settings-docs.h.in:256
msgid ""
"DNS servers priority. The relative priority for DNS servers specified by "
"this setting. A lower value is better (higher priority). Zero selects a "
@@ -8930,8 +9030,8 @@ msgstr ""
"домен, Ñкий Ñ” піддоменом іншого домену із від'ємним значеннÑм пріоритетноÑÑ‚Ñ– "
"DNS, цей піддомен буде проігноровано."
-#: ../clients/common/settings-docs.h.in:225
-#: ../clients/common/settings-docs.h.in:247
+#: ../clients/common/settings-docs.h.in:235
+#: ../clients/common/settings-docs.h.in:257
msgid ""
"Array of DNS search domains. Domains starting with a tilde ('~') are "
"considered 'routing' domains and are used only to decide the interface over "
@@ -8943,17 +9043,25 @@ msgstr ""
"Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу, крізь Ñкий Ñлід ÑпрÑмовувати запит; такі запиÑи не "
"викориÑтовуватимутьÑÑ Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð½ÐµÐ¿Ð¾Ð²Ð½Ð¸Ñ… назв вузлів."
-#: ../clients/common/settings-docs.h.in:226
-#: ../clients/common/settings-docs.h.in:248
+#: ../clients/common/settings-docs.h.in:236
+#: ../clients/common/settings-docs.h.in:258
msgid ""
"The gateway associated with this configuration. This is only meaningful if "
-"\"addresses\" is also set."
-msgstr ""
-"Шлюз, Ñкий пов'Ñзано із цими налаштуваннÑми. Має значеннÑ, лише Ñкщо "
-"вÑтановлено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«addresses»."
+"\"addresses\" is also set. The gateway's main purpose is to control the next "
+"hop of the standard default route on the device. Hence, the gateway property "
+"conflicts with \"never-default\" and will be automatically dropped if the IP "
+"configuration is set to never-default. As an alternative to set the gateway, "
+"configure a static default route with /0 as prefix length."
+msgstr ""
+"Шлюз, Ñкий пов'Ñзано із цими налаштуваннÑми. Має значеннÑ, лише Ñкщо вказано "
+"«addresses». ОÑновним призначеннÑм шлюзу Ñ” ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ñтупним переходом у "
+"Ñтандартному типовому маршруті на приÑтрої. Отже, влаÑтивіÑÑ‚ÑŒ шлюз "
+"конфліктує із «never-default» — Ñ—Ñ— буде автоматично відкинуто, Ñкщо Ð´Ð»Ñ "
+"налаштувань IP вказано never-default. Ðльтернативою вÑтановленню шлюзу Ñ” "
+"Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñтатичного типового маршруту з довжиною префікÑа /0."
-#: ../clients/common/settings-docs.h.in:227
-#: ../clients/common/settings-docs.h.in:249
+#: ../clients/common/settings-docs.h.in:237
+#: ../clients/common/settings-docs.h.in:259
msgid ""
"When \"method\" is set to \"auto\" and this property to TRUE, automatically "
"configured nameservers and search domains are ignored and only nameservers "
@@ -8966,8 +9074,8 @@ msgstr ""
"пошуку, вказані за допомогою влаÑтивоÑтей «dns» Ñ– «dns-search», Ñкщо буде "
"вказано ÑкіÑÑŒ запиÑи Ñерверів Ñ– доменів Ð´Ð»Ñ Ñ†Ð¸Ñ… влаÑтивоÑтей."
-#: ../clients/common/settings-docs.h.in:228
-#: ../clients/common/settings-docs.h.in:250
+#: ../clients/common/settings-docs.h.in:238
+#: ../clients/common/settings-docs.h.in:260
msgid ""
"When \"method\" is set to \"auto\" and this property to TRUE, automatically "
"configured routes are ignored and only routes specified in the \"routes\" "
@@ -8978,8 +9086,8 @@ msgstr ""
"викориÑтовуватимутьÑÑ Ð»Ð¸ÑˆÐµ маршрути, вказані за допомогою влаÑтивоÑÑ‚Ñ– "
"«routes», Ñкщо такі Ñ–Ñнують."
-#: ../clients/common/settings-docs.h.in:229
-#: ../clients/common/settings-docs.h.in:252
+#: ../clients/common/settings-docs.h.in:239
+#: ../clients/common/settings-docs.h.in:262
msgid ""
"If TRUE, allow overall network configuration to proceed even if the "
"configuration specified by this property times out. Note that at least one "
@@ -8996,8 +9104,8 @@ msgstr ""
"NMSettingIP4Config уможливлює уÑпішне Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ ÑƒÑієї мережі, Ñкщо не "
"вдаєтьÑÑ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ñ‚Ð¸ IPv4, але IPv6 налаштовано уÑпішно."
-#: ../clients/common/settings-docs.h.in:230
-#: ../clients/common/settings-docs.h.in:253
+#: ../clients/common/settings-docs.h.in:240
+#: ../clients/common/settings-docs.h.in:263
msgid ""
"IP configuration method. NMSettingIP4Config and NMSettingIP6Config both "
"support \"disabled\", \"auto\", \"manual\", and \"link-local\". See the "
@@ -9026,8 +9134,8 @@ msgstr ""
"налаштовано на інтерфейÑÑ–, Ñкий надає Ñпільний доÑтуп до інтернету Ð´Ð»Ñ "
"підмережі, а не на з'єднанні, Ñке надаєтьÑÑ Ñƒ Ñпільний доÑтуп."
-#: ../clients/common/settings-docs.h.in:231
-#: ../clients/common/settings-docs.h.in:254
+#: ../clients/common/settings-docs.h.in:241
+#: ../clients/common/settings-docs.h.in:264
msgid ""
"If TRUE, this connection will never be the default connection for this IP "
"type, meaning it will never be assigned the default route by NetworkManager."
@@ -9036,8 +9144,8 @@ msgstr ""
"IP, що означає, що його ніколи не буде пов'Ñзано із типовим маршрутом у "
"NetworkManager."
-#: ../clients/common/settings-docs.h.in:232
-#: ../clients/common/settings-docs.h.in:256
+#: ../clients/common/settings-docs.h.in:242
+#: ../clients/common/settings-docs.h.in:266
msgid ""
"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 "
@@ -9057,8 +9165,8 @@ msgstr ""
"наÑправді означає, що вÑтановлено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 1024. Ð”Ð»Ñ IPv4 нуль Ñ” звичайним "
"значеннÑм Ð´Ð»Ñ Ð¼ÐµÑ‚Ñ€Ð¸ÐºÐ¸."
-#: ../clients/common/settings-docs.h.in:233
-#: ../clients/common/settings-docs.h.in:257
+#: ../clients/common/settings-docs.h.in:243
+#: ../clients/common/settings-docs.h.in:267
msgid ""
"Enable policy routing (source routing) and set the routing table used when "
"adding routes. This affects all routes, including device-routes, IPv4LL, "
@@ -9090,12 +9198,12 @@ msgstr ""
"таблиці. Так зроблено, щоб зберегти зворотну ÑуміÑніÑÑ‚ÑŒ Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів, "
"Ñкі змінюють таблиці маршрутизації з-поза меж NetworkManager."
-#: ../clients/common/settings-docs.h.in:234
-#: ../clients/common/settings-docs.h.in:258
+#: ../clients/common/settings-docs.h.in:244
+#: ../clients/common/settings-docs.h.in:268
msgid "Array of IP routes."
msgstr "МаÑив IP-маршрутів."
-#: ../clients/common/settings-docs.h.in:235
+#: ../clients/common/settings-docs.h.in:245
msgid ""
"Configure method for creating the address for use with RFC4862 IPv6 "
"Stateless Address Autoconfiguration. The permitted values are: "
@@ -9136,7 +9244,7 @@ msgstr ""
"конфіденційноÑÑ‚Ñ–, Ñкі налаштовуютьÑÑ Ð²Ð»Ð°ÑтивіÑÑ‚ÑŽ «ip6-privacy», Ñ– не впливає "
"на тимчаÑові адреÑи, Ñкі налаштовано за допомогою відповідної влаÑтивоÑÑ‚Ñ–."
-#: ../clients/common/settings-docs.h.in:238
+#: ../clients/common/settings-docs.h.in:248
msgid ""
"A string containing the DHCPv6 Unique Identifier (DUID) used by the dhcp "
"client to identify itself to DHCPv6 servers (RFC 3315). The DUID is carried "
@@ -9193,7 +9301,7 @@ msgstr ""
"викориÑтано загальне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Â«ipv6.dhcp-duid». Якщо загальне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "
"не вказано, буде викориÑтано типове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«lease»."
-#: ../clients/common/settings-docs.h.in:251
+#: ../clients/common/settings-docs.h.in:261
msgid ""
"Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If "
"enabled, it makes the kernel generate a temporary IPv6 address in addition "
@@ -9224,7 +9332,7 @@ msgstr ""
"увімкнено за допомогою параметра «stable-privacy» влаÑтивоÑÑ‚Ñ– «addr-gen-"
"mode», Ñк інший ÑпоÑіб уникнути ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð° вузлом за допомогою Ð°Ð´Ñ€ÐµÑ IPv6."
-#: ../clients/common/settings-docs.h.in:255
+#: ../clients/common/settings-docs.h.in:265
msgid ""
"A timeout for waiting Router Advertisements in seconds. If zero (the "
"default), a globally configured default is used. If still unspecified, the "
@@ -9237,7 +9345,7 @@ msgstr ""
"залежатиме від параметрів sysctl приÑтрою. Ð’Ñтановіть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 2147483647 "
"(MAXINT32), Ñкщо Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” бути необмеженим."
-#: ../clients/common/settings-docs.h.in:259
+#: ../clients/common/settings-docs.h.in:269
msgid ""
"Configure the token for draft-chown-6man-tokenised-ipv6-identifiers-02 IPv6 "
"tokenized interface identifiers. Useful with eui64 addr-gen-mode."
@@ -9246,22 +9354,22 @@ msgstr ""
"chown-6man-tokenised-ipv6-identifiers-02. КориÑне у поєднанні зі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "
"addr-gen-mode eui64."
-#: ../clients/common/settings-docs.h.in:260
+#: ../clients/common/settings-docs.h.in:270
msgid "Whether the transmitted traffic must be encrypted."
msgstr "Визначає, чи Ñлід шифрувати дані, Ñкі передаютьÑÑ."
-#: ../clients/common/settings-docs.h.in:261
+#: ../clients/common/settings-docs.h.in:271
msgid ""
"The pre-shared CAK (Connectivity Association Key) for MACsec Key Agreement."
msgstr ""
"Попереднього поширений CAK (ключ прив'Ñзки з'єднань) Ð´Ð»Ñ ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ñ–Ð² "
"MACsec."
-#: ../clients/common/settings-docs.h.in:262
+#: ../clients/common/settings-docs.h.in:272
msgid "Flags indicating how to handle the \"mka-cak\" property."
msgstr "Прапорці, Ñкі позначають, Ñк оброблÑти влаÑтивіÑÑ‚ÑŒ «mka-cak»."
-#: ../clients/common/settings-docs.h.in:263
+#: ../clients/common/settings-docs.h.in:273
msgid ""
"The pre-shared CKN (Connectivity-association Key Name) for MACsec Key "
"Agreement."
@@ -9269,7 +9377,7 @@ msgstr ""
"Попереднього поширена CKN (назва ключа ключ прив'Ñзки з'єднань) Ð´Ð»Ñ "
"ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ñ–Ð² MACsec."
-#: ../clients/common/settings-docs.h.in:264
+#: ../clients/common/settings-docs.h.in:274
msgid ""
"Specifies how the CAK (Connectivity Association Key) for MKA (MACsec Key "
"Agreement) is obtained."
@@ -9277,7 +9385,7 @@ msgstr ""
"Визначає ÑпоÑіб Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ CAK (ключа прив'Ñзки з'єднань) Ð´Ð»Ñ MKA (ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ "
"ключів MACsec)."
-#: ../clients/common/settings-docs.h.in:265
+#: ../clients/common/settings-docs.h.in:275
msgid ""
"If given, specifies the parent interface name or parent connection UUID from "
"which this MACSEC interface should be created. If this property is not "
@@ -9289,7 +9397,7 @@ msgstr ""
"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— влаÑтивоÑÑ‚Ñ– не вказано, Ð·Ð°Ð¿Ð¸Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” міÑтити "
"параметр «802-3-ethernet» із влаÑтивіÑÑ‚ÑŽ «mac-address»."
-#: ../clients/common/settings-docs.h.in:266
+#: ../clients/common/settings-docs.h.in:276
msgid ""
"The port component of the SCI (Secure Channel Identifier), between 1 and "
"65534."
@@ -9297,17 +9405,17 @@ msgstr ""
"Компонент порту SCI (ідентифікатора безпечного каналу), Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ 1 до "
"65534."
-#: ../clients/common/settings-docs.h.in:267
+#: ../clients/common/settings-docs.h.in:277
msgid ""
"Specifies whether the SCI (Secure Channel Identifier) is included in every "
"packet."
msgstr "Вказує, чи включено SCI (Secure Channel Identifier) до кожного пакета."
-#: ../clients/common/settings-docs.h.in:268
+#: ../clients/common/settings-docs.h.in:278
msgid "Specifies the validation mode for incoming frames."
msgstr "Визначає режим перевірки Ð´Ð»Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… кадрів."
-#: ../clients/common/settings-docs.h.in:269
+#: ../clients/common/settings-docs.h.in:279
msgid ""
"The macvlan mode, which specifies the communication mechanism between "
"multiple macvlans on the same lower device."
@@ -9315,7 +9423,7 @@ msgstr ""
"Режим macvlan, Ñкий визначає механізм обміну даними між декількома macvlan "
"на одному приÑтрої нижнього рівнÑ."
-#: ../clients/common/settings-docs.h.in:270
+#: ../clients/common/settings-docs.h.in:280
msgid ""
"If given, specifies the parent interface name or parent connection UUID from "
"which this MAC-VLAN interface should be created. If this property is not "
@@ -9327,15 +9435,15 @@ msgstr ""
"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— влаÑтивоÑÑ‚Ñ– не вказано, Ð·Ð°Ð¿Ð¸Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” міÑтити "
"параметр «802-3-ethernet» із влаÑтивіÑÑ‚ÑŽ «mac-address»."
-#: ../clients/common/settings-docs.h.in:271
+#: ../clients/common/settings-docs.h.in:281
msgid "Whether the interface should be put in promiscuous mode."
msgstr "Визначає, чи Ñлід переводити Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñƒ нерозбірливий режим."
-#: ../clients/common/settings-docs.h.in:272
+#: ../clients/common/settings-docs.h.in:282
msgid "Whether the interface should be a MACVTAP."
msgstr "Визначає, чи має бути Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñом MACVTAP."
-#: ../clients/common/settings-docs.h.in:273
+#: ../clients/common/settings-docs.h.in:283
msgid ""
"A list of interface names to match. Each element is a shell wildcard "
"pattern. When an element is prefixed with exclamation mark (!) the "
@@ -9352,35 +9460,35 @@ msgstr ""
"елементів немає; (b) не вÑтановлено відповідноÑÑ‚Ñ– жодному з елементів із "
"префікÑом «!»."
-#: ../clients/common/settings-docs.h.in:274
+#: ../clients/common/settings-docs.h.in:284
msgid "The data path type. One of \"system\", \"netdev\" or empty."
msgstr ""
"Тип шлÑху до даних. Одне з таких значень: «system», «netdev» або порожнє "
"значеннÑ."
-#: ../clients/common/settings-docs.h.in:275
+#: ../clients/common/settings-docs.h.in:285
msgid "The bridge failure mode. One of \"secure\", \"standalone\" or empty."
msgstr ""
"Режим відмови міÑтка. Одне з таких значень: «secure», «standalone» або "
"порожнє значеннÑ."
-#: ../clients/common/settings-docs.h.in:276
+#: ../clients/common/settings-docs.h.in:286
msgid "Enable or disable multicast snooping."
msgstr "Увімкнути або вимкнути переÑтавлÑÐ½Ð½Ñ ÑƒÐ½Ñ–Ð²ÐµÑ€Ñальної транÑлÑції."
-#: ../clients/common/settings-docs.h.in:277
+#: ../clients/common/settings-docs.h.in:287
msgid "Enable or disable RSTP."
msgstr "Увімкнути або вимкнути RSTP."
-#: ../clients/common/settings-docs.h.in:278
+#: ../clients/common/settings-docs.h.in:288
msgid "Enable or disable STP."
msgstr "Увімкнути або вимкнути STP."
-#: ../clients/common/settings-docs.h.in:279
+#: ../clients/common/settings-docs.h.in:289
msgid "Open vSwitch DPDK device arguments."
msgstr "Параметри приÑтрою Open vSwitch DPDK."
-#: ../clients/common/settings-docs.h.in:280
+#: ../clients/common/settings-docs.h.in:290
msgid ""
"The interface type. Either \"internal\", \"system\", \"patch\", \"dpdk\", or "
"empty."
@@ -9388,7 +9496,7 @@ msgstr ""
"Тип інтерфейÑу. РÑдок «internal», «system», «patch», «dpdk» або порожній "
"Ñ€Ñдок."
-#: ../clients/common/settings-docs.h.in:281
+#: ../clients/common/settings-docs.h.in:291
msgid ""
"Specifies the unicast destination IP address of a remote Open vSwitch bridge "
"port to connect to."
@@ -9396,30 +9504,30 @@ msgstr ""
"Визначає IP-адреÑу одноÑпрÑмованої транÑлÑції, з Ñкою Ñлід з'єднувати порт "
"міÑтка Open vSwitch."
-#: ../clients/common/settings-docs.h.in:282
+#: ../clients/common/settings-docs.h.in:292
msgid "The time port must be inactive in order to be considered down."
msgstr "Щоб вважатиÑÑ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¸Ð¼, порт чаÑу має бути неактивним."
-#: ../clients/common/settings-docs.h.in:283
+#: ../clients/common/settings-docs.h.in:293
msgid ""
"Bonding mode. One of \"active-backup\", \"balance-slb\", or \"balance-tcp\"."
msgstr ""
"Режим прив'ÑзуваннÑ. Одне з таких значень: «active-backup», «balance-slb» "
"або «balance-tcp»."
-#: ../clients/common/settings-docs.h.in:284
+#: ../clients/common/settings-docs.h.in:294
msgid "The time port must be active before it starts forwarding traffic."
msgstr "Щоб почати переÑпрÑмовувати дані, Ñлід активувати порт чаÑу."
-#: ../clients/common/settings-docs.h.in:285
+#: ../clients/common/settings-docs.h.in:295
msgid "LACP mode. One of \"active\", \"off\", or \"passive\"."
msgstr "Режим LACP. Одне з таких значень: «active», «off» або «passive»."
-#: ../clients/common/settings-docs.h.in:286
+#: ../clients/common/settings-docs.h.in:296
msgid "The VLAN tag in the range 0-4095."
msgstr "Теґ VLAN у діапазоні від 0 до 4095."
-#: ../clients/common/settings-docs.h.in:287
+#: ../clients/common/settings-docs.h.in:297
msgid ""
"The VLAN mode. One of \"access\", \"native-tagged\", \"native-untagged\", "
"\"trunk\" or unset."
@@ -9427,7 +9535,7 @@ msgstr ""
"Режим VLAN. Одне з таких значень: «access», «native-tagged», «native-"
"untagged», «trunk» або порожнє значеннÑ."
-#: ../clients/common/settings-docs.h.in:288
+#: ../clients/common/settings-docs.h.in:298
msgid ""
"If non-zero, instruct pppd to set the serial port to the specified "
"baudrate. This value should normally be left as 0 to automatically choose "
@@ -9437,7 +9545,7 @@ msgstr ""
"вказану швидкіÑÑ‚ÑŒ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… у бодах. Зазвичай, Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— влаÑтивоÑÑ‚Ñ– "
"Ñлід залишити нульове значеннÑ, щоб швидкіÑÑ‚ÑŒ було вибрано автоматично."
-#: ../clients/common/settings-docs.h.in:289
+#: ../clients/common/settings-docs.h.in:299
msgid ""
"If TRUE, specify that pppd should set the serial port to use hardware flow "
"control with RTS and CTS signals. This value should normally be set to "
@@ -9447,7 +9555,7 @@ msgstr ""
"ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð¼ апаратних даних за допомогою Ñигналів RTS Ñ– CTS. За "
"звичних умов, Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— влаÑтивоÑÑ‚Ñ– має бути вÑтановлено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ FALSE."
-#: ../clients/common/settings-docs.h.in:290
+#: ../clients/common/settings-docs.h.in:300
msgid ""
"If non-zero, instruct pppd to presume the connection to the peer has failed "
"if the specified number of LCP echo-requests go unanswered by the peer. The "
@@ -9459,7 +9567,7 @@ msgstr ""
"кількіÑÑ‚ÑŒ луна-запитів LCP. Якщо викориÑтовуєтьÑÑ Ñ†Ñ Ð²Ð»Ð°ÑтивіÑÑ‚ÑŒ, Ð´Ð»Ñ "
"влаÑтивоÑÑ‚Ñ– «lcp-echo-interval» Ñлід вÑтановити ненульове значеннÑ."
-#: ../clients/common/settings-docs.h.in:291
+#: ../clients/common/settings-docs.h.in:301
msgid ""
"If non-zero, instruct pppd to send an LCP echo-request frame to the peer "
"every n seconds (where n is the specified value). Note that some PPP peers "
@@ -9471,7 +9579,7 @@ msgstr ""
"відповідатимуть на луна-запити, а деÑкі — ні. Визначити, чи відповідатиме "
"певний вузол, у автоматичному режимі неможливо."
-#: ../clients/common/settings-docs.h.in:292
+#: ../clients/common/settings-docs.h.in:302
msgid ""
"If TRUE, stateful MPPE is used. See pppd documentation for more information "
"on stateful MPPE."
@@ -9479,7 +9587,7 @@ msgstr ""
"Якщо TRUE, викориÑтовуватиметьÑÑ Ñ€ÐµÐ¶Ð¸Ð¼ MPPE зі Ñтанами (stateful). "
"Докладніший Ð¾Ð¿Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ MPPE зі Ñтанами наведено у документації із pppd."
-#: ../clients/common/settings-docs.h.in:293
+#: ../clients/common/settings-docs.h.in:303
msgid ""
"If non-zero, instruct pppd to request that the peer send packets no larger "
"than the specified size. If non-zero, the MRU should be between 128 and "
@@ -9489,20 +9597,20 @@ msgstr ""
"щодо того, щоб він надÑилав пакети, не більші за вказаний розмір. Якщо має "
"ненульове значеннÑ, MRU має бути від 128 до 16384."
-#: ../clients/common/settings-docs.h.in:294
+#: ../clients/common/settings-docs.h.in:304
msgid ""
"If non-zero, instruct pppd to send packets no larger than the specified size."
msgstr ""
"Якщо має ненульове значеннÑ, наказує pppd надÑилати пакети, не більші за "
"вказаний розмір."
-#: ../clients/common/settings-docs.h.in:295
+#: ../clients/common/settings-docs.h.in:305
msgid "If TRUE, Van Jacobsen TCP header compression will not be requested."
msgstr ""
"Якщо має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ TRUE, запит щодо ÑтиÑÐºÐ°Ð½Ð½Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ–Ð² TCP ван ЯкобÑена не "
"надÑилатиметьÑÑ."
-#: ../clients/common/settings-docs.h.in:296
+#: ../clients/common/settings-docs.h.in:306
msgid ""
"If TRUE, do not require the other side (usually the PPP server) to "
"authenticate itself to the client. If FALSE, require authentication from "
@@ -9513,35 +9621,35 @@ msgstr ""
"FALSE, вимагати Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð· боку віддаленого вузла. У "
"більшоÑÑ‚Ñ– випадків Ñлід викориÑтовувати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ TRUE."
-#: ../clients/common/settings-docs.h.in:297
+#: ../clients/common/settings-docs.h.in:307
msgid "If TRUE, BSD compression will not be requested."
msgstr "Якщо TRUE, ÑтиÑÐºÐ°Ð½Ð½Ñ BSD не вимагатиметьÑÑ."
-#: ../clients/common/settings-docs.h.in:298
+#: ../clients/common/settings-docs.h.in:308
msgid "If TRUE, \"deflate\" compression will not be requested."
msgstr "Якщо TRUE, ÑтиÑÐºÐ°Ð½Ð½Ñ Â«deflate» не вимагатиметьÑÑ."
-#: ../clients/common/settings-docs.h.in:299
+#: ../clients/common/settings-docs.h.in:309
msgid "If TRUE, the CHAP authentication method will not be used."
msgstr "Якщо TRUE, ÑпоÑіб Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ CHAP не викориÑтовуватиметьÑÑ."
-#: ../clients/common/settings-docs.h.in:300
+#: ../clients/common/settings-docs.h.in:310
msgid "If TRUE, the EAP authentication method will not be used."
msgstr "Якщо TRUE, ÑпоÑіб Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ EAP не викориÑтовуватиметьÑÑ."
-#: ../clients/common/settings-docs.h.in:301
+#: ../clients/common/settings-docs.h.in:311
msgid "If TRUE, the MSCHAP authentication method will not be used."
msgstr "Якщо TRUE, ÑпоÑіб Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ MSCHAP не викориÑтовуватиметьÑÑ."
-#: ../clients/common/settings-docs.h.in:302
+#: ../clients/common/settings-docs.h.in:312
msgid "If TRUE, the MSCHAPv2 authentication method will not be used."
msgstr "Якщо TRUE, ÑпоÑіб Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ MSCHAPv2 не викориÑтовуватиметьÑÑ."
-#: ../clients/common/settings-docs.h.in:303
+#: ../clients/common/settings-docs.h.in:313
msgid "If TRUE, the PAP authentication method will not be used."
msgstr "Якщо TRUE, ÑпоÑіб Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ PAP не викориÑтовуватиметьÑÑ."
-#: ../clients/common/settings-docs.h.in:304
+#: ../clients/common/settings-docs.h.in:314
msgid ""
"If TRUE, MPPE (Microsoft Point-to-Point Encryption) will be required for the "
"PPP session. If either 64-bit or 128-bit MPPE is not available the session "
@@ -9552,7 +9660,7 @@ msgstr ""
"128-бітове MPPE виÑвитьÑÑ Ð½ÐµÐ´Ð¾Ñтупним, ÑÐµÐ°Ð½Ñ Ð½Ðµ буде Ñтворено. Зауважте, що "
"MPPE не викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¼Ð¾Ð±Ñ–Ð»ÑŒÐ½Ð¸Ñ… широкоÑмугових з'єднань."
-#: ../clients/common/settings-docs.h.in:305
+#: ../clients/common/settings-docs.h.in:315
msgid ""
"If TRUE, 128-bit MPPE (Microsoft Point-to-Point Encryption) will be required "
"for the PPP session, and the \"require-mppe\" property must also be set to "
@@ -9563,7 +9671,7 @@ msgstr ""
"Ð´Ð»Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ– «require-mppe» також має бути вÑтановлено TRUE. Якщо 128-"
"бітове MPPE виÑвитьÑÑ Ð½ÐµÐ´Ð¾Ñтупним, ÑÐµÐ°Ð½Ñ Ð½Ðµ буде Ñтворено."
-#: ../clients/common/settings-docs.h.in:306
+#: ../clients/common/settings-docs.h.in:316
msgid ""
"If given, specifies the parent interface name on which this PPPoE connection "
"should be created. If this property is not specified, the connection is "
@@ -9575,11 +9683,11 @@ msgstr ""
"з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ активовано на інтерфейÑÑ–, Ñкий вказано за допомогою параметра "
"«interface-name» NMSettingConnection."
-#: ../clients/common/settings-docs.h.in:307
+#: ../clients/common/settings-docs.h.in:317
msgid "Password used to authenticate with the PPPoE service."
msgstr "Пароль, Ñкий викориÑтовуватиметьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð° Ñлужбі PPPoE."
-#: ../clients/common/settings-docs.h.in:309
+#: ../clients/common/settings-docs.h.in:319
msgid ""
"If specified, instruct PPPoE to only initiate sessions with access "
"concentrators that provide the specified service. For most providers, this "
@@ -9592,33 +9700,33 @@ msgstr ""
"Ñкщо ви маєте Ñправу із концентраторами із декількома ÑпоÑобами доÑтупу або "
"відомо, що вказана Ñлужба Ñ” необхідною."
-#: ../clients/common/settings-docs.h.in:310
+#: ../clients/common/settings-docs.h.in:320
msgid "Username used to authenticate with the PPPoE service."
msgstr ""
"Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, Ñке викориÑтовуватиметьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð° Ñлужбі "
"PPPoE."
-#: ../clients/common/settings-docs.h.in:311
+#: ../clients/common/settings-docs.h.in:321
msgid "Whether the proxy configuration is for browser only."
msgstr ""
"Визначає, чи викориÑтовуютьÑÑ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ– лише Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼ Ð´Ð»Ñ "
"переглÑду інтернету."
-#: ../clients/common/settings-docs.h.in:312
+#: ../clients/common/settings-docs.h.in:322
msgid ""
"Method for proxy configuration, Default is NM_SETTING_PROXY_METHOD_NONE (0)"
msgstr ""
"СпоÑіб Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ–. Типовим Ñ” NM_SETTING_PROXY_METHOD_NONE (0)"
-#: ../clients/common/settings-docs.h.in:313
+#: ../clients/common/settings-docs.h.in:323
msgid "PAC script for the connection."
msgstr "Скрипт PAC Ð´Ð»Ñ Ð·'єднаннÑ."
-#: ../clients/common/settings-docs.h.in:314
+#: ../clients/common/settings-docs.h.in:324
msgid "PAC URL for obtaining PAC file."
msgstr "ÐдреÑа PAC Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° PAC."
-#: ../clients/common/settings-docs.h.in:315
+#: ../clients/common/settings-docs.h.in:325
msgid ""
"Speed to use for communication over the serial port. Note that this value "
"usually has no effect for mobile broadband modems as they generally ignore "
@@ -9629,20 +9737,20 @@ msgstr ""
"загалом, Ð´Ð»Ñ Ð½Ð¸Ñ… параметри швидкоÑÑ‚Ñ– ігноруютьÑÑ â€” проÑто викориÑтовуєтьÑÑ "
"найвища доÑтупна швидкіÑÑ‚ÑŒ."
-#: ../clients/common/settings-docs.h.in:316
+#: ../clients/common/settings-docs.h.in:326
msgid "Byte-width of the serial communication. The 8 in \"8n1\" for example."
msgstr "Байтова ширина поÑлідовного обміну даними. Ðаприклад, 8 у «8n1»."
-#: ../clients/common/settings-docs.h.in:317
+#: ../clients/common/settings-docs.h.in:327
msgid "Parity setting of the serial port."
msgstr "Параметр парноÑÑ‚Ñ– поÑлідовного порту."
-#: ../clients/common/settings-docs.h.in:318
+#: ../clients/common/settings-docs.h.in:328
msgid "Time to delay between each byte sent to the modem, in microseconds."
msgstr ""
"Затримка у чаÑÑ– між надÑиланнÑми одного байта на модем, у мікроÑекундах."
-#: ../clients/common/settings-docs.h.in:319
+#: ../clients/common/settings-docs.h.in:329
msgid ""
"Number of stop bits for communication on the serial port. Either 1 or 2. "
"The 1 in \"8n1\" for example."
@@ -9650,7 +9758,7 @@ msgstr ""
"КількіÑÑ‚ÑŒ бітів зупинки Ð´Ð»Ñ Ð¾Ð±Ð¼Ñ–Ð½Ñƒ даними на поÑлідовному порту. Може мати "
"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 1 або 2. Ðаприклад, 1 у «8n1»."
-#: ../clients/common/settings-docs.h.in:320
+#: ../clients/common/settings-docs.h.in:330
msgid ""
"Whether to autoprobe virtual functions by a compatible driver. If set to "
"NM_TERNARY_TRUE (1), the kernel will try to bind VFs to a compatible driver "
@@ -9670,7 +9778,7 @@ msgstr ""
"викориÑтовуватимутьÑÑ Ð·Ð°Ð³Ð°Ð»ÑŒÐ½Ñ– типові параметри. Якщо загальні типові "
"параметри не вказано, припуÑкатиметьÑÑ Ð²Ð°Ñ€Ñ–Ð°Ð½Ñ‚ NM_TERNARY_TRUE (1)."
-#: ../clients/common/settings-docs.h.in:321
+#: ../clients/common/settings-docs.h.in:331
msgid ""
"The total number of virtual functions to create. Note that when the sriov "
"setting is present NetworkManager enforces the number of virtual functions "
@@ -9685,7 +9793,7 @@ msgstr ""
"внеÑенню будь-Ñких змін до параметрів SR-IOV, не додавайте параметр sriov до "
"параметрів з'єднаннÑ."
-#: ../clients/common/settings-docs.h.in:322
+#: ../clients/common/settings-docs.h.in:332
msgid ""
"Array of virtual function descriptors. Each VF descriptor is a dictionary "
"mapping attribute names to GVariant values. The 'index' entry is mandatory "
@@ -9711,15 +9819,15 @@ msgstr ""
"форму: «ІДЕÐТИФІКÐТОР[.ПРІОРИТЕТÐІСТЬ[.ПРОТОКОЛ]]». ЗначеннÑм ПРОТОКОЛ може "
"бути або «q» Ð´Ð»Ñ 802.1Q (типовий варіант) або «ad» Ð´Ð»Ñ 802.1ad."
-#: ../clients/common/settings-docs.h.in:323
+#: ../clients/common/settings-docs.h.in:333
msgid "Array of TC queueing disciplines."
msgstr "МаÑив диÑциплін TC у черзі."
-#: ../clients/common/settings-docs.h.in:324
+#: ../clients/common/settings-docs.h.in:334
msgid "Array of TC traffic filters."
msgstr "СпиÑок TC фільтрів обміну даними."
-#: ../clients/common/settings-docs.h.in:325
+#: ../clients/common/settings-docs.h.in:335
msgid ""
"The JSON configuration for the team network interface. The property should "
"contain raw JSON configuration data suitable for teamd, because the value is "
@@ -9732,8 +9840,8 @@ msgstr ""
"викориÑтовуватимутьÑÑ Ñ‚Ð¸Ð¿Ð¾Ð²Ñ– налаштуваннÑ. Щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про "
"Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…, ознайомитеÑÑ Ñ–Ð· підручником (man) з teamd.conf."
-#: ../clients/common/settings-docs.h.in:326
-#: ../clients/common/settings-docs.h.in:344
+#: ../clients/common/settings-docs.h.in:336
+#: ../clients/common/settings-docs.h.in:354
msgid ""
"Link watchers configuration for the connection: each link watcher is defined "
"by a dictionary, whose keys depend upon the selected link watcher. Available "
@@ -9754,23 +9862,23 @@ msgstr ""
"«validate-inactive», «send-always». Докладніше про це на Ñторінці підручника "
"(man) щодо teamd.conf."
-#: ../clients/common/settings-docs.h.in:327
+#: ../clients/common/settings-docs.h.in:337
msgid "Corresponds to the teamd mcast_rejoin.count."
msgstr "Відповідає mcast_rejoin.count у teamd."
-#: ../clients/common/settings-docs.h.in:328
+#: ../clients/common/settings-docs.h.in:338
msgid "Corresponds to the teamd mcast_rejoin.interval."
msgstr "Відповідає mcast_rejoin.interval у teamd."
-#: ../clients/common/settings-docs.h.in:329
+#: ../clients/common/settings-docs.h.in:339
msgid "Corresponds to the teamd notify_peers.count."
msgstr "Відповідає notify_peers.count у teamd."
-#: ../clients/common/settings-docs.h.in:330
+#: ../clients/common/settings-docs.h.in:340
msgid "Corresponds to the teamd notify_peers.interval."
msgstr "Відповідає notify_peers.interval у teamd."
-#: ../clients/common/settings-docs.h.in:331
+#: ../clients/common/settings-docs.h.in:341
msgid ""
"Corresponds to the teamd runner.name. Permitted values are: \"roundrobin\", "
"\"broadcast\", \"activebackup\", \"loadbalance\", \"lacp\", \"random\"."
@@ -9778,43 +9886,43 @@ msgstr ""
"Відповідає runner.name у teamd. Можливі такі значеннÑ: «roundrobin», "
"«broadcast», «activebackup», «loadbalance», «lacp», «random»."
-#: ../clients/common/settings-docs.h.in:332
+#: ../clients/common/settings-docs.h.in:342
msgid "Corresponds to the teamd runner.active."
msgstr "Відповідає runner.active у teamd."
-#: ../clients/common/settings-docs.h.in:333
+#: ../clients/common/settings-docs.h.in:343
msgid "Corresponds to the teamd runner.agg_select_policy."
msgstr "Відповідає runner.agg_select_policy у teamd."
-#: ../clients/common/settings-docs.h.in:334
+#: ../clients/common/settings-docs.h.in:344
msgid "Corresponds to the teamd runner.fast_rate."
msgstr "Відповідає runner.fast_rate у teamd."
-#: ../clients/common/settings-docs.h.in:335
+#: ../clients/common/settings-docs.h.in:345
msgid "Corresponds to the teamd runner.hwaddr_policy."
msgstr "Відповідає runner.hwaddr_policy у teamd."
-#: ../clients/common/settings-docs.h.in:336
+#: ../clients/common/settings-docs.h.in:346
msgid "Corresponds to the teamd runner.min_ports."
msgstr "Відповідає runner.min_ports у teamd."
-#: ../clients/common/settings-docs.h.in:337
+#: ../clients/common/settings-docs.h.in:347
msgid "Corresponds to the teamd runner.sys_prio."
msgstr "Відповідає runner.sys_prio у teamd."
-#: ../clients/common/settings-docs.h.in:338
+#: ../clients/common/settings-docs.h.in:348
msgid "Corresponds to the teamd runner.tx_balancer.name."
msgstr "Відповідає runner.tx_balancer.name у teamd."
-#: ../clients/common/settings-docs.h.in:339
+#: ../clients/common/settings-docs.h.in:349
msgid "Corresponds to the teamd runner.tx_balancer.interval."
msgstr "Відповідає runner.tx_balancer.interval у teamd."
-#: ../clients/common/settings-docs.h.in:340
+#: ../clients/common/settings-docs.h.in:350
msgid "Corresponds to the teamd runner.tx_hash."
msgstr "Відповідає runner.tx_hash у teamd."
-#: ../clients/common/settings-docs.h.in:341
+#: ../clients/common/settings-docs.h.in:351
msgid ""
"The JSON configuration for the team port. The property should contain raw "
"JSON configuration data suitable for teamd, because the value is passed "
@@ -9827,19 +9935,19 @@ msgstr ""
"викориÑтовуватимутьÑÑ Ñ‚Ð¸Ð¿Ð¾Ð²Ñ– налаштуваннÑ. Щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про "
"Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…, ознайомитеÑÑ Ñ–Ð· підручником (man) з teamd.conf."
-#: ../clients/common/settings-docs.h.in:342
+#: ../clients/common/settings-docs.h.in:352
msgid "Corresponds to the teamd ports.PORTIFNAME.lacp_key."
msgstr "Відповідає ports.PORTIFNAME.lacp_key у teamd."
-#: ../clients/common/settings-docs.h.in:343
+#: ../clients/common/settings-docs.h.in:353
msgid "Corresponds to the teamd ports.PORTIFNAME.lacp_prio."
msgstr "Відповідає ports.PORTIFNAME.lacp_prio у teamd."
-#: ../clients/common/settings-docs.h.in:345
+#: ../clients/common/settings-docs.h.in:355
msgid "Corresponds to the teamd ports.PORTIFNAME.prio."
msgstr "Відповідає ports.PORTIFNAME.prio у teamd."
-#: ../clients/common/settings-docs.h.in:346
+#: ../clients/common/settings-docs.h.in:356
msgid ""
"Corresponds to the teamd ports.PORTIFNAME.queue_id. When set to -1 means the "
"parameter is skipped from the json config."
@@ -9847,11 +9955,11 @@ msgstr ""
"Відповідає ports.PORTIFNAME.queue_id у teamd. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ -1 означає, що "
"параметр пропуÑкаєтьÑÑ Ñƒ налаштуваннÑÑ… json."
-#: ../clients/common/settings-docs.h.in:347
+#: ../clients/common/settings-docs.h.in:357
msgid "Corresponds to the teamd ports.PORTIFNAME.sticky."
msgstr "Відповідає ports.PORTIFNAME.sticky у teamd."
-#: ../clients/common/settings-docs.h.in:348
+#: ../clients/common/settings-docs.h.in:358
msgid ""
"The group ID which will own the device. If set to NULL everyone will be able "
"to use the device."
@@ -9859,7 +9967,7 @@ msgstr ""
"Ідентифікатор групи-влаÑника приÑтрою. Якщо вÑтановлено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ NULL, "
"приÑтроєм зможе кориÑтуватиÑÑ Ð±ÑƒÐ´ÑŒ-хто."
-#: ../clients/common/settings-docs.h.in:349
+#: ../clients/common/settings-docs.h.in:359
msgid ""
"The operating mode of the virtual device. Allowed values are "
"NM_SETTING_TUN_MODE_TUN (1) to create a layer 3 device and "
@@ -9869,7 +9977,7 @@ msgstr ""
"NM_SETTING_TUN_MODE_TUN (1) Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ñтрою шару 3 Ñ– "
"NM_SETTING_TUN_MODE_TAP (2) Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ñтрою Ethernet-подібного шару 2."
-#: ../clients/common/settings-docs.h.in:350
+#: ../clients/common/settings-docs.h.in:360
msgid ""
"If the property is set to TRUE, the interface will support multiple file "
"descriptors (queues) to parallelize packet sending or receiving. Otherwise, "
@@ -9880,7 +9988,7 @@ msgstr ""
"надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ Ð¾Ñ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ñ–Ð². Якщо ж вÑтановлено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ FALSE, "
"інтерфейÑом підтримуватиметьÑÑ Ð»Ð¸ÑˆÐµ одна черга."
-#: ../clients/common/settings-docs.h.in:351
+#: ../clients/common/settings-docs.h.in:361
msgid ""
"The user ID which will own the device. If set to NULL everyone will be able "
"to use the device."
@@ -9888,7 +9996,7 @@ msgstr ""
"Ідентифікатор кориÑтувача-влаÑника приÑтрою. Якщо вÑтановлено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ NULL, "
"приÑтроєм зможе кориÑтуватиÑÑ Ð±ÑƒÐ´ÑŒ-хто."
-#: ../clients/common/settings-docs.h.in:352
+#: ../clients/common/settings-docs.h.in:362
msgid ""
"If TRUE the interface will prepend a 4 byte header describing the physical "
"interface to the packets."
@@ -9896,7 +10004,7 @@ msgstr ""
"Якщо TRUE, Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð¾Ð¿Ð¸Ñуватиме на початку пакетів заголовок у 4 байти із "
"опиÑом фізичного інтерфейÑу."
-#: ../clients/common/settings-docs.h.in:353
+#: ../clients/common/settings-docs.h.in:363
msgid ""
"If TRUE the IFF_VNET_HDR the tunnel packets will include a virtio network "
"header."
@@ -9904,7 +10012,7 @@ msgstr ""
"Якщо IFF_VNET_HDR має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ TRUE, тунельовані пакети включатимуть "
"заголовок мережі virtio."
-#: ../clients/common/settings-docs.h.in:354
+#: ../clients/common/settings-docs.h.in:364
msgid ""
"A dictionary of key/value pairs with user data. This data is ignored by "
"NetworkManager and can be used at the users discretion. The keys only "
@@ -9917,7 +10025,7 @@ msgstr ""
"формату ASCII, але Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ бути довільними Ñ€Ñдками UTF8, довжина "
"Ñких не перевищує певного значеннÑ."
-#: ../clients/common/settings-docs.h.in:355
+#: ../clients/common/settings-docs.h.in:365
msgid ""
"For outgoing packets, a list of mappings from Linux SKB priorities to 802.1p "
"priorities. The mapping is given in the format \"from:to\" where both \"from"
@@ -9927,7 +10035,7 @@ msgstr ""
"802.1p. Прив'Ñзка визначаєтьÑÑ Ñƒ форматі «з:до», де обидва значеннÑ, «з» Ñ– "
"«до» Ñ” цілими додатними чиÑлами, наприклад «7:3»."
-#: ../clients/common/settings-docs.h.in:356
+#: ../clients/common/settings-docs.h.in:366
msgid ""
"One or more flags which control the behavior and features of the VLAN "
"interface. Flags include NM_VLAN_FLAG_REORDER_HEADERS (0x1) (reordering of "
@@ -9949,7 +10057,7 @@ msgstr ""
"зберегти зворотну ÑуміÑніÑÑ‚ÑŒ, типовим значеннÑм у програмному інтерфейÑÑ– D-"
"Bus лишаєтьÑÑ 0, а неÑтача влаÑтивоÑÑ‚Ñ– у D-Bus також розглÑдаєтьÑÑ Ñк 0."
-#: ../clients/common/settings-docs.h.in:357
+#: ../clients/common/settings-docs.h.in:367
msgid ""
"The VLAN identifier that the interface created by this connection should be "
"assigned. The valid range is from 0 to 4094, without the reserved id 4095."
@@ -9958,7 +10066,7 @@ msgstr ""
"з'єднаннÑм. Коректним діапазоном Ñ” діапазон від 0 до 4094, без "
"зарезервованого ідентифікатора 4095."
-#: ../clients/common/settings-docs.h.in:358
+#: ../clients/common/settings-docs.h.in:368
msgid ""
"For incoming packets, a list of mappings from 802.1p priorities to Linux SKB "
"priorities. The mapping is given in the format \"from:to\" where both \"from"
@@ -9968,7 +10076,7 @@ msgstr ""
"Linux. Прив'Ñзка визначаєтьÑÑ Ñƒ форматі «з:до», де обидва значеннÑ, «з» Ñ– "
"«до» Ñ” цілими додатними чиÑлами, наприклад «7:3»."
-#: ../clients/common/settings-docs.h.in:359
+#: ../clients/common/settings-docs.h.in:369
msgid ""
"If given, specifies the parent interface name or parent connection UUID from "
"which this VLAN interface should be created. If this property is not "
@@ -9980,7 +10088,7 @@ msgstr ""
"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— влаÑтивоÑÑ‚Ñ– не вказано, Ð·Ð°Ð¿Ð¸Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” міÑтити "
"параметр «802-3-ethernet» із влаÑтивіÑÑ‚ÑŽ «mac-address»."
-#: ../clients/common/settings-docs.h.in:360
+#: ../clients/common/settings-docs.h.in:370
msgid ""
"Dictionary of key/value pairs of VPN plugin specific data. Both keys and "
"values must be strings."
@@ -9988,7 +10096,7 @@ msgstr ""
"Словник із пар ключ-Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñпецифічних даних додатка VPN. Величинами "
"ключа Ñ– Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ бути лише текÑтові Ñ€Ñдки."
-#: ../clients/common/settings-docs.h.in:361
+#: ../clients/common/settings-docs.h.in:371
msgid ""
"If the VPN service supports persistence, and this property is TRUE, the VPN "
"will attempt to stay connected across link changes and outages, until "
@@ -9999,7 +10107,7 @@ msgstr ""
"Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ параметрів зв'Ñзку або неможливоÑÑ‚Ñ– обміну даними, аж доки "
"з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ буде розірвано Ñвним чином."
-#: ../clients/common/settings-docs.h.in:362
+#: ../clients/common/settings-docs.h.in:372
msgid ""
"Dictionary of key/value pairs of VPN plugin specific secrets like passwords "
"or private keys. Both keys and values must be strings."
@@ -10008,7 +10116,7 @@ msgstr ""
"VPN, зокрема паролів або закритих ключів. Величинами ключа Ñ– Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ "
"бути лише текÑтові Ñ€Ñдки."
-#: ../clients/common/settings-docs.h.in:363
+#: ../clients/common/settings-docs.h.in:373
msgid ""
"D-Bus service name of the VPN plugin that this setting uses to connect to "
"its network. i.e. org.freedesktop.NetworkManager.vpnc for the vpnc plugin."
@@ -10017,7 +10125,7 @@ msgstr ""
"додатка з його мережею. Приклад: org.freedesktop.NetworkManager.vpnc Ð´Ð»Ñ "
"додатка vpnc."
-#: ../clients/common/settings-docs.h.in:364
+#: ../clients/common/settings-docs.h.in:374
msgid ""
"Timeout for the VPN service to establish the connection. Some services may "
"take quite a long time to connect. Value of 0 means a default timeout, which "
@@ -10030,7 +10138,7 @@ msgstr ""
"допомогою параметра vpn.timeout у файлі налаштувань). ЗначеннÑ, Ñкі "
"перевищують нуль, визначають Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ Ñекундах."
-#: ../clients/common/settings-docs.h.in:365
+#: ../clients/common/settings-docs.h.in:375
msgid ""
"If the VPN connection requires a user name for authentication, that name "
"should be provided here. If the connection is available to more than one "
@@ -10046,15 +10154,15 @@ msgstr ""
"порожнє, NetworkManager автоматично викориÑтає ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, Ñкий "
"надіÑлав запит щодо вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ VPN."
-#: ../clients/common/settings-docs.h.in:366
+#: ../clients/common/settings-docs.h.in:376
msgid "The routing table for this VRF."
msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ñ–Ñ— Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ VRF."
-#: ../clients/common/settings-docs.h.in:367
+#: ../clients/common/settings-docs.h.in:377
msgid "Specifies the lifetime in seconds of FDB entries learnt by the kernel."
msgstr "Визначає Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ Ñƒ Ñекундах запиÑів FDB, вивчених Ñдром."
-#: ../clients/common/settings-docs.h.in:368
+#: ../clients/common/settings-docs.h.in:378
msgid ""
"Specifies the UDP destination port to communicate to the remote VXLAN tunnel "
"endpoint."
@@ -10062,22 +10170,22 @@ msgstr ""
"Визначає порт Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ UDP Ð´Ð»Ñ Ð¾Ð±Ð¼Ñ–Ð½Ñƒ даними із віддаленою кінцевою "
"точкою тунелю VXLAN."
-#: ../clients/common/settings-docs.h.in:369
+#: ../clients/common/settings-docs.h.in:379
msgid ""
"Specifies the VXLAN Network Identifier (or VXLAN Segment Identifier) to use."
msgstr ""
"Визначає ідентифікатор мережі VXLAN (або ідентифікатор Ñегмента VXLAN), Ñким "
"Ñлід ÑкориÑтатиÑÑ."
-#: ../clients/common/settings-docs.h.in:370
+#: ../clients/common/settings-docs.h.in:380
msgid "Specifies whether netlink LL ADDR miss notifications are generated."
msgstr "Визначає, чи будуть ÑтворюватиÑÑ ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ netlink LL ADDR miss."
-#: ../clients/common/settings-docs.h.in:371
+#: ../clients/common/settings-docs.h.in:381
msgid "Specifies whether netlink IP ADDR miss notifications are generated."
msgstr "Визначає, чи будуть ÑтворюватиÑÑ ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ netlink IP ADDR miss."
-#: ../clients/common/settings-docs.h.in:372
+#: ../clients/common/settings-docs.h.in:382
msgid ""
"Specifies whether unknown source link layer addresses and IP addresses are "
"entered into the VXLAN device forwarding database."
@@ -10085,7 +10193,7 @@ msgstr ""
"Вказує, чи вводÑÑ‚ÑŒÑÑ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ñ– адреÑи шару поÑилань та IP-адреÑи до бази "
"даних переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ñтроїв VXLAN."
-#: ../clients/common/settings-docs.h.in:373
+#: ../clients/common/settings-docs.h.in:383
msgid ""
"Specifies the maximum number of FDB entries. A value of zero means that the "
"kernel will store unlimited entries."
@@ -10093,24 +10201,24 @@ msgstr ""
"Вказує макÑимальну кількіÑÑ‚ÑŒ запиÑів FDB. Ðульове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð·Ð½Ð°Ñ‡Ð°Ñ”, що Ñдро "
"зберігатиме необмежену кількіÑÑ‚ÑŒ запиÑів."
-#: ../clients/common/settings-docs.h.in:374
+#: ../clients/common/settings-docs.h.in:384
msgid "If given, specifies the source IP address to use in outgoing packets."
msgstr ""
"Якщо задано, визначає початкову IP-адреÑу, Ñкою Ñлід ÑкориÑтатиÑÑ Ð´Ð»Ñ "
"вихідних пакетів."
-#: ../clients/common/settings-docs.h.in:375
+#: ../clients/common/settings-docs.h.in:385
msgid ""
"If given, specifies the parent interface name or parent connection UUID."
msgstr ""
"Якщо задано, визначає назву батьківÑького інтерфейÑу або UUID батьківÑького "
"з'єднаннÑ."
-#: ../clients/common/settings-docs.h.in:376
+#: ../clients/common/settings-docs.h.in:386
msgid "Specifies whether ARP proxy is turned on."
msgstr "Визначає, чи увімкнено ARP-прокÑÑ–."
-#: ../clients/common/settings-docs.h.in:377
+#: ../clients/common/settings-docs.h.in:387
msgid ""
"Specifies the unicast destination IP address to use in outgoing packets when "
"the destination link layer address is not known in the VXLAN device "
@@ -10121,11 +10229,11 @@ msgstr ""
"переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ñтроїв VXLAN, або IP-адреÑа універÑальної транÑлÑції, з "
"Ñкою Ñлід вÑтановити зв'Ñзок."
-#: ../clients/common/settings-docs.h.in:378
+#: ../clients/common/settings-docs.h.in:388
msgid "Specifies whether route short circuit is turned on."
msgstr "Визначає, чи увімкнено коротке Ð·Ð°Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ñƒ."
-#: ../clients/common/settings-docs.h.in:379
+#: ../clients/common/settings-docs.h.in:389
msgid ""
"Specifies the maximum UDP source port to communicate to the remote VXLAN "
"tunnel endpoint."
@@ -10133,7 +10241,7 @@ msgstr ""
"Визначає макÑимальний початковий порт UDP Ð´Ð»Ñ Ð¾Ð±Ð¼Ñ–Ð½Ñƒ даними із віддаленою "
"кінцевою точкою тунелю VXLAN."
-#: ../clients/common/settings-docs.h.in:380
+#: ../clients/common/settings-docs.h.in:390
msgid ""
"Specifies the minimum UDP source port to communicate to the remote VXLAN "
"tunnel endpoint."
@@ -10141,16 +10249,16 @@ msgstr ""
"Визначає мінімальний початковий порт UDP Ð´Ð»Ñ Ð¾Ð±Ð¼Ñ–Ð½Ñƒ даними із віддаленою "
"кінцевою точкою тунелю VXLAN."
-#: ../clients/common/settings-docs.h.in:381
+#: ../clients/common/settings-docs.h.in:391
msgid "Specifies the TOS value to use in outgoing packets."
msgstr "Визначає Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ TOS, Ñке Ñлід викориÑтовувати Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… пакетів."
-#: ../clients/common/settings-docs.h.in:382
+#: ../clients/common/settings-docs.h.in:392
msgid "Specifies the time-to-live value to use in outgoing packets."
msgstr ""
"Визначає Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу життÑ, Ñке Ñлід викориÑтовувати Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… пакетів."
-#: ../clients/common/settings-docs.h.in:383
+#: ../clients/common/settings-docs.h.in:393
msgid ""
"The P2P device that should be connected to. Currently this is the only way "
"to create or join a group."
@@ -10158,7 +10266,7 @@ msgstr ""
"ПриÑтрій P2P, з Ñким Ñлід вÑтановити з'єднаннÑ. У поточній верÑÑ–Ñ— це єдиний "
"ÑпоÑіб ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸ або Ð´Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ неї."
-#: ../clients/common/settings-docs.h.in:384
+#: ../clients/common/settings-docs.h.in:394
msgid ""
"The Wi-Fi Display (WFD) Information Elements (IEs) to set. Wi-Fi Display "
"requires a protocol specific information element to be set in certain Wi-Fi "
@@ -10172,7 +10280,7 @@ msgstr ""
"Вказати ці елементи з метою вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ð½Ð° тут. Цей параметр Ñ” "
"кориÑним лише Ð´Ð»Ñ Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— клієнта диÑÐ¿Ð»ÐµÑ Wi-Fi."
-#: ../clients/common/settings-docs.h.in:385
+#: ../clients/common/settings-docs.h.in:395
msgid ""
"Flags indicating which mode of WPS is to be used. There's little point in "
"changing the default setting as NetworkManager will automatically determine "
@@ -10182,7 +10290,7 @@ msgstr ""
"типове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ варто, оÑкільки NetworkManager автоматично визначає "
"найкращий режим."
-#: ../clients/common/settings-docs.h.in:386
+#: ../clients/common/settings-docs.h.in:396
msgid ""
"If specified, this connection will only apply to the WiMAX device whose MAC "
"address matches. This property does not change the MAC address of the device "
@@ -10192,7 +10300,7 @@ msgstr ""
"відповідною адреÑою MAC. Ð¦Ñ Ð²Ð»Ð°ÑтивіÑÑ‚ÑŒ не змінює MAC-адреÑи приÑтрою (таку "
"зміну називають підміною MAC). ЗаÑтаріле: 1"
-#: ../clients/common/settings-docs.h.in:387
+#: ../clients/common/settings-docs.h.in:397
msgid ""
"Network Service Provider (NSP) name of the WiMAX network this connection "
"should use. Deprecated: 1"
@@ -10200,7 +10308,7 @@ msgstr ""
"Ðазва надавача мережевих поÑлуг (NSP) Ð´Ð»Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ– WiMAX, Ñку має "
"викориÑтовувати це з'єднаннÑ. ЗаÑтаріле: 1"
-#: ../clients/common/settings-docs.h.in:388
+#: ../clients/common/settings-docs.h.in:398
msgid ""
"The use of fwmark is optional and is by default off. Setting it to 0 "
"disables it. Otherwise it is a 32-bit fwmark for outgoing packets. Note that "
@@ -10212,33 +10320,39 @@ msgstr ""
"fwmark Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… пакетів. Зауважте, що Ð²Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Â«ip4-auto-default-route» "
"або «ip6-auto-default-route» неÑвним чином призводить до вибору fwmark."
-#: ../clients/common/settings-docs.h.in:389
+#: ../clients/common/settings-docs.h.in:399
msgid ""
"Whether to enable special handling of the IPv4 default route. If enabled, "
-"the IPv4 default route will be placed to a dedicated routing-table and two "
-"policy routing rules will be added. The fwmark number is also used as "
-"routing-table for the default-route, and if fwmark is zero, a unused fwmark/"
-"table is chosen automatically. This corresponds to what wg-quick does with "
-"Table=auto. Leaving this at the default will enable this option "
-"automatically if ipv4.never-default is not set and there are any peers that "
-"use a default-route as allowed-ips."
+"the IPv4 default route from wireguard.peer-routes will be placed to a "
+"dedicated routing-table and two policy routing rules will be added. The "
+"fwmark number is also used as routing-table for the default-route, and if "
+"fwmark is zero, an unused fwmark/table is chosen automatically. This "
+"corresponds to what wg-quick does with Table=auto and what WireGuard calls "
+"\"Improved Rule-based Routing\". Note that for this automatism to work, you "
+"usually don't want to set ipv4.gateway, because that will result in a "
+"conflicting default route. Leaving this at the default will enable this "
+"option automatically if ipv4.never-default is not set and there are any "
+"peers that use a default-route as allowed-ips."
msgstr ""
"Визначає, чи Ñлід вмикати оÑобливу обробку типового маршруту IPv4. Якщо "
-"увімкнено, типовий маршрут IPv4 буде розміщено у Ñпеціальній таблиці "
-"маршрутизації, а також буде додано два правила маршрутизації. Також буде "
-"викориÑтано чиÑло fwmark Ñк номер таблиці маршрутизації Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ð³Ð¾ "
-"маршруту. Якщо fwmark дорівнює нулю, буде автоматично вибрано невикориÑтане "
-"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ fwmark або таблицю. Це збігаєтьÑÑ Ð· тим, що wg-quick робить з "
-"Table=auto. Якщо не змінювати типове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ параметра, його буде "
-"увімкнено, Ñкщо не буде вÑтановлено ipv4.never-default Ñ– не буде жодного "
-"вузла, Ñкий викориÑтовує типовий маршрут (default-route) у дозволених IP-"
-"адреÑах (allowed-ips)."
+"увімкнено, типовий маршрут IPv4 з wireguard.peer-routes буде розміщено у "
+"Ñпеціальній таблиці маршрутизації, а також буде додано два правила "
+"маршрутизації. Також буде викориÑтано чиÑло fwmark Ñк номер таблиці "
+"маршрутизації Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ð³Ð¾ маршруту. Якщо fwmark дорівнює нулю, буде "
+"автоматично вибрано невикориÑтане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ fwmark або таблицю. Це збігаєтьÑÑ "
+"з тим, що wg-quick робить з Table=auto Ñ– що у WireGuard називаєтьÑÑ "
+"«Improved Rule-based Routing». Зауважте, що Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб Ñ†Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð°Ñ†Ñ–Ñ "
+"Ñпрацювала, не варто вÑтановлювати ipv4.gateway, оÑкільки це призведе до "
+"конфлікту Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ð³Ð¾ маршруту. Якщо не змінювати типове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ "
+"параметра, його буде увімкнено, Ñкщо не буде вÑтановлено ipv4.never-default "
+"Ñ– не буде жодного вузла, Ñкий викориÑтовує типовий маршрут (default-route) у "
+"дозволених IP-адреÑах (allowed-ips)."
-#: ../clients/common/settings-docs.h.in:390
+#: ../clients/common/settings-docs.h.in:400
msgid "Like ip4-auto-default-route, but for the IPv6 default route."
msgstr "Те Ñаме, що ip4-auto-default-route, але Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ð³Ð¾ маршруту IPv6."
-#: ../clients/common/settings-docs.h.in:391
+#: ../clients/common/settings-docs.h.in:401
msgid ""
"The listen-port. If listen-port is not specified, the port will be chosen "
"randomly when the interface comes up."
@@ -10246,7 +10360,7 @@ msgstr ""
"Порт Ð´Ð»Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° дані. Якщо порт Ð´Ð»Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° дані не вказано, "
"номер буде вибрано випадковим чином під Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ð½ÑÑ‚Ñ‚Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу."
-#: ../clients/common/settings-docs.h.in:392
+#: ../clients/common/settings-docs.h.in:402
msgid ""
"If non-zero, only transmit packets of the specified size or smaller, "
"breaking larger packets up into multiple fragments. If zero a default MTU is "
@@ -10259,30 +10373,37 @@ msgstr ""
"відміну від параметра MTU wg-quick, тут не берутьÑÑ Ð´Ð¾ уваги поточні "
"маршрути на момент активації."
-#: ../clients/common/settings-docs.h.in:393
+#: ../clients/common/settings-docs.h.in:403
msgid ""
"Whether to automatically add routes for the AllowedIPs ranges of the peers. "
"If TRUE (the default), NetworkManager will automatically add routes in the "
-"routing tables according to ipv4.route-table and ipv6.route-table. If FALSE, "
-"no such routes are added automatically. In this case, the user may want to "
-"configure static routes in ipv4.routes and ipv6.routes, respectively."
+"routing tables according to ipv4.route-table and ipv6.route-table. Usually "
+"you want this automatism enabled. If FALSE, no such routes are added "
+"automatically. In this case, the user may want to configure static routes in "
+"ipv4.routes and ipv6.routes, respectively. Note that if the peer's "
+"AllowedIPs is \"0.0.0.0/0\" or \"::/0\" and the profile's ipv4.never-default "
+"or ipv6.never-default setting is enabled, the peer route for this peer won't "
+"be added automatically."
msgstr ""
"Визначає, чи Ñлід автоматично додавати маршрути Ð´Ð»Ñ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ–Ð² AllowedIP "
"вузлів. Якщо має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ TRUE (типове значеннÑ), NetworkManager автоматично "
"додаватиме маршрути до таблиць маршрутизації відповідно до ipv4.route-table "
-"Ñ– ipv6.route-table. Якщо має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ FALSE, автоматичне Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ñ–Ð² "
-"не виконуватиметьÑÑ. У цьому випадку кориÑтувачеві варто налаштувати "
-"Ñтатичні маршрути у ipv4.routes та ipv6.routes, відповідно."
-
-#: ../clients/common/settings-docs.h.in:394
+"і ipv6.route-table. Зазвичай, не варто вимикати цю автоматизацію. Якщо має "
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ FALSE, автоматичне Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ñ–Ð² не виконуватиметьÑÑ. У цьому "
+"випадку кориÑтувачеві варто налаштувати Ñтатичні маршрути у ipv4.routes та "
+"ipv6.routes, відповідно. Зауважте, що Ñкщо AllowedIPs Ð´Ð»Ñ Ð²ÑƒÐ·Ð»Ð° має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "
+"«0.0.0.0/0» або «::/0», а Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽ увімкнено ipv4.never-default або ipv6."
+"never-default, маршрут вузла Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ вузла не буде додано автоматично."
+
+#: ../clients/common/settings-docs.h.in:404
msgid "The 256 bit private-key in base64 encoding."
msgstr "256-бітовий закритий ключ у кодуванні base64."
-#: ../clients/common/settings-docs.h.in:395
+#: ../clients/common/settings-docs.h.in:405
msgid "Flags indicating how to handle the \"private-key\" property."
msgstr "Прапорці, Ñкі позначають, Ñк оброблÑти влаÑтивіÑÑ‚ÑŒ «private-key»."
-#: ../clients/common/settings-docs.h.in:396
+#: ../clients/common/settings-docs.h.in:406
msgid ""
"IEEE 802.15.4 channel. A positive integer or -1, meaning \"do not set, use "
"whatever the device is already set to\"."
@@ -10290,7 +10411,7 @@ msgstr ""
"Канал IEEE 802.15.4. Додане ціле Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ -1, що означає «не "
"вÑтановлювати, викориÑтовувати той, Ñкий вже вÑтановлено приÑтроєм»."
-#: ../clients/common/settings-docs.h.in:397
+#: ../clients/common/settings-docs.h.in:407
msgid ""
"If specified, this connection will only apply to the IEEE 802.15.4 (WPAN) "
"MAC layer device whose permanent MAC address matches."
@@ -10298,7 +10419,7 @@ msgstr ""
"Якщо вказано, це з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð°ÑтоÑовуватиметьÑÑ Ð»Ð¸ÑˆÐµ до приÑтрою шару MAC "
"IEEE 802.15.4 (WPAN) із відповідною Ñталою адреÑою MAC."
-#: ../clients/common/settings-docs.h.in:398
+#: ../clients/common/settings-docs.h.in:408
msgid ""
"IEEE 802.15.4 channel page. A positive integer or -1, meaning \"do not set, "
"use whatever the device is already set to\"."
@@ -10306,11 +10427,11 @@ msgstr ""
"Сторінка каналу IEEE 80215.4. Додане ціле Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ -1, що означає «не "
"вÑтановлювати, викориÑтовувати ту, Ñку вже вÑтановлено приÑтроєм»."
-#: ../clients/common/settings-docs.h.in:399
+#: ../clients/common/settings-docs.h.in:409
msgid "IEEE 802.15.4 Personal Area Network (PAN) identifier."
msgstr "Ідентифікатор Personal Area Network (PAN) IEEE 802.15.4."
-#: ../clients/common/settings-docs.h.in:400
+#: ../clients/common/settings-docs.h.in:410
msgid "Short IEEE 802.15.4 address to be used within a restricted environment."
msgstr ""
"Коротка адреÑа IEEE 802.15.4, Ñку Ñлід викориÑтовувати у обмеженому "
@@ -10352,14 +10473,14 @@ msgstr ""
"Ðегайно завершити роботу, Ñкщо NetworkManager не запущено або виконуєтьÑÑ "
"Ñпроба з'єднаннÑ"
-#: ../clients/nm-online.c:263
+#: ../clients/nm-online.c:265
msgid ""
"Waits for NetworkManager to finish activating startup network connections."
msgstr ""
"Очікує на Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— NetworkManager з'єднань, Ñкі Ñлід активувати "
"під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку."
-#: ../clients/nm-online.c:270 ../clients/nm-online.c:276
+#: ../clients/nm-online.c:272 ../clients/nm-online.c:278
msgid "Invalid option. Please use --help to see a list of valid options."
msgstr ""
"Ðекоректний параметр. Щоб ознайомитиÑÑ Ð·Ñ– ÑпиÑком параметрів, ÑкориÑтайтеÑÑ "
@@ -10436,7 +10557,7 @@ msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ DSL %d"
#: ../clients/tui/nm-editor-utils.c:179 ../libnm-core/nm-connection.c:2705
#: ../libnm/nm-device.c:1542
-#: ../src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c:5022
+#: ../src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c:5027
msgid "Bond"
msgstr "Прив'Ñзка"
@@ -10447,7 +10568,7 @@ msgstr "Прив'Ñзане з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ %d"
#: ../clients/tui/nm-editor-utils.c:188 ../libnm-core/nm-connection.c:2709
#: ../libnm/nm-device.c:1546
-#: ../src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c:5386
+#: ../src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c:5410
msgid "Bridge"
msgstr "МіÑток"
@@ -10458,7 +10579,7 @@ msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¼Ñ–Ñтка %d"
#: ../clients/tui/nm-editor-utils.c:197 ../libnm-core/nm-connection.c:2707
#: ../libnm/nm-device.c:1544
-#: ../src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c:5095
+#: ../src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c:5100
msgid "Team"
msgstr "Команда"
@@ -11642,10 +11763,10 @@ msgstr "неочікуваний UUID %s заміÑÑ‚ÑŒ %s"
#: ../libnm-core/nm-setting-bluetooth.c:109
#: ../libnm-core/nm-setting-bluetooth.c:167
#: ../libnm-core/nm-setting-bluetooth.c:181 ../libnm-core/nm-setting-cdma.c:128
-#: ../libnm-core/nm-setting-connection.c:954
-#: ../libnm-core/nm-setting-connection.c:983
-#: ../libnm-core/nm-setting-connection.c:1220
-#: ../libnm-core/nm-setting-ip-config.c:4933
+#: ../libnm-core/nm-setting-connection.c:975
+#: ../libnm-core/nm-setting-connection.c:1004
+#: ../libnm-core/nm-setting-connection.c:1266
+#: ../libnm-core/nm-setting-ip-config.c:4935
#: ../libnm-core/nm-setting-ip-tunnel.c:359
#: ../libnm-core/nm-setting-olpc-mesh.c:84
#: ../libnm-core/nm-setting-ovs-patch.c:77 ../libnm-core/nm-setting-pppoe.c:130
@@ -11735,10 +11856,12 @@ msgstr ""
#: ../libnm-core/nm-setting-8021x.c:2753 ../libnm-core/nm-setting-8021x.c:2765
#: ../libnm-core/nm-setting-8021x.c:2790 ../libnm-core/nm-setting-adsl.c:166
#: ../libnm-core/nm-setting-cdma.c:135 ../libnm-core/nm-setting-cdma.c:144
-#: ../libnm-core/nm-setting-connection.c:961
-#: ../libnm-core/nm-setting-connection.c:995 ../libnm-core/nm-setting-gsm.c:283
-#: ../libnm-core/nm-setting-gsm.c:341 ../libnm-core/nm-setting-gsm.c:378
-#: ../libnm-core/nm-setting-gsm.c:387 ../libnm-core/nm-setting-ip-config.c:4940
+#: ../libnm-core/nm-setting-connection.c:982
+#: ../libnm-core/nm-setting-connection.c:1016
+#: ../libnm-core/nm-setting-connection.c:1238
+#: ../libnm-core/nm-setting-gsm.c:283 ../libnm-core/nm-setting-gsm.c:341
+#: ../libnm-core/nm-setting-gsm.c:378 ../libnm-core/nm-setting-gsm.c:387
+#: ../libnm-core/nm-setting-ip-config.c:4942
#: ../libnm-core/nm-setting-ip4-config.c:167
#: ../libnm-core/nm-setting-ip4-config.c:174
#: ../libnm-core/nm-setting-pppoe.c:137 ../libnm-core/nm-setting-pppoe.c:146
@@ -11780,7 +11903,7 @@ msgstr "можна вмикати лише Ð´Ð»Ñ Ð·'єднань Ethernet"
#: ../libnm-core/nm-setting-wireless.c:835
#: ../libnm-core/nm-setting-wireless.c:844
#: ../libnm-core/nm-setting-wireless.c:855 ../libnm-core/nm-setting-wpan.c:162
-#: ../libnm-core/nm-utils.c:4555
+#: ../libnm-core/nm-utils.c:4553
msgid "property is invalid"
msgstr "влаÑтивіÑÑ‚ÑŒ Ñ” некоректною"
@@ -11807,83 +11930,83 @@ msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» потребує параметра «%s» аб
msgid "'%s' connection requires '%s' setting"
msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» потребує параметра «%s»"
-#: ../libnm-core/nm-setting-bond.c:754
+#: ../libnm-core/nm-setting-bond.c:757
#, c-format
msgid "invalid option '%s' or its value '%s'"
msgstr "некоректний параметр «%s» або його Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s»"
-#: ../libnm-core/nm-setting-bond.c:786
+#: ../libnm-core/nm-setting-bond.c:789
#, c-format
msgid "mandatory option '%s' is missing"
msgstr "пропущено обов'Ñзковий параметр «%s»"
-#: ../libnm-core/nm-setting-bond.c:796
+#: ../libnm-core/nm-setting-bond.c:799
#, c-format
msgid "'%s' is not a valid value for '%s'"
msgstr "«%s» не Ñ” коректним значеннÑм «%s»"
-#: ../libnm-core/nm-setting-bond.c:814
+#: ../libnm-core/nm-setting-bond.c:816
#, c-format
msgid "'%s=%s' is incompatible with '%s > 0'"
msgstr "«%s=%s» Ñ” неÑуміÑним з «%s > 0»"
-#: ../libnm-core/nm-setting-bond.c:834
+#: ../libnm-core/nm-setting-bond.c:836
#, c-format
msgid "'%s' is not valid for the '%s' option: %s"
msgstr "«%s» Ñ” некоректним Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s»: %s"
-#: ../libnm-core/nm-setting-bond.c:847
+#: ../libnm-core/nm-setting-bond.c:849
#, c-format
msgid "'%s' option is only valid for '%s=%s'"
msgstr "параметр «%s» можна викориÑтовувати, лише Ñкщо «%s=%s»"
-#: ../libnm-core/nm-setting-bond.c:860
+#: ../libnm-core/nm-setting-bond.c:862
#, c-format
msgid "'%s=%s' is not a valid configuration for '%s'"
msgstr "«%s=%s» не Ñ” коректним налаштуваннÑм Ð´Ð»Ñ Â«%s»"
-#: ../libnm-core/nm-setting-bond.c:875 ../libnm-core/nm-setting-bond.c:888
-#: ../libnm-core/nm-setting-bridge.c:1145
+#: ../libnm-core/nm-setting-bond.c:877 ../libnm-core/nm-setting-bond.c:890
+#: ../libnm-core/nm-setting-bridge.c:1316
#, c-format
msgid "'%s' option requires '%s' option to be enabled"
msgstr "викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s» вимагає Ð²Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s»"
-#: ../libnm-core/nm-setting-bond.c:910 ../libnm-core/nm-setting-bond.c:956
+#: ../libnm-core/nm-setting-bond.c:912 ../libnm-core/nm-setting-bond.c:958
#, c-format
msgid "'%s' option requires '%s' option to be set"
msgstr "викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s» вимагає вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s»"
-#: ../libnm-core/nm-setting-bond.c:925
+#: ../libnm-core/nm-setting-bond.c:927
#, c-format
msgid "'%s' option is empty"
msgstr "параметр «%s» є порожнім"
-#: ../libnm-core/nm-setting-bond.c:939
+#: ../libnm-core/nm-setting-bond.c:941
#, c-format
msgid "'%s' is not a valid IPv4 address for '%s' option"
msgstr "«%s» не Ñ” припуÑтимою адреÑою IPv4 Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s»"
-#: ../libnm-core/nm-setting-bond.c:973
+#: ../libnm-core/nm-setting-bond.c:975
#, c-format
msgid "'%s' option is only valid with mode '%s'"
msgstr "параметр «%s» є коректним лише у режимі «%s»"
-#: ../libnm-core/nm-setting-bond.c:985
+#: ../libnm-core/nm-setting-bond.c:987
#, c-format
msgid "'%s' and '%s' cannot have different values"
msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s» Ñ– «%s» не можуть бути різними"
-#: ../libnm-core/nm-setting-bond.c:1001
+#: ../libnm-core/nm-setting-bond.c:1010
#, c-format
msgid "'%s' option should be string"
msgstr "параметр «%s» має бути Ñ€Ñдком"
-#: ../libnm-core/nm-setting-bond.c:1015
+#: ../libnm-core/nm-setting-bond.c:1023
#, c-format
msgid "'%s' option is not valid with mode '%s'"
msgstr "параметр «%s» є коректним з режимом «%s»"
-#: ../libnm-core/nm-setting-bridge-port.c:301
+#: ../libnm-core/nm-setting-bridge-port.c:303
#: ../libnm-core/nm-setting-ovs-bridge.c:153
#: ../libnm-core/nm-setting-ovs-interface.c:269
#: ../libnm-core/nm-setting-ovs-port.c:172
@@ -11892,7 +12015,7 @@ msgstr "параметр «%s» є коректним з режимом «%s»"
msgid "missing setting"
msgstr "пропущено параметр"
-#: ../libnm-core/nm-setting-bridge-port.c:312
+#: ../libnm-core/nm-setting-bridge-port.c:314
#: ../libnm-core/nm-setting-ovs-interface.c:290
#: ../libnm-core/nm-setting-ovs-port.c:193
#: ../libnm-core/nm-setting-team-port.c:310
@@ -11904,97 +12027,108 @@ msgstr ""
"Ð”Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· параметром «%s» має бути вÑтановлено тип підлеглоÑÑ‚Ñ– «%s». "
"ЗаміÑÑ‚ÑŒ цього маємо «%s»."
-#: ../libnm-core/nm-setting-bridge.c:1030
+#: ../libnm-core/nm-setting-bridge.c:1201
#, c-format
msgid "value '%d' is out of range <%d-%d>"
msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%d» лежить поза діапазоном <%d-%d>"
-#: ../libnm-core/nm-setting-bridge.c:1047
+#: ../libnm-core/nm-setting-bridge.c:1218
msgid "is not a valid MAC address"
msgstr "не Ñ” коректною MAC-адреÑою"
-#: ../libnm-core/nm-setting-bridge.c:1088
+#: ../libnm-core/nm-setting-bridge.c:1259
msgid "the mask can't contain bits 0 (STP), 1 (MAC) or 2 (LACP)"
msgstr "маÑка не може міÑтити біти 0 (STP), 1 (MAC) Ñ– 2 (LACP)"
-#: ../libnm-core/nm-setting-bridge.c:1108
-#| msgid "is not a valid MAC address"
+#: ../libnm-core/nm-setting-bridge.c:1279
msgid "is not a valid link local MAC address"
msgstr "не Ñ” коректною MAC-адреÑою Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… з'єднань"
-#: ../libnm-core/nm-setting-bridge.c:1120
-#| msgid "'%s' is not a valid Ethernet port value"
+#: ../libnm-core/nm-setting-bridge.c:1291
msgid "is not a valid VLAN filtering protocol"
msgstr "не Ñ” коректним протоколом Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ VLAN"
-#: ../libnm-core/nm-setting-bridge.c:1133
-#| msgid "value is not a valid token"
+#: ../libnm-core/nm-setting-bridge.c:1304
msgid "is not a valid option"
msgstr "не є коректним параметром"
-#: ../libnm-core/nm-setting-connection.c:931
+#: ../libnm-core/nm-setting-bridge.c:1327
+#, c-format
+#| msgid "'%s' option is empty"
+msgid "'%s' option must be a power of 2"
+msgstr "ЗначеннÑм параметра «%s» має бути Ñтепінь 2"
+
+#: ../libnm-core/nm-setting-connection.c:952
#, c-format
msgid "setting required for connection of type '%s'"
msgstr "Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ «%s» потрібен параметр"
-#: ../libnm-core/nm-setting-connection.c:970
+#: ../libnm-core/nm-setting-connection.c:991
#, c-format
msgid "'%s' is not a valid UUID"
msgstr "«%s» не є коректним UUID"
-#: ../libnm-core/nm-setting-connection.c:1006
+#: ../libnm-core/nm-setting-connection.c:1027
#, c-format
msgid "connection type '%s' is not valid"
msgstr "тип з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» Ñ” некоректним"
-#: ../libnm-core/nm-setting-connection.c:1099
+#: ../libnm-core/nm-setting-connection.c:1120
#, c-format
msgid "Unknown slave type '%s'"
msgstr "Ðевідомий тип підлеглого «%s»"
-#: ../libnm-core/nm-setting-connection.c:1110
+#: ../libnm-core/nm-setting-connection.c:1131
#, c-format
msgid "Slave connections need a valid '%s' property"
msgstr "Ð”Ð»Ñ Ð¿Ñ–Ð´Ð»ÐµÐ³Ð»Ð¸Ñ… з'єднань потрібна коректна влаÑтивіÑÑ‚ÑŒ «%s»"
-#: ../libnm-core/nm-setting-connection.c:1131
+#: ../libnm-core/nm-setting-connection.c:1152
#, c-format
msgid "Cannot set '%s' without '%s'"
msgstr "Ðе можна вÑтановити «%s» без «%s»"
-#: ../libnm-core/nm-setting-connection.c:1145
+#: ../libnm-core/nm-setting-connection.c:1166
#, c-format
msgid "'%s' connections must be enslaved to '%s', not '%s'"
msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» мають підпорÑдковуватиÑÑ Â«%s», а не «%s»"
-#: ../libnm-core/nm-setting-connection.c:1159
+#: ../libnm-core/nm-setting-connection.c:1180
#, c-format
msgid "metered value %d is not valid"
msgstr "лічильне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d Ñ” некоректним"
-#: ../libnm-core/nm-setting-connection.c:1170
-#: ../libnm-core/nm-setting-connection.c:1181
-#: ../libnm-core/nm-setting-connection.c:1194
+#: ../libnm-core/nm-setting-connection.c:1191
+#: ../libnm-core/nm-setting-connection.c:1202
+#: ../libnm-core/nm-setting-connection.c:1215
#, c-format
msgid "value %d is not valid"
msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d Ñ” некоректним"
-#: ../libnm-core/nm-setting-connection.c:1207
+#: ../libnm-core/nm-setting-connection.c:1228
#, c-format
msgid "wait-device-timeout requires %s"
msgstr "wait-device-timeout потребує %s"
-#: ../libnm-core/nm-setting-connection.c:1229
+#: ../libnm-core/nm-setting-connection.c:1247
+msgid "DHCP option cannot be longer than 255 characters"
+msgstr "Довжина параметра DHCP не може перевищувати 255 Ñимволів"
+
+#: ../libnm-core/nm-setting-connection.c:1253
+msgid "MUD URL is not a valid URL"
+msgstr "ÐдреÑа MUD не Ñ” коректною адреÑою"
+
+#: ../libnm-core/nm-setting-connection.c:1275
#, c-format
msgid "property type should be set to '%s'"
msgstr "тип влаÑтивоÑÑ‚Ñ– має бути вÑтановлено у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s»"
-#: ../libnm-core/nm-setting-connection.c:1244
+#: ../libnm-core/nm-setting-connection.c:1290
#, c-format
msgid "slave-type '%s' requires a '%s' setting in the connection"
msgstr "тип підлеглого з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Â«%s» потребує параметра «%s» у з'єднанні"
-#: ../libnm-core/nm-setting-connection.c:1254
+#: ../libnm-core/nm-setting-connection.c:1300
#, c-format
msgid ""
"Detect a slave connection with '%s' set and a port type '%s'. '%s' should be "
@@ -12003,7 +12137,7 @@ msgstr ""
"Визначити підлегле з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ñ– вÑтановленим «%s» Ñ– типом порту «%s». «%s» "
"Ñлід вÑтановити у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s»"
-#: ../libnm-core/nm-setting-connection.c:1271
+#: ../libnm-core/nm-setting-connection.c:1317
#, c-format
msgid "A slave connection with '%s' set to '%s' cannot have a '%s' setting"
msgstr ""
@@ -12107,287 +12241,287 @@ msgstr ""
msgid "mtu can be at most %u but it is %u"
msgstr "mtu не може перевищувати %u, але маємо %u"
-#: ../libnm-core/nm-setting-ip-config.c:107
+#: ../libnm-core/nm-setting-ip-config.c:109
#, c-format
msgid "Missing IPv4 address"
msgstr "Ðе вказано адреÑи IPv4"
-#: ../libnm-core/nm-setting-ip-config.c:107
+#: ../libnm-core/nm-setting-ip-config.c:109
#, c-format
msgid "Missing IPv6 address"
msgstr "Ðе вказано адреÑи IPv6"
-#: ../libnm-core/nm-setting-ip-config.c:112
+#: ../libnm-core/nm-setting-ip-config.c:114
#, c-format
msgid "Invalid IPv4 address '%s'"
msgstr "Ðекоректна адреÑа IPv4, «%s»"
-#: ../libnm-core/nm-setting-ip-config.c:112
+#: ../libnm-core/nm-setting-ip-config.c:114
#, c-format
msgid "Invalid IPv6 address '%s'"
msgstr "Ðекоректна адреÑа IPv6, «%s»"
-#: ../libnm-core/nm-setting-ip-config.c:127
+#: ../libnm-core/nm-setting-ip-config.c:129
#, c-format
msgid "Invalid IPv4 address prefix '%u'"
msgstr "Ðекоректний Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð°Ð´Ñ€ÐµÑи IPv4, «%u»"
-#: ../libnm-core/nm-setting-ip-config.c:127
+#: ../libnm-core/nm-setting-ip-config.c:129
#, c-format
msgid "Invalid IPv6 address prefix '%u'"
msgstr "Ðекоректний Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð°Ð´Ñ€ÐµÑи IPv6, «%u»"
-#: ../libnm-core/nm-setting-ip-config.c:142
+#: ../libnm-core/nm-setting-ip-config.c:144
#, c-format
msgid "Invalid routing metric '%s'"
msgstr "Ðекоректна метрика маршрутизації, «%s»"
-#: ../libnm-core/nm-setting-ip-config.c:1269
+#: ../libnm-core/nm-setting-ip-config.c:1271
#: ../libnm-core/nm-setting-sriov.c:413
msgid "unknown attribute"
msgstr "невідомий атрибут"
-#: ../libnm-core/nm-setting-ip-config.c:1279
+#: ../libnm-core/nm-setting-ip-config.c:1281
#: ../libnm-core/nm-setting-sriov.c:423
#, c-format
msgid "invalid attribute type '%s'"
msgstr "некоректний тип атрибута «%s»"
-#: ../libnm-core/nm-setting-ip-config.c:1290
+#: ../libnm-core/nm-setting-ip-config.c:1292
#, c-format
msgid "attribute is not valid for a IPv4 route"
msgstr "атрибут не Ñ” коректним Ð´Ð»Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ñ–Ñ— IPv4"
-#: ../libnm-core/nm-setting-ip-config.c:1291
+#: ../libnm-core/nm-setting-ip-config.c:1293
#, c-format
msgid "attribute is not valid for a IPv6 route"
msgstr "атрибут не Ñ” коректним Ð´Ð»Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ñ–Ñ— IPv6"
-#: ../libnm-core/nm-setting-ip-config.c:1305
-#: ../libnm-core/nm-setting-ip-config.c:1333
+#: ../libnm-core/nm-setting-ip-config.c:1307
+#: ../libnm-core/nm-setting-ip-config.c:1335
#, c-format
msgid "'%s' is not a valid IPv4 address"
msgstr "«%s» не Ñ” коректною адреÑою IPv4"
-#: ../libnm-core/nm-setting-ip-config.c:1306
-#: ../libnm-core/nm-setting-ip-config.c:1334
+#: ../libnm-core/nm-setting-ip-config.c:1308
+#: ../libnm-core/nm-setting-ip-config.c:1336
#, c-format
msgid "'%s' is not a valid IPv6 address"
msgstr "«%s» не Ñ” коректною адреÑою IPv6"
-#: ../libnm-core/nm-setting-ip-config.c:1324
+#: ../libnm-core/nm-setting-ip-config.c:1326
#, c-format
msgid "invalid prefix %s"
msgstr "некоректний Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ %s"
-#: ../libnm-core/nm-setting-ip-config.c:2500
+#: ../libnm-core/nm-setting-ip-config.c:2502
msgid "invalid priority"
msgstr "некоректна пріоритетніÑÑ‚ÑŒ"
-#: ../libnm-core/nm-setting-ip-config.c:2511
+#: ../libnm-core/nm-setting-ip-config.c:2513
msgid "missing table"
msgstr "не вказано таблиці"
-#: ../libnm-core/nm-setting-ip-config.c:2517
+#: ../libnm-core/nm-setting-ip-config.c:2519
msgid "invalid action"
msgstr "некоректна діÑ"
-#: ../libnm-core/nm-setting-ip-config.c:2524
+#: ../libnm-core/nm-setting-ip-config.c:2526
msgid "has from/src but the prefix-length is zero"
msgstr ""
"міÑтить from/src, але Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸ префікÑа (prefix-length) Ñ” нульовим"
-#: ../libnm-core/nm-setting-ip-config.c:2531
+#: ../libnm-core/nm-setting-ip-config.c:2533
msgid "missing from/src for a non zero prefix-length"
msgstr "пропущено from/src Ð´Ð»Ñ Ð½ÐµÐ½ÑƒÐ»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸ префікÑа"
-#: ../libnm-core/nm-setting-ip-config.c:2536
+#: ../libnm-core/nm-setting-ip-config.c:2538
msgid "invalid from/src"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ from/src"
-#: ../libnm-core/nm-setting-ip-config.c:2541
+#: ../libnm-core/nm-setting-ip-config.c:2543
msgid "invalid prefix length for from/src"
msgstr "некоректна довжина префікÑа Ð´Ð»Ñ from/src"
-#: ../libnm-core/nm-setting-ip-config.c:2548
+#: ../libnm-core/nm-setting-ip-config.c:2550
msgid "has to/dst but the prefix-length is zero"
msgstr ""
"міÑтить to/dst, але Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸ префікÑа (prefix-length) Ñ” нульовим"
-#: ../libnm-core/nm-setting-ip-config.c:2555
+#: ../libnm-core/nm-setting-ip-config.c:2557
msgid "missing to/dst for a non zero prefix-length"
msgstr "пропущено to/dst Ð´Ð»Ñ Ð½ÐµÐ½ÑƒÐ»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸ префікÑа"
-#: ../libnm-core/nm-setting-ip-config.c:2560
+#: ../libnm-core/nm-setting-ip-config.c:2562
msgid "invalid to/dst"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ to/dst"
-#: ../libnm-core/nm-setting-ip-config.c:2565
+#: ../libnm-core/nm-setting-ip-config.c:2567
msgid "invalid prefix length for to/dst"
msgstr "некоректна довжина префікÑа Ð´Ð»Ñ to/dst"
-#: ../libnm-core/nm-setting-ip-config.c:2573
+#: ../libnm-core/nm-setting-ip-config.c:2575
msgid "invalid iifname"
msgstr "некоректна назва інтерфейÑу"
-#: ../libnm-core/nm-setting-ip-config.c:2581
+#: ../libnm-core/nm-setting-ip-config.c:2583
msgid "invalid oifname"
msgstr "некоректна назва інтерфейÑу (oifname)"
-#: ../libnm-core/nm-setting-ip-config.c:2587
+#: ../libnm-core/nm-setting-ip-config.c:2589
msgid "invalid source port range"
msgstr "некоректний діапазон номерів порту джерела"
-#: ../libnm-core/nm-setting-ip-config.c:2593
+#: ../libnm-core/nm-setting-ip-config.c:2595
msgid "invalid destination port range"
msgstr "некоректний діапазон номерів порту призначеннÑ"
-#: ../libnm-core/nm-setting-ip-config.c:2601
+#: ../libnm-core/nm-setting-ip-config.c:2603
msgid "suppress_prefixlength out of range"
msgstr "suppress_prefixlength поза припуÑтимим діапазоном"
-#: ../libnm-core/nm-setting-ip-config.c:2606
+#: ../libnm-core/nm-setting-ip-config.c:2608
msgid "suppress_prefixlength is only allowed with the to-table action"
msgstr ""
"suppress_prefixlength можна викориÑтовувати лише разом із дією to-table"
-#: ../libnm-core/nm-setting-ip-config.c:2713
+#: ../libnm-core/nm-setting-ip-config.c:2715
#, c-format
msgid "duplicate key %s"
msgstr "дублікат ключа %s"
-#: ../libnm-core/nm-setting-ip-config.c:2727
+#: ../libnm-core/nm-setting-ip-config.c:2729
#, c-format
msgid "invalid key \"%s\""
msgstr "некоректний ключ «%s»"
-#: ../libnm-core/nm-setting-ip-config.c:2740
+#: ../libnm-core/nm-setting-ip-config.c:2742
#, c-format
msgid "invalid variant type '%s' for \"%s\""
msgstr "некоректний тип варіанта «%s» Ð´Ð»Ñ Â«%s»"
-#: ../libnm-core/nm-setting-ip-config.c:2749
+#: ../libnm-core/nm-setting-ip-config.c:2751
msgid "missing \""
msgstr "не виÑтачає \""
-#: ../libnm-core/nm-setting-ip-config.c:2755
+#: ../libnm-core/nm-setting-ip-config.c:2757
msgid "invalid \""
msgstr "некоректна \""
-#: ../libnm-core/nm-setting-ip-config.c:2952
+#: ../libnm-core/nm-setting-ip-config.c:2954
msgid "Unsupported to-string-flags argument"
msgstr "Ðепідтримуваний аргумент to-string-flags"
-#: ../libnm-core/nm-setting-ip-config.c:2959
+#: ../libnm-core/nm-setting-ip-config.c:2961
msgid "Unsupported extra-argument"
msgstr "Ðепідтримуваний додатковий аргумент"
-#: ../libnm-core/nm-setting-ip-config.c:3226
+#: ../libnm-core/nm-setting-ip-config.c:3228
#, c-format
msgid "unsupported key \"%s\""
msgstr "непідтримуваний ключ «%s»"
-#: ../libnm-core/nm-setting-ip-config.c:3231
+#: ../libnm-core/nm-setting-ip-config.c:3233
#, c-format
msgid "duplicate key \"%s\""
msgstr "дублікат ключа «%s»"
-#: ../libnm-core/nm-setting-ip-config.c:3236
+#: ../libnm-core/nm-setting-ip-config.c:3238
#, c-format
msgid "invalid value for \"%s\""
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s»"
-#: ../libnm-core/nm-setting-ip-config.c:3246
+#: ../libnm-core/nm-setting-ip-config.c:3248
msgid "empty text does not describe a rule"
msgstr "порожній текÑÑ‚ не опиÑує правило"
-#: ../libnm-core/nm-setting-ip-config.c:3252
+#: ../libnm-core/nm-setting-ip-config.c:3254
#, c-format
msgid "missing argument for \"%s\""
msgstr "пропущено аргумент «%s»"
-#: ../libnm-core/nm-setting-ip-config.c:3264
+#: ../libnm-core/nm-setting-ip-config.c:3266
msgid "invalid \"from\" part"
msgstr "некоректна чаÑтина «from»"
-#: ../libnm-core/nm-setting-ip-config.c:3278
+#: ../libnm-core/nm-setting-ip-config.c:3280
msgid "invalid \"to\" part"
msgstr "некоректна чаÑтина «to»"
-#: ../libnm-core/nm-setting-ip-config.c:3287
+#: ../libnm-core/nm-setting-ip-config.c:3289
#, c-format
msgid "cannot detect address family for rule"
msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ ÑімейÑтво Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°"
-#: ../libnm-core/nm-setting-ip-config.c:3347
-#: ../libnm-core/nm-setting-ip-config.c:3441
+#: ../libnm-core/nm-setting-ip-config.c:3349
+#: ../libnm-core/nm-setting-ip-config.c:3443
#, c-format
msgid "rule is invalid: %s"
msgstr "правило є некоректним: %s"
-#: ../libnm-core/nm-setting-ip-config.c:3424
+#: ../libnm-core/nm-setting-ip-config.c:3426
msgid "invalid address family"
msgstr "некоректне ÑімейÑтво адреÑ"
-#: ../libnm-core/nm-setting-ip-config.c:4697
+#: ../libnm-core/nm-setting-ip-config.c:4699
#, c-format
msgid "rule #%u is invalid: %s"
msgstr "правило %u є некоректним: %s"
-#: ../libnm-core/nm-setting-ip-config.c:4953
+#: ../libnm-core/nm-setting-ip-config.c:4955
#, c-format
msgid "%d. DNS server address is invalid"
msgstr "%d. ÐдреÑа Ñервера DNS Ñ” некоректною."
-#: ../libnm-core/nm-setting-ip-config.c:4969
+#: ../libnm-core/nm-setting-ip-config.c:4971
#, c-format
msgid "%d. IP address is invalid"
msgstr "%d. IP-адреÑа Ñ” некоректною."
-#: ../libnm-core/nm-setting-ip-config.c:4981
+#: ../libnm-core/nm-setting-ip-config.c:4983
#, c-format
msgid "%d. IP address has 'label' property with invalid type"
msgstr "%d. IP-адреÑа має влаÑтивіÑÑ‚ÑŒ «label» некоректного типу"
-#: ../libnm-core/nm-setting-ip-config.c:4990
+#: ../libnm-core/nm-setting-ip-config.c:4992
#, c-format
msgid "%d. IP address has invalid label '%s'"
msgstr "%d. IP-адреÑа має некоректну мітку, «%s»"
-#: ../libnm-core/nm-setting-ip-config.c:5004
+#: ../libnm-core/nm-setting-ip-config.c:5006
msgid "gateway cannot be set if there are no addresses configured"
msgstr "шлюз не може бути вÑтановлено, Ñкщо не налаштовано адреÑ"
-#: ../libnm-core/nm-setting-ip-config.c:5013
+#: ../libnm-core/nm-setting-ip-config.c:5015
msgid "gateway is invalid"
msgstr "шлюз є некоректним"
-#: ../libnm-core/nm-setting-ip-config.c:5027
+#: ../libnm-core/nm-setting-ip-config.c:5029
#, c-format
msgid "%d. route is invalid"
msgstr "%d. Ðекоректний маршрут"
-#: ../libnm-core/nm-setting-ip-config.c:5043
+#: ../libnm-core/nm-setting-ip-config.c:5045
#, c-format
msgid "%u. rule has wrong address-family"
msgstr "%u. у правилі вказано помилкове ÑімейÑтво адреÑ"
-#: ../libnm-core/nm-setting-ip-config.c:5052
+#: ../libnm-core/nm-setting-ip-config.c:5054
#, c-format
msgid "%u. rule is invalid: %s"
msgstr "%u. правило є некоректним: %s"
-#: ../libnm-core/nm-setting-ip-config.c:5066
+#: ../libnm-core/nm-setting-ip-config.c:5068
#, c-format
msgid "'%s' is not a valid IAID"
msgstr "«%s» не є коректним IAID"
-#: ../libnm-core/nm-setting-ip-config.c:5080
+#: ../libnm-core/nm-setting-ip-config.c:5082
#, c-format
msgid "the property cannot be set when '%s' is disabled"
msgstr "влаÑтивіÑÑ‚ÑŒ не можна вÑтановлювати, Ñкщо вимкнено «%s»"
-#: ../libnm-core/nm-setting-ip-config.c:5102
+#: ../libnm-core/nm-setting-ip-config.c:5104
#, c-format
msgid "a gateway is incompatible with '%s'"
msgstr "шлюз Ñ” неÑуміÑним з «%s»"
@@ -12821,7 +12955,7 @@ msgstr "доÑÑгнуто макÑимальної кількоÑÑ‚Ñ– запиÑ
msgid "invalid key \"%s\": %s"
msgstr "некоректний ключ «%s»: %s"
-#: ../libnm-core/nm-setting-user.c:358 ../shared/nm-keyfile/nm-keyfile.c:856
+#: ../libnm-core/nm-setting-user.c:358 ../shared/nm-keyfile/nm-keyfile.c:850
#, c-format
msgid "invalid value for \"%s\": %s"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Â«%s»: %s"
@@ -12868,7 +13002,6 @@ msgstr "пароль не належить до коректного типу"
#: ../libnm-core/nm-setting-vpn.c:749 ../libnm-core/nm-setting-vpn.c:798
#, c-format
-#| msgid "interface name must not be empty"
msgid "secret name cannot be empty"
msgstr "назва реєÑтраційного запиÑу не може бути порожньою"
@@ -13282,126 +13415,126 @@ msgstr "Підтримки архівів libtool не передбачено (%
msgid "Could not find \"%s\" binary"
msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ виконуваний файл «%s»"
-#: ../libnm-core/nm-utils.c:4506
+#: ../libnm-core/nm-utils.c:4504
msgid "unknown secret flags"
msgstr "невідомі прапорці реєÑтраційних даних"
-#: ../libnm-core/nm-utils.c:4516
+#: ../libnm-core/nm-utils.c:4514
msgid "conflicting secret flags"
msgstr "конфлікт прапорців реєÑтраційних даних"
-#: ../libnm-core/nm-utils.c:4527
+#: ../libnm-core/nm-utils.c:4525
msgid "secret flags must not be \"not-required\""
msgstr "прапорці реєÑтраційних даних не можуть бути «not-required»"
-#: ../libnm-core/nm-utils.c:4535
+#: ../libnm-core/nm-utils.c:4533
msgid "unsupported secret flags"
msgstr "непідтримувані прапорці реєÑтраційних даних"
-#: ../libnm-core/nm-utils.c:4565
+#: ../libnm-core/nm-utils.c:4563
msgid "can't be simultaneously disabled and enabled"
msgstr "не може бути одночаÑно вимкнено Ñ– увімкнено"
-#: ../libnm-core/nm-utils.c:4573
+#: ../libnm-core/nm-utils.c:4571
msgid "WPS is required"
msgstr "Потрібна WPS"
-#: ../libnm-core/nm-utils.c:4639
+#: ../libnm-core/nm-utils.c:4637
#, c-format
msgid "not a valid ethernet MAC address for mask at position %lld"
msgstr "некоректна адреÑа MAC ethernet Ð´Ð»Ñ Ð¼Ð°Ñки у позиції %lld"
-#: ../libnm-core/nm-utils.c:4654
+#: ../libnm-core/nm-utils.c:4652
#, c-format
msgid "not a valid ethernet MAC address #%u at position %lld"
msgstr "некоректна адреÑа MAC ethernet #%u у позиції %lld"
-#: ../libnm-core/nm-utils.c:5351
+#: ../libnm-core/nm-utils.c:5347
msgid "not valid utf-8"
msgstr "некоректні дані UTF-8"
-#: ../libnm-core/nm-utils.c:5372 ../libnm-core/nm-utils.c:5425
+#: ../libnm-core/nm-utils.c:5368 ../libnm-core/nm-utils.c:5421
msgid "is not a JSON object"
msgstr "не є об'єктом JSON"
-#: ../libnm-core/nm-utils.c:5401 ../libnm-core/nm-utils.c:5438
+#: ../libnm-core/nm-utils.c:5397 ../libnm-core/nm-utils.c:5434
msgid "value is NULL"
msgstr "значеннÑм Ñ” NULL"
-#: ../libnm-core/nm-utils.c:5401 ../libnm-core/nm-utils.c:5438
+#: ../libnm-core/nm-utils.c:5397 ../libnm-core/nm-utils.c:5434
msgid "value is empty"
msgstr "порожнє значеннÑ"
-#: ../libnm-core/nm-utils.c:5413
+#: ../libnm-core/nm-utils.c:5409
#, c-format
msgid "invalid JSON at position %d (%s)"
msgstr "некоректний код JSON на позиції %d (%s)"
-#: ../libnm-core/nm-utils.c:5575 ../libnm-core/nm-utils.c:5595
+#: ../libnm-core/nm-utils.c:5571 ../libnm-core/nm-utils.c:5591
msgid "unterminated escape sequence"
msgstr "незавершена екранована поÑлідовніÑÑ‚ÑŒ"
-#: ../libnm-core/nm-utils.c:5620
+#: ../libnm-core/nm-utils.c:5616
#, c-format
msgid "unknown attribute '%s'"
msgstr "невідомий атрибут «%s»"
-#: ../libnm-core/nm-utils.c:5635
+#: ../libnm-core/nm-utils.c:5631
#, c-format
msgid "missing key-value separator '%c' after '%s'"
msgstr "пропущено роздільник пар ключ-Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%c» піÑÐ»Ñ Â«%s»"
-#: ../libnm-core/nm-utils.c:5651
+#: ../libnm-core/nm-utils.c:5647
#, c-format
msgid "invalid uint32 value '%s' for attribute '%s'"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ uint32 «%s» атрибута «%s»"
-#: ../libnm-core/nm-utils.c:5660
+#: ../libnm-core/nm-utils.c:5656
#, c-format
msgid "invalid uint8 value '%s' for attribute '%s'"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ uint8 «%s» атрибута «%s»"
-#: ../libnm-core/nm-utils.c:5670
+#: ../libnm-core/nm-utils.c:5666
#, c-format
msgid "invalid boolean value '%s' for attribute '%s'"
msgstr "некоректне булеве Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s» атрибута «%s»"
-#: ../libnm-core/nm-utils.c:5680
+#: ../libnm-core/nm-utils.c:5676
#, c-format
msgid "unsupported attribute '%s' of type '%s'"
msgstr "непідтримуваний атрибут «%s» типу «%s»"
-#: ../libnm-core/nm-utils.c:6045
+#: ../libnm-core/nm-utils.c:6041
#, c-format
msgid "Bridge VLANs %d and %d are not sorted by ascending vid"
msgstr "VLAN міÑтка %d Ñ– %d не упорÑдковано за зроÑтаннÑм vid"
-#: ../libnm-core/nm-utils.c:6069
+#: ../libnm-core/nm-utils.c:6065
#, c-format
msgid "duplicate bridge VLAN vid %u"
msgstr "дублікат міÑтка vid VLAN %u"
-#: ../libnm-core/nm-utils.c:6081
+#: ../libnm-core/nm-utils.c:6077
msgid "only one VLAN can be the PVID"
msgstr "лише одна з VLAN може бути PVID"
-#: ../libnm-core/nm-utils.c:6131
+#: ../libnm-core/nm-utils.c:6127
#, c-format
msgid "unknown flags 0x%x"
msgstr "невідомі прапорці 0x%x"
-#: ../libnm-core/nm-utils.c:6141
+#: ../libnm-core/nm-utils.c:6137
msgid ""
"'fqdn-no-update' and 'fqdn-serv-update' flags cannot be set at the same time"
msgstr ""
"не можна одночаÑно вÑтановлювати прапорці «fqdn-no-update» Ñ– «fqdn-serv-"
"update»"
-#: ../libnm-core/nm-utils.c:6152
+#: ../libnm-core/nm-utils.c:6148
msgid "'fqdn-clear-flags' flag is incompatible with other FQDN flags"
msgstr "прапорець «fqdn-clear-flags» Ñ” неÑуміÑним із іншими прапорцÑми FQDN"
-#: ../libnm-core/nm-utils.c:6161
+#: ../libnm-core/nm-utils.c:6157
msgid "DHCPv6 does not support the E (encoded) FQDN flag"
msgstr "у DHCPv6 не передбачено підтримки Ð¿Ñ€Ð°Ð¿Ð¾Ñ€Ñ†Ñ E (закодовано) FQDN"
@@ -13972,36 +14105,36 @@ msgstr ""
"Правила ÑиÑтеми заборонÑÑŽÑ‚ÑŒ Ð²Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð°Ð±Ð¾ Ð²Ð¸Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ придатноÑÑ‚Ñ– до "
"з'єднаннÑ"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:2184
+#: ../shared/nm-glib-aux/nm-shared-utils.c:2202
#, c-format
msgid "object class '%s' has no property named '%s'"
msgstr "у клаÑÑ– об'єктів «%s» немає влаÑтивоÑÑ‚Ñ– із назвою «%s»"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:2191
+#: ../shared/nm-glib-aux/nm-shared-utils.c:2209
#, c-format
msgid "property '%s' of object class '%s' is not writable"
msgstr "влаÑтивіÑÑ‚ÑŒ «%s» клаÑу об'єктів «%s» Ñ” непридатною до запиÑу"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:2198
+#: ../shared/nm-glib-aux/nm-shared-utils.c:2216
#, c-format
msgid ""
"construct property \"%s\" for object '%s' can't be set after construction"
msgstr ""
"влаÑтивіÑÑ‚ÑŒ construct «%s» об'єкта «%s» не можна вÑтановлювати піÑÐ»Ñ Ð¿Ð¾Ð±ÑƒÐ´Ð¾Ð²Ð¸"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:2206
+#: ../shared/nm-glib-aux/nm-shared-utils.c:2224
#, c-format
msgid "'%s::%s' is not a valid property name; '%s' is not a GObject subtype"
msgstr "«%s::%s» не Ñ” коректною назвою влаÑтивоÑÑ‚Ñ–; «%s» не Ñ” підтипом GObject"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:2215
+#: ../shared/nm-glib-aux/nm-shared-utils.c:2233
#, c-format
msgid "unable to set property '%s' of type '%s' from value of type '%s'"
msgstr ""
"не вдалоÑÑ Ð²Ñтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ– «%s» типу «%s» на оÑнові Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "
"типу «%s»"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:2226
+#: ../shared/nm-glib-aux/nm-shared-utils.c:2244
#, c-format
msgid ""
"value \"%s\" of type '%s' is invalid or out of range for property '%s' of "
@@ -14010,260 +14143,267 @@ msgstr ""
"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s» типу «%s» Ñ” некоректним Ð´Ð»Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ– «%s» типу «%s» або не "
"належить до припуÑтимого діапазону значень"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:4549
+#: ../shared/nm-glib-aux/nm-shared-utils.c:4614
msgid "interface name is missing"
msgstr "пропущено назву інтерфейÑу"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:4555
+#: ../shared/nm-glib-aux/nm-shared-utils.c:4620
msgid "interface name is too short"
msgstr "назва інтерфейÑу Ñ” надто короткою"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:4564
+#: ../shared/nm-glib-aux/nm-shared-utils.c:4629
msgid "interface name is reserved"
msgstr "таку назву інтерфейÑу зарезервовано"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:4576
+#: ../shared/nm-glib-aux/nm-shared-utils.c:4641
msgid "interface name contains an invalid character"
msgstr "назва інтерфейÑу міÑтить некоректний Ñимвол"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:4582
+#: ../shared/nm-glib-aux/nm-shared-utils.c:4647
msgid "interface name is longer than 15 characters"
msgstr "назва інтерфейÑу Ñ” довшою за 15 Ñимволів"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:4605
+#: ../shared/nm-glib-aux/nm-shared-utils.c:4670
#, c-format
msgid "'%%' is not allowed in interface names"
msgstr "«%%» не можна викориÑтовувати у назвах інтерфейÑів"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:4618
+#: ../shared/nm-glib-aux/nm-shared-utils.c:4683
#, c-format
msgid "'%s' is not allowed as interface name"
msgstr "«%s» не можна викориÑтовувати Ñк назву інтерфейÑу"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:4639
+#: ../shared/nm-glib-aux/nm-shared-utils.c:4704
msgid ""
"interface name must be alphanumerical with no forward or backward slashes"
msgstr ""
"назва інтерфейÑу має ÑкладатиÑÑ Ð· літер Ñ– цифр без початкового Ñ– "
"завершального Ñимволів похилої риÑки"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:4656
+#: ../shared/nm-glib-aux/nm-shared-utils.c:4721
msgid "interface name must not be empty"
msgstr "назва інтерфейÑу не може бути порожньою"
-#: ../shared/nm-glib-aux/nm-shared-utils.c:4662
+#: ../shared/nm-glib-aux/nm-shared-utils.c:4727
msgid "interface name must be UTF-8 encoded"
msgstr "назва інтерфейÑу має бути набором Ñимволів у кодуванні UTF-8"
-#: ../shared/nm-keyfile/nm-keyfile-utils.c:242
+#: ../shared/nm-keyfile/nm-keyfile-utils.c:171
+#, c-format
+#| msgid "value cannot be interpreted as integer"
+msgid "Value cannot be interpreted as a list of numbers."
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ може бути оброблено Ñк ÑпиÑок чиÑел."
+
+#: ../shared/nm-keyfile/nm-keyfile-utils.c:307
#, c-format
msgid "value is not an integer in range [%lld, %lld]"
msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ Ñ” цілим чиÑлом у діапазоні [%lld, %lld]"
-#: ../shared/nm-keyfile/nm-keyfile.c:196
+#: ../shared/nm-keyfile/nm-keyfile.c:190
msgid "ignoring missing number"
msgstr "ігноруємо пропущене чиÑло"
-#: ../shared/nm-keyfile/nm-keyfile.c:204
+#: ../shared/nm-keyfile/nm-keyfile.c:198
#, c-format
msgid "ignoring invalid number '%s'"
msgstr "ігноруємо некоректне чиÑло «%s»"
-#: ../shared/nm-keyfile/nm-keyfile.c:225
+#: ../shared/nm-keyfile/nm-keyfile.c:219
#, c-format
msgid "ignoring invalid %s address: %s"
msgstr "ігноруємо некоректну адреÑу %s: %s"
-#: ../shared/nm-keyfile/nm-keyfile.c:268
+#: ../shared/nm-keyfile/nm-keyfile.c:262
#, c-format
msgid "ignoring invalid gateway '%s' for %s route"
msgstr "ігноруємо некоректний шлюз «%s» Ð´Ð»Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ñƒ %s"
-#: ../shared/nm-keyfile/nm-keyfile.c:292
+#: ../shared/nm-keyfile/nm-keyfile.c:286
#, c-format
msgid "ignoring invalid %s route: %s"
msgstr "ігноруємо некоректний маршрут %s: %s"
-#: ../shared/nm-keyfile/nm-keyfile.c:464
+#: ../shared/nm-keyfile/nm-keyfile.c:458
#, c-format
msgid "unexpected character '%c' for address %s: '%s' (position %td)"
msgstr "неочікуваний Ñимвол «%c» Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑи %s: «%s» (Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ %td)"
-#: ../shared/nm-keyfile/nm-keyfile.c:474
+#: ../shared/nm-keyfile/nm-keyfile.c:468
#, c-format
msgid "unexpected character '%c' for %s: '%s' (position %td)"
msgstr "неочікуваний Ñимвол «%c» Ð´Ð»Ñ %s: «%s» (Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ %td)"
-#: ../shared/nm-keyfile/nm-keyfile.c:483
+#: ../shared/nm-keyfile/nm-keyfile.c:477
#, c-format
msgid "unexpected character '%c' in prefix length for %s: '%s' (position %td)"
msgstr "неочікуваний Ñимвол «%c» у префікÑÑ– довжини Ð´Ð»Ñ %s: «%s» (Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ %td)"
-#: ../shared/nm-keyfile/nm-keyfile.c:494
+#: ../shared/nm-keyfile/nm-keyfile.c:488
#, c-format
msgid "garbage at the end of value %s: '%s'"
msgstr "зайві дані наприкінці Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s: «%s»"
-#: ../shared/nm-keyfile/nm-keyfile.c:500
+#: ../shared/nm-keyfile/nm-keyfile.c:494
#, c-format
msgid "deprecated semicolon at the end of value %s: '%s'"
msgstr "заÑтаріла крапка з комою наприкінці Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s: «%s»"
-#: ../shared/nm-keyfile/nm-keyfile.c:514
+#: ../shared/nm-keyfile/nm-keyfile.c:508
#, c-format
msgid "invalid prefix length for %s '%s', defaulting to %d"
msgstr "некоректний Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸ Ð´Ð»Ñ %s «%s», повертаємоÑÑ Ð´Ð¾ типового, %d"
-#: ../shared/nm-keyfile/nm-keyfile.c:521
+#: ../shared/nm-keyfile/nm-keyfile.c:515
#, c-format
msgid "missing prefix length for %s '%s', defaulting to %d"
msgstr "пропущено Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸ Ð´Ð»Ñ %s «%s», повертаємоÑÑ Ð´Ð¾ типового, %d"
-#: ../shared/nm-keyfile/nm-keyfile.c:894
+#: ../shared/nm-keyfile/nm-keyfile.c:888
#, c-format
msgid "ignoring invalid DNS server IPv%c address '%s'"
msgstr "ігноруємо некоректну адреÑу IPv%c Ñервера DNS «%s»"
-#: ../shared/nm-keyfile/nm-keyfile.c:990 ../shared/nm-keyfile/nm-keyfile.c:3143
-#, c-format
-msgid "ignoring invalid byte element '%d' (not between 0 and 255 inclusive)"
-msgstr ""
-"ігноруємо некоректний байтовий елемент «%d» (не у діапазоні від 0 до 255, "
-"включно)"
-
-#: ../shared/nm-keyfile/nm-keyfile.c:1001
+#: ../shared/nm-keyfile/nm-keyfile.c:972
msgid "ignoring invalid MAC address"
msgstr "ігноруємо некоректну MAC-адреÑу"
-#: ../shared/nm-keyfile/nm-keyfile.c:1260
+#: ../shared/nm-keyfile/nm-keyfile.c:1231
msgid "ignoring invalid SSID"
msgstr "ігноруємо некоректний SSID"
-#: ../shared/nm-keyfile/nm-keyfile.c:1276
+#: ../shared/nm-keyfile/nm-keyfile.c:1247
msgid "ignoring invalid raw password"
msgstr "ігноруємо некоректний необроблений пароль"
-#: ../shared/nm-keyfile/nm-keyfile.c:1416
+#: ../shared/nm-keyfile/nm-keyfile.c:1387
msgid "invalid key/cert value"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°/Ñертифіката"
-#: ../shared/nm-keyfile/nm-keyfile.c:1427
+#: ../shared/nm-keyfile/nm-keyfile.c:1398
#, c-format
msgid "invalid key/cert value path \"%s\""
msgstr "некоректний шлÑÑ… до ключа/Ñертифіката, «%s»"
-#: ../shared/nm-keyfile/nm-keyfile.c:1447
-#: ../shared/nm-keyfile/nm-keyfile.c:1530
+#: ../shared/nm-keyfile/nm-keyfile.c:1418
+#: ../shared/nm-keyfile/nm-keyfile.c:1501
#, c-format
msgid "certificate or key file '%s' does not exist"
msgstr "файла Ñертифіката або ключа «%s» не Ñ–Ñнує"
-#: ../shared/nm-keyfile/nm-keyfile.c:1456
+#: ../shared/nm-keyfile/nm-keyfile.c:1427
#, c-format
msgid "invalid PKCS#11 URI \"%s\""
msgstr "некоректна адреÑа PKCS#11 «%s»"
-#: ../shared/nm-keyfile/nm-keyfile.c:1500
+#: ../shared/nm-keyfile/nm-keyfile.c:1471
msgid "invalid key/cert value data:;base64, is not base64"
msgstr "некоректні дані Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°/Ñертифіката data:;base64, не Ñ” base64"
-#: ../shared/nm-keyfile/nm-keyfile.c:1509
+#: ../shared/nm-keyfile/nm-keyfile.c:1480
msgid "invalid key/cert value data:;base64,file://"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°/Ñертифіката data:;base64,file://"
-#: ../shared/nm-keyfile/nm-keyfile.c:1542
+#: ../shared/nm-keyfile/nm-keyfile.c:1513
msgid "invalid key/cert value is not a valid blob"
msgstr ""
"некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°/Ñертифіката, не Ñ” коректним Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%s» не Ñ” "
"коректним великим бінарним об'єктом"
-#: ../shared/nm-keyfile/nm-keyfile.c:1644
+#: ../shared/nm-keyfile/nm-keyfile.c:1615
#, c-format
msgid "invalid parity value '%s'"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð½Ð¾ÑÑ‚Ñ–, «%s»"
-#: ../shared/nm-keyfile/nm-keyfile.c:1661
-#: ../shared/nm-keyfile/nm-keyfile.c:3198
+#: ../shared/nm-keyfile/nm-keyfile.c:1632
+#: ../shared/nm-keyfile/nm-keyfile.c:3163
#, c-format
msgid "invalid setting: %s"
msgstr "некоректний параметр: %s"
-#: ../shared/nm-keyfile/nm-keyfile.c:1678
+#: ../shared/nm-keyfile/nm-keyfile.c:1649
#, c-format
msgid "ignoring invalid team configuration: %s"
msgstr "ігноруємо некоректне Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸: %s"
-#: ../shared/nm-keyfile/nm-keyfile.c:1756
+#: ../shared/nm-keyfile/nm-keyfile.c:1727
#, c-format
msgid "invalid qdisc: %s"
msgstr "некоректний qdisc: %s"
-#: ../shared/nm-keyfile/nm-keyfile.c:1802
+#: ../shared/nm-keyfile/nm-keyfile.c:1773
#, c-format
msgid "invalid tfilter: %s"
msgstr "некоректний tfilter: %s"
-#: ../shared/nm-keyfile/nm-keyfile.c:3042
+#: ../shared/nm-keyfile/nm-keyfile.c:3007
#, c-format
msgid "error loading setting value: %s"
msgstr "помилка під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°: %s"
-#: ../shared/nm-keyfile/nm-keyfile.c:3070
-#: ../shared/nm-keyfile/nm-keyfile.c:3081
-#: ../shared/nm-keyfile/nm-keyfile.c:3099
-#: ../shared/nm-keyfile/nm-keyfile.c:3110
-#: ../shared/nm-keyfile/nm-keyfile.c:3121
-#: ../shared/nm-keyfile/nm-keyfile.c:3173
-#: ../shared/nm-keyfile/nm-keyfile.c:3184
+#: ../shared/nm-keyfile/nm-keyfile.c:3035
+#: ../shared/nm-keyfile/nm-keyfile.c:3046
+#: ../shared/nm-keyfile/nm-keyfile.c:3064
+#: ../shared/nm-keyfile/nm-keyfile.c:3075
+#: ../shared/nm-keyfile/nm-keyfile.c:3086
+#: ../shared/nm-keyfile/nm-keyfile.c:3138
+#: ../shared/nm-keyfile/nm-keyfile.c:3149
msgid "value cannot be interpreted as integer"
msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ може бути оброблено Ñк ціле чиÑло"
-#: ../shared/nm-keyfile/nm-keyfile.c:3219
+#: ../shared/nm-keyfile/nm-keyfile.c:3108
+#, c-format
+#| msgid "ignoring invalid byte element '%d' (not between 0 and 255 inclusive)"
+msgid "ignoring invalid byte element '%u' (not between 0 and 255 inclusive)"
+msgstr ""
+"ігноруємо некоректний байтовий елемент «%u» (не у діапазоні від 0 до 255, "
+"включно)"
+
+#: ../shared/nm-keyfile/nm-keyfile.c:3184
#, c-format
msgid "invalid setting name '%s'"
msgstr "некоректна назва параметра, «%s»"
-#: ../shared/nm-keyfile/nm-keyfile.c:3264
+#: ../shared/nm-keyfile/nm-keyfile.c:3229
#, c-format
msgid "invalid key '%s.%s'"
msgstr "некоректний ключ «%s.%s»"
-#: ../shared/nm-keyfile/nm-keyfile.c:3279
+#: ../shared/nm-keyfile/nm-keyfile.c:3244
#, c-format
msgid "key '%s.%s' is not boolean"
msgstr "ключ «%s.%s» не Ñ” булевим значеннÑм"
-#: ../shared/nm-keyfile/nm-keyfile.c:3336
+#: ../shared/nm-keyfile/nm-keyfile.c:3301
#, c-format
msgid "invalid peer public key in section '%s'"
msgstr "некоректний відкритий ключ вузла у розділі «%s»"
-#: ../shared/nm-keyfile/nm-keyfile.c:3348
+#: ../shared/nm-keyfile/nm-keyfile.c:3313
#, c-format
msgid "key '%s.%s' is not a valid 256 bit key in base64 encoding"
msgstr "ключ «%s.%s» не є коректним 256-бітовим ключем у кодуванні base64"
-#: ../shared/nm-keyfile/nm-keyfile.c:3361
+#: ../shared/nm-keyfile/nm-keyfile.c:3326
#, c-format
msgid "key '%s.%s' is not a valid secret flag"
msgstr "ключ «%s.%s» не Ñ” коректним прапорцем реєÑтраційних даних"
-#: ../shared/nm-keyfile/nm-keyfile.c:3373
+#: ../shared/nm-keyfile/nm-keyfile.c:3338
#, c-format
msgid "key '%s.%s' is not a integer in range 0 to 2^32"
msgstr "ключ «%s.%s» не Ñ” цілими чиÑлом у діапазоні від 0 до 2^32"
-#: ../shared/nm-keyfile/nm-keyfile.c:3385
+#: ../shared/nm-keyfile/nm-keyfile.c:3350
#, c-format
msgid "key '%s.%s' is not a valid endpoint"
msgstr "ключ «%s.%s» не є коректною кінцевою точкою"
-#: ../shared/nm-keyfile/nm-keyfile.c:3407
+#: ../shared/nm-keyfile/nm-keyfile.c:3372
#, c-format
msgid "key '%s.%s' has invalid allowed-ips"
msgstr "Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð° «%s.%s» вказано некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ allowed-ips"
-#: ../shared/nm-keyfile/nm-keyfile.c:3419
+#: ../shared/nm-keyfile/nm-keyfile.c:3384
#, c-format
msgid "peer '%s' is invalid: %s"
msgstr "вузол «%s» є некоректним: %s"
@@ -14329,27 +14469,27 @@ msgid "Failed to read configuration: %s\n"
msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ налаштуваннÑ: %s\n"
#. Logging/debugging
-#: ../src/main.c:184 ../src/nm-iface-helper.c:296
+#: ../src/main.c:184 ../src/nm-iface-helper.c:297
msgid "Print NetworkManager version and exit"
msgstr "ВивеÑти дані щодо верÑÑ–Ñ— NetworkManager Ñ– завершити роботу"
-#: ../src/main.c:185 ../src/nm-iface-helper.c:297
+#: ../src/main.c:185 ../src/nm-iface-helper.c:298
msgid "Don't become a daemon"
msgstr "Ðе переходити у Ñтан фонової Ñлужби"
-#: ../src/main.c:186 ../src/nm-iface-helper.c:299
+#: ../src/main.c:186 ../src/nm-iface-helper.c:300
#, c-format
msgid "Log level: one of [%s]"
msgstr "Рівень докладноÑÑ‚Ñ– журналу: одне з таких значень: [%s]"
-#: ../src/main.c:188 ../src/nm-iface-helper.c:301
+#: ../src/main.c:188 ../src/nm-iface-helper.c:302
#, c-format
msgid "Log domains separated by ',': any combination of [%s]"
msgstr ""
"СпиÑок доменів Ð´Ð»Ñ Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ, відокремлених Ñимволом «,»: будь-Ñка "
"ÐºÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ Ð· [%s]"
-#: ../src/main.c:190 ../src/nm-iface-helper.c:303
+#: ../src/main.c:190 ../src/nm-iface-helper.c:304
msgid "Make all warnings fatal"
msgstr "Вважати вÑÑ– Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°Ð¼Ð¸"
@@ -14374,14 +14514,14 @@ msgstr ""
"з Ñкими Ñлід пов'Ñзувати картки бездротового доÑтупу на вашому\n"
"комп'ютері."
-#: ../src/main.c:325 ../src/main-utils.c:275 ../src/nm-iface-helper.c:444
+#: ../src/main.c:325 ../src/main-utils.c:275 ../src/nm-iface-helper.c:445
#, c-format
msgid "%s. Please use --help to see a list of valid options.\n"
msgstr ""
"%s. Щоб ознайомитиÑÑ Ð·Ñ– ÑпиÑком параметрів, ÑкориÑтайтеÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ --"
"help.\n"
-#: ../src/main.c:358 ../src/nm-iface-helper.c:457
+#: ../src/main.c:358 ../src/nm-iface-helper.c:458
#, c-format
msgid "Could not daemonize: %s [error %u]\n"
msgstr "Ðе вдалоÑÑ Ñтворити фонову Ñлужбу: %s [помилка %u]\n"
@@ -14416,11 +14556,11 @@ msgstr "%s вже працює (pid %ld)\n"
msgid "You must be root to run %s!\n"
msgstr "Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ %s потрібно перейти у режим root!\n"
-#: ../src/dhcp/nm-dhcp-dhclient-utils.c:303
+#: ../src/dhcp/nm-dhcp-dhclient-utils.c:324
msgid "# Created by NetworkManager\n"
msgstr "# Створено за допомогою NetworkManager\n"
-#: ../src/dhcp/nm-dhcp-dhclient-utils.c:316
+#: ../src/dhcp/nm-dhcp-dhclient-utils.c:337
#, c-format
msgid ""
"# Merged from %s\n"
@@ -14730,7 +14870,7 @@ msgstr "СпиÑок додатків, відокремлених комами (
msgid "Quit after initial configuration"
msgstr "Вийти піÑÐ»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ð³Ð¾ налаштовуваннÑ"
-#: ../src/nm-config.c:593 ../src/nm-iface-helper.c:298
+#: ../src/nm-config.c:593 ../src/nm-iface-helper.c:299
msgid "Don't become a daemon, and log to stderr"
msgstr ""
"Ðе переходити у Ñтан фонової Ñлужби Ñ– запиÑувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ до "
@@ -14758,83 +14898,83 @@ msgid "Show NetworkManager options"
msgstr "Показати параметри NetworkManager"
#. Interface/IP config
-#: ../src/nm-iface-helper.c:278
+#: ../src/nm-iface-helper.c:279
msgid "The interface to manage"
msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ"
-#: ../src/nm-iface-helper.c:279
+#: ../src/nm-iface-helper.c:280
msgid "Connection UUID"
msgstr "UUID з'єднаннÑ"
-#: ../src/nm-iface-helper.c:280
+#: ../src/nm-iface-helper.c:281
msgid "Connection Token for Stable IDs"
msgstr "Жетон з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñтабільних ідентифікаторів"
-#: ../src/nm-iface-helper.c:281
+#: ../src/nm-iface-helper.c:282
msgid "Whether to manage IPv6 SLAAC"
msgstr "Чи Ñлід керувати SLAAC IPv6"
-#: ../src/nm-iface-helper.c:282
+#: ../src/nm-iface-helper.c:283
msgid "Whether SLAAC must be successful"
msgstr "Чи має бути SLAAC уÑпішним"
-#: ../src/nm-iface-helper.c:283
+#: ../src/nm-iface-helper.c:284
msgid "Use an IPv6 temporary privacy address"
msgstr "ВикориÑтовувати тимчаÑову приватну адреÑу IPv6"
-#: ../src/nm-iface-helper.c:284
+#: ../src/nm-iface-helper.c:285
msgid "Current DHCPv4 address"
msgstr "Поточна адреÑа DHCPv4"
-#: ../src/nm-iface-helper.c:285
+#: ../src/nm-iface-helper.c:286
msgid "Whether DHCPv4 must be successful"
msgstr "Чи має DHCPv4 бути уÑпішним"
-#: ../src/nm-iface-helper.c:286
+#: ../src/nm-iface-helper.c:287
msgid "Hex-encoded DHCPv4 client ID"
msgstr "Закодований у шіÑтнадцÑткову форму ідентифікатор клієнта DHCPv4"
-#: ../src/nm-iface-helper.c:287
+#: ../src/nm-iface-helper.c:288
msgid "Hostname to send to DHCP server"
msgstr "Ðазва вузла Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñервер DHCP"
-#: ../src/nm-iface-helper.c:287
+#: ../src/nm-iface-helper.c:288
msgid "barbar"
msgstr "щоÑьщоÑÑŒ"
-#: ../src/nm-iface-helper.c:288
+#: ../src/nm-iface-helper.c:289
msgid "FQDN to send to DHCP server"
msgstr "Повна назва вузла (FQDN) Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñервер DHCP"
-#: ../src/nm-iface-helper.c:288
+#: ../src/nm-iface-helper.c:289
msgid "host.domain.org"
msgstr "вузол.домен.org"
-#: ../src/nm-iface-helper.c:289
+#: ../src/nm-iface-helper.c:290
msgid "Route priority for IPv4"
msgstr "Пріоритет маршруту Ð´Ð»Ñ IPv4"
-#: ../src/nm-iface-helper.c:289
+#: ../src/nm-iface-helper.c:290
msgid "0"
msgstr "0"
-#: ../src/nm-iface-helper.c:290
+#: ../src/nm-iface-helper.c:291
msgid "Route priority for IPv6"
msgstr "Пріоритет маршруту Ð´Ð»Ñ IPv6"
-#: ../src/nm-iface-helper.c:290
+#: ../src/nm-iface-helper.c:291
msgid "1024"
msgstr "1024"
-#: ../src/nm-iface-helper.c:291
+#: ../src/nm-iface-helper.c:292
msgid "Hex-encoded Interface Identifier"
msgstr "Закодований у шіÑтнадцÑткове чиÑло ідентифікатор інтерфейÑу"
-#: ../src/nm-iface-helper.c:292
+#: ../src/nm-iface-helper.c:293
msgid "IPv6 SLAAC address generation mode"
msgstr "Режим ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи SLAAC IPv6"
-#: ../src/nm-iface-helper.c:293
+#: ../src/nm-iface-helper.c:294
msgid ""
"The logging backend configuration value. See logging.backend in "
"NetworkManager.conf"
@@ -14842,7 +14982,7 @@ msgstr ""
"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ. Див. logging.backend у "
"NetworkManager.conf"
-#: ../src/nm-iface-helper.c:313
+#: ../src/nm-iface-helper.c:314
msgid ""
"nm-iface-helper is a small, standalone process that manages a single network "
"interface."
@@ -14850,29 +14990,29 @@ msgstr ""
"nm-iface-helper — малий окремий процеÑ, Ñкий керує окремим інтерфейÑом "
"мережі."
-#: ../src/nm-iface-helper.c:424
+#: ../src/nm-iface-helper.c:425
#, c-format
msgid "An interface name and UUID are required\n"
msgstr "Потрібні назва Ñ– UUID інтерфейÑу\n"
-#: ../src/nm-iface-helper.c:431
+#: ../src/nm-iface-helper.c:432
#, c-format
msgid "Failed to find interface index for %s (%s)\n"
msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ покажчик інтерфейÑу Ð´Ð»Ñ %s (%s)\n"
-#: ../src/nm-iface-helper.c:449
+#: ../src/nm-iface-helper.c:450
#, c-format
msgid "Ignoring unrecognized log domain(s) '%s' passed on command line.\n"
msgstr ""
"Ігноруємо нерозпізнані домени журналюваннÑ, «%s», передані за допомогою "
"командного Ñ€Ñдка.\n"
-#: ../src/nm-iface-helper.c:490
+#: ../src/nm-iface-helper.c:491
#, c-format
msgid "(%s): Invalid IID %s\n"
msgstr "(%s): некоректний IID %s\n"
-#: ../src/nm-iface-helper.c:501
+#: ../src/nm-iface-helper.c:502
#, c-format
msgid "(%s): Invalid DHCP client-id %s\n"
msgstr "(%s): некоректний ідентифікатор клієнта DHCP %s\n"
diff --git a/shared/nm-glib-aux/nm-macros-internal.h b/shared/nm-glib-aux/nm-macros-internal.h
index d5a8513e54..f56ed85699 100644
--- a/shared/nm-glib-aux/nm-macros-internal.h
+++ b/shared/nm-glib-aux/nm-macros-internal.h
@@ -630,6 +630,14 @@ NM_G_ERROR_MSG (GError *error)
NM_CONSTCAST_FULL (type, (obj), _obj, GObject, ##__VA_ARGS__); \
})
+#define NM_ENSURE_NOT_NULL(ptr) \
+ ({ \
+ typeof (ptr) _ptr = (ptr); \
+ \
+ nm_assert (_ptr != NULL); \
+ _ptr; \
+ })
+
#if _NM_CC_SUPPORT_GENERIC
/* returns @value, if the type of @value matches @type.
* This requires support for C11 _Generic(). If no support is
@@ -929,23 +937,38 @@ nm_streq0 (const char *s1, const char *s2)
#define NM_STR_HAS_PREFIX(str, prefix) \
({ \
- const char *const _str = (str); \
+ const char *const _str_has_prefix = (str); \
\
- _str && (strncmp ((str), ""prefix"", NM_STRLEN (prefix)) == 0); \
+ nm_assert (strlen (prefix) == NM_STRLEN (prefix)); \
+ \
+ _str_has_prefix \
+ && (strncmp (_str_has_prefix, ""prefix"", NM_STRLEN (prefix)) == 0); \
})
#define NM_STR_HAS_SUFFIX(str, suffix) \
({ \
- const char *_str; \
+ const char *const _str_has_suffix = (str); \
gsize _l; \
\
- ( (_str = (str)) \
- && ((_l = strlen (_str)) >= NM_STRLEN (suffix)) \
- && (memcmp (&_str[_l - NM_STRLEN (suffix)], \
+ nm_assert (strlen (suffix) == NM_STRLEN (suffix)); \
+ \
+ ( _str_has_suffix \
+ && ((_l = strlen (_str_has_suffix)) >= NM_STRLEN (suffix)) \
+ && (memcmp (&_str_has_suffix[_l - NM_STRLEN (suffix)], \
""suffix"", \
NM_STRLEN (suffix)) == 0)); \
})
+/* whether @str starts with the string literal @prefix and is followed by
+ * some other text. It is like NM_STR_HAS_PREFIX() && !nm_streq() together. */
+#define NM_STR_HAS_PREFIX_WITH_MORE(str, prefix) \
+ ({ \
+ const char *const _str_has_prefix_with_more = (str); \
+ \
+ NM_STR_HAS_PREFIX (_str_has_prefix_with_more, ""prefix"") \
+ && _str_has_prefix_with_more[NM_STRLEN (prefix)] != '\0'; \
+ })
+
/*****************************************************************************/
static inline GString *
@@ -966,16 +989,23 @@ nm_gstring_add_space_delimiter (GString *str)
return str;
}
+static inline gboolean
+nm_str_is_empty (const char *str)
+{
+ /* %NULL is also accepted, and also "empty". */
+ return !str || !str[0];
+}
+
static inline const char *
nm_str_not_empty (const char *str)
{
- return str && str[0] ? str : NULL;
+ return !nm_str_is_empty (str) ? str : NULL;
}
static inline char *
nm_strdup_not_empty (const char *str)
{
- return str && str[0] ? g_strdup (str) : NULL;
+ return !nm_str_is_empty (str) ? g_strdup (str) : NULL;
}
static inline char *
diff --git a/shared/nm-glib-aux/nm-shared-utils.c b/shared/nm-glib-aux/nm-shared-utils.c
index 5dd099a7c9..e64ef71378 100644
--- a/shared/nm-glib-aux/nm-shared-utils.c
+++ b/shared/nm-glib-aux/nm-shared-utils.c
@@ -4817,3 +4817,23 @@ nm_str_buf_append_printf (NMStrBuf *strbuf,
strbuf->_priv_len += (gsize) l;
}
+
+/*****************************************************************************/
+
+/**
+ * nm_indirect_g_free:
+ * @arg: a pointer to a pointer that is to be freed.
+ *
+ * This does the same as nm_clear_g_free(arg) (g_clear_pointer (arg, g_free)).
+ * This is for example useful when you have a GArray with pointers and a
+ * clear function to free them. g_array_set_clear_func()'s destroy notify
+ * function gets a pointer to the array location, so we have to follow
+ * the first pointer.
+ */
+void
+nm_indirect_g_free (gpointer arg)
+{
+ gpointer *p = arg;
+
+ nm_clear_g_free (p);
+}
diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h
index d5990c2d54..fb9e3ac903 100644
--- a/shared/nm-glib-aux/nm-shared-utils.h
+++ b/shared/nm-glib-aux/nm-shared-utils.h
@@ -926,6 +926,21 @@ _nm_g_slice_free_fcn_define (32)
/*****************************************************************************/
+/* Like g_error_matches() however:
+ * - as macro it is always inlined.
+ * - the @domain is usually a error quark getter function that cannot
+ * be inlined. This macro calls the getter only if there is an error (lazy).
+ * - accept a list of allowed codes, instead of only one.
+ */
+#define nm_g_error_matches(error, err_domain, ...) \
+ ({ \
+ const GError *const _error = (error); \
+ \
+ _error \
+ && _error->domain == (err_domain) \
+ && NM_IN_SET (_error->code, __VA_ARGS__); \
+ })
+
static inline void
nm_g_set_error_take (GError **error, GError *error_take)
{
@@ -1143,6 +1158,25 @@ GParamSpec *nm_g_object_class_find_property_from_gtype (GType gtype,
/*****************************************************************************/
+#define _NM_G_PARAM_SPEC_CAST(param_spec, _value_type, _c_type) \
+ ({ \
+ const GParamSpec *const _param_spec = (param_spec); \
+ \
+ nm_assert ( !_param_spec \
+ || _param_spec->value_type == (_value_type)); \
+ ((const _c_type *) _param_spec); \
+ })
+
+#define NM_G_PARAM_SPEC_CAST_BOOLEAN(param_spec) _NM_G_PARAM_SPEC_CAST (param_spec, G_TYPE_BOOLEAN, GParamSpecBoolean)
+#define NM_G_PARAM_SPEC_CAST_UINT(param_spec) _NM_G_PARAM_SPEC_CAST (param_spec, G_TYPE_UINT, GParamSpecUInt)
+#define NM_G_PARAM_SPEC_CAST_UINT64(param_spec) _NM_G_PARAM_SPEC_CAST (param_spec, G_TYPE_UINT64, GParamSpecUInt64)
+
+#define NM_G_PARAM_SPEC_GET_DEFAULT_BOOLEAN(param_spec) (NM_G_PARAM_SPEC_CAST_BOOLEAN (NM_ENSURE_NOT_NULL (param_spec))->default_value)
+#define NM_G_PARAM_SPEC_GET_DEFAULT_UINT(param_spec) (NM_G_PARAM_SPEC_CAST_UINT (NM_ENSURE_NOT_NULL (param_spec))->default_value)
+#define NM_G_PARAM_SPEC_GET_DEFAULT_UINT64(param_spec) (NM_G_PARAM_SPEC_CAST_UINT64 (NM_ENSURE_NOT_NULL (param_spec))->default_value)
+
+/*****************************************************************************/
+
GType nm_g_type_find_implementing_class_for_property (GType gtype,
const char *pname);
@@ -1436,6 +1470,22 @@ char *nm_utils_g_slist_strlist_join (const GSList *a, const char *separator);
/*****************************************************************************/
static inline guint
+nm_g_array_len (const GArray *arr)
+{
+ return arr ? arr->len : 0u;
+}
+
+/*****************************************************************************/
+
+static inline guint
+nm_g_ptr_array_len (const GPtrArray *arr)
+{
+ return arr ? arr->len : 0u;
+}
+
+/*****************************************************************************/
+
+static inline guint
nm_g_hash_table_size (GHashTable *hash)
{
return hash ? g_hash_table_size (hash) : 0u;
@@ -1848,6 +1898,8 @@ nm_utils_strdup_reset (char **dst, const char *src)
return TRUE;
}
+void nm_indirect_g_free (gpointer arg);
+
/*****************************************************************************/
/* nm_utils_get_next_realloc_size() is used to grow buffers exponentially, when
@@ -1887,4 +1939,52 @@ gboolean nm_utils_ifname_valid (const char* name,
NMUtilsIfaceType type,
GError **error);
+/*****************************************************************************/
+
+static inline GArray *
+nm_strvarray_ensure (GArray **p)
+{
+ if (!*p) {
+ *p = g_array_new (TRUE, FALSE, sizeof (char *));
+ g_array_set_clear_func (*p, nm_indirect_g_free);
+ }
+ return *p;
+}
+
+static inline void
+nm_strvarray_add (GArray *array, const char *str)
+{
+ char *s;
+
+ s = g_strdup (str);
+ g_array_append_val (array, s);
+}
+
+static inline const char *const*
+nm_strvarray_get_strv (GArray **arr, guint *length)
+{
+ if (!*arr) {
+ NM_SET_OUT (length, 0);
+ return (const char *const*) arr;
+ }
+
+ NM_SET_OUT (length, (*arr)->len);
+ return &g_array_index (*arr, const char *, 0);
+}
+
+static inline void
+nm_strvarray_set_strv (GArray **array, const char *const*strv)
+{
+ gs_unref_array GArray *array_old = NULL;
+
+ array_old = g_steal_pointer (array);
+
+ if (!strv || !strv[0])
+ return;
+
+ nm_strvarray_ensure (array);
+ for (; strv[0]; strv++)
+ nm_strvarray_add (*array, strv[0]);
+}
+
#endif /* __NM_SHARED_UTILS_H__ */
diff --git a/shared/nm-keyfile/nm-keyfile-utils.c b/shared/nm-keyfile/nm-keyfile-utils.c
index 041b5eab11..0ffce40b96 100644
--- a/shared/nm-keyfile/nm-keyfile-utils.c
+++ b/shared/nm-keyfile/nm-keyfile-utils.c
@@ -9,6 +9,8 @@
#include <stdlib.h>
+#include "nm-glib-aux/nm-str-buf.h"
+
#include "nm-keyfile-internal.h"
#include "nm-setting-wired.h"
#include "nm-setting-wireless.h"
@@ -102,51 +104,114 @@ nm_keyfile_plugin_get_setting_name_for_alias (const char *alias)
/*****************************************************************************/
-/* List helpers */
-#define DEFINE_KF_LIST_WRAPPER(stype, get_ctype, set_ctype) \
-get_ctype \
-nm_keyfile_plugin_kf_get_##stype##_list (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- gsize *out_length, \
- GError **error) \
-{ \
- get_ctype list; \
- const char *alias; \
- GError *local = NULL; \
- gsize l; \
- \
- list = g_key_file_get_##stype##_list (kf, group, key, &l, &local); \
- if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) { \
- alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
- if (alias) { \
- g_clear_error (&local); \
- list = g_key_file_get_##stype##_list (kf, alias, key, &l, &local); \
- } \
- } \
- if (local) \
- g_propagate_error (error, local); \
- if (!list) \
- l = 0; \
- NM_SET_OUT (out_length, l); \
- return list; \
-} \
- \
-void \
-nm_keyfile_plugin_kf_set_##stype##_list (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- set_ctype list[], \
- gsize length) \
-{ \
- const char *alias; \
- \
- alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
- g_key_file_set_##stype##_list (kf, alias ?: group, key, list, length); \
+char **
+nm_keyfile_plugin_kf_get_string_list (GKeyFile *kf,
+ const char *group,
+ const char *key,
+ gsize *out_length,
+ GError **error)
+{
+ char **list;
+ const char *alias;
+ GError *local = NULL;
+ gsize l;
+
+ list = g_key_file_get_string_list (kf, group, key, &l, &local);
+ if (nm_g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
+ alias = nm_keyfile_plugin_get_alias_for_setting_name (group);
+ if (alias) {
+ g_clear_error (&local);
+ list = g_key_file_get_string_list (kf, alias, key, &l, &local);
+ }
+ }
+ if (local)
+ g_propagate_error (error, local);
+ if (!list)
+ l = 0;
+ NM_SET_OUT (out_length, l);
+ return list;
}
-DEFINE_KF_LIST_WRAPPER(integer, int*, int);
-DEFINE_KF_LIST_WRAPPER(string, char **, const char* const);
+guint *
+nm_keyfile_plugin_kf_get_integer_list_uint (GKeyFile *key_file,
+ const char *group_name,
+ const char *key,
+ gsize *out_length,
+ GError **error)
+{
+ GError *key_file_error = NULL;
+ gs_strfreev char **values = NULL;
+ gs_free guint *int_values = NULL;
+ gsize i, num_ints;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+ g_return_val_if_fail (group_name != NULL, NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ NM_SET_OUT (out_length, 0);
+
+ values = nm_keyfile_plugin_kf_get_string_list (key_file, group_name, key, &num_ints, &key_file_error);
+
+ if (key_file_error)
+ g_propagate_error (error, key_file_error);
+ if (!values)
+ return NULL;
+
+ int_values = g_new (guint, num_ints);
+
+ for (i = 0; i < num_ints; i++) {
+ gint64 v;
+
+ G_STATIC_ASSERT_EXPR (sizeof (v) > sizeof (guint));
+ v = _nm_utils_ascii_str_to_int64 (values[i], 10, 0, G_MAXUINT, -1);
+ if (v == -1) {
+ g_set_error (error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_INVALID_VALUE,
+ _("Value cannot be interpreted as a list of numbers."));
+ return NULL;
+ }
+
+ int_values[i] = v;
+ }
+
+ NM_SET_OUT (out_length, num_ints);
+ return g_steal_pointer (&int_values);
+}
+
+void
+nm_keyfile_plugin_kf_set_string_list (GKeyFile *kf,
+ const char *group,
+ const char *key,
+ const char *const*list,
+ gsize length)
+{
+ const char *alias;
+
+ alias = nm_keyfile_plugin_get_alias_for_setting_name (group);
+ g_key_file_set_string_list (kf, alias ?: group, key, list, length);
+}
+
+void
+nm_keyfile_plugin_kf_set_integer_list_uint (GKeyFile *kf,
+ const char *group,
+ const char *key,
+ const guint *data,
+ gsize length)
+{
+ nm_auto_str_buf NMStrBuf strbuf = { };
+ gsize i;
+
+ g_return_if_fail (kf);
+ g_return_if_fail (!length || data);
+ g_return_if_fail (group && group[0]);
+ g_return_if_fail (key && key[0]);
+
+ nm_str_buf_init (&strbuf, length * 4u + 2u, FALSE);
+ for (i = 0; i < length; i++)
+ nm_str_buf_append_printf (&strbuf, "%u;", data[i]);
+ nm_keyfile_plugin_kf_set_value (kf, group, key, nm_str_buf_get_str (&strbuf));
+}
void
nm_keyfile_plugin_kf_set_integer_list_uint8 (GKeyFile *kf,
@@ -155,63 +220,64 @@ nm_keyfile_plugin_kf_set_integer_list_uint8 (GKeyFile *kf,
const guint8 *data,
gsize length)
{
+ nm_auto_str_buf NMStrBuf strbuf = { };
gsize i;
- gsize l = length * 4 + 2;
- gs_free char *value = g_malloc (l);
- char *s = value;
g_return_if_fail (kf);
g_return_if_fail (!length || data);
g_return_if_fail (group && group[0]);
g_return_if_fail (key && key[0]);
- value[0] = '\0';
+ nm_str_buf_init (&strbuf, length * 4u + 2u, FALSE);
for (i = 0; i < length; i++)
- nm_utils_strbuf_append (&s, &l, "%d;", (int) data[i]);
- nm_assert (l > 0);
- nm_keyfile_plugin_kf_set_value (kf, group, key, value);
+ nm_str_buf_append_printf (&strbuf, "%u;", (guint) data[i]);
+ nm_keyfile_plugin_kf_set_value (kf, group, key, nm_str_buf_get_str (&strbuf));
}
-/* Single value helpers */
-#define DEFINE_KF_WRAPPER(stype, get_ctype, set_ctype) \
+#define DEFINE_KF_WRAPPER_GET(fcn_name, get_ctype, key_file_get_fcn) \
get_ctype \
-nm_keyfile_plugin_kf_get_##stype (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- GError **error) \
+fcn_name (GKeyFile *kf, \
+ const char *group, \
+ const char *key, \
+ GError **error) \
{ \
get_ctype val; \
const char *alias; \
GError *local = NULL; \
- \
- val = g_key_file_get_##stype (kf, group, key, &local); \
- if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) { \
+\
+ val = key_file_get_fcn (kf, group, key, &local); \
+ if (nm_g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) { \
alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
if (alias) { \
g_clear_error (&local); \
- val = g_key_file_get_##stype (kf, alias, key, &local); \
+ val = key_file_get_fcn (kf, alias, key, &local); \
} \
} \
if (local) \
g_propagate_error (error, local); \
return val; \
-} \
- \
+}
+
+DEFINE_KF_WRAPPER_GET (nm_keyfile_plugin_kf_get_string, char *, g_key_file_get_string);
+DEFINE_KF_WRAPPER_GET (nm_keyfile_plugin_kf_get_boolean, gboolean, g_key_file_get_boolean);
+DEFINE_KF_WRAPPER_GET (nm_keyfile_plugin_kf_get_value, char *, g_key_file_get_value);
+
+#define DEFINE_KF_WRAPPER_SET(fcn_name, set_ctype, key_file_set_fcn) \
void \
-nm_keyfile_plugin_kf_set_##stype (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- set_ctype value) \
+fcn_name (GKeyFile *kf, \
+ const char *group, \
+ const char *key, \
+ set_ctype value) \
{ \
const char *alias; \
- \
+\
alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
- g_key_file_set_##stype (kf, alias ?: group, key, value); \
+ key_file_set_fcn (kf, alias ?: group, key, value); \
}
-DEFINE_KF_WRAPPER(string, char*, const char*);
-DEFINE_KF_WRAPPER(boolean, gboolean, gboolean);
-DEFINE_KF_WRAPPER(value, char*, const char*);
+DEFINE_KF_WRAPPER_SET (nm_keyfile_plugin_kf_set_string, const char *, g_key_file_set_string);
+DEFINE_KF_WRAPPER_SET (nm_keyfile_plugin_kf_set_boolean, gboolean, g_key_file_set_boolean);
+DEFINE_KF_WRAPPER_SET (nm_keyfile_plugin_kf_set_value, const char *, g_key_file_set_value);
gint64
nm_keyfile_plugin_kf_get_int64 (GKeyFile *kf,
@@ -257,7 +323,7 @@ nm_keyfile_plugin_kf_get_keys (GKeyFile *kf,
gsize l;
keys = g_key_file_get_keys (kf, group, &l, &local);
- if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
+ if (nm_g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
alias = nm_keyfile_plugin_get_alias_for_setting_name (group);
if (alias) {
g_clear_error (&local);
@@ -285,7 +351,7 @@ nm_keyfile_plugin_kf_has_key (GKeyFile *kf,
GError *local = NULL;
has = g_key_file_has_key (kf, group, key, &local);
- if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
+ if (nm_g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
alias = nm_keyfile_plugin_get_alias_for_setting_name (group);
if (alias) {
g_clear_error (&local);
diff --git a/shared/nm-keyfile/nm-keyfile-utils.h b/shared/nm-keyfile/nm-keyfile-utils.h
index a351262e7b..4764311bb0 100644
--- a/shared/nm-keyfile/nm-keyfile-utils.h
+++ b/shared/nm-keyfile/nm-keyfile-utils.h
@@ -10,53 +10,41 @@
#error Cannot use this header.
#endif
+/*****************************************************************************/
+
+#include "nm-glib-aux/nm-shared-utils.h"
+
+/*****************************************************************************/
+
#define NM_KEYFILE_GROUP_VPN_SECRETS "vpn-secrets"
#define NM_KEYFILE_GROUPPREFIX_WIREGUARD_PEER "wireguard-peer."
+#define nm_keyfile_error_is_not_found(error) \
+ nm_g_error_matches (error, \
+ G_KEY_FILE_ERROR, \
+ G_KEY_FILE_ERROR_GROUP_NOT_FOUND, \
+ G_KEY_FILE_ERROR_KEY_NOT_FOUND)
+
const char *nm_keyfile_plugin_get_alias_for_setting_name (const char *setting_name);
const char *nm_keyfile_plugin_get_setting_name_for_alias (const char *alias);
/*****************************************************************************/
-/* List helpers */
-#define DEFINE_KF_LIST_WRAPPER_PROTO(stype, get_ctype, set_ctype) \
-get_ctype nm_keyfile_plugin_kf_get_##stype##_list (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- gsize *out_length, \
- GError **error); \
-\
-void nm_keyfile_plugin_kf_set_##stype##_list (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- set_ctype list[], \
- gsize length);
-DEFINE_KF_LIST_WRAPPER_PROTO(integer, int*, int)
-DEFINE_KF_LIST_WRAPPER_PROTO(string, char**, const char* const)
-
-void nm_keyfile_plugin_kf_set_integer_list_uint8 (GKeyFile *kf,
- const char *group,
- const char *key,
- const guint8 *list,
- gsize length);
-
-/* Single-value helpers */
-#define DEFINE_KF_WRAPPER_PROTO(stype, get_ctype, set_ctype) \
-get_ctype nm_keyfile_plugin_kf_get_##stype (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- GError **error); \
-\
-void nm_keyfile_plugin_kf_set_##stype (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- set_ctype value);
-DEFINE_KF_WRAPPER_PROTO(string, char*, const char*)
-DEFINE_KF_WRAPPER_PROTO(boolean, gboolean, gboolean)
-DEFINE_KF_WRAPPER_PROTO(value, char*, const char*)
-
-/* Misc */
+guint *nm_keyfile_plugin_kf_get_integer_list_uint (GKeyFile *kf, const char *group, const char *key, gsize *out_length, GError **error);
+char **nm_keyfile_plugin_kf_get_string_list (GKeyFile *kf, const char *group, const char *key, gsize *out_length, GError **error);
+char *nm_keyfile_plugin_kf_get_string (GKeyFile *kf, const char *group, const char *key, GError **error);
+gboolean nm_keyfile_plugin_kf_get_boolean (GKeyFile *kf, const char *group, const char *key, GError **error);
+char *nm_keyfile_plugin_kf_get_value (GKeyFile *kf, const char *group, const char *key, GError **error);
+
+void nm_keyfile_plugin_kf_set_integer_list_uint8 (GKeyFile *kf, const char *group, const char *key, const guint8 *list, gsize length);
+void nm_keyfile_plugin_kf_set_integer_list_uint (GKeyFile *kf, const char *group, const char *key, const guint *list, gsize length);
+void nm_keyfile_plugin_kf_set_string_list (GKeyFile *kf, const char *group, const char *key, const char *const*list, gsize length);
+
+void nm_keyfile_plugin_kf_set_string (GKeyFile *kf, const char *group, const char *key, const char *value);
+void nm_keyfile_plugin_kf_set_boolean (GKeyFile *kf, const char *group, const char *key, gboolean value);
+void nm_keyfile_plugin_kf_set_value (GKeyFile *kf, const char *group, const char *key, const char *value);
+
gint64 nm_keyfile_plugin_kf_get_int64 (GKeyFile *kf,
const char *group,
const char *key,
@@ -66,15 +54,15 @@ gint64 nm_keyfile_plugin_kf_get_int64 (GKeyFile *kf,
gint64 fallback,
GError **error);
-char ** nm_keyfile_plugin_kf_get_keys (GKeyFile *kf,
- const char *group,
- gsize *out_length,
- GError **error);
+char **nm_keyfile_plugin_kf_get_keys (GKeyFile *kf,
+ const char *group,
+ gsize *out_length,
+ GError **error);
-gboolean nm_keyfile_plugin_kf_has_key (GKeyFile *kf,
- const char *group,
- const char *key,
- GError **error);
+gboolean nm_keyfile_plugin_kf_has_key (GKeyFile *kf,
+ const char *group,
+ const char *key,
+ GError **error);
const char *nm_keyfile_key_encode (const char *name,
char **out_to_free);
diff --git a/shared/nm-keyfile/nm-keyfile.c b/shared/nm-keyfile/nm-keyfile.c
index 879b1b004f..0caef893e0 100644
--- a/shared/nm-keyfile/nm-keyfile.c
+++ b/shared/nm-keyfile/nm-keyfile.c
@@ -164,23 +164,16 @@ read_array_of_uint (GKeyFile *file,
const char *key)
{
gs_unref_array GArray *array = NULL;
- gsize length;
- gsize i;
- gs_free int *tmp = NULL;
gs_free_error GError *error = NULL;
+ gs_free guint *tmp = NULL;
+ gsize length;
- tmp = nm_keyfile_plugin_kf_get_integer_list (file, nm_setting_get_name (setting), key, &length, &error);
+ tmp = nm_keyfile_plugin_kf_get_integer_list_uint (file, nm_setting_get_name (setting), key, &length, &error);
if (error)
return;
array = g_array_sized_new (FALSE, FALSE, sizeof (guint), length);
-
- for (i = 0; i < length; i++) {
- if (tmp[i] < 0)
- return;
- g_array_append_val (array, tmp[i]);
- }
-
+ g_array_append_vals (array, tmp, length);
g_object_set (setting, key, array, NULL);
}
@@ -941,7 +934,7 @@ mac_address_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key
char addr_str[NM_UTILS_HWADDR_LEN_MAX * 3];
guint8 addr_bin[NM_UTILS_HWADDR_LEN_MAX];
gs_free char *tmp_string = NULL;
- gs_free int *int_list = NULL;
+ gs_free guint *int_list = NULL;
const char *mac_str;
gsize int_list_len;
gsize i;
@@ -962,12 +955,12 @@ mac_address_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key
goto good_addr_bin;
/* Old format; list of ints */
- int_list = nm_keyfile_plugin_kf_get_integer_list (info->keyfile, setting_name, key, &int_list_len, NULL);
+ int_list = nm_keyfile_plugin_kf_get_integer_list_uint (info->keyfile, setting_name, key, &int_list_len, NULL);
if (int_list_len == addr_len) {
for (i = 0; i < addr_len; i++) {
- const int val = int_list[i];
+ const guint val = int_list[i];
- if (val < 0 || val > 255)
+ if (val > 255)
break;
addr_bin[i] = (guint8) val;
}
@@ -1629,9 +1622,7 @@ parity_good:
out_err:
if (!err)
return;
- if ( err->domain == G_KEY_FILE_ERROR
- && NM_IN_SET (err->code, G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
- G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
+ if (nm_keyfile_error_is_not_found (err)) {
/* ignore such errors. The key is not present. */
return;
}
@@ -1851,25 +1842,19 @@ write_array_of_uint (GKeyFile *file,
const GValue *value)
{
GArray *array;
- guint i;
- gs_free int *tmp_array = NULL;
- array = (GArray *) g_value_get_boxed (value);
- if (!array || !array->len)
- return;
+ array = g_value_get_boxed (value);
- g_return_if_fail (g_array_get_element_size (array) == sizeof (guint));
-
- tmp_array = g_new (int, array->len);
- for (i = 0; i < array->len; i++) {
- guint v = g_array_index (array, guint, i);
+ nm_assert (!array || g_array_get_element_size (array) == sizeof (guint));
- if (v > G_MAXINT)
- g_return_if_reached ();
- tmp_array[i] = (int) v;
- }
+ if (!array || !array->len)
+ return;
- nm_keyfile_plugin_kf_set_integer_list (file, nm_setting_get_name (setting), key, tmp_array, array->len);
+ nm_keyfile_plugin_kf_set_integer_list_uint (file,
+ nm_setting_get_name (setting),
+ key,
+ (const guint *) array->data,
+ array->len);
}
static void
@@ -3101,24 +3086,24 @@ read_one_setting_value (KeyfileReaderInfo *info,
nm_g_object_set_property_int64 (G_OBJECT (setting), key, i64, &err);
}
} else if (type == G_TYPE_BYTES) {
- gs_free int *tmp = NULL;
+ gs_free guint *tmp = NULL;
GByteArray *array;
GBytes *bytes;
gsize length;
int i;
gboolean already_warned = FALSE;
- tmp = nm_keyfile_plugin_kf_get_integer_list (keyfile, setting_info->setting_name, key, &length, NULL);
+ tmp = nm_keyfile_plugin_kf_get_integer_list_uint (keyfile, setting_info->setting_name, key, &length, NULL);
array = g_byte_array_sized_new (length);
for (i = 0; i < length; i++) {
- const int val = tmp[i];
+ const guint val = tmp[i];
unsigned char v = (unsigned char) (val & 0xFF);
- if (val < 0 || val > 255) {
+ if (val > 255u) {
if ( !already_warned
&& !handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
- _("ignoring invalid byte element '%d' (not between 0 and 255 inclusive)"),
+ _("ignoring invalid byte element '%u' (not between 0 and 255 inclusive)"),
val)) {
g_byte_array_unref (array);
return;
@@ -3167,9 +3152,7 @@ read_one_setting_value (KeyfileReaderInfo *info,
g_return_if_reached ();
if (err) {
- if ( err->domain == G_KEY_FILE_ERROR
- && NM_IN_SET (err->code, G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
- G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
+ if (nm_keyfile_error_is_not_found (err)) {
/* ignore such errors. The key is not present. */
} else {
handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
diff --git a/shared/nm-libnm-core-intern/nm-common-macros.h b/shared/nm-libnm-core-intern/nm-common-macros.h
index 5f011efd64..fcfe6919b0 100644
--- a/shared/nm-libnm-core-intern/nm-common-macros.h
+++ b/shared/nm-libnm-core-intern/nm-common-macros.h
@@ -46,6 +46,8 @@ NM_CLONED_MAC_IS_SPECIAL (const char *str)
#define NM_IAID_IFNAME "ifname"
#define NM_IAID_STABLE "stable"
+#define NM_CONNECTION_MUD_URL_NONE "none"
+
static inline gboolean
NM_IAID_IS_SPECIAL (const char *str)
{
diff --git a/shared/nm-test-libnm-utils.h b/shared/nm-test-libnm-utils.h
index 06dbc72d71..04e8fb649b 100644
--- a/shared/nm-test-libnm-utils.h
+++ b/shared/nm-test-libnm-utils.h
@@ -3,6 +3,9 @@
* Copyright (C) 2014 - 2015 Red Hat, Inc.
*/
+#ifndef __NM_TEST_LIBNM_UTILS_H__
+#define __NM_TEST_LIBNM_UTILS_H__
+
#include "NetworkManager.h"
#include "nm-utils/nm-test-utils.h"
@@ -82,3 +85,5 @@ nmtstc_client_new (gboolean allow_iterate_main_context)
{
return nmtstc_context_object_new (NM_TYPE_CLIENT, allow_iterate_main_context, NULL);
}
+
+#endif /* __NM_TEST_LIBNM_UTILS_H__ */
diff --git a/shared/nm-version-macros.h.in b/shared/nm-version-macros.h.in
index e97f506cb8..83da86ce10 100644
--- a/shared/nm-version-macros.h.in
+++ b/shared/nm-version-macros.h.in
@@ -64,6 +64,7 @@
#define NM_VERSION_1_20 (NM_ENCODE_VERSION (1, 20, 0))
#define NM_VERSION_1_22 (NM_ENCODE_VERSION (1, 22, 0))
#define NM_VERSION_1_24 (NM_ENCODE_VERSION (1, 24, 0))
+#define NM_VERSION_1_26 (NM_ENCODE_VERSION (1, 26, 0))
/* For releases, NM_API_VERSION is equal to NM_VERSION.
*
diff --git a/shared/systemd/nm-sd-utils-shared.c b/shared/systemd/nm-sd-utils-shared.c
index 85fd6a353e..4444e6c7f6 100644
--- a/shared/systemd/nm-sd-utils-shared.c
+++ b/shared/systemd/nm-sd-utils-shared.c
@@ -13,6 +13,7 @@
#include "hexdecoct.h"
#include "hostname-util.h"
#include "path-util.h"
+#include "web-util.h"
/*****************************************************************************/
@@ -94,3 +95,45 @@ gboolean nm_sd_hostname_is_valid (const char *s, bool allow_trailing_dot)
{
return hostname_is_valid (s, allow_trailing_dot);
}
+
+/*****************************************************************************/
+
+static gboolean
+_http_url_is_valid (const char *url, gboolean only_https)
+{
+ if ( !url
+ || !url[0])
+ return FALSE;
+
+ if ( !only_https
+ && NM_STR_HAS_PREFIX (url, "http://"))
+ url += NM_STRLEN ("http://");
+ else if (NM_STR_HAS_PREFIX (url, "https://"))
+ url += NM_STRLEN ("https://");
+ else
+ return FALSE;
+
+ if (!url[0])
+ return FALSE;
+
+ return !NM_STRCHAR_ANY (url, ch, (guchar) ch >= 128u);
+}
+
+gboolean
+nm_sd_http_url_is_valid_https (const char *url)
+{
+ /* We use this function to verify connection:mud-url property, it must thus
+ * not change behavior.
+ *
+ * Note that sd_dhcp_client_set_mud_url() and sd_dhcp6_client_set_request_mud_url()
+ * assert with http_url_is_valid() that the argument is valid. We thus must make
+ * sure to only pass URLs that are valid according to http_url_is_valid().
+ *
+ * This is given, because our nm_sd_http_url_is_valid_https() is more strict
+ * than http_url_is_valid().
+ *
+ * We only must make sure that this is also correct in the future, when we
+ * re-import systemd code. */
+ nm_assert (_http_url_is_valid (url, FALSE) == http_url_is_valid (url));
+ return _http_url_is_valid (url, TRUE);
+}
diff --git a/shared/systemd/nm-sd-utils-shared.h b/shared/systemd/nm-sd-utils-shared.h
index 3495a31d19..a3ca1edc03 100644
--- a/shared/systemd/nm-sd-utils-shared.h
+++ b/shared/systemd/nm-sd-utils-shared.h
@@ -34,4 +34,8 @@ int nm_sd_dns_name_to_wire_format (const char *domain,
int nm_sd_dns_name_is_valid (const char *s);
gboolean nm_sd_hostname_is_valid(const char *s, bool allow_trailing_dot);
+/*****************************************************************************/
+
+gboolean nm_sd_http_url_is_valid_https (const char *url);
+
#endif /* __NM_SD_UTILS_SHARED_H__ */
diff --git a/shared/systemd/src/shared/web-util.c b/shared/systemd/src/shared/web-util.c
index f5a5362bd5..4cff5e271d 100644
--- a/shared/systemd/src/shared/web-util.c
+++ b/shared/systemd/src/shared/web-util.c
@@ -24,21 +24,25 @@ bool http_etag_is_valid(const char *etag) {
}
#endif /* NM_IGNORED */
-bool http_url_is_valid(const char *url) {
- const char *p;
-
- if (isempty(url))
- return false;
-
- p = STARTSWITH_SET(url, "http://", "https://");
- if (!p)
- return false;
-
- if (isempty(p))
- return false;
-
- return ascii_is_valid(p);
-}
+/* NM: we use http_url_is_valid() for our own code, and it must not
+ * change behavior. If a re-import results in a merge-conflict, you must
+ * ensure that it does not change behavior, and possibly do something
+ * about that. */
+/**/ bool http_url_is_valid(const char *url) {
+/**/ const char *p;
+/**/
+/**/ if (isempty(url))
+/**/ return false;
+/**/
+/**/ p = STARTSWITH_SET(url, "http://", "https://");
+/**/ if (!p)
+/**/ return false;
+/**/
+/**/ if (isempty(p))
+/**/ return false;
+/**/
+/**/ return ascii_is_valid(p);
+/**/ }
#if 0 /* NM_IGNORED */
bool documentation_url_is_valid(const char *url) {
diff --git a/src/devices/nm-device-bridge.c b/src/devices/nm-device-bridge.c
index c93c6a54f6..544e66140c 100644
--- a/src/devices/nm-device-bridge.c
+++ b/src/devices/nm-device-bridge.c
@@ -237,88 +237,156 @@ typedef struct {
const char *sysname;
const char *(*to_sysfs) (GValue *value);
void (*from_sysfs) (const char *value, GValue *out);
- uint nm_min;
- uint nm_max;
- uint nm_default;
+ guint64 nm_min;
+ guint64 nm_max;
+ guint64 nm_default;
bool default_if_zero;
bool user_hz_compensate;
bool only_with_stp;
} Option;
+#define OPTION(_name, _sysname, ...) \
+ { \
+ .name = ""_name"", \
+ .sysname = ""_sysname"", \
+ __VA_ARGS__ \
+ }
+
+#define OPTION_TYPE_INT(min, max, def) \
+ .nm_min = (min), .nm_max = (max), .nm_default = (def)
+
+#define OPTION_TYPE_BOOL(def) \
+ OPTION_TYPE_INT (FALSE, TRUE, def)
+
+#define OPTION_TYPE_TOFROM(to, fro) \
+ .to_sysfs = (to), .from_sysfs = (fro)
+
static const Option master_options[] = {
- { NM_SETTING_BRIDGE_STP, "stp_state", /* this must stay as the first item */
- NULL, NULL,
- 0, 1, 1,
- FALSE, FALSE, FALSE },
- { NM_SETTING_BRIDGE_PRIORITY, "priority",
- NULL, NULL,
- 0, G_MAXUINT16, 0x8000,
- TRUE, FALSE, TRUE },
- { NM_SETTING_BRIDGE_FORWARD_DELAY, "forward_delay",
- NULL, NULL,
- 0, NM_BR_MAX_FORWARD_DELAY, 15,
- TRUE, TRUE, TRUE},
- { NM_SETTING_BRIDGE_HELLO_TIME, "hello_time",
- NULL, NULL,
- 0, NM_BR_MAX_HELLO_TIME, 2,
- TRUE, TRUE, TRUE },
- { NM_SETTING_BRIDGE_MAX_AGE, "max_age",
- NULL, NULL,
- 0, NM_BR_MAX_MAX_AGE, 20,
- TRUE, TRUE, TRUE },
- { NM_SETTING_BRIDGE_AGEING_TIME, "ageing_time",
- NULL, NULL,
- NM_BR_MIN_AGEING_TIME, NM_BR_MAX_AGEING_TIME, 300,
- TRUE, TRUE, FALSE },
- { NM_SETTING_BRIDGE_GROUP_FORWARD_MASK, "group_fwd_mask",
- NULL, NULL,
- 0, 0xFFFF, 0,
- TRUE, FALSE, FALSE },
- { NM_SETTING_BRIDGE_MULTICAST_QUERIER, "multicast_querier",
- NULL, NULL,
- 0, 1, 0,
- FALSE, FALSE, FALSE },
- { NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR, "multicast_query_use_ifaddr",
- NULL, NULL,
- 0, 1, 0,
- FALSE, FALSE, FALSE },
- { NM_SETTING_BRIDGE_MULTICAST_SNOOPING, "multicast_snooping",
- NULL, NULL,
- 0, 1, 1,
- FALSE, FALSE, FALSE },
- { NM_SETTING_BRIDGE_MULTICAST_ROUTER, "multicast_router",
- to_sysfs_multicast_router, from_sysfs_multicast_router,
- 0, 0, 0,
- FALSE, FALSE, FALSE },
- { NM_SETTING_BRIDGE_GROUP_ADDRESS, "group_addr",
- to_sysfs_group_address, from_sysfs_group_address,
- 0, 0, 0,
- FALSE, FALSE, FALSE },
- { NM_SETTING_BRIDGE_VLAN_PROTOCOL, "vlan_protocol",
- to_sysfs_vlan_protocol, from_sysfs_vlan_protocol,
- 0, 0, 0,
- FALSE, FALSE, FALSE },
- { NM_SETTING_BRIDGE_VLAN_STATS_ENABLED, "vlan_stats_enabled",
- NULL, NULL,
- 0, 1, 0,
- FALSE, FALSE, FALSE },
- { NULL, NULL }
+ OPTION (NM_SETTING_BRIDGE_STP, /* this must stay as the first item */
+ "stp_state",
+ OPTION_TYPE_BOOL (NM_BRIDGE_STP_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_PRIORITY,
+ "priority",
+ OPTION_TYPE_INT (NM_BRIDGE_PRIORITY_MIN, NM_BRIDGE_PRIORITY_MAX, NM_BRIDGE_PRIORITY_DEF),
+ .default_if_zero = TRUE,
+ .only_with_stp = TRUE,
+ ),
+ OPTION (NM_SETTING_BRIDGE_FORWARD_DELAY,
+ "forward_delay",
+ OPTION_TYPE_INT (NM_BRIDGE_FORWARD_DELAY_MIN, NM_BRIDGE_FORWARD_DELAY_MAX, NM_BRIDGE_FORWARD_DELAY_DEF),
+ .default_if_zero = TRUE,
+ .user_hz_compensate = TRUE,
+ .only_with_stp = TRUE,
+ ),
+ OPTION (NM_SETTING_BRIDGE_HELLO_TIME,
+ "hello_time",
+ OPTION_TYPE_INT (NM_BRIDGE_HELLO_TIME_MIN, NM_BRIDGE_HELLO_TIME_MAX, NM_BRIDGE_HELLO_TIME_DEF),
+ .default_if_zero = TRUE,
+ .user_hz_compensate = TRUE,
+ .only_with_stp = TRUE,
+ ),
+ OPTION (NM_SETTING_BRIDGE_MAX_AGE,
+ "max_age",
+ OPTION_TYPE_INT (NM_BRIDGE_MAX_AGE_MIN, NM_BRIDGE_MAX_AGE_MAX, NM_BRIDGE_MAX_AGE_DEF),
+ .default_if_zero = TRUE,
+ .user_hz_compensate = TRUE,
+ .only_with_stp = TRUE,
+ ),
+ OPTION (NM_SETTING_BRIDGE_AGEING_TIME,
+ "ageing_time",
+ OPTION_TYPE_INT (NM_BRIDGE_AGEING_TIME_MIN, NM_BRIDGE_AGEING_TIME_MAX, NM_BRIDGE_AGEING_TIME_DEF),
+ .default_if_zero = TRUE,
+ .user_hz_compensate = TRUE,
+ ),
+ OPTION (NM_SETTING_BRIDGE_GROUP_FORWARD_MASK,
+ "group_fwd_mask",
+ OPTION_TYPE_INT (0, 0xFFFF, 0),
+ .default_if_zero = TRUE,
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_HASH_MAX,
+ "hash_max",
+ OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_HASH_MAX_MIN, NM_BRIDGE_MULTICAST_HASH_MAX_MAX, NM_BRIDGE_MULTICAST_HASH_MAX_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT,
+ "multicast_last_member_count",
+ OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_MIN, NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_MAX, NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL,
+ "multicast_last_member_interval",
+ OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_MIN, NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_MAX, NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL,
+ "multicast_membership_interval",
+ OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_MIN, NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_MAX, NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_QUERIER,
+ "multicast_querier",
+ OPTION_TYPE_BOOL (NM_BRIDGE_MULTICAST_QUERIER_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_QUERIER_INTERVAL,
+ "multicast_querier_interval",
+ OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_MIN, NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_MAX, NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_QUERY_INTERVAL,
+ "multicast_query_interval",
+ OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_QUERY_INTERVAL_MIN, NM_BRIDGE_MULTICAST_QUERY_INTERVAL_MAX, NM_BRIDGE_MULTICAST_QUERY_INTERVAL_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL,
+ "multicast_query_response_interval",
+ OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_MIN, NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_MAX, NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR,
+ "multicast_query_use_ifaddr",
+ OPTION_TYPE_BOOL (NM_BRIDGE_MULTICAST_QUERY_USE_IFADDR_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_SNOOPING,
+ "multicast_snooping",
+ OPTION_TYPE_BOOL (NM_BRIDGE_MULTICAST_SNOOPING_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_ROUTER,
+ "multicast_router",
+ OPTION_TYPE_TOFROM (to_sysfs_multicast_router, from_sysfs_multicast_router),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT,
+ "multicast_startup_query_count",
+ OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_MIN, NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_MAX, NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL,
+ "multicast_startup_query_interval",
+ OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_MIN, NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_MAX, NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_DEF),
+ ),
+ OPTION (NM_SETTING_BRIDGE_GROUP_ADDRESS,
+ "group_addr",
+ OPTION_TYPE_TOFROM (to_sysfs_group_address, from_sysfs_group_address),
+ ),
+ OPTION (NM_SETTING_BRIDGE_VLAN_PROTOCOL,
+ "vlan_protocol",
+ OPTION_TYPE_TOFROM (to_sysfs_vlan_protocol, from_sysfs_vlan_protocol),
+ ),
+ OPTION (NM_SETTING_BRIDGE_VLAN_STATS_ENABLED,
+ "vlan_stats_enabled",
+ OPTION_TYPE_BOOL (NM_BRIDGE_VLAN_STATS_ENABLED_DEF)
+ ),
+ { 0, }
};
static const Option slave_options[] = {
- { NM_SETTING_BRIDGE_PORT_PRIORITY, "priority",
- NULL, NULL,
- 0, NM_BR_PORT_MAX_PRIORITY, NM_BR_PORT_DEF_PRIORITY,
- TRUE, FALSE },
- { NM_SETTING_BRIDGE_PORT_PATH_COST, "path_cost",
- NULL, NULL,
- 0, NM_BR_PORT_MAX_PATH_COST, 100,
- TRUE, FALSE },
- { NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE, "hairpin_mode",
- NULL, NULL,
- 0, 1, 0,
- FALSE, FALSE },
- { NULL, NULL }
+ OPTION (NM_SETTING_BRIDGE_PORT_PRIORITY,
+ "priority",
+ OPTION_TYPE_INT (NM_BRIDGE_PORT_PRIORITY_MIN, NM_BRIDGE_PORT_PRIORITY_MAX, NM_BRIDGE_PORT_PRIORITY_DEF),
+ .default_if_zero = TRUE,
+ ),
+ OPTION (NM_SETTING_BRIDGE_PORT_PATH_COST,
+ "path_cost",
+ OPTION_TYPE_INT (NM_BRIDGE_PORT_PATH_COST_MIN, NM_BRIDGE_PORT_PATH_COST_MAX, NM_BRIDGE_PORT_PATH_COST_DEF),
+ .default_if_zero = TRUE,
+ ),
+ OPTION (NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE,
+ "hairpin_mode",
+ OPTION_TYPE_BOOL (FALSE),
+ ),
+ { 0 }
};
static void
@@ -350,19 +418,24 @@ commit_option (NMDevice *device, NMSetting *setting, const Option *option, gbool
case G_TYPE_BOOLEAN:
value = g_value_get_boolean (&val) ? "1" : "0";
break;
+ case G_TYPE_UINT64:
case G_TYPE_UINT: {
- guint uval;
+ guint64 uval;
- uval = g_value_get_uint (&val);
+ if (pspec->value_type == G_TYPE_UINT64)
+ uval = g_value_get_uint64 (&val);
+ else
+ uval = (guint) g_value_get_uint (&val);
/* zero means "unspecified" for some NM properties but isn't in the
* allowed kernel range, so reset the property to the default value.
*/
- if (option->default_if_zero && uval == 0) {
- g_value_unset (&val);
- g_value_init (&val, G_PARAM_SPEC_VALUE_TYPE (pspec));
- g_param_value_set_default (pspec, &val);
- uval = g_value_get_uint (&val);
+ if ( option->default_if_zero
+ && uval == 0) {
+ if (pspec->value_type == G_TYPE_UINT64)
+ uval = NM_G_PARAM_SPEC_GET_DEFAULT_UINT64 (pspec);
+ else
+ uval = NM_G_PARAM_SPEC_GET_DEFAULT_UINT (pspec);
}
/* Linux kernel bridge interfaces use 'centiseconds' for time-based values.
@@ -373,7 +446,11 @@ commit_option (NMDevice *device, NMSetting *setting, const Option *option, gbool
if (option->user_hz_compensate)
uval *= 100;
- nm_sprintf_buf (value_buf, "%u", uval);
+ if (pspec->value_type == G_TYPE_UINT64)
+ nm_sprintf_buf (value_buf, "%"G_GUINT64_FORMAT, uval);
+ else
+ nm_sprintf_buf (value_buf, "%u", (guint) uval);
+
value = value_buf;
}
break;
@@ -499,8 +576,9 @@ update_connection (NMDevice *device, NMConnection *connection)
}
switch (pspec->value_type) {
+ case G_TYPE_UINT64:
case G_TYPE_UINT: {
- guint uvalue;
+ guint64 uvalue;
/* See comments in set_sysfs_uint() about centiseconds. */
if (option->user_hz_compensate) {
@@ -510,12 +588,16 @@ update_connection (NMDevice *device, NMConnection *connection)
option->nm_default * 100);
uvalue /= 100;
} else {
- uvalue = _nm_utils_ascii_str_to_int64 (str, 10,
- option->nm_min,
- option->nm_max,
- option->nm_default);
+ uvalue = _nm_utils_ascii_str_to_uint64 (str, 10,
+ option->nm_min,
+ option->nm_max,
+ option->nm_default);
}
- g_value_set_uint (&value, uvalue);
+
+ if (pspec->value_type == G_TYPE_UINT64)
+ g_value_set_uint64(&value, uvalue);
+ else
+ g_value_set_uint (&value, (guint) uvalue);
}
break;
case G_TYPE_BOOLEAN: {
diff --git a/src/devices/nm-device-macsec.c b/src/devices/nm-device-macsec.c
index f1878078b2..94edc9473a 100644
--- a/src/devices/nm-device-macsec.c
+++ b/src/devices/nm-device-macsec.c
@@ -863,15 +863,14 @@ static void
dispose (GObject *object)
{
NMDeviceMacsec *self = NM_DEVICE_MACSEC (object);
- NMDeviceMacsecPrivate *priv = NM_DEVICE_MACSEC_GET_PRIVATE (self);
macsec_secrets_cancel (self);
supplicant_interface_release (self);
G_OBJECT_CLASS (nm_device_macsec_parent_class)->dispose (object);
- nm_assert (priv->parent_state_id == 0);
- nm_assert (priv->parent_mtu_id == 0);
+ nm_assert (NM_DEVICE_MACSEC_GET_PRIVATE (self)->parent_state_id == 0);
+ nm_assert (NM_DEVICE_MACSEC_GET_PRIVATE (self)->parent_mtu_id == 0);
}
static const NMDBusInterfaceInfoExtended interface_info_device_macsec = {
diff --git a/src/devices/nm-device-macvlan.c b/src/devices/nm-device-macvlan.c
index 2f8c4c32cd..3435df1be7 100644
--- a/src/devices/nm-device-macvlan.c
+++ b/src/devices/nm-device-macvlan.c
@@ -462,16 +462,16 @@ nm_device_macvlan_init (NMDeviceMacvlan *self)
{
}
+#if NM_MORE_ASSERTS
static void
dispose (GObject *object)
{
- NMDeviceMacvlanPrivate *priv = NM_DEVICE_MACVLAN_GET_PRIVATE (object);
-
G_OBJECT_CLASS (nm_device_macvlan_parent_class)->dispose (object);
- nm_assert (priv->parent_state_id == 0);
- nm_assert (priv->parent_mtu_id == 0);
+ nm_assert (NM_DEVICE_MACVLAN_GET_PRIVATE (object)->parent_state_id == 0);
+ nm_assert (NM_DEVICE_MACVLAN_GET_PRIVATE (object)->parent_mtu_id == 0);
}
+#endif
static const NMDBusInterfaceInfoExtended interface_info_device_macvlan = {
.parent = NM_DEFINE_GDBUS_INTERFACE_INFO_INIT (
@@ -496,7 +496,9 @@ nm_device_macvlan_class_init (NMDeviceMacvlanClass *klass)
NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (klass);
NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
+#if NM_MORE_ASSERTS
object_class->dispose = dispose;
+#endif
object_class->get_property = get_property;
object_class->set_property = set_property;
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 8a22cba8c0..44e5183ec2 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -24,6 +24,7 @@
#include "nm-std-aux/unaligned.h"
#include "nm-glib-aux/nm-dedup-multi.h"
#include "nm-glib-aux/nm-random-utils.h"
+#include "systemd/nm-sd-utils-shared.h"
#include "nm-libnm-core-intern/nm-ethtool-utils.h"
#include "nm-libnm-core-intern/nm-common-macros.h"
@@ -5998,7 +5999,6 @@ check_connection_compatible (NMDevice *self, NMConnection *connection, GError **
gs_free_error GError *local = NULL;
gs_free char *conn_iface = NULL;
NMDeviceClass *klass;
- const char *const *patterns;
NMSettingMatch *s_match;
klass = NM_DEVICE_GET_CLASS (self);
@@ -6041,6 +6041,8 @@ check_connection_compatible (NMDevice *self, NMConnection *connection, GError **
s_match = (NMSettingMatch *) nm_connection_get_setting (connection,
NM_TYPE_SETTING_MATCH);
if (s_match) {
+ const char *const *patterns;
+ const char *device_driver;
guint num_patterns = 0;
patterns = nm_setting_match_get_interface_names (s_match, &num_patterns);
@@ -6049,6 +6051,72 @@ check_connection_compatible (NMDevice *self, NMConnection *connection, GError **
"device does not satisfy match.interface-name property");
return FALSE;
}
+
+ {
+ const char *const*proc_cmdline;
+ gboolean pos_patterns = FALSE;
+ guint i;
+
+ patterns = nm_setting_match_get_kernel_command_lines (s_match, &num_patterns);
+ proc_cmdline = nm_utils_proc_cmdline_split ();
+
+ for (i = 0; i < num_patterns; i++) {
+ const char *patterns_i = patterns[i];
+ const char *const*proc_cmdline_i;
+ gboolean negative = FALSE;
+ gboolean found = FALSE;
+ const char *equal;
+
+ if (patterns_i[0] == '!') {
+ ++patterns_i;
+ negative = TRUE;
+ } else
+ pos_patterns = TRUE;
+
+ equal = strchr (patterns_i, '=');
+
+ proc_cmdline_i = proc_cmdline;
+ while (*proc_cmdline_i) {
+ if (equal) {
+ /* if pattern contains = compare full key=value */
+ found = nm_streq (*proc_cmdline_i, patterns_i);
+ } else {
+ gsize l = strlen (patterns_i);
+
+ /* otherwise consider pattern as key only */
+ if ( strncmp (*proc_cmdline_i, patterns_i, l) == 0
+ && NM_IN_SET ((*proc_cmdline_i)[l], '\0', '='))
+ found = TRUE;
+ }
+ if ( found
+ && negative) {
+ /* first negative match */
+ nm_utils_error_set (error, NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY,
+ "device does not satisfy match.kernel-command-line property %s",
+ patterns[i]);
+ return FALSE;
+ }
+ proc_cmdline_i++;
+ }
+
+ if ( pos_patterns
+ && !found) {
+ /* positive patterns configured but no match */
+ nm_utils_error_set (error, NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY,
+ "device does not satisfy any match.kernel-command-line property %s...",
+ patterns[0]);
+ return FALSE;
+ }
+ }
+ }
+
+ device_driver = nm_device_get_driver (self);
+ patterns = nm_setting_match_get_drivers (s_match, &num_patterns);
+ if (!nm_wildcard_match_check (device_driver, patterns, num_patterns)) {
+ nm_utils_error_set_literal (error, NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY,
+ "device does not satisfy match.driver property");
+ return FALSE;
+ }
}
return TRUE;
@@ -8315,6 +8383,37 @@ get_dhcp_hostname_flags (NMDevice *self, int addr_family)
return NM_DHCP_HOSTNAME_FLAGS_FQDN_DEFAULT_IP6;
}
+static const char *
+connection_get_mud_url (NMDevice *self,
+ NMSettingConnection *s_con,
+ char **out_mud_url)
+{
+ const char *mud_url;
+ gs_free char *s = NULL;
+
+ nm_assert (out_mud_url && !*out_mud_url);
+
+ mud_url = nm_setting_connection_get_mud_url (s_con);
+
+ if (mud_url) {
+ if (nm_streq (mud_url, NM_CONNECTION_MUD_URL_NONE))
+ return NULL;
+ return mud_url;
+ }
+
+ s = nm_config_data_get_connection_default (NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT ("connection.mud-url"),
+ self);
+ if (s) {
+ if (nm_streq (s, NM_CONNECTION_MUD_URL_NONE))
+ return NULL;
+ if (nm_sd_http_url_is_valid_https (s))
+ return (*out_mud_url = g_steal_pointer (&s));
+ }
+
+ return NULL;
+}
+
static GBytes *
dhcp4_get_client_id (NMDevice *self,
NMConnection *connection,
@@ -8453,7 +8552,9 @@ dhcp4_start (NMDevice *self)
gs_unref_bytes GBytes *hwaddr = NULL;
gs_unref_bytes GBytes *bcast_hwaddr = NULL;
gs_unref_bytes GBytes *client_id = NULL;
+ gs_free char *mud_url_free = NULL;
NMConnection *connection;
+ NMSettingConnection *s_con;
GError *error = NULL;
const NMPlatformLink *pllink;
@@ -8462,6 +8563,9 @@ dhcp4_start (NMDevice *self)
s_ip4 = nm_connection_get_setting_ip4_config (connection);
+ s_con = nm_connection_get_setting_connection (connection);
+ nm_assert (s_con);
+
/* Clear old exported DHCP options */
nm_dbus_object_clear_and_unexport (&priv->dhcp_data_4.config);
priv->dhcp_data_4.config = nm_dhcp_config_new (AF_INET);
@@ -8488,6 +8592,7 @@ dhcp4_start (NMDevice *self)
nm_setting_ip_config_get_dhcp_hostname (s_ip4),
nm_setting_ip4_config_get_dhcp_fqdn (NM_SETTING_IP4_CONFIG (s_ip4)),
get_dhcp_hostname_flags (self, AF_INET),
+ connection_get_mud_url (self, s_con, &mud_url_free),
client_id,
get_dhcp_timeout (self, AF_INET),
priv->dhcp_anycast_address,
@@ -9235,15 +9340,19 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
gs_unref_bytes GBytes *duid = NULL;
gboolean enforce_duid = FALSE;
const NMPlatformLink *pllink;
+ gs_free char *mud_url_free = NULL;
GError *error = NULL;
guint32 iaid;
gboolean iaid_explicit;
-
+ NMSettingConnection *s_con;
const NMPlatformIP6Address *ll_addr = NULL;
- g_assert (connection);
+ g_return_val_if_fail (connection, FALSE);
+
s_ip6 = nm_connection_get_setting_ip6_config (connection);
- g_assert (s_ip6);
+ nm_assert (s_ip6);
+ s_con = nm_connection_get_setting_connection (connection);
+ nm_assert (s_con);
if (priv->ext_ip6_config_captured) {
ll_addr = nm_ip6_config_find_first_address (priv->ext_ip6_config_captured,
@@ -9278,6 +9387,7 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
nm_setting_ip_config_get_dhcp_send_hostname (s_ip6),
nm_setting_ip_config_get_dhcp_hostname (s_ip6),
get_dhcp_hostname_flags (self, AF_INET6),
+ connection_get_mud_url (self, s_con, &mud_url_free),
duid,
enforce_duid,
iaid,
diff --git a/src/devices/ovs/nm-ovsdb.c b/src/devices/ovs/nm-ovsdb.c
index b6550b2531..e1865f9dea 100644
--- a/src/devices/ovs/nm-ovsdb.c
+++ b/src/devices/ovs/nm-ovsdb.c
@@ -131,10 +131,9 @@ typedef struct {
#define OVSDB_MAX_FAILURES 3
static void
-_call_trace (const char *comment, OvsdbMethodCall *call, json_t *msg)
+_LOGT_call_do (const char *comment, OvsdbMethodCall *call, json_t *msg)
{
-#if NM_MORE_LOGGING
- char *str = NULL;
+ gs_free char *str = NULL;
if (msg)
str = json_dumps (msg, 0);
@@ -169,12 +168,14 @@ _call_trace (const char *comment, OvsdbMethodCall *call, json_t *msg)
call->mtu);
break;
}
-
- if (msg)
- g_free (str);
-#endif
}
+#define _LOGT_call(comment, call, message) \
+ G_STMT_START { \
+ if (_LOGT_ENABLED ()) \
+ _LOGT_call_do ((comment), (call), (message)); \
+ } G_STMT_END
+
/**
* ovsdb_call_method:
*
@@ -226,7 +227,7 @@ ovsdb_call_method (NMOvsdb *self, OvsdbCommand command,
break;
}
- _call_trace ("enqueue", call, NULL);
+ _LOGT_call ("enqueue", call, NULL);
ovsdb_next_command (self);
}
@@ -875,7 +876,7 @@ ovsdb_next_command (NMOvsdb *self)
}
g_return_if_fail (msg);
- _call_trace ("send", call, msg);
+ _LOGT_call ("send", call, msg);
cmd = json_dumps (msg, 0);
g_string_append (priv->output, cmd);
@@ -1247,7 +1248,7 @@ ovsdb_got_msg (NMOvsdb *self, json_t *msg)
}
/* Cool, we found a corresponding call. Finish it. */
- _call_trace ("response", call, msg);
+ _LOGT_call ("response", call, msg);
if (!json_is_null (error)) {
/* The response contains an error. */
diff --git a/src/dhcp/nm-dhcp-client.c b/src/dhcp/nm-dhcp-client.c
index 90a64acac5..f7324baf6e 100644
--- a/src/dhcp/nm-dhcp-client.c
+++ b/src/dhcp/nm-dhcp-client.c
@@ -50,6 +50,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMDhcpClient,
PROP_IAID_EXPLICIT,
PROP_HOSTNAME,
PROP_HOSTNAME_FLAGS,
+ PROP_MUD_URL,
);
typedef struct _NMDhcpClientPrivate {
@@ -60,6 +61,7 @@ typedef struct _NMDhcpClientPrivate {
char * uuid;
GBytes * client_id;
char * hostname;
+ char * mud_url;
pid_t pid;
guint timeout_id;
guint watch_id;
@@ -312,6 +314,14 @@ nm_dhcp_client_get_use_fqdn (NMDhcpClient *self)
return NM_DHCP_CLIENT_GET_PRIVATE (self)->use_fqdn;
}
+const char *
+nm_dhcp_client_get_mud_url (NMDhcpClient *self)
+{
+ g_return_val_if_fail (NM_IS_DHCP_CLIENT (self), NULL);
+
+ return NM_DHCP_CLIENT_GET_PRIVATE (self)->mud_url;
+}
+
/*****************************************************************************/
static const char *state_table[NM_DHCP_STATE_MAX + 1] = {
@@ -1052,6 +1062,10 @@ set_property (GObject *object, guint prop_id,
/* construct-only */
priv->hostname_flags = g_value_get_uint (value);
break;
+ case PROP_MUD_URL:
+ /* construct-only */
+ priv->mud_url = g_value_dup_string (value);
+ break;
case PROP_ROUTE_TABLE:
priv->route_table = g_value_get_uint (value);
break;
@@ -1102,6 +1116,7 @@ dispose (GObject *object)
nm_clear_g_free (&priv->iface);
nm_clear_g_free (&priv->hostname);
nm_clear_g_free (&priv->uuid);
+ nm_clear_g_free (&priv->mud_url);
nm_clear_pointer (&priv->client_id, g_bytes_unref);
nm_clear_pointer (&priv->hwaddr, g_bytes_unref);
nm_clear_pointer (&priv->bcast_hwaddr, g_bytes_unref);
@@ -1191,6 +1206,12 @@ nm_dhcp_client_class_init (NMDhcpClientClass *client_class)
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
+ obj_properties[PROP_MUD_URL] =
+ g_param_spec_string (NM_DHCP_CLIENT_MUD_URL, "", "",
+ NULL,
+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+
obj_properties[PROP_ROUTE_TABLE] =
g_param_spec_uint (NM_DHCP_CLIENT_ROUTE_TABLE, "", "",
0, G_MAXUINT32, RT_TABLE_MAIN,
diff --git a/src/dhcp/nm-dhcp-client.h b/src/dhcp/nm-dhcp-client.h
index 1ff09067e8..479ea000a9 100644
--- a/src/dhcp/nm-dhcp-client.h
+++ b/src/dhcp/nm-dhcp-client.h
@@ -30,6 +30,7 @@
#define NM_DHCP_CLIENT_INTERFACE "iface"
#define NM_DHCP_CLIENT_MULTI_IDX "multi-idx"
#define NM_DHCP_CLIENT_HOSTNAME "hostname"
+#define NM_DHCP_CLIENT_MUD_URL "mud-url"
#define NM_DHCP_CLIENT_ROUTE_METRIC "route-metric"
#define NM_DHCP_CLIENT_ROUTE_TABLE "route-table"
#define NM_DHCP_CLIENT_TIMEOUT "timeout"
@@ -141,6 +142,7 @@ gboolean nm_dhcp_client_get_iaid_explicit (NMDhcpClient *self);
GBytes *nm_dhcp_client_get_client_id (NMDhcpClient *self);
const char *nm_dhcp_client_get_hostname (NMDhcpClient *self);
+const char *nm_dhcp_client_get_mud_url (NMDhcpClient *self);
NMDhcpHostnameFlags nm_dhcp_client_get_hostname_flags (NMDhcpClient *self);
diff --git a/src/dhcp/nm-dhcp-dhclient-utils.c b/src/dhcp/nm-dhcp-dhclient-utils.c
index da28abad0d..76fc1a898d 100644
--- a/src/dhcp/nm-dhcp-dhclient-utils.c
+++ b/src/dhcp/nm-dhcp-dhclient-utils.c
@@ -33,6 +33,13 @@
#define ALSOREQ_TAG "also request "
#define REQ_TAG "request "
+#define MUDURLv4_DEF "option mudurl code 161 = text;\n"
+#define MUDURLv4_FMT "send mudurl \"%s\";\n"
+
+#define MUDURLv6_DEF "option dhcp6.mudurl code 112 = text;\n"
+#define MUDURLv6_FMT "send dhcp6.mudurl \"%s\";\n"
+
+
static void
add_request (GPtrArray *array, const char *item)
{
@@ -183,6 +190,19 @@ add_hostname6 (GString *str,
}
}
+static void add_mud_url_config(GString *str, const char *mud_url, int addr_family)
+{
+ if (mud_url) {
+ if (addr_family == AF_INET) {
+ g_string_append (str, MUDURLv4_DEF);
+ g_string_append_printf (str, MUDURLv4_FMT, mud_url);
+ } else {
+ g_string_append (str, MUDURLv6_DEF);
+ g_string_append_printf (str, MUDURLv6_FMT, mud_url);
+ }
+ }
+}
+
static GBytes *
read_client_id (const char *str)
{
@@ -286,6 +306,7 @@ nm_dhcp_dhclient_create_config (const char *interface,
guint32 timeout,
gboolean use_fqdn,
NMDhcpHostnameFlags hostname_flags,
+ const char *mud_url,
const char *orig_path,
const char *orig_contents,
GBytes **out_new_client_id)
@@ -451,6 +472,7 @@ nm_dhcp_dhclient_create_config (const char *interface,
g_string_append_printf (new_contents, "timeout %u;\n", timeout);
}
+ add_mud_url_config (new_contents, mud_url, addr_family);
if (addr_family == AF_INET) {
add_ip4_config (new_contents, client_id, hostname, use_fqdn, hostname_flags);
add_request (reqs, "rfc3442-classless-static-routes");
diff --git a/src/dhcp/nm-dhcp-dhclient-utils.h b/src/dhcp/nm-dhcp-dhclient-utils.h
index 0cf538872c..5094d614e6 100644
--- a/src/dhcp/nm-dhcp-dhclient-utils.h
+++ b/src/dhcp/nm-dhcp-dhclient-utils.h
@@ -17,6 +17,7 @@ char *nm_dhcp_dhclient_create_config (const char *interface,
guint32 timeout,
gboolean use_fqdn,
NMDhcpHostnameFlags hostname_flags,
+ const char *mud_url,
const char *orig_path,
const char *orig_contents,
GBytes **out_new_client_id);
diff --git a/src/dhcp/nm-dhcp-dhclient.c b/src/dhcp/nm-dhcp-dhclient.c
index 617ce2366f..4ad056e548 100644
--- a/src/dhcp/nm-dhcp-dhclient.c
+++ b/src/dhcp/nm-dhcp-dhclient.c
@@ -147,6 +147,7 @@ merge_dhclient_config (NMDhcpDhclient *self,
guint32 timeout,
gboolean use_fqdn,
NMDhcpHostnameFlags hostname_flags,
+ const char *mud_url,
const char *orig_path,
GBytes **out_new_client_id,
GError **error)
@@ -176,6 +177,7 @@ merge_dhclient_config (NMDhcpDhclient *self,
timeout,
use_fqdn,
hostname_flags,
+ mud_url,
orig_path,
orig,
out_new_client_id);
@@ -268,6 +270,7 @@ create_dhclient_config (NMDhcpDhclient *self,
guint32 timeout,
gboolean use_fqdn,
NMDhcpHostnameFlags hostname_flags,
+ const char *mud_url,
GBytes **out_new_client_id)
{
gs_free char *orig = NULL;
@@ -296,6 +299,7 @@ create_dhclient_config (NMDhcpDhclient *self,
timeout,
use_fqdn,
hostname_flags,
+ mud_url,
orig,
out_new_client_id,
&error)) {
@@ -496,6 +500,7 @@ ip4_start (NMDhcpClient *client,
nm_dhcp_client_get_timeout (client),
nm_dhcp_client_get_use_fqdn (client),
nm_dhcp_client_get_hostname_flags (client),
+ nm_dhcp_client_get_mud_url (client),
&new_client_id);
if (!priv->conf_file) {
nm_utils_error_set_literal (error,
@@ -540,6 +545,7 @@ ip6_start (NMDhcpClient *client,
nm_dhcp_client_get_timeout (client),
TRUE,
nm_dhcp_client_get_hostname_flags (client),
+ nm_dhcp_client_get_mud_url (client),
NULL);
if (!priv->conf_file) {
nm_utils_error_set_literal (error,
diff --git a/src/dhcp/nm-dhcp-helper.c b/src/dhcp/nm-dhcp-helper.c
index 365e32e384..071d331b2d 100644
--- a/src/dhcp/nm-dhcp-helper.c
+++ b/src/dhcp/nm-dhcp-helper.c
@@ -46,33 +46,46 @@
/*****************************************************************************/
-static const char * ignore[] = {"PATH", "SHLVL", "_", "PWD", "dhc_dbus", NULL};
-
static GVariant *
build_signal_parameters (void)
{
- char **item;
+ const char *const*environ_iter;
GVariantBuilder builder;
g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
/* List environment and format for dbus dict */
- for (item = environ; *item; item++) {
- char *name, *val, **p;
-
- /* Split on the = */
- name = g_strdup (*item);
- val = strchr (name, '=');
- if (!val || val == name)
- goto next;
- *val++ = '\0';
-
- /* Ignore non-DCHP-related environment variables */
- for (p = (char **) ignore; *p; p++) {
+ for (environ_iter = (const char *const*) environ; *environ_iter; environ_iter++) {
+ static const char *const ignore_with_prefix_list[] = {
+ "PATH",
+ "SHLVL",
+ "_",
+ "PWD",
+ "dhc_dbus",
+ NULL
+ };
+ const char *item = *environ_iter;
+ gs_free char *name = NULL;
+ const char *val;
+ const char *const*p;
+
+ val = strchr (item, '=');
+ if ( !val
+ || item == val)
+ continue;
+
+ name = g_strndup (item, val - item);
+ val += 1;
+
+ /* Ignore non-DHCP-related environment variables */
+ for (p = ignore_with_prefix_list; *p; p++) {
if (strncmp (name, *p, strlen (*p)) == 0)
goto next;
}
+ if (!g_utf8_validate (name, -1, NULL))
+ continue;
+
/* Value passed as a byte array rather than a string, because there are
* no character encoding guarantees with DHCP, and D-Bus requires
* strings to be UTF-8.
@@ -85,8 +98,8 @@ build_signal_parameters (void)
g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
val, strlen (val), 1));
- next:
- g_free (name);
+next:
+ ;
}
return g_variant_ref_sink (g_variant_new ("(a{sv})", &builder));
diff --git a/src/dhcp/nm-dhcp-manager.c b/src/dhcp/nm-dhcp-manager.c
index 333744dd31..7565bfc8c6 100644
--- a/src/dhcp/nm-dhcp-manager.c
+++ b/src/dhcp/nm-dhcp-manager.c
@@ -220,6 +220,7 @@ client_start (NMDhcpManager *self,
const char *hostname,
gboolean hostname_use_fqdn,
NMDhcpHostnameFlags hostname_flags,
+ const char *mud_url,
gboolean info_only,
NMSettingIP6ConfigPrivacy privacy,
const char *last_ip4_address,
@@ -303,6 +304,7 @@ client_start (NMDhcpManager *self,
NM_DHCP_CLIENT_IAID, (guint) iaid,
NM_DHCP_CLIENT_IAID_EXPLICIT, iaid_explicit,
NM_DHCP_CLIENT_HOSTNAME, hostname,
+ NM_DHCP_CLIENT_MUD_URL, mud_url,
NM_DHCP_CLIENT_ROUTE_TABLE, (guint) route_table,
NM_DHCP_CLIENT_ROUTE_METRIC, (guint) route_metric,
NM_DHCP_CLIENT_TIMEOUT, (guint) timeout,
@@ -382,6 +384,7 @@ nm_dhcp_manager_start_ip4 (NMDhcpManager *self,
const char *dhcp_hostname,
const char *dhcp_fqdn,
NMDhcpHostnameFlags hostname_flags,
+ const char *mud_url,
GBytes *dhcp_client_id,
guint32 timeout,
const char *dhcp_anycast_addr,
@@ -440,6 +443,7 @@ nm_dhcp_manager_start_ip4 (NMDhcpManager *self,
hostname,
use_fqdn,
hostname_flags,
+ mud_url,
FALSE,
0,
last_ip_address,
@@ -462,6 +466,7 @@ nm_dhcp_manager_start_ip6 (NMDhcpManager *self,
gboolean send_hostname,
const char *dhcp_hostname,
NMDhcpHostnameFlags hostname_flags,
+ const char *mud_url,
GBytes *duid,
gboolean enforce_duid,
guint32 iaid,
@@ -503,6 +508,7 @@ nm_dhcp_manager_start_ip6 (NMDhcpManager *self,
hostname,
TRUE,
hostname_flags,
+ mud_url,
info_only,
privacy,
NULL,
diff --git a/src/dhcp/nm-dhcp-manager.h b/src/dhcp/nm-dhcp-manager.h
index 1b793c22f8..88435282e3 100644
--- a/src/dhcp/nm-dhcp-manager.h
+++ b/src/dhcp/nm-dhcp-manager.h
@@ -43,6 +43,7 @@ NMDhcpClient * nm_dhcp_manager_start_ip4 (NMDhcpManager *manager,
const char *dhcp_hostname,
const char *dhcp_fqdn,
NMDhcpHostnameFlags hostname_flags,
+ const char *mud_url,
GBytes *dhcp_client_id,
guint32 timeout,
const char *dhcp_anycast_addr,
@@ -62,6 +63,7 @@ NMDhcpClient * nm_dhcp_manager_start_ip6 (NMDhcpManager *manager,
gboolean send_hostname,
const char *dhcp_hostname,
NMDhcpHostnameFlags hostname_flags,
+ const char *mud_url,
GBytes *duid,
gboolean enforce_duid,
guint32 iaid,
diff --git a/src/dhcp/nm-dhcp-nettools.c b/src/dhcp/nm-dhcp-nettools.c
index 00b416da3a..1019f33a2a 100644
--- a/src/dhcp/nm-dhcp-nettools.c
+++ b/src/dhcp/nm-dhcp-nettools.c
@@ -68,6 +68,20 @@ G_DEFINE_TYPE (NMDhcpNettools, nm_dhcp_nettools, NM_TYPE_DHCP_CLIENT)
/*****************************************************************************/
+static void
+set_error_nettools (GError **error, int r, const char *message)
+{
+ /* the error code returned from n_dhcp4_* API is either a negative
+ * errno, or a positive internal error code. Generate different messages
+ * for these. */
+ if (r < 0)
+ nm_utils_error_set_errno (error, r, "%s: %s", message);
+ else
+ nm_utils_error_set (error, r, "%s (code %d)", message, r);
+}
+
+/*****************************************************************************/
+
#define DHCP_MAX_FQDN_LENGTH 255
enum {
@@ -681,11 +695,10 @@ lease_parse_metered (NDhcp4ClientLease *lease,
int r;
r = n_dhcp4_client_lease_query (lease, NM_DHCP_OPTION_DHCP4_VENDOR_SPECIFIC, &data, &n_data);
- if (r) {
+ if (r)
metered = FALSE;
- } else {
+ else
metered = !!memmem (data, n_data, "ANDROID_METERED", NM_STRLEN ("ANDROID_METERED"));
- }
/* TODO: expose the vendor specific option when present */
nm_ip4_config_set_metered (ip4_config, metered);
@@ -1023,9 +1036,8 @@ dhcp4_event_handle (NMDhcpNettools *self,
case N_DHCP4_CLIENT_EVENT_OFFER:
/* always accept the first lease */
r = n_dhcp4_client_lease_select (event->offer.lease);
- if (r) {
+ if (r)
_LOGW ("selecting lease failed: %d", r);
- }
break;
case N_DHCP4_CLIENT_EVENT_RETRACTED:
case N_DHCP4_CLIENT_EVENT_EXPIRED:
@@ -1170,7 +1182,7 @@ nettools_create (NMDhcpNettools *self,
r = n_dhcp4_client_config_new (&config);
if (r) {
- nm_utils_error_set_errno (error, r, "failed to create client-config: %s");
+ set_error_nettools (error, r, "failed to create client-config");
return FALSE;
}
@@ -1184,13 +1196,13 @@ nettools_create (NMDhcpNettools *self,
client_id_arr,
NM_MIN (client_id_len, 1 + _NM_SD_MAX_CLIENT_ID_LEN));
if (r) {
- nm_utils_error_set_errno (error, r, "failed to set client-id: %s");
+ set_error_nettools (error, r, "failed to set client-id");
return FALSE;
}
r = n_dhcp4_client_new (&client, config);
if (r) {
- nm_utils_error_set (error, NM_UTILS_ERROR_UNKNOWN, "failed to create client: error %d", r);
+ set_error_nettools (error, r, "failed to create client");
return FALSE;
}
@@ -1224,7 +1236,7 @@ _accept (NMDhcpClient *client,
r = n_dhcp4_client_lease_accept (priv->lease);
if (r) {
- nm_utils_error_set_errno (error, r, "failed to accept lease: %s");
+ set_error_nettools (error, r, "failed to accept lease");
return FALSE;
}
@@ -1248,7 +1260,7 @@ decline (NMDhcpClient *client,
r = n_dhcp4_client_lease_decline (priv->lease, error_message);
if (r) {
- nm_utils_error_set_errno (error, r, "failed to decline lease: %s");
+ set_error_nettools (error, r, "failed to decline lease");
return FALSE;
}
@@ -1285,6 +1297,7 @@ ip4_start (NMDhcpClient *client,
gs_free char *lease_file = NULL;
struct in_addr last_addr = { 0 };
const char *hostname;
+ const char *mud_url;
int r, i;
g_return_val_if_fail (!priv->probe, FALSE);
@@ -1294,7 +1307,7 @@ ip4_start (NMDhcpClient *client,
r = n_dhcp4_client_probe_config_new (&config);
if (r) {
- nm_utils_error_set_errno (error, r, "failed to create dhcp-client-probe-config: %s");
+ set_error_nettools (error, r, "failed to create dhcp-client-probe-config");
return FALSE;
}
@@ -1341,6 +1354,17 @@ ip4_start (NMDhcpClient *client,
}
}
+ mud_url = nm_dhcp_client_get_mud_url (client);
+ if (mud_url) {
+ r = n_dhcp4_client_probe_config_append_option (config,
+ NM_DHCP_OPTION_DHCP4_MUD_URL,
+ mud_url,
+ strlen (mud_url));
+ if (r) {
+ set_error_nettools (error, r, "failed to set MUD URL");
+ return FALSE;
+ }
+ }
hostname = nm_dhcp_client_get_hostname (client);
if (hostname) {
if (nm_dhcp_client_get_use_fqdn (client)) {
@@ -1359,7 +1383,10 @@ ip4_start (NMDhcpClient *client,
sizeof (buffer) - 3,
FALSE);
if (r <= 0) {
- nm_utils_error_set_errno (error, r, "failed to convert DHCP FQDN: %s");
+ if (r < 0)
+ nm_utils_error_set_errno (error, r, "failed to convert DHCP FQDN: %s");
+ else
+ nm_utils_error_set (error, r, "failed to convert DHCP FQDN");
return FALSE;
}
fqdn_len = r;
@@ -1377,7 +1404,7 @@ ip4_start (NMDhcpClient *client,
buffer,
3 + fqdn_len);
if (r) {
- nm_utils_error_set_errno (error, r, "failed to set DHCP FQDN: %s");
+ set_error_nettools (error, r, "failed to set DHCP FQDN");
return FALSE;
}
} else {
@@ -1386,7 +1413,7 @@ ip4_start (NMDhcpClient *client,
hostname,
strlen (hostname));
if (r) {
- nm_utils_error_set_errno (error, r, "failed to set DHCP hostname: %s");
+ set_error_nettools (error, r, "failed to set DHCP hostname");
return FALSE;
}
}
@@ -1397,7 +1424,7 @@ ip4_start (NMDhcpClient *client,
r = n_dhcp4_client_probe (priv->client, &priv->probe, config);
if (r) {
- nm_utils_error_set_errno (error, r, "failed to start DHCP client: %s");
+ set_error_nettools (error, r, "failed to start DHCP client");
return FALSE;
}
@@ -1434,7 +1461,7 @@ dispose (GObject *object)
{
NMDhcpNettoolsPrivate *priv = NM_DHCP_NETTOOLS_GET_PRIVATE (object);
- nm_clear_pointer (&priv->lease_file, g_free);
+ nm_clear_g_free (&priv->lease_file);
nm_clear_g_source_inst (&priv->event_source);
nm_clear_pointer (&priv->lease, n_dhcp4_client_lease_unref);
nm_clear_pointer (&priv->probe, n_dhcp4_client_probe_free);
diff --git a/src/dhcp/nm-dhcp-options.c b/src/dhcp/nm-dhcp-options.c
index 1d391f3e9c..b10635fc67 100644
--- a/src/dhcp/nm-dhcp-options.c
+++ b/src/dhcp/nm-dhcp-options.c
@@ -126,6 +126,7 @@ const NMDhcpOption _nm_dhcp_option_dhcp4_options[] = {
REQ (NM_DHCP_OPTION_DHCP4_TFTP_SERVER_ADDRESS, "tftp_server_address", FALSE ),
REQ (NM_DHCP_OPTION_DHCP4_V4_PORTPARAMS, "v4_portparams", FALSE ),
REQ (NM_DHCP_OPTION_DHCP4_V4_CAPTIVE_PORTAL, "v4_captive_portal", FALSE ),
+ REQ (NM_DHCP_OPTION_DHCP4_MUD_URL, "mud_url", FALSE ),
REQ (NM_DHCP_OPTION_DHCP4_LOADER_CONFIGFILE, "loader_configfile", FALSE ),
REQ (NM_DHCP_OPTION_DHCP4_LOADER_PATHPREFIX, "loader_pathprefix", FALSE ),
REQ (NM_DHCP_OPTION_DHCP4_LOADER_REBOOTTIME, "loader_reboottime", FALSE ),
@@ -182,6 +183,7 @@ const NMDhcpOption _nm_dhcp_option_dhcp6_options[] = {
REQ (NM_DHCP_OPTION_DHCP6_DNS_SERVERS, "dhcp6_name_servers", TRUE ),
REQ (NM_DHCP_OPTION_DHCP6_DOMAIN_LIST, "dhcp6_domain_search", TRUE ),
REQ (NM_DHCP_OPTION_DHCP6_SNTP_SERVERS, "dhcp6_sntp_servers", TRUE ),
+ REQ (NM_DHCP_OPTION_DHCP6_MUD_URL, "dhcp6_mud_url", FALSE ),
/* Internal values */
REQ (NM_DHCP_OPTION_DHCP6_NM_IP_ADDRESS, "ip6_address", FALSE ),
diff --git a/src/dhcp/nm-dhcp-options.h b/src/dhcp/nm-dhcp-options.h
index bf9ccd5719..7c0121702d 100644
--- a/src/dhcp/nm-dhcp-options.h
+++ b/src/dhcp/nm-dhcp-options.h
@@ -110,6 +110,7 @@ typedef enum {
NM_DHCP_OPTION_DHCP4_TFTP_SERVER_ADDRESS = 150,
NM_DHCP_OPTION_DHCP4_V4_PORTPARAMS = 159,
NM_DHCP_OPTION_DHCP4_V4_CAPTIVE_PORTAL = 160,
+ NM_DHCP_OPTION_DHCP4_MUD_URL = 161,
NM_DHCP_OPTION_DHCP4_LOADER_CONFIGFILE = 209,
NM_DHCP_OPTION_DHCP4_LOADER_PATHPREFIX = 210,
NM_DHCP_OPTION_DHCP4_LOADER_REBOOTTIME = 211,
@@ -159,6 +160,7 @@ typedef enum {
NM_DHCP_OPTION_DHCP6_DNS_SERVERS = 23,
NM_DHCP_OPTION_DHCP6_DOMAIN_LIST = 24,
NM_DHCP_OPTION_DHCP6_SNTP_SERVERS = 31,
+ NM_DHCP_OPTION_DHCP6_MUD_URL = 112,
/* Internal values */
NM_DHCP_OPTION_DHCP6_NM_IP_ADDRESS = 1026,
NM_DHCP_OPTION_DHCP6_NM_PREFIXLEN = 1027,
diff --git a/src/dhcp/nm-dhcp-systemd.c b/src/dhcp/nm-dhcp-systemd.c
index 23862e9e9b..72f60ccbf0 100644
--- a/src/dhcp/nm-dhcp-systemd.c
+++ b/src/dhcp/nm-dhcp-systemd.c
@@ -573,6 +573,7 @@ ip4_start (NMDhcpClient *client,
size_t client_id_len;
struct in_addr last_addr = { 0 };
const char *hostname;
+ const char *mud_url;
int r, i;
g_return_val_if_fail (!priv->client4, FALSE);
@@ -688,6 +689,15 @@ ip4_start (NMDhcpClient *client,
}
}
+ mud_url = nm_dhcp_client_get_mud_url (client);
+ if (mud_url) {
+ r = sd_dhcp_client_set_mud_url (sd_client, mud_url);
+ if (r < 0) {
+ nm_utils_error_set_errno (error, r, "failed to set DHCP MUDURL: %s");
+ return FALSE;
+ }
+ }
+
r = sd_dhcp_client_set_callback (sd_client, dhcp_event_cb, client);
if (r < 0) {
nm_utils_error_set_errno (error, r, "failed to set callback: %s");
@@ -894,6 +904,7 @@ ip6_start (NMDhcpClient *client,
nm_auto (sd_dhcp6_client_unrefp) sd_dhcp6_client *sd_client = NULL;
GBytes *hwaddr;
const char *hostname;
+ const char *mud_url;
int r, i;
const guint8 *duid_arr;
gsize duid_len;
@@ -976,6 +987,15 @@ ip6_start (NMDhcpClient *client,
}
}
+ mud_url = nm_dhcp_client_get_mud_url (client);
+ if (mud_url) {
+ r = sd_dhcp6_client_set_request_mud_url (sd_client, mud_url);
+ if (r < 0) {
+ nm_utils_error_set_errno (error, r, "failed to set mud-url: %s");
+ return FALSE;
+ }
+ }
+
if (needed_prefixes > 0) {
if (needed_prefixes > 1)
_LOGW ("dhcp-client6: only one prefix request is supported");
diff --git a/src/dhcp/tests/test-dhcp-dhclient.c b/src/dhcp/tests/test-dhcp-dhclient.c
index 761f9cdba6..d51bcae5f8 100644
--- a/src/dhcp/tests/test-dhcp-dhclient.c
+++ b/src/dhcp/tests/test-dhcp-dhclient.c
@@ -21,6 +21,7 @@
#include "nm-test-utils-core.h"
#define TEST_DIR NM_BUILD_SRCDIR"/src/dhcp/tests"
+#define TEST_MUDURL "https://example.com/mud.json"
static void
test_config (const char *orig,
@@ -33,7 +34,8 @@ test_config (const char *orig,
const char *dhcp_client_id,
GBytes *expected_new_client_id,
const char *iface,
- const char *anycast_addr)
+ const char *anycast_addr,
+ const char *mud_url)
{
gs_free char *new = NULL;
gs_unref_bytes GBytes *client_id = NULL;
@@ -52,6 +54,7 @@ test_config (const char *orig,
timeout,
use_fqdn,
hostname_flags,
+ mud_url,
"/path/to/dhclient.conf",
orig,
&new_client_id);
@@ -100,7 +103,37 @@ test_orig_missing (void)
orig_missing_expected,
AF_INET, NULL, 0, FALSE,
NM_DHCP_HOSTNAME_FLAG_NONE,
- NULL, NULL, "eth0", NULL);
+ NULL, NULL, "eth0", NULL, NULL);
+}
+
+/*****************************************************************************/
+
+
+static const char *orig_missing_add_mud_url_expected = \
+ "# Created by NetworkManager\n"
+ "\n"
+ "option mudurl code 161 = text;\n"
+ "send mudurl \"https://example.com/mud.json\";\n\n"
+ "option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;\n"
+ "option ms-classless-static-routes code 249 = array of unsigned integer 8;\n"
+ "option wpad code 252 = string;\n"
+ "\n"
+ "also request rfc3442-classless-static-routes;\n"
+ "also request ms-classless-static-routes;\n"
+ "also request static-routes;\n"
+ "also request wpad;\n"
+ "also request ntp-servers;\n"
+ "also request root-path;\n"
+ "\n";
+
+static void
+test_orig_missing_add_mud_url (void)
+{
+ test_config (NULL,
+ orig_missing_add_mud_url_expected,
+ AF_INET, NULL, 0, FALSE,
+ NM_DHCP_HOSTNAME_FLAG_NONE,
+ NULL, NULL, "eth0", NULL, TEST_MUDURL);
}
/*****************************************************************************/
@@ -135,6 +168,7 @@ test_override_client_id (void)
"11:22:33:44:55:66",
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -166,6 +200,7 @@ test_quote_client_id (void)
"abcd",
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -197,6 +232,7 @@ test_quote_client_id_2 (void)
"a\\bc",
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -228,6 +264,7 @@ test_hex_zero_client_id (void)
"00:11:22:33",
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -259,6 +296,7 @@ test_ascii_client_id (void)
"qb:cd:ef:12:34:56",
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -290,6 +328,7 @@ test_hex_single_client_id (void)
"ab:cd:e:12:34:56",
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -329,6 +368,7 @@ test_existing_hex_client_id (void)
NULL,
new_client_id,
"eth0",
+ NULL,
NULL);
}
@@ -367,6 +407,7 @@ test_existing_escaped_client_id (void)
NULL,
new_client_id,
"eth0",
+ NULL,
NULL);
}
@@ -409,6 +450,7 @@ test_existing_ascii_client_id (void)
NULL,
new_client_id,
"eth0",
+ NULL,
NULL);
}
/*****************************************************************************/
@@ -443,6 +485,7 @@ test_fqdn (void)
NULL,
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -486,6 +529,7 @@ test_fqdn_options_override (void)
TRUE, NULL,
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -521,6 +565,7 @@ test_override_hostname (void)
NULL,
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -550,6 +595,7 @@ test_override_hostname6 (void)
NULL,
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -576,6 +622,7 @@ test_nonfqdn_hostname6 (void)
NULL,
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -613,6 +660,7 @@ test_existing_alsoreq (void)
NULL,
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -653,6 +701,7 @@ test_existing_req (void)
NULL,
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -694,6 +743,7 @@ test_existing_multiline_alsoreq (void)
NULL,
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -934,6 +984,7 @@ test_interface1 (void)
NULL,
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -981,6 +1032,7 @@ test_interface2 (void)
NULL,
NULL,
"eth1",
+ NULL,
NULL);
}
@@ -1093,6 +1145,7 @@ test_structured (void)
NULL,
new_client_id,
"eth0",
+ NULL,
NULL);
}
@@ -1149,6 +1202,7 @@ test_config_req_intf (void)
NULL,
NULL,
"eth0",
+ NULL,
NULL);
}
@@ -1162,6 +1216,7 @@ main (int argc, char **argv)
nmtst_init_with_logging (&argc, &argv, NULL, "DEFAULT");
g_test_add_func ("/dhcp/dhclient/orig_missing", test_orig_missing);
+ g_test_add_func ("/dhcp/dhclient/orig_missing_add_mud_url", test_orig_missing_add_mud_url);
g_test_add_func ("/dhcp/dhclient/override_client_id", test_override_client_id);
g_test_add_func ("/dhcp/dhclient/quote_client_id/1", test_quote_client_id);
g_test_add_func ("/dhcp/dhclient/quote_client_id/2", test_quote_client_id_2);
diff --git a/src/initrd/nm-initrd-generator.c b/src/initrd/nm-initrd-generator.c
index dccb21f87f..a04ffb7d4f 100644
--- a/src/initrd/nm-initrd-generator.c
+++ b/src/initrd/nm-initrd-generator.c
@@ -64,24 +64,28 @@ err_out:
}
#define DEFAULT_SYSFS_DIR "/sys"
+#define DEFAULT_INITRD_DATA_DIR NMRUNDIR "/initrd"
int
main (int argc, char *argv[])
{
GHashTable *connections;
gs_free char *connections_dir = NULL;
+ gs_free char *initrd_dir = NULL;
gs_free char *sysfs_dir = NULL;
gboolean dump_to_stdout = FALSE;
gs_strfreev char **remaining = NULL;
GOptionEntry option_entries[] = {
- { "connections-dir", 'c', 0, G_OPTION_ARG_FILENAME, &connections_dir, "Output connection directory", NM_KEYFILE_PATH_NAME_RUN },
- { "sysfs-dir", 'd', 0, G_OPTION_ARG_FILENAME, &sysfs_dir, "The sysfs mount point", DEFAULT_SYSFS_DIR },
- { "stdout", 's', 0, G_OPTION_ARG_NONE, &dump_to_stdout, "Dump connections to standard output", NULL },
- { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, NULL },
+ { "connections-dir", 'c', 0, G_OPTION_ARG_FILENAME, &connections_dir, "Output connection directory", NM_KEYFILE_PATH_NAME_RUN },
+ { "initrd-data-dir", 'i', 0, G_OPTION_ARG_FILENAME, &initrd_dir, "Output initrd data directory", DEFAULT_INITRD_DATA_DIR },
+ { "sysfs-dir", 'd', 0, G_OPTION_ARG_FILENAME, &sysfs_dir, "The sysfs mount point", DEFAULT_SYSFS_DIR },
+ { "stdout", 's', 0, G_OPTION_ARG_NONE, &dump_to_stdout, "Dump connections to standard output", NULL },
+ { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, NULL },
{ NULL }
};
GOptionContext *option_context;
- GError *error = NULL;
+ gs_free_error GError *error = NULL;
+ gs_free char *hostname = NULL;
int errsv;
option_context = g_option_context_new ("-- [ip=...] [rd.route=...] [bridge=...] [bond=...] [team=...] [vlan=...] "
@@ -108,6 +112,8 @@ main (int argc, char *argv[])
connections_dir = g_strdup (NM_KEYFILE_PATH_NAME_RUN);
if (!sysfs_dir)
sysfs_dir = g_strdup (DEFAULT_SYSFS_DIR);
+ if (!initrd_dir)
+ initrd_dir = g_strdup (DEFAULT_INITRD_DATA_DIR);
if (dump_to_stdout)
nm_clear_g_free (&connections_dir);
@@ -117,9 +123,31 @@ main (int argc, char *argv[])
return 1;
}
- connections = nmi_cmdline_reader_parse (sysfs_dir, (const char *const*) remaining);
+ connections = nmi_cmdline_reader_parse (sysfs_dir,
+ (const char *const*) remaining,
+ &hostname);
+
g_hash_table_foreach (connections, output_conn, connections_dir);
g_hash_table_destroy (connections);
+ if (g_mkdir_with_parents (initrd_dir, 0755) != 0) {
+ errsv = errno;
+ _LOGW (LOGD_CORE, "%s: %s", initrd_dir, nm_strerror_native (errsv));
+ return 1;
+ }
+
+ if (hostname) {
+ gs_free char *hostname_file = NULL;
+ gs_free char *data = NULL;
+
+ hostname_file = g_strdup_printf ("%s/hostname", initrd_dir);
+ data = g_strdup_printf ("%s\n", hostname);
+
+ if (!g_file_set_contents (hostname_file, data, strlen (data), &error)) {
+ _LOGW (LOGD_CORE, "%s: %s", hostname_file, error->message);
+ return 1;
+ }
+ }
+
return 0;
}
diff --git a/src/initrd/nm-initrd-generator.h b/src/initrd/nm-initrd-generator.h
index cba383d1e0..9719992125 100644
--- a/src/initrd/nm-initrd-generator.h
+++ b/src/initrd/nm-initrd-generator.h
@@ -28,6 +28,6 @@ gboolean nmi_ibft_update_connection_from_nic (NMConnection *connection, GHashTab
NMConnection *nmi_dt_reader_parse (const char *sysfs_dir);
-GHashTable *nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv);
+GHashTable *nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv, char **hostname);
#endif /* __NM_INITRD_GENERATOR_H__ */
diff --git a/src/initrd/nmi-cmdline-reader.c b/src/initrd/nmi-cmdline-reader.c
index 2eb6d7e5be..2f6afefcb7 100644
--- a/src/initrd/nmi-cmdline-reader.c
+++ b/src/initrd/nmi-cmdline-reader.c
@@ -7,6 +7,7 @@
#include "nm-core-internal.h"
#include "nm-initrd-generator.h"
+#include "systemd/nm-sd-utils-shared.h"
/*****************************************************************************/
@@ -22,6 +23,11 @@ typedef struct {
GPtrArray *array;
NMConnection *bootdev_connection; /* connection for bootdev=$ifname */
NMConnection *default_connection; /* connection not bound to any ifname */
+ char *hostname;
+
+ /* Parameters to be set for all connections */
+ gboolean ignore_auto_dns;
+ int dhcp_timeout;
} Reader;
static Reader *
@@ -45,6 +51,7 @@ reader_destroy (Reader *reader, gboolean free_hash)
g_ptr_array_unref (reader->array);
hash = g_steal_pointer (&reader->hash);
+ nm_clear_g_free (&reader->hostname);
nm_g_slice_free (reader);
if (!free_hash)
return g_steal_pointer (&hash);
@@ -86,6 +93,8 @@ reader_create_connection (Reader *reader,
g_object_set (setting,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE,
+ NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, reader->ignore_auto_dns,
+ NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, reader->dhcp_timeout,
NULL);
setting = nm_setting_ip6_config_new ();
@@ -94,6 +103,8 @@ reader_create_connection (Reader *reader,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE,
NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE, (int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
+ NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, reader->ignore_auto_dns,
+ NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, reader->dhcp_timeout,
NULL);
setting = nm_setting_connection_new ();
@@ -345,6 +356,14 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
ifname = tmp;
}
+ if (client_hostname && !nm_sd_hostname_is_valid (client_hostname, FALSE))
+ client_hostname = NULL;
+
+ if (client_hostname) {
+ g_free (reader->hostname);
+ reader->hostname = g_strdup (client_hostname);
+ }
+
/* <ifname>:{none|off|dhcp|on|any|dhcp6|auto6|ibft} */
kind = get_word (&argument, ':');
@@ -808,27 +827,6 @@ _normalize_conn (gpointer key, gpointer value, gpointer user_data)
}
static void
-reader_set_ignore_auto_dns (Reader *reader)
-{
- GHashTableIter iter;
- NMConnection *connection;
- NMSettingIPConfig *s_ip = NULL;
-
- g_hash_table_iter_init (&iter, reader->hash);
- while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &connection)) {
- s_ip = nm_connection_get_setting_ip4_config (connection);
- g_object_set (s_ip,
- NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, TRUE,
- NULL);
-
- s_ip = nm_connection_get_setting_ip6_config (connection);
- g_object_set (s_ip,
- NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, TRUE,
- NULL);
- }
-}
-
-static void
reader_add_nameservers (Reader *reader, GPtrArray *nameservers)
{
NMConnection *connection;
@@ -875,7 +873,7 @@ reader_add_nameservers (Reader *reader, GPtrArray *nameservers)
}
GHashTable *
-nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv)
+nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv, char **hostname)
{
Reader *reader;
const char *tag;
@@ -886,16 +884,27 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv)
gboolean net_ifnames = TRUE;
gs_unref_ptrarray GPtrArray *nameservers = NULL;
gs_unref_ptrarray GPtrArray *routes = NULL;
- gboolean ignore_auto_dns = FALSE;
int i;
reader = reader_new ();
for (i = 0; argv[i]; i++) {
- if (strcmp (argv[i], "net.ifnames=0") == 0)
- net_ifnames = FALSE;
- else if (g_str_has_prefix (argv[i], "net.ifnames="))
- net_ifnames = TRUE;
+ gs_free char *argument_clone = NULL;
+ char *argument;
+
+ argument_clone = g_strdup (argv[i]);
+ argument = argument_clone;
+
+ tag = get_word (&argument, '=');
+
+ if (strcmp (tag, "net.ifnames") == 0)
+ net_ifnames = strcmp (argument, "0") != 0;
+ else if (strcmp (tag, "rd.peerdns") == 0)
+ reader->ignore_auto_dns = !_nm_utils_ascii_str_to_bool (argument, TRUE);
+ else if (strcmp (tag, "rd.net.timeout.dhcp") == 0) {
+ reader->dhcp_timeout = _nm_utils_ascii_str_to_int64 (argument,
+ 10, 0, G_MAXINT32, 0);
+ }
}
for (i = 0; argv[i]; i++) {
@@ -933,9 +942,7 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv)
}
if (argument && *argument)
_LOGW (LOGD_CORE, "Ignoring extra: '%s'.", argument);
- } else if (strcmp (tag, "rd.peerdns") == 0)
- ignore_auto_dns = !_nm_utils_ascii_str_to_bool (argument, TRUE);
- else if (strcmp (tag, "rd.iscsi.ibft") == 0 && _nm_utils_ascii_str_to_bool (argument, TRUE))
+ } else if (strcmp (tag, "rd.iscsi.ibft") == 0 && _nm_utils_ascii_str_to_bool (argument, TRUE))
reader_read_all_connections_from_fw (reader, sysfs_dir);
else if (strcmp (tag, "rd.bootif") == 0)
ignore_bootif = !_nm_utils_ascii_str_to_bool (argument, TRUE);
@@ -1009,9 +1016,9 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv)
if (nameservers)
reader_add_nameservers (reader, nameservers);
- if (ignore_auto_dns)
- reader_set_ignore_auto_dns (reader);
-
g_hash_table_foreach (reader->hash, _normalize_conn, NULL);
+
+ NM_SET_OUT (hostname, g_steal_pointer (&reader->hostname));
+
return reader_destroy (reader, FALSE);
}
diff --git a/src/initrd/tests/test-cmdline-reader.c b/src/initrd/tests/test-cmdline-reader.c
index b2b06e27c3..4c972e7384 100644
--- a/src/initrd/tests/test-cmdline-reader.c
+++ b/src/initrd/tests/test-cmdline-reader.c
@@ -30,10 +30,12 @@ test_auto (void)
NMSettingWired *s_wired;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 1);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "default_connection");
g_assert (connection);
@@ -81,10 +83,12 @@ test_if_auto_with_mtu (void)
NMSettingWired *s_wired;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 1);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "eth0");
g_assert (connection);
@@ -115,10 +119,13 @@ test_if_dhcp6 (void)
NMConnection *connection;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 1);
+ g_assert_cmpstr (hostname, ==, NULL);
+
connection = g_hash_table_lookup (connections, "eth1");
g_assert (connection);
nmtst_assert_connection_verifies_without_normalization (connection);
@@ -145,10 +152,12 @@ test_if_auto_with_mtu_and_mac (void)
NMSettingWired *s_wired;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 1);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "eth2");
g_assert (connection);
@@ -183,10 +192,12 @@ test_if_ip4_manual (void)
NMConnection *connection;
NMSettingIPConfig *s_ip4;
NMIPAddress *ip_addr;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+ g_assert_cmpstr (hostname, ==, "hostname1.example.com");
connection = g_hash_table_lookup (connections, "eth3");
g_assert (connection);
@@ -237,10 +248,12 @@ test_if_ip6_manual (void)
NMConnection *connection;
NMSettingIPConfig *s_ip6;
NMIPAddress *ip_addr;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 1);
+ g_assert_cmpstr (hostname, ==, "hostname0.example.com");
connection = g_hash_table_lookup (connections, "eth4");
g_assert (connection);
@@ -274,10 +287,12 @@ test_multiple_merge (void)
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
NMIPAddress *ip_addr;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 1);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "eth0");
g_assert (connection);
@@ -317,10 +332,12 @@ test_multiple_bootdev (void)
NMConnection *connection;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "eth3");
g_assert (connection);
@@ -344,10 +361,12 @@ test_bootdev (void)
const char *const*ARGV = NM_MAKE_STRV ("vlan=vlan2:ens5", "bootdev=ens3");
NMConnection *connection;
NMSettingConnection *s_con;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "ens3");
g_assert (connection);
@@ -384,10 +403,12 @@ test_some_more (void)
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
NMIPRoute *ip_route;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "eth1");
g_assert (connection);
@@ -466,10 +487,12 @@ test_bond (void)
NMSettingBond *s_bond;
NMIPRoute *ip_route;
const char *master_uuid;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 3);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "bong0");
g_assert (connection);
@@ -545,10 +568,12 @@ test_bond_default (void)
NMSettingIPConfig *s_ip6;
NMSettingBond *s_bond;
const char *master_uuid;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "bond0");
@@ -598,7 +623,9 @@ static void
test_bridge (void)
{
gs_unref_hashtable GHashTable *connections = NULL;
- const char *const*ARGV = NM_MAKE_STRV ("bridge=bridge0:eth0,eth1", "rd.route=192.0.2.53::bridge0");
+ const char *const*ARGV = NM_MAKE_STRV ("bridge=bridge0:eth0,eth1",
+ "rd.route=192.0.2.53::bridge0",
+ "rd.net.timeout.dhcp=10");
NMConnection *connection;
NMSettingConnection *s_con;
NMSettingIPConfig *s_ip4;
@@ -606,10 +633,12 @@ test_bridge (void)
NMSettingBridge *s_bridge;
NMIPRoute *ip_route;
const char *master_uuid;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 3);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "bridge0");
g_assert (connection);
@@ -626,6 +655,7 @@ test_bridge (void)
g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 0);
g_assert (!nm_setting_ip_config_get_gateway (s_ip4));
g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip4), ==, 1);
+ g_assert_cmpint (nm_setting_ip_config_get_dhcp_timeout(s_ip4), ==, 10);
ip_route = nm_setting_ip_config_get_route (s_ip4, 0);
g_assert_cmpstr (nm_ip_route_get_dest (ip_route), ==, "192.0.2.53");
g_assert_cmpint (nm_ip_route_get_family (ip_route), ==, AF_INET);
@@ -640,6 +670,8 @@ test_bridge (void)
g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 0);
g_assert (!nm_setting_ip_config_get_gateway (s_ip6));
g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 0);
+ g_assert_cmpint (nm_setting_ip_config_get_dhcp_timeout(s_ip6), ==, 10);
+
s_bridge = nm_connection_get_setting_bridge (connection);
g_assert (s_bridge);
@@ -682,10 +714,12 @@ test_bridge_default (void)
NMSettingIPConfig *s_ip6;
NMSettingBridge *s_bridge;
const char *master_uuid;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "br0");
@@ -740,10 +774,12 @@ test_team (void)
NMSettingIPConfig *s_ip6;
NMSettingTeam *s_team;
const char *master_uuid;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 3);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "team0");
g_assert (connection);
@@ -806,10 +842,12 @@ test_ibft_ip_dev (void)
gs_unref_hashtable GHashTable *connections = NULL;
NMSettingConnection *s_con;
NMConnection *connection;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 1);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "eth0");
g_assert (connection);
@@ -825,10 +863,12 @@ _test_ibft_ip (const char *const*ARGV)
{
gs_unref_hashtable GHashTable *connections = NULL;
NMConnection *connection;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "ibft0");
g_assert (connection);
@@ -864,10 +904,12 @@ test_ignore_extra (void)
{
gs_unref_hashtable GHashTable *connections = NULL;
const char *const*ARGV = NM_MAKE_STRV ("blabla", "extra", "lalala");
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 0);
+ g_assert_cmpstr (hostname, ==, NULL);
}
static void
@@ -886,10 +928,12 @@ test_rd_znet (void)
{ .name = "portno", .value_str = "1" },
};
int i_s390_options_keys;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+ g_assert_cmpstr (hostname, ==, "foo.example.com");
connection = g_hash_table_lookup (connections, "enc800");
g_assert (NM_IS_CONNECTION (connection));
@@ -963,10 +1007,12 @@ test_rd_znet_legacy (void)
"net.ifnames=0");
NMConnection *connection;
NMSettingConnection *s_con;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+ g_assert_cmpstr (hostname, ==, "foo.example.com");
connection = g_hash_table_lookup (connections, "eth0");
g_assert (NM_IS_CONNECTION (connection));
@@ -1001,10 +1047,12 @@ test_bootif (void)
NMSettingWired *s_wired;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 1);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "default_connection");
g_assert (connection);
@@ -1037,10 +1085,12 @@ test_bootif_hwtype (void)
NMSettingWired *s_wired;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+ g_assert_cmpstr (hostname, ==, NULL);
connection = g_hash_table_lookup (connections, "eth0");
g_assert (connection);
@@ -1100,10 +1150,12 @@ test_nameserver (void)
"nameserver=[2606:4700:4700::1111]");
NMConnection *connection;
NMSettingIPConfig *s_ip;
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 3);
+ g_assert_cmpstr (hostname, ==, "foo.example.com");
connection = g_hash_table_lookup (connections, "eth0");
g_assert (connection);
@@ -1140,10 +1192,12 @@ test_bootif_off (void)
{
gs_unref_hashtable GHashTable *connections = NULL;
const char *const*ARGV = NM_MAKE_STRV ("BOOTIF=01-00-53-AB-cd-02-03", "rd.bootif=0");
+ gs_free char *hostname = NULL;
- connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert (connections);
g_assert_cmpint (g_hash_table_size (connections), ==, 0);
+ g_assert_cmpstr (hostname, ==, NULL);
}
NMTST_DEFINE ();
diff --git a/src/ndisc/nm-lndp-ndisc.c b/src/ndisc/nm-lndp-ndisc.c
index b10adc91f3..cff3db827b 100644
--- a/src/ndisc/nm-lndp-ndisc.c
+++ b/src/ndisc/nm-lndp-ndisc.c
@@ -101,6 +101,8 @@ receive_ra (struct ndp *ndp, struct ndp_msg *msg, gpointer user_data)
int offset;
int hop_limit;
guint32 val;
+ guint32 clamp_pltime;
+ guint32 clamp_vltime;
/* Router discovery is subject to the following RFC documents:
*
@@ -165,7 +167,22 @@ receive_ra (struct ndp *ndp, struct ndp_msg *msg, gpointer user_data)
changed |= NM_NDISC_CONFIG_GATEWAYS;
}
- /* Addresses & Routes */
+ /* Addresses & Routes
+ *
+ * The Preferred Lifetime and Valid Lifetime of PIOs are capped to Router Lifetime
+ * and NM_NDISC_VLTIME_MULT * Preferred Lifetime, respectively.
+ *
+ * The Lifetime of RIOs is capped to the Router Lifetime (there is no point in
+ * maintaining a route if it employs a dead router).
+ *
+ * See draft-gont-6man-slaac-renum
+ */
+ #define NM_NDISC_VLTIME_MULT ((guint32) 48)
+ clamp_pltime = ndp_msgra_router_lifetime (msgra);
+
+ /* clamp_pltime has at most 16 bit set, and multiplication cannot overflow. */
+ clamp_vltime = clamp_pltime * NM_NDISC_VLTIME_MULT;
+
ndp_msg_opt_for_each_offset (offset, msg, NDP_MSG_OPT_PREFIX) {
guint8 r_plen;
struct in6_addr r_network;
@@ -186,7 +203,7 @@ receive_ra (struct ndp *ndp, struct ndp_msg *msg, gpointer user_data)
.network = r_network,
.plen = r_plen,
.timestamp = now,
- .lifetime = ndp_msg_opt_prefix_valid_time (msg, offset),
+ .lifetime = NM_MIN (ndp_msg_opt_prefix_valid_time (msg, offset), clamp_vltime),
};
if (nm_ndisc_add_route (ndisc, &route))
@@ -199,8 +216,8 @@ receive_ra (struct ndp *ndp, struct ndp_msg *msg, gpointer user_data)
NMNDiscAddress address = {
.address = r_network,
.timestamp = now,
- .lifetime = ndp_msg_opt_prefix_valid_time (msg, offset),
- .preferred = ndp_msg_opt_prefix_preferred_time (msg, offset),
+ .lifetime = NM_MIN (ndp_msg_opt_prefix_valid_time (msg, offset), clamp_vltime),
+ .preferred = NM_MIN (ndp_msg_opt_prefix_preferred_time (msg, offset), clamp_pltime),
};
if (address.preferred <= address.lifetime) {
@@ -214,7 +231,7 @@ receive_ra (struct ndp *ndp, struct ndp_msg *msg, gpointer user_data)
.gateway = gateway_addr,
.plen = ndp_msg_opt_route_prefix_len (msg, offset),
.timestamp = now,
- .lifetime = ndp_msg_opt_route_lifetime (msg, offset),
+ .lifetime = NM_MIN (ndp_msg_opt_route_lifetime (msg, offset), clamp_pltime),
.preference = _route_preference_coerce (ndp_msg_opt_route_preference (msg, offset)),
};
diff --git a/src/ndisc/nm-ndisc.c b/src/ndisc/nm-ndisc.c
index 5e556084e8..bb3a92b05d 100644
--- a/src/ndisc/nm-ndisc.c
+++ b/src/ndisc/nm-ndisc.c
@@ -442,8 +442,15 @@ nm_ndisc_add_address (NMNDisc *ndisc,
}
if (existing) {
+ /* A Valid Lifetime of 0 eliminates the corresponding address(es). This deviates
+ * from RFC4862 Section 5.5.3, item e), as recommended in IETF draft draft-gont-6man-slaac-renum.
+ */
+ if (new->lifetime == 0) {
+ g_array_remove_index (rdata->addresses, i);
+ return TRUE;
+ }
+
if (from_ra) {
- const gint32 NM_NDISC_PREFIX_LFT_MIN = 7200; /* seconds, RFC4862 5.5.3.e */
gint64 old_expiry_lifetime, old_expiry_preferred;
old_expiry_lifetime = get_expiry (existing);
@@ -452,25 +459,16 @@ nm_ndisc_add_address (NMNDisc *ndisc,
if (new->lifetime == NM_NDISC_INFINITY)
existing->lifetime = NM_NDISC_INFINITY;
else {
- gint64 new_lifetime, remaining_lifetime;
+ gint64 new_lifetime;
- /* see RFC4862 5.5.3.e */
- if (existing->lifetime == NM_NDISC_INFINITY)
- remaining_lifetime = G_MAXINT64;
- else
- remaining_lifetime = ((gint64) existing->timestamp) + ((gint64) existing->lifetime) - ((gint64) now_s);
+ /* Honor small valid lifetimes, as discussed in
+ * draft-gont-6man-slaac-renum, to allow for more timelier
+ * reaction to renumbering events. This deviates from
+ * RFC4862 Section 5.5.3, item e).
+ */
new_lifetime = ((gint64) new->timestamp) + ((gint64) new->lifetime) - ((gint64) now_s);
-
- if ( new_lifetime > (gint64) NM_NDISC_PREFIX_LFT_MIN
- || new_lifetime > remaining_lifetime) {
- existing->timestamp = now_s;
- existing->lifetime = CLAMP (new_lifetime, (gint64) 0, (gint64) (G_MAXUINT32 - 1));
- } else if (remaining_lifetime <= (gint64) NM_NDISC_PREFIX_LFT_MIN) {
- /* keep the current lifetime. */
- } else {
- existing->timestamp = now_s;
- existing->lifetime = NM_NDISC_PREFIX_LFT_MIN;
- }
+ existing->timestamp = now_s;
+ existing->lifetime = CLAMP (new_lifetime, (gint64) 0, (gint64) (G_MAXUINT32 - 1));
}
if (new->preferred == NM_NDISC_INFINITY) {
@@ -487,11 +485,6 @@ nm_ndisc_add_address (NMNDisc *ndisc,
|| old_expiry_preferred != get_expiry_preferred (existing);
}
- if (new->lifetime == 0) {
- g_array_remove_index (rdata->addresses, i);
- return TRUE;
- }
-
if ( get_expiry (existing) == get_expiry (new)
&& get_expiry_preferred (existing) == get_expiry_preferred (new))
return FALSE;
diff --git a/src/ndisc/tests/test-ndisc-fake.c b/src/ndisc/tests/test-ndisc-fake.c
index 91fe9802d7..7a5eea012d 100644
--- a/src/ndisc/tests/test-ndisc-fake.c
+++ b/src/ndisc/tests/test-ndisc-fake.c
@@ -217,9 +217,8 @@ test_everything_changed (NMNDisc *ndisc, const NMNDiscData *rdata, guint changed
g_assert_cmpint (rdata->gateways_n, ==, 1);
match_gateway (rdata, 0, "fe80::2", data->timestamp1, 10, NM_ICMPV6_ROUTER_PREF_MEDIUM);
- g_assert_cmpint (rdata->addresses_n, ==, 2);
- match_address (rdata, 0, "2001:db8:a:a::1", data->timestamp1, 10, 0);
- match_address (rdata, 1, "2001:db8:a:b::1", data->timestamp1, 10, 10);
+ g_assert_cmpint (rdata->addresses_n, ==, 1);
+ match_address (rdata, 0, "2001:db8:a:b::1", data->timestamp1, 10, 10);
g_assert_cmpint (rdata->routes_n, ==, 1);
match_route (rdata, 0, "2001:db8:a:b::", 64, "fe80::2", data->timestamp1, 10, 10);
g_assert_cmpint (rdata->dns_servers_n, ==, 1);
diff --git a/src/nm-auth-manager.c b/src/nm-auth-manager.c
index 88e6cb9433..5b3702ecb6 100644
--- a/src/nm-auth-manager.c
+++ b/src/nm-auth-manager.c
@@ -37,11 +37,14 @@ static guint signals[LAST_SIGNAL] = {0};
typedef struct {
CList calls_lst_head;
GDBusConnection *dbus_connection;
- GCancellable *shutdown_cancellable;
+ GCancellable *main_cancellable;
+ char *name_owner;
guint64 call_numid_counter;
- guint changed_signal_id;
+ guint changed_id;
+ guint name_owner_changed_id;
bool disposing:1;
bool shutting_down:1;
+ bool got_name_owner:1;
NMAuthPolkitMode auth_polkit_mode:3;
} NMAuthManagerPrivate;
@@ -105,6 +108,12 @@ nm_auth_manager_get_polkit_enabled (NMAuthManager *self)
/*****************************************************************************/
+static void
+_emit_changed_signal (NMAuthManager *self)
+{
+ g_signal_emit (self, signals[CHANGED_SIGNAL], 0);
+}
+
typedef enum {
POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE = 0,
POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION = (1<<0),
@@ -204,17 +213,18 @@ _call_check_authorize_cb (GObject *proxy,
priv = NM_AUTH_MANAGER_GET_PRIVATE (self);
value = g_dbus_connection_call_finish (G_DBUS_CONNECTION (proxy), res, &error);
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+
+ if (nm_utils_error_is_cancelled (error)) {
/* call_id was cancelled externally, but _call_id_free() kept call_id
* alive (and it has still the reference on @self. */
- if (!priv->shutdown_cancellable) {
+ if (!priv->main_cancellable) {
/* we do a forced shutdown. There is no more time for cancelling... */
_call_id_free (call_id);
/* this shouldn't really happen, because:
- * _call_check_authorize() only scheduled the D-Bus request at a time when
- * shutdown_cancellable was still set. It means, somebody called force-shutdown
+ * nm_auth_manager_check_authorization() only scheduled the D-Bus request at a time when
+ * main_cancellable was still set. It means, somebody called force-shutdown
* after call-id was schedule.
* force-shutdown should only be called after:
* - cancel all pending requests
@@ -233,7 +243,7 @@ _call_check_authorize_cb (GObject *proxy,
G_VARIANT_TYPE ("()"),
G_DBUS_CALL_FLAGS_NONE,
CANCELLATION_TIMEOUT_MS,
- priv->shutdown_cancellable,
+ priv->main_cancellable,
cancel_check_authorization_cb,
call_id);
return;
@@ -357,7 +367,7 @@ nm_auth_manager_check_authorization (NMAuthManager *self,
call_id->dbus_cancellable = g_cancellable_new ();
- nm_assert (priv->shutdown_cancellable);
+ nm_assert (priv->main_cancellable);
g_dbus_connection_call (priv->dbus_connection,
POLKIT_SERVICE,
@@ -411,9 +421,95 @@ changed_signal_cb (GDBusConnection *connection,
gpointer user_data)
{
NMAuthManager *self = user_data;
+ NMAuthManagerPrivate *priv = NM_AUTH_MANAGER_GET_PRIVATE (self);
+ gboolean valid_sender;
- _LOGD ("dbus signal: \"Changed\"");
- g_signal_emit (self, signals[CHANGED_SIGNAL], 0);
+ nm_assert (nm_streq0 (signal_name, "Changed"));
+
+ valid_sender = nm_streq0 (priv->name_owner, sender_name);
+
+ _LOGD ("dbus-signal: \"Changed\" notification%s", valid_sender ? "" : " (ignore)");
+
+ if (valid_sender)
+ _emit_changed_signal (self);
+}
+
+static void
+_name_owner_changed (NMAuthManager *self,
+ const char *name_owner,
+ gboolean is_initial)
+{
+ NMAuthManagerPrivate *priv = NM_AUTH_MANAGER_GET_PRIVATE (self);
+ gboolean is_changed;
+ gs_free char *old_name_owner = NULL;
+
+ if (is_initial)
+ priv->got_name_owner = TRUE;
+ else {
+ if (!priv->got_name_owner)
+ return;
+ }
+
+ name_owner = nm_str_not_empty (name_owner);
+
+ is_changed = !nm_streq0 (priv->name_owner, name_owner);
+ if (is_changed) {
+ old_name_owner = g_steal_pointer (&priv->name_owner);
+ priv->name_owner = g_strdup (name_owner);
+ } else {
+ if (!is_initial)
+ return;
+ }
+
+ if (!priv->name_owner) {
+ if (is_initial)
+ _LOGT ("name-owner: polkit not running");
+ else
+ _LOGT ("name-owner: polkit stopped (was %s)", old_name_owner);
+ } else {
+ if (is_initial)
+ _LOGT ("name-owner: polkit is running (now %s)", priv->name_owner);
+ else if (old_name_owner)
+ _LOGT ("name-owner: polkit restarted (now %s, was %s)", priv->name_owner, old_name_owner);
+ else
+ _LOGT ("name-owner: polkit started (now %s)", priv->name_owner);
+ }
+
+ if (priv->name_owner)
+ _emit_changed_signal (self);
+}
+
+static void
+_name_owner_changed_cb (GDBusConnection *connection,
+ const char *sender_name,
+ const char *object_path,
+ const char *interface_name,
+ const char *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ NMAuthManager *self = user_data;
+ const char *new_owner;
+
+ if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(sss)")))
+ return;
+
+ g_variant_get (parameters,
+ "(&s&s&s)",
+ NULL,
+ NULL,
+ &new_owner);
+
+ _name_owner_changed (self, new_owner, FALSE);
+}
+
+static void
+_name_owner_get_cb (const char *name_owner,
+ GError *error,
+ gpointer user_data)
+{
+ if (!nm_utils_error_is_cancelled (error))
+ _name_owner_changed (user_data, name_owner, TRUE);
}
/*****************************************************************************/
@@ -435,14 +531,17 @@ nm_auth_manager_force_shutdown (NMAuthManager *self)
priv = NM_AUTH_MANAGER_GET_PRIVATE (self);
+ /* FIXME(shutdown): ensure we properly call this API during shutdown as
+ * described next. */
+
/* while we have pending requests (NMAuthManagerCallId), the instance
* is kept alive.
*
- * Even if the caller cancells all pending call-ids, we still need to keep
+ * Even if the caller cancels all pending call-ids, we still need to keep
* a reference to self, in order to handle pending CancelCheckAuthorization
* requests.
*
- * To do a corrdinated shutdown, do the following:
+ * To do a coordinated shutdown, do the following:
* - cancel all pending NMAuthManagerCallId requests.
* - ensure everybody unrefs the NMAuthManager instance. If by that, the instance
* gets destroyed, the shutdown already completed successfully.
@@ -457,7 +556,7 @@ nm_auth_manager_force_shutdown (NMAuthManager *self)
*/
priv->shutting_down = TRUE;
- nm_clear_g_cancellable (&priv->shutdown_cancellable);
+ nm_clear_g_cancellable (&priv->main_cancellable);
}
/*****************************************************************************/
@@ -523,18 +622,31 @@ constructed (GObject *object)
goto out;
}
- priv->shutdown_cancellable = g_cancellable_new ();
-
- priv->changed_signal_id = g_dbus_connection_signal_subscribe (priv->dbus_connection,
- POLKIT_SERVICE,
- POLKIT_INTERFACE,
- "Changed",
- POLKIT_OBJECT_PATH,
- NULL,
- G_DBUS_SIGNAL_FLAGS_NONE,
- changed_signal_cb,
- self,
- NULL);
+ priv->main_cancellable = g_cancellable_new ();
+
+ priv->name_owner_changed_id = nm_dbus_connection_signal_subscribe_name_owner_changed (priv->dbus_connection,
+ POLKIT_SERVICE,
+ _name_owner_changed_cb,
+ self,
+ NULL);
+
+ priv->changed_id = g_dbus_connection_signal_subscribe (priv->dbus_connection,
+ POLKIT_SERVICE,
+ POLKIT_INTERFACE,
+ "Changed",
+ POLKIT_OBJECT_PATH,
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ changed_signal_cb,
+ self,
+ NULL);
+
+ nm_dbus_connection_call_get_name_owner (priv->dbus_connection,
+ POLKIT_SERVICE,
+ -1,
+ priv->main_cancellable,
+ _name_owner_get_cb,
+ self);
create_message = "polkit enabled";
@@ -578,14 +690,19 @@ dispose (GObject *object)
priv->disposing = TRUE;
- nm_clear_g_cancellable (&priv->shutdown_cancellable);
+ nm_clear_g_cancellable (&priv->main_cancellable);
nm_clear_g_dbus_connection_signal (priv->dbus_connection,
- &priv->changed_signal_id);
+ &priv->name_owner_changed_id);
+
+ nm_clear_g_dbus_connection_signal (priv->dbus_connection,
+ &priv->changed_id);
G_OBJECT_CLASS (nm_auth_manager_parent_class)->dispose (object);
g_clear_object (&priv->dbus_connection);
+
+ nm_clear_g_free (&priv->name_owner);
}
static void
diff --git a/src/nm-config-data.c b/src/nm-config-data.c
index 29dafa14ed..4169a36ea4 100644
--- a/src/nm-config-data.c
+++ b/src/nm-config-data.c
@@ -12,6 +12,7 @@
#include "devices/nm-device.h"
#include "nm-core-internal.h"
#include "nm-keyfile/nm-keyfile-internal.h"
+#include "nm-keyfile/nm-keyfile-utils.h"
/*****************************************************************************/
@@ -116,14 +117,6 @@ G_DEFINE_TYPE (NMConfigData, nm_config_data, G_TYPE_OBJECT)
/*****************************************************************************/
-#define _HAS_PREFIX(str, prefix) \
- ({ \
- const char *_str = (str); \
- g_str_has_prefix ( _str, ""prefix"") && _str[NM_STRLEN(prefix)] != '\0'; \
- })
-
-/*****************************************************************************/
-
const char *
nm_config_data_get_config_main_file (const NMConfigData *self)
{
@@ -215,6 +208,7 @@ nm_config_data_get_value_int64 (const NMConfigData *self, const char *group, con
char **
nm_config_data_get_plugins (const NMConfigData *self, gboolean allow_default)
{
+ gs_free_error GError *error = NULL;
const NMConfigDataPrivate *priv;
char **list;
@@ -222,8 +216,9 @@ nm_config_data_get_plugins (const NMConfigData *self, gboolean allow_default)
priv = NM_CONFIG_DATA_GET_PRIVATE (self);
- list = g_key_file_get_string_list (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins", NULL, NULL);
- if (!list && allow_default) {
+ list = g_key_file_get_string_list (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins", NULL, &error);
+ if ( nm_keyfile_error_is_not_found (error)
+ && allow_default) {
gs_unref_keyfile GKeyFile *kf = nm_config_create_keyfile ();
/* let keyfile split the default string according to its own escaping rules. */
@@ -550,14 +545,14 @@ _merge_keyfiles (GKeyFile *keyfile_user, GKeyFile *keyfile_intern)
continue;
if ( !is_intern && !is_atomic
- && _HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
+ && NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
const char *key_base = &key[NM_STRLEN (NM_CONFIG_KEYFILE_KEYPREFIX_WAS)];
if (!g_key_file_has_key (keyfile_intern, group, key_base, NULL))
g_key_file_remove_key (keyfile, group, key_base, NULL);
continue;
}
- if (!is_intern && !is_atomic && _HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET))
+ if (!is_intern && !is_atomic && NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET))
continue;
value = g_key_file_get_value (keyfile_intern, group, key, NULL);
diff --git a/src/nm-config.c b/src/nm-config.c
index 63347db7bb..d638059588 100644
--- a/src/nm-config.c
+++ b/src/nm-config.c
@@ -15,6 +15,7 @@
#include "NetworkManagerUtils.h"
#include "nm-core-internal.h"
#include "nm-keyfile/nm-keyfile-internal.h"
+#include "nm-keyfile/nm-keyfile-utils.h"
#define DEFAULT_CONFIG_MAIN_FILE NMCONFDIR "/NetworkManager.conf"
#define DEFAULT_CONFIG_DIR NMCONFDIR "/conf.d"
@@ -144,14 +145,6 @@ static void _set_config_data (NMConfig *self, NMConfigData *new_data, NMConfigCh
/*****************************************************************************/
-#define _HAS_PREFIX(str, prefix) \
- ({ \
- const char *_str = (str); \
- g_str_has_prefix ( _str, ""prefix"") && _str[NM_STRLEN(prefix)] != '\0'; \
- })
-
-/*****************************************************************************/
-
int
nm_config_parse_boolean (const char *str,
int default_value)
@@ -548,7 +541,7 @@ string_to_configure_and_quit (const char *value, GError **error)
if (value == NULL)
return NM_CONFIG_CONFIGURE_AND_QUIT_DISABLED;
- if (strcmp (value, "initrd") == 0)
+ if (nm_streq (value, "initrd"))
return NM_CONFIG_CONFIGURE_AND_QUIT_INITRD;
ret = nm_config_parse_boolean (value, NM_CONFIG_CONFIGURE_AND_QUIT_INVALID);
@@ -664,15 +657,13 @@ ignore_config_snippet (GKeyFile *keyfile, gboolean is_base_config)
static int
_sort_groups_cmp (const char **pa, const char **pb, gpointer dummy)
{
- const char *a, *b;
+ const char *a = *pa;
+ const char *b = *pb;
gboolean a_is_connection, b_is_connection;
gboolean a_is_device, b_is_device;
- a = *pa;
- b = *pb;
-
- a_is_connection = g_str_has_prefix (a, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
- b_is_connection = g_str_has_prefix (b, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
+ a_is_connection = NM_STR_HAS_PREFIX (a, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
+ b_is_connection = NM_STR_HAS_PREFIX (b, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
if (a_is_connection != b_is_connection) {
/* one is a [connection*] entry, the other not. We sort [connection*] entries
@@ -689,8 +680,8 @@ _sort_groups_cmp (const char **pa, const char **pb, gpointer dummy)
return pa > pb ? -1 : 1;
}
- a_is_device = g_str_has_prefix (a, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE);
- b_is_device = g_str_has_prefix (b, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE);
+ a_is_device = NM_STR_HAS_PREFIX (a, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE);
+ b_is_device = NM_STR_HAS_PREFIX (b, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE);
if (a_is_device != b_is_device) {
/* one is a [device*] entry, the other not. We sort [device*] entries
@@ -726,13 +717,13 @@ _nm_config_sort_groups (char **groups, gsize ngroups)
static gboolean
_setting_is_device_spec (const char *group, const char *key)
{
-#define _IS(group_v, key_v) (strcmp (group, (""group_v)) == 0 && strcmp (key, (""key_v)) == 0)
+#define _IS(group_v, key_v) (nm_streq (group, ""group_v"") && nm_streq (key, ""key_v""))
return _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_NO_AUTO_DEFAULT)
|| _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_IGNORE_CARRIER)
|| _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_ASSUME_IPV6LL_ONLY)
|| _IS (NM_CONFIG_KEYFILE_GROUP_KEYFILE, NM_CONFIG_KEYFILE_KEY_KEYFILE_UNMANAGED_DEVICES)
- || (g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION) && !strcmp (key, NM_CONFIG_KEYFILE_KEY_MATCH_DEVICE))
- || (g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE ) && !strcmp (key, NM_CONFIG_KEYFILE_KEY_MATCH_DEVICE));
+ || (NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION) && nm_streq (key, NM_CONFIG_KEYFILE_KEY_MATCH_DEVICE))
+ || (NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE ) && nm_streq (key, NM_CONFIG_KEYFILE_KEY_MATCH_DEVICE));
}
static gboolean
@@ -741,7 +732,7 @@ _setting_is_string_list (const char *group, const char *key)
return _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_PLUGINS)
|| _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_DEBUG)
|| _IS (NM_CONFIG_KEYFILE_GROUP_LOGGING, NM_CONFIG_KEYFILE_KEY_LOGGING_DOMAINS)
- || g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST);
+ || NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST);
#undef _IS
}
@@ -902,15 +893,20 @@ check_config_key (const char *group, const char *key)
}
static gboolean
-read_config (GKeyFile *keyfile, gboolean is_base_config,
- const char *dirname, const char *path,
- GPtrArray *warnings, GError **error)
-{
- GKeyFile *kf;
- char **groups, **keys;
- gsize ngroups, nkeys;
- int g, k;
+read_config (GKeyFile *keyfile,
+ gboolean is_base_config,
+ const char *dirname,
+ const char *path,
+ GPtrArray *warnings,
+ GError **error)
+{
+ gs_unref_keyfile GKeyFile *kf = NULL;
+ gs_strfreev char **groups = NULL;
gs_free char *path_free = NULL;
+ gsize ngroups;
+ gsize nkeys;
+ int g;
+ int k;
g_return_val_if_fail (keyfile, FALSE);
g_return_val_if_fail (path, FALSE);
@@ -931,14 +927,11 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
kf = nm_config_create_keyfile ();
if (!g_key_file_load_from_file (kf, path, G_KEY_FILE_NONE, error)) {
g_prefix_error (error, "%s: ", path);
- g_key_file_free (kf);
return FALSE;
}
- if (ignore_config_snippet (kf, is_base_config)) {
- g_key_file_free (kf);
+ if (ignore_config_snippet (kf, is_base_config))
return TRUE;
- }
/* the config-group is internal to every configuration snippets. It doesn't make sense
* to merge it into the global configuration, and it doesn't make sense to preserve the
@@ -962,8 +955,9 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
for (g = 0; groups && groups[g]; g++) {
const char *group = groups[g];
+ gs_strfreev char **keys = NULL;
- if (g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN)) {
+ if (NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN)) {
/* internal groups cannot be set by user configuration. */
continue;
}
@@ -971,21 +965,21 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
if (!keys)
continue;
for (k = 0; keys[k]; k++) {
+ gs_free char *new_value = NULL;
const char *key;
- char *new_value;
char last_char;
gsize key_len;
key = keys[k];
- g_assert (key && *key);
+ nm_assert (key && *key);
- if ( _HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)
- || _HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
+ if ( NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)
+ || NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
/* these keys are protected. We ignore them if the user sets them. */
continue;
}
- if (!strcmp (key, NM_CONFIG_KEYFILE_KEY_ATOMIC_SECTION_WAS)) {
+ if (nm_streq (key, NM_CONFIG_KEYFILE_KEY_ATOMIC_SECTION_WAS)) {
/* the "was" key is protected and it cannot be set by user configuration. */
continue;
}
@@ -996,6 +990,7 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
&& (last_char == '+' || last_char == '-')) {
gs_free char *base_key = g_strndup (key, key_len - 1);
gboolean is_string_list;
+ gboolean old_val_was_set = FALSE;
is_string_list = _setting_is_string_list (group, base_key);
@@ -1007,13 +1002,19 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
gs_free char **new_val = NULL;
if (is_string_list) {
- old_val = g_key_file_get_string_list (keyfile, group, base_key, NULL, NULL);
+ gs_free_error GError *old_error = NULL;
+
+ old_val = g_key_file_get_string_list (keyfile, group, base_key, NULL, &old_error);
new_val = g_key_file_get_string_list (kf, group, key, NULL, NULL);
- if (!old_val && !g_key_file_has_key (keyfile, group, base_key, NULL)) {
- /* we must fill the unspecified value with the compile-time default. */
- if (nm_streq (group, NM_CONFIG_KEYFILE_GROUP_MAIN) && nm_streq (base_key, "plugins")) {
+ if ( nm_streq (group, NM_CONFIG_KEYFILE_GROUP_MAIN)
+ && nm_streq (base_key, "plugins")) {
+ old_val_was_set = !nm_keyfile_error_is_not_found (old_error);
+ if ( !old_val
+ && !old_val_was_set) {
+ /* we must fill the unspecified value with the compile-time default. */
g_key_file_set_value (keyfile, group, base_key, NM_CONFIG_DEFAULT_MAIN_PLUGINS);
old_val = g_key_file_get_string_list (keyfile, group, base_key, NULL, NULL);
+ old_val_was_set = TRUE;
}
}
} else {
@@ -1059,7 +1060,7 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
g_key_file_set_value (keyfile, group, base_key, specs_joined);
}
} else {
- if (is_string_list)
+ if (is_string_list && !old_val_was_set)
g_key_file_remove_key (keyfile, group, base_key, NULL);
else
g_key_file_set_value (keyfile, group, base_key, "");
@@ -1079,12 +1080,8 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
g_strdup_printf ("unknown key '%s' in section [%s] of file '%s'",
key, group, path));
}
- g_free (new_value);
}
- g_strfreev (keys);
}
- g_strfreev (groups);
- g_key_file_free (kf);
return TRUE;
}
@@ -1174,7 +1171,7 @@ _get_config_dir_files (const char *config_dir)
if (direnum) {
while ((info = g_file_enumerator_next_file (direnum, NULL, NULL))) {
name = g_file_info_get_name (info);
- if (g_str_has_suffix (name, ".conf"))
+ if (NM_STR_HAS_SUFFIX (name, ".conf"))
g_ptr_array_add (confs, g_strdup (name));
g_object_unref (info);
}
@@ -1472,14 +1469,14 @@ intern_config_read (const char *filename,
const char *group = groups[g];
gboolean is_intern, is_atomic;
- if (!strcmp (group, NM_CONFIG_KEYFILE_GROUP_CONFIG))
+ if (nm_streq (group, NM_CONFIG_KEYFILE_GROUP_CONFIG))
continue;
keys = g_key_file_get_keys (keyfile, group, NULL, NULL);
if (!keys)
continue;
- is_intern = g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
+ is_intern = NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
is_atomic = !is_intern && _is_atomic_section (atomic_section_prefixes, group);
if (is_atomic) {
@@ -1489,7 +1486,7 @@ intern_config_read (const char *filename,
conf_section_is = _keyfile_serialize_section (keyfile_conf, group);
conf_section_was = g_key_file_get_string (keyfile, group, NM_CONFIG_KEYFILE_KEY_ATOMIC_SECTION_WAS, NULL);
- if (g_strcmp0 (conf_section_was, conf_section_is) != 0) {
+ if (!nm_streq0 (conf_section_was, conf_section_is)) {
/* the section no longer matches. Skip it entirely. */
needs_rewrite = TRUE;
continue;
@@ -1510,10 +1507,10 @@ intern_config_read (const char *filename,
has_intern = TRUE;
g_key_file_set_value (keyfile_intern, group, key, value_set);
} else if (is_atomic) {
- if (strcmp (key, NM_CONFIG_KEYFILE_KEY_ATOMIC_SECTION_WAS) == 0)
+ if (nm_streq (key, NM_CONFIG_KEYFILE_KEY_ATOMIC_SECTION_WAS))
continue;
g_key_file_set_value (keyfile_intern, group, key, value_set);
- } else if (_HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
+ } else if (NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
const char *key_base = &key[NM_STRLEN (NM_CONFIG_KEYFILE_KEYPREFIX_SET)];
gs_free char *value_was = NULL;
gs_free char *value_conf = NULL;
@@ -1523,7 +1520,7 @@ intern_config_read (const char *filename,
value_conf = g_key_file_get_value (keyfile_conf, group, key_base, NULL);
value_was = g_key_file_get_value (keyfile, group, key_was, NULL);
- if (g_strcmp0 (value_conf, value_was) != 0) {
+ if (!nm_streq0 (value_conf, value_was)) {
/* if value_was is no longer the same as @value_conf, it means the user
* changed the configuration since the last write. In this case, we
* drop the value. It also means our file is out-of-date, and we should
@@ -1533,7 +1530,7 @@ intern_config_read (const char *filename,
}
has_intern = TRUE;
g_key_file_set_value (keyfile_intern, group, key_base, value_set);
- } else if (_HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
+ } else if (NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
const char *key_base = &key[NM_STRLEN (NM_CONFIG_KEYFILE_KEYPREFIX_WAS)];
gs_free char *key_set = g_strdup_printf (NM_CONFIG_KEYFILE_KEYPREFIX_SET"%s", key_base);
gs_free char *value_was = NULL;
@@ -1548,7 +1545,7 @@ intern_config_read (const char *filename,
value_conf = g_key_file_get_value (keyfile_conf, group, key_base, NULL);
value_was = g_key_file_get_value (keyfile, group, key, NULL);
- if (g_strcmp0 (value_conf, value_was) != 0) {
+ if (!nm_streq0 (value_conf, value_was)) {
/* if value_was is no longer the same as @value_conf, it means the user
* changed the configuration since the last write. In this case, we
* don't overwrite the user-provided value. It also means our file is
@@ -1577,7 +1574,7 @@ out:
if (g_key_file_remove_group (keyfile_intern, NM_CONFIG_KEYFILE_GROUP_INTERN_GLOBAL_DNS, NULL))
needs_rewrite = TRUE;
for (g = 0; groups && groups[g]; g++) {
- if ( g_str_has_prefix (groups[g], NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN)
+ if ( NM_STR_HAS_PREFIX (groups[g], NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN)
&& groups[g][NM_STRLEN (NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN)]) {
g_key_file_remove_group (keyfile_intern, groups[g], NULL);
needs_rewrite = TRUE;
@@ -1602,12 +1599,12 @@ out:
static int
_intern_config_write_sort_fcn (const char **a, const char **b, const char *const*atomic_section_prefixes)
{
- const char *g_a = (a ? *a : NULL);
- const char *g_b = (b ? *b : NULL);
+ const char *g_a = *a;
+ const char *g_b = *b;
gboolean a_is, b_is;
- a_is = g_str_has_prefix (g_a, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
- b_is = g_str_has_prefix (g_b, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
+ a_is = NM_STR_HAS_PREFIX (g_a, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
+ b_is = NM_STR_HAS_PREFIX (g_b, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
if (a_is != b_is) {
if (a_is)
@@ -1668,7 +1665,7 @@ intern_config_write (const char *filename,
if (!keys)
continue;
- is_intern = g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
+ is_intern = NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
is_atomic = !is_intern && _is_atomic_section (atomic_section_prefixes, group);
if (is_atomic) {
@@ -1707,16 +1704,16 @@ intern_config_write (const char *filename,
else {
gs_free char *value_was = NULL;
- if (_HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
+ if (NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
/* Setting a key with .set prefix has no meaning, as these keys
* are protected. Just set the value you want to set instead.
* Why did this happen?? */
g_warn_if_reached ();
- } else if (_HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
+ } else if (NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
const char *key_base = &key[NM_STRLEN (NM_CONFIG_KEYFILE_KEYPREFIX_WAS)];
- if ( _HAS_PREFIX (key_base, NM_CONFIG_KEYFILE_KEYPREFIX_SET)
- || _HAS_PREFIX (key_base, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
+ if ( NM_STR_HAS_PREFIX_WITH_MORE (key_base, NM_CONFIG_KEYFILE_KEYPREFIX_SET)
+ || NM_STR_HAS_PREFIX_WITH_MORE (key_base, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
g_warn_if_reached ();
continue;
}
@@ -1735,7 +1732,7 @@ intern_config_write (const char *filename,
} else {
if (keyfile_conf) {
value_was = g_key_file_get_value (keyfile_conf, group, key, NULL);
- if (g_strcmp0 (value_set, value_was) == 0) {
+ if (nm_streq0 (value_set, value_was)) {
/* there is no point in storing the identical value as we have via
* user configuration. Skip it. */
continue;
@@ -1837,7 +1834,7 @@ nm_config_set_global_dns (NMConfig *self, NMGlobalDnsConfig *global_dns, GError
g_key_file_remove_group (keyfile, NM_CONFIG_KEYFILE_GROUP_INTERN_GLOBAL_DNS, NULL);
groups = g_key_file_get_groups (keyfile, NULL);
for (i = 0; groups[i]; i++) {
- if (g_str_has_prefix (groups[i], NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN))
+ if (NM_STR_HAS_PREFIX (groups[i], NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN))
g_key_file_remove_group (keyfile, groups[i], NULL);
}
g_strfreev (groups);
@@ -2210,7 +2207,7 @@ _config_device_state_data_new (int ifindex, GKeyFile *kf)
gs_free char *perm_hw_addr_fake = NULL;
gsize connection_uuid_len;
gsize perm_hw_addr_fake_len;
- int nm_owned = -1;
+ NMTernary nm_owned;
char *p;
guint32 route_metric_default_effective;
guint32 route_metric_default_aspired;
@@ -2252,7 +2249,7 @@ _config_device_state_data_new (int ifindex, GKeyFile *kf)
nm_owned = nm_config_keyfile_get_boolean (kf,
DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_NM_OWNED,
- -1);
+ NM_TERNARY_DEFAULT);
/* metric zero is not a valid metric. While zero valid for IPv4, for IPv6 it is an alias
* for 1024. Since we handle here IPv4 and IPv6 the same, we cannot allow zero. */
@@ -2325,9 +2322,11 @@ nm_config_device_state_load (int ifindex)
return NULL;
device_state = _config_device_state_data_new (ifindex, kf);
- nm_owned_str = device_state->nm_owned == TRUE ?
- ", nm-owned=1" :
- (device_state->nm_owned == FALSE ? ", nm-owned=0" : "");
+ nm_owned_str = device_state->nm_owned == NM_TERNARY_TRUE
+ ? ", nm-owned=1"
+ : ( device_state->nm_owned == NM_TERNARY_FALSE
+ ? ", nm-owned=0"
+ : "");
_LOGT ("device-state: %s #%d (%s); managed=%s%s%s%s%s%s%s%s, route-metric-default=%"G_GUINT32_FORMAT"-%"G_GUINT32_FORMAT"",
kf ? "read" : "miss",
@@ -2390,7 +2389,7 @@ nm_config_device_state_write (int ifindex,
NMConfigDeviceStateManagedType managed,
const char *perm_hw_addr_fake,
const char *connection_uuid,
- int nm_owned,
+ NMTernary nm_owned,
guint32 route_metric_default_aspired,
guint32 route_metric_default_effective,
const char *next_server,
@@ -2429,7 +2428,7 @@ nm_config_device_state_write (int ifindex,
DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_CONNECTION_UUID,
connection_uuid);
}
- if (nm_owned >= 0) {
+ if (nm_owned != NM_TERNARY_DEFAULT) {
g_key_file_set_boolean (kf,
DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_NM_OWNED,
diff --git a/src/nm-config.h b/src/nm-config.h
index b4478ceb04..0fce7ec0cb 100644
--- a/src/nm-config.h
+++ b/src/nm-config.h
@@ -243,7 +243,7 @@ struct _NMConfigDeviceStateData {
/* whether the device was nm-owned (0/1) or -1 for
* non-software devices. */
- int nm_owned:3;
+ NMTernary nm_owned:3;
};
NMConfigDeviceStateData *nm_config_device_state_load (int ifindex);
@@ -252,7 +252,7 @@ gboolean nm_config_device_state_write (int ifindex,
NMConfigDeviceStateManagedType managed,
const char *perm_hw_addr_fake,
const char *connection_uuid,
- int nm_owned,
+ NMTernary nm_owned,
guint32 route_metric_default_aspired,
guint32 route_metric_default_effective,
const char *next_server,
diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c
index a9f50a0f7a..415e1dc415 100644
--- a/src/nm-core-utils.c
+++ b/src/nm-core-utils.c
@@ -1703,11 +1703,13 @@ nm_wildcard_match_check (const char *str,
const char *const *patterns,
guint num_patterns)
{
- guint i, neg = 0;
+ gsize i, neg = 0;
for (i = 0; i < num_patterns; i++) {
if (patterns[i][0] == '!') {
neg++;
+ if (!str)
+ continue;
if (!fnmatch (patterns[i] + 1, str, 0))
return FALSE;
}
@@ -1716,10 +1718,12 @@ nm_wildcard_match_check (const char *str,
if (neg == num_patterns)
return TRUE;
- for (i = 0; i < num_patterns; i++) {
- if ( patterns[i][0] != '!'
- && !fnmatch (patterns[i], str, 0))
- return TRUE;
+ if (str) {
+ for (i = 0; i < num_patterns; i++) {
+ if ( patterns[i][0] != '!'
+ && !fnmatch (patterns[i], str, 0))
+ return TRUE;
+ }
}
return FALSE;
diff --git a/src/nm-dbus-manager.c b/src/nm-dbus-manager.c
index 239e06e11a..9849656ddd 100644
--- a/src/nm-dbus-manager.c
+++ b/src/nm-dbus-manager.c
@@ -247,7 +247,9 @@ private_server_closed_connection (GDBusConnection *conn,
CloseConnectionInfo *info;
/* Clean up after the connection */
- _LOGD ("(%s) closed connection %p on private socket", s->tag, conn);
+ _LOGD ("(%s) closed connection "NM_HASH_OBFUSCATE_PTR_FMT" on private socket",
+ s->tag,
+ NM_HASH_OBFUSCATE_PTR (conn));
info = g_slice_new0 (CloseConnectionInfo);
info->connection = conn;
@@ -285,7 +287,9 @@ private_server_new_connection (GDBusServer *server,
obj_mgr_data->fake_sender = sender;
c_list_link_tail (&s->object_mgr_lst_head, &obj_mgr_data->object_mgr_lst);
- _LOGD ("(%s) accepted connection %p on private socket", s->tag, conn);
+ _LOGD ("(%s) accepted connection "NM_HASH_OBFUSCATE_PTR_FMT" on private socket",
+ s->tag,
+ NM_HASH_OBFUSCATE_PTR (conn));
/* Emit this for the manager.
*
diff --git a/src/nm-iface-helper.c b/src/nm-iface-helper.c
index fdc0d4a4ac..6320e722c0 100644
--- a/src/nm-iface-helper.c
+++ b/src/nm-iface-helper.c
@@ -64,6 +64,7 @@ static struct {
char *dhcp4_clientid;
char *dhcp4_hostname;
char *dhcp4_fqdn;
+ char *mud_url;
char *iid_str;
NMSettingIP6ConfigAddrGenMode addr_gen_mode;
char *logging_backend;
@@ -523,6 +524,7 @@ main (int argc, char *argv[])
global_opt.dhcp4_hostname,
global_opt.dhcp4_fqdn,
NM_DHCP_HOSTNAME_FLAGS_FQDN_DEFAULT_IP4,
+ global_opt.mud_url,
client_id,
NM_DHCP_TIMEOUT_DEFAULT,
NULL,
diff --git a/src/nm-manager.c b/src/nm-manager.c
index bbe501259f..8cee206bef 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -6552,7 +6552,7 @@ nm_manager_write_device_state (NMManager *self, NMDevice *device, int *out_ifind
gboolean perm_hw_addr_is_fake;
guint32 route_metric_default_aspired;
guint32 route_metric_default_effective;
- int nm_owned;
+ NMTernary nm_owned;
NMDhcpConfig *dhcp_config;
const char *next_server = NULL;
const char *root_path = NULL;
@@ -6588,7 +6588,9 @@ nm_manager_write_device_state (NMManager *self, NMDevice *device, int *out_ifind
if (perm_hw_addr_fake && !perm_hw_addr_is_fake)
perm_hw_addr_fake = NULL;
- nm_owned = nm_device_is_software (device) ? nm_device_is_nm_owned (device) : -1;
+ nm_owned = nm_device_is_software (device)
+ ? nm_device_is_nm_owned (device)
+ : NM_TERNARY_DEFAULT;
route_metric_default_effective = _device_route_metric_get (self, ifindex, NM_DEVICE_TYPE_UNKNOWN,
TRUE, &route_metric_default_aspired);
diff --git a/src/org.freedesktop.NetworkManager.conf b/src/org.freedesktop.NetworkManager.conf
index 720c090ef1..5c2af2e0e5 100644
--- a/src/org.freedesktop.NetworkManager.conf
+++ b/src/org.freedesktop.NetworkManager.conf
@@ -2,150 +2,110 @@
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
- <policy user="root">
- <allow own="org.freedesktop.NetworkManager"/>
- <allow send_destination="org.freedesktop.NetworkManager"/>
-
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.PPP"/>
-
- <allow send_interface="org.freedesktop.NetworkManager.SecretAgent"/>
- <!-- These are there because some broken policies do
- <deny send_interface="..." /> (see dbus-daemon(8) for details).
- This seems to override that for the known VPN plugins.
- -->
- <allow send_destination="org.freedesktop.NetworkManager.openconnect"/>
- <allow send_destination="org.freedesktop.NetworkManager.openswan"/>
- <allow send_destination="org.freedesktop.NetworkManager.openvpn"/>
- <allow send_destination="org.freedesktop.NetworkManager.pptp"/>
- <allow send_destination="org.freedesktop.NetworkManager.vpnc"/>
- <allow send_destination="org.freedesktop.NetworkManager.ssh"/>
- <allow send_destination="org.freedesktop.NetworkManager.iodine"/>
- <allow send_destination="org.freedesktop.NetworkManager.l2tp"/>
- <allow send_destination="org.freedesktop.NetworkManager.libreswan"/>
- <allow send_destination="org.freedesktop.NetworkManager.fortisslvpn"/>
- <allow send_destination="org.freedesktop.NetworkManager.strongswan"/>
- <allow send_interface="org.freedesktop.NetworkManager.VPN.Plugin"/>
-
- <allow send_destination="org.fedoraproject.FirewallD1"/>
-
- <!-- Allow the custom name for the dnsmasq instance spawned by NM
- from the dns dnsmasq plugin to own its dbus name, and for
- messages to be sent to it.
- -->
- <allow own="org.freedesktop.NetworkManager.dnsmasq"/>
- <allow send_destination="org.freedesktop.NetworkManager.dnsmasq"/>
- </policy>
- <policy context="default">
- <deny own="org.freedesktop.NetworkManager"/>
-
- <deny send_destination="org.freedesktop.NetworkManager"/>
-
- <!-- Basic D-Bus API stuff -->
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.DBus.Introspectable"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.DBus.Properties"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.DBus.ObjectManager"/>
-
- <!-- Devices (read-only properties, no methods) -->
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Adsl"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Bond"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Bridge"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Bluetooth"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Wired"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Generic"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Gre"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Infiniband"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Macvlan"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Modem"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.OlpcMesh"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Team"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Tun"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Veth"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Vlan"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.WiMax.Nsp"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.AccessPoint"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.WifiP2PPeer"/>
-
- <!-- Devices (read-only, no security required) -->
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.WiMax"/>
-
- <!-- Devices (read/write, secured with PolicyKit) -->
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.Wireless"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device.WifiP2P"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Device"/>
-
- <!-- Core stuff (read-only properties, no methods) -->
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Connection.Active"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.DHCP4Config"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.DHCP6Config"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.IP4Config"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.IP6Config"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.VPN.Connection"/>
-
- <!-- Core stuff (read/write, secured with PolicyKit) -->
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Settings"/>
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Settings.Connection"/>
-
- <!-- Agents; secured with PolicyKit. Any process can talk to
- the AgentManager API, but only NetworkManager can talk
- to the agents themselves. -->
- <allow send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.AgentManager"/>
-
- <!-- Root-only functions -->
- <deny send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager"
- send_member="SetLogging"/>
- <deny send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager"
- send_member="Sleep"/>
- <deny send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Settings"
- send_member="LoadConnections"/>
- <deny send_destination="org.freedesktop.NetworkManager"
- send_interface="org.freedesktop.NetworkManager.Settings"
- send_member="ReloadConnections"/>
-
- <deny own="org.freedesktop.NetworkManager.dnsmasq"/>
- <deny send_destination="org.freedesktop.NetworkManager.dnsmasq"/>
- </policy>
-
- <limit name="max_replies_per_connection">1024</limit>
- <limit name="max_match_rules_per_connection">2048</limit>
+ <policy user="root">
+ <allow own="org.freedesktop.NetworkManager"/>
+ <allow send_destination="org.freedesktop.NetworkManager"/>
+
+ <allow send_destination="org.freedesktop.NetworkManager"
+ send_interface="org.freedesktop.NetworkManager.PPP"/>
+
+ <allow send_interface="org.freedesktop.NetworkManager.SecretAgent"/>
+
+ <!-- These are there because some broken policies do
+ <deny send_interface="..." /> (see dbus-daemon(8) for details).
+ This seems to override that for the known VPN plugins.
+ -->
+ <allow send_destination="org.freedesktop.NetworkManager.openconnect"/>
+ <allow send_destination="org.freedesktop.NetworkManager.openswan"/>
+ <allow send_destination="org.freedesktop.NetworkManager.openvpn"/>
+ <allow send_destination="org.freedesktop.NetworkManager.pptp"/>
+ <allow send_destination="org.freedesktop.NetworkManager.vpnc"/>
+ <allow send_destination="org.freedesktop.NetworkManager.ssh"/>
+ <allow send_destination="org.freedesktop.NetworkManager.iodine"/>
+ <allow send_destination="org.freedesktop.NetworkManager.l2tp"/>
+ <allow send_destination="org.freedesktop.NetworkManager.libreswan"/>
+ <allow send_destination="org.freedesktop.NetworkManager.fortisslvpn"/>
+ <allow send_destination="org.freedesktop.NetworkManager.strongswan"/>
+ <allow send_interface="org.freedesktop.NetworkManager.VPN.Plugin"/>
+
+ <allow send_destination="org.fedoraproject.FirewallD1"/>
+
+ <!-- Allow the custom name for the dnsmasq instance spawned by NM
+ from the dns dnsmasq plugin to own its dbus name, and for
+ messages to be sent to it.
+ -->
+ <allow own="org.freedesktop.NetworkManager.dnsmasq"/>
+ <allow send_destination="org.freedesktop.NetworkManager.dnsmasq"/>
+ </policy>
+ <policy context="default">
+ <deny own="org.freedesktop.NetworkManager"/>
+
+ <deny send_destination="org.freedesktop.NetworkManager"/>
+
+ <!-- Basic D-Bus API stuff -->
+ <allow send_destination="org.freedesktop.NetworkManager"
+ send_interface="org.freedesktop.DBus.Introspectable"/>
+ <allow send_destination="org.freedesktop.NetworkManager"
+ send_interface="org.freedesktop.DBus.Properties"/>
+ <allow send_destination="org.freedesktop.NetworkManager"
+ send_interface="org.freedesktop.DBus.ObjectManager"/>
+
+ <!-- Devices (read-only properties, no methods) -->
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.AccessPoint"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Adsl"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Bluetooth"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Bond"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Bridge"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Generic"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Gre"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Infiniband"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Macvlan"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Modem"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.OlpcMesh"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Team"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Tun"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Veth"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Vlan"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Wired"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.WiMax.Nsp"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.WifiP2PPeer"/>
+
+ <!-- Devices (read-only, no security required) -->
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.WiMax"/>
+
+ <!-- Devices (read/write, secured with PolicyKit) -->
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.Wireless"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device.WifiP2P"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Device"/>
+
+ <!-- Core stuff (read-only properties, no methods) -->
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Connection.Active"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.DHCP4Config"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.DHCP6Config"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.IP4Config"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.IP6Config"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.VPN.Connection"/>
+
+ <!-- Core stuff (read/write, secured with PolicyKit) -->
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Settings"/>
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Settings.Connection"/>
+
+ <!-- Agents; secured with PolicyKit. Any process can talk to
+ the AgentManager API, but only NetworkManager can talk
+ to the agents themselves. -->
+ <allow send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.AgentManager"/>
+
+ <!-- Root-only functions -->
+ <deny send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager" send_member="SetLogging"/>
+ <deny send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager" send_member="Sleep"/>
+ <deny send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Settings" send_member="LoadConnections"/>
+ <deny send_destination="org.freedesktop.NetworkManager" send_interface="org.freedesktop.NetworkManager.Settings" send_member="ReloadConnections"/>
+
+ <deny own="org.freedesktop.NetworkManager.dnsmasq"/>
+ <deny send_destination="org.freedesktop.NetworkManager.dnsmasq"/>
+ </policy>
+
+ <limit name="max_replies_per_connection">1024</limit>
+ <limit name="max_match_rules_per_connection">2048</limit>
</busconfig>
-
diff --git a/src/platform/nm-netlink.h b/src/platform/nm-netlink.h
index 0ac5b3b7c0..a5124f52e8 100644
--- a/src/platform/nm-netlink.h
+++ b/src/platform/nm-netlink.h
@@ -77,17 +77,13 @@ struct nla_policy {
/* static asserts that @tb and @policy are suitable arguments to nla_parse(). */
#define _nl_static_assert_tb(tb, policy) \
G_STMT_START { \
- \
G_STATIC_ASSERT_EXPR (G_N_ELEMENTS (tb) > 0); \
\
- /* we allow @policy to be either NULL or a C array. */ \
- G_STATIC_ASSERT_EXPR ( sizeof (policy) == sizeof (NULL) \
- || G_N_ELEMENTS (tb) == (sizeof (policy) / sizeof (struct nla_policy))); \
- \
- /* For above check to work, we don't support policy being an array with same size as
- * sizeof(NULL), otherwise, the compile time check breaks down. */ \
- G_STATIC_ASSERT_EXPR (sizeof (NULL) != G_N_ELEMENTS (tb) * sizeof (struct nla_policy)); \
- \
+ /* We allow @policy to be either a C array or NULL. The sizeof()
+ * must either match the expected array size or the sizeof(NULL),
+ * but not both. */ \
+ G_STATIC_ASSERT_EXPR ( (sizeof (policy) == G_N_ELEMENTS (tb) * sizeof (struct nla_policy)) \
+ ^ (sizeof (policy) == sizeof (NULL))); \
} G_STMT_END
/*****************************************************************************/
diff --git a/src/settings/plugins/ifcfg-rh/nm-ifcfg-rh.conf b/src/settings/plugins/ifcfg-rh/nm-ifcfg-rh.conf
index cc6ccb5cb4..c7a1730a5e 100644
--- a/src/settings/plugins/ifcfg-rh/nm-ifcfg-rh.conf
+++ b/src/settings/plugins/ifcfg-rh/nm-ifcfg-rh.conf
@@ -2,11 +2,10 @@
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
- <policy context="default">
- <allow send_destination="com.redhat.ifcfgrh1"/>
- </policy>
- <policy user="root">
- <allow own="com.redhat.ifcfgrh1"/>
- </policy>
+ <policy context="default">
+ <allow send_destination="com.redhat.ifcfgrh1"/>
+ </policy>
+ <policy user="root">
+ <allow own="com.redhat.ifcfgrh1"/>
+ </policy>
</busconfig>
-
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
index 7adafb5877..6b1f169563 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
@@ -582,6 +582,11 @@ make_connection_setting (const char *file,
g_object_set (s_con, NM_SETTING_CONNECTION_WAIT_DEVICE_TIMEOUT, (int) vint64, NULL);
}
+ nm_clear_g_free (&value);
+ v = svGetValue (ifcfg, "MUD_URL", &value);
+ if (v)
+ g_object_set (s_con, NM_SETTING_CONNECTION_MUD_URL, v, NULL);
+
i_val = NM_SETTING_CONNECTION_MDNS_DEFAULT;
if (!svGetValueEnum (ifcfg, "MDNS",
nm_setting_connection_mdns_get_type (),
@@ -1532,29 +1537,42 @@ make_user_setting (shvarFile *ifcfg)
: NULL;
}
-static NMSetting *
-make_match_setting (shvarFile *ifcfg)
+
+static void
+make_match_setting_prop (const char *v,
+ NMSettingMatch **s_match,
+ void (*add_fcn) (NMSettingMatch *s_match, const char *value))
{
- NMSettingMatch *s_match = NULL;
gs_free const char **strv = NULL;
- gs_free char *value = NULL;
- const char *v;
gsize i;
- v = svGetValueStr (ifcfg, "MATCH_INTERFACE_NAME", &value);
- if (!v)
- return NULL;
-
strv = nm_utils_escaped_tokens_split (v, NM_ASCII_SPACES);
if (strv) {
for (i = 0; strv[i]; i++) {
- if (!s_match)
- s_match = (NMSettingMatch *) nm_setting_match_new ();
- nm_setting_match_add_interface_name (s_match, strv[i]);
+ if (!(*s_match))
+ *s_match = NM_SETTING_MATCH (nm_setting_match_new ());
+ add_fcn (*s_match, strv[i]);
}
}
+}
+
+static NMSetting *
+make_match_setting (shvarFile *ifcfg)
+{
+ NMSettingMatch *s_match = NULL;
+ gs_free char *value_ifn = NULL;
+ gs_free char *value_kcl = NULL;
+ gs_free char *value_d = NULL;
+ const char *v;
- return (NMSetting *) s_match;
+ v = svGetValueStr (ifcfg, "MATCH_INTERFACE_NAME", &value_ifn);
+ make_match_setting_prop(v, &s_match, nm_setting_match_add_interface_name);
+ v = svGetValueStr (ifcfg, "MATCH_KERNEL_COMMAND_LINE", &value_kcl);
+ make_match_setting_prop(v, &s_match, nm_setting_match_add_kernel_command_line);
+ v = svGetValueStr (ifcfg, "MATCH_DRIVER", &value_d);
+ make_match_setting_prop(v, &s_match, nm_setting_match_add_driver);
+
+ return NM_SETTING (s_match);
}
static NMSetting *
@@ -5152,24 +5170,33 @@ handle_bridge_option (NMSetting *setting,
gboolean only_with_stp;
gboolean extended_bool;
} m/*etadata*/[] = {
- { "DELAY", NM_SETTING_BRIDGE_FORWARD_DELAY, BRIDGE_OPT_TYPE_MAIN, .only_with_stp = TRUE },
- { "priority", NM_SETTING_BRIDGE_PRIORITY, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE },
- { "hello_time", NM_SETTING_BRIDGE_HELLO_TIME, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE },
- { "max_age", NM_SETTING_BRIDGE_MAX_AGE, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE },
- { "ageing_time", NM_SETTING_BRIDGE_AGEING_TIME, BRIDGE_OPT_TYPE_OPTION },
- { "multicast_querier", NM_SETTING_BRIDGE_MULTICAST_QUERIER, BRIDGE_OPT_TYPE_OPTION },
- { "multicast_query_use_ifaddr", NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR, BRIDGE_OPT_TYPE_OPTION },
- { "multicast_snooping", NM_SETTING_BRIDGE_MULTICAST_SNOOPING, BRIDGE_OPT_TYPE_OPTION },
- { "multicast_router", NM_SETTING_BRIDGE_MULTICAST_ROUTER, BRIDGE_OPT_TYPE_OPTION },
- { "vlan_filtering", NM_SETTING_BRIDGE_VLAN_FILTERING, BRIDGE_OPT_TYPE_OPTION },
- { "default_pvid", NM_SETTING_BRIDGE_VLAN_DEFAULT_PVID, BRIDGE_OPT_TYPE_OPTION },
- { "group_address", NM_SETTING_BRIDGE_GROUP_ADDRESS, BRIDGE_OPT_TYPE_OPTION },
- { "group_fwd_mask", NM_SETTING_BRIDGE_GROUP_FORWARD_MASK, BRIDGE_OPT_TYPE_OPTION },
- { "vlan_protocol", NM_SETTING_BRIDGE_VLAN_PROTOCOL, BRIDGE_OPT_TYPE_OPTION },
- { "vlan_stats_enabled", NM_SETTING_BRIDGE_VLAN_STATS_ENABLED, BRIDGE_OPT_TYPE_OPTION },
- { "priority", NM_SETTING_BRIDGE_PORT_PRIORITY, BRIDGE_OPT_TYPE_PORT_OPTION },
- { "path_cost", NM_SETTING_BRIDGE_PORT_PATH_COST, BRIDGE_OPT_TYPE_PORT_OPTION },
- { "hairpin_mode", NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE, BRIDGE_OPT_TYPE_PORT_OPTION, .extended_bool = TRUE, },
+ { "DELAY", NM_SETTING_BRIDGE_FORWARD_DELAY, BRIDGE_OPT_TYPE_MAIN, .only_with_stp = TRUE },
+ { "priority", NM_SETTING_BRIDGE_PRIORITY, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE },
+ { "hello_time", NM_SETTING_BRIDGE_HELLO_TIME, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE },
+ { "max_age", NM_SETTING_BRIDGE_MAX_AGE, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE },
+ { "ageing_time", NM_SETTING_BRIDGE_AGEING_TIME, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_last_member_count", NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_last_member_interval", NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_membership_interval", NM_SETTING_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_hash_max", NM_SETTING_BRIDGE_MULTICAST_HASH_MAX, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_querier", NM_SETTING_BRIDGE_MULTICAST_QUERIER, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_querier_interval", NM_SETTING_BRIDGE_MULTICAST_QUERIER_INTERVAL, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_query_interval", NM_SETTING_BRIDGE_MULTICAST_QUERY_INTERVAL, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_query_response_interval", NM_SETTING_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_query_use_ifaddr", NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_snooping", NM_SETTING_BRIDGE_MULTICAST_SNOOPING, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_router", NM_SETTING_BRIDGE_MULTICAST_ROUTER, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_startup_query_count", NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT, BRIDGE_OPT_TYPE_OPTION },
+ { "multicast_startup_query_interval", NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL, BRIDGE_OPT_TYPE_OPTION },
+ { "vlan_filtering", NM_SETTING_BRIDGE_VLAN_FILTERING, BRIDGE_OPT_TYPE_OPTION },
+ { "default_pvid", NM_SETTING_BRIDGE_VLAN_DEFAULT_PVID, BRIDGE_OPT_TYPE_OPTION },
+ { "group_address", NM_SETTING_BRIDGE_GROUP_ADDRESS, BRIDGE_OPT_TYPE_OPTION },
+ { "group_fwd_mask", NM_SETTING_BRIDGE_GROUP_FORWARD_MASK, BRIDGE_OPT_TYPE_OPTION },
+ { "vlan_protocol", NM_SETTING_BRIDGE_VLAN_PROTOCOL, BRIDGE_OPT_TYPE_OPTION },
+ { "vlan_stats_enabled", NM_SETTING_BRIDGE_VLAN_STATS_ENABLED, BRIDGE_OPT_TYPE_OPTION },
+ { "priority", NM_SETTING_BRIDGE_PORT_PRIORITY, BRIDGE_OPT_TYPE_PORT_OPTION },
+ { "path_cost", NM_SETTING_BRIDGE_PORT_PATH_COST, BRIDGE_OPT_TYPE_PORT_OPTION },
+ { "hairpin_mode", NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE, BRIDGE_OPT_TYPE_PORT_OPTION, .extended_bool = TRUE, },
};
const char *error_message = NULL;
int i;
@@ -5222,6 +5249,16 @@ handle_bridge_option (NMSetting *setting,
goto warn;
}
return;
+ case G_TYPE_UINT64: {
+ guint64 vu64;
+
+ vu64 = _nm_utils_ascii_str_to_uint64 (value, 10, 0, G_MAXUINT64, 0);
+ if (!nm_g_object_set_property_uint64 (G_OBJECT (setting), m[i].property_name, vu64, NULL)) {
+ error_message = "number is out of range";
+ goto warn;
+ }
+ }
+ return;
case G_TYPE_STRING:
nm_g_object_set_property_string (G_OBJECT (setting), m[i].property_name, value, NULL);
return;
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c
index d324361756..06d4928ae5 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c
@@ -888,11 +888,14 @@ const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[] = {
_KEY_TYPE ("MAC_ADDRESS_RANDOMIZATION", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MASTER", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MASTER_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MATCH_DRIVER", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MATCH_INTERFACE_NAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MATCH_KERNEL_COMMAND_LINE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MDNS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("METRIC", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("MODE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MTU", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
+ _KEY_TYPE ("MUD_URL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MULTI_CONNECT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MVRP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("NAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h
index 056d03fabe..805f1581f1 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h
@@ -33,7 +33,7 @@ typedef struct {
NMSIfcfgKeyTypeFlags key_flags;
} NMSIfcfgKeyTypeInfo;
-extern const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[232];
+extern const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[235];
const NMSIfcfgKeyTypeInfo *nms_ifcfg_well_known_key_find_info (const char *key, gssize *out_idx);
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
index a0797fdc79..b9f8161b9c 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
@@ -1362,38 +1362,22 @@ write_team_setting (NMConnection *connection, shvarFile *ifcfg, gboolean *wired,
return TRUE;
}
-static guint32
-get_setting_default_uint (NMSetting *setting, const char *prop)
+static gboolean
+get_setting_default_boolean (gpointer setting, const char *prop)
{
- GParamSpec *pspec;
- GValue val = G_VALUE_INIT;
- guint32 ret = 0;
-
- pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), prop);
- g_assert (pspec);
- g_value_init (&val, pspec->value_type);
- g_param_value_set_default (pspec, &val);
- g_assert (G_VALUE_HOLDS_UINT (&val));
- ret = g_value_get_uint (&val);
- g_value_unset (&val);
- return ret;
+ return NM_G_PARAM_SPEC_GET_DEFAULT_BOOLEAN (g_object_class_find_property (G_OBJECT_GET_CLASS (setting), prop));
}
-static gboolean
-get_setting_default_boolean (NMSetting *setting, const char *prop)
+static guint
+get_setting_default_uint (gpointer setting, const char *prop)
+{
+ return NM_G_PARAM_SPEC_GET_DEFAULT_UINT (g_object_class_find_property (G_OBJECT_GET_CLASS (setting), prop));
+}
+
+static guint64
+get_setting_default_uint64 (gpointer setting, const char *prop)
{
- GParamSpec *pspec;
- GValue val = G_VALUE_INIT;
- gboolean ret = 0;
-
- pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), prop);
- g_assert (pspec);
- g_value_init (&val, pspec->value_type);
- g_param_value_set_default (pspec, &val);
- g_assert (G_VALUE_HOLDS_BOOLEAN (&val));
- ret = g_value_get_boolean (&val);
- g_value_unset (&val);
- return ret;
+ return NM_G_PARAM_SPEC_GET_DEFAULT_UINT64 (g_object_class_find_property (G_OBJECT_GET_CLASS (setting), prop));
}
static gboolean
@@ -1436,7 +1420,8 @@ static gboolean
write_bridge_setting (NMConnection *connection, shvarFile *ifcfg, gboolean *wired, GError **error)
{
NMSettingBridge *s_bridge;
- guint32 i;
+ guint32 u32;
+ guint64 u64;
gboolean b;
const char *s;
GString *opts;
@@ -1459,32 +1444,32 @@ write_bridge_setting (NMConnection *connection, shvarFile *ifcfg, gboolean *wire
if (nm_setting_bridge_get_stp (s_bridge)) {
svSetValueStr (ifcfg, "STP", "yes");
- i = nm_setting_bridge_get_forward_delay (s_bridge);
- if (i != get_setting_default_uint (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_FORWARD_DELAY))
- svSetValueInt64 (ifcfg, "DELAY", i);
+ u32 = nm_setting_bridge_get_forward_delay (s_bridge);
+ if (u32 != get_setting_default_uint (s_bridge, NM_SETTING_BRIDGE_FORWARD_DELAY))
+ svSetValueInt64 (ifcfg, "DELAY", u32);
g_string_append_printf (opts, "priority=%u", nm_setting_bridge_get_priority (s_bridge));
- i = nm_setting_bridge_get_hello_time (s_bridge);
- if (i != get_setting_default_uint (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_HELLO_TIME)) {
+ u32 = nm_setting_bridge_get_hello_time (s_bridge);
+ if (u32 != get_setting_default_uint (s_bridge, NM_SETTING_BRIDGE_HELLO_TIME)) {
if (opts->len)
g_string_append_c (opts, ' ');
- g_string_append_printf (opts, "hello_time=%u", i);
+ g_string_append_printf (opts, "hello_time=%u", u32);
}
- i = nm_setting_bridge_get_max_age (s_bridge);
- if (i != get_setting_default_uint (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_MAX_AGE)) {
+ u32 = nm_setting_bridge_get_max_age (s_bridge);
+ if (u32 != get_setting_default_uint (s_bridge, NM_SETTING_BRIDGE_MAX_AGE)) {
if (opts->len)
g_string_append_c (opts, ' ');
- g_string_append_printf (opts, "max_age=%u", i);
+ g_string_append_printf (opts, "max_age=%u", u32);
}
}
- i = nm_setting_bridge_get_ageing_time (s_bridge);
- if (i != get_setting_default_uint (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_AGEING_TIME)) {
+ u32 = nm_setting_bridge_get_ageing_time (s_bridge);
+ if (u32 != get_setting_default_uint (s_bridge, NM_SETTING_BRIDGE_AGEING_TIME)) {
if (opts->len)
g_string_append_c (opts, ' ');
- g_string_append_printf (opts, "ageing_time=%u", i);
+ g_string_append_printf (opts, "ageing_time=%u", u32);
}
s = nm_setting_bridge_get_group_address (s_bridge);
@@ -1494,34 +1479,98 @@ write_bridge_setting (NMConnection *connection, shvarFile *ifcfg, gboolean *wire
g_string_append_printf (opts, "group_address=%s", s);
}
- i = nm_setting_bridge_get_group_forward_mask (s_bridge);
- if (i != get_setting_default_uint (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_GROUP_FORWARD_MASK)) {
+ u32 = nm_setting_bridge_get_group_forward_mask (s_bridge);
+ if (u32 != get_setting_default_uint (s_bridge, NM_SETTING_BRIDGE_GROUP_FORWARD_MASK)) {
+ if (opts->len)
+ g_string_append_c (opts, ' ');
+ g_string_append_printf (opts, "group_fwd_mask=%u", u32);
+ }
+
+
+ u32 = nm_setting_bridge_get_multicast_hash_max (s_bridge);
+ if (u32 != get_setting_default_uint (s_bridge, NM_SETTING_BRIDGE_MULTICAST_HASH_MAX)) {
+ if (opts->len)
+ g_string_append_c (opts, ' ');
+ g_string_append_printf (opts, "multicast_hash_max=%u", u32);
+ }
+
+ u32 = nm_setting_bridge_get_multicast_last_member_count (s_bridge);
+ if (u32 != get_setting_default_uint (s_bridge, NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT)) {
+ if (opts->len)
+ g_string_append_c (opts, ' ');
+ g_string_append_printf (opts, "multicast_last_member_count=%u", u32);
+ }
+
+ u64 = nm_setting_bridge_get_multicast_last_member_interval (s_bridge);
+ if (u64 != get_setting_default_uint64 (s_bridge, NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL)) {
if (opts->len)
g_string_append_c (opts, ' ');
- g_string_append_printf (opts, "group_fwd_mask=%u", i);
+ g_string_append_printf (opts, "multicast_last_member_interval=%"G_GUINT64_FORMAT, u64);
+ }
+
+ u64 = nm_setting_bridge_get_multicast_membership_interval (s_bridge);
+ if (u64 != get_setting_default_uint64 (s_bridge, NM_SETTING_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL)) {
+ if (opts->len)
+ g_string_append_c (opts, ' ');
+ g_string_append_printf (opts, "multicast_membership_interval=%"G_GUINT64_FORMAT, u64);
}
b = nm_setting_bridge_get_multicast_querier (s_bridge);
- if (b != get_setting_default_boolean (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_MULTICAST_QUERIER)) {
+ if (b != get_setting_default_boolean (s_bridge, NM_SETTING_BRIDGE_MULTICAST_QUERIER)) {
if (opts->len)
g_string_append_c (opts, ' ');
g_string_append_printf (opts, "multicast_querier=%u", (guint) b);
}
+ u64 = nm_setting_bridge_get_multicast_querier_interval (s_bridge);
+ if (u64 != get_setting_default_uint64 (s_bridge, NM_SETTING_BRIDGE_MULTICAST_QUERIER_INTERVAL)) {
+ if (opts->len)
+ g_string_append_c (opts, ' ');
+ g_string_append_printf (opts, "multicast_querier_interval=%"G_GUINT64_FORMAT, u64);
+ }
+
+ u64 = nm_setting_bridge_get_multicast_query_interval (s_bridge);
+ if (u64 != get_setting_default_uint64 (s_bridge, NM_SETTING_BRIDGE_MULTICAST_QUERY_INTERVAL)) {
+ if (opts->len)
+ g_string_append_c (opts, ' ');
+ g_string_append_printf (opts, "multicast_query_interval=%"G_GUINT64_FORMAT, u64);
+ }
+
+ u64 = nm_setting_bridge_get_multicast_query_response_interval (s_bridge);
+ if (u64 != get_setting_default_uint64 (s_bridge, NM_SETTING_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL)) {
+ if (opts->len)
+ g_string_append_c (opts, ' ');
+ g_string_append_printf (opts, "multicast_query_response_interval=%"G_GUINT64_FORMAT, u64);
+ }
+
b = nm_setting_bridge_get_multicast_query_use_ifaddr (s_bridge);
- if (b != get_setting_default_boolean (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR)) {
+ if (b != get_setting_default_boolean (s_bridge, NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR)) {
if (opts->len)
g_string_append_c (opts, ' ');
g_string_append_printf (opts, "multicast_query_use_ifaddr=%u", (guint) b);
}
b = nm_setting_bridge_get_multicast_snooping (s_bridge);
- if (b != get_setting_default_boolean (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_MULTICAST_SNOOPING)) {
+ if (b != get_setting_default_boolean (s_bridge, NM_SETTING_BRIDGE_MULTICAST_SNOOPING)) {
if (opts->len)
g_string_append_c (opts, ' ');
g_string_append_printf (opts, "multicast_snooping=%u", (guint32) b);
}
+ u32 = nm_setting_bridge_get_multicast_startup_query_count (s_bridge);
+ if (u32 != get_setting_default_uint (s_bridge, NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT)) {
+ if (opts->len)
+ g_string_append_c (opts, ' ');
+ g_string_append_printf (opts, "multicast_startup_query_count=%u", u32);
+ }
+
+ u64 = nm_setting_bridge_get_multicast_startup_query_interval (s_bridge);
+ if (u64 != get_setting_default_uint64 (s_bridge, NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL)) {
+ if (opts->len)
+ g_string_append_c (opts, ' ');
+ g_string_append_printf (opts, "multicast_startup_query_interval=%"G_GUINT64_FORMAT, u64);
+ }
+
s = nm_setting_bridge_get_multicast_router (s_bridge);
if (s) {
if (opts->len)
@@ -1530,17 +1579,17 @@ write_bridge_setting (NMConnection *connection, shvarFile *ifcfg, gboolean *wire
}
b = nm_setting_bridge_get_vlan_filtering (s_bridge);
- if (b != get_setting_default_boolean (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_VLAN_FILTERING)) {
+ if (b != get_setting_default_boolean (s_bridge, NM_SETTING_BRIDGE_VLAN_FILTERING)) {
if (opts->len)
g_string_append_c (opts, ' ');
g_string_append_printf (opts, "vlan_filtering=%u", (guint32) b);
}
- i = nm_setting_bridge_get_vlan_default_pvid (s_bridge);
- if (i != get_setting_default_uint (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_VLAN_DEFAULT_PVID)) {
+ u32 = nm_setting_bridge_get_vlan_default_pvid (s_bridge);
+ if (u32 != get_setting_default_uint (s_bridge, NM_SETTING_BRIDGE_VLAN_DEFAULT_PVID)) {
if (opts->len)
g_string_append_c (opts, ' ');
- g_string_append_printf (opts, "default_pvid=%u", i);
+ g_string_append_printf (opts, "default_pvid=%u", u32);
}
s = nm_setting_bridge_get_vlan_protocol (s_bridge);
@@ -1551,7 +1600,7 @@ write_bridge_setting (NMConnection *connection, shvarFile *ifcfg, gboolean *wire
}
b = nm_setting_bridge_get_vlan_stats_enabled (s_bridge);
- if (b != get_setting_default_boolean (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_VLAN_STATS_ENABLED)) {
+ if (b != get_setting_default_boolean (s_bridge, NM_SETTING_BRIDGE_VLAN_STATS_ENABLED)) {
if (opts->len)
g_string_append_c (opts, ' ');
g_string_append_printf (opts, "vlan_stats_enabled=%u", (guint) b);
@@ -1579,7 +1628,7 @@ static gboolean
write_bridge_port_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
{
NMSettingBridgePort *s_port;
- guint32 i;
+ guint32 u32;
GString *string;
s_port = nm_connection_get_setting_bridge_port (connection);
@@ -1589,15 +1638,15 @@ write_bridge_port_setting (NMConnection *connection, shvarFile *ifcfg, GError **
/* Bridge options */
string = g_string_sized_new (32);
- i = nm_setting_bridge_port_get_priority (s_port);
- if (i != get_setting_default_uint (NM_SETTING (s_port), NM_SETTING_BRIDGE_PORT_PRIORITY))
- g_string_append_printf (string, "priority=%u", i);
+ u32 = nm_setting_bridge_port_get_priority (s_port);
+ if (u32 != get_setting_default_uint (NM_SETTING (s_port), NM_SETTING_BRIDGE_PORT_PRIORITY))
+ g_string_append_printf (string, "priority=%u", u32);
- i = nm_setting_bridge_port_get_path_cost (s_port);
- if (i != get_setting_default_uint (NM_SETTING (s_port), NM_SETTING_BRIDGE_PORT_PATH_COST)) {
+ u32 = nm_setting_bridge_port_get_path_cost (s_port);
+ if (u32 != get_setting_default_uint (NM_SETTING (s_port), NM_SETTING_BRIDGE_PORT_PATH_COST)) {
if (string->len)
g_string_append_c (string, ' ');
- g_string_append_printf (string, "path_cost=%u", i);
+ g_string_append_printf (string, "path_cost=%u", u32);
}
if (nm_setting_bridge_port_get_hairpin_mode (s_port)) {
@@ -1792,7 +1841,7 @@ write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
NMSettingConnectionMdns mdns;
NMSettingConnectionLlmnr llmnr;
guint32 vuint32;
- const char *tmp;
+ const char *tmp, *mud_url;
svSetValueStr (ifcfg, "NAME", nm_setting_connection_get_id (s_con));
svSetValueStr (ifcfg, "UUID", nm_setting_connection_get_uuid (s_con));
@@ -1867,6 +1916,9 @@ write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
svSetValueStr (ifcfg, "TEAM_MASTER_UUID", NULL);
svSetValueStr (ifcfg, "TEAM_MASTER", NULL);
+ mud_url = nm_setting_connection_get_mud_url (s_con);
+ svSetValue (ifcfg, "MUD_URL", mud_url);
+
master = nm_setting_connection_get_master (s_con);
if (master) {
/* The reader prefers the *_UUID variants, however we still try to resolve
@@ -2289,36 +2341,50 @@ write_tc_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
return TRUE;
}
-static gboolean
-write_match_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
+static void
+write_match_setting (NMConnection *connection, shvarFile *ifcfg)
{
- NMSettingMatch *s_match;
nm_auto_free_gstring GString *str = NULL;
+ NMSettingMatch *s_match;
guint i, num;
+ const char *name;
s_match = (NMSettingMatch *) nm_connection_get_setting (connection, NM_TYPE_SETTING_MATCH);
if (!s_match)
- return TRUE;
-
- num = nm_setting_match_get_num_interface_names (s_match);
- for (i = 0; i < num; i++) {
- const char *name;
-
- name = nm_setting_match_get_interface_name (s_match, i);
- if (!name || !name[0])
- continue;
+ return;
- if (!str)
- str = g_string_new ("");
- else
- g_string_append_c (str, ' ');
- nm_utils_escaped_tokens_escape_gstr (name, NM_ASCII_SPACES, str);
+ num = nm_setting_match_get_num_drivers (s_match);
+ if (num > 0) {
+ nm_gstring_prepare (&str);
+ for (i = 0; i < num; i++) {
+ name = nm_setting_match_get_driver (s_match, i);
+ nm_gstring_add_space_delimiter (str);
+ nm_utils_escaped_tokens_escape_gstr (name, NM_ASCII_SPACES, str);
+ }
+ svSetValueStr (ifcfg, "MATCH_DRIVER", str->str);
}
- if (str)
+ num = nm_setting_match_get_num_interface_names (s_match);
+ if (num > 0) {
+ nm_gstring_prepare (&str);
+ for (i = 0; i < num; i++) {
+ name = nm_setting_match_get_interface_name (s_match, i);
+ nm_gstring_add_space_delimiter (str);
+ nm_utils_escaped_tokens_escape_gstr (name, NM_ASCII_SPACES, str);
+ }
svSetValueStr (ifcfg, "MATCH_INTERFACE_NAME", str->str);
+ }
- return TRUE;
+ num = nm_setting_match_get_num_kernel_command_lines (s_match);
+ if (num > 0) {
+ nm_gstring_prepare (&str);
+ for (i = 0; i < num; i++) {
+ name = nm_setting_match_get_kernel_command_line (s_match, i);
+ nm_gstring_add_space_delimiter (str);
+ nm_utils_escaped_tokens_escape_gstr (name, NM_ASCII_SPACES, str);
+ }
+ svSetValueStr (ifcfg, "MATCH_KERNEL_COMMAND_LINE", str->str);
+ }
}
static void
@@ -3078,8 +3144,7 @@ do_write_construct (NMConnection *connection,
if (!write_user_setting (connection, ifcfg, error))
return FALSE;
- if (!write_match_setting (connection, ifcfg, error))
- return FALSE;
+ write_match_setting (connection, ifcfg);
write_sriov_setting (connection, ifcfg);
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected
index f0cd36cb13..9499278e3e 100644
--- a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected
@@ -1,7 +1,9 @@
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
+MATCH_DRIVER="!virtio e1000e"
MATCH_INTERFACE_NAME="ens* eth\\ 1? !veth*"
+MATCH_KERNEL_COMMAND_LINE=!ip=
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
index efa9ea9b82..d0b9ffb8d3 100644
--- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
+++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
@@ -4687,6 +4687,9 @@ test_write_wired_match (void)
nm_setting_match_add_interface_name (s_match, "ens*");
nm_setting_match_add_interface_name (s_match, "eth 1?");
nm_setting_match_add_interface_name (s_match, "!veth*");
+ nm_setting_match_add_driver (s_match, "!virtio");
+ nm_setting_match_add_driver (s_match, "e1000e");
+ nm_setting_match_add_kernel_command_line (s_match, "!ip=");
nm_connection_add_setting (connection, NM_SETTING (s_match));
nmtst_assert_connection_verifies (connection);
diff --git a/src/systemd/src/libsystemd-network/sd-dhcp6-client.c b/src/systemd/src/libsystemd-network/sd-dhcp6-client.c
index 826ad56a9f..02ebb0c201 100644
--- a/src/systemd/src/libsystemd-network/sd-dhcp6-client.c
+++ b/src/systemd/src/libsystemd-network/sd-dhcp6-client.c
@@ -371,7 +371,7 @@ int sd_dhcp6_client_set_request_option(sd_dhcp6_client *client, uint16_t option)
return 0;
}
-int sd_dhcp6_client_set_request_mud_url(sd_dhcp6_client *client, char *mudurl) {
+int sd_dhcp6_client_set_request_mud_url(sd_dhcp6_client *client, const char *mudurl) {
assert_return(client, -EINVAL);
assert_return(client->state == DHCP6_STATE_STOPPED, -EBUSY);
diff --git a/src/systemd/src/systemd/sd-dhcp6-client.h b/src/systemd/src/systemd/sd-dhcp6-client.h
index 42d4ec752c..091f8287ec 100644
--- a/src/systemd/src/systemd/sd-dhcp6-client.h
+++ b/src/systemd/src/systemd/sd-dhcp6-client.h
@@ -123,7 +123,7 @@ int sd_dhcp6_client_set_request_option(
uint16_t option);
int sd_dhcp6_client_set_request_mud_url(
sd_dhcp6_client *client,
- char *mudurl);
+ const char *mudurl);
int sd_dhcp6_client_set_prefix_delegation_hint(
sd_dhcp6_client *client,
uint8_t prefixlen,