~ubuntu-branches/ubuntu/wily/net-snmp/wily-proposed

« back to all changes in this revision

Viewing changes to .pc/CVE-2014-2284.patch/agent/mibgroup/mibII/icmp.c

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2014-04-08 08:17:14 UTC
  • Revision ID: package-import@ubuntu.com-20140408081714-31du0g3p3ggkwe9o
Tags: 5.7.2~dfsg-8.1ubuntu3
* SECURITY UPDATE: denial of service via AgentX subagent timeout
  - debian/patches/CVE-2012-6151.patch: track cancelled sessions in
    agent/mibgroup/agentx/{master.c,master_admin.c}, agent/snmp_agent.c,
    include/net-snmp/agent/snmp_agent.h.
  - CVE-2012-6151
* SECURITY UPDATE: denial of service when ICMP-MIB is in use
  - debian/patches/CVE-2014-2284.patch: fix ICMP mib table handling in
    agent/mibgroup/mibII/icmp.c, agent/mibgroup/mibII/kernel_linux.*.
  - CVE-2014-2284
* SECURITY UPDATE: denial of service in perl trap handler
  - debian/patches/CVE-2014-2285.patch: handle empty community string in
    perl/TrapReceiver/TrapReceiver.xs.
  - CVE-2014-2285

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  ICMP MIB group implementation - icmp.c
 
3
 */
 
4
 
 
5
#include <net-snmp/net-snmp-config.h>
 
6
#include "mibII_common.h"
 
7
 
 
8
#if HAVE_NETINET_IP_ICMP_H
 
9
#include <netinet/ip_icmp.h>
 
10
#endif
 
11
 
 
12
#ifdef NETSNMP_ENABLE_IPV6
 
13
#if HAVE_NETINET_ICMP6_H
 
14
#include <netinet/icmp6.h>
 
15
#endif
 
16
#endif /* NETSNMP_ENABLE_IPV6 */
 
17
 
 
18
#if HAVE_NETINET_ICMP_VAR_H
 
19
#include <netinet/icmp_var.h>
 
20
#endif
 
21
 
 
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>
 
25
 
 
26
#include <net-snmp/agent/cache_handler.h>
 
27
#include <net-snmp/agent/scalar_group.h>
 
28
#include <net-snmp/agent/sysORTable.h>
 
29
 
 
30
#include "util_funcs/MIB_STATS_CACHE_TIMEOUT.h"
 
31
#include "icmp.h"
 
32
 
 
33
#ifndef MIB_STATS_CACHE_TIMEOUT
 
34
#define MIB_STATS_CACHE_TIMEOUT 5
 
35
#endif
 
36
#ifndef ICMP_STATS_CACHE_TIMEOUT
 
37
#define ICMP_STATS_CACHE_TIMEOUT        MIB_STATS_CACHE_TIMEOUT
 
38
#endif
 
39
 
 
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 */
 
46
 
 
47
 
 
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>
 
51
#endif
 
52
#include <libperfstat.h>
 
53
#ifdef FIRST_PROTOCOL
 
54
perfstat_protocol_t ps_proto;
 
55
perfstat_id_t ps_name;
 
56
#define _USE_PERFSTAT_PROTOCOL 1
 
57
#endif
 
58
#endif
 
59
 
 
60
        /*********************
 
61
         *
 
62
         *  Kernel & interface information,
 
63
         *   and internal forward declarations
 
64
         *
 
65
         *********************/
 
66
 
 
67
        /*********************
 
68
         *
 
69
         *  Initialisation & common implementation functions
 
70
         *
 
71
         *********************/
 
72
 
 
73
 
 
74
/*
 
75
 * Define the OID pointer to the top of the mib tree that we're
 
76
 * registering underneath 
 
77
 */
 
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;
 
85
#endif
 
86
 
 
87
#ifdef linux
 
88
struct icmp_stats_table_entry {
 
89
        uint32_t ipVer;
 
90
        uint32_t icmpStatsInMsgs;
 
91
        uint32_t icmpStatsInErrors;
 
92
        uint32_t icmpStatsOutMsgs;
 
93
        uint32_t icmpStatsOutErrors;
 
94
};
 
95
 
 
96
struct icmp_stats_table_entry icmp_stats_table[2];
 
97
 
 
98
#define ICMP_MSG_STATS_HAS_IN 1
 
99
#define ICMP_MSG_STATS_HAS_OUT 2
 
100
 
 
101
struct icmp_msg_stats_table_entry {
 
102
        uint32_t ipVer;
 
103
        uint32_t icmpMsgStatsType;
 
104
        uint32_t icmpMsgStatsInPkts;
 
105
        uint32_t icmpMsgStatsOutPkts;
 
106
        int flags;
 
107
};
 
108
 
 
109
#define ICMP_MSG_STATS_IPV4_COUNT 11
 
110
 
 
111
#ifdef NETSNMP_ENABLE_IPV6
 
112
#define ICMP_MSG_STATS_IPV6_COUNT 14
 
113
#else
 
114
#define ICMP_MSG_STATS_IPV6_COUNT 0
 
115
#endif /* NETSNMP_ENABLE_IPV6 */
 
116
 
 
117
struct icmp_msg_stats_table_entry icmp_msg_stats_table[ICMP_MSG_STATS_IPV4_COUNT + ICMP_MSG_STATS_IPV6_COUNT];
 
118
 
 
119
int
 
120
icmp_stats_load(netsnmp_cache *cache, void *vmagic)
 
121
{
 
122
 
 
123
        /*
 
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
 
129
         */
 
130
 
 
131
        int i;
 
132
        struct icmp_mib v4icmp;
 
133
        struct icmp6_mib v6icmp;
 
134
        for(i=0;i<2;i++) {
 
135
                switch(i) {
 
136
                        case 0:
 
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;
 
142
                                break;
 
143
                        default:
 
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;
 
153
                                break;
 
154
                }
 
155
                icmp_stats_table[i].ipVer=i+1;
 
156
        }
 
157
 
 
158
        return 0;
 
159
}
 
160
 
 
161
int
 
162
icmp_msg_stats_load(netsnmp_cache *cache, void *vmagic)
 
