Engravity-CDU / Mbed 2 deprecated EasyWebCR

Dependencies:   mbed

Fork of EasyWebCR by Igor Skochinsky

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers tcpip.h Source File

tcpip.h

00001 /******************************************************************
00002  *****                                                        *****
00003  *****  Name: tcpip.h                                         *****
00004  *****  Ver.: 1.0                                             *****
00005  *****  Date: 07/05/2001                                      *****
00006  *****  Auth: Andreas Dannenberg                              *****
00007  *****        HTWK Leipzig                                    *****
00008  *****        university of applied sciences                  *****
00009  *****        Germany                                         *****
00010  *****  Func: header-file for tcpip.c                         *****
00011  *****                                                        *****
00012  ******************************************************************/
00013 
00014 // Modifications by Code Red Technologies for NXP LPC1776
00015 
00016 #ifndef __TCPIP_H
00017 #define __TCPIP_H
00018 
00019 // easyWEB-stack definitions
00020 // Code Red - replaced original address by 192.168.0.200
00021 #define MYIP_1               192                 // our internet protocol (IP) address
00022 #define MYIP_2               168
00023 #define MYIP_3               0
00024 #define MYIP_4               200
00025 //#define MYIP_4               30
00026 
00027 #define SUBMASK_1            255                 // subnet mask
00028 #define SUBMASK_2            255
00029 #define SUBMASK_3            255
00030 #define SUBMASK_4            0
00031 
00032 #define GWIP_1               192                 // standard gateway (used if remote
00033 #define GWIP_2               168                 // IP is no part of our subnet)
00034 #define GWIP_3               2
00035 #define GWIP_4               154
00036 
00037 #define RETRY_TIMEOUT        8                   // wait max. 8 x 262ms for an ACK (about 2 sec.)
00038 #define FIN_TIMEOUT          2                   // max. time to wait for an ACK of a FIN
00039                                                  // before closing TCP state-machine (about 0.5 s)
00040 #define MAX_RETRYS           4                   // nr. of resendings before reset conn.
00041                                                  // total nr. of transmissions = MAX_RETRYS + 1
00042 
00043 #define MAX_TCP_TX_DATA_SIZE 512                 // max. outgoing TCP data size (even!)
00044 #define MAX_TCP_RX_DATA_SIZE 256                 // max. incoming TCP data size (even!)
00045                                                  // (increasing the buffer-size dramatically
00046                                                  // increases the transfer-speed!)
00047                                         
00048 #define MAX_ETH_TX_DATA_SIZE 60                  // 2nd buffer, used for ARP, ICMP, TCP (even!)
00049                                                  // enough to echo 32 byte via ICMP
00050 
00051 #define DEFAULT_TTL          64                  // Time To Live sent with packets
00052 
00053 // Ethernet network layer definitions
00054 #define ETH_DA_OFS           0                   // Destination MAC address (48 Bit)
00055 #define ETH_SA_OFS           6                   // Source MAC address (48 Bit)
00056 #define ETH_TYPE_OFS         12                  // Type field (16 Bit)
00057 #define ETH_DATA_OFS         14                  // Frame Data
00058 #define ETH_HEADER_SIZE      14
00059 
00060 #define FRAME_ARP            0x0806              // frame types (stored in Type/Length field)
00061 #define FRAME_IP             0x0800
00062 
00063 // IPv4 layer definitions
00064 #define IP_VER_IHL_TOS_OFS   ETH_DATA_OFS + 0    // Version, Header Length, Type of Service
00065 #define IP_TOTAL_LENGTH_OFS  ETH_DATA_OFS + 2    // IP Frame's Total Length
00066 #define IP_IDENT_OFS         ETH_DATA_OFS + 4    // Identifying Value
00067 #define IP_FLAGS_FRAG_OFS    ETH_DATA_OFS + 6    // Flags and Fragment Offset
00068 #define IP_TTL_PROT_OFS      ETH_DATA_OFS + 8    // Frame's Time to Live, Protocol
00069 #define IP_HEAD_CHKSUM_OFS   ETH_DATA_OFS + 10   // IP Frame's Header Checksum
00070 #define IP_SOURCE_OFS        ETH_DATA_OFS + 12   // Source Address (32 Bit)
00071 #define IP_DESTINATION_OFS   ETH_DATA_OFS + 16   // Destination Address (32 Bit)
00072 #define IP_DATA_OFS          ETH_DATA_OFS + 20   // Frame Data (if no options)
00073 #define IP_HEADER_SIZE       20                  // w/o options
00074 
00075 #define IP_VER_IHL           0x4500              // IPv4, Header Length = 5x32 bit
00076 #define IP_TOS_D             0x0010              // TOS low delay
00077 #define IP_TOS_T             0x0008              // TOS high throughput
00078 #define IP_TOS_R             0x0004              // TOS high reliability
00079 
00080 #define IP_FLAG_DONTFRAG     0x4000              // don't fragment IP frame
00081 #define IP_FLAG_MOREFRAG     0x2000              // more fragments available
00082 #define IP_FRAGOFS_MASK      0x1FFF              // indicates where this fragment belongs
00083 
00084 #define PROT_ICMP            1                   // Internet Control Message Protocol
00085 #define PROT_TCP             6                   // Transmission Control Protocol
00086 #define PROT_UDP             17                  // User Datagram Protocol
00087 
00088 // ARP definitions
00089 #define ARP_HARDW_OFS        ETH_DATA_OFS + 0    // Hardware address type
00090 #define ARP_PROT_OFS         ETH_DATA_OFS + 2    // Protocol
00091 #define ARP_HLEN_PLEN_OFS    ETH_DATA_OFS + 4    // byte length of each hardw. / prot. address
00092 #define ARP_OPCODE_OFS       ETH_DATA_OFS + 6    // Opcode
00093 #define ARP_SENDER_HA_OFS    ETH_DATA_OFS + 8    // Hardw. address of sender of this packet
00094 #define ARP_SENDER_IP_OFS    ETH_DATA_OFS + 14   // IP address of sender
00095 #define ARP_TARGET_HA_OFS    ETH_DATA_OFS + 18   // Hardw. address of target of this packet
00096 #define ARP_TARGET_IP_OFS    ETH_DATA_OFS + 24   // IP address of target
00097 #define ARP_FRAME_SIZE       28
00098 
00099 #define HARDW_ETH10          1                   // hardware-type 10Mbps Ethernet
00100 #define IP_HLEN_PLEN         0x0604              // MAC = 6 byte long, IP = 4 byte long
00101 #define OP_ARP_REQUEST       1                   // operations for ARP-frames
00102 #define OP_ARP_ANSWER        2
00103 
00104 // ICMP definitions
00105 #define ICMP_TYPE_CODE_OFS   IP_DATA_OFS + 0     // type of message
00106 #define ICMP_CHKSUM_OFS      IP_DATA_OFS + 2     // checksum of ICMP-message (16 bit)
00107 #define ICMP_DATA_OFS        IP_DATA_OFS + 4
00108 #define ICMP_HEADER_SIZE     4
00109 
00110 #define ICMP_ECHO            8                   // message is an echo request
00111 #define ICMP_ECHO_REPLY      0                   // message is an echo reply
00112 
00113 // TCP layer definitions
00114 #define TCP_SRCPORT_OFS      IP_DATA_OFS + 0     // Source Port (16 bit)
00115 #define TCP_DESTPORT_OFS     IP_DATA_OFS + 2     // Destination Port (16 bit)
00116 #define TCP_SEQNR_OFS        IP_DATA_OFS + 4     // Sequence Number (32 bit)
00117 #define TCP_ACKNR_OFS        IP_DATA_OFS + 8     // Acknowledge Number (32 bit)
00118 #define TCP_DATA_CODE_OFS    IP_DATA_OFS + 12    // Data Offset and Control Bits (16 bit)
00119 #define TCP_WINDOW_OFS       IP_DATA_OFS + 14    // Window Size (16 bit)
00120 #define TCP_CHKSUM_OFS       IP_DATA_OFS + 16    // Checksum Field (16 bit)
00121 #define TCP_URGENT_OFS       IP_DATA_OFS + 18    // Urgent Pointer (16 bit)
00122 #define TCP_DATA_OFS         IP_DATA_OFS + 20    // Frame Data (if no options)
00123 #define TCP_HEADER_SIZE      20                  // size w/o options
00124 
00125 #define DATA_OFS_MASK        0xF000              // number of 32 bit words in the TCP Header
00126 
00127 #define TCP_CODE_FIN         0x0001
00128 #define TCP_CODE_SYN         0x0002
00129 #define TCP_CODE_RST         0x0004
00130 #define TCP_CODE_PSH         0x0008
00131 #define TCP_CODE_ACK         0x0010
00132 #define TCP_CODE_URG         0x0020
00133 
00134 #define TCP_OPT_MSS          0x0204              // Type 2, Option Length 4 (Max. Segment Size)
00135 #define TCP_OPT_MSS_SIZE     4
00136 
00137 // define some TCP standard-ports, useful for testing...
00138 #define TCP_PORT_ECHO        7                   // echo
00139 #define TCP_PORT_DISCARD     9                   // discard
00140 #define TCP_PORT_DAYTIME     13                  // daytime
00141 #define TCP_PORT_QOTD        17                  // quote of the day
00142 #define TCP_PORT_CHARGEN     19                  // character generator
00143 #define TCP_PORT_HTTP        80                  // word wide web HTTP
00144 
00145 // macros
00146 #define SWAPB(Word)          ((unsigned short)((Word) << 8) | ((Word) >> 8))
00147                                                  // convert little <-> big endian
00148 
00149 // typedefs
00150 typedef enum {                                   // states of the TCP-state machine
00151   CLOSED,                                        // according to RFC793
00152   LISTENING,
00153   SYN_SENT,
00154   SYN_RECD,
00155   ESTABLISHED,
00156   FIN_WAIT_1,
00157   FIN_WAIT_2,
00158   CLOSE_WAIT,
00159   CLOSING,
00160   LAST_ACK,
00161   TIME_WAIT
00162 } TTCPStateMachine;
00163 
00164 typedef enum {                                   // type of last frame sent. used
00165   ARP_REQUEST,                                   // for retransmissions
00166   TCP_SYN_FRAME,
00167   TCP_SYN_ACK_FRAME,
00168   TCP_FIN_FRAME,
00169   TCP_DATA_FRAME
00170 } TLastFrameSent;
00171 
00172 // constants
00173 
00174 // Code Red
00175 // ifdef added as due to change to including .h files rather than .c files.
00176 // The use of ifdef reduces the coding changes that would otherwise be required,
00177 // depending upon which file is including this one.
00178 // the next 3 buffers must be word-aligned!
00179 // (here the 'RecdIPFrameLength' above does that)
00180 
00181 extern unsigned short _TxFrame1[(ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE + MAX_TCP_TX_DATA_SIZE)/2];
00182 extern unsigned short _TxFrame2[(ETH_HEADER_SIZE + MAX_ETH_TX_DATA_SIZE)/2];
00183 extern unsigned short _RxTCPBuffer[MAX_TCP_RX_DATA_SIZE/2]; // space for incoming TCP-data
00184 #define TxFrame1      ((unsigned char *)_TxFrame1)
00185 #define TxFrame2      ((unsigned char *)_TxFrame2)
00186 #define RxTCPBuffer   ((unsigned char *)_RxTCPBuffer)
00187 
00188 //
00189 // prototypes
00190 void DoNetworkStuff(void);
00191 
00192 // Handlers for incoming frames
00193 void ProcessEthBroadcastFrame(void);
00194 void ProcessEthIAFrame(void);
00195 void ProcessICMPFrame(void);
00196 void ProcessTCPFrame(void);
00197 
00198 // fill TX-buffers
00199 void PrepareARP_REQUEST(void);
00200 void PrepareARP_ANSWER(void);
00201 void PrepareICMP_ECHO_REPLY(void);
00202 void PrepareTCP_FRAME(unsigned short TCPCode);
00203 void PrepareTCP_DATA_FRAME(void);
00204 
00205 // general help functions
00206 void SendFrame1(void);
00207 void SendFrame2(void);
00208 void TCPStartRetryTimer(void);
00209 void TCPStartTimeWaitTimer(void);
00210 void TCPRestartTimer(void);
00211 void TCPStopTimer(void);
00212 void TCPHandleRetransmission(void);
00213 void TCPHandleTimeout(void);
00214 unsigned short CalcChecksum(void *Start, unsigned short Count, unsigned char IsTCP);
00215 
00216 // functions to work with big-endian numbers
00217 unsigned short SwapBytes(unsigned short Data);
00218 void WriteWBE(unsigned char *Add, unsigned short Data);
00219 void WriteDWBE(unsigned char *Add, unsigned long Data);
00220 
00221 // easyWEB-API functions
00222 void TCPLowLevelInit(void);                      // setup timer, LAN-controller, flags...
00223 void TCPPassiveOpen(void);                       // listen for a connection
00224 void TCPActiveOpen(void);                        // open connection
00225 void TCPClose(void);                             // close connection
00226 void TCPReleaseRxBuffer(void);                   // indicate to discard rec'd packet
00227 void TCPTransmitTxBuffer(void);                  // initiate transfer after TxBuffer is filled
00228 // Code Red - added declaration for Timer0 ISR
00229 void TCPClockHandler(void);                      
00230 
00231 // easyWEB-API global vars and flags
00232 extern unsigned short TCPRxDataCount;            // nr. of bytes rec'd
00233 extern unsigned short TCPTxDataCount;            // nr. of bytes to send
00234 
00235 extern unsigned short TCPLocalPort;              // TCP ports
00236 extern unsigned short TCPRemotePort;
00237 
00238 extern unsigned short RemoteMAC[3];              // MAC and IP of current TCP-session
00239 extern unsigned short RemoteIP[2];
00240 
00241 extern unsigned char SocketStatus;
00242 #define SOCK_ACTIVE                    0x01      // state machine NOT closed
00243 #define SOCK_CONNECTED                 0x02      // user may send & receive data
00244 #define SOCK_DATA_AVAILABLE            0x04      // new data available
00245 #define SOCK_TX_BUF_RELEASED           0x08      // user may fill buffer
00246 
00247 #define SOCK_ERROR_MASK                0xF0      // bit-mask to check for errors
00248 #define SOCK_ERR_OK                    0x00      // no error
00249 #define SOCK_ERR_ARP_TIMEOUT           0x10      // timeout waiting for an ARP-REPLY
00250 #define SOCK_ERR_TCP_TIMEOUT           0x20      // timeout waiting for an ACK
00251 #define SOCK_ERR_CONN_RESET            0x30      // connection was reset by the other TCP
00252 #define SOCK_ERR_REMOTE                0x40      // remote TCP caused fatal error
00253 #define SOCK_ERR_ETHERNET              0x50      // network interface error (timeout)
00254 
00255 // easyWEB-API buffer-pointers
00256 #define TCP_TX_BUF      ((unsigned char *)TxFrame1 + ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE)
00257 #define TCP_RX_BUF      ((unsigned char *)RxTCPBuffer)
00258 
00259 #endif
00260