mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Merge pull request #4369 from bridadan/networking_test_update
Increase DHCP timeout, and rework networking tests logicpull/4521/merge
						commit
						f56d64f0f5
					
				| 
						 | 
				
			
			@ -51,13 +51,13 @@ void test_bring_up_down() {
 | 
			
		|||
 | 
			
		||||
// Test setup
 | 
			
		||||
utest::v1::status_t test_setup(const size_t number_of_cases) {
 | 
			
		||||
    GREENTEA_SETUP(60, "default_auto");
 | 
			
		||||
    GREENTEA_SETUP(120, "default_auto");
 | 
			
		||||
    return verbose_test_setup_handler(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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -91,16 +91,16 @@ void test_dns_literal_pref() {
 | 
			
		|||
 | 
			
		||||
// Test setup
 | 
			
		||||
utest::v1::status_t test_setup(const size_t number_of_cases) {
 | 
			
		||||
    GREENTEA_SETUP(60, "default_auto");
 | 
			
		||||
    GREENTEA_SETUP(120, "default_auto");
 | 
			
		||||
    net_bringup();
 | 
			
		||||
    return verbose_test_setup_handler(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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,11 +31,14 @@ void prep_buffer(char *tx_buffer, size_t tx_size) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    GREENTEA_SETUP(60, "tcp_echo");
 | 
			
		||||
 | 
			
		||||
void test_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);
 | 
			
		||||
        TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf("MBED: TCPClient IP address is '%s'\n", eth.get_ip_address());
 | 
			
		||||
    printf("MBED: TCPClient waiting for server IP and port...\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -64,17 +70,34 @@ 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);
 | 
			
		||||
        TEST_ASSERT(result);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sock.close();
 | 
			
		||||
    eth.disconnect();
 | 
			
		||||
    GREENTEA_TESTSUITE_RESULT(result);
 | 
			
		||||
    TEST_ASSERT(result);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Test setup
 | 
			
		||||
utest::v1::status_t test_setup(const size_t number_of_cases) {
 | 
			
		||||
    GREENTEA_SETUP(120, "tcp_echo");
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -64,7 +67,7 @@ public:
 | 
			
		|||
        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));
 | 
			
		||||
| 
						 | 
				
			
			@ -77,18 +80,16 @@ public:
 | 
			
		|||
        const int ret = sock.recv(rx_buffer, sizeof(rx_buffer));
 | 
			
		||||
        bool result = !memcmp(tx_buffer, rx_buffer, sizeof(tx_buffer));
 | 
			
		||||
        TEST_ASSERT_EQUAL(ret, sizeof(rx_buffer));
 | 
			
		||||
        TEST_ASSERT_EQUAL(true, result);
 | 
			
		||||
        TEST_ASSERT(result);
 | 
			
		||||
 | 
			
		||||
        err = sock.close();
 | 
			
		||||
        TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    GREENTEA_SETUP(60, "tcp_echo");
 | 
			
		||||
 | 
			
		||||
    Echo echoers[MBED_CFG_TCP_CLIENT_ECHO_THREADS];
 | 
			
		||||
Echo *echoers[MBED_CFG_TCP_CLIENT_ECHO_THREADS];
 | 
			
		||||
 | 
			
		||||
void test_tcp_echo_parallel() {
 | 
			
		||||
    int err = net.connect();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -115,13 +116,30 @@ int main() {
 | 
			
		|||
 | 
			
		||||
    // 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();
 | 
			
		||||
    GREENTEA_TESTSUITE_RESULT(true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test setup
 | 
			
		||||
utest::v1::status_t test_setup(const size_t number_of_cases) {
 | 
			
		||||
    GREENTEA_SETUP(120, "tcp_echo");
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,9 +39,7 @@ bool find_substring(const char *first, const char *last, const char *s_first, co
 | 
			
		|||
    return (f != last);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    GREENTEA_SETUP(60, "default_auto");
 | 
			
		||||
 | 
			
		||||
void test_tcp_hello_world() {
 | 
			
		||||
    bool result = false;
 | 
			
		||||
    EthernetInterface eth;
 | 
			
		||||
    //eth.init(); //Use DHCP
 | 
			
		||||
| 
						 | 
				
			
			@ -67,8 +69,8 @@ int main() {
 | 
			
		|||
        // Find "Hello World!" string in reply
 | 
			
		||||
        bool found_hello = find_substring(buffer, buffer + ret, HTTP_HELLO_STR, HTTP_HELLO_STR + strlen(HTTP_HELLO_STR));
 | 
			
		||||
 | 
			
		||||
        TEST_ASSERT_TRUE(found_200_ok);
 | 
			
		||||
        TEST_ASSERT_TRUE(found_hello);
 | 
			
		||||
        TEST_ASSERT(found_200_ok);
 | 
			
		||||
        TEST_ASSERT(found_hello);
 | 
			
		||||
 | 
			
		||||
        if (found_200_ok && found_hello) result = true;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -83,5 +85,22 @@ int main() {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    eth.disconnect();
 | 
			
		||||
    GREENTEA_TESTSUITE_RESULT(result);
 | 
			
		||||
    TEST_ASSERT(result);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Test setup
 | 
			
		||||
utest::v1::status_t test_setup(const size_t number_of_cases) {
 | 
			
		||||
    GREENTEA_SETUP(120, "default_auto");
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,8 +110,7 @@ void generate_buffer(uint8_t **buffer, size_t *size, size_t min, size_t max) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    GREENTEA_SETUP(60, "tcp_echo");
 | 
			
		||||
void test_tcp_packet_pressure() {
 | 
			
		||||
    generate_buffer(&buffer, &buffer_size,
 | 
			
		||||
        MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN,
 | 
			
		||||
        MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX);
 | 
			
		||||
| 
						 | 
				
			
			@ -123,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};
 | 
			
		||||
| 
						 | 
				
			
			@ -219,9 +219,25 @@ int main() {
 | 
			
		|||
    timer.stop();
 | 
			
		||||
    printf("MBED: Time taken: %fs\r\n", timer.read());
 | 
			
		||||
    printf("MBED: Speed: %.3fkb/s\r\n",
 | 
			
		||||
            8*(2*MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX - 
 | 
			
		||||
            8*(2*MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX -
 | 
			
		||||
            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) {
 | 
			
		||||
    GREENTEA_SETUP(120, "tcp_echo");
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,9 +227,7 @@ public:
 | 
			
		|||
PressureTest *pressure_tests[MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_THREADS];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    GREENTEA_SETUP(2*60, "tcp_echo");
 | 
			
		||||
 | 
			
		||||
void test_tcp_packet_pressure_parallel() {
 | 
			
		||||
    uint8_t *buffer;
 | 
			
		||||
    size_t buffer_size;
 | 
			
		||||
    generate_buffer(&buffer, &buffer_size,
 | 
			
		||||
| 
						 | 
				
			
			@ -247,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};
 | 
			
		||||
| 
						 | 
				
			
			@ -282,9 +281,25 @@ int main() {
 | 
			
		|||
    printf("MBED: Time taken: %fs\r\n", timer.read());
 | 
			
		||||
    printf("MBED: Speed: %.3fkb/s\r\n",
 | 
			
		||||
            MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_THREADS*
 | 
			
		||||
            8*(2*MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX - 
 | 
			
		||||
            8*(2*MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX -
 | 
			
		||||
            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) {
 | 
			
		||||
    GREENTEA_SETUP(120, "tcp_echo");
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -23,13 +27,15 @@
 | 
			
		|||
#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);
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    GREENTEA_SETUP(60, "udp_shotgun");
 | 
			
		||||
 | 
			
		||||
void test_udp_dtls_handshake() {
 | 
			
		||||
    EthernetInterface eth;
 | 
			
		||||
    int err = eth.connect();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
| 
						 | 
				
			
			@ -71,6 +77,7 @@ int main() {
 | 
			
		|||
 | 
			
		||||
    UDPSocket sock;
 | 
			
		||||
    SocketAddress udp_addr(ipbuf, port);
 | 
			
		||||
    sock.set_timeout(MBED_CFG_UDP_DTLS_HANDSHAKE_TIMEOUT);
 | 
			
		||||
 | 
			
		||||
    for (int attempt = 0; attempt < MBED_CFG_UDP_DTLS_HANDSHAKE_RETRIES; attempt++) {
 | 
			
		||||
        err = sock.open(ð);
 | 
			
		||||
| 
						 | 
				
			
			@ -122,5 +129,22 @@ int main() {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    eth.disconnect();
 | 
			
		||||
    GREENTEA_TESTSUITE_RESULT(result);
 | 
			
		||||
    TEST_ASSERT(result);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Test setup
 | 
			
		||||
utest::v1::status_t test_setup(const size_t number_of_cases) {
 | 
			
		||||
    GREENTEA_SETUP(120, "udp_shotgun");
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,9 +10,13 @@
 | 
			
		|||
#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 256
 | 
			
		||||
#define MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE 64
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT
 | 
			
		||||
| 
						 | 
				
			
			@ -25,19 +29,35 @@ namespace {
 | 
			
		|||
    char rx_buffer[MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE] = {0};
 | 
			
		||||
    const char ASCII_MAX = '~' - ' ';
 | 
			
		||||
    const int ECHO_LOOPS = 16;
 | 
			
		||||
    char uuid[GREENTEA_UUID_LENGTH] = {0};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void prep_buffer(char *tx_buffer, size_t tx_size) {
 | 
			
		||||
    for (size_t i=0; i<tx_size; ++i) {
 | 
			
		||||
// Creates a buffer that contains the test's UUID in the first part of the contents
 | 
			
		||||
// so the output can be associated with individual test runs. The rest of the
 | 
			
		||||
// buffer is filled with random data so it is unique within the CURRENT test run.
 | 
			
		||||
//
 | 
			
		||||
// Ex. A test with UUID of `33e5002c-9722-4685-817a-709cc69c4701` would have a
 | 
			
		||||
// buffer filled with something like `33e5002c-9722-4685-817a-709cc69c4701 12594387`
 | 
			
		||||
// where `33e5002c-9722-4685-817a-709cc69c4701` is the UUID and `12594387` is the random data
 | 
			
		||||
void prep_buffer(char *uuid, char *tx_buffer, size_t tx_size) {
 | 
			
		||||
    size_t i = 0;
 | 
			
		||||
 | 
			
		||||
    memcpy(tx_buffer, uuid, strlen(uuid));
 | 
			
		||||
    i += strlen(uuid);
 | 
			
		||||
 | 
			
		||||
    tx_buffer[i++] = ' ';
 | 
			
		||||
 | 
			
		||||
    for (; i<tx_size; ++i) {
 | 
			
		||||
        tx_buffer[i] = (rand() % 10) + '0';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    GREENTEA_SETUP(60, "udp_echo");
 | 
			
		||||
 | 
			
		||||
void test_udp_echo() {
 | 
			
		||||
    EthernetInterface eth;
 | 
			
		||||
    eth.connect();
 | 
			
		||||
 | 
			
		||||
    int err = eth.connect();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
    printf("UDP client IP Address is %s\n", eth.get_ip_address());
 | 
			
		||||
 | 
			
		||||
    greentea_send_kv("target_ip", eth.get_ip_address());
 | 
			
		||||
| 
						 | 
				
			
			@ -62,26 +82,63 @@ int main() {
 | 
			
		|||
    SocketAddress udp_addr(ipbuf, port);
 | 
			
		||||
 | 
			
		||||
    int success = 0;
 | 
			
		||||
 | 
			
		||||
    for (int i=0; i < ECHO_LOOPS; ++i) {
 | 
			
		||||
        prep_buffer(tx_buffer, sizeof(tx_buffer));
 | 
			
		||||
        const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer));
 | 
			
		||||
        printf("[%02d] sent...%d Bytes \n", i, ret);
 | 
			
		||||
    for (unsigned int i = 0; success < ECHO_LOOPS; i++) {
 | 
			
		||||
        prep_buffer(uuid, tx_buffer, sizeof(tx_buffer));
 | 
			
		||||
        int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer));
 | 
			
		||||
        if (ret >= 0) {
 | 
			
		||||
            printf("[%02u] sent %d bytes - %.*s  \n", i, ret, ret, tx_buffer);
 | 
			
		||||
        } else {
 | 
			
		||||
            printf("[%02u] Network error %d\n", i, ret);
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        SocketAddress temp_addr;
 | 
			
		||||
        const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer));
 | 
			
		||||
        printf("[%02d] recv...%d Bytes \n", i, n);
 | 
			
		||||
        ret = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer));
 | 
			
		||||
        if (ret >= 0) {
 | 
			
		||||
            printf("[%02u] recv %d bytes - %.*s  \n", i, ret, ret, tx_buffer);
 | 
			
		||||
        } else {
 | 
			
		||||
            printf("[%02u] Network error %d\n", i, ret);
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ((temp_addr == udp_addr &&
 | 
			
		||||
             n == sizeof(tx_buffer) &&
 | 
			
		||||
             ret == sizeof(tx_buffer) &&
 | 
			
		||||
             memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) {
 | 
			
		||||
            success += 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool result = (success > 3*ECHO_LOOPS/4);
 | 
			
		||||
            printf("[%02u] success #%d\n", i, success);
 | 
			
		||||
            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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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, GREENTEA_UUID_LENGTH);
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,9 +32,34 @@ const int ECHO_LOOPS = 16;
 | 
			
		|||
EthernetInterface net;
 | 
			
		||||
SocketAddress udp_addr;
 | 
			
		||||
Mutex iomutex;
 | 
			
		||||
char uuid[GREENTEA_UUID_LENGTH] = {0};
 | 
			
		||||
 | 
			
		||||
void prep_buffer(char *tx_buffer, size_t tx_size) {
 | 
			
		||||
    for (size_t i=0; i<tx_size; ++i) {
 | 
			
		||||
// NOTE: assuming that "id" stays in the single digits
 | 
			
		||||
//
 | 
			
		||||
// Creates a buffer that first contains the thread's id.
 | 
			
		||||
//
 | 
			
		||||
// The second part of the buffer contains the test's UUID so the output can be
 | 
			
		||||
// associated with individual test runs.
 | 
			
		||||
//
 | 
			
		||||
// The rest of the buffer is filled with random data so it is unique within the
 | 
			
		||||
// CURRENT test run.
 | 
			
		||||
//
 | 
			
		||||
// Ex. A thread with id "2" and a test with UUID of `33e5002c-9722-4685-817a-709cc69c4701`
 | 
			
		||||
// would have a buffer filled with something like `2 33e5002c-9722-4685-817a-709cc69c4701 12594387`
 | 
			
		||||
// where `2` is the thread id, `33e5002c-9722-4685-817a-709cc69c4701` is the UUID
 | 
			
		||||
// and `12594387` is the random data
 | 
			
		||||
void prep_buffer(unsigned int id, char *uuid, char *tx_buffer, size_t tx_size) {
 | 
			
		||||
    size_t i = 0;
 | 
			
		||||
 | 
			
		||||
    tx_buffer[i++] = '0' + id;
 | 
			
		||||
    tx_buffer[i++] = ' ';
 | 
			
		||||
 | 
			
		||||
    memcpy(tx_buffer+i, uuid, strlen(uuid));
 | 
			
		||||
    i += strlen(uuid);
 | 
			
		||||
 | 
			
		||||
    tx_buffer[i++] = ' ';
 | 
			
		||||
 | 
			
		||||
    for (; i<tx_size; ++i) {
 | 
			
		||||
        tx_buffer[i] = (rand() % 10) + '0';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -44,15 +73,19 @@ private:
 | 
			
		|||
 | 
			
		||||
    UDPSocket sock;
 | 
			
		||||
    Thread thread;
 | 
			
		||||
    bool result;
 | 
			
		||||
    unsigned int id;
 | 
			
		||||
    char *uuid;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    // Limiting stack size to 1k
 | 
			
		||||
    Echo(): thread(osPriorityNormal, 1024) {
 | 
			
		||||
    Echo(): thread(osPriorityNormal, 1024), result(false) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void start() {
 | 
			
		||||
    void start(unsigned int id, char *uuid) {
 | 
			
		||||
        this->id = id;
 | 
			
		||||
        this->uuid = uuid;
 | 
			
		||||
        osStatus status = thread.start(callback(this, &Echo::echo));
 | 
			
		||||
        TEST_ASSERT_EQUAL(osOK, status);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void join() {
 | 
			
		||||
| 
						 | 
				
			
			@ -68,40 +101,74 @@ public:
 | 
			
		|||
 | 
			
		||||
        sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT);
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < ECHO_LOOPS; i++) {
 | 
			
		||||
            prep_buffer(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);
 | 
			
		||||
            iomutex.unlock();
 | 
			
		||||
        for (unsigned int i = 0; success < ECHO_LOOPS; i++) {
 | 
			
		||||
            prep_buffer(id, uuid, tx_buffer, sizeof(tx_buffer));
 | 
			
		||||
            int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer));
 | 
			
		||||
            if (ret >= 0) {
 | 
			
		||||
                iomutex.lock();
 | 
			
		||||
                printf("[ID:%01u][%02u] sent %d bytes - %.*s  \n", id, i, ret, ret, tx_buffer);
 | 
			
		||||
                iomutex.unlock();
 | 
			
		||||
            } else {
 | 
			
		||||
                iomutex.lock();
 | 
			
		||||
                printf("[ID:%01u][%02u] Network error %d\n", id, i, ret);
 | 
			
		||||
                iomutex.unlock();
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            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);
 | 
			
		||||
            iomutex.unlock();
 | 
			
		||||
            ret = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer));
 | 
			
		||||
            if (ret >= 0) {
 | 
			
		||||
                iomutex.lock();
 | 
			
		||||
                printf("[ID:%01u][%02u] recv %d bytes - %.*s  \n", id, i, ret, ret, tx_buffer);
 | 
			
		||||
                iomutex.unlock();
 | 
			
		||||
            } else {
 | 
			
		||||
                iomutex.lock();
 | 
			
		||||
                printf("[ID:%01u][%02u] Network error %d\n", id, i, ret);
 | 
			
		||||
                iomutex.unlock();
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if ((temp_addr == udp_addr &&
 | 
			
		||||
                 n == sizeof(tx_buffer) &&
 | 
			
		||||
                 ret == sizeof(tx_buffer) &&
 | 
			
		||||
                 memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) {
 | 
			
		||||
                success += 1;
 | 
			
		||||
                iomutex.lock();
 | 
			
		||||
                printf("[ID:%01u][%02u] success #%d\n", id, i, success);
 | 
			
		||||
                iomutex.unlock();
 | 
			
		||||
                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);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        err = sock.close();
 | 
			
		||||
        TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
        result = success == ECHO_LOOPS;
 | 
			
		||||
 | 
			
		||||
        TEST_ASSERT(success > 3*ECHO_LOOPS/4);
 | 
			
		||||
        err = sock.close();
 | 
			
		||||
        printf("[ID:%01u] Failed to close socket!\n", id);
 | 
			
		||||
        if (err) {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool get_result() {
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    GREENTEA_SETUP(60, "udp_echo");
 | 
			
		||||
 | 
			
		||||
    Echo echoers[MBED_CFG_UDP_CLIENT_ECHO_THREADS];
 | 
			
		||||
Echo *echoers[MBED_CFG_UDP_CLIENT_ECHO_THREADS];
 | 
			
		||||
 | 
			
		||||
void test_udp_echo_parallel() {
 | 
			
		||||
    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());
 | 
			
		||||
| 
						 | 
				
			
			@ -123,14 +190,36 @@ int main() {
 | 
			
		|||
    udp_addr.set_port(port);
 | 
			
		||||
 | 
			
		||||
    // Startup echo threads in parallel
 | 
			
		||||
    for (int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) {
 | 
			
		||||
        echoers[i].start();
 | 
			
		||||
    for (unsigned int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) {
 | 
			
		||||
        echoers[i] = new Echo;
 | 
			
		||||
        echoers[i]->start(i, uuid);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) {
 | 
			
		||||
        echoers[i].join();
 | 
			
		||||
    bool result = true;
 | 
			
		||||
 | 
			
		||||
    for (unsigned int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) {
 | 
			
		||||
        echoers[i]->join();
 | 
			
		||||
        result = result && echoers[i]->get_result();
 | 
			
		||||
        delete echoers[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    net.disconnect();
 | 
			
		||||
    GREENTEA_TESTSUITE_RESULT(true);
 | 
			
		||||
    TEST_ASSERT(result);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Test setup
 | 
			
		||||
utest::v1::status_t test_setup(const size_t number_of_cases) {
 | 
			
		||||
    GREENTEA_SETUP_UUID(120, "udp_echo", uuid, GREENTEA_UUID_LENGTH);
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,8 +113,7 @@ void generate_buffer(uint8_t **buffer, size_t *size, size_t min, size_t max) {
 | 
			
		|||
    TEST_ASSERT(buffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    GREENTEA_SETUP(60, "udp_echo");
 | 
			
		||||
void test_udp_packet_pressure() {
 | 
			
		||||
    generate_buffer(&buffer, &buffer_size,
 | 
			
		||||
        MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MIN,
 | 
			
		||||
        MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MAX);
 | 
			
		||||
| 
						 | 
				
			
			@ -126,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};
 | 
			
		||||
| 
						 | 
				
			
			@ -242,9 +242,25 @@ int main() {
 | 
			
		|||
    timer.stop();
 | 
			
		||||
    printf("MBED: Time taken: %fs\r\n", timer.read());
 | 
			
		||||
    printf("MBED: Speed: %.3fkb/s\r\n",
 | 
			
		||||
            8*(2*MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MAX - 
 | 
			
		||||
            8*(2*MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MAX -
 | 
			
		||||
            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) {
 | 
			
		||||
    GREENTEA_SETUP(120, "udp_echo");
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,9 +252,7 @@ public:
 | 
			
		|||
PressureTest *pressure_tests[MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_THREADS];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    GREENTEA_SETUP(2*60, "udp_echo");
 | 
			
		||||
 | 
			
		||||
void test_udp_packet_pressure_parallel() {
 | 
			
		||||
    uint8_t *buffer;
 | 
			
		||||
    size_t buffer_size;
 | 
			
		||||
    generate_buffer(&buffer, &buffer_size,
 | 
			
		||||
| 
						 | 
				
			
			@ -272,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};
 | 
			
		||||
| 
						 | 
				
			
			@ -307,9 +306,25 @@ int main() {
 | 
			
		|||
    printf("MBED: Time taken: %fs\r\n", timer.read());
 | 
			
		||||
    printf("MBED: Speed: %.3fkb/s\r\n",
 | 
			
		||||
            MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_THREADS*
 | 
			
		||||
            8*(2*MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MAX - 
 | 
			
		||||
            8*(2*MBED_CFG_UDP_CLIENT_PACKET_PRESSURE_MAX -
 | 
			
		||||
            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) {
 | 
			
		||||
    GREENTEA_SETUP(120, "udp_echo");
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,61 @@
 | 
			
		|||
/* mbed Microcontroller Library
 | 
			
		||||
 * Copyright (c) 2017 ARM Limited
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "stm32f4xx_hal.h"
 | 
			
		||||
 | 
			
		||||
void _eth_config_mac(ETH_HandleTypeDef *heth)
 | 
			
		||||
{
 | 
			
		||||
    ETH_MACInitTypeDef macconf =
 | 
			
		||||
        {
 | 
			
		||||
        .Watchdog = ETH_WATCHDOG_ENABLE,
 | 
			
		||||
        .Jabber = ETH_JABBER_ENABLE,
 | 
			
		||||
        .InterFrameGap = ETH_INTERFRAMEGAP_96BIT,
 | 
			
		||||
        .CarrierSense = ETH_CARRIERSENCE_ENABLE,
 | 
			
		||||
        .ReceiveOwn = ETH_RECEIVEOWN_ENABLE,
 | 
			
		||||
        .LoopbackMode = ETH_LOOPBACKMODE_DISABLE,
 | 
			
		||||
        .ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE,
 | 
			
		||||
        .RetryTransmission = ETH_RETRYTRANSMISSION_DISABLE,
 | 
			
		||||
        .AutomaticPadCRCStrip = ETH_AUTOMATICPADCRCSTRIP_DISABLE,
 | 
			
		||||
        .BackOffLimit = ETH_BACKOFFLIMIT_10,
 | 
			
		||||
        .DeferralCheck = ETH_DEFFERRALCHECK_DISABLE,
 | 
			
		||||
        .ReceiveAll = ETH_RECEIVEAll_DISABLE,
 | 
			
		||||
        .SourceAddrFilter = ETH_SOURCEADDRFILTER_DISABLE,
 | 
			
		||||
        .PassControlFrames = ETH_PASSCONTROLFRAMES_BLOCKALL,
 | 
			
		||||
        .BroadcastFramesReception = ETH_BROADCASTFRAMESRECEPTION_ENABLE,
 | 
			
		||||
        .DestinationAddrFilter = ETH_DESTINATIONADDRFILTER_NORMAL,
 | 
			
		||||
        .PromiscuousMode = ETH_PROMISCUOUS_MODE_DISABLE,
 | 
			
		||||
        .MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE, // Disable multicast filter
 | 
			
		||||
        .UnicastFramesFilter = ETH_UNICASTFRAMESFILTER_PERFECT,
 | 
			
		||||
        .HashTableHigh = 0x0U,
 | 
			
		||||
        .HashTableLow = 0x0U,
 | 
			
		||||
        .PauseTime = 0x0U,
 | 
			
		||||
        .ZeroQuantaPause = ETH_ZEROQUANTAPAUSE_DISABLE,
 | 
			
		||||
        .PauseLowThreshold = ETH_PAUSELOWTHRESHOLD_MINUS4,
 | 
			
		||||
        .UnicastPauseFrameDetect = ETH_UNICASTPAUSEFRAMEDETECT_DISABLE,
 | 
			
		||||
        .ReceiveFlowControl = ETH_RECEIVEFLOWCONTROL_DISABLE,
 | 
			
		||||
        .TransmitFlowControl = ETH_TRANSMITFLOWCONTROL_DISABLE,
 | 
			
		||||
        .VLANTagComparison = ETH_VLANTAGCOMPARISON_16BIT,
 | 
			
		||||
        .VLANTagIdentifier = 0x0U,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
    if (heth->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE) {
 | 
			
		||||
        macconf.ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE;
 | 
			
		||||
    } else {
 | 
			
		||||
        macconf.ChecksumOffload = ETH_CHECKSUMOFFLAOD_DISABLE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    (void) HAL_ETH_ConfigMAC(heth, &macconf);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,61 @@
 | 
			
		|||
/* mbed Microcontroller Library
 | 
			
		||||
 * Copyright (c) 2017 ARM Limited
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "stm32f4xx_hal.h"
 | 
			
		||||
 | 
			
		||||
void _eth_config_mac(ETH_HandleTypeDef *heth)
 | 
			
		||||
{
 | 
			
		||||
    ETH_MACInitTypeDef macconf =
 | 
			
		||||
        {
 | 
			
		||||
        .Watchdog = ETH_WATCHDOG_ENABLE,
 | 
			
		||||
        .Jabber = ETH_JABBER_ENABLE,
 | 
			
		||||
        .InterFrameGap = ETH_INTERFRAMEGAP_96BIT,
 | 
			
		||||
        .CarrierSense = ETH_CARRIERSENCE_ENABLE,
 | 
			
		||||
        .ReceiveOwn = ETH_RECEIVEOWN_ENABLE,
 | 
			
		||||
        .LoopbackMode = ETH_LOOPBACKMODE_DISABLE,
 | 
			
		||||
        .ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE,
 | 
			
		||||
        .RetryTransmission = ETH_RETRYTRANSMISSION_DISABLE,
 | 
			
		||||
        .AutomaticPadCRCStrip = ETH_AUTOMATICPADCRCSTRIP_DISABLE,
 | 
			
		||||
        .BackOffLimit = ETH_BACKOFFLIMIT_10,
 | 
			
		||||
        .DeferralCheck = ETH_DEFFERRALCHECK_DISABLE,
 | 
			
		||||
        .ReceiveAll = ETH_RECEIVEAll_DISABLE,
 | 
			
		||||
        .SourceAddrFilter = ETH_SOURCEADDRFILTER_DISABLE,
 | 
			
		||||
        .PassControlFrames = ETH_PASSCONTROLFRAMES_BLOCKALL,
 | 
			
		||||
        .BroadcastFramesReception = ETH_BROADCASTFRAMESRECEPTION_ENABLE,
 | 
			
		||||
        .DestinationAddrFilter = ETH_DESTINATIONADDRFILTER_NORMAL,
 | 
			
		||||
        .PromiscuousMode = ETH_PROMISCUOUS_MODE_DISABLE,
 | 
			
		||||
        .MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE, // Disable multicast filter
 | 
			
		||||
        .UnicastFramesFilter = ETH_UNICASTFRAMESFILTER_PERFECT,
 | 
			
		||||
        .HashTableHigh = 0x0U,
 | 
			
		||||
        .HashTableLow = 0x0U,
 | 
			
		||||
        .PauseTime = 0x0U,
 | 
			
		||||
        .ZeroQuantaPause = ETH_ZEROQUANTAPAUSE_DISABLE,
 | 
			
		||||
        .PauseLowThreshold = ETH_PAUSELOWTHRESHOLD_MINUS4,
 | 
			
		||||
        .UnicastPauseFrameDetect = ETH_UNICASTPAUSEFRAMEDETECT_DISABLE,
 | 
			
		||||
        .ReceiveFlowControl = ETH_RECEIVEFLOWCONTROL_DISABLE,
 | 
			
		||||
        .TransmitFlowControl = ETH_TRANSMITFLOWCONTROL_DISABLE,
 | 
			
		||||
        .VLANTagComparison = ETH_VLANTAGCOMPARISON_16BIT,
 | 
			
		||||
        .VLANTagIdentifier = 0x0U,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
    if (heth->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE) {
 | 
			
		||||
        macconf.ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE;
 | 
			
		||||
    } else {
 | 
			
		||||
        macconf.ChecksumOffload = ETH_CHECKSUMOFFLAOD_DISABLE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    (void) HAL_ETH_ConfigMAC(heth, &macconf);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,61 @@
 | 
			
		|||
/* mbed Microcontroller Library
 | 
			
		||||
 * Copyright (c) 2017 ARM Limited
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "stm32f4xx_hal.h"
 | 
			
		||||
 | 
			
		||||
void _eth_config_mac(ETH_HandleTypeDef *heth)
 | 
			
		||||
{
 | 
			
		||||
    ETH_MACInitTypeDef macconf =
 | 
			
		||||
        {
 | 
			
		||||
        .Watchdog = ETH_WATCHDOG_ENABLE,
 | 
			
		||||
        .Jabber = ETH_JABBER_ENABLE,
 | 
			
		||||
        .InterFrameGap = ETH_INTERFRAMEGAP_96BIT,
 | 
			
		||||
        .CarrierSense = ETH_CARRIERSENCE_ENABLE,
 | 
			
		||||
        .ReceiveOwn = ETH_RECEIVEOWN_ENABLE,
 | 
			
		||||
        .LoopbackMode = ETH_LOOPBACKMODE_DISABLE,
 | 
			
		||||
        .ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE,
 | 
			
		||||
        .RetryTransmission = ETH_RETRYTRANSMISSION_DISABLE,
 | 
			
		||||
        .AutomaticPadCRCStrip = ETH_AUTOMATICPADCRCSTRIP_DISABLE,
 | 
			
		||||
        .BackOffLimit = ETH_BACKOFFLIMIT_10,
 | 
			
		||||
        .DeferralCheck = ETH_DEFFERRALCHECK_DISABLE,
 | 
			
		||||
        .ReceiveAll = ETH_RECEIVEAll_DISABLE,
 | 
			
		||||
        .SourceAddrFilter = ETH_SOURCEADDRFILTER_DISABLE,
 | 
			
		||||
        .PassControlFrames = ETH_PASSCONTROLFRAMES_BLOCKALL,
 | 
			
		||||
        .BroadcastFramesReception = ETH_BROADCASTFRAMESRECEPTION_ENABLE,
 | 
			
		||||
        .DestinationAddrFilter = ETH_DESTINATIONADDRFILTER_NORMAL,
 | 
			
		||||
        .PromiscuousMode = ETH_PROMISCUOUS_MODE_DISABLE,
 | 
			
		||||
        .MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE, // Disable multicast filter
 | 
			
		||||
        .UnicastFramesFilter = ETH_UNICASTFRAMESFILTER_PERFECT,
 | 
			
		||||
        .HashTableHigh = 0x0U,
 | 
			
		||||
        .HashTableLow = 0x0U,
 | 
			
		||||
        .PauseTime = 0x0U,
 | 
			
		||||
        .ZeroQuantaPause = ETH_ZEROQUANTAPAUSE_DISABLE,
 | 
			
		||||
        .PauseLowThreshold = ETH_PAUSELOWTHRESHOLD_MINUS4,
 | 
			
		||||
        .UnicastPauseFrameDetect = ETH_UNICASTPAUSEFRAMEDETECT_DISABLE,
 | 
			
		||||
        .ReceiveFlowControl = ETH_RECEIVEFLOWCONTROL_DISABLE,
 | 
			
		||||
        .TransmitFlowControl = ETH_TRANSMITFLOWCONTROL_DISABLE,
 | 
			
		||||
        .VLANTagComparison = ETH_VLANTAGCOMPARISON_16BIT,
 | 
			
		||||
        .VLANTagIdentifier = 0x0U,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
    if (heth->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE) {
 | 
			
		||||
        macconf.ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE;
 | 
			
		||||
    } else {
 | 
			
		||||
        macconf.ChecksumOffload = ETH_CHECKSUMOFFLAOD_DISABLE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    (void) HAL_ETH_ConfigMAC(heth, &macconf);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,61 @@
 | 
			
		|||
/* mbed Microcontroller Library
 | 
			
		||||
 * Copyright (c) 2017 ARM Limited
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "stm32f4xx_hal.h"
 | 
			
		||||
 | 
			
		||||
void _eth_config_mac(ETH_HandleTypeDef *heth)
 | 
			
		||||
{
 | 
			
		||||
    ETH_MACInitTypeDef macconf =
 | 
			
		||||
        {
 | 
			
		||||
        .Watchdog = ETH_WATCHDOG_ENABLE,
 | 
			
		||||
        .Jabber = ETH_JABBER_ENABLE,
 | 
			
		||||
        .InterFrameGap = ETH_INTERFRAMEGAP_96BIT,
 | 
			
		||||
        .CarrierSense = ETH_CARRIERSENCE_ENABLE,
 | 
			
		||||
        .ReceiveOwn = ETH_RECEIVEOWN_ENABLE,
 | 
			
		||||
        .LoopbackMode = ETH_LOOPBACKMODE_DISABLE,
 | 
			
		||||
        .ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE,
 | 
			
		||||
        .RetryTransmission = ETH_RETRYTRANSMISSION_DISABLE,
 | 
			
		||||
        .AutomaticPadCRCStrip = ETH_AUTOMATICPADCRCSTRIP_DISABLE,
 | 
			
		||||
        .BackOffLimit = ETH_BACKOFFLIMIT_10,
 | 
			
		||||
        .DeferralCheck = ETH_DEFFERRALCHECK_DISABLE,
 | 
			
		||||
        .ReceiveAll = ETH_RECEIVEAll_DISABLE,
 | 
			
		||||
        .SourceAddrFilter = ETH_SOURCEADDRFILTER_DISABLE,
 | 
			
		||||
        .PassControlFrames = ETH_PASSCONTROLFRAMES_BLOCKALL,
 | 
			
		||||
        .BroadcastFramesReception = ETH_BROADCASTFRAMESRECEPTION_ENABLE,
 | 
			
		||||
        .DestinationAddrFilter = ETH_DESTINATIONADDRFILTER_NORMAL,
 | 
			
		||||
        .PromiscuousMode = ETH_PROMISCUOUS_MODE_DISABLE,
 | 
			
		||||
        .MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE, // Disable multicast filter
 | 
			
		||||
        .UnicastFramesFilter = ETH_UNICASTFRAMESFILTER_PERFECT,
 | 
			
		||||
        .HashTableHigh = 0x0U,
 | 
			
		||||
        .HashTableLow = 0x0U,
 | 
			
		||||
        .PauseTime = 0x0U,
 | 
			
		||||
        .ZeroQuantaPause = ETH_ZEROQUANTAPAUSE_DISABLE,
 | 
			
		||||
        .PauseLowThreshold = ETH_PAUSELOWTHRESHOLD_MINUS4,
 | 
			
		||||
        .UnicastPauseFrameDetect = ETH_UNICASTPAUSEFRAMEDETECT_DISABLE,
 | 
			
		||||
        .ReceiveFlowControl = ETH_RECEIVEFLOWCONTROL_DISABLE,
 | 
			
		||||
        .TransmitFlowControl = ETH_TRANSMITFLOWCONTROL_DISABLE,
 | 
			
		||||
        .VLANTagComparison = ETH_VLANTAGCOMPARISON_16BIT,
 | 
			
		||||
        .VLANTagIdentifier = 0x0U,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
    if (heth->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE) {
 | 
			
		||||
        macconf.ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE;
 | 
			
		||||
    } else {
 | 
			
		||||
        macconf.ChecksumOffload = ETH_CHECKSUMOFFLAOD_DISABLE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    (void) HAL_ETH_ConfigMAC(heth, &macconf);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -47,8 +47,6 @@ static nsapi_error_t mbed_lwip_err_remap(err_t err);
 | 
			
		|||
    #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;
 | 
			
		||||
| 
						 | 
				
			
			@ -550,6 +548,7 @@ nsapi_error_t mbed_lwip_bringup_2(bool dhcp, bool ppp, const char *ip, const cha
 | 
			
		|||
#endif /* LWIP_IPV6_AUTOCONFIG */
 | 
			
		||||
#endif // LWIP_IPV6
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if LWIP_IPV4
 | 
			
		||||
    if (!dhcp && !ppp) {
 | 
			
		||||
        ip4_addr_t ip_addr;
 | 
			
		||||
| 
						 | 
				
			
			@ -600,10 +599,11 @@ nsapi_error_t mbed_lwip_bringup_2(bool dhcp, bool ppp, const char *ip, const cha
 | 
			
		|||
 | 
			
		||||
    // If doesn't have address
 | 
			
		||||
    if (!mbed_lwip_get_ip_addr(true, &lwip_netif)) {
 | 
			
		||||
        if (sys_arch_sem_wait(&lwip_netif_has_addr, 15000) == SYS_ARCH_TIMEOUT) {
 | 
			
		||||
        if (sys_arch_sem_wait(&lwip_netif_has_addr, DHCP_TIMEOUT * 1000) == SYS_ARCH_TIMEOUT) {
 | 
			
		||||
            if (ppp) {
 | 
			
		||||
                ppp_lwip_disconnect();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return NSAPI_ERROR_DHCP_FAILURE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,6 +52,8 @@
 | 
			
		|||
#define ADDR_TIMEOUT                0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define DHCP_TIMEOUT                60
 | 
			
		||||
 | 
			
		||||
#define PREF_IPV4                   1
 | 
			
		||||
#define PREF_IPV6                   2
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,6 +43,11 @@
 | 
			
		|||
#define TEST_ENV_TESTCASE_FINISH    GREENTEA_TEST_ENV_TESTCASE_FINISH
 | 
			
		||||
#define TEST_ENV_TESTCASE_SUMMARY   GREENTEA_TEST_ENV_TESTCASE_SUMMARY
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Default length for UUID buffers (used during the sync process)
 | 
			
		||||
 */
 | 
			
		||||
#define GREENTEA_UUID_LENGTH        48
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Generic test suite transport protocol keys
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -77,6 +82,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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,25 +60,25 @@ 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
 | 
			
		||||
/** \brief Handle the handshake with the host
 | 
			
		||||
 *  \details This is contains the shared handhshake functionality that is used between
 | 
			
		||||
 *           GREENTEA_SETUP and GREENTEA_SETUP_UUID.
 | 
			
		||||
 *           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);
 | 
			
		||||
            // Found correct __sync message
 | 
			
		||||
            greentea_send_kv(_key, buffer);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -88,6 +88,29 @@ 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 host 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[GREENTEA_UUID_LENGTH] = {0};
 | 
			
		||||
    _GREENTEA_SETUP_COMMON(timeout, host_test_name, _value, GREENTEA_UUID_LENGTH);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** \brief Handshake with host and send setup data (timeout and host test name). Allows you to preserve sync UUID.
 | 
			
		||||
 *  \details This function will send preamble to master.
 | 
			
		||||
 *           After host test name is received master will invoke host test script
 | 
			
		||||
 *           and add host test's callback handlers to main event loop
 | 
			
		||||
 *           This function is blocking.
 | 
			
		||||
 *           This function differs from GREENTEA_SETUP because it allows you to
 | 
			
		||||
 *           preserve the UUID sent during the sync process.
 | 
			
		||||
 */
 | 
			
		||||
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 +217,7 @@ inline void greentea_write_preamble()
 | 
			
		|||
    greentea_serial->putc('{');
 | 
			
		||||
    greentea_serial->putc('{');
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief Write the postamble characters to the serial port
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -202,7 +225,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 +261,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 +325,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 +390,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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue