mac80211: clean up ieee80211_stop_tx_ba_session
There's no sense in letting anything but internal mac80211 functions set the initiator to anything but WLAN_BACK_INITIATOR, since WLAN_BACK_RECIPIENT is only valid when we have received a frame from the peer, which we react to directly in mac80211. The debugfs code I recently added got this wrong as well. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
2b2c009ecf
commit
6a8579d0e6
@@ -313,8 +313,7 @@ static int rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv,
|
|||||||
*/
|
*/
|
||||||
IWL_DEBUG_HT(priv, "Fail start Tx agg on tid: %d\n",
|
IWL_DEBUG_HT(priv, "Fail start Tx agg on tid: %d\n",
|
||||||
tid);
|
tid);
|
||||||
ieee80211_stop_tx_ba_session(sta, tid,
|
ieee80211_stop_tx_ba_session(sta, tid);
|
||||||
WLAN_BACK_INITIATOR);
|
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
IWL_ERR(priv, "Fail finding valid aggregation tid: %d\n", tid);
|
IWL_ERR(priv, "Fail finding valid aggregation tid: %d\n", tid);
|
||||||
|
@@ -2345,16 +2345,14 @@ void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, const u8 *ra,
|
|||||||
* ieee80211_stop_tx_ba_session - Stop a Block Ack session.
|
* ieee80211_stop_tx_ba_session - Stop a Block Ack session.
|
||||||
* @sta: the station whose BA session to stop
|
* @sta: the station whose BA session to stop
|
||||||
* @tid: the TID to stop BA.
|
* @tid: the TID to stop BA.
|
||||||
* @initiator: if indicates initiator DELBA frame will be sent.
|
|
||||||
*
|
*
|
||||||
* Return: error if no sta with matching da found, success otherwise
|
* Return: negative error if the TID is invalid, or no aggregation active
|
||||||
*
|
*
|
||||||
* Although mac80211/low level driver/user space application can estimate
|
* Although mac80211/low level driver/user space application can estimate
|
||||||
* the need to stop aggregation on a certain RA/TID, the session level
|
* the need to stop aggregation on a certain RA/TID, the session level
|
||||||
* will be managed by the mac80211.
|
* will be managed by the mac80211.
|
||||||
*/
|
*/
|
||||||
int ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, u16 tid,
|
int ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, u16 tid);
|
||||||
enum ieee80211_back_parties initiator);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ieee80211_stop_tx_ba_cb - low level driver ready to stop aggregate.
|
* ieee80211_stop_tx_ba_cb - low level driver ready to stop aggregate.
|
||||||
|
@@ -538,14 +538,13 @@ int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ieee80211_stop_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
|
int ieee80211_stop_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid)
|
||||||
enum ieee80211_back_parties initiator)
|
|
||||||
{
|
{
|
||||||
struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
||||||
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
|
||||||
trace_api_stop_tx_ba_session(pubsta, tid, initiator);
|
trace_api_stop_tx_ba_session(pubsta, tid);
|
||||||
|
|
||||||
if (!local->ops->ampdu_action)
|
if (!local->ops->ampdu_action)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -553,7 +552,7 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
|
|||||||
if (tid >= STA_TID_NUM)
|
if (tid >= STA_TID_NUM)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return __ieee80211_stop_tx_ba_session(sta, tid, initiator);
|
return __ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ieee80211_stop_tx_ba_session);
|
EXPORT_SYMBOL(ieee80211_stop_tx_ba_session);
|
||||||
|
|
||||||
|
@@ -210,8 +210,7 @@ static ssize_t sta_agg_status_write(struct file *file, const char __user *userbu
|
|||||||
if (start)
|
if (start)
|
||||||
ret = ieee80211_start_tx_ba_session(&sta->sta, tid);
|
ret = ieee80211_start_tx_ba_session(&sta->sta, tid);
|
||||||
else
|
else
|
||||||
ret = ieee80211_stop_tx_ba_session(&sta->sta, tid,
|
ret = ieee80211_stop_tx_ba_session(&sta->sta, tid);
|
||||||
WLAN_BACK_RECIPIENT);
|
|
||||||
} else {
|
} else {
|
||||||
__ieee80211_stop_rx_ba_session(sta, tid, WLAN_BACK_RECIPIENT, 3);
|
__ieee80211_stop_rx_ba_session(sta, tid, WLAN_BACK_RECIPIENT, 3);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@@ -876,25 +876,23 @@ TRACE_EVENT(api_start_tx_ba_cb,
|
|||||||
);
|
);
|
||||||
|
|
||||||
TRACE_EVENT(api_stop_tx_ba_session,
|
TRACE_EVENT(api_stop_tx_ba_session,
|
||||||
TP_PROTO(struct ieee80211_sta *sta, u16 tid, u16 initiator),
|
TP_PROTO(struct ieee80211_sta *sta, u16 tid),
|
||||||
|
|
||||||
TP_ARGS(sta, tid, initiator),
|
TP_ARGS(sta, tid),
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
STA_ENTRY
|
STA_ENTRY
|
||||||
__field(u16, tid)
|
__field(u16, tid)
|
||||||
__field(u16, initiator)
|
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
STA_ASSIGN;
|
STA_ASSIGN;
|
||||||
__entry->tid = tid;
|
__entry->tid = tid;
|
||||||
__entry->initiator = initiator;
|
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk(
|
TP_printk(
|
||||||
STA_PR_FMT " tid:%d initiator:%d",
|
STA_PR_FMT " tid:%d",
|
||||||
STA_PR_ARG, __entry->tid, __entry->initiator
|
STA_PR_ARG, __entry->tid
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user