📄 ue_demux.c,v
字号:
head 1.3;access;symbols;locks; strict;comment @ * @;1.3date 94.08.12.03.35.42; author dls; state Debug;branches;next 1.2;1.2date 94.08.12.02.00.20; author dls; state Old;branches;next 1.1;1.1date 94.08.04.20.19.17; author dls; state Orig;branches;next ;desc@@1.3log@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 *------------------------------------------------------------------------ */intue_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.2log@*** empty log message ***@text@d37 1a37 1 prb->urb_len -= EP_CRC; /* drop CRC */d44 1a44 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 2a50 1 uewr(pud->ud_pdev->dvcsr, BOUND, prb->urb_next);d66 1a66 1 int i;d68 19a86 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 12d114 10@1.1log@Initial revision@text@d35 1d39 4a42 1kprintf("ue_demux: len %d too large\n", prb->urb_len);@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -