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

📄 tcp.h

📁 实现在ARM上的ICP/IP功能的源代码。
💻 H
字号:
/* 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 */
__packed 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   *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   *QUnacked;		/* unacked packet queue */
	struct SPacketQueue   *QUnSend;		/* packet need to be send */
	struct SPacketQueue   *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 ( * accept)(struct STCB   *pNewTCB)  ;
	void (  * recv)(void   * buf,WORD size)  ;
	void (  * close)(struct STCB   * pSocket)  ;				/* when a opened connection closed */
}socket;

/* tcp queue */
struct SPacketQueue
{
	struct SPacketQueue   *pNext;
	struct SPacketQueue   *pPre;
	DWORD	Seq;				/* sequence of this packet */
	struct SMemHead   *MemHead;	/* packet store in MemHead' playload */
};

struct STCB   *TCPGetTCB()  ;
void TCPInsertTCB(struct STCB   *pTCB)  ;
void TCPAbort(struct STCB   *pTCB)  ;
struct SPacketQueue   * TCPGetQ()  ;
BOOL TCPInsertQ(struct SPacketQueue   *   *ppQ,struct SMemHead   *MemHead,
				DWORD Seq)  ;
struct SPacketQueue   * TCPOutQ(struct SPacketQueue   *   *ppQ)  ;

void TCPInit()  ;
WORD TCPCheckSum(struct SIPHead   * pIPHead,WORD TCPSize)  ;
void TCPTimer()  ;
void TCPRelease(struct STCB   *pTCB)  ;
BOOL TCPSendSeg(struct STCB   *pTCB,struct SMemHead   *MemHead,BYTE TCPFlag)  ;
BOOL TCPSendSegJudgeWnd(struct STCB   *pTCB,struct SMemHead   *MemHead)  ;
BOOL TCPSendUnsendQ(struct STCB   *pTCB)  ;
void TCPRecvSeg(struct STCB   *pTCB,struct SMemHead   *MemHead)  ;
void TCPInput(struct SMemHead   *MemHead)  ;

BOOL TCPSendEx(struct STCB   * pTCB,struct SMemHead   *MemHead)  ;
BOOL TCPSend(struct STCB   * pTCB,void   *buf,WORD DataSize)  ;
BOOL TCPConnect(struct STCB   * pTCB, DWORD DestIP, WORD DestPort,						
						void (  * recv)(void   * buf,WORD size)  ,
						void (  * close)(struct STCB   * pSocket)  )  ;
void TCPClose(struct STCB   *pTCB)  ;
BOOL TCPListen(struct STCB   *pTCB,WORD ScrPort,void (  * accept)(struct STCB   *pNewTCB)  )  ;
struct STCB   * TCPSocket(IP_ADDR ScrIP)  ;
struct SMemHead   *TCPAllocate(WORD size)  ;









⌨️ 快捷键说明

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