~ubuntu-branches/ubuntu/gutsy/net-snmp/gutsy-security

« back to all changes in this revision

Viewing changes to agent/mibgroup/mibII/icmp.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2004-09-13 12:06:21 UTC
  • Revision ID: james.westby@ubuntu.com-20040913120621-g952ntonlleihcvm
Tags: upstream-5.1.1
ImportĀ upstreamĀ versionĀ 5.1.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  ICMP MIB group implementation - icmp.c
 
3
 *
 
4
 */
 
5
 
 
6
#include <net-snmp/net-snmp-config.h>
 
7
#include "mibII_common.h"
 
8
 
 
9
#if HAVE_NETINET_IP_ICMP_H
 
10
#include <netinet/ip_icmp.h>
 
11
#endif
 
12
#if HAVE_NETINET_ICMP_VAR_H
 
13
#include <netinet/icmp_var.h>
 
14
#endif
 
15
 
 
16
#include <net-snmp/net-snmp-includes.h>
 
17
#include <net-snmp/agent/net-snmp-agent-includes.h>
 
18
#include <net-snmp/agent/auto_nlist.h>
 
19
 
 
20
#include <net-snmp/agent/cache_handler.h>
 
21
#include <net-snmp/agent/scalar_group.h>
 
22
 
 
23
#include "util_funcs.h"
 
24
#include "icmp.h"
 
25
#include "sysORTable.h"
 
26
 
 
27
#ifndef MIB_STATS_CACHE_TIMEOUT
 
28
#define MIB_STATS_CACHE_TIMEOUT 5
 
29
#endif
 
30
#ifndef ICMP_STATS_CACHE_TIMEOUT
 
31
#define ICMP_STATS_CACHE_TIMEOUT        MIB_STATS_CACHE_TIMEOUT
 
32
#endif
 
33
 
 
34
        /*********************
 
35
         *
 
36
         *  Kernel & interface information,
 
37
         *   and internal forward declarations
 
38
         *
 
39
         *********************/
 
40
 
 
41
        /*********************
 
42
         *
 
43
         *  Initialisation & common implementation functions
 
44
         *
 
45
         *********************/
 
46
 
 
47
 
 
48
 
 
49
/*
 
50
 * Define the OID pointer to the top of the mib tree that we're
 
51
 * registering underneath 
 
52
 */
 
53
oid             icmp_oid[] = { SNMP_OID_MIB2, 5 };
 
54
#ifdef USING_MIBII_IP_MODULE
 
55
extern oid      ip_module_oid[];
 
56
extern int      ip_module_oid_len;
 
57
extern int      ip_module_count;
 
58
#endif
 
59
 
 
60
void
 
61
init_icmp(void)
 
62
{
 
63
    netsnmp_handler_registration *reginfo;
 
64
 
 
65
    /*
 
66
     * register ourselves with the agent as a group of scalars...
 
67
     */
 
68
    DEBUGMSGTL(("mibII/icmp", "Initialising ICMP group\n"));
 
69
    reginfo = netsnmp_create_handler_registration("icmp", icmp_handler,
 
70
                    icmp_oid, OID_LENGTH(icmp_oid), HANDLER_CAN_RONLY);
 
71
    netsnmp_register_scalar_group(reginfo, ICMPINMSGS, ICMPOUTADDRMASKREPS);
 
72
    /*
 
73
     * .... with a local cache
 
74
     *    (except for HP-UX 11, which extracts objects individually)
 
75
     */
 
76
#ifndef hpux11
 
77
    netsnmp_inject_handler( reginfo,
 
78
                    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
 
79
                                        icmp_load, icmp_free,
 
80
                                        icmp_oid, OID_LENGTH(icmp_oid)));
 
81
#endif
 
82
 
 
83
#ifdef USING_MIBII_IP_MODULE
 
84
    if (++ip_module_count == 2)
 
85
        REGISTER_SYSOR_TABLE(ip_module_oid, ip_module_oid_len,
 
86
                             "The MIB module for managing IP and ICMP implementations");
 
87
#endif
 
88
 
 
89
#ifdef ICMPSTAT_SYMBOL
 
90
    auto_nlist(ICMPSTAT_SYMBOL, 0, 0);
 
91
#endif
 
92
#ifdef solaris2
 
93
    init_kernel_sunos5();
 
94
#endif
 
95
}
 
96
 
 
97
 
 
98
        /*********************
 
99
         *
 
100
         *  System specific data formats
 
101
         *
 
102
         *********************/
 
103
 
 
104
#ifdef hpux11
 
105
#define ICMP_STAT_STRUCTURE     int
 
106
#endif
 
107
 
 
108
#ifdef linux
 
109
#define ICMP_STAT_STRUCTURE     struct icmp_mib
 
110
#define USES_SNMP_DESIGNED_ICMPSTAT
 
111
#undef ICMPSTAT_SYMBOL
 
112
#endif
 
113
 
 
114
#ifdef solaris2
 
115
#define ICMP_STAT_STRUCTURE     mib2_icmp_t
 
116
#define USES_SNMP_DESIGNED_ICMPSTAT
 
117
#endif
 
118
 
 
119
#ifdef WIN32
 
120
#include <iphlpapi.h>
 
121
#define ICMP_STAT_STRUCTURE MIB_ICMP
 
122
#endif
 
123
 
 
124
/* ?? #if (defined(CAN_USE_SYSCTL) && defined(ICMPCTL_STATS)) ?? */
 
125
 
 
126
#ifdef HAVE_SYS_ICMPIPSTATS_H
 
127
/* or #ifdef            HAVE_SYS_TCPIPSTATS_H  ??? */
 
128
#define ICMP_STAT_STRUCTURE     struct kna
 
129
#define USES_TRADITIONAL_ICMPSTAT
 
130
#endif
 
131
 
 
132
#if !defined(ICMP_STAT_STRUCTURE)
 
133
#define ICMP_STAT_STRUCTURE     struct icmpstat
 
134
#define USES_TRADITIONAL_ICMPSTAT
 
135
#endif
 
136
 
 
137
 
 
138
ICMP_STAT_STRUCTURE icmpstat;
 
139
 
 
140
 
 
141
        /*********************
 
142
         *
 
143
         *  System independent handler
 
144
         *       (mostly!)
 
145
         *
 
146
         *********************/
 
147
 
 
148
int
 
149
icmp_handler(netsnmp_mib_handler          *handler,
 
150
             netsnmp_handler_registration *reginfo,
 
151
             netsnmp_agent_request_info   *reqinfo,
 
152
             netsnmp_request_info         *requests)
 
153
{
 
154
    netsnmp_request_info  *request;
 
155
    netsnmp_variable_list *requestvb;
 
156
    long     ret_value;
 
157
    oid      subid;
 
158
#ifdef USES_TRADITIONAL_ICMPSTAT
 
159
    int      i;
 
160
#endif
 
161
 
 
162
    /*
 
163
     * The cached data should already have been loaded by the
 
164
     *    cache handler, higher up the handler chain.
 
165
     * But just to be safe, check this and load it manually if necessary
 
166
     */
 
167
#ifndef hpux11
 
168
    if (netsnmp_is_cache_valid(reqinfo)) {
 
169
        icmp_load( NULL, NULL );        /* XXX - check for failure */
 
170
    }
 
171
#endif
 
172
 
 
173
 
 
174
    /*
 
175
     * 
 
176
     *
 
177
     */
 
178
    DEBUGMSGTL(("mibII/icmp", "Handler - mode %s\n",
 
179
                    se_find_label_in_slist("agent_mode", reqinfo->mode)));
 
180
    switch (reqinfo->mode) {
 
181
    case MODE_GET:
 
182
        for (request=requests; request; request=request->next) {
 
183
            requestvb = request->requestvb;
 
184
            subid = requestvb->name[OID_LENGTH(icmp_oid)];  /* XXX */
 
185
            DEBUGMSGTL(( "mibII/icmp", "oid: "));
 
186
            DEBUGMSGOID(("mibII/icmp", requestvb->name,
 
187
                                       requestvb->name_length));
 
188
            DEBUGMSG((   "mibII/icmp", "\n"));
 
189
 
 
190
            switch (subid) {
 
191
#ifdef USES_SNMP_DESIGNED_ICMPSTAT
 
192
    case ICMPINMSGS:
 
193
        ret_value = icmpstat.icmpInMsgs;
 
194
        break;
 
195
    case ICMPINERRORS:
 
196
        ret_value = icmpstat.icmpInErrors;
 
197
        break;
 
198
    case ICMPINDESTUNREACHS:
 
199
        ret_value = icmpstat.icmpInDestUnreachs;
 
200
        break;
 
201
    case ICMPINTIMEEXCDS:
 
202
        ret_value = icmpstat.icmpInTimeExcds;
 
203
        break;
 
204
    case ICMPINPARMPROBS:
 
205
        ret_value = icmpstat.icmpInParmProbs;
 
206
        break;
 
207
    case ICMPINSRCQUENCHS:
 
208
        ret_value = icmpstat.icmpInSrcQuenchs;
 
209
        break;
 
210
    case ICMPINREDIRECTS:
 
211
        ret_value = icmpstat.icmpInRedirects;
 
212
        break;
 
213
    case ICMPINECHOS:
 
214
        ret_value = icmpstat.icmpInEchos;
 
215
        break;
 
216
    case ICMPINECHOREPS:
 
217
        ret_value = icmpstat.icmpInEchoReps;
 
218
        break;
 
219
    case ICMPINTIMESTAMPS:
 
220
        ret_value = icmpstat.icmpInTimestamps;
 
221
        break;
 
222
    case ICMPINTIMESTAMPREPS:
 
223
        ret_value = icmpstat.icmpInTimestampReps;
 
224
        break;
 
225
    case ICMPINADDRMASKS:
 
226
        ret_value = icmpstat.icmpInAddrMasks;
 
227
        break;
 
228
    case ICMPINADDRMASKREPS:
 
229
        ret_value = icmpstat.icmpInAddrMaskReps;
 
230
        break;
 
231
    case ICMPOUTMSGS:
 
232
        ret_value = icmpstat.icmpOutMsgs;
 
233
        break;
 
234
    case ICMPOUTERRORS:
 
235
        ret_value = icmpstat.icmpOutErrors;
 
236
        break;
 
237
    case ICMPOUTDESTUNREACHS:
 
238
        ret_value = icmpstat.icmpOutDestUnreachs;
 
239
        break;
 
240
    case ICMPOUTTIMEEXCDS:
 
241
        ret_value = icmpstat.icmpOutTimeExcds;
 
242
        break;
 
243
    case ICMPOUTPARMPROBS:
 
244
        ret_value = icmpstat.icmpOutParmProbs;
 
245
        break;
 
246
    case ICMPOUTSRCQUENCHS:
 
247
        ret_value = icmpstat.icmpOutSrcQuenchs;
 
248
        break;
 
249
    case ICMPOUTREDIRECTS:
 
250
        ret_value = icmpstat.icmpOutRedirects;
 
251
        break;
 
252
    case ICMPOUTECHOS:
 
253
        ret_value = icmpstat.icmpOutEchos;
 
254
        break;
 
255
    case ICMPOUTECHOREPS:
 
256
        ret_value = icmpstat.icmpOutEchoReps;
 
257
        break;
 
258
    case ICMPOUTTIMESTAMPS:
 
259
        ret_value = icmpstat.icmpOutTimestamps;
 
260
        break;
 
261
    case ICMPOUTTIMESTAMPREPS:
 
262
        ret_value = icmpstat.icmpOutTimestampReps;
 
263
        break;
 
264
    case ICMPOUTADDRMASKS:
 
265
        ret_value = icmpstat.icmpOutAddrMasks;
 
266
        break;
 
267
    case ICMPOUTADDRMASKREPS:
 
268
        ret_value = icmpstat.icmpOutAddrMaskReps;
 
269
        break;
 
270
#else                          /* USES_SNMP_DESIGNED_ICMPSTAT */
 
271
 
 
272
#ifdef USES_TRADITIONAL_ICMPSTAT
 
273
    case ICMPINMSGS:
 
274
        ret_value = icmpstat.icps_badcode +
 
275
            icmpstat.icps_tooshort +
 
276
            icmpstat.icps_checksum + icmpstat.icps_badlen;
 
277
        for (i = 0; i <= ICMP_MAXTYPE; i++)
 
278
            ret_value += icmpstat.icps_inhist[i];
 
279
        break;
 
280
    case ICMPINERRORS:
 
281
        ret_value = icmpstat.icps_badcode +
 
282
            icmpstat.icps_tooshort +
 
283
            icmpstat.icps_checksum + icmpstat.icps_badlen;
 
284
        break;
 
285
    case ICMPINDESTUNREACHS:
 
286
        ret_value = icmpstat.icps_inhist[ICMP_UNREACH];
 
287
        break;
 
288
    case ICMPINTIMEEXCDS:
 
289
        ret_value = icmpstat.icps_inhist[ICMP_TIMXCEED];
 
290
        break;
 
291
    case ICMPINPARMPROBS:
 
292
        ret_value = icmpstat.icps_inhist[ICMP_PARAMPROB];
 
293
        break;
 
294
    case ICMPINSRCQUENCHS:
 
295
        ret_value = icmpstat.icps_inhist[ICMP_SOURCEQUENCH];
 
296
        break;
 
297
    case ICMPINREDIRECTS:
 
298
        ret_value = icmpstat.icps_inhist[ICMP_REDIRECT];
 
299
        break;
 
300
    case ICMPINECHOS:
 
301
        ret_value = icmpstat.icps_inhist[ICMP_ECHO];
 
302
        break;
 
303
    case ICMPINECHOREPS:
 
304
        ret_value = icmpstat.icps_inhist[ICMP_ECHOREPLY];
 
305
        break;
 
306
    case ICMPINTIMESTAMPS:
 
307
        ret_value = icmpstat.icps_inhist[ICMP_TSTAMP];
 
308
        break;
 
309
    case ICMPINTIMESTAMPREPS:
 
310
        ret_value = icmpstat.icps_inhist[ICMP_TSTAMPREPLY];
 
311
        break;
 
312
    case ICMPINADDRMASKS:
 
313
        ret_value = icmpstat.icps_inhist[ICMP_MASKREQ];
 
314
        break;
 
315
    case ICMPINADDRMASKREPS:
 
316
        ret_value = icmpstat.icps_inhist[ICMP_MASKREPLY];
 
317
        break;
 
318
    case ICMPOUTMSGS:
 
319
        ret_value = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
 
320
        for (i = 0; i <= ICMP_MAXTYPE; i++)
 
321
            ret_value += icmpstat.icps_outhist[i];
 
322
        break;
 
323
    case ICMPOUTERRORS:
 
324
        ret_value = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
 
325
        break;
 
326
    case ICMPOUTDESTUNREACHS:
 
327
        ret_value = icmpstat.icps_outhist[ICMP_UNREACH];
 
328
        break;
 
329
    case ICMPOUTTIMEEXCDS:
 
330
        ret_value = icmpstat.icps_outhist[ICMP_TIMXCEED];
 
331
        break;
 
332
    case ICMPOUTPARMPROBS:
 
333
        ret_value = icmpstat.icps_outhist[ICMP_PARAMPROB];
 
334
        break;
 
335
    case ICMPOUTSRCQUENCHS:
 
336
        ret_value = icmpstat.icps_outhist[ICMP_SOURCEQUENCH];
 
337
        break;
 
338
    case ICMPOUTREDIRECTS:
 
339
        ret_value = icmpstat.icps_outhist[ICMP_REDIRECT];
 
340
        break;
 
341
    case ICMPOUTECHOS:
 
342
        ret_value = icmpstat.icps_outhist[ICMP_ECHO];
 
343
        break;
 
344
    case ICMPOUTECHOREPS:
 
345
        ret_value = icmpstat.icps_outhist[ICMP_ECHOREPLY];
 
346
        break;
 
347
    case ICMPOUTTIMESTAMPS:
 
348
        ret_value = icmpstat.icps_outhist[ICMP_TSTAMP];
 
349
        break;
 
350
    case ICMPOUTTIMESTAMPREPS:
 
351
        ret_value = icmpstat.icps_outhist[ICMP_TSTAMPREPLY];
 
352
        break;
 
353
    case ICMPOUTADDRMASKS:
 
354
        ret_value = icmpstat.icps_outhist[ICMP_MASKREQ];
 
355
        break;
 
356
    case ICMPOUTADDRMASKREPS:
 
357
        ret_value = icmpstat.icps_outhist[ICMP_MASKREPLY];
 
358
        break;
 
359
#else                          /* USES_TRADITIONAL_ICMPSTAT */
 
360
 
 
361
#ifdef hpux11
 
362
    case ICMPINMSGS:
 
363
    case ICMPINERRORS:
 
364
    case ICMPINDESTUNREACHS:
 
365
    case ICMPINTIMEEXCDS:
 
366
    case ICMPINPARMPROBS:
 
367
    case ICMPINSRCQUENCHS:
 
368
    case ICMPINREDIRECTS:
 
369
    case ICMPINECHOS:
 
370
    case ICMPINECHOREPS:
 
371
    case ICMPINTIMESTAMPS:
 
372
    case ICMPINTIMESTAMPREPS:
 
373
    case ICMPINADDRMASKS:
 
374
    case ICMPINADDRMASKREPS:
 
375
    case ICMPOUTMSGS:
 
376
    case ICMPOUTERRORS:
 
377
    case ICMPOUTDESTUNREACHS:
 
378
    case ICMPOUTTIMEEXCDS:
 
379
    case ICMPOUTPARMPROBS:
 
380
    case ICMPOUTSRCQUENCHS:
 
381
    case ICMPOUTREDIRECTS:
 
382
    case ICMPOUTECHOS:
 
383
    case ICMPOUTECHOREPS:
 
384
    case ICMPOUTTIMESTAMPS:
 
385
    case ICMPOUTTIMESTAMPREPS:
 
386
    case ICMPOUTADDRMASKS:
 
387
    case ICMPOUTADDRMASKREPS:
 
388
        /*
 
389
         * This is a bit of a hack, to shoehorn the HP-UX 11
 
390
         * single-object retrieval approach into the caching
 
391
         * architecture.
 
392
         */
 
393
        if (icmp_load(NULL, (void*)subid) == -1 ) {
 
394
            netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);
 
395
            continue;
 
396
        }
 
397
        ret_value = icmpstat;
 
398
        break;
 
399
#else                          /* hpux11 */
 
400
 
 
401
#ifdef WIN32
 
402
    case ICMPINMSGS:
 
403
        ret_value = icmpstat.stats.icmpInStats.dwMsgs;
 
404
        break;
 
405
    case ICMPINERRORS:
 
406
        ret_value = icmpstat.stats.icmpInStats.dwErrors;
 
407
        break;
 
408
    case ICMPINDESTUNREACHS:
 
409
        ret_value = icmpstat.stats.icmpInStats.dwDestUnreachs;
 
410
        break;
 
411
    case ICMPINTIMEEXCDS:
 
412
        ret_value = icmpstat.stats.icmpInStats.dwTimeExcds;
 
413
        break;
 
414
    case ICMPINPARMPROBS:
 
415
        ret_value = icmpstat.stats.icmpInStats.dwParmProbs;
 
416
        break;
 
417
    case ICMPINSRCQUENCHS:
 
418
        ret_value = icmpstat.stats.icmpInStats.dwSrcQuenchs;
 
419
        break;
 
420
    case ICMPINREDIRECTS:
 
421
        ret_value = icmpstat.stats.icmpInStats.dwRedirects;
 
422
        break;
 
423
    case ICMPINECHOS:
 
424
        ret_value = icmpstat.stats.icmpInStats.dwEchos;
 
425
        break;
 
426
    case ICMPINECHOREPS:
 
427
        ret_value = icmpstat.stats.icmpInStats.dwEchoReps;
 
428
        break;
 
429
    case ICMPINTIMESTAMPS:
 
430
        ret_value = icmpstat.stats.icmpInStats.dwTimestamps;
 
431
        break;
 
432
    case ICMPINTIMESTAMPREPS:
 
433
        ret_value = icmpstat.stats.icmpInStats.dwTimestampReps;
 
434
        break;
 
435
    case ICMPINADDRMASKS:
 
436
        ret_value = icmpstat.stats.icmpInStats.dwAddrMasks;
 
437
        break;
 
438
    case ICMPINADDRMASKREPS:
 
439
        ret_value = icmpstat.stats.icmpInStats.dwAddrMaskReps;
 
440
        break;
 
441
    case ICMPOUTMSGS:
 
442
        ret_value = icmpstat.stats.icmpOutStats.dwMsgs;
 
443
        break;
 
444
    case ICMPOUTERRORS:
 
445
        ret_value = icmpstat.stats.icmpOutStats.dwErrors;
 
446
        break;
 
447
    case ICMPOUTDESTUNREACHS:
 
448
        ret_value = icmpstat.stats.icmpOutStats.dwDestUnreachs;
 
449
        break;
 
450
    case ICMPOUTTIMEEXCDS:
 
451
        ret_value = icmpstat.stats.icmpOutStats.dwTimeExcds;
 
452
        break;
 
453
    case ICMPOUTPARMPROBS:
 
454
        ret_value = icmpstat.stats.icmpOutStats.dwParmProbs;
 
455
        break;
 
456
    case ICMPOUTSRCQUENCHS:
 
457
        ret_value = icmpstat.stats.icmpOutStats.dwSrcQuenchs;
 
458
        break;
 
459
    case ICMPOUTREDIRECTS:
 
460
        ret_value = icmpstat.stats.icmpOutStats.dwRedirects;
 
461
        break;
 
462
    case ICMPOUTECHOS:
 
463
        ret_value = icmpstat.stats.icmpOutStats.dwEchos;
 
464
        break;
 
465
    case ICMPOUTECHOREPS:
 
466
        ret_value = icmpstat.stats.icmpOutStats.dwEchoReps;
 
467
        break;
 
468
    case ICMPOUTTIMESTAMPS:
 
469
        ret_value = icmpstat.stats.icmpOutStats.dwTimestamps;
 
470
        break;
 
471
    case ICMPOUTTIMESTAMPREPS:
 
472
        ret_value = icmpstat.stats.icmpOutStats.dwTimestampReps;
 
473
        break;
 
474
    case ICMPOUTADDRMASKS:
 
475
        ret_value = icmpstat.stats.icmpOutStats.dwAddrMasks;
 
476
        break;
 
477
    case ICMPOUTADDRMASKREPS:
 
478
        ret_value = icmpstat.stats.icmpOutStats.dwAddrMaskReps;
 
479
        break;
 
480
#endif                          /* WIN32 */
 
481
#endif                          /* hpux11 */
 
482
#endif                          /* USES_TRADITIONAL_ICMPSTAT */
 
483
#endif                          /* USES_SNMP_DESIGNED_ICMPSTAT */
 
484
            }
 
485
            snmp_set_var_typed_value(request->requestvb, ASN_COUNTER,
 
486
                                     (u_char *)&ret_value, sizeof(ret_value));
 
487
        }
 
488
        break;
 
489
 
 
490
    case MODE_GETNEXT:
 
491
    case MODE_GETBULK:
 
492
    case MODE_SET_RESERVE1:
 
493
    case MODE_SET_RESERVE2:
 
494
    case MODE_SET_ACTION:
 
495
    case MODE_SET_COMMIT:
 
496
    case MODE_SET_FREE:
 
497
    case MODE_SET_UNDO:
 
498
        snmp_log(LOG_WARNING, "mibII/icmp: Unsupported mode (%d)\n",
 
499
                               reqinfo->mode);
 
500
        break;
 
501
    default:
 
502
        snmp_log(LOG_WARNING, "mibII/icmp: Unrecognised mode (%d)\n",
 
503
                               reqinfo->mode);
 
504
        break;
 
505
    }
 
506
 
 
507
    return SNMP_ERR_NOERROR;
 
508
}
 
509
 
 
510
 
 
511
        /*********************
 
512
         *
 
513
         *  Internal implementation functions
 
514
         *
 
515
         *********************/
 
516
 
 
517
#ifdef hpux11
 
518
int
 
519
icmp_load(netsnmp_cache *cache, void *vmagic)
 
520
{
 
521
    int             fd;
 
522
    struct nmparms  p;
 
523
    unsigned int    ulen;
 
524
    int             ret;
 
525
    int             magic = (int) vmagic;
 
526
 
 
527
    if ((fd = open_mib("/dev/ip", O_RDONLY, 0, NM_ASYNC_OFF)) < 0) {
 
528
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP object %d (hpux11)\n", magic));
 
529
        return (-1);            /* error */
 
530
    }
 
531
 
 
532
    switch (magic) {
 
533
    case ICMPINMSGS:
 
534
        p.objid = ID_icmpInMsgs;
 
535
        break;
 
536
    case ICMPINERRORS:
 
537
        p.objid = ID_icmpInErrors;
 
538
        break;
 
539
    case ICMPINDESTUNREACHS:
 
540
        p.objid = ID_icmpInDestUnreachs;
 
541
        break;
 
542
    case ICMPINTIMEEXCDS:
 
543
        p.objid = ID_icmpInTimeExcds;
 
544
        break;
 
545
    case ICMPINPARMPROBS:
 
546
        p.objid = ID_icmpInParmProbs;
 
547
        break;
 
548
    case ICMPINSRCQUENCHS:
 
549
        p.objid = ID_icmpInSrcQuenchs;
 
550
        break;
 
551
    case ICMPINREDIRECTS:
 
552
        p.objid = ID_icmpInRedirects;
 
553
        break;
 
554
    case ICMPINECHOS:
 
555
        p.objid = ID_icmpInEchos;
 
556
        break;
 
557
    case ICMPINECHOREPS:
 
558
        p.objid = ID_icmpInEchoReps;
 
559
        break;
 
560
    case ICMPINTIMESTAMPS:
 
561
        p.objid = ID_icmpInTimestamps;
 
562
        break;
 
563
    case ICMPINTIMESTAMPREPS:
 
564
        p.objid = ID_icmpInTimestampReps;
 
565
        break;
 
566
    case ICMPINADDRMASKS:
 
567
        p.objid = ID_icmpInAddrMasks;
 
568
        break;
 
569
    case ICMPINADDRMASKREPS:
 
570
        p.objid = ID_icmpInAddrMaskReps;
 
571
        break;
 
572
    case ICMPOUTMSGS:
 
573
        p.objid = ID_icmpOutMsgs;
 
574
        break;
 
575
    case ICMPOUTERRORS:
 
576
        p.objid = ID_icmpOutErrors;
 
577
        break;
 
578
    case ICMPOUTDESTUNREACHS:
 
579
        p.objid = ID_icmpOutDestUnreachs;
 
580
        break;
 
581
    case ICMPOUTTIMEEXCDS:
 
582
        p.objid = ID_icmpOutTimeExcds;
 
583
        break;
 
584
    case ICMPOUTPARMPROBS:
 
585
        p.objid = ID_icmpOutParmProbs;
 
586
        break;
 
587
    case ICMPOUTSRCQUENCHS:
 
588
        p.objid = ID_icmpOutSrcQuenchs;
 
589
        break;
 
590
    case ICMPOUTREDIRECTS:
 
591
        p.objid = ID_icmpOutRedirects;
 
592
        break;
 
593
    case ICMPOUTECHOS:
 
594
        p.objid = ID_icmpOutEchos;
 
595
        break;
 
596
    case ICMPOUTECHOREPS:
 
597
        p.objid = ID_icmpOutEchoReps;
 
598
        break;
 
599
    case ICMPOUTTIMESTAMPS:
 
600
        p.objid = ID_icmpOutTimestamps;
 
601
        break;
 
602
    case ICMPOUTTIMESTAMPREPS:
 
603
        p.objid = ID_icmpOutTimestampReps;
 
604
        break;
 
605
    case ICMPOUTADDRMASKS:
 
606
        p.objid = ID_icmpOutAddrMasks;
 
607
        break;
 
608
    case ICMPOUTADDRMASKREPS:
 
609
        p.objid = ID_icmpOutAddrMaskReps;
 
610
        break;
 
611
    default:
 
612
        icmpstat = 0;
 
613
        close_mib(fd);
 
614
        return (0);
 
615
    }
 
616
 
 
617
    p.buffer = (void *)&icmpstat;
 
618
    ulen = sizeof(ICMP_STAT_STRUCTURE);
 
619
    p.len = &ulen;
 
620
    ret = get_mib_info(fd, &p);
 
621
    close_mib(fd);
 
622
 
 
623
    DEBUGMSGTL(("mibII/icmp", "%s ICMP object %d (hpux11)\n",
 
624
               (ret < 0 ? "Failed to load" : "Loaded"),  magic));
 
625
    return (ret);               /* 0: ok, < 0: error */
 
626
}
 
627
#else                           /* hpux11 */
 
628
#ifdef linux
 
629
int
 
630
icmp_load(netsnmp_cache *cache, void *vmagic)
 
631
{
 
632
    long            ret_value = -1;
 
633
 
 
634
    ret_value = linux_read_icmp_stat(&icmpstat);
 
635
 
 
636
    if ( ret_value < 0 ) {
 
637
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (linux)\n"));
 
638
    } else {
 
639
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (linux)\n"));
 
640
    }
 
641
    return ret_value;
 
642
}
 
643
#else           /* linux */
 
644
#ifdef solaris2
 
645
int
 
646
icmp_load(netsnmp_cache *cache, void *vmagic)
 
647
{
 
648
    long            ret_value = -1;
 
649
 
 
650
    ret_value =
 
651
        getMibstat(MIB_ICMP, &icmpstat, sizeof(mib2_icmp_t), GET_FIRST,
 
652
                   &Get_everything, NULL);
 
653
 
 
654
    if ( ret_value < 0 ) {
 
655
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (solaris)\n"));
 
656
    } else {
 
657
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (solaris)\n"));
 
658
    }
 
659
    return ret_value;
 
660
}
 
661
#else           /* solaris2 */
 
662
#ifdef WIN32
 
663
int
 
664
icmp_load(netsnmp_cache *cache, void *vmagic)
 
665
{
 
666
    long            ret_value = -1;
 
667
 
 
668
    ret_value = GetIcmpStatistics(&icmpstat);
 
669
 
 
670
    if ( ret_value < 0 ) {
 
671
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (win32)\n"));
 
672
    } else {
 
673
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (win32)\n"));
 
674
    }
 
675
    return ret_value;
 
676
}
 
677
#else           /* WIN32 */
 
678
#if (defined(CAN_USE_SYSCTL) && defined(ICMPCTL_STATS))
 
679
int
 
680
icmp_load(netsnmp_cache *cache, void *vmagic)
 
681
{
 
682
    long            ret_value = -1;
 
683
    static int      sname[4] =
 
684
        { CTL_NET, PF_INET, IPPROTO_ICMP, ICMPCTL_STATS };
 
685
    size_t          len = sizeof(icmpstat);
 
686
 
 
687
    ret_value = sysctl(sname, 4, &icmpstat, &len, 0, 0);
 
688
 
 
689
    if ( ret_value < 0 ) {
 
690
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (sysctl)\n"));
 
691
    } else {
 
692
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (sysctl)\n"));
 
693
    }
 
694
    return ret_value;
 
695
}
 
696
#else           /* CAN_USE_SYSCTL && ICMPCTL_STATS */
 
