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