Message ID | 20221026175828.2435994-2-andrew.zaborowski@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | netconfig: Avoid generating events after netconfig_reset | expand |
Context | Check | Description |
---|---|---|
tedd_an/pre-ci_am | success | Success |
prestwoj/iwd-alpine-ci-fetch | success | Fetch PR |
prestwoj/iwd-ci-gitlint | success | GitLint |
prestwoj/iwd-ci-fetch | success | Fetch PR |
prestwoj/iwd-ci-makedistcheck | success | Make Distcheck |
prestwoj/iwd-ci-incremental_build | success | Incremental build not run PASS |
prestwoj/iwd-ci-build | success | Build - Configure |
prestwoj/iwd-alpine-ci-makedistcheck | success | Make Distcheck |
prestwoj/iwd-alpine-ci-incremental_build | success | Incremental build not run PASS |
prestwoj/iwd-alpine-ci-build | success | Build - Configure |
prestwoj/iwd-ci-makecheckvalgrind | success | Make Check w/Valgrind |
prestwoj/iwd-ci-clang | success | clang PASS |
prestwoj/iwd-ci-makecheck | success | Make Check |
prestwoj/iwd-alpine-ci-makecheckvalgrind | success | Make Check w/Valgrind |
prestwoj/iwd-alpine-ci-makecheck | success | Make Check |
prestwoj/iwd-ci-testrunner | success | test-runner PASS |
Hi Andrew, On 10/26/22 12:58, Andrew Zaborowski wrote: > Similarly to l_netconfig track whether IWD's netconfig is active (from > the moment of netconfig_configure() till netconfig_reset()) using a > "started" flag and avoid handling or emitting any events after "started" > is cleared. > > This fixes an occasional issue with the Netconfig Agent backend where > station would reset netconfig, netconfig would issue DBus calls to clear > addresses and routes, station would go into DISCONNECTING, perhaps > finish and go into DISCONNECTED and after a while the DBus calls would > come back with an error which would cause a NETCONFIG_EVENT_FAILED > causing station to call netdev_disconnct() for a second time and > transition to and get stuck in DISCONNECTING. > --- > src/netconfig-commit.c | 3 +++ > src/netconfig.c | 15 +++++++++++++++ > src/netconfig.h | 1 + > 3 files changed, 19 insertions(+) > Applied, thanks. Regards, -Denis
diff --git a/src/netconfig-commit.c b/src/netconfig-commit.c index 0e7c3961..27832b75 100644 --- a/src/netconfig-commit.c +++ b/src/netconfig-commit.c @@ -400,6 +400,9 @@ static void netconfig_agent_receive_reply(struct l_dbus_message *reply, data->pending_id[INDEX_FOR_AF(cd->family)] = 0; + if (!cd->netconfig->started) + return; + if (l_dbus_message_get_error(reply, &error, &text)) { success = false; l_error("netconfig agent call returned %s(\"%s\")", diff --git a/src/netconfig.c b/src/netconfig.c index c7cc6b1b..e6779d7c 100644 --- a/src/netconfig.c +++ b/src/netconfig.c @@ -507,6 +507,9 @@ static bool netconfig_load_fils_settings(struct netconfig *netconfig, bool netconfig_configure(struct netconfig *netconfig, netconfig_notify_func_t notify, void *user_data) { + if (netconfig->started) + return false; + netconfig->notify = notify; netconfig->user_data = user_data; @@ -521,11 +524,15 @@ bool netconfig_configure(struct netconfig *netconfig, if (unlikely(!l_netconfig_start(netconfig->nc))) return false; + netconfig->started = true; return true; } bool netconfig_reconfigure(struct netconfig *netconfig, bool set_arp_gw) { + if (!netconfig->started) + return false; + /* * Starting with kernel 4.20, ARP cache is flushed when the netdev * detects NO CARRIER. This can result in unnecessarily long delays @@ -558,6 +565,10 @@ bool netconfig_reconfigure(struct netconfig *netconfig, bool set_arp_gw) bool netconfig_reset(struct netconfig *netconfig) { + if (!netconfig->started) + return false; + + netconfig->started = false; l_netconfig_unconfigure(netconfig->nc); l_netconfig_stop(netconfig->nc); @@ -620,6 +631,10 @@ static void netconfig_event_handler(struct l_netconfig *nc, uint8_t family, { struct netconfig *netconfig = user_data; + /* Once stopped, only commit a final L_NETCONFIG_EVENT_UNCONFIGURE */ + if (!netconfig->started && event != L_NETCONFIG_EVENT_UNCONFIGURE) + return; + l_debug("l_netconfig event %d", event); netconfig_commit(netconfig, family, event); diff --git a/src/netconfig.h b/src/netconfig.h index f04899ad..a7921571 100644 --- a/src/netconfig.h +++ b/src/netconfig.h @@ -43,6 +43,7 @@ struct netconfig { bool static_config[2]; bool gateway_overridden[2]; bool dns_overridden[2]; + bool started; bool connected[2]; char **dns_list; char **domains;