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 0:19f5f51584de 1 /*
Benoit 0:19f5f51584de 2 * $Id: mbedNet.h 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 5:3cd83fcb1467 6 *
Benoit 5:3cd83fcb1467 7 *
Benoit 5:3cd83fcb1467 8 *
Benoit 5:3cd83fcb1467 9 *
Benoit 5:3cd83fcb1467 10 *
Benoit 0:19f5f51584de 11 */
Benoit 5:3cd83fcb1467 12
Benoit 0:19f5f51584de 13 #ifndef __MBEDNET_H__
Benoit 0:19f5f51584de 14 #define __MBEDNET_H__
Benoit 0:19f5f51584de 15
Benoit 0:19f5f51584de 16
Benoit 0:19f5f51584de 17 #include <stdint.h>
Benoit 0:19f5f51584de 18
Benoit 0:19f5f51584de 19
Benoit 0:19f5f51584de 20 enum Bool
Benoit 0:19f5f51584de 21 {
Benoit 0:19f5f51584de 22 False = 0,
Benoit 0:19f5f51584de 23 True = !False,
Benoit 0:19f5f51584de 24 };
Benoit 0:19f5f51584de 25 typedef enum Bool Bool_t;
Benoit 0:19f5f51584de 26
Benoit 0:19f5f51584de 27
Benoit 1:f4040665bc61 28 #define DEBUG_ON 1
Benoit 0:19f5f51584de 29
Benoit 0:19f5f51584de 30 #define NET_DEFAULT_TTL 128 /* Default TTL */
Benoit 0:19f5f51584de 31 #define NET_ENCAPSULATION_MAX_DEPTH 5 /* Maximum protocol encapsulation depth */
Benoit 0:19f5f51584de 32 #define NET_PERIODIC_FUNCTION_MAX_COUNT 5 /* Maximum number of timers */
Benoit 0:19f5f51584de 33 #define NETIF_MAX_COUNT 2 /* Maximum number of registrable interfaces */
Benoit 0:19f5f51584de 34 #define ETHERNET_PROTOCOL_MAX_COUNT 3 /* Maximum number of registrable protocols over ethernet */
Benoit 5:3cd83fcb1467 35 #define IPV4_PROTOCOL_MAX_COUNT 4 /* Maximum number of registrable protocols over IPv4 */
Benoit 0:19f5f51584de 36 #define ARP_CACHE_MAX_ENTRIES 4 /* Maximum number of entries in the ARP cache */
Benoit 0:19f5f51584de 37 #define ARP_FUNCTION_PERIOD 10 /* Period in seconds of the ARP periodic function */
Benoit 0:19f5f51584de 38 #define ARP_MAX_ENTRY_AGE 60 /* Max age of a dynamic entry in seconds */
Benoit 0:19f5f51584de 39 #define NET_API_PER_PROTOCOL_MAX_COUNT 3 /* Maximum number of API per protocol */
Benoit 0:19f5f51584de 40 #define QUEUE_MAX_ENTRY_COUNT 16 /* Maximum entries per queue */
Benoit 0:19f5f51584de 41 #define SOCKET_MAX_COUNT 10 /* Maximum number of sockets in the system */
Benoit 0:19f5f51584de 42 #define SOCKET_DATAQUEUE_ENTRY_COUNT 4 /* Maximum data block entries per socket */
Benoit 0:19f5f51584de 43 #define MBEDNET_HAVE_RTOS 0 /* 1 = have RTOS, 0 = no RTOS */
Benoit 0:19f5f51584de 44
Benoit 0:19f5f51584de 45
Benoit 0:19f5f51584de 46 #define ntohs(a) (((((uint16_t)a) >> 8) & 0x00FF) | ((((uint16_t)a) << 8) & 0xFF00))
Benoit 0:19f5f51584de 47 #define htons(a) ntohs(a)
Benoit 0:19f5f51584de 48
Benoit 0:19f5f51584de 49
Benoit 0:19f5f51584de 50 enum mbedNetResult
Benoit 0:19f5f51584de 51 {
Benoit 0:19f5f51584de 52 mbedNetResult_Success = 0,
Benoit 0:19f5f51584de 53 mbedNetResult_NotEnoughMemory,
Benoit 0:19f5f51584de 54 mbedNetResult_TooManyInterfaces,
Benoit 0:19f5f51584de 55 mbedNetResult_InvalidInterface,
Benoit 1:f4040665bc61 56 mbedNetResult_InterfaceAlreadyUp,
Benoit 1:f4040665bc61 57 mbedNetResult_InterfaceAlreadyDown,
Benoit 0:19f5f51584de 58 mbedNetResult_TooManyPeriodicFunctions,
Benoit 0:19f5f51584de 59 mbedNetResult_TooManyDrivers,
Benoit 0:19f5f51584de 60 mbedNetResult_InvalidDriver,
Benoit 0:19f5f51584de 61 mbedNetResult_InvalidParameter,
Benoit 0:19f5f51584de 62 mbedNetResult_TooManyRegisteredProtocols,
Benoit 0:19f5f51584de 63 mbedNetResult_NoProtocolRegistrationFunction,
Benoit 0:19f5f51584de 64 mbedNetResult_NoAPIRegistrationFunction,
Benoit 0:19f5f51584de 65 mbedNetResult_TooManyOpenSockets,
Benoit 0:19f5f51584de 66 mbedNetResult_InvalidSocketHandle,
Benoit 0:19f5f51584de 67 mbedNetResult_SocketAlreadyClosed,
Benoit 0:19f5f51584de 68 mbedNetResult_WouldBlock,
Benoit 0:19f5f51584de 69 mbedNetResult_QueueEmpty,
Benoit 0:19f5f51584de 70 mbedNetResult_QueueFull,
Benoit 0:19f5f51584de 71 mbedNetResult_NotIplemented,
Benoit 0:19f5f51584de 72 mbedNetResult_BufferTooSmall,
Benoit 0:19f5f51584de 73 mbedNetResult_NoRouteToHost,
Benoit 0:19f5f51584de 74 mbedNetResult_WaitARPResolution,
Benoit 0:19f5f51584de 75 mbedNetResult_DestinationAddressRequired,
Benoit 0:19f5f51584de 76 mbedNetResult_TooMuchData,
Benoit 0:19f5f51584de 77 mbedNetResult_Count,
Benoit 0:19f5f51584de 78 };
Benoit 0:19f5f51584de 79 typedef enum mbedNetResult mbedNetResult_t;
Benoit 0:19f5f51584de 80
Benoit 0:19f5f51584de 81
Benoit 0:19f5f51584de 82 #define MA0 address[0]
Benoit 0:19f5f51584de 83 #define MA1 address[1]
Benoit 0:19f5f51584de 84 #define MA2 address[2]
Benoit 0:19f5f51584de 85 #define MA3 address[3]
Benoit 0:19f5f51584de 86 #define MA4 address[4]
Benoit 0:19f5f51584de 87 #define MA5 address[5]
Benoit 0:19f5f51584de 88 struct Ethernet_Addr
Benoit 0:19f5f51584de 89 {
Benoit 0:19f5f51584de 90 uint8_t address[6];
Benoit 0:19f5f51584de 91 };
Benoit 0:19f5f51584de 92 typedef struct Ethernet_Addr Ethernet_Addr_t;
Benoit 0:19f5f51584de 93
Benoit 0:19f5f51584de 94 extern const Ethernet_Addr_t ethernet_Addr_Broadcast;
Benoit 0:19f5f51584de 95 extern const Ethernet_Addr_t ethernet_Addr_Null;
Benoit 0:19f5f51584de 96
Benoit 0:19f5f51584de 97
Benoit 0:19f5f51584de 98 #define IP0 bytes.ip0
Benoit 0:19f5f51584de 99 #define IP1 bytes.ip1
Benoit 0:19f5f51584de 100 #define IP2 bytes.ip2
Benoit 0:19f5f51584de 101 #define IP3 bytes.ip3
Benoit 0:19f5f51584de 102
Benoit 0:19f5f51584de 103 #pragma push
Benoit 0:19f5f51584de 104 #pragma pack(1)
Benoit 0:19f5f51584de 105 union IPv4_Addr
Benoit 0:19f5f51584de 106 {
Benoit 0:19f5f51584de 107 struct {
Benoit 0:19f5f51584de 108 uint32_t ip0:8;
Benoit 0:19f5f51584de 109 uint32_t ip1:8;
Benoit 0:19f5f51584de 110 uint32_t ip2:8;
Benoit 0:19f5f51584de 111 uint32_t ip3:8;
Benoit 0:19f5f51584de 112 } bytes;
Benoit 0:19f5f51584de 113 uint32_t addr;
Benoit 0:19f5f51584de 114 };
Benoit 0:19f5f51584de 115 #pragma pop
Benoit 0:19f5f51584de 116
Benoit 0:19f5f51584de 117 typedef union IPv4_Addr IPv4_Addr_t;
Benoit 0:19f5f51584de 118
Benoit 0:19f5f51584de 119 extern const IPv4_Addr_t ipv4_Addr_Broadcast;
Benoit 0:19f5f51584de 120 extern const IPv4_Addr_t ipv4_Addr_Any;
Benoit 0:19f5f51584de 121 #define IPADDR_ANY ipv4_Addr_Any.addr
Benoit 0:19f5f51584de 122 #define IPADDR_BROADCAST ipv4_Addr_Broadcast.addr
Benoit 0:19f5f51584de 123
Benoit 0:19f5f51584de 124
Benoit 0:19f5f51584de 125 #if MBEDNET_HAVE_RTOS
Benoit 0:19f5f51584de 126
Benoit 0:19f5f51584de 127 #error "Please define mutex and semaphore macros"
Benoit 0:19f5f51584de 128
Benoit 0:19f5f51584de 129 #else /* MBEDNET_HAVE_RTOS */
Benoit 0:19f5f51584de 130
Benoit 0:19f5f51584de 131 typedef int32_t RTOS_Mutex_t;
Benoit 0:19f5f51584de 132
Benoit 0:19f5f51584de 133 #define RTOS_MUTEX_CREATE() 0
Benoit 0:19f5f51584de 134 #define RTOS_MUTEX_LOCK(id) id++
Benoit 0:19f5f51584de 135 #define RTOS_MUTEX_UNLOCK(id) id--
Benoit 0:19f5f51584de 136
Benoit 0:19f5f51584de 137 typedef int32_t RTOS_Sem_t;
Benoit 0:19f5f51584de 138
Benoit 0:19f5f51584de 139 #define RTOS_SEM_CREATE(i, m) 0
Benoit 0:19f5f51584de 140 #define RTOS_SEM_P(id) id++
Benoit 0:19f5f51584de 141 #define RTOS_SEM_V(id) id--
Benoit 0:19f5f51584de 142
Benoit 0:19f5f51584de 143 #endif /* MBEDNET_HAVE_RTOS */
Benoit 0:19f5f51584de 144
Benoit 0:19f5f51584de 145 extern mbedNetResult_t mbedNet_LastError;
Benoit 0:19f5f51584de 146
Benoit 0:19f5f51584de 147
Benoit 0:19f5f51584de 148 #endif /* __MBEDNET_H__ */