25f86691e2
- core: fix reading physical port id for sysfs - libnm-glib: export get_gateway() and get_searches() functions - libnm-glib: new functions for bindings to get nameservers - libnm-glib: chain up the parent constructed() of NMRemoteConnection - core: exit cleanly if D-Bus cannot be initialized (rh #1057738) - dhcp: don't add an IPv6 address if one wasn't given (rh #1048046) - core: Add host route for DHCP4 server if outside assigned subnet (bgo #721767) (rh #983325) - vpn: handle missing tunnel interface for IP-based VPNs (bgo #721724) (rh #1030068) (rh #865883) - core: only log about IPv6 Commit the first time (rh #1044757)
84 lines
3.1 KiB
Diff
84 lines
3.1 KiB
Diff
From 31fe84e467732463eabc8f70c2a419008e7a227c Mon Sep 17 00:00:00 2001
|
|
From: Scott Shambarger <devel@shambarger.net>
|
|
Date: Thu, 9 Jan 2014 14:26:53 -0800
|
|
Subject: [PATCH] core: Add host route for DHCP4 server if outside assigned
|
|
subnet (bgo #721767)
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Some ISP's provide leases from central servers that are on different
|
|
subnets that the address offered. If the host does not configure the
|
|
interface as the default route, the dhcp server may not be reachable
|
|
via unicast, and a host specific route is needed.
|
|
|
|
https://bugzilla.gnome.org/show_bug.cgi?id=721767
|
|
https://bugzilla.redhat.com/show_bug.cgi?id=983325
|
|
|
|
Signed-off-by: Thomas Haller <thaller@redhat.com>
|
|
Signed-off-by: Jiří Klimeš <jklimes@redhat.com>
|
|
---
|
|
src/dhcp-manager/nm-dhcp-client.c | 39 +++++++++++++++++++++++++++++++++++++--
|
|
1 file changed, 37 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c
|
|
index edea8f8..75cd818 100644
|
|
--- a/src/dhcp-manager/nm-dhcp-client.c
|
|
+++ b/src/dhcp-manager/nm-dhcp-client.c
|
|
@@ -1200,8 +1200,8 @@ ip4_options_to_config (NMDHCPClient *self)
|
|
|
|
for (s = routers; *s; s++) {
|
|
/* FIXME: how to handle multiple routers? */
|
|
- if (inet_pton (AF_INET, *s, &tmp_addr) > 0) {
|
|
- nm_ip4_config_set_gateway (ip4_config, tmp_addr);
|
|
+ if (inet_pton (AF_INET, *s, &gwaddr) > 0) {
|
|
+ nm_ip4_config_set_gateway (ip4_config, gwaddr);
|
|
nm_log_info (LOGD_DHCP4, " gateway %s", *s);
|
|
break;
|
|
} else
|
|
@@ -1211,6 +1211,41 @@ ip4_options_to_config (NMDHCPClient *self)
|
|
}
|
|
}
|
|
|
|
+ /*
|
|
+ * RFC 2132, section 9.7
|
|
+ * DHCP clients use the contents of the 'server identifier' field
|
|
+ * as the destination address for any DHCP messages unicast to
|
|
+ * the DHCP server.
|
|
+ *
|
|
+ * Some ISP's provide leases from central servers that are on
|
|
+ * different subnets that the address offered. If the host
|
|
+ * does not configure the interface as the default route, the
|
|
+ * dhcp server may not be reachable via unicast, and a host
|
|
+ * specific route is needed.
|
|
+ **/
|
|
+ str = g_hash_table_lookup (priv->options, "new_dhcp_server_identifier");
|
|
+ if (str) {
|
|
+ if (inet_pton (AF_INET, str, &tmp_addr) > 0) {
|
|
+ NMPlatformIP4Route route;
|
|
+ guint32 mask = nm_utils_ip4_prefix_to_netmask (address.plen);
|
|
+
|
|
+ nm_log_info (LOGD_DHCP4, " server identifier %s", str);
|
|
+ if ((tmp_addr & mask) != (address.address & mask)) {
|
|
+ /* DHCP server not on assigned subnet, route needed */
|
|
+ memset (&route, 0, sizeof (route));
|
|
+ route.network = tmp_addr;
|
|
+ route.plen = 32;
|
|
+ /* this will be a device route if gwaddr is 0 */
|
|
+ route.gateway = gwaddr;
|
|
+ nm_ip4_config_add_route (ip4_config, &route);
|
|
+ nm_log_dbg (LOGD_IP, "adding route for server identifier: %s",
|
|
+ nm_platform_ip4_route_to_string (&route));
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ nm_log_warn (LOGD_DHCP4, "ignoring invalid server identifier '%s'", str);
|
|
+ }
|
|
+
|
|
str = g_hash_table_lookup (priv->options, "new_dhcp_lease_time");
|
|
if (str) {
|
|
address.lifetime = address.preferred = strtoul (str, NULL, 10);
|
|
--
|
|
1.7.11.7
|
|
|