#ifndef _SYS_OVERLAY_IMPL_H
#define _SYS_OVERLAY_IMPL_H
#include <sys/overlay.h>
#include <sys/overlay_common.h>
#include <sys/overlay_plugin.h>
#include <sys/overlay_target.h>
#include <sys/ksynch.h>
#include <sys/list.h>
#include <sys/avl.h>
#include <sys/ksocket.h>
#include <sys/socket.h>
#include <sys/refhash.h>
#include <sys/ethernet.h>
#include <sys/list.h>
#ifdef __cplusplus
extern "C" {
#endif
#define OVEP_VERSION_ONE 0x1
typedef struct overlay_plugin {
kmutex_t ovp_mutex;
list_node_t ovp_link;
uint_t ovp_active;
const char *ovp_name;
const overlay_plugin_ops_t *ovp_ops;
const char *const *ovp_props;
uint_t ovp_nprops;
uint_t ovp_id_size;
overlay_plugin_flags_t ovp_flags;
overlay_plugin_dest_t ovp_dest;
} overlay_plugin_t;
typedef struct overlay_mux {
list_node_t omux_lnode;
ksocket_t omux_ksock;
overlay_plugin_t *omux_plugin;
int omux_domain;
int omux_family;
int omux_protocol;
struct sockaddr *omux_addr;
socklen_t omux_alen;
kmutex_t omux_lock;
uint_t omux_count;
avl_tree_t omux_devices;
} overlay_mux_t;
typedef enum overlay_target_flag {
OVERLAY_T_TEARDOWN = 0x1
} overlay_target_flag_t;
typedef struct overlay_target {
kmutex_t ott_lock;
kcondvar_t ott_cond;
overlay_target_mode_t ott_mode;
overlay_plugin_dest_t ott_dest;
uint64_t ott_id;
overlay_target_flag_t ott_flags;
uint_t ott_ocount;
union {
overlay_target_point_t ott_point;
struct overlay_target_dyn {
refhash_t *ott_dhash;
avl_tree_t ott_tree;
} ott_dyn;
} ott_u;
} overlay_target_t;
typedef enum overlay_dev_flag {
OVERLAY_F_ACTIVATED = 0x01,
OVERLAY_F_IN_MUX = 0x02,
OVERLAY_F_IN_TX = 0x04,
OVERLAY_F_IN_RX = 0x08,
OVERLAY_F_IOMASK = 0x0c,
OVERLAY_F_MDDROP = 0x10,
OVERLAY_F_STOPMASK = 0x1e,
OVERLAY_F_VARPD = 0x20,
OVERLAY_F_DEGRADED = 0x40,
OVERLAY_F_MASK = 0x7f
} overlay_dev_flag_t;
typedef struct overlay_dev {
kmutex_t odd_lock;
kcondvar_t odd_iowait;
list_node_t odd_link;
mac_handle_t odd_mh;
overlay_plugin_t *odd_plugin;
datalink_id_t odd_linkid;
void *odd_pvoid;
uint_t odd_ref;
uint_t odd_mtu;
overlay_dev_flag_t odd_flags;
uint_t odd_rxcount;
uint_t odd_txcount;
overlay_mux_t *odd_mux;
uint64_t odd_vid;
avl_node_t odd_muxnode;
overlay_target_t *odd_target;
char odd_fmamsg[OVERLAY_STATUS_BUFLEN];
} overlay_dev_t;
typedef enum overlay_target_entry_flags {
OVERLAY_ENTRY_F_PENDING = 0x01,
OVERLAY_ENTRY_F_VALID = 0x02,
OVERLAY_ENTRY_F_DROP = 0x04,
OVERLAY_ENTRY_F_VALID_MASK = 0x06
} overlay_target_entry_flags_t;
typedef struct overlay_target_entry {
kmutex_t ote_lock;
refhash_link_t ote_reflink;
avl_node_t ote_avllink;
list_node_t ote_qlink;
overlay_target_entry_flags_t ote_flags;
uint8_t ote_addr[ETHERADDRL];
overlay_target_t *ote_ott;
overlay_dev_t *ote_odd;
overlay_target_point_t ote_dest;
mblk_t *ote_chead;
mblk_t *ote_ctail;
size_t ote_mbsize;
hrtime_t ote_vtime;
} overlay_target_entry_t;
#define OVERLAY_CTL "overlay"
#define OVERLAY_FREEMSG(mp, reason) \
DTRACE_PROBE2(overlay__freemsg, mblk_t *, mp, char *, reason)
extern dev_info_t *overlay_dip;
extern mblk_t *overlay_m_tx(void *, mblk_t *);
typedef int (*overlay_dev_iter_f)(overlay_dev_t *, void *);
extern void overlay_dev_iter(overlay_dev_iter_f, void *);
extern void overlay_plugin_init(void);
extern overlay_plugin_t *overlay_plugin_lookup(const char *);
extern void overlay_plugin_rele(overlay_plugin_t *);
extern void overlay_plugin_fini(void);
typedef int (*overlay_plugin_walk_f)(overlay_plugin_t *, void *);
extern void overlay_plugin_walk(overlay_plugin_walk_f, void *);
extern void overlay_io_start(overlay_dev_t *, overlay_dev_flag_t);
extern void overlay_io_done(overlay_dev_t *, overlay_dev_flag_t);
extern void overlay_mux_init(void);
extern void overlay_mux_fini(void);
extern overlay_mux_t *overlay_mux_open(overlay_plugin_t *, int, int, int,
struct sockaddr *, socklen_t, int *);
extern void overlay_mux_close(overlay_mux_t *);
extern void overlay_mux_add_dev(overlay_mux_t *, overlay_dev_t *);
extern void overlay_mux_remove_dev(overlay_mux_t *, overlay_dev_t *);
extern int overlay_mux_tx(overlay_mux_t *, struct msghdr *, mblk_t *);
extern void overlay_prop_init(overlay_prop_handle_t);
extern void overlay_target_init(void);
extern int overlay_target_busy(void);
extern int overlay_target_open(dev_t *, int, int, cred_t *);
extern int overlay_target_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
extern int overlay_target_close(dev_t, int, int, cred_t *);
extern void overlay_target_free(overlay_dev_t *);
#define OVERLAY_TARGET_OK 0
#define OVERLAY_TARGET_DROP 1
#define OVERLAY_TARGET_ASYNC 2
extern int overlay_target_lookup(overlay_dev_t *, mblk_t *, struct sockaddr *,
socklen_t *);
extern void overlay_target_quiesce(overlay_target_t *);
extern void overlay_target_fini(void);
extern void overlay_fm_init(void);
extern void overlay_fm_fini(void);
extern void overlay_fm_degrade(overlay_dev_t *, const char *);
extern void overlay_fm_restore(overlay_dev_t *);
extern overlay_dev_t *overlay_hold_by_dlid(datalink_id_t);
extern void overlay_hold_rele(overlay_dev_t *);
#ifdef __cplusplus
}
#endif
#endif