summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJiří Klimeš <jklimes@redhat.com>2014-04-17 11:15:36 +0200
committerJiří Klimeš <jklimes@redhat.com>2014-04-22 10:58:55 +0200
commit0757e33e746f0a203b4a4c5f386307e3a8ed9766 (patch)
tree0e2556c57dca8924b7d0bfeb234dedb3bf410240 /src
parent30a98f31496427b295df6fea14b50bd8e68525c1 (diff)
downloadNetworkManager-0757e33e746f0a203b4a4c5f386307e3a8ed9766.tar.gz
core: fix MTU handling while merging/subtracting IP configs (bgo #721420)
https://bugzilla.gnome.org/show_bug.cgi?id=721420 https://bugzilla.redhat.com/show_bug.cgi?id=1047083
Diffstat (limited to 'src')
-rw-r--r--src/nm-ip4-config.c12
-rw-r--r--src/tests/test-ip4-config.c50
2 files changed, 60 insertions, 2 deletions
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c
index 034d2e9127..505bc851ff 100644
--- a/src/nm-ip4-config.c
+++ b/src/nm-ip4-config.c
@@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * Copyright (C) 2005 - 2013 Red Hat, Inc.
+ * Copyright (C) 2005 - 2014 Red Hat, Inc.
* Copyright (C) 2006 - 2008 Novell, Inc.
*/
@@ -502,9 +502,14 @@ nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src)
for (i = 0; i < nm_ip4_config_get_num_searches (src); i++)
nm_ip4_config_add_search (dst, nm_ip4_config_get_search (src, i));
+ /* MSS */
if (!nm_ip4_config_get_mss (dst))
nm_ip4_config_set_mss (dst, nm_ip4_config_get_mss (src));
+ /* MTU */
+ if (!nm_ip4_config_get_mtu (dst))
+ nm_ip4_config_set_mtu (dst, nm_ip4_config_get_mtu (src));
+
/* NIS */
for (i = 0; i < nm_ip4_config_get_num_nis_servers (src); i++)
nm_ip4_config_add_nis_server (dst, nm_ip4_config_get_nis_server (src, i));
@@ -611,9 +616,14 @@ nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src)
}
}
+ /* MSS */
if (nm_ip4_config_get_mss (src) == nm_ip4_config_get_mss (dst))
nm_ip4_config_set_mss (dst, 0);
+ /* MTU */
+ if (nm_ip4_config_get_mtu (src) == nm_ip4_config_get_mtu (dst))
+ nm_ip4_config_set_mtu (dst, 0);
+
/* NIS */
for (i = 0; i < nm_ip4_config_get_num_nis_servers (src); i++) {
guint32 src_nis = nm_ip4_config_get_nis_server (src, i);
diff --git a/src/tests/test-ip4-config.c b/src/tests/test-ip4-config.c
index e2d56948b3..f08ed24265 100644
--- a/src/tests/test-ip4-config.c
+++ b/src/tests/test-ip4-config.c
@@ -14,7 +14,7 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * Copyright (C) 2013 Red Hat, Inc.
+ * Copyright (C) 2013 - 2014 Red Hat, Inc.
*
*/
@@ -116,6 +116,8 @@ test_subtract (void)
const char *expected_search = "somewhere.com";
guint32 expected_nis = addr_to_num ("1.2.3.13");
guint32 expected_wins = addr_to_num ("2.3.4.5");
+ guint32 expected_mss = 1400;
+ guint32 expected_mtu = 1492;
src = build_test_config ();
@@ -135,6 +137,9 @@ test_subtract (void)
nm_ip4_config_add_nis_server (dst, expected_nis);
nm_ip4_config_add_wins (dst, expected_wins);
+ nm_ip4_config_set_mss (dst, expected_mss);
+ nm_ip4_config_set_mtu (dst, expected_mtu);
+
nm_ip4_config_subtract (dst, src);
/* ensure what's left is what we expect */
@@ -169,6 +174,9 @@ test_subtract (void)
g_assert_cmpuint (nm_ip4_config_get_num_wins (dst), ==, 1);
g_assert_cmpuint (nm_ip4_config_get_wins (dst, 0), ==, expected_wins);
+ g_assert_cmpuint (nm_ip4_config_get_mss (dst), ==, expected_mss);
+ g_assert_cmpuint (nm_ip4_config_get_mtu (dst), ==, expected_mtu);
+
g_object_unref (src);
g_object_unref (dst);
}
@@ -286,6 +294,45 @@ test_add_route_with_source (void)
g_object_unref (a);
}
+static void
+test_merge_subtract_mss_mtu (void)
+{
+ NMIP4Config *cfg1, *cfg2, *cfg3;
+ guint32 expected_mss2 = 1400;
+ guint32 expected_mtu2 = 1492;
+ guint32 expected_mss3 = 555;
+ guint32 expected_mtu3 = 666;
+
+ cfg1 = build_test_config ();
+ cfg2 = build_test_config ();
+ cfg3 = build_test_config ();
+
+ /* add MSS, MTU to configs to test them */
+ nm_ip4_config_set_mss (cfg2, expected_mss2);
+ nm_ip4_config_set_mtu (cfg2, expected_mtu2);
+ nm_ip4_config_set_mss (cfg3, expected_mss3);
+ nm_ip4_config_set_mtu (cfg3, expected_mtu3);
+
+ nm_ip4_config_merge (cfg1, cfg2);
+ /* ensure MSS and MTU are in cfg1 */
+ g_assert_cmpuint (nm_ip4_config_get_mss (cfg1), ==, expected_mss2);
+ g_assert_cmpuint (nm_ip4_config_get_mtu (cfg1), ==, expected_mtu2);
+
+ nm_ip4_config_merge (cfg1, cfg3);
+ /* ensure again the same MSS and MTU are in cfg1 */
+ g_assert_cmpuint (nm_ip4_config_get_mss (cfg1), ==, expected_mss2);
+ g_assert_cmpuint (nm_ip4_config_get_mtu (cfg1), ==, expected_mtu2);
+
+ nm_ip4_config_subtract (cfg1, cfg2);
+ /* ensure MSS and MTU are zero in cfg1 */
+ g_assert_cmpuint (nm_ip4_config_get_mss (cfg1), ==, 0);
+ g_assert_cmpuint (nm_ip4_config_get_mtu (cfg1), ==, 0);
+
+ g_object_unref (cfg1);
+ g_object_unref (cfg2);
+ g_object_unref (cfg3);
+}
+
/*******************************************/
int
@@ -299,6 +346,7 @@ main (int argc, char **argv)
g_test_add_func ("/ip4-config/compare-with-source", test_compare_with_source);
g_test_add_func ("/ip4-config/add-address-with-source", test_add_address_with_source);
g_test_add_func ("/ip4-config/add-route-with-source", test_add_route_with_source);
+ g_test_add_func ("/ip4-config/merge-subtract-mss-mtu", test_merge_subtract_mss_mtu);
return g_test_run ();
}