snmpd.h revision 310903
1/* 2 * Copyright (c) 2001-2003 3 * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4 * All rights reserved. 5 * 6 * Author: Harti Brandt <harti@freebsd.org> 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * $Begemot: bsnmp/snmpd/snmpd.h,v 1.24 2004/08/06 08:47:13 brandt Exp $ 30 * 31 * Private SNMPd data and functions. 32 */ 33 34#ifdef USE_LIBBEGEMOT 35#include <rpoll.h> 36#else 37#include <isc/eventlib.h> 38#endif 39 40#define PATH_SYSCONFIG "/etc:/usr/etc:/usr/local/etc" 41 42#ifdef USE_LIBBEGEMOT 43#define evTimerID int 44#define evFileID int 45#endif 46 47/************************************************************* 48 * 49 * Communities 50 */ 51struct community { 52 struct lmodule *owner; /* who created the community */ 53 u_int private;/* private name for the module */ 54 u_int value; /* value of this community */ 55 u_char * string; /* the community string */ 56 const u_char * descr; /* description */ 57 TAILQ_ENTRY(community) link; 58 59 struct asn_oid index; 60}; 61/* list of all known communities */ 62extern TAILQ_HEAD(community_list, community) community_list; 63 64/************************************************************* 65 * 66 * Request IDs. 67 */ 68struct idrange { 69 u_int type; /* type id */ 70 int32_t base; /* base of this range */ 71 int32_t size; /* size of this range */ 72 int32_t next; /* generator */ 73 struct lmodule *owner; /* owner module */ 74 TAILQ_ENTRY(idrange) link; 75}; 76 77/* list of all known ranges */ 78extern TAILQ_HEAD(idrange_list, idrange) idrange_list; 79 80/* identifier generator */ 81extern u_int next_idrange; 82 83/* request id generator for traps */ 84extern u_int trap_reqid; 85 86/************************************************************* 87 * 88 * Timers 89 */ 90struct timer { 91 void (*func)(void *);/* user function */ 92 void *udata; /* user data */ 93 evTimerID id; /* timer id */ 94 struct lmodule *owner; /* owner of the timer */ 95 LIST_ENTRY(timer) link; 96}; 97 98/* list of all current timers */ 99extern LIST_HEAD(timer_list, timer) timer_list; 100 101 102/************************************************************* 103 * 104 * File descriptors 105 */ 106struct fdesc { 107 int fd; /* the file descriptor */ 108 void (*func)(int, void *);/* user function */ 109 void *udata; /* user data */ 110 evFileID id; /* file id */ 111 struct lmodule *owner; /* owner module of the file */ 112 LIST_ENTRY(fdesc) link; 113}; 114 115/* list of all current selected files */ 116extern LIST_HEAD(fdesc_list, fdesc) fdesc_list; 117 118/************************************************************* 119 * 120 * Loadable modules 121 */ 122# define LM_SECTION_MAX 14 123struct lmodule { 124 char section[LM_SECTION_MAX + 1]; /* and index */ 125 char *path; 126 u_int flags; 127 void *handle; 128 const struct snmp_module *config; 129 130 TAILQ_ENTRY(lmodule) link; 131 TAILQ_ENTRY(lmodule) start; 132 133 struct asn_oid index; 134}; 135#define LM_STARTED 0x0001 136#define LM_ONSTARTLIST 0x0002 137 138extern TAILQ_HEAD(lmodules, lmodule) lmodules; 139 140struct lmodule *lm_load(const char *, const char *); 141void lm_unload(struct lmodule *); 142void lm_start(struct lmodule *); 143 144/************************************************************* 145 * 146 * SNMP ports 147 */ 148/* 149 * Common input stuff 150 */ 151struct port_input { 152 int fd; /* socket */ 153 void *id; /* evSelect handle */ 154 155 int stream : 1; /* stream socket */ 156 int cred : 1; /* want credentials */ 157 158 struct sockaddr *peer; /* last received packet */ 159 socklen_t peerlen; 160 int priv : 1; /* peer is privileged */ 161 162 u_char *buf; /* receive buffer */ 163 size_t buflen; /* buffer length */ 164 size_t length; /* received length */ 165 size_t consumed; /* how many bytes used */ 166}; 167 168struct tport { 169 struct asn_oid index; /* table index of this tp point */ 170 TAILQ_ENTRY(tport) link; /* table link */ 171 struct transport *transport; /* who handles this */ 172}; 173TAILQ_HEAD(tport_list, tport); 174 175int snmpd_input(struct port_input *, struct tport *); 176void snmpd_input_close(struct port_input *); 177 178 179/* 180 * Transport domain 181 */ 182#define TRANS_NAMELEN 64 183 184struct transport_def { 185 const char *name; /* name of this transport */ 186 struct asn_oid id; /* OBJID of this transport */ 187 188 int (*start)(void); 189 int (*stop)(int); 190 191 void (*close_port)(struct tport *); 192 int (*init_port)(struct tport *); 193 194 ssize_t (*send)(struct tport *, const u_char *, size_t, 195 const struct sockaddr *, size_t); 196}; 197struct transport { 198 struct asn_oid index; /* transport table index */ 199 TAILQ_ENTRY(transport) link; /* ... and link */ 200 u_int or_index; /* registration index */ 201 202 struct tport_list table; /* list of open ports */ 203 204 const struct transport_def *vtab; 205}; 206 207TAILQ_HEAD(transport_list, transport); 208extern struct transport_list transport_list; 209 210void trans_insert_port(struct transport *, struct tport *); 211void trans_remove_port(struct tport *); 212struct tport *trans_find_port(struct transport *, 213 const struct asn_oid *, u_int); 214struct tport *trans_next_port(struct transport *, 215 const struct asn_oid *, u_int); 216struct tport *trans_first_port(struct transport *); 217struct tport *trans_iter_port(struct transport *, 218 int (*)(struct tport *, intptr_t), intptr_t); 219 220int trans_register(const struct transport_def *, struct transport **); 221int trans_unregister(struct transport *); 222 223/************************************************************* 224 * 225 * SNMPd scalar configuration. 226 */ 227struct snmpd { 228 /* transmit buffer size */ 229 u_int32_t txbuf; 230 231 /* receive buffer size */ 232 u_int32_t rxbuf; 233 234 /* disable community table */ 235 int comm_dis; 236 237 /* authentication traps */ 238 int auth_traps; 239 240 /* source address for V1 traps */ 241 u_char trap1addr[4]; 242 243 /* version enable flags */ 244 uint32_t version_enable; 245}; 246extern struct snmpd snmpd; 247 248#define VERS_ENABLE_V1 0x00000001 249#define VERS_ENABLE_V2C 0x00000002 250#define VERS_ENABLE_V3 0x00000004 251#define VERS_ENABLE_ALL (VERS_ENABLE_V1 | VERS_ENABLE_V2C | VERS_ENABLE_V3) 252 253/* 254 * The debug group 255 */ 256struct debug { 257 u_int dump_pdus; 258 u_int logpri; 259 u_int evdebug; 260}; 261extern struct debug debug; 262 263 264/* 265 * SNMPd statistics table 266 */ 267struct snmpd_stats { 268 u_int32_t inPkts; /* total packets received */ 269 u_int32_t inBadVersions; /* unknown version number */ 270 u_int32_t inASNParseErrs; /* fatal parse errors */ 271 u_int32_t inBadCommunityNames; 272 u_int32_t inBadCommunityUses; 273 u_int32_t proxyDrops; /* dropped by proxy function */ 274 u_int32_t silentDrops; 275 276 u_int32_t inBadPduTypes; 277 u_int32_t inTooLong; 278 u_int32_t noTxbuf; 279 u_int32_t noRxbuf; 280}; 281extern struct snmpd_stats snmpd_stats; 282 283/* 284 * SNMPd Engine 285 */ 286extern struct snmp_engine snmpd_engine; 287 288/* 289 * OR Table 290 */ 291struct objres { 292 TAILQ_ENTRY(objres) link; 293 u_int index; 294 struct asn_oid oid; /* the resource OID */ 295 char descr[256]; 296 u_int32_t uptime; 297 struct lmodule *module; 298}; 299TAILQ_HEAD(objres_list, objres); 300extern struct objres_list objres_list; 301 302/* 303 * Trap Sink Table 304 */ 305struct trapsink { 306 TAILQ_ENTRY(trapsink) link; 307 struct asn_oid index; 308 u_int status; 309 int socket; 310 u_char comm[SNMP_COMMUNITY_MAXLEN + 1]; 311 int version; 312}; 313enum { 314 TRAPSINK_ACTIVE = 1, 315 TRAPSINK_NOT_IN_SERVICE = 2, 316 TRAPSINK_NOT_READY = 3, 317 TRAPSINK_DESTROY = 6, 318 319 TRAPSINK_V1 = 1, 320 TRAPSINK_V2 = 2, 321}; 322TAILQ_HEAD(trapsink_list, trapsink); 323extern struct trapsink_list trapsink_list; 324 325extern const char *syspath; 326 327/* snmpSerialNo */ 328extern int32_t snmp_serial_no; 329 330int init_actvals(void); 331 332extern char engine_file[]; 333int init_snmpd_engine(void); 334int set_snmpd_engine(void); 335 336int read_config(const char *, struct lmodule *); 337int define_macro(const char *name, const char *value); 338 339#define LOG_ASN1_ERRORS 0x10000000 340#define LOG_SNMP_ERRORS 0x20000000 341