On Tue, Aug 21, 2012 at 05:25:23PM -0400, John Baldwin wrote:

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

Assign address on interface manualy cause exiting dhcpclient?

> 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)
> @@ -208,6 +208,7 @@
>       int                      errors;
>       int                      dead;
>       u_int16_t                index;
> +     int                      linkstat;
>  };
>  
>  struct timeout {
> Index: dhclient.c
> ===================================================================
> --- dhclient.c        (revision 239498)
> +++ dhclient.c        (working copy)
> @@ -218,6 +218,7 @@
>       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 @@
>                           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 @@
>  
>  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 @@
>               }
>               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 Baldwin
> _______________________________________________
> freebsd-current@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to