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
Child:
1:f4040665bc61
Initial release (alpha quality)

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