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