697
#ifdef HAVE_SYS_TCPIPSTATS_H
 
698
int
 
699
icmp_load(netsnmp_cache *cache, void *vmagic)
 
700
{
 
701
    long            ret_value = -1;
 
702
 
 
703
    ret_value =
 
704
        sysmp(MP_SAGET, MPSA_TCPIPSTATS, &icmpstat, sizeof icmpstat);
 
705
 
 
706
    if ( ret_value < 0 ) {
 
707
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (tcpipstats)\n"));
 
708
    } else {
 
709
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (tcpipstats)\n"));
 
710
    }
 
711
    return ret_value;
 
712
}
 
713
#else           /* HAVE_SYS_TCPIPSTATS_H */
 
714
#ifdef ICMPSTAT_SYMBOL
 
715
int
 
716
icmp_load(netsnmp_cache *cache, void *vmagic)
 
717
{
 
718
    long            ret_value = -1;
 
719
 
 
720
    if (auto_nlist(ICMPSTAT_SYMBOL, (char *)&icmpstat, sizeof(icmpstat)))
 
721
        ret_value = 0;
 
722
 
 
723
    if ( ret_value < 0 ) {
 
724
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (icmpstat)\n"));
 
725
    } else {
 
726
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (icmpstat)\n"));
 
727
    }
 
728
    return ret_value;
 
729
}
 
730
#else           /* ICMPSTAT_SYMBOL */
 
731
int
 
732
icmp_load(netsnmp_cache *cache, void *vmagic)
 
733
{
 
734
    long            ret_value = -1;
 
735
 
 
736
    DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (null)\n"));
 
737
    return ret_value;
 
738
}
 
739
#endif          /* ICMPSTAT_SYMBOL */
 
740
#endif          /* HAVE_SYS_TCPIPSTATS_H */
 
741
#endif          /* CAN_USE_SYSCTL && ICMPCTL_STATS */
 
742
#endif          /* WIN32 */
 
743
#endif          /* solaris2 */
 
744
#endif          /* linux */
 
745
#endif          /* hpux11 */
 
746
 
 
747
void
 
748
icmp_free(netsnmp_cache *cache, void *magic)
 
749
{
 
750
    memset(&icmpstat, 0, sizeof(icmpstat));
 
751
}