1 /* $OpenBSD: snmpd.h,v 1.77 2018/02/08 00:21:10 claudio 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 char sm_host[HOST_NAME_MAX+1]; 408 409 struct sockaddr_storage sm_local_ss; 410 socklen_t sm_local_slen; 411 412 struct ber sm_ber; 413 struct ber_element *sm_req; 414 struct ber_element *sm_resp; 415 416 int sm_i; 417 struct ber_element *sm_a; 418 struct ber_element *sm_b; 419 struct ber_element *sm_c; 420 struct ber_element *sm_next; 421 struct ber_element *sm_last; 422 struct ber_element *sm_end; 423 424 u_int8_t sm_data[READ_BUF_SIZE]; 425 size_t sm_datalen; 426 427 u_int sm_version; 428 u_int sm_state; 429 430 /* V1, V2c */ 431 char sm_community[SNMPD_MAXCOMMUNITYLEN]; 432 int sm_context; 433 434 /* V3 */ 435 long long sm_msgid; 436 long long sm_max_msg_size; 437 u_int8_t sm_flags; 438 long long sm_secmodel; 439 u_int32_t sm_engine_boots; 440 u_int32_t sm_engine_time; 441 uint8_t sm_ctxengineid[SNMPD_MAXENGINEIDLEN]; 442 size_t sm_ctxengineid_len; 443 char sm_ctxname[SNMPD_MAXCONTEXNAMELEN+1]; 444 445 /* USM */ 446 char sm_username[SNMPD_MAXUSERNAMELEN+1]; 447 struct usmuser *sm_user; 448 size_t sm_digest_offs; 449 char sm_salt[SNMP_USM_SALTLEN]; 450 int sm_usmerr; 451 452 long long sm_request; 453 454 const char *sm_errstr; 455 long long sm_error; 456 #define sm_nonrepeaters sm_error 457 long long sm_errorindex; 458 #define sm_maxrepetitions sm_errorindex 459 460 struct ber_element *sm_pdu; 461 struct ber_element *sm_pduend; 462 463 struct ber_element *sm_varbind; 464 struct ber_element *sm_varbindresp; 465 }; 466 467 /* Defined in SNMPv2-MIB.txt (RFC 3418) */ 468 struct snmp_stats { 469 u_int32_t snmp_inpkts; 470 u_int32_t snmp_outpkts; 471 u_int32_t snmp_inbadversions; 472 u_int32_t snmp_inbadcommunitynames; 473 u_int32_t snmp_inbadcommunityuses; 474 u_int32_t snmp_inasnparseerrs; 475 u_int32_t snmp_intoobigs; 476 u_int32_t snmp_innosuchnames; 477 u_int32_t snmp_inbadvalues; 478 u_int32_t snmp_inreadonlys; 479 u_int32_t snmp_ingenerrs; 480 u_int32_t snmp_intotalreqvars; 481 u_int32_t snmp_intotalsetvars; 482 u_int32_t snmp_ingetrequests; 483 u_int32_t snmp_ingetnexts; 484 u_int32_t snmp_insetrequests; 485 u_int32_t snmp_ingetresponses; 486 u_int32_t snmp_intraps; 487 u_int32_t snmp_outtoobigs; 488 u_int32_t snmp_outnosuchnames; 489 u_int32_t snmp_outbadvalues; 490 u_int32_t snmp_outgenerrs; 491 u_int32_t snmp_outgetrequests; 492 u_int32_t snmp_outgetnexts; 493 u_int32_t snmp_outsetrequests; 494 u_int32_t snmp_outgetresponses; 495 u_int32_t snmp_outtraps; 496 int snmp_enableauthentraps; 497 u_int32_t snmp_silentdrops; 498 u_int32_t snmp_proxydrops; 499 500 /* USM stats (RFC 3414) */ 501 u_int32_t snmp_usmbadseclevel; 502 u_int32_t snmp_usmtimewindow; 503 u_int32_t snmp_usmnosuchuser; 504 u_int32_t snmp_usmnosuchengine; 505 u_int32_t snmp_usmwrongdigest; 506 u_int32_t snmp_usmdecrypterr; 507 }; 508 509 struct address { 510 struct sockaddr_storage ss; 511 in_port_t port; 512 513 TAILQ_ENTRY(address) entry; 514 515 /* For SNMP trap receivers etc. */ 516 char *sa_community; 517 struct ber_oid *sa_oid; 518 struct address *sa_srcaddr; 519 }; 520 TAILQ_HEAD(addresslist, address); 521 522 struct listen_sock { 523 int s_fd; 524 struct event s_ev; 525 TAILQ_ENTRY(listen_sock) entry; 526 }; 527 TAILQ_HEAD(socklist, listen_sock); 528 529 enum usmauth { 530 AUTH_NONE = 0, 531 AUTH_MD5, /* HMAC-MD5-96, RFC3414 */ 532 AUTH_SHA1 /* HMAC-SHA-96, RFC3414 */ 533 }; 534 535 #define AUTH_DEFAULT AUTH_SHA1 /* Default digest */ 536 537 enum usmpriv { 538 PRIV_NONE = 0, 539 PRIV_DES, /* CBC-DES, RFC3414 */ 540 PRIV_AES /* CFB128-AES-128, RFC3826 */ 541 }; 542 543 #define PRIV_DEFAULT PRIV_DES /* Default cipher */ 544 545 struct usmuser { 546 char *uu_name; 547 int uu_seclevel; 548 549 enum usmauth uu_auth; 550 char *uu_authkey; 551 unsigned uu_authkeylen; 552 553 554 enum usmpriv uu_priv; 555 char *uu_privkey; 556 unsigned long long uu_salt; 557 558 SLIST_ENTRY(usmuser) uu_next; 559 }; 560 561 struct snmpd { 562 u_int8_t sc_flags; 563 #define SNMPD_F_VERBOSE 0x01 564 #define SNMPD_F_DEBUG 0x02 565 #define SNMPD_F_NONAMES 0x04 566 567 const char *sc_confpath; 568 struct addresslist sc_addresses; 569 struct socklist sc_sockets; 570 struct timeval sc_starttime; 571 u_int32_t sc_engine_boots; 572 573 char sc_rdcommunity[SNMPD_MAXCOMMUNITYLEN]; 574 char sc_rwcommunity[SNMPD_MAXCOMMUNITYLEN]; 575 char sc_trcommunity[SNMPD_MAXCOMMUNITYLEN]; 576 577 uint8_t sc_engineid[SNMPD_MAXENGINEIDLEN]; 578 size_t sc_engineid_len; 579 580 struct snmp_stats sc_stats; 581 582 struct addresslist sc_trapreceivers; 583 584 int sc_ncpu; 585 int64_t *sc_cpustates; 586 int sc_rtfilter; 587 588 int sc_min_seclevel; 589 int sc_readonly; 590 int sc_traphandler; 591 592 struct privsep sc_ps; 593 }; 594 595 struct trapcmd { 596 struct ber_oid *cmd_oid; 597 /* sideways return for intermediate lookups */ 598 struct trapcmd *cmd_maybe; 599 600 int cmd_argc; 601 char **cmd_argv; 602 603 RB_ENTRY(trapcmd) cmd_entry; 604 }; 605 RB_HEAD(trapcmd_tree, trapcmd); 606 extern struct trapcmd_tree trapcmd_tree; 607 608 extern struct snmpd *snmpd_env; 609 610 /* control.c */ 611 int control_init(struct privsep *, struct control_sock *); 612 int control_listen(struct control_sock *); 613 void control_cleanup(struct control_sock *); 614 615 /* parse.y */ 616 struct snmpd *parse_config(const char *, u_int); 617 int cmdline_symset(char *); 618 619 /* log.c */ 620 void log_init(int, int); 621 void log_procinit(const char *); 622 void log_setverbose(int); 623 int log_getverbose(void); 624 void log_warn(const char *, ...) 625 __attribute__((__format__ (printf, 1, 2))); 626 void log_warnx(const char *, ...) 627 __attribute__((__format__ (printf, 1, 2))); 628 void log_info(const char *, ...) 629 __attribute__((__format__ (printf, 1, 2))); 630 void log_debug(const char *, ...) 631 __attribute__((__format__ (printf, 1, 2))); 632 void logit(int, const char *, ...) 633 __attribute__((__format__ (printf, 2, 3))); 634 void vlog(int, const char *, va_list) 635 __attribute__((__format__ (printf, 2, 0))); 636 __dead void fatal(const char *, ...) 637 __attribute__((__format__ (printf, 1, 2))); 638 __dead void fatalx(const char *, ...) 639 __attribute__((__format__ (printf, 1, 2))); 640 641 /* kroute.c */ 642 void kr_init(void); 643 void kr_shutdown(void); 644 645 u_int kr_ifnumber(void); 646 u_long kr_iflastchange(void); 647 int kr_updateif(u_int); 648 u_long kr_routenumber(void); 649 650 struct kif *kr_getif(u_short); 651 struct kif *kr_getnextif(u_short); 652 struct kif_addr *kr_getaddr(struct sockaddr *); 653 struct kif_addr *kr_getnextaddr(struct sockaddr *); 654 655 struct kroute *kroute_first(void); 656 struct kroute *kroute_getaddr(in_addr_t, u_int8_t, u_int8_t, int); 657 658 struct kif_arp *karp_first(u_short); 659 struct kif_arp *karp_getaddr(struct sockaddr *, u_short, int); 660 661 /* snmpe.c */ 662 void snmpe(struct privsep *, struct privsep_proc *); 663 void snmpe_shutdown(void); 664 void snmpe_dispatchmsg(struct snmp_message *); 665 666 /* trap.c */ 667 void trap_init(void); 668 int trap_imsg(struct imsgev *, pid_t); 669 int trap_agentx(struct agentx_handle *, struct agentx_pdu *, 670 int *, char **, int *); 671 int trap_send(struct ber_oid *, struct ber_element *); 672 673 /* mps.c */ 674 int mps_getreq(struct snmp_message *, struct ber_element *, 675 struct ber_oid *, u_int); 676 int mps_getnextreq(struct snmp_message *, struct ber_element *, 677 struct ber_oid *); 678 int mps_getbulkreq(struct snmp_message *, struct ber_element **, 679 struct ber_element **, struct ber_oid *, int); 680 int mps_setreq(struct snmp_message *, struct ber_element *, 681 struct ber_oid *); 682 int mps_set(struct ber_oid *, void *, long long); 683 int mps_getstr(struct oid *, struct ber_oid *, 684 struct ber_element **); 685 int mps_setstr(struct oid *, struct ber_oid *, 686 struct ber_element **); 687 int mps_getint(struct oid *, struct ber_oid *, 688 struct ber_element **); 689 int mps_setint(struct oid *, struct ber_oid *, 690 struct ber_element **); 691 int mps_getts(struct oid *, struct ber_oid *, 692 struct ber_element **); 693 void mps_encodeinaddr(struct ber_oid *, struct in_addr *, int); 694 int mps_decodeinaddr(struct ber_oid *, struct in_addr *, int); 695 struct ber_oid *mps_table(struct oid *, struct ber_oid *, struct ber_oid *); 696 697 /* pf.c */ 698 void pf_init(void); 699 int pf_get_stats(struct pf_status *); 700 int pfr_get_astats(struct pfr_table *, struct pfr_astats *, 701 int *, int); 702 int pfr_get_tstats(struct pfr_table *, struct pfr_tstats *, 703 int *, int); 704 int pfr_buf_grow(struct pfr_buffer *, int); 705 const void *pfr_buf_next(struct pfr_buffer *, const void *); 706 int pfi_get_ifaces(const char *, struct pfi_kif *, int *); 707 int pfi_get(struct pfr_buffer *, const char *); 708 int pfi_count(void); 709 int pfi_get_if(struct pfi_kif *, int); 710 int pft_get(struct pfr_buffer *, struct pfr_table *); 711 int pft_count(void); 712 int pft_get_table(struct pfr_tstats *, int); 713 int pfta_get(struct pfr_buffer *, struct pfr_table *); 714 int pfta_get_addr(struct pfr_astats *, int); 715 int pfta_get_nextaddr(struct pfr_astats *, int *); 716 int pfta_get_first(struct pfr_astats *); 717 718 /* smi.c */ 719 int smi_init(void); 720 u_long smi_getticks(void); 721 void smi_mibtree(struct oid *); 722 struct oid *smi_find(struct oid *); 723 struct oid *smi_findkey(char *); 724 struct oid *smi_next(struct oid *); 725 struct oid *smi_foreach(struct oid *, u_int); 726 void smi_oidlen(struct ber_oid *); 727 void smi_scalar_oidlen(struct ber_oid *); 728 char *smi_oid2string(struct ber_oid *, char *, size_t, size_t); 729 int smi_string2oid(const char *, struct ber_oid *); 730 void smi_delete(struct oid *); 731 int smi_insert(struct oid *); 732 int smi_oid_cmp(struct oid *, struct oid *); 733 int smi_key_cmp(struct oid *, struct oid *); 734 unsigned long smi_application(struct ber_element *); 735 void smi_debug_elements(struct ber_element *); 736 char *smi_print_element(struct ber_element *); 737 738 /* timer.c */ 739 void timer_init(void); 740 741 /* snmpd.c */ 742 int snmpd_socket_af(struct sockaddr_storage *, in_port_t); 743 u_long snmpd_engine_time(void); 744 char *tohexstr(u_int8_t *, int); 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 758 /* proc.c */ 759 enum privsep_procid 760 proc_getid(struct privsep_proc *, unsigned int, const char *); 761 void proc_init(struct privsep *, struct privsep_proc *, unsigned int, 762 int, char **, enum privsep_procid); 763 void proc_kill(struct privsep *); 764 void proc_connect(struct privsep *); 765 void proc_dispatch(int, short event, void *); 766 void proc_run(struct privsep *, struct privsep_proc *, 767 struct privsep_proc *, u_int, 768 void (*)(struct privsep *, struct privsep_proc *, void *), void *); 769 void imsg_event_add(struct imsgev *); 770 int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, 771 pid_t, int, void *, u_int16_t); 772 int imsg_composev_event(struct imsgev *, u_int16_t, u_int32_t, 773 pid_t, int, const struct iovec *, int); 774 void proc_range(struct privsep *, enum privsep_procid, int *, int *); 775 int proc_compose_imsg(struct privsep *, enum privsep_procid, int, 776 u_int16_t, u_int32_t, int, void *, u_int16_t); 777 int proc_compose(struct privsep *, enum privsep_procid, 778 uint16_t, void *, uint16_t); 779 int proc_composev_imsg(struct privsep *, enum privsep_procid, int, 780 u_int16_t, u_int32_t, int, const struct iovec *, int); 781 int proc_composev(struct privsep *, enum privsep_procid, 782 uint16_t, const struct iovec *, int); 783 int proc_forward_imsg(struct privsep *, struct imsg *, 784 enum privsep_procid, int); 785 struct imsgbuf * 786 proc_ibuf(struct privsep *, enum privsep_procid, int); 787 struct imsgev * 788 proc_iev(struct privsep *, enum privsep_procid, int); 789 int proc_flush_imsg(struct privsep *, enum privsep_procid, int); 790 791 /* traphandler.c */ 792 void traphandler(struct privsep *, struct privsep_proc *); 793 void traphandler_shutdown(void); 794 int snmpd_dispatch_traphandler(int, 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 int varbind_convert(struct agentx_pdu *, struct agentx_varbind_hdr *, 802 struct ber_element **, struct ber_element **); 803 ssize_t sendtofrom(int, void *, size_t, int, struct sockaddr *, 804 socklen_t, struct sockaddr *, socklen_t); 805 ssize_t recvfromto(int, void *, size_t, int, struct sockaddr *, 806 socklen_t *, struct sockaddr *, socklen_t *); 807 void print_debug(const char *, ...); 808 void print_verbose(const char *, ...); 809 const char *log_in6addr(const struct in6_addr *); 810 const char *print_host(struct sockaddr_storage *, char *, size_t); 811 812 #endif /* SNMPD_H */ 813