1
#include <net-snmp/net-snmp-config.h> /* local SNMP configuration details */
15
#include <net-snmp/net-snmp-includes.h>
16
#include <net-snmp/agent/net-snmp-agent-includes.h>
17
#include <net-snmp/agent/auto_nlist.h>
19
#include "util_funcs.h" /* utility function declarations */
20
#include "memory.h" /* the module-specific header */
21
#include "memory_solaris2.h" /* the module-specific header */
31
static char errmsg[1024];
32
/****************************
33
* Kstat specific variables *
34
****************************/
35
extern kstat_ctl_t *kstat_fd; /* defined in kernel_sunos5.c */
37
kstat_named_t *kn, *kn2;
39
static FindVarMethod var_extensible_mem;
40
static long getFreeSwap(void);
41
static long getTotalFree(void);
42
static long getTotalSwap(void);
45
init_memory_solaris2(void)
48
struct variable2 extensible_mem_variables[] = {
49
{MIBINDEX, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MIBINDEX}},
50
{ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_mem, 1,
52
{MEMTOTALSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
54
{MEMAVAILSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
56
{MEMTOTALREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
58
{MEMAVAILREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
60
{MEMTOTALSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
62
{MEMUSEDSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
64
{MEMTOTALREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
66
{MEMUSEDREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
68
{MEMTOTALFREE, ASN_INTEGER, RONLY, var_extensible_mem, 1,
70
{MEMSWAPMINIMUM, ASN_INTEGER, RONLY, var_extensible_mem, 1,
72
{MEMSHARED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
74
{MEMBUFFER, ASN_INTEGER, RONLY, var_extensible_mem, 1,
76
{MEMCACHED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
78
{ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_mem, 1,
80
{ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_mem, 1, {ERRORMSG}}
84
* Define the OID pointer to the top of the mib tree that we're
85
* registering underneath
87
oid mem_variables_oid[] = { UCDAVIS_MIB, MEMMIBNUM };
90
* register ourselves with the agent to handle our mib tree
92
REGISTER_MIB("ucd-snmp/memory", extensible_mem_variables, variable2,
95
snmpd_register_config_handler("swap", memory_parse_config,
96
memory_free_config, "min-avail");
99
kstat_fd = kstat_open();
101
snmp_log_perror("kstat_open");
107
var_extensible_mem(struct variable *vp,
111
size_t * var_len, WriteMethod ** write_method)
113
static long long_ret;
116
* Initialize the return value to 0
120
if (header_generic(vp, name, length, exact, var_len, write_method))
126
return ((u_char *) (&long_ret));
127
case ERRORNAME: /* dummy name */
128
sprintf(errmsg, "swap");
129
*var_len = strlen(errmsg);
130
return ((u_char *) (errmsg));
132
long_ret = getTotalSwap() * (getpagesize() / 1024);
133
return ((u_char *) (&long_ret));
135
long_ret = getFreeSwap() * (getpagesize() / 1024);
136
return ((u_char *) (&long_ret));
138
long_ret = minimumswap;
139
return ((u_char *) (&long_ret));
141
#ifdef _SC_PHYS_PAGES
142
long_ret = sysconf(_SC_PHYS_PAGES) * (getpagesize()/1024);
144
ksp1 = kstat_lookup(kstat_fd, "unix", 0, "system_pages");
145
kstat_read(kstat_fd, ksp1, 0);
146
kn = kstat_data_lookup(ksp1, "physmem");
148
long_ret = kn->value.ul * (getpagesize() / 1024);
150
return ((u_char *) (&long_ret));
152
#ifdef _SC_AVPHYS_PAGES
153
long_ret = sysconf(_SC_AVPHYS_PAGES) * (getpagesize()/1024);
156
(getTotalFree() - getFreeSwap()) * (getpagesize() / 1024);
158
return ((u_char *) (&long_ret));
160
long_ret = getTotalFree() * (getpagesize() / 1024);
161
return ((u_char *) (&long_ret));
164
long_ret = getTotalFree() * (getpagesize() / 1024);
165
long_ret = (long_ret > minimumswap) ? 0 : 1;
166
return ((u_char *) (&long_ret));
169
long_ret = getTotalFree() * (getpagesize() / 1024);
170
if ((long_ret > minimumswap) ? 0 : 1)
171
sprintf(errmsg, "Running out of swap space (%ld)", long_ret);
174
*var_len = strlen(errmsg);
175
return ((u_char *) (errmsg));
182
#define DEFAULTMINIMUMSWAP 16000 /* kilobytes */
185
memory_parse_config(const char *token, char *cptr)
187
minimumswap = atoi(cptr);
191
memory_free_config(void)
193
minimumswap = DEFAULTMINIMUMSWAP;
208
num = swapctl(SC_GETNSWP, 0);
209
s = malloc(num * sizeof(swapent_t) + sizeof(struct swaptable));
211
strtab = (char *) malloc((num + 1) * MAXSTRSIZE);
213
for (i = 0; i < (num + 1); i++) {
214
s->swt_ent[i].ste_path = strtab + (i * MAXSTRSIZE);
217
n = swapctl(SC_LIST, s);
219
for (i = 0; i < n; i++)
220
total_mem += s->swt_ent[i].ste_pages;
231
* returns -1 if malloc fails.
243
num = swapctl(SC_GETNSWP, 0);
244
s = malloc(num * sizeof(swapent_t) + sizeof(struct swaptable));
246
strtab = (char *) malloc((num + 1) * MAXSTRSIZE);
249
for (i = 0; i < (num + 1); i++) {
250
s->swt_ent[i].ste_path = strtab + (i * MAXSTRSIZE);
253
n = swapctl(SC_LIST, s);
255
for (i = 0; i < n; i++)
256
free_mem += s->swt_ent[i].ste_free;
269
unsigned long free_mem, allocated, reserved, available, used_size;
272
if (-1 == swapctl(SC_AINFO, &ai)) {
273
snmp_log_perror("swapctl(SC_AINFO)");
276
allocated = ai.ani_max - ai.ani_free;
277
reserved = (ai.ani_resv - allocated);
278
available = (ai.ani_max - ai.ani_resv); /* K-byte */
279
free_mem = used_size = reserved + allocated;
280
free_mem = available;