]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bsnmp/lib/snmp.h
Pull in r366369 from upstream llvm trunk (by Francis Visoiu Mistrih):
[FreeBSD/FreeBSD.git] / contrib / bsnmp / lib / snmp.h
1 /*
2  * Copyright (c) 2001-2003
3  *      Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4  *      All rights reserved.
5  *
6  * Author: Harti Brandt <harti@freebsd.org>
7  *
8  * Copyright (c) 2010 The FreeBSD Foundation
9  * All rights reserved.
10  *
11  * Portions of this software were developed by Shteryana Sotirova Shopova
12  * under sponsorship from the FreeBSD Foundation.
13  *
14  *
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions
17  * are met:
18  * 1. Redistributions of source code must retain the above copyright
19  *    notice, this list of conditions and the following disclaimer.
20  * 2. Redistributions in binary form must reproduce the above copyright
21  *    notice, this list of conditions and the following disclaimer in the
22  *    documentation and/or other materials provided with the distribution.
23  *
24  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  * $Begemot: bsnmp/lib/snmp.h,v 1.30 2004/08/06 08:46:54 brandt Exp $
37  *
38  * Header file for SNMP functions.
39  */
40 #ifndef snmp_h_
41 #define snmp_h_
42
43 #include <sys/types.h>
44
45 #define BSNMP_MAJOR     1
46 #define BSNMP_MINOR     13
47
48 #define SNMP_COMMUNITY_MAXLEN           128
49 #define SNMP_MAX_BINDINGS               100
50 #define SNMP_CONTEXT_NAME_SIZ           (32 + 1)
51 #define SNMP_ENGINE_ID_SIZ              32
52 #define SNMP_TIME_WINDOW                150
53
54 enum snmp_syntax {
55         SNMP_SYNTAX_NULL        = 0,
56         SNMP_SYNTAX_INTEGER,            /* == INTEGER32 */
57         SNMP_SYNTAX_OCTETSTRING,
58         SNMP_SYNTAX_OID,
59         SNMP_SYNTAX_IPADDRESS,
60         SNMP_SYNTAX_COUNTER,
61         SNMP_SYNTAX_GAUGE,              /* == UNSIGNED32 */
62         SNMP_SYNTAX_TIMETICKS,
63
64         /* v2 additions */
65         SNMP_SYNTAX_COUNTER64,
66         SNMP_SYNTAX_NOSUCHOBJECT,       /* exception */
67         SNMP_SYNTAX_NOSUCHINSTANCE,     /* exception */
68         SNMP_SYNTAX_ENDOFMIBVIEW,       /* exception */
69 };
70
71 struct snmp_value {
72         struct asn_oid          var;
73         enum snmp_syntax        syntax;
74         union snmp_values {
75           int32_t               integer;        /* also integer32 */
76           struct {
77             u_int               len;
78             u_char              *octets;
79           }                     octetstring;
80           struct asn_oid        oid;
81           u_char                ipaddress[4];
82           uint32_t              uint32;         /* also gauge32, counter32,
83                                                    unsigned32, timeticks */
84           uint64_t              counter64;
85         }                       v;
86 };
87
88 enum snmp_version {
89         SNMP_Verr = 0,
90         SNMP_V1 = 1,
91         SNMP_V2c = 2,
92         SNMP_V3,
93 };
94
95 #define SNMP_MPM_SNMP_V1                0
96 #define SNMP_MPM_SNMP_V2c               1
97 #define SNMP_MPM_SNMP_V3                3
98
99 #define SNMP_ADM_STR32_SIZ              (32 + 1)
100 #define SNMP_AUTH_KEY_SIZ               40
101 #define SNMP_PRIV_KEY_SIZ               32
102 #define SNMP_USM_AUTH_SIZE              12
103 #define SNMP_USM_PRIV_SIZE              8
104 #define SNMP_AUTH_HMACMD5_KEY_SIZ       16
105 #define SNMP_AUTH_HMACSHA_KEY_SIZ       20
106 #define SNMP_PRIV_AES_KEY_SIZ           16
107 #define SNMP_PRIV_DES_KEY_SIZ           8
108
109
110 enum snmp_secmodel {
111         SNMP_SECMODEL_ANY = 0,
112         SNMP_SECMODEL_SNMPv1 = 1,
113         SNMP_SECMODEL_SNMPv2c = 2,
114         SNMP_SECMODEL_USM = 3,
115         SNMP_SECMODEL_UNKNOWN
116 };
117
118 enum snmp_usm_level {
119         SNMP_noAuthNoPriv = 1,
120         SNMP_authNoPriv = 2,
121         SNMP_authPriv = 3
122 };
123
124 enum snmp_authentication {
125         SNMP_AUTH_NOAUTH = 0,
126         SNMP_AUTH_HMAC_MD5,
127         SNMP_AUTH_HMAC_SHA
128 };
129
130 enum snmp_privacy {
131         SNMP_PRIV_NOPRIV = 0,
132         SNMP_PRIV_DES = 1,
133         SNMP_PRIV_AES
134 };
135
136 struct snmp_engine {
137         uint8_t                 engine_id[SNMP_ENGINE_ID_SIZ];
138         uint32_t                engine_len;
139         int32_t                 engine_boots;
140         int32_t                 engine_time;
141         int32_t                 max_msg_size;
142 };
143
144 struct snmp_user {
145         char                            sec_name[SNMP_ADM_STR32_SIZ];
146         enum snmp_authentication        auth_proto;
147         enum snmp_privacy               priv_proto;
148         uint8_t                         auth_key[SNMP_AUTH_KEY_SIZ];
149         uint8_t                         priv_key[SNMP_PRIV_KEY_SIZ];
150 };
151
152 struct snmp_pdu {
153         char                    community[SNMP_COMMUNITY_MAXLEN + 1];
154         enum snmp_version       version;
155         u_int                   type;
156
157         /* SNMPv3 PDU header fields */
158         int32_t                 identifier;
159         uint8_t                 flags;
160         int32_t                 security_model;
161         struct snmp_engine      engine;
162
163         /* Associated USM user parameters */
164         struct snmp_user        user;
165         uint8_t                 msg_digest[SNMP_USM_AUTH_SIZE];
166         uint8_t                 msg_salt[SNMP_USM_PRIV_SIZE];
167
168         /*  View-based Access Model */
169         /* XXX: put in separate structure - conflicts with struct snmp_context */
170         uint32_t                context_engine_len;
171         uint8_t                 context_engine[SNMP_ENGINE_ID_SIZ];
172         char                    context_name[SNMP_CONTEXT_NAME_SIZ];
173
174         /* trap only */
175         struct asn_oid          enterprise;
176         u_char                  agent_addr[4];
177         int32_t                 generic_trap;
178         int32_t                 specific_trap;
179         uint32_t                time_stamp;
180
181         /* others */
182         int32_t                 request_id;
183         int32_t                 error_status;
184         int32_t                 error_index;
185
186         /* fixes for encoding */
187         size_t                  outer_len;
188         asn_len_t               scoped_len;
189         u_char                  *outer_ptr;
190         u_char                  *digest_ptr;
191         u_char                  *encrypted_ptr;
192         u_char                  *scoped_ptr;
193         u_char                  *pdu_ptr;
194         u_char                  *vars_ptr;
195
196
197         struct snmp_value       bindings[SNMP_MAX_BINDINGS];
198         u_int                   nbindings;
199 };
200 #define snmp_v1_pdu snmp_pdu
201
202 #define SNMP_PDU_GET            0
203 #define SNMP_PDU_GETNEXT        1
204 #define SNMP_PDU_RESPONSE       2
205 #define SNMP_PDU_SET            3
206 #define SNMP_PDU_TRAP           4       /* v1 */
207 #define SNMP_PDU_GETBULK        5       /* v2 */
208 #define SNMP_PDU_INFORM         6       /* v2 */
209 #define SNMP_PDU_TRAP2          7       /* v2 */
210 #define SNMP_PDU_REPORT         8       /* v2 */
211
212 #define SNMP_ERR_NOERROR        0
213 #define SNMP_ERR_TOOBIG         1
214 #define SNMP_ERR_NOSUCHNAME     2       /* v1 */
215 #define SNMP_ERR_BADVALUE       3       /* v1 */
216 #define SNMP_ERR_READONLY       4       /* v1 */
217 #define SNMP_ERR_GENERR         5
218 #define SNMP_ERR_NO_ACCESS      6       /* v2 */
219 #define SNMP_ERR_WRONG_TYPE     7       /* v2 */
220 #define SNMP_ERR_WRONG_LENGTH   8       /* v2 */
221 #define SNMP_ERR_WRONG_ENCODING 9       /* v2 */
222 #define SNMP_ERR_WRONG_VALUE    10      /* v2 */
223 #define SNMP_ERR_NO_CREATION    11      /* v2 */
224 #define SNMP_ERR_INCONS_VALUE   12      /* v2 */
225 #define SNMP_ERR_RES_UNAVAIL    13      /* v2 */
226 #define SNMP_ERR_COMMIT_FAILED  14      /* v2 */
227 #define SNMP_ERR_UNDO_FAILED    15      /* v2 */
228 #define SNMP_ERR_AUTH_ERR       16      /* v2 */
229 #define SNMP_ERR_NOT_WRITEABLE  17      /* v2 */
230 #define SNMP_ERR_INCONS_NAME    18      /* v2 */
231
232 #define SNMP_TRAP_COLDSTART     0
233 #define SNMP_TRAP_WARMSTART     1
234 #define SNMP_TRAP_LINKDOWN      2
235 #define SNMP_TRAP_LINKUP        3
236 #define SNMP_TRAP_AUTHENTICATION_FAILURE        4
237 #define SNMP_TRAP_EGP_NEIGHBOR_LOSS     5
238 #define SNMP_TRAP_ENTERPRISE    6
239
240 enum snmp_code {
241         SNMP_CODE_OK = 0,
242         SNMP_CODE_FAILED,
243         SNMP_CODE_BADVERS,
244         SNMP_CODE_BADLEN,
245         SNMP_CODE_BADENC,
246         SNMP_CODE_OORANGE,
247         SNMP_CODE_BADSECLEVEL,
248         SNMP_CODE_NOTINTIME,
249         SNMP_CODE_BADUSER,
250         SNMP_CODE_BADENGINE,
251         SNMP_CODE_BADDIGEST,
252         SNMP_CODE_EDECRYPT
253 };
254
255 #define SNMP_MSG_AUTH_FLAG              0x1
256 #define SNMP_MSG_PRIV_FLAG              0x2
257 #define SNMP_MSG_REPORT_FLAG            0x4
258 #define SNMP_MSG_AUTODISCOVER           0x80
259
260 void snmp_value_free(struct snmp_value *);
261 int snmp_value_parse(const char *, enum snmp_syntax, union snmp_values *);
262 int snmp_value_copy(struct snmp_value *, const struct snmp_value *);
263
264 void snmp_pdu_free(struct snmp_pdu *);
265 void snmp_pdu_init_secparams(struct snmp_pdu *);
266 enum snmp_code snmp_pdu_decode(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *);
267 enum snmp_code snmp_pdu_decode_header(struct asn_buf *, struct snmp_pdu *);
268 enum snmp_code snmp_pdu_decode_scoped(struct asn_buf *, struct snmp_pdu *, int32_t *);
269 enum snmp_code snmp_pdu_encode(struct snmp_pdu *, struct asn_buf *);
270 enum snmp_code snmp_pdu_decode_secmode(struct asn_buf *, struct snmp_pdu *);
271
272 int snmp_pdu_snoop(const struct asn_buf *);
273
274 void snmp_pdu_dump(const struct snmp_pdu *pdu);
275
276 enum snmp_code snmp_passwd_to_keys(struct snmp_user *, char *);
277 enum snmp_code snmp_get_local_keys(struct snmp_user *, uint8_t *, uint32_t);
278 enum snmp_code snmp_calc_keychange(struct snmp_user *, uint8_t *);
279
280 extern void (*snmp_error)(const char *, ...);
281 extern void (*snmp_printf)(const char *, ...);
282
283 #define TRUTH_MK(F) ((F) ? 1 : 2)
284 #define TRUTH_GET(T) (((T) == 1) ? 1 : 0)
285 #define TRUTH_OK(T)  ((T) == 1 || (T) == 2)
286
287 #endif