xref: /nrf52832-nimble/rt-thread/components/net/lwip-1.4.1/src/include/lwip/snmp_structs.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /**
2*10465441SEvalZero  * @file
3*10465441SEvalZero  * Generic MIB tree structures.
4*10465441SEvalZero  *
5*10465441SEvalZero  * @todo namespace prefixes
6*10465441SEvalZero  */
7*10465441SEvalZero 
8*10465441SEvalZero /*
9*10465441SEvalZero  * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
10*10465441SEvalZero  * All rights reserved.
11*10465441SEvalZero  *
12*10465441SEvalZero  * Redistribution and use in source and binary forms, with or without modification,
13*10465441SEvalZero  * are permitted provided that the following conditions are met:
14*10465441SEvalZero  *
15*10465441SEvalZero  * 1. Redistributions of source code must retain the above copyright notice,
16*10465441SEvalZero  *    this list of conditions and the following disclaimer.
17*10465441SEvalZero  * 2. Redistributions in binary form must reproduce the above copyright notice,
18*10465441SEvalZero  *    this list of conditions and the following disclaimer in the documentation
19*10465441SEvalZero  *    and/or other materials provided with the distribution.
20*10465441SEvalZero  * 3. The name of the author may not be used to endorse or promote products
21*10465441SEvalZero  *    derived from this software without specific prior written permission.
22*10465441SEvalZero  *
23*10465441SEvalZero  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
24*10465441SEvalZero  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25*10465441SEvalZero  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
26*10465441SEvalZero  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27*10465441SEvalZero  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
28*10465441SEvalZero  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29*10465441SEvalZero  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30*10465441SEvalZero  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
31*10465441SEvalZero  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
32*10465441SEvalZero  * OF SUCH DAMAGE.
33*10465441SEvalZero  *
34*10465441SEvalZero  * Author: Christiaan Simons <[email protected]>
35*10465441SEvalZero  */
36*10465441SEvalZero 
37*10465441SEvalZero #ifndef __LWIP_SNMP_STRUCTS_H__
38*10465441SEvalZero #define __LWIP_SNMP_STRUCTS_H__
39*10465441SEvalZero 
40*10465441SEvalZero #include "lwip/opt.h"
41*10465441SEvalZero 
42*10465441SEvalZero #if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
43*10465441SEvalZero 
44*10465441SEvalZero #include "lwip/snmp.h"
45*10465441SEvalZero 
46*10465441SEvalZero #if SNMP_PRIVATE_MIB
47*10465441SEvalZero /* When using a private MIB, you have to create a file 'private_mib.h' that contains
48*10465441SEvalZero  * a 'struct mib_array_node mib_private' which contains your MIB. */
49*10465441SEvalZero #include "private_mib.h"
50*10465441SEvalZero #endif
51*10465441SEvalZero 
52*10465441SEvalZero #ifdef __cplusplus
53*10465441SEvalZero extern "C" {
54*10465441SEvalZero #endif
55*10465441SEvalZero 
56*10465441SEvalZero /* MIB object instance */
57*10465441SEvalZero #define MIB_OBJECT_NONE 0
58*10465441SEvalZero #define MIB_OBJECT_SCALAR 1
59*10465441SEvalZero #define MIB_OBJECT_TAB 2
60*10465441SEvalZero 
61*10465441SEvalZero /* MIB access types */
62*10465441SEvalZero #define MIB_ACCESS_READ   1
63*10465441SEvalZero #define MIB_ACCESS_WRITE  2
64*10465441SEvalZero 
65*10465441SEvalZero /* MIB object access */
66*10465441SEvalZero #define MIB_OBJECT_READ_ONLY      MIB_ACCESS_READ
67*10465441SEvalZero #define MIB_OBJECT_READ_WRITE     (MIB_ACCESS_READ | MIB_ACCESS_WRITE)
68*10465441SEvalZero #define MIB_OBJECT_WRITE_ONLY     MIB_ACCESS_WRITE
69*10465441SEvalZero #define MIB_OBJECT_NOT_ACCESSIBLE 0
70*10465441SEvalZero 
71*10465441SEvalZero /** object definition returned by (get_object_def)() */
72*10465441SEvalZero struct obj_def
73*10465441SEvalZero {
74*10465441SEvalZero   /* MIB_OBJECT_NONE (0), MIB_OBJECT_SCALAR (1), MIB_OBJECT_TAB (2) */
75*10465441SEvalZero   u8_t instance;
76*10465441SEvalZero   /* 0 read-only, 1 read-write, 2 write-only, 3 not-accessible */
77*10465441SEvalZero   u8_t access;
78*10465441SEvalZero   /* ASN type for this object */
79*10465441SEvalZero   u8_t asn_type;
80*10465441SEvalZero   /* value length (host length) */
81*10465441SEvalZero   u16_t v_len;
82*10465441SEvalZero   /* length of instance part of supplied object identifier */
83*10465441SEvalZero   u8_t  id_inst_len;
84*10465441SEvalZero   /* instance part of supplied object identifier */
85*10465441SEvalZero   s32_t *id_inst_ptr;
86*10465441SEvalZero };
87*10465441SEvalZero 
88*10465441SEvalZero struct snmp_name_ptr
89*10465441SEvalZero {
90*10465441SEvalZero   u8_t ident_len;
91*10465441SEvalZero   s32_t *ident;
92*10465441SEvalZero };
93*10465441SEvalZero 
94*10465441SEvalZero /** MIB const scalar (.0) node */
95*10465441SEvalZero #define MIB_NODE_SC 0x01
96*10465441SEvalZero /** MIB const array node */
97*10465441SEvalZero #define MIB_NODE_AR 0x02
98*10465441SEvalZero /** MIB array node (mem_malloced from RAM) */
99*10465441SEvalZero #define MIB_NODE_RA 0x03
100*10465441SEvalZero /** MIB list root node (mem_malloced from RAM) */
101*10465441SEvalZero #define MIB_NODE_LR 0x04
102*10465441SEvalZero /** MIB node for external objects */
103*10465441SEvalZero #define MIB_NODE_EX 0x05
104*10465441SEvalZero 
105*10465441SEvalZero /** node "base class" layout, the mandatory fields for a node  */
106*10465441SEvalZero struct mib_node
107*10465441SEvalZero {
108*10465441SEvalZero   /** returns struct obj_def for the given object identifier */
109*10465441SEvalZero   void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
110*10465441SEvalZero   /** returns object value for the given object identifier,
111*10465441SEvalZero      @note the caller must allocate at least len bytes for the value */
112*10465441SEvalZero   void (*get_value)(struct obj_def *od, u16_t len, void *value);
113*10465441SEvalZero   /** tests length and/or range BEFORE setting */
114*10465441SEvalZero   u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
115*10465441SEvalZero   /** sets object value, only to be called when set_test()  */
116*10465441SEvalZero   void (*set_value)(struct obj_def *od, u16_t len, void *value);
117*10465441SEvalZero   /** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */
118*10465441SEvalZero   u8_t node_type;
119*10465441SEvalZero   /* array or max list length */
120*10465441SEvalZero   u16_t maxlength;
121*10465441SEvalZero };
122*10465441SEvalZero 
123*10465441SEvalZero /** derived node for scalars .0 index */
124*10465441SEvalZero typedef struct mib_node mib_scalar_node;
125*10465441SEvalZero 
126*10465441SEvalZero /** derived node, points to a fixed size const array
127*10465441SEvalZero     of sub-identifiers plus a 'child' pointer */
128*10465441SEvalZero struct mib_array_node
129*10465441SEvalZero {
130*10465441SEvalZero   /* inherited "base class" members */
131*10465441SEvalZero   void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
132*10465441SEvalZero   void (*get_value)(struct obj_def *od, u16_t len, void *value);
133*10465441SEvalZero   u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
134*10465441SEvalZero   void (*set_value)(struct obj_def *od, u16_t len, void *value);
135*10465441SEvalZero 
136*10465441SEvalZero   u8_t node_type;
137*10465441SEvalZero   u16_t maxlength;
138*10465441SEvalZero 
139*10465441SEvalZero   /* additional struct members */
140*10465441SEvalZero   const s32_t *objid;
141*10465441SEvalZero   struct mib_node* const *nptr;
142*10465441SEvalZero };
143*10465441SEvalZero 
144*10465441SEvalZero /** derived node, points to a fixed size mem_malloced array
145*10465441SEvalZero     of sub-identifiers plus a 'child' pointer */
146*10465441SEvalZero struct mib_ram_array_node
147*10465441SEvalZero {
148*10465441SEvalZero   /* inherited "base class" members */
149*10465441SEvalZero   void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
150*10465441SEvalZero   void (*get_value)(struct obj_def *od, u16_t len, void *value);
151*10465441SEvalZero   u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
152*10465441SEvalZero   void (*set_value)(struct obj_def *od, u16_t len, void *value);
153*10465441SEvalZero 
154*10465441SEvalZero   u8_t node_type;
155*10465441SEvalZero   u16_t maxlength;
156*10465441SEvalZero 
157*10465441SEvalZero   /* aditional struct members */
158*10465441SEvalZero   s32_t *objid;
159*10465441SEvalZero   struct mib_node **nptr;
160*10465441SEvalZero };
161*10465441SEvalZero 
162*10465441SEvalZero struct mib_list_node
163*10465441SEvalZero {
164*10465441SEvalZero   struct mib_list_node *prev;
165*10465441SEvalZero   struct mib_list_node *next;
166*10465441SEvalZero   s32_t objid;
167*10465441SEvalZero   struct mib_node *nptr;
168*10465441SEvalZero };
169*10465441SEvalZero 
170*10465441SEvalZero /** derived node, points to a doubly linked list
171*10465441SEvalZero     of sub-identifiers plus a 'child' pointer */
172*10465441SEvalZero struct mib_list_rootnode
173*10465441SEvalZero {
174*10465441SEvalZero   /* inherited "base class" members */
175*10465441SEvalZero   void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
176*10465441SEvalZero   void (*get_value)(struct obj_def *od, u16_t len, void *value);
177*10465441SEvalZero   u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
178*10465441SEvalZero   void (*set_value)(struct obj_def *od, u16_t len, void *value);
179*10465441SEvalZero 
180*10465441SEvalZero   u8_t node_type;
181*10465441SEvalZero   u16_t maxlength;
182*10465441SEvalZero 
183*10465441SEvalZero   /* additional struct members */
184*10465441SEvalZero   struct mib_list_node *head;
185*10465441SEvalZero   struct mib_list_node *tail;
186*10465441SEvalZero   /* counts list nodes in list  */
187*10465441SEvalZero   u16_t count;
188*10465441SEvalZero };
189*10465441SEvalZero 
190*10465441SEvalZero /** derived node, has access functions for mib object in external memory or device
191*10465441SEvalZero     using 'tree_level' and 'idx', with a range 0 .. (level_length() - 1) */
192*10465441SEvalZero struct mib_external_node
193*10465441SEvalZero {
194*10465441SEvalZero   /* inherited "base class" members */
195*10465441SEvalZero   void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
196*10465441SEvalZero   void (*get_value)(struct obj_def *od, u16_t len, void *value);
197*10465441SEvalZero   u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
198*10465441SEvalZero   void (*set_value)(struct obj_def *od, u16_t len, void *value);
199*10465441SEvalZero 
200*10465441SEvalZero   u8_t node_type;
201*10465441SEvalZero   u16_t maxlength;
202*10465441SEvalZero 
203*10465441SEvalZero   /* additional struct members */
204*10465441SEvalZero   /** points to an external (in memory) record of some sort of addressing
205*10465441SEvalZero       information, passed to and interpreted by the funtions below */
206*10465441SEvalZero   void* addr_inf;
207*10465441SEvalZero   /** tree levels under this node */
208*10465441SEvalZero   u8_t tree_levels;
209*10465441SEvalZero   /** number of objects at this level */
210*10465441SEvalZero   u16_t (*level_length)(void* addr_inf, u8_t level);
211*10465441SEvalZero   /** compares object sub identifier with external id
212*10465441SEvalZero       return zero when equal, nonzero when unequal */
213*10465441SEvalZero   s32_t (*ident_cmp)(void* addr_inf, u8_t level, u16_t idx, s32_t sub_id);
214*10465441SEvalZero   void (*get_objid)(void* addr_inf, u8_t level, u16_t idx, s32_t *sub_id);
215*10465441SEvalZero 
216*10465441SEvalZero   /** async Questions */
217*10465441SEvalZero   void (*get_object_def_q)(void* addr_inf, u8_t rid, u8_t ident_len, s32_t *ident);
218*10465441SEvalZero   void (*get_value_q)(u8_t rid, struct obj_def *od);
219*10465441SEvalZero   void (*set_test_q)(u8_t rid, struct obj_def *od);
220*10465441SEvalZero   void (*set_value_q)(u8_t rid, struct obj_def *od, u16_t len, void *value);
221*10465441SEvalZero   /** async Answers */
222*10465441SEvalZero   void (*get_object_def_a)(u8_t rid, u8_t ident_len, s32_t *ident, struct obj_def *od);
223*10465441SEvalZero   void (*get_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
224*10465441SEvalZero   u8_t (*set_test_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
225*10465441SEvalZero   void (*set_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
226*10465441SEvalZero   /** async Panic Close (agent returns error reply,
227*10465441SEvalZero       e.g. used for external transaction cleanup) */
228*10465441SEvalZero   void (*get_object_def_pc)(u8_t rid, u8_t ident_len, s32_t *ident);
229*10465441SEvalZero   void (*get_value_pc)(u8_t rid, struct obj_def *od);
230*10465441SEvalZero   void (*set_test_pc)(u8_t rid, struct obj_def *od);
231*10465441SEvalZero   void (*set_value_pc)(u8_t rid, struct obj_def *od);
232*10465441SEvalZero };
233*10465441SEvalZero 
234*10465441SEvalZero /** export MIB tree from mib2.c */
235*10465441SEvalZero extern const struct mib_array_node internet;
236*10465441SEvalZero 
237*10465441SEvalZero /** dummy function pointers for non-leaf MIB nodes from mib2.c */
238*10465441SEvalZero void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
239*10465441SEvalZero void noleafs_get_value(struct obj_def *od, u16_t len, void *value);
240*10465441SEvalZero u8_t noleafs_set_test(struct obj_def *od, u16_t len, void *value);
241*10465441SEvalZero void noleafs_set_value(struct obj_def *od, u16_t len, void *value);
242*10465441SEvalZero 
243*10465441SEvalZero void snmp_oidtoip(s32_t *ident, ip_addr_t *ip);
244*10465441SEvalZero void snmp_iptooid(ip_addr_t *ip, s32_t *ident);
245*10465441SEvalZero void snmp_ifindextonetif(s32_t ifindex, struct netif **netif);
246*10465441SEvalZero void snmp_netiftoifindex(struct netif *netif, s32_t *ifidx);
247*10465441SEvalZero 
248*10465441SEvalZero struct mib_list_node* snmp_mib_ln_alloc(s32_t id);
249*10465441SEvalZero void snmp_mib_ln_free(struct mib_list_node *ln);
250*10465441SEvalZero struct mib_list_rootnode* snmp_mib_lrn_alloc(void);
251*10465441SEvalZero void snmp_mib_lrn_free(struct mib_list_rootnode *lrn);
252*10465441SEvalZero 
253*10465441SEvalZero s8_t snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn);
254*10465441SEvalZero s8_t snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn);
255*10465441SEvalZero struct mib_list_rootnode *snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n);
256*10465441SEvalZero 
257*10465441SEvalZero struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np);
258*10465441SEvalZero struct mib_node* snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret);
259*10465441SEvalZero u8_t snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident);
260*10465441SEvalZero u8_t snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret);
261*10465441SEvalZero 
262*10465441SEvalZero #ifdef __cplusplus
263*10465441SEvalZero }
264*10465441SEvalZero #endif
265*10465441SEvalZero 
266*10465441SEvalZero #endif /* LWIP_SNMP */
267*10465441SEvalZero 
268*10465441SEvalZero #endif /* __LWIP_SNMP_STRUCTS_H__ */
269