summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2017-12-08 14:13:25 +0100
committerLubomir Rintel <lkundrak@v3.sk>2017-12-11 11:20:13 +0100
commit902bbfdb1878ca54989e7aec6c5d92d1c580e885 (patch)
tree7d9495e195541d008b08f4afa410c7d09b709637
parent8bffb2c7502fdfd4bebd595176d0842b3ccff2ab (diff)
downloadNetworkManager-lr/tc.tar.gz
ifcfg-rh: add tc supportlr/tc
Format: QDISC1=ingress QDISC2="root handle 1234: fq_codel" FILTER1="parent ffff: matchall action simple sdata Input" FILTER2="parent 1234: matchall action simple sdata Output"
-rw-r--r--libnm-core/nm-setting-tc-config.c14
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c59
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c48
-rw-r--r--src/settings/plugins/ifcfg-rh/shvar.c5
-rw-r--r--src/settings/plugins/ifcfg-rh/shvar.h3
5 files changed, 127 insertions, 2 deletions
diff --git a/libnm-core/nm-setting-tc-config.c b/libnm-core/nm-setting-tc-config.c
index e50228200d..82c08bb16e 100644
--- a/libnm-core/nm-setting-tc-config.c
+++ b/libnm-core/nm-setting-tc-config.c
@@ -1523,6 +1523,13 @@ nm_setting_tc_config_class_init (NMSettingTCConfigClass *setting_class)
*
* Element-Type: NMTCQdisc
**/
+ /* ---ifcfg-rh---
+ * property: qdiscs
+ * variable: QDISC1, QDISC2, ...
+ * description: Queueing disciplines
+ * example: QDISC1=ingress, QDISC2="root handle 1234: fq_codel"
+ * ---end---
+ */
g_object_class_install_property
(object_class, PROP_QDISCS,
g_param_spec_boxed (NM_SETTING_TC_CONFIG_QDISCS, "", "",
@@ -1545,6 +1552,13 @@ nm_setting_tc_config_class_init (NMSettingTCConfigClass *setting_class)
*
* Element-Type: NMTCTfilter
**/
+ /* ---ifcfg-rh---
+ * property: qdiscs
+ * variable: FILTER1, FILTER2, ...
+ * description: Traffic filters
+ * example: FILTER1="parent ffff: matchall action simple sdata Input", ...
+ * ---end---
+ */
g_object_class_install_property
(object_class, PROP_TFILTERS,
g_param_spec_boxed (NM_SETTING_TC_CONFIG_TFILTERS, "", "",
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 a9c24c03e0..b9900eec31 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
@@ -1964,6 +1964,59 @@ error:
return NULL;
}
+static NMSetting *
+make_tc_setting (shvarFile *ifcfg)
+{
+ NMSettingTCConfig *s_tc = NULL;
+ char tag[256];
+ int i;
+
+ s_tc = (NMSettingTCConfig *) nm_setting_tc_config_new ();
+
+ for (i = 1;; i++) {
+ NMTCQdisc *qdisc = NULL;
+ gs_free char *value_to_free = NULL;
+ const char *value = NULL;
+ GError *local = NULL;
+
+ value = svGetValueStr (ifcfg, numbered_tag (tag, "QDISC", i), &value_to_free);
+ if (!value)
+ break;
+
+ qdisc = nm_utils_tc_qdisc_from_str (value, &local);
+ if (!qdisc)
+ PARSE_WARNING ("ignoring bad qdisc: '%s': %s", value, local->message);
+
+ if (!nm_setting_tc_config_add_qdisc (s_tc, qdisc))
+ PARSE_WARNING ("duplicate qdisc");
+ }
+
+ for (i = 1;; i++) {
+ NMTCTfilter *tfilter = NULL;
+ gs_free char *value_to_free = NULL;
+ const char *value = NULL;
+ GError *local = NULL;
+
+ value = svGetValueStr (ifcfg, numbered_tag (tag, "FILTER", i), &value_to_free);
+ if (!value)
+ break;
+
+ tfilter = nm_utils_tc_tfilter_from_str (value, &local);
+ if (!tfilter)
+ PARSE_WARNING ("ignoring bad tfilter: '%s': %s", value, local->message);
+
+ if (!nm_setting_tc_config_add_tfilter (s_tc, tfilter))
+ PARSE_WARNING ("duplicate filter");
+ }
+
+ if ( nm_setting_tc_config_get_num_qdiscs (s_tc) > 0
+ || nm_setting_tc_config_get_num_tfilters (s_tc) > 0)
+ return NM_SETTING (s_tc);
+
+ g_object_unref (s_tc);
+ return NULL;
+}
+
typedef struct {
const char *enable_key;
const char *advertise_key;
@@ -5242,7 +5295,7 @@ connection_from_file_full (const char *filename,
gs_unref_object NMConnection *connection = NULL;
gs_free char *type = NULL;
char *devtype, *bootproto;
- NMSetting *s_ip4, *s_ip6, *s_proxy, *s_port, *s_dcb = NULL, *s_user;
+ NMSetting *s_ip4, *s_ip6, *s_tc, *s_proxy, *s_port, *s_dcb = NULL, *s_user;
const char *ifcfg_name = NULL;
gboolean has_ip4_defroute = FALSE;
gboolean has_complex_routes_v4;
@@ -5499,6 +5552,10 @@ connection_from_file_full (const char *filename,
nm_connection_add_setting (connection, s_ip4);
}
+ s_tc = make_tc_setting (parsed);
+ if (s_tc)
+ nm_connection_add_setting (connection, s_tc);
+
/* For backwards compatibility, if IPv4 is disabled or the
* config fails for some reason, we read DOMAIN and put the
* values into IPv6 config instead of IPv4.
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 44a8ab6fcf..5cb8ee98f5 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
@@ -2125,6 +2125,51 @@ write_user_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
return TRUE;
}
+static gboolean
+write_tc_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
+{
+ NMSettingTCConfig *s_tc;
+ guint i, num, n;
+ char tag[64];
+
+ svUnsetAll (ifcfg, SV_KEY_TYPE_TC);
+
+ s_tc = nm_connection_get_setting_tc_config (connection);
+ if (!s_tc)
+ return TRUE;
+
+ num = nm_setting_tc_config_get_num_qdiscs (s_tc);
+ for (n = 1, i = 0; i < num; i++) {
+ NMTCQdisc *qdisc;
+ gs_free char *str = NULL;
+
+ qdisc = nm_setting_tc_config_get_qdisc (s_tc, i);
+ str = nm_utils_tc_qdisc_to_str (qdisc, error);
+ if (!str)
+ return FALSE;
+
+ svSetValueStr (ifcfg, numbered_tag (tag, "QDISC", n), str);
+ n++;
+ }
+
+
+ num = nm_setting_tc_config_get_num_tfilters (s_tc);
+ for (n = 1, i = 0; i < num; i++) {
+ NMTCTfilter *tfilter;
+ gs_free char *str = NULL;
+
+ tfilter = nm_setting_tc_config_get_tfilter (s_tc, i);
+ str = nm_utils_tc_tfilter_to_str (tfilter, error);
+ if (!str)
+ return FALSE;
+
+ svSetValueStr (ifcfg, numbered_tag (tag, "FILTER", n), str);
+ n++;
+ }
+
+ return TRUE;
+}
+
static void
write_res_options (shvarFile *ifcfg, NMSettingIPConfig *s_ip, const char *var)
{
@@ -2860,6 +2905,9 @@ do_write_construct (NMConnection *connection,
if (!write_user_setting (connection, ifcfg, error))
return FALSE;
+ if (!write_tc_setting (connection, ifcfg, error))
+ return FALSE;
+
svUnsetValue (ifcfg, "DHCP_HOSTNAME");
svUnsetValue (ifcfg, "DHCP_FQDN");
diff --git a/src/settings/plugins/ifcfg-rh/shvar.c b/src/settings/plugins/ifcfg-rh/shvar.c
index 3a5a3f7cfc..2b64f3fc7f 100644
--- a/src/settings/plugins/ifcfg-rh/shvar.c
+++ b/src/settings/plugins/ifcfg-rh/shvar.c
@@ -1171,6 +1171,11 @@ svUnsetAll (shvarFile *s, SvKeyType match_key_type)
if (g_str_has_prefix (line->key, "NM_USER_"))
goto do_clear;
}
+ if (NM_FLAGS_HAS (match_key_type, SV_KEY_TYPE_TC)) {
+ if ( IS_NUMBERED_TAG (line->key, "QDISC")
+ || IS_NUMBERED_TAG (line->key, "FILTER"))
+ goto do_clear;
+ }
continue;
do_clear:
diff --git a/src/settings/plugins/ifcfg-rh/shvar.h b/src/settings/plugins/ifcfg-rh/shvar.h
index c48bbfd331..dbc4d950a3 100644
--- a/src/settings/plugins/ifcfg-rh/shvar.h
+++ b/src/settings/plugins/ifcfg-rh/shvar.h
@@ -90,7 +90,8 @@ typedef enum {
SV_KEY_TYPE_ANY = (1LL << 0),
SV_KEY_TYPE_ROUTE_SVFORMAT = (1LL << 1),
SV_KEY_TYPE_IP4_ADDRESS = (1LL << 2),
- SV_KEY_TYPE_USER = (1LL << 3),
+ SV_KEY_TYPE_TC = (1LL << 3),
+ SV_KEY_TYPE_USER = (1LL << 4),
} SvKeyType;
gboolean svUnsetAll (shvarFile *s, SvKeyType match_key_type);