2014-02-26 18:42:27

by Jean-Pierre TOSONI

[permalink] [raw]
Subject: mac80211: double processing of probe response frames ?

Hi all,

I am using mac80211 and ath9k.
I put a debug trace in the net/wireless/scan.c, in
cfg80211_inform_bss_frame().
I exercise scanning with wpa_supplicant and I monitor the air with
wireshark/airpcapN.
Each time a probe response frame is received, I can see that
cfg80211_inform_bss_frame() is called *twice.*

I wonder if this is really needed ? Is it possible to remove one of the
calls ?

AFAICT, mac80211/scan.c/ieee80211_bss_info_update() is called along two
paths,
1) in mac80211/rx.c, from __ieee80211_rx_handle_packet() and
ieee80211_scan_rx()
2) in mac80211/mlme.c, from the work queue calling
ieee80211_sta_rx_queued_mgmt()
=> ieee80211_rx_mgmt_probe_resp() => ieee80211_rx_bss_info()

Maybe part of the call to ieee80211_scan_rx() could be delayed and merged
later when ieee80211_rx_mgmt_probe_resp() is called ? Any comments ?

I am using compat-wireless-2013-04-16.



2014-02-27 16:40:44

by Johannes Berg

[permalink] [raw]
Subject: Re: mac80211: double processing of probe response frames ?

On Wed, 2014-02-26 at 17:49 +0100, Jean-Pierre Tosoni wrote:
> Hi all,
>
> I am using mac80211 and ath9k.
> I put a debug trace in the net/wireless/scan.c, in
> cfg80211_inform_bss_frame().
> I exercise scanning with wpa_supplicant and I monitor the air with
> wireshark/airpcapN.
> Each time a probe response frame is received, I can see that
> cfg80211_inform_bss_frame() is called *twice.*
>
> I wonder if this is really needed ? Is it possible to remove one of the
> calls ?
>
> AFAICT, mac80211/scan.c/ieee80211_bss_info_update() is called along two
> paths,
> 1) in mac80211/rx.c, from __ieee80211_rx_handle_packet() and
> ieee80211_scan_rx()
> 2) in mac80211/mlme.c, from the work queue calling
> ieee80211_sta_rx_queued_mgmt()
> => ieee80211_rx_mgmt_probe_resp() => ieee80211_rx_bss_info()
>
> Maybe part of the call to ieee80211_scan_rx() could be delayed and merged
> later when ieee80211_rx_mgmt_probe_resp() is called ? Any comments ?

Not easily - the latter call is very much filtered. However, the
scan_rx() one should only do something during scan, I believe, and the
other *not* during scan?

johannes