1f06ca4afSHartmut Brandt.\" 2f06ca4afSHartmut Brandt.\" Copyright (c) 2001-2003 3f06ca4afSHartmut Brandt.\" Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4f06ca4afSHartmut Brandt.\" All rights reserved. 5f06ca4afSHartmut Brandt.\" 6f06ca4afSHartmut Brandt.\" Author: Harti Brandt <harti@freebsd.org> 7f06ca4afSHartmut Brandt.\" 8896052c1SHartmut Brandt.\" Redistribution and use in source and binary forms, with or without 9896052c1SHartmut Brandt.\" modification, are permitted provided that the following conditions 10896052c1SHartmut Brandt.\" are met: 11896052c1SHartmut Brandt.\" 1. Redistributions of source code must retain the above copyright 12896052c1SHartmut Brandt.\" notice, this list of conditions and the following disclaimer. 13f06ca4afSHartmut Brandt.\" 2. Redistributions in binary form must reproduce the above copyright 14f06ca4afSHartmut Brandt.\" notice, this list of conditions and the following disclaimer in the 15f06ca4afSHartmut Brandt.\" documentation and/or other materials provided with the distribution. 16f06ca4afSHartmut Brandt.\" 17896052c1SHartmut Brandt.\" THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18896052c1SHartmut Brandt.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19896052c1SHartmut Brandt.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20896052c1SHartmut Brandt.\" ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 21896052c1SHartmut Brandt.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22896052c1SHartmut Brandt.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23896052c1SHartmut Brandt.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24896052c1SHartmut Brandt.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25896052c1SHartmut Brandt.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26896052c1SHartmut Brandt.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27896052c1SHartmut Brandt.\" SUCH DAMAGE. 28f06ca4afSHartmut Brandt.\" 29896052c1SHartmut Brandt.\" $Begemot: bsnmp/lib/bsnmplib.3,v 1.5 2004/08/06 08:46:52 brandt Exp $ 30f06ca4afSHartmut Brandt.\" 31f06ca4afSHartmut Brandt.Dd August 15, 2002 32f06ca4afSHartmut Brandt.Dt bsnmplib 3 33f06ca4afSHartmut Brandt.Os 34f06ca4afSHartmut Brandt.Sh NAME 35f06ca4afSHartmut Brandt.Nm snmp_value_free , 36f06ca4afSHartmut Brandt.Nm snmp_value_parse , 37f06ca4afSHartmut Brandt.Nm snmp_value_copy , 38f06ca4afSHartmut Brandt.Nm snmp_pdu_free , 39f06ca4afSHartmut Brandt.Nm snmp_code snmp_pdu_decode , 40f06ca4afSHartmut Brandt.Nm snmp_code snmp_pdu_encode , 41f06ca4afSHartmut Brandt.Nm snmp_pdu_dump , 42f06ca4afSHartmut Brandt.Nm TRUTH_MK , 43f06ca4afSHartmut Brandt.Nm TRUTH_GET , 44f06ca4afSHartmut Brandt.Nm TRUTH_OK 45f06ca4afSHartmut Brandt.Nd "SNMP decoding and encoding library" 46f06ca4afSHartmut Brandt.Sh LIBRARY 47f06ca4afSHartmut BrandtBegemot SNMP library 48f06ca4afSHartmut Brandt.Pq libbsnmp, -lbsnmp 49f06ca4afSHartmut Brandt.Sh SYNOPSIS 50f06ca4afSHartmut Brandt.In bsnmp/asn1.h 51f06ca4afSHartmut Brandt.In bsnmp/snmp.h 52f06ca4afSHartmut Brandt.Ft void 53f06ca4afSHartmut Brandt.Fn snmp_value_free "struct snmp_value *value" 54f06ca4afSHartmut Brandt.Ft int 55f06ca4afSHartmut Brandt.Fn snmp_value_parse "const char *buf" "enum snmp_syntax" "union snmp_values *value" 56f06ca4afSHartmut Brandt.Ft int 57f06ca4afSHartmut Brandt.Fn snmp_value_copy "struct snmp_value *to" "const struct snmp_value *from" 58f06ca4afSHartmut Brandt.Ft void 59f06ca4afSHartmut Brandt.Fn snmp_pdu_free "struct snmp_pdu *value" 60f06ca4afSHartmut Brandt.Ft enum snmp_code 61f06ca4afSHartmut Brandt.Fn snmp_pdu_decode "struct asn_buf *buf" "struct snmp_pdu *pdu" "int32_t *ip" 62f06ca4afSHartmut Brandt.Ft enum snmp_code 63f06ca4afSHartmut Brandt.Fn snmp_pdu_encode "struct snmp_pdu *pdu" "struct asn_buf *buf" 64f06ca4afSHartmut Brandt.Ft void 65f06ca4afSHartmut Brandt.Fn snmp_pdu_dump "const struct snmp_pdu *pdu" 66f06ca4afSHartmut Brandt.Ft int 67f06ca4afSHartmut Brandt.Fn TRUTH_MK "F" 68f06ca4afSHartmut Brandt.Ft int 69f06ca4afSHartmut Brandt.Fn TRUTH_GET "T" 70f06ca4afSHartmut Brandt.Ft int 71f06ca4afSHartmut Brandt.Fn TRUTH_OK "T" 72f06ca4afSHartmut Brandt.Sh DESCRIPTION 73f06ca4afSHartmut BrandtThe SNMP library contains routines to handle SNMP version 1 and 2 PDUs. 74f06ca4afSHartmut BrandtThere are two basic structures used throughout the library: 75f06ca4afSHartmut Brandt.Bd -literal -offset indent 76f06ca4afSHartmut Brandtstruct snmp_value { 77f06ca4afSHartmut Brandt struct asn_oid var; 78f06ca4afSHartmut Brandt enum snmp_syntax syntax; 79f06ca4afSHartmut Brandt union snmp_values { 80f06ca4afSHartmut Brandt int32_t integer;/* also integer32 */ 81f06ca4afSHartmut Brandt struct { 82f06ca4afSHartmut Brandt u_int len; 83f06ca4afSHartmut Brandt u_char *octets; 84f06ca4afSHartmut Brandt } octetstring; 85f06ca4afSHartmut Brandt struct asn_oid oid; 86f06ca4afSHartmut Brandt u_char ipaddress[4]; 87f06ca4afSHartmut Brandt u_int32_t uint32; /* also gauge32, counter32, 88f06ca4afSHartmut Brandt unsigned32, timeticks */ 89f06ca4afSHartmut Brandt u_int64_t counter64; 90f06ca4afSHartmut Brandt } v; 91f06ca4afSHartmut Brandt}; 92f06ca4afSHartmut Brandt.Ed 93f06ca4afSHartmut Brandt.Pp 94f06ca4afSHartmut BrandtThis structure represents one variable binding from an SNMP PDU. The 95f06ca4afSHartmut Brandtfield 96f06ca4afSHartmut Brandt.Fa var 97f06ca4afSHartmut Brandtis the ASN.1 of the variable that is bound. 98f06ca4afSHartmut Brandt.Fa syntax 99f06ca4afSHartmut Brandtcontains either the syntax code of the value or an exception code for SNMPv2 100f06ca4afSHartmut Brandtand may be one of: 101f06ca4afSHartmut Brandt.Bd -literal -offset indent 102f06ca4afSHartmut Brandtenum snmp_syntax { 103f06ca4afSHartmut Brandt SNMP_SYNTAX_NULL = 0, 104f06ca4afSHartmut Brandt SNMP_SYNTAX_INTEGER, /* == INTEGER32 */ 105f06ca4afSHartmut Brandt SNMP_SYNTAX_OCTETSTRING, 106f06ca4afSHartmut Brandt SNMP_SYNTAX_OID, 107f06ca4afSHartmut Brandt SNMP_SYNTAX_IPADDRESS, 108f06ca4afSHartmut Brandt SNMP_SYNTAX_COUNTER, 109f06ca4afSHartmut Brandt SNMP_SYNTAX_GAUGE, /* == UNSIGNED32 */ 110f06ca4afSHartmut Brandt SNMP_SYNTAX_TIMETICKS, 111f06ca4afSHartmut Brandt 112f06ca4afSHartmut Brandt /* v2 additions */ 113f06ca4afSHartmut Brandt SNMP_SYNTAX_COUNTER64, 114f06ca4afSHartmut Brandt /* exceptions */ 115f06ca4afSHartmut Brandt SNMP_SYNTAX_NOSUCHOBJECT, 116f06ca4afSHartmut Brandt SNMP_SYNTAX_NOSUCHINSTANCE, 117f06ca4afSHartmut Brandt SNMP_SYNTAX_ENDOFMIBVIEW, 118f06ca4afSHartmut Brandt}; 119f06ca4afSHartmut Brandt.Ed 120f06ca4afSHartmut BrandtThe field 121f06ca4afSHartmut Brandt.Fa v 122f06ca4afSHartmut Brandtholds the actual value depending on 123f06ca4afSHartmut Brandt.Fa syntax . 124f06ca4afSHartmut BrandtNote, that if 125f06ca4afSHartmut Brandt.Fa syntax 126f06ca4afSHartmut Brandtis 127f06ca4afSHartmut Brandt.Li SNMP_SYNTAX_OCTETSTRING 128f06ca4afSHartmut Brandtand 129f06ca4afSHartmut Brandt.Fa v.octetstring.len 130f06ca4afSHartmut Brandtis not zero, 131f06ca4afSHartmut Brandt.Fa v.octetstring.octets 132f06ca4afSHartmut Brandtpoints to a string allocated by 133f06ca4afSHartmut Brandt.Xr malloc 3 . 134f06ca4afSHartmut Brandt.Pp 135f06ca4afSHartmut Brandt.Bd -literal -offset indent 136f06ca4afSHartmut Brandt#define SNMP_COMMUNITY_MAXLEN 128 137f06ca4afSHartmut Brandt#define SNMP_MAX_BINDINGS 100 138f06ca4afSHartmut Brandt 139f06ca4afSHartmut Brandtstruct snmp_pdu { 140f06ca4afSHartmut Brandt char community[SNMP_COMMUNITY_MAXLEN + 1]; 141f06ca4afSHartmut Brandt enum snmp_version version; 142f06ca4afSHartmut Brandt u_int type; 143f06ca4afSHartmut Brandt 144f06ca4afSHartmut Brandt /* trap only */ 145f06ca4afSHartmut Brandt struct asn_oid enterprise; 146f06ca4afSHartmut Brandt u_char agent_addr[4]; 147f06ca4afSHartmut Brandt int32_t generic_trap; 148f06ca4afSHartmut Brandt int32_t specific_trap; 149f06ca4afSHartmut Brandt u_int32_t time_stamp; 150f06ca4afSHartmut Brandt 151f06ca4afSHartmut Brandt /* others */ 152f06ca4afSHartmut Brandt int32_t request_id; 153f06ca4afSHartmut Brandt int32_t error_status; 154f06ca4afSHartmut Brandt int32_t error_index; 155f06ca4afSHartmut Brandt 156f06ca4afSHartmut Brandt /* fixes for encoding */ 157f06ca4afSHartmut Brandt u_char *outer_ptr; 158f06ca4afSHartmut Brandt u_char *pdu_ptr; 159f06ca4afSHartmut Brandt u_char *vars_ptr; 160f06ca4afSHartmut Brandt 161f06ca4afSHartmut Brandt struct snmp_value bindings[SNMP_MAX_BINDINGS]; 162f06ca4afSHartmut Brandt u_int nbindings; 163f06ca4afSHartmut Brandt}; 164f06ca4afSHartmut Brandt.Ed 165f06ca4afSHartmut BrandtThis structure contains a decoded SNMP PDU. 166f06ca4afSHartmut Brandt.Fa version 167f06ca4afSHartmut Brandtis one of 168f06ca4afSHartmut Brandt.Bd -literal -offset indent 169f06ca4afSHartmut Brandtenum snmp_version { 170f06ca4afSHartmut Brandt SNMP_Verr = 0, 171f06ca4afSHartmut Brandt SNMP_V1 = 1, 172f06ca4afSHartmut Brandt SNMP_V2c, 173f06ca4afSHartmut Brandt}; 174f06ca4afSHartmut Brandt.Ed 175f06ca4afSHartmut Brandtand 176f06ca4afSHartmut Brandt.Fa type 177f06ca4afSHartmut Brandtis the type of the PDU. 178f06ca4afSHartmut Brandt.Pp 179f06ca4afSHartmut BrandtThe function 180f06ca4afSHartmut Brandt.Fn snmp_value_free 181f06ca4afSHartmut Brandtis used to free all the dynamic allocated contents of an SNMP value. It does 182f06ca4afSHartmut Brandtnot free the structure pointed to by 183f06ca4afSHartmut Brandt.Fa value 184f06ca4afSHartmut Brandtitself. 185f06ca4afSHartmut Brandt.Pp 186f06ca4afSHartmut BrandtThe function 187f06ca4afSHartmut Brandt.Fn snmp_value_parse 188f06ca4afSHartmut Brandtparses the ASCII representation of an SNMP value into its binary form. 189f06ca4afSHartmut BrandtThis function is mainly used by the configuration file reader of 190f06ca4afSHartmut Brandt.Xr snmpd 1 . 191f06ca4afSHartmut Brandt.Pp 192f06ca4afSHartmut BrandtThe function 193f06ca4afSHartmut Brandt.Fn snmp_value_copy 194f06ca4afSHartmut Brandtmakes a deep copy of the value pointed to by 195f06ca4afSHartmut Brandt.Fa from 196f06ca4afSHartmut Brandtto the structure pointed to by 197f06ca4afSHartmut Brandt.Fa to . 198f06ca4afSHartmut BrandtIt assumes that 199f06ca4afSHartmut Brandt.Fa to 200f06ca4afSHartmut Brandtis uninitialized and will overwrite its previous contents. It does not itself 201f06ca4afSHartmut Brandtallocate the structure pointed to by 202f06ca4afSHartmut Brandt.Fa to . 203f06ca4afSHartmut Brandt.Pp 204f06ca4afSHartmut BrandtThe function 205f06ca4afSHartmut Brandt.Fn snmp_pdu_free 206f06ca4afSHartmut Brandtfrees all the dynamically allocated components of the PDU. It does not itself 207f06ca4afSHartmut Brandtfree the structure pointed to by 208f06ca4afSHartmut Brandt.Fa pdu . 209f06ca4afSHartmut Brandt.Pp 210f06ca4afSHartmut BrandtThe function 211f06ca4afSHartmut Brandt.Fn snmp_pdu_decode 212f06ca4afSHartmut Brandtdecodes the PDU pointed to by 213f06ca4afSHartmut Brandt.Fa buf 214f06ca4afSHartmut Brandtand stores the result into 215f06ca4afSHartmut Brandt.Fa pdu . 216f06ca4afSHartmut BrandtIf an error occurs in a variable binding the (1 based) index of this binding 217f06ca4afSHartmut Brandtis stored in the variable pointed to by 218f06ca4afSHartmut Brandt.Fa ip . 219f06ca4afSHartmut Brandt.Pp 220f06ca4afSHartmut BrandtThe function 221f06ca4afSHartmut Brandt.Fn snmp_pdu_encode 222f06ca4afSHartmut Brandtencodes the PDU 223f06ca4afSHartmut Brandt.Fa pdu 224f06ca4afSHartmut Brandtinto the an octetstring in buffer 225f06ca4afSHartmut Brandt.Fa buf . 226f06ca4afSHartmut Brandt.Pp 227f06ca4afSHartmut BrandtThe function 228f06ca4afSHartmut Brandt.Fn snmp_pdu_dump 229f06ca4afSHartmut Brandtdumps the PDU in a human readable form by calling 230f06ca4afSHartmut Brandt.Fn snmp_printf . 231f06ca4afSHartmut Brandt.Pp 232f06ca4afSHartmut BrandtThe function 233f06ca4afSHartmut Brandt.Fn TRUTH_MK 234f06ca4afSHartmut Brandttakes a C truth value (zero or non-zero) and makes an SNMP truth value (2 or 1). 235f06ca4afSHartmut BrandtThe function 236f06ca4afSHartmut Brandt.Fn TRUTH_GET 237f06ca4afSHartmut Brandttakes an SNMP truth value and makes a C truth value (0 or 1). 238f06ca4afSHartmut BrandtThe function 239f06ca4afSHartmut Brandt.Fn TRUTH_OK 240f06ca4afSHartmut Brandtchecks, whether its argument is a legal SNMP truth value. 241f06ca4afSHartmut Brandt.Sh DIAGNOSTICS 242f06ca4afSHartmut BrandtWhen an error occures in any of the function the function pointed to 243f06ca4afSHartmut Brandtby the global pointer 244f06ca4afSHartmut Brandt.Bd -literal -offset indent 245f06ca4afSHartmut Brandtextern void (*snmp_error)(const char *, ...); 246f06ca4afSHartmut Brandt.Ed 247f06ca4afSHartmut Brandt.Pp 248f06ca4afSHartmut Brandtwith a 249f06ca4afSHartmut Brandt.Xr printf 3 250f06ca4afSHartmut Brandtstyle format string. 251f06ca4afSHartmut BrandtThere is a default error handler in the library that prints a message 252f06ca4afSHartmut Brandtstarting with 253f06ca4afSHartmut Brandt.Sq SNMP: 254f06ca4afSHartmut Brandtfollowed by the error message to standard error. 255f06ca4afSHartmut Brandt.Pp 256f06ca4afSHartmut BrandtThe function pointed to by 257f06ca4afSHartmut Brandt.Bd -literal -offset indent 258f06ca4afSHartmut Brandtextern void (*snmp_printf)(const char *, ...); 259f06ca4afSHartmut Brandt.Ed 260f06ca4afSHartmut Brandt.Pp 261f06ca4afSHartmut Brandtis called by the 262f06ca4afSHartmut Brandt.Fn snmp_pdu_dump 263f06ca4afSHartmut Brandtfunction. 264f06ca4afSHartmut BrandtThe default handler is 265f06ca4afSHartmut Brandt.Xr printf 3 . 266f06ca4afSHartmut Brandt.Sh ERRORS 267f06ca4afSHartmut Brandt.Fn snmp_pdu_decode 268f06ca4afSHartmut Brandtwill return one of the following return codes: 269f06ca4afSHartmut Brandt.Bl -tag -width Er 270f06ca4afSHartmut Brandt.It Bq Er SNMP_CODE_OK 271f06ca4afSHartmut BrandtSuccess. 272f06ca4afSHartmut Brandt.It Bq Er SNMP_CODE_FAILED 273f06ca4afSHartmut BrandtThe ASN.1 coding was wrong. 274f06ca4afSHartmut Brandt.It Bq Er SNMP_CODE_BADLEN 275f06ca4afSHartmut BrandtA variable binding value had a wrong length field. 276f06ca4afSHartmut Brandt.It Bq Er SNMP_CODE_OORANGE 277f06ca4afSHartmut BrandtA variable binding value was out of the allowed range. 278f06ca4afSHartmut Brandt.It Bq Er SNMP_CODE_BADVERS 279f06ca4afSHartmut BrandtThe PDU is of an unsupported version. 280f06ca4afSHartmut Brandt.It Bq Er SNMP_CODE_BADENQ 281f06ca4afSHartmut BrandtThere was an ASN.1 value with an unsupported tag. 282f06ca4afSHartmut Brandt.El 283f06ca4afSHartmut Brandt.Pp 284f06ca4afSHartmut Brandt.Fn snmp_pdu_encode 285f06ca4afSHartmut Brandtwill return one of the following return codes: 286f06ca4afSHartmut Brandt.Bl -tag -width Er 287f06ca4afSHartmut Brandt.It Bq Er SNMP_CODE_OK 288f06ca4afSHartmut BrandtSuccess. 289f06ca4afSHartmut Brandt.It Bq Er SNMP_CODE_FAILED 290f06ca4afSHartmut BrandtEncoding failed. 291f06ca4afSHartmut Brandt.El 292f06ca4afSHartmut Brandt.Sh SEE ALSO 293f06ca4afSHartmut Brandt.Xr snmpd 1 , 294f06ca4afSHartmut Brandt.Xr gensnmptree 1 , 295f06ca4afSHartmut Brandt.Xr bsnmplib 3 296f06ca4afSHartmut Brandt.Xr bsnmpclient 3 , 297f06ca4afSHartmut Brandt.Xr bsnmpagent 3 298f06ca4afSHartmut Brandt.Sh STANDARDS 299f06ca4afSHartmut BrandtThis implementation conforms to the applicable IETF RFCs and ITU-T 300f06ca4afSHartmut Brandtrecommendations. 301f06ca4afSHartmut Brandt.Sh AUTHORS 3028eecd77aSHartmut Brandt.An Hartmut Brandt Aq harti@freebsd.org 303