From 7612221df6d9ebe968518ec982e82c9d1af670bc Mon Sep 17 00:00:00 2001 From: "chao.an" Date: Thu, 26 Dec 2019 17:37:12 +0800 Subject: [PATCH] apps/wireless/wapi/scan: Add frequency/rssi printf Scan print layout: nsh> wapi scan wlan0 bssid / frequency / signal level / ssid **:**:**:**:**:** 2437 -38 **:**:**:**:**:** 2427 -36 ... --- include/wireless/wapi.h | 2 + wireless/wapi/src/wapi.c | 5 ++- wireless/wapi/src/wireless.c | 74 +++++++++++++++++++++++++++++------- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/include/wireless/wapi.h b/include/wireless/wapi.h index 6630905b1..ac0bce2ee 100644 --- a/include/wireless/wapi.h +++ b/include/wireless/wapi.h @@ -181,6 +181,8 @@ struct wapi_scan_info_s enum wapi_mode_e mode; int has_bitrate; int bitrate; + int has_rssi; + int rssi; }; /* Linked list container for routing table rows. */ diff --git a/wireless/wapi/src/wapi.c b/wireless/wapi/src/wapi.c index a498f8fe2..0d656baa1 100644 --- a/wireless/wapi/src/wapi.c +++ b/wireless/wapi/src/wapi.c @@ -747,13 +747,14 @@ static void wapi_scan_cmd(int sock, FAR const char *ifname) /* Print found aps */ + printf("bssid / frequency / signal level / ssid\n"); for (info = list.head.scan; info; info = info->next) { - printf(" %02x:%02x:%02x:%02x:%02x:%02x %s\n", + printf("%02x:%02x:%02x:%02x:%02x:%02x\t%g\t%d\t%s\n", info->ap.ether_addr_octet[0], info->ap.ether_addr_octet[1], info->ap.ether_addr_octet[2], info->ap.ether_addr_octet[3], info->ap.ether_addr_octet[4], info->ap.ether_addr_octet[5], - (info->has_essid ? info->essid : "")); + info->freq, info->rssi, info->essid); } /* Free ap list */ diff --git a/wireless/wapi/src/wireless.c b/wireless/wapi/src/wireless.c index f58b4ddf2..293c7fa89 100644 --- a/wireless/wapi/src/wireless.c +++ b/wireless/wapi/src/wireless.c @@ -342,9 +342,35 @@ static int wapi_scan_event(FAR struct iw_event *event, } case SIOCGIWFREQ: - info->has_freq = 1; - info->freq = wapi_freq2float(&(event->u.freq)); - break; + { + info->has_freq = 1; + + if (event->u.freq.e == 0) + { + /* Some drivers do not report frequency, but a channel. + * Try to map this to frequency by assuming they are using + * IEEE 802.11b/g. But don't overwrite a previously parsed + * frequency if the driver sends both frequency and channel, + * since the driver may be sending an A-band channel that we + * don't handle here. + */ + + if (event->u.freq.m >= 1 && event->u.freq.m <= 13) + { + info->freq = 2407 + 5 * event->u.freq.m; + } + else if (event->u.freq.m == 14) + { + info->freq = 2484; + } + } + else + { + info->freq = wapi_freq2float(&(event->u.freq)); + } + + break; + } case SIOCGIWMODE: { @@ -361,16 +387,19 @@ static int wapi_scan_event(FAR struct iw_event *event, } case SIOCGIWESSID: - info->has_essid = 1; - info->essid_flag = (event->u.data.flags) ? WAPI_ESSID_ON - : WAPI_ESSID_OFF; - memset(info->essid, 0, (WAPI_ESSID_MAX_SIZE + 1)); - if ((event->u.essid.pointer) && (event->u.essid.length)) - { - memcpy(info->essid, event->u.essid.pointer, event->u.essid.length); - } + { + info->has_essid = 1; + info->essid_flag = (event->u.data.flags) ? WAPI_ESSID_ON + : WAPI_ESSID_OFF; + memset(info->essid, 0, (WAPI_ESSID_MAX_SIZE + 1)); + if ((event->u.essid.pointer) && (event->u.essid.length)) + { + memcpy(info->essid, event->u.essid.pointer, + event->u.essid.length); + } - break; + break; + } case SIOCGIWRATE: @@ -383,7 +412,26 @@ static int wapi_scan_event(FAR struct iw_event *event, info->has_bitrate = 1; info->bitrate = event->u.bitrate.value; } + break; + + case IWEVQUAL: + { + if (event->u.qual.updated & IW_QUAL_DBM) + { + info->has_rssi = 1; + info->rssi = event->u.qual.level; + + /* Report signal levels in dBm */ + + if (info->rssi >= 0x40) + { + info->rssi -= 0x100; + } + } + + break; + } } return 0; @@ -1237,8 +1285,6 @@ alloc: return -errcode; } - printf("got %d bytes\n", wrq.u.data.length); - /* We have the results, process them. */ if (wrq.u.data.length)