1 //******************************************************************
3 // copyright 2014 intel corporation all rights reserved.
4 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
11 //Mac address of my ethernet shield
12 static uint8_t ETHERNET_MAC[] = {0x90, 0xA2, 0xDA, 0x0F, 0x24, 0xCC };
13 //IP address of the peer whom I wish to send some data
14 static uint8_t PEER_IP_ADDR[] = {192, 168, 1, 125};
15 static uint8_t MULTICAST_IP_ADDR[] = {224, 0, 1, 187};
17 //Set below to 0 to disable multicast testing
18 //#define MCAST_TESTING_EN 1
20 #define TEST_NUM_PKTS (20)
21 #define TEST_PORT_NUM (8888)
22 #define MAX_BUF_SIZE (256)
24 unsigned char TEST_BUF[] = {
25 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
26 0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
27 0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
28 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
29 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
30 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
31 0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
32 0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
33 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
34 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
35 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
36 0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
37 0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
38 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
39 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
40 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
41 0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
42 0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
43 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
44 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
45 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
46 0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
47 0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
48 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
49 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
51 0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
52 0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
53 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
54 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
55 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
56 0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
57 0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
58 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
59 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
60 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
61 0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
62 0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
63 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
64 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
66 unsigned int TEST_BUF_LEN = sizeof(TEST_BUF);
68 #define PCF(str) ((const prog_char*)(F(str)))
70 #define MOD_NAME PCF("ocsocket_test")
72 #define VERIFY_SUCCESS(op, res) { if (op == res) {OC_LOG(DEBUG, MOD_NAME, PCF(#op " SUCCEEDED"));} \
73 else {OC_LOG(FATAL, MOD_NAME, PCF(#op "!!!! FAILED FAILED FAILED !!!!"));} }
76 //OCGetInterfaceAddress tests
78 char strAddr[16] = "";
79 VERIFY_SUCCESS(OCGetInterfaceAddress(NULL, 0, AF_INET, (uint8_t*)strAddr, 16), ERR_SUCCESS);
80 OC_LOG(DEBUG, MOD_NAME, PCF("My IP address :"));
81 OC_LOG_BUFFER(INFO, MOD_NAME, (uint8_t*)strAddr, sizeof(strAddr));
83 VERIFY_SUCCESS(OCGetInterfaceAddress(NULL, 0, AF_INET, NULL, 16), ERR_INVALID_INPUT);
84 VERIFY_SUCCESS(OCGetInterfaceAddress(NULL, 0, AF_INET, (uint8_t*)strAddr, 10), ERR_INVALID_INPUT);
85 OC_LOG(DEBUG, MOD_NAME, PCF("test10 - Completed"));
88 //OCBuildIPv4Address tests
91 VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
92 VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM, NULL), ERR_INVALID_INPUT);
93 OC_LOG(DEBUG, MOD_NAME, PCF("test20 - Completed"));
102 VERIFY_SUCCESS(OCBuildIPv4Address( 1, 2, 3, 4, TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
103 VERIFY_SUCCESS(OCDevAddrToIPv4Addr( &ipAddr, &a, &b, &c, &d), ERR_SUCCESS);
104 if ((a != 1) || (b != 2) || (c !=3) || (d !=4)) {
105 OC_LOG(DEBUG, MOD_NAME, PCF("test30 - Failed !!!"));
109 VERIFY_SUCCESS(OCDevAddrToPort( &ipAddr, &port), ERR_SUCCESS);
110 if (port != TEST_PORT_NUM) {
111 OC_LOG(DEBUG, MOD_NAME, PCF("test30 - Failed !!!"));
114 VERIFY_SUCCESS(OCDevAddrToIPv4Addr( NULL, &a, &b, &c, &d), ERR_INVALID_INPUT);
115 VERIFY_SUCCESS(OCDevAddrToPort( &ipAddr, NULL), ERR_INVALID_INPUT);
116 OC_LOG(DEBUG, MOD_NAME, PCF("test30 - Completed"));
122 int32_t sfd1, sfd2, sfd3, sfd4, sfd5;
124 //We should be able to successfully open 4 sockets.
125 VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
126 VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd1), ERR_SUCCESS);
128 VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM + 1, &ipAddr), ERR_SUCCESS);
129 VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd2), ERR_SUCCESS);
131 VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM + 2, &ipAddr), ERR_SUCCESS);
132 VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd3), ERR_SUCCESS);
134 VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM + 3, &ipAddr), ERR_SUCCESS);
135 VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd4), ERR_SUCCESS);
137 //5th socket creation call should FAIL
138 VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM + 4, &ipAddr), ERR_SUCCESS);
139 VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd5), ERR_UNKNOWN);
141 VERIFY_SUCCESS(OCClose( sfd4), ERR_SUCCESS);
142 VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd5), ERR_SUCCESS);
144 VERIFY_SUCCESS(OCClose( sfd1), ERR_SUCCESS);
145 VERIFY_SUCCESS(OCClose( sfd2), ERR_SUCCESS);
146 VERIFY_SUCCESS(OCClose( sfd3), ERR_SUCCESS);
147 VERIFY_SUCCESS(OCClose( sfd5), ERR_SUCCESS);
148 OC_LOG(DEBUG, MOD_NAME, PCF("test40 - Completed"));
152 //OCInitUDPMulticast tests
157 VERIFY_SUCCESS(OCBuildIPv4Address( MULTICAST_IP_ADDR[0], MULTICAST_IP_ADDR[1],
158 MULTICAST_IP_ADDR[2], MULTICAST_IP_ADDR[3], TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
159 VERIFY_SUCCESS(OCInitUDPMulticast( &ipAddr, &sfd1), ERR_SUCCESS);
161 VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM + 1, &ipAddr), ERR_SUCCESS);
162 VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd2), ERR_SUCCESS);
164 VERIFY_SUCCESS(OCClose( sfd1), ERR_SUCCESS);
165 VERIFY_SUCCESS(OCClose( sfd2), ERR_SUCCESS);
166 OC_LOG(DEBUG, MOD_NAME, PCF("test50 - Completed"));
170 //OCSendTo -- Unicast tests
172 OCDevAddr ipAddr, peerAddr;
175 VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
176 VERIFY_SUCCESS(OCBuildIPv4Address(PEER_IP_ADDR[0], PEER_IP_ADDR[0],
177 PEER_IP_ADDR[0], PEER_IP_ADDR[0], TEST_PORT_NUM, &peerAddr), ERR_SUCCESS);
179 VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd), ERR_SUCCESS);
180 for (int i = 2; i < 300; ) {
181 VERIFY_SUCCESS(OCSendTo(sfd, TEST_BUF, i, 0, &peerAddr), i);
186 VERIFY_SUCCESS(OCClose( sfd), ERR_SUCCESS);
187 OC_LOG(DEBUG, MOD_NAME, PCF("test60 - Completed"));
191 //OCSendTo -- Multicast tests
193 OCDevAddr ipAddrMcast;
196 VERIFY_SUCCESS(OCBuildIPv4Address( MULTICAST_IP_ADDR[0], MULTICAST_IP_ADDR[1],
197 MULTICAST_IP_ADDR[2], MULTICAST_IP_ADDR[3], TEST_PORT_NUM, &ipAddrMcast), ERR_SUCCESS);
198 VERIFY_SUCCESS(OCInitUDPMulticast( &ipAddrMcast, &sfd), ERR_SUCCESS);
199 for (int i = 2; i < 300; ) {
200 VERIFY_SUCCESS(OCSendTo(sfd, TEST_BUF, i, 0, &ipAddrMcast), i);
205 VERIFY_SUCCESS(OCClose( sfd), ERR_SUCCESS);
206 OC_LOG(DEBUG, MOD_NAME, PCF("test70 - Completed"));
211 //End to End - Unicast Send/Recv test
212 //Start sample app 'sendrecv' on different Linux box.
214 OCDevAddr ipAddr, peerAddr;
217 uint8_t buf[MAX_BUF_SIZE];
221 VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
222 VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd), ERR_SUCCESS);
225 recvLen = OCRecvFrom(sfd, buf, MAX_BUF_SIZE, 0, &peerAddr);
228 OC_LOG(DEBUG, MOD_NAME, PCF("Rcvd data from :"));
229 OC_LOG_BUFFER(INFO, MOD_NAME, peerAddr.addr, peerAddr.size);
230 OC_LOG(DEBUG, MOD_NAME, PCF("Data Length :"));
231 OC_LOG_BUFFER(INFO, MOD_NAME, (uint8_t*)&recvLen, sizeof(recvLen));
233 VERIFY_SUCCESS(OCSendTo(sfd, buf, recvLen, 0, &peerAddr), recvLen);
235 OC_LOG(DEBUG, MOD_NAME, PCF("No data received"));
237 delay(500); //delay secs
238 } while (pktrecv < TEST_NUM_PKTS);
240 VERIFY_SUCCESS(OCClose(sfd), ERR_SUCCESS);
241 OC_LOG(DEBUG, MOD_NAME, PCF("test80 - Completed"));
245 //End to End - Multicast Send/Recv test
246 //Start sample app 'sendrecv' on different Linux box.
248 OCDevAddr ipAddrMcast, peerAddr;
251 uint8_t buf[MAX_BUF_SIZE];
255 VERIFY_SUCCESS(OCBuildIPv4Address( MULTICAST_IP_ADDR[0], MULTICAST_IP_ADDR[1],
256 MULTICAST_IP_ADDR[2], MULTICAST_IP_ADDR[3], TEST_PORT_NUM, &ipAddrMcast), ERR_SUCCESS);
257 VERIFY_SUCCESS(OCInitUDPMulticast( &ipAddrMcast, &sfd), ERR_SUCCESS);
261 recvLen = OCRecvFrom(sfd, buf, MAX_BUF_SIZE, 0, &peerAddr);
264 OC_LOG(DEBUG, MOD_NAME, PCF("Rcvd data from :"));
265 OC_LOG_BUFFER(INFO, MOD_NAME, peerAddr.addr, peerAddr.size);
266 OC_LOG(DEBUG, MOD_NAME, PCF("Data Length :"));
267 OC_LOG_BUFFER(INFO, MOD_NAME, (uint8_t*)&recvLen, sizeof(recvLen));
269 VERIFY_SUCCESS(OCSendTo(sfd, buf, recvLen, 0, &ipAddrMcast), recvLen);
271 OC_LOG(DEBUG, MOD_NAME, PCF("No data received"));
273 delay(500); //delay secs
274 } while (pktrecv < TEST_NUM_PKTS);
276 VERIFY_SUCCESS(OCClose(sfd), ERR_SUCCESS);
277 OC_LOG(DEBUG, MOD_NAME, PCF("test90 - Completed"));
282 //End to End - 'Simultaneous' Unicast-Multicast Send/Recv test
283 //This tests if Arduino Wiznet shield can open 2 independent sockets listening on same port:
284 // one for unicast traffic and another for multicast traffic.
285 //Start sample app 'sendrecv' on different Linux box.
298 Serial.begin(115200);
300 Serial.println("Trying to get an IP address using DHCP");
301 if (Ethernet.begin(ETHERNET_MAC) == 0) {
302 Serial.println("Failed to configure Ethernet using DHCP");
312 test60(); //SendTo --Unicast
313 test70(); //SendTo --Multicast
314 test80(); //End-to-End --Unicast
316 test90(); //End-to-End --Multicast
319 OC_LOG(DEBUG, MOD_NAME, PCF("All tests Completed"));