From owner-svn-src-user@FreeBSD.ORG Thu Apr 30 02:26:04 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1AAFC1065672; Thu, 30 Apr 2009 02:26:04 +0000 (UTC) (envelope-from thompsa@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 08D7C8FC08; Thu, 30 Apr 2009 02:26:04 +0000 (UTC) (envelope-from thompsa@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n3U2Q33I099134; Thu, 30 Apr 2009 02:26:03 GMT (envelope-from thompsa@svn.freebsd.org) Received: (from thompsa@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n3U2Q38S099132; Thu, 30 Apr 2009 02:26:03 GMT (envelope-from thompsa@svn.freebsd.org) Message-Id: <200904300226.n3U2Q38S099132@svn.freebsd.org> From: Andrew Thompson Date: Thu, 30 Apr 2009 02:26:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r191679 - user/thompsa/vaptq/sys/net80211 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Apr 2009 02:26:04 -0000 Author: thompsa Date: Thu Apr 30 02:26:03 2009 New Revision: 191679 URL: http://svn.freebsd.org/changeset/base/191679 Log: - Comparing iv_state to iv_nstate is insufficient for determining if the state taskq as run since the new state can be overridden in the handler. Add a IEEE80211_FEXT_STATEWAIT flag to track the pending state change. Likewise do not compare iv_state to iv_nstate to verify the handler succeeded, just check the return code. - Assert that iv_newstate() can not be deferred again or fail for INIT Modified: user/thompsa/vaptq/sys/net80211/ieee80211_proto.c user/thompsa/vaptq/sys/net80211/ieee80211_var.h Modified: user/thompsa/vaptq/sys/net80211/ieee80211_proto.c ============================================================================== --- user/thompsa/vaptq/sys/net80211/ieee80211_proto.c Thu Apr 30 02:21:24 2009 (r191678) +++ user/thompsa/vaptq/sys/net80211/ieee80211_proto.c Thu Apr 30 02:26:03 2009 (r191679) @@ -1604,7 +1604,8 @@ ieee80211_newstate_cb_locked(struct ieee IEEE80211_LOCK_ASSERT(ic); IEEE80211_DPRINTF(vap, IEEE80211_MSG_STATE, - "%s: %s arg %d\n", __func__, ieee80211_state_name[nstate], arg); + "%s: %s -> %s arg %d\n", __func__, + ieee80211_state_name[ostate], ieee80211_state_name[nstate], arg); if (nstate == IEEE80211_S_SCAN && ostate != IEEE80211_S_INIT) { /* @@ -1620,11 +1621,15 @@ ieee80211_newstate_cb_locked(struct ieee } rc = vap->iv_newstate(vap, nstate, arg); - if (rc != 0 || vap->iv_state != nstate) { - if (rc == EINPROGRESS) - if_printf(ic->ic_ifp, - "Warning, iv_newstate was deferred again\n"); + vap->iv_flags_ext &= ~IEEE80211_FEXT_STATEWAIT; + if (rc != 0) { /* State transition failed */ + KASSERT(rc != EINPROGRESS, ("iv_newstate was deferred")); + KASSERT(nstate != IEEE80211_S_INIT, + ("INIT state change failed")); + IEEE80211_DPRINTF(vap, IEEE80211_MSG_STATE, + "%s: %s returned error %d\n", __func__, + ieee80211_state_name[nstate], rc); return (rc); } @@ -1699,7 +1704,7 @@ ieee80211_new_state_locked(struct ieee80 IEEE80211_LOCK_ASSERT(ic); - if (vap->iv_state != vap->iv_nstate) { + if (vap->iv_flags_ext & IEEE80211_FEXT_STATEWAIT) { if (vap->iv_nstate == IEEE80211_S_INIT) { /* * XXX The vap is being stopped, do no allow any other @@ -1821,6 +1826,7 @@ ieee80211_new_state_locked(struct ieee80 /* defer the state change to a thread */ vap->iv_nstate = nstate; vap->iv_nstate_arg = arg; + vap->iv_flags_ext |= IEEE80211_FEXT_STATEWAIT; ieee80211_runtask(ic, &vap->iv_nstate_task); return (EINPROGRESS); } Modified: user/thompsa/vaptq/sys/net80211/ieee80211_var.h ============================================================================== --- user/thompsa/vaptq/sys/net80211/ieee80211_var.h Thu Apr 30 02:21:24 2009 (r191678) +++ user/thompsa/vaptq/sys/net80211/ieee80211_var.h Thu Apr 30 02:26:03 2009 (r191679) @@ -529,12 +529,13 @@ MALLOC_DECLARE(M_80211_VAP); #define IEEE80211_FEXT_SHORTGI40 0x08000000 /* CONF: short GI in HT40 */ #define IEEE80211_FEXT_HTCOMPAT 0x10000000 /* CONF: HT vendor OUI's */ #define IEEE80211_FEXT_RIFS 0x20000000 /* CONF: RIFS enabled */ +#define IEEE80211_FEXT_STATEWAIT 0x40000000 /* STATUS: awaiting state chg */ #define IEEE80211_FEXT_BITS \ "\20\1NONHT_PR\2INACT\3SCANWAIT\4BGSCAN\5WPS\6TSN\7SCANREQ\10RESUME" \ "\12NONEPR_PR\13SWBMISS\14DFS\15DOTD\22WDSLEGACY\23PROBECHAN\24HT" \ "\25AMDPU_TX\26AMPDU_TX\27AMSDU_TX\30AMSDU_RX\31USEHT40\32PUREN" \ - "\33SHORTGI20\34SHORTGI40\35HTCOMPAT\36RIFS" + "\33SHORTGI20\34SHORTGI40\35HTCOMPAT\36RIFS\37STATEWAIT" #define IEEE80211_FVEN_BITS "\20"