# /* Struct which keeps info on round trip delay times. Used to compute time between retransmits; retranmits times are computed to nearest second */ #define NTT 10 struct ttime { struct ttseq *tt_begin; /* Ptr to tt_list[0] */ struct ttseq *tt_end; /* Ptr to tt_list[NTT] */ struct ttseq *tt_first; /* First unacked seqno */ struct ttseq *tt_next; /* Loc. for next seqno/sndtime */ struct ttseq { long tt_seqno; long tt_sndtime; long tt_acktime; } tt_list[NTT]; }; #define RETRANSTIME 3 /* Initial retransmit time */ #define NTRANS 20 /* No. times to retransmit */ #define LONGSLEEP 255 #define MAXDATA 512 /* Max rcv/send segment data - must be <= MAXINET - (IPHSIZ + TCPHSIZ) */ struct tcb { int t_state; int t_flags; long t_urgseq; /* Seqno for end of urgent data */ int t_maxdata; /* Max. tcp data we will send/rcv */ int t_maxsdata; /* Max. tcp data to send on connection */ long t_iss; /* Initial send sequence no. */ long t_snxt; /* Next send seq. no. */ long t_suna; /* Highest send seqno wh. has been acked */ short t_swnd; /* Send window */ long t_swseq; /* Seqno when send wnd updated */ long t_swack; /* Ackno when send wnd updated */ long t_irs; /* Initial rcv sequence no. */ long t_rnxt; /* Next rcv seq. no. */ int t_rwnd; /* Rcv window */ long t_rlast; /* Last expected rcv seq. no. */ long t_acktime; /* Set first time decide to send ACK */ long t_fintime; /* Set when rcv FIN */ long t_sndtime; /* Set when update t_suna or retransmit */ int t_ntrans; /* No. times retransmitted */ int t_retrans; /* Current retransmit time in seconds */ struct ttime t_ttime;/* Data to compute retrans time */ struct tcp_phdr t_phdr; /* Tcp pseudo-header */ struct net_hdr t_net; struct inet_hdr t_inet; struct tcp_hdr t_tcp; char t_data[MAXDATA]; }; /* Tcb Flags */ #define URGF 01 /* Tcb state bits */ #define LISTEN 0 #define SYN_SENT 01 #define SYN_ACK 02 #define SYN_RCVD 04 #define FIN_SENT 010 #define FIN_ACK 020 #define FIN_RCVD 040 #define CLOSED2 0100 #define OPEN (SYN_SENT|SYN_ACK|SYN_RCVD) #define CLOSED (FIN_SENT|FIN_ACK|FIN_RCVD) #define NBUF 8 /* No. rcv buffers */ #define NETDATA (NETHSIZ + IPHSIZ + MAXINET) struct rcvpkt { struct item rp_que; short rp_len; long rp_seqno; /* Adjusted begin seqno */ short rp_dlen; /* Amt. of legit. segment data */ char *rp_datp; /* Ptr to next char to give to user */ char *rp_date; /* Ptr to last + 1 char for user */ struct net_hdr rp_net; struct inet_hdr rp_inet; char rp_data[MAXINET]; }; #define RCVPKTSIZ sizeof(struct rcvpkt) #define NSBUFF 2000 struct sndcbuf { short sb_flags; short sb_len; char *sb_datp; /* Loc. of first char for tcp */ char *sb_date; /* Loc. of last char for tcp */ long sb_seqno; /* Sequence no. of sb_datp */ int sb_urg; /* Offset from sb_seqno for end of urgent data - 0 if no urgent data */ char *sb_bbuff; /* Begin addr of sb_data */ char *sb_ebuff; /* End addr + 1 of sb_data */ char sb_data[NSBUFF]; }; #define SNDCBUFSIZ sizeof(struct sndcbuf) /* sndcbuf flags */ #define SNDSYN 01 #define SNDFIN 02 /* Statistics */ #define WEIO 1 /* Net write err 5 */ #define WREFUSE 2 /* Net write err 13 */ #define WERR 3 /* Other net write error */ #define NERR 4 struct stats { long s_rpkt; /* No. pkts read */ long s_spkt; /* No. pkts sent */ short s_rercv; /* No. pkts w. some dupe data */ short s_resnd; /* No. times retransmit */ short s_badord; /* No. pkts rcved w. out of order data */ short s_errs[NERR]; }; extern struct tcb tcb; extern struct rcvpkt buff[NBUF]; extern struct sndcbuf sndcbuf; extern struct stats stats; extern struct que frq, rseqq, rwaitq;