A PicoTCP demo app testing the ethernet throughput on the lpc1768 mbed board.

Dependencies:   PicoTCP lpc1768-picotcp-eth mbed-rtos mbed picotcp-demo-printf

This is a demo application, using the PicoTCP socket API, to show the performance of a TCP sender towards an endpoint connected via Ethernet.

This application runs on the NXP LPC1768 mbed board.

This demo should give you following output on the mbed lpc1768's serial port:

>>> Welcome 2 PicoTCP <<<
ip=192.168.100.1 - will connect to 192.168.100.2:4404 in 5 seconds...
PicoTCP Benchmark starting...
Opening socket...
tb> Connection established with server.
tb> TCPSIZ written
tb> Called shutdown()
tb> Transmitted 10485760 bytes in 6704 milliseconds
tb> average write throughput 12512 kbit/sec
tb> Socket closed. Exit normally. 

On the receiving side (e.g. linux computer) you could receive the packets sent by PicoTCP with netcat - e.g.:

ifconfig eth0 192.168.100.2
nc -l -p 4404 > /dev/null
Committer:
tass
Date:
Fri May 17 12:51:54 2013 +0000
Revision:
0:b3aca3c27ab6
Initial commit of PicoTCP demo app testing the ethernet throughput on the lpc1768 mbed board.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tass 0:b3aca3c27ab6 1 /******************************************************************************
tass 0:b3aca3c27ab6 2 PicoTCP. Copyright (c) 2012-2013 TASS Belgium NV. Some rights reserved.
tass 0:b3aca3c27ab6 3 See LICENSE and COPYING for usage. https://github.com/tass-belgium/picotcp
tass 0:b3aca3c27ab6 4
tass 0:b3aca3c27ab6 5 This library is free software; you can redistribute it and/or
tass 0:b3aca3c27ab6 6 modify it under the terms of the GNU General Public License Version 2
tass 0:b3aca3c27ab6 7 as published by the Free Software Foundation;
tass 0:b3aca3c27ab6 8
tass 0:b3aca3c27ab6 9 Authors: Maxime Vincent
tass 0:b3aca3c27ab6 10
tass 0:b3aca3c27ab6 11 Purpose: This is a PicoTCP demo. It will try to connect a TCP socket at
tass 0:b3aca3c27ab6 12 from 192.168.100.1 port 6666 to 192.168.100.2 port 4404
tass 0:b3aca3c27ab6 13 and then send "TCPSIZ" a-characters there.
tass 0:b3aca3c27ab6 14 When that succeeded, it prints the throughput on the serial output.
tass 0:b3aca3c27ab6 15
tass 0:b3aca3c27ab6 16 Libraries needed to get this up and running:
tass 0:b3aca3c27ab6 17 PicoTCP,
tass 0:b3aca3c27ab6 18 lpc1768-picotcp-demo-eth,
tass 0:b3aca3c27ab6 19 picotcp-demo-printf,
tass 0:b3aca3c27ab6 20 mbed-rtos,
tass 0:b3aca3c27ab6 21 mbed
tass 0:b3aca3c27ab6 22
tass 0:b3aca3c27ab6 23 ******************************************************************************/
tass 0:b3aca3c27ab6 24
tass 0:b3aca3c27ab6 25 #include "mbed.h"
tass 0:b3aca3c27ab6 26
tass 0:b3aca3c27ab6 27 extern "C" {
tass 0:b3aca3c27ab6 28 // PicoTCP includes
tass 0:b3aca3c27ab6 29 #include "pico_dev_mbed_emac.h"
tass 0:b3aca3c27ab6 30 #include "pico_stack.h"
tass 0:b3aca3c27ab6 31 #include "pico_ipv4.h"
tass 0:b3aca3c27ab6 32 #include "pico_socket.h"
tass 0:b3aca3c27ab6 33 // CMSIS OS includes
tass 0:b3aca3c27ab6 34 #include "cmsis_os.h"
tass 0:b3aca3c27ab6 35 // other includes
tass 0:b3aca3c27ab6 36 #include "serial_api.h"
tass 0:b3aca3c27ab6 37 #include <stdio.h>
tass 0:b3aca3c27ab6 38 #include "printf.h"
tass 0:b3aca3c27ab6 39 }
tass 0:b3aca3c27ab6 40
tass 0:b3aca3c27ab6 41 // Send 10 MBs
tass 0:b3aca3c27ab6 42 #define TCPSIZ (10 * 1024 * 1024)
tass 0:b3aca3c27ab6 43
tass 0:b3aca3c27ab6 44 serial_t _serial;
tass 0:b3aca3c27ab6 45
tass 0:b3aca3c27ab6 46 DigitalOut myled1(LED1); /* Tick */
tass 0:b3aca3c27ab6 47
tass 0:b3aca3c27ab6 48 void app_tcpbench(void);
tass 0:b3aca3c27ab6 49
tass 0:b3aca3c27ab6 50 void _putc(void *p, char ch)
tass 0:b3aca3c27ab6 51 {
tass 0:b3aca3c27ab6 52 serial_putc(&_serial, ch);
tass 0:b3aca3c27ab6 53 }
tass 0:b3aca3c27ab6 54
tass 0:b3aca3c27ab6 55 int main() {
tass 0:b3aca3c27ab6 56 struct pico_device *my_dev;
tass 0:b3aca3c27ab6 57 struct pico_ip4 myaddr, mynetmask;
tass 0:b3aca3c27ab6 58
tass 0:b3aca3c27ab6 59 // init serial output
tass 0:b3aca3c27ab6 60 serial_init(&_serial, p9, p10);
tass 0:b3aca3c27ab6 61 init_printf(NULL,_putc);
tass 0:b3aca3c27ab6 62 mprintf(">>> Welcome 2 PicoTCP <<<\r\n");
tass 0:b3aca3c27ab6 63
tass 0:b3aca3c27ab6 64 // init PicoTCP stack
tass 0:b3aca3c27ab6 65 pico_stack_init();
tass 0:b3aca3c27ab6 66
tass 0:b3aca3c27ab6 67 pico_string_to_ipv4("192.168.100.1", &myaddr.addr);
tass 0:b3aca3c27ab6 68 pico_string_to_ipv4("255.255.255.0", &mynetmask.addr);
tass 0:b3aca3c27ab6 69 my_dev = pico_emac_create("MBED-EMAC");
tass 0:b3aca3c27ab6 70
tass 0:b3aca3c27ab6 71 pico_ipv4_link_add(my_dev, myaddr, mynetmask);
tass 0:b3aca3c27ab6 72
tass 0:b3aca3c27ab6 73 mprintf("ip=192.168.100.1 - will connect to 192.168.100.2:4404 in 5 seconds...\r\n");
tass 0:b3aca3c27ab6 74 osDelay(5000);
tass 0:b3aca3c27ab6 75 mprintf("PicoTCP Benchmark starting...\r\n");
tass 0:b3aca3c27ab6 76 app_tcpbench();
tass 0:b3aca3c27ab6 77
tass 0:b3aca3c27ab6 78 // This is the IDLE task
tass 0:b3aca3c27ab6 79 while(1) {
tass 0:b3aca3c27ab6 80 static uint8_t led_tick;
tass 0:b3aca3c27ab6 81 pico_stack_tick();
tass 0:b3aca3c27ab6 82 //wait_ms(1); // wait a millisec...
tass 0:b3aca3c27ab6 83
tass 0:b3aca3c27ab6 84 led_tick++;
tass 0:b3aca3c27ab6 85 if (!(led_tick%200))
tass 0:b3aca3c27ab6 86 {
tass 0:b3aca3c27ab6 87 myled1 = !myled1;
tass 0:b3aca3c27ab6 88 led_tick = 0;
tass 0:b3aca3c27ab6 89 }
tass 0:b3aca3c27ab6 90 }
tass 0:b3aca3c27ab6 91 }
tass 0:b3aca3c27ab6 92
tass 0:b3aca3c27ab6 93 /*** START TCP BENCH ***/
tass 0:b3aca3c27ab6 94
tass 0:b3aca3c27ab6 95 #define TCP_BENCH_TX 1
tass 0:b3aca3c27ab6 96 #define TCP_BENCH_RX 2
tass 0:b3aca3c27ab6 97
tass 0:b3aca3c27ab6 98 uint8_t buffer0[2000] __attribute__((section("AHBSRAM0"))); // To save some RAM
tass 0:b3aca3c27ab6 99
tass 0:b3aca3c27ab6 100 int tcpbench_mode = TCP_BENCH_TX;
tass 0:b3aca3c27ab6 101 struct pico_socket *tcpbench_sock = NULL;
tass 0:b3aca3c27ab6 102 static unsigned long tcpbench_time_start,tcpbench_time_end;
tass 0:b3aca3c27ab6 103
tass 0:b3aca3c27ab6 104 void cb_tcpbench(uint16_t ev, struct pico_socket *s)
tass 0:b3aca3c27ab6 105 {
tass 0:b3aca3c27ab6 106 static int closed = 0;
tass 0:b3aca3c27ab6 107 static unsigned long count = 0;
tass 0:b3aca3c27ab6 108
tass 0:b3aca3c27ab6 109 static long tcpbench_wr_size = 0;
tass 0:b3aca3c27ab6 110 long tcpbench_w = 0;
tass 0:b3aca3c27ab6 111 double tcpbench_time = 0;
tass 0:b3aca3c27ab6 112 unsigned int time_ms;
tass 0:b3aca3c27ab6 113
tass 0:b3aca3c27ab6 114 count++;
tass 0:b3aca3c27ab6 115
tass 0:b3aca3c27ab6 116 if (ev & PICO_SOCK_EV_RD) {
tass 0:b3aca3c27ab6 117 }
tass 0:b3aca3c27ab6 118
tass 0:b3aca3c27ab6 119 if (ev & PICO_SOCK_EV_CONN) {
tass 0:b3aca3c27ab6 120 if (tcpbench_mode == TCP_BENCH_TX)
tass 0:b3aca3c27ab6 121 mprintf("tb> Connection established with server.\r\n");
tass 0:b3aca3c27ab6 122 }
tass 0:b3aca3c27ab6 123
tass 0:b3aca3c27ab6 124 if (ev & PICO_SOCK_EV_FIN) {
tass 0:b3aca3c27ab6 125 mprintf("tb> Socket closed. Exit normally. \r\n");
tass 0:b3aca3c27ab6 126 }
tass 0:b3aca3c27ab6 127
tass 0:b3aca3c27ab6 128 if (ev & PICO_SOCK_EV_ERR) {
tass 0:b3aca3c27ab6 129 mprintf("tb> Socket Error received: %s. Bailing out.\r\n", strerror(pico_err));
tass 0:b3aca3c27ab6 130 }
tass 0:b3aca3c27ab6 131
tass 0:b3aca3c27ab6 132 if (ev & PICO_SOCK_EV_CLOSE) {
tass 0:b3aca3c27ab6 133 mprintf("tb> event close\r\n");
tass 0:b3aca3c27ab6 134 pico_socket_close(s);
tass 0:b3aca3c27ab6 135 return;
tass 0:b3aca3c27ab6 136 }
tass 0:b3aca3c27ab6 137
tass 0:b3aca3c27ab6 138 if (ev & PICO_SOCK_EV_WR) {
tass 0:b3aca3c27ab6 139
tass 0:b3aca3c27ab6 140 if (tcpbench_wr_size < TCPSIZ && tcpbench_mode == TCP_BENCH_TX) {
tass 0:b3aca3c27ab6 141 do {
tass 0:b3aca3c27ab6 142 tcpbench_w = pico_socket_write(tcpbench_sock, buffer0, TCPSIZ-tcpbench_wr_size);
tass 0:b3aca3c27ab6 143 if (tcpbench_w > 0) {
tass 0:b3aca3c27ab6 144 tcpbench_wr_size += tcpbench_w;
tass 0:b3aca3c27ab6 145 //mprintf("Written : %d \n",tcpbench_wr_size);
tass 0:b3aca3c27ab6 146 //mprintf("tb> SOCKET WRITTEN - %d\r\n",tcpbench_w);
tass 0:b3aca3c27ab6 147 }
tass 0:b3aca3c27ab6 148 if (tcpbench_w < 0) {
tass 0:b3aca3c27ab6 149 mprintf("tb> Socket Error received: %s. Bailing out.\r\n", strerror(pico_err));
tass 0:b3aca3c27ab6 150 exit(5);
tass 0:b3aca3c27ab6 151 }
tass 0:b3aca3c27ab6 152 if (tcpbench_time_start == 0)
tass 0:b3aca3c27ab6 153 tcpbench_time_start = PICO_TIME_MS();
tass 0:b3aca3c27ab6 154 } while(tcpbench_w > 0);
tass 0:b3aca3c27ab6 155 //mprintf("tcpbench_wr_size = %d \r\n", tcpbench_wr_size);
tass 0:b3aca3c27ab6 156 } else {
tass 0:b3aca3c27ab6 157 if (!closed && tcpbench_mode == TCP_BENCH_TX) {
tass 0:b3aca3c27ab6 158 tcpbench_time_end = PICO_TIME_MS();
tass 0:b3aca3c27ab6 159 pico_socket_shutdown(s, PICO_SHUT_WR);
tass 0:b3aca3c27ab6 160 mprintf("tb> TCPSIZ written\r\n");
tass 0:b3aca3c27ab6 161 mprintf("tb> Called shutdown()\r\n");
tass 0:b3aca3c27ab6 162 tcpbench_time = (tcpbench_time_end - tcpbench_time_start)/1000.0; /* get number of seconds */
tass 0:b3aca3c27ab6 163 time_ms = (unsigned int)(tcpbench_time * 1000);
tass 0:b3aca3c27ab6 164 mprintf("tb> Transmitted %u bytes in %u milliseconds\r\n",TCPSIZ, time_ms);
tass 0:b3aca3c27ab6 165 mprintf("tb> average write throughput %u kbit/sec\r\n",( (TCPSIZ/time_ms) * 8) );
tass 0:b3aca3c27ab6 166 closed = 1;
tass 0:b3aca3c27ab6 167 }
tass 0:b3aca3c27ab6 168 }
tass 0:b3aca3c27ab6 169 }
tass 0:b3aca3c27ab6 170 }
tass 0:b3aca3c27ab6 171
tass 0:b3aca3c27ab6 172 void app_tcpbench(void)
tass 0:b3aca3c27ab6 173 {
tass 0:b3aca3c27ab6 174 struct pico_socket *s;
tass 0:b3aca3c27ab6 175 uint16_t port_be = short_be(4404);
tass 0:b3aca3c27ab6 176 uint16_t local_port;
tass 0:b3aca3c27ab6 177 struct pico_ip4 server_addr;
tass 0:b3aca3c27ab6 178 struct pico_ip4 local_addr;
tass 0:b3aca3c27ab6 179 memset(buffer0,'a',2000);
tass 0:b3aca3c27ab6 180 tcpbench_mode = TCP_BENCH_TX;
tass 0:b3aca3c27ab6 181
tass 0:b3aca3c27ab6 182 mprintf("Opening socket...\r\n");
tass 0:b3aca3c27ab6 183 s = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_TCP, &cb_tcpbench);
tass 0:b3aca3c27ab6 184 if (!s)
tass 0:b3aca3c27ab6 185 {
tass 0:b3aca3c27ab6 186 mprintf("Socket was not opened...\r\n");
tass 0:b3aca3c27ab6 187 exit(1);
tass 0:b3aca3c27ab6 188 }
tass 0:b3aca3c27ab6 189
tass 0:b3aca3c27ab6 190 local_port = short_be(6666);
tass 0:b3aca3c27ab6 191 pico_string_to_ipv4("192.168.100.1", &local_addr.addr);
tass 0:b3aca3c27ab6 192 pico_string_to_ipv4("192.168.100.2", &server_addr.addr);
tass 0:b3aca3c27ab6 193 pico_socket_bind(s, &local_addr, &local_port);
tass 0:b3aca3c27ab6 194
tass 0:b3aca3c27ab6 195 tcpbench_sock = s;
tass 0:b3aca3c27ab6 196 pico_socket_connect(s, &server_addr, port_be);
tass 0:b3aca3c27ab6 197
tass 0:b3aca3c27ab6 198 return;
tass 0:b3aca3c27ab6 199 }