163
{
 
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;
 
169
#endif
 
170
    int i, j, k, flag, inc;
 
171
 
 
172
    memset(&icmp_msg_stats_table, 0, sizeof(icmp_msg_stats_table));
 
173
 
 
174
    i = 0;
 
175
    flag = 0;
 
176
    k = 0;
 
177
    inc = 0;
 
178
    linux_read_icmp_msg_stat(&v4icmp, &v4icmpmsg, &flag);
 
179
    if (flag) {
 
180
        while (254 != k) {
 
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 */
 
187
            }
 
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 */
 
194
            }
 
195
            if (inc) {
 
196
                i++;
 
197
                inc = 0;
 
198
            }
 
199
            k++;
 
200
        }
 
201
    } else {
 
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;
 
205
        i++;
 
206
 
 
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;
 
210
        i++;
 
211
 
 
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;
 
215
        i++;
 
216
 
 
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;
 
220
        i++;
 
221
 
 
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;
 
225
        i++;
 
226
 
 
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;
 
230
        i++;
 
231
 
 
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;
 
235
        i++;
 
236
 
 
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;
 
240
        i++;
 
241
 
 
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;
 
245
        i++;
 
246
 
 
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;
 
250
        i++;
 
251
 
 
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;
 
255
        i++;
 
256
 
 
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;
 
261
        }
 
262
    }
 
263
 
 
264
#ifdef NETSNMP_ENABLE_IPV6
 
265
    flag = 0;
 
266
    k = 0;
 
267
    inc = 0;
 
268
    linux_read_icmp6_msg_stat(&v6icmp, &v6icmpmsg, &flag);
 
269
    if (flag) {
 
270
        while (254 != k) {
 
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 */
 
277
            }
 
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 */
 
284
            }
 
285
            if (inc) {
 
286
                i++;
 
287
                inc = 0;
 
288
            }
 
289
            k++;
 
290
        }
 
291
    } else {
 
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;
 
295
        i++;
 
296
 
 
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;
 
300
        i++;
 
301
 
 
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;
 
305
        i++;
 
306
 
 
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;
 
310
        i++;
 
311
 
 
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;
 
316
        i++;
 
317
 
 
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;
 
321
        i++;
 
322
 
 
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;
 
328
        i++;
 
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;
 
332
        i++;
 
333
 
 
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;
 
337
        i++;
 
338
#endif
 
339
 
 
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;
 
343
        i++;
 
344
 
 
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;
 
349
        i++;
 
350
 
 
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;
 
354
        i++;
 
355
 
 
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;
 
359
        i++;
 
360
 
 
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;
 
364
 
 
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;
 
368
        }
 
369
    }
 
370
#endif /* NETSNMP_ENABLE_IPV6 */
 
371
    return 0;
 
372
}
 
373
 
 
374
netsnmp_variable_list *
 
375
icmp_stats_next_entry( void **loop_context,
 
376
                     void **data_context,
 
377
                     netsnmp_variable_list *index,
 
378
                     netsnmp_iterator_info *data)
 
379
{
 
380
        int i = (int)(intptr_t)(*loop_context);
 
381
        netsnmp_variable_list *idx = index;
 
382
 
 
383
        if(i > 1)
 
384
                return NULL;
 
385
 
 
386
 
 
387
        /*
 
388
         *set IP version
 
389
         */
 
390
        snmp_set_var_typed_value(idx, ASN_INTEGER, (u_char *)&icmp_stats_table[i].ipVer,
 
391
                                sizeof(uint32_t));
 
392
        idx = idx->next_variable;
 
393
 
 
394
        *data_context = &icmp_stats_table[i];
 
395
 
 
396
        *loop_context = (void *)(intptr_t)(++i);
 
397
        
 
398
        return index;
 
399
}
 
400
 
 
401
 
 
402
netsnmp_variable_list *
 
403
icmp_stats_first_entry( void **loop_context,
 
404
                     void **data_context,
 
405
                     netsnmp_variable_list *index,
 
406
                     netsnmp_iterator_info *data)
 
407
{
 
408
 
 
409
        *loop_context = NULL;
 
410
        *data_context = NULL;
 
411
        return icmp_stats_next_entry(loop_context, data_context, index, data);
 
412
}
 
413
 
 
414
netsnmp_variable_list *
 
415
icmp_msg_stats_next_entry(void **loop_context,
 
416
                          void **data_context,
 
417
                          netsnmp_variable_list *index,
 
418
                          netsnmp_iterator_info *data)
 
419
{
 
420
    int i = (int)(intptr_t)(*loop_context);
 
421
    netsnmp_variable_list *idx = index;
 
422
 
 
423
    if(i >= ICMP_MSG_STATS_IPV4_COUNT + ICMP_MSG_STATS_IPV6_COUNT)
 
424
        return NULL;
 
425
 
 
426
    /* set IP version */
 
427
    snmp_set_var_typed_value(idx, ASN_INTEGER,
 
428
            (u_char *)&icmp_msg_stats_table[i].ipVer,
 
429
            sizeof(uint32_t));
 
430
 
 
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,
 
435
            sizeof(uint32_t));
 
436
 
 
437
    *data_context = &icmp_msg_stats_table[i];
 
438
    *loop_context = (void *)(intptr_t)(++i);
 
439
 
 
440
    return index;
 
441
}
 
442
 
 
443
 
 
444
netsnmp_variable_list *
 
445
icmp_msg_stats_first_entry(void **loop_context,
 
446
                           void **data_context,
 
447
                           netsnmp_variable_list *index,
 
448
                           netsnmp_iterator_info *data)
 
449
{
 
450
    *loop_context = NULL;
 
451
    *data_context = NULL;
 
452
    return icmp_msg_stats_next_entry(loop_context, data_context, index, data);
 
453
}
 
454
#endif
 
455
 
 
456
void
 
457
init_icmp(void)
 
458
{
 
459
#ifdef linux
 
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;
 
466
#endif
 
467
    netsnmp_handler_registration *scalar_reginfo = NULL;
 
468
    int                    rc;
 
469
 
 
470
    /*
 
471
     * register ourselves with the agent as a group of scalars...
 
472
     */
 
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)
 
478
        return;
 
479
    /*
 
480
     * .... with a local cache
 
481
     *    (except for HP-UX 11, which extracts objects individually)
 
482
     */
 
483
#ifndef hpux11
 
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)
 
489
        goto bail;
 
490
#endif
 
491
#ifdef linux
 
492
 
 
493
    /* register icmpStatsTable */
 
494
    table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
 
495
    if (!table_info)
 
