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 19 13:06:00 2013 +0000
Revision:
66:71a2ef45a035
Parent:
63:97f481e33cb2
Parent:
65:8cdaaa1df01d
Merged branches.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 10:dd7111d4279f 1 /*********************************************************************
daniele 10:dd7111d4279f 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 10:dd7111d4279f 3 See LICENSE and COPYING for usage.
daniele 10:dd7111d4279f 4
daniele 10:dd7111d4279f 5 *********************************************************************/
daniele 10:dd7111d4279f 6 #ifndef _INCLUDE_PICO_CONST
daniele 10:dd7111d4279f 7 #define _INCLUDE_PICO_CONST
daniele 10:dd7111d4279f 8 /* Included from pico_config.h */
daniele 10:dd7111d4279f 9 /** Endian-dependant constants **/
daniele 10:dd7111d4279f 10
daniele 10:dd7111d4279f 11 extern volatile unsigned long pico_tick;
daniele 10:dd7111d4279f 12
daniele 10:dd7111d4279f 13 #ifdef PICO_BIGENDIAN
daniele 10:dd7111d4279f 14
daniele 10:dd7111d4279f 15 # define PICO_IDETH_IPV4 0x0800
daniele 10:dd7111d4279f 16 # define PICO_IDETH_ARP 0x0806
daniele 10:dd7111d4279f 17 # define PICO_IDETH_IPV6 0x86DD
daniele 10:dd7111d4279f 18
daniele 10:dd7111d4279f 19 # define PICO_ARP_REQUEST 0x0001
daniele 10:dd7111d4279f 20 # define PICO_ARP_REPLY 0x0002
daniele 10:dd7111d4279f 21 # define PICO_ARP_HTYPE_ETH 0x0001
daniele 10:dd7111d4279f 22
daniele 10:dd7111d4279f 23 #define short_be(x) (x)
daniele 10:dd7111d4279f 24 #define long_be(x) (x)
daniele 10:dd7111d4279f 25
daniele 10:dd7111d4279f 26 static inline uint16_t short_from(void *_p)
daniele 10:dd7111d4279f 27 {
daniele 10:dd7111d4279f 28 unsigned char *p = (unsigned char *)_p;
daniele 10:dd7111d4279f 29 uint16_t r, p0, p1;
daniele 10:dd7111d4279f 30 p0 = p[0];
daniele 10:dd7111d4279f 31 p1 = p[1];
daniele 10:dd7111d4279f 32 r = (p0 << 8) + p1;
daniele 10:dd7111d4279f 33 return r;
daniele 10:dd7111d4279f 34 }
daniele 10:dd7111d4279f 35
daniele 10:dd7111d4279f 36 static inline uint32_t long_from(void *_p)
daniele 10:dd7111d4279f 37 {
daniele 10:dd7111d4279f 38 unsigned char *p = (unsigned char *)_p;
daniele 10:dd7111d4279f 39 uint32_t r, p0, p1, p2, p3;
daniele 10:dd7111d4279f 40 p0 = p[0];
daniele 10:dd7111d4279f 41 p1 = p[1];
daniele 10:dd7111d4279f 42 p2 = p[2];
daniele 10:dd7111d4279f 43 p3 = p[3];
daniele 10:dd7111d4279f 44 r = (p0 << 24) + (p1 << 16) + (p2 << 8) + p3;
daniele 10:dd7111d4279f 45 return r;
daniele 10:dd7111d4279f 46 }
daniele 10:dd7111d4279f 47
daniele 10:dd7111d4279f 48 #else
daniele 10:dd7111d4279f 49
daniele 10:dd7111d4279f 50 static inline uint16_t short_from(void *_p)
daniele 10:dd7111d4279f 51 {
daniele 10:dd7111d4279f 52 unsigned char *p = (unsigned char *)_p;
daniele 10:dd7111d4279f 53 uint16_t r, p0, p1;
daniele 10:dd7111d4279f 54 p0 = p[0];
daniele 10:dd7111d4279f 55 p1 = p[1];
daniele 10:dd7111d4279f 56 r = (p1 << 8) + p0;
daniele 10:dd7111d4279f 57 return r;
daniele 10:dd7111d4279f 58 }
daniele 10:dd7111d4279f 59
daniele 10:dd7111d4279f 60 static inline uint32_t long_from(void *_p)
daniele 10:dd7111d4279f 61 {
daniele 10:dd7111d4279f 62 unsigned char *p = (unsigned char *)_p;
daniele 10:dd7111d4279f 63 uint32_t r, p0, p1, p2, p3;
daniele 10:dd7111d4279f 64 p0 = p[0];
daniele 10:dd7111d4279f 65 p1 = p[1];
daniele 10:dd7111d4279f 66 p2 = p[2];
daniele 10:dd7111d4279f 67 p3 = p[3];
daniele 10:dd7111d4279f 68 r = (p3 << 24) + (p2 << 16) + (p1 << 8) + p0;
daniele 10:dd7111d4279f 69 return r;
daniele 10:dd7111d4279f 70 }
daniele 10:dd7111d4279f 71
daniele 10:dd7111d4279f 72
daniele 10:dd7111d4279f 73 # define PICO_IDETH_IPV4 0x0008
daniele 10:dd7111d4279f 74 # define PICO_IDETH_ARP 0x0608
daniele 10:dd7111d4279f 75 # define PICO_IDETH_IPV6 0xDD86
daniele 10:dd7111d4279f 76
daniele 10:dd7111d4279f 77 # define PICO_ARP_REQUEST 0x0100
daniele 10:dd7111d4279f 78 # define PICO_ARP_REPLY 0x0200
daniele 10:dd7111d4279f 79 # define PICO_ARP_HTYPE_ETH 0x0100
daniele 10:dd7111d4279f 80
daniele 10:dd7111d4279f 81 static inline uint16_t short_be(uint16_t le)
daniele 10:dd7111d4279f 82 {
daniele 10:dd7111d4279f 83 return ((le & 0xFF) << 8) | ((le >> 8) & 0xFF);
daniele 10:dd7111d4279f 84 }
daniele 10:dd7111d4279f 85
daniele 10:dd7111d4279f 86 static inline uint32_t long_be(uint32_t le)
daniele 10:dd7111d4279f 87 {
daniele 10:dd7111d4279f 88 uint8_t *b = (uint8_t *)&le;
daniele 10:dd7111d4279f 89 uint32_t be = 0;
daniele 10:dd7111d4279f 90 uint32_t b0, b1, b2;
daniele 10:dd7111d4279f 91 b0 = b[0];
daniele 10:dd7111d4279f 92 b1 = b[1];
daniele 10:dd7111d4279f 93 b2 = b[2];
daniele 10:dd7111d4279f 94 be = b[3] + (b2 << 8) + (b1 << 16) + (b0 << 24);
daniele 10:dd7111d4279f 95 return be;
daniele 10:dd7111d4279f 96 }
daniele 10:dd7111d4279f 97 #endif
daniele 10:dd7111d4279f 98
daniele 10:dd7111d4279f 99
daniele 10:dd7111d4279f 100 /* Add well-known host numbers here. (bigendian constants only beyond this point) */
daniele 10:dd7111d4279f 101 #define PICO_IP4_ANY (0x00000000U)
daniele 10:dd7111d4279f 102 #define PICO_IP4_BCAST (0xffffffffU)
daniele 10:dd7111d4279f 103
daniele 10:dd7111d4279f 104 /* defined in modules/pico_ipv6.c */
daniele 10:dd7111d4279f 105 #ifdef PICO_SUPPORT_IPV6
daniele 10:dd7111d4279f 106 extern const uint8_t PICO_IPV6_ANY[PICO_SIZE_IP6];
daniele 10:dd7111d4279f 107 #endif
daniele 10:dd7111d4279f 108
tass 63:97f481e33cb2 109 static inline uint32_t pico_hash(char *name)
daniele 10:dd7111d4279f 110 {
daniele 10:dd7111d4279f 111 unsigned long hash = 5381;
daniele 10:dd7111d4279f 112 int c;
tass 65:8cdaaa1df01d 113 while ((c = *name++) != 0)
daniele 10:dd7111d4279f 114 hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
daniele 10:dd7111d4279f 115 return hash;
daniele 10:dd7111d4279f 116 }
daniele 10:dd7111d4279f 117
daniele 10:dd7111d4279f 118 /* Debug */
daniele 10:dd7111d4279f 119 //#define PICO_SUPPORT_DEBUG_MEMORY
daniele 10:dd7111d4279f 120 //#define PICO_SUPPORT_DEBUG_TOOLS
daniele 10:dd7111d4279f 121 #endif