ds_impl.h revision a600f50d43405fe4fd9ab16cc92b28df19656392
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * See the License for the specific language governing permissions
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * and limitations under the License.
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 * CDDL HEADER END
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Use is subject to license terms.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoextern "C" {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The Domain Services Protocol
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 * Domain Services Header
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_hdr {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Fixed Message Types
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_INIT_ACK 0x1 /* initiation acknowledgement */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_INIT_NACK 0x2 /* initiation negative acknowledgment */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Fixed Initialization Messages
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_init_req {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_init_ack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t minor_vers; /* highest supported minor version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_init_nack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t major_vers; /* alternate supported major version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Message Types for Version 1.0
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_REG_ACK 0x4 /* register acknowledgement */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_UNREG_ACK 0x7 /* unregister acknowledgement */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* result codes */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_REG_VER_NACK 0x1 /* unsupported major version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_REG_DUP 0x2 /* duplicate registration attempted */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_TYPE_UNKNOWN 0x4 /* unknown message type received */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Service Register Messages
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_reg_req {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_reg_ack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle sent in register */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t minor_vers; /* highest supported minor version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_reg_nack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle sent in register */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t major_vers; /* alternate supported major version */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Service Unregister Messages
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_unreg_req {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle to unregister */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_unreg_ack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle sent in unregister */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_unreg_nack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle sent in unregister */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Data Transfer Messages
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_data_handle {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_data_nack {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t svc_handle; /* service handle sent in data msg */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Message Processing Utilities
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_MSG_LEN(ds_type) (sizeof (ds_hdr_t) + sizeof (ds_type))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Domain Service Port
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 * 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
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef enum {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_ldc {
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_DHDL_INVALID ((ds_domain_hdl_t)0xffffffff)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* port flags */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_PORT_MUTEX_INITED 0x1 /* mutexes inited? */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_port {
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen kmutex_t lock; /* port and service state lock */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint32_t ver_idx; /* index of version during handshake */
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 */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define IS_DS_PORT(port) 1 /* VBSC code compatability */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define PORTID(port) ((ulong_t)((port)->id))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * A DS portset is a bitmap that represents a collection of DS
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * ports. Each bit represent a particular port id. The current
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * implementation constrains the maximum number of ports to 64.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_PORT_IN_SET(set, port) ((set) & DS_PORT_SET(port))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_PORTSET_ADD(set, port) ((void)((set) |= DS_PORT_SET(port)))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_PORTSET_DEL(set, port) ((void)((set) &= ~DS_PORT_SET(port)))
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_PORTSET_SETNULL(set) ((void)((set) = 0))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_PORTSET_DUP(set1, set2) ((void)((set1) = (set2)))
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_PORTSET_NOT(set1, set2) ((void)((set1) = ~(set2)))
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_PORTSET_AND(set1, set2) ((void)((set1) &= (set2)))
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 Christensentypedef struct ds_event {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * LDC Information
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Machine Description Constants
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Services
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.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef enum {
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen DS_SVC_ACTIVE, /* register message acknowledged */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen DS_SVC_UNREG_PENDING /* unregister is pending */
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_PEND_UNREG 0x0040 /* pending unregister */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DSSF_ANYCB_VALID (DSSF_REGCB_VALID | DSSF_UNREGCB_VALID | \
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DSSF_USERFLAGS (DSSF_ISCLIENT | DSSF_ISUSER | DSSF_ANYCB_VALID)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_svc {
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen ds_svc_hdl_t svc_hdl; /* remote svc hdl if client svc */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ds_portset_t avail; /* ports available to this service */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen ds_portset_t tried; /* ports tried by this service */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen ds_cb_arg_t uarg; /* user arg for user callbacks */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensentypedef struct ds_svcs {
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen uint_t nsvcs; /* current number of items */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_SVC_ISFREE(svc) ((svc == NULL) || (svc->state == DS_SVC_FREE))
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#define DS_ALLOC_HDL(_idx, _count) (((uint64_t)_idx << DS_IDX_SHIFT) | \
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/* enable/disable taskq processing */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Message Logging
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.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct ds_log_entry {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo struct ds_log_entry *next; /* next in log or free list */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Log Limits:
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 * 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.
f4b91457e4645f95aea9187b6e2a9e39e61049a4rsmaeda#define DS_LOG_DEFAULT_SZ (4 * 1024 * 1024) /* 4 MB */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_LOG_ENTRY_SZ(ep) (sizeof (ds_log_entry_t) + (ep)->datasz)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * DS Log Memory Usage:
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 * 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#define DS_LOG_POOL_END (ds_log_entry_pool + DS_LOG_NPOOL)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define DS_IS_POOL_ENTRY(ep) (((ep) >= ds_log_entry_pool) && \
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* VBSC code compatability related defines */
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/* VBSC debug print needs newline, Solaris cmn_err doesn't */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * Results of checking version array with ds_vers_isvalid()
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensentypedef enum {
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/* 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 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/* initialization functions */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* message sending functions */
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_register(ds_svc_t *svc, void *arg);
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* service utilities */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensends_svc_t *ds_sys_find_svc_by_id_port(char *svc_id, ds_port_t *port,
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen/* port utilities */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenvoid ds_port_common_fini(ds_port_t *port, int is_fini);
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 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/* log functions */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensenint ds_log_add_msg(int32_t dest, uint8_t *msg, size_t sz);
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 Christensenint ds_hdl_lookup(char *service, uint_t is_client, ds_svc_hdl_t *hdlp,
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 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 Christensenint ds_remove_port(uint64_t portid, int is_fini);
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 * Error buffer size for ds_errno_to_str
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen * Debugging Features
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#define DS_DUMP_MSG(flags, buf, len) if (ds_debug & (flags)) \
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_BADHDL1 (ds_svc_hdl_t)(0xdeadbed1deadbed1ull)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#define DS_BADHDL2 (ds_svc_hdl_t)(0x2deadbed2deadbedull)
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#else /* DEBUG */
30588217a56ff2c9137248fb2e5065c4f0101459Mike Christensen#endif /* DEBUG */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif /* _DS_IMPL_H */