initgate.c
来自「TCP-IP红宝书源代码」· C语言 代码 · 共 161 行
C
161 行
/* initgate.c - initgate */
#include <conf.h>
#include <kernel.h>
#include <bufpool.h>
#include <network.h>
/* static IP addresses, if used */
static IPaddr iftoip[] = { 0, 0, 0x800A0B00, 0x800A0C00 };
#ifdef OTHER1
static int itod[] = { NI_LOCAL, ETHER, OTHER1, OTHER2 };
void ofaceinit(unsigned);
#else OTHER1
static int itod[] = { -1, ETHER };
#endif OTHER1
void efaceinit(unsigned);
/*------------------------------------------------------------------------
* initgate -- initialize a gateway's interface structures
*------------------------------------------------------------------------
*/
int
initgate(void)
{
int i;
Net.netpool = mkpool(MAXNETBUF, NETBUFS);
Net.lrgpool = mkpool(MAXLRGBUF, LRGBUFS);
Net.sema = screate(1);
Net.nif = NIF;
#ifdef IPADDR1
iftoip[1] = dot2ip(IPADDR1);
#endif /* IPADDR1 */
for (i=0; i<Net.nif; ++i) {
/* start off with all 0's (esp. statistics) */
memset(&nif[i], 0, sizeof(nif[i]));
nif[i].ni_state = NIS_DOWN;
nif[i].ni_admstate = NIS_UP;
nif[i].ni_ivalid = nif[i].ni_nvalid = FALSE;
nif[i].ni_svalid = FALSE;
nif[i].ni_dev = itod[i];
nif[i].ni_mcast = 0;
if (i == NI_LOCAL) {
/* maxbuf - ether header - CRC - nexthop */
nif[i].ni_mtu = MAXLRGBUF-EP_HLEN-EP_CRC-IP_ALEN;
nif[i].ni_ip = ip_anyaddr;
continue;
}
switch(nif[i].ni_dev) {
#if Noth > 0
case OTHER1:
case OTHER2:
ofaceinit(i);
break;
#endif /* Noth > 0 */
case ETHER: efaceinit(i);
break;
};
}
return OK;
}
#if Noth > 0
void
ofaceinit(unsigned ifn)
{
struct otblk *otptr;
struct etblk *etptr;
int i;
nif[ifn].ni_ip = iftoip[ifn];
otptr = (struct otblk *)devtab[nif[ifn].ni_dev].dvioblk;
otptr->ot_intf = ifn;
nif[ifn].ni_descr = otptr->ot_descr;
nif[ifn].ni_mtype = 1; /* RFC 1156, "other" :-) */
nif[ifn].ni_speed = 400000000; /* ~25Mz 32 bit mem copy :-) */
nif[ifn].ni_maxreasm = MAXLRGBUF;
/* fill in physical net addresses */
memcpy(nif[ifn].ni_hwa.ha_addr, otptr->ot_paddr, EP_ALEN);
memcpy(nif[ifn].ni_hwb.ha_addr, otptr->ot_baddr, EP_ALEN);
nif[ifn].ni_hwa.ha_len = nif[ifn].ni_hwb.ha_len = EP_ALEN;
/* set the mtu */
if (nif[ifn].ni_dev == OTHER2)
nif[ifn].ni_mtu = SMALLMTU;
else
nif[ifn].ni_mtu = EP_DLEN;
etptr = (struct etblk *)devtab[otptr->ot_pdev].dvioblk;
nif[ifn].ni_outq = etptr->etoutq;
/* net num comes from ether addr */
FIX ME FIX ME
nif[ifn].ni_ip[IP_ALEN-1] = etptr->etpaddr[EP_ALEN-1];
nif[ifn].ni_net = netnum(nif[ifn].ni_ip);
nif[ifn].ni_ivalid = TRUE;
/* set the mask (same for both) */
setmask(ifn, 0xffffff00);
/* host */
rtadd(nif[ifn].ni_ip, ip_maskall, nif[ifn].ni_ip, 0,
NI_LOCAL, RT_INF);
/* broadcast (all 0's, no subnet) */
rtadd(nif[ifn].ni_net, ip_maskall, nif[ifn].ni_ip, 0,
NI_LOCAL, RT_INF);
}
#endif /* Noth > 0 */
void
efaceinit(unsigned ifn)
{
extern int ethmcast(int, int, Eaddr, IPaddr);
IPaddr junk;
struct utdev *pud = (struct utdev *)
devtab[nif[ifn].ni_dev].dvioblk;
memcpy(nif[ifn].ni_hwa.ha_addr, pud->ud_paddr, EP_ALEN);
memcpy(nif[ifn].ni_hwb.ha_addr, pud->ud_bcast, EP_ALEN);
nif[ifn].ni_descr = pud->ud_descr;
nif[ifn].ni_mtype = 6; /* RFC 1156, Ethernet CSMA/CD */
nif[ifn].ni_speed = 10000000; /* bits per second */
nif[ifn].ni_maxreasm = MAXLRGBUF;
nif[ifn].ni_hwa.ha_len = EP_ALEN;
nif[ifn].ni_hwb.ha_len = EP_ALEN;
nif[ifn].ni_mtu = EP_DLEN;
nif[ifn].ni_outq = pud->ud_outq;
nif[ifn].ni_mcast = ethmcast;
pud->ud_ifnum = ifn;
/* TEMPORARY HACK to avoid RARP +-DLS */
{
IPaddr mask;
nif[ifn].ni_ip = iftoip[1];
nif[ifn].ni_net = netnum(nif[ifn].ni_ip);
nif[ifn].ni_ivalid = TRUE;
mask = netmask(nif[ifn].ni_ip);
setmask(ifn, mask);
/* host route */
rtadd(nif[ifn].ni_ip, ip_maskall, nif[ifn].ni_ip, 0,
NI_LOCAL, RT_INF);
/* non subnetted route */
rtadd(nif[ifn].ni_net, ip_maskall, nif[ifn].ni_ip, 0,
NI_LOCAL, RT_INF);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?