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