mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
mac80211: support A-MPDU status reporting
Support getting A-MPDU status information from the drivers and reporting it to userspace via radiotap in the standard fields. Signed-off-by: Johannes Berg <[email protected]>
This commit is contained in:
parent
48613ece3d
commit
4c29867790
2 changed files with 80 additions and 15 deletions
|
|
@ -60,7 +60,9 @@ static inline int should_drop_frame(struct sk_buff *skb,
|
|||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
|
||||
if (status->flag & (RX_FLAG_FAILED_FCS_CRC | RX_FLAG_FAILED_PLCP_CRC))
|
||||
if (status->flag & (RX_FLAG_FAILED_FCS_CRC |
|
||||
RX_FLAG_FAILED_PLCP_CRC |
|
||||
RX_FLAG_AMPDU_IS_ZEROLEN))
|
||||
return 1;
|
||||
if (unlikely(skb->len < 16 + present_fcs_len))
|
||||
return 1;
|
||||
|
|
@ -91,6 +93,13 @@ ieee80211_rx_radiotap_len(struct ieee80211_local *local,
|
|||
if (status->flag & RX_FLAG_HT) /* HT info */
|
||||
len += 3;
|
||||
|
||||
if (status->flag & RX_FLAG_AMPDU_DETAILS) {
|
||||
/* padding */
|
||||
while (len & 3)
|
||||
len++;
|
||||
len += 8;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
|
|
@ -215,6 +224,37 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
|
|||
pos++;
|
||||
*pos++ = status->rate_idx;
|
||||
}
|
||||
|
||||
if (status->flag & RX_FLAG_AMPDU_DETAILS) {
|
||||
u16 flags = 0;
|
||||
|
||||
/* ensure 4 byte alignment */
|
||||
while ((pos - (u8 *)rthdr) & 3)
|
||||
pos++;
|
||||
rthdr->it_present |=
|
||||
cpu_to_le32(1 << IEEE80211_RADIOTAP_AMPDU_STATUS);
|
||||
put_unaligned_le32(status->ampdu_reference, pos);
|
||||
pos += 4;
|
||||
if (status->flag & RX_FLAG_AMPDU_REPORT_ZEROLEN)
|
||||
flags |= IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN;
|
||||
if (status->flag & RX_FLAG_AMPDU_IS_ZEROLEN)
|
||||
flags |= IEEE80211_RADIOTAP_AMPDU_IS_ZEROLEN;
|
||||
if (status->flag & RX_FLAG_AMPDU_LAST_KNOWN)
|
||||
flags |= IEEE80211_RADIOTAP_AMPDU_LAST_KNOWN;
|
||||
if (status->flag & RX_FLAG_AMPDU_IS_LAST)
|
||||
flags |= IEEE80211_RADIOTAP_AMPDU_IS_LAST;
|
||||
if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_ERROR)
|
||||
flags |= IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR;
|
||||
if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_KNOWN)
|
||||
flags |= IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN;
|
||||
put_unaligned_le16(flags, pos);
|
||||
pos += 2;
|
||||
if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_KNOWN)
|
||||
*pos++ = status->ampdu_delimiter_crc;
|
||||
else
|
||||
*pos++ = 0;
|
||||
*pos++ = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue