PageRenderTime 46ms CodeModel.GetById 16ms app.highlight 24ms RepoModel.GetById 1ms app.codeStats 1ms

/contrib/bsnmp/lib/snmp.h

https://bitbucket.org/freebsd/freebsd-head/
C++ Header | 284 lines | 199 code | 37 blank | 48 comment | 4 complexity | d84e4a924b1a79ab9d3cbba9e9788683 MD5 | raw file
  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 SNMP_COMMUNITY_MAXLEN		128
 46#define SNMP_MAX_BINDINGS		100
 47#define	SNMP_CONTEXT_NAME_SIZ		(32 + 1)
 48#define	SNMP_ENGINE_ID_SIZ		32
 49#define	SNMP_TIME_WINDOW		150
 50
 51enum snmp_syntax {
 52	SNMP_SYNTAX_NULL	= 0,
 53	SNMP_SYNTAX_INTEGER,		/* == INTEGER32 */
 54	SNMP_SYNTAX_OCTETSTRING,
 55	SNMP_SYNTAX_OID,
 56	SNMP_SYNTAX_IPADDRESS,
 57	SNMP_SYNTAX_COUNTER,
 58	SNMP_SYNTAX_GAUGE,		/* == UNSIGNED32 */
 59	SNMP_SYNTAX_TIMETICKS,
 60
 61	/* v2 additions */
 62	SNMP_SYNTAX_COUNTER64,
 63	SNMP_SYNTAX_NOSUCHOBJECT,	/* exception */
 64	SNMP_SYNTAX_NOSUCHINSTANCE,	/* exception */
 65	SNMP_SYNTAX_ENDOFMIBVIEW,	/* exception */
 66};
 67
 68struct snmp_value {
 69	struct asn_oid		var;
 70	enum snmp_syntax	syntax;
 71	union snmp_values {
 72	  int32_t		integer;	/* also integer32 */
 73	  struct {
 74	    u_int		len;
 75	    u_char		*octets;
 76	  }			octetstring;
 77	  struct asn_oid	oid;
 78	  u_char		ipaddress[4];
 79	  uint32_t		uint32;		/* also gauge32, counter32,
 80						   unsigned32, timeticks */
 81	  uint64_t		counter64;
 82	}			v;
 83};
 84
 85enum snmp_version {
 86	SNMP_Verr = 0,
 87	SNMP_V1 = 1,
 88	SNMP_V2c = 2,
 89	SNMP_V3,
 90};
 91
 92#define	SNMP_MPM_SNMP_V1		0
 93#define	SNMP_MPM_SNMP_V2c		1
 94#define	SNMP_MPM_SNMP_V3		3
 95
 96#define	SNMP_ADM_STR32_SIZ		(32 + 1)
 97#define	SNMP_AUTH_KEY_SIZ		40
 98#define	SNMP_PRIV_KEY_SIZ		32
 99#define	SNMP_USM_AUTH_SIZE		12
