/*
 * Port. Header stuff & things.
 *
 * Copyright 1992 by the Massachusetts Institute of Technology.
 *
 * For copying and distribution information, please see the file
 * <mit-copyright.h>.
 *
 * Tom Coppeto
 * MIT Network Operations
 * 26 January 1992
 *
 *    $Header: /afs/.net.mit.edu/tools/src/port/RCS/port.h,v 1.4 92/02/27 18:47:26 tom Exp $
 *    $Author: tom $
 *    $Locker:  $
 * 
 */

#include <stdio.h>
#include <ctype.h>
#include <strings.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/snmp/snmp.h>

#include <hash.h>
#include <rope.h>

#define SUCCESS 0
#define ERROR   -1

extern void cb_dostuff();
extern void cb_send();
extern void cb_retry();
extern void cb_filter();
extern void cb_filterList();
extern void cb_capture();
extern void cb_start();
extern void cb_dpypacket();
extern void cb_destroy_widget();
extern void cb_chdisplay();
extern void cb_IPdisplay();
extern void cb_ATdisplay();
extern void cb_quit();
extern void cb_atNBPUpdate();
extern void cb_close_popup();
extern void cb_readFile();
extern void cb_buffer();


extern char *format_str();
extern char *format_nstr();
extern char *format_int();
extern char *format_uint();
extern char *format_uchar();
extern char *format_ip_addr();
extern char *format_ether_addr();
extern char *format_domain_name();
extern char *format_udp_port();
extern char *format_tcp_port();

extern void flt_ethernet();

typedef struct
{
  char name[64];
  char saddr[16];
  struct in_addr addr;
} Agent;



extern objident vEtherStatsIndex;
extern objident vEtherStatsSource;
extern objident vEtherStatsDropEvents;
extern objident vEtherStatsOctets;
extern objident vEtherStatsPkts;
extern objident vEtherStatsBcastPkts;
extern objident vEtherStatsMcastPkts;
extern objident vEtherStatsAlignErrors;
extern objident vEtherStatsUndersizePkts;
extern objident vEtherStatsOversizePkts;
extern objident vEtherStatsFragments;
extern objident vEtherStatsJabbers;
extern objident vEtherStatsCollisions;
extern objident vEtherStats64Octets;
extern objident vEtherStats127Octets;
extern objident vEtherStats255Octets;
extern objident vEtherStats511Octets;
extern objident vEtherStats1023Octets;
extern objident vEtherStats1518Octets;

extern objident vPacketData;

#define LEFT    0
#define RIGHT   1


struct ROW
{
  int  value;
  char *svalue;
  char *name;
  char *sname;
};

struct TABLE
{
  Hash *hp;
  struct ROW *rows;
};


struct FILTER
{
  short   type;                   /* filter type */
  short   index;                  /* filter index */
  short   len;                    /* length of data */
  short   offset;                 /* offset into data */
  Rope    data;                   /* data to filter on */
  Rope    mask;                   /* mask of relevant bits */
  Rope    notmask;                /* mask of bits to match/unmatch */
  union 
    {
      char   boolean;
      int    integer;
      Rope   string;
    } value;
  struct FILTER *next;
};

/*
 * this stuff gets stored as static data and shoved into parts
 */

struct PIECE
{  
  char   *resource;
  short  *base;
  short  *index;
  short  type;
  short  offset;
  void   (*fltproc)();
  struct TABLE *table;
};

#define R_NA         0
#define R_Integer    1
#define R_Boolean    2
#define R_String     3
#define R_IPAddress  4
#define R_MACAddress 5

struct PART
{
  char    state;                  /* whether or not field should display */
  char    type;                   /* type of value for filter */
  short   offset;                 /* offset into packet if fixed */
  short   base;                   /* nearest protocol family */
  short   index;                  /* index of this part */
  short   nfilters;               /* number of filters for this part */
  int     llength;                /* fixed label length */
  int     color;                  /* pixel value */
  int     highlight;              /* pixel value */
  Rope    resource;               /* resource name */
  Rope    slabel;                 /* fixed label */
  Rope    label;                  /* long label */
  caddr_t widget;                 /* filter widget containing value */
  void    (*fltproc)();
  char    **choices;
  struct  TABLE *table;
  struct  FILTER  *filter;
};

/*
 * filter types 
 */

#define FilterInvalid 0           
#define FilterNegate  1           /* should use a not mask */
#define FilterLocal   2           /* should filter in application */


extern struct PIECE pieces[];
extern struct PART  *parts;
extern struct TABLE ether_addrs;
extern struct TABLE ether_types;
extern struct TABLE ether_mcasts;
extern struct TABLE arp_types;
extern struct TABLE aarp_types;
extern struct TABLE ip_protos;
extern struct TABLE icmp_types;
extern struct TABLE icmp_unreachable;
extern struct TABLE icmp_redirects;
extern struct TABLE icmp_time_xceed;
extern struct TABLE rvd_types;
extern struct TABLE tcp_flags;
extern struct TABLE ddp_protos;
extern struct TABLE echo_types;
extern struct TABLE nbp_types;
extern struct TABLE zip_types;
extern struct TABLE adsp_types;

/* 
 * other types not defined (only define ones parsed)
 */


#define ETHERTYPE_XNS           0x600
#define ETHERTYPE_CHAOS         0x0804
#define ETHERTYPE_LLC           0xABCD
#define ETHERTYPE_ELAP          0x809b
#define ETHERTYPE_AARP          0x80f3
#define ETHERTYPE_MOP           0x6002
#define ETHERTYPE_DECNET        0x6003
#define ETHERTYPE_LOOP          0x9000
#define LLCTYPE_ELAP            0x809b
#define LLCTYPE_AARP            0x80f3
#define IPPROTO_RVD             66



/*
 * packet & packet field indices 
 */

extern short R_RMONIndex;
extern short R_Ethernet;
extern short R_EthernetType;
extern short R_EthernetLength;
extern short R_EthernetSrcAddress;
extern short R_EthernetSrcVendor;
extern short R_EthernetDstAddress;
extern short R_EthernetDstVendor;
extern short R_EthernetBroadcast;
extern short R_EthernetMulticast;
extern short R_EthernetVersion;
extern short R_EthernetV2;
extern short R_Ethernet8023;
extern short R_EthernetNull;
extern short R_LLC;
extern short R_LLCDstAddress;
extern short R_LLCSrcAddress;
extern short R_LLCSrcAddrDesig;
extern short R_LLCDstAddrDesig;
extern short R_LLCCRIdentifier;
extern short R_LLCType;
extern short R_LLCClass;
extern short R_LLCFormat;
extern short R_LLCPFBit;
extern short R_LLCSendSequence;
extern short R_LLCRecvSequence;
extern short R_LLCSupervisoryBit;
extern short R_LLCCommand;
extern short R_LLCInformation;
extern short R_SNAP;
extern short R_SNAPAddress;
extern short R_SNAPNull;
extern short R_ARP;
extern short R_ARPType;
extern short R_ARPSrcPhysicalAddress;
extern short R_ARPSrcVendor;
extern short R_ARPTargetPhysicalAddress;
extern short R_ARPTargetVendor;
extern short R_ARPSrcProtocolAddress;
extern short R_ARPSrcName;
extern short R_ARPTargetProtocolAddress;
extern short R_ARPTargetName;
extern short R_IP;
extern short R_IPVersion;
extern short R_IPHeaderLength;
extern short R_IPType;
extern short R_IPLength;
extern short R_IPFlags;
extern short R_IPFragmentOffset;
extern short R_IPIdentification;
extern short R_IPTTL;
extern short R_IPProtocol;
extern short R_IPChecksum;
extern short R_IPSrcAddress;
extern short R_IPSrcName;
extern short R_IPDstAddress;
extern short R_IPDstName;
extern short R_ICMP;
extern short R_ICMPType;
extern short R_ICMPCode;
extern short R_ICMPChecksum;
extern short R_ICMPIPHeader;
extern short R_ICMPPointer;
extern short R_ICMPGateway;
extern short R_ICMPIdentifier;
extern short R_ICMPSequence;
extern short R_ICMPOriginateTimestamp;
extern short R_ICMPReceiveTimestamp;
extern short R_ICMPTransmitTimestamp;
extern short R_ICMPData;
extern short R_RVD;
extern short R_RVDType;
extern short R_RVDVersion;
extern short R_RVDDrive;
extern short R_RVDIdentifier;
extern short R_RVDIndex;
extern short R_RVDChecksum;
extern short R_UDP;
extern short R_UDPChecksum;
extern short R_UDPLength;
extern short R_UDPSrcPort;
extern short R_UDPSrcPortName;
extern short R_UDPDstPort;
extern short R_UDPDstPortName;

