1dbed73cbSSangeeta Misra /* 2dbed73cbSSangeeta Misra * CDDL HEADER START 3dbed73cbSSangeeta Misra * 4dbed73cbSSangeeta Misra * The contents of this file are subject to the terms of the 5dbed73cbSSangeeta Misra * Common Development and Distribution License (the "License"). 6dbed73cbSSangeeta Misra * You may not use this file except in compliance with the License. 7dbed73cbSSangeeta Misra * 8dbed73cbSSangeeta Misra * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9dbed73cbSSangeeta Misra * or http://www.opensolaris.org/os/licensing. 10dbed73cbSSangeeta Misra * See the License for the specific language governing permissions 11dbed73cbSSangeeta Misra * and limitations under the License. 12dbed73cbSSangeeta Misra * 13dbed73cbSSangeeta Misra * When distributing Covered Code, include this CDDL HEADER in each 14dbed73cbSSangeeta Misra * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15dbed73cbSSangeeta Misra * If applicable, add the following below this CDDL HEADER, with the 16dbed73cbSSangeeta Misra * fields enclosed by brackets "[]" replaced with your own identifying 17dbed73cbSSangeeta Misra * information: Portions Copyright [yyyy] [name of copyright owner] 18dbed73cbSSangeeta Misra * 19dbed73cbSSangeeta Misra * CDDL HEADER END 20dbed73cbSSangeeta Misra */ 21dbed73cbSSangeeta Misra 22dbed73cbSSangeeta Misra /* 23*5df82708SSangeeta Misra * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 24dbed73cbSSangeeta Misra */ 25dbed73cbSSangeeta Misra #ifndef _ILBD_H 26dbed73cbSSangeeta Misra #define _ILBD_H 27dbed73cbSSangeeta Misra 28dbed73cbSSangeeta Misra #ifdef __cplusplus 29dbed73cbSSangeeta Misra extern "C" { 30dbed73cbSSangeeta Misra #endif 31dbed73cbSSangeeta Misra 32dbed73cbSSangeeta Misra #include <stdio.h> 33dbed73cbSSangeeta Misra #include <ucred.h> 34dbed73cbSSangeeta Misra #include <pwd.h> 35dbed73cbSSangeeta Misra #include <priv.h> 36dbed73cbSSangeeta Misra #include <stdarg.h> 37dbed73cbSSangeeta Misra #include <syslog.h> 38dbed73cbSSangeeta Misra #include <sys/list.h> 39dbed73cbSSangeeta Misra #include <libscf.h> 40dbed73cbSSangeeta Misra #include <libintl.h> 41dbed73cbSSangeeta Misra #include <locale.h> 42dbed73cbSSangeeta Misra #include <libinetutil.h> 43dbed73cbSSangeeta Misra #include <auth_list.h> 44dbed73cbSSangeeta Misra #include <bsm/adt.h> 45dbed73cbSSangeeta Misra #include <bsm/adt_event.h> 46dbed73cbSSangeeta Misra 47dbed73cbSSangeeta Misra #define SGNAME_SZ 80 48dbed73cbSSangeeta Misra #define ILB_FMRI "svc:/network/loadbalancer/ilb:default" 49dbed73cbSSangeeta Misra 50dbed73cbSSangeeta Misra #define HC_ACTION ILB_SRV_DISABLED_HC 51dbed73cbSSangeeta Misra #define ADMIN_ACTION ILB_SRV_DISABLED_ADMIN 52dbed73cbSSangeeta Misra 53dbed73cbSSangeeta Misra /* Max name and value length for scf properties */ 54dbed73cbSSangeeta Misra #define ILBD_MAX_NAME_LEN ilbd_scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) 55dbed73cbSSangeeta Misra #define ILBD_MAX_VALUE_LEN ilbd_scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH) 56dbed73cbSSangeeta Misra 57dbed73cbSSangeeta Misra /* Different events ILBD is interested in. */ 58dbed73cbSSangeeta Misra typedef enum { 59dbed73cbSSangeeta Misra ILBD_EVENT_NEW_REQ, /* New client request */ 60dbed73cbSSangeeta Misra ILBD_EVENT_REQ, /* Client request comes in */ 61dbed73cbSSangeeta Misra ILBD_EVENT_REP_OK, /* Reply channel to client is writeable */ 62dbed73cbSSangeeta Misra ILBD_EVENT_PROBE, /* A HC returns some result */ 63dbed73cbSSangeeta Misra ILBD_EVENT_TIMER /* ilbd_timer_q fired */ 64dbed73cbSSangeeta Misra } ilbd_event_t; 65dbed73cbSSangeeta Misra 66dbed73cbSSangeeta Misra typedef enum { 67dbed73cbSSangeeta Misra ILBD_SCF_RULE, /* prop group for rules */ 68dbed73cbSSangeeta Misra ILBD_SCF_SG, /* prop group for servergroups */ 69dbed73cbSSangeeta Misra ILBD_SCF_HC /* prop group for healthchecks */ 70dbed73cbSSangeeta Misra } ilbd_scf_pg_type_t; 71dbed73cbSSangeeta Misra 72dbed73cbSSangeeta Misra typedef enum { 73dbed73cbSSangeeta Misra ILBD_SCF_CREATE, 74dbed73cbSSangeeta Misra ILBD_SCF_DESTROY, 75dbed73cbSSangeeta Misra ILBD_SCF_ENABLE_DISABLE 76dbed73cbSSangeeta Misra } ilbd_scf_cmd_t; 77dbed73cbSSangeeta Misra 78dbed73cbSSangeeta Misra typedef enum { 79dbed73cbSSangeeta Misra ILBD_STRING, /* string */ 80dbed73cbSSangeeta Misra ILBD_INT, /* int */ 81dbed73cbSSangeeta Misra ILBD_ADDR_V4, /* ipv4 addr */ 82dbed73cbSSangeeta Misra ILBD_ADDR_V6 /* ipv6 addr */ 83dbed73cbSSangeeta Misra } ilbd_scf_data_type_t; 84dbed73cbSSangeeta Misra 85dbed73cbSSangeeta Misra typedef enum { 86dbed73cbSSangeeta Misra stat_enable_server, 87dbed73cbSSangeeta Misra stat_disable_server, 88dbed73cbSSangeeta Misra stat_declare_srv_dead, 89dbed73cbSSangeeta Misra stat_declare_srv_alive 90dbed73cbSSangeeta Misra } ilbd_srv_status_ind_t; 91dbed73cbSSangeeta Misra 92dbed73cbSSangeeta Misra /* 93dbed73cbSSangeeta Misra * All user struct pointer passed to port_associate() should have the first 94dbed73cbSSangeeta Misra * field as ilbd_event_t. The following struct can be used to find the 95dbed73cbSSangeeta Misra * event. 96dbed73cbSSangeeta Misra */ 97dbed73cbSSangeeta Misra typedef struct { 98dbed73cbSSangeeta Misra ilbd_event_t ev; 99dbed73cbSSangeeta Misra } ilbd_event_obj_t; 100dbed73cbSSangeeta Misra 101dbed73cbSSangeeta Misra typedef struct { 102dbed73cbSSangeeta Misra ilbd_event_t ev; 103dbed73cbSSangeeta Misra timer_t timerid; 104dbed73cbSSangeeta Misra } ilbd_timer_event_obj_t; 105dbed73cbSSangeeta Misra 106dbed73cbSSangeeta Misra typedef struct ilbd_srv { 107dbed73cbSSangeeta Misra list_node_t isv_srv_link; 108dbed73cbSSangeeta Misra ilb_sg_srv_t isv_srv; 109dbed73cbSSangeeta Misra #define isv_addr isv_srv.sgs_addr 110dbed73cbSSangeeta Misra #define isv_minport isv_srv.sgs_minport 111dbed73cbSSangeeta Misra #define isv_maxport isv_srv.sgs_maxport 112dbed73cbSSangeeta Misra #define isv_flags isv_srv.sgs_flags 113dbed73cbSSangeeta Misra #define isv_id isv_srv.sgs_id 114dbed73cbSSangeeta Misra #define isv_srvID isv_srv.sgs_srvID 115dbed73cbSSangeeta Misra } ilbd_srv_t; 116dbed73cbSSangeeta Misra 117dbed73cbSSangeeta Misra #define MAX_SRVCOUNT 1000 118dbed73cbSSangeeta Misra #define MAX_SRVID (MAX_SRVCOUNT - 1) 119dbed73cbSSangeeta Misra #define BAD_SRVID (-1) 120dbed73cbSSangeeta Misra 121dbed73cbSSangeeta Misra typedef struct ilbd_sg { 122dbed73cbSSangeeta Misra list_t isg_srvlist; /* list of ilbd_srv_t */ 123dbed73cbSSangeeta Misra char isg_name[ILB_SGNAME_SZ]; 124dbed73cbSSangeeta Misra int32_t isg_srvcount; 125dbed73cbSSangeeta Misra int32_t isg_max_id; 126dbed73cbSSangeeta Misra list_t isg_rulelist; /* list of ilbd_rule_t */ 127dbed73cbSSangeeta Misra char isg_id_arr[MAX_SRVCOUNT]; /* for server ID allocation */ 128dbed73cbSSangeeta Misra 129dbed73cbSSangeeta Misra list_node_t isg_link; /* linkage for sg list */ 130dbed73cbSSangeeta Misra } ilbd_sg_t; 131dbed73cbSSangeeta Misra 132dbed73cbSSangeeta Misra typedef struct ilbd_rule { 133dbed73cbSSangeeta Misra list_node_t irl_link; 134dbed73cbSSangeeta Misra list_node_t irl_sglink; 135dbed73cbSSangeeta Misra ilbd_sg_t *irl_sg; 136dbed73cbSSangeeta Misra ilb_rule_info_t irl_info; 137dbed73cbSSangeeta Misra #define irl_flags irl_info.rl_flags 138dbed73cbSSangeeta Misra #define irl_name irl_info.rl_name 139dbed73cbSSangeeta Misra #define irl_vip irl_info.rl_vip 140dbed73cbSSangeeta Misra #define irl_proto irl_info.rl_proto 141dbed73cbSSangeeta Misra #define irl_ipversion irl_info.rl_ipversion 142dbed73cbSSangeeta Misra #define irl_minport irl_info.rl_minport 143dbed73cbSSangeeta Misra #define irl_maxport irl_info.rl_maxport 144dbed73cbSSangeeta Misra #define irl_algo irl_info.rl_algo 145dbed73cbSSangeeta Misra #define irl_topo irl_info.rl_topo 146dbed73cbSSangeeta Misra #define irl_nat_src_start irl_info.rl_nat_src_start 147dbed73cbSSangeeta Misra #define irl_nat_src_end irl_info.rl_nat_src_end 148dbed73cbSSangeeta Misra #define irl_stickymask irl_info.rl_stickymask 149dbed73cbSSangeeta Misra #define irl_conndrain irl_info.rl_conndrain 150dbed73cbSSangeeta Misra #define irl_nat_timeout irl_info.rl_nat_timeout 151dbed73cbSSangeeta Misra #define irl_sticky_timeout irl_info.rl_sticky_timeout 152dbed73cbSSangeeta Misra #define irl_hcport irl_info.rl_hcport 153dbed73cbSSangeeta Misra #define irl_hcpflag irl_info.rl_hcpflag 154dbed73cbSSangeeta Misra #define irl_sgname irl_info.rl_sgname 155dbed73cbSSangeeta Misra #define irl_hcname irl_info.rl_hcname 156dbed73cbSSangeeta Misra } ilbd_rule_t; 157dbed73cbSSangeeta Misra 158dbed73cbSSangeeta Misra /* 159dbed73cbSSangeeta Misra * Health check related definitions 160dbed73cbSSangeeta Misra */ 161dbed73cbSSangeeta Misra 162dbed73cbSSangeeta Misra /* Default health check probe program provided */ 163dbed73cbSSangeeta Misra #define ILB_PROBE_PROTO "/usr/lib/inet/ilb/ilb_probe" 164dbed73cbSSangeeta Misra 165dbed73cbSSangeeta Misra /* Command name (argv[0]) passed to ilb_probe to indicate a ping test */ 166dbed73cbSSangeeta Misra #define ILB_PROBE_PING "ilb_ping" 167dbed73cbSSangeeta Misra 168dbed73cbSSangeeta Misra /* Use the first character of the rule's hcname to decide if rule has HC. */ 169dbed73cbSSangeeta Misra #define RULE_HAS_HC(irl) ((irl)->irl_info.rl_hcname[0] != '\0') 170dbed73cbSSangeeta Misra 171dbed73cbSSangeeta Misra /* Type of probe test */ 172dbed73cbSSangeeta Misra typedef enum { 173dbed73cbSSangeeta Misra ILBD_HC_PING = 1, /* ICMP Echo probe */ 174dbed73cbSSangeeta Misra ILBD_HC_TCP, /* TCP connect probe */ 175dbed73cbSSangeeta Misra ILBD_HC_UDP, /* UDP packet probe */ 176dbed73cbSSangeeta Misra ILBD_HC_USER /* User supplied probe */ 177dbed73cbSSangeeta Misra } ilbd_hc_test_t; 178dbed73cbSSangeeta Misra 179dbed73cbSSangeeta Misra /* Struct representing a hc object in ilbd */ 180dbed73cbSSangeeta Misra typedef struct { 181dbed73cbSSangeeta Misra list_node_t ihc_link; /* List linkage */ 182dbed73cbSSangeeta Misra 183dbed73cbSSangeeta Misra ilb_hc_info_t ihc_info; 184dbed73cbSSangeeta Misra /* Short hand for the fields inside ilb_hc_info_t */ 185dbed73cbSSangeeta Misra #define ihc_name ihc_info.hci_name 186dbed73cbSSangeeta Misra #define ihc_test ihc_info.hci_test 187dbed73cbSSangeeta Misra #define ihc_timeout ihc_info.hci_timeout 188dbed73cbSSangeeta Misra #define ihc_count ihc_info.hci_count 189dbed73cbSSangeeta Misra #define ihc_interval ihc_info.hci_interval 190dbed73cbSSangeeta Misra #define ihc_def_ping ihc_info.hci_def_ping 191dbed73cbSSangeeta Misra 192dbed73cbSSangeeta Misra ilbd_hc_test_t ihc_test_type; /* Type of probe test */ 193dbed73cbSSangeeta Misra int ihc_rule_cnt; /* Num of rules associated with hc */ 194dbed73cbSSangeeta Misra list_t ihc_rules; /* Rules associated with this hc */ 195dbed73cbSSangeeta Misra } ilbd_hc_t; 196dbed73cbSSangeeta Misra 197dbed73cbSSangeeta Misra struct ilbd_hc_srv_s; 198dbed73cbSSangeeta Misra 199dbed73cbSSangeeta Misra /* 200dbed73cbSSangeeta Misra * Struct representing a hc rule object 201dbed73cbSSangeeta Misra * 202dbed73cbSSangeeta Misra * hcr_link: list linkage 203dbed73cbSSangeeta Misra * hcr_rule: pointer to the ilbd rule object 204dbed73cbSSangeeta Misra * hcr_servers: list of servers of this rule 205dbed73cbSSangeeta Misra */ 206dbed73cbSSangeeta Misra typedef struct { 207dbed73cbSSangeeta Misra list_node_t hcr_link; 208dbed73cbSSangeeta Misra ilbd_rule_t const *hcr_rule; 209dbed73cbSSangeeta Misra list_t hcr_servers; 210dbed73cbSSangeeta Misra } ilbd_hc_rule_t; 211dbed73cbSSangeeta Misra 212dbed73cbSSangeeta Misra struct ilbd_hc_srv_s; 213dbed73cbSSangeeta Misra 214dbed73cbSSangeeta Misra /* 215dbed73cbSSangeeta Misra * Struct representing a event of the probe process 216dbed73cbSSangeeta Misra * 217dbed73cbSSangeeta Misra * ihp_ev: the event type, which is ILBD_EVENT_PROBE 218dbed73cbSSangeeta Misra * ihp_srv: pointer to the hc server object 219dbed73cbSSangeeta Misra * ihp_pid: pid of the probe process 220dbed73cbSSangeeta Misra * ihp_done: is ilbd done reading the output of the probe process 221dbed73cbSSangeeta Misra */ 222dbed73cbSSangeeta Misra typedef struct { 223dbed73cbSSangeeta Misra ilbd_event_t ihp_ev; 224dbed73cbSSangeeta Misra struct ilbd_hc_srv_s *ihp_srv; 225dbed73cbSSangeeta Misra pid_t ihp_pid; 226dbed73cbSSangeeta Misra boolean_t ihp_done; 227dbed73cbSSangeeta Misra } ilbd_hc_probe_event_t; 228dbed73cbSSangeeta Misra 229dbed73cbSSangeeta Misra /* 230dbed73cbSSangeeta Misra * ilbd_hc_srv_t state 231dbed73cbSSangeeta Misra * 232dbed73cbSSangeeta Misra * ihd_hc_def_pinging: the default ping should be run 233dbed73cbSSangeeta Misra * ihd-hc_probing: the probe process should be started 234dbed73cbSSangeeta Misra */ 235dbed73cbSSangeeta Misra enum ilbd_hc_state { 236dbed73cbSSangeeta Misra ilbd_hc_def_pinging, 237dbed73cbSSangeeta Misra ilbd_hc_probing 238dbed73cbSSangeeta Misra }; 239dbed73cbSSangeeta Misra 240dbed73cbSSangeeta Misra /* 241dbed73cbSSangeeta Misra * Struct representing a server associated with a hc object 242dbed73cbSSangeeta Misra * 243dbed73cbSSangeeta Misra * shc_srv_link: list linkage 244dbed73cbSSangeeta Misra * shc_hc: pointer to the hc object 245dbed73cbSSangeeta Misra * shc_hc_rule: pointer to the hc rule object 246dbed73cbSSangeeta Misra * shc_sg_srv: pointer to the server group object 247dbed73cbSSangeeta Misra * shc_tid: timeout ID 248dbed73cbSSangeeta Misra * shc_cur_cnt: number of times the hc probe has been run 249dbed73cbSSangeeta Misra * shc_fail_cnt: number of consecutive probe failure 250dbed73cbSSangeeta Misra * shc_status: health status 251dbed73cbSSangeeta Misra * shc_rtt: rtt (in micro sec) to the backend server 252dbed73cbSSangeeta Misra * shc_lasttimer: last time a probe sequence is executed 253dbed73cbSSangeeta Misra * shc_nexttime: next time a probe sequence is executed 254dbed73cbSSangeeta Misra * shc_state: hc probe state 255dbed73cbSSangeeta Misra * shc_child_pid: pid of the probe process 256dbed73cbSSangeeta Misra * shc_child_fd: fd to the output of the probe process 257dbed73cbSSangeeta Misra * shc_ev: event object of the probe process 258dbed73cbSSangeeta Misra * shc_ev_port: event port of the event object 259dbed73cbSSangeeta Misra */ 260dbed73cbSSangeeta Misra typedef struct ilbd_hc_srv_s { 261dbed73cbSSangeeta Misra list_node_t shc_srv_link; 262dbed73cbSSangeeta Misra ilbd_hc_t *shc_hc; 263dbed73cbSSangeeta Misra ilbd_hc_rule_t *shc_hc_rule; 264dbed73cbSSangeeta Misra ilb_sg_srv_t const *shc_sg_srv; 265dbed73cbSSangeeta Misra 266dbed73cbSSangeeta Misra iu_timer_id_t shc_tid; 267dbed73cbSSangeeta Misra uint_t shc_cur_cnt; 268dbed73cbSSangeeta Misra uint_t shc_fail_cnt; 269dbed73cbSSangeeta Misra ilb_hc_srv_status_t shc_status; 270dbed73cbSSangeeta Misra uint32_t shc_rtt; 271dbed73cbSSangeeta Misra time_t shc_lasttime; 272dbed73cbSSangeeta Misra time_t shc_nexttime; 273dbed73cbSSangeeta Misra 274dbed73cbSSangeeta Misra enum ilbd_hc_state shc_state; 275dbed73cbSSangeeta Misra pid_t shc_child_pid; 276dbed73cbSSangeeta Misra int shc_child_fd; 277dbed73cbSSangeeta Misra ilbd_hc_probe_event_t *shc_ev; 278dbed73cbSSangeeta Misra int shc_ev_port; 279dbed73cbSSangeeta Misra } ilbd_hc_srv_t; 280dbed73cbSSangeeta Misra 281dbed73cbSSangeeta Misra /* 282dbed73cbSSangeeta Misra * Structure for holding audit server and servergroup event 283dbed73cbSSangeeta Misra * data. Not all events use all members of the structure. 284dbed73cbSSangeeta Misra */ 285dbed73cbSSangeeta Misra typedef struct audit_sg_event_data { 286*5df82708SSangeeta Misra int32_t ed_ipaddr_type; /* ADT_IPv4 or ADT_IPv6 */ 287*5df82708SSangeeta Misra uint32_t ed_server_address[4]; /* server's IP address */ 288dbed73cbSSangeeta Misra char *ed_serverid; /* serverid. */ 289dbed73cbSSangeeta Misra uint16_t ed_minport; /* server's minport */ 290dbed73cbSSangeeta Misra uint16_t ed_maxport; /* server's maxport */ 291dbed73cbSSangeeta Misra char *ed_sgroup; /* servergroup */ 292dbed73cbSSangeeta Misra } audit_sg_event_data_t; 293dbed73cbSSangeeta Misra 294dbed73cbSSangeeta Misra /* Struct to store client info */ 295dbed73cbSSangeeta Misra typedef struct { 296dbed73cbSSangeeta Misra ilbd_event_t cli_ev; 297dbed73cbSSangeeta Misra int cli_sd; 298dbed73cbSSangeeta Misra struct passwd cli_pw; 299dbed73cbSSangeeta Misra size_t cli_pw_bufsz; 300dbed73cbSSangeeta Misra char *cli_pw_buf; 301dbed73cbSSangeeta Misra ilbd_cmd_t cli_cmd; 302dbed73cbSSangeeta Misra ilb_comm_t *cli_saved_reply; 303dbed73cbSSangeeta Misra size_t cli_saved_size; 304dbed73cbSSangeeta Misra ucred_t *cli_peer_ucredp; /* needed for auditing */ 305dbed73cbSSangeeta Misra } ilbd_client_t; 306dbed73cbSSangeeta Misra 307dbed73cbSSangeeta Misra void ilbd_reply_ok(uint32_t *, size_t *); 308dbed73cbSSangeeta Misra void ilbd_reply_err(uint32_t *, size_t *, ilb_status_t); 309dbed73cbSSangeeta Misra 310dbed73cbSSangeeta Misra ilb_status_t ilbd_check_client_config_auth(const struct passwd *); 311dbed73cbSSangeeta Misra ilb_status_t ilbd_check_client_enable_auth(const struct passwd *); 312dbed73cbSSangeeta Misra ilb_status_t ilbd_retrieve_names(ilbd_cmd_t, uint32_t *, size_t *); 313dbed73cbSSangeeta Misra void i_setup_sg_hlist(void); 314dbed73cbSSangeeta Misra void i_setup_rule_hlist(void); 315dbed73cbSSangeeta Misra void logperror(const char *); 316dbed73cbSSangeeta Misra ilb_status_t ilbd_add_server_to_group(ilb_sg_info_t *, int, 317dbed73cbSSangeeta Misra const struct passwd *, ucred_t *); 318dbed73cbSSangeeta Misra ilb_status_t ilbd_rem_server_from_group(ilb_sg_info_t *, int, 319dbed73cbSSangeeta Misra const struct passwd *, ucred_t *); 320dbed73cbSSangeeta Misra ilb_status_t ilbd_create_sg(ilb_sg_info_t *, int, 321dbed73cbSSangeeta Misra const struct passwd *, ucred_t *); 322dbed73cbSSangeeta Misra 323dbed73cbSSangeeta Misra ilb_status_t ilbd_destroy_sg(const char *, const struct passwd *, 324dbed73cbSSangeeta Misra ucred_t *); 325dbed73cbSSangeeta Misra ilb_status_t ilbd_retrieve_sg_hosts(const char *, uint32_t *, size_t *); 326dbed73cbSSangeeta Misra 327dbed73cbSSangeeta Misra ilb_status_t ilbd_enable_server(ilb_sg_info_t *, const struct passwd *, 328dbed73cbSSangeeta Misra ucred_t *); 329dbed73cbSSangeeta Misra ilb_status_t ilbd_disable_server(ilb_sg_info_t *, const struct passwd *, 330dbed73cbSSangeeta Misra ucred_t *); 331dbed73cbSSangeeta Misra ilb_status_t ilbd_k_Xable_server(const struct in6_addr *, const char *, 332dbed73cbSSangeeta Misra ilbd_srv_status_ind_t); 333dbed73cbSSangeeta Misra 334dbed73cbSSangeeta Misra ilb_status_t i_add_srv2krules(list_t *, ilb_sg_srv_t *, int); 335dbed73cbSSangeeta Misra ilb_status_t i_rem_srv_frm_krules(list_t *, ilb_sg_srv_t *, int); 336dbed73cbSSangeeta Misra int ilbd_get_num_krules(void); 337dbed73cbSSangeeta Misra ilb_status_t ilbd_get_krule_names(ilbd_namelist_t **, int); 338dbed73cbSSangeeta Misra ilb_status_t ilb_get_krule_servers(ilb_sg_info_t *); 339dbed73cbSSangeeta Misra ilbd_sg_t *i_find_sg_byname(const char *); 340dbed73cbSSangeeta Misra ilb_status_t i_check_srv2rules(list_t *, ilb_sg_srv_t *); 341dbed73cbSSangeeta Misra 342dbed73cbSSangeeta Misra ilb_status_t ilbd_address_to_srvID(ilb_sg_info_t *, uint32_t *, size_t *); 343dbed73cbSSangeeta Misra ilb_status_t ilbd_srvID_to_address(ilb_sg_info_t *, uint32_t *, size_t *); 344dbed73cbSSangeeta Misra 345dbed73cbSSangeeta Misra ilb_status_t do_ioctl(void *, ssize_t); 346dbed73cbSSangeeta Misra 347dbed73cbSSangeeta Misra ilb_status_t ilbd_create_rule(ilb_rule_info_t *, int, const struct passwd *, 348dbed73cbSSangeeta Misra ucred_t *); 349dbed73cbSSangeeta Misra ilb_status_t ilbd_retrieve_rule(ilbd_name_t, uint32_t *, size_t *); 350dbed73cbSSangeeta Misra 351dbed73cbSSangeeta Misra ilb_status_t ilbd_destroy_rule(ilbd_name_t, const struct passwd *, 352dbed73cbSSangeeta Misra ucred_t *); 353dbed73cbSSangeeta Misra ilb_status_t ilbd_enable_rule(ilbd_name_t, const struct passwd *, ucred_t *); 354dbed73cbSSangeeta Misra ilb_status_t ilbd_disable_rule(ilbd_name_t, const struct passwd *, 355dbed73cbSSangeeta Misra ucred_t *); 356dbed73cbSSangeeta Misra 357dbed73cbSSangeeta Misra boolean_t is_debugging_on(void); 358dbed73cbSSangeeta Misra ilb_status_t ilbd_sg_check_rule_port(ilbd_sg_t *, ilb_rule_info_t *); 359dbed73cbSSangeeta Misra 360dbed73cbSSangeeta Misra void ilbd_enable_debug(void); 361dbed73cbSSangeeta Misra ilb_status_t ilb_map_errno2ilbstat(int); 362dbed73cbSSangeeta Misra 363dbed73cbSSangeeta Misra ilb_status_t i_attach_rule2sg(ilbd_sg_t *, ilbd_rule_t *); 364dbed73cbSSangeeta Misra 365dbed73cbSSangeeta Misra /* Logging routine and macros */ 366dbed73cbSSangeeta Misra void ilbd_log(int, const char *, ...); 367dbed73cbSSangeeta Misra #define logerr(...) ilbd_log(LOG_ERR, __VA_ARGS__) 368dbed73cbSSangeeta Misra #define logdebug(...) ilbd_log(LOG_DEBUG, __VA_ARGS__) 369dbed73cbSSangeeta Misra 370dbed73cbSSangeeta Misra /* Health check manipulation routines */ 371dbed73cbSSangeeta Misra void i_ilbd_setup_hc_list(void); 372dbed73cbSSangeeta Misra ilb_status_t ilbd_create_hc(const ilb_hc_info_t *, int, 373dbed73cbSSangeeta Misra const struct passwd *, ucred_t *); 374dbed73cbSSangeeta Misra ilb_status_t ilbd_destroy_hc(const char *, const struct passwd *, ucred_t *); 375dbed73cbSSangeeta Misra ilbd_hc_t *ilbd_get_hc(const char *); 376dbed73cbSSangeeta Misra ilb_status_t ilbd_get_hc_info(const char *, uint32_t *, size_t *); 377dbed73cbSSangeeta Misra ilb_status_t ilbd_get_hc_srvs(const char *, uint32_t *, size_t *); 378dbed73cbSSangeeta Misra ilb_status_t ilbd_hc_associate_rule(const ilbd_rule_t *, int); 379dbed73cbSSangeeta Misra ilb_status_t ilbd_hc_dissociate_rule(const ilbd_rule_t *); 380dbed73cbSSangeeta Misra ilb_status_t ilbd_hc_add_server(const ilbd_rule_t *, const ilb_sg_srv_t *, 381dbed73cbSSangeeta Misra int); 382dbed73cbSSangeeta Misra ilb_status_t ilbd_hc_del_server(const ilbd_rule_t *, const ilb_sg_srv_t *); 383dbed73cbSSangeeta Misra ilb_status_t ilbd_hc_enable_rule(const ilbd_rule_t *); 384dbed73cbSSangeeta Misra ilb_status_t ilbd_hc_disable_rule(const ilbd_rule_t *); 385dbed73cbSSangeeta Misra ilb_status_t ilbd_hc_enable_server(const ilbd_rule_t *, 386dbed73cbSSangeeta Misra const ilb_sg_srv_t *); 387dbed73cbSSangeeta Misra ilb_status_t ilbd_hc_disable_server(const ilbd_rule_t *, 388dbed73cbSSangeeta Misra const ilb_sg_srv_t *); 389dbed73cbSSangeeta Misra 390dbed73cbSSangeeta Misra /* Health check timer routines */ 391dbed73cbSSangeeta Misra void ilbd_hc_probe_return(int, int, int, ilbd_hc_probe_event_t *); 392dbed73cbSSangeeta Misra void ilbd_hc_timer_init(int, ilbd_timer_event_obj_t *); 393dbed73cbSSangeeta Misra void ilbd_hc_timeout(void); 394dbed73cbSSangeeta Misra void ilbd_hc_timer_update(ilbd_timer_event_obj_t *); 395dbed73cbSSangeeta Misra 396dbed73cbSSangeeta Misra /* Show NAT info routines */ 397dbed73cbSSangeeta Misra ilb_status_t ilbd_show_nat(void *, const ilb_comm_t *, uint32_t *, 398dbed73cbSSangeeta Misra size_t *); 399dbed73cbSSangeeta Misra void ilbd_show_nat_cleanup(void); 400dbed73cbSSangeeta Misra 401dbed73cbSSangeeta Misra 402dbed73cbSSangeeta Misra /* Show sticky info routines */ 403dbed73cbSSangeeta Misra ilb_status_t ilbd_show_sticky(void *, const ilb_comm_t *, uint32_t *, 404dbed73cbSSangeeta Misra size_t *); 405dbed73cbSSangeeta Misra void ilbd_show_sticky_cleanup(void); 406dbed73cbSSangeeta Misra 407dbed73cbSSangeeta Misra ilb_status_t ilbd_create_pg(ilbd_scf_pg_type_t, void *); 408dbed73cbSSangeeta Misra ilb_status_t ilbd_destroy_pg(ilbd_scf_pg_type_t, const char *); 409dbed73cbSSangeeta Misra ilb_status_t ilbd_change_prop(ilbd_scf_pg_type_t, const char *, 410dbed73cbSSangeeta Misra const char *, void *); 411dbed73cbSSangeeta Misra void ilbd_scf_str_to_ip(int, char *, struct in6_addr *); 412dbed73cbSSangeeta Misra ilb_status_t ilbd_scf_ip_to_str(uint16_t, struct in6_addr *, scf_type_t *, 413dbed73cbSSangeeta Misra char *); 414dbed73cbSSangeeta Misra ilb_status_t ilbd_scf_add_srv(ilbd_sg_t *, ilbd_srv_t *); 415dbed73cbSSangeeta Misra ilb_status_t ilbd_scf_del_srv(ilbd_sg_t *, ilbd_srv_t *); 416dbed73cbSSangeeta Misra int ilbd_scf_limit(int); 417dbed73cbSSangeeta Misra 418dbed73cbSSangeeta Misra ilb_status_t ilbd_walk_rule_pgs(ilb_status_t (*)(ilb_rule_info_t *, int, 419dbed73cbSSangeeta Misra const struct passwd *, ucred_t *), void *, void *); 420dbed73cbSSangeeta Misra ilb_status_t ilbd_walk_sg_pgs(ilb_status_t (*)(ilb_sg_info_t *, int, 421dbed73cbSSangeeta Misra const struct passwd *, ucred_t *), void *, void *); 422dbed73cbSSangeeta Misra ilb_status_t ilbd_walk_hc_pgs(ilb_status_t (*)(const ilb_hc_info_t *, int, 423dbed73cbSSangeeta Misra const struct passwd *, ucred_t *), void *, void *); 424dbed73cbSSangeeta Misra void ilbd_algo_to_str(ilb_algo_t, char *); 425dbed73cbSSangeeta Misra void ilbd_topo_to_str(ilb_topo_t, char *); 426dbed73cbSSangeeta Misra void ilbd_ip_to_str(uint16_t, struct in6_addr *, char *); 427*5df82708SSangeeta Misra void cvt_addr(uint32_t *, int32_t, struct in6_addr); 428dbed73cbSSangeeta Misra int ilberror2auditerror(ilb_status_t); 429dbed73cbSSangeeta Misra 430dbed73cbSSangeeta Misra #ifdef __cplusplus 431dbed73cbSSangeeta Misra } 432dbed73cbSSangeeta Misra #endif 433dbed73cbSSangeeta Misra 434dbed73cbSSangeeta Misra #endif /* _ILBD_H */ 435