📄 tcpxmit.c,v
字号:
head 1.2;access;symbols;locks dls:1.2; strict;comment @ * @;1.2date 97.09.21.19.29.52; author dls; state Dist;branches;next 1.1;1.1date 94.01.14.03.51.20; author dls; state v2e1;branches;next ;desc@@1.2log@pre-3e code@text@/* tcpxmit.c - tcpxmit */#include <conf.h>#include <kernel.h>#include <network.h>/*------------------------------------------------------------------------ * tcpxmit - handle TCP output events while we are transmitting *------------------------------------------------------------------------ */int tcpxmit(tcbnum, event)int tcbnum, event;{ struct tcb *ptcb = &tcbtab[tcbnum]; int tosend, tv, pending, window; if (event == RETRANSMIT) { tmclear(tcps_oport, MKEVENT(SEND, tcbnum)); tcprexmt(tcbnum, event); ptcb->tcb_ostate = TCPO_REXMT; return OK; } /* else SEND */ tosend = tcphowmuch(ptcb); if (tosend == 0) { if (ptcb->tcb_flags & TCBF_NEEDOUT) tcpsend(tcbnum, TSF_NEWDATA); /* just an ACK */ if (ptcb->tcb_snext == ptcb->tcb_suna) return OK; /* still unacked data; restart transmit timer */ tv = MKEVENT(RETRANSMIT, tcbnum); if (!tmleft(tcps_oport, tv)) tmset(tcps_oport, TCPQLEN, tv, ptcb->tcb_rexmt); return OK; } else if (ptcb->tcb_swindow == 0) { ptcb->tcb_ostate = TCPO_PERSIST; ptcb->tcb_persist = ptcb->tcb_rexmt; tcpsend(tcbnum, TSF_NEWDATA); tmset(tcps_oport, TCPQLEN, MKEVENT(PERSIST,tcbnum), ptcb->tcb_persist); return OK; } /* else, we have data and window */ ptcb->tcb_ostate = TCPO_XMIT; window = min(ptcb->tcb_swindow, ptcb->tcb_cwnd); pending = ptcb->tcb_snext - ptcb->tcb_suna; while (tcphowmuch(ptcb) > 0 && pending < window) { tcpsend(tcbnum, TSF_NEWDATA); pending = ptcb->tcb_snext - ptcb->tcb_suna; } tv = MKEVENT(RETRANSMIT, tcbnum); if (!tmleft(tcps_oport, tv)) tmset(tcps_oport, TCPQLEN, tv, ptcb->tcb_rexmt); return OK;}@1.1log@Initial revision@text@d12 1a22 1 tcpsndurg(tcbnum); /* send urgent data, if any */d45 1a45 1 while (tcphowmuch(ptcb) > 0 && pending <= window) {@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -