summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@redhat.com>2014-11-19 12:03:24 -0500
committerDan Winship <danw@redhat.com>2014-11-19 12:03:24 -0500
commit9f5cff0bb3429078cdbb9ada955a7dbe17d3c7b0 (patch)
treef3acea79286b9c177228e788ed051981cf227572
parent44eb50d12f996904edb9c7110d8642d426382f9c (diff)
parent93799e68ba47e1cc59f2b87c827ff23bdf0314c3 (diff)
downloadNetworkManager-9f5cff0bb3429078cdbb9ada955a7dbe17d3c7b0.tar.gz
Merge branch 'dhcp-fixes'
-rw-r--r--man/NetworkManager.conf.xml.in18
-rw-r--r--src/dhcp-manager/nm-dhcp-systemd.c40
-rw-r--r--src/dhcp-manager/systemd-dhcp/src/libsystemd-network/network-internal.c8
3 files changed, 31 insertions, 35 deletions
diff --git a/man/NetworkManager.conf.xml.in b/man/NetworkManager.conf.xml.in
index 5928843b75..d9d51b846a 100644
--- a/man/NetworkManager.conf.xml.in
+++ b/man/NetworkManager.conf.xml.in
@@ -133,12 +133,18 @@ Copyright 2010 - 2014 Red Hat, Inc.
<varlistentry>
<term><varname>dhcp</varname></term>
<listitem><para>This key sets up what DHCP client
- NetworkManager will use. Presently
- <literal>dhclient</literal> and <literal>dhcpcd</literal>
- are supported. The client configured here should be
- available on your system too. If this key is missing,
- available DHCP clients are looked for in this order:
- dhclient, dhcpcd.</para></listitem>
+ NetworkManager will use. Allowed values are
+ <literal>dhclient</literal>, <literal>dhcpcd</literal>, and
+ <literal>internal</literal>. The <literal>dhclient</literal>
+ and <literal>dhcpcd</literal> options require the indicated
+ clients to be installed. The <literal>internal</literal>
+ option uses a built-in DHCP client which is not currently as
+ featureful as the external clients (and in particular, does
+ not yet support DHCPv6).</para>
+ <para>If this key is missing, available DHCP clients are
+ looked for in this order: <literal>dhclient</literal>,
+ <literal>dhcpcd</literal>,
+ <literal>internal</literal>.</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>no-auto-default</varname></term>
diff --git a/src/dhcp-manager/nm-dhcp-systemd.c b/src/dhcp-manager/nm-dhcp-systemd.c
index 9cdd9e206b..b475505c75 100644
--- a/src/dhcp-manager/nm-dhcp-systemd.c
+++ b/src/dhcp-manager/nm-dhcp-systemd.c
@@ -210,24 +210,20 @@ lease_to_ip4_config (sd_dhcp_lease *lease,
const struct in_addr *addr_list;
char buf[INET_ADDRSTRLEN];
const char *str;
- guint32 lifetime = 0, plen = 0, i;
+ guint32 lifetime = 0, i;
NMPlatformIP4Address address;
GString *l;
struct sd_dhcp_route *routes;
guint16 mtu;
int r, num;
- gint64 end_time;
+ time_t end_time;
- r = sd_dhcp_lease_get_address (lease, &tmp_addr);
- if (r < 0) {
- g_set_error_literal (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
- "failed to read address from lease");
- return NULL;
- }
+ g_return_val_if_fail (lease != NULL, NULL);
ip4_config = nm_ip4_config_new ();
/* Address */
+ sd_dhcp_lease_get_address (lease, &tmp_addr);
memset (&address, 0, sizeof (address));
address.address = tmp_addr.s_addr;
str = nm_utils_inet4_ntop (tmp_addr.s_addr, NULL);
@@ -235,33 +231,24 @@ lease_to_ip4_config (sd_dhcp_lease *lease,
add_option (options, dhcp4_requests, DHCP_OPTION_IP_ADDRESS, str);
/* Prefix/netmask */
- r = sd_dhcp_lease_get_netmask (lease, &tmp_addr);
- if (r < 0) {
- /* Get default netmask for the IP according to appropriate class. */
- plen = nm_utils_ip4_get_default_prefix (address.address);
- LOG_LEASE (LOGD_DHCP4, " plen %d (default)", plen);
- } else {
- plen = nm_utils_ip4_netmask_to_prefix (tmp_addr.s_addr);
- LOG_LEASE (LOGD_DHCP4, " plen %d", plen);
- }
- address.plen = plen;
- tmp_addr.s_addr = nm_utils_ip4_prefix_to_netmask (plen);
+ sd_dhcp_lease_get_netmask (lease, &tmp_addr);
+ address.plen = nm_utils_ip4_netmask_to_prefix (tmp_addr.s_addr);
+ LOG_LEASE (LOGD_DHCP4, " plen %d", address.plen);
add_option (options,
dhcp4_requests,
DHCP_OPTION_SUBNET_MASK,
nm_utils_inet4_ntop (tmp_addr.s_addr, NULL));
/* Lease time */
- r = sd_dhcp_lease_get_lifetime (lease, &lifetime);
- if (r < 0)
- lifetime = 3600; /* one hour */
+ sd_dhcp_lease_get_lifetime (lease, &lifetime);
address.timestamp = nm_utils_get_monotonic_timestamp_s ();
address.lifetime = address.preferred = lifetime;
- end_time = (gint64) time (NULL) + lifetime;
+ end_time = MIN ((guint64) time (NULL) + lifetime, G_MAXUINT32 - 1);
+ LOG_LEASE (LOGD_DHCP4, " expires %s", ctime (&end_time));
add_option_u32 (options,
dhcp4_requests,
DHCP_OPTION_IP_ADDRESS_LEASE_TIME,
- (guint) CLAMP (end_time, 0, G_MAXUINT32 - 1));
+ (guint32) end_time);
address.source = NM_IP_CONFIG_SOURCE_DHCP;
nm_ip4_config_add_address (ip4_config, &address);
@@ -349,11 +336,12 @@ lease_to_ip4_config (sd_dhcp_lease *lease,
}
/* NTP servers */
- num = sd_dhcp_lease_get_ntp(lease, &addr_list);
+ num = sd_dhcp_lease_get_ntp (lease, &addr_list);
if (num > 0) {
l = g_string_sized_new (30);
for (i = 0; i < num; i++) {
str = nm_utils_inet4_ntop (addr_list[i].s_addr, buf);
+ LOG_LEASE (LOGD_DHCP4, " ntp server '%s'", str);
g_string_append_printf (l, "%s%s", l->len ? " " : "", str);
}
add_option (options, dhcp4_requests, DHCP_OPTION_NTP_SERVER, l->str);
@@ -390,7 +378,7 @@ nm_dhcp_systemd_get_lease_ip_configs (const char *iface,
path = get_leasefile_path (iface, uuid, FALSE);
r = sd_dhcp_lease_load (&lease, path);
- if (r == 0) {
+ if (r == 0 && lease) {
ip4_config = lease_to_ip4_config (lease, NULL, 0, FALSE, NULL);
if (ip4_config)
leases = g_slist_append (leases, ip4_config);
diff --git a/src/dhcp-manager/systemd-dhcp/src/libsystemd-network/network-internal.c b/src/dhcp-manager/systemd-dhcp/src/libsystemd-network/network-internal.c
index 41a380eb5a..b9334bd657 100644
--- a/src/dhcp-manager/systemd-dhcp/src/libsystemd-network/network-internal.c
+++ b/src/dhcp-manager/systemd-dhcp/src/libsystemd-network/network-internal.c
@@ -404,10 +404,12 @@ void serialize_dhcp_routes(FILE *f, const char *key, struct sd_dhcp_route *route
fprintf(f, "%s=", key);
- for (i = 0; i < size; i++)
- fprintf(f, "%s/%" PRIu8 ",%s%s", inet_ntoa(routes[i].dst_addr),
- routes[i].dst_prefixlen, inet_ntoa(routes[i].gw_addr),
+ for (i = 0; i < size; i++) {
+ fprintf(f, "%s/%" PRIu8, inet_ntoa(routes[i].dst_addr),
+ routes[i].dst_prefixlen);
+ fprintf(f, ",%s%s", inet_ntoa(routes[i].gw_addr),
(i < (size - 1)) ? " ": "");
+ }
fputs("\n", f);
}