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:
Fri May 17 12:09:59 2013 +0000
Revision:
1:cfe8984a32b4
Parent:
libraries/picotcp/include/pico_queue.h@0:d7f2341ab245
Update for smaller SOCKETQ

Who changed what in which revision?

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