summaryrefslogtreecommitdiff
path: root/libnm-core/nm-keyfile.c
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-03-14 12:04:21 +0100
committerThomas Haller <thaller@redhat.com>2019-03-27 16:23:30 +0100
commit6e6d1e070ca52c8b4a414f320a3076b94a8613a0 (patch)
tree398529b68884d7dcda0b39929544bb51b6f2023a /libnm-core/nm-keyfile.c
parent7fb23b0a62a0dfe038622a1559e60c97a6739aa0 (diff)
downloadNetworkManager-6e6d1e070ca52c8b4a414f320a3076b94a8613a0.tar.gz
libnm: add API to NMSettingIPConfig for routing rules
Diffstat (limited to 'libnm-core/nm-keyfile.c')
-rw-r--r--libnm-core/nm-keyfile.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/libnm-core/nm-keyfile.c b/libnm-core/nm-keyfile.c
index 2b77a84463..a541bd556c 100644
--- a/libnm-core/nm-keyfile.c
+++ b/libnm-core/nm-keyfile.c
@@ -541,6 +541,7 @@ typedef struct {
typedef enum {
BUILD_LIST_TYPE_ADDRESSES,
BUILD_LIST_TYPE_ROUTES,
+ BUILD_LIST_TYPE_ROUTING_RULES,
} BuildListType;
static int
@@ -661,6 +662,12 @@ _build_list_create (GKeyFile *keyfile,
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;
@@ -760,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;
@@ -1963,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,
@@ -2463,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,
@@ -2491,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,