diff --git a/clients/cli/connections.c b/clients/cli/connections.c index d4ad9e9161..b2268e59ef 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -14,7 +14,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * Copyright 2010 - 2015 Red Hat, Inc. + * Copyright 2010 - 2017 Red Hat, Inc. */ #include "nm-default.h" @@ -144,7 +144,8 @@ const NmcMetaGenericInfo *const nmc_fields_con_active_details_general[] = { NM_SETTING_MACSEC_SETTING_NAME"," \ NM_SETTING_MACVLAN_SETTING_NAME"," \ NM_SETTING_VXLAN_SETTING_NAME"," \ - NM_SETTING_PROXY_SETTING_NAME + NM_SETTING_PROXY_SETTING_NAME"," \ + NM_SETTING_TC_CONFIG_SETTING_NAME // NM_SETTING_DUMMY_SETTING_NAME // NM_SETTING_WIMAX_SETTING_NAME diff --git a/clients/cli/general.c b/clients/cli/general.c index 5ae31e1b43..7ac6b22cc6 100644 --- a/clients/cli/general.c +++ b/clients/cli/general.c @@ -743,7 +743,7 @@ do_general_logging (NmCli *nmc, int argc, char **argv) "AGENTS", "SETTINGS", "SUSPEND", "CORE", "DEVICE", "OLPC", "INFINIBAND", "FIREWALL", "ADSL", "BOND", "VLAN", "BRIDGE", "DBUS_PROPS", "TEAM", "CONCHECK", "DCB", "DISPATCH", "AUDIT", - "SYSTEMD", "VPN_PLUGIN", "PROXY", NULL); + "SYSTEMD", "VPN_PLUGIN", "PROXY", "TC", NULL); } domains = *argv; } else { diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c index 5512b8047a..22dc5e03a3 100644 --- a/clients/common/nm-meta-setting-desc.c +++ b/clients/common/nm-meta-setting-desc.c @@ -3786,6 +3786,82 @@ _validate_fcn_proxy_pac_script (const char *value, char **out_to_free, GError ** RETURN_STR_TO_FREE (script); } +static gconstpointer +_get_fcn_tc_config_qdiscs (ARGS_GET_FCN) +{ + NMSettingTCConfig *s_tc = NM_SETTING_TC_CONFIG (setting); + GString *printable; + guint num_qdiscs, i; + NMTCQdisc *qdisc; + char *str; + + RETURN_UNSUPPORTED_GET_TYPE (); + + printable = g_string_new (NULL); + + num_qdiscs = nm_setting_tc_config_get_num_qdiscs (s_tc); + for (i = 0; i < num_qdiscs; i++) { + qdisc = nm_setting_tc_config_get_qdisc (s_tc, i); + + if (printable->len > 0) + g_string_append (printable, ", "); + + str = nm_utils_tc_qdisc_to_str (qdisc, NULL); + if (str) { + g_string_append (printable, str); + g_free (str); + } + } + + RETURN_STR_TO_FREE (g_string_free (printable, FALSE)); +} + +static gboolean +_set_fcn_tc_config_qdiscs (ARGS_SET_FCN) +{ + gs_free const char **strv = NULL; + const char *const*iter; + NMTCQdisc *tc_qdisc; + GError *local = NULL; + + strv = nm_utils_strsplit_set (value, ","); + for (iter = strv; strv && *iter; iter++) { + tc_qdisc = nm_utils_tc_qdisc_from_str (*iter, &local); + if (!tc_qdisc) { + g_set_error (error, 1, 0, "%s %s", local->message, + _("The valid syntax is: '[root | parent ] [handle ] '")); + return FALSE; + } + nm_setting_tc_config_add_qdisc (NM_SETTING_TC_CONFIG (setting), tc_qdisc); + nm_tc_qdisc_unref (tc_qdisc); + } + return TRUE; +} + +static gboolean +_validate_and_remove_tc_qdisc (NMSettingTCConfig *setting, + const char *value, + GError **error) +{ + NMTCQdisc *qdisc; + gboolean ret; + + qdisc = nm_utils_tc_qdisc_from_str (value, error); + if (!qdisc) + return FALSE; + + ret = nm_setting_tc_config_remove_qdisc_by_value (setting, qdisc); + if (!ret) + g_set_error (error, 1, 0, _("the property doesn't contain qdisc '%s'"), value); + nm_tc_qdisc_unref (qdisc); + return ret; +} +DEFINE_REMOVER_INDEX_OR_VALUE (_remove_fcn_tc_config_qdiscs, + NM_SETTING_TC_CONFIG, + nm_setting_tc_config_get_num_qdiscs, + nm_setting_tc_config_remove_qdisc, + _validate_and_remove_tc_qdisc) + static const char * _validate_fcn_team_config (const char *value, char **out_to_free, GError **error) { @@ -6357,6 +6433,19 @@ static const NMMetaPropertyInfo *const property_infos_PROXY[] = { NULL }; +#undef _CURRENT_NM_META_SETTING_TYPE +#define _CURRENT_NM_META_SETTING_TYPE NM_META_SETTING_TYPE_TC_CONFIG +static const NMMetaPropertyInfo *const property_infos_TC_CONFIG[] = { + PROPERTY_INFO (NM_SETTING_TC_CONFIG_QDISCS, DESCRIBE_DOC_NM_SETTING_TC_CONFIG_QDISCS, + .property_type = DEFINE_PROPERTY_TYPE ( + .get_fcn = _get_fcn_tc_config_qdiscs, + .set_fcn = _set_fcn_tc_config_qdiscs, + .remove_fcn = _remove_fcn_tc_config_qdiscs, + ), + ), + NULL +}; + #undef _CURRENT_NM_META_SETTING_TYPE #define _CURRENT_NM_META_SETTING_TYPE NM_META_SETTING_TYPE_TEAM static const NMMetaPropertyInfo *const property_infos_TEAM[] = { @@ -7367,6 +7456,7 @@ _setting_init_fcn_wireless (ARGS_SETTING_INIT_FCN) #define SETTING_PRETTY_NAME_PPPOE N_("PPPoE") #define SETTING_PRETTY_NAME_PROXY N_("Proxy") #define SETTING_PRETTY_NAME_SERIAL N_("Serial settings") +#define SETTING_PRETTY_NAME_TC_CONFIG N_("Traffic controls") #define SETTING_PRETTY_NAME_TEAM N_("Team device") #define SETTING_PRETTY_NAME_TEAM_PORT N_("Team port") #define SETTING_PRETTY_NAME_TUN N_("Tun device") @@ -7552,6 +7642,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = { .setting_init_fcn = _setting_init_fcn_proxy, ), SETTING_INFO (SERIAL), + SETTING_INFO (TC_CONFIG), SETTING_INFO (TEAM, .valid_parts = NM_META_SETTING_VALID_PARTS ( NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE), @@ -7632,6 +7723,7 @@ const NMMetaSettingValidPartItem *const nm_meta_setting_info_valid_parts_default static const NMMetaSettingValidPartItem *const valid_settings_noslave[] = { NM_META_SETTING_VALID_PART_ITEM (IP4_CONFIG, FALSE), NM_META_SETTING_VALID_PART_ITEM (IP6_CONFIG, FALSE), + NM_META_SETTING_VALID_PART_ITEM (TC_CONFIG, FALSE), NM_META_SETTING_VALID_PART_ITEM (PROXY, FALSE), NULL, }; diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index 3429b63345..c1373126cd 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -2291,10 +2291,10 @@ nm_utils_tc_qdisc_from_str (const char *str, GError **error) nm_assert (str); nm_assert (!error || !*error); - ht = nm_utils_parse_variant_attributes (str, - ' ', ' ', FALSE, - tc_object_attribute_spec, - error); + ht = nm_utils_parse_variant_attributes (str, + ' ', ' ', FALSE, + tc_object_attribute_spec, + error); if (!ht) return NULL; diff --git a/libnm/NetworkManager.h b/libnm/NetworkManager.h index 27737e0e1b..2bdd2ed9a1 100644 --- a/libnm/NetworkManager.h +++ b/libnm/NetworkManager.h @@ -15,7 +15,7 @@ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. * - * Copyright 2014 Red Hat, Inc. + * Copyright 2014 - 2017 Red Hat, Inc. */ #ifndef __NETWORKMANAGER_H__ @@ -84,6 +84,7 @@ #include "nm-setting-pppoe.h" #include "nm-setting-proxy.h" #include "nm-setting-serial.h" +#include "nm-setting-tc-config.h" #include "nm-setting-team.h" #include "nm-setting-team-port.h" #include "nm-setting-tun.h" diff --git a/shared/nm-meta-setting.c b/shared/nm-meta-setting.c index 734b824246..8841273919 100644 --- a/shared/nm-meta-setting.c +++ b/shared/nm-meta-setting.c @@ -51,6 +51,7 @@ #include "nm-setting-pppoe.h" #include "nm-setting-proxy.h" #include "nm-setting-serial.h" +#include "nm-setting-tc-config.h" #include "nm-setting-team.h" #include "nm-setting-team-port.h" #include "nm-setting-tun.h" @@ -279,6 +280,11 @@ const NMMetaSettingInfo nm_meta_setting_infos[] = { .setting_name = NM_SETTING_SERIAL_SETTING_NAME, .get_setting_gtype = nm_setting_serial_get_type, }, + [NM_META_SETTING_TYPE_TC_CONFIG] = { + .meta_type = NM_META_SETTING_TYPE_TC_CONFIG, + .setting_name = NM_SETTING_TC_CONFIG_SETTING_NAME, + .get_setting_gtype = nm_setting_tc_config_get_type, + }, [NM_META_SETTING_TYPE_TEAM] = { .meta_type = NM_META_SETTING_TYPE_TEAM, .setting_name = NM_SETTING_TEAM_SETTING_NAME, diff --git a/shared/nm-meta-setting.h b/shared/nm-meta-setting.h index f36e322e89..4333001bff 100644 --- a/shared/nm-meta-setting.h +++ b/shared/nm-meta-setting.h @@ -83,6 +83,7 @@ typedef enum { NM_META_SETTING_TYPE_PPPOE, NM_META_SETTING_TYPE_PROXY, NM_META_SETTING_TYPE_SERIAL, + NM_META_SETTING_TYPE_TC_CONFIG, NM_META_SETTING_TYPE_TEAM, NM_META_SETTING_TYPE_TEAM_PORT, NM_META_SETTING_TYPE_TUN,