summaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
Diffstat (limited to 'sbin')
-rw-r--r--sbin/dhclient/dhclient.c38
-rw-r--r--sbin/dhclient/kroute.c4
2 files changed, 25 insertions, 17 deletions
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c
index 7155446d76e..fa317281646 100644
--- a/sbin/dhclient/dhclient.c
+++ b/sbin/dhclient/dhclient.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dhclient.c,v 1.194 2012/12/16 03:15:46 lteo Exp $ */
+/* $OpenBSD: dhclient.c,v 1.195 2012/12/17 22:52:59 krw Exp $ */
/*
* Copyright 2004 Henning Brauer <henning@openbsd.org>
@@ -214,6 +214,12 @@ routehandler(void)
if (rtm->rtm_type == RTM_NEWADDR) {
if (a.s_addr == adding.s_addr) {
adding.s_addr = INADDR_ANY;
+ note("bound to %s -- renewal in %lld seconds.",
+ inet_ntoa(client->active->address),
+ (long long)(client->active->renewal -
+ time(NULL)));
+ client->state = S_BOUND;
+ go_daemon();
break;
}
errmsg = "interface address added";
@@ -484,6 +490,8 @@ state_reboot(void)
/* Cancel all timeouts, since a link state change gets us here
and can happen anytime. */
cancel_timeout();
+ deleting.s_addr = INADDR_ANY;
+ adding.s_addr = INADDR_ANY;
/* If we don't remember an active lease, go straight to INIT. */
if (!client->active || client->active->is_bootp) {
@@ -687,14 +695,7 @@ bind_lease(void)
memset(&mask, 0, sizeof(mask));
memcpy(&mask.s_addr, options[DHO_SUBNET_MASK].data,
options[DHO_SUBNET_MASK].len);
- add_address(ifi->name, ifi->rdomain, client->new->address, mask);
- if (options[DHO_ROUTERS].len) {
- memset(&gateway, 0, sizeof(gateway));
- /* XXX Only use FIRST router address for now. */
- memcpy(&gateway.s_addr, options[DHO_ROUTERS].data,
- options[DHO_ROUTERS].len);
- add_default_route(ifi->rdomain, client->new->address, gateway);
- }
+
if (options[DHO_DOMAIN_NAME].len)
domainname = strdup(pretty_print_option(
DHO_DOMAIN_NAME, &options[DHO_DOMAIN_NAME], 0));
@@ -709,6 +710,19 @@ bind_lease(void)
new_resolv_conf(ifi->name, domainname, nameservers);
+ /*
+ * Add address and default route last, so we know when the binding
+ * is done by the RTM_NEWADDR message being received.
+ */
+ add_address(ifi->name, ifi->rdomain, client->new->address, mask);
+ if (options[DHO_ROUTERS].len) {
+ memset(&gateway, 0, sizeof(gateway));
+ /* XXX Only use FIRST router address for now. */
+ memcpy(&gateway.s_addr, options[DHO_ROUTERS].data,
+ options[DHO_ROUTERS].len);
+ add_default_route(ifi->rdomain, client->new->address, gateway);
+ }
+
free(domainname);
free(nameservers);
free_client_lease(lease);
@@ -724,12 +738,6 @@ bind_lease(void)
/* Set timeout to start the renewal process. */
set_timeout(client->active->renewal, state_bound);
-
- note("bound to %s -- renewal in %lld seconds.",
- inet_ntoa(client->active->address),
- (long long)(client->active->renewal - time(NULL)));
- client->state = S_BOUND;
- go_daemon();
}
/*
diff --git a/sbin/dhclient/kroute.c b/sbin/dhclient/kroute.c
index 9337ea62726..e9db894642a 100644
--- a/sbin/dhclient/kroute.c
+++ b/sbin/dhclient/kroute.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kroute.c,v 1.23 2012/12/04 19:24:03 krw Exp $ */
+/* $OpenBSD: kroute.c,v 1.24 2012/12/17 22:52:59 krw Exp $ */
/*
* Copyright 2012 Kenneth R Westerback <krw@openbsd.org>
@@ -302,7 +302,7 @@ priv_add_default_route(struct imsg_add_default_route *imsg)
for (i = 0; i < 5; i++) {
if (writev(s, iov, iovcnt) != -1)
break;
- if (errno != EEXIST)
+ if (errno != EEXIST && errno != ENETUNREACH)
error("failed to add default route: %s",
strerror(errno));
sleep(1);