lwIP Robustness Test.

Dependencies:   EthernetInterface mbed-rtos mbed

Committer:
tass
Date:
Wed Jul 24 05:53:52 2013 +0000
Revision:
0:cdcf1e7c5b86
lwIP Robustness Test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tass 0:cdcf1e7c5b86 1 #include "mbed.h"
tass 0:cdcf1e7c5b86 2 #include "EthernetInterface.h"
tass 0:cdcf1e7c5b86 3
tass 0:cdcf1e7c5b86 4 #define msgdbg(...)
tass 0:cdcf1e7c5b86 5
tass 0:cdcf1e7c5b86 6 //#define msgdbg printf
tass 0:cdcf1e7c5b86 7
tass 0:cdcf1e7c5b86 8
tass 0:cdcf1e7c5b86 9 #define SENDING_RETRIES 5u
tass 0:cdcf1e7c5b86 10 #define READING_RETRIES 5u
tass 0:cdcf1e7c5b86 11 #define DHCP_RETRIES 10u
tass 0:cdcf1e7c5b86 12 #define BUFFER_SIZE 256
tass 0:cdcf1e7c5b86 13
tass 0:cdcf1e7c5b86 14 #define NUMBER_OF_HOSTS 3u
tass 0:cdcf1e7c5b86 15
tass 0:cdcf1e7c5b86 16 #define MBED_HOST "www.mbed.org"
tass 0:cdcf1e7c5b86 17 #define MBED_HOST_REQUEST "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\n\n"
tass 0:cdcf1e7c5b86 18
tass 0:cdcf1e7c5b86 19 #define MEDIAFAX_HOST "www.mediafax.ro"
tass 0:cdcf1e7c5b86 20 #define MEDIAFAX_HOST_REQUEST "GET / HTTP/1.1\nHost: www.mediafax.ro\n\n"
tass 0:cdcf1e7c5b86 21
tass 0:cdcf1e7c5b86 22 #define NXP_HOST "www.nxp.com"
tass 0:cdcf1e7c5b86 23 #define NXP_HOST_REQUEST "GET /documents/user_manual/UM10360.pdf HTTP/1.0\nHost: www.nxp.com\n\n"
tass 0:cdcf1e7c5b86 24
tass 0:cdcf1e7c5b86 25 int totalTime = 0;
tass 0:cdcf1e7c5b86 26 extern uint32_t os_time;
tass 0:cdcf1e7c5b86 27
tass 0:cdcf1e7c5b86 28 struct WebStats
tass 0:cdcf1e7c5b86 29 {
tass 0:cdcf1e7c5b86 30 char request[70];
tass 0:cdcf1e7c5b86 31 char host[20];
tass 0:cdcf1e7c5b86 32 int avgDuration;
tass 0:cdcf1e7c5b86 33 int maxReceived;
tass 0:cdcf1e7c5b86 34 int minReceived;
tass 0:cdcf1e7c5b86 35 int snapshots;
tass 0:cdcf1e7c5b86 36 };
tass 0:cdcf1e7c5b86 37
tass 0:cdcf1e7c5b86 38 struct WebStats webStatistics[NUMBER_OF_HOSTS]=
tass 0:cdcf1e7c5b86 39 {
tass 0:cdcf1e7c5b86 40 {MBED_HOST_REQUEST,MBED_HOST,0,0,0x7FFFFFFF,0},
tass 0:cdcf1e7c5b86 41 {MEDIAFAX_HOST_REQUEST,MEDIAFAX_HOST,0,0,0x7FFFFFFF,0},
tass 0:cdcf1e7c5b86 42 {NXP_HOST_REQUEST,NXP_HOST,0,0,0x7FFFFFFF,0}
tass 0:cdcf1e7c5b86 43 };
tass 0:cdcf1e7c5b86 44
tass 0:cdcf1e7c5b86 45 void printStatistics(void)
tass 0:cdcf1e7c5b86 46 {
tass 0:cdcf1e7c5b86 47 printf("\nTotal Time : %f seconds\n",(float)totalTime/1000.0f);
tass 0:cdcf1e7c5b86 48 for(int i=0;i<NUMBER_OF_HOSTS;i++)
tass 0:cdcf1e7c5b86 49 {
tass 0:cdcf1e7c5b86 50 printf("Host number : %d | %s\n",i, webStatistics[i].host);
tass 0:cdcf1e7c5b86 51 printf("MaxRecv : %d\n",webStatistics[i].maxReceived);
tass 0:cdcf1e7c5b86 52 printf("MinRecv : %d\n",webStatistics[i].minReceived);
tass 0:cdcf1e7c5b86 53 printf("Avg duration : %d ms\n",webStatistics[i].avgDuration);
tass 0:cdcf1e7c5b86 54 printf("Total snapshots : %d\n\n",webStatistics[i].snapshots);
tass 0:cdcf1e7c5b86 55 }
tass 0:cdcf1e7c5b86 56
tass 0:cdcf1e7c5b86 57 }
tass 0:cdcf1e7c5b86 58
tass 0:cdcf1e7c5b86 59 int main() {
tass 0:cdcf1e7c5b86 60
tass 0:cdcf1e7c5b86 61 int retries = 0;
tass 0:cdcf1e7c5b86 62 EthernetInterface eth;
tass 0:cdcf1e7c5b86 63 TCPSocketConnection client;
tass 0:cdcf1e7c5b86 64
tass 0:cdcf1e7c5b86 65 printf("Initialising...\n");
tass 0:cdcf1e7c5b86 66
tass 0:cdcf1e7c5b86 67 // use DHCP
tass 0:cdcf1e7c5b86 68 eth.init();
tass 0:cdcf1e7c5b86 69
tass 0:cdcf1e7c5b86 70 // attempt DHCP and if timing out then try again
tass 0:cdcf1e7c5b86 71 while (eth.connect()) {
tass 0:cdcf1e7c5b86 72 retries++;
tass 0:cdcf1e7c5b86 73 printf("[%d] DHCP timeout %d\n",os_time,retries);
tass 0:cdcf1e7c5b86 74 if(retries >= DHCP_RETRIES)
tass 0:cdcf1e7c5b86 75 {
tass 0:cdcf1e7c5b86 76 printf("DHCP failed. Bailing out..\n");
tass 0:cdcf1e7c5b86 77 goto failure;
tass 0:cdcf1e7c5b86 78 }
tass 0:cdcf1e7c5b86 79 };
tass 0:cdcf1e7c5b86 80
tass 0:cdcf1e7c5b86 81 printf("[%d] Starting the robustness test...\n",os_time);
tass 0:cdcf1e7c5b86 82
tass 0:cdcf1e7c5b86 83 while(1)
tass 0:cdcf1e7c5b86 84 {
tass 0:cdcf1e7c5b86 85 for(int i=0;i<NUMBER_OF_HOSTS;i++,client.close())
tass 0:cdcf1e7c5b86 86 {
tass 0:cdcf1e7c5b86 87 int retries = 0;
tass 0:cdcf1e7c5b86 88 int received = 0;
tass 0:cdcf1e7c5b86 89 int time = 0;
tass 0:cdcf1e7c5b86 90 char tmpBuffer[BUFFER_SIZE];
tass 0:cdcf1e7c5b86 91 int ret;
tass 0:cdcf1e7c5b86 92
tass 0:cdcf1e7c5b86 93 printf("Mbed --> %s\n",webStatistics[i].host);
tass 0:cdcf1e7c5b86 94
tass 0:cdcf1e7c5b86 95 time = os_time;
tass 0:cdcf1e7c5b86 96 // connecting
tass 0:cdcf1e7c5b86 97 if (client.connect(webStatistics[i].host, 80)) {
tass 0:cdcf1e7c5b86 98 printf("Failed to connect to : %s\n",webStatistics[i].host);
tass 0:cdcf1e7c5b86 99 continue;
tass 0:cdcf1e7c5b86 100 }
tass 0:cdcf1e7c5b86 101
tass 0:cdcf1e7c5b86 102 retries = 0;
tass 0:cdcf1e7c5b86 103
tass 0:cdcf1e7c5b86 104 // sending request
tass 0:cdcf1e7c5b86 105 while(1)
tass 0:cdcf1e7c5b86 106 {
tass 0:cdcf1e7c5b86 107 if( (ret = client.send_all(webStatistics[i].request,strlen(webStatistics[i].request))) <= 0)
tass 0:cdcf1e7c5b86 108 {
tass 0:cdcf1e7c5b86 109 printf("Retry sending no %d, return :%d\n",retries,ret);
tass 0:cdcf1e7c5b86 110 retries++;
tass 0:cdcf1e7c5b86 111 }
tass 0:cdcf1e7c5b86 112 else break;
tass 0:cdcf1e7c5b86 113
tass 0:cdcf1e7c5b86 114 if(retries == SENDING_RETRIES+1)
tass 0:cdcf1e7c5b86 115 {
tass 0:cdcf1e7c5b86 116 printf("Failed sending. Bailing out this connection\n");
tass 0:cdcf1e7c5b86 117 continue;
tass 0:cdcf1e7c5b86 118 }
tass 0:cdcf1e7c5b86 119 }
tass 0:cdcf1e7c5b86 120 retries = 0;
tass 0:cdcf1e7c5b86 121
tass 0:cdcf1e7c5b86 122 // start reading
tass 0:cdcf1e7c5b86 123 while(true)
tass 0:cdcf1e7c5b86 124 {
tass 0:cdcf1e7c5b86 125 if( (ret = client.receive(tmpBuffer,sizeof(tmpBuffer))) <= 0)
tass 0:cdcf1e7c5b86 126 retries++;
tass 0:cdcf1e7c5b86 127 else
tass 0:cdcf1e7c5b86 128 received += ret;
tass 0:cdcf1e7c5b86 129
tass 0:cdcf1e7c5b86 130 if(retries == READING_RETRIES)
tass 0:cdcf1e7c5b86 131 break;
tass 0:cdcf1e7c5b86 132 }
tass 0:cdcf1e7c5b86 133
tass 0:cdcf1e7c5b86 134 //Snapshot!
tass 0:cdcf1e7c5b86 135 time = os_time - time;
tass 0:cdcf1e7c5b86 136
tass 0:cdcf1e7c5b86 137 if(webStatistics[i].maxReceived < received)
tass 0:cdcf1e7c5b86 138 {
tass 0:cdcf1e7c5b86 139 webStatistics[i].maxReceived = received;
tass 0:cdcf1e7c5b86 140 }
tass 0:cdcf1e7c5b86 141
tass 0:cdcf1e7c5b86 142 if(webStatistics[i].minReceived > received)
tass 0:cdcf1e7c5b86 143 {
tass 0:cdcf1e7c5b86 144 webStatistics[i].minReceived = received;
tass 0:cdcf1e7c5b86 145 }
tass 0:cdcf1e7c5b86 146 printf("Received : %d bytes\n",received);
tass 0:cdcf1e7c5b86 147 webStatistics[i].avgDuration = ((webStatistics[i].avgDuration *(webStatistics[i].snapshots++) ) + time)/webStatistics[i].snapshots;
tass 0:cdcf1e7c5b86 148 totalTime += time;
tass 0:cdcf1e7c5b86 149 }
tass 0:cdcf1e7c5b86 150
tass 0:cdcf1e7c5b86 151 printStatistics();
tass 0:cdcf1e7c5b86 152 Thread::wait(500);
tass 0:cdcf1e7c5b86 153 }
tass 0:cdcf1e7c5b86 154 failure:
tass 0:cdcf1e7c5b86 155 printf("Fatal error. Main thread is inactive\n");
tass 0:cdcf1e7c5b86 156 while(1);
tass 0:cdcf1e7c5b86 157 }