示例#1
0
gboolean
_dcb_setup (const char *iface,
            NMSettingDcb *s_dcb,
            DcbFunc run_func,
            gpointer user_data,
            GError **error)
{
	NMSettingDcbFlags flags;
	guint i;

	g_assert (s_dcb);

	/* FCoE */
	flags = nm_setting_dcb_get_app_fcoe_flags (s_dcb);
	SET_APP (flags, s_dcb, fcoe);

	/* iSCSI */
	flags = nm_setting_dcb_get_app_iscsi_flags (s_dcb);
	SET_APP (flags, s_dcb, iscsi);

	/* FIP */
	flags = nm_setting_dcb_get_app_fip_flags (s_dcb);
	SET_APP (flags, s_dcb, fip);

	/* Priority Flow Control */
	flags = nm_setting_dcb_get_priority_flow_control_flags (s_dcb);
	SET_FLAGS (flags, "pfc");
	if (flags & NM_SETTING_DCB_FLAG_ENABLE) {
		char buf[10];

		for (i = 0; i < 8; i++)
			buf[i] = nm_setting_dcb_get_priority_flow_control (s_dcb, i) ? '1' : '0';
		buf[i] = 0;
		if (!do_helper (iface, DCBTOOL, run_func, user_data, error, "pfc pfcup:%s", buf))
			return FALSE;
	}

	/* Priority Groups */
	flags = nm_setting_dcb_get_priority_group_flags (s_dcb);
	if (flags & NM_SETTING_DCB_FLAG_ENABLE) {
		GString *s;
		gboolean success;
		guint id;

		s = g_string_sized_new (150);

		g_string_append_printf (s, "pg e:1 a:%c w:%c",
		                        flags & NM_SETTING_DCB_FLAG_ADVERTISE ? '1' : '0',
		                        flags & NM_SETTING_DCB_FLAG_WILLING ? '1' : '0');

		/* Priority Groups */
		g_string_append (s, " pgid:");
		for (i = 0; i < 8; i++) {
			id = nm_setting_dcb_get_priority_group_id (s_dcb, i);
			g_assert (id < 8 || id == 15);
			g_string_append_c (s, (id < 8) ? ('0' + id) : 'f');
		}

		/* Priority Group Bandwidth */
		g_string_append_printf (s, " pgpct:%u,%u,%u,%u,%u,%u,%u,%u",
		                        nm_setting_dcb_get_priority_group_bandwidth (s_dcb, 0),
		                        nm_setting_dcb_get_priority_group_bandwidth (s_dcb, 1),
		                        nm_setting_dcb_get_priority_group_bandwidth (s_dcb, 2),
		                        nm_setting_dcb_get_priority_group_bandwidth (s_dcb, 3),
		                        nm_setting_dcb_get_priority_group_bandwidth (s_dcb, 4),
		                        nm_setting_dcb_get_priority_group_bandwidth (s_dcb, 5),
		                        nm_setting_dcb_get_priority_group_bandwidth (s_dcb, 6),
		                        nm_setting_dcb_get_priority_group_bandwidth (s_dcb, 7));

		/* Priority Bandwidth */
		g_string_append_printf (s, " uppct:%u,%u,%u,%u,%u,%u,%u,%u",
		                        nm_setting_dcb_get_priority_bandwidth (s_dcb, 0),
		                        nm_setting_dcb_get_priority_bandwidth (s_dcb, 1),
		                        nm_setting_dcb_get_priority_bandwidth (s_dcb, 2),
		                        nm_setting_dcb_get_priority_bandwidth (s_dcb, 3),
		                        nm_setting_dcb_get_priority_bandwidth (s_dcb, 4),
		                        nm_setting_dcb_get_priority_bandwidth (s_dcb, 5),
		                        nm_setting_dcb_get_priority_bandwidth (s_dcb, 6),
		                        nm_setting_dcb_get_priority_bandwidth (s_dcb, 7));

		/* Strict Bandwidth */
		g_string_append (s, " strict:");
		for (i = 0; i < 8; i++)
			g_string_append_c (s, nm_setting_dcb_get_priority_strict_bandwidth (s_dcb, i) ? '1' : '0');

		/* Priority Traffic Class */
		g_string_append (s, " up2tc:");
		for (i = 0; i < 8; i++) {
			id = nm_setting_dcb_get_priority_traffic_class (s_dcb, i);
			g_assert (id < 8);
			g_string_append_c (s, '0' + id);
		}

		success = do_helper (iface, DCBTOOL, run_func, user_data, error, "%s", s->str);
		g_string_free (s, TRUE);
		if (!success)
			return FALSE;
	} else {
		/* Ignore disable failure since lldpad <= 0.9.46 does not support disabling
		 * priority groups without specifying an entire PG config.
		 */
		(void) do_helper (iface, DCBTOOL, run_func, user_data, error, "pg e:0");
	}

	return TRUE;
}
示例#2
0
static void
ui_to_setting (CEPageDcb *self, NMSettingDcb *s_dcb)
{
	CEPage *parent = CE_PAGE (self);
	CEPageDcbPrivate *priv = CE_PAGE_DCB_GET_PRIVATE (self);
	NMSettingDcbFlags flags = NM_SETTING_DCB_FLAG_NONE;
	GtkWidget *widget;
	gboolean enabled, b;
	const char *tmp;
	guint i, num;

	enabled = gtk_toggle_button_get_active (priv->enabled);
	for (i = 0; i < G_N_ELEMENTS (features); i++) {
		const Feature *f = &features[i];

		flags = NM_SETTING_DCB_FLAG_NONE;

		/* Enable */
		widget = get_widget (parent->builder, f->prefix, "_enable_checkbutton");
		if (enabled && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
			flags |= NM_SETTING_DCB_FLAG_ENABLE;

		/* Advertise */
		widget = get_widget (parent->builder, f->prefix, "_advertise_checkbutton");
		if (enabled && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
			flags |= NM_SETTING_DCB_FLAG_ADVERTISE;

		/* Willing */
		widget = get_widget (parent->builder, f->prefix, "_willing_checkbutton");
		if (enabled && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
			flags |= NM_SETTING_DCB_FLAG_WILLING;

		g_object_set (G_OBJECT (s_dcb), f->flags_prop, flags, NULL);

		if (f->priority_prop) {
			gint idx = 0;

			widget = get_widget (parent->builder, f->prefix, "_priority_combo");
			if (enabled)
				idx = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
			g_object_set (G_OBJECT (s_dcb), f->priority_prop, (gint) (idx - 1), NULL);
		}
	}

	/* FCoE Mode */
	flags = nm_setting_dcb_get_app_fcoe_flags (s_dcb);
	tmp = NM_SETTING_DCB_FCOE_MODE_FABRIC;
	if (flags & NM_SETTING_DCB_FLAG_ENABLE) {
		widget = get_widget (parent->builder, "fcoe", "_mode_combo");
		num = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
		if (num == 0)
			tmp = NM_SETTING_DCB_FCOE_MODE_FABRIC;
		else if (num == 1)
			tmp = NM_SETTING_DCB_FCOE_MODE_VN2VN;
		else
			g_assert_not_reached ();
	}
	g_object_set (G_OBJECT (s_dcb), NM_SETTING_DCB_APP_FCOE_MODE, tmp, NULL);

	/* Priority Flow Control */
	flags = nm_setting_dcb_get_priority_flow_control_flags (s_dcb);
	for (i = 0; i < 8; i++) {
		b = FALSE;
		if (flags & NM_SETTING_DCB_FLAG_ENABLE)
			b = nm_setting_dcb_get_priority_flow_control (priv->options, i);
		nm_setting_dcb_set_priority_flow_control (s_dcb, i, b);
	}

	/* Priority Groups */
	flags = nm_setting_dcb_get_priority_group_flags (s_dcb);
	for (i = 0; i < 8; i++) {
		/* Group ID */
		num = 0;
		if (flags & NM_SETTING_DCB_FLAG_ENABLE)
			num = nm_setting_dcb_get_priority_group_id (priv->options, i);
		nm_setting_dcb_set_priority_group_id (s_dcb, i, num);

		num = 0;
		if (flags & NM_SETTING_DCB_FLAG_ENABLE)
			num = nm_setting_dcb_get_priority_group_bandwidth (priv->options, i);
		nm_setting_dcb_set_priority_group_bandwidth (s_dcb, i, num);

		num = 0;
		if (flags & NM_SETTING_DCB_FLAG_ENABLE)
			num = nm_setting_dcb_get_priority_bandwidth (priv->options, i);
		nm_setting_dcb_set_priority_bandwidth (s_dcb, i, num);

		b = 0;
		if (flags & NM_SETTING_DCB_FLAG_ENABLE)
			b = nm_setting_dcb_get_priority_strict_bandwidth (priv->options, i);
		nm_setting_dcb_set_priority_strict_bandwidth (s_dcb, i, b);

		num = 0;
		if (flags & NM_SETTING_DCB_FLAG_ENABLE)
			num = nm_setting_dcb_get_priority_traffic_class (priv->options, i);
		nm_setting_dcb_set_priority_traffic_class (s_dcb, i, num);
	}

}