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