plan 9 kernel history: overview | file list | diff list

1992/0213/port/devarp.c (diff list | history)

1992/0114/sys/src/9/port/devarp.c:53,581992/0213/sys/src/9/port/devarp.c:53,59 (short | long | prev | next)
1991/0424    
 
enum{ 
	arpdirqid, 
1992/0213    
	arpdir2qid, 
1991/0424    
	arpstatqid, 
	arpctlqid, 
	arpdataqid, 
1992/0114/sys/src/9/port/devarp.c:59,701992/0213/sys/src/9/port/devarp.c:60,94
1991/0424    
}; 
 
Dirtab arptab[]={ 
1991/1112    
	"stats",	{arpstatqid},		0,	0666, 
	"ctl",		{arpctlqid},		0,	0666, 
	"data",		{arpdataqid},		0,	0666, 
1992/0213    
	"stats",	{arpstatqid},		0,	0444, 
	"ctl",		{arpctlqid},		0,	0664, 
	"data",		{arpdataqid},		0,	0664, 
1991/0424    
}; 
#define Narptab (sizeof(arptab)/sizeof(Dirtab)) 
 
1992/0213    
/* 
 *  create a 2-level directory 
 */ 
int 
arpgen(Chan *c, void *vp, int ntab, int i, Dir *dp) 
{ 
	Qid q; 
 
	q.vers = 0; 
 
	/* top level directory contains the directory arp */ 
	if(c->qid.path == CHDIR){ 
		if(i) 
			return -1; 
		q.path = CHDIR | arpdir2qid; 
		devdir(c, q, "arp", 0, eve, 0555, dp); 
		return 1; 
	} 
 
	/* next level uses table */ 
	return devgen(c, arptab, Narptab, i, dp); 
} 
 
1991/0424    
void 
arpreset(void) 
{ 
1992/0114/sys/src/9/port/devarp.c:109,1211992/0213/sys/src/9/port/devarp.c:133,145
1991/0424    
int 
arpwalk(Chan *c, char *name) 
{ 
	return devwalk(c, name, arptab, (long)Narptab, devgen); 
1992/0213    
	return devwalk(c, name, 0, 0, arpgen); 
1991/0424    
} 
 
void 
arpstat(Chan *c, char *db) 
{ 
	devstat(c, db, arptab, (long)Narptab, devgen); 
1992/0213    
	devstat(c, db, 0, 0, arpgen); 
1991/0424    
} 
 
Chan * 
1992/0114/sys/src/9/port/devarp.c:182,1881992/0213/sys/src/9/port/devarp.c:206,212
1991/0424    
 
	switch((int)(c->qid.path&~CHDIR)){ 
	case arpdirqid: 
		return devdirread(c, a, n, arptab, Narptab, devgen); 
1992/0213    
		return devdirread(c, a, n, 0, 0, arpgen); 
1991/0424    
	case arpdataqid: 
		bytes = c->offset; 
		while(bytes < conf.arp*ARP_ENTRYLEN && n) { 
1992/0114/sys/src/9/port/devarp.c:283,2881992/0213/sys/src/9/port/devarp.c:307,314
1991/1027    
{ 
1991/1029    
	uchar ip[4]; 
	Etherhdr *eh; 
1992/0213    
	Ipaddr addr; 
	static int dropped; 
1991/1029    
 
	if(bp->type != M_DATA) { 
		if(Servq == 0 && streamparse("arpd", bp)) { 
1992/0114/sys/src/9/port/devarp.c:295,3011992/0213/sys/src/9/port/devarp.c:321,328
1991/1029    
	} 
 
	if(!Servq) { 
		print("arp: No server, packet dropped\n"); 
1992/0213    
		if((dropped++ % 1000) == 0) 
			print("arp: No server, packet dropped\n"); 
1991/1029    
		freeb(bp); 
		return; 
	} 
1992/0114/sys/src/9/port/devarp.c:308,3191992/0213/sys/src/9/port/devarp.c:335,354
1991/1030    
 
1991/1029    
	iproute(eh->dst, ip); 
 
	/* Send downstream to the ethernet */ 
1992/0213    
	/* if a known ip addr, send downstream to the ethernet */ 
1991/1029    
	if(arplookup(ip, eh->d)) { 
		PUTNEXT(q, bp); 
		return; 
	} 
 
1992/0213    
	/* if ip broadcast, use ether bcast address */ 
	addr = nhgetl(eh->dst); 
	if(addr == Myip[Mybcast] || addr == Myip[Mynet] || addr == Myip[Mysubnet]){ 
		memset(eh->d, 0xff, sizeof(eh->d)); 
		PUTNEXT(q, bp); 
		return; 
	} 
 
1991/1030    
	/* Push the packet up to the arp server for address resolution */ 
1991/1029    
	memmove(eh->d, ip, sizeof(ip)); 
	PUTNEXT(Servq, bp); 
1992/0114/sys/src/9/port/devarp.c:443,4481992/0213/sys/src/9/port/devarp.c:478,484
1991/1027    
		 
		ap->frwd = arplruhead; 
		ap->prev = 0; 
1992/0213    
 
1991/1027    
		arplruhead = ap; 
	} 
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)