1*4926Swnj /* tcp_var.h 4.5 81/11/18 */ 24808Swnj 34808Swnj /* 44808Swnj * Kernel variables for tcp. 54808Swnj */ 64808Swnj 74808Swnj /* 84901Swnj * Tcp+ip header, after ip options removed. 94901Swnj */ 104901Swnj struct tcpiphdr { 114901Swnj struct ipovly ti_i; /* overlaid ip structure */ 124901Swnj struct tcphdr ti_t; /* tcp header */ 134901Swnj }; 144901Swnj #define ti_next ti_i.ih_next 154901Swnj #define ti_prev ti_i.ih_prev 164901Swnj #define ti_x1 ti_i.ih_x1 174901Swnj #define ti_pr ti_i.ih_pr 184901Swnj #define ti_len ti_i.ih_len 194901Swnj #define ti_src ti_i.ih_src 204901Swnj #define ti_dst ti_i.ih_dst 214901Swnj #define ti_sport ti_t.th_sport 224901Swnj #define ti_dport ti_t.th_dport 234901Swnj #define ti_seq ti_t.th_seq 244901Swnj #define ti_ackno ti_t.th_ackno 254901Swnj #define ti_x2 ti_t.th_x2 264901Swnj #define ti_off ti_t.th_off 274901Swnj #define ti_flags ti_t.th_flags 284901Swnj #define ti_win ti_t.th_win 294901Swnj #define ti_sum ti_t.th_sum 304901Swnj #define ti_urp ti_t.th_urp 314901Swnj 324901Swnj /* 334808Swnj * Tcp control block. 344808Swnj */ 354881Swnj struct tcpcb { 364881Swnj struct tcpiphdr *seg_next,*seg_prev; /* seq queue */ 374881Swnj struct tcpiphdr *t_template; /* skeletal packet for transmit */ 384881Swnj struct inpcb *t_inpcb; 394808Swnj seq_t iss; /* initial send seq # */ 404808Swnj seq_t irs; /* initial recv seq # */ 414808Swnj seq_t rcv_urp; /* rcv urgent pointer */ 424808Swnj seq_t rcv_nxt; /* next seq # to rcv */ 434808Swnj seq_t rcv_end; /* rcv eol pointer */ 444808Swnj seq_t snd_off; /* seq # of first datum in send buf */ 454808Swnj seq_t seq_fin; /* seq # of FIN sent */ 464808Swnj seq_t snd_end; /* send eol pointer */ 474808Swnj seq_t snd_urp; /* snd urgent pointer */ 484808Swnj seq_t snd_lst; /* seq # of last sent datum */ 494808Swnj seq_t snd_nxt; /* seq # of next datum to send */ 504808Swnj seq_t snd_una; /* seq # of first unacked datum */ 514808Swnj seq_t snd_wl; /* seq # of last sent window */ 524808Swnj seq_t snd_hi; /* highest seq # sent */ 534808Swnj seq_t snd_wnd; /* send window max */ 544808Swnj seq_t t_rexmt_val; /* val saved in rexmt timer */ 554808Swnj seq_t t_rtl_val; /* val saved in rexmt too long timer */ 564808Swnj seq_t t_xmt_val; /* seq # sent when xmt timer started */ 574808Swnj seq_t rcv_adv; /* advertised window */ 584881Swnj struct mbuf *seg_unack; /* unacked message queue */ 594881Swnj short seqcnt; 604808Swnj u_short tc_flags; /* flags and state; see below */ 614808Swnj u_short t_options; 624808Swnj #define TO_EOL 0x01 /* eol mode */ 634808Swnj #define TO_URG 0x02 /* urgent mode */ 644808Swnj u_char t_state; /* state of this connection */ 654808Swnj u_char t_xmtime; /* current rexmt time */ 664808Swnj /* timers... must be in order */ 674881Swnj short t_init; /* init */ 684808Swnj short t_rexmt; /* retransmission */ 694808Swnj short t_rexmttl; /* retransmit too long */ 704808Swnj short t_persist; /* retransmit persistance */ 714808Swnj short t_finack; /* fin acknowledged */ 724808Swnj short t_xmt; /* round trip transmission time */ 734808Swnj /* end timers */ 744808Swnj }; 754808Swnj 764808Swnj /* tc_flags values */ 774808Swnj #define TC_ACK_DUE 0x0001 /* must we send ACK */ 784808Swnj #define TC_CANCELLED 0x0002 /* retransmit timer cancelled */ 794881Swnj /* ... */ 804808Swnj #define TC_FIN_RCVD 0x0008 /* FIN received */ 814808Swnj #define TC_FORCE_ONE 0x0010 /* force sending of one byte */ 824808Swnj #define TC_NEW_WINDOW 0x0020 /* received new window size */ 834808Swnj #define TC_REXMT 0x0040 /* this msg is a retransmission */ 844808Swnj #define TC_SND_FIN 0x0080 /* FIN should be sent */ 854808Swnj #define TC_SND_RST 0x0100 /* RST should be sent */ 864808Swnj #define TC_SND_URG 0x0200 /* urgent data to send */ 874808Swnj #define TC_SYN_ACKED 0x0400 /* SYN has been ACKed */ 884808Swnj #define TC_SYN_RCVD 0x0800 /* SYN has been received */ 894808Swnj #define TC_USR_CLOSED 0x1000 /* user has closed connection */ 904808Swnj #define TC_WAITED_2_ML 0x2000 /* wait time for FIN ACK is up */ 914808Swnj #define TC_NET_KEEP 0x4000 /* don't free this net input */ 924808Swnj #define TC_USR_ABORT 0x8000 /* user has closed and does not expect 934808Swnj to receive any more data */ 944808Swnj /* 954808Swnj * TCP timers. 964808Swnj */ 974808Swnj #define TINIT 0 984808Swnj #define TREXMT 1 994808Swnj #define TREXMTTL 2 1004808Swnj #define TPERSIST 3 1014808Swnj #define TFINACK 4 1024808Swnj #define TNTIMERS 5 1034808Swnj 1044881Swnj #define intotcpcb(ip) ((struct tcpcb *)(ip)->inp_ppcb) 1054881Swnj #define sototcpcb(so) (intotcpcb(sotoinpcb(so))) 1064881Swnj 1074808Swnj /* 1084808Swnj * Tcp machine predicates 1094808Swnj */ 1104808Swnj #define ack_ok(x, y) \ 1114901Swnj (((y)->ti_flags&TH_ACK)==0 || \ 1124901Swnj ((x)->iss < (y)->ti_ackno && (y)->ti_ackno <= (x)->snd_hi)) 1134808Swnj 1144808Swnj #define syn_ok(x, y) \ 1154901Swnj ((y)->ti_flags&TH_SYN) 1164808Swnj 1174808Swnj #define ack_fin(x, y) \ 1184901Swnj ((x)->seq_fin > (x)->iss && (y)->ti_ackno > (x)->seq_fin) 1194808Swnj 1204808Swnj #define rcv_empty(x) \ 1214808Swnj (((x)->tc_flags&TC_USR_ABORT) || \ 1224881Swnj ((x)->t_inpcb->inp_socket->so_rcv.sb_mb == NULL && \ 1234881Swnj (x)->seg_next == (x)->seg_prev)) 1244808Swnj 1254808Swnj #define ISSINCR 128 /* increment for iss each second */ 1264808Swnj #define TCPSIZE 20 /* size of TCP leader (bytes) */ 1274808Swnj 1284808Swnj /* 1294808Swnj * THESE NEED TO BE JUSTIFIED! 1304808Swnj * 1314808Swnj * *2 here is because slow timeout routine called every 1/2 second. 1324808Swnj */ 1334881Swnj #define T_INIT (30*2) 1344808Swnj #define T_2ML (10*2) /* 2*maximum packet lifetime */ 1354808Swnj #define T_PERS (5*2) /* persist time */ 1364808Swnj #define T_REXMT (1*2) /* base for retransmission time */ 1374808Swnj #define T_REXMTTL (30*2) /* retransmit too long timeout */ 1384808Swnj #define T_REMAX (30*2) /* maximum retransmission time */ 1394808Swnj 140*4926Swnj struct tcpstat { 141*4926Swnj int tcps_badsum; 142*4926Swnj int tcps_badoff; 143*4926Swnj int tcps_hdrops; 144*4926Swnj int tcps_badsegs; 145*4926Swnj int tcps_unack; 146*4926Swnj }; 147*4926Swnj 1484808Swnj #ifdef TCPDEBUG 1494808Swnj #define TDBSIZE 50 1504808Swnj /* 1514808Swnj * Tcp debugging record. 1524808Swnj */ 1534808Swnj struct tcp_debug { 1544808Swnj long td_tod; /* time of day */ 1554881Swnj struct tcbcb *td_tcb; /* -> tcb */ 1564808Swnj char td_old; /* old state */ 1574808Swnj char td_inp; /* input */ 1584808Swnj char td_tim; /* timer id */ 1594808Swnj char td_new; /* new state */ 1604808Swnj seq_t td_sno; /* seq_t number */ 1614808Swnj seq_t td_ano; /* acknowledgement */ 1624808Swnj u_short td_wno; /* window */ 1634808Swnj u_short td_lno; /* length */ 1644808Swnj u_char td_flg; /* message flags */ 1654808Swnj }; 1664808Swnj #endif 1674808Swnj 1684808Swnj #ifdef KERNEL 1694808Swnj seq_t tcp_iss; /* tcp initial send seq # */ 1704881Swnj struct inpcb tcb; 171*4926Swnj struct tcpstat tcpstat; 1724808Swnj #ifdef TCPDEBUG 1734912Swnj int tcpconsdebug; /* set to 1 traces on console */ 1744808Swnj struct tcp_debug tcp_debug[TDBSIZE]; 1754912Swnj int tdbx; /* rotating index into tcp_debug */ 1764808Swnj #endif 1774881Swnj struct tcpiphdr *tcp_template(); 1784808Swnj #endif 1794808Swnj 1804808Swnj #define SEQ_LT(a,b) ((int)((a)-(b)) < 0) 1814808Swnj #define SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0) 1824808Swnj #define SEQ_GT(a,b) ((int)((a)-(b)) > 0) 1834808Swnj #define SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0) 184