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> 7310901Sngie * 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. 16310901Sngie * 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); 196312264Sngie ssize_t (*recv)(struct tport *, struct port_input *); 197122394Sharti}; 198124861Shartistruct transport { 199124861Sharti struct asn_oid index; /* transport table index */ 200124861Sharti TAILQ_ENTRY(transport) link; /* ... and link */ 201124861Sharti u_int or_index; /* registration index */ 202122394Sharti 203124861Sharti struct tport_list table; /* list of open ports */ 204122394Sharti 205124861Sharti const struct transport_def *vtab; 206124861Sharti}; 207124861Sharti 208124861ShartiTAILQ_HEAD(transport_list, transport); 209124861Shartiextern struct transport_list transport_list; 210124861Sharti 211124861Shartivoid trans_insert_port(struct transport *, struct tport *); 212124861Shartivoid trans_remove_port(struct tport *); 213124861Shartistruct tport *trans_find_port(struct transport *, 214124861Sharti const struct asn_oid *, u_int); 215124861Shartistruct tport *trans_next_port(struct transport *, 216124861Sharti const struct asn_oid *, u_int); 217124861Shartistruct tport *trans_first_port(struct transport *); 218124861Shartistruct tport *trans_iter_port(struct transport *, 219124861Sharti int (*)(struct tport *, intptr_t), intptr_t); 220124861Sharti 221124861Shartiint trans_register(const struct transport_def *, struct transport **); 222124861Shartiint trans_unregister(struct transport *); 223124861Sharti 224122394Sharti/************************************************************* 225122394Sharti * 226122394Sharti * SNMPd scalar configuration. 227122394Sharti */ 228122394Shartistruct snmpd { 229122394Sharti /* transmit buffer size */ 230122394Sharti u_int32_t txbuf; 231122394Sharti 232122394Sharti /* receive buffer size */ 233122394Sharti u_int32_t rxbuf; 234122394Sharti 235122394Sharti /* disable community table */ 236122394Sharti int comm_dis; 237122394Sharti 238122394Sharti /* authentication traps */ 239122394Sharti int auth_traps; 240122394Sharti 241122394Sharti /* source address for V1 traps */ 242122394Sharti u_char trap1addr[4]; 243124861Sharti 244124861Sharti /* version enable flags */ 245124861Sharti uint32_t version_enable; 246122394Sharti}; 247122394Shartiextern struct snmpd snmpd; 248122394Sharti 249124861Sharti#define VERS_ENABLE_V1 0x00000001 250124861Sharti#define VERS_ENABLE_V2C 0x00000002 251216294Ssyrinx#define VERS_ENABLE_V3 0x00000004 252216294Ssyrinx#define VERS_ENABLE_ALL (VERS_ENABLE_V1 | VERS_ENABLE_V2C | VERS_ENABLE_V3) 253124861Sharti 254122394Sharti/* 255122394Sharti * The debug group 256122394Sharti */ 257122394Shartistruct debug { 258122394Sharti u_int dump_pdus; 259122394Sharti u_int logpri; 260122394Sharti u_int evdebug; 261122394Sharti}; 262122394Shartiextern struct debug debug; 263122394Sharti 264122394Sharti 265122394Sharti/* 266122394Sharti * SNMPd statistics table 267122394Sharti */ 268122394Shartistruct snmpd_stats { 269122394Sharti u_int32_t inPkts; /* total packets received */ 270122394Sharti u_int32_t inBadVersions; /* unknown version number */ 271122394Sharti u_int32_t inASNParseErrs; /* fatal parse errors */ 272122394Sharti u_int32_t inBadCommunityNames; 273122394Sharti u_int32_t inBadCommunityUses; 274122394Sharti u_int32_t proxyDrops; /* dropped by proxy function */ 275122394Sharti u_int32_t silentDrops; 276122394Sharti 277122394Sharti u_int32_t inBadPduTypes; 278122394Sharti u_int32_t inTooLong; 279122394Sharti u_int32_t noTxbuf; 280122394Sharti u_int32_t noRxbuf; 281122394Sharti}; 282122394Shartiextern struct snmpd_stats snmpd_stats; 283122394Sharti 284122394Sharti/* 285216294Ssyrinx * SNMPd Engine 286216294Ssyrinx */ 287216294Ssyrinxextern struct snmp_engine snmpd_engine; 288216294Ssyrinx 289216294Ssyrinx/* 290122394Sharti * OR Table 291122394Sharti */ 292122394Shartistruct objres { 293122394Sharti TAILQ_ENTRY(objres) link; 294122394Sharti u_int index; 295122394Sharti struct asn_oid oid; /* the resource OID */ 296122394Sharti char descr[256]; 297122394Sharti u_int32_t uptime; 298122394Sharti struct lmodule *module; 299122394Sharti}; 300122394ShartiTAILQ_HEAD(objres_list, objres); 301122394Shartiextern struct objres_list objres_list; 302122394Sharti 303122394Sharti/* 304122394Sharti * Trap Sink Table 305122394Sharti */ 306122394Shartistruct trapsink { 307122394Sharti TAILQ_ENTRY(trapsink) link; 308122394Sharti struct asn_oid index; 309122394Sharti u_int status; 310122394Sharti int socket; 311299466Scem u_char comm[SNMP_COMMUNITY_MAXLEN + 1]; 312122394Sharti int version; 313122394Sharti}; 314122394Shartienum { 315122394Sharti TRAPSINK_ACTIVE = 1, 316122394Sharti TRAPSINK_NOT_IN_SERVICE = 2, 317122394Sharti TRAPSINK_NOT_READY = 3, 318122394Sharti TRAPSINK_DESTROY = 6, 319122394Sharti 320122394Sharti TRAPSINK_V1 = 1, 321122394Sharti TRAPSINK_V2 = 2, 322122394Sharti}; 323122394ShartiTAILQ_HEAD(trapsink_list, trapsink); 324122394Shartiextern struct trapsink_list trapsink_list; 325122394Sharti 326122394Shartiextern const char *syspath; 327122394Sharti 328122394Sharti/* snmpSerialNo */ 329122394Shartiextern int32_t snmp_serial_no; 330122394Sharti 331122394Shartiint init_actvals(void); 332216294Ssyrinx 333216294Ssyrinxextern char engine_file[]; 334216294Ssyrinxint init_snmpd_engine(void); 335216294Ssyrinxint set_snmpd_engine(void); 336310990Sngievoid update_snmpd_engine_time(void); 337216294Ssyrinx 338122394Shartiint read_config(const char *, struct lmodule *); 339122394Shartiint define_macro(const char *name, const char *value); 340124861Sharti 341124861Sharti#define LOG_ASN1_ERRORS 0x10000000 342124861Sharti#define LOG_SNMP_ERRORS 0x20000000 343