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