xref: /nrf52832-nimble/rt-thread/components/net/lwip-1.4.1/src/include/lwip/snmp_msg.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /**
2*10465441SEvalZero  * @file
3*10465441SEvalZero  * SNMP Agent message handling structures.
4*10465441SEvalZero  */
5*10465441SEvalZero 
6*10465441SEvalZero /*
7*10465441SEvalZero  * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
8*10465441SEvalZero  * All rights reserved.
9*10465441SEvalZero  *
10*10465441SEvalZero  * Redistribution and use in source and binary forms, with or without modification,
11*10465441SEvalZero  * are permitted provided that the following conditions are met:
12*10465441SEvalZero  *
13*10465441SEvalZero  * 1. Redistributions of source code must retain the above copyright notice,
14*10465441SEvalZero  *    this list of conditions and the following disclaimer.
15*10465441SEvalZero  * 2. Redistributions in binary form must reproduce the above copyright notice,
16*10465441SEvalZero  *    this list of conditions and the following disclaimer in the documentation
17*10465441SEvalZero  *    and/or other materials provided with the distribution.
18*10465441SEvalZero  * 3. The name of the author may not be used to endorse or promote products
19*10465441SEvalZero  *    derived from this software without specific prior written permission.
20*10465441SEvalZero  *
21*10465441SEvalZero  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
22*10465441SEvalZero  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23*10465441SEvalZero  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
24*10465441SEvalZero  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*10465441SEvalZero  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26*10465441SEvalZero  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27*10465441SEvalZero  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28*10465441SEvalZero  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29*10465441SEvalZero  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
30*10465441SEvalZero  * OF SUCH DAMAGE.
31*10465441SEvalZero  *
32*10465441SEvalZero  * Author: Christiaan Simons <[email protected]>
33*10465441SEvalZero  */
34*10465441SEvalZero 
35*10465441SEvalZero #ifndef __LWIP_SNMP_MSG_H__
36*10465441SEvalZero #define __LWIP_SNMP_MSG_H__
37*10465441SEvalZero 
38*10465441SEvalZero #include "lwip/opt.h"
39*10465441SEvalZero #include "lwip/snmp.h"
40*10465441SEvalZero #include "lwip/snmp_structs.h"
41*10465441SEvalZero #include "lwip/ip_addr.h"
42*10465441SEvalZero #include "lwip/err.h"
43*10465441SEvalZero 
44*10465441SEvalZero #if LWIP_SNMP
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 /* The listen port of the SNMP agent. Clients have to make their requests to
57*10465441SEvalZero    this port. Most standard clients won't work if you change this! */
58*10465441SEvalZero #ifndef SNMP_IN_PORT
59*10465441SEvalZero #define SNMP_IN_PORT 161
60*10465441SEvalZero #endif
61*10465441SEvalZero /* The remote port the SNMP agent sends traps to. Most standard trap sinks won't
62*10465441SEvalZero    work if you change this! */
63*10465441SEvalZero #ifndef SNMP_TRAP_PORT
64*10465441SEvalZero #define SNMP_TRAP_PORT 162
65*10465441SEvalZero #endif
66*10465441SEvalZero 
67*10465441SEvalZero #define SNMP_ES_NOERROR 0
68*10465441SEvalZero #define SNMP_ES_TOOBIG 1
69*10465441SEvalZero #define SNMP_ES_NOSUCHNAME 2
70*10465441SEvalZero #define SNMP_ES_BADVALUE 3
71*10465441SEvalZero #define SNMP_ES_READONLY 4
72*10465441SEvalZero #define SNMP_ES_GENERROR 5
73*10465441SEvalZero 
74*10465441SEvalZero #define SNMP_GENTRAP_COLDSTART 0
75*10465441SEvalZero #define SNMP_GENTRAP_WARMSTART 1
76*10465441SEvalZero #define SNMP_GENTRAP_AUTHFAIL 4
77*10465441SEvalZero #define SNMP_GENTRAP_ENTERPRISESPC 6
78*10465441SEvalZero 
79*10465441SEvalZero struct snmp_varbind
80*10465441SEvalZero {
81*10465441SEvalZero   /* next pointer, NULL for last in list */
82*10465441SEvalZero   struct snmp_varbind *next;
83*10465441SEvalZero   /* previous pointer, NULL for first in list */
84*10465441SEvalZero   struct snmp_varbind *prev;
85*10465441SEvalZero 
86*10465441SEvalZero   /* object identifier length (in s32_t) */
87*10465441SEvalZero   u8_t ident_len;
88*10465441SEvalZero   /* object identifier array */
89*10465441SEvalZero   s32_t *ident;
90*10465441SEvalZero 
91*10465441SEvalZero   /* object value ASN1 type */
92*10465441SEvalZero   u8_t value_type;
93*10465441SEvalZero   /* object value length (in u8_t) */
94*10465441SEvalZero   u8_t value_len;
95*10465441SEvalZero   /* object value */
96*10465441SEvalZero   void *value;
97*10465441SEvalZero 
98*10465441SEvalZero   /* encoding varbind seq length length */
99*10465441SEvalZero   u8_t seqlenlen;
100*10465441SEvalZero   /* encoding object identifier length length */
101*10465441SEvalZero   u8_t olenlen;
102*10465441SEvalZero   /* encoding object value length length */
103*10465441SEvalZero   u8_t vlenlen;
104*10465441SEvalZero   /* encoding varbind seq length */
105*10465441SEvalZero   u16_t seqlen;
106*10465441SEvalZero   /* encoding object identifier length */
107*10465441SEvalZero   u16_t olen;
108*10465441SEvalZero   /* encoding object value length */
109*10465441SEvalZero   u16_t vlen;
110*10465441SEvalZero };
111*10465441SEvalZero 
112*10465441SEvalZero struct snmp_varbind_root
113*10465441SEvalZero {
114*10465441SEvalZero   struct snmp_varbind *head;
115*10465441SEvalZero   struct snmp_varbind *tail;
116*10465441SEvalZero   /* number of variable bindings in list */
117*10465441SEvalZero   u8_t count;
118*10465441SEvalZero   /* encoding varbind-list seq length length */
119*10465441SEvalZero   u8_t seqlenlen;
120*10465441SEvalZero   /* encoding varbind-list seq length */
121*10465441SEvalZero   u16_t seqlen;
122*10465441SEvalZero };
123*10465441SEvalZero 
124*10465441SEvalZero /** output response message header length fields */
125*10465441SEvalZero struct snmp_resp_header_lengths
126*10465441SEvalZero {
127*10465441SEvalZero   /* encoding error-index length length */
128*10465441SEvalZero   u8_t erridxlenlen;
129*10465441SEvalZero   /* encoding error-status length length */
130*10465441SEvalZero   u8_t errstatlenlen;
131*10465441SEvalZero   /* encoding request id length length */
132*10465441SEvalZero   u8_t ridlenlen;
133*10465441SEvalZero   /* encoding pdu length length */
134*10465441SEvalZero   u8_t pdulenlen;
135*10465441SEvalZero   /* encoding community length length */
136*10465441SEvalZero   u8_t comlenlen;
137*10465441SEvalZero   /* encoding version length length */
138*10465441SEvalZero   u8_t verlenlen;
139*10465441SEvalZero   /* encoding sequence length length */
140*10465441SEvalZero   u8_t seqlenlen;
141*10465441SEvalZero 
142*10465441SEvalZero   /* encoding error-index length */
143*10465441SEvalZero   u16_t erridxlen;
144*10465441SEvalZero   /* encoding error-status length */
145*10465441SEvalZero   u16_t errstatlen;
146*10465441SEvalZero   /* encoding request id length */
147*10465441SEvalZero   u16_t ridlen;
148*10465441SEvalZero   /* encoding pdu length */
149*10465441SEvalZero   u16_t pdulen;
150*10465441SEvalZero   /* encoding community length */
151*10465441SEvalZero   u16_t comlen;
152*10465441SEvalZero   /* encoding version length */
153*10465441SEvalZero   u16_t verlen;
154*10465441SEvalZero   /* encoding sequence length */
155*10465441SEvalZero   u16_t seqlen;
156*10465441SEvalZero };
157*10465441SEvalZero 
158*10465441SEvalZero /** output response message header length fields */
159*10465441SEvalZero struct snmp_trap_header_lengths
160*10465441SEvalZero {
161*10465441SEvalZero   /* encoding timestamp length length */
162*10465441SEvalZero   u8_t tslenlen;
163*10465441SEvalZero   /* encoding specific-trap length length */
164*10465441SEvalZero   u8_t strplenlen;
165*10465441SEvalZero   /* encoding generic-trap length length */
166*10465441SEvalZero   u8_t gtrplenlen;
167*10465441SEvalZero   /* encoding agent-addr length length */
168*10465441SEvalZero   u8_t aaddrlenlen;
169*10465441SEvalZero   /* encoding enterprise-id length length */
170*10465441SEvalZero   u8_t eidlenlen;
171*10465441SEvalZero   /* encoding pdu length length */
172*10465441SEvalZero   u8_t pdulenlen;
173*10465441SEvalZero   /* encoding community length length */
174*10465441SEvalZero   u8_t comlenlen;
175*10465441SEvalZero   /* encoding version length length */
176*10465441SEvalZero   u8_t verlenlen;
177*10465441SEvalZero   /* encoding sequence length length */
178*10465441SEvalZero   u8_t seqlenlen;
179*10465441SEvalZero 
180*10465441SEvalZero   /* encoding timestamp length */
181*10465441SEvalZero   u16_t tslen;
182*10465441SEvalZero   /* encoding specific-trap length */
183*10465441SEvalZero   u16_t strplen;
184*10465441SEvalZero   /* encoding generic-trap length */
185*10465441SEvalZero   u16_t gtrplen;
186*10465441SEvalZero   /* encoding agent-addr length */
187*10465441SEvalZero   u16_t aaddrlen;
188*10465441SEvalZero   /* encoding enterprise-id length */
189*10465441SEvalZero   u16_t eidlen;
190*10465441SEvalZero   /* encoding pdu length */
191*10465441SEvalZero   u16_t pdulen;
192*10465441SEvalZero   /* encoding community length */
193*10465441SEvalZero   u16_t comlen;
194*10465441SEvalZero   /* encoding version length */
195*10465441SEvalZero   u16_t verlen;
196*10465441SEvalZero   /* encoding sequence length */
197*10465441SEvalZero   u16_t seqlen;
198*10465441SEvalZero };
199*10465441SEvalZero 
200*10465441SEvalZero /* Accepting new SNMP messages. */
201*10465441SEvalZero #define SNMP_MSG_EMPTY                 0
202*10465441SEvalZero /* Search for matching object for variable binding. */
203*10465441SEvalZero #define SNMP_MSG_SEARCH_OBJ            1
204*10465441SEvalZero /* Perform SNMP operation on in-memory object.
205*10465441SEvalZero    Pass-through states, for symmetry only. */
206*10465441SEvalZero #define SNMP_MSG_INTERNAL_GET_OBJDEF   2
207*10465441SEvalZero #define SNMP_MSG_INTERNAL_GET_VALUE    3
208*10465441SEvalZero #define SNMP_MSG_INTERNAL_SET_TEST     4
209*10465441SEvalZero #define SNMP_MSG_INTERNAL_GET_OBJDEF_S 5
210*10465441SEvalZero #define SNMP_MSG_INTERNAL_SET_VALUE    6
211*10465441SEvalZero /* Perform SNMP operation on object located externally.
212*10465441SEvalZero    In theory this could be used for building a proxy agent.
213*10465441SEvalZero    Practical use is for an enterprise spc. app. gateway. */
214*10465441SEvalZero #define SNMP_MSG_EXTERNAL_GET_OBJDEF   7
215*10465441SEvalZero #define SNMP_MSG_EXTERNAL_GET_VALUE    8
216*10465441SEvalZero #define SNMP_MSG_EXTERNAL_SET_TEST     9
217*10465441SEvalZero #define SNMP_MSG_EXTERNAL_GET_OBJDEF_S 10
218*10465441SEvalZero #define SNMP_MSG_EXTERNAL_SET_VALUE    11
219*10465441SEvalZero 
220*10465441SEvalZero #define SNMP_COMMUNITY_STR_LEN 64
221*10465441SEvalZero struct snmp_msg_pstat
222*10465441SEvalZero {
223*10465441SEvalZero   /* lwIP local port (161) binding */
224*10465441SEvalZero   struct udp_pcb *pcb;
225*10465441SEvalZero   /* source IP address */
226*10465441SEvalZero   ip_addr_t sip;
227*10465441SEvalZero   /* source UDP port */
228*10465441SEvalZero   u16_t sp;
229*10465441SEvalZero   /* request type */
230*10465441SEvalZero   u8_t rt;
231*10465441SEvalZero   /* request ID */
232*10465441SEvalZero   s32_t rid;
233*10465441SEvalZero   /* error status */
234*10465441SEvalZero   s32_t error_status;
235*10465441SEvalZero   /* error index */
236*10465441SEvalZero   s32_t error_index;
237*10465441SEvalZero   /* community name (zero terminated) */
238*10465441SEvalZero   u8_t community[SNMP_COMMUNITY_STR_LEN + 1];
239*10465441SEvalZero   /* community string length (exclusive zero term) */
240*10465441SEvalZero   u8_t com_strlen;
241*10465441SEvalZero   /* one out of MSG_EMPTY, MSG_DEMUX, MSG_INTERNAL, MSG_EXTERNAL_x */
242*10465441SEvalZero   u8_t state;
243*10465441SEvalZero   /* saved arguments for MSG_EXTERNAL_x */
244*10465441SEvalZero   struct mib_external_node *ext_mib_node;
245*10465441SEvalZero   struct snmp_name_ptr ext_name_ptr;
246*10465441SEvalZero   struct obj_def ext_object_def;
247*10465441SEvalZero   struct snmp_obj_id ext_oid;
248*10465441SEvalZero   /* index into input variable binding list */
249*10465441SEvalZero   u8_t vb_idx;
250*10465441SEvalZero   /* ptr into input variable binding list */
251*10465441SEvalZero   struct snmp_varbind *vb_ptr;
252*10465441SEvalZero   /* list of variable bindings from input */
253*10465441SEvalZero   struct snmp_varbind_root invb;
254*10465441SEvalZero   /* list of variable bindings to output */
255*10465441SEvalZero   struct snmp_varbind_root outvb;
256*10465441SEvalZero   /* output response lengths used in ASN encoding */
257*10465441SEvalZero   struct snmp_resp_header_lengths rhl;
258*10465441SEvalZero };
259*10465441SEvalZero 
260*10465441SEvalZero struct snmp_msg_trap
261*10465441SEvalZero {
262*10465441SEvalZero   /* lwIP local port (161) binding */
263*10465441SEvalZero   struct udp_pcb *pcb;
264*10465441SEvalZero   /* destination IP address in network order */
265*10465441SEvalZero   ip_addr_t dip;
266*10465441SEvalZero 
267*10465441SEvalZero   /* source enterprise ID (sysObjectID) */
268*10465441SEvalZero   struct snmp_obj_id *enterprise;
269*10465441SEvalZero   /* source IP address, raw network order format */
270*10465441SEvalZero   u8_t sip_raw[4];
271*10465441SEvalZero   /* generic trap code */
272*10465441SEvalZero   u32_t gen_trap;
273*10465441SEvalZero   /* specific trap code */
274*10465441SEvalZero   u32_t spc_trap;
275*10465441SEvalZero   /* timestamp */
276*10465441SEvalZero   u32_t ts;
277*10465441SEvalZero   /* list of variable bindings to output */
278*10465441SEvalZero   struct snmp_varbind_root outvb;
279*10465441SEvalZero   /* output trap lengths used in ASN encoding */
280*10465441SEvalZero   struct snmp_trap_header_lengths thl;
281*10465441SEvalZero };
282*10465441SEvalZero 
283*10465441SEvalZero /** Agent Version constant, 0 = v1 oddity */
284*10465441SEvalZero extern const s32_t snmp_version;
285*10465441SEvalZero /** Agent default "public" community string */
286*10465441SEvalZero extern const char snmp_publiccommunity[7];
287*10465441SEvalZero 
288*10465441SEvalZero extern struct snmp_msg_trap trap_msg;
289*10465441SEvalZero 
290*10465441SEvalZero /** Agent setup, start listening to port 161. */
291*10465441SEvalZero void snmp_init(void);
292*10465441SEvalZero void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable);
293*10465441SEvalZero void snmp_trap_dst_ip_set(u8_t dst_idx, ip_addr_t *dst);
294*10465441SEvalZero 
295*10465441SEvalZero /** Varbind-list functions. */
296*10465441SEvalZero struct snmp_varbind* snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len);
297*10465441SEvalZero void snmp_varbind_free(struct snmp_varbind *vb);
298*10465441SEvalZero void snmp_varbind_list_free(struct snmp_varbind_root *root);
299*10465441SEvalZero void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb);
300*10465441SEvalZero struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root);
301*10465441SEvalZero 
302*10465441SEvalZero /** Handle an internal (recv) or external (private response) event. */
303*10465441SEvalZero void snmp_msg_event(u8_t request_id);
304*10465441SEvalZero err_t snmp_send_response(struct snmp_msg_pstat *m_stat);
305*10465441SEvalZero err_t snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap);
306*10465441SEvalZero void snmp_coldstart_trap(void);
307*10465441SEvalZero void snmp_authfail_trap(void);
308*10465441SEvalZero 
309*10465441SEvalZero #ifdef __cplusplus
310*10465441SEvalZero }
311*10465441SEvalZero #endif
312*10465441SEvalZero 
313*10465441SEvalZero #endif /* LWIP_SNMP */
314*10465441SEvalZero 
315*10465441SEvalZero #endif /* __LWIP_SNMP_MSG_H__ */
316