496
        goto bail;
 
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;
 
500
 
 
501
 
 
502
    iinfo      = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
 
503
    if (!iinfo)
 
504
        goto bail;
 
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;
 
508
 
 
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);
 
512
 
 
513
    rc = netsnmp_register_table_iterator2(table_reginfo, iinfo);
 
514
    if (rc != SNMPERR_SUCCESS) {
 
515
        table_reginfo = NULL;
 
516
        goto bail;
 
517
    }
 
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)));
 
522
 
 
523
    /* register icmpMsgStatsTable */
 
524
    msg_stats_table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
 
525
    if (!msg_stats_table_info)
 
526
        goto bail;
 
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;
 
530
 
 
531
    msg_stats_iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
 
532
    if (!msg_stats_iinfo)
 
533
        goto bail;
 
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;
 
537
 
 
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);
 
541
 
 
542
    rc = netsnmp_register_table_iterator2(msg_stats_reginfo, msg_stats_iinfo);
 
543
    if (rc != SNMPERR_SUCCESS) {
 
544
        msg_stats_reginfo = NULL;
 
545
        goto bail;
 
546
    }
 
547
 
 
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)));
 
552
#endif /* linux */
 
553
 
 
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");
 
558
#endif
 
559
 
 
560
#if !defined(_USE_PERFSTAT_PROTOCOL)
 
561
#ifdef ICMPSTAT_SYMBOL
 
562
    auto_nlist(ICMPSTAT_SYMBOL, 0, 0);
 
563
#endif
 
564
#ifdef solaris2
 
565
    init_kernel_sunos5();
 
566
#endif
 
567
#endif
 
568
    return;
 
569
 
 
570
#ifndef hpux11
 
571
bail:
 
572
#endif
 
573
#ifdef linux
 
574
    if (msg_stats_reginfo)
 
575
        netsnmp_handler_registration_free(msg_stats_reginfo);
 
576
    if (table_reginfo)
 
577
        netsnmp_handler_registration_free(table_reginfo);
 
578
#endif
 
579
    if (scalar_reginfo)
 
580
        netsnmp_handler_registration_free(scalar_reginfo);
 
581
}
 
582
 
 
583
 
 
584
        /*********************
 
585
         *
 
586
         *  System specific data formats
 
587
         *
 
588
         *********************/
 
589
 
 
590
#ifdef hpux11
 
591
#define ICMP_STAT_STRUCTURE     int
 
592
#endif
 
593
 
 
594
#ifdef linux
 
595
#define ICMP_STAT_STRUCTURE     struct icmp_mib
 
596
#define USES_SNMP_DESIGNED_ICMPSTAT
 
597
#undef ICMPSTAT_SYMBOL
 
598
#endif
 
599
 
 
600
#ifdef solaris2
 
601
#define ICMP_STAT_STRUCTURE     mib2_icmp_t
 
602
#define USES_SNMP_DESIGNED_ICMPSTAT
 
603
#endif
 
604
 
 
605
#ifdef NETBSD_STATS_VIA_SYSCTL
 
606
#define ICMP_STAT_STRUCTURE     struct icmp_mib
 
607
#define USES_SNMP_DESIGNED_ICMPSTAT
 
608
#undef ICMP_NSTATS
 
609
#endif
 
610
 
 
611
#ifdef HAVE_IPHLPAPI_H
 
612
#include <iphlpapi.h>
 
613
#define ICMP_STAT_STRUCTURE MIB_ICMP
 
614
#endif
 
615
 
 
616
/* ?? #if (defined(NETSNMP_CAN_USE_SYSCTL) && defined(ICMPCTL_STATS)) ?? */
 
617
 
 
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
 
622
#endif
 
623
 
 
624
#if !defined(ICMP_STAT_STRUCTURE)
 
625
#define ICMP_STAT_STRUCTURE     struct icmpstat
 
626
#define USES_TRADITIONAL_ICMPSTAT
 
627
#endif
 
628
 
 
629
ICMP_STAT_STRUCTURE icmpstat;
 
630
 
 
631
 
 
632
        /*********************
 
633
         *
 
634
         *  System independent handler
 
635
         *       (mostly!)
 
636
         *
 
637
         *********************/
 
638
 
 
639
int
 
640
icmp_handler(netsnmp_mib_handler          *handler,
 
641
             netsnmp_handler_registration *reginfo,
 
642
             netsnmp_agent_request_info   *reqinfo,
 
643
             netsnmp_request_info         *requests)
 
644
{
 
645
    netsnmp_request_info  *request;
 
646
    netsnmp_variable_list *requestvb;
 
647
    long     ret_value;
 
648
    oid      subid;
 
649
#ifdef USES_TRADITIONAL_ICMPSTAT
 
650
    int      i;
 
651
#endif
 
652
 
 
653
    /*
 
654
     * The cached data should already have been loaded by the
 
655
     *    cache handler, higher up the handler chain.
 
656
     */
 
657
#if defined(_USE_PERFSTAT_PROTOCOL)
 
658
    icmp_load(NULL, NULL);
 
659
#endif
 
660
 
 
661
 
 
662
    /*
 
663
     * 
 
664
     *
 
665
     */
 
666
    DEBUGMSGTL(("mibII/icmp", "Handler - mode %s\n",
 
667
                    se_find_label_in_slist("agent_mode", reqinfo->mode)));
 
668
    switch (reqinfo->mode) {
 
669
    case MODE_GET:
 
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"));
 
677
 
 
678
            switch (subid) {
 
679
#ifdef USES_SNMP_DESIGNED_ICMPSTAT
 
680
    case ICMPINMSGS:
 
681
        ret_value = icmpstat.icmpInMsgs;
 
682
        break;
 
683
    case ICMPINERRORS:
 
684
        ret_value = icmpstat.icmpInErrors;
 
685
        break;
 
686
    case ICMPINDESTUNREACHS:
 
687
        ret_value = icmpstat.icmpInDestUnreachs;
 
688
        break;
 
689
    case ICMPINTIMEEXCDS:
 
690
        ret_value = icmpstat.icmpInTimeExcds;
 
691
        break;
 
692
    case ICMPINPARMPROBS:
 
693
        ret_value = icmpstat.icmpInParmProbs;
 
694
        break;
 
695
    case ICMPINSRCQUENCHS:
 
696
        ret_value = icmpstat.icmpInSrcQuenchs;
 
697
        break;
 
698
    case ICMPINREDIRECTS:
 
699
        ret_value = icmpstat.icmpInRedirects;
 
700
        break;
 
701
    case ICMPINECHOS:
 
702
        ret_value = icmpstat.icmpInEchos;
 
703
        break;
 
704
    case ICMPINECHOREPS:
 
705
        ret_value = icmpstat.icmpInEchoReps;
 
706
        break;
 
707
    case ICMPINTIMESTAMPS:
 
708
        ret_value = icmpstat.icmpInTimestamps;
 
709
        break;
 
710
    case ICMPINTIMESTAMPREPS:
 
711
        ret_value = icmpstat.icmpInTimestampReps;
 
712
        break;
 
713
    case ICMPINADDRMASKS:
 
714
        ret_value = icmpstat.icmpInAddrMasks;
 
715
        break;
 
716
    case ICMPINADDRMASKREPS:
 
717
        ret_value = icmpstat.icmpInAddrMaskReps;
 
718
        break;
 
719
    case ICMPOUTMSGS:
 
720
        ret_value = icmpstat.icmpOutMsgs;
 
721
        break;
 
722
    case ICMPOUTERRORS:
 
723
        ret_value = icmpstat.icmpOutErrors;
 
724
        break;
 
725
    case ICMPOUTDESTUNREACHS:
 
726
        ret_value = icmpstat.icmpOutDestUnreachs;
 
727
        break;
 
728
    case ICMPOUTTIMEEXCDS:
 
729
        ret_value = icmpstat.icmpOutTimeExcds;
 
730
        break;
 
731
    case ICMPOUTPARMPROBS:
 
732
        ret_value = icmpstat.icmpOutParmProbs;
 
733
        break;
 
734
    case ICMPOUTSRCQUENCHS:
 
735
        ret_value = icmpstat.icmpOutSrcQuenchs;
 
736
        break;
 
737
    case ICMPOUTREDIRECTS:
 
738
        ret_value = icmpstat.icmpOutRedirects;
 
739
        break;
 
740
    case ICMPOUTECHOS:
 
741
        ret_value = icmpstat.icmpOutEchos;
 
742
        break;
 
743
    case ICMPOUTECHOREPS:
 
744
        ret_value = icmpstat.icmpOutEchoReps;
 
745
        break;
 
746
    case ICMPOUTTIMESTAMPS:
 
747
        ret_value = icmpstat.icmpOutTimestamps;
 
748
        break;
 
749
    case ICMPOUTTIMESTAMPREPS:
 
750
        ret_value = icmpstat.icmpOutTimestampReps;
 
751
        break;
 
752
    case ICMPOUTADDRMASKS:
 
753
        ret_value = icmpstat.icmpOutAddrMasks;
 
754
        break;
 
755
    case ICMPOUTADDRMASKREPS:
 
756
        ret_value = icmpstat.icmpOutAddrMaskReps;
 
757
        break;
 
758
#elif defined(USES_TRADITIONAL_ICMPSTAT) && !defined(_USE_PERFSTAT_PROTOCOL)
 
759
    case ICMPINMSGS:
 
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];
 
765
        break;
 
766
    case ICMPINERRORS:
 
767
        ret_value = icmpstat.icps_badcode +
 
768
            icmpstat.icps_tooshort +
 
769
            icmpstat.icps_checksum + icmpstat.icps_badlen;
 
770
        break;
 
771
    case ICMPINDESTUNREACHS:
 
772
        ret_value = icmpstat.icps_inhist[ICMP_UNREACH];
 
773
        break;
 
774
    case ICMPINTIMEEXCDS:
 
775
        ret_value = icmpstat.icps_inhist[ICMP_TIMXCEED];
 
776
        break;
 
777
    case ICMPINPARMPROBS:
 
778
        ret_value = icmpstat.icps_inhist[ICMP_PARAMPROB];
 
779
        break;
 
780
    case ICMPINSRCQUENCHS:
 
781
        ret_value = icmpstat.icps_inhist[ICMP_SOURCEQUENCH];
 
782
        break;
 
783
    case ICMPINREDIRECTS:
 
784
        ret_value = icmpstat.icps_inhist[ICMP_REDIRECT];
 
785
        break;
 
786
    case ICMPINECHOS:
 
787
        ret_value = icmpstat.icps_inhist[ICMP_ECHO];
 
788
        break;
 
789
    case ICMPINECHOREPS:
 
790
        ret_value = icmpstat.icps_inhist[ICMP_ECHOREPLY];
 
791
        break;
 
792
    case ICMPINTIMESTAMPS:
 
793
        ret_value = icmpstat.icps_inhist[ICMP_TSTAMP];
 
794
        break;
 
795
    case ICMPINTIMESTAMPREPS:
 
796
        ret_value = icmpstat.icps_inhist[ICMP_TSTAMPREPLY];
 
797
        break;
 
798
    case ICMPINADDRMASKS:
 
799
        ret_value = icmpstat.icps_inhist[ICMP_MASKREQ];
 
800
        break;
 
801
    case ICMPINADDRMASKREPS:
 
802
        ret_value = icmpstat.icps_inhist[ICMP_MASKREPLY];
 
803
        break;
 
804
    case ICMPOUTMSGS:
 
805
        ret_value = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
 
806
        for (i = 0; i <= ICMP_MAXTYPE; i++)
 
807
            ret_value += icmpstat.icps_outhist[i];
 
808
        break;
 
809
    case ICMPOUTERRORS:
 
810
        ret_value = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
 
811
        break;
 
812
    case ICMPOUTDESTUNREACHS:
 
813
        ret_value = icmpstat.icps_outhist[ICMP_UNREACH];
 
814
        break;
 
815
    case ICMPOUTTIMEEXCDS:
 
816
        ret_value = icmpstat.icps_outhist[ICMP_TIMXCEED];
 
817
        break;
 
818
    case ICMPOUTPARMPROBS:
 
819
        ret_value = icmpstat.icps_outhist[ICMP_PARAMPROB];
 
820
        break;
 
821
    case ICMPOUTSRCQUENCHS:
 
822
        ret_value = icmpstat.icps_outhist[ICMP_SOURCEQUENCH];
 
823
        break;
 
824
    case ICMPOUTREDIRECTS:
 
825
        ret_value = icmpstat.icps_outhist[ICMP_REDIRECT];
 
826
        break;
 
827
    case ICMPOUTECHOS:
 
828
        ret_value = icmpstat.icps_outhist[ICMP_ECHO];
 
829
        break;
 
830
    case ICMPOUTECHOREPS:
 
831
        ret_value = icmpstat.icps_outhist[ICMP_ECHOREPLY];
 
832
        break;
 
833
    case ICMPOUTTIMESTAMPS:
 
834
        ret_value = icmpstat.icps_outhist[ICMP_TSTAMP];
 
835
        break;
 
836
    case ICMPOUTTIMESTAMPREPS:
 
837
        ret_value = icmpstat.icps_outhist[ICMP_TSTAMPREPLY];
 
838
        break;
 
839
    case ICMPOUTADDRMASKS:
 
840
        ret_value = icmpstat.icps_outhist[ICMP_MASKREQ];
 
841
        break;
 
842
    case ICMPOUTADDRMASKREPS:
 
843
        ret_value = icmpstat.icps_outhist[ICMP_MASKREPLY];
 
844
        break;
 
845
#elif defined(hpux11)
 
846
    case ICMPINMSGS:
 
847
    case ICMPINERRORS:
 
848
    case ICMPINDESTUNREACHS:
 
849
    case ICMPINTIMEEXCDS:
 
850
    case ICMPINPARMPROBS:
 
851
    case ICMPINSRCQUENCHS:
 
852
    case ICMPINREDIRECTS:
 
853
    case ICMPINECHOS:
 
854
    case ICMPINECHOREPS:
 
855
    case ICMPINTIMESTAMPS:
 
856
    case ICMPINTIMESTAMPREPS:
 
857
    case ICMPINADDRMASKS:
 
858
    case ICMPINADDRMASKREPS:
 
859
    case ICMPOUTMSGS:
 
860
    case ICMPOUTERRORS:
 
861
    case ICMPOUTDESTUNREACHS:
 
862
    case ICMPOUTTIMEEXCDS:
 
863
    case ICMPOUTPARMPROBS:
 
864
    case ICMPOUTSRCQUENCHS:
 
865
    case ICMPOUTREDIRECTS:
 
866
    case ICMPOUTECHOS:
 
867
    case ICMPOUTECHOREPS:
 
868
    case ICMPOUTTIMESTAMPS:
 
869
    case ICMPOUTTIMESTAMPREPS:
 
870
    case ICMPOUTADDRMASKS:
 
871
    case ICMPOUTADDRMASKREPS:
 
872
        /*
 
873
         * This is a bit of a hack, to shoehorn the HP-UX 11
 
874
         * single-object retrieval approach into the caching
 
875
         * architecture.
 
876
         */
 
877
        if (icmp_load(NULL, (void*)subid) == -1 ) {
 
878
            netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);
 
879
            continue;
 
880
        }
 
881
        ret_value = icmpstat;
 
882
        break;
 
883
#elif defined (WIN32) || defined (cygwin)
 
884
    case ICMPINMSGS:
 
885
        ret_value = icmpstat.stats.icmpInStats.dwMsgs;
 
886
        break;
 
887
    case ICMPINERRORS:
 
888
        ret_value = icmpstat.stats.icmpInStats.dwErrors;
 
889
        break;
 
890
    case ICMPINDESTUNREACHS:
 
891
        ret_value = icmpstat.stats.icmpInStats.dwDestUnreachs;
 
892
        break;
 
893
    case ICMPINTIMEEXCDS:
 
894
        ret_value = icmpstat.stats.icmpInStats.dwTimeExcds;
 
895
        break;
 
896
    case ICMPINPARMPROBS:
 
897
        ret_value = icmpstat.stats.icmpInStats.dwParmProbs;
 
898
        break;
 
899
    case ICMPINSRCQUENCHS:
 
900
        ret_value = icmpstat.stats.icmpInStats.dwSrcQuenchs;
 
901
        break;
 
902
    case ICMPINREDIRECTS:
 
903
        ret_value = icmpstat.stats.icmpInStats.dwRedirects;
 
904
        break;
 
905
    case ICMPINECHOS:
 
906
        ret_value = icmpstat.stats.icmpInStats.dwEchos;
 
907
        break;
 
908
    case ICMPINECHOREPS:
 
909
        ret_value = icmpstat.stats.icmpInStats.dwEchoReps;
 
910
        break;
 
911
    case ICMPINTIMESTAMPS:
 
912
        ret_value = icmpstat.stats.icmpInStats.dwTimestamps;
 
913
        break;
 
914
    case ICMPINTIMESTAMPREPS:
 
915
        ret_value = icmpstat.stats.icmpInStats.dwTimestampReps;
 
916
        break;
 
917
    case ICMPINADDRMASKS:
 
918
        ret_value = icmpstat.stats.icmpInStats.dwAddrMasks;
 
919
        break;
 
920
    case ICMPINADDRMASKREPS:
 
921
        ret_value = icmpstat.stats.icmpInStats.dwAddrMaskReps;
 
922
        break;
 
923
    case ICMPOUTMSGS:
 
924
        ret_value = icmpstat.stats.icmpOutStats.dwMsgs;
 
925
        break;
 
926
    case ICMPOUTERRORS:
 
927
        ret_value = icmpstat.stats.icmpOutStats.dwErrors;
 
928
        break;
 
929
    case ICMPOUTDESTUNREACHS:
 
930
        ret_value = icmpstat.stats.icmpOutStats.dwDestUnreachs;
 
931
        break;
 
932
    case ICMPOUTTIMEEXCDS:
 
933
        ret_value = icmpstat.stats.icmpOutStats.dwTimeExcds;
 
934
        break;
 
935
    case ICMPOUTPARMPROBS:
 
936
        ret_value = icmpstat.stats.icmpOutStats.dwParmProbs;
 
937
        break;
 
938
    case ICMPOUTSRCQUENCHS:
 
939
        ret_value = icmpstat.stats.icmpOutStats.dwSrcQuenchs;
 
940
        break;
 
941
    case ICMPOUTREDIRECTS:
 
942
        ret_value = icmpstat.stats.icmpOutStats.dwRedirects;
 
943
        break;
 
944
    case ICMPOUTECHOS:
 
945
        ret_value = icmpstat.stats.icmpOutStats.dwEchos;
 
946
        break;
 
947
    case ICMPOUTECHOREPS:
 
948
        ret_value = icmpstat.stats.icmpOutStats.dwEchoReps;
 
949
        break;
 
950
    case ICMPOUTTIMESTAMPS:
 
951
        ret_value = icmpstat.stats.icmpOutStats.dwTimestamps;
 
952
        break;
 
953
    case ICMPOUTTIMESTAMPREPS:
 
954
        ret_value = icmpstat.stats.icmpOutStats.dwTimestampReps;
 
955
        break;
 
956
    case ICMPOUTADDRMASKS:
 
957
        ret_value = icmpstat.stats.icmpOutStats.dwAddrMasks;
 
958
        break;
 
959
    case ICMPOUTADDRMASKREPS:
 
960
        ret_value = icmpstat.stats.icmpOutStats.dwAddrMaskReps;
 
961
        break;
 
962
#elif defined(_USE_PERFSTAT_PROTOCOL)
 
963
    case ICMPINMSGS:
 
964
        ret_value = ps_proto.u.icmp.received;
 
965
        break;
 
966
    case ICMPINERRORS:
 
967
        ret_value = ps_proto.u.icmp.errors;
 
968
        break;
 
969
    case ICMPINDESTUNREACHS:
 
970
    case ICMPINTIMEEXCDS:
 
971
    case ICMPINPARMPROBS:
 
972
    case ICMPINSRCQUENCHS:
 
973
    case ICMPINREDIRECTS:
 
974
    case ICMPINECHOS:
 
975
    case ICMPINECHOREPS:
 
976
    case ICMPINTIMESTAMPS:
 
977
    case ICMPINTIMESTAMPREPS:
 
978
    case ICMPINADDRMASKS:
 
979
    case ICMPINADDRMASKREPS:
 
980
        ret_value = 0;
 
981
        break;
 
982
    case ICMPOUTMSGS:
 
983
        ret_value = ps_proto.u.icmp.sent;
 
984
        break;
 
985
    case ICMPOUTERRORS:
 
986
        ret_value = ps_proto.u.icmp.errors;
 
987
        break;
 
988
    case ICMPOUTDESTUNREACHS:
 
989
    case ICMPOUTTIMEEXCDS:
 
990
    case ICMPOUTPARMPROBS:
 
991
    case ICMPOUTSRCQUENCHS:
 
992
    case ICMPOUTREDIRECTS:
 
993
    case ICMPOUTECHOS:
 
994
    case ICMPOUTECHOREPS:
 
995
    case ICMPOUTTIMESTAMPS:
 
996
    case ICMPOUTTIMESTAMPREPS:
 
997
    case ICMPOUTADDRMASKS:
 
998
    case ICMPOUTADDRMASKREPS:
 
999
        ret_value = 0;
 
1000
        break;
 
1001
#endif                          /* USES_SNMP_DESIGNED_ICMPSTAT */
 
1002
            }
 
1003
            snmp_set_var_typed_value(request->requestvb, ASN_COUNTER,
 
1004
                                     (u_char *)&ret_value, sizeof(ret_value));
 
1005
        }
 
1006
        break;
 
1007
 
 
1008
    case MODE_GETNEXT:
 
1009
    case MODE_GETBULK:
 
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:
 
1015
    case MODE_SET_FREE:
 
1016
    case MODE_SET_UNDO:
 
1017
        snmp_log(LOG_WARNING, "mibII/icmp: Unsupported mode (%d)\n",
 
1018
                               reqinfo->mode);
 
1019
        break;
 
1020
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
 
1021
    default:
 
1022
        snmp_log(LOG_WARNING, "mibII/icmp: Unrecognised mode (%d)\n",
 
1023
                               reqinfo->mode);
 
1024
        break;
 
1025
    }
 
1026
 
 
1027
    return SNMP_ERR_NOERROR;
 
1028
}
 
1029
 
 
1030
 
 
1031
#ifdef linux
 
1032
int
 
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)
 
1037
{
 
1038
        netsnmp_request_info  *request;
 
1039
        netsnmp_variable_list *requestvb;
 
1040
        netsnmp_table_request_info *table_info;
 
1041
        struct icmp_stats_table_entry   *entry;
 
1042
        oid      subid;
 
1043
 
 
1044
        switch (reqinfo->mode) {
 
1045
                case MODE_GET:
 
1046
                        for (request=requests; request; request=request->next) {
 
1047
                                requestvb = request->requestvb;
 
1048
                                entry = (struct icmp_stats_table_entry *)netsnmp_extract_iterator_context(request);
 
1049
                                if (!entry)
 
1050
                                        continue;
 
1051
                                table_info = netsnmp_extract_table_info(request);
 
1052
                                subid      = table_info->colnum;
 
1053
 
 
1054
                                switch (subid) {
 
1055
                                        case ICMP_STAT_INMSG:
 
1056
                                                snmp_set_var_typed_value(requestvb, ASN_COUNTER,
 
1057
                                                        (u_char *)&entry->icmpStatsInMsgs, sizeof(uint32_t));
 
1058
                                                break;  
 
1059
                                        case ICMP_STAT_INERR:
 
1060
                                                snmp_set_var_typed_value(requestvb, ASN_COUNTER,
 
1061
                                                        (u_char *)&entry->icmpStatsInErrors, sizeof(uint32_t));
 
1062
                                                break;
 
1063
                                        case ICMP_STAT_OUTMSG:
 
1064
                                                snmp_set_var_typed_value(requestvb, ASN_COUNTER,
 
1065
                                                        (u_char *)&entry->icmpStatsOutMsgs, sizeof(uint32_t));
 
1066
                                                break;
 
1067
                                        case ICMP_STAT_OUTERR:
 
1068
                                                snmp_set_var_typed_value(requestvb, ASN_COUNTER,
 
1069
                                                        (u_char *)&entry->icmpStatsOutErrors, sizeof(uint32_t));
 
1070
                                                break;
 
1071
                                        default:
 
1072
                                                snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unrecognised column (%d)\n",(int)subid);
 
1073
                                }
 
1074
                        }
 
1075
                        break;
 
1076
                case MODE_GETNEXT:
 
1077
                case MODE_GETBULK:
 
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:
 
1083
                case MODE_SET_FREE:
 
1084
                case MODE_SET_UNDO:
 
1085
                        snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unsupported mode (%d)\n",
 
1086
                                reqinfo->mode);
 
1087
                        break;
 
1088
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
 
1089
                default:
 
1090
                        snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unrecognised mode (%d)\n",
 
1091
                                reqinfo->mode);
 
1092
                        break;
 
1093
 
 
1094
        }
 
1095
 
 
1096
        return SNMP_ERR_NOERROR;
 
1097
}
 
1098
 
 
1099
int
 
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)
 
1104
{
 
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;
 
1109
    oid subid;
 
1110
 
 
1111
    switch (reqinfo->mode) {
 
1112
        case MODE_GET:
 
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);
 
1116
                if (!entry)
 
1117
                    continue;
 
1118
                table_info = netsnmp_extract_table_info(request);
 
1119
                subid = table_info->colnum;
 
1120
 
 
1121
                switch (subid) {
 
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));
 
1126
                        } else {
 
1127
                            requestvb->type = SNMP_NOSUCHINSTANCE;
 
1128
                        }
 
1129
                        break;
 
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));
 
1134
                        } else {
 
1135
                            requestvb->type = SNMP_NOSUCHINSTANCE;
 
1136
                        }
 
1137
                        break;
 
1138
                    default:
 
1139
                        snmp_log(LOG_WARNING, "mibII/icmpMsgStatsTable: Unrecognised column (%d)\n",(int)subid);
 
1140
                }
 
1141
            }
 
1142
            break;
 
1143
        case MODE_GETNEXT:
 
1144
        case MODE_GETBULK:
 
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:
 
