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 TEST_ASSERT((ret == ARM_DRIVER_OK) || (ret == ARM_DRIVER_ERROR_UNSUPPORTED));
389 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
390 TEST_ASSERT(drv->Scan (scan_info, WIFI_SCAN_MAX_NUM) >= 0);
393 ret = drv->PowerControl (ARM_POWER_LOW);
398 case ARM_DRIVER_ERROR_UNSUPPORTED:
399 TEST_MESSAGE("[WARNING] PowerControl (ARM_POWER_LOW) is not supported");
403 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] PowerControl (ARM_POWER_LOW) returned %s", str_ret[-ret]);
404 TEST_MESSAGE(msg_buf);
408 drv->PowerControl (ARM_POWER_OFF);
409 drv->Uninitialize ();
412 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
414 \brief Test case: WIFI_GetModuleInfo
416 The test case \b WIFI_GetModuleInfo verifies the WiFi Driver \b GetModuleInfo function.
418 int32_t (*GetModuleInfo) (char *module_info, uint32_t max_len);
421 void WIFI_GetModuleInfo (void) {
424 if (init_and_power_on () == 0) {
425 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
429 ret = drv->GetModuleInfo(NULL, sizeof(data_buf));
430 TEST_ASSERT((ret == ARM_DRIVER_ERROR_PARAMETER) || (ret == ARM_DRIVER_ERROR_UNSUPPORTED));
431 ret = drv->GetModuleInfo(data_buf, 0U);
432 TEST_ASSERT((ret == ARM_DRIVER_ERROR_PARAMETER) || (ret == ARM_DRIVER_ERROR_UNSUPPORTED));
434 memset((void *)data_buf, 0xCC, sizeof(data_buf));
435 ret = drv->GetModuleInfo(data_buf, sizeof(data_buf));
438 TEST_ASSERT(strlen(data_buf) != 0);
440 case ARM_DRIVER_ERROR_UNSUPPORTED:
441 TEST_MESSAGE("[WARNING] GetModuleInfo () is not supported");
444 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] GetModuleInfo () returned %s", str_ret[-ret]);
445 TEST_MESSAGE(msg_buf);
454 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
455 /* WiFi Management tests */
456 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
458 \defgroup wifi_mgmt WiFi Management
461 These tests verify API and operation of the WiFi management functions.
465 #if (WIFI_SETGETOPTION_BSSID_EN != 0)
466 static void WIFI_SetOption_GetOption_BSSID (void) {
467 #if ((WIFI_SETGETOPTION_BSSID_EN & 1) != 0)
468 uint8_t u8_arr[8] __ALIGNED(4);
469 uint8_t bssid[7] __ALIGNED(4);
471 #if ((WIFI_SETGETOPTION_BSSID_EN & 2) != 0)
474 uint8_t not_suported;
478 if (init_and_power_on () == 0) {
479 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
483 #if ((WIFI_SETGETOPTION_BSSID_EN & 1) != 0)
485 memset((void *)bssid, 0x11, 7);
486 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_ERROR_PARAMETER);
487 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_ERROR_PARAMETER);
489 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
490 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);
491 memset((void *) u8_arr, 0xCC, 8);
492 memcpy((void *)&u8_arr[1], (const void *)bssid, 6);
493 if (drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
494 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
495 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
496 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 0U) == ARM_DRIVER_ERROR_PARAMETER);
497 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 5U) == ARM_DRIVER_ERROR_PARAMETER);
498 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, &u8_arr[1], 6U) == ARM_DRIVER_OK);
499 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, &u8_arr[1], 7U) == ARM_DRIVER_OK);
500 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 7U) == ARM_DRIVER_OK);
501 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
504 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BSSID for Station is not supported");
507 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
508 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);
509 memset((void *) u8_arr, 0xCC, 8);
510 memcpy((void *)&u8_arr[1], (const void *)bssid, 6);
511 if (drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
512 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
513 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
514 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 0U) == ARM_DRIVER_ERROR_PARAMETER);
515 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 5U) == ARM_DRIVER_ERROR_PARAMETER);
516 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, &u8_arr[1], 6U) == ARM_DRIVER_OK);
517 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, &u8_arr[1], 7U) == ARM_DRIVER_OK);
518 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 7U) == ARM_DRIVER_OK);
519 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
522 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BSSID for Access Point is not supported");
527 #if ((WIFI_SETGETOPTION_BSSID_EN & 2) != 0)
530 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
531 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
533 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
535 if (drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
537 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
539 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
541 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
543 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
545 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
547 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
549 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
551 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
554 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BSSID for Station is not supported");
557 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
559 if (drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
561 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
563 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
565 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
567 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
569 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
571 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
573 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
575 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
578 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BSSID for Access Point is not supported");
583 #if ((WIFI_SETGETOPTION_BSSID_EN & 3) == 3)
584 // Check with Get that Set has written the correct values
585 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
586 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);
587 memset((void *)data_buf, 0xCC, sizeof(data_buf));
589 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
590 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
591 TEST_ASSERT(len == 6U);
592 TEST_ASSERT(memcmp((const void *)bssid, (const void *)data_buf, (size_t)len) == 0);
594 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
595 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);
596 memset((void *)data_buf, 0xCC, sizeof(data_buf));
598 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
599 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
600 TEST_ASSERT(len == 6U);
601 TEST_ASSERT(memcmp((const void *)bssid, (const void *)data_buf, (size_t)len) == 0);
607 #if (WIFI_SETGETOPTION_TX_POWER_EN != 0)
608 static void WIFI_SetOption_GetOption_TX_POWER (void) {
609 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 1) != 0)
612 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 2) != 0)
615 uint8_t not_suported;
619 if (init_and_power_on () == 0) {
620 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
624 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 1) != 0)
626 power = WIFI_TX_POWER_STA;
627 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_ERROR_PARAMETER);
628 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_ERROR_PARAMETER);
630 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
631 power = WIFI_TX_POWER_STA;
632 if (drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
633 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
634 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
635 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 0U) == ARM_DRIVER_ERROR_PARAMETER);
636 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 3U) == ARM_DRIVER_ERROR_PARAMETER);
637 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 5U) == ARM_DRIVER_OK);
638 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
641 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_TX_POWER for Station is not supported");
644 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
645 power = WIFI_TX_POWER_AP;
646 if (drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
647 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
648 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
649 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 0U) == ARM_DRIVER_ERROR_PARAMETER);
650 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 3U) == ARM_DRIVER_ERROR_PARAMETER);
651 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 5U) == ARM_DRIVER_OK);
652 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
655 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_TX_POWER for Access Point is not supported");
660 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 2) != 0)
663 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
664 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
666 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
668 if (drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
670 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
672 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
674 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
676 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
678 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
680 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
683 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_TX_POWER for Station is not supported");
686 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
688 if (drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
690 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
692 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
694 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
696 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
698 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
700 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
703 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_TX_POWER for Access Point is not supported");
708 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 3) == 3)
709 // Check with Get that Set has written the correct values
710 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
711 power = WIFI_TX_POWER_STA;
713 memset((void *)data_buf, 0xCC, sizeof(data_buf));
714 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
715 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
716 TEST_ASSERT(len == 4U);
717 TEST_ASSERT(memcmp((const void *)&power, (const void *)data_buf, (size_t)len) == 0);
719 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
720 power = WIFI_TX_POWER_AP;
722 memset((void *)data_buf, 0xCC, sizeof(data_buf));
723 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
724 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
725 TEST_ASSERT(len == 4U);
726 TEST_ASSERT(memcmp((const void *)&power, (const void *)data_buf, (size_t)len) == 0);
732 #if (WIFI_SETGETOPTION_LP_TIMER_EN != 0)
733 static void WIFI_SetOption_GetOption_LP_TIMER (void) {
734 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 1) != 0)
737 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 2) != 0)
740 uint8_t not_suported;
744 if (init_and_power_on () == 0) {
745 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
749 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 1) != 0)
751 time = WIFI_LP_TIMER_STA;
752 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
753 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
755 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
756 time = WIFI_LP_TIMER_STA;
757 if (drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
758 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
759 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
760 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 0U) == ARM_DRIVER_ERROR_PARAMETER);
761 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 3U) == ARM_DRIVER_ERROR_PARAMETER);
762 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 5U) == ARM_DRIVER_OK);
763 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_OK);
766 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_LP_TIMER for Station is not supported");
769 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
770 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
774 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 2) != 0)
777 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
778 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
780 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
782 if (drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
784 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
786 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
788 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
790 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
792 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
794 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
797 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_LP_TIMER for Station is not supported");
800 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
802 TEST_ASSERT (drv->GetOption (1U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
806 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 3) == 3)
807 // Check with Get that Set has written the correct values
808 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
809 time = WIFI_LP_TIMER_STA;
811 memset((void *)data_buf, 0xCC, sizeof(data_buf));
812 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_OK);
813 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
814 TEST_ASSERT(len == 4U);
815 TEST_ASSERT(memcmp((const void *)&time, (const void *)data_buf, (size_t)len) == 0);
821 #if (WIFI_SETGETOPTION_DTIM_EN != 0)
822 static void WIFI_SetOption_GetOption_DTIM (void) {
823 #if ((WIFI_SETGETOPTION_DTIM_EN & 1) != 0)
826 #if ((WIFI_SETGETOPTION_DTIM_EN & 2) != 0)
829 uint8_t not_suported;
833 if (init_and_power_on () == 0) {
834 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
838 #if ((WIFI_SETGETOPTION_DTIM_EN & 1) != 0)
840 dtim = WIFI_DTIM_STA;
841 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_ERROR_PARAMETER);
842 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_ERROR_PARAMETER);
844 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
845 dtim = WIFI_DTIM_STA;
846 if (drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
847 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
848 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
849 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 0U) == ARM_DRIVER_ERROR_PARAMETER);
850 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 3U) == ARM_DRIVER_ERROR_PARAMETER);
851 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 5U) == ARM_DRIVER_OK);
852 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
855 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_DTIM for Station is not supported");
858 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
860 if (drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
861 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
862 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
863 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 0U) == ARM_DRIVER_ERROR_PARAMETER);
864 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 3U) == ARM_DRIVER_ERROR_PARAMETER);
865 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 5U) == ARM_DRIVER_OK);
866 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
869 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_DTIM for Access Point is not supported");
874 #if ((WIFI_SETGETOPTION_DTIM_EN & 2) != 0)
877 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
878 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
880 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
882 if (drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
884 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
886 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
888 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
890 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
892 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
894 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
897 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_DTIM for Station is not supported");
900 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
902 if (drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
904 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
906 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
908 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
910 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
912 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
914 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
917 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_DTIM for Access Point is not supported");
922 #if ((WIFI_SETGETOPTION_DTIM_EN & 3) == 3)
923 // Check with Get that Set has written the correct values
924 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
925 dtim = WIFI_DTIM_STA;
927 memset((void *)data_buf, 0xCC, sizeof(data_buf));
928 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
929 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
930 TEST_ASSERT(len == 4U);
931 TEST_ASSERT(memcmp((const void *)&dtim, (const void *)data_buf, (size_t)len) == 0);
933 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
936 memset((void *)data_buf, 0xCC, sizeof(data_buf));
937 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
938 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
939 TEST_ASSERT(len == 4U);
940 TEST_ASSERT(memcmp((const void *)&dtim, (const void *)data_buf, (size_t)len) == 0);
946 #if (WIFI_SETGETOPTION_BEACON_EN != 0)
947 static void WIFI_SetOption_GetOption_BEACON (void) {
948 #if ((WIFI_SETGETOPTION_BEACON_EN & 1) != 0)
951 #if ((WIFI_SETGETOPTION_BEACON_EN & 2) != 0)
954 uint8_t not_suported;
958 if (init_and_power_on () == 0) {
959 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
963 #if ((WIFI_SETGETOPTION_BEACON_EN & 1) != 0)
965 beacon = WIFI_BEACON_AP;
966 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_PARAMETER);
967 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_PARAMETER);
969 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
970 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
972 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
973 beacon = WIFI_BEACON_AP;
974 if (drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
975 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
976 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
977 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 0U) == ARM_DRIVER_ERROR_PARAMETER);
978 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 3U) == ARM_DRIVER_ERROR_PARAMETER);
979 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 5U) == ARM_DRIVER_OK);
980 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_OK);
983 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BEACON for Access Point is not supported");
988 #if ((WIFI_SETGETOPTION_BEACON_EN & 2) != 0)
991 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
992 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
994 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
996 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
998 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1000 if (drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1002 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1004 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1006 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1008 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1010 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1012 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1015 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BEACON for Access Point is not supported");
1020 #if ((WIFI_SETGETOPTION_BEACON_EN & 3) == 3)
1021 // Check with Get that Set has written the correct values
1022 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1023 beacon = WIFI_BEACON_AP;
1025 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1026 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_OK);
1027 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1028 TEST_ASSERT(len == 4U);
1029 TEST_ASSERT(memcmp((const void *)&beacon, (const void *)data_buf, (size_t)len) == 0);
1035 #if (WIFI_SETGETOPTION_MAC_EN != 0)
1036 static void WIFI_SetOption_GetOption_MAC (void) {
1037 #if ((WIFI_SETGETOPTION_MAC_EN & 1) != 0)
1038 uint8_t u8_arr[8] __ALIGNED(4);
1039 uint8_t mac[7] __ALIGNED(4);
1040 uint8_t mac_ap_def[6] __ALIGNED(4);
1041 uint8_t mac_sta_def[6] __ALIGNED(4);
1043 #if ((WIFI_SETGETOPTION_MAC_EN & 2) != 0)
1046 uint8_t not_suported;
1050 if (init_and_power_on () == 0) {
1051 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1055 // Read default MAC so it can be restored at the end of this test case
1056 #if ((WIFI_SETGETOPTION_MAC_EN & 3) == 3)
1057 if (((cap.station_ap != 0) || (cap.station != 0))) {
1059 drv->GetOption (0U, ARM_WIFI_MAC, mac_sta_def, &len);
1061 if ((cap.station_ap != 0) || (cap.ap != 0)) {
1063 drv->GetOption (1U, ARM_WIFI_MAC, mac_ap_def, &len);
1067 #if ((WIFI_SETGETOPTION_MAC_EN & 1) != 0)
1069 memset((void *)mac, 0x11, 7);
1070 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1071 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1073 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1074 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);
1075 memset((void *) u8_arr, 0xCC, 8);
1076 memcpy((void *)&u8_arr[1], (const void *)mac, 6);
1077 if (drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1078 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1079 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1080 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1081 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 5U) == ARM_DRIVER_ERROR_PARAMETER);
1082 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, &u8_arr[1], 6U) == ARM_DRIVER_OK);
1083 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, &u8_arr[1], 7U) == ARM_DRIVER_OK);
1084 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 7U) == ARM_DRIVER_OK);
1085 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1088 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_MAC for Station is not supported");
1091 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1092 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);
1093 memset((void *) u8_arr, 0xCC, 8);
1094 memcpy((void *)&u8_arr[1], (const void *)mac, 6);
1095 if (drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1096 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1097 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1098 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1099 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 5U) == ARM_DRIVER_ERROR_PARAMETER);
1100 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, &u8_arr[1], 6U) == ARM_DRIVER_OK);
1101 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, &u8_arr[1], 7U) == ARM_DRIVER_OK);
1102 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 7U) == ARM_DRIVER_OK);
1103 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1106 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_MAC for Access Point is not supported");
1111 #if ((WIFI_SETGETOPTION_MAC_EN & 2) != 0)
1114 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1115 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1117 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1119 if (drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1121 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1123 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1125 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1127 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1129 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1131 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1133 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1135 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1138 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_MAC for Station is not supported");
1141 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1143 if (drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1145 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1147 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1149 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1151 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1153 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1155 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1157 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1159 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1162 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_MAC for Access Point is not supported");
1167 #if ((WIFI_SETGETOPTION_MAC_EN & 3) == 3)
1168 // Check with Get that Set has written the correct values
1169 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1170 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);
1172 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1173 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1174 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1175 TEST_ASSERT(len == 6U);
1176 TEST_ASSERT(memcmp((const void *)mac, (const void *)data_buf, (size_t)len) == 0);
1178 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1179 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);
1181 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1182 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1183 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1184 TEST_ASSERT(len == 6U);
1185 TEST_ASSERT(memcmp((const void *)mac, (const void *)data_buf, (size_t)len) == 0);
1188 // Restore default MAC
1189 if (((cap.station_ap != 0) || (cap.station != 0)) && (memcmp((const void *)mac_sta_def, (const void *)"\0\0\0\0\0\0", 6) != 0)) {
1190 drv->SetOption (0U, ARM_WIFI_MAC, mac_sta_def, 6U);
1192 if ((cap.station_ap != 0) || (cap.ap != 0) && (memcmp((const void *)mac_ap_def, (const void *)"\0\0\0\0\0\0", 6) != 0)) {
1193 drv->SetOption (1U, ARM_WIFI_MAC, mac_ap_def, 6U);
1199 #if (WIFI_SETGETOPTION_IP_EN != 0)
1200 static void WIFI_SetOption_GetOption_IP (void) {
1201 #if ((WIFI_SETGETOPTION_IP_EN & 1) != 0)
1202 uint32_t u32_0, u32_1;
1203 uint8_t ip[5] __ALIGNED(4);
1205 #if ((WIFI_SETGETOPTION_IP_EN & 2) != 0)
1208 uint8_t not_suported;
1212 if (init_and_power_on () == 0) {
1213 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1217 #if ((WIFI_SETGETOPTION_IP_EN & 1) != 0)
1221 memset((void *)ip, 0, 5);
1222 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1223 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1225 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1226 TEST_ASSERT(sscanf((const char *)WIFI_IP_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1227 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1228 if (drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1229 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1230 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1231 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1232 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1233 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 5U) == ARM_DRIVER_OK);
1234 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1237 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP for Station is not supported");
1239 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1241 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1242 TEST_ASSERT(sscanf((const char *)WIFI_IP_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1243 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1244 if (drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1245 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1246 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1247 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1248 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1249 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 5U) == ARM_DRIVER_OK);
1250 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1253 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP for Access Point is not supported");
1255 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1259 #if ((WIFI_SETGETOPTION_IP_EN & 2) != 0)
1262 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1263 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1265 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1267 if (drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1269 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1271 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1273 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1275 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1277 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1279 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1282 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP for Station is not supported");
1285 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1287 if (drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1289 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1291 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1293 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1295 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1297 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1299 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1302 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP for Access Point is not supported");
1307 #if ((WIFI_SETGETOPTION_IP_EN & 3) == 3)
1308 // Check with Get that Set has written the correct values
1309 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1310 TEST_ASSERT(sscanf((const char *)WIFI_IP_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1312 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1313 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1314 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1315 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1316 TEST_ASSERT(len == 4U);
1317 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1318 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1320 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1321 TEST_ASSERT(sscanf((const char *)WIFI_IP_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1323 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1324 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1325 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1326 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1327 TEST_ASSERT(len == 4U);
1328 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1329 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1335 #if (WIFI_SETGETOPTION_IP_SUBNET_MASK_EN != 0)
1336 static void WIFI_SetOption_GetOption_IP_SUBNET_MASK (void) {
1337 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 1) != 0)
1338 uint32_t u32_0, u32_1;
1339 uint8_t mask[5] __ALIGNED(4);
1341 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 2) != 0)
1344 uint8_t not_suported;
1348 if (init_and_power_on () == 0) {
1349 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1353 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 1) != 0)
1357 memset((void *)mask, 0, 5);
1358 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1359 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1361 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1362 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_STA, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1363 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1364 if (drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1365 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1366 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1367 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1368 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1369 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 5U) == ARM_DRIVER_OK);
1370 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1373 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_SUBNET_MASK for Station is not supported");
1375 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1377 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1378 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_AP, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1379 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1380 if (drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1381 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1382 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1383 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1384 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1385 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 5U) == ARM_DRIVER_OK);
1386 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1389 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_SUBNET_MASK for Access Point is not supported");
1391 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1395 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 2) != 0)
1398 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1399 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1401 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1403 if (drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1405 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1407 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1409 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1411 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1413 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1415 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1418 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_SUBNET_MASK for Station is not supported");
1421 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1423 if (drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1425 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1427 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1429 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1431 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1433 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1435 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1438 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_SUBNET_MASK for Access Point is not supported");
1443 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 3) == 3)
1444 // Check with Get that Set has written the correct values
1445 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1446 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_STA, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1448 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1449 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1450 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1451 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1452 TEST_ASSERT(len == 4U);
1453 TEST_ASSERT(memcmp((const void *)mask, (const void *)data_buf, (size_t)len) == 0);
1454 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1456 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1457 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_AP, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1459 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1460 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1461 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1462 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1463 TEST_ASSERT(len == 4U);
1464 TEST_ASSERT(memcmp((const void *)mask, (const void *)data_buf, (size_t)len) == 0);
1465 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1471 #if (WIFI_SETGETOPTION_IP_GATEWAY_EN != 0)
1472 static void WIFI_SetOption_GetOption_IP_GATEWAY (void) {
1473 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 1) != 0)
1474 uint32_t u32_0, u32_1;
1475 uint8_t ip[5] __ALIGNED(4);
1477 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 2) != 0)
1480 uint8_t not_suported;
1484 if (init_and_power_on () == 0) {
1485 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1489 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 1) != 0)
1493 memset((void *)ip, 0, 5);
1494 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1495 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1497 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1498 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1499 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1500 if (drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1501 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1502 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1503 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1504 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1505 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 5U) == ARM_DRIVER_OK);
1506 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1509 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_GATEWAY for Station is not supported");
1511 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1513 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1514 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1515 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1516 if (drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1517 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1518 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1519 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1520 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1521 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 5U) == ARM_DRIVER_OK);
1522 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1525 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_GATEWAY for Access Point is not supported");
1527 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1531 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 2) != 0)
1534 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1535 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1537 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1539 if (drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1541 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1543 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1545 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1547 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1549 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1551 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1554 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_GATEWAY for Station is not supported");
1557 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1559 if (drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1561 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1563 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1565 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1567 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1569 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1571 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1574 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_GATEWAY for Access Point is not supported");
1579 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 3) == 3)
1580 // Check with Get that Set has written the correct values
1581 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1582 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1584 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1585 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1586 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1587 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1588 TEST_ASSERT(len == 4U);
1589 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1590 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1592 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1593 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1595 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1596 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1597 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1598 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1599 TEST_ASSERT(len == 4U);
1600 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1601 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1607 #if (WIFI_SETGETOPTION_IP_DNS1_EN != 0)
1608 static void WIFI_SetOption_GetOption_IP_DNS1 (void) {
1609 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 1) != 0)
1610 uint32_t u32_0, u32_1;
1611 uint8_t ip[5] __ALIGNED(4);
1613 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 2) != 0)
1616 uint8_t not_suported;
1620 if (init_and_power_on () == 0) {
1621 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1625 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 1) != 0)
1629 memset((void *)ip, 0, 5);
1630 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1631 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1633 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1634 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1635 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1636 if (drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1637 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1638 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1639 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1640 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1641 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 5U) == ARM_DRIVER_OK);
1642 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1645 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS1 for Station is not supported");
1647 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1649 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1650 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1651 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1652 if (drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1653 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1654 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1655 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1656 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1657 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 5U) == ARM_DRIVER_OK);
1658 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1661 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS1 for Access Point is not supported");
1663 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1667 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 2) != 0)
1670 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1671 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1673 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1675 if (drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1677 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1679 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1681 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1683 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1685 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1687 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1690 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS1 for Station is not supported");
1693 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1695 if (drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1697 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1699 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1701 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1703 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1705 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1707 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1710 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS1 for Access Point is not supported");
1715 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 3) == 3)
1716 // Check with Get that Set has written the correct values
1717 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1718 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1720 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1721 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1722 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1723 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1724 TEST_ASSERT(len == 4U);
1725 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1726 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1728 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1729 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1731 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1732 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1733 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1734 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1735 TEST_ASSERT(len == 4U);
1736 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1737 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1743 #if (WIFI_SETGETOPTION_IP_DNS2_EN != 0)
1744 static void WIFI_SetOption_GetOption_IP_DNS2 (void) {
1745 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 1) != 0)
1746 uint32_t u32_0, u32_1;
1747 uint8_t ip[5] __ALIGNED(4);
1749 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 2) != 0)
1752 uint8_t not_suported;
1756 if (init_and_power_on () == 0) {
1757 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1761 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 1) != 0)
1765 memset((void *)ip, 0, 5);
1766 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1767 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1769 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1770 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1771 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1772 if (drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1773 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1774 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1775 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1776 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1777 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 5U) == ARM_DRIVER_OK);
1778 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1781 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS2 for Station is not supported");
1783 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1785 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1786 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1787 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1788 if (drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1789 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1790 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1791 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1792 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1793 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 5U) == ARM_DRIVER_OK);
1794 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1797 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS2 for Access Point is not supported");
1799 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1803 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 2) != 0)
1806 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1807 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1809 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1811 if (drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1813 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1815 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1817 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1819 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1821 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1823 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1826 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS2 for Station is not supported");
1829 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1831 if (drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1833 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1835 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1837 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1839 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1841 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1843 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1846 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS2 for Access Point is not supported");
1851 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 3) == 3)
1852 // Check with Get that Set has written the correct values
1853 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1854 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1856 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1857 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1858 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1859 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1860 TEST_ASSERT(len == 4U);
1861 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1862 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1864 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1865 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1867 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1868 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1869 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1870 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1871 TEST_ASSERT(len == 4U);
1872 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1873 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1879 #if (WIFI_SETGETOPTION_IP_DHCP_EN != 0)
1880 static void WIFI_SetOption_GetOption_IP_DHCP (void) {
1881 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 1) != 0)
1882 uint32_t u32_1, u32_0;
1884 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 2) != 0)
1887 uint8_t not_suported;
1891 if (init_and_power_on () == 0) {
1892 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1896 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 1) != 0)
1900 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1901 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1903 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1904 if (drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1905 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1906 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1907 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1908 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1909 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 5U) == ARM_DRIVER_OK);
1910 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1911 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
1914 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP for Station is not supported");
1917 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1918 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1919 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1920 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1921 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1922 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1923 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 5U) == ARM_DRIVER_OK);
1924 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1925 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
1928 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP for Access Point is not supported");
1933 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 2) != 0)
1936 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1937 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1939 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1941 if (drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1943 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1945 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1947 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1949 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1951 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1953 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1956 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP for Station is not supported");
1959 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1961 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1963 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1965 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1967 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1969 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1971 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1973 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1976 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP for Access Point is not supported");
1981 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 3) == 3)
1982 // Check with Get that Set has written the correct values
1983 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1985 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1986 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1987 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1988 TEST_ASSERT(len == 4U);
1989 TEST_ASSERT(memcmp((const void *)&u32_0, (const void *)data_buf, (size_t)len) == 0);
1990 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
1991 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1992 TEST_ASSERT(len == 4U);
1993 TEST_ASSERT(memcmp((const void *)&u32_1, (const void *)data_buf, (size_t)len) == 0);
1995 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1997 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1998 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1999 TEST_ASSERT(drv->GetOption (1U, 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 (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
2003 TEST_ASSERT(drv->GetOption (1U, 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);
2011 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN != 0)
2012 static void WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN (void) {
2013 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 1) != 0)
2014 uint32_t u32_1, u32_0;
2015 uint8_t ip[5] __ALIGNED(4);
2017 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 2) != 0)
2020 uint8_t not_suported;
2024 if (init_and_power_on () == 0) {
2025 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2029 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 1) != 0)
2031 memset((void *)ip, 0, 5);
2032 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2033 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2035 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2036 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2038 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2039 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_BEGIN_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2040 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2041 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2042 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2043 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2044 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2045 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2046 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 5U) == ARM_DRIVER_OK);
2047 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_OK);
2050 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_POOL_BEGIN for Access Point is not supported");
2052 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2056 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 2) != 0)
2059 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2060 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2062 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2064 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2066 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2068 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2070 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2072 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2074 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2076 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2078 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2080 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2083 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_POOL_BEGIN for Access Point is not supported");
2088 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 3) == 3)
2089 // Check with Get that Set has written the correct values
2090 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2091 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_BEGIN_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2093 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2094 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2095 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_OK);
2096 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2097 TEST_ASSERT(len == 4U);
2098 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
2099 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2105 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN != 0)
2106 static void WIFI_SetOption_GetOption_IP_DHCP_POOL_END (void) {
2107 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 1) != 0)
2108 uint32_t u32_1, u32_0;
2109 uint8_t ip[5] __ALIGNED(4);
2111 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 2) != 0)
2114 uint8_t not_suported;
2118 if (init_and_power_on () == 0) {
2119 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2123 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 1) != 0)
2125 memset((void *)ip, 0, 5);
2126 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2127 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2129 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2130 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2132 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2133 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_END_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2134 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2135 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2136 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2137 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2138 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2139 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2140 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 5U) == ARM_DRIVER_OK);
2141 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_OK);
2144 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_POOL_END for Access Point is not supported");
2146 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2150 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 2) != 0)
2153 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2154 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2156 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2158 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2160 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2162 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2164 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2166 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2168 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2170 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2172 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2174 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2177 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_POOL_END for Access Point is not supported");
2182 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 3) == 3)
2183 // Check with Get that Set has written the correct values
2184 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2185 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_END_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2187 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2188 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2189 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_OK);
2190 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2191 TEST_ASSERT(len == 4U);
2192 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
2193 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2199 #if (WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN != 0)
2200 static void WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME (void) {
2201 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 1) != 0)
2204 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 2) != 0)
2207 uint8_t not_suported;
2211 if (init_and_power_on () == 0) {
2212 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2216 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 1) != 0)
2218 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2219 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2220 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2222 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2223 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2225 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2226 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2227 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2228 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2229 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2230 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2231 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2232 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 5U) == ARM_DRIVER_OK);
2233 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_OK);
2236 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_LEASE_TIME for Access Point is not supported");
2241 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 2) != 0)
2244 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2245 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2247 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2249 TEST_ASSERT (drv->GetOption (0U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2251 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2253 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2255 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2257 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2259 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2261 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2263 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2265 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2268 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_LEASE_TIME for Access Point is not supported");
2273 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 3) == 3)
2274 // Check with Get that Set has written the correct values
2275 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2276 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2278 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2279 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_OK);
2280 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2281 TEST_ASSERT(len == 4U);
2282 TEST_ASSERT(memcmp((const void *)&time, (const void *)data_buf, (size_t)len) == 0);
2288 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2290 \brief Test case: WIFI_SetOption_GetOption
2292 The test case \b WIFI_SetOption_GetOption verifies the WiFi Driver \b SetOption and \b GetOption functions.
2293 (Options: ARM_WIFI_BSSID, ARM_WIFI_MAC, ARM_WIFI_IP, ARM_WIFI_IP_SUBNET_MASK, ARM_WIFI_IP_GATEWAY, ARM_WIFI_IP_DNS1,
2294 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>
2295 Tests for each option is conditionally executed depending on WIFI_SETGETOPTION_... settings in DV_Config.h file.
2297 int32_t (*SetOption) (uint32_t interface, uint32_t option, const void *data, uint32_t len);
2301 int32_t (*GetOption) (uint32_t interface, uint32_t option, void *data, uint32_t *len);
2303 Function \b WIFI_SetOption_GetOption_BSSID tests \b ARM_WIFI_BSSID option.<br>
2304 Function \b WIFI_SetOption_GetOption_TX_POWER tests \b ARM_WIFI_TX_POWER option.<br>
2305 Function \b WIFI_SetOption_GetOption_LP_TIMER tests \b ARM_WIFI_LP_TIMER option.<br>
2306 Function \b WIFI_SetOption_GetOption_DTIM tests \b ARM_WIFI_DTIM option.<br>
2307 Function \b WIFI_SetOption_GetOption_BEACON tests \b ARM_WIFI_BEACON option.<br>
2308 Function \b WIFI_SetOption_GetOption_MAC tests \b ARM_WIFI_MAC option.<br>
2309 Function \b WIFI_SetOption_GetOption_IP tests \b ARM_WIFI_IP option.<br>
2310 Function \b WIFI_SetOption_GetOption_IP_SUBNET_MASK tests \b ARM_WIFI_IP_SUBNET_MASK option.<br>
2311 Function \b WIFI_SetOption_GetOption_IP_GATEWAY tests \b ARM_WIFI_IP_GATEWAY option.<br>
2312 Function \b WIFI_SetOption_GetOption_IP_DNS1 tests \b ARM_WIFI_IP_DNS1 option.<br>
2313 Function \b WIFI_SetOption_GetOption_IP_DNS2 tests \b ARM_WIFI_IP_DNS2 option.<br>
2314 Function \b WIFI_SetOption_GetOption_IP_DHCP tests \b ARM_WIFI_IP_DHCP option.<br>
2315 Function \b WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN tests \b ARM_WIFI_IP_DHCP_POOL_BEGIN option.<br>
2316 Function \b WIFI_SetOption_GetOption_IP_DHCP_POOL_END tests \b ARM_WIFI_IP_DHCP_POOL_END option.<br>
2317 Function \b WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME tests \b ARM_WIFI_IP_DHCP_LEASE_TIME option.
2319 void WIFI_SetOption_GetOption (void) {
2321 #if (WIFI_SETGETOPTION_BSSID_EN != 0)
2322 WIFI_SetOption_GetOption_BSSID ();
2324 #if (WIFI_SETGETOPTION_TX_POWER_EN != 0)
2325 WIFI_SetOption_GetOption_TX_POWER ();
2327 #if (WIFI_SETGETOPTION_LP_TIMER_EN != 0)
2328 WIFI_SetOption_GetOption_LP_TIMER ();
2330 #if (WIFI_SETGETOPTION_DTIM_EN != 0)
2331 WIFI_SetOption_GetOption_DTIM ();
2333 #if (WIFI_SETGETOPTION_BEACON_EN != 0)
2334 WIFI_SetOption_GetOption_BEACON ();
2336 #if (WIFI_SETGETOPTION_MAC_EN != 0)
2337 WIFI_SetOption_GetOption_MAC ();
2339 #if (WIFI_SETGETOPTION_IP_EN != 0)
2340 WIFI_SetOption_GetOption_IP ();
2342 #if (WIFI_SETGETOPTION_IP_SUBNET_MASK_EN != 0)
2343 WIFI_SetOption_GetOption_IP_SUBNET_MASK ();
2345 #if (WIFI_SETGETOPTION_IP_GATEWAY_EN != 0)
2346 WIFI_SetOption_GetOption_IP_GATEWAY ();
2348 #if (WIFI_SETGETOPTION_IP_DNS1_EN != 0)
2349 WIFI_SetOption_GetOption_IP_DNS1 ();
2351 #if (WIFI_SETGETOPTION_IP_DNS2_EN != 0)
2352 WIFI_SetOption_GetOption_IP_DNS2 ();
2354 #if (WIFI_SETGETOPTION_IP_DHCP_EN != 0)
2355 WIFI_SetOption_GetOption_IP_DHCP ();
2357 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN != 0)
2358 WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN ();
2360 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN != 0)
2361 WIFI_SetOption_GetOption_IP_DHCP_POOL_END ();
2363 #if (WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN != 0)
2364 WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME ();
2368 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2370 \brief Test case: WIFI_Scan
2372 The test case \b WIFI_Scan verifies the WiFi Driver \b Scan function.
2374 int32_t (*Scan) (ARM_WIFI_SCAN_INFO_t scan_info[], uint32_t max_num);
2377 void WIFI_Scan (void) {
2380 if (init_and_power_on () == 0) {
2381 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2385 TEST_ASSERT(drv->Scan(NULL, WIFI_SCAN_MAX_NUM) == ARM_DRIVER_ERROR_PARAMETER);
2386 TEST_ASSERT(drv->Scan(scan_info, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2388 memset((void *)scan_info, 0xCC, sizeof(scan_info));
2389 ret = drv->Scan(scan_info, 10U);
2391 TEST_MESSAGE("[WARNING] Scan (..) found no networks");
2393 TEST_ASSERT((ret > 0) && (ret <= WIFI_SCAN_MAX_NUM));
2397 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2399 \brief Test case: WIFI_Activate_Deactivate
2401 The test case \b WIFI_Activate_Deactivate verifies the WiFi Driver \b Activate and \b Deactivate functions.
2403 int32_t (*Activate) (uint32_t interface, const ARM_WIFI_CONFIG_t *config);
2407 int32_t (*Deactivate) (uint32_t interface);
2409 Testing sequence (for Station and Access Point):
2410 - if not initialized and powered initialize and power on
2412 - Activate (with invalid parameters)
2413 - Activate (with valid parameters)
2415 - Activate (with invalid WPS parameters)
2417 void WIFI_Activate_Deactivate (void) {
2420 if (init_and_power_on () == 0) {
2421 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2425 /* Test Station configuration setup */
2426 if ((cap.station != 0) || (cap.station_ap != 0)) {
2427 memset((void *)&config, 0, sizeof(config));
2428 config.ssid = WIFI_STA_SSID;
2429 config.pass = WIFI_STA_PASS;
2431 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2433 /* Test function with invalid parameters */
2434 config.security = WIFI_STA_SECURITY;
2435 config.ch = WIFI_STA_CH;
2436 TEST_ASSERT(drv->Activate(3U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2438 TEST_ASSERT(drv->Activate(0U, NULL) == ARM_DRIVER_ERROR_PARAMETER);
2440 config.security = ARM_WIFI_SECURITY_UNKNOWN;
2441 config.ch = WIFI_STA_CH;
2442 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2444 config.security = WIFI_STA_SECURITY;
2446 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2448 /* Test function with autodetect channel, can return unsupported or succeed */
2449 config.security = WIFI_STA_SECURITY;
2451 ret = drv->Activate(0U, &config);
2452 TEST_ASSERT((ret == ARM_DRIVER_OK) || (ret == ARM_DRIVER_ERROR_UNSUPPORTED));
2454 if (ret == ARM_DRIVER_OK) {
2455 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2458 /* Test function with valid parameters -> must succeed */
2459 config.security = WIFI_STA_SECURITY;
2460 config.ch = WIFI_STA_CH;
2461 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_OK);
2463 if (ret == ARM_DRIVER_OK) {
2464 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2467 if (cap.wps_station != 0U) {
2468 /* Test function with invalid WPS configurations */
2469 config.wps_method = 255U;
2470 config.wps_pin = NULL;
2471 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2473 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2474 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2478 /* Test Access Point configuration setup */
2479 if ((cap.ap != 0) || (cap.station_ap != 0)) {
2480 memset((void *)&config, 0, sizeof(config));
2481 config.ssid = WIFI_AP_SSID;
2482 config.pass = WIFI_AP_PASS;
2484 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2486 /* Test function with invalid parameters */
2487 config.security = WIFI_AP_SECURITY;
2488 config.ch = WIFI_AP_CH;
2489 TEST_ASSERT(drv->Activate(3U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2491 TEST_ASSERT(drv->Activate(1U, NULL) == ARM_DRIVER_ERROR_PARAMETER);
2493 config.security = ARM_WIFI_SECURITY_UNKNOWN;
2494 config.ch = WIFI_AP_CH;
2495 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2497 config.security = WIFI_AP_SECURITY;
2499 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2501 /* Test function with autodetect channel, can return unsupported or succeed */
2502 config.security = WIFI_AP_SECURITY;
2504 ret = drv->Activate(1U, &config);
2505 TEST_ASSERT((ret == ARM_DRIVER_OK) || (ret == ARM_DRIVER_ERROR_UNSUPPORTED));
2507 if (ret == ARM_DRIVER_OK) {
2508 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2511 /* Test function with valid parameters -> must succeed */
2512 config.security = WIFI_AP_SECURITY;
2513 config.ch = WIFI_AP_CH;
2514 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_OK);
2516 if (ret == ARM_DRIVER_OK) {
2517 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2520 if (cap.wps_ap != 0U) {
2521 /* Test function with invalid WPS configurations */
2522 config.wps_method = 255U;
2523 config.wps_pin = NULL;
2524 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2526 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2527 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2532 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2534 \brief Test case: WIFI_IsConnected
2536 The test case \b WIFI_IsConnected verifies the WiFi Driver \b IsConnected function.
2538 uint32_t (*IsConnected) (void);
2541 void WIFI_IsConnected (void) {
2543 if (init_and_power_on () == 0) {
2544 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2548 TEST_ASSERT(drv->IsConnected () == 0U);
2550 /* Test function with valid Station configuration */
2551 if ((cap.station != 0) || (cap.station_ap != 0)) {
2552 memset((void *)&config, 0, sizeof(config));
2553 config.ssid = WIFI_STA_SSID;
2554 config.pass = WIFI_STA_PASS;
2555 config.security = WIFI_STA_SECURITY;
2556 config.ch = WIFI_STA_CH;
2558 drv->Activate(0U, &config);
2559 TEST_ASSERT(drv->IsConnected () != 0U);
2561 drv->Deactivate (0U);
2562 TEST_ASSERT(drv->IsConnected () == 0U);
2566 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2568 \brief Test case: WIFI_GetNetInfo
2570 The test case \b WIFI_GetNetInfo verifies the WiFi Driver \b GetNetInfo function.
2572 int32_t (*GetNetInfo) (ARM_WIFI_NET_INFO_t *net_info);
2575 void WIFI_GetNetInfo (void) {
2577 if (init_and_power_on () == 0) {
2578 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2582 /* Test function with invalid pointer */
2583 TEST_ASSERT(drv->GetNetInfo (NULL) == ARM_DRIVER_ERROR_PARAMETER);
2585 /* Test function with valid Station configuration */
2586 if ((cap.station != 0) || (cap.station_ap != 0)) {
2587 memset((void *)&config, 0, sizeof(config));
2588 config.ssid = WIFI_STA_SSID;
2589 config.pass = WIFI_STA_PASS;
2590 config.security = WIFI_STA_SECURITY;
2591 config.ch = WIFI_STA_CH;
2593 drv->Activate(0U, &config);
2595 memset((void *)&net_info, 0xCC, sizeof(net_info));
2596 TEST_ASSERT(drv->GetNetInfo (&net_info) == ARM_DRIVER_OK);
2598 /* Check returned info */
2599 TEST_ASSERT(net_info.security == config.security);
2600 if (config.ch != 0U) {
2601 TEST_ASSERT(net_info.ch == config.ch);
2603 TEST_ASSERT(net_info.rssi != 0U);
2605 drv->Deactivate (0U);
2609 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2611 \brief Test case: WIFI_Activate_AP
2613 The test case \b WIFI_Activate_AP verifies the WiFi Driver \b Activate function AP operation.
2614 Test result is checked by connecting WiFi client to AP.
2616 void WIFI_Activate_AP (void) {
2619 if (init_and_power_on () == 0) {
2620 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2624 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2628 /* Test Access Point configuration setup */
2629 if ((cap.ap != 0) || (cap.station_ap != 0)) {
2630 memset((void *)&config, 0, sizeof(config));
2631 config.ssid = WIFI_AP_SSID;
2632 config.pass = WIFI_AP_PASS;
2633 config.security = WIFI_AP_SECURITY;
2634 config.ch = WIFI_AP_CH;
2635 ret = drv->Activate(1U, &config);
2636 TEST_ASSERT(ret == ARM_DRIVER_OK);
2638 if (ret == ARM_DRIVER_OK) {
2639 // Wait for WIFI_AP_CLIENT_CON_TIMEOUT in ms for client to connect
2640 // If event for connect is supported, loop will end when connect is detected
2641 // otherwise result of test is result of client connection status.
2642 for (tout = WIFI_AP_CLIENT_CON_TIMEOUT / 128; tout > 0; tout--) {
2644 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2645 if (event & ARM_WIFI_EVENT_AP_CONNECT) {
2652 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2653 TEST_ASSERT((event & ARM_WIFI_EVENT_AP_CONNECT) != 0U);
2658 drv->Deactivate (1U);
2662 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2664 \brief Test case: WIFI_Activate_Station_WPS_PBC
2666 The test case \b WIFI_Activate_Station_WPS_PBC verifies the WiFi Driver \b Activate function Station connection with WPS
2667 and Push-Button Configuration method.
2668 This test case requires that test Access Point has active Push-button WPS method when test is started.
2669 Usually started on the WiFi AP (router) by pressing the WPS button.
2671 void WIFI_Activate_Station_WPS_PBC (void) {
2674 if (init_and_power_on () == 0) {
2675 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2679 /* Test Station WPS PBC connection */
2680 if ((cap.wps_station != 0U) && ((cap.station != 0) || (cap.station_ap != 0))) {
2681 memset((void *)&config, 0, sizeof(config));
2683 /* Connect with valid WPS configuration - Push-Button Configuration method -> should succeed */
2684 config.wps_method = ARM_WIFI_WPS_METHOD_PBC;
2685 ret = drv->Activate(0U, &config);
2686 TEST_ASSERT(ret == ARM_DRIVER_OK);
2688 if (ret == ARM_DRIVER_OK) {
2689 // Check connect information is as expected
2690 memset((void *)&net_info, 0xCC, sizeof(net_info));
2691 drv->GetNetInfo (&net_info);
2693 TEST_ASSERT(memcmp((const void *)net_info.ssid, (const void *)WIFI_STA_SSID, sizeof(WIFI_STA_SSID)) == 0);
2694 TEST_ASSERT(memcmp((const void *)net_info.pass, (const void *)WIFI_STA_PASS, sizeof(WIFI_STA_PASS)) == 0);
2695 TEST_ASSERT(net_info.security == WIFI_STA_SECURITY);
2696 if (WIFI_STA_CH != 0) {
2697 TEST_ASSERT(net_info.ch == WIFI_STA_CH);
2701 drv->Deactivate (0U);
2706 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2708 \brief Test case: WIFI_Activate_Station_WPS_PIN
2710 The test case \b WIFI_Activate_Station_WPS_PIN verifies the WiFi Driver \b Activate function Station connection with WPS
2712 This test case requires that test Access Point has active PIN WPS method when test is started.
2713 Usually needs to be configured on the WiFi AP (router).
2715 void WIFI_Activate_Station_WPS_PIN (void) {
2718 if (init_and_power_on () == 0) {
2719 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2723 /* Test Station WPS PIN connection */
2724 if ((cap.wps_station != 0U) && ((cap.station != 0) || (cap.station_ap != 0))) {
2725 memset((void *)&config, 0, sizeof(config));
2727 /* Connect with valid WPS configuration - PIN method -> should succeed */
2728 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2729 config.wps_pin = WIFI_STA_WPS_PIN;
2730 ret = drv->Activate(0U, &config);
2731 TEST_ASSERT(ret == ARM_DRIVER_OK);
2733 if (ret == ARM_DRIVER_OK) {
2734 // Check connect information is as expected
2735 memset((void *)&net_info, 0xCC, sizeof(net_info));
2736 drv->GetNetInfo (&net_info);
2738 TEST_ASSERT(memcmp((const void *)net_info.ssid, (const void *)WIFI_STA_SSID, sizeof(WIFI_STA_SSID)) == 0);
2739 TEST_ASSERT(memcmp((const void *)net_info.pass, (const void *)WIFI_STA_PASS, sizeof(WIFI_STA_PASS)) == 0);
2740 TEST_ASSERT(net_info.security == WIFI_STA_SECURITY);
2741 if (WIFI_STA_CH != 0) {
2742 TEST_ASSERT(net_info.ch == WIFI_STA_CH);
2746 drv->Deactivate (0U);
2751 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2753 \brief Test case: WIFI_Activate_AP_WPS_PBC
2755 The test case \b WIFI_Activate_AP_WPS_PBC verifies the WiFi Driver \b Activate function AP WPS
2756 and Push-Button Configuration method functionality.
2757 Test result is checked by connecting the WiFi client to AP with WPS Push-Button Configuration method.
2759 void WIFI_Activate_AP_WPS_PBC (void) {
2762 if (init_and_power_on () == 0) {
2763 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2767 /* Test AP WPS PBC */
2768 if ((cap.wps_ap != 0U) && ((cap.ap != 0) || (cap.station_ap != 0))) {
2769 memset((void *)&config, 0, sizeof(config));
2770 config.ssid = WIFI_AP_SSID;
2771 config.pass = WIFI_AP_PASS;
2772 config.security = WIFI_AP_SECURITY;
2773 config.ch = WIFI_AP_CH;
2775 /* Start AP with WPS configuration - Push-Button Configuration method -> should succeed */
2776 config.wps_method = ARM_WIFI_WPS_METHOD_PBC;
2777 ret = drv->Activate(1U, &config);
2778 TEST_ASSERT(ret == ARM_DRIVER_OK);
2780 if (ret == ARM_DRIVER_OK) {
2781 // Wait predefined time for Client to connect
2782 osDelay(WIFI_AP_CLIENT_CON_TIMEOUT);
2786 drv->Deactivate (1U);
2790 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2792 \brief Test case: WIFI_Activate_AP_WPS_PIN
2794 The test case \b WIFI_Activate_AP_WPS_PIN verifies the WiFi Driver \b Activate function AP WPS
2795 PIN method functionality.
2796 Test result is checked by connecting the WiFi client to AP with WPS PIN method.
2798 void WIFI_Activate_AP_WPS_PIN (void) {
2801 if (init_and_power_on () == 0) {
2802 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2806 /* Test AP WPS PIN */
2807 if ((cap.wps_ap != 0U) && ((cap.ap != 0) || (cap.station_ap != 0))) {
2808 memset((void *)&config, 0, sizeof(config));
2809 config.ssid = WIFI_AP_SSID;
2810 config.pass = WIFI_AP_PASS;
2811 config.security = WIFI_AP_SECURITY;
2812 config.ch = WIFI_AP_CH;
2814 /* Start AP with WPS configuration - PIN method -> should succeed */
2815 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2816 config.wps_pin = WIFI_AP_WPS_PIN;
2817 ret = drv->Activate(1U, &config);
2818 TEST_ASSERT(ret == ARM_DRIVER_OK);
2820 if (ret == ARM_DRIVER_OK) {
2821 // Wait predefined time for Client to connect
2822 osDelay(WIFI_AP_CLIENT_CON_TIMEOUT);
2826 drv->Deactivate (1U);
2834 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2835 /* WiFi Socket tests */
2836 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2839 \defgroup wifi_sock_api WiFi Socket API
2842 These tests verify API and operation of the WiFi socket functions.
2845 /* Helper function that initialize and connects to WiFi Access Point */
2846 static int32_t station_init (uint32_t con) {
2848 if (cap.station == 0U) {
2852 if (powered == 0U) {
2853 if ((drv->Initialize (event_func) == ARM_DRIVER_OK) &&
2854 (drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK)) {
2861 if (connected != con) {
2863 memset((void *)&config, 0, sizeof(config));
2864 config.ssid = WIFI_STA_SSID;
2865 config.pass = WIFI_STA_PASS;
2866 config.security = WIFI_STA_SECURITY;
2867 config.ch = WIFI_STA_CH;
2868 if (drv->Activate(0U, &config) != ARM_DRIVER_OK) {
2872 if (drv->Deactivate(0U) != ARM_DRIVER_OK) {
2877 connected = (uint8_t)con;
2883 /* Helper function that disconnects and uninitializes Station */
2884 static void station_uninit (void) {
2886 drv->Deactivate (0U);
2889 drv->PowerControl (ARM_POWER_OFF);
2890 drv->Uninitialize ();
2894 /* Helper function for execution of socket test function in the worker thread */
2895 static int32_t th_execute (osThreadId_t *id, uint32_t sig, uint32_t tout, uint32_t line) {
2896 osThreadFlagsSet (id, sig);
2897 if (osThreadFlagsWait (TH_OK | TH_TOUT, osFlagsWaitAny, tout) == TH_OK) {
2898 /* Success, completed in time */
2901 /* Function timeout expired */
2902 snprintf(msg_buf, sizeof(msg_buf), "Execution timeout (%d ms)", tout);
2903 TEST_ASSERT_MESSAGE(0,msg_buf)
2907 #define TH_EXECUTE(sig,tout) do { \
2909 rval = th_execute (worker, sig, tout, __LINE__); \
2912 #define TH_ASSERT(cond) do { \
2913 if (rval) { TEST_ASSERT(cond); } \
2916 #define TH_ASSERT2(c1,c2) do { \
2918 if (!c2) { TEST_ASSERT(c1); } \
2919 else TEST_MESSAGE("[WARNING] Non BSD-strict"); \
2923 #define TH_ASSERT3(c1,c2,s1,r1,r2) do { \
2925 if (!c2) { TEST_ASSERT(c1); } \
2927 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Non BSD-strict, %s (result %s, expected %s)", s1, str_sock_ret[-r1], str_sock_ret[-r2]); \
2928 TEST_MESSAGE(msg_buf); \
2933 #define ARG_INIT() do { \
2934 io.owner = osThreadGetId (); \
2938 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2940 /* Create IO parameters */
2952 /* Assign arguments */
2953 #define ARG_CREATE(_af,_type,_proto) do { \
2956 io.protocol = _proto; \
2959 /* Create worker thread */
2960 __NO_RETURN static void Th_Create (IO_CREATE *io) {
2961 uint32_t flags, xid;
2964 flags = osThreadFlagsWait (F_CREATE | F_CLOSE, osFlagsWaitAny, osWaitForever);
2969 io->rc = drv->SocketCreate (io->af, io->type, io->protocol);
2974 io->rc = drv->SocketClose (io->sock);
2977 /* Done, send signal to owner thread */
2978 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
2980 osThreadFlagsSet (io->owner, flags);
2981 osThreadFlagsClear (F_ALL);
2986 \brief Test case: WIFI_SocketCreate
2987 \ingroup wifi_sock_api
2989 The test case \b WIFI_SocketCreate verifies the WiFi Driver \b SocketCreate function:
2991 int32_t (*SocketCreate) (int32_t af, int32_t type, int32_t protocol);
2995 - Check function parameters
2996 - Create multiple stream sockets
2997 - Gradually close stream sockets and create datagram sockets
2998 - Close datagram sockets
3000 void WIFI_SocketCreate (void) {
3001 osThreadId_t worker;
3004 int32_t sock[WIFI_SOCKET_MAX_NUM], i;
3006 if (socket_funcs_exist == 0U) {
3007 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3011 if (station_init (1) == 0) {
3012 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3016 /* Create worker thread */
3017 worker = osThreadNew ((osThreadFunc_t)Th_Create, &io, NULL);
3018 if (worker == NULL) {
3019 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3025 /* Check parameter (af = -1) */
3026 ARG_CREATE (-1, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3027 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3028 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3030 /* Check parameter (af = INT32_MIN) */
3031 ARG_CREATE (INT32_MIN, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3032 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3033 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3035 /* Check parameter (af = INT32_MAX) */
3036 ARG_CREATE (INT32_MAX, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3037 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3038 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3040 /* Check parameter (type = -1) */
3041 ARG_CREATE (ARM_SOCKET_AF_INET, -1, ARM_SOCKET_IPPROTO_TCP);
3042 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3043 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3045 /* Check parameter (type = INT32_MIN) */
3046 ARG_CREATE (ARM_SOCKET_AF_INET, INT32_MIN, ARM_SOCKET_IPPROTO_TCP);
3047 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3048 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3050 /* Check parameter (type = INT32_MAX) */
3051 ARG_CREATE (ARM_SOCKET_AF_INET, INT32_MAX, ARM_SOCKET_IPPROTO_TCP);
3052 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3053 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3055 /* Check parameter, stream socket (protocol = -1) */
3056 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, -1);
3057 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3058 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3060 /* Check parameter, stream socket (protocol = INT32_MIN) */
3061 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, INT32_MIN);
3062 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3063 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3065 /* Check parameter, stream socket (protocol = INT32_MAX) */
3066 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, INT32_MAX);
3067 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3068 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3070 /* Check parameter, datagram socket (protocol = -1) */
3071 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, -1);
3072 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3073 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3075 /* Check parameter, datagram socket (protocol = INT32_MIN) */
3076 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, INT32_MIN);
3077 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3078 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3080 /* Check parameter, datagram socket (protocol = INT32_MAX) */
3081 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, INT32_MAX);
3082 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3083 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3085 /* Check parameter, stream socket (protocol = ARM_SOCKET_IPPROTO_UDP) */
3086 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_UDP);
3087 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3088 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3090 /* Check parameter, datagram socket (protocol = ARM_SOCKET_IPPROTO_TCP) */
3091 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_TCP);
3092 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3093 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3095 /* Create multiple stream sockets */
3096 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3097 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3098 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3099 TH_ASSERT (io.rc >= 0);
3104 /* Gradually close stream sockets, create datagram sockets */
3105 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3106 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3107 /* Close stream socket */
3109 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3110 TH_ASSERT (io.rc == 0);
3112 /* Create datagram socket */
3113 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3114 TH_ASSERT (io.rc >= 0);
3119 /* Close datagram sockets */
3120 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3122 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3123 TH_ASSERT (io.rc == 0);
3131 /* Terminate worker thread */
3132 osThreadTerminate (worker);
3135 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3137 /* Bind IO parameters */
3150 /* Assign arguments */
3151 #define ARG_BIND(_sock,_ip,_ip_len,_port) do { \
3154 io.ip_len = _ip_len; \
3158 /* Bind worker thread */
3159 __NO_RETURN static void Th_Bind (IO_BIND *io) {
3163 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_CLOSE, osFlagsWaitAny, osWaitForever);
3167 /* Create stream socket */
3168 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3172 /* Create datagram socket */
3173 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3178 io->rc = drv->SocketBind (io->sock, io->ip, io->ip_len, io->port);
3183 io->rc = drv->SocketClose (io->sock);
3186 /* Done, send signal to owner thread */
3187 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3189 osThreadFlagsSet (io->owner, flags);
3190 osThreadFlagsClear (F_ALL);
3195 \brief Test case: WIFI_SocketBind
3196 \ingroup wifi_sock_api
3198 The test case \b WIFI_SocketBind verifies the WiFi Driver \b SocketBind function:
3200 int32_t (*SocketBind) (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port);
3204 - Create stream socket
3205 - Check function parameters
3206 - Bind stream socket
3207 - Bind socket second time
3208 - Create 2nd stream socket
3209 - Bind 2nd socket, used port
3210 - Bind 2nd socket, unused port
3211 - Close stream sockets
3212 - Bind closed socket
3214 Datagram socket test:
3215 - Create datagram socket
3216 - Bind datagram socket
3217 - Bind socket second time
3218 - Create 2nd datagram socket
3219 - Bind 2nd socket, used port
3220 - Bind 2nd socket, unused port
3221 - Close datagram socket
3222 - Bind closed socket
3224 void WIFI_SocketBind (void) {
3225 osThreadId_t worker;
3230 if (socket_funcs_exist == 0U) {
3231 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3235 if (station_init (1) == 0) {
3236 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3240 /* Create worker thread */
3241 worker = osThreadNew ((osThreadFunc_t)Th_Bind, &io, NULL);
3242 if (worker == NULL) {
3243 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3249 /* Create stream socket */
3250 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3252 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3256 /* Check parameter (socket = -1) */
3257 ARG_BIND (-1, ip_unspec, 4, DISCARD_PORT);
3258 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3259 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3261 /* Check parameter (socket = INT32_MIN) */
3262 ARG_BIND (INT32_MIN, ip_unspec, 4, DISCARD_PORT);
3263 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3264 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3266 /* Check parameter (socket = INT32_MAX) */
3267 ARG_BIND (INT32_MAX, ip_unspec, 4, DISCARD_PORT);
3268 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3269 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3271 /* Check parameter (ip = NULL) */
3272 ARG_BIND (sock, NULL, 4, DISCARD_PORT);
3273 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3274 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3276 /* Check parameter (ip_len = 0) */
3277 ARG_BIND (sock, ip_unspec, 0, DISCARD_PORT);
3278 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3279 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3281 /* Check parameter (ip_len = UINT32_MAX) */
3282 ARG_BIND (sock, ip_unspec, UINT32_MAX, DISCARD_PORT);
3283 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3284 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3286 /* Check parameter (port = 0) */
3287 ARG_BIND (sock, ip_unspec, 4, 0);
3288 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3289 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3292 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3293 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3294 TH_ASSERT (io.rc == 0);
3296 /* Bind socket 2nd time */
3297 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3298 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3299 /* Should return error (socket already bound) */
3300 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3301 TH_ASSERT3 ((io.rc == ARM_SOCKET_EINVAL), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "bind socket to same address again", io.rc, ARM_SOCKET_EINVAL);
3303 /* Create 2nd stream socket */
3304 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3306 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3310 /* Bind 2nd socket, used port */
3311 ARG_BIND (sock2, ip_unspec, 4, DISCARD_PORT);
3312 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3313 /* Should return error (address already used) */
3314 /* Strict: EADDRINUSE, valid non-strict: ERROR */
3315 TH_ASSERT3 ((io.rc == ARM_SOCKET_EADDRINUSE), (io.rc == ARM_SOCKET_ERROR), "bind another socket to used address", io.rc, ARM_SOCKET_EADDRINUSE);
3317 /* Bind 2nd socket, unused port */
3318 ARG_BIND (sock2, ip_unspec, 4, ECHO_PORT);
3319 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3320 TH_ASSERT (io.rc == 0);
3324 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3325 TH_ASSERT (io.rc == 0);
3328 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3329 TH_ASSERT (io.rc == 0);
3331 /* Bind again, closed socket */
3332 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3333 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3334 /* Should return error (socket not created) */
3335 /* Strict: ESOCK, valid non-strict: ERROR */
3336 /* Return code strict: ESOCK, non-strict: ERROR */
3337 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "bind on closed socket", io.rc, ARM_SOCKET_ESOCK);
3342 /* Create datagram socket */
3343 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3345 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3349 /* Check parameter (socket = -1) */
3350 ARG_BIND (-1, ip_unspec, 4, DISCARD_PORT);
3351 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3352 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3354 /* Check parameter (socket = INT32_MIN) */
3355 ARG_BIND (INT32_MIN, ip_unspec, 4, DISCARD_PORT);
3356 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3357 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3359 /* Check parameter (socket = INT32_MAX) */
3360 ARG_BIND (INT32_MAX, ip_unspec, 4, DISCARD_PORT);
3361 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3362 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3364 /* Check parameter (ip = NULL) */
3365 ARG_BIND (sock, NULL, 4, DISCARD_PORT);
3366 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3367 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3369 /* Check parameter (ip_len = 0) */
3370 ARG_BIND (sock, ip_unspec, 0, DISCARD_PORT);
3371 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3372 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3374 /* Check parameter (ip_len = UINT32_MAX) */
3375 ARG_BIND (sock, ip_unspec, UINT32_MAX, DISCARD_PORT);
3376 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3377 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3379 /* Check parameter (port = 0) */
3380 ARG_BIND (sock, ip_unspec, 4, 0);
3381 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3382 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3385 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3386 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3387 TH_ASSERT (io.rc == 0);
3389 /* Bind socket 2nd time */
3390 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3391 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3392 /* Should return error (socket already bound) */
3393 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3394 TH_ASSERT3 ((io.rc == ARM_SOCKET_EINVAL), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "bind socket to same address again", io.rc, ARM_SOCKET_EINVAL);
3396 /* Create 2nd datagram socket */
3397 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3399 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3403 /* Bind 2nd socket, used port */
3404 ARG_BIND (sock2, ip_unspec, 4, DISCARD_PORT);
3405 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3406 /* Should return error (address already used) */
3407 /* Strict: EADDRINUSE, valid non-strict: ERROR */
3408 TH_ASSERT3 ((io.rc == ARM_SOCKET_EADDRINUSE), (io.rc == ARM_SOCKET_ERROR), "bind another socket to used address", io.rc, ARM_SOCKET_EADDRINUSE);
3410 /* Bind 2nd socket, unused port */
3411 ARG_BIND (sock2, ip_unspec, 4, ECHO_PORT);
3412 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3413 TH_ASSERT (io.rc == 0);
3417 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3418 TH_ASSERT (io.rc == 0);
3421 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3422 TH_ASSERT (io.rc == 0);
3424 /* Bind again, closed socket */
3425 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3426 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3427 /* Should return error (socket not created) */
3428 /* Strict: ESOCK, valid non-strict: ERROR */
3429 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "bind on closed socket", io.rc, ARM_SOCKET_ESOCK);
3438 /* Terminate worker thread */
3439 osThreadTerminate (worker);
3442 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3444 /* Listen IO parameters */
3454 /* Assign arguments */
3455 #define ARG_LISTEN(_sock,_backlog) do { \
3457 io.backlog = _backlog; \
3460 /* Listen worker thread */
3461 __NO_RETURN static void Th_Listen (IO_LISTEN *io) {
3465 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
3466 F_BIND | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
3470 /* Create stream socket */
3471 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3475 /* Create datagram socket */
3476 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3481 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
3485 /* Listen on socket */
3486 io->rc = drv->SocketListen (io->sock, io->backlog);
3491 io->rc = drv->SocketClose (io->sock);
3494 /* Done, send signal to owner thread */
3495 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3497 osThreadFlagsSet (io->owner, flags);
3498 osThreadFlagsClear (F_ALL);
3503 \brief Test case: WIFI_SocketListen
3504 \ingroup wifi_sock_api
3506 The test case \b WIFI_SocketListen verifies the WiFi Driver \b SocketListen function:
3508 int32_t (*SocketListen) (int32_t socket, int32_t backlog);
3511 Stream socket test 1:
3512 - Create stream socket
3514 - Check function parameters
3516 - Start listening 2nd time
3519 Stream socket test 2:
3520 - Create stream socket
3521 - Start listening, unbound socket
3523 - Start listening, closed socket
3525 Datagram socket test:
3526 - Create datagram socket
3531 void WIFI_SocketListen (void) {
3532 osThreadId_t worker;
3537 if (socket_funcs_exist == 0U) {
3538 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3542 if (station_init (1) == 0) {
3543 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3547 /* Create worker thread */
3548 worker = osThreadNew ((osThreadFunc_t)Th_Listen, &io, NULL);
3549 if (worker == NULL) {
3550 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3556 /* Create stream socket */
3557 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3559 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3565 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3566 TH_ASSERT (io.rc == 0);
3568 /* Check parameter (socket = -1) */
3570 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3571 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3573 /* Check parameter (socket = INT32_MIN) */
3574 ARG_LISTEN (INT32_MIN, 1);
3575 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3576 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3578 /* Check parameter (socket = INT32_MAX) */
3579 ARG_LISTEN (INT32_MAX, 1);
3580 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3581 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3583 /* Start listening */
3584 ARG_LISTEN (sock, 1);
3585 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3586 TH_ASSERT (io.rc == 0);
3588 /* Start listening 2nd time */
3589 ARG_LISTEN (sock, 1);
3590 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3591 /* Should return error (socket already listening) */
3592 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3593 TH_ASSERT3 ((io.rc == ARM_SOCKET_EINVAL), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "listen on already listening socket", io.rc, ARM_SOCKET_EINVAL);
3597 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3598 TH_ASSERT (io.rc == 0);
3603 /* Create stream socket */
3604 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3606 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3610 /* Start listening, unbound socket */
3611 ARG_LISTEN (sock, 1);
3612 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3613 /* Should return error (socket not bound) */
3614 /* Strict: EINVAL, valid non-strict: ERROR */
3615 TH_ASSERT3 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "listen on unbound socket", io.rc, ARM_SOCKET_EINVAL);
3619 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3620 TH_ASSERT (io.rc == 0);
3622 /* Start listening, closed socket */
3623 ARG_LISTEN (sock, 1);
3624 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3625 /* Should return error (socket not created) */
3626 /* Strict: ESOCK, valid non-strict: ERROR */
3627 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "listen on closed socket", io.rc, ARM_SOCKET_ESOCK);
3632 /* Create datagram socket */
3633 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3635 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3641 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3642 TH_ASSERT (io.rc == 0);
3644 /* Start listening */
3645 ARG_LISTEN (sock, 1);
3646 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3647 /* Should return error (operation not supported) */
3648 /* Strict: ENOTSUP, valid non-strict: ERROR */
3649 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "listen on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
3653 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3654 TH_ASSERT (io.rc == 0);
3663 /* Terminate worker thread */
3664 osThreadTerminate (worker);
3667 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3669 /* Accept IO parameters */
3682 /* Assign arguments */
3683 #define ARG_ACCEPT(_sock,_ip,_ip_len,_port) do { \
3686 io.ip_len = _ip_len; \
3690 /* TestAssistant control */
3691 #define TEST_PORT 2000
3693 /* CONNECT <proto>,<ip_addr>,<port>,<delay_ms>
3694 <proto> = protocol (TCP, UDP)
3695 <ip_addr> = IP address (0.0.0.0 = sender address)
3696 <port> = port number
3697 <delay_ms> = startup delay
3699 Example: CONNECT TCP,192.168.1.200,80,600
3700 (wait 600ms then connect to 192.168.1.200, port 80)
3702 #define CMD_CONNECT_TCP "CONNECT TCP,0.0.0.0,2000,500"
3703 #define CMD_CONNECT_UDP "CONNECT UDP,0.0.0.0,2000,200"
3705 /* Accept worker thread */
3706 __NO_RETURN static void Th_Accept (IO_ACCEPT *io) {
3711 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_LISTEN |
3712 F_ACCEPT | F_SEND_CTRL | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
3716 /* Create stream socket */
3717 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3721 /* Create datagram socket */
3722 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3727 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, TEST_PORT);
3731 /* Listen on socket */
3732 io->rc = drv->SocketListen (io->sock, 1);
3736 /* Accept on socket */
3737 io->rc = drv->SocketAccept (io->sock, io->ip, io->ip_len, io->port);
3741 /* Recv on socket (stream, datagram) */
3742 memset((void *)buffer, 0xCC, 16);
3743 io->rc = drv->SocketRecv (io->sock, buffer, 16);
3744 if ((io->rc > 0) && (memcmp ((const void *)buffer, (const void *)"SockServer", 10) != 0)) {
3745 /* Failed if rc <= 0 */
3752 io->rc = drv->SocketClose (io->sock);
3756 /* Send control command to TestAssistant */
3757 sock = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3758 drv->SocketConnect (sock, ip_socket_server, 4, ASSISTANT_PORT);
3759 io->rc = drv->SocketSend (sock, io->cmd, strlen(io->cmd));
3760 drv->SocketClose (sock);
3764 /* Done, send signal to owner thread */
3765 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3767 osThreadFlagsSet (io->owner, flags);
3768 osThreadFlagsClear (F_ALL);
3773 \brief Test case: WIFI_SocketAccept
3774 \ingroup wifi_sock_api
3776 The test case \b WIFI_SocketAccept verifies the WiFi Driver \b SocketAccept function:
3778 int32_t (*SocketAccept) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
3782 - Create stream socket
3785 - Check function parameters
3786 - Accept connection, NULL parameters
3787 - Receive ServerId on accepted socket
3788 - Close accepted socket
3789 - Accept connection again, return IP address and port
3790 - Receive ServerId on accepted socket
3791 - Receive again, server closed connection
3792 - Close accepted socket
3793 - Close listening socket
3794 - Accept again, closed socket
3796 Datagram socket test:
3797 - Create datagram socket
3800 - Accept connection, provide return parameters for IP address and port
3801 - Receive ServerId on socket
3804 void WIFI_SocketAccept (void) {
3808 osThreadId_t worker;
3813 if (socket_funcs_exist == 0U) {
3814 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3818 if (station_init (1) == 0) {
3819 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3823 /* Create worker thread */
3824 worker = osThreadNew ((osThreadFunc_t)Th_Accept, &io, NULL);
3825 if (worker == NULL) {
3826 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3832 /* Create stream socket */
3833 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3835 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3841 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3842 TH_ASSERT (io.rc == 0);
3844 /* Start listening */
3846 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3847 TH_ASSERT (io.rc == 0);
3849 /* Check parameter (socket = -1) */
3850 ip_len = sizeof(ip);
3851 ARG_ACCEPT (-1, ip, &ip_len, &port);
3852 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3853 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3855 /* Check parameter (socket = INT32_MIN) */
3856 ARG_ACCEPT (INT32_MIN, ip, &ip_len, &port);
3857 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3858 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3860 /* Check parameter (socket = INT32_MAX) */
3861 ARG_ACCEPT (INT32_MAX, ip, &ip_len, &port);
3862 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3863 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3865 /* Parameters 'ip', 'ip_len' and 'port' are optional, can be NULL */
3867 /* Request a remote server to connect to us */
3868 io.cmd = CMD_CONNECT_TCP;
3869 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
3870 TH_ASSERT (io.rc > 0);
3872 /* Accept connection with NULL parameters */
3873 ARG_ACCEPT (sock, NULL, NULL, NULL);
3874 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT_LONG);
3875 /* Accepted socket should be different */
3876 TH_ASSERT ((io.rc != io.sock) && (io.rc >= 0));
3878 /* Receive SockServer id string */
3880 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
3881 TH_ASSERT (io.rc > 0);
3883 /* Close accepted socket */
3884 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3885 TH_ASSERT (io.rc == 0);
3889 /* Request from remote server to connect to us */
3890 io.cmd = CMD_CONNECT_TCP;
3891 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
3892 TH_ASSERT (io.rc > 0);
3894 /* Initialize buffers for return values */
3896 ip_len = sizeof(ip) + 1;
3897 memset ((void *)ip, 0, sizeof(ip));
3899 /* Accept again, return ip address and port */
3900 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
3901 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT_LONG);
3902 /* Accepted socket should be different */
3903 TH_ASSERT ((io.rc != io.sock) && (io.rc >= 0));
3904 /* IP address should be the address of the server */
3905 TH_ASSERT ((memcmp ((const void *)ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
3906 /* Port number of remote peer should be non-zero */
3907 TH_ASSERT (port != 0);
3909 /* Receive SockServer id string */
3911 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
3912 TH_ASSERT (io.rc > 0);
3914 /* SockServer disconnects after 500ms */
3916 /* Receive again, no data */
3917 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
3918 /* Should return error (connection reset) */
3919 /* Strict: ECONNRESET, valid non-strict: ERROR */
3920 TH_ASSERT3 ((io.rc == ARM_SOCKET_ECONNRESET), (io.rc == ARM_SOCKET_ERROR), "receive on disconnected socket", io.rc, ARM_SOCKET_ECONNRESET);
3922 /* Close accepted socket */
3923 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3924 TH_ASSERT (io.rc == 0);
3926 /* Close listening socket */
3928 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3929 TH_ASSERT (io.rc == 0);
3931 /* Accept again, closed socket */
3933 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
3934 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3935 /* Should return error (socket not created) */
3936 /* Strict: ESOCK, valid non-strict: ERROR */
3937 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "accept on closed socket", io.rc, ARM_SOCKET_ESOCK);
3942 /* Create datagram socket */
3943 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3945 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3951 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3952 TH_ASSERT (io.rc == 0);
3954 /* Start listening */
3956 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3957 /* Listen on datagram socket should fail */
3958 /* Strict: ENOTSUP, valid non-strict: ERROR */
3959 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "listen on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
3961 /* Initialize buffers for return values */
3963 ip_len = sizeof(ip);
3964 memset ((void *)ip, 0, sizeof(ip));
3966 /* Accept on datagram socket */
3967 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
3968 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3969 /* Accept on datagram socket should fail */
3970 /* Strict: ENOTSUP, valid non-strict: ERROR */
3971 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "accept on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
3975 /* Request from remote server to send us a test message */
3976 io.cmd = CMD_CONNECT_UDP;
3977 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
3978 TH_ASSERT (io.rc > 0);
3980 /* Receive SockServer id string */
3981 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
3982 TH_ASSERT (io.rc > 0);
3985 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3986 TH_ASSERT (io.rc == 0);
3995 /* Terminate worker thread */
3996 osThreadTerminate (worker);
3999 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4001 /* Connect IO parameters */
4014 /* Assign arguments */
4015 #define ARG_CONNECT(_sock,_ip,_ip_len,_port) do { \
4018 io.ip_len = _ip_len; \
4022 /* Connect worker thread */
4023 __NO_RETURN static void Th_Connect (IO_CONNECT *io) {
4027 /* Wait for the signal to select and execute the function */
4028 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
4029 F_CONNECT | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
4033 /* Create stream socket */
4034 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
4038 /* Create datagram socket */
4039 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
4044 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
4048 /* Connect on socket */
4049 io->rc = drv->SocketConnect (io->sock, io->ip, io->ip_len, io->port);
4053 /* Listen on socket */
4054 io->rc = drv->SocketListen (io->sock, 1);
4059 io->rc = drv->SocketClose (io->sock);
4062 /* Done, send signal to owner thread */
4063 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4065 osThreadFlagsSet (io->owner, flags);
4066 osThreadFlagsClear (F_ALL);
4071 \brief Test case: WIFI_SocketConnect
4072 \ingroup wifi_sock_api
4074 The test case \b WIFI_SocketConnect verifies the WiFi Driver \b SocketConnect function:
4076 int32_t (*SocketConnect) (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port);
4079 Stream socket test 1:
4080 - Create stream socket
4081 - Check function parameters
4082 - Connect to server, blocking mode
4083 - Connect again, already connected
4084 - Bind connected socket
4086 - Connect on closed socket
4088 Stream socket test 2:
4089 - Create stream socket
4090 - Connect to server, connection rejected
4093 Stream socket test 3:
4094 - Create stream socket
4095 - Connect to server, non-responding or non-existent
4098 Stream socket test 4:
4099 - Create stream socket
4102 - Connect to server, blocking mode
4105 Datagram socket test:
4106 - Create datagram socket
4108 - Check function parameters
4109 - Connect to server, enable address filtering
4110 - Connect to unspecified address, disable filtering
4112 - Connect again, closed socket
4114 void WIFI_SocketConnect (void) {
4115 osThreadId_t worker;
4120 if (socket_funcs_exist == 0U) {
4121 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4125 if (station_init (1) == 0) {
4126 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4130 /* Create worker thread */
4131 worker = osThreadNew ((osThreadFunc_t)Th_Connect, &io, NULL);
4132 if (worker == NULL) {
4133 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4139 /* Create stream socket */
4140 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4142 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4146 /* Check parameter (socket = -1) */
4147 ARG_CONNECT(-1, ip_socket_server, 4, DISCARD_PORT);
4148 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4149 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4151 /* Check parameter (socket = INT32_MIN) */
4152 ARG_CONNECT(INT32_MIN, ip_socket_server, 4, DISCARD_PORT);
4153 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4154 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4156 /* Check parameter (socket = INT32_MAX) */
4157 ARG_CONNECT(INT32_MAX, ip_socket_server, 4, DISCARD_PORT);
4158 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4159 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4161 /* Check parameter (ip = NULL) */
4162 ARG_CONNECT(sock, NULL, 4, DISCARD_PORT);
4163 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4164 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4166 /* Check parameter (ip = 0.0.0.0) */
4167 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4168 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4169 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4171 /* Check parameter (ip_len = 0) */
4172 ARG_CONNECT(sock, ip_socket_server, 0, DISCARD_PORT);
4173 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4174 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4176 /* Check parameter (ip_len = 5) */
4177 ARG_CONNECT(sock, ip_socket_server, 5, DISCARD_PORT);
4178 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4179 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4181 /* Check parameter (port = 0) */
4182 ARG_CONNECT(sock, ip_socket_server, 4, 0);
4183 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4184 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4186 /* Connect to stream server */
4187 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4188 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4189 TH_ASSERT (io.rc == 0);
4191 /* Connect 2nd time */
4192 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4193 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4194 /* Should return error (socket already connected) */
4195 /* Strict: EISCONN, valid non-strict: OK, ERROR */
4196 TH_ASSERT3 ((io.rc == ARM_SOCKET_EISCONN), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "connect socket to same address again", io.rc, ARM_SOCKET_EISCONN);
4198 /* Bind connected socket */
4200 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4201 /* Should return error (socket already connected) */
4202 /* Strict: EISCONN, valid non-strict: ERROR */
4203 TH_ASSERT3 ((io.rc == ARM_SOCKET_EISCONN), (io.rc == ARM_SOCKET_ERROR), "bind on connected socket", io.rc, ARM_SOCKET_EISCONN);
4207 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4208 TH_ASSERT (io.rc == 0);
4210 /* Connect again, closed socket */
4211 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4212 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4213 /* Should return error (socket not created) */
4214 /* Strict: ESOCK, valid non-strict: ERROR */
4215 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "connect on closed socket", io.rc, ARM_SOCKET_ESOCK);
4220 /* Create stream socket */
4221 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4223 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4227 /* Connect to stream server (connection rejected) */
4228 ARG_CONNECT(sock, ip_socket_server, 4, TCP_REJECTED_PORT);
4229 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4230 /* Should return error (connection rejected by the peer) */
4231 /* Strict: ECONNREFUSED, valid non-strict: ETIMEDOUT, ERROR */
4232 TH_ASSERT3 ((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);
4236 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4237 TH_ASSERT (io.rc == 0);
4242 /* Create stream socket */
4243 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4245 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4249 /* Connect to stream server (non-existent) */
4250 ARG_CONNECT(sock, ip_socket_server, 4, TCP_TIMEOUT_PORT);
4251 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4252 /* Should return error (connection timeout) */
4253 /* Strict: ETIMEDOUT, valid non-strict: ERROR */
4254 TH_ASSERT3 ((io.rc == ARM_SOCKET_ETIMEDOUT), (io.rc == ARM_SOCKET_ERROR), "connect to non-existent stream server", io.rc, ARM_SOCKET_ETIMEDOUT);
4258 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4259 TH_ASSERT (io.rc == 0);
4264 /* Create stream socket */
4265 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4267 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4273 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4274 TH_ASSERT (io.rc == 0);
4276 /* Start listening */
4278 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
4279 TH_ASSERT (io.rc == 0);
4281 /* Connect to stream server */
4282 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4283 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4284 /* Connect on listening socket should fail */
4285 /* Strict: EINVAL, valid non-strict: ERROR */
4286 TH_ASSERT3 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "connect on listening socket", io.rc, ARM_SOCKET_EINVAL);
4290 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4291 TH_ASSERT (io.rc == 0);
4296 /* Create datagram socket */
4297 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
4299 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
4303 /* Check parameter (socket = -1) */
4304 ARG_CONNECT(-1, ip_socket_server, 4, DISCARD_PORT);
4305 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4306 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4308 /* Check parameter (socket = INT32_MIN) */
4309 ARG_CONNECT(INT32_MIN, ip_socket_server, 4, DISCARD_PORT);
4310 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4311 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4313 /* Check parameter (socket = INT32_MAX) */
4314 ARG_CONNECT(INT32_MAX, ip_socket_server, 4, DISCARD_PORT);
4315 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4316 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4318 /* Check parameter (ip = NULL) */
4319 ARG_CONNECT(sock, NULL, 4, DISCARD_PORT);
4320 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4321 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4323 /* Check parameter (ip = 0.0.0.0) */
4324 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4325 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4326 /* Datagram sockets may dissolve the association */
4327 /* by connecting to unspecified address. */
4328 /* Strict: OK, valid non-strict: EINVAL, ERROR */
4329 TH_ASSERT3 ((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);
4331 /* Check parameter (ip_len = 0) */
4332 ARG_CONNECT(sock, ip_socket_server, 0, DISCARD_PORT);
4333 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4334 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4336 /* Check parameter (ip_len = 5) */
4337 ARG_CONNECT(sock, ip_socket_server, 5, DISCARD_PORT);
4338 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4339 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4341 /* Check parameter (port = 0) */
4342 ARG_CONNECT(sock, ip_socket_server, 4, 0);
4343 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4344 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4346 /* Connect to datagram server */
4347 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4348 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4349 TH_ASSERT (io.rc == 0);
4351 /* Connect to unspecified address (0.0.0.0) */
4352 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4353 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4354 /* Datagram sockets may dissolve the association */
4355 /* by connecting to unspecified address. */
4356 /* Should return ok (socket address deleted) */
4357 /* Strict: OK, valid non-strict: EINVAL, ERROR */
4358 TH_ASSERT3 ((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);
4362 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4363 TH_ASSERT (io.rc == 0);
4365 /* Connect again, closed socket */
4366 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4367 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4368 /* Should return error (socket not created) */
4369 /* Strict: ESOCK, valid non-strict: ERROR */
4370 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "connect on closed socket", io.rc, ARM_SOCKET_ESOCK);
4379 /* Terminate worker thread */
4380 osThreadTerminate (worker);
4383 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4385 /* Recv IO parameters */
4397 /* Assign arguments */
4398 #define ARG_RECV(_sock,_buf,_len) do { \
4404 /* Recv worker thread */
4405 __NO_RETURN static void Th_Recv (IO_RECV *io) {
4409 /* Wait for the signal to select and execute the function */
4410 flags = osThreadFlagsWait (F_CREATE_TCP | F_BIND | F_CONNECT | F_LISTEN |
4411 F_SETOPT | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
4415 /* Create stream socket */
4416 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
4421 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
4425 /* Connect on socket */
4426 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, (uint16_t)io->tval);
4430 /* Listen on socket */
4431 io->rc = drv->SocketListen (io->sock, 1);
4435 /* Set socket options */
4436 io->rc = drv->SocketSetOpt (io->sock, ARM_SOCKET_SO_RCVTIMEO, &io->tval, sizeof(io->tval));
4440 /* Recv on socket */
4441 if (io->buf != NULL) {
4442 memset((void *)io->buf, 0xCC, io->len);
4444 io->rc = drv->SocketRecv (io->sock, io->buf, io->len);
4449 io->rc = drv->SocketClose (io->sock);
4452 /* Done, send signal to owner thread */
4453 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4455 osThreadFlagsSet (io->owner, flags);
4456 osThreadFlagsClear (F_ALL);
4461 \brief Test case: WIFI_SocketRecv
4462 \ingroup wifi_sock_api
4464 Test case \b WIFI_SocketRecv verifies the WiFi Driver \b SocketRecv function:
4466 int32_t (*SocketRecv) (int32_t socket, void *buf, uint32_t len);
4469 Stream socket test 1:
4470 - Create stream socket
4471 - Connect to Chargen server
4472 - Check function parameters
4473 - Receive data in blocking mode
4475 - Receive again, closed socket
4477 Stream socket test 2:
4478 - Create stream socket
4479 - Receive data, created socket
4481 - Receive data, bound socket
4483 - Receive data, listening socket
4486 Stream socket test 3:
4487 - Create stream socket
4488 - Connect to Discard server
4489 - Set receive timeout to 1 sec
4490 - Receive data, timeout expires
4493 void WIFI_SocketRecv (void) {
4495 uint32_t ticks,tout;
4496 osThreadId_t worker;
4501 if (socket_funcs_exist == 0U) {
4502 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4506 if (station_init (1) == 0) {
4507 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4511 /* Create worker thread */
4512 worker = osThreadNew ((osThreadFunc_t)Th_Recv, &io, NULL);
4513 if (worker == NULL) {
4514 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4520 /* Create stream socket */
4521 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4523 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4527 /* Connect to stream server */
4529 io.tval = CHARGEN_PORT;
4530 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4531 TH_ASSERT (io.rc == 0);
4533 /* Check parameter (socket = -1) */
4534 ARG_RECV (-1, buf, sizeof(buf));
4535 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4536 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4538 /* Check parameter (socket = INT32_MIN) */
4539 ARG_RECV (INT32_MIN, buf, sizeof(buf));
4540 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4541 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4543 /* Check parameter (socket = INT32_MAX) */
4544 ARG_RECV (INT32_MAX, buf, sizeof(buf));
4545 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4546 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4548 /* Check parameter (buf = NULL) */
4549 ARG_RECV (sock, NULL, sizeof(buf));
4550 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4551 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4553 /* Check parameter (len = 0) */
4554 ARG_RECV (sock, buf, 0);
4555 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4556 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4558 /* Receive some data */
4559 ARG_RECV (sock, buffer, sizeof(buffer));
4560 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4561 TH_ASSERT (io.rc >= 2);
4565 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4566 TH_ASSERT (io.rc == 0);
4568 /* Receive again, closed socket */
4569 ARG_RECV (sock, buffer, sizeof(buffer));
4570 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4571 /* Should return error (socket not created) */
4572 /* Strict: ESOCK, valid non-strict: ERROR */
4573 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "recv on closed socket", io.rc, ARM_SOCKET_ESOCK);
4578 /* Create stream socket */
4579 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4581 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4583 /* Test server mode */
4586 /* Receive, created socket */
4587 ARG_RECV (sock, buffer, sizeof(buffer));
4588 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4589 /* Should return error (socket not connected) */
4590 /* Strict: ENOTCONN, valid non-strict: ERROR */
4591 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on created socket", io.rc, ARM_SOCKET_ENOTCONN);
4595 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4596 TH_ASSERT (io.rc == 0);
4598 /* Receive, bound socket */
4599 ARG_RECV (sock, buffer, sizeof(buffer));
4600 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4601 /* Should return error (socket not connected) */
4602 /* Strict: ENOTCONN, valid non-strict: ERROR */
4603 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
4605 /* Start listening */
4607 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
4608 TH_ASSERT (io.rc == 0);
4610 /* Receive, listening socket */
4611 ARG_RECV (sock, buffer, sizeof(buffer));
4612 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4613 /* Should return error (socket not connected) */
4614 /* Strict: ENOTCONN, valid non-strict: ERROR */
4615 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
4619 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4620 TH_ASSERT (io.rc == 0);
4625 /* Create stream socket */
4626 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4628 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4632 /* Connect to stream server */
4634 io.tval = DISCARD_PORT;
4635 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4636 TH_ASSERT (io.rc == 0);
4638 /* Set receive timeout to 1 sec */
4641 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
4642 TH_ASSERT (io.rc == 0);
4644 /* Receive until timeout, no data */
4645 ARG_RECV (sock, buffer, sizeof(buffer));
4646 ticks = GET_SYSTICK();
4647 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4648 tout = GET_SYSTICK() - ticks;
4649 /* Should return EAGAIN (operation timed out) */
4650 TH_ASSERT (io.rc == ARM_SOCKET_EAGAIN);
4651 /* Check receive timeout is in the range of 0.9 to 1.1 sec */
4652 TH_ASSERT (tout > SYSTICK_MICROSEC(900000) && tout < SYSTICK_MICROSEC(1100000));
4656 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4657 TH_ASSERT (io.rc == 0);
4666 /* Terminate worker thread */
4667 osThreadTerminate (worker);
4670 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4672 /* RecvFrom IO parameters */
4687 /* Assign arguments */
4688 #define ARG_RECVFROM(_sock,_buf,_len,_ip,_ip_len,_port) do { \
4693 io.ip_len = _ip_len; \
4697 /* RecvFrom worker thread */
4698 __NO_RETURN static void Th_RecvFrom (IO_RECVFROM *io) {
4702 /* Wait for the signal to select and execute the function */
4703 flags = osThreadFlagsWait (F_CREATE_UDP | F_CONNECT | F_SETOPT |
4704 F_RECVFROM | F_SEND | F_CLOSE, osFlagsWaitAny, osWaitForever);
4708 /* Create datagram socket */
4709 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
4713 /* Connect on socket */
4714 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, CHARGEN_PORT);
4718 /* Set socket options */
4719 io->rc = drv->SocketSetOpt (io->sock, ARM_SOCKET_SO_RCVTIMEO, &io->tout, sizeof(io->tout));
4723 /* RecvFrom on socket */
4724 if (io->buf != NULL) {
4725 memset((void *)io->buf, 0xCC, io->len);
4727 io->rc = drv->SocketRecvFrom (io->sock, io->buf, io->len, io->ip, io->ip_len, io->port);
4731 /* Send on socket */
4732 io->rc = drv->SocketSend (io->sock, "a", 1);
4737 io->rc = drv->SocketClose (io->sock);
4740 /* Done, send signal to owner thread */
4741 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4743 osThreadFlagsSet (io->owner, flags);
4744 osThreadFlagsClear (F_ALL);
4749 \brief Test case: WIFI_SocketRecvFrom
4750 \ingroup wifi_sock_api
4752 The test case \b WIFI_SocketRecvFrom verifies the WiFi Driver \b SocketRecvFrom function:
4754 int32_t (*SocketRecvFrom) (int32_t socket, void *buf, uint32_t len, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
4757 Datagram socket test 1:
4758 - Create datagram socket
4759 - Connect to Chargen server
4760 - Check function parameters
4761 - Receive data in blocking mode
4762 - Set receive timeout to 1 sec
4763 - Receive again, timeout expires
4765 - Receive again, closed socket
4767 void WIFI_SocketRecvFrom (void) {
4769 uint32_t ip_len,ticks,tout;
4772 osThreadId_t worker;
4777 if (socket_funcs_exist == 0U) {
4778 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4782 if (station_init (1) == 0) {
4783 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4787 /* Create worker thread */
4788 worker = osThreadNew ((osThreadFunc_t)Th_RecvFrom, &io, NULL);
4789 if (worker == NULL) {
4790 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4796 /* Create datagram socket */
4797 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
4799 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
4803 /* Connect to datagram server */
4805 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4806 TH_ASSERT (io.rc == 0);
4808 /* Check parameter (socket = -1) */
4809 ip_len = sizeof(ip);
4810 ARG_RECVFROM (-1, buf, sizeof(buf), ip, &ip_len, &port);
4811 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4812 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4814 /* Check parameter (socket = INT32_MIN) */
4815 ARG_RECVFROM (INT32_MIN, buf, sizeof(buf), ip, &ip_len, &port);
4816 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4817 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4819 /* Check parameter (socket = INT32_MAX) */
4820 ARG_RECVFROM (INT32_MAX, buf, sizeof(buf), ip, &ip_len, &port);
4821 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4822 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4824 /* Check parameter (buf == NULL) */
4825 ARG_RECVFROM (sock, NULL, sizeof(buf), ip, &ip_len, &port);
4826 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4827 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4829 /* Check parameter (len = 0) */
4830 ARG_RECVFROM (sock, buf, 0, ip, &ip_len, &port);
4831 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4832 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4834 /* Send one byte of data to trigger a reply */
4836 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
4837 TH_ASSERT (io.rc == 1);
4839 /* Initialize buffers for return values */
4841 ip_len = sizeof(ip) + 1;
4842 memset ((void *)ip, 0, sizeof(ip));
4844 /* Receive some data */
4845 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
4846 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT_LONG);
4847 /* Should receive at least 2 bytes */
4848 TH_ASSERT (io.rc >= 2);
4849 /* IP address should be the address of the server */
4850 TH_ASSERT ((memcmp ((const void *)ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
4851 /* Port number should be the port of the CHARGEN server */
4852 TH_ASSERT (port == CHARGEN_PORT);
4854 /* Set receive timeout to 1 sec */
4857 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
4858 TH_ASSERT (io.rc == 0);
4860 /* Receive until timeout, no data */
4861 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
4862 ticks = GET_SYSTICK();
4863 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4864 tout = GET_SYSTICK() - ticks;
4865 /* Should return EAGAIN (operation timed out) */
4866 TH_ASSERT (io.rc == ARM_SOCKET_EAGAIN);
4867 /* Check receive timeout is in the range of 0.9 to 1.1 sec */
4868 TH_ASSERT (tout > SYSTICK_MICROSEC(900000) && tout < SYSTICK_MICROSEC(1100000));
4872 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4873 TH_ASSERT (io.rc == 0);
4875 /* Receive again, closed socket */
4876 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
4877 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4878 /* Should return error (socket not created) */
4879 /* Strict: ESOCK, valid non-strict: ERROR */
4880 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "recvfrom on closed socket", io.rc, ARM_SOCKET_ESOCK);
4889 /* Terminate worker thread */
4890 osThreadTerminate (worker);
4893 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4895 /* Send IO parameters */
4906 /* Assign arguments */
4907 #define ARG_SEND(_sock,_buf,_len) do { \
4913 /* Send worker thread */
4914 __NO_RETURN static void Th_Send (IO_SEND *io) {
4918 /* Wait for the signal to select and execute the function */
4919 flags = osThreadFlagsWait (F_CREATE_TCP | F_BIND | F_CONNECT |
4920 F_LISTEN | F_SEND | F_CLOSE, osFlagsWaitAny, osWaitForever);
4924 /* Create stream socket */
4925 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
4930 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
4934 /* Connect on socket */
4935 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
4939 /* Listen on socket */
4940 io->rc = drv->SocketListen (io->sock, 1);
4944 /* Send on socket */
4945 io->rc = drv->SocketSend (io->sock, io->buf, io->len);
4950 io->rc = drv->SocketClose (io->sock);
4953 /* Done, send signal to owner thread */
4954 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4956 osThreadFlagsSet (io->owner, flags);
4957 osThreadFlagsClear (F_ALL);
4962 \brief Test case: WIFI_SocketSend
4963 \ingroup wifi_sock_api
4965 The test case \b WIFI_SocketSend verifies the WiFi Driver \b SocketSend function:
4967 int32_t (*SocketSend) (int32_t socket, const void *buf, uint32_t len);
4970 Stream socket test 1:
4971 - Create stream socket
4972 - Connect to server, blocking mode
4973 - Check function parameters
4974 - Send data, blocking mode
4976 - Send again, closed socket
4978 Stream socket test 2:
4979 - Create stream socket
4980 - Connect to server, blocking mode
4981 - Send ESC data, server disconnects
4982 - Send again, disconnected socket
4985 Stream socket test 3:
4986 - Create stream socket
4987 - Send data, created socket
4989 - Send data, bound socket
4991 - Send data, listening socket
4993 - Send again, closed socket
4995 void WIFI_SocketSend (void) {
4996 osThreadId_t worker;
5001 if (socket_funcs_exist == 0U) {
5002 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5006 if (station_init (1) == 0) {
5007 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5011 /* Create worker thread */
5012 worker = osThreadNew ((osThreadFunc_t)Th_Send, &io, NULL);
5013 if (worker == NULL) {
5014 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5020 /* Create stream socket */
5021 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5023 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5027 /* Connect to stream server */
5029 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5030 TH_ASSERT (io.rc == 0);
5032 /* Check parameter (socket = -1) */
5033 ARG_SEND (-1, test_msg, sizeof(test_msg));
5034 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5035 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5037 /* Check parameter (socket = INT32_MIN) */
5038 ARG_SEND (INT32_MIN, test_msg, sizeof(test_msg));
5039 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5040 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5042 /* Check parameter (socket = INT32_MAX) */
5043 ARG_SEND (INT32_MAX, test_msg, sizeof(test_msg));
5044 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5045 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5047 /* Check parameter (buf = NULL) */
5048 ARG_SEND (sock, NULL, sizeof(test_msg));
5049 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5050 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5052 /* Check parameter (len = 0) */
5053 ARG_SEND (sock, test_msg, 0);
5054 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5055 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5057 /* Send some data */
5058 ARG_SEND (sock, test_msg, sizeof(test_msg));
5059 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
5060 TH_ASSERT (io.rc == sizeof(test_msg));
5064 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5065 TH_ASSERT (io.rc == 0);
5067 /* Send again, closed socket */
5068 ARG_SEND (sock, test_msg, sizeof(test_msg));
5069 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5070 /* Should return error (socket not created) */
5071 /* Strict: ESOCK, valid non-strict: ERROR */
5072 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "send on closed socket", io.rc, ARM_SOCKET_ESOCK);
5077 /* Create stream socket */
5078 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5080 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5084 /* Connect to stream server */
5086 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5087 TH_ASSERT (io.rc == 0);
5089 /* Send ESC command, server disconnects */
5090 ARG_SEND (sock, (uint8_t *)"\x1B", 1);
5091 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
5092 TH_ASSERT (io.rc == 1);
5094 /* Wait for the server to disconnect */
5097 /* Send again, disconnected socket */
5098 ARG_SEND (sock, test_msg, sizeof(test_msg));
5099 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5100 /* Should return error (connection reset by the peer) */
5101 /* Strict: ECONNRESET, valid non-strict: ERROR */
5102 TH_ASSERT3 ((io.rc == ARM_SOCKET_ECONNRESET), (io.rc == ARM_SOCKET_ERROR), "send on disconnected socket", io.rc, ARM_SOCKET_ECONNRESET);
5106 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5107 TH_ASSERT (io.rc == 0);
5112 /* Create stream socket */
5113 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5115 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5119 /* Send data, created socket */
5120 ARG_SEND (sock, test_msg, sizeof(test_msg));
5121 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5122 /* Should return error (socket not connected) */
5123 /* Strict: ENOTCONN, valid non-strict: ERROR */
5124 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on created socket", io.rc, ARM_SOCKET_ENOTCONN);
5128 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5129 TH_ASSERT (io.rc == 0);
5131 /* Send data, bound socket */
5132 ARG_SEND (sock, test_msg, sizeof(test_msg));
5133 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5134 /* Should return error (socket not connected) */
5135 /* Strict: ENOTCONN, valid non-strict: ERROR */
5136 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
5138 /* Start listening */
5140 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
5141 TH_ASSERT (io.rc == 0);
5143 /* Send data, listening socket */
5144 ARG_SEND (sock, test_msg, sizeof(test_msg));
5145 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5146 /* Should return error (socket not connected) */
5147 /* Strict: ENOTCONN, valid non-strict: ERROR */
5148 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
5152 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5153 TH_ASSERT (io.rc == 0);
5155 /* Send again, closed socket */
5156 ARG_SEND (sock, test_msg, sizeof(test_msg));
5157 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5158 /* Should return error (socket not created) */
5159 /* Strict: ESOCK, valid non-strict: ERROR */
5160 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "send on closed socket", io.rc, ARM_SOCKET_ESOCK);
5169 /* Terminate worker thread */
5170 osThreadTerminate (worker);
5173 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5175 /* SendTo IO parameters */
5190 /* Assign arguments */
5191 #define ARG_SENDTO(_sock,_buf,_len,_ip,_ip_len,_port) do { \
5196 io.ip_len = _ip_len; \
5200 /* SendTo worker thread */
5201 __NO_RETURN static void Th_SendTo (IO_SENDTO *io) {
5205 /* Wait for the signal to select and execute the function */
5206 flags = osThreadFlagsWait (F_CREATE_UDP | F_SENDTO | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
5210 /* Create datagram socket */
5211 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5215 /* SendTo on socket */
5216 io->rc = drv->SocketSendTo (io->sock, io->buf, io->len, io->ip, io->ip_len, io->port);
5220 /* Recv on socket */
5221 memset((void *)buffer, 0xCC, sizeof(buffer));
5222 io->rc = drv->SocketRecv (io->sock, buffer, sizeof(buffer));
5227 io->rc = drv->SocketClose (io->sock);
5230 /* Done, send signal to owner thread */
5231 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5233 osThreadFlagsSet (io->owner, flags);
5234 osThreadFlagsClear (F_ALL);
5239 \brief Test case: WIFI_SocketSendTo
5240 \ingroup wifi_sock_api
5242 The test case \b WIFI_SocketSend verifies the WiFi Driver \b SocketSendTo function:
5244 int32_t (*SocketSendTo) (int32_t socket, const void *buf, uint32_t len, const uint8_t *ip, uint32_t ip_len, uint16_t port);
5247 Datagram socket test:
5248 - Create datagram socket
5249 - Check function parameters
5250 - Send data, blocking mode
5251 - Receive echo data, verify if the same
5253 - Send again, closed socket
5255 void WIFI_SocketSendTo (void) {
5256 osThreadId_t worker;
5261 if (socket_funcs_exist == 0U) {
5262 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5266 if (station_init (1) == 0) {
5267 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5271 /* Create worker thread */
5272 worker = osThreadNew ((osThreadFunc_t)Th_SendTo, &io, NULL);
5273 if (worker == NULL) {
5274 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5280 /* Create datagram socket */
5281 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5283 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5287 /* Check parameter (socket = -1) */
5288 ARG_SENDTO (-1, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5289 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5290 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5292 /* Check parameter (socket = INT32_MIN) */
5293 ARG_SENDTO (INT32_MIN, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5294 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5295 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5297 /* Check parameter (socket = INT32_MAX) */
5298 ARG_SENDTO (INT32_MAX, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5299 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5300 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5302 /* Check parameter (buf == NULL) */
5303 ARG_SENDTO (sock, NULL, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5304 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5305 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5307 /* Check parameter (len = 0) */
5308 ARG_SENDTO (sock, test_msg, 0, ip_socket_server, 4, ECHO_PORT);
5309 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5310 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5312 /* Send some data */
5313 ARG_SENDTO (sock, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5314 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT_LONG);
5315 TH_ASSERT (io.rc == sizeof(test_msg));
5317 /* Receive the echoed data */
5319 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
5320 /* Should receive the same data (ECHO protocol) */
5321 TH_ASSERT ((io.rc == sizeof(test_msg)) && (memcmp ((const void *)test_msg, (const void *)buffer, sizeof(test_msg)) == 0));
5325 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5326 TH_ASSERT (io.rc == 0);
5328 /* Send again, closed socket */
5329 ARG_SENDTO (sock, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5330 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5331 /* Should return error (socket not created) */
5332 /* Strict: ESOCK, valid non-strict: ERROR */
5333 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "sendto on closed socket", io.rc, ARM_SOCKET_ESOCK);
5342 /* Terminate worker thread */
5343 osThreadTerminate (worker);
5346 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5348 /* GetSockName IO parameters */
5360 /* Assign arguments */
5361 #define ARG_GETSOCKNAME(_sock,_ip,_ip_len,_port) do { \
5364 io.ip_len = _ip_len; \
5368 /* GetSockName worker thread */
5369 __NO_RETURN static void Th_GetSockName (IO_GETSOCKNAME *io) {
5373 /* Wait for the signal to select and execute the function */
5374 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
5375 F_CONNECT | F_GETSOCKNAME | F_CLOSE, osFlagsWaitAny, osWaitForever);
5379 /* Create stream socket */
5380 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
5384 /* Create datagram socket */
5385 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5390 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
5394 /* Connect on socket */
5395 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
5399 /* Get socket name */
5400 io->rc = drv->SocketGetSockName (io->sock, io->ip, io->ip_len, io->port);
5405 io->rc = drv->SocketClose (io->sock);
5408 /* Done, send signal to owner thread */
5409 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5411 osThreadFlagsSet (io->owner, flags);
5412 osThreadFlagsClear (F_ALL);
5417 \brief Test case: WIFI_SocketGetSockName
5418 \ingroup wifi_sock_api
5420 The test case \b WIFI_SocketGetSockName verifies the WiFi Driver \b SocketGetSockName function:
5422 int32_t (*SocketGetSockName) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
5425 Stream socket test 1:
5426 - Create stream socket
5427 - Connect to server, blocking mode
5428 - Check function parameters
5431 - Get socket name again, closed socket
5433 Stream socket test 1:
5434 - Create stream socket
5435 - Get socket name, not bound
5437 - Get socket name, bound
5440 Datagram socket test 1:
5441 - Create datagram socket
5442 - Connect to server, enable packet filtering
5443 - Check function parameters
5446 - Get socket name again, closed socket
5448 Datagram socket test 1:
5449 - Create datagram socket
5450 - Get socket name, not bound
5452 - Get socket name, bound
5455 void WIFI_SocketGetSockName (void) {
5456 uint8_t local_ip[4];
5457 uint16_t local_port;
5459 osThreadId_t worker;
5464 if (socket_funcs_exist == 0U) {
5465 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5469 if (station_init (1) == 0) {
5470 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5474 /* Create worker thread */
5475 worker = osThreadNew ((osThreadFunc_t)Th_GetSockName, &io, NULL);
5476 if (worker == NULL) {
5477 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5483 /* Create stream socket */
5484 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5486 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5488 /* Test client mode */
5491 /* Connect to stream server */
5493 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5494 TH_ASSERT (io.rc == 0);
5496 /* Check parameter (socket = -1) */
5497 ip_len = sizeof(local_ip);
5498 ARG_GETSOCKNAME (-1, local_ip, &ip_len, &local_port);
5499 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5500 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5502 /* Check parameter (socket = INT32_MIN) */
5503 ARG_GETSOCKNAME (INT32_MIN, local_ip, &ip_len, &local_port);
5504 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5505 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5507 /* Check parameter (socket = INT32_MAX) */
5508 ARG_GETSOCKNAME (INT32_MAX, local_ip, &ip_len, &local_port);
5509 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5510 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5512 /* Check parameter (port = NULL) */
5513 ip_len = sizeof(local_ip);
5514 ARG_GETSOCKNAME (sock, local_ip, &ip_len, NULL);
5515 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5516 /* Request IP address only should be accepted */
5517 TH_ASSERT (io.rc == 0);
5519 /* Check parameter (ip = NULL, ip_len = NULL) */
5520 ARG_GETSOCKNAME (sock, NULL, NULL, &local_port);
5521 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5522 /* Request port only should be accepted */
5523 TH_ASSERT (io.rc == 0);
5525 /* Initialize buffers for return values */
5527 ip_len = sizeof(local_ip) + 1;
5528 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5530 /* Retrieve socket name */
5531 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5532 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5533 TH_ASSERT (io.rc == 0);
5534 /* IP address should be different from broadcast */
5535 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_bcast, 4) != 0) && (ip_len == 4));
5536 /* Port number should be non-zero */
5537 TH_ASSERT (local_port != 0);
5541 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5542 TH_ASSERT (io.rc == 0);
5544 /* Retrieve socket name again */
5545 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5546 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5547 /* Should return error (socket not created) */
5548 /* Strict: ESOCK, valid non-strict: ERROR */
5549 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockname on closed socket", io.rc, ARM_SOCKET_ESOCK);
5554 /* Create stream socket */
5555 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5557 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5559 /* Test server mode */
5562 /* Retrieve socket name, not bound */
5563 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5564 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5565 /* Should return error (socket not bound) */
5566 /* Strict: EINVAL, valid non-strict: ERROR */
5567 TH_ASSERT3 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "getsockname on unbound socket", io.rc, ARM_SOCKET_EINVAL);
5569 /* Initialize buffers for return values */
5571 ip_len = sizeof(local_ip) + 1;
5572 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5576 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5577 TH_ASSERT (io.rc == 0);
5579 /* Retrieve socket name, bound */
5580 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5581 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5582 TH_ASSERT (io.rc == 0);
5583 /* IP address should be unspecified */
5584 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_unspec, 4) == 0) && (ip_len == 4));
5585 /* Port number should be listening port */
5586 TH_ASSERT (local_port == DISCARD_PORT);
5590 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5591 TH_ASSERT (io.rc == 0);
5596 /* Create datagram socket */
5597 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5599 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5601 /* Test client mode */
5604 /* Connect to datagram server */
5606 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
5607 TH_ASSERT (io.rc == 0);
5609 /* Check parameter (socket = -1) */
5610 ARG_GETSOCKNAME (-1, local_ip, &ip_len, &local_port);
5611 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5612 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5614 /* Check parameter (socket = INT32_MIN) */
5615 ARG_GETSOCKNAME (INT32_MIN, local_ip, &ip_len, &local_port);
5616 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5617 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5619 /* Check parameter (socket = INT32_MAX) */
5620 ARG_GETSOCKNAME (INT32_MAX, local_ip, &ip_len, &local_port);
5621 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5622 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5624 /* Check parameter (port = NULL) */
5625 ip_len = sizeof(local_ip);
5626 ARG_GETSOCKNAME (sock, local_ip, &ip_len, NULL);
5627 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5628 /* Request IP address only should be accepted */
5629 TH_ASSERT (io.rc == 0);
5631 /* Check parameter (ip = NULL, ip_len = NULL) */
5632 ARG_GETSOCKNAME (sock, NULL, NULL, &local_port);
5633 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5634 /* Request port only should be accepted */
5635 TH_ASSERT (io.rc == 0);
5637 /* Initialize buffers for return values */
5639 ip_len = sizeof(local_ip) + 1;
5640 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5642 /* Retrieve socket name */
5643 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5644 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5645 TH_ASSERT (io.rc == 0);
5646 /* IP address should be different from broadcast */
5647 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_bcast, 4) != 0) && (ip_len == 4));
5648 /* Port number should be non-zero */
5649 TH_ASSERT (local_port != 0);
5653 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5654 TH_ASSERT (io.rc == 0);
5656 /* Retrieve socket name again */
5657 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5658 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5659 /* Should return error (socket not created) */
5660 /* Strict: ESOCK, valid non-strict: ERROR */
5661 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockname on closed socket", io.rc, ARM_SOCKET_ESOCK);
5666 /* Create datagram socket */
5667 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5669 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5671 /* Test server mode */
5674 /* Retrieve socket name, not bound */
5675 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5676 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5677 /* Should return error (socket not bound) */
5678 /* Strict: EINVAL, valid non-strict: ERROR */
5679 TH_ASSERT3 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "getsockname on unbound socket", io.rc, ARM_SOCKET_EINVAL);
5681 /* Initialize buffers for return values */
5683 ip_len = sizeof(local_ip) + 1;
5684 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5688 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5689 TH_ASSERT (io.rc == 0);
5691 /* Retrieve socket name, bound */
5692 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5693 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5694 TH_ASSERT (io.rc == 0);
5695 /* IP address should be unspecified */
5696 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_unspec, 4) == 0) && (ip_len == 4));
5697 /* Port number should be listening port */
5698 TH_ASSERT (local_port == DISCARD_PORT);
5702 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5703 TH_ASSERT (io.rc == 0);
5712 /* Terminate worker thread */
5713 osThreadTerminate (worker);
5716 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5718 /* GetPeerName IO parameters */
5730 /* Assign arguments */
5731 #define ARG_GETPEERNAME(_sock,_ip,_ip_len,_port) do { \
5734 io.ip_len = _ip_len; \
5738 /* GetPeerName worker thread */
5739 __NO_RETURN static void Th_GetPeerName (IO_GETPEERNAME *io) {
5743 /* Wait for the signal to select and execute the function */
5744 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_CONNECT |
5745 F_LISTEN | F_GETPEERNAME | F_CLOSE, osFlagsWaitAny, osWaitForever);
5749 /* Create stream socket */
5750 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
5754 /* Create datagram socket */
5755 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5760 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
5764 /* Connect on socket */
5765 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
5769 /* Listen on socket */
5770 io->rc = drv->SocketListen (io->sock, 1);
5775 io->rc = drv->SocketGetPeerName (io->sock, io->ip, io->ip_len, io->port);
5780 io->rc = drv->SocketClose (io->sock);
5783 /* Done, send signal to owner thread */
5784 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5786 osThreadFlagsSet (io->owner, flags);
5787 osThreadFlagsClear (F_ALL);
5792 \brief Test case: WIFI_SocketGetPeerName
5793 \ingroup wifi_sock_api
5795 The test case \b WIFI_SocketGetPeerName verifies the WiFi Driver \b SocketGetPeerName function:
5797 int32_t (*SocketGetPeerName) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
5800 Stream socket test 1:
5801 - Create stream socket
5802 - Connect to server, blocking mode
5803 - Check function parameters
5806 - Get peer name, closed socket
5808 Stream socket test 2:
5809 - Create stream socket
5810 - Get peer name, created socket
5812 - Get peer name, bound socket
5814 - Get peer name, listening socket
5817 Datagram socket test:
5818 - Create datagram socket
5819 - Connect to server, enable packet filtering
5820 - Check function parameters
5823 - Get peer name, closed socket
5825 void WIFI_SocketGetPeerName (void) {
5829 osThreadId_t worker;
5834 if (socket_funcs_exist == 0U) {
5835 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5839 if (station_init (1) == 0) {
5840 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5844 /* Create worker thread */
5845 worker = osThreadNew ((osThreadFunc_t)Th_GetPeerName, &io, NULL);
5846 if (worker == NULL) {
5847 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5853 /* Create stream socket */
5854 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5856 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5860 /* Connect to stream server */
5862 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5863 TH_ASSERT (io.rc == 0);
5865 /* Check parameter (socket = -1) */
5866 ip_len = sizeof(peer_ip);
5867 ARG_GETPEERNAME (-1, peer_ip, &ip_len, &peer_port);
5868 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5869 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5871 /* Check parameter (socket = INT32_MIN) */
5872 ARG_GETPEERNAME (INT32_MIN, peer_ip, &ip_len, &peer_port);
5873 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5874 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5876 /* Check parameter (socket = INT32_MAX) */
5877 ARG_GETPEERNAME (INT32_MAX, peer_ip, &ip_len, &peer_port);
5878 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5879 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5881 /* Check parameter (port = NULL) */
5882 ip_len = sizeof(peer_ip);
5883 ARG_GETPEERNAME (sock, peer_ip, &ip_len, NULL);
5884 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5885 /* Request IP address only should be accepted */
5886 TH_ASSERT (io.rc == 0);
5888 /* Check parameter (ip = NULL, ip_len = NULL) */
5889 ARG_GETPEERNAME (sock, NULL, NULL, &peer_port);
5890 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5891 /* Request port only should be accepted */
5892 TH_ASSERT (io.rc == 0);
5894 /* Initialize buffers for return values */
5896 ip_len = sizeof(peer_ip) + 1;
5897 memcpy (peer_ip, ip_bcast, sizeof(peer_ip));
5899 /* Retrieve peer name */
5900 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
5901 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5902 TH_ASSERT (io.rc == 0);
5903 /* IP address should be the address of the server */
5904 TH_ASSERT ((memcmp ((const void *)peer_ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
5905 /* Port number should be the DISCARD port */
5906 TH_ASSERT (peer_port == DISCARD_PORT);
5908 /* Close stream socket */
5910 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5911 TH_ASSERT (io.rc == 0);
5913 /* Retrieve peer name again */
5914 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
5915 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5916 /* Should return error (socket not created) */
5917 /* Strict: ESOCK, valid non-strict: ERROR */
5918 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getpeername on closed socket", io.rc, ARM_SOCKET_ESOCK);
5923 /* Create stream socket */
5924 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5926 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5930 /* Get peer name, created socket */
5931 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
5932 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5933 /* Should return error (socket not connected) */
5934 /* Strict: ENOTCONN, valid non-strict: ERROR */
5935 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on created socket", io.rc, ARM_SOCKET_ENOTCONN);
5939 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5940 TH_ASSERT (io.rc == 0);
5942 /* Get peer name, bound socket */
5943 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
5944 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5945 /* Should return error (socket not connected) */
5946 /* Strict: ENOTCONN, valid non-strict: ERROR */
5947 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
5949 /* Start listening */
5951 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
5952 TH_ASSERT (io.rc == 0);
5954 /* Get peer name, listening socket */
5955 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
5956 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5957 /* Should return error (socket not connected) */
5958 /* Strict: ENOTCONN, valid non-strict: ERROR */
5959 TH_ASSERT3 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
5963 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5964 TH_ASSERT (io.rc == 0);
5969 /* Create datagram socket */
5970 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5972 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5976 /* Connect to datagram server */
5978 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
5979 TH_ASSERT (io.rc == 0);
5981 /* Check parameter (socket = -1) */
5982 ip_len = sizeof(peer_ip);
5983 ARG_GETPEERNAME (-1, peer_ip, &ip_len, &peer_port);
5984 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5985 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5987 /* Check parameter (socket = INT32_MIN) */
5988 ARG_GETPEERNAME (INT32_MIN, peer_ip, &ip_len, &peer_port);
5989 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5990 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5992 /* Check parameter (socket = INT32_MAX) */
5993 ARG_GETPEERNAME (INT32_MAX, peer_ip, &ip_len, &peer_port);
5994 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5995 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5997 /* Check parameter (port = NULL) */
5998 ip_len = sizeof(peer_ip);
5999 ARG_GETPEERNAME (sock, peer_ip, &ip_len, NULL);
6000 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6001 /* Request IP address only should be accepted */
6002 TH_ASSERT (io.rc == 0);
6004 /* Check parameter (ip = NULL, ip_len = NULL) */
6005 ARG_GETPEERNAME (sock, NULL, NULL, &peer_port);
6006 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6007 /* Request port only should be accepted */
6008 TH_ASSERT (io.rc == 0);
6010 /* Initialize buffers for return values */
6012 ip_len = sizeof(peer_ip) + 1;
6013 memcpy (peer_ip, ip_bcast, sizeof(peer_ip));
6015 /* Retrieve peer name */
6016 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6017 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6018 TH_ASSERT (io.rc == 0);
6019 /* IP address should be the address of the server */
6020 TH_ASSERT ((memcmp ((const void *)peer_ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
6021 /* Port number should be the DISCARD port */
6022 TH_ASSERT (peer_port == DISCARD_PORT);
6026 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6027 TH_ASSERT (io.rc == 0);
6029 /* Retrieve peer name again */
6030 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6031 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6032 /* Should return error (socket not created) */
6033 /* Strict: ESOCK, valid non-strict: ERROR */
6034 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getpeername on closed socket", io.rc, ARM_SOCKET_ESOCK);
6043 /* Terminate worker thread */
6044 osThreadTerminate (worker);
6047 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6049 /* GetOpt IO parameters */
6061 /* Assign arguments */
6062 #define ARG_GETOPT(_sock,_opt_id,_opt_val,_opt_len) do { \
6064 io.opt_id = _opt_id; \
6065 io.opt_val = _opt_val; \
6066 io.opt_len = _opt_len; \
6069 /* GetOpt worker thread */
6070 __NO_RETURN static void Th_GetOpt (IO_GETOPT *io) {
6074 /* Wait for the signal to select and execute the function */
6075 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
6076 F_GETOPT | F_CLOSE, osFlagsWaitAny, osWaitForever);
6080 /* Create stream socket */
6081 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6085 /* Create datagram socket */
6086 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6090 /* Get socket options */
6091 io->rc = drv->SocketGetOpt (io->sock, io->opt_id, io->opt_val, io->opt_len);
6096 io->rc = drv->SocketClose (io->sock);
6099 /* Done, send signal to owner thread */
6100 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6102 osThreadFlagsSet (io->owner, flags);
6103 osThreadFlagsClear (F_ALL);
6108 \brief Test case: WIFI_SocketGetOpt
6109 \ingroup wifi_sock_api
6111 The test case \b WIFI_SocketGetOpt verifies the WiFi Driver \b SocketGetOpt function:
6113 int32_t (*SocketGetOpt) (int32_t socket, int32_t opt_id, void *opt_val, uint32_t *opt_len);
6117 - Create stream socket
6118 - Check function parameters
6119 - Get socket options
6121 - Get socket options again, closed socket
6123 Datagram socket test:
6124 - Create datagram socket
6129 void WIFI_SocketGetOpt (void) {
6132 osThreadId_t worker;
6137 if (socket_funcs_exist == 0U) {
6138 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6142 if (station_init (1) == 0) {
6143 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6147 /* Create worker thread */
6148 worker = osThreadNew ((osThreadFunc_t)Th_GetOpt, &io, NULL);
6149 if (worker == NULL) {
6150 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6156 /* Create stream socket */
6157 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6159 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6163 /* Check parameter (socket = -1) */
6164 opt_len = sizeof(opt_val);
6165 ARG_GETOPT (-1, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6166 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6167 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6169 /* Check parameter (socket = INT32_MIN) */
6170 ARG_GETOPT (INT32_MIN, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6171 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6172 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6174 /* Check parameter (socket = INT32_MAX) */
6175 ARG_GETOPT (INT32_MAX, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6176 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6177 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6179 /* Check parameter (opt_id = -1) */
6180 ARG_GETOPT (sock, -1, &opt_val, &opt_len);
6181 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6182 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6184 /* Check parameter (opt_id = INT32_MIN) */
6185 ARG_GETOPT (sock, INT32_MIN, &opt_val, &opt_len);
6186 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6187 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6189 /* Check parameter (opt_id = INT32_MAX) */
6190 ARG_GETOPT (sock, INT32_MAX, &opt_val, &opt_len);
6191 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6192 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6194 /* Check parameter (opt_val = NULL) */
6195 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, NULL, &opt_len);
6196 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6197 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6199 /* Check parameter (opt_len = NULL) */
6200 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, NULL);
6201 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6202 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6204 /* Check parameter (*opt_len = 0) */
6206 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6207 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6208 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6210 /* Check parameter (*opt_len = 5) */
6212 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6213 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6214 TH_ASSERT ((io.rc == 0) && (opt_len == 4));
6216 /* Get option FIONBIO (set only) */
6217 opt_len = sizeof(opt_val);
6218 ARG_GETOPT (sock, ARM_SOCKET_IO_FIONBIO, &opt_val, &opt_len);
6219 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6220 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6222 /* Get option RCVTIMEO */
6223 opt_len = sizeof(opt_val) + 1;
6224 opt_val = 0xE2A5A241;
6225 ARG_GETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, &opt_len);
6226 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6227 TH_ASSERT (io.rc == 0);
6228 /* Should be different from the initial value */
6229 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6231 /* Get option SNDTIMEO */
6232 opt_len = sizeof(opt_val) + 1;
6233 opt_val = 0xE2A5A241;
6234 ARG_GETOPT (sock, ARM_SOCKET_SO_SNDTIMEO, &opt_val, &opt_len);
6235 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6236 TH_ASSERT (io.rc == 0);
6237 /* Should be different from the initial value */
6238 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6240 /* Get option KEEPALIVE */
6241 opt_len = sizeof(opt_val) + 1;
6242 opt_val = 0xE2A5A241;
6243 ARG_GETOPT (sock, ARM_SOCKET_SO_KEEPALIVE, &opt_val, &opt_len);
6244 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6245 TH_ASSERT (io.rc == 0);
6246 /* Should be different from the initial value */
6247 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6249 /* Get option socket TYPE */
6250 opt_len = sizeof(opt_val) + 1;
6251 opt_val = UINT32_MAX;
6252 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6253 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6254 TH_ASSERT (io.rc == 0);
6255 /* Should be SOCK_STREAM type */
6256 TH_ASSERT ((opt_val == ARM_SOCKET_SOCK_STREAM) && (opt_len == 4));
6258 /* Close stream socket */
6260 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6261 TH_ASSERT (io.rc == 0);
6263 /* Get option socket TYPE again */
6264 opt_len = sizeof(opt_val);
6265 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6266 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6267 /* Should return error (socket not created) */
6268 /* Strict: ESOCK, valid non-strict: ERROR */
6269 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6274 /* Create datagram socket */
6275 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6277 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6281 /* Get option socket TYPE */
6282 opt_len = sizeof(opt_val) + 1;
6283 opt_val = UINT32_MAX;
6284 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6285 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6286 TH_ASSERT (io.rc == 0);
6287 /* Should be SOCK_DGRAM type */
6288 TH_ASSERT ((opt_val == ARM_SOCKET_SOCK_DGRAM) && (opt_len == 4));
6292 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6293 TH_ASSERT (io.rc == 0);
6295 /* Get option socket TYPE again */
6296 opt_len = sizeof(opt_val);
6297 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6298 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6299 /* Should return error (socket not created) */
6300 /* Strict: ESOCK, valid non-strict: ERROR */
6301 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6310 /* Terminate worker thread */
6311 osThreadTerminate (worker);
6314 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6316 /* SetOpt IO parameters */
6320 const void *opt_val;
6328 /* Assign arguments */
6329 #define ARG_SETOPT(_sock,_opt_id,_opt_val,_opt_len) do { \
6331 io.opt_id = _opt_id; \
6332 io.opt_val = _opt_val; \
6333 io.opt_len = _opt_len; \
6336 /* SetOpt worker thread */
6337 __NO_RETURN static void Th_SetOpt (IO_SETOPT *io) {
6341 /* Wait for the signal to select and execute the function */
6342 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_SETOPT | F_CLOSE, osFlagsWaitAny, osWaitForever);
6346 /* Create stream socket */
6347 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6351 /* Create datagram socket */
6352 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6356 /* Set socket options */
6357 io->rc = drv->SocketSetOpt (io->sock, io->opt_id, io->opt_val, io->opt_len);
6362 io->rc = drv->SocketClose (io->sock);
6365 /* Done, send signal to owner thread */
6366 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6368 osThreadFlagsSet (io->owner, flags);
6369 osThreadFlagsClear (F_ALL);
6374 \brief Test case: WIFI_SocketSetOpt
6375 \ingroup wifi_sock_api
6377 The test case \b WIFI_SocketSetOpt verifies the WiFi Driver \b SocketSetOpt function:
6379 int32_t (*SocketSetOpt) (int32_t socket, int32_t opt_id, const void *opt_val, uint32_t opt_len);
6383 - Create stream socket
6384 - Check function parameters
6385 - Set socket options
6387 - Set socket option again, closed socket
6389 Datagram socket test:
6390 - Create datagram socket
6391 - Set socket options
6393 - Set socket option again, closed socket
6396 void WIFI_SocketSetOpt (void) {
6398 osThreadId_t worker;
6403 if (socket_funcs_exist == 0U) {
6404 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6408 if (station_init (1) == 0) {
6409 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6413 /* Create worker thread */
6414 worker = osThreadNew ((osThreadFunc_t)Th_SetOpt, &io, NULL);
6415 if (worker == NULL) {
6416 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6422 /* Create stream socket */
6423 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6425 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6429 /* Check parameter (socket = -1) */
6431 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6432 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6433 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6435 /* Check parameter (socket = INT32_MIN) */
6436 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6437 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6438 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6440 /* Check parameter (socket = INT32_MAX) */
6441 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6442 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6443 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6445 /* Check parameter (opt_id = -1) */
6446 ARG_SETOPT (sock, -1, &opt_val, sizeof(opt_val));
6447 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6448 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6450 /* Check parameter (opt_id = INT32_MIN) */
6451 ARG_SETOPT (sock, INT32_MIN, &opt_val, sizeof(opt_val));
6452 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6453 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6455 /* Check parameter (opt_id = INT32_MAX) */
6456 ARG_SETOPT (sock, INT32_MAX, &opt_val, sizeof(opt_val));
6457 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6458 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6460 /* Check parameter (opt_val = NULL) */
6461 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, NULL, sizeof(opt_val));
6462 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6463 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6465 /* Check parameter (opt_len = 0) */
6466 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, 0);
6467 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6468 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6470 /* Check parameter (opt_len = 3) */
6471 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, 3);
6472 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6473 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6475 /* Set option FIONBIO (set only) */
6477 ARG_SETOPT (sock, ARM_SOCKET_IO_FIONBIO, &opt_val, sizeof(opt_val));
6478 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6479 TH_ASSERT (io.rc == 0);
6481 /* Set option RCVTIMEO */
6483 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6484 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6485 TH_ASSERT (io.rc == 0);
6487 /* Set option SNDTIMEO */
6489 ARG_SETOPT (sock, ARM_SOCKET_SO_SNDTIMEO, &opt_val, sizeof(opt_val));
6490 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6491 TH_ASSERT (io.rc == 0);
6493 /* Set option KEEPALIVE */
6495 ARG_SETOPT (sock, ARM_SOCKET_SO_KEEPALIVE, &opt_val, sizeof(opt_val));
6496 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6497 TH_ASSERT (io.rc == 0);
6499 /* Set option socket TYPE (get only) */
6500 opt_val = ARM_SOCKET_SOCK_STREAM;
6501 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, sizeof(opt_val));
6502 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6503 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6505 /* Close stream socket */
6507 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6508 TH_ASSERT (io.rc == 0);
6510 /* Set option RCVTIMEO again */
6512 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6513 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6514 /* Should return error (socket not created) */
6515 /* Strict: ESOCK, valid non-strict: ERROR */
6516 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "setsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6521 /* Create datagram socket */
6522 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6524 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6528 /* Set option RCVTIMEO */
6530 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6531 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6532 TH_ASSERT (io.rc == 0);
6536 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6537 TH_ASSERT (io.rc == 0);
6539 /* Set option RCVTIMEO again */
6540 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6541 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6542 /* Should return error (socket not created) */
6543 /* Strict: ESOCK, valid non-strict: ERROR */
6544 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "setsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6553 /* Terminate worker thread */
6554 osThreadTerminate (worker);
6557 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6559 /* Close IO parameters */
6568 /* Assign arguments */
6569 #define ARG_CLOSE(_sock) do { \
6573 /* Close worker thread */
6574 __NO_RETURN static void Th_Close (IO_CLOSE *io) {
6578 /* Wait for the signal to select and execute the function */
6579 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
6580 F_CONNECT | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
6584 /* Create stream socket */
6585 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6589 /* Create datagram socket */
6590 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6595 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
6599 /* Connect on socket */
6600 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
6604 /* Listen on socket */
6605 io->rc = drv->SocketListen (io->sock, 1);
6610 io->rc = drv->SocketClose (io->sock);
6613 /* Done, send signal to owner thread */
6614 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6616 osThreadFlagsSet (io->owner, flags);
6617 osThreadFlagsClear (F_ALL);
6622 \brief Test case: WIFI_SocketClose
6623 \ingroup wifi_sock_api
6625 The test case \b WIFI_SocketClose verifies the WiFi Driver \b SocketClose function:
6627 int32_t (*SocketClose) (int32_t socket);
6630 Stream socket test 1:
6631 - Create stream socket
6634 - Check function parameters
6636 - Close socket again
6638 Stream socket test 2:
6639 - Create stream socket
6643 - Close socket again
6645 Datagram socket test:
6646 - Create datagram socket
6648 - Check function parameters
6650 - Close socket again
6652 void WIFI_SocketClose (void) {
6653 osThreadId_t worker;
6658 if (socket_funcs_exist == 0U) {
6659 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6663 if (station_init (1) == 0) {
6664 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6668 /* Create worker thread */
6669 worker = osThreadNew ((osThreadFunc_t)Th_Close, &io, NULL);
6670 if (worker == NULL) {
6671 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6677 /* Create stream socket */
6678 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6680 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6684 /* Connect to stream server */
6686 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
6687 TH_ASSERT (io.rc == 0);
6689 /* Check parameter (socket = -1) */
6691 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6692 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6694 /* Check parameter (socket = INT32_MIN) */
6695 ARG_CLOSE (INT32_MIN);
6696 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6697 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6699 /* Check parameter (socket = INT32_MAX) */
6700 ARG_CLOSE (INT32_MAX);
6701 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6702 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6706 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6707 TH_ASSERT (io.rc == 0);
6709 /* Close again, closed socket */
6711 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6712 /* Should return error (socket not created) */
6713 /* Strict: ESOCK, valid non-strict: OK */
6714 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6719 /* Create stream socket */
6720 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6722 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6728 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
6729 TH_ASSERT (io.rc == 0);
6731 /* Start listening */
6733 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
6734 TH_ASSERT (io.rc == 0);
6738 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6739 TH_ASSERT (io.rc == 0);
6741 /* Close again, closed socket */
6743 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6744 /* Should return error (socket not created) */
6745 /* Strict: ESOCK, valid non-strict: OK */
6746 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6751 /* Create datagram socket */
6752 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6754 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6760 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
6761 TH_ASSERT (io.rc == 0);
6763 /* Check parameter (socket = -1) */
6765 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6766 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6768 /* Check parameter (socket = INT32_MIN) */
6769 ARG_CLOSE (INT32_MIN);
6770 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6771 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6773 /* Check parameter (socket = INT32_MAX) */
6774 ARG_CLOSE (INT32_MAX);
6775 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6776 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6780 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6781 TH_ASSERT (io.rc == 0);
6783 /* Close again, closed socket */
6785 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6786 /* Should return error (socket not created) */
6787 /* Strict: ESOCK, valid non-strict: OK */
6788 TH_ASSERT3 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6797 /* Terminate worker thread */
6798 osThreadTerminate (worker);
6801 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6803 /* GetHostByName IO parameters */
6815 /* Assign arguments */
6816 #define ARG_GETHOST(_name,_af,_ip,_ip_len) do { \
6820 io.ip_len = _ip_len; \
6823 /* GetHostByName worker thread */
6824 __NO_RETURN static void Th_GetHostByName (IO_GETHOST *io) {
6828 /* Wait for the signal to select and execute the function */
6829 flags = osThreadFlagsWait (F_GETHOSTBYNAME, osFlagsWaitAny, osWaitForever);
6832 case F_GETHOSTBYNAME:
6834 io->rc = drv->SocketGetHostByName (io->name, io->af, io->ip, io->ip_len);
6837 /* Done, send signal to owner thread */
6838 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6840 osThreadFlagsSet (io->owner, flags);
6841 osThreadFlagsClear (F_ALL);
6846 \brief Test case: WIFI_SocketGetHostByName
6847 \ingroup wifi_sock_api
6849 The test case \b WIFI_SocketGetHostByName the WiFi Driver \b SocketGetHostByName function:
6851 int32_t (*SocketGetHostByName) (const char *name, int32_t af, uint8_t *ip, uint32_t *ip_len);
6855 - Check function parameters
6857 - Resolve non-existent host
6860 This test requires internet connectivity to DNS server.
6862 void WIFI_SocketGetHostByName (void) {
6863 const char *host_name = "www.arm.com";
6866 osThreadId_t worker;
6870 if (socket_funcs_exist == 0U) {
6871 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6875 if (station_init (1) == 0) {
6876 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6880 /* Create worker thread */
6881 worker = osThreadNew ((osThreadFunc_t)Th_GetHostByName, &io, NULL);
6882 if (worker == NULL) {
6883 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6889 /* Check parameter (name = NULL) */
6890 ip_len = sizeof(host_ip);
6891 ARG_GETHOST(NULL, ARM_SOCKET_AF_INET, host_ip, &ip_len);
6892 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6893 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6895 /* Check parameter (af = -1) */
6896 ARG_GETHOST(host_name, -1, host_ip, &ip_len);
6897 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6898 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6900 /* Check parameter (af = INT32_MIN) */
6901 ARG_GETHOST(host_name, INT32_MIN, host_ip, &ip_len);
6902 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6903 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6905 /* Check parameter (af = INT32_MAX) */
6906 ARG_GETHOST(host_name, INT32_MAX, host_ip, &ip_len);
6907 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6908 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6910 /* Check parameter (ip = NULL) */
6911 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, NULL, &ip_len);
6912 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6913 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6915 /* Check parameter (ip_len = NULL) */
6916 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, NULL);
6917 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6918 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6920 /* Check parameter (*ip_len = 0) */
6922 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
6923 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6924 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6926 /* Check parameter (*ip_len = 3) */
6928 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
6929 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6930 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6932 /* Resolve valid host */
6933 ip_len = sizeof(host_ip) + 1;
6934 memset((void *)host_ip, 0, sizeof(host_ip));
6935 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
6936 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT_LONG);
6937 /* IP address should be valid */
6938 TH_ASSERT ((memcmp((const void *)host_ip, (const void *)ip_unspec, 4) != 0) && (ip_len == 4));
6940 /* Resolve non-existent host */
6941 ip_len = sizeof(host_ip);
6942 ARG_GETHOST("non.existent.host", ARM_SOCKET_AF_INET, host_ip, &ip_len);
6943 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT_LONG);
6944 /* Should return error (host not found) */
6945 /* Strict: EHOSTNOTFOUND, valid non-strict: ERROR */
6946 TH_ASSERT3 ((io.rc == ARM_SOCKET_EHOSTNOTFOUND), (io.rc == ARM_SOCKET_ERROR), "gethostbyname for non-existing host", io.rc, ARM_SOCKET_EHOSTNOTFOUND);
6952 /* Terminate worker thread */
6953 osThreadTerminate (worker);
6956 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6958 /* Ping IO parameters */
6968 /* Assign arguments */
6969 #define ARG_PING(_ip,_ip_len) do { \
6971 io.ip_len = _ip_len; \
6974 /* Ping worker thread */
6975 __NO_RETURN static void Th_Ping (IO_PING *io) {
6979 /* Wait for the signal to select and execute the function */
6980 flags = osThreadFlagsWait (F_PING, osFlagsWaitAny, osWaitForever);
6985 io->rc = drv->Ping (io->ip, io->ip_len);
6988 /* Done, send signal to owner thread */
6989 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6991 osThreadFlagsSet (io->owner, flags);
6992 osThreadFlagsClear (F_ALL);
6997 \brief Test case: WIFI_Ping
6998 \ingroup wifi_sock_api
7000 The test case \b WIFI_Ping verifies the WiFi Driver \b Ping function:
7002 int32_t (*Ping) (const uint8_t *ip, uint32_t ip_len);
7006 - Check function parameters
7009 void WIFI_Ping (void) {
7010 osThreadId_t worker;
7014 if (drv->Ping == NULL) {
7015 TEST_ASSERT_MESSAGE(0,"[FAILED] Ping function not available");
7019 if (station_init (1) == 0) {
7020 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7024 /* Create worker thread */
7025 worker = osThreadNew ((osThreadFunc_t)Th_Ping, &io, NULL);
7026 if (worker == NULL) {
7027 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7033 /* Check parameter (ip = NULL) */
7035 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7036 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7038 /* Check parameter (ip_len = 0) */
7039 ARG_PING (ip_socket_server, 0);
7040 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7041 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7043 /* Check parameter (ip_len = 5) */
7044 ARG_PING (ip_socket_server, 5);
7045 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7046 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7049 ARG_PING (ip_socket_server, 4);
7050 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7051 TH_ASSERT (io.rc == ARM_DRIVER_OK);
7057 /* Terminate worker thread */
7058 osThreadTerminate (worker);
7061 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
7064 \defgroup wifi_sock_op WiFi Socket Operation
7067 These tests verify operation of the WiFi socket functions.
7070 /* Worker thread is used for the following tests:
7071 - WIFI_Transfer_Fixed
7072 - WIFI_Transfer_Incremental
7073 - WIFI_Send_Fragmented
7074 - WIFI_Recv_Fragmented
7076 - WIFI_Concurrent_Socket
7079 /* Transfer IO parameters */
7090 /* Assign arguments */
7091 #define ARG_TRANSFER(_sock,_len,_size) do { \
7097 /* Transfer worker thread */
7098 __NO_RETURN static void Th_Transfer (IO_TRANSFER *io) {
7099 uint32_t flags,xid,i;
7103 /* Wait for the signal to select and execute the function */
7104 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
7105 F_CONNECT | F_CLOSE |
7106 F_XFER_FIXED | F_XFER_INCR |
7107 F_SEND_FRAG | F_RECV_FRAG, osFlagsWaitAny, osWaitForever);
7111 /* Create stream socket */
7112 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
7116 /* Create datagram socket */
7117 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
7121 /* Connect on socket */
7122 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, ECHO_PORT);
7127 io->rc = drv->SocketClose (io->sock);
7131 /* Transfer Fixed size blocks */
7132 memset ((void *)buffer, 0xCC, io->len);
7133 /* Send and receive in small blocks */
7134 for (i = 0; i < io->len; i += io->size) {
7135 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7137 rc = drv->SocketRecv (io->sock, &buffer[i], io->size);
7140 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7147 /* Transfer Increased size blocks */
7148 memset ((void *)buffer, 0xCC, io->len);
7149 /* Send and receive in enlarged block sizes */
7150 for (i = 0; i < io->len; i += io->size++) {
7151 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7153 rc = drv->SocketRecv (io->sock, &buffer[i], io->size);
7156 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7163 /* Send Fragmented blocks */
7164 memset ((void *)buffer, 0xCC, io->len);
7165 /* Send in small blocks */
7166 for (i = 0; i < io->len; i += io->size) {
7167 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7170 /* Receive in single block */
7172 /* Small delay that blocks are received */
7174 for (i = 0; i < io->len; i += (uint32_t)rc) {
7175 /* Returns any data available, up to requested amount */
7176 rc = drv->SocketRecv (io->sock, &buffer[i], io->len-i);
7179 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7187 /* Receive Fragmented blocks */
7188 memset ((void *)buffer, 0xCC, io->len);
7189 /* Send single block */
7190 rc = drv->SocketSend (io->sock, test_buf, io->len);
7193 /* Receive in small blocks */
7194 for (i = 0; i < io->len; i += io->size) {
7195 rc = drv->SocketRecv (io->sock, &buffer[i], io->size);
7197 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7204 /* Done, send signal to owner thread */
7205 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
7207 osThreadFlagsSet (io->owner, flags);
7208 osThreadFlagsClear (F_ALL);
7213 \brief Test case: WIFI_Transfer_Fixed
7214 \ingroup wifi_sock_op
7216 The test case \b WIFI_Transfer_Fixed verifies data transfer in fixed size blocks.
7219 - Create stream socket
7220 - Transfer 128 blocks of 16 bytes
7221 - Transfer 32 blocks of 64 bytes
7222 - Transfer 8 blocks of 256 bytes
7223 - Transfer 2 blocks of 1024 bytes
7224 - Transfer 1 block of 1440 bytes
7227 Datagram socket test:
7228 - Create datagram socket
7229 - Transfer 128 blocks of 16 bytes
7230 - Transfer 32 blocks of 64 bytes
7231 - Transfer 8 blocks of 256 bytes
7232 - Transfer 2 blocks of 1024 bytes
7233 - Transfer 1 block of 1460 bytes
7236 void WIFI_Transfer_Fixed (void) {
7237 osThreadId_t worker;
7242 if (station_init (1) == 0) {
7243 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7247 /* Create worker thread */
7248 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7249 if (worker == NULL) {
7250 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7256 /* Create stream socket */
7257 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7259 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7263 /* Connect to stream server */
7265 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7266 TH_ASSERT (io.rc == 0);
7268 /* Transfer 16-byte block(s) */
7269 ARG_TRANSFER (sock, 2048, 16);
7270 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7271 TH_ASSERT (io.rc == 2048);
7273 /* Transfer 64-byte block(s) */
7274 ARG_TRANSFER (sock, 2048, 64);
7275 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7276 TH_ASSERT (io.rc == 2048);
7278 /* Transfer 256-byte block(s) */
7279 ARG_TRANSFER (sock, 2048, 256);
7280 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7281 TH_ASSERT (io.rc == 2048);
7283 /* Transfer 1024-byte block(s) */
7284 ARG_TRANSFER (sock, 2048, 1024);
7285 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7286 TH_ASSERT (io.rc == 2048);
7288 /* Transfer 1440-byte block */
7289 ARG_TRANSFER (sock, 1440, 1440);
7290 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7291 TH_ASSERT (io.rc == 1440);
7293 /* Close stream socket */
7295 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7296 TH_ASSERT (io.rc == 0);
7301 /* Create datagram socket */
7302 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7304 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7308 /* Connect to datagram server */
7310 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7311 TH_ASSERT (io.rc == 0);
7313 /* Transfer 16-byte block(s) */
7314 ARG_TRANSFER (sock, 2048, 16);
7315 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7316 TH_ASSERT (io.rc == 2048);
7318 /* Transfer 64-byte block(s) */
7319 ARG_TRANSFER (sock, 2048, 64);
7320 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7321 TH_ASSERT (io.rc == 2048);
7323 /* Transfer 256-byte block(s) */
7324 ARG_TRANSFER (sock, 2048, 256);
7325 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7326 TH_ASSERT (io.rc == 2048);
7328 /* Transfer 1024-byte block(s) */
7329 ARG_TRANSFER (sock, 2048, 1024);
7330 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7331 TH_ASSERT (io.rc == 2048);
7333 /* Transfer 1460-byte block */
7334 ARG_TRANSFER (sock, 1460, 1460);
7335 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7336 TH_ASSERT (io.rc == 1460);
7338 /* Close datagram socket */
7340 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7341 TH_ASSERT (io.rc == 0);
7350 /* Terminate worker thread */
7351 osThreadTerminate (worker);
7355 \brief Test case: WIFI_Transfer_Incremental
7356 \ingroup wifi_sock_op
7358 The test case \b WIFI_Transfer_Incremental verifies data transfer in ascending size blocks.
7359 Each subsequent block that the socket sends is one byte larger than the previous block.
7362 - Create stream socket
7363 - Transfer 51 blocks of 1 - 50 bytes
7364 - Transfer 30 blocks of 51 - 80 bytes
7365 - Transfer 20 blocks of 81 - 100 bytes
7366 - Transfer 13 blocks of 120 - 132 bytes
7367 - Transfer 8 blocks of 252 - 259 bytes
7368 - Transfer 4 blocks of 510 - 513 bytes
7371 Datagram socket test:
7372 - Create datagram socket
7373 - Transfer 51 blocks of 1 - 50 bytes
7374 - Transfer 30 blocks of 51 - 80 bytes
7375 - Transfer 20 blocks of 81 - 100 bytes
7376 - Transfer 13 blocks of 120 - 132 bytes
7377 - Transfer 8 blocks of 252 - 259 bytes
7378 - Transfer 4 blocks of 510 - 513 bytes
7381 void WIFI_Transfer_Incremental (void) {
7382 osThreadId_t worker;
7387 if (station_init (1) == 0) {
7388 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7392 /* Create worker thread */
7393 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7394 if (worker == NULL) {
7395 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7401 /* Create stream socket */
7402 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7404 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7408 /* Connect to stream server */
7410 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7411 TH_ASSERT (io.rc == 0);
7413 /* Transfer 1 byte - 50 byte blocks */
7414 ARG_TRANSFER (sock, 1275, 1);
7415 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7416 TH_ASSERT (io.rc == 1275);
7418 /* Transfer 51 byte - 80-byte blocks */
7419 ARG_TRANSFER (sock, 1965, 51);
7420 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7421 TH_ASSERT (io.rc == 1965);
7423 /* Transfer 81 byte - 100 byte blocks */
7424 ARG_TRANSFER (sock, 1810, 81);
7425 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7426 TH_ASSERT (io.rc == 1810);
7428 /* Transfer 120 byte - 132 byte blocks */
7429 ARG_TRANSFER (sock, 1905, 120);
7430 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7431 TH_ASSERT (io.rc == 1905);
7433 /* Transfer 252 byte - 259 byte blocks */
7434 ARG_TRANSFER (sock, 2044, 252);
7435 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7436 TH_ASSERT (io.rc == 2044);
7438 /* Transfer 510 byte - 513 byte blocks */
7439 ARG_TRANSFER (sock, 2046, 510);
7440 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7441 TH_ASSERT (io.rc == 2046);
7443 /* Close stream socket */
7445 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7446 TH_ASSERT (io.rc == 0);
7451 /* Create datagram socket */
7452 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7454 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7458 /* Connect to datagram server */
7460 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7461 TH_ASSERT (io.rc == 0);
7463 /* Transfer 1 byte - 50 byte blocks */
7464 ARG_TRANSFER (sock, 1275, 1);
7465 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7466 TH_ASSERT (io.rc == 1275);
7468 /* Transfer 51 byte - 80-byte blocks */
7469 ARG_TRANSFER (sock, 1965, 51);
7470 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7471 TH_ASSERT (io.rc == 1965);
7473 /* Transfer 81 byte - 100 byte blocks */
7474 ARG_TRANSFER (sock, 1810, 81);
7475 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7476 TH_ASSERT (io.rc == 1810);
7478 /* Transfer 120 byte - 132 byte blocks */
7479 ARG_TRANSFER (sock, 1905, 120);
7480 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7481 TH_ASSERT (io.rc == 1905);
7483 /* Transfer 252 byte - 259 byte blocks */
7484 ARG_TRANSFER (sock, 2044, 252);
7485 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7486 TH_ASSERT (io.rc == 2044);
7488 /* Transfer 510 byte - 513 byte blocks */
7489 ARG_TRANSFER (sock, 2046, 510);
7490 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7491 TH_ASSERT (io.rc == 2046);
7493 /* Close datagram socket */
7495 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7496 TH_ASSERT (io.rc == 0);
7505 /* Terminate worker thread */
7506 osThreadTerminate (worker);
7510 \brief Test case: WIFI_Send_Fragmented
7511 \ingroup wifi_sock_op
7513 The test case \b WIFI_Send_Fragmented verifies data transfer in chunks.
7516 - Create stream socket
7517 - Send 16 blocks of 16 bytes, receive 1 block of 256 bytes
7518 - Send 16 blocks of 64 bytes, receive 1 block of 1024 bytes
7519 - Send 5 blocks of 256 bytes, receive 1 block of 1280 bytes
7520 - Send 2 blocks of 720 bytes, receive 1 block of 1440 bytes
7523 void WIFI_Send_Fragmented (void) {
7524 osThreadId_t worker;
7529 if (station_init (1) == 0) {
7530 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7534 /* Create worker thread */
7535 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7536 if (worker == NULL) {
7537 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7543 /* Create stream socket */
7544 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7546 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7550 /* Connect to stream server */
7552 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7553 TH_ASSERT (io.rc == 0);
7555 /* Transfer 16-byte block(s) */
7556 ARG_TRANSFER (sock, 256, 16);
7557 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7558 TH_ASSERT (io.rc == 256);
7560 /* Transfer 64-byte block(s) */
7561 ARG_TRANSFER (sock, 1024, 64);
7562 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7563 TH_ASSERT (io.rc == 1024);
7565 /* Transfer 256-byte block(s) */
7566 ARG_TRANSFER (sock, 1280, 256);
7567 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7568 TH_ASSERT (io.rc == 1280);
7570 /* Transfer 1024-byte block(s) */
7571 ARG_TRANSFER (sock, 1440, 720);
7572 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7573 TH_ASSERT (io.rc == 1440);
7575 /* Close stream socket */
7577 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7578 TH_ASSERT (io.rc == 0);
7587 /* Terminate worker thread */
7588 osThreadTerminate (worker);
7592 \brief Test case: WIFI_Recv_Fragmented
7593 \ingroup wifi_sock_op
7595 The test case \b WIFI_Recv_Fragmented verifies data transfer in chunks.
7598 - Create stream socket
7599 - Send block of 256 bytes, receive 16 blocks of 16 bytes
7600 - Send block of 1024 bytes, receive 16 blocks of 64 bytes
7601 - Send block of 1280 bytes, receive 5 blocks of 256 bytes
7602 - Send block of 1440 bytes, receive 2 blocks of 720 bytes
7605 void WIFI_Recv_Fragmented (void) {
7606 osThreadId_t worker;
7611 if (station_init (1) == 0) {
7612 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7616 /* Create worker thread */
7617 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7618 if (worker == NULL) {
7619 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7625 /* Create stream socket */
7626 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7628 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7632 /* Connect to stream server */
7634 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7635 TH_ASSERT (io.rc == 0);
7637 /* Transfer 16-byte block(s) */
7638 ARG_TRANSFER (sock, 256, 16);
7639 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7640 TH_ASSERT (io.rc == 256);
7642 /* Transfer 64-byte block(s) */
7643 ARG_TRANSFER (sock, 1024, 64);
7644 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7645 TH_ASSERT (io.rc == 1024);
7647 /* Transfer 256-byte block(s) */
7648 ARG_TRANSFER (sock, 1280, 256);
7649 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7650 TH_ASSERT (io.rc == 1280);
7652 /* Transfer 720-byte block(s) */
7653 ARG_TRANSFER (sock, 1440, 720);
7654 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7655 TH_ASSERT (io.rc == 1440);
7657 /* Close stream socket */
7659 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7660 TH_ASSERT (io.rc == 0);
7669 /* Terminate worker thread */
7670 osThreadTerminate (worker);
7674 \brief Test case: WIFI_Test_Speed
7675 \ingroup wifi_sock_op
7677 The test case \b WIFI_Test_Speed tests data transfer speed.
7680 - Create stream socket
7681 - Transfer for 4 seconds, send and receive
7682 - Calculate transfer rate
7685 Datagram socket test:
7686 - Create datagram socket
7687 - Transfer for 4 seconds, send and receive
7688 - Calculate transfer rate
7691 void WIFI_Test_Speed (void) {
7692 uint32_t ticks,tout;
7693 osThreadId_t worker;
7694 int32_t rval,n_bytes;
7698 if (station_init (1) == 0) {
7699 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7703 /* Create worker thread */
7704 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7705 if (worker == NULL) {
7706 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7712 /* Create stream socket */
7713 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7715 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7719 /* Connect to stream server */
7721 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7722 TH_ASSERT (io.rc == 0);
7724 /* Transfer for 4 seconds */
7725 tout = SYSTICK_MICROSEC(4000000);
7726 ticks = GET_SYSTICK();
7729 ARG_TRANSFER (sock, 1440, 1440);
7730 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7731 if (io.rc > 0) n_bytes += io.rc;
7733 } while (GET_SYSTICK() - ticks < tout);
7734 /* Check transfer rate */
7735 if (n_bytes < 10000) {
7736 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
7737 TEST_MESSAGE(msg_buf);
7740 /* Close stream socket */
7742 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7743 TH_ASSERT (io.rc == 0);
7748 /* Create datagram socket */
7749 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7751 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7755 /* Connect to datagram server */
7757 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7758 TH_ASSERT (io.rc == 0);
7760 /* Transfer for 4 seconds */
7761 tout = SYSTICK_MICROSEC(4000000);
7762 ticks = GET_SYSTICK();
7765 ARG_TRANSFER (sock, 1460, 1460);
7766 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7767 if (io.rc > 0) n_bytes += io.rc;
7769 } while (GET_SYSTICK() - ticks < tout);
7770 /* Check transfer rate */
7771 if (n_bytes < 10000) {
7772 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
7773 TEST_MESSAGE(msg_buf);
7776 /* Close datagram socket */
7778 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7779 TH_ASSERT (io.rc == 0);
7788 /* Terminate worker thread */
7789 osThreadTerminate (worker);
7792 /* Sidekick IO parameters */
7798 /* Concurrent coworker thread */
7799 __NO_RETURN static void Th_Sidekick (IO_SIDEKICK *io2) {
7804 if (osThreadFlagsWait (SK_TERMINATE, osFlagsWaitAny, 100) == SK_TERMINATE) {
7807 memset ((void *)buff, 0xCC, sizeof(buff));
7808 rc = drv->SocketSend (io2->sock, test_msg, sizeof(test_msg));
7810 rc = drv->SocketRecv (io2->sock, buff, sizeof(test_msg));
7812 if (memcmp ((const void *)buff, (const void *)test_msg, sizeof(test_msg)) == 0) {
7813 io2->count += sizeof(test_msg);
7816 /* Owner deletes this thread */
7817 while (1) osDelay (osWaitForever);
7821 \brief Test case: WIFI_Concurrent_Socket
7822 \ingroup wifi_sock_op
7824 The test case \b WIFI_Concurrent_Socket verifies transfer of two concurrent sockets.
7827 - Create two stream sockets
7828 - Start transfer on 2nd socket with 100ms intervals
7829 - Transfer on main socket, full speed
7830 - Calculate transfer rate
7833 Datagram socket test:
7834 - Create datagram and stream sockets
7835 - Start transfer on stream socket with 100ms intervals
7836 - Transfer on main socket, full speed
7837 - Calculate transfer rate
7840 The test runs with a coherent thread, that performs an additional stream socket io.
7842 void WIFI_Concurrent_Socket (void) {
7843 uint32_t ticks,tout;
7844 osThreadId_t worker,spawn;
7845 int32_t rval,n_bytes;
7850 if (station_init (1) == 0) {
7851 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7855 /* Create worker thread */
7856 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7857 if (worker == NULL) {
7858 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7864 /* The test connects two stream sockets to the ECHO server and then */
7865 /* performs simultaneous data transfer. The main socket transmits at */
7866 /* full speed, and the other socket sends messages at 100ms intervals. */
7867 /* Both sockets record the number of bytes of data transferred, and */
7868 /* the transfer rate is calculated. */
7870 /* Create stream socket */
7871 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7873 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7877 /* Create 2nd stream socket */
7878 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7880 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7885 /* Connect sockets */
7887 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7888 TH_ASSERT (io.rc == 0);
7891 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7892 TH_ASSERT (io.rc == 0);
7894 /* Create spawned thread */
7895 spawn = osThreadNew ((osThreadFunc_t)Th_Sidekick, &io2, NULL);
7896 TEST_ASSERT(spawn != NULL);
7898 /* Transfer for 4 seconds */
7899 tout = SYSTICK_MICROSEC(4000000);
7900 ticks = GET_SYSTICK();
7903 ARG_TRANSFER (sock, 1440, 1440);
7904 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7905 if (io.rc > 0) n_bytes += io.rc;
7907 } while (GET_SYSTICK() - ticks < tout);
7908 /* Check transfer rate */
7909 if (n_bytes < 10000) {
7910 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
7911 TEST_MESSAGE(msg_buf);
7914 /* 2nd socket sends at 100ms intervals */
7915 TH_ASSERT (io2.count > 1000);
7917 /* Terminate spawned thread */
7918 osThreadFlagsSet (spawn, SK_TERMINATE);
7920 osThreadTerminate (spawn);
7922 /* Close stream sockets */
7924 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7925 TH_ASSERT (io.rc == 0);
7928 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7929 TH_ASSERT (io.rc == 0);
7934 /* The test connects datagram and stream sockets to the ECHO server */
7935 /* and then performs simultaneous data transfer. The datagram socket */
7936 /* transmits at full speed, and the stream socket sends messages at */
7937 /* 100ms intervals. The number of bytes of transferred data is recorded */
7938 /* and the rate of transmission is calculated. */
7940 /* Create datagram socket */
7941 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7943 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7947 /* Connect datagram socket */
7949 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7950 TH_ASSERT (io.rc == 0);
7952 /* Create stream socket */
7953 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7955 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7960 /* Connect stream socket */
7962 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7963 TH_ASSERT (io.rc == 0);
7965 /* Create spawned thread */
7966 spawn = osThreadNew ((osThreadFunc_t)Th_Sidekick, &io2, NULL);
7967 TEST_ASSERT(spawn != NULL);
7969 /* Transfer for 4 seconds */
7970 tout = SYSTICK_MICROSEC(4000000);
7971 ticks = GET_SYSTICK();
7974 ARG_TRANSFER (sock, 1460, 1460);
7975 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7976 if (io.rc > 0) n_bytes += io.rc;
7978 } while (GET_SYSTICK() - ticks < tout);
7979 /* Check transfer rate */
7980 if (n_bytes < 10000) {
7981 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
7982 TEST_MESSAGE(msg_buf);
7985 /* 2nd socket sends at 100ms intervals */
7986 TH_ASSERT (io2.count > 1000);
7988 /* Terminate spawned thread */
7989 osThreadFlagsSet (spawn, SK_TERMINATE);
7991 osThreadTerminate (spawn);
7995 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7996 TH_ASSERT (io.rc == 0);
7999 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8000 TH_ASSERT (io.rc == 0);
8009 /* Terminate worker thread */
8010 osThreadTerminate (worker);
8013 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
8015 /* TestAssistant commands */
8016 #define CMD_SEND_TCP "SEND TCP,1420,4000"
8017 #define CMD_RECV_TCP "RECV TCP,1420"
8018 #define TEST_BSIZE 1420
8020 /* StreamRate IO parameters */
8031 /* StreamRate coworker thread */
8032 __NO_RETURN static void Th_StreamRate (IO_STREAMRATE *io) {
8033 uint32_t flags,xid,ticks,tout;
8037 flags = osThreadFlagsWait (F_CREATE_TCP | F_DOWNLOAD | F_UPLOAD |
8038 F_SEND_CTRL | F_CLOSE, osFlagsWaitAny, osWaitForever);
8042 /* Create stream socket */
8043 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
8047 /* Downstream test, server is sender */
8048 for (n = 0; ; n += rc) {
8049 rc = drv->SocketRecv (io->sock, buffer, TEST_BSIZE);
8050 if (strncmp ((char *)buffer, "STAT", 4) == 0) {
8051 /* Server completed the test */
8052 sscanf ((char *)buffer+4, "%d", &val);
8053 if (val > n) io->loss = val - n;
8062 /* Upstream test, server is receiver */
8063 memset ((void *)buffer, 'a', TEST_BSIZE);
8064 tout = SYSTICK_MICROSEC(4000000);
8065 ticks = GET_SYSTICK();
8068 snprintf ((char *)buffer, sizeof(buffer), "Block[%d]", ++i);
8069 rc = drv->SocketSend (io->sock, buffer, TEST_BSIZE);
8070 if (rc > 0) n += rc;
8071 } while (GET_SYSTICK() - ticks < tout);
8072 rc = snprintf ((char *)buffer, sizeof(buffer), "STOP %d bytes.", n);
8073 drv->SocketSend (io->sock, buffer, rc);
8074 /* Receive report from server */
8075 drv->SocketRecv (io->sock, buffer, TEST_BSIZE);
8076 if (strncmp ((char *)buffer, "STAT", 4) == 0) {
8077 sscanf ((char *)buffer+4, "%d", &val);
8078 if (n > val) io->loss = n - val;
8085 io->rc = drv->SocketClose (io->sock);
8089 /* Send control command to TestAssistant */
8090 drv->SocketConnect (io->sock, ip_socket_server, 4, ASSISTANT_PORT);
8091 io->rc = drv->SocketSend (io->sock, io->cmd, strlen(io->cmd));
8094 /* Done, send signal to owner thread */
8095 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
8097 osThreadFlagsSet (io->owner, flags);
8098 osThreadFlagsClear (F_ALL);
8103 \brief Test case: WIFI_Downstream_Rate
8104 \ingroup wifi_sock_op
8106 The test case \b WIFI_Downstream_Rate tests the maximum rate at which the data
8109 void WIFI_Downstream_Rate (void) {
8110 osThreadId_t worker;
8114 if (station_init (1) == 0) {
8115 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
8119 /* Create worker thread */
8120 worker = osThreadNew ((osThreadFunc_t)Th_StreamRate, &io, NULL);
8121 if (worker == NULL) {
8122 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
8128 /* Create stream socket */
8129 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8131 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8135 /* Send command to start the download */
8136 io.cmd = CMD_SEND_TCP;
8137 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
8138 TH_ASSERT (io.rc > 0);
8140 /* Wait for transfer to complete */
8142 TH_EXECUTE (F_DOWNLOAD, 5000 + WIFI_SOCKET_TIMEOUT);
8143 TH_ASSERT (io.rc > 0);
8145 /* Check data loss */
8147 snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Data loss %d byte(s)", io.loss);
8148 TEST_ASSERT_MESSAGE(0,msg_buf);
8150 else if (rval != 0) {
8151 snprintf(msg_buf, sizeof(msg_buf), "[INFO] Speed %d KB/s", io.rc/4000);
8152 TEST_MESSAGE(msg_buf);
8155 /* Close stream socket */
8156 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8157 TH_ASSERT (io.rc == 0);
8166 /* Terminate worker thread */
8167 osThreadTerminate (worker);
8171 \brief Test case: WIFI_Upstream_Rate
8172 \ingroup wifi_sock_op
8174 The test case \b WIFI_Upstream_Rate tests the maximum rate at which the data
8177 void WIFI_Upstream_Rate (void) {
8178 osThreadId_t worker;
8182 if (station_init (1) == 0) {
8183 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
8187 /* Create worker thread */
8188 worker = osThreadNew ((osThreadFunc_t)Th_StreamRate, &io, NULL);
8189 if (worker == NULL) {
8190 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
8196 /* Create stream socket */
8197 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8199 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8203 /* Send command to start the upload */
8204 io.cmd = CMD_RECV_TCP;
8205 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
8206 TH_ASSERT (io.rc > 0);
8208 /* Wait for transfer to complete */
8210 TH_EXECUTE (F_UPLOAD, 5000 + WIFI_SOCKET_TIMEOUT);
8211 TH_ASSERT (io.rc > 0);
8213 /* Check data loss */
8215 snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Data loss %d byte(s)", io.loss);
8216 TEST_ASSERT_MESSAGE(0,msg_buf);
8218 else if (rval != 0) {
8219 snprintf(msg_buf, sizeof(msg_buf), "[INFO] Speed %d KB/s", io.rc/4000);
8220 TEST_MESSAGE(msg_buf);
8223 /* Close stream socket */
8224 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8225 TH_ASSERT (io.rc == 0);
8234 /* Terminate worker thread */
8235 osThreadTerminate (worker);