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 26 07:05:22 2013 +0000
Revision:
70:cd218dd180e5
Parent:
68:0847e35d08a6
Child:
73:dfb737147f6e
Update from masterbranch

Who changed what in which revision?

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