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