[PATCH] To send the MTU to NetworkManager to set the route



Hi,

Currently NetworkManager sets up a route to the VPN gateway through the
real network device without any mtu.

In some cases, mtu setting is needed for this route.

The attached patch makes NM to take the mtu from vpn-daemon and then use
that to set up the route to the VPN gateway through the real network
device. ( MTU = 0 -> No mtu will be set)

Appreciate any comments on this.

Thanks and Regards,
Vinay
Index: src/NetworkManagerSystem.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerSystem.c,v
retrieving revision 1.34
diff -u -r1.34 NetworkManagerSystem.c
--- src/NetworkManagerSystem.c	6 Mar 2006 01:10:58 -0000	1.34
+++ src/NetworkManagerSystem.c	9 Mar 2006 09:37:44 -0000
@@ -52,8 +52,8 @@
 #include <netlink/route/link.h>
 
 
-static gboolean nm_system_device_set_ip4_route					(NMDevice *dev, int ip4_gateway, int ip4_dest, int ip4_netmask);
-static gboolean nm_system_device_set_ip4_route_with_iface			(NMDevice *dev, const char *iface, int ip4_gateway, int ip4_dest, int ip4_netmask);
+static gboolean nm_system_device_set_ip4_route					(NMDevice *dev, int ip4_gateway, int ip4_dest, int ip4_netmask, int mtu);
+static gboolean nm_system_device_set_ip4_route_with_iface			(NMDevice *dev, const char *iface, int ip4_gateway, int ip4_dest, int ip4_netmask, int mtu);
 
 
 static struct nl_cache * get_link_cache (struct nl_handle *nlh)
@@ -212,7 +212,7 @@
 	nl_handle_destroy (nlh);
 
 	sleep (1);
-	nm_system_device_set_ip4_route (dev, nm_ip4_config_get_gateway (config), 0, 0);
+	nm_system_device_set_ip4_route (dev, nm_ip4_config_get_gateway (config), 0, 0, 0);
 
 	nm_named_manager_add_ip4_config (app_data->named_manager, config);
 
@@ -313,7 +313,7 @@
 
 	/* Set up a route to the VPN gateway through the real network device */
 	if (active_device && (ad_config = nm_device_get_ip4_config (active_device)))
