Update of /cvsroot/linuxisns/isnsNT/isnsserver/src In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv7941/src Modified Files: iSNSMain.c iSNSdb.c iSNSdereg.c iSNSparse.c iSNSquery.c iSNSreg.c Added Files: iSNSesi.c iSNSresponse.c iSNSscn.c Log Message: Separate iSNSdb.c into iSNSesi.c, iSNSscn.c, iSNSresponse.c Index: iSNSquery.c =================================================================== RCS file: /cvsroot/linuxisns/isnsNT/isnsserver/src/iSNSquery.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** iSNSquery.c 3 Nov 2006 01:10:24 -0000 1.1 --- iSNSquery.c 3 Nov 2006 18:55:41 -0000 1.2 *************** *** 122,171 **** extern IDX_HASH_ENTRY *portalIdxHashTbl[MAX_HASH]; ! /* ! * Local function prototypes ! */ ! int ! ISNS_GetDD_ID_from_sym ( char *p_sym ); ! ! int ! ISNS_GetDDS_ID_from_sym ( char *p_sym ); ! ! int ! ISNSGetNextEntityPortal( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); ! ! int ! ISNSGetNextDDIscsiMember( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); ! ! int ! ISNSGetNextDDSMember( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); ! ! int ! send_iscsi_scn_on_dd_mem_change( SOIP_Iscsi * p_src_node, char *p_src_name, ! SOIP_Dd *p_dd, uint32_t dd_id, uint32_t event_bitmap); ! ! int ! send_scn_parameter_change_to_all( ISNS_Msg *p_msg, uint32_t bitmap ); ! ! int ! send_scn_object_change_to_all( uint32_t src_type, uint32_t src_len, ! void *src_val, uint32_t bitmap ); ! ! int ! change_dd_member_active_flag( SOIP_Dd *p_dd ); ! ! int ! ISNS_DeRegisterSCN ( ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); ! ! int ! ISNS_RegisterSCN (ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); ! ! int ! ISNSdbRemoveAttr (ISNS_Msg_Descp * p_md); ! int ! ISNSdbAddAttr ( ISNS_Msg_Descp * p_md, ISNS_Msg *rspMsg ); ! int ! ISNSdbGetAttr ( ISNS_Msg_Descp * p_md, ISNS_Msg_Descp * md ); static int --- 122,136 ---- extern IDX_HASH_ENTRY *portalIdxHashTbl[MAX_HASH]; ! static int ! SNSdbGetAttrNode (char **attr_indx, char **key_indx, ISNS_Msg_Descp * md, ! ISNS_Msg * p_rspmsg); ! static int ! SNSdbGetAttrPort (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ! ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); ! static int ! SNSdbGetAttrPortal (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ! ISNS_Msg_Descp * md, ISNS_Msg * p_rsp_msg); static int *************** *** 175,452 **** ISNSGetNextAttr( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); - int - ISNSdbRemoveAttrDD ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSdbRemoveAttrDDS ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - SNSdbFetchDD (int id, SOIP_Dd ** p_dd, SOIP_DB_Entry * p_entry); - - int - send_dd_iscsi_scn( SOIP_Dd *p_dd, int dd_id, uint32_t scn_bitmap ); - - int - IsDDActive(int dd_id, int exclude_dds_id); - - int - IsDDSActive(int dds_id); - - int - ISNSAddSCNEntry(uint32_t type, char *nodename, uint32_t bitmap, int sockfd); - - int - ISNSRemoveSCNEntry(uint32_t type, char *nodename); - - int - ISNSRemoveESIEntry(IP_Address *p_ip, uint32_t port, char *p_eid); - - int - ISNSAddESIEntry(IP_Address *p_ip, uint32_t port, char *p_eid); - static int SNSdbGetAttrDD (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); - int - Copy_DD_List(ISNS_LIST *dd_list, ISNS_DD_LIST p_dlist); - - int - Get_Active_DD_List (ISNS_LIST *dd_list, ISNS_DD_LIST p_dlist, int flag); - static int SNSdbGetAttrDDSEntry (int id, char **attr_indx, ISNS_Msg * p_msg); - int - SNSRemovePortalEntry (char *portal_key, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - ISNSdbAddAttrPortal (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, - ISNS_Msg * p_rspmsg); - - int - AddCert (void **ptr, int *size, void *p_cert, int cert_size); - - int - RemoveCert (void **ptr); - - int - SNSRemoveIFCPNodeEntry (char *ifcp_node_key, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - Activate_DD_Membership (uint32_t type, void *p_node); - - int - SNSRemoveFCNodeEntry (char *p_key, ISNS_Msg * p_rspmsg); - - int - ISNSdbProcessISCSIOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Iscsi * p_node); - - int - ISNSdbProcessFCNodeOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Fc_Node * p_node); - int - SNSdbFetchEntity (char *p_entity_id, SOIP_Entity ** p_entity, - SOIP_DB_Entry * p_entry); - static int SNSdbGetAttrDDS (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); - int - Get_Active_DD_List_From_ISCSI_Node (char *nodename, ISNS_DD_LIST p_dlist, - int flag); - - int - Append_Nodes_From_DD_List (ISNS_DD_LIST p_dlist, - SOIP_Dd_Member p_ddmem[], uint32_t type); - - int - Check_Overlap_DD (ISNS_DD_LIST p_dlist_src, ISNS_DD_LIST p_dlist_node); - - int - Get_Active_DD_List_From_IFCP_Node (char *nodename, ISNS_DD_LIST p_dlist, - int flag); - static int ISNSdbGetAttrISCSI (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); - int - SNSRemoveISCSINodeEntry (char *iscsi_node_key, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - Send_IFCP_SCN (SOIP_Ifcp * p_src_node, char *p_src_name, - uint32_t event_bitmap); - - int - ISNSdbAddAttrNode (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, - ISNS_Msg * p_rspmsg); - - int - send_iscsi_scn_to_members ( SOIP_Iscsi * p_src_node, char *p_src_name, - ISNS_Msg *p_msg, uint32_t event_bitmap ); - - int - SNSdbAddAttrEntity (char **attr_indx, char **key_indx, - ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg); - - int - Remove_DD_from_ISCSI_Node (SOIP_Dd *p_dd, char *p_node_name); - - int - SNSdbGetNextOfKey (ISNS_Key * key); - - void - ISNSExceptionHdlr (void); - - int - Add_dds_to_dd (SOIP_Dds *p_dds, int dd_id); - - int - Remove_DD_from_IFCP_Node (int id, char *p_node_name); - - int - Add_DD_to_ISCSI_Node (SOIP_Dd *p_dd, char *p_node_name); - - int - Add_DD_Member (SOIP_Dd * p_dd, char *ptr, int p_len, uint32_t type, uint32_t status, uint32_t index); - - int - Remove_DD_Member (SOIP_Dd *p_dd, char *ptr, uint32_t type); - - int - Add_DD_to_IFCP_Node (int id, char *p_node_name); - - int - SNSGet_Active_DD_List_From_Src (ISNS_Attr * src_attr, - ISNS_DD_LIST p_dlist_src, int flag); - - int - Get_Active_DD_List_From_ENTITY_Node (char *p_entity_name, - SOIP_Entity * p_entity, - ISNS_DD_LIST p_list, int flag); - - int - Remove_dd_from_dds (SOIP_Dds * p_dds, int id); - - int - SNSProcessPortalOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Portal * p_portal); - - int - ISNSdbProcessPortOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Ifcp * p_port); - - int - ISNSdbProcessEntityOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Entity *p_entity); - - int - ISNSdbAddAttrISCSINode (char **attr_indx, char **key_indx, - ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg); - - int - ISNSFindTag (int start_indx, int key, char **attr_indx); - - ISNS_Attr * - ISNSFindKeyInResponseMsg (int key, ISNS_Msg * msg); - - int - ISNS_Process_SCN_Event (ISNS_Msg *p_msg); - - int - ISNSAppendAttr (ISNS_Msg * msg, int tag, int size, char *p_value, int value); - - int - ISNSAppendKey (ISNS_Msg * msg, int tag, int size, char *p_value, int value); - static int SNSdbGetAttrEntity (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); - int - SNSdbAddAttrPort (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, - ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrEntity (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * md, - ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrNode (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrPort (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * p_md, - ISNS_Msg * rspmsg); - - static int - SNSdbGetAttrNode (char **attr_indx, char **key_indx, ISNS_Msg_Descp * md, - ISNS_Msg * p_rspmsg); - - static int - SNSdbGetAttrPort (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, - ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); - - static int - SNSdbGetAttrPortal (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, - ISNS_Msg_Descp * md, ISNS_Msg * p_rsp_msg); - - int - ISNSdbRemoveAttrEntityEntry (char *p_entity_id, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - SNSdbRemoveAttrISCSI (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, - ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrNode (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrPortal (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * p_md, - ISNS_Msg * rspmsg); - - int - ISNS_Process_SCN_Event (ISNS_Msg *p_msg); - - int - ISNSdbAddAttrDDS ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSdbAddAttrDD ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - ISNS_Process_SCN(ISNS_Msg_Descp *p_md, ISNS_Msg *p_rsp_msg); - - int - ISNS_ProcessESI ( ISNS_Msg_Descp *p_md ); - - int - ISNSdbRead (ISNS_Key *key, SOIP_DB_Entry *entry); - - int - ISNSdbWrite (ISNS_Key *key, SOIP_DB_Entry entry); - - int - ISNSdbDelete (ISNS_Key *key); - - int - ISNSdbProcessDDSOpAttr(ISNS_Msg *p_msg, ISNS_Attr **attr_indx, - SOIP_Dds *p_dds); - - int - ISNSdbProcessDDOpAttr(ISNS_Msg *p_msg, ISNS_Attr **attr_indx, - SOIP_Dd *p_dd); - - void * - ISNSGetDataFromIdxHashTable(IDX_HASH_ENTRY **table, uint32_t index); - - int - Append_DD_to_List (ISNS_DD_LIST p_dlist, uint32_t id); /********************************************************************* --- 140,162 ---- --- NEW FILE: iSNSresponse.c --- /*********************************************************************** Copyright (c) 2001, Nishan Systems, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Nishan Systems, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NISHAN SYSTEMS, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ /* * This file contains source code for managing the * iSNS database. * */ #include "iSNS.h" #include "iSNSdb.h" #include "iSNStypes.h" #include "iSNSmsg.h" #include "iSNScomm.h" #include "iSNSbuffer.h" #include "iSNStbl.h" #include "iSNSList.h" #include "iSNSparse.h" #include "iSNSdebug.h" #ifndef MAX_PARSE_ATTRS #define MAX_PARSE_ATTRS 30 #endif extern int sns_scn_debug; extern int sns_scn_msg_filter; extern int sns_rsync_debug; extern int SNSGetMgmtAddr (void); extern int sns_esi_interval; #ifndef SNS_LINUX extern void NTWriteToFile(int len, void *ptr); extern int NTReadFromFile(int *lenPtr, void *ptr); #endif /* Global */ extern int isns_db_debug; extern int isns_scn_debug; extern int isns_scn_msg_filter; extern int isns_rsync_debug; extern int sns_heartbeat_interval; extern datum ndb_fetch_sns (); extern datum ndb_firstkey_isns (uint32_t key_type, char *key); extern datum ndb_nextkey_isns (uint32_t key_type, datum key, char *pkey); extern ISNS_ATTR_VALS_CB * ISNSAttrGetList (ISNS_Msg_Descp *p_md); /* * GDBM errno */ extern ndb_error ndb_errno; /* * static common variables for gdbm fetches * entry is for common registrations and queries * scn_entry is for state change notifications * opn_entry is for access control */ uint32_t *dlist_src; /*[MAX_DD_PER_LIST];*/ uint32_t *dlist_node; /*[MAX_DD_PER_LIST];*/ SOIP_Dd_Member *ddmem; /* [100]; */ ISNS_LIST esi_list; ISNS_LIST scn_list; ISNS_LIST scn_callback_list; ISNS_Msg *p_scn_msg_buffer; ISNS_Msg *p_scn_all_msg_buffer; ISNS_Msg_Descp *p_scn_md; ISNS_Msg_Descp *p_rspMd; dbStats iSNS_stats; #define MAX_HASH 1024 #define HASH_MARK 0x3FF #define MAP_HASH(a) (a & HASH_MARK) IDX_HASH_ENTRY *entityIdxHashTbl[MAX_HASH]; IDX_HASH_ENTRY *iscsiIdxHashTbl[MAX_HASH]; IDX_HASH_ENTRY *portalIdxHashTbl[MAX_HASH]; /* * Local function prototypes */ int ISNS_GetDD_ID_from_sym ( char *p_sym ); int ISNS_GetDDS_ID_from_sym ( char *p_sym ); int ISNSGetNextEntityPortal( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); int ISNSGetNextDDIscsiMember( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); int ISNSGetNextDDSMember( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); int send_iscsi_scn_on_dd_mem_change( SOIP_Iscsi * p_src_node, char *p_src_name, SOIP_Dd *p_dd, uint32_t dd_id, uint32_t event_bitmap); int send_scn_parameter_change_to_all( ISNS_Msg *p_msg, uint32_t bitmap ); int send_scn_object_change_to_all( uint32_t src_type, uint32_t src_len, void *src_val, uint32_t bitmap ); int change_dd_member_active_flag( SOIP_Dd *p_dd ); int ISNS_DeRegisterSCN ( ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); int ISNS_RegisterSCN (ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); int ISNSdbRemoveAttr (ISNS_Msg_Descp * p_md); int ISNSdbAddAttr ( ISNS_Msg_Descp * p_md, ISNS_Msg *rspMsg ); int ISNSdbGetAttr ( ISNS_Msg_Descp * p_md, ISNS_Msg_Descp * md ); int ISNSGetNextAttr( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); int ISNSdbRemoveAttrDD ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); int ISNSdbRemoveAttrDDS ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); int SNSdbFetchDD (int id, SOIP_Dd ** p_dd, SOIP_DB_Entry * p_entry); int send_dd_iscsi_scn( SOIP_Dd *p_dd, int dd_id, uint32_t scn_bitmap ); int IsDDActive(int dd_id, int exclude_dds_id); int IsDDSActive(int dds_id); int ISNSAddSCNEntry(uint32_t type, char *nodename, uint32_t bitmap, int sockfd); int ISNSRemoveSCNEntry(uint32_t type, char *nodename); int ISNSRemoveESIEntry(IP_Address *p_ip, uint32_t port, char *p_eid); int ISNSAddESIEntry(IP_Address *p_ip, uint32_t port, char *p_eid); int SNSdbGetAttrDD (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); int Copy_DD_List(ISNS_LIST *dd_list, ISNS_DD_LIST p_dlist); int Get_Active_DD_List (ISNS_LIST *dd_list, ISNS_DD_LIST p_dlist, int flag); int SNSRemovePortalEntry (char *portal_key, ISNS_Attr * src_attr, ISNS_Msg * p_rspmsg); int ISNSdbAddAttrPortal (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg); int AddCert (void **ptr, int *size, void *p_cert, int cert_size); int RemoveCert (void **ptr); int SNSRemoveIFCPNodeEntry (char *ifcp_node_key, ISNS_Attr * src_attr, ISNS_Msg * p_rspmsg); int Activate_DD_Membership (uint32_t type, void *p_node); int SNSRemoveFCNodeEntry (char *p_key, ISNS_Msg * p_rspmsg); int ISNSdbProcessISCSIOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, SOIP_Iscsi * p_node); int SNSdbFetchEntity (char *p_entity_id, SOIP_Entity ** p_entity, SOIP_DB_Entry * p_entry); int SNSdbGetAttrDDS (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); int Get_Active_DD_List_From_ISCSI_Node (char *nodename, ISNS_DD_LIST p_dlist, int flag); int Append_Nodes_From_DD_List (ISNS_DD_LIST p_dlist, SOIP_Dd_Member p_ddmem[], uint32_t type); int Check_Overlap_DD (ISNS_DD_LIST p_dlist_src, ISNS_DD_LIST p_dlist_node); int Get_Active_DD_List_From_IFCP_Node (char *nodename, ISNS_DD_LIST p_dlist, int flag); int ISNSdbGetAttrISCSI (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); int SNSRemoveISCSINodeEntry (char *iscsi_node_key, ISNS_Attr * src_attr, ISNS_Msg * p_rspmsg); int Send_IFCP_SCN (SOIP_Ifcp * p_src_node, char *p_src_name, uint32_t event_bitmap); int ISNSdbAddAttrNode (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg); int send_iscsi_scn_to_members ( SOIP_Iscsi * p_src_node, char *p_src_name, ISNS_Msg *p_msg, uint32_t event_bitmap ); int SNSdbAddAttrEntity (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg); int Remove_DD_from_ISCSI_Node (SOIP_Dd *p_dd, char *p_node_name); int SNSdbGetNextOfKey (ISNS_Key * key); void ISNSExceptionHdlr (void); int Add_dds_to_dd (SOIP_Dds *p_dds, int dd_id); int Remove_DD_from_IFCP_Node (int id, char *p_node_name); int Add_DD_to_ISCSI_Node (SOIP_Dd *p_dd, char *p_node_name); int Add_DD_Member (SOIP_Dd * p_dd, char *ptr, int p_len, uint32_t type, uint32_t status, uint32_t index); int Remove_DD_Member (SOIP_Dd *p_dd, char *ptr, uint32_t type); int Add_DD_to_IFCP_Node (int id, char *p_node_name); int SNSGet_Active_DD_List_From_Src (ISNS_Attr * src_attr, ISNS_DD_LIST p_dlist_src, int flag); int Get_Active_DD_List_From_ENTITY_Node (char *p_entity_name, SOIP_Entity * p_entity, ISNS_DD_LIST p_list, int flag); int Remove_dd_from_dds (SOIP_Dds * p_dds, int id); int SNSProcessPortalOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, SOIP_Portal * p_portal); int ISNSdbProcessPortOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, SOIP_Ifcp * p_port); int ISNSdbProcessEntityOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, SOIP_Entity *p_entity); int ISNSdbAddAttrISCSINode (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg); int ISNSFindTag (int start_indx, int key, char **attr_indx); ISNS_Attr * ISNSFindKeyInResponseMsg (int key, ISNS_Msg * msg); int ISNS_Process_SCN_Event (ISNS_Msg *p_msg); int ISNSAppendAttr (ISNS_Msg * msg, int tag, int size, char *p_value, int value); int ISNSAppendKey (ISNS_Msg * msg, int tag, int size, char *p_value, int value); int SNSdbGetAttrEntity (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); int SNSdbAddAttrPort (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); int SNSdbRemoveAttrEntity (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * md, ISNS_Msg * rspmsg); int SNSdbRemoveAttrNode (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); int SNSdbRemoveAttrPort (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); int SNSdbGetAttrNode (char **attr_indx, char **key_indx, ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); int SNSdbGetAttrPort (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ISNS_Msg_Descp * md, ISNS_Msg * p_rspmsg); int SNSdbGetAttrPortal (char **attr_indx, char **key_indx, ISNS_Attr * src_attr, ISNS_Msg_Descp * md, ISNS_Msg * p_rsp_msg); int ISNSdbRemoveAttrEntityEntry (char *p_entity_id, ISNS_Attr * src_attr, ISNS_Msg * p_rspmsg); int SNSdbRemoveAttrISCSI (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); int SNSdbRemoveAttrNode (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); int SNSdbRemoveAttrPortal (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); int ISNS_Process_SCN_Event (ISNS_Msg *p_msg); int ISNSdbAddAttrDDS ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); int ISNSdbAddAttrDD ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); int ISNS_Process_SCN(ISNS_Msg_Descp *p_md, ISNS_Msg *p_rsp_msg); int ISNS_ProcessESI ( ISNS_Msg_Descp *p_md ); int ISNSdbRead (ISNS_Key *key, SOIP_DB_Entry *entry); int ISNSdbWrite (ISNS_Key *key, SOIP_DB_Entry entry); int ISNSdbDelete (ISNS_Key *key); /********************************************************************* _ISNSAppendAttr Appends the attribute to the message in the TLV format. *********************************************************************/ int ISNSAppendAttr (ISNS_Msg * msg, int tag, int size, char *p_value, int value) { ISNS_Attr *attr; if (msg == NULL) return (ERROR); if (msg->hdr.msg_len == 0) msg->hdr.msg_len = 4 + ISNS_SIZEOF_TAG; /* Jump to the end */ attr = (ISNS_Attr *)((char *) &msg->payload + msg->hdr.msg_len); /* insert */ attr->tag = tag; attr->len = size; if (p_value) { memcpy (&attr->val, p_value, attr->len); } else if (attr->len == 8) { /* Special time format */ attr->val.timestamp.t_pad = 0; attr->val.timestamp.t_time = htonl (value); } else { *(uint32_t *) & attr->val = value; } msg->hdr.msg_len += attr->len + ISNS_SIZEOF_TAG; attr = (ISNS_Attr *)((char *) attr + attr->len + ISNS_SIZEOF_TAG); return (ISNS_NO_ERR); } int ISNSAppendTimeStamp ( ISNS_Msg *msg ) { ISNS_Attr *attr; time_t t; if ( msg == NULL ) return ( ERROR ); /* Jump to end */ attr = (ISNS_Attr *)((char *) &msg->payload + msg->hdr.msg_len); /* AppendTime */ attr->tag = ISNS_TIMESTAMP; attr->len = 8; attr->val.timestamp.t_pad = 0; attr->val.timestamp.t_time = htonl (time(&t)); msg->hdr.msg_len += attr->len + ISNS_SIZEOF_TAG; return (SUCCESS); } /********************************************************************* _ISNSAppendKey Appends the attribute to the message in the TLV format. *********************************************************************/ int ISNSAppendKey (ISNS_Msg * msg, int tag, int size, char *p_value, int value) { ISNS_Attr *attr; if (msg == NULL) return (ERROR); if (msg->hdr.msg_len == 0 && msg->hdr.type != ISNS_SCN && msg->hdr.type != ISNS_ESI && msg->hdr.type != ISNS_SCN_REG_REQ) { msg->hdr.msg_len = 4; /* Error Code */ } /* Jump to end */ attr = (ISNS_Attr *)((char *) &msg->payload + msg->hdr.msg_len); /* insert the key(s) */ attr->tag = tag; attr->len = size; if (p_value) { memcpy (&attr->val, p_value, attr->len); } else if (attr->len == 8) { /* Special time format */ attr->val.timestamp.t_pad = 0; attr->val.timestamp.t_time = htonl (value); } else { *(uint32_t *) & attr->val = value; } msg->hdr.msg_len += attr->len + ISNS_SIZEOF_TAG; return (ISNS_NO_ERR); } /********************************************************************* Finds a tag in the response msg. *********************************************************************/ ISNS_Attr * ISNSFindAttrInResponseMsg ( int key, ISNS_Msg *msg ) { ISNS_Attr *attr; /* Find Delimiter */ attr = (ISNS_Attr *)((char *) &msg->payload + 4); while ((char *)attr < (char *)&msg->payload + msg->hdr.msg_len) { if ( attr->tag == key ) return ( attr ); attr = (ISNS_Attr *)((char *) attr + attr->len + ISNS_SIZEOF_TAG); } return ( NULL ); } /********************************************************************* Finds a tag in the response msg. *********************************************************************/ ISNS_Attr * ISNSFindKeyInResponseMsg (int key, ISNS_Msg * msg) { ISNS_Attr *attr; /* Find Delimiter */ attr = (ISNS_Attr *)((char *) &msg->payload + 4); while ((char *)attr < (char *)&msg->payload + msg->hdr.msg_len && attr->tag != ISNS_DELIMITER) { if (attr->tag == key) return (attr); attr = (ISNS_Attr *)((char *) attr + attr->len + ISNS_SIZEOF_TAG); } return (NULL); } /********************************************************************* _ISNSAppendTLV Appends a TLV to a spot in memory at an offset. *********************************************************************/ int ISNSAppendTLV(void *ptr, int *offset, int tag, int len, char *p_value, int value) { ISNS_Attr *attr; attr = (ISNS_Attr *)((char *)ptr+(*offset)); /* insert */ attr->tag = tag; attr->len = len; if (p_value) { memcpy (&attr->val, p_value, attr->len); } else { *(uint32_t *) & attr->val = value; } *offset += ISNS_SIZEOF_TAG + attr->len; return (ISNS_NO_ERR); } --- NEW FILE: iSNSesi.c --- /*********************************************************************** Copyright (c) 2001, Nishan Systems, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Nishan Systems, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NISHAN SYSTEMS, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ /* * This file contains source code for managing the SCN - state change notification. * */ #include "iSNS.h" #include "iSNSdb.h" #include "iSNStypes.h" #include "iSNSmsg.h" #include "iSNScomm.h" #include "iSNSbuffer.h" #include "iSNStbl.h" #include "iSNSList.h" #include "iSNSparse.h" #include "iSNSdebug.h" /* Global */ uint32_t isns_esi_interval = 15; extern int sns_esi_interval; extern int isns_db_debug; extern int sns_heartbeat_interval; /* * static common variables for gdbm fetches * entry is for common registrations and queries * scn_entry is for state change notifications * opn_entry is for access control */ static SOIP_DB_Entry entry; /* top level fetches ONLY */ static SOIP_DB_Entry entry2; /* secondary fetches */ uint32_t *dlist_src; /*[MAX_DD_PER_LIST];*/ uint32_t *dlist_node; /*[MAX_DD_PER_LIST];*/ SOIP_Dd_Member *ddmem; /* [100]; */ ISNS_LIST esi_list; ISNS_Msg *p_scn_msg_buffer; ISNS_Msg *p_scn_all_msg_buffer; ISNS_Msg_Descp *p_scn_md; ISNS_Msg_Descp *p_rspMd; #define MAX_HASH 1024 #define HASH_MARK 0x3FF #define MAP_HASH(a) (a & HASH_MARK) IDX_HASH_ENTRY *entityIdxHashTbl[MAX_HASH]; IDX_HASH_ENTRY *iscsiIdxHashTbl[MAX_HASH]; IDX_HASH_ENTRY *portalIdxHashTbl[MAX_HASH]; /********************************************************************* Sends out one or more ESI(s). *********************************************************************/ int ISNS_SendESI (void) { static int esi_xid = 1; int rval; int more_esi_portals; SOIP_Portal *p_portal; SOIP_Entity *p_entity; SOIP_DB_Portal db_portal; ISNS_LIST_NODE *pnode2; ISNS_LIST_NODE *pnode; ISNS_LIST_NODE *p_esi_node; SOIP_Esi_Entry *p_esi_entry; ISNS_Msg_Descp *p_md; SOIP_Entity_Key db_entity_id = {{0}}; ENTITY_LIST_ENTRY *lentry; p_md = p_rspMd; memset( p_md, 0, sizeof( ISNS_Msg_Descp ) ); if (isns_role != ISNS_PRIMARY_SERVER) { return ( ISNS_NO_ERR ); } if ( IsEmptyList(&esi_list) ) { /* Nothing to do */ return (ISNS_NO_ERR); } /* Go through the ESI Table */ p_esi_node = GetNextNode( &esi_list, NULL ); while ( p_esi_node ) { /* Get Node Data */ p_esi_entry = (SOIP_Esi_Entry *)GetNodeData(p_esi_node); ISNS_Key read_key; read_key.tag = PORTAL_ID_KEY; memcpy(&read_key.val,p_esi_entry,sizeof(SOIP_DB_Portal)); rval = ISNSdbRead(&read_key,&entry2); if (rval != SUCCESS) return rval; p_portal = (SOIP_Portal *)&entry2.data; /* Is ESI? */ if ( p_portal->esi_interval == 0 ) { p_esi_node = GetNextNode(&esi_list, p_esi_node); continue; } /* Send a msg to the client & update the counter */ memset (&p_md->msg, 0, sizeof (ISNS_Msg)); p_md->msg.hdr.type = ISNS_ESI; /* TODO: FIX FIX */ /* Don't assume first entity */ pnode2 = GetNextNode( &p_portal->entity_list, NULL); lentry = (ENTITY_LIST_ENTRY *)GetNodeData(pnode2); ISNSAppendKey (&p_md->msg, ISNS_ENTITY_ID, PAD4 (strlen (lentry->eid.id)), lentry->eid.id, 0); rval = ERROR; p_portal->esi_timer -= sns_heartbeat_interval; if ( p_portal->esiSent < 3 ) { if ( p_portal->esi_timer > 0 ) { ISNS_Key key; key.tag = PORTAL_ID_KEY; memcpy(&key.val,p_esi_entry,sizeof(SOIP_DB_Portal)); rval = ISNSdbWrite(&key,entry2); p_esi_node = GetNextNode( &esi_list, p_esi_node ); continue; } DEBUG_1 (isns_db_debug & 2, (Sending ESI to Entity %s), lentry->eid.id); ISNSAppendKey ( &p_md->msg, ISNS_PORTAL_IP, ISNS_IP_SIZE, p_portal->ip_addr.v, 0); ISNSAppendKey ( &p_md->msg, ISNS_PORTAL_PORT, ISNS_PORTAL_PORT_SIZE, NULL, p_portal->ip_port); memcpy ( &p_md->cb.sock.addr.sin_addr.s_addr, p_portal->ip_addr.v + 12, sizeof (p_md->cb.sock.addr.sin_addr.s_addr)); p_portal->esiSent++; p_portal->esi_timer = p_portal->esi_interval; ISNS_Key key; key.tag = PORTAL_ID_KEY; memcpy(&key.val,p_esi_entry,sizeof(SOIP_DB_Portal)); rval = ISNSdbWrite(&key,entry2); /* Determine how to send */ /* Fetch the Portal */ memset ( &db_portal, 0, sizeof (db_portal)); memcpy ( db_portal.ip_addr.v, p_portal->ip_addr.v, ISNS_IP_SIZE); db_portal.ip_port = p_portal->ip_port; ISNS_Key read_key; read_key.tag = PORTAL_ID_KEY; memcpy(&read_key.val,&db_portal,sizeof(SOIP_DB_Portal)); rval = ISNSdbRead(&read_key,&entry2); if (rval != SUCCESS) return rval; p_portal = (SOIP_Portal *)&entry2.data; if ( p_portal->esi_port ) { p_md->msg.hdr.xid = esi_xid++; p_md->cb.sock.socketType = ISNS_SOCKET_TYPE_UDP; p_md->cb.sock.addr.sin_port = htons ((short)(p_portal->esi_port & 0xFFFF)); } else { p_md->msg.hdr.xid = esi_xid++; p_md->cb.sock.socketType = ISNS_SOCKET_TYPE_TCP; p_md->cb.sock.sockfd = p_portal->esi_sockfd; } rval = ISNSSendMsg ( p_md ); } if ( rval != SUCCESS ) { /* TODO: FIX FIX */ /* Don't assume first entity */ pnode2 = GetNextNode( &p_portal->entity_list, NULL); lentry = (ENTITY_LIST_ENTRY *)GetNodeData(pnode2); strncpy (db_entity_id.id, lentry->eid.id, sizeof(db_entity_id.id) ); /* remove portal */ memset (&db_portal, 0, sizeof (db_portal)); memcpy (db_portal.ip_addr.v, p_portal->ip_addr.v, ISNS_IP_SIZE); db_portal.ip_port=p_portal->ip_port; p_esi_node=GetNextNode(&esi_list, p_esi_node); SNSRemovePortalEntry ((char *)&db_portal, NULL, NULL); /* Fetch Entity */ ISNS_Key read_key; read_key.tag = ENTITY_ID_KEY; strcpy(read_key.val.entity_id.id,db_entity_id.id); rval = ISNSdbRead(&read_key,&entry); if (rval != SUCCESS) return rval; p_entity = &entry.data.entity; /* Anymore Portals w/ ESI */ more_esi_portals = FALSE; pnode = NULL; while ( (pnode = GetNextNode(&p_entity->iportal_list, pnode)) ) { /* Fetch Portal */ ISNS_Key read_key; read_key.tag = PORTAL_ID_KEY; memcpy(&read_key.val,GetNodeData(pnode),sizeof(SOIP_DB_Portal)); rval = ISNSdbRead(&read_key,&entry2); if (rval != SUCCESS) return rval; p_portal = (SOIP_Portal *)&entry2.data; if (p_portal->esi_interval != 0) { more_esi_portals = TRUE; break; } } if ( !more_esi_portals ) { /* TODO: FIX FIX */ /* Don't assume first entity */ pnode2 = GetNextNode( &p_portal->entity_list, NULL); lentry = (ENTITY_LIST_ENTRY *)GetNodeData(pnode2); /* remove entity */ ISNSdbRemoveAttrEntityEntry (lentry->eid.id, NULL, NULL); } } else { p_esi_node = GetNextNode(&esi_list, p_esi_node); } } return ( ISNS_NO_ERR ); } /********************************************************************* Processes an ESI response. *********************************************************************/ int ISNS_ProcessESI ( ISNS_Msg_Descp *p_md ) { ISNS_Attr *p_attr; SOIP_Entity *p_entity; SOIP_Portal *p_portal; time_t mytime; SOIP_DB_Portal db_portal; SOIP_Entity_Key db_entity_id = {{0}}; int i; int len; char *attr_indx[SNS_MAX_ATTRS]; char *key_indx[SNS_MAX_ATTRS]; int rval; ISNSParseMsg( &p_md->msg, attr_indx, key_indx, NULL ); i = ISNSFindTag (0, ISNS_ENTITY_ID, key_indx); if (i == -1) { DEBUG_0 (isns_db_debug & 1, (Entity ID tag not found in msg)); return ( ERROR ); } p_attr = (ISNS_Attr *)(key_indx[ i ]); /* Fetch Entity */ /* The first Attr should be entity */ if (SNSdbFetchEntity ((char *)&p_attr->val, &p_entity, &entry)) return ( ERROR ); /* Update the time stamp */ { len = sizeof (mytime); time ( &mytime ); p_entity->timestamp.t_pad = 0; p_entity->timestamp.t_time = mytime; /* printf( "Time in seconds since UTC 1/1/70:\t%ld\n", mytime ); */ /* printf( "UNIX time and date:\t\t\t%s", ctime( &mytime ) ); */ } /* Store Entry */ strncpy(db_entity_id.id, (char *)&p_attr->val, sizeof(db_entity_id.id) ); ISNS_Key key; key.tag = ENTITY_ID_KEY; strcpy(key.val.entity_id.id,db_entity_id.id); ISNSdbWrite(&key,entry); /* Fetch the portal IP */ i = ISNSFindTag (0, ISNS_PORTAL_IP, key_indx); if ( i == -1 ) { DEBUG_0 (isns_db_debug & 1, (Portal IP tag not found in msg)); return ( ERROR ); } p_attr = (ISNS_Attr *)(key_indx[i]); memcpy(db_portal.ip_addr.v, p_attr->val.ip_addr.v, ISNS_IP_SIZE); i = ISNSFindTag (0, ISNS_PORTAL_PORT, key_indx); if (i == -1) { DEBUG_0 (isns_db_debug & 1, (Portal PORT tag not found in msg)); return ( ERROR ); } p_attr = (ISNS_Attr *)(key_indx[i]); db_portal.ip_port=p_attr->val.ip_port; ISNS_Key read_key; read_key.tag = PORTAL_ID_KEY; memcpy(&read_key.val,&db_portal,sizeof(SOIP_DB_Portal)); rval = ISNSdbRead(&read_key,&entry); if (rval != SUCCESS) return rval; p_portal = &entry.data.portal; p_portal->esiSent = 0; key.tag = PORTAL_ID_KEY; memcpy(&key.val,&db_portal,sizeof(SOIP_DB_Portal)); ISNSdbWrite(&key,entry); return ( ISNS_NO_ERR ); } Index: iSNSparse.c =================================================================== RCS file: /cvsroot/linuxisns/isnsNT/isnsserver/src/iSNSparse.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** iSNSparse.c 25 Oct 2006 21:19:37 -0000 1.5 --- iSNSparse.c 3 Nov 2006 18:55:41 -0000 1.6 *************** *** 665,666 **** --- 665,687 ---- return (-1); } + + /********************************************************************* + Finds a tag. + *********************************************************************/ + int + ISNSFindTag (int startIndex, int key, char **attr_indx) + { + int ii; + ISNS_Attr *attr; + + for (ii = startIndex; ii < SNS_MAX_ATTRS && attr_indx[ii]; ii++) + { + attr = (ISNS_Attr *) attr_indx[ii]; + if (attr->tag == key) + { + return (ii); + } + } + return (-1); + } + Index: iSNSdereg.c =================================================================== RCS file: /cvsroot/linuxisns/isnsNT/isnsserver/src/iSNSdereg.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** iSNSdereg.c 3 Nov 2006 01:10:24 -0000 1.1 --- iSNSdereg.c 3 Nov 2006 18:55:41 -0000 1.2 *************** *** 127,447 **** extern IDX_HASH_ENTRY *portalIdxHashTbl[MAX_HASH]; - /* - * Local function prototypes - */ - int - ISNS_GetDD_ID_from_sym ( char *p_sym ); - - int - ISNS_GetDDS_ID_from_sym ( char *p_sym ); - - int - ISNSGetNextEntityPortal( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSGetNextDDIscsiMember( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSGetNextDDSMember( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); - - int - send_iscsi_scn_on_dd_mem_change( SOIP_Iscsi * p_src_node, char *p_src_name, - SOIP_Dd *p_dd, uint32_t dd_id, uint32_t event_bitmap); - - int - send_scn_parameter_change_to_all( ISNS_Msg *p_msg, uint32_t bitmap ); - - int - send_scn_object_change_to_all( uint32_t src_type, uint32_t src_len, - void *src_val, uint32_t bitmap ); - - int - change_dd_member_active_flag( SOIP_Dd *p_dd ); - - int - ISNS_DeRegisterSCN ( ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); - - int - ISNS_RegisterSCN (ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); - - int - ISNSdbRemoveAttr (ISNS_Msg_Descp * p_md); - - int - ISNSdbAddAttr ( ISNS_Msg_Descp * p_md, ISNS_Msg *rspMsg ); - - int - ISNSdbGetAttr ( ISNS_Msg_Descp * p_md, ISNS_Msg_Descp * md ); - - int - ISNSGetNextAttr( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSdbRemoveAttrDD ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSdbRemoveAttrDDS ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - SNSdbFetchDD (int id, SOIP_Dd ** p_dd, SOIP_DB_Entry * p_entry); - - int - send_dd_iscsi_scn( SOIP_Dd *p_dd, int dd_id, uint32_t scn_bitmap ); - - int - IsDDActive(int dd_id, int exclude_dds_id); - - int - IsDDSActive(int dds_id); - - int - ISNSAddSCNEntry(uint32_t type, char *nodename, uint32_t bitmap, int sockfd); - - int - ISNSRemoveSCNEntry(uint32_t type, char *nodename); - - int - ISNSRemoveESIEntry(IP_Address *p_ip, uint32_t port, char *p_eid); - - int - ISNSAddESIEntry(IP_Address *p_ip, uint32_t port, char *p_eid); - - - int - Copy_DD_List(ISNS_LIST *dd_list, ISNS_DD_LIST p_dlist); - - int - Get_Active_DD_List (ISNS_LIST *dd_list, ISNS_DD_LIST p_dlist, int flag); - - - int - SNSRemovePortalEntry (char *portal_key, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - ISNSdbAddAttrPortal (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, - ISNS_Msg * p_rspmsg);\ - - int - SNSdbAddAttrPort (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, - ISNS_Msg * p_rspmsg); - - int - AddCert (void **ptr, int *size, void *p_cert, int cert_size); - - int - RemoveCert (void **ptr); - - int - SNSRemoveIFCPNodeEntry (char *ifcp_node_key, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - Activate_DD_Membership (uint32_t type, void *p_node); - - int - SNSRemoveFCNodeEntry (char *p_key, ISNS_Msg * p_rspmsg); - - int - ISNSdbProcessISCSIOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Iscsi * p_node); - - int - ISNSdbProcessFCNodeOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Fc_Node * p_node); - int - SNSdbFetchEntity (char *p_entity_id, SOIP_Entity ** p_entity, - SOIP_DB_Entry * p_entry); - - - int - Get_Active_DD_List_From_ISCSI_Node (char *nodename, ISNS_DD_LIST p_dlist, - int flag); - - int - Append_Nodes_From_DD_List (ISNS_DD_LIST p_dlist, - SOIP_Dd_Member p_ddmem[], uint32_t type); - - int - Check_Overlap_DD (ISNS_DD_LIST p_dlist_src, ISNS_DD_LIST p_dlist_node); - - int - Get_Active_DD_List_From_IFCP_Node (char *nodename, ISNS_DD_LIST p_dlist, - int flag); - - - int - SNSRemoveISCSINodeEntry (char *iscsi_node_key, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - Send_IFCP_SCN (SOIP_Ifcp * p_src_node, char *p_src_name, - uint32_t event_bitmap); - - int - ISNSdbAddAttrNode (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, - ISNS_Msg * p_rspmsg); - - int - send_iscsi_scn_to_members ( SOIP_Iscsi * p_src_node, char *p_src_name, - ISNS_Msg *p_msg, uint32_t event_bitmap ); - - int - SNSdbAddAttrEntity (char **attr_indx, char **key_indx, - ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg); - - int - Remove_DD_from_ISCSI_Node (SOIP_Dd *p_dd, char *p_node_name); - - int - SNSdbGetNextOfKey (ISNS_Key * key); - - void - ISNSExceptionHdlr (void); - - int - Add_dds_to_dd (SOIP_Dds *p_dds, int dd_id); - - int - Remove_DD_from_IFCP_Node (int id, char *p_node_name); - - int - Add_DD_to_ISCSI_Node (SOIP_Dd *p_dd, char *p_node_name); - - int - Add_DD_Member (SOIP_Dd * p_dd, char *ptr, int p_len, uint32_t type, uint32_t status, uint32_t index); - - int - Remove_DD_Member (SOIP_Dd *p_dd, char *ptr, uint32_t type); - - int - Add_DD_to_IFCP_Node (int id, char *p_node_name); - - int - SNSGet_Active_DD_List_From_Src (ISNS_Attr * src_attr, - ISNS_DD_LIST p_dlist_src, int flag); - - int - Get_Active_DD_List_From_ENTITY_Node (char *p_entity_name, - SOIP_Entity * p_entity, - ISNS_DD_LIST p_list, int flag); - - int - Remove_dd_from_dds (SOIP_Dds * p_dds, int id); - - int - SNSProcessPortalOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Portal * p_portal); - - int - ISNSdbProcessPortOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Ifcp * p_port); - - int - ISNSdbProcessEntityOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Entity *p_entity); - - int - ISNSdbAddAttrISCSINode (char **attr_indx, char **key_indx, - ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg); - - int - ISNSFindTag (int start_indx, int key, char **attr_indx); - - ISNS_Attr * - ISNSFindKeyInResponseMsg (int key, ISNS_Msg * msg); - - int - ISNS_Process_SCN_Event (ISNS_Msg *p_msg); - - int - ISNSAppendAttr (ISNS_Msg * msg, int tag, int size, char *p_value, int value); - - int - ISNSAppendKey (ISNS_Msg * msg, int tag, int size, char *p_value, int value); - - - int - SNSdbRemoveAttrEntity (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * md, - ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrNode (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrPort (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * p_md, - ISNS_Msg * rspmsg); - - int - ISNSdbRemoveAttrEntityEntry (char *p_entity_id, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - SNSdbRemoveAttrISCSI (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, - ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrNode (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrPortal (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * p_md, - ISNS_Msg * rspmsg); - - int - ISNS_Process_SCN_Event (ISNS_Msg *p_msg); - - int - ISNSdbAddAttrDDS ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSdbAddAttrDD ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - ISNS_Process_SCN(ISNS_Msg_Descp *p_md, ISNS_Msg *p_rsp_msg); - - int - ISNS_ProcessESI ( ISNS_Msg_Descp *p_md ); - - int - ISNSdbRead (ISNS_Key *key, SOIP_DB_Entry *entry); - - int - ISNSdbWrite (ISNS_Key *key, SOIP_DB_Entry entry); - - int - ISNSdbDelete (ISNS_Key *key); - - int - ISNSdbProcessDDSOpAttr(ISNS_Msg *p_msg, ISNS_Attr **attr_indx, - SOIP_Dds *p_dds); - - int - ISNSdbProcessDDOpAttr(ISNS_Msg *p_msg, ISNS_Attr **attr_indx, - SOIP_Dd *p_dd); - - void * - ISNSGetDataFromIdxHashTable(IDX_HASH_ENTRY **table, uint32_t index); - - uint32_t ISNSGetNewPortalIdx(void); - - void ISNSAddToIdxHashTable(IDX_HASH_ENTRY **table, uint32_t index, void*p_data,int size); - uint32_t ISNSGetIdxFromIdxHashTableByData(IDX_HASH_ENTRY **table, void *ptr, int len); - void ISNSRemoveFromIdxHashTable(IDX_HASH_ENTRY **table, uint32_t index); - - int ISNS_GetNewDDS_ID (void); - int ISNS_GetNewDD_ID (void); - - int Check_Unique_DDS_Sym (SOIP_Dds * p_dds, char *p_sym_name); - int Check_Unique_DD_Sym (SOIP_Dd * p_dd, char *p_sym_name); - uint32_t ISNSGetNewEntityIdx(void); - uint32_t ISNSGetNewISCSIIdx(void); - uint32_t ISNSGetNewPortalIdx(void); - int SNSdbRemoveAttrDDS_Entry(int id, ISNS_Attr *src_attr, ISNS_Msg *p_rspmsg); - int SNSdbRemoveDD_Entry(int id, ISNS_Attr *src_attr, ISNS_Msg *p_rspmsg); - int - SNSdbRemoveDD_Member (int id, char **attr_indx, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - int - Disable_DD_Member (SOIP_Dd * p_dd, char *ptr, uint32_t type); /********************************************************************* --- 127,130 ---- Index: iSNSreg.c =================================================================== RCS file: /cvsroot/linuxisns/isnsNT/isnsserver/src/iSNSreg.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** iSNSreg.c 3 Nov 2006 01:10:24 -0000 1.1 --- iSNSreg.c 3 Nov 2006 18:55:41 -0000 1.2 *************** *** 54,94 **** #endif - extern int sns_scn_debug; - extern int sns_scn_msg_filter; - extern int sns_rsync_debug; - extern int SNSGetMgmtAddr (void); - extern int sns_esi_interval; - - #ifndef SNS_LINUX - extern void NTWriteToFile(int len, void *ptr); - extern int NTReadFromFile(int *lenPtr, void *ptr); - #endif - /* Global */ extern int isns_db_debug;; - - extern int isns_scn_debug; - extern int isns_scn_msg_filter; - extern int isns_rsync_debug; - extern int sns_heartbeat_interval; - extern uint32_t isns_esi_interval; - extern datum ndb_fetch_sns (); - extern datum ndb_firstkey_isns (uint32_t key_type, char *key); - extern datum ndb_nextkey_isns (uint32_t key_type, datum key, char *pkey); - - extern ISNS_ATTR_VALS_CB * - ISNSAttrGetList (ISNS_Msg_Descp *p_md); - - /* - * SoIP service Database file descriptor - */ - //wrw static NDB_FILE dbfp; - - /* - * GDBM errno - */ - extern ndb_error ndb_errno; /* --- 54,61 ---- *************** *** 115,119 **** extern ISNS_Msg_Descp *p_rspMd; - extern dbStats iSNS_stats; --- 82,85 ---- *************** *** 125,440 **** extern IDX_HASH_ENTRY *portalIdxHashTbl[MAX_HASH]; - /* - * Local function prototypes - */ - int - ISNS_GetDD_ID_from_sym ( char *p_sym ); - - int - ISNS_GetDDS_ID_from_sym ( char *p_sym ); - - int - ISNSGetNextEntityPortal( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSGetNextDDIscsiMember( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSGetNextDDSMember( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); - - int - send_iscsi_scn_on_dd_mem_change( SOIP_Iscsi * p_src_node, char *p_src_name, - SOIP_Dd *p_dd, uint32_t dd_id, uint32_t event_bitmap); - - int - send_scn_parameter_change_to_all( ISNS_Msg *p_msg, uint32_t bitmap ); - - int - send_scn_object_change_to_all( uint32_t src_type, uint32_t src_len, - void *src_val, uint32_t bitmap ); - - int - change_dd_member_active_flag( SOIP_Dd *p_dd ); - - int - ISNS_DeRegisterSCN ( ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); - - int - ISNS_RegisterSCN (ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); - - int - ISNSdbRemoveAttr (ISNS_Msg_Descp * p_md); - - int - ISNSdbAddAttr ( ISNS_Msg_Descp * p_md, ISNS_Msg *rspMsg ); - - int - ISNSdbGetAttr ( ISNS_Msg_Descp * p_md, ISNS_Msg_Descp * md ); - - int - ISNSGetNextAttr( ISNS_Msg_Descp *p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSdbRemoveAttrDD ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSdbRemoveAttrDDS ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - SNSdbFetchDD (int id, SOIP_Dd ** p_dd, SOIP_DB_Entry * p_entry); - - int - send_dd_iscsi_scn( SOIP_Dd *p_dd, int dd_id, uint32_t scn_bitmap ); - - int - IsDDActive(int dd_id, int exclude_dds_id); - - int - IsDDSActive(int dds_id); - - int - ISNSAddSCNEntry(uint32_t type, char *nodename, uint32_t bitmap, int sockfd); - - int - ISNSRemoveSCNEntry(uint32_t type, char *nodename); - - int - ISNSRemoveESIEntry(IP_Address *p_ip, uint32_t port, char *p_eid); - - int - ISNSAddESIEntry(IP_Address *p_ip, uint32_t port, char *p_eid); - - - int - Copy_DD_List(ISNS_LIST *dd_list, ISNS_DD_LIST p_dlist); - - int - Get_Active_DD_List (ISNS_LIST *dd_list, ISNS_DD_LIST p_dlist, int flag); - - - int - SNSRemovePortalEntry (char *portal_key, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - ISNSdbAddAttrPortal (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, - ISNS_Msg * p_rspmsg);\ - - int - SNSdbAddAttrPort (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, - ISNS_Msg * p_rspmsg); - - int - AddCert (void **ptr, int *size, void *p_cert, int cert_size); - - int - RemoveCert (void **ptr); - - int - SNSRemoveIFCPNodeEntry (char *ifcp_node_key, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - Activate_DD_Membership (uint32_t type, void *p_node); - - int - SNSRemoveFCNodeEntry (char *p_key, ISNS_Msg * p_rspmsg); - - int - ISNSdbProcessISCSIOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Iscsi * p_node); - - int - ISNSdbProcessFCNodeOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Fc_Node * p_node); - int - SNSdbFetchEntity (char *p_entity_id, SOIP_Entity ** p_entity, - SOIP_DB_Entry * p_entry); - - - int - Get_Active_DD_List_From_ISCSI_Node (char *nodename, ISNS_DD_LIST p_dlist, - int flag); - - int - Append_Nodes_From_DD_List (ISNS_DD_LIST p_dlist, - SOIP_Dd_Member p_ddmem[], uint32_t type); - - int - Check_Overlap_DD (ISNS_DD_LIST p_dlist_src, ISNS_DD_LIST p_dlist_node); - - int - Get_Active_DD_List_From_IFCP_Node (char *nodename, ISNS_DD_LIST p_dlist, - int flag); - - - int - SNSRemoveISCSINodeEntry (char *iscsi_node_key, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - Send_IFCP_SCN (SOIP_Ifcp * p_src_node, char *p_src_name, - uint32_t event_bitmap); - - int - ISNSdbAddAttrNode (char **attr_indx, char **key_indx, ISNS_Msg_Descp * p_md, - ISNS_Msg * p_rspmsg); - - int - send_iscsi_scn_to_members ( SOIP_Iscsi * p_src_node, char *p_src_name, - ISNS_Msg *p_msg, uint32_t event_bitmap ); - - int - SNSdbAddAttrEntity (char **attr_indx, char **key_indx, - ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg); - - int - Remove_DD_from_ISCSI_Node (SOIP_Dd *p_dd, char *p_node_name); - - int - SNSdbGetNextOfKey (ISNS_Key * key); - - void - ISNSExceptionHdlr (void); - - int - Add_dds_to_dd (SOIP_Dds *p_dds, int dd_id); - - int - Remove_DD_from_IFCP_Node (int id, char *p_node_name); - - int - Add_DD_to_ISCSI_Node (SOIP_Dd *p_dd, char *p_node_name); - - int - Add_DD_Member (SOIP_Dd * p_dd, char *ptr, int p_len, uint32_t type, uint32_t status, uint32_t index); - - int - Remove_DD_Member (SOIP_Dd *p_dd, char *ptr, uint32_t type); - - int - Add_DD_to_IFCP_Node (int id, char *p_node_name); - - int - SNSGet_Active_DD_List_From_Src (ISNS_Attr * src_attr, - ISNS_DD_LIST p_dlist_src, int flag); - - int - Get_Active_DD_List_From_ENTITY_Node (char *p_entity_name, - SOIP_Entity * p_entity, - ISNS_DD_LIST p_list, int flag); - - int - Remove_dd_from_dds (SOIP_Dds * p_dds, int id); - - int - SNSProcessPortalOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Portal * p_portal); - - int - ISNSdbProcessPortOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Ifcp * p_port); - - int - ISNSdbProcessEntityOpAttr (ISNS_Msg * p_msg, ISNS_Attr ** attr_indx, - SOIP_Entity *p_entity); - - int - ISNSdbAddAttrISCSINode (char **attr_indx, char **key_indx, - ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg); - - int - ISNSFindTag (int start_indx, int key, char **attr_indx); - - ISNS_Attr * - ISNSFindKeyInResponseMsg (int key, ISNS_Msg * msg); - - int - ISNS_Process_SCN_Event (ISNS_Msg *p_msg); - - int - ISNSAppendAttr (ISNS_Msg * msg, int tag, int size, char *p_value, int value); - - int - ISNSAppendKey (ISNS_Msg * msg, int tag, int size, char *p_value, int value); - - - int - SNSdbRemoveAttrEntity (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * md, - ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrNode (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrPort (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * p_md, - ISNS_Msg * rspmsg); - - int - ISNSdbRemoveAttrEntityEntry (char *p_entity_id, ISNS_Attr * src_attr, - ISNS_Msg * p_rspmsg); - - int - SNSdbRemoveAttrISCSI (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, - ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrNode (char **key_indx, char *src_attr, ISNS_Msg_Descp * p_md, ISNS_Msg * rspmsg); - - int - SNSdbRemoveAttrPortal (char **key_indx, ISNS_Attr *src_attr, ISNS_Msg_Descp * p_md, - ISNS_Msg * rspmsg); - - int - ISNS_Process_SCN_Event (ISNS_Msg *p_msg); - - int - ISNSdbAddAttrDDS ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - ISNSdbAddAttrDD ( ISNS_Msg_Descp * p_md, ISNS_Msg * p_rspmsg ); - - int - ISNS_Process_SCN(ISNS_Msg_Descp *p_md, ISNS_Msg *p_rsp_msg); - - int - ISNS_ProcessESI ( ISNS_Msg_Descp *p_md ); - - int - ISNSdbRead (ISNS_Key *key, SOIP_DB_Entry *entry); - - int - ISNSdbWrite (ISNS_Key *key, SOIP_DB_Entry entry); - - int - ISNSdbDelete (ISNS_Key *key); - - int - ISNSdbProcessDDSOpAttr(ISNS_Msg *p_msg, ISNS_Attr **attr_indx, - SOIP_Dds *p_dds); - - int - ISNSdbProcessDDOpAttr(ISNS_Msg *p_msg, ISNS_Attr **attr_indx, - SOIP_Dd *p_dd); - - void * - ISNSGetDataFromIdxHashTable(IDX_HASH_ENTRY **table, uint32_t index); - - uint32_t ISNSGetNewPortalIdx(void); - - void ISNSAddToIdxHashTable(IDX_HASH_ENTRY **table, uint32_t index, void*p_data,int size); - uint32_t ISNSGetIdxFromIdxHashTableByData(IDX_HASH_ENTRY **table, void *ptr, int len); - - int ISNS_GetNewDDS_ID (void); - int ISNS_GetNewDD_ID (void); - - int Check_Unique_DDS_Sym (SOIP_Dds * p_dds, char *p_sym_name); - int Check_Unique_DD_Sym (SOIP_Dd * p_dd, char *p_sym_name); - uint32_t ISNSGetNewEntityIdx(void); - uint32_t ISNSGetNewISCSIIdx(void); - uint32_t ISNSGetNewPortalIdx(void); - int SNSdbRemoveAttrDDS_Entry(int id, ISNS_Attr *src_attr, ISNS_Msg *p_rspmsg); - int SNSdbRemoveDD_Entry(int id, ISNS_Attr *src_attr, ISNS_Msg *p_rspmsg); - /********************************************************************* _SNSdbAddAttr --- 91,94 ---- *************** *** 3743,3744 **** --- 3397,3718 ---- #endif + /********************************************************************* + *********************************************************************/ + int + change_dd_member_active_flag( SOIP_Dd *p_dd ) + { + ISNS_LIST_NODE *lnode; + ISNS_LIST_NODE *lnode2; + SOIP_Dd_Member *p_member; + SOIP_DB_Entry lentry; + uint32_t activeFlag; + SOIP_Iscsi *p_node; + SOIP_ISCSI_Node_Id db_node_name; + uint32_t old_activeFlag; + ISNS_Key key; + int rval; + + /* For each dd member */ + lnode = NULL; + while ( (lnode = GetNextNode(&p_dd->member_list, lnode)) ) + { + p_member = (SOIP_Dd_Member *) GetNodeData(lnode); + + if (!p_member->type || p_member->status == ISNS_DD_MEMBER_DISABLE) + continue; + + switch (p_member->type) + { + case ISNS_DD_ISCSI_MEMBER: + /* Fetch the node */ + memset (&db_node_name, 0, sizeof (db_node_name)); + strncpy ((char *) db_node_name.v, p_member->node_id, sizeof(db_node_name.v) ); + + key.tag = ISCSI_ID_KEY; + strcpy(key.val.node_name.v,db_node_name.v); + rval = ISNSdbRead(&key,&lentry); + if (rval != SUCCESS) + return rval; + + p_node = (SOIP_Iscsi *)&lentry.data.node; + + old_activeFlag = p_node->activeFlag; + + if ( p_dd->activeF... [truncated message content] |