ソースの整理中ですが、利用はできます。

Dependencies:   EthernetInterface HttpServer TextLCD mbed-rpc mbed-rtos mbed Socket lwip-eth lwip-sys lwip

Committer:
yueee_yt
Date:
Wed Mar 12 04:39:15 2014 +0000
Revision:
2:14b689a85306
Parent:
0:7766f6712673
bug fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yueee_yt 0:7766f6712673 1 /**
yueee_yt 0:7766f6712673 2 * @file
yueee_yt 0:7766f6712673 3 * MIB tree access/construction functions.
yueee_yt 0:7766f6712673 4 */
yueee_yt 0:7766f6712673 5
yueee_yt 0:7766f6712673 6 /*
yueee_yt 0:7766f6712673 7 * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
yueee_yt 0:7766f6712673 8 * All rights reserved.
yueee_yt 0:7766f6712673 9 *
yueee_yt 0:7766f6712673 10 * Redistribution and use in source and binary forms, with or without modification,
yueee_yt 0:7766f6712673 11 * are permitted provided that the following conditions are met:
yueee_yt 0:7766f6712673 12 *
yueee_yt 0:7766f6712673 13 * 1. Redistributions of source code must retain the above copyright notice,
yueee_yt 0:7766f6712673 14 * this list of conditions and the following disclaimer.
yueee_yt 0:7766f6712673 15 * 2. Redistributions in binary form must reproduce the above copyright notice,
yueee_yt 0:7766f6712673 16 * this list of conditions and the following disclaimer in the documentation
yueee_yt 0:7766f6712673 17 * and/or other materials provided with the distribution.
yueee_yt 0:7766f6712673 18 * 3. The name of the author may not be used to endorse or promote products
yueee_yt 0:7766f6712673 19 * derived from this software without specific prior written permission.
yueee_yt 0:7766f6712673 20 *
yueee_yt 0:7766f6712673 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
yueee_yt 0:7766f6712673 22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
yueee_yt 0:7766f6712673 23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
yueee_yt 0:7766f6712673 24 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
yueee_yt 0:7766f6712673 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
yueee_yt 0:7766f6712673 26 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
yueee_yt 0:7766f6712673 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
yueee_yt 0:7766f6712673 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
yueee_yt 0:7766f6712673 29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
yueee_yt 0:7766f6712673 30 * OF SUCH DAMAGE.
yueee_yt 0:7766f6712673 31 *
yueee_yt 0:7766f6712673 32 * Author: Christiaan Simons <christiaan.simons@axon.tv>
yueee_yt 0:7766f6712673 33 */
yueee_yt 0:7766f6712673 34
yueee_yt 0:7766f6712673 35 #include "lwip/opt.h"
yueee_yt 0:7766f6712673 36
yueee_yt 0:7766f6712673 37 #if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
yueee_yt 0:7766f6712673 38
yueee_yt 0:7766f6712673 39 #include "lwip/snmp_structs.h"
yueee_yt 0:7766f6712673 40 #include "lwip/memp.h"
yueee_yt 0:7766f6712673 41 #include "lwip/netif.h"
yueee_yt 0:7766f6712673 42
yueee_yt 0:7766f6712673 43 /** .iso.org.dod.internet address prefix, @see snmp_iso_*() */
yueee_yt 0:7766f6712673 44 const s32_t prefix[4] = {1, 3, 6, 1};
yueee_yt 0:7766f6712673 45
yueee_yt 0:7766f6712673 46 #define NODE_STACK_SIZE (LWIP_SNMP_OBJ_ID_LEN)
yueee_yt 0:7766f6712673 47 /** node stack entry (old news?) */
yueee_yt 0:7766f6712673 48 struct nse
yueee_yt 0:7766f6712673 49 {
yueee_yt 0:7766f6712673 50 /** right child */
yueee_yt 0:7766f6712673 51 struct mib_node* r_ptr;
yueee_yt 0:7766f6712673 52 /** right child identifier */
yueee_yt 0:7766f6712673 53 s32_t r_id;
yueee_yt 0:7766f6712673 54 /** right child next level */
yueee_yt 0:7766f6712673 55 u8_t r_nl;
yueee_yt 0:7766f6712673 56 };
yueee_yt 0:7766f6712673 57 static u8_t node_stack_cnt;
yueee_yt 0:7766f6712673 58 static struct nse node_stack[NODE_STACK_SIZE];
yueee_yt 0:7766f6712673 59
yueee_yt 0:7766f6712673 60 /**
yueee_yt 0:7766f6712673 61 * Pushes nse struct onto stack.
yueee_yt 0:7766f6712673 62 */
yueee_yt 0:7766f6712673 63 static void
yueee_yt 0:7766f6712673 64 push_node(struct nse* node)
yueee_yt 0:7766f6712673 65 {
yueee_yt 0:7766f6712673 66 LWIP_ASSERT("node_stack_cnt < NODE_STACK_SIZE",node_stack_cnt < NODE_STACK_SIZE);
yueee_yt 0:7766f6712673 67 LWIP_DEBUGF(SNMP_MIB_DEBUG,("push_node() node=%p id=%"S32_F"\n",(void*)(node->r_ptr),node->r_id));
yueee_yt 0:7766f6712673 68 if (node_stack_cnt < NODE_STACK_SIZE)
yueee_yt 0:7766f6712673 69 {
yueee_yt 0:7766f6712673 70 node_stack[node_stack_cnt] = *node;
yueee_yt 0:7766f6712673 71 node_stack_cnt++;
yueee_yt 0:7766f6712673 72 }
yueee_yt 0:7766f6712673 73 }
yueee_yt 0:7766f6712673 74
yueee_yt 0:7766f6712673 75 /**
yueee_yt 0:7766f6712673 76 * Pops nse struct from stack.
yueee_yt 0:7766f6712673 77 */
yueee_yt 0:7766f6712673 78 static void
yueee_yt 0:7766f6712673 79 pop_node(struct nse* node)
yueee_yt 0:7766f6712673 80 {
yueee_yt 0:7766f6712673 81 if (node_stack_cnt > 0)
yueee_yt 0:7766f6712673 82 {
yueee_yt 0:7766f6712673 83 node_stack_cnt--;
yueee_yt 0:7766f6712673 84 *node = node_stack[node_stack_cnt];
yueee_yt 0:7766f6712673 85 }
yueee_yt 0:7766f6712673 86 LWIP_DEBUGF(SNMP_MIB_DEBUG,("pop_node() node=%p id=%"S32_F"\n",(void *)(node->r_ptr),node->r_id));
yueee_yt 0:7766f6712673 87 }
yueee_yt 0:7766f6712673 88
yueee_yt 0:7766f6712673 89 /**
yueee_yt 0:7766f6712673 90 * Conversion from ifIndex to lwIP netif
yueee_yt 0:7766f6712673 91 * @param ifindex is a s32_t object sub-identifier
yueee_yt 0:7766f6712673 92 * @param netif points to returned netif struct pointer
yueee_yt 0:7766f6712673 93 */
yueee_yt 0:7766f6712673 94 void
yueee_yt 0:7766f6712673 95 snmp_ifindextonetif(s32_t ifindex, struct netif **netif)
yueee_yt 0:7766f6712673 96 {
yueee_yt 0:7766f6712673 97 struct netif *nif = netif_list;
yueee_yt 0:7766f6712673 98 s32_t i, ifidx;
yueee_yt 0:7766f6712673 99
yueee_yt 0:7766f6712673 100 ifidx = ifindex - 1;
yueee_yt 0:7766f6712673 101 i = 0;
yueee_yt 0:7766f6712673 102 while ((nif != NULL) && (i < ifidx))
yueee_yt 0:7766f6712673 103 {
yueee_yt 0:7766f6712673 104 nif = nif->next;
yueee_yt 0:7766f6712673 105 i++;
yueee_yt 0:7766f6712673 106 }
yueee_yt 0:7766f6712673 107 *netif = nif;
yueee_yt 0:7766f6712673 108 }
yueee_yt 0:7766f6712673 109
yueee_yt 0:7766f6712673 110 /**
yueee_yt 0:7766f6712673 111 * Conversion from lwIP netif to ifIndex
yueee_yt 0:7766f6712673 112 * @param netif points to a netif struct
yueee_yt 0:7766f6712673 113 * @param ifidx points to s32_t object sub-identifier
yueee_yt 0:7766f6712673 114 */
yueee_yt 0:7766f6712673 115 void
yueee_yt 0:7766f6712673 116 snmp_netiftoifindex(struct netif *netif, s32_t *ifidx)
yueee_yt 0:7766f6712673 117 {
yueee_yt 0:7766f6712673 118 struct netif *nif = netif_list;
yueee_yt 0:7766f6712673 119 u16_t i;
yueee_yt 0:7766f6712673 120
yueee_yt 0:7766f6712673 121 i = 0;
yueee_yt 0:7766f6712673 122 while ((nif != NULL) && (nif != netif))
yueee_yt 0:7766f6712673 123 {
yueee_yt 0:7766f6712673 124 nif = nif->next;
yueee_yt 0:7766f6712673 125 i++;
yueee_yt 0:7766f6712673 126 }
yueee_yt 0:7766f6712673 127 *ifidx = i+1;
yueee_yt 0:7766f6712673 128 }
yueee_yt 0:7766f6712673 129
yueee_yt 0:7766f6712673 130 /**
yueee_yt 0:7766f6712673 131 * Conversion from oid to lwIP ip_addr
yueee_yt 0:7766f6712673 132 * @param ident points to s32_t ident[4] input
yueee_yt 0:7766f6712673 133 * @param ip points to output struct
yueee_yt 0:7766f6712673 134 */
yueee_yt 0:7766f6712673 135 void
yueee_yt 0:7766f6712673 136 snmp_oidtoip(s32_t *ident, ip_addr_t *ip)
yueee_yt 0:7766f6712673 137 {
yueee_yt 0:7766f6712673 138 IP4_ADDR(ip, ident[0], ident[1], ident[2], ident[3]);
yueee_yt 0:7766f6712673 139 }
yueee_yt 0:7766f6712673 140
yueee_yt 0:7766f6712673 141 /**
yueee_yt 0:7766f6712673 142 * Conversion from lwIP ip_addr to oid
yueee_yt 0:7766f6712673 143 * @param ip points to input struct
yueee_yt 0:7766f6712673 144 * @param ident points to s32_t ident[4] output
yueee_yt 0:7766f6712673 145 */
yueee_yt 0:7766f6712673 146 void
yueee_yt 0:7766f6712673 147 snmp_iptooid(ip_addr_t *ip, s32_t *ident)
yueee_yt 0:7766f6712673 148 {
yueee_yt 0:7766f6712673 149 ident[0] = ip4_addr1(ip);
yueee_yt 0:7766f6712673 150 ident[1] = ip4_addr2(ip);
yueee_yt 0:7766f6712673 151 ident[2] = ip4_addr3(ip);
yueee_yt 0:7766f6712673 152 ident[3] = ip4_addr4(ip);
yueee_yt 0:7766f6712673 153 }
yueee_yt 0:7766f6712673 154
yueee_yt 0:7766f6712673 155 struct mib_list_node *
yueee_yt 0:7766f6712673 156 snmp_mib_ln_alloc(s32_t id)
yueee_yt 0:7766f6712673 157 {
yueee_yt 0:7766f6712673 158 struct mib_list_node *ln;
yueee_yt 0:7766f6712673 159
yueee_yt 0:7766f6712673 160 ln = (struct mib_list_node *)memp_malloc(MEMP_SNMP_NODE);
yueee_yt 0:7766f6712673 161 if (ln != NULL)
yueee_yt 0:7766f6712673 162 {
yueee_yt 0:7766f6712673 163 ln->prev = NULL;
yueee_yt 0:7766f6712673 164 ln->next = NULL;
yueee_yt 0:7766f6712673 165 ln->objid = id;
yueee_yt 0:7766f6712673 166 ln->nptr = NULL;
yueee_yt 0:7766f6712673 167 }
yueee_yt 0:7766f6712673 168 return ln;
yueee_yt 0:7766f6712673 169 }
yueee_yt 0:7766f6712673 170
yueee_yt 0:7766f6712673 171 void
yueee_yt 0:7766f6712673 172 snmp_mib_ln_free(struct mib_list_node *ln)
yueee_yt 0:7766f6712673 173 {
yueee_yt 0:7766f6712673 174 memp_free(MEMP_SNMP_NODE, ln);
yueee_yt 0:7766f6712673 175 }
yueee_yt 0:7766f6712673 176
yueee_yt 0:7766f6712673 177 struct mib_list_rootnode *
yueee_yt 0:7766f6712673 178 snmp_mib_lrn_alloc(void)
yueee_yt 0:7766f6712673 179 {
yueee_yt 0:7766f6712673 180 struct mib_list_rootnode *lrn;
yueee_yt 0:7766f6712673 181
yueee_yt 0:7766f6712673 182 lrn = (struct mib_list_rootnode*)memp_malloc(MEMP_SNMP_ROOTNODE);
yueee_yt 0:7766f6712673 183 if (lrn != NULL)
yueee_yt 0:7766f6712673 184 {
yueee_yt 0:7766f6712673 185 lrn->get_object_def = noleafs_get_object_def;
yueee_yt 0:7766f6712673 186 lrn->get_value = noleafs_get_value;
yueee_yt 0:7766f6712673 187 lrn->set_test = noleafs_set_test;
yueee_yt 0:7766f6712673 188 lrn->set_value = noleafs_set_value;
yueee_yt 0:7766f6712673 189 lrn->node_type = MIB_NODE_LR;
yueee_yt 0:7766f6712673 190 lrn->maxlength = 0;
yueee_yt 0:7766f6712673 191 lrn->head = NULL;
yueee_yt 0:7766f6712673 192 lrn->tail = NULL;
yueee_yt 0:7766f6712673 193 lrn->count = 0;
yueee_yt 0:7766f6712673 194 }
yueee_yt 0:7766f6712673 195 return lrn;
yueee_yt 0:7766f6712673 196 }
yueee_yt 0:7766f6712673 197
yueee_yt 0:7766f6712673 198 void
yueee_yt 0:7766f6712673 199 snmp_mib_lrn_free(struct mib_list_rootnode *lrn)
yueee_yt 0:7766f6712673 200 {
yueee_yt 0:7766f6712673 201 memp_free(MEMP_SNMP_ROOTNODE, lrn);
yueee_yt 0:7766f6712673 202 }
yueee_yt 0:7766f6712673 203
yueee_yt 0:7766f6712673 204 /**
yueee_yt 0:7766f6712673 205 * Inserts node in idx list in a sorted
yueee_yt 0:7766f6712673 206 * (ascending order) fashion and
yueee_yt 0:7766f6712673 207 * allocates the node if needed.
yueee_yt 0:7766f6712673 208 *
yueee_yt 0:7766f6712673 209 * @param rn points to the root node
yueee_yt 0:7766f6712673 210 * @param objid is the object sub identifier
yueee_yt 0:7766f6712673 211 * @param insn points to a pointer to the inserted node
yueee_yt 0:7766f6712673 212 * used for constructing the tree.
yueee_yt 0:7766f6712673 213 * @return -1 if failed, 1 if inserted, 2 if present.
yueee_yt 0:7766f6712673 214 */
yueee_yt 0:7766f6712673 215 s8_t
yueee_yt 0:7766f6712673 216 snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn)
yueee_yt 0:7766f6712673 217 {
yueee_yt 0:7766f6712673 218 struct mib_list_node *nn;
yueee_yt 0:7766f6712673 219 s8_t insert;
yueee_yt 0:7766f6712673 220
yueee_yt 0:7766f6712673 221 LWIP_ASSERT("rn != NULL",rn != NULL);
yueee_yt 0:7766f6712673 222
yueee_yt 0:7766f6712673 223 /* -1 = malloc failure, 0 = not inserted, 1 = inserted, 2 = was present */
yueee_yt 0:7766f6712673 224 insert = 0;
yueee_yt 0:7766f6712673 225 if (rn->head == NULL)
yueee_yt 0:7766f6712673 226 {
yueee_yt 0:7766f6712673 227 /* empty list, add first node */
yueee_yt 0:7766f6712673 228 LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc empty list objid==%"S32_F"\n",objid));
yueee_yt 0:7766f6712673 229 nn = snmp_mib_ln_alloc(objid);
yueee_yt 0:7766f6712673 230 if (nn != NULL)
yueee_yt 0:7766f6712673 231 {
yueee_yt 0:7766f6712673 232 rn->head = nn;
yueee_yt 0:7766f6712673 233 rn->tail = nn;
yueee_yt 0:7766f6712673 234 *insn = nn;
yueee_yt 0:7766f6712673 235 insert = 1;
yueee_yt 0:7766f6712673 236 }
yueee_yt 0:7766f6712673 237 else
yueee_yt 0:7766f6712673 238 {
yueee_yt 0:7766f6712673 239 insert = -1;
yueee_yt 0:7766f6712673 240 }
yueee_yt 0:7766f6712673 241 }
yueee_yt 0:7766f6712673 242 else
yueee_yt 0:7766f6712673 243 {
yueee_yt 0:7766f6712673 244 struct mib_list_node *n;
yueee_yt 0:7766f6712673 245 /* at least one node is present */
yueee_yt 0:7766f6712673 246 n = rn->head;
yueee_yt 0:7766f6712673 247 while ((n != NULL) && (insert == 0))
yueee_yt 0:7766f6712673 248 {
yueee_yt 0:7766f6712673 249 if (n->objid == objid)
yueee_yt 0:7766f6712673 250 {
yueee_yt 0:7766f6712673 251 /* node is already there */
yueee_yt 0:7766f6712673 252 LWIP_DEBUGF(SNMP_MIB_DEBUG,("node already there objid==%"S32_F"\n",objid));
yueee_yt 0:7766f6712673 253 *insn = n;
yueee_yt 0:7766f6712673 254 insert = 2;
yueee_yt 0:7766f6712673 255 }
yueee_yt 0:7766f6712673 256 else if (n->objid < objid)
yueee_yt 0:7766f6712673 257 {
yueee_yt 0:7766f6712673 258 if (n->next == NULL)
yueee_yt 0:7766f6712673 259 {
yueee_yt 0:7766f6712673 260 /* alloc and insert at the tail */
yueee_yt 0:7766f6712673 261 LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins tail objid==%"S32_F"\n",objid));
yueee_yt 0:7766f6712673 262 nn = snmp_mib_ln_alloc(objid);
yueee_yt 0:7766f6712673 263 if (nn != NULL)
yueee_yt 0:7766f6712673 264 {
yueee_yt 0:7766f6712673 265 nn->next = NULL;
yueee_yt 0:7766f6712673 266 nn->prev = n;
yueee_yt 0:7766f6712673 267 n->next = nn;
yueee_yt 0:7766f6712673 268 rn->tail = nn;
yueee_yt 0:7766f6712673 269 *insn = nn;
yueee_yt 0:7766f6712673 270 insert = 1;
yueee_yt 0:7766f6712673 271 }
yueee_yt 0:7766f6712673 272 else
yueee_yt 0:7766f6712673 273 {
yueee_yt 0:7766f6712673 274 /* insertion failure */
yueee_yt 0:7766f6712673 275 insert = -1;
yueee_yt 0:7766f6712673 276 }
yueee_yt 0:7766f6712673 277 }
yueee_yt 0:7766f6712673 278 else
yueee_yt 0:7766f6712673 279 {
yueee_yt 0:7766f6712673 280 /* there's more to explore: traverse list */
yueee_yt 0:7766f6712673 281 LWIP_DEBUGF(SNMP_MIB_DEBUG,("traverse list\n"));
yueee_yt 0:7766f6712673 282 n = n->next;
yueee_yt 0:7766f6712673 283 }
yueee_yt 0:7766f6712673 284 }
yueee_yt 0:7766f6712673 285 else
yueee_yt 0:7766f6712673 286 {
yueee_yt 0:7766f6712673 287 /* n->objid > objid */
yueee_yt 0:7766f6712673 288 /* alloc and insert between n->prev and n */
yueee_yt 0:7766f6712673 289 LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins n->prev, objid==%"S32_F", n\n",objid));
yueee_yt 0:7766f6712673 290 nn = snmp_mib_ln_alloc(objid);
yueee_yt 0:7766f6712673 291 if (nn != NULL)
yueee_yt 0:7766f6712673 292 {
yueee_yt 0:7766f6712673 293 if (n->prev == NULL)
yueee_yt 0:7766f6712673 294 {
yueee_yt 0:7766f6712673 295 /* insert at the head */
yueee_yt 0:7766f6712673 296 nn->next = n;
yueee_yt 0:7766f6712673 297 nn->prev = NULL;
yueee_yt 0:7766f6712673 298 rn->head = nn;
yueee_yt 0:7766f6712673 299 n->prev = nn;
yueee_yt 0:7766f6712673 300 }
yueee_yt 0:7766f6712673 301 else
yueee_yt 0:7766f6712673 302 {
yueee_yt 0:7766f6712673 303 /* insert in the middle */
yueee_yt 0:7766f6712673 304 nn->next = n;
yueee_yt 0:7766f6712673 305 nn->prev = n->prev;
yueee_yt 0:7766f6712673 306 n->prev->next = nn;
yueee_yt 0:7766f6712673 307 n->prev = nn;
yueee_yt 0:7766f6712673 308 }
yueee_yt 0:7766f6712673 309 *insn = nn;
yueee_yt 0:7766f6712673 310 insert = 1;
yueee_yt 0:7766f6712673 311 }
yueee_yt 0:7766f6712673 312 else
yueee_yt 0:7766f6712673 313 {
yueee_yt 0:7766f6712673 314 /* insertion failure */
yueee_yt 0:7766f6712673 315 insert = -1;
yueee_yt 0:7766f6712673 316 }
yueee_yt 0:7766f6712673 317 }
yueee_yt 0:7766f6712673 318 }
yueee_yt 0:7766f6712673 319 }
yueee_yt 0:7766f6712673 320 if (insert == 1)
yueee_yt 0:7766f6712673 321 {
yueee_yt 0:7766f6712673 322 rn->count += 1;
yueee_yt 0:7766f6712673 323 }
yueee_yt 0:7766f6712673 324 LWIP_ASSERT("insert != 0",insert != 0);
yueee_yt 0:7766f6712673 325 return insert;
yueee_yt 0:7766f6712673 326 }
yueee_yt 0:7766f6712673 327
yueee_yt 0:7766f6712673 328 /**
yueee_yt 0:7766f6712673 329 * Finds node in idx list and returns deletion mark.
yueee_yt 0:7766f6712673 330 *
yueee_yt 0:7766f6712673 331 * @param rn points to the root node
yueee_yt 0:7766f6712673 332 * @param objid is the object sub identifier
yueee_yt 0:7766f6712673 333 * @param fn returns pointer to found node
yueee_yt 0:7766f6712673 334 * @return 0 if not found, 1 if deletable,
yueee_yt 0:7766f6712673 335 * 2 can't delete (2 or more children), 3 not a list_node
yueee_yt 0:7766f6712673 336 */
yueee_yt 0:7766f6712673 337 s8_t
yueee_yt 0:7766f6712673 338 snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn)
yueee_yt 0:7766f6712673 339 {
yueee_yt 0:7766f6712673 340 s8_t fc;
yueee_yt 0:7766f6712673 341 struct mib_list_node *n;
yueee_yt 0:7766f6712673 342
yueee_yt 0:7766f6712673 343 LWIP_ASSERT("rn != NULL",rn != NULL);
yueee_yt 0:7766f6712673 344 n = rn->head;
yueee_yt 0:7766f6712673 345 while ((n != NULL) && (n->objid != objid))
yueee_yt 0:7766f6712673 346 {
yueee_yt 0:7766f6712673 347 n = n->next;
yueee_yt 0:7766f6712673 348 }
yueee_yt 0:7766f6712673 349 if (n == NULL)
yueee_yt 0:7766f6712673 350 {
yueee_yt 0:7766f6712673 351 fc = 0;
yueee_yt 0:7766f6712673 352 }
yueee_yt 0:7766f6712673 353 else if (n->nptr == NULL)
yueee_yt 0:7766f6712673 354 {
yueee_yt 0:7766f6712673 355 /* leaf, can delete node */
yueee_yt 0:7766f6712673 356 fc = 1;
yueee_yt 0:7766f6712673 357 }
yueee_yt 0:7766f6712673 358 else
yueee_yt 0:7766f6712673 359 {
yueee_yt 0:7766f6712673 360 struct mib_list_rootnode *r;
yueee_yt 0:7766f6712673 361
yueee_yt 0:7766f6712673 362 if (n->nptr->node_type == MIB_NODE_LR)
yueee_yt 0:7766f6712673 363 {
yueee_yt 0:7766f6712673 364 r = (struct mib_list_rootnode *)n->nptr;
yueee_yt 0:7766f6712673 365 if (r->count > 1)
yueee_yt 0:7766f6712673 366 {
yueee_yt 0:7766f6712673 367 /* can't delete node */
yueee_yt 0:7766f6712673 368 fc = 2;
yueee_yt 0:7766f6712673 369 }
yueee_yt 0:7766f6712673 370 else
yueee_yt 0:7766f6712673 371 {
yueee_yt 0:7766f6712673 372 /* count <= 1, can delete node */
yueee_yt 0:7766f6712673 373 fc = 1;
yueee_yt 0:7766f6712673 374 }
yueee_yt 0:7766f6712673 375 }
yueee_yt 0:7766f6712673 376 else
yueee_yt 0:7766f6712673 377 {
yueee_yt 0:7766f6712673 378 /* other node type */
yueee_yt 0:7766f6712673 379 fc = 3;
yueee_yt 0:7766f6712673 380 }
yueee_yt 0:7766f6712673 381 }
yueee_yt 0:7766f6712673 382 *fn = n;
yueee_yt 0:7766f6712673 383 return fc;
yueee_yt 0:7766f6712673 384 }
yueee_yt 0:7766f6712673 385
yueee_yt 0:7766f6712673 386 /**
yueee_yt 0:7766f6712673 387 * Removes node from idx list
yueee_yt 0:7766f6712673 388 * if it has a single child left.
yueee_yt 0:7766f6712673 389 *
yueee_yt 0:7766f6712673 390 * @param rn points to the root node
yueee_yt 0:7766f6712673 391 * @param n points to the node to delete
yueee_yt 0:7766f6712673 392 * @return the nptr to be freed by caller
yueee_yt 0:7766f6712673 393 */
yueee_yt 0:7766f6712673 394 struct mib_list_rootnode *
yueee_yt 0:7766f6712673 395 snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n)
yueee_yt 0:7766f6712673 396 {
yueee_yt 0:7766f6712673 397 struct mib_list_rootnode *next;
yueee_yt 0:7766f6712673 398
yueee_yt 0:7766f6712673 399 LWIP_ASSERT("rn != NULL",rn != NULL);
yueee_yt 0:7766f6712673 400 LWIP_ASSERT("n != NULL",n != NULL);
yueee_yt 0:7766f6712673 401
yueee_yt 0:7766f6712673 402 /* caller must remove this sub-tree */
yueee_yt 0:7766f6712673 403 next = (struct mib_list_rootnode*)(n->nptr);
yueee_yt 0:7766f6712673 404 rn->count -= 1;
yueee_yt 0:7766f6712673 405
yueee_yt 0:7766f6712673 406 if (n == rn->head)
yueee_yt 0:7766f6712673 407 {
yueee_yt 0:7766f6712673 408 rn->head = n->next;
yueee_yt 0:7766f6712673 409 if (n->next != NULL)
yueee_yt 0:7766f6712673 410 {
yueee_yt 0:7766f6712673 411 /* not last node, new list begin */
yueee_yt 0:7766f6712673 412 n->next->prev = NULL;
yueee_yt 0:7766f6712673 413 }
yueee_yt 0:7766f6712673 414 }
yueee_yt 0:7766f6712673 415 else if (n == rn->tail)
yueee_yt 0:7766f6712673 416 {
yueee_yt 0:7766f6712673 417 rn->tail = n->prev;
yueee_yt 0:7766f6712673 418 if (n->prev != NULL)
yueee_yt 0:7766f6712673 419 {
yueee_yt 0:7766f6712673 420 /* not last node, new list end */
yueee_yt 0:7766f6712673 421 n->prev->next = NULL;
yueee_yt 0:7766f6712673 422 }
yueee_yt 0:7766f6712673 423 }
yueee_yt 0:7766f6712673 424 else
yueee_yt 0:7766f6712673 425 {
yueee_yt 0:7766f6712673 426 /* node must be in the middle */
yueee_yt 0:7766f6712673 427 n->prev->next = n->next;
yueee_yt 0:7766f6712673 428 n->next->prev = n->prev;
yueee_yt 0:7766f6712673 429 }
yueee_yt 0:7766f6712673 430 LWIP_DEBUGF(SNMP_MIB_DEBUG,("free list objid==%"S32_F"\n",n->objid));
yueee_yt 0:7766f6712673 431 snmp_mib_ln_free(n);
yueee_yt 0:7766f6712673 432 if (rn->count == 0)
yueee_yt 0:7766f6712673 433 {
yueee_yt 0:7766f6712673 434 rn->head = NULL;
yueee_yt 0:7766f6712673 435 rn->tail = NULL;
yueee_yt 0:7766f6712673 436 }
yueee_yt 0:7766f6712673 437 return next;
yueee_yt 0:7766f6712673 438 }
yueee_yt 0:7766f6712673 439
yueee_yt 0:7766f6712673 440
yueee_yt 0:7766f6712673 441
yueee_yt 0:7766f6712673 442 /**
yueee_yt 0:7766f6712673 443 * Searches tree for the supplied (scalar?) object identifier.
yueee_yt 0:7766f6712673 444 *
yueee_yt 0:7766f6712673 445 * @param node points to the root of the tree ('.internet')
yueee_yt 0:7766f6712673 446 * @param ident_len the length of the supplied object identifier
yueee_yt 0:7766f6712673 447 * @param ident points to the array of sub identifiers
yueee_yt 0:7766f6712673 448 * @param np points to the found object instance (return)
yueee_yt 0:7766f6712673 449 * @return pointer to the requested parent (!) node if success, NULL otherwise
yueee_yt 0:7766f6712673 450 */
yueee_yt 0:7766f6712673 451 struct mib_node *
yueee_yt 0:7766f6712673 452 snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np)
yueee_yt 0:7766f6712673 453 {
yueee_yt 0:7766f6712673 454 u8_t node_type, ext_level;
yueee_yt 0:7766f6712673 455
yueee_yt 0:7766f6712673 456 ext_level = 0;
yueee_yt 0:7766f6712673 457 LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F"\n",(void*)node,*ident));
yueee_yt 0:7766f6712673 458 while (node != NULL)
yueee_yt 0:7766f6712673 459 {
yueee_yt 0:7766f6712673 460 node_type = node->node_type;
yueee_yt 0:7766f6712673 461 if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
yueee_yt 0:7766f6712673 462 {
yueee_yt 0:7766f6712673 463 struct mib_array_node *an;
yueee_yt 0:7766f6712673 464 u16_t i;
yueee_yt 0:7766f6712673 465
yueee_yt 0:7766f6712673 466 if (ident_len > 0)
yueee_yt 0:7766f6712673 467 {
yueee_yt 0:7766f6712673 468 /* array node (internal ROM or RAM, fixed length) */
yueee_yt 0:7766f6712673 469 an = (struct mib_array_node *)node;
yueee_yt 0:7766f6712673 470 i = 0;
yueee_yt 0:7766f6712673 471 while ((i < an->maxlength) && (an->objid[i] != *ident))
yueee_yt 0:7766f6712673 472 {
yueee_yt 0:7766f6712673 473 i++;
yueee_yt 0:7766f6712673 474 }
yueee_yt 0:7766f6712673 475 if (i < an->maxlength)
yueee_yt 0:7766f6712673 476 {
yueee_yt 0:7766f6712673 477 /* found it, if available proceed to child, otherwise inspect leaf */
yueee_yt 0:7766f6712673 478 LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
yueee_yt 0:7766f6712673 479 if (an->nptr[i] == NULL)
yueee_yt 0:7766f6712673 480 {
yueee_yt 0:7766f6712673 481 /* a scalar leaf OR table,
yueee_yt 0:7766f6712673 482 inspect remaining instance number / table index */
yueee_yt 0:7766f6712673 483 np->ident_len = ident_len;
yueee_yt 0:7766f6712673 484 np->ident = ident;
yueee_yt 0:7766f6712673 485 return (struct mib_node*)an;
yueee_yt 0:7766f6712673 486 }
yueee_yt 0:7766f6712673 487 else
yueee_yt 0:7766f6712673 488 {
yueee_yt 0:7766f6712673 489 /* follow next child pointer */
yueee_yt 0:7766f6712673 490 ident++;
yueee_yt 0:7766f6712673 491 ident_len--;
yueee_yt 0:7766f6712673 492 node = an->nptr[i];
yueee_yt 0:7766f6712673 493 }
yueee_yt 0:7766f6712673 494 }
yueee_yt 0:7766f6712673 495 else
yueee_yt 0:7766f6712673 496 {
yueee_yt 0:7766f6712673 497 /* search failed, identifier mismatch (nosuchname) */
yueee_yt 0:7766f6712673 498 LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed *ident==%"S32_F"\n",*ident));
yueee_yt 0:7766f6712673 499 return NULL;
yueee_yt 0:7766f6712673 500 }
yueee_yt 0:7766f6712673 501 }
yueee_yt 0:7766f6712673 502 else
yueee_yt 0:7766f6712673 503 {
yueee_yt 0:7766f6712673 504 /* search failed, short object identifier (nosuchname) */
yueee_yt 0:7766f6712673 505 LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed, short object identifier\n"));
yueee_yt 0:7766f6712673 506 return NULL;
yueee_yt 0:7766f6712673 507 }
yueee_yt 0:7766f6712673 508 }
yueee_yt 0:7766f6712673 509 else if(node_type == MIB_NODE_LR)
yueee_yt 0:7766f6712673 510 {
yueee_yt 0:7766f6712673 511 struct mib_list_rootnode *lrn;
yueee_yt 0:7766f6712673 512 struct mib_list_node *ln;
yueee_yt 0:7766f6712673 513
yueee_yt 0:7766f6712673 514 if (ident_len > 0)
yueee_yt 0:7766f6712673 515 {
yueee_yt 0:7766f6712673 516 /* list root node (internal 'RAM', variable length) */
yueee_yt 0:7766f6712673 517 lrn = (struct mib_list_rootnode *)node;
yueee_yt 0:7766f6712673 518 ln = lrn->head;
yueee_yt 0:7766f6712673 519 /* iterate over list, head to tail */
yueee_yt 0:7766f6712673 520 while ((ln != NULL) && (ln->objid != *ident))
yueee_yt 0:7766f6712673 521 {
yueee_yt 0:7766f6712673 522 ln = ln->next;
yueee_yt 0:7766f6712673 523 }
yueee_yt 0:7766f6712673 524 if (ln != NULL)
yueee_yt 0:7766f6712673 525 {
yueee_yt 0:7766f6712673 526 /* found it, proceed to child */;
yueee_yt 0:7766f6712673 527 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
yueee_yt 0:7766f6712673 528 if (ln->nptr == NULL)
yueee_yt 0:7766f6712673 529 {
yueee_yt 0:7766f6712673 530 np->ident_len = ident_len;
yueee_yt 0:7766f6712673 531 np->ident = ident;
yueee_yt 0:7766f6712673 532 return (struct mib_node*)lrn;
yueee_yt 0:7766f6712673 533 }
yueee_yt 0:7766f6712673 534 else
yueee_yt 0:7766f6712673 535 {
yueee_yt 0:7766f6712673 536 /* follow next child pointer */
yueee_yt 0:7766f6712673 537 ident_len--;
yueee_yt 0:7766f6712673 538 ident++;
yueee_yt 0:7766f6712673 539 node = ln->nptr;
yueee_yt 0:7766f6712673 540 }
yueee_yt 0:7766f6712673 541 }
yueee_yt 0:7766f6712673 542 else
yueee_yt 0:7766f6712673 543 {
yueee_yt 0:7766f6712673 544 /* search failed */
yueee_yt 0:7766f6712673 545 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln search failed *ident==%"S32_F"\n",*ident));
yueee_yt 0:7766f6712673 546 return NULL;
yueee_yt 0:7766f6712673 547 }
yueee_yt 0:7766f6712673 548 }
yueee_yt 0:7766f6712673 549 else
yueee_yt 0:7766f6712673 550 {
yueee_yt 0:7766f6712673 551 /* search failed, short object identifier (nosuchname) */
yueee_yt 0:7766f6712673 552 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln search failed, short object identifier\n"));
yueee_yt 0:7766f6712673 553 return NULL;
yueee_yt 0:7766f6712673 554 }
yueee_yt 0:7766f6712673 555 }
yueee_yt 0:7766f6712673 556 else if(node_type == MIB_NODE_EX)
yueee_yt 0:7766f6712673 557 {
yueee_yt 0:7766f6712673 558 struct mib_external_node *en;
yueee_yt 0:7766f6712673 559 u16_t i, len;
yueee_yt 0:7766f6712673 560
yueee_yt 0:7766f6712673 561 if (ident_len > 0)
yueee_yt 0:7766f6712673 562 {
yueee_yt 0:7766f6712673 563 /* external node (addressing and access via functions) */
yueee_yt 0:7766f6712673 564 en = (struct mib_external_node *)node;
yueee_yt 0:7766f6712673 565
yueee_yt 0:7766f6712673 566 i = 0;
yueee_yt 0:7766f6712673 567 len = en->level_length(en->addr_inf,ext_level);
yueee_yt 0:7766f6712673 568 while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) != 0))
yueee_yt 0:7766f6712673 569 {
yueee_yt 0:7766f6712673 570 i++;
yueee_yt 0:7766f6712673 571 }
yueee_yt 0:7766f6712673 572 if (i < len)
yueee_yt 0:7766f6712673 573 {
yueee_yt 0:7766f6712673 574 s32_t debug_id;
yueee_yt 0:7766f6712673 575
yueee_yt 0:7766f6712673 576 en->get_objid(en->addr_inf,ext_level,i,&debug_id);
yueee_yt 0:7766f6712673 577 LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid==%"S32_F" *ident==%"S32_F"\n",debug_id,*ident));
yueee_yt 0:7766f6712673 578 if ((ext_level + 1) == en->tree_levels)
yueee_yt 0:7766f6712673 579 {
yueee_yt 0:7766f6712673 580 np->ident_len = ident_len;
yueee_yt 0:7766f6712673 581 np->ident = ident;
yueee_yt 0:7766f6712673 582 return (struct mib_node*)en;
yueee_yt 0:7766f6712673 583 }
yueee_yt 0:7766f6712673 584 else
yueee_yt 0:7766f6712673 585 {
yueee_yt 0:7766f6712673 586 /* found it, proceed to child */
yueee_yt 0:7766f6712673 587 ident_len--;
yueee_yt 0:7766f6712673 588 ident++;
yueee_yt 0:7766f6712673 589 ext_level++;
yueee_yt 0:7766f6712673 590 }
yueee_yt 0:7766f6712673 591 }
yueee_yt 0:7766f6712673 592 else
yueee_yt 0:7766f6712673 593 {
yueee_yt 0:7766f6712673 594 /* search failed */
yueee_yt 0:7766f6712673 595 LWIP_DEBUGF(SNMP_MIB_DEBUG,("en search failed *ident==%"S32_F"\n",*ident));
yueee_yt 0:7766f6712673 596 return NULL;
yueee_yt 0:7766f6712673 597 }
yueee_yt 0:7766f6712673 598 }
yueee_yt 0:7766f6712673 599 else
yueee_yt 0:7766f6712673 600 {
yueee_yt 0:7766f6712673 601 /* search failed, short object identifier (nosuchname) */
yueee_yt 0:7766f6712673 602 LWIP_DEBUGF(SNMP_MIB_DEBUG,("en search failed, short object identifier\n"));
yueee_yt 0:7766f6712673 603 return NULL;
yueee_yt 0:7766f6712673 604 }
yueee_yt 0:7766f6712673 605 }
yueee_yt 0:7766f6712673 606 else if (node_type == MIB_NODE_SC)
yueee_yt 0:7766f6712673 607 {
yueee_yt 0:7766f6712673 608 mib_scalar_node *sn;
yueee_yt 0:7766f6712673 609
yueee_yt 0:7766f6712673 610 sn = (mib_scalar_node *)node;
yueee_yt 0:7766f6712673 611 if ((ident_len == 1) && (*ident == 0))
yueee_yt 0:7766f6712673 612 {
yueee_yt 0:7766f6712673 613 np->ident_len = ident_len;
yueee_yt 0:7766f6712673 614 np->ident = ident;
yueee_yt 0:7766f6712673 615 return (struct mib_node*)sn;
yueee_yt 0:7766f6712673 616 }
yueee_yt 0:7766f6712673 617 else
yueee_yt 0:7766f6712673 618 {
yueee_yt 0:7766f6712673 619 /* search failed, short object identifier (nosuchname) */
yueee_yt 0:7766f6712673 620 LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, invalid object identifier length\n"));
yueee_yt 0:7766f6712673 621 return NULL;
yueee_yt 0:7766f6712673 622 }
yueee_yt 0:7766f6712673 623 }
yueee_yt 0:7766f6712673 624 else
yueee_yt 0:7766f6712673 625 {
yueee_yt 0:7766f6712673 626 /* unknown node_type */
yueee_yt 0:7766f6712673 627 LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node_type %"U16_F" unkown\n",(u16_t)node_type));
yueee_yt 0:7766f6712673 628 return NULL;
yueee_yt 0:7766f6712673 629 }
yueee_yt 0:7766f6712673 630 }
yueee_yt 0:7766f6712673 631 /* done, found nothing */
yueee_yt 0:7766f6712673 632 LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node==%p\n",(void*)node));
yueee_yt 0:7766f6712673 633 return NULL;
yueee_yt 0:7766f6712673 634 }
yueee_yt 0:7766f6712673 635
yueee_yt 0:7766f6712673 636 /**
yueee_yt 0:7766f6712673 637 * Test table for presence of at least one table entry.
yueee_yt 0:7766f6712673 638 */
yueee_yt 0:7766f6712673 639 static u8_t
yueee_yt 0:7766f6712673 640 empty_table(struct mib_node *node)
yueee_yt 0:7766f6712673 641 {
yueee_yt 0:7766f6712673 642 u8_t node_type;
yueee_yt 0:7766f6712673 643 u8_t empty = 0;
yueee_yt 0:7766f6712673 644
yueee_yt 0:7766f6712673 645 if (node != NULL)
yueee_yt 0:7766f6712673 646 {
yueee_yt 0:7766f6712673 647 node_type = node->node_type;
yueee_yt 0:7766f6712673 648 if (node_type == MIB_NODE_LR)
yueee_yt 0:7766f6712673 649 {
yueee_yt 0:7766f6712673 650 struct mib_list_rootnode *lrn;
yueee_yt 0:7766f6712673 651 lrn = (struct mib_list_rootnode *)node;
yueee_yt 0:7766f6712673 652 if ((lrn->count == 0) || (lrn->head == NULL))
yueee_yt 0:7766f6712673 653 {
yueee_yt 0:7766f6712673 654 empty = 1;
yueee_yt 0:7766f6712673 655 }
yueee_yt 0:7766f6712673 656 }
yueee_yt 0:7766f6712673 657 else if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
yueee_yt 0:7766f6712673 658 {
yueee_yt 0:7766f6712673 659 struct mib_array_node *an;
yueee_yt 0:7766f6712673 660 an = (struct mib_array_node *)node;
yueee_yt 0:7766f6712673 661 if ((an->maxlength == 0) || (an->nptr == NULL))
yueee_yt 0:7766f6712673 662 {
yueee_yt 0:7766f6712673 663 empty = 1;
yueee_yt 0:7766f6712673 664 }
yueee_yt 0:7766f6712673 665 }
yueee_yt 0:7766f6712673 666 else if (node_type == MIB_NODE_EX)
yueee_yt 0:7766f6712673 667 {
yueee_yt 0:7766f6712673 668 struct mib_external_node *en;
yueee_yt 0:7766f6712673 669 en = (struct mib_external_node *)node;
yueee_yt 0:7766f6712673 670 if (en->tree_levels == 0)
yueee_yt 0:7766f6712673 671 {
yueee_yt 0:7766f6712673 672 empty = 1;
yueee_yt 0:7766f6712673 673 }
yueee_yt 0:7766f6712673 674 }
yueee_yt 0:7766f6712673 675 }
yueee_yt 0:7766f6712673 676 return empty;
yueee_yt 0:7766f6712673 677 }
yueee_yt 0:7766f6712673 678
yueee_yt 0:7766f6712673 679 /**
yueee_yt 0:7766f6712673 680 * Tree expansion.
yueee_yt 0:7766f6712673 681 */
yueee_yt 0:7766f6712673 682 struct mib_node *
yueee_yt 0:7766f6712673 683 snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
yueee_yt 0:7766f6712673 684 {
yueee_yt 0:7766f6712673 685 u8_t node_type, ext_level, climb_tree;
yueee_yt 0:7766f6712673 686
yueee_yt 0:7766f6712673 687 ext_level = 0;
yueee_yt 0:7766f6712673 688 /* reset node stack */
yueee_yt 0:7766f6712673 689 node_stack_cnt = 0;
yueee_yt 0:7766f6712673 690 while (node != NULL)
yueee_yt 0:7766f6712673 691 {
yueee_yt 0:7766f6712673 692 climb_tree = 0;
yueee_yt 0:7766f6712673 693 node_type = node->node_type;
yueee_yt 0:7766f6712673 694 if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
yueee_yt 0:7766f6712673 695 {
yueee_yt 0:7766f6712673 696 struct mib_array_node *an;
yueee_yt 0:7766f6712673 697 u16_t i;
yueee_yt 0:7766f6712673 698
yueee_yt 0:7766f6712673 699 /* array node (internal ROM or RAM, fixed length) */
yueee_yt 0:7766f6712673 700 an = (struct mib_array_node *)node;
yueee_yt 0:7766f6712673 701 if (ident_len > 0)
yueee_yt 0:7766f6712673 702 {
yueee_yt 0:7766f6712673 703 i = 0;
yueee_yt 0:7766f6712673 704 while ((i < an->maxlength) && (an->objid[i] < *ident))
yueee_yt 0:7766f6712673 705 {
yueee_yt 0:7766f6712673 706 i++;
yueee_yt 0:7766f6712673 707 }
yueee_yt 0:7766f6712673 708 if (i < an->maxlength)
yueee_yt 0:7766f6712673 709 {
yueee_yt 0:7766f6712673 710 LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
yueee_yt 0:7766f6712673 711 /* add identifier to oidret */
yueee_yt 0:7766f6712673 712 oidret->id[oidret->len] = an->objid[i];
yueee_yt 0:7766f6712673 713 (oidret->len)++;
yueee_yt 0:7766f6712673 714
yueee_yt 0:7766f6712673 715 if (an->nptr[i] == NULL)
yueee_yt 0:7766f6712673 716 {
yueee_yt 0:7766f6712673 717 LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));
yueee_yt 0:7766f6712673 718 /* leaf node (e.g. in a fixed size table) */
yueee_yt 0:7766f6712673 719 if (an->objid[i] > *ident)
yueee_yt 0:7766f6712673 720 {
yueee_yt 0:7766f6712673 721 return (struct mib_node*)an;
yueee_yt 0:7766f6712673 722 }
yueee_yt 0:7766f6712673 723 else if ((i + 1) < an->maxlength)
yueee_yt 0:7766f6712673 724 {
yueee_yt 0:7766f6712673 725 /* an->objid[i] == *ident */
yueee_yt 0:7766f6712673 726 (oidret->len)--;
yueee_yt 0:7766f6712673 727 oidret->id[oidret->len] = an->objid[i + 1];
yueee_yt 0:7766f6712673 728 (oidret->len)++;
yueee_yt 0:7766f6712673 729 return (struct mib_node*)an;
yueee_yt 0:7766f6712673 730 }
yueee_yt 0:7766f6712673 731 else
yueee_yt 0:7766f6712673 732 {
yueee_yt 0:7766f6712673 733 /* (i + 1) == an->maxlength */
yueee_yt 0:7766f6712673 734 (oidret->len)--;
yueee_yt 0:7766f6712673 735 climb_tree = 1;
yueee_yt 0:7766f6712673 736 }
yueee_yt 0:7766f6712673 737 }
yueee_yt 0:7766f6712673 738 else
yueee_yt 0:7766f6712673 739 {
yueee_yt 0:7766f6712673 740 u8_t j;
yueee_yt 0:7766f6712673 741 struct nse cur_node;
yueee_yt 0:7766f6712673 742
yueee_yt 0:7766f6712673 743 LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
yueee_yt 0:7766f6712673 744 /* non-leaf, store right child ptr and id */
yueee_yt 0:7766f6712673 745 LWIP_ASSERT("i < 0xff", i < 0xff);
yueee_yt 0:7766f6712673 746 j = (u8_t)i + 1;
yueee_yt 0:7766f6712673 747 while ((j < an->maxlength) && (empty_table(an->nptr[j])))
yueee_yt 0:7766f6712673 748 {
yueee_yt 0:7766f6712673 749 j++;
yueee_yt 0:7766f6712673 750 }
yueee_yt 0:7766f6712673 751 if (j < an->maxlength)
yueee_yt 0:7766f6712673 752 {
yueee_yt 0:7766f6712673 753 cur_node.r_ptr = an->nptr[j];
yueee_yt 0:7766f6712673 754 cur_node.r_id = an->objid[j];
yueee_yt 0:7766f6712673 755 cur_node.r_nl = 0;
yueee_yt 0:7766f6712673 756 }
yueee_yt 0:7766f6712673 757 else
yueee_yt 0:7766f6712673 758 {
yueee_yt 0:7766f6712673 759 cur_node.r_ptr = NULL;
yueee_yt 0:7766f6712673 760 }
yueee_yt 0:7766f6712673 761 push_node(&cur_node);
yueee_yt 0:7766f6712673 762 if (an->objid[i] == *ident)
yueee_yt 0:7766f6712673 763 {
yueee_yt 0:7766f6712673 764 ident_len--;
yueee_yt 0:7766f6712673 765 ident++;
yueee_yt 0:7766f6712673 766 }
yueee_yt 0:7766f6712673 767 else
yueee_yt 0:7766f6712673 768 {
yueee_yt 0:7766f6712673 769 /* an->objid[i] < *ident */
yueee_yt 0:7766f6712673 770 ident_len = 0;
yueee_yt 0:7766f6712673 771 }
yueee_yt 0:7766f6712673 772 /* follow next child pointer */
yueee_yt 0:7766f6712673 773 node = an->nptr[i];
yueee_yt 0:7766f6712673 774 }
yueee_yt 0:7766f6712673 775 }
yueee_yt 0:7766f6712673 776 else
yueee_yt 0:7766f6712673 777 {
yueee_yt 0:7766f6712673 778 /* i == an->maxlength */
yueee_yt 0:7766f6712673 779 climb_tree = 1;
yueee_yt 0:7766f6712673 780 }
yueee_yt 0:7766f6712673 781 }
yueee_yt 0:7766f6712673 782 else
yueee_yt 0:7766f6712673 783 {
yueee_yt 0:7766f6712673 784 u8_t j;
yueee_yt 0:7766f6712673 785 /* ident_len == 0, complete with leftmost '.thing' */
yueee_yt 0:7766f6712673 786 j = 0;
yueee_yt 0:7766f6712673 787 while ((j < an->maxlength) && empty_table(an->nptr[j]))
yueee_yt 0:7766f6712673 788 {
yueee_yt 0:7766f6712673 789 j++;
yueee_yt 0:7766f6712673 790 }
yueee_yt 0:7766f6712673 791 if (j < an->maxlength)
yueee_yt 0:7766f6712673 792 {
yueee_yt 0:7766f6712673 793 LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->objid[j]==%"S32_F"\n",an->objid[j]));
yueee_yt 0:7766f6712673 794 oidret->id[oidret->len] = an->objid[j];
yueee_yt 0:7766f6712673 795 (oidret->len)++;
yueee_yt 0:7766f6712673 796 if (an->nptr[j] == NULL)
yueee_yt 0:7766f6712673 797 {
yueee_yt 0:7766f6712673 798 /* leaf node */
yueee_yt 0:7766f6712673 799 return (struct mib_node*)an;
yueee_yt 0:7766f6712673 800 }
yueee_yt 0:7766f6712673 801 else
yueee_yt 0:7766f6712673 802 {
yueee_yt 0:7766f6712673 803 /* no leaf, continue */
yueee_yt 0:7766f6712673 804 node = an->nptr[j];
yueee_yt 0:7766f6712673 805 }
yueee_yt 0:7766f6712673 806 }
yueee_yt 0:7766f6712673 807 else
yueee_yt 0:7766f6712673 808 {
yueee_yt 0:7766f6712673 809 /* j == an->maxlength */
yueee_yt 0:7766f6712673 810 climb_tree = 1;
yueee_yt 0:7766f6712673 811 }
yueee_yt 0:7766f6712673 812 }
yueee_yt 0:7766f6712673 813 }
yueee_yt 0:7766f6712673 814 else if(node_type == MIB_NODE_LR)
yueee_yt 0:7766f6712673 815 {
yueee_yt 0:7766f6712673 816 struct mib_list_rootnode *lrn;
yueee_yt 0:7766f6712673 817 struct mib_list_node *ln;
yueee_yt 0:7766f6712673 818
yueee_yt 0:7766f6712673 819 /* list root node (internal 'RAM', variable length) */
yueee_yt 0:7766f6712673 820 lrn = (struct mib_list_rootnode *)node;
yueee_yt 0:7766f6712673 821 if (ident_len > 0)
yueee_yt 0:7766f6712673 822 {
yueee_yt 0:7766f6712673 823 ln = lrn->head;
yueee_yt 0:7766f6712673 824 /* iterate over list, head to tail */
yueee_yt 0:7766f6712673 825 while ((ln != NULL) && (ln->objid < *ident))
yueee_yt 0:7766f6712673 826 {
yueee_yt 0:7766f6712673 827 ln = ln->next;
yueee_yt 0:7766f6712673 828 }
yueee_yt 0:7766f6712673 829 if (ln != NULL)
yueee_yt 0:7766f6712673 830 {
yueee_yt 0:7766f6712673 831 LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
yueee_yt 0:7766f6712673 832 oidret->id[oidret->len] = ln->objid;
yueee_yt 0:7766f6712673 833 (oidret->len)++;
yueee_yt 0:7766f6712673 834 if (ln->nptr == NULL)
yueee_yt 0:7766f6712673 835 {
yueee_yt 0:7766f6712673 836 /* leaf node */
yueee_yt 0:7766f6712673 837 if (ln->objid > *ident)
yueee_yt 0:7766f6712673 838 {
yueee_yt 0:7766f6712673 839 return (struct mib_node*)lrn;
yueee_yt 0:7766f6712673 840 }
yueee_yt 0:7766f6712673 841 else if (ln->next != NULL)
yueee_yt 0:7766f6712673 842 {
yueee_yt 0:7766f6712673 843 /* ln->objid == *ident */
yueee_yt 0:7766f6712673 844 (oidret->len)--;
yueee_yt 0:7766f6712673 845 oidret->id[oidret->len] = ln->next->objid;
yueee_yt 0:7766f6712673 846 (oidret->len)++;
yueee_yt 0:7766f6712673 847 return (struct mib_node*)lrn;
yueee_yt 0:7766f6712673 848 }
yueee_yt 0:7766f6712673 849 else
yueee_yt 0:7766f6712673 850 {
yueee_yt 0:7766f6712673 851 /* ln->next == NULL */
yueee_yt 0:7766f6712673 852 (oidret->len)--;
yueee_yt 0:7766f6712673 853 climb_tree = 1;
yueee_yt 0:7766f6712673 854 }
yueee_yt 0:7766f6712673 855 }
yueee_yt 0:7766f6712673 856 else
yueee_yt 0:7766f6712673 857 {
yueee_yt 0:7766f6712673 858 struct mib_list_node *jn;
yueee_yt 0:7766f6712673 859 struct nse cur_node;
yueee_yt 0:7766f6712673 860
yueee_yt 0:7766f6712673 861 /* non-leaf, store right child ptr and id */
yueee_yt 0:7766f6712673 862 jn = ln->next;
yueee_yt 0:7766f6712673 863 while ((jn != NULL) && empty_table(jn->nptr))
yueee_yt 0:7766f6712673 864 {
yueee_yt 0:7766f6712673 865 jn = jn->next;
yueee_yt 0:7766f6712673 866 }
yueee_yt 0:7766f6712673 867 if (jn != NULL)
yueee_yt 0:7766f6712673 868 {
yueee_yt 0:7766f6712673 869 cur_node.r_ptr = jn->nptr;
yueee_yt 0:7766f6712673 870 cur_node.r_id = jn->objid;
yueee_yt 0:7766f6712673 871 cur_node.r_nl = 0;
yueee_yt 0:7766f6712673 872 }
yueee_yt 0:7766f6712673 873 else
yueee_yt 0:7766f6712673 874 {
yueee_yt 0:7766f6712673 875 cur_node.r_ptr = NULL;
yueee_yt 0:7766f6712673 876 }
yueee_yt 0:7766f6712673 877 push_node(&cur_node);
yueee_yt 0:7766f6712673 878 if (ln->objid == *ident)
yueee_yt 0:7766f6712673 879 {
yueee_yt 0:7766f6712673 880 ident_len--;
yueee_yt 0:7766f6712673 881 ident++;
yueee_yt 0:7766f6712673 882 }
yueee_yt 0:7766f6712673 883 else
yueee_yt 0:7766f6712673 884 {
yueee_yt 0:7766f6712673 885 /* ln->objid < *ident */
yueee_yt 0:7766f6712673 886 ident_len = 0;
yueee_yt 0:7766f6712673 887 }
yueee_yt 0:7766f6712673 888 /* follow next child pointer */
yueee_yt 0:7766f6712673 889 node = ln->nptr;
yueee_yt 0:7766f6712673 890 }
yueee_yt 0:7766f6712673 891
yueee_yt 0:7766f6712673 892 }
yueee_yt 0:7766f6712673 893 else
yueee_yt 0:7766f6712673 894 {
yueee_yt 0:7766f6712673 895 /* ln == NULL */
yueee_yt 0:7766f6712673 896 climb_tree = 1;
yueee_yt 0:7766f6712673 897 }
yueee_yt 0:7766f6712673 898 }
yueee_yt 0:7766f6712673 899 else
yueee_yt 0:7766f6712673 900 {
yueee_yt 0:7766f6712673 901 struct mib_list_node *jn;
yueee_yt 0:7766f6712673 902 /* ident_len == 0, complete with leftmost '.thing' */
yueee_yt 0:7766f6712673 903 jn = lrn->head;
yueee_yt 0:7766f6712673 904 while ((jn != NULL) && empty_table(jn->nptr))
yueee_yt 0:7766f6712673 905 {
yueee_yt 0:7766f6712673 906 jn = jn->next;
yueee_yt 0:7766f6712673 907 }
yueee_yt 0:7766f6712673 908 if (jn != NULL)
yueee_yt 0:7766f6712673 909 {
yueee_yt 0:7766f6712673 910 LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));
yueee_yt 0:7766f6712673 911 oidret->id[oidret->len] = jn->objid;
yueee_yt 0:7766f6712673 912 (oidret->len)++;
yueee_yt 0:7766f6712673 913 if (jn->nptr == NULL)
yueee_yt 0:7766f6712673 914 {
yueee_yt 0:7766f6712673 915 /* leaf node */
yueee_yt 0:7766f6712673 916 LWIP_DEBUGF(SNMP_MIB_DEBUG,("jn->nptr == NULL\n"));
yueee_yt 0:7766f6712673 917 return (struct mib_node*)lrn;
yueee_yt 0:7766f6712673 918 }
yueee_yt 0:7766f6712673 919 else
yueee_yt 0:7766f6712673 920 {
yueee_yt 0:7766f6712673 921 /* no leaf, continue */
yueee_yt 0:7766f6712673 922 node = jn->nptr;
yueee_yt 0:7766f6712673 923 }
yueee_yt 0:7766f6712673 924 }
yueee_yt 0:7766f6712673 925 else
yueee_yt 0:7766f6712673 926 {
yueee_yt 0:7766f6712673 927 /* jn == NULL */
yueee_yt 0:7766f6712673 928 climb_tree = 1;
yueee_yt 0:7766f6712673 929 }
yueee_yt 0:7766f6712673 930 }
yueee_yt 0:7766f6712673 931 }
yueee_yt 0:7766f6712673 932 else if(node_type == MIB_NODE_EX)
yueee_yt 0:7766f6712673 933 {
yueee_yt 0:7766f6712673 934 struct mib_external_node *en;
yueee_yt 0:7766f6712673 935 s32_t ex_id;
yueee_yt 0:7766f6712673 936
yueee_yt 0:7766f6712673 937 /* external node (addressing and access via functions) */
yueee_yt 0:7766f6712673 938 en = (struct mib_external_node *)node;
yueee_yt 0:7766f6712673 939 if (ident_len > 0)
yueee_yt 0:7766f6712673 940 {
yueee_yt 0:7766f6712673 941 u16_t i, len;
yueee_yt 0:7766f6712673 942
yueee_yt 0:7766f6712673 943 i = 0;
yueee_yt 0:7766f6712673 944 len = en->level_length(en->addr_inf,ext_level);
yueee_yt 0:7766f6712673 945 while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) < 0))
yueee_yt 0:7766f6712673 946 {
yueee_yt 0:7766f6712673 947 i++;
yueee_yt 0:7766f6712673 948 }
yueee_yt 0:7766f6712673 949 if (i < len)
yueee_yt 0:7766f6712673 950 {
yueee_yt 0:7766f6712673 951 /* add identifier to oidret */
yueee_yt 0:7766f6712673 952 en->get_objid(en->addr_inf,ext_level,i,&ex_id);
yueee_yt 0:7766f6712673 953 LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,ex_id,*ident));
yueee_yt 0:7766f6712673 954 oidret->id[oidret->len] = ex_id;
yueee_yt 0:7766f6712673 955 (oidret->len)++;
yueee_yt 0:7766f6712673 956
yueee_yt 0:7766f6712673 957 if ((ext_level + 1) == en->tree_levels)
yueee_yt 0:7766f6712673 958 {
yueee_yt 0:7766f6712673 959 LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));
yueee_yt 0:7766f6712673 960 /* leaf node */
yueee_yt 0:7766f6712673 961 if (ex_id > *ident)
yueee_yt 0:7766f6712673 962 {
yueee_yt 0:7766f6712673 963 return (struct mib_node*)en;
yueee_yt 0:7766f6712673 964 }
yueee_yt 0:7766f6712673 965 else if ((i + 1) < len)
yueee_yt 0:7766f6712673 966 {
yueee_yt 0:7766f6712673 967 /* ex_id == *ident */
yueee_yt 0:7766f6712673 968 en->get_objid(en->addr_inf,ext_level,i + 1,&ex_id);
yueee_yt 0:7766f6712673 969 (oidret->len)--;
yueee_yt 0:7766f6712673 970 oidret->id[oidret->len] = ex_id;
yueee_yt 0:7766f6712673 971 (oidret->len)++;
yueee_yt 0:7766f6712673 972 return (struct mib_node*)en;
yueee_yt 0:7766f6712673 973 }
yueee_yt 0:7766f6712673 974 else
yueee_yt 0:7766f6712673 975 {
yueee_yt 0:7766f6712673 976 /* (i + 1) == len */
yueee_yt 0:7766f6712673 977 (oidret->len)--;
yueee_yt 0:7766f6712673 978 climb_tree = 1;
yueee_yt 0:7766f6712673 979 }
yueee_yt 0:7766f6712673 980 }
yueee_yt 0:7766f6712673 981 else
yueee_yt 0:7766f6712673 982 {
yueee_yt 0:7766f6712673 983 u8_t j;
yueee_yt 0:7766f6712673 984 struct nse cur_node;
yueee_yt 0:7766f6712673 985
yueee_yt 0:7766f6712673 986 LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
yueee_yt 0:7766f6712673 987 /* non-leaf, store right child ptr and id */
yueee_yt 0:7766f6712673 988 LWIP_ASSERT("i < 0xff", i < 0xff);
yueee_yt 0:7766f6712673 989 j = (u8_t)i + 1;
yueee_yt 0:7766f6712673 990 if (j < len)
yueee_yt 0:7766f6712673 991 {
yueee_yt 0:7766f6712673 992 /* right node is the current external node */
yueee_yt 0:7766f6712673 993 cur_node.r_ptr = node;
yueee_yt 0:7766f6712673 994 en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);
yueee_yt 0:7766f6712673 995 cur_node.r_nl = ext_level + 1;
yueee_yt 0:7766f6712673 996 }
yueee_yt 0:7766f6712673 997 else
yueee_yt 0:7766f6712673 998 {
yueee_yt 0:7766f6712673 999 cur_node.r_ptr = NULL;
yueee_yt 0:7766f6712673 1000 }
yueee_yt 0:7766f6712673 1001 push_node(&cur_node);
yueee_yt 0:7766f6712673 1002 if (en->ident_cmp(en->addr_inf,ext_level,i,*ident) == 0)
yueee_yt 0:7766f6712673 1003 {
yueee_yt 0:7766f6712673 1004 ident_len--;
yueee_yt 0:7766f6712673 1005 ident++;
yueee_yt 0:7766f6712673 1006 }
yueee_yt 0:7766f6712673 1007 else
yueee_yt 0:7766f6712673 1008 {
yueee_yt 0:7766f6712673 1009 /* external id < *ident */
yueee_yt 0:7766f6712673 1010 ident_len = 0;
yueee_yt 0:7766f6712673 1011 }
yueee_yt 0:7766f6712673 1012 /* proceed to child */
yueee_yt 0:7766f6712673 1013 ext_level++;
yueee_yt 0:7766f6712673 1014 }
yueee_yt 0:7766f6712673 1015 }
yueee_yt 0:7766f6712673 1016 else
yueee_yt 0:7766f6712673 1017 {
yueee_yt 0:7766f6712673 1018 /* i == len (en->level_len()) */
yueee_yt 0:7766f6712673 1019 climb_tree = 1;
yueee_yt 0:7766f6712673 1020 }
yueee_yt 0:7766f6712673 1021 }
yueee_yt 0:7766f6712673 1022 else
yueee_yt 0:7766f6712673 1023 {
yueee_yt 0:7766f6712673 1024 /* ident_len == 0, complete with leftmost '.thing' */
yueee_yt 0:7766f6712673 1025 en->get_objid(en->addr_inf,ext_level,0,&ex_id);
yueee_yt 0:7766f6712673 1026 LWIP_DEBUGF(SNMP_MIB_DEBUG,("left en->objid==%"S32_F"\n",ex_id));
yueee_yt 0:7766f6712673 1027 oidret->id[oidret->len] = ex_id;
yueee_yt 0:7766f6712673 1028 (oidret->len)++;
yueee_yt 0:7766f6712673 1029 if ((ext_level + 1) == en->tree_levels)
yueee_yt 0:7766f6712673 1030 {
yueee_yt 0:7766f6712673 1031 /* leaf node */
yueee_yt 0:7766f6712673 1032 LWIP_DEBUGF(SNMP_MIB_DEBUG,("(ext_level + 1) == en->tree_levels\n"));
yueee_yt 0:7766f6712673 1033 return (struct mib_node*)en;
yueee_yt 0:7766f6712673 1034 }
yueee_yt 0:7766f6712673 1035 else
yueee_yt 0:7766f6712673 1036 {
yueee_yt 0:7766f6712673 1037 /* no leaf, proceed to child */
yueee_yt 0:7766f6712673 1038 ext_level++;
yueee_yt 0:7766f6712673 1039 }
yueee_yt 0:7766f6712673 1040 }
yueee_yt 0:7766f6712673 1041 }
yueee_yt 0:7766f6712673 1042 else if(node_type == MIB_NODE_SC)
yueee_yt 0:7766f6712673 1043 {
yueee_yt 0:7766f6712673 1044 mib_scalar_node *sn;
yueee_yt 0:7766f6712673 1045
yueee_yt 0:7766f6712673 1046 /* scalar node */
yueee_yt 0:7766f6712673 1047 sn = (mib_scalar_node *)node;
yueee_yt 0:7766f6712673 1048 if (ident_len > 0)
yueee_yt 0:7766f6712673 1049 {
yueee_yt 0:7766f6712673 1050 /* at .0 */
yueee_yt 0:7766f6712673 1051 climb_tree = 1;
yueee_yt 0:7766f6712673 1052 }
yueee_yt 0:7766f6712673 1053 else
yueee_yt 0:7766f6712673 1054 {
yueee_yt 0:7766f6712673 1055 /* ident_len == 0, complete object identifier */
yueee_yt 0:7766f6712673 1056 oidret->id[oidret->len] = 0;
yueee_yt 0:7766f6712673 1057 (oidret->len)++;
yueee_yt 0:7766f6712673 1058 /* leaf node */
yueee_yt 0:7766f6712673 1059 LWIP_DEBUGF(SNMP_MIB_DEBUG,("completed scalar leaf\n"));
yueee_yt 0:7766f6712673 1060 return (struct mib_node*)sn;
yueee_yt 0:7766f6712673 1061 }
yueee_yt 0:7766f6712673 1062 }
yueee_yt 0:7766f6712673 1063 else
yueee_yt 0:7766f6712673 1064 {
yueee_yt 0:7766f6712673 1065 /* unknown/unhandled node_type */
yueee_yt 0:7766f6712673 1066 LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node_type %"U16_F" unkown\n",(u16_t)node_type));
yueee_yt 0:7766f6712673 1067 return NULL;
yueee_yt 0:7766f6712673 1068 }
yueee_yt 0:7766f6712673 1069
yueee_yt 0:7766f6712673 1070 if (climb_tree)
yueee_yt 0:7766f6712673 1071 {
yueee_yt 0:7766f6712673 1072 struct nse child;
yueee_yt 0:7766f6712673 1073
yueee_yt 0:7766f6712673 1074 /* find right child ptr */
yueee_yt 0:7766f6712673 1075 child.r_ptr = NULL;
yueee_yt 0:7766f6712673 1076 child.r_id = 0;
yueee_yt 0:7766f6712673 1077 child.r_nl = 0;
yueee_yt 0:7766f6712673 1078 while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
yueee_yt 0:7766f6712673 1079 {
yueee_yt 0:7766f6712673 1080 pop_node(&child);
yueee_yt 0:7766f6712673 1081 /* trim returned oid */
yueee_yt 0:7766f6712673 1082 (oidret->len)--;
yueee_yt 0:7766f6712673 1083 }
yueee_yt 0:7766f6712673 1084 if (child.r_ptr != NULL)
yueee_yt 0:7766f6712673 1085 {
yueee_yt 0:7766f6712673 1086 /* incoming ident is useless beyond this point */
yueee_yt 0:7766f6712673 1087 ident_len = 0;
yueee_yt 0:7766f6712673 1088 oidret->id[oidret->len] = child.r_id;
yueee_yt 0:7766f6712673 1089 oidret->len++;
yueee_yt 0:7766f6712673 1090 node = child.r_ptr;
yueee_yt 0:7766f6712673 1091 ext_level = child.r_nl;
yueee_yt 0:7766f6712673 1092 }
yueee_yt 0:7766f6712673 1093 else
yueee_yt 0:7766f6712673 1094 {
yueee_yt 0:7766f6712673 1095 /* tree ends here ... */
yueee_yt 0:7766f6712673 1096 LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed, tree ends here\n"));
yueee_yt 0:7766f6712673 1097 return NULL;
yueee_yt 0:7766f6712673 1098 }
yueee_yt 0:7766f6712673 1099 }
yueee_yt 0:7766f6712673 1100 }
yueee_yt 0:7766f6712673 1101 /* done, found nothing */
yueee_yt 0:7766f6712673 1102 LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node==%p\n",(void*)node));
yueee_yt 0:7766f6712673 1103 return NULL;
yueee_yt 0:7766f6712673 1104 }
yueee_yt 0:7766f6712673 1105
yueee_yt 0:7766f6712673 1106 /**
yueee_yt 0:7766f6712673 1107 * Test object identifier for the iso.org.dod.internet prefix.
yueee_yt 0:7766f6712673 1108 *
yueee_yt 0:7766f6712673 1109 * @param ident_len the length of the supplied object identifier
yueee_yt 0:7766f6712673 1110 * @param ident points to the array of sub identifiers
yueee_yt 0:7766f6712673 1111 * @return 1 if it matches, 0 otherwise
yueee_yt 0:7766f6712673 1112 */
yueee_yt 0:7766f6712673 1113 u8_t
yueee_yt 0:7766f6712673 1114 snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident)
yueee_yt 0:7766f6712673 1115 {
yueee_yt 0:7766f6712673 1116 if ((ident_len > 3) &&
yueee_yt 0:7766f6712673 1117 (ident[0] == 1) && (ident[1] == 3) &&
yueee_yt 0:7766f6712673 1118 (ident[2] == 6) && (ident[3] == 1))
yueee_yt 0:7766f6712673 1119 {
yueee_yt 0:7766f6712673 1120 return 1;
yueee_yt 0:7766f6712673 1121 }
yueee_yt 0:7766f6712673 1122 else
yueee_yt 0:7766f6712673 1123 {
yueee_yt 0:7766f6712673 1124 return 0;
yueee_yt 0:7766f6712673 1125 }
yueee_yt 0:7766f6712673 1126 }
yueee_yt 0:7766f6712673 1127
yueee_yt 0:7766f6712673 1128 /**
yueee_yt 0:7766f6712673 1129 * Expands object identifier to the iso.org.dod.internet
yueee_yt 0:7766f6712673 1130 * prefix for use in getnext operation.
yueee_yt 0:7766f6712673 1131 *
yueee_yt 0:7766f6712673 1132 * @param ident_len the length of the supplied object identifier
yueee_yt 0:7766f6712673 1133 * @param ident points to the array of sub identifiers
yueee_yt 0:7766f6712673 1134 * @param oidret points to returned expanded object identifier
yueee_yt 0:7766f6712673 1135 * @return 1 if it matches, 0 otherwise
yueee_yt 0:7766f6712673 1136 *
yueee_yt 0:7766f6712673 1137 * @note ident_len 0 is allowed, expanding to the first known object id!!
yueee_yt 0:7766f6712673 1138 */
yueee_yt 0:7766f6712673 1139 u8_t
yueee_yt 0:7766f6712673 1140 snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
yueee_yt 0:7766f6712673 1141 {
yueee_yt 0:7766f6712673 1142 const s32_t *prefix_ptr;
yueee_yt 0:7766f6712673 1143 s32_t *ret_ptr;
yueee_yt 0:7766f6712673 1144 u8_t i;
yueee_yt 0:7766f6712673 1145
yueee_yt 0:7766f6712673 1146 i = 0;
yueee_yt 0:7766f6712673 1147 prefix_ptr = &prefix[0];
yueee_yt 0:7766f6712673 1148 ret_ptr = &oidret->id[0];
yueee_yt 0:7766f6712673 1149 ident_len = ((ident_len < 4)?ident_len:4);
yueee_yt 0:7766f6712673 1150 while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
yueee_yt 0:7766f6712673 1151 {
yueee_yt 0:7766f6712673 1152 *ret_ptr++ = *prefix_ptr++;
yueee_yt 0:7766f6712673 1153 ident++;
yueee_yt 0:7766f6712673 1154 i++;
yueee_yt 0:7766f6712673 1155 }
yueee_yt 0:7766f6712673 1156 if (i == ident_len)
yueee_yt 0:7766f6712673 1157 {
yueee_yt 0:7766f6712673 1158 /* match, complete missing bits */
yueee_yt 0:7766f6712673 1159 while (i < 4)
yueee_yt 0:7766f6712673 1160 {
yueee_yt 0:7766f6712673 1161 *ret_ptr++ = *prefix_ptr++;
yueee_yt 0:7766f6712673 1162 i++;
yueee_yt 0:7766f6712673 1163 }
yueee_yt 0:7766f6712673 1164 oidret->len = i;
yueee_yt 0:7766f6712673 1165 return 1;
yueee_yt 0:7766f6712673 1166 }
yueee_yt 0:7766f6712673 1167 else
yueee_yt 0:7766f6712673 1168 {
yueee_yt 0:7766f6712673 1169 /* i != ident_len */
yueee_yt 0:7766f6712673 1170 return 0;
yueee_yt 0:7766f6712673 1171 }
yueee_yt 0:7766f6712673 1172 }
yueee_yt 0:7766f6712673 1173
yueee_yt 0:7766f6712673 1174 #endif /* LWIP_SNMP */