xref: /freebsd/contrib/bsnmp/snmp_mibII/mibII_ip.c (revision 896052c10f33c29a53b63fc67d4c8238b87f5b3e)
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  *
29896052c1SHartmut Brandt  * $Begemot: bsnmp/snmp_mibII/mibII_ip.c,v 1.10 2004/08/06 08:47:01 brandt 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;
47896052c1SHartmut Brandt static uint32_t ip_tick;
48f06ca4afSHartmut Brandt 
49896052c1SHartmut Brandt static uint32_t ipstat_tick;
50f06ca4afSHartmut Brandt 
51f06ca4afSHartmut Brandt static int
52f06ca4afSHartmut Brandt fetch_ipstat(void)
53f06ca4afSHartmut Brandt {
54f06ca4afSHartmut Brandt 	size_t len;
55f06ca4afSHartmut Brandt 
56f06ca4afSHartmut Brandt 	len = sizeof(ipstat);
57f06ca4afSHartmut Brandt 	if (sysctlbyname("net.inet.ip.stats", &ipstat, &len, NULL, 0) == -1) {
58f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.ip.stats: %m");
59f06ca4afSHartmut Brandt 		return (-1);
60f06ca4afSHartmut Brandt 	}
61f06ca4afSHartmut Brandt 	if (len != sizeof(ipstat)) {
62f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.ip.stats: wrong size");
63f06ca4afSHartmut Brandt 		return (-1);
64f06ca4afSHartmut Brandt 	}
65f06ca4afSHartmut Brandt 	len = sizeof(ip_idrop);
66f06ca4afSHartmut Brandt 	if (sysctlbyname("net.inet.ip.intr_queue_drops", &ip_idrop, &len, NULL, 0) == -1)
67f06ca4afSHartmut Brandt 		syslog(LOG_WARNING, "net.inet.ip.intr_queue_drops: %m");
68f06ca4afSHartmut Brandt 	if (len != sizeof(ip_idrop)) {
69f06ca4afSHartmut Brandt 		syslog(LOG_WARNING, "net.inet.ip.intr_queue_drops: wrong size");
70f06ca4afSHartmut Brandt 		ip_idrop = 0;
71f06ca4afSHartmut Brandt 	}
72f06ca4afSHartmut Brandt 	len = sizeof(icmpstat);
73f06ca4afSHartmut Brandt 	if (sysctlbyname("net.inet.icmp.stats", &icmpstat, &len, NULL, 0) == -1) {
74f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.icmp.stats: %m");
75f06ca4afSHartmut Brandt 		return (-1);
76f06ca4afSHartmut Brandt 	}
77f06ca4afSHartmut Brandt 	if (len != sizeof(icmpstat)) {
78f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.icmp.stats: wrong size");
79f06ca4afSHartmut Brandt 		return (-1);
80f06ca4afSHartmut Brandt 	}
81f06ca4afSHartmut Brandt 
82f06ca4afSHartmut Brandt 	ipstat_tick = get_ticks();
83f06ca4afSHartmut Brandt 	return (0);
84f06ca4afSHartmut Brandt }
85f06ca4afSHartmut Brandt 
86f06ca4afSHartmut Brandt static int
87f06ca4afSHartmut Brandt fetch_ip(void)
88f06ca4afSHartmut Brandt {
89f06ca4afSHartmut Brandt 	size_t len;
90f06ca4afSHartmut Brandt 
91f06ca4afSHartmut Brandt 	len = sizeof(ip_forwarding);
92f06ca4afSHartmut Brandt 	if (sysctlbyname("net.inet.ip.forwarding", &ip_forwarding, &len,
93f06ca4afSHartmut Brandt 	    NULL, 0) == -1) {
94f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.ip.forwarding: %m");
95f06ca4afSHartmut Brandt 		return (-1);
96f06ca4afSHartmut Brandt 	}
97f06ca4afSHartmut Brandt 	if (len != sizeof(ip_forwarding)) {
98f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.ip.forwarding: wrong size");
99f06ca4afSHartmut Brandt 		return (-1);
100f06ca4afSHartmut Brandt 	}
101f06ca4afSHartmut Brandt 
102f06ca4afSHartmut Brandt 	len = sizeof(ip_defttl);
103f06ca4afSHartmut Brandt 	if (sysctlbyname("net.inet.ip.ttl", &ip_defttl, &len,
104f06ca4afSHartmut Brandt 	    NULL, 0) == -1) {
105f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.ip.ttl: %m");
106f06ca4afSHartmut Brandt 		return (-1);
107f06ca4afSHartmut Brandt 	}
108f06ca4afSHartmut Brandt 	if (len != sizeof(ip_defttl)) {
109f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.ip.ttl: wrong size");
110f06ca4afSHartmut Brandt 		return (-1);
111f06ca4afSHartmut Brandt 	}
112f06ca4afSHartmut Brandt 
113f06ca4afSHartmut Brandt 	ip_tick = get_ticks();
114f06ca4afSHartmut Brandt 	return (0);
115f06ca4afSHartmut Brandt }
116f06ca4afSHartmut Brandt 
117f06ca4afSHartmut Brandt static int
118f06ca4afSHartmut Brandt ip_forward(int forw, int *old)
119f06ca4afSHartmut Brandt {
120f06ca4afSHartmut Brandt 	size_t olen;
121f06ca4afSHartmut Brandt 
122f06ca4afSHartmut Brandt 	olen = sizeof(*old);
123f06ca4afSHartmut Brandt 	if (sysctlbyname("net.inet.ip.forwarding", old, old ? &olen : NULL,
124f06ca4afSHartmut Brandt 	    &forw, sizeof(forw)) == -1) {
125f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "set net.inet.ip.forwarding: %m");
126f06ca4afSHartmut Brandt 		return (-1);
127f06ca4afSHartmut Brandt 	}
128f06ca4afSHartmut Brandt 	ip_forwarding = forw;
129f06ca4afSHartmut Brandt 	return (0);
130f06ca4afSHartmut Brandt }
131f06ca4afSHartmut Brandt 
132f06ca4afSHartmut Brandt static int
133f06ca4afSHartmut Brandt ip_setttl(int ttl, int *old)
134f06ca4afSHartmut Brandt {
135f06ca4afSHartmut Brandt 	size_t olen;
136f06ca4afSHartmut Brandt 
137f06ca4afSHartmut Brandt 	olen = sizeof(*old);
138f06ca4afSHartmut Brandt 	if (sysctlbyname("net.inet.ip.ttl", old, old ? &olen : NULL,
139f06ca4afSHartmut Brandt 	    &ttl, sizeof(ttl)) == -1) {
140f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "set net.inet.ip.ttl: %m");
141f06ca4afSHartmut Brandt 		return (-1);
142f06ca4afSHartmut Brandt 	}
143f06ca4afSHartmut Brandt 	ip_defttl = ttl;
144f06ca4afSHartmut Brandt 	return (0);
145f06ca4afSHartmut Brandt }
146f06ca4afSHartmut Brandt 
147f06ca4afSHartmut Brandt /*
148f06ca4afSHartmut Brandt  * READ/WRITE ip group.
149f06ca4afSHartmut Brandt  */
150f06ca4afSHartmut Brandt int
151f06ca4afSHartmut Brandt op_ip(struct snmp_context *ctx, struct snmp_value *value,
152f06ca4afSHartmut Brandt     u_int sub, u_int idx __unused, enum snmp_op op)
153f06ca4afSHartmut Brandt {
154f06ca4afSHartmut Brandt 	int old;
155f06ca4afSHartmut Brandt 
156f06ca4afSHartmut Brandt 	switch (op) {
157f06ca4afSHartmut Brandt 
158f06ca4afSHartmut Brandt 	  case SNMP_OP_GETNEXT:
159f06ca4afSHartmut Brandt 		abort();
160f06ca4afSHartmut Brandt 
161f06ca4afSHartmut Brandt 	  case SNMP_OP_GET:
162f06ca4afSHartmut Brandt 		break;
163f06ca4afSHartmut Brandt 
164f06ca4afSHartmut Brandt 	  case SNMP_OP_SET:
165f06ca4afSHartmut Brandt 		if (ip_tick < this_tick)
166f06ca4afSHartmut Brandt 			if (fetch_ip() == -1)
167f06ca4afSHartmut Brandt 				return (SNMP_ERR_GENERR);
168f06ca4afSHartmut Brandt 
169f06ca4afSHartmut Brandt 		switch (value->var.subs[sub - 1]) {
170f06ca4afSHartmut Brandt 
171f06ca4afSHartmut Brandt 		  case LEAF_ipForwarding:
172f06ca4afSHartmut Brandt 			ctx->scratch->int1 = ip_forwarding ? 1 : 2;
173f06ca4afSHartmut Brandt 			ctx->scratch->int2 = value->v.integer;
174f06ca4afSHartmut Brandt 			if (value->v.integer == 1) {
175f06ca4afSHartmut Brandt 				if (!ip_forwarding && ip_forward(1, &old))
176f06ca4afSHartmut Brandt 					return (SNMP_ERR_GENERR);
177f06ca4afSHartmut Brandt 				ctx->scratch->int1 = old ? 1 : 2;
178f06ca4afSHartmut Brandt 			} else if (value->v.integer == 2) {
179f06ca4afSHartmut Brandt 				if (ip_forwarding && ip_forward(0, &old))
180f06ca4afSHartmut Brandt 					return (SNMP_ERR_GENERR);
181f06ca4afSHartmut Brandt 				ctx->scratch->int1 = old;
182f06ca4afSHartmut Brandt 			} else
183f06ca4afSHartmut Brandt 				return (SNMP_ERR_WRONG_VALUE);
184f06ca4afSHartmut Brandt 			break;
185f06ca4afSHartmut Brandt 
186f06ca4afSHartmut Brandt 		  case LEAF_ipDefaultTTL:
187f06ca4afSHartmut Brandt 			ctx->scratch->int1 = ip_defttl;
188f06ca4afSHartmut Brandt 			ctx->scratch->int2 = value->v.integer;
189f06ca4afSHartmut Brandt 			if (value->v.integer < 1 || value->v.integer > 255)
190f06ca4afSHartmut Brandt 				return (SNMP_ERR_WRONG_VALUE);
191f06ca4afSHartmut Brandt 			if (ip_defttl != value->v.integer &&
192f06ca4afSHartmut Brandt 			    ip_setttl(value->v.integer, &old))
193f06ca4afSHartmut Brandt 				return (SNMP_ERR_GENERR);
194f06ca4afSHartmut Brandt 			ctx->scratch->int1 = old;
195f06ca4afSHartmut Brandt 			break;
196f06ca4afSHartmut Brandt 		}
197f06ca4afSHartmut Brandt 		return (SNMP_ERR_NOERROR);
198f06ca4afSHartmut Brandt 
199f06ca4afSHartmut Brandt 	  case SNMP_OP_ROLLBACK:
200f06ca4afSHartmut Brandt 		switch (value->var.subs[sub - 1]) {
201f06ca4afSHartmut Brandt 
202f06ca4afSHartmut Brandt 		  case LEAF_ipForwarding:
203f06ca4afSHartmut Brandt 			if (ctx->scratch->int1 == 1) {
204f06ca4afSHartmut Brandt 				if (ctx->scratch->int2 == 2)
205f06ca4afSHartmut Brandt 					(void)ip_forward(1, NULL);
206f06ca4afSHartmut Brandt 			} else {
207f06ca4afSHartmut Brandt 				if (ctx->scratch->int2 == 1)
208f06ca4afSHartmut Brandt 					(void)ip_forward(0, NULL);
209f06ca4afSHartmut Brandt 			}
210f06ca4afSHartmut Brandt 			break;
211f06ca4afSHartmut Brandt 
212f06ca4afSHartmut Brandt 		  case LEAF_ipDefaultTTL:
213f06ca4afSHartmut Brandt 			if (ctx->scratch->int1 != ctx->scratch->int2)
214f06ca4afSHartmut Brandt 				(void)ip_setttl(ctx->scratch->int1, NULL);
215f06ca4afSHartmut Brandt 			break;
216f06ca4afSHartmut Brandt 		}
217f06ca4afSHartmut Brandt 		return (SNMP_ERR_NOERROR);
218f06ca4afSHartmut Brandt 
219f06ca4afSHartmut Brandt 	  case SNMP_OP_COMMIT:
220f06ca4afSHartmut Brandt 		return (SNMP_ERR_NOERROR);
221f06ca4afSHartmut Brandt 	}
222f06ca4afSHartmut Brandt 
223f06ca4afSHartmut Brandt 	if (ip_tick < this_tick)
224f06ca4afSHartmut Brandt 		if (fetch_ip() == -1)
225f06ca4afSHartmut Brandt 			return (SNMP_ERR_GENERR);
226f06ca4afSHartmut Brandt 
227f06ca4afSHartmut Brandt 	switch (value->var.subs[sub - 1]) {
228f06ca4afSHartmut Brandt 
229f06ca4afSHartmut Brandt 	  case LEAF_ipForwarding:
230f06ca4afSHartmut Brandt 		value->v.integer = ip_forwarding ? 1 : 2;
231f06ca4afSHartmut Brandt 		break;
232f06ca4afSHartmut Brandt 
233f06ca4afSHartmut Brandt 	  case LEAF_ipDefaultTTL:
234f06ca4afSHartmut Brandt 		value->v.integer = ip_defttl;
235f06ca4afSHartmut Brandt 		break;
236f06ca4afSHartmut Brandt 	}
237f06ca4afSHartmut Brandt 	return (SNMP_ERR_NOERROR);
238f06ca4afSHartmut Brandt }
239f06ca4afSHartmut Brandt 
240f06ca4afSHartmut Brandt /*
241f06ca4afSHartmut Brandt  * READ-ONLY statistics ip group.
242f06ca4afSHartmut Brandt  */
243f06ca4afSHartmut Brandt int
244f06ca4afSHartmut Brandt op_ipstat(struct snmp_context *ctx __unused, struct snmp_value *value,
245f06ca4afSHartmut Brandt     u_int sub, u_int idx __unused, enum snmp_op op)
246f06ca4afSHartmut Brandt {
247f06ca4afSHartmut Brandt 	switch (op) {
248f06ca4afSHartmut Brandt 
249f06ca4afSHartmut Brandt 	  case SNMP_OP_GETNEXT:
250f06ca4afSHartmut Brandt 		abort();
251f06ca4afSHartmut Brandt 
252f06ca4afSHartmut Brandt 	  case SNMP_OP_GET:
253f06ca4afSHartmut Brandt 		break;
254f06ca4afSHartmut Brandt 
255f06ca4afSHartmut Brandt 	  case SNMP_OP_SET:
256f06ca4afSHartmut Brandt 		return (SNMP_ERR_NOT_WRITEABLE);
257f06ca4afSHartmut Brandt 
258f06ca4afSHartmut Brandt 	  case SNMP_OP_ROLLBACK:
259f06ca4afSHartmut Brandt 	  case SNMP_OP_COMMIT:
260f06ca4afSHartmut Brandt 		abort();
261f06ca4afSHartmut Brandt 	}
262f06ca4afSHartmut Brandt 
263f06ca4afSHartmut Brandt 	if (ipstat_tick < this_tick)
264f06ca4afSHartmut Brandt 		fetch_ipstat();
265f06ca4afSHartmut Brandt 
266f06ca4afSHartmut Brandt 	switch (value->var.subs[sub - 1]) {
267f06ca4afSHartmut Brandt 
268f06ca4afSHartmut Brandt 	  case LEAF_ipInReceives:
269f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_total;
270f06ca4afSHartmut Brandt 		break;
271f06ca4afSHartmut Brandt 
272f06ca4afSHartmut Brandt 	  case LEAF_ipInHdrErrors:
273f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_badsum + ipstat.ips_tooshort
274f06ca4afSHartmut Brandt 		    + ipstat.ips_toosmall + ipstat.ips_badhlen
275f06ca4afSHartmut Brandt 		    + ipstat.ips_badlen + ipstat.ips_badvers +
276f06ca4afSHartmut Brandt 		    + ipstat.ips_toolong;
277f06ca4afSHartmut Brandt 		break;
278f06ca4afSHartmut Brandt 
279f06ca4afSHartmut Brandt 	  case LEAF_ipInAddrErrors:
280f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_cantforward;
281f06ca4afSHartmut Brandt 		break;
282f06ca4afSHartmut Brandt 
283f06ca4afSHartmut Brandt 	  case LEAF_ipForwDatagrams:
284f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_forward;
285f06ca4afSHartmut Brandt 		break;
286f06ca4afSHartmut Brandt 
287f06ca4afSHartmut Brandt 	  case LEAF_ipInUnknownProtos:
288f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_noproto;
289f06ca4afSHartmut Brandt 		break;
290f06ca4afSHartmut Brandt 
291f06ca4afSHartmut Brandt 	  case LEAF_ipInDiscards:
292f06ca4afSHartmut Brandt 		value->v.uint32 = ip_idrop;
293f06ca4afSHartmut Brandt 		break;
294f06ca4afSHartmut Brandt 
295f06ca4afSHartmut Brandt 	  case LEAF_ipInDelivers:
296f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_delivered;
297f06ca4afSHartmut Brandt 		break;
298f06ca4afSHartmut Brandt 
299f06ca4afSHartmut Brandt 	  case LEAF_ipOutRequests:
300f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_localout;
301f06ca4afSHartmut Brandt 		break;
302f06ca4afSHartmut Brandt 
303f06ca4afSHartmut Brandt 	  case LEAF_ipOutDiscards:
304f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_odropped;
305f06ca4afSHartmut Brandt 		break;
306f06ca4afSHartmut Brandt 
307f06ca4afSHartmut Brandt 	  case LEAF_ipOutNoRoutes:
308f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_noroute;
309f06ca4afSHartmut Brandt 		break;
310f06ca4afSHartmut Brandt 
311f06ca4afSHartmut Brandt 	  case LEAF_ipReasmTimeout:
312f06ca4afSHartmut Brandt 		value->v.integer = IPFRAGTTL;
313f06ca4afSHartmut Brandt 		break;
314f06ca4afSHartmut Brandt 
315f06ca4afSHartmut Brandt 	  case LEAF_ipReasmReqds:
316f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_fragments;
317f06ca4afSHartmut Brandt 		break;
318f06ca4afSHartmut Brandt 
319f06ca4afSHartmut Brandt 	  case LEAF_ipReasmOKs:
320f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_reassembled;
321f06ca4afSHartmut Brandt 		break;
322f06ca4afSHartmut Brandt 
323f06ca4afSHartmut Brandt 	  case LEAF_ipReasmFails:
324f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_fragdropped
325f06ca4afSHartmut Brandt 		    + ipstat.ips_fragtimeout;
326f06ca4afSHartmut Brandt 		break;
327f06ca4afSHartmut Brandt 
328f06ca4afSHartmut Brandt 	  case LEAF_ipFragOKs:
329f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_fragmented;
330f06ca4afSHartmut Brandt 		break;
331f06ca4afSHartmut Brandt 
332f06ca4afSHartmut Brandt 	  case LEAF_ipFragFails:
333f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_cantfrag;
334f06ca4afSHartmut Brandt 		break;
335f06ca4afSHartmut Brandt 
336f06ca4afSHartmut Brandt 	  case LEAF_ipFragCreates:
337f06ca4afSHartmut Brandt 		value->v.uint32 = ipstat.ips_ofragments;
338f06ca4afSHartmut Brandt 		break;
339f06ca4afSHartmut Brandt 	}
340f06ca4afSHartmut Brandt 	return (SNMP_ERR_NOERROR);
341f06ca4afSHartmut Brandt }
342f06ca4afSHartmut Brandt 
343f06ca4afSHartmut Brandt /*
344f06ca4afSHartmut Brandt  * READ-ONLY statistics icmp group.
345f06ca4afSHartmut Brandt  */
346f06ca4afSHartmut Brandt int
347f06ca4afSHartmut Brandt op_icmpstat(struct snmp_context *ctx __unused, struct snmp_value *value,
348f06ca4afSHartmut Brandt     u_int sub, u_int idx __unused, enum snmp_op op)
349f06ca4afSHartmut Brandt {
350f06ca4afSHartmut Brandt 	u_int i;
351f06ca4afSHartmut Brandt 
352f06ca4afSHartmut Brandt 	switch (op) {
353f06ca4afSHartmut Brandt 
354f06ca4afSHartmut Brandt 	  case SNMP_OP_GETNEXT:
355f06ca4afSHartmut Brandt 		abort();
356f06ca4afSHartmut Brandt 
357f06ca4afSHartmut Brandt 	  case SNMP_OP_GET:
358f06ca4afSHartmut Brandt 		break;
359f06ca4afSHartmut Brandt 
360f06ca4afSHartmut Brandt 	  case SNMP_OP_SET:
361f06ca4afSHartmut Brandt 		return (SNMP_ERR_NOT_WRITEABLE);
362f06ca4afSHartmut Brandt 
363f06ca4afSHartmut Brandt 	  case SNMP_OP_ROLLBACK:
364f06ca4afSHartmut Brandt 	  case SNMP_OP_COMMIT:
365f06ca4afSHartmut Brandt 		abort();
366f06ca4afSHartmut Brandt 	}
367f06ca4afSHartmut Brandt 
368f06ca4afSHartmut Brandt 	if (ipstat_tick < this_tick)
369f06ca4afSHartmut Brandt 		fetch_ipstat();
370f06ca4afSHartmut Brandt 
371f06ca4afSHartmut Brandt 	switch (value->var.subs[sub - 1]) {
372f06ca4afSHartmut Brandt 
373f06ca4afSHartmut Brandt 	  case LEAF_icmpInMsgs:
374f06ca4afSHartmut Brandt 		value->v.integer = 0;
375f06ca4afSHartmut Brandt 		for (i = 0; i <= ICMP_MAXTYPE; i++)
376f06ca4afSHartmut Brandt 			value->v.integer += icmpstat.icps_inhist[i];
377f06ca4afSHartmut Brandt 		value->v.integer += icmpstat.icps_tooshort +
378f06ca4afSHartmut Brandt 		    icmpstat.icps_checksum;
379f06ca4afSHartmut Brandt 		/* missing: bad type and packets on faith */
380f06ca4afSHartmut Brandt 		break;
381f06ca4afSHartmut Brandt 
382f06ca4afSHartmut Brandt 	  case LEAF_icmpInErrors:
383f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_tooshort +
384f06ca4afSHartmut Brandt 		    icmpstat.icps_checksum +
385f06ca4afSHartmut Brandt 		    icmpstat.icps_badlen +
386f06ca4afSHartmut Brandt 		    icmpstat.icps_badcode +
387f06ca4afSHartmut Brandt 		    icmpstat.icps_bmcastecho +
388f06ca4afSHartmut Brandt 		    icmpstat.icps_bmcasttstamp;
389f06ca4afSHartmut Brandt 		break;
390f06ca4afSHartmut Brandt 
391f06ca4afSHartmut Brandt 	  case LEAF_icmpInDestUnreachs:
392f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_inhist[ICMP_UNREACH];
393f06ca4afSHartmut Brandt 		break;
394f06ca4afSHartmut Brandt 
395f06ca4afSHartmut Brandt 	  case LEAF_icmpInTimeExcds:
396f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_inhist[ICMP_TIMXCEED];
397f06ca4afSHartmut Brandt 		break;
398f06ca4afSHartmut Brandt 
399f06ca4afSHartmut Brandt 	  case LEAF_icmpInParmProbs:
400f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_inhist[ICMP_PARAMPROB];
401f06ca4afSHartmut Brandt 		break;
402f06ca4afSHartmut Brandt 
403f06ca4afSHartmut Brandt 	  case LEAF_icmpInSrcQuenchs:
404f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_inhist[ICMP_SOURCEQUENCH];
405f06ca4afSHartmut Brandt 		break;
406f06ca4afSHartmut Brandt 
407f06ca4afSHartmut Brandt 	  case LEAF_icmpInRedirects:
408f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_inhist[ICMP_REDIRECT];
409f06ca4afSHartmut Brandt 		break;
410f06ca4afSHartmut Brandt 
411f06ca4afSHartmut Brandt 	  case LEAF_icmpInEchos:
412f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_inhist[ICMP_ECHO];
413f06ca4afSHartmut Brandt 		break;
414f06ca4afSHartmut Brandt 
415f06ca4afSHartmut Brandt 	  case LEAF_icmpInEchoReps:
416f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_inhist[ICMP_ECHOREPLY];
417f06ca4afSHartmut Brandt 		break;
418f06ca4afSHartmut Brandt 
419f06ca4afSHartmut Brandt 	  case LEAF_icmpInTimestamps:
420f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_inhist[ICMP_TSTAMP];
421f06ca4afSHartmut Brandt 		break;
422f06ca4afSHartmut Brandt 
423f06ca4afSHartmut Brandt 	  case LEAF_icmpInTimestampReps:
424f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_inhist[ICMP_TSTAMPREPLY];
425f06ca4afSHartmut Brandt 		break;
426f06ca4afSHartmut Brandt 
427f06ca4afSHartmut Brandt 	  case LEAF_icmpInAddrMasks:
428f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_inhist[ICMP_MASKREQ];
429f06ca4afSHartmut Brandt 		break;
430f06ca4afSHartmut Brandt 
431f06ca4afSHartmut Brandt 	  case LEAF_icmpInAddrMaskReps:
432f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_inhist[ICMP_MASKREPLY];
433f06ca4afSHartmut Brandt 		break;
434f06ca4afSHartmut Brandt 
435f06ca4afSHartmut Brandt 	  case LEAF_icmpOutMsgs:
436f06ca4afSHartmut Brandt 		value->v.integer = 0;
437f06ca4afSHartmut Brandt 		for (i = 0; i <= ICMP_MAXTYPE; i++)
438f06ca4afSHartmut Brandt 			value->v.integer += icmpstat.icps_outhist[i];
439f06ca4afSHartmut Brandt 		value->v.integer += icmpstat.icps_badaddr +
440f06ca4afSHartmut Brandt 		    icmpstat.icps_noroute;
441f06ca4afSHartmut Brandt 		break;
442f06ca4afSHartmut Brandt 
443f06ca4afSHartmut Brandt 	  case LEAF_icmpOutErrors:
444f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_badaddr +
445f06ca4afSHartmut Brandt 		    icmpstat.icps_noroute;
446f06ca4afSHartmut Brandt 		break;
447f06ca4afSHartmut Brandt 
448f06ca4afSHartmut Brandt 	  case LEAF_icmpOutDestUnreachs:
449f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_outhist[ICMP_UNREACH];
450f06ca4afSHartmut Brandt 		break;
451f06ca4afSHartmut Brandt 
452f06ca4afSHartmut Brandt 	  case LEAF_icmpOutTimeExcds:
453f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_outhist[ICMP_TIMXCEED];
454f06ca4afSHartmut Brandt 		break;
455f06ca4afSHartmut Brandt 
456f06ca4afSHartmut Brandt 	  case LEAF_icmpOutParmProbs:
457f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_outhist[ICMP_PARAMPROB];
458f06ca4afSHartmut Brandt 		break;
459f06ca4afSHartmut Brandt 
460f06ca4afSHartmut Brandt 	  case LEAF_icmpOutSrcQuenchs:
461f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_outhist[ICMP_SOURCEQUENCH];
462f06ca4afSHartmut Brandt 		break;
463f06ca4afSHartmut Brandt 
464f06ca4afSHartmut Brandt 	  case LEAF_icmpOutRedirects:
465f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_outhist[ICMP_REDIRECT];
466f06ca4afSHartmut Brandt 		break;
467f06ca4afSHartmut Brandt 
468f06ca4afSHartmut Brandt 	  case LEAF_icmpOutEchos:
469f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_outhist[ICMP_ECHO];
470f06ca4afSHartmut Brandt 		break;
471f06ca4afSHartmut Brandt 
472f06ca4afSHartmut Brandt 	  case LEAF_icmpOutEchoReps:
473f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_outhist[ICMP_ECHOREPLY];
474f06ca4afSHartmut Brandt 		break;
475f06ca4afSHartmut Brandt 
476f06ca4afSHartmut Brandt 	  case LEAF_icmpOutTimestamps:
477f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_outhist[ICMP_TSTAMP];
478f06ca4afSHartmut Brandt 		break;
479f06ca4afSHartmut Brandt 
480f06ca4afSHartmut Brandt 	  case LEAF_icmpOutTimestampReps:
481f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_outhist[ICMP_TSTAMPREPLY];
482f06ca4afSHartmut Brandt 		break;
483f06ca4afSHartmut Brandt 
484f06ca4afSHartmut Brandt 	  case LEAF_icmpOutAddrMasks:
485f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_outhist[ICMP_MASKREQ];
486f06ca4afSHartmut Brandt 		break;
487f06ca4afSHartmut Brandt 
488f06ca4afSHartmut Brandt 	  case LEAF_icmpOutAddrMaskReps:
489f06ca4afSHartmut Brandt 		value->v.integer = icmpstat.icps_outhist[ICMP_MASKREPLY];
490f06ca4afSHartmut Brandt 		break;
491f06ca4afSHartmut Brandt 	}
492f06ca4afSHartmut Brandt 	return (SNMP_ERR_NOERROR);
493f06ca4afSHartmut Brandt }
494