1 /*
2  * GNET-SNMP -- glib-based SNMP library
3  *
4  * Copyright (c) 2003 Juergen Schoenwaelder
5  * Copyright (c) 1998 Gregory McLean & Jochen Friedrich
6  * Copyright (c) 1990 Dirk Wisse
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  *
22  * $Id: pdu.h 1992 2006-08-22 12:48:31Z schoenw $
23  */
24 
25 #ifndef __GNET_SNMP_PDU_H__
26 #define __GNET_SNMP_PDU_H__
27 
28 #include "ber.h"
29 
30 #define GNET_SNMP_SIZE_OBJECTID		(128)
31 
32 /*
33  * Distinguished SNMP varbind types as defined in RFC 3416.
34  */
35 
36 typedef enum {
37     GNET_SNMP_VARBIND_TYPE_NULL		  = 0,
38     GNET_SNMP_VARBIND_TYPE_OCTETSTRING	  = 1,
39     GNET_SNMP_VARBIND_TYPE_OBJECTID	  = 2,
40     GNET_SNMP_VARBIND_TYPE_IPADDRESS	  = 3,
41     GNET_SNMP_VARBIND_TYPE_INTEGER32	  = 4,
42     GNET_SNMP_VARBIND_TYPE_UNSIGNED32	  = 5,	/* also Gauge32 */
43     GNET_SNMP_VARBIND_TYPE_COUNTER32	  = 6,
44     GNET_SNMP_VARBIND_TYPE_TIMETICKS	  = 7,
45     GNET_SNMP_VARBIND_TYPE_OPAQUE	  = 8,
46     GNET_SNMP_VARBIND_TYPE_COUNTER64	  = 9,
47     GNET_SNMP_VARBIND_TYPE_NOSUCHOBJECT   = 10,
48     GNET_SNMP_VARBIND_TYPE_NOSUCHINSTANCE = 11,
49     GNET_SNMP_VARBIND_TYPE_ENDOFMIBVIEW   = 12
50 } GNetSnmpVarBindType;
51 
52 typedef struct  _GNetSnmpVarBind	GNetSnmpVarBind;
53 
54 struct _GNetSnmpVarBind
55 {
56     guint32		*oid;		/* name of the variable */
57     gsize		oid_len;	/* length of the name */
58     GNetSnmpVarBindType	type;		/* variable type / exception */
59     union {
60 	gint32   i32;			/* 32 bit signed   */
61 	guint32  ui32;			/* 32 bit unsigned */
62 	gint64   i64;			/* 64 bit signed   */
63 	guint64  ui64;			/* 64 bit unsigned */
64 	guint8  *ui8v;			/*  8 bit unsigned vector */
65 	guint32 *ui32v;			/* 32 bit unsigned vector */
66     }			value;		/* value of the variable */
67     gsize		value_len;	/* length of a vector in bytes */
68 };
69 
70 GNetSnmpVarBind* gnet_snmp_varbind_new	(const guint32 *oid,
71 					 const gsize oid_len,
72 					 const GNetSnmpVarBindType type,
73 					 const gpointer value,
74 					 const gsize value_len);
75 void     gnet_snmp_varbind_delete	(GNetSnmpVarBind *vb);
76 
77 gboolean gnet_snmp_ber_enc_varbind	(GNetSnmpBer *ber,
78 					 GNetSnmpVarBind *vb,
79 					 GError **error);
80 gboolean gnet_snmp_ber_enc_varbind_null	(GNetSnmpBer *ber,
81 					 GNetSnmpVarBind *vb,
82 					 GError **error);
83 gboolean gnet_snmp_ber_dec_varbind	(GNetSnmpBer *ber,
84 					 GNetSnmpVarBind **vb,
85 					 GError **error);
86 
87 /*
88  * SNMP VarBindLists are represented as GLists of GNetSnmpVarBinds.
89  * This allows us to use all the nice GList functions to manipulate
90  * and navigate SNMP VarBindLists.
91  */
92 
93 gboolean gnet_snmp_ber_enc_varbind_list	(GNetSnmpBer *ber,
94 					 GList *list,
95 					 GError **error);
96 
97 gboolean gnet_snmp_ber_enc_varbind_list_null(GNetSnmpBer *ber,
98 					     GList *list,
99 					     GError **error);
100 
101 gboolean gnet_snmp_ber_dec_varbind_list	(GNetSnmpBer *ber,
102 					 GList **list,
103 					 GError **error);
104 
105 /*
106  * SNMP protocol operations as defined in RFC 3416.
107  */
108 
109 typedef enum {
110     GNET_SNMP_PDU_GET		= 0,
111     GNET_SNMP_PDU_NEXT		= 1,
112     GNET_SNMP_PDU_RESPONSE	= 2,
113     GNET_SNMP_PDU_SET		= 3,
114     GNET_SNMP_PDU_TRAP		= 4,
115     GNET_SNMP_PDU_BULK		= 5,
116     GNET_SNMP_PDU_INFORM	= 6
117 } GNetSnmpPduType;
118 
119 /*
120  * SNMP protocol operation classes as defined in RFC 3411.
121  */
122 
123 #define GNET_SNMP_PDU_CLASS_READ(p) \
124 	(p == GNET_SNMP_PDU_GET || \
125          p == GNET_SNMP_PDU_NEXT || \
126          p == GNET_SNMP_PDU_BULK)
127 
128 #define GNET_SNMP_PDU_CLASS_WRITE(p) \
129 	(p == GNET_SNMP_PDU_SET)
130 
131 #define GNET_SNMP_PDU_CLASS_RESPONSE(p) \
132 	(p == GNET_SNMP_PDU_RESPONSE)
133 
134 #define GNET_SNMP_PDU_CLASS_NOTIFICATION(p) \
135 	(p == GNET_SNMP_PDU_TRAP || p == GNET_SNMP_PDU_INFORM)
136 
137 /*
138  * SNMP protocol error codes as defined in RFC 3416.
139  * Negative error codes are GNET-SNMP internal codes.
140  */
141 
142 typedef enum {
143     GNET_SNMP_PDU_ERR_DONE		    = -4,
144     GNET_SNMP_PDU_ERR_PROCEDURE		    = -3,
145     GNET_SNMP_PDU_ERR_INTERNAL		    = -2,
146     GNET_SNMP_PDU_ERR_NORESPONSE	    = -1,
147     GNET_SNMP_PDU_ERR_NOERROR		    = 0,
148     GNET_SNMP_PDU_ERR_TOOBIG                = 1,
149     GNET_SNMP_PDU_ERR_NOSUCHNAME            = 2,
150     GNET_SNMP_PDU_ERR_BADVALUE              = 3,
151     GNET_SNMP_PDU_ERR_READONLY              = 4,
152     GNET_SNMP_PDU_ERR_GENERROR              = 5,
153     GNET_SNMP_PDU_ERR_NOACCESS              = 6,
154     GNET_SNMP_PDU_ERR_WRONGTYPE             = 7,
155     GNET_SNMP_PDU_ERR_WRONGLENGTH           = 8,
156     GNET_SNMP_PDU_ERR_WRONGENCODING         = 9,
157     GNET_SNMP_PDU_ERR_WRONGVALUE            = 10,
158     GNET_SNMP_PDU_ERR_NOCREATION            = 11,
159     GNET_SNMP_PDU_ERR_INCONSISTENTVALUE     = 12,
160     GNET_SNMP_PDU_ERR_RESOURCEUNAVAILABLE   = 13,
161     GNET_SNMP_PDU_ERR_COMMITFAILED          = 14,
162     GNET_SNMP_PDU_ERR_UNDOFAILED            = 15,
163     GNET_SNMP_PDU_ERR_AUTHORIZATIONERROR    = 16,
164     GNET_SNMP_PDU_ERR_NOTWRITABLE           = 17,
165     GNET_SNMP_PDU_ERR_INCONSISTENTNAME      = 18
166 } GNetSnmpPduError;
167 
168 /*
169  * SNMPv1 trap PDUs have a slightly different format. This library
170  * implements the notification mappings defined in RFC 2576 so that
171  * applications will always see the SNMPv2c/SNMPv3 notification PDU
172  * format. Also note that the GNetSnmpPdu represents a scoped PDU as
173  * defined in RFC 3411 and RFC 3412.
174  */
175 
176 typedef struct _GNetSnmpPdu	GNetSnmpPdu;
177 
178 struct _GNetSnmpPdu {
179     guchar	   *context_engineid;
180     gsize	    context_engineid_len;
181     guchar         *context_name;
182     gsize           context_name_len;
183     GNetSnmpPduType type;
184     gint32          request_id;
185     gint32          error_status;	/* holds a GNetSnmpError */
186     gint32          error_index;
187     GList          *varbind_list;
188 };
189 
190 /*
191  * The following encoding/decoding functions are for the different SNMP
192  * protocol versions supported by this library.
193  */
194 
195 gboolean gnet_snmp_ber_enc_pdu_v1	(GNetSnmpBer *ber, GNetSnmpPdu *pdu,
196 					 GError **error);
197 gboolean gnet_snmp_ber_dec_pdu_v1	(GNetSnmpBer *ber, GNetSnmpPdu *pdu,
198 					 GError **error);
199 gboolean gnet_snmp_ber_enc_pdu_v2	(GNetSnmpBer *ber, GNetSnmpPdu *pdu,
200 					 GError **error);
201 gboolean gnet_snmp_ber_dec_pdu_v2	(GNetSnmpBer *ber, GNetSnmpPdu *pdu,
202 					 GError **error);
203 gboolean gnet_snmp_ber_enc_pdu_v3	(GNetSnmpBer *ber, GNetSnmpPdu *pdu,
204 					 GError **error);
205 gboolean gnet_snmp_ber_dec_pdu_v3	(GNetSnmpBer *ber, GNetSnmpPdu *pdu,
206 					 GError **error);
207 
208 /* ------------------------ stuff we should get rid off ----------------- */
209 
210 
211 /* SNMP hooks for debugging, profiling, statistics, ... */
212 
213 extern void (*g_snmp_list_decode_hook)(GList *list);
214 extern void (*g_snmp_list_encode_hook)(GList *list);
215 
216 #endif /* __GNET_SNMP_PDU_H__ */
217