xref: /onnv-gate/usr/src/uts/common/inet/sockmods/sockmod_rds.c (revision 12198:4db936bda957)
1*12198SEiji.Ota@Sun.COM /*
2*12198SEiji.Ota@Sun.COM  * CDDL HEADER START
3*12198SEiji.Ota@Sun.COM  *
4*12198SEiji.Ota@Sun.COM  * The contents of this file are subject to the terms of the
5*12198SEiji.Ota@Sun.COM  * Common Development and Distribution License (the "License").
6*12198SEiji.Ota@Sun.COM  * You may not use this file except in compliance with the License.
7*12198SEiji.Ota@Sun.COM  *
8*12198SEiji.Ota@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*12198SEiji.Ota@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*12198SEiji.Ota@Sun.COM  * See the License for the specific language governing permissions
11*12198SEiji.Ota@Sun.COM  * and limitations under the License.
12*12198SEiji.Ota@Sun.COM  *
13*12198SEiji.Ota@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*12198SEiji.Ota@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*12198SEiji.Ota@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*12198SEiji.Ota@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*12198SEiji.Ota@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*12198SEiji.Ota@Sun.COM  *
19*12198SEiji.Ota@Sun.COM  * CDDL HEADER END
20*12198SEiji.Ota@Sun.COM  */
21*12198SEiji.Ota@Sun.COM /*
22*12198SEiji.Ota@Sun.COM  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23*12198SEiji.Ota@Sun.COM  */
24*12198SEiji.Ota@Sun.COM 
25*12198SEiji.Ota@Sun.COM #include <sys/types.h>
26*12198SEiji.Ota@Sun.COM #include <sys/conf.h>
27*12198SEiji.Ota@Sun.COM #include <sys/modctl.h>
28*12198SEiji.Ota@Sun.COM #include <sys/sunldi.h>
29*12198SEiji.Ota@Sun.COM #include <inet/common.h>
30*12198SEiji.Ota@Sun.COM #include <sys/strsubr.h>
31*12198SEiji.Ota@Sun.COM #include <sys/socketvar.h>
32*12198SEiji.Ota@Sun.COM 
33*12198SEiji.Ota@Sun.COM extern sock_lower_handle_t rdsv3_create(int, int, int, sock_downcalls_t **,
34*12198SEiji.Ota@Sun.COM     uint_t *, int *, int, cred_t *);
35*12198SEiji.Ota@Sun.COM 
36*12198SEiji.Ota@Sun.COM #define	INET_NAME	"sockrds"
37*12198SEiji.Ota@Sun.COM #define	INET_DEVMINOR	0
38*12198SEiji.Ota@Sun.COM #define	INET_MODMTFLAGS	D_MP
39*12198SEiji.Ota@Sun.COM #define	INET_SOCKDESC	"RDSv3 socket module"
40*12198SEiji.Ota@Sun.COM #define	INET_SOCK_PROTO_CREATE_FUNC	(*rdsv3_create)
41*12198SEiji.Ota@Sun.COM 
42*12198SEiji.Ota@Sun.COM #include "../inetddi.c"
43*12198SEiji.Ota@Sun.COM 
44*12198SEiji.Ota@Sun.COM ldi_ident_t	sockrds_li;
45*12198SEiji.Ota@Sun.COM ldi_handle_t    rdsv3_transport_handle = NULL;
46*12198SEiji.Ota@Sun.COM 
47*12198SEiji.Ota@Sun.COM #define	RDSV3_DEVICE_NAME	"/devices/ib/rdsv3@0:rdsv3"
48*12198SEiji.Ota@Sun.COM 
49*12198SEiji.Ota@Sun.COM int
_init(void)50*12198SEiji.Ota@Sun.COM _init(void)
51*12198SEiji.Ota@Sun.COM {
52*12198SEiji.Ota@Sun.COM 	int	ret;
53*12198SEiji.Ota@Sun.COM 
54*12198SEiji.Ota@Sun.COM 	ret = ldi_ident_from_mod(&modlinkage, &sockrds_li);
55*12198SEiji.Ota@Sun.COM 	if (ret != 0) {
56*12198SEiji.Ota@Sun.COM 		sockrds_li = NULL;
57*12198SEiji.Ota@Sun.COM 		goto done;
58*12198SEiji.Ota@Sun.COM 	}
59*12198SEiji.Ota@Sun.COM 
60*12198SEiji.Ota@Sun.COM 	ret = ldi_open_by_name(RDSV3_DEVICE_NAME, FREAD | FWRITE, kcred,
61*12198SEiji.Ota@Sun.COM 	    &rdsv3_transport_handle, sockrds_li);
62*12198SEiji.Ota@Sun.COM 	if (ret != 0) {
63*12198SEiji.Ota@Sun.COM 		ldi_ident_release(sockrds_li);
64*12198SEiji.Ota@Sun.COM 		sockrds_li = NULL;
65*12198SEiji.Ota@Sun.COM 		rdsv3_transport_handle = NULL;
66*12198SEiji.Ota@Sun.COM 		goto done;
67*12198SEiji.Ota@Sun.COM 	}
68*12198SEiji.Ota@Sun.COM 
69*12198SEiji.Ota@Sun.COM 	ret = mod_install(&modlinkage);
70*12198SEiji.Ota@Sun.COM 	if (ret != 0) {
71*12198SEiji.Ota@Sun.COM 		(void) ldi_close(rdsv3_transport_handle, FNDELAY, kcred);
72*12198SEiji.Ota@Sun.COM 		ldi_ident_release(sockrds_li);
73*12198SEiji.Ota@Sun.COM 		sockrds_li = NULL;
74*12198SEiji.Ota@Sun.COM 		rdsv3_transport_handle = NULL;
75*12198SEiji.Ota@Sun.COM 	}
76*12198SEiji.Ota@Sun.COM 
77*12198SEiji.Ota@Sun.COM done:
78*12198SEiji.Ota@Sun.COM 	return (ret);
79*12198SEiji.Ota@Sun.COM }
80*12198SEiji.Ota@Sun.COM 
81*12198SEiji.Ota@Sun.COM int
_fini(void)82*12198SEiji.Ota@Sun.COM _fini(void)
83*12198SEiji.Ota@Sun.COM {
84*12198SEiji.Ota@Sun.COM 	int ret;
85*12198SEiji.Ota@Sun.COM 
86*12198SEiji.Ota@Sun.COM 	ret = mod_remove(&modlinkage);
87*12198SEiji.Ota@Sun.COM 	if (ret != 0) {
88*12198SEiji.Ota@Sun.COM 		return (ret);
89*12198SEiji.Ota@Sun.COM 	}
90*12198SEiji.Ota@Sun.COM 
91*12198SEiji.Ota@Sun.COM 	if (rdsv3_transport_handle != NULL) {
92*12198SEiji.Ota@Sun.COM 		(void) ldi_close(rdsv3_transport_handle, FNDELAY, kcred);
93*12198SEiji.Ota@Sun.COM 		rdsv3_transport_handle = NULL;
94*12198SEiji.Ota@Sun.COM 	}
95*12198SEiji.Ota@Sun.COM 
96*12198SEiji.Ota@Sun.COM 	if (sockrds_li != NULL)
97*12198SEiji.Ota@Sun.COM 		ldi_ident_release(sockrds_li);
98*12198SEiji.Ota@Sun.COM 
99*12198SEiji.Ota@Sun.COM 	return (0);
100*12198SEiji.Ota@Sun.COM }
101*12198SEiji.Ota@Sun.COM 
102*12198SEiji.Ota@Sun.COM int
_info(struct modinfo * modinfop)103*12198SEiji.Ota@Sun.COM _info(struct modinfo *modinfop)
104*12198SEiji.Ota@Sun.COM {
105*12198SEiji.Ota@Sun.COM 	return (mod_info(&modlinkage, modinfop));
106*12198SEiji.Ota@Sun.COM }
107