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