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

Files at this revision

API Documentation at this revision

Comitter:
tass
Date:
Fri May 17 12:51:54 2013 +0000
Child:
1:83d13ed71a38
Commit message:
Initial commit of PicoTCP demo app testing the ethernet throughput on the lpc1768 mbed board.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri May 17 12:51:54 2013 +0000
@@ -0,0 +1,199 @@
+/******************************************************************************
+PicoTCP. Copyright (c) 2012-2013 TASS Belgium NV. Some rights reserved.
+See LICENSE and COPYING for usage. https://github.com/tass-belgium/picotcp
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License Version 2
+as published by the Free Software Foundation;
+
+Authors: Maxime Vincent
+
+Purpose: This is a PicoTCP demo. It will try to connect a TCP socket at
+         from 192.168.100.1 port 6666 to 192.168.100.2 port 4404
+         and then send "TCPSIZ" a-characters there.
+         When that succeeded, it prints the throughput on the serial output.
+
+Libraries needed to get this up and running:
+        PicoTCP, 
+        lpc1768-picotcp-demo-eth,
+        picotcp-demo-printf,
+        mbed-rtos,
+        mbed
+
+******************************************************************************/
+
+#include "mbed.h"
+
+extern "C" {
+// PicoTCP includes
+#include "pico_dev_mbed_emac.h"
+#include "pico_stack.h"
+#include "pico_ipv4.h"
+#include "pico_socket.h"
+// CMSIS OS includes
+#include "cmsis_os.h"
+// other includes
+#include "serial_api.h"
+#include <stdio.h>
+#include "printf.h"
+}
+
+// Send 10 MBs
+#define TCPSIZ (10 * 1024 * 1024)
+
+serial_t _serial;
+
+DigitalOut myled1(LED1);    /* Tick */
+
+void app_tcpbench(void);
+
+void _putc(void *p, char ch)
+{
+    serial_putc(&_serial, ch);
+}
+
+int main() {
+    struct pico_device *my_dev;
+    struct pico_ip4 myaddr, mynetmask;
+    
+    // init serial output
+    serial_init(&_serial, p9, p10);
+    init_printf(NULL,_putc);
+    mprintf(">>> Welcome 2 PicoTCP <<<\r\n");
+    
+    // init PicoTCP stack
+    pico_stack_init();
+    
+    pico_string_to_ipv4("192.168.100.1", &myaddr.addr);
+    pico_string_to_ipv4("255.255.255.0", &mynetmask.addr);
+    my_dev = pico_emac_create("MBED-EMAC");
+    
+    pico_ipv4_link_add(my_dev, myaddr, mynetmask);
+    
+    mprintf("ip=192.168.100.1 - will connect to 192.168.100.2:4404 in 5 seconds...\r\n");
+    osDelay(5000);
+    mprintf("PicoTCP Benchmark starting...\r\n");
+    app_tcpbench();
+    
+    // This is the IDLE task
+    while(1) {
+        static uint8_t led_tick;
+        pico_stack_tick();
+        //wait_ms(1); // wait a millisec...
+
+        led_tick++;
+        if (!(led_tick%200))
+        {
+            myled1 = !myled1;
+            led_tick = 0;
+        }
+    }
+}
+
+/*** START TCP BENCH ***/
+
+#define TCP_BENCH_TX  1
+#define TCP_BENCH_RX  2
+
+uint8_t  buffer0[2000]           __attribute__((section("AHBSRAM0"))); // To save some RAM
+
+int tcpbench_mode = TCP_BENCH_TX;
+struct pico_socket *tcpbench_sock = NULL;
+static unsigned long tcpbench_time_start,tcpbench_time_end;
+
+void cb_tcpbench(uint16_t ev, struct pico_socket *s)
+{
+  static int closed = 0;
+  static unsigned long count = 0;
+
+  static long tcpbench_wr_size = 0;
+  long tcpbench_w = 0;
+  double tcpbench_time = 0;
+  unsigned int time_ms;
+
+  count++;
+
+  if (ev & PICO_SOCK_EV_RD) {
+  }
+
+  if (ev & PICO_SOCK_EV_CONN) { 
+    if (tcpbench_mode == TCP_BENCH_TX)
+      mprintf("tb> Connection established with server.\r\n");
+  }
+
+  if (ev & PICO_SOCK_EV_FIN) {
+    mprintf("tb> Socket closed. Exit normally. \r\n");
+  }
+
+  if (ev & PICO_SOCK_EV_ERR) {
+    mprintf("tb> Socket Error received: %s. Bailing out.\r\n", strerror(pico_err));
+  }
+
+  if (ev & PICO_SOCK_EV_CLOSE) {
+    mprintf("tb> event close\r\n");
+    pico_socket_close(s);
+    return;
+  }
+
+  if (ev & PICO_SOCK_EV_WR) {
+    
+    if (tcpbench_wr_size < TCPSIZ && tcpbench_mode == TCP_BENCH_TX) {
+      do {
+        tcpbench_w = pico_socket_write(tcpbench_sock, buffer0, TCPSIZ-tcpbench_wr_size);
+        if (tcpbench_w > 0) {
+          tcpbench_wr_size += tcpbench_w;
+          //mprintf("Written : %d \n",tcpbench_wr_size);
+          //mprintf("tb> SOCKET WRITTEN - %d\r\n",tcpbench_w);
+        }
+        if (tcpbench_w < 0) {
+          mprintf("tb> Socket Error received: %s. Bailing out.\r\n", strerror(pico_err));
+          exit(5);
+        }
+        if (tcpbench_time_start == 0)
+          tcpbench_time_start = PICO_TIME_MS();
+      } while(tcpbench_w > 0);
+      //mprintf("tcpbench_wr_size = %d      \r\n", tcpbench_wr_size);
+    } else {
+      if (!closed && tcpbench_mode == TCP_BENCH_TX) {
+        tcpbench_time_end = PICO_TIME_MS();
+        pico_socket_shutdown(s, PICO_SHUT_WR);
+        mprintf("tb> TCPSIZ written\r\n");
+        mprintf("tb> Called shutdown()\r\n");
+        tcpbench_time = (tcpbench_time_end - tcpbench_time_start)/1000.0; /* get number of seconds */
+        time_ms = (unsigned int)(tcpbench_time * 1000);
+        mprintf("tb> Transmitted %u bytes in %u milliseconds\r\n",TCPSIZ, time_ms);
+        mprintf("tb> average write throughput %u kbit/sec\r\n",( (TCPSIZ/time_ms) * 8) );
+        closed = 1;
+      }
+    }
+  }
+}
+
+void app_tcpbench(void)
+{
+  struct pico_socket *s;
+  uint16_t port_be = short_be(4404);
+  uint16_t local_port;
+  struct pico_ip4 server_addr;
+  struct pico_ip4 local_addr;
+  memset(buffer0,'a',2000);
+  tcpbench_mode = TCP_BENCH_TX;
+
+  mprintf("Opening socket...\r\n");
+  s = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_TCP, &cb_tcpbench);
+  if (!s)
+  {
+    mprintf("Socket was not opened...\r\n");
+    exit(1); 
+  }
+  
+  local_port = short_be(6666);
+  pico_string_to_ipv4("192.168.100.1", &local_addr.addr);
+  pico_string_to_ipv4("192.168.100.2", &server_addr.addr);
+  pico_socket_bind(s, &local_addr, &local_port);
+  
+  tcpbench_sock = s;
+  pico_socket_connect(s, &server_addr, port_be);
+  
+  return;
+}