From owner-freebsd-wireless@FreeBSD.ORG Tue Nov 5 22:19:31 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id EDA65A58; Tue, 5 Nov 2013 22:19:31 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from bigwig.baldwin.cx (bigwig.baldwin.cx [IPv6:2001:470:1f11:75::1]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id A7F4A2BA3; Tue, 5 Nov 2013 22:19:31 +0000 (UTC) Received: from jhbbsd.localnet (unknown [209.249.190.124]) by bigwig.baldwin.cx (Postfix) with ESMTPSA id 4D992B98F; Tue, 5 Nov 2013 17:19:30 -0500 (EST) From: John Baldwin To: Bernhard Schmidt Subject: Re: service netif restart [iface] runs a wpa_supplicant twice Date: Tue, 5 Nov 2013 17:17:30 -0500 User-Agent: KMail/1.13.5 (FreeBSD/8.4-CBSD-20130906; KDE/4.5.5; amd64; ; ) References: <1382572583.1862.39.camel@eva02.mbsd> <201311051154.18872.jhb@freebsd.org> In-Reply-To: MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201311051717.30519.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.7 (bigwig.baldwin.cx); Tue, 05 Nov 2013 17:19:30 -0500 (EST) Cc: clutton , "freebsd-wireless@freebsd.org" , freebsd-arch@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 05 Nov 2013 22:19:32 -0000 On Tuesday, November 05, 2013 2:33:50 pm Bernhard Schmidt wrote: > On Tue, Nov 5, 2013 at 5:54 PM, John Baldwin wrote: > > On Sunday, November 03, 2013 12:56:08 pm Adrian Chadd wrote: > >> On 2 November 2013 12:13, clutton wrote: > >> > >> [snip] > >> > >> > What was happened? netif tries to setup wlan0 (clone, wpa, dhcp, etc), > >> > when wlan0 interface occurs, devd runs another copy of netif. > >> > >> Well, it sounds like we need to pick an architecture _and_ fix the > >> behaviour here. > >> > >> Which is: > >> > >> > >> * I think wpa-supplicant should always run if it's required in /etc/rc.conf; > >> * netif should check if devd is configured and if so, just leave the > >> configuration up to devd > >> * if it isn't running, then devd should be responsible for > >> dhclient/add-to-wpa-config > >> > >> What we first have to establish is whether add_interface and > >> remove_interface (or whatever they're called) are correctly working, > >> for ethernet and wifi driver types. Then, we need to ensure they can > >> coexist (ie, one wpa_supplicant, but with both ethernet/wifi drivers > >> loaded and active on their relevant interfaces.) _then_ we can break > >> out the "stuff devd does" out of netif and have _either_ netif (x)or > >> devd call this new script to setup/teardown the interface runtime > >> state. > >> > >> How's that sound? > > > > Note that devd just runs netif (via /etc/pccard_ether), so it's already > > just one script, and having netif bail if devd is running would make > > netif not do anything in the common case. > > > > What normally happens during boot is that '/etc/rc.d/netif start' creates > > wlan0 and runs wpa_supplicant via 'childif_create' making a nested call to > > ifn_start for wlan0. That is, childif_create autoruns /etc/rc.d/netif > > explicitly after it creates the device. Probably that is what should be > > removed. That would let devd always start wpa_supplicant via > > /etc/pccard_ether. I've just tested this by doing a stop/start on iwn0 > > (parent of wlan0, so wlan0 gets destroyed and re-created) and it started > > wpa_supplicant correctly. > > > > Index: head/etc/network.subr > > =================================================================== > > --- network.subr (revision 257705) > > +++ network.subr (working copy) > > @@ -1429,9 +1429,6 @@ childif_create() > > fi > > ${IFCONFIG_CMD} $i name $child && cfg=0 > > fi > > - if autoif $child; then > > - ifn_start $child > > - fi > > done > > > > # Create vlan interfaces > > > > I also tested vlans created via vlans_ and they should use the same fix as > > well. Note that this model is more consistent with how cloned_interfaces > > works where ifn_start is not explicitly run when each interface is created. > > Instead, we rely on devd kicking off pccard_ether for those as well. > > That looks sane too me. > > Just one question, I remember that devd is disabled during boot and > activated later through a sysctl (to ignore events entirely), is this > the case before or after netif is running? I guess it is activated > after netif, otherwise we would have seen this issue on booting and > not just during netif restart. Hmm, devd starts after netif, but it just worked fine for me when I booted up. I also misspoke about cloned_interfaces. We manually add the cloned_interface list to the list of interfaces /etc/rc.d/netif iterates over. What I am puzzled by is that this just worked for me during a test boot. Hmm, it looks like devctl is no longer disabled during boot and then explicitly enabled by devd. devctl is now always enabled during boot, but capped at 1000 entries to avoid leaking memory. In fact, it looks like devd tries to recreate a few interfaces after netif finishes and is generally confused. I tried again with devd_flags set to "-n" to flush the initial set of events on boot. This removed the multiple calls to netif on boot on my laptop, but somehow wpa_supplicant is still being started by devd (and I'm not sure how now). Maybe we should bring back the ifn_start calls, but only do them if devd is not running (i.e. during boot) as Adrian suggested? -- John Baldwin