Skip to content

Commit ca52936

Browse files
xuchaojiexiaoxiang781216
authored andcommitted
wapi: Add pscan cmd to trigger a passive scan.
Added scanning in passive mode without affecting the scan command. Signed-off-by: xuchaojie <[email protected]>
1 parent a16fb23 commit ca52936

File tree

3 files changed

+103
-9
lines changed

3 files changed

+103
-9
lines changed

include/wireless/wapi.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,31 @@ int wapi_scan_channel_init(int sock, FAR const char *ifname,
707707
FAR const char *essid,
708708
uint8_t *channels, int num_channels);
709709

710+
/****************************************************************************
711+
* Name: wapi_escan_init
712+
*
713+
* Description:
714+
* Starts a extended scan on the given interface, you can specify the scan
715+
* type. Root privileges are required to start a scan.
716+
*
717+
****************************************************************************/
718+
719+
int wapi_escan_init(int sock, FAR const char *ifname,
720+
uint8_t scan_type, FAR const char *essid);
721+
722+
/****************************************************************************
723+
* Name: wapi_escan_channel_init
724+
*
725+
* Description:
726+
* Starts a scan on the given interface. Root privileges are required to
727+
* start a scan with specified channels.
728+
*
729+
****************************************************************************/
730+
731+
int wapi_escan_channel_init(int sock, FAR const char *ifname,
732+
uint8_t scan_type, FAR const char *essid,
733+
uint8_t *channels, int num_channels);
734+
710735
/****************************************************************************
711736
* Name: wapi_scan_stat
712737
*

wireless/wapi/src/wapi.c

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ static int wapi_bitrate_cmd (int sock, int argc, FAR char **argv);
9797
static int wapi_txpower_cmd (int sock, int argc, FAR char **argv);
9898
static int wapi_scan_results_cmd (int sock, int argc, FAR char **argv);
9999
static int wapi_scan_cmd (int sock, int argc, FAR char **argv);
100+
static int wapi_pscan_cmd (int sock, int argc, FAR char **argv);
100101
static int wapi_country_cmd (int sock, int argc, FAR char **argv);
101102
static int wapi_sense_cmd (int sock, int argc, FAR char **argv);
102103
#ifdef CONFIG_WIRELESS_WAPI_INITCONF
@@ -114,6 +115,7 @@ static const struct wapi_command_s g_wapi_commands[] =
114115
{"help", 0, 0, NULL},
115116
{"show", 1, 1, wapi_show_cmd},
116117
{"scan", 1, 2, wapi_scan_cmd},
118+
{"pscan", 1, 2, wapi_pscan_cmd},
117119
{"scan_results", 1, 1, wapi_scan_results_cmd},
118120
{"ip", 2, 2, wapi_ip_cmd},
119121
{"mask", 2, 2, wapi_mask_cmd},
@@ -833,7 +835,8 @@ static int wapi_scan_results_cmd(int sock, int argc, FAR char **argv)
833835
* Name: wapi_scan_cmd
834836
*
835837
* Description:
836-
* Scans available APs in the range using given ifname interface.
838+
* Use the given ifname interface and active mode to scan the APs
839+
* available in the range.
837840
*
838841
* Returned Value:
839842
* None
@@ -849,7 +852,37 @@ static int wapi_scan_cmd(int sock, int argc, FAR char **argv)
849852

850853
/* Start scan */
851854

