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
Parent:
0:19f5f51584de
Child:
2:3d1c0fbd10e6
Frames are now received using an interrupt handler

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