tcpshskip.c,v

来自「TCP-IP红宝书源代码」· C,V 代码 · 共 83 行

C,V
83
字号
head	1.1;
access;
symbols;
locks
	dls:1.1; strict;
comment	@ * @;


1.1
date	94.01.14.03.51.20;	author dls;	state v2e1;
branches;
next	;


desc
@@


1.1
log
@Initial revision
@
text
@/* tcpshskip.c - tcpshskip */

#include <conf.h>
#include <kernel.h>
#include <network.h>
#include <q.h>

/*------------------------------------------------------------------------
 *  tcpshskip - skip urgent data holes in send buffer
 *------------------------------------------------------------------------
 */
int tcpshskip(ptcb, datalen, poff)
struct	tcb	*ptcb;
int	datalen;
int	*poff;
{
	struct 	uqe	*puqe;
	tcpseq		lseq;
	int		resid = 0;

	if (ptcb->tcb_suhq == EMPTY)
		return datalen;
	puqe = (struct uqe *)deq(ptcb->tcb_suhq);
	while (puqe) {
		lseq = ptcb->tcb_snext + datalen - 1;
		if (SEQCMP(lseq, puqe->uq_seq) > 0)
			resid = lseq - puqe->uq_seq;
		/* chop off at urgent boundary, but save the hole...	*/
		if (resid < datalen) {
			datalen -= resid;
			if (enq(ptcb->tcb_suhq, puqe,
					SUHK(ptcb, puqe->uq_seq)) < 0)
				uqfree(puqe);	/* shouldn't happen */
			return datalen;
		}
		/*
		 * else, we're skipping a hole now adjust the beginning
		 * of the segment.
		 */
		lseq = puqe->uq_seq + puqe->uq_len;
		resid = lseq - ptcb->tcb_snext;
		if (resid > 0) {
			/* overlap... */
			*poff += resid;
			if (*poff > ptcb->tcb_sbsize)
				*poff -= ptcb->tcb_sbsize;
			datalen -= resid;
			if (datalen < 0)
				datalen = 0;
		}
		uqfree(puqe);
		puqe = (struct uqe *)deq(ptcb->tcb_suhq);
	}
	/* puqe == 0 (No more holes left) */
	freeq(ptcb->tcb_suhq);
	ptcb->tcb_suhq = EMPTY;
	return datalen;
}
@

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?