Free (GPLv2) TCP/IP stack developed by TASS Belgium

Dependents:   lpc1768-picotcp-demo ZeroMQ_PicoTCP_Publisher_demo TCPSocket_HelloWorld_PicoTCP Pico_TCP_UDP_Test ... more

PicoTCP. Copyright (c) 2013 TASS Belgium NV.

Released under the GNU General Public License, version 2.

Different licensing models may exist, at the sole discretion of the Copyright holders.

Official homepage: http://www.picotcp.com

Bug tracker: https://github.com/tass-belgium/picotcp/issues

Development steps:

  • initial integration with mbed RTOS
  • generic mbed Ethernet driver
  • high performance NXP LPC1768 specific Ethernet driver
  • Multi-threading support for mbed RTOS
  • Berkeley sockets and integration with the New Socket API
  • Fork of the apps running on top of the New Socket API
  • Scheduling optimizations
  • Debugging/benchmarking/testing

Demo application (measuring TCP sender performance):

Import programlpc1768-picotcp-demo

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

Committer:
daniele
Date:
Fri May 24 15:25:25 2013 +0000
Revision:
3:b4047e8a0123
Updated from main repo + fixed Mutexes;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 3:b4047e8a0123 1 /*********************************************************************
daniele 3:b4047e8a0123 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 3:b4047e8a0123 3 See LICENSE and COPYING for usage.
daniele 3:b4047e8a0123 4
daniele 3:b4047e8a0123 5 .
daniele 3:b4047e8a0123 6
daniele 3:b4047e8a0123 7 *********************************************************************/
daniele 3:b4047e8a0123 8 #ifndef _INCLUDE_PICO_TCP
daniele 3:b4047e8a0123 9 #define _INCLUDE_PICO_TCP
daniele 3:b4047e8a0123 10 #include "pico_addressing.h"
daniele 3:b4047e8a0123 11 #include "pico_protocol.h"
daniele 3:b4047e8a0123 12 #include "pico_socket.h"
daniele 3:b4047e8a0123 13
daniele 3:b4047e8a0123 14 extern struct pico_protocol pico_proto_tcp;
daniele 3:b4047e8a0123 15
daniele 3:b4047e8a0123 16 struct __attribute__((packed)) pico_tcp_hdr {
daniele 3:b4047e8a0123 17 struct pico_trans trans;
daniele 3:b4047e8a0123 18 uint32_t seq;
daniele 3:b4047e8a0123 19 uint32_t ack;
daniele 3:b4047e8a0123 20 uint8_t len;
daniele 3:b4047e8a0123 21 uint8_t flags;
daniele 3:b4047e8a0123 22 uint16_t rwnd;
daniele 3:b4047e8a0123 23 uint16_t crc;
daniele 3:b4047e8a0123 24 uint16_t urgent;
daniele 3:b4047e8a0123 25 };
daniele 3:b4047e8a0123 26
daniele 3:b4047e8a0123 27 struct __attribute__((packed)) tcp_pseudo_hdr_ipv4
daniele 3:b4047e8a0123 28 {
daniele 3:b4047e8a0123 29 struct pico_ip4 src;
daniele 3:b4047e8a0123 30 struct pico_ip4 dst;
daniele 3:b4047e8a0123 31 uint16_t tcp_len;
daniele 3:b4047e8a0123 32 uint8_t res;
daniele 3:b4047e8a0123 33 uint8_t proto;
daniele 3:b4047e8a0123 34 };
daniele 3:b4047e8a0123 35
daniele 3:b4047e8a0123 36 #define PICO_TCPHDR_SIZE 20
daniele 3:b4047e8a0123 37 #define PICO_SIZE_TCPOPT_SYN 20
daniele 3:b4047e8a0123 38 #define PICO_SIZE_TCPHDR (sizeof(struct pico_tcp_hdr))
daniele 3:b4047e8a0123 39
daniele 3:b4047e8a0123 40 #define PICO_TCP_DEFAULT_MSS 1444
daniele 3:b4047e8a0123 41
daniele 3:b4047e8a0123 42
daniele 3:b4047e8a0123 43
daniele 3:b4047e8a0123 44 /* TCP options */
daniele 3:b4047e8a0123 45 #define PICO_TCP_OPTION_END 0x00
daniele 3:b4047e8a0123 46 #define PICO_TCPOPTLEN_END 1
daniele 3:b4047e8a0123 47 #define PICO_TCP_OPTION_NOOP 0x01
daniele 3:b4047e8a0123 48 #define PICO_TCPOPTLEN_NOOP 1
daniele 3:b4047e8a0123 49 #define PICO_TCP_OPTION_MSS 0x02
daniele 3:b4047e8a0123 50 #define PICO_TCPOPTLEN_MSS 4
daniele 3:b4047e8a0123 51 #define PICO_TCP_OPTION_WS 0x03
daniele 3:b4047e8a0123 52 #define PICO_TCPOPTLEN_WS 3
daniele 3:b4047e8a0123 53 #define PICO_TCP_OPTION_SACK_OK 0x04
daniele 3:b4047e8a0123 54 #define PICO_TCPOPTLEN_SACK_OK 2
daniele 3:b4047e8a0123 55 #define PICO_TCP_OPTION_SACK 0x05
daniele 3:b4047e8a0123 56 #define PICO_TCPOPTLEN_SACK 2 /* Plus the block */
daniele 3:b4047e8a0123 57 #define PICO_TCP_OPTION_TIMESTAMP 0x08
daniele 3:b4047e8a0123 58 #define PICO_TCPOPTLEN_TIMESTAMP 10
daniele 3:b4047e8a0123 59
daniele 3:b4047e8a0123 60 /* TCP flags */
daniele 3:b4047e8a0123 61 #define PICO_TCP_FIN 0x01
daniele 3:b4047e8a0123 62 #define PICO_TCP_SYN 0x02
daniele 3:b4047e8a0123 63 #define PICO_TCP_RST 0x04
daniele 3:b4047e8a0123 64 #define PICO_TCP_PSH 0x08
daniele 3:b4047e8a0123 65 #define PICO_TCP_ACK 0x10
daniele 3:b4047e8a0123 66 #define PICO_TCP_URG 0x20
daniele 3:b4047e8a0123 67 #define PICO_TCP_ECN 0x40
daniele 3:b4047e8a0123 68 #define PICO_TCP_CWR 0x80
daniele 3:b4047e8a0123 69
daniele 3:b4047e8a0123 70
daniele 3:b4047e8a0123 71
daniele 3:b4047e8a0123 72 struct __attribute__((packed)) pico_tcp_option
daniele 3:b4047e8a0123 73 {
daniele 3:b4047e8a0123 74 uint8_t kind;
daniele 3:b4047e8a0123 75 uint8_t len;
daniele 3:b4047e8a0123 76 #if 0
daniele 3:b4047e8a0123 77 union {
daniele 3:b4047e8a0123 78 uint16_t mss;
daniele 3:b4047e8a0123 79 uint8_t wshift;
daniele 3:b4047e8a0123 80 struct {
daniele 3:b4047e8a0123 81 uint32_t tsval;
daniele 3:b4047e8a0123 82 uint32_t tsecr;
daniele 3:b4047e8a0123 83 } timestamp;
daniele 3:b4047e8a0123 84 } data;
daniele 3:b4047e8a0123 85 #endif
daniele 3:b4047e8a0123 86 };
daniele 3:b4047e8a0123 87
daniele 3:b4047e8a0123 88 struct pico_socket *pico_tcp_open(void);
daniele 3:b4047e8a0123 89 int pico_tcp_read(struct pico_socket *s, void *buf, int len);
daniele 3:b4047e8a0123 90 int pico_tcp_initconn(struct pico_socket *s);
daniele 3:b4047e8a0123 91 int pico_tcp_input(struct pico_socket *s, struct pico_frame *f);
daniele 3:b4047e8a0123 92 uint16_t pico_tcp_checksum_ipv4(struct pico_frame *f);
daniele 3:b4047e8a0123 93 int pico_tcp_overhead(struct pico_socket *s);
daniele 3:b4047e8a0123 94 int pico_tcp_output(struct pico_socket *s, int loop_score);
daniele 3:b4047e8a0123 95 int pico_tcp_queue_in_is_empty(struct pico_socket *s);
daniele 3:b4047e8a0123 96 int pico_tcp_reply_rst(struct pico_frame *f);
daniele 3:b4047e8a0123 97
daniele 3:b4047e8a0123 98 #endif