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