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:
Thu Sep 19 12:38:53 2013 +0000
Revision:
63:97f481e33cb2
Parent:
49:4b404dd2c97a
Update from the master branch

Who changed what in which revision?

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