#ifndef _TCP_H
#define _TCP_H
#include "m.h"
#include "type.h"
/*表示tcp11种连接状态的宏定义*/
#define CLOSED 0
#define LISTEN 1
#define SYN_RCV 2
#define SYN_SENT 3
#define ESTABLISHED 4
#define CLOSE_WAIT 5
#define FIN_WAIT_1 6
#define FIN_WAIT_2 7
#define CLOSING 8
#define TIME_WAIT 9
#define LAST_ACK 10
/*控制位宏定义*/
#define FIN 0x00000001
#define SYN 0x00000002
#define RST 0x00000004
#define PSH 0x00000008
#define ACK 0x00000010
#define URG 0x00000020
/*拥塞状态宏定义*/
#define SS 1 /*拥塞避免状态*/
#define CA 2 /*慢启动状态*/
#define MAXCONNECTS 100 /*最大连接数,还需与socket块协商*/
#define TCP_HEAD 0x00000001
/*接受窗口结构体TCP_rcvwin*/
typedef struct{
INT32U rcv_base; /*接收基序号*/
INT32U rcvN; /*接收窗口长度N*/
}TCP_rcvwin;
/*发送窗口结构TCP_sendwin*/
typedef struct{
INT32U send_base; /*发送基序号*/
INT32U sendN; /*发送窗口长度N*/
INT32U send_nxt; /*表示下一个还未发送的可用序号*/
}TCP_sendwin;
typedef struct tcp_head{
INT16U th_sport; /*源端口号*/
INT16U th_rport; /*接收方端口号*/
INT32U th_seq; /*序号*/
INT32U th_ack; /*确认号*/
INT16U th_tt;
INT8U th_controlbit; /*tcp控制位*/
INT16U th_win; /*接收窗口大小*/
INT16U th_sum; /*互联网检验和*/
INT16U th_urp; /*紧急数据指针*/
}TCP_head;
/*空间的tcb链表*/
/*tcp协议控制块结构体TCP_tcb*/
typedef struct tcp_tcb{
/*用于管理连接的两个成员*/
INT32U tt_state; /*记录连接的状态,默认为Close状态*/
INT8U tt_controlbit; /*记录发送数据时需要的控制位*/
/*用于控制发送速率的成员*/
INT32U tt_mss; /*记录最大报文段长度*/
INT16U tt_rrcvwin; /*接收方接收窗口大小,接收数据时进行记录,控制发送数据大小*/
INT16U tt_srcvwin; /*发送方接收窗口大小,发送数据时填充tcp首部*/
INT32U tt_rcvseq; /*接收序号,接收数据时记录tcp首部中的序号*/
INT32U tt_rcvack; /*接收确认号,接收数据时记录tcp首部中的确认号*/
/*用于进行拥塞控制的成员*/
INT32U tt_congwin; /*拥塞窗口大小*/
INT32U tt_threshold; /*拥塞窗口阈值*/
INT32U tt_timeout; /*记录是否有超时发生,从而进行拥塞控制*/
INT32U tt_threeACK; /*记录是否收到3次ACK,从而进行拥塞控制*/
INT32U tt_blockstate; /*拥塞状态*/
/*tcp发送和接收缓存*/
Mbuf* tt_rcvque; /*接收队列*/
Mbuf* tt_sendque; /*发送队列*/
struct tcp_tcb* pt_next;
TCP_rcvwin tt_rcvwin;
TCP_sendwin tt_sendwin;
}TCP_tcb;
typedef struct pcb{
INT16U domain;
INT32U sockFD;
INT32U type;
INT32U protocol;
INT16U srcPort;
INT16U desPort;
ip_addr srcAddr;
ip_addr desAddr;
Mbuf* sendbuf;
Mbuf* rcvbuf;
INT8U sin_zero[8];
TCP_tcb * s_tcb;
}Socket;
TCP_tcb TCP_TCBTbl[MAXCONNECTS]; /*向系统请求分配的TCP_tcb数组*/
TCP_tcb* TCBFreeList;
#endif