Search Linux Wireless

RE: [RFC v4] mac80211: fix rx blockack session race condition

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Message d'origine-----
> De : Johannes Berg <johannes@xxxxxxxxxxxxxxxx>
> Envoyé : vendredi 26 novembre 2021 13:05
> À : Jean-Pierre TOSONI <jp.tosoni@xxxxxxxxx>; 'linux-
> wireless@xxxxxxxxxxxxxxx' <linux-wireless@xxxxxxxxxxxxxxx>
> Objet : Re: [RFC v4] mac80211: fix rx blockack session race condition
> 
> On Thu, 2021-10-28 at 10:25 +0000, Jean-Pierre TOSONI wrote:
> 
> > +		spin_lock_bh(&rx->sta->ampdu_mlme.rx_offl_lock);
> >  		if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid)
> &&
> > -		    !test_and_set_bit(tid, rx->sta-
> >ampdu_mlme.unexpected_agg))
> > +		    /* back_req is allowed if the fw just received addba */
> >
> 
> If we're going to add an unconditional lock here, I see little reason to
> have all the test_bit()/test_and_set_bit() etc.

The lock specifically protects the successive testing of agg_session_valid
and tid_rx_manage_offl. So I could just isolate the agg_session_valid 
condition as major condition then take the spinlock then test&set
agg_session_valid and tid_rx_manage_offl as a minor condition, so the
spinlock would be conditional. But see below.

> 
> I really don't think it's _right_ to add an unconditional lock here
> though, if it can at all be avoided.
> 
> johannes

After extensive testing, adding this lock was effective but only removed
half of the DELBA frames wrongly sent. I suspect there is another race
condition somewhere else.

Thinking about it, here the DELBA is sent because the ath10k driver
passes a BAREQ before the signaling the establishment of the BA session.
either the firmware sent the two events in wrong order, or there was
actually an inversion in the frames sent by the host (in my testing,
Wireshark shows the first case only).

In the first case, we should not send a DELBA at all, because actually,
the session is correctly set up. The second case should be detected
and acted upon by ath10k itself since it was responsible for acking the
ADDBA; hence mac80211 should not send a -duplicate- DELBA either.

So, I completely removed this call to ieee80211_send_delba() when
working with ath10k, and my RX BA sessions  do not break anymore.
(I added my own hardware flag IEEE80211_HW_RX_AMPDU_IN_HW
similar to TX)

With my hardware it works, but I have no idea how to identify
chipsets/drivers/firmwares that will handle this correctly. So I
cannot submit a generic patch.

Please close this request, I will stay with my proprietary fix. Hopefully
someone with more ath10k/firmware knowledge will find a complete
way to fix.

Thanks for the review,
Jean-Pierre





[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux