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

/* marp.c - marp */

#include <conf.h>
#include <kernel.h>
#include <deqna.h>
#include <ether.h>
#include <ip.h>
#include <arp.h>
#include "../h/network.h"
#include "../h/monitor.h"

extern	struct	epacket	*epptr;
extern	Bool	match;
extern	Bool	found;
struct	sign	arp_tab[] = {ARPS};

/*------------------------------------------------------
 * marp - print ARP packet information
 *------------------------------------------------------
 */

marp(stdin, stdout, stderr, nargs, args)
int	stdin, stdout, stderr, nargs;
char	*args[];
{
	int	i, len, length;
	char	str[80];
	char	type;
	IPaddr	saddr, daddr;
	struct	arppak	*arpptr;
	struct	sign	*addptr;
	struct	sign	*list;

	fprintf(0,"ptype=%04x\n",net2hs(epptr->e_ptype));
	switch(net2hs(epptr->e_ptype)){
		case EP_ARP:
			break;
		default:
			userret();
	}
	arpptr = (struct arppak *)epptr->ep_data;
	blkcopy(saddr, arpptr->ar_spa, IPLEN);
	blkcopy(daddr, arpptr->ar_tpa, IPLEN);
	type = 3;
	len = EMAXPAK - 28 ;
	if((length=margparse(list,saddr,daddr,type,len,nargs,args))==SYSERR){
		userret();
	}
	match = TRUE;
	addptr = checknum(arp_tab, net2hs(arpptr->ar_op));
	sprintf(str,"hrd=%4d, prot=%04x, hlen=%d, plen=%d, op=%7s\n",net2hs(arpptr->ar_hrd),net2hs(arpptr->ar_prot),arpptr->ar_hlen,arpptr->ar_plen,addptr->s_lname);
	write(stdout, str, strlen(str));
	sprintf(str,"sha=%02x%02x.%02x%02x.%02x%02x,",arpptr->ar_sha[0]&0377,arpptr->ar_sha[1]&0377,arpptr->ar_sha[2]&0377,arpptr->ar_sha[3]&0377,arpptr->ar_sha[4]&0377,arpptr->ar_sha[5]&0377);
	sprintf(&str[strlen(str)]," tha=%02x%02x.%02x%02x.%02x%02x\n",arpptr->ar_tha[0]&0377,arpptr->ar_tha[1]&0377,arpptr->ar_tha[2]&0377,arpptr->ar_tha[3]&0377,arpptr->ar_tha[4]&0377,arpptr->ar_tha[5]&0377);
	write(stdout, str, strlen(str));
	sprintf(str,"spa=%d.%d.%d.%d, tpa=%d.%d.%d.%d\n",arpptr->ar_spa[0]&0377,arpptr->ar_spa[1]&0377,arpptr->ar_spa[2]&0377,arpptr->ar_spa[3]&0377,arpptr->ar_tpa[0]&0377,arpptr->ar_tpa[1]&0377,arpptr->ar_tpa[2]&0377,arpptr->ar_tpa[3]&0377);
	write(stdout, str, strlen(str));

	return(OK);
}