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