Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 21 Jun 2014 03:40:32 -0700
From:      John-Mark Gurney <jmg@funkthat.com>
To:        John Baldwin <jhb@freebsd.org>
Cc:        rpaulo@freebsd.org, freebsd-arch@freebsd.org
Subject:   Re: conflict between netif and pccard_ether...
Message-ID:  <20140621104031.GM31367@funkthat.com>
In-Reply-To: <201406190917.16458.jhb@freebsd.org>
References:  <20140618231318.GH31367@funkthat.com> <201406190917.16458.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--mhjHhnbe5PrRcwjY
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

John Baldwin wrote this message on Thu, Jun 19, 2014 at 09:17 -0400:
> On Wednesday, June 18, 2014 7:13:18 pm John-Mark Gurney wrote:
> > So, I recently was trying to figure out why wireless on my notebook
> > wouldn't work..  I would boot up the machine w/o the wireless
> > configured, uncomment the lines in rc.conf, and then run
> > "service netif start"...
> > 
> > Wireless would associate, but when disconnect... After some
> > investigation, it turns out that two copies of wpa_supplicant are
> > being launched... I believe one from netif, and another from
> > pccard_ether launched by devd...
> > 
> > The issue is that both netif and pccard_ether "claim" ownership of
> > them.  pccard_ether will ignore the ifconfig_ line if NOAUTO is
> > specified.  IMO, we need to make one or the other "own" configuring
> > and launching the interface...
> > 
> > There is also the issue that wpa_sup doesn't use proper locking on
> > the pidfile and allows two copies to be launched...  My thoughts
> > is to convert it to pidfile to fix this issue the easiest...
> 
> I think this is actually the best fix.  dhclient handles this correctly for 
> this reason.
> 
> > Comments?  Suggestions?
> 
> We had a thread a few months ago about this very topic and I committed changes 
> to the rc.d scripts that I then had to revert because it broke other use 
> cases.  Having the redundant start be harmless is the simplest way to handle 
> this.

Ok, I converted wpa_supplicant to use pidfile(3), and it successfully
fixes the issue I had... I get the error that wpa_supplicant is already
running... It looks like in my case, devd was beating out netif in
launching wpa_sup...

I've attached the patch...

-- 
  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."

--mhjHhnbe5PrRcwjY
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="wpa.diff"

diff --git a/contrib/wpa/src/utils/os_unix.c b/contrib/wpa/src/utils/os_unix.c
index 23a93be..7a779f6 100644
--- a/contrib/wpa/src/utils/os_unix.c
+++ b/contrib/wpa/src/utils/os_unix.c
@@ -153,23 +153,34 @@ static int os_daemon(int nochdir, int noclose)
 #endif /* __APPLE__ */
 
 
+#include <err.h>
+#include <libutil.h>
+#include <stdint.h>
+
 int os_daemonize(const char *pid_file)
 {
 #if defined(__uClinux__) || defined(__sun__)
 	return -1;
 #else /* defined(__uClinux__) || defined(__sun__) */
+	pid_t otherpid;
+	struct pidfh *pfh;
+
+	pfh = pidfile_open(pid_file, 0600, &otherpid);
+	if (pfh == NULL) {
+		if (errno == EEXIST) {
+			errx(1, "Daemon already running, pid: %jd.",
+			    (intmax_t)otherpid);
+		}
+		warn("Cannot open or create pidfile.");
+	}
+
 	if (os_daemon(0, 0)) {
 		perror("daemon");
+		pidfile_remove(pfh);
 		return -1;
 	}
 
-	if (pid_file) {
-		FILE *f = fopen(pid_file, "w");
-		if (f) {
-			fprintf(f, "%u\n", getpid());
-			fclose(f);
-		}
-	}
+	pidfile_write(pfh);
 
 	return -0;
 #endif /* defined(__uClinux__) || defined(__sun__) */
diff --git a/usr.sbin/wpa/wpa_supplicant/Makefile b/usr.sbin/wpa/wpa_supplicant/Makefile
index 11cccf3..673a04d 100644
--- a/usr.sbin/wpa/wpa_supplicant/Makefile
+++ b/usr.sbin/wpa/wpa_supplicant/Makefile
@@ -49,8 +49,8 @@ CFLAGS+=-DCONFIG_BACKEND_FILE \
 	-DCONFIG_GAS \
 	-DPKCS12_FUNCS
 #CFLAGS+= -g
-DPADD+=	${LIBPCAP}
-LDADD+=	-lpcap
+DPADD+=	${LIBPCAP} ${LIBUTIL}
+LDADD+=	-lpcap -lutil
 
 # User customizations to the wpa_supplicant build environment
 CFLAGS+=${WPA_SUPPLICANT_CFLAGS}

--mhjHhnbe5PrRcwjY--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20140621104031.GM31367>