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.
mbedNet.h@1:f4040665bc61, 2011-06-12 (annotated)
- Committer:
- Benoit
- Date:
- Sun Jun 12 19:17:11 2011 +0000
- Revision:
- 1:f4040665bc61
- Parent:
- 0:19f5f51584de
- Child:
- 5:3cd83fcb1467
Frames are now received using an interrupt handler
Who changed what in which revision?
User | Revision | Line number | New 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 | 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 | 0:19f5f51584de | 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__ */ |