xref: /freebsd/contrib/bsnmp/lib/snmp.h (revision 2be1a816b9ff69588e55be0a84cbe2a31efc0f2f)
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  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * $Begemot: bsnmp/lib/snmp.h,v 1.30 2004/08/06 08:46:54 brandt Exp $
30  *
31  * Header file for SNMP functions.
32  */
33 #ifndef snmp_h_
34 #define snmp_h_
35 
36 #include <sys/types.h>
37 
38 #define SNMP_COMMUNITY_MAXLEN	128
39 #define SNMP_MAX_BINDINGS	100
40 
41 enum snmp_syntax {
42 	SNMP_SYNTAX_NULL	= 0,
43 	SNMP_SYNTAX_INTEGER,		/* == INTEGER32 */
44 	SNMP_SYNTAX_OCTETSTRING,
45 	SNMP_SYNTAX_OID,
46 	SNMP_SYNTAX_IPADDRESS,
47 	SNMP_SYNTAX_COUNTER,
48 	SNMP_SYNTAX_GAUGE,		/* == UNSIGNED32 */
49 	SNMP_SYNTAX_TIMETICKS,
50 
51 	/* v2 additions */
52 	SNMP_SYNTAX_COUNTER64,
53 	SNMP_SYNTAX_NOSUCHOBJECT,	/* exception */
54 	SNMP_SYNTAX_NOSUCHINSTANCE,	/* exception */
55 	SNMP_SYNTAX_ENDOFMIBVIEW,	/* exception */
56 };
57 
58 struct snmp_value {
59 	struct asn_oid		var;
60 	enum snmp_syntax	syntax;
61 	union snmp_values {
62 	  int32_t		integer;	/* also integer32 */
63 	  struct {
64 	    u_int		len;
65 	    u_char		*octets;
66 	  }			octetstring;
67 	  struct asn_oid	oid;
68 	  u_char		ipaddress[4];
69 	  uint32_t		uint32;		/* also gauge32, counter32,
70 						   unsigned32, timeticks */
71 	  uint64_t		counter64;
72 	}			v;
73 };
74 
75 enum snmp_version {
76 	SNMP_Verr = 0,
77 	SNMP_V1 = 1,
78 	SNMP_V2c,
79 };
80 
81 struct snmp_pdu {
82 	char		community[SNMP_COMMUNITY_MAXLEN + 1];
83 	enum snmp_version version;
84 	u_int		type;
85 
86 	/* trap only */
87 	struct asn_oid	enterprise;
88 	u_char		agent_addr[4];
89 	int32_t		generic_trap;
90 	int32_t		specific_trap;
91 	uint32_t	time_stamp;
92 
93 	/* others */
94 	int32_t		request_id;
95 	int32_t		error_status;
96 	int32_t		error_index;
97 
98 	/* fixes for encoding */
99 	u_char		*outer_ptr;
100 	u_char		*pdu_ptr;
101 	u_char		*vars_ptr;
102 
103 	struct snmp_value bindings[SNMP_MAX_BINDINGS];
104 	u_int		nbindings;
105 };
106 #define snmp_v1_pdu snmp_pdu
107 
108 #define SNMP_PDU_GET		0
109 #define SNMP_PDU_GETNEXT	1
110 #define SNMP_PDU_RESPONSE	2
111 #define SNMP_PDU_SET		3
112 #define SNMP_PDU_TRAP		4	/* v1 */
113 #define SNMP_PDU_GETBULK	5	/* v2 */
114 #define SNMP_PDU_INFORM		6	/* v2 */
115 #define SNMP_PDU_TRAP2		7	/* v2 */
116 #define SNMP_PDU_REPORT		8	/* v2 */
117 
118 #define SNMP_ERR_NOERROR	0
119 #define SNMP_ERR_TOOBIG		1
120 #define SNMP_ERR_NOSUCHNAME	2	/* v1 */
121 #define SNMP_ERR_BADVALUE	3	/* v1 */
122 #define SNMP_ERR_READONLY	4	/* v1 */
123 #define SNMP_ERR_GENERR		5
124 #define SNMP_ERR_NO_ACCESS	6	/* v2 */
125 #define SNMP_ERR_WRONG_TYPE	7	/* v2 */
126 #define SNMP_ERR_WRONG_LENGTH	8	/* v2 */
127 #define SNMP_ERR_WRONG_ENCODING	9	/* v2 */
128 #define SNMP_ERR_WRONG_VALUE	10	/* v2 */
129 #define SNMP_ERR_NO_CREATION	11	/* v2 */
130 #define SNMP_ERR_INCONS_VALUE	12	/* v2 */
131 #define SNMP_ERR_RES_UNAVAIL	13	/* v2 */
132 #define SNMP_ERR_COMMIT_FAILED	14	/* v2 */
133 #define SNMP_ERR_UNDO_FAILED	15	/* v2 */
134 #define SNMP_ERR_AUTH_ERR	16	/* v2 */
135 #define SNMP_ERR_NOT_WRITEABLE	17	/* v2 */
136 #define SNMP_ERR_INCONS_NAME	18	/* v2 */
137 
138 #define SNMP_TRAP_COLDSTART	0
139 #define SNMP_TRAP_WARMSTART	1
140 #define SNMP_TRAP_LINKDOWN	2
141 #define SNMP_TRAP_LINKUP	3
142 #define SNMP_TRAP_AUTHENTICATION_FAILURE	4
143 #define SNMP_TRAP_EGP_NEIGHBOR_LOSS	5
144 #define SNMP_TRAP_ENTERPRISE	6
145 
146 enum snmp_code {
147 	SNMP_CODE_OK = 0,
148 	SNMP_CODE_FAILED,
149 	SNMP_CODE_BADVERS,
150 	SNMP_CODE_BADLEN,
151 	SNMP_CODE_BADENC,
152 	SNMP_CODE_OORANGE,
153 };
154 
155 void snmp_value_free(struct snmp_value *);
156 int snmp_value_parse(const char *, enum snmp_syntax, union snmp_values *);
157 int snmp_value_copy(struct snmp_value *, const struct snmp_value *);
158 
159 void snmp_pdu_free(struct snmp_pdu *);
160 enum snmp_code snmp_pdu_decode(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *);
161 enum snmp_code snmp_pdu_encode(struct snmp_pdu *pdu, struct asn_buf *resp_b);
162 
163 int snmp_pdu_snoop(const struct asn_buf *);
164 
165 void snmp_pdu_dump(const struct snmp_pdu *pdu);
166 
167 extern void (*snmp_error)(const char *, ...);
168 extern void (*snmp_printf)(const char *, ...);
169 
170 #define TRUTH_MK(F) ((F) ? 1 : 2)
171 #define TRUTH_GET(T) (((T) == 1) ? 1 : 0)
172 #define TRUTH_OK(T)  ((T) == 1 || (T) == 2)
173 
174 #endif
175