Rewrite from scratch a TCP/IP stack for mbed. So far the following parts are usable: Drivers: - EMAC driver (from CMSIS 2.0) Protocols: - Ethernet protocol - ARP over ethernet for IPv4 - IPv4 over Ethernet - ICMPv4 over IPv4 - UDPv4 over IPv4 APIs: - Sockets for UDPv4 The structure of this stack is designed to be very modular. Each protocol can register one or more protocol to handle its payload, and in each protocol, an API can be hooked (like Sockets for example). This is an early release.

Committer:
Benoit
Date:
Sun Jun 26 09:56:31 2011 +0000
Revision:
7:8e12f7357b9f
Parent:
5:3cd83fcb1467
Added IPv4 global broadcast address to processed frames inside IPv4 layer.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Benoit 5:3cd83fcb1467 1 /*
Benoit 5:3cd83fcb1467 2 * $Id: Queue.c 29 2011-06-11 14:53:08Z benoit $
Benoit 5:3cd83fcb1467 3 * $Author: benoit $
Benoit 5:3cd83fcb1467 4 * $Date: 2011-06-11 16:53:08 +0200 (sam., 11 juin 2011) $
Benoit 5:3cd83fcb1467 5 * $Rev: 29 $
Benoit 5:3cd83fcb1467 6 *
Benoit 5:3cd83fcb1467 7 *
Benoit 5:3cd83fcb1467 8 *
Benoit 5:3cd83fcb1467 9 *
Benoit 5:3cd83fcb1467 10 *
Benoit 5:3cd83fcb1467 11 */
Benoit 5:3cd83fcb1467 12
Benoit 5:3cd83fcb1467 13 #include "CQueue.h"
Benoit 5:3cd83fcb1467 14 #include "Debug.h"
Benoit 5:3cd83fcb1467 15 #include <stdlib.h>
Benoit 5:3cd83fcb1467 16 #include <string.h>
Benoit 5:3cd83fcb1467 17
Benoit 5:3cd83fcb1467 18
Benoit 5:3cd83fcb1467 19 #define DEBUG_CURRENT_MODULE_NAME "Queue"
Benoit 5:3cd83fcb1467 20 #define DEBUG_CURRENT_MODULE_ID DEBUG_MODULE_QUEUE
Benoit 5:3cd83fcb1467 21
Benoit 5:3cd83fcb1467 22
Benoit 5:3cd83fcb1467 23 CQueue_t *CQueue_Alloc(int16_t size)
Benoit 5:3cd83fcb1467 24 {
Benoit 5:3cd83fcb1467 25 CQueue_t *queue;
Benoit 5:3cd83fcb1467 26
Benoit 5:3cd83fcb1467 27 queue = (CQueue_t *)malloc(sizeof(CQueue_t));
Benoit 5:3cd83fcb1467 28 if (queue == NULL)
Benoit 5:3cd83fcb1467 29 {
Benoit 5:3cd83fcb1467 30 DEBUG_MODULE(DEBUG_LEVEL_WARNING, ("Not enough memory"));
Benoit 5:3cd83fcb1467 31 mbedNet_LastError = mbedNetResult_NotEnoughMemory;
Benoit 5:3cd83fcb1467 32 goto Exit;
Benoit 5:3cd83fcb1467 33 }
Benoit 5:3cd83fcb1467 34 memset(queue, 0, sizeof(CQueue_t));
Benoit 5:3cd83fcb1467 35
Benoit 5:3cd83fcb1467 36 queue->size = size + 1;
Benoit 5:3cd83fcb1467 37
Benoit 5:3cd83fcb1467 38 DEBUG_MODULE(DEBUG_LEVEL_INFO, ("%d-%d Allocated queue of %d items", queue->popIndex, queue->pushIndex, size));
Benoit 5:3cd83fcb1467 39
Benoit 5:3cd83fcb1467 40 Exit:
Benoit 5:3cd83fcb1467 41 return queue;
Benoit 5:3cd83fcb1467 42 }
Benoit 5:3cd83fcb1467 43
Benoit 5:3cd83fcb1467 44
Benoit 5:3cd83fcb1467 45 int32_t CQueue_Push(CQueue_t *queue, void *entry)
Benoit 5:3cd83fcb1467 46 {
Benoit 5:3cd83fcb1467 47 int32_t result = 0;
Benoit 5:3cd83fcb1467 48 int16_t index;
Benoit 5:3cd83fcb1467 49
Benoit 5:3cd83fcb1467 50 if (queue->popIndex == ((queue->pushIndex + 1) % queue->size))
Benoit 5:3cd83fcb1467 51 {
Benoit 5:3cd83fcb1467 52 DEBUG_MODULE(DEBUG_LEVEL_INFO, ("%d-%d Queue is full", queue->popIndex, queue->pushIndex));
Benoit 5:3cd83fcb1467 53 result = -1;
Benoit 5:3cd83fcb1467 54 mbedNet_LastError = mbedNetResult_QueueFull;
Benoit 5:3cd83fcb1467 55 goto Exit;
Benoit 5:3cd83fcb1467 56 }
Benoit 5:3cd83fcb1467 57
Benoit 5:3cd83fcb1467 58 index = queue->pushIndex;
Benoit 5:3cd83fcb1467 59 queue->entries[index] = entry;
Benoit 5:3cd83fcb1467 60 index++;
Benoit 5:3cd83fcb1467 61 if (index == queue->size) index = 0;
Benoit 5:3cd83fcb1467 62 queue->pushIndex = index;
Benoit 5:3cd83fcb1467 63
Benoit 5:3cd83fcb1467 64 DEBUG_MODULE(DEBUG_LEVEL_INFO, ("%d-%d Pushing one entry from queue", queue->popIndex, queue->pushIndex));
Benoit 5:3cd83fcb1467 65
Benoit 5:3cd83fcb1467 66 Exit:
Benoit 5:3cd83fcb1467 67 return result;
Benoit 5:3cd83fcb1467 68 }
Benoit 5:3cd83fcb1467 69
Benoit 5:3cd83fcb1467 70
Benoit 5:3cd83fcb1467 71 int32_t CQueue_Pop(CQueue_t *queue, void **entry)
Benoit 5:3cd83fcb1467 72 {
Benoit 5:3cd83fcb1467 73 int32_t result = 0;
Benoit 5:3cd83fcb1467 74 int16_t index;
Benoit 5:3cd83fcb1467 75
Benoit 5:3cd83fcb1467 76 if (queue->popIndex == queue->pushIndex)
Benoit 5:3cd83fcb1467 77 {
Benoit 5:3cd83fcb1467 78 DEBUG_MODULE(DEBUG_LEVEL_INFO, ("%d-%d Queue is empty", queue->popIndex, queue->pushIndex));
Benoit 5:3cd83fcb1467 79 result = -1;
Benoit 5:3cd83fcb1467 80 mbedNet_LastError = mbedNetResult_QueueEmpty;
Benoit 5:3cd83fcb1467 81 goto Exit;
Benoit 5:3cd83fcb1467 82 }
Benoit 5:3cd83fcb1467 83
Benoit 5:3cd83fcb1467 84
Benoit 5:3cd83fcb1467 85 index = queue->popIndex;
Benoit 5:3cd83fcb1467 86 *entry = queue->entries[index];
Benoit 5:3cd83fcb1467 87 index++;
Benoit 5:3cd83fcb1467 88 if (index == queue->size) index = 0;
Benoit 5:3cd83fcb1467 89 queue->popIndex = index;
Benoit 5:3cd83fcb1467 90
Benoit 5:3cd83fcb1467 91 DEBUG_MODULE(DEBUG_LEVEL_INFO, ("%d-%d Popping one entry from queue", queue->popIndex, queue->pushIndex));
Benoit 5:3cd83fcb1467 92
Benoit 5:3cd83fcb1467 93 Exit:
Benoit 5:3cd83fcb1467 94 return result;
Benoit 5:3cd83fcb1467 95 }
Benoit 5:3cd83fcb1467 96
Benoit 5:3cd83fcb1467 97
Benoit 5:3cd83fcb1467 98 int32_t CQueue_Peek(CQueue_t *queue, void **entry)
Benoit 5:3cd83fcb1467 99 {
Benoit 5:3cd83fcb1467 100 int32_t result = 0;
Benoit 5:3cd83fcb1467 101 int16_t index;
Benoit 5:3cd83fcb1467 102
Benoit 5:3cd83fcb1467 103 if (queue->popIndex == queue->pushIndex)
Benoit 5:3cd83fcb1467 104 {
Benoit 5:3cd83fcb1467 105 DEBUG_MODULE(DEBUG_LEVEL_INFO, ("%d-%d Queue is empty", queue->popIndex, queue->pushIndex));
Benoit 5:3cd83fcb1467 106 result = -1;
Benoit 5:3cd83fcb1467 107 mbedNet_LastError = mbedNetResult_QueueEmpty;
Benoit 5:3cd83fcb1467 108 goto Exit;
Benoit 5:3cd83fcb1467 109 }
Benoit 5:3cd83fcb1467 110
Benoit 5:3cd83fcb1467 111 index = queue->popIndex;
Benoit 5:3cd83fcb1467 112 *entry = queue->entries[index];
Benoit 5:3cd83fcb1467 113
Benoit 5:3cd83fcb1467 114 DEBUG_MODULE(DEBUG_LEVEL_INFO, ("%d-%d Peeking first entry from queue", queue->popIndex, queue->pushIndex));
Benoit 5:3cd83fcb1467 115
Benoit 5:3cd83fcb1467 116 Exit:
Benoit 5:3cd83fcb1467 117 return result;
Benoit 5:3cd83fcb1467 118 }
Benoit 5:3cd83fcb1467 119
Benoit 5:3cd83fcb1467 120
Benoit 5:3cd83fcb1467 121 int32_t CQueue_Free(CQueue_t *queue)
Benoit 5:3cd83fcb1467 122 {
Benoit 5:3cd83fcb1467 123 int32_t result = 0;
Benoit 5:3cd83fcb1467 124
Benoit 5:3cd83fcb1467 125 DEBUG_MODULE(DEBUG_LEVEL_INFO, ("%d-%d Free queue", queue->popIndex, queue->pushIndex));
Benoit 5:3cd83fcb1467 126 free(queue);
Benoit 5:3cd83fcb1467 127
Benoit 5:3cd83fcb1467 128 return result;
Benoit 5:3cd83fcb1467 129 }
Benoit 5:3cd83fcb1467 130
Benoit 5:3cd83fcb1467 131
Benoit 5:3cd83fcb1467 132 Bool_t CQueue_IsEmpty(const CQueue_t *queue)
Benoit 5:3cd83fcb1467 133 {
Benoit 5:3cd83fcb1467 134 return (queue->popIndex == queue->pushIndex) ? True : False;
Benoit 5:3cd83fcb1467 135 }
Benoit 5:3cd83fcb1467 136
Benoit 5:3cd83fcb1467 137
Benoit 5:3cd83fcb1467 138 Bool_t CQueue_IsFull(const CQueue_t *queue)
Benoit 5:3cd83fcb1467 139 {
Benoit 5:3cd83fcb1467 140 return (queue->popIndex == ((queue->pushIndex + 1) % queue->size)) ? True : False;
Benoit 5:3cd83fcb1467 141 }
Benoit 5:3cd83fcb1467 142