1 /** 2 * @file 3 * Management Information Base II (RFC1213) SNMP objects and functions. 4 */ 5 6 /* 7 * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without modification, 11 * are permitted provided that the following conditions are met: 12 * 13 * 1. Redistributions of source code must retain the above copyright notice, 14 * this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright notice, 16 * this list of conditions and the following disclaimer in the documentation 17 * and/or other materials provided with the distribution. 18 * 3. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 24 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 26 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 30 * OF SUCH DAMAGE. 31 * 32 * Author: Dirk Ziegelmeier <dziegel@gmx.de> 33 * Christiaan Simons <christiaan.simons@axon.tv> 34 */ 35 36 #include "lwip/snmp.h" 37 #include "lwip/apps/snmp.h" 38 #include "lwip/apps/snmp_core.h" 39 #include "lwip/apps/snmp_mib2.h" 40 #include "lwip/apps/snmp_scalar.h" 41 42 #if LWIP_SNMP && SNMP_LWIP_MIB2 43 44 #define MIB2_AUTH_TRAPS_ENABLED 1 45 #define MIB2_AUTH_TRAPS_DISABLED 2 46 47 /* --- snmp .1.3.6.1.2.1.11 ----------------------------------------------------- */ 48 static s16_t 49 snmp_get_value(const struct snmp_scalar_array_node_def *node, void *value) 50 { 51 u32_t *uint_ptr = (u32_t*)value; 52 switch (node->oid) { 53 case 1: /* snmpInPkts */ 54 *uint_ptr = snmp_stats.inpkts; 55 break; 56 case 2: /* snmpOutPkts */ 57 *uint_ptr = snmp_stats.outpkts; 58 break; 59 case 3: /* snmpInBadVersions */ 60 *uint_ptr = snmp_stats.inbadversions; 61 break; 62 case 4: /* snmpInBadCommunityNames */ 63 *uint_ptr = snmp_stats.inbadcommunitynames; 64 break; 65 case 5: /* snmpInBadCommunityUses */ 66 *uint_ptr = snmp_stats.inbadcommunityuses; 67 break; 68 case 6: /* snmpInASNParseErrs */ 69 *uint_ptr = snmp_stats.inasnparseerrs; 70 break; 71 case 8: /* snmpInTooBigs */ 72 *uint_ptr = snmp_stats.intoobigs; 73 break; 74 case 9: /* snmpInNoSuchNames */ 75 *uint_ptr = snmp_stats.innosuchnames; 76 break; 77 case 10: /* snmpInBadValues */ 78 *uint_ptr = snmp_stats.inbadvalues; 79 break; 80 case 11: /* snmpInReadOnlys */ 81 *uint_ptr = snmp_stats.inreadonlys; 82 break; 83 case 12: /* snmpInGenErrs */ 84 *uint_ptr = snmp_stats.ingenerrs; 85 break; 86 case 13: /* snmpInTotalReqVars */ 87 *uint_ptr = snmp_stats.intotalreqvars; 88 break; 89 case 14: /* snmpInTotalSetVars */ 90 *uint_ptr = snmp_stats.intotalsetvars; 91 break; 92 case 15: /* snmpInGetRequests */ 93 *uint_ptr = snmp_stats.ingetrequests; 94 break; 95 case 16: /* snmpInGetNexts */ 96 *uint_ptr = snmp_stats.ingetnexts; 97 break; 98 case 17: /* snmpInSetRequests */ 99 *uint_ptr = snmp_stats.insetrequests; 100 break; 101 case 18: /* snmpInGetResponses */ 102 *uint_ptr = snmp_stats.ingetresponses; 103 break; 104 case 19: /* snmpInTraps */ 105 *uint_ptr = snmp_stats.intraps; 106 break; 107 case 20: /* snmpOutTooBigs */ 108 *uint_ptr = snmp_stats.outtoobigs; 109 break; 110 case 21: /* snmpOutNoSuchNames */ 111 *uint_ptr = snmp_stats.outnosuchnames; 112 break; 113 case 22: /* snmpOutBadValues */ 114 *uint_ptr = snmp_stats.outbadvalues; 115 break; 116 case 24: /* snmpOutGenErrs */ 117 *uint_ptr = snmp_stats.outgenerrs; 118 break; 119 case 25: /* snmpOutGetRequests */ 120 *uint_ptr = snmp_stats.outgetrequests; 121 break; 122 case 26: /* snmpOutGetNexts */ 123 *uint_ptr = snmp_stats.outgetnexts; 124 break; 125 case 27: /* snmpOutSetRequests */ 126 *uint_ptr = snmp_stats.outsetrequests; 127 break; 128 case 28: /* snmpOutGetResponses */ 129 *uint_ptr = snmp_stats.outgetresponses; 130 break; 131 case 29: /* snmpOutTraps */ 132 *uint_ptr = snmp_stats.outtraps; 133 break; 134 case 30: /* snmpEnableAuthenTraps */ 135 if (snmp_get_auth_traps_enabled() == SNMP_AUTH_TRAPS_DISABLED) { 136 *uint_ptr = MIB2_AUTH_TRAPS_DISABLED; 137 } else { 138 *uint_ptr = MIB2_AUTH_TRAPS_ENABLED; 139 } 140 break; 141 case 31: /* snmpSilentDrops */ 142 *uint_ptr = 0; /* not supported */ 143 break; 144 case 32: /* snmpProxyDrops */ 145 *uint_ptr = 0; /* not supported */ 146 break; 147 default: 148 LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_value(): unknown id: %"S32_F"\n", node->oid)); 149 return 0; 150 } 151 152 return sizeof(*uint_ptr); 153 } 154 155 static snmp_err_t 156 snmp_set_test(const struct snmp_scalar_array_node_def *node, u16_t len, void *value) 157 { 158 snmp_err_t ret = SNMP_ERR_WRONGVALUE; 159 LWIP_UNUSED_ARG(len); 160 161 if (node->oid == 30) { 162 /* snmpEnableAuthenTraps */ 163 s32_t *sint_ptr = (s32_t*)value; 164 165 /* we should have writable non-volatile mem here */ 166 if ((*sint_ptr == MIB2_AUTH_TRAPS_DISABLED) || (*sint_ptr == MIB2_AUTH_TRAPS_ENABLED)) { 167 ret = SNMP_ERR_NOERROR; 168 } 169 } 170 return ret; 171 } 172 173 static snmp_err_t 174 snmp_set_value(const struct snmp_scalar_array_node_def *node, u16_t len, void *value) 175 { 176 LWIP_UNUSED_ARG(len); 177 178 if (node->oid == 30) { 179 /* snmpEnableAuthenTraps */ 180 s32_t *sint_ptr = (s32_t*)value; 181 if (*sint_ptr == MIB2_AUTH_TRAPS_DISABLED) { 182 snmp_set_auth_traps_enabled(SNMP_AUTH_TRAPS_DISABLED); 183 } else { 184 snmp_set_auth_traps_enabled(SNMP_AUTH_TRAPS_ENABLED); 185 } 186 } 187 188 return SNMP_ERR_NOERROR; 189 } 190 191 /* the following nodes access variables in SNMP stack (snmp_stats) from SNMP worker thread -> OK, no sync needed */ 192 static const struct snmp_scalar_array_node_def snmp_nodes[] = { 193 { 1, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInPkts */ 194 { 2, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpOutPkts */ 195 { 3, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInBadVersions */ 196 { 4, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInBadCommunityNames */ 197 { 5, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInBadCommunityUses */ 198 { 6, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInASNParseErrs */ 199 { 8, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInTooBigs */ 200 { 9, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInNoSuchNames */ 201 {10, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInBadValues */ 202 {11, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInReadOnlys */ 203 {12, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInGenErrs */ 204 {13, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInTotalReqVars */ 205 {14, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInTotalSetVars */ 206 {15, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInGetRequests */ 207 {16, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInGetNexts */ 208 {17, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInSetRequests */ 209 {18, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInGetResponses */ 210 {19, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpInTraps */ 211 {20, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpOutTooBigs */ 212 {21, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpOutNoSuchNames */ 213 {22, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpOutBadValues */ 214 {24, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpOutGenErrs */ 215 {25, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpOutGetRequests */ 216 {26, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpOutGetNexts */ 217 {27, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpOutSetRequests */ 218 {28, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpOutGetResponses */ 219 {29, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpOutTraps */ 220 {30, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE}, /* snmpEnableAuthenTraps */ 221 {31, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpSilentDrops */ 222 {32, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY} /* snmpProxyDrops */ 223 }; 224 225 const struct snmp_scalar_array_node snmp_mib2_snmp_root = SNMP_SCALAR_CREATE_ARRAY_NODE(11, snmp_nodes, snmp_get_value, snmp_set_test, snmp_set_value); 226 227 #endif /* LWIP_SNMP && SNMP_LWIP_MIB2 */ 228