1f06ca4afSHartmut Brandt /* 2f06ca4afSHartmut Brandt * Copyright (c) 2001-2003 3f06ca4afSHartmut Brandt * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4f06ca4afSHartmut Brandt * All rights reserved. 5f06ca4afSHartmut Brandt * 6f06ca4afSHartmut Brandt * Author: Harti Brandt <harti@freebsd.org> 7f06ca4afSHartmut Brandt * 8896052c1SHartmut Brandt * Redistribution and use in source and binary forms, with or without 9896052c1SHartmut Brandt * modification, are permitted provided that the following conditions 10896052c1SHartmut Brandt * are met: 11896052c1SHartmut Brandt * 1. Redistributions of source code must retain the above copyright 12896052c1SHartmut Brandt * notice, this list of conditions and the following disclaimer. 13f06ca4afSHartmut Brandt * 2. Redistributions in binary form must reproduce the above copyright 14f06ca4afSHartmut Brandt * notice, this list of conditions and the following disclaimer in the 15f06ca4afSHartmut Brandt * documentation and/or other materials provided with the distribution. 16f06ca4afSHartmut Brandt * 17896052c1SHartmut Brandt * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18896052c1SHartmut Brandt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19896052c1SHartmut Brandt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20896052c1SHartmut Brandt * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 21896052c1SHartmut Brandt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22896052c1SHartmut Brandt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23896052c1SHartmut Brandt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24896052c1SHartmut Brandt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25896052c1SHartmut Brandt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26896052c1SHartmut Brandt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27896052c1SHartmut Brandt * SUCH DAMAGE. 28f06ca4afSHartmut Brandt * 29896052c1SHartmut Brandt * $Begemot: bsnmp/snmpd/snmpd.h,v 1.24 2004/08/06 08:47:13 brandt Exp $ 30f06ca4afSHartmut Brandt * 31f06ca4afSHartmut Brandt * Private SNMPd data and functions. 32f06ca4afSHartmut Brandt */ 33135f7de5SShteryana Shopova 3470af00a1SHartmut Brandt #ifdef USE_LIBBEGEMOT 3570af00a1SHartmut Brandt #include <rpoll.h> 3670af00a1SHartmut Brandt #else 37f06ca4afSHartmut Brandt #include <isc/eventlib.h> 3870af00a1SHartmut Brandt #endif 39f06ca4afSHartmut Brandt 40f06ca4afSHartmut Brandt #define PATH_SYSCONFIG "/etc:/usr/etc:/usr/local/etc" 41f06ca4afSHartmut Brandt 4270af00a1SHartmut Brandt #ifdef USE_LIBBEGEMOT 4370af00a1SHartmut Brandt #define evTimerID int 4470af00a1SHartmut Brandt #define evFileID int 4570af00a1SHartmut Brandt #endif 4670af00a1SHartmut Brandt 47f06ca4afSHartmut Brandt /************************************************************* 48f06ca4afSHartmut Brandt * 49f06ca4afSHartmut Brandt * Communities 50f06ca4afSHartmut Brandt */ 51f06ca4afSHartmut Brandt struct community { 52f06ca4afSHartmut Brandt struct lmodule *owner; /* who created the community */ 53f06ca4afSHartmut Brandt u_int private;/* private name for the module */ 54f06ca4afSHartmut Brandt u_int value; /* value of this community */ 55f06ca4afSHartmut Brandt u_char * string; /* the community string */ 56f06ca4afSHartmut Brandt const u_char * descr; /* description */ 57f06ca4afSHartmut Brandt TAILQ_ENTRY(community) link; 58f06ca4afSHartmut Brandt 59f06ca4afSHartmut Brandt struct asn_oid index; 60f06ca4afSHartmut Brandt }; 61f06ca4afSHartmut Brandt /* list of all known communities */ 62f06ca4afSHartmut Brandt extern TAILQ_HEAD(community_list, community) community_list; 63f06ca4afSHartmut Brandt 64f06ca4afSHartmut Brandt /************************************************************* 65f06ca4afSHartmut Brandt * 66f06ca4afSHartmut Brandt * Request IDs. 67f06ca4afSHartmut Brandt */ 68f06ca4afSHartmut Brandt struct idrange { 69f06ca4afSHartmut Brandt u_int type; /* type id */ 70f06ca4afSHartmut Brandt int32_t base; /* base of this range */ 71f06ca4afSHartmut Brandt int32_t size; /* size of this range */ 72f06ca4afSHartmut Brandt int32_t next; /* generator */ 73f06ca4afSHartmut Brandt struct lmodule *owner; /* owner module */ 74f06ca4afSHartmut Brandt TAILQ_ENTRY(idrange) link; 75f06ca4afSHartmut Brandt }; 76f06ca4afSHartmut Brandt 77f06ca4afSHartmut Brandt /* list of all known ranges */ 78f06ca4afSHartmut Brandt extern TAILQ_HEAD(idrange_list, idrange) idrange_list; 79f06ca4afSHartmut Brandt 80f06ca4afSHartmut Brandt /* identifier generator */ 81f06ca4afSHartmut Brandt extern u_int next_idrange; 82f06ca4afSHartmut Brandt 83f06ca4afSHartmut Brandt /* request id generator for traps */ 84f06ca4afSHartmut Brandt extern u_int trap_reqid; 85f06ca4afSHartmut Brandt 86f06ca4afSHartmut Brandt /************************************************************* 87f06ca4afSHartmut Brandt * 88f06ca4afSHartmut Brandt * Timers 89f06ca4afSHartmut Brandt */ 90f06ca4afSHartmut Brandt struct timer { 91f06ca4afSHartmut Brandt void (*func)(void *);/* user function */ 92f06ca4afSHartmut Brandt void *udata; /* user data */ 93f06ca4afSHartmut Brandt evTimerID id; /* timer id */ 94f06ca4afSHartmut Brandt struct lmodule *owner; /* owner of the timer */ 95f06ca4afSHartmut Brandt LIST_ENTRY(timer) link; 96f06ca4afSHartmut Brandt }; 97f06ca4afSHartmut Brandt 98f06ca4afSHartmut Brandt /* list of all current timers */ 99f06ca4afSHartmut Brandt extern LIST_HEAD(timer_list, timer) timer_list; 100f06ca4afSHartmut Brandt 101f06ca4afSHartmut Brandt 102f06ca4afSHartmut Brandt /************************************************************* 103f06ca4afSHartmut Brandt * 104f06ca4afSHartmut Brandt * File descriptors 105f06ca4afSHartmut Brandt */ 106f06ca4afSHartmut Brandt struct fdesc { 107f06ca4afSHartmut Brandt int fd; /* the file descriptor */ 108f06ca4afSHartmut Brandt void (*func)(int, void *);/* user function */ 109f06ca4afSHartmut Brandt void *udata; /* user data */ 110f06ca4afSHartmut Brandt evFileID id; /* file id */ 111f06ca4afSHartmut Brandt struct lmodule *owner; /* owner module of the file */ 112f06ca4afSHartmut Brandt LIST_ENTRY(fdesc) link; 113f06ca4afSHartmut Brandt }; 114f06ca4afSHartmut Brandt 115f06ca4afSHartmut Brandt /* list of all current selected files */ 116f06ca4afSHartmut Brandt extern LIST_HEAD(fdesc_list, fdesc) fdesc_list; 117f06ca4afSHartmut Brandt 118f06ca4afSHartmut Brandt /************************************************************* 119f06ca4afSHartmut Brandt * 120f06ca4afSHartmut Brandt * Loadable modules 121f06ca4afSHartmut Brandt */ 122f06ca4afSHartmut Brandt # define LM_SECTION_MAX 14 123f06ca4afSHartmut Brandt struct lmodule { 124f06ca4afSHartmut Brandt char section[LM_SECTION_MAX + 1]; /* and index */ 125f06ca4afSHartmut Brandt char *path; 126f06ca4afSHartmut Brandt u_int flags; 127f06ca4afSHartmut Brandt void *handle; 128f06ca4afSHartmut Brandt const struct snmp_module *config; 129f06ca4afSHartmut Brandt 130f06ca4afSHartmut Brandt TAILQ_ENTRY(lmodule) link; 131f06ca4afSHartmut Brandt TAILQ_ENTRY(lmodule) start; 132f06ca4afSHartmut Brandt 133f06ca4afSHartmut Brandt struct asn_oid index; 134f06ca4afSHartmut Brandt }; 135f06ca4afSHartmut Brandt #define LM_STARTED 0x0001 136f06ca4afSHartmut Brandt #define LM_ONSTARTLIST 0x0002 137f06ca4afSHartmut Brandt 138f06ca4afSHartmut Brandt extern TAILQ_HEAD(lmodules, lmodule) lmodules; 139f06ca4afSHartmut Brandt 140f06ca4afSHartmut Brandt struct lmodule *lm_load(const char *, const char *); 141f06ca4afSHartmut Brandt void lm_unload(struct lmodule *); 142f06ca4afSHartmut Brandt void lm_start(struct lmodule *); 143f06ca4afSHartmut Brandt 144f06ca4afSHartmut Brandt /************************************************************* 145f06ca4afSHartmut Brandt * 146f06ca4afSHartmut Brandt * SNMP ports 147f06ca4afSHartmut Brandt */ 14870af00a1SHartmut Brandt /* 14970af00a1SHartmut Brandt * Common input stuff 15070af00a1SHartmut Brandt */ 15170af00a1SHartmut Brandt struct port_input { 15270af00a1SHartmut Brandt int fd; /* socket */ 153f06ca4afSHartmut Brandt void *id; /* evSelect handle */ 154f06ca4afSHartmut Brandt 155b740e025SDimitry Andric u_int stream : 1; /* stream socket */ 156b740e025SDimitry Andric u_int cred : 1; /* want credentials */ 157f06ca4afSHartmut Brandt 15870af00a1SHartmut Brandt struct sockaddr *peer; /* last received packet */ 15970af00a1SHartmut Brandt socklen_t peerlen; 160b740e025SDimitry Andric u_int priv : 1; /* peer is privileged */ 161f06ca4afSHartmut Brandt 16270af00a1SHartmut Brandt u_char *buf; /* receive buffer */ 16370af00a1SHartmut Brandt size_t buflen; /* buffer length */ 16470af00a1SHartmut Brandt size_t length; /* received length */ 16570af00a1SHartmut Brandt size_t consumed; /* how many bytes used */ 166f06ca4afSHartmut Brandt }; 167f06ca4afSHartmut Brandt 16870af00a1SHartmut Brandt struct tport { 16970af00a1SHartmut Brandt struct asn_oid index; /* table index of this tp point */ 17070af00a1SHartmut Brandt TAILQ_ENTRY(tport) link; /* table link */ 17170af00a1SHartmut Brandt struct transport *transport; /* who handles this */ 172f06ca4afSHartmut Brandt }; 17370af00a1SHartmut Brandt TAILQ_HEAD(tport_list, tport); 174f06ca4afSHartmut Brandt 17570af00a1SHartmut Brandt int snmpd_input(struct port_input *, struct tport *); 17670af00a1SHartmut Brandt void snmpd_input_close(struct port_input *); 17704d17814SAndrey V. Elsukov void snmpd_input_init(struct port_input *); 17870af00a1SHartmut Brandt 17970af00a1SHartmut Brandt /* 18070af00a1SHartmut Brandt * Transport domain 18170af00a1SHartmut Brandt */ 18270af00a1SHartmut Brandt #define TRANS_NAMELEN 64 18370af00a1SHartmut Brandt 18470af00a1SHartmut Brandt struct transport_def { 18570af00a1SHartmut Brandt const char *name; /* name of this transport */ 18670af00a1SHartmut Brandt struct asn_oid id; /* OBJID of this transport */ 18770af00a1SHartmut Brandt 18870af00a1SHartmut Brandt int (*start)(void); 18970af00a1SHartmut Brandt int (*stop)(int); 19070af00a1SHartmut Brandt 19170af00a1SHartmut Brandt void (*close_port)(struct tport *); 19270af00a1SHartmut Brandt int (*init_port)(struct tport *); 19370af00a1SHartmut Brandt 19470af00a1SHartmut Brandt ssize_t (*send)(struct tport *, const u_char *, size_t, 19570af00a1SHartmut Brandt const struct sockaddr *, size_t); 1968d7f605bSEnji Cooper ssize_t (*recv)(struct tport *, struct port_input *); 19704d17814SAndrey V. Elsukov 19804d17814SAndrey V. Elsukov /** send via a multi-socket port */ 19904d17814SAndrey V. Elsukov ssize_t (*send2)(struct tport *, const u_char *, size_t, 20004d17814SAndrey V. Elsukov struct port_input *); 20170af00a1SHartmut Brandt }; 20270af00a1SHartmut Brandt struct transport { 20370af00a1SHartmut Brandt struct asn_oid index; /* transport table index */ 20470af00a1SHartmut Brandt TAILQ_ENTRY(transport) link; /* ... and link */ 20570af00a1SHartmut Brandt u_int or_index; /* registration index */ 20670af00a1SHartmut Brandt 20770af00a1SHartmut Brandt struct tport_list table; /* list of open ports */ 20870af00a1SHartmut Brandt 20970af00a1SHartmut Brandt const struct transport_def *vtab; 21070af00a1SHartmut Brandt }; 21170af00a1SHartmut Brandt 21270af00a1SHartmut Brandt TAILQ_HEAD(transport_list, transport); 21370af00a1SHartmut Brandt extern struct transport_list transport_list; 21470af00a1SHartmut Brandt 21570af00a1SHartmut Brandt void trans_insert_port(struct transport *, struct tport *); 21670af00a1SHartmut Brandt void trans_remove_port(struct tport *); 21770af00a1SHartmut Brandt struct tport *trans_find_port(struct transport *, 21870af00a1SHartmut Brandt const struct asn_oid *, u_int); 21970af00a1SHartmut Brandt struct tport *trans_next_port(struct transport *, 22070af00a1SHartmut Brandt const struct asn_oid *, u_int); 22170af00a1SHartmut Brandt struct tport *trans_first_port(struct transport *); 22270af00a1SHartmut Brandt struct tport *trans_iter_port(struct transport *, 22370af00a1SHartmut Brandt int (*)(struct tport *, intptr_t), intptr_t); 22470af00a1SHartmut Brandt 22570af00a1SHartmut Brandt int trans_register(const struct transport_def *, struct transport **); 22670af00a1SHartmut Brandt int trans_unregister(struct transport *); 227f06ca4afSHartmut Brandt 228f06ca4afSHartmut Brandt /************************************************************* 229f06ca4afSHartmut Brandt * 230f06ca4afSHartmut Brandt * SNMPd scalar configuration. 231f06ca4afSHartmut Brandt */ 232f06ca4afSHartmut Brandt struct snmpd { 233f06ca4afSHartmut Brandt /* transmit buffer size */ 234f06ca4afSHartmut Brandt u_int32_t txbuf; 235f06ca4afSHartmut Brandt 236f06ca4afSHartmut Brandt /* receive buffer size */ 237f06ca4afSHartmut Brandt u_int32_t rxbuf; 238f06ca4afSHartmut Brandt 239f06ca4afSHartmut Brandt /* disable community table */ 240f06ca4afSHartmut Brandt int comm_dis; 241f06ca4afSHartmut Brandt 242f06ca4afSHartmut Brandt /* authentication traps */ 243f06ca4afSHartmut Brandt int auth_traps; 244f06ca4afSHartmut Brandt 245f06ca4afSHartmut Brandt /* source address for V1 traps */ 246f06ca4afSHartmut Brandt u_char trap1addr[4]; 24770af00a1SHartmut Brandt 24870af00a1SHartmut Brandt /* version enable flags */ 24970af00a1SHartmut Brandt uint32_t version_enable; 250f06ca4afSHartmut Brandt }; 251f06ca4afSHartmut Brandt extern struct snmpd snmpd; 252f06ca4afSHartmut Brandt 25370af00a1SHartmut Brandt #define VERS_ENABLE_V1 0x00000001 25470af00a1SHartmut Brandt #define VERS_ENABLE_V2C 0x00000002 255135f7de5SShteryana Shopova #define VERS_ENABLE_V3 0x00000004 256135f7de5SShteryana Shopova #define VERS_ENABLE_ALL (VERS_ENABLE_V1 | VERS_ENABLE_V2C | VERS_ENABLE_V3) 25770af00a1SHartmut Brandt 258f06ca4afSHartmut Brandt /* 259f06ca4afSHartmut Brandt * The debug group 260f06ca4afSHartmut Brandt */ 261f06ca4afSHartmut Brandt struct debug { 262f06ca4afSHartmut Brandt u_int dump_pdus; 263f06ca4afSHartmut Brandt u_int logpri; 264f06ca4afSHartmut Brandt u_int evdebug; 265f06ca4afSHartmut Brandt }; 266f06ca4afSHartmut Brandt extern struct debug debug; 267f06ca4afSHartmut Brandt 268f06ca4afSHartmut Brandt 269f06ca4afSHartmut Brandt /* 270f06ca4afSHartmut Brandt * SNMPd statistics table 271f06ca4afSHartmut Brandt */ 272f06ca4afSHartmut Brandt struct snmpd_stats { 273f06ca4afSHartmut Brandt u_int32_t inPkts; /* total packets received */ 274f06ca4afSHartmut Brandt u_int32_t inBadVersions; /* unknown version number */ 275f06ca4afSHartmut Brandt u_int32_t inASNParseErrs; /* fatal parse errors */ 276f06ca4afSHartmut Brandt u_int32_t inBadCommunityNames; 277f06ca4afSHartmut Brandt u_int32_t inBadCommunityUses; 278f06ca4afSHartmut Brandt u_int32_t proxyDrops; /* dropped by proxy function */ 279f06ca4afSHartmut Brandt u_int32_t silentDrops; 280f06ca4afSHartmut Brandt 281f06ca4afSHartmut Brandt u_int32_t inBadPduTypes; 282f06ca4afSHartmut Brandt u_int32_t inTooLong; 283f06ca4afSHartmut Brandt u_int32_t noTxbuf; 284f06ca4afSHartmut Brandt u_int32_t noRxbuf; 285f06ca4afSHartmut Brandt }; 286f06ca4afSHartmut Brandt extern struct snmpd_stats snmpd_stats; 287f06ca4afSHartmut Brandt 288f06ca4afSHartmut Brandt /* 289135f7de5SShteryana Shopova * SNMPd Engine 290135f7de5SShteryana Shopova */ 291135f7de5SShteryana Shopova extern struct snmp_engine snmpd_engine; 292135f7de5SShteryana Shopova 293135f7de5SShteryana Shopova /* 294f06ca4afSHartmut Brandt * OR Table 295f06ca4afSHartmut Brandt */ 296f06ca4afSHartmut Brandt struct objres { 297f06ca4afSHartmut Brandt TAILQ_ENTRY(objres) link; 298f06ca4afSHartmut Brandt u_int index; 299f06ca4afSHartmut Brandt struct asn_oid oid; /* the resource OID */ 300f06ca4afSHartmut Brandt char descr[256]; 301f06ca4afSHartmut Brandt u_int32_t uptime; 302f06ca4afSHartmut Brandt struct lmodule *module; 303f06ca4afSHartmut Brandt }; 304f06ca4afSHartmut Brandt TAILQ_HEAD(objres_list, objres); 305f06ca4afSHartmut Brandt extern struct objres_list objres_list; 306f06ca4afSHartmut Brandt 307f06ca4afSHartmut Brandt /* 308f06ca4afSHartmut Brandt * Trap Sink Table 309f06ca4afSHartmut Brandt */ 310f06ca4afSHartmut Brandt struct trapsink { 311f06ca4afSHartmut Brandt TAILQ_ENTRY(trapsink) link; 312f06ca4afSHartmut Brandt struct asn_oid index; 313f06ca4afSHartmut Brandt u_int status; 314f06ca4afSHartmut Brandt int socket; 3154aa1608aSConrad Meyer u_char comm[SNMP_COMMUNITY_MAXLEN + 1]; 316f06ca4afSHartmut Brandt int version; 317f06ca4afSHartmut Brandt }; 318f06ca4afSHartmut Brandt enum { 319f06ca4afSHartmut Brandt TRAPSINK_ACTIVE = 1, 320f06ca4afSHartmut Brandt TRAPSINK_NOT_IN_SERVICE = 2, 321f06ca4afSHartmut Brandt TRAPSINK_NOT_READY = 3, 322f06ca4afSHartmut Brandt TRAPSINK_DESTROY = 6, 323f06ca4afSHartmut Brandt 324f06ca4afSHartmut Brandt TRAPSINK_V1 = 1, 325f06ca4afSHartmut Brandt TRAPSINK_V2 = 2, 326f06ca4afSHartmut Brandt }; 327f06ca4afSHartmut Brandt TAILQ_HEAD(trapsink_list, trapsink); 328f06ca4afSHartmut Brandt extern struct trapsink_list trapsink_list; 329f06ca4afSHartmut Brandt 330f06ca4afSHartmut Brandt extern const char *syspath; 331f06ca4afSHartmut Brandt 332f06ca4afSHartmut Brandt /* snmpSerialNo */ 333f06ca4afSHartmut Brandt extern int32_t snmp_serial_no; 334f06ca4afSHartmut Brandt 335f06ca4afSHartmut Brandt int init_actvals(void); 336135f7de5SShteryana Shopova 337135f7de5SShteryana Shopova extern char engine_file[]; 338135f7de5SShteryana Shopova int init_snmpd_engine(void); 339135f7de5SShteryana Shopova int set_snmpd_engine(void); 34088cdfafaSEnji Cooper void update_snmpd_engine_time(void); 341135f7de5SShteryana Shopova 342f06ca4afSHartmut Brandt int read_config(const char *, struct lmodule *); 343f06ca4afSHartmut Brandt int define_macro(const char *name, const char *value); 34470af00a1SHartmut Brandt 34570af00a1SHartmut Brandt #define LOG_ASN1_ERRORS 0x10000000 34670af00a1SHartmut Brandt #define LOG_SNMP_ERRORS 0x20000000 347