|
Packit Service |
639700 |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit |
fabffb |
/* NetworkManager Connection editor -- Connection editor for NetworkManager
|
|
Packit |
fabffb |
*
|
|
Packit |
fabffb |
* Copyright 2012 - 2014 Red Hat, Inc.
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "nm-default.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include <net/if_arp.h>
|
|
Packit |
fabffb |
#include <linux/if_infiniband.h>
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "page-infiniband.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
G_DEFINE_TYPE (CEPageInfiniband, ce_page_infiniband, CE_TYPE_PAGE)
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#define CE_PAGE_INFINIBAND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CE_TYPE_PAGE_INFINIBAND, CEPageInfinibandPrivate))
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
typedef struct {
|
|
Packit |
fabffb |
NMSettingInfiniband *setting;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
GtkComboBoxText *device_combo; /* Device identification (ifname and/or MAC) */
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
GtkComboBox *transport_mode;
|
|
Packit |
fabffb |
GtkSpinButton *mtu;
|
|
Packit |
fabffb |
} CEPageInfinibandPrivate;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#define TRANSPORT_MODE_DATAGRAM 0
|
|
Packit |
fabffb |
#define TRANSPORT_MODE_CONNECTED 1
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
infiniband_private_init (CEPageInfiniband *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageInfinibandPrivate *priv = CE_PAGE_INFINIBAND_GET_PRIVATE (self);
|
|
Packit |
fabffb |
GtkBuilder *builder;
|
|
Packit |
fabffb |
GtkWidget *vbox;
|
|
Packit |
fabffb |
GtkLabel *label;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
builder = CE_PAGE (self)->builder;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->device_combo = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
|
|
Packit |
fabffb |
gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (priv->device_combo), 0);
|
|
Packit |
fabffb |
gtk_widget_set_tooltip_text (GTK_WIDGET (priv->device_combo),
|
|
Packit |
fabffb |
_("This option locks this connection to the network device specified "
|
|
Packit |
fabffb |
"either by its interface name or permanent MAC or both. Examples: "
|
|
Packit |
fabffb |
"“ib0”, “80:00:00:48:fe:80:00:00:00:00:00:00:00:02:c9:03:00:00:0f:65”, "
|
|
Packit |
fabffb |
"“ib0 (80:00:00:48:fe:80:00:00:00:00:00:00:00:02:c9:03:00:00:0f:65)”"));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
vbox = GTK_WIDGET (gtk_builder_get_object (builder, "infiniband_device_vbox"));
|
|
Packit |
fabffb |
gtk_container_add (GTK_CONTAINER (vbox), GTK_WIDGET (priv->device_combo));
|
|
Packit |
fabffb |
gtk_widget_set_halign (GTK_WIDGET (priv->device_combo), GTK_ALIGN_FILL);
|
|
Packit |
fabffb |
gtk_widget_show_all (GTK_WIDGET (priv->device_combo));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Set mnemonic widget for Device label */
|
|
Packit |
fabffb |
label = GTK_LABEL (gtk_builder_get_object (builder, "infiniband_device_label"));
|
|
Packit |
fabffb |
gtk_label_set_mnemonic_widget (label, GTK_WIDGET (priv->device_combo));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->transport_mode = GTK_COMBO_BOX (gtk_builder_get_object (builder, "infiniband_mode"));
|
|
Packit |
fabffb |
priv->mtu = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "infiniband_mtu"));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
stuff_changed (GtkWidget *w, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
ce_page_changed (CE_PAGE (user_data));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
populate_ui (CEPageInfiniband *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageInfinibandPrivate *priv = CE_PAGE_INFINIBAND_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMSettingInfiniband *setting = priv->setting;
|
|
Packit |
fabffb |
const char *mode;
|
|
Packit |
fabffb |
int mode_idx = TRANSPORT_MODE_DATAGRAM;
|
|
Packit |
fabffb |
int mtu_def;
|
|
Packit |
fabffb |
const char *s_ifname, *s_mac;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Port */
|
|
Packit |
fabffb |
mode = nm_setting_infiniband_get_transport_mode (setting);
|
|
Packit |
fabffb |
if (mode) {
|
|
Packit |
fabffb |
if (!strcmp (mode, "datagram"))
|
|
Packit |
fabffb |
mode_idx = TRANSPORT_MODE_DATAGRAM;
|
|
Packit |
fabffb |
else if (!strcmp (mode, "connected"))
|
|
Packit |
fabffb |
mode_idx = TRANSPORT_MODE_CONNECTED;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
gtk_combo_box_set_active (priv->transport_mode, mode_idx);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Device */
|
|
Packit |
fabffb |
s_ifname = nm_connection_get_interface_name (CE_PAGE (self)->connection);
|
|
Packit |
fabffb |
s_mac = nm_setting_infiniband_get_mac_address (setting);
|
|
Packit |
fabffb |
ce_page_setup_device_combo (CE_PAGE (self), GTK_COMBO_BOX (priv->device_combo),
|
|
Packit |
fabffb |
NM_TYPE_DEVICE_INFINIBAND, s_ifname,
|
|
Packit |
fabffb |
s_mac, NM_DEVICE_INFINIBAND_HW_ADDRESS);
|
|
Packit |
fabffb |
g_signal_connect (priv->device_combo, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* MTU */
|
|
Packit |
fabffb |
mtu_def = ce_get_property_default (NM_SETTING (setting), NM_SETTING_INFINIBAND_MTU);
|
|
Packit |
fabffb |
ce_spin_automatic_val (priv->mtu, mtu_def);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_spin_button_set_value (priv->mtu, (gdouble) nm_setting_infiniband_get_mtu (setting));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
finish_setup (CEPageInfiniband *self, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageInfinibandPrivate *priv = CE_PAGE_INFINIBAND_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
populate_ui (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (priv->transport_mode, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->mtu, "value-changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
CEPage *
|
|
Packit |
fabffb |
ce_page_infiniband_new (NMConnectionEditor *editor,
|
|
Packit |
fabffb |
NMConnection *connection,
|
|
Packit |
fabffb |
GtkWindow *parent_window,
|
|
Packit |
fabffb |
NMClient *client,
|
|
Packit |
fabffb |
const char **out_secrets_setting_name,
|
|
Packit |
fabffb |
GError **error)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageInfiniband *self;
|
|
Packit |
fabffb |
CEPageInfinibandPrivate *priv;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
self = CE_PAGE_INFINIBAND (ce_page_new (CE_TYPE_PAGE_INFINIBAND,
|
|
Packit |
fabffb |
editor,
|
|
Packit |
fabffb |
connection,
|
|
Packit |
fabffb |
parent_window,
|
|
Packit |
fabffb |
client,
|
|
Packit |
fabffb |
"/org/gnome/nm_connection_editor/ce-page-infiniband.ui",
|
|
Packit |
fabffb |
"InfinibandPage",
|
|
Packit |
fabffb |
_("InfiniBand")));
|
|
Packit |
fabffb |
if (!self) {
|
|
Packit |
fabffb |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC,
|
|
Packit |
fabffb |
_("Could not load InfiniBand user interface."));
|
|
Packit |
fabffb |
return NULL;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
infiniband_private_init (self);
|
|
Packit |
fabffb |
priv = CE_PAGE_INFINIBAND_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->setting = nm_connection_get_setting_infiniband (connection);
|
|
Packit |
fabffb |
if (!priv->setting) {
|
|
Packit |
fabffb |
priv->setting = NM_SETTING_INFINIBAND (nm_setting_infiniband_new ());
|
|
Packit |
fabffb |
nm_connection_add_setting (connection, NM_SETTING (priv->setting));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (self, CE_PAGE_INITIALIZED, G_CALLBACK (finish_setup), NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
return CE_PAGE (self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ui_to_setting (CEPageInfiniband *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageInfinibandPrivate *priv = CE_PAGE_INFINIBAND_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMSettingConnection *s_con;
|
|
Packit |
fabffb |
const char *mode;
|
|
Packit |
fabffb |
char *ifname = NULL;
|
|
Packit |
fabffb |
char *device_mac = NULL;
|
|
Packit |
fabffb |
GtkWidget *entry;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
s_con = nm_connection_get_setting_connection (CE_PAGE (self)->connection);
|
|
Packit |
fabffb |
g_return_if_fail (s_con != NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Transport mode */
|
|
Packit |
fabffb |
if (gtk_combo_box_get_active (priv->transport_mode) == TRANSPORT_MODE_CONNECTED)
|
|
Packit |
fabffb |
mode = "connected";
|
|
Packit |
fabffb |
else
|
|
Packit |
fabffb |
mode = "datagram";
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
entry = gtk_bin_get_child (GTK_BIN (priv->device_combo));
|
|
Packit |
fabffb |
if (entry)
|
|
Packit |
fabffb |
ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_INFINIBAND, TRUE, &ifname, &device_mac, NULL, NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_object_set (s_con,
|
|
Packit |
fabffb |
NM_SETTING_CONNECTION_INTERFACE_NAME, ifname,
|
|
Packit |
fabffb |
NULL);
|
|
Packit |
fabffb |
g_object_set (priv->setting,
|
|
Packit |
fabffb |
NM_SETTING_INFINIBAND_MAC_ADDRESS, device_mac,
|
|
Packit |
fabffb |
NM_SETTING_INFINIBAND_MTU, (guint32) gtk_spin_button_get_value_as_int (priv->mtu),
|
|
Packit |
fabffb |
NM_SETTING_INFINIBAND_TRANSPORT_MODE, mode,
|
|
Packit |
fabffb |
NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_free (ifname);
|
|
Packit |
fabffb |
g_free (device_mac);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static gboolean
|
|
Packit |
fabffb |
ce_page_validate_v (CEPage *page, NMConnection *connection, GError **error)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageInfiniband *self = CE_PAGE_INFINIBAND (page);
|
|
Packit |
fabffb |
CEPageInfinibandPrivate *priv = CE_PAGE_INFINIBAND_GET_PRIVATE (self);
|
|
Packit |
fabffb |
GtkWidget *entry;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
entry = gtk_bin_get_child (GTK_BIN (priv->device_combo));
|
|
Packit |
fabffb |
if (entry) {
|
|
Packit |
fabffb |
if (!ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_INFINIBAND, TRUE, NULL, NULL, _("infiniband device"), error))
|
|
Packit |
fabffb |
return FALSE;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
ui_to_setting (self);
|
|
Packit |
fabffb |
return nm_setting_verify (NM_SETTING (priv->setting), connection, error);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ce_page_infiniband_init (CEPageInfiniband *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ce_page_infiniband_class_init (CEPageInfinibandClass *infiniband_class)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
GObjectClass *object_class = G_OBJECT_CLASS (infiniband_class);
|
|
Packit |
fabffb |
CEPageClass *parent_class = CE_PAGE_CLASS (infiniband_class);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_type_class_add_private (object_class, sizeof (CEPageInfinibandPrivate));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* virtual methods */
|
|
Packit |
fabffb |
parent_class->ce_page_validate_v = ce_page_validate_v;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
void
|
|
Packit |
fabffb |
infiniband_connection_new (FUNC_TAG_PAGE_NEW_CONNECTION_IMPL,
|
|
Packit |
fabffb |
GtkWindow *parent,
|
|
Packit |
fabffb |
const char *detail,
|
|
Packit |
fabffb |
gpointer detail_data,
|
|
Packit |
fabffb |
NMConnection *connection,
|
|
Packit |
fabffb |
NMClient *client,
|
|
Packit |
fabffb |
PageNewConnectionResultFunc result_func,
|
|
Packit |
fabffb |
gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
gs_unref_object NMConnection *connection_tmp = NULL;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
connection = _ensure_connection_other (connection, &connection_tmp);
|
|
Packit |
fabffb |
ce_page_complete_connection (connection,
|
|
Packit |
fabffb |
_("InfiniBand connection %d"),
|
|
Packit |
fabffb |
NM_SETTING_INFINIBAND_SETTING_NAME,
|
|
Packit |
fabffb |
TRUE,
|
|
Packit |
fabffb |
client);
|
|
Packit |
fabffb |
nm_connection_add_setting (connection, nm_setting_infiniband_new ());
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
(*result_func) (FUNC_TAG_PAGE_NEW_CONNECTION_RESULT_CALL, connection, FALSE, NULL, user_data);
|
|
Packit |
fabffb |
}
|