1122394Sharti/* 2122394Sharti * Copyright (c) 2001-2003 3122394Sharti * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4122394Sharti * All rights reserved. 5122394Sharti * 6122394Sharti * Author: Harti Brandt <harti@freebsd.org> 7133211Sharti * 8133211Sharti * Redistribution and use in source and binary forms, with or without 9133211Sharti * modification, are permitted provided that the following conditions 10133211Sharti * are met: 11133211Sharti * 1. Redistributions of source code must retain the above copyright 12133211Sharti * notice, this list of conditions and the following disclaimer. 13122394Sharti * 2. Redistributions in binary form must reproduce the above copyright 14122394Sharti * notice, this list of conditions and the following disclaimer in the 15122394Sharti * documentation and/or other materials provided with the distribution. 16133211Sharti * 17133211Sharti * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18133211Sharti * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19133211Sharti * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20133211Sharti * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 21133211Sharti * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22133211Sharti * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23133211Sharti * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24133211Sharti * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25133211Sharti * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26133211Sharti * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27133211Sharti * SUCH DAMAGE. 28122394Sharti * 29133211Sharti * $Begemot: bsnmp/snmpd/snmpd.h,v 1.24 2004/08/06 08:47:13 brandt Exp $ 30122394Sharti * 31122394Sharti * Private SNMPd data and functions. 32122394Sharti */ 33216294Ssyrinx 34124861Sharti#ifdef USE_LIBBEGEMOT 35124861Sharti#include <rpoll.h> 36124861Sharti#else 37122394Sharti#include <isc/eventlib.h> 38124861Sharti#endif 39122394Sharti 40122394Sharti#define PATH_SYSCONFIG "/etc:/usr/etc:/usr/local/etc" 41122394Sharti 42124861Sharti#ifdef USE_LIBBEGEMOT 43124861Sharti#define evTimerID int 44124861Sharti#define evFileID int 45124861Sharti#endif 46124861Sharti 47122394Sharti/************************************************************* 48122394Sharti * 49122394Sharti * Communities 50122394Sharti */ 51122394Shartistruct community { 52122394Sharti struct lmodule *owner; /* who created the community */ 53122394Sharti u_int private;/* private name for the module */ 54122394Sharti u_int value; /* value of this community */ 55122394Sharti u_char * string; /* the community string */ 56122394Sharti const u_char * descr; /* description */ 57122394Sharti TAILQ_ENTRY(community) link; 58122394Sharti 59122394Sharti struct asn_oid index; 60122394Sharti}; 61122394Sharti/* list of all known communities */ 62122394Shartiextern TAILQ_HEAD(community_list, community) community_list; 63122394Sharti 64122394Sharti/************************************************************* 65122394Sharti * 66122394Sharti * Request IDs. 67122394Sharti */ 68122394Shartistruct idrange { 69122394Sharti u_int type; /* type id */ 70122394Sharti int32_t base; /* base of this range */ 71122394Sharti int32_t size; /* size of this range */ 72122394Sharti int32_t next; /* generator */ 73122394Sharti struct lmodule *owner; /* owner module */ 74122394Sharti TAILQ_ENTRY(idrange) link; 75122394Sharti}; 76122394Sharti 77122394Sharti/* list of all known ranges */ 78122394Shartiextern TAILQ_HEAD(idrange_list, idrange) idrange_list; 79122394Sharti 80122394Sharti/* identifier generator */ 81122394Shartiextern u_int next_idrange; 82122394Sharti 83122394Sharti/* request id generator for traps */ 84122394Shartiextern u_int trap_reqid; 85122394Sharti 86122394Sharti/************************************************************* 87122394Sharti * 88122394Sharti * Timers 89122394Sharti */ 90122394Shartistruct timer { 91122394Sharti void (*func)(void *);/* user function */ 92122394Sharti void *udata; /* user data */ 93122394Sharti evTimerID id; /* timer id */ 94122394Sharti struct lmodule *owner; /* owner of the timer */ 95122394Sharti LIST_ENTRY(timer) link; 96122394Sharti}; 97122394Sharti 98122394Sharti/* list of all current timers */ 99122394Shartiextern LIST_HEAD(timer_list, timer) timer_list; 100122394Sharti 101122394Sharti 102122394Sharti/************************************************************* 103122394Sharti * 104122394Sharti * File descriptors 105122394Sharti */ 106122394Shartistruct fdesc { 107122394Sharti int fd; /* the file descriptor */ 108122394Sharti void (*func)(int, void *);/* user function */ 109122394Sharti void *udata; /* user data */ 110122394Sharti evFileID id; /* file id */ 111122394Sharti struct lmodule *owner; /* owner module of the file */ 112122394Sharti LIST_ENTRY(fdesc) link; 113122394Sharti}; 114122394Sharti 115122394Sharti/* list of all current selected files */ 116122394Shartiextern LIST_HEAD(fdesc_list, fdesc) fdesc_list; 117122394Sharti 118122394Sharti/************************************************************* 119122394Sharti * 120122394Sharti * Loadable modules 121122394Sharti */ 122122394Sharti# define LM_SECTION_MAX 14 123122394Shartistruct lmodule { 124122394Sharti char section[LM_SECTION_MAX + 1]; /* and index */ 125122394Sharti char *path; 126122394Sharti u_int flags; 127122394Sharti void *handle; 128122394Sharti const struct snmp_module *config; 129122394Sharti 130122394Sharti TAILQ_ENTRY(lmodule) link; 131122394Sharti TAILQ_ENTRY(lmodule) start; 132122394Sharti 133122394Sharti struct asn_oid index; 134122394Sharti}; 135122394Sharti#define LM_STARTED 0x0001 136122394Sharti#define LM_ONSTARTLIST 0x0002 137122394Sharti 138122394Shartiextern TAILQ_HEAD(lmodules, lmodule) lmodules; 139122394Sharti 140122394Shartistruct lmodule *lm_load(const char *, const char *); 141122394Shartivoid lm_unload(struct lmodule *); 142122394Shartivoid lm_start(struct lmodule *); 143122394Sharti 144122394Sharti/************************************************************* 145122394Sharti * 146122394Sharti * SNMP ports 147122394Sharti */ 148124861Sharti/* 149124861Sharti * Common input stuff 150124861Sharti */ 151124861Shartistruct port_input { 152124861Sharti int fd; /* socket */ 153124861Sharti void *id; /* evSelect handle */ 154122394Sharti 155124861Sharti int stream : 1; /* stream socket */ 156124861Sharti int cred : 1; /* want credentials */ 157122394Sharti 158124861Sharti struct sockaddr *peer; /* last received packet */ 159124861Sharti socklen_t peerlen; 160124861Sharti int priv : 1; /* peer is privileged */ 161122394Sharti 162124861Sharti u_char *buf; /* receive buffer */ 163124861Sharti size_t buflen; /* buffer length */ 164124861Sharti size_t length; /* received length */ 165124861Sharti size_t consumed; /* how many bytes used */ 166124861Sharti}; 167122394Sharti 168124861Shartistruct tport { 169124861Sharti struct asn_oid index; /* table index of this tp point */ 170124861Sharti TAILQ_ENTRY(tport) link; /* table link */ 171124861Sharti struct transport *transport; /* who handles this */ 172122394Sharti}; 173124861ShartiTAILQ_HEAD(tport_list, tport); 174122394Sharti 175124861Shartiint snmpd_input(struct port_input *, struct tport *); 176124861Shartivoid snmpd_input_close(struct port_input *); 177122394Sharti 178122394Sharti 179124861Sharti/* 180124861Sharti * Transport domain 181124861Sharti */ 182124861Sharti#define TRANS_NAMELEN 64 183122394Sharti 184124861Shartistruct transport_def { 185124861Sharti const char *name; /* name of this transport */ 186124861Sharti struct asn_oid id; /* OBJID of this transport */ 187122394Sharti 188124861Sharti int (*start)(void); 189124861Sharti int (*stop)(int); 190124861Sharti 191124861Sharti void (*close_port)(struct tport *); 192124861Sharti int (*init_port)(struct tport *); 193124861Sharti 194124861Sharti ssize_t (*send)(struct tport *, const u_char *, size_t, 195124861Sharti const struct sockaddr *, size_t); 196122394Sharti}; 197124861Shartistruct transport { 198124861Sharti struct asn_oid index; /* transport table index */ 199124861Sharti TAILQ_ENTRY(transport) link; /* ... and link */ 200124861Sharti u_int or_index; /* registration index */ 201122394Sharti 202124861Sharti struct tport_list table; /* list of open ports */ 203122394Sharti 204124861Sharti const struct transport_def *vtab; 205124861Sharti}; 206124861Sharti 207124861ShartiTAILQ_HEAD(transport_list, transport); 208124861Shartiextern struct transport_list transport_list; 209124861Sharti 210124861Shartivoid trans_insert_port(struct transport *, struct tport *); 211124861Shartivoid trans_remove_port(struct tport *); 212124861Shartistruct tport *trans_find_port(struct transport *, 213124861Sharti const struct asn_oid *, u_int); 214124861Shartistruct tport *trans_next_port(struct transport *, 215124861Sharti const struct asn_oid *, u_int); 216124861Shartistruct tport *trans_first_port(struct transport *); 217124861Shartistruct tport *trans_iter_port(struct transport *, 218124861Sharti int (*)(struct tport *, intptr_t), intptr_t); 219124861Sharti 220124861Shartiint trans_register(const struct transport_def *, struct transport **); 221124861Shartiint trans_unregister(struct transport *); 222124861Sharti 223122394Sharti/************************************************************* 224122394Sharti * 225122394Sharti * SNMPd scalar configuration. 226122394Sharti */ 227122394Shartistruct snmpd { 228122394Sharti /* transmit buffer size */ 229122394Sharti u_int32_t txbuf; 230122394Sharti 231122394Sharti /* receive buffer size */ 232122394Sharti u_int32_t rxbuf; 233122394Sharti 234122394Sharti /* disable community table */ 235122394Sharti int comm_dis; 236122394Sharti 237122394Sharti /* authentication traps */ 238122394Sharti int auth_traps; 239122394Sharti 240122394Sharti /* source address for V1 traps */ 241122394Sharti u_char trap1addr[4]; 242124861Sharti 243124861Sharti /* version enable flags */ 244124861Sharti uint32_t version_enable; 245122394Sharti}; 246122394Shartiextern struct snmpd snmpd; 247122394Sharti 248124861Sharti#define VERS_ENABLE_V1 0x00000001 249124861Sharti#define VERS_ENABLE_V2C 0x00000002 250216294Ssyrinx#define VERS_ENABLE_V3 0x00000004 251216294Ssyrinx#define VERS_ENABLE_ALL (VERS_ENABLE_V1 | VERS_ENABLE_V2C | VERS_ENABLE_V3) 252124861Sharti 253122394Sharti/* 254122394Sharti * The debug group 255122394Sharti */ 256122394Shartistruct debug { 257122394Sharti u_int dump_pdus; 258122394Sharti u_int logpri; 259122394Sharti u_int evdebug; 260122394Sharti}; 261122394Shartiextern struct debug debug; 262122394Sharti 263122394Sharti 264122394Sharti/* 265122394Sharti * SNMPd statistics table 266122394Sharti */ 267122394Shartistruct snmpd_stats { 268122394Sharti u_int32_t inPkts; /* total packets received */ 269122394Sharti u_int32_t inBadVersions; /* unknown version number */ 270122394Sharti u_int32_t inASNParseErrs; /* fatal parse errors */ 271122394Sharti u_int32_t inBadCommunityNames; 272122394Sharti u_int32_t inBadCommunityUses; 273122394Sharti u_int32_t proxyDrops; /* dropped by proxy function */ 274122394Sharti u_int32_t silentDrops; 275122394Sharti 276122394Sharti u_int32_t inBadPduTypes; 277122394Sharti u_int32_t inTooLong; 278122394Sharti u_int32_t noTxbuf; 279122394Sharti u_int32_t noRxbuf; 280122394Sharti}; 281122394Shartiextern struct snmpd_stats snmpd_stats; 282122394Sharti 283122394Sharti/* 284216294Ssyrinx * SNMPd Engine 285216294Ssyrinx */ 286216294Ssyrinxextern struct snmp_engine snmpd_engine; 287216294Ssyrinx 288216294Ssyrinx/* 289122394Sharti * OR Table 290122394Sharti */ 291122394Shartistruct objres { 292122394Sharti TAILQ_ENTRY(objres) link; 293122394Sharti u_int index; 294122394Sharti struct asn_oid oid; /* the resource OID */ 295122394Sharti char descr[256]; 296122394Sharti u_int32_t uptime; 297122394Sharti struct lmodule *module; 298122394Sharti}; 299122394ShartiTAILQ_HEAD(objres_list, objres); 300122394Shartiextern struct objres_list objres_list; 301122394Sharti 302122394Sharti/* 303122394Sharti * Trap Sink Table 304122394Sharti */ 305122394Shartistruct trapsink { 306122394Sharti TAILQ_ENTRY(trapsink) link; 307122394Sharti struct asn_oid index; 308122394Sharti u_int status; 309122394Sharti int socket; 310122394Sharti u_char comm[SNMP_COMMUNITY_MAXLEN]; 311122394Sharti int version; 312122394Sharti}; 313122394Shartienum { 314122394Sharti TRAPSINK_ACTIVE = 1, 315122394Sharti TRAPSINK_NOT_IN_SERVICE = 2, 316122394Sharti TRAPSINK_NOT_READY = 3, 317122394Sharti TRAPSINK_DESTROY = 6, 318122394Sharti 319122394Sharti TRAPSINK_V1 = 1, 320122394Sharti TRAPSINK_V2 = 2, 321122394Sharti}; 322122394ShartiTAILQ_HEAD(trapsink_list, trapsink); 323122394Shartiextern struct trapsink_list trapsink_list; 324122394Sharti 325122394Shartiextern const char *syspath; 326122394Sharti 327122394Sharti/* snmpSerialNo */ 328122394Shartiextern int32_t snmp_serial_no; 329122394Sharti 330122394Shartiint init_actvals(void); 331216294Ssyrinx 332216294Ssyrinxextern char engine_file[]; 333216294Ssyrinxint init_snmpd_engine(void); 334216294Ssyrinxint set_snmpd_engine(void); 335216294Ssyrinx 336122394Shartiint read_config(const char *, struct lmodule *); 337122394Shartiint define_macro(const char *name, const char *value); 338124861Sharti 339124861Sharti#define LOG_ASN1_ERRORS 0x10000000 340124861Sharti#define LOG_SNMP_ERRORS 0x20000000 341