xref: /freebsd/contrib/bsnmp/snmpd/snmpd.h (revision b740e025)
1f06ca4afSHartmut Brandt /*
2f06ca4afSHartmut Brandt  * Copyright (c) 2001-2003
3f06ca4afSHartmut Brandt  *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4f06ca4afSHartmut Brandt  *	All rights reserved.
5f06ca4afSHartmut Brandt  *
6f06ca4afSHartmut Brandt  * Author: Harti Brandt <harti@freebsd.org>
7f06ca4afSHartmut Brandt  *
8896052c1SHartmut Brandt  * Redistribution and use in source and binary forms, with or without
9896052c1SHartmut Brandt  * modification, are permitted provided that the following conditions
10896052c1SHartmut Brandt  * are met:
11896052c1SHartmut Brandt  * 1. Redistributions of source code must retain the above copyright
12896052c1SHartmut Brandt  *    notice, this list of conditions and the following disclaimer.
13f06ca4afSHartmut Brandt  * 2. Redistributions in binary form must reproduce the above copyright
14f06ca4afSHartmut Brandt  *    notice, this list of conditions and the following disclaimer in the
15f06ca4afSHartmut Brandt  *    documentation and/or other materials provided with the distribution.
16f06ca4afSHartmut Brandt  *
17896052c1SHartmut Brandt  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18896052c1SHartmut Brandt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19896052c1SHartmut Brandt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20896052c1SHartmut Brandt  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21896052c1SHartmut Brandt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22896052c1SHartmut Brandt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23896052c1SHartmut Brandt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24896052c1SHartmut Brandt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25896052c1SHartmut Brandt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26896052c1SHartmut Brandt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27896052c1SHartmut Brandt  * SUCH DAMAGE.
28f06ca4afSHartmut Brandt  *
29896052c1SHartmut Brandt  * $Begemot: bsnmp/snmpd/snmpd.h,v 1.24 2004/08/06 08:47:13 brandt Exp $
30f06ca4afSHartmut Brandt  *
31f06ca4afSHartmut Brandt  * Private SNMPd data and functions.
32f06ca4afSHartmut Brandt  */
33135f7de5SShteryana Shopova 
3470af00a1SHartmut Brandt #ifdef USE_LIBBEGEMOT
3570af00a1SHartmut Brandt #include <rpoll.h>
3670af00a1SHartmut Brandt #else
37f06ca4afSHartmut Brandt #include <isc/eventlib.h>
3870af00a1SHartmut Brandt #endif
39f06ca4afSHartmut Brandt 
40f06ca4afSHartmut Brandt #define PATH_SYSCONFIG "/etc:/usr/etc:/usr/local/etc"
41f06ca4afSHartmut Brandt 
4270af00a1SHartmut Brandt #ifdef USE_LIBBEGEMOT
4370af00a1SHartmut Brandt #define	evTimerID	int
4470af00a1SHartmut Brandt #define	evFileID	int
4570af00a1SHartmut Brandt #endif
4670af00a1SHartmut Brandt 
47f06ca4afSHartmut Brandt /*************************************************************
48f06ca4afSHartmut Brandt  *
49f06ca4afSHartmut Brandt  * Communities
50f06ca4afSHartmut Brandt  */
51f06ca4afSHartmut Brandt struct community {
52f06ca4afSHartmut Brandt 	struct lmodule *owner;	/* who created the community */
53f06ca4afSHartmut Brandt 	u_int		private;/* private name for the module */
54f06ca4afSHartmut Brandt 	u_int		value;	/* value of this community */
55f06ca4afSHartmut Brandt 	u_char *	string;	/* the community string */
56f06ca4afSHartmut Brandt 	const u_char *	descr;	/* description */
57f06ca4afSHartmut Brandt 	TAILQ_ENTRY(community) link;
58f06ca4afSHartmut Brandt 
59f06ca4afSHartmut Brandt 	struct asn_oid	index;
60f06ca4afSHartmut Brandt };
61f06ca4afSHartmut Brandt /* list of all known communities */
62f06ca4afSHartmut Brandt extern TAILQ_HEAD(community_list, community) community_list;
63f06ca4afSHartmut Brandt 
64f06ca4afSHartmut Brandt /*************************************************************
65f06ca4afSHartmut Brandt  *
66f06ca4afSHartmut Brandt  * Request IDs.
67f06ca4afSHartmut Brandt  */
68f06ca4afSHartmut Brandt struct idrange {
69f06ca4afSHartmut Brandt 	u_int		type;	/* type id */
70f06ca4afSHartmut Brandt 	int32_t		base;	/* base of this range */
71f06ca4afSHartmut Brandt 	int32_t		size;	/* size of this range */
72f06ca4afSHartmut Brandt 	int32_t		next;	/* generator */
73f06ca4afSHartmut Brandt 	struct lmodule *owner;	/* owner module */
74f06ca4afSHartmut Brandt 	TAILQ_ENTRY(idrange) link;
75f06ca4afSHartmut Brandt };
76f06ca4afSHartmut Brandt 
77f06ca4afSHartmut Brandt /* list of all known ranges */
78f06ca4afSHartmut Brandt extern TAILQ_HEAD(idrange_list, idrange) idrange_list;
79f06ca4afSHartmut Brandt 
80f06ca4afSHartmut Brandt /* identifier generator */
81f06ca4afSHartmut Brandt extern u_int next_idrange;
82f06ca4afSHartmut Brandt 
83f06ca4afSHartmut Brandt /* request id generator for traps */
84f06ca4afSHartmut Brandt extern u_int trap_reqid;
85f06ca4afSHartmut Brandt 
86f06ca4afSHartmut Brandt /*************************************************************
87f06ca4afSHartmut Brandt  *
88f06ca4afSHartmut Brandt  * Timers
89f06ca4afSHartmut Brandt  */
90f06ca4afSHartmut Brandt struct timer {
91f06ca4afSHartmut Brandt 	void	(*func)(void *);/* user function */
92f06ca4afSHartmut Brandt 	void	*udata;		/* user data */
93f06ca4afSHartmut Brandt 	evTimerID id;		/* timer id */
94f06ca4afSHartmut Brandt 	struct lmodule *owner;	/* owner of the timer */
95f06ca4afSHartmut Brandt 	LIST_ENTRY(timer) link;
96f06ca4afSHartmut Brandt };
97f06ca4afSHartmut Brandt 
98f06ca4afSHartmut Brandt /* list of all current timers */
99f06ca4afSHartmut Brandt extern LIST_HEAD(timer_list, timer) timer_list;
100f06ca4afSHartmut Brandt 
101f06ca4afSHartmut Brandt 
102f06ca4afSHartmut Brandt /*************************************************************
103f06ca4afSHartmut Brandt  *
104f06ca4afSHartmut Brandt  * File descriptors
105f06ca4afSHartmut Brandt  */
106f06ca4afSHartmut Brandt struct fdesc {
107f06ca4afSHartmut Brandt 	int	fd;		/* the file descriptor */
108f06ca4afSHartmut Brandt 	void	(*func)(int, void *);/* user function */
109f06ca4afSHartmut Brandt 	void	*udata;		/* user data */
110f06ca4afSHartmut Brandt 	evFileID id;		/* file id */
111f06ca4afSHartmut Brandt 	struct lmodule *owner;	/* owner module of the file */
112f06ca4afSHartmut Brandt 	LIST_ENTRY(fdesc) link;
113f06ca4afSHartmut Brandt };
114f06ca4afSHartmut Brandt 
115f06ca4afSHartmut Brandt /* list of all current selected files */
116f06ca4afSHartmut Brandt extern LIST_HEAD(fdesc_list, fdesc) fdesc_list;
117f06ca4afSHartmut Brandt 
118f06ca4afSHartmut Brandt /*************************************************************
119f06ca4afSHartmut Brandt  *
120f06ca4afSHartmut Brandt  * Loadable modules
121f06ca4afSHartmut Brandt  */
122f06ca4afSHartmut Brandt # define LM_SECTION_MAX	14
123f06ca4afSHartmut Brandt struct lmodule {
124f06ca4afSHartmut Brandt 	char		section[LM_SECTION_MAX + 1]; /* and index */
125f06ca4afSHartmut Brandt 	char		*path;
126f06ca4afSHartmut Brandt 	u_int		flags;
127f06ca4afSHartmut Brandt 	void		*handle;
128f06ca4afSHartmut Brandt 	const struct snmp_module *config;
129f06ca4afSHartmut Brandt 
130f06ca4afSHartmut Brandt 	TAILQ_ENTRY(lmodule) link;
131f06ca4afSHartmut Brandt 	TAILQ_ENTRY(lmodule) start;
132f06ca4afSHartmut Brandt 
133f06ca4afSHartmut Brandt 	struct asn_oid	index;
134f06ca4afSHartmut Brandt };
135f06ca4afSHartmut Brandt #define LM_STARTED	0x0001
136f06ca4afSHartmut Brandt #define LM_ONSTARTLIST	0x0002
137f06ca4afSHartmut Brandt 
138f06ca4afSHartmut Brandt extern TAILQ_HEAD(lmodules, lmodule) lmodules;
139f06ca4afSHartmut Brandt 
140f06ca4afSHartmut Brandt struct lmodule *lm_load(const char *, const char *);
141f06ca4afSHartmut Brandt void lm_unload(struct lmodule *);
142f06ca4afSHartmut Brandt void lm_start(struct lmodule *);
143f06ca4afSHartmut Brandt 
144f06ca4afSHartmut Brandt /*************************************************************
145f06ca4afSHartmut Brandt  *
146f06ca4afSHartmut Brandt  * SNMP ports
147f06ca4afSHartmut Brandt  */
14870af00a1SHartmut Brandt /*
14970af00a1SHartmut Brandt  * Common input stuff
15070af00a1SHartmut Brandt  */
15170af00a1SHartmut Brandt struct port_input {
15270af00a1SHartmut Brandt 	int		fd;		/* socket */
153f06ca4afSHartmut Brandt 	void		*id;		/* evSelect handle */
154f06ca4afSHartmut Brandt 
155b740e025SDimitry Andric 	u_int		stream : 1;	/* stream socket */
156b740e025SDimitry Andric 	u_int		cred : 1;	/* want credentials */
157f06ca4afSHartmut Brandt 
15870af00a1SHartmut Brandt 	struct sockaddr	*peer;		/* last received packet */
15970af00a1SHartmut Brandt 	socklen_t	peerlen;
160b740e025SDimitry Andric 	u_int		priv : 1;	/* peer is privileged */
161f06ca4afSHartmut Brandt 
16270af00a1SHartmut Brandt 	u_char		*buf;		/* receive buffer */
16370af00a1SHartmut Brandt 	size_t		buflen;		/* buffer length */
16470af00a1SHartmut Brandt 	size_t		length;		/* received length */
16570af00a1SHartmut Brandt 	size_t		consumed;	/* how many bytes used */
166f06ca4afSHartmut Brandt };
167f06ca4afSHartmut Brandt 
16870af00a1SHartmut Brandt struct tport {
16970af00a1SHartmut Brandt 	struct asn_oid	index;		/* table index of this tp point */
17070af00a1SHartmut Brandt 	TAILQ_ENTRY(tport) link;	/* table link */
17170af00a1SHartmut Brandt 	struct transport *transport;	/* who handles this */
172f06ca4afSHartmut Brandt };
17370af00a1SHartmut Brandt TAILQ_HEAD(tport_list, tport);
174f06ca4afSHartmut Brandt 
17570af00a1SHartmut Brandt int snmpd_input(struct port_input *, struct tport *);
17670af00a1SHartmut Brandt void snmpd_input_close(struct port_input *);
17704d17814SAndrey V. Elsukov void snmpd_input_init(struct port_input *);
17870af00a1SHartmut Brandt 
17970af00a1SHartmut Brandt /*
18070af00a1SHartmut Brandt  * Transport domain
18170af00a1SHartmut Brandt  */
18270af00a1SHartmut Brandt #define TRANS_NAMELEN	64
18370af00a1SHartmut Brandt 
18470af00a1SHartmut Brandt struct transport_def {
18570af00a1SHartmut Brandt 	const char	*name;		/* name of this transport */
18670af00a1SHartmut Brandt 	struct asn_oid	id;		/* OBJID of this transport */
18770af00a1SHartmut Brandt 
18870af00a1SHartmut Brandt 	int		(*start)(void);
18970af00a1SHartmut Brandt 	int		(*stop)(int);
19070af00a1SHartmut Brandt 
19170af00a1SHartmut Brandt 	void		(*close_port)(struct tport *);
19270af00a1SHartmut Brandt 	int		(*init_port)(struct tport *);
19370af00a1SHartmut Brandt 
19470af00a1SHartmut Brandt 	ssize_t		(*send)(struct tport *, const u_char *, size_t,
19570af00a1SHartmut Brandt 			    const struct sockaddr *, size_t);
1968d7f605bSEnji Cooper 	ssize_t         (*recv)(struct tport *, struct port_input *);
19704d17814SAndrey V. Elsukov 
19804d17814SAndrey V. Elsukov 	/** send via a multi-socket port */
19904d17814SAndrey V. Elsukov 	ssize_t		(*send2)(struct tport *, const u_char *, size_t,
20004d17814SAndrey V. Elsukov 			    struct port_input *);
20170af00a1SHartmut Brandt };
20270af00a1SHartmut Brandt struct transport {
20370af00a1SHartmut Brandt 	struct asn_oid	index;		/* transport table index */
20470af00a1SHartmut Brandt 	TAILQ_ENTRY(transport) link;	/* ... and link */
20570af00a1SHartmut Brandt 	u_int		or_index;	/* registration index */
20670af00a1SHartmut Brandt 
20770af00a1SHartmut Brandt 	struct tport_list table;	/* list of open ports */
20870af00a1SHartmut Brandt 
20970af00a1SHartmut Brandt 	const struct transport_def *vtab;
21070af00a1SHartmut Brandt };
21170af00a1SHartmut Brandt 
21270af00a1SHartmut Brandt TAILQ_HEAD(transport_list, transport);
21370af00a1SHartmut Brandt extern struct transport_list transport_list;
21470af00a1SHartmut Brandt 
21570af00a1SHartmut Brandt void trans_insert_port(struct transport *, struct tport *);
21670af00a1SHartmut Brandt void trans_remove_port(struct tport *);
21770af00a1SHartmut Brandt struct tport *trans_find_port(struct transport *,
21870af00a1SHartmut Brandt     const struct asn_oid *, u_int);
21970af00a1SHartmut Brandt struct tport *trans_next_port(struct transport *,
22070af00a1SHartmut Brandt     const struct asn_oid *, u_int);
22170af00a1SHartmut Brandt struct tport *trans_first_port(struct transport *);
22270af00a1SHartmut Brandt struct tport *trans_iter_port(struct transport *,
22370af00a1SHartmut Brandt     int (*)(struct tport *, intptr_t), intptr_t);
22470af00a1SHartmut Brandt 
22570af00a1SHartmut Brandt int trans_register(const struct transport_def *, struct transport **);
22670af00a1SHartmut Brandt int trans_unregister(struct transport *);
227f06ca4afSHartmut Brandt 
228f06ca4afSHartmut Brandt /*************************************************************
229f06ca4afSHartmut Brandt  *
230f06ca4afSHartmut Brandt  * SNMPd scalar configuration.
231f06ca4afSHartmut Brandt  */
232f06ca4afSHartmut Brandt struct snmpd {
233f06ca4afSHartmut Brandt 	/* transmit buffer size */
234f06ca4afSHartmut Brandt 	u_int32_t	txbuf;
235f06ca4afSHartmut Brandt 
236f06ca4afSHartmut Brandt 	/* receive buffer size */
237f06ca4afSHartmut Brandt 	u_int32_t	rxbuf;
238f06ca4afSHartmut Brandt 
239f06ca4afSHartmut Brandt 	/* disable community table */
240f06ca4afSHartmut Brandt 	int		comm_dis;
241f06ca4afSHartmut Brandt 
242f06ca4afSHartmut Brandt 	/* authentication traps */
243f06ca4afSHartmut Brandt 	int		auth_traps;
244f06ca4afSHartmut Brandt 
245f06ca4afSHartmut Brandt 	/* source address for V1 traps */
246f06ca4afSHartmut Brandt 	u_char		trap1addr[4];
24770af00a1SHartmut Brandt 
24870af00a1SHartmut Brandt 	/* version enable flags */
24970af00a1SHartmut Brandt 	uint32_t	version_enable;
250f06ca4afSHartmut Brandt };
251f06ca4afSHartmut Brandt extern struct snmpd snmpd;
252f06ca4afSHartmut Brandt 
25370af00a1SHartmut Brandt #define	VERS_ENABLE_V1	0x00000001
25470af00a1SHartmut Brandt #define	VERS_ENABLE_V2C	0x00000002
255135f7de5SShteryana Shopova #define	VERS_ENABLE_V3	0x00000004
256135f7de5SShteryana Shopova #define	VERS_ENABLE_ALL	(VERS_ENABLE_V1 | VERS_ENABLE_V2C | VERS_ENABLE_V3)
25770af00a1SHartmut Brandt 
258f06ca4afSHartmut Brandt /*
259f06ca4afSHartmut Brandt  * The debug group
260f06ca4afSHartmut Brandt  */
261f06ca4afSHartmut Brandt struct debug {
262f06ca4afSHartmut Brandt 	u_int		dump_pdus;
263f06ca4afSHartmut Brandt 	u_int		logpri;
264f06ca4afSHartmut Brandt 	u_int		evdebug;
265f06ca4afSHartmut Brandt };
266f06ca4afSHartmut Brandt extern struct debug debug;
267f06ca4afSHartmut Brandt 
268f06ca4afSHartmut Brandt 
269f06ca4afSHartmut Brandt /*
270f06ca4afSHartmut Brandt  * SNMPd statistics table
271f06ca4afSHartmut Brandt  */
272f06ca4afSHartmut Brandt struct snmpd_stats {
273f06ca4afSHartmut Brandt 	u_int32_t	inPkts;		/* total packets received */
274f06ca4afSHartmut Brandt 	u_int32_t	inBadVersions;	/* unknown version number */
275f06ca4afSHartmut Brandt 	u_int32_t	inASNParseErrs;	/* fatal parse errors */
276f06ca4afSHartmut Brandt 	u_int32_t	inBadCommunityNames;
277f06ca4afSHartmut Brandt 	u_int32_t	inBadCommunityUses;
278f06ca4afSHartmut Brandt 	u_int32_t	proxyDrops;	/* dropped by proxy function */
279f06ca4afSHartmut Brandt 	u_int32_t	silentDrops;
280f06ca4afSHartmut Brandt 
281f06ca4afSHartmut Brandt 	u_int32_t	inBadPduTypes;
282f06ca4afSHartmut Brandt 	u_int32_t	inTooLong;
283f06ca4afSHartmut Brandt 	u_int32_t	noTxbuf;
284f06ca4afSHartmut Brandt 	u_int32_t	noRxbuf;
285f06ca4afSHartmut Brandt };
286f06ca4afSHartmut Brandt extern struct snmpd_stats snmpd_stats;
287f06ca4afSHartmut Brandt 
288f06ca4afSHartmut Brandt /*
289135f7de5SShteryana Shopova  * SNMPd Engine
290135f7de5SShteryana Shopova  */
291135f7de5SShteryana Shopova extern struct snmp_engine snmpd_engine;
292135f7de5SShteryana Shopova 
293135f7de5SShteryana Shopova /*
294f06ca4afSHartmut Brandt  * OR Table
295f06ca4afSHartmut Brandt  */
296f06ca4afSHartmut Brandt struct objres {
297f06ca4afSHartmut Brandt 	TAILQ_ENTRY(objres) link;
298f06ca4afSHartmut Brandt 	u_int		index;
299f06ca4afSHartmut Brandt 	struct asn_oid	oid;	/* the resource OID */
300f06ca4afSHartmut Brandt 	char		descr[256];
301f06ca4afSHartmut Brandt 	u_int32_t	uptime;
302f06ca4afSHartmut Brandt 	struct lmodule	*module;
303f06ca4afSHartmut Brandt };
304f06ca4afSHartmut Brandt TAILQ_HEAD(objres_list, objres);
305f06ca4afSHartmut Brandt extern struct objres_list objres_list;
306f06ca4afSHartmut Brandt 
307f06ca4afSHartmut Brandt /*
308f06ca4afSHartmut Brandt  * Trap Sink Table
309f06ca4afSHartmut Brandt  */
310f06ca4afSHartmut Brandt struct trapsink {
311f06ca4afSHartmut Brandt 	TAILQ_ENTRY(trapsink) link;
312f06ca4afSHartmut Brandt 	struct asn_oid	index;
313f06ca4afSHartmut Brandt 	u_int		status;
314f06ca4afSHartmut Brandt 	int		socket;
3154aa1608aSConrad Meyer 	u_char		comm[SNMP_COMMUNITY_MAXLEN + 1];
316f06ca4afSHartmut Brandt 	int		version;
317f06ca4afSHartmut Brandt };
318f06ca4afSHartmut Brandt enum {
319f06ca4afSHartmut Brandt 	TRAPSINK_ACTIVE		= 1,
320f06ca4afSHartmut Brandt 	TRAPSINK_NOT_IN_SERVICE	= 2,
321f06ca4afSHartmut Brandt 	TRAPSINK_NOT_READY	= 3,
322f06ca4afSHartmut Brandt 	TRAPSINK_DESTROY	= 6,
323f06ca4afSHartmut Brandt 
324f06ca4afSHartmut Brandt 	TRAPSINK_V1		= 1,
325f06ca4afSHartmut Brandt 	TRAPSINK_V2		= 2,
326f06ca4afSHartmut Brandt };
327f06ca4afSHartmut Brandt TAILQ_HEAD(trapsink_list, trapsink);
328f06ca4afSHartmut Brandt extern struct trapsink_list trapsink_list;
329f06ca4afSHartmut Brandt 
330f06ca4afSHartmut Brandt extern const char *syspath;
331f06ca4afSHartmut Brandt 
332f06ca4afSHartmut Brandt /* snmpSerialNo */
333f06ca4afSHartmut Brandt extern int32_t snmp_serial_no;
334f06ca4afSHartmut Brandt 
335f06ca4afSHartmut Brandt int init_actvals(void);
336135f7de5SShteryana Shopova 
337135f7de5SShteryana Shopova extern char engine_file[];
338135f7de5SShteryana Shopova int init_snmpd_engine(void);
339135f7de5SShteryana Shopova int set_snmpd_engine(void);
34088cdfafaSEnji Cooper void update_snmpd_engine_time(void);
341135f7de5SShteryana Shopova 
342f06ca4afSHartmut Brandt int read_config(const char *, struct lmodule *);
343f06ca4afSHartmut Brandt int define_macro(const char *name, const char *value);
34470af00a1SHartmut Brandt 
34570af00a1SHartmut Brandt #define	LOG_ASN1_ERRORS	0x10000000
34670af00a1SHartmut Brandt #define	LOG_SNMP_ERRORS	0x20000000
347