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 */ 51 struct 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 */ 62 extern TAILQ_HEAD(community_list, community) community_list; 63 64 /************************************************************* 65 * 66 * Request IDs. 67 */ 68 struct 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 */ 78 extern TAILQ_HEAD(idrange_list, idrange) idrange_list; 79 80 /* identifier generator */ 81 extern u_int next_idrange; 82 83 /* request id generator for traps */ 84 extern u_int trap_reqid; 85 86 /************************************************************* 87 * 88 * Timers 89 */ 90 struct 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 */ 99 extern LIST_HEAD(timer_list, timer) timer_list; 100 101 102 /************************************************************* 103 * 104 * File descriptors 105 */ 106 struct 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 */ 116 extern LIST_HEAD(fdesc_list, fdesc) fdesc_list; 117 118 /************************************************************* 119 * 120 * Loadable modules 121 */ 122 # define LM_SECTION_MAX 14 123 struct 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 138 extern TAILQ_HEAD(lmodules, lmodule) lmodules; 139 140 struct lmodule *lm_load(const char *, const char *); 141 void lm_unload(struct lmodule *); 142 void lm_start(struct lmodule *); 143 144 /************************************************************* 145 * 146 * SNMP ports 147 */ 148 /* 149 * Common input stuff 150 */ 151 struct 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 168 struct 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 }; 173 TAILQ_HEAD(tport_list, tport); 174 175 int snmpd_input(struct port_input *, struct tport *); 176 void snmpd_input_close(struct port_input *); 177 178 179 /* 180 * Transport domain 181 */ 182 #define TRANS_NAMELEN 64 183 184 struct 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 }; 197 struct 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 207 TAILQ_HEAD(transport_list, transport); 208 extern struct transport_list transport_list; 209 210 void trans_insert_port(struct transport *, struct tport *); 211 void trans_remove_port(struct tport *); 212 struct tport *trans_find_port(struct transport *, 213 const struct asn_oid *, u_int); 214 struct tport *trans_next_port(struct transport *, 215 const struct asn_oid *, u_int); 216 struct tport *trans_first_port(struct transport *); 217 struct tport *trans_iter_port(struct transport *, 218 int (*)(struct tport *, intptr_t), intptr_t); 219 220 int trans_register(const struct transport_def *, struct transport **); 221 int trans_unregister(struct transport *); 222 223 /************************************************************* 224 * 225 * SNMPd scalar configuration. 226 */ 227 struct 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 }; 246 extern 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 */ 256 struct debug { 257 u_int dump_pdus; 258 u_int logpri; 259 u_int evdebug; 260 }; 261 extern struct debug debug; 262 263 264 /* 265 * SNMPd statistics table 266 */ 267 struct 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 }; 281 extern struct snmpd_stats snmpd_stats; 282 283 /* 284 * SNMPd Engine 285 */ 286 extern struct snmp_engine snmpd_engine; 287 288 /* 289 * OR Table 290 */ 291 struct 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 }; 299 TAILQ_HEAD(objres_list, objres); 300 extern struct objres_list objres_list; 301 302 /* 303 * Trap Sink Table 304 */ 305 struct 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 }; 313 enum { 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 }; 322 TAILQ_HEAD(trapsink_list, trapsink); 323 extern struct trapsink_list trapsink_list; 324 325 extern const char *syspath; 326 327 /* snmpSerialNo */ 328 extern int32_t snmp_serial_no; 329 330 int init_actvals(void); 331 332 extern char engine_file[]; 333 int init_snmpd_engine(void); 334 int set_snmpd_engine(void); 335 336 int read_config(const char *, struct lmodule *); 337 int define_macro(const char *name, const char *value); 338 339 #define LOG_ASN1_ERRORS 0x10000000 340 #define LOG_SNMP_ERRORS 0x20000000 341