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 Belgium NV
Date:
Mon Dec 16 11:25:54 2013 +0100
Revision:
131:4758606c9316
Parent:
110:0ece1bbbd36e
Child:
149:5f4cb161cec3
Syncronized with master branch

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 *********************************************************************/
daniele 29:1a47b7151851 6 #ifndef _INCLUDE_PICO_QUEUE
daniele 29:1a47b7151851 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 Belgium NV 131:4758606c9316 33 #define 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 Belgium NV 131:4758606c9316 38 #define UNLOCK(x) pico_mutex_unlock(x)
daniele 29:1a47b7151851 39
TASS Belgium NV 131:4758606c9316 40 #else
TASS Belgium NV 131:4758606c9316 41 #define LOCK(x) do {} while(0)
TASS Belgium NV 131:4758606c9316 42 #define 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 Belgium NV 131:4758606c9316 74 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 Belgium NV 131:4758606c9316 92 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 Belgium NV 131:4758606c9316 100 if (q->frames < 1)
TASS Belgium NV 131:4758606c9316 101 return NULL;
TASS Belgium NV 131:4758606c9316 102
TASS Belgium NV 131:4758606c9316 103 if (q->shared)
TASS Belgium NV 131:4758606c9316 104 LOCK(q->mutex);
daniele 29:1a47b7151851 105
TASS Belgium NV 131:4758606c9316 106 q->head = p->next;
TASS Belgium NV 131:4758606c9316 107 q->frames--;
TASS Belgium NV 131:4758606c9316 108 q->size -= p->buffer_len - q->overhead;
TASS Belgium NV 131:4758606c9316 109 if (q->head == NULL)
TASS Belgium NV 131:4758606c9316 110 q->tail = NULL;
TASS Belgium NV 131:4758606c9316 111
TASS Belgium NV 131:4758606c9316 112 debug_q(q);
TASS Belgium NV 131:4758606c9316 113 p->next = NULL;
TASS Belgium NV 131:4758606c9316 114 if (q->shared)
TASS Belgium NV 131:4758606c9316 115 UNLOCK(q->mutex);
TASS Belgium NV 131:4758606c9316 116
TASS Belgium NV 131:4758606c9316 117 return p;
daniele 29:1a47b7151851 118 }
daniele 29:1a47b7151851 119
daniele 29:1a47b7151851 120 static inline struct pico_frame *pico_queue_peek(struct pico_queue *q)
daniele 29:1a47b7151851 121 {
TASS Belgium NV 131:4758606c9316 122 struct pico_frame *p = q->head;
TASS Belgium NV 131:4758606c9316 123 if (q->frames < 1)
TASS Belgium NV 131:4758606c9316 124 return NULL;
TASS Belgium NV 131:4758606c9316 125
TASS Belgium NV 131:4758606c9316 126 debug_q(q);
TASS Belgium NV 131:4758606c9316 127 return p;
daniele 29:1a47b7151851 128 }
daniele 29:1a47b7151851 129
daniele 29:1a47b7151851 130 static inline void pico_queue_empty(struct pico_queue *q)
daniele 29:1a47b7151851 131 {
TASS Belgium NV 131:4758606c9316 132 struct pico_frame *p = pico_dequeue(q);
TASS Belgium NV 131:4758606c9316 133 while(p) {
TASS Belgium NV 131:4758606c9316 134 pico_free(p);
TASS Belgium NV 131:4758606c9316 135 p = pico_dequeue(q);
TASS Belgium NV 131:4758606c9316 136 }
daniele 29:1a47b7151851 137 }
daniele 29:1a47b7151851 138
daniele 29:1a47b7151851 139 static inline void pico_queue_protect(struct pico_queue *q)
daniele 29:1a47b7151851 140 {
TASS Belgium NV 131:4758606c9316 141 q->shared = 1;
daniele 29:1a47b7151851 142 }
daniele 29:1a47b7151851 143
daniele 29:1a47b7151851 144 #endif