Messages in this thread | | | Subject | Re: [PATCH 1/4] mac80211: OCB mode + join and leave handling | From | Johannes Berg <> | Date | Mon, 20 Oct 2014 11:40:50 +0200 |
| |
On Thu, 2014-10-16 at 18:33 +0200, Rostislav Lisovy wrote:
> 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?
> @@ -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.
> > 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
| |