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:
Sat Jun 15 18:38:26 2013 +0000
Revision:
26:dc3e7f96338f
Parent:
25:d63125298eb3
Socket interface rewritten again

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