From d2240c4a62e7ffb5c39ac1dadbadff8933688623 Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Fri, 17 Dec 2021 13:29:52 -0800 Subject: [PATCH] dpp: handle protocol errors in ROC timeout This is a standing TODO of properly handling these timeouts but for now just treat any ROC timeout as an error if authenticating or configuring. --- src/dpp.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/dpp.c b/src/dpp.c index c703de75..5e125265 100644 --- a/src/dpp.c +++ b/src/dpp.c @@ -1076,10 +1076,34 @@ static void dpp_presence_timeout(int error, void *user_data) { struct dpp_sm *dpp = user_data; - if (dpp->state != DPP_STATE_PRESENCE) { - l_debug("DPP state changed, stopping presence announcements"); - dpp->freqs_idx = 0; + /* + * If cancelled this is likely due to netdev going down or from Stop(). + * Otherwise there was some other problem which is probably not + * recoverable. + */ + if (error == -ECANCELED) return; + else if (error < 0) + goto protocol_failed; + + switch (dpp->state) { + case DPP_STATE_PRESENCE: + break; + case DPP_STATE_NOTHING: + /* Protocol already terminated */ + return; + case DPP_STATE_AUTHENTICATING: + case DPP_STATE_CONFIGURING: + /* + * TODO: If either the auth or config protocol is running we + * need to stay on channel until the specified timeouts. + * Unfortunately the kernel makes this very inconvenient since + * there is no way to stay on channel indefinitely or any way + * of knowing what duration the kernel/card actually chooses. + * + * For now just treat this as a failure. + */ + goto protocol_failed; } dpp->freqs_idx++; @@ -1097,6 +1121,11 @@ static void dpp_presence_timeout(int error, void *user_data) dpp->offchannel_id = offchannel_start(netdev_get_wdev_id(dpp->netdev), dpp->current_freq, dpp->dwell, dpp_roc_started, dpp, dpp_presence_timeout); + return; + +protocol_failed: + dpp_reset(dpp); + return; } /*