1*10946SSangeeta.Misra@Sun.COM /* 2*10946SSangeeta.Misra@Sun.COM * CDDL HEADER START 3*10946SSangeeta.Misra@Sun.COM * 4*10946SSangeeta.Misra@Sun.COM * The contents of this file are subject to the terms of the 5*10946SSangeeta.Misra@Sun.COM * Common Development and Distribution License (the "License"). 6*10946SSangeeta.Misra@Sun.COM * You may not use this file except in compliance with the License. 7*10946SSangeeta.Misra@Sun.COM * 8*10946SSangeeta.Misra@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*10946SSangeeta.Misra@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*10946SSangeeta.Misra@Sun.COM * See the License for the specific language governing permissions 11*10946SSangeeta.Misra@Sun.COM * and limitations under the License. 12*10946SSangeeta.Misra@Sun.COM * 13*10946SSangeeta.Misra@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*10946SSangeeta.Misra@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*10946SSangeeta.Misra@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*10946SSangeeta.Misra@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*10946SSangeeta.Misra@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*10946SSangeeta.Misra@Sun.COM * 19*10946SSangeeta.Misra@Sun.COM * CDDL HEADER END 20*10946SSangeeta.Misra@Sun.COM */ 21*10946SSangeeta.Misra@Sun.COM 22*10946SSangeeta.Misra@Sun.COM /* 23*10946SSangeeta.Misra@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*10946SSangeeta.Misra@Sun.COM * Use is subject to license terms. 25*10946SSangeeta.Misra@Sun.COM */ 26*10946SSangeeta.Misra@Sun.COM 27*10946SSangeeta.Misra@Sun.COM #ifndef _LIBILB_H 28*10946SSangeeta.Misra@Sun.COM #define _LIBILB_H 29*10946SSangeeta.Misra@Sun.COM 30*10946SSangeeta.Misra@Sun.COM #ifdef __cplusplus 31*10946SSangeeta.Misra@Sun.COM extern "C" { 32*10946SSangeeta.Misra@Sun.COM #endif 33*10946SSangeeta.Misra@Sun.COM 34*10946SSangeeta.Misra@Sun.COM #include <sys/types.h> 35*10946SSangeeta.Misra@Sun.COM #include <netinet/in.h> 36*10946SSangeeta.Misra@Sun.COM #include <net/if.h> 37*10946SSangeeta.Misra@Sun.COM 38*10946SSangeeta.Misra@Sun.COM /* make sure these values stay in sync with definitions in ilb.h! */ 39*10946SSangeeta.Misra@Sun.COM #define ILB_FLAGS_RULE_ENABLED 0x01 40*10946SSangeeta.Misra@Sun.COM #define ILB_FLAGS_RULE_STICKY 0x02 41*10946SSangeeta.Misra@Sun.COM #define ILB_FLAGS_RULE_ALLRULES 0x04 42*10946SSangeeta.Misra@Sun.COM #define ILB_FLAGS_RESERVED 0x08 /* in use by kernel, don't overlay */ 43*10946SSangeeta.Misra@Sun.COM 44*10946SSangeeta.Misra@Sun.COM /* 45*10946SSangeeta.Misra@Sun.COM * information whether we're interested in names or numerical information 46*10946SSangeeta.Misra@Sun.COM */ 47*10946SSangeeta.Misra@Sun.COM #define ILB_FLAGS_SRV_HOSTNAME 0x01 /* a servers hostname was given */ 48*10946SSangeeta.Misra@Sun.COM #define ILB_FLAGS_SRV_PORTNAME 0x02 /* a port was spec'd by name */ 49*10946SSangeeta.Misra@Sun.COM 50*10946SSangeeta.Misra@Sun.COM /* 51*10946SSangeeta.Misra@Sun.COM * server status information 52*10946SSangeeta.Misra@Sun.COM */ 53*10946SSangeeta.Misra@Sun.COM #define ILB_FLAGS_SRV_ENABLED 0x10 54*10946SSangeeta.Misra@Sun.COM 55*10946SSangeeta.Misra@Sun.COM /* 56*10946SSangeeta.Misra@Sun.COM * macros to determine, and for some cases, set status of server 57*10946SSangeeta.Misra@Sun.COM */ 58*10946SSangeeta.Misra@Sun.COM #define ILB_IS_SRV_ENABLED(f) \ 59*10946SSangeeta.Misra@Sun.COM ((f & ILB_FLAGS_SRV_ENABLED) == ILB_FLAGS_SRV_ENABLED) 60*10946SSangeeta.Misra@Sun.COM #define ILB_IS_SRV_DISABLED(f) ((f & ILB_FLAGS_SRV_ENABLED) == 0) 61*10946SSangeeta.Misra@Sun.COM 62*10946SSangeeta.Misra@Sun.COM #define ILB_SET_ENABLED(f) (f |= ILB_FLAGS_SRV_ENABLED) 63*10946SSangeeta.Misra@Sun.COM #define ILB_SET_DISABLED(f) (f &= ~ILB_FLAGS_SRV_ENABLED) 64*10946SSangeeta.Misra@Sun.COM 65*10946SSangeeta.Misra@Sun.COM #define MAX_IP_SPREAD 0xff /* largest ip addr. range */ 66*10946SSangeeta.Misra@Sun.COM 67*10946SSangeeta.Misra@Sun.COM #define ILB_HC_STR_UDP "udp" 68*10946SSangeeta.Misra@Sun.COM #define ILB_HC_STR_TCP "tcp" 69*10946SSangeeta.Misra@Sun.COM #define ILB_HC_STR_PING "ping" 70*10946SSangeeta.Misra@Sun.COM 71*10946SSangeeta.Misra@Sun.COM #define ILB_NAMESZ 20 /* keep in sync with kernel definition */ 72*10946SSangeeta.Misra@Sun.COM #define ILB_SGNAME_SZ (ILB_NAMESZ - 5) /* 3 numeric digits, "." and "_" */ 73*10946SSangeeta.Misra@Sun.COM 74*10946SSangeeta.Misra@Sun.COM #define ILB_SRVID_PREFIX '_' /* a valid serverID starts with this */ 75*10946SSangeeta.Misra@Sun.COM 76*10946SSangeeta.Misra@Sun.COM /* producers of these statuses are libilb and ilbd functions */ 77*10946SSangeeta.Misra@Sun.COM typedef enum { 78*10946SSangeeta.Misra@Sun.COM ILB_STATUS_OK = 0, 79*10946SSangeeta.Misra@Sun.COM ILB_STATUS_INTERNAL, /* an error internal to the library */ 80*10946SSangeeta.Misra@Sun.COM ILB_STATUS_EINVAL, /* invalid argument(s) */ 81*10946SSangeeta.Misra@Sun.COM ILB_STATUS_ENOMEM, /* not enough memory for operation */ 82*10946SSangeeta.Misra@Sun.COM ILB_STATUS_ENOENT, /* no such/no more element(s) */ 83*10946SSangeeta.Misra@Sun.COM ILB_STATUS_SOCKET, /* socket related failure */ 84*10946SSangeeta.Misra@Sun.COM ILB_STATUS_READ, /* read related failure */ 85*10946SSangeeta.Misra@Sun.COM ILB_STATUS_WRITE, /* write related failure */ 86*10946SSangeeta.Misra@Sun.COM ILB_STATUS_TIMER, /* healthcheck timer error */ 87*10946SSangeeta.Misra@Sun.COM ILB_STATUS_INUSE, /* item in use, cannot delete */ 88*10946SSangeeta.Misra@Sun.COM ILB_STATUS_EEXIST, /* scf item exist */ 89*10946SSangeeta.Misra@Sun.COM ILB_STATUS_PERMIT, /* no scf permit */ 90*10946SSangeeta.Misra@Sun.COM ILB_STATUS_CALLBACK, /* scf callback error */ 91*10946SSangeeta.Misra@Sun.COM ILB_STATUS_EWOULDBLOCK, /* operation is blocked - no error string */ 92*10946SSangeeta.Misra@Sun.COM ILB_STATUS_INPROGRESS, /* operation already in progress */ 93*10946SSangeeta.Misra@Sun.COM ILB_STATUS_SEND, /* send related failure */ 94*10946SSangeeta.Misra@Sun.COM ILB_STATUS_GENERIC, /* generic failure - no error string */ 95*10946SSangeeta.Misra@Sun.COM ILB_STATUS_ENOHCINFO, /* missing healthcheck info */ 96*10946SSangeeta.Misra@Sun.COM ILB_STATUS_INVAL_HCTESTTYPE, /* invalid health check */ 97*10946SSangeeta.Misra@Sun.COM ILB_STATUS_INVAL_CMD, /* unknown command */ 98*10946SSangeeta.Misra@Sun.COM ILB_STATUS_DUP_RULE, /* rule name exists */ 99*10946SSangeeta.Misra@Sun.COM ILB_STATUS_ENORULE, /* rule does not exist */ 100*10946SSangeeta.Misra@Sun.COM ILB_STATUS_MISMATCHSG, /* addr family mismatch with sgroup */ 101*10946SSangeeta.Misra@Sun.COM ILB_STATUS_MISMATCHH, /* addr family mismatch with hosts/rule */ 102*10946SSangeeta.Misra@Sun.COM ILB_STATUS_SGUNAVAIL, /* cannot find sgroup in sggroup list */ 103*10946SSangeeta.Misra@Sun.COM ILB_STATUS_SGINUSE, /* server is un use, cannot remove */ 104*10946SSangeeta.Misra@Sun.COM ILB_STATUS_SGEXISTS, /* server exists */ 105*10946SSangeeta.Misra@Sun.COM ILB_STATUS_SGFULL, /* cannot add any more servers */ 106*10946SSangeeta.Misra@Sun.COM ILB_STATUS_SGEMPTY, /* sgroup is empty */ 107*10946SSangeeta.Misra@Sun.COM ILB_STATUS_NAMETOOLONG, /* a name is longer than allowed */ 108*10946SSangeeta.Misra@Sun.COM ILB_STATUS_CFGAUTH, /* config authoriz denied -no error string */ 109*10946SSangeeta.Misra@Sun.COM ILB_STATUS_CFGUPDATE, /* failed to update config! */ 110*10946SSangeeta.Misra@Sun.COM ILB_STATUS_BADSG, /* rules port range size does not match */ 111*10946SSangeeta.Misra@Sun.COM /* that of the servers */ 112*10946SSangeeta.Misra@Sun.COM ILB_STATUS_INVAL_SRVR, /* server port is incompatible with */ 113*10946SSangeeta.Misra@Sun.COM /* rule port */ 114*10946SSangeeta.Misra@Sun.COM ILB_STATUS_INVAL_ENBSRVR, /* server cannot be enabled since it's */ 115*10946SSangeeta.Misra@Sun.COM /* not being used by a rule */ 116*10946SSangeeta.Misra@Sun.COM ILB_STATUS_BADPORT, /* rules port value does not match */ 117*10946SSangeeta.Misra@Sun.COM /* server's */ 118*10946SSangeeta.Misra@Sun.COM ILB_STATUS_SRVUNAVAIL, /* cannot find specified server */ 119*10946SSangeeta.Misra@Sun.COM ILB_STATUS_RULE_NO_HC, /* rule does not have hc info */ 120*10946SSangeeta.Misra@Sun.COM ILB_STATUS_RULE_HC_MISMATCH, /* rule and hc object mismatch */ 121*10946SSangeeta.Misra@Sun.COM ILB_STATUS_HANDLE_CLOSING /* library handle is being closed */ 122*10946SSangeeta.Misra@Sun.COM } ilb_status_t; 123*10946SSangeeta.Misra@Sun.COM 124*10946SSangeeta.Misra@Sun.COM typedef struct { 125*10946SSangeeta.Misra@Sun.COM int32_t ia_af; /* AF_INET or AF_INET6 */ 126*10946SSangeeta.Misra@Sun.COM union { 127*10946SSangeeta.Misra@Sun.COM struct in_addr v4; /* network byte order */ 128*10946SSangeeta.Misra@Sun.COM struct in6_addr v6; /* network byte order */ 129*10946SSangeeta.Misra@Sun.COM } _au; 130*10946SSangeeta.Misra@Sun.COM #define ia_v4 _au.v4 131*10946SSangeeta.Misra@Sun.COM #define ia_v6 _au.v6 132*10946SSangeeta.Misra@Sun.COM } ilb_ip_addr_t; 133*10946SSangeeta.Misra@Sun.COM 134*10946SSangeeta.Misra@Sun.COM /* Supported load balancing algorithm type */ 135*10946SSangeeta.Misra@Sun.COM typedef enum { 136*10946SSangeeta.Misra@Sun.COM ILB_ALG_ROUNDROBIN = 1, 137*10946SSangeeta.Misra@Sun.COM ILB_ALG_HASH_IP, 138*10946SSangeeta.Misra@Sun.COM ILB_ALG_HASH_IP_SPORT, 139*10946SSangeeta.Misra@Sun.COM ILB_ALG_HASH_IP_VIP 140*10946SSangeeta.Misra@Sun.COM } ilb_algo_t; 141*10946SSangeeta.Misra@Sun.COM 142*10946SSangeeta.Misra@Sun.COM /* Supported load balancing method */ 143*10946SSangeeta.Misra@Sun.COM typedef enum { 144*10946SSangeeta.Misra@Sun.COM ILB_TOPO_DSR = 1, 145*10946SSangeeta.Misra@Sun.COM ILB_TOPO_NAT, 146*10946SSangeeta.Misra@Sun.COM ILB_TOPO_HALF_NAT 147*10946SSangeeta.Misra@Sun.COM } ilb_topo_t; 148*10946SSangeeta.Misra@Sun.COM 149*10946SSangeeta.Misra@Sun.COM #define ILB_INVALID_HANDLE ((void *) NULL) 150*10946SSangeeta.Misra@Sun.COM 151*10946SSangeeta.Misra@Sun.COM /* 152*10946SSangeeta.Misra@Sun.COM * note: pointer to a non-existant struct 153*10946SSangeeta.Misra@Sun.COM */ 154*10946SSangeeta.Misra@Sun.COM typedef struct ilb_handle *ilb_handle_t; 155*10946SSangeeta.Misra@Sun.COM 156*10946SSangeeta.Misra@Sun.COM /* 157*10946SSangeeta.Misra@Sun.COM * Health check related information 158*10946SSangeeta.Misra@Sun.COM */ 159*10946SSangeeta.Misra@Sun.COM 160*10946SSangeeta.Misra@Sun.COM /* HC state of a server */ 161*10946SSangeeta.Misra@Sun.COM typedef enum { 162*10946SSangeeta.Misra@Sun.COM ILB_HCS_UNINIT = -1, /* Uninitialized */ 163*10946SSangeeta.Misra@Sun.COM ILB_HCS_UNREACH = 0, /* Unreachable, ping fails */ 164*10946SSangeeta.Misra@Sun.COM ILB_HCS_ALIVE, /* Probe succeeds */ 165*10946SSangeeta.Misra@Sun.COM ILB_HCS_DEAD, /* Probe fails */ 166*10946SSangeeta.Misra@Sun.COM ILB_HCS_DISABLED /* Server is disabled */ 167*10946SSangeeta.Misra@Sun.COM } ilb_hc_srv_status_t; 168*10946SSangeeta.Misra@Sun.COM 169*10946SSangeeta.Misra@Sun.COM /* 170*10946SSangeeta.Misra@Sun.COM * Struct representing a server in a hc object 171*10946SSangeeta.Misra@Sun.COM * 172*10946SSangeeta.Misra@Sun.COM * hcs_rule_name: rule using this server 173*10946SSangeeta.Misra@Sun.COM * hcs_ID: server ID 174*10946SSangeeta.Misra@Sun.COM * hcs_hc_name: hc object this server is associated with 175*10946SSangeeta.Misra@Sun.COM * hcs_IP: IP address of the server 176*10946SSangeeta.Misra@Sun.COM * hcs_fail_cnt: number of fail hc probe 177*10946SSangeeta.Misra@Sun.COM * hcs_status: hc status of the server 178*10946SSangeeta.Misra@Sun.COM * hcs_rtt: (in microsec) smoothed average RTT to the server 179*10946SSangeeta.Misra@Sun.COM * hcs_lasttime: last time hc test was done (as returned by time(2)) 180*10946SSangeeta.Misra@Sun.COM * hcs_nexttime: next time hc test will be done (as returned by (time(2)) 181*10946SSangeeta.Misra@Sun.COM */ 182*10946SSangeeta.Misra@Sun.COM typedef struct { 183*10946SSangeeta.Misra@Sun.COM char hcs_rule_name[ILB_NAMESZ]; 184*10946SSangeeta.Misra@Sun.COM char hcs_ID[ILB_NAMESZ]; 185*10946SSangeeta.Misra@Sun.COM char hcs_hc_name[ILB_NAMESZ]; 186*10946SSangeeta.Misra@Sun.COM struct in6_addr hcs_IP; 187*10946SSangeeta.Misra@Sun.COM uint32_t hcs_fail_cnt; 188*10946SSangeeta.Misra@Sun.COM ilb_hc_srv_status_t hcs_status; 189*10946SSangeeta.Misra@Sun.COM uint32_t hcs_rtt; 190*10946SSangeeta.Misra@Sun.COM time_t hcs_lasttime; 191*10946SSangeeta.Misra@Sun.COM time_t hcs_nexttime; 192*10946SSangeeta.Misra@Sun.COM } ilb_hc_srv_t; 193*10946SSangeeta.Misra@Sun.COM 194*10946SSangeeta.Misra@Sun.COM /* Probe flags to be used in r_hcpflag in struct rule data. */ 195*10946SSangeeta.Misra@Sun.COM typedef enum { 196*10946SSangeeta.Misra@Sun.COM ILB_HCI_PROBE_ANY = 0, /* Probe any port in the server port range */ 197*10946SSangeeta.Misra@Sun.COM ILB_HCI_PROBE_FIX /* Probe a fixed port */ 198*10946SSangeeta.Misra@Sun.COM } ilb_hcp_flags_t; 199*10946SSangeeta.Misra@Sun.COM 200*10946SSangeeta.Misra@Sun.COM /* 201*10946SSangeeta.Misra@Sun.COM * Struct representing a hc object 202*10946SSangeeta.Misra@Sun.COM * 203*10946SSangeeta.Misra@Sun.COM * hci_name: name of the hc object 204*10946SSangeeta.Misra@Sun.COM * hci_test: hc test to be done, TCP, UDP, or user supplied path name 205*10946SSangeeta.Misra@Sun.COM * hci_timeout: (in sec) test time out 206*10946SSangeeta.Misra@Sun.COM * hci_interval: (in sec) test execution interval 207*10946SSangeeta.Misra@Sun.COM * hci_def_ping: true if default ping is done; false otherwise 208*10946SSangeeta.Misra@Sun.COM */ 209*10946SSangeeta.Misra@Sun.COM typedef struct { 210*10946SSangeeta.Misra@Sun.COM char hci_name[ILB_NAMESZ]; 211*10946SSangeeta.Misra@Sun.COM char hci_test[MAXPATHLEN]; 212*10946SSangeeta.Misra@Sun.COM int32_t hci_timeout; 213*10946SSangeeta.Misra@Sun.COM int32_t hci_count; 214*10946SSangeeta.Misra@Sun.COM int32_t hci_interval; 215*10946SSangeeta.Misra@Sun.COM boolean_t hci_def_ping; 216*10946SSangeeta.Misra@Sun.COM } ilb_hc_info_t; 217*10946SSangeeta.Misra@Sun.COM 218*10946SSangeeta.Misra@Sun.COM typedef struct rule_data { 219*10946SSangeeta.Misra@Sun.COM char r_name[ILB_NAMESZ]; /* name of this rule */ 220*10946SSangeeta.Misra@Sun.COM int32_t r_flags; /* opt: ILB_FLAGS_RULE_ENABLED etc. */ 221*10946SSangeeta.Misra@Sun.COM ilb_ip_addr_t r_vip; /* vip, required for rule creation */ 222*10946SSangeeta.Misra@Sun.COM uint16_t r_proto; /* protocol (tcp, udp) */ 223*10946SSangeeta.Misra@Sun.COM in_port_t r_minport; /* port this rule refers to */ 224*10946SSangeeta.Misra@Sun.COM in_port_t r_maxport; /* if != 0, defines port range */ 225*10946SSangeeta.Misra@Sun.COM ilb_algo_t r_algo; /* round-robin, hash-ip, etc. */ 226*10946SSangeeta.Misra@Sun.COM ilb_topo_t r_topo; /* dsr, NAT, etc */ 227*10946SSangeeta.Misra@Sun.COM ilb_ip_addr_t r_nat_src_start; /* required for NAT */ 228*10946SSangeeta.Misra@Sun.COM ilb_ip_addr_t r_nat_src_end; /* required for NAT */ 229*10946SSangeeta.Misra@Sun.COM ilb_ip_addr_t r_stickymask; /* netmask for persistence */ 230*10946SSangeeta.Misra@Sun.COM uint32_t r_conndrain; /* opt: time for conn. draining (s) */ 231*10946SSangeeta.Misra@Sun.COM uint32_t r_nat_timeout; /* opt: timeout for nat connections */ 232*10946SSangeeta.Misra@Sun.COM uint32_t r_sticky_timeout; /* opt: timeout for persistence */ 233*10946SSangeeta.Misra@Sun.COM ilb_hcp_flags_t r_hcpflag; /* HC port flag */ 234*10946SSangeeta.Misra@Sun.COM in_port_t r_hcport; /* opt with HC */ 235*10946SSangeeta.Misra@Sun.COM char r_sgname[ILB_SGNAME_SZ]; /* this rule's server grp. */ 236*10946SSangeeta.Misra@Sun.COM char r_hcname[ILB_NAMESZ]; /* HC name: optional */ 237*10946SSangeeta.Misra@Sun.COM } ilb_rule_data_t; 238*10946SSangeeta.Misra@Sun.COM 239*10946SSangeeta.Misra@Sun.COM /* not all fields are valid in all calls where this is used */ 240*10946SSangeeta.Misra@Sun.COM typedef struct server_data { 241*10946SSangeeta.Misra@Sun.COM ilb_ip_addr_t sd_addr; /* a server's ip address */ 242*10946SSangeeta.Misra@Sun.COM in_port_t sd_minport; /* port information */ 243*10946SSangeeta.Misra@Sun.COM in_port_t sd_maxport; /* ... if != 0, defines a port range */ 244*10946SSangeeta.Misra@Sun.COM uint32_t sd_flags; /* enabled, dis- */ 245*10946SSangeeta.Misra@Sun.COM char sd_srvID[ILB_NAMESZ]; /* "name" for server */ 246*10946SSangeeta.Misra@Sun.COM /* assigned by system, not user */ 247*10946SSangeeta.Misra@Sun.COM } ilb_server_data_t; 248*10946SSangeeta.Misra@Sun.COM 249*10946SSangeeta.Misra@Sun.COM /* 250*10946SSangeeta.Misra@Sun.COM * Struct to represent a server group. 251*10946SSangeeta.Misra@Sun.COM * 252*10946SSangeeta.Misra@Sun.COM * sgd_name: server group name 253*10946SSangeeta.Misra@Sun.COM * sgd_flags: flags 254*10946SSangeeta.Misra@Sun.COM * sgd_srvcount: number of servers in the group (not used in sever group 255*10946SSangeeta.Misra@Sun.COM * creation); filled in when used by call back function for 256*10946SSangeeta.Misra@Sun.COM * ilb_walk_servergroups(). 257*10946SSangeeta.Misra@Sun.COM */ 258*10946SSangeeta.Misra@Sun.COM typedef struct sg_data { 259*10946SSangeeta.Misra@Sun.COM char sgd_name[ILB_SGNAME_SZ]; 260*10946SSangeeta.Misra@Sun.COM int32_t sgd_flags; 261*10946SSangeeta.Misra@Sun.COM int32_t sgd_srvcount; 262*10946SSangeeta.Misra@Sun.COM } ilb_sg_data_t; 263*10946SSangeeta.Misra@Sun.COM 264*10946SSangeeta.Misra@Sun.COM /* 265*10946SSangeeta.Misra@Sun.COM * Struct to represent a NAT entry in kernel. 266*10946SSangeeta.Misra@Sun.COM * 267*10946SSangeeta.Misra@Sun.COM * nat_proto: transport protocol used in this NAT entry 268*10946SSangeeta.Misra@Sun.COM * 269*10946SSangeeta.Misra@Sun.COM * nat_out_global: IP address of client's request 270*10946SSangeeta.Misra@Sun.COM * nat_out_global_port: port number of client's request 271*10946SSangeeta.Misra@Sun.COM * nat_in_global: VIP of a rule for the NAT entry 272*10946SSangeeta.Misra@Sun.COM * nat_in_global_port: port of a rule for the NAT entry 273*10946SSangeeta.Misra@Sun.COM * 274*10946SSangeeta.Misra@Sun.COM * nat_out_local: half NAT: IP address of client's request 275*10946SSangeeta.Misra@Sun.COM * full NAT: NAT'ed IP addres of client' request 276*10946SSangeeta.Misra@Sun.COM * nat_out_local_port: half NAT: port number of client's request 277*10946SSangeeta.Misra@Sun.COM * full NAT: NAT'ed port number of client's request 278*10946SSangeeta.Misra@Sun.COM * nat_in_local: IP address of back end server handling this request 279*10946SSangeeta.Misra@Sun.COM * nat_in_local_port: port number in back end server handling thi request 280*10946SSangeeta.Misra@Sun.COM * 281*10946SSangeeta.Misra@Sun.COM * (*) IPv4 address is represented as IPv4 mapped IPv6 address. 282*10946SSangeeta.Misra@Sun.COM */ 283*10946SSangeeta.Misra@Sun.COM typedef struct { 284*10946SSangeeta.Misra@Sun.COM uint32_t nat_proto; 285*10946SSangeeta.Misra@Sun.COM 286*10946SSangeeta.Misra@Sun.COM in6_addr_t nat_in_local; 287*10946SSangeeta.Misra@Sun.COM in6_addr_t nat_in_global; 288*10946SSangeeta.Misra@Sun.COM in6_addr_t nat_out_local; 289*10946SSangeeta.Misra@Sun.COM in6_addr_t nat_out_global; 290*10946SSangeeta.Misra@Sun.COM 291*10946SSangeeta.Misra@Sun.COM in_port_t nat_in_local_port; 292*10946SSangeeta.Misra@Sun.COM in_port_t nat_in_global_port; 293*10946SSangeeta.Misra@Sun.COM in_port_t nat_out_local_port; 294*10946SSangeeta.Misra@Sun.COM in_port_t nat_out_global_port; 295*10946SSangeeta.Misra@Sun.COM } ilb_nat_info_t; 296*10946SSangeeta.Misra@Sun.COM 297*10946SSangeeta.Misra@Sun.COM /* 298*10946SSangeeta.Misra@Sun.COM * Struct to represet a persistent entry in kernel. 299*10946SSangeeta.Misra@Sun.COM * 300*10946SSangeeta.Misra@Sun.COM * rule_name: the name of rule for a persistent entry 301*10946SSangeeta.Misra@Sun.COM * req_addr: the client's IP address (*) 302*10946SSangeeta.Misra@Sun.COM * srv_addr: the server's IP address (*) handling the client's request 303*10946SSangeeta.Misra@Sun.COM * 304*10946SSangeeta.Misra@Sun.COM * (*) IPv4 address is represented as IPv4 mapped IPv6 address. 305*10946SSangeeta.Misra@Sun.COM */ 306*10946SSangeeta.Misra@Sun.COM typedef struct { 307*10946SSangeeta.Misra@Sun.COM char persist_rule_name[ILB_NAMESZ]; 308*10946SSangeeta.Misra@Sun.COM in6_addr_t persist_req_addr; 309*10946SSangeeta.Misra@Sun.COM in6_addr_t persist_srv_addr; 310*10946SSangeeta.Misra@Sun.COM } ilb_persist_info_t; 311*10946SSangeeta.Misra@Sun.COM 312*10946SSangeeta.Misra@Sun.COM /* 313*10946SSangeeta.Misra@Sun.COM * Function prototype of the call back function of those walker functions. 314*10946SSangeeta.Misra@Sun.COM * 315*10946SSangeeta.Misra@Sun.COM * Note: the storage of the data item parameter (ilb_sg_data_t/ 316*10946SSangeeta.Misra@Sun.COM * ilb_server_data_/ilb_rule_data_t/ilb_hc_info_t/ilb_hc_srv_t) will be 317*10946SSangeeta.Misra@Sun.COM * freed after calling the call back function. If the call back function 318*10946SSangeeta.Misra@Sun.COM * needs to keep a copy of the data, it must copy the data content. 319*10946SSangeeta.Misra@Sun.COM */ 320*10946SSangeeta.Misra@Sun.COM typedef ilb_status_t (* sg_walkerfunc_t)(ilb_handle_t, ilb_sg_data_t *, 321*10946SSangeeta.Misra@Sun.COM void *); 322*10946SSangeeta.Misra@Sun.COM typedef ilb_status_t (* srv_walkerfunc_t)(ilb_handle_t, ilb_server_data_t *, 323*10946SSangeeta.Misra@Sun.COM const char *, void *); 324*10946SSangeeta.Misra@Sun.COM typedef ilb_status_t (* rule_walkerfunc_t)(ilb_handle_t, ilb_rule_data_t *, 325*10946SSangeeta.Misra@Sun.COM void *); 326*10946SSangeeta.Misra@Sun.COM typedef ilb_status_t (* hc_walkerfunc_t)(ilb_handle_t, ilb_hc_info_t *, 327*10946SSangeeta.Misra@Sun.COM void *); 328*10946SSangeeta.Misra@Sun.COM typedef ilb_status_t (* hc_srvwalkerfunc_t)(ilb_handle_t, ilb_hc_srv_t *, 329*10946SSangeeta.Misra@Sun.COM void *); 330*10946SSangeeta.Misra@Sun.COM 331*10946SSangeeta.Misra@Sun.COM /* 332*10946SSangeeta.Misra@Sun.COM * ilb_open creates a session handle that every caller into 333*10946SSangeeta.Misra@Sun.COM * libilb needs to use 334*10946SSangeeta.Misra@Sun.COM */ 335*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_open(ilb_handle_t *); 336*10946SSangeeta.Misra@Sun.COM 337*10946SSangeeta.Misra@Sun.COM /* 338*10946SSangeeta.Misra@Sun.COM * relinquish the session handle 339*10946SSangeeta.Misra@Sun.COM */ 340*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_close(ilb_handle_t); 341*10946SSangeeta.Misra@Sun.COM 342*10946SSangeeta.Misra@Sun.COM /* support and general functions */ 343*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_reset_config(ilb_handle_t); 344*10946SSangeeta.Misra@Sun.COM const char *ilb_errstr(ilb_status_t); 345*10946SSangeeta.Misra@Sun.COM 346*10946SSangeeta.Misra@Sun.COM /* rule-related functions */ 347*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_create_rule(ilb_handle_t, const ilb_rule_data_t *); 348*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_destroy_rule(ilb_handle_t, const char *); 349*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_disable_rule(ilb_handle_t, const char *); 350*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_enable_rule(ilb_handle_t, const char *); 351*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_walk_rules(ilb_handle_t, rule_walkerfunc_t, const char *, 352*10946SSangeeta.Misra@Sun.COM void *); 353*10946SSangeeta.Misra@Sun.COM 354*10946SSangeeta.Misra@Sun.COM /* servergroup functionality */ 355*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_create_servergroup(ilb_handle_t, const char *); 356*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_destroy_servergroup(ilb_handle_t, const char *); 357*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_add_server_to_group(ilb_handle_t, const char *, 358*10946SSangeeta.Misra@Sun.COM ilb_server_data_t *); 359*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_rem_server_from_group(ilb_handle_t, const char *, 360*10946SSangeeta.Misra@Sun.COM ilb_server_data_t *); 361*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_walk_servergroups(ilb_handle_t, sg_walkerfunc_t, 362*10946SSangeeta.Misra@Sun.COM const char *, void *); 363*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_walk_servers(ilb_handle_t, srv_walkerfunc_t, 364*10946SSangeeta.Misra@Sun.COM const char *, void *); 365*10946SSangeeta.Misra@Sun.COM 366*10946SSangeeta.Misra@Sun.COM /* functions for individual servers */ 367*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_enable_server(ilb_handle_t, ilb_server_data_t *, void *); 368*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_disable_server(ilb_handle_t, ilb_server_data_t *, void *); 369*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_srvID_to_address(ilb_handle_t, ilb_server_data_t *, 370*10946SSangeeta.Misra@Sun.COM const char *); 371*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_address_to_srvID(ilb_handle_t, ilb_server_data_t *, 372*10946SSangeeta.Misra@Sun.COM const char *); 373*10946SSangeeta.Misra@Sun.COM 374*10946SSangeeta.Misra@Sun.COM /* health check-related functions */ 375*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_create_hc(ilb_handle_t, const ilb_hc_info_t *); 376*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_destroy_hc(ilb_handle_t, const char *); 377*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_get_hc_info(ilb_handle_t, const char *, ilb_hc_info_t *); 378*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_walk_hc(ilb_handle_t, hc_walkerfunc_t, void *); 379*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_walk_hc_srvs(ilb_handle_t, hc_srvwalkerfunc_t, 380*10946SSangeeta.Misra@Sun.COM const char *, void *); 381*10946SSangeeta.Misra@Sun.COM 382*10946SSangeeta.Misra@Sun.COM /* To show NAT table entries of ILB */ 383*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_show_nat(ilb_handle_t, ilb_nat_info_t[], size_t *, 384*10946SSangeeta.Misra@Sun.COM boolean_t *); 385*10946SSangeeta.Misra@Sun.COM 386*10946SSangeeta.Misra@Sun.COM /* To show persistent table entries of ILB */ 387*10946SSangeeta.Misra@Sun.COM ilb_status_t ilb_show_persist(ilb_handle_t, ilb_persist_info_t[], size_t *, 388*10946SSangeeta.Misra@Sun.COM boolean_t *); 389*10946SSangeeta.Misra@Sun.COM 390*10946SSangeeta.Misra@Sun.COM /* PRIVATE */ 391*10946SSangeeta.Misra@Sun.COM int ilb_cmp_ipaddr(ilb_ip_addr_t *, ilb_ip_addr_t *, int64_t *); 392*10946SSangeeta.Misra@Sun.COM int ilb_cmp_in6_addr(struct in6_addr *, struct in6_addr *, int64_t *); 393*10946SSangeeta.Misra@Sun.COM 394*10946SSangeeta.Misra@Sun.COM #ifdef __cplusplus 395*10946SSangeeta.Misra@Sun.COM } 396*10946SSangeeta.Misra@Sun.COM #endif 397*10946SSangeeta.Misra@Sun.COM 398*10946SSangeeta.Misra@Sun.COM #endif /* _LIBILB_H */ 399