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
This commit is contained in:
John Baldwin 2012-08-22 13:53:37 +00:00
parent 99c841b11e
commit 0a26f85822
2 changed files with 11 additions and 6 deletions

View File

@ -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);

View File

@ -208,6 +208,7 @@ struct interface_info {
int errors;
int dead;
u_int16_t index;
int linkstat;
};
struct timeout {