From owner-freebsd-bugs@FreeBSD.ORG Thu Apr 5 01:50:13 2012 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 452ED106566C for ; Thu, 5 Apr 2012 01:50:13 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 45A528FC0C for ; Thu, 5 Apr 2012 01:50:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id q351o1hI006255 for ; Thu, 5 Apr 2012 01:50:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id q351o1L8006254; Thu, 5 Apr 2012 01:50:01 GMT (envelope-from gnats) Resent-Date: Thu, 5 Apr 2012 01:50:01 GMT Resent-Message-Id: <201204050150.q351o1L8006254@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Peter Jeremy Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 68D13106566B for ; Thu, 5 Apr 2012 01:47:58 +0000 (UTC) (envelope-from peterjeremy@acm.org) Received: from mail34.syd.optusnet.com.au (mail34.syd.optusnet.com.au [211.29.133.218]) by mx1.freebsd.org (Postfix) with ESMTP id F2D618FC0A for ; Thu, 5 Apr 2012 01:47:57 +0000 (UTC) Received: from server.vk2pj.dyndns.org (c220-239-251-180.belrs5.nsw.optusnet.com.au [220.239.251.180]) by mail34.syd.optusnet.com.au (8.13.1/8.13.1) with ESMTP id q351lnXn031497 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 5 Apr 2012 11:47:50 +1000 Received: from server.vk2pj.dyndns.org (localhost.vk2pj.dyndns.org [127.0.0.1]) by server.vk2pj.dyndns.org (8.14.5/8.14.4) with ESMTP id q351lmsk075599; Thu, 5 Apr 2012 11:47:48 +1000 (EST) (envelope-from peter@server.vk2pj.dyndns.org) Received: (from peter@localhost) by server.vk2pj.dyndns.org (8.14.5/8.14.5/Submit) id q351llg8075598; Thu, 5 Apr 2012 11:47:47 +1000 (EST) (envelope-from peter) Message-Id: <201204050147.q351llg8075598@server.vk2pj.dyndns.org> Date: Thu, 5 Apr 2012 11:47:47 +1000 (EST) From: Peter Jeremy To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Cc: Subject: bin/166656: [patch] dhclient(8) doesn't exit os link down X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Peter Jeremy List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Apr 2012 01:50:13 -0000 >Number: 166656 >Category: bin >Synopsis: [patch] dhclient(8) doesn't exit os link down >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Thu Apr 05 01:50:00 UTC 2012 >Closed-Date: >Last-Modified: >Originator: Peter Jeremy >Release: FreeBSD 8.2-STABLE amd64 >Organization: >Environment: System: FreeBSD pjdesk.au.alcatel-lucent.com 8.2-STABLE FreeBSD 8.2-STABLE #9: Fri Feb 3 07:57:14 EST 2012 root@pjdesk.au.alcatel-lucent.com:/var/obj/usr/src/sys/pjdesk amd64 also tested on: FreeBSD C2B0004103.au.alcatel-lucent.com 10.0-CURRENT FreeBSD 10.0-CURRENT #20 r232545M: Tue Mar 6 06:58:47 EST 2012 root@C2B0004103.au.alcatel-lucent.com:/usr/obj/usr/src/sys/pjdesk amd64 >Description: /etc/devd.conf includes a rule to start dhclient when an Ethernet or 802.11 interface reports "link up", with a comment: "No link down rule exists because dhclient automatically exits when the link goes down." IMHO, this is the desired behaviour, unfortunately it's not the way dhclient actually behaves. In my experience, dhclient will exit when the interface goes down but ignores link status changes. Looking at the source, it seems to exit only when there's no usable route (by monitoring RTF_UP). dhclient does monitor the link status using SIOCGIFMEDIA but only at startup (it will exit if the link doesn't come up within 10s of dhclient starting) and during DHCP exchanges (if the link goes down when it's expecting a DHCP response then it exits). >How-To-Repeat: Start dhclient and verify a valid lease is obtained. Unplug network cable and verify that dhclient did not exit. >Fix: dhclient receives RTM_IFINFO messages on link change. Currently the code just monitors RTF_UP on link change. The attached patch adds a SIOCGIFMEDIA check when a RTM_IFINFO messages is received and exits if the link is now down. Index: dhclient.c =================================================================== --- dhclient.c (revision 232545) +++ dhclient.c (working copy) @@ -278,6 +278,11 @@ ifi->name); goto die; } + if (!interface_link_status(ifi->name)) { + warning("Link %s is down, dhclient exiting", + ifi->name); + goto die; + } break; case RTM_IFANNOUNCE: ifan = (struct if_announcemsghdr *)rtm; >Release-Note: >Audit-Trail: >Unformatted: