#ifndef _FMD_XPRT_H
#define _FMD_XPRT_H
#include <pthread.h>
#include <libnvpair.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <fmd_module.h>
#include <fmd_list.h>
struct fmd_eventq;
struct fmd_thread;
struct fmd_idspace;
struct fmd_log;
struct fmd_xprt_impl;
typedef void fmd_xprt_rule_f(struct fmd_xprt_impl *, nvlist_t *);
extern fmd_xprt_rule_f fmd_xprt_event_syn;
extern fmd_xprt_rule_f fmd_xprt_event_ack;
extern fmd_xprt_rule_f fmd_xprt_event_run;
extern fmd_xprt_rule_f fmd_xprt_event_sub;
extern fmd_xprt_rule_f fmd_xprt_event_unsub;
extern fmd_xprt_rule_f fmd_xprt_event_unsuback;
extern fmd_xprt_rule_f fmd_xprt_event_uuclose;
extern fmd_xprt_rule_f fmd_xprt_event_error;
extern fmd_xprt_rule_f fmd_xprt_event_drop;
extern fmd_xprt_rule_f fmd_xprt_event_uuresolved;
extern fmd_xprt_rule_f fmd_xprt_event_updated;
typedef struct fmd_xprt_rule {
const char *xr_class;
fmd_xprt_rule_f *xr_func;
} fmd_xprt_rule_t;
extern const fmd_xprt_rule_t _fmd_xprt_state_syn[];
extern const fmd_xprt_rule_t _fmd_xprt_state_ack[];
extern const fmd_xprt_rule_t _fmd_xprt_state_err[];
extern const fmd_xprt_rule_t _fmd_xprt_state_sub[];
extern const fmd_xprt_rule_t _fmd_xprt_state_run[];
typedef struct fmd_xprt_stat {
fmd_eventqstat_t xs_evqstat;
fmd_stat_t xs_module;
fmd_stat_t xs_authority;
fmd_stat_t xs_state;
fmd_stat_t xs_received;
fmd_stat_t xs_discarded;
fmd_stat_t xs_retried;
fmd_stat_t xs_replayed;
fmd_stat_t xs_lost;
fmd_stat_t xs_timeouts;
fmd_stat_t xs_subscriptions;
} fmd_xprt_stat_t;
typedef struct fmd_xprt_class {
char *xc_class;
uint_t xc_refs;
struct fmd_xprt_class *xc_next;
} fmd_xprt_class_t;
typedef struct fmd_xprt_class_hash {
fmd_eventq_t *xch_queue;
fmd_xprt_class_t **xch_hash;
uint_t xch_hashlen;
} fmd_xprt_class_hash_t;
typedef struct fmd_xprt_impl {
fmd_list_t xi_list;
uint_t xi_version;
uint_t xi_id;
struct fmd_eventq *xi_queue;
struct fmd_thread *xi_thread;
const fmd_xprt_rule_t *xi_state;
nvlist_t *xi_auth;
void *xi_data;
struct fmd_log *xi_log;
pthread_mutex_t xi_stats_lock;
fmd_xprt_stat_t *xi_stats;
pthread_mutex_t xi_lock;
pthread_cond_t xi_cv;
uint_t xi_flags;
uint_t xi_busy;
fmd_xprt_class_hash_t xi_lsub;
fmd_xprt_class_hash_t xi_rsub;
fmd_xprt_class_hash_t xi_usub;
} fmd_xprt_impl_t;
#define FMD_XPRT_RDONLY 0x1
#define FMD_XPRT_RDWR 0x3
#define FMD_XPRT_ACCEPT 0x4
#define FMD_XPRT_SUSPENDED 0x8
#define FMD_XPRT_SUBSCRIBER 0x10
#define FMD_XPRT_ISUSPENDED 0x20
#define FMD_XPRT_DSUSPENDED 0x40
#define FMD_XPRT_EXTERNAL 0x80
#define FMD_XPRT_NO_REMOTE_REPAIR 0x100
#define FMD_XPRT_CACHE_AS_LOCAL 0x200
#define FMD_XPRT_HCONLY 0x400
#define FMD_XPRT_HC_PRESENT_ONLY 0x800
#define FMD_XPRT_CMASK \
(FMD_XPRT_RDWR | FMD_XPRT_ACCEPT | FMD_XPRT_SUSPENDED | \
FMD_XPRT_EXTERNAL | FMD_XPRT_NO_REMOTE_REPAIR | \
FMD_XPRT_CACHE_AS_LOCAL | FMD_XPRT_HCONLY | FMD_XPRT_HC_PRESENT_ONLY)
#define FMD_XPRT_SMASK \
(FMD_XPRT_SUSPENDED | FMD_XPRT_ISUSPENDED | FMD_XPRT_DSUSPENDED)
extern fmd_xprt_t *fmd_xprt_create(fmd_module_t *, uint_t, nvlist_t *, void *);
extern void fmd_xprt_destroy(fmd_xprt_t *);
extern void fmd_xprt_xsuspend(fmd_xprt_t *, uint_t);
extern void fmd_xprt_xresume(fmd_xprt_t *, uint_t);
extern void fmd_xprt_send(fmd_xprt_t *);
extern void fmd_xprt_recv(fmd_xprt_t *, nvlist_t *, hrtime_t, boolean_t);
extern void fmd_xprt_uuclose(fmd_xprt_t *, const char *);
extern void fmd_xprt_uuresolved(fmd_xprt_t *, const char *);
extern void fmd_xprt_updated(fmd_xprt_t *, const char *, uint8_t *, uint8_t *,
uint_t);
extern void fmd_xprt_subscribe(fmd_xprt_t *, const char *);
extern void fmd_xprt_unsubscribe(fmd_xprt_t *, const char *);
extern void fmd_xprt_subscribe_all(const char *);
extern void fmd_xprt_unsubscribe_all(const char *);
extern void fmd_xprt_suspend_all(void);
extern void fmd_xprt_resume_all(void);
#ifdef __cplusplus
}
#endif
#endif