Search Linux Wireless

[PATCH] mac80211: pass station instead of address to update_tkip_key

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When a TKIP key is updated, we should pass the station
pointer instead of just the address, since drivers can
use that to store their own data.

Signed-off-by: Johannes Berg <johannes@xxxxxxxxxxxxxxxx>
---
 drivers/net/wireless/b43/main.c        |   10 +++++++---
 drivers/net/wireless/iwlwifi/iwl-agn.c |    7 +++++--
 include/net/mac80211.h                 |    5 +++--
 net/mac80211/driver-ops.h              |    7 ++++---
 net/mac80211/driver-trace.h            |   10 +++++-----
 net/mac80211/tkip.c                    |    9 +--------
 6 files changed, 25 insertions(+), 23 deletions(-)

--- wireless-testing.orig/drivers/net/wireless/b43/main.c	2010-01-16 20:18:14.000000000 +0100
+++ wireless-testing/drivers/net/wireless/b43/main.c	2010-01-19 14:20:57.000000000 +0100
@@ -844,8 +844,9 @@ static void rx_tkip_phase1_write(struct 
 }
 
 static void b43_op_update_tkip_key(struct ieee80211_hw *hw,
-			struct ieee80211_key_conf *keyconf, const u8 *addr,
-			u32 iv32, u16 *phase1key)
+				   struct ieee80211_key_conf *keyconf,
+				   struct ieee80211_sta *sta,
+				   u32 iv32, u16 *phase1key)
 {
 	struct b43_wl *wl = hw_to_b43_wl(hw);
 	struct b43_wldev *dev;
@@ -863,7 +864,10 @@ static void b43_op_update_tkip_key(struc
 	keymac_write(dev, index, NULL);	/* First zero out mac to avoid race */
 
 	rx_tkip_phase1_write(dev, index, iv32, phase1key);
-	keymac_write(dev, index, addr);
+	/* only pairwise TKIP keys are supported right now */
+	if (WARN_ON(!sta))
+		goto out_unlock;
+	keymac_write(dev, index, sta->addr);
 
 out_unlock:
 	mutex_unlock(&wl->mutex);
--- wireless-testing.orig/drivers/net/wireless/iwlwifi/iwl-agn.c	2010-01-16 20:18:16.000000000 +0100
+++ wireless-testing/drivers/net/wireless/iwlwifi/iwl-agn.c	2010-01-19 14:20:57.000000000 +0100
@@ -2839,14 +2839,17 @@ void iwl_config_ap(struct iwl_priv *priv
 }
 
 static void iwl_mac_update_tkip_key(struct ieee80211_hw *hw,
-			struct ieee80211_key_conf *keyconf, const u8 *addr,
+			struct ieee80211_key_conf *keyconf,
+			struct ieee80211_sta *sta,
 			u32 iv32, u16 *phase1key)
 {
 
 	struct iwl_priv *priv = hw->priv;
 	IWL_DEBUG_MAC80211(priv, "enter\n");
 
-	iwl_update_tkip_key(priv, keyconf, addr, iv32, phase1key);
+	iwl_update_tkip_key(priv, keyconf,
+			    sta ? sta->addr : iwl_bcast_addr,
+			    iv32, phase1key);
 
 	IWL_DEBUG_MAC80211(priv, "leave\n");
 }
--- wireless-testing.orig/include/net/mac80211.h	2010-01-17 15:36:27.000000000 +0100
+++ wireless-testing/include/net/mac80211.h	2010-01-19 14:20:57.000000000 +0100
@@ -1618,8 +1618,9 @@ struct ieee80211_ops {
 		       struct ieee80211_vif *vif, struct ieee80211_sta *sta,
 		       struct ieee80211_key_conf *key);
 	void (*update_tkip_key)(struct ieee80211_hw *hw,
-			struct ieee80211_key_conf *conf, const u8 *address,
-			u32 iv32, u16 *phase1key);
+				struct ieee80211_key_conf *conf,
+				struct ieee80211_sta *sta,
+				u32 iv32, u16 *phase1key);
 	int (*hw_scan)(struct ieee80211_hw *hw,
 		       struct cfg80211_scan_request *req);
 	void (*sw_scan_start)(struct ieee80211_hw *hw);
--- wireless-testing.orig/net/mac80211/driver-ops.h	2010-01-16 20:18:21.000000000 +0100
+++ wireless-testing/net/mac80211/driver-ops.h	2010-01-19 14:20:57.000000000 +0100
@@ -138,15 +138,16 @@ static inline int drv_set_key(struct iee
 
 static inline void drv_update_tkip_key(struct ieee80211_local *local,
 				       struct ieee80211_key_conf *conf,
-				       const u8 *address, u32 iv32,
+				       struct sta_info *sta, u32 iv32,
 				       u16 *phase1key)
 {
 	might_sleep();
 
 	if (local->ops->update_tkip_key)
-		local->ops->update_tkip_key(&local->hw, conf, address,
+		local->ops->update_tkip_key(&local->hw, conf,
+					    sta ? &sta->sta : NULL,
 					    iv32, phase1key);
-	trace_drv_update_tkip_key(local, conf, address, iv32);
+	trace_drv_update_tkip_key(local, conf, sta, iv32);
 }
 
 static inline int drv_hw_scan(struct ieee80211_local *local,
--- wireless-testing.orig/net/mac80211/driver-trace.h	2010-01-16 20:18:21.000000000 +0100
+++ wireless-testing/net/mac80211/driver-trace.h	2010-01-19 14:20:57.000000000 +0100
@@ -332,25 +332,25 @@ TRACE_EVENT(drv_set_key,
 TRACE_EVENT(drv_update_tkip_key,
 	TP_PROTO(struct ieee80211_local *local,
 		 struct ieee80211_key_conf *conf,
-		 const u8 *address, u32 iv32),
+		 struct sta_info *sta, u32 iv32),
 
 	TP_ARGS(local, conf, address, iv32),
 
 	TP_STRUCT__entry(
 		LOCAL_ENTRY
-		__array(u8, addr, 6)
+		STA_ENTRY
 		__field(u32, iv32)
 	),
 
 	TP_fast_assign(
 		LOCAL_ASSIGN;
-		memcpy(__entry->addr, address, 6);
+		STA_ASSIGN;
 		__entry->iv32 = iv32;
 	),
 
 	TP_printk(
-		LOCAL_PR_FMT " addr:%pM iv32:%#x",
-		LOCAL_PR_ARG, __entry->addr, __entry->iv32
+		LOCAL_PR_FMT STA_PR_FMT " iv32:%#x",
+		LOCAL_PR_ARG,STA_PR_ARG, __entry->iv32
 	)
 );
 
--- wireless-testing.orig/net/mac80211/tkip.c	2010-01-16 20:19:10.000000000 +0100
+++ wireless-testing/net/mac80211/tkip.c	2010-01-19 14:20:57.000000000 +0100
@@ -304,14 +304,7 @@ int ieee80211_tkip_decrypt_data(struct c
 	if (key->local->ops->update_tkip_key &&
 	    key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
 	    key->u.tkip.rx[queue].state != TKIP_STATE_PHASE1_HW_UPLOADED) {
-		static const u8 bcast[ETH_ALEN] =
-		{0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-		const u8 *sta_addr = key->sta->sta.addr;
-
-		if (is_multicast_ether_addr(ra))
-			sta_addr = bcast;
-
-		drv_update_tkip_key(key->local, &key->conf, sta_addr,
+		drv_update_tkip_key(key->local, &key->conf, key->sta,
 				iv32, key->u.tkip.rx[queue].p1k);
 		key->u.tkip.rx[queue].state = TKIP_STATE_PHASE1_HW_UPLOADED;
 	}


--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux