/*- This is a -*- C -*- compatible header file
 *
 * Generic public interface for SUNOS5_INSTRUMENTATION
 *
 * This file contains manifest constants (#defines), macros, enumerations,
 * public structure definitions, static const definitions, global variable
 * declarations, and function prototypes.
 *
 * This file contains types and structures for SunOS 5.x instrumentation
 *
 */

#include <inet/mib2.h>

#define	COPY_IPADDR(fp, from, tp, to) 					\
	fp = from;							\
	tp = to;							\
	*tp++ = *fp++;							\
	*tp++ = *fp++;							\
	*tp++ = *fp++;							\
	*tp++ = *fp++;

#ifndef ZZ_SUNOS5_INSTR		/* duplicate include prevention */
#define ZZ_SUNOS5_INSTR


/*-
 * Manifest constants
 */

#define KSTAT_DATA_MAX	100	/* Maximum number of kstat entries. To be changed later  */
#define MIBCACHE_SIZE	20	/* Number of MIB cache entries */

/*-
 * Macros
 */
#define	CACHE_MOREDATA	0x001	/* There are unread data outside cache */

/*-
 * Enumeration types
 */

typedef enum {GET_FIRST, GET_EXACT, GET_NEXT} req_e;
typedef enum {FOUND, NOT_FOUND, NEED_NEXT} found_e;

typedef enum {
    MIB_SYSTEM = 0,
    MIB_INTERFACES = 1,
    MIB_AT = 2,
    MIB_IP = 3,
    MIB_IP_ADDR = 4,
    MIB_IP_ROUTE = 5,
    MIB_IP_NET = 6,
    MIB_ICMP = 7,
    MIB_TCP = 8,
    MIB_TCP_CONN = 9,
    MIB_UDP = 10,
    MIB_UDP_LISTEN = 11,
    MIB_EGP = 12,
    MIB_CMOT = 13,
    MIB_TRANSMISSION = 14,
    MIB_SNMP = 15
} mibgroup_e;

/*-
 * Structure definitions (use "typedef struct foo {} foo;" form)
 */

/* MIB-II cache. Simple buffering scheme - last read block is in the cache */

typedef struct mibcache {
    mibgroup_e	cache_groupid;	/* MIB-II group */
    size_t	cache_size;	/* Size of this cache table in bytes */
    void*	cache_addr;	/* Pointer to real cache memory */
    size_t	cache_length;	/* Useful length in bytes */
    size_t	cache_ttl;	/* Time to live for this element in seconds */
    time_t	cache_time;	/* Time stamp for this element */
    int		cache_flags;	/* Cache state */
    int		cache_last_found; /* Index of last cache element that was found */
    void*	cache_comp;	/* Compare routine used to set the cache */
    void*	cache_arg;	/* Argument for compare routine used to set the cache */
} mibcache;

/* Mapping between mibgroup_t, mibtable_t and mib2.h defines */

typedef struct mibmap {
    int		group;		/* mib2.h group name */
    int		table;		/* mib2.h table name */
} mibmap;
    
/* Structures, missing in <inet/mib2.h> */
typedef unsigned long TimeTicks;

typedef struct mib2_ifEntry {
    int		ifIndex;		/* ifEntry 1 */
    DeviceName	ifDescr;		/* ifEntry 2 */
    int		ifType;			/* ifEntry 3 */
    int		ifMtu;			/* ifEntry 4 */
    Gauge	ifSpeed;		/* ifEntry 5 */
    PhysAddress	ifPhysAddress;		/* ifEntry 6 */
    int		ifAdminStatus;		/* ifEntry 7 */
    int		ifOperStatus;		/* ifEntry 8 */
    TimeTicks	ifLastChange;		/* ifEntry 9 */
    Counter	ifInOctets;		/* ifEntry 10 */
    Counter	ifInUcastPkts;		/* ifEntry 11 */
    Counter	ifInNUcastPkts;		/* ifEntry 12 */
    Counter	ifInDiscards;		/* ifEntry 13 */
    Counter	ifInErrors;		/* ifEntry 14 */
    Counter	ifInUnknownProtos;	/* ifEntry 15 */
    Counter	ifOutOctets;		/* ifEntry 16 */
    Counter	ifOutUcastPkts;		/* ifEntry 17 */
    Counter	ifOutNUcastPkts;	/* ifEntry 18 */
    Counter	ifOutDiscards;		/* ifEntry 19 */
    Counter	ifOutErrors;		/* ifEntry 20 */
    Gauge	ifOutQLen;		/* ifEntry 21 */
    int		ifSpecific;		/* ifEntry 22 */
} mib2_ifEntry_t;
    
/*-
 * Static const definitions (must be declared static and initialized)
 */


/*-
 * Global variable declarations (using extern and without initialization)
 */

/*-
 * Function prototypes (use void as argument type if there are no arguments)
 */

#ifdef _STDC_COMPAT
#ifdef __cplusplus
extern "C" {
#endif
#endif

  int 	getKstat(const char *statname, const char *varname, void *value);
  int	getMibstat(mibgroup_e grid, void *resp, size_t entrysize,
		   req_e req_type, int (*comp)(void *, void *), void *arg);
  int	Get_everything(void *, void *);
  int	getKstatInt(const char *classname, const char *statname, const char *varname, int *value);
  int	getKstatRaw(const char *classname, const char *statname, size_t len, void *buf);

#ifdef _STDC_COMPAT
#ifdef __cplusplus
}
#endif
#endif

/*-
 * These variables describe the formatting of this file.  If you don't like the
 * template defaults, feel free to change them here (not in your .emacs file).
 *
 * Local Variables:
 * comment-column: 32
 * c-indent-level: 4
 * c-continued-statement-offset: 4
 * c-brace-offset: -4
 * c-argdecl-indent: 0
 * c-label-offset: -4
 * fill-column: 79
 * fill-prefix: " * "
 * End:
 */

#endif
