diff options
author | Thomas Haller <thaller@redhat.com> | 2019-03-27 16:32:39 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-03-27 16:32:39 +0100 |
commit | 768001473279d2ce70599ee1838eb0d594b51223 (patch) | |
tree | 4830a6eb9bcfe6317b2d395a3ffb3d54ac474b37 | |
parent | 02ae0fd00a635a4aaf3ea9c98e7a2c308e971913 (diff) | |
parent | 3f9347745b30e6182c3b3c768f78295d72c47a93 (diff) |
libnm,core: merge branch 'th/routing-rule-pt2'
https://github.com/NetworkManager/NetworkManager/pull/321
30 files changed, 4996 insertions, 813 deletions
diff --git a/Makefile.am b/Makefile.am index a8353656da..de3d25e308 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2729,6 +2729,7 @@ EXTRA_DIST += \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Bridge_Component.cexpected \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Permissions.cexpected \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Proxy_Basic.cexpected \ + src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Routing_Rules.cexpected \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Team_Infiniband_Port.cexpected \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Team_Port.cexpected \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_VLAN_reorder_hdr.cexpected \ diff --git a/clients/cli/settings.c b/clients/cli/settings.c index aa0a7ff23c..d050e24e28 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -543,13 +543,18 @@ nmc_setting_set_property (NMClient *client, g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); g_return_val_if_fail (NM_IN_SET (modifier, '\0', '-', '+'), FALSE); - g_return_val_if_fail (value || modifier == '\0', FALSE); if (!(property_info = nm_meta_property_info_find_by_setting (setting, prop))) goto out_fail_read_only; if (!property_info->property_type->set_fcn) goto out_fail_read_only; + if ( NM_IN_SET (modifier, '+', '-') + && !value) { + /* nothing to do. */ + return TRUE; + } + if ( modifier == '-' && !property_info->property_type->set_supports_remove) { /* The property is a plain property. It does not support '-'. diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c index 7a20196a0d..ef8574a174 100644 --- a/clients/common/nm-meta-setting-desc.c +++ b/clients/common/nm-meta-setting-desc.c @@ -170,6 +170,7 @@ _value_str_as_index_list (const char *value, gsize *out_len) typedef enum { VALUE_STRSPLIT_MODE_STRIPPED, VALUE_STRSPLIT_MODE_OBJLIST, + VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE, VALUE_STRSPLIT_MODE_MULTILIST, VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE, } ValueStrsplitMode; @@ -201,6 +202,9 @@ _value_strsplit (const char *value, case VALUE_STRSPLIT_MODE_OBJLIST: strv = nm_utils_strsplit_set (value, ",", FALSE); break; + case VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE: + strv = nm_utils_strsplit_set (value, ",", TRUE); + break; case VALUE_STRSPLIT_MODE_MULTILIST: strv = nm_utils_strsplit_set (value, " \t,", FALSE); break; @@ -227,6 +231,8 @@ _value_strsplit (const char *value, if (split_mode == VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE) _nm_utils_unescape_plain ((char *) s, MULTILIST_WITH_ESCAPE_CHARS, TRUE); + else if (split_mode == VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE) + _nm_utils_unescape_plain ((char *) s, ",", TRUE); else g_strchomp ((char *) s); @@ -1876,7 +1882,7 @@ _set_fcn_multilist (ARGS_SET_FCN) } strv = _value_strsplit (value, - property_info->property_typ_data->subtype.multilist.with_escaped_spaces + property_info->property_typ_data->subtype.multilist.strsplit_with_escape ? VALUE_STRSPLIT_MODE_MULTILIST_WITH_ESCAPE : VALUE_STRSPLIT_MODE_MULTILIST, &nstrv); @@ -3049,6 +3055,10 @@ _get_fcn_objlist (ARGS_GET_FCN) num = property_info->property_typ_data->subtype.objlist.get_num_fcn (setting); for (idx = 0; idx < num; idx++) { +#if NM_MORE_ASSERTS + gsize start_offset; +#endif + if (!str) str = g_string_new (NULL); else if (str->len > 0) { @@ -3059,10 +3069,32 @@ _get_fcn_objlist (ARGS_GET_FCN) g_string_append (str, ", "); } +#if NM_MORE_ASSERTS + start_offset = str->len; +#endif + property_info->property_typ_data->subtype.objlist.obj_to_str_fcn (get_type, setting, idx, str); + +#if NM_MORE_ASSERTS + nm_assert (start_offset < str->len); + if ( property_info->property_typ_data->subtype.objlist.strsplit_with_escape + && get_type != NM_META_ACCESSOR_GET_TYPE_PRETTY) { + /* if the strsplit is done with VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE, then the appended + * value must have no unescaped ','. */ + for (; start_offset < str->len; ) { + if (str->str[start_offset] == '\\') { + start_offset++; + nm_assert (start_offset < str->len); + nm_assert (!NM_IN_SET (str->str[start_offset], '\0')); + } else + nm_assert (!NM_IN_SET (str->str[start_offset], '\0', ',')); + start_offset++; + } + } +#endif } NM_SET_OUT (out_is_default, num == 0); @@ -3237,7 +3269,9 @@ _set_fcn_objlist (ARGS_SET_FCN) } strv = _value_strsplit (value, - VALUE_STRSPLIT_MODE_OBJLIST, + property_info->property_typ_data->subtype.objlist.strsplit_with_escape + ? VALUE_STRSPLIT_MODE_OBJLIST_WITH_ESCAPE + : VALUE_STRSPLIT_MODE_OBJLIST, &nstrv); if (_SET_FCN_DO_SET_ALL (modifier, value)) { @@ -3335,6 +3369,65 @@ _is_default_func_ip_config_dns_options (NMSetting *setting) && !nm_setting_ip_config_get_num_dns_options (NM_SETTING_IP_CONFIG (setting)); } +static void +_objlist_obj_to_str_fcn_ip_config_routing_rules (NMMetaAccessorGetType get_type, + NMSetting *setting, + guint idx, + GString *str) +{ + NMIPRoutingRule *rule; + gs_free char *s = NULL; + + rule = nm_setting_ip_config_get_routing_rule (NM_SETTING_IP_CONFIG (setting), idx); + s = nm_ip_routing_rule_to_string (rule, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE, + NULL, + NULL); + if (s) + g_string_append (str, s); +} + +static gboolean +_objlist_set_fcn_ip_config_routing_rules (NMSetting *setting, + gboolean do_add, + const char *str, + GError **error) +{ + NMSettingIPConfig *s_ip = NM_SETTING_IP_CONFIG (setting); + nm_auto_unref_ip_routing_rule NMIPRoutingRule *rule = NULL; + guint i, n; + + rule = nm_ip_routing_rule_from_string (str, + ( NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE + | ( NM_IS_SETTING_IP4_CONFIG (setting) + ? NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET + : NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6)), + NULL, + error); + if (!rule) + return FALSE; + + /* also for @do_add, we first always search whether such a rule already exist + * and remove the first occurance. + * + * The effect is, that we don't add multiple times the same rule, + * and that if the rule already exists, it gets moved to the end (append). + */ + n = nm_setting_ip_config_get_num_routing_rules (s_ip); + for (i = 0; i < n; i++) { + NMIPRoutingRule *rr; + + rr = nm_setting_ip_config_get_routing_rule (s_ip, i); + if (nm_ip_routing_rule_cmp (rule, rr) == 0) { + nm_setting_ip_config_remove_routing_rule (s_ip, i); + break; + } + } + if (do_add) + nm_setting_ip_config_add_routing_rule (s_ip, rule); + return TRUE; +} + static gconstpointer _get_fcn_match_interface_name (ARGS_GET_FCN) { @@ -5549,6 +5642,23 @@ static const NMMetaPropertyInfo *const property_infos_IP4_CONFIG[] = { ), ), ), + PROPERTY_INFO (NM_SETTING_IP_CONFIG_ROUTING_RULES, NULL, + .describe_message = + N_("Enter a list of IPv4 routing rules formatted as:\n" + " priority [prio] [from [src]] [to [dst]], ,...\n" + "\n"), + .property_type = &_pt_objlist, + .property_typ_data = DEFINE_PROPERTY_TYP_DATA ( + PROPERTY_TYP_DATA_SUBTYPE (objlist, + .get_num_fcn = OBJLIST_GET_NUM_FCN (NMSettingIPConfig, nm_setting_ip_config_get_num_routing_rules), + .clear_all_fcn = OBJLIST_CLEAR_ALL_FCN (NMSettingIPConfig, nm_setting_ip_config_clear_routing_rules), + .obj_to_str_fcn = _objlist_obj_to_str_fcn_ip_config_routing_rules, + .set_fcn = _objlist_set_fcn_ip_config_routing_rules, + .remove_by_idx_fcn_u = OBJLIST_REMOVE_BY_IDX_FCN_U (NMSettingIPConfig, nm_setting_ip_config_remove_routing_rule), + .strsplit_with_escape = TRUE, + ), + ), + ), PROPERTY_INFO (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES, DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES, .property_type = &_pt_gobject_bool, ), @@ -5740,6 +5850,23 @@ static const NMMetaPropertyInfo *const property_infos_IP6_CONFIG[] = { ), ), ), + PROPERTY_INFO (NM_SETTING_IP_CONFIG_ROUTING_RULES, NULL, + .describe_message = + N_("Enter a list of IPv6 routing rules formatted as:\n" + " priority [prio] [from [src]] [to [dst]], ,...\n" + "\n"), + .property_type = &_pt_objlist, + .property_typ_data = DEFINE_PROPERTY_TYP_DATA ( + PROPERTY_TYP_DATA_SUBTYPE (objlist, + .get_num_fcn = OBJLIST_GET_NUM_FCN (NMSettingIPConfig, nm_setting_ip_config_get_num_routing_rules), + .clear_all_fcn = OBJLIST_CLEAR_ALL_FCN (NMSettingIPConfig, nm_setting_ip_config_clear_routing_rules), + .obj_to_str_fcn = _objlist_obj_to_str_fcn_ip_config_routing_rules, + .set_fcn = _objlist_set_fcn_ip_config_routing_rules, + .remove_by_idx_fcn_u = OBJLIST_REMOVE_BY_IDX_FCN_U (NMSettingIPConfig, nm_setting_ip_config_remove_routing_rule), + .strsplit_with_escape = TRUE, + ), + ), + ), PROPERTY_INFO (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES, DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES, .property_type = &_pt_gobject_bool, ), @@ -5983,7 +6110,7 @@ static const NMMetaPropertyInfo *const property_infos_MATCH[] = { .add2_fcn = MULTILIST_ADD2_FCN (NMSettingMatch, nm_setting_match_add_interface_name), .remove_by_idx_fcn_s = MULTILIST_REMOVE_BY_IDX_FCN_S (NMSettingMatch, nm_setting_match_remove_interface_name), .remove_by_value_fcn = MULTILIST_REMOVE_BY_VALUE_FCN (NMSettingMatch, nm_setting_match_remove_interface_name_by_value), - .with_escaped_spaces = TRUE, + .strsplit_with_escape = TRUE, ), ), ), diff --git a/clients/common/nm-meta-setting-desc.h b/clients/common/nm-meta-setting-desc.h index cc94c2547d..15c0e81eb0 100644 --- a/clients/common/nm-meta-setting-desc.h +++ b/clients/common/nm-meta-setting-desc.h @@ -280,9 +280,7 @@ struct _NMMetaPropertyTypData { void (*remove_by_idx_fcn_u) (NMSetting *setting, guint idx); void (*remove_by_idx_fcn_s) (NMSetting *setting, int idx); gboolean (*remove_by_value_fcn) (NMSetting *setting, const char *item); - - /* if true, separate the list by space and allow backslash escaping. */ - bool with_escaped_spaces:1; + bool strsplit_with_escape:1; } multilist; struct { guint (*get_num_fcn) (NMSetting *setting); @@ -298,6 +296,7 @@ struct _NMMetaPropertyTypData { void (*remove_by_idx_fcn_u) (NMSetting *setting, guint idx); void (*remove_by_idx_fcn_s) (NMSetting *setting, int idx); bool delimit_pretty_with_semicolon:1; + bool strsplit_with_escape:1; } objlist; struct { gboolean (*set_fcn) (NMSetting *setting, diff --git a/clients/tests/test-client.check-on-disk/test_003.expected b/clients/tests/test-client.check-on-disk/test_003.expected index c2eac2c608..b8e5a319ba 100644 --- a/clients/tests/test-client.check-on-disk/test_003.expected +++ b/clients/tests/test-client.check-on-disk/test_003.expected @@ -150,12 +150,12 @@ id path uuid <<< -size: 3987 +size: 4073 location: clients/tests/test-client.py:910:test_003()/12 cmd: $NMCLI con s con-gsm1 lang: C returncode: 0 -stdout: 3853 bytes +stdout: 3939 bytes >>> connection.id: con-gsm1 connection.uuid: UUID-con-gsm1-REPLACED-REPLACED-REPL @@ -190,6 +190,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -210,6 +211,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -244,12 +246,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 4016 +size: 4102 location: clients/tests/test-client.py:910:test_003()/13 cmd: $NMCLI con s con-gsm1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3872 bytes +stdout: 3958 bytes >>> connection.id: con-gsm1 connection.uuid: UUID-con-gsm1-REPLACED-REPLACED-REPL @@ -284,6 +286,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -304,6 +307,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -470,12 +474,12 @@ UUID NAME UUID-ethernet-REPLACED-REPLACED-REPL ethernet <<< -size: 3805 +size: 3891 location: clients/tests/test-client.py:941:test_003()/25 cmd: $NMCLI -f ALL con s ethernet lang: C returncode: 0 -stdout: 3664 bytes +stdout: 3750 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -524,6 +528,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -544,6 +549,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -560,12 +566,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 3833 +size: 3919 location: clients/tests/test-client.py:941:test_003()/26 cmd: $NMCLI -f ALL con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 3682 bytes +stdout: 3768 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -614,6 +620,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -634,6 +641,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -670,12 +678,12 @@ stdout: 51 bytes GENERAL.STATE: aktywowano <<< -size: 4462 +size: 4548 location: clients/tests/test-client.py:947:test_003()/29 cmd: $NMCLI con s ethernet lang: C returncode: 0 -stdout: 4328 bytes +stdout: 4414 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -724,6 +732,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -744,6 +753,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -772,12 +782,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 4494 +size: 4580 location: clients/tests/test-client.py:947:test_003()/30 cmd: $NMCLI con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 4350 bytes +stdout: 4436 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -826,6 +836,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -846,6 +857,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -1318,12 +1330,12 @@ UUID NAME UUID-ethernet-REPLACED-REPLACED-REPL ethernet <<< -size: 3805 +size: 3891 location: clients/tests/test-client.py:941:test_003()/48 cmd: $NMCLI -f ALL con s ethernet lang: C returncode: 0 -stdout: 3664 bytes +stdout: 3750 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -1372,6 +1384,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -1392,6 +1405,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -1408,12 +1422,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 3833 +size: 3919 location: clients/tests/test-client.py:941:test_003()/49 cmd: $NMCLI -f ALL con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 3682 bytes +stdout: 3768 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -1462,6 +1476,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -1482,6 +1497,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -1522,12 +1538,12 @@ GENERAL.STATE: aktywowano GENERAL.STATE: aktywowano <<< -size: 5127 +size: 5213 location: clients/tests/test-client.py:947:test_003()/52 cmd: $NMCLI con s ethernet lang: C returncode: 0 -stdout: 4993 bytes +stdout: 5079 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -1576,6 +1592,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -1596,6 +1613,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -1637,12 +1655,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 5163 +size: 5249 location: clients/tests/test-client.py:947:test_003()/53 cmd: $NMCLI con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 5019 bytes +stdout: 5105 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -1691,6 +1709,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -1711,6 +1730,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -2114,12 +2134,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 5130 +size: 5216 location: clients/tests/test-client.py:977:test_003()/64 cmd: $NMCLI con s ethernet lang: C returncode: 0 -stdout: 4996 bytes +stdout: 5082 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -2168,6 +2188,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -2188,6 +2209,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -2229,12 +2251,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 5167 +size: 5253 location: clients/tests/test-client.py:977:test_003()/65 cmd: $NMCLI con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 5023 bytes +stdout: 5109 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -2283,6 +2305,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -2303,6 +2326,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -2344,12 +2368,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 4505 +size: 4591 location: clients/tests/test-client.py:980:test_003()/66 cmd: $NMCLI c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 4331 bytes +stdout: 4417 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -2398,6 +2422,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -2418,6 +2443,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -2446,12 +2472,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 4538 +size: 4624 location: clients/tests/test-client.py:980:test_003()/67 cmd: $NMCLI c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4354 bytes +stdout: 4440 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -2500,6 +2526,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -2520,6 +2547,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -2738,12 +2766,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 5142 +size: 5228 location: clients/tests/test-client.py:977:test_003()/74 cmd: $NMCLI --color yes con s ethernet lang: C returncode: 0 -stdout: 4996 bytes +stdout: 5082 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -2792,6 +2820,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -2812,6 +2841,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -2853,12 +2883,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 5179 +size: 5265 location: clients/tests/test-client.py:977:test_003()/75 cmd: $NMCLI --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 5023 bytes +stdout: 5109 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -2907,6 +2937,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -2927,6 +2958,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -2968,12 +3000,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 4517 +size: 4603 location: clients/tests/test-client.py:980:test_003()/76 cmd: $NMCLI --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 4331 bytes +stdout: 4417 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -3022,6 +3054,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -3042,6 +3075,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -3070,12 +3104,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 4550 +size: 4636 location: clients/tests/test-client.py:980:test_003()/77 cmd: $NMCLI --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4354 bytes +stdout: 4440 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -3124,6 +3158,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -3144,6 +3179,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -3378,12 +3414,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 6384 +size: 6470 location: clients/tests/test-client.py:977:test_003()/84 cmd: $NMCLI --pretty con s ethernet lang: C returncode: 0 -stdout: 6241 bytes +stdout: 6327 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -3437,6 +3473,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -3458,6 +3495,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -3509,12 +3547,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 6440 +size: 6526 location: clients/tests/test-client.py:977:test_003()/85 cmd: $NMCLI --pretty con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 6287 bytes +stdout: 6373 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -3568,6 +3606,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -3589,6 +3628,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -3640,12 +3680,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 5446 +size: 5532 location: clients/tests/test-client.py:980:test_003()/86 cmd: $NMCLI --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 5263 bytes +stdout: 5349 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -3699,6 +3739,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -3720,6 +3761,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -3754,12 +3796,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 5491 +size: 5577 location: clients/tests/test-client.py:980:test_003()/87 cmd: $NMCLI --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5298 bytes +stdout: 5384 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -3813,6 +3855,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -3834,6 +3877,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -4096,12 +4140,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 6396 +size: 6482 location: clients/tests/test-client.py:977:test_003()/94 cmd: $NMCLI --pretty --color yes con s ethernet lang: C returncode: 0 -stdout: 6241 bytes +stdout: 6327 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -4155,6 +4199,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -4176,6 +4221,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -4227,12 +4273,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 6452 +size: 6538 location: clients/tests/test-client.py:977:test_003()/95 cmd: $NMCLI --pretty --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 6287 bytes +stdout: 6373 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -4286,6 +4332,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -4307,6 +4354,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -4358,12 +4406,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 5458 +size: 5544 location: clients/tests/test-client.py:980:test_003()/96 cmd: $NMCLI --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 5263 bytes +stdout: 5349 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -4417,6 +4465,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -4438,6 +4487,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -4472,12 +4522,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 5503 +size: 5589 location: clients/tests/test-client.py:980:test_003()/97 cmd: $NMCLI --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5298 bytes +stdout: 5384 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -4531,6 +4581,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -4552,6 +4603,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -4794,12 +4846,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL:gsm UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet <<< -size: 2769 +size: 2809 location: clients/tests/test-client.py:977:test_003()/104 cmd: $NMCLI --terse con s ethernet lang: C returncode: 0 -stdout: 2626 bytes +stdout: 2666 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -4848,6 +4900,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -4868,6 +4921,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -4909,12 +4963,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2779 +size: 2819 location: clients/tests/test-client.py:977:test_003()/105 cmd: $NMCLI --terse con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 2626 bytes +stdout: 2666 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -4963,6 +5017,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -4983,6 +5038,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -5024,12 +5080,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2441 +size: 2481 location: clients/tests/test-client.py:980:test_003()/106 cmd: $NMCLI --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 2258 bytes +stdout: 2298 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -5078,6 +5134,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -5098,6 +5155,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -5126,12 +5184,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2451 +size: 2491 location: clients/tests/test-client.py:980:test_003()/107 cmd: $NMCLI --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2258 bytes +stdout: 2298 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -5180,6 +5238,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -5200,6 +5259,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -5414,12 +5474,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL:gsm UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet <<< -size: 2781 +size: 2821 location: clients/tests/test-client.py:977:test_003()/114 cmd: $NMCLI --terse --color yes con s ethernet lang: C returncode: 0 -stdout: 2626 bytes +stdout: 2666 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -5468,6 +5528,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -5488,6 +5549,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -5529,12 +5591,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2791 +size: 2831 location: clients/tests/test-client.py:977:test_003()/115 cmd: $NMCLI --terse --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 2626 bytes +stdout: 2666 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -5583,6 +5645,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -5603,6 +5666,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -5644,12 +5708,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2453 +size: 2493 location: clients/tests/test-client.py:980:test_003()/116 cmd: $NMCLI --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 2258 bytes +stdout: 2298 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -5698,6 +5762,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -5718,6 +5783,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -5746,12 +5812,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2463 +size: 2503 location: clients/tests/test-client.py:980:test_003()/117 cmd: $NMCLI --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2258 bytes +stdout: 2298 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -5800,6 +5866,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -5820,6 +5887,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -6038,12 +6106,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 3416 +size: 3476 location: clients/tests/test-client.py:977:test_003()/124 cmd: $NMCLI --mode tabular con s ethernet lang: C returncode: 0 -stdout: 3266 bytes +stdout: 3326 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) @@ -6051,11 +6119,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name method browser-only pac-url pac-script proxy none no -- -- @@ -6069,12 +6137,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 deactivating <<< -size: 3450 +size: 3510 location: clients/tests/test-client.py:977:test_003()/125 cmd: $NMCLI --mode tabular con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 3290 bytes +stdout: 3350 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) @@ -6082,11 +6150,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name method browser-only pac-url pac-script proxy none nie -- -- @@ -6100,12 +6168,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 dezaktywowanie <<< -size: 2974 +size: 3034 location: clients/tests/test-client.py:980:test_003()/126 cmd: $NMCLI --mode tabular c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 2784 bytes +stdout: 2844 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) @@ -6113,11 +6181,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name method browser-only pac-url pac-script proxy none no -- -- @@ -6127,12 +6195,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 deactivating <<< -size: 3006 +size: 3066 location: clients/tests/test-client.py:980:test_003()/127 cmd: $NMCLI --mode tabular c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2806 bytes +stdout: 2866 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) @@ -6140,11 +6208,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name method browser-only pac-url pac-script proxy none nie -- -- @@ -6276,12 +6344,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 3428 +size: 3488 location: clients/tests/test-client.py:977:test_003()/134 cmd: $NMCLI --mode tabular --color yes con s ethernet lang: C returncode: 0 -stdout: 3266 bytes +stdout: 3326 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) @@ -6289,11 +6357,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name method browser-only pac-url pac-script proxy none no -- -- @@ -6307,12 +6375,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 deactivating <<< -size: 3462 +size: 3522 location: clients/tests/test-client.py:977:test_003()/135 cmd: $NMCLI --mode tabular --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 3290 bytes +stdout: 3350 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) @@ -6320,11 +6388,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name method browser-only pac-url pac-script proxy none nie -- -- @@ -6338,12 +6406,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 dezaktywowanie <<< -size: 2986 +size: 3046 location: clients/tests/test-client.py:980:test_003()/136 cmd: $NMCLI --mode tabular --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 2784 bytes +stdout: 2844 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) @@ -6351,11 +6419,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name method browser-only pac-url pac-script proxy none no -- -- @@ -6365,12 +6433,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 deactivating <<< -size: 3018 +size: 3078 location: clients/tests/test-client.py:980:test_003()/137 cmd: $NMCLI --mode tabular --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2806 bytes +stdout: 2866 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-ethernet -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) @@ -6378,11 +6446,11 @@ connection ethernet UUID-ethernet-REPLACED-REPLACED-REPL -- 802-3-eth name port speed duplex auto-negotiate mac-address cloned-mac-address generate-mac-address-mask mac-address-blacklist mtu s390-subchannels s390-nettype s390-options wake-on-lan wake-on-lan-password 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name method browser-only pac-url pac-script proxy none nie -- -- @@ -6530,12 +6598,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 5607 +size: 5697 location: clients/tests/test-client.py:977:test_003()/144 cmd: $NMCLI --mode tabular --pretty con s ethernet lang: C returncode: 0 -stdout: 5448 bytes +stdout: 5538 bytes >>> ========================================= Connection profile details (ethernet) @@ -6548,13 +6616,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -6577,12 +6645,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 deactivating <<< -size: 5701 +size: 5791 location: clients/tests/test-client.py:977:test_003()/145 cmd: $NMCLI --mode tabular --pretty con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 5532 bytes +stdout: 5622 bytes >>> =========================================== Szczegóły profilu połączenia (ethernet) @@ -6595,13 +6663,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -6624,12 +6692,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 dezaktywowanie <<< -size: 4713 +size: 4803 location: clients/tests/test-client.py:980:test_003()/146 cmd: $NMCLI --mode tabular --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 4514 bytes +stdout: 4604 bytes >>> ========================================= Connection profile details (ethernet) @@ -6642,13 +6710,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -6663,12 +6731,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 deactivating <<< -size: 4785 +size: 4875 location: clients/tests/test-client.py:980:test_003()/147 cmd: $NMCLI --mode tabular --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4576 bytes +stdout: 4666 bytes >>> =========================================== Szczegóły profilu połączenia (ethernet) @@ -6681,13 +6749,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -6862,12 +6930,12 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL gsm UUID-con-xx1-REPLACED-REPLACED-REPLA ethernet <<< -size: 5619 +size: 5709 location: clients/tests/test-client.py:977:test_003()/154 cmd: $NMCLI --mode tabular --pretty --color yes con s ethernet lang: C returncode: 0 -stdout: 5448 bytes +stdout: 5538 bytes >>> ========================================= Connection profile details (ethernet) @@ -6880,13 +6948,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -6909,12 +6977,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 deactivating <<< -size: 5713 +size: 5803 location: clients/tests/test-client.py:977:test_003()/155 cmd: $NMCLI --mode tabular --pretty --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 5532 bytes +stdout: 5622 bytes >>> =========================================== Szczegóły profilu połączenia (ethernet) @@ -6927,13 +6995,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -6956,12 +7024,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 dezaktywowanie <<< -size: 4725 +size: 4815 location: clients/tests/test-client.py:980:test_003()/156 cmd: $NMCLI --mode tabular --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 4514 bytes +stdout: 4604 bytes >>> ========================================= Connection profile details (ethernet) @@ -6974,13 +7042,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- no -- -- -- -- auto -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -6995,12 +7063,12 @@ GENERAL ethernet UUID-ethernet-REPLACED-REPLACED-REPL eth0 deactivating <<< -size: 4797 +size: 4887 location: clients/tests/test-client.py:980:test_003()/157 cmd: $NMCLI --mode tabular --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4576 bytes +stdout: 4666 bytes >>> =========================================== Szczegóły profilu połączenia (ethernet) @@ -7013,13 +7081,13 @@ name port speed duplex auto-negotiate mac-address cloned-mac-add --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 802-3-ethernet -- 0 -- nie -- -- -- -- automatyczne -- -- -- default -- -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name method browser-only pac-url pac-script -------------------------------------------------- @@ -7174,66 +7242,66 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL:gsm UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet <<< -size: 828 +size: 830 location: clients/tests/test-client.py:977:test_003()/164 cmd: $NMCLI --mode tabular --terse con s ethernet lang: C returncode: 0 -stdout: 671 bytes +stdout: 673 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 802-3-ethernet::0::no:::::auto::::default: -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: proxy:none:no:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:activated:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/4:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: <<< -size: 838 +size: 840 location: clients/tests/test-client.py:977:test_003()/165 cmd: $NMCLI --mode tabular --terse con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 671 bytes +stdout: 673 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 802-3-ethernet::0::no:::::auto::::default: -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: proxy:none:no:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:activated:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/4:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: <<< -size: 681 +size: 683 location: clients/tests/test-client.py:980:test_003()/166 cmd: $NMCLI --mode tabular --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 484 bytes +stdout: 486 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 802-3-ethernet::0::no:::::auto::::default: -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: proxy:none:no:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: <<< -size: 691 +size: 693 location: clients/tests/test-client.py:980:test_003()/167 cmd: $NMCLI --mode tabular --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 484 bytes +stdout: 486 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 802-3-ethernet::0::no:::::auto::::default: -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: proxy:none:no:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: @@ -7326,66 +7394,66 @@ UUID-con-gsm1-REPLACED-REPLACED-REPL:gsm UUID-con-xx1-REPLACED-REPLACED-REPLA:802-3-ethernet <<< -size: 840 +size: 842 location: clients/tests/test-client.py:977:test_003()/174 cmd: $NMCLI --mode tabular --terse --color yes con s ethernet lang: C returncode: 0 -stdout: 671 bytes +stdout: 673 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 802-3-ethernet::0::no:::::auto::::default: -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: proxy:none:no:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:activated:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/4:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: <<< -size: 850 +size: 852 location: clients/tests/test-client.py:977:test_003()/175 cmd: $NMCLI --mode tabular --terse --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 671 bytes +stdout: 673 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 802-3-ethernet::0::no:::::auto::::default: -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: proxy:none:no:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth1:activated:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/4:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: <<< -size: 693 +size: 695 location: clients/tests/test-client.py:980:test_003()/176 cmd: $NMCLI --mode tabular --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 484 bytes +stdout: 486 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 802-3-ethernet::0::no:::::auto::::default: -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: proxy:none:no:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: <<< -size: 703 +size: 705 location: clients/tests/test-client.py:980:test_003()/177 cmd: $NMCLI --mode tabular --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 484 bytes +stdout: 486 bytes >>> connection:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL::802-3-ethernet::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 802-3-ethernet::0::no:::::auto::::default: -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: proxy:none:no:: GENERAL:ethernet:UUID-ethernet-REPLACED-REPLACED-REPL:eth0:deactivating:no:no::no:/org/freedesktop/NetworkManager/ActiveConnection/1:/org/freedesktop/NetworkManager/Settings/Connection/4:: @@ -7626,12 +7694,12 @@ UUID: UUID-con-xx1-REPLACED-REPLACED-REPLA TYPE: ethernet <<< -size: 5148 +size: 5234 location: clients/tests/test-client.py:977:test_003()/184 cmd: $NMCLI --mode multiline con s ethernet lang: C returncode: 0 -stdout: 4996 bytes +stdout: 5082 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -7680,6 +7748,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -7700,6 +7769,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -7741,12 +7811,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 5185 +size: 5271 location: clients/tests/test-client.py:977:test_003()/185 cmd: $NMCLI --mode multiline con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 5023 bytes +stdout: 5109 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -7795,6 +7865,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -7815,6 +7886,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -7856,12 +7928,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 4523 +size: 4609 location: clients/tests/test-client.py:980:test_003()/186 cmd: $NMCLI --mode multiline c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 4331 bytes +stdout: 4417 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -7910,6 +7982,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -7930,6 +8003,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -7958,12 +8032,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 4556 +size: 4642 location: clients/tests/test-client.py:980:test_003()/187 cmd: $NMCLI --mode multiline c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4354 bytes +stdout: 4440 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -8012,6 +8086,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -8032,6 +8107,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -8394,12 +8470,12 @@ UUID: UUID-con-xx1-REPLACED-REPLACED-REPLA TYPE: ethernet <<< -size: 5160 +size: 5246 location: clients/tests/test-client.py:977:test_003()/194 cmd: $NMCLI --mode multiline --color yes con s ethernet lang: C returncode: 0 -stdout: 4996 bytes +stdout: 5082 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -8448,6 +8524,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -8468,6 +8545,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -8509,12 +8587,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 5197 +size: 5283 location: clients/tests/test-client.py:977:test_003()/195 cmd: $NMCLI --mode multiline --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 5023 bytes +stdout: 5109 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -8563,6 +8641,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -8583,6 +8662,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -8624,12 +8704,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 4535 +size: 4621 location: clients/tests/test-client.py:980:test_003()/196 cmd: $NMCLI --mode multiline --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 4331 bytes +stdout: 4417 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -8678,6 +8758,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -8698,6 +8779,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -8726,12 +8808,12 @@ GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- <<< -size: 4568 +size: 4654 location: clients/tests/test-client.py:980:test_003()/197 cmd: $NMCLI --mode multiline --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4354 bytes +stdout: 4440 bytes >>> connection.id: ethernet connection.uuid: UUID-ethernet-REPLACED-REPLACED-REPL @@ -8780,6 +8862,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -8800,6 +8883,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -9192,12 +9276,12 @@ TYPE: ethernet ------------------------------------------------------------------------------- <<< -size: 6402 +size: 6488 location: clients/tests/test-client.py:977:test_003()/204 cmd: $NMCLI --mode multiline --pretty con s ethernet lang: C returncode: 0 -stdout: 6241 bytes +stdout: 6327 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -9251,6 +9335,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -9272,6 +9357,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -9323,12 +9409,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 6458 +size: 6544 location: clients/tests/test-client.py:977:test_003()/205 cmd: $NMCLI --mode multiline --pretty con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 6287 bytes +stdout: 6373 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -9382,6 +9468,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -9403,6 +9490,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -9454,12 +9542,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 5464 +size: 5550 location: clients/tests/test-client.py:980:test_003()/206 cmd: $NMCLI --mode multiline --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 5263 bytes +stdout: 5349 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -9513,6 +9601,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -9534,6 +9623,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -9568,12 +9658,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 5509 +size: 5595 location: clients/tests/test-client.py:980:test_003()/207 cmd: $NMCLI --mode multiline --pretty c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5298 bytes +stdout: 5384 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -9627,6 +9717,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -9648,6 +9739,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -10068,12 +10160,12 @@ TYPE: ethernet ------------------------------------------------------------------------------- <<< -size: 6414 +size: 6500 location: clients/tests/test-client.py:977:test_003()/214 cmd: $NMCLI --mode multiline --pretty --color yes con s ethernet lang: C returncode: 0 -stdout: 6241 bytes +stdout: 6327 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -10127,6 +10219,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -10148,6 +10241,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -10199,12 +10293,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 6470 +size: 6556 location: clients/tests/test-client.py:977:test_003()/215 cmd: $NMCLI --mode multiline --pretty --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 6287 bytes +stdout: 6373 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -10258,6 +10352,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -10279,6 +10374,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -10330,12 +10426,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 5476 +size: 5562 location: clients/tests/test-client.py:980:test_003()/216 cmd: $NMCLI --mode multiline --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 5263 bytes +stdout: 5349 bytes >>> =============================================================================== Connection profile details (ethernet) @@ -10389,6 +10485,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -10410,6 +10507,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -10444,12 +10542,12 @@ GENERAL.MASTER-PATH: -- ------------------------------------------------------------------------------- <<< -size: 5521 +size: 5607 location: clients/tests/test-client.py:980:test_003()/217 cmd: $NMCLI --mode multiline --pretty --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5298 bytes +stdout: 5384 bytes >>> =============================================================================== Szczegóły profilu połączenia (ethernet) @@ -10503,6 +10601,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -10524,6 +10623,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -10914,12 +11014,12 @@ UUID:UUID-con-xx1-REPLACED-REPLACED-REPLA TYPE:802-3-ethernet <<< -size: 2786 +size: 2826 location: clients/tests/test-client.py:977:test_003()/224 cmd: $NMCLI --mode multiline --terse con s ethernet lang: C returncode: 0 -stdout: 2626 bytes +stdout: 2666 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -10968,6 +11068,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -10988,6 +11089,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -11029,12 +11131,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2796 +size: 2836 location: clients/tests/test-client.py:977:test_003()/225 cmd: $NMCLI --mode multiline --terse con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 2626 bytes +stdout: 2666 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -11083,6 +11185,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -11103,6 +11206,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -11144,12 +11248,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2458 +size: 2498 location: clients/tests/test-client.py:980:test_003()/226 cmd: $NMCLI --mode multiline --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 2258 bytes +stdout: 2298 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -11198,6 +11302,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -11218,6 +11323,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -11246,12 +11352,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2468 +size: 2508 location: clients/tests/test-client.py:980:test_003()/227 cmd: $NMCLI --mode multiline --terse c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2258 bytes +stdout: 2298 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -11300,6 +11406,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -11320,6 +11427,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -11682,12 +11790,12 @@ UUID:UUID-con-xx1-REPLACED-REPLACED-REPLA TYPE:802-3-ethernet <<< -size: 2798 +size: 2838 location: clients/tests/test-client.py:977:test_003()/234 cmd: $NMCLI --mode multiline --terse --color yes con s ethernet lang: C returncode: 0 -stdout: 2626 bytes +stdout: 2666 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -11736,6 +11844,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -11756,6 +11865,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -11797,12 +11907,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2808 +size: 2848 location: clients/tests/test-client.py:977:test_003()/235 cmd: $NMCLI --mode multiline --terse --color yes con s ethernet lang: pl_PL.UTF-8 returncode: 0 -stdout: 2626 bytes +stdout: 2666 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -11851,6 +11961,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -11871,6 +11982,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -11912,12 +12024,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2470 +size: 2510 location: clients/tests/test-client.py:980:test_003()/236 cmd: $NMCLI --mode multiline --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: C returncode: 0 -stdout: 2258 bytes +stdout: 2298 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -11966,6 +12078,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -11986,6 +12099,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -12014,12 +12128,12 @@ GENERAL.ZONE: GENERAL.MASTER-PATH: <<< -size: 2480 +size: 2520 location: clients/tests/test-client.py:980:test_003()/237 cmd: $NMCLI --mode multiline --terse --color yes c s /org/freedesktop/NetworkManager/ActiveConnection/1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2258 bytes +stdout: 2298 bytes >>> connection.id:ethernet connection.uuid:UUID-ethernet-REPLACED-REPLACED-REPL @@ -12068,6 +12182,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -12088,6 +12203,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no diff --git a/clients/tests/test-client.check-on-disk/test_004.expected b/clients/tests/test-client.check-on-disk/test_004.expected index 7a5548129f..386caed244 100644 --- a/clients/tests/test-client.check-on-disk/test_004.expected +++ b/clients/tests/test-client.check-on-disk/test_004.expected @@ -58,12 +58,12 @@ location: clients/tests/test-client.py:1001:test_004()/7 cmd: $NMCLI connection mod con-xx1 ipv4.addresses 192.168.77.5/24 ipv4.routes '2.3.4.5/32 192.168.77.1' ipv6.addresses 1:2:3:4::6/64 ipv6.routes 1:2:3:4:5:6::5/128 lang: C returncode: 0 -size: 4048 +size: 4134 location: clients/tests/test-client.py:1003:test_004()/8 cmd: $NMCLI con s con-xx1 lang: C returncode: 0 -stdout: 3915 bytes +stdout: 4001 bytes >>> connection.id: con-xx1 connection.uuid: UUID-con-xx1-REPLACED-REPLACED-REPLA @@ -115,6 +115,7 @@ ipv4.gateway: -- ipv4.routes: { ip = 2.3.4.5/32, nh = 192.168.77.1 } ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -135,6 +136,7 @@ ipv6.gateway: -- ipv6.routes: { ip = 1:2:3:4:5:6:0:5/128 } ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -151,12 +153,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 4076 +size: 4162 location: clients/tests/test-client.py:1003:test_004()/9 cmd: $NMCLI con s con-xx1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3933 bytes +stdout: 4019 bytes >>> connection.id: con-xx1 connection.uuid: UUID-con-xx1-REPLACED-REPLACED-REPLA @@ -208,6 +210,7 @@ ipv4.gateway: -- ipv4.routes: { ip = 2.3.4.5/32, nh = 192.168.77.1 } ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -228,6 +231,7 @@ ipv6.gateway: -- ipv6.routes: { ip = 1:2:3:4:5:6:0:5/128 } ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -280,12 +284,12 @@ con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP vpn -- con-xx1 UUID-con-xx1-REPLACED-REPLACED-REPLA wifi -- <<< -size: 3515 +size: 3601 location: clients/tests/test-client.py:1015:test_004()/13 cmd: $NMCLI con s con-vpn-1 lang: C returncode: 0 -stdout: 3379 bytes +stdout: 3465 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -320,6 +324,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -340,6 +345,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -362,12 +368,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 3535 +size: 3621 location: clients/tests/test-client.py:1015:test_004()/14 cmd: $NMCLI con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3389 bytes +stdout: 3475 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -402,6 +408,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -422,6 +429,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -516,12 +524,12 @@ con-xx1 UUID-con-xx1-REPLACED-REPLACED-REPLA wifi wlan0 con-1 5fcfd6d7-1e63-3332-8826-a7eda103792d ethernet -- <<< -size: 4597 +size: 4683 location: clients/tests/test-client.py:1025:test_004()/21 cmd: $NMCLI con s con-vpn-1 lang: C returncode: 0 -stdout: 4461 bytes +stdout: 4547 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -556,6 +564,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -576,6 +585,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -618,12 +628,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4623 +size: 4709 location: clients/tests/test-client.py:1025:test_004()/22 cmd: $NMCLI con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4477 bytes +stdout: 4563 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -658,6 +668,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -678,6 +689,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -720,12 +732,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4603 +size: 4689 location: clients/tests/test-client.py:1036:test_004()/23 cmd: $NMCLI con s con-vpn-1 lang: C returncode: 0 -stdout: 4467 bytes +stdout: 4553 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -760,6 +772,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -780,6 +793,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -822,12 +836,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4633 +size: 4719 location: clients/tests/test-client.py:1036:test_004()/24 cmd: $NMCLI con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4487 bytes +stdout: 4573 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -862,6 +876,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -882,6 +897,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -924,12 +940,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4603 +size: 4689 location: clients/tests/test-client.py:1038:test_004()/25 cmd: $NMCLI con s con-vpn-1 lang: C returncode: 0 -stdout: 4467 bytes +stdout: 4553 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -964,6 +980,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -984,6 +1001,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -1026,12 +1044,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4633 +size: 4719 location: clients/tests/test-client.py:1038:test_004()/26 cmd: $NMCLI con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4487 bytes +stdout: 4573 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -1066,6 +1084,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -1086,6 +1105,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -1128,12 +1148,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 3522 +size: 3608 location: clients/tests/test-client.py:1041:test_004()/27 cmd: $NMCLI -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3379 bytes +stdout: 3465 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -1168,6 +1188,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -1188,6 +1209,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -1210,12 +1232,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 3542 +size: 3628 location: clients/tests/test-client.py:1041:test_004()/28 cmd: $NMCLI -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3389 bytes +stdout: 3475 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -1250,6 +1272,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -1270,6 +1293,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -3682,12 +3706,12 @@ NEIGHBOR[2].SYSTEM-DESCRIPTION: Test system #3 NEIGHBOR[2].SYSTEM-CAPABILITIES: 40 (wlan-access-point,telephone) <<< -size: 4615 +size: 4701 location: clients/tests/test-client.py:1036:test_004()/71 cmd: $NMCLI --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 4467 bytes +stdout: 4553 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -3722,6 +3746,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -3742,6 +3767,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -3784,12 +3810,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4645 +size: 4731 location: clients/tests/test-client.py:1036:test_004()/72 cmd: $NMCLI --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4487 bytes +stdout: 4573 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -3824,6 +3850,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -3844,6 +3871,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -3886,12 +3914,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4615 +size: 4701 location: clients/tests/test-client.py:1038:test_004()/73 cmd: $NMCLI --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 4467 bytes +stdout: 4553 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -3926,6 +3954,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -3946,6 +3975,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -3988,12 +4018,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4645 +size: 4731 location: clients/tests/test-client.py:1038:test_004()/74 cmd: $NMCLI --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4487 bytes +stdout: 4573 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -4028,6 +4058,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -4048,6 +4079,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -4090,12 +4122,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 3534 +size: 3620 location: clients/tests/test-client.py:1041:test_004()/75 cmd: $NMCLI --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3379 bytes +stdout: 3465 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -4130,6 +4162,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -4150,6 +4183,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -4172,12 +4206,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 3554 +size: 3640 location: clients/tests/test-client.py:1041:test_004()/76 cmd: $NMCLI --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3389 bytes +stdout: 3475 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -4212,6 +4246,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -4232,6 +4267,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -6644,12 +6680,12 @@ NEIGHBOR[2].SYSTEM-DESCRIPTION: Test system #3 NEIGHBOR[2].SYSTEM-CAPABILITIES: 40 (wlan-access-point,telephone) <<< -size: 5625 +size: 5711 location: clients/tests/test-client.py:1036:test_004()/119 cmd: $NMCLI --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 5479 bytes +stdout: 5565 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -6688,6 +6724,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -6709,6 +6746,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -6759,12 +6797,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5667 +size: 5753 location: clients/tests/test-client.py:1036:test_004()/120 cmd: $NMCLI --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5597 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -6803,6 +6841,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -6824,6 +6863,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -6874,12 +6914,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5625 +size: 5711 location: clients/tests/test-client.py:1038:test_004()/121 cmd: $NMCLI --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 5479 bytes +stdout: 5565 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -6918,6 +6958,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -6939,6 +6980,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -6989,12 +7031,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5667 +size: 5753 location: clients/tests/test-client.py:1038:test_004()/122 cmd: $NMCLI --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5597 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -7033,6 +7075,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -7054,6 +7097,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -7104,12 +7148,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 4151 +size: 4237 location: clients/tests/test-client.py:1041:test_004()/123 cmd: $NMCLI --pretty -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3998 bytes +stdout: 4084 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -7148,6 +7192,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -7169,6 +7214,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -7194,12 +7240,12 @@ proxy.pac-script: -- ------------------------------------------------------------------------------- <<< -size: 4176 +size: 4262 location: clients/tests/test-client.py:1041:test_004()/124 cmd: $NMCLI --pretty -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4013 bytes +stdout: 4099 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -7238,6 +7284,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -7259,6 +7306,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -10220,12 +10268,12 @@ NEIGHBOR[2].SYSTEM-CAPABILITIES: 40 (wlan-access-point,telephone) ------------------------------------------------------------------------------- <<< -size: 5637 +size: 5723 location: clients/tests/test-client.py:1036:test_004()/167 cmd: $NMCLI --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 5479 bytes +stdout: 5565 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -10264,6 +10312,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -10285,6 +10334,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -10335,12 +10385,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5679 +size: 5765 location: clients/tests/test-client.py:1036:test_004()/168 cmd: $NMCLI --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5597 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -10379,6 +10429,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -10400,6 +10451,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -10450,12 +10502,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5637 +size: 5723 location: clients/tests/test-client.py:1038:test_004()/169 cmd: $NMCLI --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 5479 bytes +stdout: 5565 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -10494,6 +10546,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -10515,6 +10568,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -10565,12 +10619,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5679 +size: 5765 location: clients/tests/test-client.py:1038:test_004()/170 cmd: $NMCLI --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5597 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -10609,6 +10663,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -10630,6 +10685,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -10680,12 +10736,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 4163 +size: 4249 location: clients/tests/test-client.py:1041:test_004()/171 cmd: $NMCLI --pretty --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3998 bytes +stdout: 4084 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -10724,6 +10780,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -10745,6 +10802,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -10770,12 +10828,12 @@ proxy.pac-script: -- ------------------------------------------------------------------------------- <<< -size: 4188 +size: 4274 location: clients/tests/test-client.py:1041:test_004()/172 cmd: $NMCLI --pretty --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4013 bytes +stdout: 4099 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -10814,6 +10872,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -10835,6 +10894,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -13796,12 +13856,12 @@ NEIGHBOR[2].SYSTEM-CAPABILITIES: 40 (wlan-access-point,telephone) ------------------------------------------------------------------------------- <<< -size: 2323 +size: 2363 location: clients/tests/test-client.py:1036:test_004()/215 cmd: $NMCLI --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -13836,6 +13896,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -13856,6 +13917,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -13898,12 +13960,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2333 +size: 2373 location: clients/tests/test-client.py:1036:test_004()/216 cmd: $NMCLI --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -13938,6 +14000,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -13958,6 +14021,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -14000,12 +14064,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2323 +size: 2363 location: clients/tests/test-client.py:1038:test_004()/217 cmd: $NMCLI --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -14040,6 +14104,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -14060,6 +14125,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -14102,12 +14168,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2333 +size: 2373 location: clients/tests/test-client.py:1038:test_004()/218 cmd: $NMCLI --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -14142,6 +14208,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -14162,6 +14229,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -14204,12 +14272,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 1771 +size: 1811 location: clients/tests/test-client.py:1041:test_004()/219 cmd: $NMCLI --terse -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 1619 bytes +stdout: 1659 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -14244,6 +14312,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -14264,6 +14333,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -14286,12 +14356,12 @@ proxy.pac-url: proxy.pac-script: <<< -size: 1781 +size: 1821 location: clients/tests/test-client.py:1041:test_004()/220 cmd: $NMCLI --terse -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 1619 bytes +stdout: 1659 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -14326,6 +14396,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -14346,6 +14417,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -16728,12 +16800,12 @@ NEIGHBOR[2].SYSTEM-DESCRIPTION:Test system #3 NEIGHBOR[2].SYSTEM-CAPABILITIES:40 (wlan-access-point,telephone) <<< -size: 2335 +size: 2375 location: clients/tests/test-client.py:1036:test_004()/263 cmd: $NMCLI --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -16768,6 +16840,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -16788,6 +16861,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -16830,12 +16904,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2345 +size: 2385 location: clients/tests/test-client.py:1036:test_004()/264 cmd: $NMCLI --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -16870,6 +16944,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -16890,6 +16965,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -16932,12 +17008,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2335 +size: 2375 location: clients/tests/test-client.py:1038:test_004()/265 cmd: $NMCLI --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -16972,6 +17048,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -16992,6 +17069,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -17034,12 +17112,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2345 +size: 2385 location: clients/tests/test-client.py:1038:test_004()/266 cmd: $NMCLI --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -17074,6 +17152,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -17094,6 +17173,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -17136,12 +17216,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 1783 +size: 1823 location: clients/tests/test-client.py:1041:test_004()/267 cmd: $NMCLI --terse --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 1619 bytes +stdout: 1659 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -17176,6 +17256,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -17196,6 +17277,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -17218,12 +17300,12 @@ proxy.pac-url: proxy.pac-script: <<< -size: 1793 +size: 1833 location: clients/tests/test-client.py:1041:test_004()/268 cmd: $NMCLI --terse --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 1619 bytes +stdout: 1659 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -17258,6 +17340,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -17278,6 +17361,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -19660,21 +19744,21 @@ NEIGHBOR[2].SYSTEM-DESCRIPTION:Test system #3 NEIGHBOR[2].SYSTEM-CAPABILITIES:40 (wlan-access-point,telephone) <<< -size: 2978 +size: 3038 location: clients/tests/test-client.py:1036:test_004()/311 cmd: $NMCLI --mode tabular con s con-vpn-1 lang: C returncode: 0 -stdout: 2826 bytes +stdout: 2886 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> no 0 @@ -19689,21 +19773,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 3001 +size: 3061 location: clients/tests/test-client.py:1036:test_004()/312 cmd: $NMCLI --mode tabular con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2839 bytes +stdout: 2899 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> nie 0 @@ -19718,21 +19802,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 2978 +size: 3038 location: clients/tests/test-client.py:1038:test_004()/313 cmd: $NMCLI --mode tabular con s con-vpn-1 lang: C returncode: 0 -stdout: 2826 bytes +stdout: 2886 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> no 0 @@ -19747,21 +19831,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 3001 +size: 3061 location: clients/tests/test-client.py:1038:test_004()/314 cmd: $NMCLI --mode tabular con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2839 bytes +stdout: 2899 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> nie 0 @@ -19776,21 +19860,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 2246 +size: 2306 location: clients/tests/test-client.py:1041:test_004()/315 cmd: $NMCLI --mode tabular -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 2087 bytes +stdout: 2147 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> no 0 @@ -19800,21 +19884,21 @@ proxy none no -- -- <<< -size: 2258 +size: 2318 location: clients/tests/test-client.py:1041:test_004()/316 cmd: $NMCLI --mode tabular -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2089 bytes +stdout: 2149 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> nie 0 @@ -21174,21 +21258,21 @@ eth0 chassis1 44:44:44:44:44:44 GigabitEthernet #2 test2.example. eth0 00:11:22:33:44:22 port1 GigabitEthernet #3 test3.example.com Test system #3 40 (wlan-access-point,telephone) <<< -size: 2990 +size: 3050 location: clients/tests/test-client.py:1036:test_004()/359 cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 2826 bytes +stdout: 2886 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> no 0 @@ -21203,21 +21287,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 3013 +size: 3073 location: clients/tests/test-client.py:1036:test_004()/360 cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2839 bytes +stdout: 2899 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> nie 0 @@ -21232,21 +21316,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 2990 +size: 3050 location: clients/tests/test-client.py:1038:test_004()/361 cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 2826 bytes +stdout: 2886 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> no 0 @@ -21261,21 +21345,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 3013 +size: 3073 location: clients/tests/test-client.py:1038:test_004()/362 cmd: $NMCLI --mode tabular --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2839 bytes +stdout: 2899 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> nie 0 @@ -21290,21 +21374,21 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 2258 +size: 2318 location: clients/tests/test-client.py:1041:test_004()/363 cmd: $NMCLI --mode tabular --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 2087 bytes +stdout: 2147 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> no 0 @@ -21314,21 +21398,21 @@ proxy none no -- -- <<< -size: 2270 +size: 2330 location: clients/tests/test-client.py:1041:test_004()/364 cmd: $NMCLI --mode tabular --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2089 bytes +stdout: 2149 bytes >>> name id uuid stable-id type interface-name autoconnect autoconnect-priority autoconnect-retries multi-connect auth-retries timestamp read-only permissions zone master slave-type autoconnect-slaves secondaries gateway-ping-timeout metered lldp mdns llmnr connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout vpn org.freedesktop.NetworkManager.openvpn -- key1 = val1, key2 = val2, key3 = val3 <hidden> nie 0 @@ -22688,12 +22772,12 @@ eth0 chassis1 44:44:44:44:44:44 GigabitEthernet #2 test2.example. eth0 00:11:22:33:44:22 port1 GigabitEthernet #3 test3.example.com Test system #3 40 (wlan-access-point,telephone) <<< -size: 4742 +size: 4832 location: clients/tests/test-client.py:1036:test_004()/407 cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 4581 bytes +stdout: 4671 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -22702,13 +22786,13 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -22730,12 +22814,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 4798 +size: 4888 location: clients/tests/test-client.py:1036:test_004()/408 cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4627 bytes +stdout: 4717 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -22744,13 +22828,13 @@ name id uuid stable-id type in ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -22772,12 +22856,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 4742 +size: 4832 location: clients/tests/test-client.py:1038:test_004()/409 cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 4581 bytes +stdout: 4671 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -22786,13 +22870,13 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -22814,12 +22898,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 4798 +size: 4888 location: clients/tests/test-client.py:1038:test_004()/410 cmd: $NMCLI --mode tabular --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4627 bytes +stdout: 4717 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -22828,13 +22912,13 @@ name id uuid stable-id type in ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -22856,12 +22940,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 3428 +size: 3518 location: clients/tests/test-client.py:1041:test_004()/411 cmd: $NMCLI --mode tabular --pretty -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3260 bytes +stdout: 3350 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -22870,13 +22954,13 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -22888,12 +22972,12 @@ proxy none no -- -- <<< -size: 3451 +size: 3541 location: clients/tests/test-client.py:1041:test_004()/412 cmd: $NMCLI --mode tabular --pretty -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3273 bytes +stdout: 3363 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -22902,13 +22986,13 @@ name id uuid stable-id type in ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -24798,12 +24882,12 @@ eth0 chassis1 44:44:44:44:44:44 GigabitEthernet #2 test2.example. eth0 00:11:22:33:44:22 port1 GigabitEthernet #3 test3.example.com Test system #3 40 (wlan-access-point,telephone) <<< -size: 4754 +size: 4844 location: clients/tests/test-client.py:1036:test_004()/455 cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 4581 bytes +stdout: 4671 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -24812,13 +24896,13 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -24840,12 +24924,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 4810 +size: 4900 location: clients/tests/test-client.py:1036:test_004()/456 cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4627 bytes +stdout: 4717 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -24854,13 +24938,13 @@ name id uuid stable-id type in ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -24882,12 +24966,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 4754 +size: 4844 location: clients/tests/test-client.py:1038:test_004()/457 cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 4581 bytes +stdout: 4671 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -24896,13 +24980,13 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -24924,12 +25008,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 - VPN connected key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 4810 +size: 4900 location: clients/tests/test-client.py:1038:test_004()/458 cmd: $NMCLI --mode tabular --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4627 bytes +stdout: 4717 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -24938,13 +25022,13 @@ name id uuid stable-id type in ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -24966,12 +25050,12 @@ NAME TYPE USERNAME GATEWAY BANNER VPN-STATE VPN openvpn -- -- *** VPN connection con-vpn-1 *** 5 — Połączono z VPN key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 3440 +size: 3530 location: clients/tests/test-client.py:1041:test_004()/459 cmd: $NMCLI --mode tabular --pretty --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3260 bytes +stdout: 3350 bytes >>> ========================================== Connection profile details (con-vpn-1) @@ -24980,13 +25064,13 @@ name id uuid stable-id type in ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- yes 0 -1 (default) 0 (default) -1 0 no -- -- -- -- -1 (default) -- 0 unknown default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no -- 0 (default) yes -- -- no yes -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no -- 0 (default) yes -- -- no yes -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) no no no yes -1 (unknown) stable-privacy -- yes -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- no no no yes -1 (unknown) stable-privacy -- yes -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -24998,12 +25082,12 @@ proxy none no -- -- <<< -size: 3463 +size: 3553 location: clients/tests/test-client.py:1041:test_004()/460 cmd: $NMCLI --mode tabular --pretty --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3273 bytes +stdout: 3363 bytes >>> ============================================ Szczegóły profilu połączenia (con-vpn-1) @@ -25012,13 +25096,13 @@ name id uuid stable-id type in ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ connection con-vpn-1 UUID-con-vpn-1-REPLACED-REPLACED-REP -- vpn -- tak 0 -1 (default) 0 (default) -1 0 nie -- -- -- -- -1 (default) -- 0 nieznane default -1 (default) -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie -- 0 (default) tak -- -- nie tak -1 (default) +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns dhcp-client-id dhcp-timeout dhcp-send-hostname dhcp-hostname dhcp-fqdn never-default may-fail dad-timeout +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv4 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie -- 0 (default) tak -- -- nie tak -1 (default) -name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- +name method dns dns-search dns-options dns-priority addresses gateway routes route-metric route-table routing-rules ignore-auto-routes ignore-auto-dns never-default may-fail ip6-privacy addr-gen-mode dhcp-duid dhcp-send-hostname dhcp-hostname token +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ipv6 auto -- -- "" 0 -- -- -- -1 0 (unspec) -- nie nie nie tak -1 (unknown) stable-privacy -- tak -- -- name service-type user-name data secrets persistent timeout ------------------------------------------------------------------------------------------------------------------------------- @@ -26908,94 +26992,94 @@ eth0 chassis1 44:44:44:44:44:44 GigabitEthernet #2 test2.example. eth0 00:11:22:33:44:22 port1 GigabitEthernet #3 test3.example.com Test system #3 40 (wlan-access-point,telephone) <<< -size: 791 +size: 793 location: clients/tests/test-client.py:1036:test_004()/503 cmd: $NMCLI --mode tabular --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 632 bytes +stdout: 634 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 801 +size: 803 location: clients/tests/test-client.py:1036:test_004()/504 cmd: $NMCLI --mode tabular --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 632 bytes +stdout: 634 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 791 +size: 793 location: clients/tests/test-client.py:1038:test_004()/505 cmd: $NMCLI --mode tabular --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 632 bytes +stdout: 634 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 801 +size: 803 location: clients/tests/test-client.py:1038:test_004()/506 cmd: $NMCLI --mode tabular --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 632 bytes +stdout: 634 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 504 +size: 506 location: clients/tests/test-client.py:1041:test_004()/507 cmd: $NMCLI --mode tabular --terse -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 338 bytes +stdout: 340 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: <<< -size: 514 +size: 516 location: clients/tests/test-client.py:1041:test_004()/508 cmd: $NMCLI --mode tabular --terse -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 338 bytes +stdout: 340 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: @@ -27784,94 +27868,94 @@ eth0:chassis1:44\:44\:44\:44\:44\:44:GigabitEthernet #2:test2.example.com:Test s eth0:00\:11\:22\:33\:44\:22:port1:GigabitEthernet #3:test3.example.com:Test system #3:40 (wlan-access-point,telephone) <<< -size: 803 +size: 805 location: clients/tests/test-client.py:1036:test_004()/551 cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 632 bytes +stdout: 634 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 813 +size: 815 location: clients/tests/test-client.py:1036:test_004()/552 cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 632 bytes +stdout: 634 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 803 +size: 805 location: clients/tests/test-client.py:1038:test_004()/553 cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 632 bytes +stdout: 634 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 813 +size: 815 location: clients/tests/test-client.py:1038:test_004()/554 cmd: $NMCLI --mode tabular --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 632 bytes +stdout: 634 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: GENERAL:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP:wlan0:activated:no:no::yes:/org/freedesktop/NetworkManager/ActiveConnection/2:/org/freedesktop/NetworkManager/Settings/Connection/3:: VPN:openvpn:::*** VPN connection con-vpn-1 ***:5 - VPN connected:key1 = val1 | key2 = val2 | key3 = val3 <<< -size: 516 +size: 518 location: clients/tests/test-client.py:1041:test_004()/555 cmd: $NMCLI --mode tabular --terse --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 338 bytes +stdout: 340 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: <<< -size: 526 +size: 528 location: clients/tests/test-client.py:1041:test_004()/556 cmd: $NMCLI --mode tabular --terse --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 338 bytes +stdout: 340 bytes >>> connection:con-vpn-1:UUID-con-vpn-1-REPLACED-REPLACED-REP::vpn::yes:0:-1:0:-1:0:no:::::-1::0:unknown:default:-1:-1 -ipv4:auto::: :0::::-1:0:no:no::0:yes:::no:yes:-1 -ipv6:auto::: :0::::-1:0:no:no:no:yes:-1:stable-privacy::yes:: +ipv4:auto::: :0::::-1:0::no:no::0:yes:::no:yes:-1 +ipv6:auto::: :0::::-1:0::no:no:no:yes:-1:stable-privacy::yes:: vpn:org.freedesktop.NetworkManager.openvpn::key1 = val1, key2 = val2, key3 = val3:<hidden>:no:0 proxy:none:no:: @@ -28660,12 +28744,12 @@ eth0:chassis1:44\:44\:44\:44\:44\:44:GigabitEthernet #2:test2.example.com:Test s eth0:00\:11\:22\:33\:44\:22:port1:GigabitEthernet #3:test3.example.com:Test system #3:40 (wlan-access-point,telephone) <<< -size: 4621 +size: 4707 location: clients/tests/test-client.py:1036:test_004()/599 cmd: $NMCLI --mode multiline con s con-vpn-1 lang: C returncode: 0 -stdout: 4467 bytes +stdout: 4553 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -28700,6 +28784,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -28720,6 +28805,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -28762,12 +28848,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4651 +size: 4737 location: clients/tests/test-client.py:1036:test_004()/600 cmd: $NMCLI --mode multiline con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4487 bytes +stdout: 4573 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -28802,6 +28888,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -28822,6 +28909,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -28864,12 +28952,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4621 +size: 4707 location: clients/tests/test-client.py:1038:test_004()/601 cmd: $NMCLI --mode multiline con s con-vpn-1 lang: C returncode: 0 -stdout: 4467 bytes +stdout: 4553 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -28904,6 +28992,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -28924,6 +29013,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -28966,12 +29056,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4651 +size: 4737 location: clients/tests/test-client.py:1038:test_004()/602 cmd: $NMCLI --mode multiline con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4487 bytes +stdout: 4573 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -29006,6 +29096,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -29026,6 +29117,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -29068,12 +29160,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 3540 +size: 3626 location: clients/tests/test-client.py:1041:test_004()/603 cmd: $NMCLI --mode multiline -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3379 bytes +stdout: 3465 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -29108,6 +29200,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -29128,6 +29221,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -29150,12 +29244,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 3560 +size: 3646 location: clients/tests/test-client.py:1041:test_004()/604 cmd: $NMCLI --mode multiline -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3389 bytes +stdout: 3475 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -29190,6 +29284,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -29210,6 +29305,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -32112,12 +32208,12 @@ NEIGHBOR[2].SYSTEM-DESCRIPTION: Test system #3 NEIGHBOR[2].SYSTEM-CAPABILITIES: 40 (wlan-access-point,telephone) <<< -size: 4633 +size: 4719 location: clients/tests/test-client.py:1036:test_004()/647 cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 4467 bytes +stdout: 4553 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -32152,6 +32248,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -32172,6 +32269,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -32214,12 +32312,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4663 +size: 4749 location: clients/tests/test-client.py:1036:test_004()/648 cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4487 bytes +stdout: 4573 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -32254,6 +32352,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -32274,6 +32373,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -32316,12 +32416,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4633 +size: 4719 location: clients/tests/test-client.py:1038:test_004()/649 cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 4467 bytes +stdout: 4553 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -32356,6 +32456,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -32376,6 +32477,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -32418,12 +32520,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 4663 +size: 4749 location: clients/tests/test-client.py:1038:test_004()/650 cmd: $NMCLI --mode multiline --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4487 bytes +stdout: 4573 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -32458,6 +32560,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -32478,6 +32581,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -32520,12 +32624,12 @@ VPN.CFG[2]: key2 = val2 VPN.CFG[3]: key3 = val3 <<< -size: 3552 +size: 3638 location: clients/tests/test-client.py:1041:test_004()/651 cmd: $NMCLI --mode multiline --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3379 bytes +stdout: 3465 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -32560,6 +32664,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -32580,6 +32685,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -32602,12 +32708,12 @@ proxy.pac-url: -- proxy.pac-script: -- <<< -size: 3572 +size: 3658 location: clients/tests/test-client.py:1041:test_004()/652 cmd: $NMCLI --mode multiline --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 3389 bytes +stdout: 3475 bytes >>> connection.id: con-vpn-1 connection.uuid: UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -32642,6 +32748,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -32662,6 +32769,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -35564,12 +35672,12 @@ NEIGHBOR[2].SYSTEM-DESCRIPTION: Test system #3 NEIGHBOR[2].SYSTEM-CAPABILITIES: 40 (wlan-access-point,telephone) <<< -size: 5642 +size: 5728 location: clients/tests/test-client.py:1036:test_004()/695 cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 5479 bytes +stdout: 5565 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -35608,6 +35716,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -35629,6 +35738,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -35679,12 +35789,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5684 +size: 5770 location: clients/tests/test-client.py:1036:test_004()/696 cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5597 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -35723,6 +35833,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -35744,6 +35855,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -35794,12 +35906,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5642 +size: 5728 location: clients/tests/test-client.py:1038:test_004()/697 cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 lang: C returncode: 0 -stdout: 5479 bytes +stdout: 5565 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -35838,6 +35950,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -35859,6 +35972,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -35909,12 +36023,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5684 +size: 5770 location: clients/tests/test-client.py:1038:test_004()/698 cmd: $NMCLI --mode multiline --pretty con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5597 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -35953,6 +36067,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -35974,6 +36089,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -36024,12 +36140,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 4168 +size: 4254 location: clients/tests/test-client.py:1041:test_004()/699 cmd: $NMCLI --mode multiline --pretty -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3998 bytes +stdout: 4084 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -36068,6 +36184,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -36089,6 +36206,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -36114,12 +36232,12 @@ proxy.pac-script: -- ------------------------------------------------------------------------------- <<< -size: 4193 +size: 4279 location: clients/tests/test-client.py:1041:test_004()/700 cmd: $NMCLI --mode multiline --pretty -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4013 bytes +stdout: 4099 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -36158,6 +36276,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -36179,6 +36298,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -39660,12 +39780,12 @@ NEIGHBOR[2].SYSTEM-CAPABILITIES: 40 (wlan-access-point,telephone) ------------------------------------------------------------------------------- <<< -size: 5654 +size: 5740 location: clients/tests/test-client.py:1036:test_004()/743 cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 5479 bytes +stdout: 5565 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -39704,6 +39824,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -39725,6 +39846,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -39775,12 +39897,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5696 +size: 5782 location: clients/tests/test-client.py:1036:test_004()/744 cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5597 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -39819,6 +39941,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -39840,6 +39963,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -39890,12 +40014,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5654 +size: 5740 location: clients/tests/test-client.py:1038:test_004()/745 cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 5479 bytes +stdout: 5565 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -39934,6 +40058,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -39955,6 +40080,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -40005,12 +40131,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 5696 +size: 5782 location: clients/tests/test-client.py:1038:test_004()/746 cmd: $NMCLI --mode multiline --pretty --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 5511 bytes +stdout: 5597 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -40049,6 +40175,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -40070,6 +40197,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -40120,12 +40248,12 @@ VPN.CFG[3]: key3 = val3 ------------------------------------------------------------------------------- <<< -size: 4180 +size: 4266 location: clients/tests/test-client.py:1041:test_004()/747 cmd: $NMCLI --mode multiline --pretty --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 3998 bytes +stdout: 4084 bytes >>> =============================================================================== Connection profile details (con-vpn-1) @@ -40164,6 +40292,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- @@ -40185,6 +40314,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no @@ -40210,12 +40340,12 @@ proxy.pac-script: -- ------------------------------------------------------------------------------- <<< -size: 4205 +size: 4291 location: clients/tests/test-client.py:1041:test_004()/748 cmd: $NMCLI --mode multiline --pretty --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 4013 bytes +stdout: 4099 bytes >>> =============================================================================== Szczegóły profilu połączenia (con-vpn-1) @@ -40254,6 +40384,7 @@ ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) +ipv4.routing-rules: -- ipv4.ignore-auto-routes: nie ipv4.ignore-auto-dns: nie ipv4.dhcp-client-id: -- @@ -40275,6 +40406,7 @@ ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) +ipv6.routing-rules: -- ipv6.ignore-auto-routes: nie ipv6.ignore-auto-dns: nie ipv6.never-default: nie @@ -43756,12 +43888,12 @@ NEIGHBOR[2].SYSTEM-CAPABILITIES: 40 (wlan-access-point,telephone) ------------------------------------------------------------------------------- <<< -size: 2340 +size: 2380 location: clients/tests/test-client.py:1036:test_004()/791 cmd: $NMCLI --mode multiline --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -43796,6 +43928,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -43816,6 +43949,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -43858,12 +43992,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2350 +size: 2390 location: clients/tests/test-client.py:1036:test_004()/792 cmd: $NMCLI --mode multiline --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -43898,6 +44032,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -43918,6 +44053,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -43960,12 +44096,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2340 +size: 2380 location: clients/tests/test-client.py:1038:test_004()/793 cmd: $NMCLI --mode multiline --terse con s con-vpn-1 lang: C returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -44000,6 +44136,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -44020,6 +44157,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -44062,12 +44200,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2350 +size: 2390 location: clients/tests/test-client.py:1038:test_004()/794 cmd: $NMCLI --mode multiline --terse con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -44102,6 +44240,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -44122,6 +44261,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -44164,12 +44304,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 1788 +size: 1828 location: clients/tests/test-client.py:1041:test_004()/795 cmd: $NMCLI --mode multiline --terse -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 1619 bytes +stdout: 1659 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -44204,6 +44344,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -44224,6 +44365,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -44246,12 +44388,12 @@ proxy.pac-url: proxy.pac-script: <<< -size: 1798 +size: 1838 location: clients/tests/test-client.py:1041:test_004()/796 cmd: $NMCLI --mode multiline --terse -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 1619 bytes +stdout: 1659 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -44286,6 +44428,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -44306,6 +44449,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -47208,12 +47352,12 @@ NEIGHBOR[2].SYSTEM-DESCRIPTION:Test system #3 NEIGHBOR[2].SYSTEM-CAPABILITIES:40 (wlan-access-point,telephone) <<< -size: 2352 +size: 2392 location: clients/tests/test-client.py:1036:test_004()/839 cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -47248,6 +47392,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -47268,6 +47413,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -47310,12 +47456,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2362 +size: 2402 location: clients/tests/test-client.py:1036:test_004()/840 cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -47350,6 +47496,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -47370,6 +47517,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -47412,12 +47560,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2352 +size: 2392 location: clients/tests/test-client.py:1038:test_004()/841 cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 lang: C returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -47452,6 +47600,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -47472,6 +47621,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -47514,12 +47664,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 2362 +size: 2402 location: clients/tests/test-client.py:1038:test_004()/842 cmd: $NMCLI --mode multiline --terse --color yes con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 2178 bytes +stdout: 2218 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -47554,6 +47704,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -47574,6 +47725,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -47616,12 +47768,12 @@ VPN.CFG[2]:key2 = val2 VPN.CFG[3]:key3 = val3 <<< -size: 1800 +size: 1840 location: clients/tests/test-client.py:1041:test_004()/843 cmd: $NMCLI --mode multiline --terse --color yes -f ALL con s con-vpn-1 lang: C returncode: 0 -stdout: 1619 bytes +stdout: 1659 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -47656,6 +47808,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -47676,6 +47829,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no @@ -47698,12 +47852,12 @@ proxy.pac-url: proxy.pac-script: <<< -size: 1810 +size: 1850 location: clients/tests/test-client.py:1041:test_004()/844 cmd: $NMCLI --mode multiline --terse --color yes -f ALL con s con-vpn-1 lang: pl_PL.UTF-8 returncode: 0 -stdout: 1619 bytes +stdout: 1659 bytes >>> connection.id:con-vpn-1 connection.uuid:UUID-con-vpn-1-REPLACED-REPLACED-REP @@ -47738,6 +47892,7 @@ ipv4.gateway: ipv4.routes: ipv4.route-metric:-1 ipv4.route-table:0 +ipv4.routing-rules: ipv4.ignore-auto-routes:no ipv4.ignore-auto-dns:no ipv4.dhcp-client-id: @@ -47758,6 +47913,7 @@ ipv6.gateway: ipv6.routes: ipv6.route-metric:-1 ipv6.route-table:0 +ipv6.routing-rules: ipv6.ignore-auto-routes:no ipv6.ignore-auto-dns:no ipv6.never-default:no diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h index 60774c49b3..95ec86a059 100644 --- a/libnm-core/nm-core-internal.h +++ b/libnm-core/nm-core-internal.h @@ -250,6 +250,8 @@ guint nm_setting_ethtool_init_features (NMSettingEthtool *setting, guint8 *_nm_utils_hwaddr_aton (const char *asc, gpointer buffer, gsize buffer_length, gsize *out_length); const char *nm_utils_hwaddr_ntoa_buf (gconstpointer addr, gsize addr_len, gboolean upper_case, char *buf, gsize buf_len); +gboolean nm_utils_is_valid_iface_name_utf8safe (const char *utf8safe_name); + GSList * _nm_utils_hash_values_to_slist (GHashTable *hash); GHashTable *_nm_utils_copy_strdict (GHashTable *strdict); @@ -611,6 +613,47 @@ void _nm_wireguard_peer_set_public_key_bin (NMWireGuardPeer *self, /*****************************************************************************/ +const NMIPAddr *nm_ip_routing_rule_get_from_bin (const NMIPRoutingRule *self); +void nm_ip_routing_rule_set_from_bin (NMIPRoutingRule *self, + gconstpointer from, + guint8 len); + +const NMIPAddr *nm_ip_routing_rule_get_to_bin (const NMIPRoutingRule *self); +void nm_ip_routing_rule_set_to_bin (NMIPRoutingRule *self, + gconstpointer to, + guint8 len); + +gboolean nm_ip_routing_rule_get_xifname_bin (const NMIPRoutingRule *self, + gboolean iif /* or else oif */, + char out_xifname[static 16]); + +#define NM_IP_ROUTING_RULE_ATTR_ACTION "action" +#define NM_IP_ROUTING_RULE_ATTR_DPORT_END "dport-end" +#define NM_IP_ROUTING_RULE_ATTR_DPORT_START "dport-start" +#define NM_IP_ROUTING_RULE_ATTR_FAMILY "family" +#define NM_IP_ROUTING_RULE_ATTR_FROM "from" +#define NM_IP_ROUTING_RULE_ATTR_FROM_LEN "from-len" +#define NM_IP_ROUTING_RULE_ATTR_FWMARK "fwmark" +#define NM_IP_ROUTING_RULE_ATTR_FWMASK "fwmask" +#define NM_IP_ROUTING_RULE_ATTR_IIFNAME "iifname" +#define NM_IP_ROUTING_RULE_ATTR_INVERT "invert" +#define NM_IP_ROUTING_RULE_ATTR_IPPROTO "ipproto" +#define NM_IP_ROUTING_RULE_ATTR_OIFNAME "oifname" +#define NM_IP_ROUTING_RULE_ATTR_PRIORITY "priority" +#define NM_IP_ROUTING_RULE_ATTR_SPORT_END "sport-end" +#define NM_IP_ROUTING_RULE_ATTR_SPORT_START "sport-start" +#define NM_IP_ROUTING_RULE_ATTR_TABLE "table" +#define NM_IP_ROUTING_RULE_ATTR_TO "to" +#define NM_IP_ROUTING_RULE_ATTR_TOS "tos" +#define NM_IP_ROUTING_RULE_ATTR_TO_LEN "to-len" + +NMIPRoutingRule *nm_ip_routing_rule_from_dbus (GVariant *variant, + gboolean strict, + GError **error); +GVariant *nm_ip_routing_rule_to_dbus (const NMIPRoutingRule *self); + +/*****************************************************************************/ + typedef struct _NMSettInfoSetting NMSettInfoSetting; typedef struct _NMSettInfoProperty NMSettInfoProperty; diff --git a/libnm-core/nm-keyfile.c b/libnm-core/nm-keyfile.c index 0d833752ef..a541bd556c 100644 --- a/libnm-core/nm-keyfile.c +++ b/libnm-core/nm-keyfile.c @@ -41,6 +41,8 @@ /*****************************************************************************/ +typedef struct _ParseInfoProperty ParseInfoProperty; + typedef struct { NMConnection *connection; GKeyFile *keyfile; @@ -534,13 +536,19 @@ typedef struct { const char *s_key; gint32 key_idx; gint8 key_type; -} IPAddrRouteBuildListData; +} BuildListData; + +typedef enum { + BUILD_LIST_TYPE_ADDRESSES, + BUILD_LIST_TYPE_ROUTES, + BUILD_LIST_TYPE_ROUTING_RULES, +} BuildListType; static int -_ip_addrroute_build_lst_data_cmp (gconstpointer p_a, gconstpointer p_b, gpointer user_data) +_build_list_data_cmp (gconstpointer p_a, gconstpointer p_b, gpointer user_data) { - const IPAddrRouteBuildListData *a = p_a; - const IPAddrRouteBuildListData *b = p_b; + const BuildListData *a = p_a; + const BuildListData *b = p_b; NM_CMP_FIELD (a, b, key_idx); NM_CMP_FIELD (a, b, key_type); @@ -549,10 +557,25 @@ _ip_addrroute_build_lst_data_cmp (gconstpointer p_a, gconstpointer p_b, gpointer } static gboolean -ip_addrroute_match_key_w_name_ (const char *key, - const char *base_name, - gsize base_name_l, - gint32 *out_key_idx) +_build_list_data_is_shadowed (const BuildListData *build_list, + gsize build_list_len, + gsize idx) +{ + /* the keyfile contains duplicate keys, which are both returned + * by g_key_file_get_keys() (WHY??). + * + * Skip the earlier one. */ + return idx + 1 < build_list_len + && build_list[idx].key_idx == build_list[idx + 1].key_idx + && build_list[idx].key_type == build_list[idx + 1].key_type + && nm_streq (build_list[idx].s_key, build_list[idx + 1].s_key); +} + +static gboolean +_build_list_match_key_w_name_impl (const char *key, + const char *base_name, + gsize base_name_l, + gint32 *out_key_idx) { gint64 v; @@ -595,100 +618,125 @@ ip_addrroute_match_key_w_name_ (const char *key, return TRUE; } -static gboolean -ip_addrroute_match_key (const char *key, - gboolean is_routes, - gint32 *out_key_idx, - gint8 *out_key_type) -{ -#define ip_addrroute_match_key_w_name(key, base_name, out_key_idx) \ - ip_addrroute_match_key_w_name_ (key, base_name, NM_STRLEN (base_name), out_key_idx) - - if (is_routes) { - if (ip_addrroute_match_key_w_name (key, "route", out_key_idx)) - NM_SET_OUT (out_key_type, 0); - else if (ip_addrroute_match_key_w_name (key, "routes", out_key_idx)) - NM_SET_OUT (out_key_type, 1); - else - return FALSE; - } else { - if (ip_addrroute_match_key_w_name (key, "address", out_key_idx)) - NM_SET_OUT (out_key_type, 0); - else if (ip_addrroute_match_key_w_name (key, "addresses", out_key_idx)) - NM_SET_OUT (out_key_type, 1); - else - return FALSE; - } - return TRUE; -} +#define _build_list_match_key_w_name(key, base_name, out_key_idx) \ + _build_list_match_key_w_name_impl (key, base_name, NM_STRLEN (base_name), out_key_idx) -static void -ip_address_or_route_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *setting_key) +static BuildListData * +_build_list_create (GKeyFile *keyfile, + const char *group_name, + BuildListType build_list_type, + gsize *out_build_list_len, + char ***out_keys_strv) { - const char *setting_name = nm_setting_get_name (setting); - gboolean is_ipv6 = nm_streq (setting_name, "ipv6"); - gboolean is_routes = nm_streq (setting_key, "routes"); - gs_free char *gateway = NULL; - gs_unref_ptrarray GPtrArray *list = NULL; gs_strfreev char **keys = NULL; gsize i_keys, n_keys; - gs_free IPAddrRouteBuildListData *build_list = NULL; - gsize i_build_list, build_list_len = 0; + gs_free BuildListData *build_list = NULL; + gsize build_list_len = 0; - keys = nm_keyfile_plugin_kf_get_keys (info->keyfile, setting_name, &n_keys, NULL); + nm_assert (out_build_list_len && *out_build_list_len == 0); + nm_assert (out_keys_strv && !*out_keys_strv); + + keys = nm_keyfile_plugin_kf_get_keys (keyfile, group_name, &n_keys, NULL); if (n_keys == 0) - return; + return NULL; - /* first create a list of all relevant keys, and sort them. */ for (i_keys = 0; i_keys < n_keys; i_keys++) { const char *s_key = keys[i_keys]; gint32 key_idx; gint8 key_type; - if (!ip_addrroute_match_key (s_key, is_routes, &key_idx, &key_type)) - continue; + switch (build_list_type) { + case BUILD_LIST_TYPE_ROUTES: + if (_build_list_match_key_w_name (s_key, "route", &key_idx)) + key_type = 0; + else if (_build_list_match_key_w_name (s_key, "routes", &key_idx)) + key_type = 1; + else + continue; + break; + case BUILD_LIST_TYPE_ADDRESSES: + if (_build_list_match_key_w_name (s_key, "address", &key_idx)) + key_type = 0; + else if (_build_list_match_key_w_name (s_key, "addresses", &key_idx)) + key_type = 1; + else + continue; + break; + case BUILD_LIST_TYPE_ROUTING_RULES: + if (_build_list_match_key_w_name (s_key, "routing-rule", &key_idx)) + key_type = 0; + else + continue; + break; + default: + nm_assert_not_reached (); + break; + } if (G_UNLIKELY (!build_list)) - build_list = g_new (IPAddrRouteBuildListData, n_keys - i_keys); + build_list = g_new (BuildListData, n_keys - i_keys); - build_list[build_list_len].s_key = s_key; - build_list[build_list_len].key_idx = key_idx; - build_list[build_list_len].key_type = key_type; - build_list_len++; + build_list[build_list_len++] = (BuildListData) { + .s_key = s_key, + .key_idx = key_idx, + .key_type = key_type, + }; } if (build_list_len == 0) - return; + return NULL; - g_qsort_with_data (build_list, - build_list_len, - sizeof (IPAddrRouteBuildListData), - _ip_addrroute_build_lst_data_cmp, - NULL); + if (build_list_len > 1) { + g_qsort_with_data (build_list, + build_list_len, + sizeof (BuildListData), + _build_list_data_cmp, + NULL); + } + + *out_build_list_len = build_list_len; + *out_keys_strv = g_steal_pointer (&keys); + return g_steal_pointer (&build_list); +} + +static void +ip_address_or_route_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *setting_key) +{ + const char *setting_name = nm_setting_get_name (setting); + gboolean is_ipv6 = nm_streq (setting_name, "ipv6"); + gboolean is_routes = nm_streq (setting_key, "routes"); + gs_free char *gateway = NULL; + gs_unref_ptrarray GPtrArray *list = NULL; + gs_strfreev char **keys = NULL; + gs_free BuildListData *build_list = NULL; + gsize i_build_list, build_list_len = 0; + + build_list = _build_list_create (info->keyfile, + setting_name, + is_routes + ? BUILD_LIST_TYPE_ROUTES + : BUILD_LIST_TYPE_ADDRESSES, + &build_list_len, + &keys); + if (!build_list) + return; list = g_ptr_array_new_with_free_func (is_routes ? (GDestroyNotify) nm_ip_route_unref : (GDestroyNotify) nm_ip_address_unref); for (i_build_list = 0; i_build_list < build_list_len; i_build_list++) { - const IPAddrRouteBuildListData *build_data = &build_list[i_build_list]; + const char *s_key; gpointer item; - if ( i_build_list + 1 < build_list_len - && build_data->key_idx == build_data[1].key_idx - && build_data->key_type == build_data[1].key_type - && nm_streq (build_data->s_key, build_data[1].s_key)) { - /* the keyfile contains duplicate keys, which are both returned - * by g_key_file_get_keys() (WHY??). - * - * Skip the earlier one. */ + if (_build_list_data_is_shadowed (build_list, build_list_len, i_build_list)) continue; - } + s_key = build_list[i_build_list].s_key; item = read_one_ip_address_or_route (info, setting_key, setting_name, - build_data->s_key, + s_key, is_ipv6, is_routes, gateway ? NULL : &gateway, @@ -696,7 +744,7 @@ ip_address_or_route_parser (KeyfileReaderInfo *info, NMSetting *setting, const c if (item && is_routes) { char options_key[128]; - nm_sprintf_buf (options_key, "%s_options", build_data->s_key); + nm_sprintf_buf (options_key, "%s_options", s_key); fill_route_attributes (info->keyfile, item, setting_name, @@ -719,6 +767,63 @@ ip_address_or_route_parser (KeyfileReaderInfo *info, NMSetting *setting, const c } static void +ip_routing_rule_parser_full (KeyfileReaderInfo *info, + const NMMetaSettingInfo *setting_info, + const NMSettInfoProperty *property_info, + const ParseInfoProperty *pip, + NMSetting *setting) +{ + const char *setting_name = nm_setting_get_name (setting); + gboolean is_ipv6 = nm_streq (setting_name, "ipv6"); + gs_strfreev char **keys = NULL; + gs_free BuildListData *build_list = NULL; + gsize i_build_list, build_list_len = 0; + + build_list = _build_list_create (info->keyfile, + setting_name, + BUILD_LIST_TYPE_ROUTING_RULES, + &build_list_len, + &keys); + if (!build_list) + return; + + for (i_build_list = 0; i_build_list < build_list_len; i_build_list++) { + nm_auto_unref_ip_routing_rule NMIPRoutingRule *rule = NULL; + gs_free char *value = NULL; + gs_free_error GError *local = NULL; + + if (_build_list_data_is_shadowed (build_list, build_list_len, i_build_list)) + continue; + + value = nm_keyfile_plugin_kf_get_string (info->keyfile, + setting_name, + build_list[i_build_list].s_key, + NULL); + if (!value) + continue; + + rule = nm_ip_routing_rule_from_string (value, + ( NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE + | ( is_ipv6 + ? NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6 + : NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET)), + NULL, + &local); + if (!rule) { + handle_warn (info, property_info->name, NM_KEYFILE_WARN_SEVERITY_WARN, + _("invalid value for \"%s\": %s"), + build_list[i_build_list].s_key, + local->message); + if (info->error) + return; + continue; + } + + nm_setting_ip_config_add_routing_rule (NM_SETTING_IP_CONFIG (setting), rule); + } +} + +static void ip_dns_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key) { int addr_family; @@ -1922,6 +2027,40 @@ bridge_vlan_writer (KeyfileWriterInfo *info, } static void +ip_routing_rule_writer_full (KeyfileWriterInfo *info, + const NMMetaSettingInfo *setting_info, + const NMSettInfoProperty *property_info, + const ParseInfoProperty *pip, + NMSetting *setting) +{ + const char *setting_name = nm_setting_get_name (setting); + NMSettingIPConfig *s_ip = NM_SETTING_IP_CONFIG (setting); + guint i, j, n; + char key_name_full[100] = "routing-rule"; + char *key_name_num = &key_name_full[NM_STRLEN ("routing-rule")]; + + n = nm_setting_ip_config_get_num_routing_rules (s_ip); + j = 0; + for (i = 0; i < n; i++) { + NMIPRoutingRule *rule = nm_setting_ip_config_get_routing_rule (s_ip, i); + gs_free char *str = NULL; + + str = nm_ip_routing_rule_to_string (rule, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE, + NULL, + NULL); + if (!str) + continue; + + sprintf (key_name_num, "%u", ++j); + nm_keyfile_plugin_kf_set_string (info->keyfile, + setting_name, + key_name_full, + str); + } +} + +static void qdisc_writer (KeyfileWriterInfo *info, NMSetting *setting, const char *key, @@ -2232,24 +2371,40 @@ cert_writer (KeyfileWriterInfo *info, /*****************************************************************************/ -typedef struct { +struct _ParseInfoProperty { const char *property_name; - void (*parser) (KeyfileReaderInfo *info, - NMSetting *setting, - const char *key); - void (*writer) (KeyfileWriterInfo *info, - NMSetting *setting, - const char *key, - const GValue *value); + union { + void (*parser) (KeyfileReaderInfo *info, + NMSetting *setting, + const char *key); + void (*parser_full) (KeyfileReaderInfo *info, + const NMMetaSettingInfo *setting_info, + const NMSettInfoProperty *property_info, + const ParseInfoProperty *pip, + NMSetting *setting); + }; + union { + void (*writer) (KeyfileWriterInfo *info, + NMSetting *setting, + const char *key, + const GValue *value); + void (*writer_full) (KeyfileWriterInfo *info, + const NMMetaSettingInfo *setting_info, + const NMSettInfoProperty *property_info, + const ParseInfoProperty *pip, + NMSetting *setting); + }; bool parser_skip; bool parser_no_check_key:1; bool writer_skip:1; + bool has_writer_full:1; + bool has_parser_full:1; /* usually, we skip to write values that have their * default value. By setting this flag to TRUE, also * default values are written. */ bool writer_persist_default:1; -} ParseInfoProperty; +}; #define PARSE_INFO_PROPERTY(_property_name, ...) \ (&((const ParseInfoProperty) { \ @@ -2406,6 +2561,13 @@ static const ParseInfoSetting *const parse_infos[_NM_META_SETTING_TYPE_NUM] = { .parser = ip_address_or_route_parser, .writer = route_writer, ), + PARSE_INFO_PROPERTY (NM_SETTING_IP_CONFIG_ROUTING_RULES, + .parser_no_check_key = TRUE, + .parser_full = ip_routing_rule_parser_full, + .writer_full = ip_routing_rule_writer_full, + .has_parser_full = TRUE, + .has_writer_full = TRUE, + ), ), ), PARSE_INFO_SETTING (NM_META_SETTING_TYPE_IP6_CONFIG, @@ -2434,6 +2596,13 @@ static const ParseInfoSetting *const parse_infos[_NM_META_SETTING_TYPE_NUM] = { .parser = ip_address_or_route_parser, .writer = route_writer, ), + PARSE_INFO_PROPERTY (NM_SETTING_IP_CONFIG_ROUTING_RULES, + .parser_no_check_key = TRUE, + .parser_full = ip_routing_rule_parser_full, + .writer_full = ip_routing_rule_writer_full, + .has_parser_full = TRUE, + .has_writer_full = TRUE, + ), ), ), PARSE_INFO_SETTING (NM_META_SETTING_TYPE_SERIAL, @@ -2612,7 +2781,7 @@ static const ParseInfoSetting *const parse_infos[_NM_META_SETTING_TYPE_NUM] = { static const ParseInfoProperty * _parse_info_find (NMSetting *setting, const char *property_name, - const char **out_setting_name) + const NMMetaSettingInfo **out_setting_info) { const NMMetaSettingInfo *setting_info; const ParseInfoSetting *pis; @@ -2651,11 +2820,13 @@ _parse_info_find (NMSetting *setting, if ( !NM_IS_SETTING (setting) || !(setting_info = NM_SETTING_GET_CLASS (setting)->setting_info)) { /* handle invalid setting objects gracefully. */ - *out_setting_name = NULL; + *out_setting_info = NULL; return NULL; } - *out_setting_name = setting_info->setting_name; + nm_assert (setting_info->setting_name); + + *out_setting_info = setting_info; if ((pis = parse_infos[setting_info->meta_type])) { G_STATIC_ASSERT_EXPR (G_STRUCT_OFFSET (ParseInfoProperty, property_name) == 0); @@ -2682,32 +2853,42 @@ read_one_setting_value (KeyfileReaderInfo *info, { GKeyFile *keyfile = info->keyfile; gs_free_error GError *err = NULL; + const NMMetaSettingInfo *setting_info; const ParseInfoProperty *pip; gs_free char *tmp_str = NULL; - const char *setting_name; const char *key; GType type; guint64 u64; gint64 i64; nm_assert (!info->error); - nm_assert (property_info->param_spec); + nm_assert ( !property_info->param_spec + || nm_streq (property_info->param_spec->name, property_info->name)); - if ((property_info->param_spec->flags & (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)) != G_PARAM_WRITABLE) - return; + key = property_info->name; - key = property_info->param_spec->name; + pip = _parse_info_find (setting, key, &setting_info); - pip = _parse_info_find (setting, key, &setting_name); + nm_assert (setting_info); - nm_assert (setting_name); - - if ( !pip - && nm_streq (key, NM_SETTING_NAME)) - return; + if (!pip) { + if (nm_streq (key, NM_SETTING_NAME)) + return; + if (!property_info->param_spec) + return; + if ((property_info->param_spec->flags & (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)) != G_PARAM_WRITABLE) + return; + } else { + if (pip->parser_skip) + return; + if (pip->has_parser_full) { + pip->parser_full (info, setting_info, property_info, pip, setting); + return; + } + } - if (pip && pip->parser_skip) - return; + nm_assert (property_info->param_spec); + nm_assert ((property_info->param_spec->flags & (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)) == G_PARAM_WRITABLE); /* Check for the exact key in the GKeyFile if required. Most setting * properties map 1:1 to a key in the GKeyFile, but for those properties @@ -2715,7 +2896,7 @@ read_one_setting_value (KeyfileReaderInfo *info, * encoded by the setting property, this won't be true. */ if ( (!pip || !pip->parser_no_check_key) - && !nm_keyfile_plugin_kf_has_key (keyfile, setting_name, key, &err)) { + && !nm_keyfile_plugin_kf_has_key (keyfile, setting_info->setting_name, key, &err)) { /* Key doesn't exist or an error occurred, thus nothing to do. */ if (err) { if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN, @@ -2726,7 +2907,8 @@ read_one_setting_value (KeyfileReaderInfo *info, return; } - if (pip && pip->parser) { + if ( pip + && pip->parser) { pip->parser (info, setting, key); return; } @@ -2736,11 +2918,11 @@ read_one_setting_value (KeyfileReaderInfo *info, if (type == G_TYPE_STRING) { gs_free char *str_val = NULL; - str_val = nm_keyfile_plugin_kf_get_string (keyfile, setting_name, key, &err); + str_val = nm_keyfile_plugin_kf_get_string (keyfile, setting_info->setting_name, key, &err); if (!err) nm_g_object_set_property_string_take (G_OBJECT (setting), key, g_steal_pointer (&str_val), &err); } else if (type == G_TYPE_UINT) { - tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_name, key, &err); + tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_info->setting_name, key, &err); if (!err) { u64 = _nm_utils_ascii_str_to_uint64 (tmp_str, 0, 0, G_MAXUINT, G_MAXUINT64); if ( u64 == G_MAXUINT64 @@ -2751,7 +2933,7 @@ read_one_setting_value (KeyfileReaderInfo *info, nm_g_object_set_property_uint (G_OBJECT (setting), key, u64, &err); } } else if (type == G_TYPE_INT) { - tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_name, key, &err); + tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_info->setting_name, key, &err); if (!err) { i64 = _nm_utils_ascii_str_to_int64 (tmp_str, 0, G_MININT, G_MAXINT, G_MININT64); if ( i64 == G_MININT64 @@ -2764,11 +2946,11 @@ read_one_setting_value (KeyfileReaderInfo *info, } else if (type == G_TYPE_BOOLEAN) { gboolean bool_val; - bool_val = nm_keyfile_plugin_kf_get_boolean (keyfile, setting_name, key, &err); + bool_val = nm_keyfile_plugin_kf_get_boolean (keyfile, setting_info->setting_name, key, &err); if (!err) nm_g_object_set_property_boolean (G_OBJECT (setting), key, bool_val, &err); } else if (type == G_TYPE_CHAR) { - tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_name, key, &err); + tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_info->setting_name, key, &err); if (!err) { /* As documented by glib, G_TYPE_CHAR is really a (signed!) gint8. */ i64 = _nm_utils_ascii_str_to_int64 (tmp_str, 0, G_MININT8, G_MAXINT8, G_MININT64); @@ -2780,7 +2962,7 @@ read_one_setting_value (KeyfileReaderInfo *info, nm_g_object_set_property_char (G_OBJECT (setting), key, i64, &err); } } else if (type == G_TYPE_UINT64) { - tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_name, key, &err); + tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_info->setting_name, key, &err); if (!err) { u64 = _nm_utils_ascii_str_to_uint64 (tmp_str, 0, 0, G_MAXUINT64, G_MAXUINT64); if ( u64 == G_MAXUINT64 @@ -2791,7 +2973,7 @@ read_one_setting_value (KeyfileReaderInfo *info, nm_g_object_set_property_uint64 (G_OBJECT (setting), key, u64, &err); } } else if (type == G_TYPE_INT64) { - tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_name, key, &err); + tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_info->setting_name, key, &err); if (!err) { i64 = _nm_utils_ascii_str_to_int64 (tmp_str, 0, G_MININT64, G_MAXINT64, G_MAXINT64); if ( i64 == G_MAXINT64 @@ -2809,7 +2991,7 @@ read_one_setting_value (KeyfileReaderInfo *info, int i; gboolean already_warned = FALSE; - tmp = nm_keyfile_plugin_kf_get_integer_list (keyfile, setting_name, key, &length, NULL); + tmp = nm_keyfile_plugin_kf_get_integer_list (keyfile, setting_info->setting_name, key, &length, NULL); array = g_byte_array_sized_new (length); for (i = 0; i < length; i++) { @@ -2836,14 +3018,14 @@ read_one_setting_value (KeyfileReaderInfo *info, gs_strfreev char **sa = NULL; gsize length; - sa = nm_keyfile_plugin_kf_get_string_list (keyfile, setting_name, key, &length, NULL); + sa = nm_keyfile_plugin_kf_get_string_list (keyfile, setting_info->setting_name, key, &length, NULL); g_object_set (setting, key, sa, NULL); } else if (type == G_TYPE_HASH_TABLE) { read_hash_of_string (keyfile, setting, key); } else if (type == G_TYPE_ARRAY) { read_array_of_uint (keyfile, setting, key); } else if (G_TYPE_IS_FLAGS (type)) { - tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_name, key, &err); + tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_info->setting_name, key, &err); if (!err) { u64 = _nm_utils_ascii_str_to_uint64 (tmp_str, 0, 0, G_MAXUINT, G_MAXUINT64); if ( u64 == G_MAXUINT64 @@ -2854,7 +3036,7 @@ read_one_setting_value (KeyfileReaderInfo *info, nm_g_object_set_property_flags (G_OBJECT (setting), key, type, u64, &err); } } else if (G_TYPE_IS_ENUM (type)) { - tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_name, key, &err); + tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_info->setting_name, key, &err); if (!err) { i64 = _nm_utils_ascii_str_to_int64 (tmp_str, 0, G_MININT, G_MAXINT, G_MAXINT64); if ( i64 == G_MAXINT64 @@ -2976,13 +3158,11 @@ _read_setting (KeyfileReaderInfo *info) } for (i = 0; i < sett_info->property_infos_len; i++) { - const NMSettInfoProperty *property_info = &sett_info->property_infos[i]; - - if (property_info->param_spec) { - read_one_setting_value (info, setting, property_info); - if (info->error) - goto out; - } + read_one_setting_value (info, + setting, + &sett_info->property_infos[i]); + if (info->error) + goto out; } out: @@ -3291,40 +3471,47 @@ write_setting_value (KeyfileWriterInfo *info, NMSetting *setting, const NMSettInfoProperty *property_info) { + const NMMetaSettingInfo *setting_info; const ParseInfoProperty *pip; - const char *setting_name; const char *key; char numstr[64]; GValue value; GType type; nm_assert (!info->error); + nm_assert ( !property_info->param_spec + || nm_streq (property_info->param_spec->name, property_info->name)); - if (!property_info->param_spec) - return; - - key = property_info->param_spec->name; + key = property_info->name; - pip = _parse_info_find (setting, key, &setting_name); + pip = _parse_info_find (setting, key, &setting_info); - if (!setting_name) { - /* the setting type is unknown. That is highly unexpected - * (and as this is currently only called from NetworkManager - * daemon, not possible). - * - * Still, handle it gracefully, because later keyfile writer will become - * public API of libnm, where @setting is (untrusted) user input. - * - * Gracefully here just means: ignore the setting. */ - return; + if (!pip) { + if (!setting_info) { + /* the setting type is unknown. That is highly unexpected + * (and as this is currently only called from NetworkManager + * daemon, not possible). + * + * Still, handle it gracefully, because later keyfile writer will become + * public API of libnm, where @setting is (untrusted) user input. + * + * Gracefully here just means: ignore the setting. */ + return; + } + if (!property_info->param_spec) + return; + if (nm_streq (key, NM_SETTING_NAME)) + return; + } else { + if (pip->has_writer_full) { + pip->writer_full (info, setting_info, property_info, pip, setting); + return; + } + if (pip->writer_skip) + return; } - if ( !pip - && nm_streq (key, NM_SETTING_NAME)) - return; - - if (pip && pip->writer_skip) - return; + nm_assert (property_info->param_spec); /* Don't write secrets that are owned by user secret agents or aren't * supposed to be saved. VPN secrets are handled specially though since @@ -3348,11 +3535,12 @@ write_setting_value (KeyfileWriterInfo *info, if ( (!pip || !pip->writer_persist_default) && g_param_value_defaults (property_info->param_spec, &value)) { - nm_assert (!g_key_file_has_key (info->keyfile, setting_name, key, NULL)); + nm_assert (!g_key_file_has_key (info->keyfile, setting_info->setting_name, key, NULL)); goto out_unset_value; } - if (pip && pip->writer) { + if ( pip + && pip->writer) { pip->writer (info, setting, key, &value); goto out_unset_value; } @@ -3363,27 +3551,27 @@ write_setting_value (KeyfileWriterInfo *info, str = g_value_get_string (&value); if (str) - nm_keyfile_plugin_kf_set_string (info->keyfile, setting_name, key, str); + nm_keyfile_plugin_kf_set_string (info->keyfile, setting_info->setting_name, key, str); } else if (type == G_TYPE_UINT) { nm_sprintf_buf (numstr, "%u", g_value_get_uint (&value)); - nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, numstr); + nm_keyfile_plugin_kf_set_value (info->keyfile, setting_info->setting_name, key, numstr); } else if (type == G_TYPE_INT) { nm_sprintf_buf (numstr, "%d", g_value_get_int (&value)); - nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, numstr); + nm_keyfile_plugin_kf_set_value (info->keyfile, setting_info->setting_name, key, numstr); } else if (type == G_TYPE_UINT64) { nm_sprintf_buf (numstr, "%" G_GUINT64_FORMAT, g_value_get_uint64 (&value)); - nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, numstr); + nm_keyfile_plugin_kf_set_value (info->keyfile, setting_info->setting_name, key, numstr); } else if (type == G_TYPE_INT64) { nm_sprintf_buf (numstr, "%" G_GINT64_FORMAT, g_value_get_int64 (&value)); - nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, numstr); + nm_keyfile_plugin_kf_set_value (info->keyfile, setting_info->setting_name, key, numstr); } else if (type == G_TYPE_BOOLEAN) { - nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, + nm_keyfile_plugin_kf_set_value (info->keyfile, setting_info->setting_name, key, g_value_get_boolean (&value) ? "true" : "false"); } else if (type == G_TYPE_CHAR) { nm_sprintf_buf (numstr, "%d", (int) g_value_get_schar (&value)); - nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, numstr); + nm_keyfile_plugin_kf_set_value (info->keyfile, setting_info->setting_name, key, numstr); } else if (type == G_TYPE_BYTES) { GBytes *bytes; const guint8 *data; @@ -3393,22 +3581,22 @@ write_setting_value (KeyfileWriterInfo *info, data = bytes ? g_bytes_get_data (bytes, &len) : NULL; if (data != NULL && len > 0) - nm_keyfile_plugin_kf_set_integer_list_uint8 (info->keyfile, setting_name, key, data, len); + nm_keyfile_plugin_kf_set_integer_list_uint8 (info->keyfile, setting_info->setting_name, key, data, len); } else if (type == G_TYPE_STRV) { char **array; array = (char **) g_value_get_boxed (&value); - nm_keyfile_plugin_kf_set_string_list (info->keyfile, setting_name, key, (const char **const) array, g_strv_length (array)); + nm_keyfile_plugin_kf_set_string_list (info->keyfile, setting_info->setting_name, key, (const char **const) array, g_strv_length (array)); } else if (type == G_TYPE_HASH_TABLE) { write_hash_of_string (info->keyfile, setting, key, &value); } else if (type == G_TYPE_ARRAY) { write_array_of_uint (info->keyfile, setting, key, &value); } else if (G_VALUE_HOLDS_FLAGS (&value)) { nm_sprintf_buf (numstr, "%u", g_value_get_flags (&value)); - nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, numstr); + nm_keyfile_plugin_kf_set_value (info->keyfile, setting_info->setting_name, key, numstr); } else if (G_VALUE_HOLDS_ENUM (&value)) { nm_sprintf_buf (numstr, "%d", g_value_get_enum (&value)); - nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, numstr); + nm_keyfile_plugin_kf_set_value (info->keyfile, setting_info->setting_name, key, numstr); } else g_return_if_reached (); diff --git a/libnm-core/nm-setting-ip-config.c b/libnm-core/nm-setting-ip-config.c index 5250ae436d..53d55c57cd 100644 --- a/libnm-core/nm-setting-ip-config.c +++ b/libnm-core/nm-setting-ip-config.c @@ -25,6 +25,7 @@ #include "nm-setting-ip-config.h" #include <arpa/inet.h> +#include <linux/fib_rules.h> #include "nm-setting-ip4-config.h" #include "nm-setting-ip6-config.h" @@ -1384,6 +1385,2125 @@ _nm_ip_route_attribute_validate_all (const NMIPRoute *route) /*****************************************************************************/ +struct NMIPRoutingRule { + NMIPAddr from_bin; + NMIPAddr to_bin; + char *from_str; + char *to_str; + char *iifname; + char *oifname; + guint ref_count; + guint32 priority; + guint32 table; + guint32 fwmark; + guint32 fwmask; + guint16 sport_start; + guint16 sport_end; + guint16 dport_start; + guint16 dport_end; + guint8 action; + guint8 from_len; + guint8 to_len; + guint8 tos; + guint8 ipproto; + bool is_v4:1; + bool sealed:1; + bool priority_has:1; + bool from_has:1; + bool from_valid:1; + bool to_has:1; + bool to_valid:1; + bool invert:1; +}; + +static NMIPRoutingRule *_ip_routing_rule_dup (const NMIPRoutingRule *rule); + +G_DEFINE_BOXED_TYPE (NMIPRoutingRule, nm_ip_routing_rule, _ip_routing_rule_dup, nm_ip_routing_rule_unref) + +static gboolean +NM_IS_IP_ROUTING_RULE (const NMIPRoutingRule *self, + gboolean also_sealed) +{ + return self + && self->ref_count > 0 + && ( also_sealed + || !self->sealed); +} + +static int +_ip_routing_rule_get_addr_family (const NMIPRoutingRule *self) +{ + nm_assert (NM_IS_IP_ROUTING_RULE (self, TRUE)); + + return self->is_v4 ? AF_INET : AF_INET6; +} + +static int +_ip_routing_rule_get_addr_size (const NMIPRoutingRule *self) +{ + nm_assert (NM_IS_IP_ROUTING_RULE (self, TRUE)); + + return self->is_v4 ? sizeof (struct in_addr) : sizeof (struct in6_addr); +} + +static NMIPRoutingRule * +_ip_routing_rule_dup (const NMIPRoutingRule *rule) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (rule, TRUE), NULL); + + if (rule->sealed) + return nm_ip_routing_rule_ref ((NMIPRoutingRule *) rule); + return nm_ip_routing_rule_new_clone (rule); +} + +/** + * nm_ip_routing_rule_new: + * @addr_family: the address family of the routing rule. Must be either + * %AF_INET (2) or %AF_INET6 (10). + * + * Returns: (transfer full): a newly created rule instance with the + * provided address family. The instance is unsealed. + * + * Since: 1.18 + */ +NMIPRoutingRule * +nm_ip_routing_rule_new (int addr_family) +{ + NMIPRoutingRule *self; + + g_return_val_if_fail (NM_IN_SET (addr_family, AF_INET, AF_INET6), NULL); + + self = g_slice_new (NMIPRoutingRule); + *self = (NMIPRoutingRule) { + .ref_count = 1, + .is_v4 = (addr_family == AF_INET), + .action = FR_ACT_TO_TBL, + .table = RT_TABLE_MAIN, + }; + return self; +} + +/** + * nm_ip_routing_rule_new_clone: + * @rule: the #NMIPRoutingRule to clone. + * + * Returns: (transfer full): a newly created rule instance with + * the same settings as @rule. Note that the instance will + * always be unsealred. + * + * Since: 1.18 + */ +NMIPRoutingRule * +nm_ip_routing_rule_new_clone (const NMIPRoutingRule *rule) +{ + NMIPRoutingRule *self; + + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (rule, TRUE), NULL); + + self = g_slice_new (NMIPRoutingRule); + *self = (NMIPRoutingRule) { + .ref_count = 1, + .sealed = FALSE, + .is_v4 = rule->is_v4, + + .priority = rule->priority, + .priority_has = rule->priority_has, + + .invert = rule->invert, + + .tos = rule->tos, + + .fwmark = rule->fwmark, + .fwmask = rule->fwmask, + + .sport_start = rule->sport_start, + .sport_end = rule->sport_end, + .dport_start = rule->dport_start, + .dport_end = rule->dport_end, + + .ipproto = rule->ipproto, + + .from_len = rule->from_len, + .from_bin = rule->from_bin, + .from_str = ( rule->from_has + && !rule->from_valid) + ? g_strdup (rule->from_str) + : NULL, + .from_has = rule->from_has, + .from_valid = rule->from_valid, + + .to_len = rule->to_len, + .to_bin = rule->to_bin, + .to_str = ( rule->to_has + && !rule->to_valid) + ? g_strdup (rule->to_str) + : NULL, + .to_has = rule->to_has, + .to_valid = rule->to_valid, + + .iifname = g_strdup (rule->iifname), + .oifname = g_strdup (rule->oifname), + + .action = rule->action, + .table = rule->table, + }; + return self; +} + +/** + * nm_ip_routing_rule_ref: + * @self: (allow-none): the #NMIPRoutingRule instance + * + * Increases the reference count of the instance. + * This is not thread-safe. + * + * Returns: (transfer full): the @self argument with incremented + * reference count. + * + * Since: 1.18 + */ +NMIPRoutingRule * +nm_ip_routing_rule_ref (NMIPRoutingRule *self) +{ + if (!self) + return NULL; + + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), NULL); + + nm_assert (self->ref_count < G_MAXUINT); + self->ref_count++; + return self; +} + +/** + * nm_ip_routing_rule_unref: + * @self: (allow-none): the #NMIPRoutingRule instance + * + * Decreases the reference count of the instance and destroys + * the instance if the reference count reaches zero. + * This is not thread-safe. + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_unref (NMIPRoutingRule *self) +{ + if (!self) + return; + + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE)); + + if (--self->ref_count > 0) + return; + + g_free (self->from_str); + g_free (self->to_str); + g_free (self->iifname); + g_free (self->oifname); + + g_slice_free (NMIPRoutingRule, self); +} + +/** + * nm_ip_routing_rule_is_sealed: + * @self: the #NMIPRoutingRule instance + * + * Returns: whether @self is sealed. Once sealed, an instance + * cannot be modified nor unsealed. + * + * Since: 1.18 + */ +gboolean +nm_ip_routing_rule_is_sealed (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), FALSE); + + return self->sealed; +} + +/** + * nm_ip_routing_rule_seal: + * @self: the #NMIPRoutingRule instance + * + * Seals the routing rule. Afterwards, the instance can no longer be + * modfied, and it is a bug to call any of the accessors that would + * modify the rule. If @self was already sealed, this has no effect. + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_seal (NMIPRoutingRule *self) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE)); + + self->sealed = TRUE; +} + +/** + * nm_ip_routing_rule_get_addr_family: + * @self: the #NMIPRoutingRule instance + * + * Returns: the address family of the rule. Either %AF_INET or %AF_INET6. + * + * Since: 1.18 + */ +int +nm_ip_routing_rule_get_addr_family (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), AF_UNSPEC); + + return _ip_routing_rule_get_addr_family (self); +} + +/** + * nm_ip_routing_rule_get_priority: + * @self: the #NMIPRoutingRule instance + * + * Returns: the priority. A valid priority is in the range from + * 0 to %G_MAXUINT32. If unset, -1 is returned. + * + * Since: 1.18 + */ +gint64 +nm_ip_routing_rule_get_priority (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), -1); + + return self->priority_has + ? (gint64) self->priority + : (gint64) -1; +} + +/** + * nm_ip_routing_rule_set_priority: + * @self: the #NMIPRoutingRule instance + * @priority: the priority to set + * + * A valid priority ranges from 0 to %G_MAXUINT32. "-1" is also allowed + * to reset the priority. It is a bug calling this function with any + * other value. + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_priority (NMIPRoutingRule *self, gint64 priority) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + if ( priority >= 0 + && priority <= (gint64) G_MAXUINT32) { + self->priority = (guint32) priority; + self->priority_has = TRUE; + } else { + g_return_if_fail (priority == -1); + self->priority = 0; + self->priority_has = FALSE; + } +} + +/** + * nm_ip_routing_rule_get_invert: + * @self: the #NMIPRoutingRule instance + * + * Returns: the "invert" setting of the rule. + * + * Since: 1.18 + */ +gboolean +nm_ip_routing_rule_get_invert (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), FALSE); + + return self->invert; +} + +/** + * nm_ip_routing_rule_set_invert: + * @self: the #NMIPRoutingRule instance + * @invert: the new value to set + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_invert (NMIPRoutingRule *self, gboolean invert) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + self->invert = invert; +} + +/** + * nm_ip_routing_rule_get_from_len: + * @self: the #NMIPRoutingRule instance + * + * Returns: the set prefix length for the from/src parameter. + * + * Since: 1.18 + */ +guint8 +nm_ip_routing_rule_get_from_len (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->from_len; +} + +/** + * nm_ip_routing_rule_get_from: + * @self: the #NMIPRoutingRule instance + * + * Returns: (transfer none): the set from/src parameter or + * %NULL, if no value is set. + * + * Since: 1.18 + */ +const char * +nm_ip_routing_rule_get_from (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), NULL); + + if (!self->from_has) + return NULL; + if (!self->from_str) { + nm_assert (self->from_valid); + ((NMIPRoutingRule *) self)->from_str = nm_utils_inet_ntop_dup (_ip_routing_rule_get_addr_family (self), + &self->from_bin); + } + return self->from_str; +} + +const NMIPAddr * +nm_ip_routing_rule_get_from_bin (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), NULL); + + return ( self->from_has + && self->from_valid) + ? &self->from_bin + : NULL; +} + +void +nm_ip_routing_rule_set_from_bin (NMIPRoutingRule *self, + gconstpointer from, + guint8 len) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + nm_clear_g_free (&self->from_str); + + if (!from) { + self->from_has = FALSE; + self->from_len = len; + return; + } + + self->from_has = TRUE; + self->from_len = len; + self->from_valid = TRUE; + nm_ip_addr_set (_ip_routing_rule_get_addr_family (self), + &self->from_bin, + from); +} + +/** + * nm_ip_routing_rule_set_from: + * @self: the #NMIPRoutingRule instance + * @from: (allow-none): the from/src address to set. + * The address family must match. + * @len: the corresponding prefix length of the address. + * + * Setting invalid values is accepted, but will later fail + * during nm_ip_routing_rule_validate(). + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_from (NMIPRoutingRule *self, + const char *from, + guint8 len) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + if (!from) { + nm_clear_g_free (&self->from_str); + self->from_has = FALSE; + self->from_len = len; + return; + } + + nm_clear_g_free (&self->from_str); + self->from_has = TRUE; + self->from_len = len; + self->from_valid = nm_utils_parse_inaddr_bin (_ip_routing_rule_get_addr_family (self), + from, + NULL, + &self->from_bin); + if (!self->from_valid) + self->from_str = g_strdup (from); +} + +/** + * nm_ip_routing_rule_get_to_len: + * @self: the #NMIPRoutingRule instance + * + * Returns: the set prefix length for the to/dst parameter. + * + * Since: 1.18 + */ +guint8 +nm_ip_routing_rule_get_to_len (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->to_len; +} + +/** + * nm_ip_routing_rule_get_to: + * @self: the #NMIPRoutingRule instance + * + * Returns: (transfer none): the set to/dst parameter or + * %NULL, if no value is set. + * + * Since: 1.18 + */ +const char * +nm_ip_routing_rule_get_to (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), NULL); + + if (!self->to_has) + return NULL; + if (!self->to_str) { + nm_assert (self->to_valid); + ((NMIPRoutingRule *) self)->to_str = nm_utils_inet_ntop_dup (_ip_routing_rule_get_addr_family (self), + &self->to_bin); + } + return self->to_str; +} + +const NMIPAddr * +nm_ip_routing_rule_get_to_bin (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), NULL); + + return ( self->to_has + && self->to_valid) + ? &self->to_bin + : NULL; +} + +void +nm_ip_routing_rule_set_to_bin (NMIPRoutingRule *self, + gconstpointer to, + guint8 len) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + nm_clear_g_free (&self->to_str); + + if (!to) { + self->to_has = FALSE; + self->to_len = len; + return; + } + + self->to_has = TRUE; + self->to_len = len; + self->to_valid = TRUE; + nm_ip_addr_set (_ip_routing_rule_get_addr_family (self), + &self->to_bin, + to); +} + +/** + * nm_ip_routing_rule_set_to: + * @self: the #NMIPRoutingRule instance + * @to: (allow-none): the to/dst address to set. + * The address family must match. + * @len: the corresponding prefix length of the address. + * If @to is %NULL, this valid is ignored. + * + * Setting invalid values is accepted, but will later fail + * during nm_ip_routing_rule_validate(). + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_to (NMIPRoutingRule *self, + const char *to, + guint8 len) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + if (!to) { + nm_clear_g_free (&self->to_str); + self->to_has = FALSE; + self->to_len = len; + return; + } + + nm_clear_g_free (&self->to_str); + self->to_has = TRUE; + self->to_len = len; + self->to_valid = nm_utils_parse_inaddr_bin (_ip_routing_rule_get_addr_family (self), + to, + NULL, + &self->to_bin); + if (!self->to_valid) + self->to_str = g_strdup (to); +} + +/** + * nm_ip_routing_rule_get_tos: + * @self: the #NMIPRoutingRule instance + * + * Returns: the tos of the rule. + * + * Since: 1.18 + */ +guint8 +nm_ip_routing_rule_get_tos (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->tos; +} + +/** + * nm_ip_routing_rule_set_tos: + * @self: the #NMIPRoutingRule instance + * @tos: the tos to set + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_tos (NMIPRoutingRule *self, guint8 tos) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + self->tos = tos; +} + +/** + * nm_ip_routing_rule_get_ipproto: + * @self: the #NMIPRoutingRule instance + * + * Returns: the ipproto of the rule. + * + * Since: 1.18 + */ +guint8 +nm_ip_routing_rule_get_ipproto (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->ipproto; +} + +/** + * nm_ip_routing_rule_set_ipproto: + * @self: the #NMIPRoutingRule instance + * @ipproto: the ipproto to set + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_ipproto (NMIPRoutingRule *self, guint8 ipproto) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + self->ipproto = ipproto; +} + +/** + * nm_ip_routing_rule_get_source_port_start: + * @self: the #NMIPRoutingRule instance + * + * Returns: the source port start setting. + * + * Since: 1.18 + */ +guint16 +nm_ip_routing_rule_get_source_port_start (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->sport_start; +} + +/** + * nm_ip_routing_rule_get_source_port_end: + * @self: the #NMIPRoutingRule instance + * + * Returns: the source port end setting. + * + * Since: 1.18 + */ +guint16 +nm_ip_routing_rule_get_source_port_end (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->sport_end; +} + +/** + * nm_ip_routing_rule_set_source_port: + * @self: the #NMIPRoutingRule instance + * @start: the start port to set. + * @end: the end port to set. + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_source_port (NMIPRoutingRule *self, guint16 start, guint16 end) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + self->sport_start = start; + self->sport_end = end; +} + +/** + * nm_ip_routing_rule_get_destination_port_start: + * @self: the #NMIPRoutingRule instance + * + * Returns: the destination port start setting. + * + * Since: 1.18 + */ +guint16 +nm_ip_routing_rule_get_destination_port_start (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->dport_start; +} + +/** + * nm_ip_routing_rule_get_destination_port_end: + * @self: the #NMIPRoutingRule instance + * + * Returns: the destination port end setting. + * + * Since: 1.18 + */ +guint16 +nm_ip_routing_rule_get_destination_port_end (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->dport_end; +} + +/** + * nm_ip_routing_rule_set_destination_port: + * @self: the #NMIPRoutingRule instance + * @start: the start port to set. + * @end: the end port to set. + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_destination_port (NMIPRoutingRule *self, guint16 start, guint16 end) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + self->dport_start = start; + self->dport_end = end; +} + +/** + * nm_ip_routing_rule_get_fwmark: + * @self: the #NMIPRoutingRule instance + * + * Returns: the fwmark setting. + * + * Since: 1.18 + */ +guint32 +nm_ip_routing_rule_get_fwmark (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->fwmark; +} + +/** + * nm_ip_routing_rule_get_fwmask: + * @self: the #NMIPRoutingRule instance + * + * Returns: the fwmask setting. + * + * Since: 1.18 + */ +guint32 +nm_ip_routing_rule_get_fwmask (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->fwmask; +} + +/** + * nm_ip_routing_rule_set_fwmark: + * @self: the #NMIPRoutingRule instance + * @fwmark: the fwmark + * @fwmask: the fwmask + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_fwmark (NMIPRoutingRule *self, guint32 fwmark, guint32 fwmask) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + self->fwmark = fwmark; + self->fwmask = fwmask; +} + +/** + * nm_ip_routing_rule_get_iifname: + * @self: the #NMIPRoutingRule instance. + * + * Returns: (transfer none): the set iifname or %NULL if unset. + * + * Since: 1.18 + */ +const char * +nm_ip_routing_rule_get_iifname (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), NULL); + + return self->iifname; +} + +gboolean +nm_ip_routing_rule_get_xifname_bin (const NMIPRoutingRule *self, + gboolean iif /* or else oif */, + char out_xifname[static 16 /* IFNAMSIZ */]) +{ + gs_free gpointer bin_to_free = NULL; + const char *xifname; + gconstpointer bin; + gsize len; + + nm_assert (NM_IS_IP_ROUTING_RULE (self, TRUE)); + nm_assert (out_xifname); + + xifname = iif ? self->iifname : self->oifname; + + if (!xifname) + return FALSE; + + bin = nm_utils_buf_utf8safe_unescape (xifname, &len, &bin_to_free); + + strncpy (out_xifname, bin, 16 /* IFNAMSIZ */); + out_xifname[15] = '\0'; + return TRUE; +} + +/** + * nm_ip_routing_rule_set_iifname: + * @self: the #NMIPRoutingRule instance. + * @iifname: (allow-none): the iifname to set or %NULL to unset. + * + * The name supports C backslash escaping for non-UTF-8 characters. + * Note that nm_ip_routing_rule_from_string() too uses backslash + * escaping when tokenizing the words by whitespace. So, in string + * representation you'd get double backslashs. + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_iifname (NMIPRoutingRule *self, const char *iifname) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + g_free (self->iifname); + self->iifname = g_strdup (iifname); +} + +/** + * nm_ip_routing_rule_get_oifname: + * @self: the #NMIPRoutingRule instance. + * + * Returns: (transfer none): the set oifname or %NULL if unset. + * + * Since: 1.18 + */ +const char * +nm_ip_routing_rule_get_oifname (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), NULL); + + return self->oifname; +} + +/** + * nm_ip_routing_rule_set_oifname: + * @self: the #NMIPRoutingRule instance. + * @oifname: (allow-none): the oifname to set or %NULL to unset. + * + * The name supports C backslash escaping for non-UTF-8 characters. + * Note that nm_ip_routing_rule_from_string() too uses backslash + * escaping when tokenizing the words by whitespace. So, in string + * representation you'd get double backslashs. + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_oifname (NMIPRoutingRule *self, const char *oifname) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + g_free (self->oifname); + self->oifname = g_strdup (oifname); +} + +/** + * nm_ip_routing_rule_get_action: + * @self: the #NMIPRoutingRule instance + * + * Returns: the set action. + * + * Since: 1.18 + */ +guint8 +nm_ip_routing_rule_get_action (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->action; +} + +/** + * nm_ip_routing_rule_set_action: + * @self: the #NMIPRoutingRule instance + * @action: the action to set + * + * Note that currently only certain actions are allowed. nm_ip_routing_rule_validate() + * will reject unsupported actions as invalid. + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_action (NMIPRoutingRule *self, guint8 action) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + self->action = action; +} + +/** + * nm_ip_routing_rule_get_table: + * @self: the #NMIPRoutingRule instance + * + * Returns: the set table. + * + * Since: 1.18 + */ +guint32 +nm_ip_routing_rule_get_table (const NMIPRoutingRule *self) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), 0); + + return self->table; +} + +/** + * nm_ip_routing_rule_set_table: + * @self: the #NMIPRoutingRule instance + * @table: the table to set + * + * Since: 1.18 + */ +void +nm_ip_routing_rule_set_table (NMIPRoutingRule *self, guint32 table) +{ + g_return_if_fail (NM_IS_IP_ROUTING_RULE (self, FALSE)); + + self->table = table; +} + +/** + * nm_ip_routing_rule_cmp: + * @rule: (allow-none): the #NMIPRoutingRule instance to compare + * @other: (allow-none): the other #NMIPRoutingRule instance to compare + * + * Returns: zero, a positive, or a negative integer to indicate + * equality or how the arguments compare. + * + * Since: 1.18 + */ +int +nm_ip_routing_rule_cmp (const NMIPRoutingRule *rule, + const NMIPRoutingRule *other) +{ + NM_CMP_SELF (rule, other); + + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (rule, TRUE), 0); + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (other, TRUE), 0); + + NM_CMP_FIELD_UNSAFE (rule, other, priority_has); + if (rule->priority_has) + NM_CMP_FIELD (rule, other, priority); + + NM_CMP_FIELD_UNSAFE (rule, other, is_v4); + + NM_CMP_FIELD_UNSAFE (rule, other, invert); + + NM_CMP_FIELD (rule, other, tos); + + NM_CMP_FIELD (rule, other, fwmark); + NM_CMP_FIELD (rule, other, fwmask); + + NM_CMP_FIELD (rule, other, action); + + NM_CMP_FIELD (rule, other, table); + + NM_CMP_FIELD (rule, other, sport_start); + NM_CMP_FIELD (rule, other, sport_end); + NM_CMP_FIELD (rule, other, dport_start); + NM_CMP_FIELD (rule, other, dport_end); + + NM_CMP_FIELD (rule, other, ipproto); + + /* We compare the plain strings, not the binary values after utf8safe unescaping. + * + * The reason is, that the rules differ already when the direct strings differ, not + * only when the unescaped names differ. */ + NM_CMP_FIELD_STR0 (rule, other, iifname); + NM_CMP_FIELD_STR0 (rule, other, oifname); + + NM_CMP_FIELD (rule, other, from_len); + + NM_CMP_FIELD_UNSAFE (rule, other, from_has); + if (rule->from_has) { + NM_CMP_FIELD_UNSAFE (rule, other, from_valid); + if (rule->from_valid) { + NM_CMP_RETURN (memcmp (&rule->from_bin, + &other->from_bin, + _ip_routing_rule_get_addr_size (rule))); + } else + NM_CMP_FIELD_STR (rule, other, from_str); + } + + NM_CMP_FIELD (rule, other, to_len); + + NM_CMP_FIELD_UNSAFE (rule, other, to_has); + if (rule->to_has) { + NM_CMP_FIELD_UNSAFE (rule, other, to_valid); + if (rule->to_valid) { + NM_CMP_RETURN (memcmp (&rule->to_bin, + &other->to_bin, + _ip_routing_rule_get_addr_size (rule))); + } else + NM_CMP_FIELD_STR (rule, other, to_str); + } + + return 0; +} + +static gboolean +_rr_xport_range_valid (guint16 xport_start, guint16 xport_end) +{ + if (xport_start == 0) + return (xport_end == 0); + + return xport_start <= xport_end + && xport_end < 0xFFFFu; +} + +static gboolean +_rr_xport_range_parse (char *str, gint64 *out_start, guint16 *out_end) +{ + guint16 start, end; + gint64 i64; + char *s; + + s = strchr (str, '-'); + if (s) + *(s++) = '\0'; + + i64 = _nm_utils_ascii_str_to_int64 (str, 10, 0, 0xFFFF, -1); + if (i64 == -1) + return FALSE; + + start = i64; + if (s) { + i64 = _nm_utils_ascii_str_to_int64 (s, 10, 0, 0xFFFF, -1); + if (i64 == -1) + return FALSE; + end = i64; + } else + end = start; + + *out_start = start; + *out_end = end; + return TRUE; +} + +/** + * nm_ip_routing_rule_validate: + * @self: the #NMIPRoutingRule instance to validate + * @error: (allow-none) (out): the error result if validation fails. + * + * Returns: %TRUE if the rule validates. + * + * Since: 1.18 + */ +gboolean +nm_ip_routing_rule_validate (const NMIPRoutingRule *self, + GError **error) +{ + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + /* Kernel may be more flexible about validating. We do a strict validation + * here and reject certain settings eagerly. We can always relax it later. */ + + if (!self->priority_has) { + /* iproute2 accepts not specifying the priority, in which case kernel will select + * an unused priority. We don't allow for that, and will always require the user to + * select a priority. + * + * Note that if the user selects priority 0 or a non-unique priority, this is problematic + * due to kernel bugs rh#1685816 and rh#1685816. It may result in NetworkManager wrongly being + * unable to add a rule or deleting the wrong rule. + * This problem is not at all specific to the priority, it affects all rules that + * have default values which confuse kernel. But setting a unique priority avoids + * this problem nicely. */ + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid priority")); + return FALSE; + } + + if (NM_IN_SET (self->action, FR_ACT_TO_TBL)) { + if (self->table == 0) { + /* with IPv4, kernel allows a table (in RTM_NEWRULE) of zero to automatically select + * an unused table. We don't. The user needs to specify the table. + * + * For IPv6, kernel doesn't allow a table of zero, so we are consistent here. */ + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("missing table")); + return FALSE; + } + } else { + /* whitelist the actions that we currently. */ + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid action")); + return FALSE; + } + + if (self->from_len == 0) { + if (self->from_has) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("has from/src but the prefix-length is zero")); + return FALSE; + } + } else if ( self->from_len > 0 + && self->from_len <= 8 * _ip_routing_rule_get_addr_size (self)) { + if (!self->from_has) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("missing from/src for a non zero prefix-length")); + return FALSE; + } + if (!self->from_valid) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid from/src")); + return FALSE; + } + } else { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid prefix length for from/src")); + return FALSE; + } + + if (self->to_len == 0) { + if (self->to_has) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("has to/dst but the prefix-length is zero")); + return FALSE; + } + } else if ( self->to_len > 0 + && self->to_len <= 8 * _ip_routing_rule_get_addr_size (self)) { + if (!self->to_has) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("missing to/dst for a non zero prefix-length")); + return FALSE; + } + if (!self->to_valid) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid to/dst")); + return FALSE; + } + } else { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid prefix length for to/dst")); + return FALSE; + } + + if ( self->iifname + && ( !g_utf8_validate (self->iifname, -1, NULL) + || !nm_utils_is_valid_iface_name_utf8safe (self->iifname))) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid iifname")); + return FALSE; + } + + if ( self->oifname + && ( !g_utf8_validate (self->oifname, -1, NULL) + || !nm_utils_is_valid_iface_name_utf8safe (self->oifname))) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid oifname")); + return FALSE; + } + + if (!_rr_xport_range_valid (self->sport_start, self->sport_end)) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid source port range")); + return FALSE; + } + + if (!_rr_xport_range_valid (self->dport_start, self->dport_end)) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid destination port range")); + return FALSE; + } + + return TRUE; +} + +/*****************************************************************************/ + +typedef enum { + RR_DBUS_ATTR_ACTION, + RR_DBUS_ATTR_DPORT_END, + RR_DBUS_ATTR_DPORT_START, + RR_DBUS_ATTR_FAMILY, + RR_DBUS_ATTR_FROM, + RR_DBUS_ATTR_FROM_LEN, + RR_DBUS_ATTR_FWMARK, + RR_DBUS_ATTR_FWMASK, + RR_DBUS_ATTR_IIFNAME, + RR_DBUS_ATTR_INVERT, + RR_DBUS_ATTR_IPPROTO, + RR_DBUS_ATTR_OIFNAME, + RR_DBUS_ATTR_PRIORITY, + RR_DBUS_ATTR_SPORT_END, + RR_DBUS_ATTR_SPORT_START, + RR_DBUS_ATTR_TABLE, + RR_DBUS_ATTR_TO, + RR_DBUS_ATTR_TOS, + RR_DBUS_ATTR_TO_LEN, + + _RR_DBUS_ATTR_NUM, +} RRDbusAttr; + +typedef struct { + const char *name; + const GVariantType *dbus_type; +} RRDbusData; + +static const RRDbusData rr_dbus_data[_RR_DBUS_ATTR_NUM] = { +#define _D(attr, _name, type) [attr] = { .name = _name, .dbus_type = type, } + _D (RR_DBUS_ATTR_ACTION, NM_IP_ROUTING_RULE_ATTR_ACTION, G_VARIANT_TYPE_BYTE), + _D (RR_DBUS_ATTR_DPORT_END, NM_IP_ROUTING_RULE_ATTR_DPORT_END, G_VARIANT_TYPE_UINT16), + _D (RR_DBUS_ATTR_DPORT_START, NM_IP_ROUTING_RULE_ATTR_DPORT_START, G_VARIANT_TYPE_UINT16), + _D (RR_DBUS_ATTR_FAMILY, NM_IP_ROUTING_RULE_ATTR_FAMILY, G_VARIANT_TYPE_INT32), + _D (RR_DBUS_ATTR_FROM, NM_IP_ROUTING_RULE_ATTR_FROM, G_VARIANT_TYPE_STRING), + _D (RR_DBUS_ATTR_FROM_LEN, NM_IP_ROUTING_RULE_ATTR_FROM_LEN, G_VARIANT_TYPE_BYTE), + _D (RR_DBUS_ATTR_FWMARK, NM_IP_ROUTING_RULE_ATTR_FWMARK, G_VARIANT_TYPE_UINT32), + _D (RR_DBUS_ATTR_FWMASK, NM_IP_ROUTING_RULE_ATTR_FWMASK, G_VARIANT_TYPE_UINT32), + _D (RR_DBUS_ATTR_IIFNAME, NM_IP_ROUTING_RULE_ATTR_IIFNAME, G_VARIANT_TYPE_STRING), + _D (RR_DBUS_ATTR_INVERT, NM_IP_ROUTING_RULE_ATTR_INVERT, G_VARIANT_TYPE_BOOLEAN), + _D (RR_DBUS_ATTR_IPPROTO, NM_IP_ROUTING_RULE_ATTR_IPPROTO, G_VARIANT_TYPE_BYTE), + _D (RR_DBUS_ATTR_OIFNAME, NM_IP_ROUTING_RULE_ATTR_OIFNAME, G_VARIANT_TYPE_STRING), + _D (RR_DBUS_ATTR_PRIORITY, NM_IP_ROUTING_RULE_ATTR_PRIORITY, G_VARIANT_TYPE_UINT32), + _D (RR_DBUS_ATTR_SPORT_END, NM_IP_ROUTING_RULE_ATTR_SPORT_END, G_VARIANT_TYPE_UINT16), + _D (RR_DBUS_ATTR_SPORT_START, NM_IP_ROUTING_RULE_ATTR_SPORT_START, G_VARIANT_TYPE_UINT16), + _D (RR_DBUS_ATTR_TABLE, NM_IP_ROUTING_RULE_ATTR_TABLE, G_VARIANT_TYPE_UINT32), + _D (RR_DBUS_ATTR_TO, NM_IP_ROUTING_RULE_ATTR_TO, G_VARIANT_TYPE_STRING), + _D (RR_DBUS_ATTR_TOS, NM_IP_ROUTING_RULE_ATTR_TOS, G_VARIANT_TYPE_BYTE), + _D (RR_DBUS_ATTR_TO_LEN, NM_IP_ROUTING_RULE_ATTR_TO_LEN, G_VARIANT_TYPE_BYTE), +#undef _D +}; + +static void +_rr_variants_free (GVariant *(*p_variants)[]) +{ + int i; + + for (i = 0; i < _RR_DBUS_ATTR_NUM; i++) { + if ((*p_variants)[i]) + g_variant_unref ((*p_variants)[i]); + } +} + +NMIPRoutingRule * +nm_ip_routing_rule_from_dbus (GVariant *variant, + gboolean strict, + GError **error) +{ + nm_auto (_rr_variants_free) GVariant *variants[_RR_DBUS_ATTR_NUM] = { }; + nm_auto_unref_ip_routing_rule NMIPRoutingRule *self = NULL; + RRDbusAttr attr; + GVariantIter iter; + const char *iter_key; + GVariant *iter_val; + int addr_family; + int i; + + g_variant_iter_init (&iter, variant); + +#if NM_MORE_ASSERTS > 10 + for (attr = 0; attr < _RR_DBUS_ATTR_NUM; attr++) { + nm_assert (rr_dbus_data[attr].name); + nm_assert (g_variant_type_string_is_valid ((const char *) rr_dbus_data[attr].dbus_type)); + } +#endif + + while (g_variant_iter_next (&iter, "{&sv}", &iter_key, &iter_val)) { + gs_unref_variant GVariant *iter_val2 = iter_val; + + for (attr = 0; attr < _RR_DBUS_ATTR_NUM; attr++) { + if (nm_streq (iter_key, rr_dbus_data[attr].name)) { + if (variants[attr]) { + if (strict) { + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("duplicate key %s"), + iter_key); + return NULL; + } + g_variant_unref (variants[attr]); + } + variants[attr] = g_steal_pointer (&iter_val2); + break; + } + } + + if ( attr >= _RR_DBUS_ATTR_NUM + && strict) { + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid key \"%s\""), + iter_key); + return NULL; + } + } + + for (attr = 0; attr < _RR_DBUS_ATTR_NUM; attr++) { + if (!variants[attr]) + continue; + if (!g_variant_is_of_type (variants[attr], rr_dbus_data[attr].dbus_type)) { + g_set_error (error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid variant type '%s' for \"%s\""), + (const char *) rr_dbus_data[attr].dbus_type, + rr_dbus_data[attr].name); + return NULL; + } + } + + if (!variants[RR_DBUS_ATTR_FAMILY]) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("missing \""NM_IP_ROUTING_RULE_ATTR_FAMILY"\"")); + return NULL; + } + addr_family = g_variant_get_int32 (variants[RR_DBUS_ATTR_FAMILY]); + if (!NM_IN_SET (addr_family, AF_INET, AF_INET6)) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("invalid \""NM_IP_ROUTING_RULE_ATTR_FAMILY"\"")); + return NULL; + } + + self = nm_ip_routing_rule_new (addr_family); + + if (variants[RR_DBUS_ATTR_PRIORITY]) + nm_ip_routing_rule_set_priority (self, g_variant_get_uint32 (variants[RR_DBUS_ATTR_PRIORITY])); + + if (variants[RR_DBUS_ATTR_INVERT]) + nm_ip_routing_rule_set_invert (self, g_variant_get_boolean (variants[RR_DBUS_ATTR_INVERT])); + + if (variants[RR_DBUS_ATTR_TOS]) + nm_ip_routing_rule_set_tos (self, g_variant_get_byte (variants[RR_DBUS_ATTR_TOS])); + + if (variants[RR_DBUS_ATTR_IPPROTO]) + nm_ip_routing_rule_set_ipproto (self, g_variant_get_byte (variants[RR_DBUS_ATTR_IPPROTO])); + + for (i = 0; i < 2; i++) { + GVariant *v_start = variants[i ? RR_DBUS_ATTR_SPORT_START : RR_DBUS_ATTR_DPORT_START]; + GVariant *v_end = variants[i ? RR_DBUS_ATTR_SPORT_END : RR_DBUS_ATTR_DPORT_END]; + guint16 start, end; + + if (!v_start && !v_end) + continue; + + /* if start or end is missing, it defaults to the other parameter, respectively. */ + if (v_start) + start = g_variant_get_uint16 (v_start); + else + start = g_variant_get_uint16 (v_end); + if (v_end) + end = g_variant_get_uint16 (v_end); + else + end = g_variant_get_uint16 (v_start); + + if (i) + nm_ip_routing_rule_set_source_port (self, start, end); + else + nm_ip_routing_rule_set_destination_port (self, start, end); + } + + if ( variants[RR_DBUS_ATTR_FWMARK] + || variants[RR_DBUS_ATTR_FWMASK]) { + nm_ip_routing_rule_set_fwmark (self, + variants[RR_DBUS_ATTR_FWMARK] ? g_variant_get_uint32 (variants[RR_DBUS_ATTR_FWMARK]) : 0u, + variants[RR_DBUS_ATTR_FWMASK] ? g_variant_get_uint32 (variants[RR_DBUS_ATTR_FWMASK]) : 0u); + } + + if ( variants[RR_DBUS_ATTR_FROM] + || variants[RR_DBUS_ATTR_FROM_LEN]) { + nm_ip_routing_rule_set_from (self, + variants[RR_DBUS_ATTR_FROM] ? g_variant_get_string (variants[RR_DBUS_ATTR_FROM], NULL) : NULL, + variants[RR_DBUS_ATTR_FROM_LEN] ? g_variant_get_byte (variants[RR_DBUS_ATTR_FROM_LEN]) : 0u); + } + + if ( variants[RR_DBUS_ATTR_TO] + || variants[RR_DBUS_ATTR_TO_LEN]) { + nm_ip_routing_rule_set_to (self, + variants[RR_DBUS_ATTR_TO] ? g_variant_get_string (variants[RR_DBUS_ATTR_TO], NULL) : NULL, + variants[RR_DBUS_ATTR_TO_LEN] ? g_variant_get_byte (variants[RR_DBUS_ATTR_TO_LEN]) : 0u); + } + + if (variants[RR_DBUS_ATTR_IIFNAME]) + nm_ip_routing_rule_set_iifname (self, g_variant_get_string (variants[RR_DBUS_ATTR_IIFNAME], NULL)); + + if (variants[RR_DBUS_ATTR_OIFNAME]) + nm_ip_routing_rule_set_oifname (self, g_variant_get_string (variants[RR_DBUS_ATTR_OIFNAME], NULL)); + + if (variants[RR_DBUS_ATTR_ACTION]) + nm_ip_routing_rule_set_action (self, g_variant_get_byte (variants[RR_DBUS_ATTR_ACTION])); + + if (variants[RR_DBUS_ATTR_TABLE]) + nm_ip_routing_rule_set_table (self, g_variant_get_uint32 (variants[RR_DBUS_ATTR_TABLE])); + + if ( strict + && !nm_ip_routing_rule_validate (self, error)) + return NULL; + + return g_steal_pointer (&self); +} + +static void +_rr_to_dbus_add (GVariantBuilder *builder, + RRDbusAttr attr, + GVariant *value) +{ + nm_assert (builder); + nm_assert (value); + nm_assert (g_variant_is_floating (value)); + nm_assert (g_variant_is_of_type (value, rr_dbus_data[attr].dbus_type)); + + g_variant_builder_add (builder, + "{sv}", + rr_dbus_data[attr].name, + value); +} + +GVariant * +nm_ip_routing_rule_to_dbus (const NMIPRoutingRule *self) +{ + GVariantBuilder builder; + char addr_str[NM_UTILS_INET_ADDRSTRLEN]; + + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), NULL); + + g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT); + + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_FAMILY, g_variant_new_int32 (_ip_routing_rule_get_addr_family (self))); + + if (self->invert) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_INVERT, g_variant_new_boolean (TRUE)); + + if (self->priority_has) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_PRIORITY, g_variant_new_uint32 (self->priority)); + + if (self->tos != 0) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_TOS, g_variant_new_byte (self->tos)); + + if (self->ipproto != 0) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_IPPROTO, g_variant_new_byte (self->ipproto)); + + if (self->fwmark != 0) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_FWMARK, g_variant_new_uint32 (self->fwmark)); + + if (self->fwmask != 0) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_FWMASK, g_variant_new_uint32 (self->fwmask)); + + if ( self->sport_start != 0 + || self->sport_end != 0) { + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_SPORT_START, g_variant_new_uint16 (self->sport_start)); + if (self->sport_start != self->sport_end) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_SPORT_END, g_variant_new_uint16 (self->sport_end)); + } + + if ( self->dport_start != 0 + || self->dport_end != 0) { + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_DPORT_START, g_variant_new_uint16 (self->dport_start)); + if (self->dport_start != self->dport_end) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_DPORT_END, g_variant_new_uint16 (self->dport_end)); + } + + if ( self->from_has + || self->from_len != 0) { + _rr_to_dbus_add (&builder, + RR_DBUS_ATTR_FROM, + g_variant_new_string ( self->from_str + ?: nm_utils_inet_ntop (_ip_routing_rule_get_addr_family (self), + &self->from_bin, + addr_str))); + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_FROM_LEN, g_variant_new_byte (self->from_len)); + } + + if ( self->to_has + || self->to_len != 0) { + _rr_to_dbus_add (&builder, + RR_DBUS_ATTR_TO, + g_variant_new_string ( self->to_str + ?: nm_utils_inet_ntop (_ip_routing_rule_get_addr_family (self), + &self->to_bin, + addr_str))); + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_TO_LEN, g_variant_new_byte (self->to_len)); + } + + if (self->iifname) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_IIFNAME, g_variant_new_string (self->iifname)); + + if (self->oifname) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_OIFNAME, g_variant_new_string (self->oifname)); + + if (self->action != FR_ACT_TO_TBL) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_ACTION, g_variant_new_byte (self->action)); + + if (self->table != 0) + _rr_to_dbus_add (&builder, RR_DBUS_ATTR_TABLE, g_variant_new_uint32 (self->table)); + + return g_variant_builder_end (&builder);; +} + +/*****************************************************************************/ + +static gboolean +_rr_string_validate (gboolean for_from /* or else to-string */, + NMIPRoutingRuleAsStringFlags to_string_flags, + GHashTable *extra_args, + GError **error) +{ + if (NM_FLAGS_ANY (to_string_flags, ~( NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET + | NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6 + | NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE))) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("Unsupported to-string-flags argument")); + return FALSE; + } + + if ( extra_args + && g_hash_table_size (extra_args) > 0) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("Unsupported extra-argument")); + return FALSE; + } + + return TRUE; +} + +static int +_rr_string_addr_family_from_flags (NMIPRoutingRuleAsStringFlags to_string_flags) +{ + if (NM_FLAGS_HAS (to_string_flags, NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET)) { + if (!NM_FLAGS_HAS (to_string_flags, NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6)) + return AF_INET; + } else if (NM_FLAGS_HAS (to_string_flags, NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6)) + return AF_INET6; + return AF_UNSPEC; +} + +/** + * nm_ip_routing_rule_from_string: + * @str: the string representation to convert to an #NMIPRoutingRule + * @to_string_flags: #NMIPRoutingRuleAsStringFlags for controlling the + * string conversion. + * @extra_args: (allow-none): extra arguments for controlling the string + * conversion. Currently not extra arguments are supported. + * @error: (allow-none) (out): the error reason. + * + * Returns: (transfer full): the new #NMIPRoutingRule or %NULL on error. + * + * Since: 1.18 + */ +NMIPRoutingRule * +nm_ip_routing_rule_from_string (const char *str, + NMIPRoutingRuleAsStringFlags to_string_flags, + GHashTable *extra_args, + GError **error) +{ + nm_auto_unref_ip_routing_rule NMIPRoutingRule *self = NULL; + gs_free char *str_clone = NULL; + char *str_remainder; + char *str_word; + gboolean any_words = FALSE; + char *word0 = NULL; + char *word1 = NULL; + char *word_from = NULL; + char *word_to = NULL; + char *word_iifname = NULL; + char *word_oifname = NULL; + gint64 i64_priority = -1; + gint64 i64_table = -1; + gint64 i64_tos = -1; + gint64 i64_fwmark = -1; + gint64 i64_fwmask = -1; + gint64 i64_sport_start = -1; + gint64 i64_ipproto = -1; + guint16 sport_end = 0; + gint64 i64_dport_start = -1; + guint16 dport_end = 0; + gboolean val_invert = FALSE; + int addr_family = AF_UNSPEC; + NMIPAddr val_from = { }; + NMIPAddr val_to = { }; + int val_from_len = -1; + int val_to_len = -1; + char *s; + + g_return_val_if_fail (str, NULL); + + if (!_rr_string_validate (TRUE, to_string_flags, extra_args, error)) + return NULL; + + /* NM_IP_ROUTING_RULE_TO_STRING_TYPE_IPROUTE gives a string representation that is + * partly compatibly with iproute2. That is, the part after `ip -[46] rule add $ARGS`. + * There are differences though: + * + * - trying to convert an invalid rule to string may not be possible. The reason is for + * example that an invalid rule can have nm_ip_routing_rule_get_from() like "bogus", + * but we don't write that as "from bogus". In general, if you try to convert an invalid + * rule to string, the operation may fail or the result may itself not be parsable. + * Of course, valid rules can be converted to string and read back the same (round-trip). + * + * - iproute2 in may regards is flexible about the command lines. For example + * - for tables it accepts table names from /etc/iproute2/rt_tables + * - key names like "preference" can be abbreviated to "prefe", we don't do that. + * - the "preference"/"priority" may be unspecified, in which kernel automatically + * chooses an unused priority (during `ip rule add`). We don't allow for that, the + * priority must be explicitly set. + * + * - iproute2 does not support any escaping. Well, it's the shell that supports quoting + * and escaping and splits the command line. We need to split the command line ourself, + * but we don't support full shell quotation. + * from-string tokenizes words at (ASCII) whitespaces (removing the whitespaces). + * It also supports backslash escaping (e.g. to contain whitespace), but it does + * not support special escape sequences. Values are taken literally, meaning + * "\n\ \111" gives results in "n 111". + * The strings really shouldn't contain any special characters that require escaping, + * but that's the rule. + * This also goes together with the @allow_escaping parameter of nm_utils_strsplit_set(). + * If you concatenate multiple rule expressions with a delimiter, the delimiter inside + * each word can be backslash escaped, and nm_utils_strsplit_set(allow_escaping=TRUE) will + * properly split the words, preserving the backslashes, which then will be removed by + * nm_ip_routing_rule_from_string(). + */ + + addr_family = _rr_string_addr_family_from_flags (to_string_flags); + + str_clone = g_strdup (str); + str_remainder = str_clone; + + while ((str_word = nm_utils_str_simpletokens_extract_next (&str_remainder))) { + + any_words = TRUE; + if (!word0) + word0 = str_word; + else { + nm_assert (!word1); + word1 = str_word; + } + + /* iproute2 matches keywords with any partial prefix. We don't allow + * for that flexiblity. */ + + if (NM_IN_STRSET (word0, "from")) { + if (!word1) + continue; + if (word_from) + goto next_fail_word0_duplicate_key; + word_from = word1; + goto next_words_consumed; + } + if (NM_IN_STRSET (word0, "to")) { + if (!word1) + continue; + if (word_to) + goto next_fail_word0_duplicate_key; + word_to = word1; + goto next_words_consumed; + } + if (NM_IN_STRSET (word0, "not")) { + /* we accept multiple "not" specifiers. */ + val_invert = TRUE; + goto next_words_consumed; + } + if (NM_IN_STRSET (word0, "priority", + "order", + "pref", + "preference")) { + if (!word1) + continue; + if (i64_priority != -1) + goto next_fail_word0_duplicate_key; + i64_priority = _nm_utils_ascii_str_to_int64 (word1, 0, 0, G_MAXUINT32, -1); + if (i64_priority == -1) + goto next_fail_word1_invalid_value; + goto next_words_consumed; + } + if (NM_IN_STRSET (word0, "table", + "lookup")) { + if (!word1) + continue; + if (i64_table != -1) + goto next_fail_word0_duplicate_key; + i64_table = _nm_utils_ascii_str_to_int64 (word1, 0, 1, G_MAXUINT32, -1); + if (i64_table == -1) + goto next_fail_word1_invalid_value; + goto next_words_consumed; + } + if (NM_IN_STRSET (word0, "tos", + "dsfield")) { + if (!word1) + continue; + if (i64_tos != -1) + goto next_fail_word0_duplicate_key; + i64_tos = _nm_utils_ascii_str_to_int64 (word1, 16, 0, G_MAXUINT8, -1); + if (i64_tos == -1) + goto next_fail_word1_invalid_value; + goto next_words_consumed; + } + if (NM_IN_STRSET (word0, "ipproto")) { + if (!word1) + continue; + if (i64_ipproto != -1) + goto next_fail_word0_duplicate_key; + i64_ipproto = _nm_utils_ascii_str_to_int64 (word1, 10, 0, G_MAXUINT8, -1); + if (i64_ipproto == -1) + goto next_fail_word1_invalid_value; + goto next_words_consumed; + } + if (NM_IN_STRSET (word0, "sport")) { + if (!word1) + continue; + if (i64_sport_start != -1) + goto next_fail_word0_duplicate_key; + if (!_rr_xport_range_parse (word1, &i64_sport_start, &sport_end)) + goto next_fail_word1_invalid_value; + goto next_words_consumed; + } + if (NM_IN_STRSET (word0, "dport")) { + if (!word1) + continue; + if (i64_dport_start != -1) + goto next_fail_word0_duplicate_key; + if (!_rr_xport_range_parse (word1, &i64_dport_start, &dport_end)) + goto next_fail_word1_invalid_value; + goto next_words_consumed; + } + if (NM_IN_STRSET (word0, "fwmark")) { + if (!word1) + continue; + if (i64_fwmark != -1) + goto next_fail_word0_duplicate_key; + s = strchr (word1, '/'); + if (s) + *(s++) = '\0'; + i64_fwmark = _nm_utils_ascii_str_to_int64 (word1, 0, 0, G_MAXUINT32, -1); + if (i64_fwmark == -1) + goto next_fail_word1_invalid_value; + if (s) { + i64_fwmask = _nm_utils_ascii_str_to_int64 (s, 0, 0, G_MAXUINT32, -1); + if (i64_fwmask == -1) + goto next_fail_word1_invalid_value; + } else + i64_fwmask = 0xFFFFFFFFu; + goto next_words_consumed; + } + if (NM_IN_STRSET (word0, "iif", + "dev")) { + if (!word1) + continue; + if (word_iifname) + goto next_fail_word0_duplicate_key; + word_iifname = word1; + goto next_words_consumed; + } + if (NM_IN_STRSET (word0, "oif")) { + if (!word1) + continue; + if (word_oifname) + goto next_fail_word0_duplicate_key; + word_oifname = word1; + goto next_words_consumed; + } + + /* also the action is still unsupported. For the moment, we only support + * FR_ACT_TO_TBL, which is the default (by not expressing it on the command + * line). */ + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("unsupported key \"%s\""), + word0); + return FALSE; +next_fail_word0_duplicate_key: + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("duplicate key \"%s\""), + word0); + return FALSE; +next_fail_word1_invalid_value: + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("invalid value for \"%s\""), + word0); + return FALSE; +next_words_consumed: + word0 = NULL; + word1 = NULL; + } + + if (!any_words) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("empty text does not describe a rule")); + return FALSE; + } + + if (word0) { + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("missing argument for \"%s\""), + word0); + return FALSE; + } + + if (!NM_IN_STRSET (word_from, NULL, "all")) { + if (!nm_utils_parse_inaddr_prefix_bin (addr_family, + word_from, + &addr_family, + &val_from, + &val_from_len)) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("invalid \"from\" part")); + return FALSE; + } + if (val_from_len == -1) + val_from_len = nm_utils_addr_family_to_size (addr_family) * 8; + } + + if (!NM_IN_STRSET (word_to, NULL, "all")) { + if (!nm_utils_parse_inaddr_prefix_bin (addr_family, + word_to, + &addr_family, + &val_to, + &val_to_len)) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("invalid \"to\" part")); + return FALSE; + } + if (val_to_len == -1) + val_to_len = nm_utils_addr_family_to_size (addr_family) * 8; + } + + if (!NM_IN_SET (addr_family, AF_INET, AF_INET6)) { + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("cannot detect address family for rule")); + return FALSE; + } + + self = nm_ip_routing_rule_new (addr_family); + + if (val_invert) + self->invert = TRUE; + + if (i64_priority != -1) + nm_ip_routing_rule_set_priority (self, i64_priority); + + if (i64_tos != -1) + nm_ip_routing_rule_set_tos (self, i64_tos); + + if (i64_ipproto != -1) + nm_ip_routing_rule_set_ipproto (self, i64_ipproto); + + if (i64_fwmark != -1) + nm_ip_routing_rule_set_fwmark (self, i64_fwmark, i64_fwmask); + + if (i64_sport_start != -1) + nm_ip_routing_rule_set_source_port (self, i64_sport_start, sport_end); + + if (i64_dport_start != -1) + nm_ip_routing_rule_set_destination_port (self, i64_dport_start, dport_end); + + if ( val_from_len > 0 + || ( val_from_len == 0 + && !nm_ip_addr_is_null (addr_family, &val_from))) { + nm_ip_routing_rule_set_from_bin (self, + &val_from, + val_from_len); + } + + if ( val_to_len > 0 + || ( val_to_len == 0 + && !nm_ip_addr_is_null (addr_family, &val_to))) { + nm_ip_routing_rule_set_to_bin (self, + &val_to, + val_to_len); + } + + if (word_iifname) + nm_ip_routing_rule_set_iifname (self, word_iifname); + + if (word_oifname) + nm_ip_routing_rule_set_oifname (self, word_oifname); + + if (i64_table != -1) + nm_ip_routing_rule_set_table (self, i64_table); + + if (NM_FLAGS_HAS (to_string_flags, NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE)) { + gs_free_error GError *local = NULL; + + if (!nm_ip_routing_rule_validate (self, &local)) { + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("rule is invalid: %s"), + local->message); + return NULL; + } + } + + return g_steal_pointer (&self); +} + +static void +_rr_string_append_inet_addr (GString *str, + gboolean is_from /* or else is-to */, + gboolean required, + int addr_family, + const NMIPAddr *addr_bin, + guint8 addr_len) +{ + char addr_str[NM_UTILS_INET_ADDRSTRLEN]; + + if (addr_len == 0) { + if (required) { + g_string_append_printf (nm_gstring_add_space_delimiter (str), + "%s %s/0", + is_from ? "from" : "to", + (addr_family == AF_INET) + ? "0.0.0.0" + : "::"); + } + return; + } + + g_string_append_printf (nm_gstring_add_space_delimiter (str), + "%s %s", + is_from ? "from" : "to", + nm_utils_inet_ntop (addr_family, + addr_bin, + addr_str)); + if (addr_len != nm_utils_addr_family_to_size (addr_family) * 8) { + g_string_append_printf (str, + "/%u", + addr_len); + } +} + +static void +_rr_string_append_escaped (GString *str, + const char *s) +{ + for (; s[0]; s++) { + /* We need to escape spaces and '\\', because that + * is what nm_utils_str_simpletokens_extract_next() uses to split + * words. + * We also escape ',' because nmcli uses that to concatenate values. + * We also escape ';', in case somebody wants to use ';' instead of ','. + */ + if ( NM_IN_SET (s[0], '\\', ',', ';') + || g_ascii_isspace (s[0])) + g_string_append_c (str, '\\'); + g_string_append_c (str, s[0]); + } +} + +/** + * nm_ip_routing_rule_to_string: + * @self: the #NMIPRoutingRule instance to convert to string. + * @to_string_flags: #NMIPRoutingRuleAsStringFlags for controlling the + * string conversion. + * @extra_args: (allow-none): extra arguments for controlling the string + * conversion. Currently not extra arguments are supported. + * @error: (allow-none) (out): the error reason. + * + * Returns: (transfer full): the string representation or %NULL on error. + * + * Since: 1.18 + */ +char * +nm_ip_routing_rule_to_string (const NMIPRoutingRule *self, + NMIPRoutingRuleAsStringFlags to_string_flags, + GHashTable *extra_args, + GError **error) +{ + nm_auto_free_gstring GString *str = NULL; + int addr_family; + + g_return_val_if_fail (NM_IS_IP_ROUTING_RULE (self, TRUE), NULL); + + if (!_rr_string_validate (FALSE, to_string_flags, extra_args, error)) + return NULL; + + addr_family = nm_ip_routing_rule_get_addr_family (self); + + if (!NM_IN_SET (_rr_string_addr_family_from_flags (to_string_flags), + AF_UNSPEC, + addr_family)) { + g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("invalid address family")); + return NULL; + } + + /* It is only guaranteed that valid rules can be expressed as string. + * + * Still, unless requested proceed to convert to string without validating and + * hope for the best. + * + * That is, because self->from_str might contain an invalid IP address (indicated + * by self->from_valid). But we don't support serializing such arbitrary strings + * as "from %s". */ + if (NM_FLAGS_HAS (to_string_flags, NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE)) { + gs_free_error GError *local = NULL; + + if (!nm_ip_routing_rule_validate (self, &local)) { + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("rule is invalid: %s"), + local->message); + return NULL; + } + } + + str = g_string_sized_new (30); + + if (self->invert) + g_string_append (str, "not"); + + if (self->priority_has) { + g_string_append_printf (nm_gstring_add_space_delimiter (str), + "priority %u", + (guint) self->priority); + } + + _rr_string_append_inet_addr (str, + TRUE, + ( !self->to_has + || !self->to_valid), + addr_family, + &self->from_bin, + (self->from_has && self->from_valid) + ? self->from_len + : 0); + + _rr_string_append_inet_addr (str, + FALSE, + FALSE, + addr_family, + &self->to_bin, + (self->to_has && self->to_valid) + ? self->to_len + : 0); + + if (self->tos != 0) { + g_string_append_printf (nm_gstring_add_space_delimiter (str), + "tos 0x%02x", + (guint) self->tos); + } + + if (self->ipproto != 0) { + g_string_append_printf (nm_gstring_add_space_delimiter (str), + "ipproto %u", + (guint) self->ipproto); + } + + if ( self->fwmark != 0 + || self->fwmask != 0) { + if (self->fwmark != 0) { + g_string_append_printf (nm_gstring_add_space_delimiter (str), + "fwmark 0x%x", + self->fwmark); + } else { + g_string_append_printf (nm_gstring_add_space_delimiter (str), + "fwmark 0"); + } + if (self->fwmask != 0xFFFFFFFFu) { + if (self->fwmask != 0) + g_string_append_printf (str, "/0x%x", self->fwmask); + else + g_string_append_printf (str, "/0"); + } + } + + if ( self->sport_start != 0 + || self->sport_end != 0) { + g_string_append_printf (nm_gstring_add_space_delimiter (str), + "sport %u", + self->sport_start); + if (self->sport_start != self->sport_end) { + g_string_append_printf (str, + "-%u", + self->sport_end); + } + } + + if ( self->dport_start != 0 + || self->dport_end != 0) { + g_string_append_printf (nm_gstring_add_space_delimiter (str), + "dport %u", + self->dport_start); + if (self->dport_start != self->dport_end) { + g_string_append_printf (str, + "-%u", + self->dport_end); + } + } + + if (self->iifname) { + g_string_append (nm_gstring_add_space_delimiter (str), + "iif "); + _rr_string_append_escaped (str, self->iifname); + } + + if (self->oifname) { + g_string_append (nm_gstring_add_space_delimiter (str), + "oif "); + _rr_string_append_escaped (str, self->oifname); + } + + if (self->table != 0) { + g_string_append_printf (nm_gstring_add_space_delimiter (str), + "table %u", + (guint) self->table); + } + + return g_string_free (g_steal_pointer (&str), FALSE); +} + +/*****************************************************************************/ + NM_GOBJECT_PROPERTIES_DEFINE (NMSettingIPConfig, PROP_METHOD, PROP_DNS, @@ -1413,6 +3533,7 @@ typedef struct { int dns_priority; GPtrArray *addresses; /* array of NMIPAddress */ GPtrArray *routes; /* array of NMIPRoute */ + GPtrArray *routing_rules; gint64 route_metric; guint32 route_table; char *gateway; @@ -2314,6 +4435,225 @@ nm_setting_ip_config_get_route_table (NMSettingIPConfig *setting) return NM_SETTING_IP_CONFIG_GET_PRIVATE (setting)->route_table; } +/*****************************************************************************/ + +static void +_routing_rules_notify (NMSettingIPConfig *setting) +{ + _nm_setting_emit_property_changed (NM_SETTING (setting)); +} + +/** + * nm_setting_ip_config_get_num_routing_rules: + * @setting: the #NMSettingIPConfig + * + * Returns: the number of configured routing rules + * + * Since: 1.18 + **/ +guint +nm_setting_ip_config_get_num_routing_rules (NMSettingIPConfig *setting) +{ + NMSettingIPConfigPrivate *priv; + + g_return_val_if_fail (NM_IS_SETTING_IP_CONFIG (setting), 0); + + priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + return priv->routing_rules ? priv->routing_rules->len : 0u; +} + +/** + * nm_setting_ip_config_get_routing_rule: + * @setting: the #NMSettingIPConfig + * @idx: index number of the routing_rule to return + * + * Returns: (transfer none): the routing rule at index @idx + * + * Since: 1.18 + **/ +NMIPRoutingRule * +nm_setting_ip_config_get_routing_rule (NMSettingIPConfig *setting, guint idx) +{ + NMSettingIPConfigPrivate *priv; + + g_return_val_if_fail (NM_IS_SETTING_IP_CONFIG (setting), NULL); + + priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + + g_return_val_if_fail (priv->routing_rules && idx < priv->routing_rules->len, NULL); + + return priv->routing_rules->pdata[idx]; +} + +/** + * nm_setting_ip_config_add_routing_rule: + * @setting: the #NMSettingIPConfig + * @routing_rule: the #NMIPRoutingRule to add. The address family + * of the added rule must be compatible with the setting. + * + * Appends a new routing-rule and associated information to the setting. The + * given routing rules gets sealed and the reference count is incremented. + * The function does not check whether an identical rule already exists + * and always appends the rule to the end of the list. + * + * Since: 1.18 + **/ +void +nm_setting_ip_config_add_routing_rule (NMSettingIPConfig *setting, + NMIPRoutingRule *routing_rule) +{ + NMSettingIPConfigPrivate *priv; + + g_return_if_fail (NM_IS_SETTING_IP_CONFIG (setting)); + g_return_if_fail (NM_IS_IP_ROUTING_RULE (routing_rule, TRUE)); + g_return_if_fail (_ip_routing_rule_get_addr_family (routing_rule) == NM_SETTING_IP_CONFIG_GET_FAMILY (setting)); + + priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + + if (!priv->routing_rules) + priv->routing_rules = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_routing_rule_unref); + + nm_ip_routing_rule_seal (routing_rule); + g_ptr_array_add (priv->routing_rules, nm_ip_routing_rule_ref (routing_rule)); + _routing_rules_notify (setting); +} + +/** + * nm_setting_ip_config_remove_routing_rule: + * @setting: the #NMSettingIPConfig + * @idx: index number of the routing_rule + * + * Removes the routing_rule at index @idx. + * + * Since: 1.18 + **/ +void +nm_setting_ip_config_remove_routing_rule (NMSettingIPConfig *setting, + guint idx) +{ + NMSettingIPConfigPrivate *priv; + + g_return_if_fail (NM_IS_SETTING_IP_CONFIG (setting)); + + priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + g_return_if_fail (priv->routing_rules && idx < priv->routing_rules->len); + + g_ptr_array_remove_index (priv->routing_rules, idx); + _routing_rules_notify (setting); +} + +/** + * nm_setting_ip_config_clear_routing_rules: + * @setting: the #NMSettingIPConfig + * + * Removes all configured routing rules. + * + * Since: 1.18 + **/ +void +nm_setting_ip_config_clear_routing_rules (NMSettingIPConfig *setting) +{ + NMSettingIPConfigPrivate *priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + + g_return_if_fail (NM_IS_SETTING_IP_CONFIG (setting)); + + if ( priv->routing_rules + && priv->routing_rules->len > 0) { + g_ptr_array_set_size (priv->routing_rules, 0); + _routing_rules_notify (setting); + } +} + +static GVariant * +_routing_rules_dbus_only_synth (const NMSettInfoSetting *sett_info, + guint property_idx, + NMConnection *connection, + NMSetting *setting, + NMConnectionSerializationFlags flags) +{ + NMSettingIPConfig *self = NM_SETTING_IP_CONFIG (setting); + NMSettingIPConfigPrivate *priv; + GVariantBuilder builder; + gboolean any = FALSE; + guint i; + + priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (self); + + if ( !priv->routing_rules + || priv->routing_rules->len == 0) + return NULL; + + for (i = 0; i < priv->routing_rules->len; i++) { + GVariant *variant; + + variant = nm_ip_routing_rule_to_dbus (priv->routing_rules->pdata[i]); + if (!variant) + continue; + + if (!any) { + any = TRUE; + g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}")); + } + g_variant_builder_add (&builder, "@a{sv}", variant); + } + + return any ? g_variant_builder_end (&builder) : NULL; +} + +static gboolean +_routing_rules_dbus_only_set (NMSetting *setting, + GVariant *connection_dict, + const char *property, + GVariant *value, + NMSettingParseFlags parse_flags, + GError **error) +{ + GVariantIter iter_rules; + GVariant *rule_var; + guint i_rule; + gboolean success = FALSE; + gboolean rules_changed = FALSE; + + nm_assert (g_variant_is_of_type (value, G_VARIANT_TYPE ("aa{sv}"))); + + g_variant_iter_init (&iter_rules, value); + + i_rule = 0; + while (g_variant_iter_next (&iter_rules, "@a{sv}", &rule_var)) { + _nm_unused gs_unref_variant GVariant *rule_var_unref = rule_var; + nm_auto_unref_ip_routing_rule NMIPRoutingRule *rule = NULL; + gs_free_error GError *local = NULL; + + i_rule++; + + rule = nm_ip_routing_rule_from_dbus (rule_var, + NM_FLAGS_HAS (parse_flags, NM_SETTING_PARSE_FLAGS_STRICT), + &local); + if (!rule) { + if (NM_FLAGS_HAS (parse_flags, NM_SETTING_PARSE_FLAGS_STRICT)) { + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_MISSING_PROPERTY, + _("rule #%u is invalid: %s"), + i_rule, + local->message); + goto out; + } + continue; + } + + nm_setting_ip_config_add_routing_rule (NM_SETTING_IP_CONFIG (setting), rule); + rules_changed = TRUE; + } + + success = TRUE; + +out: + if (rules_changed) + _routing_rules_notify (NM_SETTING_IP_CONFIG (setting)); + return success; +} + +/*****************************************************************************/ + /** * nm_setting_ip_config_get_ignore_auto_routes: * @setting: the #NMSettingIPConfig @@ -2600,6 +4940,33 @@ verify (NMSetting *setting, NMConnection *connection, GError **error) } } + if (priv->routing_rules) { + for (i = 0; i < priv->routing_rules->len; i++) { + NMIPRoutingRule *rule = priv->routing_rules->pdata[i]; + gs_free_error GError *local = NULL; + + if (_ip_routing_rule_get_addr_family (rule) != NM_SETTING_IP_CONFIG_GET_FAMILY (setting)) { + g_set_error (error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("%u. rule has wrong address-family"), + i + 1); + g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), NM_SETTING_IP_CONFIG_ROUTING_RULES); + return FALSE; + } + if (!nm_ip_routing_rule_validate (rule, &local)) { + g_set_error (error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("%u. rule is invalid: %s"), + i + 1, + local->message); + g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), NM_SETTING_IP_CONFIG_ROUTES); + return FALSE; + } + } + } + if (priv->gateway && priv->never_default) { g_set_error (error, NM_CONNECTION_ERROR, @@ -2654,6 +5021,24 @@ compare_property (const NMSettInfoSetting *sett_info, return TRUE; } + if (nm_streq (sett_info->property_infos[property_idx].name, NM_SETTING_IP_CONFIG_ROUTING_RULES)) { + if (other) { + guint n; + + a_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + b_priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (other); + + n = (a_priv->routing_rules) ? a_priv->routing_rules->len : 0u; + if (n != (b_priv->routing_rules ? b_priv->routing_rules->len : 0u)) + return FALSE; + for (i = 0; i < n; i++) { + if (nm_ip_routing_rule_cmp (a_priv->routing_rules->pdata[i], b_priv->routing_rules->pdata[i]) != 0) + return FALSE; + } + } + return TRUE; + } + return NM_SETTING_CLASS (nm_setting_ip_config_parent_class)->compare_property (sett_info, property_idx, setting, @@ -2661,6 +5046,72 @@ compare_property (const NMSettInfoSetting *sett_info, flags); } +static void +duplicate_copy_properties (const NMSettInfoSetting *sett_info, + NMSetting *src, + NMSetting *dst) +{ + NMSettingIPConfigPrivate *priv_src = NM_SETTING_IP_CONFIG_GET_PRIVATE (src); + NMSettingIPConfigPrivate *priv_dst = NM_SETTING_IP_CONFIG_GET_PRIVATE (dst); + guint i; + gboolean changed = FALSE; + + NM_SETTING_CLASS (nm_setting_ip_config_parent_class)->duplicate_copy_properties (sett_info, + src, + dst); + + if ( priv_dst->routing_rules + && priv_dst->routing_rules->len > 0) { + changed = TRUE; + g_ptr_array_set_size (priv_dst->routing_rules, 0); + } + if ( priv_src->routing_rules + && priv_src->routing_rules->len > 0) { + changed = TRUE; + if (!priv_dst->routing_rules) + priv_dst->routing_rules = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_routing_rule_unref); + for (i = 0; i < priv_src->routing_rules->len; i++) { + g_ptr_array_add (priv_dst->routing_rules, + nm_ip_routing_rule_ref (priv_src->routing_rules->pdata[i])); + } + } + if (changed) + _routing_rules_notify (NM_SETTING_IP_CONFIG (dst)); +} + +static void +enumerate_values (const NMSettInfoProperty *property_info, + NMSetting *setting, + NMSettingValueIterFn func, + gpointer user_data) +{ + if (nm_streq (property_info->name, NM_SETTING_IP_CONFIG_ROUTING_RULES)) { + NMSettingIPConfigPrivate *priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + nm_auto_unset_gvalue GValue value = G_VALUE_INIT; + GPtrArray *ptr = NULL; + guint i; + + if (priv->routing_rules && priv->routing_rules->len > 0) { + ptr = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_routing_rule_unref); + for (i = 0; i < priv->routing_rules->len; i++) + g_ptr_array_add (ptr, nm_ip_routing_rule_ref (priv->routing_rules->pdata[i])); + } + g_value_init (&value, G_TYPE_PTR_ARRAY); + g_value_take_boxed (&value, ptr); + func (setting, + property_info->name, + &value, + 0, + user_data); + return; + } + + NM_SETTING_CLASS (nm_setting_ip_config_parent_class)->enumerate_values (property_info, + setting, + func, + user_data); +} + /*****************************************************************************/ static gboolean @@ -2693,6 +5144,18 @@ _nm_sett_info_property_override_create_array_ip_config (void) ip_gateway_set, NULL); + /* ---dbus--- + * property: routing-rules + * format: array of 'a{sv}' + * description: Array of dictionaries for routing rules. + * ---end--- + */ + _properties_override_add_dbus_only (properties_override, + NM_SETTING_IP_CONFIG_ROUTING_RULES, + G_VARIANT_TYPE ("aa{sv}"), + _routing_rules_dbus_only_synth, + _routing_rules_dbus_only_set); + return properties_override; } @@ -2900,6 +5363,8 @@ finalize (GObject *object) g_ptr_array_unref (priv->dns_options); g_ptr_array_unref (priv->addresses); g_ptr_array_unref (priv->routes); + if (priv->routing_rules) + g_ptr_array_unref (priv->routing_rules); G_OBJECT_CLASS (nm_setting_ip_config_parent_class)->finalize (object); } @@ -2916,8 +5381,10 @@ nm_setting_ip_config_class_init (NMSettingIPConfigClass *klass) object_class->set_property = set_property; object_class->finalize = finalize; - setting_class->verify = verify; - setting_class->compare_property = compare_property; + setting_class->verify = verify; + setting_class->compare_property = compare_property; + setting_class->duplicate_copy_properties = duplicate_copy_properties; + setting_class->enumerate_values = enumerate_values; /** * NMSettingIPConfig:method: diff --git a/libnm-core/nm-setting-ip-config.h b/libnm-core/nm-setting-ip-config.h index 39cb36a43d..09b80f72a9 100644 --- a/libnm-core/nm-setting-ip-config.h +++ b/libnm-core/nm-setting-ip-config.h @@ -159,6 +159,153 @@ gboolean nm_ip_route_attribute_validate (const char *name, #define NM_IP_ROUTE_ATTRIBUTE_LOCK_INITRWND "lock-initrwnd" #define NM_IP_ROUTE_ATTRIBUTE_LOCK_MTU "lock-mtu" +/*****************************************************************************/ + +typedef struct NMIPRoutingRule NMIPRoutingRule; + +NM_AVAILABLE_IN_1_18 +GType nm_ip_routing_rule_get_type (void); + +NM_AVAILABLE_IN_1_18 +NMIPRoutingRule *nm_ip_routing_rule_new (int addr_family); + +NM_AVAILABLE_IN_1_18 +NMIPRoutingRule *nm_ip_routing_rule_new_clone (const NMIPRoutingRule *rule); + +NM_AVAILABLE_IN_1_18 +NMIPRoutingRule *nm_ip_routing_rule_ref (NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_unref (NMIPRoutingRule *self); + +NM_AVAILABLE_IN_1_18 +gboolean nm_ip_routing_rule_is_sealed (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_seal (NMIPRoutingRule *self); + +NM_AVAILABLE_IN_1_18 +int nm_ip_routing_rule_get_addr_family (const NMIPRoutingRule *self); + +NM_AVAILABLE_IN_1_18 +gboolean nm_ip_routing_rule_get_invert (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_invert (NMIPRoutingRule *self, gboolean invert); + +NM_AVAILABLE_IN_1_18 +gint64 nm_ip_routing_rule_get_priority (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_priority (NMIPRoutingRule *self, gint64 priority); + +NM_AVAILABLE_IN_1_18 +guint8 nm_ip_routing_rule_get_tos (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_tos (NMIPRoutingRule *self, guint8 tos); + +NM_AVAILABLE_IN_1_18 +guint8 nm_ip_routing_rule_get_ipproto (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_ipproto (NMIPRoutingRule *self, guint8 ipproto); + +NM_AVAILABLE_IN_1_18 +guint16 nm_ip_routing_rule_get_source_port_start (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +guint16 nm_ip_routing_rule_get_source_port_end (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_source_port (NMIPRoutingRule *self, guint16 start, guint16 end); + +NM_AVAILABLE_IN_1_18 +guint16 nm_ip_routing_rule_get_destination_port_start (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +guint16 nm_ip_routing_rule_get_destination_port_end (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_destination_port (NMIPRoutingRule *self, guint16 start, guint16 end); + +NM_AVAILABLE_IN_1_18 +guint32 nm_ip_routing_rule_get_fwmark (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +guint32 nm_ip_routing_rule_get_fwmask (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_fwmark (NMIPRoutingRule *self, guint32 fwmark, guint32 fwmask); + +NM_AVAILABLE_IN_1_18 +guint8 nm_ip_routing_rule_get_from_len (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +const char *nm_ip_routing_rule_get_from (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_from (NMIPRoutingRule *self, + const char *from, + guint8 len); + +NM_AVAILABLE_IN_1_18 +guint8 nm_ip_routing_rule_get_to_len (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +const char *nm_ip_routing_rule_get_to (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_to (NMIPRoutingRule *self, + const char *to, + guint8 len); + +NM_AVAILABLE_IN_1_18 +const char *nm_ip_routing_rule_get_iifname (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_iifname (NMIPRoutingRule *self, const char *iifname); + +NM_AVAILABLE_IN_1_18 +const char *nm_ip_routing_rule_get_oifname (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_oifname (NMIPRoutingRule *self, const char *oifname); + +NM_AVAILABLE_IN_1_18 +guint8 nm_ip_routing_rule_get_action (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_action (NMIPRoutingRule *self, guint8 action); + +NM_AVAILABLE_IN_1_18 +guint32 nm_ip_routing_rule_get_table (const NMIPRoutingRule *self); +NM_AVAILABLE_IN_1_18 +void nm_ip_routing_rule_set_table (NMIPRoutingRule *self, guint32 table); + +NM_AVAILABLE_IN_1_18 +int nm_ip_routing_rule_cmp (const NMIPRoutingRule *rule, + const NMIPRoutingRule *other); + +NM_AVAILABLE_IN_1_18 +gboolean nm_ip_routing_rule_validate (const NMIPRoutingRule *self, + GError **error); + +/** + * NMIPRoutingRuleAsStringFlags: + * @NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE: no flags selected. + * @NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET: whether to allow parsing + * IPv4 addresses. + * @NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6: whether to allow parsing + * IPv6 addresses. If both @NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET and + * @NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6 are unset, it's the same + * as setting them both. + * @NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE: if set, ensure that the + * rule verfies or fail. + * + * Since: 1.18 + */ +typedef enum { /*< flags >*/ + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE = 0, + + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET = 0x1, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6 = 0x2, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE = 0x4, +} NMIPRoutingRuleAsStringFlags; + +NMIPRoutingRule *nm_ip_routing_rule_from_string (const char *str, + NMIPRoutingRuleAsStringFlags to_string_flags, + GHashTable *extra_args, + GError **error); + +char *nm_ip_routing_rule_to_string (const NMIPRoutingRule *self, + NMIPRoutingRuleAsStringFlags to_string_flags, + GHashTable *extra_args, + GError **error); + +/*****************************************************************************/ + #define NM_TYPE_SETTING_IP_CONFIG (nm_setting_ip_config_get_type ()) #define NM_SETTING_IP_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_IP_CONFIG, NMSettingIPConfig)) #define NM_SETTING_IP_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_IPCONFIG, NMSettingIPConfigClass)) @@ -187,6 +334,9 @@ gboolean nm_ip_route_attribute_validate (const char *name, #define NM_SETTING_IP_CONFIG_DAD_TIMEOUT "dad-timeout" #define NM_SETTING_IP_CONFIG_DHCP_TIMEOUT "dhcp-timeout" +/* these are not real GObject properties. */ +#define NM_SETTING_IP_CONFIG_ROUTING_RULES "routing-rules" + #define NM_SETTING_DNS_OPTION_DEBUG "debug" #define NM_SETTING_DNS_OPTION_NDOTS "ndots" #define NM_SETTING_DNS_OPTION_TIMEOUT "timeout" @@ -289,6 +439,20 @@ gint64 nm_setting_ip_config_get_route_metric (NMSettingIPConfig NM_AVAILABLE_IN_1_10 guint32 nm_setting_ip_config_get_route_table (NMSettingIPConfig *setting); +NM_AVAILABLE_IN_1_18 +guint nm_setting_ip_config_get_num_routing_rules (NMSettingIPConfig *setting); +NM_AVAILABLE_IN_1_18 +NMIPRoutingRule *nm_setting_ip_config_get_routing_rule (NMSettingIPConfig *setting, + guint idx); +NM_AVAILABLE_IN_1_18 +void nm_setting_ip_config_add_routing_rule (NMSettingIPConfig *setting, + NMIPRoutingRule *routing_rule); +NM_AVAILABLE_IN_1_18 +void nm_setting_ip_config_remove_routing_rule (NMSettingIPConfig *setting, + guint idx); +NM_AVAILABLE_IN_1_18 +void nm_setting_ip_config_clear_routing_rules (NMSettingIPConfig *setting); + gboolean nm_setting_ip_config_get_ignore_auto_routes (NMSettingIPConfig *setting); gboolean nm_setting_ip_config_get_ignore_auto_dns (NMSettingIPConfig *setting); diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index 88cdee36e3..dbeb6601f4 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -4541,6 +4541,29 @@ _nm_utils_generate_mac_address_mask_parse (const char *value, /*****************************************************************************/ +gboolean +nm_utils_is_valid_iface_name_utf8safe (const char *utf8safe_name) +{ + gs_free gpointer bin_to_free = NULL; + gconstpointer bin; + gsize len; + + g_return_val_if_fail (utf8safe_name, FALSE); + + bin = nm_utils_buf_utf8safe_unescape (utf8safe_name, &len, &bin_to_free); + + if (bin_to_free) { + /* some unescaping happened... */ + + if (len != strlen (bin)) { + /* there are embedded NUL chars. Invalid. */ + return FALSE; + } + } + + return nm_utils_is_valid_iface_name (bin, NULL); +} + /** * nm_utils_is_valid_iface_name: * @name: Name of interface diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c index 6d5eeb2810..98e5837176 100644 --- a/libnm-core/tests/test-general.c +++ b/libnm-core/tests/test-general.c @@ -2710,6 +2710,7 @@ test_connection_diff_a_only (void) { NM_SETTING_IP_CONFIG_ROUTES, NM_SETTING_DIFF_RESULT_IN_A }, { NM_SETTING_IP_CONFIG_ROUTE_METRIC, NM_SETTING_DIFF_RESULT_IN_A }, { NM_SETTING_IP_CONFIG_ROUTE_TABLE, NM_SETTING_DIFF_RESULT_IN_A }, + { NM_SETTING_IP_CONFIG_ROUTING_RULES, NM_SETTING_DIFF_RESULT_IN_A }, { NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES, NM_SETTING_DIFF_RESULT_IN_A }, { NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, NM_SETTING_DIFF_RESULT_IN_A }, { NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID, NM_SETTING_DIFF_RESULT_IN_A }, diff --git a/libnm-core/tests/test-setting.c b/libnm-core/tests/test-setting.c index dc624d1ba3..bd6b4e7fd2 100644 --- a/libnm-core/tests/test-setting.c +++ b/libnm-core/tests/test-setting.c @@ -20,6 +20,7 @@ #include "nm-default.h" #include <linux/pkt_sched.h> +#include <net/if.h> #include "nm-utils.h" #include "nm-utils-private.h" @@ -2361,7 +2362,16 @@ test_roundtrip_conversion (gconstpointer test_data) NMSettingConnection *s_con = NULL; NMSettingWired *s_eth = NULL; NMSettingWireGuard *s_wg = NULL; + union { + struct { + NMSettingIPConfig *s_6; + NMSettingIPConfig *s_4; + }; + NMSettingIPConfig *s_x[2]; + } s_ip; + int is_ipv4; guint i; + gboolean success; switch (MODE) { case 0: @@ -2548,6 +2558,89 @@ test_roundtrip_conversion (gconstpointer test_data) _rndt_wg_peers_assert_equal (s_wg, wg_peers, TRUE, TRUE, FALSE); break; + case 3: + con = nmtst_create_minimal_connection (ID, UUID, NM_SETTING_WIRED_SETTING_NAME, &s_con); + g_object_set (s_con, + NM_SETTING_CONNECTION_INTERFACE_NAME, + INTERFACE_NAME, + NULL); + nmtst_connection_normalize (con); + + s_eth = NM_SETTING_WIRED (nm_connection_get_setting (con, NM_TYPE_SETTING_WIRED)); + g_assert (NM_IS_SETTING_WIRED (s_eth)); + + g_object_set (s_eth, + NM_SETTING_WIRED_MTU, + ETH_MTU, + NULL); + + s_ip.s_4 = NM_SETTING_IP_CONFIG (nm_connection_get_setting (con, NM_TYPE_SETTING_IP4_CONFIG)); + g_assert (NM_IS_SETTING_IP4_CONFIG (s_ip.s_4)); + + s_ip.s_6 = NM_SETTING_IP_CONFIG (nm_connection_get_setting (con, NM_TYPE_SETTING_IP6_CONFIG)); + g_assert (NM_IS_SETTING_IP6_CONFIG (s_ip.s_6)); + + for (is_ipv4 = 0; is_ipv4 < 2; is_ipv4++) { + g_assert (NM_IS_SETTING_IP_CONFIG (s_ip.s_x[is_ipv4])); + for (i = 0; i < 3; i++) { + char addrstr[NM_UTILS_INET_ADDRSTRLEN]; + + nm_auto_unref_ip_routing_rule NMIPRoutingRule *rr = NULL; + + rr = nm_ip_routing_rule_new (is_ipv4 ? AF_INET : AF_INET6); + nm_ip_routing_rule_set_priority (rr, i + 1); + if (i > 0) { + if (is_ipv4) + nm_sprintf_buf (addrstr, "192.168.%u.0", i); + else + nm_sprintf_buf (addrstr, "1:2:3:%x::", 10 + i); + nm_ip_routing_rule_set_from (rr, addrstr, is_ipv4 ? 24 + i : 64 + i); + } + nm_ip_routing_rule_set_table (rr, 1000 + i); + + success = nm_ip_routing_rule_validate (rr, &error); + nmtst_assert_success (success, error); + + nm_setting_ip_config_add_routing_rule (s_ip.s_x[is_ipv4], rr); + } + } + + g_ptr_array_add (kf_data_arr, + g_strdup_printf ("[connection]\n" + "id=%s\n" + "uuid=%s\n" + "type=ethernet\n" + "interface-name=%s\n" + "permissions=\n" + "\n" + "[ethernet]\n" + "mac-address-blacklist=\n" + "%s" /* mtu */ + "\n" + "[ipv4]\n" + "dns-search=\n" + "method=auto\n" + "routing-rule1=priority 1 from 0.0.0.0/0 table 1000\n" + "routing-rule2=priority 2 from 192.168.1.0/25 table 1001\n" + "routing-rule3=priority 3 from 192.168.2.0/26 table 1002\n" + "\n" + "[ipv6]\n" + "addr-gen-mode=stable-privacy\n" + "dns-search=\n" + "method=auto\n" + "routing-rule1=priority 1 from ::/0 table 1000\n" + "routing-rule2=priority 2 from 1:2:3:b::/65 table 1001\n" + "routing-rule3=priority 3 from 1:2:3:c::/66 table 1002\n" + "", + ID, + UUID, + INTERFACE_NAME, + (ETH_MTU != 0) + ? nm_sprintf_bufa (100, "mtu=%u\n", ETH_MTU) + : "")); + + break; + default: g_assert_not_reached (); } @@ -2675,6 +2768,203 @@ test_roundtrip_conversion (gconstpointer test_data) /*****************************************************************************/ +static NMIPRoutingRule * +_rr_from_str_get_impl (const char *str, const char *const*aliases) +{ + nm_auto_unref_ip_routing_rule NMIPRoutingRule *rr = NULL; + gs_free_error GError *error = NULL; + gboolean vbool; + int addr_family; + int i; + NMIPRoutingRuleAsStringFlags to_string_flags; + + rr = nm_ip_routing_rule_from_string (str, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE, + NULL, + &error); + nmtst_assert_success (rr, error); + + addr_family = nm_ip_routing_rule_get_addr_family (rr); + g_assert (NM_IN_SET (addr_family, AF_INET, AF_INET6)); + + if (addr_family == AF_INET) + to_string_flags = NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET; + else + to_string_flags = NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6; + + for (i = 0; TRUE; i++) { + nm_auto_unref_ip_routing_rule NMIPRoutingRule *rr2 = NULL; + gs_free char *str1 = NULL; + gs_unref_variant GVariant *variant1 = NULL; + const char *cstr1; + + switch (i) { + case 0: + rr2 = nm_ip_routing_rule_ref (rr); + break; + + case 1: + rr2 = nm_ip_routing_rule_from_string (str, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE + | (nmtst_get_rand_bool () ? to_string_flags : NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE), + NULL, + &error); + nmtst_assert_success (rr, error); + break; + + case 2: + str1 = nm_ip_routing_rule_to_string (rr, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE + | (nmtst_get_rand_bool () ? to_string_flags : NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE), + NULL, + &error); + nmtst_assert_success (str1 && str1[0], error); + + g_assert_cmpstr (str, ==, str1); + + rr2 = nm_ip_routing_rule_from_string (str1, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE + | (nmtst_get_rand_bool () ? to_string_flags : NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE), + NULL, + &error); + nmtst_assert_success (rr, error); + break; + + case 3: + variant1 = nm_ip_routing_rule_to_dbus (rr); + g_assert (variant1); + g_assert (g_variant_is_floating (variant1)); + g_assert (g_variant_is_of_type (variant1, G_VARIANT_TYPE_VARDICT)); + + rr2 = nm_ip_routing_rule_from_dbus (variant1, + TRUE, + &error); + nmtst_assert_success (rr, error); + break; + + default: + if (!aliases || !aliases[0]) + goto done; + cstr1 = (aliases++)[0]; + rr2 = nm_ip_routing_rule_from_string (cstr1, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE + | (nmtst_get_rand_bool () ? to_string_flags : NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE), + NULL, + &error); + nmtst_assert_success (rr, error); + break; + } + + g_assert (rr2); + vbool = nm_ip_routing_rule_validate (rr, &error); + nmtst_assert_success (vbool, error); + vbool = nm_ip_routing_rule_validate (rr2, &error); + nmtst_assert_success (vbool, error); + + g_assert_cmpint (nm_ip_routing_rule_cmp (rr, rr2), ==, 0); + g_assert_cmpint (nm_ip_routing_rule_cmp (rr2, rr), ==, 0); + } + +done: + return g_steal_pointer (&rr); +} +#define _rr_from_str_get(a, ...) _rr_from_str_get_impl (a, &(NM_MAKE_STRV (NULL, ##__VA_ARGS__))[1]) + +#define _rr_from_str(...) \ + G_STMT_START { \ + nm_auto_unref_ip_routing_rule NMIPRoutingRule *_rr = NULL; \ + \ + _rr = _rr_from_str_get (__VA_ARGS__); \ + g_assert (_rr); \ + } G_STMT_END + +static void +test_routing_rule (gconstpointer test_data) +{ + nm_auto_unref_ip_routing_rule NMIPRoutingRule *rr1 = NULL; + gboolean success; + char ifname_buf[16]; + + _rr_from_str ("priority 5 from 0.0.0.0 table 1", + " from 0.0.0\\.0 \\priority 5 lookup 1 "); + _rr_from_str ("priority 5 from 0.0.0.0/0 table 4"); + _rr_from_str ("priority 5 to 0.0.0.0 table 6"); + _rr_from_str ("priority 5 to 0.0.0.0 table 254", + "priority 5 to 0.0.0.0/32"); + _rr_from_str ("priority 5 from 1.2.3.4 table 15", + "priority 5 from 1.2.3.4/32 table 0xF ", + "priority 5 from 1.2.3.4/32 to 0.0.0.0/0 lookup 15 "); + _rr_from_str ("priority 5 from 1.2.3.4 to 0.0.0.0 table 8"); + _rr_from_str ("priority 5 to a:b:c:: tos 0x16 table 25", + "priority 5 to a:b:c::/128 table 0x19 tos 16", + "priority 5 to a:b:c::/128 lookup 0x19 dsfield 16", + "priority 5 to a:b:c::/128 lookup 0x19 dsfield 16 fwmark 0/0x00", + "priority 5 to a:b:c:: from all lookup 0x19 dsfield 16 fwmark 0x0/0"); + _rr_from_str ("priority 5 from :: fwmark 0 table 25", + "priority 5 from ::/128 to all table 0x19 fwmark 0/0xFFFFFFFF", + "priority 5 from :: to ::/0 table 0x19 fwmark 0x00/4294967295"); + _rr_from_str ("priority 5 from :: iif aab table 25"); + _rr_from_str ("priority 5 from :: iif aab oif er table 25", + "priority 5 from :: table 0x19 dev \\a\\a\\b oif er"); + _rr_from_str ("priority 5 from :: iif a\\\\303b table 25"); + _rr_from_str ("priority 5 to 0.0.0.0 sport 10 table 6", + "priority 5 to 0.0.0.0 sport 10-10 table 6"); + _rr_from_str ("not priority 5 to 0.0.0.0 dport 10-133 table 6", + "priority 5 to 0.0.0.0 not dport 10-133 not table 6", + "priority 5 to 0.0.0.0 not dport 10-\\ 133 not table 6"); + _rr_from_str ("priority 5 to 0.0.0.0 ipproto 10 sport 10 table 6"); + + rr1 = _rr_from_str_get ("priority 5 from :: iif aab table 25"); + g_assert_cmpstr (nm_ip_routing_rule_get_iifname (rr1), ==, "aab"); + success = nm_ip_routing_rule_get_xifname_bin (rr1, FALSE, ifname_buf); + g_assert (!success); + success = nm_ip_routing_rule_get_xifname_bin (rr1, TRUE, ifname_buf); + g_assert_cmpstr (ifname_buf, ==, "aab"); + g_assert (success); + + rr1 = _rr_from_str_get ("priority 5 from :: iif a\\\\303\\\\261xb table 254"); + g_assert_cmpstr (nm_ip_routing_rule_get_iifname (rr1), ==, "a\\303\\261xb"); + success = nm_ip_routing_rule_get_xifname_bin (rr1, FALSE, ifname_buf); + g_assert (!success); + success = nm_ip_routing_rule_get_xifname_bin (rr1, TRUE, ifname_buf); + g_assert_cmpstr (ifname_buf, ==, "a\303\261xb"); + g_assert (success); + nm_clear_pointer (&rr1, nm_ip_routing_rule_unref); + + rr1 = _rr_from_str_get ("priority 5 from :: oif \\\\101=\\\\303\\\\261xb table 7"); + g_assert_cmpstr (nm_ip_routing_rule_get_oifname (rr1), ==, "\\101=\\303\\261xb"); + success = nm_ip_routing_rule_get_xifname_bin (rr1, FALSE, ifname_buf); + g_assert_cmpstr (ifname_buf, ==, "A=\303\261xb"); + g_assert (success); + success = nm_ip_routing_rule_get_xifname_bin (rr1, TRUE, ifname_buf); + g_assert (!success); + nm_clear_pointer (&rr1, nm_ip_routing_rule_unref); + + rr1 = _rr_from_str_get ("priority 5 to 0.0.0.0 tos 0x10 table 7"); + g_assert_cmpstr (NULL, ==, nm_ip_routing_rule_get_from (rr1)); + g_assert (!nm_ip_routing_rule_get_from_bin (rr1)); + g_assert_cmpint (0, ==, nm_ip_routing_rule_get_from_len (rr1)); + g_assert_cmpstr ("0.0.0.0", ==, nm_ip_routing_rule_get_to (rr1)); + g_assert (nm_ip_addr_is_null (AF_INET, nm_ip_routing_rule_get_to_bin (rr1))); + g_assert_cmpint (32, ==, nm_ip_routing_rule_get_to_len (rr1)); + g_assert_cmpint (7, ==, nm_ip_routing_rule_get_table (rr1)); + g_assert_cmpint (0x10, ==, nm_ip_routing_rule_get_tos (rr1)); + nm_clear_pointer (&rr1, nm_ip_routing_rule_unref); + + rr1 = _rr_from_str_get ("priority 5 from :: iif a\\\\303\\\\261\\,x\\;b table 254", + "priority 5 from :: iif a\\\\303\\\\261,x;b table 254"); + g_assert_cmpstr (nm_ip_routing_rule_get_iifname (rr1), ==, "a\\303\\261,x;b"); + success = nm_ip_routing_rule_get_xifname_bin (rr1, FALSE, ifname_buf); + g_assert (!success); + success = nm_ip_routing_rule_get_xifname_bin (rr1, TRUE, ifname_buf); + g_assert_cmpstr (ifname_buf, ==, "a\303\261,x;b"); + g_assert (success); + nm_clear_pointer (&rr1, nm_ip_routing_rule_unref); + +} + +/*****************************************************************************/ + NMTST_DEFINE (); int @@ -2753,9 +3043,12 @@ main (int argc, char **argv) g_test_add_func ("/libnm/settings/team-port/sycn_from_config_full", test_team_port_full_config); #endif - g_test_add_data_func ("/libnm/settings/roundtrip-conversion/general/0", GINT_TO_POINTER (0), test_roundtrip_conversion); + g_test_add_data_func ("/libnm/settings/roundtrip-conversion/general/0", GINT_TO_POINTER (0), test_roundtrip_conversion); g_test_add_data_func ("/libnm/settings/roundtrip-conversion/wireguard/1", GINT_TO_POINTER (1), test_roundtrip_conversion); g_test_add_data_func ("/libnm/settings/roundtrip-conversion/wireguard/2", GINT_TO_POINTER (2), test_roundtrip_conversion); + g_test_add_data_func ("/libnm/settings/roundtrip-conversion/general/3", GINT_TO_POINTER (3), test_roundtrip_conversion); + + g_test_add_data_func ("/libnm/settings/routing-rule/1", GINT_TO_POINTER (0), test_routing_rule); return g_test_run (); } diff --git a/libnm/libnm.ver b/libnm/libnm.ver index c2780cca81..ac8c7b97cf 100644 --- a/libnm/libnm.ver +++ b/libnm/libnm.ver @@ -1536,13 +1536,57 @@ global: nm_bridge_vlan_set_untagged; nm_bridge_vlan_to_str; nm_bridge_vlan_unref; + nm_ip_routing_rule_as_string_flags_get_type; + nm_ip_routing_rule_cmp; + nm_ip_routing_rule_from_string; + nm_ip_routing_rule_get_action; + nm_ip_routing_rule_get_addr_family; + nm_ip_routing_rule_get_destination_port_end; + nm_ip_routing_rule_get_destination_port_start; + nm_ip_routing_rule_get_from; + nm_ip_routing_rule_get_from_len; + nm_ip_routing_rule_get_fwmark; + nm_ip_routing_rule_get_fwmask; + nm_ip_routing_rule_get_iifname; + nm_ip_routing_rule_get_invert; + nm_ip_routing_rule_get_ipproto; + nm_ip_routing_rule_get_oifname; + nm_ip_routing_rule_get_priority; + nm_ip_routing_rule_get_source_port_end; + nm_ip_routing_rule_get_source_port_start; + nm_ip_routing_rule_get_table; + nm_ip_routing_rule_get_to; + nm_ip_routing_rule_get_to_len; + nm_ip_routing_rule_get_tos; + nm_ip_routing_rule_get_type; + nm_ip_routing_rule_is_sealed; + nm_ip_routing_rule_new; + nm_ip_routing_rule_new_clone; + nm_ip_routing_rule_ref; + nm_ip_routing_rule_seal; + nm_ip_routing_rule_set_action; + nm_ip_routing_rule_set_destination_port; + nm_ip_routing_rule_set_from; + nm_ip_routing_rule_set_fwmark; + nm_ip_routing_rule_set_iifname; + nm_ip_routing_rule_set_invert; + nm_ip_routing_rule_set_ipproto; + nm_ip_routing_rule_set_oifname; + nm_ip_routing_rule_set_priority; + nm_ip_routing_rule_set_source_port; + nm_ip_routing_rule_set_table; + nm_ip_routing_rule_set_to; + nm_ip_routing_rule_set_tos; + nm_ip_routing_rule_to_string; + nm_ip_routing_rule_unref; + nm_ip_routing_rule_validate; nm_lldp_neighbor_get_attr_value; nm_setting_bridge_add_vlan; nm_setting_bridge_clear_vlans; nm_setting_bridge_get_num_vlans; nm_setting_bridge_get_vlan; - nm_setting_bridge_get_vlan_filtering; nm_setting_bridge_get_vlan_default_pvid; + nm_setting_bridge_get_vlan_filtering; nm_setting_bridge_port_add_vlan; nm_setting_bridge_port_clear_vlans; nm_setting_bridge_port_get_num_vlans; @@ -1551,4 +1595,9 @@ global: nm_setting_bridge_port_remove_vlan_by_vid; nm_setting_bridge_remove_vlan; nm_setting_bridge_remove_vlan_by_vid; + nm_setting_ip_config_add_routing_rule; + nm_setting_ip_config_clear_routing_rules; + nm_setting_ip_config_get_num_routing_rules; + nm_setting_ip_config_get_routing_rule; + nm_setting_ip_config_remove_routing_rule; } libnm_1_16_0; diff --git a/shared/nm-libnm-core-utils.h b/shared/nm-libnm-core-utils.h index 85dd3b9b2c..f55d6b3cc0 100644 --- a/shared/nm-libnm-core-utils.h +++ b/shared/nm-libnm-core-utils.h @@ -38,6 +38,9 @@ NM_AUTO_DEFINE_FCN0 (NMIPAddress *, _nm_ip_address_unref, nm_ip_address_unref) #define nm_auto_unref_ip_route nm_auto (_nm_auto_unref_ip_route) NM_AUTO_DEFINE_FCN0 (NMIPRoute *, _nm_auto_unref_ip_route, nm_ip_route_unref) +#define nm_auto_unref_ip_routing_rule nm_auto(_nm_auto_unref_ip_routing_rule) +NM_AUTO_DEFINE_FCN0 (NMIPRoutingRule *, _nm_auto_unref_ip_routing_rule, nm_ip_routing_rule_unref) + #define nm_auto_unref_sriov_vf nm_auto (_nm_auto_unref_sriov_vf) NM_AUTO_DEFINE_FCN0 (NMSriovVF *, _nm_auto_unref_sriov_vf, nm_sriov_vf_unref) diff --git a/shared/nm-utils/nm-shared-utils.c b/shared/nm-utils/nm-shared-utils.c index 215a87b59b..33d7ad12f2 100644 --- a/shared/nm-utils/nm-shared-utils.c +++ b/shared/nm-utils/nm-shared-utils.c @@ -2505,6 +2505,59 @@ _nm_utils_unescape_plain (char *str, const char *candidates, gboolean do_strip) return str; } +char * +nm_utils_str_simpletokens_extract_next (char **p_line_start) +{ + char *s_next; + char *s_start; + gsize j; + + s_start = *p_line_start; + if (!s_start) + return NULL; + + s_start = nm_str_skip_leading_spaces (s_start); + + if (s_start[0] == '\0') { + *p_line_start = s_start; + return NULL; + } + + s_next = s_start; + j = 0; + while (TRUE) { + if (s_next[0] == '\0') { + s_start[j] = '\0'; + *p_line_start = s_next; + return s_start; + } + if (s_next[0] == '\\') { + s_next++; + if (s_next[0] == '\0') { + /* trailing backslash at end of word. That's an error, + * but we silently drop the backslash and signal success. */ + *p_line_start = s_next; + if (j == 0) + return NULL; + s_start[j] = '\0'; + return s_start; + } + + s_start[j++] = (s_next++)[0]; + continue; + } + if (!g_ascii_isspace (s_next[0])) { + s_start[j++] = (s_next++)[0]; + continue; + } + + nm_assert (j > 0); + s_start[j] = '\0'; + *p_line_start = nm_str_skip_leading_spaces (&s_next[1]); + return s_start; + } +} + /*****************************************************************************/ typedef struct { diff --git a/shared/nm-utils/nm-shared-utils.h b/shared/nm-utils/nm-shared-utils.h index f48bfede7e..af9e1cf6e9 100644 --- a/shared/nm-utils/nm-shared-utils.h +++ b/shared/nm-utils/nm-shared-utils.h @@ -126,6 +126,16 @@ typedef struct { extern const NMIPAddr nm_ip_addr_zero; +static inline gboolean +nm_ip_addr_is_null (int addr_family, gconstpointer addr) +{ + nm_assert (addr); + if (addr_family == AF_INET6) + return IN6_IS_ADDR_UNSPECIFIED ((const struct in6_addr *) addr); + nm_assert (addr_family == AF_INET); + return ((const struct in_addr *) addr)->s_addr == 0; +} + static inline void nm_ip_addr_set (int addr_family, gpointer dst, gconstpointer src) { @@ -436,6 +446,8 @@ int nm_utils_dbus_path_cmp (const char *dbus_path_a, const char *dbus_path_b); const char **nm_utils_strsplit_set (const char *str, const char *delimiters, gboolean allow_escaping); +char *nm_utils_str_simpletokens_extract_next (char **p_line_start); + gssize nm_utils_strv_find_first (char **list, gssize len, const char *needle); char **_nm_utils_strv_cleanup (char **strv, diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c index 71bfbf7c10..0f63239129 100644 --- a/src/NetworkManagerUtils.c +++ b/src/NetworkManagerUtils.c @@ -23,6 +23,8 @@ #include "NetworkManagerUtils.h" +#include <linux/fib_rules.h> + #include "nm-utils/nm-c-list.h" #include "nm-common-macros.h" @@ -908,6 +910,48 @@ nm_match_spec_device_by_pllink (const NMPlatformLink *pllink, /*****************************************************************************/ +NMPlatformRoutingRule * +nm_ip_routing_rule_to_platform (const NMIPRoutingRule *rule, + NMPlatformRoutingRule *out_pl) +{ + nm_assert (rule); + nm_assert (nm_ip_routing_rule_validate (rule, NULL)); + nm_assert (out_pl); + + *out_pl = (NMPlatformRoutingRule) { + .addr_family = nm_ip_routing_rule_get_addr_family (rule), + .flags = ( nm_ip_routing_rule_get_invert (rule) + ? FIB_RULE_INVERT + : 0), + .priority = nm_ip_routing_rule_get_priority (rule), + .tos = nm_ip_routing_rule_get_tos (rule), + .ip_proto = nm_ip_routing_rule_get_ipproto (rule), + .fwmark = nm_ip_routing_rule_get_fwmark (rule), + .fwmask = nm_ip_routing_rule_get_fwmask (rule), + .sport_range = { + .start = nm_ip_routing_rule_get_source_port_start (rule), + .end = nm_ip_routing_rule_get_source_port_end (rule), + }, + .dport_range = { + .start = nm_ip_routing_rule_get_destination_port_start (rule), + .end = nm_ip_routing_rule_get_destination_port_end (rule), + }, + .src = *(nm_ip_routing_rule_get_from_bin (rule) ?: &nm_ip_addr_zero), + .dst = *(nm_ip_routing_rule_get_to_bin (rule) ?: &nm_ip_addr_zero), + .src_len = nm_ip_routing_rule_get_from_len (rule), + .dst_len = nm_ip_routing_rule_get_to_len (rule), + .action = nm_ip_routing_rule_get_action (rule), + .table = nm_ip_routing_rule_get_table (rule), + }; + + nm_ip_routing_rule_get_xifname_bin (rule, TRUE, out_pl->iifname); + nm_ip_routing_rule_get_xifname_bin (rule, FALSE, out_pl->oifname); + + return out_pl; +} + +/*****************************************************************************/ + struct _NMShutdownWaitObjHandle { CList lst; GObject *watched_obj; diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h index 5e7012241a..2b1f5ed891 100644 --- a/src/NetworkManagerUtils.h +++ b/src/NetworkManagerUtils.h @@ -24,6 +24,9 @@ #include "nm-core-utils.h" +#include "nm-setting-ip-config.h" +#include "platform/nm-platform.h" + /*****************************************************************************/ const char *nm_utils_get_ip_config_method (NMConnection *connection, @@ -60,6 +63,11 @@ int nm_match_spec_device_by_pllink (const NMPlatformLink *pllink, /*****************************************************************************/ +NMPlatformRoutingRule *nm_ip_routing_rule_to_platform (const NMIPRoutingRule *rule, + NMPlatformRoutingRule *out_pl); + +/*****************************************************************************/ + /* during shutdown, there are two relevant timeouts. One is * NM_SHUTDOWN_TIMEOUT_MS which is plenty of time, that we give for all * actions to complete. Of course, during shutdown components should hurry diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index f87ebf9096..3959bd7d2d 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -47,6 +47,7 @@ #include "nm-manager.h" #include "platform/nm-platform.h" #include "platform/nmp-object.h" +#include "platform/nmp-rules-manager.h" #include "ndisc/nm-ndisc.h" #include "ndisc/nm-lndp-ndisc.h" #include "dhcp/nm-dhcp-manager.h" @@ -6408,6 +6409,84 @@ lldp_init (NMDevice *self, gboolean restart) } } +/* set-mode can be: + * - TRUE: sync with new rules. + * - FALSE: sync, but remove all rules (== flush) + * - DEFAULT: forget about all the rules that we previously tracked, + * but don't actually remove them. This is when quitting NM + * we want to keep the rules. + * The problem is, after restart of NM, the rule manager will + * no longer remember that NM added these rules and treat them + * as externally added ones. Don't restart NetworkManager if + * you care about that. + */ +static void +_routing_rules_sync (NMDevice *self, + NMTernary set_mode) +{ + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + NMPRulesManager *rules_manager = nm_netns_get_rules_manager (nm_device_get_netns (self)); + gboolean untrack_only_dirty = FALSE; + gboolean keep_deleted_rules; + gpointer user_tag; + + user_tag = priv; + + if (set_mode == NM_TERNARY_TRUE) { + NMConnection *applied_connection; + NMSettingIPConfig *s_ip; + guint i, num; + int is_ipv4; + + untrack_only_dirty = TRUE; + nmp_rules_manager_set_dirty (rules_manager, user_tag); + + applied_connection = nm_device_get_applied_connection (self); + + for (is_ipv4 = 0; applied_connection && is_ipv4 < 2; is_ipv4++) { + int addr_family = is_ipv4 ? AF_INET : AF_INET6; + + s_ip = nm_connection_get_setting_ip_config (applied_connection, addr_family); + if (!s_ip) + continue; + + num = nm_setting_ip_config_get_num_routing_rules (s_ip); + for (i = 0; i < num; i++) { + NMPlatformRoutingRule plrule; + NMIPRoutingRule *rule; + + rule = nm_setting_ip_config_get_routing_rule (s_ip, i); + nm_ip_routing_rule_to_platform (rule, &plrule); + nmp_rules_manager_track (rules_manager, + &plrule, + 10, + user_tag); + } + } + } + + nmp_rules_manager_untrack_all (rules_manager, user_tag, !untrack_only_dirty); + + keep_deleted_rules = FALSE; + if (set_mode == NM_TERNARY_DEFAULT) { + /* when exiting NM, we leave the device up and the rules configured. + * We just all nmp_rules_manager_sync() to forget about the synced rules, + * but we don't actually delete them. + * + * FIXME: that is a problem after restart of NetworkManager, because these + * rules will look like externally added, and NM will no longer remove + * them. + * To fix that, we could during "assume" mark the rules of the profile + * as owned (and "added" by the device). The problem with that is that it + * wouldn't cover rules that devices add by internal decision (not because + * of a setting in the profile, e.g. WireGuard could setup policy routing). + * Maybe it would be better to remember these orphaned rules at exit in a + * file and track them after restart again. */ + keep_deleted_rules = TRUE; + } + nmp_rules_manager_sync (rules_manager, keep_deleted_rules); +} + static gboolean tc_commit (NMDevice *self) { @@ -6519,6 +6598,8 @@ activate_stage2_device_config (NMDevice *self) } } + _routing_rules_sync (self, NM_TERNARY_TRUE); + if (!nm_device_sys_iface_state_is_external_or_assume (self)) { if (!nm_device_bring_up (self, FALSE, &no_firmware)) { if (no_firmware) @@ -14350,6 +14431,11 @@ nm_device_cleanup (NMDevice *self, NMDeviceStateReason reason, CleanupType clean } } + _routing_rules_sync (self, + cleanup_type == CLEANUP_TYPE_KEEP + ? NM_TERNARY_DEFAULT + : NM_TERNARY_FALSE); + if (ifindex > 0) nm_platform_ip4_dev_route_blacklist_set (nm_device_get_platform (self), ifindex, NULL); diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 57a017cd4a..a35fa16a9d 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -4144,7 +4144,7 @@ _nl_msg_new_routing_rule (int nlmsg_type, .src_len = routing_rule->src_len, .dst_len = routing_rule->dst_len, .tos = routing_rule->tos, - .table = table, + .table = table < 0x100u ? (guint8) table : (guint8) RT_TABLE_UNSPEC, .action = routing_rule->action, /* we only allow setting the "not" flag. */ diff --git a/src/platform/nmp-rules-manager.c b/src/platform/nmp-rules-manager.c index 2c486fdaa6..9e3435507b 100644 --- a/src/platform/nmp-rules-manager.c +++ b/src/platform/nmp-rules-manager.c @@ -471,7 +471,8 @@ nmp_rules_manager_untrack_all (NMPRulesManager *self, } void -nmp_rules_manager_sync (NMPRulesManager *self) +nmp_rules_manager_sync (NMPRulesManager *self, + gboolean keep_deleted_rules) { const NMDedupMultiHeadEntry *pl_head_entry; NMDedupMultiIter pl_iter; @@ -486,7 +487,7 @@ nmp_rules_manager_sync (NMPRulesManager *self) if (!self->by_data) return; - _LOGD ("sync"); + _LOGD ("sync%s", keep_deleted_rules ? " (don't remove any rules)" : ""); pl_head_entry = nm_platform_lookup_obj_type (self->platform, NMP_OBJECT_TYPE_ROUTING_RULE); if (pl_head_entry) { @@ -508,6 +509,11 @@ nmp_rules_manager_sync (NMPRulesManager *self) obj_data->added_by_us = FALSE; } + if (keep_deleted_rules) { + _LOGD ("forget/leak rule added by us: %s", nmp_object_to_string (plobj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0)); + continue; + } + if (!rules_to_delete) rules_to_delete = g_ptr_array_new_with_free_func ((GDestroyNotify) nmp_object_unref); @@ -558,6 +564,7 @@ nmp_rules_manager_track_default (NMPRulesManager *self, .priority = 0, .table = RT_TABLE_LOCAL, .action = FR_ACT_TO_TBL, + .protocol = RTPROT_KERNEL, }), priority, user_tag); @@ -567,6 +574,7 @@ nmp_rules_manager_track_default (NMPRulesManager *self, .priority = 32766, .table = RT_TABLE_MAIN, .action = FR_ACT_TO_TBL, + .protocol = RTPROT_KERNEL, }), priority, user_tag); @@ -576,6 +584,7 @@ nmp_rules_manager_track_default (NMPRulesManager *self, .priority = 32767, .table = RT_TABLE_DEFAULT, .action = FR_ACT_TO_TBL, + .protocol = RTPROT_KERNEL, }), priority, user_tag); @@ -587,6 +596,7 @@ nmp_rules_manager_track_default (NMPRulesManager *self, .priority = 0, .table = RT_TABLE_LOCAL, .action = FR_ACT_TO_TBL, + .protocol = RTPROT_KERNEL, }), priority, user_tag); @@ -596,6 +606,7 @@ nmp_rules_manager_track_default (NMPRulesManager *self, .priority = 32766, .table = RT_TABLE_MAIN, .action = FR_ACT_TO_TBL, + .protocol = RTPROT_KERNEL, }), priority, user_tag); diff --git a/src/platform/nmp-rules-manager.h b/src/platform/nmp-rules-manager.h index 491df31d4a..a1e5543548 100644 --- a/src/platform/nmp-rules-manager.h +++ b/src/platform/nmp-rules-manager.h @@ -54,7 +54,8 @@ void nmp_rules_manager_untrack_all (NMPRulesManager *self, gconstpointer user_tag, gboolean all /* or only dirty */); -void nmp_rules_manager_sync (NMPRulesManager *self); +void nmp_rules_manager_sync (NMPRulesManager *self, + gboolean keep_deleted_rules); /*****************************************************************************/ diff --git a/src/platform/tests/test-route.c b/src/platform/tests/test-route.c index 60bd4e0170..ae3367779c 100644 --- a/src/platform/tests/test-route.c +++ b/src/platform/tests/test-route.c @@ -1546,12 +1546,12 @@ again: USER_TAG_2); } if (nmtst_get_rand_int () % objs_sync->len == 0) { - nmp_rules_manager_sync (rules_manager); + nmp_rules_manager_sync (rules_manager, FALSE); g_assert_cmpint (nmtstp_platform_routing_rules_get_count (platform, AF_UNSPEC), ==, i + 1); } } - nmp_rules_manager_sync (rules_manager); + nmp_rules_manager_sync (rules_manager, FALSE); g_assert_cmpint (nmtstp_platform_routing_rules_get_count (platform, AF_UNSPEC), ==, objs_sync->len); for (i = 0; i < objs_sync->len; i++) { @@ -1578,12 +1578,12 @@ again: break; } if (nmtst_get_rand_int () % objs_sync->len == 0) { - nmp_rules_manager_sync (rules_manager); + nmp_rules_manager_sync (rules_manager, FALSE); g_assert_cmpint (nmtstp_platform_routing_rules_get_count (platform, AF_UNSPEC), ==, objs_sync->len - i - 1); } } - nmp_rules_manager_sync (rules_manager); + nmp_rules_manager_sync (rules_manager, FALSE); } else { for (i = 0; i < objs->len;) { 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 de45c084ef..f9722b8f37 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c @@ -2083,7 +2083,7 @@ make_ip6_setting (shvarFile *ifcfg, g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, v, NULL); g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME, - svGetValueBoolean (ifcfg, "DHCPV6_SEND_HOSTNAME", TRUE), NULL); + svGetValueBoolean (ifcfg, "DHCPV6_SEND_HOSTNAME", TRUE), NULL); /* Read static IP addresses. * Read them even for AUTO and DHCP methods - in this case the addresses are @@ -4316,6 +4316,84 @@ parse_ethtool_option (const char *value, } } +static GPtrArray * +read_routing_rules_parse (shvarFile *ifcfg, + gboolean routes_read) +{ + gs_unref_ptrarray GPtrArray *arr = NULL; + gs_free const char **keys = NULL; + guint i, len; + + keys = svGetKeysSorted (ifcfg, SV_KEY_TYPE_ROUTING_RULE4 | SV_KEY_TYPE_ROUTING_RULE6, &len); + if (len == 0) + return NULL; + + if (!routes_read) { + PARSE_WARNING ("'rule-' or 'rule6-' files are present; Policy routing rules (ROUTING_RULE*) settings are ignored"); + return NULL; + } + + arr = g_ptr_array_new_full (len, (GDestroyNotify) nm_ip_routing_rule_unref); + for (i = 0; i < len; i++) { + const char *key = keys[i]; + nm_auto_unref_ip_routing_rule NMIPRoutingRule *rule = NULL; + gs_free_error GError *local = NULL; + gs_free char *value_to_free = NULL; + const char *value; + gboolean key_is_ipv4; + + key_is_ipv4 = (key[NM_STRLEN ("ROUTING_RULE")] == '_'); + nm_assert ( key_is_ipv4 == NM_STR_HAS_PREFIX (key, "ROUTING_RULE_")); + nm_assert (!key_is_ipv4 == NM_STR_HAS_PREFIX (key, "ROUTING_RULE6_")); + + value = svGetValueStr (ifcfg, key, &value_to_free); + if (!value) + continue; + + rule = nm_ip_routing_rule_from_string (value, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE + | (key_is_ipv4 + ? NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET + : NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6), + NULL, + &local); + if (!rule) { + PARSE_WARNING ("invalid routing rule %s=\"%s\": %s", key, value, local->message); + continue; + } + + g_ptr_array_add (arr, g_steal_pointer (&rule)); + } + + if (arr->len == 0) + return NULL; + + return g_steal_pointer (&arr); +} + +static void +read_routing_rules (shvarFile *ifcfg, + gboolean routes_read, + NMSettingIPConfig *s_ip4, + NMSettingIPConfig *s_ip6) +{ + gs_unref_ptrarray GPtrArray *routing_rules = NULL; + guint i; + + routing_rules = read_routing_rules_parse (ifcfg, routes_read); + if (!routing_rules) + return; + + for (i = 0; i < routing_rules->len; i++) { + NMIPRoutingRule *rule = routing_rules->pdata[i]; + + nm_setting_ip_config_add_routing_rule ( (nm_ip_routing_rule_get_addr_family (rule) == AF_INET) + ? s_ip4 + : s_ip6, + rule); + } +} + static void parse_ethtool_options (shvarFile *ifcfg, NMConnection *connection) { @@ -5817,8 +5895,7 @@ connection_from_file_full (const char *filename, error); if (!s_ip6) return NULL; - else - nm_connection_add_setting (connection, s_ip6); + nm_connection_add_setting (connection, s_ip6); s_ip4 = make_ip4_setting (main_ifcfg, network_ifcfg, @@ -5827,12 +5904,15 @@ connection_from_file_full (const char *filename, error); if (!s_ip4) return NULL; - else { - read_aliases (NM_SETTING_IP_CONFIG (s_ip4), - !has_ip4_defroute && !nm_setting_ip_config_get_gateway (NM_SETTING_IP_CONFIG (s_ip4)), - filename); - nm_connection_add_setting (connection, s_ip4); - } + read_aliases (NM_SETTING_IP_CONFIG (s_ip4), + !has_ip4_defroute && !nm_setting_ip_config_get_gateway (NM_SETTING_IP_CONFIG (s_ip4)), + filename); + nm_connection_add_setting (connection, s_ip4); + + read_routing_rules (main_ifcfg, + !has_complex_routes_v4 && !has_complex_routes_v6, + NM_SETTING_IP_CONFIG (s_ip4), + NM_SETTING_IP_CONFIG (s_ip6)); s_sriov = make_sriov_setting (main_ifcfg); if (s_sriov) 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 f6b8f8c21a..a57e6c3a60 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c @@ -2954,6 +2954,52 @@ write_ip6_setting (NMConnection *connection, return TRUE; } +static void +write_ip_routing_rules (NMConnection *connection, + shvarFile *ifcfg, + gboolean route_ignore) +{ + gsize idx; + int is_ipv4; + + svUnsetAll (ifcfg, SV_KEY_TYPE_ROUTING_RULE4 | SV_KEY_TYPE_ROUTING_RULE6); + + if (route_ignore) + return; + + idx = 0; + + for (is_ipv4 = 1; is_ipv4 >= 0; is_ipv4--) { + const int addr_family = is_ipv4 ? AF_INET : AF_INET6; + NMSettingIPConfig *s_ip; + guint i, num; + + s_ip = nm_connection_get_setting_ip_config (connection, addr_family); + if (!s_ip) + continue; + + num = nm_setting_ip_config_get_num_routing_rules (s_ip); + for (i = 0; i < num; i++) { + NMIPRoutingRule *rule = nm_setting_ip_config_get_routing_rule (s_ip, i); + gs_free const char *s = NULL; + char key[64]; + + s = nm_ip_routing_rule_to_string (rule, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE, + NULL, + NULL); + if (!s) + continue; + + if (is_ipv4) + numbered_tag (key, "ROUTING_RULE_", ++idx); + else + numbered_tag (key, "ROUTING_RULE6_", ++idx); + svSetValueStr (ifcfg, key, s); + } + } +} + static char * escape_id (const char *id) { @@ -3176,6 +3222,15 @@ do_write_construct (NMConnection *connection, has_complex_routes_v4 ? "" : "6"); return FALSE; } + if ( ( s_ip4 + && nm_setting_ip_config_get_num_routing_rules (s_ip4) > 0) + || ( s_ip6 + && nm_setting_ip_config_get_num_routing_rules (s_ip6) > 0)) { + g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED, + "Cannot configure routing rules on a connection that has an associated 'rule%s-' file", + has_complex_routes_v4 ? "" : "6"); + return FALSE; + } route_ignore = TRUE; } else route_ignore = FALSE; @@ -3193,6 +3248,10 @@ do_write_construct (NMConnection *connection, error)) return FALSE; + write_ip_routing_rules (connection, + ifcfg, + route_ignore); + write_connection_setting (s_con, ifcfg); NM_SET_OUT (out_ifcfg, g_steal_pointer (&ifcfg)); diff --git a/src/settings/plugins/ifcfg-rh/shvar.c b/src/settings/plugins/ifcfg-rh/shvar.c index f3d58e26c7..02aba1c57f 100644 --- a/src/settings/plugins/ifcfg-rh/shvar.c +++ b/src/settings/plugins/ifcfg-rh/shvar.c @@ -879,10 +879,25 @@ _is_all_digits (const char *str) #define IS_NUMBERED_TAG(key, tab_name) \ ({ \ + const char *_key2 = (key); \ + \ + ( (strncmp (_key2, tab_name, NM_STRLEN (tab_name)) == 0) \ + && _is_all_digits (&_key2[NM_STRLEN (tab_name)])); \ + }) + +#define IS_NUMBERED_TAG_PARSE(key, tab_name, out_idx) \ + ({ \ const char *_key = (key); \ + gint64 _idx; \ + gboolean _good = FALSE; \ + gint64 *_out_idx = (out_idx); \ \ - ( (strncmp (_key, tab_name, NM_STRLEN (tab_name)) == 0) \ - && _is_all_digits (&_key[NM_STRLEN (tab_name)])); \ + if ( IS_NUMBERED_TAG (_key, ""tab_name"") \ + && (_idx = _nm_utils_ascii_str_to_int64 (&_key[NM_STRLEN (tab_name)], 10, 0, G_MAXINT64, -1)) != -1) { \ + NM_SET_OUT (_out_idx, _idx); \ + _good = TRUE; \ + } \ + _good; \ }) static gboolean @@ -919,10 +934,30 @@ _svKeyMatchesType (const char *key, SvKeyType match_key_type) if (IS_NUMBERED_TAG (key, "SRIOV_VF")) return TRUE; } + if (NM_FLAGS_HAS (match_key_type, SV_KEY_TYPE_ROUTING_RULE4)) { + if (IS_NUMBERED_TAG_PARSE (key, "ROUTING_RULE_", NULL)) + return TRUE; + } + if (NM_FLAGS_HAS (match_key_type, SV_KEY_TYPE_ROUTING_RULE6)) { + if (IS_NUMBERED_TAG_PARSE (key, "ROUTING_RULE6_", NULL)) + return TRUE; + } return FALSE; } +gint64 +svNumberedParseKey (const char *key) +{ + gint64 idx; + + if (IS_NUMBERED_TAG_PARSE (key, "ROUTING_RULE_", &idx)) + return idx; + if (IS_NUMBERED_TAG_PARSE (key, "ROUTING_RULE6_", &idx)) + return idx; + return -1; +} + GHashTable * svGetKeys (shvarFile *s, SvKeyType match_key_type) { @@ -947,6 +982,42 @@ svGetKeys (shvarFile *s, SvKeyType match_key_type) return keys; } +static int +_get_keys_sorted_cmp (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + const char *k_a = *((const char *const*) a); + const char *k_b = *((const char *const*) b); + gint64 n_a; + gint64 n_b; + + n_a = svNumberedParseKey (k_a); + n_b = svNumberedParseKey (k_b); + NM_CMP_DIRECT (n_a, n_b); + NM_CMP_RETURN (strcmp (k_a, k_b)); + nm_assert_not_reached (); + return 0; +} + +const char ** +svGetKeysSorted (shvarFile *s, + SvKeyType match_key_type, + guint *out_len) +{ + gs_unref_hashtable GHashTable *keys_hash = NULL; + + keys_hash = svGetKeys (s, match_key_type); + if (!keys_hash) { + NM_SET_OUT (out_len, 0); + return NULL; + } + return (const char **) nm_utils_hash_keys_to_array (keys_hash, + _get_keys_sorted_cmp, + NULL, + out_len); +} + /*****************************************************************************/ const char * diff --git a/src/settings/plugins/ifcfg-rh/shvar.h b/src/settings/plugins/ifcfg-rh/shvar.h index 622bb474b1..b38a855760 100644 --- a/src/settings/plugins/ifcfg-rh/shvar.h +++ b/src/settings/plugins/ifcfg-rh/shvar.h @@ -40,6 +40,8 @@ typedef enum { SV_KEY_TYPE_TC = (1LL << 3), SV_KEY_TYPE_USER = (1LL << 4), SV_KEY_TYPE_SRIOV_VF = (1LL << 5), + SV_KEY_TYPE_ROUTING_RULE4 = (1LL << 6), + SV_KEY_TYPE_ROUTING_RULE6 = (1LL << 7), } SvKeyType; const char *svFileGetName (const shvarFile *s); @@ -67,8 +69,14 @@ char *svGetValueStr_cp (shvarFile *s, const char *key); int svParseBoolean (const char *value, int def); +gint64 svNumberedParseKey (const char *key); + GHashTable *svGetKeys (shvarFile *s, SvKeyType match_key_type); +const char **svGetKeysSorted (shvarFile *s, + SvKeyType match_key_type, + guint *out_len); + /* return TRUE if <key> resolves to any truth value (e.g. "yes", "y", "true") * return FALSE if <key> resolves to any non-truth value (e.g. "no", "n", "false") * return <def> otherwise diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Routing_Rules.cexpected b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Routing_Rules.cexpected new file mode 100644 index 0000000000..0c2fa035cf --- /dev/null +++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Routing_Rules.cexpected @@ -0,0 +1,19 @@ +TYPE=Ethernet +PROXY_METHOD=none +BROWSER_ONLY=no +BOOTPROTO=dhcp +DEFROUTE=yes +IPV4_FAILURE_FATAL=no +IPV6INIT=yes +IPV6_AUTOCONF=yes +IPV6_DEFROUTE=yes +IPV6_FAILURE_FATAL=no +IPV6_ADDR_GEN_MODE=stable-privacy +ROUTING_RULE_1="priority 10 from 0.0.0.0/0 table 1" +ROUTING_RULE_2="priority 10 to 192.167.8.0/24 table 2" +ROUTING_RULE6_3="priority 10 from ::/0 table 10" +ROUTING_RULE6_4="priority 10 to 1:2:3::5/24 table 22" +ROUTING_RULE6_5="priority 10 to 1:3:3::5 table 55" +NAME="Test Write Routing Rules" +UUID=${UUID} +ONBOOT=yes 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 99ffae403b..09e2c0e4b5 100644 --- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -4465,6 +4465,101 @@ test_write_wired_dhcp (void) nmtst_assert_connection_equals (connection, TRUE, reread, FALSE); } +static NMIPRoutingRule * +_ip_routing_rule_new (int addr_family, + const char *str) +{ + NMIPRoutingRuleAsStringFlags flags = NM_IP_ROUTING_RULE_AS_STRING_FLAGS_NONE; + gs_free_error GError *local = NULL; + NMIPRoutingRule *rule; + + if (addr_family != AF_UNSPEC) { + if (addr_family == AF_INET) + flags = NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET; + else { + g_assert (addr_family == AF_INET6); + flags = NM_IP_ROUTING_RULE_AS_STRING_FLAGS_AF_INET6; + } + } + + rule = nm_ip_routing_rule_from_string (str, + NM_IP_ROUTING_RULE_AS_STRING_FLAGS_VALIDATE + | flags, + NULL, + nmtst_get_rand_bool () ? &local : NULL); + nmtst_assert_success (rule, local); + + if (addr_family != AF_UNSPEC) + g_assert_cmpint (nm_ip_routing_rule_get_addr_family (rule), ==, addr_family); + return rule; +} + +static void +_ip_routing_rule_add_to_setting (NMSettingIPConfig *s_ip, + const char *str) +{ + nm_auto_unref_ip_routing_rule NMIPRoutingRule *rule = NULL; + + rule = _ip_routing_rule_new (nm_setting_ip_config_get_addr_family (s_ip), str); + nm_setting_ip_config_add_routing_rule (s_ip, rule); +} + +static void +test_write_routing_rules (void) +{ + nmtst_auto_unlinkfile char *testfile = NULL; + gs_unref_object NMConnection *connection = NULL; + gs_unref_object NMConnection *reread = NULL; + NMSettingConnection *s_con; + NMSettingWired *s_wired; + NMSettingIPConfig *s_ip4; + NMSettingIPConfig *s_ip6; + + connection = nm_simple_connection_new (); + + s_con = (NMSettingConnection *) nm_setting_connection_new (); + nm_connection_add_setting (connection, NM_SETTING (s_con)); + + g_object_set (s_con, + NM_SETTING_CONNECTION_ID, "Test Write Routing Rules", + NM_SETTING_CONNECTION_UUID, nm_utils_uuid_generate_a (), + NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, + NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, + NULL); + + s_wired = (NMSettingWired *) nm_setting_wired_new (); + nm_connection_add_setting (connection, NM_SETTING (s_wired)); + + s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new (); + nm_connection_add_setting (connection, NM_SETTING (s_ip4)); + + g_object_set (s_ip4, + NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, + NULL); + + s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new (); + nm_connection_add_setting (connection, NM_SETTING (s_ip6)); + + g_object_set (s_ip6, + NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO, + NULL); + + _ip_routing_rule_add_to_setting (s_ip4, "pref 10 from 0.0.0.0/0 table 1"); + _ip_routing_rule_add_to_setting (s_ip4, "priority 10 to 192.167.8.0/24 table 2"); + _ip_routing_rule_add_to_setting (s_ip6, "pref 10 from ::/0 table 10"); + _ip_routing_rule_add_to_setting (s_ip6, "pref 10 from ::/0 to 1:2:3::5/24 table 22"); + _ip_routing_rule_add_to_setting (s_ip6, "pref 10 from ::/0 to 1:3:3::5/128 table 55"); + + nmtst_assert_connection_verifies (connection); + + _writer_new_connec_exp (connection, + TEST_SCRATCH_DIR, + TEST_IFCFG_DIR"/ifcfg-Test_Write_Routing_Rules.cexpected", + &testfile); + reread = _connection_from_file (testfile, NULL, TYPE_ETHERNET, NULL); + nmtst_assert_connection_equals (connection, TRUE, reread, FALSE); +} + static void test_write_wired_match (void) { @@ -10200,6 +10295,7 @@ int main (int argc, char **argv) g_test_add_func (TPATH "wired/write-dhcp-plus-ip", test_write_wired_dhcp_plus_ip); g_test_add_func (TPATH "wired/write/dhcp-8021x-peap-mschapv2", test_write_wired_dhcp_8021x_peap_mschapv2); g_test_add_func (TPATH "wired/write/match", test_write_wired_match); + g_test_add_func (TPATH "wired/write/routing-rules", test_write_routing_rules); #define _add_test_write_wired_8021x_tls(testpath, scheme, flags) \ nmtst_add_test_func (testpath, test_write_wired_8021x_tls, GINT_TO_POINTER (scheme), GINT_TO_POINTER (flags)) |