aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2010-05-12 06:33:12 -0400
committerReinette Chatre <reinette.chatre@intel.com>2010-06-06 02:14:23 -0400
commit3a0b9aad0a8166e9fb23d420fdc08ee2820d4c39 (patch)
treece483eae4ab981f5b24645b791c71a0f94d07643
parent7684c4083114e0f0cc02f3a7cbef27b1e29381cd (diff)
iwlwifi: use virtual interface address for scan
For probe request frames sent during scan, we should use the virtual interface's mac address that the scan was initiated on to avoid issues when the wrong address is used. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-lib.c4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-scan.c4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c4
4 files changed, 9 insertions, 5 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
index 57c122d4d806..42e62191f9f6 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
@@ -1462,13 +1462,15 @@ void iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
1462 if (!priv->is_internal_short_scan) { 1462 if (!priv->is_internal_short_scan) {
1463 cmd_len = iwl_fill_probe_req(priv, 1463 cmd_len = iwl_fill_probe_req(priv,
1464 (struct ieee80211_mgmt *)scan->data, 1464 (struct ieee80211_mgmt *)scan->data,
1465 vif->addr,
1465 priv->scan_request->ie, 1466 priv->scan_request->ie,
1466 priv->scan_request->ie_len, 1467 priv->scan_request->ie_len,
1467 IWL_MAX_SCAN_SIZE - sizeof(*scan)); 1468 IWL_MAX_SCAN_SIZE - sizeof(*scan));
1468 } else { 1469 } else {
1470 /* use bcast addr, will not be transmitted but must be valid */
1469 cmd_len = iwl_fill_probe_req(priv, 1471 cmd_len = iwl_fill_probe_req(priv,
1470 (struct ieee80211_mgmt *)scan->data, 1472 (struct ieee80211_mgmt *)scan->data,
1471 NULL, 0, 1473 iwl_bcast_addr, NULL, 0,
1472 IWL_MAX_SCAN_SIZE - sizeof(*scan)); 1474 IWL_MAX_SCAN_SIZE - sizeof(*scan));
1473 1475
1474 } 1476 }
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index d3b61dc2c43e..69738f1e5416 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -524,7 +524,7 @@ void iwl_bg_start_internal_scan(struct work_struct *work);
524void iwl_internal_short_hw_scan(struct iwl_priv *priv); 524void iwl_internal_short_hw_scan(struct iwl_priv *priv);
525int iwl_force_reset(struct iwl_priv *priv, int mode); 525int iwl_force_reset(struct iwl_priv *priv, int mode);
526u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame, 526u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
527 const u8 *ie, int ie_len, int left); 527 const u8 *ta, const u8 *ie, int ie_len, int left);
528void iwl_setup_rx_scan_handlers(struct iwl_priv *priv); 528void iwl_setup_rx_scan_handlers(struct iwl_priv *priv);
529u16 iwl_get_active_dwell_time(struct iwl_priv *priv, 529u16 iwl_get_active_dwell_time(struct iwl_priv *priv,
530 enum ieee80211_band band, 530 enum ieee80211_band band,
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
index 5d3f51ff2f0d..0f9cbc23b339 100644
--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
+++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
@@ -438,7 +438,7 @@ EXPORT_SYMBOL(iwl_bg_scan_check);
438 */ 438 */
439 439
440u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame, 440u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
441 const u8 *ies, int ie_len, int left) 441 const u8 *ta, const u8 *ies, int ie_len, int left)
442{ 442{
443 int len = 0; 443 int len = 0;
444 u8 *pos = NULL; 444 u8 *pos = NULL;
@@ -451,7 +451,7 @@ u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
451 451
452 frame->frame_control = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); 452 frame->frame_control = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ);
453 memcpy(frame->da, iwl_bcast_addr, ETH_ALEN); 453 memcpy(frame->da, iwl_bcast_addr, ETH_ALEN);
454 memcpy(frame->sa, priv->mac_addr, ETH_ALEN); 454 memcpy(frame->sa, ta, ETH_ALEN);
455 memcpy(frame->bssid, iwl_bcast_addr, ETH_ALEN); 455 memcpy(frame->bssid, iwl_bcast_addr, ETH_ALEN);
456 frame->seq_ctrl = 0; 456 frame->seq_ctrl = 0;
457 457
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index 5976166cb92d..35471cfc7de0 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -2967,14 +2967,16 @@ void iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
2967 scan->tx_cmd.len = cpu_to_le16( 2967 scan->tx_cmd.len = cpu_to_le16(
2968 iwl_fill_probe_req(priv, 2968 iwl_fill_probe_req(priv,
2969 (struct ieee80211_mgmt *)scan->data, 2969 (struct ieee80211_mgmt *)scan->data,
2970 vif->addr,
2970 priv->scan_request->ie, 2971 priv->scan_request->ie,
2971 priv->scan_request->ie_len, 2972 priv->scan_request->ie_len,
2972 IWL_MAX_SCAN_SIZE - sizeof(*scan))); 2973 IWL_MAX_SCAN_SIZE - sizeof(*scan)));
2973 } else { 2974 } else {
2975 /* use bcast addr, will not be transmitted but must be valid */
2974 scan->tx_cmd.len = cpu_to_le16( 2976 scan->tx_cmd.len = cpu_to_le16(
2975 iwl_fill_probe_req(priv, 2977 iwl_fill_probe_req(priv,
2976 (struct ieee80211_mgmt *)scan->data, 2978 (struct ieee80211_mgmt *)scan->data,
2977 NULL, 0, 2979 iwl_bcast_addr, NULL, 0,
2978 IWL_MAX_SCAN_SIZE - sizeof(*scan))); 2980 IWL_MAX_SCAN_SIZE - sizeof(*scan)));
2979 } 2981 }
2980 /* select Rx antennas */ 2982 /* select Rx antennas */