svn commit: r193452 - projects/mesh11s/sys/net80211

Sam Leffler sam at FreeBSD.org
Thu Jun 4 18:31:13 UTC 2009


Author: sam
Date: Thu Jun  4 18:31:12 2009
New Revision: 193452
URL: http://svn.freebsd.org/changeset/base/193452

Log:
  avoid IEEE80211_F_DATAPAD as it requires hardware understanding of 11s
  headers, for now we will have to use s/w crypto; this fixes data frame
  crashes with ath caused by ieee80211_decap copying data over the stack
  due to hdr size being rounded for datapad requirements
  
  Reviewed by:	rpaulo

Modified:
  projects/mesh11s/sys/net80211/ieee80211_mesh.c
  projects/mesh11s/sys/net80211/ieee80211_output.c

Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.c	Thu Jun  4 18:27:53 2009	(r193451)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c	Thu Jun  4 18:31:12 2009	(r193452)
@@ -232,7 +232,7 @@ mesh_input(struct ieee80211_node *ni, st
 	struct ieee80211com *ic = ni->ni_ic;
 	struct ifnet *ifp = vap->iv_ifp;
 	struct ieee80211_frame *wh;
-	int hdrspace, need_tap;
+	int hdrlen, need_tap;
 	uint8_t dir, type, subtype, qos;
 
 	KASSERT(ni != NULL, ("null node"));
@@ -282,13 +282,14 @@ mesh_input(struct ieee80211_node *ni, st
 			    "peer link not yet established (%s)",
 			    nodemeshstates[ni->ni_mlstate]);
 		}	
-		hdrspace = ieee80211_hdrspace(ic, wh)
+		/* NB: not ieee80211_hdrspace, datapad is not honored */
+		hdrlen = ieee80211_hdrsize(wh)
 		    + sizeof(struct ieee80211_meshcntl);
-		if (m->m_len < hdrspace &&
-		    (m = m_pullup(m, hdrspace)) == NULL) {
+		if (m->m_len < hdrlen &&
+		    (m = m_pullup(m, hdrlen)) == NULL) {
 			IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
 			    ni->ni_macaddr, NULL,
-			    "data too short: expecting %u", hdrspace);
+			    "data too short: expecting %u", hdrlen);
 			vap->iv_stats.is_rx_tooshort++;
 			goto out;		/* XXX */
 		}
@@ -311,7 +312,7 @@ mesh_input(struct ieee80211_node *ni, st
 		 * Next up, any fragmentation.
 		 */
 		if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
-			m = ieee80211_defrag(ni, m, hdrspace);
+			m = ieee80211_defrag(ni, m, hdrlen);
 			if (m == NULL) {
 				/* Fragment dropped or frame not complete yet */
 				goto out;
@@ -324,7 +325,7 @@ mesh_input(struct ieee80211_node *ni, st
 		/*
 		 * Finally, strip the 802.11 header.
 		 */
-		m = ieee80211_decap(vap, m, hdrspace);
+		m = ieee80211_decap(vap, m, hdrlen);
 		if (m == NULL) {
 			/* XXX mask bit to check for both */
 			/* don't count Null data frames as errors */

Modified: projects/mesh11s/sys/net80211/ieee80211_output.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_output.c	Thu Jun  4 18:27:53 2009	(r193451)
+++ projects/mesh11s/sys/net80211/ieee80211_output.c	Thu Jun  4 18:31:12 2009	(r193452)
@@ -1282,18 +1282,24 @@ ieee80211_encap(struct ieee80211vap *vap
 	     !IEEE80211_ADDR_EQ(eh.ether_shost, vap->iv_myaddr));
 	if (is4addr)
 		hdrsize += IEEE80211_ADDR_LEN;
-	/*
-	 * All Mesh data frames have a Mesh Control field.
-	 */
-	if (vap->iv_opmode == IEEE80211_M_MBSS)
+	if (vap->iv_opmode == IEEE80211_M_MBSS) {
+		/*
+		 * Mesh data frames have a Mesh Control field.
+		 * XXX also cannot honor DATAPAD as this is used by
+		 * hardware and that hardware does not (yet) understand
+		 * 11s headers so will be confused.
+		 */
 		hdrsize += sizeof(struct ieee80211_meshcntl);
-	/*
-	 * Honor driver DATAPAD requirement.
-	 */
-	if (ic->ic_flags & IEEE80211_F_DATAPAD)
-		hdrspace = roundup(hdrsize, sizeof(uint32_t));
-	else
 		hdrspace = hdrsize;
+	} else {
+		/*
+		 * Honor driver DATAPAD requirement.
+		 */
+		if (ic->ic_flags & IEEE80211_F_DATAPAD)
+			hdrspace = roundup(hdrsize, sizeof(uint32_t));
+		else
+			hdrspace = hdrsize;
+	}
 
 	if (__predict_true((m->m_flags & M_FF) == 0)) {
 		/*


More information about the svn-src-projects mailing list