arm/179532: wireless networking on ARM

Daan Vreeken Daan at vitsch.nl
Fri Jun 14 08:40:02 UTC 2013


The following reply was made to PR arm/179532; it has been noted by GNATS.

From: Daan Vreeken <Daan at vitsch.nl>
To: Guillaume Bibaut <yom at iaelu.net>
Cc: freebsd-arm at freebsd.org, freebsd-gnats-submit at freebsd.org,
        Adrian Chadd <adrian at freebsd.org>
Subject: Re: arm/179532: wireless networking on ARM
Date: Fri, 14 Jun 2013 10:33:51 +0200

 --Boundary-00=_vVtuRrItZym7Bc8
 Content-Type: text/plain;
   charset="iso-8859-1"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 Hi again,
 
 On Friday 14 June 2013 10:02:54 Daan Vreeken wrote:
 > Hi Guillaume,
 >
 > On Thursday 13 June 2013 11:40:44 Guillaume Bibaut wrote:
 > > >Number:         179532
 > > >Category:       arm
 > > >Synopsis:       wireless networking on ARM
 ...
 > > >Description:
 > >
 > > FreeBSD is crashing when wpa_supplicant is called upon boot on the Genesi
 > > Efika MX smartbook.
 ...
 
 > I think we might have hit this same bug at work and have a local patch that
 > fixes it. I'll see if I can dust it off and post a patch here. I believe it
 > was only a 3-line patch to if_run.c
 
 See the attachments. These patches fix two bugs:
 o A crash in if_run when using VNET in the kernel.
 o The correctness of the information passed to the radiotap code in if_run.
 
 I think the last patch may fix the crash you are seeing with if_run and 
 wpa_supplicant. If you only want to test that part, you just have to patch 
 if_run.c with the file 'if_run_2013_01_19_radiotap_fix_only.diff' .
 
 In case the attachments get mangled in the email, you can also download these 
 files from : http://www.vitsch.nl/pub_diffs/
 The following files should be attached to this email :
 	if_run_2013_01_19_radiotap_fix_only.diff
 	if_run_2013_01_19_vnet_fix.diff
 	if_run_2013_01_19_vnet_plus_radiotap_fix.diff
 
 All patches are:
 Sponsored by: Vitsch Electronics
 
 
 Regards,
 -- 
 Ing. Daan Vreeken
 Vitsch Electronics
 http://Vitsch.nl/
 http://VitschVPN.nl/
 tel: +31-(0)40-7113051
 KvK nr: 17174380
 --
 Machines en netwerken op afstand beheren? Vitsch VPN oplossing!
 Kijk voor meer informatie op: http://www.VitschVPN.nl/
 
 --Boundary-00=_vVtuRrItZym7Bc8
 Content-Type: text/x-diff;
   charset="iso-8859-1";
   name="if_run_2013_01_19_radiotap_fix_only.diff"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
 	filename="if_run_2013_01_19_radiotap_fix_only.diff"
 
 --- if_run.c.fix2_vnet_plus_radiotap	2013-06-14 10:15:34.890774314 +0200
 +++ if_run.c.fix1_vnet	2013-06-14 10:12:49.786774072 +0200
 @@ -2536,10 +2536,13 @@
  	m->m_pkthdr.rcvif = ifp;
  	m->m_pkthdr.len = m->m_len = len;
  
 -	/*
 -	 * DAAN: fill-in tap header BEFORE calling ieee80211_input*() so the
 -	 * user will see the actual data that belongs to THIS packet..
 -	 */
 +	if (ni != NULL) {
 +		(void)ieee80211_input(ni, m, rssi, nf);
 +		ieee80211_free_node(ni);
 +	} else {
 +		(void)ieee80211_input_all(ic, m, rssi, nf);
 +	}
 +
  	if (__predict_false(ieee80211_radiotap_active(ic))) {
  		struct run_rx_radiotap_header *tap = &sc->sc_rxtap;
  
 @@ -2576,13 +2579,6 @@
  			break;
  		}
  	}
 -
 -	if (ni != NULL) {
 -		(void)ieee80211_input(ni, m, rssi, nf);
 -		ieee80211_free_node(ni);
 -	} else {
 -		(void)ieee80211_input_all(ic, m, rssi, nf);
 -	}
  }
  
  static void
 
 --Boundary-00=_vVtuRrItZym7Bc8
 Content-Type: text/x-diff;
   charset="iso 8859-15";
   name="if_run_2013_01_19_vnet_fix.diff"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
 	filename="if_run_2013_01_19_vnet_fix.diff"
 
 Index: if_run.c
 ===================================================================
 --- if_run.c	(revision 251736)
 +++ if_run.c	(working copy)
 @@ -52,6 +52,7 @@
  #include <net/if_dl.h>
  #include <net/if_media.h>
  #include <net/if_types.h>
 +#include <net/vnet.h>
  
  #include <netinet/in.h>
  #include <netinet/in_systm.h>
 @@ -606,9 +607,12 @@
  
  	RUN_UNLOCK(sc);
  
 +	CURVNET_SET(vnet0);
 +
  	ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
  	if (ifp == NULL) {
  		device_printf(sc->sc_dev, "can not if_alloc()\n");
 +		CURVNET_RESTORE();
  		goto detach;
  	}
  	ic = ifp->if_l2com;
 @@ -702,6 +706,8 @@
  	if (bootverbose)
  		ieee80211_announce(ic);
  
 +	CURVNET_RESTORE();
 +
  	return (0);
  
  detach:
 @@ -739,8 +745,10 @@
  		usb_callout_drain(&sc->ratectl_ch);
  		ieee80211_draintask(ic, &sc->cmdq_task);
  		ieee80211_draintask(ic, &sc->ratectl_task);
 +		CURVNET_SET(ifp->if_vnet);
  		ieee80211_ifdetach(ic);
  		if_free(ifp);
 +		CURVNET_RESTORE();
  	}
  
  	mtx_destroy(&sc->sc_mtx);
 
 --Boundary-00=_vVtuRrItZym7Bc8
 Content-Type: text/x-diff;
   charset="iso 8859-15";
   name="if_run_2013_01_19_vnet_plus_radiotap_fix.diff"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
 	filename="if_run_2013_01_19_vnet_plus_radiotap_fix.diff"
 
 Index: if_run.c
 ===================================================================
 --- if_run.c	(revision 251736)
 +++ if_run.c	(working copy)
 @@ -52,6 +52,7 @@
  #include <net/if_dl.h>
  #include <net/if_media.h>
  #include <net/if_types.h>
 +#include <net/vnet.h>
  
  #include <netinet/in.h>
  #include <netinet/in_systm.h>
 @@ -606,9 +607,12 @@
  
  	RUN_UNLOCK(sc);
  
 +	CURVNET_SET(vnet0);
 +
  	ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
  	if (ifp == NULL) {
  		device_printf(sc->sc_dev, "can not if_alloc()\n");
 +		CURVNET_RESTORE();
  		goto detach;
  	}
  	ic = ifp->if_l2com;
 @@ -702,6 +706,8 @@
  	if (bootverbose)
  		ieee80211_announce(ic);
  
 +	CURVNET_RESTORE();
 +
  	return (0);
  
  detach:
 @@ -739,8 +745,10 @@
  		usb_callout_drain(&sc->ratectl_ch);
  		ieee80211_draintask(ic, &sc->cmdq_task);
  		ieee80211_draintask(ic, &sc->ratectl_task);
 +		CURVNET_SET(ifp->if_vnet);
  		ieee80211_ifdetach(ic);
  		if_free(ifp);
 +		CURVNET_RESTORE();
  	}
  
  	mtx_destroy(&sc->sc_mtx);
 @@ -2528,13 +2536,10 @@
  	m->m_pkthdr.rcvif = ifp;
  	m->m_pkthdr.len = m->m_len = len;
  
 -	if (ni != NULL) {
 -		(void)ieee80211_input(ni, m, rssi, nf);
 -		ieee80211_free_node(ni);
 -	} else {
 -		(void)ieee80211_input_all(ic, m, rssi, nf);
 -	}
 -
 +	/*
 +	 * DAAN: fill-in tap header BEFORE calling ieee80211_input*() so the
 +	 * user will see the actual data that belongs to THIS packet..
 +	 */
  	if (__predict_false(ieee80211_radiotap_active(ic))) {
  		struct run_rx_radiotap_header *tap = &sc->sc_rxtap;
  
 @@ -2571,6 +2576,13 @@
  			break;
  		}
  	}
 +
 +	if (ni != NULL) {
 +		(void)ieee80211_input(ni, m, rssi, nf);
 +		ieee80211_free_node(ni);
 +	} else {
 +		(void)ieee80211_input_all(ic, m, rssi, nf);
 +	}
  }
  
  static void
 
 --Boundary-00=_vVtuRrItZym7Bc8--


More information about the freebsd-arm mailing list