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 12 11:23:03 2011 +0000
Revision:
0:19f5f51584de
Initial release (alpha quality)

Who changed what in which revision?

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