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
Parent:
libraries/picotcp/include/pico_protocol.h@0:d7f2341ab245
Update for smaller SOCKETQ

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 0:d7f2341ab245 1 /*********************************************************************
daniele 0:d7f2341ab245 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 0:d7f2341ab245 3 See LICENSE and COPYING for usage.
daniele 0:d7f2341ab245 4
daniele 0:d7f2341ab245 5 *********************************************************************/
daniele 0:d7f2341ab245 6 #ifndef _INCLUDE_PICO_PROTOCOL
daniele 0:d7f2341ab245 7 #define _INCLUDE_PICO_PROTOCOL
daniele 0:d7f2341ab245 8 #include <stdint.h>
daniele 0:d7f2341ab245 9 #include "pico_queue.h"
daniele 0:d7f2341ab245 10
daniele 0:d7f2341ab245 11 #define PICO_LOOP_DIR_IN 1
daniele 0:d7f2341ab245 12 #define PICO_LOOP_DIR_OUT 2
daniele 0:d7f2341ab245 13
daniele 0:d7f2341ab245 14 enum pico_layer {
daniele 0:d7f2341ab245 15 PICO_LAYER_DATALINK = 2, /* Ethernet only. */
daniele 0:d7f2341ab245 16 PICO_LAYER_NETWORK = 3, /* IPv4, IPv6, ARP. Arp is there because it communicates with L2 */
daniele 0:d7f2341ab245 17 PICO_LAYER_TRANSPORT = 4, /* UDP, TCP, ICMP */
daniele 0:d7f2341ab245 18 PICO_LAYER_SOCKET = 5 /* Socket management */
daniele 0:d7f2341ab245 19 };
daniele 0:d7f2341ab245 20
daniele 0:d7f2341ab245 21 enum pico_err_e {
daniele 0:d7f2341ab245 22 PICO_ERR_NOERR = 0,
daniele 0:d7f2341ab245 23 PICO_ERR_EPERM,
daniele 0:d7f2341ab245 24 PICO_ERR_ENOENT,
daniele 0:d7f2341ab245 25 /* ... */
daniele 0:d7f2341ab245 26 PICO_ERR_EINTR = 4,
daniele 0:d7f2341ab245 27 PICO_ERR_EIO,
daniele 0:d7f2341ab245 28 PICO_ERR_ENXIO,
daniele 0:d7f2341ab245 29 /* ... */
daniele 0:d7f2341ab245 30 PICO_ERR_EAGAIN = 11,
daniele 0:d7f2341ab245 31 PICO_ERR_ENOMEM,
daniele 0:d7f2341ab245 32 PICO_ERR_EACCESS,
daniele 0:d7f2341ab245 33 PICO_ERR_EFAULT,
daniele 0:d7f2341ab245 34 /* ... */
daniele 0:d7f2341ab245 35 PICO_ERR_EBUSY = 16,
daniele 0:d7f2341ab245 36 PICO_ERR_EEXIST = 17,
daniele 0:d7f2341ab245 37 /* ... */
daniele 0:d7f2341ab245 38 PICO_ERR_EINVAL = 22,
daniele 0:d7f2341ab245 39 /* ... */
daniele 0:d7f2341ab245 40 PICO_ERR_EPROTO = 71,
daniele 0:d7f2341ab245 41 PICO_ERR_EPROTONOSUPPORT = 93,
daniele 0:d7f2341ab245 42
daniele 0:d7f2341ab245 43 /* ... */
daniele 0:d7f2341ab245 44 PICO_ERR_EADDRINUSE = 98,
daniele 0:d7f2341ab245 45 PICO_ERR_EADDRNOTAVAIL,
daniele 0:d7f2341ab245 46 PICO_ERR_ENETUNREACH,
daniele 0:d7f2341ab245 47
daniele 0:d7f2341ab245 48 /* ... */
daniele 0:d7f2341ab245 49 PICO_ERR_ECONNRESET = 104,
daniele 0:d7f2341ab245 50
daniele 0:d7f2341ab245 51 /* ... */
daniele 0:d7f2341ab245 52 PICO_ERR_EISCONN = 106,
daniele 0:d7f2341ab245 53 PICO_ERR_ENOTCONN,
daniele 0:d7f2341ab245 54 PICO_ERR_ESHUTDOWN,
daniele 0:d7f2341ab245 55 /* ... */
daniele 0:d7f2341ab245 56 PICO_ERR_ETIMEDOUT = 110,
daniele 0:d7f2341ab245 57 PICO_ERR_ECONNREFUSED = 111,
daniele 0:d7f2341ab245 58 PICO_ERR_EHOSTDOWN,
daniele 0:d7f2341ab245 59 PICO_ERR_EHOSTUNREACH,
daniele 0:d7f2341ab245 60 /* ... */
daniele 0:d7f2341ab245 61 PICO_ERR_EOPNOTSUPP = 122,
daniele 0:d7f2341ab245 62
daniele 0:d7f2341ab245 63 };
daniele 0:d7f2341ab245 64
daniele 0:d7f2341ab245 65 typedef enum pico_err_e pico_err_t;
daniele 0:d7f2341ab245 66 extern volatile pico_err_t pico_err;
daniele 0:d7f2341ab245 67
daniele 0:d7f2341ab245 68 #define IS_IPV6(f) ((((uint8_t *)(f->net_hdr))[0] & 0xf0) == 0x60)
daniele 0:d7f2341ab245 69 #define IS_IPV4(f) ((((uint8_t *)(f->net_hdr))[0] & 0xf0) == 0x40)
daniele 0:d7f2341ab245 70
daniele 0:d7f2341ab245 71 #define MAX_PROTOCOL_NAME 16
daniele 0:d7f2341ab245 72
daniele 0:d7f2341ab245 73 struct pico_protocol {
daniele 0:d7f2341ab245 74 char name[MAX_PROTOCOL_NAME];
daniele 0:d7f2341ab245 75 uint32_t hash;
daniele 0:d7f2341ab245 76 enum pico_layer layer;
daniele 0:d7f2341ab245 77 int proto_number;
daniele 0:d7f2341ab245 78 struct pico_queue *q_in;
daniele 0:d7f2341ab245 79 struct pico_queue *q_out;
daniele 0:d7f2341ab245 80 struct pico_frame *(*alloc)(struct pico_protocol *self, int size); /* Frame allocation. */
daniele 0:d7f2341ab245 81 int (*push) (struct pico_protocol *self, struct pico_frame *p); /* Push function, for active outgoing pkts from above */
daniele 0:d7f2341ab245 82 int (*process_out)(struct pico_protocol *self, struct pico_frame *p); /* Send loop. */
daniele 0:d7f2341ab245 83 int (*process_in)(struct pico_protocol *self, struct pico_frame *p); /* Recv loop. */
daniele 0:d7f2341ab245 84 };
daniele 0:d7f2341ab245 85
daniele 0:d7f2341ab245 86 int pico_protocols_loop(int loop_score);
daniele 0:d7f2341ab245 87 void pico_protocol_init(struct pico_protocol *p);
daniele 0:d7f2341ab245 88
daniele 0:d7f2341ab245 89 int pico_protocol_datalink_loop(int loop_score, int direction);
daniele 0:d7f2341ab245 90 int pico_protocol_network_loop(int loop_score, int direction);
daniele 0:d7f2341ab245 91 int pico_protocol_transport_loop(int loop_score, int direction);
daniele 0:d7f2341ab245 92 int pico_protocol_socket_loop(int loop_score, int direction);
daniele 0:d7f2341ab245 93
daniele 0:d7f2341ab245 94 #endif