1
/**************************************************************
2
* Copyright (C) 2001 Alex Rozin, Optical Access
6
* Permission to use, copy, modify and distribute this software and its
7
* documentation for any purpose and without fee is hereby granted,
8
* provided that the above copyright notice appear in all copies and that
9
* both that copyright notice and this permission notice appear in
10
* supporting documentation.
12
* ALEX ROZIN DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
13
* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
14
* ALEX ROZIN BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
15
* ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
16
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
17
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
19
******************************************************************/
21
#include <net-snmp/net-snmp-config.h>
22
#include <net-snmp/net-snmp-includes.h>
23
#include <net-snmp/agent/net-snmp-agent-includes.h>
25
#include "util_funcs.h"
28
#include "agutil_api.h"
30
#ifndef OPTICALL_ACESS /* in OpticalAccess case : find them in ~agent/mibgroup/nbase directory */
32
ag_trace(const char *format, ...)
34
#define AG_MAX_MSG_LEN 120
35
char msg[AG_MAX_MSG_LEN];
41
va_start(args, format);
42
vsnprintf(msg, AG_MAX_MSG_LEN - 1, format, args);
44
snmp_log(LOG_INFO, "%s\n", msg);
49
AGUTIL_advance_index_name(struct variable *vp, oid * name,
50
size_t * length, int exact)
57
if (*length <= vp->namelen) {
59
snmp_oid_compare(name, *length, vp->name, (int) vp->namelen);
60
memcpy((char *) name, (char *) vp->name,
61
((int) vp->namelen) * sizeof(oid));
62
*length = vp->namelen;
65
* If the name is given with indexes - compare only the oids.
68
snmp_oid_compare(name, (int) vp->namelen, vp->name,
71
* If it's not the same oid - change name to the new oid
74
memcpy((char *) name, (char *) vp->name,
75
((int) vp->namelen) * sizeof(oid));
76
*length = vp->namelen;
81
ag_trace("*length=%d result=%d !!!", (int) *length, (int) result);
87
/*********************************************************************
88
* Function: AGUTIL_get_int_value
91
* Check/Get long value from the PDU..
92
* The parameters 'min_value' & 'max_value' allow to check the diaposon
93
* of the value. If (max_value <= min_value) we avoid this checking.
98
* SNMP_ERR_WRONGLENGTH
99
* SNMP_ERR_WRONGENCODING
101
*********************************************************************/
103
AGUTIL_get_int_value(u_char * var_val, u_char var_val_type,
104
size_t var_val_len, long min_value, long max_value,
107
if (var_val_type != ASN_INTEGER && var_val_type != ASN_TIMETICKS) {
108
ag_trace("not ASN_INTEGER 0x%lx", (long) var_val_type);
109
return SNMP_ERR_WRONGTYPE;
112
if (var_val_len > sizeof(long)) {
113
ag_trace("wrong len=%d", (int) var_val_len);
114
return SNMP_ERR_WRONGLENGTH;
117
*long_tmp = *((long *) var_val);
119
if (max_value > min_value) {
120
if (*long_tmp < min_value) {
121
ag_trace("%ld=long_tmp < min=%ld", (long) *long_tmp,
123
return SNMP_ERR_BADVALUE;
126
if (*long_tmp > max_value) {
127
ag_trace("%ld=long_tmp > max=%ld", (long) *long_tmp,
129
return SNMP_ERR_BADVALUE;
133
return SNMP_ERR_NOERROR;
137
/*********************************************************************
138
* Function: AGUTIL_get_string_value
141
* Check/Get 'DisplayString' value from the PDU..
146
* SNMP_ERR_WRONGLENGTH
147
* SNMP_ERR_WRONGENCODING
149
*********************************************************************/
151
AGUTIL_get_string_value(u_char * var_val, u_char var_val_type,
152
size_t var_val_len, size_t buffer_max_size,
153
u_char should_zero_limited,
154
size_t * buffer_actual_size, char *buffer)
156
if (var_val_type != ASN_OCTET_STR) {
157
ag_trace("not ASN_OCTET_STR 0x%lx", (long) var_val_type);
158
return SNMP_ERR_WRONGTYPE;
161
if (var_val_len > buffer_max_size) {
162
ag_trace("wrong len=%d > %d", (int) var_val_len, buffer_max_size);
163
return SNMP_ERR_WRONGLENGTH;
166
if (buffer_actual_size)
167
*buffer_actual_size = var_val_len;
169
memcpy(buffer, var_val, var_val_len);
170
if (should_zero_limited) {
171
buffer[var_val_len] = 0;
172
if (buffer_actual_size)
173
*buffer_actual_size += 1;
176
return SNMP_ERR_NOERROR;
182
AGUTIL_get_oid_value(u_char * var_val, u_char var_val_type,
183
size_t var_val_len, VAR_OID_T * data_source_ptr)
186
register oid *oid_var;
188
if (var_val_len > MAX_OID_LEN) {
189
ag_trace("wrong len=%d > %d", (int) var_val_len, MAX_OID_LEN);
190
return SNMP_ERR_WRONGLENGTH;
193
var_val_len /= sizeof(oid);
194
data_source_ptr->length = var_val_len;
195
oid_var = (oid *) var_val;
196
for (iii = 0; iii < (int)data_source_ptr->length; iii++)
197
data_source_ptr->objid[iii] = oid_var[iii];
199
return SNMP_ERR_NOERROR;
203
AGUTIL_sys_up_time(void)
205
struct timeval current, delta;
206
extern struct timeval starttime;
208
gettimeofday(¤t, NULL);
210
current.tv_usec += 1000000L;
211
delta.tv_sec = current.tv_sec - starttime.tv_sec;
212
delta.tv_usec = current.tv_usec - starttime.tv_usec;
213
if (delta.tv_usec > 1000000L) {
214
delta.tv_usec -= 1000000L;
218
return delta.tv_sec * 100 + delta.tv_usec / 10000;
222
* NOTE: this function is a template for system dependent
223
* implementation. Actually it (in debug purposes) returns
224
* random (but likely) data */
226
SYSTEM_get_eth_statistics(VAR_OID_T * data_source, ETH_STATS_T * where)
229
where->ifIndex = data_source->objid[data_source->length - 1];
230
agent_get_Rmon_ethernet_statistics(where->ifIndex, 1, /* exact */
232
#else /* OPTICALL_ACESS */
233
static ETH_STATS_T prev = { -1, -1 };
234
static time_t ifLastRead = 0;
239
where->ifIndex = data_source->objid[data_source->length - 1];
240
need_to_read = (where->ifIndex != prev.ifIndex);
242
curr_time = time(NULL);
243
need_to_read = (curr_time - ifLastRead > 1);
248
((double) rand() / (double) RAND_MAX) * 100.0);
249
ifLastRead = time(NULL);
250
prev.ifIndex = where->ifIndex;
254
memcpy(where, &prev, sizeof(ETH_STATS_T));
255
where->octets += rc * 100 * 200;
256
where->packets += rc * 100;
257
where->bcast_pkts += rc * 2;
258
where->mcast_pkts += rc * 3;
259
where->crc_align += rc;
260
where->undersize += 0;
261
where->oversize += 0;
262
where->fragments += rc / 2;
264
where->collisions += rc / 4;
266
where->pkts_64 += rc * 10;
267
where->pkts_65_127 += rc * 50;
268
where->pkts_128_255 += rc * 20;
269
where->pkts_256_511 += rc * 10;
270
where->pkts_512_1023 += rc * 15;
271
where->pkts_1024_1518 += rc * 5;
273
need_to_read = prev.ifIndex;
274
memcpy(&prev, where, sizeof(ETH_STATS_T));
275
prev.ifIndex = need_to_read;
276
#endif /* OPTICALL_ACESS */
279
#if 0 /* for memory debug */
280
static u_long dbg_mem_cnt = 0;
283
dbg_f_AGMALLOC(size_t size)
290
dbg_f_AGFREE(void *ptr)
297
dbg_f_AGSTRDUP(const char *s)
304
dbg_f_AG_MEM_REPORT(void)
306
ag_trace("dbg_mem_cnt=%ld", (long) dbg_mem_cnt);