#include <xrmonwatch.h>
#include <atalk.h>

#include <net/if.h>
#include <netinet/in_systm.h>
#include <netinet/if_ether.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <netat/appletalk.h>
#include <netinet/rvd.h>
#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/AsciiText.h>
#include <X11/Xaw/Toggle.h>

#ifdef ZEPHYR
#include <zephyr/zephyr.h>
#endif /* ZEPHYR */

extern char **filter;
extern char **mask;
extern char **notmask;

/*
 * macro to extract hardware address from ethernet packet 
 */

#ifdef sun
#define get_ether_addr(e)  e.ether_addr_octet               
#else  /* sun */
#define get_ether_addr(e)  e  
#endif /* sun */



void
flt_ethernet(p, f)
     struct PART *p;
     struct FILTER *f;
{
  int offset = parts[R_Ethernet].offset;
  int intgr;
  Arg arg;
  char *string;
  Boolean state;
  char fbuf[BUFSIZ];
  char mbuf[BUFSIZ];
  char nbuf[BUFSIZ];
  int flen;
  int i;

  if(!p->widget)
    return;
  *fbuf = '\0';

  switch(p->type)
    {
    case R_Boolean:
      XtSetArg(arg, XtNstate, &state);
      XtGetValues(p->widget, &arg, 1);
      if(!state)
	return;
      break;
    case R_Integer:
      XtSetArg(arg, XtNvalue, &intgr);
      XtGetValues(p->widget, &arg, 1);
      if(intgr == 0)
	return;
      sprintf(fbuf, "%02x", intgr);
      break;
    case R_String:
    case R_MACAddress:
      XtSetArg(arg, XtNstring, &string);
      XtGetValues(p->widget, &arg, 1);
      strcpy(fbuf, string);
      if(!*fbuf)
	return;
      break;
    }

  if(p->index == R_EthernetSrcVendor || p->index == R_EthernetDstVendor)
    return;

  if(p->index == R_EthernetBroadcast)
    strcpy(fbuf, "ffffffffffff");
  
  if(p->index == R_EthernetMulticast)
    strcpy(fbuf, "01");

  i = 0;
  flen = strlen(fbuf);
  while(i < flen)
    {
      mbuf[i] = 'f';
      nbuf[i] = '0';
      ++i;
    }
  f->offset  = (offset + p->offset) * 2; /* we're using plain text */
  f->data    = str_addString(f->data,    str_makeData(fbuf, strlen(fbuf)));
  f->mask    = str_addString(f->mask,    str_makeData(mbuf, strlen(fbuf)));
  f->notmask = str_addString(f->notmask, str_makeData(nbuf, strlen(fbuf)));
}
      
      
 
