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