[network-manager-applet/fg/c-e-ethernet-link2: 1/3] c-e: allow duplex to get the NULL value, and set it as default



commit c5cc03c068957d5e050992dc89b08e5fac247788
Author: Francesco Giudici <fgiudici redhat com>
Date:   Fri Nov 25 10:30:35 2016 +0100

    c-e: allow duplex to get the NULL value, and set it as default
    
    NetworkManager 802-3 link properties have been implemented in:
    
https://cgit.freedesktop.org/NetworkManager/NetworkManager/commit/?id=e0c50a970378daf8f066c293c613276d322cc056
    'auto-negotiate' default value has been also changed to "false", as
    together with 'speed' = 0 and duplex unset (NULL) instructs
    NetworkManager to skip link configuration.
    Before the implementation, the 'auto-negotiate', 'speed' and 'duplex'
    802-3 properties were ignored, without regards of the value they were
    set. The duplex property in particular was silently set to "full" by c-e
    for each connection modified. This triggered NetworkManager to force a
    static link configuration with duplex mode and unspecified speed (thanks
    to poma for reporting this).
    
    Now, properties are checked and enforced in NetworkManager:
    
https://cgit.freedesktop.org/NetworkManager/NetworkManager/commit/?id=b029e9256963b3adfde35d1e5adad50b838fdb1d
    Allowed combinations are:
    auto-negotiate on, speed 0, duplex NULL
    auto-negotiate off, speed 0, duplex NULL (default, ignore link config)
    auto-negotiate off, speed != 0, duplex !=NULL
    
    Align nm-connection-editor to deal with NULL 'duplex' and use it as
    default.

 src/connection-editor/ce-page-ethernet.ui |   48 +++++++++++++++++++++++++---
 src/connection-editor/page-ethernet.c     |   40 ++++++++++++++++++++----
 2 files changed, 75 insertions(+), 13 deletions(-)
---
diff --git a/src/connection-editor/ce-page-ethernet.ui b/src/connection-editor/ce-page-ethernet.ui
index 6b20a07..d9a0dad 100644
--- a/src/connection-editor/ce-page-ethernet.ui
+++ b/src/connection-editor/ce-page-ethernet.ui
@@ -52,6 +52,23 @@
       </row>
     </data>
   </object>
+  <object class="GtkListStore" id="model3">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">Automatic</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Half</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Full</col>
+      </row>
+    </data>
+  </object>
   <object class="GtkTable" id="EthernetPage">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -129,16 +146,15 @@
       </packing>
     </child>
     <child>
-      <object class="GtkCheckButton" id="ethernet_duplex">
-        <property name="label" translatable="yes">Full duple_x</property>
+      <object class="GtkLabel" id="ethernet_duplex_label">
         <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">False</property>
+        <property name="can_focus">False</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">_Duplex:</property>
         <property name="use_underline">True</property>
-        <property name="draw_indicator">True</property>
+        <property name="mnemonic_widget">ethernet_duplex</property>
       </object>
       <packing>
-        <property name="right_attach">2</property>
         <property name="top_attach">2</property>
         <property name="bottom_attach">3</property>
         <property name="x_options">GTK_FILL</property>
@@ -146,6 +162,26 @@
       </packing>
     </child>
     <child>
+      <object class="GtkComboBox" id="ethernet_duplex">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="model">model3</property>
+        <child>
+          <object class="GtkCellRendererText" id="renderer3"/>
+          <attributes>
+            <attribute name="text">0</attribute>
+          </attributes>
+        </child>
+      </object>
+      <packing>
+        <property name="left_attach">1</property>
+        <property name="right_attach">2</property>
+        <property name="top_attach">2</property>
+        <property name="bottom_attach">3</property>
+        <property name="y_options"/>
+      </packing>
+    </child>
+    <child>
       <object class="GtkCheckButton" id="ethernet_autonegotiate">
         <property name="label" translatable="yes">Aut_onegotiate</property>
         <property name="visible">True</property>
diff --git a/src/connection-editor/page-ethernet.c b/src/connection-editor/page-ethernet.c
index af45585..d960e33 100644
--- a/src/connection-editor/page-ethernet.c
+++ b/src/connection-editor/page-ethernet.c
@@ -38,7 +38,7 @@ typedef struct {
        GtkEntry *cloned_mac;          /* Cloned MAC - used for MAC spoofing */
        GtkComboBox *port;
        GtkComboBox *speed;
-       GtkToggleButton *duplex;
+       GtkComboBox *duplex;
        GtkToggleButton *autonegotiate;
        GtkSpinButton *mtu;
        GtkToggleButton *wol_default, *wol_ignore, *wol_phy, *wol_unicast, *wol_multicast,
@@ -59,6 +59,10 @@ typedef struct {
 #define SPEED_1000    3
 #define SPEED_10000   4
 
+#define DUPLEX_DEFAULT 0
+#define DUPLEX_HALF    1
+#define DUPLEX_FULL    2
+
 static void
 ethernet_private_init (CEPageEthernet *self)
 {
@@ -88,7 +92,7 @@ ethernet_private_init (CEPageEthernet *self)
        priv->cloned_mac = GTK_ENTRY (gtk_builder_get_object (builder, "ethernet_cloned_mac"));
        priv->port = GTK_COMBO_BOX (gtk_builder_get_object (builder, "ethernet_port"));
        priv->speed = GTK_COMBO_BOX (gtk_builder_get_object (builder, "ethernet_speed"));
-       priv->duplex = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "ethernet_duplex"));
+       priv->duplex = GTK_COMBO_BOX (gtk_builder_get_object (builder, "ethernet_duplex"));
        priv->autonegotiate = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "ethernet_autonegotiate"));
        priv->mtu = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "ethernet_mtu"));
        priv->wol_default = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "wol_default"));
@@ -162,6 +166,7 @@ populate_ui (CEPageEthernet *self)
        const char *duplex;
        int port_idx = PORT_DEFAULT;
        int speed_idx;
+       int duplex_idx = DUPLEX_DEFAULT;
        int mtu_def;
        const char *s_mac, *s_ifname, *s_wol_passwd;
        NMSettingWiredWakeOnLan wol;
@@ -202,10 +207,13 @@ populate_ui (CEPageEthernet *self)
 
        /* Duplex */
        duplex = nm_setting_wired_get_duplex (setting);
-       if (duplex && !strcmp (duplex, "half"))
-               gtk_toggle_button_set_active (priv->duplex, FALSE);
-       else
-               gtk_toggle_button_set_active (priv->duplex, TRUE);
+       if (duplex) {
+               if (!strcmp (duplex, "half"))
+                       duplex_idx = DUPLEX_HALF;
+               else
+                       duplex_idx = DUPLEX_FULL;
+       }
+       gtk_combo_box_set_active (priv->duplex, duplex_idx);
 
        /* Autonegotiate */
        gtk_toggle_button_set_active (priv->autonegotiate,
@@ -277,7 +285,7 @@ finish_setup (CEPageEthernet *self, gpointer unused, GError *error, gpointer use
 
        g_signal_connect (priv->port, "changed", G_CALLBACK (stuff_changed), self);
        g_signal_connect (priv->speed, "changed", G_CALLBACK (stuff_changed), self);
-       g_signal_connect (priv->duplex, "toggled", G_CALLBACK (stuff_changed), self);
+       g_signal_connect (priv->duplex, "changed", G_CALLBACK (stuff_changed), self);
        g_signal_connect (priv->autonegotiate, "toggled", G_CALLBACK (stuff_changed), self);
        g_signal_connect (priv->mtu, "value-changed", G_CALLBACK (stuff_changed), self);
 
@@ -306,8 +314,11 @@ finish_setup (CEPageEthernet *self, gpointer unused, GError *error, gpointer use
        widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "ethernet_speed"));
        gtk_widget_hide (widget);
 
+       widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "ethernet_duplex_label"));
+       gtk_widget_hide (widget);
        widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "ethernet_duplex"));
        gtk_widget_hide (widget);
+
        widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "ethernet_autonegotiate"));
        gtk_widget_hide (widget);
 }
@@ -364,6 +375,7 @@ ui_to_setting (CEPageEthernet *self)
        NMSettingConnection *s_con;
        const char *port;
        guint32 speed;
+       const char *duplex;
        char *ifname = NULL;
        char *device_mac = NULL;
        const char *cloned_mac;
@@ -412,6 +424,19 @@ ui_to_setting (CEPageEthernet *self)
                break;
        }
 
+       /* Duplex */
+       switch (gtk_combo_box_get_active (priv->duplex)) {
+       case DUPLEX_HALF:
+               duplex = "half";
+               break;
+       case DUPLEX_FULL:
+               duplex = "full";
+               break;
+       default:
+               duplex = NULL;
+               break;
+       }
+
        entry = gtk_bin_get_child (GTK_BIN (priv->device_combo));
        if (entry)
                ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, TRUE, &ifname, &device_mac, NULL, 
NULL);
@@ -448,6 +473,7 @@ ui_to_setting (CEPageEthernet *self)
                      NM_SETTING_WIRED_CLONED_MAC_ADDRESS, cloned_mac && *cloned_mac ? cloned_mac : NULL,
                      NM_SETTING_WIRED_PORT, port,
                      NM_SETTING_WIRED_SPEED, speed,
+                     NM_SETTING_WIRED_DUPLEX, duplex,
                      NM_SETTING_WIRED_AUTO_NEGOTIATE, gtk_toggle_button_get_active (priv->autonegotiate),
                      NM_SETTING_WIRED_WAKE_ON_LAN, wol,
                      NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD, wol_passwd && *wol_passwd ? wol_passwd : NULL,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]