1 /* $OpenBSD: relayd.h,v 1.272 2024/05/18 06:34:46 jsg Exp $ */ 2 3 /* 4 * Copyright (c) 2006 - 2016 Reyk Floeter <reyk@openbsd.org> 5 * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org> 6 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 7 * 8 * Permission to use, copy, modify, and distribute this software for any 9 * purpose with or without fee is hereby granted, provided that the above 10 * copyright notice and this permission notice appear in all copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21 #ifndef RELAYD_H 22 #define RELAYD_H 23 24 #include <sys/types.h> 25 #include <sys/socket.h> 26 #include <sys/queue.h> 27 #include <sys/tree.h> 28 #include <sys/time.h> 29 #include <sys/un.h> 30 31 #include <net/if.h> 32 #include <net/pfvar.h> 33 34 #include <stdarg.h> 35 #include <limits.h> 36 #include <siphash.h> 37 #include <event.h> 38 #include <imsg.h> 39 40 #include <openssl/ssl.h> 41 #include <tls.h> 42 43 #ifndef nitems 44 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) 45 #endif 46 47 #define CONF_FILE "/etc/relayd.conf" 48 #define RELAYD_SOCKET "/var/run/relayd.sock" 49 #define PF_SOCKET "/dev/pf" 50 #define RELAYD_USER "_relayd" 51 #define RELAYD_ANCHOR "relayd" 52 #define RELAYD_SERVERNAME "OpenBSD relayd" 53 #define CHECK_TIMEOUT 200 54 #define CHECK_INTERVAL 10 55 #define EMPTY_TABLE UINT_MAX 56 #define EMPTY_ID UINT_MAX 57 #define LABEL_NAME_SIZE 1024 58 #define TAG_NAME_SIZE 64 59 #define TABLE_NAME_SIZE 64 60 #define RD_TAG_NAME_SIZE 64 61 #define RT_LABEL_SIZE 32 62 #define SRV_NAME_SIZE 64 63 #define MAX_NAME_SIZE 64 64 #define SRV_MAX_VIRTS 16 65 #define TLS_NAME_SIZE 512 66 #define TLS_CERT_HASH_SIZE 128 67 #define RELAY_MAX_PREFETCH 256 68 #define RELAY_MIN_PREFETCHED 32 69 70 #define FD_RESERVE 5 71 72 #define RELAY_MAX_BACKLOG 512 73 #define RELAY_TIMEOUT 600 74 #define RELAY_CACHESIZE -1 /* use default size */ 75 #define RELAY_NUMPROC 3 76 #define RELAY_MAXHOSTS 32 77 #define RELAY_MAXHEADERLENGTH 131072 78 #define RELAY_DEFHEADERLENGTH 8192 79 #define RELAY_STATINTERVAL 60 80 #define RELAY_BACKLOG 10 81 #define RELAY_MAXLOOKUPLEVELS 5 82 #define RELAY_OUTOF_FD_RETRIES 5 83 #define RELAY_MAX_HASH_RETRIES 5 84 #define RELAY_TLS_PRIV_TIMEOUT 1000 /* wait 1sec for the ca */ 85 86 #define CONFIG_RELOAD 0x00 87 #define CONFIG_TABLES 0x01 88 #define CONFIG_RDRS 0x02 89 #define CONFIG_RELAYS 0x04 90 #define CONFIG_PROTOS 0x08 91 #define CONFIG_ROUTES 0x10 92 #define CONFIG_RTS 0x20 93 #define CONFIG_CA_ENGINE 0x40 94 #define CONFIG_CERTS 0x80 95 #define CONFIG_ALL 0xff 96 97 #define SMALL_READ_BUF_SIZE 1024 98 #define ICMP_BUF_SIZE 64 99 #define ICMP_RCVBUF_SIZE 262144 100 101 #define AGENTX_RECONNECT_TIMEOUT { 3, 0 } /* sec, usec */ 102 103 #define PROC_PARENT_SOCK_FILENO 3 104 #define PROC_MAX_INSTANCES 32 105 106 #if DEBUG > 1 107 #define DPRINTF log_debug 108 #define DEBUG_CERT 1 109 #else 110 #define DPRINTF(x...) do {} while(0) 111 #endif 112 113 /* Used for DNS request ID randomization */ 114 struct shuffle { 115 u_int16_t id_shuffle[65536]; 116 int isindex; 117 }; 118 119 typedef u_int32_t objid_t; 120 121 struct ctl_status { 122 objid_t id; 123 int up; 124 int retry_cnt; 125 u_long check_cnt; 126 u_int16_t he; 127 }; 128 129 struct ctl_id { 130 objid_t id; 131 char name[MAX_NAME_SIZE]; 132 }; 133 134 struct ctl_relaytable { 135 objid_t id; 136 objid_t relayid; 137 int mode; 138 u_int32_t flags; 139 }; 140 141 enum fd_type { 142 RELAY_FD_CERT = 1, 143 RELAY_FD_CACERT = 2, 144 RELAY_FD_CAFILE = 3, 145 RELAY_FD_KEY = 4, 146 RELAY_FD_OCSP = 5 147 }; 148 149 struct ctl_relayfd { 150 objid_t id; 151 objid_t relayid; 152 enum fd_type type; 153 }; 154 155 struct ctl_script { 156 objid_t host; 157 int retval; 158 struct timeval timeout; 159 char name[HOST_NAME_MAX+1]; 160 char path[PATH_MAX]; 161 }; 162 163 struct ctl_demote { 164 char group[IFNAMSIZ]; 165 int level; 166 }; 167 168 struct ctl_icmp_event { 169 struct relayd *env; 170 int s; 171 int af; 172 int last_up; 173 struct event ev; 174 struct timeval tv_start; 175 }; 176 177 struct ctl_tcp_event { 178 int s; 179 struct ibuf *buf; 180 struct host *host; 181 struct table *table; 182 struct timeval tv_start; 183 struct event ev; 184 int (*validate_read)(struct ctl_tcp_event *); 185 int (*validate_close)(struct ctl_tcp_event *); 186 187 struct tls *tls; 188 }; 189 190 enum direction { 191 RELAY_DIR_INVALID = -1, 192 RELAY_DIR_ANY = 0, 193 RELAY_DIR_REQUEST = 1, 194 RELAY_DIR_RESPONSE = 2 195 }; 196 197 enum relay_state { 198 STATE_INIT, 199 STATE_PENDING, 200 STATE_PRECONNECT, 201 STATE_CONNECTED, 202 STATE_CLOSED, 203 STATE_DONE 204 }; 205 206 struct ctl_relay_event { 207 int s; 208 in_port_t port; 209 struct sockaddr_storage ss; 210 struct bufferevent *bev; 211 struct evbuffer *output; 212 struct ctl_relay_event *dst; 213 struct rsession *con; 214 215 struct tls *tls; 216 struct tls_config *tls_cfg; 217 struct tls *tls_ctx; 218 219 uint8_t *tlscert; 220 size_t tlscert_len; 221 222 off_t splicelen; 223 off_t toread; 224 size_t headerlen; 225 int line; 226 int done; 227 int timedout; 228 enum relay_state state; 229 enum direction dir; 230 231 /* protocol-specific descriptor */ 232 void *desc; 233 }; 234 235 enum httpchunk { 236 TOREAD_UNLIMITED = -1, 237 TOREAD_HTTP_HEADER = -2, 238 TOREAD_HTTP_CHUNK_LENGTH = -3, 239 TOREAD_HTTP_CHUNK_TRAILER = -4 240 }; 241 242 struct ctl_natlook { 243 objid_t id; 244 int proc; 245 246 struct sockaddr_storage src; 247 struct sockaddr_storage dst; 248 struct sockaddr_storage rsrc; 249 struct sockaddr_storage rdst; 250 in_port_t rsport; 251 in_port_t rdport; 252 int in; 253 int proto; 254 }; 255 256 struct ctl_bindany { 257 objid_t bnd_id; 258 int bnd_proc; 259 260 struct sockaddr_storage bnd_ss; 261 in_port_t bnd_port; 262 int bnd_proto; 263 }; 264 265 struct ctl_keyop { 266 char cko_hash[TLS_CERT_HASH_SIZE]; 267 int cko_proc; 268 int cko_flen; 269 int cko_tlen; 270 int cko_padding; 271 u_int cko_cookie; 272 }; 273 274 struct ctl_stats { 275 objid_t id; 276 int proc; 277 278 u_int64_t interval; 279 u_int64_t cnt; 280 u_int32_t tick; 281 u_int32_t avg; 282 u_int32_t last; 283 u_int32_t avg_hour; 284 u_int32_t last_hour; 285 u_int32_t avg_day; 286 u_int32_t last_day; 287 }; 288 289 enum key_option { 290 KEY_OPTION_NONE = 0, 291 KEY_OPTION_APPEND, 292 KEY_OPTION_SET, 293 KEY_OPTION_REMOVE, 294 KEY_OPTION_HASH, 295 KEY_OPTION_LOG, 296 KEY_OPTION_STRIP 297 }; 298 299 enum key_type { 300 KEY_TYPE_NONE = 0, 301 KEY_TYPE_COOKIE, 302 KEY_TYPE_HEADER, 303 KEY_TYPE_PATH, 304 KEY_TYPE_QUERY, 305 KEY_TYPE_URL, 306 KEY_TYPE_MAX 307 }; 308 309 struct ctl_kvlen { 310 ssize_t key; 311 ssize_t value; 312 }; 313 314 struct ctl_rule { 315 struct ctl_kvlen kvlen[KEY_TYPE_MAX]; 316 }; 317 318 enum digest_type { 319 DIGEST_NONE = 0, 320 DIGEST_SHA1 = 1, 321 DIGEST_MD5 = 2 322 }; 323 324 TAILQ_HEAD(kvlist, kv); 325 RB_HEAD(kvtree, kv); 326 327 struct kv { 328 char *kv_key; 329 char *kv_value; 330 331 enum key_type kv_type; 332 enum key_option kv_option; 333 enum digest_type kv_digest; 334 335 #define KV_FLAG_MACRO 0x01 336 #define KV_FLAG_INVALID 0x02 337 #define KV_FLAG_GLOBBING 0x04 338 u_int8_t kv_flags; 339 340 struct kvlist kv_children; 341 struct kv *kv_parent; 342 TAILQ_ENTRY(kv) kv_entry; 343 344 RB_ENTRY(kv) kv_node; 345 346 /* A few pointers used by the rule actions */ 347 struct kv *kv_match; 348 struct kvtree *kv_matchtree; 349 350 TAILQ_ENTRY(kv) kv_match_entry; 351 TAILQ_ENTRY(kv) kv_rule_entry; 352 TAILQ_ENTRY(kv) kv_action_entry; 353 }; 354 355 struct portrange { 356 in_port_t val[2]; 357 u_int8_t op; 358 }; 359 360 struct address { 361 objid_t rdrid; 362 struct sockaddr_storage ss; 363 int ipproto; 364 struct portrange port; 365 char ifname[IFNAMSIZ]; 366 TAILQ_ENTRY(address) entry; 367 }; 368 TAILQ_HEAD(addresslist, address); 369 370 union hashkey { 371 /* Simplified version of pf_poolhashkey */ 372 u_int32_t data[4]; 373 SIPHASH_KEY siphashkey; 374 }; 375 376 #define F_DISABLE 0x00000001 377 #define F_BACKUP 0x00000002 378 #define F_USED 0x00000004 379 #define F_DOWN 0x00000008 380 #define F_ADD 0x00000010 381 #define F_DEL 0x00000020 382 #define F_CHANGED 0x00000040 383 #define F_STICKY 0x00000080 384 #define F_CHECK_DONE 0x00000100 385 #define F_ACTIVE_RULESET 0x00000200 386 #define F_CHECK_SENT 0x00000400 387 #define F_TLS 0x00000800 388 #define F_NATLOOK 0x00001000 389 #define F_DEMOTE 0x00002000 390 #define F_LOOKUP_PATH 0x00004000 391 #define F_DEMOTED 0x00008000 392 #define F_UDP 0x00010000 393 #define F_RETURN 0x00020000 394 #define F_AGENTX 0x00040000 395 #define F_NEEDPF 0x00080000 396 #define F_PORT 0x00100000 397 #define F_TLSCLIENT 0x00200000 398 #define F_NEEDRT 0x00400000 399 #define F_MATCH 0x00800000 400 #define F_DIVERT 0x01000000 401 #define F_SCRIPT 0x02000000 402 #define F_TLSINSPECT 0x04000000 403 #define F_HASHKEY 0x08000000 404 #define F_AGENTX_TRAPONLY 0x10000000 405 406 #define F_BITS \ 407 "\10\01DISABLE\02BACKUP\03USED\04DOWN\05ADD\06DEL\07CHANGED" \ 408 "\10STICKY-ADDRESS\11CHECK_DONE\12ACTIVE_RULESET\13CHECK_SENT" \ 409 "\14TLS\15NAT_LOOKUP\16DEMOTE\17LOOKUP_PATH\20DEMOTED\21UDP" \ 410 "\22RETURN\23TRAP\24NEEDPF\25PORT\26TLS_CLIENT\27NEEDRT" \ 411 "\30MATCH\31DIVERT\32SCRIPT\33TLS_INSPECT\34HASHKEY" \ 412 "\35AGENTX_TRAPONLY" 413 414 enum forwardmode { 415 FWD_NORMAL = 0, 416 FWD_ROUTE, 417 FWD_TRANS 418 }; 419 420 struct host_config { 421 objid_t id; 422 objid_t parentid; 423 objid_t tableid; 424 int retry; 425 char name[HOST_NAME_MAX+1]; 426 struct sockaddr_storage ss; 427 int ttl; 428 int priority; 429 }; 430 431 struct host { 432 TAILQ_ENTRY(host) entry; 433 TAILQ_ENTRY(host) globalentry; 434 SLIST_ENTRY(host) child; 435 SLIST_HEAD(,host) children; 436 struct host_config conf; 437 u_int32_t flags; 438 char *tablename; 439 int up; 440 int last_up; 441 u_long check_cnt; 442 u_long up_cnt; 443 int retry_cnt; 444 int idx; 445 u_int16_t he; 446 int code; 447 struct ctl_tcp_event cte; 448 }; 449 TAILQ_HEAD(hostlist, host); 450 451 enum host_error { 452 HCE_NONE = 0, 453 HCE_ABORT, 454 HCE_INTERVAL_TIMEOUT, 455 HCE_ICMP_OK, 456 HCE_ICMP_READ_TIMEOUT, 457 HCE_ICMP_WRITE_TIMEOUT, 458 HCE_TCP_SOCKET_ERROR, 459 HCE_TCP_SOCKET_LIMIT, 460 HCE_TCP_SOCKET_OPTION, 461 HCE_TCP_CONNECT_FAIL, 462 HCE_TCP_CONNECT_TIMEOUT, 463 HCE_TCP_CONNECT_OK, 464 HCE_TCP_WRITE_TIMEOUT, 465 HCE_TCP_WRITE_FAIL, 466 HCE_TCP_READ_TIMEOUT, 467 HCE_TCP_READ_FAIL, 468 HCE_SCRIPT_OK, 469 HCE_SCRIPT_FAIL, 470 HCE_TLS_CONNECT_ERROR, 471 HCE_TLS_CONNECT_FAIL, 472 HCE_TLS_CONNECT_OK, 473 HCE_TLS_CONNECT_TIMEOUT, 474 HCE_TLS_READ_TIMEOUT, 475 HCE_TLS_WRITE_TIMEOUT, 476 HCE_TLS_READ_ERROR, 477 HCE_TLS_WRITE_ERROR, 478 HCE_SEND_EXPECT_FAIL, 479 HCE_SEND_EXPECT_OK, 480 HCE_HTTP_CODE_ERROR, 481 HCE_HTTP_CODE_FAIL, 482 HCE_HTTP_CODE_OK, 483 HCE_HTTP_DIGEST_ERROR, 484 HCE_HTTP_DIGEST_FAIL, 485 HCE_HTTP_DIGEST_OK, 486 }; 487 488 enum host_status { 489 HOST_DOWN = -1, 490 HOST_UNKNOWN = 0, 491 HOST_UP = 1 492 }; 493 #define HOST_ISUP(x) (x == HOST_UP) 494 495 struct table_config { 496 objid_t id; 497 objid_t rdrid; 498 u_int32_t flags; 499 int check; 500 char demote_group[IFNAMSIZ]; 501 char ifname[IFNAMSIZ]; 502 struct timeval timeout; 503 in_port_t port; 504 int retcode; 505 int skip_cnt; 506 char name[TABLE_NAME_SIZE]; 507 size_t name_len; 508 char path[PATH_MAX]; 509 unsigned char exbinbuf[128]; 510 char exbuf[256]; 511 char digest[41]; /* length of sha1 digest * 2 */ 512 u_int8_t digest_type; 513 enum forwardmode fwdmode; 514 }; 515 516 struct table { 517 TAILQ_ENTRY(table) entry; 518 struct table_config conf; 519 int up; 520 int skipped; 521 struct hostlist hosts; 522 struct tls_config *tls_cfg; 523 struct ibuf *sendbinbuf; 524 char *sendbuf; 525 }; 526 TAILQ_HEAD(tablelist, table); 527 528 enum table_check { 529 CHECK_NOCHECK = 0, 530 CHECK_ICMP = 1, 531 CHECK_TCP = 2, 532 CHECK_HTTP_CODE = 3, 533 CHECK_HTTP_DIGEST = 4, 534 CHECK_BINSEND_EXPECT = 5, 535 CHECK_SEND_EXPECT = 6, 536 CHECK_SCRIPT = 7 537 }; 538 539 struct rdr_config { 540 objid_t id; 541 u_int32_t flags; 542 in_port_t port; 543 objid_t table_id; 544 objid_t backup_id; 545 int mode; 546 union hashkey key; 547 char name[SRV_NAME_SIZE]; 548 char tag[RD_TAG_NAME_SIZE]; 549 struct timeval timeout; 550 }; 551 552 struct rdr { 553 TAILQ_ENTRY(rdr) entry; 554 struct rdr_config conf; 555 struct addresslist virts; 556 struct table *table; 557 struct table *backup; /* use this if no host up */ 558 struct ctl_stats stats; 559 }; 560 TAILQ_HEAD(rdrlist, rdr); 561 562 struct rsession { 563 objid_t se_id; 564 objid_t se_relayid; 565 struct sockaddr_storage se_sockname; 566 struct ctl_relay_event se_in; 567 struct ctl_relay_event se_out; 568 void *se_priv; 569 SIPHASH_CTX se_siphashctx; 570 struct relay_table *se_table; 571 struct relay_table *se_table0; 572 struct event se_ev; 573 struct timeval se_timeout; 574 struct timeval se_tv_start; 575 struct timeval se_tv_last; 576 struct event se_inflightevt; 577 int se_done; 578 int se_retry; 579 int se_retrycount; 580 int se_connectcount; 581 int se_haslog; 582 struct evbuffer *se_log; 583 struct relay *se_relay; 584 struct ctl_natlook *se_cnl; 585 int se_bnds; 586 u_int16_t se_tag; 587 u_int16_t se_label; 588 589 int se_cid; 590 pid_t se_pid; 591 SPLAY_ENTRY(rsession) se_nodes; 592 TAILQ_ENTRY(rsession) se_entry; 593 }; 594 SPLAY_HEAD(session_tree, rsession); 595 TAILQ_HEAD(sessionlist, rsession); 596 597 enum prototype { 598 RELAY_PROTO_TCP = 0, 599 RELAY_PROTO_HTTP, 600 RELAY_PROTO_DNS 601 }; 602 603 enum relay_result { 604 RES_DROP = 0, 605 RES_PASS = 1, 606 RES_FAIL = -1, 607 RES_BAD = -2, 608 RES_INTERNAL = -3 609 }; 610 611 enum rule_action { 612 RULE_ACTION_MATCH = 0, 613 RULE_ACTION_PASS, 614 RULE_ACTION_BLOCK 615 }; 616 617 struct rule_addr { 618 struct sockaddr_storage addr; 619 u_int8_t addr_mask; 620 int addr_port; 621 }; 622 623 #define RELAY_ADDR_EQ(_a, _b) \ 624 ((_a)->addr_mask == (_b)->addr_mask && \ 625 sockaddr_cmp((struct sockaddr *)&(_a)->addr, \ 626 (struct sockaddr *)&(_b)->addr, (_a)->addr_mask) == 0) 627 628 #define RELAY_ADDR_CMP(_a, _b) \ 629 sockaddr_cmp((struct sockaddr *)&(_a)->addr, \ 630 (struct sockaddr *)(_b), (_a)->addr_mask) 631 632 #define RELAY_ADDR_NEQ(_a, _b) \ 633 ((_a)->addr_mask != (_b)->addr_mask || \ 634 sockaddr_cmp((struct sockaddr *)&(_a)->addr, \ 635 (struct sockaddr *)&(_b)->addr, (_a)->addr_mask) != 0) 636 637 #define RELAY_AF_NEQ(_a, _b) \ 638 (((_a) != AF_UNSPEC) && ((_b) != AF_UNSPEC) && \ 639 ((_a) != (_b))) 640 641 struct relay_rule { 642 objid_t rule_id; 643 objid_t rule_protoid; 644 645 u_int rule_action; 646 #define RULE_SKIP_PROTO 0 647 #define RULE_SKIP_DIR 1 648 #define RULE_SKIP_AF 2 649 #define RULE_SKIP_SRC 3 650 #define RULE_SKIP_DST 4 651 #define RULE_SKIP_METHOD 5 652 #define RULE_SKIP_COUNT 6 653 struct relay_rule *rule_skip[RULE_SKIP_COUNT]; 654 655 #define RULE_FLAG_QUICK 0x01 656 u_int8_t rule_flags; 657 658 int rule_label; 659 int rule_tag; 660 int rule_tagged; 661 enum direction rule_dir; 662 u_int rule_proto; 663 int rule_af; 664 struct rule_addr rule_src; 665 struct rule_addr rule_dst; 666 struct relay_table *rule_table; 667 668 u_int rule_method; 669 char rule_labelname[LABEL_NAME_SIZE]; 670 char rule_tablename[TABLE_NAME_SIZE]; 671 char rule_taggedname[TAG_NAME_SIZE]; 672 char rule_tagname[TAG_NAME_SIZE]; 673 674 struct ctl_rule rule_ctl; 675 struct kv rule_kv[KEY_TYPE_MAX]; 676 struct kvlist rule_kvlist; 677 678 TAILQ_ENTRY(relay_rule) rule_entry; 679 }; 680 TAILQ_HEAD(relay_rules, relay_rule); 681 682 #define TCPFLAG_NODELAY 0x01 683 #define TCPFLAG_NNODELAY 0x02 684 #define TCPFLAG_SACK 0x04 685 #define TCPFLAG_NSACK 0x08 686 #define TCPFLAG_BUFSIZ 0x10 687 #define TCPFLAG_IPTTL 0x20 688 #define TCPFLAG_IPMINTTL 0x40 689 #define TCPFLAG_NSPLICE 0x80 690 #define TCPFLAG_DEFAULT 0x00 691 692 #define TCPFLAG_BITS \ 693 "\10\01NODELAY\02NO_NODELAY\03SACK\04NO_SACK" \ 694 "\05SOCKET_BUFFER_SIZE\06IP_TTL\07IP_MINTTL\10NO_SPLICE" 695 696 #define TLSFLAG_SSLV3 0x01 697 #define TLSFLAG_TLSV1_0 0x02 698 #define TLSFLAG_TLSV1_1 0x04 699 #define TLSFLAG_TLSV1_2 0x08 700 #define TLSFLAG_TLSV1_3 0x10 701 #define TLSFLAG_TLSV1 0x1e 702 #define TLSFLAG_VERSION 0x1f 703 #define TLSFLAG_CIPHER_SERVER_PREF 0x20 704 #define TLSFLAG_CLIENT_RENEG 0x40 705 #define TLSFLAG_DEFAULT \ 706 (TLSFLAG_TLSV1_2|TLSFLAG_TLSV1_3|TLSFLAG_CIPHER_SERVER_PREF) 707 708 #define TLSFLAG_BITS \ 709 "\06\01sslv3\02tlsv1.0\03tlsv1.1\04tlsv1.2\05tlsv1.3" \ 710 "\06cipher-server-preference\07client-renegotiation" 711 712 #define TLSCIPHERS_DEFAULT "HIGH:!aNULL" 713 #define TLSECDHECURVES_DEFAULT "default" 714 #define TLSDHPARAM_DEFAULT "none" 715 716 struct relay_ticket_key { 717 uint32_t tt_keyrev; 718 unsigned char tt_key[TLS_TICKET_KEY_SIZE]; 719 }; 720 #define TLS_SESSION_LIFETIME (2 * 3600) 721 722 #define HTTPFLAG_WEBSOCKETS 0x01 723 724 struct keyname { 725 TAILQ_ENTRY(keyname) entry; 726 char *name; 727 }; 728 TAILQ_HEAD(keynamelist, keyname); 729 730 struct protocol { 731 objid_t id; 732 u_int32_t flags; 733 u_int8_t tcpflags; 734 int tcpbufsiz; 735 int tcpbacklog; 736 u_int8_t tcpipttl; 737 u_int8_t tcpipminttl; 738 size_t httpheaderlen; 739 int httpflags; 740 u_int8_t tlsflags; 741 char tlsciphers[768]; 742 char tlsdhparams[128]; 743 char tlsecdhecurves[128]; 744 char tlsca[PATH_MAX]; 745 char tlscacert[PATH_MAX]; 746 char tlscakey[PATH_MAX]; 747 char *tlscapass; 748 struct keynamelist tlscerts; 749 char name[MAX_NAME_SIZE]; 750 int tickets; 751 enum prototype type; 752 char *style; 753 754 int (*cmp)(struct rsession *, struct rsession *); 755 void *(*validate)(struct rsession *, struct relay *, 756 struct sockaddr_storage *, 757 u_int8_t *, size_t); 758 int (*request)(struct rsession *); 759 void (*close)(struct rsession *); 760 761 struct relay_rules rules; 762 int rulecount; 763 764 TAILQ_ENTRY(protocol) entry; 765 }; 766 TAILQ_HEAD(protolist, protocol); 767 768 struct relay_table { 769 struct table *rlt_table; 770 u_int32_t rlt_flags; 771 int rlt_mode; 772 u_int32_t rlt_index; 773 struct host *rlt_host[RELAY_MAXHOSTS]; 774 int rlt_nhosts; 775 TAILQ_ENTRY(relay_table) rlt_entry; 776 }; 777 TAILQ_HEAD(relaytables, relay_table); 778 779 struct ca_pkey { 780 char pkey_hash[TLS_CERT_HASH_SIZE]; 781 EVP_PKEY *pkey; 782 TAILQ_ENTRY(ca_pkey) pkey_entry; 783 }; 784 TAILQ_HEAD(ca_pkeylist, ca_pkey); 785 786 struct relay_cert { 787 objid_t cert_id; 788 objid_t cert_relayid; 789 int cert_fd; 790 int cert_key_fd; 791 int cert_ocsp_fd; 792 EVP_PKEY *cert_pkey; 793 TAILQ_ENTRY(relay_cert) cert_entry; 794 }; 795 TAILQ_HEAD(relaycertlist, relay_cert); 796 797 struct relay_config { 798 objid_t id; 799 u_int32_t flags; 800 objid_t proto; 801 char name[HOST_NAME_MAX+1]; 802 in_port_t port; 803 in_port_t dstport; 804 int dstretry; 805 struct sockaddr_storage ss; 806 struct sockaddr_storage dstss; 807 struct sockaddr_storage dstaf; 808 struct timeval timeout; 809 enum forwardmode fwdmode; 810 union hashkey hashkey; 811 off_t tls_cakey_len; 812 }; 813 814 struct relay { 815 TAILQ_ENTRY(relay) rl_entry; 816 struct relay_config rl_conf; 817 818 int rl_up; 819 struct protocol *rl_proto; 820 int rl_s; 821 struct bufferevent *rl_bev; 822 823 int rl_dsts; 824 struct bufferevent *rl_dstbev; 825 826 struct relaytables rl_tables; 827 828 struct event rl_ev; 829 struct event rl_evt; 830 831 struct tls_config *rl_tls_cfg; 832 struct tls_config *rl_tls_client_cfg; 833 struct tls *rl_tls_ctx; 834 835 int rl_tls_ca_fd; 836 int rl_tls_cacert_fd; 837 EVP_PKEY *rl_tls_pkey; 838 X509 *rl_tls_cacertx509; 839 char *rl_tls_cakey; 840 EVP_PKEY *rl_tls_capkey; 841 842 struct ctl_stats rl_stats[PROC_MAX_INSTANCES + 1]; 843 844 struct session_tree rl_sessions; 845 }; 846 TAILQ_HEAD(relaylist, relay); 847 848 enum dstmode { 849 RELAY_DSTMODE_LOADBALANCE = 0, 850 RELAY_DSTMODE_ROUNDROBIN, 851 RELAY_DSTMODE_HASH, 852 RELAY_DSTMODE_SRCHASH, 853 RELAY_DSTMODE_LEASTSTATES, 854 RELAY_DSTMODE_RANDOM 855 }; 856 #define RELAY_DSTMODE_DEFAULT RELAY_DSTMODE_ROUNDROBIN 857 858 struct netroute_config { 859 objid_t id; 860 struct sockaddr_storage ss; 861 int prefixlen; 862 objid_t routerid; 863 }; 864 865 struct netroute { 866 struct netroute_config nr_conf; 867 868 TAILQ_ENTRY(netroute) nr_entry; 869 TAILQ_ENTRY(netroute) nr_route; 870 871 struct router *nr_router; 872 }; 873 TAILQ_HEAD(netroutelist, netroute); 874 875 struct router_config { 876 objid_t id; 877 u_int32_t flags; 878 char name[HOST_NAME_MAX+1]; 879 char label[RT_LABEL_SIZE]; 880 int nroutes; 881 objid_t gwtable; 882 in_port_t gwport; 883 int rtable; 884 int af; 885 }; 886 887 struct router { 888 struct router_config rt_conf; 889 890 struct table *rt_gwtable; 891 struct netroutelist rt_netroutes; 892 893 TAILQ_ENTRY(router) rt_entry; 894 }; 895 TAILQ_HEAD(routerlist, router); 896 897 struct ctl_netroute { 898 int up; 899 struct host_config host; 900 struct netroute_config nr; 901 struct router_config rt; 902 }; 903 904 /* initially control.h */ 905 struct control_sock { 906 const char *cs_name; 907 struct event cs_ev; 908 struct event cs_evt; 909 int cs_fd; 910 int cs_restricted; 911 void *cs_env; 912 913 TAILQ_ENTRY(control_sock) cs_entry; 914 }; 915 TAILQ_HEAD(control_socks, control_sock); 916 917 extern struct { 918 struct event ev; 919 int fd; 920 } control_state; 921 922 struct imsgev { 923 struct imsgbuf ibuf; 924 void (*handler)(int, short, void *); 925 struct event ev; 926 struct privsep_proc *proc; 927 void *data; 928 short events; 929 }; 930 931 #define IMSG_SIZE_CHECK(imsg, p) do { \ 932 if (IMSG_DATA_SIZE(imsg) < sizeof(*p)) \ 933 fatalx("bad length imsg received"); \ 934 } while (0) 935 #define IMSG_DATA_SIZE(imsg) ((imsg)->hdr.len - IMSG_HEADER_SIZE) 936 937 struct ctl_conn { 938 TAILQ_ENTRY(ctl_conn) entry; 939 u_int8_t flags; 940 u_int waiting; 941 #define CTL_CONN_NOTIFY 0x01 942 struct imsgev iev; 943 944 }; 945 TAILQ_HEAD(ctl_connlist, ctl_conn); 946 947 enum imsg_type { 948 IMSG_NONE, 949 IMSG_CTL_OK, /* answer to relayctl requests */ 950 IMSG_CTL_FAIL, 951 IMSG_CTL_VERBOSE, 952 IMSG_CTL_PROCFD, 953 IMSG_CTL_END, 954 IMSG_CTL_RDR, 955 IMSG_CTL_TABLE, 956 IMSG_CTL_HOST, 957 IMSG_CTL_RELAY, 958 IMSG_CTL_SESSION, 959 IMSG_CTL_ROUTER, 960 IMSG_CTL_NETROUTE, 961 IMSG_CTL_TABLE_CHANGED, 962 IMSG_CTL_PULL_RULESET, 963 IMSG_CTL_PUSH_RULESET, 964 IMSG_CTL_SHOW_SUM, /* relayctl requests */ 965 IMSG_CTL_RDR_ENABLE, 966 IMSG_CTL_RDR_DISABLE, 967 IMSG_CTL_TABLE_ENABLE, 968 IMSG_CTL_TABLE_DISABLE, 969 IMSG_CTL_HOST_ENABLE, 970 IMSG_CTL_HOST_DISABLE, 971 IMSG_CTL_SHUTDOWN, 972 IMSG_CTL_START, 973 IMSG_CTL_RELOAD, 974 IMSG_CTL_RESET, 975 IMSG_CTL_POLL, 976 IMSG_CTL_NOTIFY, 977 IMSG_CTL_RDR_STATS, 978 IMSG_CTL_RELAY_STATS, 979 IMSG_RDR_ENABLE, /* notifies from pfe to hce */ 980 IMSG_RDR_DISABLE, 981 IMSG_TABLE_ENABLE, 982 IMSG_TABLE_DISABLE, 983 IMSG_HOST_ENABLE, 984 IMSG_HOST_DISABLE, 985 IMSG_HOST_STATUS, /* notifies from hce to pfe */ 986 IMSG_SYNC, 987 IMSG_NATLOOK, 988 IMSG_DEMOTE, 989 IMSG_STATISTICS, 990 IMSG_SCRIPT, 991 IMSG_AGENTXSOCK, 992 IMSG_BINDANY, 993 IMSG_RTMSG, /* from pfe to parent */ 994 IMSG_CFG_TABLE, /* configuration from parent */ 995 IMSG_CFG_HOST, 996 IMSG_CFG_RDR, 997 IMSG_CFG_VIRT, 998 IMSG_CFG_ROUTER, 999 IMSG_CFG_ROUTE, 1000 IMSG_CFG_PROTO, 1001 IMSG_CFG_RULE, 1002 IMSG_CFG_RELAY, 1003 IMSG_CFG_RELAY_TABLE, 1004 IMSG_CFG_RELAY_CERT, 1005 IMSG_CFG_RELAY_FD, 1006 IMSG_CFG_DONE, 1007 IMSG_CA_PRIVENC, 1008 IMSG_CA_PRIVDEC, 1009 IMSG_SESS_PUBLISH, /* from relay to pfe */ 1010 IMSG_SESS_UNPUBLISH, 1011 IMSG_TLSTICKET_REKEY 1012 }; 1013 1014 enum privsep_procid { 1015 PROC_ALL = -1, 1016 PROC_PARENT = 0, 1017 PROC_HCE, 1018 PROC_RELAY, 1019 PROC_PFE, 1020 PROC_CA, 1021 PROC_MAX 1022 }; 1023 extern enum privsep_procid privsep_process; 1024 1025 /* Attach the control socket to the following process */ 1026 #define PROC_CONTROL PROC_PFE 1027 1028 struct privsep_pipes { 1029 int *pp_pipes[PROC_MAX]; 1030 }; 1031 1032 struct privsep { 1033 struct privsep_pipes *ps_pipes[PROC_MAX]; 1034 struct privsep_pipes *ps_pp; 1035 1036 struct imsgev *ps_ievs[PROC_MAX]; 1037 const char *ps_title[PROC_MAX]; 1038 u_int8_t ps_what[PROC_MAX]; 1039 1040 u_int ps_instances[PROC_MAX]; 1041 u_int ps_instance; 1042 1043 struct control_sock ps_csock; 1044 struct control_socks ps_rcsocks; 1045 1046 /* Event and signal handlers */ 1047 struct event ps_evsigint; 1048 struct event ps_evsigterm; 1049 struct event ps_evsigchld; 1050 struct event ps_evsighup; 1051 struct event ps_evsigpipe; 1052 struct event ps_evsigusr1; 1053 1054 int ps_noaction; 1055 struct passwd *ps_pw; 1056 struct relayd *ps_env; 1057 }; 1058 1059 struct privsep_proc { 1060 const char *p_title; 1061 enum privsep_procid p_id; 1062 int (*p_cb)(int, struct privsep_proc *, 1063 struct imsg *); 1064 void (*p_init)(struct privsep *, 1065 struct privsep_proc *); 1066 const char *p_chroot; 1067 struct privsep *p_ps; 1068 void (*p_shutdown)(void); 1069 struct passwd *p_pw; 1070 }; 1071 1072 struct privsep_fd { 1073 enum privsep_procid pf_procid; 1074 unsigned int pf_instance; 1075 }; 1076 1077 struct relayd_config { 1078 char tls_sid[SSL_MAX_SID_CTX_LENGTH]; 1079 char agentx_path[sizeof(((struct sockaddr_un *)NULL)->sun_path)]; 1080 char agentx_context[32]; 1081 struct timeval interval; 1082 struct timeval timeout; 1083 struct timeval statinterval; 1084 u_int16_t prefork_relay; 1085 u_int16_t opts; 1086 u_int32_t flags; 1087 }; 1088 1089 struct pfdata { 1090 int dev; 1091 struct pf_anchor *anchor; 1092 struct pfioc_trans pft; 1093 struct pfioc_trans_e pfte; 1094 u_int8_t pfused; 1095 }; 1096 1097 struct relayd { 1098 struct relayd_config sc_conf; 1099 const char *sc_conffile; 1100 struct pfdata *sc_pf; 1101 int sc_rtsock; 1102 int sc_rtseq; 1103 int sc_tablecount; 1104 int sc_rdrcount; 1105 int sc_protocount; 1106 int sc_relaycount; 1107 int sc_routercount; 1108 int sc_routecount; 1109 struct table sc_empty_table; 1110 struct protocol sc_proto_default; 1111 struct event sc_ev; 1112 struct tablelist *sc_tables; 1113 struct hostlist sc_hosts; 1114 struct rdrlist *sc_rdrs; 1115 struct protolist *sc_protos; 1116 struct relaylist *sc_relays; 1117 struct routerlist *sc_rts; 1118 struct netroutelist *sc_routes; 1119 struct ca_pkeylist *sc_pkeys; 1120 struct relaycertlist *sc_certs; 1121 struct sessionlist sc_sessions; 1122 char sc_demote_group[IFNAMSIZ]; 1123 u_int16_t sc_id; 1124 int sc_rtable; 1125 1126 struct event sc_statev; 1127 1128 struct event sc_agentxev; 1129 1130 int sc_has_icmp; 1131 int sc_has_icmp6; 1132 struct ctl_icmp_event sc_icmp_send; 1133 struct ctl_icmp_event sc_icmp_recv; 1134 struct ctl_icmp_event sc_icmp6_send; 1135 struct ctl_icmp_event sc_icmp6_recv; 1136 1137 struct relay_ticket_key sc_ticket; 1138 1139 struct privsep *sc_ps; 1140 int sc_reload; 1141 }; 1142 1143 #define RELAYD_OPT_VERBOSE 0x01 1144 #define RELAYD_OPT_NOACTION 0x04 1145 #define RELAYD_OPT_LOGUPDATE 0x08 1146 #define RELAYD_OPT_LOGHOSTCHECK 0x10 1147 #define RELAYD_OPT_LOGCON 0x20 1148 #define RELAYD_OPT_LOGCONERR 0x40 1149 1150 /* control.c */ 1151 int control_init(struct privsep *, struct control_sock *); 1152 int control_listen(struct control_sock *); 1153 void control_cleanup(struct control_sock *); 1154 void control_dispatch_imsg(int, short, void *); 1155 void control_imsg_forward(struct privsep *ps, struct imsg *); 1156 struct ctl_conn * 1157 control_connbyfd(int); 1158 1159 /* parse.y */ 1160 int parse_config(const char *, struct relayd *); 1161 int load_config(const char *, struct relayd *); 1162 int cmdline_symset(char *); 1163 1164 /* util.c */ 1165 const char *host_error(enum host_error); 1166 const char *host_status(enum host_status); 1167 const char *table_check(enum table_check); 1168 #ifdef DEBUG 1169 const char *relay_state(enum relay_state); 1170 #endif 1171 const char *print_availability(u_long, u_long); 1172 const char *print_host(struct sockaddr_storage *, char *, size_t); 1173 const char *print_time(struct timeval *, struct timeval *, char *, size_t); 1174 const char *printb_flags(const u_int32_t, const char *); 1175 void getmonotime(struct timeval *); 1176 struct ibuf *string2binary(const char *); 1177 void print_hex(uint8_t *, off_t, size_t); 1178 void print_debug(const char *, ...); 1179 1180 /* pfe.c */ 1181 void pfe(struct privsep *, struct privsep_proc *); 1182 void show(struct ctl_conn *); 1183 void show_sessions(struct ctl_conn *); 1184 int enable_rdr(struct ctl_conn *, struct ctl_id *); 1185 int enable_table(struct ctl_conn *, struct ctl_id *); 1186 int enable_host(struct ctl_conn *, struct ctl_id *, struct host *); 1187 int disable_rdr(struct ctl_conn *, struct ctl_id *); 1188 int disable_table(struct ctl_conn *, struct ctl_id *); 1189 int disable_host(struct ctl_conn *, struct ctl_id *, struct host *); 1190 1191 /* pfe_filter.c */ 1192 void init_tables(struct relayd *); 1193 void flush_table(struct relayd *, struct rdr *); 1194 void sync_table(struct relayd *, struct rdr *, struct table *); 1195 void sync_ruleset(struct relayd *, struct rdr *, int); 1196 void flush_rulesets(struct relayd *); 1197 int natlook(struct relayd *, struct ctl_natlook *); 1198 u_int64_t 1199 check_table(struct relayd *, struct rdr *, struct table *); 1200 1201 /* pfe_route.c */ 1202 void init_routes(struct relayd *); 1203 void sync_routes(struct relayd *, struct router *); 1204 int pfe_route(struct relayd *, struct ctl_netroute *); 1205 1206 /* hce.c */ 1207 void hce(struct privsep *, struct privsep_proc *); 1208 void hce_notify_done(struct host *, enum host_error); 1209 1210 /* relay.c */ 1211 void relay(struct privsep *, struct privsep_proc *); 1212 int relay_privinit(struct relay *); 1213 int relay_session_cmp(struct rsession *, struct rsession *); 1214 void relay_close(struct rsession *, const char *, int); 1215 int relay_reset_event(struct rsession *, struct ctl_relay_event *); 1216 void relay_natlook(int, short, void *); 1217 void relay_session(struct rsession *); 1218 int relay_from_table(struct rsession *); 1219 int relay_socket_af(struct sockaddr_storage *, in_port_t); 1220 in_port_t 1221 relay_socket_getport(struct sockaddr_storage *); 1222 int relay_cmp_af(struct sockaddr_storage *, 1223 struct sockaddr_storage *); 1224 void relay_write(struct bufferevent *, void *); 1225 void relay_read(struct bufferevent *, void *); 1226 int relay_splice(struct ctl_relay_event *); 1227 int relay_splicelen(struct ctl_relay_event *); 1228 int relay_spliceadjust(struct ctl_relay_event *); 1229 void relay_error(struct bufferevent *, short, void *); 1230 int relay_preconnect(struct rsession *); 1231 int relay_connect(struct rsession *); 1232 void relay_connected(int, short, void *); 1233 void relay_bindanyreq(struct rsession *, in_port_t, int); 1234 void relay_bindany(int, short, void *); 1235 void relay_dump(struct ctl_relay_event *, const void *, size_t); 1236 int relay_bufferevent_add(struct event *, int); 1237 int relay_bufferevent_print(struct ctl_relay_event *, const char *); 1238 int relay_bufferevent_write_buffer(struct ctl_relay_event *, 1239 struct evbuffer *); 1240 int relay_bufferevent_write_chunk(struct ctl_relay_event *, 1241 struct evbuffer *, size_t); 1242 int relay_bufferevent_write(struct ctl_relay_event *, 1243 void *, size_t); 1244 int relay_test(struct protocol *, struct ctl_relay_event *); 1245 void relay_calc_skip_steps(struct relay_rules *); 1246 void relay_match(struct kvlist *, struct kv *, struct kv *, 1247 struct kvtree *); 1248 void relay_session_publish(struct rsession *); 1249 void relay_session_unpublish(struct rsession *); 1250 1251 SPLAY_PROTOTYPE(session_tree, rsession, se_nodes, relay_session_cmp); 1252 1253 /* relay_http.c */ 1254 void relay_http(struct relayd *); 1255 void relay_http_init(struct relay *); 1256 void relay_abort_http(struct rsession *, u_int, const char *, 1257 u_int16_t); 1258 void relay_read_http(struct bufferevent *, void *); 1259 void relay_close_http(struct rsession *); 1260 u_int relay_httpmethod_byname(const char *); 1261 const char 1262 *relay_httpmethod_byid(u_int); 1263 const char 1264 *relay_httperror_byid(u_int); 1265 int relay_http_priv_init(struct rsession *); 1266 int relay_httpdesc_init(struct ctl_relay_event *); 1267 ssize_t relay_http_time(time_t, char *, size_t); 1268 1269 /* relay_udp.c */ 1270 void relay_udp_privinit(struct relay *); 1271 void relay_udp_init(struct relayd *, struct relay *); 1272 int relay_udp_bind(struct sockaddr_storage *, in_port_t, 1273 struct protocol *); 1274 void relay_udp_server(int, short, void *); 1275 1276 /* check_icmp.c */ 1277 void icmp_init(struct relayd *); 1278 void schedule_icmp(struct relayd *, struct host *); 1279 void check_icmp(struct relayd *, struct timeval *); 1280 1281 /* check_tcp.c */ 1282 void check_tcp(struct ctl_tcp_event *); 1283 1284 /* check_tls.c */ 1285 void check_tls(struct ctl_tcp_event *); 1286 1287 /* check_script.c */ 1288 void check_script(struct relayd *, struct host *); 1289 void script_done(struct relayd *, struct ctl_script *); 1290 int script_exec(struct relayd *, struct ctl_script *); 1291 1292 /* ssl.c */ 1293 char *ssl_load_key(struct relayd *, const char *, off_t *, char *); 1294 uint8_t *ssl_update_certificate(const uint8_t *, size_t, EVP_PKEY *, 1295 EVP_PKEY *, X509 *, size_t *); 1296 int ssl_load_pkey(char *, off_t, X509 **, EVP_PKEY **); 1297 1298 /* ca.c */ 1299 void ca(struct privsep *, struct privsep_proc *); 1300 void ca_engine_init(struct relayd *); 1301 void hash_x509(X509 *cert, char *hash, size_t hashlen); 1302 1303 /* relayd.c */ 1304 struct host *host_find(struct relayd *, objid_t); 1305 struct table *table_find(struct relayd *, objid_t); 1306 struct rdr *rdr_find(struct relayd *, objid_t); 1307 struct netroute *route_find(struct relayd *, objid_t); 1308 struct router *router_find(struct relayd *, objid_t); 1309 struct host *host_findbyname(struct relayd *, const char *); 1310 struct table *table_findbyname(struct relayd *, const char *); 1311 struct table *table_findbyconf(struct relayd *, struct table *); 1312 struct rdr *rdr_findbyname(struct relayd *, const char *); 1313 void event_again(struct event *, int, short, 1314 void (*)(int, short, void *), 1315 struct timeval *, struct timeval *, void *); 1316 struct relay *relay_find(struct relayd *, objid_t); 1317 struct protocol *proto_find(struct relayd *, objid_t); 1318 struct rsession *session_find(struct relayd *, objid_t); 1319 struct relay *relay_findbyname(struct relayd *, const char *); 1320 struct relay *relay_findbyaddr(struct relayd *, struct relay_config *); 1321 EVP_PKEY *pkey_find(struct relayd *, char *hash); 1322 struct ca_pkey *pkey_add(struct relayd *, EVP_PKEY *, char *hash); 1323 struct relay_cert *cert_add(struct relayd *, objid_t); 1324 struct relay_cert *cert_find(struct relayd *, objid_t); 1325 char *relay_load_fd(int, off_t *); 1326 int relay_load_certfiles(struct relayd *, struct relay *, 1327 const char *); 1328 int expand_string(char *, size_t, const char *, const char *); 1329 void translate_string(char *); 1330 void purge_key(char **, off_t); 1331 void purge_table(struct relayd *, struct tablelist *, 1332 struct table *); 1333 void purge_relay(struct relayd *, struct relay *); 1334 char *digeststr(enum digest_type, const u_int8_t *, size_t, char *); 1335 const char *canonicalize_host(const char *, char *, size_t); 1336 int parse_url(const char *, char **, char **, char **); 1337 int map6to4(struct sockaddr_storage *); 1338 int map4to6(struct sockaddr_storage *, struct sockaddr_storage *); 1339 void imsg_event_add(struct imsgev *); 1340 int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, 1341 pid_t, int, void *, u_int16_t); 1342 void socket_rlimit(int); 1343 char *get_string(u_int8_t *, size_t); 1344 void *get_data(u_int8_t *, size_t); 1345 int sockaddr_cmp(struct sockaddr *, struct sockaddr *, int); 1346 struct in6_addr *prefixlen2mask6(u_int8_t, u_int32_t *); 1347 u_int32_t prefixlen2mask(u_int8_t); 1348 int accept_reserve(int, struct sockaddr *, socklen_t *, int, 1349 volatile int *); 1350 struct kv *kv_add(struct kvtree *, char *, char *, int); 1351 int kv_set(struct kv *, char *, ...) 1352 __attribute__((__format__ (printf, 2, 3))); 1353 int kv_setkey(struct kv *, char *, ...) 1354 __attribute__((__format__ (printf, 2, 3))); 1355 void kv_delete(struct kvtree *, struct kv *); 1356 struct kv *kv_extend(struct kvtree *, struct kv *, char *); 1357 void kv_purge(struct kvtree *); 1358 void kv_free(struct kv *); 1359 struct kv *kv_inherit(struct kv *, struct kv *); 1360 void relay_log(struct rsession *, char *); 1361 int kv_log(struct rsession *, struct kv *, u_int16_t, 1362 enum direction); 1363 struct kv *kv_find(struct kvtree *, struct kv *); 1364 struct kv *kv_find_value(struct kvtree *, char *, const char *, 1365 const char *); 1366 int kv_cmp(struct kv *, struct kv *); 1367 int rule_add(struct protocol *, struct relay_rule *, const char 1368 *); 1369 void rule_delete(struct relay_rules *, struct relay_rule *); 1370 void rule_free(struct relay_rule *); 1371 struct relay_rule 1372 *rule_inherit(struct relay_rule *); 1373 void rule_settable(struct relay_rules *, struct relay_table *); 1374 RB_PROTOTYPE(kvtree, kv, kv_node, kv_cmp); 1375 1376 /* carp.c */ 1377 int carp_demote_init(char *, int); 1378 void carp_demote_shutdown(void); 1379 int carp_demote_get(char *); 1380 int carp_demote_set(char *, int); 1381 int carp_demote_reset(char *, int); 1382 1383 /* name2id.c */ 1384 u_int16_t label_name2id(const char *); 1385 const char *label_id2name(u_int16_t); 1386 void label_unref(u_int16_t); 1387 void label_ref(u_int16_t); 1388 u_int16_t tag_name2id(const char *); 1389 const char *tag_id2name(u_int16_t); 1390 void tag_unref(u_int16_t); 1391 void tag_ref(u_int16_t); 1392 1393 /* agentx_control.c */ 1394 void agentx_init(struct relayd *); 1395 void agentx_setsock(struct relayd *, enum privsep_procid); 1396 void agentx_getsock(struct imsg *); 1397 void snmp_hosttrap(struct relayd *, struct table *, struct host *); 1398 1399 /* shuffle.c */ 1400 void shuffle_init(struct shuffle *); 1401 u_int16_t shuffle_generate16(struct shuffle *); 1402 1403 /* log.c */ 1404 void log_init(int, int); 1405 void log_procinit(const char *); 1406 void log_setverbose(int); 1407 int log_getverbose(void); 1408 void log_warn(const char *, ...) 1409 __attribute__((__format__ (printf, 1, 2))); 1410 void log_warnx(const char *, ...) 1411 __attribute__((__format__ (printf, 1, 2))); 1412 void log_info(const char *, ...) 1413 __attribute__((__format__ (printf, 1, 2))); 1414 void log_debug(const char *, ...) 1415 __attribute__((__format__ (printf, 1, 2))); 1416 void logit(int, const char *, ...) 1417 __attribute__((__format__ (printf, 2, 3))); 1418 void vlog(int, const char *, va_list) 1419 __attribute__((__format__ (printf, 2, 0))); 1420 __dead void fatal(const char *, ...) 1421 __attribute__((__format__ (printf, 1, 2))); 1422 __dead void fatalx(const char *, ...) 1423 __attribute__((__format__ (printf, 1, 2))); 1424 1425 /* proc.c */ 1426 enum privsep_procid 1427 proc_getid(struct privsep_proc *, unsigned int, const char *); 1428 int proc_flush_imsg(struct privsep *, enum privsep_procid, int); 1429 void proc_init(struct privsep *, struct privsep_proc *, unsigned int, int, 1430 int, char **, enum privsep_procid); 1431 void proc_kill(struct privsep *); 1432 void proc_connect(struct privsep *); 1433 void proc_dispatch(int, short event, void *); 1434 void proc_run(struct privsep *, struct privsep_proc *, 1435 struct privsep_proc *, unsigned int, 1436 void (*)(struct privsep *, struct privsep_proc *, void *), void *); 1437 void proc_range(struct privsep *, enum privsep_procid, int *, int *); 1438 int proc_compose_imsg(struct privsep *, enum privsep_procid, int, 1439 u_int16_t, u_int32_t, int, void *, u_int16_t); 1440 int proc_compose(struct privsep *, enum privsep_procid, 1441 uint16_t, void *, uint16_t); 1442 int proc_composev_imsg(struct privsep *, enum privsep_procid, int, 1443 u_int16_t, u_int32_t, int, const struct iovec *, int); 1444 int proc_composev(struct privsep *, enum privsep_procid, 1445 uint16_t, const struct iovec *, int); 1446 int proc_forward_imsg(struct privsep *, struct imsg *, 1447 enum privsep_procid, int); 1448 struct imsgbuf * 1449 proc_ibuf(struct privsep *, enum privsep_procid, int); 1450 struct imsgev * 1451 proc_iev(struct privsep *, enum privsep_procid, int); 1452 void imsg_event_add(struct imsgev *); 1453 int imsg_compose_event(struct imsgev *, uint16_t, uint32_t, 1454 pid_t, int, void *, uint16_t); 1455 int imsg_composev_event(struct imsgev *, uint16_t, uint32_t, 1456 pid_t, int, const struct iovec *, int); 1457 1458 /* config.c */ 1459 int config_init(struct relayd *); 1460 void config_purge(struct relayd *, u_int); 1461 int config_setreset(struct relayd *, u_int); 1462 int config_getreset(struct relayd *, struct imsg *); 1463 int config_getcfg(struct relayd *, struct imsg *); 1464 int config_settable(struct relayd *, struct table *); 1465 int config_gettable(struct relayd *, struct imsg *); 1466 int config_gethost(struct relayd *, struct imsg *); 1467 int config_setrdr(struct relayd *, struct rdr *); 1468 int config_getrdr(struct relayd *, struct imsg *); 1469 int config_getvirt(struct relayd *, struct imsg *); 1470 int config_setrt(struct relayd *, struct router *); 1471 int config_getrt(struct relayd *, struct imsg *); 1472 int config_getroute(struct relayd *, struct imsg *); 1473 int config_setproto(struct relayd *, struct protocol *); 1474 int config_getproto(struct relayd *, struct imsg *); 1475 int config_setrule(struct relayd *, struct protocol *); 1476 int config_getrule(struct relayd *, struct imsg *); 1477 int config_setrelay(struct relayd *, struct relay *); 1478 int config_getrelay(struct relayd *, struct imsg *); 1479 int config_getrelaytable(struct relayd *, struct imsg *); 1480 int config_getrelayfd(struct relayd *, struct imsg *); 1481 1482 #endif /* RELAYD_H */ 1483