提交 d63b548f 编写于 作者: J Johannes Berg

mac80211: allow passing transmitter station on RX

Sometimes drivers already looked up, or know out-of-band
from their device, which station transmitted a given RX
frame. Allow them to pass the station pointer to mac80211
to save the extra lookup.
Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
上级 e596af82
...@@ -686,7 +686,7 @@ static void iwlagn_pass_packet_to_mac80211(struct iwl_priv *priv, ...@@ -686,7 +686,7 @@ static void iwlagn_pass_packet_to_mac80211(struct iwl_priv *priv,
memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats)); memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats));
ieee80211_rx_napi(priv->hw, skb, priv->napi); ieee80211_rx_napi(priv->hw, NULL, skb, priv->napi);
} }
static u32 iwlagn_translate_rx_status(struct iwl_priv *priv, u32 decrypt_in) static u32 iwlagn_translate_rx_status(struct iwl_priv *priv, u32 decrypt_in)
......
...@@ -1499,5 +1499,5 @@ void iwl_mvm_rx_stored_beacon_notif(struct iwl_mvm *mvm, ...@@ -1499,5 +1499,5 @@ void iwl_mvm_rx_stored_beacon_notif(struct iwl_mvm *mvm,
memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status)); memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status));
/* pass it as regular rx to mac80211 */ /* pass it as regular rx to mac80211 */
ieee80211_rx_napi(mvm->hw, skb, NULL); ieee80211_rx_napi(mvm->hw, NULL, skb, NULL);
} }
...@@ -131,7 +131,7 @@ static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm, ...@@ -131,7 +131,7 @@ static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
fraglen, rxb->truesize); fraglen, rxb->truesize);
} }
ieee80211_rx_napi(mvm->hw, skb, napi); ieee80211_rx_napi(mvm->hw, NULL, skb, napi);
} }
/* /*
......
...@@ -210,7 +210,7 @@ static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm, ...@@ -210,7 +210,7 @@ static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
if (iwl_mvm_check_pn(mvm, skb, queue, sta)) if (iwl_mvm_check_pn(mvm, skb, queue, sta))
kfree_skb(skb); kfree_skb(skb);
else else
ieee80211_rx_napi(mvm->hw, skb, napi); ieee80211_rx_napi(mvm->hw, NULL, skb, napi);
} }
static void iwl_mvm_get_signal_strength(struct iwl_mvm *mvm, static void iwl_mvm_get_signal_strength(struct iwl_mvm *mvm,
......
...@@ -3855,11 +3855,12 @@ void ieee80211_restart_hw(struct ieee80211_hw *hw); ...@@ -3855,11 +3855,12 @@ void ieee80211_restart_hw(struct ieee80211_hw *hw);
* This function must be called with BHs disabled. * This function must be called with BHs disabled.
* *
* @hw: the hardware this frame came in on * @hw: the hardware this frame came in on
* @sta: the station the frame was received from, or %NULL
* @skb: the buffer to receive, owned by mac80211 after this call * @skb: the buffer to receive, owned by mac80211 after this call
* @napi: the NAPI context * @napi: the NAPI context
*/ */
void ieee80211_rx_napi(struct ieee80211_hw *hw, struct sk_buff *skb, void ieee80211_rx_napi(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
struct napi_struct *napi); struct sk_buff *skb, struct napi_struct *napi);
/** /**
* ieee80211_rx - receive frame * ieee80211_rx - receive frame
...@@ -3883,7 +3884,7 @@ void ieee80211_rx_napi(struct ieee80211_hw *hw, struct sk_buff *skb, ...@@ -3883,7 +3884,7 @@ void ieee80211_rx_napi(struct ieee80211_hw *hw, struct sk_buff *skb,
*/ */
static inline void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb) static inline void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb)
{ {
ieee80211_rx_napi(hw, skb, NULL); ieee80211_rx_napi(hw, NULL, skb, NULL);
} }
/** /**
......
...@@ -3552,6 +3552,7 @@ static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx, ...@@ -3552,6 +3552,7 @@ static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx,
* be called with rcu_read_lock protection. * be called with rcu_read_lock protection.
*/ */
static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
struct ieee80211_sta *pubsta,
struct sk_buff *skb, struct sk_buff *skb,
struct napi_struct *napi) struct napi_struct *napi)
{ {
...@@ -3561,7 +3562,6 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, ...@@ -3561,7 +3562,6 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
__le16 fc; __le16 fc;
struct ieee80211_rx_data rx; struct ieee80211_rx_data rx;
struct ieee80211_sub_if_data *prev; struct ieee80211_sub_if_data *prev;
struct sta_info *sta, *prev_sta;
struct rhash_head *tmp; struct rhash_head *tmp;
int err = 0; int err = 0;
...@@ -3597,7 +3597,14 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, ...@@ -3597,7 +3597,14 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
ieee80211_is_beacon(hdr->frame_control))) ieee80211_is_beacon(hdr->frame_control)))
ieee80211_scan_rx(local, skb); ieee80211_scan_rx(local, skb);
if (ieee80211_is_data(fc)) { if (pubsta) {
rx.sta = container_of(pubsta, struct sta_info, sta);
rx.sdata = rx.sta->sdata;
if (ieee80211_prepare_and_rx_handle(&rx, skb, true))
return;
goto out;
} else if (ieee80211_is_data(fc)) {
struct sta_info *sta, *prev_sta;
const struct bucket_table *tbl; const struct bucket_table *tbl;
prev_sta = NULL; prev_sta = NULL;
...@@ -3671,8 +3678,8 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, ...@@ -3671,8 +3678,8 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
* This is the receive path handler. It is called by a low level driver when an * This is the receive path handler. It is called by a low level driver when an
* 802.11 MPDU is received from the hardware. * 802.11 MPDU is received from the hardware.
*/ */
void ieee80211_rx_napi(struct ieee80211_hw *hw, struct sk_buff *skb, void ieee80211_rx_napi(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta,
struct napi_struct *napi) struct sk_buff *skb, struct napi_struct *napi)
{ {
struct ieee80211_local *local = hw_to_local(hw); struct ieee80211_local *local = hw_to_local(hw);
struct ieee80211_rate *rate = NULL; struct ieee80211_rate *rate = NULL;
...@@ -3771,7 +3778,8 @@ void ieee80211_rx_napi(struct ieee80211_hw *hw, struct sk_buff *skb, ...@@ -3771,7 +3778,8 @@ void ieee80211_rx_napi(struct ieee80211_hw *hw, struct sk_buff *skb,
ieee80211_tpt_led_trig_rx(local, ieee80211_tpt_led_trig_rx(local,
((struct ieee80211_hdr *)skb->data)->frame_control, ((struct ieee80211_hdr *)skb->data)->frame_control,
skb->len); skb->len);
__ieee80211_rx_handle_packet(hw, skb, napi);
__ieee80211_rx_handle_packet(hw, pubsta, skb, napi);
rcu_read_unlock(); rcu_read_unlock();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册