summaryrefslogtreecommitdiffstats
path: root/sbin/dhclient
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2012-08-22 13:53:37 +0000
committerjhb <jhb@FreeBSD.org>2012-08-22 13:53:37 +0000
commit3ef98be9d9110aabdd2cd13be8798526e78bdb12 (patch)
tree40adcea0d3b835e67f66b619bdc1b56f56f2aeac /sbin/dhclient
parent7ad4e5cce6b4edbdceab15ae68014fcba7de599d (diff)
downloadFreeBSD-src-3ef98be9d9110aabdd2cd13be8798526e78bdb12.zip
FreeBSD-src-3ef98be9d9110aabdd2cd13be8798526e78bdb12.tar.gz
Revert r239356 and use an alternate algorithm.
First, don't exit when the link goes down on an interface. Instead, teach dhclient to track changes in link state and to enter the reboot state when the link on an interface goes up causing dhclient to attempt to renew its existing lease. Second, remove the change I added to clear the old lease when dhclient exits due to an error (such as ifconfig down). If an interface is using autoconfiguration it should keep its autoconfiguration as much as possible. If the next time it needs a configuration it is able to reuse the previous autoconfiguration, then leaving the settings intact allows existing connections to survive temporary outages, etc. PR: bin/166656 MFC after: 1 month
Diffstat (limited to 'sbin/dhclient')
-rw-r--r--sbin/dhclient/dhclient.c16
-rw-r--r--sbin/dhclient/dhcpd.h1
2 files changed, 11 insertions, 6 deletions
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c
index 7260d3f..f71c8c8 100644
--- a/sbin/dhclient/dhclient.c
+++ b/sbin/dhclient/dhclient.c
@@ -218,6 +218,7 @@ routehandler(struct protocol *p)
struct sockaddr *sa;
struct iaddr a;
ssize_t n;
+ int linkstat;
n = read(routefd, &msg, sizeof(msg));
rtm = (struct rt_msghdr *)msg;
@@ -278,10 +279,14 @@ routehandler(struct protocol *p)
ifi->name);
goto die;
}
- if (!interface_link_status(ifi->name)) {
- warning("Interface %s is down, dhclient exiting",
- ifi->name);
- goto die;
+ linkstat = interface_link_status(ifi->name);
+ if (linkstat != ifi->linkstat) {
+ debug("%s link state %s -> %s", ifi->name,
+ ifi->linkstat ? "up" : "down",
+ linkstat ? "up" : "down");
+ ifi->linkstat = linkstat;
+ if (linkstat)
+ state_reboot(ifi);
}
break;
case RTM_IFANNOUNCE:
@@ -321,8 +326,6 @@ routehandler(struct protocol *p)
die:
script_init("FAIL", NULL);
- if (ifi->client->active)
- script_write_params("old_", ifi->client->active);
if (ifi->client->alias)
script_write_params("alias_", ifi->client->alias);
script_go();
@@ -437,6 +440,7 @@ main(int argc, char *argv[])
}
fprintf(stderr, " got link\n");
}
+ ifi->linkstat = 1;
if ((nullfd = open(_PATH_DEVNULL, O_RDWR, 0)) == -1)
error("cannot open %s: %m", _PATH_DEVNULL);
diff --git a/sbin/dhclient/dhcpd.h b/sbin/dhclient/dhcpd.h
index 1334a7c..4762cbd 100644
--- a/sbin/dhclient/dhcpd.h
+++ b/sbin/dhclient/dhcpd.h
@@ -208,6 +208,7 @@ struct interface_info {
int errors;
int dead;
u_int16_t index;
+ int linkstat;
};
struct timeout {
OpenPOWER on IntegriCloud