1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 #ifndef _LUN_MAP_H
  26 #define _LUN_MAP_H
  27 
  28 #include <sys/stmf_defines.h>
  29 
  30 #ifdef  __cplusplus
  31 extern "C" {
  32 #endif
  33 
  34 typedef struct stmf_lun_map {
  35         uint32_t        lm_nluns;
  36         uint32_t        lm_nentries;
  37         void            **lm_plus; /* this can be lun or view entry */
  38 } stmf_lun_map_t;
  39 
  40 struct stmf_itl_data;
  41 
  42 typedef struct stmf_lun_map_ent {
  43         struct stmf_lu          *ent_lu;
  44         struct stmf_itl_data    *ent_itl_datap;
  45 } stmf_lun_map_ent_t;
  46 
  47 void stmf_view_init();
  48 void stmf_view_clear_config();
  49 stmf_status_t stmf_session_create_lun_map(stmf_i_local_port_t *ilport,
  50                 stmf_i_scsi_session_t *iss);
  51 stmf_status_t stmf_session_destroy_lun_map(stmf_i_local_port_t *ilport,
  52                 stmf_i_scsi_session_t *iss);
  53 stmf_xfer_data_t *stmf_session_prepare_report_lun_data(stmf_lun_map_t *sm);
  54 void stmf_add_lu_to_active_sessions(stmf_lu_t *lu);
  55 void stmf_session_lu_unmapall(stmf_lu_t *lu);
  56 void *stmf_get_ent_from_map(stmf_lun_map_t *sm, uint16_t lun_num);
  57 
  58 
  59 /*
  60  * Common struct used to maintain an Identifer's data. That Identifier
  61  * can be a Host group, Target group or LU GUID data. Note that a LU is
  62  * different from LU GUID data because either can be there without
  63  * its counterpart being present in the system.
  64  * id_impl_specific pointer to:
  65  * case LUID, a list of stmf_view_entry
  66  * case initiator group, a list of initiators
  67  * case target group, a list of targets
  68  * id_pt_to_object pointer to stmf_i_lu_t instance for LU.
  69  */
  70 typedef struct stmf_id_data {
  71         struct stmf_id_data             *id_next;
  72         struct stmf_id_data             *id_prev;
  73         uint32_t                        id_refcnt;
  74         uint16_t                        id_type;
  75         uint16_t                        id_data_size;
  76         uint8_t                         *id_data;
  77         uint32_t                        id_total_alloc_size;
  78         uint32_t                        id_rsvd;
  79         void                            *id_pt_to_object;
  80         void                            *id_impl_specific;
  81 } stmf_id_data_t;
  82 
  83 typedef enum {
  84         STMF_ID_TYPE_HOST,
  85         STMF_ID_TYPE_TARGET,
  86         STMF_ID_TYPE_LU_GUID,
  87         STMF_ID_TYPE_HOST_GROUP,
  88         STMF_ID_TYPE_TARGET_GROUP
  89 } stmf_id_type_t;
  90 
  91 typedef struct stmf_id_list {
  92         stmf_id_data_t          *idl_head;
  93         stmf_id_data_t          *idl_tail;
  94         uint32_t                id_count;
  95 } stmf_id_list_t;
  96 
  97 typedef struct stmf_view_entry {
  98         struct stmf_view_entry  *ve_next;
  99         struct stmf_view_entry  *ve_prev;
 100         uint32_t                ve_id;
 101         stmf_id_data_t          *ve_hg;
 102         stmf_id_data_t          *ve_tg;
 103         stmf_id_data_t          *ve_luid;
 104         uint8_t                 ve_lun[8];
 105 } stmf_view_entry_t;
 106 
 107 /*
 108  * Following structs are used as an alternate representation of view entries
 109  * in a LU ID.
 110  * ver_tg_root--->ver_tg_t    +-> ver_tg_t ....
 111  *                   |        |
 112  *                  vert_next-+
 113  *                   |
 114  *                   vert_verh_list --> ver_hg_t  +-> ver_hg_t ....
 115  *                                        |       |
 116  *                                      verh_next-+
 117  *                                        |
 118  *                                      verh_ve_map (view entry map for this
 119  *                                             target group + host group )
 120  */
 121 
 122 typedef struct ver_hg {
 123         struct ver_hg           *verh_next;
 124         stmf_id_data_t          *verh_hg_ref;   /* ref. to the host group */
 125         stmf_lun_map_t          verh_ve_map;
 126 } stmf_ver_hg_t;
 127 
 128 typedef struct ver_tg {
 129         struct ver_tg           *vert_next;
 130         stmf_id_data_t          *vert_tg_ref;   /* ref to target group */
 131         stmf_ver_hg_t           *vert_verh_list;
 132 } stmf_ver_tg_t;
 133 
 134 /*
 135  * flag which define how the merging of maps is to be done.
 136  */
 137 typedef enum {
 138         MERGE_FLAG_NO_DUPLICATE         = 0x01, /* fail upon duplicate */
 139         MERGE_FLAG_RETURN_NEW_MAP       = 0x02, /* Does not modify dst */
 140         MERGE_FLAG_NONE                 = 0
 141 } stmf_merge_flags_t;
 142 
 143 int stmf_add_group_member(uint8_t *grpname, uint16_t grpname_size,
 144                 uint8_t *entry_ident, uint16_t entry_size,
 145                 stmf_id_type_t entry_type, uint32_t *err_detail);
 146 int stmf_remove_group_member(uint8_t *grpname, uint16_t grpname_size,
 147                 uint8_t *entry_ident, uint16_t entry_size,
 148                 stmf_id_type_t entry_type, uint32_t *err_detail);
 149 int stmf_remove_group(uint8_t *grpname, uint16_t grpname_size,
 150                 stmf_id_type_t group_type, uint32_t *err_detail);
 151 int stmf_add_group(uint8_t *grpname, uint16_t grpname_size,
 152                 stmf_id_type_t group_type, uint32_t *err_detail);
 153 int stmf_add_ve(uint8_t *hgname, uint16_t hgname_size, uint8_t *tgname,
 154                 uint16_t tgname_size, uint8_t *lu_guid, uint32_t *ve_id,
 155                 uint8_t *luNbr, uint32_t *err_detail);
 156 int stmf_validate_lun_ve(uint8_t *hgname, uint16_t hgname_size, uint8_t *tgname,
 157                 uint16_t tgname_size, uint8_t *luNbr, uint32_t *err_detail);
 158 int stmf_remove_ve_by_id(uint8_t *guid, uint32_t veid, uint32_t *err_detail);
 159 stmf_id_data_t *stmf_lookup_id(stmf_id_list_t *idlist, uint16_t id_size,
 160                 uint8_t *data);
 161 stmf_id_data_t *stmf_lookup_group_for_target(uint8_t *ident,
 162                 uint16_t ident_size);
 163 
 164 #ifdef  __cplusplus
 165 }
 166 #endif
 167 
 168 #endif /* _LUN_MAP_H */