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: NetIF.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 __NETIF_H__
Benoit 0:19f5f51584de 14 #define __NETIF_H__
Benoit 0:19f5f51584de 15
Benoit 0:19f5f51584de 16 #include "mbedNet.h"
Benoit 0:19f5f51584de 17
Benoit 0:19f5f51584de 18
Benoit 0:19f5f51584de 19 struct IPv4_Header;
Benoit 0:19f5f51584de 20 typedef struct IPv4_Header IPv4_Header_t;
Benoit 0:19f5f51584de 21 struct NetIF;
Benoit 0:19f5f51584de 22 typedef struct NetIF NetIF_t;
Benoit 0:19f5f51584de 23 typedef CAPI int32_t (*enet_drv_init_t)(NetIF_t *);
Benoit 0:19f5f51584de 24 typedef CAPI int32_t (*enet_drv_read_t)(uint8_t **, int32_t *);
Benoit 0:19f5f51584de 25 typedef CAPI int32_t (*enet_drv_write_t)(uint8_t *, int32_t);
Benoit 0:19f5f51584de 26 typedef CAPI uint8_t *(*enet_drv_get_tx_buffer_t)(void);
Benoit 0:19f5f51584de 27
Benoit 0:19f5f51584de 28
Benoit 0:19f5f51584de 29
Benoit 0:19f5f51584de 30 enum Protocol_ID
Benoit 0:19f5f51584de 31 {
Benoit 0:19f5f51584de 32 Protocol_ID_Ethernet = 0,
Benoit 0:19f5f51584de 33 Protocol_ID_ARP,
Benoit 0:19f5f51584de 34 Protocol_ID_IPv4,
Benoit 0:19f5f51584de 35 Protocol_ID_ICMPv4,
Benoit 0:19f5f51584de 36 Protocol_ID_UDPv4,
Benoit 0:19f5f51584de 37 Protocol_ID_TCPv4,
Benoit 0:19f5f51584de 38 Protocol_ID_Count,
Benoit 0:19f5f51584de 39 };
Benoit 0:19f5f51584de 40 typedef enum Protocol_ID Protocol_ID_t;
Benoit 0:19f5f51584de 41
Benoit 0:19f5f51584de 42
Benoit 0:19f5f51584de 43 struct Packet
Benoit 0:19f5f51584de 44 {
Benoit 0:19f5f51584de 45 int8_t depth;
Benoit 0:19f5f51584de 46 uint8_t *headerPtrTable[NET_ENCAPSULATION_MAX_DEPTH];
Benoit 0:19f5f51584de 47 uint16_t headerLenTable[NET_ENCAPSULATION_MAX_DEPTH];
Benoit 0:19f5f51584de 48 Protocol_ID_t protocolTable[NET_ENCAPSULATION_MAX_DEPTH];
Benoit 0:19f5f51584de 49 uint8_t *data;
Benoit 0:19f5f51584de 50 int32_t length;
Benoit 0:19f5f51584de 51 };
Benoit 0:19f5f51584de 52 typedef struct Packet Packet_t;
Benoit 0:19f5f51584de 53
Benoit 0:19f5f51584de 54
Benoit 0:19f5f51584de 55 enum API_ID
Benoit 0:19f5f51584de 56 {
Benoit 0:19f5f51584de 57 API_ID_Sockets,
Benoit 0:19f5f51584de 58 API_ID_Count,
Benoit 0:19f5f51584de 59 };
Benoit 0:19f5f51584de 60 typedef enum API_ID API_ID_t;
Benoit 0:19f5f51584de 61
Benoit 0:19f5f51584de 62
Benoit 0:19f5f51584de 63 struct Net_API
Benoit 0:19f5f51584de 64 {
Benoit 0:19f5f51584de 65 API_ID_t apiID;
Benoit 0:19f5f51584de 66 void (*InitAPI)(void);
Benoit 0:19f5f51584de 67 int32_t (*Hook)(NetIF_t *netIF, Protocol_ID_t protocolID, Packet_t *packet);
Benoit 0:19f5f51584de 68 };
Benoit 0:19f5f51584de 69 typedef struct Net_API Net_API_t;
Benoit 0:19f5f51584de 70
Benoit 0:19f5f51584de 71
Benoit 0:19f5f51584de 72 struct Protocol_Handler;
Benoit 0:19f5f51584de 73 typedef struct Protocol_Handler Protocol_Handler_t;
Benoit 0:19f5f51584de 74 typedef CAPI int32_t (*Protocol_RegisterFunction_t)(Protocol_Handler_t *);
Benoit 0:19f5f51584de 75 typedef CAPI void (*Protocol_HandlerFunction_t)(NetIF_t *, Packet_t *);
Benoit 0:19f5f51584de 76 typedef CAPI void (*Protocol_InitFunction_t)(void);
Benoit 0:19f5f51584de 77 typedef CAPI int32_t (*API_RegisterFunction_t)(Net_API_t *);
Benoit 0:19f5f51584de 78 typedef CAPI void (*PeriodicFunction_t)(void);
Benoit 0:19f5f51584de 79 typedef int16_t FunctionPeriod_t;
Benoit 0:19f5f51584de 80
Benoit 0:19f5f51584de 81
Benoit 0:19f5f51584de 82 typedef int32_t NetIF_DriverIndex_t;
Benoit 0:19f5f51584de 83 struct NetIF_Driver
Benoit 0:19f5f51584de 84 {
Benoit 0:19f5f51584de 85 char *name;
Benoit 0:19f5f51584de 86 enet_drv_init_t Init;
Benoit 0:19f5f51584de 87 enet_drv_read_t Read;
Benoit 0:19f5f51584de 88 enet_drv_write_t Write;
Benoit 0:19f5f51584de 89 enet_drv_get_tx_buffer_t GetTxBuffer;
Benoit 0:19f5f51584de 90 Protocol_Handler_t *protocolHandler;
Benoit 0:19f5f51584de 91 uint16_t mtu;
Benoit 0:19f5f51584de 92 };
Benoit 0:19f5f51584de 93 typedef struct NetIF_Driver NetIF_Driver_t;
Benoit 0:19f5f51584de 94
Benoit 0:19f5f51584de 95
Benoit 0:19f5f51584de 96 typedef int32_t Protocol_Index_t;
Benoit 0:19f5f51584de 97 #define PROTOCOL_INDEX_NOT_INITIALIZED -1
Benoit 0:19f5f51584de 98
Benoit 0:19f5f51584de 99 typedef uint32_t Protocol_Number_t;
Benoit 0:19f5f51584de 100 #define PROTOCOL_NUMBER_NONE 0
Benoit 0:19f5f51584de 101
Benoit 0:19f5f51584de 102 struct Protocol_Handler
Benoit 0:19f5f51584de 103 {
Benoit 0:19f5f51584de 104 Protocol_Index_t index;
Benoit 0:19f5f51584de 105 Protocol_ID_t protocolID;
Benoit 0:19f5f51584de 106 Protocol_Number_t protocolNumber;
Benoit 0:19f5f51584de 107 Protocol_InitFunction_t Init;
Benoit 0:19f5f51584de 108 Protocol_HandlerFunction_t HandlePacket;
Benoit 0:19f5f51584de 109 Protocol_RegisterFunction_t RegisterProtocol;
Benoit 0:19f5f51584de 110 API_RegisterFunction_t RegisterAPI;
Benoit 0:19f5f51584de 111 };
Benoit 0:19f5f51584de 112
Benoit 0:19f5f51584de 113
Benoit 0:19f5f51584de 114 typedef int32_t NetIF_Index_t;
Benoit 0:19f5f51584de 115 struct NetIF
Benoit 0:19f5f51584de 116 {
Benoit 0:19f5f51584de 117 NetIF_Index_t index;
Benoit 0:19f5f51584de 118 const char *name;
Benoit 0:19f5f51584de 119 IPv4_Addr_t ipv4Address;
Benoit 0:19f5f51584de 120 IPv4_Addr_t ipv4Netmask;
Benoit 0:19f5f51584de 121 IPv4_Addr_t ipv4Network;
Benoit 0:19f5f51584de 122 IPv4_Addr_t ipv4Gateway;
Benoit 0:19f5f51584de 123 IPv4_Addr_t ipv4Broadcast;
Benoit 0:19f5f51584de 124 NetIF_Driver_t *driver;
Benoit 0:19f5f51584de 125 void *driverParameter;
Benoit 0:19f5f51584de 126 };
Benoit 0:19f5f51584de 127
Benoit 0:19f5f51584de 128
Benoit 0:19f5f51584de 129 extern const char *api_IDNames[API_ID_Count];
Benoit 0:19f5f51584de 130 extern const char *protocol_IDNames[Protocol_ID_Count];
Benoit 0:19f5f51584de 131
Benoit 0:19f5f51584de 132
Benoit 0:19f5f51584de 133 CAPI NetIF_t *NetIF_RegisterInterface(IPv4_Addr_t *address, IPv4_Addr_t *netmask, IPv4_Addr_t *gateway, NetIF_Driver_t *driver, void *driverParameter);
Benoit 0:19f5f51584de 134 CAPI int32_t NetIF_ProcessFrames(void);
Benoit 0:19f5f51584de 135 CAPI int32_t NetIF_RegisterPeriodicFunction(char *name, PeriodicFunction_t function, FunctionPeriod_t period);
Benoit 0:19f5f51584de 136 CAPI int32_t NetIF_ProcessTimers(int32_t elapsedTime);
Benoit 0:19f5f51584de 137 CAPI int32_t NetIF_SendIPv4Packet(IPv4_Header_t *ipv4Header);
Benoit 0:19f5f51584de 138 CAPI int32_t NetIF_Enable(NetIF_t *netIF);
Benoit 0:19f5f51584de 139 CAPI int32_t NetIF_Disable(NetIF_t *netIF);
Benoit 0:19f5f51584de 140 CAPI void NetIF_ProtoPop(Packet_t *packet);
Benoit 0:19f5f51584de 141 CAPI void NetIF_ProtoPush(Packet_t *packet, int32_t headerSize, Protocol_ID_t protocol);
Benoit 0:19f5f51584de 142
Benoit 0:19f5f51584de 143 #endif /* __NETIF_H__ */