From 0397bb67c8fff24f28d10c31324c578a9bd74ad3 Mon Sep 17 00:00:00 2001 From: ravi vaishnav Date: Fri, 20 Aug 2021 14:07:44 -0400 Subject: [PATCH] Wifi-3522. Correcting an earlier commit for scan failures. Correcting an earlier commit 4beda3ab6607825639f9c018456a83a8e79f2d72 to consider all the cases where the avl entry needs be deleted when a scan is either completed or aborted for any reason. Signed-off-by: ravi vaishnav --- .../opensync/patches/42-sm_dbg_log.patch | 10 ++-- .../src/lib/target/src/stats_nl80211.c | 46 ++++++++++++------- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/feeds/wlan-ap/opensync/patches/42-sm_dbg_log.patch b/feeds/wlan-ap/opensync/patches/42-sm_dbg_log.patch index 3616b0fc6..0443f6128 100644 --- a/feeds/wlan-ap/opensync/patches/42-sm_dbg_log.patch +++ b/feeds/wlan-ap/opensync/patches/42-sm_dbg_log.patch @@ -2,20 +2,22 @@ Index: opensync-2.0.5.0/src/sm/src/sm_scan_schedule.c =================================================================== --- opensync-2.0.5.0.orig/src/sm/src/sm_scan_schedule.c +++ opensync-2.0.5.0/src/sm/src/sm_scan_schedule.c -@@ -155,6 +155,12 @@ clean: +@@ -155,6 +155,14 @@ clean: /* Remove processed context */ ds_dlist_remove_head(&g_scan_ctx_list); -+ LOG(DEBUG, "sm_scan_schedule_cb. Scan done. Deleting scan_ctx. %p. %s %s %d\n", ++ if (scan_ctx) { ++ LOG(DEBUG, "sm_scan_schedule_cb. Scan done. Deleting scan_ctx. %p. %s %s %d\n", + scan_ctx, + radio_get_name_from_type(scan_ctx->scan_request.radio_cfg->type), + radio_get_scan_name_from_type(scan_ctx->scan_request.scan_type), + scan_ctx->scan_request.chan_list[0]); ++ } + sm_scan_ctx_free(scan_ctx); scan_ctx = NULL; -@@ -163,6 +169,13 @@ clean: +@@ -163,6 +171,13 @@ clean: if (scan_ctx) { scan_status = true; @@ -29,7 +31,7 @@ Index: opensync-2.0.5.0/src/sm/src/sm_scan_schedule.c rc = sm_scan_schedule_process ( scan_ctx); -@@ -303,6 +316,12 @@ bool sm_scan_schedule( +@@ -303,6 +318,12 @@ bool sm_scan_schedule( if (NULL == scan_in_progress) { /* Trigger the scan and wait for results */ diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/stats_nl80211.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/stats_nl80211.c index fe4d5eff6..0e05524b0 100644 --- a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/stats_nl80211.c +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/stats_nl80211.c @@ -383,25 +383,29 @@ struct nl80211_scan *nl80211_scan_find(const char *name) return nl80211_scan; } -static int nl80211_scan_add(char *name, target_scan_cb_t *scan_cb, void *scan_ctx) +static struct nl80211_scan * +nl80211_scan_add(char *name, target_scan_cb_t *scan_cb, void *scan_ctx) { struct nl80211_scan *nl80211_scan = avl_find_element(&nl80211_scan_tree, name, nl80211_scan, avl); - if (nl80211_scan) - nl80211_scan_del(nl80211_scan); - - nl80211_scan = malloc(sizeof(*nl80211_scan)); - if (!nl80211_scan) - return -1; - memset(nl80211_scan, 0, sizeof(*nl80211_scan)); - strncpy(nl80211_scan->name, name, IF_NAMESIZE); - nl80211_scan->avl.key = nl80211_scan->name; - avl_insert(&nl80211_scan_tree, &nl80211_scan->avl); - LOGD("%s: added scan context", name); + if (!nl80211_scan) { + nl80211_scan = malloc(sizeof(*nl80211_scan)); + if (!nl80211_scan) + return NULL; + memset(nl80211_scan, 0, sizeof(*nl80211_scan)); + strncpy(nl80211_scan->name, name, IF_NAMESIZE); + nl80211_scan->avl.key = nl80211_scan->name; + avl_insert(&nl80211_scan_tree, &nl80211_scan->avl); + LOGD("%s: added scan context. avl:%p. scan_ctx:%p", + name, nl80211_scan, scan_ctx); + } else { + LOGD("nl80211_scan_add: %s: Reusing the avl:%p. scan_ctx:%p\n", + name, nl80211_scan, nl80211_scan->scan_ctx); + } nl80211_scan->scan_cb = scan_cb; nl80211_scan->scan_ctx = scan_ctx; - return 0; + return nl80211_scan; } static void nl80211_scan_del(struct nl80211_scan *nl80211_scan) @@ -415,10 +419,15 @@ static void nl80211_scan_del(struct nl80211_scan *nl80211_scan) static void nl80211_scan_finish(char *name, bool state) { struct nl80211_scan *nl80211_scan = nl80211_scan_find(name); + target_scan_cb_t *scan_cb; + void *scan_ctx; if (nl80211_scan) { LOGD("%s: calling context cb", nl80211_scan->name); - (*nl80211_scan->scan_cb)(nl80211_scan->scan_ctx, state); + scan_cb = nl80211_scan->scan_cb; + scan_ctx = nl80211_scan->scan_ctx; + nl80211_scan_del(nl80211_scan); + (*scan_cb)(scan_ctx, state); } } @@ -572,6 +581,7 @@ int nl80211_scan_trigger(struct nl_call_param *nl_call_param, uint32_t *chan_lis unsigned int i, flags = 0; int ret = 0; uint32_t oper_chan; + struct nl80211_scan *nl80211_scan; if (!msg) return -1; @@ -606,15 +616,17 @@ int nl80211_scan_trigger(struct nl_call_param *nl_call_param, uint32_t *chan_lis } nla_nest_end(msg, freq); - ret = nl80211_scan_add(nl_call_param->ifname, scan_cb, scan_ctx); - if (ret ) { + nl80211_scan = nl80211_scan_add(nl_call_param->ifname, scan_cb, scan_ctx); + if (nl80211_scan == NULL) { LOG(DEBUG,"%s: scan add failed %d\n", nl_call_param->ifname, ret); return -1; } ret = unl_genl_request(&unl_req, msg, nl80211_scan_trigger_recv, NULL); - if (ret) + if (ret) { + nl80211_scan_del(nl80211_scan); LOG(DEBUG, "%s: scan request failed %d\n", nl_call_param->ifname, ret); + } return ret; }