1122394Sharti/*
2122394Sharti * Copyright (c) 2001-2003
3122394Sharti *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4122394Sharti *	All rights reserved.
5122394Sharti *
6122394Sharti * Author: Harti Brandt <harti@freebsd.org>
7310901Sngie *
8133211Sharti * Redistribution and use in source and binary forms, with or without
9133211Sharti * modification, are permitted provided that the following conditions
10133211Sharti * are met:
11133211Sharti * 1. Redistributions of source code must retain the above copyright
12133211Sharti *    notice, this list of conditions and the following disclaimer.
13122394Sharti * 2. Redistributions in binary form must reproduce the above copyright
14122394Sharti *    notice, this list of conditions and the following disclaimer in the
15122394Sharti *    documentation and/or other materials provided with the distribution.
16310901Sngie *
17133211Sharti * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18133211Sharti * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19133211Sharti * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20133211Sharti * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21133211Sharti * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22133211Sharti * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23133211Sharti * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24133211Sharti * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25133211Sharti * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26133211Sharti * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27133211Sharti * SUCH DAMAGE.
28122394Sharti *
29133211Sharti * $Begemot: bsnmp/snmpd/snmpd.h,v 1.24 2004/08/06 08:47:13 brandt Exp $
30122394Sharti *
31122394Sharti * Private SNMPd data and functions.
32122394Sharti */
33216294Ssyrinx
34124861Sharti#ifdef USE_LIBBEGEMOT
35124861Sharti#include <rpoll.h>
36124861Sharti#else
37122394Sharti#include <isc/eventlib.h>
38124861Sharti#endif
39122394Sharti
40122394Sharti#define PATH_SYSCONFIG "/etc:/usr/etc:/usr/local/etc"
41122394Sharti
42124861Sharti#ifdef USE_LIBBEGEMOT
43124861Sharti#define	evTimerID	int
44124861Sharti#define	evFileID	int
45124861Sharti#endif
46124861Sharti
47122394Sharti/*************************************************************
48122394Sharti *
49122394Sharti * Communities
50122394Sharti */
51122394Shartistruct community {
52122394Sharti	struct lmodule *owner;	/* who created the community */
53122394Sharti	u_int		private;/* private name for the module */
54122394Sharti	u_int		value;	/* value of this community */
55122394Sharti	u_char *	string;	/* the community string */
56122394Sharti	const u_char *	descr;	/* description */
57122394Sharti	TAILQ_ENTRY(community) link;
58122394Sharti
59122394Sharti	struct asn_oid	index;
60122394Sharti};
61122394Sharti/* list of all known communities */
62122394Shartiextern TAILQ_HEAD(community_list, community) community_list;
63122394Sharti
64122394Sharti/*************************************************************
65122394Sharti *
66122394Sharti * Request IDs.
67122394Sharti */
68122394Shartistruct idrange {
69122394Sharti	u_int		type;	/* type id */
70122394Sharti	int32_t		base;	/* base of this range */
71122394Sharti	int32_t		size;	/* size of this range */
72122394Sharti	int32_t		next;	/* generator */
73122394Sharti	struct lmodule *owner;	/* owner module */
74122394Sharti	TAILQ_ENTRY(idrange) link;
75122394Sharti};
76122394Sharti
77122394Sharti/* list of all known ranges */
78122394Shartiextern TAILQ_HEAD(idrange_list, idrange) idrange_list;
79122394Sharti
80122394Sharti/* identifier generator */
81122394Shartiextern u_int next_idrange;
82122394Sharti
83122394Sharti/* request id generator for traps */
84122394Shartiextern u_int trap_reqid;
85122394Sharti
86122394Sharti/*************************************************************
87122394Sharti *
88122394Sharti * Timers
89122394Sharti */
90122394Shartistruct timer {
91122394Sharti	void	(*func)(void *);/* user function */
92122394Sharti	void	*udata;		/* user data */
93122394Sharti	evTimerID id;		/* timer id */
94122394Sharti	struct lmodule *owner;	/* owner of the timer */
95122394Sharti	LIST_ENTRY(timer) link;
96122394Sharti};
97122394Sharti
98122394Sharti/* list of all current timers */
99122394Shartiextern LIST_HEAD(timer_list, timer) timer_list;
100122394Sharti
101122394Sharti
102122394Sharti/*************************************************************
103122394Sharti *
104122394Sharti * File descriptors
105122394Sharti */
106122394Shartistruct fdesc {
107122394Sharti	int	fd;		/* the file descriptor */
108122394Sharti	void	(*func)(int, void *);/* user function */
109122394Sharti	void	*udata;		/* user data */
110122394Sharti	evFileID id;		/* file id */
111122394Sharti	struct lmodule *owner;	/* owner module of the file */
112122394Sharti	LIST_ENTRY(fdesc) link;
113122394Sharti};
114122394Sharti
115122394Sharti/* list of all current selected files */
116122394Shartiextern LIST_HEAD(fdesc_list, fdesc) fdesc_list;
117122394Sharti
118122394Sharti/*************************************************************
119122394Sharti *
120122394Sharti * Loadable modules
121122394Sharti */
122122394Sharti# define LM_SECTION_MAX	14
123122394Shartistruct lmodule {
124122394Sharti	char		section[LM_SECTION_MAX + 1]; /* and index */
125122394Sharti	char		*path;
126122394Sharti	u_int		flags;
127122394Sharti	void		*handle;
128122394Sharti	const struct snmp_module *config;
129122394Sharti
130122394Sharti	TAILQ_ENTRY(lmodule) link;
131122394Sharti	TAILQ_ENTRY(lmodule) start;
132122394Sharti
133122394Sharti	struct asn_oid	index;
134122394Sharti};
135122394Sharti#define LM_STARTED	0x0001
136122394Sharti#define LM_ONSTARTLIST	0x0002
137122394Sharti
138122394Shartiextern TAILQ_HEAD(lmodules, lmodule) lmodules;
139122394Sharti
140122394Shartistruct lmodule *lm_load(const char *, const char *);
141122394Shartivoid lm_unload(struct lmodule *);
142122394Shartivoid lm_start(struct lmodule *);
143122394Sharti
144122394Sharti/*************************************************************
145122394Sharti *
146122394Sharti * SNMP ports
147122394Sharti */
148124861Sharti/*
149124861Sharti * Common input stuff
150124861Sharti */
151124861Shartistruct port_input {
152124861Sharti	int		fd;		/* socket */
153124861Sharti	void		*id;		/* evSelect handle */
154122394Sharti
155124861Sharti	int		stream : 1;	/* stream socket */
156124861Sharti	int		cred : 1;	/* want credentials */
157122394Sharti
158124861Sharti	struct sockaddr	*peer;		/* last received packet */
159124861Sharti	socklen_t	peerlen;
160124861Sharti	int		priv : 1;	/* peer is privileged */
161122394Sharti
162124861Sharti	u_char		*buf;		/* receive buffer */
163124861Sharti	size_t		buflen;		/* buffer length */
164124861Sharti	size_t		length;		/* received length */
165124861Sharti	size_t		consumed;	/* how many bytes used */
166124861Sharti};
167122394Sharti
168124861Shartistruct tport {
169124861Sharti	struct asn_oid	index;		/* table index of this tp point */
170124861Sharti	TAILQ_ENTRY(tport) link;	/* table link */
171124861Sharti	struct transport *transport;	/* who handles this */
172122394Sharti};
173124861ShartiTAILQ_HEAD(tport_list, tport);
174122394Sharti
175124861Shartiint snmpd_input(struct port_input *, struct tport *);
176124861Shartivoid snmpd_input_close(struct port_input *);
177122394Sharti
178122394Sharti
179124861Sharti/*
180124861Sharti * Transport domain
181124861Sharti */
182124861Sharti#define TRANS_NAMELEN	64
183122394Sharti
184124861Shartistruct transport_def {
185124861Sharti	const char	*name;		/* name of this transport */
186124861Sharti	struct asn_oid	id;		/* OBJID of this transport */
187122394Sharti
188124861Sharti	int		(*start)(void);
189124861Sharti	int		(*stop)(int);
190124861Sharti
191124861Sharti	void		(*close_port)(struct tport *);
192124861Sharti	int		(*init_port)(struct tport *);
193124861Sharti
194124861Sharti	ssize_t		(*send)(struct tport *, const u_char *, size_t,
195124861Sharti			    const struct sockaddr *, size_t);
196312264Sngie	ssize_t         (*recv)(struct tport *, struct port_input *);
197122394Sharti};
198124861Shartistruct transport {
199124861Sharti	struct asn_oid	index;		/* transport table index */
200124861Sharti	TAILQ_ENTRY(transport) link;	/* ... and link */
201124861Sharti	u_int		or_index;	/* registration index */
202122394Sharti
203124861Sharti	struct tport_list table;	/* list of open ports */
204122394Sharti
205124861Sharti	const struct transport_def *vtab;
206124861Sharti};
207124861Sharti
208124861ShartiTAILQ_HEAD(transport_list, transport);
209124861Shartiextern struct transport_list transport_list;
210124861Sharti
211124861Shartivoid trans_insert_port(struct transport *, struct tport *);
212124861Shartivoid trans_remove_port(struct tport *);
213124861Shartistruct tport *trans_find_port(struct transport *,
214124861Sharti    const struct asn_oid *, u_int);
215124861Shartistruct tport *trans_next_port(struct transport *,
216124861Sharti    const struct asn_oid *, u_int);
217124861Shartistruct tport *trans_first_port(struct transport *);
218124861Shartistruct tport *trans_iter_port(struct transport *,
219124861Sharti    int (*)(struct tport *, intptr_t), intptr_t);
220124861Sharti
221124861Shartiint trans_register(const struct transport_def *, struct transport **);
222124861Shartiint trans_unregister(struct transport *);
223124861Sharti
224122394Sharti/*************************************************************
225122394Sharti *
226122394Sharti * SNMPd scalar configuration.
227122394Sharti */
228122394Shartistruct snmpd {
229122394Sharti	/* transmit buffer size */
230122394Sharti	u_int32_t	txbuf;
231122394Sharti
232122394Sharti	/* receive buffer size */
233122394Sharti	u_int32_t	rxbuf;
234122394Sharti
235122394Sharti	/* disable community table */
236122394Sharti	int		comm_dis;
237122394Sharti
238122394Sharti	/* authentication traps */
239122394Sharti	int		auth_traps;
240122394Sharti
241122394Sharti	/* source address for V1 traps */
242122394Sharti	u_char		trap1addr[4];
243124861Sharti
244124861Sharti	/* version enable flags */
245124861Sharti	uint32_t	version_enable;
246122394Sharti};
247122394Shartiextern struct snmpd snmpd;
248122394Sharti
249124861Sharti#define	VERS_ENABLE_V1	0x00000001
250124861Sharti#define	VERS_ENABLE_V2C	0x00000002
251216294Ssyrinx#define	VERS_ENABLE_V3	0x00000004
252216294Ssyrinx#define	VERS_ENABLE_ALL	(VERS_ENABLE_V1 | VERS_ENABLE_V2C | VERS_ENABLE_V3)
253124861Sharti
254122394Sharti/*
255122394Sharti * The debug group
256122394Sharti */
257122394Shartistruct debug {
258122394Sharti	u_int		dump_pdus;
259122394Sharti	u_int		logpri;
260122394Sharti	u_int		evdebug;
261122394Sharti};
262122394Shartiextern struct debug debug;
263122394Sharti
264122394Sharti
265122394Sharti/*
266122394Sharti * SNMPd statistics table
267122394Sharti */
268122394Shartistruct snmpd_stats {
269122394Sharti	u_int32_t	inPkts;		/* total packets received */
270122394Sharti	u_int32_t	inBadVersions;	/* unknown version number */
271122394Sharti	u_int32_t	inASNParseErrs;	/* fatal parse errors */
272122394Sharti	u_int32_t	inBadCommunityNames;
273122394Sharti	u_int32_t	inBadCommunityUses;
274122394Sharti	u_int32_t	proxyDrops;	/* dropped by proxy function */
275122394Sharti	u_int32_t	silentDrops;
276122394Sharti
277122394Sharti	u_int32_t	inBadPduTypes;
278122394Sharti	u_int32_t	inTooLong;
279122394Sharti	u_int32_t	noTxbuf;
280122394Sharti	u_int32_t	noRxbuf;
281122394Sharti};
282122394Shartiextern struct snmpd_stats snmpd_stats;
283122394Sharti
284122394Sharti/*
285216294Ssyrinx * SNMPd Engine
286216294Ssyrinx */
287216294Ssyrinxextern struct snmp_engine snmpd_engine;
288216294Ssyrinx
289216294Ssyrinx/*
290122394Sharti * OR Table
291122394Sharti */
292122394Shartistruct objres {
293122394Sharti	TAILQ_ENTRY(objres) link;
294122394Sharti	u_int		index;
295122394Sharti	struct asn_oid	oid;	/* the resource OID */
296122394Sharti	char		descr[256];
297122394Sharti	u_int32_t	uptime;
298122394Sharti	struct lmodule	*module;
299122394Sharti};
300122394ShartiTAILQ_HEAD(objres_list, objres);
301122394Shartiextern struct objres_list objres_list;
302122394Sharti
303122394Sharti/*
304122394Sharti * Trap Sink Table
305122394Sharti */
306122394Shartistruct trapsink {
307122394Sharti	TAILQ_ENTRY(trapsink) link;
308122394Sharti	struct asn_oid	index;
309122394Sharti	u_int		status;
310122394Sharti	int		socket;
311299466Scem	u_char		comm[SNMP_COMMUNITY_MAXLEN + 1];
312122394Sharti	int		version;
313122394Sharti};
314122394Shartienum {
315122394Sharti	TRAPSINK_ACTIVE		= 1,
316122394Sharti	TRAPSINK_NOT_IN_SERVICE	= 2,
317122394Sharti	TRAPSINK_NOT_READY	= 3,
318122394Sharti	TRAPSINK_DESTROY	= 6,
319122394Sharti
320122394Sharti	TRAPSINK_V1		= 1,
321122394Sharti	TRAPSINK_V2		= 2,
322122394Sharti};
323122394ShartiTAILQ_HEAD(trapsink_list, trapsink);
324122394Shartiextern struct trapsink_list trapsink_list;
325122394Sharti
326122394Shartiextern const char *syspath;
327122394Sharti
328122394Sharti/* snmpSerialNo */
329122394Shartiextern int32_t snmp_serial_no;
330122394Sharti
331122394Shartiint init_actvals(void);
332216294Ssyrinx
333216294Ssyrinxextern char engine_file[];
334216294Ssyrinxint init_snmpd_engine(void);
335216294Ssyrinxint set_snmpd_engine(void);
336310990Sngievoid update_snmpd_engine_time(void);
337216294Ssyrinx
338122394Shartiint read_config(const char *, struct lmodule *);
339122394Shartiint define_macro(const char *name, const char *value);
340124861Sharti
341124861Sharti#define	LOG_ASN1_ERRORS	0x10000000
342124861Sharti#define	LOG_SNMP_ERRORS	0x20000000
343