diff -ur network-manager-openvpn-0.8~a~git.20091008t123607.7c184a9/properties/auth-helpers.c network-manager-openvpn/properties/auth-helpers.c --- network-manager-openvpn-0.8~a~git.20091008t123607.7c184a9/properties/auth-helpers.c 2009-10-14 23:55:23.000000000 +0200 +++ network-manager-openvpn/properties/auth-helpers.c 2010-01-26 22:28:55.932090590 +0100 @@ -762,6 +762,7 @@ NM_OPENVPN_KEY_TA_DIR, NM_OPENVPN_KEY_TA, NM_OPENVPN_KEY_RENEG_SECONDS, + NM_OPENVPN_KEY_FRAGMENT, NULL }; @@ -804,6 +805,16 @@ } static void +fragment_toggled_cb (GtkWidget *check, gpointer user_data) +{ + GladeXML *xml = (GladeXML *) user_data; + GtkWidget *widget; + + widget = glade_xml_get_widget (xml, "fragment_spinbutton"); + gtk_widget_set_sensitive (widget, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check))); +} + +static void reneg_toggled_cb (GtkWidget *check, gpointer user_data) { GladeXML *xml = (GladeXML *) user_data; @@ -1071,6 +1082,31 @@ gtk_widget_set_sensitive (widget, FALSE); } + widget = glade_xml_get_widget (xml, "fragment_checkbutton"); + g_signal_connect (G_OBJECT (widget), "toggled", G_CALLBACK (fragment_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 > 0 && tmp < 65536) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE); + + widget = glade_xml_get_widget (xml, "fragment_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, "fragment_spinbutton"); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), 1300.0); + gtk_widget_set_sensitive (widget, FALSE); + } + value = g_hash_table_lookup (hash, NM_OPENVPN_KEY_COMP_LZO); if (value && !strcmp (value, "yes")) { widget = glade_xml_get_widget (xml, "lzo_checkbutton"); @@ -1189,6 +1225,15 @@ g_hash_table_insert (hash, g_strdup (NM_OPENVPN_KEY_PORT), g_strdup_printf ("%d", port)); } + widget = glade_xml_get_widget (xml, "fragment_checkbutton"); + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) { + int fragment; + + widget = glade_xml_get_widget (xml, "fragment_spinbutton"); + fragment = 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", fragment)); + } + widget = glade_xml_get_widget (xml, "lzo_checkbutton"); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) g_hash_table_insert (hash, g_strdup (NM_OPENVPN_KEY_COMP_LZO), g_strdup ("yes")); diff -ur network-manager-openvpn-0.8~a~git.20091008t123607.7c184a9/properties/import-export.c network-manager-openvpn/properties/import-export.c --- network-manager-openvpn-0.8~a~git.20091008t123607.7c184a9/properties/import-export.c 2009-10-14 23:55:23.000000000 +0200 +++ network-manager-openvpn/properties/import-export.c 2010-01-26 22:50:51.091459031 +0100 @@ -58,6 +58,7 @@ #define TLS_AUTH_TAG "tls-auth" #define AUTH_TAG "auth" #define RENEG_SEC_TAG "reneg-sec" +#define FRAGMENT_TAG "fragment" static gboolean handle_path_item (const char *line, @@ -237,6 +238,27 @@ continue; } + if (!strncmp (*line, FRAGMENT_TAG, strlen (FRAGMENT_TAG))) { + items = get_args (*line + strlen (FRAGMENT_TAG)); + if (!items) + continue; + + if (g_strv_length (items) >= 1) { + glong fragment_mtu; + + errno = 0; + fragment_mtu = strtol (items[0], NULL, 10); + if ((errno == 0) && (fragment_mtu >= 0) && (fragment_mtu < 65535)) { + char *tmp = g_strdup_printf ("%d", (guint32) fragment_mtu); + nm_setting_vpn_add_data_item (s_vpn, NM_OPENVPN_KEY_FRAGMENT, tmp); + g_free (tmp); + } else + g_warning ("%s: invalid fragment MTU size in option '%s'", __func__, *line); + } + g_strfreev (items); + continue; + } + if (!strncmp (*line, RENEG_SEC_TAG, strlen (RENEG_SEC_TAG))) { items = get_args (*line + strlen (RENEG_SEC_TAG)); if (!items) diff -ur network-manager-openvpn-0.8~a~git.20091008t123607.7c184a9/properties/nm-openvpn-dialog.glade network-manager-openvpn/properties/nm-openvpn-dialog.glade --- network-manager-openvpn-0.8~a~git.20091008t123607.7c184a9/properties/nm-openvpn-dialog.glade 2009-10-14 23:55:23.000000000 +0200 +++ network-manager-openvpn/properties/nm-openvpn-dialog.glade 2010-01-27 10:46:25.589182007 +0100 @@ -1011,6 +1010,43 @@ 4 + + + True + 6 + + + UDP _fragmentation: + True + True + False + True + True + + + 0 + + + + + True + True + 1300 1 65535 1 10 10 + 1 + True + + + False + False + 1 + + + + + False + 5 + + diff -ur network-manager-openvpn-0.8~a~git.20091008t123607.7c184a9/src/nm-openvpn-service.c network-manager-openvpn/src/nm-openvpn-service.c --- network-manager-openvpn-0.8~a~git.20091008t123607.7c184a9/src/nm-openvpn-service.c 2009-10-14 23:55:23.000000000 +0200 +++ network-manager-openvpn/src/nm-openvpn-service.c 2010-01-26 23:06:17.213066010 +0100 @@ -102,6 +102,7 @@ { NM_OPENVPN_KEY_TA_DIR, G_TYPE_INT, 0, 1, FALSE }, { NM_OPENVPN_KEY_USERNAME, G_TYPE_STRING, 0, 0, FALSE }, { NM_OPENVPN_KEY_RENEG_SECONDS, G_TYPE_INT, 0, G_MAXINT, FALSE }, + { NM_OPENVPN_KEY_FRAGMENT, G_TYPE_INT, 1, 65535, FALSE }, { NULL, G_TYPE_NONE, FALSE } }; @@ -721,6 +722,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 MTU 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)) { diff -ur network-manager-openvpn-0.8~a~git.20091008t123607.7c184a9/src/nm-openvpn-service.h network-manager-openvpn/src/nm-openvpn-service.h --- network-manager-openvpn-0.8~a~git.20091008t123607.7c184a9/src/nm-openvpn-service.h 2009-10-14 23:55:23.000000000 +0200 +++ network-manager-openvpn/src/nm-openvpn-service.h 2010-01-26 16:29:38.039669164 +0100 @@ -56,6 +56,7 @@ #define NM_OPENVPN_KEY_TA "ta" #define NM_OPENVPN_KEY_TA_DIR "ta-dir" #define NM_OPENVPN_KEY_USERNAME "username" +#define NM_OPENVPN_KEY_FRAGMENT "fragment" #define NM_OPENVPN_KEY_PASSWORD "password" #define NM_OPENVPN_KEY_CERTPASS "cert-pass"