Author: weongyo
Date: Sat Apr 17 23:48:07 2010
New Revision: 206780
URL: http://svn.freebsd.org/changeset/base/206780

Log:
  MFC r205140:
    fixes a broken software beacon miss handler.  There is a race to check
    vap->iv_bmiss_count == 0 in ieee80211_swbmiss because iv_swbmiss_task
    is enqueued by taskqueue.
  
    Reviewed by:  rpaulo

Modified:
  stable/8/sys/net80211/ieee80211_proto.c
  stable/8/sys/net80211/ieee80211_sta.c
  stable/8/sys/net80211/ieee80211_tdma.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/dev/uath/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/net80211/ieee80211_proto.c
==============================================================================
--- stable/8/sys/net80211/ieee80211_proto.c     Sat Apr 17 23:14:06 2010        
(r206779)
+++ stable/8/sys/net80211/ieee80211_proto.c     Sat Apr 17 23:48:07 2010        
(r206780)
@@ -1432,8 +1432,6 @@ ieee80211_swbmiss(void *arg)
        } else if (vap->iv_swbmiss_count == 0) {
                if (vap->iv_bmiss != NULL)
                        ieee80211_runtask(ic, &vap->iv_swbmiss_task);
-               if (vap->iv_bmiss_count == 0)   /* don't re-arm timer */
-                       return;
        } else
                vap->iv_swbmiss_count = 0;
        callout_reset(&vap->iv_swbmiss, vap->iv_swbmiss_period,

Modified: stable/8/sys/net80211/ieee80211_sta.c
==============================================================================
--- stable/8/sys/net80211/ieee80211_sta.c       Sat Apr 17 23:14:06 2010        
(r206779)
+++ stable/8/sys/net80211/ieee80211_sta.c       Sat Apr 17 23:48:07 2010        
(r206780)
@@ -141,6 +141,8 @@ sta_beacon_miss(struct ieee80211vap *vap
                        vap->iv_bss->ni_essid, vap->iv_bss->ni_esslen);
                return;
        }
+
+       callout_stop(&vap->iv_swbmiss);
        vap->iv_bmiss_count = 0;
        vap->iv_stats.is_beacon_miss++;
        if (vap->iv_roaming == IEEE80211_ROAMING_AUTO) {

Modified: stable/8/sys/net80211/ieee80211_tdma.c
==============================================================================
--- stable/8/sys/net80211/ieee80211_tdma.c      Sat Apr 17 23:14:06 2010        
(r206779)
+++ stable/8/sys/net80211/ieee80211_tdma.c      Sat Apr 17 23:48:07 2010        
(r206780)
@@ -295,6 +295,8 @@ tdma_beacon_miss(struct ieee80211vap *va
                "beacon miss, mode %u state %s\n",
                vap->iv_opmode, ieee80211_state_name[vap->iv_state]);
 
+       callout_stop(&vap->iv_swbmiss);
+
        if (ts->tdma_peer != NULL) {    /* XXX? can this be null? */
                ieee80211_notify_node_leave(vap->iv_bss);
                ts->tdma_peer = NULL;
_______________________________________________
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