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