2 * Copyright (c) 2015-2020 Arm Limited. All rights reserved.
4 * SPDX-License-Identifier: Apache-2.0
6 * Licensed under the Apache License, Version 2.0 (the License); you may
7 * not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * -----------------------------------------------------------------------------
20 * Project: CMSIS-Driver Validation
21 * Title: WiFi Driver Validation tests
23 * -----------------------------------------------------------------------------
28 - Bypass mode and functionality is not tested
29 - Set/GetOption API does not test IPv6 options
30 - SetOption operation is not tested, only API is tested
31 (BSSID, MAC, static IP operation testing would require dedicated hardware
32 with manual check of results on dedicated hardware)
33 - WPS operation is not tested (not Station nor AP)
34 (WPS functional testing would require dedicated hardware
35 with manual check of results WPS AP, WPS on Station could
36 be checked by comparing parameters with expected result (configured))
37 - WiFi sockets tested in blocking mode only
38 - WiFi sockets not tested for IPv6
42 #include "DV_WiFi_Config.h"
43 #include "DV_Framework.h"
44 #include "Driver_WiFi.h"
50 #define ECHO_PORT 7 // Echo port number
51 #define DISCARD_PORT 9 // Discard port number
52 #define CHARGEN_PORT 19 // Chargen port number
53 #define ASSISTANT_PORT 5000 // Test Assistant port number
54 #define TCP_REJECTED_PORT 5001 // Rejected connection server TCP port
55 #define TCP_TIMEOUT_PORT 5002 // Non-responding server TCP port
57 /* Helper function identifiers */
58 #define F_CREATE 0x00000001
59 #define F_CREATE_TCP F_CREATE // Never used with CREATE
60 #define F_CREATE_UDP 0x00000002
61 #define F_CLOSE 0x00000004
62 #define F_BIND 0x00000008
63 #define F_LISTEN 0x00000010
64 #define F_ACCEPT 0x00000020
65 #define F_CONNECT 0x00000040
66 #define F_RECV 0x00000080
67 #define F_RECVFROM 0x00000100
68 #define F_SEND 0x00000200
69 #define F_SENDTO 0x00000400
70 #define F_GETSOCKNAME 0x00000800
71 #define F_GETPEERNAME 0x00001000
72 #define F_GETOPT 0x00002000
73 #define F_SETOPT 0x00004000
74 #define F_GETHOSTBYNAME 0x00008000
75 #define F_PING 0x00010000
76 #define F_SEND_CTRL F_PING // Never used with PING
77 #define F_XFER_FIXED 0x00020000
78 #define F_XFER_INCR 0x00040000
79 #define F_SEND_FRAG 0x00080000
80 #define F_UPLOAD F_SEND_FRAG // Never used with SEND_FRAG
81 #define F_RECV_FRAG 0x00100000
82 #define F_DOWNLOAD F_RECV_FRAG // Never used with RECV_FRAG
83 #define F_ALL 0x001FFFFF
85 #define SK_TERMINATE 0x00000001
87 /* Helper function return values */
92 /* Register Driver_WiFi# */
93 extern ARM_DRIVER_WIFI ARM_Driver_WiFi_(DRV_WIFI);
94 static ARM_DRIVER_WIFI* drv = &ARM_Driver_WiFi_(DRV_WIFI);
97 static uint8_t powered = 0U;
98 static uint8_t connected = 0U;
99 static uint8_t socket_funcs_exist = 0U;
100 static uint8_t volatile event;
102 static char msg_buf [128];
103 static char data_buf[128] __ALIGNED(4);
105 static ARM_WIFI_SignalEvent_t event_func;
106 static ARM_WIFI_CAPABILITIES cap;
107 static ARM_WIFI_CONFIG_t config;
108 static ARM_WIFI_NET_INFO_t net_info;
109 static ARM_WIFI_SCAN_INFO_t scan_info[WIFI_SCAN_MAX_NUM];
111 static const uint8_t ip_unspec[4] = { 0, 0, 0, 0 };
112 static const uint8_t ip_bcast[4] = { 255, 255, 255, 255 };
113 static uint8_t ip_socket_server[4];
115 /* String representation of Driver return codes */
116 static const char *str_ret[] = {
119 "ARM_DRIVER_ERROR_BUSY",
120 "ARM_DRIVER_ERROR_TIMEOUT",
121 "ARM_DRIVER_ERROR_UNSUPPORTED",
122 "ARM_DRIVER_ERROR_PARAMETER",
123 "ARM_DRIVER_ERROR_SPECIFIC"
126 /* String representation of Driver Socket fucntion's return codes */
127 static const char *str_sock_ret[] = {
132 "ARM_SOCKET_ENOTSUP",
135 "ARM_SOCKET_EINPROGRESS",
136 "ARM_SOCKET_ETIMEDOUT",
137 "ARM_SOCKET_EISCONN",
138 "ARM_SOCKET_ENOTCONN",
139 "ARM_SOCKET_ECONNREFUSED",
140 "ARM_SOCKET_ECONNRESET",
141 "ARM_SOCKET_ECONNABORTED",
142 "ARM_SOCKET_EALREADY",
143 "ARM_SOCKET_EADDRINUSE",
144 "ARM_SOCKET_EHOSTNOTFOUND"
147 /* Test message containing all letters of the alphabet */
148 static const uint8_t test_msg[44] = {
149 "The quick brown fox jumps over the lazy dog."
151 /* Dummy text with normal distribution of letters */
152 static const uint8_t test_buf[2050] = {
153 "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent "
154 "libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum "
155 "imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper "
156 "porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu "
157 "ad litora torquent per conubia nostra, per inceptos himenaeos."
159 "Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. "
160 "Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed "
161 "convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus "
162 "risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula "
163 "lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, "
166 "Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent "
167 "per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non "
168 "tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis turpis. "
169 "Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat "
170 "imperdiet. Vestibulum sapien. Proin quam. Etiam ultrices. Suspendisse in justo eu "
171 "magna luctus suscipit. Sed lectus. Integer euismod lacus luctus magna."
173 "Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna "
174 "augue eget diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices "
175 "posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non "
176 "quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis "
177 "laoreet. Donec lacus nunc, viverra nec, blandit vel, egestas et, augue. Vestibulum "
178 "tincidunt malesuada tellus. Ut ultrices ultrices enim. Curabitur sit amet mauris. "
179 "Morbi in dui quis est pulvinar ullamcorper. Nulla facilisi. Integer lacinia sollicitudin "
182 "Sed aliquet risus a tortor. Integer id quam. Morbi mi. Quisque nisl felis, venenatis "
183 "tristique, dignissim in, ultrices sit amet augue."
185 static uint8_t buffer[2048];
188 static void WIFI_DrvEvent (uint32_t evt, void *arg) {
195 /*-----------------------------------------------------------------------------
197 *----------------------------------------------------------------------------*/
199 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
201 \defgroup dv_wifi WiFi Validation
202 \brief WiFi driver validation
204 The WiFi validation test performs the following tests:
205 - API interface compliance.
206 - Some of the control and management operations.
207 - Socket operation with various transfer sizes and communication parameters.
208 - Socket performance.
210 \defgroup wifi_tests Tests
214 /* Helper function that initializes and powers on WiFi Module if not initialized and powered */
215 static int32_t init_and_power_on (void) {
218 if ((drv->Initialize (event_func) == ARM_DRIVER_OK) &&
219 (drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK)) {
229 /* Helper function that is called before tests start executing */
230 void WIFI_DV_Initialize (void) {
232 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]);
234 cap = drv->GetCapabilities();
237 if ((cap.event_eth_rx_frame != 0U) ||
238 (cap.event_ap_connect != 0U) ||
239 (cap.event_ap_disconnect != 0U)) {
240 event_func = WIFI_DrvEvent;
243 if ((drv->SocketCreate != NULL) &&
244 (drv->SocketBind != NULL) &&
245 (drv->SocketListen != NULL) &&
246 (drv->SocketAccept != NULL) &&
247 (drv->SocketConnect != NULL) &&
248 (drv->SocketRecv != NULL) &&
249 (drv->SocketRecvFrom != NULL) &&
250 (drv->SocketSend != NULL) &&
251 (drv->SocketSendTo != NULL) &&
252 (drv->SocketGetSockName != NULL) &&
253 (drv->SocketGetPeerName != NULL) &&
254 (drv->SocketGetOpt != NULL) &&
255 (drv->SocketSetOpt != NULL) &&
256 (drv->SocketClose != NULL) &&
257 (drv->SocketGetHostByName != NULL)) {
258 socket_funcs_exist = 1U;
262 /* Helper function that is called after tests stop executing */
263 void WIFI_DV_Uninitialize (void) {
265 if (connected != 0U) {
266 if (drv->Deactivate (0U) == ARM_DRIVER_OK) {
271 if ((drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK) &&
272 (drv->Uninitialize () == ARM_DRIVER_OK)) {
278 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
279 /* WiFi Control tests */
280 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
282 \defgroup wifi_ctrl Control
285 These tests verify API and operation of the WiFi control functions.
290 \brief Function: WIFI_GetVersion
292 The test function \b WIFI_GetVersion verifies the WiFi Driver \b GetVersion function.
294 ARM_DRIVER_VERSION (*GetVersion) (void);
297 void WIFI_GetVersion (void) {
298 ARM_DRIVER_VERSION ver;
300 ver = drv->GetVersion();
302 TEST_ASSERT((ver.api >= ARM_DRIVER_VERSION_MAJOR_MINOR(1,0)) && (ver.drv >= ARM_DRIVER_VERSION_MAJOR_MINOR(1,0)));
304 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));
305 TEST_MESSAGE(msg_buf);
308 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
310 \brief Function: WIFI_GetCapabilities
312 The test function \b WIFI_GetCapabilities verifies the WiFi Driver \b GetCapabilities function.
314 ARM_WIFI_CAPABILITIES (*GetCapabilities) (void);
317 void WIFI_GetCapabilities (void) {
319 cap = drv->GetCapabilities();
321 TEST_ASSERT_MESSAGE((cap.station_ap != 0U) || (cap.station != 0U) || (cap.ap != 0U), "At least 1 mode must be supported");
323 if (cap.wps_station != 0U) {
324 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");
327 if (cap.wps_ap != 0U) {
328 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");
331 if ((cap.event_ap_connect != 0U) || (cap.event_ap_disconnect != 0U)) {
332 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");
335 if (cap.event_eth_rx_frame != 0U) {
336 TEST_ASSERT_MESSAGE(cap.bypass_mode != 0U, "If event for Ethernet Rx frame is supported, bypass mode must be supported also");
340 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
342 \brief Function: WIFI_Initialize/Uninitialize
344 The test function \b WIFI_Initialize_Uninitialize verifies the WiFi Driver \b Initialize and \b Uninitialize functions.
346 int32_t (*Initialize) (ARM_WIFI_SignalEvent_t cb_event);
350 int32_t (*Uninitialize) (void);
353 - Initialize without callback
355 - Initialize with callback (if driver supports it)
358 - Initialize without callback
363 void WIFI_Initialize_Uninitialize (void) {
366 if ((cap.event_eth_rx_frame != 0U) ||
367 (cap.event_ap_connect != 0U) ||
368 (cap.event_ap_disconnect != 0U)) {
369 event_func = WIFI_DrvEvent;
372 TEST_ASSERT(drv->Initialize (NULL) == ARM_DRIVER_OK);
373 TEST_ASSERT(drv->Uninitialize () == ARM_DRIVER_OK);
374 TEST_ASSERT(drv->Initialize (event_func) == ARM_DRIVER_OK);
375 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
376 TEST_ASSERT(drv->Uninitialize () == ARM_DRIVER_OK);
377 TEST_ASSERT(drv->Initialize (NULL) == ARM_DRIVER_OK);
378 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
379 ret = drv->PowerControl (ARM_POWER_OFF);
380 TEST_ASSERT((ret == ARM_DRIVER_OK) || (ret == ARM_DRIVER_ERROR_UNSUPPORTED));
381 TEST_ASSERT(drv->Uninitialize () == ARM_DRIVER_OK);
384 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
386 \brief Function: WIFI_PowerControl
388 The test function \b WIFI_PowerControl verifies the WiFi Driver \b PowerControl function.
390 int32_t (*PowerControl) (ARM_POWER_STATE state);
394 - Initialize with callback (if driver supports it)
402 void WIFI_PowerControl (void) {
405 ret = drv->PowerControl (ARM_POWER_OFF);
406 TEST_ASSERT(ret == ARM_DRIVER_ERROR);
407 TEST_ASSERT(drv->Initialize (event_func) == ARM_DRIVER_OK);
408 ret = drv->PowerControl (ARM_POWER_OFF);
409 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
410 TEST_MESSAGE("[WARNING] PowerControl (ARM_POWER_OFF) not supported");
412 TEST_ASSERT(ret == ARM_DRIVER_OK);
414 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
415 TEST_ASSERT(drv->Scan (scan_info, WIFI_SCAN_MAX_NUM) >= 0);
418 ret = drv->PowerControl (ARM_POWER_LOW);
423 case ARM_DRIVER_ERROR_UNSUPPORTED:
424 TEST_MESSAGE("[WARNING] PowerControl (ARM_POWER_LOW) is not supported");
428 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] PowerControl (ARM_POWER_LOW) returned %s", str_ret[-ret]);
429 TEST_MESSAGE(msg_buf);
433 drv->PowerControl (ARM_POWER_OFF);
434 drv->Uninitialize ();
437 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
439 \brief Function: WIFI_GetModuleInfo
441 The test function \b WIFI_GetModuleInfo verifies the WiFi Driver \b GetModuleInfo function.
443 int32_t (*GetModuleInfo) (char *module_info, uint32_t max_len);
446 void WIFI_GetModuleInfo (void) {
449 if (init_and_power_on () == 0) {
450 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
454 ret = drv->GetModuleInfo(NULL, sizeof(data_buf));
455 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
456 TEST_MESSAGE("[WARNING] GetModuleInfo (...) not supported");
458 TEST_ASSERT(ret == ARM_DRIVER_ERROR_PARAMETER);
460 ret = drv->GetModuleInfo(data_buf, 0U);
461 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
462 TEST_MESSAGE("[WARNING] GetModuleInfo (...) not supported");
464 TEST_ASSERT(ret == ARM_DRIVER_ERROR_PARAMETER);
467 memset((void *)data_buf, 0xCC, sizeof(data_buf));
468 ret = drv->GetModuleInfo(data_buf, sizeof(data_buf));
471 TEST_ASSERT(strlen(data_buf) != 0);
472 snprintf(msg_buf, sizeof(msg_buf), "[INFO] Module Info is %s", data_buf);
473 TEST_MESSAGE(msg_buf);
475 case ARM_DRIVER_ERROR_UNSUPPORTED:
476 TEST_MESSAGE("[WARNING] GetModuleInfo () is not supported");
479 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] GetModuleInfo () returned %s", str_ret[-ret]);
480 TEST_MESSAGE(msg_buf);
489 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
490 /* WiFi Management tests */
491 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
493 \defgroup wifi_mgmt Management
496 These tests verify API and operation of the WiFi management functions.
500 #if (WIFI_SETGETOPTION_BSSID_EN != 0)
501 static void WIFI_SetOption_GetOption_BSSID (void) {
502 #if ((WIFI_SETGETOPTION_BSSID_EN & 1) != 0)
503 uint8_t u8_arr[8] __ALIGNED(4);
504 uint8_t bssid[7] __ALIGNED(4);
506 #if ((WIFI_SETGETOPTION_BSSID_EN & 2) != 0)
509 uint8_t not_suported;
513 if (init_and_power_on () == 0) {
514 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
518 #if ((WIFI_SETGETOPTION_BSSID_EN & 1) != 0)
520 memset((void *)bssid, 0x11, 7);
521 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_ERROR_PARAMETER);
522 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_ERROR_PARAMETER);
524 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
525 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);
526 memset((void *) u8_arr, 0xCC, 8);
527 memcpy((void *)&u8_arr[1], (const void *)bssid, 6);
528 if (drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
529 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
530 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
531 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 0U) == ARM_DRIVER_ERROR_PARAMETER);
532 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 5U) == ARM_DRIVER_ERROR_PARAMETER);
533 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, &u8_arr[1], 6U) == ARM_DRIVER_OK);
534 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, &u8_arr[1], 7U) == ARM_DRIVER_OK);
535 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 7U) == ARM_DRIVER_OK);
536 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
539 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BSSID for Station is not supported");
542 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
543 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);
544 memset((void *) u8_arr, 0xCC, 8);
545 memcpy((void *)&u8_arr[1], (const void *)bssid, 6);
546 if (drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
547 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
548 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
549 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 0U) == ARM_DRIVER_ERROR_PARAMETER);
550 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 5U) == ARM_DRIVER_ERROR_PARAMETER);
551 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, &u8_arr[1], 6U) == ARM_DRIVER_OK);
552 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, &u8_arr[1], 7U) == ARM_DRIVER_OK);
553 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 7U) == ARM_DRIVER_OK);
554 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
557 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BSSID for Access Point is not supported");
562 #if ((WIFI_SETGETOPTION_BSSID_EN & 2) != 0)
565 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
566 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
568 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
570 if (drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
572 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
574 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
576 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
578 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
580 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
582 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
584 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
586 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
589 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BSSID for Station is not supported");
592 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
594 if (drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
596 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
598 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
600 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
602 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
604 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
606 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf+1,&len) == ARM_DRIVER_OK);
608 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
610 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
613 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BSSID for Access Point is not supported");
618 #if ((WIFI_SETGETOPTION_BSSID_EN & 3) == 3)
619 // Check with Get that Set has written the correct values
620 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
621 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);
622 memset((void *)data_buf, 0xCC, sizeof(data_buf));
624 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
625 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
626 TEST_ASSERT(len == 6U);
627 TEST_ASSERT(memcmp((const void *)bssid, (const void *)data_buf, (size_t)len) == 0);
629 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
630 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);
631 memset((void *)data_buf, 0xCC, sizeof(data_buf));
633 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BSSID, bssid, 6U) == ARM_DRIVER_OK);
634 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BSSID, data_buf, &len) == ARM_DRIVER_OK);
635 TEST_ASSERT(len == 6U);
636 TEST_ASSERT(memcmp((const void *)bssid, (const void *)data_buf, (size_t)len) == 0);
642 #if (WIFI_SETGETOPTION_TX_POWER_EN != 0)
643 static void WIFI_SetOption_GetOption_TX_POWER (void) {
644 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 1) != 0)
647 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 2) != 0)
650 uint8_t not_suported;
654 if (init_and_power_on () == 0) {
655 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
659 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 1) != 0)
661 power = WIFI_TX_POWER_STA;
662 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_ERROR_PARAMETER);
663 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_ERROR_PARAMETER);
665 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
666 power = WIFI_TX_POWER_STA;
667 if (drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
668 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
669 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
670 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 0U) == ARM_DRIVER_ERROR_PARAMETER);
671 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 3U) == ARM_DRIVER_ERROR_PARAMETER);
672 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 5U) == ARM_DRIVER_OK);
673 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
676 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_TX_POWER for Station is not supported");
679 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
680 power = WIFI_TX_POWER_AP;
681 if (drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
682 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
683 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
684 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 0U) == ARM_DRIVER_ERROR_PARAMETER);
685 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 3U) == ARM_DRIVER_ERROR_PARAMETER);
686 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 5U) == ARM_DRIVER_OK);
687 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
690 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_TX_POWER for Access Point is not supported");
695 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 2) != 0)
698 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
699 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
701 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
703 if (drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
705 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
707 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
709 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
711 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
713 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
715 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
718 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_TX_POWER for Station is not supported");
721 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
723 if (drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
725 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
727 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
729 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
731 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
733 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
735 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
738 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_TX_POWER for Access Point is not supported");
743 #if ((WIFI_SETGETOPTION_TX_POWER_EN & 3) == 3)
744 // Check with Get that Set has written the correct values
745 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
746 power = WIFI_TX_POWER_STA;
748 memset((void *)data_buf, 0xCC, sizeof(data_buf));
749 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
750 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
751 TEST_ASSERT(len == 4U);
752 TEST_ASSERT(memcmp((const void *)&power, (const void *)data_buf, (size_t)len) == 0);
754 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
755 power = WIFI_TX_POWER_AP;
757 memset((void *)data_buf, 0xCC, sizeof(data_buf));
758 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_TX_POWER, &power, 4U) == ARM_DRIVER_OK);
759 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_TX_POWER, data_buf, &len) == ARM_DRIVER_OK);
760 TEST_ASSERT(len == 4U);
761 TEST_ASSERT(memcmp((const void *)&power, (const void *)data_buf, (size_t)len) == 0);
767 #if (WIFI_SETGETOPTION_LP_TIMER_EN != 0)
768 static void WIFI_SetOption_GetOption_LP_TIMER (void) {
769 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 1) != 0)
772 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 2) != 0)
775 uint8_t not_suported;
779 if (init_and_power_on () == 0) {
780 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
784 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 1) != 0)
786 time = WIFI_LP_TIMER_STA;
787 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
788 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
790 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
791 time = WIFI_LP_TIMER_STA;
792 if (drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
793 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
794 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
795 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 0U) == ARM_DRIVER_ERROR_PARAMETER);
796 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 3U) == ARM_DRIVER_ERROR_PARAMETER);
797 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 5U) == ARM_DRIVER_OK);
798 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_OK);
801 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_LP_TIMER for Station is not supported");
804 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
805 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
809 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 2) != 0)
812 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
813 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
815 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
817 if (drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
819 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
821 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
823 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
825 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
827 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
829 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
832 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_LP_TIMER for Station is not supported");
835 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
837 TEST_ASSERT (drv->GetOption (1U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
841 #if ((WIFI_SETGETOPTION_LP_TIMER_EN & 3) == 3)
842 // Check with Get that Set has written the correct values
843 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
844 time = WIFI_LP_TIMER_STA;
846 memset((void *)data_buf, 0xCC, sizeof(data_buf));
847 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_LP_TIMER, &time, 4U) == ARM_DRIVER_OK);
848 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_LP_TIMER, data_buf, &len) == ARM_DRIVER_OK);
849 TEST_ASSERT(len == 4U);
850 TEST_ASSERT(memcmp((const void *)&time, (const void *)data_buf, (size_t)len) == 0);
856 #if (WIFI_SETGETOPTION_DTIM_EN != 0)
857 static void WIFI_SetOption_GetOption_DTIM (void) {
858 #if ((WIFI_SETGETOPTION_DTIM_EN & 1) != 0)
861 #if ((WIFI_SETGETOPTION_DTIM_EN & 2) != 0)
864 uint8_t not_suported;
868 if (init_and_power_on () == 0) {
869 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
873 #if ((WIFI_SETGETOPTION_DTIM_EN & 1) != 0)
875 dtim = WIFI_DTIM_STA;
876 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_ERROR_PARAMETER);
877 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_ERROR_PARAMETER);
879 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
880 dtim = WIFI_DTIM_STA;
881 if (drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
882 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
883 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
884 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 0U) == ARM_DRIVER_ERROR_PARAMETER);
885 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 3U) == ARM_DRIVER_ERROR_PARAMETER);
886 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 5U) == ARM_DRIVER_OK);
887 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
890 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_DTIM for Station is not supported");
893 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
895 if (drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
896 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
897 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
898 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 0U) == ARM_DRIVER_ERROR_PARAMETER);
899 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 3U) == ARM_DRIVER_ERROR_PARAMETER);
900 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 5U) == ARM_DRIVER_OK);
901 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
904 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_DTIM for Access Point is not supported");
909 #if ((WIFI_SETGETOPTION_DTIM_EN & 2) != 0)
912 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
913 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
915 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
917 if (drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
919 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
921 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
923 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
925 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
927 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
929 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
932 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_DTIM for Station is not supported");
935 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
937 if (drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
939 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
941 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
943 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
945 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
947 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
949 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
952 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_DTIM for Access Point is not supported");
957 #if ((WIFI_SETGETOPTION_DTIM_EN & 3) == 3)
958 // Check with Get that Set has written the correct values
959 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
960 dtim = WIFI_DTIM_STA;
962 memset((void *)data_buf, 0xCC, sizeof(data_buf));
963 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
964 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
965 TEST_ASSERT(len == 4U);
966 TEST_ASSERT(memcmp((const void *)&dtim, (const void *)data_buf, (size_t)len) == 0);
968 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
971 memset((void *)data_buf, 0xCC, sizeof(data_buf));
972 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_DTIM, &dtim, 4U) == ARM_DRIVER_OK);
973 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_DTIM, data_buf, &len) == ARM_DRIVER_OK);
974 TEST_ASSERT(len == 4U);
975 TEST_ASSERT(memcmp((const void *)&dtim, (const void *)data_buf, (size_t)len) == 0);
981 #if (WIFI_SETGETOPTION_BEACON_EN != 0)
982 static void WIFI_SetOption_GetOption_BEACON (void) {
983 #if ((WIFI_SETGETOPTION_BEACON_EN & 1) != 0)
986 #if ((WIFI_SETGETOPTION_BEACON_EN & 2) != 0)
989 uint8_t not_suported;
993 if (init_and_power_on () == 0) {
994 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
998 #if ((WIFI_SETGETOPTION_BEACON_EN & 1) != 0)
1000 beacon = WIFI_BEACON_AP;
1001 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1002 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1004 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1005 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
1007 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1008 beacon = WIFI_BEACON_AP;
1009 if (drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1010 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1011 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1012 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1013 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1014 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 5U) == ARM_DRIVER_OK);
1015 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_OK);
1018 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_BEACON for Access Point is not supported");
1023 #if ((WIFI_SETGETOPTION_BEACON_EN & 2) != 0)
1026 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1027 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1029 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1031 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
1033 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1035 if (drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1037 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1039 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1041 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1043 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1045 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1047 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1050 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_BEACON for Access Point is not supported");
1055 #if ((WIFI_SETGETOPTION_BEACON_EN & 3) == 3)
1056 // Check with Get that Set has written the correct values
1057 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1058 beacon = WIFI_BEACON_AP;
1060 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1061 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_BEACON, &beacon, 4U) == ARM_DRIVER_OK);
1062 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_BEACON, data_buf, &len) == ARM_DRIVER_OK);
1063 TEST_ASSERT(len == 4U);
1064 TEST_ASSERT(memcmp((const void *)&beacon, (const void *)data_buf, (size_t)len) == 0);
1070 #if (WIFI_SETGETOPTION_MAC_EN != 0)
1071 static void WIFI_SetOption_GetOption_MAC (void) {
1072 #if ((WIFI_SETGETOPTION_MAC_EN & 1) != 0)
1073 uint8_t u8_arr[8] __ALIGNED(4);
1074 uint8_t mac[7] __ALIGNED(4);
1075 uint8_t mac_ap_def[6] __ALIGNED(4);
1076 uint8_t mac_sta_def[6] __ALIGNED(4);
1078 #if ((WIFI_SETGETOPTION_MAC_EN & 2) != 0)
1081 uint8_t not_suported;
1085 if (init_and_power_on () == 0) {
1086 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1090 // Read default MAC so it can be restored at the end of this test function
1091 #if ((WIFI_SETGETOPTION_MAC_EN & 3) == 3)
1092 if (((cap.station_ap != 0) || (cap.station != 0))) {
1094 drv->GetOption (0U, ARM_WIFI_MAC, mac_sta_def, &len);
1096 if ((cap.station_ap != 0) || (cap.ap != 0)) {
1098 drv->GetOption (1U, ARM_WIFI_MAC, mac_ap_def, &len);
1102 #if ((WIFI_SETGETOPTION_MAC_EN & 1) != 0)
1104 memset((void *)mac, 0x11, 7);
1105 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1106 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1108 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1109 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);
1110 memset((void *) u8_arr, 0xCC, 8);
1111 memcpy((void *)&u8_arr[1], (const void *)mac, 6);
1112 if (drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1113 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1114 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1115 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1116 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 5U) == ARM_DRIVER_ERROR_PARAMETER);
1117 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, &u8_arr[1], 6U) == ARM_DRIVER_OK);
1118 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, &u8_arr[1], 7U) == ARM_DRIVER_OK);
1119 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 7U) == ARM_DRIVER_OK);
1120 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1123 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_MAC for Station is not supported");
1126 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1127 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);
1128 memset((void *) u8_arr, 0xCC, 8);
1129 memcpy((void *)&u8_arr[1], (const void *)mac, 6);
1130 if (drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1131 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1132 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, NULL, 6U) == ARM_DRIVER_ERROR_PARAMETER);
1133 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1134 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 5U) == ARM_DRIVER_ERROR_PARAMETER);
1135 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, &u8_arr[1], 6U) == ARM_DRIVER_OK);
1136 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, &u8_arr[1], 7U) == ARM_DRIVER_OK);
1137 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 7U) == ARM_DRIVER_OK);
1138 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1141 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_MAC for Access Point is not supported");
1146 #if ((WIFI_SETGETOPTION_MAC_EN & 2) != 0)
1149 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1150 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1152 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1154 if (drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1156 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1158 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1160 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1162 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1164 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1166 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1168 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1170 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1173 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_MAC for Station is not supported");
1176 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1178 if (drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1180 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1182 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1184 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1186 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1188 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1190 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf+1,&len) == ARM_DRIVER_OK);
1192 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1194 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1197 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_MAC for Access Point is not supported");
1202 #if ((WIFI_SETGETOPTION_MAC_EN & 3) == 3)
1203 // Check with Get that Set has written the correct values
1204 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1205 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);
1207 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1208 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1209 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1210 TEST_ASSERT(len == 6U);
1211 TEST_ASSERT(memcmp((const void *)mac, (const void *)data_buf, (size_t)len) == 0);
1213 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1214 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);
1216 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1217 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_MAC, mac, 6U) == ARM_DRIVER_OK);
1218 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_MAC, data_buf, &len) == ARM_DRIVER_OK);
1219 TEST_ASSERT(len == 6U);
1220 TEST_ASSERT(memcmp((const void *)mac, (const void *)data_buf, (size_t)len) == 0);
1223 // Restore default MAC
1224 if (((cap.station_ap != 0) || (cap.station != 0)) && (memcmp((const void *)mac_sta_def, (const void *)"\0\0\0\0\0\0", 6) != 0)) {
1225 drv->SetOption (0U, ARM_WIFI_MAC, mac_sta_def, 6U);
1227 if (((cap.station_ap != 0) || (cap.ap != 0)) && (memcmp((const void *)mac_ap_def, (const void *)"\0\0\0\0\0\0", 6) != 0)) {
1228 drv->SetOption (1U, ARM_WIFI_MAC, mac_ap_def, 6U);
1234 #if (WIFI_SETGETOPTION_IP_EN != 0)
1235 static void WIFI_SetOption_GetOption_IP (void) {
1236 #if ((WIFI_SETGETOPTION_IP_EN & 1) != 0)
1237 uint32_t u32_0, u32_1;
1238 uint8_t ip[5] __ALIGNED(4);
1240 #if ((WIFI_SETGETOPTION_IP_EN & 2) != 0)
1243 uint8_t not_suported;
1247 if (init_and_power_on () == 0) {
1248 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1252 #if ((WIFI_SETGETOPTION_IP_EN & 1) != 0)
1256 memset((void *)ip, 0, 5);
1257 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1258 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1260 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1261 TEST_ASSERT(sscanf((const char *)WIFI_IP_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1262 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1263 if (drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1264 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1265 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1266 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1267 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1268 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 5U) == ARM_DRIVER_OK);
1269 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1272 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP for Station is not supported");
1274 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1276 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1277 TEST_ASSERT(sscanf((const char *)WIFI_IP_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1278 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1279 if (drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1280 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1281 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1282 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1283 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1284 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 5U) == ARM_DRIVER_OK);
1285 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1288 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP for Access Point is not supported");
1290 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1294 #if ((WIFI_SETGETOPTION_IP_EN & 2) != 0)
1297 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1298 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1300 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1302 if (drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1304 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1306 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1308 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1310 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1312 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1314 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1317 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP for Station is not supported");
1320 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1322 if (drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1324 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1326 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1328 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1330 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1332 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1334 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1337 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP for Access Point is not supported");
1342 #if ((WIFI_SETGETOPTION_IP_EN & 3) == 3)
1343 // Check with Get that Set has written the correct values
1344 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1345 TEST_ASSERT(sscanf((const char *)WIFI_IP_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1347 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1348 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1349 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1350 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1351 TEST_ASSERT(len == 4U);
1352 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1353 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1355 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1356 TEST_ASSERT(sscanf((const char *)WIFI_IP_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1358 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1359 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1360 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP, ip, 4U) == ARM_DRIVER_OK);
1361 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP, data_buf, &len) == ARM_DRIVER_OK);
1362 TEST_ASSERT(len == 4U);
1363 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1364 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1370 #if (WIFI_SETGETOPTION_IP_SUBNET_MASK_EN != 0)
1371 static void WIFI_SetOption_GetOption_IP_SUBNET_MASK (void) {
1372 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 1) != 0)
1373 uint32_t u32_0, u32_1;
1374 uint8_t mask[5] __ALIGNED(4);
1376 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 2) != 0)
1379 uint8_t not_suported;
1383 if (init_and_power_on () == 0) {
1384 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1388 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 1) != 0)
1392 memset((void *)mask, 0, 5);
1393 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1394 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1396 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1397 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_STA, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1398 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1399 if (drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1400 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1401 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1402 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1403 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1404 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 5U) == ARM_DRIVER_OK);
1405 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1408 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_SUBNET_MASK for Station is not supported");
1410 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1412 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1413 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_AP, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1414 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1415 if (drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1416 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1417 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1418 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1419 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1420 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 5U) == ARM_DRIVER_OK);
1421 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1424 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_SUBNET_MASK for Access Point is not supported");
1426 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1430 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 2) != 0)
1433 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1434 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1436 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1438 if (drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1440 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1442 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1444 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1446 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1448 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1450 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1453 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_SUBNET_MASK for Station is not supported");
1456 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1458 if (drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1460 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1462 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1464 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1466 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1468 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1470 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1473 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_SUBNET_MASK for Access Point is not supported");
1478 #if ((WIFI_SETGETOPTION_IP_SUBNET_MASK_EN & 3) == 3)
1479 // Check with Get that Set has written the correct values
1480 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1481 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_STA, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1483 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1484 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1485 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1486 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1487 TEST_ASSERT(len == 4U);
1488 TEST_ASSERT(memcmp((const void *)mask, (const void *)data_buf, (size_t)len) == 0);
1489 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1491 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1492 TEST_ASSERT(sscanf((const char *)WIFI_IP_SUBNET_MASK_AP, "%hhu.%hhu.%hhu.%hhu", &mask[0], &mask[1], &mask[2], &mask[3]) == 4);
1494 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1495 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1496 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_SUBNET_MASK, mask, 4U) == ARM_DRIVER_OK);
1497 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_SUBNET_MASK, data_buf, &len) == ARM_DRIVER_OK);
1498 TEST_ASSERT(len == 4U);
1499 TEST_ASSERT(memcmp((const void *)mask, (const void *)data_buf, (size_t)len) == 0);
1500 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1506 #if (WIFI_SETGETOPTION_IP_GATEWAY_EN != 0)
1507 static void WIFI_SetOption_GetOption_IP_GATEWAY (void) {
1508 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 1) != 0)
1509 uint32_t u32_0, u32_1;
1510 uint8_t ip[5] __ALIGNED(4);
1512 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 2) != 0)
1515 uint8_t not_suported;
1519 if (init_and_power_on () == 0) {
1520 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1524 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 1) != 0)
1528 memset((void *)ip, 0, 5);
1529 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1530 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1532 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1533 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1534 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1535 if (drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1536 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1537 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1538 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1539 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1540 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 5U) == ARM_DRIVER_OK);
1541 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1544 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_GATEWAY for Station is not supported");
1546 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1548 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1549 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1550 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1551 if (drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1552 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1553 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1554 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1555 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1556 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 5U) == ARM_DRIVER_OK);
1557 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1560 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_GATEWAY for Access Point is not supported");
1562 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1566 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 2) != 0)
1569 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1570 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1572 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1574 if (drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1576 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1578 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1580 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1582 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1584 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1586 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1589 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_GATEWAY for Station is not supported");
1592 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1594 if (drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1596 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1598 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1600 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1602 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1604 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1606 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1609 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_GATEWAY for Access Point is not supported");
1614 #if ((WIFI_SETGETOPTION_IP_GATEWAY_EN & 3) == 3)
1615 // Check with Get that Set has written the correct values
1616 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1617 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1619 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1620 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1621 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1622 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1623 TEST_ASSERT(len == 4U);
1624 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1625 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1627 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1628 TEST_ASSERT(sscanf((const char *)WIFI_IP_GATEWAY_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1630 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1631 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1632 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_GATEWAY, ip, 4U) == ARM_DRIVER_OK);
1633 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_GATEWAY, data_buf, &len) == ARM_DRIVER_OK);
1634 TEST_ASSERT(len == 4U);
1635 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1636 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1642 #if (WIFI_SETGETOPTION_IP_DNS1_EN != 0)
1643 static void WIFI_SetOption_GetOption_IP_DNS1 (void) {
1644 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 1) != 0)
1645 uint32_t u32_0, u32_1;
1646 uint8_t ip[5] __ALIGNED(4);
1648 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 2) != 0)
1651 uint8_t not_suported;
1655 if (init_and_power_on () == 0) {
1656 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1660 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 1) != 0)
1664 memset((void *)ip, 0, 5);
1665 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1666 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1668 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1669 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1670 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1671 if (drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1672 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1673 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1674 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1675 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1676 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 5U) == ARM_DRIVER_OK);
1677 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1680 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS1 for Station is not supported");
1682 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1684 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1685 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1686 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1687 if (drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1688 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1689 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1690 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1691 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1692 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 5U) == ARM_DRIVER_OK);
1693 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1696 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS1 for Access Point is not supported");
1698 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1702 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 2) != 0)
1705 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1706 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1708 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1710 if (drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1712 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1714 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1716 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1718 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1720 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1722 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1725 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS1 for Station is not supported");
1728 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1730 if (drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1732 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1734 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1736 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1738 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1740 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1742 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1745 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS1 for Access Point is not supported");
1750 #if ((WIFI_SETGETOPTION_IP_DNS1_EN & 3) == 3)
1751 // Check with Get that Set has written the correct values
1752 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1753 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1755 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1756 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1757 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1758 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1759 TEST_ASSERT(len == 4U);
1760 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1761 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1763 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1764 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS1_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1766 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1767 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1768 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS1, ip, 4U) == ARM_DRIVER_OK);
1769 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS1, data_buf, &len) == ARM_DRIVER_OK);
1770 TEST_ASSERT(len == 4U);
1771 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1772 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1778 #if (WIFI_SETGETOPTION_IP_DNS2_EN != 0)
1779 static void WIFI_SetOption_GetOption_IP_DNS2 (void) {
1780 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 1) != 0)
1781 uint32_t u32_0, u32_1;
1782 uint8_t ip[5] __ALIGNED(4);
1784 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 2) != 0)
1787 uint8_t not_suported;
1791 if (init_and_power_on () == 0) {
1792 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1796 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 1) != 0)
1800 memset((void *)ip, 0, 5);
1801 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1802 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1804 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1805 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1806 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1807 if (drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1808 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1809 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1810 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1811 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1812 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 5U) == ARM_DRIVER_OK);
1813 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1816 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS2 for Station is not supported");
1818 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1820 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1821 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1822 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1823 if (drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1824 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1825 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1826 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1827 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1828 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 5U) == ARM_DRIVER_OK);
1829 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1832 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DNS2 for Access Point is not supported");
1834 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1838 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 2) != 0)
1841 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1842 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1844 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1846 if (drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1848 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1850 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1852 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1854 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1856 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1858 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1861 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS2 for Station is not supported");
1864 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1866 if (drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1868 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1870 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1872 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1874 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1876 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1878 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1881 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DNS2 for Access Point is not supported");
1886 #if ((WIFI_SETGETOPTION_IP_DNS2_EN & 3) == 3)
1887 // Check with Get that Set has written the correct values
1888 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
1889 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_STA, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1891 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1892 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1893 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1894 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1895 TEST_ASSERT(len == 4U);
1896 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1897 drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1899 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
1900 TEST_ASSERT(sscanf((const char *)WIFI_IP_DNS2_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
1902 memset((void *)data_buf, 0xCC, sizeof(data_buf));
1903 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
1904 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DNS2, ip, 4U) == ARM_DRIVER_OK);
1905 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DNS2, data_buf, &len) == ARM_DRIVER_OK);
1906 TEST_ASSERT(len == 4U);
1907 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
1908 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
1914 #if (WIFI_SETGETOPTION_IP_DHCP_EN != 0)
1915 static void WIFI_SetOption_GetOption_IP_DHCP (void) {
1916 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 1) != 0)
1917 uint32_t u32_1, u32_0;
1919 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 2) != 0)
1922 uint8_t not_suported;
1926 if (init_and_power_on () == 0) {
1927 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
1931 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 1) != 0)
1935 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1936 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1938 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
1939 if (drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1940 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1941 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1942 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1943 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1944 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 5U) == ARM_DRIVER_OK);
1945 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1946 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
1949 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP for Station is not supported");
1952 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1953 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1954 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1955 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
1956 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 0U) == ARM_DRIVER_ERROR_PARAMETER);
1957 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 3U) == ARM_DRIVER_ERROR_PARAMETER);
1958 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 5U) == ARM_DRIVER_OK);
1959 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
1960 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
1963 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP for Access Point is not supported");
1968 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 2) != 0)
1971 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1972 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1974 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
1976 if (drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1978 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1980 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
1982 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1984 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
1986 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1988 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
1991 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP for Station is not supported");
1994 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
1996 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
1998 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2000 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2002 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2004 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2006 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2008 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2011 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP for Access Point is not supported");
2016 #if ((WIFI_SETGETOPTION_IP_DHCP_EN & 3) == 3)
2017 // Check with Get that Set has written the correct values
2018 if (((cap.station_ap != 0) || (cap.station != 0)) && ((not_suported & 1U) == 0U)) { // Station test
2020 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2021 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
2022 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2023 TEST_ASSERT(len == 4U);
2024 TEST_ASSERT(memcmp((const void *)&u32_0, (const void *)data_buf, (size_t)len) == 0);
2025 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
2026 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2027 TEST_ASSERT(len == 4U);
2028 TEST_ASSERT(memcmp((const void *)&u32_1, (const void *)data_buf, (size_t)len) == 0);
2030 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2032 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2033 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U) == ARM_DRIVER_OK);
2034 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2035 TEST_ASSERT(len == 4U);
2036 TEST_ASSERT(memcmp((const void *)&u32_0, (const void *)data_buf, (size_t)len) == 0);
2037 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U) == ARM_DRIVER_OK);
2038 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP, data_buf, &len) == ARM_DRIVER_OK);
2039 TEST_ASSERT(len == 4U);
2040 TEST_ASSERT(memcmp((const void *)&u32_1, (const void *)data_buf, (size_t)len) == 0);
2046 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN != 0)
2047 static void WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN (void) {
2048 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 1) != 0)
2049 uint32_t u32_1, u32_0;
2050 uint8_t ip[5] __ALIGNED(4);
2052 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 2) != 0)
2055 uint8_t not_suported;
2059 if (init_and_power_on () == 0) {
2060 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2064 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 1) != 0)
2066 memset((void *)ip, 0, 5);
2067 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2068 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2070 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2071 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2073 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2074 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_BEGIN_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2075 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2076 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2077 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2078 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2079 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2080 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2081 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 5U) == ARM_DRIVER_OK);
2082 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_OK);
2085 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_POOL_BEGIN for Access Point is not supported");
2087 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2091 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 2) != 0)
2094 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2095 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2097 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2099 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2101 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2103 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2105 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2107 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2109 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2111 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2113 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2115 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2118 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_POOL_BEGIN for Access Point is not supported");
2123 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN & 3) == 3)
2124 // Check with Get that Set has written the correct values
2125 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2126 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_BEGIN_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2128 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2129 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2130 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, ip, 4U) == ARM_DRIVER_OK);
2131 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_BEGIN, data_buf, &len) == ARM_DRIVER_OK);
2132 TEST_ASSERT(len == 4U);
2133 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
2134 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2140 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN != 0)
2141 static void WIFI_SetOption_GetOption_IP_DHCP_POOL_END (void) {
2142 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 1) != 0)
2143 uint32_t u32_1, u32_0;
2144 uint8_t ip[5] __ALIGNED(4);
2146 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 2) != 0)
2149 uint8_t not_suported;
2153 if (init_and_power_on () == 0) {
2154 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2158 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 1) != 0)
2160 memset((void *)ip, 0, 5);
2161 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2162 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2164 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2165 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2167 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2168 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_END_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2169 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2170 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2171 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2172 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2173 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2174 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2175 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 5U) == ARM_DRIVER_OK);
2176 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_OK);
2179 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_POOL_END for Access Point is not supported");
2181 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2185 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 2) != 0)
2188 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2189 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2191 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2193 TEST_ASSERT(drv->GetOption (0U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2195 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2197 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2199 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2201 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2203 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2205 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2207 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2209 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2212 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_POOL_END for Access Point is not supported");
2217 #if ((WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN & 3) == 3)
2218 // Check with Get that Set has written the correct values
2219 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2220 TEST_ASSERT(sscanf((const char *)WIFI_IP_DHCP_POOL_END_AP, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]) == 4);
2222 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2223 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_0, 4U); // Turn DHCP off
2224 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, ip, 4U) == ARM_DRIVER_OK);
2225 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_POOL_END, data_buf, &len) == ARM_DRIVER_OK);
2226 TEST_ASSERT(len == 4U);
2227 TEST_ASSERT(memcmp((const void *)ip, (const void *)data_buf, (size_t)len) == 0);
2228 drv->SetOption (1U, ARM_WIFI_IP_DHCP, &u32_1, 4U); // Turn DHCP on
2234 #if (WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN != 0)
2235 static void WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME (void) {
2236 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 1) != 0)
2239 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 2) != 0)
2242 uint8_t not_suported;
2246 if (init_and_power_on () == 0) {
2247 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2251 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 1) != 0)
2253 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2254 TEST_ASSERT(drv->SetOption ( 2U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2255 TEST_ASSERT(drv->SetOption (255U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2257 if (((cap.station_ap != 0) || (cap.station != 0))) { // Station test
2258 TEST_ASSERT(drv->SetOption (0U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_ERROR_UNSUPPORTED);
2260 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2261 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2262 if (drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2263 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2264 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, 4U) == ARM_DRIVER_ERROR_PARAMETER);
2265 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2266 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 3U) == ARM_DRIVER_ERROR_PARAMETER);
2267 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 5U) == ARM_DRIVER_OK);
2268 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_OK);
2271 TEST_MESSAGE("[WARNING] SetOption ARM_WIFI_IP_DHCP_LEASE_TIME for Access Point is not supported");
2276 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 2) != 0)
2279 TEST_ASSERT(drv->GetOption ( 2U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2280 TEST_ASSERT(drv->GetOption (255U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2282 if ((cap.station_ap != 0) || (cap.station != 0)) { // Station test
2284 TEST_ASSERT (drv->GetOption (0U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_UNSUPPORTED);
2286 if ((cap.station_ap != 0) || (cap.ap != 0)) { // AP test
2288 if (drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) != ARM_DRIVER_ERROR_UNSUPPORTED) {
2290 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2292 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, NULL, &len) == ARM_DRIVER_ERROR_PARAMETER);
2294 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2296 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_ERROR_PARAMETER);
2298 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2300 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2303 TEST_MESSAGE("[WARNING] GetOption ARM_WIFI_IP_DHCP_LEASE_TIME for Access Point is not supported");
2308 #if ((WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN & 3) == 3)
2309 // Check with Get that Set has written the correct values
2310 if (((cap.station_ap != 0) || (cap.ap != 0)) && ((not_suported & 2U) == 0U)) { // AP test
2311 time = WIFI_IP_DHCP_LEASE_TIME_AP;
2313 memset((void *)data_buf, 0xCC, sizeof(data_buf));
2314 TEST_ASSERT(drv->SetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, &time, 4U) == ARM_DRIVER_OK);
2315 TEST_ASSERT(drv->GetOption (1U, ARM_WIFI_IP_DHCP_LEASE_TIME, data_buf, &len) == ARM_DRIVER_OK);
2316 TEST_ASSERT(len == 4U);
2317 TEST_ASSERT(memcmp((const void *)&time, (const void *)data_buf, (size_t)len) == 0);
2323 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2325 \brief Function: WIFI_SetOption_GetOption
2327 The test function \b WIFI_SetOption_GetOption verifies the WiFi Driver \b SetOption and \b GetOption functions.
2328 (Options: ARM_WIFI_BSSID, ARM_WIFI_MAC, ARM_WIFI_IP, ARM_WIFI_IP_SUBNET_MASK, ARM_WIFI_IP_GATEWAY, ARM_WIFI_IP_DNS1,
2329 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>
2330 Tests for each option is conditionally executed depending on WIFI_SETGETOPTION_... settings in DV_WiFi_Config.h file.
2332 int32_t (*SetOption) (uint32_t interface, uint32_t option, const void *data, uint32_t len);
2336 int32_t (*GetOption) (uint32_t interface, uint32_t option, void *data, uint32_t *len);
2338 Function \b WIFI_SetOption_GetOption_BSSID tests \b ARM_WIFI_BSSID option.<br>
2339 Function \b WIFI_SetOption_GetOption_TX_POWER tests \b ARM_WIFI_TX_POWER option.<br>
2340 Function \b WIFI_SetOption_GetOption_LP_TIMER tests \b ARM_WIFI_LP_TIMER option.<br>
2341 Function \b WIFI_SetOption_GetOption_DTIM tests \b ARM_WIFI_DTIM option.<br>
2342 Function \b WIFI_SetOption_GetOption_BEACON tests \b ARM_WIFI_BEACON option.<br>
2343 Function \b WIFI_SetOption_GetOption_MAC tests \b ARM_WIFI_MAC option.<br>
2344 Function \b WIFI_SetOption_GetOption_IP tests \b ARM_WIFI_IP option.<br>
2345 Function \b WIFI_SetOption_GetOption_IP_SUBNET_MASK tests \b ARM_WIFI_IP_SUBNET_MASK option.<br>
2346 Function \b WIFI_SetOption_GetOption_IP_GATEWAY tests \b ARM_WIFI_IP_GATEWAY option.<br>
2347 Function \b WIFI_SetOption_GetOption_IP_DNS1 tests \b ARM_WIFI_IP_DNS1 option.<br>
2348 Function \b WIFI_SetOption_GetOption_IP_DNS2 tests \b ARM_WIFI_IP_DNS2 option.<br>
2349 Function \b WIFI_SetOption_GetOption_IP_DHCP tests \b ARM_WIFI_IP_DHCP option.<br>
2350 Function \b WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN tests \b ARM_WIFI_IP_DHCP_POOL_BEGIN option.<br>
2351 Function \b WIFI_SetOption_GetOption_IP_DHCP_POOL_END tests \b ARM_WIFI_IP_DHCP_POOL_END option.<br>
2352 Function \b WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME tests \b ARM_WIFI_IP_DHCP_LEASE_TIME option.
2354 void WIFI_SetOption_GetOption (void) {
2356 #if (WIFI_SETGETOPTION_BSSID_EN != 0)
2357 WIFI_SetOption_GetOption_BSSID ();
2359 #if (WIFI_SETGETOPTION_TX_POWER_EN != 0)
2360 WIFI_SetOption_GetOption_TX_POWER ();
2362 #if (WIFI_SETGETOPTION_LP_TIMER_EN != 0)
2363 WIFI_SetOption_GetOption_LP_TIMER ();
2365 #if (WIFI_SETGETOPTION_DTIM_EN != 0)
2366 WIFI_SetOption_GetOption_DTIM ();
2368 #if (WIFI_SETGETOPTION_BEACON_EN != 0)
2369 WIFI_SetOption_GetOption_BEACON ();
2371 #if (WIFI_SETGETOPTION_MAC_EN != 0)
2372 WIFI_SetOption_GetOption_MAC ();
2374 #if (WIFI_SETGETOPTION_IP_EN != 0)
2375 WIFI_SetOption_GetOption_IP ();
2377 #if (WIFI_SETGETOPTION_IP_SUBNET_MASK_EN != 0)
2378 WIFI_SetOption_GetOption_IP_SUBNET_MASK ();
2380 #if (WIFI_SETGETOPTION_IP_GATEWAY_EN != 0)
2381 WIFI_SetOption_GetOption_IP_GATEWAY ();
2383 #if (WIFI_SETGETOPTION_IP_DNS1_EN != 0)
2384 WIFI_SetOption_GetOption_IP_DNS1 ();
2386 #if (WIFI_SETGETOPTION_IP_DNS2_EN != 0)
2387 WIFI_SetOption_GetOption_IP_DNS2 ();
2389 #if (WIFI_SETGETOPTION_IP_DHCP_EN != 0)
2390 WIFI_SetOption_GetOption_IP_DHCP ();
2392 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_BEGIN_EN != 0)
2393 WIFI_SetOption_GetOption_IP_DHCP_POOL_BEGIN ();
2395 #if (WIFI_SETGETOPTION_IP_DHCP_POOL_END_EN != 0)
2396 WIFI_SetOption_GetOption_IP_DHCP_POOL_END ();
2398 #if (WIFI_SETGETOPTION_IP_DHCP_LEASE_TIME_EN != 0)
2399 WIFI_SetOption_GetOption_IP_DHCP_LEASE_TIME ();
2403 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2405 \brief Function: WIFI_Scan
2407 The test function \b WIFI_Scan verifies the WiFi Driver \b Scan function.
2409 int32_t (*Scan) (ARM_WIFI_SCAN_INFO_t scan_info[], uint32_t max_num);
2412 void WIFI_Scan (void) {
2415 if (init_and_power_on () == 0) {
2416 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2420 TEST_ASSERT(drv->Scan(NULL, WIFI_SCAN_MAX_NUM) == ARM_DRIVER_ERROR_PARAMETER);
2421 TEST_ASSERT(drv->Scan(scan_info, 0U) == ARM_DRIVER_ERROR_PARAMETER);
2423 memset((void *)scan_info, 0xCC, sizeof(scan_info));
2424 ret = drv->Scan(scan_info, 10U);
2426 TEST_MESSAGE("[WARNING] Scan (..) found no networks");
2428 TEST_ASSERT((ret > 0) && (ret <= WIFI_SCAN_MAX_NUM));
2432 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2434 \brief Function: WIFI_Activate_Deactivate
2436 The test function \b WIFI_Activate_Deactivate verifies the WiFi Driver \b Activate and \b Deactivate functions.
2438 int32_t (*Activate) (uint32_t interface, const ARM_WIFI_CONFIG_t *config);
2442 int32_t (*Deactivate) (uint32_t interface);
2444 Testing sequence (for Station and Access Point):
2445 - if not initialized and powered initialize and power on
2447 - Activate (with invalid parameters)
2448 - Activate (with valid parameters)
2450 - Activate (with invalid WPS parameters)
2452 void WIFI_Activate_Deactivate (void) {
2455 if (init_and_power_on () == 0) {
2456 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2460 /* Test Station configuration setup */
2461 if ((cap.station != 0) || (cap.station_ap != 0)) {
2463 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2465 /* Test function with invalid parameters */
2466 TEST_ASSERT(drv->Activate(0U, NULL) == ARM_DRIVER_ERROR_PARAMETER);
2470 config.security = 0U;
2472 config.wps_method = 0U;
2473 config.wps_pin = NULL;
2474 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2476 config.ssid = WIFI_STA_SSID;
2478 config.security = WIFI_STA_SECURITY;
2480 config.wps_method = 0U;
2481 config.wps_pin = NULL;
2482 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2484 config.ssid = WIFI_STA_SSID;
2485 config.pass = WIFI_STA_PASS;
2486 config.security = ARM_WIFI_SECURITY_UNKNOWN;
2487 config.ch = WIFI_STA_CH;
2488 config.wps_method = 0U;
2489 config.wps_pin = NULL;
2490 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2492 config.ssid = WIFI_STA_SSID;
2493 config.pass = WIFI_STA_PASS;
2494 config.security = WIFI_STA_SECURITY;
2496 config.wps_method = 0U;
2497 config.wps_pin = NULL;
2498 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2500 config.ssid = WIFI_STA_SSID;
2501 config.pass = WIFI_STA_PASS;
2502 config.security = WIFI_STA_SECURITY;
2503 config.ch = WIFI_STA_CH;
2504 config.wps_method = 0U;
2505 config.wps_pin = NULL;
2506 TEST_ASSERT(drv->Activate(3U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2508 /* Test function with autodetect channel, can return unsupported or succeed */
2509 config.ssid = WIFI_STA_SSID;
2510 config.pass = WIFI_STA_PASS;
2511 config.security = WIFI_STA_SECURITY;
2513 config.wps_method = 0U;
2514 config.wps_pin = NULL;
2515 ret = drv->Activate(0U, &config);
2516 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
2517 TEST_MESSAGE("[WARNING] Activate (0, ...) with autodetect channel not supported");
2519 TEST_ASSERT(ret == ARM_DRIVER_OK);
2522 if (ret == ARM_DRIVER_OK) {
2523 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2526 /* Test function with valid parameters -> must succeed */
2527 config.ssid = WIFI_STA_SSID;
2528 config.pass = WIFI_STA_PASS;
2529 config.security = WIFI_STA_SECURITY;
2530 config.ch = WIFI_STA_CH;
2531 config.wps_method = 0U;
2532 config.wps_pin = NULL;
2533 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_OK);
2535 if (ret == ARM_DRIVER_OK) {
2536 TEST_ASSERT(drv->Deactivate (0U) == ARM_DRIVER_OK);
2539 if (cap.wps_station != 0U) {
2540 /* Test function with invalid WPS configurations */
2541 config.ssid = WIFI_STA_SSID;
2542 config.pass = WIFI_STA_PASS;
2543 config.security = WIFI_STA_SECURITY;
2544 config.ch = WIFI_STA_CH;
2545 config.wps_method = 255U;
2546 config.wps_pin = NULL;
2547 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2549 config.ssid = WIFI_STA_SSID;
2550 config.pass = WIFI_STA_PASS;
2551 config.security = WIFI_STA_SECURITY;
2552 config.ch = WIFI_STA_CH;
2553 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2554 config.wps_pin = NULL;
2555 TEST_ASSERT(drv->Activate(0U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2559 /* Test Access Point configuration setup */
2560 if ((cap.ap != 0) || (cap.station_ap != 0)) {
2562 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2564 /* Test function with invalid parameters */
2565 TEST_ASSERT(drv->Activate(1U, NULL) == ARM_DRIVER_ERROR_PARAMETER);
2569 config.security = 0U;
2571 config.wps_method = 0U;
2572 config.wps_pin = NULL;
2573 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2575 config.ssid = WIFI_STA_SSID;
2577 config.security = WIFI_AP_SECURITY;
2579 config.wps_method = 0U;
2580 config.wps_pin = NULL;
2581 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2583 config.ssid = WIFI_AP_SSID;
2584 config.pass = WIFI_AP_PASS;
2585 config.security = ARM_WIFI_SECURITY_UNKNOWN;
2586 config.ch = WIFI_AP_CH;
2587 config.wps_method = 0U;
2588 config.wps_pin = NULL;
2589 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2591 config.ssid = WIFI_AP_SSID;
2592 config.pass = WIFI_AP_PASS;
2593 config.security = WIFI_AP_SECURITY;
2595 config.wps_method = 0U;
2596 config.wps_pin = NULL;
2597 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2599 config.ssid = WIFI_AP_SSID;
2600 config.pass = WIFI_AP_PASS;
2601 config.security = WIFI_AP_SECURITY;
2602 config.ch = WIFI_AP_CH;
2603 config.wps_method = 0U;
2604 config.wps_pin = NULL;
2605 TEST_ASSERT(drv->Activate(3U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2607 /* Test function with autodetect channel, can return unsupported or succeed */
2608 config.ssid = WIFI_AP_SSID;
2609 config.pass = WIFI_AP_PASS;
2610 config.security = WIFI_AP_SECURITY;
2612 config.wps_method = 0U;
2613 config.wps_pin = NULL;
2614 ret = drv->Activate(1U, &config);
2615 if (ret == ARM_DRIVER_ERROR_UNSUPPORTED) {
2616 TEST_MESSAGE("[WARNING] Activate (1, ...) with autodetect channel not supported");
2618 TEST_ASSERT(ret == ARM_DRIVER_OK);
2621 if (ret == ARM_DRIVER_OK) {
2622 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2625 /* Test function with valid parameters -> must succeed */
2626 config.ssid = WIFI_AP_SSID;
2627 config.pass = WIFI_AP_PASS;
2628 config.security = WIFI_AP_SECURITY;
2629 config.ch = WIFI_AP_CH;
2630 config.wps_method = 0U;
2631 config.wps_pin = NULL;
2632 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_OK);
2634 if (ret == ARM_DRIVER_OK) {
2635 TEST_ASSERT(drv->Deactivate (1U) == ARM_DRIVER_OK);
2638 if (cap.wps_ap != 0U) {
2639 /* Test function with invalid WPS configurations */
2640 config.ssid = WIFI_AP_SSID;
2641 config.pass = WIFI_AP_PASS;
2642 config.security = WIFI_AP_SECURITY;
2643 config.ch = WIFI_AP_CH;
2644 config.wps_method = 255U;
2645 config.wps_pin = NULL;
2646 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2648 config.ssid = WIFI_AP_SSID;
2649 config.pass = WIFI_AP_PASS;
2650 config.security = WIFI_AP_SECURITY;
2651 config.ch = WIFI_AP_CH;
2652 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2653 config.wps_pin = NULL;
2654 TEST_ASSERT(drv->Activate(1U, &config) == ARM_DRIVER_ERROR_PARAMETER);
2659 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2661 \brief Function: WIFI_IsConnected
2663 The test function \b WIFI_IsConnected verifies the WiFi Driver \b IsConnected function.
2665 uint32_t (*IsConnected) (void);
2668 void WIFI_IsConnected (void) {
2670 if (init_and_power_on () == 0) {
2671 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2675 TEST_ASSERT(drv->IsConnected () == 0U);
2677 /* Test function with valid Station configuration */
2678 if ((cap.station != 0) || (cap.station_ap != 0)) {
2679 memset((void *)&config, 0, sizeof(config));
2680 config.ssid = WIFI_STA_SSID;
2681 config.pass = WIFI_STA_PASS;
2682 config.security = WIFI_STA_SECURITY;
2683 config.ch = WIFI_STA_CH;
2685 drv->Activate(0U, &config);
2686 TEST_ASSERT(drv->IsConnected () != 0U);
2688 drv->Deactivate (0U);
2689 TEST_ASSERT(drv->IsConnected () == 0U);
2693 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2695 \brief Function: WIFI_GetNetInfo
2697 The test function \b WIFI_GetNetInfo verifies the WiFi Driver \b GetNetInfo function.
2699 int32_t (*GetNetInfo) (ARM_WIFI_NET_INFO_t *net_info);
2702 void WIFI_GetNetInfo (void) {
2704 if (init_and_power_on () == 0) {
2705 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2709 /* Test function with invalid pointer */
2710 TEST_ASSERT(drv->GetNetInfo (NULL) == ARM_DRIVER_ERROR_PARAMETER);
2712 /* Test function with valid Station configuration */
2713 if ((cap.station != 0) || (cap.station_ap != 0)) {
2714 memset((void *)&config, 0, sizeof(config));
2715 config.ssid = WIFI_STA_SSID;
2716 config.pass = WIFI_STA_PASS;
2717 config.security = WIFI_STA_SECURITY;
2718 config.ch = WIFI_STA_CH;
2720 drv->Activate(0U, &config);
2722 memset((void *)&net_info, 0xCC, sizeof(net_info));
2723 TEST_ASSERT(drv->GetNetInfo (&net_info) == ARM_DRIVER_OK);
2725 /* Check returned info */
2726 TEST_ASSERT(net_info.security == config.security);
2727 if (config.ch != 0U) {
2728 TEST_ASSERT(net_info.ch == config.ch);
2730 TEST_ASSERT(net_info.rssi != 0U);
2732 drv->Deactivate (0U);
2736 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2738 \brief Function: WIFI_Activate_AP
2740 The test function \b WIFI_Activate_AP verifies the WiFi Driver \b Activate function AP operation.
2741 Test result is checked by connecting WiFi client to AP.
2743 void WIFI_Activate_AP (void) {
2746 if (init_and_power_on () == 0) {
2747 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2751 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2755 /* Test Access Point configuration setup */
2756 if ((cap.ap != 0) || (cap.station_ap != 0)) {
2757 memset((void *)&config, 0, sizeof(config));
2758 config.ssid = WIFI_AP_SSID;
2759 config.pass = WIFI_AP_PASS;
2760 config.security = WIFI_AP_SECURITY;
2761 config.ch = WIFI_AP_CH;
2762 ret = drv->Activate(1U, &config);
2763 TEST_ASSERT(ret == ARM_DRIVER_OK);
2765 if (ret == ARM_DRIVER_OK) {
2766 // Wait for WIFI_AP_CLIENT_CON_TIMEOUT in ms for client to connect
2767 // If event for connect is supported, loop will end when connect is detected
2768 // otherwise result of test is result of client connection status.
2769 for (tout = WIFI_AP_CLIENT_CON_TIMEOUT / 128; tout > 0; tout--) {
2771 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2772 if (event & ARM_WIFI_EVENT_AP_CONNECT) {
2779 if ((cap.event_ap_connect != 0U) && (event_func != NULL)) {
2780 TEST_ASSERT((event & ARM_WIFI_EVENT_AP_CONNECT) != 0U);
2785 drv->Deactivate (1U);
2789 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2791 \brief Function: WIFI_Activate_Station_WPS_PBC
2793 The test function \b WIFI_Activate_Station_WPS_PBC verifies the WiFi Driver \b Activate function Station connection with WPS
2794 and Push-Button Configuration method.
2795 This test function requires that test Access Point has active Push-button WPS method when test is started.
2796 Usually started on the WiFi AP (router) by pressing the WPS button.
2798 void WIFI_Activate_Station_WPS_PBC (void) {
2801 if (init_and_power_on () == 0) {
2802 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2806 /* Test Station WPS PBC connection */
2807 if ((cap.wps_station != 0U) && ((cap.station != 0) || (cap.station_ap != 0))) {
2808 memset((void *)&config, 0, sizeof(config));
2810 /* Connect with valid WPS configuration - Push-Button Configuration method -> should succeed */
2811 config.wps_method = ARM_WIFI_WPS_METHOD_PBC;
2812 ret = drv->Activate(0U, &config);
2813 TEST_ASSERT(ret == ARM_DRIVER_OK);
2815 if (ret == ARM_DRIVER_OK) {
2816 // Check connect information is as expected
2817 memset((void *)&net_info, 0xCC, sizeof(net_info));
2818 drv->GetNetInfo (&net_info);
2820 TEST_ASSERT(memcmp((const void *)net_info.ssid, (const void *)WIFI_STA_SSID, sizeof(WIFI_STA_SSID)) == 0);
2821 TEST_ASSERT(memcmp((const void *)net_info.pass, (const void *)WIFI_STA_PASS, sizeof(WIFI_STA_PASS)) == 0);
2822 TEST_ASSERT(net_info.security == WIFI_STA_SECURITY);
2823 if (WIFI_STA_CH != 0) {
2824 TEST_ASSERT(net_info.ch == WIFI_STA_CH);
2828 drv->Deactivate (0U);
2833 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2835 \brief Function: WIFI_Activate_Station_WPS_PIN
2837 The test function \b WIFI_Activate_Station_WPS_PIN verifies the WiFi Driver \b Activate function Station connection with WPS
2839 This test function requires that test Access Point has active PIN WPS method when test is started.
2840 Usually needs to be configured on the WiFi AP (router).
2842 void WIFI_Activate_Station_WPS_PIN (void) {
2845 if (init_and_power_on () == 0) {
2846 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2850 /* Test Station WPS PIN connection */
2851 if ((cap.wps_station != 0U) && ((cap.station != 0) || (cap.station_ap != 0))) {
2852 memset((void *)&config, 0, sizeof(config));
2854 /* Connect with valid WPS configuration - PIN method -> should succeed */
2855 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2856 config.wps_pin = WIFI_STA_WPS_PIN;
2857 ret = drv->Activate(0U, &config);
2858 TEST_ASSERT(ret == ARM_DRIVER_OK);
2860 if (ret == ARM_DRIVER_OK) {
2861 // Check connect information is as expected
2862 memset((void *)&net_info, 0xCC, sizeof(net_info));
2863 drv->GetNetInfo (&net_info);
2865 TEST_ASSERT(memcmp((const void *)net_info.ssid, (const void *)WIFI_STA_SSID, sizeof(WIFI_STA_SSID)) == 0);
2866 TEST_ASSERT(memcmp((const void *)net_info.pass, (const void *)WIFI_STA_PASS, sizeof(WIFI_STA_PASS)) == 0);
2867 TEST_ASSERT(net_info.security == WIFI_STA_SECURITY);
2868 if (WIFI_STA_CH != 0) {
2869 TEST_ASSERT(net_info.ch == WIFI_STA_CH);
2873 drv->Deactivate (0U);
2878 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2880 \brief Function: WIFI_Activate_AP_WPS_PBC
2882 The test function \b WIFI_Activate_AP_WPS_PBC verifies the WiFi Driver \b Activate function AP WPS
2883 and Push-Button Configuration method functionality.
2884 Test result is checked by connecting the WiFi client to AP with WPS Push-Button Configuration method.
2886 void WIFI_Activate_AP_WPS_PBC (void) {
2889 if (init_and_power_on () == 0) {
2890 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2894 /* Test AP WPS PBC */
2895 if ((cap.wps_ap != 0U) && ((cap.ap != 0) || (cap.station_ap != 0))) {
2896 memset((void *)&config, 0, sizeof(config));
2897 config.ssid = WIFI_AP_SSID;
2898 config.pass = WIFI_AP_PASS;
2899 config.security = WIFI_AP_SECURITY;
2900 config.ch = WIFI_AP_CH;
2902 /* Start AP with WPS configuration - Push-Button Configuration method -> should succeed */
2903 config.wps_method = ARM_WIFI_WPS_METHOD_PBC;
2904 ret = drv->Activate(1U, &config);
2905 TEST_ASSERT(ret == ARM_DRIVER_OK);
2907 if (ret == ARM_DRIVER_OK) {
2908 // Wait predefined time for Client to connect
2909 osDelay(WIFI_AP_CLIENT_CON_TIMEOUT);
2913 drv->Deactivate (1U);
2917 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2919 \brief Function: WIFI_Activate_AP_WPS_PIN
2921 The test function \b WIFI_Activate_AP_WPS_PIN verifies the WiFi Driver \b Activate function AP WPS
2922 PIN method functionality.
2923 Test result is checked by connecting the WiFi client to AP with WPS PIN method.
2925 void WIFI_Activate_AP_WPS_PIN (void) {
2928 if (init_and_power_on () == 0) {
2929 TEST_ASSERT_MESSAGE(0,"[FAILED] Driver initialization and power on failed");
2933 /* Test AP WPS PIN */
2934 if ((cap.wps_ap != 0U) && ((cap.ap != 0) || (cap.station_ap != 0))) {
2935 memset((void *)&config, 0, sizeof(config));
2936 config.ssid = WIFI_AP_SSID;
2937 config.pass = WIFI_AP_PASS;
2938 config.security = WIFI_AP_SECURITY;
2939 config.ch = WIFI_AP_CH;
2941 /* Start AP with WPS configuration - PIN method -> should succeed */
2942 config.wps_method = ARM_WIFI_WPS_METHOD_PIN;
2943 config.wps_pin = WIFI_AP_WPS_PIN;
2944 ret = drv->Activate(1U, &config);
2945 TEST_ASSERT(ret == ARM_DRIVER_OK);
2947 if (ret == ARM_DRIVER_OK) {
2948 // Wait predefined time for Client to connect
2949 osDelay(WIFI_AP_CLIENT_CON_TIMEOUT);
2953 drv->Deactivate (1U);
2961 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2962 /* WiFi Socket tests */
2963 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2966 \defgroup wifi_sock_api Socket API
2969 These tests verify API and operation of the WiFi socket functions.
2972 /* Helper function that initialize and connects to WiFi Access Point */
2973 static int32_t station_init (uint32_t con) {
2975 if (cap.station == 0U) {
2979 if (powered == 0U) {
2980 if ((drv->Initialize (event_func) == ARM_DRIVER_OK) &&
2981 (drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK)) {
2988 if (connected != con) {
2990 memset((void *)&config, 0, sizeof(config));
2991 config.ssid = WIFI_STA_SSID;
2992 config.pass = WIFI_STA_PASS;
2993 config.security = WIFI_STA_SECURITY;
2994 config.ch = WIFI_STA_CH;
2995 if (drv->Activate(0U, &config) != ARM_DRIVER_OK) {
2999 if (drv->Deactivate(0U) != ARM_DRIVER_OK) {
3004 connected = (uint8_t)con;
3010 /* Helper function that disconnects and uninitializes Station */
3011 static void station_uninit (void) {
3013 drv->Deactivate (0U);
3016 drv->PowerControl (ARM_POWER_OFF);
3017 drv->Uninitialize ();
3021 /* Helper function for execution of socket test function in the worker thread */
3022 static int32_t th_execute (osThreadId_t *id, uint32_t sig, uint32_t tout) {
3023 osThreadFlagsSet (id, sig);
3024 if (osThreadFlagsWait (TH_OK | TH_TOUT, osFlagsWaitAny, tout) == TH_OK) {
3025 /* Success, completed in time */
3028 /* If function timeout expired prepare output message */
3029 snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Execution timeout (%d ms)", tout);
3033 /* Helper function for preparing output message for TH_ASSERT2 macro */
3034 static void th_assert2_msg (const char *s1, int32_t r1, int32_t r2) {
3035 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Non BSD-strict, %s (result %s, expected %s)", s1, str_sock_ret[-r1], str_sock_ret[-r2]);
3038 #define TH_EXECUTE(sig,tout) do { \
3040 rval = th_execute (worker, sig, tout); \
3042 /* Msg was prepared in th_execute function */ \
3043 TEST_ASSERT_MESSAGE(0,msg_buf); \
3047 #define TH_ASSERT(cond) do { \
3048 if (rval) { TEST_ASSERT(cond); } \
3051 #define TH_ASSERT2(c1,c2,s1,r1,r2) do { \
3053 if (!c2) { TEST_ASSERT(c1); } \
3055 th_assert2_msg(s1, r1, r2); /* Prep msg */ \
3056 TEST_MESSAGE(msg_buf); \
3061 #define ARG_INIT() do { \
3062 io.owner = osThreadGetId (); \
3066 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3068 /* Create IO parameters */
3069 #ifndef __DOXYGEN__ // Exclude form the documentation
3082 /* Assign arguments */
3083 #define ARG_CREATE(_af,_type,_proto) do { \
3086 io.protocol = _proto; \
3089 /* Create worker thread */
3090 __NO_RETURN static void Th_Create (IO_CREATE *io) {
3091 uint32_t flags, xid;
3094 flags = osThreadFlagsWait (F_CREATE | F_CLOSE, osFlagsWaitAny, osWaitForever);
3099 io->rc = drv->SocketCreate (io->af, io->type, io->protocol);
3104 io->rc = drv->SocketClose (io->sock);
3107 /* Done, send signal to owner thread */
3108 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3110 osThreadFlagsSet (io->owner, flags);
3111 osThreadFlagsClear (F_ALL);
3116 \brief Function: WIFI_SocketCreate
3117 \ingroup wifi_sock_api
3119 The test function \b WIFI_SocketCreate verifies the WiFi Driver \b SocketCreate function:
3121 int32_t (*SocketCreate) (int32_t af, int32_t type, int32_t protocol);
3125 - Check function parameters
3126 - Create multiple stream sockets
3127 - Gradually close stream sockets and create datagram sockets
3128 - Close datagram sockets
3130 void WIFI_SocketCreate (void) {
3131 osThreadId_t worker;
3134 int32_t sock[WIFI_SOCKET_MAX_NUM], i;
3136 if (socket_funcs_exist == 0U) {
3137 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3141 if (station_init (1) == 0) {
3142 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3146 /* Create worker thread */
3147 worker = osThreadNew ((osThreadFunc_t)Th_Create, &io, NULL);
3148 if (worker == NULL) {
3149 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3155 /* Check parameter (af = -1) */
3156 ARG_CREATE (-1, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3157 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3158 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3160 /* Check parameter (af = INT32_MIN) */
3161 ARG_CREATE (INT32_MIN, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3162 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3163 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3165 /* Check parameter (af = INT32_MAX) */
3166 ARG_CREATE (INT32_MAX, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3167 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3168 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3170 /* Check parameter (type = -1) */
3171 ARG_CREATE (ARM_SOCKET_AF_INET, -1, ARM_SOCKET_IPPROTO_TCP);
3172 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3173 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3175 /* Check parameter (type = INT32_MIN) */
3176 ARG_CREATE (ARM_SOCKET_AF_INET, INT32_MIN, ARM_SOCKET_IPPROTO_TCP);
3177 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3178 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3180 /* Check parameter (type = INT32_MAX) */
3181 ARG_CREATE (ARM_SOCKET_AF_INET, INT32_MAX, ARM_SOCKET_IPPROTO_TCP);
3182 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3183 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3185 /* Check parameter, stream socket (protocol = -1) */
3186 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, -1);
3187 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3188 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3190 /* Check parameter, stream socket (protocol = INT32_MIN) */
3191 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, INT32_MIN);
3192 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3193 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3195 /* Check parameter, stream socket (protocol = INT32_MAX) */
3196 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, INT32_MAX);
3197 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3198 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3200 /* Check parameter, datagram socket (protocol = -1) */
3201 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, -1);
3202 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3203 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3205 /* Check parameter, datagram socket (protocol = INT32_MIN) */
3206 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, INT32_MIN);
3207 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3208 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3210 /* Check parameter, datagram socket (protocol = INT32_MAX) */
3211 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, INT32_MAX);
3212 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3213 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3215 /* Check parameter, stream socket (protocol = ARM_SOCKET_IPPROTO_UDP) */
3216 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_UDP);
3217 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3218 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3220 /* Check parameter, datagram socket (protocol = ARM_SOCKET_IPPROTO_TCP) */
3221 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_TCP);
3222 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3223 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3225 /* Create multiple stream sockets */
3226 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3227 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3228 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3229 TH_ASSERT (io.rc >= 0);
3234 /* Gradually close stream sockets, create datagram sockets */
3235 ARG_CREATE (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3236 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3237 /* Close stream socket */
3239 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3240 TH_ASSERT (io.rc == 0);
3242 /* Create datagram socket */
3243 TH_EXECUTE (F_CREATE, WIFI_SOCKET_TIMEOUT);
3244 TH_ASSERT (io.rc >= 0);
3249 /* Close datagram sockets */
3250 for (i = 0; i < WIFI_SOCKET_MAX_NUM; i++) {
3252 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3253 TH_ASSERT (io.rc == 0);
3261 /* Terminate worker thread */
3262 osThreadTerminate (worker);
3265 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3267 /* Bind IO parameters */
3268 #ifndef __DOXYGEN__ // Exclude form the documentation
3282 /* Assign arguments */
3283 #define ARG_BIND(_sock,_ip,_ip_len,_port) do { \
3286 io.ip_len = _ip_len; \
3290 /* Bind worker thread */
3291 __NO_RETURN static void Th_Bind (IO_BIND *io) {
3295 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_CLOSE, osFlagsWaitAny, osWaitForever);
3299 /* Create stream socket */
3300 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3304 /* Create datagram socket */
3305 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3310 io->rc = drv->SocketBind (io->sock, io->ip, io->ip_len, io->port);
3315 io->rc = drv->SocketClose (io->sock);
3318 /* Done, send signal to owner thread */
3319 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3321 osThreadFlagsSet (io->owner, flags);
3322 osThreadFlagsClear (F_ALL);
3327 \brief Function: WIFI_SocketBind
3328 \ingroup wifi_sock_api
3330 The test function \b WIFI_SocketBind verifies the WiFi Driver \b SocketBind function:
3332 int32_t (*SocketBind) (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port);
3336 - Create stream socket
3337 - Check function parameters
3338 - Bind stream socket
3339 - Bind socket second time
3340 - Create 2nd stream socket
3341 - Bind 2nd socket, used port
3342 - Bind 2nd socket, unused port
3343 - Close stream sockets
3344 - Bind closed socket
3346 Datagram socket test:
3347 - Create datagram socket
3348 - Bind datagram socket
3349 - Bind socket second time
3350 - Create 2nd datagram socket
3351 - Bind 2nd socket, used port
3352 - Bind 2nd socket, unused port
3353 - Close datagram socket
3354 - Bind closed socket
3356 void WIFI_SocketBind (void) {
3357 osThreadId_t worker;
3362 if (socket_funcs_exist == 0U) {
3363 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3367 if (station_init (1) == 0) {
3368 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3372 /* Create worker thread */
3373 worker = osThreadNew ((osThreadFunc_t)Th_Bind, &io, NULL);
3374 if (worker == NULL) {
3375 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3381 /* Create stream socket */
3382 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3384 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3388 /* Check parameter (socket = -1) */
3389 ARG_BIND (-1, ip_unspec, 4, DISCARD_PORT);
3390 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3391 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3393 /* Check parameter (socket = INT32_MIN) */
3394 ARG_BIND (INT32_MIN, ip_unspec, 4, DISCARD_PORT);
3395 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3396 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3398 /* Check parameter (socket = INT32_MAX) */
3399 ARG_BIND (INT32_MAX, ip_unspec, 4, DISCARD_PORT);
3400 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3401 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3403 /* Check parameter (ip = NULL) */
3404 ARG_BIND (sock, NULL, 4, DISCARD_PORT);
3405 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3406 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3408 /* Check parameter (ip_len = 0) */
3409 ARG_BIND (sock, ip_unspec, 0, DISCARD_PORT);
3410 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3411 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3413 /* Check parameter (ip_len = UINT32_MAX) */
3414 ARG_BIND (sock, ip_unspec, UINT32_MAX, DISCARD_PORT);
3415 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3416 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3418 /* Check parameter (port = 0) */
3419 ARG_BIND (sock, ip_unspec, 4, 0);
3420 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3421 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3424 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3425 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3426 TH_ASSERT (io.rc == 0);
3428 /* Bind socket 2nd time */
3429 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3430 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3431 /* Should return error (socket already bound) */
3432 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3433 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);
3435 /* Create 2nd stream socket */
3436 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3438 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3442 /* Bind 2nd socket, used port */
3443 ARG_BIND (sock2, ip_unspec, 4, DISCARD_PORT);
3444 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3445 /* Should return error (address already used) */
3446 /* Strict: EADDRINUSE, valid non-strict: ERROR */
3447 TH_ASSERT2 ((io.rc == ARM_SOCKET_EADDRINUSE), (io.rc == ARM_SOCKET_ERROR), "bind another socket to used address", io.rc, ARM_SOCKET_EADDRINUSE);
3449 /* Bind 2nd socket, unused port */
3450 ARG_BIND (sock2, ip_unspec, 4, ECHO_PORT);
3451 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3452 TH_ASSERT (io.rc == 0);
3456 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3457 TH_ASSERT (io.rc == 0);
3460 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3461 TH_ASSERT (io.rc == 0);
3463 /* Bind again, closed socket */
3464 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3465 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3466 /* Should return error (socket not created) */
3467 /* Strict: ESOCK, valid non-strict: ERROR */
3468 /* Return code strict: ESOCK, non-strict: ERROR */
3469 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "bind on closed socket", io.rc, ARM_SOCKET_ESOCK);
3474 /* Create datagram socket */
3475 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3477 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3481 /* Check parameter (socket = -1) */
3482 ARG_BIND (-1, ip_unspec, 4, DISCARD_PORT);
3483 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3484 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3486 /* Check parameter (socket = INT32_MIN) */
3487 ARG_BIND (INT32_MIN, ip_unspec, 4, DISCARD_PORT);
3488 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3489 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3491 /* Check parameter (socket = INT32_MAX) */
3492 ARG_BIND (INT32_MAX, ip_unspec, 4, DISCARD_PORT);
3493 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3494 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3496 /* Check parameter (ip = NULL) */
3497 ARG_BIND (sock, NULL, 4, DISCARD_PORT);
3498 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3499 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3501 /* Check parameter (ip_len = 0) */
3502 ARG_BIND (sock, ip_unspec, 0, DISCARD_PORT);
3503 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3504 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3506 /* Check parameter (ip_len = UINT32_MAX) */
3507 ARG_BIND (sock, ip_unspec, UINT32_MAX, DISCARD_PORT);
3508 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3509 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3511 /* Check parameter (port = 0) */
3512 ARG_BIND (sock, ip_unspec, 4, 0);
3513 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3514 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
3517 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3518 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3519 TH_ASSERT (io.rc == 0);
3521 /* Bind socket 2nd time */
3522 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3523 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3524 /* Should return error (socket already bound) */
3525 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3526 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);
3528 /* Create 2nd datagram socket */
3529 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3531 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3535 /* Bind 2nd socket, used port */
3536 ARG_BIND (sock2, ip_unspec, 4, DISCARD_PORT);
3537 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3538 /* Should return error (address already used) */
3539 /* Strict: EADDRINUSE, valid non-strict: ERROR */
3540 TH_ASSERT2 ((io.rc == ARM_SOCKET_EADDRINUSE), (io.rc == ARM_SOCKET_ERROR), "bind another socket to used address", io.rc, ARM_SOCKET_EADDRINUSE);
3542 /* Bind 2nd socket, unused port */
3543 ARG_BIND (sock2, ip_unspec, 4, ECHO_PORT);
3544 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3545 TH_ASSERT (io.rc == 0);
3549 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3550 TH_ASSERT (io.rc == 0);
3553 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3554 TH_ASSERT (io.rc == 0);
3556 /* Bind again, closed socket */
3557 ARG_BIND (sock, ip_unspec, 4, DISCARD_PORT);
3558 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3559 /* Should return error (socket not created) */
3560 /* Strict: ESOCK, valid non-strict: ERROR */
3561 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "bind on closed socket", io.rc, ARM_SOCKET_ESOCK);
3570 /* Terminate worker thread */
3571 osThreadTerminate (worker);
3574 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3576 /* Listen IO parameters */
3577 #ifndef __DOXYGEN__ // Exclude form the documentation
3588 /* Assign arguments */
3589 #define ARG_LISTEN(_sock,_backlog) do { \
3591 io.backlog = _backlog; \
3594 /* Listen worker thread */
3595 __NO_RETURN static void Th_Listen (IO_LISTEN *io) {
3599 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
3600 F_BIND | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
3604 /* Create stream socket */
3605 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3609 /* Create datagram socket */
3610 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3615 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
3619 /* Listen on socket */
3620 io->rc = drv->SocketListen (io->sock, io->backlog);
3625 io->rc = drv->SocketClose (io->sock);
3628 /* Done, send signal to owner thread */
3629 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3631 osThreadFlagsSet (io->owner, flags);
3632 osThreadFlagsClear (F_ALL);
3637 \brief Function: WIFI_SocketListen
3638 \ingroup wifi_sock_api
3640 The test function \b WIFI_SocketListen verifies the WiFi Driver \b SocketListen function:
3642 int32_t (*SocketListen) (int32_t socket, int32_t backlog);
3645 Stream socket test 1:
3646 - Create stream socket
3648 - Check function parameters
3650 - Start listening 2nd time
3653 Stream socket test 2:
3654 - Create stream socket
3655 - Start listening, unbound socket
3657 - Start listening, closed socket
3659 Datagram socket test:
3660 - Create datagram socket
3665 void WIFI_SocketListen (void) {
3666 osThreadId_t worker;
3671 if (socket_funcs_exist == 0U) {
3672 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3676 if (station_init (1) == 0) {
3677 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3681 /* Create worker thread */
3682 worker = osThreadNew ((osThreadFunc_t)Th_Listen, &io, NULL);
3683 if (worker == NULL) {
3684 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3690 /* Create stream socket */
3691 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3693 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3699 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3700 TH_ASSERT (io.rc == 0);
3702 /* Check parameter (socket = -1) */
3704 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3705 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3707 /* Check parameter (socket = INT32_MIN) */
3708 ARG_LISTEN (INT32_MIN, 1);
3709 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3710 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3712 /* Check parameter (socket = INT32_MAX) */
3713 ARG_LISTEN (INT32_MAX, 1);
3714 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3715 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3717 /* Start listening */
3718 ARG_LISTEN (sock, 1);
3719 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3720 TH_ASSERT (io.rc == 0);
3722 /* Start listening 2nd time */
3723 ARG_LISTEN (sock, 1);
3724 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3725 /* Should return error (socket already listening) */
3726 /* Strict: EINVAL, valid non-strict: OK, ERROR */
3727 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);
3731 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3732 TH_ASSERT (io.rc == 0);
3737 /* Create stream socket */
3738 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3740 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3744 /* Start listening, unbound socket */
3745 ARG_LISTEN (sock, 1);
3746 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3747 /* Should return error (socket not bound) */
3748 /* Strict: EINVAL, valid non-strict: ERROR */
3749 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "listen on unbound socket", io.rc, ARM_SOCKET_EINVAL);
3753 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3754 TH_ASSERT (io.rc == 0);
3756 /* Start listening, closed socket */
3757 ARG_LISTEN (sock, 1);
3758 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3759 /* Should return error (socket not created) */
3760 /* Strict: ESOCK, valid non-strict: ERROR */
3761 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "listen on closed socket", io.rc, ARM_SOCKET_ESOCK);
3766 /* Create datagram socket */
3767 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
3769 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
3775 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3776 TH_ASSERT (io.rc == 0);
3778 /* Start listening */
3779 ARG_LISTEN (sock, 1);
3780 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3781 /* Should return error (operation not supported) */
3782 /* Strict: ENOTSUP, valid non-strict: ERROR */
3783 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "listen on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
3787 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
3788 TH_ASSERT (io.rc == 0);
3797 /* Terminate worker thread */
3798 osThreadTerminate (worker);
3801 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
3803 /* Accept IO parameters */
3804 #ifndef __DOXYGEN__ // Exclude form the documentation
3818 /* Assign arguments */
3819 #define ARG_ACCEPT(_sock,_ip,_ip_len,_port) do { \
3822 io.ip_len = _ip_len; \
3826 /* TestAssistant control */
3827 #define TEST_PORT 2000
3829 /* CONNECT <proto>,<ip_addr>,<port>,<delay_ms>
3830 <proto> = protocol (TCP, UDP)
3831 <ip_addr> = IP address (0.0.0.0 = sender address)
3832 <port> = port number
3833 <delay_ms> = startup delay
3835 Example: CONNECT TCP,192.168.1.200,80,600
3836 (wait 600ms then connect to 192.168.1.200, port 80)
3838 #define CMD_CONNECT_TCP "CONNECT TCP,0.0.0.0,2000,500"
3839 #define CMD_CONNECT_UDP "CONNECT UDP,0.0.0.0,2000,200"
3841 /* Accept worker thread */
3842 __NO_RETURN static void Th_Accept (IO_ACCEPT *io) {
3847 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_LISTEN |
3848 F_ACCEPT | F_SEND_CTRL | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
3852 /* Create stream socket */
3853 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3857 /* Create datagram socket */
3858 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
3863 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, TEST_PORT);
3867 /* Listen on socket */
3868 io->rc = drv->SocketListen (io->sock, 1);
3872 /* Accept on socket */
3873 io->rc = drv->SocketAccept (io->sock, io->ip, io->ip_len, io->port);
3877 /* Recv on socket (stream, datagram) */
3878 memset((void *)buffer, 0xCC, 16);
3879 io->rc = drv->SocketRecv (io->sock, buffer, 16);
3880 if ((io->rc > 0) && (memcmp ((const void *)buffer, (const void *)"SockServer", 10) != 0)) {
3881 /* Failed if rc <= 0 */
3888 io->rc = drv->SocketClose (io->sock);
3892 /* Send control command to TestAssistant */
3893 sock = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
3894 drv->SocketConnect (sock, ip_socket_server, 4, ASSISTANT_PORT);
3895 io->rc = drv->SocketSend (sock, io->cmd, strlen(io->cmd));
3896 drv->SocketClose (sock);
3900 /* Done, send signal to owner thread */
3901 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
3903 osThreadFlagsSet (io->owner, flags);
3904 osThreadFlagsClear (F_ALL);
3909 \brief Function: WIFI_SocketAccept
3910 \ingroup wifi_sock_api
3912 The test function \b WIFI_SocketAccept verifies the WiFi Driver \b SocketAccept function:
3914 int32_t (*SocketAccept) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
3918 - Create stream socket
3921 - Check function parameters
3922 - Accept connection, NULL parameters
3923 - Receive ServerId on accepted socket
3924 - Close accepted socket
3925 - Accept connection again, return IP address and port
3926 - Receive ServerId on accepted socket
3927 - Receive again, server closed connection
3928 - Close accepted socket
3929 - Close listening socket
3930 - Accept again, closed socket
3932 Datagram socket test:
3933 - Create datagram socket
3936 - Accept connection, provide return parameters for IP address and port
3937 - Receive ServerId on socket
3940 void WIFI_SocketAccept (void) {
3944 osThreadId_t worker;
3949 if (socket_funcs_exist == 0U) {
3950 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
3954 if (station_init (1) == 0) {
3955 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
3959 /* Create worker thread */
3960 worker = osThreadNew ((osThreadFunc_t)Th_Accept, &io, NULL);
3961 if (worker == NULL) {
3962 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
3968 /* Create stream socket */
3969 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
3971 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
3977 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
3978 TH_ASSERT (io.rc == 0);
3980 /* Start listening */
3982 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
3983 TH_ASSERT (io.rc == 0);
3985 /* Check parameter (socket = -1) */
3986 ip_len = sizeof(ip);
3987 ARG_ACCEPT (-1, ip, &ip_len, &port);
3988 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3989 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3991 /* Check parameter (socket = INT32_MIN) */
3992 ARG_ACCEPT (INT32_MIN, ip, &ip_len, &port);
3993 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3994 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
3996 /* Check parameter (socket = INT32_MAX) */
3997 ARG_ACCEPT (INT32_MAX, ip, &ip_len, &port);
3998 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
3999 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4001 /* Parameters 'ip', 'ip_len' and 'port' are optional, can be NULL */
4003 /* Request a remote server to connect to us */
4004 io.cmd = CMD_CONNECT_TCP;
4005 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
4006 TH_ASSERT (io.rc > 0);
4008 /* Accept connection with NULL parameters */
4009 ARG_ACCEPT (sock, NULL, NULL, NULL);
4010 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT_LONG);
4011 /* Accepted socket should be different */
4012 TH_ASSERT ((io.rc != io.sock) && (io.rc >= 0));
4014 /* Receive SockServer id string */
4016 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4017 TH_ASSERT (io.rc > 0);
4019 /* Close accepted socket */
4020 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4021 TH_ASSERT (io.rc == 0);
4025 /* Request from remote server to connect to us */
4026 io.cmd = CMD_CONNECT_TCP;
4027 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
4028 TH_ASSERT (io.rc > 0);
4030 /* Initialize buffers for return values */
4032 ip_len = sizeof(ip) + 1;
4033 memset ((void *)ip, 0, sizeof(ip));
4035 /* Accept again, return ip address and port */
4036 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
4037 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT_LONG);
4038 /* Accepted socket should be different */
4039 TH_ASSERT ((io.rc != io.sock) && (io.rc >= 0));
4040 /* IP address should be the address of the server */
4041 TH_ASSERT ((memcmp ((const void *)ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
4042 /* Port number of remote peer should be non-zero */
4043 TH_ASSERT (port != 0);
4045 /* Receive SockServer id string */
4047 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4048 TH_ASSERT (io.rc > 0);
4050 /* SockServer disconnects after 500ms */
4052 /* Receive again, no data */
4053 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4054 /* Should return error (connection reset) */
4055 /* Strict: ECONNRESET, valid non-strict: ERROR */
4056 TH_ASSERT2 ((io.rc == ARM_SOCKET_ECONNRESET), (io.rc == ARM_SOCKET_ERROR), "receive on disconnected socket", io.rc, ARM_SOCKET_ECONNRESET);
4058 /* Close accepted socket */
4059 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4060 TH_ASSERT (io.rc == 0);
4062 /* Close listening socket */
4064 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4065 TH_ASSERT (io.rc == 0);
4067 /* Accept again, closed socket */
4069 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
4070 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
4071 /* Should return error (socket not created) */
4072 /* Strict: ESOCK, valid non-strict: ERROR */
4073 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "accept on closed socket", io.rc, ARM_SOCKET_ESOCK);
4078 /* Create datagram socket */
4079 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
4081 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
4087 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4088 TH_ASSERT (io.rc == 0);
4090 /* Start listening */
4092 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
4093 /* Listen on datagram socket should fail */
4094 /* Strict: ENOTSUP, valid non-strict: ERROR */
4095 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "listen on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
4097 /* Initialize buffers for return values */
4099 ip_len = sizeof(ip);
4100 memset ((void *)ip, 0, sizeof(ip));
4102 /* Accept on datagram socket */
4103 ARG_ACCEPT (sock, &ip[0], &ip_len, &port);
4104 TH_EXECUTE (F_ACCEPT, WIFI_SOCKET_TIMEOUT);
4105 /* Accept on datagram socket should fail */
4106 /* Strict: ENOTSUP, valid non-strict: ERROR */
4107 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTSUP), (io.rc == ARM_SOCKET_ERROR), "accept on datagram socket", io.rc, ARM_SOCKET_ENOTSUP);
4111 /* Request from remote server to send us a test message */
4112 io.cmd = CMD_CONNECT_UDP;
4113 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
4114 TH_ASSERT (io.rc > 0);
4116 /* Receive SockServer id string */
4117 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4118 TH_ASSERT (io.rc > 0);
4121 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4122 TH_ASSERT (io.rc == 0);
4131 /* Terminate worker thread */
4132 osThreadTerminate (worker);
4135 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4137 /* Connect IO parameters */
4138 #ifndef __DOXYGEN__ // Exclude form the documentation
4152 /* Assign arguments */
4153 #define ARG_CONNECT(_sock,_ip,_ip_len,_port) do { \
4156 io.ip_len = _ip_len; \
4160 /* Connect worker thread */
4161 __NO_RETURN static void Th_Connect (IO_CONNECT *io) {
4165 /* Wait for the signal to select and execute the function */
4166 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
4167 F_CONNECT | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
4171 /* Create stream socket */
4172 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
4176 /* Create datagram socket */
4177 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
4182 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
4186 /* Connect on socket */
4187 io->rc = drv->SocketConnect (io->sock, io->ip, io->ip_len, io->port);
4191 /* Listen on socket */
4192 io->rc = drv->SocketListen (io->sock, 1);
4197 io->rc = drv->SocketClose (io->sock);
4200 /* Done, send signal to owner thread */
4201 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4203 osThreadFlagsSet (io->owner, flags);
4204 osThreadFlagsClear (F_ALL);
4209 \brief Function: WIFI_SocketConnect
4210 \ingroup wifi_sock_api
4212 The test function \b WIFI_SocketConnect verifies the WiFi Driver \b SocketConnect function:
4214 int32_t (*SocketConnect) (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port);
4217 Stream socket test 1:
4218 - Create stream socket
4219 - Check function parameters
4220 - Connect to server, blocking mode
4221 - Connect again, already connected
4222 - Bind connected socket
4224 - Connect on closed socket
4226 Stream socket test 2:
4227 - Create stream socket
4228 - Connect to server, connection rejected
4231 Stream socket test 3:
4232 - Create stream socket
4233 - Connect to server, non-responding or non-existent
4236 Stream socket test 4:
4237 - Create stream socket
4240 - Connect to server, blocking mode
4243 Datagram socket test:
4244 - Create datagram socket
4246 - Check function parameters
4247 - Connect to server, enable address filtering
4248 - Connect to unspecified address, disable filtering
4250 - Connect again, closed socket
4252 void WIFI_SocketConnect (void) {
4253 osThreadId_t worker;
4258 if (socket_funcs_exist == 0U) {
4259 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4263 if (station_init (1) == 0) {
4264 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4268 /* Create worker thread */
4269 worker = osThreadNew ((osThreadFunc_t)Th_Connect, &io, NULL);
4270 if (worker == NULL) {
4271 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4277 /* Create stream socket */
4278 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4280 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4284 /* Check parameter (socket = -1) */
4285 ARG_CONNECT(-1, ip_socket_server, 4, DISCARD_PORT);
4286 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4287 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4289 /* Check parameter (socket = INT32_MIN) */
4290 ARG_CONNECT(INT32_MIN, ip_socket_server, 4, DISCARD_PORT);
4291 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4292 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4294 /* Check parameter (socket = INT32_MAX) */
4295 ARG_CONNECT(INT32_MAX, ip_socket_server, 4, DISCARD_PORT);
4296 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4297 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4299 /* Check parameter (ip = NULL) */
4300 ARG_CONNECT(sock, NULL, 4, DISCARD_PORT);
4301 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4302 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4304 /* Check parameter (ip = 0.0.0.0) */
4305 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4306 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4307 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4309 /* Check parameter (ip_len = 0) */
4310 ARG_CONNECT(sock, ip_socket_server, 0, DISCARD_PORT);
4311 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4312 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4314 /* Check parameter (ip_len = 5) */
4315 ARG_CONNECT(sock, ip_socket_server, 5, DISCARD_PORT);
4316 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4317 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4319 /* Check parameter (port = 0) */
4320 ARG_CONNECT(sock, ip_socket_server, 4, 0);
4321 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4322 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4324 /* Connect to stream server */
4325 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4326 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4327 TH_ASSERT (io.rc == 0);
4329 /* Connect 2nd time */
4330 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4331 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4332 /* Should return error (socket already connected) */
4333 /* Strict: EISCONN, valid non-strict: OK, ERROR */
4334 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);
4336 /* Bind connected socket */
4338 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4339 /* Should return error (socket already connected) */
4340 /* Strict: EISCONN, valid non-strict: ERROR */
4341 TH_ASSERT2 ((io.rc == ARM_SOCKET_EISCONN), (io.rc == ARM_SOCKET_ERROR), "bind on connected socket", io.rc, ARM_SOCKET_EISCONN);
4345 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4346 TH_ASSERT (io.rc == 0);
4348 /* Connect again, closed socket */
4349 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4350 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4351 /* Should return error (socket not created) */
4352 /* Strict: ESOCK, valid non-strict: ERROR */
4353 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "connect on closed socket", io.rc, ARM_SOCKET_ESOCK);
4358 /* Create stream socket */
4359 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4361 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4365 /* Connect to stream server (connection rejected) */
4366 ARG_CONNECT(sock, ip_socket_server, 4, TCP_REJECTED_PORT);
4367 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4368 /* Should return error (connection rejected by the peer) */
4369 /* Strict: ECONNREFUSED, valid non-strict: ETIMEDOUT, ERROR */
4370 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);
4374 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4375 TH_ASSERT (io.rc == 0);
4380 /* Create stream socket */
4381 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4383 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4387 /* Connect to stream server (non-existent) */
4388 ARG_CONNECT(sock, ip_socket_server, 4, TCP_TIMEOUT_PORT);
4389 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4390 /* Should return error (connection timeout) */
4391 /* Strict: ETIMEDOUT, valid non-strict: ERROR */
4392 TH_ASSERT2 ((io.rc == ARM_SOCKET_ETIMEDOUT), (io.rc == ARM_SOCKET_ERROR), "connect to non-existent stream server", io.rc, ARM_SOCKET_ETIMEDOUT);
4396 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4397 TH_ASSERT (io.rc == 0);
4402 /* Create stream socket */
4403 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4405 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4411 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4412 TH_ASSERT (io.rc == 0);
4414 /* Start listening */
4416 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
4417 TH_ASSERT (io.rc == 0);
4419 /* Connect to stream server */
4420 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4421 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4422 /* Connect on listening socket should fail */
4423 /* Strict: EINVAL, valid non-strict: ERROR */
4424 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "connect on listening socket", io.rc, ARM_SOCKET_EINVAL);
4428 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4429 TH_ASSERT (io.rc == 0);
4434 /* Create datagram socket */
4435 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
4437 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
4441 /* Check parameter (socket = -1) */
4442 ARG_CONNECT(-1, ip_socket_server, 4, DISCARD_PORT);
4443 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4444 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4446 /* Check parameter (socket = INT32_MIN) */
4447 ARG_CONNECT(INT32_MIN, ip_socket_server, 4, DISCARD_PORT);
4448 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4449 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4451 /* Check parameter (socket = INT32_MAX) */
4452 ARG_CONNECT(INT32_MAX, ip_socket_server, 4, DISCARD_PORT);
4453 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4454 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4456 /* Check parameter (ip = NULL) */
4457 ARG_CONNECT(sock, NULL, 4, DISCARD_PORT);
4458 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4459 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4461 /* Check parameter (ip = 0.0.0.0) */
4462 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4463 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4464 /* Datagram sockets may dissolve the association */
4465 /* by connecting to unspecified address. */
4466 /* Strict: OK, valid non-strict: EINVAL, ERROR */
4467 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);
4469 /* Check parameter (ip_len = 0) */
4470 ARG_CONNECT(sock, ip_socket_server, 0, DISCARD_PORT);
4471 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4472 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4474 /* Check parameter (ip_len = 5) */
4475 ARG_CONNECT(sock, ip_socket_server, 5, DISCARD_PORT);
4476 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4477 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4479 /* Check parameter (port = 0) */
4480 ARG_CONNECT(sock, ip_socket_server, 4, 0);
4481 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4482 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4484 /* Connect to datagram server */
4485 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4486 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4487 TH_ASSERT (io.rc == 0);
4489 /* Connect to unspecified address (0.0.0.0) */
4490 ARG_CONNECT(sock, ip_unspec, 4, DISCARD_PORT);
4491 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4492 /* Datagram sockets may dissolve the association */
4493 /* by connecting to unspecified address. */
4494 /* Should return ok (socket address deleted) */
4495 /* Strict: OK, valid non-strict: EINVAL, ERROR */
4496 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);
4500 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4501 TH_ASSERT (io.rc == 0);
4503 /* Connect again, closed socket */
4504 ARG_CONNECT(sock, ip_socket_server, 4, DISCARD_PORT);
4505 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4506 /* Should return error (socket not created) */
4507 /* Strict: ESOCK, valid non-strict: ERROR */
4508 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "connect on closed socket", io.rc, ARM_SOCKET_ESOCK);
4517 /* Terminate worker thread */
4518 osThreadTerminate (worker);
4521 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4523 /* Recv IO parameters */
4524 #ifndef __DOXYGEN__ // Exclude form the documentation
4537 /* Assign arguments */
4538 #define ARG_RECV(_sock,_buf,_len) do { \
4544 /* Recv worker thread */
4545 __NO_RETURN static void Th_Recv (IO_RECV *io) {
4549 /* Wait for the signal to select and execute the function */
4550 flags = osThreadFlagsWait (F_CREATE_TCP | F_BIND | F_CONNECT | F_LISTEN |
4551 F_SETOPT | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
4555 /* Create stream socket */
4556 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
4561 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
4565 /* Connect on socket */
4566 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, (uint16_t)io->tval);
4570 /* Listen on socket */
4571 io->rc = drv->SocketListen (io->sock, 1);
4575 /* Set socket options */
4576 io->rc = drv->SocketSetOpt (io->sock, ARM_SOCKET_SO_RCVTIMEO, &io->tval, sizeof(io->tval));
4580 /* Recv on socket */
4581 if (io->buf != NULL) {
4582 memset((void *)io->buf, 0xCC, io->len);
4584 io->rc = drv->SocketRecv (io->sock, io->buf, io->len);
4589 io->rc = drv->SocketClose (io->sock);
4592 /* Done, send signal to owner thread */
4593 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4595 osThreadFlagsSet (io->owner, flags);
4596 osThreadFlagsClear (F_ALL);
4601 \brief Function: WIFI_SocketRecv
4602 \ingroup wifi_sock_api
4604 Test case \b WIFI_SocketRecv verifies the WiFi Driver \b SocketRecv function:
4606 int32_t (*SocketRecv) (int32_t socket, void *buf, uint32_t len);
4609 Stream socket test 1:
4610 - Create stream socket
4611 - Connect to Chargen server
4612 - Check function parameters
4613 - Receive data in blocking mode
4615 - Receive again, closed socket
4617 Stream socket test 2:
4618 - Create stream socket
4619 - Receive data, created socket
4621 - Receive data, bound socket
4623 - Receive data, listening socket
4626 Stream socket test 3:
4627 - Create stream socket
4628 - Connect to Discard server
4629 - Set receive timeout to 1 sec
4630 - Receive data, timeout expires
4633 void WIFI_SocketRecv (void) {
4635 uint32_t ticks,tout;
4636 osThreadId_t worker;
4641 if (socket_funcs_exist == 0U) {
4642 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4646 if (station_init (1) == 0) {
4647 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4651 /* Create worker thread */
4652 worker = osThreadNew ((osThreadFunc_t)Th_Recv, &io, NULL);
4653 if (worker == NULL) {
4654 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4660 /* Create stream socket */
4661 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4663 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4667 /* Connect to stream server */
4669 io.tval = CHARGEN_PORT;
4670 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4671 TH_ASSERT (io.rc == 0);
4673 /* Check parameter (socket = -1) */
4674 ARG_RECV (-1, buf, sizeof(buf));
4675 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4676 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4678 /* Check parameter (socket = INT32_MIN) */
4679 ARG_RECV (INT32_MIN, buf, sizeof(buf));
4680 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4681 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4683 /* Check parameter (socket = INT32_MAX) */
4684 ARG_RECV (INT32_MAX, buf, sizeof(buf));
4685 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4686 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4688 /* Check parameter (buf = NULL) */
4689 ARG_RECV (sock, NULL, sizeof(buf));
4690 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4691 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4693 /* Receive no data (check that received data is available) */
4694 ARG_RECV (sock, buf, 0);
4695 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4696 TH_ASSERT (io.rc == 0);
4698 /* Receive some data */
4699 ARG_RECV (sock, buffer, sizeof(buffer));
4700 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
4701 TH_ASSERT (io.rc >= 2);
4705 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4706 TH_ASSERT (io.rc == 0);
4708 /* Receive again, closed socket */
4709 ARG_RECV (sock, buffer, sizeof(buffer));
4710 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4711 /* Should return error (socket not created) */
4712 /* Strict: ESOCK, valid non-strict: ERROR */
4713 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "recv on closed socket", io.rc, ARM_SOCKET_ESOCK);
4718 /* Create stream socket */
4719 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4721 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4723 /* Test server mode */
4726 /* Receive, created socket */
4727 ARG_RECV (sock, buffer, sizeof(buffer));
4728 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4729 /* Should return error (socket not connected) */
4730 /* Strict: ENOTCONN, valid non-strict: ERROR */
4731 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on created socket", io.rc, ARM_SOCKET_ENOTCONN);
4735 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
4736 TH_ASSERT (io.rc == 0);
4738 /* Receive, bound socket */
4739 ARG_RECV (sock, buffer, sizeof(buffer));
4740 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4741 /* Should return error (socket not connected) */
4742 /* Strict: ENOTCONN, valid non-strict: ERROR */
4743 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
4745 /* Start listening */
4747 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
4748 TH_ASSERT (io.rc == 0);
4750 /* Receive, listening socket */
4751 ARG_RECV (sock, buffer, sizeof(buffer));
4752 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4753 /* Should return error (socket not connected) */
4754 /* Strict: ENOTCONN, valid non-strict: ERROR */
4755 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "recv on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
4759 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4760 TH_ASSERT (io.rc == 0);
4765 /* Create stream socket */
4766 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
4768 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
4772 /* Connect to stream server */
4774 io.tval = DISCARD_PORT;
4775 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
4776 TH_ASSERT (io.rc == 0);
4778 /* Set receive timeout to 1 sec */
4781 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
4782 TH_ASSERT (io.rc == 0);
4784 /* Receive until timeout, no data */
4785 ARG_RECV (sock, buffer, sizeof(buffer));
4786 ticks = GET_SYSTICK();
4787 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT);
4788 tout = GET_SYSTICK() - ticks;
4789 /* Should return EAGAIN (operation timed out) */
4790 TH_ASSERT (io.rc == ARM_SOCKET_EAGAIN);
4791 /* Check receive timeout is in the range of 0.9 to 1.1 sec */
4792 TH_ASSERT (tout > SYSTICK_MICROSEC(900000) && tout < SYSTICK_MICROSEC(1100000));
4796 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
4797 TH_ASSERT (io.rc == 0);
4806 /* Terminate worker thread */
4807 osThreadTerminate (worker);
4810 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4812 /* RecvFrom IO parameters */
4813 #ifndef __DOXYGEN__ // Exclude form the documentation
4829 /* Assign arguments */
4830 #define ARG_RECVFROM(_sock,_buf,_len,_ip,_ip_len,_port) do { \
4835 io.ip_len = _ip_len; \
4839 /* RecvFrom worker thread */
4840 __NO_RETURN static void Th_RecvFrom (IO_RECVFROM *io) {
4844 /* Wait for the signal to select and execute the function */
4845 flags = osThreadFlagsWait (F_CREATE_UDP | F_CONNECT | F_SETOPT |
4846 F_RECVFROM | F_SEND | F_CLOSE, osFlagsWaitAny, osWaitForever);
4850 /* Create datagram socket */
4851 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
4855 /* Connect on socket */
4856 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, CHARGEN_PORT);
4860 /* Set socket options */
4861 io->rc = drv->SocketSetOpt (io->sock, ARM_SOCKET_SO_RCVTIMEO, &io->tout, sizeof(io->tout));
4865 /* RecvFrom on socket */
4866 if (io->buf != NULL) {
4867 memset((void *)io->buf, 0xCC, io->len);
4869 io->rc = drv->SocketRecvFrom (io->sock, io->buf, io->len, io->ip, io->ip_len, io->port);
4873 /* Send on socket */
4874 io->rc = drv->SocketSend (io->sock, "a", 1);
4879 io->rc = drv->SocketClose (io->sock);
4882 /* Done, send signal to owner thread */
4883 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
4885 osThreadFlagsSet (io->owner, flags);
4886 osThreadFlagsClear (F_ALL);
4891 \brief Function: WIFI_SocketRecvFrom
4892 \ingroup wifi_sock_api
4894 The test function \b WIFI_SocketRecvFrom verifies the WiFi Driver \b SocketRecvFrom function:
4896 int32_t (*SocketRecvFrom) (int32_t socket, void *buf, uint32_t len, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
4899 Datagram socket test 1:
4900 - Create datagram socket
4901 - Connect to Chargen server
4902 - Check function parameters
4903 - Receive data in blocking mode
4904 - Set receive timeout to 1 sec
4905 - Receive again, timeout expires
4907 - Receive again, closed socket
4909 void WIFI_SocketRecvFrom (void) {
4911 uint32_t ip_len,ticks,tout;
4914 osThreadId_t worker;
4919 if (socket_funcs_exist == 0U) {
4920 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
4924 if (station_init (1) == 0) {
4925 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
4929 /* Create worker thread */
4930 worker = osThreadNew ((osThreadFunc_t)Th_RecvFrom, &io, NULL);
4931 if (worker == NULL) {
4932 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
4938 /* Create datagram socket */
4939 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
4941 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
4945 /* Connect to datagram server */
4947 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
4948 TH_ASSERT (io.rc == 0);
4950 /* Check parameter (socket = -1) */
4951 ip_len = sizeof(ip);
4952 ARG_RECVFROM (-1, buf, sizeof(buf), ip, &ip_len, &port);
4953 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4954 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4956 /* Check parameter (socket = INT32_MIN) */
4957 ARG_RECVFROM (INT32_MIN, buf, sizeof(buf), ip, &ip_len, &port);
4958 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4959 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4961 /* Check parameter (socket = INT32_MAX) */
4962 ARG_RECVFROM (INT32_MAX, buf, sizeof(buf), ip, &ip_len, &port);
4963 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4964 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
4966 /* Check parameter (buf == NULL) */
4967 ARG_RECVFROM (sock, NULL, sizeof(buf), ip, &ip_len, &port);
4968 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
4969 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
4971 /* Send one byte of data to trigger a reply */
4973 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
4974 TH_ASSERT (io.rc == 1);
4976 /* Initialize buffers for return values */
4978 ip_len = sizeof(ip) + 1;
4979 memset ((void *)ip, 0, sizeof(ip));
4981 /* Receive no data (check that received data is available) */
4982 ARG_RECVFROM (sock, NULL, 0, ip, &ip_len, &port);
4983 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT_LONG);
4984 TH_ASSERT (io.rc == 0);
4986 /* Receive some data */
4987 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
4988 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT_LONG);
4989 /* Should receive at least 2 bytes */
4990 TH_ASSERT (io.rc >= 2);
4991 /* IP address should be the address of the server */
4992 TH_ASSERT ((memcmp ((const void *)ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
4993 /* Port number should be the port of the CHARGEN server */
4994 TH_ASSERT (port == CHARGEN_PORT);
4996 /* Set receive timeout to 1 sec */
4999 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
5000 TH_ASSERT (io.rc == 0);
5002 /* Receive until timeout, no data */
5003 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
5004 ticks = GET_SYSTICK();
5005 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
5006 tout = GET_SYSTICK() - ticks;
5007 /* Should return EAGAIN (operation timed out) */
5008 TH_ASSERT (io.rc == ARM_SOCKET_EAGAIN);
5009 /* Check receive timeout is in the range of 0.9 to 1.1 sec */
5010 TH_ASSERT (tout > SYSTICK_MICROSEC(900000) && tout < SYSTICK_MICROSEC(1100000));
5014 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5015 TH_ASSERT (io.rc == 0);
5017 /* Receive again, closed socket */
5018 ARG_RECVFROM (sock, buffer, sizeof(buffer), ip, &ip_len, &port);
5019 TH_EXECUTE (F_RECVFROM, WIFI_SOCKET_TIMEOUT);
5020 /* Should return error (socket not created) */
5021 /* Strict: ESOCK, valid non-strict: ERROR */
5022 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "recvfrom on closed socket", io.rc, ARM_SOCKET_ESOCK);
5031 /* Terminate worker thread */
5032 osThreadTerminate (worker);
5035 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5037 /* Send IO parameters */
5038 #ifndef __DOXYGEN__ // Exclude form the documentation
5050 /* Assign arguments */
5051 #define ARG_SEND(_sock,_buf,_len) do { \
5057 /* Send worker thread */
5058 __NO_RETURN static void Th_Send (IO_SEND *io) {
5062 /* Wait for the signal to select and execute the function */
5063 flags = osThreadFlagsWait (F_CREATE_TCP | F_BIND | F_CONNECT |
5064 F_LISTEN | F_SEND | F_CLOSE, osFlagsWaitAny, osWaitForever);
5068 /* Create stream socket */
5069 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
5074 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
5078 /* Connect on socket */
5079 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
5083 /* Listen on socket */
5084 io->rc = drv->SocketListen (io->sock, 1);
5088 /* Send on socket */
5089 io->rc = drv->SocketSend (io->sock, io->buf, io->len);
5094 io->rc = drv->SocketClose (io->sock);
5097 /* Done, send signal to owner thread */
5098 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5100 osThreadFlagsSet (io->owner, flags);
5101 osThreadFlagsClear (F_ALL);
5106 \brief Function: WIFI_SocketSend
5107 \ingroup wifi_sock_api
5109 The test function \b WIFI_SocketSend verifies the WiFi Driver \b SocketSend function:
5111 int32_t (*SocketSend) (int32_t socket, const void *buf, uint32_t len);
5114 Stream socket test 1:
5115 - Create stream socket
5116 - Connect to server, blocking mode
5117 - Check function parameters
5118 - Send data, blocking mode
5120 - Send again, closed socket
5122 Stream socket test 2:
5123 - Create stream socket
5124 - Connect to server, blocking mode
5125 - Send ESC data, server disconnects
5126 - Send again, disconnected socket
5129 Stream socket test 3:
5130 - Create stream socket
5131 - Send data, created socket
5133 - Send data, bound socket
5135 - Send data, listening socket
5137 - Send again, closed socket
5139 void WIFI_SocketSend (void) {
5140 osThreadId_t worker;
5145 if (socket_funcs_exist == 0U) {
5146 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5150 if (station_init (1) == 0) {
5151 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5155 /* Create worker thread */
5156 worker = osThreadNew ((osThreadFunc_t)Th_Send, &io, NULL);
5157 if (worker == NULL) {
5158 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5164 /* Create stream socket */
5165 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5167 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5171 /* Connect to stream server */
5173 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5174 TH_ASSERT (io.rc == 0);
5176 /* Check parameter (socket = -1) */
5177 ARG_SEND (-1, test_msg, sizeof(test_msg));
5178 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5179 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5181 /* Check parameter (socket = INT32_MIN) */
5182 ARG_SEND (INT32_MIN, test_msg, sizeof(test_msg));
5183 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5184 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5186 /* Check parameter (socket = INT32_MAX) */
5187 ARG_SEND (INT32_MAX, test_msg, sizeof(test_msg));
5188 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5189 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5191 /* Check parameter (buf = NULL) */
5192 ARG_SEND (sock, NULL, sizeof(test_msg));
5193 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5194 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5196 /* Send no data (check that send is available) */
5197 ARG_SEND (sock, test_msg, 0);
5198 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5199 TH_ASSERT (io.rc == 0);
5201 /* Send some data */
5202 ARG_SEND (sock, test_msg, sizeof(test_msg));
5203 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
5204 TH_ASSERT (io.rc == sizeof(test_msg));
5208 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5209 TH_ASSERT (io.rc == 0);
5211 /* Send again, closed socket */
5212 ARG_SEND (sock, test_msg, sizeof(test_msg));
5213 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5214 /* Should return error (socket not created) */
5215 /* Strict: ESOCK, valid non-strict: ERROR */
5216 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "send on closed socket", io.rc, ARM_SOCKET_ESOCK);
5221 /* Create stream socket */
5222 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5224 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5228 /* Connect to stream server */
5230 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5231 TH_ASSERT (io.rc == 0);
5233 /* Send ESC command, server disconnects */
5234 ARG_SEND (sock, (uint8_t *)"\x1B", 1);
5235 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT_LONG);
5236 TH_ASSERT (io.rc == 1);
5238 /* Wait for the server to disconnect */
5241 /* Send again, disconnected socket */
5242 ARG_SEND (sock, test_msg, sizeof(test_msg));
5243 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5244 /* Should return error (connection reset by the peer) */
5245 /* Strict: ECONNRESET, valid non-strict: ERROR */
5246 TH_ASSERT2 ((io.rc == ARM_SOCKET_ECONNRESET), (io.rc == ARM_SOCKET_ERROR), "send on disconnected socket", io.rc, ARM_SOCKET_ECONNRESET);
5250 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5251 TH_ASSERT (io.rc == 0);
5256 /* Create stream socket */
5257 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5259 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5263 /* Send data, created socket */
5264 ARG_SEND (sock, test_msg, sizeof(test_msg));
5265 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5266 /* Should return error (socket not connected) */
5267 /* Strict: ENOTCONN, valid non-strict: ERROR */
5268 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on created socket", io.rc, ARM_SOCKET_ENOTCONN);
5272 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5273 TH_ASSERT (io.rc == 0);
5275 /* Send data, bound socket */
5276 ARG_SEND (sock, test_msg, sizeof(test_msg));
5277 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5278 /* Should return error (socket not connected) */
5279 /* Strict: ENOTCONN, valid non-strict: ERROR */
5280 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
5282 /* Start listening */
5284 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
5285 TH_ASSERT (io.rc == 0);
5287 /* Send data, listening socket */
5288 ARG_SEND (sock, test_msg, sizeof(test_msg));
5289 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5290 /* Should return error (socket not connected) */
5291 /* Strict: ENOTCONN, valid non-strict: ERROR */
5292 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "send on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
5296 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5297 TH_ASSERT (io.rc == 0);
5299 /* Send again, closed socket */
5300 ARG_SEND (sock, test_msg, sizeof(test_msg));
5301 TH_EXECUTE (F_SEND, WIFI_SOCKET_TIMEOUT);
5302 /* Should return error (socket not created) */
5303 /* Strict: ESOCK, valid non-strict: ERROR */
5304 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "send on closed socket", io.rc, ARM_SOCKET_ESOCK);
5313 /* Terminate worker thread */
5314 osThreadTerminate (worker);
5317 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5319 /* SendTo IO parameters */
5320 #ifndef __DOXYGEN__ // Exclude form the documentation
5336 /* Assign arguments */
5337 #define ARG_SENDTO(_sock,_buf,_len,_ip,_ip_len,_port) do { \
5342 io.ip_len = _ip_len; \
5346 /* SendTo worker thread */
5347 __NO_RETURN static void Th_SendTo (IO_SENDTO *io) {
5351 /* Wait for the signal to select and execute the function */
5352 flags = osThreadFlagsWait (F_CREATE_UDP | F_SENDTO | F_RECV | F_CLOSE, osFlagsWaitAny, osWaitForever);
5356 /* Create datagram socket */
5357 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5361 /* SendTo on socket */
5362 io->rc = drv->SocketSendTo (io->sock, io->buf, io->len, io->ip, io->ip_len, io->port);
5366 /* Recv on socket */
5367 memset((void *)buffer, 0xCC, sizeof(buffer));
5368 io->rc = drv->SocketRecv (io->sock, buffer, sizeof(buffer));
5373 io->rc = drv->SocketClose (io->sock);
5376 /* Done, send signal to owner thread */
5377 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5379 osThreadFlagsSet (io->owner, flags);
5380 osThreadFlagsClear (F_ALL);
5385 \brief Function: WIFI_SocketSendTo
5386 \ingroup wifi_sock_api
5388 The test function \b WIFI_SocketSend verifies the WiFi Driver \b SocketSendTo function:
5390 int32_t (*SocketSendTo) (int32_t socket, const void *buf, uint32_t len, const uint8_t *ip, uint32_t ip_len, uint16_t port);
5393 Datagram socket test:
5394 - Create datagram socket
5395 - Check function parameters
5396 - Send data, blocking mode
5397 - Receive echo data, verify if the same
5399 - Send again, closed socket
5401 void WIFI_SocketSendTo (void) {
5402 osThreadId_t worker;
5407 if (socket_funcs_exist == 0U) {
5408 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5412 if (station_init (1) == 0) {
5413 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5417 /* Create worker thread */
5418 worker = osThreadNew ((osThreadFunc_t)Th_SendTo, &io, NULL);
5419 if (worker == NULL) {
5420 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5426 /* Create datagram socket */
5427 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5429 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5433 /* Check parameter (socket = -1) */
5434 ARG_SENDTO (-1, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5435 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5436 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5438 /* Check parameter (socket = INT32_MIN) */
5439 ARG_SENDTO (INT32_MIN, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5440 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5441 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5443 /* Check parameter (socket = INT32_MAX) */
5444 ARG_SENDTO (INT32_MAX, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5445 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5446 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5448 /* Check parameter (buf == NULL) */
5449 ARG_SENDTO (sock, NULL, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5450 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5451 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
5453 /* Send no data (check that send is available) */
5454 ARG_SENDTO (sock, test_msg, 0, ip_socket_server, 4, ECHO_PORT);
5455 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5456 TH_ASSERT (io.rc == 0);
5458 /* Send some data */
5459 ARG_SENDTO (sock, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5460 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT_LONG);
5461 TH_ASSERT (io.rc == sizeof(test_msg));
5463 /* Receive the echoed data */
5465 TH_EXECUTE (F_RECV, WIFI_SOCKET_TIMEOUT_LONG);
5466 /* Should receive the same data (ECHO protocol) */
5467 TH_ASSERT ((io.rc == sizeof(test_msg)) && (memcmp ((const void *)test_msg, (const void *)buffer, sizeof(test_msg)) == 0));
5471 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5472 TH_ASSERT (io.rc == 0);
5474 /* Send again, closed socket */
5475 ARG_SENDTO (sock, test_msg, sizeof(test_msg), ip_socket_server, 4, ECHO_PORT);
5476 TH_EXECUTE (F_SENDTO, WIFI_SOCKET_TIMEOUT);
5477 /* Should return error (socket not created) */
5478 /* Strict: ESOCK, valid non-strict: ERROR */
5479 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "sendto on closed socket", io.rc, ARM_SOCKET_ESOCK);
5488 /* Terminate worker thread */
5489 osThreadTerminate (worker);
5492 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5494 /* GetSockName IO parameters */
5495 #ifndef __DOXYGEN__ // Exclude form the documentation
5508 /* Assign arguments */
5509 #define ARG_GETSOCKNAME(_sock,_ip,_ip_len,_port) do { \
5512 io.ip_len = _ip_len; \
5516 /* GetSockName worker thread */
5517 __NO_RETURN static void Th_GetSockName (IO_GETSOCKNAME *io) {
5521 /* Wait for the signal to select and execute the function */
5522 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
5523 F_CONNECT | F_GETSOCKNAME | F_CLOSE, osFlagsWaitAny, osWaitForever);
5527 /* Create stream socket */
5528 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
5532 /* Create datagram socket */
5533 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5538 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
5542 /* Connect on socket */
5543 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
5547 /* Get socket name */
5548 io->rc = drv->SocketGetSockName (io->sock, io->ip, io->ip_len, io->port);
5553 io->rc = drv->SocketClose (io->sock);
5556 /* Done, send signal to owner thread */
5557 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5559 osThreadFlagsSet (io->owner, flags);
5560 osThreadFlagsClear (F_ALL);
5565 \brief Function: WIFI_SocketGetSockName
5566 \ingroup wifi_sock_api
5568 The test function \b WIFI_SocketGetSockName verifies the WiFi Driver \b SocketGetSockName function:
5570 int32_t (*SocketGetSockName) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
5573 Stream socket test 1:
5574 - Create stream socket
5575 - Connect to server, blocking mode
5576 - Check function parameters
5579 - Get socket name again, closed socket
5581 Stream socket test 1:
5582 - Create stream socket
5583 - Get socket name, not bound
5585 - Get socket name, bound
5588 Datagram socket test 1:
5589 - Create datagram socket
5590 - Connect to server, enable packet filtering
5591 - Check function parameters
5594 - Get socket name again, closed socket
5596 Datagram socket test 1:
5597 - Create datagram socket
5598 - Get socket name, not bound
5600 - Get socket name, bound
5603 void WIFI_SocketGetSockName (void) {
5604 uint8_t local_ip[5];
5605 uint16_t local_port;
5607 osThreadId_t worker;
5612 if (socket_funcs_exist == 0U) {
5613 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5617 if (station_init (1) == 0) {
5618 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5622 /* Create worker thread */
5623 worker = osThreadNew ((osThreadFunc_t)Th_GetSockName, &io, NULL);
5624 if (worker == NULL) {
5625 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
5631 /* Create stream socket */
5632 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5634 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5636 /* Test client mode */
5639 /* Connect to stream server */
5641 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
5642 TH_ASSERT (io.rc == 0);
5644 /* Check parameter (socket = -1) */
5645 ip_len = sizeof(local_ip);
5646 ARG_GETSOCKNAME (-1, local_ip, &ip_len, &local_port);
5647 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5648 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5650 /* Check parameter (socket = INT32_MIN) */
5651 ARG_GETSOCKNAME (INT32_MIN, local_ip, &ip_len, &local_port);
5652 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5653 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5655 /* Check parameter (socket = INT32_MAX) */
5656 ARG_GETSOCKNAME (INT32_MAX, local_ip, &ip_len, &local_port);
5657 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5658 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5660 /* Check parameter (port = NULL) */
5661 ip_len = sizeof(local_ip);
5662 ARG_GETSOCKNAME (sock, local_ip, &ip_len, NULL);
5663 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5664 /* Request IP address only should be accepted */
5665 TH_ASSERT (io.rc == 0);
5667 /* Check parameter (ip = NULL, ip_len = NULL) */
5668 ARG_GETSOCKNAME (sock, NULL, NULL, &local_port);
5669 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5670 /* Request port only should be accepted */
5671 TH_ASSERT (io.rc == 0);
5673 /* Initialize buffers for return values */
5675 ip_len = sizeof(local_ip) + 1;
5676 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5678 /* Retrieve socket name */
5679 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5680 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5681 TH_ASSERT (io.rc == 0);
5682 /* IP address should be different from broadcast */
5683 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_bcast, 4) != 0) && (ip_len == 4));
5684 /* Port number should be non-zero */
5685 TH_ASSERT (local_port != 0);
5689 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5690 TH_ASSERT (io.rc == 0);
5692 /* Retrieve socket name again */
5693 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5694 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5695 /* Should return error (socket not created) */
5696 /* Strict: ESOCK, valid non-strict: ERROR */
5697 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockname on closed socket", io.rc, ARM_SOCKET_ESOCK);
5702 /* Create stream socket */
5703 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
5705 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
5707 /* Test server mode */
5710 /* Retrieve socket name, not bound */
5711 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5712 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5713 /* Should return error (socket not bound) */
5714 /* Strict: EINVAL, valid non-strict: ERROR */
5715 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "getsockname on unbound socket", io.rc, ARM_SOCKET_EINVAL);
5717 /* Initialize buffers for return values */
5719 ip_len = sizeof(local_ip) + 1;
5720 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5724 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5725 TH_ASSERT (io.rc == 0);
5727 /* Retrieve socket name, bound */
5728 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5729 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5730 TH_ASSERT (io.rc == 0);
5731 /* IP address should be unspecified */
5732 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_unspec, 4) == 0) && (ip_len == 4));
5733 /* Port number should be listening port */
5734 TH_ASSERT (local_port == DISCARD_PORT);
5738 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5739 TH_ASSERT (io.rc == 0);
5744 /* Create datagram socket */
5745 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5747 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5749 /* Test client mode */
5752 /* Connect to datagram server */
5754 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
5755 TH_ASSERT (io.rc == 0);
5757 /* Check parameter (socket = -1) */
5758 ARG_GETSOCKNAME (-1, local_ip, &ip_len, &local_port);
5759 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5760 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5762 /* Check parameter (socket = INT32_MIN) */
5763 ARG_GETSOCKNAME (INT32_MIN, local_ip, &ip_len, &local_port);
5764 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5765 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5767 /* Check parameter (socket = INT32_MAX) */
5768 ARG_GETSOCKNAME (INT32_MAX, local_ip, &ip_len, &local_port);
5769 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5770 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
5772 /* Check parameter (port = NULL) */
5773 ip_len = sizeof(local_ip);
5774 ARG_GETSOCKNAME (sock, local_ip, &ip_len, NULL);
5775 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5776 /* Request IP address only should be accepted */
5777 TH_ASSERT (io.rc == 0);
5779 /* Check parameter (ip = NULL, ip_len = NULL) */
5780 ARG_GETSOCKNAME (sock, NULL, NULL, &local_port);
5781 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5782 /* Request port only should be accepted */
5783 TH_ASSERT (io.rc == 0);
5785 /* Initialize buffers for return values */
5787 ip_len = sizeof(local_ip) + 1;
5788 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5790 /* Retrieve socket name */
5791 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5792 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5793 TH_ASSERT (io.rc == 0);
5794 /* IP address should be different from broadcast */
5795 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_bcast, 4) != 0) && (ip_len == 4));
5796 /* Port number should be non-zero */
5797 TH_ASSERT (local_port != 0);
5801 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5802 TH_ASSERT (io.rc == 0);
5804 /* Retrieve socket name again */
5805 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5806 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5807 /* Should return error (socket not created) */
5808 /* Strict: ESOCK, valid non-strict: ERROR */
5809 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockname on closed socket", io.rc, ARM_SOCKET_ESOCK);
5814 /* Create datagram socket */
5815 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
5817 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
5819 /* Test server mode */
5822 /* Retrieve socket name, not bound */
5823 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5824 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5825 /* Should return error (socket not bound) */
5826 /* Strict: EINVAL, valid non-strict: ERROR */
5827 TH_ASSERT2 ((io.rc == ARM_SOCKET_EINVAL), (io.rc == ARM_SOCKET_ERROR), "getsockname on unbound socket", io.rc, ARM_SOCKET_EINVAL);
5829 /* Initialize buffers for return values */
5831 ip_len = sizeof(local_ip) + 1;
5832 memcpy (local_ip, ip_bcast, sizeof(local_ip));
5836 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
5837 TH_ASSERT (io.rc == 0);
5839 /* Retrieve socket name, bound */
5840 ARG_GETSOCKNAME (sock, local_ip, &ip_len, &local_port);
5841 TH_EXECUTE (F_GETSOCKNAME, WIFI_SOCKET_TIMEOUT);
5842 TH_ASSERT (io.rc == 0);
5843 /* IP address should be unspecified */
5844 TH_ASSERT ((memcmp ((const void *)local_ip, (const void *)ip_unspec, 4) == 0) && (ip_len == 4));
5845 /* Port number should be listening port */
5846 TH_ASSERT (local_port == DISCARD_PORT);
5850 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
5851 TH_ASSERT (io.rc == 0);
5860 /* Terminate worker thread */
5861 osThreadTerminate (worker);
5864 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
5866 /* GetPeerName IO parameters */
5867 #ifndef __DOXYGEN__ // Exclude form the documentation
5880 /* Assign arguments */
5881 #define ARG_GETPEERNAME(_sock,_ip,_ip_len,_port) do { \
5884 io.ip_len = _ip_len; \
5888 /* GetPeerName worker thread */
5889 __NO_RETURN static void Th_GetPeerName (IO_GETPEERNAME *io) {
5893 /* Wait for the signal to select and execute the function */
5894 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND | F_CONNECT |
5895 F_LISTEN | F_GETPEERNAME | F_CLOSE, osFlagsWaitAny, osWaitForever);
5899 /* Create stream socket */
5900 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
5904 /* Create datagram socket */
5905 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
5910 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
5914 /* Connect on socket */
5915 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
5919 /* Listen on socket */
5920 io->rc = drv->SocketListen (io->sock, 1);
5925 io->rc = drv->SocketGetPeerName (io->sock, io->ip, io->ip_len, io->port);
5930 io->rc = drv->SocketClose (io->sock);
5933 /* Done, send signal to owner thread */
5934 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
5936 osThreadFlagsSet (io->owner, flags);
5937 osThreadFlagsClear (F_ALL);
5942 \brief Function: WIFI_SocketGetPeerName
5943 \ingroup wifi_sock_api
5945 The test function \b WIFI_SocketGetPeerName verifies the WiFi Driver \b SocketGetPeerName function:
5947 int32_t (*SocketGetPeerName) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port);
5950 Stream socket test 1:
5951 - Create stream socket
5952 - Connect to server, blocking mode
5953 - Check function parameters
5956 - Get peer name, closed socket
5958 Stream socket test 2:
5959 - Create stream socket
5960 - Get peer name, created socket
5962 - Get peer name, bound socket
5964 - Get peer name, listening socket
5967 Datagram socket test:
5968 - Create datagram socket
5969 - Connect to server, enable packet filtering
5970 - Check function parameters
5973 - Get peer name, closed socket
5975 void WIFI_SocketGetPeerName (void) {
5979 osThreadId_t worker;
5984 if (socket_funcs_exist == 0U) {
5985 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
5989 if (station_init (1) == 0) {
5990 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
5994 /* Create worker thread */
5995 worker = osThreadNew ((osThreadFunc_t)Th_GetPeerName, &io, NULL);
5996 if (worker == NULL) {
5997 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6003 /* Create stream socket */
6004 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6006 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6010 /* Connect to stream server */
6012 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
6013 TH_ASSERT (io.rc == 0);
6015 /* Check parameter (socket = -1) */
6016 ip_len = sizeof(peer_ip);
6017 ARG_GETPEERNAME (-1, peer_ip, &ip_len, &peer_port);
6018 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6019 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6021 /* Check parameter (socket = INT32_MIN) */
6022 ARG_GETPEERNAME (INT32_MIN, peer_ip, &ip_len, &peer_port);
6023 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6024 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6026 /* Check parameter (socket = INT32_MAX) */
6027 ARG_GETPEERNAME (INT32_MAX, peer_ip, &ip_len, &peer_port);
6028 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6029 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6031 /* Check parameter (port = NULL) */
6032 ip_len = sizeof(peer_ip);
6033 ARG_GETPEERNAME (sock, peer_ip, &ip_len, NULL);
6034 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6035 /* Request IP address only should be accepted */
6036 TH_ASSERT (io.rc == 0);
6038 /* Check parameter (ip = NULL, ip_len = NULL) */
6039 ARG_GETPEERNAME (sock, NULL, NULL, &peer_port);
6040 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6041 /* Request port only should be accepted */
6042 TH_ASSERT (io.rc == 0);
6044 /* Initialize buffers for return values */
6046 ip_len = sizeof(peer_ip) + 1;
6047 memcpy (peer_ip, ip_bcast, sizeof(peer_ip));
6049 /* Retrieve peer name */
6050 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6051 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6052 TH_ASSERT (io.rc == 0);
6053 /* IP address should be the address of the server */
6054 TH_ASSERT ((memcmp ((const void *)peer_ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
6055 /* Port number should be the DISCARD port */
6056 TH_ASSERT (peer_port == DISCARD_PORT);
6058 /* Close stream socket */
6060 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6061 TH_ASSERT (io.rc == 0);
6063 /* Retrieve peer name again */
6064 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6065 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6066 /* Should return error (socket not created) */
6067 /* Strict: ESOCK, valid non-strict: ERROR */
6068 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getpeername on closed socket", io.rc, ARM_SOCKET_ESOCK);
6073 /* Create stream socket */
6074 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6076 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6080 /* Get peer name, created socket */
6081 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6082 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6083 /* Should return error (socket not connected) */
6084 /* Strict: ENOTCONN, valid non-strict: ERROR */
6085 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on created socket", io.rc, ARM_SOCKET_ENOTCONN);
6089 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
6090 TH_ASSERT (io.rc == 0);
6092 /* Get peer name, bound socket */
6093 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6094 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6095 /* Should return error (socket not connected) */
6096 /* Strict: ENOTCONN, valid non-strict: ERROR */
6097 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on bound socket", io.rc, ARM_SOCKET_ENOTCONN);
6099 /* Start listening */
6101 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
6102 TH_ASSERT (io.rc == 0);
6104 /* Get peer name, listening socket */
6105 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6106 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6107 /* Should return error (socket not connected) */
6108 /* Strict: ENOTCONN, valid non-strict: ERROR */
6109 TH_ASSERT2 ((io.rc == ARM_SOCKET_ENOTCONN), (io.rc == ARM_SOCKET_ERROR), "getpeername on listening socket", io.rc, ARM_SOCKET_ENOTCONN);
6113 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6114 TH_ASSERT (io.rc == 0);
6119 /* Create datagram socket */
6120 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6122 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6126 /* Connect to datagram server */
6128 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
6129 TH_ASSERT (io.rc == 0);
6131 /* Check parameter (socket = -1) */
6132 ip_len = sizeof(peer_ip);
6133 ARG_GETPEERNAME (-1, peer_ip, &ip_len, &peer_port);
6134 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6135 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6137 /* Check parameter (socket = INT32_MIN) */
6138 ARG_GETPEERNAME (INT32_MIN, peer_ip, &ip_len, &peer_port);
6139 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6140 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6142 /* Check parameter (socket = INT32_MAX) */
6143 ARG_GETPEERNAME (INT32_MAX, peer_ip, &ip_len, &peer_port);
6144 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6145 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6147 /* Check parameter (port = NULL) */
6148 ip_len = sizeof(peer_ip);
6149 ARG_GETPEERNAME (sock, peer_ip, &ip_len, NULL);
6150 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6151 /* Request IP address only should be accepted */
6152 TH_ASSERT (io.rc == 0);
6154 /* Check parameter (ip = NULL, ip_len = NULL) */
6155 ARG_GETPEERNAME (sock, NULL, NULL, &peer_port);
6156 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6157 /* Request port only should be accepted */
6158 TH_ASSERT (io.rc == 0);
6160 /* Initialize buffers for return values */
6162 ip_len = sizeof(peer_ip) + 1;
6163 memcpy (peer_ip, ip_bcast, sizeof(peer_ip));
6165 /* Retrieve peer name */
6166 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6167 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6168 TH_ASSERT (io.rc == 0);
6169 /* IP address should be the address of the server */
6170 TH_ASSERT ((memcmp ((const void *)peer_ip, (const void *)ip_socket_server, 4) == 0) && (ip_len == 4));
6171 /* Port number should be the DISCARD port */
6172 TH_ASSERT (peer_port == DISCARD_PORT);
6176 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6177 TH_ASSERT (io.rc == 0);
6179 /* Retrieve peer name again */
6180 ARG_GETPEERNAME (sock, peer_ip, &ip_len, &peer_port);
6181 TH_EXECUTE (F_GETPEERNAME, WIFI_SOCKET_TIMEOUT);
6182 /* Should return error (socket not created) */
6183 /* Strict: ESOCK, valid non-strict: ERROR */
6184 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getpeername on closed socket", io.rc, ARM_SOCKET_ESOCK);
6193 /* Terminate worker thread */
6194 osThreadTerminate (worker);
6197 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6199 /* GetOpt IO parameters */
6200 #ifndef __DOXYGEN__ // Exclude form the documentation
6213 /* Assign arguments */
6214 #define ARG_GETOPT(_sock,_opt_id,_opt_val,_opt_len) do { \
6216 io.opt_id = _opt_id; \
6217 io.opt_val = _opt_val; \
6218 io.opt_len = _opt_len; \
6221 /* GetOpt worker thread */
6222 __NO_RETURN static void Th_GetOpt (IO_GETOPT *io) {
6226 /* Wait for the signal to select and execute the function */
6227 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
6228 F_GETOPT | F_CLOSE, osFlagsWaitAny, osWaitForever);
6232 /* Create stream socket */
6233 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6237 /* Create datagram socket */
6238 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6242 /* Get socket options */
6243 io->rc = drv->SocketGetOpt (io->sock, io->opt_id, io->opt_val, io->opt_len);
6248 io->rc = drv->SocketClose (io->sock);
6251 /* Done, send signal to owner thread */
6252 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6254 osThreadFlagsSet (io->owner, flags);
6255 osThreadFlagsClear (F_ALL);
6260 \brief Function: WIFI_SocketGetOpt
6261 \ingroup wifi_sock_api
6263 The test function \b WIFI_SocketGetOpt verifies the WiFi Driver \b SocketGetOpt function:
6265 int32_t (*SocketGetOpt) (int32_t socket, int32_t opt_id, void *opt_val, uint32_t *opt_len);
6269 - Create stream socket
6270 - Check function parameters
6271 - Get socket options
6273 - Get socket options again, closed socket
6275 Datagram socket test:
6276 - Create datagram socket
6281 void WIFI_SocketGetOpt (void) {
6284 osThreadId_t worker;
6289 if (socket_funcs_exist == 0U) {
6290 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6294 if (station_init (1) == 0) {
6295 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6299 /* Create worker thread */
6300 worker = osThreadNew ((osThreadFunc_t)Th_GetOpt, &io, NULL);
6301 if (worker == NULL) {
6302 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6308 /* Create stream socket */
6309 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6311 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6315 /* Check parameter (socket = -1) */
6316 opt_len = sizeof(opt_val);
6317 ARG_GETOPT (-1, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6318 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6319 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6321 /* Check parameter (socket = INT32_MIN) */
6322 ARG_GETOPT (INT32_MIN, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6323 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6324 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6326 /* Check parameter (socket = INT32_MAX) */
6327 ARG_GETOPT (INT32_MAX, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6328 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6329 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6331 /* Check parameter (opt_id = -1) */
6332 ARG_GETOPT (sock, -1, &opt_val, &opt_len);
6333 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6334 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6336 /* Check parameter (opt_id = INT32_MIN) */
6337 ARG_GETOPT (sock, INT32_MIN, &opt_val, &opt_len);
6338 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6339 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6341 /* Check parameter (opt_id = INT32_MAX) */
6342 ARG_GETOPT (sock, INT32_MAX, &opt_val, &opt_len);
6343 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6344 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6346 /* Check parameter (opt_val = NULL) */
6347 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, NULL, &opt_len);
6348 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6349 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6351 /* Check parameter (opt_len = NULL) */
6352 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, NULL);
6353 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6354 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6356 /* Check parameter (*opt_len = 0) */
6358 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6359 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6360 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6362 /* Check parameter (*opt_len = 5) */
6364 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6365 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6366 TH_ASSERT ((io.rc == 0) && (opt_len == 4));
6368 /* Get option FIONBIO (set only) */
6369 opt_len = sizeof(opt_val);
6370 ARG_GETOPT (sock, ARM_SOCKET_IO_FIONBIO, &opt_val, &opt_len);
6371 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6372 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6374 /* Get option RCVTIMEO */
6375 opt_len = sizeof(opt_val) + 1;
6376 opt_val = 0xE2A5A241;
6377 ARG_GETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, &opt_len);
6378 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6379 TH_ASSERT (io.rc == 0);
6380 /* Should be different from the initial value */
6381 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6383 /* Get option SNDTIMEO */
6384 opt_len = sizeof(opt_val) + 1;
6385 opt_val = 0xE2A5A241;
6386 ARG_GETOPT (sock, ARM_SOCKET_SO_SNDTIMEO, &opt_val, &opt_len);
6387 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6388 TH_ASSERT (io.rc == 0);
6389 /* Should be different from the initial value */
6390 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6392 /* Get option KEEPALIVE */
6393 opt_len = sizeof(opt_val) + 1;
6394 opt_val = 0xE2A5A241;
6395 ARG_GETOPT (sock, ARM_SOCKET_SO_KEEPALIVE, &opt_val, &opt_len);
6396 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6397 TH_ASSERT (io.rc == 0);
6398 /* Should be different from the initial value */
6399 TH_ASSERT ((opt_val != 0xE2A5A241) && (opt_len == 4));
6401 /* Get option socket TYPE */
6402 opt_len = sizeof(opt_val) + 1;
6403 opt_val = UINT32_MAX;
6404 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6405 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6406 TH_ASSERT (io.rc == 0);
6407 /* Should be SOCK_STREAM type */
6408 TH_ASSERT ((opt_val == ARM_SOCKET_SOCK_STREAM) && (opt_len == 4));
6410 /* Close stream socket */
6412 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6413 TH_ASSERT (io.rc == 0);
6415 /* Get option socket TYPE again */
6416 opt_len = sizeof(opt_val);
6417 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6418 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6419 /* Should return error (socket not created) */
6420 /* Strict: ESOCK, valid non-strict: ERROR */
6421 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6426 /* Create datagram socket */
6427 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6429 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6433 /* Get option socket TYPE */
6434 opt_len = sizeof(opt_val) + 1;
6435 opt_val = UINT32_MAX;
6436 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6437 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6438 TH_ASSERT (io.rc == 0);
6439 /* Should be SOCK_DGRAM type */
6440 TH_ASSERT ((opt_val == ARM_SOCKET_SOCK_DGRAM) && (opt_len == 4));
6444 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6445 TH_ASSERT (io.rc == 0);
6447 /* Get option socket TYPE again */
6448 opt_len = sizeof(opt_val);
6449 ARG_GETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, &opt_len);
6450 TH_EXECUTE (F_GETOPT, WIFI_SOCKET_TIMEOUT);
6451 /* Should return error (socket not created) */
6452 /* Strict: ESOCK, valid non-strict: ERROR */
6453 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "getsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6462 /* Terminate worker thread */
6463 osThreadTerminate (worker);
6466 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6468 /* SetOpt IO parameters */
6469 #ifndef __DOXYGEN__ // Exclude form the documentation
6473 const void *opt_val;
6482 /* Assign arguments */
6483 #define ARG_SETOPT(_sock,_opt_id,_opt_val,_opt_len) do { \
6485 io.opt_id = _opt_id; \
6486 io.opt_val = _opt_val; \
6487 io.opt_len = _opt_len; \
6490 /* SetOpt worker thread */
6491 __NO_RETURN static void Th_SetOpt (IO_SETOPT *io) {
6495 /* Wait for the signal to select and execute the function */
6496 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_SETOPT | F_CLOSE, osFlagsWaitAny, osWaitForever);
6500 /* Create stream socket */
6501 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6505 /* Create datagram socket */
6506 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6510 /* Set socket options */
6511 io->rc = drv->SocketSetOpt (io->sock, io->opt_id, io->opt_val, io->opt_len);
6516 io->rc = drv->SocketClose (io->sock);
6519 /* Done, send signal to owner thread */
6520 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6522 osThreadFlagsSet (io->owner, flags);
6523 osThreadFlagsClear (F_ALL);
6528 \brief Function: WIFI_SocketSetOpt
6529 \ingroup wifi_sock_api
6531 The test function \b WIFI_SocketSetOpt verifies the WiFi Driver \b SocketSetOpt function:
6533 int32_t (*SocketSetOpt) (int32_t socket, int32_t opt_id, const void *opt_val, uint32_t opt_len);
6537 - Create stream socket
6538 - Check function parameters
6539 - Set socket options
6541 - Set socket option again, closed socket
6543 Datagram socket test:
6544 - Create datagram socket
6545 - Set socket options
6547 - Set socket option again, closed socket
6550 void WIFI_SocketSetOpt (void) {
6552 osThreadId_t worker;
6557 if (socket_funcs_exist == 0U) {
6558 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6562 if (station_init (1) == 0) {
6563 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6567 /* Create worker thread */
6568 worker = osThreadNew ((osThreadFunc_t)Th_SetOpt, &io, NULL);
6569 if (worker == NULL) {
6570 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6576 /* Create stream socket */
6577 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6579 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6583 /* Check parameter (socket = -1) */
6585 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6586 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6587 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6589 /* Check parameter (socket = INT32_MIN) */
6590 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6591 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6592 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6594 /* Check parameter (socket = INT32_MAX) */
6595 ARG_SETOPT (-1, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6596 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6597 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6599 /* Check parameter (opt_id = -1) */
6600 ARG_SETOPT (sock, -1, &opt_val, sizeof(opt_val));
6601 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6602 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6604 /* Check parameter (opt_id = INT32_MIN) */
6605 ARG_SETOPT (sock, INT32_MIN, &opt_val, sizeof(opt_val));
6606 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6607 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6609 /* Check parameter (opt_id = INT32_MAX) */
6610 ARG_SETOPT (sock, INT32_MAX, &opt_val, sizeof(opt_val));
6611 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6612 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6614 /* Check parameter (opt_val = NULL) */
6615 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, NULL, sizeof(opt_val));
6616 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6617 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6619 /* Check parameter (opt_len = 0) */
6620 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, 0);
6621 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6622 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6624 /* Check parameter (opt_len = 3) */
6625 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, 3);
6626 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6627 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6629 /* Set option FIONBIO (set only) */
6631 ARG_SETOPT (sock, ARM_SOCKET_IO_FIONBIO, &opt_val, sizeof(opt_val));
6632 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6633 TH_ASSERT (io.rc == 0);
6635 /* Set option RCVTIMEO */
6637 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6638 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6639 TH_ASSERT (io.rc == 0);
6641 /* Set option SNDTIMEO */
6643 ARG_SETOPT (sock, ARM_SOCKET_SO_SNDTIMEO, &opt_val, sizeof(opt_val));
6644 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6645 TH_ASSERT (io.rc == 0);
6647 /* Set option KEEPALIVE */
6649 ARG_SETOPT (sock, ARM_SOCKET_SO_KEEPALIVE, &opt_val, sizeof(opt_val));
6650 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6651 TH_ASSERT (io.rc == 0);
6653 /* Set option socket TYPE (get only) */
6654 opt_val = ARM_SOCKET_SOCK_STREAM;
6655 ARG_SETOPT (sock, ARM_SOCKET_SO_TYPE, &opt_val, sizeof(opt_val));
6656 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6657 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
6659 /* Close stream socket */
6661 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6662 TH_ASSERT (io.rc == 0);
6664 /* Set option RCVTIMEO again */
6666 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6667 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6668 /* Should return error (socket not created) */
6669 /* Strict: ESOCK, valid non-strict: ERROR */
6670 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "setsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6675 /* Create datagram socket */
6676 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6678 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6682 /* Set option RCVTIMEO */
6684 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6685 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6686 TH_ASSERT (io.rc == 0);
6690 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6691 TH_ASSERT (io.rc == 0);
6693 /* Set option RCVTIMEO again */
6694 ARG_SETOPT (sock, ARM_SOCKET_SO_RCVTIMEO, &opt_val, sizeof(opt_val));
6695 TH_EXECUTE (F_SETOPT, WIFI_SOCKET_TIMEOUT);
6696 /* Should return error (socket not created) */
6697 /* Strict: ESOCK, valid non-strict: ERROR */
6698 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == ARM_SOCKET_ERROR), "setsockopt on closed socket", io.rc, ARM_SOCKET_ESOCK);
6707 /* Terminate worker thread */
6708 osThreadTerminate (worker);
6711 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6713 /* Close IO parameters */
6714 #ifndef __DOXYGEN__ // Exclude form the documentation
6724 /* Assign arguments */
6725 #define ARG_CLOSE(_sock) do { \
6729 /* Close worker thread */
6730 __NO_RETURN static void Th_Close (IO_CLOSE *io) {
6734 /* Wait for the signal to select and execute the function */
6735 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP | F_BIND |
6736 F_CONNECT | F_LISTEN | F_CLOSE, osFlagsWaitAny, osWaitForever);
6740 /* Create stream socket */
6741 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
6745 /* Create datagram socket */
6746 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
6751 io->rc = drv->SocketBind (io->sock, ip_unspec, 4, DISCARD_PORT);
6755 /* Connect on socket */
6756 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, DISCARD_PORT);
6760 /* Listen on socket */
6761 io->rc = drv->SocketListen (io->sock, 1);
6766 io->rc = drv->SocketClose (io->sock);
6769 /* Done, send signal to owner thread */
6770 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6772 osThreadFlagsSet (io->owner, flags);
6773 osThreadFlagsClear (F_ALL);
6778 \brief Function: WIFI_SocketClose
6779 \ingroup wifi_sock_api
6781 The test function \b WIFI_SocketClose verifies the WiFi Driver \b SocketClose function:
6783 int32_t (*SocketClose) (int32_t socket);
6786 Stream socket test 1:
6787 - Create stream socket
6790 - Check function parameters
6792 - Close socket again
6794 Stream socket test 2:
6795 - Create stream socket
6799 - Close socket again
6801 Datagram socket test:
6802 - Create datagram socket
6804 - Check function parameters
6806 - Close socket again
6808 void WIFI_SocketClose (void) {
6809 osThreadId_t worker;
6814 if (socket_funcs_exist == 0U) {
6815 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
6819 if (station_init (1) == 0) {
6820 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
6824 /* Create worker thread */
6825 worker = osThreadNew ((osThreadFunc_t)Th_Close, &io, NULL);
6826 if (worker == NULL) {
6827 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
6833 /* Create stream socket */
6834 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6836 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6840 /* Connect to stream server */
6842 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
6843 TH_ASSERT (io.rc == 0);
6845 /* Check parameter (socket = -1) */
6847 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6848 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6850 /* Check parameter (socket = INT32_MIN) */
6851 ARG_CLOSE (INT32_MIN);
6852 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6853 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6855 /* Check parameter (socket = INT32_MAX) */
6856 ARG_CLOSE (INT32_MAX);
6857 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6858 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6862 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6863 TH_ASSERT (io.rc == 0);
6865 /* Close again, closed socket */
6867 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6868 /* Should return error (socket not created) */
6869 /* Strict: ESOCK, valid non-strict: OK */
6870 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6875 /* Create stream socket */
6876 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
6878 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
6884 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
6885 TH_ASSERT (io.rc == 0);
6887 /* Start listening */
6889 TH_EXECUTE (F_LISTEN, WIFI_SOCKET_TIMEOUT);
6890 TH_ASSERT (io.rc == 0);
6894 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6895 TH_ASSERT (io.rc == 0);
6897 /* Close again, closed socket */
6899 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6900 /* Should return error (socket not created) */
6901 /* Strict: ESOCK, valid non-strict: OK */
6902 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6907 /* Create datagram socket */
6908 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
6910 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
6916 TH_EXECUTE (F_BIND, WIFI_SOCKET_TIMEOUT);
6917 TH_ASSERT (io.rc == 0);
6919 /* Check parameter (socket = -1) */
6921 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6922 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6924 /* Check parameter (socket = INT32_MIN) */
6925 ARG_CLOSE (INT32_MIN);
6926 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6927 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6929 /* Check parameter (socket = INT32_MAX) */
6930 ARG_CLOSE (INT32_MAX);
6931 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6932 TH_ASSERT (io.rc == ARM_SOCKET_ESOCK);
6936 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6937 TH_ASSERT (io.rc == 0);
6939 /* Close again, closed socket */
6941 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
6942 /* Should return error (socket not created) */
6943 /* Strict: ESOCK, valid non-strict: OK */
6944 TH_ASSERT2 ((io.rc == ARM_SOCKET_ESOCK), (io.rc == 0), "close already closed socket", io.rc, ARM_SOCKET_ESOCK);
6953 /* Terminate worker thread */
6954 osThreadTerminate (worker);
6957 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
6959 /* GetHostByName IO parameters */
6960 #ifndef __DOXYGEN__ // Exclude form the documentation
6973 /* Assign arguments */
6974 #define ARG_GETHOST(_name,_af,_ip,_ip_len) do { \
6978 io.ip_len = _ip_len; \
6981 /* GetHostByName worker thread */
6982 __NO_RETURN static void Th_GetHostByName (IO_GETHOST *io) {
6986 /* Wait for the signal to select and execute the function */
6987 flags = osThreadFlagsWait (F_GETHOSTBYNAME, osFlagsWaitAny, osWaitForever);
6990 case F_GETHOSTBYNAME:
6992 io->rc = drv->SocketGetHostByName (io->name, io->af, io->ip, io->ip_len);
6995 /* Done, send signal to owner thread */
6996 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
6998 osThreadFlagsSet (io->owner, flags);
6999 osThreadFlagsClear (F_ALL);
7004 \brief Function: WIFI_SocketGetHostByName
7005 \ingroup wifi_sock_api
7007 The test function \b WIFI_SocketGetHostByName the WiFi Driver \b SocketGetHostByName function:
7009 int32_t (*SocketGetHostByName) (const char *name, int32_t af, uint8_t *ip, uint32_t *ip_len);
7013 - Check function parameters
7015 - Resolve non-existent host
7018 This test requires internet connectivity to DNS server.
7020 void WIFI_SocketGetHostByName (void) {
7021 const char *host_name = "www.arm.com";
7024 osThreadId_t worker;
7028 if (socket_funcs_exist == 0U) {
7029 TEST_ASSERT_MESSAGE(0,"[FAILED] Socket functions not available");
7033 if (station_init (1) == 0) {
7034 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7038 /* Create worker thread */
7039 worker = osThreadNew ((osThreadFunc_t)Th_GetHostByName, &io, NULL);
7040 if (worker == NULL) {
7041 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7047 /* Check parameter (name = NULL) */
7048 ip_len = sizeof(host_ip);
7049 ARG_GETHOST(NULL, ARM_SOCKET_AF_INET, host_ip, &ip_len);
7050 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7051 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7053 /* Check parameter (af = -1) */
7054 ARG_GETHOST(host_name, -1, host_ip, &ip_len);
7055 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7056 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7058 /* Check parameter (af = INT32_MIN) */
7059 ARG_GETHOST(host_name, INT32_MIN, host_ip, &ip_len);
7060 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7061 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7063 /* Check parameter (af = INT32_MAX) */
7064 ARG_GETHOST(host_name, INT32_MAX, host_ip, &ip_len);
7065 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7066 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7068 /* Check parameter (ip = NULL) */
7069 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, NULL, &ip_len);
7070 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7071 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7073 /* Check parameter (ip_len = NULL) */
7074 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, NULL);
7075 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7076 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7078 /* Check parameter (*ip_len = 0) */
7080 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
7081 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7082 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7084 /* Check parameter (*ip_len = 3) */
7086 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
7087 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT);
7088 TH_ASSERT (io.rc == ARM_SOCKET_EINVAL);
7090 /* Resolve valid host */
7091 ip_len = sizeof(host_ip) + 1;
7092 memset((void *)host_ip, 0, sizeof(host_ip));
7093 ARG_GETHOST(host_name, ARM_SOCKET_AF_INET, host_ip, &ip_len);
7094 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT_LONG);
7095 /* IP address should be valid */
7096 TH_ASSERT ((memcmp((const void *)host_ip, (const void *)ip_unspec, 4) != 0) && (ip_len == 4));
7098 /* Resolve non-existent host */
7099 ip_len = sizeof(host_ip);
7100 ARG_GETHOST("non.existent.host", ARM_SOCKET_AF_INET, host_ip, &ip_len);
7101 TH_EXECUTE (F_GETHOSTBYNAME, WIFI_SOCKET_TIMEOUT_LONG);
7102 /* Should return error (host not found) */
7103 /* Strict: EHOSTNOTFOUND, valid non-strict: ERROR */
7104 TH_ASSERT2 ((io.rc == ARM_SOCKET_EHOSTNOTFOUND), (io.rc == ARM_SOCKET_ERROR), "gethostbyname for non-existing host", io.rc, ARM_SOCKET_EHOSTNOTFOUND);
7110 /* Terminate worker thread */
7111 osThreadTerminate (worker);
7114 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
7116 /* Ping IO parameters */
7117 #ifndef __DOXYGEN__ // Exclude form the documentation
7128 /* Assign arguments */
7129 #define ARG_PING(_ip,_ip_len) do { \
7131 io.ip_len = _ip_len; \
7134 /* Ping worker thread */
7135 __NO_RETURN static void Th_Ping (IO_PING *io) {
7139 /* Wait for the signal to select and execute the function */
7140 flags = osThreadFlagsWait (F_PING, osFlagsWaitAny, osWaitForever);
7145 io->rc = drv->Ping (io->ip, io->ip_len);
7148 /* Done, send signal to owner thread */
7149 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
7151 osThreadFlagsSet (io->owner, flags);
7152 osThreadFlagsClear (F_ALL);
7157 \brief Function: WIFI_Ping
7158 \ingroup wifi_sock_api
7160 The test function \b WIFI_Ping verifies the WiFi Driver \b Ping function:
7162 int32_t (*Ping) (const uint8_t *ip, uint32_t ip_len);
7166 - Check function parameters
7169 void WIFI_Ping (void) {
7170 osThreadId_t worker;
7174 if (drv->Ping == NULL) {
7175 TEST_ASSERT_MESSAGE(0,"[FAILED] Ping function not available");
7179 if (station_init (1) == 0) {
7180 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7184 /* Create worker thread */
7185 worker = osThreadNew ((osThreadFunc_t)Th_Ping, &io, NULL);
7186 if (worker == NULL) {
7187 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7193 /* Check parameter (ip = NULL) */
7195 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7196 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7198 /* Check parameter (ip_len = 0) */
7199 ARG_PING (ip_socket_server, 0);
7200 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7201 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7203 /* Check parameter (ip_len = 5) */
7204 ARG_PING (ip_socket_server, 5);
7205 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7206 TH_ASSERT (io.rc == ARM_DRIVER_ERROR_PARAMETER);
7209 ARG_PING (ip_socket_server, 4);
7210 TH_EXECUTE (F_PING, WIFI_SOCKET_TIMEOUT);
7211 TH_ASSERT (io.rc == ARM_DRIVER_OK);
7217 /* Terminate worker thread */
7218 osThreadTerminate (worker);
7221 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
7224 \defgroup wifi_sock_op Socket Operation
7227 These tests verify operation of the WiFi socket functions.
7230 /* Worker thread is used for the following tests:
7231 - WIFI_Transfer_Fixed
7232 - WIFI_Transfer_Incremental
7233 - WIFI_Send_Fragmented
7234 - WIFI_Recv_Fragmented
7236 - WIFI_Concurrent_Socket
7239 /* Transfer IO parameters */
7240 #ifndef __DOXYGEN__ // Exclude form the documentation
7253 /* Assign arguments */
7254 #define ARG_TRANSFER(_sock,_len,_size) do { \
7260 /* Transfer worker thread */
7261 __NO_RETURN static void Th_Transfer (IO_TRANSFER *io) {
7262 uint32_t flags,xid,i,j;
7266 /* Wait for the signal to select and execute the function */
7267 flags = osThreadFlagsWait (F_CREATE_TCP | F_CREATE_UDP |
7268 F_CONNECT | F_CLOSE |
7269 F_XFER_FIXED | F_XFER_INCR |
7270 F_SEND_FRAG | F_RECV_FRAG, osFlagsWaitAny, osWaitForever);
7274 /* Create stream socket */
7275 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
7279 /* Create datagram socket */
7280 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_DGRAM, ARM_SOCKET_IPPROTO_UDP);
7284 /* Connect on socket */
7285 io->rc = drv->SocketConnect (io->sock, ip_socket_server, 4, ECHO_PORT);
7290 io->rc = drv->SocketClose (io->sock);
7294 /* Transfer Fixed size blocks */
7295 memset ((void *)buffer, 0xCC, io->len);
7296 /* Send and receive in small blocks */
7297 for (i = 0; i < io->len; i += io->size) {
7298 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7300 for (j = 0; j < io->size; j += (uint32_t)rc) {
7301 /* Returns any data available, up to requested amount */
7302 rc = drv->SocketRecv (io->sock, &buffer[i+j], io->size-j);
7303 if ((rc <= 0) || !io->tcp) break;
7307 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7314 /* Transfer Increased size blocks */
7315 memset ((void *)buffer, 0xCC, io->len);
7316 /* Send and receive in enlarged block sizes */
7317 for (i = 0; i < io->len; i += io->size++) {
7318 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7320 rc = drv->SocketRecv (io->sock, &buffer[i], io->size);
7323 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7330 /* Send Fragmented blocks */
7331 memset ((void *)buffer, 0xCC, io->len);
7332 /* Send in small blocks */
7333 for (i = 0; i < io->len; i += io->size) {
7334 rc = drv->SocketSend (io->sock, &test_buf[i], io->size);
7337 /* Receive in single block */
7339 /* Small delay that blocks are received */
7341 for (i = 0; i < io->len; i += (uint32_t)rc) {
7342 /* Returns any data available, up to requested amount */
7343 rc = drv->SocketRecv (io->sock, &buffer[i], io->len-i);
7346 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7354 /* Receive Fragmented blocks */
7355 memset ((void *)buffer, 0xCC, io->len);
7356 /* Send single block */
7357 rc = drv->SocketSend (io->sock, test_buf, io->len);
7360 /* Receive in small blocks */
7361 for (i = 0; i < io->len; i += io->size) {
7362 for (j = 0; j < io->size; j += (uint32_t)rc) {
7363 /* Returns any data available, up to requested amount */
7364 rc = drv->SocketRecv (io->sock, &buffer[i+j], io->size-j);
7369 if (memcmp ((const void *)buffer, (const void *)test_buf, io->len) == 0) {
7376 /* Done, send signal to owner thread */
7377 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
7379 osThreadFlagsSet (io->owner, flags);
7380 osThreadFlagsClear (F_ALL);
7385 \brief Function: WIFI_Transfer_Fixed
7386 \ingroup wifi_sock_op
7388 The test function \b WIFI_Transfer_Fixed verifies data transfer in fixed size blocks.
7391 - Create stream socket
7392 - Transfer 128 blocks of 16 bytes
7393 - Transfer 32 blocks of 64 bytes
7394 - Transfer 8 blocks of 256 bytes
7395 - Transfer 2 blocks of 1024 bytes
7396 - Transfer 1 block of 2048 bytes
7399 Datagram socket test:
7400 - Create datagram socket
7401 - Transfer 128 blocks of 16 bytes
7402 - Transfer 32 blocks of 64 bytes
7403 - Transfer 8 blocks of 256 bytes
7404 - Transfer 2 blocks of 1024 bytes
7405 - Transfer 1 block of 1460 bytes
7408 void WIFI_Transfer_Fixed (void) {
7409 osThreadId_t worker;
7414 if (station_init (1) == 0) {
7415 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7419 /* Create worker thread */
7420 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7421 if (worker == NULL) {
7422 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7428 /* Create stream socket */
7429 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7431 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7435 /* Connect to stream server */
7438 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7439 TH_ASSERT (io.rc == 0);
7441 /* Transfer 16-byte block(s) */
7442 ARG_TRANSFER (sock, 2048, 16);
7443 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7444 TH_ASSERT (io.rc == 2048);
7446 /* Transfer 64-byte block(s) */
7447 ARG_TRANSFER (sock, 2048, 64);
7448 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7449 TH_ASSERT (io.rc == 2048);
7451 /* Transfer 256-byte block(s) */
7452 ARG_TRANSFER (sock, 2048, 256);
7453 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7454 TH_ASSERT (io.rc == 2048);
7456 /* Transfer 1024-byte block(s) */
7457 ARG_TRANSFER (sock, 2048, 1024);
7458 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7459 TH_ASSERT (io.rc == 2048);
7461 /* Transfer 2048-byte block */
7462 ARG_TRANSFER (sock, 2048, 2048);
7463 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7464 TH_ASSERT (io.rc == 2048);
7466 /* Close stream socket */
7468 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7469 TH_ASSERT (io.rc == 0);
7474 /* Create datagram socket */
7475 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7477 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7481 /* Connect to datagram server */
7484 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7485 TH_ASSERT (io.rc == 0);
7487 /* Transfer 16-byte block(s) */
7488 ARG_TRANSFER (sock, 2048, 16);
7489 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7490 TH_ASSERT (io.rc == 2048);
7492 /* Transfer 64-byte block(s) */
7493 ARG_TRANSFER (sock, 2048, 64);
7494 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7495 TH_ASSERT (io.rc == 2048);
7497 /* Transfer 256-byte block(s) */
7498 ARG_TRANSFER (sock, 2048, 256);
7499 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7500 TH_ASSERT (io.rc == 2048);
7502 /* Transfer 1024-byte block(s) */
7503 ARG_TRANSFER (sock, 2048, 1024);
7504 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7505 TH_ASSERT (io.rc == 2048);
7507 /* Transfer 1460-byte block */
7508 ARG_TRANSFER (sock, 1460, 1460);
7509 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7510 TH_ASSERT (io.rc == 1460);
7512 /* Close datagram socket */
7514 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7515 TH_ASSERT (io.rc == 0);
7524 /* Terminate worker thread */
7525 osThreadTerminate (worker);
7529 \brief Function: WIFI_Transfer_Incremental
7530 \ingroup wifi_sock_op
7532 The test function \b WIFI_Transfer_Incremental verifies data transfer in ascending size blocks.
7533 Each subsequent block that the socket sends is one byte larger than the previous block.
7536 - Create stream socket
7537 - Transfer 51 blocks of 1 - 50 bytes
7538 - Transfer 30 blocks of 51 - 80 bytes
7539 - Transfer 20 blocks of 81 - 100 bytes
7540 - Transfer 13 blocks of 120 - 132 bytes
7541 - Transfer 8 blocks of 252 - 259 bytes
7542 - Transfer 4 blocks of 510 - 513 bytes
7545 Datagram socket test:
7546 - Create datagram socket
7547 - Transfer 51 blocks of 1 - 50 bytes
7548 - Transfer 30 blocks of 51 - 80 bytes
7549 - Transfer 20 blocks of 81 - 100 bytes
7550 - Transfer 13 blocks of 120 - 132 bytes
7551 - Transfer 8 blocks of 252 - 259 bytes
7552 - Transfer 4 blocks of 510 - 513 bytes
7555 void WIFI_Transfer_Incremental (void) {
7556 osThreadId_t worker;
7561 if (station_init (1) == 0) {
7562 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7566 /* Create worker thread */
7567 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7568 if (worker == NULL) {
7569 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7575 /* Create stream socket */
7576 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7578 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7582 /* Connect to stream server */
7584 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7585 TH_ASSERT (io.rc == 0);
7587 /* Transfer 1 byte - 50 byte blocks */
7588 ARG_TRANSFER (sock, 1275, 1);
7589 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7590 TH_ASSERT (io.rc == 1275);
7592 /* Transfer 51 byte - 80-byte blocks */
7593 ARG_TRANSFER (sock, 1965, 51);
7594 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7595 TH_ASSERT (io.rc == 1965);
7597 /* Transfer 81 byte - 100 byte blocks */
7598 ARG_TRANSFER (sock, 1810, 81);
7599 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7600 TH_ASSERT (io.rc == 1810);
7602 /* Transfer 120 byte - 132 byte blocks */
7603 ARG_TRANSFER (sock, 1905, 120);
7604 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7605 TH_ASSERT (io.rc == 1905);
7607 /* Transfer 252 byte - 259 byte blocks */
7608 ARG_TRANSFER (sock, 2044, 252);
7609 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7610 TH_ASSERT (io.rc == 2044);
7612 /* Transfer 510 byte - 513 byte blocks */
7613 ARG_TRANSFER (sock, 2046, 510);
7614 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7615 TH_ASSERT (io.rc == 2046);
7617 /* Close stream socket */
7619 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7620 TH_ASSERT (io.rc == 0);
7625 /* Create datagram socket */
7626 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7628 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7632 /* Connect to datagram server */
7634 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7635 TH_ASSERT (io.rc == 0);
7637 /* Transfer 1 byte - 50 byte blocks */
7638 ARG_TRANSFER (sock, 1275, 1);
7639 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7640 TH_ASSERT (io.rc == 1275);
7642 /* Transfer 51 byte - 80-byte blocks */
7643 ARG_TRANSFER (sock, 1965, 51);
7644 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7645 TH_ASSERT (io.rc == 1965);
7647 /* Transfer 81 byte - 100 byte blocks */
7648 ARG_TRANSFER (sock, 1810, 81);
7649 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7650 TH_ASSERT (io.rc == 1810);
7652 /* Transfer 120 byte - 132 byte blocks */
7653 ARG_TRANSFER (sock, 1905, 120);
7654 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7655 TH_ASSERT (io.rc == 1905);
7657 /* Transfer 252 byte - 259 byte blocks */
7658 ARG_TRANSFER (sock, 2044, 252);
7659 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7660 TH_ASSERT (io.rc == 2044);
7662 /* Transfer 510 byte - 513 byte blocks */
7663 ARG_TRANSFER (sock, 2046, 510);
7664 TH_EXECUTE (F_XFER_INCR, WIFI_SOCKET_TIMEOUT_LONG);
7665 TH_ASSERT (io.rc == 2046);
7667 /* Close datagram socket */
7669 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7670 TH_ASSERT (io.rc == 0);
7679 /* Terminate worker thread */
7680 osThreadTerminate (worker);
7684 \brief Function: WIFI_Send_Fragmented
7685 \ingroup wifi_sock_op
7687 The test function \b WIFI_Send_Fragmented verifies data transfer in chunks.
7690 - Create stream socket
7691 - Send 16 blocks of 16 bytes, receive 1 block of 256 bytes
7692 - Send 16 blocks of 64 bytes, receive 1 block of 1024 bytes
7693 - Send 5 blocks of 256 bytes, receive 1 block of 1280 bytes
7694 - Send 2 blocks of 1024 bytes, receive 1 block of 2048 bytes
7697 void WIFI_Send_Fragmented (void) {
7698 osThreadId_t worker;
7703 if (station_init (1) == 0) {
7704 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7708 /* Create worker thread */
7709 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7710 if (worker == NULL) {
7711 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7717 /* Create stream socket */
7718 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7720 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7724 /* Connect to stream server */
7726 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7727 TH_ASSERT (io.rc == 0);
7729 /* Transfer 16-byte block(s) */
7730 ARG_TRANSFER (sock, 256, 16);
7731 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7732 TH_ASSERT (io.rc == 256);
7734 /* Transfer 64-byte block(s) */
7735 ARG_TRANSFER (sock, 1024, 64);
7736 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7737 TH_ASSERT (io.rc == 1024);
7739 /* Transfer 256-byte block(s) */
7740 ARG_TRANSFER (sock, 1280, 256);
7741 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7742 TH_ASSERT (io.rc == 1280);
7744 /* Transfer 1024-byte block(s) */
7745 ARG_TRANSFER (sock, 2048, 1024);
7746 TH_EXECUTE (F_SEND_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7747 TH_ASSERT (io.rc == 2048);
7749 /* Close stream socket */
7751 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7752 TH_ASSERT (io.rc == 0);
7761 /* Terminate worker thread */
7762 osThreadTerminate (worker);
7766 \brief Function: WIFI_Recv_Fragmented
7767 \ingroup wifi_sock_op
7769 The test function \b WIFI_Recv_Fragmented verifies data transfer in chunks.
7772 - Create stream socket
7773 - Send block of 256 bytes, receive 16 blocks of 16 bytes
7774 - Send block of 1024 bytes, receive 16 blocks of 64 bytes
7775 - Send block of 1280 bytes, receive 5 blocks of 256 bytes
7776 - Send block of 2048 bytes, receive 2 blocks of 1024 bytes
7779 void WIFI_Recv_Fragmented (void) {
7780 osThreadId_t worker;
7785 if (station_init (1) == 0) {
7786 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7790 /* Create worker thread */
7791 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7792 if (worker == NULL) {
7793 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7799 /* Create stream socket */
7800 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7802 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7806 /* Connect to stream server */
7808 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7809 TH_ASSERT (io.rc == 0);
7811 /* Transfer 16-byte block(s) */
7812 ARG_TRANSFER (sock, 256, 16);
7813 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7814 TH_ASSERT (io.rc == 256);
7816 /* Transfer 64-byte block(s) */
7817 ARG_TRANSFER (sock, 1024, 64);
7818 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7819 TH_ASSERT (io.rc == 1024);
7821 /* Transfer 256-byte block(s) */
7822 ARG_TRANSFER (sock, 1280, 256);
7823 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7824 TH_ASSERT (io.rc == 1280);
7826 /* Transfer 1024-byte block(s) */
7827 ARG_TRANSFER (sock, 2048, 1024);
7828 TH_EXECUTE (F_RECV_FRAG, WIFI_SOCKET_TIMEOUT_LONG);
7829 TH_ASSERT (io.rc == 2048);
7831 /* Close stream socket */
7833 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7834 TH_ASSERT (io.rc == 0);
7843 /* Terminate worker thread */
7844 osThreadTerminate (worker);
7848 \brief Function: WIFI_Test_Speed
7849 \ingroup wifi_sock_op
7851 The test function \b WIFI_Test_Speed tests data transfer speed.
7854 - Create stream socket
7855 - Transfer for 4 seconds, send and receive
7856 - Calculate transfer rate
7859 Datagram socket test:
7860 - Create datagram socket
7861 - Transfer for 4 seconds, send and receive
7862 - Calculate transfer rate
7865 void WIFI_Test_Speed (void) {
7866 uint32_t ticks,tout;
7867 osThreadId_t worker;
7868 int32_t rval,n_bytes;
7872 if (station_init (1) == 0) {
7873 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
7877 /* Create worker thread */
7878 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
7879 if (worker == NULL) {
7880 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
7886 /* Create stream socket */
7887 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
7889 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
7893 /* Connect to stream server */
7896 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
7897 TH_ASSERT (io.rc == 0);
7899 /* Transfer for 4 seconds */
7900 tout = SYSTICK_MICROSEC(4000000);
7901 ticks = GET_SYSTICK();
7904 ARG_TRANSFER (sock, 1420, 1420);
7905 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7906 if (io.rc > 0) n_bytes += io.rc;
7908 } while (GET_SYSTICK() - ticks < tout);
7909 /* Check transfer rate */
7910 if (n_bytes < 10000) {
7911 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
7912 TEST_MESSAGE(msg_buf);
7915 /* Close stream socket */
7917 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7918 TH_ASSERT (io.rc == 0);
7923 /* Create datagram socket */
7924 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
7926 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
7930 /* Connect to datagram server */
7933 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
7934 TH_ASSERT (io.rc == 0);
7936 /* Transfer for 4 seconds */
7937 tout = SYSTICK_MICROSEC(4000000);
7938 ticks = GET_SYSTICK();
7941 ARG_TRANSFER (sock, 1460, 1460);
7942 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
7943 if (io.rc > 0) n_bytes += io.rc;
7945 } while (GET_SYSTICK() - ticks < tout);
7946 /* Check transfer rate */
7947 if (n_bytes < 10000) {
7948 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
7949 TEST_MESSAGE(msg_buf);
7952 /* Close datagram socket */
7954 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
7955 TH_ASSERT (io.rc == 0);
7964 /* Terminate worker thread */
7965 osThreadTerminate (worker);
7968 /* Sidekick IO parameters */
7969 #ifndef __DOXYGEN__ // Exclude form the documentation
7976 /* Concurrent coworker thread */
7977 __NO_RETURN static void Th_Sidekick (IO_SIDEKICK *io2) {
7982 if (osThreadFlagsWait (SK_TERMINATE, osFlagsWaitAny, 200) == SK_TERMINATE) {
7985 memset ((void *)buff, 0xCC, sizeof(buff));
7986 rc = drv->SocketSend (io2->sock, test_msg, sizeof(test_msg));
7988 rc = drv->SocketRecv (io2->sock, buff, sizeof(test_msg));
7990 if (memcmp ((const void *)buff, (const void *)test_msg, sizeof(test_msg)) == 0) {
7991 io2->count += sizeof(test_msg);
7994 /* Owner deletes this thread */
7995 while (1) osDelay (osWaitForever);
7999 \brief Function: WIFI_Concurrent_Socket
8000 \ingroup wifi_sock_op
8002 The test function \b WIFI_Concurrent_Socket verifies transfer of two concurrent sockets.
8005 - Create two stream sockets
8006 - Start transfer on 2nd socket with 200ms intervals
8007 - Transfer on main socket, full speed
8008 - Calculate transfer rate
8011 Datagram socket test:
8012 - Create datagram and stream sockets
8013 - Start transfer on stream socket with 200ms intervals
8014 - Transfer on main socket, full speed
8015 - Calculate transfer rate
8018 The test runs with a coherent thread, that performs an additional stream socket io.
8020 void WIFI_Concurrent_Socket (void) {
8021 uint32_t ticks,tout;
8022 osThreadId_t worker,spawn;
8023 int32_t rval,n_bytes;
8028 if (station_init (1) == 0) {
8029 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
8033 /* Create worker thread */
8034 worker = osThreadNew ((osThreadFunc_t)Th_Transfer, &io, NULL);
8035 if (worker == NULL) {
8036 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
8042 /* The test connects two stream sockets to the ECHO server and then */
8043 /* performs simultaneous data transfer. The main socket transmits at */
8044 /* full speed, and the other socket sends messages at 200ms intervals. */
8045 /* Both sockets record the number of bytes of data transferred, and */
8046 /* the transfer rate is calculated. */
8048 /* Create stream socket */
8049 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8051 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8055 /* Create 2nd stream socket */
8056 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8058 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8063 /* Connect sockets */
8066 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
8067 TH_ASSERT (io.rc == 0);
8070 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
8071 TH_ASSERT (io.rc == 0);
8073 /* Create spawned thread */
8074 spawn = osThreadNew ((osThreadFunc_t)Th_Sidekick, &io2, NULL);
8075 TEST_ASSERT(spawn != NULL);
8077 /* Transfer for 4 seconds */
8078 tout = SYSTICK_MICROSEC(4000000);
8079 ticks = GET_SYSTICK();
8082 ARG_TRANSFER (sock, 1420, 1420);
8083 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
8084 if (io.rc > 0) n_bytes += io.rc;
8086 } while (GET_SYSTICK() - ticks < tout);
8087 /* Check main transfer rate */
8088 if (n_bytes < 10000) {
8089 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
8090 TEST_MESSAGE(msg_buf);
8092 /* Check auxiliary transfer rate */
8093 if (io2.count == 0) {
8094 TEST_ASSERT_MESSAGE(0,"[FAILED] Auxiliary transfer failed");
8096 else if (io2.count < 440) {
8097 TEST_MESSAGE("[WARNING] Auxiliary Transfer rate low");
8100 /* Terminate spawned thread */
8101 osThreadFlagsSet (spawn, SK_TERMINATE);
8103 osThreadTerminate (spawn);
8105 /* Close stream sockets */
8107 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8108 TH_ASSERT (io.rc == 0);
8111 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8112 TH_ASSERT (io.rc == 0);
8117 /* The test connects datagram and stream sockets to the ECHO server */
8118 /* and then performs simultaneous data transfer. The datagram socket */
8119 /* transmits at full speed, and the stream socket sends messages at */
8120 /* 200ms intervals. The number of bytes of transferred data is recorded */
8121 /* and the rate of transmission is calculated. */
8123 /* Create datagram socket */
8124 TH_EXECUTE (F_CREATE_UDP, WIFI_SOCKET_TIMEOUT);
8126 TEST_ASSERT_MESSAGE(0,"[FAILED] Datagram Socket not created");
8130 /* Connect datagram socket */
8133 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT);
8134 TH_ASSERT (io.rc == 0);
8136 /* Create stream socket */
8137 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8139 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8144 /* Connect stream socket */
8146 TH_EXECUTE (F_CONNECT, WIFI_SOCKET_TIMEOUT_LONG);
8147 TH_ASSERT (io.rc == 0);
8149 /* Create spawned thread */
8150 spawn = osThreadNew ((osThreadFunc_t)Th_Sidekick, &io2, NULL);
8151 TEST_ASSERT(spawn != NULL);
8153 /* Transfer for 4 seconds */
8154 tout = SYSTICK_MICROSEC(4000000);
8155 ticks = GET_SYSTICK();
8158 ARG_TRANSFER (sock, 1460, 1460);
8159 TH_EXECUTE (F_XFER_FIXED, WIFI_SOCKET_TIMEOUT_LONG);
8160 if (io.rc > 0) n_bytes += io.rc;
8162 } while (GET_SYSTICK() - ticks < tout);
8163 /* Check main transfer rate */
8164 if (n_bytes < 10000) {
8165 snprintf(msg_buf, sizeof(msg_buf), "[WARNING] Slow Transfer rate (%d KB/s)", n_bytes / 2048);
8166 TEST_MESSAGE(msg_buf);
8168 /* Check auxiliary transfer rate */
8169 if (io2.count == 0) {
8170 TEST_ASSERT_MESSAGE(0,"[FAILED] Auxiliary transfer failed");
8172 else if (io2.count < 440) {
8173 TEST_MESSAGE("[WARNING] Auxiliary Transfer rate low");
8176 /* Terminate spawned thread */
8177 osThreadFlagsSet (spawn, SK_TERMINATE);
8179 osThreadTerminate (spawn);
8183 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8184 TH_ASSERT (io.rc == 0);
8187 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8188 TH_ASSERT (io.rc == 0);
8197 /* Terminate worker thread */
8198 osThreadTerminate (worker);
8201 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
8203 /* TestAssistant commands */
8204 #define CMD_SEND_TCP "SEND TCP,1420,4000"
8205 #define CMD_RECV_TCP "RECV TCP,1420"
8206 #define TEST_BSIZE 1420
8208 /* StreamRate IO parameters */
8209 #ifndef __DOXYGEN__ // Exclude form the documentation
8221 /* StreamRate coworker thread */
8222 __NO_RETURN static void Th_StreamRate (IO_STREAMRATE *io) {
8223 uint32_t flags,xid,ticks,tout;
8227 flags = osThreadFlagsWait (F_CREATE_TCP | F_DOWNLOAD | F_UPLOAD |
8228 F_SEND_CTRL | F_CLOSE, osFlagsWaitAny, osWaitForever);
8232 /* Create stream socket */
8233 io->rc = drv->SocketCreate (ARM_SOCKET_AF_INET, ARM_SOCKET_SOCK_STREAM, ARM_SOCKET_IPPROTO_TCP);
8237 /* Downstream test, server is sender */
8238 for (n = 0; ; n += rc) {
8239 rc = drv->SocketRecv (io->sock, buffer, TEST_BSIZE);
8240 if (strncmp ((char *)buffer, "STAT", 4) == 0) {
8241 /* Server completed the test */
8242 sscanf ((char *)buffer+4, "%d", &val);
8243 if (val > n) io->loss = val - n;
8252 /* Upstream test, server is receiver */
8253 memset ((void *)buffer, 'a', TEST_BSIZE);
8254 tout = SYSTICK_MICROSEC(4000000);
8255 ticks = GET_SYSTICK();
8258 snprintf ((char *)buffer, sizeof(buffer), "Block[%d]", ++i);
8259 rc = drv->SocketSend (io->sock, buffer, TEST_BSIZE);
8260 if (rc > 0) n += rc;
8261 } while (GET_SYSTICK() - ticks < tout);
8262 rc = snprintf ((char *)buffer, sizeof(buffer), "STOP %d bytes.", n);
8263 drv->SocketSend (io->sock, buffer, (uint32_t)rc);
8264 /* Receive report from server */
8265 drv->SocketRecv (io->sock, buffer, TEST_BSIZE);
8266 if (strncmp ((char *)buffer, "STAT", 4) == 0) {
8267 sscanf ((char *)buffer+4, "%d", &val);
8268 if (n > val) io->loss = n - val;
8275 io->rc = drv->SocketClose (io->sock);
8279 /* Send control command to TestAssistant */
8280 drv->SocketConnect (io->sock, ip_socket_server, 4, ASSISTANT_PORT);
8281 io->rc = drv->SocketSend (io->sock, io->cmd, strlen(io->cmd));
8284 /* Done, send signal to owner thread */
8285 flags = (xid == io->xid) ? TH_OK : TH_TOUT;
8287 osThreadFlagsSet (io->owner, flags);
8288 osThreadFlagsClear (F_ALL);
8293 \brief Function: WIFI_Downstream_Rate
8294 \ingroup wifi_sock_op
8296 The test function \b WIFI_Downstream_Rate tests the maximum rate at which the data
8299 void WIFI_Downstream_Rate (void) {
8300 osThreadId_t worker;
8304 if (station_init (1) == 0) {
8305 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
8309 /* Create worker thread */
8310 worker = osThreadNew ((osThreadFunc_t)Th_StreamRate, &io, NULL);
8311 if (worker == NULL) {
8312 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
8318 /* Create stream socket */
8319 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8321 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8325 /* Send command to start the download */
8326 io.cmd = CMD_SEND_TCP;
8327 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
8328 TH_ASSERT (io.rc > 0);
8330 /* Wait for transfer to complete */
8332 TH_EXECUTE (F_DOWNLOAD, 5000 + WIFI_SOCKET_TIMEOUT);
8333 TH_ASSERT (io.rc > 0);
8335 /* Check data loss */
8337 snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Data loss %d byte(s)", io.loss);
8338 TEST_ASSERT_MESSAGE(0,msg_buf);
8340 else if (rval != 0) {
8341 snprintf(msg_buf, sizeof(msg_buf), "[INFO] Speed %d KB/s", io.rc/4096);
8342 TEST_MESSAGE(msg_buf);
8345 /* Close stream socket */
8346 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8347 TH_ASSERT (io.rc == 0);
8356 /* Terminate worker thread */
8357 osThreadTerminate (worker);
8361 \brief Function: WIFI_Upstream_Rate
8362 \ingroup wifi_sock_op
8364 The test function \b WIFI_Upstream_Rate tests the maximum rate at which the data
8367 void WIFI_Upstream_Rate (void) {
8368 osThreadId_t worker;
8372 if (station_init (1) == 0) {
8373 TEST_ASSERT_MESSAGE(0,"[FAILED] Station initialization and connect failed");
8377 /* Create worker thread */
8378 worker = osThreadNew ((osThreadFunc_t)Th_StreamRate, &io, NULL);
8379 if (worker == NULL) {
8380 TEST_ASSERT_MESSAGE(0,"[FAILED] Worker Thread not created");
8386 /* Create stream socket */
8387 TH_EXECUTE (F_CREATE_TCP, WIFI_SOCKET_TIMEOUT);
8389 TEST_ASSERT_MESSAGE(0,"[FAILED] Stream Socket not created");
8393 /* Send command to start the upload */
8394 io.cmd = CMD_RECV_TCP;
8395 TH_EXECUTE (F_SEND_CTRL, WIFI_SOCKET_TIMEOUT_LONG);
8396 TH_ASSERT (io.rc > 0);
8398 /* Wait for transfer to complete */
8400 TH_EXECUTE (F_UPLOAD, 5000 + WIFI_SOCKET_TIMEOUT);
8401 TH_ASSERT (io.rc > 0);
8403 /* Check data loss */
8405 snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Data loss %d byte(s)", io.loss);
8406 TEST_ASSERT_MESSAGE(0,msg_buf);
8408 else if (rval != 0) {
8409 snprintf(msg_buf, sizeof(msg_buf), "[INFO] Speed %d KB/s", io.rc/4096);
8410 TEST_MESSAGE(msg_buf);
8413 /* Close stream socket */
8414 TH_EXECUTE (F_CLOSE, WIFI_SOCKET_TIMEOUT);
8415 TH_ASSERT (io.rc == 0);
8424 /* Terminate worker thread */
8425 osThreadTerminate (worker);