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	ssize_t         (*recv)(struct tport *, struct port_input *);
197};
198struct transport {
199	struct asn_oid	index;		/* transport table index */
200	TAILQ_ENTRY(transport) link;	/* ... and link */
201	u_int		or_index;	/* registration index */
202
203	struct tport_list table;	/* list of open ports */
204
205	const struct transport_def *vtab;
206};
207
208TAILQ_HEAD(transport_list, transport);
209extern struct transport_list transport_list;
210
211void trans_insert_port(struct transport *, struct tport *);
212void trans_remove_port(struct tport *);
213struct tport *trans_find_port(struct transport *,
214    const struct asn_oid *, u_int);
215struct tport *trans_next_port(struct transport *,
216    const struct asn_oid *, u_int);
217struct tport *trans_first_port(struct transport *);
218struct tport *trans_iter_port(struct transport *,
219    int (*)(struct tport *, intptr_t), intptr_t);
220
221int trans_register(const struct transport_def *, struct transport **);
222int trans_unregister(struct transport *);
223
224/*************************************************************
225 *
226 * SNMPd scalar configuration.
227 */
228struct snmpd {
229	/* transmit buffer size */
230	u_int32_t	txbuf;
231
232	/* receive buffer size */
233	u_int32_t	rxbuf;
234
235	/* disable community table */
236	int		comm_dis;
237
238	/* authentication traps */
239	int		auth_traps;
240
241	/* source address for V1 traps */
242	u_char		trap1addr[4];
243
244	/* version enable flags */
245	uint32_t	version_enable;
246};
247extern struct snmpd snmpd;
248
249#define	VERS_ENABLE_V1	0x00000001
250#define	VERS_ENABLE_V2C	0x00000002
251#define	VERS_ENABLE_V3	0x00000004
252#define	VERS_ENABLE_ALL	(VERS_ENABLE_V1 | VERS_ENABLE_V2C | VERS_ENABLE_V3)
253
254/*
255 * The debug group
256 */
257struct debug {
258	u_int		dump_pdus;
259	u_int		logpri;
260	u_int		evdebug;
261};
262extern struct debug debug;
263
264
265/*
266 * SNMPd statistics table
267 */
268struct snmpd_stats {
269	u_int32_t	inPkts;		/* total packets received */
270	u_int32_t	inBadVersions;	/* unknown version number */
271	u_int32_t	inASNParseErrs;	/* fatal parse errors */
272	u_int32_t	inBadCommunityNames;
273	u_int32_t	inBadCommunityUses;
274	u_int32_t	proxyDrops;	/* dropped by proxy function */
275	u_int32_t	silentDrops;
276
277	u_int32_t	inBadPduTypes;
278	u_int32_t	inTooLong;
279	u_int32_t	noTxbuf;
280	u_int32_t	noRxbuf;
281};
282extern struct snmpd_stats snmpd_stats;
283
284/*
285 * SNMPd Engine
286 */
287extern struct snmp_engine snmpd_engine;
288
289/*
290 * OR Table
291 */
292struct objres {
293	TAILQ_ENTRY(objres) link;
294	u_int		index;
295	struct asn_oid	oid;	/* the resource OID */
296	char		descr[256];
297	u_int32_t	uptime;
298	struct lmodule	*module;
299};
300TAILQ_HEAD(objres_list, objres);
301extern struct objres_list objres_list;
302
303/*
304 * Trap Sink Table
305 */
306struct trapsink {
307	TAILQ_ENTRY(trapsink) link;
308	struct asn_oid	index;
309	u_int		status;
310	int		socket;
311	u_char		comm[SNMP_COMMUNITY_MAXLEN + 1];
312	int		version;
313};
314enum {
315	TRAPSINK_ACTIVE		= 1,
316	TRAPSINK_NOT_IN_SERVICE	= 2,
317	TRAPSINK_NOT_READY	= 3,
318	TRAPSINK_DESTROY	= 6,
319
320	TRAPSINK_V1		= 1,
321	TRAPSINK_V2		= 2,
322};
323TAILQ_HEAD(trapsink_list, trapsink);
324extern struct trapsink_list trapsink_list;
325
326extern const char *syspath;
327
328/* snmpSerialNo */
329extern int32_t snmp_serial_no;
330
331int init_actvals(void);
332
333extern char engine_file[];
334int init_snmpd_engine(void);
335int set_snmpd_engine(void);
336void update_snmpd_engine_time(void);
337
338int read_config(const char *, struct lmodule *);
339int define_macro(const char *name, const char *value);
340
341#define	LOG_ASN1_ERRORS	0x10000000
342#define	LOG_SNMP_ERRORS	0x20000000
343