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