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:
daniele
Date:
Thu Jun 06 07:09:23 2013 +0000
Revision:
12:0c6fa180a6ec
Child:
24:8bff2b51ea3b
Update from masterbranch;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 12:0c6fa180a6ec 1 /*********************************************************************
daniele 12:0c6fa180a6ec 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 12:0c6fa180a6ec 3 See LICENSE and COPYING for usage.
daniele 12:0c6fa180a6ec 4
daniele 12:0c6fa180a6ec 5 *********************************************************************/
daniele 12:0c6fa180a6ec 6 #ifndef _INCLUDE_PICO_QUEUE
daniele 12:0c6fa180a6ec 7 #define _INCLUDE_PICO_QUEUE
daniele 12:0c6fa180a6ec 8 #include <stdint.h>
daniele 12:0c6fa180a6ec 9 #include "pico_config.h"
daniele 12:0c6fa180a6ec 10 #include "pico_frame.h"
daniele 12:0c6fa180a6ec 11
daniele 12:0c6fa180a6ec 12 #ifndef NULL
daniele 12:0c6fa180a6ec 13 #define NULL ((void *)0)
daniele 12:0c6fa180a6ec 14 #endif
daniele 12:0c6fa180a6ec 15
daniele 12:0c6fa180a6ec 16 struct pico_queue {
daniele 12:0c6fa180a6ec 17 uint32_t frames;
daniele 12:0c6fa180a6ec 18 uint32_t size;
daniele 12:0c6fa180a6ec 19 uint32_t max_frames;
daniele 12:0c6fa180a6ec 20 uint32_t max_size;
daniele 12:0c6fa180a6ec 21 struct pico_frame *head;
daniele 12:0c6fa180a6ec 22 struct pico_frame *tail;
daniele 12:0c6fa180a6ec 23 #ifdef PICO_SUPPORT_MUTEX
daniele 12:0c6fa180a6ec 24 void * mutex;
daniele 12:0c6fa180a6ec 25 #endif
daniele 12:0c6fa180a6ec 26 uint8_t shared;
daniele 12:0c6fa180a6ec 27 };
daniele 12:0c6fa180a6ec 28
daniele 12:0c6fa180a6ec 29 #ifdef PICO_SUPPORT_MUTEX
daniele 12:0c6fa180a6ec 30 #define LOCK(x) {\
daniele 12:0c6fa180a6ec 31 if (x == NULL) \
daniele 12:0c6fa180a6ec 32 x = pico_mutex_init(); \
daniele 12:0c6fa180a6ec 33 pico_mutex_lock(x); \
daniele 12:0c6fa180a6ec 34 }
daniele 12:0c6fa180a6ec 35 #define UNLOCK(x) pico_mutex_unlock(x);
daniele 12:0c6fa180a6ec 36
daniele 12:0c6fa180a6ec 37 #else
daniele 12:0c6fa180a6ec 38 #define LOCK(x) do{}while(0)
daniele 12:0c6fa180a6ec 39 #define UNLOCK(x) do{}while(0)
daniele 12:0c6fa180a6ec 40 #endif
daniele 12:0c6fa180a6ec 41
daniele 12:0c6fa180a6ec 42 #ifdef PICO_SUPPORT_DEBUG_TOOLS
daniele 12:0c6fa180a6ec 43 static void debug_q(struct pico_queue *q)
daniele 12:0c6fa180a6ec 44 {
daniele 12:0c6fa180a6ec 45 struct pico_frame *p = q->head;
daniele 12:0c6fa180a6ec 46 dbg("%d: ", q->frames);
daniele 12:0c6fa180a6ec 47 while(p) {
daniele 12:0c6fa180a6ec 48 dbg("(%p)-->", p);
daniele 12:0c6fa180a6ec 49 p = p->next;
daniele 12:0c6fa180a6ec 50 }
daniele 12:0c6fa180a6ec 51 dbg("X\n");
daniele 12:0c6fa180a6ec 52 }
daniele 12:0c6fa180a6ec 53
daniele 12:0c6fa180a6ec 54 #else
daniele 12:0c6fa180a6ec 55
daniele 12:0c6fa180a6ec 56 #define debug_q(x) do{}while(0)
daniele 12:0c6fa180a6ec 57 #endif
daniele 12:0c6fa180a6ec 58
daniele 12:0c6fa180a6ec 59 static inline int pico_enqueue(struct pico_queue *q, struct pico_frame *p)
daniele 12:0c6fa180a6ec 60 {
daniele 12:0c6fa180a6ec 61 if ((q->max_frames) && (q->max_frames <= q->frames))
daniele 12:0c6fa180a6ec 62 return -1;
daniele 12:0c6fa180a6ec 63
daniele 12:0c6fa180a6ec 64 if ((q->max_size) && (q->max_size < (p->buffer_len + q->size)))
daniele 12:0c6fa180a6ec 65 return -1;
daniele 12:0c6fa180a6ec 66
daniele 12:0c6fa180a6ec 67 if (q->shared)
daniele 12:0c6fa180a6ec 68 LOCK(q->mutex);
daniele 12:0c6fa180a6ec 69
daniele 12:0c6fa180a6ec 70 p->next = NULL;
daniele 12:0c6fa180a6ec 71 if (!q->head) {
daniele 12:0c6fa180a6ec 72 q->head = p;
daniele 12:0c6fa180a6ec 73 q->tail = p;
daniele 12:0c6fa180a6ec 74 q->size = 0;
daniele 12:0c6fa180a6ec 75 q->frames = 0;
daniele 12:0c6fa180a6ec 76 } else {
daniele 12:0c6fa180a6ec 77 q->tail->next = p;
daniele 12:0c6fa180a6ec 78 q->tail = p;
daniele 12:0c6fa180a6ec 79 }
daniele 12:0c6fa180a6ec 80 q->size += p->buffer_len;
daniele 12:0c6fa180a6ec 81 q->frames++;
daniele 12:0c6fa180a6ec 82 debug_q(q);
daniele 12:0c6fa180a6ec 83
daniele 12:0c6fa180a6ec 84 if (q->shared)
daniele 12:0c6fa180a6ec 85 UNLOCK(q->mutex);
daniele 12:0c6fa180a6ec 86 return q->size;
daniele 12:0c6fa180a6ec 87 }
daniele 12:0c6fa180a6ec 88
daniele 12:0c6fa180a6ec 89 static inline struct pico_frame *pico_dequeue(struct pico_queue *q)
daniele 12:0c6fa180a6ec 90 {
daniele 12:0c6fa180a6ec 91 struct pico_frame *p = q->head;
daniele 12:0c6fa180a6ec 92 if (q->frames < 1)
daniele 12:0c6fa180a6ec 93 return NULL;
daniele 12:0c6fa180a6ec 94 if (q->shared)
daniele 12:0c6fa180a6ec 95 LOCK(q->mutex);
daniele 12:0c6fa180a6ec 96
daniele 12:0c6fa180a6ec 97 q->head = p->next;
daniele 12:0c6fa180a6ec 98 q->frames--;
daniele 12:0c6fa180a6ec 99 q->size -= p->buffer_len;
daniele 12:0c6fa180a6ec 100 if (q->head == NULL)
daniele 12:0c6fa180a6ec 101 q->tail = NULL;
daniele 12:0c6fa180a6ec 102 debug_q(q);
daniele 12:0c6fa180a6ec 103 p->next = NULL;
daniele 12:0c6fa180a6ec 104 if (q->shared)
daniele 12:0c6fa180a6ec 105 UNLOCK(q->mutex);
daniele 12:0c6fa180a6ec 106 return p;
daniele 12:0c6fa180a6ec 107 }
daniele 12:0c6fa180a6ec 108
daniele 12:0c6fa180a6ec 109 static inline struct pico_frame *pico_queue_peek(struct pico_queue *q)
daniele 12:0c6fa180a6ec 110 {
daniele 12:0c6fa180a6ec 111 struct pico_frame *p = q->head;
daniele 12:0c6fa180a6ec 112 if (q->frames < 1)
daniele 12:0c6fa180a6ec 113 return NULL;
daniele 12:0c6fa180a6ec 114 debug_q(q);
daniele 12:0c6fa180a6ec 115 return p;
daniele 12:0c6fa180a6ec 116 }
daniele 12:0c6fa180a6ec 117
daniele 12:0c6fa180a6ec 118 static inline void pico_queue_empty(struct pico_queue *q)
daniele 12:0c6fa180a6ec 119 {
daniele 12:0c6fa180a6ec 120 struct pico_frame *p = pico_dequeue(q);
daniele 12:0c6fa180a6ec 121 while(p) {
daniele 12:0c6fa180a6ec 122 pico_free(p);
daniele 12:0c6fa180a6ec 123 p = pico_dequeue(q);
daniele 12:0c6fa180a6ec 124 }
daniele 12:0c6fa180a6ec 125 }
daniele 12:0c6fa180a6ec 126
daniele 12:0c6fa180a6ec 127 static inline void pico_queue_protect(struct pico_queue *q)
daniele 12:0c6fa180a6ec 128 {
daniele 12:0c6fa180a6ec 129 q->shared = 1;
daniele 12:0c6fa180a6ec 130 }
daniele 12:0c6fa180a6ec 131
daniele 12:0c6fa180a6ec 132 #endif