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