Webserver basic for CDU

Dependencies:   mbed

Fork of EasyWebCR by Igor Skochinsky

Committer:
igorsk
Date:
Fri Jan 29 21:46:31 2010 +0000
Revision:
0:12b53511e212

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igorsk 0:12b53511e212 1 /******************************************************************
igorsk 0:12b53511e212 2 ***** *****
igorsk 0:12b53511e212 3 ***** Name: tcpip.h *****
igorsk 0:12b53511e212 4 ***** Ver.: 1.0 *****
igorsk 0:12b53511e212 5 ***** Date: 07/05/2001 *****
igorsk 0:12b53511e212 6 ***** Auth: Andreas Dannenberg *****
igorsk 0:12b53511e212 7 ***** HTWK Leipzig *****
igorsk 0:12b53511e212 8 ***** university of applied sciences *****
igorsk 0:12b53511e212 9 ***** Germany *****
igorsk 0:12b53511e212 10 ***** Func: header-file for tcpip.c *****
igorsk 0:12b53511e212 11 ***** *****
igorsk 0:12b53511e212 12 ******************************************************************/
igorsk 0:12b53511e212 13
igorsk 0:12b53511e212 14 // Modifications by Code Red Technologies for NXP LPC1776
igorsk 0:12b53511e212 15
igorsk 0:12b53511e212 16 #ifndef __TCPIP_H
igorsk 0:12b53511e212 17 #define __TCPIP_H
igorsk 0:12b53511e212 18
igorsk 0:12b53511e212 19 // easyWEB-stack definitions
igorsk 0:12b53511e212 20 // Code Red - replaced original address by 192.168.0.200
igorsk 0:12b53511e212 21 #define MYIP_1 192 // our internet protocol (IP) address
igorsk 0:12b53511e212 22 #define MYIP_2 168
igorsk 0:12b53511e212 23 #define MYIP_3 0
igorsk 0:12b53511e212 24 #define MYIP_4 200
igorsk 0:12b53511e212 25 //#define MYIP_4 30
igorsk 0:12b53511e212 26
igorsk 0:12b53511e212 27 #define SUBMASK_1 255 // subnet mask
igorsk 0:12b53511e212 28 #define SUBMASK_2 255
igorsk 0:12b53511e212 29 #define SUBMASK_3 255
igorsk 0:12b53511e212 30 #define SUBMASK_4 0
igorsk 0:12b53511e212 31
igorsk 0:12b53511e212 32 #define GWIP_1 192 // standard gateway (used if remote
igorsk 0:12b53511e212 33 #define GWIP_2 168 // IP is no part of our subnet)
igorsk 0:12b53511e212 34 #define GWIP_3 2
igorsk 0:12b53511e212 35 #define GWIP_4 154
igorsk 0:12b53511e212 36
igorsk 0:12b53511e212 37 #define RETRY_TIMEOUT 8 // wait max. 8 x 262ms for an ACK (about 2 sec.)
igorsk 0:12b53511e212 38 #define FIN_TIMEOUT 2 // max. time to wait for an ACK of a FIN
igorsk 0:12b53511e212 39 // before closing TCP state-machine (about 0.5 s)
igorsk 0:12b53511e212 40 #define MAX_RETRYS 4 // nr. of resendings before reset conn.
igorsk 0:12b53511e212 41 // total nr. of transmissions = MAX_RETRYS + 1
igorsk 0:12b53511e212 42
igorsk 0:12b53511e212 43 #define MAX_TCP_TX_DATA_SIZE 512 // max. outgoing TCP data size (even!)
igorsk 0:12b53511e212 44 #define MAX_TCP_RX_DATA_SIZE 256 // max. incoming TCP data size (even!)
igorsk 0:12b53511e212 45 // (increasing the buffer-size dramatically
igorsk 0:12b53511e212 46 // increases the transfer-speed!)
igorsk 0:12b53511e212 47
igorsk 0:12b53511e212 48 #define MAX_ETH_TX_DATA_SIZE 60 // 2nd buffer, used for ARP, ICMP, TCP (even!)
igorsk 0:12b53511e212 49 // enough to echo 32 byte via ICMP
igorsk 0:12b53511e212 50
igorsk 0:12b53511e212 51 #define DEFAULT_TTL 64 // Time To Live sent with packets
igorsk 0:12b53511e212 52
igorsk 0:12b53511e212 53 // Ethernet network layer definitions
igorsk 0:12b53511e212 54 #define ETH_DA_OFS 0 // Destination MAC address (48 Bit)
igorsk 0:12b53511e212 55 #define ETH_SA_OFS 6 // Source MAC address (48 Bit)
igorsk 0:12b53511e212 56 #define ETH_TYPE_OFS 12 // Type field (16 Bit)
igorsk 0:12b53511e212 57 #define ETH_DATA_OFS 14 // Frame Data
igorsk 0:12b53511e212 58 #define ETH_HEADER_SIZE 14
igorsk 0:12b53511e212 59
igorsk 0:12b53511e212 60 #define FRAME_ARP 0x0806 // frame types (stored in Type/Length field)
igorsk 0:12b53511e212 61 #define FRAME_IP 0x0800
igorsk 0:12b53511e212 62
igorsk 0:12b53511e212 63 // IPv4 layer definitions
igorsk 0:12b53511e212 64 #define IP_VER_IHL_TOS_OFS ETH_DATA_OFS + 0 // Version, Header Length, Type of Service
igorsk 0:12b53511e212 65 #define IP_TOTAL_LENGTH_OFS ETH_DATA_OFS + 2 // IP Frame's Total Length
igorsk 0:12b53511e212 66 #define IP_IDENT_OFS ETH_DATA_OFS + 4 // Identifying Value
igorsk 0:12b53511e212 67 #define IP_FLAGS_FRAG_OFS ETH_DATA_OFS + 6 // Flags and Fragment Offset
igorsk 0:12b53511e212 68 #define IP_TTL_PROT_OFS ETH_DATA_OFS + 8 // Frame's Time to Live, Protocol
igorsk 0:12b53511e212 69 #define IP_HEAD_CHKSUM_OFS ETH_DATA_OFS + 10 // IP Frame's Header Checksum
igorsk 0:12b53511e212 70 #define IP_SOURCE_OFS ETH_DATA_OFS + 12 // Source Address (32 Bit)
igorsk 0:12b53511e212 71 #define IP_DESTINATION_OFS ETH_DATA_OFS + 16 // Destination Address (32 Bit)
igorsk 0:12b53511e212 72 #define IP_DATA_OFS ETH_DATA_OFS + 20 // Frame Data (if no options)
igorsk 0:12b53511e212 73 #define IP_HEADER_SIZE 20 // w/o options
igorsk 0:12b53511e212 74
igorsk 0:12b53511e212 75 #define IP_VER_IHL 0x4500 // IPv4, Header Length = 5x32 bit
igorsk 0:12b53511e212 76 #define IP_TOS_D 0x0010 // TOS low delay
igorsk 0:12b53511e212 77 #define IP_TOS_T 0x0008 // TOS high throughput
igorsk 0:12b53511e212 78 #define IP_TOS_R 0x0004 // TOS high reliability
igorsk 0:12b53511e212 79
igorsk 0:12b53511e212 80 #define IP_FLAG_DONTFRAG 0x4000 // don't fragment IP frame
igorsk 0:12b53511e212 81 #define IP_FLAG_MOREFRAG 0x2000 // more fragments available
igorsk 0:12b53511e212 82 #define IP_FRAGOFS_MASK 0x1FFF // indicates where this fragment belongs
igorsk 0:12b53511e212 83
igorsk 0:12b53511e212 84 #define PROT_ICMP 1 // Internet Control Message Protocol
igorsk 0:12b53511e212 85 #define PROT_TCP 6 // Transmission Control Protocol
igorsk 0:12b53511e212 86 #define PROT_UDP 17 // User Datagram Protocol
igorsk 0:12b53511e212 87
igorsk 0:12b53511e212 88 // ARP definitions
igorsk 0:12b53511e212 89 #define ARP_HARDW_OFS ETH_DATA_OFS + 0 // Hardware address type
igorsk 0:12b53511e212 90 #define ARP_PROT_OFS ETH_DATA_OFS + 2 // Protocol
igorsk 0:12b53511e212 91 #define ARP_HLEN_PLEN_OFS ETH_DATA_OFS + 4 // byte length of each hardw. / prot. address
igorsk 0:12b53511e212 92 #define ARP_OPCODE_OFS ETH_DATA_OFS + 6 // Opcode
igorsk 0:12b53511e212 93 #define ARP_SENDER_HA_OFS ETH_DATA_OFS + 8 // Hardw. address of sender of this packet
igorsk 0:12b53511e212 94 #define ARP_SENDER_IP_OFS ETH_DATA_OFS + 14 // IP address of sender
igorsk 0:12b53511e212 95 #define ARP_TARGET_HA_OFS ETH_DATA_OFS + 18 // Hardw. address of target of this packet
igorsk 0:12b53511e212 96 #define ARP_TARGET_IP_OFS ETH_DATA_OFS + 24 // IP address of target
igorsk 0:12b53511e212 97 #define ARP_FRAME_SIZE 28
igorsk 0:12b53511e212 98
igorsk 0:12b53511e212 99 #define HARDW_ETH10 1 // hardware-type 10Mbps Ethernet
igorsk 0:12b53511e212 100 #define IP_HLEN_PLEN 0x0604 // MAC = 6 byte long, IP = 4 byte long
igorsk 0:12b53511e212 101 #define OP_ARP_REQUEST 1 // operations for ARP-frames
igorsk 0:12b53511e212 102 #define OP_ARP_ANSWER 2
igorsk 0:12b53511e212 103
igorsk 0:12b53511e212 104 // ICMP definitions
igorsk 0:12b53511e212 105 #define ICMP_TYPE_CODE_OFS IP_DATA_OFS + 0 // type of message
igorsk 0:12b53511e212 106 #define ICMP_CHKSUM_OFS IP_DATA_OFS + 2 // checksum of ICMP-message (16 bit)
igorsk 0:12b53511e212 107 #define ICMP_DATA_OFS IP_DATA_OFS + 4
igorsk 0:12b53511e212 108 #define ICMP_HEADER_SIZE 4
igorsk 0:12b53511e212 109
igorsk 0:12b53511e212 110 #define ICMP_ECHO 8 // message is an echo request
igorsk 0:12b53511e212 111 #define ICMP_ECHO_REPLY 0 // message is an echo reply
igorsk 0:12b53511e212 112
igorsk 0:12b53511e212 113 // TCP layer definitions
igorsk 0:12b53511e212 114 #define TCP_SRCPORT_OFS IP_DATA_OFS + 0 // Source Port (16 bit)
igorsk 0:12b53511e212 115 #define TCP_DESTPORT_OFS IP_DATA_OFS + 2 // Destination Port (16 bit)
igorsk 0:12b53511e212 116 #define TCP_SEQNR_OFS IP_DATA_OFS + 4 // Sequence Number (32 bit)
igorsk 0:12b53511e212 117 #define TCP_ACKNR_OFS IP_DATA_OFS + 8 // Acknowledge Number (32 bit)
igorsk 0:12b53511e212 118 #define TCP_DATA_CODE_OFS IP_DATA_OFS + 12 // Data Offset and Control Bits (16 bit)
igorsk 0:12b53511e212 119 #define TCP_WINDOW_OFS IP_DATA_OFS + 14 // Window Size (16 bit)
igorsk 0:12b53511e212 120 #define TCP_CHKSUM_OFS IP_DATA_OFS + 16 // Checksum Field (16 bit)
igorsk 0:12b53511e212 121 #define TCP_URGENT_OFS IP_DATA_OFS + 18 // Urgent Pointer (16 bit)
igorsk 0:12b53511e212 122 #define TCP_DATA_OFS IP_DATA_OFS + 20 // Frame Data (if no options)
igorsk 0:12b53511e212 123 #define TCP_HEADER_SIZE 20 // size w/o options
igorsk 0:12b53511e212 124
igorsk 0:12b53511e212 125 #define DATA_OFS_MASK 0xF000 // number of 32 bit words in the TCP Header
igorsk 0:12b53511e212 126
igorsk 0:12b53511e212 127 #define TCP_CODE_FIN 0x0001
igorsk 0:12b53511e212 128 #define TCP_CODE_SYN 0x0002
igorsk 0:12b53511e212 129 #define TCP_CODE_RST 0x0004
igorsk 0:12b53511e212 130 #define TCP_CODE_PSH 0x0008
igorsk 0:12b53511e212 131 #define TCP_CODE_ACK 0x0010
igorsk 0:12b53511e212 132 #define TCP_CODE_URG 0x0020
igorsk 0:12b53511e212 133
igorsk 0:12b53511e212 134 #define TCP_OPT_MSS 0x0204 // Type 2, Option Length 4 (Max. Segment Size)
igorsk 0:12b53511e212 135 #define TCP_OPT_MSS_SIZE 4
igorsk 0:12b53511e212 136
igorsk 0:12b53511e212 137 // define some TCP standard-ports, useful for testing...
igorsk 0:12b53511e212 138 #define TCP_PORT_ECHO 7 // echo
igorsk 0:12b53511e212 139 #define TCP_PORT_DISCARD 9 // discard
igorsk 0:12b53511e212 140 #define TCP_PORT_DAYTIME 13 // daytime
igorsk 0:12b53511e212 141 #define TCP_PORT_QOTD 17 // quote of the day
igorsk 0:12b53511e212 142 #define TCP_PORT_CHARGEN 19 // character generator
igorsk 0:12b53511e212 143 #define TCP_PORT_HTTP 80 // word wide web HTTP
igorsk 0:12b53511e212 144
igorsk 0:12b53511e212 145 // macros
igorsk 0:12b53511e212 146 #define SWAPB(Word) ((unsigned short)((Word) << 8) | ((Word) >> 8))
igorsk 0:12b53511e212 147 // convert little <-> big endian
igorsk 0:12b53511e212 148
igorsk 0:12b53511e212 149 // typedefs
igorsk 0:12b53511e212 150 typedef enum { // states of the TCP-state machine
igorsk 0:12b53511e212 151 CLOSED, // according to RFC793
igorsk 0:12b53511e212 152 LISTENING,
igorsk 0:12b53511e212 153 SYN_SENT,
igorsk 0:12b53511e212 154 SYN_RECD,
igorsk 0:12b53511e212 155 ESTABLISHED,
igorsk 0:12b53511e212 156 FIN_WAIT_1,
igorsk 0:12b53511e212 157 FIN_WAIT_2,
igorsk 0:12b53511e212 158 CLOSE_WAIT,
igorsk 0:12b53511e212 159 CLOSING,
igorsk 0:12b53511e212 160 LAST_ACK,
igorsk 0:12b53511e212 161 TIME_WAIT
igorsk 0:12b53511e212 162 } TTCPStateMachine;
igorsk 0:12b53511e212 163
igorsk 0:12b53511e212 164 typedef enum { // type of last frame sent. used
igorsk 0:12b53511e212 165 ARP_REQUEST, // for retransmissions
igorsk 0:12b53511e212 166 TCP_SYN_FRAME,
igorsk 0:12b53511e212 167 TCP_SYN_ACK_FRAME,
igorsk 0:12b53511e212 168 TCP_FIN_FRAME,
igorsk 0:12b53511e212 169 TCP_DATA_FRAME
igorsk 0:12b53511e212 170 } TLastFrameSent;
igorsk 0:12b53511e212 171
igorsk 0:12b53511e212 172 // constants
igorsk 0:12b53511e212 173
igorsk 0:12b53511e212 174 // Code Red
igorsk 0:12b53511e212 175 // ifdef added as due to change to including .h files rather than .c files.
igorsk 0:12b53511e212 176 // The use of ifdef reduces the coding changes that would otherwise be required,
igorsk 0:12b53511e212 177 // depending upon which file is including this one.
igorsk 0:12b53511e212 178 // the next 3 buffers must be word-aligned!
igorsk 0:12b53511e212 179 // (here the 'RecdIPFrameLength' above does that)
igorsk 0:12b53511e212 180
igorsk 0:12b53511e212 181 extern unsigned short _TxFrame1[(ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE + MAX_TCP_TX_DATA_SIZE)/2];
igorsk 0:12b53511e212 182 extern unsigned short _TxFrame2[(ETH_HEADER_SIZE + MAX_ETH_TX_DATA_SIZE)/2];
igorsk 0:12b53511e212 183 extern unsigned short _RxTCPBuffer[MAX_TCP_RX_DATA_SIZE/2]; // space for incoming TCP-data
igorsk 0:12b53511e212 184 #define TxFrame1 ((unsigned char *)_TxFrame1)
igorsk 0:12b53511e212 185 #define TxFrame2 ((unsigned char *)_TxFrame2)
igorsk 0:12b53511e212 186 #define RxTCPBuffer ((unsigned char *)_RxTCPBuffer)
igorsk 0:12b53511e212 187
igorsk 0:12b53511e212 188 //
igorsk 0:12b53511e212 189 // prototypes
igorsk 0:12b53511e212 190 void DoNetworkStuff(void);
igorsk 0:12b53511e212 191
igorsk 0:12b53511e212 192 // Handlers for incoming frames
igorsk 0:12b53511e212 193 void ProcessEthBroadcastFrame(void);
igorsk 0:12b53511e212 194 void ProcessEthIAFrame(void);
igorsk 0:12b53511e212 195 void ProcessICMPFrame(void);
igorsk 0:12b53511e212 196 void ProcessTCPFrame(void);
igorsk 0:12b53511e212 197
igorsk 0:12b53511e212 198 // fill TX-buffers
igorsk 0:12b53511e212 199 void PrepareARP_REQUEST(void);
igorsk 0:12b53511e212 200 void PrepareARP_ANSWER(void);
igorsk 0:12b53511e212 201 void PrepareICMP_ECHO_REPLY(void);
igorsk 0:12b53511e212 202 void PrepareTCP_FRAME(unsigned short TCPCode);
igorsk 0:12b53511e212 203 void PrepareTCP_DATA_FRAME(void);
igorsk 0:12b53511e212 204
igorsk 0:12b53511e212 205 // general help functions
igorsk 0:12b53511e212 206 void SendFrame1(void);
igorsk 0:12b53511e212 207 void SendFrame2(void);
igorsk 0:12b53511e212 208 void TCPStartRetryTimer(void);
igorsk 0:12b53511e212 209 void TCPStartTimeWaitTimer(void);
igorsk 0:12b53511e212 210 void TCPRestartTimer(void);
igorsk 0:12b53511e212 211 void TCPStopTimer(void);
igorsk 0:12b53511e212 212 void TCPHandleRetransmission(void);
igorsk 0:12b53511e212 213 void TCPHandleTimeout(void);
igorsk 0:12b53511e212 214 unsigned short CalcChecksum(void *Start, unsigned short Count, unsigned char IsTCP);
igorsk 0:12b53511e212 215
igorsk 0:12b53511e212 216 // functions to work with big-endian numbers
igorsk 0:12b53511e212 217 unsigned short SwapBytes(unsigned short Data);
igorsk 0:12b53511e212 218 void WriteWBE(unsigned char *Add, unsigned short Data);
igorsk 0:12b53511e212 219 void WriteDWBE(unsigned char *Add, unsigned long Data);
igorsk 0:12b53511e212 220
igorsk 0:12b53511e212 221 // easyWEB-API functions
igorsk 0:12b53511e212 222 void TCPLowLevelInit(void); // setup timer, LAN-controller, flags...
igorsk 0:12b53511e212 223 void TCPPassiveOpen(void); // listen for a connection
igorsk 0:12b53511e212 224 void TCPActiveOpen(void); // open connection
igorsk 0:12b53511e212 225 void TCPClose(void); // close connection
igorsk 0:12b53511e212 226 void TCPReleaseRxBuffer(void); // indicate to discard rec'd packet
igorsk 0:12b53511e212 227 void TCPTransmitTxBuffer(void); // initiate transfer after TxBuffer is filled
igorsk 0:12b53511e212 228 // Code Red - added declaration for Timer0 ISR
igorsk 0:12b53511e212 229 void TCPClockHandler(void);
igorsk 0:12b53511e212 230
igorsk 0:12b53511e212 231 // easyWEB-API global vars and flags
igorsk 0:12b53511e212 232 extern unsigned short TCPRxDataCount; // nr. of bytes rec'd
igorsk 0:12b53511e212 233 extern unsigned short TCPTxDataCount; // nr. of bytes to send
igorsk 0:12b53511e212 234
igorsk 0:12b53511e212 235 extern unsigned short TCPLocalPort; // TCP ports
igorsk 0:12b53511e212 236 extern unsigned short TCPRemotePort;
igorsk 0:12b53511e212 237
igorsk 0:12b53511e212 238 extern unsigned short RemoteMAC[3]; // MAC and IP of current TCP-session
igorsk 0:12b53511e212 239 extern unsigned short RemoteIP[2];
igorsk 0:12b53511e212 240
igorsk 0:12b53511e212 241 extern unsigned char SocketStatus;
igorsk 0:12b53511e212 242 #define SOCK_ACTIVE 0x01 // state machine NOT closed
igorsk 0:12b53511e212 243 #define SOCK_CONNECTED 0x02 // user may send & receive data
igorsk 0:12b53511e212 244 #define SOCK_DATA_AVAILABLE 0x04 // new data available
igorsk 0:12b53511e212 245 #define SOCK_TX_BUF_RELEASED 0x08 // user may fill buffer
igorsk 0:12b53511e212 246
igorsk 0:12b53511e212 247 #define SOCK_ERROR_MASK 0xF0 // bit-mask to check for errors
igorsk 0:12b53511e212 248 #define SOCK_ERR_OK 0x00 // no error
igorsk 0:12b53511e212 249 #define SOCK_ERR_ARP_TIMEOUT 0x10 // timeout waiting for an ARP-REPLY
igorsk 0:12b53511e212 250 #define SOCK_ERR_TCP_TIMEOUT 0x20 // timeout waiting for an ACK
igorsk 0:12b53511e212 251 #define SOCK_ERR_CONN_RESET 0x30 // connection was reset by the other TCP
igorsk 0:12b53511e212 252 #define SOCK_ERR_REMOTE 0x40 // remote TCP caused fatal error
igorsk 0:12b53511e212 253 #define SOCK_ERR_ETHERNET 0x50 // network interface error (timeout)
igorsk 0:12b53511e212 254
igorsk 0:12b53511e212 255 // easyWEB-API buffer-pointers
igorsk 0:12b53511e212 256 #define TCP_TX_BUF ((unsigned char *)TxFrame1 + ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE)
igorsk 0:12b53511e212 257 #define TCP_RX_BUF ((unsigned char *)RxTCPBuffer)
igorsk 0:12b53511e212 258
igorsk 0:12b53511e212 259 #endif
igorsk 0:12b53511e212 260