⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpip.h

📁 网络,基于嵌入式的网络协议,UDP/IP的协议.处理器无关部分源代码
💻 H
字号:
/****************************************************************** *****                                                        ***** *****  Name: tcpip.h                                         ***** *****  Ver.: 1.0                                             ***** *****  Date: 07/05/2001                                      ***** *****  Auth: Andreas Dannenberg                              ***** *****        HTWK Leipzig                                    ***** *****        university of applied sciences                  ***** *****        Germany                                         ***** *****        adannenb@et.htwk-leipzig.de                     ***** *****  Func: header-file for tcpip.c                         ***** *****                                                        ***** ******************************************************************/#ifndef __TCPIP_H#define __TCPIP_H// easyWEB-stack definitions#define MYIP_1               192                 // our internet protocol (IP) address#define MYIP_2               168#define MYIP_3               0#define MYIP_4               30#define SUBMASK_1            255                 // subnet mask#define SUBMASK_2            255#define SUBMASK_3            255#define SUBMASK_4            0#define GWIP_1               192                 // standard gateway (used if remote#define GWIP_2               168                 // IP is no part of our subnet)#define GWIP_3               0#define GWIP_4               200#define RETRY_TIMEOUT        8                   // wait max. 8 x 262ms for an ACK (about 2 sec.)#define FIN_TIMEOUT          2                   // max. time to wait for an ACK of a FIN                                                 // before closing TCP state-machine (about 0.5 s)#define MAX_RETRYS           4                   // nr. of resendings before reset conn.                                                 // total nr. of transmissions = MAX_RETRYS + 1#define MAX_TCP_TX_DATA_SIZE 512                 // max. outgoing TCP data size (even!)#define MAX_TCP_RX_DATA_SIZE 256                 // max. incoming TCP data size (even!)                                                 // (increasing the buffer-size dramatically                                                 // increases the transfer-speed!)                                        #define MAX_ETH_TX_DATA_SIZE 60                  // 2nd buffer, used for ARP, ICMP, TCP (even!)                                                 // enough to echo 32 byte via ICMP#define DEFAULT_TTL          64                  // Time To Live sent with packets// Ethernet network layer definitions#define ETH_DA_OFS           0                   // Destination MAC address (48 Bit)#define ETH_SA_OFS           6                   // Source MAC address (48 Bit)#define ETH_TYPE_OFS         12                  // Type field (16 Bit)#define ETH_DATA_OFS         14                  // Frame Data#define ETH_HEADER_SIZE      14#define FRAME_ARP            0x0806              // frame types (stored in Type/Length field)#define FRAME_IP             0x0800// IPv4 layer definitions#define IP_VER_IHL_TOS_OFS   ETH_DATA_OFS + 0    // Version, Header Length, Type of Service#define IP_TOTAL_LENGTH_OFS  ETH_DATA_OFS + 2    // IP Frame's Total Length#define IP_IDENT_OFS         ETH_DATA_OFS + 4    // Identifying Value#define IP_FLAGS_FRAG_OFS    ETH_DATA_OFS + 6    // Flags and Fragment Offset#define IP_TTL_PROT_OFS      ETH_DATA_OFS + 8    // Frame's Time to Live, Protocol#define IP_HEAD_CHKSUM_OFS   ETH_DATA_OFS + 10   // IP Frame's Header Checksum#define IP_SOURCE_OFS        ETH_DATA_OFS + 12   // Source Address (32 Bit)#define IP_DESTINATION_OFS   ETH_DATA_OFS + 16   // Destination Address (32 Bit)#define IP_DATA_OFS          ETH_DATA_OFS + 20   // Frame Data (if no options)#define IP_HEADER_SIZE       20                  // w/o options#define IP_VER_IHL           0x4500              // IPv4, Header Length = 5x32 bit#define IP_TOS_D             0x0010              // TOS low delay#define IP_TOS_T             0x0008              // TOS high throughput#define IP_TOS_R             0x0004              // TOS high reliability#define IP_FLAG_DONTFRAG     0x4000              // don't fragment IP frame#define IP_FLAG_MOREFRAG     0x2000              // more fragments available#define IP_FRAGOFS_MASK      0x1FFF              // indicates where this fragment belongs#define PROT_ICMP            1                   // Internet Control Message Protocol#define PROT_TCP             6                   // Transmission Control Protocol#define PROT_UDP             17                  // User Datagram Protocol// ARP definitions#define ARP_HARDW_OFS        ETH_DATA_OFS + 0    // Hardware address type#define ARP_PROT_OFS         ETH_DATA_OFS + 2    // Protocol#define ARP_HLEN_PLEN_OFS    ETH_DATA_OFS + 4    // byte length of each hardw. / prot. address#define ARP_OPCODE_OFS       ETH_DATA_OFS + 6    // Opcode#define ARP_SENDER_HA_OFS    ETH_DATA_OFS + 8    // Hardw. address of sender of this packet#define ARP_SENDER_IP_OFS    ETH_DATA_OFS + 14   // IP address of sender#define ARP_TARGET_HA_OFS    ETH_DATA_OFS + 18   // Hardw. address of target of this packet#define ARP_TARGET_IP_OFS    ETH_DATA_OFS + 24   // IP address of target#define ARP_FRAME_SIZE       28#define HARDW_ETH10          1                   // hardware-type 10Mbps Ethernet#define IP_HLEN_PLEN         0x0604              // MAC = 6 byte long, IP = 4 byte long#define OP_ARP_REQUEST       1                   // operations for ARP-frames#define OP_ARP_ANSWER        2// ICMP definitions#define ICMP_TYPE_CODE_OFS   IP_DATA_OFS + 0     // type of message#define ICMP_CHKSUM_OFS      IP_DATA_OFS + 2     // checksum of ICMP-message (16 bit)#define ICMP_DATA_OFS        IP_DATA_OFS + 4#define ICMP_HEADER_SIZE     4#define ICMP_ECHO            8                   // message is an echo request#define ICMP_ECHO_REPLY      0                   // message is an echo reply// TCP layer definitions#define TCP_SRCPORT_OFS      IP_DATA_OFS + 0     // Source Port (16 bit)#define TCP_DESTPORT_OFS     IP_DATA_OFS + 2     // Destination Port (16 bit)#define TCP_SEQNR_OFS        IP_DATA_OFS + 4     // Sequence Number (32 bit)#define TCP_ACKNR_OFS        IP_DATA_OFS + 8     // Acknowledge Number (32 bit)#define TCP_DATA_CODE_OFS    IP_DATA_OFS + 12    // Data Offset and Control Bits (16 bit)#define TCP_WINDOW_OFS       IP_DATA_OFS + 14    // Window Size (16 bit)#define TCP_CHKSUM_OFS       IP_DATA_OFS + 16    // Checksum Field (16 bit)#define TCP_URGENT_OFS       IP_DATA_OFS + 18    // Urgent Pointer (16 bit)#define TCP_DATA_OFS         IP_DATA_OFS + 20    // Frame Data (if no options)#define TCP_HEADER_SIZE      20                  // size w/o options#define DATA_OFS_MASK        0xF000              // number of 32 bit words in the TCP Header#define TCP_CODE_FIN         0x0001#define TCP_CODE_SYN         0x0002#define TCP_CODE_RST         0x0004#define TCP_CODE_PSH         0x0008#define TCP_CODE_ACK         0x0010#define TCP_CODE_URG         0x0020#define TCP_OPT_MSS          0x0204              // Type 2, Option Length 4 (Max. Segment Size)#define TCP_OPT_MSS_SIZE     4// define some TCP standard-ports, useful for testing...#define TCP_PORT_ECHO        7                   // echo#define TCP_PORT_DISCARD     9                   // discard#define TCP_PORT_DAYTIME     13                  // daytime#define TCP_PORT_QOTD        17                  // quote of the day#define TCP_PORT_CHARGEN     19                  // character generator#define TCP_PORT_HTTP        80                  // word wide web HTTP// macros#define SWAPB(Word)          ((unsigned int)((Word) << 8) | ((Word) >> 8))                                                 // convert little <-> big endian// typedefstypedef enum {                                   // states of the TCP-state machine  CLOSED,                                        // according to RFC793  LISTENING,  SYN_SENT,  SYN_RECD,  ESTABLISHED,  FIN_WAIT_1,  FIN_WAIT_2,  CLOSE_WAIT,  CLOSING,  LAST_ACK,  TIME_WAIT} TTCPStateMachine;typedef enum {                                   // type of last frame sent. used  ARP_REQUEST,                                   // for retransmissions  TCP_SYN_FRAME,  TCP_SYN_ACK_FRAME,  TCP_FIN_FRAME,  TCP_DATA_FRAME} TLastFrameSent;// constantsconst unsigned int MyIP[] =                      // "MYIP1.MYIP2.MYIP3.MYIP4"{  MYIP_1 + (MYIP_2 << 8),                        // use 'unsigned int' to  MYIP_3 + (MYIP_4 << 8)                         // achieve word alignment};const unsigned int SubnetMask[] =                // "SUBMASK1.SUBMASK2.SUBMASK3.SUBMASK4"{  SUBMASK_1 + (SUBMASK_2 << 8),                  // use 'unsigned int' to  SUBMASK_3 + (SUBMASK_4 << 8)                   // achieve word alignment};const unsigned int GatewayIP[] =                 // "GWIP1.GWIP2.GWIP3.GWIP4"{  GWIP_1 + (GWIP_2 << 8),                        // use 'unsigned int' to  GWIP_3 + (GWIP_4 << 8)                         // achieve word alignment};// easyWEB's internal variablesTTCPStateMachine TCPStateMachine;                // perhaps the most important var at all ;-)TLastFrameSent LastFrameSent;                    // retransmission typeunsigned int ISNGenHigh;                         // upper word of our Initial Sequence Numberunsigned long TCPSeqNr;                          // next sequence number to sendunsigned long TCPUNASeqNr;                       // last unaknowledged sequence number                                                 // incremented AFTER sending dataunsigned long TCPAckNr;                          // next seq to receive and ack to send                                                 // incremented AFTER receiving dataunsigned char TCPTimer;                          // inc'd each 262msunsigned char RetryCounter;                      // nr. of retransmissions// properties of the just received frameunsigned int RecdFrameLength;                    // CS8900 reported frame lengthunsigned int RecdFrameMAC[3];                    // 48 bit MACunsigned int RecdFrameIP[2];                     // 32 bit IPunsigned int RecdIPFrameLength;                  // 16 bit IP packet length// the next 3 buffers must be word-aligned!// (here the 'RecdIPFrameLength' above does that)unsigned char TxFrame1[ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE + MAX_TCP_TX_DATA_SIZE];unsigned char TxFrame2[ETH_HEADER_SIZE + MAX_ETH_TX_DATA_SIZE];unsigned char RxTCPBuffer[MAX_TCP_RX_DATA_SIZE]; // space for incoming TCP-dataunsigned int TxFrame1Size;                       // bytes to send in TxFrame1unsigned char TxFrame2Size;                      // bytes to send in TxFrame2unsigned char TransmitControl;#define SEND_FRAME1                    0x01#define SEND_FRAME2                    0x02unsigned char TCPFlags;#define TCP_ACTIVE_OPEN                0x01      // easyWEB shall initiate a connection#define IP_ADDR_RESOLVED               0x02      // IP sucessfully resolved to MAC#define TCP_TIMER_RUNNING              0x04#define TIMER_TYPE_RETRY               0x08#define TCP_CLOSE_REQUESTED            0x10// prototypesvoid DoNetworkStuff(void);// Handlers for incoming framesvoid ProcessEthBroadcastFrame(void);void ProcessEthIAFrame(void);void ProcessICMPFrame(void);void ProcessTCPFrame(void);// fill TX-buffersvoid PrepareARP_REQUEST(void);void PrepareARP_ANSWER(void);void PrepareICMP_ECHO_REPLY(void);void PrepareTCP_FRAME(unsigned int TCPCode);void PrepareTCP_DATA_FRAME(void);// general help functionsvoid SendFrame1(void);void SendFrame2(void);void TCPStartRetryTimer(void);void TCPStartTimeWaitTimer(void);void TCPRestartTimer(void);void TCPStopTimer(void);void TCPHandleRetransmission(void);void TCPHandleTimeout(void);unsigned int CalcChecksum(void *Start, unsigned int Count, unsigned char IsTCP);interrupt [TIMERA1_VECTOR] void TCPClockHandler(void);// interrupt function, called every 262 ms// functions to work with big-endian numbersunsigned int SwapBytes(unsigned int Data);void WriteWBE(unsigned char *Add, unsigned int Data);void WriteDWBE(unsigned char *Add, unsigned long Data);// easyWEB-API functionsvoid TCPLowLevelInit(void);                      // setup timer, LAN-controller, flags...void TCPPassiveOpen(void);                       // listen for a connectionvoid TCPActiveOpen(void);                        // open connectionvoid TCPClose(void);                             // close connectionvoid TCPReleaseRxBuffer(void);                   // indicate to discard rec'd packetvoid TCPTransmitTxBuffer(void);                  // initiate transfer after TxBuffer is filled// easyWEB-API global vars and flagsunsigned int TCPRxDataCount;                     // nr. of bytes rec'dunsigned int TCPTxDataCount;                     // nr. of bytes to sendunsigned int TCPLocalPort;                       // TCP portsunsigned int TCPRemotePort;unsigned int RemoteMAC[3];                       // MAC and IP of current TCP-sessionunsigned int RemoteIP[2];unsigned char SocketStatus;#define SOCK_ACTIVE                    0x01      // state machine NOT closed#define SOCK_CONNECTED                 0x02      // user may send & receive data#define SOCK_DATA_AVAILABLE            0x04      // new data available#define SOCK_TX_BUF_RELEASED           0x08      // user may fill buffer#define SOCK_ERROR_MASK                0xF0      // bit-mask to check for errors#define SOCK_ERR_OK                    0x00      // no error#define SOCK_ERR_ARP_TIMEOUT           0x10      // timeout waiting for an ARP-REPLY#define SOCK_ERR_TCP_TIMEOUT           0x20      // timeout waiting for an ACK#define SOCK_ERR_CONN_RESET            0x30      // connection was reset by the other TCP#define SOCK_ERR_REMOTE                0x40      // remote TCP caused fatal error#define SOCK_ERR_ETHERNET              0x50      // network interface error (timeout)// easyWEB-API buffer-pointers#define TCP_TX_BUF      ((unsigned char *)TxFrame1 + ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE)#define TCP_RX_BUF      ((unsigned char *)RxTCPBuffer)#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -