1 /*-----------------------------------------------------------------------------
3 * Purpose: WiFi driver test cases
4 *----------------------------------------------------------------------------
5 * Copyright(c) KEIL - An ARM Company
6 *----------------------------------------------------------------------------*/
10 - Bypass mode and functionality is not tested
11 - Set/GetOption API does not test IPv6 options
12 - SetOption operation is not tested, only API is tested
13 (BSSID, MAC, static IP operation testing would require dedicated hardware
14 with manual check of results on dedicated hardware)
15 - WPS operation is not tested (not Station nor AP)
16 (WPS functional testing would require dedicated hardware
17 with manual check of results WPS AP, WPS on Station could
18 be checked by comparing parameters with expected result (configured))
19 - WiFi sockets tested in blocking mode only
20 - WiFi sockets not tested for IPv6
24 #include "DV_Config.h"
25 #include "DV_Framework.h"
26 #include "Driver_WiFi.h"
32 #define ECHO_PORT 7 // Echo port number
33 #define DISCARD_PORT 9 // Discard port number
34 #define CHARGEN_PORT 19 // Chargen port number
35 #define ASSISTANT_PORT 5000 // Test Assistant port number
36 #define TCP_REJECTED_PORT 5001 // Rejected connection server TCP port
37 #define TCP_TIMEOUT_PORT 5002 // Non-responding server TCP port
39 /* Helper function identifiers */
40 #define F_CREATE 0x00000001
41 #define F_CREATE_TCP F_CREATE // Never used with CREATE
42 #define F_CREATE_UDP 0x00000002
43 #define F_CLOSE 0x00000004
44 #define F_BIND 0x00000008
45 #define F_LISTEN 0x00000010
46 #define F_ACCEPT 0x00000020
47 #define F_CONNECT 0x00000040
48 #define F_RECV 0x00000080
49 #define F_RECVFROM 0x00000100
50 #define F_SEND 0x00000200
51 #define F_SENDTO 0x00000400
52 #define F_GETSOCKNAME 0x00000800
53 #define F_GETPEERNAME 0x00001000
54 #define F_GETOPT 0x00002000
55 #define F_SETOPT 0x00004000
56 #define F_GETHOSTBYNAME 0x00008000
57 #define F_PING 0x00010000
58 #define F_SEND_CTRL F_PING // Never used with PING
59 #define F_XFER_FIXED 0x00020000
60 #define F_XFER_INCR 0x00040000
61 #define F_SEND_FRAG 0x00080000
62 #define F_UPLOAD F_SEND_FRAG // Never used with SEND_FRAG
63 #define F_RECV_FRAG 0x00100000
64 #define F_DOWNLOAD F_RECV_FRAG // Never used with RECV_FRAG
65 #define F_ALL 0x001FFFFF
67 #define SK_TERMINATE 0x00000001
69 /* Helper function return values */
74 /* Register Driver_WiFi# */
75 extern ARM_DRIVER_WIFI ARM_Driver_WiFi_(DRV_WIFI);
76 static ARM_DRIVER_WIFI* drv = &ARM_Driver_WiFi_(DRV_WIFI);
79 static uint8_t powered = 0U;
80 static uint8_t connected = 0U;
81 static uint8_t socket_funcs_exist = 0U;
82 static uint8_t volatile event;
84 static char msg_buf [128];
85 static char data_buf[128] __ALIGNED(4);
87 static ARM_WIFI_SignalEvent_t event_func;
88 static ARM_WIFI_CAPABILITIES cap;
89 static ARM_WIFI_CONFIG_t config;
90 static ARM_WIFI_NET_INFO_t net_info;
91 static ARM_WIFI_SCAN_INFO_t scan_info[WIFI_SCAN_MAX_NUM];
93 static const uint8_t ip_unspec[4] = { 0, 0, 0, 0 };
94 static const uint8_t ip_bcast[4] = { 255, 255, 255, 255 };
95 static uint8_t ip_socket_server[4];
97 /* String representation of Driver return codes */
98 static const char *str_ret[] = {
101 "ARM_DRIVER_ERROR_BUSY",
102 "ARM_DRIVER_ERROR_TIMEOUT",
103 "ARM_DRIVER_ERROR_UNSUPPORTED",
104 "ARM_DRIVER_ERROR_PARAMETER",
105 "ARM_DRIVER_ERROR_SPECIFIC"
108 /* String representation of Driver Socket fucntion's return codes */
109 static const char *str_sock_ret[] = {
114 "ARM_SOCKET_ENOTSUP",
117 "ARM_SOCKET_EINPROGRESS",
118 "ARM_SOCKET_ETIMEDOUT",
119 "ARM_SOCKET_EISCONN",
120 "ARM_SOCKET_ENOTCONN",
121 "ARM_SOCKET_ECONNREFUSED",
122 "ARM_SOCKET_ECONNRESET",
123 "ARM_SOCKET_ECONNABORTED",
124 "ARM_SOCKET_EALREADY",
125 "ARM_SOCKET_EADDRINUSE",
126 "ARM_SOCKET_EHOSTNOTFOUND"
129 /* Test message containing all letters of the alphabet */
130 static const uint8_t test_msg[44] = {
131 "The quick brown fox jumps over the lazy dog."
133 /* Dummy text with normal distribution of letters */
134 static const uint8_t test_buf[2050] = {
135 "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent "
136 "libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum "
137 "imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper "
138 "porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu "
139 "ad litora torquent per conubia nostra, per inceptos himenaeos."
141 "Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. "
142 "Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed "
143 "convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus "
144 "risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula "
145 "lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, "
148 "Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent "
149 "per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non "
150 "tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis turpis. "
151 "Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat "
152 "imperdiet. Vestibulum sapien. Proin quam. Etiam ultrices. Suspendisse in justo eu "
153 "magna luctus suscipit. Sed lectus. Integer euismod lacus luctus magna."
155 "Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna "
156 "augue eget diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices "
157 "posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non "
158 "quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis "
159 "laoreet. Donec lacus nunc, viverra nec, blandit vel, egestas et, augue. Vestibulum "
160 "tincidunt malesuada tellus. Ut ultrices ultrices enim. Curabitur sit amet mauris. "
161 "Morbi in dui quis est pulvinar ullamcorper. Nulla facilisi. Integer lacinia sollicitudin "
164 "Sed aliquet risus a tortor. Integer id quam. Morbi mi. Quisque nisl felis, venenatis "
165 "tristique, dignissim in, ultrices sit amet augue."
167 static uint8_t buffer[2048];
170 static void WIFI_DrvEvent (uint32_t evt, void *arg) {
177 /*-----------------------------------------------------------------------------
179 *----------------------------------------------------------------------------*/
181 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
183 \defgroup wifi_funcs WiFi Validation
184 \brief WiFi test cases
186 The WiFi validation test performs the following checks:
187 - API interface compliance.
188 - Some of Control and Management operation.
189 - Socket operation with various transfer sizes and communication parameters.
190 - Socket performance tests.
193 /* Helper function that initializes and powers on WiFi Module if not initialized and powered */
194 static int32_t init_and_power_on (void) {
197 if ((drv->Initialize (event_func) == ARM_DRIVER_OK) &&
198 (drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK)) {
208 /* Helper function that is called before tests start executing */
209 void WIFI_DV_Initialize (void) {
211 sscanf(WIFI_SOCKET_SERVER_IP, "%hhu.%hhu.%hhu.%hhu", &ip_socket_server[0], &ip_socket_server[1], &ip_socket_server[2], &ip_socket_server[3]);
213 cap = drv->GetCapabilities();
216 if ((cap.event_eth_rx_frame != 0U) ||
217 (cap.event_ap_connect != 0U) ||
218 (cap.event_ap_disconnect != 0U)) {
219 event_func = WIFI_DrvEvent;
222 if ((drv->SocketCreate != NULL) &&
223 (drv->SocketBind != NULL) &&
224 (drv->SocketListen != NULL) &&
225 (drv->SocketAccept != NULL) &&
226 (drv->SocketConnect != NULL) &&
227 (drv->SocketRecv != NULL) &&
228 (drv->SocketRecvFrom != NULL) &&
229 (drv->SocketSend != NULL) &&
230 (drv->SocketSendTo != NULL) &&
231 (drv->SocketGetSockName != NULL) &&
232 (drv->SocketGetPeerName != NULL) &&
233 (drv->SocketGetOpt != NULL) &&
234 (drv->SocketSetOpt != NULL) &&
235 (drv->SocketClose != NULL) &&
236 (drv->SocketGetHostByName != NULL)) {
237 socket_funcs_exist = 1U;
241 /* Helper function that is called after tests stop executing */
242 void WIFI_DV_Uninitialize (void) {
244 if (connected != 0U) {
245 if (drv->Deactivate (0U) == ARM_DRIVER_OK) {
250 if ((drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK) &&
251 (drv->Uninitialize () == ARM_DRIVER_OK)) {
257 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
258 /* WiFi Control tests */
259 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
261 \defgroup wifi_ctrl WiFi Control
264 These tests verify API and operation of the WiFi control functions.
269 \brief Test case: WIFI_GetVersion
271 The test case \b WIFI_GetVersion verifies the WiFi Driver \b GetVersion function.
273 ARM_DRIVER_VERSION (*GetVersion) (void);
276 void WIFI_GetVersion (void) {
277 ARM_DRIVER_VERSION ver;
279 ver = drv->GetVersion();
281 TEST_ASSERT((ver.api >= ARM_DRIVER_VERSION_MAJOR_MINOR(1,0)) && (ver.drv >= ARM_DRIVER_VERSION_MAJOR_MINOR(1,0)));
283 snprintf(msg_buf, sizeof(msg_buf), "[INFO] Driver API version %d.%d, Driver version %d.%d", (ver.api >> 8), (ver.api & 0xFFU), (ver.drv >> 8), (ver.drv & 0xFFU));
284 TEST_MESSAGE(msg_buf);
287 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
289 \brief Test case: WIFI_GetCapabilities
291 The test case \b WIFI_GetCapabilities verifies the WiFi Driver \b GetCapabilities function.
293 ARM_WIFI_CAPABILITIES (*GetCapabilities) (void);
296 void WIFI_GetCapabilities (void) {
298 cap = drv->GetCapabilities();
300 TEST_ASSERT_MESSAGE((cap.station_ap != 0U) || (cap.station != 0U) || (cap.ap != 0U), "At least 1 mode must be supported");
302 if (cap.wps_station != 0U) {
303 TEST_ASSERT_MESSAGE((cap.station_ap != 0U) || (cap.station != 0U), "If WPS for station is supported version of station mode of operation must be supported also");
306 if (cap.wps_ap != 0U) {
307 TEST_ASSERT_MESSAGE((cap.station_ap != 0U) || (cap.ap != 0U), "If WPS for AP is supported version of AP mode of operation must be supported also");
310 if ((cap.event_ap_connect != 0U) || (cap.event_ap_disconnect != 0U)) {
311 TEST_ASSERT_MESSAGE((cap.station_ap != 0U) || (cap.ap != 0U), "If events for AP are supported version of AP mode of operation must be supported also");
314 if (cap.event_eth_rx_frame != 0U) {
315 TEST_ASSERT_MESSAGE(cap.bypass_mode != 0U, "If event for Ethernet Rx frame is supported, bypass mode must be supported also");
319 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
321 \brief Test case: WIFI_Initialize/Uninitialize
323 The test case \b WIFI_Initialize_Uninitialize verifies the WiFi Driver \b Initialize and \b Uninitialize functions.
325 int32_t (*Initialize) (ARM_WIFI_SignalEvent_t cb_event);
329 int32_t (*Uninitialize) (void);
332 - Initialize without callback
334 - Initialize with callback (if driver supports it)
337 - Initialize without callback
342 void WIFI_Initialize_Uninitialize (void) {
345 if ((cap.event_eth_rx_frame != 0U) ||
346 (cap.event_ap_connect != 0U) ||
347 (cap.event_ap_disconnect != 0U)) {
348 event_func = WIFI_DrvEvent;
351 TEST_ASSERT(drv->Initialize (NULL) == ARM_DRIVER_OK);
352 TEST_ASSERT(drv->Uninitialize () == ARM_DRIVER_OK);
353 TEST_ASSERT(drv->Initialize (event_func) == ARM_DRIVER_OK);
354 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
355 TEST_ASSERT(drv->Uninitialize () == ARM_DRIVER_OK);
356 TEST_ASSERT(drv->Initialize (NULL) == ARM_DRIVER_OK);
357 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
358 ret = drv->PowerControl (ARM_POWER_OFF);
359 TEST_ASSERT((ret == ARM_DRIVER_OK) || (ret == ARM_DRIVER_ERROR_UNSUPPORTED));
360 TEST_ASSERT(drv->Uninitialize () == ARM_DRIVER_OK);
363 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
365 \brief Test case: WIFI_PowerControl
367 The test case \b WIFI_PowerControl verifies the WiFi Driver \b PowerControl function.
369 int32_t (*PowerControl) (ARM_POWER_STATE state);
373 - Initialize with callback (if driver supports it)
381 void WIFI_PowerControl (void) {
384 ret = drv->PowerControl (ARM_POWER_OFF);
385 TEST_ASSERT(ret == ARM_DRIVER_ERROR);
386 TEST_ASSERT(drv->Initialize (event_func) == ARM_DRIVER_OK);
387 ret = drv->PowerControl (ARM_POWER_OFF);
388 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
389 TEST_MESSAGE("[WARNING] PowerControl (ARM_POWER_OFF) not supported");
391 TEST_ASSERT(ret == ARM_DRIVER_OK);
393 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
394 TEST_ASSERT(drv->Scan (scan_info, WIFI_SCAN_MAX_NUM) >= 0);
397 ret = drv->PowerControl (ARM_POWER_LOW);
402 case ARM_DRIVER_ERROR_UNSUPPORTED:
403 TEST_MESSAGE("[WARNING] PowerControl (ARM_POWER_LOW) is not supported");
407 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] PowerControl (ARM_POWER_LOW) returned %s", str_ret[-ret]);
408 TEST_MESSAGE(msg_buf);
412 drv->PowerControl (ARM_POWER_OFF);
413 drv->Uninitialize ();
416 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
418 \brief Test case: WIFI_GetModuleInfo
420 The test case \b WIFI_GetModuleInfo verifies the WiFi Driver \b GetModuleInfo function.
422 int32_t (*GetModuleInfo) (char *module_info, uint32_t max_len);
425 void WIFI_GetModuleInfo (void) {
428 if (init_and_power_on () == 0) {
429 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
433 ret = drv->GetModuleInfo(NULL, sizeof(data_buf));
434 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
435 TEST_MESSAGE("[WARNING] GetModuleInfo (...) not supported");
437 TEST_ASSERT(ret == ARM_DRIVER_ERROR_PARAMETER);
439 ret = drv->GetModuleInfo(data_buf, 0U);
440 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
441 TEST_MESSAGE("[WARNING] GetModuleInfo (...) not supported");
443 TEST_ASSERT(ret == ARM_DRIVER_ERROR_PARAMETER);
446 memset((void *)data_buf, 0xCC, sizeof(data_buf));
447 ret = drv->GetModuleInfo(data_buf, sizeof(data_buf));
450 TEST_ASSERT(strlen(data_buf) != 0);
452 case ARM_DRIVER_ERROR_UNSUPPORTED:
453 TEST_MESSAGE("[WARNING] GetModuleInfo () is not supported");
456 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] GetModuleInfo () returned %s", str_ret[-ret]);
457 TEST_MESSAGE(msg_buf);
466 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
467 /* WiFi Management tests */
468 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
470 \defgroup wifi_mgmt WiFi Management
473 These tests verify API and operation of the WiFi management functions.
477 #if (WIFI_SETGETOPTION_BSSID_EN != 0)
478 static void WIFI_SetOption_GetOption_BSSID (void) {
479 #if ((WIFI_SETGETOPTION_BSSID_EN & 1) != 0)
480 uint8_t u8_arr[8] __ALIGNED(4);
481 uint8_t bssid[7] __ALIGNED(4);
483 #if ((WIFI_SETGETOPTION_BSSID_EN & 2) != 0)
486 uint8_t not_suported;
490 if (init_and_power_on () == 0) {
491 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
495 #if ((WIFI_SETGETOPTION_BSSID_EN & 1) != 0)
497 memset((void *)bssid, 0x11, 7);
498 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_ERROR_PARAMETER);
499 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_ERROR_PARAMETER);
501 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
502 TEST_ASSERT(sscanf((const char *)WIFI_BSSID_STA, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &bssid[0], &bssid[1], &bssid[2], &bssid[3], &bssid[4], &bssid[5]) == 6);
503 memset((void *) u8_arr, 0xCC, 8);
504 memcpy((void *)&u8_arr[1], (const void *)bssid, 6);
505 if (drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
506 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
507 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
508 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 0U) == ARM_DRIVER_ERROR_PARAMETER);
509 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 5U) == ARM_DRIVER_ERROR_PARAMETER);
510 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, &u8_arr[1], 6U) == ARM_DRIVER_OK);
511 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, &u8_arr[1], 7U) == ARM_DRIVER_OK);
512 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 7U) == ARM_DRIVER_OK);
513 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
516 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BSSID for Station is not supported");
519 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
520 TEST_ASSERT(sscanf((const char *)WIFI_BSSID_AP, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &bssid[0], &bssid[1], &bssid[2], &bssid[3], &bssid[4], &bssid[5]) == 6);
521 memset((void *) u8_arr, 0xCC, 8);
522 memcpy((void *)&u8_arr[1], (const void *)bssid, 6);
523 if (drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
524 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
525 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
526 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 0U) == ARM_DRIVER_ERROR_PARAMETER);
527 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 5U) == ARM_DRIVER_ERROR_PARAMETER);
528 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, &u8_arr[1], 6U) == ARM_DRIVER_OK);
529 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, &u8_arr[1], 7U) == ARM_DRIVER_OK);
530 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 7U) == ARM_DRIVER_OK);
531 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
534 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BSSID for Access Point is not supported");
539 #if ((WIFI_SETGETOPTION_BSSID_EN & 2) != 0)
542 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
543 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
545 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
547 if (drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
549 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
551 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
553 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
555 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
557 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
559 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
561 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
563 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
566 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BSSID for Station is not supported");
569 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
571 if (drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
573 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
575 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
577 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
579 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
581 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
583 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
585 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
587 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
590 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BSSID for Access Point is not supported");
595 #if ((WIFI_SETGETOPTION_BSSID_EN & 3) == 3)
596 // Check with Get that Set has written the correct values
597 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
598 TEST_ASSERT(sscanf((const char *)WIFI_BSSID_STA, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &bssid[0], &bssid[1], &bssid[2], &bssid[3], &bssid[4], &bssid[5]) == 6);
599 memset((void *)data_buf, 0xCC, sizeof(data_buf));
601 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
602 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
603 TEST_ASSERT(len == 6U);
604 TEST_ASSERT(memcmp((const void *)bssid, (const void *)data_buf, (size_t)len) == 0);
606 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
607 TEST_ASSERT(sscanf((const char *)WIFI_BSSID_AP, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &bssid[0], &bssid[1], &bssid[2], &bssid[3], &bssid[4], &bssid[5]) == 6);
608 memset((void *)data_buf, 0xCC, sizeof(data_buf));
610 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
611 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
612 TEST_ASSERT(len == 6U);
613 TEST_ASSERT(memcmp((const void *)bssid, (const void *)data_buf, (size_t)len) == 0);
619 #if (WIFI_SETGETOPTION_TX_POWER_EN != 0)
620 static void WIFI_SetOption_GetOption_TX_POWER (void) {
621 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 1) != 0)
624 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 2) != 0)
627 uint8_t not_suported;
631 if (init_and_power_on () == 0) {
632 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
636 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 1) != 0)
638 power = WIFI_TX_POWER_STA;
639 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_ERROR_PARAMETER);
640 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_ERROR_PARAMETER);
642 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
643 power = WIFI_TX_POWER_STA;
644 if (drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
645 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
646 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
647 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 0U) == ARM_DRIVER_ERROR_PARAMETER);
648 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 3U) == ARM_DRIVER_ERROR_PARAMETER);
649 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 5U) == ARM_DRIVER_OK);
650 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
653 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_TX_POWER for Station is not supported");
656 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
657 power = WIFI_TX_POWER_AP;
658 if (drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
659 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
660 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
661 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 0U) == ARM_DRIVER_ERROR_PARAMETER);
662 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 3U) == ARM_DRIVER_ERROR_PARAMETER);
663 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 5U) == ARM_DRIVER_OK);
664 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
667 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_TX_POWER for Access Point is not supported");
672 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 2) != 0)
675 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
676 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
678 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
680 if (drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
682 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
684 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
686 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
688 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
690 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
692 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
695 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_TX_POWER for Station is not supported");
698 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
700 if (drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
702 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
704 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
706 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
708 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
710 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
712 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
715 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_TX_POWER for Access Point is not supported");
720 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 3) == 3)
721 // Check with Get that Set has written the correct values
722 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
723 power = WIFI_TX_POWER_STA;
725 memset((void *)data_buf, 0xCC, sizeof(data_buf));
726 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
727 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
728 TEST_ASSERT(len == 4U);
729 TEST_ASSERT(memcmp((const void *)&power, (const void *)data_buf, (size_t)len) == 0);
731 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
732 power = WIFI_TX_POWER_AP;
734 memset((void *)data_buf, 0xCC, sizeof(data_buf));
735 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
736 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
737 TEST_ASSERT(len == 4U);
738 TEST_ASSERT(memcmp((const void *)&power, (const void *)data_buf, (size_t)len) == 0);
744 #if (WIFI_SETGETOPTION_LP_TIMER_EN != 0)
745 static void WIFI_SetOption_GetOption_LP_TIMER (void) {
746 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 1) != 0)
749 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 2) != 0)
752 uint8_t not_suported;
756 if (init_and_power_on () == 0) {
757 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
761 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 1) != 0)
763 time = WIFI_LP_TIMER_STA;
764 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
765 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
767 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
768 time = WIFI_LP_TIMER_STA;
769 if (drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
770 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
771 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
772 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 0U) == ARM_DRIVER_ERROR_PARAMETER);
773 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 3U) == ARM_DRIVER_ERROR_PARAMETER);
774 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 5U) == ARM_DRIVER_OK);
775 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_OK);
778 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_LP_TIMER for Station is not supported");
781 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
782 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
786 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 2) != 0)
789 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
790 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
792 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
794 if (drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
796 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
798 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
800 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
802 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
804 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
806 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
809 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_LP_TIMER for Station is not supported");
812 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
814 TEST_ASSERT (drv->GetOption (1U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
818 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 3) == 3)
819 // Check with Get that Set has written the correct values
820 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
821 time = WIFI_LP_TIMER_STA;
823 memset((void *)data_buf, 0xCC, sizeof(data_buf));
824 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_OK);
825 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
826 TEST_ASSERT(len == 4U);
827 TEST_ASSERT(memcmp((const void *)&time, (const void *)data_buf, (size_t)len) == 0);
833 #if (WIFI_SETGETOPTION_DTIM_EN != 0)
834 static void WIFI_SetOption_GetOption_DTIM (void) {
835 #if ((WIFI_SETGETOPTION_DTIM_EN & 1) != 0)
838 #if ((WIFI_SETGETOPTION_DTIM_EN & 2) != 0)
841 uint8_t not_suported;
845 if (init_and_power_on () == 0) {
846 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
850 #if ((WIFI_SETGETOPTION_DTIM_EN & 1) != 0)
852 dtim = WIFI_DTIM_STA;
853 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_ERROR_PARAMETER);
854 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_ERROR_PARAMETER);
856 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
857 dtim = WIFI_DTIM_STA;
858 if (drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
859 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
860 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
861 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 0U) == ARM_DRIVER_ERROR_PARAMETER);
862 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 3U) == ARM_DRIVER_ERROR_PARAMETER);
863 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 5U) == ARM_DRIVER_OK);
864 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
867 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_DTIM for Station is not supported");
870 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
872 if (drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
873 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
874 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
875 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 0U) == ARM_DRIVER_ERROR_PARAMETER);
876 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 3U) == ARM_DRIVER_ERROR_PARAMETER);
877 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 5U) == ARM_DRIVER_OK);
878 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
881 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_DTIM for Access Point is not supported");
886 #if ((WIFI_SETGETOPTION_DTIM_EN & 2) != 0)
889 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
890 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
892 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
894 if (drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
896 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
898 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
900 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
902 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
904 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
906 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
909 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_DTIM for Station is not supported");
912 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
914 if (drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
916 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
918 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
920 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
922 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
924 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
926 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
929 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_DTIM for Access Point is not supported");
934 #if ((WIFI_SETGETOPTION_DTIM_EN & 3) == 3)
935 // Check with Get that Set has written the correct values
936 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
937 dtim = WIFI_DTIM_STA;
939 memset((void *)data_buf, 0xCC, sizeof(data_buf));
940 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
941 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
942 TEST_ASSERT(len == 4U);
943 TEST_ASSERT(memcmp((const void *)&dtim, (const void *)data_buf, (size_t)len) == 0);
945 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
948 memset((void *)data_buf, 0xCC, sizeof(data_buf));
949 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
950 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
951 TEST_ASSERT(len == 4U);
952 TEST_ASSERT(memcmp((const void *)&dtim, (const void *)data_buf, (size_t)len) == 0);
958 #if (WIFI_SETGETOPTION_BEACON_EN != 0)
959 static void WIFI_SetOption_GetOption_BEACON (void) {
960 #if ((WIFI_SETGETOPTION_BEACON_EN & 1) != 0)
963 #if ((WIFI_SETGETOPTION_BEACON_EN & 2) != 0)
966 uint8_t not_suported;
970 if (init_and_power_on () == 0) {
971 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
975 #if ((WIFI_SETGETOPTION_BEACON_EN & 1) != 0)
977 beacon = WIFI_BEACON_AP;
978 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_PARAMETER);
979 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_PARAMETER);
981 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
982 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
984 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
985 beacon = WIFI_BEACON_AP;
986 if (drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
987 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
988 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
989 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 0U) == ARM_DRIVER_ERROR_PARAMETER);
990 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 3U) == ARM_DRIVER_ERROR_PARAMETER);
991 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 5U) == ARM_DRIVER_OK);
992 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_OK);
995 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BEACON for Access Point is not supported");
1000 #if ((WIFI_SETGETOPTION_BEACON_EN & 2) != 0)
1003 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1004 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1006 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1008 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
1010 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1012 if (drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1014 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1016 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1018 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1020 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1022 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1024 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1027 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BEACON for Access Point is not supported");
1032 #if ((WIFI_SETGETOPTION_BEACON_EN & 3) == 3)
1033 // Check with Get that Set has written the correct values
1034 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1035 beacon = WIFI_BEACON_AP;
1037 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1038 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_OK);
1039 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1040 TEST_ASSERT(len == 4U);
1041 TEST_ASSERT(memcmp((const void *)&beacon, (const void *)data_buf, (size_t)len) == 0);
1047 #if (WIFI_SETGETOPTION_MAC_EN != 0)
1048 static void WIFI_SetOption_GetOption_MAC (void) {
1049 #if ((WIFI_SETGETOPTION_MAC_EN & 1) != 0)
1050 uint8_t u8_arr[8] __ALIGNED(4);
1051 uint8_t mac[7] __ALIGNED(4);
1052 uint8_t mac_ap_def[6] __ALIGNED(4);
1053 uint8_t mac_sta_def[6] __ALIGNED(4);
1055 #if ((WIFI_SETGETOPTION_MAC_EN & 2) != 0)
1058 uint8_t not_suported;
1062 if (init_and_power_on () == 0) {
1063 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1067 // Read default MAC so it can be restored at the end of this test case
1068 #if ((WIFI_SETGETOPTION_MAC_EN & 3) == 3)
1069 if (((cap.station_ap != 0) || (cap.station != 0))) {
1071 drv->GetOption (0U, ARM_WIFI_MAC, mac_sta_def, &len);
1073 if ((cap.station_ap != 0) || (cap.ap != 0)) {
1075 drv->GetOption (1U, ARM_WIFI_MAC, mac_ap_def, &len);
1079 #if ((WIFI_SETGETOPTION_MAC_EN & 1) != 0)
1081 memset((void *)mac, 0x11, 7);
1082 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1083 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1085 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1086 TEST_ASSERT(sscanf((const char *)WIFI_MAC_STA, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6);
1087 memset((void *) u8_arr, 0xCC, 8);
1088 memcpy((void *)&u8_arr[1], (const void *)mac, 6);
1089 if (drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1090 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1091 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1092 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1093 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 5U) == ARM_DRIVER_ERROR_PARAMETER);
1094 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, &u8_arr[1], 6U) == ARM_DRIVER_OK);
1095 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, &u8_arr[1], 7U) == ARM_DRIVER_OK);
1096 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 7U) == ARM_DRIVER_OK);
1097 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1100 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_MAC for Station is not supported");
1103 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1104 TEST_ASSERT(sscanf((const char *)WIFI_MAC_AP, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6);
1105 memset((void *) u8_arr, 0xCC, 8);
1106 memcpy((void *)&u8_arr[1], (const void *)mac, 6);
1107 if (drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1108 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1109 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1110 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1111 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 5U) == ARM_DRIVER_ERROR_PARAMETER);
1112 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, &u8_arr[1], 6U) == ARM_DRIVER_OK);
1113 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, &u8_arr[1], 7U) == ARM_DRIVER_OK);
1114 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 7U) == ARM_DRIVER_OK);
1115 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1118 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_MAC for Access Point is not supported");
1123 #if ((WIFI_SETGETOPTION_MAC_EN & 2) != 0)
1126 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1127 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1129 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1131 if (drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1133 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1135 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1137 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1139 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1141 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1143 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1145 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1147 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1150 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_MAC for Station is not supported");
1153 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1155 if (drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1157 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1159 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1161 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1163 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1165 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1167 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1169 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1171 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1174 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_MAC for Access Point is not supported");
1179 #if ((WIFI_SETGETOPTION_MAC_EN & 3) == 3)
1180 // Check with Get that Set has written the correct values
1181 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1182 TEST_ASSERT(sscanf((const char *)WIFI_MAC_STA, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6);
1184 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1185 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1186 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1187 TEST_ASSERT(len == 6U);
1188 TEST_ASSERT(memcmp((const void *)mac, (const void *)data_buf, (size_t)len) == 0);
1190 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1191 TEST_ASSERT(sscanf((const char *)WIFI_MAC_AP, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6);
1193 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1194 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1195 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1196 TEST_ASSERT(len == 6U);
1197 TEST_ASSERT(memcmp((const void *)mac, (const void *)data_buf, (size_t)len) == 0);
1200 // Restore default MAC
1201 if (((cap.station_ap != 0) || (cap.station != 0)) && (memcmp((const void *)mac_sta_def, (const void *)"\0\0\0\0\0\0", 6) != 0)) {
1202 drv->SetOption (0U, ARM_WIFI_MAC, mac_sta_def, 6U);
1204 if ((cap.station_ap != 0) || (cap.ap != 0) && (memcmp((const void *)mac_ap_def, (const void *)"\0\0\0\0\0\0", 6) != 0)) {
1205 drv->SetOption (1U, ARM_WIFI_MAC, mac_ap_def, 6U);
1211 #if (WIFI_SETGETOPTION_IP_EN != 0)
1212 static void WIFI_SetOption_GetOption_IP (void) {
1213 #if ((WIFI_SETGETOPTION_IP_EN & 1) != 0)
1214 uint32_t u32_0, u32_1;
1215 uint8_t ip[5] __ALIGNED(4);
1217 #if ((WIFI_SETGETOPTION_IP_EN & 2) != 0)
1220 uint8_t not_suported;
1224 if (init_and_power_on () == 0) {
1225 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1229 #if ((WIFI_SETGETOPTION_IP_EN & 1) != 0)
1233 memset((void *)ip, 0, 5);
1234 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1235 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1237 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1238 TEST_ASSERT(sscanf((const char *)WIFI_IP_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1239 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1240 if (drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1241 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1242 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1243 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1244 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1245 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 5U) == ARM_DRIVER_OK);
1246 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1249 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP for Station is not supported");
1251 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1253 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1254 TEST_ASSERT(sscanf((const char *)WIFI_IP_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1255 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1256 if (drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1257 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1258 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1259 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1260 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1261 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 5U) == ARM_DRIVER_OK);
1262 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1265 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP for Access Point is not supported");
1267 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1271 #if ((WIFI_SETGETOPTION_IP_EN & 2) != 0)
1274 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1275 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1277 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1279 if (drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1281 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1283 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1285 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1287 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1289 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1291 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1294 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP for Station is not supported");
1297 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1299 if (drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1301 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1303 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1305 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1307 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1309 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1311 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1314 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP for Access Point is not supported");
1319 #if ((WIFI_SETGETOPTION_IP_EN & 3) == 3)
1320 // Check with Get that Set has written the correct values
1321 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1322 TEST_ASSERT(sscanf((const char *)WIFI_IP_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1324 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1325 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1326 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1327 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1328 TEST_ASSERT(len == 4U);
1329 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1330 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1332 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1333 TEST_ASSERT(sscanf((const char *)WIFI_IP_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1335 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1336 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1337 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1338 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1339 TEST_ASSERT(len == 4U);
1340 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1341 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1347 #if (WIFI_SETGETOPTION_IP_SUBNET_MASK_EN != 0)
1348 static void WIFI_SetOption_GetOption_IP_SUBNET_MASK (void) {
1349 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 1) != 0)
1350 uint32_t u32_0, u32_1;
1351 uint8_t mask[5] __ALIGNED(4);
1353 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 2) != 0)
1356 uint8_t not_suported;
1360 if (init_and_power_on () == 0) {
1361 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1365 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 1) != 0)
1369 memset((void *)mask, 0, 5);
1370 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1371 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1373 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1374 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_STA, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1375 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1376 if (drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1377 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1378 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1379 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1380 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1381 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 5U) == ARM_DRIVER_OK);
1382 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1385 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_SUBNET_MASK for Station is not supported");
1387 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1389 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1390 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_AP, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1391 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1392 if (drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1393 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1394 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1395 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1396 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1397 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 5U) == ARM_DRIVER_OK);
1398 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1401 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_SUBNET_MASK for Access Point is not supported");
1403 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1407 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 2) != 0)
1410 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1411 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1413 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1415 if (drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1417 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1419 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1421 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1423 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1425 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1427 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1430 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_SUBNET_MASK for Station is not supported");
1433 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1435 if (drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1437 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1439 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1441 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1443 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1445 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1447 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1450 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_SUBNET_MASK for Access Point is not supported");
1455 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 3) == 3)
1456 // Check with Get that Set has written the correct values
1457 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1458 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_STA, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1460 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1461 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1462 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1463 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1464 TEST_ASSERT(len == 4U);
1465 TEST_ASSERT(memcmp((const void *)mask, (const void *)data_buf, (size_t)len) == 0);
1466 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1468 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1469 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_AP, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1471 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1472 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1473 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1474 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1475 TEST_ASSERT(len == 4U);
1476 TEST_ASSERT(memcmp((const void *)mask, (const void *)data_buf, (size_t)len) == 0);
1477 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1483 #if (WIFI_SETGETOPTION_IP_GATEWAY_EN != 0)
1484 static void WIFI_SetOption_GetOption_IP_GATEWAY (void) {
1485 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 1) != 0)
1486 uint32_t u32_0, u32_1;
1487 uint8_t ip[5] __ALIGNED(4);
1489 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 2) != 0)
1492 uint8_t not_suported;
1496 if (init_and_power_on () == 0) {
1497 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1501 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 1) != 0)
1505 memset((void *)ip, 0, 5);
1506 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1507 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1509 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1510 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1511 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1512 if (drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1513 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1514 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1515 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1516 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1517 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 5U) == ARM_DRIVER_OK);
1518 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1521 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_GATEWAY for Station is not supported");
1523 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1525 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1526 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1527 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1528 if (drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1529 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1530 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1531 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1532 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1533 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 5U) == ARM_DRIVER_OK);
1534 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1537 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_GATEWAY for Access Point is not supported");
1539 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1543 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 2) != 0)
1546 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1547 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1549 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1551 if (drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1553 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1555 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1557 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1559 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1561 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1563 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1566 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_GATEWAY for Station is not supported");
1569 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1571 if (drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1573 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1575 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1577 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1579 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1581 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1583 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1586 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_GATEWAY for Access Point is not supported");
1591 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 3) == 3)
1592 // Check with Get that Set has written the correct values
1593 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1594 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1596 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1597 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1598 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1599 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1600 TEST_ASSERT(len == 4U);
1601 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1602 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1604 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1605 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1607 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1608 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1609 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1610 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1611 TEST_ASSERT(len == 4U);
1612 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1613 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1619 #if (WIFI_SETGETOPTION_IP_DNS1_EN != 0)
1620 static void WIFI_SetOption_GetOption_IP_DNS1 (void) {
1621 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 1) != 0)
1622 uint32_t u32_0, u32_1;
1623 uint8_t ip[5] __ALIGNED(4);
1625 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 2) != 0)
1628 uint8_t not_suported;
1632 if (init_and_power_on () == 0) {
1633 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1637 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 1) != 0)
1641 memset((void *)ip, 0, 5);
1642 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1643 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1645 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1646 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1647 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1648 if (drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1649 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1650 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1651 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1652 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1653 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 5U) == ARM_DRIVER_OK);
1654 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1657 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS1 for Station is not supported");
1659 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1661 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1662 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1663 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1664 if (drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1665 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1666 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1667 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1668 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1669 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 5U) == ARM_DRIVER_OK);
1670 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1673 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS1 for Access Point is not supported");
1675 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1679 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 2) != 0)
1682 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1683 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1685 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1687 if (drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1689 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1691 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1693 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1695 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1697 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1699 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1702 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS1 for Station is not supported");
1705 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1707 if (drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1709 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1711 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1713 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1715 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1717 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1719 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1722 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS1 for Access Point is not supported");
1727 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 3) == 3)
1728 // Check with Get that Set has written the correct values
1729 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1730 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1732 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1733 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1734 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1735 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1736 TEST_ASSERT(len == 4U);
1737 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1738 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1740 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1741 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1743 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1744 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1745 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1746 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1747 TEST_ASSERT(len == 4U);
1748 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1749 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1755 #if (WIFI_SETGETOPTION_IP_DNS2_EN != 0)
1756 static void WIFI_SetOption_GetOption_IP_DNS2 (void) {
1757 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 1) != 0)
1758 uint32_t u32_0, u32_1;
1759 uint8_t ip[5] __ALIGNED(4);
1761 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 2) != 0)
1764 uint8_t not_suported;
1768 if (init_and_power_on () == 0) {
1769 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1773 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 1) != 0)
1777 memset((void *)ip, 0, 5);
1778 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1779 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1781 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1782 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1783 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1784 if (drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1785 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1786 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1787 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1788 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1789 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 5U) == ARM_DRIVER_OK);
1790 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1793 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS2 for Station is not supported");
1795 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1797 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1798 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1799 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1800 if (drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1801 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1802 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1803 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1804 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1805 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 5U) == ARM_DRIVER_OK);
1806 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1809 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS2 for Access Point is not supported");
1811 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1815 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 2) != 0)
1818 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1819 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1821 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1823 if (drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1825 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1827 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1829 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1831 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1833 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1835 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1838 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS2 for Station is not supported");
1841 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1843 if (drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1845 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1847 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1849 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1851 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1853 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1855 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1858 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS2 for Access Point is not supported");
1863 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 3) == 3)
1864 // Check with Get that Set has written the correct values
1865 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1866 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1868 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1869 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1870 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1871 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1872 TEST_ASSERT(len == 4U);
1873 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1874 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1876 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1877 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1879 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1880 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1881 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1882 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1883 TEST_ASSERT(len == 4U);
1884 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1885 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1891 #if (WIFI_SETGETOPTION_IP_DHCP_EN != 0)
1892 static void WIFI_SetOption_GetOption_IP_DHCP (void) {
1893 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 1) != 0)
1894 uint32_t u32_1, u32_0;
1896 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 2) != 0)
1899 uint8_t not_suported;
1903 if (init_and_power_on () == 0) {
1904 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1908 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 1) != 0)
1912 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1913 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1915 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1916 if (drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1917 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1918 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1919 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1920 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1921 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 5U) == ARM_DRIVER_OK);
1922 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1923 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
1926 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP for Station is not supported");
1929 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1930 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1931 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1932 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1933 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1934 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1935 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 5U) == ARM_DRIVER_OK);
1936 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1937 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
1940 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP for Access Point is not supported");
1945 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 2) != 0)
1948 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1949 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1951 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1953 if (drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1955 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1957 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1959 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1961 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1963 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1965 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1968 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP for Station is not supported");
1971 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1973 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1975 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1977 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1979 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1981 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1983 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1985 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1988 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP for Access Point is not supported");
1993 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 3) == 3)
1994 // Check with Get that Set has written the correct values
1995 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1997 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1998 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1999 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2000 TEST_ASSERT(len == 4U);
2001 TEST_ASSERT(memcmp((const void *)&u32_0, (const void *)data_buf, (size_t)len) == 0);
2002 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
2003 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2004 TEST_ASSERT(len == 4U);
2005 TEST_ASSERT(memcmp((const void *)&u32_1, (const void *)data_buf, (size_t)len) == 0);
2007 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2009 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2010 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
2011 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2012 TEST_ASSERT(len == 4U);
2013 TEST_ASSERT(memcmp((const void *)&u32_0, (const void *)data_buf, (size_t)len) == 0);
2014 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
2015 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2016 TEST_ASSERT(len == 4U);
2017 TEST_ASSERT(memcmp((const void *)&u32_1, (const void *)data_buf, (size_t)len) == 0);
2023 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN != 0)
2024 static void WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN (void) {
2025 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 1) != 0)
2026 uint32_t u32_1, u32_0;
2027 uint8_t ip[5] __ALIGNED(4);
2029 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 2) != 0)
2032 uint8_t not_suported;
2036 if (init_and_power_on () == 0) {
2037 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2041 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 1) != 0)
2043 memset((void *)ip, 0, 5);
2044 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2045 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2047 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2048 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2050 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2051 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_BEGIN_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2052 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2053 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2054 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2055 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2056 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2057 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2058 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 5U) == ARM_DRIVER_OK);
2059 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_OK);
2062 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_POOL_BEGIN for Access Point is not supported");
2064 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2068 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 2) != 0)
2071 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2072 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2074 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2076 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2078 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2080 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2082 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2084 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2086 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2088 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2090 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2092 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2095 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_POOL_BEGIN for Access Point is not supported");
2100 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 3) == 3)
2101 // Check with Get that Set has written the correct values
2102 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2103 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_BEGIN_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2105 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2106 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2107 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_OK);
2108 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2109 TEST_ASSERT(len == 4U);
2110 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
2111 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2117 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN != 0)
2118 static void WIFI_SetOption_GetOption_IP_DHCP_POOL_END (void) {
2119 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 1) != 0)
2120 uint32_t u32_1, u32_0;
2121 uint8_t ip[5] __ALIGNED(4);
2123 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 2) != 0)
2126 uint8_t not_suported;
2130 if (init_and_power_on () == 0) {
2131 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2135 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 1) != 0)
2137 memset((void *)ip, 0, 5);
2138 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2139 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2141 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2142 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2144 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2145 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_END_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2146 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2147 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2148 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2149 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2150 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2151 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2152 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 5U) == ARM_DRIVER_OK);
2153 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_OK);
2156 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_POOL_END for Access Point is not supported");
2158 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2162 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 2) != 0)
2165 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2166 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2168 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2170 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2172 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2174 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2176 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2178 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2180 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2182 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2184 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2186 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2189 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_POOL_END for Access Point is not supported");
2194 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 3) == 3)
2195 // Check with Get that Set has written the correct values
2196 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2197 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_END_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2199 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2200 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2201 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_OK);
2202 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2203 TEST_ASSERT(len == 4U);
2204 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
2205 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2211 #if (WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN != 0)
2212 static void WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME (void) {
2213 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 1) != 0)
2216 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 2) != 0)
2219 uint8_t not_suported;
2223 if (init_and_power_on () == 0) {
2224 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2228 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 1) != 0)
2230 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2231 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2232 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2234 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2235 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2237 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2238 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2239 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2240 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2241 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2242 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2243 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2244 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 5U) == ARM_DRIVER_OK);
2245 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_OK);
2248 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_LEASE_TIME for Access Point is not supported");
2253 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 2) != 0)
2256 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2257 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2259 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2261 TEST_ASSERT (drv->GetOption (0U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2263 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2265 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2267 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2269 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2271 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2273 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2275 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2277 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2280 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_LEASE_TIME for Access Point is not supported");
2285 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 3) == 3)
2286 // Check with Get that Set has written the correct values
2287 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2288 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2290 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2291 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_OK);
2292 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2293 TEST_ASSERT(len == 4U);
2294 TEST_ASSERT(memcmp((const void *)&time, (const void *)data_buf, (size_t)len) == 0);
2300 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2302 \brief Test case: WIFI_SetOption_GetOption
2304 The test case \b WIFI_SetOption_GetOption verifies the WiFi Driver \b SetOption and \b GetOption functions.
2305 (Options: ARM_WIFI_BSSID, ARM_WIFI_MAC, ARM_WIFI_IP, ARM_WIFI_IP_SUBNET_MASK, ARM_WIFI_IP_GATEWAY, ARM_WIFI_IP_DNS1,
2306 ARM_WIFI_IP_DNS2, ARM_WIFI_IP_DHCP_POOL_BEGIN, ARM_WIFI_IP_DHCP_POOL_END are checked with buffer not aligned to 4 bytes).<br>
2307 Tests for each option is conditionally executed depending on WIFI_SETGETOPTION_... settings in DV_Config.h file.
2309 int32_t (*SetOption) (uint32_t interface, uint32_t option, const void *data, uint32_t len);
2313 int32_t (*GetOption) (uint32_t interface, uint32_t option, void *data, uint32_t *len);
2315 Function \b WIFI_SetOption_GetOption_BSSID tests \b ARM_WIFI_BSSID option.<br>
2316 Function \b WIFI_SetOption_GetOption_TX_POWER tests \b ARM_WIFI_TX_POWER option.<br>
2317 Function \b WIFI_SetOption_GetOption_LP_TIMER tests \b ARM_WIFI_LP_TIMER option.<br>
2318 Function \b WIFI_SetOption_GetOption_DTIM tests \b ARM_WIFI_DTIM option.<br>
2319 Function \b WIFI_SetOption_GetOption_BEACON tests \b ARM_WIFI_BEACON option.<br>
2320 Function \b WIFI_SetOption_GetOption_MAC tests \b ARM_WIFI_MAC option.<br>
2321 Function \b WIFI_SetOption_GetOption_IP tests \b ARM_WIFI_IP option.<br>
2322 Function \b WIFI_SetOption_GetOption_IP_SUBNET_MASK tests \b ARM_WIFI_IP_SUBNET_MASK option.<br>
2323 Function \b WIFI_SetOption_GetOption_IP_GATEWAY tests \b ARM_WIFI_IP_GATEWAY option.<br>
2324 Function \b WIFI_SetOption_GetOption_IP_DNS1 tests \b ARM_WIFI_IP_DNS1 option.<br>
2325 Function \b WIFI_SetOption_GetOption_IP_DNS2 tests \b ARM_WIFI_IP_DNS2 option.<br>
2326 Function \b WIFI_SetOption_GetOption_IP_DHCP tests \b ARM_WIFI_IP_DHCP option.<br>
2327 Function \b WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN tests \b ARM_WIFI_IP_DHCP_POOL_BEGIN option.<br>
2328 Function \b WIFI_SetOption_GetOption_IP_DHCP_POOL_END tests \b ARM_WIFI_IP_DHCP_POOL_END option.<br>
2329 Function \b WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME tests \b ARM_WIFI_IP_DHCP_LEASE_TIME option.
2331 void WIFI_SetOption_GetOption (void) {
2333 #if (WIFI_SETGETOPTION_BSSID_EN != 0)
2334 WIFI_SetOption_GetOption_BSSID ();
2336 #if (WIFI_SETGETOPTION_TX_POWER_EN != 0)
2337 WIFI_SetOption_GetOption_TX_POWER ();
2339 #if (WIFI_SETGETOPTION_LP_TIMER_EN != 0)
2340 WIFI_SetOption_GetOption_LP_TIMER ();
2342 #if (WIFI_SETGETOPTION_DTIM_EN != 0)
2343 WIFI_SetOption_GetOption_DTIM ();
2345 #if (WIFI_SETGETOPTION_BEACON_EN != 0)
2346 WIFI_SetOption_GetOption_BEACON ();
2348 #if (WIFI_SETGETOPTION_MAC_EN != 0)
2349 WIFI_SetOption_GetOption_MAC ();
2351 #if (WIFI_SETGETOPTION_IP_EN != 0)
2352 WIFI_SetOption_GetOption_IP ();
2354 #if (WIFI_SETGETOPTION_IP_SUBNET_MASK_EN != 0)
2355 WIFI_SetOption_GetOption_IP_SUBNET_MASK ();
2357 #if (WIFI_SETGETOPTION_IP_GATEWAY_EN != 0)
2358 WIFI_SetOption_GetOption_IP_GATEWAY ();
2360 #if (WIFI_SETGETOPTION_IP_DNS1_EN != 0)
2361 WIFI_SetOption_GetOption_IP_DNS1 ();
2363 #if (WIFI_SETGETOPTION_IP_DNS2_EN != 0)
2364 WIFI_SetOption_GetOption_IP_DNS2 ();
2366 #if (WIFI_SETGETOPTION_IP_DHCP_EN != 0)
2367 WIFI_SetOption_GetOption_IP_DHCP ();
2369 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN != 0)
2370 WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN ();
2372 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN != 0)
2373 WIFI_SetOption_GetOption_IP_DHCP_POOL_END ();
2375 #if (WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN != 0)
2376 WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME ();
2380 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2382 \brief Test case: WIFI_Scan
2384 The test case \b WIFI_Scan verifies the WiFi Driver \b Scan function.
2386 int32_t (*Scan) (ARM_WIFI_SCAN_INFO_t scan_info[], uint32_t max_num);
2389 void WIFI_Scan (void) {
2392 if (init_and_power_on () == 0) {
2393 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2397 TEST_ASSERT(drv->Scan(NULL, WIFI_SCAN_MAX_NUM) == ARM_DRIVER_ERROR_PARAMETER);
2398 TEST_ASSERT(drv->Scan(scan_info, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2400 memset((void *)scan_info, 0xCC, sizeof(scan_info));
2401 ret = drv->Scan(scan_info, 10U);
2403 TEST_MESSAGE("[WARNING] Scan (..) found no networks");
2405 TEST_ASSERT((ret > 0) && (ret <= WIFI_SCAN_MAX_NUM));
2409 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2411 \brief Test case: WIFI_Activate_Deactivate
2413 The test case \b WIFI_Activate_Deactivate verifies the WiFi Driver \b Activate and \b Deactivate functions.
2415 int32_t (*Activate) (uint32_t interface, const ARM_WIFI_CONFIG_t *config);
2419 int32_t (*Deactivate) (uint32_t interface);
2421 Testing sequence (for Station and Access Point):
2422 - if not initialized and powered initialize and power on
2424 - Activate (with invalid parameters)
2425 - Activate (with valid parameters)
2427 - Activate (with invalid WPS parameters)
2429 void WIFI_Activate_Deactivate (void) {
2432 if (init_and_power_on () == 0) {
2433 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2437 /* Test Station configuration setup */
2438 if ((cap.station != 0) || (cap.station_ap != 0)) {
2440 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2442 /* Test function with invalid parameters */
2443 TEST_ASSERT(drv->Activate(0U, NULL) == ARM_DRIVER_ERROR_PARAMETER);
2447 config.security = 0U;
2449 config.wps_method = 0U;
2450 config.wps_pin = NULL;
2451 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2453 config.ssid = WIFI_STA_SSID;
2455 config.security = WIFI_STA_SECURITY;
2457 config.wps_method = 0U;
2458 config.wps_pin = NULL;
2459 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2461 config.ssid = WIFI_STA_SSID;
2462 config.pass = WIFI_STA_PASS;
2463 config.security = ARM_WIFI_SECURITY_UNKNOWN;
2464 config.ch = WIFI_STA_CH;
2465 config.wps_method = 0U;
2466 config.wps_pin = NULL;
2467 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2469 config.ssid = WIFI_STA_SSID;
2470 config.pass = WIFI_STA_PASS;
2471 config.security = WIFI_STA_SECURITY;
2473 config.wps_method = 0U;
2474 config.wps_pin = NULL;
2475 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2477 config.ssid = WIFI_STA_SSID;
2478 config.pass = WIFI_STA_PASS;
2479 config.security = WIFI_STA_SECURITY;
2480 config.ch = WIFI_STA_CH;
2481 config.wps_method = 0U;
2482 config.wps_pin = NULL;
2483 TEST_ASSERT(drv->Activate(3U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2485 /* Test function with autodetect channel, can return unsupported or succeed */
2486 config.ssid = WIFI_STA_SSID;
2487 config.pass = WIFI_STA_PASS;
2488 config.security = WIFI_STA_SECURITY;
2490 config.wps_method = 0U;
2491 config.wps_pin = NULL;
2492 ret = drv->Activate(0U, &config);
2493 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
2494 TEST_MESSAGE("[WARNING] Activate (0, ...) with autodetect channel not supported");
2496 TEST_ASSERT(ret == ARM_DRIVER_OK);
2499 if (ret == ARM_DRIVER_OK) {
2500 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2503 /* Test function with valid parameters -> must succeed */
2504 config.ssid = WIFI_STA_SSID;
2505 config.pass = WIFI_STA_PASS;
2506 config.security = WIFI_STA_SECURITY;
2507 config.ch = WIFI_STA_CH;
2508 config.wps_method = 0U;
2509 config.wps_pin = NULL;
2510 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_OK);
2512 if (ret == ARM_DRIVER_OK) {
2513 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2516 if (cap.wps_station != 0U) {
2517 /* Test function with invalid WPS configurations */
2518 config.ssid = WIFI_STA_SSID;
2519 config.pass = WIFI_STA_PASS;
2520 config.security = WIFI_STA_SECURITY;
2521 config.ch = WIFI_STA_CH;
2522 config.wps_method = 255U;
2523 config.wps_pin = NULL;
2524 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2526 config.ssid = WIFI_STA_SSID;
2527 config.pass = WIFI_STA_PASS;
2528 config.security = WIFI_STA_SECURITY;
2529 config.ch = WIFI_STA_CH;
2530 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2531 config.wps_pin = NULL;
2532 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2536 /* Test Access Point configuration setup */
2537 if ((cap.ap != 0) || (cap.station_ap != 0)) {
2539 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2541 /* Test function with invalid parameters */
2542 TEST_ASSERT(drv->Activate(1U, NULL) == ARM_DRIVER_ERROR_PARAMETER);
2546 config.security = 0U;
2548 config.wps_method = 0U;
2549 config.wps_pin = NULL;
2550 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2552 config.ssid = WIFI_STA_SSID;
2554 config.security = WIFI_AP_SECURITY;
2556 config.wps_method = 0U;
2557 config.wps_pin = NULL;
2558 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2560 config.ssid = WIFI_AP_SSID;
2561 config.pass = WIFI_AP_PASS;
2562 config.security = ARM_WIFI_SECURITY_UNKNOWN;
2563 config.ch = WIFI_AP_CH;
2564 config.wps_method = 0U;
2565 config.wps_pin = NULL;
2566 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2568 config.ssid = WIFI_AP_SSID;
2569 config.pass = WIFI_AP_PASS;
2570 config.security = WIFI_AP_SECURITY;
2572 config.wps_method = 0U;
2573 config.wps_pin = NULL;
2574 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2576 config.ssid = WIFI_AP_SSID;
2577 config.pass = WIFI_AP_PASS;
2578 config.security = WIFI_AP_SECURITY;
2579 config.ch = WIFI_AP_CH;
2580 config.wps_method = 0U;
2581 config.wps_pin = NULL;
2582 TEST_ASSERT(drv->Activate(3U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2584 /* Test function with autodetect channel, can return unsupported or succeed */
2585 config.ssid = WIFI_AP_SSID;
2586 config.pass = WIFI_AP_PASS;
2587 config.security = WIFI_AP_SECURITY;
2589 config.wps_method = 0U;
2590 config.wps_pin = NULL;
2591 ret = drv->Activate(1U, &config);
2592 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
2593 TEST_MESSAGE("[WARNING] Activate (1, ...) with autodetect channel not supported");
2595 TEST_ASSERT(ret == ARM_DRIVER_OK);
2598 if (ret == ARM_DRIVER_OK) {
2599 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2602 /* Test function with valid parameters -> must succeed */
2603 config.ssid = WIFI_AP_SSID;
2604 config.pass = WIFI_AP_PASS;
2605 config.security = WIFI_AP_SECURITY;
2606 config.ch = WIFI_AP_CH;
2607 config.wps_method = 0U;
2608 config.wps_pin = NULL;
2609 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_OK);
2611 if (ret == ARM_DRIVER_OK) {
2612 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2615 if (cap.wps_ap != 0U) {
2616 /* Test function with invalid WPS configurations */
2617 config.ssid = WIFI_AP_SSID;
2618 config.pass = WIFI_AP_PASS;
2619 config.security = WIFI_AP_SECURITY;
2620 config.ch = WIFI_AP_CH;
2621 config.wps_method = 255U;
2622 config.wps_pin = NULL;
2623 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2625 config.ssid = WIFI_AP_SSID;
2626 config.pass = WIFI_AP_PASS;
2627 config.security = WIFI_AP_SECURITY;
2628 config.ch = WIFI_AP_CH;
2629 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2630 config.wps_pin = NULL;
2631 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2636 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2638 \brief Test case: WIFI_IsConnected
2640 The test case \b WIFI_IsConnected verifies the WiFi Driver \b IsConnected function.
2642 uint32_t (*IsConnected) (void);
2645 void WIFI_IsConnected (void) {
2647 if (init_and_power_on () == 0) {
2648 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2652 TEST_ASSERT(drv->IsConnected () == 0U);
2654 /* Test function with valid Station configuration */
2655 if ((cap.station != 0) || (cap.station_ap != 0)) {
2656 memset((void *)&config, 0, sizeof(config));
2657 config.ssid = WIFI_STA_SSID;
2658 config.pass = WIFI_STA_PASS;
2659 config.security = WIFI_STA_SECURITY;
2660 config.ch = WIFI_STA_CH;
2662 drv->Activate(0U, &config);
2663 TEST_ASSERT(drv->IsConnected () != 0U);
2665 drv->Deactivate (0U);
2666 TEST_ASSERT(drv->IsConnected () == 0U);
2670 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2672 \brief Test case: WIFI_GetNetInfo
2674 The test case \b WIFI_GetNetInfo verifies the WiFi Driver \b GetNetInfo function.
2676 int32_t (*GetNetInfo) (ARM_WIFI_NET_INFO_t *net_info);
2679 void WIFI_GetNetInfo (void) {
2681 if (init_and_power_on () == 0) {
2682 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2686 /* Test function with invalid pointer */
2687 TEST_ASSERT(drv->GetNetInfo (NULL) == ARM_DRIVER_ERROR_PARAMETER);
2689 /* Test function with valid Station configuration */
2690 if ((cap.station != 0) || (cap.station_ap != 0)) {
2691 memset((void *)&config, 0, sizeof(config));
2692 config.ssid = WIFI_STA_SSID;
2693 config.pass = WIFI_STA_PASS;
2694 config.security = WIFI_STA_SECURITY;
2695 config.ch = WIFI_STA_CH;
2697 drv->Activate(0U, &config);
2699 memset((void *)&net_info, 0xCC, sizeof(net_info));
2700 TEST_ASSERT(drv->GetNetInfo (&net_info) == ARM_DRIVER_OK);
2702 /* Check returned info */
2703 TEST_ASSERT(net_info.security == config.security);
2704 if (config.ch != 0U) {
2705 TEST_ASSERT(net_info.ch == config.ch);
2707 TEST_ASSERT(net_info.rssi != 0U);
2709 drv->Deactivate (0U);
2713 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2715 \brief Test case: WIFI_Activate_AP
2717 The test case \b WIFI_Activate_AP verifies the WiFi Driver \b Activate function AP operation.
2718 Test result is checked by connecting WiFi client to AP.
2720 void WIFI_Activate_AP (void) {
2723 if (init_and_power_on () == 0) {
2724 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2728 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2732 /* Test Access Point configuration setup */
2733 if ((cap.ap != 0) || (cap.station_ap != 0)) {
2734 memset((void *)&config, 0, sizeof(config));
2735 config.ssid = WIFI_AP_SSID;
2736 config.pass = WIFI_AP_PASS;
2737 config.security = WIFI_AP_SECURITY;
2738 config.ch = WIFI_AP_CH;
2739 ret = drv->Activate(1U, &config);
2740 TEST_ASSERT(ret == ARM_DRIVER_OK);
2742 if (ret == ARM_DRIVER_OK) {
2743 // Wait for WIFI_AP_CLIENT_CON_TIMEOUT in ms for client to connect
2744 // If event for connect is supported, loop will end when connect is detected
2745 // otherwise result of test is result of client connection status.
2746 for (tout = WIFI_AP_CLIENT_CON_TIMEOUT / 128; tout > 0; tout--) {
2748 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2749 if (event & ARM_WIFI_EVENT_AP_CONNECT) {
2756 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2757 TEST_ASSERT((event & ARM_WIFI_EVENT_AP_CONNECT) != 0U);
2762 drv->Deactivate (1U);
2766 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2768 \brief Test case: WIFI_Activate_Station_WPS_PBC
2770 The test case \b WIFI_Activate_Station_WPS_PBC verifies the WiFi Driver \b Activate function Station connection with WPS
2771 and Push-Button Configuration method.
2772 This test case requires that test Access Point has active Push-button WPS method when test is started.
2773 Usually started on the WiFi AP (router) by pressing the WPS button.
2775 void WIFI_Activate_Station_WPS_PBC (void) {
2778 if (init_and_power_on () == 0) {
2779 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2783 /* Test Station WPS PBC connection */
2784 if ((cap.wps_station != 0U) && ((cap.station != 0) || (cap.station_ap != 0))) {
2785 memset((void *)&config, 0, sizeof(config));
2787 /* Connect with valid WPS configuration - Push-Button Configuration method -> should succeed */
2788 config.wps_method = ARM_WIFI_WPS_METHOD_PBC;
2789 ret = drv->Activate(0U, &config);
2790 TEST_ASSERT(ret == ARM_DRIVER_OK);
2792 if (ret == ARM_DRIVER_OK) {
2793 // Check connect information is as expected
2794 memset((void *)&net_info, 0xCC, sizeof(net_info));
2795 drv->GetNetInfo (&net_info);
2797 TEST_ASSERT(memcmp((const void *)net_info.ssid, (const void *)WIFI_STA_SSID, sizeof(WIFI_STA_SSID)) == 0);
2798 TEST_ASSERT(memcmp((const void *)net_info.pass, (const void *)WIFI_STA_PASS, sizeof(WIFI_STA_PASS)) == 0);
2799 TEST_ASSERT(net_info.security == WIFI_STA_SECURITY);
2800 if (WIFI_STA_CH != 0) {
2801 TEST_ASSERT(net_info.ch == WIFI_STA_CH);
2805 drv->Deactivate (0U);
2810 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2812 \brief Test case: WIFI_Activate_Station_WPS_PIN
2814 The test case \b WIFI_Activate_Station_WPS_PIN verifies the WiFi Driver \b Activate function Station connection with WPS
2816 This test case requires that test Access Point has active PIN WPS method when test is started.
2817 Usually needs to be configured on the WiFi AP (router).
2819 void WIFI_Activate_Station_WPS_PIN (void) {
2822 if (init_and_power_on () == 0) {
2823 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2827 /* Test Station WPS PIN connection */
2828 if ((cap.wps_station != 0U) && ((cap.station != 0) || (cap.station_ap != 0))) {
2829 memset((void *)&config, 0, sizeof(config));
2831 /* Connect with valid WPS configuration - PIN method -> should succeed */
2832 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2833 config.wps_pin = WIFI_STA_WPS_PIN;
2834 ret = drv->Activate(0U, &config);
2835 TEST_ASSERT(ret == ARM_DRIVER_OK);
2837 if (ret == ARM_DRIVER_OK) {
2838 // Check connect information is as expected
2839 memset((void *)&net_info, 0xCC, sizeof(net_info));
2840 drv->GetNetInfo (&net_info);
2842 TEST_ASSERT(memcmp((const void *)net_info.ssid, (const void *)WIFI_STA_SSID, sizeof(WIFI_STA_SSID)) == 0);
2843 TEST_ASSERT(memcmp((const void *)net_info.pass, (const void *)WIFI_STA_PASS, sizeof(WIFI_STA_PASS)) == 0);
2844 TEST_ASSERT(net_info.security == WIFI_STA_SECURITY);
2845 if (WIFI_STA_CH != 0) {
2846 TEST_ASSERT(net_info.ch == WIFI_STA_CH);
2850 drv->Deactivate (0U);
2855 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2857 \brief Test case: WIFI_Activate_AP_WPS_PBC
2859 The test case \b WIFI_Activate_AP_WPS_PBC verifies the WiFi Driver \b Activate function AP WPS
2860 and Push-Button Configuration method functionality.
2861 Test result is checked by connecting the WiFi client to AP with WPS Push-Button Configuration method.
2863 void WIFI_Activate_AP_WPS_PBC (void) {
2866 if (init_and_power_on () == 0) {
2867 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2871 /* Test AP WPS PBC */
2872 if ((cap.wps_ap != 0U) && ((cap.ap != 0) || (cap.station_ap != 0))) {
2873 memset((void *)&config, 0, sizeof(config));
2874 config.ssid = WIFI_AP_SSID;
2875 config.pass = WIFI_AP_PASS;
2876 config.security = WIFI_AP_SECURITY;
2877 config.ch = WIFI_AP_CH;
2879 /* Start AP with WPS configuration - Push-Button Configuration method -> should succeed */
2880 config.wps_method = ARM_WIFI_WPS_METHOD_PBC;
2881 ret = drv->Activate(1U, &config);
2882 TEST_ASSERT(ret == ARM_DRIVER_OK);
2884 if (ret == ARM_DRIVER_OK) {
2885 // Wait predefined time for Client to connect
2886 osDelay(WIFI_AP_CLIENT_CON_TIMEOUT);
2890 drv->Deactivate (1U);
2894 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2896 \brief Test case: WIFI_Activate_AP_WPS_PIN
2898 The test case \b WIFI_Activate_AP_WPS_PIN verifies the WiFi Driver \b Activate function AP WPS
2899 PIN method functionality.
2900 Test result is checked by connecting the WiFi client to AP with WPS PIN method.
2902 void WIFI_Activate_AP_WPS_PIN (void) {
2905 if (init_and_power_on () == 0) {
2906 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2910 /* Test AP WPS PIN */
2911 if ((cap.wps_ap != 0U) && ((cap.ap != 0) || (cap.station_ap != 0))) {
2912 memset((void *)&config, 0, sizeof(config));
2913 config.ssid = WIFI_AP_SSID;
2914 config.pass = WIFI_AP_PASS;
2915 config.security = WIFI_AP_SECURITY;
2916 config.ch = WIFI_AP_CH;
2918 /* Start AP with WPS configuration - PIN method -> should succeed */
2919 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2920 config.wps_pin = WIFI_AP_WPS_PIN;
2921 ret = drv->Activate(1U, &config);
2922 TEST_ASSERT(ret == ARM_DRIVER_OK);
2924 if (ret == ARM_DRIVER_OK) {
2925 // Wait predefined time for Client to connect
2926 osDelay(WIFI_AP_CLIENT_CON_TIMEOUT);
2930 drv->Deactivate (1U);
2938 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2939 /* WiFi Socket tests */
2940 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2943 \defgroup wifi_sock_api WiFi Socket API
2946 These tests verify API and operation of the WiFi socket functions.
2949 /* Helper function that initialize and connects to WiFi Access Point */
2950 static int32_t station_init (uint32_t con) {
2952 if (cap.station == 0U) {
2956 if (powered == 0U) {
2957 if ((drv->Initialize (event_func) == ARM_DRIVER_OK) &&
2958 (drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK)) {
2965 if (connected != con) {
2967 memset((void *)&config, 0, sizeof(config));
2968 config.ssid = WIFI_STA_SSID;
2969 config.pass = WIFI_STA_PASS;
2970 config.security = WIFI_STA_SECURITY;
2971 config.ch = WIFI_STA_CH;
2972 if (drv->Activate(0U, &config) != ARM_DRIVER_OK) {
2976 if (drv->Deactivate(0U) != ARM_DRIVER_OK) {
2981 connected = (uint8_t)con;
2987 /* Helper function that disconnects and uninitializes Station */
2988 static void station_uninit (void) {
2990 drv->Deactivate (0U);
2993 drv->PowerControl (ARM_POWER_OFF);
2994 drv->Uninitialize ();
2998 /* Helper function for execution of socket test function in the worker thread */
2999 static int32_t th_execute (osThreadId_t *id, uint32_t sig, uint32_t tout, uint32_t line) {
3000 osThreadFlagsSet (id, sig);
3001 if (osThreadFlagsWait (TH_OK | TH_TOUT, osFlagsWaitAny, tout) == TH_OK) {
3002 /* Success, completed in time */
3005 /* Function timeout expired */
3006 snprintf(msg_buf, sizeof(msg_buf), "Execution timeout (%d ms)", tout);
3007 TEST_ASSERT_MESSAGE(0,msg_buf)
3011 #define TH_EXECUTE(sig,tout) do { \
3013 rval = th_execute (worker, sig, tout, __LINE__); \
3016 #define TH_ASSERT(cond) do { \
3017 if (rval) { TEST_ASSERT(cond); } \
3020 #define TH_ASSERT2(c1,c2,s1,r1,r2) do { \
3022 if (!c2) { TEST_ASSERT(c1); } \
3024 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Non BSD-strict, %s (result %s, expected %s)", s1, str_sock_ret[-r1], str_sock_ret[-r2]); \
3025 TEST_MESSAGE(msg_buf); \
3030 #define ARG_INIT() do { \
3031 io.owner = osThreadGetId (); \
3035 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3037 /* Create IO parameters */
3049 /* Assign arguments */
3050 #define ARG_CREATE(_af,_type,_proto) do { \
3053 io.protocol = _proto; \
3056 /* Create worker thread */
3057 __NO_RETURN static void Th_Create (IO_CREATE *io) {
3058 uint32_t flags, xid;
3061 flags = osThreadFlagsWait (F_CREATE | F_CLOSE, osFlagsWaitAny, osWaitForever);
3066 io->rc = drv->SocketCreate (io->af, io->type, io->protocol);
3071 io->rc = drv->SocketClose (io->sock);
3074 /* Done, send signal to owner thread */
3075 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3077 osThreadFlagsSet (io->owner, flags);
3078 osThreadFlagsClear (F_ALL);
3083 \brief Test case: WIFI_SocketCreate
3084 \ingroup wifi_sock_api
3086 The test case \b WIFI_SocketCreate verifies the WiFi Driver \b SocketCreate function:
3088 int32_t (*SocketCreate) (int32_t af, int32_t type, int32_t protocol);
3092 - Check function parameters
3093 - Create multiple stream sockets
3094 - Gradually close stream sockets and create datagram sockets
3095 - Close datagram sockets
3097 void WIFI_SocketCreate (void) {
3098 osThreadId_t worker;
3101 int32_t sock[WIFI_SOCKET_MAX_NUM], i;
3103 if (socket_funcs_exist == 0U) {
3104 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3108 if (station_init (1) == 0) {
3109 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3113 /* Create worker thread */
3114 worker = osThreadNew ((osThreadFunc_t)Th_Create, &io, NULL);
3115 if (worker == NULL) {
3116 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3122 /* Check parameter (af = -1) */
3123 ARG_CREATE (-1, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3124 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3125 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3127 /* Check parameter (af = INT32_MIN) */
3128 ARG_CREATE (INT32_MIN, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3129 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3130 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3132 /* Check parameter (af = INT32_MAX) */
3133 ARG_CREATE (INT32_MAX, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3134 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3135 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3137 /* Check parameter (type = -1) */
3138 ARG_CREATE (ARM_SOCKET_AF_INET, -1, ARM_SOCKET_IPPROTO_TCP);
3139 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3140 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3142 /* Check parameter (type = INT32_MIN) */
3143 ARG_CREATE (ARM_SOCKET_AF_INET, INT32_MIN, ARM_SOCKET_IPPROTO_TCP);
3144 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3145 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3147 /* Check parameter (type = INT32_MAX) */
3148 ARG_CREATE (ARM_SOCKET_AF_INET, INT32_MAX, ARM_SOCKET_IPPROTO_TCP);
3149 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3150 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3152 /* Check parameter, stream socket (protocol = -1) */
3153 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, -1);
3154 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3155 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3157 /* Check parameter, stream socket (protocol = INT32_MIN) */
3158 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, INT32_MIN);
3159 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3160 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3162 /* Check parameter, stream socket (protocol = INT32_MAX) */
3163 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, INT32_MAX);
3164 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3165 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3167 /* Check parameter, datagram socket (protocol = -1) */
3168 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, -1);
3169 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3170 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3172 /* Check parameter, datagram socket (protocol = INT32_MIN) */
3173 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, INT32_MIN);
3174 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3175 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3177 /* Check parameter, datagram socket (protocol = INT32_MAX) */
3178 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, INT32_MAX);
3179 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3180 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3182 /* Check parameter, stream socket (protocol = ARM_SOCKET_IPPROTO_UDP) */
3183 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_UDP);
3184 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3185 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3187 /* Check parameter, datagram socket (protocol = ARM_SOCKET_IPPROTO_TCP) */
3188 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_TCP);
3189 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3190 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3192 /* Create multiple stream sockets */
3193 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3194 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3195 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3196 TH_ASSERT (io.rc >= 0);
3201 /* Gradually close stream sockets, create datagram sockets */
3202 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3203 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3204 /* Close stream socket */
3206 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3207 TH_ASSERT (io.rc == 0);
3209 /* Create datagram socket */
3210 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3211 TH_ASSERT (io.rc >= 0);
3216 /* Close datagram sockets */
3217 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3219 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3220 TH_ASSERT (io.rc == 0);
3228 /* Terminate worker thread */
3229 osThreadTerminate (worker);
3232 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3234 /* Bind IO parameters */
3247 /* Assign arguments */
3248 #define ARG_BIND(_sock,_ip,_ip_len,_port) do { \
3251 io.ip_len = _ip_len; \
3255 /* Bind worker thread */
3256 __NO_RETURN static void Th_Bind (IO_BIND *io) {
3260 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_CLOSE, osFlagsWaitAny, osWaitForever);
3264 /* Create stream socket */
3265 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3269 /* Create datagram socket */
3270 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3275 io->rc = drv->SocketBind (io->sock, io->ip, io->ip_len, io->port);
3280 io->rc = drv->SocketClose (io->sock);
3283 /* Done, send signal to owner thread */
3284 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3286 osThreadFlagsSet (io->owner, flags);
3287 osThreadFlagsClear (F_ALL);
3292 \brief Test case: WIFI_SocketBind
3293 \ingroup wifi_sock_api
3295 The test case \b WIFI_SocketBind verifies the WiFi Driver \b SocketBind function:
3297 int32_t (*SocketBind) (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port);
3301 - Create stream socket
3302 - Check function parameters
3303 - Bind stream socket
3304 - Bind socket second time
3305 - Create 2nd stream socket
3306 - Bind 2nd socket, used port
3307 - Bind 2nd socket, unused port
3308 - Close stream sockets
3309 - Bind closed socket
3311 Datagram socket test:
3312 - Create datagram socket
3313 - Bind datagram socket
3314 - Bind socket second time
3315 - Create 2nd datagram socket
3316 - Bind 2nd socket, used port
3317 - Bind 2nd socket, unused port
3318 - Close datagram socket
3319 - Bind closed socket
3321 void WIFI_SocketBind (void) {
3322 osThreadId_t worker;
3327 if (socket_funcs_exist == 0U) {
3328 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3332 if (station_init (1) == 0) {
3333 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3337 /* Create worker thread */
3338 worker = osThreadNew ((osThreadFunc_t)Th_Bind, &io, NULL);
3339 if (worker == NULL) {
3340 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3346 /* Create stream socket */
3347 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3349 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3353 /* Check parameter (socket = -1) */
3354 ARG_BIND (-1, ip_unspec, 4, DISCARD_PORT);
3355 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3356 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3358 /* Check parameter (socket = INT32_MIN) */
3359 ARG_BIND (INT32_MIN, ip_unspec, 4, DISCARD_PORT);
3360 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3361 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3363 /* Check parameter (socket = INT32_MAX) */
3364 ARG_BIND (INT32_MAX, ip_unspec, 4, DISCARD_PORT);
3365 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3366 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3368 /* Check parameter (ip = NULL) */
3369 ARG_BIND (sock, NULL, 4, DISCARD_PORT);
3370 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3371 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3373 /* Check parameter (ip_len = 0) */
3374 ARG_BIND (sock, ip_unspec, 0, DISCARD_PORT);
3375 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3376 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3378 /* Check parameter (ip_len = UINT32_MAX) */
3379 ARG_BIND (sock, ip_unspec, UINT32_MAX, DISCARD_PORT);
3380 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3381 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3383 /* Check parameter (port = 0) */
3384 ARG_BIND (sock, ip_unspec, 4, 0);
3385 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3386 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3389 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3390 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3391 TH_ASSERT (io.rc == 0);
3393 /* Bind socket 2nd time */
3394 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3395 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3396 /* Should return error (socket already bound) */
3397 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3398 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "bind socket to same address again", io.rc, ARM_SOCKET_EINVAL);
3400 /* Create 2nd stream socket */
3401 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3403 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3407 /* Bind 2nd socket, used port */
3408 ARG_BIND (sock2, ip_unspec, 4, DISCARD_PORT);
3409 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3410 /* Should return error (address already used) */
3411 /* Strict: EADDRINUSE, valid non-strict: ERROR */
3412 TH_ASSERT2 ((io.rc == ARM_SOCKET_EADDRINUSE), (io.rc == ARM_SOCKET_ERROR), "bind another socket to used address", io.rc, ARM_SOCKET_EADDRINUSE);
3414 /* Bind 2nd socket, unused port */
3415 ARG_BIND (sock2, ip_unspec, 4, ECHO_PORT);
3416 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3417 TH_ASSERT (io.rc == 0);
3421 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3422 TH_ASSERT (io.rc == 0);
3425 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3426 TH_ASSERT (io.rc == 0);
3428 /* Bind again, closed socket */
3429 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3430 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3431 /* Should return error (socket not created) */
3432 /* Strict: ESOCK, valid non-strict: ERROR */
3433 /* Return code strict: ESOCK, non-strict: ERROR */
3434 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "bind on closed socket", io.rc, ARM_SOCKET_ESOCK);
3439 /* Create datagram socket */
3440 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3442 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3446 /* Check parameter (socket = -1) */
3447 ARG_BIND (-1, ip_unspec, 4, DISCARD_PORT);
3448 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3449 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3451 /* Check parameter (socket = INT32_MIN) */
3452 ARG_BIND (INT32_MIN, ip_unspec, 4, DISCARD_PORT);
3453 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3454 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3456 /* Check parameter (socket = INT32_MAX) */
3457 ARG_BIND (INT32_MAX, ip_unspec, 4, DISCARD_PORT);
3458 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3459 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3461 /* Check parameter (ip = NULL) */
3462 ARG_BIND (sock, NULL, 4, DISCARD_PORT);
3463 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3464 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3466 /* Check parameter (ip_len = 0) */
3467 ARG_BIND (sock, ip_unspec, 0, DISCARD_PORT);
3468 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3469 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3471 /* Check parameter (ip_len = UINT32_MAX) */
3472 ARG_BIND (sock, ip_unspec, UINT32_MAX, DISCARD_PORT);
3473 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3474 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3476 /* Check parameter (port = 0) */
3477 ARG_BIND (sock, ip_unspec, 4, 0);
3478 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3479 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3482 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3483 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3484 TH_ASSERT (io.rc == 0);
3486 /* Bind socket 2nd time */
3487 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3488 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3489 /* Should return error (socket already bound) */
3490 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3491 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "bind socket to same address again", io.rc, ARM_SOCKET_EINVAL);
3493 /* Create 2nd datagram socket */
3494 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3496 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3500 /* Bind 2nd socket, used port */
3501 ARG_BIND (sock2, ip_unspec, 4, DISCARD_PORT);
3502 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3503 /* Should return error (address already used) */
3504 /* Strict: EADDRINUSE, valid non-strict: ERROR */
3505 TH_ASSERT2 ((io.rc == ARM_SOCKET_EADDRINUSE), (io.rc == ARM_SOCKET_ERROR), "bind another socket to used address", io.rc, ARM_SOCKET_EADDRINUSE);
3507 /* Bind 2nd socket, unused port */
3508 ARG_BIND (sock2, ip_unspec, 4, ECHO_PORT);
3509 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3510 TH_ASSERT (io.rc == 0);
3514 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3515 TH_ASSERT (io.rc == 0);
3518 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3519 TH_ASSERT (io.rc == 0);
3521 /* Bind again, closed socket */
3522 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3523 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3524 /* Should return error (socket not created) */
3525 /* Strict: ESOCK, valid non-strict: ERROR */
3526 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "bind on closed socket", io.rc, ARM_SOCKET_ESOCK);
3535 /* Terminate worker thread */
3536 osThreadTerminate (worker);
3539 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3541 /* Listen IO parameters */
3551 /* Assign arguments */
3552 #define ARG_LISTEN(_sock,_backlog) do { \
3554 io.backlog = _backlog; \
3557 /* Listen worker thread */
3558 __NO_RETURN static void Th_Listen (IO_LISTEN *io) {
3562 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
3563 F_BIND | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
3567 /* Create stream socket */
3568 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3572 /* Create datagram socket */
3573 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3578 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
3582 /* Listen on socket */
3583 io->rc = drv->SocketListen (io->sock, io->backlog);
3588 io->rc = drv->SocketClose (io->sock);
3591 /* Done, send signal to owner thread */
3592 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3594 osThreadFlagsSet (io->owner, flags);
3595 osThreadFlagsClear (F_ALL);
3600 \brief Test case: WIFI_SocketListen
3601 \ingroup wifi_sock_api
3603 The test case \b WIFI_SocketListen verifies the WiFi Driver \b SocketListen function:
3605 int32_t (*SocketListen) (int32_t socket, int32_t backlog);
3608 Stream socket test 1:
3609 - Create stream socket
3611 - Check function parameters
3613 - Start listening 2nd time
3616 Stream socket test 2:
3617 - Create stream socket
3618 - Start listening, unbound socket
3620 - Start listening, closed socket
3622 Datagram socket test:
3623 - Create datagram socket
3628 void WIFI_SocketListen (void) {
3629 osThreadId_t worker;
3634 if (socket_funcs_exist == 0U) {
3635 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3639 if (station_init (1) == 0) {
3640 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3644 /* Create worker thread */
3645 worker = osThreadNew ((osThreadFunc_t)Th_Listen, &io, NULL);
3646 if (worker == NULL) {
3647 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3653 /* Create stream socket */
3654 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3656 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3662 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3663 TH_ASSERT (io.rc == 0);
3665 /* Check parameter (socket = -1) */
3667 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3668 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3670 /* Check parameter (socket = INT32_MIN) */
3671 ARG_LISTEN (INT32_MIN, 1);
3672 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3673 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3675 /* Check parameter (socket = INT32_MAX) */
3676 ARG_LISTEN (INT32_MAX, 1);
3677 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3678 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3680 /* Start listening */
3681 ARG_LISTEN (sock, 1);
3682 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3683 TH_ASSERT (io.rc == 0);
3685 /* Start listening 2nd time */
3686 ARG_LISTEN (sock, 1);
3687 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3688 /* Should return error (socket already listening) */
3689 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3690 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "listen on already listening socket", io.rc, ARM_SOCKET_EINVAL);
3694 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3695 TH_ASSERT (io.rc == 0);
3700 /* Create stream socket */
3701 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3703 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3707 /* Start listening, unbound socket */
3708 ARG_LISTEN (sock, 1);
3709 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3710 /* Should return error (socket not bound) */
3711 /* Strict: EINVAL, valid non-strict: ERROR */
3712 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "listen on unbound socket", io.rc, ARM_SOCKET_EINVAL);
3716 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3717 TH_ASSERT (io.rc == 0);
3719 /* Start listening, closed socket */
3720 ARG_LISTEN (sock, 1);
3721 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3722 /* Should return error (socket not created) */
3723 /* Strict: ESOCK, valid non-strict: ERROR */
3724 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "listen on closed socket", io.rc, ARM_SOCKET_ESOCK);
3729 /* Create datagram socket */
3730 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3732 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3738 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3739 TH_ASSERT (io.rc == 0);
3741 /* Start listening */
3742 ARG_LISTEN (sock, 1);
3743 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3744 /* Should return error (operation not supported) */
3745 /* Strict: ENOTSUP, valid non-strict: ERROR */
3746 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "listen on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
3750 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3751 TH_ASSERT (io.rc == 0);
3760 /* Terminate worker thread */
3761 osThreadTerminate (worker);
3764 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3766 /* Accept IO parameters */
3779 /* Assign arguments */
3780 #define ARG_ACCEPT(_sock,_ip,_ip_len,_port) do { \
3783 io.ip_len = _ip_len; \
3787 /* TestAssistant control */
3788 #define TEST_PORT 2000
3790 /* CONNECT <proto>,<ip_addr>,<port>,<delay_ms>
3791 <proto> = protocol (TCP, UDP)
3792 <ip_addr> = IP address (0.0.0.0 = sender address)
3793 <port> = port number
3794 <delay_ms> = startup delay
3796 Example: CONNECT TCP,192.168.1.200,80,600
3797 (wait 600ms then connect to 192.168.1.200, port 80)
3799 #define CMD_CONNECT_TCP "CONNECT TCP,0.0.0.0,2000,500"
3800 #define CMD_CONNECT_UDP "CONNECT UDP,0.0.0.0,2000,200"
3802 /* Accept worker thread */
3803 __NO_RETURN static void Th_Accept (IO_ACCEPT *io) {
3808 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_LISTEN |
3809 F_ACCEPT | F_SEND_CTRL | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
3813 /* Create stream socket */
3814 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3818 /* Create datagram socket */
3819 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3824 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, TEST_PORT);
3828 /* Listen on socket */
3829 io->rc = drv->SocketListen (io->sock, 1);
3833 /* Accept on socket */
3834 io->rc = drv->SocketAccept (io->sock, io->ip, io->ip_len, io->port);
3838 /* Recv on socket (stream, datagram) */
3839 memset((void *)buffer, 0xCC, 16);
3840 io->rc = drv->SocketRecv (io->sock, buffer, 16);
3841 if ((io->rc > 0) && (memcmp ((const void *)buffer, (const void *)"SockServer", 10) != 0)) {
3842 /* Failed if rc <= 0 */
3849 io->rc = drv->SocketClose (io->sock);
3853 /* Send control command to TestAssistant */
3854 sock = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3855 drv->SocketConnect (sock, ip_socket_server, 4, ASSISTANT_PORT);
3856 io->rc = drv->SocketSend (sock, io->cmd, strlen(io->cmd));
3857 drv->SocketClose (sock);
3861 /* Done, send signal to owner thread */
3862 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3864 osThreadFlagsSet (io->owner, flags);
3865 osThreadFlagsClear (F_ALL);
3870 \brief Test case: WIFI_SocketAccept
3871 \ingroup wifi_sock_api
3873 The test case \b WIFI_SocketAccept verifies the WiFi Driver \b SocketAccept function:
3875 int32_t (*SocketAccept) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
3879 - Create stream socket
3882 - Check function parameters
3883 - Accept connection, NULL parameters
3884 - Receive ServerId on accepted socket
3885 - Close accepted socket
3886 - Accept connection again, return IP address and port
3887 - Receive ServerId on accepted socket
3888 - Receive again, server closed connection
3889 - Close accepted socket
3890 - Close listening socket
3891 - Accept again, closed socket
3893 Datagram socket test:
3894 - Create datagram socket
3897 - Accept connection, provide return parameters for IP address and port
3898 - Receive ServerId on socket
3901 void WIFI_SocketAccept (void) {
3905 osThreadId_t worker;
3910 if (socket_funcs_exist == 0U) {
3911 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3915 if (station_init (1) == 0) {
3916 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3920 /* Create worker thread */
3921 worker = osThreadNew ((osThreadFunc_t)Th_Accept, &io, NULL);
3922 if (worker == NULL) {
3923 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3929 /* Create stream socket */
3930 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3932 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3938 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3939 TH_ASSERT (io.rc == 0);
3941 /* Start listening */
3943 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3944 TH_ASSERT (io.rc == 0);
3946 /* Check parameter (socket = -1) */
3947 ip_len = sizeof(ip);
3948 ARG_ACCEPT (-1, ip, &ip_len, &port);
3949 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3950 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3952 /* Check parameter (socket = INT32_MIN) */
3953 ARG_ACCEPT (INT32_MIN, ip, &ip_len, &port);
3954 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3955 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3957 /* Check parameter (socket = INT32_MAX) */
3958 ARG_ACCEPT (INT32_MAX, ip, &ip_len, &port);
3959 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3960 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3962 /* Parameters 'ip', 'ip_len' and 'port' are optional, can be NULL */
3964 /* Request a remote server to connect to us */
3965 io.cmd = CMD_CONNECT_TCP;
3966 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
3967 TH_ASSERT (io.rc > 0);
3969 /* Accept connection with NULL parameters */
3970 ARG_ACCEPT (sock, NULL, NULL, NULL);
3971 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT_LONG);
3972 /* Accepted socket should be different */
3973 TH_ASSERT ((io.rc != io.sock) && (io.rc >= 0));
3975 /* Receive SockServer id string */
3977 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
3978 TH_ASSERT (io.rc > 0);
3980 /* Close accepted socket */
3981 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3982 TH_ASSERT (io.rc == 0);
3986 /* Request from remote server to connect to us */
3987 io.cmd = CMD_CONNECT_TCP;
3988 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
3989 TH_ASSERT (io.rc > 0);
3991 /* Initialize buffers for return values */
3993 ip_len = sizeof(ip) + 1;
3994 memset ((void *)ip, 0, sizeof(ip));
3996 /* Accept again, return ip address and port */
3997 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
3998 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT_LONG);
3999 /* Accepted socket should be different */
4000 TH_ASSERT ((io.rc != io.sock) && (io.rc >= 0));
4001 /* IP address should be the address of the server */
4002 TH_ASSERT ((memcmp ((const void *)ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
4003 /* Port number of remote peer should be non-zero */
4004 TH_ASSERT (port != 0);
4006 /* Receive SockServer id string */
4008 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4009 TH_ASSERT (io.rc > 0);
4011 /* SockServer disconnects after 500ms */
4013 /* Receive again, no data */
4014 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4015 /* Should return error (connection reset) */
4016 /* Strict: ECONNRESET, valid non-strict: ERROR */
4017 TH_ASSERT2 ((io.rc == ARM_SOCKET_ECONNRESET), (io.rc == ARM_SOCKET_ERROR), "receive on disconnected socket", io.rc, ARM_SOCKET_ECONNRESET);
4019 /* Close accepted socket */
4020 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4021 TH_ASSERT (io.rc == 0);
4023 /* Close listening socket */
4025 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4026 TH_ASSERT (io.rc == 0);
4028 /* Accept again, closed socket */
4030 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
4031 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
4032 /* Should return error (socket not created) */
4033 /* Strict: ESOCK, valid non-strict: ERROR */
4034 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "accept on closed socket", io.rc, ARM_SOCKET_ESOCK);
4039 /* Create datagram socket */
4040 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
4042 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
4048 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4049 TH_ASSERT (io.rc == 0);
4051 /* Start listening */
4053 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
4054 /* Listen on datagram socket should fail */
4055 /* Strict: ENOTSUP, valid non-strict: ERROR */
4056 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "listen on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
4058 /* Initialize buffers for return values */
4060 ip_len = sizeof(ip);
4061 memset ((void *)ip, 0, sizeof(ip));
4063 /* Accept on datagram socket */
4064 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
4065 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
4066 /* Accept on datagram socket should fail */
4067 /* Strict: ENOTSUP, valid non-strict: ERROR */
4068 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "accept on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
4072 /* Request from remote server to send us a test message */
4073 io.cmd = CMD_CONNECT_UDP;
4074 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
4075 TH_ASSERT (io.rc > 0);
4077 /* Receive SockServer id string */
4078 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4079 TH_ASSERT (io.rc > 0);
4082 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4083 TH_ASSERT (io.rc == 0);
4092 /* Terminate worker thread */
4093 osThreadTerminate (worker);
4096 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4098 /* Connect IO parameters */
4111 /* Assign arguments */
4112 #define ARG_CONNECT(_sock,_ip,_ip_len,_port) do { \
4115 io.ip_len = _ip_len; \
4119 /* Connect worker thread */
4120 __NO_RETURN static void Th_Connect (IO_CONNECT *io) {
4124 /* Wait for the signal to select and execute the function */
4125 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
4126 F_CONNECT | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
4130 /* Create stream socket */
4131 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
4135 /* Create datagram socket */
4136 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
4141 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
4145 /* Connect on socket */
4146 io->rc = drv->SocketConnect (io->sock, io->ip, io->ip_len, io->port);
4150 /* Listen on socket */
4151 io->rc = drv->SocketListen (io->sock, 1);
4156 io->rc = drv->SocketClose (io->sock);
4159 /* Done, send signal to owner thread */
4160 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4162 osThreadFlagsSet (io->owner, flags);
4163 osThreadFlagsClear (F_ALL);
4168 \brief Test case: WIFI_SocketConnect
4169 \ingroup wifi_sock_api
4171 The test case \b WIFI_SocketConnect verifies the WiFi Driver \b SocketConnect function:
4173 int32_t (*SocketConnect) (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port);
4176 Stream socket test 1:
4177 - Create stream socket
4178 - Check function parameters
4179 - Connect to server, blocking mode
4180 - Connect again, already connected
4181 - Bind connected socket
4183 - Connect on closed socket
4185 Stream socket test 2:
4186 - Create stream socket
4187 - Connect to server, connection rejected
4190 Stream socket test 3:
4191 - Create stream socket
4192 - Connect to server, non-responding or non-existent
4195 Stream socket test 4:
4196 - Create stream socket
4199 - Connect to server, blocking mode
4202 Datagram socket test:
4203 - Create datagram socket
4205 - Check function parameters
4206 - Connect to server, enable address filtering
4207 - Connect to unspecified address, disable filtering
4209 - Connect again, closed socket
4211 void WIFI_SocketConnect (void) {
4212 osThreadId_t worker;
4217 if (socket_funcs_exist == 0U) {
4218 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4222 if (station_init (1) == 0) {
4223 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4227 /* Create worker thread */
4228 worker = osThreadNew ((osThreadFunc_t)Th_Connect, &io, NULL);
4229 if (worker == NULL) {
4230 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4236 /* Create stream socket */
4237 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4239 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4243 /* Check parameter (socket = -1) */
4244 ARG_CONNECT(-1, ip_socket_server, 4, DISCARD_PORT);
4245 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4246 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4248 /* Check parameter (socket = INT32_MIN) */
4249 ARG_CONNECT(INT32_MIN, ip_socket_server, 4, DISCARD_PORT);
4250 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4251 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4253 /* Check parameter (socket = INT32_MAX) */
4254 ARG_CONNECT(INT32_MAX, ip_socket_server, 4, DISCARD_PORT);
4255 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4256 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4258 /* Check parameter (ip = NULL) */
4259 ARG_CONNECT(sock, NULL, 4, DISCARD_PORT);
4260 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4261 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4263 /* Check parameter (ip = 0.0.0.0) */
4264 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4265 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4266 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4268 /* Check parameter (ip_len = 0) */
4269 ARG_CONNECT(sock, ip_socket_server, 0, DISCARD_PORT);
4270 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4271 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4273 /* Check parameter (ip_len = 5) */
4274 ARG_CONNECT(sock, ip_socket_server, 5, DISCARD_PORT);
4275 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4276 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4278 /* Check parameter (port = 0) */
4279 ARG_CONNECT(sock, ip_socket_server, 4, 0);
4280 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4281 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4283 /* Connect to stream server */
4284 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4285 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4286 TH_ASSERT (io.rc == 0);
4288 /* Connect 2nd time */
4289 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4290 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4291 /* Should return error (socket already connected) */
4292 /* Strict: EISCONN, valid non-strict: OK, ERROR */
4293 TH_ASSERT2 ((io.rc == ARM_SOCKET_EISCONN), ((io.rc == 0) || (io.rc == ARM_SOCKET_ERROR)), "connect socket to same address again", io.rc, ARM_SOCKET_EISCONN);
4295 /* Bind connected socket */
4297 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4298 /* Should return error (socket already connected) */
4299 /* Strict: EISCONN, valid non-strict: ERROR */
4300 TH_ASSERT2 ((io.rc == ARM_SOCKET_EISCONN), (io.rc == ARM_SOCKET_ERROR), "bind on connected socket", io.rc, ARM_SOCKET_EISCONN);
4304 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4305 TH_ASSERT (io.rc == 0);
4307 /* Connect again, closed socket */
4308 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4309 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4310 /* Should return error (socket not created) */
4311 /* Strict: ESOCK, valid non-strict: ERROR */
4312 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "connect on closed socket", io.rc, ARM_SOCKET_ESOCK);
4317 /* Create stream socket */
4318 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4320 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4324 /* Connect to stream server (connection rejected) */
4325 ARG_CONNECT(sock, ip_socket_server, 4, TCP_REJECTED_PORT);
4326 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4327 /* Should return error (connection rejected by the peer) */
4328 /* Strict: ECONNREFUSED, valid non-strict: ETIMEDOUT, ERROR */
4329 TH_ASSERT2 ((io.rc == ARM_SOCKET_ECONNREFUSED), ((io.rc == ARM_SOCKET_ETIMEDOUT) || (io.rc == ARM_SOCKET_ERROR)), "connect to non-existent port", io.rc, ARM_SOCKET_ECONNREFUSED);
4333 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4334 TH_ASSERT (io.rc == 0);
4339 /* Create stream socket */
4340 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4342 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4346 /* Connect to stream server (non-existent) */
4347 ARG_CONNECT(sock, ip_socket_server, 4, TCP_TIMEOUT_PORT);
4348 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4349 /* Should return error (connection timeout) */
4350 /* Strict: ETIMEDOUT, valid non-strict: ERROR */
4351 TH_ASSERT2 ((io.rc == ARM_SOCKET_ETIMEDOUT), (io.rc == ARM_SOCKET_ERROR), "connect to non-existent stream server", io.rc, ARM_SOCKET_ETIMEDOUT);
4355 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4356 TH_ASSERT (io.rc == 0);
4361 /* Create stream socket */
4362 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4364 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4370 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4371 TH_ASSERT (io.rc == 0);
4373 /* Start listening */
4375 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
4376 TH_ASSERT (io.rc == 0);
4378 /* Connect to stream server */
4379 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4380 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4381 /* Connect on listening socket should fail */
4382 /* Strict: EINVAL, valid non-strict: ERROR */
4383 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "connect on listening socket", io.rc, ARM_SOCKET_EINVAL);
4387 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4388 TH_ASSERT (io.rc == 0);
4393 /* Create datagram socket */
4394 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
4396 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
4400 /* Check parameter (socket = -1) */
4401 ARG_CONNECT(-1, ip_socket_server, 4, DISCARD_PORT);
4402 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4403 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4405 /* Check parameter (socket = INT32_MIN) */
4406 ARG_CONNECT(INT32_MIN, ip_socket_server, 4, DISCARD_PORT);
4407 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4408 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4410 /* Check parameter (socket = INT32_MAX) */
4411 ARG_CONNECT(INT32_MAX, ip_socket_server, 4, DISCARD_PORT);
4412 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4413 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4415 /* Check parameter (ip = NULL) */
4416 ARG_CONNECT(sock, NULL, 4, DISCARD_PORT);
4417 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4418 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4420 /* Check parameter (ip = 0.0.0.0) */
4421 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4422 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4423 /* Datagram sockets may dissolve the association */
4424 /* by connecting to unspecified address. */
4425 /* Strict: OK, valid non-strict: EINVAL, ERROR */
4426 TH_ASSERT2 ((io.rc == 0), ((io.rc == ARM_SOCKET_EINVAL) || (io.rc == ARM_SOCKET_ERROR)), "connect datagram socket to unspecified address (0.0.0.0)", io.rc, 0);
4428 /* Check parameter (ip_len = 0) */
4429 ARG_CONNECT(sock, ip_socket_server, 0, DISCARD_PORT);
4430 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4431 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4433 /* Check parameter (ip_len = 5) */
4434 ARG_CONNECT(sock, ip_socket_server, 5, DISCARD_PORT);
4435 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4436 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4438 /* Check parameter (port = 0) */
4439 ARG_CONNECT(sock, ip_socket_server, 4, 0);
4440 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4441 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4443 /* Connect to datagram server */
4444 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4445 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4446 TH_ASSERT (io.rc == 0);
4448 /* Connect to unspecified address (0.0.0.0) */
4449 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4450 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4451 /* Datagram sockets may dissolve the association */
4452 /* by connecting to unspecified address. */
4453 /* Should return ok (socket address deleted) */
4454 /* Strict: OK, valid non-strict: EINVAL, ERROR */
4455 TH_ASSERT2 ((io.rc == 0), ((io.rc == ARM_SOCKET_EINVAL) || (io.rc == ARM_SOCKET_ERROR)), "connect datagram socket to unspecified address (0.0.0.0)", io.rc, 0);
4459 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4460 TH_ASSERT (io.rc == 0);
4462 /* Connect again, closed socket */
4463 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4464 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4465 /* Should return error (socket not created) */
4466 /* Strict: ESOCK, valid non-strict: ERROR */
4467 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "connect on closed socket", io.rc, ARM_SOCKET_ESOCK);
4476 /* Terminate worker thread */
4477 osThreadTerminate (worker);
4480 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4482 /* Recv IO parameters */
4494 /* Assign arguments */
4495 #define ARG_RECV(_sock,_buf,_len) do { \
4501 /* Recv worker thread */
4502 __NO_RETURN static void Th_Recv (IO_RECV *io) {
4506 /* Wait for the signal to select and execute the function */
4507 flags = osThreadFlagsWait (F_CREATE_TCP | F_BIND | F_CONNECT | F_LISTEN |
4508 F_SETOPT | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
4512 /* Create stream socket */
4513 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
4518 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
4522 /* Connect on socket */
4523 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, (uint16_t)io->tval);
4527 /* Listen on socket */
4528 io->rc = drv->SocketListen (io->sock, 1);
4532 /* Set socket options */
4533 io->rc = drv->SocketSetOpt (io->sock, ARM_SOCKET_SO_RCVTIMEO, &io->tval, sizeof(io->tval));
4537 /* Recv on socket */
4538 if (io->buf != NULL) {
4539 memset((void *)io->buf, 0xCC, io->len);
4541 io->rc = drv->SocketRecv (io->sock, io->buf, io->len);
4546 io->rc = drv->SocketClose (io->sock);
4549 /* Done, send signal to owner thread */
4550 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4552 osThreadFlagsSet (io->owner, flags);
4553 osThreadFlagsClear (F_ALL);
4558 \brief Test case: WIFI_SocketRecv
4559 \ingroup wifi_sock_api
4561 Test case \b WIFI_SocketRecv verifies the WiFi Driver \b SocketRecv function:
4563 int32_t (*SocketRecv) (int32_t socket, void *buf, uint32_t len);
4566 Stream socket test 1:
4567 - Create stream socket
4568 - Connect to Chargen server
4569 - Check function parameters
4570 - Receive data in blocking mode
4572 - Receive again, closed socket
4574 Stream socket test 2:
4575 - Create stream socket
4576 - Receive data, created socket
4578 - Receive data, bound socket
4580 - Receive data, listening socket
4583 Stream socket test 3:
4584 - Create stream socket
4585 - Connect to Discard server
4586 - Set receive timeout to 1 sec
4587 - Receive data, timeout expires
4590 void WIFI_SocketRecv (void) {
4592 uint32_t ticks,tout;
4593 osThreadId_t worker;
4598 if (socket_funcs_exist == 0U) {
4599 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4603 if (station_init (1) == 0) {
4604 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4608 /* Create worker thread */
4609 worker = osThreadNew ((osThreadFunc_t)Th_Recv, &io, NULL);
4610 if (worker == NULL) {
4611 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4617 /* Create stream socket */
4618 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4620 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4624 /* Connect to stream server */
4626 io.tval = CHARGEN_PORT;
4627 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4628 TH_ASSERT (io.rc == 0);
4630 /* Check parameter (socket = -1) */
4631 ARG_RECV (-1, buf, sizeof(buf));
4632 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4633 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4635 /* Check parameter (socket = INT32_MIN) */
4636 ARG_RECV (INT32_MIN, buf, sizeof(buf));
4637 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4638 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4640 /* Check parameter (socket = INT32_MAX) */
4641 ARG_RECV (INT32_MAX, buf, sizeof(buf));
4642 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4643 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4645 /* Check parameter (buf = NULL) */
4646 ARG_RECV (sock, NULL, sizeof(buf));
4647 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4648 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4650 /* Check parameter (len = 0) */
4651 ARG_RECV (sock, buf, 0);
4652 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4653 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4655 /* Receive some data */
4656 ARG_RECV (sock, buffer, sizeof(buffer));
4657 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4658 TH_ASSERT (io.rc >= 2);
4662 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4663 TH_ASSERT (io.rc == 0);
4665 /* Receive again, closed socket */
4666 ARG_RECV (sock, buffer, sizeof(buffer));
4667 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4668 /* Should return error (socket not created) */
4669 /* Strict: ESOCK, valid non-strict: ERROR */
4670 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "recv on closed socket", io.rc, ARM_SOCKET_ESOCK);
4675 /* Create stream socket */
4676 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4678 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4680 /* Test server mode */
4683 /* Receive, created socket */
4684 ARG_RECV (sock, buffer, sizeof(buffer));
4685 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4686 /* Should return error (socket not connected) */
4687 /* Strict: ENOTCONN, valid non-strict: ERROR */
4688 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on created socket", io.rc, ARM_SOCKET_ENOTCONN);
4692 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4693 TH_ASSERT (io.rc == 0);
4695 /* Receive, bound socket */
4696 ARG_RECV (sock, buffer, sizeof(buffer));
4697 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4698 /* Should return error (socket not connected) */
4699 /* Strict: ENOTCONN, valid non-strict: ERROR */
4700 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
4702 /* Start listening */
4704 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
4705 TH_ASSERT (io.rc == 0);
4707 /* Receive, listening socket */
4708 ARG_RECV (sock, buffer, sizeof(buffer));
4709 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4710 /* Should return error (socket not connected) */
4711 /* Strict: ENOTCONN, valid non-strict: ERROR */
4712 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
4716 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4717 TH_ASSERT (io.rc == 0);
4722 /* Create stream socket */
4723 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4725 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4729 /* Connect to stream server */
4731 io.tval = DISCARD_PORT;
4732 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4733 TH_ASSERT (io.rc == 0);
4735 /* Set receive timeout to 1 sec */
4738 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
4739 TH_ASSERT (io.rc == 0);
4741 /* Receive until timeout, no data */
4742 ARG_RECV (sock, buffer, sizeof(buffer));
4743 ticks = GET_SYSTICK();
4744 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4745 tout = GET_SYSTICK() - ticks;
4746 /* Should return EAGAIN (operation timed out) */
4747 TH_ASSERT (io.rc == ARM_SOCKET_EAGAIN);
4748 /* Check receive timeout is in the range of 0.9 to 1.1 sec */
4749 TH_ASSERT (tout > SYSTICK_MICROSEC(900000) && tout < SYSTICK_MICROSEC(1100000));
4753 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4754 TH_ASSERT (io.rc == 0);
4763 /* Terminate worker thread */
4764 osThreadTerminate (worker);
4767 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4769 /* RecvFrom IO parameters */
4784 /* Assign arguments */
4785 #define ARG_RECVFROM(_sock,_buf,_len,_ip,_ip_len,_port) do { \
4790 io.ip_len = _ip_len; \
4794 /* RecvFrom worker thread */
4795 __NO_RETURN static void Th_RecvFrom (IO_RECVFROM *io) {
4799 /* Wait for the signal to select and execute the function */
4800 flags = osThreadFlagsWait (F_CREATE_UDP | F_CONNECT | F_SETOPT |
4801 F_RECVFROM | F_SEND | F_CLOSE, osFlagsWaitAny, osWaitForever);
4805 /* Create datagram socket */
4806 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
4810 /* Connect on socket */
4811 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, CHARGEN_PORT);
4815 /* Set socket options */
4816 io->rc = drv->SocketSetOpt (io->sock, ARM_SOCKET_SO_RCVTIMEO, &io->tout, sizeof(io->tout));
4820 /* RecvFrom on socket */
4821 if (io->buf != NULL) {
4822 memset((void *)io->buf, 0xCC, io->len);
4824 io->rc = drv->SocketRecvFrom (io->sock, io->buf, io->len, io->ip, io->ip_len, io->port);
4828 /* Send on socket */
4829 io->rc = drv->SocketSend (io->sock, "a", 1);
4834 io->rc = drv->SocketClose (io->sock);
4837 /* Done, send signal to owner thread */
4838 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4840 osThreadFlagsSet (io->owner, flags);
4841 osThreadFlagsClear (F_ALL);
4846 \brief Test case: WIFI_SocketRecvFrom
4847 \ingroup wifi_sock_api
4849 The test case \b WIFI_SocketRecvFrom verifies the WiFi Driver \b SocketRecvFrom function:
4851 int32_t (*SocketRecvFrom) (int32_t socket, void *buf, uint32_t len, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
4854 Datagram socket test 1:
4855 - Create datagram socket
4856 - Connect to Chargen server
4857 - Check function parameters
4858 - Receive data in blocking mode
4859 - Set receive timeout to 1 sec
4860 - Receive again, timeout expires
4862 - Receive again, closed socket
4864 void WIFI_SocketRecvFrom (void) {
4866 uint32_t ip_len,ticks,tout;
4869 osThreadId_t worker;
4874 if (socket_funcs_exist == 0U) {
4875 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4879 if (station_init (1) == 0) {
4880 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4884 /* Create worker thread */
4885 worker = osThreadNew ((osThreadFunc_t)Th_RecvFrom, &io, NULL);
4886 if (worker == NULL) {
4887 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4893 /* Create datagram socket */
4894 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
4896 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
4900 /* Connect to datagram server */
4902 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4903 TH_ASSERT (io.rc == 0);
4905 /* Check parameter (socket = -1) */
4906 ip_len = sizeof(ip);
4907 ARG_RECVFROM (-1, buf, sizeof(buf), ip, &ip_len, &port);
4908 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4909 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4911 /* Check parameter (socket = INT32_MIN) */
4912 ARG_RECVFROM (INT32_MIN, buf, sizeof(buf), ip, &ip_len, &port);
4913 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4914 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4916 /* Check parameter (socket = INT32_MAX) */
4917 ARG_RECVFROM (INT32_MAX, buf, sizeof(buf), ip, &ip_len, &port);
4918 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4919 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4921 /* Check parameter (buf == NULL) */
4922 ARG_RECVFROM (sock, NULL, sizeof(buf), ip, &ip_len, &port);
4923 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4924 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4926 /* Check parameter (len = 0) */
4927 ARG_RECVFROM (sock, buf, 0, ip, &ip_len, &port);
4928 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4929 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4931 /* Send one byte of data to trigger a reply */
4933 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
4934 TH_ASSERT (io.rc == 1);
4936 /* Initialize buffers for return values */
4938 ip_len = sizeof(ip) + 1;
4939 memset ((void *)ip, 0, sizeof(ip));
4941 /* Receive some data */
4942 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
4943 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT_LONG);
4944 /* Should receive at least 2 bytes */
4945 TH_ASSERT (io.rc >= 2);
4946 /* IP address should be the address of the server */
4947 TH_ASSERT ((memcmp ((const void *)ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
4948 /* Port number should be the port of the CHARGEN server */
4949 TH_ASSERT (port == CHARGEN_PORT);
4951 /* Set receive timeout to 1 sec */
4954 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
4955 TH_ASSERT (io.rc == 0);
4957 /* Receive until timeout, no data */
4958 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
4959 ticks = GET_SYSTICK();
4960 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4961 tout = GET_SYSTICK() - ticks;
4962 /* Should return EAGAIN (operation timed out) */
4963 TH_ASSERT (io.rc == ARM_SOCKET_EAGAIN);
4964 /* Check receive timeout is in the range of 0.9 to 1.1 sec */
4965 TH_ASSERT (tout > SYSTICK_MICROSEC(900000) && tout < SYSTICK_MICROSEC(1100000));
4969 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4970 TH_ASSERT (io.rc == 0);
4972 /* Receive again, closed socket */
4973 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
4974 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4975 /* Should return error (socket not created) */
4976 /* Strict: ESOCK, valid non-strict: ERROR */
4977 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "recvfrom on closed socket", io.rc, ARM_SOCKET_ESOCK);
4986 /* Terminate worker thread */
4987 osThreadTerminate (worker);
4990 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4992 /* Send IO parameters */
5003 /* Assign arguments */
5004 #define ARG_SEND(_sock,_buf,_len) do { \
5010 /* Send worker thread */
5011 __NO_RETURN static void Th_Send (IO_SEND *io) {
5015 /* Wait for the signal to select and execute the function */
5016 flags = osThreadFlagsWait (F_CREATE_TCP | F_BIND | F_CONNECT |
5017 F_LISTEN | F_SEND | F_CLOSE, osFlagsWaitAny, osWaitForever);
5021 /* Create stream socket */
5022 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
5027 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
5031 /* Connect on socket */
5032 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
5036 /* Listen on socket */
5037 io->rc = drv->SocketListen (io->sock, 1);
5041 /* Send on socket */
5042 io->rc = drv->SocketSend (io->sock, io->buf, io->len);
5047 io->rc = drv->SocketClose (io->sock);
5050 /* Done, send signal to owner thread */
5051 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5053 osThreadFlagsSet (io->owner, flags);
5054 osThreadFlagsClear (F_ALL);
5059 \brief Test case: WIFI_SocketSend
5060 \ingroup wifi_sock_api
5062 The test case \b WIFI_SocketSend verifies the WiFi Driver \b SocketSend function:
5064 int32_t (*SocketSend) (int32_t socket, const void *buf, uint32_t len);
5067 Stream socket test 1:
5068 - Create stream socket
5069 - Connect to server, blocking mode
5070 - Check function parameters
5071 - Send data, blocking mode
5073 - Send again, closed socket
5075 Stream socket test 2:
5076 - Create stream socket
5077 - Connect to server, blocking mode
5078 - Send ESC data, server disconnects
5079 - Send again, disconnected socket
5082 Stream socket test 3:
5083 - Create stream socket
5084 - Send data, created socket
5086 - Send data, bound socket
5088 - Send data, listening socket
5090 - Send again, closed socket
5092 void WIFI_SocketSend (void) {
5093 osThreadId_t worker;
5098 if (socket_funcs_exist == 0U) {
5099 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5103 if (station_init (1) == 0) {
5104 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5108 /* Create worker thread */
5109 worker = osThreadNew ((osThreadFunc_t)Th_Send, &io, NULL);
5110 if (worker == NULL) {
5111 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5117 /* Create stream socket */
5118 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5120 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5124 /* Connect to stream server */
5126 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5127 TH_ASSERT (io.rc == 0);
5129 /* Check parameter (socket = -1) */
5130 ARG_SEND (-1, test_msg, sizeof(test_msg));
5131 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5132 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5134 /* Check parameter (socket = INT32_MIN) */
5135 ARG_SEND (INT32_MIN, test_msg, sizeof(test_msg));
5136 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5137 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5139 /* Check parameter (socket = INT32_MAX) */
5140 ARG_SEND (INT32_MAX, test_msg, sizeof(test_msg));
5141 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5142 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5144 /* Check parameter (buf = NULL) */
5145 ARG_SEND (sock, NULL, sizeof(test_msg));
5146 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5147 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5149 /* Check parameter (len = 0) */
5150 ARG_SEND (sock, test_msg, 0);
5151 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5152 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5154 /* Send some data */
5155 ARG_SEND (sock, test_msg, sizeof(test_msg));
5156 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
5157 TH_ASSERT (io.rc == sizeof(test_msg));
5161 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5162 TH_ASSERT (io.rc == 0);
5164 /* Send again, closed socket */
5165 ARG_SEND (sock, test_msg, sizeof(test_msg));
5166 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5167 /* Should return error (socket not created) */
5168 /* Strict: ESOCK, valid non-strict: ERROR */
5169 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "send on closed socket", io.rc, ARM_SOCKET_ESOCK);
5174 /* Create stream socket */
5175 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5177 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5181 /* Connect to stream server */
5183 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5184 TH_ASSERT (io.rc == 0);
5186 /* Send ESC command, server disconnects */
5187 ARG_SEND (sock, (uint8_t *)"\x1B", 1);
5188 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
5189 TH_ASSERT (io.rc == 1);
5191 /* Wait for the server to disconnect */
5194 /* Send again, disconnected socket */
5195 ARG_SEND (sock, test_msg, sizeof(test_msg));
5196 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5197 /* Should return error (connection reset by the peer) */
5198 /* Strict: ECONNRESET, valid non-strict: ERROR */
5199 TH_ASSERT2 ((io.rc == ARM_SOCKET_ECONNRESET), (io.rc == ARM_SOCKET_ERROR), "send on disconnected socket", io.rc, ARM_SOCKET_ECONNRESET);
5203 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5204 TH_ASSERT (io.rc == 0);
5209 /* Create stream socket */
5210 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5212 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5216 /* Send data, created socket */
5217 ARG_SEND (sock, test_msg, sizeof(test_msg));
5218 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5219 /* Should return error (socket not connected) */
5220 /* Strict: ENOTCONN, valid non-strict: ERROR */
5221 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on created socket", io.rc, ARM_SOCKET_ENOTCONN);
5225 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5226 TH_ASSERT (io.rc == 0);
5228 /* Send data, bound socket */
5229 ARG_SEND (sock, test_msg, sizeof(test_msg));
5230 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5231 /* Should return error (socket not connected) */
5232 /* Strict: ENOTCONN, valid non-strict: ERROR */
5233 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
5235 /* Start listening */
5237 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
5238 TH_ASSERT (io.rc == 0);
5240 /* Send data, listening socket */
5241 ARG_SEND (sock, test_msg, sizeof(test_msg));
5242 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5243 /* Should return error (socket not connected) */
5244 /* Strict: ENOTCONN, valid non-strict: ERROR */
5245 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
5249 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5250 TH_ASSERT (io.rc == 0);
5252 /* Send again, closed socket */
5253 ARG_SEND (sock, test_msg, sizeof(test_msg));
5254 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5255 /* Should return error (socket not created) */
5256 /* Strict: ESOCK, valid non-strict: ERROR */
5257 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "send on closed socket", io.rc, ARM_SOCKET_ESOCK);
5266 /* Terminate worker thread */
5267 osThreadTerminate (worker);
5270 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5272 /* SendTo IO parameters */
5287 /* Assign arguments */
5288 #define ARG_SENDTO(_sock,_buf,_len,_ip,_ip_len,_port) do { \
5293 io.ip_len = _ip_len; \
5297 /* SendTo worker thread */
5298 __NO_RETURN static void Th_SendTo (IO_SENDTO *io) {
5302 /* Wait for the signal to select and execute the function */
5303 flags = osThreadFlagsWait (F_CREATE_UDP | F_SENDTO | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
5307 /* Create datagram socket */
5308 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5312 /* SendTo on socket */
5313 io->rc = drv->SocketSendTo (io->sock, io->buf, io->len, io->ip, io->ip_len, io->port);
5317 /* Recv on socket */
5318 memset((void *)buffer, 0xCC, sizeof(buffer));
5319 io->rc = drv->SocketRecv (io->sock, buffer, sizeof(buffer));
5324 io->rc = drv->SocketClose (io->sock);
5327 /* Done, send signal to owner thread */
5328 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5330 osThreadFlagsSet (io->owner, flags);
5331 osThreadFlagsClear (F_ALL);
5336 \brief Test case: WIFI_SocketSendTo
5337 \ingroup wifi_sock_api
5339 The test case \b WIFI_SocketSend verifies the WiFi Driver \b SocketSendTo function:
5341 int32_t (*SocketSendTo) (int32_t socket, const void *buf, uint32_t len, const uint8_t *ip, uint32_t ip_len, uint16_t port);
5344 Datagram socket test:
5345 - Create datagram socket
5346 - Check function parameters
5347 - Send data, blocking mode
5348 - Receive echo data, verify if the same
5350 - Send again, closed socket
5352 void WIFI_SocketSendTo (void) {
5353 osThreadId_t worker;
5358 if (socket_funcs_exist == 0U) {
5359 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5363 if (station_init (1) == 0) {
5364 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5368 /* Create worker thread */
5369 worker = osThreadNew ((osThreadFunc_t)Th_SendTo, &io, NULL);
5370 if (worker == NULL) {
5371 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5377 /* Create datagram socket */
5378 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5380 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5384 /* Check parameter (socket = -1) */
5385 ARG_SENDTO (-1, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5386 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5387 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5389 /* Check parameter (socket = INT32_MIN) */
5390 ARG_SENDTO (INT32_MIN, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5391 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5392 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5394 /* Check parameter (socket = INT32_MAX) */
5395 ARG_SENDTO (INT32_MAX, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5396 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5397 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5399 /* Check parameter (buf == NULL) */
5400 ARG_SENDTO (sock, NULL, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5401 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5402 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5404 /* Check parameter (len = 0) */
5405 ARG_SENDTO (sock, test_msg, 0, ip_socket_server, 4, ECHO_PORT);
5406 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5407 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5409 /* Send some data */
5410 ARG_SENDTO (sock, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5411 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT_LONG);
5412 TH_ASSERT (io.rc == sizeof(test_msg));
5414 /* Receive the echoed data */
5416 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
5417 /* Should receive the same data (ECHO protocol) */
5418 TH_ASSERT ((io.rc == sizeof(test_msg)) && (memcmp ((const void *)test_msg, (const void *)buffer, sizeof(test_msg)) == 0));
5422 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5423 TH_ASSERT (io.rc == 0);
5425 /* Send again, closed socket */
5426 ARG_SENDTO (sock, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5427 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5428 /* Should return error (socket not created) */
5429 /* Strict: ESOCK, valid non-strict: ERROR */
5430 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "sendto on closed socket", io.rc, ARM_SOCKET_ESOCK);
5439 /* Terminate worker thread */
5440 osThreadTerminate (worker);
5443 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5445 /* GetSockName IO parameters */
5457 /* Assign arguments */
5458 #define ARG_GETSOCKNAME(_sock,_ip,_ip_len,_port) do { \
5461 io.ip_len = _ip_len; \
5465 /* GetSockName worker thread */
5466 __NO_RETURN static void Th_GetSockName (IO_GETSOCKNAME *io) {
5470 /* Wait for the signal to select and execute the function */
5471 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
5472 F_CONNECT | F_GETSOCKNAME | F_CLOSE, osFlagsWaitAny, osWaitForever);
5476 /* Create stream socket */
5477 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
5481 /* Create datagram socket */
5482 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5487 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
5491 /* Connect on socket */
5492 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
5496 /* Get socket name */
5497 io->rc = drv->SocketGetSockName (io->sock, io->ip, io->ip_len, io->port);
5502 io->rc = drv->SocketClose (io->sock);
5505 /* Done, send signal to owner thread */
5506 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5508 osThreadFlagsSet (io->owner, flags);
5509 osThreadFlagsClear (F_ALL);
5514 \brief Test case: WIFI_SocketGetSockName
5515 \ingroup wifi_sock_api
5517 The test case \b WIFI_SocketGetSockName verifies the WiFi Driver \b SocketGetSockName function:
5519 int32_t (*SocketGetSockName) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
5522 Stream socket test 1:
5523 - Create stream socket
5524 - Connect to server, blocking mode
5525 - Check function parameters
5528 - Get socket name again, closed socket
5530 Stream socket test 1:
5531 - Create stream socket
5532 - Get socket name, not bound
5534 - Get socket name, bound
5537 Datagram socket test 1:
5538 - Create datagram socket
5539 - Connect to server, enable packet filtering
5540 - Check function parameters
5543 - Get socket name again, closed socket
5545 Datagram socket test 1:
5546 - Create datagram socket
5547 - Get socket name, not bound
5549 - Get socket name, bound
5552 void WIFI_SocketGetSockName (void) {
5553 uint8_t local_ip[4];
5554 uint16_t local_port;
5556 osThreadId_t worker;
5561 if (socket_funcs_exist == 0U) {
5562 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5566 if (station_init (1) == 0) {
5567 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5571 /* Create worker thread */
5572 worker = osThreadNew ((osThreadFunc_t)Th_GetSockName, &io, NULL);
5573 if (worker == NULL) {
5574 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5580 /* Create stream socket */
5581 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5583 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5585 /* Test client mode */
5588 /* Connect to stream server */
5590 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5591 TH_ASSERT (io.rc == 0);
5593 /* Check parameter (socket = -1) */
5594 ip_len = sizeof(local_ip);
5595 ARG_GETSOCKNAME (-1, local_ip, &ip_len, &local_port);
5596 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5597 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5599 /* Check parameter (socket = INT32_MIN) */
5600 ARG_GETSOCKNAME (INT32_MIN, local_ip, &ip_len, &local_port);
5601 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5602 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5604 /* Check parameter (socket = INT32_MAX) */
5605 ARG_GETSOCKNAME (INT32_MAX, local_ip, &ip_len, &local_port);
5606 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5607 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5609 /* Check parameter (port = NULL) */
5610 ip_len = sizeof(local_ip);
5611 ARG_GETSOCKNAME (sock, local_ip, &ip_len, NULL);
5612 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5613 /* Request IP address only should be accepted */
5614 TH_ASSERT (io.rc == 0);
5616 /* Check parameter (ip = NULL, ip_len = NULL) */
5617 ARG_GETSOCKNAME (sock, NULL, NULL, &local_port);
5618 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5619 /* Request port only should be accepted */
5620 TH_ASSERT (io.rc == 0);
5622 /* Initialize buffers for return values */
5624 ip_len = sizeof(local_ip) + 1;
5625 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5627 /* Retrieve socket name */
5628 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5629 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5630 TH_ASSERT (io.rc == 0);
5631 /* IP address should be different from broadcast */
5632 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_bcast, 4) != 0) && (ip_len == 4));
5633 /* Port number should be non-zero */
5634 TH_ASSERT (local_port != 0);
5638 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5639 TH_ASSERT (io.rc == 0);
5641 /* Retrieve socket name again */
5642 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5643 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5644 /* Should return error (socket not created) */
5645 /* Strict: ESOCK, valid non-strict: ERROR */
5646 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockname on closed socket", io.rc, ARM_SOCKET_ESOCK);
5651 /* Create stream socket */
5652 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5654 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5656 /* Test server mode */
5659 /* Retrieve socket name, not bound */
5660 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5661 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5662 /* Should return error (socket not bound) */
5663 /* Strict: EINVAL, valid non-strict: ERROR */
5664 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "getsockname on unbound socket", io.rc, ARM_SOCKET_EINVAL);
5666 /* Initialize buffers for return values */
5668 ip_len = sizeof(local_ip) + 1;
5669 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5673 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5674 TH_ASSERT (io.rc == 0);
5676 /* Retrieve socket name, bound */
5677 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5678 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5679 TH_ASSERT (io.rc == 0);
5680 /* IP address should be unspecified */
5681 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_unspec, 4) == 0) && (ip_len == 4));
5682 /* Port number should be listening port */
5683 TH_ASSERT (local_port == DISCARD_PORT);
5687 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5688 TH_ASSERT (io.rc == 0);
5693 /* Create datagram socket */
5694 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5696 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5698 /* Test client mode */
5701 /* Connect to datagram server */
5703 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
5704 TH_ASSERT (io.rc == 0);
5706 /* Check parameter (socket = -1) */
5707 ARG_GETSOCKNAME (-1, local_ip, &ip_len, &local_port);
5708 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5709 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5711 /* Check parameter (socket = INT32_MIN) */
5712 ARG_GETSOCKNAME (INT32_MIN, local_ip, &ip_len, &local_port);
5713 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5714 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5716 /* Check parameter (socket = INT32_MAX) */
5717 ARG_GETSOCKNAME (INT32_MAX, local_ip, &ip_len, &local_port);
5718 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5719 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5721 /* Check parameter (port = NULL) */
5722 ip_len = sizeof(local_ip);
5723 ARG_GETSOCKNAME (sock, local_ip, &ip_len, NULL);
5724 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5725 /* Request IP address only should be accepted */
5726 TH_ASSERT (io.rc == 0);
5728 /* Check parameter (ip = NULL, ip_len = NULL) */
5729 ARG_GETSOCKNAME (sock, NULL, NULL, &local_port);
5730 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5731 /* Request port only should be accepted */
5732 TH_ASSERT (io.rc == 0);
5734 /* Initialize buffers for return values */
5736 ip_len = sizeof(local_ip) + 1;
5737 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5739 /* Retrieve socket name */
5740 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5741 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5742 TH_ASSERT (io.rc == 0);
5743 /* IP address should be different from broadcast */
5744 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_bcast, 4) != 0) && (ip_len == 4));
5745 /* Port number should be non-zero */
5746 TH_ASSERT (local_port != 0);
5750 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5751 TH_ASSERT (io.rc == 0);
5753 /* Retrieve socket name again */
5754 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5755 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5756 /* Should return error (socket not created) */
5757 /* Strict: ESOCK, valid non-strict: ERROR */
5758 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockname on closed socket", io.rc, ARM_SOCKET_ESOCK);
5763 /* Create datagram socket */
5764 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5766 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5768 /* Test server mode */
5771 /* Retrieve socket name, not bound */
5772 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5773 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5774 /* Should return error (socket not bound) */
5775 /* Strict: EINVAL, valid non-strict: ERROR */
5776 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "getsockname on unbound socket", io.rc, ARM_SOCKET_EINVAL);
5778 /* Initialize buffers for return values */
5780 ip_len = sizeof(local_ip) + 1;
5781 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5785 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5786 TH_ASSERT (io.rc == 0);
5788 /* Retrieve socket name, bound */
5789 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5790 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5791 TH_ASSERT (io.rc == 0);
5792 /* IP address should be unspecified */
5793 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_unspec, 4) == 0) && (ip_len == 4));
5794 /* Port number should be listening port */
5795 TH_ASSERT (local_port == DISCARD_PORT);
5799 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5800 TH_ASSERT (io.rc == 0);
5809 /* Terminate worker thread */
5810 osThreadTerminate (worker);
5813 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5815 /* GetPeerName IO parameters */
5827 /* Assign arguments */
5828 #define ARG_GETPEERNAME(_sock,_ip,_ip_len,_port) do { \
5831 io.ip_len = _ip_len; \
5835 /* GetPeerName worker thread */
5836 __NO_RETURN static void Th_GetPeerName (IO_GETPEERNAME *io) {
5840 /* Wait for the signal to select and execute the function */
5841 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_CONNECT |
5842 F_LISTEN | F_GETPEERNAME | F_CLOSE, osFlagsWaitAny, osWaitForever);
5846 /* Create stream socket */
5847 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
5851 /* Create datagram socket */
5852 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5857 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
5861 /* Connect on socket */
5862 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
5866 /* Listen on socket */
5867 io->rc = drv->SocketListen (io->sock, 1);
5872 io->rc = drv->SocketGetPeerName (io->sock, io->ip, io->ip_len, io->port);
5877 io->rc = drv->SocketClose (io->sock);
5880 /* Done, send signal to owner thread */
5881 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5883 osThreadFlagsSet (io->owner, flags);
5884 osThreadFlagsClear (F_ALL);
5889 \brief Test case: WIFI_SocketGetPeerName
5890 \ingroup wifi_sock_api
5892 The test case \b WIFI_SocketGetPeerName verifies the WiFi Driver \b SocketGetPeerName function:
5894 int32_t (*SocketGetPeerName) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
5897 Stream socket test 1:
5898 - Create stream socket
5899 - Connect to server, blocking mode
5900 - Check function parameters
5903 - Get peer name, closed socket
5905 Stream socket test 2:
5906 - Create stream socket
5907 - Get peer name, created socket
5909 - Get peer name, bound socket
5911 - Get peer name, listening socket
5914 Datagram socket test:
5915 - Create datagram socket
5916 - Connect to server, enable packet filtering
5917 - Check function parameters
5920 - Get peer name, closed socket
5922 void WIFI_SocketGetPeerName (void) {
5926 osThreadId_t worker;
5931 if (socket_funcs_exist == 0U) {
5932 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5936 if (station_init (1) == 0) {
5937 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5941 /* Create worker thread */
5942 worker = osThreadNew ((osThreadFunc_t)Th_GetPeerName, &io, NULL);
5943 if (worker == NULL) {
5944 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5950 /* Create stream socket */
5951 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5953 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5957 /* Connect to stream server */
5959 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5960 TH_ASSERT (io.rc == 0);
5962 /* Check parameter (socket = -1) */
5963 ip_len = sizeof(peer_ip);
5964 ARG_GETPEERNAME (-1, peer_ip, &ip_len, &peer_port);
5965 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5966 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5968 /* Check parameter (socket = INT32_MIN) */
5969 ARG_GETPEERNAME (INT32_MIN, peer_ip, &ip_len, &peer_port);
5970 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5971 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5973 /* Check parameter (socket = INT32_MAX) */
5974 ARG_GETPEERNAME (INT32_MAX, peer_ip, &ip_len, &peer_port);
5975 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5976 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5978 /* Check parameter (port = NULL) */
5979 ip_len = sizeof(peer_ip);
5980 ARG_GETPEERNAME (sock, peer_ip, &ip_len, NULL);
5981 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5982 /* Request IP address only should be accepted */
5983 TH_ASSERT (io.rc == 0);
5985 /* Check parameter (ip = NULL, ip_len = NULL) */
5986 ARG_GETPEERNAME (sock, NULL, NULL, &peer_port);
5987 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5988 /* Request port only should be accepted */
5989 TH_ASSERT (io.rc == 0);
5991 /* Initialize buffers for return values */
5993 ip_len = sizeof(peer_ip) + 1;
5994 memcpy (peer_ip, ip_bcast, sizeof(peer_ip));
5996 /* Retrieve peer name */
5997 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
5998 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
5999 TH_ASSERT (io.rc == 0);
6000 /* IP address should be the address of the server */
6001 TH_ASSERT ((memcmp ((const void *)peer_ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
6002 /* Port number should be the DISCARD port */
6003 TH_ASSERT (peer_port == DISCARD_PORT);
6005 /* Close stream socket */
6007 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6008 TH_ASSERT (io.rc == 0);
6010 /* Retrieve peer name again */
6011 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6012 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6013 /* Should return error (socket not created) */
6014 /* Strict: ESOCK, valid non-strict: ERROR */
6015 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getpeername on closed socket", io.rc, ARM_SOCKET_ESOCK);
6020 /* Create stream socket */
6021 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6023 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6027 /* Get peer name, created socket */
6028 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6029 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6030 /* Should return error (socket not connected) */
6031 /* Strict: ENOTCONN, valid non-strict: ERROR */
6032 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on created socket", io.rc, ARM_SOCKET_ENOTCONN);
6036 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
6037 TH_ASSERT (io.rc == 0);
6039 /* Get peer name, bound socket */
6040 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6041 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6042 /* Should return error (socket not connected) */
6043 /* Strict: ENOTCONN, valid non-strict: ERROR */
6044 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
6046 /* Start listening */
6048 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
6049 TH_ASSERT (io.rc == 0);
6051 /* Get peer name, listening socket */
6052 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6053 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6054 /* Should return error (socket not connected) */
6055 /* Strict: ENOTCONN, valid non-strict: ERROR */
6056 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
6060 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6061 TH_ASSERT (io.rc == 0);
6066 /* Create datagram socket */
6067 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6069 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6073 /* Connect to datagram server */
6075 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
6076 TH_ASSERT (io.rc == 0);
6078 /* Check parameter (socket = -1) */
6079 ip_len = sizeof(peer_ip);
6080 ARG_GETPEERNAME (-1, peer_ip, &ip_len, &peer_port);
6081 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6082 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6084 /* Check parameter (socket = INT32_MIN) */
6085 ARG_GETPEERNAME (INT32_MIN, peer_ip, &ip_len, &peer_port);
6086 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6087 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6089 /* Check parameter (socket = INT32_MAX) */
6090 ARG_GETPEERNAME (INT32_MAX, peer_ip, &ip_len, &peer_port);
6091 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6092 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6094 /* Check parameter (port = NULL) */
6095 ip_len = sizeof(peer_ip);
6096 ARG_GETPEERNAME (sock, peer_ip, &ip_len, NULL);
6097 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6098 /* Request IP address only should be accepted */
6099 TH_ASSERT (io.rc == 0);
6101 /* Check parameter (ip = NULL, ip_len = NULL) */
6102 ARG_GETPEERNAME (sock, NULL, NULL, &peer_port);
6103 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6104 /* Request port only should be accepted */
6105 TH_ASSERT (io.rc == 0);
6107 /* Initialize buffers for return values */
6109 ip_len = sizeof(peer_ip) + 1;
6110 memcpy (peer_ip, ip_bcast, sizeof(peer_ip));
6112 /* Retrieve peer name */
6113 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6114 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6115 TH_ASSERT (io.rc == 0);
6116 /* IP address should be the address of the server */
6117 TH_ASSERT ((memcmp ((const void *)peer_ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
6118 /* Port number should be the DISCARD port */
6119 TH_ASSERT (peer_port == DISCARD_PORT);
6123 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6124 TH_ASSERT (io.rc == 0);
6126 /* Retrieve peer name again */
6127 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6128 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6129 /* Should return error (socket not created) */
6130 /* Strict: ESOCK, valid non-strict: ERROR */
6131 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getpeername on closed socket", io.rc, ARM_SOCKET_ESOCK);
6140 /* Terminate worker thread */
6141 osThreadTerminate (worker);
6144 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6146 /* GetOpt IO parameters */
6158 /* Assign arguments */
6159 #define ARG_GETOPT(_sock,_opt_id,_opt_val,_opt_len) do { \
6161 io.opt_id = _opt_id; \
6162 io.opt_val = _opt_val; \
6163 io.opt_len = _opt_len; \
6166 /* GetOpt worker thread */
6167 __NO_RETURN static void Th_GetOpt (IO_GETOPT *io) {
6171 /* Wait for the signal to select and execute the function */
6172 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
6173 F_GETOPT | F_CLOSE, osFlagsWaitAny, osWaitForever);
6177 /* Create stream socket */
6178 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6182 /* Create datagram socket */
6183 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6187 /* Get socket options */
6188 io->rc = drv->SocketGetOpt (io->sock, io->opt_id, io->opt_val, io->opt_len);
6193 io->rc = drv->SocketClose (io->sock);
6196 /* Done, send signal to owner thread */
6197 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6199 osThreadFlagsSet (io->owner, flags);
6200 osThreadFlagsClear (F_ALL);
6205 \brief Test case: WIFI_SocketGetOpt
6206 \ingroup wifi_sock_api
6208 The test case \b WIFI_SocketGetOpt verifies the WiFi Driver \b SocketGetOpt function:
6210 int32_t (*SocketGetOpt) (int32_t socket, int32_t opt_id, void *opt_val, uint32_t *opt_len);
6214 - Create stream socket
6215 - Check function parameters
6216 - Get socket options
6218 - Get socket options again, closed socket
6220 Datagram socket test:
6221 - Create datagram socket
6226 void WIFI_SocketGetOpt (void) {
6229 osThreadId_t worker;
6234 if (socket_funcs_exist == 0U) {
6235 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6239 if (station_init (1) == 0) {
6240 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6244 /* Create worker thread */
6245 worker = osThreadNew ((osThreadFunc_t)Th_GetOpt, &io, NULL);
6246 if (worker == NULL) {
6247 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6253 /* Create stream socket */
6254 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6256 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6260 /* Check parameter (socket = -1) */
6261 opt_len = sizeof(opt_val);
6262 ARG_GETOPT (-1, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6263 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6264 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6266 /* Check parameter (socket = INT32_MIN) */
6267 ARG_GETOPT (INT32_MIN, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6268 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6269 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6271 /* Check parameter (socket = INT32_MAX) */
6272 ARG_GETOPT (INT32_MAX, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6273 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6274 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6276 /* Check parameter (opt_id = -1) */
6277 ARG_GETOPT (sock, -1, &opt_val, &opt_len);
6278 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6279 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6281 /* Check parameter (opt_id = INT32_MIN) */
6282 ARG_GETOPT (sock, INT32_MIN, &opt_val, &opt_len);
6283 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6284 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6286 /* Check parameter (opt_id = INT32_MAX) */
6287 ARG_GETOPT (sock, INT32_MAX, &opt_val, &opt_len);
6288 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6289 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6291 /* Check parameter (opt_val = NULL) */
6292 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, NULL, &opt_len);
6293 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6294 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6296 /* Check parameter (opt_len = NULL) */
6297 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, NULL);
6298 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6299 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6301 /* Check parameter (*opt_len = 0) */
6303 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6304 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6305 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6307 /* Check parameter (*opt_len = 5) */
6309 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6310 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6311 TH_ASSERT ((io.rc == 0) && (opt_len == 4));
6313 /* Get option FIONBIO (set only) */
6314 opt_len = sizeof(opt_val);
6315 ARG_GETOPT (sock, ARM_SOCKET_IO_FIONBIO, &opt_val, &opt_len);
6316 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6317 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6319 /* Get option RCVTIMEO */
6320 opt_len = sizeof(opt_val) + 1;
6321 opt_val = 0xE2A5A241;
6322 ARG_GETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, &opt_len);
6323 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6324 TH_ASSERT (io.rc == 0);
6325 /* Should be different from the initial value */
6326 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6328 /* Get option SNDTIMEO */
6329 opt_len = sizeof(opt_val) + 1;
6330 opt_val = 0xE2A5A241;
6331 ARG_GETOPT (sock, ARM_SOCKET_SO_SNDTIMEO, &opt_val, &opt_len);
6332 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6333 TH_ASSERT (io.rc == 0);
6334 /* Should be different from the initial value */
6335 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6337 /* Get option KEEPALIVE */
6338 opt_len = sizeof(opt_val) + 1;
6339 opt_val = 0xE2A5A241;
6340 ARG_GETOPT (sock, ARM_SOCKET_SO_KEEPALIVE, &opt_val, &opt_len);
6341 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6342 TH_ASSERT (io.rc == 0);
6343 /* Should be different from the initial value */
6344 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6346 /* Get option socket TYPE */
6347 opt_len = sizeof(opt_val) + 1;
6348 opt_val = UINT32_MAX;
6349 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6350 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6351 TH_ASSERT (io.rc == 0);
6352 /* Should be SOCK_STREAM type */
6353 TH_ASSERT ((opt_val == ARM_SOCKET_SOCK_STREAM) && (opt_len == 4));
6355 /* Close stream socket */
6357 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6358 TH_ASSERT (io.rc == 0);
6360 /* Get option socket TYPE again */
6361 opt_len = sizeof(opt_val);
6362 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6363 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6364 /* Should return error (socket not created) */
6365 /* Strict: ESOCK, valid non-strict: ERROR */
6366 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6371 /* Create datagram socket */
6372 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6374 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6378 /* Get option socket TYPE */
6379 opt_len = sizeof(opt_val) + 1;
6380 opt_val = UINT32_MAX;
6381 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6382 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6383 TH_ASSERT (io.rc == 0);
6384 /* Should be SOCK_DGRAM type */
6385 TH_ASSERT ((opt_val == ARM_SOCKET_SOCK_DGRAM) && (opt_len == 4));
6389 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6390 TH_ASSERT (io.rc == 0);
6392 /* Get option socket TYPE again */
6393 opt_len = sizeof(opt_val);
6394 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6395 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6396 /* Should return error (socket not created) */
6397 /* Strict: ESOCK, valid non-strict: ERROR */
6398 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6407 /* Terminate worker thread */
6408 osThreadTerminate (worker);
6411 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6413 /* SetOpt IO parameters */
6417 const void *opt_val;
6425 /* Assign arguments */
6426 #define ARG_SETOPT(_sock,_opt_id,_opt_val,_opt_len) do { \
6428 io.opt_id = _opt_id; \
6429 io.opt_val = _opt_val; \
6430 io.opt_len = _opt_len; \
6433 /* SetOpt worker thread */
6434 __NO_RETURN static void Th_SetOpt (IO_SETOPT *io) {
6438 /* Wait for the signal to select and execute the function */
6439 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_SETOPT | F_CLOSE, osFlagsWaitAny, osWaitForever);
6443 /* Create stream socket */
6444 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6448 /* Create datagram socket */
6449 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6453 /* Set socket options */
6454 io->rc = drv->SocketSetOpt (io->sock, io->opt_id, io->opt_val, io->opt_len);
6459 io->rc = drv->SocketClose (io->sock);
6462 /* Done, send signal to owner thread */
6463 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6465 osThreadFlagsSet (io->owner, flags);
6466 osThreadFlagsClear (F_ALL);
6471 \brief Test case: WIFI_SocketSetOpt
6472 \ingroup wifi_sock_api
6474 The test case \b WIFI_SocketSetOpt verifies the WiFi Driver \b SocketSetOpt function:
6476 int32_t (*SocketSetOpt) (int32_t socket, int32_t opt_id, const void *opt_val, uint32_t opt_len);
6480 - Create stream socket
6481 - Check function parameters
6482 - Set socket options
6484 - Set socket option again, closed socket
6486 Datagram socket test:
6487 - Create datagram socket
6488 - Set socket options
6490 - Set socket option again, closed socket
6493 void WIFI_SocketSetOpt (void) {
6495 osThreadId_t worker;
6500 if (socket_funcs_exist == 0U) {
6501 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6505 if (station_init (1) == 0) {
6506 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6510 /* Create worker thread */
6511 worker = osThreadNew ((osThreadFunc_t)Th_SetOpt, &io, NULL);
6512 if (worker == NULL) {
6513 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6519 /* Create stream socket */
6520 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6522 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6526 /* Check parameter (socket = -1) */
6528 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6529 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6530 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6532 /* Check parameter (socket = INT32_MIN) */
6533 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6534 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6535 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6537 /* Check parameter (socket = INT32_MAX) */
6538 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6539 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6540 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6542 /* Check parameter (opt_id = -1) */
6543 ARG_SETOPT (sock, -1, &opt_val, sizeof(opt_val));
6544 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6545 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6547 /* Check parameter (opt_id = INT32_MIN) */
6548 ARG_SETOPT (sock, INT32_MIN, &opt_val, sizeof(opt_val));
6549 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6550 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6552 /* Check parameter (opt_id = INT32_MAX) */
6553 ARG_SETOPT (sock, INT32_MAX, &opt_val, sizeof(opt_val));
6554 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6555 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6557 /* Check parameter (opt_val = NULL) */
6558 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, NULL, sizeof(opt_val));
6559 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6560 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6562 /* Check parameter (opt_len = 0) */
6563 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, 0);
6564 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6565 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6567 /* Check parameter (opt_len = 3) */
6568 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, 3);
6569 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6570 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6572 /* Set option FIONBIO (set only) */
6574 ARG_SETOPT (sock, ARM_SOCKET_IO_FIONBIO, &opt_val, sizeof(opt_val));
6575 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6576 TH_ASSERT (io.rc == 0);
6578 /* Set option RCVTIMEO */
6580 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6581 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6582 TH_ASSERT (io.rc == 0);
6584 /* Set option SNDTIMEO */
6586 ARG_SETOPT (sock, ARM_SOCKET_SO_SNDTIMEO, &opt_val, sizeof(opt_val));
6587 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6588 TH_ASSERT (io.rc == 0);
6590 /* Set option KEEPALIVE */
6592 ARG_SETOPT (sock, ARM_SOCKET_SO_KEEPALIVE, &opt_val, sizeof(opt_val));
6593 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6594 TH_ASSERT (io.rc == 0);
6596 /* Set option socket TYPE (get only) */
6597 opt_val = ARM_SOCKET_SOCK_STREAM;
6598 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, sizeof(opt_val));
6599 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6600 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6602 /* Close stream socket */
6604 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6605 TH_ASSERT (io.rc == 0);
6607 /* Set option RCVTIMEO again */
6609 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6610 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6611 /* Should return error (socket not created) */
6612 /* Strict: ESOCK, valid non-strict: ERROR */
6613 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "setsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6618 /* Create datagram socket */
6619 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6621 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6625 /* Set option RCVTIMEO */
6627 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6628 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6629 TH_ASSERT (io.rc == 0);
6633 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6634 TH_ASSERT (io.rc == 0);
6636 /* Set option RCVTIMEO again */
6637 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6638 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6639 /* Should return error (socket not created) */
6640 /* Strict: ESOCK, valid non-strict: ERROR */
6641 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "setsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6650 /* Terminate worker thread */
6651 osThreadTerminate (worker);
6654 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6656 /* Close IO parameters */
6665 /* Assign arguments */
6666 #define ARG_CLOSE(_sock) do { \
6670 /* Close worker thread */
6671 __NO_RETURN static void Th_Close (IO_CLOSE *io) {
6675 /* Wait for the signal to select and execute the function */
6676 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
6677 F_CONNECT | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
6681 /* Create stream socket */
6682 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6686 /* Create datagram socket */
6687 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6692 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
6696 /* Connect on socket */
6697 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
6701 /* Listen on socket */
6702 io->rc = drv->SocketListen (io->sock, 1);
6707 io->rc = drv->SocketClose (io->sock);
6710 /* Done, send signal to owner thread */
6711 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6713 osThreadFlagsSet (io->owner, flags);
6714 osThreadFlagsClear (F_ALL);
6719 \brief Test case: WIFI_SocketClose
6720 \ingroup wifi_sock_api
6722 The test case \b WIFI_SocketClose verifies the WiFi Driver \b SocketClose function:
6724 int32_t (*SocketClose) (int32_t socket);
6727 Stream socket test 1:
6728 - Create stream socket
6731 - Check function parameters
6733 - Close socket again
6735 Stream socket test 2:
6736 - Create stream socket
6740 - Close socket again
6742 Datagram socket test:
6743 - Create datagram socket
6745 - Check function parameters
6747 - Close socket again
6749 void WIFI_SocketClose (void) {
6750 osThreadId_t worker;
6755 if (socket_funcs_exist == 0U) {
6756 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6760 if (station_init (1) == 0) {
6761 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6765 /* Create worker thread */
6766 worker = osThreadNew ((osThreadFunc_t)Th_Close, &io, NULL);
6767 if (worker == NULL) {
6768 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6774 /* Create stream socket */
6775 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6777 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6781 /* Connect to stream server */
6783 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
6784 TH_ASSERT (io.rc == 0);
6786 /* Check parameter (socket = -1) */
6788 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6789 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6791 /* Check parameter (socket = INT32_MIN) */
6792 ARG_CLOSE (INT32_MIN);
6793 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6794 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6796 /* Check parameter (socket = INT32_MAX) */
6797 ARG_CLOSE (INT32_MAX);
6798 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6799 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6803 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6804 TH_ASSERT (io.rc == 0);
6806 /* Close again, closed socket */
6808 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6809 /* Should return error (socket not created) */
6810 /* Strict: ESOCK, valid non-strict: OK */
6811 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6816 /* Create stream socket */
6817 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6819 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6825 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
6826 TH_ASSERT (io.rc == 0);
6828 /* Start listening */
6830 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
6831 TH_ASSERT (io.rc == 0);
6835 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6836 TH_ASSERT (io.rc == 0);
6838 /* Close again, closed socket */
6840 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6841 /* Should return error (socket not created) */
6842 /* Strict: ESOCK, valid non-strict: OK */
6843 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6848 /* Create datagram socket */
6849 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6851 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6857 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
6858 TH_ASSERT (io.rc == 0);
6860 /* Check parameter (socket = -1) */
6862 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6863 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6865 /* Check parameter (socket = INT32_MIN) */
6866 ARG_CLOSE (INT32_MIN);
6867 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6868 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6870 /* Check parameter (socket = INT32_MAX) */
6871 ARG_CLOSE (INT32_MAX);
6872 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6873 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6877 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6878 TH_ASSERT (io.rc == 0);
6880 /* Close again, closed socket */
6882 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6883 /* Should return error (socket not created) */
6884 /* Strict: ESOCK, valid non-strict: OK */
6885 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6894 /* Terminate worker thread */
6895 osThreadTerminate (worker);
6898 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6900 /* GetHostByName IO parameters */
6912 /* Assign arguments */
6913 #define ARG_GETHOST(_name,_af,_ip,_ip_len) do { \
6917 io.ip_len = _ip_len; \
6920 /* GetHostByName worker thread */
6921 __NO_RETURN static void Th_GetHostByName (IO_GETHOST *io) {
6925 /* Wait for the signal to select and execute the function */
6926 flags = osThreadFlagsWait (F_GETHOSTBYNAME, osFlagsWaitAny, osWaitForever);
6929 case F_GETHOSTBYNAME:
6931 io->rc = drv->SocketGetHostByName (io->name, io->af, io->ip, io->ip_len);
6934 /* Done, send signal to owner thread */
6935 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6937 osThreadFlagsSet (io->owner, flags);
6938 osThreadFlagsClear (F_ALL);
6943 \brief Test case: WIFI_SocketGetHostByName
6944 \ingroup wifi_sock_api
6946 The test case \b WIFI_SocketGetHostByName the WiFi Driver \b SocketGetHostByName function:
6948 int32_t (*SocketGetHostByName) (const char *name, int32_t af, uint8_t *ip, uint32_t *ip_len);
6952 - Check function parameters
6954 - Resolve non-existent host
6957 This test requires internet connectivity to DNS server.
6959 void WIFI_SocketGetHostByName (void) {
6960 const char *host_name = "www.arm.com";
6963 osThreadId_t worker;
6967 if (socket_funcs_exist == 0U) {
6968 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6972 if (station_init (1) == 0) {
6973 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6977 /* Create worker thread */
6978 worker = osThreadNew ((osThreadFunc_t)Th_GetHostByName, &io, NULL);
6979 if (worker == NULL) {
6980 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6986 /* Check parameter (name = NULL) */
6987 ip_len = sizeof(host_ip);
6988 ARG_GETHOST(NULL, ARM_SOCKET_AF_INET, host_ip, &ip_len);
6989 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6990 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6992 /* Check parameter (af = -1) */
6993 ARG_GETHOST(host_name, -1, host_ip, &ip_len);
6994 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
6995 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6997 /* Check parameter (af = INT32_MIN) */
6998 ARG_GETHOST(host_name, INT32_MIN, host_ip, &ip_len);
6999 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7000 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7002 /* Check parameter (af = INT32_MAX) */
7003 ARG_GETHOST(host_name, INT32_MAX, host_ip, &ip_len);
7004 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7005 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7007 /* Check parameter (ip = NULL) */
7008 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, NULL, &ip_len);
7009 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7010 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7012 /* Check parameter (ip_len = NULL) */
7013 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, NULL);
7014 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7015 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7017 /* Check parameter (*ip_len = 0) */
7019 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
7020 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7021 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7023 /* Check parameter (*ip_len = 3) */
7025 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
7026 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7027 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7029 /* Resolve valid host */
7030 ip_len = sizeof(host_ip) + 1;
7031 memset((void *)host_ip, 0, sizeof(host_ip));
7032 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
7033 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT_LONG);
7034 /* IP address should be valid */
7035 TH_ASSERT ((memcmp((const void *)host_ip, (const void *)ip_unspec, 4) != 0) && (ip_len == 4));
7037 /* Resolve non-existent host */
7038 ip_len = sizeof(host_ip);
7039 ARG_GETHOST("non.existent.host", ARM_SOCKET_AF_INET, host_ip, &ip_len);
7040 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT_LONG);
7041 /* Should return error (host not found) */
7042 /* Strict: EHOSTNOTFOUND, valid non-strict: ERROR */
7043 TH_ASSERT2 ((io.rc == ARM_SOCKET_EHOSTNOTFOUND), (io.rc == ARM_SOCKET_ERROR), "gethostbyname for non-existing host", io.rc, ARM_SOCKET_EHOSTNOTFOUND);
7049 /* Terminate worker thread */
7050 osThreadTerminate (worker);
7053 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
7055 /* Ping IO parameters */
7065 /* Assign arguments */
7066 #define ARG_PING(_ip,_ip_len) do { \
7068 io.ip_len = _ip_len; \
7071 /* Ping worker thread */
7072 __NO_RETURN static void Th_Ping (IO_PING *io) {
7076 /* Wait for the signal to select and execute the function */
7077 flags = osThreadFlagsWait (F_PING, osFlagsWaitAny, osWaitForever);
7082 io->rc = drv->Ping (io->ip, io->ip_len);
7085 /* Done, send signal to owner thread */
7086 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
7088 osThreadFlagsSet (io->owner, flags);
7089 osThreadFlagsClear (F_ALL);
7094 \brief Test case: WIFI_Ping
7095 \ingroup wifi_sock_api
7097 The test case \b WIFI_Ping verifies the WiFi Driver \b Ping function:
7099 int32_t (*Ping) (const uint8_t *ip, uint32_t ip_len);
7103 - Check function parameters
7106 void WIFI_Ping (void) {
7107 osThreadId_t worker;
7111 if (drv->Ping == NULL) {
7112 TEST_ASSERT_MESSAGE(0,"[FAILED] Ping function not available");
7116 if (station_init (1) == 0) {
7117 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7121 /* Create worker thread */
7122 worker = osThreadNew ((osThreadFunc_t)Th_Ping, &io, NULL);
7123 if (worker == NULL) {
7124 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7130 /* Check parameter (ip = NULL) */
7132 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7133 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7135 /* Check parameter (ip_len = 0) */
7136 ARG_PING (ip_socket_server, 0);
7137 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7138 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7140 /* Check parameter (ip_len = 5) */
7141 ARG_PING (ip_socket_server, 5);
7142 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7143 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7146 ARG_PING (ip_socket_server, 4);
7147 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7148 TH_ASSERT (io.rc == ARM_DRIVER_OK);
7154 /* Terminate worker thread */
7155 osThreadTerminate (worker);
7158 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
7161 \defgroup wifi_sock_op WiFi Socket Operation
7164 These tests verify operation of the WiFi socket functions.
7167 /* Worker thread is used for the following tests:
7168 - WIFI_Transfer_Fixed
7169 - WIFI_Transfer_Incremental
7170 - WIFI_Send_Fragmented
7171 - WIFI_Recv_Fragmented
7173 - WIFI_Concurrent_Socket
7176 /* Transfer IO parameters */
7187 /* Assign arguments */
7188 #define ARG_TRANSFER(_sock,_len,_size) do { \
7194 /* Transfer worker thread */
7195 __NO_RETURN static void Th_Transfer (IO_TRANSFER *io) {
7196 uint32_t flags,xid,i;
7200 /* Wait for the signal to select and execute the function */
7201 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
7202 F_CONNECT | F_CLOSE |
7203 F_XFER_FIXED | F_XFER_INCR |
7204 F_SEND_FRAG | F_RECV_FRAG, osFlagsWaitAny, osWaitForever);
7208 /* Create stream socket */
7209 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
7213 /* Create datagram socket */
7214 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
7218 /* Connect on socket */
7219 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, ECHO_PORT);
7224 io->rc = drv->SocketClose (io->sock);
7228 /* Transfer Fixed size blocks */
7229 memset ((void *)buffer, 0xCC, io->len);
7230 /* Send and receive in small blocks */
7231 for (i = 0; i < io->len; i += io->size) {
7232 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7234 rc = drv->SocketRecv (io->sock, &buffer[i], io->size);
7237 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7244 /* Transfer Increased size blocks */
7245 memset ((void *)buffer, 0xCC, io->len);
7246 /* Send and receive in enlarged block sizes */
7247 for (i = 0; i < io->len; i += io->size++) {
7248 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7250 rc = drv->SocketRecv (io->sock, &buffer[i], io->size);
7253 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7260 /* Send Fragmented blocks */
7261 memset ((void *)buffer, 0xCC, io->len);
7262 /* Send in small blocks */
7263 for (i = 0; i < io->len; i += io->size) {
7264 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7267 /* Receive in single block */
7269 /* Small delay that blocks are received */
7271 for (i = 0; i < io->len; i += (uint32_t)rc) {
7272 /* Returns any data available, up to requested amount */
7273 rc = drv->SocketRecv (io->sock, &buffer[i], io->len-i);
7276 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7284 /* Receive Fragmented blocks */
7285 memset ((void *)buffer, 0xCC, io->len);
7286 /* Send single block */
7287 rc = drv->SocketSend (io->sock, test_buf, io->len);
7290 /* Receive in small blocks */
7291 for (i = 0; i < io->len; i += io->size) {
7292 rc = drv->SocketRecv (io->sock, &buffer[i], io->size);
7294 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7301 /* Done, send signal to owner thread */
7302 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
7304 osThreadFlagsSet (io->owner, flags);
7305 osThreadFlagsClear (F_ALL);
7310 \brief Test case: WIFI_Transfer_Fixed
7311 \ingroup wifi_sock_op
7313 The test case \b WIFI_Transfer_Fixed verifies data transfer in fixed size blocks.
7316 - Create stream socket
7317 - Transfer 128 blocks of 16 bytes
7318 - Transfer 32 blocks of 64 bytes
7319 - Transfer 8 blocks of 256 bytes
7320 - Transfer 2 blocks of 1024 bytes
7321 - Transfer 1 block of 1440 bytes
7324 Datagram socket test:
7325 - Create datagram socket
7326 - Transfer 128 blocks of 16 bytes
7327 - Transfer 32 blocks of 64 bytes
7328 - Transfer 8 blocks of 256 bytes
7329 - Transfer 2 blocks of 1024 bytes
7330 - Transfer 1 block of 1460 bytes
7333 void WIFI_Transfer_Fixed (void) {
7334 osThreadId_t worker;
7339 if (station_init (1) == 0) {
7340 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7344 /* Create worker thread */
7345 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7346 if (worker == NULL) {
7347 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7353 /* Create stream socket */
7354 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7356 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7360 /* Connect to stream server */
7362 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7363 TH_ASSERT (io.rc == 0);
7365 /* Transfer 16-byte block(s) */
7366 ARG_TRANSFER (sock, 2048, 16);
7367 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7368 TH_ASSERT (io.rc == 2048);
7370 /* Transfer 64-byte block(s) */
7371 ARG_TRANSFER (sock, 2048, 64);
7372 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7373 TH_ASSERT (io.rc == 2048);
7375 /* Transfer 256-byte block(s) */
7376 ARG_TRANSFER (sock, 2048, 256);
7377 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7378 TH_ASSERT (io.rc == 2048);
7380 /* Transfer 1024-byte block(s) */
7381 ARG_TRANSFER (sock, 2048, 1024);
7382 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7383 TH_ASSERT (io.rc == 2048);
7385 /* Transfer 1440-byte block */
7386 ARG_TRANSFER (sock, 1440, 1440);
7387 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7388 TH_ASSERT (io.rc == 1440);
7390 /* Close stream socket */
7392 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7393 TH_ASSERT (io.rc == 0);
7398 /* Create datagram socket */
7399 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7401 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7405 /* Connect to datagram server */
7407 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7408 TH_ASSERT (io.rc == 0);
7410 /* Transfer 16-byte block(s) */
7411 ARG_TRANSFER (sock, 2048, 16);
7412 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7413 TH_ASSERT (io.rc == 2048);
7415 /* Transfer 64-byte block(s) */
7416 ARG_TRANSFER (sock, 2048, 64);
7417 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7418 TH_ASSERT (io.rc == 2048);
7420 /* Transfer 256-byte block(s) */
7421 ARG_TRANSFER (sock, 2048, 256);
7422 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7423 TH_ASSERT (io.rc == 2048);
7425 /* Transfer 1024-byte block(s) */
7426 ARG_TRANSFER (sock, 2048, 1024);
7427 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7428 TH_ASSERT (io.rc == 2048);
7430 /* Transfer 1460-byte block */
7431 ARG_TRANSFER (sock, 1460, 1460);
7432 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7433 TH_ASSERT (io.rc == 1460);
7435 /* Close datagram socket */
7437 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7438 TH_ASSERT (io.rc == 0);
7447 /* Terminate worker thread */
7448 osThreadTerminate (worker);
7452 \brief Test case: WIFI_Transfer_Incremental
7453 \ingroup wifi_sock_op
7455 The test case \b WIFI_Transfer_Incremental verifies data transfer in ascending size blocks.
7456 Each subsequent block that the socket sends is one byte larger than the previous block.
7459 - Create stream socket
7460 - Transfer 51 blocks of 1 - 50 bytes
7461 - Transfer 30 blocks of 51 - 80 bytes
7462 - Transfer 20 blocks of 81 - 100 bytes
7463 - Transfer 13 blocks of 120 - 132 bytes
7464 - Transfer 8 blocks of 252 - 259 bytes
7465 - Transfer 4 blocks of 510 - 513 bytes
7468 Datagram socket test:
7469 - Create datagram socket
7470 - Transfer 51 blocks of 1 - 50 bytes
7471 - Transfer 30 blocks of 51 - 80 bytes
7472 - Transfer 20 blocks of 81 - 100 bytes
7473 - Transfer 13 blocks of 120 - 132 bytes
7474 - Transfer 8 blocks of 252 - 259 bytes
7475 - Transfer 4 blocks of 510 - 513 bytes
7478 void WIFI_Transfer_Incremental (void) {
7479 osThreadId_t worker;
7484 if (station_init (1) == 0) {
7485 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7489 /* Create worker thread */
7490 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7491 if (worker == NULL) {
7492 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7498 /* Create stream socket */
7499 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7501 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7505 /* Connect to stream server */
7507 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7508 TH_ASSERT (io.rc == 0);
7510 /* Transfer 1 byte - 50 byte blocks */
7511 ARG_TRANSFER (sock, 1275, 1);
7512 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7513 TH_ASSERT (io.rc == 1275);
7515 /* Transfer 51 byte - 80-byte blocks */
7516 ARG_TRANSFER (sock, 1965, 51);
7517 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7518 TH_ASSERT (io.rc == 1965);
7520 /* Transfer 81 byte - 100 byte blocks */
7521 ARG_TRANSFER (sock, 1810, 81);
7522 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7523 TH_ASSERT (io.rc == 1810);
7525 /* Transfer 120 byte - 132 byte blocks */
7526 ARG_TRANSFER (sock, 1905, 120);
7527 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7528 TH_ASSERT (io.rc == 1905);
7530 /* Transfer 252 byte - 259 byte blocks */
7531 ARG_TRANSFER (sock, 2044, 252);
7532 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7533 TH_ASSERT (io.rc == 2044);
7535 /* Transfer 510 byte - 513 byte blocks */
7536 ARG_TRANSFER (sock, 2046, 510);
7537 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7538 TH_ASSERT (io.rc == 2046);
7540 /* Close stream socket */
7542 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7543 TH_ASSERT (io.rc == 0);
7548 /* Create datagram socket */
7549 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7551 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7555 /* Connect to datagram server */
7557 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7558 TH_ASSERT (io.rc == 0);
7560 /* Transfer 1 byte - 50 byte blocks */
7561 ARG_TRANSFER (sock, 1275, 1);
7562 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7563 TH_ASSERT (io.rc == 1275);
7565 /* Transfer 51 byte - 80-byte blocks */
7566 ARG_TRANSFER (sock, 1965, 51);
7567 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7568 TH_ASSERT (io.rc == 1965);
7570 /* Transfer 81 byte - 100 byte blocks */
7571 ARG_TRANSFER (sock, 1810, 81);
7572 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7573 TH_ASSERT (io.rc == 1810);
7575 /* Transfer 120 byte - 132 byte blocks */
7576 ARG_TRANSFER (sock, 1905, 120);
7577 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7578 TH_ASSERT (io.rc == 1905);
7580 /* Transfer 252 byte - 259 byte blocks */
7581 ARG_TRANSFER (sock, 2044, 252);
7582 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7583 TH_ASSERT (io.rc == 2044);
7585 /* Transfer 510 byte - 513 byte blocks */
7586 ARG_TRANSFER (sock, 2046, 510);
7587 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7588 TH_ASSERT (io.rc == 2046);
7590 /* Close datagram socket */
7592 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7593 TH_ASSERT (io.rc == 0);
7602 /* Terminate worker thread */
7603 osThreadTerminate (worker);
7607 \brief Test case: WIFI_Send_Fragmented
7608 \ingroup wifi_sock_op
7610 The test case \b WIFI_Send_Fragmented verifies data transfer in chunks.
7613 - Create stream socket
7614 - Send 16 blocks of 16 bytes, receive 1 block of 256 bytes
7615 - Send 16 blocks of 64 bytes, receive 1 block of 1024 bytes
7616 - Send 5 blocks of 256 bytes, receive 1 block of 1280 bytes
7617 - Send 2 blocks of 720 bytes, receive 1 block of 1440 bytes
7620 void WIFI_Send_Fragmented (void) {
7621 osThreadId_t worker;
7626 if (station_init (1) == 0) {
7627 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7631 /* Create worker thread */
7632 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7633 if (worker == NULL) {
7634 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7640 /* Create stream socket */
7641 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7643 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7647 /* Connect to stream server */
7649 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7650 TH_ASSERT (io.rc == 0);
7652 /* Transfer 16-byte block(s) */
7653 ARG_TRANSFER (sock, 256, 16);
7654 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7655 TH_ASSERT (io.rc == 256);
7657 /* Transfer 64-byte block(s) */
7658 ARG_TRANSFER (sock, 1024, 64);
7659 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7660 TH_ASSERT (io.rc == 1024);
7662 /* Transfer 256-byte block(s) */
7663 ARG_TRANSFER (sock, 1280, 256);
7664 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7665 TH_ASSERT (io.rc == 1280);
7667 /* Transfer 1024-byte block(s) */
7668 ARG_TRANSFER (sock, 1440, 720);
7669 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7670 TH_ASSERT (io.rc == 1440);
7672 /* Close stream socket */
7674 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7675 TH_ASSERT (io.rc == 0);
7684 /* Terminate worker thread */
7685 osThreadTerminate (worker);
7689 \brief Test case: WIFI_Recv_Fragmented
7690 \ingroup wifi_sock_op
7692 The test case \b WIFI_Recv_Fragmented verifies data transfer in chunks.
7695 - Create stream socket
7696 - Send block of 256 bytes, receive 16 blocks of 16 bytes
7697 - Send block of 1024 bytes, receive 16 blocks of 64 bytes
7698 - Send block of 1280 bytes, receive 5 blocks of 256 bytes
7699 - Send block of 1440 bytes, receive 2 blocks of 720 bytes
7702 void WIFI_Recv_Fragmented (void) {
7703 osThreadId_t worker;
7708 if (station_init (1) == 0) {
7709 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7713 /* Create worker thread */
7714 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7715 if (worker == NULL) {
7716 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7722 /* Create stream socket */
7723 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7725 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7729 /* Connect to stream server */
7731 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7732 TH_ASSERT (io.rc == 0);
7734 /* Transfer 16-byte block(s) */
7735 ARG_TRANSFER (sock, 256, 16);
7736 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7737 TH_ASSERT (io.rc == 256);
7739 /* Transfer 64-byte block(s) */
7740 ARG_TRANSFER (sock, 1024, 64);
7741 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7742 TH_ASSERT (io.rc == 1024);
7744 /* Transfer 256-byte block(s) */
7745 ARG_TRANSFER (sock, 1280, 256);
7746 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7747 TH_ASSERT (io.rc == 1280);
7749 /* Transfer 720-byte block(s) */
7750 ARG_TRANSFER (sock, 1440, 720);
7751 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7752 TH_ASSERT (io.rc == 1440);
7754 /* Close stream socket */
7756 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7757 TH_ASSERT (io.rc == 0);
7766 /* Terminate worker thread */
7767 osThreadTerminate (worker);
7771 \brief Test case: WIFI_Test_Speed
7772 \ingroup wifi_sock_op
7774 The test case \b WIFI_Test_Speed tests data transfer speed.
7777 - Create stream socket
7778 - Transfer for 4 seconds, send and receive
7779 - Calculate transfer rate
7782 Datagram socket test:
7783 - Create datagram socket
7784 - Transfer for 4 seconds, send and receive
7785 - Calculate transfer rate
7788 void WIFI_Test_Speed (void) {
7789 uint32_t ticks,tout;
7790 osThreadId_t worker;
7791 int32_t rval,n_bytes;
7795 if (station_init (1) == 0) {
7796 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7800 /* Create worker thread */
7801 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7802 if (worker == NULL) {
7803 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7809 /* Create stream socket */
7810 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7812 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7816 /* Connect to stream server */
7818 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7819 TH_ASSERT (io.rc == 0);
7821 /* Transfer for 4 seconds */
7822 tout = SYSTICK_MICROSEC(4000000);
7823 ticks = GET_SYSTICK();
7826 ARG_TRANSFER (sock, 1440, 1440);
7827 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7828 if (io.rc > 0) n_bytes += io.rc;
7830 } while (GET_SYSTICK() - ticks < tout);
7831 /* Check transfer rate */
7832 if (n_bytes < 10000) {
7833 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
7834 TEST_MESSAGE(msg_buf);
7837 /* Close stream socket */
7839 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7840 TH_ASSERT (io.rc == 0);
7845 /* Create datagram socket */
7846 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7848 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7852 /* Connect to datagram server */
7854 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7855 TH_ASSERT (io.rc == 0);
7857 /* Transfer for 4 seconds */
7858 tout = SYSTICK_MICROSEC(4000000);
7859 ticks = GET_SYSTICK();
7862 ARG_TRANSFER (sock, 1460, 1460);
7863 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7864 if (io.rc > 0) n_bytes += io.rc;
7866 } while (GET_SYSTICK() - ticks < tout);
7867 /* Check transfer rate */
7868 if (n_bytes < 10000) {
7869 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
7870 TEST_MESSAGE(msg_buf);
7873 /* Close datagram socket */
7875 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7876 TH_ASSERT (io.rc == 0);
7885 /* Terminate worker thread */
7886 osThreadTerminate (worker);
7889 /* Sidekick IO parameters */
7895 /* Concurrent coworker thread */
7896 __NO_RETURN static void Th_Sidekick (IO_SIDEKICK *io2) {
7901 if (osThreadFlagsWait (SK_TERMINATE, osFlagsWaitAny, 100) == SK_TERMINATE) {
7904 memset ((void *)buff, 0xCC, sizeof(buff));
7905 rc = drv->SocketSend (io2->sock, test_msg, sizeof(test_msg));
7907 rc = drv->SocketRecv (io2->sock, buff, sizeof(test_msg));
7909 if (memcmp ((const void *)buff, (const void *)test_msg, sizeof(test_msg)) == 0) {
7910 io2->count += sizeof(test_msg);
7913 /* Owner deletes this thread */
7914 while (1) osDelay (osWaitForever);
7918 \brief Test case: WIFI_Concurrent_Socket
7919 \ingroup wifi_sock_op
7921 The test case \b WIFI_Concurrent_Socket verifies transfer of two concurrent sockets.
7924 - Create two stream sockets
7925 - Start transfer on 2nd socket with 100ms intervals
7926 - Transfer on main socket, full speed
7927 - Calculate transfer rate
7930 Datagram socket test:
7931 - Create datagram and stream sockets
7932 - Start transfer on stream socket with 100ms intervals
7933 - Transfer on main socket, full speed
7934 - Calculate transfer rate
7937 The test runs with a coherent thread, that performs an additional stream socket io.
7939 void WIFI_Concurrent_Socket (void) {
7940 uint32_t ticks,tout;
7941 osThreadId_t worker,spawn;
7942 int32_t rval,n_bytes;
7947 if (station_init (1) == 0) {
7948 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7952 /* Create worker thread */
7953 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7954 if (worker == NULL) {
7955 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7961 /* The test connects two stream sockets to the ECHO server and then */
7962 /* performs simultaneous data transfer. The main socket transmits at */
7963 /* full speed, and the other socket sends messages at 100ms intervals. */
7964 /* Both sockets record the number of bytes of data transferred, and */
7965 /* the transfer rate is calculated. */
7967 /* Create stream socket */
7968 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7970 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7974 /* Create 2nd stream socket */
7975 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7977 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7982 /* Connect sockets */
7984 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7985 TH_ASSERT (io.rc == 0);
7988 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7989 TH_ASSERT (io.rc == 0);
7991 /* Create spawned thread */
7992 spawn = osThreadNew ((osThreadFunc_t)Th_Sidekick, &io2, NULL);
7993 TEST_ASSERT(spawn != NULL);
7995 /* Transfer for 4 seconds */
7996 tout = SYSTICK_MICROSEC(4000000);
7997 ticks = GET_SYSTICK();
8000 ARG_TRANSFER (sock, 1440, 1440);
8001 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
8002 if (io.rc > 0) n_bytes += io.rc;
8004 } while (GET_SYSTICK() - ticks < tout);
8005 /* Check transfer rate */
8006 if (n_bytes < 10000) {
8007 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
8008 TEST_MESSAGE(msg_buf);
8011 /* 2nd socket sends at 100ms intervals */
8012 TH_ASSERT (io2.count > 1000);
8014 /* Terminate spawned thread */
8015 osThreadFlagsSet (spawn, SK_TERMINATE);
8017 osThreadTerminate (spawn);
8019 /* Close stream sockets */
8021 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8022 TH_ASSERT (io.rc == 0);
8025 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8026 TH_ASSERT (io.rc == 0);
8031 /* The test connects datagram and stream sockets to the ECHO server */
8032 /* and then performs simultaneous data transfer. The datagram socket */
8033 /* transmits at full speed, and the stream socket sends messages at */
8034 /* 100ms intervals. The number of bytes of transferred data is recorded */
8035 /* and the rate of transmission is calculated. */
8037 /* Create datagram socket */
8038 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
8040 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
8044 /* Connect datagram socket */
8046 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
8047 TH_ASSERT (io.rc == 0);
8049 /* Create stream socket */
8050 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8052 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8057 /* Connect stream socket */
8059 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
8060 TH_ASSERT (io.rc == 0);
8062 /* Create spawned thread */
8063 spawn = osThreadNew ((osThreadFunc_t)Th_Sidekick, &io2, NULL);
8064 TEST_ASSERT(spawn != NULL);
8066 /* Transfer for 4 seconds */
8067 tout = SYSTICK_MICROSEC(4000000);
8068 ticks = GET_SYSTICK();
8071 ARG_TRANSFER (sock, 1460, 1460);
8072 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
8073 if (io.rc > 0) n_bytes += io.rc;
8075 } while (GET_SYSTICK() - ticks < tout);
8076 /* Check transfer rate */
8077 if (n_bytes < 10000) {
8078 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
8079 TEST_MESSAGE(msg_buf);
8082 /* 2nd socket sends at 100ms intervals */
8083 TH_ASSERT (io2.count > 1000);
8085 /* Terminate spawned thread */
8086 osThreadFlagsSet (spawn, SK_TERMINATE);
8088 osThreadTerminate (spawn);
8092 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8093 TH_ASSERT (io.rc == 0);
8096 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8097 TH_ASSERT (io.rc == 0);
8106 /* Terminate worker thread */
8107 osThreadTerminate (worker);
8110 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
8112 /* TestAssistant commands */
8113 #define CMD_SEND_TCP "SEND TCP,1420,4000"
8114 #define CMD_RECV_TCP "RECV TCP,1420"
8115 #define TEST_BSIZE 1420
8117 /* StreamRate IO parameters */
8128 /* StreamRate coworker thread */
8129 __NO_RETURN static void Th_StreamRate (IO_STREAMRATE *io) {
8130 uint32_t flags,xid,ticks,tout;
8134 flags = osThreadFlagsWait (F_CREATE_TCP | F_DOWNLOAD | F_UPLOAD |
8135 F_SEND_CTRL | F_CLOSE, osFlagsWaitAny, osWaitForever);
8139 /* Create stream socket */
8140 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
8144 /* Downstream test, server is sender */
8145 for (n = 0; ; n += rc) {
8146 rc = drv->SocketRecv (io->sock, buffer, TEST_BSIZE);
8147 if (strncmp ((char *)buffer, "STAT", 4) == 0) {
8148 /* Server completed the test */
8149 sscanf ((char *)buffer+4, "%d", &val);
8150 if (val > n) io->loss = val - n;
8159 /* Upstream test, server is receiver */
8160 memset ((void *)buffer, 'a', TEST_BSIZE);
8161 tout = SYSTICK_MICROSEC(4000000);
8162 ticks = GET_SYSTICK();
8165 snprintf ((char *)buffer, sizeof(buffer), "Block[%d]", ++i);
8166 rc = drv->SocketSend (io->sock, buffer, TEST_BSIZE);
8167 if (rc > 0) n += rc;
8168 } while (GET_SYSTICK() - ticks < tout);
8169 rc = snprintf ((char *)buffer, sizeof(buffer), "STOP %d bytes.", n);
8170 drv->SocketSend (io->sock, buffer, rc);
8171 /* Receive report from server */
8172 drv->SocketRecv (io->sock, buffer, TEST_BSIZE);
8173 if (strncmp ((char *)buffer, "STAT", 4) == 0) {
8174 sscanf ((char *)buffer+4, "%d", &val);
8175 if (n > val) io->loss = n - val;
8182 io->rc = drv->SocketClose (io->sock);
8186 /* Send control command to TestAssistant */
8187 drv->SocketConnect (io->sock, ip_socket_server, 4, ASSISTANT_PORT);
8188 io->rc = drv->SocketSend (io->sock, io->cmd, strlen(io->cmd));
8191 /* Done, send signal to owner thread */
8192 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
8194 osThreadFlagsSet (io->owner, flags);
8195 osThreadFlagsClear (F_ALL);
8200 \brief Test case: WIFI_Downstream_Rate
8201 \ingroup wifi_sock_op
8203 The test case \b WIFI_Downstream_Rate tests the maximum rate at which the data
8206 void WIFI_Downstream_Rate (void) {
8207 osThreadId_t worker;
8211 if (station_init (1) == 0) {
8212 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
8216 /* Create worker thread */
8217 worker = osThreadNew ((osThreadFunc_t)Th_StreamRate, &io, NULL);
8218 if (worker == NULL) {
8219 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
8225 /* Create stream socket */
8226 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8228 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8232 /* Send command to start the download */
8233 io.cmd = CMD_SEND_TCP;
8234 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
8235 TH_ASSERT (io.rc > 0);
8237 /* Wait for transfer to complete */
8239 TH_EXECUTE (F_DOWNLOAD, 5000 + WIFI_SOCKET_TIMEOUT);
8240 TH_ASSERT (io.rc > 0);
8242 /* Check data loss */
8244 snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Data loss %d byte(s)", io.loss);
8245 TEST_ASSERT_MESSAGE(0,msg_buf);
8247 else if (rval != 0) {
8248 snprintf(msg_buf, sizeof(msg_buf), "[INFO] Speed %d KB/s", io.rc/4000);
8249 TEST_MESSAGE(msg_buf);
8252 /* Close stream socket */
8253 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8254 TH_ASSERT (io.rc == 0);
8263 /* Terminate worker thread */
8264 osThreadTerminate (worker);
8268 \brief Test case: WIFI_Upstream_Rate
8269 \ingroup wifi_sock_op
8271 The test case \b WIFI_Upstream_Rate tests the maximum rate at which the data
8274 void WIFI_Upstream_Rate (void) {
8275 osThreadId_t worker;
8279 if (station_init (1) == 0) {
8280 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
8284 /* Create worker thread */
8285 worker = osThreadNew ((osThreadFunc_t)Th_StreamRate, &io, NULL);
8286 if (worker == NULL) {
8287 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
8293 /* Create stream socket */
8294 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8296 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8300 /* Send command to start the upload */
8301 io.cmd = CMD_RECV_TCP;
8302 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
8303 TH_ASSERT (io.rc > 0);
8305 /* Wait for transfer to complete */
8307 TH_EXECUTE (F_UPLOAD, 5000 + WIFI_SOCKET_TIMEOUT);
8308 TH_ASSERT (io.rc > 0);
8310 /* Check data loss */
8312 snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Data loss %d byte(s)", io.loss);
8313 TEST_ASSERT_MESSAGE(0,msg_buf);
8315 else if (rval != 0) {
8316 snprintf(msg_buf, sizeof(msg_buf), "[INFO] Speed %d KB/s", io.rc/4000);
8317 TEST_MESSAGE(msg_buf);
8320 /* Close stream socket */
8321 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8322 TH_ASSERT (io.rc == 0);
8331 /* Terminate worker thread */
8332 osThreadTerminate (worker);