1150
        case MODE_SET_FREE:
 
1151
        case MODE_SET_UNDO:
 
1152
            snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unsupported mode (%d)\n",
 
1153
                    reqinfo->mode);
 
1154
            break;
 
1155
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
 
1156
        default:
 
1157
            snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unrecognised mode (%d)\n",
 
1158
                    reqinfo->mode);
 
1159
            break;
 
1160
 
 
1161
    }
 
1162
 
 
1163
    return SNMP_ERR_NOERROR;
 
1164
}
 
1165
#endif          /* linux */
 
1166
 
 
1167
        /*********************
 
1168
         *
 
1169
         *  Internal implementation functions
 
1170
         *
 
1171
         *********************/
 
1172
 
 
1173
#ifdef hpux11
 
1174
int
 
1175
icmp_load(netsnmp_cache *cache, void *vmagic)
 
1176
{
 
1177
    int             fd;
 
1178
    struct nmparms  p;
 
1179
    unsigned int    ulen;
 
1180
    int             ret;
 
1181
    int             magic = (int) vmagic;
 
1182
 
 
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 */
 
1186
    }
 
1187
 
 
1188
    switch (magic) {
 
1189
    case ICMPINMSGS:
 
1190
        p.objid = ID_icmpInMsgs;
 
1191
        break;
 
1192
    case ICMPINERRORS:
 
1193
        p.objid = ID_icmpInErrors;
 
1194
        break;
 
1195
    case ICMPINDESTUNREACHS:
 
1196
        p.objid = ID_icmpInDestUnreachs;
 
1197
        break;
 
1198
    case ICMPINTIMEEXCDS:
 
1199
        p.objid = ID_icmpInTimeExcds;
 
1200
        break;
 
1201
    case ICMPINPARMPROBS:
 
1202
        p.objid = ID_icmpInParmProbs;
 
1203
        break;
 
1204
    case ICMPINSRCQUENCHS:
 
1205
        p.objid = ID_icmpInSrcQuenchs;
 
1206
        break;
 
1207
    case ICMPINREDIRECTS:
 
1208
        p.objid = ID_icmpInRedirects;
 
1209
        break;
 
1210
    case ICMPINECHOS:
 
1211
        p.objid = ID_icmpInEchos;
 
1212
        break;
 
1213
    case ICMPINECHOREPS:
 
1214
        p.objid = ID_icmpInEchoReps;
 
1215
        break;
 
1216
    case ICMPINTIMESTAMPS:
 
1217
        p.objid = ID_icmpInTimestamps;
 
1218
        break;
 
1219
    case ICMPINTIMESTAMPREPS:
 
1220
        p.objid = ID_icmpInTimestampReps;
 
1221
        break;
 
1222
    case ICMPINADDRMASKS:
 
1223
        p.objid = ID_icmpInAddrMasks;
 
1224
        break;
 
1225
    case ICMPINADDRMASKREPS:
 
1226
        p.objid = ID_icmpInAddrMaskReps;
 
1227
        break;
 
1228
    case ICMPOUTMSGS:
 
1229
        p.objid = ID_icmpOutMsgs;
 
1230
        break;
 
1231
    case ICMPOUTERRORS:
 
1232
        p.objid = ID_icmpOutErrors;
 
1233
        break;
 
1234
    case ICMPOUTDESTUNREACHS:
 
1235
        p.objid = ID_icmpOutDestUnreachs;
 
1236
        break;
 
1237
    case ICMPOUTTIMEEXCDS:
 
1238
        p.objid = ID_icmpOutTimeExcds;
 
1239
        break;
 
1240
    case ICMPOUTPARMPROBS:
 
1241
        p.objid = ID_icmpOutParmProbs;
 
1242
        break;
 
1243
    case ICMPOUTSRCQUENCHS:
 
1244
        p.objid = ID_icmpOutSrcQuenchs;
 
1245
        break;
 
1246
    case ICMPOUTREDIRECTS:
 
1247
        p.objid = ID_icmpOutRedirects;
 
1248
        break;
 
1249
    case ICMPOUTECHOS:
 
1250
        p.objid = ID_icmpOutEchos;
 
1251
        break;
 
1252
    case ICMPOUTECHOREPS:
 
1253
        p.objid = ID_icmpOutEchoReps;
 
1254
        break;
 
1255
    case ICMPOUTTIMESTAMPS:
 
1256
        p.objid = ID_icmpOutTimestamps;
 
1257
        break;
 
1258
    case ICMPOUTTIMESTAMPREPS:
 
1259
        p.objid = ID_icmpOutTimestampReps;
 
1260
        break;
 
1261
    case ICMPOUTADDRMASKS:
 
1262
        p.objid = ID_icmpOutAddrMasks;
 
1263
        break;
 
1264
    case ICMPOUTADDRMASKREPS:
 
1265
        p.objid = ID_icmpOutAddrMaskReps;
 
1266
        break;
 
1267
    default:
 
1268
        icmpstat = 0;
 
1269
        close_mib(fd);
 
1270
        return (0);
 
1271
    }
 
