xref: /onnv-gate/usr/src/uts/common/sys/ib/clients/rds/rds.h (revision 3302:e75a684d1697)
1*3302Sagiri /*
2*3302Sagiri  * CDDL HEADER START
3*3302Sagiri  *
4*3302Sagiri  * The contents of this file are subject to the terms of the
5*3302Sagiri  * Common Development and Distribution License (the "License").
6*3302Sagiri  * You may not use this file except in compliance with the License.
7*3302Sagiri  *
8*3302Sagiri  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*3302Sagiri  * or http://www.opensolaris.org/os/licensing.
10*3302Sagiri  * See the License for the specific language governing permissions
11*3302Sagiri  * and limitations under the License.
12*3302Sagiri  *
13*3302Sagiri  * When distributing Covered Code, include this CDDL HEADER in each
14*3302Sagiri  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*3302Sagiri  * If applicable, add the following below this CDDL HEADER, with the
16*3302Sagiri  * fields enclosed by brackets "[]" replaced with your own identifying
17*3302Sagiri  * information: Portions Copyright [yyyy] [name of copyright owner]
18*3302Sagiri  *
19*3302Sagiri  * CDDL HEADER END
20*3302Sagiri  */
21*3302Sagiri /*
22*3302Sagiri  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23*3302Sagiri  * Use is subject to license terms.
24*3302Sagiri  */
25*3302Sagiri 
26*3302Sagiri #ifndef	_RDS_H
27*3302Sagiri #define	_RDS_H
28*3302Sagiri 
29*3302Sagiri #pragma ident	"%Z%%M%	%I%	%E% SMI"
30*3302Sagiri 
31*3302Sagiri #ifdef	__cplusplus
32*3302Sagiri extern "C" {
33*3302Sagiri #endif
34*3302Sagiri 
35*3302Sagiri #include <sys/types.h>
36*3302Sagiri #include <sys/t_lock.h>
37*3302Sagiri #include <sys/param.h>
38*3302Sagiri #include <sys/systm.h>
39*3302Sagiri #include <sys/buf.h>
40*3302Sagiri #include <sys/vfs.h>
41*3302Sagiri #include <sys/vnode.h>
42*3302Sagiri #include <sys/debug.h>
43*3302Sagiri #include <sys/errno.h>
44*3302Sagiri #include <sys/stropts.h>
45*3302Sagiri #include <sys/cmn_err.h>
46*3302Sagiri #include <sys/sysmacros.h>
47*3302Sagiri 
48*3302Sagiri #include <sys/project.h>
49*3302Sagiri #include <sys/tihdr.h>
50*3302Sagiri #include <sys/strsubr.h>
51*3302Sagiri 
52*3302Sagiri #include <sys/socket.h>
53*3302Sagiri #include <sys/socketvar.h>
54*3302Sagiri #include <sys/strsun.h>
55*3302Sagiri 
56*3302Sagiri #include <inet/common.h>
57*3302Sagiri #include <inet/ip.h>
58*3302Sagiri #include <inet/optcom.h>
59*3302Sagiri 
60*3302Sagiri #include <sys/sunldi.h>
61*3302Sagiri #include <sys/dlpi.h>
62*3302Sagiri 
63*3302Sagiri #include <inet/ip_ire.h>
64*3302Sagiri 
65*3302Sagiri #undef  dprint
66*3302Sagiri #ifdef DEBUG
67*3302Sagiri extern int rdsdebug;
68*3302Sagiri #define	dprint(level, args)	{ if (rdsdebug > (level)) printf args; }
69*3302Sagiri #else
70*3302Sagiri #define	dprint(level, args) {}
71*3302Sagiri #endif
72*3302Sagiri 
73*3302Sagiri typedef struct rds_s {
74*3302Sagiri 	kmutex_t	rds_lock;	/* protects rds_refcnt */
75*3302Sagiri 	int		rds_refcnt;
76*3302Sagiri 	kcondvar_t	rds_refcv;
77*3302Sagiri 	uint32_t	rds_state;	/* TPI state */
78*3302Sagiri 	uint32_t	rds_flags;
79*3302Sagiri 	sa_family_t	rds_family;	/* Family from socket() call */
80*3302Sagiri 	cred_t		*rds_cred;
81*3302Sagiri 	in_port_t	rds_port;	/* Port bound to this stream */
82*3302Sagiri 	ipaddr_t	rds_src;	/* Source address of this stream */
83*3302Sagiri 	void		*rds_ulpd;	/* queue to send message on */
84*3302Sagiri 	struct rds_s	*rds_bind_hash;	/* Bind hash chain */
85*3302Sagiri 	struct rds_s	**rds_ptpbhn;	/* Ptr to previous bind hash next. */
86*3302Sagiri 	ulong_t		rds_port_quota; /* Port quota */
87*3302Sagiri 	zoneid_t	rds_zoneid;
88*3302Sagiri } rds_t;
89*3302Sagiri 
90*3302Sagiri #define	RDS_CLOSING 	0x1
91*3302Sagiri 
92*3302Sagiri #define	RDS_INCR_REF_CNT(rds)  { 	\
93*3302Sagiri 	mutex_enter(&rds->rds_lock);	\
94*3302Sagiri 	rds->rds_refcnt++;	\
95*3302Sagiri 	ASSERT(rds->rds_refcnt != 0); \
96*3302Sagiri 	mutex_exit(&rds->rds_lock); \
97*3302Sagiri }
98*3302Sagiri 
99*3302Sagiri #define	RDS_DEC_REF_CNT(rds)  { 	\
100*3302Sagiri 	mutex_enter(&rds->rds_lock);	\
101*3302Sagiri 	ASSERT(rds->rds_refcnt > 0); \
102*3302Sagiri 	rds->rds_refcnt--;	\
103*3302Sagiri 	if (rds->rds_refcnt == 1)	\
104*3302Sagiri 		cv_broadcast(&(rds)->rds_refcv); \
105*3302Sagiri 	if (rds->rds_refcnt == 0) {	\
106*3302Sagiri 		rds_free(rds);	\
107*3302Sagiri 	} else {	\
108*3302Sagiri 		mutex_exit(&rds->rds_lock); \
109*3302Sagiri 	}	\
110*3302Sagiri }
111*3302Sagiri 
112*3302Sagiri 
113*3302Sagiri #define	RDS_MATCH(rdsp, lport, laddr)               \
114*3302Sagiri 	(((rdsp)->rds_port == lport) &&		\
115*3302Sagiri 	((rdsp)->rds_src == laddr))
116*3302Sagiri 
117*3302Sagiri /* RDS bind fanout hash structure. */
118*3302Sagiri typedef struct rds_bind_fanout_s {
119*3302Sagiri 	rds_t *rds_bf_rds;
120*3302Sagiri 	kmutex_t rds_bf_lock;
121*3302Sagiri #if defined(_LP64) || defined(_I32LPx)
122*3302Sagiri 	char    bf_pad[48];
123*3302Sagiri #else
124*3302Sagiri 	char    bf_pad[56];
125*3302Sagiri #endif
126*3302Sagiri }rds_bf_t;
127*3302Sagiri 
128*3302Sagiri extern ldi_ident_t rds_li;
129*3302Sagiri 
130*3302Sagiri #define	RDS_BIND_FANOUT_SIZE    512
131*3302Sagiri #define	RDS_BIND_HASH(lport) \
132*3302Sagiri 	((ntohs((uint16_t)lport)) & (rds_bind_fanout_size - 1))
133*3302Sagiri 
134*3302Sagiri #define	AF_INET_OFFLOAD 30
135*3302Sagiri 
136*3302Sagiri extern	uint_t rds_bind_fanout_size;
137*3302Sagiri extern	rds_bf_t *rds_bind_fanout;
138*3302Sagiri 
139*3302Sagiri extern optdb_obj_t rds_opt_obj;
140*3302Sagiri 
141*3302Sagiri extern void rds_hash_init();
142*3302Sagiri 
143*3302Sagiri extern	void rds_free(rds_t *rds);
144*3302Sagiri extern rds_t *rds_create(void *rds_ulpd, cred_t *credp);
145*3302Sagiri 
146*3302Sagiri extern void rds_bind_hash_remove(rds_t *rds, boolean_t);
147*3302Sagiri extern void rds_bind_hash_insert(rds_bf_t *, rds_t *);
148*3302Sagiri extern rds_t *rds_fanout(ipaddr_t, ipaddr_t, in_port_t, in_port_t, zoneid_t);
149*3302Sagiri extern void rds_add_new_msg(mblk_t *mp, ipaddr_t, ipaddr_t, in_port_t,
150*3302Sagiri     in_port_t);
151*3302Sagiri extern boolean_t rds_verify_bind_address(ipaddr_t addr);
152*3302Sagiri extern boolean_t rds_islocal(ipaddr_t addr);
153*3302Sagiri extern boolean_t rds_if_lookup_by_name(char *if_name);
154*3302Sagiri extern boolean_t rds_if_lookup_by_addr(ipaddr_t addr);
155*3302Sagiri 
156*3302Sagiri 
157*3302Sagiri extern void rds_init();
158*3302Sagiri extern void rds_fini();
159*3302Sagiri 
160*3302Sagiri 
161*3302Sagiri #ifdef	__cplusplus
162*3302Sagiri }
163*3302Sagiri #endif
164*3302Sagiri 
165*3302Sagiri #endif	/* _RDS_H */
166