xref: /onnv-gate/usr/src/uts/common/inet/sockmods/sockmod_sdp.c (revision 8348:4137e18bfaf0)
1*8348SEric.Yu@Sun.COM /*
2*8348SEric.Yu@Sun.COM  * CDDL HEADER START
3*8348SEric.Yu@Sun.COM  *
4*8348SEric.Yu@Sun.COM  * The contents of this file are subject to the terms of the
5*8348SEric.Yu@Sun.COM  * Common Development and Distribution License (the "License").
6*8348SEric.Yu@Sun.COM  * You may not use this file except in compliance with the License.
7*8348SEric.Yu@Sun.COM  *
8*8348SEric.Yu@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*8348SEric.Yu@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*8348SEric.Yu@Sun.COM  * See the License for the specific language governing permissions
11*8348SEric.Yu@Sun.COM  * and limitations under the License.
12*8348SEric.Yu@Sun.COM  *
13*8348SEric.Yu@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*8348SEric.Yu@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*8348SEric.Yu@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*8348SEric.Yu@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*8348SEric.Yu@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*8348SEric.Yu@Sun.COM  *
19*8348SEric.Yu@Sun.COM  * CDDL HEADER END
20*8348SEric.Yu@Sun.COM  */
21*8348SEric.Yu@Sun.COM 
22*8348SEric.Yu@Sun.COM /*
23*8348SEric.Yu@Sun.COM  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24*8348SEric.Yu@Sun.COM  * Use is subject to license terms.
25*8348SEric.Yu@Sun.COM  */
26*8348SEric.Yu@Sun.COM 
27*8348SEric.Yu@Sun.COM #include <sys/sysmacros.h>
28*8348SEric.Yu@Sun.COM #include <sys/strsubr.h>
29*8348SEric.Yu@Sun.COM #include <sys/socket.h>
30*8348SEric.Yu@Sun.COM #include <sys/socketvar.h>
31*8348SEric.Yu@Sun.COM #include <sys/modctl.h>
32*8348SEric.Yu@Sun.COM #include <sys/cmn_err.h>
33*8348SEric.Yu@Sun.COM #include <sys/tihdr.h>
34*8348SEric.Yu@Sun.COM #include <sys/vfs.h>
35*8348SEric.Yu@Sun.COM #include <fs/sockfs/nl7c.h>
36*8348SEric.Yu@Sun.COM #include <inet/kssl/ksslapi.h>
37*8348SEric.Yu@Sun.COM #include <inet/sdp_itf.h>
38*8348SEric.Yu@Sun.COM #include <fs/sockfs/sockcommon.h>
39*8348SEric.Yu@Sun.COM #include "socksdp.h"
40*8348SEric.Yu@Sun.COM 
41*8348SEric.Yu@Sun.COM struct sonode *socksdp_create(struct sockparams *, int, int, int,
42*8348SEric.Yu@Sun.COM     int, int, int *, cred_t *);
43*8348SEric.Yu@Sun.COM static void socksdp_destroy(struct sonode *);
44*8348SEric.Yu@Sun.COM 
45*8348SEric.Yu@Sun.COM static __smod_priv_t sosdp_priv = {
46*8348SEric.Yu@Sun.COM 	socksdp_create,
47*8348SEric.Yu@Sun.COM 	socksdp_destroy,
48*8348SEric.Yu@Sun.COM 	NULL
49*8348SEric.Yu@Sun.COM };
50*8348SEric.Yu@Sun.COM 
51*8348SEric.Yu@Sun.COM static smod_reg_t sinfo = {
52*8348SEric.Yu@Sun.COM 	SOCKMOD_VERSION,
53*8348SEric.Yu@Sun.COM 	"socksdp",
54*8348SEric.Yu@Sun.COM 	SOCK_UC_VERSION,
55*8348SEric.Yu@Sun.COM 	SOCK_DC_VERSION,
56*8348SEric.Yu@Sun.COM 	NULL,
57*8348SEric.Yu@Sun.COM 	&sosdp_priv
58*8348SEric.Yu@Sun.COM };
59*8348SEric.Yu@Sun.COM 
60*8348SEric.Yu@Sun.COM /*
61*8348SEric.Yu@Sun.COM  * Module linkage information for the kernel
62*8348SEric.Yu@Sun.COM  */
63*8348SEric.Yu@Sun.COM static struct modlsockmod modlsockmod = {
64*8348SEric.Yu@Sun.COM 	&mod_sockmodops, "SDP socket module", &sinfo
65*8348SEric.Yu@Sun.COM };
66*8348SEric.Yu@Sun.COM 
67*8348SEric.Yu@Sun.COM static struct modlinkage modlinkage = {
68*8348SEric.Yu@Sun.COM 	MODREV_1,
69*8348SEric.Yu@Sun.COM 	&modlsockmod,
70*8348SEric.Yu@Sun.COM 	NULL
71*8348SEric.Yu@Sun.COM };
72*8348SEric.Yu@Sun.COM 
73*8348SEric.Yu@Sun.COM /*
74*8348SEric.Yu@Sun.COM  * Creates a sdp socket data structure.
75*8348SEric.Yu@Sun.COM  */
76*8348SEric.Yu@Sun.COM /* ARGSUSED */
77*8348SEric.Yu@Sun.COM struct sonode *
78*8348SEric.Yu@Sun.COM socksdp_create(struct sockparams *sp, int family, int type, int protocol,
79*8348SEric.Yu@Sun.COM 		    int version, int sflags, int *errorp, cred_t *cr)
80*8348SEric.Yu@Sun.COM {
81*8348SEric.Yu@Sun.COM 	struct sonode *so;
82*8348SEric.Yu@Sun.COM 	int kmflags = (sflags & SOCKET_NOSLEEP) ? KM_NOSLEEP : KM_SLEEP;
83*8348SEric.Yu@Sun.COM 
84*8348SEric.Yu@Sun.COM 	dprint(4, ("Inside sosdp_create: domain:%d proto:%d type:%d",
85*8348SEric.Yu@Sun.COM 	    family, protocol, type));
86*8348SEric.Yu@Sun.COM 
87*8348SEric.Yu@Sun.COM 	*errorp = 0;
88*8348SEric.Yu@Sun.COM 	if (is_system_labeled()) {
89*8348SEric.Yu@Sun.COM 		*errorp = EOPNOTSUPP;
90*8348SEric.Yu@Sun.COM 		return (NULL);
91*8348SEric.Yu@Sun.COM 	}
92*8348SEric.Yu@Sun.COM 
93*8348SEric.Yu@Sun.COM 	if (version == SOV_STREAM) {
94*8348SEric.Yu@Sun.COM 		*errorp = EINVAL;
95*8348SEric.Yu@Sun.COM 		return (NULL);
96*8348SEric.Yu@Sun.COM 	}
97*8348SEric.Yu@Sun.COM 
98*8348SEric.Yu@Sun.COM 	/*
99*8348SEric.Yu@Sun.COM 	 * We only support one type of SDP socket.  Let sotpi_create()
100*8348SEric.Yu@Sun.COM 	 * handle all other cases, such as raw socket.
101*8348SEric.Yu@Sun.COM 	 */
102*8348SEric.Yu@Sun.COM 	if (!(family == AF_INET || family == AF_INET6) ||
103*8348SEric.Yu@Sun.COM 	    !(type == SOCK_STREAM)) {
104*8348SEric.Yu@Sun.COM 		*errorp = EINVAL;
105*8348SEric.Yu@Sun.COM 		return (NULL);
106*8348SEric.Yu@Sun.COM 	}
107*8348SEric.Yu@Sun.COM 
108*8348SEric.Yu@Sun.COM 	so = kmem_cache_alloc(socket_cache, kmflags);
109*8348SEric.Yu@Sun.COM 	if (so == NULL) {
110*8348SEric.Yu@Sun.COM 		*errorp = ENOMEM;
111*8348SEric.Yu@Sun.COM 		return (NULL);
112*8348SEric.Yu@Sun.COM 	}
113*8348SEric.Yu@Sun.COM 
114*8348SEric.Yu@Sun.COM 	sonode_init(so, sp, family, type, protocol, &sosdp_sonodeops);
115*8348SEric.Yu@Sun.COM 	so->so_pollev |= SO_POLLEV_ALWAYS;
116*8348SEric.Yu@Sun.COM 
117*8348SEric.Yu@Sun.COM 	dprint(2, ("sosdp_create: %p domain %d type %d\n", (void *)so, family,
118*8348SEric.Yu@Sun.COM 	    type));
119*8348SEric.Yu@Sun.COM 
120*8348SEric.Yu@Sun.COM 	if (version == SOV_DEFAULT) {
121*8348SEric.Yu@Sun.COM 		version = so_default_version;
122*8348SEric.Yu@Sun.COM 	}
123*8348SEric.Yu@Sun.COM 	so->so_version = (short)version;
124*8348SEric.Yu@Sun.COM 
125*8348SEric.Yu@Sun.COM 	return (so);
126*8348SEric.Yu@Sun.COM }
127*8348SEric.Yu@Sun.COM 
128*8348SEric.Yu@Sun.COM static void
129*8348SEric.Yu@Sun.COM socksdp_destroy(struct sonode *so)
130*8348SEric.Yu@Sun.COM {
131*8348SEric.Yu@Sun.COM 	ASSERT(so->so_ops == &sosdp_sonodeops);
132*8348SEric.Yu@Sun.COM 
133*8348SEric.Yu@Sun.COM 	sosdp_fini(so, CRED());
134*8348SEric.Yu@Sun.COM 
135*8348SEric.Yu@Sun.COM 	kmem_cache_free(socket_cache, so);
136*8348SEric.Yu@Sun.COM }
137*8348SEric.Yu@Sun.COM 
138*8348SEric.Yu@Sun.COM int
139*8348SEric.Yu@Sun.COM _init(void)
140*8348SEric.Yu@Sun.COM {
141*8348SEric.Yu@Sun.COM 	return (mod_install(&modlinkage));
142*8348SEric.Yu@Sun.COM }
143*8348SEric.Yu@Sun.COM 
144*8348SEric.Yu@Sun.COM int
145*8348SEric.Yu@Sun.COM _fini(void)
146*8348SEric.Yu@Sun.COM {
147*8348SEric.Yu@Sun.COM 	return (mod_remove(&modlinkage));
148*8348SEric.Yu@Sun.COM }
149*8348SEric.Yu@Sun.COM 
150*8348SEric.Yu@Sun.COM int
151*8348SEric.Yu@Sun.COM _info(struct modinfo *modinfop)
152*8348SEric.Yu@Sun.COM {
153*8348SEric.Yu@Sun.COM 	return (mod_info(&modlinkage, modinfop));
154*8348SEric.Yu@Sun.COM }
155