|
Packit Service |
639700 |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit |
fabffb |
/* NetworkManager Connection editor -- Connection editor for NetworkManager
|
|
Packit |
fabffb |
*
|
|
Packit |
fabffb |
* Dan Williams <dcbw@redhat.com>
|
|
Packit |
fabffb |
*
|
|
Packit |
fabffb |
* Copyright 2008 - 2014 Red Hat, Inc.
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "nm-default.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include <string.h>
|
|
Packit |
fabffb |
#include <net/ethernet.h>
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "page-ethernet.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
G_DEFINE_TYPE (CEPageEthernet, ce_page_ethernet, CE_TYPE_PAGE)
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#define CE_PAGE_ETHERNET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CE_TYPE_PAGE_ETHERNET, CEPageEthernetPrivate))
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
typedef struct {
|
|
Packit |
fabffb |
NMSettingWired *setting;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
GtkComboBoxText *device_combo; /* Device identification (ifname and/or MAC) */
|
|
Packit |
fabffb |
GtkComboBoxText *cloned_mac; /* Cloned MAC - used for MAC spoofing */
|
|
Packit |
fabffb |
GtkComboBox *port;
|
|
Packit |
fabffb |
GtkComboBox *speed;
|
|
Packit |
fabffb |
GtkComboBox *duplex;
|
|
Packit |
fabffb |
GtkComboBox *linkneg;
|
|
Packit |
fabffb |
GtkSpinButton *mtu;
|
|
Packit |
fabffb |
GtkToggleButton *wol_default, *wol_ignore, *wol_phy, *wol_unicast, *wol_multicast,
|
|
Packit |
fabffb |
*wol_broadcast, *wol_arp, *wol_magic;
|
|
Packit |
fabffb |
GtkEntry *wol_passwd;
|
|
Packit |
fabffb |
gboolean mtu_enabled;
|
|
Packit |
fabffb |
} CEPageEthernetPrivate;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#define PORT_DEFAULT 0
|
|
Packit |
fabffb |
#define PORT_TP 1
|
|
Packit |
fabffb |
#define PORT_AUI 2
|
|
Packit |
fabffb |
#define PORT_BNC 3
|
|
Packit |
fabffb |
#define PORT_MII 4
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#define LINKNEG_IGNORE 0
|
|
Packit |
fabffb |
#define LINKNEG_AUTO 1
|
|
Packit |
fabffb |
#define LINKNEG_MANUAL 2
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#define SPEED_10 0
|
|
Packit |
fabffb |
#define SPEED_100 1
|
|
Packit |
fabffb |
#define SPEED_1000 2
|
|
Packit |
fabffb |
#define SPEED_10000 3
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#define DUPLEX_HALF 0
|
|
Packit |
fabffb |
#define DUPLEX_FULL 1
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ethernet_private_init (CEPageEthernet *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageEthernetPrivate *priv = CE_PAGE_ETHERNET_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 |
"“em1”, “3C:97:0E:42:1A:19”, “em1 (3C:97:0E:42:1A:19)”"));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
vbox = GTK_WIDGET (gtk_builder_get_object (builder, "ethernet_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, "ethernet_device_label"));
|
|
Packit |
fabffb |
gtk_label_set_mnemonic_widget (label, GTK_WIDGET (priv->device_combo));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->cloned_mac = GTK_COMBO_BOX_TEXT (gtk_builder_get_object (builder, "ethernet_cloned_mac"));
|
|
Packit |
fabffb |
priv->port = GTK_COMBO_BOX (gtk_builder_get_object (builder, "ethernet_port"));
|
|
Packit |
fabffb |
priv->speed = GTK_COMBO_BOX (gtk_builder_get_object (builder, "ethernet_speed"));
|
|
Packit |
fabffb |
priv->duplex = GTK_COMBO_BOX (gtk_builder_get_object (builder, "ethernet_duplex"));
|
|
Packit |
fabffb |
priv->linkneg = GTK_COMBO_BOX (gtk_builder_get_object (builder, "ethernet_linkneg"));
|
|
Packit |
fabffb |
priv->mtu = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "ethernet_mtu"));
|
|
Packit |
fabffb |
priv->wol_default = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "wol_default"));
|
|
Packit |
fabffb |
priv->wol_ignore = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "wol_ignore"));
|
|
Packit |
fabffb |
priv->wol_phy = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "wol_phy"));
|
|
Packit |
fabffb |
priv->wol_unicast = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "wol_unicast"));
|
|
Packit |
fabffb |
priv->wol_multicast = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "wol_multicast"));
|
|
Packit |
fabffb |
priv->wol_broadcast = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "wol_broadcast"));
|
|
Packit |
fabffb |
priv->wol_arp = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "wol_arp"));
|
|
Packit |
fabffb |
priv->wol_magic = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "wol_magic"));
|
|
Packit |
fabffb |
priv->wol_passwd = GTK_ENTRY (gtk_builder_get_object (builder, "ethernet_wol_passwd"));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_widget_set_sensitive(GTK_WIDGET (priv->mtu), priv->mtu_enabled);
|
|
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 |
link_special_changed_cb (GtkWidget *widget, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageEthernet *self = CE_PAGE_ETHERNET (user_data);
|
|
Packit |
fabffb |
CEPageEthernetPrivate *priv = CE_PAGE_ETHERNET_GET_PRIVATE (self);
|
|
Packit |
fabffb |
gboolean enable = false;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) == LINKNEG_MANUAL)
|
|
Packit |
fabffb |
enable = true;
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->speed), enable);
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->duplex), enable);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
stuff_changed (NULL, self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
wol_special_toggled_cb (GtkWidget *widget, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageEthernet *self = CE_PAGE_ETHERNET (user_data);
|
|
Packit |
fabffb |
CEPageEthernetPrivate *priv = CE_PAGE_ETHERNET_GET_PRIVATE (self);
|
|
Packit |
fabffb |
gboolean enabled, enabled_passwd;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->wol_phy), !enabled);
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->wol_unicast), !enabled);
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->wol_multicast), !enabled);
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->wol_broadcast), !enabled);
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->wol_arp), !enabled);
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->wol_magic), !enabled);
|
|
Packit |
fabffb |
if (widget == GTK_WIDGET (priv->wol_default))
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->wol_ignore), !enabled);
|
|
Packit |
fabffb |
else if (widget == GTK_WIDGET (priv->wol_ignore))
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->wol_default), !enabled);
|
|
Packit |
fabffb |
else
|
|
Packit |
fabffb |
g_return_if_reached ();
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
enabled_passwd = !enabled && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->wol_magic));
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->wol_passwd), enabled_passwd);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
stuff_changed (NULL, self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
wol_magic_toggled_cb (GtkWidget *widget, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageEthernet *self = CE_PAGE_ETHERNET (user_data);
|
|
Packit |
fabffb |
CEPageEthernetPrivate *priv = CE_PAGE_ETHERNET_GET_PRIVATE (self);
|
|
Packit |
fabffb |
gboolean enabled;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
enabled = gtk_widget_get_sensitive (widget)
|
|
Packit |
fabffb |
&& gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->wol_passwd), enabled);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
stuff_changed (NULL, self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
populate_ui (CEPageEthernet *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageEthernetPrivate *priv = CE_PAGE_ETHERNET_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMSettingWired *setting = priv->setting;
|
|
Packit |
fabffb |
const char *port;
|
|
Packit |
fabffb |
guint32 speed;
|
|
Packit |
fabffb |
const char *duplex;
|
|
Packit |
fabffb |
int port_idx = PORT_DEFAULT;
|
|
Packit |
fabffb |
int speed_idx = SPEED_100;
|
|
Packit |
fabffb |
int duplex_idx = DUPLEX_FULL;
|
|
Packit |
fabffb |
int linkneg_idx = LINKNEG_IGNORE;
|
|
Packit |
fabffb |
int mtu_def;
|
|
Packit |
fabffb |
const char *s_mac, *s_ifname, *s_wol_passwd;
|
|
Packit |
fabffb |
NMSettingWiredWakeOnLan wol;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Port */
|
|
Packit |
fabffb |
port = nm_setting_wired_get_port (setting);
|
|
Packit |
fabffb |
if (port) {
|
|
Packit |
fabffb |
if (!strcmp (port, "tp"))
|
|
Packit |
fabffb |
port_idx = PORT_TP;
|
|
Packit |
fabffb |
else if (!strcmp (port, "aui"))
|
|
Packit |
fabffb |
port_idx = PORT_AUI;
|
|
Packit |
fabffb |
else if (!strcmp (port, "bnc"))
|
|
Packit |
fabffb |
port_idx = PORT_BNC;
|
|
Packit |
fabffb |
else if (!strcmp (port, "mii"))
|
|
Packit |
fabffb |
port_idx = PORT_MII;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
gtk_combo_box_set_active (priv->port, port_idx);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Speed */
|
|
Packit |
fabffb |
speed = nm_setting_wired_get_speed (setting);
|
|
Packit |
fabffb |
switch (speed) {
|
|
Packit |
fabffb |
case 10:
|
|
Packit |
fabffb |
speed_idx = SPEED_10;
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
case 100:
|
|
Packit |
fabffb |
speed_idx = SPEED_100;
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
case 1000:
|
|
Packit |
fabffb |
speed_idx = SPEED_1000;
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
case 10000:
|
|
Packit |
fabffb |
speed_idx = SPEED_10000;
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
gtk_combo_box_set_active (priv->speed, speed_idx);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Duplex */
|
|
Packit |
fabffb |
duplex = nm_setting_wired_get_duplex (setting);
|
|
Packit |
fabffb |
if (duplex) {
|
|
Packit |
fabffb |
if (!strcmp (duplex, "half"))
|
|
Packit |
fabffb |
duplex_idx = DUPLEX_HALF;
|
|
Packit |
fabffb |
else
|
|
Packit |
fabffb |
duplex_idx = DUPLEX_FULL;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
gtk_combo_box_set_active (priv->duplex, duplex_idx);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Link Negotiation */
|
|
Packit |
fabffb |
if (nm_setting_wired_get_auto_negotiate (setting))
|
|
Packit |
fabffb |
linkneg_idx = LINKNEG_AUTO;
|
|
Packit |
fabffb |
else if (speed && duplex)
|
|
Packit |
fabffb |
linkneg_idx = LINKNEG_MANUAL;
|
|
Packit |
fabffb |
gtk_combo_box_set_active (priv->linkneg, linkneg_idx);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Device ifname/MAC */
|
|
Packit |
fabffb |
s_ifname = nm_connection_get_interface_name (CE_PAGE (self)->connection);
|
|
Packit |
fabffb |
s_mac = nm_setting_wired_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_ETHERNET, s_ifname,
|
|
Packit |
fabffb |
s_mac, NM_DEVICE_ETHERNET_PERMANENT_HW_ADDRESS);
|
|
Packit |
fabffb |
g_signal_connect (priv->device_combo, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Cloned MAC address */
|
|
Packit |
fabffb |
s_mac = nm_setting_wired_get_cloned_mac_address (setting);
|
|
Packit |
fabffb |
ce_page_setup_cloned_mac_combo (priv->cloned_mac, s_mac);
|
|
Packit |
fabffb |
g_signal_connect (priv->cloned_mac, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* MTU */
|
|
Packit |
fabffb |
if (priv->mtu_enabled) {
|
|
Packit |
fabffb |
mtu_def = ce_get_property_default (NM_SETTING (setting), NM_SETTING_WIRED_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_wired_get_mtu (setting));
|
|
Packit |
fabffb |
} else {
|
|
Packit |
fabffb |
gtk_entry_set_text (GTK_ENTRY (priv->mtu), _("ignored"));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Wake-on-LAN */
|
|
Packit |
fabffb |
wol = nm_setting_wired_get_wake_on_lan (priv->setting);
|
|
Packit |
fabffb |
if (wol == NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT)
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (priv->wol_default, TRUE);
|
|
Packit |
fabffb |
else if (wol == NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE)
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (priv->wol_ignore, TRUE);
|
|
Packit |
fabffb |
else {
|
|
Packit |
fabffb |
if (wol & NM_SETTING_WIRED_WAKE_ON_LAN_PHY)
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (priv->wol_phy, TRUE);
|
|
Packit |
fabffb |
if (wol & NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST)
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (priv->wol_unicast, TRUE);
|
|
Packit |
fabffb |
if (wol & NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST)
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (priv->wol_multicast, TRUE);
|
|
Packit |
fabffb |
if (wol & NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST)
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (priv->wol_broadcast, TRUE);
|
|
Packit |
fabffb |
if (wol & NM_SETTING_WIRED_WAKE_ON_LAN_ARP)
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (priv->wol_arp, TRUE);
|
|
Packit |
fabffb |
if (wol & NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC)
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (priv->wol_magic, TRUE);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Wake-on LAN password */
|
|
Packit |
fabffb |
s_wol_passwd = nm_setting_wired_get_wake_on_lan_password (setting);
|
|
Packit |
fabffb |
if (s_wol_passwd)
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->wol_passwd, s_wol_passwd);
|
|
Packit |
fabffb |
g_signal_connect (priv->wol_passwd, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
finish_setup (CEPageEthernet *self, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPage *parent = CE_PAGE (self);
|
|
Packit |
fabffb |
CEPageEthernetPrivate *priv = CE_PAGE_ETHERNET_GET_PRIVATE (self);
|
|
Packit |
fabffb |
GtkWidget *widget;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
populate_ui (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (priv->linkneg, "changed", G_CALLBACK (link_special_changed_cb), self);
|
|
Packit |
fabffb |
link_special_changed_cb (GTK_WIDGET (priv->linkneg), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->port, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->speed, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->duplex, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->mtu, "value-changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (priv->wol_default, "toggled", G_CALLBACK (wol_special_toggled_cb), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->wol_ignore, "toggled", G_CALLBACK (wol_special_toggled_cb), self);
|
|
Packit |
fabffb |
if (gtk_toggle_button_get_active (priv->wol_default))
|
|
Packit |
fabffb |
wol_special_toggled_cb (GTK_WIDGET (priv->wol_default), self);
|
|
Packit |
fabffb |
else
|
|
Packit |
fabffb |
wol_special_toggled_cb (GTK_WIDGET (priv->wol_ignore), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->wol_phy, "toggled", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->wol_unicast, "toggled", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->wol_multicast, "toggled", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->wol_broadcast, "toggled", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->wol_arp, "toggled", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->wol_magic, "toggled", G_CALLBACK (wol_magic_toggled_cb), self);
|
|
Packit |
fabffb |
wol_magic_toggled_cb (GTK_WIDGET (priv->wol_magic), self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Hide widgets we don't yet support */
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "ethernet_port_label"));
|
|
Packit |
fabffb |
gtk_widget_hide (widget);
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "ethernet_port"));
|
|
Packit |
fabffb |
gtk_widget_hide (widget);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
CEPage *
|
|
Packit |
fabffb |
ce_page_ethernet_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 |
CEPageEthernet *self;
|
|
Packit |
fabffb |
CEPageEthernetPrivate *priv;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
self = CE_PAGE_ETHERNET (ce_page_new (CE_TYPE_PAGE_ETHERNET,
|
|
Packit |
fabffb |
editor,
|
|
Packit |
fabffb |
connection,
|
|
Packit |
fabffb |
parent_window,
|
|
Packit |
fabffb |
client,
|
|
Packit |
fabffb |
"/org/gnome/nm_connection_editor/ce-page-ethernet.ui",
|
|
Packit |
fabffb |
"EthernetPage",
|
|
Packit |
fabffb |
_("Ethernet")));
|
|
Packit |
fabffb |
if (!self) {
|
|
Packit |
fabffb |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Could not load ethernet user interface."));
|
|
Packit |
fabffb |
return NULL;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv = CE_PAGE_ETHERNET_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (nm_streq0 (nm_connection_get_connection_type (connection),
|
|
Packit |
fabffb |
NM_SETTING_PPPOE_SETTING_NAME))
|
|
Packit |
fabffb |
priv->mtu_enabled = FALSE;
|
|
Packit |
fabffb |
else
|
|
Packit |
fabffb |
priv->mtu_enabled = TRUE;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
ethernet_private_init (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->setting = nm_connection_get_setting_wired (connection);
|
|
Packit |
fabffb |
if (!priv->setting) {
|
|
Packit |
fabffb |
priv->setting = NM_SETTING_WIRED (nm_setting_wired_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 (CEPageEthernet *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageEthernetPrivate *priv = CE_PAGE_ETHERNET_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMSettingConnection *s_con;
|
|
Packit |
fabffb |
const char *port;
|
|
Packit |
fabffb |
guint32 speed;
|
|
Packit |
fabffb |
const char *duplex;
|
|
Packit |
fabffb |
char *ifname = NULL;
|
|
Packit |
fabffb |
char *device_mac = NULL;
|
|
Packit |
fabffb |
char *cloned_mac;
|
|
Packit |
fabffb |
GtkWidget *entry;
|
|
Packit |
fabffb |
NMSettingWiredWakeOnLan wol = NM_SETTING_WIRED_WAKE_ON_LAN_NONE;
|
|
Packit |
fabffb |
const char *wol_passwd = NULL;
|
|
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 |
/* Port */
|
|
Packit |
fabffb |
switch (gtk_combo_box_get_active (priv->port)) {
|
|
Packit |
fabffb |
case PORT_TP:
|
|
Packit |
fabffb |
port = "tp";
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
case PORT_AUI:
|
|
Packit |
fabffb |
port = "aui";
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
case PORT_BNC:
|
|
Packit |
fabffb |
port = "bnc";
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
case PORT_MII:
|
|
Packit |
fabffb |
port = "mii";
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
default:
|
|
Packit |
fabffb |
port = NULL;
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Speed & Duplex */
|
|
Packit |
fabffb |
if (gtk_combo_box_get_active (priv->linkneg) != LINKNEG_MANUAL) {
|
|
Packit |
fabffb |
speed = 0;
|
|
Packit |
fabffb |
duplex = NULL;
|
|
Packit |
fabffb |
} else {
|
|
Packit |
fabffb |
switch (gtk_combo_box_get_active (priv->speed)) {
|
|
Packit |
fabffb |
case SPEED_10:
|
|
Packit |
fabffb |
speed = 10;
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
case SPEED_100:
|
|
Packit |
fabffb |
speed = 100;
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
case SPEED_1000:
|
|
Packit |
fabffb |
speed = 1000;
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
case SPEED_10000:
|
|
Packit |
fabffb |
speed = 10000;
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
default:
|
|
Packit |
fabffb |
g_warn_if_reached();
|
|
Packit |
fabffb |
speed = 0;
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
switch (gtk_combo_box_get_active (priv->duplex)) {
|
|
Packit |
fabffb |
case DUPLEX_HALF:
|
|
Packit |
fabffb |
duplex = "half";
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
case DUPLEX_FULL:
|
|
Packit |
fabffb |
duplex = "full";
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
default:
|
|
Packit |
fabffb |
g_warn_if_reached();
|
|
Packit |
fabffb |
duplex = NULL;
|
|
Packit |
fabffb |
break;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
}
|
|
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_ETHER, TRUE, &ifname, &device_mac, NULL, NULL);
|
|
Packit |
fabffb |
cloned_mac = ce_page_cloned_mac_get (priv->cloned_mac);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Wake-on-LAN */
|
|
Packit |
fabffb |
if (gtk_toggle_button_get_active (priv->wol_default))
|
|
Packit |
fabffb |
wol = NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT;
|
|
Packit |
fabffb |
else if (gtk_toggle_button_get_active (priv->wol_ignore))
|
|
Packit |
fabffb |
wol = NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE;
|
|
Packit |
fabffb |
else {
|
|
Packit |
fabffb |
if (gtk_toggle_button_get_active (priv->wol_phy))
|
|
Packit |
fabffb |
wol |= NM_SETTING_WIRED_WAKE_ON_LAN_PHY;
|
|
Packit |
fabffb |
if (gtk_toggle_button_get_active (priv->wol_unicast))
|
|
Packit |
fabffb |
wol |= NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST;
|
|
Packit |
fabffb |
if (gtk_toggle_button_get_active (priv->wol_multicast))
|
|
Packit |
fabffb |
wol |= NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST;
|
|
Packit |
fabffb |
if (gtk_toggle_button_get_active (priv->wol_broadcast))
|
|
Packit |
fabffb |
wol |= NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST;
|
|
Packit |
fabffb |
if (gtk_toggle_button_get_active (priv->wol_arp))
|
|
Packit |
fabffb |
wol |= NM_SETTING_WIRED_WAKE_ON_LAN_ARP;
|
|
Packit |
fabffb |
if (gtk_toggle_button_get_active (priv->wol_magic))
|
|
Packit |
fabffb |
wol |= NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (gtk_widget_get_sensitive (GTK_WIDGET (priv->wol_passwd)))
|
|
Packit |
fabffb |
wol_passwd = gtk_entry_get_text (priv->wol_passwd);
|
|
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_WIRED_MAC_ADDRESS, device_mac,
|
|
Packit |
fabffb |
NM_SETTING_WIRED_CLONED_MAC_ADDRESS, cloned_mac && *cloned_mac ? cloned_mac : NULL,
|
|
Packit |
fabffb |
NM_SETTING_WIRED_PORT, port,
|
|
Packit |
fabffb |
NM_SETTING_WIRED_SPEED, speed,
|
|
Packit |
fabffb |
NM_SETTING_WIRED_DUPLEX, duplex,
|
|
Packit |
fabffb |
NM_SETTING_WIRED_AUTO_NEGOTIATE, (gtk_combo_box_get_active (priv->linkneg) == LINKNEG_AUTO),
|
|
Packit |
fabffb |
NM_SETTING_WIRED_WAKE_ON_LAN, wol,
|
|
Packit |
fabffb |
NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD, wol_passwd && *wol_passwd ? wol_passwd : NULL,
|
|
Packit |
fabffb |
NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (priv->mtu_enabled) {
|
|
Packit |
fabffb |
g_object_set (priv->setting,
|
|
Packit |
fabffb |
NM_SETTING_WIRED_MTU, (guint32) gtk_spin_button_get_value_as_int (priv->mtu),
|
|
Packit |
fabffb |
NULL);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_free (ifname);
|
|
Packit |
fabffb |
g_free (device_mac);
|
|
Packit |
fabffb |
g_free (cloned_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 |
CEPageEthernet *self = CE_PAGE_ETHERNET (page);
|
|
Packit |
fabffb |
CEPageEthernetPrivate *priv = CE_PAGE_ETHERNET_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_ETHER, TRUE, NULL, NULL, _("Ethernet device"), error))
|
|
Packit |
fabffb |
return FALSE;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (!ce_page_cloned_mac_combo_valid (priv->cloned_mac, ARPHRD_ETHER, _("cloned MAC"), error))
|
|
Packit |
fabffb |
return FALSE;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (gtk_widget_get_sensitive (GTK_WIDGET (priv->wol_passwd))) {
|
|
Packit |
fabffb |
if (!ce_page_mac_entry_valid (priv->wol_passwd, ARPHRD_ETHER, _("Wake-on-LAN password"), 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), NULL, error);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ce_page_ethernet_init (CEPageEthernet *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ce_page_ethernet_class_init (CEPageEthernetClass *ethernet_class)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
GObjectClass *object_class = G_OBJECT_CLASS (ethernet_class);
|
|
Packit |
fabffb |
CEPageClass *parent_class = CE_PAGE_CLASS (ethernet_class);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_type_class_add_private (object_class, sizeof (CEPageEthernetPrivate));
|
|
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 |
ethernet_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 |
_("Ethernet connection %d"),
|
|
Packit |
fabffb |
NM_SETTING_WIRED_SETTING_NAME,
|
|
Packit |
fabffb |
TRUE,
|
|
Packit |
fabffb |
client);
|
|
Packit |
fabffb |
nm_connection_add_setting (connection, nm_setting_wired_new ());
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
(*result_func) (FUNC_TAG_PAGE_NEW_CONNECTION_RESULT_CALL, connection, FALSE, NULL, user_data);
|
|
Packit |
fabffb |
}
|