staging: rtl8723au: Do not xmit BSS Coexistence management action frames

The driver should not be issuing BSS Coexistence management action
frames when scanning. This isn't required by the spec, and if needed,
these should come from wpa_s instead.

Recommended by Johannes Berg.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Jes Sorensen
2014-06-09 15:16:16 +02:00
committed by Greg Kroah-Hartman
parent 85d5120d52
commit 372713a942

View File

@@ -4174,140 +4174,6 @@ void issue_action_BA23a(struct rtw_adapter *padapter,
dump_mgntframe23a(padapter, pmgntframe);
}
static void issue_action_BSSCoexistPacket(struct rtw_adapter *padapter)
{
struct list_head *plist, *phead, *ptmp;
struct xmit_frame *pmgntframe;
struct pkt_attrib *pattrib;
u8 *pframe;
struct ieee80211_mgmt *mgmt;
struct wlan_network *pnetwork;
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
struct rtw_queue *queue = &pmlmepriv->scanned_queue;
u8 InfoContent[16] = {0};
u8 ICS[8][15];
int i;
if (pmlmepriv->num_FortyMHzIntolerant == 0 ||
pmlmepriv->num_sta_no_ht == 0)
return;
if (pmlmeinfo->bwmode_updated)
return;
DBG_8723A("%s\n", __func__);
pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
if (!pmgntframe)
return;
/* update attribute */
pattrib = &pmgntframe->attrib;
update_mgntframe_attrib23a(padapter, pattrib);
memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
pframe = (u8 *)pmgntframe->buf_addr + TXDESC_OFFSET;
mgmt = (struct ieee80211_mgmt *)pframe;
mgmt->frame_control =
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);
ether_addr_copy(mgmt->da, get_my_bssid23a(&pmlmeinfo->network));
ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
ether_addr_copy(mgmt->bssid, get_my_bssid23a(&pmlmeinfo->network));
mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
pmlmeext->mgnt_seq++;
mgmt->u.action.category = WLAN_CATEGORY_PUBLIC;
/*
* This is cheating, but as there is currently no coexist_action
* defined in struct struct ieee80211_mgmt, abuse chan_switch
* for now, since it matches.
*/
mgmt->u.action.u.chan_switch.action_code = ACT_PUBLIC_BSSCOEXIST;
pframe = mgmt->u.action.u.chan_switch.variable;
pattrib->pktlen = offsetof(struct ieee80211_mgmt,
u.action.u.chan_switch.variable);
if (pmlmepriv->num_FortyMHzIntolerant > 0) {
u8 iedata = BIT(2);/* 20 MHz BSS Width Request */
pframe = rtw_set_ie23a(pframe, WLAN_EID_BSS_COEX_2040, 1,
&iedata, &pattrib->pktlen);
}
if (pmlmepriv->num_sta_no_ht <= 0)
goto out;
memset(ICS, 0, sizeof(ICS));
spin_lock_bh(&pmlmepriv->scanned_queue.lock);
phead = get_list_head(queue);
plist = phead->next;
list_for_each_safe(plist, ptmp, phead) {
const u8 *p;
struct wlan_bssid_ex *pbss_network;
pnetwork = container_of(plist, struct wlan_network, list);
pbss_network = &pnetwork->network;
p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY,
pbss_network->IEs + _FIXED_IE_LENGTH_,
pbss_network->IELength -_FIXED_IE_LENGTH_);
if (!p || !p[1]) { /* non-HT */
if (pbss_network->DSConfig <= 0 ||
pbss_network->DSConfig > 14)
continue;
ICS[0][pbss_network->DSConfig] = 1;
if (ICS[0][0] == 0)
ICS[0][0] = 1;
}
}
spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
for (i = 0; i < 8;i++) {
if (ICS[i][0] == 1) {
int j, k = 0;
InfoContent[k] = i;
/* SET_BSS_INTOLERANT_ELE_REG_CLASS(InfoContent, i); */
k++;
for (j = 1; j <= 14; j++) {
if (ICS[i][j] == 1) {
if (k < 16) {
/* channel number */
InfoContent[k] = j;
k++;
}
}
}
pframe = rtw_set_ie23a(pframe,
EID_BSSIntolerantChlReport, k,
InfoContent, &pattrib->pktlen);
}
}
out:
pattrib->last_txcmdsz = pattrib->pktlen;
dump_mgntframe23a(padapter, pmgntframe);
}
int send_delba23a(struct rtw_adapter *padapter, u8 initiator, u8 *addr)
{
struct sta_priv *pstapriv = &padapter->stapriv;
@@ -4485,10 +4351,6 @@ static void rtw_site_survey(struct rtw_adapter *padapter)
pmlmeext->chan_scan_time = SURVEY_TO;
pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
issue_action_BSSCoexistPacket(padapter);
issue_action_BSSCoexistPacket(padapter);
issue_action_BSSCoexistPacket(padapter);
}
return;