diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2017-12-08 14:13:25 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2017-12-11 11:20:13 +0100 |
commit | 902bbfdb1878ca54989e7aec6c5d92d1c580e885 (patch) | |
tree | 7d9495e195541d008b08f4afa410c7d09b709637 | |
parent | 8bffb2c7502fdfd4bebd595176d0842b3ccff2ab (diff) | |
download | NetworkManager-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.c | 14 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c | 59 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c | 48 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/shvar.c | 5 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/shvar.h | 3 |
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); |