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 May 17 12:09:59 2013 +0000
Revision:
1:cfe8984a32b4
Update for smaller SOCKETQ

Who changed what in which revision?

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