On Fri, 2012-08-17 at 15:53 +0000, John Baldwin wrote:
> Author: jhb
> Date: Fri Aug 17 15:53:43 2012
> New Revision: 239356
> URL: http://svn.freebsd.org/changeset/base/239356
> 
> Log:
>   Fix dhclient to properly exit and teardown the configured lease when
>   link is lost.  devd will start a new dhclient instance when link is
>   restored.
>   
>   PR:         bin/166656
>   Submitted by:       Peter Jeremy (mostly)
>   Reviewed by:        brooks (earlier version from Peter)
>   MFC after:  1 month
> 
> Modified:
>   head/sbin/dhclient/dhclient.c
> 
> Modified: head/sbin/dhclient/dhclient.c
> ==============================================================================
> --- head/sbin/dhclient/dhclient.c     Fri Aug 17 14:22:56 2012        
> (r239355)
> +++ head/sbin/dhclient/dhclient.c     Fri Aug 17 15:53:43 2012        
> (r239356)
> @@ -278,6 +278,11 @@ 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;
> +             }
>               break;
>       case RTM_IFANNOUNCE:
>               ifan = (struct if_announcemsghdr *)rtm;
> @@ -316,6 +321,8 @@ 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();

I think the attached patch should give the same result without needing
to create/destroy a socket to check the link status every time a routing
info message arrives.  I've actually had this patch in my head for
several years, I just hadn't gotten around to submitting it yet.

-- Ian

diff -r 6cb112d8486e sbin/dhclient/dhclient.c
--- a/sbin/dhclient/dhclient.c	Mon Aug 13 15:06:09 2012 -0600
+++ b/sbin/dhclient/dhclient.c	Fri Aug 17 10:48:02 2012 -0600
@@ -273,7 +273,7 @@ routehandler(struct protocol *p)
 		ifm = (struct if_msghdr *)rtm;
 		if (ifm->ifm_index != ifi->index)
 			break;
-		if ((rtm->rtm_flags & RTF_UP) == 0) {
+		if (ifm->ifm_data.ifi_link_state != LINK_STATE_UP) {
 			warning("Interface %s is down, dhclient exiting",
 			    ifi->name);
 			goto die;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to