iser.c revision 1d73e59f8caac41c539211070dbc51318da5c71e
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * CDDL HEADER START
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * The contents of this file are subject to the terms of the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Common Development and Distribution License (the "License").
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * You may not use this file except in compliance with the License.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * or http://www.opensolaris.org/os/licensing.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * See the License for the specific language governing permissions
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * and limitations under the License.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * When distributing Covered Code, include this CDDL HEADER in each
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * If applicable, add the following below this CDDL HEADER, with the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * fields enclosed by brackets "[]" replaced with your own identifying
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * information: Portions Copyright [yyyy] [name of copyright owner]
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * CDDL HEADER END
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * Use is subject to license terms.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <sys/types.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <sys/stat.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <sys/conf.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <sys/ddi.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <sys/sunddi.h>
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh#include <sys/modctl.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <sys/socket.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <netinet/in.h>
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <sys/ib/clients/iser/iser.h>
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * iser.c
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * DDI and core routines for Solaris iSER implementation.
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire */
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireiser_state_t *iser_state = NULL; /* global state */
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguireddi_taskq_t *iser_taskq = NULL; /* global taskq */
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire/* set B_TRUE for console logging */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireboolean_t iser_logging = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Driver functions */
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguirestatic int iser_attach(dev_info_t *, ddi_attach_cmd_t);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int iser_detach(dev_info_t *, ddi_detach_cmd_t);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int iser_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int iser_open(dev_t *, int, int, cred_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int iser_close(dev_t, int, int, cred_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int iser_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* static int iser_close(dev_t, int, int, cred_t *); */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Char/Block operations */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic struct cb_ops iser_cb_ops = {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire iser_open, /* open */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire iser_close, /* close */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nodev, /* strategy */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nodev, /* print */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nodev, /* dump */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nodev, /* read */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nodev, /* write */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire iser_ioctl, /* ioctl */
36e852a172cba914383d7341c988128b2c667fbdRaja Andra nodev, /* devmap */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nodev, /* mmap */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nodev, /* segmap */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nochpoll, /* poll */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ddi_prop_op, /* prop_op */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire NULL, /* stream */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire D_MP, /* cb_flag */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire CB_REV, /* rev */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nodev, /* int (*cb_aread)() */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nodev, /* int (*cb_awrite)() */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire};
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Device operations */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic struct dev_ops iser_ops = {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire DEVO_REV, /* devo_rev, */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire 0, /* refcnt */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire iser_getinfo, /* getinfo */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nulldev, /* identify */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nulldev, /* probe */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire iser_attach, /* attach */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire iser_detach, /* detach */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nodev, /* reset */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &iser_cb_ops, /* cb_ops */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire NULL, /* bus ops */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire NULL, /* power */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ddi_quiesce_not_needed /* quiesce */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire};
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Module Driver Info */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define ISER_NAME_VERSION "iSCSI Extensions for RDMA"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic struct modldrv iser_modldrv = {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &mod_driverops,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ISER_NAME_VERSION,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &iser_ops,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire};
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Module Linkage */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic struct modlinkage iser_modlinkage = {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire MODREV_1,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &iser_modldrv,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire NULL
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire};
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * _init()
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireint
e7ad388adbf175c15b5cb11584f1b92685ed77fcamaguire_init(void)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
e7ad388adbf175c15b5cb11584f1b92685ed77fcamaguire int status;
e7ad388adbf175c15b5cb11584f1b92685ed77fcamaguire
e7ad388adbf175c15b5cb11584f1b92685ed77fcamaguire iser_state = kmem_zalloc(sizeof (iser_state_t), KM_SLEEP);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire status = mod_install(&iser_modlinkage);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (status != DDI_SUCCESS) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire kmem_free(iser_state, sizeof (iser_state_t));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (status);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * _info()
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireint
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire_info(struct modinfo *modinfop)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (mod_info(&iser_modlinkage, modinfop));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * _fini()
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireint
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire_fini(void)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int status;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire status = mod_remove(&iser_modlinkage);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (status != DDI_SUCCESS) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (status);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire kmem_free(iser_state, sizeof (iser_state_t));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (DDI_SUCCESS);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * iser_attach()
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireiser_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int instance;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int status;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire switch (cmd) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case DDI_ATTACH:
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire ISER_LOG(CE_CONT, "iser_attach: DDI_ATTACH");
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire instance = ddi_get_instance(dip);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire iser_state->is_dip = dip;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire iser_state->is_instance = instance;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire /* Initialize the open refcnt and it's lock */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire iser_state->is_open_refcnt = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire mutex_init(&iser_state->is_refcnt_lock, NULL, MUTEX_DRIVER,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire NULL);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire iser_taskq = ddi_taskq_create(dip, "iser_taskq",
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire ISER_TASKQ_NTHREADS, TASKQ_DEFAULTPRI, 0);
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire if (iser_taskq == NULL) {
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire ISER_LOG(CE_CONT, "%s%d: failed to create taskq",
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "iser", instance);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire mutex_destroy(&iser_state->is_refcnt_lock);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (DDI_FAILURE);
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* initialize iSER as IB service */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire status = iser_ib_init();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (status != DDI_SUCCESS) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ddi_taskq_destroy(iser_taskq);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire mutex_destroy(&iser_state->is_refcnt_lock);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ISER_LOG(CE_CONT, "%s%d: failed to initialize IB",
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "iser", instance);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (DDI_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire status = ddi_create_minor_node(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire dip, ddi_get_name(dip), S_IFCHR, instance,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire DDI_PSEUDO, 0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (status != DDI_SUCCESS) {
(void) iser_ib_fini();
ddi_taskq_destroy(iser_taskq);
mutex_destroy(&iser_state->is_refcnt_lock);
ISER_LOG(CE_CONT, "%s%d: failed ddi_create_minor_node",
"iser", instance);
return (DDI_FAILURE);
}
ddi_report_dev(dip);
return (DDI_SUCCESS);
case DDI_RESUME:
ISER_LOG(CE_CONT, "iser_detach: DDI_RESUME unsupported");
return (DDI_FAILURE);
default:
ISER_LOG(CE_CONT, "%s%d: unknown cmd in attach (0x%x)", "iser",
instance, cmd);
return (DDI_FAILURE);
}
}
/*
* iser_detach()
*/
static int
iser_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
{
mutex_enter(&iser_state->is_refcnt_lock);
if (iser_state->is_open_refcnt > 0) {
mutex_exit(&iser_state->is_refcnt_lock);
return (DDI_FAILURE);
}
mutex_exit(&iser_state->is_refcnt_lock);
mutex_destroy(&iser_state->is_refcnt_lock);
switch (cmd) {
case DDI_DETACH:
ISER_LOG(CE_CONT, "iser_detach: DDI_DETACH");
if (iser_ib_fini() != DDI_SUCCESS) {
ISER_LOG(CE_CONT, "iser_ib_fini failed");
return (DDI_FAILURE);
}
if (iser_taskq != NULL) {
ddi_taskq_destroy(iser_taskq);
iser_taskq = NULL;
}
ddi_remove_minor_node(dip, NULL);
return (DDI_SUCCESS);
case DDI_SUSPEND:
ISER_LOG(CE_CONT, "iser_detach: DDI_SUSPEND unsupported");
return (DDI_FAILURE);
default:
ISER_LOG(CE_CONT, "iser: unknown cmd in detach (0x%x)", cmd);
return (DDI_FAILURE);
}
}
/*
* iser_getinfo()
*/
/* ARGSUSED */
static int
iser_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
{
switch (cmd) {
case DDI_INFO_DEVT2DEVINFO:
*result = (void *)iser_state->is_dip;
return (DDI_SUCCESS);
case DDI_INFO_DEVT2INSTANCE:
*result = NULL;
return (DDI_SUCCESS);
default:
return (DDI_FAILURE);
}
}
/*
* iser_open()
*/
/* ARGSUSED */
static int
iser_open(dev_t *devp, int flag, int otyp, cred_t *credp)
{
minor_t instance;
int status;
instance = getminor(*devp);
/* Register the transport with IDM */
status = iser_idm_register();
if (status != DDI_SUCCESS) {
ISER_LOG(CE_CONT, "%s%d: failed to register with IDM",
"iser", instance);
return (ENXIO);
}
/* Increment our open refcnt */
mutex_enter(&iser_state->is_refcnt_lock);
iser_state->is_open_refcnt++;
mutex_exit(&iser_state->is_refcnt_lock);
return (DDI_SUCCESS);
}
/*
* iser_close()
*/
/* ARGSUSED */
static int
iser_close(dev_t devp, int flag, int otyp, cred_t *credp)
{
ASSERT(iser_state->is_open_refcnt != 0);
mutex_enter(&iser_state->is_refcnt_lock);
iser_state->is_open_refcnt--;
mutex_exit(&iser_state->is_refcnt_lock);
return (DDI_SUCCESS);
}
iser_status_t
iser_register_service(idm_svc_t *idm_svc)
{
return (iser_ib_register_service(idm_svc));
}
iser_status_t
iser_bind_service(idm_svc_t *idm_svc)
{
return (iser_ib_bind_service(idm_svc));
}
void
iser_unbind_service(idm_svc_t *idm_svc)
{
iser_ib_unbind_service(idm_svc);
}
void
iser_deregister_service(idm_svc_t *idm_svc)
{
iser_ib_deregister_service(idm_svc);
}
/*
* iser_path_exists
* This function takes in a pair of endpoints and determines if an iSER path
* exists between the two. The actual path information (required for creating
* a RC channel) is not returned, instead a boolean value indicating if a path
* exists is returned.
*
* To use an implicit source, a value of NULL is allowed for laddr.
*/
boolean_t
iser_path_exists(idm_sockaddr_t *laddr, idm_sockaddr_t *raddr)
{
ibt_ip_addr_t remote_ip, local_ip;
ibt_path_info_t path;
int status;
iser_ib_conv_sockaddr2ibtaddr(raddr, &remote_ip);
iser_ib_conv_sockaddr2ibtaddr(laddr, &local_ip);
status = iser_ib_get_paths(&local_ip, &remote_ip, &path, NULL);
return ((status == IBT_SUCCESS) ? B_TRUE : B_FALSE);
}
/*
* iser_channel_alloc
* This function allocates a reliable communication channel between the
* given endpoints.
*/
iser_chan_t *
iser_channel_alloc(idm_sockaddr_t *laddr, idm_sockaddr_t *raddr)
{
ibt_ip_addr_t remote_ip, local_ip;
iser_ib_conv_sockaddr2ibtaddr(raddr, &remote_ip);
iser_ib_conv_sockaddr2ibtaddr(laddr, &local_ip);
return (iser_ib_alloc_channel_pathlookup(&local_ip, &remote_ip));
}
/*
* iser_channel_open
* This function opens the already allocated communication channel between the
* two endpoints.
*/
iser_status_t
iser_channel_open(iser_chan_t *chan)
{
return (iser_ib_open_rc_channel(chan));
}
/*
* iser_channel_close
* This function closes the already opened communication channel between the
* two endpoints.
*/
void
iser_channel_close(iser_chan_t *chan)
{
iser_ib_close_rc_channel(chan);
}
/*
* iser_channel_free
* This function frees the channel between the given endpoints
*/
void
iser_channel_free(iser_chan_t *chan)
{
iser_ib_free_rc_channel(chan);
}
/* ARGSUSED */
static int
iser_ioctl(dev_t devp, int cmd, intptr_t arg, int mode, cred_t *credp,
int *rvalp)
{
return (DDI_SUCCESS);
}