diff options
author | Liad Kaufman <liad.kaufman@intel.com> | 2014-09-04 01:28:40 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2014-09-11 06:18:47 -0400 |
commit | 9d58f25b12f70f52581a5a1fdb1e59d322c4c729 (patch) | |
tree | 28740298c051b41408729bd456c6347efdb23da8 /net/mac80211/status.c | |
parent | 5935839ad73583781b8bbe8d91412f6826e218a4 (diff) |
mac80211: add TDLS connection timeout
Adding a timeout for tearing down a TDLS connection that
hasn't had ACKed traffic sent through it for a certain
amount of time.
Since we have no other monitoring facility to indicate the
existance (or non-existance) of a peer, this patch will
cause a peer to be considered as unavailable if for some X
time at least some Y packets have all not been ACKed.
Signed-off-by: Liad Kaufman <liad.kaufman@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/status.c')
-rw-r--r-- | net/mac80211/status.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 2800e1c65519..89290e33dafe 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
@@ -538,6 +538,8 @@ static void ieee80211_tx_latency_end_msrmnt(struct ieee80211_local *local, | |||
538 | * - current throughput (higher value for higher tpt)? | 538 | * - current throughput (higher value for higher tpt)? |
539 | */ | 539 | */ |
540 | #define STA_LOST_PKT_THRESHOLD 50 | 540 | #define STA_LOST_PKT_THRESHOLD 50 |
541 | #define STA_LOST_TDLS_PKT_THRESHOLD 10 | ||
542 | #define STA_LOST_TDLS_PKT_TIME (10*HZ) /* 10secs since last ACK */ | ||
541 | 543 | ||
542 | static void ieee80211_lost_packet(struct sta_info *sta, struct sk_buff *skb) | 544 | static void ieee80211_lost_packet(struct sta_info *sta, struct sk_buff *skb) |
543 | { | 545 | { |
@@ -548,7 +550,20 @@ static void ieee80211_lost_packet(struct sta_info *sta, struct sk_buff *skb) | |||
548 | !(info->flags & IEEE80211_TX_STAT_AMPDU)) | 550 | !(info->flags & IEEE80211_TX_STAT_AMPDU)) |
549 | return; | 551 | return; |
550 | 552 | ||
551 | if (++sta->lost_packets < STA_LOST_PKT_THRESHOLD) | 553 | sta->lost_packets++; |
554 | if (!sta->sta.tdls && sta->lost_packets < STA_LOST_PKT_THRESHOLD) | ||
555 | return; | ||
556 | |||
557 | /* | ||
558 | * If we're in TDLS mode, make sure that all STA_LOST_TDLS_PKT_THRESHOLD | ||
559 | * of the last packets were lost, and that no ACK was received in the | ||
560 | * last STA_LOST_TDLS_PKT_TIME ms, before triggering the CQM packet-loss | ||
561 | * mechanism. | ||
562 | */ | ||
563 | if (sta->sta.tdls && | ||
564 | (sta->lost_packets < STA_LOST_TDLS_PKT_THRESHOLD || | ||
565 | time_before(jiffies, | ||
566 | sta->last_tdls_pkt_time + STA_LOST_TDLS_PKT_TIME))) | ||
552 | return; | 567 | return; |
553 | 568 | ||
554 | cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr, | 569 | cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr, |
@@ -695,6 +710,10 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
695 | if (info->flags & IEEE80211_TX_STAT_ACK) { | 710 | if (info->flags & IEEE80211_TX_STAT_ACK) { |
696 | if (sta->lost_packets) | 711 | if (sta->lost_packets) |
697 | sta->lost_packets = 0; | 712 | sta->lost_packets = 0; |
713 | |||
714 | /* Track when last TDLS packet was ACKed */ | ||
715 | if (test_sta_flag(sta, WLAN_STA_TDLS_PEER_AUTH)) | ||
716 | sta->last_tdls_pkt_time = jiffies; | ||
698 | } else { | 717 | } else { |
699 | ieee80211_lost_packet(sta, skb); | 718 | ieee80211_lost_packet(sta, skb); |
700 | } | 719 | } |