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: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
e596af8279
commit
d63b548fff
|
@ -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,
|
||||||
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,
|
||||||
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,
|
||||||
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);
|
||||||
* 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,
|
||||||
*/
|
*/
|
||||||
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,
|
||||||
* 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,
|
||||||
__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,
|
||||||
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,
|
||||||
* 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,
|
||||||
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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue