Xinu7/src/serve11/sys/getpath.c

/* getpath.c - getpath */

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

/*------------------------------------------------------------------------
 *  getpath  -  find a path (route table entry) for a given IP address
 *------------------------------------------------------------------------
 */
getpath(faddr)
IPaddr	faddr;
{
	int	i;
	int	arindex;		/* route table entry index	*/
	int	mypid;			/* local copy of my process id	*/
	IPaddr	myaddr;			/* my IP address		*/
	char	ps;
	register struct	arpent	*arpptr;
	register struct	arppak	*apacptr;
	struct	epacket	*packet, *mkarp();

	wait(Arp.arpsem);
	arpptr = &Arp.arptab[ arindex = arpfind(faddr) ];
	if (arpptr->arp_state != AR_ALLOC) {
		signal(Arp.arpsem);
		return(arindex);
	}

	/* Use ARP to obtain and record IP-to-Ether binding */
	
	getaddr(myaddr);
	mypid = getpid();
	for (i=0 ; i < AR_RTRY ; i++) {
		packet = mkarp(EP_ARP, AR_REQ, myaddr, faddr);
		blkcopy(Arp.arpwant, faddr, AR_PLEN);
		disable(ps);
		Arp.arppid = mypid;
		recvclr();
		write(ETHER, packet, EMINPAK);
		restore(ps);
		if (recvtim(AR_TIME) == OK)
			break;
	}
	Arp.arppid = BADPID;
	signal(Arp.arpsem);
	return(arindex);
}