PERFORCE change 66752 for review

Sam Leffler sam at FreeBSD.org
Thu Dec 9 15:18:02 PST 2004


http://perforce.freebsd.org/chv.cgi?CH=66752

Change 66752 by sam at sam_ebb on 2004/12/09 23:17:37

	Fix WME+WPA operation.  Atheros parts mark IEEE80211_F_DATAPAD
	which forces 32-bit alignment of the crypto payload but the
	cipher encap support wasn't taking the pad bytes into account.
	This didn't matter until QoS data frames were encrypted and
	required padding.
	o add ieee80211_hdrspace and ieee80211_anyhdrspace that work
	  like ieee80211_hdrsize and ieee80211_anyhdrsize but consider
	  padding requirements
	o sprinkle use of the above in the tx cipher paths (not need
	  currently on rx because the QoS and pad bits are stripped
	  early in ieee80211_input; this is likely to change)
	
	Also: make some inline's be __inline for portability.

Affected files ...

.. //depot/projects/wifi/sys/net80211/ieee80211_crypto_ccmp.c#3 edit
.. //depot/projects/wifi/sys/net80211/ieee80211_crypto_tkip.c#4 edit
.. //depot/projects/wifi/sys/net80211/ieee80211_crypto_wep.c#3 edit
.. //depot/projects/wifi/sys/net80211/ieee80211_proto.h#10 edit
.. //depot/projects/wifi/sys/net80211/ieee80211_var.h#19 edit

Differences ...

==== //depot/projects/wifi/sys/net80211/ieee80211_crypto_ccmp.c#3 (text+ko) ====

@@ -136,10 +136,12 @@
 static int
 ccmp_encap(struct ieee80211_key *k, struct mbuf *m, u_int8_t keyid)
 {
+	struct ccmp_ctx *ctx = k->wk_private;
+	struct ieee80211com *ic = ctx->cc_ic;
 	u_int8_t *ivp;
 	int hdrlen;
 
-	hdrlen = ieee80211_hdrsize(mtod(m, void *));
+	hdrlen = ieee80211_hdrspace(ic, mtod(m, void *));
 
 	/*
 	 * Copy down 802.11 header and add the IV, KeyID, and ExtIV.

==== //depot/projects/wifi/sys/net80211/ieee80211_crypto_tkip.c#4 (text+ko) ====

@@ -171,7 +171,7 @@
 		ic->ic_stats.is_crypto_tkipcm++;
 		return 0;
 	}
-	hdrlen = ieee80211_hdrsize(mtod(m, void *));
+	hdrlen = ieee80211_hdrspace(ic, mtod(m, void *));
 
 	/*
 	 * Copy down 802.11 header and add the IV, KeyID, and ExtIV.
@@ -215,10 +215,13 @@
 
 	if (k->wk_flags & IEEE80211_KEY_SWMIC) {
 		struct ieee80211_frame *wh = mtod(m, struct ieee80211_frame *);
-		int hdrlen = ieee80211_hdrsize(wh);
+		struct ieee80211com *ic = ctx->tc_ic;
+		int hdrlen;
 		uint8_t mic[IEEE80211_WEP_MICLEN];
 
-		ctx->tc_ic->ic_stats.is_crypto_tkipenmic++;
+		ic->ic_stats.is_crypto_tkipenmic++;
+
+		hdrlen = ieee80211_hdrspace(ic, wh);
 
 		michael_mic(ctx, k->wk_txmic,
 			m, hdrlen, m->m_pkthdr.len - hdrlen, mic);

==== //depot/projects/wifi/sys/net80211/ieee80211_crypto_wep.c#3 (text+ko) ====

@@ -120,11 +120,12 @@
 wep_encap(struct ieee80211_key *k, struct mbuf *m, u_int8_t keyid)
 {
 	struct wep_ctx *ctx = k->wk_private;
+	struct ieee80211com *ic = ctx->wc_ic;
 	u_int32_t iv;
 	u_int8_t *ivp;
 	int hdrlen;
 
-	hdrlen = ieee80211_hdrsize(mtod(m, void *));
+	hdrlen = ieee80211_hdrspace(ic, mtod(m, void *));
 
 	/*
 	 * Copy down 802.11 header and add the IV + KeyID.

==== //depot/projects/wifi/sys/net80211/ieee80211_proto.h#10 (text+ko) ====

@@ -81,7 +81,7 @@
 /*
  * Return the size of the 802.11 header for a management or data frame.
  */
-static inline int
+static __inline int
 ieee80211_hdrsize(const void *data)
 {
 	const struct ieee80211_frame *wh = data;
@@ -98,9 +98,9 @@
 }
 
 /*
- * Return the size of the 802.11 header; handles any type of frame.
+ * Like ieee80211_hdrsize, but handles any type of frame.
  */
-static inline int
+static __inline int
 ieee80211_anyhdrsize(const void *data)
 {
 	const struct ieee80211_frame *wh = data;

==== //depot/projects/wifi/sys/net80211/ieee80211_var.h#19 (text+ko) ====

@@ -282,6 +282,36 @@
 	ic->ic_crypto.cs_key_update_end(ic);
 }
 
+/*
+ * XXX these need to be here for IEEE80211_F_DATAPAD
+ */
+
+/*
+ * Return the space occupied by the 802.11 header and any
+ * padding required by the driver.  This works for a
+ * management or data frame.
+ */
+static __inline int
+ieee80211_hdrspace(struct ieee80211com *ic, const void *data)
+{
+	int size = ieee80211_hdrsize(data);
+	if (ic->ic_flags & IEEE80211_F_DATAPAD)
+		size = roundup(size, sizeof(u_int32_t));
+	return size;
+}
+
+/*
+ * Like ieee80211_hdrspace, but handles any type of frame.
+ */
+static __inline int
+ieee80211_anyhdrspace(struct ieee80211com *ic, const void *data)
+{
+	int size = ieee80211_anyhdrsize(data);
+	if (ic->ic_flags & IEEE80211_F_DATAPAD)
+		size = roundup(size, sizeof(u_int32_t));
+	return size;
+}
+
 #define	IEEE80211_MSG_DEBUG	0x40000000	/* IFF_DEBUG equivalent */
 #define	IEEE80211_MSG_DUMPPKTS	0x20000000	/* IFF_LINK2 equivalant */
 #define	IEEE80211_MSG_CRYPTO	0x10000000	/* crypto work */


More information about the p4-projects mailing list