Used in Live Traffic Update Nokia LCD Display Project

Fork of NetServices by Segundo Equipo

Committer:
rrajan8
Date:
Wed Mar 06 19:07:23 2013 +0000
Revision:
8:92b57208ab99
Parent:
0:ac1725ba162c
This project utilizes mbed's networking features to display live traffic updates on the Nokia LCD using the MapQuest API's Traffic Web Service.

Who changed what in which revision?

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