#ifdef ZEPHYR
extern short R_Zephyr;
extern short R_ZPacket;
extern short R_ZVersion;
extern short R_ZKind;
extern short R_ZSender;
extern short R_ZRecipient;
extern short R_ZClass;
extern short R_ZInstance;
extern short R_ZOpcode;
extern short R_ZNull;
#endif /* ZEPHYR */

extern short R_TCP;
extern short R_TCPChecksum;
extern short R_TCPAck;
extern short R_TCPSequence;
extern short R_TCPWindow;
extern short R_TCPOffset;
extern short R_TCPUrgent;
extern short R_TCPSrcPort;
extern short R_TCPSrcPortName;
extern short R_TCPDstPort;
extern short R_TCPDstPortName;
extern short R_TCPFlags;
extern short R_TCPNull;
extern short R_Blank;
extern short R_AARP;
extern short R_AARPType;
extern short R_AARPNull;
extern short R_AARPHardwareType;
extern short R_AARPProtocolType;
extern short R_AARPHardwareLength;
extern short R_AARPProtocolLength;
extern short R_AARPSrcHardwareAddress;
extern short R_AARPSrcProtocolAddress;
extern short R_AARPDstHardwareAddress;
extern short R_AARPDstProtocolAddress;
extern short R_DDP;
extern short R_DDPLength;
extern short R_DDPHopCount;
extern short R_DDPType;
extern short R_DDPChecksum;
extern short R_DDPSrcNetwork;
extern short R_DDPDstNetwork;
extern short R_DDPSrcNode;
extern short R_DDPDstNode;
extern short R_DDPSrcSocket;
extern short R_DDPDstSocket;
extern short R_DDPSrcName;
extern short R_DDPDstName;
extern short R_DDPSrcType;
extern short R_DDPDstType;
extern short R_DDPSrcZone;
extern short R_DDPDstZone;
extern short R_RTMP;
extern short R_RTMPFunction;
extern short R_RTMPSrcNetwork;
extern short R_RTMPSrcNodeLength;
extern short R_RTMPSrcNode;
extern short R_RTMPRangeStart;
extern short R_RTMPRangeEnd;
extern short R_RTMPDistance;
extern short R_RTMPVersion;
extern short R_RTMPNetwork;
extern short R_RTMPHops;
extern short R_RTMPNull;
extern short R_AEP;
extern short R_AEPType;
extern short R_AEPNull;
extern short R_NBP;
extern short R_NBPType;
extern short R_NBPIdentification;
extern short R_NBPTupleCount;
extern short R_NBPNetwork;
extern short R_NBPNode;
extern short R_NBPSocket;
extern short R_NBPEnumerator;
extern short R_NBPObjectLength;
extern short R_NBPObjectEntity;
extern short R_NBPTypeLength;
extern short R_NBPTypeEntity;
extern short R_NBPZoneLength;
extern short R_NBPZoneEntity;
extern short R_NBPNull;
extern short R_ZIP;
extern short R_ZIPType;
extern short R_ZIPNetworkCount;
extern short R_ZIPNetwork;
extern short R_ZIPZoneLength;
extern short R_ZIPZone;
extern short R_ZIPNull;
extern short R_ADSP;
extern short R_ADSPConnId;
extern short R_ADSPFirstSeq;
extern short R_ADSPNextSeq;
extern short R_ADSPWindow;
extern short R_ADSPDescriptor;
extern short R_ADSPControlCode;
extern short R_LOOP;
extern short R_CHAOS;
extern short R_DECNET;
extern short R_MOP;
extern short R_XNS;
