⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ee_demux.c,v

📁 用TCPIP进行网际互联源码
💻 C,V
字号:
head	1.2;access;symbols;locks	dls:1.2; strict;comment	@ * @;1.2date	97.09.21.19.25.55;	author dls;	state Dist;branches;next	1.1;1.1date	94.09.24.01.00.41;	author dls;	state Works;branches;next	;desc@@1.2log@pre-3e code@text@/* ee_demux.c - ee_demux */#include <conf.h>#include <kernel.h>#include <network.h>#include <ee.h>/*------------------------------------------------------------------------ * ee_demux - demultiplex an input packet from an Intel EtherExpress *------------------------------------------------------------------------ */intee_demux(ped)struct etdev	*ped;{	struct rbd	*prbd = ped->ed_rbd;	struct rfd	*prfd = ped->ed_rfd;	struct scb	*pscb = ped->ed_scb;	struct ep	*pep, *ee_get();	int		csr = ped->ed_pdev->dvcsr;	int		ifnum;	ifnum = ped->ed_ifnum;	if (ifnum < 0 || ifnum >= NIF)		return;	while (prfd->rfd_status & RSTAT_C) {		if (nif[ifnum].ni_state == NIS_UP)			pep = ee_get(ped, prfd, prbd);		else			pep = 0;		prfd->rfd_cmd = EECMD_EL;		prfd->rfd_status = 0;		ped->ed_rfdend->rfd_cmd &= ~EECMD_EL;		ped->ed_rfdend = prfd;		ped->ed_rfd = prfd =			(struct rfd *)IO2H(ped, prfd->rfd_next);		prbd->rbd_el = 1;		prbd->rbd_valid = prbd->rbd_eof = 0;		ped->ed_rbdend->rbd_el = 0;		ped->ed_rbdend = prbd;		ped->ed_rbd = prbd =			(struct rbd *)IO2H(ped, prbd->rbd_next);		/*		 * ni_in can cause a context switch, so restart receive		 * unit, if necessary, here.		 */		pscb->scb_rfaoff = H2IO(ped, ped->ed_rfd);		if ((pscb->scb_status & STAT_RUR) == 0) {			ee_wait(ped);			pscb->scb_cmd = SCBCMD_RUS;			outb(csr+CAC, 0);			ee_wait(ped);			ee_ack(ped, pscb->scb_status & STAT_CNA);		}		if (pep) {#ifdef	NETMON			nm_in(&nif[ifnum], pep, pep->ep_len);			if (!ethmatch(&nif[ifnum], pep->ep_dst, pep->ep_len))				freebuf(pep);			else#endif	/* NETMON */			ni_in(&nif[ifnum], pep, pep->ep_len);		}		/* context switch may have changed prfd & prbd; re-set */		prfd = ped->ed_rfd;		prbd = ped->ed_rbd;	}}struct ep *ee_get(ped, prfd, prbd)struct etdev	*ped;struct rfd	*prfd;struct rbd	*prbd;{	struct ep	*pep;	int		ifnum = ped->ed_ifnum;	if ((prfd->rfd_status & RSTAT_OK) == 0) {		nif[ifnum].ni_idiscard++;		return 0;	}	pep = (struct ep *)nbgetbuf(Net.netpool);	if (pep == 0) {		if (ifnum >= 0 && ifnum < NIF)			nif[ifnum].ni_idiscard++;		return 0;	}	prbd = (struct rbd *)IO2H(ped, prfd->rfd_rbd);	if (!prbd->rbd_valid) {		freebuf(pep);		return 0;	}	pep->ep_len = prbd->rbd_count;	if (pep->ep_len - sizeof(struct eh) > EP_DLEN) {		kprintf("ee%d: packet too large (%d)\n",			pep->ep_len);		nif[ifnum].ni_idiscard++;		freebuf(pep);		return 0;	}	blkcopy(&pep->ep_eh, IO2H(ped, prbd->rbd_buf), pep->ep_len);	pep->ep_type = net2hs(pep->ep_type);	pep->ep_order = EPO_NET;	return pep;}@1.1log@Initial revision@text@a7 3#define	H2IO(x)		((unsigned short)((char *)(x) - ped->ed_iomem))#define	IO2H(x)		(ped->ed_iomem + (int)(x))d21 1a21 1	int		i, ifnum, keeper;d35 2a36 1		prfd = ped->ed_rfd = (struct rfd *)IO2H(prfd->rfd_next);d42 2a43 1		prbd = ped->ed_rbd = (struct rbd *)IO2H(prbd->rbd_next);d48 1a48 1		pscb->scb_rfaoff = H2IO(ped->ed_rfd);d90 1a90 1	prbd = (struct rbd *)IO2H(prfd->rfd_rbd);d103 1a103 1	blkcopy(&pep->ep_eh, IO2H(prbd->rbd_buf), pep->ep_len);@

⌨️ 快捷键说明

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