First step: AutoIP compiled in and working

Dependencies:   mbed

Committer:
darran
Date:
Fri Jun 18 15:54:21 2010 +0000
Revision:
1:4218cacaf696
Parent:
0:55a05330f8cc

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
darran 0:55a05330f8cc 1 /**
darran 0:55a05330f8cc 2 * @file
darran 0:55a05330f8cc 3 * Management Information Base II (RFC1213) objects and functions.
darran 0:55a05330f8cc 4 *
darran 0:55a05330f8cc 5 * @note the object identifiers for this MIB-2 and private MIB tree
darran 0:55a05330f8cc 6 * must be kept in sorted ascending order. This to ensure correct getnext operation.
darran 0:55a05330f8cc 7 */
darran 0:55a05330f8cc 8
darran 0:55a05330f8cc 9 /*
darran 0:55a05330f8cc 10 * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
darran 0:55a05330f8cc 11 * All rights reserved.
darran 0:55a05330f8cc 12 *
darran 0:55a05330f8cc 13 * Redistribution and use in source and binary forms, with or without modification,
darran 0:55a05330f8cc 14 * are permitted provided that the following conditions are met:
darran 0:55a05330f8cc 15 *
darran 0:55a05330f8cc 16 * 1. Redistributions of source code must retain the above copyright notice,
darran 0:55a05330f8cc 17 * this list of conditions and the following disclaimer.
darran 0:55a05330f8cc 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
darran 0:55a05330f8cc 19 * this list of conditions and the following disclaimer in the documentation
darran 0:55a05330f8cc 20 * and/or other materials provided with the distribution.
darran 0:55a05330f8cc 21 * 3. The name of the author may not be used to endorse or promote products
darran 0:55a05330f8cc 22 * derived from this software without specific prior written permission.
darran 0:55a05330f8cc 23 *
darran 0:55a05330f8cc 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
darran 0:55a05330f8cc 25 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
darran 0:55a05330f8cc 26 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
darran 0:55a05330f8cc 27 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
darran 0:55a05330f8cc 28 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
darran 0:55a05330f8cc 29 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
darran 0:55a05330f8cc 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
darran 0:55a05330f8cc 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
darran 0:55a05330f8cc 32 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
darran 0:55a05330f8cc 33 * OF SUCH DAMAGE.
darran 0:55a05330f8cc 34 *
darran 0:55a05330f8cc 35 * Author: Christiaan Simons <christiaan.simons@axon.tv>
darran 0:55a05330f8cc 36 */
darran 0:55a05330f8cc 37
darran 0:55a05330f8cc 38 #include "lwip/opt.h"
darran 0:55a05330f8cc 39
darran 0:55a05330f8cc 40 #if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
darran 0:55a05330f8cc 41
darran 0:55a05330f8cc 42 #include "lwip/snmp.h"
darran 0:55a05330f8cc 43 #include "lwip/netif.h"
darran 0:55a05330f8cc 44 #include "lwip/ip.h"
darran 0:55a05330f8cc 45 #include "lwip/ip_frag.h"
darran 0:55a05330f8cc 46 #include "lwip/tcp_impl.h"
darran 0:55a05330f8cc 47 #include "lwip/udp.h"
darran 0:55a05330f8cc 48 #include "lwip/snmp_asn1.h"
darran 0:55a05330f8cc 49 #include "lwip/snmp_structs.h"
darran 0:55a05330f8cc 50 #include "netif/etharp.h"
darran 0:55a05330f8cc 51
darran 0:55a05330f8cc 52 /**
darran 0:55a05330f8cc 53 * IANA assigned enterprise ID for lwIP is 26381
darran 0:55a05330f8cc 54 * @see http://www.iana.org/assignments/enterprise-numbers
darran 0:55a05330f8cc 55 *
darran 0:55a05330f8cc 56 * @note this enterprise ID is assigned to the lwIP project,
darran 0:55a05330f8cc 57 * all object identifiers living under this ID are assigned
darran 0:55a05330f8cc 58 * by the lwIP maintainers (contact Christiaan Simons)!
darran 0:55a05330f8cc 59 * @note don't change this define, use snmp_set_sysobjid()
darran 0:55a05330f8cc 60 *
darran 0:55a05330f8cc 61 * If you need to create your own private MIB you'll need
darran 0:55a05330f8cc 62 * to apply for your own enterprise ID with IANA:
darran 0:55a05330f8cc 63 * http://www.iana.org/numbers.html
darran 0:55a05330f8cc 64 */
darran 0:55a05330f8cc 65 #define SNMP_ENTERPRISE_ID 26381
darran 0:55a05330f8cc 66 #define SNMP_SYSOBJID_LEN 7
darran 0:55a05330f8cc 67 #define SNMP_SYSOBJID {1, 3, 6, 1, 4, 1, SNMP_ENTERPRISE_ID}
darran 0:55a05330f8cc 68
darran 0:55a05330f8cc 69 #ifndef SNMP_SYSSERVICES
darran 0:55a05330f8cc 70 #define SNMP_SYSSERVICES ((1 << 6) | (1 << 3) | ((IP_FORWARD) << 2))
darran 0:55a05330f8cc 71 #endif
darran 0:55a05330f8cc 72
darran 0:55a05330f8cc 73 #ifndef SNMP_GET_SYSUPTIME
darran 0:55a05330f8cc 74 #define SNMP_GET_SYSUPTIME(sysuptime)
darran 0:55a05330f8cc 75 #endif
darran 0:55a05330f8cc 76
darran 0:55a05330f8cc 77 static void system_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 78 static void system_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 79 static u8_t system_set_test(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 80 static void system_set_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 81 static void interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 82 static void interfaces_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 83 static void ifentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 84 static void ifentry_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 85 #if !SNMP_SAFE_REQUESTS
darran 0:55a05330f8cc 86 static u8_t ifentry_set_test (struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 87 static void ifentry_set_value (struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 88 #endif /* SNMP_SAFE_REQUESTS */
darran 0:55a05330f8cc 89 static void atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 90 static void atentry_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 91 static void ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 92 static void ip_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 93 static u8_t ip_set_test(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 94 static void ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 95 static void ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 96 static void ip_rteentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 97 static void ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 98 static void ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 99 static void ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 100 static void icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 101 static void icmp_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 102 #if LWIP_TCP
darran 0:55a05330f8cc 103 static void tcp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 104 static void tcp_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 105 #ifdef THIS_SEEMS_UNUSED
darran 0:55a05330f8cc 106 static void tcpconnentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 107 static void tcpconnentry_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 108 #endif
darran 0:55a05330f8cc 109 #endif
darran 0:55a05330f8cc 110 static void udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 111 static void udp_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 112 static void udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 113 static void udpentry_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 114 static void snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
darran 0:55a05330f8cc 115 static void snmp_get_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 116 static u8_t snmp_set_test(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 117 static void snmp_set_value(struct obj_def *od, u16_t len, void *value);
darran 0:55a05330f8cc 118
darran 0:55a05330f8cc 119
darran 0:55a05330f8cc 120 /* snmp .1.3.6.1.2.1.11 */
darran 0:55a05330f8cc 121 const mib_scalar_node snmp_scalar = {
darran 0:55a05330f8cc 122 &snmp_get_object_def,
darran 0:55a05330f8cc 123 &snmp_get_value,
darran 0:55a05330f8cc 124 &snmp_set_test,
darran 0:55a05330f8cc 125 &snmp_set_value,
darran 0:55a05330f8cc 126 MIB_NODE_SC,
darran 0:55a05330f8cc 127 0
darran 0:55a05330f8cc 128 };
darran 0:55a05330f8cc 129 const s32_t snmp_ids[28] = {
darran 0:55a05330f8cc 130 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16,
darran 0:55a05330f8cc 131 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30
darran 0:55a05330f8cc 132 };
darran 0:55a05330f8cc 133 struct mib_node* const snmp_nodes[28] = {
darran 0:55a05330f8cc 134 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 135 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 136 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 137 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 138 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 139 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 140 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 141 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 142 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 143 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 144 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 145 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 146 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
darran 0:55a05330f8cc 147 (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar
darran 0:55a05330f8cc 148 };
darran 0:55a05330f8cc 149 const struct mib_array_node snmp = {
darran 0:55a05330f8cc 150 &noleafs_get_object_def,
darran 0:55a05330f8cc 151 &noleafs_get_value,
darran 0:55a05330f8cc 152 &noleafs_set_test,
darran 0:55a05330f8cc 153 &noleafs_set_value,
darran 0:55a05330f8cc 154 MIB_NODE_AR,
darran 0:55a05330f8cc 155 28,
darran 0:55a05330f8cc 156 snmp_ids,
darran 0:55a05330f8cc 157 snmp_nodes
darran 0:55a05330f8cc 158 };
darran 0:55a05330f8cc 159
darran 0:55a05330f8cc 160 /* dot3 and EtherLike MIB not planned. (transmission .1.3.6.1.2.1.10) */
darran 0:55a05330f8cc 161 /* historical (some say hysterical). (cmot .1.3.6.1.2.1.9) */
darran 0:55a05330f8cc 162 /* lwIP has no EGP, thus may not implement it. (egp .1.3.6.1.2.1.8) */
darran 0:55a05330f8cc 163
darran 0:55a05330f8cc 164 /* udp .1.3.6.1.2.1.7 */
darran 0:55a05330f8cc 165 /** index root node for udpTable */
darran 0:55a05330f8cc 166 struct mib_list_rootnode udp_root = {
darran 0:55a05330f8cc 167 &noleafs_get_object_def,
darran 0:55a05330f8cc 168 &noleafs_get_value,
darran 0:55a05330f8cc 169 &noleafs_set_test,
darran 0:55a05330f8cc 170 &noleafs_set_value,
darran 0:55a05330f8cc 171 MIB_NODE_LR,
darran 0:55a05330f8cc 172 0,
darran 0:55a05330f8cc 173 NULL,
darran 0:55a05330f8cc 174 NULL,
darran 0:55a05330f8cc 175 0
darran 0:55a05330f8cc 176 };
darran 0:55a05330f8cc 177 const s32_t udpentry_ids[2] = { 1, 2 };
darran 0:55a05330f8cc 178 struct mib_node* const udpentry_nodes[2] = {
darran 0:55a05330f8cc 179 (struct mib_node* const)&udp_root, (struct mib_node* const)&udp_root,
darran 0:55a05330f8cc 180 };
darran 0:55a05330f8cc 181 const struct mib_array_node udpentry = {
darran 0:55a05330f8cc 182 &noleafs_get_object_def,
darran 0:55a05330f8cc 183 &noleafs_get_value,
darran 0:55a05330f8cc 184 &noleafs_set_test,
darran 0:55a05330f8cc 185 &noleafs_set_value,
darran 0:55a05330f8cc 186 MIB_NODE_AR,
darran 0:55a05330f8cc 187 2,
darran 0:55a05330f8cc 188 udpentry_ids,
darran 0:55a05330f8cc 189 udpentry_nodes
darran 0:55a05330f8cc 190 };
darran 0:55a05330f8cc 191
darran 0:55a05330f8cc 192 s32_t udptable_id = 1;
darran 0:55a05330f8cc 193 struct mib_node* udptable_node = (struct mib_node* const)&udpentry;
darran 0:55a05330f8cc 194 struct mib_ram_array_node udptable = {
darran 0:55a05330f8cc 195 &noleafs_get_object_def,
darran 0:55a05330f8cc 196 &noleafs_get_value,
darran 0:55a05330f8cc 197 &noleafs_set_test,
darran 0:55a05330f8cc 198 &noleafs_set_value,
darran 0:55a05330f8cc 199 MIB_NODE_RA,
darran 0:55a05330f8cc 200 0,
darran 0:55a05330f8cc 201 &udptable_id,
darran 0:55a05330f8cc 202 &udptable_node
darran 0:55a05330f8cc 203 };
darran 0:55a05330f8cc 204
darran 0:55a05330f8cc 205 const mib_scalar_node udp_scalar = {
darran 0:55a05330f8cc 206 &udp_get_object_def,
darran 0:55a05330f8cc 207 &udp_get_value,
darran 0:55a05330f8cc 208 &noleafs_set_test,
darran 0:55a05330f8cc 209 &noleafs_set_value,
darran 0:55a05330f8cc 210 MIB_NODE_SC,
darran 0:55a05330f8cc 211 0
darran 0:55a05330f8cc 212 };
darran 0:55a05330f8cc 213 const s32_t udp_ids[5] = { 1, 2, 3, 4, 5 };
darran 0:55a05330f8cc 214 struct mib_node* const udp_nodes[5] = {
darran 0:55a05330f8cc 215 (struct mib_node* const)&udp_scalar, (struct mib_node* const)&udp_scalar,
darran 0:55a05330f8cc 216 (struct mib_node* const)&udp_scalar, (struct mib_node* const)&udp_scalar,
darran 0:55a05330f8cc 217 (struct mib_node* const)&udptable
darran 0:55a05330f8cc 218 };
darran 0:55a05330f8cc 219 const struct mib_array_node udp = {
darran 0:55a05330f8cc 220 &noleafs_get_object_def,
darran 0:55a05330f8cc 221 &noleafs_get_value,
darran 0:55a05330f8cc 222 &noleafs_set_test,
darran 0:55a05330f8cc 223 &noleafs_set_value,
darran 0:55a05330f8cc 224 MIB_NODE_AR,
darran 0:55a05330f8cc 225 5,
darran 0:55a05330f8cc 226 udp_ids,
darran 0:55a05330f8cc 227 udp_nodes
darran 0:55a05330f8cc 228 };
darran 0:55a05330f8cc 229
darran 0:55a05330f8cc 230 /* tcp .1.3.6.1.2.1.6 */
darran 0:55a05330f8cc 231 #if LWIP_TCP
darran 0:55a05330f8cc 232 /* only if the TCP protocol is available may implement this group */
darran 0:55a05330f8cc 233 /** index root node for tcpConnTable */
darran 0:55a05330f8cc 234 struct mib_list_rootnode tcpconntree_root = {
darran 0:55a05330f8cc 235 &noleafs_get_object_def,
darran 0:55a05330f8cc 236 &noleafs_get_value,
darran 0:55a05330f8cc 237 &noleafs_set_test,
darran 0:55a05330f8cc 238 &noleafs_set_value,
darran 0:55a05330f8cc 239 MIB_NODE_LR,
darran 0:55a05330f8cc 240 0,
darran 0:55a05330f8cc 241 NULL,
darran 0:55a05330f8cc 242 NULL,
darran 0:55a05330f8cc 243 0
darran 0:55a05330f8cc 244 };
darran 0:55a05330f8cc 245 const s32_t tcpconnentry_ids[5] = { 1, 2, 3, 4, 5 };
darran 0:55a05330f8cc 246 struct mib_node* const tcpconnentry_nodes[5] = {
darran 0:55a05330f8cc 247 (struct mib_node* const)&tcpconntree_root, (struct mib_node* const)&tcpconntree_root,
darran 0:55a05330f8cc 248 (struct mib_node* const)&tcpconntree_root, (struct mib_node* const)&tcpconntree_root,
darran 0:55a05330f8cc 249 (struct mib_node* const)&tcpconntree_root
darran 0:55a05330f8cc 250 };
darran 0:55a05330f8cc 251 const struct mib_array_node tcpconnentry = {
darran 0:55a05330f8cc 252 &noleafs_get_object_def,
darran 0:55a05330f8cc 253 &noleafs_get_value,
darran 0:55a05330f8cc 254 &noleafs_set_test,
darran 0:55a05330f8cc 255 &noleafs_set_value,
darran 0:55a05330f8cc 256 MIB_NODE_AR,
darran 0:55a05330f8cc 257 5,
darran 0:55a05330f8cc 258 tcpconnentry_ids,
darran 0:55a05330f8cc 259 tcpconnentry_nodes
darran 0:55a05330f8cc 260 };
darran 0:55a05330f8cc 261
darran 0:55a05330f8cc 262 s32_t tcpconntable_id = 1;
darran 0:55a05330f8cc 263 struct mib_node* tcpconntable_node = (struct mib_node* const)&tcpconnentry;
darran 0:55a05330f8cc 264 struct mib_ram_array_node tcpconntable = {
darran 0:55a05330f8cc 265 &noleafs_get_object_def,
darran 0:55a05330f8cc 266 &noleafs_get_value,
darran 0:55a05330f8cc 267 &noleafs_set_test,
darran 0:55a05330f8cc 268 &noleafs_set_value,
darran 0:55a05330f8cc 269 MIB_NODE_RA,
darran 0:55a05330f8cc 270 /** @todo update maxlength when inserting / deleting from table
darran 0:55a05330f8cc 271 0 when table is empty, 1 when more than one entry */
darran 0:55a05330f8cc 272 0,
darran 0:55a05330f8cc 273 &tcpconntable_id,
darran 0:55a05330f8cc 274 &tcpconntable_node
darran 0:55a05330f8cc 275 };
darran 0:55a05330f8cc 276
darran 0:55a05330f8cc 277 const mib_scalar_node tcp_scalar = {
darran 0:55a05330f8cc 278 &tcp_get_object_def,
darran 0:55a05330f8cc 279 &tcp_get_value,
darran 0:55a05330f8cc 280 &noleafs_set_test,
darran 0:55a05330f8cc 281 &noleafs_set_value,
darran 0:55a05330f8cc 282 MIB_NODE_SC,
darran 0:55a05330f8cc 283 0
darran 0:55a05330f8cc 284 };
darran 0:55a05330f8cc 285 const s32_t tcp_ids[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
darran 0:55a05330f8cc 286 struct mib_node* const tcp_nodes[15] = {
darran 0:55a05330f8cc 287 (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
darran 0:55a05330f8cc 288 (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
darran 0:55a05330f8cc 289 (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
darran 0:55a05330f8cc 290 (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
darran 0:55a05330f8cc 291 (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
darran 0:55a05330f8cc 292 (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
darran 0:55a05330f8cc 293 (struct mib_node* const)&tcpconntable, (struct mib_node* const)&tcp_scalar,
darran 0:55a05330f8cc 294 (struct mib_node* const)&tcp_scalar
darran 0:55a05330f8cc 295 };
darran 0:55a05330f8cc 296 const struct mib_array_node tcp = {
darran 0:55a05330f8cc 297 &noleafs_get_object_def,
darran 0:55a05330f8cc 298 &noleafs_get_value,
darran 0:55a05330f8cc 299 &noleafs_set_test,
darran 0:55a05330f8cc 300 &noleafs_set_value,
darran 0:55a05330f8cc 301 MIB_NODE_AR,
darran 0:55a05330f8cc 302 15,
darran 0:55a05330f8cc 303 tcp_ids,
darran 0:55a05330f8cc 304 tcp_nodes
darran 0:55a05330f8cc 305 };
darran 0:55a05330f8cc 306 #endif
darran 0:55a05330f8cc 307
darran 0:55a05330f8cc 308 /* icmp .1.3.6.1.2.1.5 */
darran 0:55a05330f8cc 309 const mib_scalar_node icmp_scalar = {
darran 0:55a05330f8cc 310 &icmp_get_object_def,
darran 0:55a05330f8cc 311 &icmp_get_value,
darran 0:55a05330f8cc 312 &noleafs_set_test,
darran 0:55a05330f8cc 313 &noleafs_set_value,
darran 0:55a05330f8cc 314 MIB_NODE_SC,
darran 0:55a05330f8cc 315 0
darran 0:55a05330f8cc 316 };
darran 0:55a05330f8cc 317 const s32_t icmp_ids[26] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 };
darran 0:55a05330f8cc 318 struct mib_node* const icmp_nodes[26] = {
darran 0:55a05330f8cc 319 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 320 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 321 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 322 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 323 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 324 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 325 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 326 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 327 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 328 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 329 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 330 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
darran 0:55a05330f8cc 331 (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar
darran 0:55a05330f8cc 332 };
darran 0:55a05330f8cc 333 const struct mib_array_node icmp = {
darran 0:55a05330f8cc 334 &noleafs_get_object_def,
darran 0:55a05330f8cc 335 &noleafs_get_value,
darran 0:55a05330f8cc 336 &noleafs_set_test,
darran 0:55a05330f8cc 337 &noleafs_set_value,
darran 0:55a05330f8cc 338 MIB_NODE_AR,
darran 0:55a05330f8cc 339 26,
darran 0:55a05330f8cc 340 icmp_ids,
darran 0:55a05330f8cc 341 icmp_nodes
darran 0:55a05330f8cc 342 };
darran 0:55a05330f8cc 343
darran 0:55a05330f8cc 344 /** index root node for ipNetToMediaTable */
darran 0:55a05330f8cc 345 struct mib_list_rootnode ipntomtree_root = {
darran 0:55a05330f8cc 346 &noleafs_get_object_def,
darran 0:55a05330f8cc 347 &noleafs_get_value,
darran 0:55a05330f8cc 348 &noleafs_set_test,
darran 0:55a05330f8cc 349 &noleafs_set_value,
darran 0:55a05330f8cc 350 MIB_NODE_LR,
darran 0:55a05330f8cc 351 0,
darran 0:55a05330f8cc 352 NULL,
darran 0:55a05330f8cc 353 NULL,
darran 0:55a05330f8cc 354 0
darran 0:55a05330f8cc 355 };
darran 0:55a05330f8cc 356 const s32_t ipntomentry_ids[4] = { 1, 2, 3, 4 };
darran 0:55a05330f8cc 357 struct mib_node* const ipntomentry_nodes[4] = {
darran 0:55a05330f8cc 358 (struct mib_node* const)&ipntomtree_root, (struct mib_node* const)&ipntomtree_root,
darran 0:55a05330f8cc 359 (struct mib_node* const)&ipntomtree_root, (struct mib_node* const)&ipntomtree_root
darran 0:55a05330f8cc 360 };
darran 0:55a05330f8cc 361 const struct mib_array_node ipntomentry = {
darran 0:55a05330f8cc 362 &noleafs_get_object_def,
darran 0:55a05330f8cc 363 &noleafs_get_value,
darran 0:55a05330f8cc 364 &noleafs_set_test,
darran 0:55a05330f8cc 365 &noleafs_set_value,
darran 0:55a05330f8cc 366 MIB_NODE_AR,
darran 0:55a05330f8cc 367 4,
darran 0:55a05330f8cc 368 ipntomentry_ids,
darran 0:55a05330f8cc 369 ipntomentry_nodes
darran 0:55a05330f8cc 370 };
darran 0:55a05330f8cc 371
darran 0:55a05330f8cc 372 s32_t ipntomtable_id = 1;
darran 0:55a05330f8cc 373 struct mib_node* ipntomtable_node = (struct mib_node* const)&ipntomentry;
darran 0:55a05330f8cc 374 struct mib_ram_array_node ipntomtable = {
darran 0:55a05330f8cc 375 &noleafs_get_object_def,
darran 0:55a05330f8cc 376 &noleafs_get_value,
darran 0:55a05330f8cc 377 &noleafs_set_test,
darran 0:55a05330f8cc 378 &noleafs_set_value,
darran 0:55a05330f8cc 379 MIB_NODE_RA,
darran 0:55a05330f8cc 380 0,
darran 0:55a05330f8cc 381 &ipntomtable_id,
darran 0:55a05330f8cc 382 &ipntomtable_node
darran 0:55a05330f8cc 383 };
darran 0:55a05330f8cc 384
darran 0:55a05330f8cc 385 /** index root node for ipRouteTable */
darran 0:55a05330f8cc 386 struct mib_list_rootnode iprtetree_root = {
darran 0:55a05330f8cc 387 &noleafs_get_object_def,
darran 0:55a05330f8cc 388 &noleafs_get_value,
darran 0:55a05330f8cc 389 &noleafs_set_test,
darran 0:55a05330f8cc 390 &noleafs_set_value,
darran 0:55a05330f8cc 391 MIB_NODE_LR,
darran 0:55a05330f8cc 392 0,
darran 0:55a05330f8cc 393 NULL,
darran 0:55a05330f8cc 394 NULL,
darran 0:55a05330f8cc 395 0
darran 0:55a05330f8cc 396 };
darran 0:55a05330f8cc 397 const s32_t iprteentry_ids[13] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
darran 0:55a05330f8cc 398 struct mib_node* const iprteentry_nodes[13] = {
darran 0:55a05330f8cc 399 (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
darran 0:55a05330f8cc 400 (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
darran 0:55a05330f8cc 401 (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
darran 0:55a05330f8cc 402 (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
darran 0:55a05330f8cc 403 (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
darran 0:55a05330f8cc 404 (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
darran 0:55a05330f8cc 405 (struct mib_node* const)&iprtetree_root
darran 0:55a05330f8cc 406 };
darran 0:55a05330f8cc 407 const struct mib_array_node iprteentry = {
darran 0:55a05330f8cc 408 &noleafs_get_object_def,
darran 0:55a05330f8cc 409 &noleafs_get_value,
darran 0:55a05330f8cc 410 &noleafs_set_test,
darran 0:55a05330f8cc 411 &noleafs_set_value,
darran 0:55a05330f8cc 412 MIB_NODE_AR,
darran 0:55a05330f8cc 413 13,
darran 0:55a05330f8cc 414 iprteentry_ids,
darran 0:55a05330f8cc 415 iprteentry_nodes
darran 0:55a05330f8cc 416 };
darran 0:55a05330f8cc 417
darran 0:55a05330f8cc 418 s32_t iprtetable_id = 1;
darran 0:55a05330f8cc 419 struct mib_node* iprtetable_node = (struct mib_node* const)&iprteentry;
darran 0:55a05330f8cc 420 struct mib_ram_array_node iprtetable = {
darran 0:55a05330f8cc 421 &noleafs_get_object_def,
darran 0:55a05330f8cc 422 &noleafs_get_value,
darran 0:55a05330f8cc 423 &noleafs_set_test,
darran 0:55a05330f8cc 424 &noleafs_set_value,
darran 0:55a05330f8cc 425 MIB_NODE_RA,
darran 0:55a05330f8cc 426 0,
darran 0:55a05330f8cc 427 &iprtetable_id,
darran 0:55a05330f8cc 428 &iprtetable_node
darran 0:55a05330f8cc 429 };
darran 0:55a05330f8cc 430
darran 0:55a05330f8cc 431 /** index root node for ipAddrTable */
darran 0:55a05330f8cc 432 struct mib_list_rootnode ipaddrtree_root = {
darran 0:55a05330f8cc 433 &noleafs_get_object_def,
darran 0:55a05330f8cc 434 &noleafs_get_value,
darran 0:55a05330f8cc 435 &noleafs_set_test,
darran 0:55a05330f8cc 436 &noleafs_set_value,
darran 0:55a05330f8cc 437 MIB_NODE_LR,
darran 0:55a05330f8cc 438 0,
darran 0:55a05330f8cc 439 NULL,
darran 0:55a05330f8cc 440 NULL,
darran 0:55a05330f8cc 441 0
darran 0:55a05330f8cc 442 };
darran 0:55a05330f8cc 443 const s32_t ipaddrentry_ids[5] = { 1, 2, 3, 4, 5 };
darran 0:55a05330f8cc 444 struct mib_node* const ipaddrentry_nodes[5] = {
darran 0:55a05330f8cc 445 (struct mib_node* const)&ipaddrtree_root,
darran 0:55a05330f8cc 446 (struct mib_node* const)&ipaddrtree_root,
darran 0:55a05330f8cc 447 (struct mib_node* const)&ipaddrtree_root,
darran 0:55a05330f8cc 448 (struct mib_node* const)&ipaddrtree_root,
darran 0:55a05330f8cc 449 (struct mib_node* const)&ipaddrtree_root
darran 0:55a05330f8cc 450 };
darran 0:55a05330f8cc 451 const struct mib_array_node ipaddrentry = {
darran 0:55a05330f8cc 452 &noleafs_get_object_def,
darran 0:55a05330f8cc 453 &noleafs_get_value,
darran 0:55a05330f8cc 454 &noleafs_set_test,
darran 0:55a05330f8cc 455 &noleafs_set_value,
darran 0:55a05330f8cc 456 MIB_NODE_AR,
darran 0:55a05330f8cc 457 5,
darran 0:55a05330f8cc 458 ipaddrentry_ids,
darran 0:55a05330f8cc 459 ipaddrentry_nodes
darran 0:55a05330f8cc 460 };
darran 0:55a05330f8cc 461
darran 0:55a05330f8cc 462 s32_t ipaddrtable_id = 1;
darran 0:55a05330f8cc 463 struct mib_node* ipaddrtable_node = (struct mib_node* const)&ipaddrentry;
darran 0:55a05330f8cc 464 struct mib_ram_array_node ipaddrtable = {
darran 0:55a05330f8cc 465 &noleafs_get_object_def,
darran 0:55a05330f8cc 466 &noleafs_get_value,
darran 0:55a05330f8cc 467 &noleafs_set_test,
darran 0:55a05330f8cc 468 &noleafs_set_value,
darran 0:55a05330f8cc 469 MIB_NODE_RA,
darran 0:55a05330f8cc 470 0,
darran 0:55a05330f8cc 471 &ipaddrtable_id,
darran 0:55a05330f8cc 472 &ipaddrtable_node
darran 0:55a05330f8cc 473 };
darran 0:55a05330f8cc 474
darran 0:55a05330f8cc 475 /* ip .1.3.6.1.2.1.4 */
darran 0:55a05330f8cc 476 const mib_scalar_node ip_scalar = {
darran 0:55a05330f8cc 477 &ip_get_object_def,
darran 0:55a05330f8cc 478 &ip_get_value,
darran 0:55a05330f8cc 479 &ip_set_test,
darran 0:55a05330f8cc 480 &noleafs_set_value,
darran 0:55a05330f8cc 481 MIB_NODE_SC,
darran 0:55a05330f8cc 482 0
darran 0:55a05330f8cc 483 };
darran 0:55a05330f8cc 484 const s32_t ip_ids[23] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 };
darran 0:55a05330f8cc 485 struct mib_node* const ip_nodes[23] = {
darran 0:55a05330f8cc 486 (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
darran 0:55a05330f8cc 487 (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
darran 0:55a05330f8cc 488 (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
darran 0:55a05330f8cc 489 (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
darran 0:55a05330f8cc 490 (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
darran 0:55a05330f8cc 491 (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
darran 0:55a05330f8cc 492 (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
darran 0:55a05330f8cc 493 (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
darran 0:55a05330f8cc 494 (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
darran 0:55a05330f8cc 495 (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ipaddrtable,
darran 0:55a05330f8cc 496 (struct mib_node* const)&iprtetable, (struct mib_node* const)&ipntomtable,
darran 0:55a05330f8cc 497 (struct mib_node* const)&ip_scalar
darran 0:55a05330f8cc 498 };
darran 0:55a05330f8cc 499 const struct mib_array_node mib2_ip = {
darran 0:55a05330f8cc 500 &noleafs_get_object_def,
darran 0:55a05330f8cc 501 &noleafs_get_value,
darran 0:55a05330f8cc 502 &noleafs_set_test,
darran 0:55a05330f8cc 503 &noleafs_set_value,
darran 0:55a05330f8cc 504 MIB_NODE_AR,
darran 0:55a05330f8cc 505 23,
darran 0:55a05330f8cc 506 ip_ids,
darran 0:55a05330f8cc 507 ip_nodes
darran 0:55a05330f8cc 508 };
darran 0:55a05330f8cc 509
darran 0:55a05330f8cc 510 /** index root node for atTable */
darran 0:55a05330f8cc 511 struct mib_list_rootnode arptree_root = {
darran 0:55a05330f8cc 512 &noleafs_get_object_def,
darran 0:55a05330f8cc 513 &noleafs_get_value,
darran 0:55a05330f8cc 514 &noleafs_set_test,
darran 0:55a05330f8cc 515 &noleafs_set_value,
darran 0:55a05330f8cc 516 MIB_NODE_LR,
darran 0:55a05330f8cc 517 0,
darran 0:55a05330f8cc 518 NULL,
darran 0:55a05330f8cc 519 NULL,
darran 0:55a05330f8cc 520 0
darran 0:55a05330f8cc 521 };
darran 0:55a05330f8cc 522 const s32_t atentry_ids[3] = { 1, 2, 3 };
darran 0:55a05330f8cc 523 struct mib_node* const atentry_nodes[3] = {
darran 0:55a05330f8cc 524 (struct mib_node* const)&arptree_root,
darran 0:55a05330f8cc 525 (struct mib_node* const)&arptree_root,
darran 0:55a05330f8cc 526 (struct mib_node* const)&arptree_root
darran 0:55a05330f8cc 527 };
darran 0:55a05330f8cc 528 const struct mib_array_node atentry = {
darran 0:55a05330f8cc 529 &noleafs_get_object_def,
darran 0:55a05330f8cc 530 &noleafs_get_value,
darran 0:55a05330f8cc 531 &noleafs_set_test,
darran 0:55a05330f8cc 532 &noleafs_set_value,
darran 0:55a05330f8cc 533 MIB_NODE_AR,
darran 0:55a05330f8cc 534 3,
darran 0:55a05330f8cc 535 atentry_ids,
darran 0:55a05330f8cc 536 atentry_nodes
darran 0:55a05330f8cc 537 };
darran 0:55a05330f8cc 538
darran 0:55a05330f8cc 539 const s32_t attable_id = 1;
darran 0:55a05330f8cc 540 struct mib_node* const attable_node = (struct mib_node* const)&atentry;
darran 0:55a05330f8cc 541 const struct mib_array_node attable = {
darran 0:55a05330f8cc 542 &noleafs_get_object_def,
darran 0:55a05330f8cc 543 &noleafs_get_value,
darran 0:55a05330f8cc 544 &noleafs_set_test,
darran 0:55a05330f8cc 545 &noleafs_set_value,
darran 0:55a05330f8cc 546 MIB_NODE_AR,
darran 0:55a05330f8cc 547 1,
darran 0:55a05330f8cc 548 &attable_id,
darran 0:55a05330f8cc 549 &attable_node
darran 0:55a05330f8cc 550 };
darran 0:55a05330f8cc 551
darran 0:55a05330f8cc 552 /* at .1.3.6.1.2.1.3 */
darran 0:55a05330f8cc 553 s32_t at_id = 1;
darran 0:55a05330f8cc 554 struct mib_node* mib2_at_node = (struct mib_node* const)&attable;
darran 0:55a05330f8cc 555 struct mib_ram_array_node at = {
darran 0:55a05330f8cc 556 &noleafs_get_object_def,
darran 0:55a05330f8cc 557 &noleafs_get_value,
darran 0:55a05330f8cc 558 &noleafs_set_test,
darran 0:55a05330f8cc 559 &noleafs_set_value,
darran 0:55a05330f8cc 560 MIB_NODE_RA,
darran 0:55a05330f8cc 561 0,
darran 0:55a05330f8cc 562 &at_id,
darran 0:55a05330f8cc 563 &mib2_at_node
darran 0:55a05330f8cc 564 };
darran 0:55a05330f8cc 565
darran 0:55a05330f8cc 566 /** index root node for ifTable */
darran 0:55a05330f8cc 567 struct mib_list_rootnode iflist_root = {
darran 0:55a05330f8cc 568 &ifentry_get_object_def,
darran 0:55a05330f8cc 569 &ifentry_get_value,
darran 0:55a05330f8cc 570 #if SNMP_SAFE_REQUESTS
darran 0:55a05330f8cc 571 &noleafs_set_test,
darran 0:55a05330f8cc 572 &noleafs_set_value,
darran 0:55a05330f8cc 573 #else /* SNMP_SAFE_REQUESTS */
darran 0:55a05330f8cc 574 &ifentry_set_test,
darran 0:55a05330f8cc 575 &ifentry_set_value,
darran 0:55a05330f8cc 576 #endif /* SNMP_SAFE_REQUESTS */
darran 0:55a05330f8cc 577 MIB_NODE_LR,
darran 0:55a05330f8cc 578 0,
darran 0:55a05330f8cc 579 NULL,
darran 0:55a05330f8cc 580 NULL,
darran 0:55a05330f8cc 581 0
darran 0:55a05330f8cc 582 };
darran 0:55a05330f8cc 583 const s32_t ifentry_ids[22] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 };
darran 0:55a05330f8cc 584 struct mib_node* const ifentry_nodes[22] = {
darran 0:55a05330f8cc 585 (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
darran 0:55a05330f8cc 586 (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
darran 0:55a05330f8cc 587 (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
darran 0:55a05330f8cc 588 (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
darran 0:55a05330f8cc 589 (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
darran 0:55a05330f8cc 590 (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
darran 0:55a05330f8cc 591 (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
darran 0:55a05330f8cc 592 (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
darran 0:55a05330f8cc 593 (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
darran 0:55a05330f8cc 594 (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
darran 0:55a05330f8cc 595 (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root
darran 0:55a05330f8cc 596 };
darran 0:55a05330f8cc 597 const struct mib_array_node ifentry = {
darran 0:55a05330f8cc 598 &noleafs_get_object_def,
darran 0:55a05330f8cc 599 &noleafs_get_value,
darran 0:55a05330f8cc 600 &noleafs_set_test,
darran 0:55a05330f8cc 601 &noleafs_set_value,
darran 0:55a05330f8cc 602 MIB_NODE_AR,
darran 0:55a05330f8cc 603 22,
darran 0:55a05330f8cc 604 ifentry_ids,
darran 0:55a05330f8cc 605 ifentry_nodes
darran 0:55a05330f8cc 606 };
darran 0:55a05330f8cc 607
darran 0:55a05330f8cc 608 s32_t iftable_id = 1;
darran 0:55a05330f8cc 609 struct mib_node* iftable_node = (struct mib_node* const)&ifentry;
darran 0:55a05330f8cc 610 struct mib_ram_array_node iftable = {
darran 0:55a05330f8cc 611 &noleafs_get_object_def,
darran 0:55a05330f8cc 612 &noleafs_get_value,
darran 0:55a05330f8cc 613 &noleafs_set_test,
darran 0:55a05330f8cc 614 &noleafs_set_value,
darran 0:55a05330f8cc 615 MIB_NODE_RA,
darran 0:55a05330f8cc 616 0,
darran 0:55a05330f8cc 617 &iftable_id,
darran 0:55a05330f8cc 618 &iftable_node
darran 0:55a05330f8cc 619 };
darran 0:55a05330f8cc 620
darran 0:55a05330f8cc 621 /* interfaces .1.3.6.1.2.1.2 */
darran 0:55a05330f8cc 622 const mib_scalar_node interfaces_scalar = {
darran 0:55a05330f8cc 623 &interfaces_get_object_def,
darran 0:55a05330f8cc 624 &interfaces_get_value,
darran 0:55a05330f8cc 625 &noleafs_set_test,
darran 0:55a05330f8cc 626 &noleafs_set_value,
darran 0:55a05330f8cc 627 MIB_NODE_SC,
darran 0:55a05330f8cc 628 0
darran 0:55a05330f8cc 629 };
darran 0:55a05330f8cc 630 const s32_t interfaces_ids[2] = { 1, 2 };
darran 0:55a05330f8cc 631 struct mib_node* const interfaces_nodes[2] = {
darran 0:55a05330f8cc 632 (struct mib_node* const)&interfaces_scalar, (struct mib_node* const)&iftable
darran 0:55a05330f8cc 633 };
darran 0:55a05330f8cc 634 const struct mib_array_node interfaces = {
darran 0:55a05330f8cc 635 &noleafs_get_object_def,
darran 0:55a05330f8cc 636 &noleafs_get_value,
darran 0:55a05330f8cc 637 &noleafs_set_test,
darran 0:55a05330f8cc 638 &noleafs_set_value,
darran 0:55a05330f8cc 639 MIB_NODE_AR,
darran 0:55a05330f8cc 640 2,
darran 0:55a05330f8cc 641 interfaces_ids,
darran 0:55a05330f8cc 642 interfaces_nodes
darran 0:55a05330f8cc 643 };
darran 0:55a05330f8cc 644
darran 0:55a05330f8cc 645
darran 0:55a05330f8cc 646 /* 0 1 2 3 4 5 6 */
darran 0:55a05330f8cc 647 /* system .1.3.6.1.2.1.1 */
darran 0:55a05330f8cc 648 const mib_scalar_node sys_tem_scalar = {
darran 0:55a05330f8cc 649 &system_get_object_def,
darran 0:55a05330f8cc 650 &system_get_value,
darran 0:55a05330f8cc 651 &system_set_test,
darran 0:55a05330f8cc 652 &system_set_value,
darran 0:55a05330f8cc 653 MIB_NODE_SC,
darran 0:55a05330f8cc 654 0
darran 0:55a05330f8cc 655 };
darran 0:55a05330f8cc 656 const s32_t sys_tem_ids[7] = { 1, 2, 3, 4, 5, 6, 7 };
darran 0:55a05330f8cc 657 struct mib_node* const sys_tem_nodes[7] = {
darran 0:55a05330f8cc 658 (struct mib_node* const)&sys_tem_scalar, (struct mib_node* const)&sys_tem_scalar,
darran 0:55a05330f8cc 659 (struct mib_node* const)&sys_tem_scalar, (struct mib_node* const)&sys_tem_scalar,
darran 0:55a05330f8cc 660 (struct mib_node* const)&sys_tem_scalar, (struct mib_node* const)&sys_tem_scalar,
darran 0:55a05330f8cc 661 (struct mib_node* const)&sys_tem_scalar
darran 0:55a05330f8cc 662 };
darran 0:55a05330f8cc 663 /* work around name issue with 'sys_tem', some compiler(s?) seem to reserve 'system' */
darran 0:55a05330f8cc 664 const struct mib_array_node sys_tem = {
darran 0:55a05330f8cc 665 &noleafs_get_object_def,
darran 0:55a05330f8cc 666 &noleafs_get_value,
darran 0:55a05330f8cc 667 &noleafs_set_test,
darran 0:55a05330f8cc 668 &noleafs_set_value,
darran 0:55a05330f8cc 669 MIB_NODE_AR,
darran 0:55a05330f8cc 670 7,
darran 0:55a05330f8cc 671 sys_tem_ids,
darran 0:55a05330f8cc 672 sys_tem_nodes
darran 0:55a05330f8cc 673 };
darran 0:55a05330f8cc 674
darran 0:55a05330f8cc 675 /* mib-2 .1.3.6.1.2.1 */
darran 0:55a05330f8cc 676 #if LWIP_TCP
darran 0:55a05330f8cc 677 #define MIB2_GROUPS 8
darran 0:55a05330f8cc 678 #else
darran 0:55a05330f8cc 679 #define MIB2_GROUPS 7
darran 0:55a05330f8cc 680 #endif
darran 0:55a05330f8cc 681 const s32_t mib2_ids[MIB2_GROUPS] =
darran 0:55a05330f8cc 682 {
darran 0:55a05330f8cc 683 1,
darran 0:55a05330f8cc 684 2,
darran 0:55a05330f8cc 685 3,
darran 0:55a05330f8cc 686 4,
darran 0:55a05330f8cc 687 5,
darran 0:55a05330f8cc 688 #if LWIP_TCP
darran 0:55a05330f8cc 689 6,
darran 0:55a05330f8cc 690 #endif
darran 0:55a05330f8cc 691 7,
darran 0:55a05330f8cc 692 11
darran 0:55a05330f8cc 693 };
darran 0:55a05330f8cc 694 struct mib_node* const mib2_nodes[MIB2_GROUPS] = {
darran 0:55a05330f8cc 695 (struct mib_node* const)&sys_tem,
darran 0:55a05330f8cc 696 (struct mib_node* const)&interfaces,
darran 0:55a05330f8cc 697 (struct mib_node* const)&at,
darran 0:55a05330f8cc 698 (struct mib_node* const)&mib2_ip,
darran 0:55a05330f8cc 699 (struct mib_node* const)&icmp,
darran 0:55a05330f8cc 700 #if LWIP_TCP
darran 0:55a05330f8cc 701 (struct mib_node* const)&tcp,
darran 0:55a05330f8cc 702 #endif
darran 0:55a05330f8cc 703 (struct mib_node* const)&udp,
darran 0:55a05330f8cc 704 (struct mib_node* const)&snmp
darran 0:55a05330f8cc 705 };
darran 0:55a05330f8cc 706
darran 0:55a05330f8cc 707 const struct mib_array_node mib2 = {
darran 0:55a05330f8cc 708 &noleafs_get_object_def,
darran 0:55a05330f8cc 709 &noleafs_get_value,
darran 0:55a05330f8cc 710 &noleafs_set_test,
darran 0:55a05330f8cc 711 &noleafs_set_value,
darran 0:55a05330f8cc 712 MIB_NODE_AR,
darran 0:55a05330f8cc 713 MIB2_GROUPS,
darran 0:55a05330f8cc 714 mib2_ids,
darran 0:55a05330f8cc 715 mib2_nodes
darran 0:55a05330f8cc 716 };
darran 0:55a05330f8cc 717
darran 0:55a05330f8cc 718 /* mgmt .1.3.6.1.2 */
darran 0:55a05330f8cc 719 const s32_t mgmt_ids[1] = { 1 };
darran 0:55a05330f8cc 720 struct mib_node* const mgmt_nodes[1] = { (struct mib_node* const)&mib2 };
darran 0:55a05330f8cc 721 const struct mib_array_node mgmt = {
darran 0:55a05330f8cc 722 &noleafs_get_object_def,
darran 0:55a05330f8cc 723 &noleafs_get_value,
darran 0:55a05330f8cc 724 &noleafs_set_test,
darran 0:55a05330f8cc 725 &noleafs_set_value,
darran 0:55a05330f8cc 726 MIB_NODE_AR,
darran 0:55a05330f8cc 727 1,
darran 0:55a05330f8cc 728 mgmt_ids,
darran 0:55a05330f8cc 729 mgmt_nodes
darran 0:55a05330f8cc 730 };
darran 0:55a05330f8cc 731
darran 0:55a05330f8cc 732 /* internet .1.3.6.1 */
darran 0:55a05330f8cc 733 #if SNMP_PRIVATE_MIB
darran 0:55a05330f8cc 734 /* When using a private MIB, you have to create a file 'private_mib.h' that contains
darran 0:55a05330f8cc 735 * a 'struct mib_array_node mib_private' which contains your MIB. */
darran 0:55a05330f8cc 736 s32_t internet_ids[2] = { 2, 4 };
darran 0:55a05330f8cc 737 struct mib_node* const internet_nodes[2] = { (struct mib_node* const)&mgmt, (struct mib_node* const)&mib_private };
darran 0:55a05330f8cc 738 const struct mib_array_node internet = {
darran 0:55a05330f8cc 739 &noleafs_get_object_def,
darran 0:55a05330f8cc 740 &noleafs_get_value,
darran 0:55a05330f8cc 741 &noleafs_set_test,
darran 0:55a05330f8cc 742 &noleafs_set_value,
darran 0:55a05330f8cc 743 MIB_NODE_AR,
darran 0:55a05330f8cc 744 2,
darran 0:55a05330f8cc 745 internet_ids,
darran 0:55a05330f8cc 746 internet_nodes
darran 0:55a05330f8cc 747 };
darran 0:55a05330f8cc 748 #else
darran 0:55a05330f8cc 749 const s32_t internet_ids[1] = { 2 };
darran 0:55a05330f8cc 750 struct mib_node* const internet_nodes[1] = { (struct mib_node* const)&mgmt };
darran 0:55a05330f8cc 751 const struct mib_array_node internet = {
darran 0:55a05330f8cc 752 &noleafs_get_object_def,
darran 0:55a05330f8cc 753 &noleafs_get_value,
darran 0:55a05330f8cc 754 &noleafs_set_test,
darran 0:55a05330f8cc 755 &noleafs_set_value,
darran 0:55a05330f8cc 756 MIB_NODE_AR,
darran 0:55a05330f8cc 757 1,
darran 0:55a05330f8cc 758 internet_ids,
darran 0:55a05330f8cc 759 internet_nodes
darran 0:55a05330f8cc 760 };
darran 0:55a05330f8cc 761 #endif
darran 0:55a05330f8cc 762
darran 0:55a05330f8cc 763 /** mib-2.system.sysObjectID */
darran 0:55a05330f8cc 764 static struct snmp_obj_id sysobjid = {SNMP_SYSOBJID_LEN, SNMP_SYSOBJID};
darran 0:55a05330f8cc 765 /** enterprise ID for generic TRAPs, .iso.org.dod.internet.mgmt.mib-2.snmp */
darran 0:55a05330f8cc 766 static struct snmp_obj_id snmpgrp_id = {7,{1,3,6,1,2,1,11}};
darran 0:55a05330f8cc 767 /** mib-2.system.sysServices */
darran 0:55a05330f8cc 768 static const s32_t sysservices = SNMP_SYSSERVICES;
darran 0:55a05330f8cc 769
darran 0:55a05330f8cc 770 /** mib-2.system.sysDescr */
darran 0:55a05330f8cc 771 static const u8_t sysdescr_len_default = 4;
darran 0:55a05330f8cc 772 static const u8_t sysdescr_default[] = "lwIP";
darran 0:55a05330f8cc 773 static u8_t* sysdescr_len_ptr = (u8_t*)&sysdescr_len_default;
darran 0:55a05330f8cc 774 static u8_t* sysdescr_ptr = (u8_t*)&sysdescr_default[0];
darran 0:55a05330f8cc 775 /** mib-2.system.sysContact */
darran 0:55a05330f8cc 776 static const u8_t syscontact_len_default = 0;
darran 0:55a05330f8cc 777 static const u8_t syscontact_default[] = "";
darran 0:55a05330f8cc 778 static u8_t* syscontact_len_ptr = (u8_t*)&syscontact_len_default;
darran 0:55a05330f8cc 779 static u8_t* syscontact_ptr = (u8_t*)&syscontact_default[0];
darran 0:55a05330f8cc 780 /** mib-2.system.sysName */
darran 0:55a05330f8cc 781 static const u8_t sysname_len_default = 8;
darran 0:55a05330f8cc 782 static const u8_t sysname_default[] = "FQDN-unk";
darran 0:55a05330f8cc 783 static u8_t* sysname_len_ptr = (u8_t*)&sysname_len_default;
darran 0:55a05330f8cc 784 static u8_t* sysname_ptr = (u8_t*)&sysname_default[0];
darran 0:55a05330f8cc 785 /** mib-2.system.sysLocation */
darran 0:55a05330f8cc 786 static const u8_t syslocation_len_default = 0;
darran 0:55a05330f8cc 787 static const u8_t syslocation_default[] = "";
darran 0:55a05330f8cc 788 static u8_t* syslocation_len_ptr = (u8_t*)&syslocation_len_default;
darran 0:55a05330f8cc 789 static u8_t* syslocation_ptr = (u8_t*)&syslocation_default[0];
darran 0:55a05330f8cc 790 /** mib-2.snmp.snmpEnableAuthenTraps */
darran 0:55a05330f8cc 791 static const u8_t snmpenableauthentraps_default = 2; /* disabled */
darran 0:55a05330f8cc 792 static u8_t* snmpenableauthentraps_ptr = (u8_t*)&snmpenableauthentraps_default;
darran 0:55a05330f8cc 793
darran 0:55a05330f8cc 794 /** mib-2.interfaces.ifTable.ifEntry.ifSpecific (zeroDotZero) */
darran 0:55a05330f8cc 795 static const struct snmp_obj_id ifspecific = {2, {0, 0}};
darran 0:55a05330f8cc 796 /** mib-2.ip.ipRouteTable.ipRouteEntry.ipRouteInfo (zeroDotZero) */
darran 0:55a05330f8cc 797 static const struct snmp_obj_id iprouteinfo = {2, {0, 0}};
darran 0:55a05330f8cc 798
darran 0:55a05330f8cc 799
darran 0:55a05330f8cc 800
darran 0:55a05330f8cc 801 /* mib-2.system counter(s) */
darran 0:55a05330f8cc 802 static u32_t sysuptime = 0;
darran 0:55a05330f8cc 803
darran 0:55a05330f8cc 804 /* mib-2.ip counter(s) */
darran 0:55a05330f8cc 805 static u32_t ipinreceives = 0,
darran 0:55a05330f8cc 806 ipinhdrerrors = 0,
darran 0:55a05330f8cc 807 ipinaddrerrors = 0,
darran 0:55a05330f8cc 808 ipforwdatagrams = 0,
darran 0:55a05330f8cc 809 ipinunknownprotos = 0,
darran 0:55a05330f8cc 810 ipindiscards = 0,
darran 0:55a05330f8cc 811 ipindelivers = 0,
darran 0:55a05330f8cc 812 ipoutrequests = 0,
darran 0:55a05330f8cc 813 ipoutdiscards = 0,
darran 0:55a05330f8cc 814 ipoutnoroutes = 0,
darran 0:55a05330f8cc 815 ipreasmreqds = 0,
darran 0:55a05330f8cc 816 ipreasmoks = 0,
darran 0:55a05330f8cc 817 ipreasmfails = 0,
darran 0:55a05330f8cc 818 ipfragoks = 0,
darran 0:55a05330f8cc 819 ipfragfails = 0,
darran 0:55a05330f8cc 820 ipfragcreates = 0,
darran 0:55a05330f8cc 821 iproutingdiscards = 0;
darran 0:55a05330f8cc 822 /* mib-2.icmp counter(s) */
darran 0:55a05330f8cc 823 static u32_t icmpinmsgs = 0,
darran 0:55a05330f8cc 824 icmpinerrors = 0,
darran 0:55a05330f8cc 825 icmpindestunreachs = 0,
darran 0:55a05330f8cc 826 icmpintimeexcds = 0,
darran 0:55a05330f8cc 827 icmpinparmprobs = 0,
darran 0:55a05330f8cc 828 icmpinsrcquenchs = 0,
darran 0:55a05330f8cc 829 icmpinredirects = 0,
darran 0:55a05330f8cc 830 icmpinechos = 0,
darran 0:55a05330f8cc 831 icmpinechoreps = 0,
darran 0:55a05330f8cc 832 icmpintimestamps = 0,
darran 0:55a05330f8cc 833 icmpintimestampreps = 0,
darran 0:55a05330f8cc 834 icmpinaddrmasks = 0,
darran 0:55a05330f8cc 835 icmpinaddrmaskreps = 0,
darran 0:55a05330f8cc 836 icmpoutmsgs = 0,
darran 0:55a05330f8cc 837 icmpouterrors = 0,
darran 0:55a05330f8cc 838 icmpoutdestunreachs = 0,
darran 0:55a05330f8cc 839 icmpouttimeexcds = 0,
darran 0:55a05330f8cc 840 icmpoutparmprobs = 0,
darran 0:55a05330f8cc 841 icmpoutsrcquenchs = 0,
darran 0:55a05330f8cc 842 icmpoutredirects = 0,
darran 0:55a05330f8cc 843 icmpoutechos = 0,
darran 0:55a05330f8cc 844 icmpoutechoreps = 0,
darran 0:55a05330f8cc 845 icmpouttimestamps = 0,
darran 0:55a05330f8cc 846 icmpouttimestampreps = 0,
darran 0:55a05330f8cc 847 icmpoutaddrmasks = 0,
darran 0:55a05330f8cc 848 icmpoutaddrmaskreps = 0;
darran 0:55a05330f8cc 849 /* mib-2.tcp counter(s) */
darran 0:55a05330f8cc 850 static u32_t tcpactiveopens = 0,
darran 0:55a05330f8cc 851 tcppassiveopens = 0,
darran 0:55a05330f8cc 852 tcpattemptfails = 0,
darran 0:55a05330f8cc 853 tcpestabresets = 0,
darran 0:55a05330f8cc 854 tcpinsegs = 0,
darran 0:55a05330f8cc 855 tcpoutsegs = 0,
darran 0:55a05330f8cc 856 tcpretranssegs = 0,
darran 0:55a05330f8cc 857 tcpinerrs = 0,
darran 0:55a05330f8cc 858 tcpoutrsts = 0;
darran 0:55a05330f8cc 859 /* mib-2.udp counter(s) */
darran 0:55a05330f8cc 860 static u32_t udpindatagrams = 0,
darran 0:55a05330f8cc 861 udpnoports = 0,
darran 0:55a05330f8cc 862 udpinerrors = 0,
darran 0:55a05330f8cc 863 udpoutdatagrams = 0;
darran 0:55a05330f8cc 864 /* mib-2.snmp counter(s) */
darran 0:55a05330f8cc 865 static u32_t snmpinpkts = 0,
darran 0:55a05330f8cc 866 snmpoutpkts = 0,
darran 0:55a05330f8cc 867 snmpinbadversions = 0,
darran 0:55a05330f8cc 868 snmpinbadcommunitynames = 0,
darran 0:55a05330f8cc 869 snmpinbadcommunityuses = 0,
darran 0:55a05330f8cc 870 snmpinasnparseerrs = 0,
darran 0:55a05330f8cc 871 snmpintoobigs = 0,
darran 0:55a05330f8cc 872 snmpinnosuchnames = 0,
darran 0:55a05330f8cc 873 snmpinbadvalues = 0,
darran 0:55a05330f8cc 874 snmpinreadonlys = 0,
darran 0:55a05330f8cc 875 snmpingenerrs = 0,
darran 0:55a05330f8cc 876 snmpintotalreqvars = 0,
darran 0:55a05330f8cc 877 snmpintotalsetvars = 0,
darran 0:55a05330f8cc 878 snmpingetrequests = 0,
darran 0:55a05330f8cc 879 snmpingetnexts = 0,
darran 0:55a05330f8cc 880 snmpinsetrequests = 0,
darran 0:55a05330f8cc 881 snmpingetresponses = 0,
darran 0:55a05330f8cc 882 snmpintraps = 0,
darran 0:55a05330f8cc 883 snmpouttoobigs = 0,
darran 0:55a05330f8cc 884 snmpoutnosuchnames = 0,
darran 0:55a05330f8cc 885 snmpoutbadvalues = 0,
darran 0:55a05330f8cc 886 snmpoutgenerrs = 0,
darran 0:55a05330f8cc 887 snmpoutgetrequests = 0,
darran 0:55a05330f8cc 888 snmpoutgetnexts = 0,
darran 0:55a05330f8cc 889 snmpoutsetrequests = 0,
darran 0:55a05330f8cc 890 snmpoutgetresponses = 0,
darran 0:55a05330f8cc 891 snmpouttraps = 0;
darran 0:55a05330f8cc 892
darran 0:55a05330f8cc 893
darran 0:55a05330f8cc 894
darran 0:55a05330f8cc 895 /* prototypes of the following functions are in lwip/src/include/lwip/snmp.h */
darran 0:55a05330f8cc 896 /**
darran 0:55a05330f8cc 897 * Copy octet string.
darran 0:55a05330f8cc 898 *
darran 0:55a05330f8cc 899 * @param dst points to destination
darran 0:55a05330f8cc 900 * @param src points to source
darran 0:55a05330f8cc 901 * @param n number of octets to copy.
darran 0:55a05330f8cc 902 */
darran 0:55a05330f8cc 903 static void ocstrncpy(u8_t *dst, u8_t *src, u16_t n)
darran 0:55a05330f8cc 904 {
darran 0:55a05330f8cc 905 u16_t i = n;
darran 0:55a05330f8cc 906 while (i > 0) {
darran 0:55a05330f8cc 907 i--;
darran 0:55a05330f8cc 908 *dst++ = *src++;
darran 0:55a05330f8cc 909 }
darran 0:55a05330f8cc 910 }
darran 0:55a05330f8cc 911
darran 0:55a05330f8cc 912 /**
darran 0:55a05330f8cc 913 * Copy object identifier (s32_t) array.
darran 0:55a05330f8cc 914 *
darran 0:55a05330f8cc 915 * @param dst points to destination
darran 0:55a05330f8cc 916 * @param src points to source
darran 0:55a05330f8cc 917 * @param n number of sub identifiers to copy.
darran 0:55a05330f8cc 918 */
darran 0:55a05330f8cc 919 void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
darran 0:55a05330f8cc 920 {
darran 0:55a05330f8cc 921 u8_t i = n;
darran 0:55a05330f8cc 922 while(i > 0) {
darran 0:55a05330f8cc 923 i--;
darran 0:55a05330f8cc 924 *dst++ = *src++;
darran 0:55a05330f8cc 925 }
darran 0:55a05330f8cc 926 }
darran 0:55a05330f8cc 927
darran 0:55a05330f8cc 928 /**
darran 0:55a05330f8cc 929 * Initializes sysDescr pointers.
darran 0:55a05330f8cc 930 *
darran 0:55a05330f8cc 931 * @param str if non-NULL then copy str pointer
darran 0:55a05330f8cc 932 * @param len points to string length, excluding zero terminator
darran 0:55a05330f8cc 933 */
darran 0:55a05330f8cc 934 void snmp_set_sysdesr(u8_t *str, u8_t *len)
darran 0:55a05330f8cc 935 {
darran 0:55a05330f8cc 936 if (str != NULL)
darran 0:55a05330f8cc 937 {
darran 0:55a05330f8cc 938 sysdescr_ptr = str;
darran 0:55a05330f8cc 939 sysdescr_len_ptr = len;
darran 0:55a05330f8cc 940 }
darran 0:55a05330f8cc 941 }
darran 0:55a05330f8cc 942
darran 0:55a05330f8cc 943 void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid)
darran 0:55a05330f8cc 944 {
darran 0:55a05330f8cc 945 *oid = &sysobjid;
darran 0:55a05330f8cc 946 }
darran 0:55a05330f8cc 947
darran 0:55a05330f8cc 948 /**
darran 0:55a05330f8cc 949 * Initializes sysObjectID value.
darran 0:55a05330f8cc 950 *
darran 0:55a05330f8cc 951 * @param oid points to stuct snmp_obj_id to copy
darran 0:55a05330f8cc 952 */
darran 0:55a05330f8cc 953 void snmp_set_sysobjid(struct snmp_obj_id *oid)
darran 0:55a05330f8cc 954 {
darran 0:55a05330f8cc 955 sysobjid = *oid;
darran 0:55a05330f8cc 956 }
darran 0:55a05330f8cc 957
darran 0:55a05330f8cc 958 /**
darran 0:55a05330f8cc 959 * Must be called at regular 10 msec interval from a timer interrupt
darran 0:55a05330f8cc 960 * or signal handler depending on your runtime environment.
darran 0:55a05330f8cc 961 */
darran 0:55a05330f8cc 962 void snmp_inc_sysuptime(void)
darran 0:55a05330f8cc 963 {
darran 0:55a05330f8cc 964 sysuptime++;
darran 0:55a05330f8cc 965 }
darran 0:55a05330f8cc 966
darran 0:55a05330f8cc 967 void snmp_add_sysuptime(u32_t value)
darran 0:55a05330f8cc 968 {
darran 0:55a05330f8cc 969 sysuptime+=value;
darran 0:55a05330f8cc 970 }
darran 0:55a05330f8cc 971
darran 0:55a05330f8cc 972 void snmp_get_sysuptime(u32_t *value)
darran 0:55a05330f8cc 973 {
darran 0:55a05330f8cc 974 SNMP_GET_SYSUPTIME(sysuptime);
darran 0:55a05330f8cc 975 *value = sysuptime;
darran 0:55a05330f8cc 976 }
darran 0:55a05330f8cc 977
darran 0:55a05330f8cc 978 /**
darran 0:55a05330f8cc 979 * Initializes sysContact pointers,
darran 0:55a05330f8cc 980 * e.g. ptrs to non-volatile memory external to lwIP.
darran 0:55a05330f8cc 981 *
darran 0:55a05330f8cc 982 * @param ocstr if non-NULL then copy str pointer
darran 0:55a05330f8cc 983 * @param ocstrlen points to string length, excluding zero terminator
darran 0:55a05330f8cc 984 */
darran 0:55a05330f8cc 985 void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen)
darran 0:55a05330f8cc 986 {
darran 0:55a05330f8cc 987 if (ocstr != NULL)
darran 0:55a05330f8cc 988 {
darran 0:55a05330f8cc 989 syscontact_ptr = ocstr;
darran 0:55a05330f8cc 990 syscontact_len_ptr = ocstrlen;
darran 0:55a05330f8cc 991 }
darran 0:55a05330f8cc 992 }
darran 0:55a05330f8cc 993
darran 0:55a05330f8cc 994 /**
darran 0:55a05330f8cc 995 * Initializes sysName pointers,
darran 0:55a05330f8cc 996 * e.g. ptrs to non-volatile memory external to lwIP.
darran 0:55a05330f8cc 997 *
darran 0:55a05330f8cc 998 * @param ocstr if non-NULL then copy str pointer
darran 0:55a05330f8cc 999 * @param ocstrlen points to string length, excluding zero terminator
darran 0:55a05330f8cc 1000 */
darran 0:55a05330f8cc 1001 void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen)
darran 0:55a05330f8cc 1002 {
darran 0:55a05330f8cc 1003 if (ocstr != NULL)
darran 0:55a05330f8cc 1004 {
darran 0:55a05330f8cc 1005 sysname_ptr = ocstr;
darran 0:55a05330f8cc 1006 sysname_len_ptr = ocstrlen;
darran 0:55a05330f8cc 1007 }
darran 0:55a05330f8cc 1008 }
darran 0:55a05330f8cc 1009
darran 0:55a05330f8cc 1010 /**
darran 0:55a05330f8cc 1011 * Initializes sysLocation pointers,
darran 0:55a05330f8cc 1012 * e.g. ptrs to non-volatile memory external to lwIP.
darran 0:55a05330f8cc 1013 *
darran 0:55a05330f8cc 1014 * @param ocstr if non-NULL then copy str pointer
darran 0:55a05330f8cc 1015 * @param ocstrlen points to string length, excluding zero terminator
darran 0:55a05330f8cc 1016 */
darran 0:55a05330f8cc 1017 void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen)
darran 0:55a05330f8cc 1018 {
darran 0:55a05330f8cc 1019 if (ocstr != NULL)
darran 0:55a05330f8cc 1020 {
darran 0:55a05330f8cc 1021 syslocation_ptr = ocstr;
darran 0:55a05330f8cc 1022 syslocation_len_ptr = ocstrlen;
darran 0:55a05330f8cc 1023 }
darran 0:55a05330f8cc 1024 }
darran 0:55a05330f8cc 1025
darran 0:55a05330f8cc 1026
darran 0:55a05330f8cc 1027 void snmp_add_ifinoctets(struct netif *ni, u32_t value)
darran 0:55a05330f8cc 1028 {
darran 0:55a05330f8cc 1029 ni->ifinoctets += value;
darran 0:55a05330f8cc 1030 }
darran 0:55a05330f8cc 1031
darran 0:55a05330f8cc 1032 void snmp_inc_ifinucastpkts(struct netif *ni)
darran 0:55a05330f8cc 1033 {
darran 0:55a05330f8cc 1034 (ni->ifinucastpkts)++;
darran 0:55a05330f8cc 1035 }
darran 0:55a05330f8cc 1036
darran 0:55a05330f8cc 1037 void snmp_inc_ifinnucastpkts(struct netif *ni)
darran 0:55a05330f8cc 1038 {
darran 0:55a05330f8cc 1039 (ni->ifinnucastpkts)++;
darran 0:55a05330f8cc 1040 }
darran 0:55a05330f8cc 1041
darran 0:55a05330f8cc 1042 void snmp_inc_ifindiscards(struct netif *ni)
darran 0:55a05330f8cc 1043 {
darran 0:55a05330f8cc 1044 (ni->ifindiscards)++;
darran 0:55a05330f8cc 1045 }
darran 0:55a05330f8cc 1046
darran 0:55a05330f8cc 1047 void snmp_add_ifoutoctets(struct netif *ni, u32_t value)
darran 0:55a05330f8cc 1048 {
darran 0:55a05330f8cc 1049 ni->ifoutoctets += value;
darran 0:55a05330f8cc 1050 }
darran 0:55a05330f8cc 1051
darran 0:55a05330f8cc 1052 void snmp_inc_ifoutucastpkts(struct netif *ni)
darran 0:55a05330f8cc 1053 {
darran 0:55a05330f8cc 1054 (ni->ifoutucastpkts)++;
darran 0:55a05330f8cc 1055 }
darran 0:55a05330f8cc 1056
darran 0:55a05330f8cc 1057 void snmp_inc_ifoutnucastpkts(struct netif *ni)
darran 0:55a05330f8cc 1058 {
darran 0:55a05330f8cc 1059 (ni->ifoutnucastpkts)++;
darran 0:55a05330f8cc 1060 }
darran 0:55a05330f8cc 1061
darran 0:55a05330f8cc 1062 void snmp_inc_ifoutdiscards(struct netif *ni)
darran 0:55a05330f8cc 1063 {
darran 0:55a05330f8cc 1064 (ni->ifoutdiscards)++;
darran 0:55a05330f8cc 1065 }
darran 0:55a05330f8cc 1066
darran 0:55a05330f8cc 1067 void snmp_inc_iflist(void)
darran 0:55a05330f8cc 1068 {
darran 0:55a05330f8cc 1069 struct mib_list_node *if_node = NULL;
darran 0:55a05330f8cc 1070
darran 0:55a05330f8cc 1071 snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
darran 0:55a05330f8cc 1072 /* enable getnext traversal on filled table */
darran 0:55a05330f8cc 1073 iftable.maxlength = 1;
darran 0:55a05330f8cc 1074 }
darran 0:55a05330f8cc 1075
darran 0:55a05330f8cc 1076 void snmp_dec_iflist(void)
darran 0:55a05330f8cc 1077 {
darran 0:55a05330f8cc 1078 snmp_mib_node_delete(&iflist_root, iflist_root.tail);
darran 0:55a05330f8cc 1079 /* disable getnext traversal on empty table */
darran 0:55a05330f8cc 1080 if(iflist_root.count == 0) iftable.maxlength = 0;
darran 0:55a05330f8cc 1081 }
darran 0:55a05330f8cc 1082
darran 0:55a05330f8cc 1083 /**
darran 0:55a05330f8cc 1084 * Inserts ARP table indexes (.xIfIndex.xNetAddress)
darran 0:55a05330f8cc 1085 * into arp table index trees (both atTable and ipNetToMediaTable).
darran 0:55a05330f8cc 1086 */
darran 0:55a05330f8cc 1087 void snmp_insert_arpidx_tree(struct netif *ni, ip_addr_t *ip)
darran 0:55a05330f8cc 1088 {
darran 0:55a05330f8cc 1089 struct mib_list_rootnode *at_rn;
darran 0:55a05330f8cc 1090 struct mib_list_node *at_node;
darran 0:55a05330f8cc 1091 s32_t arpidx[5];
darran 0:55a05330f8cc 1092 u8_t level, tree;
darran 0:55a05330f8cc 1093
darran 0:55a05330f8cc 1094 LWIP_ASSERT("ni != NULL", ni != NULL);
darran 0:55a05330f8cc 1095 snmp_netiftoifindex(ni, &arpidx[0]);
darran 0:55a05330f8cc 1096 snmp_iptooid(ip, &arpidx[1]);
darran 0:55a05330f8cc 1097
darran 0:55a05330f8cc 1098 for (tree = 0; tree < 2; tree++)
darran 0:55a05330f8cc 1099 {
darran 0:55a05330f8cc 1100 if (tree == 0)
darran 0:55a05330f8cc 1101 {
darran 0:55a05330f8cc 1102 at_rn = &arptree_root;
darran 0:55a05330f8cc 1103 }
darran 0:55a05330f8cc 1104 else
darran 0:55a05330f8cc 1105 {
darran 0:55a05330f8cc 1106 at_rn = &ipntomtree_root;
darran 0:55a05330f8cc 1107 }
darran 0:55a05330f8cc 1108 for (level = 0; level < 5; level++)
darran 0:55a05330f8cc 1109 {
darran 0:55a05330f8cc 1110 at_node = NULL;
darran 0:55a05330f8cc 1111 snmp_mib_node_insert(at_rn, arpidx[level], &at_node);
darran 0:55a05330f8cc 1112 if ((level != 4) && (at_node != NULL))
darran 0:55a05330f8cc 1113 {
darran 0:55a05330f8cc 1114 if (at_node->nptr == NULL)
darran 0:55a05330f8cc 1115 {
darran 0:55a05330f8cc 1116 at_rn = snmp_mib_lrn_alloc();
darran 0:55a05330f8cc 1117 at_node->nptr = (struct mib_node*)at_rn;
darran 0:55a05330f8cc 1118 if (at_rn != NULL)
darran 0:55a05330f8cc 1119 {
darran 0:55a05330f8cc 1120 if (level == 3)
darran 0:55a05330f8cc 1121 {
darran 0:55a05330f8cc 1122 if (tree == 0)
darran 0:55a05330f8cc 1123 {
darran 0:55a05330f8cc 1124 at_rn->get_object_def = atentry_get_object_def;
darran 0:55a05330f8cc 1125 at_rn->get_value = atentry_get_value;
darran 0:55a05330f8cc 1126 }
darran 0:55a05330f8cc 1127 else
darran 0:55a05330f8cc 1128 {
darran 0:55a05330f8cc 1129 at_rn->get_object_def = ip_ntomentry_get_object_def;
darran 0:55a05330f8cc 1130 at_rn->get_value = ip_ntomentry_get_value;
darran 0:55a05330f8cc 1131 }
darran 0:55a05330f8cc 1132 at_rn->set_test = noleafs_set_test;
darran 0:55a05330f8cc 1133 at_rn->set_value = noleafs_set_value;
darran 0:55a05330f8cc 1134 }
darran 0:55a05330f8cc 1135 }
darran 0:55a05330f8cc 1136 else
darran 0:55a05330f8cc 1137 {
darran 0:55a05330f8cc 1138 /* at_rn == NULL, malloc failure */
darran 0:55a05330f8cc 1139 LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_arpidx_tree() insert failed, mem full"));
darran 0:55a05330f8cc 1140 break;
darran 0:55a05330f8cc 1141 }
darran 0:55a05330f8cc 1142 }
darran 0:55a05330f8cc 1143 else
darran 0:55a05330f8cc 1144 {
darran 0:55a05330f8cc 1145 at_rn = (struct mib_list_rootnode*)at_node->nptr;
darran 0:55a05330f8cc 1146 }
darran 0:55a05330f8cc 1147 }
darran 0:55a05330f8cc 1148 }
darran 0:55a05330f8cc 1149 }
darran 0:55a05330f8cc 1150 /* enable getnext traversal on filled tables */
darran 0:55a05330f8cc 1151 at.maxlength = 1;
darran 0:55a05330f8cc 1152 ipntomtable.maxlength = 1;
darran 0:55a05330f8cc 1153 }
darran 0:55a05330f8cc 1154
darran 0:55a05330f8cc 1155 /**
darran 0:55a05330f8cc 1156 * Removes ARP table indexes (.xIfIndex.xNetAddress)
darran 0:55a05330f8cc 1157 * from arp table index trees.
darran 0:55a05330f8cc 1158 */
darran 0:55a05330f8cc 1159 void snmp_delete_arpidx_tree(struct netif *ni, ip_addr_t *ip)
darran 0:55a05330f8cc 1160 {
darran 0:55a05330f8cc 1161 struct mib_list_rootnode *at_rn, *next, *del_rn[5];
darran 0:55a05330f8cc 1162 struct mib_list_node *at_n, *del_n[5];
darran 0:55a05330f8cc 1163 s32_t arpidx[5];
darran 0:55a05330f8cc 1164 u8_t fc, tree, level, del_cnt;
darran 0:55a05330f8cc 1165
darran 0:55a05330f8cc 1166 snmp_netiftoifindex(ni, &arpidx[0]);
darran 0:55a05330f8cc 1167 snmp_iptooid(ip, &arpidx[1]);
darran 0:55a05330f8cc 1168
darran 0:55a05330f8cc 1169 for (tree = 0; tree < 2; tree++)
darran 0:55a05330f8cc 1170 {
darran 0:55a05330f8cc 1171 /* mark nodes for deletion */
darran 0:55a05330f8cc 1172 if (tree == 0)
darran 0:55a05330f8cc 1173 {
darran 0:55a05330f8cc 1174 at_rn = &arptree_root;
darran 0:55a05330f8cc 1175 }
darran 0:55a05330f8cc 1176 else
darran 0:55a05330f8cc 1177 {
darran 0:55a05330f8cc 1178 at_rn = &ipntomtree_root;
darran 0:55a05330f8cc 1179 }
darran 0:55a05330f8cc 1180 level = 0;
darran 0:55a05330f8cc 1181 del_cnt = 0;
darran 0:55a05330f8cc 1182 while ((level < 5) && (at_rn != NULL))
darran 0:55a05330f8cc 1183 {
darran 0:55a05330f8cc 1184 fc = snmp_mib_node_find(at_rn, arpidx[level], &at_n);
darran 0:55a05330f8cc 1185 if (fc == 0)
darran 0:55a05330f8cc 1186 {
darran 0:55a05330f8cc 1187 /* arpidx[level] does not exist */
darran 0:55a05330f8cc 1188 del_cnt = 0;
darran 0:55a05330f8cc 1189 at_rn = NULL;
darran 0:55a05330f8cc 1190 }
darran 0:55a05330f8cc 1191 else if (fc == 1)
darran 0:55a05330f8cc 1192 {
darran 0:55a05330f8cc 1193 del_rn[del_cnt] = at_rn;
darran 0:55a05330f8cc 1194 del_n[del_cnt] = at_n;
darran 0:55a05330f8cc 1195 del_cnt++;
darran 0:55a05330f8cc 1196 at_rn = (struct mib_list_rootnode*)(at_n->nptr);
darran 0:55a05330f8cc 1197 }
darran 0:55a05330f8cc 1198 else if (fc == 2)
darran 0:55a05330f8cc 1199 {
darran 0:55a05330f8cc 1200 /* reset delete (2 or more childs) */
darran 0:55a05330f8cc 1201 del_cnt = 0;
darran 0:55a05330f8cc 1202 at_rn = (struct mib_list_rootnode*)(at_n->nptr);
darran 0:55a05330f8cc 1203 }
darran 0:55a05330f8cc 1204 level++;
darran 0:55a05330f8cc 1205 }
darran 0:55a05330f8cc 1206 /* delete marked index nodes */
darran 0:55a05330f8cc 1207 while (del_cnt > 0)
darran 0:55a05330f8cc 1208 {
darran 0:55a05330f8cc 1209 del_cnt--;
darran 0:55a05330f8cc 1210
darran 0:55a05330f8cc 1211 at_rn = del_rn[del_cnt];
darran 0:55a05330f8cc 1212 at_n = del_n[del_cnt];
darran 0:55a05330f8cc 1213
darran 0:55a05330f8cc 1214 next = snmp_mib_node_delete(at_rn, at_n);
darran 0:55a05330f8cc 1215 if (next != NULL)
darran 0:55a05330f8cc 1216 {
darran 0:55a05330f8cc 1217 LWIP_ASSERT("next_count == 0",next->count == 0);
darran 0:55a05330f8cc 1218 snmp_mib_lrn_free(next);
darran 0:55a05330f8cc 1219 }
darran 0:55a05330f8cc 1220 }
darran 0:55a05330f8cc 1221 }
darran 0:55a05330f8cc 1222 /* disable getnext traversal on empty tables */
darran 0:55a05330f8cc 1223 if(arptree_root.count == 0) at.maxlength = 0;
darran 0:55a05330f8cc 1224 if(ipntomtree_root.count == 0) ipntomtable.maxlength = 0;
darran 0:55a05330f8cc 1225 }
darran 0:55a05330f8cc 1226
darran 0:55a05330f8cc 1227 void snmp_inc_ipinreceives(void)
darran 0:55a05330f8cc 1228 {
darran 0:55a05330f8cc 1229 ipinreceives++;
darran 0:55a05330f8cc 1230 }
darran 0:55a05330f8cc 1231
darran 0:55a05330f8cc 1232 void snmp_inc_ipinhdrerrors(void)
darran 0:55a05330f8cc 1233 {
darran 0:55a05330f8cc 1234 ipinhdrerrors++;
darran 0:55a05330f8cc 1235 }
darran 0:55a05330f8cc 1236
darran 0:55a05330f8cc 1237 void snmp_inc_ipinaddrerrors(void)
darran 0:55a05330f8cc 1238 {
darran 0:55a05330f8cc 1239 ipinaddrerrors++;
darran 0:55a05330f8cc 1240 }
darran 0:55a05330f8cc 1241
darran 0:55a05330f8cc 1242 void snmp_inc_ipforwdatagrams(void)
darran 0:55a05330f8cc 1243 {
darran 0:55a05330f8cc 1244 ipforwdatagrams++;
darran 0:55a05330f8cc 1245 }
darran 0:55a05330f8cc 1246
darran 0:55a05330f8cc 1247 void snmp_inc_ipinunknownprotos(void)
darran 0:55a05330f8cc 1248 {
darran 0:55a05330f8cc 1249 ipinunknownprotos++;
darran 0:55a05330f8cc 1250 }
darran 0:55a05330f8cc 1251
darran 0:55a05330f8cc 1252 void snmp_inc_ipindiscards(void)
darran 0:55a05330f8cc 1253 {
darran 0:55a05330f8cc 1254 ipindiscards++;
darran 0:55a05330f8cc 1255 }
darran 0:55a05330f8cc 1256
darran 0:55a05330f8cc 1257 void snmp_inc_ipindelivers(void)
darran 0:55a05330f8cc 1258 {
darran 0:55a05330f8cc 1259 ipindelivers++;
darran 0:55a05330f8cc 1260 }
darran 0:55a05330f8cc 1261
darran 0:55a05330f8cc 1262 void snmp_inc_ipoutrequests(void)
darran 0:55a05330f8cc 1263 {
darran 0:55a05330f8cc 1264 ipoutrequests++;
darran 0:55a05330f8cc 1265 }
darran 0:55a05330f8cc 1266
darran 0:55a05330f8cc 1267 void snmp_inc_ipoutdiscards(void)
darran 0:55a05330f8cc 1268 {
darran 0:55a05330f8cc 1269 ipoutdiscards++;
darran 0:55a05330f8cc 1270 }
darran 0:55a05330f8cc 1271
darran 0:55a05330f8cc 1272 void snmp_inc_ipoutnoroutes(void)
darran 0:55a05330f8cc 1273 {
darran 0:55a05330f8cc 1274 ipoutnoroutes++;
darran 0:55a05330f8cc 1275 }
darran 0:55a05330f8cc 1276
darran 0:55a05330f8cc 1277 void snmp_inc_ipreasmreqds(void)
darran 0:55a05330f8cc 1278 {
darran 0:55a05330f8cc 1279 ipreasmreqds++;
darran 0:55a05330f8cc 1280 }
darran 0:55a05330f8cc 1281
darran 0:55a05330f8cc 1282 void snmp_inc_ipreasmoks(void)
darran 0:55a05330f8cc 1283 {
darran 0:55a05330f8cc 1284 ipreasmoks++;
darran 0:55a05330f8cc 1285 }
darran 0:55a05330f8cc 1286
darran 0:55a05330f8cc 1287 void snmp_inc_ipreasmfails(void)
darran 0:55a05330f8cc 1288 {
darran 0:55a05330f8cc 1289 ipreasmfails++;
darran 0:55a05330f8cc 1290 }
darran 0:55a05330f8cc 1291
darran 0:55a05330f8cc 1292 void snmp_inc_ipfragoks(void)
darran 0:55a05330f8cc 1293 {
darran 0:55a05330f8cc 1294 ipfragoks++;
darran 0:55a05330f8cc 1295 }
darran 0:55a05330f8cc 1296
darran 0:55a05330f8cc 1297 void snmp_inc_ipfragfails(void)
darran 0:55a05330f8cc 1298 {
darran 0:55a05330f8cc 1299 ipfragfails++;
darran 0:55a05330f8cc 1300 }
darran 0:55a05330f8cc 1301
darran 0:55a05330f8cc 1302 void snmp_inc_ipfragcreates(void)
darran 0:55a05330f8cc 1303 {
darran 0:55a05330f8cc 1304 ipfragcreates++;
darran 0:55a05330f8cc 1305 }
darran 0:55a05330f8cc 1306
darran 0:55a05330f8cc 1307 void snmp_inc_iproutingdiscards(void)
darran 0:55a05330f8cc 1308 {
darran 0:55a05330f8cc 1309 iproutingdiscards++;
darran 0:55a05330f8cc 1310 }
darran 0:55a05330f8cc 1311
darran 0:55a05330f8cc 1312 /**
darran 0:55a05330f8cc 1313 * Inserts ipAddrTable indexes (.ipAdEntAddr)
darran 0:55a05330f8cc 1314 * into index tree.
darran 0:55a05330f8cc 1315 */
darran 0:55a05330f8cc 1316 void snmp_insert_ipaddridx_tree(struct netif *ni)
darran 0:55a05330f8cc 1317 {
darran 0:55a05330f8cc 1318 struct mib_list_rootnode *ipa_rn;
darran 0:55a05330f8cc 1319 struct mib_list_node *ipa_node;
darran 0:55a05330f8cc 1320 s32_t ipaddridx[4];
darran 0:55a05330f8cc 1321 u8_t level;
darran 0:55a05330f8cc 1322
darran 0:55a05330f8cc 1323 LWIP_ASSERT("ni != NULL", ni != NULL);
darran 0:55a05330f8cc 1324 snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
darran 0:55a05330f8cc 1325
darran 0:55a05330f8cc 1326 level = 0;
darran 0:55a05330f8cc 1327 ipa_rn = &ipaddrtree_root;
darran 0:55a05330f8cc 1328 while (level < 4)
darran 0:55a05330f8cc 1329 {
darran 0:55a05330f8cc 1330 ipa_node = NULL;
darran 0:55a05330f8cc 1331 snmp_mib_node_insert(ipa_rn, ipaddridx[level], &ipa_node);
darran 0:55a05330f8cc 1332 if ((level != 3) && (ipa_node != NULL))
darran 0:55a05330f8cc 1333 {
darran 0:55a05330f8cc 1334 if (ipa_node->nptr == NULL)
darran 0:55a05330f8cc 1335 {
darran 0:55a05330f8cc 1336 ipa_rn = snmp_mib_lrn_alloc();
darran 0:55a05330f8cc 1337 ipa_node->nptr = (struct mib_node*)ipa_rn;
darran 0:55a05330f8cc 1338 if (ipa_rn != NULL)
darran 0:55a05330f8cc 1339 {
darran 0:55a05330f8cc 1340 if (level == 2)
darran 0:55a05330f8cc 1341 {
darran 0:55a05330f8cc 1342 ipa_rn->get_object_def = ip_addrentry_get_object_def;
darran 0:55a05330f8cc 1343 ipa_rn->get_value = ip_addrentry_get_value;
darran 0:55a05330f8cc 1344 ipa_rn->set_test = noleafs_set_test;
darran 0:55a05330f8cc 1345 ipa_rn->set_value = noleafs_set_value;
darran 0:55a05330f8cc 1346 }
darran 0:55a05330f8cc 1347 }
darran 0:55a05330f8cc 1348 else
darran 0:55a05330f8cc 1349 {
darran 0:55a05330f8cc 1350 /* ipa_rn == NULL, malloc failure */
darran 0:55a05330f8cc 1351 LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_ipaddridx_tree() insert failed, mem full"));
darran 0:55a05330f8cc 1352 break;
darran 0:55a05330f8cc 1353 }
darran 0:55a05330f8cc 1354 }
darran 0:55a05330f8cc 1355 else
darran 0:55a05330f8cc 1356 {
darran 0:55a05330f8cc 1357 ipa_rn = (struct mib_list_rootnode*)ipa_node->nptr;
darran 0:55a05330f8cc 1358 }
darran 0:55a05330f8cc 1359 }
darran 0:55a05330f8cc 1360 level++;
darran 0:55a05330f8cc 1361 }
darran 0:55a05330f8cc 1362 /* enable getnext traversal on filled table */
darran 0:55a05330f8cc 1363 ipaddrtable.maxlength = 1;
darran 0:55a05330f8cc 1364 }
darran 0:55a05330f8cc 1365
darran 0:55a05330f8cc 1366 /**
darran 0:55a05330f8cc 1367 * Removes ipAddrTable indexes (.ipAdEntAddr)
darran 0:55a05330f8cc 1368 * from index tree.
darran 0:55a05330f8cc 1369 */
darran 0:55a05330f8cc 1370 void snmp_delete_ipaddridx_tree(struct netif *ni)
darran 0:55a05330f8cc 1371 {
darran 0:55a05330f8cc 1372 struct mib_list_rootnode *ipa_rn, *next, *del_rn[4];
darran 0:55a05330f8cc 1373 struct mib_list_node *ipa_n, *del_n[4];
darran 0:55a05330f8cc 1374 s32_t ipaddridx[4];
darran 0:55a05330f8cc 1375 u8_t fc, level, del_cnt;
darran 0:55a05330f8cc 1376
darran 0:55a05330f8cc 1377 LWIP_ASSERT("ni != NULL", ni != NULL);
darran 0:55a05330f8cc 1378 snmp_iptooid(&ni->ip_addr, &ipaddridx[0]);
darran 0:55a05330f8cc 1379
darran 0:55a05330f8cc 1380 /* mark nodes for deletion */
darran 0:55a05330f8cc 1381 level = 0;
darran 0:55a05330f8cc 1382 del_cnt = 0;
darran 0:55a05330f8cc 1383 ipa_rn = &ipaddrtree_root;
darran 0:55a05330f8cc 1384 while ((level < 4) && (ipa_rn != NULL))
darran 0:55a05330f8cc 1385 {
darran 0:55a05330f8cc 1386 fc = snmp_mib_node_find(ipa_rn, ipaddridx[level], &ipa_n);
darran 0:55a05330f8cc 1387 if (fc == 0)
darran 0:55a05330f8cc 1388 {
darran 0:55a05330f8cc 1389 /* ipaddridx[level] does not exist */
darran 0:55a05330f8cc 1390 del_cnt = 0;
darran 0:55a05330f8cc 1391 ipa_rn = NULL;
darran 0:55a05330f8cc 1392 }
darran 0:55a05330f8cc 1393 else if (fc == 1)
darran 0:55a05330f8cc 1394 {
darran 0:55a05330f8cc 1395 del_rn[del_cnt] = ipa_rn;
darran 0:55a05330f8cc 1396 del_n[del_cnt] = ipa_n;
darran 0:55a05330f8cc 1397 del_cnt++;
darran 0:55a05330f8cc 1398 ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
darran 0:55a05330f8cc 1399 }
darran 0:55a05330f8cc 1400 else if (fc == 2)
darran 0:55a05330f8cc 1401 {
darran 0:55a05330f8cc 1402 /* reset delete (2 or more childs) */
darran 0:55a05330f8cc 1403 del_cnt = 0;
darran 0:55a05330f8cc 1404 ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
darran 0:55a05330f8cc 1405 }
darran 0:55a05330f8cc 1406 level++;
darran 0:55a05330f8cc 1407 }
darran 0:55a05330f8cc 1408 /* delete marked index nodes */
darran 0:55a05330f8cc 1409 while (del_cnt > 0)
darran 0:55a05330f8cc 1410 {
darran 0:55a05330f8cc 1411 del_cnt--;
darran 0:55a05330f8cc 1412
darran 0:55a05330f8cc 1413 ipa_rn = del_rn[del_cnt];
darran 0:55a05330f8cc 1414 ipa_n = del_n[del_cnt];
darran 0:55a05330f8cc 1415
darran 0:55a05330f8cc 1416 next = snmp_mib_node_delete(ipa_rn, ipa_n);
darran 0:55a05330f8cc 1417 if (next != NULL)
darran 0:55a05330f8cc 1418 {
darran 0:55a05330f8cc 1419 LWIP_ASSERT("next_count == 0",next->count == 0);
darran 0:55a05330f8cc 1420 snmp_mib_lrn_free(next);
darran 0:55a05330f8cc 1421 }
darran 0:55a05330f8cc 1422 }
darran 0:55a05330f8cc 1423 /* disable getnext traversal on empty table */
darran 0:55a05330f8cc 1424 if (ipaddrtree_root.count == 0) ipaddrtable.maxlength = 0;
darran 0:55a05330f8cc 1425 }
darran 0:55a05330f8cc 1426
darran 0:55a05330f8cc 1427 /**
darran 0:55a05330f8cc 1428 * Inserts ipRouteTable indexes (.ipRouteDest)
darran 0:55a05330f8cc 1429 * into index tree.
darran 0:55a05330f8cc 1430 *
darran 0:55a05330f8cc 1431 * @param dflt non-zero for the default rte, zero for network rte
darran 0:55a05330f8cc 1432 * @param ni points to network interface for this rte
darran 0:55a05330f8cc 1433 *
darran 0:55a05330f8cc 1434 * @todo record sysuptime for _this_ route when it is installed
darran 0:55a05330f8cc 1435 * (needed for ipRouteAge) in the netif.
darran 0:55a05330f8cc 1436 */
darran 0:55a05330f8cc 1437 void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni)
darran 0:55a05330f8cc 1438 {
darran 0:55a05330f8cc 1439 u8_t insert = 0;
darran 0:55a05330f8cc 1440 ip_addr_t dst;
darran 0:55a05330f8cc 1441
darran 0:55a05330f8cc 1442 if (dflt != 0)
darran 0:55a05330f8cc 1443 {
darran 0:55a05330f8cc 1444 /* the default route 0.0.0.0 */
darran 0:55a05330f8cc 1445 ip_addr_set_any(&dst);
darran 0:55a05330f8cc 1446 insert = 1;
darran 0:55a05330f8cc 1447 }
darran 0:55a05330f8cc 1448 else
darran 0:55a05330f8cc 1449 {
darran 0:55a05330f8cc 1450 /* route to the network address */
darran 0:55a05330f8cc 1451 ip_addr_get_network(&dst, &ni->ip_addr, &ni->netmask);
darran 0:55a05330f8cc 1452 /* exclude 0.0.0.0 network (reserved for default rte) */
darran 0:55a05330f8cc 1453 if (!ip_addr_isany(&dst)) {
darran 0:55a05330f8cc 1454 insert = 1;
darran 0:55a05330f8cc 1455 }
darran 0:55a05330f8cc 1456 }
darran 0:55a05330f8cc 1457 if (insert)
darran 0:55a05330f8cc 1458 {
darran 0:55a05330f8cc 1459 struct mib_list_rootnode *iprte_rn;
darran 0:55a05330f8cc 1460 struct mib_list_node *iprte_node;
darran 0:55a05330f8cc 1461 s32_t iprteidx[4];
darran 0:55a05330f8cc 1462 u8_t level;
darran 0:55a05330f8cc 1463
darran 0:55a05330f8cc 1464 snmp_iptooid(&dst, &iprteidx[0]);
darran 0:55a05330f8cc 1465 level = 0;
darran 0:55a05330f8cc 1466 iprte_rn = &iprtetree_root;
darran 0:55a05330f8cc 1467 while (level < 4)
darran 0:55a05330f8cc 1468 {
darran 0:55a05330f8cc 1469 iprte_node = NULL;
darran 0:55a05330f8cc 1470 snmp_mib_node_insert(iprte_rn, iprteidx[level], &iprte_node);
darran 0:55a05330f8cc 1471 if ((level != 3) && (iprte_node != NULL))
darran 0:55a05330f8cc 1472 {
darran 0:55a05330f8cc 1473 if (iprte_node->nptr == NULL)
darran 0:55a05330f8cc 1474 {
darran 0:55a05330f8cc 1475 iprte_rn = snmp_mib_lrn_alloc();
darran 0:55a05330f8cc 1476 iprte_node->nptr = (struct mib_node*)iprte_rn;
darran 0:55a05330f8cc 1477 if (iprte_rn != NULL)
darran 0:55a05330f8cc 1478 {
darran 0:55a05330f8cc 1479 if (level == 2)
darran 0:55a05330f8cc 1480 {
darran 0:55a05330f8cc 1481 iprte_rn->get_object_def = ip_rteentry_get_object_def;
darran 0:55a05330f8cc 1482 iprte_rn->get_value = ip_rteentry_get_value;
darran 0:55a05330f8cc 1483 iprte_rn->set_test = noleafs_set_test;
darran 0:55a05330f8cc 1484 iprte_rn->set_value = noleafs_set_value;
darran 0:55a05330f8cc 1485 }
darran 0:55a05330f8cc 1486 }
darran 0:55a05330f8cc 1487 else
darran 0:55a05330f8cc 1488 {
darran 0:55a05330f8cc 1489 /* iprte_rn == NULL, malloc failure */
darran 0:55a05330f8cc 1490 LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_iprteidx_tree() insert failed, mem full"));
darran 0:55a05330f8cc 1491 break;
darran 0:55a05330f8cc 1492 }
darran 0:55a05330f8cc 1493 }
darran 0:55a05330f8cc 1494 else
darran 0:55a05330f8cc 1495 {
darran 0:55a05330f8cc 1496 iprte_rn = (struct mib_list_rootnode*)iprte_node->nptr;
darran 0:55a05330f8cc 1497 }
darran 0:55a05330f8cc 1498 }
darran 0:55a05330f8cc 1499 level++;
darran 0:55a05330f8cc 1500 }
darran 0:55a05330f8cc 1501 }
darran 0:55a05330f8cc 1502 /* enable getnext traversal on filled table */
darran 0:55a05330f8cc 1503 iprtetable.maxlength = 1;
darran 0:55a05330f8cc 1504 }
darran 0:55a05330f8cc 1505
darran 0:55a05330f8cc 1506 /**
darran 0:55a05330f8cc 1507 * Removes ipRouteTable indexes (.ipRouteDest)
darran 0:55a05330f8cc 1508 * from index tree.
darran 0:55a05330f8cc 1509 *
darran 0:55a05330f8cc 1510 * @param dflt non-zero for the default rte, zero for network rte
darran 0:55a05330f8cc 1511 * @param ni points to network interface for this rte or NULL
darran 0:55a05330f8cc 1512 * for default route to be removed.
darran 0:55a05330f8cc 1513 */
darran 0:55a05330f8cc 1514 void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni)
darran 0:55a05330f8cc 1515 {
darran 0:55a05330f8cc 1516 u8_t del = 0;
darran 0:55a05330f8cc 1517 ip_addr_t dst;
darran 0:55a05330f8cc 1518
darran 0:55a05330f8cc 1519 if (dflt != 0)
darran 0:55a05330f8cc 1520 {
darran 0:55a05330f8cc 1521 /* the default route 0.0.0.0 */
darran 0:55a05330f8cc 1522 ip_addr_set_any(&dst);
darran 0:55a05330f8cc 1523 del = 1;
darran 0:55a05330f8cc 1524 }
darran 0:55a05330f8cc 1525 else
darran 0:55a05330f8cc 1526 {
darran 0:55a05330f8cc 1527 /* route to the network address */
darran 0:55a05330f8cc 1528 ip_addr_get_network(&dst, &ni->ip_addr, &ni->netmask);
darran 0:55a05330f8cc 1529 /* exclude 0.0.0.0 network (reserved for default rte) */
darran 0:55a05330f8cc 1530 if (!ip_addr_isany(&dst)) {
darran 0:55a05330f8cc 1531 del = 1;
darran 0:55a05330f8cc 1532 }
darran 0:55a05330f8cc 1533 }
darran 0:55a05330f8cc 1534 if (del)
darran 0:55a05330f8cc 1535 {
darran 0:55a05330f8cc 1536 struct mib_list_rootnode *iprte_rn, *next, *del_rn[4];
darran 0:55a05330f8cc 1537 struct mib_list_node *iprte_n, *del_n[4];
darran 0:55a05330f8cc 1538 s32_t iprteidx[4];
darran 0:55a05330f8cc 1539 u8_t fc, level, del_cnt;
darran 0:55a05330f8cc 1540
darran 0:55a05330f8cc 1541 snmp_iptooid(&dst, &iprteidx[0]);
darran 0:55a05330f8cc 1542 /* mark nodes for deletion */
darran 0:55a05330f8cc 1543 level = 0;
darran 0:55a05330f8cc 1544 del_cnt = 0;
darran 0:55a05330f8cc 1545 iprte_rn = &iprtetree_root;
darran 0:55a05330f8cc 1546 while ((level < 4) && (iprte_rn != NULL))
darran 0:55a05330f8cc 1547 {
darran 0:55a05330f8cc 1548 fc = snmp_mib_node_find(iprte_rn, iprteidx[level], &iprte_n);
darran 0:55a05330f8cc 1549 if (fc == 0)
darran 0:55a05330f8cc 1550 {
darran 0:55a05330f8cc 1551 /* iprteidx[level] does not exist */
darran 0:55a05330f8cc 1552 del_cnt = 0;
darran 0:55a05330f8cc 1553 iprte_rn = NULL;
darran 0:55a05330f8cc 1554 }
darran 0:55a05330f8cc 1555 else if (fc == 1)
darran 0:55a05330f8cc 1556 {
darran 0:55a05330f8cc 1557 del_rn[del_cnt] = iprte_rn;
darran 0:55a05330f8cc 1558 del_n[del_cnt] = iprte_n;
darran 0:55a05330f8cc 1559 del_cnt++;
darran 0:55a05330f8cc 1560 iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
darran 0:55a05330f8cc 1561 }
darran 0:55a05330f8cc 1562 else if (fc == 2)
darran 0:55a05330f8cc 1563 {
darran 0:55a05330f8cc 1564 /* reset delete (2 or more childs) */
darran 0:55a05330f8cc 1565 del_cnt = 0;
darran 0:55a05330f8cc 1566 iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
darran 0:55a05330f8cc 1567 }
darran 0:55a05330f8cc 1568 level++;
darran 0:55a05330f8cc 1569 }
darran 0:55a05330f8cc 1570 /* delete marked index nodes */
darran 0:55a05330f8cc 1571 while (del_cnt > 0)
darran 0:55a05330f8cc 1572 {
darran 0:55a05330f8cc 1573 del_cnt--;
darran 0:55a05330f8cc 1574
darran 0:55a05330f8cc 1575 iprte_rn = del_rn[del_cnt];
darran 0:55a05330f8cc 1576 iprte_n = del_n[del_cnt];
darran 0:55a05330f8cc 1577
darran 0:55a05330f8cc 1578 next = snmp_mib_node_delete(iprte_rn, iprte_n);
darran 0:55a05330f8cc 1579 if (next != NULL)
darran 0:55a05330f8cc 1580 {
darran 0:55a05330f8cc 1581 LWIP_ASSERT("next_count == 0",next->count == 0);
darran 0:55a05330f8cc 1582 snmp_mib_lrn_free(next);
darran 0:55a05330f8cc 1583 }
darran 0:55a05330f8cc 1584 }
darran 0:55a05330f8cc 1585 }
darran 0:55a05330f8cc 1586 /* disable getnext traversal on empty table */
darran 0:55a05330f8cc 1587 if (iprtetree_root.count == 0) iprtetable.maxlength = 0;
darran 0:55a05330f8cc 1588 }
darran 0:55a05330f8cc 1589
darran 0:55a05330f8cc 1590
darran 0:55a05330f8cc 1591 void snmp_inc_icmpinmsgs(void)
darran 0:55a05330f8cc 1592 {
darran 0:55a05330f8cc 1593 icmpinmsgs++;
darran 0:55a05330f8cc 1594 }
darran 0:55a05330f8cc 1595
darran 0:55a05330f8cc 1596 void snmp_inc_icmpinerrors(void)
darran 0:55a05330f8cc 1597 {
darran 0:55a05330f8cc 1598 icmpinerrors++;
darran 0:55a05330f8cc 1599 }
darran 0:55a05330f8cc 1600
darran 0:55a05330f8cc 1601 void snmp_inc_icmpindestunreachs(void)
darran 0:55a05330f8cc 1602 {
darran 0:55a05330f8cc 1603 icmpindestunreachs++;
darran 0:55a05330f8cc 1604 }
darran 0:55a05330f8cc 1605
darran 0:55a05330f8cc 1606 void snmp_inc_icmpintimeexcds(void)
darran 0:55a05330f8cc 1607 {
darran 0:55a05330f8cc 1608 icmpintimeexcds++;
darran 0:55a05330f8cc 1609 }
darran 0:55a05330f8cc 1610
darran 0:55a05330f8cc 1611 void snmp_inc_icmpinparmprobs(void)
darran 0:55a05330f8cc 1612 {
darran 0:55a05330f8cc 1613 icmpinparmprobs++;
darran 0:55a05330f8cc 1614 }
darran 0:55a05330f8cc 1615
darran 0:55a05330f8cc 1616 void snmp_inc_icmpinsrcquenchs(void)
darran 0:55a05330f8cc 1617 {
darran 0:55a05330f8cc 1618 icmpinsrcquenchs++;
darran 0:55a05330f8cc 1619 }
darran 0:55a05330f8cc 1620
darran 0:55a05330f8cc 1621 void snmp_inc_icmpinredirects(void)
darran 0:55a05330f8cc 1622 {
darran 0:55a05330f8cc 1623 icmpinredirects++;
darran 0:55a05330f8cc 1624 }
darran 0:55a05330f8cc 1625
darran 0:55a05330f8cc 1626 void snmp_inc_icmpinechos(void)
darran 0:55a05330f8cc 1627 {
darran 0:55a05330f8cc 1628 icmpinechos++;
darran 0:55a05330f8cc 1629 }
darran 0:55a05330f8cc 1630
darran 0:55a05330f8cc 1631 void snmp_inc_icmpinechoreps(void)
darran 0:55a05330f8cc 1632 {
darran 0:55a05330f8cc 1633 icmpinechoreps++;
darran 0:55a05330f8cc 1634 }
darran 0:55a05330f8cc 1635
darran 0:55a05330f8cc 1636 void snmp_inc_icmpintimestamps(void)
darran 0:55a05330f8cc 1637 {
darran 0:55a05330f8cc 1638 icmpintimestamps++;
darran 0:55a05330f8cc 1639 }
darran 0:55a05330f8cc 1640
darran 0:55a05330f8cc 1641 void snmp_inc_icmpintimestampreps(void)
darran 0:55a05330f8cc 1642 {
darran 0:55a05330f8cc 1643 icmpintimestampreps++;
darran 0:55a05330f8cc 1644 }
darran 0:55a05330f8cc 1645
darran 0:55a05330f8cc 1646 void snmp_inc_icmpinaddrmasks(void)
darran 0:55a05330f8cc 1647 {
darran 0:55a05330f8cc 1648 icmpinaddrmasks++;
darran 0:55a05330f8cc 1649 }
darran 0:55a05330f8cc 1650
darran 0:55a05330f8cc 1651 void snmp_inc_icmpinaddrmaskreps(void)
darran 0:55a05330f8cc 1652 {
darran 0:55a05330f8cc 1653 icmpinaddrmaskreps++;
darran 0:55a05330f8cc 1654 }
darran 0:55a05330f8cc 1655
darran 0:55a05330f8cc 1656 void snmp_inc_icmpoutmsgs(void)
darran 0:55a05330f8cc 1657 {
darran 0:55a05330f8cc 1658 icmpoutmsgs++;
darran 0:55a05330f8cc 1659 }
darran 0:55a05330f8cc 1660
darran 0:55a05330f8cc 1661 void snmp_inc_icmpouterrors(void)
darran 0:55a05330f8cc 1662 {
darran 0:55a05330f8cc 1663 icmpouterrors++;
darran 0:55a05330f8cc 1664 }
darran 0:55a05330f8cc 1665
darran 0:55a05330f8cc 1666 void snmp_inc_icmpoutdestunreachs(void)
darran 0:55a05330f8cc 1667 {
darran 0:55a05330f8cc 1668 icmpoutdestunreachs++;
darran 0:55a05330f8cc 1669 }
darran 0:55a05330f8cc 1670
darran 0:55a05330f8cc 1671 void snmp_inc_icmpouttimeexcds(void)
darran 0:55a05330f8cc 1672 {
darran 0:55a05330f8cc 1673 icmpouttimeexcds++;
darran 0:55a05330f8cc 1674 }
darran 0:55a05330f8cc 1675
darran 0:55a05330f8cc 1676 void snmp_inc_icmpoutparmprobs(void)
darran 0:55a05330f8cc 1677 {
darran 0:55a05330f8cc 1678 icmpoutparmprobs++;
darran 0:55a05330f8cc 1679 }
darran 0:55a05330f8cc 1680
darran 0:55a05330f8cc 1681 void snmp_inc_icmpoutsrcquenchs(void)
darran 0:55a05330f8cc 1682 {
darran 0:55a05330f8cc 1683 icmpoutsrcquenchs++;
darran 0:55a05330f8cc 1684 }
darran 0:55a05330f8cc 1685
darran 0:55a05330f8cc 1686 void snmp_inc_icmpoutredirects(void)
darran 0:55a05330f8cc 1687 {
darran 0:55a05330f8cc 1688 icmpoutredirects++;
darran 0:55a05330f8cc 1689 }
darran 0:55a05330f8cc 1690
darran 0:55a05330f8cc 1691 void snmp_inc_icmpoutechos(void)
darran 0:55a05330f8cc 1692 {
darran 0:55a05330f8cc 1693 icmpoutechos++;
darran 0:55a05330f8cc 1694 }
darran 0:55a05330f8cc 1695
darran 0:55a05330f8cc 1696 void snmp_inc_icmpoutechoreps(void)
darran 0:55a05330f8cc 1697 {
darran 0:55a05330f8cc 1698 icmpoutechoreps++;
darran 0:55a05330f8cc 1699 }
darran 0:55a05330f8cc 1700
darran 0:55a05330f8cc 1701 void snmp_inc_icmpouttimestamps(void)
darran 0:55a05330f8cc 1702 {
darran 0:55a05330f8cc 1703 icmpouttimestamps++;
darran 0:55a05330f8cc 1704 }
darran 0:55a05330f8cc 1705
darran 0:55a05330f8cc 1706 void snmp_inc_icmpouttimestampreps(void)
darran 0:55a05330f8cc 1707 {
darran 0:55a05330f8cc 1708 icmpouttimestampreps++;
darran 0:55a05330f8cc 1709 }
darran 0:55a05330f8cc 1710
darran 0:55a05330f8cc 1711 void snmp_inc_icmpoutaddrmasks(void)
darran 0:55a05330f8cc 1712 {
darran 0:55a05330f8cc 1713 icmpoutaddrmasks++;
darran 0:55a05330f8cc 1714 }
darran 0:55a05330f8cc 1715
darran 0:55a05330f8cc 1716 void snmp_inc_icmpoutaddrmaskreps(void)
darran 0:55a05330f8cc 1717 {
darran 0:55a05330f8cc 1718 icmpoutaddrmaskreps++;
darran 0:55a05330f8cc 1719 }
darran 0:55a05330f8cc 1720
darran 0:55a05330f8cc 1721 void snmp_inc_tcpactiveopens(void)
darran 0:55a05330f8cc 1722 {
darran 0:55a05330f8cc 1723 tcpactiveopens++;
darran 0:55a05330f8cc 1724 }
darran 0:55a05330f8cc 1725
darran 0:55a05330f8cc 1726 void snmp_inc_tcppassiveopens(void)
darran 0:55a05330f8cc 1727 {
darran 0:55a05330f8cc 1728 tcppassiveopens++;
darran 0:55a05330f8cc 1729 }
darran 0:55a05330f8cc 1730
darran 0:55a05330f8cc 1731 void snmp_inc_tcpattemptfails(void)
darran 0:55a05330f8cc 1732 {
darran 0:55a05330f8cc 1733 tcpattemptfails++;
darran 0:55a05330f8cc 1734 }
darran 0:55a05330f8cc 1735
darran 0:55a05330f8cc 1736 void snmp_inc_tcpestabresets(void)
darran 0:55a05330f8cc 1737 {
darran 0:55a05330f8cc 1738 tcpestabresets++;
darran 0:55a05330f8cc 1739 }
darran 0:55a05330f8cc 1740
darran 0:55a05330f8cc 1741 void snmp_inc_tcpinsegs(void)
darran 0:55a05330f8cc 1742 {
darran 0:55a05330f8cc 1743 tcpinsegs++;
darran 0:55a05330f8cc 1744 }
darran 0:55a05330f8cc 1745
darran 0:55a05330f8cc 1746 void snmp_inc_tcpoutsegs(void)
darran 0:55a05330f8cc 1747 {
darran 0:55a05330f8cc 1748 tcpoutsegs++;
darran 0:55a05330f8cc 1749 }
darran 0:55a05330f8cc 1750
darran 0:55a05330f8cc 1751 void snmp_inc_tcpretranssegs(void)
darran 0:55a05330f8cc 1752 {
darran 0:55a05330f8cc 1753 tcpretranssegs++;
darran 0:55a05330f8cc 1754 }
darran 0:55a05330f8cc 1755
darran 0:55a05330f8cc 1756 void snmp_inc_tcpinerrs(void)
darran 0:55a05330f8cc 1757 {
darran 0:55a05330f8cc 1758 tcpinerrs++;
darran 0:55a05330f8cc 1759 }
darran 0:55a05330f8cc 1760
darran 0:55a05330f8cc 1761 void snmp_inc_tcpoutrsts(void)
darran 0:55a05330f8cc 1762 {
darran 0:55a05330f8cc 1763 tcpoutrsts++;
darran 0:55a05330f8cc 1764 }
darran 0:55a05330f8cc 1765
darran 0:55a05330f8cc 1766 void snmp_inc_udpindatagrams(void)
darran 0:55a05330f8cc 1767 {
darran 0:55a05330f8cc 1768 udpindatagrams++;
darran 0:55a05330f8cc 1769 }
darran 0:55a05330f8cc 1770
darran 0:55a05330f8cc 1771 void snmp_inc_udpnoports(void)
darran 0:55a05330f8cc 1772 {
darran 0:55a05330f8cc 1773 udpnoports++;
darran 0:55a05330f8cc 1774 }
darran 0:55a05330f8cc 1775
darran 0:55a05330f8cc 1776 void snmp_inc_udpinerrors(void)
darran 0:55a05330f8cc 1777 {
darran 0:55a05330f8cc 1778 udpinerrors++;
darran 0:55a05330f8cc 1779 }
darran 0:55a05330f8cc 1780
darran 0:55a05330f8cc 1781 void snmp_inc_udpoutdatagrams(void)
darran 0:55a05330f8cc 1782 {
darran 0:55a05330f8cc 1783 udpoutdatagrams++;
darran 0:55a05330f8cc 1784 }
darran 0:55a05330f8cc 1785
darran 0:55a05330f8cc 1786 /**
darran 0:55a05330f8cc 1787 * Inserts udpTable indexes (.udpLocalAddress.udpLocalPort)
darran 0:55a05330f8cc 1788 * into index tree.
darran 0:55a05330f8cc 1789 */
darran 0:55a05330f8cc 1790 void snmp_insert_udpidx_tree(struct udp_pcb *pcb)
darran 0:55a05330f8cc 1791 {
darran 0:55a05330f8cc 1792 struct mib_list_rootnode *udp_rn;
darran 0:55a05330f8cc 1793 struct mib_list_node *udp_node;
darran 0:55a05330f8cc 1794 s32_t udpidx[5];
darran 0:55a05330f8cc 1795 u8_t level;
darran 0:55a05330f8cc 1796
darran 0:55a05330f8cc 1797 LWIP_ASSERT("pcb != NULL", pcb != NULL);
darran 0:55a05330f8cc 1798 snmp_iptooid(&pcb->local_ip, &udpidx[0]);
darran 0:55a05330f8cc 1799 udpidx[4] = pcb->local_port;
darran 0:55a05330f8cc 1800
darran 0:55a05330f8cc 1801 udp_rn = &udp_root;
darran 0:55a05330f8cc 1802 for (level = 0; level < 5; level++)
darran 0:55a05330f8cc 1803 {
darran 0:55a05330f8cc 1804 udp_node = NULL;
darran 0:55a05330f8cc 1805 snmp_mib_node_insert(udp_rn, udpidx[level], &udp_node);
darran 0:55a05330f8cc 1806 if ((level != 4) && (udp_node != NULL))
darran 0:55a05330f8cc 1807 {
darran 0:55a05330f8cc 1808 if (udp_node->nptr == NULL)
darran 0:55a05330f8cc 1809 {
darran 0:55a05330f8cc 1810 udp_rn = snmp_mib_lrn_alloc();
darran 0:55a05330f8cc 1811 udp_node->nptr = (struct mib_node*)udp_rn;
darran 0:55a05330f8cc 1812 if (udp_rn != NULL)
darran 0:55a05330f8cc 1813 {
darran 0:55a05330f8cc 1814 if (level == 3)
darran 0:55a05330f8cc 1815 {
darran 0:55a05330f8cc 1816 udp_rn->get_object_def = udpentry_get_object_def;
darran 0:55a05330f8cc 1817 udp_rn->get_value = udpentry_get_value;
darran 0:55a05330f8cc 1818 udp_rn->set_test = noleafs_set_test;
darran 0:55a05330f8cc 1819 udp_rn->set_value = noleafs_set_value;
darran 0:55a05330f8cc 1820 }
darran 0:55a05330f8cc 1821 }
darran 0:55a05330f8cc 1822 else
darran 0:55a05330f8cc 1823 {
darran 0:55a05330f8cc 1824 /* udp_rn == NULL, malloc failure */
darran 0:55a05330f8cc 1825 LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_udpidx_tree() insert failed, mem full"));
darran 0:55a05330f8cc 1826 break;
darran 0:55a05330f8cc 1827 }
darran 0:55a05330f8cc 1828 }
darran 0:55a05330f8cc 1829 else
darran 0:55a05330f8cc 1830 {
darran 0:55a05330f8cc 1831 udp_rn = (struct mib_list_rootnode*)udp_node->nptr;
darran 0:55a05330f8cc 1832 }
darran 0:55a05330f8cc 1833 }
darran 0:55a05330f8cc 1834 }
darran 0:55a05330f8cc 1835 udptable.maxlength = 1;
darran 0:55a05330f8cc 1836 }
darran 0:55a05330f8cc 1837
darran 0:55a05330f8cc 1838 /**
darran 0:55a05330f8cc 1839 * Removes udpTable indexes (.udpLocalAddress.udpLocalPort)
darran 0:55a05330f8cc 1840 * from index tree.
darran 0:55a05330f8cc 1841 */
darran 0:55a05330f8cc 1842 void snmp_delete_udpidx_tree(struct udp_pcb *pcb)
darran 0:55a05330f8cc 1843 {
darran 0:55a05330f8cc 1844 struct udp_pcb *npcb;
darran 0:55a05330f8cc 1845 struct mib_list_rootnode *udp_rn, *next, *del_rn[5];
darran 0:55a05330f8cc 1846 struct mib_list_node *udp_n, *del_n[5];
darran 0:55a05330f8cc 1847 s32_t udpidx[5];
darran 0:55a05330f8cc 1848 u8_t bindings, fc, level, del_cnt;
darran 0:55a05330f8cc 1849
darran 0:55a05330f8cc 1850 LWIP_ASSERT("pcb != NULL", pcb != NULL);
darran 0:55a05330f8cc 1851 snmp_iptooid(&pcb->local_ip, &udpidx[0]);
darran 0:55a05330f8cc 1852 udpidx[4] = pcb->local_port;
darran 0:55a05330f8cc 1853
darran 0:55a05330f8cc 1854 /* count PCBs for a given binding
darran 0:55a05330f8cc 1855 (e.g. when reusing ports or for temp output PCBs) */
darran 0:55a05330f8cc 1856 bindings = 0;
darran 0:55a05330f8cc 1857 npcb = udp_pcbs;
darran 0:55a05330f8cc 1858 while ((npcb != NULL))
darran 0:55a05330f8cc 1859 {
darran 0:55a05330f8cc 1860 if (ip_addr_cmp(&npcb->local_ip, &pcb->local_ip) &&
darran 0:55a05330f8cc 1861 (npcb->local_port == udpidx[4]))
darran 0:55a05330f8cc 1862 {
darran 0:55a05330f8cc 1863 bindings++;
darran 0:55a05330f8cc 1864 }
darran 0:55a05330f8cc 1865 npcb = npcb->next;
darran 0:55a05330f8cc 1866 }
darran 0:55a05330f8cc 1867 if (bindings == 1)
darran 0:55a05330f8cc 1868 {
darran 0:55a05330f8cc 1869 /* selectively remove */
darran 0:55a05330f8cc 1870 /* mark nodes for deletion */
darran 0:55a05330f8cc 1871 level = 0;
darran 0:55a05330f8cc 1872 del_cnt = 0;
darran 0:55a05330f8cc 1873 udp_rn = &udp_root;
darran 0:55a05330f8cc 1874 while ((level < 5) && (udp_rn != NULL))
darran 0:55a05330f8cc 1875 {
darran 0:55a05330f8cc 1876 fc = snmp_mib_node_find(udp_rn, udpidx[level], &udp_n);
darran 0:55a05330f8cc 1877 if (fc == 0)
darran 0:55a05330f8cc 1878 {
darran 0:55a05330f8cc 1879 /* udpidx[level] does not exist */
darran 0:55a05330f8cc 1880 del_cnt = 0;
darran 0:55a05330f8cc 1881 udp_rn = NULL;
darran 0:55a05330f8cc 1882 }
darran 0:55a05330f8cc 1883 else if (fc == 1)
darran 0:55a05330f8cc 1884 {
darran 0:55a05330f8cc 1885 del_rn[del_cnt] = udp_rn;
darran 0:55a05330f8cc 1886 del_n[del_cnt] = udp_n;
darran 0:55a05330f8cc 1887 del_cnt++;
darran 0:55a05330f8cc 1888 udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
darran 0:55a05330f8cc 1889 }
darran 0:55a05330f8cc 1890 else if (fc == 2)
darran 0:55a05330f8cc 1891 {
darran 0:55a05330f8cc 1892 /* reset delete (2 or more childs) */
darran 0:55a05330f8cc 1893 del_cnt = 0;
darran 0:55a05330f8cc 1894 udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
darran 0:55a05330f8cc 1895 }
darran 0:55a05330f8cc 1896 level++;
darran 0:55a05330f8cc 1897 }
darran 0:55a05330f8cc 1898 /* delete marked index nodes */
darran 0:55a05330f8cc 1899 while (del_cnt > 0)
darran 0:55a05330f8cc 1900 {
darran 0:55a05330f8cc 1901 del_cnt--;
darran 0:55a05330f8cc 1902
darran 0:55a05330f8cc 1903 udp_rn = del_rn[del_cnt];
darran 0:55a05330f8cc 1904 udp_n = del_n[del_cnt];
darran 0:55a05330f8cc 1905
darran 0:55a05330f8cc 1906 next = snmp_mib_node_delete(udp_rn, udp_n);
darran 0:55a05330f8cc 1907 if (next != NULL)
darran 0:55a05330f8cc 1908 {
darran 0:55a05330f8cc 1909 LWIP_ASSERT("next_count == 0",next->count == 0);
darran 0:55a05330f8cc 1910 snmp_mib_lrn_free(next);
darran 0:55a05330f8cc 1911 }
darran 0:55a05330f8cc 1912 }
darran 0:55a05330f8cc 1913 }
darran 0:55a05330f8cc 1914 /* disable getnext traversal on empty table */
darran 0:55a05330f8cc 1915 if (udp_root.count == 0) udptable.maxlength = 0;
darran 0:55a05330f8cc 1916 }
darran 0:55a05330f8cc 1917
darran 0:55a05330f8cc 1918
darran 0:55a05330f8cc 1919 void snmp_inc_snmpinpkts(void)
darran 0:55a05330f8cc 1920 {
darran 0:55a05330f8cc 1921 snmpinpkts++;
darran 0:55a05330f8cc 1922 }
darran 0:55a05330f8cc 1923
darran 0:55a05330f8cc 1924 void snmp_inc_snmpoutpkts(void)
darran 0:55a05330f8cc 1925 {
darran 0:55a05330f8cc 1926 snmpoutpkts++;
darran 0:55a05330f8cc 1927 }
darran 0:55a05330f8cc 1928
darran 0:55a05330f8cc 1929 void snmp_inc_snmpinbadversions(void)
darran 0:55a05330f8cc 1930 {
darran 0:55a05330f8cc 1931 snmpinbadversions++;
darran 0:55a05330f8cc 1932 }
darran 0:55a05330f8cc 1933
darran 0:55a05330f8cc 1934 void snmp_inc_snmpinbadcommunitynames(void)
darran 0:55a05330f8cc 1935 {
darran 0:55a05330f8cc 1936 snmpinbadcommunitynames++;
darran 0:55a05330f8cc 1937 }
darran 0:55a05330f8cc 1938
darran 0:55a05330f8cc 1939 void snmp_inc_snmpinbadcommunityuses(void)
darran 0:55a05330f8cc 1940 {
darran 0:55a05330f8cc 1941 snmpinbadcommunityuses++;
darran 0:55a05330f8cc 1942 }
darran 0:55a05330f8cc 1943
darran 0:55a05330f8cc 1944 void snmp_inc_snmpinasnparseerrs(void)
darran 0:55a05330f8cc 1945 {
darran 0:55a05330f8cc 1946 snmpinasnparseerrs++;
darran 0:55a05330f8cc 1947 }
darran 0:55a05330f8cc 1948
darran 0:55a05330f8cc 1949 void snmp_inc_snmpintoobigs(void)
darran 0:55a05330f8cc 1950 {
darran 0:55a05330f8cc 1951 snmpintoobigs++;
darran 0:55a05330f8cc 1952 }
darran 0:55a05330f8cc 1953
darran 0:55a05330f8cc 1954 void snmp_inc_snmpinnosuchnames(void)
darran 0:55a05330f8cc 1955 {
darran 0:55a05330f8cc 1956 snmpinnosuchnames++;
darran 0:55a05330f8cc 1957 }
darran 0:55a05330f8cc 1958
darran 0:55a05330f8cc 1959 void snmp_inc_snmpinbadvalues(void)
darran 0:55a05330f8cc 1960 {
darran 0:55a05330f8cc 1961 snmpinbadvalues++;
darran 0:55a05330f8cc 1962 }
darran 0:55a05330f8cc 1963
darran 0:55a05330f8cc 1964 void snmp_inc_snmpinreadonlys(void)
darran 0:55a05330f8cc 1965 {
darran 0:55a05330f8cc 1966 snmpinreadonlys++;
darran 0:55a05330f8cc 1967 }
darran 0:55a05330f8cc 1968
darran 0:55a05330f8cc 1969 void snmp_inc_snmpingenerrs(void)
darran 0:55a05330f8cc 1970 {
darran 0:55a05330f8cc 1971 snmpingenerrs++;
darran 0:55a05330f8cc 1972 }
darran 0:55a05330f8cc 1973
darran 0:55a05330f8cc 1974 void snmp_add_snmpintotalreqvars(u8_t value)
darran 0:55a05330f8cc 1975 {
darran 0:55a05330f8cc 1976 snmpintotalreqvars += value;
darran 0:55a05330f8cc 1977 }
darran 0:55a05330f8cc 1978
darran 0:55a05330f8cc 1979 void snmp_add_snmpintotalsetvars(u8_t value)
darran 0:55a05330f8cc 1980 {
darran 0:55a05330f8cc 1981 snmpintotalsetvars += value;
darran 0:55a05330f8cc 1982 }
darran 0:55a05330f8cc 1983
darran 0:55a05330f8cc 1984 void snmp_inc_snmpingetrequests(void)
darran 0:55a05330f8cc 1985 {
darran 0:55a05330f8cc 1986 snmpingetrequests++;
darran 0:55a05330f8cc 1987 }
darran 0:55a05330f8cc 1988
darran 0:55a05330f8cc 1989 void snmp_inc_snmpingetnexts(void)
darran 0:55a05330f8cc 1990 {
darran 0:55a05330f8cc 1991 snmpingetnexts++;
darran 0:55a05330f8cc 1992 }
darran 0:55a05330f8cc 1993
darran 0:55a05330f8cc 1994 void snmp_inc_snmpinsetrequests(void)
darran 0:55a05330f8cc 1995 {
darran 0:55a05330f8cc 1996 snmpinsetrequests++;
darran 0:55a05330f8cc 1997 }
darran 0:55a05330f8cc 1998
darran 0:55a05330f8cc 1999 void snmp_inc_snmpingetresponses(void)
darran 0:55a05330f8cc 2000 {
darran 0:55a05330f8cc 2001 snmpingetresponses++;
darran 0:55a05330f8cc 2002 }
darran 0:55a05330f8cc 2003
darran 0:55a05330f8cc 2004 void snmp_inc_snmpintraps(void)
darran 0:55a05330f8cc 2005 {
darran 0:55a05330f8cc 2006 snmpintraps++;
darran 0:55a05330f8cc 2007 }
darran 0:55a05330f8cc 2008
darran 0:55a05330f8cc 2009 void snmp_inc_snmpouttoobigs(void)
darran 0:55a05330f8cc 2010 {
darran 0:55a05330f8cc 2011 snmpouttoobigs++;
darran 0:55a05330f8cc 2012 }
darran 0:55a05330f8cc 2013
darran 0:55a05330f8cc 2014 void snmp_inc_snmpoutnosuchnames(void)
darran 0:55a05330f8cc 2015 {
darran 0:55a05330f8cc 2016 snmpoutnosuchnames++;
darran 0:55a05330f8cc 2017 }
darran 0:55a05330f8cc 2018
darran 0:55a05330f8cc 2019 void snmp_inc_snmpoutbadvalues(void)
darran 0:55a05330f8cc 2020 {
darran 0:55a05330f8cc 2021 snmpoutbadvalues++;
darran 0:55a05330f8cc 2022 }
darran 0:55a05330f8cc 2023
darran 0:55a05330f8cc 2024 void snmp_inc_snmpoutgenerrs(void)
darran 0:55a05330f8cc 2025 {
darran 0:55a05330f8cc 2026 snmpoutgenerrs++;
darran 0:55a05330f8cc 2027 }
darran 0:55a05330f8cc 2028
darran 0:55a05330f8cc 2029 void snmp_inc_snmpoutgetrequests(void)
darran 0:55a05330f8cc 2030 {
darran 0:55a05330f8cc 2031 snmpoutgetrequests++;
darran 0:55a05330f8cc 2032 }
darran 0:55a05330f8cc 2033
darran 0:55a05330f8cc 2034 void snmp_inc_snmpoutgetnexts(void)
darran 0:55a05330f8cc 2035 {
darran 0:55a05330f8cc 2036 snmpoutgetnexts++;
darran 0:55a05330f8cc 2037 }
darran 0:55a05330f8cc 2038
darran 0:55a05330f8cc 2039 void snmp_inc_snmpoutsetrequests(void)
darran 0:55a05330f8cc 2040 {
darran 0:55a05330f8cc 2041 snmpoutsetrequests++;
darran 0:55a05330f8cc 2042 }
darran 0:55a05330f8cc 2043
darran 0:55a05330f8cc 2044 void snmp_inc_snmpoutgetresponses(void)
darran 0:55a05330f8cc 2045 {
darran 0:55a05330f8cc 2046 snmpoutgetresponses++;
darran 0:55a05330f8cc 2047 }
darran 0:55a05330f8cc 2048
darran 0:55a05330f8cc 2049 void snmp_inc_snmpouttraps(void)
darran 0:55a05330f8cc 2050 {
darran 0:55a05330f8cc 2051 snmpouttraps++;
darran 0:55a05330f8cc 2052 }
darran 0:55a05330f8cc 2053
darran 0:55a05330f8cc 2054 void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid)
darran 0:55a05330f8cc 2055 {
darran 0:55a05330f8cc 2056 *oid = &snmpgrp_id;
darran 0:55a05330f8cc 2057 }
darran 0:55a05330f8cc 2058
darran 0:55a05330f8cc 2059 void snmp_set_snmpenableauthentraps(u8_t *value)
darran 0:55a05330f8cc 2060 {
darran 0:55a05330f8cc 2061 if (value != NULL)
darran 0:55a05330f8cc 2062 {
darran 0:55a05330f8cc 2063 snmpenableauthentraps_ptr = value;
darran 0:55a05330f8cc 2064 }
darran 0:55a05330f8cc 2065 }
darran 0:55a05330f8cc 2066
darran 0:55a05330f8cc 2067 void snmp_get_snmpenableauthentraps(u8_t *value)
darran 0:55a05330f8cc 2068 {
darran 0:55a05330f8cc 2069 *value = *snmpenableauthentraps_ptr;
darran 0:55a05330f8cc 2070 }
darran 0:55a05330f8cc 2071
darran 0:55a05330f8cc 2072 void
darran 0:55a05330f8cc 2073 noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 2074 {
darran 0:55a05330f8cc 2075 LWIP_UNUSED_ARG(ident_len);
darran 0:55a05330f8cc 2076 LWIP_UNUSED_ARG(ident);
darran 0:55a05330f8cc 2077 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 2078 }
darran 0:55a05330f8cc 2079
darran 0:55a05330f8cc 2080 void
darran 0:55a05330f8cc 2081 noleafs_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2082 {
darran 0:55a05330f8cc 2083 LWIP_UNUSED_ARG(od);
darran 0:55a05330f8cc 2084 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 2085 LWIP_UNUSED_ARG(value);
darran 0:55a05330f8cc 2086 }
darran 0:55a05330f8cc 2087
darran 0:55a05330f8cc 2088 u8_t
darran 0:55a05330f8cc 2089 noleafs_set_test(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2090 {
darran 0:55a05330f8cc 2091 LWIP_UNUSED_ARG(od);
darran 0:55a05330f8cc 2092 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 2093 LWIP_UNUSED_ARG(value);
darran 0:55a05330f8cc 2094 /* can't set */
darran 0:55a05330f8cc 2095 return 0;
darran 0:55a05330f8cc 2096 }
darran 0:55a05330f8cc 2097
darran 0:55a05330f8cc 2098 void
darran 0:55a05330f8cc 2099 noleafs_set_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2100 {
darran 0:55a05330f8cc 2101 LWIP_UNUSED_ARG(od);
darran 0:55a05330f8cc 2102 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 2103 LWIP_UNUSED_ARG(value);
darran 0:55a05330f8cc 2104 }
darran 0:55a05330f8cc 2105
darran 0:55a05330f8cc 2106
darran 0:55a05330f8cc 2107 /**
darran 0:55a05330f8cc 2108 * Returns systems object definitions.
darran 0:55a05330f8cc 2109 *
darran 0:55a05330f8cc 2110 * @param ident_len the address length (2)
darran 0:55a05330f8cc 2111 * @param ident points to objectname.0 (object id trailer)
darran 0:55a05330f8cc 2112 * @param od points to object definition.
darran 0:55a05330f8cc 2113 */
darran 0:55a05330f8cc 2114 static void
darran 0:55a05330f8cc 2115 system_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 2116 {
darran 0:55a05330f8cc 2117 u8_t id;
darran 0:55a05330f8cc 2118
darran 0:55a05330f8cc 2119 /* return to object name, adding index depth (1) */
darran 0:55a05330f8cc 2120 ident_len += 1;
darran 0:55a05330f8cc 2121 ident -= 1;
darran 0:55a05330f8cc 2122 if (ident_len == 2)
darran 0:55a05330f8cc 2123 {
darran 0:55a05330f8cc 2124 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 2125 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 2126
darran 0:55a05330f8cc 2127 LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
darran 0:55a05330f8cc 2128 id = (u8_t)ident[0];
darran 0:55a05330f8cc 2129 LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def system.%"U16_F".0\n",(u16_t)id));
darran 0:55a05330f8cc 2130 switch (id)
darran 0:55a05330f8cc 2131 {
darran 0:55a05330f8cc 2132 case 1: /* sysDescr */
darran 0:55a05330f8cc 2133 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 2134 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2135 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
darran 0:55a05330f8cc 2136 od->v_len = *sysdescr_len_ptr;
darran 0:55a05330f8cc 2137 break;
darran 0:55a05330f8cc 2138 case 2: /* sysObjectID */
darran 0:55a05330f8cc 2139 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 2140 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2141 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
darran 0:55a05330f8cc 2142 od->v_len = sysobjid.len * sizeof(s32_t);
darran 0:55a05330f8cc 2143 break;
darran 0:55a05330f8cc 2144 case 3: /* sysUpTime */
darran 0:55a05330f8cc 2145 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 2146 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2147 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS);
darran 0:55a05330f8cc 2148 od->v_len = sizeof(u32_t);
darran 0:55a05330f8cc 2149 break;
darran 0:55a05330f8cc 2150 case 4: /* sysContact */
darran 0:55a05330f8cc 2151 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 2152 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 2153 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
darran 0:55a05330f8cc 2154 od->v_len = *syscontact_len_ptr;
darran 0:55a05330f8cc 2155 break;
darran 0:55a05330f8cc 2156 case 5: /* sysName */
darran 0:55a05330f8cc 2157 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 2158 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 2159 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
darran 0:55a05330f8cc 2160 od->v_len = *sysname_len_ptr;
darran 0:55a05330f8cc 2161 break;
darran 0:55a05330f8cc 2162 case 6: /* sysLocation */
darran 0:55a05330f8cc 2163 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 2164 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 2165 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
darran 0:55a05330f8cc 2166 od->v_len = *syslocation_len_ptr;
darran 0:55a05330f8cc 2167 break;
darran 0:55a05330f8cc 2168 case 7: /* sysServices */
darran 0:55a05330f8cc 2169 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 2170 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2171 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 2172 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 2173 break;
darran 0:55a05330f8cc 2174 default:
darran 0:55a05330f8cc 2175 LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def: no such object\n"));
darran 0:55a05330f8cc 2176 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 2177 break;
darran 0:55a05330f8cc 2178 };
darran 0:55a05330f8cc 2179 }
darran 0:55a05330f8cc 2180 else
darran 0:55a05330f8cc 2181 {
darran 0:55a05330f8cc 2182 LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 2183 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 2184 }
darran 0:55a05330f8cc 2185 }
darran 0:55a05330f8cc 2186
darran 0:55a05330f8cc 2187 /**
darran 0:55a05330f8cc 2188 * Returns system object value.
darran 0:55a05330f8cc 2189 *
darran 0:55a05330f8cc 2190 * @param ident_len the address length (2)
darran 0:55a05330f8cc 2191 * @param ident points to objectname.0 (object id trailer)
darran 0:55a05330f8cc 2192 * @param len return value space (in bytes)
darran 0:55a05330f8cc 2193 * @param value points to (varbind) space to copy value into.
darran 0:55a05330f8cc 2194 */
darran 0:55a05330f8cc 2195 static void
darran 0:55a05330f8cc 2196 system_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2197 {
darran 0:55a05330f8cc 2198 u8_t id;
darran 0:55a05330f8cc 2199
darran 0:55a05330f8cc 2200 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 2201 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 2202 switch (id)
darran 0:55a05330f8cc 2203 {
darran 0:55a05330f8cc 2204 case 1: /* sysDescr */
darran 0:55a05330f8cc 2205 ocstrncpy((u8_t*)value, sysdescr_ptr, len);
darran 0:55a05330f8cc 2206 break;
darran 0:55a05330f8cc 2207 case 2: /* sysObjectID */
darran 0:55a05330f8cc 2208 objectidncpy((s32_t*)value, (s32_t*)sysobjid.id, (u8_t)(len / sizeof(s32_t)));
darran 0:55a05330f8cc 2209 break;
darran 0:55a05330f8cc 2210 case 3: /* sysUpTime */
darran 0:55a05330f8cc 2211 {
darran 0:55a05330f8cc 2212 snmp_get_sysuptime((u32_t*)value);
darran 0:55a05330f8cc 2213 }
darran 0:55a05330f8cc 2214 break;
darran 0:55a05330f8cc 2215 case 4: /* sysContact */
darran 0:55a05330f8cc 2216 ocstrncpy((u8_t*)value, syscontact_ptr, len);
darran 0:55a05330f8cc 2217 break;
darran 0:55a05330f8cc 2218 case 5: /* sysName */
darran 0:55a05330f8cc 2219 ocstrncpy((u8_t*)value, sysname_ptr, len);
darran 0:55a05330f8cc 2220 break;
darran 0:55a05330f8cc 2221 case 6: /* sysLocation */
darran 0:55a05330f8cc 2222 ocstrncpy((u8_t*)value, syslocation_ptr, len);
darran 0:55a05330f8cc 2223 break;
darran 0:55a05330f8cc 2224 case 7: /* sysServices */
darran 0:55a05330f8cc 2225 {
darran 0:55a05330f8cc 2226 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2227 *sint_ptr = sysservices;
darran 0:55a05330f8cc 2228 }
darran 0:55a05330f8cc 2229 break;
darran 0:55a05330f8cc 2230 };
darran 0:55a05330f8cc 2231 }
darran 0:55a05330f8cc 2232
darran 0:55a05330f8cc 2233 static u8_t
darran 0:55a05330f8cc 2234 system_set_test(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2235 {
darran 0:55a05330f8cc 2236 u8_t id, set_ok;
darran 0:55a05330f8cc 2237
darran 0:55a05330f8cc 2238 LWIP_UNUSED_ARG(value);
darran 0:55a05330f8cc 2239 set_ok = 0;
darran 0:55a05330f8cc 2240 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 2241 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 2242 switch (id)
darran 0:55a05330f8cc 2243 {
darran 0:55a05330f8cc 2244 case 4: /* sysContact */
darran 0:55a05330f8cc 2245 if ((syscontact_ptr != syscontact_default) &&
darran 0:55a05330f8cc 2246 (len <= 255))
darran 0:55a05330f8cc 2247 {
darran 0:55a05330f8cc 2248 set_ok = 1;
darran 0:55a05330f8cc 2249 }
darran 0:55a05330f8cc 2250 break;
darran 0:55a05330f8cc 2251 case 5: /* sysName */
darran 0:55a05330f8cc 2252 if ((sysname_ptr != sysname_default) &&
darran 0:55a05330f8cc 2253 (len <= 255))
darran 0:55a05330f8cc 2254 {
darran 0:55a05330f8cc 2255 set_ok = 1;
darran 0:55a05330f8cc 2256 }
darran 0:55a05330f8cc 2257 break;
darran 0:55a05330f8cc 2258 case 6: /* sysLocation */
darran 0:55a05330f8cc 2259 if ((syslocation_ptr != syslocation_default) &&
darran 0:55a05330f8cc 2260 (len <= 255))
darran 0:55a05330f8cc 2261 {
darran 0:55a05330f8cc 2262 set_ok = 1;
darran 0:55a05330f8cc 2263 }
darran 0:55a05330f8cc 2264 break;
darran 0:55a05330f8cc 2265 };
darran 0:55a05330f8cc 2266 return set_ok;
darran 0:55a05330f8cc 2267 }
darran 0:55a05330f8cc 2268
darran 0:55a05330f8cc 2269 static void
darran 0:55a05330f8cc 2270 system_set_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2271 {
darran 0:55a05330f8cc 2272 u8_t id;
darran 0:55a05330f8cc 2273
darran 0:55a05330f8cc 2274 LWIP_ASSERT("invalid len", len <= 0xff);
darran 0:55a05330f8cc 2275 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 2276 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 2277 switch (id)
darran 0:55a05330f8cc 2278 {
darran 0:55a05330f8cc 2279 case 4: /* sysContact */
darran 0:55a05330f8cc 2280 ocstrncpy(syscontact_ptr, (u8_t*)value, len);
darran 0:55a05330f8cc 2281 *syscontact_len_ptr = (u8_t)len;
darran 0:55a05330f8cc 2282 break;
darran 0:55a05330f8cc 2283 case 5: /* sysName */
darran 0:55a05330f8cc 2284 ocstrncpy(sysname_ptr, (u8_t*)value, len);
darran 0:55a05330f8cc 2285 *sysname_len_ptr = (u8_t)len;
darran 0:55a05330f8cc 2286 break;
darran 0:55a05330f8cc 2287 case 6: /* sysLocation */
darran 0:55a05330f8cc 2288 ocstrncpy(syslocation_ptr, (u8_t*)value, len);
darran 0:55a05330f8cc 2289 *syslocation_len_ptr = (u8_t)len;
darran 0:55a05330f8cc 2290 break;
darran 0:55a05330f8cc 2291 };
darran 0:55a05330f8cc 2292 }
darran 0:55a05330f8cc 2293
darran 0:55a05330f8cc 2294 /**
darran 0:55a05330f8cc 2295 * Returns interfaces.ifnumber object definition.
darran 0:55a05330f8cc 2296 *
darran 0:55a05330f8cc 2297 * @param ident_len the address length (2)
darran 0:55a05330f8cc 2298 * @param ident points to objectname.index
darran 0:55a05330f8cc 2299 * @param od points to object definition.
darran 0:55a05330f8cc 2300 */
darran 0:55a05330f8cc 2301 static void
darran 0:55a05330f8cc 2302 interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 2303 {
darran 0:55a05330f8cc 2304 /* return to object name, adding index depth (1) */
darran 0:55a05330f8cc 2305 ident_len += 1;
darran 0:55a05330f8cc 2306 ident -= 1;
darran 0:55a05330f8cc 2307 if (ident_len == 2)
darran 0:55a05330f8cc 2308 {
darran 0:55a05330f8cc 2309 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 2310 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 2311
darran 0:55a05330f8cc 2312 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 2313 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2314 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 2315 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 2316 }
darran 0:55a05330f8cc 2317 else
darran 0:55a05330f8cc 2318 {
darran 0:55a05330f8cc 2319 LWIP_DEBUGF(SNMP_MIB_DEBUG,("interfaces_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 2320 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 2321 }
darran 0:55a05330f8cc 2322 }
darran 0:55a05330f8cc 2323
darran 0:55a05330f8cc 2324 /**
darran 0:55a05330f8cc 2325 * Returns interfaces.ifnumber object value.
darran 0:55a05330f8cc 2326 *
darran 0:55a05330f8cc 2327 * @param ident_len the address length (2)
darran 0:55a05330f8cc 2328 * @param ident points to objectname.0 (object id trailer)
darran 0:55a05330f8cc 2329 * @param len return value space (in bytes)
darran 0:55a05330f8cc 2330 * @param value points to (varbind) space to copy value into.
darran 0:55a05330f8cc 2331 */
darran 0:55a05330f8cc 2332 static void
darran 0:55a05330f8cc 2333 interfaces_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2334 {
darran 0:55a05330f8cc 2335 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 2336 if (od->id_inst_ptr[0] == 1)
darran 0:55a05330f8cc 2337 {
darran 0:55a05330f8cc 2338 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2339 *sint_ptr = iflist_root.count;
darran 0:55a05330f8cc 2340 }
darran 0:55a05330f8cc 2341 }
darran 0:55a05330f8cc 2342
darran 0:55a05330f8cc 2343 /**
darran 0:55a05330f8cc 2344 * Returns ifentry object definitions.
darran 0:55a05330f8cc 2345 *
darran 0:55a05330f8cc 2346 * @param ident_len the address length (2)
darran 0:55a05330f8cc 2347 * @param ident points to objectname.index
darran 0:55a05330f8cc 2348 * @param od points to object definition.
darran 0:55a05330f8cc 2349 */
darran 0:55a05330f8cc 2350 static void
darran 0:55a05330f8cc 2351 ifentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 2352 {
darran 0:55a05330f8cc 2353 u8_t id;
darran 0:55a05330f8cc 2354
darran 0:55a05330f8cc 2355 /* return to object name, adding index depth (1) */
darran 0:55a05330f8cc 2356 ident_len += 1;
darran 0:55a05330f8cc 2357 ident -= 1;
darran 0:55a05330f8cc 2358 if (ident_len == 2)
darran 0:55a05330f8cc 2359 {
darran 0:55a05330f8cc 2360 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 2361 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 2362
darran 0:55a05330f8cc 2363 LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
darran 0:55a05330f8cc 2364 id = (u8_t)ident[0];
darran 0:55a05330f8cc 2365 LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ifentry.%"U16_F"\n",(u16_t)id));
darran 0:55a05330f8cc 2366 switch (id)
darran 0:55a05330f8cc 2367 {
darran 0:55a05330f8cc 2368 case 1: /* ifIndex */
darran 0:55a05330f8cc 2369 case 3: /* ifType */
darran 0:55a05330f8cc 2370 case 4: /* ifMtu */
darran 0:55a05330f8cc 2371 case 8: /* ifOperStatus */
darran 0:55a05330f8cc 2372 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 2373 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2374 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 2375 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 2376 break;
darran 0:55a05330f8cc 2377 case 2: /* ifDescr */
darran 0:55a05330f8cc 2378 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 2379 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2380 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
darran 0:55a05330f8cc 2381 /** @todo this should be some sort of sizeof(struct netif.name) */
darran 0:55a05330f8cc 2382 od->v_len = 2;
darran 0:55a05330f8cc 2383 break;
darran 0:55a05330f8cc 2384 case 5: /* ifSpeed */
darran 0:55a05330f8cc 2385 case 21: /* ifOutQLen */
darran 0:55a05330f8cc 2386 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 2387 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2388 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE);
darran 0:55a05330f8cc 2389 od->v_len = sizeof(u32_t);
darran 0:55a05330f8cc 2390 break;
darran 0:55a05330f8cc 2391 case 6: /* ifPhysAddress */
darran 0:55a05330f8cc 2392 {
darran 0:55a05330f8cc 2393 struct netif *netif;
darran 0:55a05330f8cc 2394
darran 0:55a05330f8cc 2395 snmp_ifindextonetif(ident[1], &netif);
darran 0:55a05330f8cc 2396 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 2397 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2398 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
darran 0:55a05330f8cc 2399 od->v_len = netif->hwaddr_len;
darran 0:55a05330f8cc 2400 }
darran 0:55a05330f8cc 2401 break;
darran 0:55a05330f8cc 2402 case 7: /* ifAdminStatus */
darran 0:55a05330f8cc 2403 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 2404 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 2405 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 2406 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 2407 break;
darran 0:55a05330f8cc 2408 case 9: /* ifLastChange */
darran 0:55a05330f8cc 2409 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 2410 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2411 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS);
darran 0:55a05330f8cc 2412 od->v_len = sizeof(u32_t);
darran 0:55a05330f8cc 2413 break;
darran 0:55a05330f8cc 2414 case 10: /* ifInOctets */
darran 0:55a05330f8cc 2415 case 11: /* ifInUcastPkts */
darran 0:55a05330f8cc 2416 case 12: /* ifInNUcastPkts */
darran 0:55a05330f8cc 2417 case 13: /* ifInDiscarts */
darran 0:55a05330f8cc 2418 case 14: /* ifInErrors */
darran 0:55a05330f8cc 2419 case 15: /* ifInUnkownProtos */
darran 0:55a05330f8cc 2420 case 16: /* ifOutOctets */
darran 0:55a05330f8cc 2421 case 17: /* ifOutUcastPkts */
darran 0:55a05330f8cc 2422 case 18: /* ifOutNUcastPkts */
darran 0:55a05330f8cc 2423 case 19: /* ifOutDiscarts */
darran 0:55a05330f8cc 2424 case 20: /* ifOutErrors */
darran 0:55a05330f8cc 2425 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 2426 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2427 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
darran 0:55a05330f8cc 2428 od->v_len = sizeof(u32_t);
darran 0:55a05330f8cc 2429 break;
darran 0:55a05330f8cc 2430 case 22: /* ifSpecific */
darran 0:55a05330f8cc 2431 /** @note returning zeroDotZero (0.0) no media specific MIB support */
darran 0:55a05330f8cc 2432 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 2433 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2434 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
darran 0:55a05330f8cc 2435 od->v_len = ifspecific.len * sizeof(s32_t);
darran 0:55a05330f8cc 2436 break;
darran 0:55a05330f8cc 2437 default:
darran 0:55a05330f8cc 2438 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ifentry_get_object_def: no such object\n"));
darran 0:55a05330f8cc 2439 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 2440 break;
darran 0:55a05330f8cc 2441 };
darran 0:55a05330f8cc 2442 }
darran 0:55a05330f8cc 2443 else
darran 0:55a05330f8cc 2444 {
darran 0:55a05330f8cc 2445 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ifentry_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 2446 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 2447 }
darran 0:55a05330f8cc 2448 }
darran 0:55a05330f8cc 2449
darran 0:55a05330f8cc 2450 /**
darran 0:55a05330f8cc 2451 * Returns ifentry object value.
darran 0:55a05330f8cc 2452 *
darran 0:55a05330f8cc 2453 * @param ident_len the address length (2)
darran 0:55a05330f8cc 2454 * @param ident points to objectname.0 (object id trailer)
darran 0:55a05330f8cc 2455 * @param len return value space (in bytes)
darran 0:55a05330f8cc 2456 * @param value points to (varbind) space to copy value into.
darran 0:55a05330f8cc 2457 */
darran 0:55a05330f8cc 2458 static void
darran 0:55a05330f8cc 2459 ifentry_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2460 {
darran 0:55a05330f8cc 2461 struct netif *netif;
darran 0:55a05330f8cc 2462 u8_t id;
darran 0:55a05330f8cc 2463
darran 0:55a05330f8cc 2464 snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
darran 0:55a05330f8cc 2465 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 2466 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 2467 switch (id)
darran 0:55a05330f8cc 2468 {
darran 0:55a05330f8cc 2469 case 1: /* ifIndex */
darran 0:55a05330f8cc 2470 {
darran 0:55a05330f8cc 2471 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2472 *sint_ptr = od->id_inst_ptr[1];
darran 0:55a05330f8cc 2473 }
darran 0:55a05330f8cc 2474 break;
darran 0:55a05330f8cc 2475 case 2: /* ifDescr */
darran 0:55a05330f8cc 2476 ocstrncpy((u8_t*)value, (u8_t*)netif->name, len);
darran 0:55a05330f8cc 2477 break;
darran 0:55a05330f8cc 2478 case 3: /* ifType */
darran 0:55a05330f8cc 2479 {
darran 0:55a05330f8cc 2480 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2481 *sint_ptr = netif->link_type;
darran 0:55a05330f8cc 2482 }
darran 0:55a05330f8cc 2483 break;
darran 0:55a05330f8cc 2484 case 4: /* ifMtu */
darran 0:55a05330f8cc 2485 {
darran 0:55a05330f8cc 2486 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2487 *sint_ptr = netif->mtu;
darran 0:55a05330f8cc 2488 }
darran 0:55a05330f8cc 2489 break;
darran 0:55a05330f8cc 2490 case 5: /* ifSpeed */
darran 0:55a05330f8cc 2491 {
darran 0:55a05330f8cc 2492 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2493 *uint_ptr = netif->link_speed;
darran 0:55a05330f8cc 2494 }
darran 0:55a05330f8cc 2495 break;
darran 0:55a05330f8cc 2496 case 6: /* ifPhysAddress */
darran 0:55a05330f8cc 2497 ocstrncpy((u8_t*)value, netif->hwaddr, len);
darran 0:55a05330f8cc 2498 break;
darran 0:55a05330f8cc 2499 case 7: /* ifAdminStatus */
darran 0:55a05330f8cc 2500 {
darran 0:55a05330f8cc 2501 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2502 if (netif_is_up(netif))
darran 0:55a05330f8cc 2503 {
darran 0:55a05330f8cc 2504 if (netif_is_link_up(netif))
darran 0:55a05330f8cc 2505 {
darran 0:55a05330f8cc 2506 *sint_ptr = 1; /* up */
darran 0:55a05330f8cc 2507 }
darran 0:55a05330f8cc 2508 else
darran 0:55a05330f8cc 2509 {
darran 0:55a05330f8cc 2510 *sint_ptr = 7; /* lowerLayerDown */
darran 0:55a05330f8cc 2511 }
darran 0:55a05330f8cc 2512 }
darran 0:55a05330f8cc 2513 else
darran 0:55a05330f8cc 2514 {
darran 0:55a05330f8cc 2515 *sint_ptr = 2; /* down */
darran 0:55a05330f8cc 2516 }
darran 0:55a05330f8cc 2517 }
darran 0:55a05330f8cc 2518 break;
darran 0:55a05330f8cc 2519 case 8: /* ifOperStatus */
darran 0:55a05330f8cc 2520 {
darran 0:55a05330f8cc 2521 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2522 if (netif_is_up(netif))
darran 0:55a05330f8cc 2523 {
darran 0:55a05330f8cc 2524 *sint_ptr = 1;
darran 0:55a05330f8cc 2525 }
darran 0:55a05330f8cc 2526 else
darran 0:55a05330f8cc 2527 {
darran 0:55a05330f8cc 2528 *sint_ptr = 2;
darran 0:55a05330f8cc 2529 }
darran 0:55a05330f8cc 2530 }
darran 0:55a05330f8cc 2531 break;
darran 0:55a05330f8cc 2532 case 9: /* ifLastChange */
darran 0:55a05330f8cc 2533 {
darran 0:55a05330f8cc 2534 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2535 *uint_ptr = netif->ts;
darran 0:55a05330f8cc 2536 }
darran 0:55a05330f8cc 2537 break;
darran 0:55a05330f8cc 2538 case 10: /* ifInOctets */
darran 0:55a05330f8cc 2539 {
darran 0:55a05330f8cc 2540 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2541 *uint_ptr = netif->ifinoctets;
darran 0:55a05330f8cc 2542 }
darran 0:55a05330f8cc 2543 break;
darran 0:55a05330f8cc 2544 case 11: /* ifInUcastPkts */
darran 0:55a05330f8cc 2545 {
darran 0:55a05330f8cc 2546 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2547 *uint_ptr = netif->ifinucastpkts;
darran 0:55a05330f8cc 2548 }
darran 0:55a05330f8cc 2549 break;
darran 0:55a05330f8cc 2550 case 12: /* ifInNUcastPkts */
darran 0:55a05330f8cc 2551 {
darran 0:55a05330f8cc 2552 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2553 *uint_ptr = netif->ifinnucastpkts;
darran 0:55a05330f8cc 2554 }
darran 0:55a05330f8cc 2555 break;
darran 0:55a05330f8cc 2556 case 13: /* ifInDiscarts */
darran 0:55a05330f8cc 2557 {
darran 0:55a05330f8cc 2558 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2559 *uint_ptr = netif->ifindiscards;
darran 0:55a05330f8cc 2560 }
darran 0:55a05330f8cc 2561 break;
darran 0:55a05330f8cc 2562 case 14: /* ifInErrors */
darran 0:55a05330f8cc 2563 case 15: /* ifInUnkownProtos */
darran 0:55a05330f8cc 2564 /** @todo add these counters! */
darran 0:55a05330f8cc 2565 {
darran 0:55a05330f8cc 2566 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2567 *uint_ptr = 0;
darran 0:55a05330f8cc 2568 }
darran 0:55a05330f8cc 2569 break;
darran 0:55a05330f8cc 2570 case 16: /* ifOutOctets */
darran 0:55a05330f8cc 2571 {
darran 0:55a05330f8cc 2572 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2573 *uint_ptr = netif->ifoutoctets;
darran 0:55a05330f8cc 2574 }
darran 0:55a05330f8cc 2575 break;
darran 0:55a05330f8cc 2576 case 17: /* ifOutUcastPkts */
darran 0:55a05330f8cc 2577 {
darran 0:55a05330f8cc 2578 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2579 *uint_ptr = netif->ifoutucastpkts;
darran 0:55a05330f8cc 2580 }
darran 0:55a05330f8cc 2581 break;
darran 0:55a05330f8cc 2582 case 18: /* ifOutNUcastPkts */
darran 0:55a05330f8cc 2583 {
darran 0:55a05330f8cc 2584 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2585 *uint_ptr = netif->ifoutnucastpkts;
darran 0:55a05330f8cc 2586 }
darran 0:55a05330f8cc 2587 break;
darran 0:55a05330f8cc 2588 case 19: /* ifOutDiscarts */
darran 0:55a05330f8cc 2589 {
darran 0:55a05330f8cc 2590 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2591 *uint_ptr = netif->ifoutdiscards;
darran 0:55a05330f8cc 2592 }
darran 0:55a05330f8cc 2593 break;
darran 0:55a05330f8cc 2594 case 20: /* ifOutErrors */
darran 0:55a05330f8cc 2595 /** @todo add this counter! */
darran 0:55a05330f8cc 2596 {
darran 0:55a05330f8cc 2597 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2598 *uint_ptr = 0;
darran 0:55a05330f8cc 2599 }
darran 0:55a05330f8cc 2600 break;
darran 0:55a05330f8cc 2601 case 21: /* ifOutQLen */
darran 0:55a05330f8cc 2602 /** @todo figure out if this must be 0 (no queue) or 1? */
darran 0:55a05330f8cc 2603 {
darran 0:55a05330f8cc 2604 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2605 *uint_ptr = 0;
darran 0:55a05330f8cc 2606 }
darran 0:55a05330f8cc 2607 break;
darran 0:55a05330f8cc 2608 case 22: /* ifSpecific */
darran 0:55a05330f8cc 2609 objectidncpy((s32_t*)value, (s32_t*)ifspecific.id, (u8_t)(len / sizeof(s32_t)));
darran 0:55a05330f8cc 2610 break;
darran 0:55a05330f8cc 2611 };
darran 0:55a05330f8cc 2612 }
darran 0:55a05330f8cc 2613
darran 0:55a05330f8cc 2614 #if !SNMP_SAFE_REQUESTS
darran 0:55a05330f8cc 2615 static u8_t
darran 0:55a05330f8cc 2616 ifentry_set_test(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2617 {
darran 0:55a05330f8cc 2618 struct netif *netif;
darran 0:55a05330f8cc 2619 u8_t id, set_ok;
darran 0:55a05330f8cc 2620 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 2621
darran 0:55a05330f8cc 2622 set_ok = 0;
darran 0:55a05330f8cc 2623 snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
darran 0:55a05330f8cc 2624 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 2625 switch (id)
darran 0:55a05330f8cc 2626 {
darran 0:55a05330f8cc 2627 case 7: /* ifAdminStatus */
darran 0:55a05330f8cc 2628 {
darran 0:55a05330f8cc 2629 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2630 if (*sint_ptr == 1 || *sint_ptr == 2)
darran 0:55a05330f8cc 2631 set_ok = 1;
darran 0:55a05330f8cc 2632 }
darran 0:55a05330f8cc 2633 break;
darran 0:55a05330f8cc 2634 }
darran 0:55a05330f8cc 2635 return set_ok;
darran 0:55a05330f8cc 2636 }
darran 0:55a05330f8cc 2637
darran 0:55a05330f8cc 2638 static void
darran 0:55a05330f8cc 2639 ifentry_set_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2640 {
darran 0:55a05330f8cc 2641 struct netif *netif;
darran 0:55a05330f8cc 2642 u8_t id;
darran 0:55a05330f8cc 2643 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 2644
darran 0:55a05330f8cc 2645 snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
darran 0:55a05330f8cc 2646 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 2647 switch (id)
darran 0:55a05330f8cc 2648 {
darran 0:55a05330f8cc 2649 case 7: /* ifAdminStatus */
darran 0:55a05330f8cc 2650 {
darran 0:55a05330f8cc 2651 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2652 if (*sint_ptr == 1)
darran 0:55a05330f8cc 2653 {
darran 0:55a05330f8cc 2654 netif_set_up(netif);
darran 0:55a05330f8cc 2655 }
darran 0:55a05330f8cc 2656 else if (*sint_ptr == 2)
darran 0:55a05330f8cc 2657 {
darran 0:55a05330f8cc 2658 netif_set_down(netif);
darran 0:55a05330f8cc 2659 }
darran 0:55a05330f8cc 2660 }
darran 0:55a05330f8cc 2661 break;
darran 0:55a05330f8cc 2662 }
darran 0:55a05330f8cc 2663 }
darran 0:55a05330f8cc 2664 #endif /* SNMP_SAFE_REQUESTS */
darran 0:55a05330f8cc 2665
darran 0:55a05330f8cc 2666 /**
darran 0:55a05330f8cc 2667 * Returns atentry object definitions.
darran 0:55a05330f8cc 2668 *
darran 0:55a05330f8cc 2669 * @param ident_len the address length (6)
darran 0:55a05330f8cc 2670 * @param ident points to objectname.atifindex.atnetaddress
darran 0:55a05330f8cc 2671 * @param od points to object definition.
darran 0:55a05330f8cc 2672 */
darran 0:55a05330f8cc 2673 static void
darran 0:55a05330f8cc 2674 atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 2675 {
darran 0:55a05330f8cc 2676 /* return to object name, adding index depth (5) */
darran 0:55a05330f8cc 2677 ident_len += 5;
darran 0:55a05330f8cc 2678 ident -= 5;
darran 0:55a05330f8cc 2679
darran 0:55a05330f8cc 2680 if (ident_len == 6)
darran 0:55a05330f8cc 2681 {
darran 0:55a05330f8cc 2682 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 2683 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 2684
darran 0:55a05330f8cc 2685 switch (ident[0])
darran 0:55a05330f8cc 2686 {
darran 0:55a05330f8cc 2687 case 1: /* atIfIndex */
darran 0:55a05330f8cc 2688 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 2689 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 2690 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 2691 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 2692 break;
darran 0:55a05330f8cc 2693 case 2: /* atPhysAddress */
darran 0:55a05330f8cc 2694 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 2695 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 2696 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
darran 0:55a05330f8cc 2697 od->v_len = 6; /** @todo try to use netif::hwaddr_len */
darran 0:55a05330f8cc 2698 break;
darran 0:55a05330f8cc 2699 case 3: /* atNetAddress */
darran 0:55a05330f8cc 2700 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 2701 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 2702 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
darran 0:55a05330f8cc 2703 od->v_len = 4;
darran 0:55a05330f8cc 2704 break;
darran 0:55a05330f8cc 2705 default:
darran 0:55a05330f8cc 2706 LWIP_DEBUGF(SNMP_MIB_DEBUG,("atentry_get_object_def: no such object\n"));
darran 0:55a05330f8cc 2707 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 2708 break;
darran 0:55a05330f8cc 2709 }
darran 0:55a05330f8cc 2710 }
darran 0:55a05330f8cc 2711 else
darran 0:55a05330f8cc 2712 {
darran 0:55a05330f8cc 2713 LWIP_DEBUGF(SNMP_MIB_DEBUG,("atentry_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 2714 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 2715 }
darran 0:55a05330f8cc 2716 }
darran 0:55a05330f8cc 2717
darran 0:55a05330f8cc 2718 static void
darran 0:55a05330f8cc 2719 atentry_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2720 {
darran 0:55a05330f8cc 2721 #if LWIP_ARP
darran 0:55a05330f8cc 2722 u8_t id;
darran 0:55a05330f8cc 2723 struct eth_addr* ethaddr_ret;
darran 0:55a05330f8cc 2724 ip_addr_t* ipaddr_ret;
darran 0:55a05330f8cc 2725 #endif /* LWIP_ARP */
darran 0:55a05330f8cc 2726 ip_addr_t ip;
darran 0:55a05330f8cc 2727 struct netif *netif;
darran 0:55a05330f8cc 2728
darran 0:55a05330f8cc 2729 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 2730 LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
darran 0:55a05330f8cc 2731
darran 0:55a05330f8cc 2732 snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
darran 0:55a05330f8cc 2733 snmp_oidtoip(&od->id_inst_ptr[2], &ip);
darran 0:55a05330f8cc 2734
darran 0:55a05330f8cc 2735 #if LWIP_ARP /** @todo implement a netif_find_addr */
darran 0:55a05330f8cc 2736 if (etharp_find_addr(netif, &ip, &ethaddr_ret, &ipaddr_ret) > -1)
darran 0:55a05330f8cc 2737 {
darran 0:55a05330f8cc 2738 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 2739 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 2740 switch (id)
darran 0:55a05330f8cc 2741 {
darran 0:55a05330f8cc 2742 case 1: /* atIfIndex */
darran 0:55a05330f8cc 2743 {
darran 0:55a05330f8cc 2744 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2745 *sint_ptr = od->id_inst_ptr[1];
darran 0:55a05330f8cc 2746 }
darran 0:55a05330f8cc 2747 break;
darran 0:55a05330f8cc 2748 case 2: /* atPhysAddress */
darran 0:55a05330f8cc 2749 {
darran 0:55a05330f8cc 2750 struct eth_addr *dst = (struct eth_addr*)value;
darran 0:55a05330f8cc 2751
darran 0:55a05330f8cc 2752 *dst = *ethaddr_ret;
darran 0:55a05330f8cc 2753 }
darran 0:55a05330f8cc 2754 break;
darran 0:55a05330f8cc 2755 case 3: /* atNetAddress */
darran 0:55a05330f8cc 2756 {
darran 0:55a05330f8cc 2757 ip_addr_t *dst = (ip_addr_t*)value;
darran 0:55a05330f8cc 2758
darran 0:55a05330f8cc 2759 *dst = *ipaddr_ret;
darran 0:55a05330f8cc 2760 }
darran 0:55a05330f8cc 2761 break;
darran 0:55a05330f8cc 2762 }
darran 0:55a05330f8cc 2763 }
darran 0:55a05330f8cc 2764 #endif /* LWIP_ARP */
darran 0:55a05330f8cc 2765 }
darran 0:55a05330f8cc 2766
darran 0:55a05330f8cc 2767 static void
darran 0:55a05330f8cc 2768 ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 2769 {
darran 0:55a05330f8cc 2770 u8_t id;
darran 0:55a05330f8cc 2771
darran 0:55a05330f8cc 2772 /* return to object name, adding index depth (1) */
darran 0:55a05330f8cc 2773 ident_len += 1;
darran 0:55a05330f8cc 2774 ident -= 1;
darran 0:55a05330f8cc 2775 if (ident_len == 2)
darran 0:55a05330f8cc 2776 {
darran 0:55a05330f8cc 2777 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 2778 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 2779
darran 0:55a05330f8cc 2780 LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
darran 0:55a05330f8cc 2781 id = (u8_t)ident[0];
darran 0:55a05330f8cc 2782 LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ip.%"U16_F".0\n",(u16_t)id));
darran 0:55a05330f8cc 2783 switch (id)
darran 0:55a05330f8cc 2784 {
darran 0:55a05330f8cc 2785 case 1: /* ipForwarding */
darran 0:55a05330f8cc 2786 case 2: /* ipDefaultTTL */
darran 0:55a05330f8cc 2787 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 2788 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 2789 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 2790 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 2791 break;
darran 0:55a05330f8cc 2792 case 3: /* ipInReceives */
darran 0:55a05330f8cc 2793 case 4: /* ipInHdrErrors */
darran 0:55a05330f8cc 2794 case 5: /* ipInAddrErrors */
darran 0:55a05330f8cc 2795 case 6: /* ipForwDatagrams */
darran 0:55a05330f8cc 2796 case 7: /* ipInUnknownProtos */
darran 0:55a05330f8cc 2797 case 8: /* ipInDiscards */
darran 0:55a05330f8cc 2798 case 9: /* ipInDelivers */
darran 0:55a05330f8cc 2799 case 10: /* ipOutRequests */
darran 0:55a05330f8cc 2800 case 11: /* ipOutDiscards */
darran 0:55a05330f8cc 2801 case 12: /* ipOutNoRoutes */
darran 0:55a05330f8cc 2802 case 14: /* ipReasmReqds */
darran 0:55a05330f8cc 2803 case 15: /* ipReasmOKs */
darran 0:55a05330f8cc 2804 case 16: /* ipReasmFails */
darran 0:55a05330f8cc 2805 case 17: /* ipFragOKs */
darran 0:55a05330f8cc 2806 case 18: /* ipFragFails */
darran 0:55a05330f8cc 2807 case 19: /* ipFragCreates */
darran 0:55a05330f8cc 2808 case 23: /* ipRoutingDiscards */
darran 0:55a05330f8cc 2809 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 2810 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2811 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
darran 0:55a05330f8cc 2812 od->v_len = sizeof(u32_t);
darran 0:55a05330f8cc 2813 break;
darran 0:55a05330f8cc 2814 case 13: /* ipReasmTimeout */
darran 0:55a05330f8cc 2815 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 2816 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 2817 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 2818 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 2819 break;
darran 0:55a05330f8cc 2820 default:
darran 0:55a05330f8cc 2821 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_get_object_def: no such object\n"));
darran 0:55a05330f8cc 2822 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 2823 break;
darran 0:55a05330f8cc 2824 };
darran 0:55a05330f8cc 2825 }
darran 0:55a05330f8cc 2826 else
darran 0:55a05330f8cc 2827 {
darran 0:55a05330f8cc 2828 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 2829 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 2830 }
darran 0:55a05330f8cc 2831 }
darran 0:55a05330f8cc 2832
darran 0:55a05330f8cc 2833 static void
darran 0:55a05330f8cc 2834 ip_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2835 {
darran 0:55a05330f8cc 2836 u8_t id;
darran 0:55a05330f8cc 2837
darran 0:55a05330f8cc 2838 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 2839 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 2840 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 2841 switch (id)
darran 0:55a05330f8cc 2842 {
darran 0:55a05330f8cc 2843 case 1: /* ipForwarding */
darran 0:55a05330f8cc 2844 {
darran 0:55a05330f8cc 2845 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2846 #if IP_FORWARD
darran 0:55a05330f8cc 2847 /* forwarding */
darran 0:55a05330f8cc 2848 *sint_ptr = 1;
darran 0:55a05330f8cc 2849 #else
darran 0:55a05330f8cc 2850 /* not-forwarding */
darran 0:55a05330f8cc 2851 *sint_ptr = 2;
darran 0:55a05330f8cc 2852 #endif
darran 0:55a05330f8cc 2853 }
darran 0:55a05330f8cc 2854 break;
darran 0:55a05330f8cc 2855 case 2: /* ipDefaultTTL */
darran 0:55a05330f8cc 2856 {
darran 0:55a05330f8cc 2857 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2858 *sint_ptr = IP_DEFAULT_TTL;
darran 0:55a05330f8cc 2859 }
darran 0:55a05330f8cc 2860 break;
darran 0:55a05330f8cc 2861 case 3: /* ipInReceives */
darran 0:55a05330f8cc 2862 {
darran 0:55a05330f8cc 2863 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2864 *uint_ptr = ipinreceives;
darran 0:55a05330f8cc 2865 }
darran 0:55a05330f8cc 2866 break;
darran 0:55a05330f8cc 2867 case 4: /* ipInHdrErrors */
darran 0:55a05330f8cc 2868 {
darran 0:55a05330f8cc 2869 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2870 *uint_ptr = ipinhdrerrors;
darran 0:55a05330f8cc 2871 }
darran 0:55a05330f8cc 2872 break;
darran 0:55a05330f8cc 2873 case 5: /* ipInAddrErrors */
darran 0:55a05330f8cc 2874 {
darran 0:55a05330f8cc 2875 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2876 *uint_ptr = ipinaddrerrors;
darran 0:55a05330f8cc 2877 }
darran 0:55a05330f8cc 2878 break;
darran 0:55a05330f8cc 2879 case 6: /* ipForwDatagrams */
darran 0:55a05330f8cc 2880 {
darran 0:55a05330f8cc 2881 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2882 *uint_ptr = ipforwdatagrams;
darran 0:55a05330f8cc 2883 }
darran 0:55a05330f8cc 2884 break;
darran 0:55a05330f8cc 2885 case 7: /* ipInUnknownProtos */
darran 0:55a05330f8cc 2886 {
darran 0:55a05330f8cc 2887 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2888 *uint_ptr = ipinunknownprotos;
darran 0:55a05330f8cc 2889 }
darran 0:55a05330f8cc 2890 break;
darran 0:55a05330f8cc 2891 case 8: /* ipInDiscards */
darran 0:55a05330f8cc 2892 {
darran 0:55a05330f8cc 2893 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2894 *uint_ptr = ipindiscards;
darran 0:55a05330f8cc 2895 }
darran 0:55a05330f8cc 2896 break;
darran 0:55a05330f8cc 2897 case 9: /* ipInDelivers */
darran 0:55a05330f8cc 2898 {
darran 0:55a05330f8cc 2899 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2900 *uint_ptr = ipindelivers;
darran 0:55a05330f8cc 2901 }
darran 0:55a05330f8cc 2902 break;
darran 0:55a05330f8cc 2903 case 10: /* ipOutRequests */
darran 0:55a05330f8cc 2904 {
darran 0:55a05330f8cc 2905 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2906 *uint_ptr = ipoutrequests;
darran 0:55a05330f8cc 2907 }
darran 0:55a05330f8cc 2908 break;
darran 0:55a05330f8cc 2909 case 11: /* ipOutDiscards */
darran 0:55a05330f8cc 2910 {
darran 0:55a05330f8cc 2911 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2912 *uint_ptr = ipoutdiscards;
darran 0:55a05330f8cc 2913 }
darran 0:55a05330f8cc 2914 break;
darran 0:55a05330f8cc 2915 case 12: /* ipOutNoRoutes */
darran 0:55a05330f8cc 2916 {
darran 0:55a05330f8cc 2917 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2918 *uint_ptr = ipoutnoroutes;
darran 0:55a05330f8cc 2919 }
darran 0:55a05330f8cc 2920 break;
darran 0:55a05330f8cc 2921 case 13: /* ipReasmTimeout */
darran 0:55a05330f8cc 2922 {
darran 0:55a05330f8cc 2923 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2924 #if IP_REASSEMBLY
darran 0:55a05330f8cc 2925 *sint_ptr = IP_REASS_MAXAGE;
darran 0:55a05330f8cc 2926 #else
darran 0:55a05330f8cc 2927 *sint_ptr = 0;
darran 0:55a05330f8cc 2928 #endif
darran 0:55a05330f8cc 2929 }
darran 0:55a05330f8cc 2930 break;
darran 0:55a05330f8cc 2931 case 14: /* ipReasmReqds */
darran 0:55a05330f8cc 2932 {
darran 0:55a05330f8cc 2933 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2934 *uint_ptr = ipreasmreqds;
darran 0:55a05330f8cc 2935 }
darran 0:55a05330f8cc 2936 break;
darran 0:55a05330f8cc 2937 case 15: /* ipReasmOKs */
darran 0:55a05330f8cc 2938 {
darran 0:55a05330f8cc 2939 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2940 *uint_ptr = ipreasmoks;
darran 0:55a05330f8cc 2941 }
darran 0:55a05330f8cc 2942 break;
darran 0:55a05330f8cc 2943 case 16: /* ipReasmFails */
darran 0:55a05330f8cc 2944 {
darran 0:55a05330f8cc 2945 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2946 *uint_ptr = ipreasmfails;
darran 0:55a05330f8cc 2947 }
darran 0:55a05330f8cc 2948 break;
darran 0:55a05330f8cc 2949 case 17: /* ipFragOKs */
darran 0:55a05330f8cc 2950 {
darran 0:55a05330f8cc 2951 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2952 *uint_ptr = ipfragoks;
darran 0:55a05330f8cc 2953 }
darran 0:55a05330f8cc 2954 break;
darran 0:55a05330f8cc 2955 case 18: /* ipFragFails */
darran 0:55a05330f8cc 2956 {
darran 0:55a05330f8cc 2957 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2958 *uint_ptr = ipfragfails;
darran 0:55a05330f8cc 2959 }
darran 0:55a05330f8cc 2960 break;
darran 0:55a05330f8cc 2961 case 19: /* ipFragCreates */
darran 0:55a05330f8cc 2962 {
darran 0:55a05330f8cc 2963 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2964 *uint_ptr = ipfragcreates;
darran 0:55a05330f8cc 2965 }
darran 0:55a05330f8cc 2966 break;
darran 0:55a05330f8cc 2967 case 23: /* ipRoutingDiscards */
darran 0:55a05330f8cc 2968 /** @todo can lwIP discard routes at all?? hardwire this to 0?? */
darran 0:55a05330f8cc 2969 {
darran 0:55a05330f8cc 2970 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 2971 *uint_ptr = iproutingdiscards;
darran 0:55a05330f8cc 2972 }
darran 0:55a05330f8cc 2973 break;
darran 0:55a05330f8cc 2974 };
darran 0:55a05330f8cc 2975 }
darran 0:55a05330f8cc 2976
darran 0:55a05330f8cc 2977 /**
darran 0:55a05330f8cc 2978 * Test ip object value before setting.
darran 0:55a05330f8cc 2979 *
darran 0:55a05330f8cc 2980 * @param od is the object definition
darran 0:55a05330f8cc 2981 * @param len return value space (in bytes)
darran 0:55a05330f8cc 2982 * @param value points to (varbind) space to copy value from.
darran 0:55a05330f8cc 2983 *
darran 0:55a05330f8cc 2984 * @note we allow set if the value matches the hardwired value,
darran 0:55a05330f8cc 2985 * otherwise return badvalue.
darran 0:55a05330f8cc 2986 */
darran 0:55a05330f8cc 2987 static u8_t
darran 0:55a05330f8cc 2988 ip_set_test(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 2989 {
darran 0:55a05330f8cc 2990 u8_t id, set_ok;
darran 0:55a05330f8cc 2991 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 2992
darran 0:55a05330f8cc 2993 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 2994 set_ok = 0;
darran 0:55a05330f8cc 2995 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 2996 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 2997 switch (id)
darran 0:55a05330f8cc 2998 {
darran 0:55a05330f8cc 2999 case 1: /* ipForwarding */
darran 0:55a05330f8cc 3000 #if IP_FORWARD
darran 0:55a05330f8cc 3001 /* forwarding */
darran 0:55a05330f8cc 3002 if (*sint_ptr == 1)
darran 0:55a05330f8cc 3003 #else
darran 0:55a05330f8cc 3004 /* not-forwarding */
darran 0:55a05330f8cc 3005 if (*sint_ptr == 2)
darran 0:55a05330f8cc 3006 #endif
darran 0:55a05330f8cc 3007 {
darran 0:55a05330f8cc 3008 set_ok = 1;
darran 0:55a05330f8cc 3009 }
darran 0:55a05330f8cc 3010 break;
darran 0:55a05330f8cc 3011 case 2: /* ipDefaultTTL */
darran 0:55a05330f8cc 3012 if (*sint_ptr == IP_DEFAULT_TTL)
darran 0:55a05330f8cc 3013 {
darran 0:55a05330f8cc 3014 set_ok = 1;
darran 0:55a05330f8cc 3015 }
darran 0:55a05330f8cc 3016 break;
darran 0:55a05330f8cc 3017 };
darran 0:55a05330f8cc 3018 return set_ok;
darran 0:55a05330f8cc 3019 }
darran 0:55a05330f8cc 3020
darran 0:55a05330f8cc 3021 static void
darran 0:55a05330f8cc 3022 ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 3023 {
darran 0:55a05330f8cc 3024 /* return to object name, adding index depth (4) */
darran 0:55a05330f8cc 3025 ident_len += 4;
darran 0:55a05330f8cc 3026 ident -= 4;
darran 0:55a05330f8cc 3027
darran 0:55a05330f8cc 3028 if (ident_len == 5)
darran 0:55a05330f8cc 3029 {
darran 0:55a05330f8cc 3030 u8_t id;
darran 0:55a05330f8cc 3031
darran 0:55a05330f8cc 3032 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 3033 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 3034
darran 0:55a05330f8cc 3035 LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
darran 0:55a05330f8cc 3036 id = (u8_t)ident[0];
darran 0:55a05330f8cc 3037 switch (id)
darran 0:55a05330f8cc 3038 {
darran 0:55a05330f8cc 3039 case 1: /* ipAdEntAddr */
darran 0:55a05330f8cc 3040 case 3: /* ipAdEntNetMask */
darran 0:55a05330f8cc 3041 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3042 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3043 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
darran 0:55a05330f8cc 3044 od->v_len = 4;
darran 0:55a05330f8cc 3045 break;
darran 0:55a05330f8cc 3046 case 2: /* ipAdEntIfIndex */
darran 0:55a05330f8cc 3047 case 4: /* ipAdEntBcastAddr */
darran 0:55a05330f8cc 3048 case 5: /* ipAdEntReasmMaxSize */
darran 0:55a05330f8cc 3049 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3050 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3051 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 3052 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 3053 break;
darran 0:55a05330f8cc 3054 default:
darran 0:55a05330f8cc 3055 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_addrentry_get_object_def: no such object\n"));
darran 0:55a05330f8cc 3056 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3057 break;
darran 0:55a05330f8cc 3058 }
darran 0:55a05330f8cc 3059 }
darran 0:55a05330f8cc 3060 else
darran 0:55a05330f8cc 3061 {
darran 0:55a05330f8cc 3062 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_addrentry_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 3063 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3064 }
darran 0:55a05330f8cc 3065 }
darran 0:55a05330f8cc 3066
darran 0:55a05330f8cc 3067 static void
darran 0:55a05330f8cc 3068 ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 3069 {
darran 0:55a05330f8cc 3070 u8_t id;
darran 0:55a05330f8cc 3071 u16_t ifidx;
darran 0:55a05330f8cc 3072 ip_addr_t ip;
darran 0:55a05330f8cc 3073 struct netif *netif = netif_list;
darran 0:55a05330f8cc 3074
darran 0:55a05330f8cc 3075 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 3076 snmp_oidtoip(&od->id_inst_ptr[1], &ip);
darran 0:55a05330f8cc 3077 ifidx = 0;
darran 0:55a05330f8cc 3078 while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
darran 0:55a05330f8cc 3079 {
darran 0:55a05330f8cc 3080 netif = netif->next;
darran 0:55a05330f8cc 3081 ifidx++;
darran 0:55a05330f8cc 3082 }
darran 0:55a05330f8cc 3083
darran 0:55a05330f8cc 3084 if (netif != NULL)
darran 0:55a05330f8cc 3085 {
darran 0:55a05330f8cc 3086 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 3087 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 3088 switch (id)
darran 0:55a05330f8cc 3089 {
darran 0:55a05330f8cc 3090 case 1: /* ipAdEntAddr */
darran 0:55a05330f8cc 3091 {
darran 0:55a05330f8cc 3092 ip_addr_t *dst = (ip_addr_t*)value;
darran 0:55a05330f8cc 3093 *dst = netif->ip_addr;
darran 0:55a05330f8cc 3094 }
darran 0:55a05330f8cc 3095 break;
darran 0:55a05330f8cc 3096 case 2: /* ipAdEntIfIndex */
darran 0:55a05330f8cc 3097 {
darran 0:55a05330f8cc 3098 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3099 *sint_ptr = ifidx + 1;
darran 0:55a05330f8cc 3100 }
darran 0:55a05330f8cc 3101 break;
darran 0:55a05330f8cc 3102 case 3: /* ipAdEntNetMask */
darran 0:55a05330f8cc 3103 {
darran 0:55a05330f8cc 3104 ip_addr_t *dst = (ip_addr_t*)value;
darran 0:55a05330f8cc 3105 *dst = netif->netmask;
darran 0:55a05330f8cc 3106 }
darran 0:55a05330f8cc 3107 break;
darran 0:55a05330f8cc 3108 case 4: /* ipAdEntBcastAddr */
darran 0:55a05330f8cc 3109 {
darran 0:55a05330f8cc 3110 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3111
darran 0:55a05330f8cc 3112 /* lwIP oddity, there's no broadcast
darran 0:55a05330f8cc 3113 address in the netif we can rely on */
darran 0:55a05330f8cc 3114 *sint_ptr = IPADDR_BROADCAST & 1;
darran 0:55a05330f8cc 3115 }
darran 0:55a05330f8cc 3116 break;
darran 0:55a05330f8cc 3117 case 5: /* ipAdEntReasmMaxSize */
darran 0:55a05330f8cc 3118 {
darran 0:55a05330f8cc 3119 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3120 #if IP_REASSEMBLY
darran 0:55a05330f8cc 3121 /* @todo The theoretical maximum is IP_REASS_MAX_PBUFS * size of the pbufs,
darran 0:55a05330f8cc 3122 * but only if receiving one fragmented packet at a time.
darran 0:55a05330f8cc 3123 * The current solution is to calculate for 2 simultaneous packets...
darran 0:55a05330f8cc 3124 */
darran 0:55a05330f8cc 3125 *sint_ptr = (IP_HLEN + ((IP_REASS_MAX_PBUFS/2) *
darran 0:55a05330f8cc 3126 (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN - IP_HLEN)));
darran 0:55a05330f8cc 3127 #else
darran 0:55a05330f8cc 3128 /** @todo returning MTU would be a bad thing and
darran 0:55a05330f8cc 3129 returning a wild guess like '576' isn't good either */
darran 0:55a05330f8cc 3130 *sint_ptr = 0;
darran 0:55a05330f8cc 3131 #endif
darran 0:55a05330f8cc 3132 }
darran 0:55a05330f8cc 3133 break;
darran 0:55a05330f8cc 3134 }
darran 0:55a05330f8cc 3135 }
darran 0:55a05330f8cc 3136 }
darran 0:55a05330f8cc 3137
darran 0:55a05330f8cc 3138 /**
darran 0:55a05330f8cc 3139 * @note
darran 0:55a05330f8cc 3140 * lwIP IP routing is currently using the network addresses in netif_list.
darran 0:55a05330f8cc 3141 * if no suitable network IP is found in netif_list, the default_netif is used.
darran 0:55a05330f8cc 3142 */
darran 0:55a05330f8cc 3143 static void
darran 0:55a05330f8cc 3144 ip_rteentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 3145 {
darran 0:55a05330f8cc 3146 u8_t id;
darran 0:55a05330f8cc 3147
darran 0:55a05330f8cc 3148 /* return to object name, adding index depth (4) */
darran 0:55a05330f8cc 3149 ident_len += 4;
darran 0:55a05330f8cc 3150 ident -= 4;
darran 0:55a05330f8cc 3151
darran 0:55a05330f8cc 3152 if (ident_len == 5)
darran 0:55a05330f8cc 3153 {
darran 0:55a05330f8cc 3154 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 3155 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 3156
darran 0:55a05330f8cc 3157 LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
darran 0:55a05330f8cc 3158 id = (u8_t)ident[0];
darran 0:55a05330f8cc 3159 switch (id)
darran 0:55a05330f8cc 3160 {
darran 0:55a05330f8cc 3161 case 1: /* ipRouteDest */
darran 0:55a05330f8cc 3162 case 7: /* ipRouteNextHop */
darran 0:55a05330f8cc 3163 case 11: /* ipRouteMask */
darran 0:55a05330f8cc 3164 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3165 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 3166 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
darran 0:55a05330f8cc 3167 od->v_len = 4;
darran 0:55a05330f8cc 3168 break;
darran 0:55a05330f8cc 3169 case 2: /* ipRouteIfIndex */
darran 0:55a05330f8cc 3170 case 3: /* ipRouteMetric1 */
darran 0:55a05330f8cc 3171 case 4: /* ipRouteMetric2 */
darran 0:55a05330f8cc 3172 case 5: /* ipRouteMetric3 */
darran 0:55a05330f8cc 3173 case 6: /* ipRouteMetric4 */
darran 0:55a05330f8cc 3174 case 8: /* ipRouteType */
darran 0:55a05330f8cc 3175 case 10: /* ipRouteAge */
darran 0:55a05330f8cc 3176 case 12: /* ipRouteMetric5 */
darran 0:55a05330f8cc 3177 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3178 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 3179 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 3180 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 3181 break;
darran 0:55a05330f8cc 3182 case 9: /* ipRouteProto */
darran 0:55a05330f8cc 3183 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3184 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3185 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 3186 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 3187 break;
darran 0:55a05330f8cc 3188 case 13: /* ipRouteInfo */
darran 0:55a05330f8cc 3189 /** @note returning zeroDotZero (0.0) no routing protocol specific MIB */
darran 0:55a05330f8cc 3190 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3191 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3192 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
darran 0:55a05330f8cc 3193 od->v_len = iprouteinfo.len * sizeof(s32_t);
darran 0:55a05330f8cc 3194 break;
darran 0:55a05330f8cc 3195 default:
darran 0:55a05330f8cc 3196 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_rteentry_get_object_def: no such object\n"));
darran 0:55a05330f8cc 3197 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3198 break;
darran 0:55a05330f8cc 3199 }
darran 0:55a05330f8cc 3200 }
darran 0:55a05330f8cc 3201 else
darran 0:55a05330f8cc 3202 {
darran 0:55a05330f8cc 3203 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_rteentry_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 3204 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3205 }
darran 0:55a05330f8cc 3206 }
darran 0:55a05330f8cc 3207
darran 0:55a05330f8cc 3208 static void
darran 0:55a05330f8cc 3209 ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 3210 {
darran 0:55a05330f8cc 3211 struct netif *netif;
darran 0:55a05330f8cc 3212 ip_addr_t dest;
darran 0:55a05330f8cc 3213 s32_t *ident;
darran 0:55a05330f8cc 3214 u8_t id;
darran 0:55a05330f8cc 3215
darran 0:55a05330f8cc 3216 ident = od->id_inst_ptr;
darran 0:55a05330f8cc 3217 snmp_oidtoip(&ident[1], &dest);
darran 0:55a05330f8cc 3218
darran 0:55a05330f8cc 3219 if (ip_addr_isany(&dest))
darran 0:55a05330f8cc 3220 {
darran 0:55a05330f8cc 3221 /* ip_route() uses default netif for default route */
darran 0:55a05330f8cc 3222 netif = netif_default;
darran 0:55a05330f8cc 3223 }
darran 0:55a05330f8cc 3224 else
darran 0:55a05330f8cc 3225 {
darran 0:55a05330f8cc 3226 /* not using ip_route(), need exact match! */
darran 0:55a05330f8cc 3227 netif = netif_list;
darran 0:55a05330f8cc 3228 while ((netif != NULL) &&
darran 0:55a05330f8cc 3229 !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
darran 0:55a05330f8cc 3230 {
darran 0:55a05330f8cc 3231 netif = netif->next;
darran 0:55a05330f8cc 3232 }
darran 0:55a05330f8cc 3233 }
darran 0:55a05330f8cc 3234 if (netif != NULL)
darran 0:55a05330f8cc 3235 {
darran 0:55a05330f8cc 3236 LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
darran 0:55a05330f8cc 3237 id = (u8_t)ident[0];
darran 0:55a05330f8cc 3238 switch (id)
darran 0:55a05330f8cc 3239 {
darran 0:55a05330f8cc 3240 case 1: /* ipRouteDest */
darran 0:55a05330f8cc 3241 {
darran 0:55a05330f8cc 3242 ip_addr_t *dst = (ip_addr_t*)value;
darran 0:55a05330f8cc 3243
darran 0:55a05330f8cc 3244 if (ip_addr_isany(&dest))
darran 0:55a05330f8cc 3245 {
darran 0:55a05330f8cc 3246 /* default rte has 0.0.0.0 dest */
darran 0:55a05330f8cc 3247 ip_addr_set_zero(dst);
darran 0:55a05330f8cc 3248 }
darran 0:55a05330f8cc 3249 else
darran 0:55a05330f8cc 3250 {
darran 0:55a05330f8cc 3251 /* netifs have netaddress dest */
darran 0:55a05330f8cc 3252 ip_addr_get_network(dst, &netif->ip_addr, &netif->netmask);
darran 0:55a05330f8cc 3253 }
darran 0:55a05330f8cc 3254 }
darran 0:55a05330f8cc 3255 break;
darran 0:55a05330f8cc 3256 case 2: /* ipRouteIfIndex */
darran 0:55a05330f8cc 3257 {
darran 0:55a05330f8cc 3258 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3259
darran 0:55a05330f8cc 3260 snmp_netiftoifindex(netif, sint_ptr);
darran 0:55a05330f8cc 3261 }
darran 0:55a05330f8cc 3262 break;
darran 0:55a05330f8cc 3263 case 3: /* ipRouteMetric1 */
darran 0:55a05330f8cc 3264 {
darran 0:55a05330f8cc 3265 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3266
darran 0:55a05330f8cc 3267 if (ip_addr_isany(&dest))
darran 0:55a05330f8cc 3268 {
darran 0:55a05330f8cc 3269 /* default rte has metric 1 */
darran 0:55a05330f8cc 3270 *sint_ptr = 1;
darran 0:55a05330f8cc 3271 }
darran 0:55a05330f8cc 3272 else
darran 0:55a05330f8cc 3273 {
darran 0:55a05330f8cc 3274 /* other rtes have metric 0 */
darran 0:55a05330f8cc 3275 *sint_ptr = 0;
darran 0:55a05330f8cc 3276 }
darran 0:55a05330f8cc 3277 }
darran 0:55a05330f8cc 3278 break;
darran 0:55a05330f8cc 3279 case 4: /* ipRouteMetric2 */
darran 0:55a05330f8cc 3280 case 5: /* ipRouteMetric3 */
darran 0:55a05330f8cc 3281 case 6: /* ipRouteMetric4 */
darran 0:55a05330f8cc 3282 case 12: /* ipRouteMetric5 */
darran 0:55a05330f8cc 3283 {
darran 0:55a05330f8cc 3284 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3285 /* not used */
darran 0:55a05330f8cc 3286 *sint_ptr = -1;
darran 0:55a05330f8cc 3287 }
darran 0:55a05330f8cc 3288 break;
darran 0:55a05330f8cc 3289 case 7: /* ipRouteNextHop */
darran 0:55a05330f8cc 3290 {
darran 0:55a05330f8cc 3291 ip_addr_t *dst = (ip_addr_t*)value;
darran 0:55a05330f8cc 3292
darran 0:55a05330f8cc 3293 if (ip_addr_isany(&dest))
darran 0:55a05330f8cc 3294 {
darran 0:55a05330f8cc 3295 /* default rte: gateway */
darran 0:55a05330f8cc 3296 *dst = netif->gw;
darran 0:55a05330f8cc 3297 }
darran 0:55a05330f8cc 3298 else
darran 0:55a05330f8cc 3299 {
darran 0:55a05330f8cc 3300 /* other rtes: netif ip_addr */
darran 0:55a05330f8cc 3301 *dst = netif->ip_addr;
darran 0:55a05330f8cc 3302 }
darran 0:55a05330f8cc 3303 }
darran 0:55a05330f8cc 3304 break;
darran 0:55a05330f8cc 3305 case 8: /* ipRouteType */
darran 0:55a05330f8cc 3306 {
darran 0:55a05330f8cc 3307 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3308
darran 0:55a05330f8cc 3309 if (ip_addr_isany(&dest))
darran 0:55a05330f8cc 3310 {
darran 0:55a05330f8cc 3311 /* default rte is indirect */
darran 0:55a05330f8cc 3312 *sint_ptr = 4;
darran 0:55a05330f8cc 3313 }
darran 0:55a05330f8cc 3314 else
darran 0:55a05330f8cc 3315 {
darran 0:55a05330f8cc 3316 /* other rtes are direct */
darran 0:55a05330f8cc 3317 *sint_ptr = 3;
darran 0:55a05330f8cc 3318 }
darran 0:55a05330f8cc 3319 }
darran 0:55a05330f8cc 3320 break;
darran 0:55a05330f8cc 3321 case 9: /* ipRouteProto */
darran 0:55a05330f8cc 3322 {
darran 0:55a05330f8cc 3323 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3324 /* locally defined routes */
darran 0:55a05330f8cc 3325 *sint_ptr = 2;
darran 0:55a05330f8cc 3326 }
darran 0:55a05330f8cc 3327 break;
darran 0:55a05330f8cc 3328 case 10: /* ipRouteAge */
darran 0:55a05330f8cc 3329 {
darran 0:55a05330f8cc 3330 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3331 /** @todo (sysuptime - timestamp last change) / 100
darran 0:55a05330f8cc 3332 @see snmp_insert_iprteidx_tree() */
darran 0:55a05330f8cc 3333 *sint_ptr = 0;
darran 0:55a05330f8cc 3334 }
darran 0:55a05330f8cc 3335 break;
darran 0:55a05330f8cc 3336 case 11: /* ipRouteMask */
darran 0:55a05330f8cc 3337 {
darran 0:55a05330f8cc 3338 ip_addr_t *dst = (ip_addr_t*)value;
darran 0:55a05330f8cc 3339
darran 0:55a05330f8cc 3340 if (ip_addr_isany(&dest))
darran 0:55a05330f8cc 3341 {
darran 0:55a05330f8cc 3342 /* default rte use 0.0.0.0 mask */
darran 0:55a05330f8cc 3343 ip_addr_set_zero(dst);
darran 0:55a05330f8cc 3344 }
darran 0:55a05330f8cc 3345 else
darran 0:55a05330f8cc 3346 {
darran 0:55a05330f8cc 3347 /* other rtes use netmask */
darran 0:55a05330f8cc 3348 *dst = netif->netmask;
darran 0:55a05330f8cc 3349 }
darran 0:55a05330f8cc 3350 }
darran 0:55a05330f8cc 3351 break;
darran 0:55a05330f8cc 3352 case 13: /* ipRouteInfo */
darran 0:55a05330f8cc 3353 objectidncpy((s32_t*)value, (s32_t*)iprouteinfo.id, (u8_t)(len / sizeof(s32_t)));
darran 0:55a05330f8cc 3354 break;
darran 0:55a05330f8cc 3355 }
darran 0:55a05330f8cc 3356 }
darran 0:55a05330f8cc 3357 }
darran 0:55a05330f8cc 3358
darran 0:55a05330f8cc 3359 static void
darran 0:55a05330f8cc 3360 ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 3361 {
darran 0:55a05330f8cc 3362 /* return to object name, adding index depth (5) */
darran 0:55a05330f8cc 3363 ident_len += 5;
darran 0:55a05330f8cc 3364 ident -= 5;
darran 0:55a05330f8cc 3365
darran 0:55a05330f8cc 3366 if (ident_len == 6)
darran 0:55a05330f8cc 3367 {
darran 0:55a05330f8cc 3368 u8_t id;
darran 0:55a05330f8cc 3369
darran 0:55a05330f8cc 3370 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 3371 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 3372
darran 0:55a05330f8cc 3373 LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
darran 0:55a05330f8cc 3374 id = (u8_t)ident[0];
darran 0:55a05330f8cc 3375 switch (id)
darran 0:55a05330f8cc 3376 {
darran 0:55a05330f8cc 3377 case 1: /* ipNetToMediaIfIndex */
darran 0:55a05330f8cc 3378 case 4: /* ipNetToMediaType */
darran 0:55a05330f8cc 3379 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3380 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 3381 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 3382 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 3383 break;
darran 0:55a05330f8cc 3384 case 2: /* ipNetToMediaPhysAddress */
darran 0:55a05330f8cc 3385 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3386 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 3387 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
darran 0:55a05330f8cc 3388 od->v_len = 6; /** @todo try to use netif::hwaddr_len */
darran 0:55a05330f8cc 3389 break;
darran 0:55a05330f8cc 3390 case 3: /* ipNetToMediaNetAddress */
darran 0:55a05330f8cc 3391 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3392 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 3393 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
darran 0:55a05330f8cc 3394 od->v_len = 4;
darran 0:55a05330f8cc 3395 break;
darran 0:55a05330f8cc 3396 default:
darran 0:55a05330f8cc 3397 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_ntomentry_get_object_def: no such object\n"));
darran 0:55a05330f8cc 3398 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3399 break;
darran 0:55a05330f8cc 3400 }
darran 0:55a05330f8cc 3401 }
darran 0:55a05330f8cc 3402 else
darran 0:55a05330f8cc 3403 {
darran 0:55a05330f8cc 3404 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_ntomentry_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 3405 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3406 }
darran 0:55a05330f8cc 3407 }
darran 0:55a05330f8cc 3408
darran 0:55a05330f8cc 3409 static void
darran 0:55a05330f8cc 3410 ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 3411 {
darran 0:55a05330f8cc 3412 #if LWIP_ARP
darran 0:55a05330f8cc 3413 u8_t id;
darran 0:55a05330f8cc 3414 struct eth_addr* ethaddr_ret;
darran 0:55a05330f8cc 3415 ip_addr_t* ipaddr_ret;
darran 0:55a05330f8cc 3416 #endif /* LWIP_ARP */
darran 0:55a05330f8cc 3417 ip_addr_t ip;
darran 0:55a05330f8cc 3418 struct netif *netif;
darran 0:55a05330f8cc 3419
darran 0:55a05330f8cc 3420 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 3421 LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */
darran 0:55a05330f8cc 3422
darran 0:55a05330f8cc 3423 snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
darran 0:55a05330f8cc 3424 snmp_oidtoip(&od->id_inst_ptr[2], &ip);
darran 0:55a05330f8cc 3425
darran 0:55a05330f8cc 3426 #if LWIP_ARP /** @todo implement a netif_find_addr */
darran 0:55a05330f8cc 3427 if (etharp_find_addr(netif, &ip, &ethaddr_ret, &ipaddr_ret) > -1)
darran 0:55a05330f8cc 3428 {
darran 0:55a05330f8cc 3429 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 3430 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 3431 switch (id)
darran 0:55a05330f8cc 3432 {
darran 0:55a05330f8cc 3433 case 1: /* ipNetToMediaIfIndex */
darran 0:55a05330f8cc 3434 {
darran 0:55a05330f8cc 3435 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3436 *sint_ptr = od->id_inst_ptr[1];
darran 0:55a05330f8cc 3437 }
darran 0:55a05330f8cc 3438 break;
darran 0:55a05330f8cc 3439 case 2: /* ipNetToMediaPhysAddress */
darran 0:55a05330f8cc 3440 {
darran 0:55a05330f8cc 3441 struct eth_addr *dst = (struct eth_addr*)value;
darran 0:55a05330f8cc 3442
darran 0:55a05330f8cc 3443 *dst = *ethaddr_ret;
darran 0:55a05330f8cc 3444 }
darran 0:55a05330f8cc 3445 break;
darran 0:55a05330f8cc 3446 case 3: /* ipNetToMediaNetAddress */
darran 0:55a05330f8cc 3447 {
darran 0:55a05330f8cc 3448 ip_addr_t *dst = (ip_addr_t*)value;
darran 0:55a05330f8cc 3449
darran 0:55a05330f8cc 3450 *dst = *ipaddr_ret;
darran 0:55a05330f8cc 3451 }
darran 0:55a05330f8cc 3452 break;
darran 0:55a05330f8cc 3453 case 4: /* ipNetToMediaType */
darran 0:55a05330f8cc 3454 {
darran 0:55a05330f8cc 3455 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3456 /* dynamic (?) */
darran 0:55a05330f8cc 3457 *sint_ptr = 3;
darran 0:55a05330f8cc 3458 }
darran 0:55a05330f8cc 3459 break;
darran 0:55a05330f8cc 3460 }
darran 0:55a05330f8cc 3461 }
darran 0:55a05330f8cc 3462 #endif /* LWIP_ARP */
darran 0:55a05330f8cc 3463 }
darran 0:55a05330f8cc 3464
darran 0:55a05330f8cc 3465 static void
darran 0:55a05330f8cc 3466 icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 3467 {
darran 0:55a05330f8cc 3468 /* return to object name, adding index depth (1) */
darran 0:55a05330f8cc 3469 ident_len += 1;
darran 0:55a05330f8cc 3470 ident -= 1;
darran 0:55a05330f8cc 3471 if ((ident_len == 2) &&
darran 0:55a05330f8cc 3472 (ident[0] > 0) && (ident[0] < 27))
darran 0:55a05330f8cc 3473 {
darran 0:55a05330f8cc 3474 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 3475 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 3476
darran 0:55a05330f8cc 3477 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 3478 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3479 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
darran 0:55a05330f8cc 3480 od->v_len = sizeof(u32_t);
darran 0:55a05330f8cc 3481 }
darran 0:55a05330f8cc 3482 else
darran 0:55a05330f8cc 3483 {
darran 0:55a05330f8cc 3484 LWIP_DEBUGF(SNMP_MIB_DEBUG,("icmp_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 3485 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3486 }
darran 0:55a05330f8cc 3487 }
darran 0:55a05330f8cc 3488
darran 0:55a05330f8cc 3489 static void
darran 0:55a05330f8cc 3490 icmp_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 3491 {
darran 0:55a05330f8cc 3492 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 3493 u8_t id;
darran 0:55a05330f8cc 3494
darran 0:55a05330f8cc 3495 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 3496 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 3497 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 3498 switch (id)
darran 0:55a05330f8cc 3499 {
darran 0:55a05330f8cc 3500 case 1: /* icmpInMsgs */
darran 0:55a05330f8cc 3501 *uint_ptr = icmpinmsgs;
darran 0:55a05330f8cc 3502 break;
darran 0:55a05330f8cc 3503 case 2: /* icmpInErrors */
darran 0:55a05330f8cc 3504 *uint_ptr = icmpinerrors;
darran 0:55a05330f8cc 3505 break;
darran 0:55a05330f8cc 3506 case 3: /* icmpInDestUnreachs */
darran 0:55a05330f8cc 3507 *uint_ptr = icmpindestunreachs;
darran 0:55a05330f8cc 3508 break;
darran 0:55a05330f8cc 3509 case 4: /* icmpInTimeExcds */
darran 0:55a05330f8cc 3510 *uint_ptr = icmpintimeexcds;
darran 0:55a05330f8cc 3511 break;
darran 0:55a05330f8cc 3512 case 5: /* icmpInParmProbs */
darran 0:55a05330f8cc 3513 *uint_ptr = icmpinparmprobs;
darran 0:55a05330f8cc 3514 break;
darran 0:55a05330f8cc 3515 case 6: /* icmpInSrcQuenchs */
darran 0:55a05330f8cc 3516 *uint_ptr = icmpinsrcquenchs;
darran 0:55a05330f8cc 3517 break;
darran 0:55a05330f8cc 3518 case 7: /* icmpInRedirects */
darran 0:55a05330f8cc 3519 *uint_ptr = icmpinredirects;
darran 0:55a05330f8cc 3520 break;
darran 0:55a05330f8cc 3521 case 8: /* icmpInEchos */
darran 0:55a05330f8cc 3522 *uint_ptr = icmpinechos;
darran 0:55a05330f8cc 3523 break;
darran 0:55a05330f8cc 3524 case 9: /* icmpInEchoReps */
darran 0:55a05330f8cc 3525 *uint_ptr = icmpinechoreps;
darran 0:55a05330f8cc 3526 break;
darran 0:55a05330f8cc 3527 case 10: /* icmpInTimestamps */
darran 0:55a05330f8cc 3528 *uint_ptr = icmpintimestamps;
darran 0:55a05330f8cc 3529 break;
darran 0:55a05330f8cc 3530 case 11: /* icmpInTimestampReps */
darran 0:55a05330f8cc 3531 *uint_ptr = icmpintimestampreps;
darran 0:55a05330f8cc 3532 break;
darran 0:55a05330f8cc 3533 case 12: /* icmpInAddrMasks */
darran 0:55a05330f8cc 3534 *uint_ptr = icmpinaddrmasks;
darran 0:55a05330f8cc 3535 break;
darran 0:55a05330f8cc 3536 case 13: /* icmpInAddrMaskReps */
darran 0:55a05330f8cc 3537 *uint_ptr = icmpinaddrmaskreps;
darran 0:55a05330f8cc 3538 break;
darran 0:55a05330f8cc 3539 case 14: /* icmpOutMsgs */
darran 0:55a05330f8cc 3540 *uint_ptr = icmpoutmsgs;
darran 0:55a05330f8cc 3541 break;
darran 0:55a05330f8cc 3542 case 15: /* icmpOutErrors */
darran 0:55a05330f8cc 3543 *uint_ptr = icmpouterrors;
darran 0:55a05330f8cc 3544 break;
darran 0:55a05330f8cc 3545 case 16: /* icmpOutDestUnreachs */
darran 0:55a05330f8cc 3546 *uint_ptr = icmpoutdestunreachs;
darran 0:55a05330f8cc 3547 break;
darran 0:55a05330f8cc 3548 case 17: /* icmpOutTimeExcds */
darran 0:55a05330f8cc 3549 *uint_ptr = icmpouttimeexcds;
darran 0:55a05330f8cc 3550 break;
darran 0:55a05330f8cc 3551 case 18: /* icmpOutParmProbs */
darran 0:55a05330f8cc 3552 *uint_ptr = icmpoutparmprobs;
darran 0:55a05330f8cc 3553 break;
darran 0:55a05330f8cc 3554 case 19: /* icmpOutSrcQuenchs */
darran 0:55a05330f8cc 3555 *uint_ptr = icmpoutsrcquenchs;
darran 0:55a05330f8cc 3556 break;
darran 0:55a05330f8cc 3557 case 20: /* icmpOutRedirects */
darran 0:55a05330f8cc 3558 *uint_ptr = icmpoutredirects;
darran 0:55a05330f8cc 3559 break;
darran 0:55a05330f8cc 3560 case 21: /* icmpOutEchos */
darran 0:55a05330f8cc 3561 *uint_ptr = icmpoutechos;
darran 0:55a05330f8cc 3562 break;
darran 0:55a05330f8cc 3563 case 22: /* icmpOutEchoReps */
darran 0:55a05330f8cc 3564 *uint_ptr = icmpoutechoreps;
darran 0:55a05330f8cc 3565 break;
darran 0:55a05330f8cc 3566 case 23: /* icmpOutTimestamps */
darran 0:55a05330f8cc 3567 *uint_ptr = icmpouttimestamps;
darran 0:55a05330f8cc 3568 break;
darran 0:55a05330f8cc 3569 case 24: /* icmpOutTimestampReps */
darran 0:55a05330f8cc 3570 *uint_ptr = icmpouttimestampreps;
darran 0:55a05330f8cc 3571 break;
darran 0:55a05330f8cc 3572 case 25: /* icmpOutAddrMasks */
darran 0:55a05330f8cc 3573 *uint_ptr = icmpoutaddrmasks;
darran 0:55a05330f8cc 3574 break;
darran 0:55a05330f8cc 3575 case 26: /* icmpOutAddrMaskReps */
darran 0:55a05330f8cc 3576 *uint_ptr = icmpoutaddrmaskreps;
darran 0:55a05330f8cc 3577 break;
darran 0:55a05330f8cc 3578 }
darran 0:55a05330f8cc 3579 }
darran 0:55a05330f8cc 3580
darran 0:55a05330f8cc 3581 #if LWIP_TCP
darran 0:55a05330f8cc 3582 /** @todo tcp grp */
darran 0:55a05330f8cc 3583 static void
darran 0:55a05330f8cc 3584 tcp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 3585 {
darran 0:55a05330f8cc 3586 u8_t id;
darran 0:55a05330f8cc 3587
darran 0:55a05330f8cc 3588 /* return to object name, adding index depth (1) */
darran 0:55a05330f8cc 3589 ident_len += 1;
darran 0:55a05330f8cc 3590 ident -= 1;
darran 0:55a05330f8cc 3591 if (ident_len == 2)
darran 0:55a05330f8cc 3592 {
darran 0:55a05330f8cc 3593 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 3594 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 3595
darran 0:55a05330f8cc 3596 LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
darran 0:55a05330f8cc 3597 id = (u8_t)ident[0];
darran 0:55a05330f8cc 3598 LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def tcp.%"U16_F".0\n",(u16_t)id));
darran 0:55a05330f8cc 3599
darran 0:55a05330f8cc 3600 switch (id)
darran 0:55a05330f8cc 3601 {
darran 0:55a05330f8cc 3602 case 1: /* tcpRtoAlgorithm */
darran 0:55a05330f8cc 3603 case 2: /* tcpRtoMin */
darran 0:55a05330f8cc 3604 case 3: /* tcpRtoMax */
darran 0:55a05330f8cc 3605 case 4: /* tcpMaxConn */
darran 0:55a05330f8cc 3606 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 3607 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3608 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 3609 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 3610 break;
darran 0:55a05330f8cc 3611 case 5: /* tcpActiveOpens */
darran 0:55a05330f8cc 3612 case 6: /* tcpPassiveOpens */
darran 0:55a05330f8cc 3613 case 7: /* tcpAttemptFails */
darran 0:55a05330f8cc 3614 case 8: /* tcpEstabResets */
darran 0:55a05330f8cc 3615 case 10: /* tcpInSegs */
darran 0:55a05330f8cc 3616 case 11: /* tcpOutSegs */
darran 0:55a05330f8cc 3617 case 12: /* tcpRetransSegs */
darran 0:55a05330f8cc 3618 case 14: /* tcpInErrs */
darran 0:55a05330f8cc 3619 case 15: /* tcpOutRsts */
darran 0:55a05330f8cc 3620 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 3621 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3622 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
darran 0:55a05330f8cc 3623 od->v_len = sizeof(u32_t);
darran 0:55a05330f8cc 3624 break;
darran 0:55a05330f8cc 3625 case 9: /* tcpCurrEstab */
darran 0:55a05330f8cc 3626 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3627 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3628 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE);
darran 0:55a05330f8cc 3629 od->v_len = sizeof(u32_t);
darran 0:55a05330f8cc 3630 break;
darran 0:55a05330f8cc 3631 default:
darran 0:55a05330f8cc 3632 LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcp_get_object_def: no such object\n"));
darran 0:55a05330f8cc 3633 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3634 break;
darran 0:55a05330f8cc 3635 };
darran 0:55a05330f8cc 3636 }
darran 0:55a05330f8cc 3637 else
darran 0:55a05330f8cc 3638 {
darran 0:55a05330f8cc 3639 LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcp_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 3640 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3641 }
darran 0:55a05330f8cc 3642 }
darran 0:55a05330f8cc 3643
darran 0:55a05330f8cc 3644 static void
darran 0:55a05330f8cc 3645 tcp_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 3646 {
darran 0:55a05330f8cc 3647 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 3648 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3649 u8_t id;
darran 0:55a05330f8cc 3650
darran 0:55a05330f8cc 3651 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 3652 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 3653 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 3654 switch (id)
darran 0:55a05330f8cc 3655 {
darran 0:55a05330f8cc 3656 case 1: /* tcpRtoAlgorithm, vanj(4) */
darran 0:55a05330f8cc 3657 *sint_ptr = 4;
darran 0:55a05330f8cc 3658 break;
darran 0:55a05330f8cc 3659 case 2: /* tcpRtoMin */
darran 0:55a05330f8cc 3660 /* @todo not the actual value, a guess,
darran 0:55a05330f8cc 3661 needs to be calculated */
darran 0:55a05330f8cc 3662 *sint_ptr = 1000;
darran 0:55a05330f8cc 3663 break;
darran 0:55a05330f8cc 3664 case 3: /* tcpRtoMax */
darran 0:55a05330f8cc 3665 /* @todo not the actual value, a guess,
darran 0:55a05330f8cc 3666 needs to be calculated */
darran 0:55a05330f8cc 3667 *sint_ptr = 60000;
darran 0:55a05330f8cc 3668 break;
darran 0:55a05330f8cc 3669 case 4: /* tcpMaxConn */
darran 0:55a05330f8cc 3670 *sint_ptr = MEMP_NUM_TCP_PCB;
darran 0:55a05330f8cc 3671 break;
darran 0:55a05330f8cc 3672 case 5: /* tcpActiveOpens */
darran 0:55a05330f8cc 3673 *uint_ptr = tcpactiveopens;
darran 0:55a05330f8cc 3674 break;
darran 0:55a05330f8cc 3675 case 6: /* tcpPassiveOpens */
darran 0:55a05330f8cc 3676 *uint_ptr = tcppassiveopens;
darran 0:55a05330f8cc 3677 break;
darran 0:55a05330f8cc 3678 case 7: /* tcpAttemptFails */
darran 0:55a05330f8cc 3679 *uint_ptr = tcpattemptfails;
darran 0:55a05330f8cc 3680 break;
darran 0:55a05330f8cc 3681 case 8: /* tcpEstabResets */
darran 0:55a05330f8cc 3682 *uint_ptr = tcpestabresets;
darran 0:55a05330f8cc 3683 break;
darran 0:55a05330f8cc 3684 case 9: /* tcpCurrEstab */
darran 0:55a05330f8cc 3685 {
darran 0:55a05330f8cc 3686 u16_t tcpcurrestab = 0;
darran 0:55a05330f8cc 3687 struct tcp_pcb *pcb = tcp_active_pcbs;
darran 0:55a05330f8cc 3688 while (pcb != NULL)
darran 0:55a05330f8cc 3689 {
darran 0:55a05330f8cc 3690 if ((pcb->state == ESTABLISHED) ||
darran 0:55a05330f8cc 3691 (pcb->state == CLOSE_WAIT))
darran 0:55a05330f8cc 3692 {
darran 0:55a05330f8cc 3693 tcpcurrestab++;
darran 0:55a05330f8cc 3694 }
darran 0:55a05330f8cc 3695 pcb = pcb->next;
darran 0:55a05330f8cc 3696 }
darran 0:55a05330f8cc 3697 *uint_ptr = tcpcurrestab;
darran 0:55a05330f8cc 3698 }
darran 0:55a05330f8cc 3699 break;
darran 0:55a05330f8cc 3700 case 10: /* tcpInSegs */
darran 0:55a05330f8cc 3701 *uint_ptr = tcpinsegs;
darran 0:55a05330f8cc 3702 break;
darran 0:55a05330f8cc 3703 case 11: /* tcpOutSegs */
darran 0:55a05330f8cc 3704 *uint_ptr = tcpoutsegs;
darran 0:55a05330f8cc 3705 break;
darran 0:55a05330f8cc 3706 case 12: /* tcpRetransSegs */
darran 0:55a05330f8cc 3707 *uint_ptr = tcpretranssegs;
darran 0:55a05330f8cc 3708 break;
darran 0:55a05330f8cc 3709 case 14: /* tcpInErrs */
darran 0:55a05330f8cc 3710 *uint_ptr = tcpinerrs;
darran 0:55a05330f8cc 3711 break;
darran 0:55a05330f8cc 3712 case 15: /* tcpOutRsts */
darran 0:55a05330f8cc 3713 *uint_ptr = tcpoutrsts;
darran 0:55a05330f8cc 3714 break;
darran 0:55a05330f8cc 3715 }
darran 0:55a05330f8cc 3716 }
darran 0:55a05330f8cc 3717 #ifdef THIS_SEEMS_UNUSED
darran 0:55a05330f8cc 3718 static void
darran 0:55a05330f8cc 3719 tcpconnentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 3720 {
darran 0:55a05330f8cc 3721 /* return to object name, adding index depth (10) */
darran 0:55a05330f8cc 3722 ident_len += 10;
darran 0:55a05330f8cc 3723 ident -= 10;
darran 0:55a05330f8cc 3724
darran 0:55a05330f8cc 3725 if (ident_len == 11)
darran 0:55a05330f8cc 3726 {
darran 0:55a05330f8cc 3727 u8_t id;
darran 0:55a05330f8cc 3728
darran 0:55a05330f8cc 3729 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 3730 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 3731
darran 0:55a05330f8cc 3732 id = ident[0];
darran 0:55a05330f8cc 3733 LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def tcp.%"U16_F".0\n",(u16_t)id));
darran 0:55a05330f8cc 3734
darran 0:55a05330f8cc 3735 switch (id)
darran 0:55a05330f8cc 3736 {
darran 0:55a05330f8cc 3737 case 1: /* tcpConnState */
darran 0:55a05330f8cc 3738 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3739 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 3740 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 3741 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 3742 break;
darran 0:55a05330f8cc 3743 case 2: /* tcpConnLocalAddress */
darran 0:55a05330f8cc 3744 case 4: /* tcpConnRemAddress */
darran 0:55a05330f8cc 3745 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3746 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3747 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
darran 0:55a05330f8cc 3748 od->v_len = 4;
darran 0:55a05330f8cc 3749 break;
darran 0:55a05330f8cc 3750 case 3: /* tcpConnLocalPort */
darran 0:55a05330f8cc 3751 case 5: /* tcpConnRemPort */
darran 0:55a05330f8cc 3752 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3753 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3754 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 3755 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 3756 break;
darran 0:55a05330f8cc 3757 default:
darran 0:55a05330f8cc 3758 LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcpconnentry_get_object_def: no such object\n"));
darran 0:55a05330f8cc 3759 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3760 break;
darran 0:55a05330f8cc 3761 };
darran 0:55a05330f8cc 3762 }
darran 0:55a05330f8cc 3763 else
darran 0:55a05330f8cc 3764 {
darran 0:55a05330f8cc 3765 LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcpconnentry_get_object_def: no such object\n"));
darran 0:55a05330f8cc 3766 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3767 }
darran 0:55a05330f8cc 3768 }
darran 0:55a05330f8cc 3769
darran 0:55a05330f8cc 3770 static void
darran 0:55a05330f8cc 3771 tcpconnentry_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 3772 {
darran 0:55a05330f8cc 3773 ip_addr_t lip, rip;
darran 0:55a05330f8cc 3774 u16_t lport, rport;
darran 0:55a05330f8cc 3775 s32_t *ident;
darran 0:55a05330f8cc 3776
darran 0:55a05330f8cc 3777 ident = od->id_inst_ptr;
darran 0:55a05330f8cc 3778 snmp_oidtoip(&ident[1], &lip);
darran 0:55a05330f8cc 3779 lport = ident[5];
darran 0:55a05330f8cc 3780 snmp_oidtoip(&ident[6], &rip);
darran 0:55a05330f8cc 3781 rport = ident[10];
darran 0:55a05330f8cc 3782
darran 0:55a05330f8cc 3783 /** @todo find matching PCB */
darran 0:55a05330f8cc 3784 }
darran 0:55a05330f8cc 3785 #endif /* if 0 */
darran 0:55a05330f8cc 3786 #endif
darran 0:55a05330f8cc 3787
darran 0:55a05330f8cc 3788 static void
darran 0:55a05330f8cc 3789 udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 3790 {
darran 0:55a05330f8cc 3791 /* return to object name, adding index depth (1) */
darran 0:55a05330f8cc 3792 ident_len += 1;
darran 0:55a05330f8cc 3793 ident -= 1;
darran 0:55a05330f8cc 3794 if ((ident_len == 2) &&
darran 0:55a05330f8cc 3795 (ident[0] > 0) && (ident[0] < 6))
darran 0:55a05330f8cc 3796 {
darran 0:55a05330f8cc 3797 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 3798 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 3799
darran 0:55a05330f8cc 3800 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 3801 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3802 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
darran 0:55a05330f8cc 3803 od->v_len = sizeof(u32_t);
darran 0:55a05330f8cc 3804 }
darran 0:55a05330f8cc 3805 else
darran 0:55a05330f8cc 3806 {
darran 0:55a05330f8cc 3807 LWIP_DEBUGF(SNMP_MIB_DEBUG,("udp_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 3808 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3809 }
darran 0:55a05330f8cc 3810 }
darran 0:55a05330f8cc 3811
darran 0:55a05330f8cc 3812 static void
darran 0:55a05330f8cc 3813 udp_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 3814 {
darran 0:55a05330f8cc 3815 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 3816 u8_t id;
darran 0:55a05330f8cc 3817
darran 0:55a05330f8cc 3818 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 3819 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 3820 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 3821 switch (id)
darran 0:55a05330f8cc 3822 {
darran 0:55a05330f8cc 3823 case 1: /* udpInDatagrams */
darran 0:55a05330f8cc 3824 *uint_ptr = udpindatagrams;
darran 0:55a05330f8cc 3825 break;
darran 0:55a05330f8cc 3826 case 2: /* udpNoPorts */
darran 0:55a05330f8cc 3827 *uint_ptr = udpnoports;
darran 0:55a05330f8cc 3828 break;
darran 0:55a05330f8cc 3829 case 3: /* udpInErrors */
darran 0:55a05330f8cc 3830 *uint_ptr = udpinerrors;
darran 0:55a05330f8cc 3831 break;
darran 0:55a05330f8cc 3832 case 4: /* udpOutDatagrams */
darran 0:55a05330f8cc 3833 *uint_ptr = udpoutdatagrams;
darran 0:55a05330f8cc 3834 break;
darran 0:55a05330f8cc 3835 }
darran 0:55a05330f8cc 3836 }
darran 0:55a05330f8cc 3837
darran 0:55a05330f8cc 3838 static void
darran 0:55a05330f8cc 3839 udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 3840 {
darran 0:55a05330f8cc 3841 /* return to object name, adding index depth (5) */
darran 0:55a05330f8cc 3842 ident_len += 5;
darran 0:55a05330f8cc 3843 ident -= 5;
darran 0:55a05330f8cc 3844
darran 0:55a05330f8cc 3845 if (ident_len == 6)
darran 0:55a05330f8cc 3846 {
darran 0:55a05330f8cc 3847 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 3848 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 3849
darran 0:55a05330f8cc 3850 switch (ident[0])
darran 0:55a05330f8cc 3851 {
darran 0:55a05330f8cc 3852 case 1: /* udpLocalAddress */
darran 0:55a05330f8cc 3853 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3854 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3855 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
darran 0:55a05330f8cc 3856 od->v_len = 4;
darran 0:55a05330f8cc 3857 break;
darran 0:55a05330f8cc 3858 case 2: /* udpLocalPort */
darran 0:55a05330f8cc 3859 od->instance = MIB_OBJECT_TAB;
darran 0:55a05330f8cc 3860 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3861 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 3862 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 3863 break;
darran 0:55a05330f8cc 3864 default:
darran 0:55a05330f8cc 3865 LWIP_DEBUGF(SNMP_MIB_DEBUG,("udpentry_get_object_def: no such object\n"));
darran 0:55a05330f8cc 3866 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3867 break;
darran 0:55a05330f8cc 3868 }
darran 0:55a05330f8cc 3869 }
darran 0:55a05330f8cc 3870 else
darran 0:55a05330f8cc 3871 {
darran 0:55a05330f8cc 3872 LWIP_DEBUGF(SNMP_MIB_DEBUG,("udpentry_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 3873 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3874 }
darran 0:55a05330f8cc 3875 }
darran 0:55a05330f8cc 3876
darran 0:55a05330f8cc 3877 static void
darran 0:55a05330f8cc 3878 udpentry_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 3879 {
darran 0:55a05330f8cc 3880 u8_t id;
darran 0:55a05330f8cc 3881 struct udp_pcb *pcb;
darran 0:55a05330f8cc 3882 ip_addr_t ip;
darran 0:55a05330f8cc 3883 u16_t port;
darran 0:55a05330f8cc 3884
darran 0:55a05330f8cc 3885 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 3886 snmp_oidtoip(&od->id_inst_ptr[1], &ip);
darran 0:55a05330f8cc 3887 LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff));
darran 0:55a05330f8cc 3888 port = (u16_t)od->id_inst_ptr[5];
darran 0:55a05330f8cc 3889
darran 0:55a05330f8cc 3890 pcb = udp_pcbs;
darran 0:55a05330f8cc 3891 while ((pcb != NULL) &&
darran 0:55a05330f8cc 3892 !(ip_addr_cmp(&pcb->local_ip, &ip) &&
darran 0:55a05330f8cc 3893 (pcb->local_port == port)))
darran 0:55a05330f8cc 3894 {
darran 0:55a05330f8cc 3895 pcb = pcb->next;
darran 0:55a05330f8cc 3896 }
darran 0:55a05330f8cc 3897
darran 0:55a05330f8cc 3898 if (pcb != NULL)
darran 0:55a05330f8cc 3899 {
darran 0:55a05330f8cc 3900 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 3901 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 3902 switch (id)
darran 0:55a05330f8cc 3903 {
darran 0:55a05330f8cc 3904 case 1: /* udpLocalAddress */
darran 0:55a05330f8cc 3905 {
darran 0:55a05330f8cc 3906 ip_addr_t *dst = (ip_addr_t*)value;
darran 0:55a05330f8cc 3907 *dst = pcb->local_ip;
darran 0:55a05330f8cc 3908 }
darran 0:55a05330f8cc 3909 break;
darran 0:55a05330f8cc 3910 case 2: /* udpLocalPort */
darran 0:55a05330f8cc 3911 {
darran 0:55a05330f8cc 3912 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 3913 *sint_ptr = pcb->local_port;
darran 0:55a05330f8cc 3914 }
darran 0:55a05330f8cc 3915 break;
darran 0:55a05330f8cc 3916 }
darran 0:55a05330f8cc 3917 }
darran 0:55a05330f8cc 3918 }
darran 0:55a05330f8cc 3919
darran 0:55a05330f8cc 3920 static void
darran 0:55a05330f8cc 3921 snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
darran 0:55a05330f8cc 3922 {
darran 0:55a05330f8cc 3923 /* return to object name, adding index depth (1) */
darran 0:55a05330f8cc 3924 ident_len += 1;
darran 0:55a05330f8cc 3925 ident -= 1;
darran 0:55a05330f8cc 3926 if (ident_len == 2)
darran 0:55a05330f8cc 3927 {
darran 0:55a05330f8cc 3928 u8_t id;
darran 0:55a05330f8cc 3929
darran 0:55a05330f8cc 3930 od->id_inst_len = ident_len;
darran 0:55a05330f8cc 3931 od->id_inst_ptr = ident;
darran 0:55a05330f8cc 3932
darran 0:55a05330f8cc 3933 LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff));
darran 0:55a05330f8cc 3934 id = (u8_t)ident[0];
darran 0:55a05330f8cc 3935 switch (id)
darran 0:55a05330f8cc 3936 {
darran 0:55a05330f8cc 3937 case 1: /* snmpInPkts */
darran 0:55a05330f8cc 3938 case 2: /* snmpOutPkts */
darran 0:55a05330f8cc 3939 case 3: /* snmpInBadVersions */
darran 0:55a05330f8cc 3940 case 4: /* snmpInBadCommunityNames */
darran 0:55a05330f8cc 3941 case 5: /* snmpInBadCommunityUses */
darran 0:55a05330f8cc 3942 case 6: /* snmpInASNParseErrs */
darran 0:55a05330f8cc 3943 case 8: /* snmpInTooBigs */
darran 0:55a05330f8cc 3944 case 9: /* snmpInNoSuchNames */
darran 0:55a05330f8cc 3945 case 10: /* snmpInBadValues */
darran 0:55a05330f8cc 3946 case 11: /* snmpInReadOnlys */
darran 0:55a05330f8cc 3947 case 12: /* snmpInGenErrs */
darran 0:55a05330f8cc 3948 case 13: /* snmpInTotalReqVars */
darran 0:55a05330f8cc 3949 case 14: /* snmpInTotalSetVars */
darran 0:55a05330f8cc 3950 case 15: /* snmpInGetRequests */
darran 0:55a05330f8cc 3951 case 16: /* snmpInGetNexts */
darran 0:55a05330f8cc 3952 case 17: /* snmpInSetRequests */
darran 0:55a05330f8cc 3953 case 18: /* snmpInGetResponses */
darran 0:55a05330f8cc 3954 case 19: /* snmpInTraps */
darran 0:55a05330f8cc 3955 case 20: /* snmpOutTooBigs */
darran 0:55a05330f8cc 3956 case 21: /* snmpOutNoSuchNames */
darran 0:55a05330f8cc 3957 case 22: /* snmpOutBadValues */
darran 0:55a05330f8cc 3958 case 24: /* snmpOutGenErrs */
darran 0:55a05330f8cc 3959 case 25: /* snmpOutGetRequests */
darran 0:55a05330f8cc 3960 case 26: /* snmpOutGetNexts */
darran 0:55a05330f8cc 3961 case 27: /* snmpOutSetRequests */
darran 0:55a05330f8cc 3962 case 28: /* snmpOutGetResponses */
darran 0:55a05330f8cc 3963 case 29: /* snmpOutTraps */
darran 0:55a05330f8cc 3964 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 3965 od->access = MIB_OBJECT_READ_ONLY;
darran 0:55a05330f8cc 3966 od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
darran 0:55a05330f8cc 3967 od->v_len = sizeof(u32_t);
darran 0:55a05330f8cc 3968 break;
darran 0:55a05330f8cc 3969 case 30: /* snmpEnableAuthenTraps */
darran 0:55a05330f8cc 3970 od->instance = MIB_OBJECT_SCALAR;
darran 0:55a05330f8cc 3971 od->access = MIB_OBJECT_READ_WRITE;
darran 0:55a05330f8cc 3972 od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
darran 0:55a05330f8cc 3973 od->v_len = sizeof(s32_t);
darran 0:55a05330f8cc 3974 break;
darran 0:55a05330f8cc 3975 default:
darran 0:55a05330f8cc 3976 LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_object_def: no such object\n"));
darran 0:55a05330f8cc 3977 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3978 break;
darran 0:55a05330f8cc 3979 };
darran 0:55a05330f8cc 3980 }
darran 0:55a05330f8cc 3981 else
darran 0:55a05330f8cc 3982 {
darran 0:55a05330f8cc 3983 LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_object_def: no scalar\n"));
darran 0:55a05330f8cc 3984 od->instance = MIB_OBJECT_NONE;
darran 0:55a05330f8cc 3985 }
darran 0:55a05330f8cc 3986 }
darran 0:55a05330f8cc 3987
darran 0:55a05330f8cc 3988 static void
darran 0:55a05330f8cc 3989 snmp_get_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 3990 {
darran 0:55a05330f8cc 3991 u32_t *uint_ptr = (u32_t*)value;
darran 0:55a05330f8cc 3992 u8_t id;
darran 0:55a05330f8cc 3993
darran 0:55a05330f8cc 3994 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 3995 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 3996 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 3997 switch (id)
darran 0:55a05330f8cc 3998 {
darran 0:55a05330f8cc 3999 case 1: /* snmpInPkts */
darran 0:55a05330f8cc 4000 *uint_ptr = snmpinpkts;
darran 0:55a05330f8cc 4001 break;
darran 0:55a05330f8cc 4002 case 2: /* snmpOutPkts */
darran 0:55a05330f8cc 4003 *uint_ptr = snmpoutpkts;
darran 0:55a05330f8cc 4004 break;
darran 0:55a05330f8cc 4005 case 3: /* snmpInBadVersions */
darran 0:55a05330f8cc 4006 *uint_ptr = snmpinbadversions;
darran 0:55a05330f8cc 4007 break;
darran 0:55a05330f8cc 4008 case 4: /* snmpInBadCommunityNames */
darran 0:55a05330f8cc 4009 *uint_ptr = snmpinbadcommunitynames;
darran 0:55a05330f8cc 4010 break;
darran 0:55a05330f8cc 4011 case 5: /* snmpInBadCommunityUses */
darran 0:55a05330f8cc 4012 *uint_ptr = snmpinbadcommunityuses;
darran 0:55a05330f8cc 4013 break;
darran 0:55a05330f8cc 4014 case 6: /* snmpInASNParseErrs */
darran 0:55a05330f8cc 4015 *uint_ptr = snmpinasnparseerrs;
darran 0:55a05330f8cc 4016 break;
darran 0:55a05330f8cc 4017 case 8: /* snmpInTooBigs */
darran 0:55a05330f8cc 4018 *uint_ptr = snmpintoobigs;
darran 0:55a05330f8cc 4019 break;
darran 0:55a05330f8cc 4020 case 9: /* snmpInNoSuchNames */
darran 0:55a05330f8cc 4021 *uint_ptr = snmpinnosuchnames;
darran 0:55a05330f8cc 4022 break;
darran 0:55a05330f8cc 4023 case 10: /* snmpInBadValues */
darran 0:55a05330f8cc 4024 *uint_ptr = snmpinbadvalues;
darran 0:55a05330f8cc 4025 break;
darran 0:55a05330f8cc 4026 case 11: /* snmpInReadOnlys */
darran 0:55a05330f8cc 4027 *uint_ptr = snmpinreadonlys;
darran 0:55a05330f8cc 4028 break;
darran 0:55a05330f8cc 4029 case 12: /* snmpInGenErrs */
darran 0:55a05330f8cc 4030 *uint_ptr = snmpingenerrs;
darran 0:55a05330f8cc 4031 break;
darran 0:55a05330f8cc 4032 case 13: /* snmpInTotalReqVars */
darran 0:55a05330f8cc 4033 *uint_ptr = snmpintotalreqvars;
darran 0:55a05330f8cc 4034 break;
darran 0:55a05330f8cc 4035 case 14: /* snmpInTotalSetVars */
darran 0:55a05330f8cc 4036 *uint_ptr = snmpintotalsetvars;
darran 0:55a05330f8cc 4037 break;
darran 0:55a05330f8cc 4038 case 15: /* snmpInGetRequests */
darran 0:55a05330f8cc 4039 *uint_ptr = snmpingetrequests;
darran 0:55a05330f8cc 4040 break;
darran 0:55a05330f8cc 4041 case 16: /* snmpInGetNexts */
darran 0:55a05330f8cc 4042 *uint_ptr = snmpingetnexts;
darran 0:55a05330f8cc 4043 break;
darran 0:55a05330f8cc 4044 case 17: /* snmpInSetRequests */
darran 0:55a05330f8cc 4045 *uint_ptr = snmpinsetrequests;
darran 0:55a05330f8cc 4046 break;
darran 0:55a05330f8cc 4047 case 18: /* snmpInGetResponses */
darran 0:55a05330f8cc 4048 *uint_ptr = snmpingetresponses;
darran 0:55a05330f8cc 4049 break;
darran 0:55a05330f8cc 4050 case 19: /* snmpInTraps */
darran 0:55a05330f8cc 4051 *uint_ptr = snmpintraps;
darran 0:55a05330f8cc 4052 break;
darran 0:55a05330f8cc 4053 case 20: /* snmpOutTooBigs */
darran 0:55a05330f8cc 4054 *uint_ptr = snmpouttoobigs;
darran 0:55a05330f8cc 4055 break;
darran 0:55a05330f8cc 4056 case 21: /* snmpOutNoSuchNames */
darran 0:55a05330f8cc 4057 *uint_ptr = snmpoutnosuchnames;
darran 0:55a05330f8cc 4058 break;
darran 0:55a05330f8cc 4059 case 22: /* snmpOutBadValues */
darran 0:55a05330f8cc 4060 *uint_ptr = snmpoutbadvalues;
darran 0:55a05330f8cc 4061 break;
darran 0:55a05330f8cc 4062 case 24: /* snmpOutGenErrs */
darran 0:55a05330f8cc 4063 *uint_ptr = snmpoutgenerrs;
darran 0:55a05330f8cc 4064 break;
darran 0:55a05330f8cc 4065 case 25: /* snmpOutGetRequests */
darran 0:55a05330f8cc 4066 *uint_ptr = snmpoutgetrequests;
darran 0:55a05330f8cc 4067 break;
darran 0:55a05330f8cc 4068 case 26: /* snmpOutGetNexts */
darran 0:55a05330f8cc 4069 *uint_ptr = snmpoutgetnexts;
darran 0:55a05330f8cc 4070 break;
darran 0:55a05330f8cc 4071 case 27: /* snmpOutSetRequests */
darran 0:55a05330f8cc 4072 *uint_ptr = snmpoutsetrequests;
darran 0:55a05330f8cc 4073 break;
darran 0:55a05330f8cc 4074 case 28: /* snmpOutGetResponses */
darran 0:55a05330f8cc 4075 *uint_ptr = snmpoutgetresponses;
darran 0:55a05330f8cc 4076 break;
darran 0:55a05330f8cc 4077 case 29: /* snmpOutTraps */
darran 0:55a05330f8cc 4078 *uint_ptr = snmpouttraps;
darran 0:55a05330f8cc 4079 break;
darran 0:55a05330f8cc 4080 case 30: /* snmpEnableAuthenTraps */
darran 0:55a05330f8cc 4081 *uint_ptr = *snmpenableauthentraps_ptr;
darran 0:55a05330f8cc 4082 break;
darran 0:55a05330f8cc 4083 };
darran 0:55a05330f8cc 4084 }
darran 0:55a05330f8cc 4085
darran 0:55a05330f8cc 4086 /**
darran 0:55a05330f8cc 4087 * Test snmp object value before setting.
darran 0:55a05330f8cc 4088 *
darran 0:55a05330f8cc 4089 * @param od is the object definition
darran 0:55a05330f8cc 4090 * @param len return value space (in bytes)
darran 0:55a05330f8cc 4091 * @param value points to (varbind) space to copy value from.
darran 0:55a05330f8cc 4092 */
darran 0:55a05330f8cc 4093 static u8_t
darran 0:55a05330f8cc 4094 snmp_set_test(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 4095 {
darran 0:55a05330f8cc 4096 u8_t id, set_ok;
darran 0:55a05330f8cc 4097
darran 0:55a05330f8cc 4098 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 4099 set_ok = 0;
darran 0:55a05330f8cc 4100 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 4101 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 4102 if (id == 30)
darran 0:55a05330f8cc 4103 {
darran 0:55a05330f8cc 4104 /* snmpEnableAuthenTraps */
darran 0:55a05330f8cc 4105 s32_t *sint_ptr = (s32_t*)value;
darran 0:55a05330f8cc 4106
darran 0:55a05330f8cc 4107 if (snmpenableauthentraps_ptr != &snmpenableauthentraps_default)
darran 0:55a05330f8cc 4108 {
darran 0:55a05330f8cc 4109 /* we should have writable non-volatile mem here */
darran 0:55a05330f8cc 4110 if ((*sint_ptr == 1) || (*sint_ptr == 2))
darran 0:55a05330f8cc 4111 {
darran 0:55a05330f8cc 4112 set_ok = 1;
darran 0:55a05330f8cc 4113 }
darran 0:55a05330f8cc 4114 }
darran 0:55a05330f8cc 4115 else
darran 0:55a05330f8cc 4116 {
darran 0:55a05330f8cc 4117 /* const or hardwired value */
darran 0:55a05330f8cc 4118 if (*sint_ptr == snmpenableauthentraps_default)
darran 0:55a05330f8cc 4119 {
darran 0:55a05330f8cc 4120 set_ok = 1;
darran 0:55a05330f8cc 4121 }
darran 0:55a05330f8cc 4122 }
darran 0:55a05330f8cc 4123 }
darran 0:55a05330f8cc 4124 return set_ok;
darran 0:55a05330f8cc 4125 }
darran 0:55a05330f8cc 4126
darran 0:55a05330f8cc 4127 static void
darran 0:55a05330f8cc 4128 snmp_set_value(struct obj_def *od, u16_t len, void *value)
darran 0:55a05330f8cc 4129 {
darran 0:55a05330f8cc 4130 u8_t id;
darran 0:55a05330f8cc 4131
darran 0:55a05330f8cc 4132 LWIP_UNUSED_ARG(len);
darran 0:55a05330f8cc 4133 LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff));
darran 0:55a05330f8cc 4134 id = (u8_t)od->id_inst_ptr[0];
darran 0:55a05330f8cc 4135 if (id == 30)
darran 0:55a05330f8cc 4136 {
darran 0:55a05330f8cc 4137 /* snmpEnableAuthenTraps */
darran 0:55a05330f8cc 4138 /* @todo @fixme: which kind of pointer is 'value'? s32_t or u8_t??? */
darran 0:55a05330f8cc 4139 u8_t *ptr = (u8_t*)value;
darran 0:55a05330f8cc 4140 *snmpenableauthentraps_ptr = *ptr;
darran 0:55a05330f8cc 4141 }
darran 0:55a05330f8cc 4142 }
darran 0:55a05330f8cc 4143
darran 0:55a05330f8cc 4144 #endif /* LWIP_SNMP */