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