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.
TCPv4.cpp
00001 /* 00002 * $Id: TCPv4.c 29 2011-06-11 14:53:08Z benoit $ 00003 * $Author: benoit $ 00004 * $Date: 2011-06-11 16:53:08 +0200 (sam., 11 juin 2011) $ 00005 * $Rev: 29 $ 00006 * 00007 * 00008 * 00009 * 00010 * 00011 */ 00012 00013 #include "TCPv4.h" 00014 #include "Debug.h" 00015 00016 00017 #define DEBUG_CURRENT_MODULE_NAME "TCPv4" 00018 #define DEBUG_CURRENT_MODULE_ID DEBUG_MODULE_TCPV4 00019 00020 00021 static void Init(void); 00022 static void Handler(NetIF_t *netIF, NetPacket_t *packet); 00023 static int32_t RegisterAPI(Net_API_t *api); 00024 00025 00026 Protocol_Handler_t tcpv4 = 00027 { 00028 PROTOCOL_INDEX_NOT_INITIALIZED, /* Always PROTOCOL_INDEX_NOT_INITIALIZED at initialization */ 00029 Protocol_ID_TCPv4, /* Protocol ID */ 00030 IPV4_PROTO_TCPV4, /* Protocol number */ 00031 Init, /* Protocol initialisation function */ 00032 Handler, /* Protocol handler */ 00033 NULL, /* Protocol registration function */ 00034 RegisterAPI, /* API registration function */ 00035 }; 00036 00037 00038 static void Init(void) 00039 { 00040 DEBUG_MODULE(DEBUG_LEVEL_INFO, ("Initializing TCPv4 layer")); 00041 } 00042 00043 00044 static void Handler(NetIF_t *netIF, NetPacket_t *packet) 00045 { 00046 //TCPv4_Header_t *tcpv4Header; 00047 IPv4_Header_t *ipv4Header; 00048 int32_t depth; 00049 00050 depth = packet->depth; 00051 //tcpv4Header = (TCPv4_Header_t *)packet->data; 00052 ipv4Header = (IPv4_Header_t *)packet->headerPtrTable[depth]; 00053 00054 TCPv4_DumpHeader(NULL, ipv4Header); 00055 Debug_DumpBufferHex((uint8_t *)ipv4Header, 52); 00056 } 00057 00058 00059 static int32_t RegisterAPI(Net_API_t *api) 00060 { 00061 return -1; 00062 } 00063 00064 00065 void TCPv4_DumpHeader(const char *prefix, IPv4_Header_t *ipv4Header) 00066 { 00067 TCPv4_Header_t *tcpv4Header = (TCPv4_Header_t *)(ipv4Header + 1); 00068 00069 DEBUG_RAW(("%sTCPv4 %d.%d.%d.%d:%d --> %d.%d.%d.%d:%d seq:%ld ack:%ld off:%d flags:%c%c%c%c%c%c window:%d crc:%04X ptr:%d", 00070 prefix != NULL ? prefix : "", 00071 ipv4Header->source.IP0, 00072 ipv4Header->source.IP1, 00073 ipv4Header->source.IP2, 00074 ipv4Header->source.IP3, 00075 ntohs(tcpv4Header->sourcePort), 00076 ipv4Header->dest.IP0, 00077 ipv4Header->dest.IP1, 00078 ipv4Header->dest.IP2, 00079 ipv4Header->dest.IP3, 00080 ntohs(tcpv4Header->destPort), 00081 ntohs(tcpv4Header->sequence), 00082 ntohs(tcpv4Header->ack), 00083 tcpv4Header->offset, 00084 00085 tcpv4Header->URG ? 'U' : '-', 00086 tcpv4Header->ACK ? 'A' : '-', 00087 tcpv4Header->PSH ? 'P' : '-', 00088 tcpv4Header->RST ? 'R' : '-', 00089 tcpv4Header->SYN ? 'S' : '-', 00090 tcpv4Header->FIN ? 'F' : '-', 00091 00092 ntohs(tcpv4Header->window), 00093 ntohs(tcpv4Header->crc), 00094 ntohs(tcpv4Header->pointer) 00095 00096 )); 00097 } 00098
Generated on Wed Jul 13 2022 06:09:33 by 1.7.2