1*721fffe3SKacheong Poon /*
2*721fffe3SKacheong Poon  * CDDL HEADER START
3*721fffe3SKacheong Poon  *
4*721fffe3SKacheong Poon  * The contents of this file are subject to the terms of the
5*721fffe3SKacheong Poon  * Common Development and Distribution License (the "License").
6*721fffe3SKacheong Poon  * You may not use this file except in compliance with the License.
7*721fffe3SKacheong Poon  *
8*721fffe3SKacheong Poon  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*721fffe3SKacheong Poon  * or http://www.opensolaris.org/os/licensing.
10*721fffe3SKacheong Poon  * See the License for the specific language governing permissions
11*721fffe3SKacheong Poon  * and limitations under the License.
12*721fffe3SKacheong Poon  *
13*721fffe3SKacheong Poon  * When distributing Covered Code, include this CDDL HEADER in each
14*721fffe3SKacheong Poon  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*721fffe3SKacheong Poon  * If applicable, add the following below this CDDL HEADER, with the
16*721fffe3SKacheong Poon  * fields enclosed by brackets "[]" replaced with your own identifying
17*721fffe3SKacheong Poon  * information: Portions Copyright [yyyy] [name of copyright owner]
18*721fffe3SKacheong Poon  *
19*721fffe3SKacheong Poon  * CDDL HEADER END
20*721fffe3SKacheong Poon  */
21*721fffe3SKacheong Poon /*
22*721fffe3SKacheong Poon  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23*721fffe3SKacheong Poon  * Use is subject to license terms.
24*721fffe3SKacheong Poon  */
25*721fffe3SKacheong Poon 
26*721fffe3SKacheong Poon #ifndef	_INET_TCP_CLUSTER_H
27*721fffe3SKacheong Poon #define	_INET_TCP_CLUSTER_H
28*721fffe3SKacheong Poon 
29*721fffe3SKacheong Poon #ifdef	__cplusplus
30*721fffe3SKacheong Poon extern "C" {
31*721fffe3SKacheong Poon #endif
32*721fffe3SKacheong Poon 
33*721fffe3SKacheong Poon #ifdef _KERNEL
34*721fffe3SKacheong Poon 
35*721fffe3SKacheong Poon /*
36*721fffe3SKacheong Poon  * Cluster hooks defined in tcp_cluster.c.
37*721fffe3SKacheong Poon  */
38*721fffe3SKacheong Poon extern void (*cl_inet_listen)(netstackid_t, uint8_t, sa_family_t, uint8_t *,
39*721fffe3SKacheong Poon     in_port_t, void *);
40*721fffe3SKacheong Poon extern void (*cl_inet_unlisten)(netstackid_t, uint8_t, sa_family_t, uint8_t *,
41*721fffe3SKacheong Poon     in_port_t, void *);
42*721fffe3SKacheong Poon extern int (*cl_inet_connect2)(netstackid_t, uint8_t, boolean_t, sa_family_t,
43*721fffe3SKacheong Poon     uint8_t *, in_port_t, uint8_t *, in_port_t, void *);
44*721fffe3SKacheong Poon extern void (*cl_inet_disconnect)(netstackid_t, uint8_t, sa_family_t,
45*721fffe3SKacheong Poon     uint8_t *, in_port_t, uint8_t *, in_port_t, void *);
46*721fffe3SKacheong Poon 
47*721fffe3SKacheong Poon 
48*721fffe3SKacheong Poon /*
49*721fffe3SKacheong Poon  * Cluster networking hook for traversing current connection list.
50*721fffe3SKacheong Poon  * This routine is used to extract the current list of live connections
51*721fffe3SKacheong Poon  * which must continue to to be dispatched to this node.
52*721fffe3SKacheong Poon  */
53*721fffe3SKacheong Poon extern int cl_tcp_walk_list(netstackid_t,
54*721fffe3SKacheong Poon     int (*callback)(cl_tcp_info_t *, void *), void *);
55*721fffe3SKacheong Poon 
56*721fffe3SKacheong Poon /*
57*721fffe3SKacheong Poon  * int CL_INET_CONNECT(conn_t *cp, tcp_t *tcp, boolean_t is_outgoing, int err)
58*721fffe3SKacheong Poon  */
59*721fffe3SKacheong Poon #define	CL_INET_CONNECT(connp, is_outgoing, err) {		\
60*721fffe3SKacheong Poon 	(err) = 0;						\
61*721fffe3SKacheong Poon 	if (cl_inet_connect2 != NULL) {				\
62*721fffe3SKacheong Poon 		/*						\
63*721fffe3SKacheong Poon 		 * Running in cluster mode - register active connection	\
64*721fffe3SKacheong Poon 		 * information						\
65*721fffe3SKacheong Poon 		 */							\
66*721fffe3SKacheong Poon 		if ((connp)->conn_ipversion == IPV4_VERSION) {		\
67*721fffe3SKacheong Poon 			if ((connp)->conn_laddr_v4 != 0) {		\
68*721fffe3SKacheong Poon 				(err) = (*cl_inet_connect2)(		\
69*721fffe3SKacheong Poon 				    (connp)->conn_netstack->netstack_stackid,\
70*721fffe3SKacheong Poon 				    IPPROTO_TCP, is_outgoing, AF_INET,	\
71*721fffe3SKacheong Poon 				    (uint8_t *)(&((connp)->conn_laddr_v4)),\
72*721fffe3SKacheong Poon 				    (in_port_t)(connp)->conn_lport,	\
73*721fffe3SKacheong Poon 				    (uint8_t *)(&((connp)->conn_faddr_v4)),\
74*721fffe3SKacheong Poon 				    (in_port_t)(connp)->conn_fport, NULL); \
75*721fffe3SKacheong Poon 			}						\
76*721fffe3SKacheong Poon 		} else {						\
77*721fffe3SKacheong Poon 			if (!IN6_IS_ADDR_UNSPECIFIED(			\
78*721fffe3SKacheong Poon 			    &(connp)->conn_laddr_v6)) {			\
79*721fffe3SKacheong Poon 				(err) = (*cl_inet_connect2)(		\
80*721fffe3SKacheong Poon 				    (connp)->conn_netstack->netstack_stackid,\
81*721fffe3SKacheong Poon 				    IPPROTO_TCP, is_outgoing, AF_INET6,	\
82*721fffe3SKacheong Poon 				    (uint8_t *)(&((connp)->conn_laddr_v6)),\
83*721fffe3SKacheong Poon 				    (in_port_t)(connp)->conn_lport,	\
84*721fffe3SKacheong Poon 				    (uint8_t *)(&((connp)->conn_faddr_v6)), \
85*721fffe3SKacheong Poon 				    (in_port_t)(connp)->conn_fport, NULL); \
86*721fffe3SKacheong Poon 			}						\
87*721fffe3SKacheong Poon 		}							\
88*721fffe3SKacheong Poon 	}								\
89*721fffe3SKacheong Poon }
90*721fffe3SKacheong Poon 
91*721fffe3SKacheong Poon #define	CL_INET_DISCONNECT(connp)	{				\
92*721fffe3SKacheong Poon 	if (cl_inet_disconnect != NULL) {				\
93*721fffe3SKacheong Poon 		/*							\
94*721fffe3SKacheong Poon 		 * Running in cluster mode - deregister active		\
95*721fffe3SKacheong Poon 		 * connection information				\
96*721fffe3SKacheong Poon 		 */							\
97*721fffe3SKacheong Poon 		if ((connp)->conn_ipversion == IPV4_VERSION) {		\
98*721fffe3SKacheong Poon 			if ((connp)->conn_laddr_v4 != 0) {		\
99*721fffe3SKacheong Poon 				(*cl_inet_disconnect)(			\
100*721fffe3SKacheong Poon 				    (connp)->conn_netstack->netstack_stackid,\
101*721fffe3SKacheong Poon 				    IPPROTO_TCP, AF_INET,		\
102*721fffe3SKacheong Poon 				    (uint8_t *)(&((connp)->conn_laddr_v4)),\
103*721fffe3SKacheong Poon 				    (in_port_t)(connp)->conn_lport,	\
104*721fffe3SKacheong Poon 				    (uint8_t *)(&((connp)->conn_faddr_v4)),\
105*721fffe3SKacheong Poon 				    (in_port_t)(connp)->conn_fport, NULL); \
106*721fffe3SKacheong Poon 			}						\
107*721fffe3SKacheong Poon 		} else {						\
108*721fffe3SKacheong Poon 			if (!IN6_IS_ADDR_UNSPECIFIED(			\
109*721fffe3SKacheong Poon 			    &(connp)->conn_laddr_v6)) {			\
110*721fffe3SKacheong Poon 				(*cl_inet_disconnect)(			\
111*721fffe3SKacheong Poon 				    (connp)->conn_netstack->netstack_stackid,\
112*721fffe3SKacheong Poon 				    IPPROTO_TCP, AF_INET6,		\
113*721fffe3SKacheong Poon 				    (uint8_t *)(&((connp)->conn_laddr_v6)),\
114*721fffe3SKacheong Poon 				    (in_port_t)(connp)->conn_lport,	\
115*721fffe3SKacheong Poon 				    (uint8_t *)(&((connp)->conn_faddr_v6)), \
116*721fffe3SKacheong Poon 				    (in_port_t)(connp)->conn_fport, NULL); \
117*721fffe3SKacheong Poon 			}						\
118*721fffe3SKacheong Poon 		}							\
119*721fffe3SKacheong Poon 	}								\
120*721fffe3SKacheong Poon }
121*721fffe3SKacheong Poon 
122*721fffe3SKacheong Poon #endif	/* _KERNEL */
123*721fffe3SKacheong Poon 
124*721fffe3SKacheong Poon #ifdef	__cplusplus
125*721fffe3SKacheong Poon }
126*721fffe3SKacheong Poon #endif
127*721fffe3SKacheong Poon 
128*721fffe3SKacheong Poon #endif	/* _INET_TCP_CLUSTER_H */
129