1 /*-----------------------------------------------------------------------------
3 * Purpose: WiFi driver test cases
4 *----------------------------------------------------------------------------
5 * Copyright(c) KEIL - An ARM Company
6 *----------------------------------------------------------------------------*/
10 - Bypass mode and functionality is not tested
11 - Set/GetOption API does not test IPv6 options
12 - SetOption operation is not tested, only API is tested
13 (BSSID, MAC, static IP operation testing would require dedicated hardware
14 with manual check of results on dedicated hardware)
15 - WPS operation is not tested (not Station nor AP)
16 (WPS functional testing would require dedicated hardware
17 with manual check of results WPS AP, WPS on Station could
18 be checked by comparing parameters with expected result (configured))
19 - WiFi sockets tested in blocking mode only
20 - WiFi sockets not tested for IPv6
24 #include "DV_Config.h"
25 #include "DV_Framework.h"
26 #include "Driver_WiFi.h"
32 #define ECHO_PORT 7 // Echo port number
33 #define DISCARD_PORT 9 // Discard port number
34 #define CHARGEN_PORT 19 // Chargen port number
35 #define ASSISTANT_PORT 5000 // Test Assistant port number
36 #define TCP_REJECTED_PORT 5001 // Rejected connection server TCP port
37 #define TCP_TIMEOUT_PORT 5002 // Non-responding server TCP port
39 /* Helper function identifiers */
40 #define F_CREATE 0x00000001
41 #define F_CREATE_TCP F_CREATE // Never used with CREATE
42 #define F_CREATE_UDP 0x00000002
43 #define F_CLOSE 0x00000004
44 #define F_BIND 0x00000008
45 #define F_LISTEN 0x00000010
46 #define F_ACCEPT 0x00000020
47 #define F_CONNECT 0x00000040
48 #define F_RECV 0x00000080
49 #define F_RECVFROM 0x00000100
50 #define F_SEND 0x00000200
51 #define F_SENDTO 0x00000400
52 #define F_GETSOCKNAME 0x00000800
53 #define F_GETPEERNAME 0x00001000
54 #define F_GETOPT 0x00002000
55 #define F_SETOPT 0x00004000
56 #define F_GETHOSTBYNAME 0x00008000
57 #define F_PING 0x00010000
58 #define F_SEND_CTRL F_PING // Never used with PING
59 #define F_XFER_FIXED 0x00020000
60 #define F_XFER_INCR 0x00040000
61 #define F_SEND_FRAG 0x00080000
62 #define F_UPLOAD F_SEND_FRAG // Never used with SEND_FRAG
63 #define F_RECV_FRAG 0x00100000
64 #define F_DOWNLOAD F_RECV_FRAG // Never used with RECV_FRAG
65 #define F_ALL 0x001FFFFF
67 #define SK_TERMINATE 0x00000001
69 /* Helper function return values */
74 /* Register Driver_WiFi# */
75 extern ARM_DRIVER_WIFI ARM_Driver_WiFi_(DRV_WIFI);
76 static ARM_DRIVER_WIFI* drv = &ARM_Driver_WiFi_(DRV_WIFI);
79 static uint8_t powered = 0U;
80 static uint8_t connected = 0U;
81 static uint8_t socket_funcs_exist = 0U;
82 static uint8_t volatile event;
84 static char msg_buf [128];
85 static char data_buf[128] __ALIGNED(4);
87 static ARM_WIFI_SignalEvent_t event_func;
88 static ARM_WIFI_CAPABILITIES cap;
89 static ARM_WIFI_CONFIG_t config;
90 static ARM_WIFI_NET_INFO_t net_info;
91 static ARM_WIFI_SCAN_INFO_t scan_info[WIFI_SCAN_MAX_NUM];
93 static const uint8_t ip_unspec[4] = { 0, 0, 0, 0 };
94 static const uint8_t ip_bcast[4] = { 255, 255, 255, 255 };
95 static uint8_t ip_socket_server[4];
97 /* String representation of Driver return codes */
98 static const char *str_ret[] = {
101 "ARM_DRIVER_ERROR_BUSY",
102 "ARM_DRIVER_ERROR_TIMEOUT",
103 "ARM_DRIVER_ERROR_UNSUPPORTED",
104 "ARM_DRIVER_ERROR_PARAMETER",
105 "ARM_DRIVER_ERROR_SPECIFIC"
108 /* String representation of Driver Socket fucntion's return codes */
109 static const char *str_sock_ret[] = {
114 "ARM_SOCKET_ENOTSUP",
117 "ARM_SOCKET_EINPROGRESS",
118 "ARM_SOCKET_ETIMEDOUT",
119 "ARM_SOCKET_EISCONN",
120 "ARM_SOCKET_ENOTCONN",
121 "ARM_SOCKET_ECONNREFUSED",
122 "ARM_SOCKET_ECONNRESET",
123 "ARM_SOCKET_ECONNABORTED",
124 "ARM_SOCKET_EALREADY",
125 "ARM_SOCKET_EADDRINUSE",
126 "ARM_SOCKET_EHOSTNOTFOUND"
129 /* Test message containing all letters of the alphabet */
130 static const uint8_t test_msg[44] = {
131 "The quick brown fox jumps over the lazy dog."
133 /* Dummy text with normal distribution of letters */
134 static const uint8_t test_buf[2050] = {
135 "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent "
136 "libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum "
137 "imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper "
138 "porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu "
139 "ad litora torquent per conubia nostra, per inceptos himenaeos."
141 "Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. "
142 "Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed "
143 "convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus "
144 "risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula "
145 "lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, "
148 "Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent "
149 "per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non "
150 "tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis turpis. "
151 "Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat "
152 "imperdiet. Vestibulum sapien. Proin quam. Etiam ultrices. Suspendisse in justo eu "
153 "magna luctus suscipit. Sed lectus. Integer euismod lacus luctus magna."
155 "Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna "
156 "augue eget diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices "
157 "posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non "
158 "quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis "
159 "laoreet. Donec lacus nunc, viverra nec, blandit vel, egestas et, augue. Vestibulum "
160 "tincidunt malesuada tellus. Ut ultrices ultrices enim. Curabitur sit amet mauris. "
161 "Morbi in dui quis est pulvinar ullamcorper. Nulla facilisi. Integer lacinia sollicitudin "
164 "Sed aliquet risus a tortor. Integer id quam. Morbi mi. Quisque nisl felis, venenatis "
165 "tristique, dignissim in, ultrices sit amet augue."
167 static uint8_t buffer[2048];
170 static void WIFI_DrvEvent (uint32_t evt, void *arg) {
177 /*-----------------------------------------------------------------------------
179 *----------------------------------------------------------------------------*/
181 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
183 \defgroup wifi_funcs WiFi Validation
184 \brief WiFi test cases
186 The WiFi validation test performs the following checks:
187 - API interface compliance.
188 - Some of Control and Management operation.
189 - Socket operation with various transfer sizes and communication parameters.
190 - Socket performance tests.
193 /* Helper function that initializes and powers on WiFi Module if not initialized and powered */
194 static int32_t init_and_power_on (void) {
197 if ((drv->Initialize (event_func) == ARM_DRIVER_OK) &&
198 (drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK)) {
208 /* Helper function that is called before tests start executing */
209 void WIFI_DV_Initialize (void) {
211 sscanf(WIFI_SOCKET_SERVER_IP, "%hhu.%hhu.%hhu.%hhu", &ip_socket_server[0], &ip_socket_server[1], &ip_socket_server[2], &ip_socket_server[3]);
213 cap = drv->GetCapabilities();
216 if ((cap.event_eth_rx_frame != 0U) ||
217 (cap.event_ap_connect != 0U) ||
218 (cap.event_ap_disconnect != 0U)) {
219 event_func = WIFI_DrvEvent;
222 if ((drv->SocketCreate != NULL) &&
223 (drv->SocketBind != NULL) &&
224 (drv->SocketListen != NULL) &&
225 (drv->SocketAccept != NULL) &&
226 (drv->SocketConnect != NULL) &&
227 (drv->SocketRecv != NULL) &&
228 (drv->SocketRecvFrom != NULL) &&
229 (drv->SocketSend != NULL) &&
230 (drv->SocketSendTo != NULL) &&
231 (drv->SocketGetSockName != NULL) &&
232 (drv->SocketGetPeerName != NULL) &&
233 (drv->SocketGetOpt != NULL) &&
234 (drv->SocketSetOpt != NULL) &&
235 (drv->SocketClose != NULL) &&
236 (drv->SocketGetHostByName != NULL)) {
237 socket_funcs_exist = 1U;
241 /* Helper function that is called after tests stop executing */
242 void WIFI_DV_Uninitialize (void) {
244 if (connected != 0U) {
245 if (drv->Deactivate (0U) == ARM_DRIVER_OK) {
250 if ((drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK) &&
251 (drv->Uninitialize () == ARM_DRIVER_OK)) {
257 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
258 /* WiFi Control tests */
259 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
261 \defgroup wifi_ctrl WiFi Control
264 These tests verify API and operation of the WiFi control functions.
269 \brief Test case: WIFI_GetVersion
271 The test case \b WIFI_GetVersion verifies the WiFi Driver \b GetVersion function.
273 ARM_DRIVER_VERSION (*GetVersion) (void);
276 void WIFI_GetVersion (void) {
277 ARM_DRIVER_VERSION ver;
279 ver = drv->GetVersion();
281 TEST_ASSERT((ver.api >= ARM_DRIVER_VERSION_MAJOR_MINOR(1,0)) && (ver.drv >= ARM_DRIVER_VERSION_MAJOR_MINOR(1,0)));
283 snprintf(msg_buf, sizeof(msg_buf), "[INFO] Driver API version %d.%d, Driver version %d.%d", (ver.api >> 8), (ver.api & 0xFFU), (ver.drv >> 8), (ver.drv & 0xFFU));
284 TEST_MESSAGE(msg_buf);
287 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
289 \brief Test case: WIFI_GetCapabilities
291 The test case \b WIFI_GetCapabilities verifies the WiFi Driver \b GetCapabilities function.
293 ARM_WIFI_CAPABILITIES (*GetCapabilities) (void);
296 void WIFI_GetCapabilities (void) {
298 cap = drv->GetCapabilities();
300 TEST_ASSERT_MESSAGE((cap.station_ap != 0U) || (cap.station != 0U) || (cap.ap != 0U), "At least 1 mode must be supported");
302 if (cap.wps_station != 0U) {
303 TEST_ASSERT_MESSAGE((cap.station_ap != 0U) || (cap.station != 0U), "If WPS for station is supported version of station mode of operation must be supported also");
306 if (cap.wps_ap != 0U) {
307 TEST_ASSERT_MESSAGE((cap.station_ap != 0U) || (cap.ap != 0U), "If WPS for AP is supported version of AP mode of operation must be supported also");
310 if ((cap.event_ap_connect != 0U) || (cap.event_ap_disconnect != 0U)) {
311 TEST_ASSERT_MESSAGE((cap.station_ap != 0U) || (cap.ap != 0U), "If events for AP are supported version of AP mode of operation must be supported also");
314 if (cap.event_eth_rx_frame != 0U) {
315 TEST_ASSERT_MESSAGE(cap.bypass_mode != 0U, "If event for Ethernet Rx frame is supported, bypass mode must be supported also");
319 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
321 \brief Test case: WIFI_Initialize/Uninitialize
323 The test case \b WIFI_Initialize_Uninitialize verifies the WiFi Driver \b Initialize and \b Uninitialize functions.
325 int32_t (*Initialize) (ARM_WIFI_SignalEvent_t cb_event);
329 int32_t (*Uninitialize) (void);
332 - Initialize without callback
334 - Initialize with callback (if driver supports it)
337 - Initialize without callback
342 void WIFI_Initialize_Uninitialize (void) {
345 if ((cap.event_eth_rx_frame != 0U) ||
346 (cap.event_ap_connect != 0U) ||
347 (cap.event_ap_disconnect != 0U)) {
348 event_func = WIFI_DrvEvent;
351 TEST_ASSERT(drv->Initialize (NULL) == ARM_DRIVER_OK);
352 TEST_ASSERT(drv->Uninitialize () == ARM_DRIVER_OK);
353 TEST_ASSERT(drv->Initialize (event_func) == ARM_DRIVER_OK);
354 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
355 TEST_ASSERT(drv->Uninitialize () == ARM_DRIVER_OK);
356 TEST_ASSERT(drv->Initialize (NULL) == ARM_DRIVER_OK);
357 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
358 ret = drv->PowerControl (ARM_POWER_OFF);
359 TEST_ASSERT((ret == ARM_DRIVER_OK) || (ret == ARM_DRIVER_ERROR_UNSUPPORTED));
360 TEST_ASSERT(drv->Uninitialize () == ARM_DRIVER_OK);
363 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
365 \brief Test case: WIFI_PowerControl
367 The test case \b WIFI_PowerControl verifies the WiFi Driver \b PowerControl function.
369 int32_t (*PowerControl) (ARM_POWER_STATE state);
373 - Initialize with callback (if driver supports it)
381 void WIFI_PowerControl (void) {
384 ret = drv->PowerControl (ARM_POWER_OFF);
385 TEST_ASSERT(ret == ARM_DRIVER_ERROR);
386 TEST_ASSERT(drv->Initialize (event_func) == ARM_DRIVER_OK);
387 ret = drv->PowerControl (ARM_POWER_OFF);
388 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
389 TEST_MESSAGE("[WARNING] PowerControl (ARM_POWER_OFF) not supported");
391 TEST_ASSERT(ret == ARM_DRIVER_OK);
393 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
394 TEST_ASSERT(drv->Scan (scan_info, WIFI_SCAN_MAX_NUM) >= 0);
397 ret = drv->PowerControl (ARM_POWER_LOW);
402 case ARM_DRIVER_ERROR_UNSUPPORTED:
403 TEST_MESSAGE("[WARNING] PowerControl (ARM_POWER_LOW) is not supported");
407 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] PowerControl (ARM_POWER_LOW) returned %s", str_ret[-ret]);
408 TEST_MESSAGE(msg_buf);
412 drv->PowerControl (ARM_POWER_OFF);
413 drv->Uninitialize ();
416 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
418 \brief Test case: WIFI_GetModuleInfo
420 The test case \b WIFI_GetModuleInfo verifies the WiFi Driver \b GetModuleInfo function.
422 int32_t (*GetModuleInfo) (char *module_info, uint32_t max_len);
425 void WIFI_GetModuleInfo (void) {
428 if (init_and_power_on () == 0) {
429 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
433 ret = drv->GetModuleInfo(NULL, sizeof(data_buf));
434 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
435 TEST_MESSAGE("[WARNING] GetModuleInfo (...) not supported");
437 TEST_ASSERT(ret == ARM_DRIVER_ERROR_PARAMETER);
439 ret = drv->GetModuleInfo(data_buf, 0U);
440 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
441 TEST_MESSAGE("[WARNING] GetModuleInfo (...) not supported");
443 TEST_ASSERT(ret == ARM_DRIVER_ERROR_PARAMETER);
446 memset((void *)data_buf, 0xCC, sizeof(data_buf));
447 ret = drv->GetModuleInfo(data_buf, sizeof(data_buf));
450 TEST_ASSERT(strlen(data_buf) != 0);
452 case ARM_DRIVER_ERROR_UNSUPPORTED:
453 TEST_MESSAGE("[WARNING] GetModuleInfo () is not supported");
456 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] GetModuleInfo () returned %s", str_ret[-ret]);
457 TEST_MESSAGE(msg_buf);
466 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
467 /* WiFi Management tests */
468 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
470 \defgroup wifi_mgmt WiFi Management
473 These tests verify API and operation of the WiFi management functions.
477 #if (WIFI_SETGETOPTION_BSSID_EN != 0)
478 static void WIFI_SetOption_GetOption_BSSID (void) {
479 #if ((WIFI_SETGETOPTION_BSSID_EN & 1) != 0)
480 uint8_t u8_arr[8] __ALIGNED(4);
481 uint8_t bssid[7] __ALIGNED(4);
483 #if ((WIFI_SETGETOPTION_BSSID_EN & 2) != 0)
486 uint8_t not_suported;
490 if (init_and_power_on () == 0) {
491 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
495 #if ((WIFI_SETGETOPTION_BSSID_EN & 1) != 0)
497 memset((void *)bssid, 0x11, 7);
498 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_ERROR_PARAMETER);
499 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_ERROR_PARAMETER);
501 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
502 TEST_ASSERT(sscanf((const char *)WIFI_BSSID_STA, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &bssid[0], &bssid[1], &bssid[2], &bssid[3], &bssid[4], &bssid[5]) == 6);
503 memset((void *) u8_arr, 0xCC, 8);
504 memcpy((void *)&u8_arr[1], (const void *)bssid, 6);
505 if (drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
506 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
507 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
508 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 0U) == ARM_DRIVER_ERROR_PARAMETER);
509 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 5U) == ARM_DRIVER_ERROR_PARAMETER);
510 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, &u8_arr[1], 6U) == ARM_DRIVER_OK);
511 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, &u8_arr[1], 7U) == ARM_DRIVER_OK);
512 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 7U) == ARM_DRIVER_OK);
513 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
516 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BSSID for Station is not supported");
519 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
520 TEST_ASSERT(sscanf((const char *)WIFI_BSSID_AP, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &bssid[0], &bssid[1], &bssid[2], &bssid[3], &bssid[4], &bssid[5]) == 6);
521 memset((void *) u8_arr, 0xCC, 8);
522 memcpy((void *)&u8_arr[1], (const void *)bssid, 6);
523 if (drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
524 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
525 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
526 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 0U) == ARM_DRIVER_ERROR_PARAMETER);
527 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 5U) == ARM_DRIVER_ERROR_PARAMETER);
528 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, &u8_arr[1], 6U) == ARM_DRIVER_OK);
529 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, &u8_arr[1], 7U) == ARM_DRIVER_OK);
530 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 7U) == ARM_DRIVER_OK);
531 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
534 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BSSID for Access Point is not supported");
539 #if ((WIFI_SETGETOPTION_BSSID_EN & 2) != 0)
542 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
543 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
545 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
547 if (drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
549 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
551 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
553 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
555 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
557 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
559 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
561 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
563 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
566 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BSSID for Station is not supported");
569 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
571 if (drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
573 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
575 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
577 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
579 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
581 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
583 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
585 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
587 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
590 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BSSID for Access Point is not supported");
595 #if ((WIFI_SETGETOPTION_BSSID_EN & 3) == 3)
596 // Check with Get that Set has written the correct values
597 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
598 TEST_ASSERT(sscanf((const char *)WIFI_BSSID_STA, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &bssid[0], &bssid[1], &bssid[2], &bssid[3], &bssid[4], &bssid[5]) == 6);
599 memset((void *)data_buf, 0xCC, sizeof(data_buf));
601 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
602 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
603 TEST_ASSERT(len == 6U);
604 TEST_ASSERT(memcmp((const void *)bssid, (const void *)data_buf, (size_t)len) == 0);
606 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
607 TEST_ASSERT(sscanf((const char *)WIFI_BSSID_AP, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &bssid[0], &bssid[1], &bssid[2], &bssid[3], &bssid[4], &bssid[5]) == 6);
608 memset((void *)data_buf, 0xCC, sizeof(data_buf));
610 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
611 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
612 TEST_ASSERT(len == 6U);
613 TEST_ASSERT(memcmp((const void *)bssid, (const void *)data_buf, (size_t)len) == 0);
619 #if (WIFI_SETGETOPTION_TX_POWER_EN != 0)
620 static void WIFI_SetOption_GetOption_TX_POWER (void) {
621 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 1) != 0)
624 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 2) != 0)
627 uint8_t not_suported;
631 if (init_and_power_on () == 0) {
632 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
636 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 1) != 0)
638 power = WIFI_TX_POWER_STA;
639 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_ERROR_PARAMETER);
640 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_ERROR_PARAMETER);
642 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
643 power = WIFI_TX_POWER_STA;
644 if (drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
645 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
646 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
647 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 0U) == ARM_DRIVER_ERROR_PARAMETER);
648 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 3U) == ARM_DRIVER_ERROR_PARAMETER);
649 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 5U) == ARM_DRIVER_OK);
650 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
653 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_TX_POWER for Station is not supported");
656 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
657 power = WIFI_TX_POWER_AP;
658 if (drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
659 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
660 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
661 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 0U) == ARM_DRIVER_ERROR_PARAMETER);
662 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 3U) == ARM_DRIVER_ERROR_PARAMETER);
663 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 5U) == ARM_DRIVER_OK);
664 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
667 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_TX_POWER for Access Point is not supported");
672 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 2) != 0)
675 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
676 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
678 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
680 if (drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
682 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
684 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
686 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
688 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
690 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
692 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
695 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_TX_POWER for Station is not supported");
698 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
700 if (drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
702 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
704 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
706 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
708 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
710 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
712 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
715 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_TX_POWER for Access Point is not supported");
720 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 3) == 3)
721 // Check with Get that Set has written the correct values
722 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
723 power = WIFI_TX_POWER_STA;
725 memset((void *)data_buf, 0xCC, sizeof(data_buf));
726 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
727 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
728 TEST_ASSERT(len == 4U);
729 TEST_ASSERT(memcmp((const void *)&power, (const void *)data_buf, (size_t)len) == 0);
731 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
732 power = WIFI_TX_POWER_AP;
734 memset((void *)data_buf, 0xCC, sizeof(data_buf));
735 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
736 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
737 TEST_ASSERT(len == 4U);
738 TEST_ASSERT(memcmp((const void *)&power, (const void *)data_buf, (size_t)len) == 0);
744 #if (WIFI_SETGETOPTION_LP_TIMER_EN != 0)
745 static void WIFI_SetOption_GetOption_LP_TIMER (void) {
746 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 1) != 0)
749 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 2) != 0)
752 uint8_t not_suported;
756 if (init_and_power_on () == 0) {
757 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
761 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 1) != 0)
763 time = WIFI_LP_TIMER_STA;
764 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
765 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
767 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
768 time = WIFI_LP_TIMER_STA;
769 if (drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
770 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
771 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
772 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 0U) == ARM_DRIVER_ERROR_PARAMETER);
773 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 3U) == ARM_DRIVER_ERROR_PARAMETER);
774 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 5U) == ARM_DRIVER_OK);
775 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_OK);
778 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_LP_TIMER for Station is not supported");
781 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
782 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
786 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 2) != 0)
789 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
790 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
792 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
794 if (drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
796 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
798 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
800 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
802 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
804 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
806 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
809 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_LP_TIMER for Station is not supported");
812 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
814 TEST_ASSERT (drv->GetOption (1U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
818 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 3) == 3)
819 // Check with Get that Set has written the correct values
820 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
821 time = WIFI_LP_TIMER_STA;
823 memset((void *)data_buf, 0xCC, sizeof(data_buf));
824 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_OK);
825 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
826 TEST_ASSERT(len == 4U);
827 TEST_ASSERT(memcmp((const void *)&time, (const void *)data_buf, (size_t)len) == 0);
833 #if (WIFI_SETGETOPTION_DTIM_EN != 0)
834 static void WIFI_SetOption_GetOption_DTIM (void) {
835 #if ((WIFI_SETGETOPTION_DTIM_EN & 1) != 0)
838 #if ((WIFI_SETGETOPTION_DTIM_EN & 2) != 0)
841 uint8_t not_suported;
845 if (init_and_power_on () == 0) {
846 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
850 #if ((WIFI_SETGETOPTION_DTIM_EN & 1) != 0)
852 dtim = WIFI_DTIM_STA;
853 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_ERROR_PARAMETER);
854 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_ERROR_PARAMETER);
856 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
857 dtim = WIFI_DTIM_STA;
858 if (drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
859 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
860 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
861 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 0U) == ARM_DRIVER_ERROR_PARAMETER);
862 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 3U) == ARM_DRIVER_ERROR_PARAMETER);
863 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 5U) == ARM_DRIVER_OK);
864 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
867 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_DTIM for Station is not supported");
870 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
872 if (drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
873 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
874 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
875 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 0U) == ARM_DRIVER_ERROR_PARAMETER);
876 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 3U) == ARM_DRIVER_ERROR_PARAMETER);
877 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 5U) == ARM_DRIVER_OK);
878 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
881 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_DTIM for Access Point is not supported");
886 #if ((WIFI_SETGETOPTION_DTIM_EN & 2) != 0)
889 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
890 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
892 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
894 if (drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
896 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
898 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
900 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
902 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
904 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
906 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
909 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_DTIM for Station is not supported");
912 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
914 if (drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
916 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
918 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
920 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
922 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
924 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
926 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
929 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_DTIM for Access Point is not supported");
934 #if ((WIFI_SETGETOPTION_DTIM_EN & 3) == 3)
935 // Check with Get that Set has written the correct values
936 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
937 dtim = WIFI_DTIM_STA;
939 memset((void *)data_buf, 0xCC, sizeof(data_buf));
940 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
941 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
942 TEST_ASSERT(len == 4U);
943 TEST_ASSERT(memcmp((const void *)&dtim, (const void *)data_buf, (size_t)len) == 0);
945 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
948 memset((void *)data_buf, 0xCC, sizeof(data_buf));
949 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
950 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
951 TEST_ASSERT(len == 4U);
952 TEST_ASSERT(memcmp((const void *)&dtim, (const void *)data_buf, (size_t)len) == 0);
958 #if (WIFI_SETGETOPTION_BEACON_EN != 0)
959 static void WIFI_SetOption_GetOption_BEACON (void) {
960 #if ((WIFI_SETGETOPTION_BEACON_EN & 1) != 0)
963 #if ((WIFI_SETGETOPTION_BEACON_EN & 2) != 0)
966 uint8_t not_suported;
970 if (init_and_power_on () == 0) {
971 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
975 #if ((WIFI_SETGETOPTION_BEACON_EN & 1) != 0)
977 beacon = WIFI_BEACON_AP;
978 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_PARAMETER);
979 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_PARAMETER);
981 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
982 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
984 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
985 beacon = WIFI_BEACON_AP;
986 if (drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
987 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
988 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
989 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 0U) == ARM_DRIVER_ERROR_PARAMETER);
990 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 3U) == ARM_DRIVER_ERROR_PARAMETER);
991 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 5U) == ARM_DRIVER_OK);
992 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_OK);
995 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BEACON for Access Point is not supported");
1000 #if ((WIFI_SETGETOPTION_BEACON_EN & 2) != 0)
1003 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1004 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1006 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1008 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
1010 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1012 if (drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1014 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1016 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1018 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1020 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1022 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1024 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1027 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BEACON for Access Point is not supported");
1032 #if ((WIFI_SETGETOPTION_BEACON_EN & 3) == 3)
1033 // Check with Get that Set has written the correct values
1034 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1035 beacon = WIFI_BEACON_AP;
1037 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1038 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_OK);
1039 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1040 TEST_ASSERT(len == 4U);
1041 TEST_ASSERT(memcmp((const void *)&beacon, (const void *)data_buf, (size_t)len) == 0);
1047 #if (WIFI_SETGETOPTION_MAC_EN != 0)
1048 static void WIFI_SetOption_GetOption_MAC (void) {
1049 #if ((WIFI_SETGETOPTION_MAC_EN & 1) != 0)
1050 uint8_t u8_arr[8] __ALIGNED(4);
1051 uint8_t mac[7] __ALIGNED(4);
1052 uint8_t mac_ap_def[6] __ALIGNED(4);
1053 uint8_t mac_sta_def[6] __ALIGNED(4);
1055 #if ((WIFI_SETGETOPTION_MAC_EN & 2) != 0)
1058 uint8_t not_suported;
1062 if (init_and_power_on () == 0) {
1063 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1067 // Read default MAC so it can be restored at the end of this test case
1068 #if ((WIFI_SETGETOPTION_MAC_EN & 3) == 3)
1069 if (((cap.station_ap != 0) || (cap.station != 0))) {
1071 drv->GetOption (0U, ARM_WIFI_MAC, mac_sta_def, &len);
1073 if ((cap.station_ap != 0) || (cap.ap != 0)) {
1075 drv->GetOption (1U, ARM_WIFI_MAC, mac_ap_def, &len);
1079 #if ((WIFI_SETGETOPTION_MAC_EN & 1) != 0)
1081 memset((void *)mac, 0x11, 7);
1082 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1083 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1085 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1086 TEST_ASSERT(sscanf((const char *)WIFI_MAC_STA, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6);
1087 memset((void *) u8_arr, 0xCC, 8);
1088 memcpy((void *)&u8_arr[1], (const void *)mac, 6);
1089 if (drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1090 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1091 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1092 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1093 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 5U) == ARM_DRIVER_ERROR_PARAMETER);
1094 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, &u8_arr[1], 6U) == ARM_DRIVER_OK);
1095 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, &u8_arr[1], 7U) == ARM_DRIVER_OK);
1096 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 7U) == ARM_DRIVER_OK);
1097 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1100 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_MAC for Station is not supported");
1103 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1104 TEST_ASSERT(sscanf((const char *)WIFI_MAC_AP, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6);
1105 memset((void *) u8_arr, 0xCC, 8);
1106 memcpy((void *)&u8_arr[1], (const void *)mac, 6);
1107 if (drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1108 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1109 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1110 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1111 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 5U) == ARM_DRIVER_ERROR_PARAMETER);
1112 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, &u8_arr[1], 6U) == ARM_DRIVER_OK);
1113 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, &u8_arr[1], 7U) == ARM_DRIVER_OK);
1114 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 7U) == ARM_DRIVER_OK);
1115 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1118 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_MAC for Access Point is not supported");
1123 #if ((WIFI_SETGETOPTION_MAC_EN & 2) != 0)
1126 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1127 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1129 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1131 if (drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1133 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1135 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1137 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1139 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1141 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1143 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1145 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1147 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1150 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_MAC for Station is not supported");
1153 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1155 if (drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1157 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1159 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1161 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1163 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1165 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1167 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1169 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1171 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1174 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_MAC for Access Point is not supported");
1179 #if ((WIFI_SETGETOPTION_MAC_EN & 3) == 3)
1180 // Check with Get that Set has written the correct values
1181 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1182 TEST_ASSERT(sscanf((const char *)WIFI_MAC_STA, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6);
1184 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1185 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1186 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1187 TEST_ASSERT(len == 6U);
1188 TEST_ASSERT(memcmp((const void *)mac, (const void *)data_buf, (size_t)len) == 0);
1190 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1191 TEST_ASSERT(sscanf((const char *)WIFI_MAC_AP, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6);
1193 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1194 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1195 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1196 TEST_ASSERT(len == 6U);
1197 TEST_ASSERT(memcmp((const void *)mac, (const void *)data_buf, (size_t)len) == 0);
1200 // Restore default MAC
1201 if (((cap.station_ap != 0) || (cap.station != 0)) && (memcmp((const void *)mac_sta_def, (const void *)"\0\0\0\0\0\0", 6) != 0)) {
1202 drv->SetOption (0U, ARM_WIFI_MAC, mac_sta_def, 6U);
1204 if (((cap.station_ap != 0) || (cap.ap != 0)) && (memcmp((const void *)mac_ap_def, (const void *)"\0\0\0\0\0\0", 6) != 0)) {
1205 drv->SetOption (1U, ARM_WIFI_MAC, mac_ap_def, 6U);
1211 #if (WIFI_SETGETOPTION_IP_EN != 0)
1212 static void WIFI_SetOption_GetOption_IP (void) {
1213 #if ((WIFI_SETGETOPTION_IP_EN & 1) != 0)
1214 uint32_t u32_0, u32_1;
1215 uint8_t ip[5] __ALIGNED(4);
1217 #if ((WIFI_SETGETOPTION_IP_EN & 2) != 0)
1220 uint8_t not_suported;
1224 if (init_and_power_on () == 0) {
1225 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1229 #if ((WIFI_SETGETOPTION_IP_EN & 1) != 0)
1233 memset((void *)ip, 0, 5);
1234 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1235 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1237 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1238 TEST_ASSERT(sscanf((const char *)WIFI_IP_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1239 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1240 if (drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1241 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1242 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1243 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1244 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1245 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 5U) == ARM_DRIVER_OK);
1246 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1249 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP for Station is not supported");
1251 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1253 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1254 TEST_ASSERT(sscanf((const char *)WIFI_IP_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1255 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1256 if (drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1257 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1258 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1259 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1260 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1261 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 5U) == ARM_DRIVER_OK);
1262 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1265 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP for Access Point is not supported");
1267 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1271 #if ((WIFI_SETGETOPTION_IP_EN & 2) != 0)
1274 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1275 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1277 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1279 if (drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1281 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1283 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1285 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1287 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1289 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1291 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1294 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP for Station is not supported");
1297 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1299 if (drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1301 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1303 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1305 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1307 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1309 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1311 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1314 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP for Access Point is not supported");
1319 #if ((WIFI_SETGETOPTION_IP_EN & 3) == 3)
1320 // Check with Get that Set has written the correct values
1321 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1322 TEST_ASSERT(sscanf((const char *)WIFI_IP_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1324 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1325 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1326 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1327 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1328 TEST_ASSERT(len == 4U);
1329 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1330 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1332 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1333 TEST_ASSERT(sscanf((const char *)WIFI_IP_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1335 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1336 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1337 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1338 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1339 TEST_ASSERT(len == 4U);
1340 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1341 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1347 #if (WIFI_SETGETOPTION_IP_SUBNET_MASK_EN != 0)
1348 static void WIFI_SetOption_GetOption_IP_SUBNET_MASK (void) {
1349 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 1) != 0)
1350 uint32_t u32_0, u32_1;
1351 uint8_t mask[5] __ALIGNED(4);
1353 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 2) != 0)
1356 uint8_t not_suported;
1360 if (init_and_power_on () == 0) {
1361 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1365 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 1) != 0)
1369 memset((void *)mask, 0, 5);
1370 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1371 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1373 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1374 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_STA, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1375 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1376 if (drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1377 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1378 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1379 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1380 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1381 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 5U) == ARM_DRIVER_OK);
1382 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1385 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_SUBNET_MASK for Station is not supported");
1387 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1389 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1390 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_AP, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1391 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1392 if (drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1393 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1394 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1395 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1396 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1397 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 5U) == ARM_DRIVER_OK);
1398 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1401 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_SUBNET_MASK for Access Point is not supported");
1403 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1407 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 2) != 0)
1410 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1411 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1413 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1415 if (drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1417 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1419 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1421 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1423 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1425 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1427 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1430 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_SUBNET_MASK for Station is not supported");
1433 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1435 if (drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1437 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1439 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1441 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1443 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1445 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1447 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1450 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_SUBNET_MASK for Access Point is not supported");
1455 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 3) == 3)
1456 // Check with Get that Set has written the correct values
1457 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1458 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_STA, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1460 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1461 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1462 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1463 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1464 TEST_ASSERT(len == 4U);
1465 TEST_ASSERT(memcmp((const void *)mask, (const void *)data_buf, (size_t)len) == 0);
1466 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1468 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1469 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_AP, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1471 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1472 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1473 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1474 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1475 TEST_ASSERT(len == 4U);
1476 TEST_ASSERT(memcmp((const void *)mask, (const void *)data_buf, (size_t)len) == 0);
1477 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1483 #if (WIFI_SETGETOPTION_IP_GATEWAY_EN != 0)
1484 static void WIFI_SetOption_GetOption_IP_GATEWAY (void) {
1485 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 1) != 0)
1486 uint32_t u32_0, u32_1;
1487 uint8_t ip[5] __ALIGNED(4);
1489 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 2) != 0)
1492 uint8_t not_suported;
1496 if (init_and_power_on () == 0) {
1497 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1501 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 1) != 0)
1505 memset((void *)ip, 0, 5);
1506 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1507 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1509 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1510 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1511 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1512 if (drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1513 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1514 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1515 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1516 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1517 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 5U) == ARM_DRIVER_OK);
1518 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1521 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_GATEWAY for Station is not supported");
1523 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1525 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1526 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1527 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1528 if (drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1529 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1530 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1531 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1532 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1533 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 5U) == ARM_DRIVER_OK);
1534 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1537 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_GATEWAY for Access Point is not supported");
1539 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1543 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 2) != 0)
1546 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1547 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1549 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1551 if (drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1553 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1555 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1557 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1559 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1561 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1563 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1566 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_GATEWAY for Station is not supported");
1569 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1571 if (drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1573 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1575 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1577 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1579 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1581 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1583 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1586 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_GATEWAY for Access Point is not supported");
1591 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 3) == 3)
1592 // Check with Get that Set has written the correct values
1593 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1594 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1596 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1597 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1598 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1599 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1600 TEST_ASSERT(len == 4U);
1601 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1602 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1604 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1605 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1607 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1608 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1609 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1610 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1611 TEST_ASSERT(len == 4U);
1612 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1613 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1619 #if (WIFI_SETGETOPTION_IP_DNS1_EN != 0)
1620 static void WIFI_SetOption_GetOption_IP_DNS1 (void) {
1621 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 1) != 0)
1622 uint32_t u32_0, u32_1;
1623 uint8_t ip[5] __ALIGNED(4);
1625 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 2) != 0)
1628 uint8_t not_suported;
1632 if (init_and_power_on () == 0) {
1633 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1637 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 1) != 0)
1641 memset((void *)ip, 0, 5);
1642 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1643 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1645 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1646 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1647 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1648 if (drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1649 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1650 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1651 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1652 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1653 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 5U) == ARM_DRIVER_OK);
1654 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1657 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS1 for Station is not supported");
1659 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1661 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1662 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1663 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1664 if (drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1665 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1666 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1667 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1668 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1669 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 5U) == ARM_DRIVER_OK);
1670 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1673 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS1 for Access Point is not supported");
1675 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1679 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 2) != 0)
1682 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1683 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1685 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1687 if (drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1689 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1691 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1693 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1695 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1697 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1699 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1702 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS1 for Station is not supported");
1705 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1707 if (drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1709 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1711 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1713 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1715 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1717 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1719 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1722 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS1 for Access Point is not supported");
1727 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 3) == 3)
1728 // Check with Get that Set has written the correct values
1729 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1730 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1732 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1733 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1734 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1735 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1736 TEST_ASSERT(len == 4U);
1737 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1738 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1740 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1741 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1743 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1744 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1745 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1746 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1747 TEST_ASSERT(len == 4U);
1748 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1749 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1755 #if (WIFI_SETGETOPTION_IP_DNS2_EN != 0)
1756 static void WIFI_SetOption_GetOption_IP_DNS2 (void) {
1757 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 1) != 0)
1758 uint32_t u32_0, u32_1;
1759 uint8_t ip[5] __ALIGNED(4);
1761 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 2) != 0)
1764 uint8_t not_suported;
1768 if (init_and_power_on () == 0) {
1769 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1773 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 1) != 0)
1777 memset((void *)ip, 0, 5);
1778 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1779 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1781 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1782 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1783 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1784 if (drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1785 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1786 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1787 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1788 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1789 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 5U) == ARM_DRIVER_OK);
1790 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1793 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS2 for Station is not supported");
1795 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1797 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1798 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1799 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1800 if (drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1801 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1802 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1803 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1804 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1805 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 5U) == ARM_DRIVER_OK);
1806 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1809 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS2 for Access Point is not supported");
1811 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1815 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 2) != 0)
1818 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1819 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1821 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1823 if (drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1825 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1827 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1829 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1831 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1833 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1835 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1838 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS2 for Station is not supported");
1841 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1843 if (drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1845 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1847 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1849 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1851 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1853 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1855 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1858 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS2 for Access Point is not supported");
1863 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 3) == 3)
1864 // Check with Get that Set has written the correct values
1865 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1866 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1868 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1869 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1870 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1871 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1872 TEST_ASSERT(len == 4U);
1873 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1874 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1876 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1877 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1879 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1880 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1881 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1882 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1883 TEST_ASSERT(len == 4U);
1884 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1885 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1891 #if (WIFI_SETGETOPTION_IP_DHCP_EN != 0)
1892 static void WIFI_SetOption_GetOption_IP_DHCP (void) {
1893 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 1) != 0)
1894 uint32_t u32_1, u32_0;
1896 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 2) != 0)
1899 uint8_t not_suported;
1903 if (init_and_power_on () == 0) {
1904 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1908 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 1) != 0)
1912 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1913 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1915 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1916 if (drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1917 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1918 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1919 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1920 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1921 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 5U) == ARM_DRIVER_OK);
1922 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1923 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
1926 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP for Station is not supported");
1929 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1930 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1931 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1932 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1933 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1934 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1935 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 5U) == ARM_DRIVER_OK);
1936 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1937 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
1940 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP for Access Point is not supported");
1945 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 2) != 0)
1948 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1949 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1951 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1953 if (drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1955 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1957 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1959 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1961 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1963 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1965 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1968 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP for Station is not supported");
1971 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1973 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1975 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1977 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1979 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1981 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1983 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1985 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1988 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP for Access Point is not supported");
1993 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 3) == 3)
1994 // Check with Get that Set has written the correct values
1995 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1997 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1998 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1999 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2000 TEST_ASSERT(len == 4U);
2001 TEST_ASSERT(memcmp((const void *)&u32_0, (const void *)data_buf, (size_t)len) == 0);
2002 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
2003 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2004 TEST_ASSERT(len == 4U);
2005 TEST_ASSERT(memcmp((const void *)&u32_1, (const void *)data_buf, (size_t)len) == 0);
2007 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2009 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2010 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
2011 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2012 TEST_ASSERT(len == 4U);
2013 TEST_ASSERT(memcmp((const void *)&u32_0, (const void *)data_buf, (size_t)len) == 0);
2014 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
2015 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2016 TEST_ASSERT(len == 4U);
2017 TEST_ASSERT(memcmp((const void *)&u32_1, (const void *)data_buf, (size_t)len) == 0);
2023 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN != 0)
2024 static void WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN (void) {
2025 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 1) != 0)
2026 uint32_t u32_1, u32_0;
2027 uint8_t ip[5] __ALIGNED(4);
2029 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 2) != 0)
2032 uint8_t not_suported;
2036 if (init_and_power_on () == 0) {
2037 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2041 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 1) != 0)
2043 memset((void *)ip, 0, 5);
2044 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2045 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2047 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2048 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2050 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2051 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_BEGIN_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2052 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2053 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2054 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2055 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2056 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2057 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2058 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 5U) == ARM_DRIVER_OK);
2059 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_OK);
2062 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_POOL_BEGIN for Access Point is not supported");
2064 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2068 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 2) != 0)
2071 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2072 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2074 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2076 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2078 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2080 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2082 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2084 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2086 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2088 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2090 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2092 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2095 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_POOL_BEGIN for Access Point is not supported");
2100 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 3) == 3)
2101 // Check with Get that Set has written the correct values
2102 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2103 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_BEGIN_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2105 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2106 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2107 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_OK);
2108 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2109 TEST_ASSERT(len == 4U);
2110 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
2111 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2117 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN != 0)
2118 static void WIFI_SetOption_GetOption_IP_DHCP_POOL_END (void) {
2119 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 1) != 0)
2120 uint32_t u32_1, u32_0;
2121 uint8_t ip[5] __ALIGNED(4);
2123 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 2) != 0)
2126 uint8_t not_suported;
2130 if (init_and_power_on () == 0) {
2131 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2135 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 1) != 0)
2137 memset((void *)ip, 0, 5);
2138 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2139 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2141 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2142 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2144 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2145 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_END_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2146 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2147 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2148 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2149 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2150 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2151 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2152 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 5U) == ARM_DRIVER_OK);
2153 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_OK);
2156 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_POOL_END for Access Point is not supported");
2158 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2162 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 2) != 0)
2165 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2166 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2168 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2170 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2172 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2174 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2176 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2178 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2180 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2182 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2184 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2186 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2189 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_POOL_END for Access Point is not supported");
2194 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 3) == 3)
2195 // Check with Get that Set has written the correct values
2196 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2197 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_END_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2199 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2200 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2201 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_OK);
2202 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2203 TEST_ASSERT(len == 4U);
2204 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
2205 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2211 #if (WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN != 0)
2212 static void WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME (void) {
2213 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 1) != 0)
2216 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 2) != 0)
2219 uint8_t not_suported;
2223 if (init_and_power_on () == 0) {
2224 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2228 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 1) != 0)
2230 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2231 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2232 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2234 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2235 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2237 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2238 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2239 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2240 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2241 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2242 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2243 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2244 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 5U) == ARM_DRIVER_OK);
2245 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_OK);
2248 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_LEASE_TIME for Access Point is not supported");
2253 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 2) != 0)
2256 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2257 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2259 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2261 TEST_ASSERT (drv->GetOption (0U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2263 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2265 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2267 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2269 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2271 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2273 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2275 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2277 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2280 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_LEASE_TIME for Access Point is not supported");
2285 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 3) == 3)
2286 // Check with Get that Set has written the correct values
2287 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2288 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2290 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2291 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_OK);
2292 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2293 TEST_ASSERT(len == 4U);
2294 TEST_ASSERT(memcmp((const void *)&time, (const void *)data_buf, (size_t)len) == 0);
2300 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2302 \brief Test case: WIFI_SetOption_GetOption
2304 The test case \b WIFI_SetOption_GetOption verifies the WiFi Driver \b SetOption and \b GetOption functions.
2305 (Options: ARM_WIFI_BSSID, ARM_WIFI_MAC, ARM_WIFI_IP, ARM_WIFI_IP_SUBNET_MASK, ARM_WIFI_IP_GATEWAY, ARM_WIFI_IP_DNS1,
2306 ARM_WIFI_IP_DNS2, ARM_WIFI_IP_DHCP_POOL_BEGIN, ARM_WIFI_IP_DHCP_POOL_END are checked with buffer not aligned to 4 bytes).<br>
2307 Tests for each option is conditionally executed depending on WIFI_SETGETOPTION_... settings in DV_Config.h file.
2309 int32_t (*SetOption) (uint32_t interface, uint32_t option, const void *data, uint32_t len);
2313 int32_t (*GetOption) (uint32_t interface, uint32_t option, void *data, uint32_t *len);
2315 Function \b WIFI_SetOption_GetOption_BSSID tests \b ARM_WIFI_BSSID option.<br>
2316 Function \b WIFI_SetOption_GetOption_TX_POWER tests \b ARM_WIFI_TX_POWER option.<br>
2317 Function \b WIFI_SetOption_GetOption_LP_TIMER tests \b ARM_WIFI_LP_TIMER option.<br>
2318 Function \b WIFI_SetOption_GetOption_DTIM tests \b ARM_WIFI_DTIM option.<br>
2319 Function \b WIFI_SetOption_GetOption_BEACON tests \b ARM_WIFI_BEACON option.<br>
2320 Function \b WIFI_SetOption_GetOption_MAC tests \b ARM_WIFI_MAC option.<br>
2321 Function \b WIFI_SetOption_GetOption_IP tests \b ARM_WIFI_IP option.<br>
2322 Function \b WIFI_SetOption_GetOption_IP_SUBNET_MASK tests \b ARM_WIFI_IP_SUBNET_MASK option.<br>
2323 Function \b WIFI_SetOption_GetOption_IP_GATEWAY tests \b ARM_WIFI_IP_GATEWAY option.<br>
2324 Function \b WIFI_SetOption_GetOption_IP_DNS1 tests \b ARM_WIFI_IP_DNS1 option.<br>
2325 Function \b WIFI_SetOption_GetOption_IP_DNS2 tests \b ARM_WIFI_IP_DNS2 option.<br>
2326 Function \b WIFI_SetOption_GetOption_IP_DHCP tests \b ARM_WIFI_IP_DHCP option.<br>
2327 Function \b WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN tests \b ARM_WIFI_IP_DHCP_POOL_BEGIN option.<br>
2328 Function \b WIFI_SetOption_GetOption_IP_DHCP_POOL_END tests \b ARM_WIFI_IP_DHCP_POOL_END option.<br>
2329 Function \b WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME tests \b ARM_WIFI_IP_DHCP_LEASE_TIME option.
2331 void WIFI_SetOption_GetOption (void) {
2333 #if (WIFI_SETGETOPTION_BSSID_EN != 0)
2334 WIFI_SetOption_GetOption_BSSID ();
2336 #if (WIFI_SETGETOPTION_TX_POWER_EN != 0)
2337 WIFI_SetOption_GetOption_TX_POWER ();
2339 #if (WIFI_SETGETOPTION_LP_TIMER_EN != 0)
2340 WIFI_SetOption_GetOption_LP_TIMER ();
2342 #if (WIFI_SETGETOPTION_DTIM_EN != 0)
2343 WIFI_SetOption_GetOption_DTIM ();
2345 #if (WIFI_SETGETOPTION_BEACON_EN != 0)
2346 WIFI_SetOption_GetOption_BEACON ();
2348 #if (WIFI_SETGETOPTION_MAC_EN != 0)
2349 WIFI_SetOption_GetOption_MAC ();
2351 #if (WIFI_SETGETOPTION_IP_EN != 0)
2352 WIFI_SetOption_GetOption_IP ();
2354 #if (WIFI_SETGETOPTION_IP_SUBNET_MASK_EN != 0)
2355 WIFI_SetOption_GetOption_IP_SUBNET_MASK ();
2357 #if (WIFI_SETGETOPTION_IP_GATEWAY_EN != 0)
2358 WIFI_SetOption_GetOption_IP_GATEWAY ();
2360 #if (WIFI_SETGETOPTION_IP_DNS1_EN != 0)
2361 WIFI_SetOption_GetOption_IP_DNS1 ();
2363 #if (WIFI_SETGETOPTION_IP_DNS2_EN != 0)
2364 WIFI_SetOption_GetOption_IP_DNS2 ();
2366 #if (WIFI_SETGETOPTION_IP_DHCP_EN != 0)
2367 WIFI_SetOption_GetOption_IP_DHCP ();
2369 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN != 0)
2370 WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN ();
2372 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN != 0)
2373 WIFI_SetOption_GetOption_IP_DHCP_POOL_END ();
2375 #if (WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN != 0)
2376 WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME ();
2380 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2382 \brief Test case: WIFI_Scan
2384 The test case \b WIFI_Scan verifies the WiFi Driver \b Scan function.
2386 int32_t (*Scan) (ARM_WIFI_SCAN_INFO_t scan_info[], uint32_t max_num);
2389 void WIFI_Scan (void) {
2392 if (init_and_power_on () == 0) {
2393 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2397 TEST_ASSERT(drv->Scan(NULL, WIFI_SCAN_MAX_NUM) == ARM_DRIVER_ERROR_PARAMETER);
2398 TEST_ASSERT(drv->Scan(scan_info, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2400 memset((void *)scan_info, 0xCC, sizeof(scan_info));
2401 ret = drv->Scan(scan_info, 10U);
2403 TEST_MESSAGE("[WARNING] Scan (..) found no networks");
2405 TEST_ASSERT((ret > 0) && (ret <= WIFI_SCAN_MAX_NUM));
2409 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2411 \brief Test case: WIFI_Activate_Deactivate
2413 The test case \b WIFI_Activate_Deactivate verifies the WiFi Driver \b Activate and \b Deactivate functions.
2415 int32_t (*Activate) (uint32_t interface, const ARM_WIFI_CONFIG_t *config);
2419 int32_t (*Deactivate) (uint32_t interface);
2421 Testing sequence (for Station and Access Point):
2422 - if not initialized and powered initialize and power on
2424 - Activate (with invalid parameters)
2425 - Activate (with valid parameters)
2427 - Activate (with invalid WPS parameters)
2429 void WIFI_Activate_Deactivate (void) {
2432 if (init_and_power_on () == 0) {
2433 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2437 /* Test Station configuration setup */
2438 if ((cap.station != 0) || (cap.station_ap != 0)) {
2440 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2442 /* Test function with invalid parameters */
2443 TEST_ASSERT(drv->Activate(0U, NULL) == ARM_DRIVER_ERROR_PARAMETER);
2447 config.security = 0U;
2449 config.wps_method = 0U;
2450 config.wps_pin = NULL;
2451 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2453 config.ssid = WIFI_STA_SSID;
2455 config.security = WIFI_STA_SECURITY;
2457 config.wps_method = 0U;
2458 config.wps_pin = NULL;
2459 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2461 config.ssid = WIFI_STA_SSID;
2462 config.pass = WIFI_STA_PASS;
2463 config.security = ARM_WIFI_SECURITY_UNKNOWN;
2464 config.ch = WIFI_STA_CH;
2465 config.wps_method = 0U;
2466 config.wps_pin = NULL;
2467 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2469 config.ssid = WIFI_STA_SSID;
2470 config.pass = WIFI_STA_PASS;
2471 config.security = WIFI_STA_SECURITY;
2473 config.wps_method = 0U;
2474 config.wps_pin = NULL;
2475 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2477 config.ssid = WIFI_STA_SSID;
2478 config.pass = WIFI_STA_PASS;
2479 config.security = WIFI_STA_SECURITY;
2480 config.ch = WIFI_STA_CH;
2481 config.wps_method = 0U;
2482 config.wps_pin = NULL;
2483 TEST_ASSERT(drv->Activate(3U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2485 /* Test function with autodetect channel, can return unsupported or succeed */
2486 config.ssid = WIFI_STA_SSID;
2487 config.pass = WIFI_STA_PASS;
2488 config.security = WIFI_STA_SECURITY;
2490 config.wps_method = 0U;
2491 config.wps_pin = NULL;
2492 ret = drv->Activate(0U, &config);
2493 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
2494 TEST_MESSAGE("[WARNING] Activate (0, ...) with autodetect channel not supported");
2496 TEST_ASSERT(ret == ARM_DRIVER_OK);
2499 if (ret == ARM_DRIVER_OK) {
2500 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2503 /* Test function with valid parameters -> must succeed */
2504 config.ssid = WIFI_STA_SSID;
2505 config.pass = WIFI_STA_PASS;
2506 config.security = WIFI_STA_SECURITY;
2507 config.ch = WIFI_STA_CH;
2508 config.wps_method = 0U;
2509 config.wps_pin = NULL;
2510 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_OK);
2512 if (ret == ARM_DRIVER_OK) {
2513 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2516 if (cap.wps_station != 0U) {
2517 /* Test function with invalid WPS configurations */
2518 config.ssid = WIFI_STA_SSID;
2519 config.pass = WIFI_STA_PASS;
2520 config.security = WIFI_STA_SECURITY;
2521 config.ch = WIFI_STA_CH;
2522 config.wps_method = 255U;
2523 config.wps_pin = NULL;
2524 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2526 config.ssid = WIFI_STA_SSID;
2527 config.pass = WIFI_STA_PASS;
2528 config.security = WIFI_STA_SECURITY;
2529 config.ch = WIFI_STA_CH;
2530 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2531 config.wps_pin = NULL;
2532 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2536 /* Test Access Point configuration setup */
2537 if ((cap.ap != 0) || (cap.station_ap != 0)) {
2539 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2541 /* Test function with invalid parameters */
2542 TEST_ASSERT(drv->Activate(1U, NULL) == ARM_DRIVER_ERROR_PARAMETER);
2546 config.security = 0U;
2548 config.wps_method = 0U;
2549 config.wps_pin = NULL;
2550 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2552 config.ssid = WIFI_STA_SSID;
2554 config.security = WIFI_AP_SECURITY;
2556 config.wps_method = 0U;
2557 config.wps_pin = NULL;
2558 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2560 config.ssid = WIFI_AP_SSID;
2561 config.pass = WIFI_AP_PASS;
2562 config.security = ARM_WIFI_SECURITY_UNKNOWN;
2563 config.ch = WIFI_AP_CH;
2564 config.wps_method = 0U;
2565 config.wps_pin = NULL;
2566 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2568 config.ssid = WIFI_AP_SSID;
2569 config.pass = WIFI_AP_PASS;
2570 config.security = WIFI_AP_SECURITY;
2572 config.wps_method = 0U;
2573 config.wps_pin = NULL;
2574 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2576 config.ssid = WIFI_AP_SSID;
2577 config.pass = WIFI_AP_PASS;
2578 config.security = WIFI_AP_SECURITY;
2579 config.ch = WIFI_AP_CH;
2580 config.wps_method = 0U;
2581 config.wps_pin = NULL;
2582 TEST_ASSERT(drv->Activate(3U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2584 /* Test function with autodetect channel, can return unsupported or succeed */
2585 config.ssid = WIFI_AP_SSID;
2586 config.pass = WIFI_AP_PASS;
2587 config.security = WIFI_AP_SECURITY;
2589 config.wps_method = 0U;
2590 config.wps_pin = NULL;
2591 ret = drv->Activate(1U, &config);
2592 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
2593 TEST_MESSAGE("[WARNING] Activate (1, ...) with autodetect channel not supported");
2595 TEST_ASSERT(ret == ARM_DRIVER_OK);
2598 if (ret == ARM_DRIVER_OK) {
2599 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2602 /* Test function with valid parameters -> must succeed */
2603 config.ssid = WIFI_AP_SSID;
2604 config.pass = WIFI_AP_PASS;
2605 config.security = WIFI_AP_SECURITY;
2606 config.ch = WIFI_AP_CH;
2607 config.wps_method = 0U;
2608 config.wps_pin = NULL;
2609 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_OK);
2611 if (ret == ARM_DRIVER_OK) {
2612 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2615 if (cap.wps_ap != 0U) {
2616 /* Test function with invalid WPS configurations */
2617 config.ssid = WIFI_AP_SSID;
2618 config.pass = WIFI_AP_PASS;
2619 config.security = WIFI_AP_SECURITY;
2620 config.ch = WIFI_AP_CH;
2621 config.wps_method = 255U;
2622 config.wps_pin = NULL;
2623 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2625 config.ssid = WIFI_AP_SSID;
2626 config.pass = WIFI_AP_PASS;
2627 config.security = WIFI_AP_SECURITY;
2628 config.ch = WIFI_AP_CH;
2629 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2630 config.wps_pin = NULL;
2631 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2636 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2638 \brief Test case: WIFI_IsConnected
2640 The test case \b WIFI_IsConnected verifies the WiFi Driver \b IsConnected function.
2642 uint32_t (*IsConnected) (void);
2645 void WIFI_IsConnected (void) {
2647 if (init_and_power_on () == 0) {
2648 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2652 TEST_ASSERT(drv->IsConnected () == 0U);
2654 /* Test function with valid Station configuration */
2655 if ((cap.station != 0) || (cap.station_ap != 0)) {
2656 memset((void *)&config, 0, sizeof(config));
2657 config.ssid = WIFI_STA_SSID;
2658 config.pass = WIFI_STA_PASS;
2659 config.security = WIFI_STA_SECURITY;
2660 config.ch = WIFI_STA_CH;
2662 drv->Activate(0U, &config);
2663 TEST_ASSERT(drv->IsConnected () != 0U);
2665 drv->Deactivate (0U);
2666 TEST_ASSERT(drv->IsConnected () == 0U);
2670 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2672 \brief Test case: WIFI_GetNetInfo
2674 The test case \b WIFI_GetNetInfo verifies the WiFi Driver \b GetNetInfo function.
2676 int32_t (*GetNetInfo) (ARM_WIFI_NET_INFO_t *net_info);
2679 void WIFI_GetNetInfo (void) {
2681 if (init_and_power_on () == 0) {
2682 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2686 /* Test function with invalid pointer */
2687 TEST_ASSERT(drv->GetNetInfo (NULL) == ARM_DRIVER_ERROR_PARAMETER);
2689 /* Test function with valid Station configuration */
2690 if ((cap.station != 0) || (cap.station_ap != 0)) {
2691 memset((void *)&config, 0, sizeof(config));
2692 config.ssid = WIFI_STA_SSID;
2693 config.pass = WIFI_STA_PASS;
2694 config.security = WIFI_STA_SECURITY;
2695 config.ch = WIFI_STA_CH;
2697 drv->Activate(0U, &config);
2699 memset((void *)&net_info, 0xCC, sizeof(net_info));
2700 TEST_ASSERT(drv->GetNetInfo (&net_info) == ARM_DRIVER_OK);
2702 /* Check returned info */
2703 TEST_ASSERT(net_info.security == config.security);
2704 if (config.ch != 0U) {
2705 TEST_ASSERT(net_info.ch == config.ch);
2707 TEST_ASSERT(net_info.rssi != 0U);
2709 drv->Deactivate (0U);
2713 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2715 \brief Test case: WIFI_Activate_AP
2717 The test case \b WIFI_Activate_AP verifies the WiFi Driver \b Activate function AP operation.
2718 Test result is checked by connecting WiFi client to AP.
2720 void WIFI_Activate_AP (void) {
2723 if (init_and_power_on () == 0) {
2724 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2728 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2732 /* Test Access Point configuration setup */
2733 if ((cap.ap != 0) || (cap.station_ap != 0)) {
2734 memset((void *)&config, 0, sizeof(config));
2735 config.ssid = WIFI_AP_SSID;
2736 config.pass = WIFI_AP_PASS;
2737 config.security = WIFI_AP_SECURITY;
2738 config.ch = WIFI_AP_CH;
2739 ret = drv->Activate(1U, &config);
2740 TEST_ASSERT(ret == ARM_DRIVER_OK);
2742 if (ret == ARM_DRIVER_OK) {
2743 // Wait for WIFI_AP_CLIENT_CON_TIMEOUT in ms for client to connect
2744 // If event for connect is supported, loop will end when connect is detected
2745 // otherwise result of test is result of client connection status.
2746 for (tout = WIFI_AP_CLIENT_CON_TIMEOUT / 128; tout > 0; tout--) {
2748 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2749 if (event & ARM_WIFI_EVENT_AP_CONNECT) {
2756 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2757 TEST_ASSERT((event & ARM_WIFI_EVENT_AP_CONNECT) != 0U);
2762 drv->Deactivate (1U);
2766 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2768 \brief Test case: WIFI_Activate_Station_WPS_PBC
2770 The test case \b WIFI_Activate_Station_WPS_PBC verifies the WiFi Driver \b Activate function Station connection with WPS
2771 and Push-Button Configuration method.
2772 This test case requires that test Access Point has active Push-button WPS method when test is started.
2773 Usually started on the WiFi AP (router) by pressing the WPS button.
2775 void WIFI_Activate_Station_WPS_PBC (void) {
2778 if (init_and_power_on () == 0) {
2779 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2783 /* Test Station WPS PBC connection */
2784 if ((cap.wps_station != 0U) && ((cap.station != 0) || (cap.station_ap != 0))) {
2785 memset((void *)&config, 0, sizeof(config));
2787 /* Connect with valid WPS configuration - Push-Button Configuration method -> should succeed */
2788 config.wps_method = ARM_WIFI_WPS_METHOD_PBC;
2789 ret = drv->Activate(0U, &config);
2790 TEST_ASSERT(ret == ARM_DRIVER_OK);
2792 if (ret == ARM_DRIVER_OK) {
2793 // Check connect information is as expected
2794 memset((void *)&net_info, 0xCC, sizeof(net_info));
2795 drv->GetNetInfo (&net_info);
2797 TEST_ASSERT(memcmp((const void *)net_info.ssid, (const void *)WIFI_STA_SSID, sizeof(WIFI_STA_SSID)) == 0);
2798 TEST_ASSERT(memcmp((const void *)net_info.pass, (const void *)WIFI_STA_PASS, sizeof(WIFI_STA_PASS)) == 0);
2799 TEST_ASSERT(net_info.security == WIFI_STA_SECURITY);
2800 if (WIFI_STA_CH != 0) {
2801 TEST_ASSERT(net_info.ch == WIFI_STA_CH);
2805 drv->Deactivate (0U);
2810 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2812 \brief Test case: WIFI_Activate_Station_WPS_PIN
2814 The test case \b WIFI_Activate_Station_WPS_PIN verifies the WiFi Driver \b Activate function Station connection with WPS
2816 This test case requires that test Access Point has active PIN WPS method when test is started.
2817 Usually needs to be configured on the WiFi AP (router).
2819 void WIFI_Activate_Station_WPS_PIN (void) {
2822 if (init_and_power_on () == 0) {
2823 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2827 /* Test Station WPS PIN connection */
2828 if ((cap.wps_station != 0U) && ((cap.station != 0) || (cap.station_ap != 0))) {
2829 memset((void *)&config, 0, sizeof(config));
2831 /* Connect with valid WPS configuration - PIN method -> should succeed */
2832 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2833 config.wps_pin = WIFI_STA_WPS_PIN;
2834 ret = drv->Activate(0U, &config);
2835 TEST_ASSERT(ret == ARM_DRIVER_OK);
2837 if (ret == ARM_DRIVER_OK) {
2838 // Check connect information is as expected
2839 memset((void *)&net_info, 0xCC, sizeof(net_info));
2840 drv->GetNetInfo (&net_info);
2842 TEST_ASSERT(memcmp((const void *)net_info.ssid, (const void *)WIFI_STA_SSID, sizeof(WIFI_STA_SSID)) == 0);
2843 TEST_ASSERT(memcmp((const void *)net_info.pass, (const void *)WIFI_STA_PASS, sizeof(WIFI_STA_PASS)) == 0);
2844 TEST_ASSERT(net_info.security == WIFI_STA_SECURITY);
2845 if (WIFI_STA_CH != 0) {
2846 TEST_ASSERT(net_info.ch == WIFI_STA_CH);
2850 drv->Deactivate (0U);
2855 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2857 \brief Test case: WIFI_Activate_AP_WPS_PBC
2859 The test case \b WIFI_Activate_AP_WPS_PBC verifies the WiFi Driver \b Activate function AP WPS
2860 and Push-Button Configuration method functionality.
2861 Test result is checked by connecting the WiFi client to AP with WPS Push-Button Configuration method.
2863 void WIFI_Activate_AP_WPS_PBC (void) {
2866 if (init_and_power_on () == 0) {
2867 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2871 /* Test AP WPS PBC */
2872 if ((cap.wps_ap != 0U) && ((cap.ap != 0) || (cap.station_ap != 0))) {
2873 memset((void *)&config, 0, sizeof(config));
2874 config.ssid = WIFI_AP_SSID;
2875 config.pass = WIFI_AP_PASS;
2876 config.security = WIFI_AP_SECURITY;
2877 config.ch = WIFI_AP_CH;
2879 /* Start AP with WPS configuration - Push-Button Configuration method -> should succeed */
2880 config.wps_method = ARM_WIFI_WPS_METHOD_PBC;
2881 ret = drv->Activate(1U, &config);
2882 TEST_ASSERT(ret == ARM_DRIVER_OK);
2884 if (ret == ARM_DRIVER_OK) {
2885 // Wait predefined time for Client to connect
2886 osDelay(WIFI_AP_CLIENT_CON_TIMEOUT);
2890 drv->Deactivate (1U);
2894 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2896 \brief Test case: WIFI_Activate_AP_WPS_PIN
2898 The test case \b WIFI_Activate_AP_WPS_PIN verifies the WiFi Driver \b Activate function AP WPS
2899 PIN method functionality.
2900 Test result is checked by connecting the WiFi client to AP with WPS PIN method.
2902 void WIFI_Activate_AP_WPS_PIN (void) {
2905 if (init_and_power_on () == 0) {
2906 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2910 /* Test AP WPS PIN */
2911 if ((cap.wps_ap != 0U) && ((cap.ap != 0) || (cap.station_ap != 0))) {
2912 memset((void *)&config, 0, sizeof(config));
2913 config.ssid = WIFI_AP_SSID;
2914 config.pass = WIFI_AP_PASS;
2915 config.security = WIFI_AP_SECURITY;
2916 config.ch = WIFI_AP_CH;
2918 /* Start AP with WPS configuration - PIN method -> should succeed */
2919 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2920 config.wps_pin = WIFI_AP_WPS_PIN;
2921 ret = drv->Activate(1U, &config);
2922 TEST_ASSERT(ret == ARM_DRIVER_OK);
2924 if (ret == ARM_DRIVER_OK) {
2925 // Wait predefined time for Client to connect
2926 osDelay(WIFI_AP_CLIENT_CON_TIMEOUT);
2930 drv->Deactivate (1U);
2938 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2939 /* WiFi Socket tests */
2940 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2943 \defgroup wifi_sock_api WiFi Socket API
2946 These tests verify API and operation of the WiFi socket functions.
2949 /* Helper function that initialize and connects to WiFi Access Point */
2950 static int32_t station_init (uint32_t con) {
2952 if (cap.station == 0U) {
2956 if (powered == 0U) {
2957 if ((drv->Initialize (event_func) == ARM_DRIVER_OK) &&
2958 (drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK)) {
2965 if (connected != con) {
2967 memset((void *)&config, 0, sizeof(config));
2968 config.ssid = WIFI_STA_SSID;
2969 config.pass = WIFI_STA_PASS;
2970 config.security = WIFI_STA_SECURITY;
2971 config.ch = WIFI_STA_CH;
2972 if (drv->Activate(0U, &config) != ARM_DRIVER_OK) {
2976 if (drv->Deactivate(0U) != ARM_DRIVER_OK) {
2981 connected = (uint8_t)con;
2987 /* Helper function that disconnects and uninitializes Station */
2988 static void station_uninit (void) {
2990 drv->Deactivate (0U);
2993 drv->PowerControl (ARM_POWER_OFF);
2994 drv->Uninitialize ();
2998 /* Helper function for execution of socket test function in the worker thread */
2999 static int32_t th_execute (osThreadId_t *id, uint32_t sig, uint32_t tout) {
3000 osThreadFlagsSet (id, sig);
3001 if (osThreadFlagsWait (TH_OK | TH_TOUT, osFlagsWaitAny, tout) == TH_OK) {
3002 /* Success, completed in time */
3008 #define TH_EXECUTE(sig,tout) do { \
3010 rval = th_execute (worker, sig, tout); \
3012 /* Function timeout expired */ \
3013 snprintf(msg_buf, sizeof(msg_buf), "Execution timeout (%d ms)", tout); \
3014 TEST_ASSERT_MESSAGE(0,msg_buf); \
3018 #define TH_ASSERT(cond) do { \
3019 if (rval) { TEST_ASSERT(cond); } \
3022 #define TH_ASSERT2(c1,c2,s1,r1,r2) do { \
3024 if (!c2) { TEST_ASSERT(c1); } \
3026 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Non BSD-strict, %s (result %s, expected %s)", s1, str_sock_ret[-r1], str_sock_ret[-r2]); \
3027 TEST_MESSAGE(msg_buf); \
3032 #define ARG_INIT() do { \
3033 io.owner = osThreadGetId (); \
3037 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3039 /* Create IO parameters */
3051 /* Assign arguments */
3052 #define ARG_CREATE(_af,_type,_proto) do { \
3055 io.protocol = _proto; \
3058 /* Create worker thread */
3059 __NO_RETURN static void Th_Create (IO_CREATE *io) {
3060 uint32_t flags, xid;
3063 flags = osThreadFlagsWait (F_CREATE | F_CLOSE, osFlagsWaitAny, osWaitForever);
3068 io->rc = drv->SocketCreate (io->af, io->type, io->protocol);
3073 io->rc = drv->SocketClose (io->sock);
3076 /* Done, send signal to owner thread */
3077 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3079 osThreadFlagsSet (io->owner, flags);
3080 osThreadFlagsClear (F_ALL);
3085 \brief Test case: WIFI_SocketCreate
3086 \ingroup wifi_sock_api
3088 The test case \b WIFI_SocketCreate verifies the WiFi Driver \b SocketCreate function:
3090 int32_t (*SocketCreate) (int32_t af, int32_t type, int32_t protocol);
3094 - Check function parameters
3095 - Create multiple stream sockets
3096 - Gradually close stream sockets and create datagram sockets
3097 - Close datagram sockets
3099 void WIFI_SocketCreate (void) {
3100 osThreadId_t worker;
3103 int32_t sock[WIFI_SOCKET_MAX_NUM], i;
3105 if (socket_funcs_exist == 0U) {
3106 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3110 if (station_init (1) == 0) {
3111 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3115 /* Create worker thread */
3116 worker = osThreadNew ((osThreadFunc_t)Th_Create, &io, NULL);
3117 if (worker == NULL) {
3118 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3124 /* Check parameter (af = -1) */
3125 ARG_CREATE (-1, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3126 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3127 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3129 /* Check parameter (af = INT32_MIN) */
3130 ARG_CREATE (INT32_MIN, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3131 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3132 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3134 /* Check parameter (af = INT32_MAX) */
3135 ARG_CREATE (INT32_MAX, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3136 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3137 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3139 /* Check parameter (type = -1) */
3140 ARG_CREATE (ARM_SOCKET_AF_INET, -1, ARM_SOCKET_IPPROTO_TCP);
3141 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3142 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3144 /* Check parameter (type = INT32_MIN) */
3145 ARG_CREATE (ARM_SOCKET_AF_INET, INT32_MIN, ARM_SOCKET_IPPROTO_TCP);
3146 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3147 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3149 /* Check parameter (type = INT32_MAX) */
3150 ARG_CREATE (ARM_SOCKET_AF_INET, INT32_MAX, ARM_SOCKET_IPPROTO_TCP);
3151 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3152 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3154 /* Check parameter, stream socket (protocol = -1) */
3155 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, -1);
3156 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3157 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3159 /* Check parameter, stream socket (protocol = INT32_MIN) */
3160 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, INT32_MIN);
3161 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3162 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3164 /* Check parameter, stream socket (protocol = INT32_MAX) */
3165 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, INT32_MAX);
3166 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3167 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3169 /* Check parameter, datagram socket (protocol = -1) */
3170 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, -1);
3171 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3172 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3174 /* Check parameter, datagram socket (protocol = INT32_MIN) */
3175 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, INT32_MIN);
3176 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3177 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3179 /* Check parameter, datagram socket (protocol = INT32_MAX) */
3180 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, INT32_MAX);
3181 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3182 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3184 /* Check parameter, stream socket (protocol = ARM_SOCKET_IPPROTO_UDP) */
3185 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_UDP);
3186 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3187 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3189 /* Check parameter, datagram socket (protocol = ARM_SOCKET_IPPROTO_TCP) */
3190 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_TCP);
3191 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3192 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3194 /* Create multiple stream sockets */
3195 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3196 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3197 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3198 TH_ASSERT (io.rc >= 0);
3203 /* Gradually close stream sockets, create datagram sockets */
3204 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3205 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3206 /* Close stream socket */
3208 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3209 TH_ASSERT (io.rc == 0);
3211 /* Create datagram socket */
3212 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3213 TH_ASSERT (io.rc >= 0);
3218 /* Close datagram sockets */
3219 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3221 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3222 TH_ASSERT (io.rc == 0);
3230 /* Terminate worker thread */
3231 osThreadTerminate (worker);
3234 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3236 /* Bind IO parameters */
3249 /* Assign arguments */
3250 #define ARG_BIND(_sock,_ip,_ip_len,_port) do { \
3253 io.ip_len = _ip_len; \
3257 /* Bind worker thread */
3258 __NO_RETURN static void Th_Bind (IO_BIND *io) {
3262 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_CLOSE, osFlagsWaitAny, osWaitForever);
3266 /* Create stream socket */
3267 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3271 /* Create datagram socket */
3272 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3277 io->rc = drv->SocketBind (io->sock, io->ip, io->ip_len, io->port);
3282 io->rc = drv->SocketClose (io->sock);
3285 /* Done, send signal to owner thread */
3286 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3288 osThreadFlagsSet (io->owner, flags);
3289 osThreadFlagsClear (F_ALL);
3294 \brief Test case: WIFI_SocketBind
3295 \ingroup wifi_sock_api
3297 The test case \b WIFI_SocketBind verifies the WiFi Driver \b SocketBind function:
3299 int32_t (*SocketBind) (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port);
3303 - Create stream socket
3304 - Check function parameters
3305 - Bind stream socket
3306 - Bind socket second time
3307 - Create 2nd stream socket
3308 - Bind 2nd socket, used port
3309 - Bind 2nd socket, unused port
3310 - Close stream sockets
3311 - Bind closed socket
3313 Datagram socket test:
3314 - Create datagram socket
3315 - Bind datagram socket
3316 - Bind socket second time
3317 - Create 2nd datagram socket
3318 - Bind 2nd socket, used port
3319 - Bind 2nd socket, unused port
3320 - Close datagram socket
3321 - Bind closed socket
3323 void WIFI_SocketBind (void) {
3324 osThreadId_t worker;
3329 if (socket_funcs_exist == 0U) {
3330 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3334 if (station_init (1) == 0) {
3335 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3339 /* Create worker thread */
3340 worker = osThreadNew ((osThreadFunc_t)Th_Bind, &io, NULL);
3341 if (worker == NULL) {
3342 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3348 /* Create stream socket */
3349 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3351 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3355 /* Check parameter (socket = -1) */
3356 ARG_BIND (-1, ip_unspec, 4, DISCARD_PORT);
3357 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3358 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3360 /* Check parameter (socket = INT32_MIN) */
3361 ARG_BIND (INT32_MIN, ip_unspec, 4, DISCARD_PORT);
3362 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3363 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3365 /* Check parameter (socket = INT32_MAX) */
3366 ARG_BIND (INT32_MAX, ip_unspec, 4, DISCARD_PORT);
3367 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3368 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3370 /* Check parameter (ip = NULL) */
3371 ARG_BIND (sock, NULL, 4, DISCARD_PORT);
3372 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3373 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3375 /* Check parameter (ip_len = 0) */
3376 ARG_BIND (sock, ip_unspec, 0, DISCARD_PORT);
3377 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3378 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3380 /* Check parameter (ip_len = UINT32_MAX) */
3381 ARG_BIND (sock, ip_unspec, UINT32_MAX, DISCARD_PORT);
3382 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3383 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3385 /* Check parameter (port = 0) */
3386 ARG_BIND (sock, ip_unspec, 4, 0);
3387 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3388 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3391 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3392 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3393 TH_ASSERT (io.rc == 0);
3395 /* Bind socket 2nd time */
3396 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3397 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3398 /* Should return error (socket already bound) */
3399 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3400 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "bind socket to same address again", io.rc, ARM_SOCKET_EINVAL);
3402 /* Create 2nd stream socket */
3403 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3405 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3409 /* Bind 2nd socket, used port */
3410 ARG_BIND (sock2, ip_unspec, 4, DISCARD_PORT);
3411 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3412 /* Should return error (address already used) */
3413 /* Strict: EADDRINUSE, valid non-strict: ERROR */
3414 TH_ASSERT2 ((io.rc == ARM_SOCKET_EADDRINUSE), (io.rc == ARM_SOCKET_ERROR), "bind another socket to used address", io.rc, ARM_SOCKET_EADDRINUSE);
3416 /* Bind 2nd socket, unused port */
3417 ARG_BIND (sock2, ip_unspec, 4, ECHO_PORT);
3418 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3419 TH_ASSERT (io.rc == 0);
3423 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3424 TH_ASSERT (io.rc == 0);
3427 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3428 TH_ASSERT (io.rc == 0);
3430 /* Bind again, closed socket */
3431 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3432 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3433 /* Should return error (socket not created) */
3434 /* Strict: ESOCK, valid non-strict: ERROR */
3435 /* Return code strict: ESOCK, non-strict: ERROR */
3436 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "bind on closed socket", io.rc, ARM_SOCKET_ESOCK);
3441 /* Create datagram socket */
3442 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3444 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3448 /* Check parameter (socket = -1) */
3449 ARG_BIND (-1, ip_unspec, 4, DISCARD_PORT);
3450 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3451 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3453 /* Check parameter (socket = INT32_MIN) */
3454 ARG_BIND (INT32_MIN, ip_unspec, 4, DISCARD_PORT);
3455 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3456 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3458 /* Check parameter (socket = INT32_MAX) */
3459 ARG_BIND (INT32_MAX, ip_unspec, 4, DISCARD_PORT);
3460 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3461 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3463 /* Check parameter (ip = NULL) */
3464 ARG_BIND (sock, NULL, 4, DISCARD_PORT);
3465 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3466 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3468 /* Check parameter (ip_len = 0) */
3469 ARG_BIND (sock, ip_unspec, 0, DISCARD_PORT);
3470 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3471 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3473 /* Check parameter (ip_len = UINT32_MAX) */
3474 ARG_BIND (sock, ip_unspec, UINT32_MAX, DISCARD_PORT);
3475 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3476 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3478 /* Check parameter (port = 0) */
3479 ARG_BIND (sock, ip_unspec, 4, 0);
3480 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3481 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3484 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3485 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3486 TH_ASSERT (io.rc == 0);
3488 /* Bind socket 2nd time */
3489 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3490 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3491 /* Should return error (socket already bound) */
3492 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3493 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "bind socket to same address again", io.rc, ARM_SOCKET_EINVAL);
3495 /* Create 2nd datagram socket */
3496 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3498 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3502 /* Bind 2nd socket, used port */
3503 ARG_BIND (sock2, ip_unspec, 4, DISCARD_PORT);
3504 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3505 /* Should return error (address already used) */
3506 /* Strict: EADDRINUSE, valid non-strict: ERROR */
3507 TH_ASSERT2 ((io.rc == ARM_SOCKET_EADDRINUSE), (io.rc == ARM_SOCKET_ERROR), "bind another socket to used address", io.rc, ARM_SOCKET_EADDRINUSE);
3509 /* Bind 2nd socket, unused port */
3510 ARG_BIND (sock2, ip_unspec, 4, ECHO_PORT);
3511 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3512 TH_ASSERT (io.rc == 0);
3516 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3517 TH_ASSERT (io.rc == 0);
3520 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3521 TH_ASSERT (io.rc == 0);
3523 /* Bind again, closed socket */
3524 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3525 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3526 /* Should return error (socket not created) */
3527 /* Strict: ESOCK, valid non-strict: ERROR */
3528 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "bind on closed socket", io.rc, ARM_SOCKET_ESOCK);
3537 /* Terminate worker thread */
3538 osThreadTerminate (worker);
3541 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3543 /* Listen IO parameters */
3553 /* Assign arguments */
3554 #define ARG_LISTEN(_sock,_backlog) do { \
3556 io.backlog = _backlog; \
3559 /* Listen worker thread */
3560 __NO_RETURN static void Th_Listen (IO_LISTEN *io) {
3564 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
3565 F_BIND | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
3569 /* Create stream socket */
3570 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3574 /* Create datagram socket */
3575 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3580 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
3584 /* Listen on socket */
3585 io->rc = drv->SocketListen (io->sock, io->backlog);
3590 io->rc = drv->SocketClose (io->sock);
3593 /* Done, send signal to owner thread */
3594 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3596 osThreadFlagsSet (io->owner, flags);
3597 osThreadFlagsClear (F_ALL);
3602 \brief Test case: WIFI_SocketListen
3603 \ingroup wifi_sock_api
3605 The test case \b WIFI_SocketListen verifies the WiFi Driver \b SocketListen function:
3607 int32_t (*SocketListen) (int32_t socket, int32_t backlog);
3610 Stream socket test 1:
3611 - Create stream socket
3613 - Check function parameters
3615 - Start listening 2nd time
3618 Stream socket test 2:
3619 - Create stream socket
3620 - Start listening, unbound socket
3622 - Start listening, closed socket
3624 Datagram socket test:
3625 - Create datagram socket
3630 void WIFI_SocketListen (void) {
3631 osThreadId_t worker;
3636 if (socket_funcs_exist == 0U) {
3637 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3641 if (station_init (1) == 0) {
3642 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3646 /* Create worker thread */
3647 worker = osThreadNew ((osThreadFunc_t)Th_Listen, &io, NULL);
3648 if (worker == NULL) {
3649 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3655 /* Create stream socket */
3656 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3658 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3664 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3665 TH_ASSERT (io.rc == 0);
3667 /* Check parameter (socket = -1) */
3669 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3670 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3672 /* Check parameter (socket = INT32_MIN) */
3673 ARG_LISTEN (INT32_MIN, 1);
3674 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3675 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3677 /* Check parameter (socket = INT32_MAX) */
3678 ARG_LISTEN (INT32_MAX, 1);
3679 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3680 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3682 /* Start listening */
3683 ARG_LISTEN (sock, 1);
3684 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3685 TH_ASSERT (io.rc == 0);
3687 /* Start listening 2nd time */
3688 ARG_LISTEN (sock, 1);
3689 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3690 /* Should return error (socket already listening) */
3691 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3692 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "listen on already listening socket", io.rc, ARM_SOCKET_EINVAL);
3696 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3697 TH_ASSERT (io.rc == 0);
3702 /* Create stream socket */
3703 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3705 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3709 /* Start listening, unbound socket */
3710 ARG_LISTEN (sock, 1);
3711 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3712 /* Should return error (socket not bound) */
3713 /* Strict: EINVAL, valid non-strict: ERROR */
3714 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "listen on unbound socket", io.rc, ARM_SOCKET_EINVAL);
3718 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3719 TH_ASSERT (io.rc == 0);
3721 /* Start listening, closed socket */
3722 ARG_LISTEN (sock, 1);
3723 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3724 /* Should return error (socket not created) */
3725 /* Strict: ESOCK, valid non-strict: ERROR */
3726 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "listen on closed socket", io.rc, ARM_SOCKET_ESOCK);
3731 /* Create datagram socket */
3732 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3734 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3740 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3741 TH_ASSERT (io.rc == 0);
3743 /* Start listening */
3744 ARG_LISTEN (sock, 1);
3745 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3746 /* Should return error (operation not supported) */
3747 /* Strict: ENOTSUP, valid non-strict: ERROR */
3748 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "listen on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
3752 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3753 TH_ASSERT (io.rc == 0);
3762 /* Terminate worker thread */
3763 osThreadTerminate (worker);
3766 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3768 /* Accept IO parameters */
3781 /* Assign arguments */
3782 #define ARG_ACCEPT(_sock,_ip,_ip_len,_port) do { \
3785 io.ip_len = _ip_len; \
3789 /* TestAssistant control */
3790 #define TEST_PORT 2000
3792 /* CONNECT <proto>,<ip_addr>,<port>,<delay_ms>
3793 <proto> = protocol (TCP, UDP)
3794 <ip_addr> = IP address (0.0.0.0 = sender address)
3795 <port> = port number
3796 <delay_ms> = startup delay
3798 Example: CONNECT TCP,192.168.1.200,80,600
3799 (wait 600ms then connect to 192.168.1.200, port 80)
3801 #define CMD_CONNECT_TCP "CONNECT TCP,0.0.0.0,2000,500"
3802 #define CMD_CONNECT_UDP "CONNECT UDP,0.0.0.0,2000,200"
3804 /* Accept worker thread */
3805 __NO_RETURN static void Th_Accept (IO_ACCEPT *io) {
3810 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_LISTEN |
3811 F_ACCEPT | F_SEND_CTRL | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
3815 /* Create stream socket */
3816 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3820 /* Create datagram socket */
3821 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3826 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, TEST_PORT);
3830 /* Listen on socket */
3831 io->rc = drv->SocketListen (io->sock, 1);
3835 /* Accept on socket */
3836 io->rc = drv->SocketAccept (io->sock, io->ip, io->ip_len, io->port);
3840 /* Recv on socket (stream, datagram) */
3841 memset((void *)buffer, 0xCC, 16);
3842 io->rc = drv->SocketRecv (io->sock, buffer, 16);
3843 if ((io->rc > 0) && (memcmp ((const void *)buffer, (const void *)"SockServer", 10) != 0)) {
3844 /* Failed if rc <= 0 */
3851 io->rc = drv->SocketClose (io->sock);
3855 /* Send control command to TestAssistant */
3856 sock = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3857 drv->SocketConnect (sock, ip_socket_server, 4, ASSISTANT_PORT);
3858 io->rc = drv->SocketSend (sock, io->cmd, strlen(io->cmd));
3859 drv->SocketClose (sock);
3863 /* Done, send signal to owner thread */
3864 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3866 osThreadFlagsSet (io->owner, flags);
3867 osThreadFlagsClear (F_ALL);
3872 \brief Test case: WIFI_SocketAccept
3873 \ingroup wifi_sock_api
3875 The test case \b WIFI_SocketAccept verifies the WiFi Driver \b SocketAccept function:
3877 int32_t (*SocketAccept) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
3881 - Create stream socket
3884 - Check function parameters
3885 - Accept connection, NULL parameters
3886 - Receive ServerId on accepted socket
3887 - Close accepted socket
3888 - Accept connection again, return IP address and port
3889 - Receive ServerId on accepted socket
3890 - Receive again, server closed connection
3891 - Close accepted socket
3892 - Close listening socket
3893 - Accept again, closed socket
3895 Datagram socket test:
3896 - Create datagram socket
3899 - Accept connection, provide return parameters for IP address and port
3900 - Receive ServerId on socket
3903 void WIFI_SocketAccept (void) {
3907 osThreadId_t worker;
3912 if (socket_funcs_exist == 0U) {
3913 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3917 if (station_init (1) == 0) {
3918 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3922 /* Create worker thread */
3923 worker = osThreadNew ((osThreadFunc_t)Th_Accept, &io, NULL);
3924 if (worker == NULL) {
3925 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3931 /* Create stream socket */
3932 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3934 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3940 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3941 TH_ASSERT (io.rc == 0);
3943 /* Start listening */
3945 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3946 TH_ASSERT (io.rc == 0);
3948 /* Check parameter (socket = -1) */
3949 ip_len = sizeof(ip);
3950 ARG_ACCEPT (-1, ip, &ip_len, &port);
3951 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3952 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3954 /* Check parameter (socket = INT32_MIN) */
3955 ARG_ACCEPT (INT32_MIN, ip, &ip_len, &port);
3956 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3957 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3959 /* Check parameter (socket = INT32_MAX) */
3960 ARG_ACCEPT (INT32_MAX, ip, &ip_len, &port);
3961 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3962 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3964 /* Parameters 'ip', 'ip_len' and 'port' are optional, can be NULL */
3966 /* Request a remote server to connect to us */
3967 io.cmd = CMD_CONNECT_TCP;
3968 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
3969 TH_ASSERT (io.rc > 0);
3971 /* Accept connection with NULL parameters */
3972 ARG_ACCEPT (sock, NULL, NULL, NULL);
3973 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT_LONG);
3974 /* Accepted socket should be different */
3975 TH_ASSERT ((io.rc != io.sock) && (io.rc >= 0));
3977 /* Receive SockServer id string */
3979 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
3980 TH_ASSERT (io.rc > 0);
3982 /* Close accepted socket */
3983 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3984 TH_ASSERT (io.rc == 0);
3988 /* Request from remote server to connect to us */
3989 io.cmd = CMD_CONNECT_TCP;
3990 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
3991 TH_ASSERT (io.rc > 0);
3993 /* Initialize buffers for return values */
3995 ip_len = sizeof(ip) + 1;
3996 memset ((void *)ip, 0, sizeof(ip));
3998 /* Accept again, return ip address and port */
3999 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
4000 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT_LONG);
4001 /* Accepted socket should be different */
4002 TH_ASSERT ((io.rc != io.sock) && (io.rc >= 0));
4003 /* IP address should be the address of the server */
4004 TH_ASSERT ((memcmp ((const void *)ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
4005 /* Port number of remote peer should be non-zero */
4006 TH_ASSERT (port != 0);
4008 /* Receive SockServer id string */
4010 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4011 TH_ASSERT (io.rc > 0);
4013 /* SockServer disconnects after 500ms */
4015 /* Receive again, no data */
4016 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4017 /* Should return error (connection reset) */
4018 /* Strict: ECONNRESET, valid non-strict: ERROR */
4019 TH_ASSERT2 ((io.rc == ARM_SOCKET_ECONNRESET), (io.rc == ARM_SOCKET_ERROR), "receive on disconnected socket", io.rc, ARM_SOCKET_ECONNRESET);
4021 /* Close accepted socket */
4022 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4023 TH_ASSERT (io.rc == 0);
4025 /* Close listening socket */
4027 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4028 TH_ASSERT (io.rc == 0);
4030 /* Accept again, closed socket */
4032 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
4033 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
4034 /* Should return error (socket not created) */
4035 /* Strict: ESOCK, valid non-strict: ERROR */
4036 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "accept on closed socket", io.rc, ARM_SOCKET_ESOCK);
4041 /* Create datagram socket */
4042 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
4044 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
4050 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4051 TH_ASSERT (io.rc == 0);
4053 /* Start listening */
4055 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
4056 /* Listen on datagram socket should fail */
4057 /* Strict: ENOTSUP, valid non-strict: ERROR */
4058 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "listen on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
4060 /* Initialize buffers for return values */
4062 ip_len = sizeof(ip);
4063 memset ((void *)ip, 0, sizeof(ip));
4065 /* Accept on datagram socket */
4066 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
4067 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
4068 /* Accept on datagram socket should fail */
4069 /* Strict: ENOTSUP, valid non-strict: ERROR */
4070 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "accept on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
4074 /* Request from remote server to send us a test message */
4075 io.cmd = CMD_CONNECT_UDP;
4076 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
4077 TH_ASSERT (io.rc > 0);
4079 /* Receive SockServer id string */
4080 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4081 TH_ASSERT (io.rc > 0);
4084 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4085 TH_ASSERT (io.rc == 0);
4094 /* Terminate worker thread */
4095 osThreadTerminate (worker);
4098 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4100 /* Connect IO parameters */
4113 /* Assign arguments */
4114 #define ARG_CONNECT(_sock,_ip,_ip_len,_port) do { \
4117 io.ip_len = _ip_len; \
4121 /* Connect worker thread */
4122 __NO_RETURN static void Th_Connect (IO_CONNECT *io) {
4126 /* Wait for the signal to select and execute the function */
4127 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
4128 F_CONNECT | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
4132 /* Create stream socket */
4133 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
4137 /* Create datagram socket */
4138 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
4143 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
4147 /* Connect on socket */
4148 io->rc = drv->SocketConnect (io->sock, io->ip, io->ip_len, io->port);
4152 /* Listen on socket */
4153 io->rc = drv->SocketListen (io->sock, 1);
4158 io->rc = drv->SocketClose (io->sock);
4161 /* Done, send signal to owner thread */
4162 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4164 osThreadFlagsSet (io->owner, flags);
4165 osThreadFlagsClear (F_ALL);
4170 \brief Test case: WIFI_SocketConnect
4171 \ingroup wifi_sock_api
4173 The test case \b WIFI_SocketConnect verifies the WiFi Driver \b SocketConnect function:
4175 int32_t (*SocketConnect) (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port);
4178 Stream socket test 1:
4179 - Create stream socket
4180 - Check function parameters
4181 - Connect to server, blocking mode
4182 - Connect again, already connected
4183 - Bind connected socket
4185 - Connect on closed socket
4187 Stream socket test 2:
4188 - Create stream socket
4189 - Connect to server, connection rejected
4192 Stream socket test 3:
4193 - Create stream socket
4194 - Connect to server, non-responding or non-existent
4197 Stream socket test 4:
4198 - Create stream socket
4201 - Connect to server, blocking mode
4204 Datagram socket test:
4205 - Create datagram socket
4207 - Check function parameters
4208 - Connect to server, enable address filtering
4209 - Connect to unspecified address, disable filtering
4211 - Connect again, closed socket
4213 void WIFI_SocketConnect (void) {
4214 osThreadId_t worker;
4219 if (socket_funcs_exist == 0U) {
4220 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4224 if (station_init (1) == 0) {
4225 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4229 /* Create worker thread */
4230 worker = osThreadNew ((osThreadFunc_t)Th_Connect, &io, NULL);
4231 if (worker == NULL) {
4232 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4238 /* Create stream socket */
4239 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4241 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4245 /* Check parameter (socket = -1) */
4246 ARG_CONNECT(-1, ip_socket_server, 4, DISCARD_PORT);
4247 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4248 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4250 /* Check parameter (socket = INT32_MIN) */
4251 ARG_CONNECT(INT32_MIN, ip_socket_server, 4, DISCARD_PORT);
4252 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4253 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4255 /* Check parameter (socket = INT32_MAX) */
4256 ARG_CONNECT(INT32_MAX, ip_socket_server, 4, DISCARD_PORT);
4257 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4258 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4260 /* Check parameter (ip = NULL) */
4261 ARG_CONNECT(sock, NULL, 4, DISCARD_PORT);
4262 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4263 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4265 /* Check parameter (ip = 0.0.0.0) */
4266 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4267 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4268 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4270 /* Check parameter (ip_len = 0) */
4271 ARG_CONNECT(sock, ip_socket_server, 0, DISCARD_PORT);
4272 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4273 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4275 /* Check parameter (ip_len = 5) */
4276 ARG_CONNECT(sock, ip_socket_server, 5, DISCARD_PORT);
4277 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4278 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4280 /* Check parameter (port = 0) */
4281 ARG_CONNECT(sock, ip_socket_server, 4, 0);
4282 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4283 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4285 /* Connect to stream server */
4286 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4287 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4288 TH_ASSERT (io.rc == 0);
4290 /* Connect 2nd time */
4291 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4292 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4293 /* Should return error (socket already connected) */
4294 /* Strict: EISCONN, valid non-strict: OK, ERROR */
4295 TH_ASSERT2 ((io.rc == ARM_SOCKET_EISCONN), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "connect socket to same address again", io.rc, ARM_SOCKET_EISCONN);
4297 /* Bind connected socket */
4299 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4300 /* Should return error (socket already connected) */
4301 /* Strict: EISCONN, valid non-strict: ERROR */
4302 TH_ASSERT2 ((io.rc == ARM_SOCKET_EISCONN), (io.rc == ARM_SOCKET_ERROR), "bind on connected socket", io.rc, ARM_SOCKET_EISCONN);
4306 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4307 TH_ASSERT (io.rc == 0);
4309 /* Connect again, closed socket */
4310 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4311 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4312 /* Should return error (socket not created) */
4313 /* Strict: ESOCK, valid non-strict: ERROR */
4314 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "connect on closed socket", io.rc, ARM_SOCKET_ESOCK);
4319 /* Create stream socket */
4320 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4322 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4326 /* Connect to stream server (connection rejected) */
4327 ARG_CONNECT(sock, ip_socket_server, 4, TCP_REJECTED_PORT);
4328 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4329 /* Should return error (connection rejected by the peer) */
4330 /* Strict: ECONNREFUSED, valid non-strict: ETIMEDOUT, ERROR */
4331 TH_ASSERT2 ((io.rc == ARM_SOCKET_ECONNREFUSED), ((io.rc == ARM_SOCKET_ETIMEDOUT) || (io.rc == ARM_SOCKET_ERROR)), "connect to non-existent port", io.rc, ARM_SOCKET_ECONNREFUSED);
4335 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4336 TH_ASSERT (io.rc == 0);
4341 /* Create stream socket */
4342 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4344 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4348 /* Connect to stream server (non-existent) */
4349 ARG_CONNECT(sock, ip_socket_server, 4, TCP_TIMEOUT_PORT);
4350 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4351 /* Should return error (connection timeout) */
4352 /* Strict: ETIMEDOUT, valid non-strict: ERROR */
4353 TH_ASSERT2 ((io.rc == ARM_SOCKET_ETIMEDOUT), (io.rc == ARM_SOCKET_ERROR), "connect to non-existent stream server", io.rc, ARM_SOCKET_ETIMEDOUT);
4357 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4358 TH_ASSERT (io.rc == 0);
4363 /* Create stream socket */
4364 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4366 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4372 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4373 TH_ASSERT (io.rc == 0);
4375 /* Start listening */
4377 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
4378 TH_ASSERT (io.rc == 0);
4380 /* Connect to stream server */
4381 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4382 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4383 /* Connect on listening socket should fail */
4384 /* Strict: EINVAL, valid non-strict: ERROR */
4385 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "connect on listening socket", io.rc, ARM_SOCKET_EINVAL);
4389 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4390 TH_ASSERT (io.rc == 0);
4395 /* Create datagram socket */
4396 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
4398 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
4402 /* Check parameter (socket = -1) */
4403 ARG_CONNECT(-1, ip_socket_server, 4, DISCARD_PORT);
4404 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4405 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4407 /* Check parameter (socket = INT32_MIN) */
4408 ARG_CONNECT(INT32_MIN, ip_socket_server, 4, DISCARD_PORT);
4409 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4410 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4412 /* Check parameter (socket = INT32_MAX) */
4413 ARG_CONNECT(INT32_MAX, ip_socket_server, 4, DISCARD_PORT);
4414 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4415 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4417 /* Check parameter (ip = NULL) */
4418 ARG_CONNECT(sock, NULL, 4, DISCARD_PORT);
4419 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4420 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4422 /* Check parameter (ip = 0.0.0.0) */
4423 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4424 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4425 /* Datagram sockets may dissolve the association */
4426 /* by connecting to unspecified address. */
4427 /* Strict: OK, valid non-strict: EINVAL, ERROR */
4428 TH_ASSERT2 ((io.rc == 0), ((io.rc == ARM_SOCKET_EINVAL) || (io.rc == ARM_SOCKET_ERROR)), "connect datagram socket to unspecified address (0.0.0.0)", io.rc, 0);
4430 /* Check parameter (ip_len = 0) */
4431 ARG_CONNECT(sock, ip_socket_server, 0, DISCARD_PORT);
4432 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4433 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4435 /* Check parameter (ip_len = 5) */
4436 ARG_CONNECT(sock, ip_socket_server, 5, DISCARD_PORT);
4437 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4438 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4440 /* Check parameter (port = 0) */
4441 ARG_CONNECT(sock, ip_socket_server, 4, 0);
4442 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4443 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4445 /* Connect to datagram server */
4446 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4447 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4448 TH_ASSERT (io.rc == 0);
4450 /* Connect to unspecified address (0.0.0.0) */
4451 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4452 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4453 /* Datagram sockets may dissolve the association */
4454 /* by connecting to unspecified address. */
4455 /* Should return ok (socket address deleted) */
4456 /* Strict: OK, valid non-strict: EINVAL, ERROR */
4457 TH_ASSERT2 ((io.rc == 0), ((io.rc == ARM_SOCKET_EINVAL) || (io.rc == ARM_SOCKET_ERROR)), "connect datagram socket to unspecified address (0.0.0.0)", io.rc, 0);
4461 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4462 TH_ASSERT (io.rc == 0);
4464 /* Connect again, closed socket */
4465 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4466 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4467 /* Should return error (socket not created) */
4468 /* Strict: ESOCK, valid non-strict: ERROR */
4469 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "connect on closed socket", io.rc, ARM_SOCKET_ESOCK);
4478 /* Terminate worker thread */
4479 osThreadTerminate (worker);
4482 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4484 /* Recv IO parameters */
4496 /* Assign arguments */
4497 #define ARG_RECV(_sock,_buf,_len) do { \
4503 /* Recv worker thread */
4504 __NO_RETURN static void Th_Recv (IO_RECV *io) {
4508 /* Wait for the signal to select and execute the function */
4509 flags = osThreadFlagsWait (F_CREATE_TCP | F_BIND | F_CONNECT | F_LISTEN |
4510 F_SETOPT | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
4514 /* Create stream socket */
4515 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
4520 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
4524 /* Connect on socket */
4525 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, (uint16_t)io->tval);
4529 /* Listen on socket */
4530 io->rc = drv->SocketListen (io->sock, 1);
4534 /* Set socket options */
4535 io->rc = drv->SocketSetOpt (io->sock, ARM_SOCKET_SO_RCVTIMEO, &io->tval, sizeof(io->tval));
4539 /* Recv on socket */
4540 if (io->buf != NULL) {
4541 memset((void *)io->buf, 0xCC, io->len);
4543 io->rc = drv->SocketRecv (io->sock, io->buf, io->len);
4548 io->rc = drv->SocketClose (io->sock);
4551 /* Done, send signal to owner thread */
4552 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4554 osThreadFlagsSet (io->owner, flags);
4555 osThreadFlagsClear (F_ALL);
4560 \brief Test case: WIFI_SocketRecv
4561 \ingroup wifi_sock_api
4563 Test case \b WIFI_SocketRecv verifies the WiFi Driver \b SocketRecv function:
4565 int32_t (*SocketRecv) (int32_t socket, void *buf, uint32_t len);
4568 Stream socket test 1:
4569 - Create stream socket
4570 - Connect to Chargen server
4571 - Check function parameters
4572 - Receive data in blocking mode
4574 - Receive again, closed socket
4576 Stream socket test 2:
4577 - Create stream socket
4578 - Receive data, created socket
4580 - Receive data, bound socket
4582 - Receive data, listening socket
4585 Stream socket test 3:
4586 - Create stream socket
4587 - Connect to Discard server
4588 - Set receive timeout to 1 sec
4589 - Receive data, timeout expires
4592 void WIFI_SocketRecv (void) {
4594 uint32_t ticks,tout;
4595 osThreadId_t worker;
4600 if (socket_funcs_exist == 0U) {
4601 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4605 if (station_init (1) == 0) {
4606 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4610 /* Create worker thread */
4611 worker = osThreadNew ((osThreadFunc_t)Th_Recv, &io, NULL);
4612 if (worker == NULL) {
4613 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4619 /* Create stream socket */
4620 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4622 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4626 /* Connect to stream server */
4628 io.tval = CHARGEN_PORT;
4629 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4630 TH_ASSERT (io.rc == 0);
4632 /* Check parameter (socket = -1) */
4633 ARG_RECV (-1, buf, sizeof(buf));
4634 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4635 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4637 /* Check parameter (socket = INT32_MIN) */
4638 ARG_RECV (INT32_MIN, buf, sizeof(buf));
4639 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4640 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4642 /* Check parameter (socket = INT32_MAX) */
4643 ARG_RECV (INT32_MAX, buf, sizeof(buf));
4644 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4645 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4647 /* Check parameter (buf = NULL) */
4648 ARG_RECV (sock, NULL, sizeof(buf));
4649 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4650 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4652 /* Check parameter (len = 0) */
4653 ARG_RECV (sock, buf, 0);
4654 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4655 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4657 /* Receive some data */
4658 ARG_RECV (sock, buffer, sizeof(buffer));
4659 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4660 TH_ASSERT (io.rc >= 2);
4664 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4665 TH_ASSERT (io.rc == 0);
4667 /* Receive again, closed socket */
4668 ARG_RECV (sock, buffer, sizeof(buffer));
4669 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4670 /* Should return error (socket not created) */
4671 /* Strict: ESOCK, valid non-strict: ERROR */
4672 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "recv on closed socket", io.rc, ARM_SOCKET_ESOCK);
4677 /* Create stream socket */
4678 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4680 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4682 /* Test server mode */
4685 /* Receive, created socket */
4686 ARG_RECV (sock, buffer, sizeof(buffer));
4687 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4688 /* Should return error (socket not connected) */
4689 /* Strict: ENOTCONN, valid non-strict: ERROR */
4690 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on created socket", io.rc, ARM_SOCKET_ENOTCONN);
4694 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4695 TH_ASSERT (io.rc == 0);
4697 /* Receive, bound socket */
4698 ARG_RECV (sock, buffer, sizeof(buffer));
4699 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4700 /* Should return error (socket not connected) */
4701 /* Strict: ENOTCONN, valid non-strict: ERROR */
4702 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
4704 /* Start listening */
4706 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
4707 TH_ASSERT (io.rc == 0);
4709 /* Receive, listening socket */
4710 ARG_RECV (sock, buffer, sizeof(buffer));
4711 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4712 /* Should return error (socket not connected) */
4713 /* Strict: ENOTCONN, valid non-strict: ERROR */
4714 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
4718 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4719 TH_ASSERT (io.rc == 0);
4724 /* Create stream socket */
4725 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4727 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4731 /* Connect to stream server */
4733 io.tval = DISCARD_PORT;
4734 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4735 TH_ASSERT (io.rc == 0);
4737 /* Set receive timeout to 1 sec */
4740 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
4741 TH_ASSERT (io.rc == 0);
4743 /* Receive until timeout, no data */
4744 ARG_RECV (sock, buffer, sizeof(buffer));
4745 ticks = GET_SYSTICK();
4746 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4747 tout = GET_SYSTICK() - ticks;
4748 /* Should return EAGAIN (operation timed out) */
4749 TH_ASSERT (io.rc == ARM_SOCKET_EAGAIN);
4750 /* Check receive timeout is in the range of 0.9 to 1.1 sec */
4751 TH_ASSERT (tout > SYSTICK_MICROSEC(900000) && tout < SYSTICK_MICROSEC(1100000));
4755 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4756 TH_ASSERT (io.rc == 0);
4765 /* Terminate worker thread */
4766 osThreadTerminate (worker);
4769 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4771 /* RecvFrom IO parameters */
4786 /* Assign arguments */
4787 #define ARG_RECVFROM(_sock,_buf,_len,_ip,_ip_len,_port) do { \
4792 io.ip_len = _ip_len; \
4796 /* RecvFrom worker thread */
4797 __NO_RETURN static void Th_RecvFrom (IO_RECVFROM *io) {
4801 /* Wait for the signal to select and execute the function */
4802 flags = osThreadFlagsWait (F_CREATE_UDP | F_CONNECT | F_SETOPT |
4803 F_RECVFROM | F_SEND | F_CLOSE, osFlagsWaitAny, osWaitForever);
4807 /* Create datagram socket */
4808 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
4812 /* Connect on socket */
4813 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, CHARGEN_PORT);
4817 /* Set socket options */
4818 io->rc = drv->SocketSetOpt (io->sock, ARM_SOCKET_SO_RCVTIMEO, &io->tout, sizeof(io->tout));
4822 /* RecvFrom on socket */
4823 if (io->buf != NULL) {
4824 memset((void *)io->buf, 0xCC, io->len);
4826 io->rc = drv->SocketRecvFrom (io->sock, io->buf, io->len, io->ip, io->ip_len, io->port);
4830 /* Send on socket */
4831 io->rc = drv->SocketSend (io->sock, "a", 1);
4836 io->rc = drv->SocketClose (io->sock);
4839 /* Done, send signal to owner thread */
4840 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4842 osThreadFlagsSet (io->owner, flags);
4843 osThreadFlagsClear (F_ALL);
4848 \brief Test case: WIFI_SocketRecvFrom
4849 \ingroup wifi_sock_api
4851 The test case \b WIFI_SocketRecvFrom verifies the WiFi Driver \b SocketRecvFrom function:
4853 int32_t (*SocketRecvFrom) (int32_t socket, void *buf, uint32_t len, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
4856 Datagram socket test 1:
4857 - Create datagram socket
4858 - Connect to Chargen server
4859 - Check function parameters
4860 - Receive data in blocking mode
4861 - Set receive timeout to 1 sec
4862 - Receive again, timeout expires
4864 - Receive again, closed socket
4866 void WIFI_SocketRecvFrom (void) {
4868 uint32_t ip_len,ticks,tout;
4871 osThreadId_t worker;
4876 if (socket_funcs_exist == 0U) {
4877 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4881 if (station_init (1) == 0) {
4882 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4886 /* Create worker thread */
4887 worker = osThreadNew ((osThreadFunc_t)Th_RecvFrom, &io, NULL);
4888 if (worker == NULL) {
4889 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4895 /* Create datagram socket */
4896 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
4898 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
4902 /* Connect to datagram server */
4904 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4905 TH_ASSERT (io.rc == 0);
4907 /* Check parameter (socket = -1) */
4908 ip_len = sizeof(ip);
4909 ARG_RECVFROM (-1, buf, sizeof(buf), ip, &ip_len, &port);
4910 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4911 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4913 /* Check parameter (socket = INT32_MIN) */
4914 ARG_RECVFROM (INT32_MIN, buf, sizeof(buf), ip, &ip_len, &port);
4915 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4916 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4918 /* Check parameter (socket = INT32_MAX) */
4919 ARG_RECVFROM (INT32_MAX, buf, sizeof(buf), ip, &ip_len, &port);
4920 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4921 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4923 /* Check parameter (buf == NULL) */
4924 ARG_RECVFROM (sock, NULL, sizeof(buf), ip, &ip_len, &port);
4925 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4926 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4928 /* Check parameter (len = 0) */
4929 ARG_RECVFROM (sock, buf, 0, ip, &ip_len, &port);
4930 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4931 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4933 /* Send one byte of data to trigger a reply */
4935 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
4936 TH_ASSERT (io.rc == 1);
4938 /* Initialize buffers for return values */
4940 ip_len = sizeof(ip) + 1;
4941 memset ((void *)ip, 0, sizeof(ip));
4943 /* Receive some data */
4944 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
4945 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT_LONG);
4946 /* Should receive at least 2 bytes */
4947 TH_ASSERT (io.rc >= 2);
4948 /* IP address should be the address of the server */
4949 TH_ASSERT ((memcmp ((const void *)ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
4950 /* Port number should be the port of the CHARGEN server */
4951 TH_ASSERT (port == CHARGEN_PORT);
4953 /* Set receive timeout to 1 sec */
4956 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
4957 TH_ASSERT (io.rc == 0);
4959 /* Receive until timeout, no data */
4960 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
4961 ticks = GET_SYSTICK();
4962 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4963 tout = GET_SYSTICK() - ticks;
4964 /* Should return EAGAIN (operation timed out) */
4965 TH_ASSERT (io.rc == ARM_SOCKET_EAGAIN);
4966 /* Check receive timeout is in the range of 0.9 to 1.1 sec */
4967 TH_ASSERT (tout > SYSTICK_MICROSEC(900000) && tout < SYSTICK_MICROSEC(1100000));
4971 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4972 TH_ASSERT (io.rc == 0);
4974 /* Receive again, closed socket */
4975 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
4976 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4977 /* Should return error (socket not created) */
4978 /* Strict: ESOCK, valid non-strict: ERROR */
4979 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "recvfrom on closed socket", io.rc, ARM_SOCKET_ESOCK);
4988 /* Terminate worker thread */
4989 osThreadTerminate (worker);
4992 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4994 /* Send IO parameters */
5005 /* Assign arguments */
5006 #define ARG_SEND(_sock,_buf,_len) do { \
5012 /* Send worker thread */
5013 __NO_RETURN static void Th_Send (IO_SEND *io) {
5017 /* Wait for the signal to select and execute the function */
5018 flags = osThreadFlagsWait (F_CREATE_TCP | F_BIND | F_CONNECT |
5019 F_LISTEN | F_SEND | F_CLOSE, osFlagsWaitAny, osWaitForever);
5023 /* Create stream socket */
5024 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
5029 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
5033 /* Connect on socket */
5034 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
5038 /* Listen on socket */
5039 io->rc = drv->SocketListen (io->sock, 1);
5043 /* Send on socket */
5044 io->rc = drv->SocketSend (io->sock, io->buf, io->len);
5049 io->rc = drv->SocketClose (io->sock);
5052 /* Done, send signal to owner thread */
5053 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5055 osThreadFlagsSet (io->owner, flags);
5056 osThreadFlagsClear (F_ALL);
5061 \brief Test case: WIFI_SocketSend
5062 \ingroup wifi_sock_api
5064 The test case \b WIFI_SocketSend verifies the WiFi Driver \b SocketSend function:
5066 int32_t (*SocketSend) (int32_t socket, const void *buf, uint32_t len);
5069 Stream socket test 1:
5070 - Create stream socket
5071 - Connect to server, blocking mode
5072 - Check function parameters
5073 - Send data, blocking mode
5075 - Send again, closed socket
5077 Stream socket test 2:
5078 - Create stream socket
5079 - Connect to server, blocking mode
5080 - Send ESC data, server disconnects
5081 - Send again, disconnected socket
5084 Stream socket test 3:
5085 - Create stream socket
5086 - Send data, created socket
5088 - Send data, bound socket
5090 - Send data, listening socket
5092 - Send again, closed socket
5094 void WIFI_SocketSend (void) {
5095 osThreadId_t worker;
5100 if (socket_funcs_exist == 0U) {
5101 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5105 if (station_init (1) == 0) {
5106 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5110 /* Create worker thread */
5111 worker = osThreadNew ((osThreadFunc_t)Th_Send, &io, NULL);
5112 if (worker == NULL) {
5113 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5119 /* Create stream socket */
5120 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5122 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5126 /* Connect to stream server */
5128 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5129 TH_ASSERT (io.rc == 0);
5131 /* Check parameter (socket = -1) */
5132 ARG_SEND (-1, test_msg, sizeof(test_msg));
5133 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5134 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5136 /* Check parameter (socket = INT32_MIN) */
5137 ARG_SEND (INT32_MIN, test_msg, sizeof(test_msg));
5138 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5139 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5141 /* Check parameter (socket = INT32_MAX) */
5142 ARG_SEND (INT32_MAX, test_msg, sizeof(test_msg));
5143 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5144 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5146 /* Check parameter (buf = NULL) */
5147 ARG_SEND (sock, NULL, sizeof(test_msg));
5148 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5149 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5151 /* Check parameter (len = 0) */
5152 ARG_SEND (sock, test_msg, 0);
5153 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5154 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5156 /* Send some data */
5157 ARG_SEND (sock, test_msg, sizeof(test_msg));
5158 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
5159 TH_ASSERT (io.rc == sizeof(test_msg));
5163 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5164 TH_ASSERT (io.rc == 0);
5166 /* Send again, closed socket */
5167 ARG_SEND (sock, test_msg, sizeof(test_msg));
5168 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5169 /* Should return error (socket not created) */
5170 /* Strict: ESOCK, valid non-strict: ERROR */
5171 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "send on closed socket", io.rc, ARM_SOCKET_ESOCK);
5176 /* Create stream socket */
5177 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5179 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5183 /* Connect to stream server */
5185 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5186 TH_ASSERT (io.rc == 0);
5188 /* Send ESC command, server disconnects */
5189 ARG_SEND (sock, (uint8_t *)"\x1B", 1);
5190 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
5191 TH_ASSERT (io.rc == 1);
5193 /* Wait for the server to disconnect */
5196 /* Send again, disconnected socket */
5197 ARG_SEND (sock, test_msg, sizeof(test_msg));
5198 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5199 /* Should return error (connection reset by the peer) */
5200 /* Strict: ECONNRESET, valid non-strict: ERROR */
5201 TH_ASSERT2 ((io.rc == ARM_SOCKET_ECONNRESET), (io.rc == ARM_SOCKET_ERROR), "send on disconnected socket", io.rc, ARM_SOCKET_ECONNRESET);
5205 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5206 TH_ASSERT (io.rc == 0);
5211 /* Create stream socket */
5212 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5214 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5218 /* Send data, created socket */
5219 ARG_SEND (sock, test_msg, sizeof(test_msg));
5220 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5221 /* Should return error (socket not connected) */
5222 /* Strict: ENOTCONN, valid non-strict: ERROR */
5223 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on created socket", io.rc, ARM_SOCKET_ENOTCONN);
5227 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5228 TH_ASSERT (io.rc == 0);
5230 /* Send data, bound socket */
5231 ARG_SEND (sock, test_msg, sizeof(test_msg));
5232 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5233 /* Should return error (socket not connected) */
5234 /* Strict: ENOTCONN, valid non-strict: ERROR */
5235 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
5237 /* Start listening */
5239 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
5240 TH_ASSERT (io.rc == 0);
5242 /* Send data, listening socket */
5243 ARG_SEND (sock, test_msg, sizeof(test_msg));
5244 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5245 /* Should return error (socket not connected) */
5246 /* Strict: ENOTCONN, valid non-strict: ERROR */
5247 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
5251 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5252 TH_ASSERT (io.rc == 0);
5254 /* Send again, closed socket */
5255 ARG_SEND (sock, test_msg, sizeof(test_msg));
5256 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5257 /* Should return error (socket not created) */
5258 /* Strict: ESOCK, valid non-strict: ERROR */
5259 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "send on closed socket", io.rc, ARM_SOCKET_ESOCK);
5268 /* Terminate worker thread */
5269 osThreadTerminate (worker);
5272 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5274 /* SendTo IO parameters */
5289 /* Assign arguments */
5290 #define ARG_SENDTO(_sock,_buf,_len,_ip,_ip_len,_port) do { \
5295 io.ip_len = _ip_len; \
5299 /* SendTo worker thread */
5300 __NO_RETURN static void Th_SendTo (IO_SENDTO *io) {
5304 /* Wait for the signal to select and execute the function */
5305 flags = osThreadFlagsWait (F_CREATE_UDP | F_SENDTO | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
5309 /* Create datagram socket */
5310 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5314 /* SendTo on socket */
5315 io->rc = drv->SocketSendTo (io->sock, io->buf, io->len, io->ip, io->ip_len, io->port);
5319 /* Recv on socket */
5320 memset((void *)buffer, 0xCC, sizeof(buffer));
5321 io->rc = drv->SocketRecv (io->sock, buffer, sizeof(buffer));
5326 io->rc = drv->SocketClose (io->sock);
5329 /* Done, send signal to owner thread */
5330 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5332 osThreadFlagsSet (io->owner, flags);
5333 osThreadFlagsClear (F_ALL);
5338 \brief Test case: WIFI_SocketSendTo
5339 \ingroup wifi_sock_api
5341 The test case \b WIFI_SocketSend verifies the WiFi Driver \b SocketSendTo function:
5343 int32_t (*SocketSendTo) (int32_t socket, const void *buf, uint32_t len, const uint8_t *ip, uint32_t ip_len, uint16_t port);
5346 Datagram socket test:
5347 - Create datagram socket
5348 - Check function parameters
5349 - Send data, blocking mode
5350 - Receive echo data, verify if the same
5352 - Send again, closed socket
5354 void WIFI_SocketSendTo (void) {
5355 osThreadId_t worker;
5360 if (socket_funcs_exist == 0U) {
5361 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5365 if (station_init (1) == 0) {
5366 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5370 /* Create worker thread */
5371 worker = osThreadNew ((osThreadFunc_t)Th_SendTo, &io, NULL);
5372 if (worker == NULL) {
5373 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5379 /* Create datagram socket */
5380 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5382 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5386 /* Check parameter (socket = -1) */
5387 ARG_SENDTO (-1, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5388 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5389 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5391 /* Check parameter (socket = INT32_MIN) */
5392 ARG_SENDTO (INT32_MIN, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5393 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5394 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5396 /* Check parameter (socket = INT32_MAX) */
5397 ARG_SENDTO (INT32_MAX, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5398 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5399 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5401 /* Check parameter (buf == NULL) */
5402 ARG_SENDTO (sock, NULL, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5403 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5404 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5406 /* Check parameter (len = 0) */
5407 ARG_SENDTO (sock, test_msg, 0, ip_socket_server, 4, ECHO_PORT);
5408 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5409 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5411 /* Send some data */
5412 ARG_SENDTO (sock, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5413 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT_LONG);
5414 TH_ASSERT (io.rc == sizeof(test_msg));
5416 /* Receive the echoed data */
5418 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
5419 /* Should receive the same data (ECHO protocol) */
5420 TH_ASSERT ((io.rc == sizeof(test_msg)) && (memcmp ((const void *)test_msg, (const void *)buffer, sizeof(test_msg)) == 0));
5424 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5425 TH_ASSERT (io.rc == 0);
5427 /* Send again, closed socket */
5428 ARG_SENDTO (sock, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5429 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5430 /* Should return error (socket not created) */
5431 /* Strict: ESOCK, valid non-strict: ERROR */
5432 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "sendto on closed socket", io.rc, ARM_SOCKET_ESOCK);
5441 /* Terminate worker thread */
5442 osThreadTerminate (worker);
5445 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5447 /* GetSockName IO parameters */
5459 /* Assign arguments */
5460 #define ARG_GETSOCKNAME(_sock,_ip,_ip_len,_port) do { \
5463 io.ip_len = _ip_len; \
5467 /* GetSockName worker thread */
5468 __NO_RETURN static void Th_GetSockName (IO_GETSOCKNAME *io) {
5472 /* Wait for the signal to select and execute the function */
5473 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
5474 F_CONNECT | F_GETSOCKNAME | F_CLOSE, osFlagsWaitAny, osWaitForever);
5478 /* Create stream socket */
5479 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
5483 /* Create datagram socket */
5484 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5489 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
5493 /* Connect on socket */
5494 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
5498 /* Get socket name */
5499 io->rc = drv->SocketGetSockName (io->sock, io->ip, io->ip_len, io->port);
5504 io->rc = drv->SocketClose (io->sock);
5507 /* Done, send signal to owner thread */
5508 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5510 osThreadFlagsSet (io->owner, flags);
5511 osThreadFlagsClear (F_ALL);
5516 \brief Test case: WIFI_SocketGetSockName
5517 \ingroup wifi_sock_api
5519 The test case \b WIFI_SocketGetSockName verifies the WiFi Driver \b SocketGetSockName function:
5521 int32_t (*SocketGetSockName) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
5524 Stream socket test 1:
5525 - Create stream socket
5526 - Connect to server, blocking mode
5527 - Check function parameters
5530 - Get socket name again, closed socket
5532 Stream socket test 1:
5533 - Create stream socket
5534 - Get socket name, not bound
5536 - Get socket name, bound
5539 Datagram socket test 1:
5540 - Create datagram socket
5541 - Connect to server, enable packet filtering
5542 - Check function parameters
5545 - Get socket name again, closed socket
5547 Datagram socket test 1:
5548 - Create datagram socket
5549 - Get socket name, not bound
5551 - Get socket name, bound
5554 void WIFI_SocketGetSockName (void) {
5555 uint8_t local_ip[4];
5556 uint16_t local_port;
5558 osThreadId_t worker;
5563 if (socket_funcs_exist == 0U) {
5564 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5568 if (station_init (1) == 0) {
5569 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5573 /* Create worker thread */
5574 worker = osThreadNew ((osThreadFunc_t)Th_GetSockName, &io, NULL);
5575 if (worker == NULL) {
5576 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5582 /* Create stream socket */
5583 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5585 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5587 /* Test client mode */
5590 /* Connect to stream server */
5592 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5593 TH_ASSERT (io.rc == 0);
5595 /* Check parameter (socket = -1) */
5596 ip_len = sizeof(local_ip);
5597 ARG_GETSOCKNAME (-1, local_ip, &ip_len, &local_port);
5598 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5599 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5601 /* Check parameter (socket = INT32_MIN) */
5602 ARG_GETSOCKNAME (INT32_MIN, local_ip, &ip_len, &local_port);
5603 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5604 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5606 /* Check parameter (socket = INT32_MAX) */
5607 ARG_GETSOCKNAME (INT32_MAX, local_ip, &ip_len, &local_port);
5608 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5609 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5611 /* Check parameter (port = NULL) */
5612 ip_len = sizeof(local_ip);
5613 ARG_GETSOCKNAME (sock, local_ip, &ip_len, NULL);
5614 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5615 /* Request IP address only should be accepted */
5616 TH_ASSERT (io.rc == 0);
5618 /* Check parameter (ip = NULL, ip_len = NULL) */
5619 ARG_GETSOCKNAME (sock, NULL, NULL, &local_port);
5620 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5621 /* Request port only should be accepted */
5622 TH_ASSERT (io.rc == 0);
5624 /* Initialize buffers for return values */
5626 ip_len = sizeof(local_ip) + 1;
5627 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5629 /* Retrieve socket name */
5630 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5631 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5632 TH_ASSERT (io.rc == 0);
5633 /* IP address should be different from broadcast */
5634 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_bcast, 4) != 0) && (ip_len == 4));
5635 /* Port number should be non-zero */
5636 TH_ASSERT (local_port != 0);
5640 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5641 TH_ASSERT (io.rc == 0);
5643 /* Retrieve socket name again */
5644 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5645 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5646 /* Should return error (socket not created) */
5647 /* Strict: ESOCK, valid non-strict: ERROR */
5648 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockname on closed socket", io.rc, ARM_SOCKET_ESOCK);
5653 /* Create stream socket */
5654 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5656 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5658 /* Test server mode */
5661 /* Retrieve socket name, not bound */
5662 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5663 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5664 /* Should return error (socket not bound) */
5665 /* Strict: EINVAL, valid non-strict: ERROR */
5666 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "getsockname on unbound socket", io.rc, ARM_SOCKET_EINVAL);
5668 /* Initialize buffers for return values */
5670 ip_len = sizeof(local_ip) + 1;
5671 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5675 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5676 TH_ASSERT (io.rc == 0);
5678 /* Retrieve socket name, bound */
5679 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5680 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5681 TH_ASSERT (io.rc == 0);
5682 /* IP address should be unspecified */
5683 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_unspec, 4) == 0) && (ip_len == 4));
5684 /* Port number should be listening port */
5685 TH_ASSERT (local_port == DISCARD_PORT);
5689 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5690 TH_ASSERT (io.rc == 0);
5695 /* Create datagram socket */
5696 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5698 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5700 /* Test client mode */
5703 /* Connect to datagram server */
5705 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
5706 TH_ASSERT (io.rc == 0);
5708 /* Check parameter (socket = -1) */
5709 ARG_GETSOCKNAME (-1, local_ip, &ip_len, &local_port);
5710 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5711 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5713 /* Check parameter (socket = INT32_MIN) */
5714 ARG_GETSOCKNAME (INT32_MIN, local_ip, &ip_len, &local_port);
5715 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5716 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5718 /* Check parameter (socket = INT32_MAX) */
5719 ARG_GETSOCKNAME (INT32_MAX, local_ip, &ip_len, &local_port);
5720 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5721 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5723 /* Check parameter (port = NULL) */
5724 ip_len = sizeof(local_ip);
5725 ARG_GETSOCKNAME (sock, local_ip, &ip_len, NULL);
5726 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5727 /* Request IP address only should be accepted */
5728 TH_ASSERT (io.rc == 0);
5730 /* Check parameter (ip = NULL, ip_len = NULL) */
5731 ARG_GETSOCKNAME (sock, NULL, NULL, &local_port);
5732 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5733 /* Request port only should be accepted */
5734 TH_ASSERT (io.rc == 0);
5736 /* Initialize buffers for return values */
5738 ip_len = sizeof(local_ip) + 1;
5739 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5741 /* Retrieve socket name */
5742 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5743 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5744 TH_ASSERT (io.rc == 0);
5745 /* IP address should be different from broadcast */
5746 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_bcast, 4) != 0) && (ip_len == 4));
5747 /* Port number should be non-zero */
5748 TH_ASSERT (local_port != 0);
5752 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5753 TH_ASSERT (io.rc == 0);
5755 /* Retrieve socket name again */
5756 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5757 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5758 /* Should return error (socket not created) */
5759 /* Strict: ESOCK, valid non-strict: ERROR */
5760 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockname on closed socket", io.rc, ARM_SOCKET_ESOCK);
5765 /* Create datagram socket */
5766 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5768 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5770 /* Test server mode */
5773 /* Retrieve socket name, not bound */
5774 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5775 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5776 /* Should return error (socket not bound) */
5777 /* Strict: EINVAL, valid non-strict: ERROR */
5778 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "getsockname on unbound socket", io.rc, ARM_SOCKET_EINVAL);
5780 /* Initialize buffers for return values */
5782 ip_len = sizeof(local_ip) + 1;
5783 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5787 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5788 TH_ASSERT (io.rc == 0);
5790 /* Retrieve socket name, bound */
5791 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5792 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5793 TH_ASSERT (io.rc == 0);
5794 /* IP address should be unspecified */
5795 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_unspec, 4) == 0) && (ip_len == 4));
5796 /* Port number should be listening port */
5797 TH_ASSERT (local_port == DISCARD_PORT);
5801 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5802 TH_ASSERT (io.rc == 0);
5811 /* Terminate worker thread */
5812 osThreadTerminate (worker);
5815 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5817 /* GetPeerName IO parameters */
5829 /* Assign arguments */
5830 #define ARG_GETPEERNAME(_sock,_ip,_ip_len,_port) do { \
5833 io.ip_len = _ip_len; \
5837 /* GetPeerName worker thread */
5838 __NO_RETURN static void Th_GetPeerName (IO_GETPEERNAME *io) {
5842 /* Wait for the signal to select and execute the function */
5843 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_CONNECT |
5844 F_LISTEN | F_GETPEERNAME | F_CLOSE, osFlagsWaitAny, osWaitForever);
5848 /* Create stream socket */
5849 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
5853 /* Create datagram socket */
5854 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5859 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
5863 /* Connect on socket */
5864 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
5868 /* Listen on socket */
5869 io->rc = drv->SocketListen (io->sock, 1);
5874 io->rc = drv->SocketGetPeerName (io->sock, io->ip, io->ip_len, io->port);
5879 io->rc = drv->SocketClose (io->sock);
5882 /* Done, send signal to owner thread */
5883 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5885 osThreadFlagsSet (io->owner, flags);
5886 osThreadFlagsClear (F_ALL);
5891 \brief Test case: WIFI_SocketGetPeerName
5892 \ingroup wifi_sock_api
5894 The test case \b WIFI_SocketGetPeerName verifies the WiFi Driver \b SocketGetPeerName function:
5896 int32_t (*SocketGetPeerName) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
5899 Stream socket test 1:
5900 - Create stream socket
5901 - Connect to server, blocking mode
5902 - Check function parameters
5905 - Get peer name, closed socket
5907 Stream socket test 2:
5908 - Create stream socket
5909 - Get peer name, created socket
5911 - Get peer name, bound socket
5913 - Get peer name, listening socket
5916 Datagram socket test:
5917 - Create datagram socket
5918 - Connect to server, enable packet filtering
5919 - Check function parameters
5922 - Get peer name, closed socket
5924 void WIFI_SocketGetPeerName (void) {
5928 osThreadId_t worker;
5933 if (socket_funcs_exist == 0U) {
5934 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5938 if (station_init (1) == 0) {
5939 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5943 /* Create worker thread */
5944 worker = osThreadNew ((osThreadFunc_t)Th_GetPeerName, &io, NULL);
5945 if (worker == NULL) {
5946 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5952 /* Create stream socket */
5953 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5955 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5959 /* Connect to stream server */
5961 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5962 TH_ASSERT (io.rc == 0);
5964 /* Check parameter (socket = -1) */
5965 ip_len = sizeof(peer_ip);
5966 ARG_GETPEERNAME (-1, peer_ip, &ip_len, &peer_port);
5967 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5968 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5970 /* Check parameter (socket = INT32_MIN) */
5971 ARG_GETPEERNAME (INT32_MIN, peer_ip, &ip_len, &peer_port);
5972 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5973 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5975 /* Check parameter (socket = INT32_MAX) */
5976 ARG_GETPEERNAME (INT32_MAX, peer_ip, &ip_len, &peer_port);
5977 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5978 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5980 /* Check parameter (port = NULL) */
5981 ip_len = sizeof(peer_ip);
5982 ARG_GETPEERNAME (sock, peer_ip, &ip_len, NULL);
5983 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5984 /* Request IP address only should be accepted */
5985 TH_ASSERT (io.rc == 0);
5987 /* Check parameter (ip = NULL, ip_len = NULL) */
5988 ARG_GETPEERNAME (sock, NULL, NULL, &peer_port);
5989 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5990 /* Request port only should be accepted */
5991 TH_ASSERT (io.rc == 0);
5993 /* Initialize buffers for return values */
5995 ip_len = sizeof(peer_ip) + 1;
5996 memcpy (peer_ip, ip_bcast, sizeof(peer_ip));
5998 /* Retrieve peer name */
5999 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6000 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6001 TH_ASSERT (io.rc == 0);
6002 /* IP address should be the address of the server */
6003 TH_ASSERT ((memcmp ((const void *)peer_ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
6004 /* Port number should be the DISCARD port */
6005 TH_ASSERT (peer_port == DISCARD_PORT);
6007 /* Close stream socket */
6009 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6010 TH_ASSERT (io.rc == 0);
6012 /* Retrieve peer name again */
6013 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6014 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6015 /* Should return error (socket not created) */
6016 /* Strict: ESOCK, valid non-strict: ERROR */
6017 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getpeername on closed socket", io.rc, ARM_SOCKET_ESOCK);
6022 /* Create stream socket */
6023 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6025 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6029 /* Get peer name, created socket */
6030 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6031 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6032 /* Should return error (socket not connected) */
6033 /* Strict: ENOTCONN, valid non-strict: ERROR */
6034 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on created socket", io.rc, ARM_SOCKET_ENOTCONN);
6038 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
6039 TH_ASSERT (io.rc == 0);
6041 /* Get peer name, bound socket */
6042 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6043 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6044 /* Should return error (socket not connected) */
6045 /* Strict: ENOTCONN, valid non-strict: ERROR */
6046 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
6048 /* Start listening */
6050 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
6051 TH_ASSERT (io.rc == 0);
6053 /* Get peer name, listening socket */
6054 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6055 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6056 /* Should return error (socket not connected) */
6057 /* Strict: ENOTCONN, valid non-strict: ERROR */
6058 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
6062 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6063 TH_ASSERT (io.rc == 0);
6068 /* Create datagram socket */
6069 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6071 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6075 /* Connect to datagram server */
6077 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
6078 TH_ASSERT (io.rc == 0);
6080 /* Check parameter (socket = -1) */
6081 ip_len = sizeof(peer_ip);
6082 ARG_GETPEERNAME (-1, peer_ip, &ip_len, &peer_port);
6083 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6084 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6086 /* Check parameter (socket = INT32_MIN) */
6087 ARG_GETPEERNAME (INT32_MIN, peer_ip, &ip_len, &peer_port);
6088 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6089 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6091 /* Check parameter (socket = INT32_MAX) */
6092 ARG_GETPEERNAME (INT32_MAX, peer_ip, &ip_len, &peer_port);
6093 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6094 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6096 /* Check parameter (port = NULL) */
6097 ip_len = sizeof(peer_ip);
6098 ARG_GETPEERNAME (sock, peer_ip, &ip_len, NULL);
6099 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6100 /* Request IP address only should be accepted */
6101 TH_ASSERT (io.rc == 0);
6103 /* Check parameter (ip = NULL, ip_len = NULL) */
6104 ARG_GETPEERNAME (sock, NULL, NULL, &peer_port);
6105 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6106 /* Request port only should be accepted */
6107 TH_ASSERT (io.rc == 0);
6109 /* Initialize buffers for return values */
6111 ip_len = sizeof(peer_ip) + 1;
6112 memcpy (peer_ip, ip_bcast, sizeof(peer_ip));
6114 /* Retrieve peer name */
6115 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6116 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6117 TH_ASSERT (io.rc == 0);
6118 /* IP address should be the address of the server */
6119 TH_ASSERT ((memcmp ((const void *)peer_ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
6120 /* Port number should be the DISCARD port */
6121 TH_ASSERT (peer_port == DISCARD_PORT);
6125 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6126 TH_ASSERT (io.rc == 0);
6128 /* Retrieve peer name again */
6129 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6130 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6131 /* Should return error (socket not created) */
6132 /* Strict: ESOCK, valid non-strict: ERROR */
6133 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getpeername on closed socket", io.rc, ARM_SOCKET_ESOCK);
6142 /* Terminate worker thread */
6143 osThreadTerminate (worker);
6146 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6148 /* GetOpt IO parameters */
6160 /* Assign arguments */
6161 #define ARG_GETOPT(_sock,_opt_id,_opt_val,_opt_len) do { \
6163 io.opt_id = _opt_id; \
6164 io.opt_val = _opt_val; \
6165 io.opt_len = _opt_len; \
6168 /* GetOpt worker thread */
6169 __NO_RETURN static void Th_GetOpt (IO_GETOPT *io) {
6173 /* Wait for the signal to select and execute the function */
6174 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
6175 F_GETOPT | F_CLOSE, osFlagsWaitAny, osWaitForever);
6179 /* Create stream socket */
6180 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6184 /* Create datagram socket */
6185 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6189 /* Get socket options */
6190 io->rc = drv->SocketGetOpt (io->sock, io->opt_id, io->opt_val, io->opt_len);
6195 io->rc = drv->SocketClose (io->sock);
6198 /* Done, send signal to owner thread */
6199 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6201 osThreadFlagsSet (io->owner, flags);
6202 osThreadFlagsClear (F_ALL);
6207 \brief Test case: WIFI_SocketGetOpt
6208 \ingroup wifi_sock_api
6210 The test case \b WIFI_SocketGetOpt verifies the WiFi Driver \b SocketGetOpt function:
6212 int32_t (*SocketGetOpt) (int32_t socket, int32_t opt_id, void *opt_val, uint32_t *opt_len);
6216 - Create stream socket
6217 - Check function parameters
6218 - Get socket options
6220 - Get socket options again, closed socket
6222 Datagram socket test:
6223 - Create datagram socket
6228 void WIFI_SocketGetOpt (void) {
6231 osThreadId_t worker;
6236 if (socket_funcs_exist == 0U) {
6237 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6241 if (station_init (1) == 0) {
6242 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6246 /* Create worker thread */
6247 worker = osThreadNew ((osThreadFunc_t)Th_GetOpt, &io, NULL);
6248 if (worker == NULL) {
6249 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6255 /* Create stream socket */
6256 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6258 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6262 /* Check parameter (socket = -1) */
6263 opt_len = sizeof(opt_val);
6264 ARG_GETOPT (-1, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6265 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6266 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6268 /* Check parameter (socket = INT32_MIN) */
6269 ARG_GETOPT (INT32_MIN, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6270 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6271 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6273 /* Check parameter (socket = INT32_MAX) */
6274 ARG_GETOPT (INT32_MAX, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6275 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6276 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6278 /* Check parameter (opt_id = -1) */
6279 ARG_GETOPT (sock, -1, &opt_val, &opt_len);
6280 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6281 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6283 /* Check parameter (opt_id = INT32_MIN) */
6284 ARG_GETOPT (sock, INT32_MIN, &opt_val, &opt_len);
6285 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6286 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6288 /* Check parameter (opt_id = INT32_MAX) */
6289 ARG_GETOPT (sock, INT32_MAX, &opt_val, &opt_len);
6290 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6291 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6293 /* Check parameter (opt_val = NULL) */
6294 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, NULL, &opt_len);
6295 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6296 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6298 /* Check parameter (opt_len = NULL) */
6299 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, NULL);
6300 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6301 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6303 /* Check parameter (*opt_len = 0) */
6305 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6306 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6307 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6309 /* Check parameter (*opt_len = 5) */
6311 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6312 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6313 TH_ASSERT ((io.rc == 0) && (opt_len == 4));
6315 /* Get option FIONBIO (set only) */
6316 opt_len = sizeof(opt_val);
6317 ARG_GETOPT (sock, ARM_SOCKET_IO_FIONBIO, &opt_val, &opt_len);
6318 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6319 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6321 /* Get option RCVTIMEO */
6322 opt_len = sizeof(opt_val) + 1;
6323 opt_val = 0xE2A5A241;
6324 ARG_GETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, &opt_len);
6325 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6326 TH_ASSERT (io.rc == 0);
6327 /* Should be different from the initial value */
6328 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6330 /* Get option SNDTIMEO */
6331 opt_len = sizeof(opt_val) + 1;
6332 opt_val = 0xE2A5A241;
6333 ARG_GETOPT (sock, ARM_SOCKET_SO_SNDTIMEO, &opt_val, &opt_len);
6334 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6335 TH_ASSERT (io.rc == 0);
6336 /* Should be different from the initial value */
6337 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6339 /* Get option KEEPALIVE */
6340 opt_len = sizeof(opt_val) + 1;
6341 opt_val = 0xE2A5A241;
6342 ARG_GETOPT (sock, ARM_SOCKET_SO_KEEPALIVE, &opt_val, &opt_len);
6343 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6344 TH_ASSERT (io.rc == 0);
6345 /* Should be different from the initial value */
6346 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6348 /* Get option socket TYPE */
6349 opt_len = sizeof(opt_val) + 1;
6350 opt_val = UINT32_MAX;
6351 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6352 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6353 TH_ASSERT (io.rc == 0);
6354 /* Should be SOCK_STREAM type */
6355 TH_ASSERT ((opt_val == ARM_SOCKET_SOCK_STREAM) && (opt_len == 4));
6357 /* Close stream socket */
6359 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6360 TH_ASSERT (io.rc == 0);
6362 /* Get option socket TYPE again */
6363 opt_len = sizeof(opt_val);
6364 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6365 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6366 /* Should return error (socket not created) */
6367 /* Strict: ESOCK, valid non-strict: ERROR */
6368 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6373 /* Create datagram socket */
6374 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6376 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6380 /* Get option socket TYPE */
6381 opt_len = sizeof(opt_val) + 1;
6382 opt_val = UINT32_MAX;
6383 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6384 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6385 TH_ASSERT (io.rc == 0);
6386 /* Should be SOCK_DGRAM type */
6387 TH_ASSERT ((opt_val == ARM_SOCKET_SOCK_DGRAM) && (opt_len == 4));
6391 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6392 TH_ASSERT (io.rc == 0);
6394 /* Get option socket TYPE again */
6395 opt_len = sizeof(opt_val);
6396 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6397 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6398 /* Should return error (socket not created) */
6399 /* Strict: ESOCK, valid non-strict: ERROR */
6400 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6409 /* Terminate worker thread */
6410 osThreadTerminate (worker);
6413 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6415 /* SetOpt IO parameters */
6419 const void *opt_val;
6427 /* Assign arguments */
6428 #define ARG_SETOPT(_sock,_opt_id,_opt_val,_opt_len) do { \
6430 io.opt_id = _opt_id; \
6431 io.opt_val = _opt_val; \
6432 io.opt_len = _opt_len; \
6435 /* SetOpt worker thread */
6436 __NO_RETURN static void Th_SetOpt (IO_SETOPT *io) {
6440 /* Wait for the signal to select and execute the function */
6441 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_SETOPT | F_CLOSE, osFlagsWaitAny, osWaitForever);
6445 /* Create stream socket */
6446 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6450 /* Create datagram socket */
6451 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6455 /* Set socket options */
6456 io->rc = drv->SocketSetOpt (io->sock, io->opt_id, io->opt_val, io->opt_len);
6461 io->rc = drv->SocketClose (io->sock);
6464 /* Done, send signal to owner thread */
6465 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6467 osThreadFlagsSet (io->owner, flags);
6468 osThreadFlagsClear (F_ALL);
6473 \brief Test case: WIFI_SocketSetOpt
6474 \ingroup wifi_sock_api
6476 The test case \b WIFI_SocketSetOpt verifies the WiFi Driver \b SocketSetOpt function:
6478 int32_t (*SocketSetOpt) (int32_t socket, int32_t opt_id, const void *opt_val, uint32_t opt_len);
6482 - Create stream socket
6483 - Check function parameters
6484 - Set socket options
6486 - Set socket option again, closed socket
6488 Datagram socket test:
6489 - Create datagram socket
6490 - Set socket options
6492 - Set socket option again, closed socket
6495 void WIFI_SocketSetOpt (void) {
6497 osThreadId_t worker;
6502 if (socket_funcs_exist == 0U) {
6503 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6507 if (station_init (1) == 0) {
6508 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6512 /* Create worker thread */
6513 worker = osThreadNew ((osThreadFunc_t)Th_SetOpt, &io, NULL);
6514 if (worker == NULL) {
6515 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6521 /* Create stream socket */
6522 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6524 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6528 /* Check parameter (socket = -1) */
6530 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6531 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6532 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6534 /* Check parameter (socket = INT32_MIN) */
6535 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6536 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6537 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6539 /* Check parameter (socket = INT32_MAX) */
6540 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6541 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6542 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6544 /* Check parameter (opt_id = -1) */
6545 ARG_SETOPT (sock, -1, &opt_val, sizeof(opt_val));
6546 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6547 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6549 /* Check parameter (opt_id = INT32_MIN) */
6550 ARG_SETOPT (sock, INT32_MIN, &opt_val, sizeof(opt_val));
6551 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6552 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6554 /* Check parameter (opt_id = INT32_MAX) */
6555 ARG_SETOPT (sock, INT32_MAX, &opt_val, sizeof(opt_val));
6556 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6557 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6559 /* Check parameter (opt_val = NULL) */
6560 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, NULL, sizeof(opt_val));
6561 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6562 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6564 /* Check parameter (opt_len = 0) */
6565 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, 0);
6566 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6567 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6569 /* Check parameter (opt_len = 3) */
6570 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, 3);
6571 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6572 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6574 /* Set option FIONBIO (set only) */
6576 ARG_SETOPT (sock, ARM_SOCKET_IO_FIONBIO, &opt_val, sizeof(opt_val));
6577 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6578 TH_ASSERT (io.rc == 0);
6580 /* Set option RCVTIMEO */
6582 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6583 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6584 TH_ASSERT (io.rc == 0);
6586 /* Set option SNDTIMEO */
6588 ARG_SETOPT (sock, ARM_SOCKET_SO_SNDTIMEO, &opt_val, sizeof(opt_val));
6589 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6590 TH_ASSERT (io.rc == 0);
6592 /* Set option KEEPALIVE */
6594 ARG_SETOPT (sock, ARM_SOCKET_SO_KEEPALIVE, &opt_val, sizeof(opt_val));
6595 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6596 TH_ASSERT (io.rc == 0);
6598 /* Set option socket TYPE (get only) */
6599 opt_val = ARM_SOCKET_SOCK_STREAM;
6600 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, sizeof(opt_val));
6601 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6602 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6604 /* Close stream socket */
6606 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6607 TH_ASSERT (io.rc == 0);
6609 /* Set option RCVTIMEO again */
6611 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6612 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6613 /* Should return error (socket not created) */
6614 /* Strict: ESOCK, valid non-strict: ERROR */
6615 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "setsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6620 /* Create datagram socket */
6621 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6623 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6627 /* Set option RCVTIMEO */
6629 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6630 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6631 TH_ASSERT (io.rc == 0);
6635 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6636 TH_ASSERT (io.rc == 0);
6638 /* Set option RCVTIMEO again */
6639 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6640 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6641 /* Should return error (socket not created) */
6642 /* Strict: ESOCK, valid non-strict: ERROR */
6643 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "setsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6652 /* Terminate worker thread */
6653 osThreadTerminate (worker);
6656 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6658 /* Close IO parameters */
6667 /* Assign arguments */
6668 #define ARG_CLOSE(_sock) do { \
6672 /* Close worker thread */
6673 __NO_RETURN static void Th_Close (IO_CLOSE *io) {
6677 /* Wait for the signal to select and execute the function */
6678 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
6679 F_CONNECT | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
6683 /* Create stream socket */
6684 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6688 /* Create datagram socket */
6689 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6694 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
6698 /* Connect on socket */
6699 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
6703 /* Listen on socket */
6704 io->rc = drv->SocketListen (io->sock, 1);
6709 io->rc = drv->SocketClose (io->sock);
6712 /* Done, send signal to owner thread */
6713 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6715 osThreadFlagsSet (io->owner, flags);
6716 osThreadFlagsClear (F_ALL);
6721 \brief Test case: WIFI_SocketClose
6722 \ingroup wifi_sock_api
6724 The test case \b WIFI_SocketClose verifies the WiFi Driver \b SocketClose function:
6726 int32_t (*SocketClose) (int32_t socket);
6729 Stream socket test 1:
6730 - Create stream socket
6733 - Check function parameters
6735 - Close socket again
6737 Stream socket test 2:
6738 - Create stream socket
6742 - Close socket again
6744 Datagram socket test:
6745 - Create datagram socket
6747 - Check function parameters
6749 - Close socket again
6751 void WIFI_SocketClose (void) {
6752 osThreadId_t worker;
6757 if (socket_funcs_exist == 0U) {
6758 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6762 if (station_init (1) == 0) {
6763 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6767 /* Create worker thread */
6768 worker = osThreadNew ((osThreadFunc_t)Th_Close, &io, NULL);
6769 if (worker == NULL) {
6770 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6776 /* Create stream socket */
6777 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6779 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6783 /* Connect to stream server */
6785 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
6786 TH_ASSERT (io.rc == 0);
6788 /* Check parameter (socket = -1) */
6790 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6791 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6793 /* Check parameter (socket = INT32_MIN) */
6794 ARG_CLOSE (INT32_MIN);
6795 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6796 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6798 /* Check parameter (socket = INT32_MAX) */
6799 ARG_CLOSE (INT32_MAX);
6800 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6801 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6805 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6806 TH_ASSERT (io.rc == 0);
6808 /* Close again, closed socket */
6810 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6811 /* Should return error (socket not created) */
6812 /* Strict: ESOCK, valid non-strict: OK */
6813 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6818 /* Create stream socket */
6819 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6821 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6827 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
6828 TH_ASSERT (io.rc == 0);
6830 /* Start listening */
6832 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
6833 TH_ASSERT (io.rc == 0);
6837 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6838 TH_ASSERT (io.rc == 0);
6840 /* Close again, closed socket */
6842 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6843 /* Should return error (socket not created) */
6844 /* Strict: ESOCK, valid non-strict: OK */
6845 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6850 /* Create datagram socket */
6851 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6853 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6859 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
6860 TH_ASSERT (io.rc == 0);
6862 /* Check parameter (socket = -1) */
6864 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6865 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6867 /* Check parameter (socket = INT32_MIN) */
6868 ARG_CLOSE (INT32_MIN);
6869 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6870 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6872 /* Check parameter (socket = INT32_MAX) */
6873 ARG_CLOSE (INT32_MAX);
6874 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6875 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6879 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6880 TH_ASSERT (io.rc == 0);
6882 /* Close again, closed socket */
6884 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6885 /* Should return error (socket not created) */
6886 /* Strict: ESOCK, valid non-strict: OK */
6887 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6896 /* Terminate worker thread */
6897 osThreadTerminate (worker);
6900 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6902 /* GetHostByName IO parameters */
6914 /* Assign arguments */
6915 #define ARG_GETHOST(_name,_af,_ip,_ip_len) do { \
6919 io.ip_len = _ip_len; \
6922 /* GetHostByName worker thread */
6923 __NO_RETURN static void Th_GetHostByName (IO_GETHOST *io) {
6927 /* Wait for the signal to select and execute the function */
6928 flags = osThreadFlagsWait (F_GETHOSTBYNAME, osFlagsWaitAny, osWaitForever);
6931 case F_GETHOSTBYNAME:
6933 io->rc = drv->SocketGetHostByName (io->name, io->af, io->ip, io->ip_len);
6936 /* Done, send signal to owner thread */
6937 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6939 osThreadFlagsSet (io->owner, flags);
6940 osThreadFlagsClear (F_ALL);
6945 \brief Test case: WIFI_SocketGetHostByName
6946 \ingroup wifi_sock_api
6948 The test case \b WIFI_SocketGetHostByName the WiFi Driver \b SocketGetHostByName function:
6950 int32_t (*SocketGetHostByName) (const char *name, int32_t af, uint8_t *ip, uint32_t *ip_len);
6954 - Check function parameters
6956 - Resolve non-existent host
6959 This test requires internet connectivity to DNS server.
6961 void WIFI_SocketGetHostByName (void) {
6962 const char *host_name = "www.arm.com";
6965 osThreadId_t worker;
6969 if (socket_funcs_exist == 0U) {
6970 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6974 if (station_init (1) == 0) {
6975 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6979 /* Create worker thread */
6980 worker = osThreadNew ((osThreadFunc_t)Th_GetHostByName, &io, NULL);
6981 if (worker == NULL) {
6982 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6988 /* Check parameter (name = NULL) */
6989 ip_len = sizeof(host_ip);
6990 ARG_GETHOST(NULL, ARM_SOCKET_AF_INET, host_ip, &ip_len);
6991 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6992 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6994 /* Check parameter (af = -1) */
6995 ARG_GETHOST(host_name, -1, host_ip, &ip_len);
6996 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6997 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6999 /* Check parameter (af = INT32_MIN) */
7000 ARG_GETHOST(host_name, INT32_MIN, host_ip, &ip_len);
7001 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7002 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7004 /* Check parameter (af = INT32_MAX) */
7005 ARG_GETHOST(host_name, INT32_MAX, host_ip, &ip_len);
7006 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7007 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7009 /* Check parameter (ip = NULL) */
7010 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, NULL, &ip_len);
7011 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7012 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7014 /* Check parameter (ip_len = NULL) */
7015 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, NULL);
7016 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7017 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7019 /* Check parameter (*ip_len = 0) */
7021 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
7022 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7023 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7025 /* Check parameter (*ip_len = 3) */
7027 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
7028 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7029 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7031 /* Resolve valid host */
7032 ip_len = sizeof(host_ip) + 1;
7033 memset((void *)host_ip, 0, sizeof(host_ip));
7034 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
7035 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT_LONG);
7036 /* IP address should be valid */
7037 TH_ASSERT ((memcmp((const void *)host_ip, (const void *)ip_unspec, 4) != 0) && (ip_len == 4));
7039 /* Resolve non-existent host */
7040 ip_len = sizeof(host_ip);
7041 ARG_GETHOST("non.existent.host", ARM_SOCKET_AF_INET, host_ip, &ip_len);
7042 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT_LONG);
7043 /* Should return error (host not found) */
7044 /* Strict: EHOSTNOTFOUND, valid non-strict: ERROR */
7045 TH_ASSERT2 ((io.rc == ARM_SOCKET_EHOSTNOTFOUND), (io.rc == ARM_SOCKET_ERROR), "gethostbyname for non-existing host", io.rc, ARM_SOCKET_EHOSTNOTFOUND);
7051 /* Terminate worker thread */
7052 osThreadTerminate (worker);
7055 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
7057 /* Ping IO parameters */
7067 /* Assign arguments */
7068 #define ARG_PING(_ip,_ip_len) do { \
7070 io.ip_len = _ip_len; \
7073 /* Ping worker thread */
7074 __NO_RETURN static void Th_Ping (IO_PING *io) {
7078 /* Wait for the signal to select and execute the function */
7079 flags = osThreadFlagsWait (F_PING, osFlagsWaitAny, osWaitForever);
7084 io->rc = drv->Ping (io->ip, io->ip_len);
7087 /* Done, send signal to owner thread */
7088 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
7090 osThreadFlagsSet (io->owner, flags);
7091 osThreadFlagsClear (F_ALL);
7096 \brief Test case: WIFI_Ping
7097 \ingroup wifi_sock_api
7099 The test case \b WIFI_Ping verifies the WiFi Driver \b Ping function:
7101 int32_t (*Ping) (const uint8_t *ip, uint32_t ip_len);
7105 - Check function parameters
7108 void WIFI_Ping (void) {
7109 osThreadId_t worker;
7113 if (drv->Ping == NULL) {
7114 TEST_ASSERT_MESSAGE(0,"[FAILED] Ping function not available");
7118 if (station_init (1) == 0) {
7119 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7123 /* Create worker thread */
7124 worker = osThreadNew ((osThreadFunc_t)Th_Ping, &io, NULL);
7125 if (worker == NULL) {
7126 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7132 /* Check parameter (ip = NULL) */
7134 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7135 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7137 /* Check parameter (ip_len = 0) */
7138 ARG_PING (ip_socket_server, 0);
7139 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7140 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7142 /* Check parameter (ip_len = 5) */
7143 ARG_PING (ip_socket_server, 5);
7144 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7145 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7148 ARG_PING (ip_socket_server, 4);
7149 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7150 TH_ASSERT (io.rc == ARM_DRIVER_OK);
7156 /* Terminate worker thread */
7157 osThreadTerminate (worker);
7160 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
7163 \defgroup wifi_sock_op WiFi Socket Operation
7166 These tests verify operation of the WiFi socket functions.
7169 /* Worker thread is used for the following tests:
7170 - WIFI_Transfer_Fixed
7171 - WIFI_Transfer_Incremental
7172 - WIFI_Send_Fragmented
7173 - WIFI_Recv_Fragmented
7175 - WIFI_Concurrent_Socket
7178 /* Transfer IO parameters */
7189 /* Assign arguments */
7190 #define ARG_TRANSFER(_sock,_len,_size) do { \
7196 /* Transfer worker thread */
7197 __NO_RETURN static void Th_Transfer (IO_TRANSFER *io) {
7198 uint32_t flags,xid,i;
7202 /* Wait for the signal to select and execute the function */
7203 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
7204 F_CONNECT | F_CLOSE |
7205 F_XFER_FIXED | F_XFER_INCR |
7206 F_SEND_FRAG | F_RECV_FRAG, osFlagsWaitAny, osWaitForever);
7210 /* Create stream socket */
7211 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
7215 /* Create datagram socket */
7216 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
7220 /* Connect on socket */
7221 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, ECHO_PORT);
7226 io->rc = drv->SocketClose (io->sock);
7230 /* Transfer Fixed size blocks */
7231 memset ((void *)buffer, 0xCC, io->len);
7232 /* Send and receive in small blocks */
7233 for (i = 0; i < io->len; i += io->size) {
7234 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7236 rc = drv->SocketRecv (io->sock, &buffer[i], io->size);
7239 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7246 /* Transfer Increased size blocks */
7247 memset ((void *)buffer, 0xCC, io->len);
7248 /* Send and receive in enlarged block sizes */
7249 for (i = 0; i < io->len; i += io->size++) {
7250 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7252 rc = drv->SocketRecv (io->sock, &buffer[i], io->size);
7255 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7262 /* Send Fragmented blocks */
7263 memset ((void *)buffer, 0xCC, io->len);
7264 /* Send in small blocks */
7265 for (i = 0; i < io->len; i += io->size) {
7266 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7269 /* Receive in single block */
7271 /* Small delay that blocks are received */
7273 for (i = 0; i < io->len; i += (uint32_t)rc) {
7274 /* Returns any data available, up to requested amount */
7275 rc = drv->SocketRecv (io->sock, &buffer[i], io->len-i);
7278 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7286 /* Receive Fragmented blocks */
7287 memset ((void *)buffer, 0xCC, io->len);
7288 /* Send single block */
7289 rc = drv->SocketSend (io->sock, test_buf, io->len);
7292 /* Receive in small blocks */
7293 for (i = 0; i < io->len; i += io->size) {
7294 rc = drv->SocketRecv (io->sock, &buffer[i], io->size);
7296 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7303 /* Done, send signal to owner thread */
7304 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
7306 osThreadFlagsSet (io->owner, flags);
7307 osThreadFlagsClear (F_ALL);
7312 \brief Test case: WIFI_Transfer_Fixed
7313 \ingroup wifi_sock_op
7315 The test case \b WIFI_Transfer_Fixed verifies data transfer in fixed size blocks.
7318 - Create stream socket
7319 - Transfer 128 blocks of 16 bytes
7320 - Transfer 32 blocks of 64 bytes
7321 - Transfer 8 blocks of 256 bytes
7322 - Transfer 2 blocks of 1024 bytes
7323 - Transfer 1 block of 1440 bytes
7326 Datagram socket test:
7327 - Create datagram socket
7328 - Transfer 128 blocks of 16 bytes
7329 - Transfer 32 blocks of 64 bytes
7330 - Transfer 8 blocks of 256 bytes
7331 - Transfer 2 blocks of 1024 bytes
7332 - Transfer 1 block of 1460 bytes
7335 void WIFI_Transfer_Fixed (void) {
7336 osThreadId_t worker;
7341 if (station_init (1) == 0) {
7342 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7346 /* Create worker thread */
7347 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7348 if (worker == NULL) {
7349 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7355 /* Create stream socket */
7356 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7358 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7362 /* Connect to stream server */
7364 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7365 TH_ASSERT (io.rc == 0);
7367 /* Transfer 16-byte block(s) */
7368 ARG_TRANSFER (sock, 2048, 16);
7369 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7370 TH_ASSERT (io.rc == 2048);
7372 /* Transfer 64-byte block(s) */
7373 ARG_TRANSFER (sock, 2048, 64);
7374 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7375 TH_ASSERT (io.rc == 2048);
7377 /* Transfer 256-byte block(s) */
7378 ARG_TRANSFER (sock, 2048, 256);
7379 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7380 TH_ASSERT (io.rc == 2048);
7382 /* Transfer 1024-byte block(s) */
7383 ARG_TRANSFER (sock, 2048, 1024);
7384 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7385 TH_ASSERT (io.rc == 2048);
7387 /* Transfer 1440-byte block */
7388 ARG_TRANSFER (sock, 1440, 1440);
7389 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7390 TH_ASSERT (io.rc == 1440);
7392 /* Close stream socket */
7394 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7395 TH_ASSERT (io.rc == 0);
7400 /* Create datagram socket */
7401 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7403 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7407 /* Connect to datagram server */
7409 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7410 TH_ASSERT (io.rc == 0);
7412 /* Transfer 16-byte block(s) */
7413 ARG_TRANSFER (sock, 2048, 16);
7414 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7415 TH_ASSERT (io.rc == 2048);
7417 /* Transfer 64-byte block(s) */
7418 ARG_TRANSFER (sock, 2048, 64);
7419 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7420 TH_ASSERT (io.rc == 2048);
7422 /* Transfer 256-byte block(s) */
7423 ARG_TRANSFER (sock, 2048, 256);
7424 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7425 TH_ASSERT (io.rc == 2048);
7427 /* Transfer 1024-byte block(s) */
7428 ARG_TRANSFER (sock, 2048, 1024);
7429 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7430 TH_ASSERT (io.rc == 2048);
7432 /* Transfer 1460-byte block */
7433 ARG_TRANSFER (sock, 1460, 1460);
7434 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7435 TH_ASSERT (io.rc == 1460);
7437 /* Close datagram socket */
7439 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7440 TH_ASSERT (io.rc == 0);
7449 /* Terminate worker thread */
7450 osThreadTerminate (worker);
7454 \brief Test case: WIFI_Transfer_Incremental
7455 \ingroup wifi_sock_op
7457 The test case \b WIFI_Transfer_Incremental verifies data transfer in ascending size blocks.
7458 Each subsequent block that the socket sends is one byte larger than the previous block.
7461 - Create stream socket
7462 - Transfer 51 blocks of 1 - 50 bytes
7463 - Transfer 30 blocks of 51 - 80 bytes
7464 - Transfer 20 blocks of 81 - 100 bytes
7465 - Transfer 13 blocks of 120 - 132 bytes
7466 - Transfer 8 blocks of 252 - 259 bytes
7467 - Transfer 4 blocks of 510 - 513 bytes
7470 Datagram socket test:
7471 - Create datagram socket
7472 - Transfer 51 blocks of 1 - 50 bytes
7473 - Transfer 30 blocks of 51 - 80 bytes
7474 - Transfer 20 blocks of 81 - 100 bytes
7475 - Transfer 13 blocks of 120 - 132 bytes
7476 - Transfer 8 blocks of 252 - 259 bytes
7477 - Transfer 4 blocks of 510 - 513 bytes
7480 void WIFI_Transfer_Incremental (void) {
7481 osThreadId_t worker;
7486 if (station_init (1) == 0) {
7487 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7491 /* Create worker thread */
7492 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7493 if (worker == NULL) {
7494 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7500 /* Create stream socket */
7501 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7503 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7507 /* Connect to stream server */
7509 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7510 TH_ASSERT (io.rc == 0);
7512 /* Transfer 1 byte - 50 byte blocks */
7513 ARG_TRANSFER (sock, 1275, 1);
7514 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7515 TH_ASSERT (io.rc == 1275);
7517 /* Transfer 51 byte - 80-byte blocks */
7518 ARG_TRANSFER (sock, 1965, 51);
7519 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7520 TH_ASSERT (io.rc == 1965);
7522 /* Transfer 81 byte - 100 byte blocks */
7523 ARG_TRANSFER (sock, 1810, 81);
7524 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7525 TH_ASSERT (io.rc == 1810);
7527 /* Transfer 120 byte - 132 byte blocks */
7528 ARG_TRANSFER (sock, 1905, 120);
7529 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7530 TH_ASSERT (io.rc == 1905);
7532 /* Transfer 252 byte - 259 byte blocks */
7533 ARG_TRANSFER (sock, 2044, 252);
7534 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7535 TH_ASSERT (io.rc == 2044);
7537 /* Transfer 510 byte - 513 byte blocks */
7538 ARG_TRANSFER (sock, 2046, 510);
7539 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7540 TH_ASSERT (io.rc == 2046);
7542 /* Close stream socket */
7544 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7545 TH_ASSERT (io.rc == 0);
7550 /* Create datagram socket */
7551 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7553 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7557 /* Connect to datagram server */
7559 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7560 TH_ASSERT (io.rc == 0);
7562 /* Transfer 1 byte - 50 byte blocks */
7563 ARG_TRANSFER (sock, 1275, 1);
7564 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7565 TH_ASSERT (io.rc == 1275);
7567 /* Transfer 51 byte - 80-byte blocks */
7568 ARG_TRANSFER (sock, 1965, 51);
7569 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7570 TH_ASSERT (io.rc == 1965);
7572 /* Transfer 81 byte - 100 byte blocks */
7573 ARG_TRANSFER (sock, 1810, 81);
7574 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7575 TH_ASSERT (io.rc == 1810);
7577 /* Transfer 120 byte - 132 byte blocks */
7578 ARG_TRANSFER (sock, 1905, 120);
7579 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7580 TH_ASSERT (io.rc == 1905);
7582 /* Transfer 252 byte - 259 byte blocks */
7583 ARG_TRANSFER (sock, 2044, 252);
7584 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7585 TH_ASSERT (io.rc == 2044);
7587 /* Transfer 510 byte - 513 byte blocks */
7588 ARG_TRANSFER (sock, 2046, 510);
7589 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7590 TH_ASSERT (io.rc == 2046);
7592 /* Close datagram socket */
7594 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7595 TH_ASSERT (io.rc == 0);
7604 /* Terminate worker thread */
7605 osThreadTerminate (worker);
7609 \brief Test case: WIFI_Send_Fragmented
7610 \ingroup wifi_sock_op
7612 The test case \b WIFI_Send_Fragmented verifies data transfer in chunks.
7615 - Create stream socket
7616 - Send 16 blocks of 16 bytes, receive 1 block of 256 bytes
7617 - Send 16 blocks of 64 bytes, receive 1 block of 1024 bytes
7618 - Send 5 blocks of 256 bytes, receive 1 block of 1280 bytes
7619 - Send 2 blocks of 720 bytes, receive 1 block of 1440 bytes
7622 void WIFI_Send_Fragmented (void) {
7623 osThreadId_t worker;
7628 if (station_init (1) == 0) {
7629 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7633 /* Create worker thread */
7634 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7635 if (worker == NULL) {
7636 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7642 /* Create stream socket */
7643 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7645 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7649 /* Connect to stream server */
7651 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7652 TH_ASSERT (io.rc == 0);
7654 /* Transfer 16-byte block(s) */
7655 ARG_TRANSFER (sock, 256, 16);
7656 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7657 TH_ASSERT (io.rc == 256);
7659 /* Transfer 64-byte block(s) */
7660 ARG_TRANSFER (sock, 1024, 64);
7661 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7662 TH_ASSERT (io.rc == 1024);
7664 /* Transfer 256-byte block(s) */
7665 ARG_TRANSFER (sock, 1280, 256);
7666 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7667 TH_ASSERT (io.rc == 1280);
7669 /* Transfer 1024-byte block(s) */
7670 ARG_TRANSFER (sock, 1440, 720);
7671 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7672 TH_ASSERT (io.rc == 1440);
7674 /* Close stream socket */
7676 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7677 TH_ASSERT (io.rc == 0);
7686 /* Terminate worker thread */
7687 osThreadTerminate (worker);
7691 \brief Test case: WIFI_Recv_Fragmented
7692 \ingroup wifi_sock_op
7694 The test case \b WIFI_Recv_Fragmented verifies data transfer in chunks.
7697 - Create stream socket
7698 - Send block of 256 bytes, receive 16 blocks of 16 bytes
7699 - Send block of 1024 bytes, receive 16 blocks of 64 bytes
7700 - Send block of 1280 bytes, receive 5 blocks of 256 bytes
7701 - Send block of 1440 bytes, receive 2 blocks of 720 bytes
7704 void WIFI_Recv_Fragmented (void) {
7705 osThreadId_t worker;
7710 if (station_init (1) == 0) {
7711 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7715 /* Create worker thread */
7716 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7717 if (worker == NULL) {
7718 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7724 /* Create stream socket */
7725 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7727 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7731 /* Connect to stream server */
7733 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7734 TH_ASSERT (io.rc == 0);
7736 /* Transfer 16-byte block(s) */
7737 ARG_TRANSFER (sock, 256, 16);
7738 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7739 TH_ASSERT (io.rc == 256);
7741 /* Transfer 64-byte block(s) */
7742 ARG_TRANSFER (sock, 1024, 64);
7743 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7744 TH_ASSERT (io.rc == 1024);
7746 /* Transfer 256-byte block(s) */
7747 ARG_TRANSFER (sock, 1280, 256);
7748 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7749 TH_ASSERT (io.rc == 1280);
7751 /* Transfer 720-byte block(s) */
7752 ARG_TRANSFER (sock, 1440, 720);
7753 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7754 TH_ASSERT (io.rc == 1440);
7756 /* Close stream socket */
7758 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7759 TH_ASSERT (io.rc == 0);
7768 /* Terminate worker thread */
7769 osThreadTerminate (worker);
7773 \brief Test case: WIFI_Test_Speed
7774 \ingroup wifi_sock_op
7776 The test case \b WIFI_Test_Speed tests data transfer speed.
7779 - Create stream socket
7780 - Transfer for 4 seconds, send and receive
7781 - Calculate transfer rate
7784 Datagram socket test:
7785 - Create datagram socket
7786 - Transfer for 4 seconds, send and receive
7787 - Calculate transfer rate
7790 void WIFI_Test_Speed (void) {
7791 uint32_t ticks,tout;
7792 osThreadId_t worker;
7793 int32_t rval,n_bytes;
7797 if (station_init (1) == 0) {
7798 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7802 /* Create worker thread */
7803 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7804 if (worker == NULL) {
7805 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7811 /* Create stream socket */
7812 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7814 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7818 /* Connect to stream server */
7820 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7821 TH_ASSERT (io.rc == 0);
7823 /* Transfer for 4 seconds */
7824 tout = SYSTICK_MICROSEC(4000000);
7825 ticks = GET_SYSTICK();
7828 ARG_TRANSFER (sock, 1440, 1440);
7829 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7830 if (io.rc > 0) n_bytes += io.rc;
7832 } while (GET_SYSTICK() - ticks < tout);
7833 /* Check transfer rate */
7834 if (n_bytes < 10000) {
7835 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
7836 TEST_MESSAGE(msg_buf);
7839 /* Close stream socket */
7841 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7842 TH_ASSERT (io.rc == 0);
7847 /* Create datagram socket */
7848 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7850 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7854 /* Connect to datagram server */
7856 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7857 TH_ASSERT (io.rc == 0);
7859 /* Transfer for 4 seconds */
7860 tout = SYSTICK_MICROSEC(4000000);
7861 ticks = GET_SYSTICK();
7864 ARG_TRANSFER (sock, 1460, 1460);
7865 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7866 if (io.rc > 0) n_bytes += io.rc;
7868 } while (GET_SYSTICK() - ticks < tout);
7869 /* Check transfer rate */
7870 if (n_bytes < 10000) {
7871 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
7872 TEST_MESSAGE(msg_buf);
7875 /* Close datagram socket */
7877 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7878 TH_ASSERT (io.rc == 0);
7887 /* Terminate worker thread */
7888 osThreadTerminate (worker);
7891 /* Sidekick IO parameters */
7897 /* Concurrent coworker thread */
7898 __NO_RETURN static void Th_Sidekick (IO_SIDEKICK *io2) {
7903 if (osThreadFlagsWait (SK_TERMINATE, osFlagsWaitAny, 100) == SK_TERMINATE) {
7906 memset ((void *)buff, 0xCC, sizeof(buff));
7907 rc = drv->SocketSend (io2->sock, test_msg, sizeof(test_msg));
7909 rc = drv->SocketRecv (io2->sock, buff, sizeof(test_msg));
7911 if (memcmp ((const void *)buff, (const void *)test_msg, sizeof(test_msg)) == 0) {
7912 io2->count += sizeof(test_msg);
7915 /* Owner deletes this thread */
7916 while (1) osDelay (osWaitForever);
7920 \brief Test case: WIFI_Concurrent_Socket
7921 \ingroup wifi_sock_op
7923 The test case \b WIFI_Concurrent_Socket verifies transfer of two concurrent sockets.
7926 - Create two stream sockets
7927 - Start transfer on 2nd socket with 100ms intervals
7928 - Transfer on main socket, full speed
7929 - Calculate transfer rate
7932 Datagram socket test:
7933 - Create datagram and stream sockets
7934 - Start transfer on stream socket with 100ms intervals
7935 - Transfer on main socket, full speed
7936 - Calculate transfer rate
7939 The test runs with a coherent thread, that performs an additional stream socket io.
7941 void WIFI_Concurrent_Socket (void) {
7942 uint32_t ticks,tout;
7943 osThreadId_t worker,spawn;
7944 int32_t rval,n_bytes;
7949 if (station_init (1) == 0) {
7950 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7954 /* Create worker thread */
7955 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7956 if (worker == NULL) {
7957 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7963 /* The test connects two stream sockets to the ECHO server and then */
7964 /* performs simultaneous data transfer. The main socket transmits at */
7965 /* full speed, and the other socket sends messages at 100ms intervals. */
7966 /* Both sockets record the number of bytes of data transferred, and */
7967 /* the transfer rate is calculated. */
7969 /* Create stream socket */
7970 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7972 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7976 /* Create 2nd stream socket */
7977 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7979 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7984 /* Connect sockets */
7986 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7987 TH_ASSERT (io.rc == 0);
7990 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7991 TH_ASSERT (io.rc == 0);
7993 /* Create spawned thread */
7994 spawn = osThreadNew ((osThreadFunc_t)Th_Sidekick, &io2, NULL);
7995 TEST_ASSERT(spawn != NULL);
7997 /* Transfer for 4 seconds */
7998 tout = SYSTICK_MICROSEC(4000000);
7999 ticks = GET_SYSTICK();
8002 ARG_TRANSFER (sock, 1440, 1440);
8003 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
8004 if (io.rc > 0) n_bytes += io.rc;
8006 } while (GET_SYSTICK() - ticks < tout);
8007 /* Check transfer rate */
8008 if (n_bytes < 10000) {
8009 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
8010 TEST_MESSAGE(msg_buf);
8013 /* 2nd socket sends at 100ms intervals */
8014 TH_ASSERT (io2.count > 1000);
8016 /* Terminate spawned thread */
8017 osThreadFlagsSet (spawn, SK_TERMINATE);
8019 osThreadTerminate (spawn);
8021 /* Close stream sockets */
8023 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8024 TH_ASSERT (io.rc == 0);
8027 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8028 TH_ASSERT (io.rc == 0);
8033 /* The test connects datagram and stream sockets to the ECHO server */
8034 /* and then performs simultaneous data transfer. The datagram socket */
8035 /* transmits at full speed, and the stream socket sends messages at */
8036 /* 100ms intervals. The number of bytes of transferred data is recorded */
8037 /* and the rate of transmission is calculated. */
8039 /* Create datagram socket */
8040 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
8042 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
8046 /* Connect datagram socket */
8048 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
8049 TH_ASSERT (io.rc == 0);
8051 /* Create stream socket */
8052 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8054 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8059 /* Connect stream socket */
8061 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
8062 TH_ASSERT (io.rc == 0);
8064 /* Create spawned thread */
8065 spawn = osThreadNew ((osThreadFunc_t)Th_Sidekick, &io2, NULL);
8066 TEST_ASSERT(spawn != NULL);
8068 /* Transfer for 4 seconds */
8069 tout = SYSTICK_MICROSEC(4000000);
8070 ticks = GET_SYSTICK();
8073 ARG_TRANSFER (sock, 1460, 1460);
8074 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
8075 if (io.rc > 0) n_bytes += io.rc;
8077 } while (GET_SYSTICK() - ticks < tout);
8078 /* Check transfer rate */
8079 if (n_bytes < 10000) {
8080 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
8081 TEST_MESSAGE(msg_buf);
8084 /* 2nd socket sends at 100ms intervals */
8085 TH_ASSERT (io2.count > 1000);
8087 /* Terminate spawned thread */
8088 osThreadFlagsSet (spawn, SK_TERMINATE);
8090 osThreadTerminate (spawn);
8094 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8095 TH_ASSERT (io.rc == 0);
8098 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8099 TH_ASSERT (io.rc == 0);
8108 /* Terminate worker thread */
8109 osThreadTerminate (worker);
8112 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
8114 /* TestAssistant commands */
8115 #define CMD_SEND_TCP "SEND TCP,1420,4000"
8116 #define CMD_RECV_TCP "RECV TCP,1420"
8117 #define TEST_BSIZE 1420
8119 /* StreamRate IO parameters */
8130 /* StreamRate coworker thread */
8131 __NO_RETURN static void Th_StreamRate (IO_STREAMRATE *io) {
8132 uint32_t flags,xid,ticks,tout;
8136 flags = osThreadFlagsWait (F_CREATE_TCP | F_DOWNLOAD | F_UPLOAD |
8137 F_SEND_CTRL | F_CLOSE, osFlagsWaitAny, osWaitForever);
8141 /* Create stream socket */
8142 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
8146 /* Downstream test, server is sender */
8147 for (n = 0; ; n += rc) {
8148 rc = drv->SocketRecv (io->sock, buffer, TEST_BSIZE);
8149 if (strncmp ((char *)buffer, "STAT", 4) == 0) {
8150 /* Server completed the test */
8151 sscanf ((char *)buffer+4, "%d", &val);
8152 if (val > n) io->loss = val - n;
8161 /* Upstream test, server is receiver */
8162 memset ((void *)buffer, 'a', TEST_BSIZE);
8163 tout = SYSTICK_MICROSEC(4000000);
8164 ticks = GET_SYSTICK();
8167 snprintf ((char *)buffer, sizeof(buffer), "Block[%d]", ++i);
8168 rc = drv->SocketSend (io->sock, buffer, TEST_BSIZE);
8169 if (rc > 0) n += rc;
8170 } while (GET_SYSTICK() - ticks < tout);
8171 rc = snprintf ((char *)buffer, sizeof(buffer), "STOP %d bytes.", n);
8172 drv->SocketSend (io->sock, buffer, (uint32_t)rc);
8173 /* Receive report from server */
8174 drv->SocketRecv (io->sock, buffer, TEST_BSIZE);
8175 if (strncmp ((char *)buffer, "STAT", 4) == 0) {
8176 sscanf ((char *)buffer+4, "%d", &val);
8177 if (n > val) io->loss = n - val;
8184 io->rc = drv->SocketClose (io->sock);
8188 /* Send control command to TestAssistant */
8189 drv->SocketConnect (io->sock, ip_socket_server, 4, ASSISTANT_PORT);
8190 io->rc = drv->SocketSend (io->sock, io->cmd, strlen(io->cmd));
8193 /* Done, send signal to owner thread */
8194 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
8196 osThreadFlagsSet (io->owner, flags);
8197 osThreadFlagsClear (F_ALL);
8202 \brief Test case: WIFI_Downstream_Rate
8203 \ingroup wifi_sock_op
8205 The test case \b WIFI_Downstream_Rate tests the maximum rate at which the data
8208 void WIFI_Downstream_Rate (void) {
8209 osThreadId_t worker;
8213 if (station_init (1) == 0) {
8214 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
8218 /* Create worker thread */
8219 worker = osThreadNew ((osThreadFunc_t)Th_StreamRate, &io, NULL);
8220 if (worker == NULL) {
8221 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
8227 /* Create stream socket */
8228 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8230 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8234 /* Send command to start the download */
8235 io.cmd = CMD_SEND_TCP;
8236 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
8237 TH_ASSERT (io.rc > 0);
8239 /* Wait for transfer to complete */
8241 TH_EXECUTE (F_DOWNLOAD, 5000 + WIFI_SOCKET_TIMEOUT);
8242 TH_ASSERT (io.rc > 0);
8244 /* Check data loss */
8246 snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Data loss %d byte(s)", io.loss);
8247 TEST_ASSERT_MESSAGE(0,msg_buf);
8249 else if (rval != 0) {
8250 snprintf(msg_buf, sizeof(msg_buf), "[INFO] Speed %d KB/s", io.rc/4000);
8251 TEST_MESSAGE(msg_buf);
8254 /* Close stream socket */
8255 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8256 TH_ASSERT (io.rc == 0);
8265 /* Terminate worker thread */
8266 osThreadTerminate (worker);
8270 \brief Test case: WIFI_Upstream_Rate
8271 \ingroup wifi_sock_op
8273 The test case \b WIFI_Upstream_Rate tests the maximum rate at which the data
8276 void WIFI_Upstream_Rate (void) {
8277 osThreadId_t worker;
8281 if (station_init (1) == 0) {
8282 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
8286 /* Create worker thread */
8287 worker = osThreadNew ((osThreadFunc_t)Th_StreamRate, &io, NULL);
8288 if (worker == NULL) {
8289 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
8295 /* Create stream socket */
8296 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8298 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8302 /* Send command to start the upload */
8303 io.cmd = CMD_RECV_TCP;
8304 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
8305 TH_ASSERT (io.rc > 0);
8307 /* Wait for transfer to complete */
8309 TH_EXECUTE (F_UPLOAD, 5000 + WIFI_SOCKET_TIMEOUT);
8310 TH_ASSERT (io.rc > 0);
8312 /* Check data loss */
8314 snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Data loss %d byte(s)", io.loss);
8315 TEST_ASSERT_MESSAGE(0,msg_buf);
8317 else if (rval != 0) {
8318 snprintf(msg_buf, sizeof(msg_buf), "[INFO] Speed %d KB/s", io.rc/4000);
8319 TEST_MESSAGE(msg_buf);
8322 /* Close stream socket */
8323 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8324 TH_ASSERT (io.rc == 0);
8333 /* Terminate worker thread */
8334 osThreadTerminate (worker);