//------------------------------------------------------------------------ // rarp_in - handle RARP packet coming in from Ethernet network //------------------------------------------------------------------------ int rarp_in(struct epacket *packet, int dev) { int ps; int pid; int ret; struct arppak *apacptr; struct etblk *etptr; apacptr = (struct arppak *)packet->ep_data; ret = SYSERR; if (net2hs(apacptr->ar_op) == AR_RRLY) { etptr = (struct etblk *)devtab[dev].iobuf; if (memcmp(apacptr->ar_tha, etptr->etpaddr, EPADLEN) == 0) { memmove(Net.myaddr, apacptr->ar_tpa, IPLEN); netnum(Net.mynet, Net.myaddr); ps = disable(); Net.mavalid = TRUE; pid = Arp.rarppid; if (!isbadpid(pid)) { Arp.rarppid = BADPID; send(pid, OK); } restore(ps); } ret = OK; } freebuf(packet); return ret; }
/*------------------------------------------------------------------------ * netmask - set the default mask for the given net *------------------------------------------------------------------------ */ IPaddr netmask(IPaddr net) { IPaddr netpart; int i; if (net == 0) return net; /* check for net match (for subnets) */ netpart = netnum(net); for (i=0; i<Net.nif; ++i) if (nif[i].ni_svalid && nif[i].ni_ivalid && nif[i].ni_net == netpart) return nif[i].ni_mask; if (IP_CLASSA(net)) return hl2net(0xff000000); if (IP_CLASSB(net)) return hl2net(0xffff0000); if (IP_CLASSC(net)) return hl2net(0xffffff00); return ~0; }