Home | History | Annotate | Download | only in inet
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 #ifndef _INET_ILB_H
     27 #define	_INET_ILB_H
     28 
     29 #ifdef __cplusplus
     30 extern "C" {
     31 #endif
     32 
     33 /*
     34  * This file contains the private interface to IP to configure ILB in
     35  * the system.  Note that this is not a supported interface, and is
     36  * subject to be changed without notice.  User level apps should instead
     37  * use the libilb library to interface with ILB.
     38  */
     39 
     40 /* ioctl cmds to IP to configure ILB */
     41 typedef enum {
     42 	ILB_CREATE_RULE,
     43 	ILB_DESTROY_RULE,
     44 	ILB_ENABLE_RULE,
     45 	ILB_DISABLE_RULE,
     46 	ILB_NUM_RULES,
     47 	ILB_NUM_SERVERS,
     48 	ILB_RULE_NAMES,
     49 	ILB_LIST_RULE,
     50 	ILB_LIST_SERVERS,
     51 	ILB_ADD_SERVERS,
     52 	ILB_DEL_SERVERS,
     53 	ILB_ENABLE_SERVERS,
     54 	ILB_DISABLE_SERVERS,
     55 	ILB_LIST_NAT_TABLE,
     56 	ILB_LIST_STICKY_TABLE
     57 } ilb_cmd_t;
     58 
     59 /* Supported load balancing algorithm type */
     60 typedef enum {
     61 	ILB_ALG_IMPL_ROUNDROBIN = 1,
     62 	ILB_ALG_IMPL_HASH_IP,
     63 	ILB_ALG_IMPL_HASH_IP_SPORT,
     64 	ILB_ALG_IMPL_HASH_IP_VIP
     65 } ilb_algo_impl_t;
     66 
     67 /* Supported load balancing method */
     68 typedef enum {
     69 	ILB_TOPO_IMPL_DSR = 1,
     70 	ILB_TOPO_IMPL_NAT,
     71 	ILB_TOPO_IMPL_HALF_NAT
     72 } ilb_topo_impl_t;
     73 
     74 /* Max ILB rule name length */
     75 #define	ILB_RULE_NAMESZ	20
     76 
     77 /* Max kstat server name length */
     78 #define	ILB_SERVER_NAMESZ 20
     79 
     80 /* Rule destroy/enable/disable command struct */
     81 typedef struct {
     82 	ilb_cmd_t	cmd;
     83 	char		name[ILB_RULE_NAMESZ];
     84 	uint32_t	flags;
     85 } ilb_name_cmd_t;
     86 
     87 /* Flags for rule creation command */
     88 /* these are echoed in lib/libilb/common/libilb.h - please keep in sync */
     89 #define	ILB_RULE_ENABLED	0x1
     90 #define	ILB_RULE_STICKY		0x2
     91 #define	ILB_RULE_ALLRULES	0x4
     92 #define	ILB_RULE_BUSY		0x8
     93 
     94 /* Rule creation/retrieval command struct */
     95 typedef struct {
     96 	ilb_cmd_t	cmd;
     97 	char		name[ILB_RULE_NAMESZ];
     98 	uint32_t	ip_ver;
     99 	in6_addr_t	vip;
    100 	char		vip_itf[LIFNAMSIZ];
    101 	uint32_t	proto;
    102 	in_port_t	min_port;	/* In network byte order */
    103 	in_port_t	max_port;
    104 	ilb_algo_impl_t	algo;
    105 	ilb_topo_impl_t	topo;
    106 	char		servers_itf[LIFNAMSIZ];
    107 	in6_addr_t	nat_src_start;
    108 	in6_addr_t	nat_src_end;
    109 	uint32_t	flags;
    110 	in6_addr_t	sticky_mask;
    111 	uint32_t	conn_drain_timeout;	/* Time value is in seconds */
    112 	uint32_t	nat_expiry;
    113 	uint32_t	sticky_expiry;
    114 } ilb_rule_cmd_t;
    115 
    116 /* Get number of servers command struct */
    117 typedef struct {
    118 	ilb_cmd_t	cmd;
    119 	char		name[ILB_RULE_NAMESZ];
    120 	uint32_t	num;
    121 } ilb_num_servers_cmd_t;
    122 
    123 /* Get number of rules command struct */
    124 typedef struct {
    125 	ilb_cmd_t	cmd;
    126 	uint32_t	num;
    127 } ilb_num_rules_cmd_t;
    128 
    129 /* Get all rule names command struct */
    130 typedef struct {
    131 	ilb_cmd_t	cmd;
    132 	uint32_t	num_names;
    133 	/* buf size is (num_names * ILB_RULE_NAMESZ) */
    134 	char		buf[ILB_RULE_NAMESZ];
    135 } ilb_rule_names_cmd_t;
    136 
    137 /* Flags for ilb_server_info_t */
    138 #define	ILB_SERVER_ENABLED	0x1
    139 
    140 /* Struct to represent a backend server for add/list command */
    141 typedef struct {
    142 	char		name[ILB_SERVER_NAMESZ];
    143 	in6_addr_t	addr;
    144 	in_port_t	min_port;	/* In network byte order */
    145 	in_port_t	max_port;
    146 	uint32_t	flags;
    147 	int		err;	/* In return, non zero value indicates error */
    148 } ilb_server_info_t;
    149 
    150 /* Add/list servers command struct */
    151 typedef struct {
    152 	ilb_cmd_t		cmd;
    153 	char			name[ILB_RULE_NAMESZ];
    154 	uint32_t		num_servers;
    155 	ilb_server_info_t	servers[1];
    156 } ilb_servers_info_cmd_t;
    157 
    158 /*
    159  * Struct to represent a backend server for delete/enable/disable
    160  * command
    161  */
    162 typedef struct {
    163 	in6_addr_t	addr;
    164 	int		err;	/* In return, non zero value indicates error */
    165 } ilb_server_arg_t;
    166 
    167 /* Delete/enable/disable a server command struct */
    168 typedef struct {
    169 	ilb_cmd_t		cmd;
    170 	char			name[ILB_RULE_NAMESZ];
    171 	uint32_t		num_servers;
    172 	ilb_server_arg_t	servers[1];
    173 } ilb_servers_cmd_t;
    174 
    175 /*
    176  * Flags for listing NAT/persistence table entries
    177  *
    178  * ILB_LIST_BEGIN: start from the beginning of the table
    179  * ILB_LIST_CONT: start from the last reply
    180  * ILB_LIST_END: on return, this flag indicates the end of the table
    181  */
    182 #define	ILB_LIST_BEGIN	0x1
    183 #define	ILB_LIST_CONT	0x2
    184 #define	ILB_LIST_END	0x4
    185 
    186 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
    187 #pragma pack(4)
    188 #endif
    189 
    190 typedef struct {
    191 	uint32_t	proto;
    192 
    193 	in6_addr_t	in_local;
    194 	in6_addr_t	in_global;
    195 	in6_addr_t	out_local;
    196 	in6_addr_t	out_global;
    197 
    198 	in_port_t	in_local_port;
    199 	in_port_t	in_global_port;
    200 	in_port_t	out_local_port;
    201 	in_port_t	out_global_port;
    202 
    203 	int64_t		create_time;
    204 	int64_t		last_access_time;
    205 	uint64_t	pkt_cnt;
    206 } ilb_nat_entry_t;
    207 
    208 /* List NAT table entries command struct */
    209 typedef struct {
    210 	ilb_cmd_t	cmd;
    211 	uint32_t	flags;
    212 	uint32_t	num_nat;
    213 	ilb_nat_entry_t	entries[1];
    214 } ilb_list_nat_cmd_t;
    215 
    216 typedef struct {
    217 	char		rule_name[ILB_RULE_NAMESZ];
    218 	in6_addr_t	req_addr;
    219 	in6_addr_t	srv_addr;
    220 	int64_t		expiry_time;
    221 } ilb_sticky_entry_t;
    222 
    223 /* List sticky table entries command struct */
    224 typedef struct {
    225 	ilb_cmd_t		cmd;
    226 	uint32_t		flags;
    227 	uint32_t		num_sticky;
    228 	ilb_sticky_entry_t	entries[1];
    229 } ilb_list_sticky_cmd_t;
    230 
    231 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
    232 #pragma pack()
    233 #endif
    234 
    235 #ifdef __cplusplus
    236 }
    237 #endif
    238 
    239 #endif /* _INET_ILB_H */
    240