Re: r239356: does it mean,

看板FB_current作者時間13年前 (2012/08/22 05:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串21/28 (看更多)
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 _______________________________________________ freebsd-current@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-current To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org"
文章代碼(AID): #1GC_vIFc (FB_current)
討論串 (同標題文章)
文章代碼(AID): #1GC_vIFc (FB_current)