xref: /freebsd/contrib/bsnmp/snmp_mibII/mibII_ip.c (revision 9d54812421274e490dc5f0fe4722ab8d35d9b258)
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