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:
131:4758606c9316
Child:
152:a3d286bf94e5
Update from git masterbranch

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 29:1a47b7151851 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.
daniele 29:1a47b7151851 4
TASS Belgium NV 131:4758606c9316 5 *********************************************************************/
tass picotcp@tass.be 149:5f4cb161cec3 6 #ifndef INCLUDE_PICO_QUEUE
tass picotcp@tass.be 149:5f4cb161cec3 7 #define INCLUDE_PICO_QUEUE
daniele 29:1a47b7151851 8 #include <stdint.h>
daniele 29:1a47b7151851 9 #include "pico_config.h"
daniele 29:1a47b7151851 10 #include "pico_frame.h"
daniele 29:1a47b7151851 11
daniele 29:1a47b7151851 12 #define Q_LIMIT 0
daniele 29:1a47b7151851 13
daniele 29:1a47b7151851 14 #ifndef NULL
daniele 29:1a47b7151851 15 #define NULL ((void *)0)
daniele 29:1a47b7151851 16 #endif
daniele 29:1a47b7151851 17
daniele 29:1a47b7151851 18 struct pico_queue {
TASS Belgium NV 131:4758606c9316 19 uint32_t frames;
TASS Belgium NV 131:4758606c9316 20 uint32_t size;
TASS Belgium NV 131:4758606c9316 21 uint32_t max_frames;
TASS Belgium NV 131:4758606c9316 22 uint32_t max_size;
TASS Belgium NV 131:4758606c9316 23 struct pico_frame *head;
TASS Belgium NV 131:4758606c9316 24 struct pico_frame *tail;
daniele 29:1a47b7151851 25 #ifdef PICO_SUPPORT_MUTEX
TASS Belgium NV 131:4758606c9316 26 void *mutex;
daniele 29:1a47b7151851 27 #endif
TASS Belgium NV 131:4758606c9316 28 uint8_t shared;
TASS Belgium NV 131:4758606c9316 29 uint16_t overhead;
daniele 29:1a47b7151851 30 };
daniele 29:1a47b7151851 31
daniele 29:1a47b7151851 32 #ifdef PICO_SUPPORT_MUTEX
tass picotcp@tass.be 149:5f4cb161cec3 33 #define PICOTCP_MUTEX_LOCK(x) { \
TASS Belgium NV 131:4758606c9316 34 if (x == NULL) \
TASS Belgium NV 131:4758606c9316 35 x = pico_mutex_init(); \
TASS Belgium NV 131:4758606c9316 36 pico_mutex_lock(x); \
daniele 29:1a47b7151851 37 }
tass picotcp@tass.be 149:5f4cb161cec3 38 #define PICOTCP_MUTEX_UNLOCK(x) pico_mutex_unlock(x)
daniele 29:1a47b7151851 39
TASS Belgium NV 131:4758606c9316 40 #else
tass picotcp@tass.be 149:5f4cb161cec3 41 #define PICOTCP_MUTEX_LOCK(x) do {} while(0)
tass picotcp@tass.be 149:5f4cb161cec3 42 #define PICOTCP_MUTEX_UNLOCK(x) do {} while(0)
daniele 29:1a47b7151851 43 #endif
daniele 29:1a47b7151851 44
daniele 29:1a47b7151851 45 #ifdef PICO_SUPPORT_DEBUG_TOOLS
daniele 29:1a47b7151851 46 static void debug_q(struct pico_queue *q)
daniele 29:1a47b7151851 47 {
TASS Belgium NV 131:4758606c9316 48 struct pico_frame *p = q->head;
TASS Belgium NV 131:4758606c9316 49 dbg("%d: ", q->frames);
TASS Belgium NV 131:4758606c9316 50 while(p) {
TASS Belgium NV 131:4758606c9316 51 dbg("(%p)-->", p);
TASS Belgium NV 131:4758606c9316 52 p = p->next;
TASS Belgium NV 131:4758606c9316 53 }
TASS Belgium NV 131:4758606c9316 54 dbg("X\n");
daniele 29:1a47b7151851 55 }
daniele 29:1a47b7151851 56
daniele 29:1a47b7151851 57 #else
daniele 29:1a47b7151851 58
TASS Belgium NV 131:4758606c9316 59 #define debug_q(x) do {} while(0)
daniele 29:1a47b7151851 60 #endif
daniele 29:1a47b7151851 61
tass 70:cd218dd180e5 62 static inline int32_t pico_enqueue(struct pico_queue *q, struct pico_frame *p)
daniele 29:1a47b7151851 63 {
TASS Belgium NV 131:4758606c9316 64 if ((q->max_frames) && (q->max_frames <= q->frames))
TASS Belgium NV 131:4758606c9316 65 return -1;
TASS Belgium NV 131:4758606c9316 66
TASS Belgium NV 131:4758606c9316 67 if ((Q_LIMIT) && (Q_LIMIT < p->buffer_len + q->size))
TASS Belgium NV 131:4758606c9316 68 return -1;
daniele 29:1a47b7151851 69
TASS Belgium NV 131:4758606c9316 70 if ((q->max_size) && (q->max_size < (p->buffer_len + q->size)))
TASS Belgium NV 131:4758606c9316 71 return -1;
TASS Belgium NV 131:4758606c9316 72
TASS Belgium NV 131:4758606c9316 73 if (q->shared)
tass picotcp@tass.be 149:5f4cb161cec3 74 PICOTCP_MUTEX_LOCK(q->mutex);
daniele 29:1a47b7151851 75
TASS Belgium NV 131:4758606c9316 76 p->next = NULL;
TASS Belgium NV 131:4758606c9316 77 if (!q->head) {
TASS Belgium NV 131:4758606c9316 78 q->head = p;
TASS Belgium NV 131:4758606c9316 79 q->tail = p;
TASS Belgium NV 131:4758606c9316 80 q->size = 0;
TASS Belgium NV 131:4758606c9316 81 q->frames = 0;
TASS Belgium NV 131:4758606c9316 82 } else {
TASS Belgium NV 131:4758606c9316 83 q->tail->next = p;
TASS Belgium NV 131:4758606c9316 84 q->tail = p;
TASS Belgium NV 131:4758606c9316 85 }
daniele 29:1a47b7151851 86
TASS Belgium NV 131:4758606c9316 87 q->size += p->buffer_len + q->overhead;
TASS Belgium NV 131:4758606c9316 88 q->frames++;
TASS Belgium NV 131:4758606c9316 89 debug_q(q);
TASS Belgium NV 131:4758606c9316 90
TASS Belgium NV 131:4758606c9316 91 if (q->shared)
tass picotcp@tass.be 149:5f4cb161cec3 92 PICOTCP_MUTEX_UNLOCK(q->mutex);
TASS Belgium NV 131:4758606c9316 93
TASS Belgium NV 131:4758606c9316 94 return (int32_t)q->size;
daniele 29:1a47b7151851 95 }
daniele 29:1a47b7151851 96
daniele 29:1a47b7151851 97 static inline struct pico_frame *pico_dequeue(struct pico_queue *q)
daniele 29:1a47b7151851 98 {
TASS Belgium NV 131:4758606c9316 99 struct pico_frame *p = q->head;
tass picotcp@tass.be 149:5f4cb161cec3 100 if (!p)
tass picotcp@tass.be 149:5f4cb161cec3 101 return NULL;
tass picotcp@tass.be 149:5f4cb161cec3 102
TASS Belgium NV 131:4758606c9316 103 if (q->frames < 1)
TASS Belgium NV 131:4758606c9316 104 return NULL;
TASS Belgium NV 131:4758606c9316 105
TASS Belgium NV 131:4758606c9316 106 if (q->shared)
tass picotcp@tass.be 149:5f4cb161cec3 107 PICOTCP_MUTEX_LOCK(q->mutex);
daniele 29:1a47b7151851 108
TASS Belgium NV 131:4758606c9316 109 q->head = p->next;
TASS Belgium NV 131:4758606c9316 110 q->frames--;
TASS Belgium NV 131:4758606c9316 111 q->size -= p->buffer_len - q->overhead;
TASS Belgium NV 131:4758606c9316 112 if (q->head == NULL)
TASS Belgium NV 131:4758606c9316 113 q->tail = NULL;
TASS Belgium NV 131:4758606c9316 114
TASS Belgium NV 131:4758606c9316 115 debug_q(q);
tass picotcp@tass.be 149:5f4cb161cec3 116
TASS Belgium NV 131:4758606c9316 117 p->next = NULL;
TASS Belgium NV 131:4758606c9316 118 if (q->shared)
tass picotcp@tass.be 149:5f4cb161cec3 119 PICOTCP_MUTEX_UNLOCK(q->mutex);
TASS Belgium NV 131:4758606c9316 120
TASS Belgium NV 131:4758606c9316 121 return p;
daniele 29:1a47b7151851 122 }
daniele 29:1a47b7151851 123
daniele 29:1a47b7151851 124 static inline struct pico_frame *pico_queue_peek(struct pico_queue *q)
daniele 29:1a47b7151851 125 {
TASS Belgium NV 131:4758606c9316 126 struct pico_frame *p = q->head;
TASS Belgium NV 131:4758606c9316 127 if (q->frames < 1)
TASS Belgium NV 131:4758606c9316 128 return NULL;
TASS Belgium NV 131:4758606c9316 129
TASS Belgium NV 131:4758606c9316 130 debug_q(q);
TASS Belgium NV 131:4758606c9316 131 return p;
daniele 29:1a47b7151851 132 }
daniele 29:1a47b7151851 133
daniele 29:1a47b7151851 134 static inline void pico_queue_empty(struct pico_queue *q)
daniele 29:1a47b7151851 135 {
TASS Belgium NV 131:4758606c9316 136 struct pico_frame *p = pico_dequeue(q);
TASS Belgium NV 131:4758606c9316 137 while(p) {
tass picotcp@tass.be 149:5f4cb161cec3 138 PICO_FREE(p);
TASS Belgium NV 131:4758606c9316 139 p = pico_dequeue(q);
TASS Belgium NV 131:4758606c9316 140 }
daniele 29:1a47b7151851 141 }
daniele 29:1a47b7151851 142
daniele 29:1a47b7151851 143 static inline void pico_queue_protect(struct pico_queue *q)
daniele 29:1a47b7151851 144 {
TASS Belgium NV 131:4758606c9316 145 q->shared = 1;
daniele 29:1a47b7151851 146 }
daniele 29:1a47b7151851 147
daniele 29:1a47b7151851 148 #endif