qca-wifi: Fix WDS header fields

Fix address fields in WDS case.

Change-Id: I0f94bcd42783a6840a714ca0f5541e7299de1d81
This commit is contained in:
Manoj Ekbote
2020-12-12 18:45:29 -08:00
parent 9a16bc08e5
commit 717a95065e

View File

@@ -63,6 +63,8 @@
#define DP_NOACK_STOKEN_POS_SHIFT (2)
#define DP_NDPA_TOKEN_POS (16)
#define IEEE80211_FC1_SHIFT (8)
/* Macros to handle sequence number bitmaps */
/* HW generated rts frame flag */
@@ -2281,12 +2283,27 @@ void dp_ppdu_desc_debug_print(struct cdp_tx_completion_ppdu *ppdu_desc,
static
void dp_peer_tx_wds_addr_add(struct dp_peer *peer, uint8_t *addr4_mac_addr)
{
struct ieee80211_frame_addr4 *ptr_wh;
struct ieee80211_frame_addr4 *ptr_wh = NULL;
struct dp_vdev *vdev = NULL;
if (!peer)
if (!peer) {
qdf_err("peer is NULL!");
return;
}
vdev = peer->vdev;
if (!vdev) {
qdf_err("vdev is NULL!");
return;
}
ptr_wh = &peer->tx_capture.tx_wifi_addr4_hdr;
qdf_mem_copy(ptr_wh->i_addr1,
peer->mac_addr.raw,
QDF_MAC_ADDR_SIZE);
qdf_mem_copy(ptr_wh->i_addr2,
vdev->mac_addr.raw,
QDF_MAC_ADDR_SIZE);
qdf_mem_copy(ptr_wh->i_addr4,
addr4_mac_addr,
QDF_MAC_ADDR_SIZE);
@@ -2309,7 +2326,7 @@ static uint32_t dp_tx_update_80211_wds_hdr(struct dp_pdev *pdev,
void *data,
qdf_nbuf_t nbuf,
uint16_t ether_type,
uint8_t *src_addr,
uint8_t *dst_addr,
uint8_t usr_idx)
{
struct cdp_tx_completion_ppdu *ppdu_desc;
@@ -2338,8 +2355,9 @@ static uint32_t dp_tx_update_80211_wds_hdr(struct dp_pdev *pdev,
ptr_wh->i_qos[1] = (user->qos_ctrl & 0xFF00) >> 8;
ptr_wh->i_qos[0] = (user->qos_ctrl & 0xFF);
/* Update Addr 3 (SA) with SA derived from ether packet */
qdf_mem_copy(ptr_wh->i_addr3, src_addr, QDF_MAC_ADDR_SIZE);
/* Update Addr 3 (DA) with DA derived from ether packet */
qdf_mem_copy(ptr_wh->i_addr3, dst_addr, QDF_MAC_ADDR_SIZE);
peer->tx_capture.tx_wifi_ppdu_id = ppdu_desc->ppdu_id;
}
@@ -2522,8 +2540,9 @@ dp_tx_mon_restitch_mpdu(struct dp_pdev *pdev, struct dp_peer *peer,
if ((qdf_likely((peer->vdev->tx_encap_type !=
htt_cmn_pkt_type_raw))) &&
((ppdu_desc->frame_ctrl & IEEE80211_FC1_DIR_MASK) &&
(IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_DIR_FROMDS)))
(((ppdu_desc->frame_ctrl >> IEEE80211_FC1_SHIFT) &
IEEE80211_FC1_DIR_MASK) ==
(IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_DIR_FROMDS)))
dp_peer_tx_wds_addr_add(peer, eh->ether_shost);
if (first_msdu && first_msdu_not_seen) {
@@ -2596,13 +2615,14 @@ dp_tx_mon_restitch_mpdu(struct dp_pdev *pdev, struct dp_peer *peer,
goto free_ppdu_desc_mpdu_q;
}
if (((ppdu_desc->frame_ctrl & IEEE80211_FC1_DIR_MASK) &&
if (((ppdu_desc->frame_ctrl >> IEEE80211_FC1_SHIFT) &
IEEE80211_FC1_DIR_MASK) ==
(IEEE80211_FC1_DIR_TODS |
IEEE80211_FC1_DIR_FROMDS))) {
IEEE80211_FC1_DIR_FROMDS)) {
dp_tx_update_80211_wds_hdr(pdev, peer,
ppdu_desc, mpdu_nbuf,
ether_type,
eh->ether_shost,
eh->ether_dhost,
usr_idx);
} else {
dp_tx_update_80211_hdr(pdev, peer,