1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER START
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The contents of this file are subject to the terms of the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Common Development and Distribution License (the "License").
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You may not use this file except in compliance with the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * or http://www.opensolaris.org/os/licensing.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * See the License for the specific language governing permissions
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * and limitations under the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * When distributing Covered Code, include this CDDL HEADER in each
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * If applicable, add the following below this CDDL HEADER, with the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * fields enclosed by brackets "[]" replaced with your own identifying
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * information: Portions Copyright [yyyy] [name of copyright owner]
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER END
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Use is subject to license terms.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifndef _DS_IMPL_H
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define _DS_IMPL_H
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifdef __cplusplus
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoextern "C" {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen#include <sys/bitmap.h>
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen#include <sys/ldoms.h>
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The Domain Services Protocol
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The DS protocol is divided into two parts. The first is fixed and
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * must remain exactly the same for *all* versions of the DS protocol.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The only messages supported by the fixed portion of the protocol are
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * to negotiate a version to use for the rest of the protocol.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Domain Services Header
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_hdr {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint32_t msg_type; /* message type */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint32_t payload_len; /* payload length */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_hdr_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_HDR_SZ (sizeof (ds_hdr_t))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Fixed Message Types
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_INIT_REQ 0x0 /* initiate DS connection */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_INIT_ACK 0x1 /* initiation acknowledgement */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_INIT_NACK 0x2 /* initiation negative acknowledgment */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Fixed Initialization Messages
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_init_req {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t major_vers; /* requested major version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t minor_vers; /* requested minor version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_init_req_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_init_ack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t minor_vers; /* highest supported minor version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_init_ack_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_init_nack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t major_vers; /* alternate supported major version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_init_nack_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Message Types for Version 1.0
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_REG_REQ 0x3 /* register a service */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_REG_ACK 0x4 /* register acknowledgement */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_REG_NACK 0x5 /* register failed */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_UNREG 0x6 /* unregister a service */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_UNREG_ACK 0x7 /* unregister acknowledgement */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_UNREG_NACK 0x8 /* unregister failed */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_DATA 0x9 /* data message */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_NACK 0xa /* data error */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* result codes */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_OK 0x0 /* success */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_REG_VER_NACK 0x1 /* unsupported major version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_REG_DUP 0x2 /* duplicate registration attempted */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_INV_HDL 0x3 /* service handle not valid */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_TYPE_UNKNOWN 0x4 /* unknown message type received */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Service Register Messages
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_reg_req {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle to register */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t major_vers; /* requested major version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t minor_vers; /* requested minor version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char svc_id[1]; /* service identifier string */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_reg_req_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_reg_ack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle sent in register */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t minor_vers; /* highest supported minor version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_reg_ack_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_reg_nack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle sent in register */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t result; /* reason for the failure */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t major_vers; /* alternate supported major version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_reg_nack_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Service Unregister Messages
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_unreg_req {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle to unregister */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_unreg_req_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_unreg_ack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle sent in unregister */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_unreg_ack_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_unreg_nack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle sent in unregister */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_unreg_nack_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Data Transfer Messages
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_data_handle {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle for data */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_data_handle_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_data_nack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle sent in data msg */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t result; /* reason for failure */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_data_nack_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Message Processing Utilities
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_MSG_TYPE_VALID(type) ((type) <= DS_NACK)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_MSG_LEN(ds_type) (sizeof (ds_hdr_t) + sizeof (ds_type))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Domain Service Port
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * A DS port is a logical representation of an LDC dedicated to
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * communication between DS endpoints. The ds_port_t maintains state
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * associated with a connection to a remote endpoint. This includes
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * the state of the port, the LDC state, the current version of the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS protocol in use on the port, and other port properties.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Locking: The port is protected by a single mutex. It must be held
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * while the port structure is being accessed and also when data is
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * being read or written using the port
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef enum {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DS_PORT_FREE, /* port structure not in use */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DS_PORT_INIT, /* port structure created */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DS_PORT_LDC_INIT, /* ldc successfully initialized */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DS_PORT_INIT_REQ, /* initialization handshake sent */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DS_PORT_READY /* init handshake completed */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_port_state_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_ldc {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t id; /* LDC id */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ldc_handle_t hdl; /* LDC handle */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ldc_status_t state; /* current LDC state */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_ldc_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensentypedef uint64_t ds_domain_hdl_t;
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DHDL_INVALID ((ds_domain_hdl_t)0xffffffff)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* port flags */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_PORT_MUTEX_INITED 0x1 /* mutexes inited? */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_port {
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen uint32_t flags; /* port flags */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen kmutex_t lock; /* port and service state lock */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen kmutex_t tx_lock; /* tx port lock */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen kmutex_t rcv_lock; /* rcv port lock */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t id; /* port id from MD */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ds_port_state_t state; /* state of the port */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ds_ver_t ver; /* DS protocol version in use */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint32_t ver_idx; /* index of version during handshake */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ds_ldc_t ldc; /* LDC for this port */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen ds_domain_hdl_t domain_hdl; /* LDOMs domain hdl assoc. with port */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen char *domain_name; /* LDOMs domain name assoc. with port */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_port_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define IS_DS_PORT(port) 1 /* VBSC code compatability */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define PORTID(port) ((ulong_t)((port)->id))
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define PTR_TO_LONG(ptr) ((uint64_t)(ptr))
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * A DS portset is a bitmap that represents a collection of DS
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen * ports. Each bit represent a particular port id. We need
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen * to allocate for the max. number of domains supported,
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen * plus a small number (e.g. for the SP connection).
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen#define DS_EXTRA_PORTS 16
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen#define DS_MAX_PORTS (LDOMS_MAX_DOMAINS + DS_EXTRA_PORTS)
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen#define DS_PORTSET_SIZE BT_BITOUL(DS_MAX_PORTS)
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensentypedef ulong_t ds_portset_t[DS_PORTSET_SIZE];
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensenextern ds_portset_t ds_nullport;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
40c61268017ed628fcfb89162250c59130d14824Mike Christensen#define DS_PORTID_INVALID ((uint64_t)-1)
40c61268017ed628fcfb89162250c59130d14824Mike Christensen
40c61268017ed628fcfb89162250c59130d14824Mike Christensen/* DS SP Port ID */
40c61268017ed628fcfb89162250c59130d14824Mike Christensenextern uint64_t ds_sp_port_id;
40c61268017ed628fcfb89162250c59130d14824Mike Christensen
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_MAX_PORT_ID (DS_MAX_PORTS - 1)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen#define DS_PORT_IN_SET(set, port) BT_TEST((set), (port))
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen#define DS_PORTSET_ADD(set, port) BT_SET((set), (port))
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen#define DS_PORTSET_DEL(set, port) BT_CLEAR((set), (port))
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen#define DS_PORTSET_ISNULL(set) (memcmp((set), ds_nullport, \
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen sizeof (set)) == 0)
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen#define DS_PORTSET_SETNULL(set) ((void)memset((set), 0, sizeof (set)))
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen#define DS_PORTSET_DUP(set1, set2) ((void)memcpy((set1), (set2), \
3ef557bf6acbaf0905479800b87d010f8715a11eMike Christensen sizeof (set1)))
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/*
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * A DS event consists of a buffer on a port. We explictly use a link to
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * enequeue/dequeue on non-Solaris environments. On Solaris we use taskq.
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensentypedef struct ds_event {
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen ds_port_t *port;
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen char *buf;
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen size_t buflen;
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen} ds_event_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * LDC Information
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_STREAM_MTU 4096
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Machine Description Constants
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
3af08d828975d7e2581b6829e0eecff14d87a483lm#define DS_MD_ROOT_NAME "domain-services"
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_MD_PORT_NAME "domain-services-port"
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_MD_CHAN_NAME "channel-endpoint"
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Services
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * A DS Service is a mapping between a DS capability and a client
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * of the DS framework that provides that capability. It includes
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * information on the state of the service, the currently negotiated
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * version of the capability specific protocol, the port that is
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * currently in use by the capability, etc.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef enum {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DS_SVC_INVAL, /* svc structure uninitialized */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DS_SVC_FREE, /* svc structure not in use */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DS_SVC_INACTIVE, /* svc not registered */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DS_SVC_REG_PENDING, /* register message sent */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen DS_SVC_ACTIVE, /* register message acknowledged */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen DS_SVC_UNREG_PENDING /* unregister is pending */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_svc_state_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* ds_svc flags bits */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DSSF_ISCLIENT 0x0001 /* client service */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DSSF_ISUSER 0x0002 /* user land service */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DSSF_REGCB_VALID 0x0004 /* ops register callback is valid */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DSSF_UNREGCB_VALID 0x0008 /* ops unregister callback is valid */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DSSF_DATACB_VALID 0x0010 /* ops data callback is valid */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DSSF_LOOPBACK 0x0020 /* loopback */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DSSF_PEND_UNREG 0x0040 /* pending unregister */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DSSF_ANYCB_VALID (DSSF_REGCB_VALID | DSSF_UNREGCB_VALID | \
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen DSSF_DATACB_VALID)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DSSF_USERFLAGS (DSSF_ISCLIENT | DSSF_ISUSER | DSSF_ANYCB_VALID)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_svc {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ds_capability_t cap; /* capability information */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ds_clnt_ops_t ops; /* client ops vector */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ds_svc_hdl_t hdl; /* handle assigned by DS */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen ds_svc_hdl_t svc_hdl; /* remote svc hdl if client svc */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ds_svc_state_t state; /* current service state */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ds_ver_t ver; /* svc protocol version in use */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint_t ver_idx; /* index into client version array */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ds_port_t *port; /* port for this service */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ds_portset_t avail; /* ports available to this service */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen ds_portset_t tried; /* ports tried by this service */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen int fixed; /* is svc fixed to port */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen uint_t flags; /* service flags */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen ds_cb_arg_t uarg; /* user arg for user callbacks */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen uint_t drvi; /* driver instance */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen void *drv_psp; /* driver per svc ptr */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_svc_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensentypedef struct ds_svcs {
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen ds_svc_t **tbl; /* ptr to table */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen kmutex_t lock;
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen uint_t maxsvcs; /* size of the table */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen uint_t nsvcs; /* current number of items */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen} ds_svcs_t;
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_SVC_ISFREE(svc) ((svc == NULL) || (svc->state == DS_SVC_FREE))
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#ifndef DS_MAXSVCS_INIT
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_MAXSVCS_INIT 32
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * A service handle is a 64 bit value with three pieces of information
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * encoded in it. The upper 32 bits is the index into the table of
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * a particular service structure. Bit 31 indicates whether the handle
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * represents a service privider or service client. The lower 31 bits is
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * a counter that is incremented each time a service structure is reused.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_IDX_SHIFT 32
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_COUNT_MASK 0x7fffffffull
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_HDL_ISCLIENT_BIT 0x80000000ull
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_ALLOC_HDL(_idx, _count) (((uint64_t)_idx << DS_IDX_SHIFT) | \
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ((uint64_t)(_count + 1) & \
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DS_COUNT_MASK))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_HDL2IDX(hdl) (hdl >> DS_IDX_SHIFT)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_HDL2COUNT(hdl) (hdl & DS_COUNT_MASK)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_HDL_ISCLIENT(hdl) ((hdl) & DS_HDL_ISCLIENT_BIT)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_HDL_SET_ISCLIENT(hdl) ((hdl) |= DS_HDL_ISCLIENT_BIT)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_INVALID_INSTANCE (-1)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* enable/disable taskq processing */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenextern boolean_t ds_enabled;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Message Logging
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The DS framework logs all incoming and outgoing messages to a
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * ring buffer. This provides the ability to reconstruct a trace
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * of DS activity for use in debugging. In addition to the message
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * data, each log entry contains a timestamp and the destination
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * of the message. The destination is based on the port number the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * message passed through (port number + 1). The sign of the dest
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * field distinguishes incoming messages from outgoing messages.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Incoming messages have a negative destination field.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_log_entry {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo struct ds_log_entry *next; /* next in log or free list */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo struct ds_log_entry *prev; /* previous in log */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo time_t timestamp; /* time message added to log */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo size_t datasz; /* size of the data */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo void *data; /* the data itself */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo int32_t dest; /* message destination */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} ds_log_entry_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_LOG_IN(pid) (-(pid + 1))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_LOG_OUT(pid) (pid + 1)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Log Limits:
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The size of the log is controlled by two limits. The first is
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * a soft limit that is configurable by the user (via the global
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * variable ds_log_sz). When this limit is exceeded, each new
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * message that is added to the log replaces the oldest message.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The second is a hard limit that is calculated based on the soft
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * limit (DS_LOG_LIMIT). It is defined to be ~3% above the soft limit.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Once this limit is exceeded, a thread is scheduled to delete old
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * messages until the size of the log is below the soft limit.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
f4b91457e4645f95aea9187b6e2a9e39e61049a4rsmaeda#define DS_LOG_DEFAULT_SZ (4 * 1024 * 1024) /* 4 MB */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_LOG_LIMIT (ds_log_sz + (ds_log_sz >> 5))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_LOG_ENTRY_SZ(ep) (sizeof (ds_log_entry_t) + (ep)->datasz)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Log Memory Usage:
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The log free list is initialized from a pre-allocated pool of entry
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * structures (the global ds_log_entry_pool). The number of entries
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * in the pool (DS_LOG_NPOOL) is the number of entries that would
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * take up half the default size of the log.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * As messages are added to the log, entry structures are pulled from
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * the free list. If the free list is empty, memory is allocated for
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * the entry. When entries are removed from the log, they are placed
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * on the free list. Allocated memory is only deallocated when the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * entire log is destroyed.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_LOG_NPOOL ((DS_LOG_DEFAULT_SZ >> 1) / \
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo sizeof (ds_log_entry_t))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_LOG_POOL_END (ds_log_entry_pool + DS_LOG_NPOOL)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_IS_POOL_ENTRY(ep) (((ep) >= ds_log_entry_pool) && \
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ((ep) <= &(ds_log_entry_pool[DS_LOG_NPOOL])))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* VBSC code compatability related defines */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* VBSC malloc/free are similar to user malloc/free */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_MALLOC(size) kmem_zalloc(size, KM_SLEEP)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_FREE(ptr, size) kmem_free(ptr, size)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* VBSC debug print needs newline, Solaris cmn_err doesn't */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_EOL
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/*
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * Results of checking version array with ds_vers_isvalid()
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensentypedef enum {
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen DS_VERS_OK,
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen DS_VERS_INCREASING_MAJOR_ERR,
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen DS_VERS_INCREASING_MINOR_ERR
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen} ds_vers_check_t;
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* System specific interfaces */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenextern void ds_sys_port_init(ds_port_t *port);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenextern void ds_sys_port_fini(ds_port_t *port);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenextern void ds_sys_drain_events(ds_port_t *port);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenextern int ds_sys_dispatch_func(void (func)(void *), void *arg);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenextern void ds_sys_ldc_init(ds_port_t *port);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* vlds cb access to svc structure */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_cbarg_get_hdl(ds_cb_arg_t arg, ds_svc_hdl_t *hdlp);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_cbarg_get_flags(ds_cb_arg_t arg, uint32_t *flagsp);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_cbarg_get_drv_info(ds_cb_arg_t arg, int *drvip);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_cbarg_get_drv_per_svc_ptr(ds_cb_arg_t arg, void **dpspp);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_cbarg_get_domain(ds_cb_arg_t arg, ds_domain_hdl_t *dhdlp);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_cbarg_get_service_id(ds_cb_arg_t arg, char **servicep);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_cbarg_set_drv_per_svc_ptr(ds_cb_arg_t arg, void *dpsp);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_hdl_get_cbarg(ds_svc_hdl_t hdl, ds_cb_arg_t *cbargp);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_cbarg_set_cookie(ds_svc_t *svc);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_is_my_hdl(ds_svc_hdl_t hdl, int instance);
a600f50d43405fe4fd9ab16cc92b28df19656392Mike Christensenvoid ds_set_my_dom_hdl_name(ds_domain_hdl_t dhdl, char *name);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* initialization functions */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_common_init(void);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_ldc_fini(ds_port_t *port);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_init_svcs_tbl(uint_t nentries);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* message sending functions */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_send_init_req(ds_port_t *port);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_send_unreg_req(ds_svc_t *svc);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* walker functions */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensentypedef int (*svc_cb_t)(ds_svc_t *svc, void *arg);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_walk_svcs(svc_cb_t svc_cb, void *arg);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_svc_ismatch(ds_svc_t *svc, void *arg);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_svc_free(ds_svc_t *svc, void *arg);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_svc_register(ds_svc_t *svc, void *arg);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* service utilities */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensends_svc_t *ds_alloc_svc(void);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensends_svc_t *ds_sys_find_svc_by_id_port(char *svc_id, ds_port_t *port,
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen int is_client);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensends_svc_t *ds_get_svc(ds_svc_hdl_t hdl);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* port utilities */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_port_common_init(ds_port_t *port);
beba1dd881728e806abb8621851ae851da168a08Mike Christensenvoid ds_port_common_fini(ds_port_t *port);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* misc utilities */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensends_vers_check_t ds_vers_isvalid(ds_ver_t *vers, int nvers);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenchar *ds_errno_to_str(int ds_errno, char *ebuf);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenchar *ds_strdup(char *str);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenboolean_t negotiate_version(int num_versions, ds_ver_t *sup_versionsp,
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen uint16_t req_major, uint16_t *new_majorp, uint16_t *new_minorp);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* log functions */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_log_add_msg(int32_t dest, uint8_t *msg, size_t sz);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* vlds driver interfaces to ds module */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_ucap_init(ds_capability_t *cap, ds_clnt_ops_t *ops, uint_t flags,
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen int instance, ds_svc_hdl_t *hdlp);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_unreg_hdl(ds_svc_hdl_t hdl);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_hdl_lookup(char *service, uint_t is_client, ds_svc_hdl_t *hdlp,
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen uint_t maxhdls, uint_t *nhdlsp);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_service_lookup(ds_svc_hdl_t hdl, char **servicep, uint_t *is_client);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_domain_lookup(ds_svc_hdl_t hdl, ds_domain_hdl_t *dhdlp);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_hdl_isready(ds_svc_hdl_t hdl, uint_t *is_ready);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_unreg_all(int instance);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_dom_name_to_hdl(char *domain_name, ds_domain_hdl_t *dhdlp);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_dom_hdl_to_name(ds_domain_hdl_t dhdl, char **domain_namep);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_add_port(uint64_t port_id, uint64_t ldc_id, ds_domain_hdl_t dhdl,
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen char *dom_name, int verbose);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_remove_port(uint64_t portid, int is_fini);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* ds_ucap_init flags */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_UCAP_CLNT 0x0 /* Service is Client */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_UCAP_SVC 0x1 /* Service is Server */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/*
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * Error buffer size for ds_errno_to_str
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_EBUFSIZE 80
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/*
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * Debugging Features
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#ifdef DEBUG
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_BASIC 0x001
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_FLAG_LDC 0x002
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_FLAG_LOG 0x004
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_DUMP_LDC_MSG 0x008
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_FLAG_MD 0x010
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_FLAG_USR 0x020
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_FLAG_VLDS 0x040
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_FLAG_PRCL 0x080
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_FLAG_RCVQ 0x100
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_FLAG_LOOP 0x200
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG if (ds_debug & DS_DBG_BASIC) cmn_err
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_LDC if (ds_debug & DS_DBG_FLAG_LDC) cmn_err
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_LOG if (ds_debug & DS_DBG_FLAG_LOG) cmn_err
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_MD if (ds_debug & DS_DBG_FLAG_MD) cmn_err
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_USR if (ds_debug & DS_DBG_FLAG_USR) cmn_err
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_VLDS if (ds_debug & DS_DBG_FLAG_VLDS) cmn_err
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_PRCL if (ds_debug & DS_DBG_FLAG_PRCL) cmn_err
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_RCVQ if (ds_debug & DS_DBG_FLAG_RCVQ) cmn_err
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_LOOP if (ds_debug & DS_DBG_FLAG_LOOP) cmn_err
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DUMP_MSG(flags, buf, len) if (ds_debug & (flags)) \
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen ds_dump_msg(buf, len)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenextern uint_t ds_debug;
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_dump_msg(void *buf, size_t len);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_BADHDL1 (ds_svc_hdl_t)(0xdeadbed1deadbed1ull)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_BADHDL2 (ds_svc_hdl_t)(0x2deadbed2deadbedull)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#else /* DEBUG */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG if (0) cmn_err
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_LDC DS_DBG
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_LOG DS_DBG
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_MD DS_DBG
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_USR DS_DBG
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_VLDS DS_DBG
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_PRCL DS_DBG
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_RCVQ DS_DBG
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DBG_LOOP DS_DBG
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DUMP_MSG(flags, buf, len)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DUMP_LDC_MSG(buf, len)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_BADHDL1 NULL
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_BADHDL2 NULL
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#endif /* DEBUG */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifdef __cplusplus
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif /* _DS_IMPL_H */