On Tuesday, August 21, 2012 9:34:31 am John Baldwin wrote: > On Tuesday, August 21, 2012 7:53:08 am Lev Serebryakov wrote: > > Hello, Garrett. > > You wrote 21 августа 2012 г., 15:40:35: > > > > GC>> Try reverting r239356 -- if that works, then please let jhb_at_ know. > > LS> I'm confused by this commit, because it seems (from comment alone), > > LS> that dhclient will not work without devd anymore (with "synchronous > > LS> dhcp" option in rc.conf). > > LS> Am I right? > > And if I'm right about understanding what this change does, it is > > POLA violation for sure. Both consequences: unable to use dhcclient > > without devd (user will need to restart it by hands after each cable > > unplugging event) and removing IP address from interface on cable > > unplugging or other interface down event but before lease is expired. > > > > If I'm right in understanding this commit, I vote to back it out and > > find better solution, may be, two new options: one to remove IP and > > one to exit on interface down. And default behavior should be OLD > > ONE about IP address in any case and OLD ONE about exit in case when > > dhclient isn't started by devd, but by rc scripts directly. > > Humm. devd is the more common case, and we explicitly don't use devd to start > dhclient on boot even when devd is enabled (so out of the box dhcp would first > be started by rc, but would be restarted by devd). > > Another option is to rework dhclient to work like it does on OpenBSD where it > renews its lease if the link bounces, but to not exit when the link goes down. > That case would fix the currently broken case that you unplug your cable, take > your laptop over to another network (e.g. take it home if suspend/resume > works), then plug it back in and are still stuck with your old IP. Ok, this is what I came up with, somewhat loosely based on OpenBSD's dhclient. I tested that it survives the following: - Unplugging/replugging does not kill an existing ssh session - Using ifconfig down/up does not kill an existing ssh session - Plugging into a different network does cause dhclient to negotiate a new lease on the new network I've removed the bits to clear the old configuration if dhclient exits due to 'ifconfig down', and dhclient no longer exits on link down, but instead tracks the link state and enters the 'reboot' state when the link goes up. Index: dhcpd.h =================================================================== --- dhcpd.h (revision 239498) +++ dhcpd.h (working copy) _at__at_ -208,6 +208,7 _at__at_ int errors; int dead; u_int16_t index; + int linkstat; }; struct timeout { Index: dhclient.c =================================================================== --- dhclient.c (revision 239498) +++ dhclient.c (working copy) _at__at_ -218,6 +218,7 _at__at_ struct sockaddr *sa; struct iaddr a; ssize_t n; + int linkstat; n = read(routefd, &msg, sizeof(msg)); rtm = (struct rt_msghdr *)msg; _at__at_ -278,10 +279,14 _at__at_ 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: _at__at_ -321,8 +326,6 _at__at_ 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(); _at__at_ -437,6 +440,7 _at__at_ } fprintf(stderr, " got link\n"); } + ifi->linkstat = 1; if ((nullfd = open(_PATH_DEVNULL, O_RDWR, 0)) == -1) error("cannot open %s: %m", _PATH_DEVNULL); -- John BaldwinReceived on Tue Aug 21 2012 - 19:27:26 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:29 UTC