1 /*- This is a -*- C -*- compatible header file
2  *
3  * Generic public interface for SUNOS5_INSTRUMENTATION
4  *
5  * This file contains manifest constants (#defines), macros, enumerations,
6  * public structure definitions, static const definitions, global variable
7  * declarations, and function prototypes.
8  *
9  * This file contains types and structures for SunOS 5.x instrumentation
10  *
11  */
12 
13 #ifndef _KERNEL_SUNOS5_H        /* duplicate include prevention */
14 #define _KERNEL_SUNOS5_H
15 
16 #include <inet/mib2.h>
17 
18 #ifndef HAVE_COUNTER64
19 typedef uint64_t Counter64;
20 #endif
21 
22 #define	COPY_IPADDR(fp, from, tp, to) 					\
23 	fp = from;							\
24 	tp = to;							\
25 	*tp++ = *fp++;							\
26 	*tp++ = *fp++;							\
27 	*tp++ = *fp++;							\
28 	*tp++ = *fp++;
29 
30 #ifdef MIB2_IP_TRAFFIC_STATS
31 #define SOLARIS_HAVE_RFC4293_SUPPORT
32 #endif
33 
34 #ifdef MIB2_IP6
35 #define SOLARIS_HAVE_IPV6_MIB_SUPPORT
36 #endif
37 
38 /*-
39  * Manifest constants
40  */
41 
42 #define KSTAT_DATA_MAX	100     /* Maximum number of kstat entries. To be changed later  */
43 
44 /*-
45  * Macros
46  */
47 #define	CACHE_MOREDATA	0x001   /* There are unread data outside cache */
48 
49 /*-
50  * Enumeration types
51  */
52 
53 typedef enum { GET_FIRST, GET_EXACT, GET_NEXT } req_e;
54 typedef enum { FOUND, NOT_FOUND, NEED_NEXT } found_e;
55 
56 typedef enum {
57     MIB_SYSTEM = 0,
58     MIB_INTERFACES = 1,
59     MIB_AT = 2,
60     MIB_IP = 3,
61     MIB_IP_ADDR = 4,
62     MIB_IP_ROUTE = 5,
63     MIB_IP_NET = 6,
64     MIB_ICMP = 7,
65     MIB_TCP = 8,
66     MIB_TCP_CONN = 9,
67     MIB_UDP = 10,
68     MIB_UDP_LISTEN = 11,
69     MIB_EGP = 12,
70     MIB_CMOT = 13,
71     MIB_TRANSMISSION = 14,
72     MIB_SNMP = 15,
73 #ifdef SOLARIS_HAVE_IPV6_MIB_SUPPORT
74 #ifdef SOLARIS_HAVE_RFC4293_SUPPORT
75     MIB_IP_TRAFFIC_STATS,
76 #endif
77     MIB_IP6,
78     MIB_IP6_ADDR,
79     MIB_IP6_ROUTE,
80     MIB_ICMP6,
81     MIB_TCP6_CONN,
82     MIB_UDP6_ENDPOINT,
83 #endif
84 #ifdef MIB2_SCTP
85     MIB_SCTP,
86     MIB_SCTP_CONN,
87     MIB_SCTP_CONN_LOCAL,
88     MIB_SCTP_CONN_REMOTE,
89 #endif
90     MIBCACHE_SIZE
91 } mibgroup_e;
92 
93 /*-
94  * Structure definitions (use "typedef struct foo {} foo;" form)
95  */
96 
97 /*
98  * MIB-II cache. Simple buffering scheme - last read block is in the cache
99  */
100 
101 typedef struct mibcache {
102     mibgroup_e      cache_groupid;      /* MIB-II group */
103     size_t          cache_size; /* Size of this cache table in bytes */
104     void           *cache_addr; /* Pointer to real cache memory */
105     size_t          cache_length;       /* Useful length in bytes */
106     size_t          cache_ttl;  /* Time this type of cache entry stays valid */
107     time_t          cache_time; /* CURRENT time left for this cache entry */
108     int             cache_flags;        /* Cache state */
109     int             cache_last_found;   /* Index of last cache element that was found */
110     void           *cache_comp; /* Compare routine used to set the cache */
111     void           *cache_arg;  /* Argument for compare routine used to set the cache */
112 } mibcache;
113 
114 /*
115  * Mapping between mibgroup_t, mibtable_t and mib2.h defines
116  */
117 
118 typedef struct mibmap {
119     int             group;      /* mib2.h group name */
120     int             table;      /* mib2.h table name */
121 } mibmap;
122 
123 /*
124  * Structures, missing in <inet/mib2.h>
125  */
126 typedef unsigned long TimeTicks;
127 
128 typedef struct mib2_ifEntry {
129     int             ifIndex;    /* ifEntry 1 */
130     DeviceName      ifDescr;    /* ifEntry 2 */
131     int             ifType;     /* ifEntry 3 */
132     int             ifMtu;      /* ifEntry 4 */
133     Gauge           ifSpeed;    /* ifEntry 5 */
134     PhysAddress     ifPhysAddress;      /* ifEntry 6 */
135     int             ifAdminStatus;      /* ifEntry 7 */
136     int             ifOperStatus;       /* ifEntry 8 */
137     TimeTicks       ifLastChange;       /* ifEntry 9 */
138     Counter         ifInOctets; /* ifEntry 10 */
139     Counter         ifInUcastPkts;      /* ifEntry 11 */
140     Counter         ifInNUcastPkts;     /* ifEntry 12 */
141     Counter         ifInDiscards;       /* ifEntry 13 */
142     Counter         ifInErrors; /* ifEntry 14 */
143     Counter         ifInUnknownProtos;  /* ifEntry 15 */
144     Counter         ifOutOctets;        /* ifEntry 16 */
145     Counter         ifOutUcastPkts;     /* ifEntry 17 */
146     Counter         ifOutNUcastPkts;    /* ifEntry 18 */
147     Counter         ifOutDiscards;      /* ifEntry 19 */
148     Counter         ifOutErrors;        /* ifEntry 20 */
149     Gauge           ifOutQLen;  /* ifEntry 21 */
150     int             ifSpecific; /* ifEntry 22 */
151 
152     /*
153      * Support ifXTable.
154      */
155     Counter64       ifHCInOctets;
156     Counter64       ifHCInUcastPkts;
157     Counter64       ifHCInMulticastPkts;
158     Counter64       ifHCInBroadcastPkts;
159     Counter64       ifHCOutOctets;
160     Counter64       ifHCOutUcastPkts;
161     Counter64       ifHCOutMulticastPkts;
162     Counter64       ifHCOutBroadcastPkts;
163 
164     /*
165      * Counters not part of ifTable or ifXTable
166      */
167     Counter         ifCollisions;
168     int             flags;           /* interface flags (IFF_*) */
169 } mib2_ifEntry_t;
170 
171 /*-
172  * Static const definitions (must be declared static and initialized)
173  */
174 
175 
176 /*-
177  * Global variable declarations (using extern and without initialization)
178  */
179 
180 /*-
181  * Function prototypes (use void as argument type if there are no arguments)
182  */
183 
184 #ifdef _STDC_COMPAT
185 #ifdef __cplusplus
186 extern          "C" {
187 #endif
188 #endif
189     void            init_kernel_sunos5(void);
190 
191     int             getKstat(const char *statname, const char *varname,
192                              void *value);
193     int             getMibstat(mibgroup_e grid, void *resp,
194                                size_t entrysize, req_e req_type,
195                                int (*comp) (void *, void *), void *arg);
196     int             Get_everything(void *, void *);
197     int             getKstatInt(const char *classname,
198                                 const char *statname, const char *varname,
199                                 int *value);
200 
201     int             getKstatString(const char *statname, const char *varname,
202                                    char *value, size_t value_len);
203 
204     int             solaris2_if_nametoindex(const char *, int);
205 
206 #ifdef _STDC_COMPAT
207 #ifdef __cplusplus
208 }
209 #endif
210 #endif
211 #endif
212