|
|
1.1 ! root 1: /* route.c - route */ ! 2: ! 3: #include <conf.h> ! 4: #include <kernel.h> ! 5: #include <network.h> ! 6: ! 7: /*------------------------------------------------------------------------ ! 8: * route - route a datagram to a given IP address ! 9: *------------------------------------------------------------------------ ! 10: */ ! 11: route(faddr, packet, totlen) ! 12: IPaddr faddr; ! 13: struct epacket *packet; ! 14: int totlen; ! 15: { ! 16: int result; ! 17: int dev; ! 18: struct arpent *arpptr; ! 19: IPaddr mynet, destnet; ! 20: ! 21: /* If IP address is broadcast address for my network, then use */ ! 22: /* physical broadcast address. Otherwise, establish a path to */ ! 23: /* the destination directly or through a gateway */ ! 24: ! 25: getnet(mynet); ! 26: netnum(destnet, faddr); ! 27: wait(Net.nmutex); ! 28: /* NOTE: This code uses host 0 as broadcast like 4.2bsd UNIX */ ! 29: if ( blkequ(mynet, faddr, IPLEN) ) { ! 30: dev = ETHER; ! 31: blkcopy(packet->ep_hdr.e_dest, EBCAST, EPADLEN); ! 32: } else { ! 33: if (!blkequ(destnet, mynet, IPLEN)) ! 34: faddr = Net.gateway; ! 35: arpptr = &Arp.arptab[ getpath(faddr) ]; ! 36: if (arpptr->arp_state != AR_RSLVD) { ! 37: arpptr->arp_state = AR_RGATE; ! 38: arpptr = &Arp.arptab[getpath(Net.gateway)]; ! 39: if (arpptr->arp_state != AR_RSLVD) { ! 40: panic("route - Cannot reach gateway"); ! 41: freebuf(packet); ! 42: signal(Net.nmutex); ! 43: return(SYSERR); ! 44: } ! 45: } ! 46: dev = arpptr->arp_dev; ! 47: blkcopy(packet->ep_hdr.e_dest, arpptr->arp_Ead, EPADLEN); ! 48: } ! 49: result = write(dev, packet, totlen); ! 50: signal(Net.nmutex); ! 51: return(result); ! 52: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.