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 19:17:11 2011 +0000
Revision:
1:f4040665bc61
Frames are now received using an interrupt handler

Who changed what in which revision?

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