mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-29 05:39:24 +01:00
frame-xchg: Allow frame_xchg_stop calls inside frame callbacks
Make sure a frame callback is free to call frame_xchg_stop without causing a crash. Frame callback here means the one that gets called if our tx frame was ACKed and triggered a respone frame that matched one of the provided prefixes, within the given time. All in all a frame callback is allowed to call either frame_xchg_stop or frame_xchg_startv or neither. Same applies to the final callback (called when no matching responses received).
This commit is contained in:
parent
f1aa208edf
commit
60bb42087a
@ -108,6 +108,7 @@ struct frame_xchg_data {
|
|||||||
unsigned int retry_interval;
|
unsigned int retry_interval;
|
||||||
unsigned int resp_timeout;
|
unsigned int resp_timeout;
|
||||||
bool in_frame_cb : 1;
|
bool in_frame_cb : 1;
|
||||||
|
bool stale : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct frame_xchg_watch_data {
|
struct frame_xchg_watch_data {
|
||||||
@ -723,6 +724,7 @@ static void frame_xchg_wait_cancel(struct frame_xchg_data *fx)
|
|||||||
static void frame_xchg_reset(struct frame_xchg_data *fx)
|
static void frame_xchg_reset(struct frame_xchg_data *fx)
|
||||||
{
|
{
|
||||||
fx->in_frame_cb = false;
|
fx->in_frame_cb = false;
|
||||||
|
fx->stale = false;
|
||||||
|
|
||||||
frame_xchg_wait_cancel(fx);
|
frame_xchg_wait_cancel(fx);
|
||||||
|
|
||||||
@ -970,7 +972,7 @@ static void frame_xchg_resp_cb(const struct mmpdu_header *mpdu,
|
|||||||
|
|
||||||
fx->in_frame_cb = false;
|
fx->in_frame_cb = false;
|
||||||
|
|
||||||
if (done) {
|
if (done || fx->stale) {
|
||||||
fx->cb = NULL;
|
fx->cb = NULL;
|
||||||
frame_xchg_done(fx, 0);
|
frame_xchg_done(fx, 0);
|
||||||
return;
|
return;
|
||||||
@ -1115,6 +1117,11 @@ void frame_xchg_stop(uint64_t wdev_id)
|
|||||||
if (!fx)
|
if (!fx)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (fx->in_frame_cb) {
|
||||||
|
fx->stale = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
frame_xchg_reset(fx);
|
frame_xchg_reset(fx);
|
||||||
l_free(fx);
|
l_free(fx);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user