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
main.cpp@1:83d13ed71a38, 2013-05-17 (annotated)
- Committer:
- daniele
- Date:
- Fri May 17 14:56:29 2013 +0000
- Revision:
- 1:83d13ed71a38
- Parent:
- 0:b3aca3c27ab6
Converted to APP
Who changed what in which revision?
User | Revision | Line number | New 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 | } |