Xinu7/contrib/ether.monitor/sys/route.c

/* mgetpath.c - mgetpath */

#include <conf.h>
#include <kernel.h>
#include <network.h>

/*------------------------------------------------------------------------
 *  mgetpath  -  get a physical network address for a given IP address
 *------------------------------------------------------------------------
 */
mgetpath(faddr)
IPaddr	faddr;
{
	int	result;
	struct	arpent	*arpptr;
	IPaddr	mynet, destnet;


	getnet(mynet);
	netnum(destnet, faddr);
	wait(Net.nmutex);
	if (!blkequ(destnet, mynet, IPLEN))
		faddr = Net.gateway;
	result = getpath(faddr);
	arpptr = &Arp.arptab[ result ];
	if (arpptr->arp_state != AR_RSLVD) {
		arpptr->arp_state = AR_RGATE;
		result = getpath(Net.gateway);
		arpptr = &Arp.arptab[result];
		if (arpptr->arp_state != AR_RSLVD) {
			signal(Net.nmutex);
			return(SYSERR);
		}
	}
	signal(Net.nmutex);
	return(result);
}