svn commit: r184480 - in head/sys: dev/ath net80211

Sam Leffler sam at FreeBSD.org
Thu Oct 30 09:22:04 PDT 2008


Author: sam
Date: Thu Oct 30 16:22:04 2008
New Revision: 184480
URL: http://svn.freebsd.org/changeset/base/184480

Log:
  Fix checks for fast frames negotiation.  ni_ath_flags holds the
  capabilities reported by the ap.  These need to be cross-checked
  against the local configuration in the vap.  Previously we were
  only checking the ap capabilities which meant that if an ap reported
  it was ff-capable but we were not setup to use them we'd try to do
  ff aggregation and drop the frame.
  
  There are a number of problems to be fixed here but applying this
  fix immediately as the problem causes all traffic to stop (and has
  not workaround).
  
  Reported by:	Ashish Shukla

Modified:
  head/sys/dev/ath/if_ath.c
  head/sys/net80211/ieee80211_adhoc.c
  head/sys/net80211/ieee80211_hostap.c
  head/sys/net80211/ieee80211_sta.c
  head/sys/net80211/ieee80211_wds.c

Modified: head/sys/dev/ath/if_ath.c
==============================================================================
--- head/sys/dev/ath/if_ath.c	Thu Oct 30 16:20:42 2008	(r184479)
+++ head/sys/dev/ath/if_ath.c	Thu Oct 30 16:22:04 2008	(r184480)
@@ -1999,7 +1999,7 @@ ath_start(struct ifnet *ifp)
 		ni = (struct ieee80211_node *) m->m_pkthdr.rcvif;
 		pri = M_WME_GETAC(m);
 		txq = sc->sc_ac2q[pri];
-		if (ni->ni_ath_flags & IEEE80211_NODE_FF) {
+		if (IEEE80211_ATH_CAP(ni->ni_vap, ni, IEEE80211_NODE_FF)) {
 			/*
 			 * Check queue length; if too deep drop this
 			 * frame (tail drop considered good).

Modified: head/sys/net80211/ieee80211_adhoc.c
==============================================================================
--- head/sys/net80211/ieee80211_adhoc.c	Thu Oct 30 16:20:42 2008	(r184479)
+++ head/sys/net80211/ieee80211_adhoc.c	Thu Oct 30 16:22:04 2008	(r184480)
@@ -553,7 +553,7 @@ adhoc_input(struct ieee80211_node *ni, s
 			m = ieee80211_decap_amsdu(ni, m);
 			if (m == NULL)
 				return IEEE80211_FC0_TYPE_DATA;
-		} else if ((ni->ni_ath_flags & IEEE80211_NODE_FF) &&
+		} else if (IEEE80211_ATH_CAP(vap, ni, IEEE80211_NODE_FF) &&
 #define	FF_LLC_SIZE	(sizeof(struct ether_header) + sizeof(struct llc))
 		    m->m_pkthdr.len >= 3*FF_LLC_SIZE) {
 			struct llc *llc;

Modified: head/sys/net80211/ieee80211_hostap.c
==============================================================================
--- head/sys/net80211/ieee80211_hostap.c	Thu Oct 30 16:20:42 2008	(r184479)
+++ head/sys/net80211/ieee80211_hostap.c	Thu Oct 30 16:22:04 2008	(r184480)
@@ -752,7 +752,7 @@ hostap_input(struct ieee80211_node *ni, 
 			m = ieee80211_decap_amsdu(ni, m);
 			if (m == NULL)
 				return IEEE80211_FC0_TYPE_DATA;
-		} else if ((ni->ni_ath_flags & IEEE80211_NODE_FF) &&
+		} else if (IEEE80211_ATH_CAP(vap, ni, IEEE80211_NODE_FF) &&
 #define	FF_LLC_SIZE	(sizeof(struct ether_header) + sizeof(struct llc))
 		    m->m_pkthdr.len >= 3*FF_LLC_SIZE) {
 			struct llc *llc;

Modified: head/sys/net80211/ieee80211_sta.c
==============================================================================
--- head/sys/net80211/ieee80211_sta.c	Thu Oct 30 16:20:42 2008	(r184479)
+++ head/sys/net80211/ieee80211_sta.c	Thu Oct 30 16:22:04 2008	(r184480)
@@ -795,7 +795,7 @@ sta_input(struct ieee80211_node *ni, str
 			m = ieee80211_decap_amsdu(ni, m);
 			if (m == NULL)
 				return IEEE80211_FC0_TYPE_DATA;
-		} else if ((ni->ni_ath_flags & IEEE80211_NODE_FF) &&
+		} else if (IEEE80211_ATH_CAP(vap, ni, IEEE80211_NODE_FF) &&
 #define	FF_LLC_SIZE	(sizeof(struct ether_header) + sizeof(struct llc))
 		    m->m_pkthdr.len >= 3*FF_LLC_SIZE) {
 			struct llc *llc;

Modified: head/sys/net80211/ieee80211_wds.c
==============================================================================
--- head/sys/net80211/ieee80211_wds.c	Thu Oct 30 16:20:42 2008	(r184479)
+++ head/sys/net80211/ieee80211_wds.c	Thu Oct 30 16:22:04 2008	(r184480)
@@ -728,7 +728,7 @@ wds_input(struct ieee80211_node *ni, str
 			m = ieee80211_decap_amsdu(ni, m);
 			if (m == NULL)
 				return IEEE80211_FC0_TYPE_DATA;
-		} else if ((ni->ni_ath_flags & IEEE80211_NODE_FF) &&
+		} else if (IEEE80211_ATH_CAP(vap, ni, IEEE80211_NODE_FF) &&
 #define	FF_LLC_SIZE	(sizeof(struct ether_header) + sizeof(struct llc))
 		    m->m_pkthdr.len >= 3*FF_LLC_SIZE) {
 			struct llc *llc;


More information about the svn-src-head mailing list