ee_mcast.c
来自「TCP-IP红宝书源代码」· C语言 代码 · 共 92 行
C
92 行
/* ee_mcast.c - ee_mcadd, ee_mcdel, ee_mcset */
#include <conf.h>
#include <kernel.h>
#include <network.h>
#include <i386.h>
#include <ee.h>
/*------------------------------------------------------------------------
* ee_mcadd - add multicast addresses for Intel EtherExpress16
*------------------------------------------------------------------------
*/
int
ee_mcadd(ped, mca)
struct etdev *ped;
Eaddr mca;
{
STATWORD ps;
int i;
#ifdef MULTICAST
disable(ps);
for (i=0; i<ped->ed_mcc; ++i)
if (!memcmp(mca, ped->ed_mca[i], sizeof mca)) {
restore(ps);
return OK; /* already there */
}
memcpy(ped->ed_mca[i], mca, EP_ALEN);
ped->ed_mcc++;
restore(ps);
while (enq(ped->ed_outq, (void *)EE_SETMULTI, -1) < 0) {
/* queue full; retry later */
sleep10(1);
}
ee_wstrt(ped);
return OK;
#else /* MULTICAST */
return SYSERR;
#endif /* MULTICAST */
}
/*------------------------------------------------------------------------
* ee_mcdel - delete multicast addresses for Intel EtherExpress16
*------------------------------------------------------------------------
*/
int
ee_mcdel(ped, mca)
struct etdev *ped;
Eaddr mca;
{
STATWORD ps;
int i;
#ifdef MULTICAST
disable(ps);
for (i=0; i<ped->ed_mcc; ++i)
if (!memcmp(mca, ped->ed_mca[i], EP_ALEN))
break;
if (i == ped->ed_mcc) {
restore(ps);
return OK;
}
i++;
for (; i<ped->ed_mcc; ++i)
memcpy(ped->ed_mca[i-1], ped->ed_mca[i], EP_ALEN);
ped->ed_mcc--;
restore(ps);
while (enq(ped->ed_outq, (void *)EE_SETMULTI, -1) < 0) {
/* queue full; retry later */
sleep10(1);
}
ee_wstrt(ped);
return OK;
#else /* MULTICAST */
return SYSERR;
#endif /* MULTICAST */
}
mcdump(ped)
struct etdev *ped;
{
int i, j;
kprintf("mcc %d\n", ped->ed_mcc);
for (i=0; i<ped->ed_mcc; ++i) {
kprintf("%d) ", i);
for (j=0; j<EP_ALEN-1; ++j)
kprintf("%02x:", ped->ed_mca[i][j]);
kprintf("%02x\n", ped->ed_mca[i][j]);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?