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