fmd_xprt.h revision d9638e547d8811f2c689977f8dd2a353938b61fd
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross/*
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * CDDL HEADER START
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross *
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * The contents of this file are subject to the terms of the
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * Common Development and Distribution License, Version 1.0 only
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * (the "License"). You may not use this file except in compliance
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * with the License.
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross *
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * or http://www.opensolaris.org/os/licensing.
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * See the License for the specific language governing permissions
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * and limitations under the License.
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross *
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * When distributing Covered Code, include this CDDL HEADER in each
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * If applicable, add the following below this CDDL HEADER, with the
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * fields enclosed by brackets "[]" replaced with your own identifying
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * information: Portions Copyright [yyyy] [name of copyright owner]
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross *
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * CDDL HEADER END
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross/*
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * Use is subject to license terms.
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#ifndef _FMD_XPRT_H
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#define _FMD_XPRT_H
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#pragma ident "%Z%%M% %I% %E% SMI"
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#include <pthread.h>
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#include <libnvpair.h>
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#ifdef __cplusplus
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern "C" {
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#endif
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#include <fmd_module.h>
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#include <fmd_list.h>
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossstruct fmd_eventq; /* see <fmd_eventq.h> */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossstruct fmd_thread; /* see <fmd_thread.h> */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossstruct fmd_idspace; /* see <fmd_idspace.h> */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossstruct fmd_log; /* see <fmd_log.h> */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossstruct fmd_xprt_impl; /* see below */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rosstypedef void fmd_xprt_rule_f(struct fmd_xprt_impl *, nvlist_t *);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern fmd_xprt_rule_f fmd_xprt_event_syn;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern fmd_xprt_rule_f fmd_xprt_event_ack;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern fmd_xprt_rule_f fmd_xprt_event_run;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern fmd_xprt_rule_f fmd_xprt_event_sub;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern fmd_xprt_rule_f fmd_xprt_event_unsub;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern fmd_xprt_rule_f fmd_xprt_event_unsuback;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern fmd_xprt_rule_f fmd_xprt_event_uuclose;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern fmd_xprt_rule_f fmd_xprt_event_error;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern fmd_xprt_rule_f fmd_xprt_event_drop;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rosstypedef struct fmd_xprt_rule {
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross const char *xr_class; /* pattern to match */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_xprt_rule_f *xr_func; /* action to invoke */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross} fmd_xprt_rule_t;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern const fmd_xprt_rule_t _fmd_xprt_state_syn[];
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern const fmd_xprt_rule_t _fmd_xprt_state_ack[];
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern const fmd_xprt_rule_t _fmd_xprt_state_err[];
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern const fmd_xprt_rule_t _fmd_xprt_state_sub[];
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern const fmd_xprt_rule_t _fmd_xprt_state_run[];
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rosstypedef struct fmd_xprt_stat {
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_eventqstat_t xs_evqstat; /* statistics for xprt event queue */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_stat_t xs_module; /* module name associated with xprt */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_stat_t xs_authority; /* authority associated with xprt */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_stat_t xs_state; /* state name associated with xprt */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_stat_t xs_received; /* number of events received by xprt */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_stat_t xs_discarded; /* number of events discarded by xprt */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_stat_t xs_retried; /* number of events retried by xprt */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_stat_t xs_replayed; /* number of events replayed by xprt */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_stat_t xs_lost; /* number of events lost by xprt */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_stat_t xs_timeouts; /* number of events recv'd with ttl=0 */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_stat_t xs_subscriptions; /* number of active subscriptions */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross} fmd_xprt_stat_t;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rosstypedef struct fmd_xprt_class {
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross char *xc_class; /* class string for subscription */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross uint_t xc_refs; /* reference count for subscription */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross struct fmd_xprt_class *xc_next; /* next class on xi_subhash chain */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross} fmd_xprt_class_t;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rosstypedef struct fmd_xprt_class_hash {
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_eventq_t *xch_queue; /* associated event queue (or NULL) */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_xprt_class_t **xch_hash; /* subscription hash bucket array */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross uint_t xch_hashlen; /* size of xch_hash bucket array */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross} fmd_xprt_class_hash_t;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rosstypedef struct fmd_xprt_impl {
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_list_t xi_list; /* linked list next/prev pointers */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross uint_t xi_version; /* transport protocol version */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross uint_t xi_id; /* transport identifier */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross struct fmd_eventq *xi_queue; /* event queue for outbound events */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross struct fmd_thread *xi_thread; /* thread associated with transport */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross const fmd_xprt_rule_t *xi_state; /* rules for the current state */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross nvlist_t *xi_auth; /* authority for peer endpoint */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross void *xi_data; /* data for xprt_get/setspecific */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross struct fmd_log *xi_log; /* log for received events (optional) */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross pthread_mutex_t xi_stats_lock; /* lock protecting xi_stats data */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_xprt_stat_t *xi_stats; /* built-in per-transport statistics */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross pthread_mutex_t xi_lock; /* lock for modifying members below */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross pthread_cond_t xi_cv; /* condition variable for xi_flags */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross uint_t xi_flags; /* flags (see below) */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross uint_t xi_busy; /* active threads in xprt_recv() */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_xprt_class_hash_t xi_lsub; /* subscriptions in local dispq */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_xprt_class_hash_t xi_rsub; /* subscriptions in remote peer */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross fmd_xprt_class_hash_t xi_usub; /* pending remote unsubscriptions */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross} fmd_xprt_impl_t;
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross/*
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * Flags for fmd_xprt_create() and xi_flags. NOTE: Any public API flags must
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross * exactly match the corresponding definitions in <fmd_api.h>.
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#define FMD_XPRT_RDONLY 0x1 /* xprt is read-only */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#define FMD_XPRT_RDWR 0x3 /* xprt is read-write */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#define FMD_XPRT_ACCEPT 0x4 /* xprt is accepting connection */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#define FMD_XPRT_SUSPENDED 0x8 /* xprt is suspended by user */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#define FMD_XPRT_CMASK 0xF /* xprt create flag mask */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#define FMD_XPRT_SUBSCRIBER 0x10 /* xprt is actively subscribing */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#define FMD_XPRT_ISUSPENDED 0x20 /* xprt is waiting for _fmd_init */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#define FMD_XPRT_DSUSPENDED 0x40 /* xprt is suspended by fmd mechanism */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#define FMD_XPRT_SMASK \
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross (FMD_XPRT_SUSPENDED | FMD_XPRT_ISUSPENDED | FMD_XPRT_DSUSPENDED)
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern fmd_xprt_t *fmd_xprt_create(fmd_module_t *, uint_t, nvlist_t *, void *);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_destroy(fmd_xprt_t *);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_xsuspend(fmd_xprt_t *, uint_t);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_xresume(fmd_xprt_t *, uint_t);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_send(fmd_xprt_t *);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_recv(fmd_xprt_t *, nvlist_t *, hrtime_t);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_uuclose(fmd_xprt_t *, const char *);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_subscribe(fmd_xprt_t *, const char *);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_unsubscribe(fmd_xprt_t *, const char *);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_subscribe_all(const char *);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_unsubscribe_all(const char *);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_suspend_all(void);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Rossextern void fmd_xprt_resume_all(void);
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#ifdef __cplusplus
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross}
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#endif
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross#endif /* _FMD_XPRT_H */
a547be5daca7e465ca82df6d179f6b1f8e0cda72Gordon Ross