view usr/src/uts/common/inet/ilb.h @ 10946:324bab2b3370

PSARC 2008/575 ILB: Integrated L3/L4 Load balancer 6882718 in-kernel simple L3/L4 load balancing service should be provided in Solaris 6884202 ipobs_hook() in ip_input() invalidates DB_REF assumption
author Sangeeta Misra <Sangeeta.Misra@Sun.COM>
date Tue, 03 Nov 2009 23:15:19 -0800
parents
children
line wrap: on
line source

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */
#ifndef _INET_ILB_H
#define	_INET_ILB_H

#ifdef __cplusplus
extern "C" {
#endif

/*
 * This file contains the private interface to IP to configure ILB in
 * the system.  Note that this is not a supported interface, and is
 * subject to be changed without notice.  User level apps should instead
 * use the libilb library to interface with ILB.
 */

/* ioctl cmds to IP to configure ILB */
typedef enum {
	ILB_CREATE_RULE,
	ILB_DESTROY_RULE,
	ILB_ENABLE_RULE,
	ILB_DISABLE_RULE,
	ILB_NUM_RULES,
	ILB_NUM_SERVERS,
	ILB_RULE_NAMES,
	ILB_LIST_RULE,
	ILB_LIST_SERVERS,
	ILB_ADD_SERVERS,
	ILB_DEL_SERVERS,
	ILB_ENABLE_SERVERS,
	ILB_DISABLE_SERVERS,
	ILB_LIST_NAT_TABLE,
	ILB_LIST_STICKY_TABLE
} ilb_cmd_t;

/* Supported load balancing algorithm type */
typedef enum {
	ILB_ALG_IMPL_ROUNDROBIN = 1,
	ILB_ALG_IMPL_HASH_IP,
	ILB_ALG_IMPL_HASH_IP_SPORT,
	ILB_ALG_IMPL_HASH_IP_VIP
} ilb_algo_impl_t;

/* Supported load balancing method */
typedef enum {
	ILB_TOPO_IMPL_DSR = 1,
	ILB_TOPO_IMPL_NAT,
	ILB_TOPO_IMPL_HALF_NAT
} ilb_topo_impl_t;

/* Max ILB rule name length */
#define	ILB_RULE_NAMESZ	20

/* Max kstat server name length */
#define	ILB_SERVER_NAMESZ 20

/* Rule destroy/enable/disable command struct */
typedef struct {
	ilb_cmd_t	cmd;
	char		name[ILB_RULE_NAMESZ];
	uint32_t	flags;
} ilb_name_cmd_t;

/* Flags for rule creation command */
/* these are echoed in lib/libilb/common/libilb.h - please keep in sync */
#define	ILB_RULE_ENABLED	0x1
#define	ILB_RULE_STICKY		0x2
#define	ILB_RULE_ALLRULES	0x4
#define	ILB_RULE_BUSY		0x8

/* Rule creation/retrieval command struct */
typedef struct {
	ilb_cmd_t	cmd;
	char		name[ILB_RULE_NAMESZ];
	uint32_t	ip_ver;
	in6_addr_t	vip;
	char		vip_itf[LIFNAMSIZ];
	uint32_t	proto;
	in_port_t	min_port;	/* In network byte order */
	in_port_t	max_port;
	ilb_algo_impl_t	algo;
	ilb_topo_impl_t	topo;
	char		servers_itf[LIFNAMSIZ];
	in6_addr_t	nat_src_start;
	in6_addr_t	nat_src_end;
	uint32_t	flags;
	in6_addr_t	sticky_mask;
	uint32_t	conn_drain_timeout;	/* Time value is in seconds */
	uint32_t	nat_expiry;
	uint32_t	sticky_expiry;
} ilb_rule_cmd_t;

/* Get number of servers command struct */
typedef struct {
	ilb_cmd_t	cmd;
	char		name[ILB_RULE_NAMESZ];
	uint32_t	num;
} ilb_num_servers_cmd_t;

/* Get number of rules command struct */
typedef struct {
	ilb_cmd_t	cmd;
	uint32_t	num;
} ilb_num_rules_cmd_t;

/* Get all rule names command struct */
typedef struct {
	ilb_cmd_t	cmd;
	uint32_t	num_names;
	/* buf size is (num_names * ILB_RULE_NAMESZ) */
	char		buf[ILB_RULE_NAMESZ];
} ilb_rule_names_cmd_t;

/* Flags for ilb_server_info_t */
#define	ILB_SERVER_ENABLED	0x1

/* Struct to represent a backend server for add/list command */
typedef struct {
	char		name[ILB_SERVER_NAMESZ];
	in6_addr_t	addr;
	in_port_t	min_port;	/* In network byte order */
	in_port_t	max_port;
	uint32_t	flags;
	int		err;	/* In return, non zero value indicates error */
} ilb_server_info_t;

/* Add/list servers command struct */
typedef struct {
	ilb_cmd_t		cmd;
	char			name[ILB_RULE_NAMESZ];
	uint32_t		num_servers;
	ilb_server_info_t	servers[1];
} ilb_servers_info_cmd_t;

/*
 * Struct to represent a backend server for delete/enable/disable
 * command
 */
typedef struct {
	in6_addr_t	addr;
	int		err;	/* In return, non zero value indicates error */
} ilb_server_arg_t;

/* Delete/enable/disable a server command struct */
typedef struct {
	ilb_cmd_t		cmd;
	char			name[ILB_RULE_NAMESZ];
	uint32_t		num_servers;
	ilb_server_arg_t	servers[1];
} ilb_servers_cmd_t;

/*
 * Flags for listing NAT/persistence table entries
 *
 * ILB_LIST_BEGIN: start from the beginning of the table
 * ILB_LIST_CONT: start from the last reply
 * ILB_LIST_END: on return, this flag indicates the end of the table
 */
#define	ILB_LIST_BEGIN	0x1
#define	ILB_LIST_CONT	0x2
#define	ILB_LIST_END	0x4

#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif

typedef struct {
	uint32_t	proto;

	in6_addr_t	in_local;
	in6_addr_t	in_global;
	in6_addr_t	out_local;
	in6_addr_t	out_global;

	in_port_t	in_local_port;
	in_port_t	in_global_port;
	in_port_t	out_local_port;
	in_port_t	out_global_port;

	int64_t		create_time;
	int64_t		last_access_time;
	uint64_t	pkt_cnt;
} ilb_nat_entry_t;

/* List NAT table entries command struct */
typedef struct {
	ilb_cmd_t	cmd;
	uint32_t	flags;
	uint32_t	num_nat;
	ilb_nat_entry_t	entries[1];
} ilb_list_nat_cmd_t;

typedef struct {
	char		rule_name[ILB_RULE_NAMESZ];
	in6_addr_t	req_addr;
	in6_addr_t	srv_addr;
	int64_t		expiry_time;
} ilb_sticky_entry_t;

/* List sticky table entries command struct */
typedef struct {
	ilb_cmd_t		cmd;
	uint32_t		flags;
	uint32_t		num_sticky;
	ilb_sticky_entry_t	entries[1];
} ilb_list_sticky_cmd_t;

#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif

#ifdef __cplusplus
}
#endif

#endif /* _INET_ILB_H */