100#define	SNMP_USM_PRIV_SIZE		8
101#define	SNMP_AUTH_HMACMD5_KEY_SIZ	16
102#define	SNMP_AUTH_HMACSHA_KEY_SIZ	20
103#define	SNMP_PRIV_AES_KEY_SIZ		16
104#define	SNMP_PRIV_DES_KEY_SIZ		8
105
106
107enum snmp_secmodel {
108	SNMP_SECMODEL_ANY = 0,
109	SNMP_SECMODEL_SNMPv1 = 1,
110	SNMP_SECMODEL_SNMPv2c = 2,
111	SNMP_SECMODEL_USM = 3,
112	SNMP_SECMODEL_UNKNOWN
113};
114
115enum snmp_usm_level {
116	SNMP_noAuthNoPriv = 1,
117	SNMP_authNoPriv = 2,
118	SNMP_authPriv = 3
119};
120
121enum snmp_authentication {
122	SNMP_AUTH_NOAUTH = 0,
123	SNMP_AUTH_HMAC_MD5,
124	SNMP_AUTH_HMAC_SHA
125};
126
127enum snmp_privacy {
128	SNMP_PRIV_NOPRIV = 0,
129	SNMP_PRIV_DES = 1,
130	SNMP_PRIV_AES
131};
132
133struct snmp_engine {
134	uint8_t			engine_id[SNMP_ENGINE_ID_SIZ];
135	uint32_t		engine_len;
136	int32_t			engine_boots;
137	int32_t			engine_time;
138	int32_t			max_msg_size;
139};
140
141struct snmp_user {
142	char				sec_name[SNMP_ADM_STR32_SIZ];
143	enum snmp_authentication	auth_proto;
144	enum snmp_privacy		priv_proto;
145	uint8_t				auth_key[SNMP_AUTH_KEY_SIZ];
146	uint8_t				priv_key[SNMP_PRIV_KEY_SIZ];
147};
148
149struct snmp_pdu {
150	char			community[SNMP_COMMUNITY_MAXLEN + 1];
151	enum snmp_version	version;
152	u_int			type;
153
154	/* SNMPv3 PDU header fields */
155	int32_t			identifier;
156	uint8_t			flags;
157	int32_t			security_model;
158	struct snmp_engine	engine;
159
160	/* Associated USM user parameters */
161	struct snmp_user	user;
162	uint8_t			msg_digest[SNMP_USM_AUTH_SIZE];
163	uint8_t			msg_salt[SNMP_USM_PRIV_SIZE];
164
165	/*  View-based Access Model */
166	/* XXX: put in separate structure - conflicts with struct snmp_context */
167	uint32_t		context_engine_len;
168	uint8_t			context_engine[SNMP_ENGINE_ID_SIZ];
169	char			context_name[SNMP_CONTEXT_NAME_SIZ];
170
171	/* trap only */
172	struct asn_oid		enterprise;
173	u_char			agent_addr[4];
174	int32_t			generic_trap;
175	int32_t			specific_trap;
176	uint32_t		time_stamp;
177
178	/* others */
179	int32_t			request_id;
180	int32_t			error_status;
181	int32_t			error_index;
182
183	/* fixes for encoding */
184	size_t			outer_len;
185	size_t			scoped_len;
186	u_char			*outer_ptr;
187	u_char			*digest_ptr;
188	u_char			*encrypted_ptr;
189	u_char			*scoped_ptr;
190	u_char			*pdu_ptr;
191	u_char			*vars_ptr;
192
193
194	struct snmp_value	bindings[SNMP_MAX_BINDINGS];
195	u_int			nbindings;
196};
197#define snmp_v1_pdu snmp_pdu
198
199#define SNMP_PDU_GET		0
200#define SNMP_PDU_GETNEXT	1
201#define SNMP_PDU_RESPONSE	2
202#define SNMP_PDU_SET		3
203#define SNMP_PDU_TRAP		4	/* v1 */
204#define SNMP_PDU_GETBULK	5	/* v2 */
205#define SNMP_PDU_INFORM		6	/* v2 */
206#define SNMP_PDU_TRAP2		7	/* v2 */
207#define SNMP_PDU_REPORT		8	/* v2 */
208
209#define SNMP_ERR_NOERROR	0
210#define SNMP_ERR_TOOBIG		1
211#define SNMP_ERR_NOSUCHNAME	2	/* v1 */
212#define SNMP_ERR_BADVALUE	3	/* v1 */
213#define SNMP_ERR_READONLY	4	/* v1 */
214#define SNMP_ERR_GENERR		5
215#define SNMP_ERR_NO_ACCESS	6	/* v2 */
216#define SNMP_ERR_WRONG_TYPE	7	/* v2 */
217#define SNMP_ERR_WRONG_LENGTH	8	/* v2 */
218#define SNMP_ERR_WRONG_ENCODING	9	/* v2 */
219#define SNMP_ERR_WRONG_VALUE	10	/* v2 */
220#define SNMP_ERR_NO_CREATION	11	/* v2 */
221#define SNMP_ERR_INCONS_VALUE	12	/* v2 */
222#define SNMP_ERR_RES_UNAVAIL	13	/* v2 */
223#define SNMP_ERR_COMMIT_FAILED	14	/* v2 */
224#define SNMP_ERR_UNDO_FAILED	15	/* v2 */
225#define SNMP_ERR_AUTH_ERR	16	/* v2 */
226#define SNMP_ERR_NOT_WRITEABLE	17	/* v2 */
227#define SNMP_ERR_INCONS_NAME	18	/* v2 */
228
229#define SNMP_TRAP_COLDSTART	0
230#define SNMP_TRAP_WARMSTART	1
231#define SNMP_TRAP_LINKDOWN	2
232#define SNMP_TRAP_LINKUP	3
233#define SNMP_TRAP_AUTHENTICATION_FAILURE	4
234#define SNMP_TRAP_EGP_NEIGHBOR_LOSS	5
235#define SNMP_TRAP_ENTERPRISE	6
236
237enum snmp_code {
238	SNMP_CODE_OK = 0,
239	SNMP_CODE_FAILED,
240	SNMP_CODE_BADVERS,
241	SNMP_CODE_BADLEN,
242	SNMP_CODE_BADENC,
243	SNMP_CODE_OORANGE,
244	SNMP_CODE_BADSECLEVEL,
245	SNMP_CODE_NOTINTIME,
246	SNMP_CODE_BADUSER,
247	SNMP_CODE_BADENGINE,
248	SNMP_CODE_BADDIGEST,
249	SNMP_CODE_EDECRYPT
250};
251
252#define	SNMP_MSG_AUTH_FLAG		0x1
253#define	SNMP_MSG_PRIV_FLAG		0x2
254#define	SNMP_MSG_REPORT_FLAG		0x4
255#define	SNMP_MSG_AUTODISCOVER		0x80
256
257void snmp_value_free(struct snmp_value *);
258int snmp_value_parse(const char *, enum snmp_syntax, union snmp_values *);
259int snmp_value_copy(struct snmp_value *, const struct snmp_value *);
260
261void snmp_pdu_free(struct snmp_pdu *);
262void snmp_pdu_init_secparams(struct snmp_pdu *);
263enum snmp_code snmp_pdu_decode(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *);
264enum snmp_code snmp_pdu_decode_header(struct asn_buf *, struct snmp_pdu *);
265enum snmp_code snmp_pdu_decode_scoped(struct asn_buf *, struct snmp_pdu *, int32_t *);
266enum snmp_code snmp_pdu_encode(struct snmp_pdu *, struct asn_buf *);
267enum snmp_code snmp_pdu_decode_secmode(struct asn_buf *, struct snmp_pdu *);
268
269int snmp_pdu_snoop(const struct asn_buf *);
270
271void snmp_pdu_dump(const struct snmp_pdu *pdu);
272
273enum snmp_code snmp_passwd_to_keys(struct snmp_user *, char *);
274enum snmp_code snmp_get_local_keys(struct snmp_user *, uint8_t *, uint32_t);
275enum snmp_code snmp_calc_keychange(struct snmp_user *, uint8_t *);
276
277extern void (*snmp_error)(const char *, ...);
278extern void (*snmp_printf)(const char *, ...);
279
280#define TRUTH_MK(F) ((F) ? 1 : 2)
281#define TRUTH_GET(T) (((T) == 1) ? 1 : 0)
282#define TRUTH_OK(T)  ((T) == 1 || (T) == 2)
283
284#endif