File:  [XINU] / xinu / sys / getpath.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:39:02 2018 UTC (8 years, 2 months ago) by root
Branches: xinu, MAIN
CVS tags: xinu-19870308, HEAD
Xinu for VAX

/* 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		*/
	PStype	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);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.