1 /* $OpenBSD: relayd.h,v 1.280 2026/06/03 19:26:56 rsadowski Exp $ */
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>
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.
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.
24 #include <sys/types.h>
25 #include <sys/socket.h>
26 #include <sys/queue.h>
32 #include <net/pfvar.h>
40 #include <openssl/ssl.h>
44 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
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 RT_LABEL_SIZE 32
61 #define MAX_NAME_SIZE 64
62 #define SRV_MAX_VIRTS 16
63 #define TLS_NAME_SIZE 512
64 #define TLS_CERT_HASH_SIZE 128
65 #define RELAY_MAX_PREFETCH 256
66 #define RELAY_MIN_PREFETCHED 32
70 #define RELAY_MAX_BACKLOG 512
71 #define RELAY_TIMEOUT 600
72 #define RELAY_CACHESIZE -1 /* use default size */
73 #define RELAY_NUMPROC 3
74 #define RELAY_MAXHOSTS 32
75 #define RELAY_MAXHEADERLENGTH 131072
76 #define RELAY_DEFHEADERLENGTH 8192
77 #define RELAY_STATINTERVAL 60
78 #define RELAY_BACKLOG 10
79 #define RELAY_MAXLOOKUPLEVELS 5
80 #define RELAY_OUTOF_FD_RETRIES 5
81 #define RELAY_MAX_HASH_RETRIES 5
82 #define RELAY_TLS_PRIV_TIMEOUT 1000 /* wait 1sec for the ca */
84 #define CONFIG_RELOAD 0x00
85 #define CONFIG_TABLES 0x01
86 #define CONFIG_RDRS 0x02
87 #define CONFIG_RELAYS 0x04
88 #define CONFIG_PROTOS 0x08
89 #define CONFIG_ROUTES 0x10
90 #define CONFIG_RTS 0x20
91 #define CONFIG_CA_ENGINE 0x40
92 #define CONFIG_CERTS 0x80
93 #define CONFIG_ALL 0xff
95 #define SMALL_READ_BUF_SIZE 1024
96 #define ICMP_BUF_SIZE 64
97 #define ICMP_RCVBUF_SIZE 262144
99 #define AGENTX_RECONNECT_TIMEOUT { 3, 0 } /* sec, usec */
101 #define PROC_PARENT_SOCK_FILENO 3
102 #define PROC_MAX_INSTANCES 32
105 #define DPRINTF log_debug
108 #define DPRINTF(x...) do {} while(0)
111 /* Used for DNS request ID randomization */
113 u_int16_t id_shuffle[65536];
117 typedef u_int32_t objid_t;
129 char name[MAX_NAME_SIZE];
132 struct ctl_relaytable {
145 RELAY_FD_CLIENTCACERT = 6
157 struct timeval timeout;
158 char name[HOST_NAME_MAX+1];
163 char group[IFNAMSIZ];
167 struct ctl_icmp_event {
173 struct timeval tv_start;
176 struct ctl_tcp_event {
181 struct timeval tv_start;
183 int (*validate_read)(struct ctl_tcp_event *);
184 int (*validate_close)(struct ctl_tcp_event *);
190 RELAY_DIR_INVALID = -1,
192 RELAY_DIR_REQUEST = 1,
193 RELAY_DIR_RESPONSE = 2
205 struct ctl_relay_event {
208 struct sockaddr_storage ss;
209 struct bufferevent *bev;
210 struct evbuffer *output;
211 struct ctl_relay_event *dst;
212 struct rsession *con;
215 struct tls_config *tls_cfg;
227 enum relay_state state;
230 /* protocol-specific descriptor */
235 TOREAD_UNLIMITED = -1,
236 TOREAD_HTTP_HEADER = -2,
237 TOREAD_HTTP_CHUNK_LENGTH = -3,
238 TOREAD_HTTP_CHUNK_TRAILER = -4
245 struct sockaddr_storage src;
246 struct sockaddr_storage dst;
247 struct sockaddr_storage rsrc;
248 struct sockaddr_storage rdst;
259 struct sockaddr_storage bnd_ss;
265 char cko_hash[TLS_CERT_HASH_SIZE];
314 struct ctl_kvlen kvlen[KEY_TYPE_MAX];
323 TAILQ_HEAD(kvlist, kv);
330 enum key_type kv_type;
331 enum key_option kv_option;
332 enum digest_type kv_digest;
334 #define KV_FLAG_MACRO 0x01
335 #define KV_FLAG_INVALID 0x02
336 #define KV_FLAG_GLOBBING 0x04
339 struct kvlist kv_children;
340 struct kv *kv_parent;
341 TAILQ_ENTRY(kv) kv_entry;
343 RB_ENTRY(kv) kv_node;
345 /* A few pointers used by the rule actions */
347 struct kvtree *kv_matchtree;
349 TAILQ_ENTRY(kv) kv_match_entry;
350 TAILQ_ENTRY(kv) kv_rule_entry;
351 TAILQ_ENTRY(kv) kv_action_entry;
361 struct sockaddr_storage ss;
363 struct portrange port;
364 char ifname[IFNAMSIZ];
365 TAILQ_ENTRY(address) entry;
367 TAILQ_HEAD(addresslist, address);
370 /* Simplified version of pf_poolhashkey */
372 SIPHASH_KEY siphashkey;
375 #define F_DISABLE 0x00000001
376 #define F_BACKUP 0x00000002
377 #define F_USED 0x00000004
378 #define F_DOWN 0x00000008
379 #define F_ADD 0x00000010
380 #define F_DEL 0x00000020
381 #define F_CHANGED 0x00000040
382 #define F_STICKY 0x00000080
383 #define F_CHECK_DONE 0x00000100
384 #define F_ACTIVE_RULESET 0x00000200
385 #define F_CHECK_SENT 0x00000400
386 #define F_TLS 0x00000800
387 #define F_NATLOOK 0x00001000
388 #define F_DEMOTE 0x00002000
389 #define F_LOOKUP_PATH 0x00004000
390 #define F_DEMOTED 0x00008000
391 #define F_UDP 0x00010000
392 #define F_RETURN 0x00020000
393 #define F_AGENTX 0x00040000
394 #define F_NEEDPF 0x00080000
395 #define F_PORT 0x00100000
396 #define F_TLSCLIENT 0x00200000
397 #define F_NEEDRT 0x00400000
398 #define F_MATCH 0x00800000
399 #define F_DIVERT 0x01000000
400 #define F_SCRIPT 0x02000000
401 #define F_TLSINSPECT 0x04000000
402 #define F_HASHKEY 0x08000000
403 #define F_AGENTX_TRAPONLY 0x10000000
404 #define F_PFLOG 0x20000000
405 #define F_PROXYV1 0x40000000
406 #define F_PROXYV2 0x80000000
409 "\10\01DISABLE\02BACKUP\03USED\04DOWN\05ADD\06DEL\07CHANGED" \
410 "\10STICKY-ADDRESS\11CHECK_DONE\12ACTIVE_RULESET\13CHECK_SENT" \
411 "\14TLS\15NAT_LOOKUP\16DEMOTE\17LOOKUP_PATH\20DEMOTED\21UDP" \
412 "\22RETURN\23TRAP\24NEEDPF\25PORT\26TLS_CLIENT\27NEEDRT" \
413 "\30MATCH\31DIVERT\32SCRIPT\33TLS_INSPECT\34HASHKEY" \
427 char name[HOST_NAME_MAX+1];
428 struct sockaddr_storage ss;
434 TAILQ_ENTRY(host) entry;
435 TAILQ_ENTRY(host) globalentry;
436 SLIST_ENTRY(host) child;
437 SLIST_HEAD(,host) children;
438 struct host_config conf;
449 struct ctl_tcp_event cte;
451 TAILQ_HEAD(hostlist, host);
456 HCE_INTERVAL_TIMEOUT,
458 HCE_ICMP_READ_TIMEOUT,
459 HCE_ICMP_WRITE_TIMEOUT,
460 HCE_TCP_SOCKET_ERROR,
461 HCE_TCP_SOCKET_LIMIT,
462 HCE_TCP_SOCKET_OPTION,
463 HCE_TCP_CONNECT_FAIL,
464 HCE_TCP_CONNECT_TIMEOUT,
466 HCE_TCP_WRITE_TIMEOUT,
468 HCE_TCP_READ_TIMEOUT,
472 HCE_TLS_CONNECT_ERROR,
473 HCE_TLS_CONNECT_FAIL,
475 HCE_TLS_CONNECT_TIMEOUT,
476 HCE_TLS_READ_TIMEOUT,
477 HCE_TLS_WRITE_TIMEOUT,
480 HCE_SEND_EXPECT_FAIL,
485 HCE_HTTP_DIGEST_ERROR,
486 HCE_HTTP_DIGEST_FAIL,
495 #define HOST_ISUP(x) (x == HOST_UP)
497 struct table_config {
502 char demote_group[IFNAMSIZ];
503 char ifname[IFNAMSIZ];
504 struct timeval timeout;
508 char name[TABLE_NAME_SIZE];
511 unsigned char exbinbuf[128];
513 char digest[41]; /* length of sha1 digest * 2 */
514 u_int8_t digest_type;
515 enum forwardmode fwdmode;
519 TAILQ_ENTRY(table) entry;
520 struct table_config conf;
523 struct hostlist hosts;
524 struct tls_config *tls_cfg;
525 struct ibuf *sendbinbuf;
528 TAILQ_HEAD(tablelist, table);
535 CHECK_HTTP_DIGEST = 4,
536 CHECK_BINSEND_EXPECT = 5,
537 CHECK_SEND_EXPECT = 6,
549 char name[PF_TABLE_NAME_SIZE];
550 char tag[PF_TAG_NAME_SIZE];
551 struct timeval timeout;
555 TAILQ_ENTRY(rdr) entry;
556 struct rdr_config conf;
557 struct addresslist virts;
559 struct table *backup; /* use this if no host up */
560 struct ctl_stats stats;
562 TAILQ_HEAD(rdrlist, rdr);
567 struct sockaddr_storage se_sockname;
568 struct ctl_relay_event se_in;
569 struct ctl_relay_event se_out;
571 SIPHASH_CTX se_siphashctx;
572 struct relay_table *se_table;
573 struct relay_table *se_table0;
575 struct timeval se_timeout;
576 struct timeval se_tv_start;
577 struct timeval se_tv_last;
578 struct event se_inflightevt;
584 struct evbuffer *se_log;
585 struct relay *se_relay;
586 struct ctl_natlook *se_cnl;
593 SPLAY_ENTRY(rsession) se_nodes;
594 TAILQ_ENTRY(rsession) se_entry;
596 SPLAY_HEAD(session_tree, rsession);
597 TAILQ_HEAD(sessionlist, rsession);
614 RULE_ACTION_MATCH = 0,
620 struct sockaddr_storage addr;
625 #define RELAY_ADDR_EQ(_a, _b) \
626 ((_a)->addr_mask == (_b)->addr_mask && \
627 sockaddr_cmp((struct sockaddr *)&(_a)->addr, \
628 (struct sockaddr *)&(_b)->addr, (_a)->addr_mask) == 0)
630 #define RELAY_ADDR_CMP(_a, _b) \
631 sockaddr_cmp((struct sockaddr *)&(_a)->addr, \
632 (struct sockaddr *)(_b), (_a)->addr_mask)
634 #define RELAY_ADDR_NEQ(_a, _b) \
635 ((_a)->addr_mask != (_b)->addr_mask || \
636 sockaddr_cmp((struct sockaddr *)&(_a)->addr, \
637 (struct sockaddr *)&(_b)->addr, (_a)->addr_mask) != 0)
639 #define RELAY_AF_NEQ(_a, _b) \
640 (((_a) != AF_UNSPEC) && ((_b) != AF_UNSPEC) && \
645 objid_t rule_protoid;
648 #define RULE_SKIP_PROTO 0
649 #define RULE_SKIP_DIR 1
650 #define RULE_SKIP_AF 2
651 #define RULE_SKIP_SRC 3
652 #define RULE_SKIP_DST 4
653 #define RULE_SKIP_METHOD 5
654 #define RULE_SKIP_COUNT 6
655 struct relay_rule *rule_skip[RULE_SKIP_COUNT];
657 #define RULE_FLAG_QUICK 0x01
663 enum direction rule_dir;
666 struct rule_addr rule_src;
667 struct rule_addr rule_dst;
668 struct relay_table *rule_table;
671 char rule_labelname[LABEL_NAME_SIZE];
672 char rule_tablename[TABLE_NAME_SIZE];
673 char rule_taggedname[TAG_NAME_SIZE];
674 char rule_tagname[TAG_NAME_SIZE];
676 struct ctl_rule rule_ctl;
677 struct kv rule_kv[KEY_TYPE_MAX];
678 struct kvlist rule_kvlist;
680 TAILQ_ENTRY(relay_rule) rule_entry;
682 TAILQ_HEAD(relay_rules, relay_rule);
684 #define TCPFLAG_NODELAY 0x01
685 #define TCPFLAG_NNODELAY 0x02
686 #define TCPFLAG_SACK 0x04
687 #define TCPFLAG_NSACK 0x08
688 #define TCPFLAG_BUFSIZ 0x10
689 #define TCPFLAG_IPTTL 0x20
690 #define TCPFLAG_IPMINTTL 0x40
691 #define TCPFLAG_NSPLICE 0x80
692 #define TCPFLAG_DEFAULT 0x00
694 #define TCPFLAG_BITS \
695 "\10\01NODELAY\02NO_NODELAY\03SACK\04NO_SACK" \
696 "\05SOCKET_BUFFER_SIZE\06IP_TTL\07IP_MINTTL\10NO_SPLICE"
698 #define TLSFLAG_SSLV3 0x01
699 #define TLSFLAG_TLSV1_0 0x02
700 #define TLSFLAG_TLSV1_1 0x04
701 #define TLSFLAG_TLSV1_2 0x08
702 #define TLSFLAG_TLSV1_3 0x10
703 #define TLSFLAG_TLSV1 0x1e
704 #define TLSFLAG_VERSION 0x1f
705 #define TLSFLAG_CIPHER_SERVER_PREF 0x20
706 #define TLSFLAG_CLIENT_RENEG 0x40
707 #define TLSFLAG_DEFAULT \
708 (TLSFLAG_TLSV1_2|TLSFLAG_TLSV1_3|TLSFLAG_CIPHER_SERVER_PREF)
710 #define TLSFLAG_BITS \
711 "\06\01sslv3\02tlsv1.0\03tlsv1.1\04tlsv1.2\05tlsv1.3" \
712 "\06cipher-server-preference\07client-renegotiation"
714 #define TLSCIPHERS_DEFAULT "HIGH:!aNULL"
715 #define TLSECDHECURVES_DEFAULT "default"
716 #define TLSDHPARAM_DEFAULT "none"
718 struct relay_ticket_key {
720 unsigned char tt_key[TLS_TICKET_KEY_SIZE];
722 #define TLS_SESSION_LIFETIME (2 * 3600)
724 #define HTTPFLAG_WEBSOCKETS 0x01
727 TAILQ_ENTRY(keyname) entry;
729 char certificate[PATH_MAX];
733 TAILQ_HEAD(keynamelist, keyname);
742 u_int8_t tcpipminttl;
743 size_t httpheaderlen;
746 char tlsciphers[768];
747 char tlsdhparams[128];
748 char tlsecdhecurves[128];
749 char tlsca[PATH_MAX];
750 char tlscacert[PATH_MAX];
751 char tlscakey[PATH_MAX];
753 char tlsclientca[PATH_MAX];
754 struct keynamelist tlscerts;
755 char name[MAX_NAME_SIZE];
760 int (*cmp)(struct rsession *, struct rsession *);
761 void *(*validate)(struct rsession *, struct relay *,
762 struct sockaddr_storage *,
764 int (*request)(struct rsession *);
765 void (*close)(struct rsession *);
767 struct relay_rules rules;
770 TAILQ_ENTRY(protocol) entry;
772 TAILQ_HEAD(protolist, protocol);
775 struct table *rlt_table;
779 struct host *rlt_host[RELAY_MAXHOSTS];
781 TAILQ_ENTRY(relay_table) rlt_entry;
783 TAILQ_HEAD(relaytables, relay_table);
786 char pkey_hash[TLS_CERT_HASH_SIZE];
788 TAILQ_ENTRY(ca_pkey) pkey_entry;
790 TAILQ_HEAD(ca_pkeylist, ca_pkey);
794 objid_t cert_relayid;
799 TAILQ_ENTRY(relay_cert) cert_entry;
801 TAILQ_HEAD(relaycertlist, relay_cert);
803 struct relay_config {
807 char name[HOST_NAME_MAX+1];
811 struct sockaddr_storage ss;
812 struct sockaddr_storage dstss;
813 struct sockaddr_storage dstaf;
814 struct timeval timeout;
815 enum forwardmode fwdmode;
816 union hashkey hashkey;
821 TAILQ_ENTRY(relay) rl_entry;
822 struct relay_config rl_conf;
825 struct protocol *rl_proto;
827 struct bufferevent *rl_bev;
830 struct bufferevent *rl_dstbev;
832 struct relaytables rl_tables;
837 struct tls_config *rl_tls_cfg;
838 struct tls_config *rl_tls_client_cfg;
839 struct tls *rl_tls_ctx;
842 int rl_tls_cacert_fd;
843 int rl_tls_client_ca_fd;
844 EVP_PKEY *rl_tls_pkey;
845 X509 *rl_tls_cacertx509;
847 EVP_PKEY *rl_tls_capkey;
849 struct ctl_stats rl_stats[PROC_MAX_INSTANCES + 1];
851 struct session_tree rl_sessions;
853 TAILQ_HEAD(relaylist, relay);
856 RELAY_DSTMODE_LOADBALANCE = 0,
857 RELAY_DSTMODE_ROUNDROBIN,
859 RELAY_DSTMODE_SRCHASH,
860 RELAY_DSTMODE_LEASTSTATES,
863 #define RELAY_DSTMODE_DEFAULT RELAY_DSTMODE_ROUNDROBIN
865 struct netroute_config {
867 struct sockaddr_storage ss;
873 struct netroute_config nr_conf;
875 TAILQ_ENTRY(netroute) nr_entry;
876 TAILQ_ENTRY(netroute) nr_route;
878 struct router *nr_router;
880 TAILQ_HEAD(netroutelist, netroute);
882 struct router_config {
885 char name[HOST_NAME_MAX+1];
886 char label[RT_LABEL_SIZE];
895 struct router_config rt_conf;
897 struct table *rt_gwtable;
898 struct netroutelist rt_netroutes;
900 TAILQ_ENTRY(router) rt_entry;
902 TAILQ_HEAD(routerlist, router);
904 struct ctl_netroute {
906 struct host_config host;
907 struct netroute_config nr;
908 struct router_config rt;
911 /* initially control.h */
912 struct control_sock {
920 TAILQ_ENTRY(control_sock) cs_entry;
922 TAILQ_HEAD(control_socks, control_sock);
926 void (*handler)(int, short, void *);
928 struct privsep_proc *proc;
933 #define IMSG_SIZE_CHECK(imsg, p) do { \
934 if (IMSG_DATA_SIZE(imsg) < sizeof(*p)) \
935 fatalx("bad length imsg received"); \
937 #define IMSG_DATA_SIZE(imsg) ((imsg)->hdr.len - IMSG_HEADER_SIZE)
940 TAILQ_ENTRY(ctl_conn) entry;
943 #define CTL_CONN_NOTIFY 0x01
947 TAILQ_HEAD(ctl_connlist, ctl_conn);
951 IMSG_CTL_OK, /* answer to relayctl requests */
963 IMSG_CTL_TABLE_CHANGED,
964 IMSG_CTL_PULL_RULESET,
965 IMSG_CTL_PUSH_RULESET,
966 IMSG_CTL_SHOW_SUM, /* relayctl requests */
968 IMSG_CTL_RDR_DISABLE,
969 IMSG_CTL_TABLE_ENABLE,
970 IMSG_CTL_TABLE_DISABLE,
971 IMSG_CTL_HOST_ENABLE,
972 IMSG_CTL_HOST_DISABLE,
980 IMSG_CTL_RELAY_STATS,
981 IMSG_RDR_ENABLE, /* notifies from pfe to hce */
987 IMSG_HOST_STATUS, /* notifies from hce to pfe */
995 IMSG_RTMSG, /* from pfe to parent */
996 IMSG_CFG_TABLE, /* configuration from parent */
1005 IMSG_CFG_RELAY_TABLE,
1006 IMSG_CFG_RELAY_CERT,
1011 IMSG_SESS_PUBLISH, /* from relay to pfe */
1012 IMSG_SESS_UNPUBLISH,
1013 IMSG_TLSTICKET_REKEY
1016 enum privsep_procid {
1025 extern enum privsep_procid privsep_process;
1027 /* Attach the control socket to the following process */
1028 #define PROC_CONTROL PROC_PFE
1030 struct privsep_pipes {
1031 int *pp_pipes[PROC_MAX];
1035 struct privsep_pipes *ps_pipes[PROC_MAX];
1036 struct privsep_pipes *ps_pp;
1038 struct imsgev *ps_ievs[PROC_MAX];
1039 const char *ps_title[PROC_MAX];
1040 u_int8_t ps_what[PROC_MAX];
1042 u_int ps_instances[PROC_MAX];
1045 struct control_sock ps_csock;
1046 struct control_socks ps_rcsocks;
1048 /* Event and signal handlers */
1049 struct event ps_evsigint;
1050 struct event ps_evsigterm;
1051 struct event ps_evsigchld;
1052 struct event ps_evsighup;
1053 struct event ps_evsigpipe;
1054 struct event ps_evsigusr1;
1057 struct passwd *ps_pw;
1058 struct relayd *ps_env;
1061 struct privsep_proc {
1062 const char *p_title;
1063 enum privsep_procid p_id;
1064 int (*p_cb)(int, struct privsep_proc *,
1066 void (*p_init)(struct privsep *,
1067 struct privsep_proc *);
1068 const char *p_chroot;
1069 struct privsep *p_ps;
1070 void (*p_shutdown)(void);
1071 struct passwd *p_pw;
1075 enum privsep_procid pf_procid;
1076 unsigned int pf_instance;
1079 struct relayd_config {
1080 char tls_sid[SSL_MAX_SID_CTX_LENGTH];
1081 char agentx_path[sizeof(((struct sockaddr_un *)NULL)->sun_path)];
1082 char agentx_context[32];
1083 struct timeval interval;
1084 struct timeval timeout;
1085 struct timeval statinterval;
1086 u_int16_t prefork_relay;
1093 struct pf_anchor *anchor;
1094 struct pfioc_trans pft;
1095 struct pfioc_trans_e pfte;
1100 struct relayd_config sc_conf;
1101 const char *sc_conffile;
1102 struct pfdata *sc_pf;
1111 struct table sc_empty_table;
1112 struct protocol sc_proto_default;
1114 struct tablelist *sc_tables;
1115 struct hostlist sc_hosts;
1116 struct rdrlist *sc_rdrs;
1117 struct protolist *sc_protos;
1118 struct relaylist *sc_relays;
1119 struct routerlist *sc_rts;
1120 struct netroutelist *sc_routes;
1121 struct ca_pkeylist *sc_pkeys;
1122 struct relaycertlist *sc_certs;
1123 struct sessionlist sc_sessions;
1124 char sc_demote_group[IFNAMSIZ];
1128 struct event sc_statev;
1130 struct event sc_agentxev;
1134 struct ctl_icmp_event sc_icmp_send;
1135 struct ctl_icmp_event sc_icmp_recv;
1136 struct ctl_icmp_event sc_icmp6_send;
1137 struct ctl_icmp_event sc_icmp6_recv;
1139 struct relay_ticket_key sc_ticket;
1141 struct privsep *sc_ps;
1145 #define RELAYD_OPT_VERBOSE 0x01
1146 #define RELAYD_OPT_NOACTION 0x04
1147 #define RELAYD_OPT_LOGUPDATE 0x08
1148 #define RELAYD_OPT_LOGHOSTCHECK 0x10
1149 #define RELAYD_OPT_LOGCON 0x20
1150 #define RELAYD_OPT_LOGCONERR 0x40
1153 int control_init(struct privsep *, struct control_sock *);
1154 int control_listen(struct control_sock *);
1155 void control_cleanup(struct control_sock *);
1156 void control_dispatch_imsg(int, short, void *);
1157 void control_imsg_forward(struct privsep *ps, struct imsg *);
1159 control_connbyfd(int);
1162 int parse_config(const char *, struct relayd *);
1163 int load_config(const char *, struct relayd *);
1164 int cmdline_symset(char *);
1167 const char *host_error(enum host_error);
1168 const char *host_status(enum host_status);
1169 const char *table_check(enum table_check);
1171 const char *relay_state(enum relay_state);
1173 const char *print_availability(u_long, u_long);
1174 const char *print_host(struct sockaddr_storage *, char *, size_t);
1175 const char *print_time(struct timeval *, struct timeval *, char *, size_t);
1176 const char *printb_flags(const u_int32_t, const char *);
1177 void getmonotime(struct timeval *);
1178 struct ibuf *string2binary(const char *);
1179 void print_hex(uint8_t *, off_t, size_t);
1180 void print_debug(const char *, ...);
1183 void pfe(struct privsep *, struct privsep_proc *);
1184 void show(struct ctl_conn *);
1185 void show_sessions(struct ctl_conn *);
1186 int enable_rdr(struct ctl_conn *, struct ctl_id *);
1187 int enable_table(struct ctl_conn *, struct ctl_id *);
1188 int enable_host(struct ctl_conn *, struct ctl_id *, struct host *);
1189 int disable_rdr(struct ctl_conn *, struct ctl_id *);
1190 int disable_table(struct ctl_conn *, struct ctl_id *);
1191 int disable_host(struct ctl_conn *, struct ctl_id *, struct host *);
1194 void init_tables(struct relayd *);
1195 void flush_table(struct relayd *, struct rdr *);
1196 void sync_table(struct relayd *, struct rdr *, struct table *);
1197 void sync_ruleset(struct relayd *, struct rdr *, int);
1198 void flush_rulesets(struct relayd *);
1199 int natlook(struct relayd *, struct ctl_natlook *);
1201 check_table(struct relayd *, struct rdr *, struct table *);
1204 void init_routes(struct relayd *);
1205 void sync_routes(struct relayd *, struct router *);
1206 int pfe_route(struct relayd *, struct ctl_netroute *);
1209 void hce(struct privsep *, struct privsep_proc *);
1210 void hce_notify_done(struct host *, enum host_error);
1213 void relay(struct privsep *, struct privsep_proc *);
1214 int relay_privinit(struct relay *);
1215 int relay_session_cmp(struct rsession *, struct rsession *);
1216 void relay_close(struct rsession *, const char *, int);
1217 int relay_reset_event(struct rsession *, struct ctl_relay_event *);
1218 void relay_natlook(int, short, void *);
1219 void relay_session(struct rsession *);
1220 int relay_from_table(struct rsession *);
1221 int relay_socket_af(struct sockaddr_storage *, in_port_t);
1223 relay_socket_getport(struct sockaddr_storage *);
1224 int relay_cmp_af(struct sockaddr_storage *,
1225 struct sockaddr_storage *);
1226 void relay_write(struct bufferevent *, void *);
1227 void relay_read(struct bufferevent *, void *);
1228 int relay_splice(struct ctl_relay_event *);
1229 int relay_splicelen(struct ctl_relay_event *);
1230 int relay_spliceadjust(struct ctl_relay_event *);
1231 void relay_error(struct bufferevent *, short, void *);
1232 int relay_preconnect(struct rsession *);
1233 int relay_connect(struct rsession *);
1234 void relay_connected(int, short, void *);
1235 void relay_bindanyreq(struct rsession *, in_port_t, int);
1236 void relay_bindany(int, short, void *);
1237 void relay_dump(struct ctl_relay_event *, const void *, size_t);
1238 int relay_bufferevent_add(struct event *, int);
1239 int relay_bufferevent_print(struct ctl_relay_event *, const char *);
1240 int relay_bufferevent_write_buffer(struct ctl_relay_event *,
1242 int relay_bufferevent_write_chunk(struct ctl_relay_event *,
1243 struct evbuffer *, size_t);
1244 int relay_bufferevent_write(struct ctl_relay_event *,
1246 int relay_test(struct protocol *, struct ctl_relay_event *);
1247 void relay_calc_skip_steps(struct relay_rules *);
1248 void relay_match(struct kvlist *, struct kv *, struct kv *,
1250 void relay_session_publish(struct rsession *);
1251 void relay_session_unpublish(struct rsession *);
1253 SPLAY_PROTOTYPE(session_tree, rsession, se_nodes, relay_session_cmp);
1256 void relay_http(struct relayd *);
1257 void relay_http_init(struct relay *);
1258 void relay_abort_http(struct rsession *, u_int, const char *,
1260 void relay_read_http(struct bufferevent *, void *);
1261 void relay_close_http(struct rsession *);
1262 u_int relay_httpmethod_byname(const char *);
1264 *relay_httpmethod_byid(u_int);
1266 *relay_httperror_byid(u_int);
1267 int relay_http_priv_init(struct rsession *);
1268 int relay_httpdesc_init(struct ctl_relay_event *);
1269 ssize_t relay_http_time(time_t, char *, size_t);
1272 void relay_udp_privinit(struct relay *);
1273 void relay_udp_init(struct relayd *, struct relay *);
1274 int relay_udp_bind(struct sockaddr_storage *, in_port_t,
1276 void relay_udp_server(int, short, void *);
1279 void icmp_init(struct relayd *);
1280 void schedule_icmp(struct relayd *, struct host *);
1281 void check_icmp(struct relayd *, struct timeval *);
1284 void check_tcp(struct ctl_tcp_event *);
1287 void check_tls(struct ctl_tcp_event *);
1289 /* check_script.c */
1290 void check_script(struct relayd *, struct host *);
1291 void script_done(struct relayd *, struct ctl_script *);
1292 int script_exec(struct relayd *, struct ctl_script *);
1295 char *ssl_load_key(struct relayd *, const char *, off_t *, char *);
1296 uint8_t *ssl_update_certificate(const uint8_t *, size_t, EVP_PKEY *,
1297 EVP_PKEY *, X509 *, size_t *);
1298 int ssl_load_pkey(char *, off_t, X509 **, EVP_PKEY **);
1301 void ca(struct privsep *, struct privsep_proc *);
1302 void ca_engine_init(struct relayd *);
1303 void hash_x509(X509 *cert, char *hash, size_t hashlen);
1306 struct host *host_find(struct relayd *, objid_t);
1307 struct table *table_find(struct relayd *, objid_t);
1308 struct rdr *rdr_find(struct relayd *, objid_t);
1309 struct netroute *route_find(struct relayd *, objid_t);
1310 struct router *router_find(struct relayd *, objid_t);
1311 struct host *host_findbyname(struct relayd *, const char *);
1312 struct table *table_findbyname(struct relayd *, const char *);
1313 struct table *table_findbyconf(struct relayd *, struct table *);
1314 struct rdr *rdr_findbyname(struct relayd *, const char *);
1315 void event_again(struct event *, int, short,
1316 void (*)(int, short, void *),
1317 struct timeval *, struct timeval *, void *);
1318 struct relay *relay_find(struct relayd *, objid_t);
1319 struct protocol *proto_find(struct relayd *, objid_t);
1320 struct rsession *session_find(struct relayd *, objid_t);
1321 struct relay *relay_findbyname(struct relayd *, const char *);
1322 struct relay *relay_findbyaddr(struct relayd *, struct relay_config *);
1323 EVP_PKEY *pkey_find(struct relayd *, char *hash);
1324 struct ca_pkey *pkey_add(struct relayd *, EVP_PKEY *, char *hash);
1325 struct relay_cert *cert_add(struct relayd *, objid_t);
1326 struct relay_cert *cert_find(struct relayd *, objid_t);
1327 char *relay_load_fd(int, off_t *);
1328 int relay_load_certfiles(struct relayd *, struct relay *,
1329 const struct keyname *);
1330 int expand_string(char *, size_t, const char *, const char *);
1331 void translate_string(char *);
1332 void purge_key(char **, off_t);
1333 void purge_table(struct relayd *, struct tablelist *,
1335 void purge_relay(struct relayd *, struct relay *);
1336 char *digeststr(enum digest_type, const u_int8_t *, size_t, char *);
1337 const char *canonicalize_host(const char *, char *, size_t);
1338 int parse_url(const char *, char **, char **, char **);
1339 int map6to4(struct sockaddr_storage *);
1340 int map4to6(struct sockaddr_storage *, struct sockaddr_storage *);
1341 void imsg_event_add(struct imsgev *);
1342 int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t,
1343 pid_t, int, void *, u_int16_t);
1344 void socket_rlimit(int);
1345 char *get_string(u_int8_t *, size_t);
1346 void *get_data(u_int8_t *, size_t);
1347 int sockaddr_cmp(struct sockaddr *, struct sockaddr *, int);
1348 struct in6_addr *prefixlen2mask6(u_int8_t, u_int32_t *);
1349 u_int32_t prefixlen2mask(u_int8_t);
1350 int accept_reserve(int, struct sockaddr *, socklen_t *, int,
1352 struct kv *kv_add(struct kvtree *, char *, char *, int);
1353 int kv_set(struct kv *, char *, ...)
1354 __attribute__((__format__ (printf, 2, 3)));
1355 int kv_setkey(struct kv *, char *, ...)
1356 __attribute__((__format__ (printf, 2, 3)));
1357 void kv_delete(struct kvtree *, struct kv *);
1358 void kv_purge(struct kvtree *);
1359 void kv_free(struct kv *);
1360 struct kv *kv_inherit(struct kv *, struct kv *);
1361 void relay_log(struct rsession *, char *);
1362 int kv_log(struct rsession *, struct kv *, u_int16_t,
1364 struct kv *kv_find(struct kvtree *, struct kv *);
1365 struct kv *kv_find_value(struct kvtree *, char *, const char *,
1367 int kv_cmp(struct kv *, struct kv *);
1368 int rule_add(struct protocol *, struct relay_rule *, const char
1370 void rule_delete(struct relay_rules *, struct relay_rule *);
1371 void rule_free(struct relay_rule *);
1373 *rule_inherit(struct relay_rule *);
1374 void rule_settable(struct relay_rules *, struct relay_table *);
1375 RB_PROTOTYPE(kvtree, kv, kv_node, kv_cmp);
1378 int carp_demote_init(char *, int);
1379 void carp_demote_shutdown(void);
1380 int carp_demote_get(char *);
1381 int carp_demote_set(char *, int);
1382 int carp_demote_reset(char *, int);
1385 u_int16_t label_name2id(const char *);
1386 const char *label_id2name(u_int16_t);
1387 void label_unref(u_int16_t);
1388 void label_ref(u_int16_t);
1389 u_int16_t tag_name2id(const char *);
1390 const char *tag_id2name(u_int16_t);
1391 void tag_unref(u_int16_t);
1392 void tag_ref(u_int16_t);
1394 /* agentx_control.c */
1395 void agentx_init(struct relayd *);
1396 void agentx_setsock(struct relayd *, enum privsep_procid);
1397 void agentx_getsock(struct imsg *);
1398 void snmp_hosttrap(struct relayd *, struct table *, struct host *);
1401 void shuffle_init(struct shuffle *);
1402 u_int16_t shuffle_generate16(struct shuffle *);
1406 proc_getid(struct privsep_proc *, unsigned int, const char *);
1407 int proc_flush_imsg(struct privsep *, enum privsep_procid, int);
1408 void proc_init(struct privsep *, struct privsep_proc *, unsigned int, int,
1409 int, char **, enum privsep_procid);
1410 void proc_kill(struct privsep *);
1411 void proc_connect(struct privsep *);
1412 void proc_dispatch(int, short event, void *);
1413 void proc_run(struct privsep *, struct privsep_proc *,
1414 struct privsep_proc *, unsigned int,
1415 void (*)(struct privsep *, struct privsep_proc *, void *), void *);
1416 void proc_range(struct privsep *, enum privsep_procid, int *, int *);
1417 int proc_compose_imsg(struct privsep *, enum privsep_procid, int,
1418 u_int16_t, u_int32_t, int, void *, u_int16_t);
1419 int proc_compose(struct privsep *, enum privsep_procid,
1420 uint16_t, void *, uint16_t);
1421 int proc_composev_imsg(struct privsep *, enum privsep_procid, int,
1422 u_int16_t, u_int32_t, int, const struct iovec *, int);
1423 int proc_composev(struct privsep *, enum privsep_procid,
1424 uint16_t, const struct iovec *, int);
1425 int proc_forward_imsg(struct privsep *, struct imsg *,
1426 enum privsep_procid, int);
1428 proc_ibuf(struct privsep *, enum privsep_procid, int);
1430 proc_iev(struct privsep *, enum privsep_procid, int);
1431 void imsg_event_add(struct imsgev *);
1432 int imsg_compose_event(struct imsgev *, uint16_t, uint32_t,
1433 pid_t, int, void *, uint16_t);
1434 int imsg_composev_event(struct imsgev *, uint16_t, uint32_t,
1435 pid_t, int, const struct iovec *, int);
1438 int config_init(struct relayd *);
1439 void config_purge(struct relayd *, u_int);
1440 int config_setreset(struct relayd *, u_int);
1441 int config_getreset(struct relayd *, struct imsg *);
1442 int config_getcfg(struct relayd *, struct imsg *);
1443 int config_settable(struct relayd *, struct table *);
1444 int config_gettable(struct relayd *, struct imsg *);
1445 int config_gethost(struct relayd *, struct imsg *);
1446 int config_setrdr(struct relayd *, struct rdr *);
1447 int config_getrdr(struct relayd *, struct imsg *);
1448 int config_getvirt(struct relayd *, struct imsg *);
1449 int config_setrt(struct relayd *, struct router *);
1450 int config_getrt(struct relayd *, struct imsg *);
1451 int config_getroute(struct relayd *, struct imsg *);
1452 int config_setproto(struct relayd *, struct protocol *);
1453 int config_getproto(struct relayd *, struct imsg *);
1454 int config_setrule(struct relayd *, struct protocol *);
1455 int config_getrule(struct relayd *, struct imsg *);
1456 int config_setrelay(struct relayd *, struct relay *);
1457 int config_getrelay(struct relayd *, struct imsg *);
1458 int config_getrelaytable(struct relayd *, struct imsg *);
1459 int config_getrelayfd(struct relayd *, struct imsg *);
1461 /* proxy_protocol.c */
1462 int proxy_protocol_v1(struct rsession *, struct evbuffer *);
1463 int proxy_protocol_v2(struct rsession *, struct evbuffer *);
1465 #endif /* RELAYD_H */