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