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