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; }
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); } }