[PATCH] Support for openvpn --fragment option



Alexander Sack schrieb:

> Openvpn improvements and new features are definitly much appreciated
> ... its just that NM 0.7 is supposed to be released any day and hence
> the tree is pretty much locked down.

Here is yet another patch implementing the fragment option.

Thanks,
Jochen

Index: vpn-daemons/openvpn/src/nm-openvpn-service.h
===================================================================
--- vpn-daemons/openvpn/src/nm-openvpn-service.h	(Revision 4323)
+++ vpn-daemons/openvpn/src/nm-openvpn-service.h	(Arbeitskopie)
@@ -43,6 +43,7 @@
 #define NM_OPENVPN_KEY_CIPHER "cipher"
 #define NM_OPENVPN_KEY_COMP_LZO "comp-lzo"
 #define NM_OPENVPN_KEY_CONNECTION_TYPE "connection-type"
+#define NM_OPENVPN_KEY_FRAGMENT "fragment"
 #define NM_OPENVPN_KEY_TAP_DEV "tap-dev"
 #define NM_OPENVPN_KEY_KEY "key"
 #define NM_OPENVPN_KEY_LOCAL_IP "local-ip"
Index: vpn-daemons/openvpn/src/nm-openvpn-service.c
===================================================================
--- vpn-daemons/openvpn/src/nm-openvpn-service.c	(Revision 4323)
+++ vpn-daemons/openvpn/src/nm-openvpn-service.c	(Arbeitskopie)
@@ -88,6 +88,7 @@
 	{ NM_OPENVPN_KEY_CIPHER,               G_TYPE_STRING, 0, 0, FALSE },
 	{ NM_OPENVPN_KEY_COMP_LZO,             G_TYPE_BOOLEAN, 0, 0, FALSE },
 	{ NM_OPENVPN_KEY_CONNECTION_TYPE,      G_TYPE_STRING, 0, 0, FALSE },
+	{ NM_OPENVPN_KEY_FRAGMENT,             G_TYPE_INT, 600, 1500, FALSE },
 	{ NM_OPENVPN_KEY_TAP_DEV,              G_TYPE_BOOLEAN, 0, 0, FALSE },
 	{ NM_OPENVPN_KEY_KEY,                  G_TYPE_STRING, 0, 0, FALSE },
 	{ NM_OPENVPN_KEY_LOCAL_IP,             G_TYPE_STRING, 0, 0, TRUE },
@@ -651,6 +652,21 @@
 		add_openvpn_arg (args, "1194");
 	}

+	/* Fragment */
+	tmp = nm_setting_vpn_get_data_item (s_vpn, NM_OPENVPN_KEY_FRAGMENT);
+	if (tmp && strlen (tmp)) {
+		add_openvpn_arg (args, "--fragment");
+		if (!add_openvpn_arg_int (args, tmp)) {
+			g_set_error (error,
+			             NM_VPN_PLUGIN_ERROR,
+			             NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS,
+			             "Invalid fragment size '%s'.",
+			             tmp);
+			free_openvpn_args (args);
+			return FALSE;
+		}
+	}
+
 	/* Cipher */
 	tmp = nm_setting_vpn_get_data_item (s_vpn, NM_OPENVPN_KEY_CIPHER);
 	if (tmp && strlen (tmp)) {
Index: vpn-daemons/openvpn/properties/auth-helpers.c
===================================================================
--- vpn-daemons/openvpn/properties/auth-helpers.c	(Revision 4323)
+++ vpn-daemons/openvpn/properties/auth-helpers.c	(Arbeitskopie)
@@ -720,6 +720,7 @@
 	NM_OPENVPN_KEY_COMP_LZO,
 	NM_OPENVPN_KEY_TAP_DEV,
 	NM_OPENVPN_KEY_PROTO_TCP,
+	NM_OPENVPN_KEY_FRAGMENT,
 	NM_OPENVPN_KEY_CIPHER,
 	NM_OPENVPN_KEY_TA_DIR,
 	NM_OPENVPN_KEY_TA,
@@ -764,6 +765,16 @@
 	gtk_widget_set_sensitive (widget, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)));
 }

+static void
+frag_toggled_cb (GtkWidget *check, gpointer user_data)
+{
+	GladeXML *xml = (GladeXML *) user_data;
+	GtkWidget *widget;
+
+	widget = glade_xml_get_widget (xml, "frag_spinbutton");
+	gtk_widget_set_sensitive (widget, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)));
+}
+
 static const char *
 nm_find_openvpn (void)
 {
@@ -959,6 +970,31 @@
 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
 	}

+	widget = glade_xml_get_widget (xml, "frag_checkbutton");
+	g_signal_connect (G_OBJECT (widget), "toggled", G_CALLBACK (frag_toggled_cb), xml);
+
+	value = g_hash_table_lookup (hash, NM_OPENVPN_KEY_FRAGMENT);
+	if (value && strlen (value)) {
+		long int tmp;
+
+		errno = 0;
+		tmp = strtol (value, NULL, 10);
+		if (errno == 0 && tmp >= 600 && tmp <= 1500) {
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
+
+			widget = glade_xml_get_widget (xml, "frag_spinbutton");
+			gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget),
+			                           (gdouble) tmp);
+		}
+		gtk_widget_set_sensitive (widget, TRUE);
+	} else {
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
+
+		widget = glade_xml_get_widget (xml, "frag_spinbutton");
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), 1300.0);
+		gtk_widget_set_sensitive (widget, FALSE);
+	}
+
 	if (   !strcmp (contype, NM_OPENVPN_CONTYPE_TLS)
 	    || !strcmp (contype, NM_OPENVPN_CONTYPE_PASSWORD_TLS)
 	    || !strcmp (contype, NM_OPENVPN_CONTYPE_PASSWORD)) {
@@ -1058,6 +1094,15 @@
 	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
 		g_hash_table_insert (hash, g_strdup (NM_OPENVPN_KEY_TAP_DEV), g_strdup ("yes"));

+	widget = glade_xml_get_widget (xml, "frag_checkbutton");
+	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) {
+		int frag;
+
+		widget = glade_xml_get_widget (xml, "frag_spinbutton");
+		frag = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widget));
+		g_hash_table_insert (hash, g_strdup (NM_OPENVPN_KEY_FRAGMENT), g_strdup_printf ("%d", frag));
+	}
+
 	contype = g_object_get_data (G_OBJECT (dialog), "connection-type");
 	if (!strcmp (contype, NM_OPENVPN_CONTYPE_TLS) || !strcmp (contype, NM_OPENVPN_CONTYPE_PASSWORD_TLS)) {
 		GtkTreeModel *model;
Index: vpn-daemons/openvpn/properties/nm-openvpn-dialog.glade
===================================================================
--- vpn-daemons/openvpn/properties/nm-openvpn-dialog.glade	(Revision 4323)
+++ vpn-daemons/openvpn/properties/nm-openvpn-dialog.glade	(Arbeitskopie)
@@ -935,6 +935,40 @@
                     <property name="position">3</property>
                   </packing>
                 </child>
+                <child>
+                  <widget class="GtkHBox" id="hbox4">
+                    <property name="visible">True</property>
+                    <property name="spacing">6</property>
+                    <child>
+                      <widget class="GtkCheckButton" id="frag_checkbutton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="label" translatable="yes">Use fragmentation: </property>
+                        <property name="use_underline">True</property>
+                        <property name="response_id">0</property>
+                        <property name="draw_indicator">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkSpinButton" id="frag_spinbutton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="adjustment">1300 600 1500 1 10 10</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">4</property>
+                  </packing>
+                </child>
               </widget>
             </child>
             <child>


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