2
* ICMP MIB group implementation - icmp.c
5
#include <net-snmp/net-snmp-config.h>
6
#include "mibII_common.h"
8
#if HAVE_NETINET_IP_ICMP_H
9
#include <netinet/ip_icmp.h>
12
#ifdef NETSNMP_ENABLE_IPV6
13
#if HAVE_NETINET_ICMP6_H
14
#include <netinet/icmp6.h>
16
#endif /* NETSNMP_ENABLE_IPV6 */
18
#if HAVE_NETINET_ICMP_VAR_H
19
#include <netinet/icmp_var.h>
22
#include <net-snmp/net-snmp-includes.h>
23
#include <net-snmp/agent/net-snmp-agent-includes.h>
24
#include <net-snmp/agent/auto_nlist.h>
26
#include <net-snmp/agent/cache_handler.h>
27
#include <net-snmp/agent/scalar_group.h>
28
#include <net-snmp/agent/sysORTable.h>
30
#include "util_funcs/MIB_STATS_CACHE_TIMEOUT.h"
33
#ifndef MIB_STATS_CACHE_TIMEOUT
34
#define MIB_STATS_CACHE_TIMEOUT 5
36
#ifndef ICMP_STATS_CACHE_TIMEOUT
37
#define ICMP_STATS_CACHE_TIMEOUT MIB_STATS_CACHE_TIMEOUT
40
/* redefine ICMP6 message types from glibc < 2.4 to newer names */
41
#ifndef MLD_LISTENER_QUERY
42
#define MLD_LISTENER_QUERY ICMP6_MEMBERSHIP_QUERY
43
#define MLD_LISTENER_REPORT ICMP6_MEMBERSHIP_REPORT
44
#define MLD_LISTENER_REDUCTION ICMP6_MEMBERSHIP_REDUCTION
45
#endif /* ICMP6_MEMBERSHIP_QUERY */
48
#if defined(HAVE_LIBPERFSTAT_H) && (defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)) && !defined(FIRST_PROTOCOL)
49
#ifdef HAVE_SYS_PROTOSW_H
50
#include <sys/protosw.h>
52
#include <libperfstat.h>
54
perfstat_protocol_t ps_proto;
55
perfstat_id_t ps_name;
56
#define _USE_PERFSTAT_PROTOCOL 1
60
/*********************
62
* Kernel & interface information,
63
* and internal forward declarations
65
*********************/
67
/*********************
69
* Initialisation & common implementation functions
71
*********************/
75
* Define the OID pointer to the top of the mib tree that we're
76
* registering underneath
78
static const oid icmp_oid[] = { SNMP_OID_MIB2, 5 };
79
static const oid icmp_stats_tbl_oid[] = { SNMP_OID_MIB2, 5, 29 };
80
static const oid icmp_msg_stats_tbl_oid[] = { SNMP_OID_MIB2, 5, 30 };
81
#ifdef USING_MIBII_IP_MODULE
82
extern oid ip_module_oid[];
83
extern int ip_module_oid_len;
84
extern int ip_module_count;
88
struct icmp_stats_table_entry {
90
uint32_t icmpStatsInMsgs;
91
uint32_t icmpStatsInErrors;
92
uint32_t icmpStatsOutMsgs;
93
uint32_t icmpStatsOutErrors;
96
struct icmp_stats_table_entry icmp_stats_table[2];
98
#define ICMP_MSG_STATS_HAS_IN 1
99
#define ICMP_MSG_STATS_HAS_OUT 2
101
struct icmp_msg_stats_table_entry {
103
uint32_t icmpMsgStatsType;
104
uint32_t icmpMsgStatsInPkts;
105
uint32_t icmpMsgStatsOutPkts;
109
#define ICMP_MSG_STATS_IPV4_COUNT 11
111
#ifdef NETSNMP_ENABLE_IPV6
112
#define ICMP_MSG_STATS_IPV6_COUNT 14
114
#define ICMP_MSG_STATS_IPV6_COUNT 0
115
#endif /* NETSNMP_ENABLE_IPV6 */
117
struct icmp_msg_stats_table_entry icmp_msg_stats_table[ICMP_MSG_STATS_IPV4_COUNT + ICMP_MSG_STATS_IPV6_COUNT];
120
icmp_stats_load(netsnmp_cache *cache, void *vmagic)
124
* note don't bother using the passed in cache
125
* and vmagic pointers. They are useless as they
126
* currently point to the icmp system stats cache
127
* since I see little point in registering another
128
* cache for this table. Its not really needed
132
struct icmp_mib v4icmp;
133
struct icmp6_mib v6icmp;
137
linux_read_icmp_stat(&v4icmp);
138
icmp_stats_table[i].icmpStatsInMsgs = v4icmp.icmpInMsgs;
139
icmp_stats_table[i].icmpStatsInErrors = v4icmp.icmpInErrors;
140
icmp_stats_table[i].icmpStatsOutMsgs = v4icmp.icmpOutMsgs;
141
icmp_stats_table[i].icmpStatsOutErrors = v4icmp.icmpOutErrors;
144
memset(&icmp_stats_table[i],0,
145
sizeof(struct icmp_stats_table_entry));
146
linux_read_icmp6_stat(&v6icmp);
147
icmp_stats_table[i].icmpStatsInMsgs = v6icmp.icmp6InMsgs;
148
icmp_stats_table[i].icmpStatsInErrors = v6icmp.icmp6InErrors;
149
icmp_stats_table[i].icmpStatsOutMsgs = v6icmp.icmp6OutMsgs;
150
icmp_stats_table[i].icmpStatsOutErrors = v6icmp.icmp6OutDestUnreachs +
151
v6icmp.icmp6OutPktTooBigs + v6icmp.icmp6OutTimeExcds +
152
v6icmp.icmp6OutParmProblems;
155
icmp_stats_table[i].ipVer=i+1;
162
icmp_msg_stats_load(netsnmp_cache *cache, void *vmagic)
164
struct icmp_mib v4icmp;
165
struct icmp4_msg_mib v4icmpmsg;
166
#ifdef NETSNMP_ENABLE_IPV6
167
struct icmp6_mib v6icmp;
168
struct icmp6_msg_mib v6icmpmsg;
170
int i, j, k, flag, inc;
172
memset(&icmp_msg_stats_table, 0, sizeof(icmp_msg_stats_table));
178
linux_read_icmp_msg_stat(&v4icmp, &v4icmpmsg, &flag);
181
if (v4icmpmsg.vals[k].InType) {
182
icmp_msg_stats_table[i].ipVer = 1;
183
icmp_msg_stats_table[i].icmpMsgStatsType = k;
184
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmpmsg.vals[k].InType;
185
icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_IN;
186
inc = 1; /* Set this if we found a valid entry */
188
if (v4icmpmsg.vals[k].OutType) {
189
icmp_msg_stats_table[i].ipVer = 1;
190
icmp_msg_stats_table[i].icmpMsgStatsType = k;
191
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmpmsg.vals[k].OutType;
192
icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_OUT;
193
inc = 1; /* Set this if we found a valid entry */
202
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ECHOREPLY;
203
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInEchoReps;
204
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutEchoReps;
207
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_DEST_UNREACH;
208
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInDestUnreachs;
209
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutDestUnreachs;
212
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_SOURCE_QUENCH;
213
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInSrcQuenchs;
214
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutSrcQuenchs;
217
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_REDIRECT;
218
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInRedirects;
219
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutRedirects;
222
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ECHO;
223
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInEchos;
224
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutEchos;
227
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIME_EXCEEDED;
228
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimeExcds;
229
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimeExcds;
232
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_PARAMETERPROB;
233
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInParmProbs;
234
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutParmProbs;
237
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIMESTAMP;
238
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimestamps;
239
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimestamps;
242
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIMESTAMPREPLY;
243
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimestampReps;
244
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimestampReps;
247
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ADDRESS;
248
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInAddrMasks;
249
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutAddrMasks;
252
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ADDRESSREPLY;
253
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInAddrMaskReps;
254
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutAddrMaskReps;
257
/* set the IP version and default flags */
258
for (j = 0; j < ICMP_MSG_STATS_IPV4_COUNT; j++) {
259
icmp_msg_stats_table[j].ipVer = 1;
260
icmp_msg_stats_table[j].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
264
#ifdef NETSNMP_ENABLE_IPV6
268
linux_read_icmp6_msg_stat(&v6icmp, &v6icmpmsg, &flag);
271
if (v6icmpmsg.vals[k].InType) {
272
icmp_msg_stats_table[i].ipVer = 2;
273
icmp_msg_stats_table[i].icmpMsgStatsType = k;
274
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmpmsg.vals[k].InType;
275
icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_IN;
276
inc = 1; /* Set this if we found a valid entry */
278
if (v6icmpmsg.vals[k].OutType) {
279
icmp_msg_stats_table[i].ipVer = 2;
280
icmp_msg_stats_table[i].icmpMsgStatsType = k;
281
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmpmsg.vals[k].OutType;
282
icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_OUT;
283
inc = 1; /* Set this if we found a valid entry */
292
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_DST_UNREACH;
293
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InDestUnreachs;
294
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutDestUnreachs;
297
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_PACKET_TOO_BIG;
298
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InPktTooBigs;
299
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutPktTooBigs;
302
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_TIME_EXCEEDED;
303
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InTimeExcds;
304
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutTimeExcds;
307
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_PARAM_PROB;
308
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InParmProblems;
309
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutParmProblems;
312
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_ECHO_REQUEST;
313
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InEchos;
314
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = 0;
315
icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN;
318
icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_ECHO_REPLY;
319
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InEchoReplies;
320
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutEchoReplies;
323
#ifdef MLD_LISTENER_QUERY
324
icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_QUERY;
325
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembQueries;
326
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = 0;
327
icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN;
329
icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_REPORT;
330
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembResponses;
331
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutGroupMembResponses;
334
icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_REDUCTION;
335
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembReductions;
336
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutGroupMembReductions;
340
icmp_msg_stats_table[i].icmpMsgStatsType = ND_ROUTER_SOLICIT;
341
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRouterSolicits;
342
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutRouterSolicits;
345
icmp_msg_stats_table[i].icmpMsgStatsType = ND_ROUTER_ADVERT;
346
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRouterAdvertisements;
347
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = 0;
348
icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN;
351
icmp_msg_stats_table[i].icmpMsgStatsType = ND_NEIGHBOR_SOLICIT;
352
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InNeighborSolicits;
353
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutNeighborSolicits;
356
icmp_msg_stats_table[i].icmpMsgStatsType = ND_NEIGHBOR_ADVERT;
357
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InNeighborAdvertisements;
358
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutNeighborAdvertisements;
361
icmp_msg_stats_table[i].icmpMsgStatsType = ND_REDIRECT;
362
icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRedirects;
363
icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutRedirects;
365
for (j = 0; j < ICMP_MSG_STATS_IPV6_COUNT; j++) {
366
icmp_msg_stats_table[ICMP_MSG_STATS_IPV4_COUNT + j].ipVer = 2;
367
icmp_msg_stats_table[ICMP_MSG_STATS_IPV4_COUNT + j].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
370
#endif /* NETSNMP_ENABLE_IPV6 */
374
netsnmp_variable_list *
375
icmp_stats_next_entry( void **loop_context,
377
netsnmp_variable_list *index,
378
netsnmp_iterator_info *data)
380
int i = (int)(intptr_t)(*loop_context);
381
netsnmp_variable_list *idx = index;
390
snmp_set_var_typed_value(idx, ASN_INTEGER, (u_char *)&icmp_stats_table[i].ipVer,
392
idx = idx->next_variable;
394
*data_context = &icmp_stats_table[i];
396
*loop_context = (void *)(intptr_t)(++i);
402
netsnmp_variable_list *
403
icmp_stats_first_entry( void **loop_context,
405
netsnmp_variable_list *index,
406
netsnmp_iterator_info *data)
409
*loop_context = NULL;
410
*data_context = NULL;
411
return icmp_stats_next_entry(loop_context, data_context, index, data);
414
netsnmp_variable_list *
415
icmp_msg_stats_next_entry(void **loop_context,
417
netsnmp_variable_list *index,
418
netsnmp_iterator_info *data)
420
int i = (int)(intptr_t)(*loop_context);
421
netsnmp_variable_list *idx = index;
423
if(i >= ICMP_MSG_STATS_IPV4_COUNT + ICMP_MSG_STATS_IPV6_COUNT)
427
snmp_set_var_typed_value(idx, ASN_INTEGER,
428
(u_char *)&icmp_msg_stats_table[i].ipVer,
431
/* set packet type */
432
idx = idx->next_variable;
433
snmp_set_var_typed_value(idx, ASN_INTEGER,
434
(u_char *)&icmp_msg_stats_table[i].icmpMsgStatsType,
437
*data_context = &icmp_msg_stats_table[i];
438
*loop_context = (void *)(intptr_t)(++i);
444
netsnmp_variable_list *
445
icmp_msg_stats_first_entry(void **loop_context,
447
netsnmp_variable_list *index,
448
netsnmp_iterator_info *data)
450
*loop_context = NULL;
451
*data_context = NULL;
452
return icmp_msg_stats_next_entry(loop_context, data_context, index, data);
460
netsnmp_handler_registration *msg_stats_reginfo = NULL;
461
netsnmp_handler_registration *table_reginfo = NULL;
462
netsnmp_iterator_info *iinfo;
463
netsnmp_iterator_info *msg_stats_iinfo;
464
netsnmp_table_registration_info *table_info;
465
netsnmp_table_registration_info *msg_stats_table_info;
467
netsnmp_handler_registration *scalar_reginfo = NULL;
471
* register ourselves with the agent as a group of scalars...
473
DEBUGMSGTL(("mibII/icmp", "Initialising ICMP group\n"));
474
scalar_reginfo = netsnmp_create_handler_registration("icmp", icmp_handler,
475
icmp_oid, OID_LENGTH(icmp_oid), HANDLER_CAN_RONLY);
476
rc = netsnmp_register_scalar_group(scalar_reginfo, ICMPINMSGS, ICMPOUTADDRMASKREPS);
477
if (rc != SNMPERR_SUCCESS)
480
* .... with a local cache
481
* (except for HP-UX 11, which extracts objects individually)
484
rc = netsnmp_inject_handler( scalar_reginfo,
485
netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
486
icmp_load, icmp_free,
487
icmp_oid, OID_LENGTH(icmp_oid)));
488
if (rc != SNMPERR_SUCCESS)
493
/* register icmpStatsTable */
494
table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
497
netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, 0);
498
table_info->min_column = ICMP_STAT_INMSG;
499
table_info->max_column = ICMP_STAT_OUTERR;
502
iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
505
iinfo->get_first_data_point = icmp_stats_first_entry;
506
iinfo->get_next_data_point = icmp_stats_next_entry;
507
iinfo->table_reginfo = table_info;
509
table_reginfo = netsnmp_create_handler_registration("icmpStatsTable",
510
icmp_stats_table_handler, icmp_stats_tbl_oid,
511
OID_LENGTH(icmp_stats_tbl_oid), HANDLER_CAN_RONLY);
513
rc = netsnmp_register_table_iterator2(table_reginfo, iinfo);
514
if (rc != SNMPERR_SUCCESS) {
515
table_reginfo = NULL;
518
netsnmp_inject_handler( table_reginfo,
519
netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
520
icmp_load, icmp_free,
521
icmp_stats_tbl_oid, OID_LENGTH(icmp_stats_tbl_oid)));
523
/* register icmpMsgStatsTable */
524
msg_stats_table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
525
if (!msg_stats_table_info)
527
netsnmp_table_helper_add_indexes(msg_stats_table_info, ASN_INTEGER, ASN_INTEGER, 0);
528
msg_stats_table_info->min_column = ICMP_MSG_STAT_IN_PKTS;
529
msg_stats_table_info->max_column = ICMP_MSG_STAT_OUT_PKTS;
531
msg_stats_iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
532
if (!msg_stats_iinfo)
534
msg_stats_iinfo->get_first_data_point = icmp_msg_stats_first_entry;
535
msg_stats_iinfo->get_next_data_point = icmp_msg_stats_next_entry;
536
msg_stats_iinfo->table_reginfo = msg_stats_table_info;
538
msg_stats_reginfo = netsnmp_create_handler_registration("icmpMsgStatsTable",
539
icmp_msg_stats_table_handler, icmp_msg_stats_tbl_oid,
540
OID_LENGTH(icmp_msg_stats_tbl_oid), HANDLER_CAN_RONLY);
542
rc = netsnmp_register_table_iterator2(msg_stats_reginfo, msg_stats_iinfo);
543
if (rc != SNMPERR_SUCCESS) {
544
msg_stats_reginfo = NULL;
548
netsnmp_inject_handler( msg_stats_reginfo,
549
netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
550
icmp_load, icmp_free,
551
icmp_msg_stats_tbl_oid, OID_LENGTH(icmp_msg_stats_tbl_oid)));
554
#ifdef USING_MIBII_IP_MODULE
555
if (++ip_module_count == 2)
556
REGISTER_SYSOR_TABLE(ip_module_oid, ip_module_oid_len,
557
"The MIB module for managing IP and ICMP implementations");
560
#if !defined(_USE_PERFSTAT_PROTOCOL)
561
#ifdef ICMPSTAT_SYMBOL
562
auto_nlist(ICMPSTAT_SYMBOL, 0, 0);
565
init_kernel_sunos5();
574
if (msg_stats_reginfo)
575
netsnmp_handler_registration_free(msg_stats_reginfo);
577
netsnmp_handler_registration_free(table_reginfo);
580
netsnmp_handler_registration_free(scalar_reginfo);
584
/*********************
586
* System specific data formats
588
*********************/
591
#define ICMP_STAT_STRUCTURE int
595
#define ICMP_STAT_STRUCTURE struct icmp_mib
596
#define USES_SNMP_DESIGNED_ICMPSTAT
597
#undef ICMPSTAT_SYMBOL
601
#define ICMP_STAT_STRUCTURE mib2_icmp_t
602
#define USES_SNMP_DESIGNED_ICMPSTAT
605
#ifdef NETBSD_STATS_VIA_SYSCTL
606
#define ICMP_STAT_STRUCTURE struct icmp_mib
607
#define USES_SNMP_DESIGNED_ICMPSTAT
611
#ifdef HAVE_IPHLPAPI_H
612
#include <iphlpapi.h>
613
#define ICMP_STAT_STRUCTURE MIB_ICMP
616
/* ?? #if (defined(NETSNMP_CAN_USE_SYSCTL) && defined(ICMPCTL_STATS)) ?? */
618
#ifdef HAVE_SYS_ICMPIPSTATS_H
619
/* or #ifdef HAVE_SYS_TCPIPSTATS_H ??? */
620
#define ICMP_STAT_STRUCTURE struct kna
621
#define USES_TRADITIONAL_ICMPSTAT
624
#if !defined(ICMP_STAT_STRUCTURE)
625
#define ICMP_STAT_STRUCTURE struct icmpstat
626
#define USES_TRADITIONAL_ICMPSTAT
629
ICMP_STAT_STRUCTURE icmpstat;
632
/*********************
634
* System independent handler
637
*********************/
640
icmp_handler(netsnmp_mib_handler *handler,
641
netsnmp_handler_registration *reginfo,
642
netsnmp_agent_request_info *reqinfo,
643
netsnmp_request_info *requests)
645
netsnmp_request_info *request;
646
netsnmp_variable_list *requestvb;
649
#ifdef USES_TRADITIONAL_ICMPSTAT
654
* The cached data should already have been loaded by the
655
* cache handler, higher up the handler chain.
657
#if defined(_USE_PERFSTAT_PROTOCOL)
658
icmp_load(NULL, NULL);
666
DEBUGMSGTL(("mibII/icmp", "Handler - mode %s\n",
667
se_find_label_in_slist("agent_mode", reqinfo->mode)));
668
switch (reqinfo->mode) {
670
for (request=requests; request; request=request->next) {
671
requestvb = request->requestvb;
672
subid = requestvb->name[OID_LENGTH(icmp_oid)]; /* XXX */
673
DEBUGMSGTL(( "mibII/icmp", "oid: "));
674
DEBUGMSGOID(("mibII/icmp", requestvb->name,
675
requestvb->name_length));
676
DEBUGMSG(( "mibII/icmp", "\n"));
679
#ifdef USES_SNMP_DESIGNED_ICMPSTAT
681
ret_value = icmpstat.icmpInMsgs;
684
ret_value = icmpstat.icmpInErrors;
686
case ICMPINDESTUNREACHS:
687
ret_value = icmpstat.icmpInDestUnreachs;
689
case ICMPINTIMEEXCDS:
690
ret_value = icmpstat.icmpInTimeExcds;
692
case ICMPINPARMPROBS:
693
ret_value = icmpstat.icmpInParmProbs;
695
case ICMPINSRCQUENCHS:
696
ret_value = icmpstat.icmpInSrcQuenchs;
698
case ICMPINREDIRECTS:
699
ret_value = icmpstat.icmpInRedirects;
702
ret_value = icmpstat.icmpInEchos;
705
ret_value = icmpstat.icmpInEchoReps;
707
case ICMPINTIMESTAMPS:
708
ret_value = icmpstat.icmpInTimestamps;
710
case ICMPINTIMESTAMPREPS:
711
ret_value = icmpstat.icmpInTimestampReps;
713
case ICMPINADDRMASKS:
714
ret_value = icmpstat.icmpInAddrMasks;
716
case ICMPINADDRMASKREPS:
717
ret_value = icmpstat.icmpInAddrMaskReps;
720
ret_value = icmpstat.icmpOutMsgs;
723
ret_value = icmpstat.icmpOutErrors;
725
case ICMPOUTDESTUNREACHS:
726
ret_value = icmpstat.icmpOutDestUnreachs;
728
case ICMPOUTTIMEEXCDS:
729
ret_value = icmpstat.icmpOutTimeExcds;
731
case ICMPOUTPARMPROBS:
732
ret_value = icmpstat.icmpOutParmProbs;
734
case ICMPOUTSRCQUENCHS:
735
ret_value = icmpstat.icmpOutSrcQuenchs;
737
case ICMPOUTREDIRECTS:
738
ret_value = icmpstat.icmpOutRedirects;
741
ret_value = icmpstat.icmpOutEchos;
743
case ICMPOUTECHOREPS:
744
ret_value = icmpstat.icmpOutEchoReps;
746
case ICMPOUTTIMESTAMPS:
747
ret_value = icmpstat.icmpOutTimestamps;
749
case ICMPOUTTIMESTAMPREPS:
750
ret_value = icmpstat.icmpOutTimestampReps;
752
case ICMPOUTADDRMASKS:
753
ret_value = icmpstat.icmpOutAddrMasks;
755
case ICMPOUTADDRMASKREPS:
756
ret_value = icmpstat.icmpOutAddrMaskReps;
758
#elif defined(USES_TRADITIONAL_ICMPSTAT) && !defined(_USE_PERFSTAT_PROTOCOL)
760
ret_value = icmpstat.icps_badcode +
761
icmpstat.icps_tooshort +
762
icmpstat.icps_checksum + icmpstat.icps_badlen;
763
for (i = 0; i <= ICMP_MAXTYPE; i++)
764
ret_value += icmpstat.icps_inhist[i];
767
ret_value = icmpstat.icps_badcode +
768
icmpstat.icps_tooshort +
769
icmpstat.icps_checksum + icmpstat.icps_badlen;
771
case ICMPINDESTUNREACHS:
772
ret_value = icmpstat.icps_inhist[ICMP_UNREACH];
774
case ICMPINTIMEEXCDS:
775
ret_value = icmpstat.icps_inhist[ICMP_TIMXCEED];
777
case ICMPINPARMPROBS:
778
ret_value = icmpstat.icps_inhist[ICMP_PARAMPROB];
780
case ICMPINSRCQUENCHS:
781
ret_value = icmpstat.icps_inhist[ICMP_SOURCEQUENCH];
783
case ICMPINREDIRECTS:
784
ret_value = icmpstat.icps_inhist[ICMP_REDIRECT];
787
ret_value = icmpstat.icps_inhist[ICMP_ECHO];
790
ret_value = icmpstat.icps_inhist[ICMP_ECHOREPLY];
792
case ICMPINTIMESTAMPS:
793
ret_value = icmpstat.icps_inhist[ICMP_TSTAMP];
795
case ICMPINTIMESTAMPREPS:
796
ret_value = icmpstat.icps_inhist[ICMP_TSTAMPREPLY];
798
case ICMPINADDRMASKS:
799
ret_value = icmpstat.icps_inhist[ICMP_MASKREQ];
801
case ICMPINADDRMASKREPS:
802
ret_value = icmpstat.icps_inhist[ICMP_MASKREPLY];
805
ret_value = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
806
for (i = 0; i <= ICMP_MAXTYPE; i++)
807
ret_value += icmpstat.icps_outhist[i];
810
ret_value = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
812
case ICMPOUTDESTUNREACHS:
813
ret_value = icmpstat.icps_outhist[ICMP_UNREACH];
815
case ICMPOUTTIMEEXCDS:
816
ret_value = icmpstat.icps_outhist[ICMP_TIMXCEED];
818
case ICMPOUTPARMPROBS:
819
ret_value = icmpstat.icps_outhist[ICMP_PARAMPROB];
821
case ICMPOUTSRCQUENCHS:
822
ret_value = icmpstat.icps_outhist[ICMP_SOURCEQUENCH];
824
case ICMPOUTREDIRECTS:
825
ret_value = icmpstat.icps_outhist[ICMP_REDIRECT];
828
ret_value = icmpstat.icps_outhist[ICMP_ECHO];
830
case ICMPOUTECHOREPS:
831
ret_value = icmpstat.icps_outhist[ICMP_ECHOREPLY];
833
case ICMPOUTTIMESTAMPS:
834
ret_value = icmpstat.icps_outhist[ICMP_TSTAMP];
836
case ICMPOUTTIMESTAMPREPS:
837
ret_value = icmpstat.icps_outhist[ICMP_TSTAMPREPLY];
839
case ICMPOUTADDRMASKS:
840
ret_value = icmpstat.icps_outhist[ICMP_MASKREQ];
842
case ICMPOUTADDRMASKREPS:
843
ret_value = icmpstat.icps_outhist[ICMP_MASKREPLY];
845
#elif defined(hpux11)
848
case ICMPINDESTUNREACHS:
849
case ICMPINTIMEEXCDS:
850
case ICMPINPARMPROBS:
851
case ICMPINSRCQUENCHS:
852
case ICMPINREDIRECTS:
855
case ICMPINTIMESTAMPS:
856
case ICMPINTIMESTAMPREPS:
857
case ICMPINADDRMASKS:
858
case ICMPINADDRMASKREPS:
861
case ICMPOUTDESTUNREACHS:
862
case ICMPOUTTIMEEXCDS:
863
case ICMPOUTPARMPROBS:
864
case ICMPOUTSRCQUENCHS:
865
case ICMPOUTREDIRECTS:
867
case ICMPOUTECHOREPS:
868
case ICMPOUTTIMESTAMPS:
869
case ICMPOUTTIMESTAMPREPS:
870
case ICMPOUTADDRMASKS:
871
case ICMPOUTADDRMASKREPS:
873
* This is a bit of a hack, to shoehorn the HP-UX 11
874
* single-object retrieval approach into the caching
877
if (icmp_load(NULL, (void*)subid) == -1 ) {
878
netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);
881
ret_value = icmpstat;
883
#elif defined (WIN32) || defined (cygwin)
885
ret_value = icmpstat.stats.icmpInStats.dwMsgs;
888
ret_value = icmpstat.stats.icmpInStats.dwErrors;
890
case ICMPINDESTUNREACHS:
891
ret_value = icmpstat.stats.icmpInStats.dwDestUnreachs;
893
case ICMPINTIMEEXCDS:
894
ret_value = icmpstat.stats.icmpInStats.dwTimeExcds;
896
case ICMPINPARMPROBS:
897
ret_value = icmpstat.stats.icmpInStats.dwParmProbs;
899
case ICMPINSRCQUENCHS:
900
ret_value = icmpstat.stats.icmpInStats.dwSrcQuenchs;
902
case ICMPINREDIRECTS:
903
ret_value = icmpstat.stats.icmpInStats.dwRedirects;
906
ret_value = icmpstat.stats.icmpInStats.dwEchos;
909
ret_value = icmpstat.stats.icmpInStats.dwEchoReps;
911
case ICMPINTIMESTAMPS:
912
ret_value = icmpstat.stats.icmpInStats.dwTimestamps;
914
case ICMPINTIMESTAMPREPS:
915
ret_value = icmpstat.stats.icmpInStats.dwTimestampReps;
917
case ICMPINADDRMASKS:
918
ret_value = icmpstat.stats.icmpInStats.dwAddrMasks;
920
case ICMPINADDRMASKREPS:
921
ret_value = icmpstat.stats.icmpInStats.dwAddrMaskReps;
924
ret_value = icmpstat.stats.icmpOutStats.dwMsgs;
927
ret_value = icmpstat.stats.icmpOutStats.dwErrors;
929
case ICMPOUTDESTUNREACHS:
930
ret_value = icmpstat.stats.icmpOutStats.dwDestUnreachs;
932
case ICMPOUTTIMEEXCDS:
933
ret_value = icmpstat.stats.icmpOutStats.dwTimeExcds;
935
case ICMPOUTPARMPROBS:
936
ret_value = icmpstat.stats.icmpOutStats.dwParmProbs;
938
case ICMPOUTSRCQUENCHS:
939
ret_value = icmpstat.stats.icmpOutStats.dwSrcQuenchs;
941
case ICMPOUTREDIRECTS:
942
ret_value = icmpstat.stats.icmpOutStats.dwRedirects;
945
ret_value = icmpstat.stats.icmpOutStats.dwEchos;
947
case ICMPOUTECHOREPS:
948
ret_value = icmpstat.stats.icmpOutStats.dwEchoReps;
950
case ICMPOUTTIMESTAMPS:
951
ret_value = icmpstat.stats.icmpOutStats.dwTimestamps;
953
case ICMPOUTTIMESTAMPREPS:
954
ret_value = icmpstat.stats.icmpOutStats.dwTimestampReps;
956
case ICMPOUTADDRMASKS:
957
ret_value = icmpstat.stats.icmpOutStats.dwAddrMasks;
959
case ICMPOUTADDRMASKREPS:
960
ret_value = icmpstat.stats.icmpOutStats.dwAddrMaskReps;
962
#elif defined(_USE_PERFSTAT_PROTOCOL)
964
ret_value = ps_proto.u.icmp.received;
967
ret_value = ps_proto.u.icmp.errors;
969
case ICMPINDESTUNREACHS:
970
case ICMPINTIMEEXCDS:
971
case ICMPINPARMPROBS:
972
case ICMPINSRCQUENCHS:
973
case ICMPINREDIRECTS:
976
case ICMPINTIMESTAMPS:
977
case ICMPINTIMESTAMPREPS:
978
case ICMPINADDRMASKS:
979
case ICMPINADDRMASKREPS:
983
ret_value = ps_proto.u.icmp.sent;
986
ret_value = ps_proto.u.icmp.errors;
988
case ICMPOUTDESTUNREACHS:
989
case ICMPOUTTIMEEXCDS:
990
case ICMPOUTPARMPROBS:
991
case ICMPOUTSRCQUENCHS:
992
case ICMPOUTREDIRECTS:
994
case ICMPOUTECHOREPS:
995
case ICMPOUTTIMESTAMPS:
996
case ICMPOUTTIMESTAMPREPS:
997
case ICMPOUTADDRMASKS:
998
case ICMPOUTADDRMASKREPS:
1001
#endif /* USES_SNMP_DESIGNED_ICMPSTAT */
1003
snmp_set_var_typed_value(request->requestvb, ASN_COUNTER,
1004
(u_char *)&ret_value, sizeof(ret_value));
1010
#ifndef NETSNMP_NO_WRITE_SUPPORT
1011
case MODE_SET_RESERVE1:
1012
case MODE_SET_RESERVE2:
1013
case MODE_SET_ACTION:
1014
case MODE_SET_COMMIT:
1017
snmp_log(LOG_WARNING, "mibII/icmp: Unsupported mode (%d)\n",
1020
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
1022
snmp_log(LOG_WARNING, "mibII/icmp: Unrecognised mode (%d)\n",
1027
return SNMP_ERR_NOERROR;
1033
icmp_stats_table_handler(netsnmp_mib_handler *handler,
1034
netsnmp_handler_registration *reginfo,
1035
netsnmp_agent_request_info *reqinfo,
1036
netsnmp_request_info *requests)
1038
netsnmp_request_info *request;
1039
netsnmp_variable_list *requestvb;
1040
netsnmp_table_request_info *table_info;
1041
struct icmp_stats_table_entry *entry;
1044
switch (reqinfo->mode) {
1046
for (request=requests; request; request=request->next) {
1047
requestvb = request->requestvb;
1048
entry = (struct icmp_stats_table_entry *)netsnmp_extract_iterator_context(request);
1051
table_info = netsnmp_extract_table_info(request);
1052
subid = table_info->colnum;
1055
case ICMP_STAT_INMSG:
1056
snmp_set_var_typed_value(requestvb, ASN_COUNTER,
1057
(u_char *)&entry->icmpStatsInMsgs, sizeof(uint32_t));
1059
case ICMP_STAT_INERR:
1060
snmp_set_var_typed_value(requestvb, ASN_COUNTER,
1061
(u_char *)&entry->icmpStatsInErrors, sizeof(uint32_t));
1063
case ICMP_STAT_OUTMSG:
1064
snmp_set_var_typed_value(requestvb, ASN_COUNTER,
1065
(u_char *)&entry->icmpStatsOutMsgs, sizeof(uint32_t));
1067
case ICMP_STAT_OUTERR:
1068
snmp_set_var_typed_value(requestvb, ASN_COUNTER,
1069
(u_char *)&entry->icmpStatsOutErrors, sizeof(uint32_t));
1072
snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unrecognised column (%d)\n",(int)subid);
1078
#ifndef NETSNMP_NO_WRITE_SUPPORT
1079
case MODE_SET_RESERVE1:
1080
case MODE_SET_RESERVE2:
1081
case MODE_SET_ACTION:
1082
case MODE_SET_COMMIT:
1085
snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unsupported mode (%d)\n",
1088
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
1090
snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unrecognised mode (%d)\n",
1096
return SNMP_ERR_NOERROR;
1100
icmp_msg_stats_table_handler(netsnmp_mib_handler *handler,
1101
netsnmp_handler_registration *reginfo,
1102
netsnmp_agent_request_info *reqinfo,
1103
netsnmp_request_info *requests)
1105
netsnmp_request_info *request;
1106
netsnmp_variable_list *requestvb;
1107
netsnmp_table_request_info *table_info;
1108
struct icmp_msg_stats_table_entry *entry;
1111
switch (reqinfo->mode) {
1113
for (request = requests; request; request = request->next) {
1114
requestvb = request->requestvb;
1115
entry = (struct icmp_msg_stats_table_entry *)netsnmp_extract_iterator_context(request);
1118
table_info = netsnmp_extract_table_info(request);
1119
subid = table_info->colnum;
1122
case ICMP_MSG_STAT_IN_PKTS:
1123
if (entry->flags & ICMP_MSG_STATS_HAS_IN) {
1124
snmp_set_var_typed_value(requestvb, ASN_COUNTER,
1125
(u_char *)&entry->icmpMsgStatsInPkts, sizeof(uint32_t));
1127
requestvb->type = SNMP_NOSUCHINSTANCE;
1130
case ICMP_MSG_STAT_OUT_PKTS:
1131
if (entry->flags & ICMP_MSG_STATS_HAS_OUT) {
1132
snmp_set_var_typed_value(requestvb, ASN_COUNTER,
1133
(u_char *)&entry->icmpMsgStatsOutPkts, sizeof(uint32_t));
1135
requestvb->type = SNMP_NOSUCHINSTANCE;
1139
snmp_log(LOG_WARNING, "mibII/icmpMsgStatsTable: Unrecognised column (%d)\n",(int)subid);
1145
#ifndef NETSNMP_NO_WRITE_SUPPORT
1146
case MODE_SET_RESERVE1:
1147
case MODE_SET_RESERVE2:
1148
case MODE_SET_ACTION:
1149
case MODE_SET_COMMIT:
1152
snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unsupported mode (%d)\n",
1155
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
1157
snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unrecognised mode (%d)\n",
1163
return SNMP_ERR_NOERROR;
1167
/*********************
1169
* Internal implementation functions
1171
*********************/
1175
icmp_load(netsnmp_cache *cache, void *vmagic)
1181
int magic = (int) vmagic;
1183
if ((fd = open_mib("/dev/ip", O_RDONLY, 0, NM_ASYNC_OFF)) < 0) {
1184
DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP object %d (hpux11)\n", magic));
1185
return (-1); /* error */
1190
p.objid = ID_icmpInMsgs;
1193
p.objid = ID_icmpInErrors;
1195
case ICMPINDESTUNREACHS:
1196
p.objid = ID_icmpInDestUnreachs;
1198
case ICMPINTIMEEXCDS:
1199
p.objid = ID_icmpInTimeExcds;
1201
case ICMPINPARMPROBS:
1202
p.objid = ID_icmpInParmProbs;
1204
case ICMPINSRCQUENCHS:
1205
p.objid = ID_icmpInSrcQuenchs;
1207
case ICMPINREDIRECTS:
1208
p.objid = ID_icmpInRedirects;
1211
p.objid = ID_icmpInEchos;
1213
case ICMPINECHOREPS:
1214
p.objid = ID_icmpInEchoReps;
1216
case ICMPINTIMESTAMPS:
1217
p.objid = ID_icmpInTimestamps;
1219
case ICMPINTIMESTAMPREPS:
1220
p.objid = ID_icmpInTimestampReps;
1222
case ICMPINADDRMASKS:
1223
p.objid = ID_icmpInAddrMasks;
1225
case ICMPINADDRMASKREPS:
1226
p.objid = ID_icmpInAddrMaskReps;
1229
p.objid = ID_icmpOutMsgs;
1232
p.objid = ID_icmpOutErrors;
1234
case ICMPOUTDESTUNREACHS:
1235
p.objid = ID_icmpOutDestUnreachs;
1237
case ICMPOUTTIMEEXCDS:
1238
p.objid = ID_icmpOutTimeExcds;
1240
case ICMPOUTPARMPROBS:
1241
p.objid = ID_icmpOutParmProbs;
1243
case ICMPOUTSRCQUENCHS:
1244
p.objid = ID_icmpOutSrcQuenchs;
1246
case ICMPOUTREDIRECTS:
1247
p.objid = ID_icmpOutRedirects;
1250
p.objid = ID_icmpOutEchos;
1252
case ICMPOUTECHOREPS:
1253
p.objid = ID_icmpOutEchoReps;
1255
case ICMPOUTTIMESTAMPS:
1256
p.objid = ID_icmpOutTimestamps;
1258
case ICMPOUTTIMESTAMPREPS:
1259
p.objid = ID_icmpOutTimestampReps;
1261
case ICMPOUTADDRMASKS:
1262
p.objid = ID_icmpOutAddrMasks;
1264
case ICMPOUTADDRMASKREPS:
1265
p.objid = ID_icmpOutAddrMaskReps;
1273
p.buffer = (void *)&icmpstat;
1274
ulen = sizeof(ICMP_STAT_STRUCTURE);
1276
ret = get_mib_info(fd, &p);
1279
DEBUGMSGTL(("mibII/icmp", "%s ICMP object %d (hpux11)\n",
1280
(ret < 0 ? "Failed to load" : "Loaded"), magic));
1281
return (ret); /* 0: ok, < 0: error */
1283
#elif defined(linux)
1285
icmp_load(netsnmp_cache *cache, void *vmagic)
1287
long ret_value = -1;
1289
ret_value = linux_read_icmp_stat(&icmpstat);
1291
if ( ret_value < 0 ) {
1292
DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (linux)\n"));
1294
DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (linux)\n"));
1296
icmp_stats_load(cache, vmagic);
1297
icmp_msg_stats_load(cache, vmagic);
1300
#elif defined(solaris2)
1302
icmp_load(netsnmp_cache *cache, void *vmagic)
1304
long ret_value = -1;
1307
getMibstat(MIB_ICMP, &icmpstat, sizeof(mib2_icmp_t), GET_FIRST,
1308
&Get_everything, NULL);
1310
if ( ret_value < 0 ) {
1311
DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (solaris)\n"));
1313
DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (solaris)\n"));
1317
#elif defined(NETBSD_STATS_VIA_SYSCTL)
1319
icmp_load(netsnmp_cache *cache, void *vmagic)
1321
long ret_value =- -1;
1323
ret_value = netbsd_read_icmp_stat(&icmpstat);
1325
if ( ret_value < 0 ) {
1326
DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (netbsd)\n"));
1328
DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (netbsd)\n"));
1332
#elif defined (WIN32) || defined (cygwin)
1334
icmp_load(netsnmp_cache *cache, void *vmagic)
1336
long ret_value = -1;
1338
ret_value = GetIcmpStatistics(&icmpstat);
1340
if ( ret_value < 0 ) {
1341
DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (win32)\n"));
1343
DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (win32)\n"));
1347
#elif defined(_USE_PERFSTAT_PROTOCOL)
1349
icmp_load(netsnmp_cache *cache, void *vmagic)
1351
long ret_value = -1;
1353
strcpy(ps_name.name, "icmp");
1354
ret_value = perfstat_protocol(&ps_name, &ps_proto, sizeof(ps_proto), 1);
1356
if ( ret_value < 0 ) {
1357
DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (AIX)\n"));
1360
DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (AIX)\n"));
1364
#elif defined(NETSNMP_CAN_USE_SYSCTL) && defined(ICMPCTL_STATS)
1366
icmp_load(netsnmp_cache *cache, void *vmagic)
1368
long ret_value = -1;
1369
static int sname[4] =
1370
{ CTL_NET, PF_INET, IPPROTO_ICMP, ICMPCTL_STATS };
1371
size_t len = sizeof(icmpstat);
1373
ret_value = sysctl(sname, 4, &icmpstat, &len, 0, 0);
1375
if ( ret_value < 0 ) {
1376
DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (sysctl)\n"));
1378
DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (sysctl)\n"));
1382
#elif defined(HAVE_SYS_TCPIPSTATS_H)
1384
icmp_load(netsnmp_cache *cache, void *vmagic)
1386
long ret_value = -1;
1389
sysmp(MP_SAGET, MPSA_TCPIPSTATS, &icmpstat, sizeof icmpstat);
1391
if ( ret_value < 0 ) {
1392
DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (tcpipstats)\n"));
1394
DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (tcpipstats)\n"));
1398
#elif defined(ICMPSTAT_SYMBOL)
1400
icmp_load(netsnmp_cache *cache, void *vmagic)
1402
long ret_value = -1;
1404
if (auto_nlist(ICMPSTAT_SYMBOL, (char *)&icmpstat, sizeof(icmpstat)))
1407
if ( ret_value < 0 ) {
1408
DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (icmpstat)\n"));
1410
DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (icmpstat)\n"));
1414
#else /* ICMPSTAT_SYMBOL */
1416
icmp_load(netsnmp_cache *cache, void *vmagic)
1418
long ret_value = -1;
1420
DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (null)\n"));
1426
icmp_free(netsnmp_cache *cache, void *magic)
1428
#if defined(_USE_PERFSTAT_PROTOCOL)
1429
memset(&ps_proto, 0, sizeof(ps_proto));
1431
memset(&icmpstat, 0, sizeof(icmpstat));