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  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_INET_TCP_CLUSTER_H
27 #define	_INET_TCP_CLUSTER_H
28 
29 #ifdef	__cplusplus
30 extern "C" {
31 #endif
32 
33 #ifdef _KERNEL
34 
35 /*
36  * Cluster hooks defined in tcp_cluster.c.
37  */
38 extern void (*cl_inet_listen)(netstackid_t, uint8_t, sa_family_t, uint8_t *,
39     in_port_t, void *);
40 extern void (*cl_inet_unlisten)(netstackid_t, uint8_t, sa_family_t, uint8_t *,
41     in_port_t, void *);
42 extern int (*cl_inet_connect2)(netstackid_t, uint8_t, boolean_t, sa_family_t,
43     uint8_t *, in_port_t, uint8_t *, in_port_t, void *);
44 extern void (*cl_inet_disconnect)(netstackid_t, uint8_t, sa_family_t,
45     uint8_t *, in_port_t, uint8_t *, in_port_t, void *);
46 
47 
48 /*
49  * Cluster networking hook for traversing current connection list.
50  * This routine is used to extract the current list of live connections
51  * which must continue to to be dispatched to this node.
52  */
53 extern int cl_tcp_walk_list(netstackid_t,
54     int (*callback)(cl_tcp_info_t *, void *), void *);
55 
56 /*
57  * int CL_INET_CONNECT(conn_t *cp, tcp_t *tcp, boolean_t is_outgoing, int err)
58  */
59 #define	CL_INET_CONNECT(connp, is_outgoing, err) {		\
60 	(err) = 0;						\
61 	if (cl_inet_connect2 != NULL) {				\
62 		/*						\
63 		 * Running in cluster mode - register active connection	\
64 		 * information						\
65 		 */							\
66 		if ((connp)->conn_ipversion == IPV4_VERSION) {		\
67 			if ((connp)->conn_laddr_v4 != 0) {		\
68 				(err) = (*cl_inet_connect2)(		\
69 				    (connp)->conn_netstack->netstack_stackid,\
70 				    IPPROTO_TCP, is_outgoing, AF_INET,	\
71 				    (uint8_t *)(&((connp)->conn_laddr_v4)),\
72 				    (in_port_t)(connp)->conn_lport,	\
73 				    (uint8_t *)(&((connp)->conn_faddr_v4)),\
74 				    (in_port_t)(connp)->conn_fport, NULL); \
75 			}						\
76 		} else {						\
77 			if (!IN6_IS_ADDR_UNSPECIFIED(			\
78 			    &(connp)->conn_laddr_v6)) {			\
79 				(err) = (*cl_inet_connect2)(		\
80 				    (connp)->conn_netstack->netstack_stackid,\
81 				    IPPROTO_TCP, is_outgoing, AF_INET6,	\
82 				    (uint8_t *)(&((connp)->conn_laddr_v6)),\
83 				    (in_port_t)(connp)->conn_lport,	\
84 				    (uint8_t *)(&((connp)->conn_faddr_v6)), \
85 				    (in_port_t)(connp)->conn_fport, NULL); \
86 			}						\
87 		}							\
88 	}								\
89 }
90 
91 #define	CL_INET_DISCONNECT(connp)	{				\
92 	if (cl_inet_disconnect != NULL) {				\
93 		/*							\
94 		 * Running in cluster mode - deregister active		\
95 		 * connection information				\
96 		 */							\
97 		if ((connp)->conn_ipversion == IPV4_VERSION) {		\
98 			if ((connp)->conn_laddr_v4 != 0) {		\
99 				(*cl_inet_disconnect)(			\
100 				    (connp)->conn_netstack->netstack_stackid,\
101 				    IPPROTO_TCP, AF_INET,		\
102 				    (uint8_t *)(&((connp)->conn_laddr_v4)),\
103 				    (in_port_t)(connp)->conn_lport,	\
104 				    (uint8_t *)(&((connp)->conn_faddr_v4)),\
105 				    (in_port_t)(connp)->conn_fport, NULL); \
106 			}						\
107 		} else {						\
108 			if (!IN6_IS_ADDR_UNSPECIFIED(			\
109 			    &(connp)->conn_laddr_v6)) {			\
110 				(*cl_inet_disconnect)(			\
111 				    (connp)->conn_netstack->netstack_stackid,\
112 				    IPPROTO_TCP, AF_INET6,		\
113 				    (uint8_t *)(&((connp)->conn_laddr_v6)),\
114 				    (in_port_t)(connp)->conn_lport,	\
115 				    (uint8_t *)(&((connp)->conn_faddr_v6)), \
116 				    (in_port_t)(connp)->conn_fport, NULL); \
117 			}						\
118 		}							\
119 	}								\
120 }
121 
122 #endif	/* _KERNEL */
123 
124 #ifdef	__cplusplus
125 }
126 #endif
127 
128 #endif	/* _INET_TCP_CLUSTER_H */
129