bsnmptools.h revision 216295
1204800Sjilles/*- 2204800Sjilles * Copyright (c) 2005-2006 The FreeBSD Project 3204800Sjilles * All rights reserved. 4204800Sjilles * 5204800Sjilles * Author: Shteryana Shopova <syrinx@FreeBSD.org> 6204800Sjilles * 7204800Sjilles * Redistribution of this software and documentation and use in source and 8204800Sjilles * binary forms, with or without modification, are permitted provided that 9204800Sjilles * the following conditions are met: 10204800Sjilles * 11204800Sjilles * 1. Redistributions of source code or documentation must retain the above 12204800Sjilles * copyright notice, this list of conditions and the following disclaimer. 13204800Sjilles * 2. Redistributions in binary form must reproduce the above copyright 14204800Sjilles * notice, this list of conditions and the following disclaimer in the 15204800Sjilles * documentation and/or other materials provided with the distribution. 16204800Sjilles * 17204800Sjilles * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18204800Sjilles * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19204800Sjilles * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20204800Sjilles * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21204800Sjilles * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22204800Sjilles * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23204800Sjilles * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24204800Sjilles * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25204800Sjilles * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26204800Sjilles * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27204800Sjilles * SUCH DAMAGE. 28204800Sjilles * 29204800Sjilles * Helper functions common for all tools. 30204800Sjilles * 31204800Sjilles * $FreeBSD: head/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmptools.h 216295 2010-12-08 14:30:25Z syrinx $ 32204800Sjilles */ 33204800Sjilles 34204800Sjilles#ifndef _BSNMP_TOOLS_H_ 35204800Sjilles#define _BSNMP_TOOLS_H_ 36204800Sjilles 37204800Sjilles/* From asn1.h + 1 byte for trailing zero. */ 38204800Sjilles#define MAX_OCTSTRING_LEN ASN_MAXOCTETSTRING + 1 39204800Sjilles#define MAX_CMD_SYNTAX_LEN 12 40204800Sjilles 41204800Sjilles/* Arbitrary upper limit on node names and function names - gensnmptree.c. */ 42204800Sjilles#define MAXSTR 1000 43207825Sjilles 44204800Sjilles/* Should be enough to fetch the biggest allowed octet string. */ 45204800Sjilles#define MAX_BUFF_SIZE (ASN_MAXOCTETSTRING + 50) 46204800Sjilles 47204800Sjilles#define SNMP_DEFS_DIR "/usr/share/snmp/defs/" 48213738Sobrien#define SNMP_DEFAULT_LOCAL "/var/run/snmpd.sock" 49204800Sjilles 50204800Sjillesenum snmp_access { 51204800Sjilles SNMP_ACCESS_NONE = 0, 52204800Sjilles SNMP_ACCESS_GET, 53204800Sjilles SNMP_ACCESS_SET, 54213738Sobrien SNMP_ACCESS_GETSET, 55204800Sjilles}; 56 57/* A structure for integer-string enumerations. */ 58struct enum_pair { 59 int32_t enum_val; 60 char *enum_str; 61 STAILQ_ENTRY(enum_pair) link; 62}; 63 64STAILQ_HEAD(enum_pairs, enum_pair); 65 66struct enum_type { 67 char *name; 68 uint32_t syntax; 69 int32_t is_enum; 70 int32_t is_bits; 71 struct enum_pairs *snmp_enum; 72 SLIST_ENTRY(enum_type) link; 73}; 74 75SLIST_HEAD(snmp_enum_tc, enum_type); 76 77struct index { 78 enum snmp_tc tc; 79 enum snmp_syntax syntax; 80 struct enum_pairs *snmp_enum; 81 STAILQ_ENTRY(index) link; 82}; 83 84STAILQ_HEAD(snmp_idxlist, index); 85 86struct snmp_index_entry { 87 char *string; 88 uint32_t strlen; 89 struct asn_oid var; 90 struct snmp_idxlist index_list; 91 SLIST_ENTRY(snmp_index_entry) link; 92}; 93 94/* Information needed for oid to string conversion. */ 95struct snmp_oid2str { 96 char *string; 97 uint32_t strlen; 98 enum snmp_tc tc; 99 enum snmp_syntax syntax; 100 enum snmp_access access; 101 struct asn_oid var; 102 /* A pointer to a entry from the table list - OK if NULL. */ 103 struct snmp_index_entry *table_idx; 104 /* 105 * A singly-linked tail queue of all (int, string) pairs - 106 * for INTEGER syntax only. 107 */ 108 struct enum_pairs *snmp_enum; 109 SLIST_ENTRY(snmp_oid2str) link; 110}; 111 112/* A structure to hold each oid input by user. */ 113struct snmp_object { 114 /* Flag - if set, the variable caused error in a previous request. */ 115 int32_t error; 116 /* 117 * A pointer in the mapping lists - not used if OIDs are input as 118 * numericals. 119 */ 120 struct snmp_oid2str *info; 121 /* A snmp value to hold the actual oid, syntax and value. */ 122 struct snmp_value val; 123 SLIST_ENTRY(snmp_object) link; 124}; 125 126struct fname { 127 char *name; 128 int32_t done; 129 struct asn_oid cut; 130 SLIST_ENTRY(fname) link; 131}; 132 133SLIST_HEAD(snmp_mapping, snmp_oid2str); 134SLIST_HEAD(fname_list, fname); 135SLIST_HEAD(snmp_table_index, snmp_index_entry); 136 137/* 138 * Keep a list for every syntax type. 139 */ 140struct snmp_mappings { 141 /* The list containing all non-leaf nodes. */ 142 struct snmp_mapping nodelist; 143 /* INTEGER/INTEGER32 types. */ 144 struct snmp_mapping intlist; 145 /* OCTETSTRING types. */ 146 struct snmp_mapping octlist; 147 /* OID types. */ 148 struct snmp_mapping oidlist; 149 /* IPADDRESS types. */ 150 struct snmp_mapping iplist; 151 /* TIMETICKS types. */ 152 struct snmp_mapping ticklist; 153 /* COUNTER types. */ 154 struct snmp_mapping cntlist; 155 /* GAUGE types. */ 156 struct snmp_mapping gaugelist; 157 /* COUNTER64 types. */ 158 struct snmp_mapping cnt64list; 159 /* ENUM values for oid types. */ 160 struct snmp_mapping enumlist; 161 /* Description of all table entry types. */ 162 struct snmp_table_index tablelist; 163 /* Defined enumerated textual conventions. */ 164 struct snmp_enum_tc tclist; 165}; 166 167struct snmp_toolinfo { 168 uint32_t flags; 169 /* Number of initially input OIDs. */ 170 int32_t objects; 171 /* List of all input OIDs. */ 172 SLIST_HEAD(snmp_objectlist, snmp_object) snmp_objectlist; 173 /* All known OID to string mapping data. */ 174 struct snmp_mappings *mappings; 175 /* A list of .defs filenames to search oid<->string mapping. */ 176 struct fname_list filelist; 177 /* SNMPv3 USM user credentials */ 178 char *passwd; 179}; 180 181/* XXX we might want to get away with this and will need to touch 182 * XXX the MACROS then too */ 183extern struct snmp_toolinfo snmptool; 184 185/* Definitions for some flags' bits. */ 186#define OUTPUT_BITS 0x00000003 /* bits 0-1 for output type */ 187#define NUMERIC_BIT 0x00000004 /* bit 2 for numeric oids */ 188#define RETRY_BIT 0x00000008 /* bit 3 for retry on error responce */ 189#define ERRIGNORE_BIT 0x00000010 /* bit 4 for skip sanity checking */ 190#define ERRIGNORE_BIT 0x00000010 /* bit 4 for skip sanity checking */ 191#define EDISCOVER_BIT 0x00000020 /* bit 5 for SNMP Engine Discovery */ 192#define LOCALKEY_BIT 0x00000040 /* bit 6 for using localized key */ 193 /* 0x00000080 */ /* bit 7 reserverd */ 194#define PDUTYPE_BITS 0x00000f00 /* bits 8-11 for pdu type */ 195 /* 0x0000f000 */ /* bit 12-15 reserverd */ 196#define MAXREP_BITS 0x00ff0000 /* bits 16-23 for max-repetit. value */ 197#define NONREP_BITS 0xff000000 /* bits 24-31 for non-repeaters value */ 198 199#define OUTPUT_SHORT 0x0 200#define OUTPUT_VERBOSE 0x1 201#define OUTPUT_TABULAR 0x2 202#define OUTPUT_QUIET 0x3 203 204/* Macros for playing with flags' bits. */ 205#define SET_OUTPUT(ctx, type) ((ctx)->flags |= ((type) & OUTPUT_BITS)) 206#define GET_OUTPUT(ctx) ((ctx)->flags & OUTPUT_BITS) 207 208#define SET_NUMERIC(ctx) ((ctx)->flags |= NUMERIC_BIT) 209#define ISSET_NUMERIC(ctx) ((ctx)->flags & NUMERIC_BIT) 210 211#define SET_RETRY(ctx) ((ctx)->flags |= RETRY_BIT) 212#define ISSET_RETRY(ctx) ((ctx)->flags & RETRY_BIT) 213 214#define SET_ERRIGNORE(ctx) ((ctx)->flags |= ERRIGNORE_BIT) 215#define ISSET_ERRIGNORE(ctx) ((ctx)->flags & ERRIGNORE_BIT) 216 217#define SET_EDISCOVER(ctx) ((ctx)->flags |= EDISCOVER_BIT) 218#define ISSET_EDISCOVER(ctx) ((ctx)->flags & EDISCOVER_BIT) 219 220#define SET_LOCALKEY(ctx) ((ctx)->flags |= LOCALKEY_BIT) 221#define ISSET_LOCALKEY(ctx) ((ctx)->flags & LOCALKEY_BIT) 222 223#define SET_PDUTYPE(ctx, type) (((ctx)->flags |= (((type) & 0xf) << 8))) 224#define GET_PDUTYPE(ctx) (((ctx)->flags & PDUTYPE_BITS) >> 8) 225 226#define SET_MAXREP(ctx, i) (((ctx)->flags |= (((i) & 0xff) << 16))) 227#define GET_MAXREP(ctx) (((ctx)->flags & MAXREP_BITS) >> 16) 228 229#define SET_NONREP(ctx, i) (((ctx)->flags |= (((i) & 0xff) << 24))) 230#define GET_NONREP(ctx) (((ctx)->flags & NONREP_BITS) >> 24) 231 232 233extern const struct asn_oid IsoOrgDod_OID; 234 235int snmptool_init(struct snmp_toolinfo *); 236int32_t snmp_import_file(struct snmp_toolinfo *, struct fname *); 237int32_t snmp_import_all(struct snmp_toolinfo *); 238int32_t add_filename(struct snmp_toolinfo *, const char *, 239 const struct asn_oid *, int32_t); 240void free_filelist(struct snmp_toolinfo *); 241void snmp_tool_freeall(struct snmp_toolinfo *); 242void snmp_import_dump(int); 243 244/* bsnmpmap.c */ 245struct snmp_mappings *snmp_mapping_init(void); 246int32_t snmp_mapping_free(struct snmp_toolinfo *); 247void snmp_index_listfree(struct snmp_idxlist *); 248void snmp_dump_oid2str(struct snmp_oid2str *); 249int32_t snmp_node_insert(struct snmp_toolinfo *, struct snmp_oid2str *); 250int32_t snmp_leaf_insert(struct snmp_toolinfo *, struct snmp_oid2str *); 251int32_t snmp_enum_insert(struct snmp_toolinfo *, struct snmp_oid2str *); 252struct enum_pairs *enum_pairs_init(void); 253void enum_pairs_free(struct enum_pairs *); 254void snmp_mapping_entryfree(struct snmp_oid2str *); 255int32_t enum_pair_insert(struct enum_pairs *, int32_t, char *); 256char *enum_string_lookup(struct enum_pairs *, int32_t); 257int32_t enum_number_lookup(struct enum_pairs *, char *); 258int32_t snmp_syntax_insert(struct snmp_idxlist *, struct enum_pairs *, 259 enum snmp_syntax, enum snmp_tc); 260int32_t snmp_table_insert(struct snmp_toolinfo *, struct snmp_index_entry *); 261 262struct enum_type *snmp_enumtc_init(char *); 263void snmp_enumtc_free(struct enum_type *); 264void snmp_enumtc_insert(struct snmp_toolinfo *, struct enum_type *); 265struct enum_type *snmp_enumtc_lookup(struct snmp_toolinfo *, char *); 266 267void snmp_mapping_dump(struct snmp_toolinfo *); 268int32_t snmp_lookup_leafstring(struct snmp_toolinfo *, struct snmp_object *); 269int32_t snmp_lookup_enumstring(struct snmp_toolinfo *, struct snmp_object *); 270int32_t snmp_lookup_oidstring(struct snmp_toolinfo *, struct snmp_object *); 271int32_t snmp_lookup_nonleaf_string(struct snmp_toolinfo *, struct snmp_object *); 272int32_t snmp_lookup_allstring(struct snmp_toolinfo *, struct snmp_object *); 273int32_t snmp_lookup_nodestring(struct snmp_toolinfo *, struct snmp_object *); 274int32_t snmp_lookup_oidall(struct snmp_toolinfo *, struct snmp_object *, char *); 275int32_t snmp_lookup_enumoid(struct snmp_toolinfo *, struct snmp_object *, char *); 276int32_t snmp_lookup_oid(struct snmp_toolinfo *, struct snmp_object *, char *); 277 278/* Functions parsing common options for all tools. */ 279int32_t parse_server(char *); 280int32_t parse_timeout(char *); 281int32_t parse_retry(char *); 282int32_t parse_version(char *); 283int32_t parse_local_path(char *); 284int32_t parse_buflen(char *); 285int32_t parse_debug(void); 286int32_t parse_discovery(struct snmp_toolinfo *); 287int32_t parse_local_key(struct snmp_toolinfo *); 288int32_t parse_num_oids(struct snmp_toolinfo *); 289int32_t parse_file(struct snmp_toolinfo *, char *); 290int32_t parse_include(struct snmp_toolinfo *, char *); 291int32_t parse_output(struct snmp_toolinfo *, char *); 292int32_t parse_errors(struct snmp_toolinfo *); 293int32_t parse_skip_access(struct snmp_toolinfo *); 294int32_t parse_authentication(struct snmp_toolinfo *, char *); 295int32_t parse_privacy(struct snmp_toolinfo *, char *); 296int32_t parse_context(struct snmp_toolinfo *, char *); 297int32_t parse_user_security(struct snmp_toolinfo *, char *); 298 299typedef int32_t (*snmp_verify_inoid_f) (struct snmp_toolinfo *, 300 struct snmp_object *, char *); 301int32_t snmp_object_add(struct snmp_toolinfo *, snmp_verify_inoid_f, char *); 302int32_t snmp_object_remove(struct snmp_toolinfo *, struct asn_oid *oid); 303int32_t snmp_object_seterror(struct snmp_toolinfo *, struct snmp_value *, 304 int32_t); 305 306enum snmp_syntax parse_syntax(char *); 307char *snmp_parse_suboid(char *, struct asn_oid *); 308char *snmp_parse_index(struct snmp_toolinfo *, char *, struct snmp_object *); 309int32_t snmp_parse_numoid(char *, struct asn_oid *); 310int32_t snmp_suboid_append(struct asn_oid *, asn_subid_t); 311int32_t snmp_suboid_pop(struct asn_oid *); 312 313typedef int32_t (*snmp_verify_vbind_f) (struct snmp_toolinfo *, 314 struct snmp_pdu *, struct snmp_object *); 315typedef int32_t (*snmp_add_vbind_f) (struct snmp_pdu *, struct snmp_object *); 316int32_t snmp_pdu_add_bindings(struct snmp_toolinfo *, snmp_verify_vbind_f, 317 snmp_add_vbind_f, struct snmp_pdu *, int32_t); 318 319int32_t snmp_parse_get_resp(struct snmp_pdu *, struct snmp_pdu *); 320int32_t snmp_parse_getbulk_resp(struct snmp_pdu *, struct snmp_pdu *); 321int32_t snmp_parse_getnext_resp(struct snmp_pdu *, struct snmp_pdu *); 322int32_t snmp_parse_resp(struct snmp_pdu *, struct snmp_pdu *); 323int32_t snmp_output_numval(struct snmp_toolinfo *, struct snmp_value *, 324 struct snmp_oid2str *); 325void snmp_output_val(struct snmp_value *); 326int32_t snmp_output_resp(struct snmp_toolinfo *, struct snmp_pdu *); 327void snmp_output_err_resp(struct snmp_toolinfo *, struct snmp_pdu *); 328void snmp_output_engine(void); 329void snmp_output_keys(void); 330 331#endif /* _BSNMP_TOOLS_H_ */ 332