Commit aa66fbb9 authored by Jes Sorensen's avatar Jes Sorensen Committed by Greg Kroah-Hartman

staging: rtl8723au: validate_recv_data_frame() use fctl knowledge to obtain bssid

Use the knowledge we already have from parsing the TODS/FROMDS bits in
hdr->frame_control to obtain the bssid.

Note that get_hdr_bssid() would never return NULL as handling 4
combinations of a 2 bit word leaves little space for falling through
to the 'default' value.
Signed-off-by: default avatarJes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5ca12b78
...@@ -1308,9 +1308,8 @@ static int validate_recv_data_frame(struct rtw_adapter *adapter, ...@@ -1308,9 +1308,8 @@ static int validate_recv_data_frame(struct rtw_adapter *adapter,
struct recv_frame *precv_frame) struct recv_frame *precv_frame)
{ {
u8 bretry; u8 bretry;
u8 *psa, *pda, *pbssid; u8 *psa, *pda;
struct sta_info *psta = NULL; struct sta_info *psta = NULL;
u8 *ptr = precv_frame->pkt->data;
struct rx_pkt_attrib *pattrib = & precv_frame->attrib; struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
struct security_priv *psecuritypriv = &adapter->securitypriv; struct security_priv *psecuritypriv = &adapter->securitypriv;
int ret = _SUCCESS; int ret = _SUCCESS;
...@@ -1322,39 +1321,39 @@ static int validate_recv_data_frame(struct rtw_adapter *adapter, ...@@ -1322,39 +1321,39 @@ static int validate_recv_data_frame(struct rtw_adapter *adapter,
bretry = ieee80211_has_retry(hdr->frame_control); bretry = ieee80211_has_retry(hdr->frame_control);
pda = ieee80211_get_DA(hdr); pda = ieee80211_get_DA(hdr);
psa = ieee80211_get_SA(hdr); psa = ieee80211_get_SA(hdr);
pbssid = get_hdr_bssid(ptr);
if (pbssid == NULL) {
ret = _FAIL;
goto exit;
}
ether_addr_copy(pattrib->dst, pda); ether_addr_copy(pattrib->dst, pda);
ether_addr_copy(pattrib->src, psa); ether_addr_copy(pattrib->src, psa);
ether_addr_copy(pattrib->bssid, pbssid);
switch (hdr->frame_control & switch (hdr->frame_control &
cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) { cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
case cpu_to_le16(0): case cpu_to_le16(0):
ether_addr_copy(pattrib->bssid, hdr->addr3);
ether_addr_copy(pattrib->ra, pda); ether_addr_copy(pattrib->ra, pda);
ether_addr_copy(pattrib->ta, psa); ether_addr_copy(pattrib->ta, psa);
ret = sta2sta_data_frame(adapter, precv_frame, &psta); ret = sta2sta_data_frame(adapter, precv_frame, &psta);
break; break;
case cpu_to_le16(IEEE80211_FCTL_FROMDS): case cpu_to_le16(IEEE80211_FCTL_FROMDS):
ether_addr_copy(pattrib->bssid, hdr->addr2);
ether_addr_copy(pattrib->ra, pda); ether_addr_copy(pattrib->ra, pda);
ether_addr_copy(pattrib->ta, pbssid); ether_addr_copy(pattrib->ta, hdr->addr2);
ret = ap2sta_data_frame(adapter, precv_frame, &psta); ret = ap2sta_data_frame(adapter, precv_frame, &psta);
break; break;
case cpu_to_le16(IEEE80211_FCTL_TODS): case cpu_to_le16(IEEE80211_FCTL_TODS):
ether_addr_copy(pattrib->ra, pbssid); ether_addr_copy(pattrib->bssid, hdr->addr1);
ether_addr_copy(pattrib->ra, hdr->addr1);
ether_addr_copy(pattrib->ta, psa); ether_addr_copy(pattrib->ta, psa);
ret = sta2ap_data_frame(adapter, precv_frame, &psta); ret = sta2ap_data_frame(adapter, precv_frame, &psta);
break; break;
case cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS): case cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS):
/*
* There is no BSSID in this case, but the driver has been
* using addr1 so far, so keep it for now.
*/
ether_addr_copy(pattrib->bssid, hdr->addr1);
ether_addr_copy(pattrib->ra, hdr->addr1); ether_addr_copy(pattrib->ra, hdr->addr1);
ether_addr_copy(pattrib->ta, hdr->addr2); ether_addr_copy(pattrib->ta, hdr->addr2);
ret = _FAIL; ret = _FAIL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment