4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
32 #include <libnvpair.h>
38 #include <fmd_module.h>
41 struct fmd_eventq
; /* see <fmd_eventq.h> */
42 struct fmd_thread
; /* see <fmd_thread.h> */
43 struct fmd_idspace
; /* see <fmd_idspace.h> */
44 struct fmd_log
; /* see <fmd_log.h> */
46 struct fmd_xprt_impl
; /* see below */
48 typedef void fmd_xprt_rule_f(struct fmd_xprt_impl
*, nvlist_t
*);
50 extern fmd_xprt_rule_f fmd_xprt_event_syn
;
51 extern fmd_xprt_rule_f fmd_xprt_event_ack
;
52 extern fmd_xprt_rule_f fmd_xprt_event_run
;
53 extern fmd_xprt_rule_f fmd_xprt_event_sub
;
54 extern fmd_xprt_rule_f fmd_xprt_event_unsub
;
55 extern fmd_xprt_rule_f fmd_xprt_event_unsuback
;
56 extern fmd_xprt_rule_f fmd_xprt_event_uuclose
;
57 extern fmd_xprt_rule_f fmd_xprt_event_error
;
58 extern fmd_xprt_rule_f fmd_xprt_event_drop
;
59 extern fmd_xprt_rule_f fmd_xprt_event_uuresolved
;
60 extern fmd_xprt_rule_f fmd_xprt_event_updated
;
62 typedef struct fmd_xprt_rule
{
63 const char *xr_class
; /* pattern to match */
64 fmd_xprt_rule_f
*xr_func
; /* action to invoke */
67 extern const fmd_xprt_rule_t _fmd_xprt_state_syn
[];
68 extern const fmd_xprt_rule_t _fmd_xprt_state_ack
[];
69 extern const fmd_xprt_rule_t _fmd_xprt_state_err
[];
70 extern const fmd_xprt_rule_t _fmd_xprt_state_sub
[];
71 extern const fmd_xprt_rule_t _fmd_xprt_state_run
[];
73 typedef struct fmd_xprt_stat
{
74 fmd_eventqstat_t xs_evqstat
; /* statistics for xprt event queue */
75 fmd_stat_t xs_module
; /* module name associated with xprt */
76 fmd_stat_t xs_authority
; /* authority associated with xprt */
77 fmd_stat_t xs_state
; /* state name associated with xprt */
78 fmd_stat_t xs_received
; /* number of events received by xprt */
79 fmd_stat_t xs_discarded
; /* number of events discarded by xprt */
80 fmd_stat_t xs_retried
; /* number of events retried by xprt */
81 fmd_stat_t xs_replayed
; /* number of events replayed by xprt */
82 fmd_stat_t xs_lost
; /* number of events lost by xprt */
83 fmd_stat_t xs_timeouts
; /* number of events recv'd with ttl=0 */
84 fmd_stat_t xs_subscriptions
; /* number of active subscriptions */
87 typedef struct fmd_xprt_class
{
88 char *xc_class
; /* class string for subscription */
89 uint_t xc_refs
; /* reference count for subscription */
90 struct fmd_xprt_class
*xc_next
; /* next class on xi_subhash chain */
93 typedef struct fmd_xprt_class_hash
{
94 fmd_eventq_t
*xch_queue
; /* associated event queue (or NULL) */
95 fmd_xprt_class_t
**xch_hash
; /* subscription hash bucket array */
96 uint_t xch_hashlen
; /* size of xch_hash bucket array */
97 } fmd_xprt_class_hash_t
;
99 typedef struct fmd_xprt_impl
{
100 fmd_list_t xi_list
; /* linked list next/prev pointers */
101 uint_t xi_version
; /* transport protocol version */
102 uint_t xi_id
; /* transport identifier */
103 struct fmd_eventq
*xi_queue
; /* event queue for outbound events */
104 struct fmd_thread
*xi_thread
; /* thread associated with transport */
105 const fmd_xprt_rule_t
*xi_state
; /* rules for the current state */
106 nvlist_t
*xi_auth
; /* authority for peer endpoint */
107 void *xi_data
; /* data for xprt_get/setspecific */
108 struct fmd_log
*xi_log
; /* log for received events (optional) */
109 pthread_mutex_t xi_stats_lock
; /* lock protecting xi_stats data */
110 fmd_xprt_stat_t
*xi_stats
; /* built-in per-transport statistics */
111 pthread_mutex_t xi_lock
; /* lock for modifying members below */
112 pthread_cond_t xi_cv
; /* condition variable for xi_flags */
113 uint_t xi_flags
; /* flags (see below) */
114 uint_t xi_busy
; /* active threads in xprt_recv() */
115 fmd_xprt_class_hash_t xi_lsub
; /* subscriptions in local dispq */
116 fmd_xprt_class_hash_t xi_rsub
; /* subscriptions in remote peer */
117 fmd_xprt_class_hash_t xi_usub
; /* pending remote unsubscriptions */
121 * Flags for fmd_xprt_create() and xi_flags. NOTE: Any public API flags must
122 * exactly match the corresponding definitions in <fmd_api.h>.
124 #define FMD_XPRT_RDONLY 0x1 /* xprt is read-only */
125 #define FMD_XPRT_RDWR 0x3 /* xprt is read-write */
126 #define FMD_XPRT_ACCEPT 0x4 /* xprt is accepting connection */
127 #define FMD_XPRT_SUSPENDED 0x8 /* xprt is suspended by user */
128 #define FMD_XPRT_SUBSCRIBER 0x10 /* xprt is actively subscribing */
129 #define FMD_XPRT_ISUSPENDED 0x20 /* xprt is waiting for _fmd_init */
130 #define FMD_XPRT_DSUSPENDED 0x40 /* xprt is suspended by fmd mechanism */
131 #define FMD_XPRT_EXTERNAL 0x80 /* xprt is external to a chassis */
132 #define FMD_XPRT_NO_REMOTE_REPAIR 0x100 /* xprt allows remote repair */
133 #define FMD_XPRT_CACHE_AS_LOCAL 0x200 /* xprt caches fault as if local */
134 #define FMD_XPRT_HCONLY 0x400 /* xprt only proxies hc-scheme faults */
135 #define FMD_XPRT_HC_PRESENT_ONLY 0x800 /* only locally present hc faults */
137 #define FMD_XPRT_CMASK /* xprt create flag mask */ \
138 (FMD_XPRT_RDWR | FMD_XPRT_ACCEPT | FMD_XPRT_SUSPENDED | \
139 FMD_XPRT_EXTERNAL | FMD_XPRT_NO_REMOTE_REPAIR | \
140 FMD_XPRT_CACHE_AS_LOCAL | FMD_XPRT_HCONLY | FMD_XPRT_HC_PRESENT_ONLY)
141 #define FMD_XPRT_SMASK \
142 (FMD_XPRT_SUSPENDED | FMD_XPRT_ISUSPENDED | FMD_XPRT_DSUSPENDED)
144 extern fmd_xprt_t
*fmd_xprt_create(fmd_module_t
*, uint_t
, nvlist_t
*, void *);
145 extern void fmd_xprt_destroy(fmd_xprt_t
*);
146 extern void fmd_xprt_xsuspend(fmd_xprt_t
*, uint_t
);
147 extern void fmd_xprt_xresume(fmd_xprt_t
*, uint_t
);
148 extern void fmd_xprt_send(fmd_xprt_t
*);
149 extern void fmd_xprt_recv(fmd_xprt_t
*, nvlist_t
*, hrtime_t
, boolean_t
);
150 extern void fmd_xprt_uuclose(fmd_xprt_t
*, const char *);
151 extern void fmd_xprt_uuresolved(fmd_xprt_t
*, const char *);
152 extern void fmd_xprt_updated(fmd_xprt_t
*, const char *, uint8_t *, uint8_t *,
155 extern void fmd_xprt_subscribe(fmd_xprt_t
*, const char *);
156 extern void fmd_xprt_unsubscribe(fmd_xprt_t
*, const char *);
157 extern void fmd_xprt_subscribe_all(const char *);
158 extern void fmd_xprt_unsubscribe_all(const char *);
159 extern void fmd_xprt_suspend_all(void);
160 extern void fmd_xprt_resume_all(void);
166 #endif /* _FMD_XPRT_H */