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:
tass
Date:
Fri Sep 27 12:43:36 2013 +0000
Revision:
73:dfb737147f6e
Parent:
70:cd218dd180e5
Child:
95:f4ca916a26fe
Import from master branch.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tass 73:dfb737147f6e 1 #define MBED
tass 73:dfb737147f6e 2
tass 68:0847e35d08a6 3 /*********************************************************************
tass 68:0847e35d08a6 4 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
tass 68:0847e35d08a6 5 See LICENSE and COPYING for usage.
tass 68:0847e35d08a6 6
tass 68:0847e35d08a6 7 *********************************************************************/
tass 68:0847e35d08a6 8 #ifndef _INCLUDE_PICO_SOCKET
tass 68:0847e35d08a6 9 #define _INCLUDE_PICO_SOCKET
tass 68:0847e35d08a6 10 #include "pico_queue.h"
tass 68:0847e35d08a6 11 #include "pico_addressing.h"
tass 68:0847e35d08a6 12 #include "pico_config.h"
tass 68:0847e35d08a6 13 #include "pico_protocol.h"
tass 68:0847e35d08a6 14
tass 73:dfb737147f6e 15 #ifndef MBED
tass 73:dfb737147f6e 16 #define PICO_DEFAULT_SOCKETQ (128 * 1024)
tass 73:dfb737147f6e 17 #else
tass 73:dfb737147f6e 18 #define PICO_DEFAULT_SOCKETQ (4 * 1024)
tass 73:dfb737147f6e 19 #endif
tass 68:0847e35d08a6 20
tass 68:0847e35d08a6 21 #define PICO_SHUT_RD 1
tass 68:0847e35d08a6 22 #define PICO_SHUT_WR 2
tass 68:0847e35d08a6 23 #define PICO_SHUT_RDWR 3
tass 68:0847e35d08a6 24
tass 68:0847e35d08a6 25
tass 68:0847e35d08a6 26 struct pico_socket {
tass 68:0847e35d08a6 27 struct pico_protocol *proto;
tass 68:0847e35d08a6 28 struct pico_protocol *net;
tass 68:0847e35d08a6 29
tass 68:0847e35d08a6 30 union {
tass 68:0847e35d08a6 31 struct pico_ip4 ip4;
tass 68:0847e35d08a6 32 struct pico_ip6 ip6;
tass 68:0847e35d08a6 33 } local_addr;
tass 68:0847e35d08a6 34
tass 68:0847e35d08a6 35 union {
tass 68:0847e35d08a6 36 struct pico_ip4 ip4;
tass 68:0847e35d08a6 37 struct pico_ip6 ip6;
tass 68:0847e35d08a6 38 } remote_addr;
tass 68:0847e35d08a6 39
tass 68:0847e35d08a6 40 uint16_t local_port;
tass 68:0847e35d08a6 41 uint16_t remote_port;
tass 68:0847e35d08a6 42
tass 68:0847e35d08a6 43 struct pico_queue q_in;
tass 68:0847e35d08a6 44 struct pico_queue q_out;
tass 68:0847e35d08a6 45
tass 68:0847e35d08a6 46 void (*wakeup)(uint16_t ev, struct pico_socket *s);
tass 68:0847e35d08a6 47
tass 68:0847e35d08a6 48
tass 68:0847e35d08a6 49 #ifdef PICO_SUPPORT_TCP
tass 68:0847e35d08a6 50 /* For the TCP backlog queue */
tass 68:0847e35d08a6 51 struct pico_socket *backlog;
tass 68:0847e35d08a6 52 struct pico_socket *next;
tass 68:0847e35d08a6 53 struct pico_socket *parent;
tass 68:0847e35d08a6 54 int max_backlog;
tass 68:0847e35d08a6 55 #endif
tass 68:0847e35d08a6 56 #ifdef PICO_SUPPORT_MCAST
tass 68:0847e35d08a6 57 struct pico_tree *MCASTListen;
tass 68:0847e35d08a6 58 #endif
tass 68:0847e35d08a6 59 uint16_t ev_pending;
tass 68:0847e35d08a6 60
tass 68:0847e35d08a6 61 struct pico_device *dev;
tass 68:0847e35d08a6 62
tass 68:0847e35d08a6 63 /* Private field. */
tass 68:0847e35d08a6 64 int id;
tass 68:0847e35d08a6 65 uint16_t state;
tass 68:0847e35d08a6 66 uint16_t opt_flags;
tass 68:0847e35d08a6 67 uint32_t timestamp;
tass 68:0847e35d08a6 68 void *priv;
tass 68:0847e35d08a6 69 };
tass 68:0847e35d08a6 70
tass 68:0847e35d08a6 71 struct pico_remote_duple {
tass 68:0847e35d08a6 72 union {
tass 68:0847e35d08a6 73 struct pico_ip4 ip4;
tass 68:0847e35d08a6 74 struct pico_ip6 ip6;
tass 68:0847e35d08a6 75 } remote_addr;
tass 68:0847e35d08a6 76
tass 68:0847e35d08a6 77 uint16_t remote_port;
tass 68:0847e35d08a6 78 };
tass 68:0847e35d08a6 79
tass 68:0847e35d08a6 80
tass 68:0847e35d08a6 81 /* request struct for multicast socket opt */
tass 68:0847e35d08a6 82 struct pico_ip_mreq {
tass 68:0847e35d08a6 83 struct pico_ip4 mcast_group_addr;
tass 68:0847e35d08a6 84 struct pico_ip4 mcast_link_addr;
tass 68:0847e35d08a6 85 };
tass 68:0847e35d08a6 86
tass 68:0847e35d08a6 87 struct pico_ip_mreq_source {
tass 68:0847e35d08a6 88 struct pico_ip4 mcast_group_addr;
tass 68:0847e35d08a6 89 struct pico_ip4 mcast_source_addr;
tass 68:0847e35d08a6 90 struct pico_ip4 mcast_link_addr;
tass 68:0847e35d08a6 91 };
tass 68:0847e35d08a6 92
tass 68:0847e35d08a6 93 #define PICO_SOCKET_STATE_UNDEFINED 0x0000
tass 68:0847e35d08a6 94 #define PICO_SOCKET_STATE_SHUT_LOCAL 0x0001
tass 68:0847e35d08a6 95 #define PICO_SOCKET_STATE_SHUT_REMOTE 0x0002
tass 68:0847e35d08a6 96 #define PICO_SOCKET_STATE_BOUND 0x0004
tass 68:0847e35d08a6 97 #define PICO_SOCKET_STATE_CONNECTED 0x0008
tass 68:0847e35d08a6 98 #define PICO_SOCKET_STATE_CLOSING 0x0010
tass 68:0847e35d08a6 99 #define PICO_SOCKET_STATE_CLOSED 0x0020
tass 68:0847e35d08a6 100
tass 68:0847e35d08a6 101 # define PICO_SOCKET_STATE_TCP 0xFF00
tass 68:0847e35d08a6 102 # define PICO_SOCKET_STATE_TCP_UNDEF 0x00FF
tass 68:0847e35d08a6 103 # define PICO_SOCKET_STATE_TCP_CLOSED 0x0100
tass 68:0847e35d08a6 104 # define PICO_SOCKET_STATE_TCP_LISTEN 0x0200
tass 68:0847e35d08a6 105 # define PICO_SOCKET_STATE_TCP_SYN_SENT 0x0300
tass 68:0847e35d08a6 106 # define PICO_SOCKET_STATE_TCP_SYN_RECV 0x0400
tass 68:0847e35d08a6 107 # define PICO_SOCKET_STATE_TCP_ESTABLISHED 0x0500
tass 68:0847e35d08a6 108 # define PICO_SOCKET_STATE_TCP_CLOSE_WAIT 0x0600
tass 68:0847e35d08a6 109 # define PICO_SOCKET_STATE_TCP_LAST_ACK 0x0700
tass 68:0847e35d08a6 110 # define PICO_SOCKET_STATE_TCP_FIN_WAIT1 0x0800
tass 68:0847e35d08a6 111 # define PICO_SOCKET_STATE_TCP_FIN_WAIT2 0x0900
tass 68:0847e35d08a6 112 # define PICO_SOCKET_STATE_TCP_CLOSING 0x0a00
tass 68:0847e35d08a6 113 # define PICO_SOCKET_STATE_TCP_TIME_WAIT 0x0b00
tass 68:0847e35d08a6 114 # define PICO_SOCKET_STATE_TCP_ARRAYSIZ 0x0c
tass 68:0847e35d08a6 115
tass 68:0847e35d08a6 116 # define PICO_TCP_NODELAY 1
tass 68:0847e35d08a6 117
tass 68:0847e35d08a6 118 # define PICO_SOCKET_OPT_TCPNODELAY 0x0000
tass 68:0847e35d08a6 119
tass 68:0847e35d08a6 120 # define PICO_IP_MULTICAST_EXCLUDE 0
tass 68:0847e35d08a6 121 # define PICO_IP_MULTICAST_INCLUDE 1
tass 68:0847e35d08a6 122 # define PICO_IP_MULTICAST_IF 32
tass 68:0847e35d08a6 123 # define PICO_IP_MULTICAST_TTL 33
tass 68:0847e35d08a6 124 # define PICO_IP_MULTICAST_LOOP 34
tass 68:0847e35d08a6 125 # define PICO_IP_ADD_MEMBERSHIP 35
tass 68:0847e35d08a6 126 # define PICO_IP_DROP_MEMBERSHIP 36
tass 68:0847e35d08a6 127 # define PICO_IP_UNBLOCK_SOURCE 37
tass 68:0847e35d08a6 128 # define PICO_IP_BLOCK_SOURCE 38
tass 68:0847e35d08a6 129 # define PICO_IP_ADD_SOURCE_MEMBERSHIP 39
tass 68:0847e35d08a6 130 # define PICO_IP_DROP_SOURCE_MEMBERSHIP 40
tass 68:0847e35d08a6 131
tass 68:0847e35d08a6 132 # define PICO_SOCKET_OPT_MULTICAST_LOOP 1
tass 68:0847e35d08a6 133
tass 68:0847e35d08a6 134 # define PICO_IP_DEFAULT_MULTICAST_TTL 1
tass 68:0847e35d08a6 135 # define PICO_IP_DEFAULT_MULTICAST_LOOP 1
tass 68:0847e35d08a6 136
tass 68:0847e35d08a6 137 #define PICO_SOCKET_TIMEOUT 90000u //1.5 minutes
tass 68:0847e35d08a6 138
tass 68:0847e35d08a6 139 #define PICO_SOCKET_SHUTDOWN_WRITE 0x01
tass 68:0847e35d08a6 140 #define PICO_SOCKET_SHUTDOWN_READ 0x02
tass 68:0847e35d08a6 141 #define TCPSTATE(s) ((s)->state & PICO_SOCKET_STATE_TCP)
tass 68:0847e35d08a6 142
tass 68:0847e35d08a6 143 #define PICO_SOCK_EV_RD 1
tass 68:0847e35d08a6 144 #define PICO_SOCK_EV_WR 2
tass 68:0847e35d08a6 145 #define PICO_SOCK_EV_CONN 4
tass 68:0847e35d08a6 146 #define PICO_SOCK_EV_CLOSE 8
tass 68:0847e35d08a6 147 #define PICO_SOCK_EV_FIN 0x10
tass 68:0847e35d08a6 148 #define PICO_SOCK_EV_ERR 0x80
tass 68:0847e35d08a6 149
tass 68:0847e35d08a6 150
tass 68:0847e35d08a6 151 struct pico_socket *pico_socket_open(uint16_t net, uint16_t proto, void (*wakeup)(uint16_t ev, struct pico_socket *s));
tass 68:0847e35d08a6 152
tass 68:0847e35d08a6 153 int pico_socket_read(struct pico_socket *s, void *buf, int len);
tass 68:0847e35d08a6 154 int pico_socket_write(struct pico_socket *s, const void *buf, int len);
tass 68:0847e35d08a6 155
tass 68:0847e35d08a6 156 int pico_socket_sendto(struct pico_socket *s, const void *buf, int len, void *dst, uint16_t remote_port);
tass 68:0847e35d08a6 157 int pico_socket_recvfrom(struct pico_socket *s, void *buf, int len, void *orig, uint16_t *local_port);
tass 68:0847e35d08a6 158
tass 68:0847e35d08a6 159 int pico_socket_send(struct pico_socket *s, const void *buf, int len);
tass 68:0847e35d08a6 160 int pico_socket_recv(struct pico_socket *s, void *buf, int len);
tass 68:0847e35d08a6 161
tass 68:0847e35d08a6 162 int pico_socket_bind(struct pico_socket *s, void *local_addr, uint16_t *port);
tass 68:0847e35d08a6 163 int pico_socket_connect(struct pico_socket *s, const void *srv_addr, uint16_t remote_port);
tass 68:0847e35d08a6 164 int pico_socket_listen(struct pico_socket *s, const int backlog);
tass 68:0847e35d08a6 165 struct pico_socket *pico_socket_accept(struct pico_socket *s, void *orig, uint16_t *port);
tass 70:cd218dd180e5 166 int8_t pico_socket_del(struct pico_socket *s);
tass 68:0847e35d08a6 167
tass 68:0847e35d08a6 168 int pico_socket_setoption(struct pico_socket *s, int option, void *value);
tass 68:0847e35d08a6 169 int pico_socket_getoption(struct pico_socket *s, int option, void *value);
tass 68:0847e35d08a6 170
tass 68:0847e35d08a6 171 int pico_socket_shutdown(struct pico_socket *s, int mode);
tass 68:0847e35d08a6 172 int pico_socket_close(struct pico_socket *s);
tass 68:0847e35d08a6 173
tass 70:cd218dd180e5 174 struct pico_frame *pico_socket_frame_alloc(struct pico_socket *s, uint16_t len);
tass 68:0847e35d08a6 175
tass 68:0847e35d08a6 176 #ifdef PICO_SUPPORT_IPV4
tass 68:0847e35d08a6 177 # define is_sock_ipv4(x) (x->net == &pico_proto_ipv4)
tass 68:0847e35d08a6 178 #else
tass 68:0847e35d08a6 179 # define is_sock_ipv4(x) (0)
tass 68:0847e35d08a6 180 #endif
tass 68:0847e35d08a6 181
tass 68:0847e35d08a6 182 #ifdef PICO_SUPPORT_IPV6
tass 68:0847e35d08a6 183 # define is_sock_ipv6(x) (x->net == &pico_proto_ipv6)
tass 68:0847e35d08a6 184 #else
tass 68:0847e35d08a6 185 # define is_sock_ipv6(x) (0)
tass 68:0847e35d08a6 186 #endif
tass 68:0847e35d08a6 187
tass 68:0847e35d08a6 188 #ifdef PICO_SUPPORT_UDP
tass 68:0847e35d08a6 189 # define is_sock_udp(x) (x->net == &pico_proto_udp)
tass 68:0847e35d08a6 190 #else
tass 68:0847e35d08a6 191 # define is_sock_udp(x) (0)
tass 68:0847e35d08a6 192 #endif
tass 68:0847e35d08a6 193
tass 68:0847e35d08a6 194 #ifdef PICO_SUPPORT_TCP
tass 68:0847e35d08a6 195 # define is_sock_tcp(x) (x->net == &pico_proto_tcp)
tass 68:0847e35d08a6 196 #else
tass 68:0847e35d08a6 197 # define is_sock_tcp(x) (0)
tass 68:0847e35d08a6 198 #endif
tass 68:0847e35d08a6 199
tass 68:0847e35d08a6 200 /* Interface towards transport protocol */
tass 68:0847e35d08a6 201 int pico_transport_process_in(struct pico_protocol *self, struct pico_frame *f);
tass 68:0847e35d08a6 202 struct pico_socket *pico_socket_clone(struct pico_socket *facsimile);
tass 70:cd218dd180e5 203 int8_t pico_socket_add(struct pico_socket *s);
tass 68:0847e35d08a6 204 int pico_transport_error(struct pico_frame *f, uint8_t proto, int code);
tass 68:0847e35d08a6 205
tass 68:0847e35d08a6 206 /* Socket loop */
tass 68:0847e35d08a6 207 int pico_sockets_loop(int loop_score);
tass 68:0847e35d08a6 208 struct pico_socket* pico_sockets_find(uint16_t local,uint16_t remote);
tass 68:0847e35d08a6 209 /* Port check */
tass 68:0847e35d08a6 210 int pico_is_port_free(uint16_t proto, uint16_t port, void *addr, void *net);
tass 68:0847e35d08a6 211
tass 68:0847e35d08a6 212
tass 68:0847e35d08a6 213 #endif