Commit 99ba2a14 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

mac80211: implement packet loss notification

For drivers that have accurate TX status reporting
we can report the number of consecutive lost packets
to userspace using the new cfg80211 CQM event. The
threshold is fixed right now, this may need to be
improved in the future.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c063dbf5
...@@ -248,6 +248,7 @@ enum plink_state { ...@@ -248,6 +248,7 @@ enum plink_state {
* @sta: station information we share with the driver * @sta: station information we share with the driver
* @dead: set to true when sta is unlinked * @dead: set to true when sta is unlinked
* @uploaded: set to true when sta is uploaded to the driver * @uploaded: set to true when sta is uploaded to the driver
* @lost_packets: number of consecutive lost packets
*/ */
struct sta_info { struct sta_info {
/* General information, mostly static */ /* General information, mostly static */
...@@ -335,6 +336,8 @@ struct sta_info { ...@@ -335,6 +336,8 @@ struct sta_info {
} debugfs; } debugfs;
#endif #endif
unsigned int lost_packets;
/* keep last! */ /* keep last! */
struct ieee80211_sta sta; struct ieee80211_sta sta;
}; };
......
...@@ -161,6 +161,15 @@ static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb) ...@@ -161,6 +161,15 @@ static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb)
ieee80211_sta_tx_notify(sdata, (void *) skb->data); ieee80211_sta_tx_notify(sdata, (void *) skb->data);
} }
/*
* Use a static threshold for now, best value to be determined
* by testing ...
* Should it depend on:
* - on # of retransmissions
* - current throughput (higher value for higher tpt)?
*/
#define STA_LOST_PKT_THRESHOLD 50
void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
{ {
struct sk_buff *skb2; struct sk_buff *skb2;
...@@ -247,6 +256,19 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) ...@@ -247,6 +256,19 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && if (!(info->flags & IEEE80211_TX_CTL_INJECTED) &&
(info->flags & IEEE80211_TX_STAT_ACK)) (info->flags & IEEE80211_TX_STAT_ACK))
ieee80211_frame_acked(sta, skb); ieee80211_frame_acked(sta, skb);
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) {
if (info->flags & IEEE80211_TX_STAT_ACK) {
if (sta->lost_packets)
sta->lost_packets = 0;
} else if (++sta->lost_packets >= STA_LOST_PKT_THRESHOLD) {
cfg80211_cqm_pktloss_notify(sta->sdata->dev,
sta->sta.addr,
sta->lost_packets,
GFP_ATOMIC);
sta->lost_packets = 0;
}
}
} }
rcu_read_unlock(); rcu_read_unlock();
......
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