summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiří Klimeš <blueowl@centrum.cz>2017-11-01 20:45:10 +0100
committerThomas Haller <thaller@redhat.com>2017-11-06 14:26:14 +0100
commit6a0a3dd51202116e1e72f7874f1472a906b2bcb5 (patch)
tree871be3bae3d9e332ccf938b53f78558730c85afa
parent32af8903041fef276b63fe86770bb9a3e96f207e (diff)
downloadnetwork-manager-applet-6a0a3dd51202116e1e72f7874f1472a906b2bcb5.tar.gz
editor: allow setting IPv6 address generation mode (rh #1501664)
[thaller@redhat.com: minor changes to the patch] https://bugzilla.redhat.com/show_bug.cgi?id=1501664
-rw-r--r--src/connection-editor/ce-page-ip6.ui46
-rw-r--r--src/connection-editor/page-ip6.c31
2 files changed, 77 insertions, 0 deletions
diff --git a/src/connection-editor/ce-page-ip6.ui b/src/connection-editor/ce-page-ip6.ui
index d3dd2cf0..20e37b54 100644
--- a/src/connection-editor/ce-page-ip6.ui
+++ b/src/connection-editor/ce-page-ip6.ui
@@ -42,6 +42,20 @@
</row>
</data>
</object>
+ <object class="GtkListStore" id="model3">
+ <columns>
+ <!-- column-name gchararray -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">EUI64</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Stable privacy</col>
+ </row>
+ </data>
+ </object>
<object class="GtkVBox" id="IP6Page">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -290,6 +304,38 @@
<property name="top_attach">2</property>
</packing>
</child>
+ <child>
+ <object class="GtkLabel" id="ip6_addr_gen_mode_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">IPv6 address _generation mode:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">ip6_addr_gen_mode_combo</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="ip6_addr_gen_mode_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">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="top_attach">3</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="expand">False</property>
diff --git a/src/connection-editor/page-ip6.c b/src/connection-editor/page-ip6.c
index 6e896c82..5b60f9b7 100644
--- a/src/connection-editor/page-ip6.c
+++ b/src/connection-editor/page-ip6.c
@@ -75,6 +75,9 @@ typedef struct {
GtkWidget *ip6_privacy_label;
GtkComboBox *ip6_privacy_combo;
+ GtkWidget *ip6_addr_gen_mode_label;
+ GtkComboBox *ip6_addr_gen_mode_combo;
+
/* IPv6 required */
GtkCheckButton *ip6_required;
@@ -106,6 +109,9 @@ typedef struct {
#define IP6_PRIVACY_PREFER_PUBLIC 1
#define IP6_PRIVACY_PREFER_TEMP 2
+#define IP6_ADDR_GEN_MODE_EUI64 0
+#define IP6_ADDR_GEN_MODE_STABLE 1
+
static void
ip6_private_init (CEPageIP6 *self, NMConnection *connection)
{
@@ -224,6 +230,9 @@ ip6_private_init (CEPageIP6 *self, NMConnection *connection)
priv->ip6_privacy_label = GTK_WIDGET (gtk_builder_get_object (builder, "ip6_privacy_label"));
priv->ip6_privacy_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "ip6_privacy_combo"));
+ priv->ip6_addr_gen_mode_label = GTK_WIDGET (gtk_builder_get_object (builder, "ip6_addr_gen_mode_label"));
+ priv->ip6_addr_gen_mode_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "ip6_addr_gen_mode_combo"));
+
priv->ip6_required = GTK_CHECK_BUTTON (gtk_builder_get_object (builder, "ip6_required_checkbutton"));
/* Hide IP6-require button if it'll never be used for a particular method */
if ( priv->connection_type == NM_TYPE_SETTING_VPN
@@ -244,6 +253,7 @@ method_changed (GtkComboBox *combo, gpointer user_data)
gboolean dns_enabled = FALSE;
gboolean routes_enabled = FALSE;
gboolean ip6_privacy_enabled = FALSE;
+ gboolean ip6_addr_gen_mode_enabled = TRUE;
gboolean ip6_required_enabled = TRUE;
gboolean method_auto = FALSE;
GtkTreeIter iter;
@@ -290,6 +300,7 @@ method_changed (GtkComboBox *combo, gpointer user_data)
break;
case IP6_METHOD_IGNORE:
ip6_required_enabled = FALSE;
+ ip6_addr_gen_mode_enabled = FALSE;
break;
default:
break;
@@ -340,6 +351,9 @@ method_changed (GtkComboBox *combo, gpointer user_data)
gtk_widget_set_sensitive (priv->ip6_privacy_label, ip6_privacy_enabled);
gtk_widget_set_sensitive (GTK_WIDGET (priv->ip6_privacy_combo), ip6_privacy_enabled);
+ gtk_widget_set_sensitive (priv->ip6_addr_gen_mode_label, ip6_addr_gen_mode_enabled);
+ gtk_widget_set_sensitive (GTK_WIDGET (priv->ip6_addr_gen_mode_combo), ip6_addr_gen_mode_enabled);
+
gtk_widget_set_sensitive (GTK_WIDGET (priv->ip6_required), ip6_required_enabled);
gtk_widget_set_sensitive (GTK_WIDGET (priv->routes_button), routes_enabled);
@@ -376,6 +390,8 @@ populate_ui (CEPageIP6 *self)
int method = IP6_METHOD_AUTO;
NMSettingIP6ConfigPrivacy ip6_privacy;
int ip6_privacy_idx = IP6_PRIVACY_DISABLED;
+ NMSettingIP6ConfigAddrGenMode ip6_addr_gen_mode;
+ int ip6_addr_gen_mode_idx;
GString *string = NULL;
SetMethodInfo info;
const char *str_method;
@@ -477,6 +493,13 @@ populate_ui (CEPageIP6 *self)
}
gtk_combo_box_set_active (priv->ip6_privacy_combo, ip6_privacy_idx);
+ ip6_addr_gen_mode = nm_setting_ip6_config_get_addr_gen_mode (NM_SETTING_IP6_CONFIG (setting));
+ if (ip6_addr_gen_mode == NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64)
+ ip6_addr_gen_mode_idx = IP6_ADDR_GEN_MODE_EUI64;
+ else
+ ip6_addr_gen_mode_idx = IP6_ADDR_GEN_MODE_STABLE;
+ gtk_combo_box_set_active (priv->ip6_addr_gen_mode_combo, ip6_addr_gen_mode_idx);
+
/* IPv6 required */
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->ip6_required),
!nm_setting_ip_config_get_may_fail (setting));
@@ -1153,6 +1176,7 @@ finish_setup (CEPageIP6 *self, gpointer unused, GError *error, gpointer user_dat
g_signal_connect (priv->dns_servers, "insert-text", G_CALLBACK (dns_servers_filter_cb), self);
g_signal_connect_swapped (priv->dns_searches, "changed", G_CALLBACK (ce_page_changed), self);
g_signal_connect_swapped (priv->ip6_privacy_combo, "changed", G_CALLBACK (ce_page_changed), self);
+ g_signal_connect_swapped (priv->ip6_addr_gen_mode_combo, "changed", G_CALLBACK (ce_page_changed), self);
method_changed (priv->method, self);
g_signal_connect (priv->method, "changed", G_CALLBACK (method_changed), self);
@@ -1219,6 +1243,7 @@ ui_to_setting (CEPageIP6 *self, GError **error)
char **items = NULL, **iter;
gboolean may_fail;
NMSettingIP6ConfigPrivacy ip6_privacy;
+ NMSettingIP6ConfigAddrGenMode ip6_addr_gen_mode;
/* Method */
if (gtk_combo_box_get_active_iter (priv->method, &tree_iter)) {
@@ -1371,10 +1396,16 @@ ui_to_setting (CEPageIP6 *self, GError **error)
break;
}
+ if (gtk_combo_box_get_active (priv->ip6_addr_gen_mode_combo) == IP6_ADDR_GEN_MODE_EUI64)
+ ip6_addr_gen_mode = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64;
+ else
+ ip6_addr_gen_mode = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY;
+
may_fail = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->ip6_required));
g_object_set (G_OBJECT (priv->setting),
NM_SETTING_IP_CONFIG_MAY_FAIL, may_fail,
NM_SETTING_IP6_CONFIG_IP6_PRIVACY, ip6_privacy,
+ NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE, (int) ip6_addr_gen_mode,
NULL);
valid = TRUE;