wifi test

Dependencies:   X_NUCLEO_IKS01A2 mbed-http

Committer:
JMF
Date:
Wed Sep 05 14:28:24 2018 +0000
Revision:
0:24d3eb812fd4
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JMF 0:24d3eb812fd4 1 #include "mbed.h"
JMF 0:24d3eb812fd4 2 #include "WizFi310Interface.h"
JMF 0:24d3eb812fd4 3 #include "UDPSocket.h"
JMF 0:24d3eb812fd4 4 #include "greentea-client/test_env.h"
JMF 0:24d3eb812fd4 5 #include "unity/unity.h"
JMF 0:24d3eb812fd4 6 #include "utest.h"
JMF 0:24d3eb812fd4 7
JMF 0:24d3eb812fd4 8 using namespace utest::v1;
JMF 0:24d3eb812fd4 9
JMF 0:24d3eb812fd4 10
JMF 0:24d3eb812fd4 11 #ifndef MBED_CFG_UDP_DTLS_HANDSHAKE_BUFFER_SIZE
JMF 0:24d3eb812fd4 12 #define MBED_CFG_UDP_DTLS_HANDSHAKE_BUFFER_SIZE 512
JMF 0:24d3eb812fd4 13 #endif
JMF 0:24d3eb812fd4 14
JMF 0:24d3eb812fd4 15 #ifndef MBED_CFG_UDP_DTLS_HANDSHAKE_RETRIES
JMF 0:24d3eb812fd4 16 #define MBED_CFG_UDP_DTLS_HANDSHAKE_RETRIES 16
JMF 0:24d3eb812fd4 17 #endif
JMF 0:24d3eb812fd4 18
JMF 0:24d3eb812fd4 19 #ifndef MBED_CFG_UDP_DTLS_HANDSHAKE_PATTERN
JMF 0:24d3eb812fd4 20 #define MBED_CFG_UDP_DTLS_HANDSHAKE_PATTERN 112, 384, 200, 219, 25
JMF 0:24d3eb812fd4 21 #endif
JMF 0:24d3eb812fd4 22
JMF 0:24d3eb812fd4 23 #ifndef MBED_CFG_UDP_DTLS_HANDSHAKE_TIMEOUT
JMF 0:24d3eb812fd4 24 #define MBED_CFG_UDP_DTLS_HANDSHAKE_TIMEOUT 1500
JMF 0:24d3eb812fd4 25 #endif
JMF 0:24d3eb812fd4 26
JMF 0:24d3eb812fd4 27 #ifndef MBED_CFG_WIZFI310_TX
JMF 0:24d3eb812fd4 28 #define MBED_CFG_WIZFI310_TX D1
JMF 0:24d3eb812fd4 29 #endif
JMF 0:24d3eb812fd4 30
JMF 0:24d3eb812fd4 31 #ifndef MBED_CFG_WIZFI310_RX
JMF 0:24d3eb812fd4 32 #define MBED_CFG_WIZFI310_RX D0
JMF 0:24d3eb812fd4 33 #endif
JMF 0:24d3eb812fd4 34
JMF 0:24d3eb812fd4 35 #ifndef MBED_CFG_WIZFI310_DEBUG
JMF 0:24d3eb812fd4 36 #define MBED_CFG_WIZFI310_DEBUG false
JMF 0:24d3eb812fd4 37 #endif
JMF 0:24d3eb812fd4 38
JMF 0:24d3eb812fd4 39 #define STRINGIZE(x) STRINGIZE2(x)
JMF 0:24d3eb812fd4 40 #define STRINGIZE2(x) #x
JMF 0:24d3eb812fd4 41
JMF 0:24d3eb812fd4 42 uint8_t buffer[MBED_CFG_UDP_DTLS_HANDSHAKE_BUFFER_SIZE] = {0};
JMF 0:24d3eb812fd4 43 int udp_dtls_handshake_pattern[] = {MBED_CFG_UDP_DTLS_HANDSHAKE_PATTERN};
JMF 0:24d3eb812fd4 44 const int udp_dtls_handshake_count = sizeof(udp_dtls_handshake_pattern) / sizeof(int);
JMF 0:24d3eb812fd4 45
JMF 0:24d3eb812fd4 46 void test_udp_dtls_handshake() {
JMF 0:24d3eb812fd4 47 WizFi310Interface net(MBED_CFG_WIZFI310_TX, MBED_CFG_WIZFI310_RX, MBED_CFG_WIZFI310_DEBUG);
JMF 0:24d3eb812fd4 48 int err = net.connect(STRINGIZE(MBED_CFG_WIZFI310_SSID), STRINGIZE(MBED_CFG_WIZFI310_PASS));
JMF 0:24d3eb812fd4 49 TEST_ASSERT_EQUAL(0, err);
JMF 0:24d3eb812fd4 50
JMF 0:24d3eb812fd4 51 printf("MBED: UDPClient IP address is '%s'\n", net.get_ip_address());
JMF 0:24d3eb812fd4 52 printf("MBED: UDPClient waiting for server IP and port...\n");
JMF 0:24d3eb812fd4 53
JMF 0:24d3eb812fd4 54 greentea_send_kv("target_ip", net.get_ip_address());
JMF 0:24d3eb812fd4 55
JMF 0:24d3eb812fd4 56 bool result = false;
JMF 0:24d3eb812fd4 57
JMF 0:24d3eb812fd4 58 char recv_key[] = "host_port";
JMF 0:24d3eb812fd4 59 char ipbuf[60] = {0};
JMF 0:24d3eb812fd4 60 char portbuf[16] = {0};
JMF 0:24d3eb812fd4 61 unsigned int port = 0;
JMF 0:24d3eb812fd4 62
JMF 0:24d3eb812fd4 63 greentea_send_kv("host_ip", " ");
JMF 0:24d3eb812fd4 64 greentea_parse_kv(recv_key, ipbuf, sizeof(recv_key), sizeof(ipbuf));
JMF 0:24d3eb812fd4 65
JMF 0:24d3eb812fd4 66 greentea_send_kv("host_port", " ");
JMF 0:24d3eb812fd4 67 greentea_parse_kv(recv_key, portbuf, sizeof(recv_key), sizeof(ipbuf));
JMF 0:24d3eb812fd4 68 sscanf(portbuf, "%u", &port);
JMF 0:24d3eb812fd4 69
JMF 0:24d3eb812fd4 70 printf("MBED: UDP Server IP address received: %s:%d \n", ipbuf, port);
JMF 0:24d3eb812fd4 71
JMF 0:24d3eb812fd4 72 // align each size to 4-bits
JMF 0:24d3eb812fd4 73 for (int i = 0; i < udp_dtls_handshake_count; i++) {
JMF 0:24d3eb812fd4 74 udp_dtls_handshake_pattern[i] = (~0xf & udp_dtls_handshake_pattern[i]) + 0x10;
JMF 0:24d3eb812fd4 75 }
JMF 0:24d3eb812fd4 76
JMF 0:24d3eb812fd4 77 printf("MBED: DTLS pattern [");
JMF 0:24d3eb812fd4 78 for (int i = 0; i < udp_dtls_handshake_count; i++) {
JMF 0:24d3eb812fd4 79 printf("%d", udp_dtls_handshake_pattern[i]);
JMF 0:24d3eb812fd4 80 if (i != udp_dtls_handshake_count-1) {
JMF 0:24d3eb812fd4 81 printf(", ");
JMF 0:24d3eb812fd4 82 }
JMF 0:24d3eb812fd4 83 }
JMF 0:24d3eb812fd4 84 printf("]\r\n");
JMF 0:24d3eb812fd4 85
JMF 0:24d3eb812fd4 86 UDPSocket sock;
JMF 0:24d3eb812fd4 87 SocketAddress udp_addr(ipbuf, port);
JMF 0:24d3eb812fd4 88 sock.set_timeout(MBED_CFG_UDP_DTLS_HANDSHAKE_TIMEOUT);
JMF 0:24d3eb812fd4 89
JMF 0:24d3eb812fd4 90 for (int attempt = 0; attempt < MBED_CFG_UDP_DTLS_HANDSHAKE_RETRIES; attempt++) {
JMF 0:24d3eb812fd4 91 err = sock.open(&net);
JMF 0:24d3eb812fd4 92 TEST_ASSERT_EQUAL(0, err);
JMF 0:24d3eb812fd4 93
JMF 0:24d3eb812fd4 94 for (int i = 0; i < udp_dtls_handshake_count; i++) {
JMF 0:24d3eb812fd4 95 buffer[i] = udp_dtls_handshake_pattern[i] >> 4;
JMF 0:24d3eb812fd4 96 }
JMF 0:24d3eb812fd4 97
JMF 0:24d3eb812fd4 98 err = sock.sendto(udp_addr, buffer, udp_dtls_handshake_count);
JMF 0:24d3eb812fd4 99 printf("UDP: tx -> %d\r\n", err);
JMF 0:24d3eb812fd4 100 TEST_ASSERT_EQUAL(udp_dtls_handshake_count, err);
JMF 0:24d3eb812fd4 101
JMF 0:24d3eb812fd4 102 int step = 0;
JMF 0:24d3eb812fd4 103 while (step < udp_dtls_handshake_count) {
JMF 0:24d3eb812fd4 104 err = sock.recvfrom(NULL, buffer, sizeof(buffer));
JMF 0:24d3eb812fd4 105 printf("UDP: rx <- %d ", err);
JMF 0:24d3eb812fd4 106
JMF 0:24d3eb812fd4 107 // check length
JMF 0:24d3eb812fd4 108 if (err != udp_dtls_handshake_pattern[step]) {
JMF 0:24d3eb812fd4 109 printf("x (expected %d)\r\n", udp_dtls_handshake_pattern[step]);
JMF 0:24d3eb812fd4 110 break;
JMF 0:24d3eb812fd4 111 }
JMF 0:24d3eb812fd4 112
JMF 0:24d3eb812fd4 113 // check quick xor of packet
JMF 0:24d3eb812fd4 114 uint8_t check = 0;
JMF 0:24d3eb812fd4 115 for (int j = 0; j < udp_dtls_handshake_pattern[step]; j++) {
JMF 0:24d3eb812fd4 116 check ^= buffer[j];
JMF 0:24d3eb812fd4 117 }
JMF 0:24d3eb812fd4 118
JMF 0:24d3eb812fd4 119 if (check != 0) {
JMF 0:24d3eb812fd4 120 printf("x (checksum 0x%02x)\r\n", check);
JMF 0:24d3eb812fd4 121 break;
JMF 0:24d3eb812fd4 122 }
JMF 0:24d3eb812fd4 123
JMF 0:24d3eb812fd4 124 // successfully got a packet
JMF 0:24d3eb812fd4 125 printf("\r\n");
JMF 0:24d3eb812fd4 126 step += 1;
JMF 0:24d3eb812fd4 127 }
JMF 0:24d3eb812fd4 128
JMF 0:24d3eb812fd4 129 err = sock.close();
JMF 0:24d3eb812fd4 130 TEST_ASSERT_EQUAL(0, err);
JMF 0:24d3eb812fd4 131
JMF 0:24d3eb812fd4 132 // got through all steps, test passed
JMF 0:24d3eb812fd4 133 if (step == udp_dtls_handshake_count) {
JMF 0:24d3eb812fd4 134 result = true;
JMF 0:24d3eb812fd4 135 break;
JMF 0:24d3eb812fd4 136 }
JMF 0:24d3eb812fd4 137 }
JMF 0:24d3eb812fd4 138
JMF 0:24d3eb812fd4 139 net.disconnect();
JMF 0:24d3eb812fd4 140 TEST_ASSERT_EQUAL(true, result);
JMF 0:24d3eb812fd4 141 }
JMF 0:24d3eb812fd4 142
JMF 0:24d3eb812fd4 143
JMF 0:24d3eb812fd4 144 // Test setup
JMF 0:24d3eb812fd4 145 utest::v1::status_t test_setup(const size_t number_of_cases) {
JMF 0:24d3eb812fd4 146 GREENTEA_SETUP(120, "udp_shotgun");
JMF 0:24d3eb812fd4 147 return verbose_test_setup_handler(number_of_cases);
JMF 0:24d3eb812fd4 148 }
JMF 0:24d3eb812fd4 149
JMF 0:24d3eb812fd4 150 Case cases[] = {
JMF 0:24d3eb812fd4 151 Case("UDP DTLS handshake", test_udp_dtls_handshake),
JMF 0:24d3eb812fd4 152 };
JMF 0:24d3eb812fd4 153
JMF 0:24d3eb812fd4 154 Specification specification(test_setup, cases);
JMF 0:24d3eb812fd4 155
JMF 0:24d3eb812fd4 156 int main() {
JMF 0:24d3eb812fd4 157 return !Harness::run(specification);
JMF 0:24d3eb812fd4 158 }
JMF 0:24d3eb812fd4 159