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