📄 ee_demux.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 + -