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_IMPL_H 28*10946SSangeeta.Misra@Sun.COM #define _LIBILB_IMPL_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 <sys/socket.h> 36*10946SSangeeta.Misra@Sun.COM #include <sys/note.h> 37*10946SSangeeta.Misra@Sun.COM #include <netinet/in.h> 38*10946SSangeeta.Misra@Sun.COM #include <netdb.h> 39*10946SSangeeta.Misra@Sun.COM #include <net/if.h> 40*10946SSangeeta.Misra@Sun.COM #include <inet/ilb.h> 41*10946SSangeeta.Misra@Sun.COM #include <libilb.h> 42*10946SSangeeta.Misra@Sun.COM #include <thread.h> 43*10946SSangeeta.Misra@Sun.COM #include <synch.h> 44*10946SSangeeta.Misra@Sun.COM 45*10946SSangeeta.Misra@Sun.COM #if !defined max 46*10946SSangeeta.Misra@Sun.COM #define max(a, b) ((a) > (b) ? (a) : (b)) 47*10946SSangeeta.Misra@Sun.COM #endif 48*10946SSangeeta.Misra@Sun.COM 49*10946SSangeeta.Misra@Sun.COM /* The UNIX domain socket path to talk to ilbd. */ 50*10946SSangeeta.Misra@Sun.COM #define SOCKET_PATH "/var/run/daemon/ilb_sock" 51*10946SSangeeta.Misra@Sun.COM 52*10946SSangeeta.Misra@Sun.COM /* The max message size for communicating with ilbd */ 53*10946SSangeeta.Misra@Sun.COM #define ILBD_MSG_SIZE 102400 54*10946SSangeeta.Misra@Sun.COM 55*10946SSangeeta.Misra@Sun.COM /* 56*10946SSangeeta.Misra@Sun.COM * moral equivalent of ntohl for IPv6 addresses, MSB and LSB (64 bit each), 57*10946SSangeeta.Misra@Sun.COM * assign to uint64_t variables 58*10946SSangeeta.Misra@Sun.COM */ 59*10946SSangeeta.Misra@Sun.COM #define INV6_N2H_MSB64(addr) \ 60*10946SSangeeta.Misra@Sun.COM (((uint64_t)ntohl((addr)->_S6_un._S6_u32[0]) << 32) + \ 61*10946SSangeeta.Misra@Sun.COM (ntohl((addr)->_S6_un._S6_u32[1]))) 62*10946SSangeeta.Misra@Sun.COM 63*10946SSangeeta.Misra@Sun.COM #define INV6_N2H_LSB64(addr) \ 64*10946SSangeeta.Misra@Sun.COM (((uint64_t)ntohl((addr)->_S6_un._S6_u32[2]) << 32) + \ 65*10946SSangeeta.Misra@Sun.COM (ntohl((addr)->_S6_un._S6_u32[3]))) 66*10946SSangeeta.Misra@Sun.COM 67*10946SSangeeta.Misra@Sun.COM /* 68*10946SSangeeta.Misra@Sun.COM * moral equiv. of htonl of MSB and LSB 64-bit portions to an IPv6 address 69*10946SSangeeta.Misra@Sun.COM */ 70*10946SSangeeta.Misra@Sun.COM #define INV6_H2N_MSB64(addr, msb) \ 71*10946SSangeeta.Misra@Sun.COM (addr)->_S6_un._S6_u32[0] = htonl((msb) >> 32); \ 72*10946SSangeeta.Misra@Sun.COM (addr)->_S6_un._S6_u32[1] = htonl((msb) & 0xffffffff) 73*10946SSangeeta.Misra@Sun.COM 74*10946SSangeeta.Misra@Sun.COM #define INV6_H2N_LSB64(addr, lsb) \ 75*10946SSangeeta.Misra@Sun.COM (addr)->_S6_un._S6_u32[2] = htonl((lsb) >> 32); \ 76*10946SSangeeta.Misra@Sun.COM (addr)->_S6_un._S6_u32[3] = htonl((lsb) & 0xffffffff) 77*10946SSangeeta.Misra@Sun.COM 78*10946SSangeeta.Misra@Sun.COM #define IP_COPY_CLI_2_IMPL(_e, _i) \ 79*10946SSangeeta.Misra@Sun.COM bzero(_i, sizeof (*(_i))); \ 80*10946SSangeeta.Misra@Sun.COM if ((_e)->ia_af == AF_INET6) \ 81*10946SSangeeta.Misra@Sun.COM (void) memcpy((_i), &(_e)->ia_v6, sizeof (*(_i))); \ 82*10946SSangeeta.Misra@Sun.COM else \ 83*10946SSangeeta.Misra@Sun.COM IN6_INADDR_TO_V4MAPPED(&(_e)->ia_v4, (_i)) 84*10946SSangeeta.Misra@Sun.COM 85*10946SSangeeta.Misra@Sun.COM #define IP_COPY_IMPL_2_CLI(_i, _e) \ 86*10946SSangeeta.Misra@Sun.COM do { \ 87*10946SSangeeta.Misra@Sun.COM bzero(_e, sizeof (*(_e))); \ 88*10946SSangeeta.Misra@Sun.COM if (IN6_IS_ADDR_V4MAPPED(_i)) { \ 89*10946SSangeeta.Misra@Sun.COM (_e)->ia_af = AF_INET; \ 90*10946SSangeeta.Misra@Sun.COM IN6_V4MAPPED_TO_INADDR((_i), &(_e)->ia_v4); \ 91*10946SSangeeta.Misra@Sun.COM } else { \ 92*10946SSangeeta.Misra@Sun.COM (_e)->ia_af = AF_INET6; \ 93*10946SSangeeta.Misra@Sun.COM (void) memcpy(&(_e)->ia_v6, (_i), \ 94*10946SSangeeta.Misra@Sun.COM sizeof ((_e)->ia_v6)); \ 95*10946SSangeeta.Misra@Sun.COM } \ 96*10946SSangeeta.Misra@Sun.COM _NOTE(CONSTCOND) \ 97*10946SSangeeta.Misra@Sun.COM } while (0) 98*10946SSangeeta.Misra@Sun.COM 99*10946SSangeeta.Misra@Sun.COM #define GET_AF(_a) IN6_IS_ADDR_V4MAPPED(_a)?AF_INET:AF_INET6 100*10946SSangeeta.Misra@Sun.COM #define IS_AF_VALID(_af) (_af == AF_INET || _af == AF_INET6) 101*10946SSangeeta.Misra@Sun.COM 102*10946SSangeeta.Misra@Sun.COM typedef enum { 103*10946SSangeeta.Misra@Sun.COM ILBD_BAD_CMD = 0, 104*10946SSangeeta.Misra@Sun.COM /* servergroup commands */ 105*10946SSangeeta.Misra@Sun.COM ILBD_CREATE_SERVERGROUP, 106*10946SSangeeta.Misra@Sun.COM ILBD_ADD_SERVER_TO_GROUP, 107*10946SSangeeta.Misra@Sun.COM ILBD_REM_SERVER_FROM_GROUP, 108*10946SSangeeta.Misra@Sun.COM ILBD_ENABLE_SERVER, 109*10946SSangeeta.Misra@Sun.COM ILBD_DISABLE_SERVER, 110*10946SSangeeta.Misra@Sun.COM ILBD_DESTROY_SERVERGROUP, 111*10946SSangeeta.Misra@Sun.COM ILBD_RETRIEVE_SG_NAMES, /* names of all SGs registered */ 112*10946SSangeeta.Misra@Sun.COM ILBD_RETRIEVE_SG_HOSTS, /* all hosts for a given SG (hndl) */ 113*10946SSangeeta.Misra@Sun.COM ILBD_SRV_ADDR2ID, /* fill in serverID for given address */ 114*10946SSangeeta.Misra@Sun.COM ILBD_SRV_ID2ADDR, /* fill in address from given serverID */ 115*10946SSangeeta.Misra@Sun.COM /* rule commands */ 116*10946SSangeeta.Misra@Sun.COM ILBD_CREATE_RULE, 117*10946SSangeeta.Misra@Sun.COM ILBD_DESTROY_RULE, 118*10946SSangeeta.Misra@Sun.COM ILBD_ENABLE_RULE, 119*10946SSangeeta.Misra@Sun.COM ILBD_DISABLE_RULE, 120*10946SSangeeta.Misra@Sun.COM ILBD_RETRIEVE_RULE_NAMES, 121*10946SSangeeta.Misra@Sun.COM ILBD_RETRIEVE_RULE, 122*10946SSangeeta.Misra@Sun.COM 123*10946SSangeeta.Misra@Sun.COM ILBD_CREATE_HC, 124*10946SSangeeta.Misra@Sun.COM ILBD_DESTROY_HC, 125*10946SSangeeta.Misra@Sun.COM ILBD_GET_HC_INFO, 126*10946SSangeeta.Misra@Sun.COM ILBD_GET_HC_SRVS, 127*10946SSangeeta.Misra@Sun.COM ILBD_GET_HC_RULES, 128*10946SSangeeta.Misra@Sun.COM ILBD_RETRIEVE_HC_NAMES, 129*10946SSangeeta.Misra@Sun.COM 130*10946SSangeeta.Misra@Sun.COM ILBD_SHOW_NAT, /* list the NAT table */ 131*10946SSangeeta.Misra@Sun.COM ILBD_SHOW_PERSIST, /* list the sticky table */ 132*10946SSangeeta.Misra@Sun.COM 133*10946SSangeeta.Misra@Sun.COM ILBD_CMD_OK, /* Requested operation succeeds. */ 134*10946SSangeeta.Misra@Sun.COM ILBD_CMD_ERROR /* Rquested operation fails. */ 135*10946SSangeeta.Misra@Sun.COM } ilbd_cmd_t; 136*10946SSangeeta.Misra@Sun.COM 137*10946SSangeeta.Misra@Sun.COM typedef struct sg_srv { 138*10946SSangeeta.Misra@Sun.COM int32_t sgs_flags; /* enabled, dis- */ 139*10946SSangeeta.Misra@Sun.COM struct in6_addr sgs_addr; 140*10946SSangeeta.Misra@Sun.COM int32_t sgs_minport; 141*10946SSangeeta.Misra@Sun.COM int32_t sgs_maxport; 142*10946SSangeeta.Misra@Sun.COM int32_t sgs_id; /* numerical part of srvID */ 143*10946SSangeeta.Misra@Sun.COM char sgs_srvID[ILB_NAMESZ]; /* "name" given to server */ 144*10946SSangeeta.Misra@Sun.COM } ilb_sg_srv_t; 145*10946SSangeeta.Misra@Sun.COM 146*10946SSangeeta.Misra@Sun.COM typedef struct sg_info { 147*10946SSangeeta.Misra@Sun.COM int32_t sg_flags; 148*10946SSangeeta.Misra@Sun.COM char sg_name[ILB_SGNAME_SZ]; 149*10946SSangeeta.Misra@Sun.COM int32_t sg_srvcount; 150*10946SSangeeta.Misra@Sun.COM ilb_sg_srv_t sg_servers[]; 151*10946SSangeeta.Misra@Sun.COM } ilb_sg_info_t; 152*10946SSangeeta.Misra@Sun.COM 153*10946SSangeeta.Misra@Sun.COM typedef char ilbd_name_t[ILB_NAMESZ]; 154*10946SSangeeta.Misra@Sun.COM 155*10946SSangeeta.Misra@Sun.COM typedef struct ilbd_namelist { 156*10946SSangeeta.Misra@Sun.COM int32_t ilbl_flags; 157*10946SSangeeta.Misra@Sun.COM int32_t ilbl_count; 158*10946SSangeeta.Misra@Sun.COM ilbd_name_t ilbl_name[]; 159*10946SSangeeta.Misra@Sun.COM } ilbd_namelist_t; 160*10946SSangeeta.Misra@Sun.COM 161*10946SSangeeta.Misra@Sun.COM #define ILBL_NAME_OFFSET (offsetof(ilbd_namelist_t, ilbl_name)) 162*10946SSangeeta.Misra@Sun.COM 163*10946SSangeeta.Misra@Sun.COM typedef struct rule_info { 164*10946SSangeeta.Misra@Sun.COM int32_t rl_flags; 165*10946SSangeeta.Misra@Sun.COM char rl_name[ILB_NAMESZ]; 166*10946SSangeeta.Misra@Sun.COM struct in6_addr rl_vip; 167*10946SSangeeta.Misra@Sun.COM uint16_t rl_proto; 168*10946SSangeeta.Misra@Sun.COM uint16_t rl_ipversion; 169*10946SSangeeta.Misra@Sun.COM int32_t rl_minport; 170*10946SSangeeta.Misra@Sun.COM int32_t rl_maxport; 171*10946SSangeeta.Misra@Sun.COM ilb_algo_t rl_algo; 172*10946SSangeeta.Misra@Sun.COM ilb_topo_t rl_topo; 173*10946SSangeeta.Misra@Sun.COM struct in6_addr rl_nat_src_start; 174*10946SSangeeta.Misra@Sun.COM struct in6_addr rl_nat_src_end; 175*10946SSangeeta.Misra@Sun.COM struct in6_addr rl_stickymask; 176*10946SSangeeta.Misra@Sun.COM uint32_t rl_conndrain; 177*10946SSangeeta.Misra@Sun.COM uint32_t rl_nat_timeout; 178*10946SSangeeta.Misra@Sun.COM uint32_t rl_sticky_timeout; 179*10946SSangeeta.Misra@Sun.COM in_port_t rl_hcport; 180*10946SSangeeta.Misra@Sun.COM ilb_hcp_flags_t rl_hcpflag; 181*10946SSangeeta.Misra@Sun.COM char rl_sgname[ILB_SGNAME_SZ]; 182*10946SSangeeta.Misra@Sun.COM char rl_hcname[ILB_NAMESZ]; 183*10946SSangeeta.Misra@Sun.COM } ilb_rule_info_t; 184*10946SSangeeta.Misra@Sun.COM 185*10946SSangeeta.Misra@Sun.COM /* 186*10946SSangeeta.Misra@Sun.COM * Struct to represent show NAT request and reply. 187*10946SSangeeta.Misra@Sun.COM * 188*10946SSangeeta.Misra@Sun.COM * sn_num: (request) indicates the number of entries wanted; 189*10946SSangeeta.Misra@Sun.COM * (reply) the number of entries returned; 190*10946SSangeeta.Misra@Sun.COM * sn_data: NAT/persist able entries (is uint32_t aligned). 191*10946SSangeeta.Misra@Sun.COM */ 192*10946SSangeeta.Misra@Sun.COM typedef struct { 193*10946SSangeeta.Misra@Sun.COM uint32_t sn_num; 194*10946SSangeeta.Misra@Sun.COM uint32_t sn_data[]; 195*10946SSangeeta.Misra@Sun.COM } ilb_show_info_t; 196*10946SSangeeta.Misra@Sun.COM 197*10946SSangeeta.Misra@Sun.COM /* 198*10946SSangeeta.Misra@Sun.COM * Struct to represent the set of servers associated with a hc object. 199*10946SSangeeta.Misra@Sun.COM * 200*10946SSangeeta.Misra@Sun.COM * rs_num_srvs: number of servers in this struct. 201*10946SSangeeta.Misra@Sun.COM * rs_srvs: array of servers. 202*10946SSangeeta.Misra@Sun.COM */ 203*10946SSangeeta.Misra@Sun.COM typedef struct { 204*10946SSangeeta.Misra@Sun.COM uint32_t rs_num_srvs; 205*10946SSangeeta.Misra@Sun.COM ilb_hc_srv_t rs_srvs[]; 206*10946SSangeeta.Misra@Sun.COM } ilb_hc_rule_srv_t; 207*10946SSangeeta.Misra@Sun.COM 208*10946SSangeeta.Misra@Sun.COM typedef struct ilb_handle_impl { 209*10946SSangeeta.Misra@Sun.COM mutex_t h_lock; 210*10946SSangeeta.Misra@Sun.COM cond_t h_cv; 211*10946SSangeeta.Misra@Sun.COM boolean_t h_busy; 212*10946SSangeeta.Misra@Sun.COM boolean_t h_valid; 213*10946SSangeeta.Misra@Sun.COM boolean_t h_closing; 214*10946SSangeeta.Misra@Sun.COM uint32_t h_waiter; 215*10946SSangeeta.Misra@Sun.COM int h_socket; 216*10946SSangeeta.Misra@Sun.COM ilb_status_t h_error; /* ... that caused invalidation */ 217*10946SSangeeta.Misra@Sun.COM } ilb_handle_impl_t; 218*10946SSangeeta.Misra@Sun.COM 219*10946SSangeeta.Misra@Sun.COM /* 220*10946SSangeeta.Misra@Sun.COM * Communication flags used in ilb_comm_t. 221*10946SSangeeta.Misra@Sun.COM * 222*10946SSangeeta.Misra@Sun.COM * ILB_COMM_END: end of communication 223*10946SSangeeta.Misra@Sun.COM */ 224*10946SSangeeta.Misra@Sun.COM #define ILB_COMM_END 0x1 225*10946SSangeeta.Misra@Sun.COM 226*10946SSangeeta.Misra@Sun.COM /* 227*10946SSangeeta.Misra@Sun.COM * The message structure used to communicate with ilbd. 228*10946SSangeeta.Misra@Sun.COM * 229*10946SSangeeta.Misra@Sun.COM * ic_cmd: the message type. 230*10946SSangeeta.Misra@Sun.COM * ic_flags: communication flags 231*10946SSangeeta.Misra@Sun.COM * ic_data: message data (is uint32_t aligned). 232*10946SSangeeta.Misra@Sun.COM */ 233*10946SSangeeta.Misra@Sun.COM typedef struct { 234*10946SSangeeta.Misra@Sun.COM ilbd_cmd_t ic_cmd; 235*10946SSangeeta.Misra@Sun.COM int32_t ic_flags; 236*10946SSangeeta.Misra@Sun.COM uint32_t ic_data[]; 237*10946SSangeeta.Misra@Sun.COM } ilb_comm_t; 238*10946SSangeeta.Misra@Sun.COM 239*10946SSangeeta.Misra@Sun.COM ilb_status_t i_check_ip_range(ilb_ip_addr_t *, ilb_ip_addr_t *); 240*10946SSangeeta.Misra@Sun.COM ilb_status_t i_ilb_do_comm(ilb_handle_t, ilb_comm_t *, size_t, ilb_comm_t *, 241*10946SSangeeta.Misra@Sun.COM size_t *); 242*10946SSangeeta.Misra@Sun.COM void i_ilb_close_comm(ilb_handle_t); 243*10946SSangeeta.Misra@Sun.COM struct in6_addr i_next_ip_addr(struct in6_addr *, int); 244*10946SSangeeta.Misra@Sun.COM 245*10946SSangeeta.Misra@Sun.COM ilb_status_t i_ilb_retrieve_rule_names(ilb_handle_t, ilb_comm_t **, 246*10946SSangeeta.Misra@Sun.COM size_t *); 247*10946SSangeeta.Misra@Sun.COM ilb_comm_t *i_ilb_alloc_req(ilbd_cmd_t, size_t *); 248*10946SSangeeta.Misra@Sun.COM 249*10946SSangeeta.Misra@Sun.COM #ifdef __cplusplus 250*10946SSangeeta.Misra@Sun.COM } 251*10946SSangeeta.Misra@Sun.COM #endif 252*10946SSangeeta.Misra@Sun.COM 253*10946SSangeeta.Misra@Sun.COM #endif /* _LIBILB_IMPL_H */ 254