www.pudn.com > zlIP-8051-rtl8019as.zip > TCP.h
/* * Copyright (c) 2003 Electric Application Laboratory of NAN KAI University * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * Author: Li Zhanglin* */ /* tcp */ #define TCP_SEQ_COMPARE(seq1,seq2) (SDWORD)(seq1 - seq2) /* the compare will be less than 0, so set it as singed */ #define TCP_HEAD_LEN(pTCPHead) (((pTCPHead->TCPHeadLen & 0xf0)>>4)*4) #define TCP_DEFAULT_PORT 1001 #define TCP_CONNECTION_MAX_NUM 10 #define TCP_QUEUE_MAX_NUM 100 #define TCP_HEAD_MIN_LEN 20 #define TCP_RETRAN_MAX_TIME 6 #define TCP_RETRAN_TIME_OUT 20 #define TCP_DELAY_ACK_TIME_OUT 1 #define TCP_LASTACK_TIME_OUT 40 #define ALL_HEAD_SIZE (TCP_HEAD_MIN_LEN + IP_HEAD_MIN_LEN + NETIF_HEAD_MAX_LEN) /* tcp flag */ #define TCP_URG 0x20 #define TCP_ACK 0x10 #define TCP_PSH 0x08 #define TCP_RST 0x04 #define TCP_SYN 0x02 #define TCP_FIN 0x01 /* tcp state */ #define TCP_STATE_CLOSED 0 #define TCP_STATE_LASTACK 1 #define TCP_STATE_TIMEWAIT 2 #define TCP_STATE_LISTEN 3 #define TCP_STATE_SYNRECVD 4 #define TCP_STATE_SYNSENT 5 #define TCP_STATE_ESTABLISHED 6 #define TCP_STATE_CLOSEWAIT 7 #define TCP_STATE_FINWAIT1 8 #define TCP_STATE_CLOSING 9 #define TCP_STATE_FINWAIT2 10 /* tcp header */ struct STCPHead { WORD PortScr; /* 16 bits */ WORD PortDest; DWORD Seq; DWORD AckSeq; BYTE TCPHeadLen; /* 8 bits, use high 4 bits */ BYTE flag; /* reserve 2 bits, urg, ack, psh, rst, syn, fin */ WORD WndSize; /* 16 bits */ WORD CheckSum; /* 16 bits */ WORD UrgentPoint; /* 16 bits */ }; /* tcb (transmit control block). used to keep tcp state information */ typedef struct STCB { struct STCB DT_XDATA *pNext; /* Next Node */ BYTE TCPState; /* conection idetifies */ WORD PortScr; WORD PortDest; IP_ADDR IPScr; IP_ADDR IPDest; DWORD SeqMine; DWORD SeqHis; /* the sequence want to receive from also is AckSeq in out going packet */ WORD WndMine; WORD WndHis; /* queues */ struct SPacketQueue DT_XDATA *QUnacked; /* unacked packet queue */ struct SPacketQueue DT_XDATA *QUnSend; /* packet need to be send */ struct SPacketQueue DT_XDATA *QExceedSeq; /* receive packet whoes seq exceed the SeqHis */ WORD RetranTimer; /* if it hit 0, indicate the first unit in QUnacked is time out */ BYTE RetranTimes; /* retransmit time of a same packet, if it exceed a sreshold . the connection go to colse */ BOOL bNeedAck; /* we need send ack to him */ WORD DelayAckTimer; /* if bNeedAck == TRUE, we delaye for DELAY_ACK_TIME_OUT to send ack */ WORD LastAckTimer; /* when in TCP_STATE_LASTACK a timer is started. when it out, transfer to TCP_CLOSED state */ /* call back functions */ void (DT_CODE * accept)(struct STCB DT_XDATA *pNewTCB) REENTRANT_MUL; void (DT_CODE * recv)(void DT_XDATA * buf,WORD size) REENTRANT_MUL; void (DT_CODE * close)(struct STCB DT_XDATA * pSocket) REENTRANT_MUL; /* when a opened connection closed */ }socket; /* tcp queue */ struct SPacketQueue { struct SPacketQueue DT_XDATA *pNext; struct SPacketQueue DT_XDATA *pPre; DWORD Seq; /* sequence of this packet */ struct SMemHead DT_XDATA *MemHead; /* packet store in MemHead' playload */ }; struct STCB DT_XDATA *TCPGetTCB() REENTRANT_SIG; void TCPInsertTCB(struct STCB DT_XDATA *pTCB) REENTRANT_SIG; void TCPAbort(struct STCB DT_XDATA *pTCB) REENTRANT_SIG; struct SPacketQueue DT_XDATA * TCPGetQ() REENTRANT_SIG; BOOL TCPInsertQ(struct SPacketQueue DT_XDATA * DT_XDATA *ppQ,struct SMemHead DT_XDATA *MemHead, DWORD Seq) REENTRANT_SIG; struct SPacketQueue DT_XDATA * TCPOutQ(struct SPacketQueue DT_XDATA * DT_XDATA *ppQ) REENTRANT_SIG; void TCPInit() REENTRANT_MUL; WORD TCPCheckSum(struct SIPHead DT_XDATA * pIPHead,WORD TCPSize) REENTRANT_SIG; void TCPTimer() REENTRANT_MUL; void TCPRelease(struct STCB DT_XDATA *pTCB) REENTRANT_SIG; BOOL TCPSendSeg(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead,BYTE TCPFlag) REENTRANT_SIG; BOOL TCPSendSegJudgeWnd(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_MUL; BOOL TCPSendUnsendQ(struct STCB DT_XDATA *pTCB) REENTRANT_MUL; void TCPRecvSeg(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_SIG; void TCPInput(struct SMemHead DT_XDATA *MemHead) REENTRANT_SIG; BOOL TCPSendEx(struct STCB DT_XDATA * pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_MUL; BOOL TCPSend(struct STCB DT_XDATA * pTCB,void DT_XDATA *buf,WORD DataSize) REENTRANT_MUL; BOOL TCPConnect(struct STCB DT_XDATA * pTCB, DWORD DestIP, WORD DestPort, void (DT_CODE * recv)(void DT_XDATA * buf,WORD size) REENTRANT_MUL, void (DT_CODE * close)(struct STCB DT_XDATA * pSocket) REENTRANT_MUL) REENTRANT_SIG; void TCPClose(struct STCB DT_XDATA *pTCB) REENTRANT_MUL; BOOL TCPListen(struct STCB DT_XDATA *pTCB,WORD ScrPort,void (DT_CODE * accept)(struct STCB DT_XDATA *pNewTCB) REENTRANT_MUL) REENTRANT_MUL; struct STCB DT_XDATA * TCPSocket(IP_ADDR ScrIP) REENTRANT_SIG; struct SMemHead DT_XDATA *TCPAllocate(WORD size) REENTRANT_SIG;