-		nm_system_device_set_ip4_route (active_device, nm_ip4_config_get_gateway (ad_config), nm_ip4_config_get_gateway (config), 0xFFFFFFFF);
+		nm_system_device_set_ip4_route (active_device, nm_ip4_config_get_gateway (ad_config), nm_ip4_config_get_gateway (config), 0xFFFFFFFF, nm_ip4_config_get_mtu(config));
 
 	if (iface != NULL && strlen (iface))
 	{
@@ -460,14 +460,14 @@
  * Set the IPv4 broadcast address on a device.
  *
  */
-static gboolean nm_system_device_set_ip4_route (NMDevice *dev, int ip4_gateway, int ip4_dest, int ip4_netmask)
+static gboolean nm_system_device_set_ip4_route (NMDevice *dev, int ip4_gateway, int ip4_dest, int ip4_netmask, int mtu)
 {
 	g_return_val_if_fail (dev != NULL, FALSE);
 
-	return nm_system_device_set_ip4_route_with_iface (dev, nm_device_get_iface (dev), ip4_gateway, ip4_dest, ip4_netmask);
+	return nm_system_device_set_ip4_route_with_iface (dev, nm_device_get_iface (dev), ip4_gateway, ip4_dest, ip4_netmask, mtu);
 }
 
-static gboolean nm_system_device_set_ip4_route_with_iface (NMDevice *dev, const char *iface, int ip4_gateway, int ip4_dest, int ip4_netmask)
+static gboolean nm_system_device_set_ip4_route_with_iface (NMDevice *dev, const char *iface, int ip4_gateway, int ip4_dest, int ip4_netmask, int mtu)
 {
 	NMSock *			sk;
 	gboolean			success = FALSE;
@@ -502,6 +502,12 @@
 	rtent.rt_metric	= 1;
 	rtent.rt_window	= 0;
 	rtent.rt_flags		= RTF_UP | RTF_GATEWAY | (rtent.rt_window ? RTF_WINDOW : 0);
+	
+	if(mtu != 0)
+	{
+		rtent.rt_flags = rtent.rt_flags | RTF_MTU;
+		rtent.rt_mtu = mtu;
+	}
 
 #ifdef IOCTL_DEBUG
 	nm_info ("%s: About to CADDRT\n", nm_device_get_iface (dev));
@@ -529,6 +535,13 @@
 			rtent2.rt_dev		= (char *)iface;
 			rtent2.rt_metric	= 0;
 			rtent2.rt_flags	= RTF_UP | RTF_HOST;
+			
+			if(mtu != 0)
+			{
+				rtent2.rt_flags = rtent2.rt_flags | RTF_MTU;
+				rtent2.rt_mtu = mtu;
+			}
+
 
 #ifdef IOCTL_DEBUG
 			nm_info ("%s: About to CADDRT (2)\n", nm_device_get_iface (dev));
Index: src/nm-ip4-config.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/nm-ip4-config.c,v
retrieving revision 1.13
diff -u -r1.13 nm-ip4-config.c
--- src/nm-ip4-config.c	3 Feb 2006 17:40:30 -0000	1.13
+++ src/nm-ip4-config.c	9 Mar 2006 09:37:45 -0000
@@ -40,6 +40,7 @@
 	guint32	ip4_gateway;
 	guint32	ip4_netmask;
 	guint32	ip4_broadcast;
+	guint32 mtu;	
 
 	GSList *	nameservers;
 	GSList *	domains;
@@ -326,6 +327,19 @@
 	return (g_slist_length (config->domains));
 }
 
+guint32 nm_ip4_config_get_mtu (NMIP4Config *config)
+{
+	g_return_val_if_fail (config != NULL, 0);
+
+	return config->mtu;
+}
+
+void nm_ip4_config_set_mtu (NMIP4Config *config, guint32 mtu)
+{
+	g_return_if_fail (config != NULL);
+
+	config->mtu = mtu;
+}
 
 /* libnl convenience/conversion functions */
 
Index: src/nm-ip4-config.h
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/nm-ip4-config.h,v
retrieving revision 1.8
diff -u -r1.8 nm-ip4-config.h
--- src/nm-ip4-config.h	3 Feb 2006 17:40:30 -0000	1.8
+++ src/nm-ip4-config.h	9 Mar 2006 09:37:45 -0000
@@ -68,6 +68,8 @@
 const char *	nm_ip4_config_get_domain			(NMIP4Config *config, guint i);
 guint32		nm_ip4_config_get_num_domains		(NMIP4Config *config);
 
+guint32 	nm_ip4_config_get_mtu			(NMIP4Config *config);
+void			nm_ip4_config_set_mtu			(NMIP4Config *config, guint32 mtu);
 
 /* Flags for nm_ip4_config_to_rtnl_addr() */
 #define NM_RTNL_ADDR_NONE		0x0000
Index: src/vpn-manager/nm-vpn-service.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/vpn-manager/nm-vpn-service.c,v
retrieving revision 1.12
diff -u -r1.12 nm-vpn-service.c
--- src/vpn-manager/nm-vpn-service.c	28 Feb 2006 22:20:32 -0000	1.12
+++ src/vpn-manager/nm-vpn-service.c	9 Mar 2006 09:37:45 -0000
@@ -61,6 +61,7 @@
 						guint32 ip4_dns_len,
 						guint32 *ip4_nbns,
 						guint32 ip4_nbns_len,
+						guint32 mtu,
 						const char *dns_domain,
 						const char *login_banner);
 #endif
@@ -809,13 +810,18 @@
 		dbus_message_iter_next (&subiter);
 	}
 
-	/* Eigth arg: DNS Domain (STRING) */
+	/* Eighth arg: MTU (UINT32) */
+	if (!get_dbus_guint32_helper (&iter, &num, "MTU"))
+		goto out;
+	nm_ip4_config_set_mtu (config, num );
+	
+	/* Ninth arg: DNS Domain (STRING) */
 	if (!get_dbus_string_helper (&iter, &str, "DNS Domain"))
 		goto out;
 	if (strlen (str))
 		nm_ip4_config_add_domain (config, str);
 
-	/* Ninth arg: VPN Login Banner (STRING) */
+	/* tenth arg: VPN Login Banner (STRING) */
 	if (!get_dbus_string_helper (&iter, &login_banner, "Login Banner"))
 		goto out;
 
@@ -829,6 +835,7 @@
 	                  ip4_dns_len,
 	                  ip4_nbns,
 	                  ip4_nbns_len,
+			  mtu,
 	                  dns_domain,
 	                  login_banner);
 #endif
@@ -1057,6 +1064,7 @@
 						guint32 ip4_dns_len,
 						guint32 *ip4_nbns,
 						guint32 ip4_nbns_len,
+						guint32 mtu,
 						const char *dns_domain,
 						const char *login_banner)
 {
@@ -1072,6 +1080,7 @@
 	nm_info ("Internal IP4 Netmask: %s", inet_ntoa (temp_addr));
 	temp_addr.s_addr = ip4_ptp_address;
 	nm_info ("Internal IP4 Point-to-Point Address: %s", inet_ntoa (temp_addr));
+	nm_info ("MTU: %d", mtu);
 
 	for (i = 0; i < ip4_dns_len; i++)
 	{


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