ue_demux.c,v

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

C,V
205
字号
head	1.3;
access;
symbols;
locks; strict;
comment	@ * @;


1.3
date	94.08.12.03.35.42;	author dls;	state Debug;
branches;
next	1.2;

1.2
date	94.08.12.02.00.20;	author dls;	state Old;
branches;
next	1.1;

1.1
date	94.08.04.20.19.17;	author dls;	state Orig;
branches;
next	;


desc
@@


1.3
log
@seems to work; has lots of debugging code in it.
@
text
@/* ue_demux.c - ue_demux */

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

/*------------------------------------------------------------------------
 * ue_demux - demultiplex an input packet from an SMC Ultra
 *------------------------------------------------------------------------
 */
int
ue_demux(pud)
struct utdev	*pud;
{
	struct ep	*pep;
	struct urb	*prb;
	int		ifnum;

	prb = (struct urb *) (pud->ud_iomem + (pud->ud_nextbuf << 8));
	ifnum = pud->ud_ifnum;
	if (ifnum < 0 || ifnum >= NIF)
		goto drop;
	if (nif[ifnum].ni_state != NIS_UP) {
		nif[ifnum].ni_idiscard++;
		goto drop;
	}
	while (prb->urb_rstat) {
		pep = (struct ep *)nbgetbuf(Net.netpool);
		if (pep == 0) {
			if (ifnum >= 0 && ifnum < NIF)
				nif[ifnum].ni_idiscard++;
			goto drop;
		}
/*kprintf("prb %X len %d next %X\n", pud->ud_nextbuf,prb->urb_len,prb->urb_next); */
		pud->ud_nextbuf = prb->urb_next;
		pep->ep_len = prb->urb_len - EP_CRC;	/* drop CRC */
if (prb->urb_len > 1514) {
ue_dbuf(pud);
kprintf("ue_demux: len %d too large prb %X\n", prb->urb_len, prb);
freebuf(pep);
return;
}
		ueget(&pep->ep_eh, prb->urb_data, pep->ep_len,
			pud->ud_rmin, pud->ud_rmax);
		pep->ep_type = net2hs(pep->ep_type);
		pep->ep_order = EPO_NET;
		ni_in(&nif[ifnum], pep, prb->urb_len);
kprintf("BOUND %x\n", pud->ud_nextbuf);
		uewr(pud->ud_pdev->dvcsr, BOUND, pud->ud_nextbuf);
		/* check for more */
		prb = (struct urb *) (pud->ud_iomem + (pud->ud_nextbuf << 8));
	}
	return OK;
drop:
	if (ifnum >= 0 && ifnum < NIF)
		nif[ifnum].ni_ierrors++;
	uewr(pud->ud_pdev->dvcsr, BOUND, prb->urb_next);
	pud->ud_nextbuf = prb->urb_next;
}

ueget(pdst, psrc, count, pmin, pmax)
unsigned short	*pdst, *psrc, *pmax, *pmin;
int		count;
{
	int		i, part;

kprintf("ueget(psrc %X pdst %X, count %d pmin %X pmax %X\n", psrc, pdst,
count, pmin, pmax);
	count = (count+1)/2;	/* convert byte count to word count */
	part = pmax - psrc;
	if (part < count) {
kprintf("ueget: copy1 %d shorts from %X to %X\n", part, psrc, pdst);
		wcopy(psrc, pdst, part);
		/* zero each buffer's  RSTAT & len */
		(int)psrc &= ~(UE_BUFSIZE-1);
kprintf("ueget: zeroing: ");
		for (; psrc < pmax; psrc += UE_BUFSIZE/2)
{
kprintf(" %X", psrc);
			*psrc = 0;
}
kprintf("\n");
		psrc = pmin;
		pdst += part;
		count -= part;
	}
kprintf("ueget: copy2 %d shorts from %X to %X\n", count, psrc, pdst);
	wcopy(psrc, pdst, count);
	/* zero each buffer's  RSTAT & len */
	pmax = psrc + count;
	(int)psrc &= ~(UE_BUFSIZE-1);
kprintf("ueget: zeroing: ");
	for (; psrc < pmax; psrc += UE_BUFSIZE/2)
{
kprintf(" %X", psrc);
			*psrc = 0;
}
kprintf("\n");
}

uering(pud, bn)
struct utdev	*pud;
int		bn;
{
	int	i;

kprintf("bn = %d\n", bn);
	for (i=0; i<UE_NRX*6; ++i) {
		struct urb *prb = (struct urb *)pud->ud_iomem + (i << 8);
kprintf("ue_demux (%d) rstat %x next %x len %d\n", i, prb->urb_rstat,
prb->urb_next, prb->urb_len);
	}
}

wcopy(src, dst, count)
unsigned short	*src;
unsigned short	*dst;
int		count;
{
	while (--count >= 0)
		*dst++ = *src++;
	return OK;
}
@


1.2
log
@*** empty log message ***
@
text
@d37 1
a37 1
		prb->urb_len -= EP_CRC;		/* drop CRC */
d44 1
a44 1
		ueget(&pep->ep_eh, prb->urb_data, (prb->urb_len+1)/2,
a45 1
		prb->urb_rstat = 0;
a46 1
		pep->ep_len = prb->urb_len;
d49 2
a50 1
		uewr(pud->ud_pdev->dvcsr, BOUND, prb->urb_next);
d66 1
a66 1
	int		i;
d68 19
a86 7
	for (i=0; i<count; ++i) {
		*pdst = *psrc;
		if (((int)psrc & 0xff) == 0)
			*psrc = 0;	/* zero RSTAT & len fields */
		++psrc; ++pdst;
		if (psrc >= pmax)
			psrc = pmin;
d88 12
d114 10
@


1.1
log
@Initial revision
@
text
@d35 1
d39 4
a42 1
kprintf("ue_demux: len %d too large\n", prb->urb_len);
@

⌨️ 快捷键说明

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