From owner-freebsd-current@FreeBSD.ORG Tue Aug 21 21:27:26 2012 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EE90310656B0; Tue, 21 Aug 2012 21:27:25 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from bigwig.baldwin.cx (bigknife-pt.tunnel.tserv9.chi1.ipv6.he.net [IPv6:2001:470:1f10:75::2]) by mx1.freebsd.org (Postfix) with ESMTP id 94B8C8FC12; Tue, 21 Aug 2012 21:27:25 +0000 (UTC) Received: from jhbbsd.localnet (unknown [209.249.190.124]) by bigwig.baldwin.cx (Postfix) with ESMTPSA id DFE63B91E; Tue, 21 Aug 2012 17:27:24 -0400 (EDT) From: John Baldwin To: freebsd-current@freebsd.org Date: Tue, 21 Aug 2012 17:25:23 -0400 User-Agent: KMail/1.13.5 (FreeBSD/8.2-CBSD-20110714-p17; KDE/4.5.5; amd64; ; ) References: <20120821095527.GA33206@hell.ukr.net> <1959717636.20120821155308@serebryakov.spb.ru> <201208210934.31484.jhb@freebsd.org> In-Reply-To: <201208210934.31484.jhb@freebsd.org> MIME-Version: 1.0 Content-Type: Text/Plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable Message-Id: <201208211725.23381.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.7 (bigwig.baldwin.cx); Tue, 21 Aug 2012 17:27:25 -0400 (EDT) Cc: Garrett Cooper , lev@freebsd.org, current@freebsd.org, Peter Jeremy Subject: Re: r239356: does it mean, that synchronous dhcp and dhcplcinet with disabled devd gone? X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Aug 2012 21:27:26 -0000 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 =E0=E2=E3=F3=F1=F2=E0 2012 =E3., 15:40:35: > >=20 > > GC>> Try reverting r239356 -- if that works, then please let jhb@ know. > > LS> I'm confused by this commit, because it seems (from comment alon= e), > > LS> that dhclient will not work without devd anymore (with "synchrono= us > > 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. > >=20 > > 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. >=20 > Humm. devd is the more common case, and we explicitly don't use devd to = start=20 > dhclient on boot even when devd is enabled (so out of the box dhcp would = first=20 > be started by rc, but would be restarted by devd). >=20 > Another option is to rework dhclient to work like it does on OpenBSD wher= e it > renews its lease if the link bounces, but to not exit when the link goes = down. =20 > That case would fix the currently broken case that you unplug your cable,= take=20 > your laptop over to another network (e.g. take it home if suspend/resume= =20 > 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 dhclie= nt. I tested that it survives the following: =2D Unplugging/replugging does not kill an existing ssh session =2D Using ifconfig down/up does not kill an existing ssh session =2D 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 tra= cks the link state and enters the 'reboot' state when the link goes up. Index: dhcpd.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =2D-- dhcpd.h (revision 239498) +++ dhcpd.h (working copy) @@ -208,6 +208,7 @@ int errors; int dead; u_int16_t index; + int linkstat; }; =20 struct timeout { Index: dhclient.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =2D-- dhclient.c (revision 239498) +++ dhclient.c (working copy) @@ -218,6 +218,7 @@ struct sockaddr *sa; struct iaddr a; ssize_t n; + int linkstat; =20 n =3D read(routefd, &msg, sizeof(msg)); rtm =3D (struct rt_msghdr *)msg; @@ -278,10 +279,14 @@ ifi->name); goto die; } =2D if (!interface_link_status(ifi->name)) { =2D warning("Interface %s is down, dhclient exiting", =2D ifi->name); =2D goto die; + linkstat =3D interface_link_status(ifi->name); + if (linkstat !=3D ifi->linkstat) { + debug("%s link state %s -> %s", ifi->name, + ifi->linkstat ? "up" : "down", + linkstat ? "up" : "down"); + ifi->linkstat =3D linkstat; + if (linkstat) + state_reboot(ifi); } break; case RTM_IFANNOUNCE: @@ -321,8 +326,6 @@ =20 die: script_init("FAIL", NULL); =2D if (ifi->client->active) =2D script_write_params("old_", ifi->client->active); if (ifi->client->alias) script_write_params("alias_", ifi->client->alias); script_go(); @@ -437,6 +440,7 @@ } fprintf(stderr, " got link\n"); } + ifi->linkstat =3D 1; =20 if ((nullfd =3D open(_PATH_DEVNULL, O_RDWR, 0)) =3D=3D -1) error("cannot open %s: %m", _PATH_DEVNULL); =2D-=20 John Baldwin