1f06ca4afSHartmut Brandt /*
2f06ca4afSHartmut Brandt * Copyright (c) 2001-2003
3f06ca4afSHartmut Brandt * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4f06ca4afSHartmut Brandt * All rights reserved.
5f06ca4afSHartmut Brandt *
6f06ca4afSHartmut Brandt * Author: Harti Brandt <harti@freebsd.org>
7f06ca4afSHartmut Brandt *
8896052c1SHartmut Brandt * Redistribution and use in source and binary forms, with or without
9896052c1SHartmut Brandt * modification, are permitted provided that the following conditions
10896052c1SHartmut Brandt * are met:
11896052c1SHartmut Brandt * 1. Redistributions of source code must retain the above copyright
12896052c1SHartmut Brandt * notice, this list of conditions and the following disclaimer.
13f06ca4afSHartmut Brandt * 2. Redistributions in binary form must reproduce the above copyright
14f06ca4afSHartmut Brandt * notice, this list of conditions and the following disclaimer in the
15f06ca4afSHartmut Brandt * documentation and/or other materials provided with the distribution.
16f06ca4afSHartmut Brandt *
17896052c1SHartmut Brandt * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18896052c1SHartmut Brandt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19896052c1SHartmut Brandt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20896052c1SHartmut Brandt * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21896052c1SHartmut Brandt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22896052c1SHartmut Brandt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23896052c1SHartmut Brandt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24896052c1SHartmut Brandt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25896052c1SHartmut Brandt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26896052c1SHartmut Brandt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27896052c1SHartmut Brandt * SUCH DAMAGE.
28f06ca4afSHartmut Brandt *
2969292cedSHartmut Brandt * $Begemot: bsnmp/snmp_mibII/mibII_ip.c,v 1.11 2005/05/23 09:03:40 brandt_h Exp $
30f06ca4afSHartmut Brandt *
31f06ca4afSHartmut Brandt * ip group scalars.
32f06ca4afSHartmut Brandt */
33f06ca4afSHartmut Brandt #include "mibII.h"
34f06ca4afSHartmut Brandt #include "mibII_oid.h"
35f06ca4afSHartmut Brandt #include <netinet/in_systm.h>
36f06ca4afSHartmut Brandt #include <netinet/ip.h>
37f06ca4afSHartmut Brandt #include <netinet/ip_var.h>
38f06ca4afSHartmut Brandt #include <netinet/ip_icmp.h>
39f06ca4afSHartmut Brandt #include <netinet/icmp_var.h>
40f06ca4afSHartmut Brandt
41f06ca4afSHartmut Brandt static struct ipstat ipstat;
42f06ca4afSHartmut Brandt static u_int ip_idrop;
43f06ca4afSHartmut Brandt static struct icmpstat icmpstat;
44f06ca4afSHartmut Brandt
45f06ca4afSHartmut Brandt static int ip_forwarding;
46f06ca4afSHartmut Brandt static int ip_defttl;
47*9d548124SGleb Smirnoff static u_int ip_fragttl;
4869292cedSHartmut Brandt static uint64_t ip_tick;
49f06ca4afSHartmut Brandt
5069292cedSHartmut Brandt static uint64_t ipstat_tick;
51f06ca4afSHartmut Brandt
52f06ca4afSHartmut Brandt static int
fetch_ipstat(void)53f06ca4afSHartmut Brandt fetch_ipstat(void)
54f06ca4afSHartmut Brandt {
55f06ca4afSHartmut Brandt size_t len;
56f06ca4afSHartmut Brandt
57f06ca4afSHartmut Brandt len = sizeof(ipstat);
58f06ca4afSHartmut Brandt if (sysctlbyname("net.inet.ip.stats", &ipstat, &len, NULL, 0) == -1) {
59f06ca4afSHartmut Brandt syslog(LOG_ERR, "net.inet.ip.stats: %m");
60f06ca4afSHartmut Brandt return (-1);
61f06ca4afSHartmut Brandt }
62f06ca4afSHartmut Brandt if (len != sizeof(ipstat)) {
63f06ca4afSHartmut Brandt syslog(LOG_ERR, "net.inet.ip.stats: wrong size");
64f06ca4afSHartmut Brandt return (-1);
65f06ca4afSHartmut Brandt }
66f06ca4afSHartmut Brandt len = sizeof(ip_idrop);
67f06ca4afSHartmut Brandt if (sysctlbyname("net.inet.ip.intr_queue_drops", &ip_idrop, &len, NULL, 0) == -1)
68f06ca4afSHartmut Brandt syslog(LOG_WARNING, "net.inet.ip.intr_queue_drops: %m");
69f06ca4afSHartmut Brandt if (len != sizeof(ip_idrop)) {
70f06ca4afSHartmut Brandt syslog(LOG_WARNING, "net.inet.ip.intr_queue_drops: wrong size");
71f06ca4afSHartmut Brandt ip_idrop = 0;
72f06ca4afSHartmut Brandt }
73f06ca4afSHartmut Brandt len = sizeof(icmpstat);
74f06ca4afSHartmut Brandt if (sysctlbyname("net.inet.icmp.stats", &icmpstat, &len, NULL, 0) == -1) {
75f06ca4afSHartmut Brandt syslog(LOG_ERR, "net.inet.icmp.stats: %m");
76f06ca4afSHartmut Brandt return (-1);
77f06ca4afSHartmut Brandt }
78f06ca4afSHartmut Brandt if (len != sizeof(icmpstat)) {
79f06ca4afSHartmut Brandt syslog(LOG_ERR, "net.inet.icmp.stats: wrong size");
80f06ca4afSHartmut Brandt return (-1);
81f06ca4afSHartmut Brandt }
82f06ca4afSHartmut Brandt
83*9d548124SGleb Smirnoff len = sizeof(ip_fragttl);
84*9d548124SGleb Smirnoff if (sysctlbyname("net.inet.ip.fragttl", &ip_fragttl, &len,
85*9d548124SGleb Smirnoff NULL, 0) == -1) {
86*9d548124SGleb Smirnoff syslog(LOG_ERR, "net.inet.ip.fragttl: %m");
87*9d548124SGleb Smirnoff return (-1);
88*9d548124SGleb Smirnoff }
89*9d548124SGleb Smirnoff if (len != sizeof(ip_fragttl)) {
90*9d548124SGleb Smirnoff syslog(LOG_ERR, "net.inet.ip.fragttl: wrong size");
91*9d548124SGleb Smirnoff return (-1);
92*9d548124SGleb Smirnoff }
93*9d548124SGleb Smirnoff
94f06ca4afSHartmut Brandt ipstat_tick = get_ticks();
95f06ca4afSHartmut Brandt return (0);
96f06ca4afSHartmut Brandt }
97f06ca4afSHartmut Brandt
98f06ca4afSHartmut Brandt static int
fetch_ip(void)99f06ca4afSHartmut Brandt fetch_ip(void)
100f06ca4afSHartmut Brandt {
101f06ca4afSHartmut Brandt size_t len;
102f06ca4afSHartmut Brandt
103f06ca4afSHartmut Brandt len = sizeof(ip_forwarding);
104f06ca4afSHartmut Brandt if (sysctlbyname("net.inet.ip.forwarding", &ip_forwarding, &len,
105f06ca4afSHartmut Brandt NULL, 0) == -1) {
106f06ca4afSHartmut Brandt syslog(LOG_ERR, "net.inet.ip.forwarding: %m");
107f06ca4afSHartmut Brandt return (-1);
108f06ca4afSHartmut Brandt }
109f06ca4afSHartmut Brandt if (len != sizeof(ip_forwarding)) {
110f06ca4afSHartmut Brandt syslog(LOG_ERR, "net.inet.ip.forwarding: wrong size");
111f06ca4afSHartmut Brandt return (-1);
112f06ca4afSHartmut Brandt }
113f06ca4afSHartmut Brandt
114f06ca4afSHartmut Brandt len = sizeof(ip_defttl);
115f06ca4afSHartmut Brandt if (sysctlbyname("net.inet.ip.ttl", &ip_defttl, &len,
116f06ca4afSHartmut Brandt NULL, 0) == -1) {
117f06ca4afSHartmut Brandt syslog(LOG_ERR, "net.inet.ip.ttl: %m");
118f06ca4afSHartmut Brandt return (-1);
119f06ca4afSHartmut Brandt }
120f06ca4afSHartmut Brandt if (len != sizeof(ip_defttl)) {
121f06ca4afSHartmut Brandt syslog(LOG_ERR, "net.inet.ip.ttl: wrong size");
122f06ca4afSHartmut Brandt return (-1);
123f06ca4afSHartmut Brandt }
124f06ca4afSHartmut Brandt
125f06ca4afSHartmut Brandt ip_tick = get_ticks();
126f06ca4afSHartmut Brandt return (0);
127f06ca4afSHartmut Brandt }
128f06ca4afSHartmut Brandt
129f06ca4afSHartmut Brandt static int
ip_forward(int forw,int * old)130f06ca4afSHartmut Brandt ip_forward(int forw, int *old)
131f06ca4afSHartmut Brandt {
132f06ca4afSHartmut Brandt size_t olen;
133f06ca4afSHartmut Brandt
134f06ca4afSHartmut Brandt olen = sizeof(*old);
135f06ca4afSHartmut Brandt if (sysctlbyname("net.inet.ip.forwarding", old, old ? &olen : NULL,
136f06ca4afSHartmut Brandt &forw, sizeof(forw)) == -1) {
137f06ca4afSHartmut Brandt syslog(LOG_ERR, "set net.inet.ip.forwarding: %m");
138f06ca4afSHartmut Brandt return (-1);
139f06ca4afSHartmut Brandt }
140f06ca4afSHartmut Brandt ip_forwarding = forw;
141f06ca4afSHartmut Brandt return (0);
142f06ca4afSHartmut Brandt }
143f06ca4afSHartmut Brandt
144f06ca4afSHartmut Brandt static int
ip_setttl(int ttl,int * old)145f06ca4afSHartmut Brandt ip_setttl(int ttl, int *old)
146f06ca4afSHartmut Brandt {
147f06ca4afSHartmut Brandt size_t olen;
148f06ca4afSHartmut Brandt
149f06ca4afSHartmut Brandt olen = sizeof(*old);
150f06ca4afSHartmut Brandt if (sysctlbyname("net.inet.ip.ttl", old, old ? &olen : NULL,
151f06ca4afSHartmut Brandt &ttl, sizeof(ttl)) == -1) {
152f06ca4afSHartmut Brandt syslog(LOG_ERR, "set net.inet.ip.ttl: %m");
153f06ca4afSHartmut Brandt return (-1);
154f06ca4afSHartmut Brandt }
155f06ca4afSHartmut Brandt ip_defttl = ttl;
156f06ca4afSHartmut Brandt return (0);
157f06ca4afSHartmut Brandt }
158f06ca4afSHartmut Brandt
159f06ca4afSHartmut Brandt /*
160f06ca4afSHartmut Brandt * READ/WRITE ip group.
161f06ca4afSHartmut Brandt */
162f06ca4afSHartmut Brandt int
op_ip(struct snmp_context * ctx,struct snmp_value * value,u_int sub,u_int idx __unused,enum snmp_op op)163f06ca4afSHartmut Brandt op_ip(struct snmp_context *ctx, struct snmp_value *value,
164f06ca4afSHartmut Brandt u_int sub, u_int idx __unused, enum snmp_op op)
165f06ca4afSHartmut Brandt {
166fa771579SMarcelo Araujo int old = 0;
167f06ca4afSHartmut Brandt
168f06ca4afSHartmut Brandt switch (op) {
169f06ca4afSHartmut Brandt
170f06ca4afSHartmut Brandt case SNMP_OP_GETNEXT:
171f06ca4afSHartmut Brandt abort();
172f06ca4afSHartmut Brandt
173f06ca4afSHartmut Brandt case SNMP_OP_GET:
174f06ca4afSHartmut Brandt break;
175f06ca4afSHartmut Brandt
176f06ca4afSHartmut Brandt case SNMP_OP_SET:
177f06ca4afSHartmut Brandt if (ip_tick < this_tick)
178f06ca4afSHartmut Brandt if (fetch_ip() == -1)
179f06ca4afSHartmut Brandt return (SNMP_ERR_GENERR);
180f06ca4afSHartmut Brandt
181f06ca4afSHartmut Brandt switch (value->var.subs[sub - 1]) {
182f06ca4afSHartmut Brandt
183f06ca4afSHartmut Brandt case LEAF_ipForwarding:
184f06ca4afSHartmut Brandt ctx->scratch->int1 = ip_forwarding ? 1 : 2;
185f06ca4afSHartmut Brandt ctx->scratch->int2 = value->v.integer;
186f06ca4afSHartmut Brandt if (value->v.integer == 1) {
187f06ca4afSHartmut Brandt if (!ip_forwarding && ip_forward(1, &old))
188f06ca4afSHartmut Brandt return (SNMP_ERR_GENERR);
189f06ca4afSHartmut Brandt ctx->scratch->int1 = old ? 1 : 2;
190f06ca4afSHartmut Brandt } else if (value->v.integer == 2) {
191f06ca4afSHartmut Brandt if (ip_forwarding && ip_forward(0, &old))
192f06ca4afSHartmut Brandt return (SNMP_ERR_GENERR);
193f06ca4afSHartmut Brandt ctx->scratch->int1 = old;
194f06ca4afSHartmut Brandt } else
195f06ca4afSHartmut Brandt return (SNMP_ERR_WRONG_VALUE);
196f06ca4afSHartmut Brandt break;
197f06ca4afSHartmut Brandt
198f06ca4afSHartmut Brandt case LEAF_ipDefaultTTL:
199f06ca4afSHartmut Brandt ctx->scratch->int1 = ip_defttl;
200f06ca4afSHartmut Brandt ctx->scratch->int2 = value->v.integer;
201f06ca4afSHartmut Brandt if (value->v.integer < 1 || value->v.integer > 255)
202f06ca4afSHartmut Brandt return (SNMP_ERR_WRONG_VALUE);
203f06ca4afSHartmut Brandt if (ip_defttl != value->v.integer &&
204f06ca4afSHartmut Brandt ip_setttl(value->v.integer, &old))
205f06ca4afSHartmut Brandt return (SNMP_ERR_GENERR);
206f06ca4afSHartmut Brandt ctx->scratch->int1 = old;
207f06ca4afSHartmut Brandt break;
208f06ca4afSHartmut Brandt }
209f06ca4afSHartmut Brandt return (SNMP_ERR_NOERROR);
210f06ca4afSHartmut Brandt
211f06ca4afSHartmut Brandt case SNMP_OP_ROLLBACK:
212f06ca4afSHartmut Brandt switch (value->var.subs[sub - 1]) {
213f06ca4afSHartmut Brandt
214f06ca4afSHartmut Brandt case LEAF_ipForwarding:
215f06ca4afSHartmut Brandt if (ctx->scratch->int1 == 1) {
216f06ca4afSHartmut Brandt if (ctx->scratch->int2 == 2)
217f06ca4afSHartmut Brandt (void)ip_forward(1, NULL);
218f06ca4afSHartmut Brandt } else {
219f06ca4afSHartmut Brandt if (ctx->scratch->int2 == 1)
220f06ca4afSHartmut Brandt (void)ip_forward(0, NULL);
221f06ca4afSHartmut Brandt }
222f06ca4afSHartmut Brandt break;
223f06ca4afSHartmut Brandt
224f06ca4afSHartmut Brandt case LEAF_ipDefaultTTL:
225f06ca4afSHartmut Brandt if (ctx->scratch->int1 != ctx->scratch->int2)
226f06ca4afSHartmut Brandt (void)ip_setttl(ctx->scratch->int1, NULL);
227f06ca4afSHartmut Brandt break;
228f06ca4afSHartmut Brandt }
229f06ca4afSHartmut Brandt return (SNMP_ERR_NOERROR);
230f06ca4afSHartmut Brandt
231f06ca4afSHartmut Brandt case SNMP_OP_COMMIT:
232f06ca4afSHartmut Brandt return (SNMP_ERR_NOERROR);
233f06ca4afSHartmut Brandt }
234f06ca4afSHartmut Brandt
235f06ca4afSHartmut Brandt if (ip_tick < this_tick)
236f06ca4afSHartmut Brandt if (fetch_ip() == -1)
237f06ca4afSHartmut Brandt return (SNMP_ERR_GENERR);
238f06ca4afSHartmut Brandt
239f06ca4afSHartmut Brandt switch (value->var.subs[sub - 1]) {
240f06ca4afSHartmut Brandt
241f06ca4afSHartmut Brandt case LEAF_ipForwarding:
242f06ca4afSHartmut Brandt value->v.integer = ip_forwarding ? 1 : 2;
243f06ca4afSHartmut Brandt break;
244f06ca4afSHartmut Brandt
245f06ca4afSHartmut Brandt case LEAF_ipDefaultTTL:
246f06ca4afSHartmut Brandt value->v.integer = ip_defttl;
247f06ca4afSHartmut Brandt break;
248f06ca4afSHartmut Brandt }
249f06ca4afSHartmut Brandt return (SNMP_ERR_NOERROR);
250f06ca4afSHartmut Brandt }
251f06ca4afSHartmut Brandt
252f06ca4afSHartmut Brandt /*
253f06ca4afSHartmut Brandt * READ-ONLY statistics ip group.
254f06ca4afSHartmut Brandt */
255f06ca4afSHartmut Brandt int
op_ipstat(struct snmp_context * ctx __unused,struct snmp_value * value,u_int sub,u_int idx __unused,enum snmp_op op)256f06ca4afSHartmut Brandt op_ipstat(struct snmp_context *ctx __unused, struct snmp_value *value,
257f06ca4afSHartmut Brandt u_int sub, u_int idx __unused, enum snmp_op op)
258f06ca4afSHartmut Brandt {
259f06ca4afSHartmut Brandt switch (op) {
260f06ca4afSHartmut Brandt
261f06ca4afSHartmut Brandt case SNMP_OP_GETNEXT:
262f06ca4afSHartmut Brandt abort();
263f06ca4afSHartmut Brandt
264f06ca4afSHartmut Brandt case SNMP_OP_GET:
265f06ca4afSHartmut Brandt break;
266f06ca4afSHartmut Brandt
267f06ca4afSHartmut Brandt case SNMP_OP_SET:
268f06ca4afSHartmut Brandt return (SNMP_ERR_NOT_WRITEABLE);
269f06ca4afSHartmut Brandt
270f06ca4afSHartmut Brandt case SNMP_OP_ROLLBACK:
271f06ca4afSHartmut Brandt case SNMP_OP_COMMIT:
272f06ca4afSHartmut Brandt abort();
273f06ca4afSHartmut Brandt }
274f06ca4afSHartmut Brandt
275f06ca4afSHartmut Brandt if (ipstat_tick < this_tick)
276f06ca4afSHartmut Brandt fetch_ipstat();
277f06ca4afSHartmut Brandt
278f06ca4afSHartmut Brandt switch (value->var.subs[sub - 1]) {
279f06ca4afSHartmut Brandt
280f06ca4afSHartmut Brandt case LEAF_ipInReceives:
281f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_total;
282f06ca4afSHartmut Brandt break;
283f06ca4afSHartmut Brandt
284f06ca4afSHartmut Brandt case LEAF_ipInHdrErrors:
285f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_badsum + ipstat.ips_tooshort
286f06ca4afSHartmut Brandt + ipstat.ips_toosmall + ipstat.ips_badhlen
287f06ca4afSHartmut Brandt + ipstat.ips_badlen + ipstat.ips_badvers +
288f06ca4afSHartmut Brandt + ipstat.ips_toolong;
289f06ca4afSHartmut Brandt break;
290f06ca4afSHartmut Brandt
291f06ca4afSHartmut Brandt case LEAF_ipInAddrErrors:
292f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_cantforward;
293f06ca4afSHartmut Brandt break;
294f06ca4afSHartmut Brandt
295f06ca4afSHartmut Brandt case LEAF_ipForwDatagrams:
296f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_forward;
297f06ca4afSHartmut Brandt break;
298f06ca4afSHartmut Brandt
299f06ca4afSHartmut Brandt case LEAF_ipInUnknownProtos:
300f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_noproto;
301f06ca4afSHartmut Brandt break;
302f06ca4afSHartmut Brandt
303f06ca4afSHartmut Brandt case LEAF_ipInDiscards:
304f06ca4afSHartmut Brandt value->v.uint32 = ip_idrop;
305f06ca4afSHartmut Brandt break;
306f06ca4afSHartmut Brandt
307f06ca4afSHartmut Brandt case LEAF_ipInDelivers:
308f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_delivered;
309f06ca4afSHartmut Brandt break;
310f06ca4afSHartmut Brandt
311f06ca4afSHartmut Brandt case LEAF_ipOutRequests:
312f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_localout;
313f06ca4afSHartmut Brandt break;
314f06ca4afSHartmut Brandt
315f06ca4afSHartmut Brandt case LEAF_ipOutDiscards:
316f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_odropped;
317f06ca4afSHartmut Brandt break;
318f06ca4afSHartmut Brandt
319f06ca4afSHartmut Brandt case LEAF_ipOutNoRoutes:
320f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_noroute;
321f06ca4afSHartmut Brandt break;
322f06ca4afSHartmut Brandt
323f06ca4afSHartmut Brandt case LEAF_ipReasmTimeout:
324*9d548124SGleb Smirnoff value->v.integer = ip_fragttl;
325f06ca4afSHartmut Brandt break;
326f06ca4afSHartmut Brandt
327f06ca4afSHartmut Brandt case LEAF_ipReasmReqds:
328f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_fragments;
329f06ca4afSHartmut Brandt break;
330f06ca4afSHartmut Brandt
331f06ca4afSHartmut Brandt case LEAF_ipReasmOKs:
332f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_reassembled;
333f06ca4afSHartmut Brandt break;
334f06ca4afSHartmut Brandt
335f06ca4afSHartmut Brandt case LEAF_ipReasmFails:
336f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_fragdropped
337f06ca4afSHartmut Brandt + ipstat.ips_fragtimeout;
338f06ca4afSHartmut Brandt break;
339f06ca4afSHartmut Brandt
340f06ca4afSHartmut Brandt case LEAF_ipFragOKs:
341f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_fragmented;
342f06ca4afSHartmut Brandt break;
343f06ca4afSHartmut Brandt
344f06ca4afSHartmut Brandt case LEAF_ipFragFails:
345f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_cantfrag;
346f06ca4afSHartmut Brandt break;
347f06ca4afSHartmut Brandt
348f06ca4afSHartmut Brandt case LEAF_ipFragCreates:
349f06ca4afSHartmut Brandt value->v.uint32 = ipstat.ips_ofragments;
350f06ca4afSHartmut Brandt break;
351f06ca4afSHartmut Brandt }
352f06ca4afSHartmut Brandt return (SNMP_ERR_NOERROR);
353f06ca4afSHartmut Brandt }
354f06ca4afSHartmut Brandt
355f06ca4afSHartmut Brandt /*
356f06ca4afSHartmut Brandt * READ-ONLY statistics icmp group.
357f06ca4afSHartmut Brandt */
358f06ca4afSHartmut Brandt int
op_icmpstat(struct snmp_context * ctx __unused,struct snmp_value * value,u_int sub,u_int idx __unused,enum snmp_op op)359f06ca4afSHartmut Brandt op_icmpstat(struct snmp_context *ctx __unused, struct snmp_value *value,
360f06ca4afSHartmut Brandt u_int sub, u_int idx __unused, enum snmp_op op)
361f06ca4afSHartmut Brandt {
362f06ca4afSHartmut Brandt u_int i;
363f06ca4afSHartmut Brandt
364f06ca4afSHartmut Brandt switch (op) {
365f06ca4afSHartmut Brandt
366f06ca4afSHartmut Brandt case SNMP_OP_GETNEXT:
367f06ca4afSHartmut Brandt abort();
368f06ca4afSHartmut Brandt
369f06ca4afSHartmut Brandt case SNMP_OP_GET:
370f06ca4afSHartmut Brandt break;
371f06ca4afSHartmut Brandt
372f06ca4afSHartmut Brandt case SNMP_OP_SET:
373f06ca4afSHartmut Brandt return (SNMP_ERR_NOT_WRITEABLE);
374f06ca4afSHartmut Brandt
375f06ca4afSHartmut Brandt case SNMP_OP_ROLLBACK:
376f06ca4afSHartmut Brandt case SNMP_OP_COMMIT:
377f06ca4afSHartmut Brandt abort();
378f06ca4afSHartmut Brandt }
379f06ca4afSHartmut Brandt
380f06ca4afSHartmut Brandt if (ipstat_tick < this_tick)
381f06ca4afSHartmut Brandt fetch_ipstat();
382f06ca4afSHartmut Brandt
383f06ca4afSHartmut Brandt switch (value->var.subs[sub - 1]) {
384f06ca4afSHartmut Brandt
385f06ca4afSHartmut Brandt case LEAF_icmpInMsgs:
386f06ca4afSHartmut Brandt value->v.integer = 0;
387f06ca4afSHartmut Brandt for (i = 0; i <= ICMP_MAXTYPE; i++)
388f06ca4afSHartmut Brandt value->v.integer += icmpstat.icps_inhist[i];
389f06ca4afSHartmut Brandt value->v.integer += icmpstat.icps_tooshort +
390f06ca4afSHartmut Brandt icmpstat.icps_checksum;
391f06ca4afSHartmut Brandt /* missing: bad type and packets on faith */
392f06ca4afSHartmut Brandt break;
393f06ca4afSHartmut Brandt
394f06ca4afSHartmut Brandt case LEAF_icmpInErrors:
395f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_tooshort +
396f06ca4afSHartmut Brandt icmpstat.icps_checksum +
397f06ca4afSHartmut Brandt icmpstat.icps_badlen +
398f06ca4afSHartmut Brandt icmpstat.icps_badcode +
399f06ca4afSHartmut Brandt icmpstat.icps_bmcastecho +
400f06ca4afSHartmut Brandt icmpstat.icps_bmcasttstamp;
401f06ca4afSHartmut Brandt break;
402f06ca4afSHartmut Brandt
403f06ca4afSHartmut Brandt case LEAF_icmpInDestUnreachs:
404f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_inhist[ICMP_UNREACH];
405f06ca4afSHartmut Brandt break;
406f06ca4afSHartmut Brandt
407f06ca4afSHartmut Brandt case LEAF_icmpInTimeExcds:
408f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_inhist[ICMP_TIMXCEED];
409f06ca4afSHartmut Brandt break;
410f06ca4afSHartmut Brandt
411f06ca4afSHartmut Brandt case LEAF_icmpInParmProbs:
412f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_inhist[ICMP_PARAMPROB];
413f06ca4afSHartmut Brandt break;
414f06ca4afSHartmut Brandt
415f06ca4afSHartmut Brandt case LEAF_icmpInSrcQuenchs:
416f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_inhist[ICMP_SOURCEQUENCH];
417f06ca4afSHartmut Brandt break;
418f06ca4afSHartmut Brandt
419f06ca4afSHartmut Brandt case LEAF_icmpInRedirects:
420f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_inhist[ICMP_REDIRECT];
421f06ca4afSHartmut Brandt break;
422f06ca4afSHartmut Brandt
423f06ca4afSHartmut Brandt case LEAF_icmpInEchos:
424f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_inhist[ICMP_ECHO];
425f06ca4afSHartmut Brandt break;
426f06ca4afSHartmut Brandt
427f06ca4afSHartmut Brandt case LEAF_icmpInEchoReps:
428f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_inhist[ICMP_ECHOREPLY];
429f06ca4afSHartmut Brandt break;
430f06ca4afSHartmut Brandt
431f06ca4afSHartmut Brandt case LEAF_icmpInTimestamps:
432f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_inhist[ICMP_TSTAMP];
433f06ca4afSHartmut Brandt break;
434f06ca4afSHartmut Brandt
435f06ca4afSHartmut Brandt case LEAF_icmpInTimestampReps:
436f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_inhist[ICMP_TSTAMPREPLY];
437f06ca4afSHartmut Brandt break;
438f06ca4afSHartmut Brandt
439f06ca4afSHartmut Brandt case LEAF_icmpInAddrMasks:
440f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_inhist[ICMP_MASKREQ];
441f06ca4afSHartmut Brandt break;
442f06ca4afSHartmut Brandt
443f06ca4afSHartmut Brandt case LEAF_icmpInAddrMaskReps:
444f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_inhist[ICMP_MASKREPLY];
445f06ca4afSHartmut Brandt break;
446f06ca4afSHartmut Brandt
447f06ca4afSHartmut Brandt case LEAF_icmpOutMsgs:
448f06ca4afSHartmut Brandt value->v.integer = 0;
449f06ca4afSHartmut Brandt for (i = 0; i <= ICMP_MAXTYPE; i++)
450f06ca4afSHartmut Brandt value->v.integer += icmpstat.icps_outhist[i];
451f06ca4afSHartmut Brandt value->v.integer += icmpstat.icps_badaddr +
452f06ca4afSHartmut Brandt icmpstat.icps_noroute;
453f06ca4afSHartmut Brandt break;
454f06ca4afSHartmut Brandt
455f06ca4afSHartmut Brandt case LEAF_icmpOutErrors:
456f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_badaddr +
457f06ca4afSHartmut Brandt icmpstat.icps_noroute;
458f06ca4afSHartmut Brandt break;
459f06ca4afSHartmut Brandt
460f06ca4afSHartmut Brandt case LEAF_icmpOutDestUnreachs:
461f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_outhist[ICMP_UNREACH];
462f06ca4afSHartmut Brandt break;
463f06ca4afSHartmut Brandt
464f06ca4afSHartmut Brandt case LEAF_icmpOutTimeExcds:
465f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_outhist[ICMP_TIMXCEED];
466f06ca4afSHartmut Brandt break;
467f06ca4afSHartmut Brandt
468f06ca4afSHartmut Brandt case LEAF_icmpOutParmProbs:
469f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_outhist[ICMP_PARAMPROB];
470f06ca4afSHartmut Brandt break;
471f06ca4afSHartmut Brandt
472f06ca4afSHartmut Brandt case LEAF_icmpOutSrcQuenchs:
473f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_outhist[ICMP_SOURCEQUENCH];
474f06ca4afSHartmut Brandt break;
475f06ca4afSHartmut Brandt
476f06ca4afSHartmut Brandt case LEAF_icmpOutRedirects:
477f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_outhist[ICMP_REDIRECT];
478f06ca4afSHartmut Brandt break;
479f06ca4afSHartmut Brandt
480f06ca4afSHartmut Brandt case LEAF_icmpOutEchos:
481f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_outhist[ICMP_ECHO];
482f06ca4afSHartmut Brandt break;
483f06ca4afSHartmut Brandt
484f06ca4afSHartmut Brandt case LEAF_icmpOutEchoReps:
485f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_outhist[ICMP_ECHOREPLY];
486f06ca4afSHartmut Brandt break;
487f06ca4afSHartmut Brandt
488f06ca4afSHartmut Brandt case LEAF_icmpOutTimestamps:
489f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_outhist[ICMP_TSTAMP];
490f06ca4afSHartmut Brandt break;
491f06ca4afSHartmut Brandt
492f06ca4afSHartmut Brandt case LEAF_icmpOutTimestampReps:
493f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_outhist[ICMP_TSTAMPREPLY];
494f06ca4afSHartmut Brandt break;
495f06ca4afSHartmut Brandt
496f06ca4afSHartmut Brandt case LEAF_icmpOutAddrMasks:
497f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_outhist[ICMP_MASKREQ];
498f06ca4afSHartmut Brandt break;
499f06ca4afSHartmut Brandt
500f06ca4afSHartmut Brandt case LEAF_icmpOutAddrMaskReps:
501f06ca4afSHartmut Brandt value->v.integer = icmpstat.icps_outhist[ICMP_MASKREPLY];
502f06ca4afSHartmut Brandt break;
503f06ca4afSHartmut Brandt }
504f06ca4afSHartmut Brandt return (SNMP_ERR_NOERROR);
505f06ca4afSHartmut Brandt }
506