提交 9739fe29 编写于 作者: S Sara Sharon 提交者: Johannes Berg

mac80211: add an option for drivers to check if packets can be aggregated

Some hardwares have limitations on the packets' type in AMSDU.
Add an optional driver callback to determine if two skbs can
be used in the same AMSDU or not.
Signed-off-by: NSara Sharon <sara.sharon@intel.com>
Signed-off-by: NLuca Coelho <luciano.coelho@intel.com>
Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
上级 edba6bda
...@@ -3594,6 +3594,10 @@ enum ieee80211_reconfig_type { ...@@ -3594,6 +3594,10 @@ enum ieee80211_reconfig_type {
* @del_nan_func: Remove a NAN function. The driver must call * @del_nan_func: Remove a NAN function. The driver must call
* ieee80211_nan_func_terminated() with * ieee80211_nan_func_terminated() with
* NL80211_NAN_FUNC_TERM_REASON_USER_REQUEST reason code upon removal. * NL80211_NAN_FUNC_TERM_REASON_USER_REQUEST reason code upon removal.
* @can_aggregate_in_amsdu: Called in order to determine if HW supports
* aggregating two specific frames in the same A-MSDU. The relation
* between the skbs should be symmetric and transitive. Note that while
* skb is always a real frame, head may or may not be an A-MSDU.
*/ */
struct ieee80211_ops { struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw, void (*tx)(struct ieee80211_hw *hw,
...@@ -3876,6 +3880,9 @@ struct ieee80211_ops { ...@@ -3876,6 +3880,9 @@ struct ieee80211_ops {
void (*del_nan_func)(struct ieee80211_hw *hw, void (*del_nan_func)(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
u8 instance_id); u8 instance_id);
bool (*can_aggregate_in_amsdu)(struct ieee80211_hw *hw,
struct sk_buff *head,
struct sk_buff *skb);
}; };
/** /**
......
...@@ -1173,6 +1173,16 @@ static inline void drv_wake_tx_queue(struct ieee80211_local *local, ...@@ -1173,6 +1173,16 @@ static inline void drv_wake_tx_queue(struct ieee80211_local *local,
local->ops->wake_tx_queue(&local->hw, &txq->txq); local->ops->wake_tx_queue(&local->hw, &txq->txq);
} }
static inline int drv_can_aggregate_in_amsdu(struct ieee80211_local *local,
struct sk_buff *head,
struct sk_buff *skb)
{
if (!local->ops->can_aggregate_in_amsdu)
return true;
return local->ops->can_aggregate_in_amsdu(&local->hw, head, skb);
}
static inline int drv_start_nan(struct ieee80211_local *local, static inline int drv_start_nan(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata, struct ieee80211_sub_if_data *sdata,
struct cfg80211_nan_conf *conf) struct cfg80211_nan_conf *conf)
......
...@@ -3261,6 +3261,9 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata, ...@@ -3261,6 +3261,9 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,
if (max_frags && nfrags > max_frags) if (max_frags && nfrags > max_frags)
goto out; goto out;
if (!drv_can_aggregate_in_amsdu(local, head, skb))
goto out;
if (!ieee80211_amsdu_prepare_head(sdata, fast_tx, head)) if (!ieee80211_amsdu_prepare_head(sdata, fast_tx, head))
goto out; goto out;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册