|
@@ -967,10 +967,14 @@ enum ieee80211_filter_flags {
|
|
|
* &struct ieee80211_ops to indicate which action is needed.
|
|
|
* @IEEE80211_AMPDU_RX_START: start Rx aggregation
|
|
|
* @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation
|
|
|
+ * @IEEE80211_AMPDU_TX_START: start Tx aggregation
|
|
|
+ * @IEEE80211_AMPDU_TX_STOP: stop Tx aggregation
|
|
|
*/
|
|
|
enum ieee80211_ampdu_mlme_action {
|
|
|
IEEE80211_AMPDU_RX_START,
|
|
|
IEEE80211_AMPDU_RX_STOP,
|
|
|
+ IEEE80211_AMPDU_TX_START,
|
|
|
+ IEEE80211_AMPDU_TX_STOP,
|
|
|
};
|
|
|
|
|
|
/**
|
|
@@ -1111,7 +1115,8 @@ enum ieee80211_ampdu_mlme_action {
|
|
|
* The RA/TID combination determines the destination and TID we want
|
|
|
* the ampdu action to be performed for. The action is defined through
|
|
|
* ieee80211_ampdu_mlme_action. Starting sequence number (@ssn)
|
|
|
- * is the first frame we expect to perform the action on.
|
|
|
+ * is the first frame we expect to perform the action on. notice
|
|
|
+ * that TX/RX_STOP can pass NULL for this parameter.
|
|
|
*/
|
|
|
struct ieee80211_ops {
|
|
|
int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb,
|
|
@@ -1162,7 +1167,7 @@ struct ieee80211_ops {
|
|
|
int (*conf_ht)(struct ieee80211_hw *hw, struct ieee80211_conf *conf);
|
|
|
int (*ampdu_action)(struct ieee80211_hw *hw,
|
|
|
enum ieee80211_ampdu_mlme_action action,
|
|
|
- const u8 *ra, u16 tid, u16 ssn);
|
|
|
+ const u8 *addr, u16 tid, u16 *ssn);
|
|
|
};
|
|
|
|
|
|
/**
|
|
@@ -1574,4 +1579,81 @@ void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw,
|
|
|
struct ieee80211_vif *vif),
|
|
|
void *data);
|
|
|
|
|
|
+/**
|
|
|
+ * ieee80211_start_tx_ba_session - Start a tx Block Ack session.
|
|
|
+ * @hw: pointer as obtained from ieee80211_alloc_hw().
|
|
|
+ * @ra: receiver address of the BA session recipient
|
|
|
+ * @tid: the TID to BA on.
|
|
|
+ * @return: success if addBA request was sent, failure otherwise
|
|
|
+ *
|
|
|
+ * Although mac80211/low level driver/user space application can estimate
|
|
|
+ * the need to start aggregation on a certain RA/TID, the session level
|
|
|
+ * will be managed by the mac80211.
|
|
|
+ */
|
|
|
+int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid);
|
|
|
+
|
|
|
+/**
|
|
|
+ * ieee80211_start_tx_ba_cb - low level driver ready to aggregate.
|
|
|
+ * @hw: pointer as obtained from ieee80211_alloc_hw().
|
|
|
+ * @ra: receiver address of the BA session recipient.
|
|
|
+ * @tid: the TID to BA on.
|
|
|
+ *
|
|
|
+ * This function must be called by low level driver once it has
|
|
|
+ * finished with preparations for the BA session.
|
|
|
+ */
|
|
|
+void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid);
|
|
|
+
|
|
|
+/**
|
|
|
+ * ieee80211_start_tx_ba_cb_irqsafe - low level driver ready to aggregate.
|
|
|
+ * @hw: pointer as obtained from ieee80211_alloc_hw().
|
|
|
+ * @ra: receiver address of the BA session recipient.
|
|
|
+ * @tid: the TID to BA on.
|
|
|
+ *
|
|
|
+ * This function must be called by low level driver once it has
|
|
|
+ * finished with preparations for the BA session.
|
|
|
+ * This version of the function is irq safe.
|
|
|
+ */
|
|
|
+void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra,
|
|
|
+ u16 tid);
|
|
|
+
|
|
|
+/**
|
|
|
+ * ieee80211_stop_tx_ba_session - Stop a Block Ack session.
|
|
|
+ * @hw: pointer as obtained from ieee80211_alloc_hw().
|
|
|
+ * @ra: receiver address of the BA session recipient
|
|
|
+ * @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
|
|
|
+ *
|
|
|
+ * Although mac80211/low level driver/user space application can estimate
|
|
|
+ * the need to stop aggregation on a certain RA/TID, the session level
|
|
|
+ * will be managed by the mac80211.
|
|
|
+ */
|
|
|
+int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw,
|
|
|
+ u8 *ra, u16 tid,
|
|
|
+ enum ieee80211_back_parties initiator);
|
|
|
+
|
|
|
+/**
|
|
|
+ * ieee80211_stop_tx_ba_cb - low level driver ready to stop aggregate.
|
|
|
+ * @hw: pointer as obtained from ieee80211_alloc_hw().
|
|
|
+ * @ra: receiver address of the BA session recipient.
|
|
|
+ * @tid: the desired TID to BA on.
|
|
|
+ *
|
|
|
+ * This function must be called by low level driver once it has
|
|
|
+ * finished with preparations for the BA session tear down.
|
|
|
+ */
|
|
|
+void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid);
|
|
|
+
|
|
|
+/**
|
|
|
+ * ieee80211_stop_tx_ba_cb_irqsafe - low level driver ready to stop aggregate.
|
|
|
+ * @hw: pointer as obtained from ieee80211_alloc_hw().
|
|
|
+ * @ra: receiver address of the BA session recipient.
|
|
|
+ * @tid: the desired TID to BA on.
|
|
|
+ *
|
|
|
+ * This function must be called by low level driver once it has
|
|
|
+ * finished with preparations for the BA session tear down.
|
|
|
+ * This version of the function is irq safe.
|
|
|
+ */
|
|
|
+void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra,
|
|
|
+ u16 tid);
|
|
|
+
|
|
|
#endif /* MAC80211_H */
|