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 picotcp@tass.be
Date:
Wed Apr 09 14:31:41 2014 +0200
Revision:
149:5f4cb161cec3
Parent:
137:a1c8bfa9d691
Child:
152:a3d286bf94e5
Update from git masterbranch

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tass 68:0847e35d08a6 1 /*********************************************************************
TASS Belgium NV 131:4758606c9316 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
TASS Belgium NV 131:4758606c9316 3 See LICENSE and COPYING for usage.
tass 68:0847e35d08a6 4
TASS Belgium NV 131:4758606c9316 5 *********************************************************************/
tass picotcp@tass.be 149:5f4cb161cec3 6 #ifndef INCLUDE_PICO_CONST
tass picotcp@tass.be 149:5f4cb161cec3 7 #define INCLUDE_PICO_CONST
tass 68:0847e35d08a6 8 /* Included from pico_config.h */
tass picotcp@tass.be 149:5f4cb161cec3 9
tass picotcp@tass.be 149:5f4cb161cec3 10 /** Non-endian dependant constants */
tass picotcp@tass.be 149:5f4cb161cec3 11 #define PICO_SIZE_IP4 4
tass picotcp@tass.be 149:5f4cb161cec3 12 #define PICO_SIZE_IP6 16
tass picotcp@tass.be 149:5f4cb161cec3 13 #define PICO_SIZE_ETH 6
tass picotcp@tass.be 149:5f4cb161cec3 14 #define PICO_SIZE_TRANS 8
tass picotcp@tass.be 149:5f4cb161cec3 15
tass 68:0847e35d08a6 16 /** Endian-dependant constants **/
tass 128:ae39e6e81531 17 typedef uint64_t pico_time;
tass 128:ae39e6e81531 18 extern volatile uint64_t pico_tick;
tass 68:0847e35d08a6 19
tass 68:0847e35d08a6 20 #ifdef PICO_BIGENDIAN
tass 68:0847e35d08a6 21
tass 68:0847e35d08a6 22 # define PICO_IDETH_IPV4 0x0800
tass 68:0847e35d08a6 23 # define PICO_IDETH_ARP 0x0806
tass 68:0847e35d08a6 24 # define PICO_IDETH_IPV6 0x86DD
tass 68:0847e35d08a6 25
tass 68:0847e35d08a6 26 # define PICO_ARP_REQUEST 0x0001
tass 68:0847e35d08a6 27 # define PICO_ARP_REPLY 0x0002
tass 68:0847e35d08a6 28 # define PICO_ARP_HTYPE_ETH 0x0001
tass 68:0847e35d08a6 29
tass 68:0847e35d08a6 30 #define short_be(x) (x)
tass 68:0847e35d08a6 31 #define long_be(x) (x)
tass 70:cd218dd180e5 32 #define long_long_be(x) (x)
tass 68:0847e35d08a6 33
tass 68:0847e35d08a6 34 static inline uint16_t short_from(void *_p)
tass 68:0847e35d08a6 35 {
TASS Belgium NV 131:4758606c9316 36 unsigned char *p = (unsigned char *)_p;
TASS Belgium NV 131:4758606c9316 37 uint16_t r, p0, p1;
TASS Belgium NV 131:4758606c9316 38 p0 = p[0];
TASS Belgium NV 131:4758606c9316 39 p1 = p[1];
TASS Belgium NV 131:4758606c9316 40 r = (p0 << 8) + p1;
TASS Belgium NV 131:4758606c9316 41 return r;
tass 68:0847e35d08a6 42 }
tass 68:0847e35d08a6 43
tass 68:0847e35d08a6 44 static inline uint32_t long_from(void *_p)
tass 68:0847e35d08a6 45 {
TASS Belgium NV 131:4758606c9316 46 unsigned char *p = (unsigned char *)_p;
TASS Belgium NV 131:4758606c9316 47 uint32_t r, p0, p1, p2, p3;
TASS Belgium NV 131:4758606c9316 48 p0 = p[0];
TASS Belgium NV 131:4758606c9316 49 p1 = p[1];
TASS Belgium NV 131:4758606c9316 50 p2 = p[2];
TASS Belgium NV 131:4758606c9316 51 p3 = p[3];
TASS Belgium NV 131:4758606c9316 52 r = (p0 << 24) + (p1 << 16) + (p2 << 8) + p3;
TASS Belgium NV 131:4758606c9316 53 return r;
tass 68:0847e35d08a6 54 }
tass 68:0847e35d08a6 55
tass 68:0847e35d08a6 56 #else
tass 68:0847e35d08a6 57
tass 68:0847e35d08a6 58 static inline uint16_t short_from(void *_p)
tass 68:0847e35d08a6 59 {
TASS Belgium NV 131:4758606c9316 60 unsigned char *p = (unsigned char *)_p;
TASS Belgium NV 131:4758606c9316 61 uint16_t r, _p0, _p1;
TASS Belgium NV 131:4758606c9316 62 _p0 = p[0];
TASS Belgium NV 131:4758606c9316 63 _p1 = p[1];
TASS Belgium NV 131:4758606c9316 64 r = (uint16_t)((_p1 << 8u) + _p0);
TASS Belgium NV 131:4758606c9316 65 return r;
tass 68:0847e35d08a6 66 }
tass 68:0847e35d08a6 67
tass 68:0847e35d08a6 68 static inline uint32_t long_from(void *_p)
tass 68:0847e35d08a6 69 {
TASS Belgium NV 131:4758606c9316 70 unsigned char *p = (unsigned char *)_p;
TASS Belgium NV 131:4758606c9316 71 uint32_t r, _p0, _p1, _p2, _p3;
TASS Belgium NV 131:4758606c9316 72 _p0 = p[0];
TASS Belgium NV 131:4758606c9316 73 _p1 = p[1];
TASS Belgium NV 131:4758606c9316 74 _p2 = p[2];
TASS Belgium NV 131:4758606c9316 75 _p3 = p[3];
TASS Belgium NV 131:4758606c9316 76 r = (_p3 << 24) + (_p2 << 16) + (_p1 << 8) + _p0;
TASS Belgium NV 131:4758606c9316 77 return r;
tass 68:0847e35d08a6 78 }
tass 68:0847e35d08a6 79
tass 68:0847e35d08a6 80
tass 68:0847e35d08a6 81 # define PICO_IDETH_IPV4 0x0008
tass 68:0847e35d08a6 82 # define PICO_IDETH_ARP 0x0608
tass 68:0847e35d08a6 83 # define PICO_IDETH_IPV6 0xDD86
tass 68:0847e35d08a6 84
tass 68:0847e35d08a6 85 # define PICO_ARP_REQUEST 0x0100
tass 68:0847e35d08a6 86 # define PICO_ARP_REPLY 0x0200
tass 68:0847e35d08a6 87 # define PICO_ARP_HTYPE_ETH 0x0100
tass 68:0847e35d08a6 88
tass 68:0847e35d08a6 89 static inline uint16_t short_be(uint16_t le)
tass 68:0847e35d08a6 90 {
TASS Belgium NV 131:4758606c9316 91 return (uint16_t)(((le & 0xFFu) << 8) | ((le >> 8u) & 0xFFu));
tass 68:0847e35d08a6 92 }
tass 68:0847e35d08a6 93
tass 68:0847e35d08a6 94 static inline uint32_t long_be(uint32_t le)
tass 68:0847e35d08a6 95 {
TASS Belgium NV 131:4758606c9316 96 uint8_t *b = (uint8_t *)&le;
TASS Belgium NV 131:4758606c9316 97 uint32_t be = 0;
TASS Belgium NV 131:4758606c9316 98 uint32_t b0, b1, b2;
TASS Belgium NV 131:4758606c9316 99 b0 = b[0];
TASS Belgium NV 131:4758606c9316 100 b1 = b[1];
TASS Belgium NV 131:4758606c9316 101 b2 = b[2];
TASS Belgium NV 131:4758606c9316 102 be = b[3] + (b2 << 8) + (b1 << 16) + (b0 << 24);
TASS Belgium NV 131:4758606c9316 103 return be;
tass 68:0847e35d08a6 104 }
tass 70:cd218dd180e5 105 static inline uint64_t long_long_be(uint64_t le)
tass 70:cd218dd180e5 106 {
TASS Belgium NV 131:4758606c9316 107 uint8_t *b = (uint8_t *)&le;
TASS Belgium NV 131:4758606c9316 108 uint64_t be = 0;
TASS Belgium NV 131:4758606c9316 109 uint64_t b0, b1, b2, b3, b4, b5, b6;
TASS Belgium NV 131:4758606c9316 110 b0 = b[0];
TASS Belgium NV 131:4758606c9316 111 b1 = b[1];
TASS Belgium NV 131:4758606c9316 112 b2 = b[2];
TASS Belgium NV 131:4758606c9316 113 b3 = b[3];
TASS Belgium NV 131:4758606c9316 114 b4 = b[4];
TASS Belgium NV 131:4758606c9316 115 b5 = b[5];
TASS Belgium NV 131:4758606c9316 116 b6 = b[6];
TASS Belgium NV 131:4758606c9316 117 be = b[7] + (b6 << 8) + (b5 << 16) + (b4 << 24) + (b3 << 32) + (b2 << 40) + (b1 << 48) + (b0 << 56);
TASS Belgium NV 131:4758606c9316 118 return be;
tass 70:cd218dd180e5 119 }
tass 68:0847e35d08a6 120 #endif
tass 68:0847e35d08a6 121
tass picotcp@tass.be 133:5b075f5e141a 122 /*** *** *** *** *** *** ***
tass picotcp@tass.be 133:5b075f5e141a 123 *** ARP CONFIG ***
tass picotcp@tass.be 133:5b075f5e141a 124 *** *** *** *** *** *** ***/
tass picotcp@tass.be 149:5f4cb161cec3 125
tass picotcp@tass.be 149:5f4cb161cec3 126 #include "pico_addressing.h"
tass picotcp@tass.be 149:5f4cb161cec3 127
tass picotcp@tass.be 133:5b075f5e141a 128 /* Maximum amount of accepted ARP requests per burst interval */
tass picotcp@tass.be 133:5b075f5e141a 129 #define PICO_ARP_MAX_RATE 1
tass picotcp@tass.be 133:5b075f5e141a 130 /* Duration of the burst interval in milliseconds */
tass picotcp@tass.be 133:5b075f5e141a 131 #define PICO_ARP_INTERVAL 1000
tass 68:0847e35d08a6 132
tass 68:0847e35d08a6 133 /* Add well-known host numbers here. (bigendian constants only beyond this point) */
tass 68:0847e35d08a6 134 #define PICO_IP4_ANY (0x00000000U)
tass 68:0847e35d08a6 135 #define PICO_IP4_BCAST (0xffffffffU)
tass 68:0847e35d08a6 136
tass 68:0847e35d08a6 137 /* defined in modules/pico_ipv6.c */
tass 68:0847e35d08a6 138 #ifdef PICO_SUPPORT_IPV6
tass 68:0847e35d08a6 139 extern const uint8_t PICO_IPV6_ANY[PICO_SIZE_IP6];
tass 68:0847e35d08a6 140 #endif
tass 68:0847e35d08a6 141
tass picotcp@tass.be 133:5b075f5e141a 142 static inline uint32_t pico_hash(const void *buf, uint32_t size)
tass 68:0847e35d08a6 143 {
TASS Belgium NV 131:4758606c9316 144 uint32_t hash = 5381;
tass picotcp@tass.be 133:5b075f5e141a 145 uint32_t i;
tass picotcp@tass.be 137:a1c8bfa9d691 146 const uint8_t *ptr = (const uint8_t *)buf;
tass picotcp@tass.be 133:5b075f5e141a 147 for(i = 0; i < size; i++)
tass picotcp@tass.be 133:5b075f5e141a 148 hash = ((hash << 5) + hash) + ptr[i]; /* hash * 33 + char */
TASS Belgium NV 131:4758606c9316 149 return hash;
tass 68:0847e35d08a6 150 }
tass 68:0847e35d08a6 151
tass 68:0847e35d08a6 152 /* Debug */
TASS Belgium NV 131:4758606c9316 153 /* #define PICO_SUPPORT_DEBUG_MEMORY */
TASS Belgium NV 131:4758606c9316 154 /* #define PICO_SUPPORT_DEBUG_TOOLS */
tass 68:0847e35d08a6 155 #endif