Re: [PATCH 1/4] mac80211: OCB mode + join and leave handling
From: Johannes Berg <johannes@sipsolutions.net>
Date: 2014-10-20 09:40:59
Also in:
lkml
On Thu, 2014-10-16 at 18:33 +0200, Rostislav Lisovy wrote:
quoted hunk
You are right. I hope the following is a reasonable solution (in form of a patch to my previous patch; comment stolen from some prehistoric version of mesh.c):@@ -127,6 +127,9 @@ void ieee80211_ocb_work(struct ieee80211_sub_if_data *sdata) struct ieee80211_if_ocb *ifocb = &sdata->u.ocb; struct sta_info *sta; + if (!netif_running(sdata->dev)) + return;
Not sure, it seems you should check "is it operating in OCB mode"? OTOH, when it's not operating but still around it probably doesn't matter?
quoted hunk
@@ -229,6 +232,13 @@ int ieee80211_ocb_leave(struct ieee80211_sub_if_data *sdata) skb_queue_purge(&sdata->skb_queue); del_timer_sync(&sdata->u.ocb.housekeeping_timer); + /* + * If the timer fired while we waited for it, it will have + * requeued the work. Now the work will be running again + * but will not rearm the timer again because it checks + * whether the interface is running, which, at this point, + * it no longer is. + */
Well, the comment is wrong, since leave() can and will be done while the interface is running.
quoted
This isn't safe - ocb_rx_no_sta() used GFP_KERNEL, that's clearly not allowed in this context. But it does answer my previous question about the function being exported - I had assumed that you wouldn't call it here since it would be unsafe :)A call to sta_info_alloc(sdata, addr, GFP_ATOMIC); in ieee80211_ocb_rx_no_sta() should solve this.
Yeah, I guess so, didn't check in detail now. johannes