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