All pastes #1058153 Raw Edit

Something

public diff v1 · immutable
#1058153 ·published 2008-06-29 13:34 UTC
rendered paste body
>From 305e13812d8f90c0622dc17814b83ca1a843a7c1 Mon Sep 17 00:00:00 2001From: =?utf-8?q?Stefanik=20G=C3=A1bor?= <netrolller.3d@gmail.com>Date: Wed, 25 Jun 2008 17:16:54 +0800Subject: [PATCH] iwlwifi: Fix packet injection in iwl3945 and iwl4965MIME-Version: 1.0Content-Type: text/plain; charset=utf-8Content-Transfer-Encoding: 8bitThis patch fixes packet injection on iwlwifi devices (iwl3945 andiwl4965). Tested with packetspammer and aireplay-ng.Signed-off-by: Gbor Stefanik <netrolller.3d@gmail.com>Signed-off-by: Zhu Yi <yi.zhu@intel.com>--- drivers/net/wireless/iwlwifi/iwl-sta.c      |    5 +++++ drivers/net/wireless/iwlwifi/iwl-tx.c       |   12 ++++-------- drivers/net/wireless/iwlwifi/iwl3945-base.c |   22 +++++++++------------- drivers/net/wireless/iwlwifi/iwl4965-base.c |    5 ----- 4 files changed, 18 insertions(+), 26 deletions(-)diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.cindex 6d1467d..78b1315 100644--- a/drivers/net/wireless/iwlwifi/iwl-sta.c+++ b/drivers/net/wireless/iwlwifi/iwl-sta.c@@ -968,6 +968,11 @@ int iwl_get_sta_id(struct iwl_priv *priv, struct ieee80211_hdr *hdr) 		iwl_print_hex_dump(priv, IWL_DL_DROP, (u8 *) hdr, sizeof(*hdr)); 		return priv->hw_params.bcast_sta_id; +	/* If we are in monitor mode, use BCAST. This is required for+	 * packet injection. */+	case IEEE80211_IF_TYPE_MNTR:+		return priv->hw_params.bcast_sta_id;+ 	default: 		IWL_WARNING("Unknown mode of operation: %d", priv->iw_mode); 		return priv->hw_params.bcast_sta_id;diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.cindex 032641d..d930d71 100644--- a/drivers/net/wireless/iwlwifi/iwl-tx.c+++ b/drivers/net/wireless/iwlwifi/iwl-tx.c@@ -783,11 +783,6 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) 		goto drop_unlock; 	} -	if (!priv->vif) {-		IWL_DEBUG_DROP("Dropping - !priv->vif\n");-		goto drop_unlock;-	}- 	if ((ieee80211_get_tx_rate(priv->hw, info)->hw_value & 0xFF) == 	     IWL_INVALID_RATE) { 		IWL_ERROR("ERROR: No TX rate available.\n");@@ -810,9 +805,10 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)  	/* drop all data frame if we are not associated */ 	if (ieee80211_is_data(fc) &&-	   (!iwl_is_associated(priv) ||-	    ((priv->iw_mode == IEEE80211_IF_TYPE_STA) && !priv->assoc_id) ||-	    !priv->assoc_station_added)) {+	    (!priv->vif) && /* packet injection */+	    (!iwl_is_associated(priv) ||+	     ((priv->iw_mode == IEEE80211_IF_TYPE_STA) && !priv->assoc_id) ||+	     !priv->assoc_station_added)) { 		IWL_DEBUG_DROP("Dropping - !iwl_is_associated\n"); 		goto drop_unlock; 	}diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.cindex 80f8e0a..12e8f50 100644--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c@@ -2539,6 +2539,11 @@ static int iwl3945_get_sta_id(struct iwl3945_priv *priv, struct ieee80211_hdr *h 		iwl3945_print_hex_dump(IWL_DL_DROP, (u8 *) hdr, sizeof(*hdr)); 		return priv->hw_setting.bcast_sta_id; 	}+	/* If we are in monitor mode, use BCAST. This is required for+	 * packet injection. */+	case IEEE80211_IF_TYPE_MNTR:+		return priv->hw_setting.bcast_sta_id;+ 	default: 		IWL_WARNING("Unknown mode of operation: %d", priv->iw_mode); 		return priv->hw_setting.bcast_sta_id;@@ -2578,11 +2583,6 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb) 		goto drop_unlock; 	} -	if (!priv->vif) {-		IWL_DEBUG_DROP("Dropping - !priv->vif\n");-		goto drop_unlock;-	}- 	if ((ieee80211_get_tx_rate(priv->hw, info)->hw_value & 0xFF) == IWL_INVALID_RATE) { 		IWL_ERROR("ERROR: No TX rate available.\n"); 		goto drop_unlock;@@ -2603,9 +2603,10 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb) #endif  	/* drop all data frame if we are not associated */-	if ((!iwl3945_is_associated(priv) ||-	     ((priv->iw_mode == IEEE80211_IF_TYPE_STA) && !priv->assoc_id)) &&-	    ieee80211_is_data(fc)) {+	if (ieee80211_is_data(fc) &&+	    (!priv->vif) && /* packet injection */+	    (!iwl3945_is_associated(priv) ||+	     ((priv->iw_mode == IEEE80211_IF_TYPE_STA) && !priv->assoc_id))) { 		IWL_DEBUG_DROP("Dropping - !iwl3945_is_associated\n"); 		goto drop_unlock; 	}@@ -6693,11 +6694,6 @@ static int iwl3945_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)  	IWL_DEBUG_MAC80211("enter\n"); -	if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) {-		IWL_DEBUG_MAC80211("leave - monitor\n");-		return -1;-	}- 	IWL_DEBUG_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len, 		     ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.cindex 953a80f..a4de564 100644--- a/drivers/net/wireless/iwlwifi/iwl4965-base.c+++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c@@ -2680,11 +2680,6 @@ static int iwl4965_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)  	IWL_DEBUG_MAC80211("enter\n"); -	if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) {-		IWL_DEBUG_MAC80211("leave - monitor\n");-		return -1;-	}- 	IWL_DEBUG_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len, 		     ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); -- 1.5.3.6