diff options
Diffstat (limited to 'libnm-util/nm-setting-dcb.c')
| -rw-r--r-- | libnm-util/nm-setting-dcb.c | 1219 |
1 files changed, 0 insertions, 1219 deletions
diff --git a/libnm-util/nm-setting-dcb.c b/libnm-util/nm-setting-dcb.c deleted file mode 100644 index c3cf89dd..00000000 --- a/libnm-util/nm-setting-dcb.c +++ /dev/null @@ -1,1219 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ - -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <dbus/dbus-glib.h> - -#include "nm-setting-dcb.h" -#include "nm-param-spec-specialized.h" -#include "nm-utils.h" -#include "nm-utils-private.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-private.h" - -/** - * SECTION:nm-setting-dcb - * @short_description: Connection properties for Data Center Bridging - * @include: nm-setting-dcb.h - * - * The #NMSettingDcb object is a #NMSetting subclass that describes properties - * for enabling and using Data Center Bridging (DCB) on Ethernet networks. - * DCB is a set of protocols (including 802.1Qbb, 802.1Qaz, 802.1Qau, and - * 802.1AB) to eliminate packet loss in Ethernet networks and support the use - * of storage technologies like Fibre Channel over Ethernet (FCoE) and iSCSI. - * - * Since: 0.9.10 - **/ - -/** - * nm_setting_dcb_error_quark: - * - * Registers an error quark for #NMSettingDcb if necessary. - * - * Returns: the error quark used for #NMSettingDcb errors. - * - * Since: 0.9.10 - **/ -GQuark -nm_setting_dcb_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-setting-dcb-error-quark"); - return quark; -} - -G_DEFINE_TYPE_WITH_CODE (NMSettingDcb, nm_setting_dcb, NM_TYPE_SETTING, - _nm_register_setting (NM_SETTING_DCB_SETTING_NAME, - g_define_type_id, - 2, - NM_SETTING_DCB_ERROR)) -NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_DCB) - -#define NM_SETTING_DCB_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_DCB, NMSettingDcbPrivate)) - -typedef struct { - NMSettingDcbFlags app_fcoe_flags; - int app_fcoe_priority; - char * app_fcoe_mode; - - NMSettingDcbFlags app_iscsi_flags; - int app_iscsi_priority; - - NMSettingDcbFlags app_fip_flags; - int app_fip_priority; - - /* Priority Flow Control */ - NMSettingDcbFlags pfc_flags; - guint pfc[8]; - - /* Priority Groups */ - NMSettingDcbFlags priority_group_flags; - guint priority_group_id[8]; - guint priority_group_bandwidth[8]; - guint priority_bandwidth[8]; - guint priority_strict[8]; - guint priority_traffic_class[8]; -} NMSettingDcbPrivate; - -enum { - PROP_0, - PROP_APP_FCOE_FLAGS, - PROP_APP_FCOE_PRIORITY, - PROP_APP_FCOE_MODE, - - PROP_APP_ISCSI_FLAGS, - PROP_APP_ISCSI_PRIORITY, - - PROP_APP_FIP_FLAGS, - PROP_APP_FIP_PRIORITY, - - PROP_PFC_FLAGS, - PROP_PFC, - - PROP_PRIORITY_GROUP_FLAGS, - PROP_PRIORITY_GROUP_ID, - PROP_PRIORITY_GROUP_BANDWIDTH, - PROP_PRIORITY_BANDWIDTH, - PROP_PRIORITY_STRICT, - PROP_PRIORITY_TRAFFIC_CLASS, - - LAST_PROP -}; - -/** - * nm_setting_dcb_new: - * - * Creates a new #NMSettingDcb object with default values. - * - * Returns: (transfer full): the new empty #NMSettingDcb object - * - * Since: 0.9.10 - **/ -NMSetting * -nm_setting_dcb_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_DCB, NULL); -} - -/** - * nm_setting_dcb_get_app_fcoe_flags: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-fcoe-flags property of the setting - * - * Since: 0.9.10 - **/ -NMSettingDcbFlags -nm_setting_dcb_get_app_fcoe_flags (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_fcoe_flags; -} - -/** - * nm_setting_dcb_get_app_fcoe_priority: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-fcoe-priority property of the setting - * - * Since: 0.9.10 - **/ -int -nm_setting_dcb_get_app_fcoe_priority (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_fcoe_priority; -} - -/** - * nm_setting_dcb_get_app_fcoe_mode: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-fcoe-mode property of the setting - * - * Since: 0.9.10 - **/ -const char * -nm_setting_dcb_get_app_fcoe_mode (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), NULL); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_fcoe_mode; -} - -/** - * nm_setting_dcb_get_app_iscsi_flags: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-iscsi-flags property of the setting - * - * Since: 0.9.10 - **/ -NMSettingDcbFlags -nm_setting_dcb_get_app_iscsi_flags (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_iscsi_flags; -} - -/** - * nm_setting_dcb_get_app_iscsi_priority: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-iscsi-priority property of the setting - * - * Since: 0.9.10 - **/ -int -nm_setting_dcb_get_app_iscsi_priority (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_iscsi_priority; -} - -/** - * nm_setting_dcb_get_app_fip_flags: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-fip-flags property of the setting - * - * Since: 0.9.10 - **/ -NMSettingDcbFlags -nm_setting_dcb_get_app_fip_flags (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_fip_flags; -} - -/** - * nm_setting_dcb_get_app_fip_priority: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:app-fip-priority property of the setting - * - * Since: 0.9.10 - **/ -int -nm_setting_dcb_get_app_fip_priority (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->app_fip_priority; -} - -/** - * nm_setting_dcb_get_priority_flow_control_flags: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:priority-flow-control-flags property of the setting - * - * Since: 0.9.10 - **/ -NMSettingDcbFlags -nm_setting_dcb_get_priority_flow_control_flags (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->pfc_flags; -} - -/** - * nm_setting_dcb_get_priority_flow_control: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to retrieve flow control for - * - * Returns: %TRUE if flow control is enabled for the given @user_priority, - * %FALSE if not enabled - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_dcb_get_priority_flow_control (NMSettingDcb *setting, guint user_priority) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), FALSE); - g_return_val_if_fail (user_priority <= 7, FALSE); - - return !!NM_SETTING_DCB_GET_PRIVATE (setting)->pfc[user_priority]; -} - -/** - * nm_setting_dcb_set_priority_flow_control: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to set flow control for - * @enabled: %TRUE to enable flow control for this priority, %FALSE to disable it - * - * These values are only valid when #NMSettingDcb:priority-flow-control includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_flow_control (NMSettingDcb *setting, - guint user_priority, - gboolean enabled) -{ - NMSettingDcbPrivate *priv; - guint uint_enabled = enabled ? 1 : 0; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (user_priority <= 7); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->pfc[user_priority] != uint_enabled) { - priv->pfc[user_priority] = uint_enabled; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_FLOW_CONTROL); - } -} - -/** - * nm_setting_dcb_get_priority_group_flags: - * @setting: the #NMSettingDcb - * - * Returns: the #NMSettingDcb:priority-group-flags property of the setting - * - * Since: 0.9.10 - **/ -NMSettingDcbFlags -nm_setting_dcb_get_priority_group_flags (NMSettingDcb *setting) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->priority_group_flags; -} - -/** - * nm_setting_dcb_get_priority_group_id: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to retrieve the group ID for - * - * Returns: the group number @user_priority is assigned to. These values are - * only valid when #NMSettingDcb:priority-group-flags includes the - * %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -guint -nm_setting_dcb_get_priority_group_id (NMSettingDcb *setting, guint user_priority) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - g_return_val_if_fail (user_priority <= 7, 0); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->priority_group_id[user_priority]; -} - -/** - * nm_setting_dcb_set_priority_group_id: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to set flow control for - * @group_id: the group (0 - 7) to assign @user_priority to, or 15 for the - * unrestricted group. - * - * These values are only valid when #NMSettingDcb:priority-group-flags includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_group_id (NMSettingDcb *setting, - guint user_priority, - guint group_id) -{ - NMSettingDcbPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (user_priority <= 7); - g_return_if_fail (group_id <= 7 || group_id == 15); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->priority_group_id[user_priority] != group_id) { - priv->priority_group_id[user_priority] = group_id; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_GROUP_ID); - } -} - -/** - * nm_setting_dcb_get_priority_group_bandwidth: - * @setting: the #NMSettingDcb - * @group_id: the priority group (0 - 7) to retrieve the bandwidth percentage for - * - * Returns: the bandwidth percentage assigned to @group_id. These values are - * only valid when #NMSettingDcb:priority-group-flags includes the - * %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -guint -nm_setting_dcb_get_priority_group_bandwidth (NMSettingDcb *setting, guint group_id) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - g_return_val_if_fail (group_id <= 7, FALSE); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->priority_group_bandwidth[group_id]; -} - -/** - * nm_setting_dcb_set_priority_group_bandwidth: - * @setting: the #NMSettingDcb - * @group_id: the priority group (0 - 7) to set the bandwidth percentage for - * @bandwidth_percent: the bandwidth percentage (0 - 100) to assign to @group_id to - * - * These values are only valid when #NMSettingDcb:priority-group-flags includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_group_bandwidth (NMSettingDcb *setting, - guint group_id, - guint bandwidth_percent) -{ - NMSettingDcbPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (group_id <= 7); - g_return_if_fail (bandwidth_percent <= 100); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->priority_group_bandwidth[group_id] != bandwidth_percent) { - priv->priority_group_bandwidth[group_id] = bandwidth_percent; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH); - } -} - -/** - * nm_setting_dcb_get_priority_bandwidth: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to retrieve the group bandwidth percentage for - * - * Returns: the allowed bandwidth percentage of @user_priority in its priority group. - * These values are only valid when #NMSettingDcb:priority-group-flags includes the - * %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -guint -nm_setting_dcb_get_priority_bandwidth (NMSettingDcb *setting, guint user_priority) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - g_return_val_if_fail (user_priority <= 7, FALSE); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->priority_bandwidth[user_priority]; -} - -/** - * nm_setting_dcb_set_priority_bandwidth: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to set the bandwidth percentage for - * @bandwidth_percent: the bandwidth percentage (0 - 100) that @user_priority is - * allowed to use within its priority group - * - * These values are only valid when #NMSettingDcb:priority-group-flags includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_bandwidth (NMSettingDcb *setting, - guint user_priority, - guint bandwidth_percent) -{ - NMSettingDcbPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (user_priority <= 7); - g_return_if_fail (bandwidth_percent <= 100); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->priority_bandwidth[user_priority] != bandwidth_percent) { - priv->priority_bandwidth[user_priority] = bandwidth_percent; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_BANDWIDTH); - } -} - -/** - * nm_setting_dcb_get_priority_strict_bandwidth: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to retrieve strict bandwidth for - * - * Returns: %TRUE if @user_priority may use all of the bandwidth allocated to its - * assigned group, or %FALSE if not. These values are only valid when - * #NMSettingDcb:priority-group-flags includes the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -gboolean -nm_setting_dcb_get_priority_strict_bandwidth (NMSettingDcb *setting, guint user_priority) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - g_return_val_if_fail (user_priority <= 7, FALSE); - - return !!NM_SETTING_DCB_GET_PRIVATE (setting)->priority_strict[user_priority]; -} - -/** - * nm_setting_dcb_set_priority_strict_bandwidth: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to set strict bandwidth for - * @strict: %TRUE to allow @user_priority to use all the bandwidth allocated to - * its priority group, or %FALSE if not - * - * These values are only valid when #NMSettingDcb:priority-group-flags includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_strict_bandwidth (NMSettingDcb *setting, - guint user_priority, - gboolean strict) -{ - NMSettingDcbPrivate *priv; - guint uint_strict = strict ? 1 : 0; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (user_priority <= 7); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->priority_strict[user_priority] != uint_strict) { - priv->priority_strict[user_priority] = uint_strict; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH); - } -} - -/** - * nm_setting_dcb_get_priority_traffic_class: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to retrieve the traffic class for - * - * Returns: the traffic class assigned to @user_priority. These values are only - * valid when #NMSettingDcb:priority-group-flags includes the - * %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -guint -nm_setting_dcb_get_priority_traffic_class (NMSettingDcb *setting, guint user_priority) -{ - g_return_val_if_fail (NM_IS_SETTING_DCB (setting), 0); - g_return_val_if_fail (user_priority <= 7, FALSE); - - return NM_SETTING_DCB_GET_PRIVATE (setting)->priority_traffic_class[user_priority]; -} - -/** - * nm_setting_dcb_set_priority_traffic_clas: - * @setting: the #NMSettingDcb - * @user_priority: the User Priority (0 - 7) to set the bandwidth percentage for - * @traffic_class: the traffic_class (0 - 7) that @user_priority should map to - * - * These values are only valid when #NMSettingDcb:priority-group-flags includes - * the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ -void -nm_setting_dcb_set_priority_traffic_class (NMSettingDcb *setting, - guint user_priority, - guint traffic_class) -{ - NMSettingDcbPrivate *priv; - - g_return_if_fail (NM_IS_SETTING_DCB (setting)); - g_return_if_fail (user_priority <= 7); - g_return_if_fail (traffic_class <= 7); - - priv = NM_SETTING_DCB_GET_PRIVATE (setting); - if (priv->priority_traffic_class[user_priority] != traffic_class) { - priv->priority_traffic_class[user_priority] = traffic_class; - g_object_notify (G_OBJECT (setting), NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS); - } -} - -/*****************************************************************************/ - -#define DCB_FLAGS_ALL (NM_SETTING_DCB_FLAG_ENABLE | \ - NM_SETTING_DCB_FLAG_ADVERTISE | \ - NM_SETTING_DCB_FLAG_WILLING) - -static gboolean -check_dcb_flags (NMSettingDcbFlags flags, const char *prop_name, GError **error) -{ - if (flags & ~DCB_FLAGS_ALL) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("flags invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - - if (!(flags & NM_SETTING_DCB_FLAG_ENABLE) && (flags & ~NM_SETTING_DCB_FLAG_ENABLE)) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("flags invalid - disabled")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - - return TRUE; -} - -static gboolean -check_uint_array (const guint *array, - guint len, - NMSettingDcbFlags flags, - guint max, - guint extra, - gboolean sum_pct, - const char *prop_name, - GError **error) -{ - guint i, sum = 0; - - /* Ensure each element is <= to max or equals extra */ - for (i = 0; i < len; i++) { - if (!(flags & NM_SETTING_DCB_FLAG_ENABLE) && array[i]) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("property invalid (not enabled)")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - - if ((array[i] > max) && (array[i] != extra)) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("element invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - sum += array[i]; - } - - /* Verify sum of percentages */ - if (sum_pct) { - if (flags & NM_SETTING_DCB_FLAG_ENABLE) { - /* If the feature is enabled, sum must equal 100% */ - if (sum != 100) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("sum not 100%")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - } else { - /* If the feature is disabled, sum must equal 0%, which was checked - * by the for() loop above. - */ - g_assert_cmpint (sum, ==, 0); - } - } - - return TRUE; -} - -static gboolean -check_priority (int val, - NMSettingDcbFlags flags, - const char *prop_name, - GError **error) -{ - if (!(flags & NM_SETTING_DCB_FLAG_ENABLE) && (val >= 0)) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("property invalid (not enabled)")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - - if (val < -1 || val > 7) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("property invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, prop_name); - return FALSE; - } - return TRUE; -} - -static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) -{ - NMSettingDcbPrivate *priv = NM_SETTING_DCB_GET_PRIVATE (setting); - - if (!check_dcb_flags (priv->app_fcoe_flags, NM_SETTING_DCB_APP_FCOE_FLAGS, error)) - return FALSE; - - if (!check_priority (priv->app_fcoe_priority, priv->app_fcoe_flags, NM_SETTING_DCB_APP_FCOE_PRIORITY, error)) - return FALSE; - - if (!priv->app_fcoe_mode) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_MISSING_PROPERTY, - _("property missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, NM_SETTING_DCB_APP_FCOE_MODE); - return FALSE; - } - - if (strcmp (priv->app_fcoe_mode, NM_SETTING_DCB_FCOE_MODE_FABRIC) && - strcmp (priv->app_fcoe_mode, NM_SETTING_DCB_FCOE_MODE_VN2VN)) { - g_set_error_literal (error, - NM_SETTING_DCB_ERROR, - NM_SETTING_DCB_ERROR_INVALID_PROPERTY, - _("property invalid")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_DCB_SETTING_NAME, NM_SETTING_DCB_APP_FCOE_MODE); - return FALSE; - } - - if (!check_dcb_flags (priv->app_iscsi_flags, NM_SETTING_DCB_APP_ISCSI_FLAGS, error)) - return FALSE; - - if (!check_priority (priv->app_iscsi_priority, priv->app_iscsi_flags, NM_SETTING_DCB_APP_ISCSI_PRIORITY, error)) - return FALSE; - - if (!check_dcb_flags (priv->app_fip_flags, NM_SETTING_DCB_APP_FIP_FLAGS, error)) - return FALSE; - - if (!check_priority (priv->app_fip_priority, priv->app_fip_flags, NM_SETTING_DCB_APP_FIP_PRIORITY, error)) - return FALSE; - - if (!check_dcb_flags (priv->pfc_flags, NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS, error)) - return FALSE; - - if (!check_uint_array (priv->pfc, G_N_ELEMENTS (priv->pfc), priv->pfc_flags, 1, 0, FALSE, NM_SETTING_DCB_PRIORITY_FLOW_CONTROL, error)) - return FALSE; - - if (!check_dcb_flags (priv->priority_group_flags, NM_SETTING_DCB_PRIORITY_GROUP_FLAGS, error)) - return FALSE; - - if (!check_uint_array (priv->priority_group_id, - G_N_ELEMENTS (priv->priority_group_id), - priv->priority_group_flags, - 7, - 15, - FALSE, - NM_SETTING_DCB_PRIORITY_GROUP_ID, - error)) - return FALSE; - - if (!check_uint_array (priv->priority_group_bandwidth, - G_N_ELEMENTS (priv->priority_group_bandwidth), - priv->priority_group_flags, - 100, - 0, - TRUE, - NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH, - error)) - return FALSE; - - /* FIXME: sum bandwidths in each group */ - if (!check_uint_array (priv->priority_bandwidth, - G_N_ELEMENTS (priv->priority_bandwidth), - priv->priority_group_flags, - 100, - 0, - FALSE, - NM_SETTING_DCB_PRIORITY_BANDWIDTH, - error)) - return FALSE; - - if (!check_uint_array (priv->priority_strict, - G_N_ELEMENTS (priv->priority_strict), - priv->priority_group_flags, - 1, - 0, - FALSE, - NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH, - error)) - return FALSE; - - if (!check_uint_array (priv->priority_traffic_class, - G_N_ELEMENTS (priv->priority_traffic_class), - priv->priority_group_flags, - 7, - 0, - FALSE, - NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS, - error)) - return FALSE; - - return TRUE; -} - -/*****************************************************************************/ - -static void -nm_setting_dcb_init (NMSettingDcb *setting) -{ -} - -static void -set_uint_array (const GValue *v, uint *a, size_t len) -{ - GArray *src = g_value_get_boxed (v); - const guint total_len = len * sizeof (a[0]); - - memset (a, 0, total_len); - if (src) { - g_return_if_fail (g_array_get_element_size (src) == sizeof (a[0])); - g_return_if_fail (src->len == len); - memcpy (a, src->data, total_len); - } -} -#define SET_UINT_ARRAY(v, a) set_uint_array (v, a, G_N_ELEMENTS (a)) - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMSettingDcbPrivate *priv = NM_SETTING_DCB_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_APP_FCOE_FLAGS: - priv->app_fcoe_flags = g_value_get_uint (value); - break; - case PROP_APP_FCOE_PRIORITY: - priv->app_fcoe_priority = g_value_get_int (value); - break; - case PROP_APP_FCOE_MODE: - g_free (priv->app_fcoe_mode); - priv->app_fcoe_mode = g_value_dup_string (value); - break; - case PROP_APP_ISCSI_FLAGS: - priv->app_iscsi_flags = g_value_get_uint (value); - break; - case PROP_APP_ISCSI_PRIORITY: - priv->app_iscsi_priority = g_value_get_int (value); - break; - case PROP_APP_FIP_FLAGS: - priv->app_fip_flags = g_value_get_uint (value); - break; - case PROP_APP_FIP_PRIORITY: - priv->app_fip_priority = g_value_get_int (value); - break; - case PROP_PFC_FLAGS: - priv->pfc_flags = g_value_get_uint (value); - break; - case PROP_PFC: - SET_UINT_ARRAY (value, priv->pfc); - break; - case PROP_PRIORITY_GROUP_FLAGS: - priv->priority_group_flags = g_value_get_uint (value); - break; - case PROP_PRIORITY_GROUP_ID: - SET_UINT_ARRAY (value, priv->priority_group_id); - break; - case PROP_PRIORITY_GROUP_BANDWIDTH: - SET_UINT_ARRAY (value, priv->priority_group_bandwidth); - break; - case PROP_PRIORITY_BANDWIDTH: - SET_UINT_ARRAY (value, priv->priority_bandwidth); - break; - case PROP_PRIORITY_STRICT: - SET_UINT_ARRAY (value, priv->priority_strict); - break; - case PROP_PRIORITY_TRAFFIC_CLASS: - SET_UINT_ARRAY (value, priv->priority_traffic_class); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -#define TAKE_UINT_ARRAY(v, a) \ -{ \ - guint len = G_N_ELEMENTS (a); \ - GArray *dst = g_array_sized_new (FALSE, TRUE, sizeof (guint), len); \ - g_array_append_vals (dst, (a), len); \ - g_value_take_boxed (v, dst); \ -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMSettingDcb *setting = NM_SETTING_DCB (object); - NMSettingDcbPrivate *priv = NM_SETTING_DCB_GET_PRIVATE (setting); - - switch (prop_id) { - case PROP_APP_FCOE_FLAGS: - g_value_set_uint (value, priv->app_fcoe_flags); - break; - case PROP_APP_FCOE_PRIORITY: - g_value_set_int (value, priv->app_fcoe_priority); - break; - case PROP_APP_FCOE_MODE: - g_value_set_string (value, priv->app_fcoe_mode); - break; - case PROP_APP_ISCSI_FLAGS: - g_value_set_uint (value, priv->app_iscsi_flags); - break; - case PROP_APP_ISCSI_PRIORITY: - g_value_set_int (value, priv->app_iscsi_priority); - break; - case PROP_APP_FIP_FLAGS: - g_value_set_uint (value, priv->app_fip_flags); - break; - case PROP_APP_FIP_PRIORITY: - g_value_set_int (value, priv->app_fip_priority); - break; - case PROP_PFC_FLAGS: - g_value_set_uint (value, priv->pfc_flags); - break; - case PROP_PFC: - TAKE_UINT_ARRAY (value, priv->pfc); - break; - case PROP_PRIORITY_GROUP_FLAGS: - g_value_set_uint (value, priv->priority_group_flags); - break; - case PROP_PRIORITY_GROUP_ID: - TAKE_UINT_ARRAY (value, priv->priority_group_id); - break; - case PROP_PRIORITY_GROUP_BANDWIDTH: - TAKE_UINT_ARRAY (value, priv->priority_group_bandwidth); - break; - case PROP_PRIORITY_BANDWIDTH: - TAKE_UINT_ARRAY (value, priv->priority_bandwidth); - break; - case PROP_PRIORITY_STRICT: - TAKE_UINT_ARRAY (value, priv->priority_strict); - break; - case PROP_PRIORITY_TRAFFIC_CLASS: - TAKE_UINT_ARRAY (value, priv->priority_traffic_class); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -finalize (GObject *object) -{ - NMSettingDcbPrivate *priv = NM_SETTING_DCB_GET_PRIVATE (object); - - g_free (priv->app_fcoe_mode); - - G_OBJECT_CLASS (nm_setting_dcb_parent_class)->finalize (object); -} - -static void -nm_setting_dcb_class_init (NMSettingDcbClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingDcbPrivate)); - - /* virtual methods */ - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->finalize = finalize; - parent_class->verify = verify; - - /* Properties */ - /** - * NMSettingDcb:app-fcoe-flags: - * - * Specifies the #NMSettingDcbFlags for the DCB FCoE application. Flags may - * be any combination of %NM_SETTING_DCB_FLAG_ENABLE, - * %NM_SETTING_DCB_FLAG_ADVERTISE, and %NM_SETTING_DCB_FLAG_WILLING. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_FCOE_FLAGS, - g_param_spec_uint (NM_SETTING_DCB_APP_FCOE_FLAGS, "", "", - 0, DCB_FLAGS_ALL, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-fcoe-priority: - * - * The highest User Priority (0 - 7) which FCoE frames should use, or -1 for - * default priority. Only used when the #NMSettingDcb:app-fcoe-flags - * property includes the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_FCOE_PRIORITY, - g_param_spec_int (NM_SETTING_DCB_APP_FCOE_PRIORITY, "", "", - -1, 7, -1, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-fcoe-mode: - * - * The FCoE controller mode; either %NM_SETTING_DCB_FCOE_MODE_FABRIC - * (default) or %NM_SETTING_DCB_FCOE_MODE_VN2VN. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_FCOE_MODE, - g_param_spec_string (NM_SETTING_DCB_APP_FCOE_MODE, "", "", - NM_SETTING_DCB_FCOE_MODE_FABRIC, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-iscsi-flags: - * - * Specifies the #NMSettingDcbFlags for the DCB iSCSI application. Flags - * may be any combination of %NM_SETTING_DCB_FLAG_ENABLE, - * %NM_SETTING_DCB_FLAG_ADVERTISE, and %NM_SETTING_DCB_FLAG_WILLING. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_ISCSI_FLAGS, - g_param_spec_uint (NM_SETTING_DCB_APP_ISCSI_FLAGS, "", "", - 0, DCB_FLAGS_ALL, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-iscsi-priority: - * - * The highest User Priority (0 - 7) which iSCSI frames should use, or -1 - * for default priority. Only used when the #NMSettingDcb:app-iscsi-flags - * property includes the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_ISCSI_PRIORITY, - g_param_spec_int (NM_SETTING_DCB_APP_ISCSI_PRIORITY, "", "", - -1, 7, -1, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-fip-flags: - * - * Specifies the #NMSettingDcbFlags for the DCB FIP application. Flags may - * be any combination of %NM_SETTING_DCB_FLAG_ENABLE, - * %NM_SETTING_DCB_FLAG_ADVERTISE, and %NM_SETTING_DCB_FLAG_WILLING. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_FIP_FLAGS, - g_param_spec_uint (NM_SETTING_DCB_APP_FIP_FLAGS, "", "", - 0, DCB_FLAGS_ALL, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:app-fip-priority: - * - * The highest User Priority (0 - 7) which FIP frames should use, or -1 for - * default priority. Only used when the #NMSettingDcb:app-fip-flags - * property includes the %NM_SETTING_DCB_FLAG_ENABLE flag. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_APP_FIP_PRIORITY, - g_param_spec_int (NM_SETTING_DCB_APP_FIP_PRIORITY, "", "", - -1, 7, -1, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-flow-control-flags: - * - * Specifies the #NMSettingDcbFlags for DCB Priority Flow Control (PFC). - * Flags may be any combination of %NM_SETTING_DCB_FLAG_ENABLE, - * %NM_SETTING_DCB_FLAG_ADVERTISE, and %NM_SETTING_DCB_FLAG_WILLING. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PFC_FLAGS, - g_param_spec_uint (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS, "", "", - 0, DCB_FLAGS_ALL, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-flow-control: - * - * An array of 8 uint values, where the array index corresponds to the User - * Priority (0 - 7) and the value indicates whether or not the corresponding - * priority should transmit priority pause. Allowed values are 0 (do not - * transmit pause) and 1 (transmit pause). - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PFC, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-group-flags: - * - * Specifies the #NMSettingDcbFlags for DCB Priority Groups. Flags may be - * any combination of %NM_SETTING_DCB_FLAG_ENABLE, - * %NM_SETTING_DCB_FLAG_ADVERTISE, and %NM_SETTING_DCB_FLAG_WILLING. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_GROUP_FLAGS, - g_param_spec_uint (NM_SETTING_DCB_PRIORITY_GROUP_FLAGS, "", "", - 0, DCB_FLAGS_ALL, 0, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-group-id: - * - * An array of 8 uint values, where the array index corresponds to the User - * Priority (0 - 7) and the value indicates the Priority Group ID. Allowed - * Priority Group ID values are 0 - 7 or 15 for the unrestricted group. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_GROUP_ID, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_GROUP_ID, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-group-bandwidth: - * - * An array of 8 uint values, where the array index corresponds to the - * Priority Group ID (0 - 7) and the value indicates the percentage of link - * bandwidth allocated to that group. Allowed values are 0 - 100, and the - * sum of all values must total 100 percents. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_GROUP_BANDWIDTH, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-bandwidth: - * - * An array of 8 uint values, where the array index corresponds to the User - * Priority (0 - 7) and the value indicates the percentage of bandwidth of - * the priority's assigned group that the priority may use. The sum of all - * percentages for priorities which belong to the same group must total 100 - * percents. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_BANDWIDTH, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_BANDWIDTH, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-strict-bandwidth: - * - * An array of 8 uint values, where the array index corresponds to the User - * Priority (0 - 7) and the value indicates whether or not the priority may - * use all of the bandwidth allocated to its assigned group. Allowed values - * are 0 (the priority may not utilize all bandwidth) or 1 (the priority may - * utilize all bandwidth). - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_STRICT, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSettingDcb:priority-traffic-class: - * - * An array of 8 uint values, where the array index corresponds to the User - * Priority (0 - 7) and the value indicates the traffic class (0 - 7) to - * which the priority is mapped. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PRIORITY_TRAFFIC_CLASS, - _nm_param_spec_specialized (NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS, "", "", - DBUS_TYPE_G_UINT_ARRAY, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); -} |