📄 tcpsend.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@/* 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.1log@Initial revision@text@d19 1a19 1 char *pch;d25 1d27 2a28 2 blkcopy(pip->ip_src, ptcb->tcb_lip, IP_ALEN); blkcopy(pip->ip_dst, ptcb->tcb_rip, IP_ALEN);d33 3a35 6 if (!rexmt) { if (ptcb->tcb_code & TCPF_URG) ptcp->tcp_seq = ptcb->tcb_suna + off; else ptcp->tcp_seq = ptcb->tcb_snext; } elsed51 4a54 1 if (ptcb->tcb_code & TCPF_URG)d56 1a56 1 ptcp->tcp_urgptr = datalen; /* 1 past end */d58 1a58 1 ptcp->tcp_urgptr = datalen-1;d60 4a63 1 elsed92 1d94 1a94 1 ptcp->tcp_cksum = tcpcksum(pip);@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -