ifcfg-rh: add tc support
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"
This commit is contained in:
@@ -1523,6 +1523,13 @@ nm_setting_tc_config_class_init (NMSettingTCConfigClass *setting_class)
|
|||||||
*
|
*
|
||||||
* Element-Type: NMTCQdisc
|
* 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
|
g_object_class_install_property
|
||||||
(object_class, PROP_QDISCS,
|
(object_class, PROP_QDISCS,
|
||||||
g_param_spec_boxed (NM_SETTING_TC_CONFIG_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
|
* 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
|
g_object_class_install_property
|
||||||
(object_class, PROP_TFILTERS,
|
(object_class, PROP_TFILTERS,
|
||||||
g_param_spec_boxed (NM_SETTING_TC_CONFIG_TFILTERS, "", "",
|
g_param_spec_boxed (NM_SETTING_TC_CONFIG_TFILTERS, "", "",
|
||||||
|
@@ -1964,6 +1964,59 @@ error:
|
|||||||
return NULL;
|
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 {
|
typedef struct {
|
||||||
const char *enable_key;
|
const char *enable_key;
|
||||||
const char *advertise_key;
|
const char *advertise_key;
|
||||||
@@ -5242,7 +5295,7 @@ connection_from_file_full (const char *filename,
|
|||||||
gs_unref_object NMConnection *connection = NULL;
|
gs_unref_object NMConnection *connection = NULL;
|
||||||
gs_free char *type = NULL;
|
gs_free char *type = NULL;
|
||||||
char *devtype, *bootproto;
|
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;
|
const char *ifcfg_name = NULL;
|
||||||
gboolean has_ip4_defroute = FALSE;
|
gboolean has_ip4_defroute = FALSE;
|
||||||
gboolean has_complex_routes_v4;
|
gboolean has_complex_routes_v4;
|
||||||
@@ -5499,6 +5552,10 @@ connection_from_file_full (const char *filename,
|
|||||||
nm_connection_add_setting (connection, s_ip4);
|
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
|
/* For backwards compatibility, if IPv4 is disabled or the
|
||||||
* config fails for some reason, we read DOMAIN and put the
|
* config fails for some reason, we read DOMAIN and put the
|
||||||
* values into IPv6 config instead of IPv4.
|
* values into IPv6 config instead of IPv4.
|
||||||
|
@@ -2125,6 +2125,51 @@ write_user_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
|
|||||||
return TRUE;
|
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
|
static void
|
||||||
write_res_options (shvarFile *ifcfg, NMSettingIPConfig *s_ip, const char *var)
|
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))
|
if (!write_user_setting (connection, ifcfg, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
if (!write_tc_setting (connection, ifcfg, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
svUnsetValue (ifcfg, "DHCP_HOSTNAME");
|
svUnsetValue (ifcfg, "DHCP_HOSTNAME");
|
||||||
svUnsetValue (ifcfg, "DHCP_FQDN");
|
svUnsetValue (ifcfg, "DHCP_FQDN");
|
||||||
|
|
||||||
|
@@ -1171,6 +1171,11 @@ svUnsetAll (shvarFile *s, SvKeyType match_key_type)
|
|||||||
if (g_str_has_prefix (line->key, "NM_USER_"))
|
if (g_str_has_prefix (line->key, "NM_USER_"))
|
||||||
goto do_clear;
|
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;
|
continue;
|
||||||
do_clear:
|
do_clear:
|
||||||
|
@@ -90,7 +90,8 @@ typedef enum {
|
|||||||
SV_KEY_TYPE_ANY = (1LL << 0),
|
SV_KEY_TYPE_ANY = (1LL << 0),
|
||||||
SV_KEY_TYPE_ROUTE_SVFORMAT = (1LL << 1),
|
SV_KEY_TYPE_ROUTE_SVFORMAT = (1LL << 1),
|
||||||
SV_KEY_TYPE_IP4_ADDRESS = (1LL << 2),
|
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;
|
} SvKeyType;
|
||||||
|
|
||||||
gboolean svUnsetAll (shvarFile *s, SvKeyType match_key_type);
|
gboolean svUnsetAll (shvarFile *s, SvKeyType match_key_type);
|
||||||
|
Reference in New Issue
Block a user