tcpsend.c,v
来自「TCP-IP红宝书源代码」· C,V 代码 · 共 167 行
C,V
167 行
head 1.2;
access;
symbols;
locks
dls:1.2; strict;
comment @ * @;
1.2
date 97.09.21.19.29.52; author dls; state Dist;
branches;
next 1.1;
1.1
date 94.01.14.03.51.20; author dls; state v2e1;
branches;
next ;
desc
@@
1.2
log
@pre-3e code
@
text
@/* tcpsend.c - tcpsend */
#include <conf.h>
#include <kernel.h>
#include <network.h>
/*------------------------------------------------------------------------
* tcpsend - compute and send a TCP segment for the given TCB
*------------------------------------------------------------------------
*/
int tcpsend(tcbnum, rexmt)
int tcbnum;
Bool rexmt;
{
struct tcb *ptcb = &tcbtab[tcbnum];
struct ep *pep;
struct ip *pip;
struct tcp *ptcp;
u_char *pch;
int i, datalen, tocopy, off, newdata;
pep = (struct ep *)getbuf(Net.netpool);
if ((int)pep == SYSERR)
return SYSERR;
pep->ep_order = ~0;
pip = (struct ip *)pep->ep_data;
pip->ip_src = ptcb->tcb_lip;
pip->ip_dst = ptcb->tcb_rip;
datalen = tcpsndlen(ptcb, rexmt, &off); /* get length & offset */
ptcp = (struct tcp *)pip->ip_data;
ptcp->tcp_sport = ptcb->tcb_lport;
ptcp->tcp_dport = ptcb->tcb_rport;
if (!rexmt)
ptcp->tcp_seq = ptcb->tcb_snext;
else
ptcp->tcp_seq = ptcb->tcb_suna;
ptcp->tcp_ack = ptcb->tcb_rnext;
if ((ptcb->tcb_flags & TCBF_SNDFIN) &&
SEQCMP(ptcp->tcp_seq+datalen, ptcb->tcb_slast) == 0)
ptcb->tcb_code |= TCPF_FIN;
ptcp->tcp_code = ptcb->tcb_code;
ptcp->tcp_offset = TCPHOFFSET;
if ((ptcb->tcb_flags & TCBF_FIRSTSEND) == 0)
ptcp->tcp_code |= TCPF_ACK;
if (ptcp->tcp_code & TCPF_SYN)
tcprmss(ptcb, pip);
if (datalen > 0)
ptcp->tcp_code |= TCPF_PSH;
ptcp->tcp_window = tcprwindow(ptcb);
if (ptcb->tcb_flags & TCBF_SUPOK) {
short up = ptcb->tcb_supseq - ptcp->tcp_seq;
if (up >= 0) {
#ifdef BSDURG
ptcp->tcp_urgptr = up + 1; /* 1 past end */
#else /* BSDURG */
ptcp->tcp_urgptr = up;
#endif /* BSDURG */
ptcp->tcp_code |= TCPF_URG;
} else
ptcp->tcp_urgptr = 0;
} else
ptcp->tcp_urgptr = 0;
pch = &pip->ip_data[TCP_HLEN(ptcp)];
i = (ptcb->tcb_sbstart+off) % ptcb->tcb_sbsize;
for (tocopy=datalen; tocopy > 0; --tocopy) {
*pch++ = ptcb->tcb_sndbuf[i];
if (++i >= ptcb->tcb_sbsize)
i = 0;
}
ptcb->tcb_flags &= ~TCBF_NEEDOUT; /* we're doing it */
if (rexmt) {
newdata = ptcb->tcb_suna + datalen - ptcb->tcb_snext;
if (newdata < 0)
newdata = 0;
TcpRetransSegs++;
} else {
newdata = datalen;
if (ptcb->tcb_code & TCPF_SYN)
newdata++; /* SYN is part of the sequence */
if (ptcb->tcb_code & TCPF_FIN)
newdata++; /* FIN is part of the sequence */
}
ptcb->tcb_snext += newdata;
if (newdata >= 0)
TcpOutSegs++;
if (ptcb->tcb_state == TCPS_TIMEWAIT) /* final ACK */
tcpwait(ptcb);
datalen += TCP_HLEN(ptcp);
tcph2net(ptcp);
pep->ep_order &= ~EPO_TCP;
ptcp->tcp_cksum = 0;
ptcp->tcp_cksum = tcpcksum(pep, datalen);
return ipsend(ptcb->tcb_rip, pep, datalen, IPT_TCP, IPP_NORMAL,
IP_TTL);
}
@
1.1
log
@Initial revision
@
text
@d19 1
a19 1
char *pch;
d25 1
d27 2
a28 2
blkcopy(pip->ip_src, ptcb->tcb_lip, IP_ALEN);
blkcopy(pip->ip_dst, ptcb->tcb_rip, IP_ALEN);
d33 3
a35 6
if (!rexmt) {
if (ptcb->tcb_code & TCPF_URG)
ptcp->tcp_seq = ptcb->tcb_suna + off;
else
ptcp->tcp_seq = ptcb->tcb_snext;
} else
d51 4
a54 1
if (ptcb->tcb_code & TCPF_URG)
d56 1
a56 1
ptcp->tcp_urgptr = datalen; /* 1 past end */
d58 1
a58 1
ptcp->tcp_urgptr = datalen-1;
d60 4
a63 1
else
d92 1
d94 1
a94 1
ptcp->tcp_cksum = tcpcksum(pip);
@
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?