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