852-
ret = wapi_scan_init(sock, argv[0], essid);
855+
ret = wapi_escan_init(sock, argv[0], IW_SCAN_TYPE_ACTIVE, essid);
856+
if (ret < 0)
857+
{
858+
return ret;
859+
}
860+
861+
return wapi_scan_results_cmd(sock, 1, argv);
862+
}
863+
864+
/****************************************************************************
865+
* Name: wapi_pscan_cmd
866+
*
867+
* Description:
868+
* Use the given ifname interface and passive mode to scan the APs
869+
* available in the range.
870+
*
871+
* Returned Value:
872+
* None
873+
*
874+
****************************************************************************/
875+
876+
static int wapi_pscan_cmd(int sock, int argc, FAR char **argv)
877+
{
878+
FAR const char *essid;
879+
int ret;
880+
881+
essid = argc > 1 ? argv[1] : NULL;
882+
883+
/* Start scan */
884+
885+
ret = wapi_escan_init(sock, argv[0], IW_SCAN_TYPE_PASSIVE, essid);
853886
if (ret < 0)
854887
{
855888
return ret;
@@ -1095,6 +1128,7 @@ static void wapi_showusage(FAR const char *progname, int exitcode)
10951128
fprintf(stderr, "Usage:\n");
10961129
fprintf(stderr, "\t%s show <ifname>\n", progname);
10971130
fprintf(stderr, "\t%s scan <ifname>\n", progname);
1131+
fprintf(stderr, "\t%s pscan <ifname>\n", progname);
10981132
fprintf(stderr, "\t%s scan_results <ifname>\n", progname);
10991133
fprintf(stderr, "\t%s ip <ifname> <IP address>\n", progname);
11001134
fprintf(stderr, "\t%s mask <ifname> <mask>\n", progname);

wireless/wapi/src/wireless.c

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,6 +1183,23 @@ int wapi_set_txpower(int sock, FAR const char *ifname, int power,
11831183
int wapi_scan_channel_init(int sock, FAR const char *ifname,
11841184
FAR const char *essid,
11851185
uint8_t *channels, int num_channels)
1186+
{
1187+
return wapi_escan_channel_init(sock, ifname, IW_SCAN_TYPE_ACTIVE, essid,
1188+
channels, num_channels);
1189+
}
1190+
1191+
/****************************************************************************
1192+
* Name: wapi_escan_channel_init
1193+
*
1194+
* Description:
1195+
* Starts a scan on the given interface. Root privileges are required to
1196+
* start a scan with specified channels.
1197+
*
1198+
****************************************************************************/
1199+
1200+
int wapi_escan_channel_init(int sock, FAR const char *ifname,
1201+
uint8_t scan_type, FAR const char *essid,
1202+
uint8_t *channels, int num_channels)
11861203
{
11871204
struct iw_scan_req req;
11881205
struct iwreq wrq =
@@ -1193,16 +1210,13 @@ int wapi_scan_channel_init(int sock, FAR const char *ifname,
11931210
int ret;
11941211
int i;
11951212

1213+
memset(&req, 0, sizeof(req));
1214+
11961215
if (essid && (essid_len = strlen(essid)) > 0)
11971216
{
1198-
memset(&req, 0, sizeof(req));
1199-
req.essid_len = essid_len;
1200-
req.bssid.sa_family = ARPHRD_ETHER;
1201-
memset(req.bssid.sa_data, 0xff, IFHWADDRLEN);
1217+
req.essid_len = essid_len;
12021218
memcpy(req.essid, essid, essid_len);
1203-
wrq.u.data.pointer = (caddr_t)&req;
1204-
wrq.u.data.length = sizeof(req);
1205-
wrq.u.data.flags = IW_SCAN_THIS_ESSID;
1219+
wrq.u.data.flags = IW_SCAN_THIS_ESSID;
12061220
}
12071221

12081222
if (channels && num_channels > 0)
@@ -1214,6 +1228,12 @@ int wapi_scan_channel_init(int sock, FAR const char *ifname,
12141228
}
12151229
}
12161230

1231+
req.scan_type = scan_type;
1232+
req.bssid.sa_family = ARPHRD_ETHER;
1233+
memset(req.bssid.sa_data, 0xff, IFHWADDRLEN);
1234+
wrq.u.data.pointer = (caddr_t)&req;
1235+
wrq.u.data.length = sizeof(req);
1236+
12171237
strlcpy(wrq.ifr_name, ifname, IFNAMSIZ);
12181238
ret = ioctl(sock, SIOCSIWSCAN, (unsigned long)((uintptr_t)&wrq));
12191239
if (ret < 0)
@@ -1240,6 +1260,21 @@ int wapi_scan_init(int sock, FAR const char *ifname, FAR const char *essid)
12401260
return wapi_scan_channel_init(sock, ifname, essid, NULL, 0);
12411261
}
12421262

1263+
/****************************************************************************
1264+
* Name: wapi_escan_init
1265+
*
1266+
* Description:
1267+
* Starts a extended scan on the given interface, you can specify the scan
1268+
* type. Root privileges are required to start a scan.
1269+
*
1270+
****************************************************************************/
1271+
1272+
int wapi_escan_init(int sock, FAR const char *ifname,
1273+
uint8_t scan_type, FAR const char *essid)
1274+
{
1275+
return wapi_escan_channel_init(sock, ifname, scan_type, essid, NULL, 0);
1276+
}
1277+
12431278
/****************************************************************************
12441279
* Name: wapi_scan_stat
12451280
*

0 commit comments

Comments
 (0)