cli: add support for DCB settings

This commit is contained in:
Dan Williams
2013-11-06 08:16:40 -06:00
parent ff93ed672b
commit d35cb5b77c
3 changed files with 561 additions and 1 deletions

View File

@@ -107,6 +107,7 @@ static NmcOutputField nmc_fields_settings_names[] = {
SETTING_FIELD (NM_SETTING_BRIDGE_PORT_SETTING_NAME, 0), /* 21 */
SETTING_FIELD (NM_SETTING_TEAM_SETTING_NAME, 0), /* 22 */
SETTING_FIELD (NM_SETTING_TEAM_PORT_SETTING_NAME, 0), /* 23 */
SETTING_FIELD (NM_SETTING_DCB_SETTING_NAME, 0), /* 24 */
{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
};
#define NMC_FIELDS_SETTINGS_NAMES_ALL_X NM_SETTING_CONNECTION_SETTING_NAME","\
@@ -131,7 +132,8 @@ static NmcOutputField nmc_fields_settings_names[] = {
NM_SETTING_BRIDGE_SETTING_NAME","\
NM_SETTING_BRIDGE_PORT_SETTING_NAME","\
NM_SETTING_TEAM_SETTING_NAME","\
NM_SETTING_TEAM_PORT_SETTING_NAME
NM_SETTING_TEAM_PORT_SETTING_NAME"," \
NM_SETTING_DCB_SETTING_NAME
#if WITH_WIMAX
#define NMC_FIELDS_SETTINGS_NAMES_ALL NMC_FIELDS_SETTINGS_NAMES_ALL_X","\
NM_SETTING_WIMAX_SETTING_NAME
@@ -1773,6 +1775,7 @@ static const NameItem nmc_ethernet_settings [] = {
{ NM_SETTING_802_1X_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP4_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_IP6_CONFIG_SETTING_NAME, NULL, NULL, FALSE },
{ NM_SETTING_DCB_SETTING_NAME, NULL, NULL, FALSE },
{ NULL, NULL, NULL, FALSE }
};

View File

@@ -618,6 +618,43 @@ static NmcOutputField nmc_fields_setting_team_port[] = {
NM_SETTING_TEAM_PORT_CONFIG
#define NMC_FIELDS_SETTING_TEAM_PORT_COMMON NMC_FIELDS_SETTING_TEAM_PORT_ALL
/* Available fields for NM_SETTING_DCB_SETTING_NAME */
static NmcOutputField nmc_fields_setting_dcb[] = {
SETTING_FIELD ("name", 8), /* 0 */
SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_FLAGS, 5), /* 1 */
SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_PRIORITY, 5), /* 2 */
SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_MODE, 8), /* 3 */
SETTING_FIELD (NM_SETTING_DCB_APP_ISCSI_FLAGS, 5), /* 4 */
SETTING_FIELD (NM_SETTING_DCB_APP_ISCSI_PRIORITY, 5), /* 5 */
SETTING_FIELD (NM_SETTING_DCB_APP_FIP_FLAGS, 5), /* 6 */
SETTING_FIELD (NM_SETTING_DCB_APP_FIP_PRIORITY, 5), /* 7 */
SETTING_FIELD (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS, 5), /* 8 */
SETTING_FIELD (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL, 10), /* 9 */
SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_FLAGS, 5), /* 10 */
SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_ID, 10), /* 11 */
SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH, 30), /* 12 */
SETTING_FIELD (NM_SETTING_DCB_PRIORITY_BANDWIDTH, 30), /* 13 */
SETTING_FIELD (NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH, 10), /* 14 */
SETTING_FIELD (NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS, 30), /* 15 */
{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
};
#define NMC_FIELDS_SETTING_DCB_ALL "name"","\
NM_SETTING_DCB_APP_FCOE_FLAGS","\
NM_SETTING_DCB_APP_FCOE_PRIORITY","\
NM_SETTING_DCB_APP_FCOE_MODE","\
NM_SETTING_DCB_APP_ISCSI_FLAGS","\
NM_SETTING_DCB_APP_ISCSI_PRIORITY","\
NM_SETTING_DCB_APP_FIP_FLAGS","\
NM_SETTING_DCB_APP_FIP_PRIORITY","\
NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS","\
NM_SETTING_DCB_PRIORITY_FLOW_CONTROL","\
NM_SETTING_DCB_PRIORITY_GROUP_FLAGS","\
NM_SETTING_DCB_PRIORITY_GROUP_ID","\
NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH","\
NM_SETTING_DCB_PRIORITY_BANDWIDTH","\
NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH","\
NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS
#define NMC_FIELDS_SETTING_DCB_COMMON NMC_FIELDS_SETTING_DCB_ALL
/*----------------------------------------------------------------------------*/
@@ -1071,6 +1108,119 @@ DEFINE_GETTER (nmc_property_connection_get_slave_type, NM_SETTING_CONNECTION_SLA
DEFINE_GETTER (nmc_property_connection_get_secondaries, NM_SETTING_CONNECTION_SECONDARIES)
DEFINE_GETTER (nmc_property_connection_get_gateway_ping_timeout, NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT)
/* --- NM_SETTING_DCB_SETTING_NAME property get functions --- */
static char *
dcb_flags_to_string (NMSettingDcbFlags flags)
{
GString *flag_str;
if (flags == 0)
return g_strdup (_("0 (disabled)"));
flag_str = g_string_new (NULL);
g_string_printf (flag_str, "%d (", flags);
if (flags & NM_SETTING_DCB_FLAG_ENABLE)
g_string_append (flag_str, _("enabled, "));
if (flags & NM_SETTING_DCB_FLAG_ADVERTISE)
g_string_append (flag_str, _("advertise, "));
if (flags & NM_SETTING_DCB_FLAG_WILLING)
g_string_append (flag_str, _("willing, "));
if (flag_str->str[flag_str->len-1] == '(')
g_string_append (flag_str, _("unknown"));
else
g_string_truncate (flag_str, flag_str->len-2); /* chop off trailing ', ' */
g_string_append_c (flag_str, ')');
return g_string_free (flag_str, FALSE);
}
#define DEFINE_DCB_FLAGS_GETTER(func_name, property_name) \
static char * \
func_name (NMSetting *setting) \
{ \
GValue val = G_VALUE_INIT; \
g_value_init (&val, G_TYPE_UINT); \
g_object_get_property (G_OBJECT (setting), property_name, &val); \
return dcb_flags_to_string (g_value_get_uint (&val)); \
}
static char *
dcb_app_priority_to_string (gint priority)
{
return (priority == -1) ? g_strdup (_("-1 (unset)")) : g_strdup_printf ("%d", priority);
}
#define DEFINE_DCB_APP_PRIORITY_GETTER(func_name, property_name) \
static char * \
func_name (NMSetting *setting) \
{ \
GValue val = G_VALUE_INIT; \
g_value_init (&val, G_TYPE_INT); \
g_object_get_property (G_OBJECT (setting), property_name, &val); \
return dcb_app_priority_to_string (g_value_get_int (&val)); \
}
#define DEFINE_DCB_BOOL_GETTER(func_name, getter_func_name) \
static char * \
func_name (NMSetting *setting) \
{ \
NMSettingDcb *s_dcb = NM_SETTING_DCB (setting); \
GString *str; \
guint i; \
\
str = g_string_new (NULL); \
for (i = 0; i < 8; i++) { \
if (getter_func_name (s_dcb, i)) \
g_string_append_c (str, '1'); \
else \
g_string_append_c (str, '0'); \
\
if (i < 7) \
g_string_append_c (str, ','); \
} \
\
return g_string_free (str, FALSE); \
}
#define DEFINE_DCB_UINT_GETTER(func_name, getter_func_name) \
static char * \
func_name (NMSetting *setting) \
{ \
NMSettingDcb *s_dcb = NM_SETTING_DCB (setting); \
GString *str; \
guint i; \
\
str = g_string_new (NULL); \
for (i = 0; i < 8; i++) { \
g_string_append_printf (str, "%u", getter_func_name (s_dcb, i)); \
if (i < 7) \
g_string_append_c (str, ','); \
} \
\
return g_string_free (str, FALSE); \
}
DEFINE_DCB_FLAGS_GETTER (nmc_property_dcb_get_app_fcoe_flags, NM_SETTING_DCB_APP_FCOE_FLAGS)
DEFINE_DCB_APP_PRIORITY_GETTER (nmc_property_dcb_get_app_fcoe_priority, NM_SETTING_DCB_APP_FCOE_PRIORITY)
DEFINE_GETTER (nmc_property_dcb_get_app_fcoe_mode, NM_SETTING_DCB_APP_FCOE_MODE)
DEFINE_DCB_FLAGS_GETTER (nmc_property_dcb_get_app_iscsi_flags, NM_SETTING_DCB_APP_ISCSI_FLAGS)
DEFINE_DCB_APP_PRIORITY_GETTER (nmc_property_dcb_get_app_iscsi_priority, NM_SETTING_DCB_APP_ISCSI_PRIORITY)
DEFINE_DCB_FLAGS_GETTER (nmc_property_dcb_get_app_fip_flags, NM_SETTING_DCB_APP_FIP_FLAGS)
DEFINE_DCB_APP_PRIORITY_GETTER (nmc_property_dcb_get_app_fip_priority, NM_SETTING_DCB_APP_FIP_PRIORITY)
DEFINE_DCB_FLAGS_GETTER (nmc_property_dcb_get_pfc_flags, NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS)
DEFINE_DCB_BOOL_GETTER (nmc_property_dcb_get_pfc, nm_setting_dcb_get_priority_flow_control)
DEFINE_DCB_FLAGS_GETTER (nmc_property_dcb_get_pg_flags, NM_SETTING_DCB_PRIORITY_GROUP_FLAGS)
DEFINE_DCB_UINT_GETTER (nmc_property_dcb_get_pg_group_id, nm_setting_dcb_get_priority_group_id)
DEFINE_DCB_UINT_GETTER (nmc_property_dcb_get_pg_group_bandwidth, nm_setting_dcb_get_priority_group_bandwidth)
DEFINE_DCB_UINT_GETTER (nmc_property_dcb_get_pg_bandwidth, nm_setting_dcb_get_priority_bandwidth)
DEFINE_DCB_BOOL_GETTER (nmc_property_dcb_get_pg_strict, nm_setting_dcb_get_priority_strict_bandwidth)
DEFINE_DCB_UINT_GETTER (nmc_property_dcb_get_pg_traffic_class, nm_setting_dcb_get_priority_traffic_class)
/* --- NM_SETTING_GSM_SETTING_NAME property get functions --- */
DEFINE_GETTER (nmc_property_gsm_get_number, NM_SETTING_GSM_NUMBER)
DEFINE_GETTER (nmc_property_gsm_get_username, NM_SETTING_GSM_USERNAME)
@@ -3570,6 +3720,265 @@ nmc_property_wifi_set_psk (NMSetting *setting, const char *prop, const char *val
return TRUE;
}
#define DCB_ALL_FLAGS (NM_SETTING_DCB_FLAG_ENABLE | NM_SETTING_DCB_FLAG_ADVERTISE | NM_SETTING_DCB_FLAG_WILLING)
/* DCB stuff */
static gboolean
nmc_property_dcb_set_flags (NMSetting *setting, const char *prop, const char *val, GError **error)
{
char **strv = NULL, **iter;
NMSettingDcbFlags flags = NM_SETTING_DCB_FLAG_NONE;
long int t;
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
/* Check for overall hex numeric value */
if (nmc_string_to_int_base (val, 0, TRUE, 0, DCB_ALL_FLAGS, &t))
flags = (guint) t;
else {
/* Check for individual flag numbers */
strv = nmc_strsplit_set (val, " \t,", 0);
for (iter = strv; iter && *iter; iter++) {
if (!nmc_string_to_int_base (*iter, 0, TRUE, 0, DCB_ALL_FLAGS, &t))
t = -1;
if ( g_ascii_strcasecmp (*iter, "enable") == 0
|| g_ascii_strcasecmp (*iter, "enabled") == 0
|| t == NM_SETTING_DCB_FLAG_ENABLE)
flags |= NM_SETTING_DCB_FLAG_ENABLE;
else if ( g_ascii_strcasecmp (*iter, "advertise") == 0
|| t == NM_SETTING_DCB_FLAG_ADVERTISE)
flags |= NM_SETTING_DCB_FLAG_ADVERTISE;
else if ( g_ascii_strcasecmp (*iter, "willing") == 0
|| t == NM_SETTING_DCB_FLAG_WILLING)
flags |= NM_SETTING_DCB_FLAG_WILLING;
else if ( g_ascii_strcasecmp (*iter, "disable") == 0
|| g_ascii_strcasecmp (*iter, "disabled") == 0
|| t == 0) {
/* pass */
} else {
g_set_error (error, 1, 0, _("'%s' is not a valid DCB flag"), *iter);
return FALSE;
}
}
g_strfreev (strv);
}
/* Validate the number according to the property spec */
if (!validate_uint (setting, prop, (guint) flags, error))
return FALSE;
g_object_set (setting, prop, (guint) flags, NULL);
return TRUE;
}
static gboolean
nmc_property_dcb_set_priority (NMSetting *setting, const char *prop, const char *val, GError **error)
{
unsigned long priority = 0;
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if (!nmc_string_to_uint (val, FALSE, 0, 7, &priority)) {
g_set_error (error, 1, 0, _("'%s' is not a DCB app priority"), val);
return FALSE;
}
/* Validate the number according to the property spec */
if (!validate_uint (setting, prop, (guint) priority, error))
return FALSE;
g_object_set (setting, prop, (guint) priority, NULL);
return TRUE;
}
static gboolean
dcb_parse_uint_array (const char *val,
guint max,
guint other,
guint *out_array,
GError **error)
{
char **items, **iter;
guint i = 0;
g_return_val_if_fail (out_array != NULL, FALSE);
items = g_strsplit_set (val, ",", -1);
if (g_strv_length (items) != 8) {
g_set_error_literal (error, 1, 0, _("must contain 8 comma-separated numbers"));
goto error;
}
for (iter = items; iter && *iter; iter++) {
long int num = 0;
gboolean success;
*iter = g_strstrip (*iter);
success = nmc_string_to_int_base (*iter, 10, TRUE, 0, other ? other : max, &num);
/* If number is greater than 'max' it must equal 'other' */
if (success && other && (num > max) && (num != other))
success = FALSE;
if (!success) {
if (other) {
g_set_error (error, 1, 0, _("'%s' not a number between 0 and %u (inclusive) or %u"),
*iter, max, other);
} else {
g_set_error (error, 1, 0, _("'%s' not a number between 0 and %u (inclusive)"),
*iter, max);
}
goto error;
}
out_array[i++] = (guint) num;
}
return TRUE;
error:
g_strfreev (items);
return FALSE;
}
static void
dcb_check_feature_enabled (NMSettingDcb *s_dcb, const char *flags_prop)
{
NMSettingDcbFlags flags = NM_SETTING_DCB_FLAG_NONE;
g_object_get (s_dcb, flags_prop, &flags, NULL);
if (!(flags & NM_SETTING_DCB_FLAG_ENABLE))
printf (_("Warning: changes will have no effect until '%s' includes 1 (enabled)\n\n"), flags_prop);
}
static gboolean
nmc_property_dcb_set_pfc (NMSetting *setting, const char *prop, const char *val, GError **error)
{
guint i = 0;
guint nums[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if (!dcb_parse_uint_array (val, 1, 0, nums, error))
return FALSE;
for (i = 0; i < 8; i++)
nm_setting_dcb_set_priority_flow_control (NM_SETTING_DCB (setting), i, !!nums[i]);
dcb_check_feature_enabled (NM_SETTING_DCB (setting), NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS);
return TRUE;
}
static gboolean
nmc_property_dcb_set_pg_group_id (NMSetting *setting, const char *prop, const char *val, GError **error)
{
guint i = 0;
guint nums[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if (!dcb_parse_uint_array (val, 7, 15, nums, error))
return FALSE;
for (i = 0; i < 8; i++)
nm_setting_dcb_set_priority_group_id (NM_SETTING_DCB (setting), i, nums[i]);
dcb_check_feature_enabled (NM_SETTING_DCB (setting), NM_SETTING_DCB_PRIORITY_GROUP_FLAGS);
return TRUE;
}
static gboolean
nmc_property_dcb_set_pg_group_bandwidth (NMSetting *setting, const char *prop, const char *val, GError **error)
{
guint i = 0, sum = 0;
guint nums[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if (!dcb_parse_uint_array (val, 100, 0, nums, error))
return FALSE;
for (i = 0; i < 8; i++)
sum += nums[i];
if (sum != 100) {
g_set_error_literal (error, 1, 0, _("bandwidth percentages must total 100%%"));
return FALSE;
}
for (i = 0; i < 8; i++)
nm_setting_dcb_set_priority_group_bandwidth (NM_SETTING_DCB (setting), i, nums[i]);
dcb_check_feature_enabled (NM_SETTING_DCB (setting), NM_SETTING_DCB_PRIORITY_GROUP_FLAGS);
return TRUE;
}
static gboolean
nmc_property_dcb_set_pg_bandwidth (NMSetting *setting, const char *prop, const char *val, GError **error)
{
guint i = 0;
guint nums[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if (!dcb_parse_uint_array (val, 100, 0, nums, error))
return FALSE;
for (i = 0; i < 8; i++)
nm_setting_dcb_set_priority_bandwidth (NM_SETTING_DCB (setting), i, nums[i]);
dcb_check_feature_enabled (NM_SETTING_DCB (setting), NM_SETTING_DCB_PRIORITY_GROUP_FLAGS);
return TRUE;
}
static gboolean
nmc_property_dcb_set_pg_strict (NMSetting *setting, const char *prop, const char *val, GError **error)
{
guint i = 0;
guint nums[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if (!dcb_parse_uint_array (val, 1, 0, nums, error))
return FALSE;
for (i = 0; i < 8; i++)
nm_setting_dcb_set_priority_strict_bandwidth (NM_SETTING_DCB (setting), i, !!nums[i]);
dcb_check_feature_enabled (NM_SETTING_DCB (setting), NM_SETTING_DCB_PRIORITY_GROUP_FLAGS);
return TRUE;
}
static gboolean
nmc_property_dcb_set_pg_traffic_class (NMSetting *setting, const char *prop, const char *val, GError **error)
{
guint i = 0;
guint nums[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if (!dcb_parse_uint_array (val, 7, 0, nums, error))
return FALSE;
for (i = 0; i < 8; i++)
nm_setting_dcb_set_priority_traffic_class (NM_SETTING_DCB (setting), i, nums[i]);
dcb_check_feature_enabled (NM_SETTING_DCB (setting), NM_SETTING_DCB_PRIORITY_GROUP_FLAGS);
return TRUE;
}
/* 'app-fcoe-mode' */
static const char *_dcb_valid_fcoe_modes[] = { NM_SETTING_DCB_FCOE_MODE_FABRIC,
NM_SETTING_DCB_FCOE_MODE_VN2VN,
NULL };
static gboolean
nmc_property_dcb_set_app_fcoe_mode (NMSetting *setting, const char *prop, const char *val, GError **error)
{
return check_and_set_string (setting, prop, val, _dcb_valid_fcoe_modes, error);
}
DEFINE_ALLOWED_VAL_FUNC (nmc_property_dcb_allowed_app_fcoe_modes, _dcb_valid_fcoe_modes)
/*----------------------------------------------------------------------------*/
static void
@@ -4109,6 +4518,113 @@ nmc_properties_init (void)
NULL,
NULL);
/* Add editable properties for NM_SETTING_DCB_SETTING_NAME */
nmc_add_prop_funcs (GLUE (DCB, APP_FCOE_FLAGS),
nmc_property_dcb_get_app_fcoe_flags,
nmc_property_dcb_set_flags,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, APP_FCOE_MODE),
nmc_property_dcb_get_app_fcoe_mode,
nmc_property_dcb_set_app_fcoe_mode,
NULL,
NULL,
nmc_property_dcb_allowed_app_fcoe_modes,
NULL);
nmc_add_prop_funcs (GLUE (DCB, APP_FCOE_PRIORITY),
nmc_property_dcb_get_app_fcoe_priority,
nmc_property_dcb_set_priority,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, APP_ISCSI_FLAGS),
nmc_property_dcb_get_app_iscsi_flags,
nmc_property_dcb_set_flags,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, APP_ISCSI_PRIORITY),
nmc_property_dcb_get_app_iscsi_priority,
nmc_property_dcb_set_priority,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, APP_FIP_FLAGS),
nmc_property_dcb_get_app_fip_flags,
nmc_property_dcb_set_flags,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, APP_FIP_PRIORITY),
nmc_property_dcb_get_app_fip_priority,
nmc_property_dcb_set_priority,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, PRIORITY_FLOW_CONTROL_FLAGS),
nmc_property_dcb_get_pfc_flags,
nmc_property_dcb_set_flags,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, PRIORITY_FLOW_CONTROL),
nmc_property_dcb_get_pfc,
nmc_property_dcb_set_pfc,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, PRIORITY_GROUP_FLAGS),
nmc_property_dcb_get_pg_flags,
nmc_property_dcb_set_flags,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, PRIORITY_GROUP_ID),
nmc_property_dcb_get_pg_group_id,
nmc_property_dcb_set_pg_group_id,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, PRIORITY_GROUP_BANDWIDTH),
nmc_property_dcb_get_pg_group_bandwidth,
nmc_property_dcb_set_pg_group_bandwidth,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, PRIORITY_BANDWIDTH),
nmc_property_dcb_get_pg_bandwidth,
nmc_property_dcb_set_pg_bandwidth,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, PRIORITY_STRICT_BANDWIDTH),
nmc_property_dcb_get_pg_strict,
nmc_property_dcb_set_pg_strict,
NULL,
NULL,
NULL,
NULL);
nmc_add_prop_funcs (GLUE (DCB, PRIORITY_TRAFFIC_CLASS),
nmc_property_dcb_get_pg_traffic_class,
nmc_property_dcb_set_pg_traffic_class,
NULL,
NULL,
NULL,
NULL);
/* Add editable properties for NM_SETTING_GSM_SETTING_NAME */
nmc_add_prop_funcs (GLUE (GSM, NUMBER),
nmc_property_gsm_get_number,
@@ -6084,6 +6600,45 @@ setting_team_port_details (NMSetting *setting, NmCli *nmc)
return TRUE;
}
static gboolean
setting_dcb_details (NMSetting *setting, NmCli *nmc)
{
NMSettingDcb *s_dcb = NM_SETTING_DCB (setting);
NmcOutputField *tmpl, *arr;
size_t tmpl_len;
g_return_val_if_fail (NM_IS_SETTING_DCB (s_dcb), FALSE);
tmpl = nmc_fields_setting_dcb;
tmpl_len = sizeof (nmc_fields_setting_dcb);
nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_DCB_ALL, tmpl, NULL);
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES);
g_ptr_array_add (nmc->output_data, arr);
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
set_val_str (arr, 1, nmc_property_dcb_get_app_fcoe_flags (setting));
set_val_str (arr, 2, nmc_property_dcb_get_app_fcoe_priority (setting));
set_val_str (arr, 3, nmc_property_dcb_get_app_fcoe_mode (setting));
set_val_str (arr, 4, nmc_property_dcb_get_app_iscsi_flags (setting));
set_val_str (arr, 5, nmc_property_dcb_get_app_iscsi_priority (setting));
set_val_str (arr, 6, nmc_property_dcb_get_app_fip_flags (setting));
set_val_str (arr, 7, nmc_property_dcb_get_app_fip_priority (setting));
set_val_str (arr, 8, nmc_property_dcb_get_pfc_flags (setting));
set_val_str (arr, 9, nmc_property_dcb_get_pfc (setting));
set_val_str (arr, 10, nmc_property_dcb_get_pg_flags (setting));
set_val_str (arr, 11, nmc_property_dcb_get_pg_group_id (setting));
set_val_str (arr, 12, nmc_property_dcb_get_pg_group_bandwidth (setting));
set_val_str (arr, 13, nmc_property_dcb_get_pg_bandwidth (setting));
set_val_str (arr, 14, nmc_property_dcb_get_pg_strict (setting));
set_val_str (arr, 15, nmc_property_dcb_get_pg_traffic_class (setting));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
return TRUE;
}
typedef struct {
const char *sname;
gboolean (*func) (NMSetting *setting, NmCli *nmc);
@@ -6114,6 +6669,7 @@ static const SettingDetails detail_printers[] = {
{ NM_SETTING_BRIDGE_PORT_SETTING_NAME, setting_bridge_port_details },
{ NM_SETTING_TEAM_SETTING_NAME, setting_team_details },
{ NM_SETTING_TEAM_PORT_SETTING_NAME, setting_team_port_details },
{ NM_SETTING_DCB_SETTING_NAME, setting_dcb_details },
{ NULL },
};

View File

@@ -42,6 +42,7 @@
#include <nm-setting-bridge.h>
#include <nm-setting-bridge-port.h>
#include <nm-setting-vlan.h>
#include <nm-setting-dcb.h>
#include "nmcli.h"
#include "utils.h"