1272
 
 
1273
    p.buffer = (void *)&icmpstat;
 
1274
    ulen = sizeof(ICMP_STAT_STRUCTURE);
 
1275
    p.len = &ulen;
 
1276
    ret = get_mib_info(fd, &p);
 
1277
    close_mib(fd);
 
1278
 
 
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 */
 
1282
}
 
1283
#elif defined(linux)
 
1284
int
 
1285
icmp_load(netsnmp_cache *cache, void *vmagic)
 
1286
{
 
1287
    long            ret_value = -1;
 
1288
 
 
1289
    ret_value = linux_read_icmp_stat(&icmpstat);
 
1290
 
 
1291
    if ( ret_value < 0 ) {
 
1292
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (linux)\n"));
 
1293
    } else {
 
1294
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (linux)\n"));
 
1295
    }
 
1296
    icmp_stats_load(cache, vmagic);
 
1297
    icmp_msg_stats_load(cache, vmagic);
 
1298
    return ret_value;
 
1299
}
 
1300
#elif defined(solaris2)
 
1301
int
 
1302
icmp_load(netsnmp_cache *cache, void *vmagic)
 
1303
{
 
1304
    long            ret_value = -1;
 
1305
 
 
1306
    ret_value =
 
1307
        getMibstat(MIB_ICMP, &icmpstat, sizeof(mib2_icmp_t), GET_FIRST,
 
1308
                   &Get_everything, NULL);
 
1309
 
 
1310
    if ( ret_value < 0 ) {
 
1311
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (solaris)\n"));
 
1312
    } else {
 
1313
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (solaris)\n"));
 
1314
    }
 
1315
    return ret_value;
 
1316
}
 
1317
#elif defined(NETBSD_STATS_VIA_SYSCTL)
 
1318
int
 
1319
icmp_load(netsnmp_cache *cache, void *vmagic)
 
1320
{
 
1321
    long            ret_value =- -1;
 
1322
 
 
1323
    ret_value = netbsd_read_icmp_stat(&icmpstat);
 
1324
 
 
1325
    if ( ret_value < 0 ) {
 
1326
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (netbsd)\n"));
 
1327
    } else {
 
1328
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (netbsd)\n"));
 
1329
    }
 
1330
    return ret_value;
 
1331
}
 
1332
#elif defined (WIN32) || defined (cygwin)
 
1333
int
 
1334
icmp_load(netsnmp_cache *cache, void *vmagic)
 
1335
{
 
1336
    long            ret_value = -1;
 
1337
 
 
1338
    ret_value = GetIcmpStatistics(&icmpstat);
 
1339
 
 
1340
    if ( ret_value < 0 ) {
 
1341
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (win32)\n"));
 
1342
    } else {
 
1343
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (win32)\n"));
 
1344
    }
 
1345
    return ret_value;
 
1346
}
 
1347
#elif defined(_USE_PERFSTAT_PROTOCOL)
 
1348
int
 
1349
icmp_load(netsnmp_cache *cache, void *vmagic)
 
1350
{
 
1351
    long            ret_value = -1;
 
1352
 
 
1353
    strcpy(ps_name.name, "icmp");
 
1354
    ret_value = perfstat_protocol(&ps_name, &ps_proto, sizeof(ps_proto), 1);
 
1355
 
 
1356
    if ( ret_value < 0 ) {
 
1357
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (AIX)\n"));
 
1358
    } else {
 
1359
        ret_value = 0;
 
1360
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (AIX)\n"));
 
1361
    }
 
1362
    return ret_value;
 
1363
}
 
1364
#elif defined(NETSNMP_CAN_USE_SYSCTL) && defined(ICMPCTL_STATS)
 
1365
int
 
1366
icmp_load(netsnmp_cache *cache, void *vmagic)
 
1367
{
 
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);
 
1372
 
 
1373
    ret_value = sysctl(sname, 4, &icmpstat, &len, 0, 0);
 
1374
 
 
1375
    if ( ret_value < 0 ) {
 
1376
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (sysctl)\n"));
 
1377
    } else {
 
1378
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (sysctl)\n"));
 
1379
    }
 
1380
    return ret_value;
 
1381
}
 
1382
#elif defined(HAVE_SYS_TCPIPSTATS_H)
 
1383
int
 
1384
icmp_load(netsnmp_cache *cache, void *vmagic)
 
1385
{
 
1386
    long            ret_value = -1;
 
1387
 
 
1388
    ret_value =
 
1389
        sysmp(MP_SAGET, MPSA_TCPIPSTATS, &icmpstat, sizeof icmpstat);
 
1390
 
 
1391
    if ( ret_value < 0 ) {
 
1392
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (tcpipstats)\n"));
 
1393
    } else {
 
1394
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (tcpipstats)\n"));
 
1395
    }
 
1396
    return ret_value;
 
1397
}
 
1398
#elif defined(ICMPSTAT_SYMBOL)
 
1399
int
 
1400
icmp_load(netsnmp_cache *cache, void *vmagic)
 
1401
{
 
1402
    long            ret_value = -1;
 
1403
 
 
1404
    if (auto_nlist(ICMPSTAT_SYMBOL, (char *)&icmpstat, sizeof(icmpstat)))
 
1405
        ret_value = 0;
 
1406
 
 
1407
    if ( ret_value < 0 ) {
 
1408
        DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (icmpstat)\n"));
 
1409
    } else {
 
1410
        DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (icmpstat)\n"));
 
1411
    }
 
1412
    return ret_value;
 
1413
}
 
1414
#else           /* ICMPSTAT_SYMBOL */
 
1415
int
 
1416
icmp_load(netsnmp_cache *cache, void *vmagic)
 
1417
{
 
1418
    long            ret_value = -1;
 
1419
 
 
1420
    DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (null)\n"));
 
1421
    return ret_value;
 
1422
}
 
1423
#endif          /* hpux11 */
 
1424
 
 
1425
void
 
1426
icmp_free(netsnmp_cache *cache, void *magic)
 
1427
{
 
1428
#if defined(_USE_PERFSTAT_PROTOCOL)
 
1429
    memset(&ps_proto, 0, sizeof(ps_proto));
 
1430
#else
 
1431
    memset(&icmpstat, 0, sizeof(icmpstat));
 
1432
#endif
 
1433
}