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