xref: /openbsd/usr.sbin/snmpd/snmpd.h (revision 9f020842)
1 /*	$OpenBSD: snmpd.h,v 1.81 2019/01/08 15:38:36 bluhm Exp $	*/
2 
3 /*
4  * Copyright (c) 2007, 2008, 2012 Reyk Floeter <reyk@openbsd.org>
5  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #ifndef SNMPD_H
21 #define SNMPD_H
22 
23 #include <sys/tree.h>
24 
25 #include <net/if.h>
26 #include <net/if_dl.h>
27 #include <netinet/in.h>
28 #include <netinet/if_ether.h>
29 #include <netinet/ip.h>
30 #include <arpa/inet.h>
31 #include <net/pfvar.h>
32 #include <net/route.h>
33 
34 #include <stdio.h>
35 #include <imsg.h>
36 
37 #include "ber.h"
38 #include "snmp.h"
39 
40 #ifndef nitems
41 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
42 #endif
43 
44 /*
45  * common definitions for snmpd
46  */
47 
48 #define CONF_FILE		"/etc/snmpd.conf"
49 #define SNMPD_SOCKET		"/var/run/snmpd.sock"
50 #define SNMPD_USER		"_snmpd"
51 #define SNMPD_PORT		161
52 #define SNMPD_TRAPPORT		162
53 
54 #define SNMPD_MAXSTRLEN		484
55 #define SNMPD_MAXCOMMUNITYLEN	SNMPD_MAXSTRLEN
56 #define SNMPD_MAXVARBIND	0x7fffffff
57 #define SNMPD_MAXVARBINDLEN	1210
58 #define SNMPD_MAXENGINEIDLEN	32
59 #define SNMPD_MAXUSERNAMELEN	32
60 #define SNMPD_MAXCONTEXNAMELEN	32
61 
62 #define SNMP_USM_DIGESTLEN	12
63 #define SNMP_USM_SALTLEN	8
64 #define SNMP_USM_KEYLEN		64
65 #define SNMP_CIPHER_KEYLEN	16
66 
67 #define SMALL_READ_BUF_SIZE	1024
68 #define READ_BUF_SIZE		65535
69 #define	RT_BUF_SIZE		16384
70 #define	MAX_RTSOCK_BUF		(2 * 1024 * 1024)
71 
72 #define SNMP_ENGINEID_OLD	0x00
73 #define SNMP_ENGINEID_NEW	0x80	/* RFC3411 */
74 
75 #define SNMP_ENGINEID_FMT_IPv4	1
76 #define SNMP_ENGINEID_FMT_IPv6	2
77 #define SNMP_ENGINEID_FMT_MAC	3
78 #define SNMP_ENGINEID_FMT_TEXT	4
79 #define SNMP_ENGINEID_FMT_OCT	5
80 #define SNMP_ENGINEID_FMT_EID	128
81 
82 enum imsg_type {
83 	IMSG_NONE,
84 	IMSG_CTL_OK,		/* answer to snmpctl requests */
85 	IMSG_CTL_FAIL,
86 	IMSG_CTL_END,
87 	IMSG_CTL_NOTIFY,
88 	IMSG_CTL_VERBOSE,
89 	IMSG_CTL_RELOAD,
90 	IMSG_CTL_PROCFD,
91 	IMSG_ALERT
92 };
93 
94 struct imsgev {
95 	struct imsgbuf		 ibuf;
96 	void			(*handler)(int, short, void *);
97 	struct event		 ev;
98 	struct privsep_proc	*proc;
99 	void			*data;
100 	short			 events;
101 	const char		*name;
102 };
103 
104 #define IMSG_SIZE_CHECK(imsg, p) do {				\
105 	if (IMSG_DATA_SIZE(imsg) < sizeof(*p))			\
106 		fatalx("bad length imsg received");		\
107 } while (0)
108 #define IMSG_DATA_SIZE(imsg)	((imsg)->hdr.len - IMSG_HEADER_SIZE)
109 
110 /* initially control.h */
111 struct control_sock {
112 	const char	*cs_name;
113 	struct event	 cs_ev;
114 	struct event	 cs_evt;
115 	int		 cs_fd;
116 	int		 cs_restricted;
117 	int		 cs_agentx;
118 	void		*cs_env;
119 
120 	TAILQ_ENTRY(control_sock) cs_entry;
121 };
122 TAILQ_HEAD(control_socks, control_sock);
123 
124 enum privsep_procid {
125 	PROC_PARENT,	/* Parent process and application interface */
126 	PROC_SNMPE,	/* SNMP engine */
127 	PROC_TRAP,	/* SNMP trap receiver */
128 	PROC_MAX
129 };
130 
131 enum privsep_procid privsep_process;
132 
133 /* Attach the control socket to the following process */
134 #define PROC_CONTROL	PROC_SNMPE
135 
136 struct privsep_pipes {
137 	int			*pp_pipes[PROC_MAX];
138 };
139 
140 struct privsep {
141 	struct privsep_pipes	*ps_pipes[PROC_MAX];
142 	struct privsep_pipes	*ps_pp;
143 
144 	struct imsgev		*ps_ievs[PROC_MAX];
145 	const char		*ps_title[PROC_MAX];
146 	pid_t			 ps_pid[PROC_MAX];
147 	struct passwd		*ps_pw;
148 
149 	u_int			 ps_instances[PROC_MAX];
150 	u_int			 ps_instance;
151 	int			 ps_noaction;
152 
153 	struct control_sock	 ps_csock;
154 	struct control_socks	 ps_rcsocks;
155 
156 	/* Event and signal handlers */
157 	struct event		 ps_evsigint;
158 	struct event		 ps_evsigterm;
159 	struct event		 ps_evsigchld;
160 	struct event		 ps_evsighup;
161 	struct event		 ps_evsigpipe;
162 	struct event		 ps_evsigusr1;
163 
164 	void			*ps_env;
165 };
166 
167 struct privsep_proc {
168 	const char		*p_title;
169 	enum privsep_procid	 p_id;
170 	int			(*p_cb)(int, struct privsep_proc *,
171 				    struct imsg *);
172 	void			(*p_init)(struct privsep *,
173 				    struct privsep_proc *);
174 	void			(*p_shutdown)(void);
175 	const char		*p_chroot;
176 	struct privsep		*p_ps;
177 	struct passwd		*p_pw;
178 };
179 
180 struct privsep_fd {
181 	enum privsep_procid		 pf_procid;
182 	unsigned int			 pf_instance;
183 };
184 
185 #define PROC_PARENT_SOCK_FILENO	3
186 #define PROC_MAX_INSTANCES	32
187 
188 #if DEBUG
189 #define DPRINTF		log_debug
190 #else
191 #define DPRINTF(x...)	do {} while(0)
192 #endif
193 
194 /*
195  * kroute
196  */
197 
198 struct kroute_node;
199 struct kroute6_node;
200 RB_HEAD(kroute_tree, kroute_node);
201 RB_HEAD(kroute6_tree, kroute6_node);
202 
203 struct ktable {
204 	struct kroute_tree	 krt;
205 	struct kroute6_tree	 krt6;
206 	u_int			 rtableid;
207 	u_int			 rdomain;
208 };
209 
210 union kaddr {
211 	struct sockaddr		sa;
212 	struct sockaddr_in	sin;
213 	struct sockaddr_in6	sin6;
214 	struct sockaddr_dl	sdl;
215 	char			pad[32];
216 };
217 
218 struct kroute {
219 	struct in_addr	prefix;
220 	struct in_addr	nexthop;
221 	u_long		ticks;
222 	u_int16_t	flags;
223 	u_short		if_index;
224 	u_int8_t	prefixlen;
225 	u_int8_t	priority;
226 };
227 
228 struct kroute6 {
229 	struct in6_addr	prefix;
230 	struct in6_addr	nexthop;
231 	u_long		ticks;
232 	u_int16_t	flags;
233 	u_short		if_index;
234 	u_int8_t	prefixlen;
235 	u_int8_t	priority;
236 };
237 
238 struct kif_addr {
239 	u_short			 if_index;
240 	union kaddr		 addr;
241 	union kaddr		 mask;
242 	union kaddr		 dstbrd;
243 
244 	TAILQ_ENTRY(kif_addr)	 entry;
245 	RB_ENTRY(kif_addr)	 node;
246 };
247 
248 struct kif_arp {
249 	u_short			 flags;
250 	u_short			 if_index;
251 	union kaddr		 addr;
252 	union kaddr		 target;
253 
254 	TAILQ_ENTRY(kif_arp)	 entry;
255 };
256 
257 struct kif {
258 	char			 if_name[IF_NAMESIZE];
259 	char			 if_descr[IFDESCRSIZE];
260 	u_int8_t		 if_lladdr[ETHER_ADDR_LEN];
261 	struct if_data		 if_data;
262 	u_long			 if_ticks;
263 	int			 if_flags;
264 	u_short			 if_index;
265 };
266 #define	if_mtu		if_data.ifi_mtu
267 #define	if_type		if_data.ifi_type
268 #define	if_addrlen	if_data.ifi_addrlen
269 #define	if_hdrlen	if_data.ifi_hdrlen
270 #define	if_metric	if_data.ifi_metric
271 #define	if_link_state	if_data.ifi_link_state
272 #define	if_baudrate	if_data.ifi_baudrate
273 #define	if_ipackets	if_data.ifi_ipackets
274 #define	if_ierrors	if_data.ifi_ierrors
275 #define	if_opackets	if_data.ifi_opackets
276 #define	if_oerrors	if_data.ifi_oerrors
277 #define	if_collisions	if_data.ifi_collisions
278 #define	if_ibytes	if_data.ifi_ibytes
279 #define	if_obytes	if_data.ifi_obytes
280 #define	if_imcasts	if_data.ifi_imcasts
281 #define	if_omcasts	if_data.ifi_omcasts
282 #define	if_iqdrops	if_data.ifi_iqdrops
283 #define	if_oqdrops	if_data.ifi_oqdrops
284 #define	if_noproto	if_data.ifi_noproto
285 #define	if_lastchange	if_data.ifi_lastchange
286 #define	if_capabilities	if_data.ifi_capabilities
287 
288 #define F_CONNECTED		0x0001
289 #define F_STATIC		0x0002
290 #define F_BLACKHOLE		0x0004
291 #define F_REJECT		0x0008
292 #define F_DYNAMIC		0x0010
293 
294 /*
295  * Message Processing Subsystem (mps)
296  */
297 
298 struct oid {
299 	struct ber_oid		 o_id;
300 #define o_oid			 o_id.bo_id
301 #define o_oidlen		 o_id.bo_n
302 
303 	char			*o_name;
304 
305 	u_int			 o_flags;
306 
307 	int			 (*o_get)(struct oid *, struct ber_oid *,
308 				    struct ber_element **);
309 	int			 (*o_set)(struct oid *, struct ber_oid *,
310 				    struct ber_element **);
311 	struct ber_oid		*(*o_table)(struct oid *, struct ber_oid *,
312 				    struct ber_oid *);
313 
314 	long long		 o_val;
315 	void			*o_data;
316 
317 	struct ctl_conn		*o_session;
318 
319 	RB_ENTRY(oid)		 o_element;
320 	RB_ENTRY(oid)		 o_keyword;
321 	TAILQ_ENTRY(oid)	 o_list;
322 };
323 TAILQ_HEAD(oidlist, oid);
324 
325 #define OID_ROOT		0x00
326 #define OID_RD			0x01
327 #define OID_WR			0x02
328 #define OID_IFSET		0x04	/* only if user-specified value */
329 #define OID_DYNAMIC		0x08	/* free allocated data */
330 #define OID_TABLE		0x10	/* dynamic sub-elements */
331 #define OID_MIB			0x20	/* root-OID of a supported MIB */
332 #define OID_KEY			0x40	/* lookup tables */
333 #define	OID_REGISTERED		0x80	/* OID registered by subagent */
334 
335 #define OID_RS			(OID_RD|OID_IFSET)
336 #define OID_WS			(OID_WR|OID_IFSET)
337 #define OID_RW			(OID_RD|OID_WR)
338 #define OID_RWS			(OID_RW|OID_IFSET)
339 
340 #define OID_TRD			(OID_RD|OID_TABLE)
341 #define OID_TWR			(OID_WR|OID_TABLE)
342 #define OID_TRS			(OID_RD|OID_IFSET|OID_TABLE)
343 #define OID_TWS			(OID_WR|OID_IFSET|OID_TABLE)
344 #define OID_TRW			(OID_RD|OID_WR|OID_TABLE)
345 #define OID_TRWS		(OID_RW|OID_IFSET|OID_TABLE)
346 
347 #define OID_NOTSET(_oid)						\
348 	(((_oid)->o_flags & OID_IFSET) &&				\
349 	((_oid)->o_data == NULL) && ((_oid)->o_val == 0))
350 
351 #define OID(...)		{ { __VA_ARGS__ } }
352 #define MIBDECL(...)		{ { MIB_##__VA_ARGS__ } }, #__VA_ARGS__
353 #define MIB(...)		{ { MIB_##__VA_ARGS__ } }, NULL
354 #define MIBEND			{ { 0 } }, NULL
355 
356 struct ctl_conn {
357 	TAILQ_ENTRY(ctl_conn)	 entry;
358 	u_int8_t		 flags;
359 #define CTL_CONN_NOTIFY		 0x01
360 #define CTL_CONN_LOCKED		 0x02	/* restricted mode */
361 	struct imsgev		 iev;
362 	struct control_sock	*cs;
363 	struct agentx_handle	*handle;
364 	struct oidlist		 oids;
365 };
366 TAILQ_HEAD(ctl_connlist, ctl_conn);
367 extern  struct ctl_connlist ctl_conns;
368 
369 /*
370  * pf
371  */
372 
373 enum {	PFRB_TABLES = 1, PFRB_TSTATS, PFRB_ADDRS, PFRB_ASTATS,
374 	PFRB_IFACES, PFRB_TRANS, PFRB_MAX };
375 
376 enum {  IN, OUT };
377 enum {  IPV4, IPV6 };
378 enum {  PASS, BLOCK };
379 
380 enum {  PFI_IFTYPE_GROUP, PFI_IFTYPE_INSTANCE };
381 
382 struct pfr_buffer {
383 	int	 pfrb_type;	/* type of content, see enum above */
384 	int	 pfrb_size;	/* number of objects in buffer */
385 	int	 pfrb_msize;	/* maximum number of objects in buffer */
386 	void	*pfrb_caddr;	/* malloc'ated memory area */
387 };
388 
389 #define PFRB_FOREACH(var, buf)				\
390 	for ((var) = pfr_buf_next((buf), NULL);		\
391 	    (var) != NULL;				\
392 	    (var) = pfr_buf_next((buf), (var)))
393 
394 /*
395  * daemon structures
396  */
397 
398 #define MSG_HAS_AUTH(m)		(((m)->sm_flags & SNMP_MSGFLAG_AUTH) != 0)
399 #define MSG_HAS_PRIV(m)		(((m)->sm_flags & SNMP_MSGFLAG_PRIV) != 0)
400 #define MSG_SECLEVEL(m)		((m)->sm_flags & SNMP_MSGFLAG_SECMASK)
401 #define MSG_REPORT(m)		(((m)->sm_flags & SNMP_MSGFLAG_REPORT) != 0)
402 
403 struct snmp_message {
404 	int			 sm_sock;
405 	struct sockaddr_storage	 sm_ss;
406 	socklen_t		 sm_slen;
407 	int			 sm_sock_tcp;
408 	struct event		 sm_sockev;
409 	char			 sm_host[HOST_NAME_MAX+1];
410 
411 	struct sockaddr_storage	 sm_local_ss;
412 	socklen_t		 sm_local_slen;
413 
414 	struct ber		 sm_ber;
415 	struct ber_element	*sm_req;
416 	struct ber_element	*sm_resp;
417 
418 	int			 sm_i;
419 	struct ber_element	*sm_a;
420 	struct ber_element	*sm_b;
421 	struct ber_element	*sm_c;
422 	struct ber_element	*sm_next;
423 	struct ber_element	*sm_last;
424 	struct ber_element	*sm_end;
425 
426 	u_int8_t		 sm_data[READ_BUF_SIZE];
427 	size_t			 sm_datalen;
428 
429 	u_int			 sm_version;
430 	u_int			 sm_state;
431 
432 	/* V1, V2c */
433 	char			 sm_community[SNMPD_MAXCOMMUNITYLEN];
434 	int			 sm_context;
435 
436 	/* V3 */
437 	long long		 sm_msgid;
438 	long long		 sm_max_msg_size;
439 	u_int8_t		 sm_flags;
440 	long long		 sm_secmodel;
441 	u_int32_t		 sm_engine_boots;
442 	u_int32_t		 sm_engine_time;
443 	uint8_t			 sm_ctxengineid[SNMPD_MAXENGINEIDLEN];
444 	size_t			 sm_ctxengineid_len;
445 	char			 sm_ctxname[SNMPD_MAXCONTEXNAMELEN+1];
446 
447 	/* USM */
448 	char			 sm_username[SNMPD_MAXUSERNAMELEN+1];
449 	struct usmuser		*sm_user;
450 	size_t			 sm_digest_offs;
451 	char			 sm_salt[SNMP_USM_SALTLEN];
452 	int			 sm_usmerr;
453 
454 	long long		 sm_request;
455 
456 	const char		*sm_errstr;
457 	long long		 sm_error;
458 #define sm_nonrepeaters		 sm_error
459 	long long		 sm_errorindex;
460 #define sm_maxrepetitions	 sm_errorindex
461 
462 	struct ber_element	*sm_pdu;
463 	struct ber_element	*sm_pduend;
464 
465 	struct ber_element	*sm_varbind;
466 	struct ber_element	*sm_varbindresp;
467 };
468 
469 /* Defined in SNMPv2-MIB.txt (RFC 3418) */
470 struct snmp_stats {
471 	u_int32_t		snmp_inpkts;
472 	u_int32_t		snmp_outpkts;
473 	u_int32_t		snmp_inbadversions;
474 	u_int32_t		snmp_inbadcommunitynames;
475 	u_int32_t		snmp_inbadcommunityuses;
476 	u_int32_t		snmp_inasnparseerrs;
477 	u_int32_t		snmp_intoobigs;
478 	u_int32_t		snmp_innosuchnames;
479 	u_int32_t		snmp_inbadvalues;
480 	u_int32_t		snmp_inreadonlys;
481 	u_int32_t		snmp_ingenerrs;
482 	u_int32_t		snmp_intotalreqvars;
483 	u_int32_t		snmp_intotalsetvars;
484 	u_int32_t		snmp_ingetrequests;
485 	u_int32_t		snmp_ingetnexts;
486 	u_int32_t		snmp_insetrequests;
487 	u_int32_t		snmp_ingetresponses;
488 	u_int32_t		snmp_intraps;
489 	u_int32_t		snmp_outtoobigs;
490 	u_int32_t		snmp_outnosuchnames;
491 	u_int32_t		snmp_outbadvalues;
492 	u_int32_t		snmp_outgenerrs;
493 	u_int32_t		snmp_outgetrequests;
494 	u_int32_t		snmp_outgetnexts;
495 	u_int32_t		snmp_outsetrequests;
496 	u_int32_t		snmp_outgetresponses;
497 	u_int32_t		snmp_outtraps;
498 	int			snmp_enableauthentraps;
499 	u_int32_t		snmp_silentdrops;
500 	u_int32_t		snmp_proxydrops;
501 
502 	/* USM stats (RFC 3414) */
503 	u_int32_t		snmp_usmbadseclevel;
504 	u_int32_t		snmp_usmtimewindow;
505 	u_int32_t		snmp_usmnosuchuser;
506 	u_int32_t		snmp_usmnosuchengine;
507 	u_int32_t		snmp_usmwrongdigest;
508 	u_int32_t		snmp_usmdecrypterr;
509 };
510 
511 struct address {
512 	struct sockaddr_storage	 ss;
513 	in_port_t		 port;
514 	int			 ipproto;
515 
516 	TAILQ_ENTRY(address)	 entry;
517 
518 	/* For SNMP trap receivers etc. */
519 	char			*sa_community;
520 	struct ber_oid		*sa_oid;
521 	struct address		*sa_srcaddr;
522 };
523 TAILQ_HEAD(addresslist, address);
524 
525 struct listen_sock {
526 	int				s_fd;
527 	int				s_ipproto;
528 	struct event			s_ev;
529 	struct event			s_evt;
530 	TAILQ_ENTRY(listen_sock)	entry;
531 };
532 TAILQ_HEAD(socklist, listen_sock);
533 
534 enum usmauth {
535 	AUTH_NONE = 0,
536 	AUTH_MD5,	/* HMAC-MD5-96, RFC3414 */
537 	AUTH_SHA1	/* HMAC-SHA-96, RFC3414 */
538 };
539 
540 #define AUTH_DEFAULT	AUTH_SHA1	/* Default digest */
541 
542 enum usmpriv {
543 	PRIV_NONE = 0,
544 	PRIV_DES,	/* CBC-DES, RFC3414 */
545 	PRIV_AES	/* CFB128-AES-128, RFC3826 */
546 };
547 
548 #define PRIV_DEFAULT	PRIV_DES	/* Default cipher */
549 
550 struct usmuser {
551 	char			*uu_name;
552 	int			 uu_seclevel;
553 
554 	enum usmauth		 uu_auth;
555 	char			*uu_authkey;
556 	unsigned		 uu_authkeylen;
557 
558 
559 	enum usmpriv		 uu_priv;
560 	char			*uu_privkey;
561 	unsigned long long	 uu_salt;
562 
563 	SLIST_ENTRY(usmuser)	 uu_next;
564 };
565 
566 struct snmpd {
567 	u_int8_t		 sc_flags;
568 #define SNMPD_F_VERBOSE		 0x01
569 #define SNMPD_F_DEBUG		 0x02
570 #define SNMPD_F_NONAMES		 0x04
571 
572 	const char		*sc_confpath;
573 	struct addresslist	 sc_addresses;
574 	struct socklist		 sc_sockets;
575 	struct timeval		 sc_starttime;
576 	u_int32_t		 sc_engine_boots;
577 
578 	char			 sc_rdcommunity[SNMPD_MAXCOMMUNITYLEN];
579 	char			 sc_rwcommunity[SNMPD_MAXCOMMUNITYLEN];
580 	char			 sc_trcommunity[SNMPD_MAXCOMMUNITYLEN];
581 
582 	uint8_t			 sc_engineid[SNMPD_MAXENGINEIDLEN];
583 	size_t			 sc_engineid_len;
584 
585 	struct snmp_stats	 sc_stats;
586 
587 	struct addresslist	 sc_trapreceivers;
588 
589 	int			 sc_ncpu;
590 	int64_t			*sc_cpustates;
591 	int			 sc_rtfilter;
592 
593 	int			 sc_min_seclevel;
594 	int			 sc_readonly;
595 	int			 sc_traphandler;
596 
597 	struct privsep		 sc_ps;
598 };
599 
600 struct trapcmd {
601 	struct ber_oid		*cmd_oid;
602 		/* sideways return for intermediate lookups */
603 	struct trapcmd		*cmd_maybe;
604 
605 	int			 cmd_argc;
606 	char			**cmd_argv;
607 
608 	RB_ENTRY(trapcmd)	 cmd_entry;
609 };
610 RB_HEAD(trapcmd_tree, trapcmd);
611 extern	struct trapcmd_tree trapcmd_tree;
612 
613 extern struct snmpd *snmpd_env;
614 
615 /* control.c */
616 int		 control_init(struct privsep *, struct control_sock *);
617 int		 control_listen(struct control_sock *);
618 
619 /* parse.y */
620 struct snmpd	*parse_config(const char *, u_int);
621 int		 cmdline_symset(char *);
622 
623 /* log.c */
624 void	log_init(int, int);
625 void	log_procinit(const char *);
626 void	log_setverbose(int);
627 int	log_getverbose(void);
628 void	log_warn(const char *, ...)
629 	    __attribute__((__format__ (printf, 1, 2)));
630 void	log_warnx(const char *, ...)
631 	    __attribute__((__format__ (printf, 1, 2)));
632 void	log_info(const char *, ...)
633 	    __attribute__((__format__ (printf, 1, 2)));
634 void	log_debug(const char *, ...)
635 	    __attribute__((__format__ (printf, 1, 2)));
636 void	logit(int, const char *, ...)
637 	    __attribute__((__format__ (printf, 2, 3)));
638 void	vlog(int, const char *, va_list)
639 	    __attribute__((__format__ (printf, 2, 0)));
640 __dead void fatal(const char *, ...)
641 	    __attribute__((__format__ (printf, 1, 2)));
642 __dead void fatalx(const char *, ...)
643 	    __attribute__((__format__ (printf, 1, 2)));
644 
645 /* kroute.c */
646 void		 kr_init(void);
647 void		 kr_shutdown(void);
648 
649 u_int		 kr_ifnumber(void);
650 u_long		 kr_iflastchange(void);
651 int		 kr_updateif(u_int);
652 u_long		 kr_routenumber(void);
653 
654 struct kif	*kr_getif(u_short);
655 struct kif	*kr_getnextif(u_short);
656 struct kif_addr *kr_getaddr(struct sockaddr *);
657 struct kif_addr *kr_getnextaddr(struct sockaddr *);
658 
659 struct kroute	*kroute_first(void);
660 struct kroute	*kroute_getaddr(in_addr_t, u_int8_t, u_int8_t, int);
661 
662 struct kif_arp	*karp_first(u_short);
663 struct kif_arp	*karp_getaddr(struct sockaddr *, u_short, int);
664 
665 /* snmpe.c */
666 void		 snmpe(struct privsep *, struct privsep_proc *);
667 void		 snmpe_shutdown(void);
668 void		 snmpe_dispatchmsg(struct snmp_message *);
669 
670 /* trap.c */
671 void		 trap_init(void);
672 int		 trap_imsg(struct imsgev *, pid_t);
673 int		 trap_agentx(struct agentx_handle *, struct agentx_pdu *,
674 		    int *, char **, int *);
675 int		 trap_send(struct ber_oid *, struct ber_element *);
676 
677 /* mps.c */
678 int		 mps_getreq(struct snmp_message *, struct ber_element *,
679 		    struct ber_oid *, u_int);
680 int		 mps_getnextreq(struct snmp_message *, struct ber_element *,
681 		    struct ber_oid *);
682 int		 mps_getbulkreq(struct snmp_message *, struct ber_element **,
683 		    struct ber_element **, struct ber_oid *, int);
684 int		 mps_setreq(struct snmp_message *, struct ber_element *,
685 		    struct ber_oid *);
686 int		 mps_set(struct ber_oid *, void *, long long);
687 int		 mps_getstr(struct oid *, struct ber_oid *,
688 		    struct ber_element **);
689 int		 mps_setstr(struct oid *, struct ber_oid *,
690 		    struct ber_element **);
691 int		 mps_getint(struct oid *, struct ber_oid *,
692 		    struct ber_element **);
693 int		 mps_setint(struct oid *, struct ber_oid *,
694 		    struct ber_element **);
695 int		 mps_getts(struct oid *, struct ber_oid *,
696 		    struct ber_element **);
697 void		 mps_encodeinaddr(struct ber_oid *, struct in_addr *, int);
698 int		 mps_decodeinaddr(struct ber_oid *, struct in_addr *, int);
699 struct ber_oid	*mps_table(struct oid *, struct ber_oid *, struct ber_oid *);
700 
701 /* pf.c */
702 void			 pf_init(void);
703 int			 pf_get_stats(struct pf_status *);
704 int			 pfr_get_astats(struct pfr_table *, struct pfr_astats *,
705 			    int *, int);
706 int			 pfr_get_tstats(struct pfr_table *, struct pfr_tstats *,
707 			    int *, int);
708 int			 pfr_buf_grow(struct pfr_buffer *, int);
709 const void		*pfr_buf_next(struct pfr_buffer *, const void *);
710 int			 pfi_get_ifaces(const char *, struct pfi_kif *, int *);
711 int			 pfi_get(struct pfr_buffer *, const char *);
712 int			 pfi_count(void);
713 int			 pfi_get_if(struct pfi_kif *, int);
714 int			 pft_get(struct pfr_buffer *, struct pfr_table *);
715 int			 pft_count(void);
716 int			 pft_get_table(struct pfr_tstats *, int);
717 int			 pfta_get(struct pfr_buffer *, struct pfr_table *);
718 int			 pfta_get_addr(struct pfr_astats *, int);
719 int			 pfta_get_nextaddr(struct pfr_astats *, int *);
720 int			 pfta_get_first(struct pfr_astats *);
721 
722 /* smi.c */
723 int		 smi_init(void);
724 u_long		 smi_getticks(void);
725 void		 smi_mibtree(struct oid *);
726 struct oid	*smi_find(struct oid *);
727 struct oid	*smi_findkey(char *);
728 struct oid	*smi_next(struct oid *);
729 struct oid	*smi_foreach(struct oid *, u_int);
730 void		 smi_oidlen(struct ber_oid *);
731 void		 smi_scalar_oidlen(struct ber_oid *);
732 char		*smi_oid2string(struct ber_oid *, char *, size_t, size_t);
733 int		 smi_string2oid(const char *, struct ber_oid *);
734 void		 smi_delete(struct oid *);
735 int		 smi_insert(struct oid *);
736 int		 smi_oid_cmp(struct oid *, struct oid *);
737 int		 smi_key_cmp(struct oid *, struct oid *);
738 unsigned int	 smi_application(struct ber_element *);
739 void		 smi_debug_elements(struct ber_element *);
740 char		*smi_print_element(struct ber_element *);
741 
742 /* timer.c */
743 void		 timer_init(void);
744 
745 /* snmpd.c */
746 int		 snmpd_socket_af(struct sockaddr_storage *, in_port_t, int);
747 u_long		 snmpd_engine_time(void);
748 char		*tohexstr(u_int8_t *, int);
749 
750 /* usm.c */
751 void		 usm_generate_keys(void);
752 struct usmuser	*usm_newuser(char *name, const char **);
753 struct usmuser	*usm_finduser(char *name);
754 int		 usm_checkuser(struct usmuser *, const char **);
755 struct ber_element *usm_decode(struct snmp_message *, struct ber_element *,
756 		    const char **);
757 struct ber_element *usm_encode(struct snmp_message *, struct ber_element *);
758 struct ber_element *usm_encrypt(struct snmp_message *, struct ber_element *);
759 void		 usm_finalize_digest(struct snmp_message *, char *, ssize_t);
760 void		 usm_make_report(struct snmp_message *);
761 
762 /* proc.c */
763 enum privsep_procid
764 	    proc_getid(struct privsep_proc *, unsigned int, const char *);
765 void	 proc_init(struct privsep *, struct privsep_proc *, unsigned int, int,
766 	    int, char **, enum privsep_procid);
767 void	 proc_kill(struct privsep *);
768 void	 proc_connect(struct privsep *);
769 void	 proc_dispatch(int, short event, void *);
770 void	 proc_run(struct privsep *, struct privsep_proc *,
771 	    struct privsep_proc *, u_int,
772 	    void (*)(struct privsep *, struct privsep_proc *, void *), void *);
773 void	 imsg_event_add(struct imsgev *);
774 int	 imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t,
775 	    pid_t, int, void *, u_int16_t);
776 int	 imsg_composev_event(struct imsgev *, u_int16_t, u_int32_t,
777 	    pid_t, int, const struct iovec *, int);
778 void	 proc_range(struct privsep *, enum privsep_procid, int *, int *);
779 int	 proc_compose_imsg(struct privsep *, enum privsep_procid, int,
780 	    u_int16_t, u_int32_t, int, void *, u_int16_t);
781 int	 proc_compose(struct privsep *, enum privsep_procid,
782 	    uint16_t, void *, uint16_t);
783 int	 proc_composev_imsg(struct privsep *, enum privsep_procid, int,
784 	    u_int16_t, u_int32_t, int, const struct iovec *, int);
785 int	 proc_composev(struct privsep *, enum privsep_procid,
786 	    uint16_t, const struct iovec *, int);
787 int	 proc_forward_imsg(struct privsep *, struct imsg *,
788 	    enum privsep_procid, int);
789 struct imsgbuf *
790 	 proc_ibuf(struct privsep *, enum privsep_procid, int);
791 struct imsgev *
792 	 proc_iev(struct privsep *, enum privsep_procid, int);
793 int	 proc_flush_imsg(struct privsep *, enum privsep_procid, int);
794 
795 /* traphandler.c */
796 void	 traphandler(struct privsep *, struct privsep_proc *);
797 void	 traphandler_shutdown(void);
798 int	 snmpd_dispatch_traphandler(int, struct privsep_proc *, struct imsg *);
799 void	 trapcmd_free(struct trapcmd *);
800 int	 trapcmd_add(struct trapcmd *);
801 struct trapcmd *
802 	 trapcmd_lookup(struct ber_oid *);
803 
804 /* util.c */
805 int	 varbind_convert(struct agentx_pdu *, struct agentx_varbind_hdr *,
806 	    struct ber_element **, struct ber_element **);
807 ssize_t	 sendtofrom(int, void *, size_t, int, struct sockaddr *,
808 	    socklen_t, struct sockaddr *, socklen_t);
809 ssize_t	 recvfromto(int, void *, size_t, int, struct sockaddr *,
810 	    socklen_t *, struct sockaddr *, socklen_t *);
811 void	 print_debug(const char *, ...);
812 void	 print_verbose(const char *, ...);
813 const char *log_in6addr(const struct in6_addr *);
814 const char *print_host(struct sockaddr_storage *, char *, size_t);
815 
816 #endif /* SNMPD_H */
817