From fecb005783756d24495d499f74276103d407779f Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Thu, 27 Apr 2017 15:40:19 -0500 Subject: [PATCH 01/16] Allowing dtls test to retry correctly. The dtls test already has the ability to retry upon a UDP failure. However the sockets are currently configured to be blocking and to wait forever. I added a timeout of 1.5 seconds in order the test to correctly timeout. --- .../TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp index d2368eebb0c..727650f0641 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp @@ -71,6 +71,8 @@ int main() { UDPSocket sock; SocketAddress udp_addr(ipbuf, port); + sock.set_blocking(true); + sock.set_timeout(1500); for (int attempt = 0; attempt < MBED_CFG_UDP_DTLS_HANDSHAKE_RETRIES; attempt++) { err = sock.open(ð); From 86c16809794f9ae8253b21f3a9de35b6e36743fc Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Thu, 27 Apr 2017 15:42:55 -0500 Subject: [PATCH 02/16] Adding failure logs to TCP echo test. This adds some extra logs to the test for debugging purposes. Also allows the test to fail immediately if it fails to obtain an IP address. --- .../TESTS/mbedmicro-net/tcp_echo/main.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp index 6a6750b19ca..bb820eeb367 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp @@ -30,9 +30,13 @@ void prep_buffer(char *tx_buffer, size_t tx_size) { int main() { GREENTEA_SETUP(60, "tcp_echo"); - EthernetInterface eth; - eth.connect(); + int err = eth.connect(); + + if (err) { + printf("MBED: failed to connect with an error of %d\r\n", err); + GREENTEA_TESTSUITE_RESULT(false); + } printf("MBED: TCPClient IP address is '%s'\n", eth.get_ip_address()); printf("MBED: TCPClient waiting for server IP and port...\n"); @@ -64,12 +68,12 @@ int main() { prep_buffer(tx_buffer, sizeof(tx_buffer)); sock.send(tx_buffer, sizeof(tx_buffer)); - + printf("MBED: Finished sending\r\n"); // Server will respond with HTTP GET's success code const int ret = sock.recv(rx_buffer, sizeof(rx_buffer)); - + printf("MBED: Finished receiving\r\n"); + result = !memcmp(tx_buffer, rx_buffer, sizeof(tx_buffer)); - TEST_ASSERT_EQUAL(ret, sizeof(rx_buffer)); TEST_ASSERT_EQUAL(true, result); } From 41fd05ce890489bc11194fe851e1d628044fb913 Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Thu, 27 Apr 2017 17:38:37 -0500 Subject: [PATCH 03/16] Adding ability to preserve Greentea UUID in test. The Greentea UUID can be used as a source of entropy/randomness during the test. This is useful for uniquely identifying a test run. --- .../greentea-client/test_env.h | 1 + .../source/greentea_test_env.cpp | 57 ++++++++++++------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/features/frameworks/greentea-client/greentea-client/test_env.h b/features/frameworks/greentea-client/greentea-client/test_env.h index d20bc50ee6a..06932188c97 100644 --- a/features/frameworks/greentea-client/greentea-client/test_env.h +++ b/features/frameworks/greentea-client/greentea-client/test_env.h @@ -77,6 +77,7 @@ extern const char* GREENTEA_TEST_ENV_LCOV_START; * Greentea-client related API for communication with host side */ void GREENTEA_SETUP(const int, const char *); +void GREENTEA_SETUP_UUID(const int timeout, const char *host_test_name, char *buffer, size_t size); void GREENTEA_TESTSUITE_RESULT(const int); void GREENTEA_TESTCASE_START(const char *test_case_name); void GREENTEA_TESTCASE_FINISH(const char *test_case_name, const size_t passes, const size_t failed); diff --git a/features/frameworks/greentea-client/source/greentea_test_env.cpp b/features/frameworks/greentea-client/source/greentea_test_env.cpp index 54f1586d144..c4b519a5e74 100644 --- a/features/frameworks/greentea-client/source/greentea_test_env.cpp +++ b/features/frameworks/greentea-client/source/greentea_test_env.cpp @@ -60,25 +60,21 @@ static void greentea_notify_completion(const int); static void greentea_notify_version(); static void greentea_write_string(const char *str); -/** \brief Handshake with host and send setup data (timeout and host test name) - * \details This function will send preamble to master. - * After host test name is received master will invoke host test script - * and add hos test's callback handlers to main event loop - * This function is blocking. - */ -void GREENTEA_SETUP(const int timeout, const char *host_test_name) { + +void _GREENTEA_SETUP_COMMON(const int timeout, const char *host_test_name, char *buffer, size_t size) { greentea_metrics_setup(); // Key-value protocol handshake function. Waits for {{__sync;...}} message // Sync preamble: "{{__sync;0dad4a9d-59a3-4aec-810d-d5fb09d852c1}}" // Example value of sync_uuid == "0dad4a9d-59a3-4aec-810d-d5fb09d852c1" - char _key[8] = {0}; - char _value[48] = {0}; - while (1) { - greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value)); + + char _key[8] = {0}; + + while (1) { + greentea_parse_kv(_key, buffer, sizeof(_key), size); greentea_write_string("mbedmbedmbedmbedmbedmbedmbedmbed\r\n"); if (strcmp(_key, GREENTEA_TEST_ENV_SYNC) == 0) { // Found correct __sunc message - greentea_send_kv(_key, _value); + greentea_send_kv(_key, buffer); break; } } @@ -88,6 +84,27 @@ void GREENTEA_SETUP(const int timeout, const char *host_test_name) { greentea_notify_hosttest(host_test_name); } +/** \brief Handshake with host and send setup data (timeout and host test name) + * \details This function will send preamble to master. + * After host test name is received master will invoke host test script + * and add hos test's callback handlers to main event loop + * This function is blocking. + */ +void GREENTEA_SETUP(const int timeout, const char *host_test_name) { + char _value[48] = {0}; + _GREENTEA_SETUP_COMMON(timeout, host_test_name, _value, 48); +} + +/** \brief Handshake with host and send setup data (timeout and host test name) + * \details This function will send preamble to master. + * After host test name is received master will invoke host test script + * and add hos test's callback handlers to main event loop + * This function is blocking. + */ +void GREENTEA_SETUP_UUID(const int timeout, const char *host_test_name, char *buffer, size_t size) { + _GREENTEA_SETUP_COMMON(timeout, host_test_name, buffer, size); +} + /** \brief Notify host (__exit message) side that test suite execution was complete * \result Test suite result * \details If __exit is not received by host side we will assume TIMEOUT @@ -194,7 +211,7 @@ inline void greentea_write_preamble() greentea_serial->putc('{'); greentea_serial->putc('{'); } - + /** * \brief Write the postamble characters to the serial port * @@ -202,7 +219,7 @@ inline void greentea_write_preamble() * for key-value comunication between the target and the host. * This uses a Rawserial object, greentea_serial, which provides * a direct interface to the USBTX and USBRX serial pins and allows - * the direct writing of characters using the putc() method. + * the direct writing of characters using the putc() method. * This suite of functions are provided to allow for serial communication * to the host from within a thread/ISR. * @@ -238,8 +255,8 @@ inline void greentea_write_string(const char *str) * \brief Write an int to the serial port * * This function writes an integer value from the target - * to the host. The integer value is converted to a string and - * and then written character by character directly to the serial + * to the host. The integer value is converted to a string and + * and then written character by character directly to the serial * port using the greentea_serial, Rawserial object. * sprintf() is used to convert the int to a string. Sprintf if * inherently thread safe so can be used. @@ -302,7 +319,7 @@ void greentea_send_kv(const char *key, const int val) { greentea_write_postamble(); } } - + /** * \brief Encapsulate and send key-value-value message from DUT to host * @@ -367,10 +384,10 @@ void greentea_send_kv(const char *key, const char *val, const int passes, const /** * \brief Encapsulate and send key-value-value message from DUT to host * - * This function uses underlying functions to write directly - * to the serial port, (USBTX). This allows key-value-value to be used + * This function uses underlying functions to write directly + * to the serial port, (USBTX). This allows key-value-value to be used * from within interrupt context. - * Both values are integers to avoid integer to string conversion + * Both values are integers to avoid integer to string conversion * made by the user. * * Names of the parameters: this function is used to send number From 822262704f009f24c8fa5421d70bfac38cc416e4 Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Thu, 27 Apr 2017 17:39:39 -0500 Subject: [PATCH 04/16] Making UDP test less strict on dropped/mismatched packets. Before, the UDP test was very strict on the number of packets it would try to match before failing. Now it will keep trying for the whole test to get enough passing packets. It also includes the test's UUID so you can validate which packets are being received. --- .../TESTS/mbedmicro-net/udp_echo/main.cpp | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp index cbd15604fc3..f0c3b576a2e 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp @@ -12,7 +12,7 @@ #include "unity/unity.h" #ifndef MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE -#define MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE 256 +#define MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE 64 #endif #ifndef MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT @@ -27,15 +27,25 @@ namespace { const int ECHO_LOOPS = 16; } -void prep_buffer(char *tx_buffer, size_t tx_size) { - for (size_t i=0; i 3*ECHO_LOOPS/4); + bool result = success == ECHO_LOOPS; sock.close(); eth.disconnect(); From 27a97f9fa5a17847286902af42075612a1ac80ab Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Fri, 28 Apr 2017 11:32:50 -0500 Subject: [PATCH 05/16] Making udp_echo_parallel test more robust against network issues. Making the test more forgiven for minor networking issues. Also adding more debug prints to make it easier to see which packets are coming from where. --- .../mbedmicro-net/udp_echo_parallel/main.cpp | 111 ++++++++++++------ 1 file changed, 77 insertions(+), 34 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp index 3f42d00c3b2..1727bbe7187 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp @@ -29,8 +29,20 @@ EthernetInterface net; SocketAddress udp_addr; Mutex iomutex; -void prep_buffer(char *tx_buffer, size_t tx_size) { - for (size_t i=0; iid = id; + this->uuid_buffer = uuid_buffer; + this->uuid_len = uuid_len; osStatus status = thread.start(callback(this, &Echo::echo)); - TEST_ASSERT_EQUAL(osOK, status); } void join() { @@ -68,30 +86,43 @@ class Echo { sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); - for (int i = 0; i < ECHO_LOOPS; i++) { - prep_buffer(tx_buffer, sizeof(tx_buffer)); + int i = 0; + while(success < ECHO_LOOPS) { + prep_buffer(id, uuid_buffer, uuid_len, tx_buffer, sizeof(tx_buffer)); const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer)); iomutex.lock(); - printf("[%02d] sent...%d Bytes \n", i, ret); + printf("[ID:%01d][%02d] sent %d Bytes - %.*s\n", id, i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, tx_buffer); iomutex.unlock(); SocketAddress temp_addr; const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer)); iomutex.lock(); - printf("[%02d] recv...%d Bytes \n", i, n); + printf("[ID:%01d][%02d] recv %d Bytes - %.*s\n", id, i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, rx_buffer); iomutex.unlock(); if ((temp_addr == udp_addr && n == sizeof(tx_buffer) && memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) { success += 1; + iomutex.lock(); + printf("[ID:%01d][%02d] success #%d\n", id, i, success); + iomutex.unlock(); } + + i++; } + result = success == ECHO_LOOPS; + err = sock.close(); TEST_ASSERT_EQUAL(0, err); + if (err) { + result = false; + } + } - TEST_ASSERT(success > 3*ECHO_LOOPS/4); + bool get_result() { + return result; } }; @@ -99,39 +130,51 @@ Echo echoers[MBED_CFG_UDP_CLIENT_ECHO_THREADS]; int main() { - GREENTEA_SETUP(60, "udp_echo"); + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(60, "udp_echo", uuid, 48); + printf("Got a uuid of %s\r\n", uuid); + size_t uuid_len = strlen(uuid); int err = net.connect(); TEST_ASSERT_EQUAL(0, err); - printf("UDP client IP Address is %s\n", net.get_ip_address()); - greentea_send_kv("target_ip", net.get_ip_address()); + if (err) { + printf("MBED: failed to connect with an error of %d\r\n", err); + GREENTEA_TESTSUITE_RESULT(false); + } else { + printf("UDP client IP Address is %s\n", net.get_ip_address()); - char recv_key[] = "host_port"; - char ipbuf[60] = {0}; - char portbuf[16] = {0}; - unsigned int port = 0; + greentea_send_kv("target_ip", net.get_ip_address()); - greentea_send_kv("host_ip", " "); - greentea_parse_kv(recv_key, ipbuf, sizeof(recv_key), sizeof(ipbuf)); + char recv_key[] = "host_port"; + char ipbuf[60] = {0}; + char portbuf[16] = {0}; + unsigned int port = 0; - greentea_send_kv("host_port", " "); - greentea_parse_kv(recv_key, portbuf, sizeof(recv_key), sizeof(ipbuf)); - sscanf(portbuf, "%u", &port); + greentea_send_kv("host_ip", " "); + greentea_parse_kv(recv_key, ipbuf, sizeof(recv_key), sizeof(ipbuf)); - printf("MBED: UDP Server IP address received: %s:%d \n", ipbuf, port); - udp_addr.set_ip_address(ipbuf); - udp_addr.set_port(port); + greentea_send_kv("host_port", " "); + greentea_parse_kv(recv_key, portbuf, sizeof(recv_key), sizeof(ipbuf)); + sscanf(portbuf, "%u", &port); - // Startup echo threads in parallel - for (int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) { - echoers[i].start(); - } + printf("MBED: UDP Server IP address received: %s:%d \n", ipbuf, port); + udp_addr.set_ip_address(ipbuf); + udp_addr.set_port(port); - for (int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) { - echoers[i].join(); - } + // Startup echo threads in parallel + for (int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) { + echoers[i].start(i, uuid, uuid_len); + } - net.disconnect(); - GREENTEA_TESTSUITE_RESULT(true); + bool result = true; + + for (int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) { + echoers[i].join(); + result = result && echoers[i].get_result(); + } + + net.disconnect(); + GREENTEA_TESTSUITE_RESULT(result); + } } From 4d672e0bb9f2bbe7496423c2d684606de21c2e08 Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Fri, 28 Apr 2017 11:43:40 -0500 Subject: [PATCH 06/16] Arranging logic in test to prevent left-over behavior --- .../TESTS/mbedmicro-net/udp_echo/main.cpp | 100 ++++++++++-------- 1 file changed, 54 insertions(+), 46 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp index f0c3b576a2e..0cd678fced6 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp @@ -47,53 +47,61 @@ int main() { printf("Got a uuid of %s\r\n", uuid); size_t uuid_len = strlen(uuid); EthernetInterface eth; - eth.connect(); - printf("UDP client IP Address is %s\n", eth.get_ip_address()); - - greentea_send_kv("target_ip", eth.get_ip_address()); - - char recv_key[] = "host_port"; - char ipbuf[60] = {0}; - char portbuf[16] = {0}; - unsigned int port = 0; - - UDPSocket sock; - sock.open(ð); - sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); - - greentea_send_kv("host_ip", " "); - greentea_parse_kv(recv_key, ipbuf, sizeof(recv_key), sizeof(ipbuf)); - - greentea_send_kv("host_port", " "); - greentea_parse_kv(recv_key, portbuf, sizeof(recv_key), sizeof(ipbuf)); - sscanf(portbuf, "%u", &port); - - printf("MBED: UDP Server IP address received: %s:%d \n", ipbuf, port); - SocketAddress udp_addr(ipbuf, port); - - int success = 0; - int i = 0; - while (success < ECHO_LOOPS) { - prep_buffer(uuid, uuid_len, tx_buffer, sizeof(tx_buffer)); - const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer)); - printf("[%02d] sent %d Bytes - %.*s \n", i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, tx_buffer); - SocketAddress temp_addr; - const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer)); - printf("[%02d] recv %d Bytes - %.*s \n", i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, rx_buffer); - - if ((temp_addr == udp_addr && - n == sizeof(tx_buffer) && - memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) { - success += 1; - - printf("[%02d] success #%d\n", i, success); + + int err = eth.connect(); + TEST_ASSERT_EQUAL(0, err); + + if (err) { + printf("MBED: failed to connect with an error of %d\r\n", err); + GREENTEA_TESTSUITE_RESULT(false); + } else { + printf("UDP client IP Address is %s\n", eth.get_ip_address()); + + greentea_send_kv("target_ip", eth.get_ip_address()); + + char recv_key[] = "host_port"; + char ipbuf[60] = {0}; + char portbuf[16] = {0}; + unsigned int port = 0; + + UDPSocket sock; + sock.open(ð); + sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); + + greentea_send_kv("host_ip", " "); + greentea_parse_kv(recv_key, ipbuf, sizeof(recv_key), sizeof(ipbuf)); + + greentea_send_kv("host_port", " "); + greentea_parse_kv(recv_key, portbuf, sizeof(recv_key), sizeof(ipbuf)); + sscanf(portbuf, "%u", &port); + + printf("MBED: UDP Server IP address received: %s:%d \n", ipbuf, port); + SocketAddress udp_addr(ipbuf, port); + + int success = 0; + int i = 0; + while (success < ECHO_LOOPS) { + prep_buffer(uuid, uuid_len, tx_buffer, sizeof(tx_buffer)); + const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer)); + printf("[%02d] sent %d Bytes - %.*s \n", i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, tx_buffer); + SocketAddress temp_addr; + const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer)); + printf("[%02d] recv %d Bytes - %.*s \n", i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, rx_buffer); + + if ((temp_addr == udp_addr && + n == sizeof(tx_buffer) && + memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) { + success += 1; + + printf("[%02d] success #%d\n", i, success); + } + i++; } - i++; - } - bool result = success == ECHO_LOOPS; + bool result = success == ECHO_LOOPS; - sock.close(); - eth.disconnect(); - GREENTEA_TESTSUITE_RESULT(result); + sock.close(); + eth.disconnect(); + GREENTEA_TESTSUITE_RESULT(result); + } } From 6862912c395d6b5cb98f447137045372c9ab00ef Mon Sep 17 00:00:00 2001 From: Kevin Gilbert Date: Fri, 28 Apr 2017 15:33:25 -0500 Subject: [PATCH 07/16] Add ability to set MAC address to custom value --- platform/mbed_interface.c | 12 ++++++++++++ platform/mbed_interface.h | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/platform/mbed_interface.c b/platform/mbed_interface.c index 84ab20cd8aa..ff0615ce014 100644 --- a/platform/mbed_interface.c +++ b/platform/mbed_interface.c @@ -81,6 +81,14 @@ WEAK int mbed_uid(char *uid) { } #endif +static uint8_t manual_mac_address_set = 0; +static char manual_mac_address[6]; + +void mbed_set_mac_address(const char *mac) { + memcpy(manual_mac_address, mac, 6); + manual_mac_address_set = 1; +} + WEAK void mbed_mac_address(char *mac) { #if DEVICE_SEMIHOST char uid[DEVICE_ID_LENGTH + 1]; @@ -101,12 +109,16 @@ WEAK void mbed_mac_address(char *mac) { mac[0] &= ~0x01; // reset the IG bit in the address; see IEE 802.3-2002, Section 3.2.3(b) } else { // else return a default MAC #endif + if(manual_mac_address_set) { + memcpy(mac, manual_mac_address, 6); + } else { mac[0] = 0x00; mac[1] = 0x02; mac[2] = 0xF7; mac[3] = 0xF0; mac[4] = 0x00; mac[5] = 0x00; + } #if DEVICE_SEMIHOST } #endif diff --git a/platform/mbed_interface.h b/platform/mbed_interface.h index f39eb4724c8..f826b5d468f 100644 --- a/platform/mbed_interface.h +++ b/platform/mbed_interface.h @@ -98,6 +98,15 @@ int mbed_interface_uid(char *uid); #endif +/** This provides a generic function to set a unique 6-byte MAC address based on the passed + * parameter character array. Provides no MAC address validity checking + * + * mbed_mac_address() will readback this configured value + * + * @param mac A 6-byte array containing the desired MAC address to be set + */ +void mbed_set_mac_address(const char *mac); + /** This returns a unique 6-byte MAC address, based on the interface UID * If the interface is not present, it returns a default fixed MAC address (00:02:F7:F0:00:00) * From 984af4b77ae5c62216a5a68676c2b46b1e71adbe Mon Sep 17 00:00:00 2001 From: Kevin Gilbert Date: Mon, 1 May 2017 13:32:54 -0500 Subject: [PATCH 08/16] Added in flag to allow optional coercion of provided MAC address to set device as Locally Administrated and Unicast --- platform/mbed_interface.c | 6 +++++- platform/mbed_interface.h | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/platform/mbed_interface.c b/platform/mbed_interface.c index ff0615ce014..e859239e98e 100644 --- a/platform/mbed_interface.c +++ b/platform/mbed_interface.c @@ -84,9 +84,13 @@ WEAK int mbed_uid(char *uid) { static uint8_t manual_mac_address_set = 0; static char manual_mac_address[6]; -void mbed_set_mac_address(const char *mac) { +void mbed_set_mac_address(const char *mac, uint8_t coerce_mac_control_bits) { memcpy(manual_mac_address, mac, 6); manual_mac_address_set = 1; + if(coerce_mac_control_bits) { + manual_mac_address[0] |= 0x02; // force bit 1 to a "1" = "Locally Administered" + manual_mac_address[0] &= 0xFE; // force bit 0 to a "0" = Unicast + } } WEAK void mbed_mac_address(char *mac) { diff --git a/platform/mbed_interface.h b/platform/mbed_interface.h index f826b5d468f..06da01ad940 100644 --- a/platform/mbed_interface.h +++ b/platform/mbed_interface.h @@ -104,8 +104,11 @@ int mbed_interface_uid(char *uid); * mbed_mac_address() will readback this configured value * * @param mac A 6-byte array containing the desired MAC address to be set + * @param coerce_mac_control_bits An 8-bit int that is used as a boolean flag to either coerce + * the provided MAC address to be Locally Administered and Unicast or to use the + * provided MAC address unmodified */ -void mbed_set_mac_address(const char *mac); +void mbed_set_mac_address(const char *mac, uint8_t coerce_mac_control_bits); /** This returns a unique 6-byte MAC address, based on the interface UID * If the interface is not present, it returns a default fixed MAC address (00:02:F7:F0:00:00) From abcdd011ae15310b7f9eec56e468a14e5b41c626 Mon Sep 17 00:00:00 2001 From: Kevin Gilbert Date: Mon, 1 May 2017 15:31:43 -0500 Subject: [PATCH 09/16] Test modifications to set MAC address to UUID --- .../FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp | 4 +++- .../FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp | 4 +++- features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp | 4 +++- .../TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp | 4 +++- .../TESTS/mbedmicro-net/tcp_hello_world/main.cpp | 4 +++- .../TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp | 5 ++++- .../mbedmicro-net/tcp_packet_pressure_parallel/main.cpp | 4 +++- .../TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp | 4 +++- .../TESTS/mbedmicro-net/udp_echo_parallel/main.cpp | 2 ++ .../TESTS/mbedmicro-net/udp_packet_pressure/main.cpp | 5 ++++- .../mbedmicro-net/udp_packet_pressure_parallel/main.cpp | 4 +++- 11 files changed, 34 insertions(+), 10 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp index 199649cabd2..6b1c45992bf 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp @@ -51,7 +51,9 @@ void test_bring_up_down() { // Test setup utest::v1::status_t test_setup(const size_t number_of_cases) { - GREENTEA_SETUP(60, "default_auto"); + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(60, "default_auto", uuid, 48); + mbed_set_mac_address(uuid, /*coerce control bits*/ 1); return verbose_test_setup_handler(number_of_cases); } diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp index a3d9914dbd8..998e7caed9d 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp @@ -91,7 +91,9 @@ void test_dns_literal_pref() { // Test setup utest::v1::status_t test_setup(const size_t number_of_cases) { - GREENTEA_SETUP(60, "default_auto"); + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(60, "default_auto", uuid, 48); + mbed_set_mac_address(uuid, /*coerce control bits*/ 1); net_bringup(); return verbose_test_setup_handler(number_of_cases); } diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp index bb820eeb367..9bf5d2343d0 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp @@ -29,7 +29,9 @@ void prep_buffer(char *tx_buffer, size_t tx_size) { } int main() { - GREENTEA_SETUP(60, "tcp_echo"); + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(60, "tcp_echo", uuid, 48); + mbed_set_mac_address(uuid, /*coerce control bits TRUE */ 1); EthernetInterface eth; int err = eth.connect(); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp index 15036a2f4ad..e65a0810ee5 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp @@ -88,7 +88,9 @@ Echo echoers[MBED_CFG_TCP_CLIENT_ECHO_THREADS]; int main() { - GREENTEA_SETUP(60, "tcp_echo"); + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(60, "default_auto", uuid, 48); + mbed_set_mac_address(uuid, /*coerce control bits*/ 1); int err = net.connect(); TEST_ASSERT_EQUAL(0, err); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp index c6ddb33bfa5..539d3c3daae 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp @@ -36,7 +36,9 @@ bool find_substring(const char *first, const char *last, const char *s_first, co } int main() { - GREENTEA_SETUP(60, "default_auto"); + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(60, "default_auto", uuid, 48); + mbed_set_mac_address(uuid, /*coerce control bits*/ 1); bool result = false; EthernetInterface eth; diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp index 23ff33c0a5a..f0744d39ab1 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp @@ -108,7 +108,10 @@ void generate_buffer(uint8_t **buffer, size_t *size, size_t min, size_t max) { int main() { - GREENTEA_SETUP(60, "tcp_echo"); + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(60, "tcp_echo", uuid, 48); + mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + generate_buffer(&buffer, &buffer_size, MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN, MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp index 6be470db777..b482dcf8923 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp @@ -225,7 +225,9 @@ PressureTest *pressure_tests[MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_THREADS]; int main() { - GREENTEA_SETUP(2*60, "tcp_echo"); + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(60, "tcp_echo", uuid, 48); + mbed_set_mac_address(uuid, /*coerce control bits*/ 1); uint8_t *buffer; size_t buffer_size; diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp index 727650f0641..0d0564c1d1c 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp @@ -28,7 +28,9 @@ int udp_dtls_handshake_pattern[] = {MBED_CFG_UDP_DTLS_HANDSHAKE_PATTERN}; const int udp_dtls_handshake_count = sizeof(udp_dtls_handshake_pattern) / sizeof(int); int main() { - GREENTEA_SETUP(60, "udp_shotgun"); + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(60, "udp_shotgun", uuid, 48); + mbed_set_mac_address(uuid, /*coerce control bits*/ 1); EthernetInterface eth; int err = eth.connect(); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp index 1727bbe7187..e4241c66779 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp @@ -133,6 +133,8 @@ int main() { char uuid[48] = {0}; GREENTEA_SETUP_UUID(60, "udp_echo", uuid, 48); printf("Got a uuid of %s\r\n", uuid); + mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + size_t uuid_len = strlen(uuid); int err = net.connect(); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp index 762c63391d2..9d457039b9a 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp @@ -111,7 +111,10 @@ void generate_buffer(uint8_t **buffer, size_t *size, size_t min, size_t max) { } int main() { - GREENTEA_SETUP(60, "udp_echo"); + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(60, "udp_echo", uuid, 48); + mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + generate_buffer(&buffer, &buffer_size, MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MIN, MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MAX); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp index 85f7dcb03a3..9a3ded68243 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp @@ -250,7 +250,9 @@ PressureTest *pressure_tests[MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_THREADS]; int main() { - GREENTEA_SETUP(2*60, "udp_echo"); + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(2*60, "udp_echo", uuid, 48); + mbed_set_mac_address(uuid, /*coerce control bits*/ 1); uint8_t *buffer; size_t buffer_size; From d55b3cfa413ee5467e5385872fcc3e6baf80f7ad Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Mon, 1 May 2017 17:28:16 -0500 Subject: [PATCH 10/16] Fixing some issues in the tcp/udp tests --- .../mbedmicro-net/tcp_echo_parallel/main.cpp | 4 +-- .../TESTS/mbedmicro-net/udp_echo/main.cpp | 17 +++++++++-- .../mbedmicro-net/udp_echo_parallel/main.cpp | 28 +++++++++++++++---- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp index e65a0810ee5..89d321a7ebc 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp @@ -64,7 +64,7 @@ class Echo { TEST_ASSERT_EQUAL(0, err); iomutex.lock(); - printf("HTTP: Connected to %s:%d\r\n", + printf("HTTP: Connected to %s:%d\r\n", tcp_addr.get_ip_address(), tcp_addr.get_port()); printf("tx_buffer buffer size: %u\r\n", sizeof(tx_buffer)); printf("rx_buffer buffer size: %u\r\n", sizeof(rx_buffer)); @@ -89,7 +89,7 @@ Echo echoers[MBED_CFG_TCP_CLIENT_ECHO_THREADS]; int main() { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "default_auto", uuid, 48); + GREENTEA_SETUP_UUID(60, "tcp_echo", uuid, 48); mbed_set_mac_address(uuid, /*coerce control bits*/ 1); int err = net.connect(); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp index 0cd678fced6..8441a2e5289 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp @@ -83,10 +83,23 @@ int main() { while (success < ECHO_LOOPS) { prep_buffer(uuid, uuid_len, tx_buffer, sizeof(tx_buffer)); const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer)); - printf("[%02d] sent %d Bytes - %.*s \n", i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, tx_buffer); + if (ret >= 0) { + printf("[%02d] sent %d Bytes - %.*s \n", i, ret, ret, tx_buffer); + } else { + printf("[%02d] Network error %d\n", i, ret); + i++; + continue; + } + SocketAddress temp_addr; const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer)); - printf("[%02d] recv %d Bytes - %.*s \n", i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, rx_buffer); + if (n >= 0) { + printf("[%02d] receive %d Bytes - %.*s \n", i, n, n, tx_buffer); + } else { + printf("[%02d] Network error %d\n", i, n); + i++; + continue; + } if ((temp_addr == udp_addr && n == sizeof(tx_buffer) && diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp index e4241c66779..79e111e095f 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp @@ -90,15 +90,31 @@ class Echo { while(success < ECHO_LOOPS) { prep_buffer(id, uuid_buffer, uuid_len, tx_buffer, sizeof(tx_buffer)); const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer)); - iomutex.lock(); - printf("[ID:%01d][%02d] sent %d Bytes - %.*s\n", id, i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, tx_buffer); - iomutex.unlock(); + if (ret >= 0) { + iomutex.lock(); + printf("[ID:%01d][%02d] sent %d Bytes - %.*s \n", id, i, ret, ret, tx_buffer); + iomutex.unlock(); + } else { + iomutex.lock(); + printf("[ID:%01d][%02d] Network error %d\n", id, i, ret); + iomutex.unlock(); + i++; + continue; + } SocketAddress temp_addr; const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer)); - iomutex.lock(); - printf("[ID:%01d][%02d] recv %d Bytes - %.*s\n", id, i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, rx_buffer); - iomutex.unlock(); + if (n >= 0) { + iomutex.lock(); + printf("[ID:%01d][%02d] receive %d Bytes - %.*s \n", id, i, n, n, tx_buffer); + iomutex.unlock(); + } else { + iomutex.lock(); + printf("[ID:%01d][%02d] Network error %d\n", id, i, n); + iomutex.unlock(); + i++; + continue; + } if ((temp_addr == udp_addr && n == sizeof(tx_buffer) && From 9c98f3f8e85cd5e893857445f2c3001bae44ff4b Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Wed, 3 May 2017 14:08:14 -0500 Subject: [PATCH 11/16] lwip: Increased DHCP timeout to 60 seconds This matches the timeout used in linux: https://linux.die.net/man/5/dhclient.conf This resolves several issues noticed during testing when we have a very large number of devices that try to get an IP address around the same time. --- .../FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp | 2 +- .../FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp | 2 +- features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp | 2 +- .../TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp | 2 +- .../TESTS/mbedmicro-net/tcp_hello_world/main.cpp | 2 +- .../TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp | 2 +- .../mbedmicro-net/tcp_packet_pressure_parallel/main.cpp | 2 +- .../TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp | 2 +- features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp | 2 +- .../TESTS/mbedmicro-net/udp_echo_parallel/main.cpp | 2 +- .../TESTS/mbedmicro-net/udp_packet_pressure/main.cpp | 2 +- .../mbedmicro-net/udp_packet_pressure_parallel/main.cpp | 2 +- features/FEATURE_LWIP/lwip-interface/lwip_stack.c | 6 ++---- features/FEATURE_LWIP/lwip-interface/lwipopts.h | 2 ++ 14 files changed, 16 insertions(+), 16 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp index 6b1c45992bf..cbfd219abbd 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp @@ -52,7 +52,7 @@ void test_bring_up_down() { // Test setup utest::v1::status_t test_setup(const size_t number_of_cases) { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "default_auto", uuid, 48); + GREENTEA_SETUP_UUID(120, "default_auto", uuid, 48); mbed_set_mac_address(uuid, /*coerce control bits*/ 1); return verbose_test_setup_handler(number_of_cases); } diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp index 998e7caed9d..c731b42363a 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp @@ -92,7 +92,7 @@ void test_dns_literal_pref() { // Test setup utest::v1::status_t test_setup(const size_t number_of_cases) { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "default_auto", uuid, 48); + GREENTEA_SETUP_UUID(120, "default_auto", uuid, 48); mbed_set_mac_address(uuid, /*coerce control bits*/ 1); net_bringup(); return verbose_test_setup_handler(number_of_cases); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp index 9bf5d2343d0..419b4c40b5e 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp @@ -30,7 +30,7 @@ void prep_buffer(char *tx_buffer, size_t tx_size) { int main() { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "tcp_echo", uuid, 48); + GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); mbed_set_mac_address(uuid, /*coerce control bits TRUE */ 1); EthernetInterface eth; int err = eth.connect(); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp index 89d321a7ebc..8f2a7a77b14 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp @@ -89,7 +89,7 @@ Echo echoers[MBED_CFG_TCP_CLIENT_ECHO_THREADS]; int main() { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "tcp_echo", uuid, 48); + GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); mbed_set_mac_address(uuid, /*coerce control bits*/ 1); int err = net.connect(); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp index 539d3c3daae..2534c14cf27 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp @@ -37,7 +37,7 @@ bool find_substring(const char *first, const char *last, const char *s_first, co int main() { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "default_auto", uuid, 48); + GREENTEA_SETUP_UUID(120, "default_auto", uuid, 48); mbed_set_mac_address(uuid, /*coerce control bits*/ 1); bool result = false; diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp index f0744d39ab1..c1f1cc84b9a 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp @@ -109,7 +109,7 @@ void generate_buffer(uint8_t **buffer, size_t *size, size_t min, size_t max) { int main() { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "tcp_echo", uuid, 48); + GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); mbed_set_mac_address(uuid, /*coerce control bits*/ 1); generate_buffer(&buffer, &buffer_size, diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp index b482dcf8923..88625e1997d 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp @@ -226,7 +226,7 @@ PressureTest *pressure_tests[MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_THREADS]; int main() { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "tcp_echo", uuid, 48); + GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); mbed_set_mac_address(uuid, /*coerce control bits*/ 1); uint8_t *buffer; diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp index 0d0564c1d1c..f63baaf584f 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp @@ -29,7 +29,7 @@ const int udp_dtls_handshake_count = sizeof(udp_dtls_handshake_pattern) / sizeof int main() { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "udp_shotgun", uuid, 48); + GREENTEA_SETUP_UUID(120, "udp_shotgun", uuid, 48); mbed_set_mac_address(uuid, /*coerce control bits*/ 1); EthernetInterface eth; diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp index 8441a2e5289..4509f6de9c3 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp @@ -43,7 +43,7 @@ void prep_buffer(char *uuid_buffer, size_t uuid_len, char *tx_buffer, size_t tx_ int main() { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "udp_echo", uuid, 48); + GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); printf("Got a uuid of %s\r\n", uuid); size_t uuid_len = strlen(uuid); EthernetInterface eth; diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp index 79e111e095f..b1a931910c8 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp @@ -147,7 +147,7 @@ Echo echoers[MBED_CFG_UDP_CLIENT_ECHO_THREADS]; int main() { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "udp_echo", uuid, 48); + GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); printf("Got a uuid of %s\r\n", uuid); mbed_set_mac_address(uuid, /*coerce control bits*/ 1); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp index 9d457039b9a..fdaf43bd1a8 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp @@ -112,7 +112,7 @@ void generate_buffer(uint8_t **buffer, size_t *size, size_t min, size_t max) { int main() { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(60, "udp_echo", uuid, 48); + GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); mbed_set_mac_address(uuid, /*coerce control bits*/ 1); generate_buffer(&buffer, &buffer_size, diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp index 9a3ded68243..7d9f3bdfdbd 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp @@ -251,7 +251,7 @@ PressureTest *pressure_tests[MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_THREADS]; int main() { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(2*60, "udp_echo", uuid, 48); + GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); mbed_set_mac_address(uuid, /*coerce control bits*/ 1); uint8_t *buffer; diff --git a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c index dffc1610fb7..85f47661701 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c +++ b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c @@ -41,8 +41,6 @@ #define MBED_NETIF_INIT_FN eth_arch_enetif_init #endif -#define DHCP_TIMEOUT 15000 - /* Static arena of sockets */ static struct lwip_socket { bool in_use; @@ -463,7 +461,7 @@ nsapi_error_t mbed_lwip_bringup(bool dhcp, const char *ip, const char *netmask, u32_t ret; if (!netif_is_link_up(&lwip_netif)) { - ret = sys_arch_sem_wait(&lwip_netif_linked, 15000); + ret = sys_arch_sem_wait(&lwip_netif_linked, DHCP_TIMEOUT * 1000); if (ret == SYS_ARCH_TIMEOUT) { return NSAPI_ERROR_NO_CONNECTION; @@ -502,7 +500,7 @@ nsapi_error_t mbed_lwip_bringup(bool dhcp, const char *ip, const char *netmask, // If doesn't have address if (!mbed_lwip_get_ip_addr(true, &lwip_netif)) { - ret = sys_arch_sem_wait(&lwip_netif_has_addr, 15000); + ret = sys_arch_sem_wait(&lwip_netif_has_addr, DHCP_TIMEOUT * 1000); if (ret == SYS_ARCH_TIMEOUT) { return NSAPI_ERROR_DHCP_FAILURE; } diff --git a/features/FEATURE_LWIP/lwip-interface/lwipopts.h b/features/FEATURE_LWIP/lwip-interface/lwipopts.h index b6521653502..9622d56be6b 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwipopts.h +++ b/features/FEATURE_LWIP/lwip-interface/lwipopts.h @@ -52,6 +52,8 @@ #define ADDR_TIMEOUT 0 #endif +#define DHCP_TIMEOUT 60 + #define PREF_IPV4 1 #define PREF_IPV6 2 From 2761a8c849f53c500a71d066561476c529b118ef Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Wed, 3 May 2017 14:35:51 -0500 Subject: [PATCH 12/16] lwip: Added udp buffer flushing after dropped packets Avoids getting stuck in loop where the device always picks up the previous test's packets --- .../mbedmicro-net/udp_dtls_handshake/main.cpp | 7 +- .../TESTS/mbedmicro-net/udp_echo/main.cpp | 114 ++++++++++-------- .../mbedmicro-net/udp_echo_parallel/main.cpp | 19 ++- 3 files changed, 83 insertions(+), 57 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp index f63baaf584f..991a662a038 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp @@ -23,6 +23,10 @@ #define MBED_CFG_UDP_DTLS_HANDSHAKE_PATTERN 112, 384, 200, 219, 25 #endif +#ifndef MBED_CFG_UDP_DTLS_HANDSHAKE_TIMEOUT +#define MBED_CFG_UDP_DTLS_HANDSHAKE_TIMEOUT 1500 +#endif + uint8_t buffer[MBED_CFG_UDP_DTLS_HANDSHAKE_BUFFER_SIZE] = {0}; int udp_dtls_handshake_pattern[] = {MBED_CFG_UDP_DTLS_HANDSHAKE_PATTERN}; const int udp_dtls_handshake_count = sizeof(udp_dtls_handshake_pattern) / sizeof(int); @@ -73,8 +77,7 @@ int main() { UDPSocket sock; SocketAddress udp_addr(ipbuf, port); - sock.set_blocking(true); - sock.set_timeout(1500); + sock.set_timeout(MBED_CFG_UDP_DTLS_HANDSHAKE_TIMEOUT); for (int attempt = 0; attempt < MBED_CFG_UDP_DTLS_HANDSHAKE_RETRIES; attempt++) { err = sock.open(ð); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp index 4509f6de9c3..f63dc0cce2a 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp @@ -54,67 +54,79 @@ int main() { if (err) { printf("MBED: failed to connect with an error of %d\r\n", err); GREENTEA_TESTSUITE_RESULT(false); - } else { - printf("UDP client IP Address is %s\n", eth.get_ip_address()); + return 0; + } - greentea_send_kv("target_ip", eth.get_ip_address()); + printf("UDP client IP Address is %s\n", eth.get_ip_address()); - char recv_key[] = "host_port"; - char ipbuf[60] = {0}; - char portbuf[16] = {0}; - unsigned int port = 0; + greentea_send_kv("target_ip", eth.get_ip_address()); - UDPSocket sock; - sock.open(ð); - sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); + char recv_key[] = "host_port"; + char ipbuf[60] = {0}; + char portbuf[16] = {0}; + unsigned int port = 0; - greentea_send_kv("host_ip", " "); - greentea_parse_kv(recv_key, ipbuf, sizeof(recv_key), sizeof(ipbuf)); - - greentea_send_kv("host_port", " "); - greentea_parse_kv(recv_key, portbuf, sizeof(recv_key), sizeof(ipbuf)); - sscanf(portbuf, "%u", &port); - - printf("MBED: UDP Server IP address received: %s:%d \n", ipbuf, port); - SocketAddress udp_addr(ipbuf, port); - - int success = 0; - int i = 0; - while (success < ECHO_LOOPS) { - prep_buffer(uuid, uuid_len, tx_buffer, sizeof(tx_buffer)); - const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer)); - if (ret >= 0) { - printf("[%02d] sent %d Bytes - %.*s \n", i, ret, ret, tx_buffer); - } else { - printf("[%02d] Network error %d\n", i, ret); - i++; - continue; - } + UDPSocket sock; + sock.open(ð); + sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); - SocketAddress temp_addr; - const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer)); - if (n >= 0) { - printf("[%02d] receive %d Bytes - %.*s \n", i, n, n, tx_buffer); - } else { - printf("[%02d] Network error %d\n", i, n); - i++; - continue; - } + greentea_send_kv("host_ip", " "); + greentea_parse_kv(recv_key, ipbuf, sizeof(recv_key), sizeof(ipbuf)); - if ((temp_addr == udp_addr && - n == sizeof(tx_buffer) && - memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) { - success += 1; + greentea_send_kv("host_port", " "); + greentea_parse_kv(recv_key, portbuf, sizeof(recv_key), sizeof(ipbuf)); + sscanf(portbuf, "%u", &port); - printf("[%02d] success #%d\n", i, success); - } + printf("MBED: UDP Server IP address received: %s:%d \n", ipbuf, port); + SocketAddress udp_addr(ipbuf, port); + + int success = 0; + int i = 0; + while (success < ECHO_LOOPS) { + prep_buffer(uuid, uuid_len, tx_buffer, sizeof(tx_buffer)); + const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer)); + if (ret >= 0) { + printf("[%02d] sent %d bytes - %.*s \n", i, ret, ret, tx_buffer); + } else { + printf("[%02d] Network error %d\n", i, ret); + i++; + continue; + } + + SocketAddress temp_addr; + const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer)); + if (n >= 0) { + printf("[%02d] recv %d bytes - %.*s \n", i, n, n, tx_buffer); + } else { + printf("[%02d] Network error %d\n", i, n); i++; + continue; } - bool result = success == ECHO_LOOPS; + if ((temp_addr == udp_addr && + n == sizeof(tx_buffer) && + memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) { + success += 1; - sock.close(); - eth.disconnect(); - GREENTEA_TESTSUITE_RESULT(result); + printf("[%02d] success #%d\n", i, success); + i++; + continue; + } + + // failed, clean out any remaining bad packets + sock.set_timeout(0); + while (true) { + err = sock.recvfrom(NULL, NULL, 0); + if (err == NSAPI_ERROR_WOULD_BLOCK) { + break; + } + } + sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); } + + bool result = success == ECHO_LOOPS; + + sock.close(); + eth.disconnect(); + GREENTEA_TESTSUITE_RESULT(result); } diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp index b1a931910c8..091ebfb1f36 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp @@ -87,12 +87,12 @@ class Echo { sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); int i = 0; - while(success < ECHO_LOOPS) { + while (success < ECHO_LOOPS) { prep_buffer(id, uuid_buffer, uuid_len, tx_buffer, sizeof(tx_buffer)); const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer)); if (ret >= 0) { iomutex.lock(); - printf("[ID:%01d][%02d] sent %d Bytes - %.*s \n", id, i, ret, ret, tx_buffer); + printf("[ID:%01d][%02d] sent %d bytes - %.*s \n", id, i, ret, ret, tx_buffer); iomutex.unlock(); } else { iomutex.lock(); @@ -106,7 +106,7 @@ class Echo { const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer)); if (n >= 0) { iomutex.lock(); - printf("[ID:%01d][%02d] receive %d Bytes - %.*s \n", id, i, n, n, tx_buffer); + printf("[ID:%01d][%02d] recv %d bytes - %.*s \n", id, i, n, n, tx_buffer); iomutex.unlock(); } else { iomutex.lock(); @@ -123,9 +123,20 @@ class Echo { iomutex.lock(); printf("[ID:%01d][%02d] success #%d\n", id, i, success); iomutex.unlock(); + + i++; + continue; } - i++; + // failed, clean out any remaining bad packets + sock.set_timeout(0); + while (true) { + err = sock.recvfrom(NULL, NULL, 0); + if (err == NSAPI_ERROR_WOULD_BLOCK) { + break; + } + } + sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); } result = success == ECHO_LOOPS; From 81bedff55696e9c856593e02cf9090cb7bcb483b Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Wed, 3 May 2017 14:42:44 -0500 Subject: [PATCH 13/16] lwip: Added hash to mac addresses during tests Avoids accidentally using a part of the uuid that isn't very unique. ie, the mac address component of type 1 uuids. --- .../TESTS/mbedmicro-net/connectivity/main.cpp | 11 +++++++++-- .../TESTS/mbedmicro-net/gethostbyname/main.cpp | 9 ++++++++- .../TESTS/mbedmicro-net/tcp_echo/main.cpp | 9 ++++++++- .../TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp | 8 +++++++- .../TESTS/mbedmicro-net/tcp_hello_world/main.cpp | 9 +++++++-- .../TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp | 8 +++++++- .../tcp_packet_pressure_parallel/main.cpp | 8 +++++++- .../TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp | 8 +++++++- .../TESTS/mbedmicro-net/udp_echo/main.cpp | 8 ++++++++ .../TESTS/mbedmicro-net/udp_echo_parallel/main.cpp | 9 +++++++-- .../TESTS/mbedmicro-net/udp_packet_pressure/main.cpp | 8 +++++++- .../udp_packet_pressure_parallel/main.cpp | 8 +++++++- 12 files changed, 89 insertions(+), 14 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp index cbfd219abbd..82e37527ab2 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp @@ -52,8 +52,15 @@ void test_bring_up_down() { // Test setup utest::v1::status_t test_setup(const size_t number_of_cases) { char uuid[48] = {0}; - GREENTEA_SETUP_UUID(120, "default_auto", uuid, 48); - mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + GREENTEA_SETUP_UUID(120, "default_auto", uuid, sizeof(uuid)); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + return verbose_test_setup_handler(number_of_cases); } diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp index c731b42363a..d2dc7086376 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp @@ -93,8 +93,15 @@ void test_dns_literal_pref() { utest::v1::status_t test_setup(const size_t number_of_cases) { char uuid[48] = {0}; GREENTEA_SETUP_UUID(120, "default_auto", uuid, 48); - mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); net_bringup(); + return verbose_test_setup_handler(number_of_cases); } diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp index 419b4c40b5e..64ed75afdf6 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp @@ -31,7 +31,14 @@ void prep_buffer(char *tx_buffer, size_t tx_size) { int main() { char uuid[48] = {0}; GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); - mbed_set_mac_address(uuid, /*coerce control bits TRUE */ 1); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + EthernetInterface eth; int err = eth.connect(); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp index 8f2a7a77b14..673ec68ea1e 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp @@ -90,7 +90,13 @@ Echo echoers[MBED_CFG_TCP_CLIENT_ECHO_THREADS]; int main() { char uuid[48] = {0}; GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); - mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); int err = net.connect(); TEST_ASSERT_EQUAL(0, err); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp index 2534c14cf27..8b1ce670c23 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp @@ -38,11 +38,16 @@ bool find_substring(const char *first, const char *last, const char *s_first, co int main() { char uuid[48] = {0}; GREENTEA_SETUP_UUID(120, "default_auto", uuid, 48); - mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); bool result = false; EthernetInterface eth; - //eth.init(); //Use DHCP eth.connect(); printf("TCP client IP Address is %s\r\n", eth.get_ip_address()); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp index c1f1cc84b9a..c7fd31e63db 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp @@ -110,7 +110,13 @@ void generate_buffer(uint8_t **buffer, size_t *size, size_t min, size_t max) { int main() { char uuid[48] = {0}; GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); - mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); generate_buffer(&buffer, &buffer_size, MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN, diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp index 88625e1997d..63483bcb804 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp @@ -227,7 +227,13 @@ PressureTest *pressure_tests[MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_THREADS]; int main() { char uuid[48] = {0}; GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); - mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); uint8_t *buffer; size_t buffer_size; diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp index 991a662a038..1609ac38896 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp @@ -34,7 +34,13 @@ const int udp_dtls_handshake_count = sizeof(udp_dtls_handshake_pattern) / sizeof int main() { char uuid[48] = {0}; GREENTEA_SETUP_UUID(120, "udp_shotgun", uuid, 48); - mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); EthernetInterface eth; int err = eth.connect(); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp index f63dc0cce2a..19b2eace434 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp @@ -46,6 +46,14 @@ int main() { GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); printf("Got a uuid of %s\r\n", uuid); size_t uuid_len = strlen(uuid); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + EthernetInterface eth; int err = eth.connect(); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp index 091ebfb1f36..36037da41c9 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp @@ -160,10 +160,15 @@ int main() { char uuid[48] = {0}; GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); printf("Got a uuid of %s\r\n", uuid); - mbed_set_mac_address(uuid, /*coerce control bits*/ 1); - size_t uuid_len = strlen(uuid); + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + int err = net.connect(); TEST_ASSERT_EQUAL(0, err); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp index fdaf43bd1a8..82068d74941 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp @@ -113,7 +113,13 @@ void generate_buffer(uint8_t **buffer, size_t *size, size_t min, size_t max) { int main() { char uuid[48] = {0}; GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); - mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); generate_buffer(&buffer, &buffer_size, MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MIN, diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp index 7d9f3bdfdbd..3364f645d30 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp @@ -252,7 +252,13 @@ PressureTest *pressure_tests[MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_THREADS]; int main() { char uuid[48] = {0}; GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); - mbed_set_mac_address(uuid, /*coerce control bits*/ 1); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); uint8_t *buffer; size_t buffer_size; From 3c7f2ab5335b6eab599f1bea64c8cf202c81a734 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Wed, 3 May 2017 16:19:41 -0500 Subject: [PATCH 14/16] lwip: Fixed count of udp iterations to reflect attempts --- .../FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp | 6 +----- .../TESTS/mbedmicro-net/udp_echo_parallel/main.cpp | 7 +------ 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp index 19b2eace434..e335d2bf105 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp @@ -89,15 +89,13 @@ int main() { SocketAddress udp_addr(ipbuf, port); int success = 0; - int i = 0; - while (success < ECHO_LOOPS) { prep_buffer(uuid, uuid_len, tx_buffer, sizeof(tx_buffer)); + for (int i = 0; success < ECHO_LOOPS; i++) { const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer)); if (ret >= 0) { printf("[%02d] sent %d bytes - %.*s \n", i, ret, ret, tx_buffer); } else { printf("[%02d] Network error %d\n", i, ret); - i++; continue; } @@ -107,7 +105,6 @@ int main() { printf("[%02d] recv %d bytes - %.*s \n", i, n, n, tx_buffer); } else { printf("[%02d] Network error %d\n", i, n); - i++; continue; } @@ -117,7 +114,6 @@ int main() { success += 1; printf("[%02d] success #%d\n", i, success); - i++; continue; } diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp index 36037da41c9..5772d703b6e 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp @@ -86,9 +86,8 @@ class Echo { sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); - int i = 0; - while (success < ECHO_LOOPS) { prep_buffer(id, uuid_buffer, uuid_len, tx_buffer, sizeof(tx_buffer)); + for (int i = 0; success < ECHO_LOOPS; i++) { const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer)); if (ret >= 0) { iomutex.lock(); @@ -98,7 +97,6 @@ class Echo { iomutex.lock(); printf("[ID:%01d][%02d] Network error %d\n", id, i, ret); iomutex.unlock(); - i++; continue; } @@ -112,7 +110,6 @@ class Echo { iomutex.lock(); printf("[ID:%01d][%02d] Network error %d\n", id, i, n); iomutex.unlock(); - i++; continue; } @@ -123,8 +120,6 @@ class Echo { iomutex.lock(); printf("[ID:%01d][%02d] success #%d\n", id, i, success); iomutex.unlock(); - - i++; continue; } From 56ba28306cc096bb63af870740c2f81b26bef48c Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Wed, 3 May 2017 16:20:39 -0500 Subject: [PATCH 15/16] lwip: Migrated to utest framework per @bridadan --- .../TESTS/mbedmicro-net/connectivity/main.cpp | 4 +- .../mbedmicro-net/gethostbyname/main.cpp | 8 +-- .../TESTS/mbedmicro-net/tcp_echo/main.cpp | 46 ++++++++---- .../mbedmicro-net/tcp_echo_parallel/main.cpp | 42 +++++++---- .../mbedmicro-net/tcp_hello_world/main.cpp | 45 ++++++++---- .../tcp_packet_pressure/main.cpp | 45 ++++++++---- .../tcp_packet_pressure_parallel/main.cpp | 45 ++++++++---- .../mbedmicro-net/udp_dtls_handshake/main.cpp | 45 ++++++++---- .../TESTS/mbedmicro-net/udp_echo/main.cpp | 61 ++++++++++------ .../mbedmicro-net/udp_echo_parallel/main.cpp | 72 +++++++++++-------- .../udp_packet_pressure/main.cpp | 45 ++++++++---- .../udp_packet_pressure_parallel/main.cpp | 46 ++++++++---- 12 files changed, 342 insertions(+), 162 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp index 82e37527ab2..ed41d1cb19f 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/connectivity/main.cpp @@ -65,8 +65,8 @@ utest::v1::status_t test_setup(const size_t number_of_cases) { } Case cases[] = { - Case("Testing bringing the network up and down", test_bring_up_down<1>), - Case("Testing bringing the network up and down twice", test_bring_up_down<2>), + Case("Bringing the network up and down", test_bring_up_down<1>), + Case("Bringing the network up and down twice", test_bring_up_down<2>), }; Specification specification(test_setup, cases); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp index d2dc7086376..9567e87be9a 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/gethostbyname/main.cpp @@ -106,10 +106,10 @@ utest::v1::status_t test_setup(const size_t number_of_cases) { } Case cases[] = { - Case("Testing DNS query", test_dns_query), - Case("Testing DNS preference query", test_dns_query_pref), - Case("Testing DNS literal", test_dns_literal), - Case("Testing DNS preference literal", test_dns_literal_pref), + Case("DNS query", test_dns_query), + Case("DNS preference query", test_dns_query_pref), + Case("DNS literal", test_dns_literal), + Case("DNS preference literal", test_dns_literal_pref), }; Specification specification(test_setup, cases); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp index 64ed75afdf6..725894623ce 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo/main.cpp @@ -10,6 +10,9 @@ #include "TCPSocket.h" #include "greentea-client/test_env.h" #include "unity/unity.h" +#include "utest.h" + +using namespace utest::v1; #ifndef MBED_CFG_TCP_CLIENT_ECHO_BUFFER_SIZE @@ -28,23 +31,13 @@ void prep_buffer(char *tx_buffer, size_t tx_size) { } } -int main() { - char uuid[48] = {0}; - GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); - - // create mac address based on uuid - uint64_t mac = 0; - for (int i = 0; i < sizeof(uuid); i++) { - mac += uuid[i]; - } - mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); - +void test_tcp_echo() { EthernetInterface eth; int err = eth.connect(); if (err) { printf("MBED: failed to connect with an error of %d\r\n", err); - GREENTEA_TESTSUITE_RESULT(false); + TEST_ASSERT_EQUAL(0, err); } printf("MBED: TCPClient IP address is '%s'\n", eth.get_ip_address()); @@ -89,5 +82,32 @@ int main() { sock.close(); eth.disconnect(); - GREENTEA_TESTSUITE_RESULT(result); + TEST_ASSERT_EQUAL(true, result); } + + +// Test setup +utest::v1::status_t test_setup(const size_t number_of_cases) { + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + + return verbose_test_setup_handler(number_of_cases); +} + +Case cases[] = { + Case("TCP echo", test_tcp_echo), +}; + +Specification specification(test_setup, cases); + +int main() { + return !Harness::run(specification); +} + diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp index 673ec68ea1e..0ca0fb71e88 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp @@ -10,6 +10,9 @@ #include "TCPSocket.h" #include "greentea-client/test_env.h" #include "unity/unity.h" +#include "utest.h" + +using namespace utest::v1; #ifndef MBED_CFG_TCP_CLIENT_ECHO_BUFFER_SIZE @@ -87,17 +90,7 @@ class Echo { Echo echoers[MBED_CFG_TCP_CLIENT_ECHO_THREADS]; -int main() { - char uuid[48] = {0}; - GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); - - // create mac address based on uuid - uint64_t mac = 0; - for (int i = 0; i < sizeof(uuid); i++) { - mac += uuid[i]; - } - mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); - +void test_tcp_echo_parallel() { int err = net.connect(); TEST_ASSERT_EQUAL(0, err); @@ -132,5 +125,30 @@ int main() { } net.disconnect(); - GREENTEA_TESTSUITE_RESULT(true); } + +// Test setup +utest::v1::status_t test_setup(const size_t number_of_cases) { + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + + return verbose_test_setup_handler(number_of_cases); +} + +Case cases[] = { + Case("TCP echo parallel", test_tcp_echo_parallel), +}; + +Specification specification(test_setup, cases); + +int main() { + return !Harness::run(specification); +} + diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp index 8b1ce670c23..2e9608b7c8e 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_hello_world/main.cpp @@ -11,6 +11,10 @@ #include "TCPSocket.h" #include "greentea-client/test_env.h" #include "unity/unity.h" +#include "utest.h" + +using namespace utest::v1; + namespace { // Test connection information @@ -35,17 +39,7 @@ bool find_substring(const char *first, const char *last, const char *s_first, co return (f != last); } -int main() { - char uuid[48] = {0}; - GREENTEA_SETUP_UUID(120, "default_auto", uuid, 48); - - // create mac address based on uuid - uint64_t mac = 0; - for (int i = 0; i < sizeof(uuid); i++) { - mac += uuid[i]; - } - mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); - +void test_tcp_hello_world() { bool result = false; EthernetInterface eth; eth.connect(); @@ -90,5 +84,32 @@ int main() { } eth.disconnect(); - GREENTEA_TESTSUITE_RESULT(result); + TEST_ASSERT_EQUAL(true, result); +} + + +// Test setup +utest::v1::status_t test_setup(const size_t number_of_cases) { + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(120, "default_auto", uuid, 48); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + + return verbose_test_setup_handler(number_of_cases); +} + +Case cases[] = { + Case("TCP hello world", test_tcp_hello_world), +}; + +Specification specification(test_setup, cases); + +int main() { + return !Harness::run(specification); } + diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp index c7fd31e63db..6ec7ecce1ab 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure/main.cpp @@ -13,6 +13,9 @@ #include "TCPSocket.h" #include "greentea-client/test_env.h" #include "unity/unity.h" +#include "utest.h" + +using namespace utest::v1; #ifndef MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN @@ -107,17 +110,7 @@ void generate_buffer(uint8_t **buffer, size_t *size, size_t min, size_t max) { } -int main() { - char uuid[48] = {0}; - GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); - - // create mac address based on uuid - uint64_t mac = 0; - for (int i = 0; i < sizeof(uuid); i++) { - mac += uuid[i]; - } - mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); - +void test_tcp_packet_pressure() { generate_buffer(&buffer, &buffer_size, MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN, MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX); @@ -132,8 +125,6 @@ int main() { greentea_send_kv("target_ip", eth.get_ip_address()); - bool result = true; - char recv_key[] = "host_port"; char ipbuf[60] = {0}; char portbuf[16] = {0}; @@ -232,5 +223,31 @@ int main() { MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN) / (1000*timer.read())); eth.disconnect(); - GREENTEA_TESTSUITE_RESULT(result); } + + +// Test setup +utest::v1::status_t test_setup(const size_t number_of_cases) { + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + + return verbose_test_setup_handler(number_of_cases); +} + +Case cases[] = { + Case("TCP packet pressure", test_tcp_packet_pressure), +}; + +Specification specification(test_setup, cases); + +int main() { + return !Harness::run(specification); +} + diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp index 63483bcb804..801e5bf3b1c 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_packet_pressure_parallel/main.cpp @@ -13,6 +13,9 @@ #include "TCPSocket.h" #include "greentea-client/test_env.h" #include "unity/unity.h" +#include "utest.h" + +using namespace utest::v1; #ifndef MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN @@ -224,17 +227,7 @@ class PressureTest { PressureTest *pressure_tests[MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_THREADS]; -int main() { - char uuid[48] = {0}; - GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); - - // create mac address based on uuid - uint64_t mac = 0; - for (int i = 0; i < sizeof(uuid); i++) { - mac += uuid[i]; - } - mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); - +void test_tcp_packet_pressure_parallel() { uint8_t *buffer; size_t buffer_size; generate_buffer(&buffer, &buffer_size, @@ -255,8 +248,6 @@ int main() { greentea_send_kv("target_ip", net.get_ip_address()); - bool result = true; - char recv_key[] = "host_port"; char ipbuf[60] = {0}; char portbuf[16] = {0}; @@ -294,5 +285,31 @@ int main() { MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN) / (1000*timer.read())); net.disconnect(); - GREENTEA_TESTSUITE_RESULT(result); } + + +// Test setup +utest::v1::status_t test_setup(const size_t number_of_cases) { + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(120, "tcp_echo", uuid, 48); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + + return verbose_test_setup_handler(number_of_cases); +} + +Case cases[] = { + Case("TCP packet pressure parallel", test_tcp_packet_pressure_parallel), +}; + +Specification specification(test_setup, cases); + +int main() { + return !Harness::run(specification); +} + diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp index 1609ac38896..01f73cf23c0 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_dtls_handshake/main.cpp @@ -10,6 +10,10 @@ #include "UDPSocket.h" #include "greentea-client/test_env.h" #include "unity/unity.h" +#include "utest.h" + +using namespace utest::v1; + #ifndef MBED_CFG_UDP_DTLS_HANDSHAKE_BUFFER_SIZE #define MBED_CFG_UDP_DTLS_HANDSHAKE_BUFFER_SIZE 512 @@ -31,17 +35,7 @@ uint8_t buffer[MBED_CFG_UDP_DTLS_HANDSHAKE_BUFFER_SIZE] = {0}; int udp_dtls_handshake_pattern[] = {MBED_CFG_UDP_DTLS_HANDSHAKE_PATTERN}; const int udp_dtls_handshake_count = sizeof(udp_dtls_handshake_pattern) / sizeof(int); -int main() { - char uuid[48] = {0}; - GREENTEA_SETUP_UUID(120, "udp_shotgun", uuid, 48); - - // create mac address based on uuid - uint64_t mac = 0; - for (int i = 0; i < sizeof(uuid); i++) { - mac += uuid[i]; - } - mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); - +void test_udp_dtls_handshake() { EthernetInterface eth; int err = eth.connect(); TEST_ASSERT_EQUAL(0, err); @@ -135,5 +129,32 @@ int main() { } eth.disconnect(); - GREENTEA_TESTSUITE_RESULT(result); + TEST_ASSERT_EQUAL(true, result); +} + + +// Test setup +utest::v1::status_t test_setup(const size_t number_of_cases) { + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(120, "udp_shotgun", uuid, 48); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + + return verbose_test_setup_handler(number_of_cases); +} + +Case cases[] = { + Case("UDP DTLS handshake", test_udp_dtls_handshake), +}; + +Specification specification(test_setup, cases); + +int main() { + return !Harness::run(specification); } + diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp index e335d2bf105..7de553f9b89 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo/main.cpp @@ -10,6 +10,10 @@ #include "UDPSocket.h" #include "greentea-client/test_env.h" #include "unity/unity.h" +#include "utest.h" + +using namespace utest::v1; + #ifndef MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE #define MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE 64 @@ -25,14 +29,14 @@ namespace { char rx_buffer[MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE] = {0}; const char ASCII_MAX = '~' - ' '; const int ECHO_LOOPS = 16; + char uuid[48] = {0}; } -void prep_buffer(char *uuid_buffer, size_t uuid_len, char *tx_buffer, size_t tx_size) { +void prep_buffer(char *uuid, char *tx_buffer, size_t tx_size) { size_t i = 0; - for (; i= 0) { printf("[%02d] sent %d bytes - %.*s \n", i, ret, ret, tx_buffer); @@ -128,9 +119,33 @@ int main() { sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); } - bool result = success == ECHO_LOOPS; - sock.close(); eth.disconnect(); - GREENTEA_TESTSUITE_RESULT(result); + TEST_ASSERT_EQUAL(ECHO_LOOPS, success); +} + + +// Test setup +utest::v1::status_t test_setup(const size_t number_of_cases) { + GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + + return verbose_test_setup_handler(number_of_cases); +} + +Case cases[] = { + Case("UDP echo", test_udp_echo), +}; + +Specification specification(test_setup, cases); + +int main() { + return !Harness::run(specification); } + diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp index 5772d703b6e..b7026bf73d7 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp @@ -10,6 +10,10 @@ #include "UDPSocket.h" #include "greentea-client/test_env.h" #include "unity/unity.h" +#include "utest.h" + +using namespace utest::v1; + #ifndef MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE #define MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE 64 @@ -28,17 +32,17 @@ const int ECHO_LOOPS = 16; EthernetInterface net; SocketAddress udp_addr; Mutex iomutex; +char uuid[48] = {0}; // NOTE: assuming that "id" stays in the single digits -void prep_buffer(int id, char *uuid_buffer, size_t uuid_len, char *tx_buffer, size_t tx_size) { - size_t i = 2; +void prep_buffer(int id, char *uuid, char *tx_buffer, size_t tx_size) { + size_t i = 0; - tx_buffer[0] = '0' + id; - tx_buffer[1] = ' '; + tx_buffer[i++] = '0' + id; + tx_buffer[i++] = ' '; - for (; iid = id; - this->uuid_buffer = uuid_buffer; - this->uuid_len = uuid_len; + this->uuid = uuid; osStatus status = thread.start(callback(this, &Echo::echo)); } @@ -86,8 +88,8 @@ class Echo { sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); - prep_buffer(id, uuid_buffer, uuid_len, tx_buffer, sizeof(tx_buffer)); for (int i = 0; success < ECHO_LOOPS; i++) { + prep_buffer(id, uuid, tx_buffer, sizeof(tx_buffer)); const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer)); if (ret >= 0) { iomutex.lock(); @@ -151,19 +153,7 @@ class Echo { Echo echoers[MBED_CFG_UDP_CLIENT_ECHO_THREADS]; -int main() { - char uuid[48] = {0}; - GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); - printf("Got a uuid of %s\r\n", uuid); - size_t uuid_len = strlen(uuid); - - // create mac address based on uuid - uint64_t mac = 0; - for (int i = 0; i < sizeof(uuid); i++) { - mac += uuid[i]; - } - mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); - +void test_udp_echo_parallel() { int err = net.connect(); TEST_ASSERT_EQUAL(0, err); @@ -193,7 +183,7 @@ int main() { // Startup echo threads in parallel for (int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) { - echoers[i].start(i, uuid, uuid_len); + echoers[i].start(i, uuid); } bool result = true; @@ -204,6 +194,32 @@ int main() { } net.disconnect(); - GREENTEA_TESTSUITE_RESULT(result); + TEST_ASSERT_EQUAL(true, result); } } + + +// Test setup +utest::v1::status_t test_setup(const size_t number_of_cases) { + GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + + return verbose_test_setup_handler(number_of_cases); +} + +Case cases[] = { + Case("UDP echo parallel", test_udp_echo_parallel), +}; + +Specification specification(test_setup, cases); + +int main() { + return !Harness::run(specification); +} + diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp index 82068d74941..f852787312a 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure/main.cpp @@ -13,6 +13,9 @@ #include "UDPSocket.h" #include "greentea-client/test_env.h" #include "unity/unity.h" +#include "utest.h" + +using namespace utest::v1; #ifndef MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MIN @@ -110,17 +113,7 @@ void generate_buffer(uint8_t **buffer, size_t *size, size_t min, size_t max) { TEST_ASSERT(buffer); } -int main() { - char uuid[48] = {0}; - GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); - - // create mac address based on uuid - uint64_t mac = 0; - for (int i = 0; i < sizeof(uuid); i++) { - mac += uuid[i]; - } - mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); - +void test_udp_packet_pressure() { generate_buffer(&buffer, &buffer_size, MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MIN, MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MAX); @@ -135,8 +128,6 @@ int main() { greentea_send_kv("target_ip", eth.get_ip_address()); - bool result = true; - char recv_key[] = "host_port"; char ipbuf[60] = {0}; char portbuf[16] = {0}; @@ -255,5 +246,31 @@ int main() { MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MIN) / (1000*timer.read())); eth.disconnect(); - GREENTEA_TESTSUITE_RESULT(result); } + + +// Test setup +utest::v1::status_t test_setup(const size_t number_of_cases) { + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + + return verbose_test_setup_handler(number_of_cases); +} + +Case cases[] = { + Case("UDP packet pressure", test_udp_packet_pressure), +}; + +Specification specification(test_setup, cases); + +int main() { + return !Harness::run(specification); +} + diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp index 3364f645d30..252da2ae9ef 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_packet_pressure_parallel/main.cpp @@ -13,6 +13,9 @@ #include "UDPSocket.h" #include "greentea-client/test_env.h" #include "unity/unity.h" +#include "utest.h" + +using namespace utest::v1; #ifndef MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MIN @@ -249,17 +252,7 @@ class PressureTest { PressureTest *pressure_tests[MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_THREADS]; -int main() { - char uuid[48] = {0}; - GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); - - // create mac address based on uuid - uint64_t mac = 0; - for (int i = 0; i < sizeof(uuid); i++) { - mac += uuid[i]; - } - mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); - +void test_udp_packet_pressure_parallel() { uint8_t *buffer; size_t buffer_size; generate_buffer(&buffer, &buffer_size, @@ -280,8 +273,6 @@ int main() { greentea_send_kv("target_ip", net.get_ip_address()); - bool result = true; - char recv_key[] = "host_port"; char ipbuf[60] = {0}; char portbuf[16] = {0}; @@ -319,5 +310,32 @@ int main() { MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MIN) / (1000*timer.read())); net.disconnect(); - GREENTEA_TESTSUITE_RESULT(result); } + + +// Test setup +utest::v1::status_t test_setup(const size_t number_of_cases) { + char uuid[48] = {0}; + GREENTEA_SETUP_UUID(120, "udp_echo", uuid, 48); + + // create mac address based on uuid + uint64_t mac = 0; + for (int i = 0; i < sizeof(uuid); i++) { + mac += uuid[i]; + } + mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1); + + return verbose_test_setup_handler(number_of_cases); +} + +Case cases[] = { + Case("UDP packet pressure parallel", test_udp_packet_pressure_parallel), +}; + +Specification specification(test_setup, cases); + +int main() { + return !Harness::run(specification); +} + + From d852bf63f7c3f4e6a63725e4994e84836701d0bf Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Thu, 4 May 2017 11:16:47 -0500 Subject: [PATCH 16/16] Moved network test buffers into heap This is a workaround for IAR's lack of flexibility with memory regions. Otherwise these tests would use very little heap and be mostly global allocations. --- .../TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp | 8 +++++--- .../TESTS/mbedmicro-net/udp_echo_parallel/main.cpp | 10 ++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp index 0ca0fb71e88..e559d34579d 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/tcp_echo_parallel/main.cpp @@ -87,7 +87,7 @@ class Echo { } }; -Echo echoers[MBED_CFG_TCP_CLIENT_ECHO_THREADS]; +Echo *echoers[MBED_CFG_TCP_CLIENT_ECHO_THREADS]; void test_tcp_echo_parallel() { @@ -117,11 +117,13 @@ void test_tcp_echo_parallel() { // Startup echo threads in parallel for (int i = 0; i < MBED_CFG_TCP_CLIENT_ECHO_THREADS; i++) { - echoers[i].start(); + echoers[i] = new Echo; + echoers[i]->start(); } for (int i = 0; i < MBED_CFG_TCP_CLIENT_ECHO_THREADS; i++) { - echoers[i].join(); + echoers[i]->join(); + delete echoers[i]; } net.disconnect(); diff --git a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp index b7026bf73d7..11c9e056950 100644 --- a/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp +++ b/features/FEATURE_LWIP/TESTS/mbedmicro-net/udp_echo_parallel/main.cpp @@ -150,7 +150,7 @@ class Echo { } }; -Echo echoers[MBED_CFG_UDP_CLIENT_ECHO_THREADS]; +Echo *echoers[MBED_CFG_UDP_CLIENT_ECHO_THREADS]; void test_udp_echo_parallel() { @@ -183,14 +183,16 @@ void test_udp_echo_parallel() { // Startup echo threads in parallel for (int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) { - echoers[i].start(i, uuid); + echoers[i] = new Echo; + echoers[i]->start(i, uuid); } bool result = true; for (int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) { - echoers[i].join(); - result = result && echoers[i].get_result(); + echoers[i]->join(); + result = result && echoers[i]->get_result(); + delete echoers[i]; } net.disconnect();