xref: /illumos-gate/usr/src/lib/varpd/libvarpd/common/libvarpd_impl.h (revision 36589d6bb0cdae89e166b57b0d64ae56d53247d9)
1*36589d6bSRobert Mustacchi /*
2*36589d6bSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*36589d6bSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*36589d6bSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*36589d6bSRobert Mustacchi  * 1.0 of the CDDL.
6*36589d6bSRobert Mustacchi  *
7*36589d6bSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*36589d6bSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*36589d6bSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*36589d6bSRobert Mustacchi  */
11*36589d6bSRobert Mustacchi 
12*36589d6bSRobert Mustacchi /*
13*36589d6bSRobert Mustacchi  * Copyright 2015 Joyent, Inc.
14*36589d6bSRobert Mustacchi  */
15*36589d6bSRobert Mustacchi 
16*36589d6bSRobert Mustacchi #ifndef _LIBVARPD_IMPL_H
17*36589d6bSRobert Mustacchi #define	_LIBVARPD_IMPL_H
18*36589d6bSRobert Mustacchi 
19*36589d6bSRobert Mustacchi /*
20*36589d6bSRobert Mustacchi  * varpd internal interfaces
21*36589d6bSRobert Mustacchi  */
22*36589d6bSRobert Mustacchi 
23*36589d6bSRobert Mustacchi #include <libvarpd.h>
24*36589d6bSRobert Mustacchi #include <libvarpd_provider.h>
25*36589d6bSRobert Mustacchi #include <sys/avl.h>
26*36589d6bSRobert Mustacchi #include <thread.h>
27*36589d6bSRobert Mustacchi #include <synch.h>
28*36589d6bSRobert Mustacchi #include <limits.h>
29*36589d6bSRobert Mustacchi #include <libidspace.h>
30*36589d6bSRobert Mustacchi #include <umem.h>
31*36589d6bSRobert Mustacchi 
32*36589d6bSRobert Mustacchi #ifdef __cplusplus
33*36589d6bSRobert Mustacchi extern "C" {
34*36589d6bSRobert Mustacchi #endif
35*36589d6bSRobert Mustacchi 
36*36589d6bSRobert Mustacchi #define	LIBVARPD_ID_MIN	1
37*36589d6bSRobert Mustacchi #define	LIBVARPD_ID_MAX	INT32_MAX
38*36589d6bSRobert Mustacchi 
39*36589d6bSRobert Mustacchi typedef struct varpd_plugin {
40*36589d6bSRobert Mustacchi 	avl_node_t		vpp_node;
41*36589d6bSRobert Mustacchi 	const char		*vpp_name;
42*36589d6bSRobert Mustacchi 	overlay_target_mode_t	vpp_mode;
43*36589d6bSRobert Mustacchi 	const varpd_plugin_ops_t *vpp_ops;
44*36589d6bSRobert Mustacchi 	mutex_t			vpp_lock;
45*36589d6bSRobert Mustacchi 	uint_t			vpp_active;
46*36589d6bSRobert Mustacchi } varpd_plugin_t;
47*36589d6bSRobert Mustacchi 
48*36589d6bSRobert Mustacchi typedef struct varpd_impl {
49*36589d6bSRobert Mustacchi 	mutex_t		vdi_lock;
50*36589d6bSRobert Mustacchi 	rwlock_t	vdi_pfdlock;
51*36589d6bSRobert Mustacchi 	avl_tree_t	vdi_plugins;	/* vdi_lock */
52*36589d6bSRobert Mustacchi 	avl_tree_t	vdi_instances;	/* vdi_lock */
53*36589d6bSRobert Mustacchi 	avl_tree_t	vdi_linstances;	/* vdi_lock */
54*36589d6bSRobert Mustacchi 	id_space_t	*vdi_idspace;	/* RO */
55*36589d6bSRobert Mustacchi 	umem_cache_t	*vdi_qcache;	/* RO */
56*36589d6bSRobert Mustacchi 	int		vdi_overlayfd;	/* RO */
57*36589d6bSRobert Mustacchi 	int		vdi_doorfd;	/* vdi_lock */
58*36589d6bSRobert Mustacchi 	int		vdi_persistfd;	/* vdi_plock */
59*36589d6bSRobert Mustacchi 	cond_t		vdi_lthr_cv;	/* vdi_lock */
60*36589d6bSRobert Mustacchi 	boolean_t	vdi_lthr_quiesce;	/* vdi_lock */
61*36589d6bSRobert Mustacchi 	uint_t		vdi_lthr_count;	/* vdi_lock */
62*36589d6bSRobert Mustacchi } varpd_impl_t;
63*36589d6bSRobert Mustacchi 
64*36589d6bSRobert Mustacchi typedef enum varpd_instance_flags {
65*36589d6bSRobert Mustacchi 	VARPD_INSTANCE_F_ACTIVATED = 0x01
66*36589d6bSRobert Mustacchi } varpd_instance_flags_t;
67*36589d6bSRobert Mustacchi 
68*36589d6bSRobert Mustacchi typedef struct varpd_instance {
69*36589d6bSRobert Mustacchi 	avl_node_t	vri_inode;
70*36589d6bSRobert Mustacchi 	avl_node_t	vri_lnode;
71*36589d6bSRobert Mustacchi 	uint64_t	vri_id;			/* RO */
72*36589d6bSRobert Mustacchi 	uint64_t	vri_vnetid;		/* RO */
73*36589d6bSRobert Mustacchi 	datalink_id_t	vri_linkid;		/* RO */
74*36589d6bSRobert Mustacchi 	overlay_target_mode_t vri_mode;		/* RO */
75*36589d6bSRobert Mustacchi 	overlay_plugin_dest_t vri_dest;		/* RO */
76*36589d6bSRobert Mustacchi 	varpd_impl_t	*vri_impl;		/* RO */
77*36589d6bSRobert Mustacchi 	varpd_plugin_t	*vri_plugin;		/* RO */
78*36589d6bSRobert Mustacchi 	void		*vri_private;		/* RO */
79*36589d6bSRobert Mustacchi 	mutex_t		vri_lock;
80*36589d6bSRobert Mustacchi 	varpd_instance_flags_t vri_flags;	/* vri_lock */
81*36589d6bSRobert Mustacchi } varpd_instance_t;
82*36589d6bSRobert Mustacchi 
83*36589d6bSRobert Mustacchi typedef struct varpd_query {
84*36589d6bSRobert Mustacchi 	overlay_targ_lookup_t	vq_lookup;
85*36589d6bSRobert Mustacchi 	overlay_targ_resp_t	vq_response;
86*36589d6bSRobert Mustacchi 	varpd_instance_t	*vq_instance;
87*36589d6bSRobert Mustacchi } varpd_query_t;
88*36589d6bSRobert Mustacchi 
89*36589d6bSRobert Mustacchi typedef struct varpd_client_create_arg {
90*36589d6bSRobert Mustacchi 	datalink_id_t	vcca_linkid;
91*36589d6bSRobert Mustacchi 	uint64_t	vcca_id;
92*36589d6bSRobert Mustacchi 	char		vcca_plugin[LIBVARPD_PROP_NAMELEN];
93*36589d6bSRobert Mustacchi } varpd_client_create_arg_t;
94*36589d6bSRobert Mustacchi 
95*36589d6bSRobert Mustacchi typedef struct varpd_client_instance_arg {
96*36589d6bSRobert Mustacchi 	uint64_t	vcia_id;
97*36589d6bSRobert Mustacchi } varpd_client_instance_arg_t;
98*36589d6bSRobert Mustacchi 
99*36589d6bSRobert Mustacchi typedef struct varpd_client_nprops_arg {
100*36589d6bSRobert Mustacchi 	uint64_t	vcna_id;
101*36589d6bSRobert Mustacchi 	uint_t		vcna_nprops;
102*36589d6bSRobert Mustacchi 	uint8_t		vcna_pad[4];
103*36589d6bSRobert Mustacchi } varpd_client_nprops_arg_t;
104*36589d6bSRobert Mustacchi 
105*36589d6bSRobert Mustacchi typedef struct varpd_client_propinfo_arg {
106*36589d6bSRobert Mustacchi 	uint64_t	vcfa_id;
107*36589d6bSRobert Mustacchi 	uint_t		vcfa_propid;
108*36589d6bSRobert Mustacchi 	uint_t		vcfa_type;
109*36589d6bSRobert Mustacchi 	uint_t		vcfa_prot;
110*36589d6bSRobert Mustacchi 	uint32_t	vcfa_defsize;
111*36589d6bSRobert Mustacchi 	uint32_t	vcfa_psize;
112*36589d6bSRobert Mustacchi 	uint8_t		vcfa_pad[4];
113*36589d6bSRobert Mustacchi 	char		vcfa_name[LIBVARPD_PROP_NAMELEN];
114*36589d6bSRobert Mustacchi 	uint8_t		vcfa_default[LIBVARPD_PROP_SIZEMAX];
115*36589d6bSRobert Mustacchi 	uint8_t		vcfa_poss[LIBVARPD_PROP_SIZEMAX];
116*36589d6bSRobert Mustacchi } varpd_client_propinfo_arg_t;
117*36589d6bSRobert Mustacchi 
118*36589d6bSRobert Mustacchi typedef struct varpd_client_prop_arg {
119*36589d6bSRobert Mustacchi 	uint64_t	vcpa_id;
120*36589d6bSRobert Mustacchi 	uint_t		vcpa_propid;
121*36589d6bSRobert Mustacchi 	uint8_t		vcpa_buf[LIBVARPD_PROP_SIZEMAX];
122*36589d6bSRobert Mustacchi 	size_t		vcpa_bufsize;
123*36589d6bSRobert Mustacchi } varpd_client_prop_arg_t;
124*36589d6bSRobert Mustacchi 
125*36589d6bSRobert Mustacchi typedef struct varpd_client_lookup_arg {
126*36589d6bSRobert Mustacchi 	datalink_id_t	vcla_linkid;
127*36589d6bSRobert Mustacchi 	uint32_t	vcla_pad;
128*36589d6bSRobert Mustacchi 	uint64_t	vcla_id;
129*36589d6bSRobert Mustacchi } varpd_client_lookup_arg_t;
130*36589d6bSRobert Mustacchi 
131*36589d6bSRobert Mustacchi typedef struct varpd_client_target_mode_arg {
132*36589d6bSRobert Mustacchi 	uint64_t	vtma_id;
133*36589d6bSRobert Mustacchi 	uint32_t	vtma_dest;
134*36589d6bSRobert Mustacchi 	uint32_t	vtma_mode;
135*36589d6bSRobert Mustacchi } varpd_client_target_mode_arg_t;
136*36589d6bSRobert Mustacchi 
137*36589d6bSRobert Mustacchi typedef struct varpd_client_target_cache_arg {
138*36589d6bSRobert Mustacchi 	uint64_t	vtca_id;
139*36589d6bSRobert Mustacchi 	uint8_t		vtca_key[ETHERADDRL];
140*36589d6bSRobert Mustacchi 	uint8_t		vtca_pad[2];
141*36589d6bSRobert Mustacchi 	varpd_client_cache_entry_t vtca_entry;
142*36589d6bSRobert Mustacchi } varpd_client_target_cache_arg_t;
143*36589d6bSRobert Mustacchi 
144*36589d6bSRobert Mustacchi typedef struct varpd_client_target_walk_arg {
145*36589d6bSRobert Mustacchi 	uint64_t	vtcw_id;
146*36589d6bSRobert Mustacchi 	uint64_t	vtcw_marker;
147*36589d6bSRobert Mustacchi 	uint64_t	vtcw_count;
148*36589d6bSRobert Mustacchi 	overlay_targ_cache_entry_t vtcw_ents[];
149*36589d6bSRobert Mustacchi } varpd_client_target_walk_arg_t;
150*36589d6bSRobert Mustacchi 
151*36589d6bSRobert Mustacchi typedef enum varpd_client_command {
152*36589d6bSRobert Mustacchi 	VARPD_CLIENT_INVALID = 0x0,
153*36589d6bSRobert Mustacchi 	VARPD_CLIENT_CREATE,
154*36589d6bSRobert Mustacchi 	VARPD_CLIENT_ACTIVATE,
155*36589d6bSRobert Mustacchi 	VARPD_CLIENT_DESTROY,
156*36589d6bSRobert Mustacchi 	VARPD_CLIENT_NPROPS,
157*36589d6bSRobert Mustacchi 	VARPD_CLIENT_PROPINFO,
158*36589d6bSRobert Mustacchi 	VARPD_CLIENT_GETPROP,
159*36589d6bSRobert Mustacchi 	VARPD_CLIENT_SETPROP,
160*36589d6bSRobert Mustacchi 	VARPD_CLIENT_LOOKUP,
161*36589d6bSRobert Mustacchi 	VARPD_CLIENT_TARGET_MODE,
162*36589d6bSRobert Mustacchi 	VARPD_CLIENT_CACHE_FLUSH,
163*36589d6bSRobert Mustacchi 	VARPD_CLIENT_CACHE_DELETE,
164*36589d6bSRobert Mustacchi 	VARPD_CLIENT_CACHE_GET,
165*36589d6bSRobert Mustacchi 	VARPD_CLIENT_CACHE_SET,
166*36589d6bSRobert Mustacchi 	VARPD_CLIENT_CACHE_WALK,
167*36589d6bSRobert Mustacchi 	VARPD_CLIENT_MAX
168*36589d6bSRobert Mustacchi } varpd_client_command_t;
169*36589d6bSRobert Mustacchi 
170*36589d6bSRobert Mustacchi typedef struct varpd_client_arg {
171*36589d6bSRobert Mustacchi 	uint_t	vca_command;
172*36589d6bSRobert Mustacchi 	uint_t	vca_errno;
173*36589d6bSRobert Mustacchi 	union {
174*36589d6bSRobert Mustacchi 		varpd_client_create_arg_t vca_create;
175*36589d6bSRobert Mustacchi 		varpd_client_instance_arg_t vca_instance;
176*36589d6bSRobert Mustacchi 		varpd_client_nprops_arg_t vca_nprops;
177*36589d6bSRobert Mustacchi 		varpd_client_propinfo_arg_t vca_info;
178*36589d6bSRobert Mustacchi 		varpd_client_prop_arg_t vca_prop;
179*36589d6bSRobert Mustacchi 		varpd_client_lookup_arg_t vca_lookup;
180*36589d6bSRobert Mustacchi 		varpd_client_target_mode_arg_t vca_mode;
181*36589d6bSRobert Mustacchi 		varpd_client_target_cache_arg_t vca_cache;
182*36589d6bSRobert Mustacchi 		varpd_client_target_walk_arg_t vca_walk;
183*36589d6bSRobert Mustacchi 	} vca_un;
184*36589d6bSRobert Mustacchi } varpd_client_arg_t;
185*36589d6bSRobert Mustacchi 
186*36589d6bSRobert Mustacchi typedef struct varpd_client_eresp {
187*36589d6bSRobert Mustacchi 	uint_t vce_command;
188*36589d6bSRobert Mustacchi 	uint_t vce_errno;
189*36589d6bSRobert Mustacchi } varpd_client_eresp_t;
190*36589d6bSRobert Mustacchi 
191*36589d6bSRobert Mustacchi extern void libvarpd_plugin_init(void);
192*36589d6bSRobert Mustacchi extern void libvarpd_plugin_prefork(void);
193*36589d6bSRobert Mustacchi extern void libvarpd_plugin_postfork(void);
194*36589d6bSRobert Mustacchi extern void libvarpd_plugin_fini(void);
195*36589d6bSRobert Mustacchi extern int libvarpd_plugin_comparator(const void *, const void *);
196*36589d6bSRobert Mustacchi extern varpd_plugin_t *libvarpd_plugin_lookup(varpd_impl_t *, const char *);
197*36589d6bSRobert Mustacchi 
198*36589d6bSRobert Mustacchi extern varpd_instance_t *libvarpd_instance_lookup_by_dlid(varpd_impl_t *,
199*36589d6bSRobert Mustacchi     datalink_id_t);
200*36589d6bSRobert Mustacchi 
201*36589d6bSRobert Mustacchi extern void libvarpd_prop_door_convert(const varpd_prop_handle_t *,
202*36589d6bSRobert Mustacchi     varpd_client_propinfo_arg_t *);
203*36589d6bSRobert Mustacchi 
204*36589d6bSRobert Mustacchi extern const char *libvarpd_isaext(void);
205*36589d6bSRobert Mustacchi typedef int (*libvarpd_dirwalk_f)(varpd_impl_t *, const char *, void *);
206*36589d6bSRobert Mustacchi extern int libvarpd_dirwalk(varpd_impl_t *, const char *, const char *,
207*36589d6bSRobert Mustacchi     libvarpd_dirwalk_f, void *);
208*36589d6bSRobert Mustacchi 
209*36589d6bSRobert Mustacchi extern int libvarpd_overlay_init(varpd_impl_t *);
210*36589d6bSRobert Mustacchi extern void libvarpd_overlay_fini(varpd_impl_t *);
211*36589d6bSRobert Mustacchi extern int libvarpd_overlay_info(varpd_impl_t *, datalink_id_t,
212*36589d6bSRobert Mustacchi     overlay_plugin_dest_t *, uint64_t *, uint64_t *);
213*36589d6bSRobert Mustacchi extern int libvarpd_overlay_associate(varpd_instance_t *);
214*36589d6bSRobert Mustacchi extern int libvarpd_overlay_disassociate(varpd_instance_t *);
215*36589d6bSRobert Mustacchi extern int libvarpd_overlay_degrade(varpd_instance_t *, const char *);
216*36589d6bSRobert Mustacchi extern int libvarpd_overlay_degrade_datalink(varpd_impl_t *, datalink_id_t,
217*36589d6bSRobert Mustacchi     const char *);
218*36589d6bSRobert Mustacchi extern int libvarpd_overlay_restore(varpd_instance_t *);
219*36589d6bSRobert Mustacchi extern int libvarpd_overlay_packet(varpd_impl_t *,
220*36589d6bSRobert Mustacchi     const overlay_targ_lookup_t *, void *, size_t *);
221*36589d6bSRobert Mustacchi extern int libvarpd_overlay_inject(varpd_impl_t *,
222*36589d6bSRobert Mustacchi     const overlay_targ_lookup_t *, void *, size_t);
223*36589d6bSRobert Mustacchi extern int libvarpd_overlay_instance_inject(varpd_instance_t *, void *, size_t);
224*36589d6bSRobert Mustacchi extern int libvarpd_overlay_resend(varpd_impl_t *,
225*36589d6bSRobert Mustacchi     const overlay_targ_lookup_t *, void *, size_t);
226*36589d6bSRobert Mustacchi typedef int (*libvarpd_overlay_iter_f)(varpd_impl_t *, datalink_id_t, void *);
227*36589d6bSRobert Mustacchi extern int libvarpd_overlay_iter(varpd_impl_t *, libvarpd_overlay_iter_f,
228*36589d6bSRobert Mustacchi     void *);
229*36589d6bSRobert Mustacchi extern int libvarpd_overlay_cache_flush(varpd_instance_t *);
230*36589d6bSRobert Mustacchi extern int libvarpd_overlay_cache_delete(varpd_instance_t *, const uint8_t *);
231*36589d6bSRobert Mustacchi extern int libvarpd_overlay_cache_delete(varpd_instance_t *, const uint8_t *);
232*36589d6bSRobert Mustacchi extern int libvarpd_overlay_cache_get(varpd_instance_t *, const uint8_t *,
233*36589d6bSRobert Mustacchi     varpd_client_cache_entry_t *);
234*36589d6bSRobert Mustacchi extern int libvarpd_overlay_cache_set(varpd_instance_t *, const uint8_t *,
235*36589d6bSRobert Mustacchi     const varpd_client_cache_entry_t *);
236*36589d6bSRobert Mustacchi extern int libvarpd_overlay_cache_walk_fill(varpd_instance_t *, uint64_t *,
237*36589d6bSRobert Mustacchi     uint64_t *, overlay_targ_cache_entry_t *);
238*36589d6bSRobert Mustacchi 
239*36589d6bSRobert Mustacchi extern void libvarpd_persist_init(varpd_impl_t *);
240*36589d6bSRobert Mustacchi extern void libvarpd_persist_fini(varpd_impl_t *);
241*36589d6bSRobert Mustacchi extern int libvarpd_persist_instance(varpd_impl_t *, varpd_instance_t *);
242*36589d6bSRobert Mustacchi extern void libvarpd_torch_instance(varpd_impl_t *,  varpd_instance_t *);
243*36589d6bSRobert Mustacchi 
244*36589d6bSRobert Mustacchi #ifdef __cplusplus
245*36589d6bSRobert Mustacchi }
246*36589d6bSRobert Mustacchi #endif
247*36589d6bSRobert Mustacchi 
248*36589d6bSRobert Mustacchi #endif /* _LIBVARPD_IMPL_H */
249