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.
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.
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]
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _INET_ILB_CONN_H
28 #define _INET_ILB_CONN_H
37 * Struct of the conn hash table bucket
39 * ilb_connp: the first conn hash entry in the bucket
40 * ilb_conn_hash_lock: mutex to protect the list in the bucket
41 * ilb_conn_cnt: number of conn hash entries in this bucket
43 typedef struct ilb_conn_hash_s
{
44 struct ilb_conn_s
*ilb_connp
;
45 kmutex_t ilb_conn_hash_lock
;
46 uint32_t ilb_conn_cnt
;
47 #if defined(_LP64) || defined(_I32LPx)
48 char ilb_conn_hash_pad
[44];
50 char ilb_conn_hash_pad
[52];
55 * Extracted rule/server info for faster access without holding a reference
56 * to a rule or server.
58 typedef struct ilb_rule_info_s
{
63 /* Info about a TCP connection for tracking */
64 struct ilb_tcp_track
{
72 * Struct to store NAT info of a connection (one direction)
74 * conn_daddr: destination address to be matched to find this info
75 * conn_saddr: source address to be matched
76 * conn_dport: destination port to be matched
77 * conn_sport: source port to be matched
78 * conn_ip_sum: IP checksum adjustment for NAT
79 * conn_tp_sum: tranport checksum adjustment for NAT
80 * conn_tcp_track: TCP connection tracking info
81 * conn_atime: last access time of this conn cache
82 * conn_pkt_cnt: packets processed using this conn
83 * conn_next: next conn info (for conn info linked list)
84 * conn_prev: previous conn info (for conn info linked list)
85 * conn_hash: back pointer to the conn hash table bucket
87 struct ilb_conn_info
{
88 in6_addr_t conn_daddr
;
89 in6_addr_t conn_saddr
;
95 struct ilb_tcp_track conn_tcp_track
;
97 /* Last access time */
99 uint64_t conn_pkt_cnt
;
101 struct ilb_conn_s
*conn_next
;
102 struct ilb_conn_s
*conn_prev
;
103 ilb_conn_hash_t
*conn_hash
;
107 * Struct (an entry in the conn hash table) to store a NAT info of a
108 * connection (both directions, client to server and server to client)
110 * conn_l4: transport protocol used in this NAT connection
111 * conn_expry: expiry time of this entry
112 * conn_cr_time: creation time of this entry
113 * conn_c2s: client to back end server info
114 * conn_s2c_ back end server to client info
115 * conn_server: pointer to the back end server structure
116 * conn_rule_cache: rule information needed for this entry (copied from
117 * the ilb_rule_t struct)
118 * conn_sticky: pointer to the sticky info of this client, used to do
119 * reference counting on the sticky info.
120 * conn_gc: indicates whether this entry needs to be garbage collected
122 typedef struct ilb_conn_s
{
126 int64_t conn_cr_time
;
128 /* Client to server, hash and check info */
129 struct ilb_conn_info conn_c2s
;
130 #define conn_c2s_daddr conn_c2s.conn_daddr
131 #define conn_c2s_saddr conn_c2s.conn_saddr
132 #define conn_c2s_dport conn_c2s.conn_dport
133 #define conn_c2s_sport conn_c2s.conn_sport
134 #define conn_c2s_next conn_c2s.conn_next
135 #define conn_c2s_prev conn_c2s.conn_prev
136 #define conn_c2s_hash conn_c2s.conn_hash
137 #define conn_c2s_atime conn_c2s.conn_atime
138 #define conn_c2s_pkt_cnt conn_c2s.conn_pkt_cnt
139 #define conn_c2s_ip_sum conn_c2s.conn_ip_sum
140 #define conn_c2s_tp_sum conn_c2s.conn_tp_sum
141 #define conn_c2s_tcp_ack conn_c2s.conn_tcp_track.ack
142 #define conn_c2s_tcp_fss conn_c2s.conn_tcp_track.fss
143 #define conn_c2s_tcp_fin_sent conn_c2s.conn_tcp_track.fin_sent
144 #define conn_c2s_tcp_fin_acked conn_c2s.conn_tcp_track.fin_acked
146 /* Server to client, hash and check info */
147 struct ilb_conn_info conn_s2c
;
148 #define conn_s2c_daddr conn_s2c.conn_daddr
149 #define conn_s2c_saddr conn_s2c.conn_saddr
150 #define conn_s2c_dport conn_s2c.conn_dport
151 #define conn_s2c_sport conn_s2c.conn_sport
152 #define conn_s2c_next conn_s2c.conn_next
153 #define conn_s2c_prev conn_s2c.conn_prev
154 #define conn_s2c_hash conn_s2c.conn_hash
155 #define conn_s2c_atime conn_s2c.conn_atime
156 #define conn_s2c_pkt_cnt conn_s2c.conn_pkt_cnt
157 #define conn_s2c_ip_sum conn_s2c.conn_ip_sum
158 #define conn_s2c_tp_sum conn_s2c.conn_tp_sum
159 #define conn_s2c_tcp_ack conn_s2c.conn_tcp_track.ack
160 #define conn_s2c_tcp_fss conn_s2c.conn_tcp_track.fss
161 #define conn_s2c_tcp_fin_sent conn_s2c.conn_tcp_track.fin_sent
162 #define conn_s2c_tcp_fin_acked conn_s2c.conn_tcp_track.fin_acked
164 ilb_server_t
*conn_server
;
165 ilb_rule_info_t conn_rule_cache
;
168 * If the rule is sticky enabled, all ilb_conn_t created from this
169 * rule will have conn_sticky set to the ilb_sticky_t entry. Otherwise
170 * conn_sticky is NULL.
172 struct ilb_sticky_s
*conn_sticky
;
178 * Struct of the sticky hash table bucket
180 * sticky_head: the sticky hash list of this bucket
181 * sticky_lock: mutex to protect the list
182 * sticki_cnt: number of sticky hash entries in this bucket
184 typedef struct ilb_sticky_hash_s
{
186 kmutex_t sticky_lock
;
188 #if defined(_LP64) || defined(_I32LPx)
196 * Struct to store sticky info of a client.
198 * rule_instance: the rule instance for this entry, for look up purpose
199 * rule_name: the rule name for this entry
200 * server: the back end server for this client
201 * src: the client source address
202 * expire: the expiry time of this entry
203 * atime: the last access time of this entry
204 * nat_src_idx: the index to the NAT source array for this client
205 * refcnt: reference count
206 * list: linked list node
207 * hash: back pointer to the sticky hash buckey of this entry
209 typedef struct ilb_sticky_s
{
210 uint_t rule_instance
;
211 char rule_name
[ILB_RULE_NAMESZ
];
212 ilb_server_t
*server
;
220 ilb_sticky_hash_t
*hash
;
223 extern void ilb_conn_hash_init(ilb_stack_t
*);
224 extern void ilb_conn_hash_fini(ilb_stack_t
*);
225 extern void ilb_conn_cache_fini(void);
226 extern void ilb_sticky_hash_init(ilb_stack_t
*);
227 extern void ilb_sticky_hash_fini(ilb_stack_t
*);
228 extern void ilb_sticky_cache_fini(void);
230 extern boolean_t
ilb_check_conn(ilb_stack_t
*, int, void *, int, void *,
231 in6_addr_t
*, in6_addr_t
*, in_port_t
, in_port_t
, uint32_t, in6_addr_t
*);
232 extern boolean_t
ilb_check_icmp_conn(ilb_stack_t
*, mblk_t
*, int, void *,
233 void *, in6_addr_t
*);
234 extern int ilb_conn_add(ilb_stack_t
*, ilb_rule_t
*, ilb_server_t
*,
235 in6_addr_t
*, in_port_t
, in6_addr_t
*, in_port_t
, ilb_nat_info_t
*,
236 uint32_t *, uint32_t *, struct ilb_sticky_s
*);
238 extern ilb_server_t
*ilb_sticky_find_add(ilb_stack_t
*, ilb_rule_t
*,
239 in6_addr_t
*, ilb_server_t
*, struct ilb_sticky_s
**, uint16_t *);
240 void ilb_sticky_refrele(struct ilb_sticky_s
*);
246 #endif /* _INET_ILB_CONN_H */