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